aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dechesne <n-dechesne@ti.com>2011-09-30 22:27:39 +0200
committerNicolas Dechesne <n-dechesne@ti.com>2011-09-30 22:27:39 +0200
commit406546ae6feb37cd86c83f0b8651fd2a2a332a53 (patch)
tree21971df1342cd595289241d63f06d04caf8ba957
Imported Upstream version 0.11.1upstream/0.11.1
-rw-r--r--ABOUT-NLS1068
-rw-r--r--AUTHORS23
-rw-r--r--COPYING340
-rw-r--r--COPYING.LIB481
-rw-r--r--ChangeLog58666
-rw-r--r--INSTALL182
-rw-r--r--Makefile.am88
-rw-r--r--Makefile.in1199
-rw-r--r--NEWS9
-rw-r--r--README247
-rw-r--r--RELEASE127
-rw-r--r--REQUIREMENTS105
-rw-r--r--aclocal.m41112
-rwxr-xr-xautogen.sh120
-rw-r--r--common/ChangeLog1712
-rw-r--r--common/Makefile.am22
-rw-r--r--common/Makefile.in780
-rw-r--r--common/c-to-xml.py34
-rwxr-xr-xcommon/check-exports72
-rw-r--r--common/check.mak181
-rw-r--r--common/coverage/coverage-report-entry.pl69
-rw-r--r--common/coverage/coverage-report.pl125
-rw-r--r--common/coverage/coverage-report.xsl235
-rw-r--r--common/coverage/lcov.mak43
-rw-r--r--common/cruft.mak56
-rwxr-xr-xcommon/download-translations152
-rwxr-xr-xcommon/extract-release-date-from-doap-file32
-rw-r--r--common/gettext.patch12
-rw-r--r--common/glib-gen.mak44
-rw-r--r--common/gst-autogen.sh376
-rw-r--r--common/gst-glib-gen.mak45
-rwxr-xr-xcommon/gst-indent49
-rw-r--r--common/gst.supp3963
-rwxr-xr-xcommon/gstdoc-scangobj1598
-rw-r--r--common/gtk-doc-plugins.mak387
-rw-r--r--common/gtk-doc.mak231
-rw-r--r--common/m4/Makefile.am42
-rw-r--r--common/m4/Makefile.in599
-rw-r--r--common/m4/README3
-rw-r--r--common/m4/as-ac-expand.m443
-rw-r--r--common/m4/as-auto-alt.m450
-rw-r--r--common/m4/as-compiler-flag.m464
-rw-r--r--common/m4/as-compiler.m444
-rw-r--r--common/m4/as-docbook.m466
-rw-r--r--common/m4/as-gcc-inline-assembly.m452
-rw-r--r--common/m4/as-libtool-tags.m483
-rw-r--r--common/m4/as-libtool.m445
-rw-r--r--common/m4/as-objc.m456
-rw-r--r--common/m4/as-python.m4152
-rw-r--r--common/m4/as-scrub-include.m436
-rw-r--r--common/m4/as-version.m475
-rw-r--r--common/m4/ax_create_stdint_h.m4734
-rw-r--r--common/m4/check.m4181
-rw-r--r--common/m4/glib-gettext.m4432
-rw-r--r--common/m4/gst-arch.m4141
-rw-r--r--common/m4/gst-args.m4335
-rw-r--r--common/m4/gst-check.m4262
-rw-r--r--common/m4/gst-debuginfo.m446
-rw-r--r--common/m4/gst-default.m4120
-rw-r--r--common/m4/gst-doc.m4148
-rw-r--r--common/m4/gst-dowhile.m424
-rw-r--r--common/m4/gst-error.m4213
-rw-r--r--common/m4/gst-feature.m4266
-rw-r--r--common/m4/gst-function.m463
-rw-r--r--common/m4/gst-gettext.m421
-rw-r--r--common/m4/gst-glib2.m473
-rw-r--r--common/m4/gst-libxml2.m452
-rw-r--r--common/m4/gst-package-release-datetime.m489
-rw-r--r--common/m4/gst-parser.m455
-rw-r--r--common/m4/gst-platform.m467
-rw-r--r--common/m4/gst-plugin-docs.m421
-rw-r--r--common/m4/gst-plugindir.m417
-rw-r--r--common/m4/gst-valgrind.m435
-rw-r--r--common/m4/gst-x11.m470
-rw-r--r--common/m4/gst.m431
-rw-r--r--common/m4/gtk-doc.m442
-rw-r--r--common/m4/introspection.m494
-rw-r--r--common/m4/orc.m470
-rw-r--r--common/m4/pkg.m4157
-rw-r--r--common/mangle-tmpl.py163
-rw-r--r--common/orc.mak76
-rw-r--r--common/parallel-subdirs.mak13
-rw-r--r--common/plugins.xsl209
-rw-r--r--common/po.mak4
-rw-r--r--common/release.mak25
-rwxr-xr-xcommon/scangobj-merge.py309
-rw-r--r--common/upload-doc.mak66
-rw-r--r--common/win32.mak72
-rwxr-xr-xcompile143
-rwxr-xr-xconfig.guess1502
-rw-r--r--config.h.in385
-rwxr-xr-xconfig.rpath666
-rwxr-xr-xconfig.sub1714
-rwxr-xr-xconfigure34264
-rw-r--r--configure.ac1021
-rwxr-xr-xdepcomp630
-rw-r--r--docs/Makefile.am18
-rw-r--r--docs/Makefile.in771
-rw-r--r--docs/design/Makefile.am11
-rw-r--r--docs/design/Makefile.in768
-rw-r--r--docs/design/design-audiosinks.txt138
-rw-r--r--docs/design/design-decodebin.txt274
-rw-r--r--docs/design/design-encoding.txt571
-rw-r--r--docs/design/design-orc-integration.txt204
-rw-r--r--docs/design/draft-keyframe-force.txt91
-rw-r--r--docs/design/draft-va.txt111
-rw-r--r--docs/design/part-playbin2.txt69
-rw-r--r--docs/libs/Makefile.am79
-rw-r--r--docs/libs/Makefile.in931
-rw-r--r--docs/libs/compiling.sgml48
-rw-r--r--docs/libs/gst-plugins-base-libs-docs.sgml238
-rw-r--r--docs/libs/gst-plugins-base-libs-overrides.txt0
-rw-r--r--docs/libs/gst-plugins-base-libs-sections.txt2351
-rw-r--r--docs/libs/gst-plugins-base-libs.types76
-rw-r--r--docs/libs/html/annotation-glossary.html77
-rw-r--r--docs/libs/html/api-index-deprecated.html59
-rw-r--r--docs/libs/html/api-index-full.html4403
-rw-r--r--docs/libs/html/compiling.html64
-rw-r--r--docs/libs/html/gst-plugins-base-libs-appsink.html559
-rw-r--r--docs/libs/html/gst-plugins-base-libs-appsrc.html654
-rw-r--r--docs/libs/html/gst-plugins-base-libs-encoding-profile.html1545
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudio.html919
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudioclock.html314
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudiodecoder.html912
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudioencoder.html964
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudiofilter.html162
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudioiec61937.html137
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudiomixerutils.html144
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudiosink.html201
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstaudiosrc.html200
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstbaseaudiosink.html458
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstbaseaudiosrc.html402
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstbasertpaudiopayload.html386
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstbasertpdepayload.html266
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstbasertppayload.html494
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstcddabasesrc.html316
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstcolorbalance.html367
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstcolorbalancechannel.html170
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstdiscoverer.html1532
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstfft.html129
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstfftf32.html285
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstfftf64.html285
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstffts16.html285
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstffts32.html285
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstmixer.html963
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstmixeroptions.html119
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstmixertrack.html259
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstmultichannel.html438
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstnavigation.html1202
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstnetbuffer.html454
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpbutils.html111
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpbutilscodecutils.html492
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpbutilsdescriptions.html297
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpbutilsinstallplugins.html821
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpbutilsmissingplugins.html510
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpluginsbaseversion.html177
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstpropertyprobe.html449
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstriff.html507
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstringbuffer.html1393
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtcpbuffer.html1961
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtpbuffer.html1447
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtppayloads.html388
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspbase64.html121
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspconnection.html1421
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspdefs.html738
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspextension.html104
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspmessage.html988
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtsprange.html268
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtsptransport.html498
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstrtspurl.html315
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstsdpmessage.html2788
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gststreamvolume.html308
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttag.html852
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagdemux.html248
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagexif.html192
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagid3.html301
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttaglanguagecodes.html243
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttaglicenses.html367
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagmux.html149
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagvorbis.html272
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagxmp.html174
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttagxmpwriter.html203
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttuner.html777
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttunerchannel.html264
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gsttunernorm.html99
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstvideo.html706
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstvideofilter.html106
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstvideoorientation.html402
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstvideooverlay.html520
-rw-r--r--docs/libs/html/gst-plugins-base-libs-gstvideosink.html266
-rw-r--r--docs/libs/html/gst-plugins-base-libs.devhelp21628
-rw-r--r--docs/libs/html/gstreamer-app.html48
-rw-r--r--docs/libs/html/gstreamer-audio.html77
-rw-r--r--docs/libs/html/gstreamer-base-utils.html63
-rw-r--r--docs/libs/html/gstreamer-cdda.html38
-rw-r--r--docs/libs/html/gstreamer-ffft.html57
-rw-r--r--docs/libs/html/gstreamer-interfaces.html83
-rw-r--r--docs/libs/html/gstreamer-libs-hierarchy.html77
-rw-r--r--docs/libs/html/gstreamer-netbuffer.html38
-rw-r--r--docs/libs/html/gstreamer-plugins-base.html308
-rw-r--r--docs/libs/html/gstreamer-riff.html38
-rw-r--r--docs/libs/html/gstreamer-rtp.html55
-rw-r--r--docs/libs/html/gstreamer-rtsp.html61
-rw-r--r--docs/libs/html/gstreamer-sdp.html38
-rw-r--r--docs/libs/html/gstreamer-tag.html73
-rw-r--r--docs/libs/html/gstreamer-video.html46
-rw-r--r--docs/libs/html/home.pngbin0 -> 654 bytes
-rw-r--r--docs/libs/html/index.html307
-rw-r--r--docs/libs/html/index.sgml1906
-rw-r--r--docs/libs/html/left.pngbin0 -> 459 bytes
-rw-r--r--docs/libs/html/right.pngbin0 -> 472 bytes
-rw-r--r--docs/libs/html/style.css266
-rw-r--r--docs/libs/html/up.pngbin0 -> 406 bytes
-rw-r--r--docs/plugins/Makefile.am121
-rw-r--r--docs/plugins/Makefile.in1127
-rw-r--r--docs/plugins/gst-plugins-base-plugins-docs.sgml109
-rw-r--r--docs/plugins/gst-plugins-base-plugins-overrides.txt30
-rw-r--r--docs/plugins/gst-plugins-base-plugins-sections.txt791
-rw-r--r--docs/plugins/gst-plugins-base-plugins.args3510
-rw-r--r--docs/plugins/gst-plugins-base-plugins.hierarchy139
-rw-r--r--docs/plugins/gst-plugins-base-plugins.interfaces32
-rw-r--r--docs/plugins/gst-plugins-base-plugins.prerequisites10
-rw-r--r--docs/plugins/gst-plugins-base-plugins.signals507
-rw-r--r--docs/plugins/gst-plugins-base-plugins.types1
-rw-r--r--docs/plugins/html/ch01.html174
-rw-r--r--docs/plugins/html/ch02.html117
-rw-r--r--docs/plugins/html/ch03.html30
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-adder.html208
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-alsamixer.html136
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-alsasink.html188
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-alsasrc.html185
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-appsink.html354
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-appsrc.html365
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-audioconvert.html321
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-audiorate.html273
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-audioresample.html221
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-audiotestsrc.html324
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-cdparanoiasrc.html242
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-clockoverlay.html227
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-decodebin.html304
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-encodebin.html376
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-gdpdepay.html164
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-gdppay.html197
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-giosink.html158
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-giosrc.html158
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-giostreamsink.html142
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-giostreamsrc.html142
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-multifdsink.html935
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-oggdemux.html149
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-oggmux.html226
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-playbin.html492
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-adder.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-alsa.html84
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-app.html80
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-audioconvert.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-audiorate.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-audioresample.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-audiotestsrc.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-cdparanoia.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-decodebin.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-encoding.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-gdp.html80
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-gio.html88
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-libvisual.html104
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-ogg.html100
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-pango.html88
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-playback.html88
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-subparse.html80
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-tcp.html92
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-theora.html84
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-typefindfunctions.html71
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-uridecodebin.html80
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-videorate.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-videoscale.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-videotestsrc.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-volume.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-vorbis.html88
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-ximagesink.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-plugin-xvimagesink.html74
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-subtitleoverlay.html226
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-tcpclientsink.html176
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-tcpclientsrc.html177
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-tcpserversink.html170
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-tcpserversrc.html177
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-textoverlay.html408
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-textrender.html212
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-theoradec.html162
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-theoraenc.html345
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-theoraparse.html161
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-timeoverlay.html210
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-uridecodebin.html609
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-videoconvert.html89
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-videorate.html330
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-videoscale.html480
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-videotestsrc.html628
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-volume.html229
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-vorbisdec.html145
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-vorbisenc.html214
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-vorbisparse.html146
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-vorbistag.html154
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-ximagesink.html207
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins-xvimagesink.html295
-rw-r--r--docs/plugins/html/gst-plugins-base-plugins.devhelp2617
-rw-r--r--docs/plugins/html/home.pngbin0 -> 654 bytes
-rw-r--r--docs/plugins/html/index.html264
-rw-r--r--docs/plugins/html/index.sgml871
-rw-r--r--docs/plugins/html/left.pngbin0 -> 459 bytes
-rw-r--r--docs/plugins/html/right.pngbin0 -> 472 bytes
-rw-r--r--docs/plugins/html/style.css266
-rw-r--r--docs/plugins/html/up.pngbin0 -> 406 bytes
-rw-r--r--docs/plugins/inspect/plugin-adder.xml34
-rw-r--r--docs/plugins/inspect/plugin-alsa.xml52
-rw-r--r--docs/plugins/inspect/plugin-app.xml43
-rw-r--r--docs/plugins/inspect/plugin-audioconvert.xml34
-rw-r--r--docs/plugins/inspect/plugin-audiorate.xml34
-rw-r--r--docs/plugins/inspect/plugin-audioresample.xml34
-rw-r--r--docs/plugins/inspect/plugin-audiotestsrc.xml28
-rw-r--r--docs/plugins/inspect/plugin-cdparanoia.xml28
-rw-r--r--docs/plugins/inspect/plugin-decodebin.xml34
-rw-r--r--docs/plugins/inspect/plugin-encoding.xml46
-rw-r--r--docs/plugins/inspect/plugin-gdp.xml55
-rw-r--r--docs/plugins/inspect/plugin-gio.xml73
-rw-r--r--docs/plugins/inspect/plugin-libvisual.xml181
-rw-r--r--docs/plugins/inspect/plugin-ogg.xml160
-rw-r--r--docs/plugins/inspect/plugin-pango.xml103
-rw-r--r--docs/plugins/inspect/plugin-playback.xml97
-rw-r--r--docs/plugins/inspect/plugin-subparse.xml55
-rw-r--r--docs/plugins/inspect/plugin-tcp.xml88
-rw-r--r--docs/plugins/inspect/plugin-theora.xml76
-rw-r--r--docs/plugins/inspect/plugin-typefindfunctions.xml13
-rw-r--r--docs/plugins/inspect/plugin-uridecodebin.xml49
-rw-r--r--docs/plugins/inspect/plugin-videorate.xml34
-rw-r--r--docs/plugins/inspect/plugin-videoscale.xml34
-rw-r--r--docs/plugins/inspect/plugin-videotestsrc.xml28
-rw-r--r--docs/plugins/inspect/plugin-volume.xml34
-rw-r--r--docs/plugins/inspect/plugin-vorbis.xml97
-rw-r--r--docs/plugins/inspect/plugin-ximagesink.xml28
-rw-r--r--docs/plugins/inspect/plugin-xvimagesink.xml28
-rw-r--r--docs/plugins/scanobj-build.stamp0
-rw-r--r--docs/version.entities.in2
-rw-r--r--ext/Makefile.am77
-rw-r--r--ext/Makefile.in809
-rw-r--r--ext/alsa/Makefile.am36
-rw-r--r--ext/alsa/Makefile.in863
-rw-r--r--ext/alsa/gstalsa.c578
-rw-r--r--ext/alsa/gstalsa.h60
-rw-r--r--ext/alsa/gstalsadeviceprobe.c210
-rw-r--r--ext/alsa/gstalsadeviceprobe.h33
-rw-r--r--ext/alsa/gstalsamixer.c957
-rw-r--r--ext/alsa/gstalsamixer.h209
-rw-r--r--ext/alsa/gstalsamixerelement.c216
-rw-r--r--ext/alsa/gstalsamixerelement.h61
-rw-r--r--ext/alsa/gstalsamixeroptions.c109
-rw-r--r--ext/alsa/gstalsamixeroptions.h62
-rw-r--r--ext/alsa/gstalsamixertrack.c356
-rw-r--r--ext/alsa/gstalsamixertrack.h79
-rw-r--r--ext/alsa/gstalsaplugin.c91
-rw-r--r--ext/alsa/gstalsasink.c1002
-rw-r--r--ext/alsa/gstalsasink.h86
-rw-r--r--ext/alsa/gstalsasrc.c996
-rw-r--r--ext/alsa/gstalsasrc.h87
-rw-r--r--ext/cdparanoia/Makefile.am17
-rw-r--r--ext/cdparanoia/Makefile.in767
-rw-r--r--ext/cdparanoia/gstcdparanoiasrc.c535
-rw-r--r--ext/cdparanoia/gstcdparanoiasrc.h106
-rw-r--r--ext/gio/Makefile.am29
-rw-r--r--ext/gio/Makefile.in835
-rw-r--r--ext/gio/gstgio.c259
-rw-r--r--ext/gio/gstgio.h42
-rw-r--r--ext/gio/gstgiobasesink.c344
-rw-r--r--ext/gio/gstgiobasesink.h71
-rw-r--r--ext/gio/gstgiobasesrc.c433
-rw-r--r--ext/gio/gstgiobasesrc.h72
-rw-r--r--ext/gio/gstgiosink.c315
-rw-r--r--ext/gio/gstgiosink.h68
-rw-r--r--ext/gio/gstgiosrc.c345
-rw-r--r--ext/gio/gstgiosrc.h68
-rw-r--r--ext/gio/gstgiostreamsink.c192
-rw-r--r--ext/gio/gstgiostreamsink.h68
-rw-r--r--ext/gio/gstgiostreamsrc.c186
-rw-r--r--ext/gio/gstgiostreamsrc.h68
-rw-r--r--ext/libvisual/Makefile.am10
-rw-r--r--ext/libvisual/Makefile.in754
-rw-r--r--ext/libvisual/visual.c1104
-rw-r--r--ext/ogg/Makefile.am45
-rw-r--r--ext/ogg/Makefile.in870
-rw-r--r--ext/ogg/README366
-rw-r--r--ext/ogg/dirac_parse.c498
-rw-r--r--ext/ogg/dirac_parse.h178
-rw-r--r--ext/ogg/gstogg.c46
-rw-r--r--ext/ogg/gstogg.h31
-rw-r--r--ext/ogg/gstoggaviparse.c485
-rw-r--r--ext/ogg/gstoggdemux.c4505
-rw-r--r--ext/ogg/gstoggdemux.h204
-rw-r--r--ext/ogg/gstoggmux.c2057
-rw-r--r--ext/ogg/gstoggmux.h148
-rw-r--r--ext/ogg/gstoggparse.c750
-rw-r--r--ext/ogg/gstoggstream.c2131
-rw-r--r--ext/ogg/gstoggstream.h142
-rw-r--r--ext/ogg/gstogmparse.c968
-rw-r--r--ext/ogg/vorbis_parse.c240
-rw-r--r--ext/ogg/vorbis_parse.h30
-rw-r--r--ext/pango/Makefile.am31
-rw-r--r--ext/pango/Makefile.in820
-rw-r--r--ext/pango/gstbasetextoverlay.c2799
-rw-r--r--ext/pango/gstbasetextoverlay.h170
-rw-r--r--ext/pango/gstclockoverlay.c244
-rw-r--r--ext/pango/gstclockoverlay.h81
-rw-r--r--ext/pango/gsttextoverlay.c114
-rw-r--r--ext/pango/gsttextoverlay.h60
-rw-r--r--ext/pango/gsttextrender.c709
-rw-r--r--ext/pango/gsttextrender.h104
-rw-r--r--ext/pango/gsttimeoverlay.c150
-rw-r--r--ext/pango/gsttimeoverlay.h61
-rw-r--r--ext/theora/Makefile.am21
-rw-r--r--ext/theora/Makefile.in800
-rw-r--r--ext/theora/gsttheora.c52
-rw-r--r--ext/theora/gsttheoradec.c1723
-rw-r--r--ext/theora/gsttheoradec.h123
-rw-r--r--ext/theora/gsttheoraenc.c1609
-rw-r--r--ext/theora/gsttheoraenc.h141
-rw-r--r--ext/theora/gsttheoraparse.c936
-rw-r--r--ext/theora/gsttheoraparse.h87
-rw-r--r--ext/vorbis/Makefile.am60
-rw-r--r--ext/vorbis/Makefile.in925
-rw-r--r--ext/vorbis/README16
-rw-r--r--ext/vorbis/gstivorbisdec.c47
-rw-r--r--ext/vorbis/gstvorbis.c73
-rw-r--r--ext/vorbis/gstvorbiscommon.c75
-rw-r--r--ext/vorbis/gstvorbiscommon.h28
-rw-r--r--ext/vorbis/gstvorbisdec.c1317
-rw-r--r--ext/vorbis/gstvorbisdec.h96
-rw-r--r--ext/vorbis/gstvorbisdeclib.c192
-rw-r--r--ext/vorbis/gstvorbisdeclib.h184
-rw-r--r--ext/vorbis/gstvorbisenc.c1424
-rw-r--r--ext/vorbis/gstvorbisenc.h100
-rw-r--r--ext/vorbis/gstvorbisparse.c661
-rw-r--r--ext/vorbis/gstvorbisparse.h82
-rw-r--r--ext/vorbis/gstvorbistag.c134
-rw-r--r--ext/vorbis/gstvorbistag.h63
-rw-r--r--gst-libs/Makefile.am1
-rw-r--r--gst-libs/Makefile.in759
-rw-r--r--gst-libs/gst/Makefile.am43
-rw-r--r--gst-libs/gst/Makefile.in805
-rw-r--r--gst-libs/gst/app/Makefile.am99
-rw-r--r--gst-libs/gst/app/Makefile.in984
-rw-r--r--gst-libs/gst/app/gstapp-marshal.list5
-rw-r--r--gst-libs/gst/app/gstappsink.c1403
-rw-r--r--gst-libs/gst/app/gstappsink.h141
-rw-r--r--gst-libs/gst/app/gstappsrc.c1650
-rw-r--r--gst-libs/gst/app/gstappsrc.h153
-rw-r--r--gst-libs/gst/audio/Makefile.am136
-rw-r--r--gst-libs/gst/audio/Makefile.in1169
-rw-r--r--gst-libs/gst/audio/TODO15
-rw-r--r--gst-libs/gst/audio/audio.c700
-rw-r--r--gst-libs/gst/audio/audio.h405
-rw-r--r--gst-libs/gst/audio/gstaudioclock.c314
-rw-r--r--gst-libs/gst/audio/gstaudioclock.h102
-rw-r--r--gst-libs/gst/audio/gstaudiodecoder.c2402
-rw-r--r--gst-libs/gst/audio/gstaudiodecoder.h294
-rw-r--r--gst-libs/gst/audio/gstaudioencoder.c2157
-rw-r--r--gst-libs/gst/audio/gstaudioencoder.h257
-rw-r--r--gst-libs/gst/audio/gstaudiofilter.c200
-rw-r--r--gst-libs/gst/audio/gstaudiofilter.h103
-rw-r--r--gst-libs/gst/audio/gstaudioiec61937.c321
-rw-r--r--gst-libs/gst/audio/gstaudioiec61937.h31
-rw-r--r--gst-libs/gst/audio/gstaudiosink.c614
-rw-r--r--gst-libs/gst/audio/gstaudiosink.h100
-rw-r--r--gst-libs/gst/audio/gstaudiosrc.c527
-rw-r--r--gst-libs/gst/audio/gstaudiosrc.h98
-rw-r--r--gst-libs/gst/audio/gstbaseaudiosink.c2039
-rw-r--r--gst-libs/gst/audio/gstbaseaudiosink.h180
-rw-r--r--gst-libs/gst/audio/gstbaseaudiosrc.c1153
-rw-r--r--gst-libs/gst/audio/gstbaseaudiosrc.h146
-rw-r--r--gst-libs/gst/audio/gstringbuffer.c1819
-rw-r--r--gst-libs/gst/audio/gstringbuffer.h338
-rw-r--r--gst-libs/gst/audio/mixerutils.c246
-rw-r--r--gst-libs/gst/audio/mixerutils.h50
-rw-r--r--gst-libs/gst/audio/multichannel.c764
-rw-r--r--gst-libs/gst/audio/multichannel.h134
-rw-r--r--gst-libs/gst/cdda/Makefile.am71
-rw-r--r--gst-libs/gst/cdda/Makefile.in824
-rw-r--r--gst-libs/gst/cdda/gstcddabasesrc.c1640
-rw-r--r--gst-libs/gst/cdda/gstcddabasesrc.h168
-rw-r--r--gst-libs/gst/fft/Makefile.am104
-rw-r--r--gst-libs/gst/fft/Makefile.in1039
-rw-r--r--gst-libs/gst/fft/_kiss_fft_guts_f32.h112
-rw-r--r--gst-libs/gst/fft/_kiss_fft_guts_f64.h112
-rw-r--r--gst-libs/gst/fft/_kiss_fft_guts_s16.h135
-rw-r--r--gst-libs/gst/fft/_kiss_fft_guts_s32.h136
-rw-r--r--gst-libs/gst/fft/gstfft.c54
-rw-r--r--gst-libs/gst/fft/gstfft.h49
-rw-r--r--gst-libs/gst/fft/gstfftf32.c208
-rw-r--r--gst-libs/gst/fft/gstfftf32.h75
-rw-r--r--gst-libs/gst/fft/gstfftf64.c208
-rw-r--r--gst-libs/gst/fft/gstfftf64.h75
-rw-r--r--gst-libs/gst/fft/gstffts16.c208
-rw-r--r--gst-libs/gst/fft/gstffts16.h74
-rw-r--r--gst-libs/gst/fft/gstffts32.c207
-rw-r--r--gst-libs/gst/fft/gstffts32.h75
-rw-r--r--gst-libs/gst/fft/kiss_fft_f32.c472
-rw-r--r--gst-libs/gst/fft/kiss_fft_f32.h103
-rw-r--r--gst-libs/gst/fft/kiss_fft_f64.c472
-rw-r--r--gst-libs/gst/fft/kiss_fft_f64.h103
-rw-r--r--gst-libs/gst/fft/kiss_fft_s16.c472
-rw-r--r--gst-libs/gst/fft/kiss_fft_s16.h106
-rw-r--r--gst-libs/gst/fft/kiss_fft_s32.c472
-rw-r--r--gst-libs/gst/fft/kiss_fft_s32.h107
-rw-r--r--gst-libs/gst/fft/kiss_fftr_f32.c169
-rw-r--r--gst-libs/gst/fft/kiss_fftr_f32.h46
-rw-r--r--gst-libs/gst/fft/kiss_fftr_f64.c170
-rw-r--r--gst-libs/gst/fft/kiss_fftr_f64.h46
-rw-r--r--gst-libs/gst/fft/kiss_fftr_s16.c170
-rw-r--r--gst-libs/gst/fft/kiss_fftr_s16.h46
-rw-r--r--gst-libs/gst/fft/kiss_fftr_s32.c170
-rw-r--r--gst-libs/gst/fft/kiss_fftr_s32.h46
-rw-r--r--gst-libs/gst/fft/kiss_version4
-rw-r--r--gst-libs/gst/gettext.h69
-rw-r--r--gst-libs/gst/gst-i18n-plugin.h37
-rw-r--r--gst-libs/gst/interfaces/Makefile.am138
-rw-r--r--gst-libs/gst/interfaces/Makefile.in1177
-rw-r--r--gst-libs/gst/interfaces/colorbalance.c243
-rw-r--r--gst-libs/gst/interfaces/colorbalance.h124
-rw-r--r--gst-libs/gst/interfaces/colorbalancechannel.c124
-rw-r--r--gst-libs/gst/interfaces/colorbalancechannel.h82
-rw-r--r--gst-libs/gst/interfaces/interfaces-marshal.list5
-rw-r--r--gst-libs/gst/interfaces/mixer.c873
-rw-r--r--gst-libs/gst/interfaces/mixer.h240
-rw-r--r--gst-libs/gst/interfaces/mixeroptions.c146
-rw-r--r--gst-libs/gst/interfaces/mixeroptions.h94
-rw-r--r--gst-libs/gst/interfaces/mixertrack.c288
-rw-r--r--gst-libs/gst/interfaces/mixertrack.h134
-rw-r--r--gst-libs/gst/interfaces/navigation.c848
-rw-r--r--gst-libs/gst/interfaces/navigation.h273
-rw-r--r--gst-libs/gst/interfaces/propertyprobe.c378
-rw-r--r--gst-libs/gst/interfaces/propertyprobe.h115
-rw-r--r--gst-libs/gst/interfaces/streamvolume.c225
-rw-r--r--gst-libs/gst/interfaces/streamvolume.h87
-rw-r--r--gst-libs/gst/interfaces/tuner.c577
-rw-r--r--gst-libs/gst/interfaces/tuner.h150
-rw-r--r--gst-libs/gst/interfaces/tunerchannel.c148
-rw-r--r--gst-libs/gst/interfaces/tunerchannel.h113
-rw-r--r--gst-libs/gst/interfaces/tunernorm.c111
-rw-r--r--gst-libs/gst/interfaces/tunernorm.h67
-rw-r--r--gst-libs/gst/interfaces/videoorientation.c271
-rw-r--r--gst-libs/gst/interfaces/videoorientation.h98
-rw-r--r--gst-libs/gst/interfaces/videooverlay.c512
-rw-r--r--gst-libs/gst/interfaces/videooverlay.h99
-rw-r--r--gst-libs/gst/netbuffer/Makefile.am70
-rw-r--r--gst-libs/gst/netbuffer/Makefile.in881
-rw-r--r--gst-libs/gst/netbuffer/README9
-rw-r--r--gst-libs/gst/netbuffer/gstnetbuffer.c378
-rw-r--r--gst-libs/gst/netbuffer/gstnetbuffer.h123
-rw-r--r--gst-libs/gst/pbutils/Makefile.am135
-rw-r--r--gst-libs/gst/pbutils/Makefile.in1153
-rw-r--r--gst-libs/gst/pbutils/codec-utils.c830
-rw-r--r--gst-libs/gst/pbutils/codec-utils.h65
-rw-r--r--gst-libs/gst/pbutils/descriptions.c1011
-rw-r--r--gst-libs/gst/pbutils/descriptions.h58
-rw-r--r--gst-libs/gst/pbutils/encoding-profile.c967
-rw-r--r--gst-libs/gst/pbutils/encoding-profile.h187
-rw-r--r--gst-libs/gst/pbutils/encoding-target.c1208
-rw-r--r--gst-libs/gst/pbutils/encoding-target.h147
-rw-r--r--gst-libs/gst/pbutils/gstdiscoverer-types.c1090
-rw-r--r--gst-libs/gst/pbutils/gstdiscoverer.c1581
-rw-r--r--gst-libs/gst/pbutils/gstdiscoverer.h288
-rw-r--r--gst-libs/gst/pbutils/gstpluginsbaseversion.c78
-rw-r--r--gst-libs/gst/pbutils/gstpluginsbaseversion.h.in86
-rw-r--r--gst-libs/gst/pbutils/install-plugins.c783
-rw-r--r--gst-libs/gst/pbutils/install-plugins.h144
-rw-r--r--gst-libs/gst/pbutils/missing-plugins.c809
-rw-r--r--gst-libs/gst/pbutils/missing-plugins.h77
-rw-r--r--gst-libs/gst/pbutils/pbutils-marshal.list2
-rw-r--r--gst-libs/gst/pbutils/pbutils-private.h94
-rw-r--r--gst-libs/gst/pbutils/pbutils.c108
-rw-r--r--gst-libs/gst/pbutils/pbutils.h42
-rw-r--r--gst-libs/gst/riff/Makefile.am93
-rw-r--r--gst-libs/gst/riff/Makefile.in930
-rw-r--r--gst-libs/gst/riff/riff-ids.h517
-rw-r--r--gst-libs/gst/riff/riff-media.c1901
-rw-r--r--gst-libs/gst/riff/riff-media.h65
-rw-r--r--gst-libs/gst/riff/riff-read.c788
-rw-r--r--gst-libs/gst/riff/riff-read.h87
-rw-r--r--gst-libs/gst/riff/riff.c48
-rw-r--r--gst-libs/gst/rtp/Makefile.am86
-rw-r--r--gst-libs/gst/rtp/Makefile.in946
-rw-r--r--gst-libs/gst/rtp/README66
-rw-r--r--gst-libs/gst/rtp/gstbasertpaudiopayload.c1002
-rw-r--r--gst-libs/gst/rtp/gstbasertpaudiopayload.h105
-rw-r--r--gst-libs/gst/rtp/gstbasertpdepayload.c769
-rw-r--r--gst-libs/gst/rtp/gstbasertpdepayload.h119
-rw-r--r--gst-libs/gst/rtp/gstbasertppayload.c1073
-rw-r--r--gst-libs/gst/rtp/gstbasertppayload.h174
-rw-r--r--gst-libs/gst/rtp/gstrtcpbuffer.c2034
-rw-r--r--gst-libs/gst/rtp/gstrtcpbuffer.h299
-rw-r--r--gst-libs/gst/rtp/gstrtpbuffer.c1517
-rw-r--r--gst-libs/gst/rtp/gstrtpbuffer.h152
-rw-r--r--gst-libs/gst/rtp/gstrtppayloads.c229
-rw-r--r--gst-libs/gst/rtp/gstrtppayloads.h193
-rw-r--r--gst-libs/gst/rtsp/Makefile.am121
-rw-r--r--gst-libs/gst/rtsp/Makefile.in1099
-rw-r--r--gst-libs/gst/rtsp/gstrtsp-marshal.list2
-rw-r--r--gst-libs/gst/rtsp/gstrtsp.h27
-rw-r--r--gst-libs/gst/rtsp/gstrtspbase64.c91
-rw-r--r--gst-libs/gst/rtsp/gstrtspbase64.h37
-rw-r--r--gst-libs/gst/rtsp/gstrtspconnection.c3678
-rw-r--r--gst-libs/gst/rtsp/gstrtspconnection.h209
-rw-r--r--gst-libs/gst/rtsp/gstrtspdefs.c508
-rw-r--r--gst-libs/gst/rtsp/gstrtspdefs.h412
-rw-r--r--gst-libs/gst/rtsp/gstrtspextension.c224
-rw-r--r--gst-libs/gst/rtsp/gstrtspextension.h97
-rw-r--r--gst-libs/gst/rtsp/gstrtspmessage.c842
-rw-r--r--gst-libs/gst/rtsp/gstrtspmessage.h187
-rw-r--r--gst-libs/gst/rtsp/gstrtsprange.c272
-rw-r--r--gst-libs/gst/rtsp/gstrtsprange.h121
-rw-r--r--gst-libs/gst/rtsp/gstrtsptransport.c716
-rw-r--r--gst-libs/gst/rtsp/gstrtsptransport.h174
-rw-r--r--gst-libs/gst/rtsp/gstrtspurl.c416
-rw-r--r--gst-libs/gst/rtsp/gstrtspurl.h103
-rw-r--r--gst-libs/gst/sdp/Makefile.am72
-rw-r--r--gst-libs/gst/sdp/Makefile.in881
-rw-r--r--gst-libs/gst/sdp/gstsdp.h58
-rw-r--r--gst-libs/gst/sdp/gstsdpmessage.c2241
-rw-r--r--gst-libs/gst/sdp/gstsdpmessage.h423
-rw-r--r--gst-libs/gst/tag/Makefile.am120
-rw-r--r--gst-libs/gst/tag/Makefile.in1129
-rw-r--r--gst-libs/gst/tag/gstexiftag.c2751
-rw-r--r--gst-libs/gst/tag/gstid3tag.c381
-rw-r--r--gst-libs/gst/tag/gsttagdemux.c1552
-rw-r--r--gst-libs/gst/tag/gsttagdemux.h144
-rw-r--r--gst-libs/gst/tag/gsttageditingprivate.c468
-rw-r--r--gst-libs/gst/tag/gsttageditingprivate.h75
-rw-r--r--gst-libs/gst/tag/gsttagmux.c531
-rw-r--r--gst-libs/gst/tag/gsttagmux.h89
-rw-r--r--gst-libs/gst/tag/gstvorbistag.c843
-rw-r--r--gst-libs/gst/tag/gstxmptag.c1894
-rw-r--r--gst-libs/gst/tag/id3v2.c618
-rw-r--r--gst-libs/gst/tag/id3v2.h120
-rw-r--r--gst-libs/gst/tag/id3v2frames.c1168
-rw-r--r--gst-libs/gst/tag/lang-tables.dat447
-rw-r--r--gst-libs/gst/tag/lang.c494
-rw-r--r--gst-libs/gst/tag/license-translations.dictbin0 -> 44604 bytes
-rw-r--r--gst-libs/gst/tag/licenses-tables.dat467
-rw-r--r--gst-libs/gst/tag/licenses.c632
-rw-r--r--gst-libs/gst/tag/mklangtables.c239
-rw-r--r--gst-libs/gst/tag/mklicensestables.c890
-rw-r--r--gst-libs/gst/tag/tag.h650
-rw-r--r--gst-libs/gst/tag/tags.c646
-rw-r--r--gst-libs/gst/tag/xmpwriter.c322
-rw-r--r--gst-libs/gst/tag/xmpwriter.h68
-rw-r--r--gst-libs/gst/video/Makefile.am99
-rw-r--r--gst-libs/gst/video/Makefile.in1058
-rw-r--r--gst-libs/gst/video/convertframe.c698
-rw-r--r--gst-libs/gst/video/gstmetavideo.c254
-rw-r--r--gst-libs/gst/video/gstmetavideo.h116
-rw-r--r--gst-libs/gst/video/gstvideofilter.c123
-rw-r--r--gst-libs/gst/video/gstvideofilter.h64
-rw-r--r--gst-libs/gst/video/gstvideopool.c74
-rw-r--r--gst-libs/gst/video/gstvideopool.h74
-rw-r--r--gst-libs/gst/video/gstvideosink.c288
-rw-r--r--gst-libs/gst/video/gstvideosink.h132
-rw-r--r--gst-libs/gst/video/video.c1538
-rw-r--r--gst-libs/gst/video/video.h711
-rw-r--r--gst-plugins-base.doap450
-rw-r--r--gst-plugins-base.spec306
-rw-r--r--gst-plugins-base.spec.in306
-rw-r--r--gst/Makefile.am4
-rw-r--r--gst/Makefile.in774
-rw-r--r--gst/adder/Makefile.am31
-rw-r--r--gst/adder/Makefile.in863
-rw-r--r--gst/adder/gstadder.c1312
-rw-r--r--gst/adder/gstadder.h91
-rw-r--r--gst/adder/gstadderorc-dist.c835
-rw-r--r--gst/adder/gstadderorc-dist.h85
-rw-r--r--gst/adder/gstadderorc.orc52
-rw-r--r--gst/app/Makefile.am21
-rw-r--r--gst/app/Makefile.in765
-rw-r--r--gst/app/gstapp.c68
-rw-r--r--gst/audioconvert/Makefile.am51
-rw-r--r--gst/audioconvert/Makefile.in926
-rw-r--r--gst/audioconvert/audioconvert.c792
-rw-r--r--gst/audioconvert/audioconvert.h146
-rw-r--r--gst/audioconvert/gstaudioconvert.c711
-rw-r--r--gst/audioconvert/gstaudioconvert.h60
-rw-r--r--gst/audioconvert/gstaudioconvertorc-dist.c6872
-rw-r--r--gst/audioconvert/gstaudioconvertorc-dist.h130
-rw-r--r--gst/audioconvert/gstaudioconvertorc.orc591
-rw-r--r--gst/audioconvert/gstaudioquantize.c503
-rw-r--r--gst/audioconvert/gstaudioquantize.h34
-rw-r--r--gst/audioconvert/gstchannelmix.c743
-rw-r--r--gst/audioconvert/gstchannelmix.h56
-rw-r--r--gst/audioconvert/gstfastrandom.h90
-rw-r--r--gst/audioconvert/plugin.c49
-rw-r--r--gst/audioconvert/plugin.h35
-rw-r--r--gst/audiorate/Makefile.am25
-rw-r--r--gst/audiorate/Makefile.in771
-rw-r--r--gst/audiorate/gstaudiorate.c769
-rw-r--r--gst/audiorate/gstaudiorate.h84
-rw-r--r--gst/audioresample/Makefile.am57
-rw-r--r--gst/audioresample/Makefile.in834
-rw-r--r--gst/audioresample/README347
-rw-r--r--gst/audioresample/arch.h265
-rw-r--r--gst/audioresample/fixed_arm4.h148
-rw-r--r--gst/audioresample/fixed_arm5e.h178
-rw-r--r--gst/audioresample/fixed_bfin.h176
-rw-r--r--gst/audioresample/fixed_debug.h487
-rw-r--r--gst/audioresample/fixed_generic.h106
-rw-r--r--gst/audioresample/gstaudioresample.c1464
-rw-r--r--gst/audioresample/gstaudioresample.h98
-rw-r--r--gst/audioresample/resample.c1429
-rw-r--r--gst/audioresample/resample_sse.h180
-rw-r--r--gst/audioresample/speex_resampler.h367
-rw-r--r--gst/audioresample/speex_resampler_double.c26
-rw-r--r--gst/audioresample/speex_resampler_float.c26
-rw-r--r--gst/audioresample/speex_resampler_int.c24
-rw-r--r--gst/audioresample/speex_resampler_wrapper.h168
-rw-r--r--gst/audiotestsrc/Makefile.am25
-rw-r--r--gst/audiotestsrc/Makefile.in774
-rw-r--r--gst/audiotestsrc/gstaudiotestsrc.c1297
-rw-r--r--gst/audiotestsrc/gstaudiotestsrc.h146
-rw-r--r--gst/encoding/Makefile.am53
-rw-r--r--gst/encoding/Makefile.in887
-rw-r--r--gst/encoding/gstencode-marshal.list1
-rw-r--r--gst/encoding/gstencodebin.c2078
-rw-r--r--gst/encoding/gstencodebin.h39
-rw-r--r--gst/encoding/gstsmartencoder.c689
-rw-r--r--gst/encoding/gstsmartencoder.h71
-rw-r--r--gst/encoding/gststreamcombiner.c253
-rw-r--r--gst/encoding/gststreamcombiner.h60
-rw-r--r--gst/encoding/gststreamsplitter.c448
-rw-r--r--gst/encoding/gststreamsplitter.h62
-rw-r--r--gst/gdp/Makefile.am29
-rw-r--r--gst/gdp/Makefile.in795
-rw-r--r--gst/gdp/README22
-rw-r--r--gst/gdp/gstgdp.c46
-rw-r--r--gst/gdp/gstgdpdepay.c479
-rw-r--r--gst/gdp/gstgdpdepay.h82
-rw-r--r--gst/gdp/gstgdppay.c895
-rw-r--r--gst/gdp/gstgdppay.h81
-rw-r--r--gst/playback/Makefile.am68
-rw-r--r--gst/playback/Makefile.in974
-rw-r--r--gst/playback/gstdecodebin2.c4019
-rw-r--r--gst/playback/gstplay-enum.c81
-rw-r--r--gst/playback/gstplay-enum.h80
-rw-r--r--gst/playback/gstplay-marshal.list9
-rw-r--r--gst/playback/gstplayback.c67
-rw-r--r--gst/playback/gstplayback.h33
-rw-r--r--gst/playback/gstplaybin2.c3921
-rw-r--r--gst/playback/gstplaysink.c3665
-rw-r--r--gst/playback/gstplaysink.h113
-rw-r--r--gst/playback/gstplaysinkaudioconvert.c498
-rw-r--r--gst/playback/gstplaysinkaudioconvert.h89
-rw-r--r--gst/playback/gstplaysinkvideoconvert.c462
-rw-r--r--gst/playback/gstplaysinkvideoconvert.h84
-rw-r--r--gst/playback/gstrawcaps.h39
-rw-r--r--gst/playback/gststreamselector.c690
-rw-r--r--gst/playback/gststreamselector.h62
-rw-r--r--gst/playback/gststreamsynchronizer.c944
-rw-r--r--gst/playback/gststreamsynchronizer.h67
-rw-r--r--gst/playback/gstsubtitleoverlay.c2124
-rw-r--r--gst/playback/gstsubtitleoverlay.h121
-rw-r--r--gst/playback/gsturidecodebin.c2553
-rw-r--r--gst/subparse/Makefile.am33
-rw-r--r--gst/subparse/Makefile.in830
-rw-r--r--gst/subparse/gstssaparse.c401
-rw-r--r--gst/subparse/gstssaparse.h57
-rw-r--r--gst/subparse/gstsubparse.c1833
-rw-r--r--gst/subparse/gstsubparse.h119
-rw-r--r--gst/subparse/mpl2parse.c107
-rw-r--r--gst/subparse/mpl2parse.h32
-rw-r--r--gst/subparse/qttextparse.c453
-rw-r--r--gst/subparse/qttextparse.h36
-rw-r--r--gst/subparse/samiparse.c474
-rw-r--r--gst/subparse/samiparse.h38
-rw-r--r--gst/subparse/tmplayerparse.c154
-rw-r--r--gst/subparse/tmplayerparse.h32
-rw-r--r--gst/tcp/Makefile.am56
-rw-r--r--gst/tcp/Makefile.in929
-rw-r--r--gst/tcp/README53
-rw-r--r--gst/tcp/gstmultifdsink.c2894
-rw-r--r--gst/tcp/gstmultifdsink.h285
-rw-r--r--gst/tcp/gsttcp-marshal.list5
-rw-r--r--gst/tcp/gsttcp.c475
-rw-r--r--gst/tcp/gsttcp.h50
-rw-r--r--gst/tcp/gsttcpclientsink.c358
-rw-r--r--gst/tcp/gsttcpclientsink.h90
-rw-r--r--gst/tcp/gsttcpclientsrc.c392
-rw-r--r--gst/tcp/gsttcpclientsrc.h82
-rw-r--r--gst/tcp/gsttcpplugin.c63
-rw-r--r--gst/tcp/gsttcpplugin.h40
-rw-r--r--gst/tcp/gsttcpserversink.c371
-rw-r--r--gst/tcp/gsttcpserversink.h90
-rw-r--r--gst/tcp/gsttcpserversrc.c412
-rw-r--r--gst/tcp/gsttcpserversrc.h88
-rw-r--r--gst/typefind/Makefile.am26
-rw-r--r--gst/typefind/Makefile.in774
-rw-r--r--gst/typefind/gsttypefindfunctions.c4623
-rw-r--r--gst/videoconvert/Makefile.am35
-rw-r--r--gst/videoconvert/Makefile.in881
-rw-r--r--gst/videoconvert/gstvideoconvert.c516
-rw-r--r--gst/videoconvert/gstvideoconvert.h68
-rw-r--r--gst/videoconvert/gstvideoconvertorc-dist.c19395
-rw-r--r--gst/videoconvert/gstvideoconvertorc-dist.h168
-rw-r--r--gst/videoconvert/gstvideoconvertorc.orc1757
-rw-r--r--gst/videoconvert/videoconvert.c2386
-rw-r--r--gst/videoconvert/videoconvert.h91
-rw-r--r--gst/videorate/Makefile.am23
-rw-r--r--gst/videorate/Makefile.in769
-rw-r--r--gst/videorate/gstvideorate.c1217
-rw-r--r--gst/videorate/gstvideorate.h92
-rw-r--r--gst/videoscale/Makefile.am43
-rw-r--r--gst/videoscale/Makefile.in927
-rw-r--r--gst/videoscale/README5
-rw-r--r--gst/videoscale/gstvideoscale.c1446
-rw-r--r--gst/videoscale/gstvideoscale.h100
-rw-r--r--gst/videoscale/gstvideoscaleorc-dist.c2264
-rw-r--r--gst/videoscale/gstvideoscaleorc-dist.h93
-rw-r--r--gst/videoscale/gstvideoscaleorc.orc199
-rw-r--r--gst/videoscale/vs_4tap.c1451
-rw-r--r--gst/videoscale/vs_4tap.h99
-rw-r--r--gst/videoscale/vs_fill_borders.c422
-rw-r--r--gst/videoscale/vs_fill_borders.h44
-rw-r--r--gst/videoscale/vs_image.c1155
-rw-r--r--gst/videoscale/vs_image.h105
-rw-r--r--gst/videoscale/vs_lanczos.c1558
-rw-r--r--gst/videoscale/vs_scanline.c781
-rw-r--r--gst/videoscale/vs_scanline.h79
-rw-r--r--gst/videotestsrc/Makefile.am39
-rw-r--r--gst/videotestsrc/Makefile.in923
-rw-r--r--gst/videotestsrc/generate_sine_table.c43
-rw-r--r--gst/videotestsrc/gstvideotestsrc.c883
-rw-r--r--gst/videotestsrc/gstvideotestsrc.h174
-rw-r--r--gst/videotestsrc/gstvideotestsrcorc-dist.c482
-rw-r--r--gst/videotestsrc/gstvideotestsrcorc-dist.h82
-rw-r--r--gst/videotestsrc/gstvideotestsrcorc.orc31
-rw-r--r--gst/videotestsrc/videotestsrc.c2526
-rw-r--r--gst/videotestsrc/videotestsrc.h125
-rw-r--r--gst/volume/Makefile.am34
-rw-r--r--gst/volume/Makefile.in868
-rw-r--r--gst/volume/gstvolume.c980
-rw-r--r--gst/volume/gstvolume.h88
-rw-r--r--gst/volume/gstvolumeorc-dist.c2721
-rw-r--r--gst/volume/gstvolumeorc-dist.h96
-rw-r--r--gst/volume/gstvolumeorc.orc180
-rwxr-xr-xinstall-sh520
-rwxr-xr-xltmain.sh8413
-rw-r--r--m4/Makefile.am24
-rw-r--r--m4/Makefile.in581
-rw-r--r--m4/README3
-rw-r--r--m4/check-libheader.m439
-rw-r--r--m4/codeset.m421
-rw-r--r--m4/freetype2.m4143
-rw-r--r--m4/gettext.m4381
-rw-r--r--m4/glibc21.m430
-rw-r--r--m4/gst-alsa.m4150
-rw-r--r--m4/gst-fionread.m442
-rw-r--r--m4/gst-ivorbis.m468
-rw-r--r--m4/iconv.m4180
-rw-r--r--m4/intdiv0.m484
-rw-r--r--m4/intlmacosx.m451
-rw-r--r--m4/inttypes-pri.m436
-rw-r--r--m4/inttypes_h.m426
-rw-r--r--m4/lcmessage.m430
-rw-r--r--m4/lib-ld.m4110
-rw-r--r--m4/lib-link.m4709
-rw-r--r--m4/lib-prefix.m4185
-rw-r--r--m4/libtool.m47377
-rw-r--r--m4/lrint.m427
-rw-r--r--m4/lrintf.m427
-rw-r--r--m4/ltoptions.m4368
-rw-r--r--m4/ltsugar.m4123
-rw-r--r--m4/ltversion.m423
-rw-r--r--m4/lt~obsolete.m492
-rw-r--r--m4/nls.m431
-rw-r--r--m4/ogg.m4102
-rw-r--r--m4/po.m4449
-rw-r--r--m4/progtest.m492
-rw-r--r--m4/stdint_h.m426
-rw-r--r--m4/uintmax_t.m430
-rw-r--r--m4/vorbis.m4128
-rwxr-xr-xmissing376
-rw-r--r--pkgconfig/Makefile.am66
-rw-r--r--pkgconfig/Makefile.in769
-rw-r--r--pkgconfig/gstreamer-app-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-app.pc.in16
-rw-r--r--pkgconfig/gstreamer-audio-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-audio.pc.in16
-rw-r--r--pkgconfig/gstreamer-cdda-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-cdda.pc.in16
-rw-r--r--pkgconfig/gstreamer-fft-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-fft.pc.in16
-rw-r--r--pkgconfig/gstreamer-interfaces-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-interfaces.pc.in16
-rw-r--r--pkgconfig/gstreamer-netbuffer-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-netbuffer.pc.in16
-rw-r--r--pkgconfig/gstreamer-pbutils-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-pbutils.pc.in16
-rw-r--r--pkgconfig/gstreamer-plugins-base-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-plugins-base.pc.in14
-rw-r--r--pkgconfig/gstreamer-riff-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-riff.pc.in16
-rw-r--r--pkgconfig/gstreamer-rtp-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-rtp.pc.in16
-rw-r--r--pkgconfig/gstreamer-rtsp-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-rtsp.pc.in16
-rw-r--r--pkgconfig/gstreamer-sdp-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-sdp.pc.in16
-rw-r--r--pkgconfig/gstreamer-tag-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-tag.pc.in16
-rw-r--r--pkgconfig/gstreamer-video-uninstalled.pc.in16
-rw-r--r--pkgconfig/gstreamer-video.pc.in16
-rw-r--r--po/LINGUAS1
-rw-r--r--po/Makefile.in.in432
-rw-r--r--po/Makevars47
-rw-r--r--po/POTFILES.in18
-rw-r--r--po/Rules-quot47
-rw-r--r--po/af.gmobin0 -> 763 bytes
-rw-r--r--po/af.po667
-rw-r--r--po/az.gmobin0 -> 821 bytes
-rw-r--r--po/az.po668
-rw-r--r--po/bg.gmobin0 -> 16569 bytes
-rw-r--r--po/bg.po618
-rw-r--r--po/boldquot.sed10
-rw-r--r--po/ca.gmobin0 -> 9339 bytes
-rw-r--r--po/ca.po592
-rw-r--r--po/cs.gmobin0 -> 12657 bytes
-rw-r--r--po/cs.po618
-rw-r--r--po/da.gmobin0 -> 12354 bytes
-rw-r--r--po/da.po657
-rw-r--r--po/de.gmobin0 -> 12907 bytes
-rw-r--r--po/de.po653
-rw-r--r--po/el.gmobin0 -> 16417 bytes
-rw-r--r--po/el.po634
-rw-r--r--po/en@boldquot.header25
-rw-r--r--po/en@quot.header22
-rw-r--r--po/en_GB.gmobin0 -> 761 bytes
-rw-r--r--po/en_GB.po673
-rw-r--r--po/eo.gmobin0 -> 3729 bytes
-rw-r--r--po/eo.po538
-rw-r--r--po/es.gmobin0 -> 12831 bytes
-rw-r--r--po/es.po644
-rw-r--r--po/eu.gmobin0 -> 8690 bytes
-rw-r--r--po/eu.po620
-rw-r--r--po/fi.gmobin0 -> 12052 bytes
-rw-r--r--po/fi.po650
-rw-r--r--po/fr.gmobin0 -> 13437 bytes
-rw-r--r--po/fr.po636
-rw-r--r--po/gl.gmobin0 -> 13053 bytes
-rw-r--r--po/gl.po620
-rw-r--r--po/gst-plugins-base-0.11.pot657
-rw-r--r--po/hu.gmobin0 -> 12737 bytes
-rw-r--r--po/hu.po617
-rw-r--r--po/id.gmobin0 -> 8380 bytes
-rw-r--r--po/id.po635
-rw-r--r--po/insert-header.sin23
-rw-r--r--po/it.gmobin0 -> 8898 bytes
-rw-r--r--po/it.po638
-rw-r--r--po/ja.gmobin0 -> 10795 bytes
-rw-r--r--po/ja.po629
-rw-r--r--po/lt.gmobin0 -> 6877 bytes
-rw-r--r--po/lt.po646
-rw-r--r--po/lv.gmobin0 -> 12754 bytes
-rw-r--r--po/lv.po634
-rw-r--r--po/nb.gmobin0 -> 2651 bytes
-rw-r--r--po/nb.po536
-rw-r--r--po/nl.gmobin0 -> 12734 bytes
-rw-r--r--po/nl.po622
-rw-r--r--po/or.gmobin0 -> 975 bytes
-rw-r--r--po/or.po689
-rw-r--r--po/pl.gmobin0 -> 12769 bytes
-rw-r--r--po/pl.po619
-rw-r--r--po/pt_BR.gmobin0 -> 13113 bytes
-rw-r--r--po/pt_BR.po652
-rw-r--r--po/quot.sed6
-rw-r--r--po/remove-potcdate.sin19
-rw-r--r--po/ro.gmobin0 -> 8391 bytes
-rw-r--r--po/ro.po614
-rw-r--r--po/ru.gmobin0 -> 16027 bytes
-rw-r--r--po/ru.po630
-rw-r--r--po/sk.gmobin0 -> 12313 bytes
-rw-r--r--po/sk.po651
-rw-r--r--po/sl.gmobin0 -> 12696 bytes
-rw-r--r--po/sl.po644
-rw-r--r--po/sq.gmobin0 -> 779 bytes
-rw-r--r--po/sq.po689
-rw-r--r--po/sr.gmobin0 -> 928 bytes
-rw-r--r--po/sr.po669
-rw-r--r--po/stamp-po1
-rw-r--r--po/sv.gmobin0 -> 8399 bytes
-rw-r--r--po/sv.po1783
-rw-r--r--po/tr.gmobin0 -> 12543 bytes
-rw-r--r--po/tr.po634
-rw-r--r--po/uk.gmobin0 -> 16825 bytes
-rw-r--r--po/uk.po644
-rw-r--r--po/vi.gmobin0 -> 9780 bytes
-rw-r--r--po/vi.po614
-rw-r--r--po/zh_CN.gmobin0 -> 6422 bytes
-rw-r--r--po/zh_CN.po615
-rw-r--r--sys/Makefile.am21
-rw-r--r--sys/Makefile.in784
-rw-r--r--sys/ximage/Makefile.am14
-rw-r--r--sys/ximage/Makefile.in779
-rw-r--r--sys/ximage/ximage.c51
-rw-r--r--sys/ximage/ximagepool.c649
-rw-r--r--sys/ximage/ximagepool.h112
-rw-r--r--sys/ximage/ximagesink.c1985
-rw-r--r--sys/ximage/ximagesink.h210
-rw-r--r--sys/xvimage/Makefile.am15
-rw-r--r--sys/xvimage/Makefile.in780
-rw-r--r--sys/xvimage/xvimage.c51
-rw-r--r--sys/xvimage/xvimagepool.c733
-rw-r--r--sys/xvimage/xvimagepool.h117
-rw-r--r--sys/xvimage/xvimagesink.c2955
-rw-r--r--sys/xvimage/xvimagesink.h278
-rw-r--r--tests/Makefile.am28
-rw-r--r--tests/Makefile.in774
-rw-r--r--tests/check/Makefile.am527
-rw-r--r--tests/check/Makefile.in2610
-rw-r--r--tests/check/elements/adder.c873
-rw-r--r--tests/check/elements/alsa.c134
-rw-r--r--tests/check/elements/audioconvert.c1731
-rw-r--r--tests/check/elements/audiotestsrc.c126
-rw-r--r--tests/check/elements/decodebin.c380
-rw-r--r--tests/check/elements/encodebin.c902
-rw-r--r--tests/check/elements/libvisual.c118
-rw-r--r--tests/check/elements/vorbisdec.c339
-rw-r--r--tests/check/elements/vorbistag.c411
-rw-r--r--tests/check/generic/clock-selection.c72
-rw-r--r--tests/check/generic/states.c222
-rw-r--r--tests/check/gst-plugins-base.supp389
-rw-r--r--tests/check/gst/typefindfunctions.c407
-rw-r--r--tests/check/libs/audio.c586
-rw-r--r--tests/check/libs/cddabasesrc.c512
-rw-r--r--tests/check/libs/discoverer.c94
-rw-r--r--tests/check/libs/fft.c563
-rw-r--r--tests/check/libs/gstlibscpp.cc136
-rw-r--r--tests/check/libs/libsabi.c130
-rw-r--r--tests/check/libs/mixer.c216
-rw-r--r--tests/check/libs/navigation.c324
-rw-r--r--tests/check/libs/netbuffer.c140
-rw-r--r--tests/check/libs/pbutils.c750
-rw-r--r--tests/check/libs/profile.c627
-rw-r--r--tests/check/libs/rtp.c807
-rw-r--r--tests/check/libs/rtsp.c153
-rw-r--r--tests/check/libs/struct_arm.h100
-rw-r--r--tests/check/libs/struct_i386.h96
-rw-r--r--tests/check/libs/struct_i386_osx.h100
-rw-r--r--tests/check/libs/struct_x86_64.h96
-rw-r--r--tests/check/libs/tag.c1871
-rw-r--r--tests/check/libs/video.c861
-rw-r--r--tests/check/libs/xmpwriter.c281
-rw-r--r--tests/check/pipelines/gio.c180
-rw-r--r--tests/check/pipelines/oggmux.c432
-rw-r--r--tests/check/pipelines/simple-launch-lines.c237
-rw-r--r--tests/check/pipelines/theoraenc.c467
-rw-r--r--tests/check/pipelines/vorbisdec.c118
-rw-r--r--tests/check/pipelines/vorbisenc.c418
-rw-r--r--tests/examples/Makefile.am15
-rw-r--r--tests/examples/Makefile.in777
-rw-r--r--tests/examples/app/Makefile.am32
-rw-r--r--tests/examples/app/Makefile.in873
-rw-r--r--tests/examples/app/appsink-src.c186
-rw-r--r--tests/examples/app/appsrc-ra.c226
-rw-r--r--tests/examples/app/appsrc-seekable.c230
-rw-r--r--tests/examples/app/appsrc-stream.c250
-rw-r--r--tests/examples/app/appsrc-stream2.c220
-rw-r--r--tests/examples/app/appsrc_ex.c86
-rw-r--r--tests/examples/audio/Makefile.am6
-rw-r--r--tests/examples/audio/Makefile.in711
-rw-r--r--tests/examples/audio/testchannels.c49
-rw-r--r--tests/examples/dynamic/Makefile.am21
-rw-r--r--tests/examples/dynamic/Makefile.in827
-rw-r--r--tests/examples/dynamic/addstream.c253
-rw-r--r--tests/examples/dynamic/codec-select.c298
-rw-r--r--tests/examples/dynamic/sprinkle.c264
-rw-r--r--tests/examples/dynamic/sprinkle2.c288
-rw-r--r--tests/examples/dynamic/sprinkle3.c301
-rw-r--r--tests/examples/encoding/Makefile.am14
-rw-r--r--tests/examples/encoding/Makefile.in702
-rw-r--r--tests/examples/encoding/encoding.c512
-rw-r--r--tests/examples/encoding/gstcapslist.c285
-rw-r--r--tests/examples/encoding/gstcapslist.h35
-rw-r--r--tests/examples/gio/Makefile.am8
-rw-r--r--tests/examples/gio/Makefile.in714
-rw-r--r--tests/examples/gio/giosrc-mounting.c126
-rw-r--r--tests/examples/overlay/Makefile.am49
-rw-r--r--tests/examples/overlay/Makefile.in876
-rw-r--r--tests/examples/overlay/gtk-videooverlay.c149
-rw-r--r--tests/examples/overlay/qt-videooverlay.cpp130
-rw-r--r--tests/examples/overlay/qtgv-videooverlay.cpp128
-rw-r--r--tests/examples/overlay/qtgv-videooverlay.h45
-rw-r--r--tests/examples/playrec/Makefile.am4
-rw-r--r--tests/examples/playrec/Makefile.in708
-rw-r--r--tests/examples/playrec/playrec.c166
-rw-r--r--tests/examples/seek/Makefile.am17
-rw-r--r--tests/examples/seek/Makefile.in743
-rw-r--r--tests/examples/seek/jsseek.c3060
-rw-r--r--tests/examples/seek/scrubby.c563
-rw-r--r--tests/examples/seek/seek.c2167
-rw-r--r--tests/examples/seek/stepping.c124
-rw-r--r--tests/examples/seek/stepping2.c142
-rw-r--r--tests/examples/snapshot/Makefile.am10
-rw-r--r--tests/examples/snapshot/Makefile.in690
-rw-r--r--tests/examples/snapshot/snapshot.c160
-rw-r--r--tests/examples/volume/Makefile.am6
-rw-r--r--tests/examples/volume/Makefile.in710
-rw-r--r--tests/examples/volume/volume.c172
-rw-r--r--tests/files/623663.mtsbin0 -> 4000 bytes
-rw-r--r--tests/files/Makefile.am6
-rw-r--r--tests/files/Makefile.in563
-rw-r--r--tests/files/hls.m3u815
-rw-r--r--tests/files/license-uris376
-rw-r--r--tests/files/partialframe.mjpegbin0 -> 1600 bytes
-rw-r--r--tests/files/test.mp3bin0 -> 3135 bytes
-rw-r--r--tests/icles/Makefile.am85
-rw-r--r--tests/icles/Makefile.in1260
-rw-r--r--tests/icles/audio-trickplay.c269
-rw-r--r--tests/icles/input-selector-test.c162
-rw-r--r--tests/icles/output-selector-test.c173
-rw-r--r--tests/icles/playback/Makefile.am26
-rw-r--r--tests/icles/playback/Makefile.in907
-rw-r--r--tests/icles/playback/decodetest.c169
-rw-r--r--tests/icles/playback/test.c193
-rw-r--r--tests/icles/playback/test2.c43
-rw-r--r--tests/icles/playback/test3.c127
-rw-r--r--tests/icles/playback/test4.c99
-rw-r--r--tests/icles/playback/test5.c133
-rw-r--r--tests/icles/playback/test6.c165
-rw-r--r--tests/icles/playback/test7.c178
-rw-r--r--tests/icles/playbin-text.c175
-rw-r--r--tests/icles/position-formats.c149
-rw-r--r--tests/icles/stress-playbin.c157
-rw-r--r--tests/icles/stress-videooverlay.c245
-rw-r--r--tests/icles/test-box.c144
-rw-r--r--tests/icles/test-colorkey.c285
-rw-r--r--tests/icles/test-scale.c164
-rw-r--r--tests/icles/test-textoverlay.c125
-rw-r--r--tests/icles/test-videooverlay.c248
-rw-r--r--tools/Makefile.am49
-rw-r--r--tools/Makefile.in887
-rw-r--r--tools/gst-discoverer.c559
-rw-r--r--tools/gst-visualise-m.m77
-rw-r--r--tools/gst-visualise.1.in32
-rw-r--r--win32/MANIFEST82
-rw-r--r--win32/common/_stdint.h9
-rw-r--r--win32/common/audio-enumtypes.c134
-rw-r--r--win32/common/audio-enumtypes.h27
-rw-r--r--win32/common/config.h392
-rw-r--r--win32/common/gstrtsp-enumtypes.c391
-rw-r--r--win32/common/gstrtsp-enumtypes.h35
-rw-r--r--win32/common/interfaces-enumtypes.c274
-rw-r--r--win32/common/interfaces-enumtypes.h49
-rw-r--r--win32/common/libgstapp.def32
-rw-r--r--win32/common/libgstaudio.def125
-rw-r--r--win32/common/libgstcdda.def4
-rw-r--r--win32/common/libgstinterfaces.def121
-rw-r--r--win32/common/libgstnetbuffer.def11
-rw-r--r--win32/common/libgstpbutils.def142
-rw-r--r--win32/common/libgstriff.def16
-rw-r--r--win32/common/libgstrtp.def124
-rw-r--r--win32/common/libgstrtsp.def112
-rw-r--r--win32/common/libgstsdp.def78
-rw-r--r--win32/common/libgsttag.def53
-rw-r--r--win32/common/libgstvideo.def45
-rw-r--r--win32/common/pbutils-enumtypes.c70
-rw-r--r--win32/common/pbutils-enumtypes.h23
-rw-r--r--win32/common/video-enumtypes.c254
-rw-r--r--win32/common/video-enumtypes.h35
-rw-r--r--win32/vs6/grammar.dsp424
-rw-r--r--win32/vs6/gst_plugins_base.dsw428
-rw-r--r--win32/vs6/libgstadder.dsp123
-rw-r--r--win32/vs6/libgstaudio.dsp207
-rw-r--r--win32/vs6/libgstaudioconvert.dsp151
-rw-r--r--win32/vs6/libgstaudiorate.dsp119
-rw-r--r--win32/vs6/libgstaudioresample.dsp163
-rw-r--r--win32/vs6/libgstaudioscale.dsp125
-rw-r--r--win32/vs6/libgstaudiotestsrc.dsp123
-rw-r--r--win32/vs6/libgstcdda.dsp143
-rw-r--r--win32/vs6/libgstdecodebin.dsp123
-rw-r--r--win32/vs6/libgstdecodebin2.dsp135
-rw-r--r--win32/vs6/libgstfft.dsp167
-rw-r--r--win32/vs6/libgstgdp.dsp127
-rw-r--r--win32/vs6/libgstinterfaces.dsp223
-rw-r--r--win32/vs6/libgstnetbuffer.dsp127
-rw-r--r--win32/vs6/libgstogg.dsp139
-rw-r--r--win32/vs6/libgstpbutils.dsp139
-rw-r--r--win32/vs6/libgstplaybin.dsp151
-rw-r--r--win32/vs6/libgstriff.dsp143
-rw-r--r--win32/vs6/libgstrtp.dsp155
-rw-r--r--win32/vs6/libgstrtsp.dsp195
-rw-r--r--win32/vs6/libgstsdp.dsp123
-rw-r--r--win32/vs6/libgstsinesrc.dsp121
-rw-r--r--win32/vs6/libgstsubparse.dsp123
-rw-r--r--win32/vs6/libgsttag.dsp135
-rw-r--r--win32/vs6/libgsttheora.dsp131
-rw-r--r--win32/vs6/libgsttypefindfunctions.dsp119
-rw-r--r--win32/vs6/libgstvideo.dsp143
-rw-r--r--win32/vs6/libgstvideorate.dsp119
-rw-r--r--win32/vs6/libgstvideoscale.dsp143
-rw-r--r--win32/vs6/libgstvideotestsrc.dsp131
-rw-r--r--win32/vs6/libgstvolume.dsp119
-rw-r--r--win32/vs6/libgstvorbis.dsp147
-rw-r--r--win32/vs8/gst-plugins-base.sln175
-rw-r--r--win32/vs8/libgstadder.vcproj206
-rw-r--r--win32/vs8/libgstaudio.vcproj254
-rw-r--r--win32/vs8/libgstaudioconvert.vcproj218
-rw-r--r--win32/vs8/libgstaudiorate.vcproj206
-rw-r--r--win32/vs8/libgstaudioresample.vcproj230
-rw-r--r--win32/vs8/libgstaudiotestsrc.vcproj206
-rw-r--r--win32/vs8/libgstdecodebin.vcproj212
-rw-r--r--win32/vs8/libgstinterfaces.vcproj264
-rw-r--r--win32/vs8/libgstogg.vcproj226
-rw-r--r--win32/vs8/libgstplaybin.vcproj224
-rw-r--r--win32/vs8/libgstriff.vcproj222
-rw-r--r--win32/vs8/libgstsubparse.vcproj200
-rw-r--r--win32/vs8/libgsttag.vcproj222
-rw-r--r--win32/vs8/libgsttcp.vcproj232
-rw-r--r--win32/vs8/libgsttheora.vcproj218
-rw-r--r--win32/vs8/libgsttypefind.vcproj206
-rw-r--r--win32/vs8/libgstvideo.vcproj218
-rw-r--r--win32/vs8/libgstvideorate.vcproj206
-rw-r--r--win32/vs8/libgstvideoscale.vcproj218
-rw-r--r--win32/vs8/libgstvideotestsrc.vcproj210
-rw-r--r--win32/vs8/libgstvolume.vcproj206
-rw-r--r--win32/vs8/libgstvorbis.vcproj222
1225 files changed, 583420 insertions, 0 deletions
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..1a394ed
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,23 @@
+Erik Walthinsen <omega@temple-baptist.com>
+Matt Howell <mhowell@users.sourceforge.net>
+Brent Bradburn <bbradburn@users.sourceforge.net>
+Wim Taymans <wim.taymans@gmail.com>
+Richard Boulton <richard@tartarus.org>
+Zaheer Abbas Merali <zaheerabbas at merali dot org>
+David I. Lehn <dlehn@users.sourceforge.net>
+Chris Emerson <chris@tartarus.org>
+Jens Thiele <karme@unforgettable.com>
+Thomas Nyberg <thomas@codefactory.se>
+Bastien Nocera <hadess@hadess.net>
+Christian Fredrik Kalager Schaller <Uraeus@linuxrising.org>
+Thomas Vander Stichele <thomas@apestaart.org>
+Andy Wingo <wingo@pobox.com>
+Cameron Hutchison <camh@xdna.net>
+David Schleef <ds@schleef.org>
+Benjamin Otte <in7y118@public.uni-hamburg.de>
+Ronald Bultje <rbultje@ronald.bitfreak.net>
+Julien MOUTTE <julien@moutte.net>
+Jan Schmidt <thaytan@mad.scientist.com>
+Arwed v. Merkatz <v.merkatz@gmx.net>
+Tim-Philipp Müller <tim at centricular dot net>
+Mark Borgerding <mark at borgerding dot net> (kissfft, used in libgstfft)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..60549be
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) 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; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, 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 executable. However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. 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 Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+ 7. 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 Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/COPYING.LIB b/COPYING.LIB
new file mode 100644
index 0000000..eb685a5
--- /dev/null
+++ b/COPYING.LIB
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, 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 library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ 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 Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the 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 a program 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.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ 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, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+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 compile 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) 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.
+
+ c) 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.
+
+ d) 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 source code 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 to
+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 Library 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
+
+ Appendix: 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should 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.
+
+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.
+
+ <signature of Ty Coon>, 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..a0b2b85
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,58666 @@
+=== release 0.11.1 ===
+
+2011-09-29 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ releasing 0.11.1, "A handful sometimes, A heartful always"
+
+2011-09-29 13:46:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/adder.c:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/audiorate.c:
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/audiotestsrc.c:
+ * tests/check/elements/decodebin2.c:
+ * tests/check/elements/encodebin.c:
+ * tests/check/elements/gdpdepay.c:
+ * tests/check/elements/gdppay.c:
+ * tests/check/elements/playbin-compressed.c:
+ * tests/check/elements/videorate.c:
+ * tests/check/elements/videotestsrc.c:
+ * tests/check/elements/volume.c:
+ * tests/check/libs/audio.c:
+ * tests/check/libs/pbutils.c:
+ * tests/check/libs/profile.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/check/pipelines/vorbisdec.c:
+ * tests/check/pipelines/vorbisenc.c:
+ tests: update for new audio caps
+
+2011-09-29 13:45:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstaudio.def:
+ defs: add new symbols
+
+2011-09-28 16:08:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ audiodecoder: fix refcounting error
+
+2011-09-28 16:07:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: store info so we can debug it
+
+2011-09-28 15:46:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-09-28 15:41:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ audiodecoder: really push pending events
+
+2011-09-28 15:35:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ * gst-libs/gst/audio/gstaudiodecoder.h:
+ audiodecoder: add method to set output caps
+ Add a method to configure the output caps. Subclasses can't use
+ gst_pad_set_caps() anymore because then we won't see the caps.
+ Unbreak the padtemplate registration, the GTypeClass that is configured in the
+ object during _init is not the right one, we need to use the klass passed as the
+ argument to the init function..
+
+2011-09-28 14:32:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: remove more tags from upstream tag events such as bitrate tags
+ We want to remove all codec specific tags.
+
+2011-09-28 11:35:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/audio/gstaudioencoder.c
+ gst/playback/gstplaybin2.c
+ gst/videotestsrc/videotestsrc.c
+
+2011-09-28 01:56:42 +0300 Raimo Järvi <raimo.jarvi@gmail.com>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix compiler warning on 64 bit mingw-w64
+ Fixes bug #660304.
+
+2011-09-28 01:11:30 +0300 Raimo Järvi <raimo.jarvi@gmail.com>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Fix compiler warnings on 64 bit mingw-w64
+ Fixes bug #660301.
+
+2011-09-27 16:18:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: only got_data if we really got some
+ ... which avoids going loopy with casual subclass.
+
+2011-09-27 16:57:45 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: really push pending events
+
+2011-09-27 16:16:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: send tag event after pending events
+ ... which probably includes a pending newsegment event.
+
+2011-09-27 16:16:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: protect pending_events with proper lock
+
+2011-09-27 15:31:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: clean up some documentation
+
+2011-09-27 11:19:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/video.h:
+ docs: improve docs
+
+2011-09-27 00:32:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: minor docs fix
+
+2011-09-26 21:11:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioenc: fix compilation
+
+2011-09-26 19:22:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/audio/gstaudiodecoder.c
+ gst-libs/gst/audio/gstaudioencoder.c
+ gst/encoding/gstencodebin.c
+
+2011-09-26 16:36:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: Adjust for GstAudioEncoder API changes
+
+2011-09-26 16:36:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstaudio.def:
+ win32: Adjust for GstAudioEncoder API changes
+
+2011-09-26 16:35:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: Improve set_frame_sample_{min,max} documentation
+
+2011-09-26 16:22:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ * gst-libs/gst/audio/gstaudiodecoder.h:
+ audiodecoder: Fix thread safety issues if both pads have different streaming threads
+
+2011-09-26 16:19:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ audiodecoder: Delay sending of serialized events to finish_frame()
+
+2011-09-26 16:02:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ Revert "audioencoder: Use GST_BOILERPLATE instead of custom GObject boilerplate code"
+ This reverts commit 11e375486e07cfa0686a97b5cf6110909b3a828c.
+ GST_BOILERPLATE() can't define an abstract type and
+ G_DEFINE_ABSTRACT_TYPE() does not pass the class struct to
+ the instance_init function and there's no way to get the
+ class struct of the current type in instance_init().
+
+2011-09-26 15:59:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ audioencoder: Add support for requesting a minimum and maximum number of samples per frame
+ This extends the special case of a fixed number of samples per frame
+ that was supported before already.
+
+2011-09-26 15:45:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ audioencoder: Fix thread safety issues if both pads have different streaming threads
+
+2011-09-26 15:42:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: Delay sending of serialized events to finish_frame()
+ This makes sure that the caps are already set before any serialized
+ events are sent downstream.
+
+2011-09-26 15:34:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: Use GST_BOILERPLATE instead of custom GObject boilerplate code
+
+2011-09-26 15:14:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ audioencoder: add some tag handling convenience help
+
+2011-09-26 14:48:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: provide CODEC/AUDIO_CODEC handling
+
+2011-09-26 13:42:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: filter AUDIO_CODEC/CODEC tags from passing tag events
+
+2011-09-25 15:31:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: backport some const-ifications from 0.11 branch
+ To keep code identical as much as possible between the two branches,
+ for easier merging.
+
+2011-09-25 15:24:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: fix indentation
+
+2011-09-23 21:18:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Android.mk:
+ * configure.ac:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/floatcast/Makefile.am:
+ * gst-libs/gst/floatcast/floatcast.h:
+ * gst-plugins-base.spec.in:
+ * gst/audioconvert/audioconvert.c:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-floatcast-uninstalled.pc.in:
+ * pkgconfig/gstreamer-floatcast.pc.in:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/libs/gstlibscpp.cc:
+ libs: remove unused floatcast header-only library
+ There's no code whatsoever that uses these macros. If anyone
+ ever feels the need to resurrect them, we should add them to
+ gstutils.h in core or libgstaudio or so.
+
+2011-09-23 18:27:11 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/ogg/gstoggdemux.c
+ ext/pango/gsttextoverlay.c
+ gst-libs/gst/audio/gstaudioencoder.c
+ gst-libs/gst/audio/gstbaseaudiosrc.c
+ gst/playback/gstsubtitleoverlay.c
+ gst/videorate/gstvideorate.c
+
+2011-09-23 17:50:31 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Avoid unnecessary read only caps copy
+
+2011-09-21 13:30:43 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ gst-libs: Temporarily remove dependency of gstaudio on gstpbutils
+ Also re-order the SUBDIRS in the higher-level Makefile so it cleanly
+ installs.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657675
+
+2011-09-22 15:38:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: proxy some more optional downstream caps fields to upstream
+
+2011-09-22 15:38:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: changed is verily the opposite of equal
+
+2011-09-22 15:37:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ audioencoder: prevent crashing when comparing to a freshly inited GstAudioInfo
+
+2011-09-22 15:36:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ audio: some more accessor macros for GstAudioInfo
+
+2011-09-22 15:34:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ audiodecoder: fix documentation typo
+
+2011-09-21 13:54:27 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Update common to 0.11 branch
+
+2011-09-21 13:31:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstaudio.def:
+ win32: Update .def files
+
+2011-09-19 18:32:26 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ videorate: Add tests for the max-rate case
+
+2011-09-19 18:31:07 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ videorate: Print which caps didn't match up
+
+2011-09-19 18:26:04 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: Add a max-rate property
+ In various use-case you want to dynamically change the framerate (e.g.
+ live streams where the available network bandwidth changes). Doing this
+ via capsfilters in the pipeline tends to be very cumbersome and racy,
+ using this property instead makes it very painless.
+
+2011-09-01 17:05:23 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ videorate: Add test for caps negotiation
+
+2011-09-01 16:47:49 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Add more strict caps negotiation
+ When in drop-only mode we can never provide a framerate that is higher
+ then the input, so let the caps negotiation reflect this.
+
+2011-09-20 13:35:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: don't unref event we don't own
+ http://bugzilla.gnome.org/show_bug.cgi?id=659562
+
+2011-09-20 14:04:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Only check if this is a discarded type if we have fixed caps
+ For unfixed caps we will get here again later when the caps are fixed.
+
+2011-09-20 14:03:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Only call autoplug-continue with fixed caps
+ With unfixed caps we can't reliably decide if the final caps
+ are going to be "raw" (e.g. supported by a sink) or not.
+ We will get here again later when the caps are fixed.
+
+2011-09-20 13:45:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/decodebin2.c:
+ decodebin2: Fix unit test by strictly implementing parser behaviour instead of relying on basetransform
+
+2011-01-13 15:35:30 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ oggstream: only use information from skeleton if we have nothing better
+ The codec setup headers are a lot more likely to have correct information,
+ especially as it's easy to remux a skeleton in a file where streams don't
+ have the same parameters (I've even seen a file with two skeletons).
+ Still, this is useful in the case we have a codec we can't decode, so we
+ can at least (theoretically) convert granpos to time, so we discard this
+ information if the codec setup has already provided it.
+ This fixes playback on (at lesat) the original archive.org encoding of
+ "The Night of the Living Dead" (now replaced by another encoding).
+ https://bugzilla.gnome.org/show_bug.cgi?id=612443
+
+2011-09-19 14:16:19 +0200 Age Bosma <agebosma@gmail.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ discoverer: Don't use gtk-doc /* < ... > */ style comments for signals
+ The /*< ... >*/ style is only used for public|protected|private,
+ signal comments use /* signals */. This prevents the some code
+ parsers/binding generators to be confused by the comment.
+
+2011-09-19 14:02:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Get the target of the video sinkpad, not the target sinkpad in the video setcaps handler
+
+2011-08-18 15:13:23 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Initialize variable correctly
+ If subdrained isn't initialized to FALSE then a chain might think
+ that its group is drained when in fact it's not and this can cause
+ a switch too early or even cause a deadlock.
+
+2011-07-28 16:44:33 +0000 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Rewrite EOS-handling code
+ This is now really threadsafe and improves switching
+ between different groups.
+
+2011-09-19 11:53:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Fix non-prerolling pipelines and not-linked errors if a parser is available but no decoder
+ Fixes bug #658846.
+
+2011-08-01 07:54:02 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtspdefs: add RTCP-Interval header
+
+2011-09-19 11:24:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Implement support for switching between raw and non-raw video streams
+
+2011-09-19 09:34:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Protect against accessing the NULL parent of the pads during shutdown
+ Fixes bug #658901.
+
+2011-09-16 20:14:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: remove superfluous check in newsegment event handler
+ If we get a newsegment event from upstream, we can be quite
+ sure we're not operating pull-based.
+
+2011-09-16 20:11:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: minor printf format fix
+
+2011-09-14 12:23:19 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix wedge when seeking twice quickly in push mode
+ This could happen when testing with navseek, and pressing
+ right and left at roughly the same time. The current chain
+ is temporarily moved away, and this caused the flush events
+ not to be sent to the source pads, which would cause the
+ data queues downstream to reject incoming data after the
+ seek, and shut down, wedging the pipeline.
+ Now, I can't really decide whether this is a nasty steaming
+ hack or a good fix, but it certainly does fix the issue, and
+ does not seem to break anything else so far.
+ https://bugzilla.gnome.org/show_bug.cgi?id=621897
+
+2011-08-13 14:18:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: implement push mode seeking
+ This patch implements seeking in push mode (eg, over the net)
+ in Ogg, using the double bisection method.
+ As a side effect, it also fixes duration determination of network
+ streams, by seeking to the end to check the actual duration.
+ Known issues:
+ - Getting an EOS while seeking stops the streaming task, I can't
+ find a way to prevent this (eg, by issuing a seek in the event
+ handler).
+ - Seeking twice in a VERY short succession with playbin2 fails
+ for streams with subtitles, we end up pushing in a dataqueue
+ which is flushing. Rare in normal use AFAICT.
+ - Seeking is slow on slow links - byte ranges guesses could be
+ made better, decreasing the number of required requests
+ - If no granule position is found in the last 64 KB of a stream,
+ duration will be left unknown (should be pretty rare)
+ https://bugzilla.gnome.org/show_bug.cgi?id=621897
+
+2011-09-15 22:04:56 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: fix compiler warning
+ Remove a check for gchar >= 128
+
+2011-09-15 16:47:26 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: don't access the event after pushing
+ Fixes valgrind warnings.
+
+2011-09-15 14:27:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ Revert "playbin2: autoplug sink if stream is incompatible to the configured one"
+ This reverts commit b0b4e286c8cde2e79a959a444a2c68e99c3f29c6.
+ We agreed that the previous (pre-.35) behaviour is broken and a bug and the
+ current behaviour is correct, deterministic and allows the application to
+ handle stuff properly while the old behaviour can't be handled properly by
+ applications and just worked in some applications by luck.
+ The solution to the problem that was solved by relying on the old, broken
+ behaviour would be, to make decodebin2/playbin2 more aware of decoders and
+ improve the autoplugging of decoders by considering the caps supported by the
+ sink instead of just using something with the highest rank.
+ See bug #656923.
+
+2011-09-15 09:23:54 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: autoplug sink if stream is incompatible to the configured one
+ Fixes regression since 0.10.33 where sinks that can cope with non raw
+ caps or custom caps are not autoplugged if there's a sink configured
+ with the properties video-sink and audio-sink which cannot handle
+ the stream. This change checks for compatibility on the configured one
+ and use it if success. Otherwhise it tries with the found factories.
+
+2011-08-13 14:14:19 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not propagate discontinuities in sparse streams
+ The first packet of a sparse stream may arrive after an initial
+ delay in the stream. If ogg_stream_packetout reports a discontinuity
+ in a sparse stream, do not propagate it to other streams in the
+ chain unnecessarily.
+ https://bugzilla.gnome.org/show_bug.cgi?id=621897
+
+2011-09-12 15:48:59 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaysink.c:
+ Revert "playsink: only add text overlay if vido sink also accepts raw caps"
+ This reverts commit a22faad18a73a27a2a0c903748c1a355df4d8c13. Instead
+ of disabling subtitles completelly when video stream have custom caps,
+ just let the sutbtileoverlay cope with them as now it's able to.
+
+2011-09-12 15:46:46 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: gracefully handle non raw video streams
+ Implement handling of non raw video streams by avoiding colorspace
+ elements and autoplugging a compatible renderer if available. Fallback
+ to passthrough if no compatible renderer is found.
+
+2011-09-12 15:10:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: try to catch malformed URIs
+ Only log in debug log for now, since the check is a bit
+ half-hearted, its purpose is mostly to make sure people
+ use gst_filename_to_uri() or g_filename_to_uri().
+ https://bugzilla.gnome.org/show_bug.cgi?id=654673
+
+2011-09-12 19:53:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/tag.h:
+ docs: minor addition to GST_TAG_ID3V2_HEADER_SIZE docs
+
+2011-09-11 14:22:59 -0400 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: Fix descriptions of properties
+
+2011-09-10 18:30:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: don't try to fixate "width" field for alaw/mulaw
+ Fixes warning when trying to fixate e.g. pulsesrc ! audio/x-alaw ! fakesink.
+
+2011-09-09 13:10:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/design-decodebin.txt:
+ docs: fix some typos in the decodebin design document
+
+2011-09-09 13:07:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.c:
+ colorbalance: add some guards to interface methods
+ https://bugzilla.gnome.org/show_bug.cgi?id=658584
+
+2011-09-09 12:07:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: recognize Asylum modules
+ Note that there is already a AMF detection for a different
+ magic, I'm not sure if that's a different format with the
+ same initials or not. AMF is used for a few different formats
+ (including video), so...
+ This fixes playbin2 playing Asylum modules.
+ https://bugzilla.gnome.org/show_bug.cgi?id=658514
+
+2011-08-31 20:51:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Improve subrip type check regex
+ This patch prevents timestamp like "1 1:00:00", which would have been seen
+ as hour 101 by our parser, and allow single digit hour, minute and seconds
+ as it's already supported by the parser, and also by other implementation
+ like in mplayer. This fixes bug 657872.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657872
+
+2011-09-08 14:46:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/design/design-decodebin.txt:
+ decodebin: Update design documentation about how Parser/Converter are handled
+
+2011-09-08 14:42:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ Revert "Revert "decodebin2: Do a subset check before actually using a factory""
+ This reverts commit 5f5d832a3bcff0828758f164fcb13c4258aefb36.
+
+2011-09-08 14:42:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ docs/libs/Makefile.am
+ tests/check/elements/decodebin2.c
+
+2011-09-08 13:25:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ Revert "decodebin2: Do a subset check before actually using a factory"
+ This reverts commit 50a88396ae6d54a83a10e7d2efd551d39033148e.
+ See bug #658541.
+
+2011-09-07 16:44:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/decodebin2.c:
+ decodebin2: Don't use bufferalloc in the test elements
+ This will cause not-linked errors that usually don't happen
+ because normal decoders/parsers will set srcpad caps before
+ allocating buffers from downstream.
+
+2011-09-07 16:43:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Make sure to fixate Parser/Converter caps before continuing autoplugging
+
+2011-09-07 16:04:43 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: only add text overlay if vido sink also accepts raw caps
+ Fixes regression, pipeline fails with not negotiated, on media
+ containing subtitles when decoder/sink with custom caps is used.
+
+2011-09-07 14:19:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Intersect the factory caps with the current caps for the capsfilter
+ Otherwise we'll include many incompatible caps in the capsfilter that
+ will only slow down negotiation.
+
+2011-09-07 14:07:00 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/libs/Makefile.am:
+ * 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-09-07 14:04:10 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ docs: add two mising enum docs
+
+2011-09-07 14:10:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/audiorate.c:
+ audiorate: Use complete audio caps, including the endianness field
+
+2011-09-07 12:32:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: fix element factory refcounting
+ g_value_get_object() does not give us our own ref.
+ Fixes "Trying to dispose object "flacparse", but it still has a parent "registry0".
+ You need to let the parent manage the object instead of unreffing the object directly."
+ and similar warnings.
+ https://bugzilla.gnome.org/show_bug.cgi?id=658416
+
+2011-09-07 11:06:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: do not automatically override quality when using target bitrate
+ If both quality and bitrate are set, libtheora will try to meet
+ both constraints, causing it to prefer emitting a smaller number
+ of good frames, to emitting the full number of frames that would
+ not meet the requested quality. This causes a slideshow effect
+ when the bitrate is low and the quality is high. And the default
+ theoraenc is high (48/63).
+ So only set quality when it is requested, and leave it unset
+ otherwise.
+ https://bugzilla.gnome.org/show_bug.cgi?id=658443
+
+2011-09-06 21:24:33 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From a39eb83 to 11f0cd5
+
+2011-09-06 19:18:27 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Add latest files to spec file
+
+2011-09-06 20:13:30 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/libs/Makefile.am:
+ docs: activate overrides file to fix make distcheck
+
+2011-09-06 16:42:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Merge remote-tracking branch 'origin/master' into 0.11
+ Merge in doc updates for audio enums from 0.10, and get rid
+ of the #if #else in the enum list, since that confuses gtk-doc.
+ Conflicts:
+ gst-libs/gst/audio/audio.c
+ gst-libs/gst/audio/audio.h
+
+2011-09-06 16:46:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ audio: rename IS_LE/BE to _IS_LITTLE_ENDIAN/BIG_ENDIAN
+
+2011-09-06 16:46:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ audio/video add descriptions
+ Add a description to the audio and video format info in case we want to use this
+ later.
+
+2011-09-06 15:46:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ audio: update internal silent sample defines as well to match 0.11
+
+2011-09-06 16:46:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ * gst/audioconvert/audioconvert.c:
+ rename IS_LE/BE to _IS_LITTLE_ENDIAN/BIG_ENDIAN
+
+2011-09-06 15:16:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ audio: update audio format enums to match changes in 0.11
+ And add new audio format info stuff to docs.
+
+2011-09-06 15:40:02 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 605cd9a to a39eb83
+
+2011-09-06 15:31:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/playback/gstsubtitleoverlay.c
+ tests/check/elements/decodebin2.c
+
+2011-09-06 15:24:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/audio/audio.h
+ gst-libs/gst/audio/gstaudiodecoder.c
+ gst-libs/gst/audio/gstaudiodecoder.h
+ gst-libs/gst/audio/gstaudioencoder.c
+ gst-libs/gst/audio/gstbaseaudioencoder.h
+ gst/playback/Makefile.am
+ gst/playback/gstplaybin.c
+ gst/playback/gstplaysink.c
+ gst/playback/gstplaysinkvideoconvert.c
+ gst/playback/gstsubtitleoverlay.c
+ gst/videorate/gstvideorate.c
+ gst/videoscale/gstvideoscale.c
+ win32/common/libgstaudio.def
+
+2011-09-06 14:16:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Do a subset check before actually using a factory
+ This prevents autoplugging if the caps have a non-empty intersection
+ but are not accepted by the next element's pad.
+
+2011-09-06 14:04:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Use subset check instead of non-empty-intersection check to check if pads are compatible
+
+2011-09-06 14:03:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Use subset check instead of non-empty-intersection check to check if pads are compatible
+
+2011-09-06 13:06:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Fix memory leak
+
+2011-09-06 12:14:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/decodebin2.c:
+ decodebin2: Add unit test for correct parser/converter negotiation
+
+2011-06-26 15:40:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Correctly negotiate format for parsers that can convert different stream formats
+ This is done by adding a capsfilter after every parser/converter that contains
+ all possible caps supported by downstream elements. A capsfilter is necessary
+ here because the decoder is only selected after the parser selected a format
+ and the parser can't know what downstream would support otherwise.
+
+2011-09-05 15:19:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If a audio/video sink was already selected don't check caps of all other possible sinks
+
+2011-09-06 08:25:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/decodebin2.c:
+ decodebin2: Add Tim as author for the parser test
+
+2011-09-06 12:06:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst/adder/gstadder.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/volume/gstvolume.c:
+ audio: change audio format syntax a little
+ Remove the _ in front of the endianness prefix.
+ Remove the _3 postfix for the 24 bits formats.
+ Add a _32 postfix after the formats that occupy extra space beyond their
+ natural size.
+ The result is that the GST_AUDIO_NE() macro can simply append the endianness
+ after all formats and that we only specify a different sample width when it is
+ different from the natural size of the sample. This makes things more consistent
+ and follows the pulseaudio conventions instead of the alsa ones.
+
+2011-09-06 10:07:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiodecoder.h:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ docs: more docs clean-ups
+
+2011-09-05 23:00:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: don't take the object lock twice in {set,get}_property
+ https://bugzilla.gnome.org/show_bug.cgi?id=658294
+
+2011-09-05 22:51:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ audio: fix GST_AUDIO_FORMAT_INFO_IS_*() macros to return a boolean
+
+2011-09-05 21:40:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ * gst-libs/gst/audio/gstaudiodecoder.h:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ docs: some docs love
+
+2011-09-05 20:45:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ docs: add GstAudioDecoder and GstAudioEncoder to documentation
+
+2011-09-05 15:01:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/gstaudiodecoder.c:
+ * gst-libs/gst/audio/gstaudiodecoder.h:
+ * gst-libs/gst/audio/gstaudioencoder.c:
+ * gst-libs/gst/audio/gstaudioencoder.h:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ * win32/common/libgstaudio.def:
+ audio: rename GstBaseAudioDecoder/Encoder to GstAudioDecoder/Encoder
+ API: gst_gst_audio_decoder_finish_frame()
+ API: gst_gst_audio_decoder_get_audio_info()
+ API: gst_gst_audio_decoder_get_byte_time()
+ API: gst_gst_audio_decoder_get_delay()
+ API: gst_gst_audio_decoder_get_latency()
+ API: gst_gst_audio_decoder_get_max_errors()
+ API: gst_gst_audio_decoder_get_min_latenc()y
+ API: gst_gst_audio_decoder_get_parse_state()
+ API: gst_gst_audio_decoder_get_plc()
+ API: gst_gst_audio_decoder_get_plc_aware()
+ API: gst_gst_audio_decoder_get_tolerance()
+ API: gst_gst_audio_decoder_get_type()
+ API: gst_gst_audio_decoder_set_byte_time()
+ API: gst_gst_audio_decoder_set_latency()
+ API: gst_gst_audio_decoder_set_max_errors()
+ API: gst_gst_audio_decoder_set_min_latency()
+ API: gst_gst_audio_decoder_set_plc()
+ API: gst_gst_audio_decoder_set_plc_aware()
+ API: gst_gst_audio_decoder_set_tolerance()
+ API: gst_gst_audio_encoder_finish_frame()
+ API: gst_gst_audio_encoder_get_audio_info()
+ API: gst_gst_audio_encoder_get_frame_max()
+ API: gst_gst_audio_encoder_get_frame_samples()
+ API: gst_gst_audio_encoder_get_hard_resync()
+ API: gst_gst_audio_encoder_get_latency()
+ API: gst_gst_audio_encoder_get_lookahead()
+ API: gst_gst_audio_encoder_get_mark_granule()
+ API: gst_gst_audio_encoder_get_perfect_timestamp()
+ API: gst_gst_audio_encoder_get_tolerance()
+ API: gst_gst_audio_encoder_get_type()
+ API: gst_gst_audio_encoder_proxy_getcaps()
+ API: gst_gst_audio_encoder_set_frame_max()
+ API: gst_gst_audio_encoder_set_frame_samples()
+ API: gst_gst_audio_encoder_set_hard_resync()
+ API: gst_gst_audio_encoder_set_latency()
+ API: gst_gst_audio_encoder_set_lookahead()
+ API: gst_gst_audio_encoder_set_mark_granule()
+ API: gst_gst_audio_encoder_set_perfect_timestamp()
+ API: gst_gst_audio_encoder_set_tolerance()
+ https://bugzilla.gnome.org/show_bug.cgi?id=642690
+
+2011-08-03 13:31:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Select muxer further
+ Sort muxers based on their caps and ranking before iterating to
+ find one that fits the profile.
+ Sorting is done by putting the elements that have a pad template
+ that can produce the exact caps that is on the profile. For example:
+ when asking for "video/quicktime, variant=iso", muxers that
+ have this exact caps on their pad templates will be put first on
+ the list than ones that have only "video/quicktime".
+ https://bugzilla.gnome.org/show_bug.cgi?id=651496
+
+2011-09-05 20:31:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Actually iterate over the factories instead of only taking the first one
+
+2011-09-05 15:51:25 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tests/check/libs/profile.c:
+ * tests/check/libs/tag.c:
+ * tests/check/libs/video.c:
+ tests: supress ERROR log output for some tests
+ Be nice when we tests for correct error handling and don't spam stdout.
+
+2011-09-05 14:40:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ Revert "playsink: Try include 'pitch', if no other sink is provided"
+ This reverts commit 105814e2c78f9867c61531b9e8166e4ae994296f.
+ The general consensus seems to be that we should revert this for
+ now. If such behaviour is desired, we should probably enable it
+ via a flag. And maybe use the scaletempo plugin instead.
+
+2011-09-05 12:02:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Don't leak the videochain ts-offset element
+ Also don't leak the audiochain ts-offset element if one is
+ found but the sink doesn't support volume settings.
+
+2011-09-05 11:55:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Use gst_object_unref() instead of g_object_unref() for better debugging
+
+2011-03-17 19:13:58 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_lanczos.c:
+ videoscale: Add modified Lanczos scaling method
+ Adds a Lanczos-derived scaling method, which is rather slow, but very
+ high quality. Adds a few properties that can be used to tune various
+ scaling properties: sharpness, sharpen, envelope, dither. Not currently
+ Orcified, but was designed with that in mind.
+
+2011-05-16 14:46:52 -0700 David Schleef <ds@schleef.org>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ playback: Add define for colorspace element
+ Single point of change if you want to switch from ffmpegcolorspace
+ to colorspace.
+
+2011-08-25 15:14:58 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: fix dynamically changing average period
+ The average_period_set variable can be accessed in different threads, so
+ always lock it when reading. Furthermore when switching to averaging
+ mode we should make sure we don't have cached buffers that aren't used
+ in that mode. And any modeswitch will cause the latency to change, so we
+ should post a NewLatency message
+
+2011-08-23 10:11:52 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * gst/videorate/Makefile.am:
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: Port to basetransform
+
+2011-08-22 15:52:57 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ Correct added versions
+
+2011-08-31 14:45:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Only unref ts_offset elements if they're not NULL
+
+2011-08-31 13:32:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: improve docs a little
+
+2011-08-31 12:39:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Keep the chain mutex locked while connecting to the notify::caps signal
+
+2011-08-30 14:04:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add some more macros
+
+2011-08-30 18:21:31 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/seek/seek.c:
+ seek: Accept pipeline descriptions for audiosink/videosink
+ Make the element_factory_make_or_warn utility function try parsing
+ the input string as a bin if element_factory_make() fails. This makes
+ the --audiosink/--videosink commandline options accept a pipeline
+ string.
+
+2011-08-30 18:21:31 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Try include 'pitch', if no other sink is provided
+ As a default, try the pipeline 'pitch ! audioconvert ! autoaudiosink'
+ before trying plain autoaudiosink
+
+2011-08-29 13:33:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: fix ts_offset refcounting
+
+2011-08-29 13:28:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ base: port to 0.11
+
+2011-08-29 11:42:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ audio: fix after merge
+
+2011-08-29 11:38:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ pbutils: port to new API
+
+2011-08-29 11:37:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/ogg/gstoggmux.c
+ gst-libs/gst/audio/audio.c
+ gst-libs/gst/audio/audio.h
+ gst-libs/gst/audio/multichannel.h
+ gst-libs/gst/pbutils/Makefile.am
+ gst-libs/gst/pbutils/gstdiscoverer.c
+ gst/playback/gstplaysinkaudioconvert.c
+ gst/playback/gstplaysinkvideoconvert.c
+ win32/common/libgstaudio.def
+
+2011-08-27 14:57:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ pbutils: don't depend on libgstvideo just to parse some caps
+ Let's extract those ints and fractions ourselves and not depend
+ on libgstvideo.
+
+2011-08-27 13:31:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * win32/common/libgstaudio.def:
+ audio: add GstBaseAudioDecoder and GstBaseAudioEncoder to build
+ However, libgstaudio now depends on libgstvideo (via pbutils).
+ https://bugzilla.gnome.org/show_bug.cgi?id=642690
+ API: gst_audio_info_clear()
+ API: gst_audio_info_convert()
+ API: gst_audio_info_copy()
+ API: gst_audio_info_free()
+ API: gst_audio_info_from_caps()
+ API: gst_audio_info_init()
+ API: gst_audio_info_to_caps()
+ API: gst_base_audio_decoder_finish_frame()
+ API: gst_base_audio_decoder_get_audio_info()
+ API: gst_base_audio_decoder_get_byte_time()
+ API: gst_base_audio_decoder_get_delay()
+ API: gst_base_audio_decoder_get_latency()
+ API: gst_base_audio_decoder_get_max_errors()
+ API: gst_base_audio_decoder_get_min_latency()
+ API: gst_base_audio_decoder_get_parse_state()
+ API: gst_base_audio_decoder_get_plc()
+ API: gst_base_audio_decoder_get_plc_aware()
+ API: gst_base_audio_decoder_get_tolerance()
+ API: gst_base_audio_decoder_get_type()
+ API: gst_base_audio_decoder_set_byte_time()
+ API: gst_base_audio_decoder_set_latency()
+ API: gst_base_audio_decoder_set_max_errors()
+ API: gst_base_audio_decoder_set_min_latency()
+ API: gst_base_audio_decoder_set_plc()
+ API: gst_base_audio_decoder_set_plc_aware()
+ API: gst_base_audio_decoder_set_tolerance()
+ API: gst_base_audio_encoder_finish_frame()
+ API: gst_base_audio_encoder_get_audio_info()
+ API: gst_base_audio_encoder_get_frame_max()
+ API: gst_base_audio_encoder_get_frame_samples()
+ API: gst_base_audio_encoder_get_hard_resync()
+ API: gst_base_audio_encoder_get_latency()
+ API: gst_base_audio_encoder_get_lookahead()
+ API: gst_base_audio_encoder_get_mark_granule()
+ API: gst_base_audio_encoder_get_perfect_timestamp()
+ API: gst_base_audio_encoder_get_tolerance()
+ API: gst_base_audio_encoder_get_type()
+ API: gst_base_audio_encoder_proxy_getcaps()
+ API: gst_base_audio_encoder_set_frame_max()
+ API: gst_base_audio_encoder_set_frame_samples()
+ API: gst_base_audio_encoder_set_hard_resync()
+ API: gst_base_audio_encoder_set_latency()
+ API: gst_base_audio_encoder_set_lookahead()
+ API: gst_base_audio_encoder_set_mark_granule()
+ API: gst_base_audio_encoder_set_perfect_timestamp()
+ API: gst_base_audio_encoder_set_tolerance()
+
+2011-08-27 13:15:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ docs: add since markers to baseaudio{decoder,encoder} documentation
+
+2011-08-27 12:47:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudiodecoder, baseaudioencoder: fix some compiler warnings
+ Leaving the GST_USE_UNSTABLE_API guards in until some of the
+ ported decoders have been updated and it's clear that I didn't
+ mess up anywhere porting things to the new audio API.
+
+2011-08-27 12:41:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioutils.c:
+ * gst-libs/gst/audio/gstbaseaudioutils.h:
+ baseaudioutils: remove, merged into or superseded by audio.c
+
+2011-08-27 12:39:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: port to new GstAudioInfo API
+
+2011-08-27 12:37:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: port to GstAudioInfo API
+
+2011-08-27 11:43:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ audio: add gst_audio_info_{init,clear} and gst_audio_info_{copy,free}
+
+2011-08-22 20:15:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/multichannel.c:
+ * gst-libs/gst/audio/multichannel.h:
+ audio: add GstAudioFormat, GstAudioFormatInfo and GstAudioInfo
+ Same as in 0.11, but with caps parsing/serialising for 0.10 style
+ caps. Add setting default channel positions.
+
+2011-08-17 18:48:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: remove leftover experimental code
+
+2011-08-17 18:32:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioutils.c:
+ * gst-libs/gst/audio/gstbaseaudioutils.h:
+ audioutils: modify _parse, add GType support functions
+
+2011-08-16 21:11:42 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: move properties to private storage and add _get/_set
+
+2011-08-16 21:11:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: rename property
+
+2011-08-16 20:39:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: replace context helper structure by various _get/_set
+
+2011-08-16 18:59:13 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: move properties to private storage and add _get/_set
+
+2011-08-16 18:25:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: rename some properties
+
+2011-08-16 18:23:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: replace context helper structure by various _get/_set
+
+2011-08-16 17:27:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ * gst-libs/gst/audio/gstbaseaudioutils.c:
+ * gst-libs/gst/audio/gstbaseaudioutils.h:
+ baseaudio: rename GstAudioState to GstAudioFormatInfo
+
+2011-06-17 11:54:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: TEMP; avoid some imperfect ts jitter ?
+ ... even when not in perfect mode ?
+
+2011-04-28 12:01:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: debug format fixes
+
+2011-04-28 12:01:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: debug format fix
+
+2011-03-31 14:03:11 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: fixup documentation
+
+2011-03-29 15:51:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: fix FLUSH_STOP actions
+
+2011-03-28 13:16:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: preserve upstream seek event seqnum
+
+2011-03-22 11:09:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: use buffer running time for granule calculation
+
+2011-03-22 10:45:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: minor fix in ts resync
+
+2011-03-21 11:40:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: improve glitch resilience
+ Provide a replacement for GST_ELEMENT_ERROR to avoid aborting at the first
+ atom out of place, while on the other hand not failing indefinitely.
+
+2011-03-17 12:09:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: add limited legacy seeking support
+
+2011-03-16 14:41:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: cater for audio-codec tag
+
+2011-03-10 16:01:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiodecoder: initial version
+
+2011-03-16 18:41:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: misc fixes
+
+2011-03-15 17:27:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ * gst-libs/gst/audio/gstbaseaudioutils.c:
+ * gst-libs/gst/audio/gstbaseaudioutils.h:
+ baseaudio: add audioutils for caps and query handling helper utils
+
+2011-03-14 12:39:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: mark unstable API
+
+2011-03-10 15:12:54 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: fix clearing context
+
+2011-03-10 15:12:19 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: simplify latency variable handling
+
+2011-03-10 14:28:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: minor fixes and code simplifications
+ Also modify and elaborate a bit on pre_push (though currently unused to no harm).
+
+2011-03-09 12:44:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: additional documentation on granule semantics and configuration
+
+2011-03-09 12:24:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: elaborate property names
+
+2011-03-09 12:22:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: rename state field xint to is_int
+
+2011-03-09 12:18:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ baseaudioencoder: gtk-doc syntax fixes
+
+2011-03-09 12:17:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ baseaudioencoder: minor fix and cleanup
+
+2011-03-01 14:08:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ baseaudiocodec: ... and also rename to baseaudiodecoder
+
+2011-03-01 13:58:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ gst-libs/gst/audio: Remove baseaudiodecoder
+ Adds little beyond baseaudiocodec (seeking, bit of query), and what it adds
+ is mainly out-of-scope (e.g. decoder seeking, should be done by upstream
+ demuxer/parser) and/or based on non-prime example (mad).
+
+2009-09-17 13:26:28 +0200 Iago Toral <itoral@igalia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ baseaudiodecoder: Return TRUE if we run into special conversion cases.
+
+2009-09-01 14:17:53 +0200 Iago Toral <itoral@igalia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ audio: initial version of GstBaseAudioCodec
+ Moved most of the code to GstBaseAudioCodec, GstBaseAudioDecode is
+ now really small, maybe we do not really need it (or its encoder
+ counterpart). Added more API for subclasses and documentation.
+
+2009-08-14 09:45:52 +0200 Iago Toral <itoral@igalia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ Added src_queries to decoder class. Added handle_discont to decoder class. Reworked reset. Various other minor fixes.
+
+2009-08-06 15:28:00 +0200 Iago Toral <itoral@igalia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ Added a draft implementation of gstbaseaudiodecoder
+
+2011-03-01 11:56:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiodecoder.c:
+ * gst-libs/gst/audio/gstbaseaudiodecoder.h:
+ Added audio directory for audio codec base classes
+
+2011-02-18 16:38:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ audioencoders: add streamheader helper utility
+
+2011-01-27 16:52:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudioencoder.c:
+ * gst-libs/gst/audio/gstbaseaudioencoder.h:
+ audioencoders: baseaudioencoder and ported encoders
+
+2011-08-26 14:20:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ base: fix for allocation methods rename
+
+2011-08-26 10:03:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstpbutils.def:
+ win32: Add new discoverer API
+
+2011-08-26 10:03:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: Add new discoverer API
+
+2011-08-24 16:29:08 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ * tools/gst-discoverer.c:
+ discoverer: retrieve audio track language from tags too
+ https://bugzilla.gnome.org/show_bug.cgi?id=657257
+
+2011-08-24 15:09:47 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: consider subtitles as raw
+ Otherwise, discoverer will generated an "inner" codec
+ where there can be a tranformation (eg, kate -> DVD SPU,
+ and various ->text/x-pango-markup).
+ https://bugzilla.gnome.org/show_bug.cgi?id=639055
+
+2011-08-24 15:05:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: add application/x-kate to subtitles caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=639055
+
+2011-08-24 14:59:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: get language from other tags if we did not get it already
+ https://bugzilla.gnome.org/show_bug.cgi?id=639055
+
+2011-08-24 15:04:50 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ * tools/gst-discoverer.c:
+ discoverer: add subtitles API
+ https://bugzilla.gnome.org/show_bug.cgi?id=639055
+
+2011-08-21 14:51:45 -0700 David Schleef <ds@schleef.org>
+
+ * gst/playback/gstplaysink.c:
+ playback: reference count ts_offset
+ Apparently this object is being used after it's freed. This is one
+ way to fix it, although perhaps not the best way. Fixes: #656715.
+
+2011-08-25 17:41:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgsttag.def:
+ * win32/common/libgstvideo.def:
+ win32: Update .def files
+
+2011-08-25 17:41:30 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/_stdint.h:
+ * win32/common/audio-enumtypes.c:
+ * win32/common/audio-enumtypes.h:
+ * win32/common/config.h:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/video-enumtypes.c:
+ * win32/common/video-enumtypes.h:
+ win32: Update pre-generated files
+
+2011-08-25 17:41:11 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/video/video.h:
+ video: Fix typo in interlaced flag (TTF => TFF)
+
+2011-08-25 16:41:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: clean up the custom flags
+ Clean up the flags, make an enum of them. We can now do this because there are
+ no subclasses of buffer anymore.
+
+2011-08-25 16:30:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ convert: use new caps
+
+2011-08-25 14:55:14 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: fix caps leak
+ https://bugzilla.gnome.org/show_bug.cgi?id=657333
+
+2011-07-08 23:06:46 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppayload: Make perfect timestamps reproducible across element restart
+ Without the perfect timestamp machinery, the RTP timestamp can be
+ computed directly from the running time of a buffer, but the perfect
+ timestamp patch broke that assumption. This patch restores it by
+ having the first perfect timestamp be the running time of that buffer
+ and counting from there.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=654434
+
+2011-08-25 13:21:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: use base class fill method
+
+2011-08-24 17:39:11 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: fix leaks in skeleton writing
+ https://bugzilla.gnome.org/show_bug.cgi?id=563251
+
+2011-08-18 16:36:23 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: generate message headers from received tags
+ Some message headers can be deduced from tags (eg, "Language").
+ https://bugzilla.gnome.org/show_bug.cgi?id=563251
+
+2011-08-18 10:05:17 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggparse.c:
+ ogg: use memory slices where appropriate
+ While there, avoid zeroing newly allocated memory where unnecessary
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-24 18:39:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/riff/riff-media.c:
+ multichannel: add some more channels
+
+2011-08-24 16:40:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/video/video.h:
+ audio/video: add format of the pack functions
+ Replace the unpack_size with an unpack_format, which is more descriptive of the
+ kind of data the unpack function will create.
+
+2011-08-24 14:13:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstchannelmix.c:
+ audio: rename UNPOSITIONED to DEFAULT_POSITIONS
+ Rename the UNPOSITIONED flag to the DEFAULT_POSITIONS flag because that is
+ really what the resulting GstAudioInfo will contain as the chanel mappings.
+
+2011-08-24 14:05:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ playsink{audio,video}convert: Send NEWSEGMENT events to sinkpads instead of pushing them
+
+2011-08-24 13:52:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add an id to the video frame
+ Rename @view_id to @id.
+ Add an id to the video metadata. Add a method to get the metadata from a buffer
+ with the given id.
+ Make a method to map a frame with a certain id. This only maps the frame with
+ the given id on the video metadata. The generic frame id can be used when a
+ buffer carries multiple video frames such as in multiview mode but maybe also
+ when dealing with interlaced video that stores the fields in separate buffers.
+
+2011-08-24 11:05:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: fix build
+
+2011-08-24 11:04:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/ogg/gstoggmux.c
+ ext/vorbis/gstvorbisenc.c
+
+2011-08-23 11:12:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not warn when reaching EOS while scanning for the end chain
+ After all, we were asking for it.
+ This gets rid of the last warning-about-expected-condition.
+ w00t.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 11:08:25 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: add media type to chain information reports
+ One more little step in making logs a little less abstruse.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 11:05:11 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: correctly identify skeleton EOS packet
+ It is 0 byte, and was triggering the "bad packet" logic.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:58:20 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not warn about expected occurences
+ In this case, finding a skeleton packet.
+ Once upon a time, it used to be rare indeed, but no more.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:47:53 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not warn when finding a non BOS page
+ After all, we do hope to find actual data for these streams.
+ However, warn if we could not set up a chain when we find a
+ non BOS page, as that means we don't have a valid Ogg stream.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:40:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: rename local variable for clarity
+ While the casual reader might end up bewildered by just why this
+ change might increase clarity, it just happens than, in the libogg
+ and associated sources, op is the canonical name for an ogg_packet
+ whlie og is the canonical name for an ogg_page, and reading this
+ code confuses me.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:32:36 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not try to determine duration of header packets
+ Headers are inherently durationless.
+ Instead, set duration to 0 to avoid increasing tracked granpos,
+ and do not warn about it, since it is totally expected.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:29:49 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: include stream type in warnings
+ It makes it easier to work out what's going on.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-23 10:28:33 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: set skeleton stream media type to application/x-ogg-skeleton
+ This is to match the typefinder, and to make logs clearer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657151
+
+2011-08-17 17:09:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: add skeleton write support
+ Version written is 3.0
+ Base times are left empty for now.
+ Content-Type should be the MIME type of the stream. It is set to
+ the GStreamer media type for now, which is probably the same for
+ the streams oggmux supports.
+ https://bugzilla.gnome.org/show_bug.cgi?id=563251
+
+2011-08-23 20:34:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: fix chroma-site enums
+
+2011-08-23 19:23:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: avoid gst-indent breaking the code
+
+2011-08-23 19:04:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: fix docs
+
+2011-08-23 18:57:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ video: add colorimetry info
+ Make enums for the chroma siting for easier use in the videoinfo.
+ Make enums for the color range, color matrix, transfer function and the
+ color primaries. Add these values to the video info structure in a Colorimetry
+ structure. These values define the exact colors and are needed to perform
+ correct colorspace conversion. Use a couple of predefined colorimetry specs
+ because in practice only a few combinations are in use.
+ Add view_id to the video frames to identify the view this frame represents in
+ multiview video.
+ Remove old gst_video_parse_caps_framerate, use the videoinfo for this.
+ Port elements to new colorimetry info.
+ Remove deprecated colorspace property from videotestsrc.
+
+2011-08-22 14:56:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not skip sparse streams when determining start times
+ This fixes demuxing of streams containing only sparse streams,
+ which would cause an infinite loop in _read_end_chain.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657062
+
+2011-08-22 14:55:59 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do not ignore sparse streams' start time
+ But do not wait for them either, if we don't have a packet for them.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657062
+
+2011-07-21 17:16:26 -0400 Monty Montgomery <cmontgom@redhat.com>
+
+ * ext/vorbis/gstvorbisenc.c:
+ vorbisenc: Relax overly-tight jitter tolerances in gstvobisenc
+ vorbisenc currently reacts in a rater draconian fashion if input
+ timestamps are more than 1/2 sample off what it considers ideal. If data
+ is 'too late' it truncates buffers, if it is 'too soon' it completely
+ shuts down encode and restarts it. This is causingvorbisenc to produce
+ corrupt output when encoding data produced by sources with bugs that
+ produce a smple or two of jitter (eg, flacdec)
+
+2011-08-22 16:21:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audio: use convert audio helper
+
+2011-08-22 16:11:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ audio: move function to convert
+
+2011-08-22 15:57:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-media-types.txt:
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: parse number of views
+ Parse the number of views in multiview video buffers.
+
+2011-08-22 13:14:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/pango/gsttextoverlay.c
+
+2011-08-22 13:06:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/interfaces/videooverlay.c
+ gst-libs/gst/rtp/gstrtpbuffer.c
+ 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/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
+
+2011-08-22 12:22:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstogmparse.c:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst-libs/gst/video/video.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/decodebin.c:
+ fourcc: remove fourcc
+ Remove fourcc in caps.
+ Fix pbutils descriptions.
+ Add more video macros
+ Fix some unit test
+
+2011-08-22 12:21:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: fix compilation
+
+2011-08-22 09:06:53 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: fix text buffer leak
+ Make sure to always unref the input text buffer.
+ Reported by bcxa.sz@gmail.com.
+ https://bugzilla.gnome.org/show_bug.cgi?id=657049
+
+2011-08-20 19:46:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/gstvideosink.h:
+ docs: fix xref for the property
+
+2011-08-20 19:16:42 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/navigation.c:
+ * gst-libs/gst/interfaces/streamvolume.h:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/install-plugins.h:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ * gst-libs/gst/video/gstvideosink.h:
+ docs: handle warnings emitted by gtk-doc
+ This is useful and in most cases someone had put arbitrary markup into the docs,
+ misspelled xref'ed symbols, forgot to add stuff to the docs etc..
+
+2011-08-20 17:53:11 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: partially revert my last commit
+ Somehow this was already there, but I missed that commit.
+
+2011-08-20 14:11:11 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/licenses.c:
+ docs: add new taglicense docs and clean them up
+ Avoid ugly docbook tags unless needed.
+
+2011-08-20 12:37:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update for new translatable string
+
+2011-08-20 12:36:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ tag: fix distcheck issue
+ Dist licenses dict.
+
+2011-08-20 10:49:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstaudioquantize.c:
+ * gst/audioconvert/gstchannelmix.c:
+ audio: rename INT -> INTEGER
+ Spell INTEGER fully instead of using the int abreviation.
+ Remove some old functions.
+
+2011-08-19 17:41:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsa.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst/audioconvert/channelmixtest.c:
+ * gst/encoding/gstencodebin.c:
+ more audio caps porting
+
+2011-08-19 17:05:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: port to new caps
+
+2011-08-19 17:05:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: fix playbin2 setup
+
+2011-08-19 16:49:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/Makefile.am:
+ * ext/libvisual/visual.c:
+ visual: port some more to new audio caps
+
+2011-08-19 16:01:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: port to new audio caps
+
+2011-08-19 16:00:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ audio: add function to build audio format
+
+2011-08-19 14:07:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-08-19 11:55:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ audio: add more macros
+
+2011-08-19 10:06:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst/volume/gstvolume.c:
+ audiofilter: Pass a const pointer to the audio format info to ::setup()
+ It is not meant to be changed by the subclass.
+
+2011-08-18 16:20:57 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggparse.c:
+ ogg: do not use 32 bit modifiers to print serial numbers
+ If ints are 64 bits, 32 bits should get promoted in varargs anyway,
+ and we don't care about 16 bit ints.
+ This makes the code a lot more readable, and still gets us nice
+ hexadecimal 32 bit serialnos.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-18 19:36:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/ogg/gstoggmux.c
+ gst/playback/gstplaysink.c
+
+2011-08-18 19:15:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasink.h:
+ * ext/alsa/gstalsasrc.c:
+ * ext/alsa/gstalsasrc.h:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/gstvorbisdeclib.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/audio/gstaudioiec61937.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/audio/multichannel.c:
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/video/video.h:
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/audioconvert/gstaudioquantize.c:
+ * gst/audioconvert/gstchannelmix.c:
+ * gst/audiorate/Makefile.am:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiorate/gstaudiorate.h:
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audiotestsrc/Makefile.am:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ * gst/playback/gstrawcaps.h:
+ * gst/volume/gstvolume.c:
+ audio: rework audio caps.
+ Rework the audio caps similar to the video caps. Remove
+ width/depth/endianness/signed fields and replace with a simple string
+ format and media type audio/x-raw.
+ Create a GstAudioInfo and some helper methods to parse caps.
+ Remove duplicate code from the ringbuffer and replace with audio info.
+ Use AudioInfo in the base audio filter class.
+ Port elements to new API.
+
+2011-07-27 11:05:31 +0000 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Reconfigure when pads are added later
+ Instead of just assuming all pads are created at the same time,
+ remember which ones are actually new (via ->pending_blocked_pads).
+ This allows the following use-case to properly work:
+ * Upstream starts with audio-only
+ * Only that pad gets data, blocks and a real audio sink is created
+ * Upstream laters adds a video stream
+ * A new pad is requested, blocks and reconfiguration kicks in in
+ order to add a new real video sink
+
+2011-08-18 09:37:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/README:
+ ogg: get the operator precedence right, even if only a doc
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-18 09:30:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: vorbis has a preroll of 2
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 19:40:08 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggstream: new convenience function to get a stream's media type
+ This will make logging a lot clearer, both in code and in output.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 18:48:54 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ ogg: move the "always flush page" to oggstream
+ It avoids checking for specific media types in the muxer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 18:38:39 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: use oggstream to decide which BOS packets to place first
+ Ogg recommends video BOS packets to be first.
+ Use the "is_video" flag in oggstream to select those, rather than
+ check for known mime types.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 18:03:16 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggstream.h:
+ ogg: rationalize serialno type to guint32
+ It is a 32 bit unsigned number.
+ Sure, the libogg API uses a long, but that's an unfortunate oversight.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 17:39:18 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: factor the header packet creation code
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-17 17:18:47 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: headers should always have granpos 0
+ https://bugzilla.gnome.org/show_bug.cgi?id=656775
+
+2011-08-18 09:48:16 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/audioresample/resample.c:
+ audioresample: fix build without orc
+ https://bugzilla.gnome.org/show_bug.cgi?id=656781
+
+2011-08-17 17:24:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: chain up to parent in fixate
+
+2011-08-17 17:22:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: properly override fixate
+
+2011-08-17 17:18:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: properly override the fixate function
+
+2011-08-17 17:18:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add some more macros
+
+2011-08-17 10:57:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/id3v2.c:
+ tagdemux: port to 0.11
+
+2011-08-17 10:57:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: fix compiler warning
+
+2011-08-17 10:47:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: fix after merge
+
+2011-08-17 10:47:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: fix after merge
+
+2011-08-16 18:01:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ ext/pango/gsttextoverlay.c
+ ext/theora/gsttheoradec.c
+ gst/adder/gstadder.c
+ gst/adder/gstadder.h
+ gst/audioresample/gstaudioresample.c
+ gst/encoding/gstencodebin.c
+ gst/playback/gstdecodebin.c
+ gst/playback/gstdecodebin2.c
+ tests/check/elements/decodebin2.c
+ tests/check/elements/playbin-compressed.c
+ win32/common/libgsttag.def
+
+2011-08-16 16:51:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ audio: remove deprecated methods
+
+2011-08-15 01:22:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ * tests/check/libs/tag.c:
+ tag: id3: avoid some more relocations in genre table
+
+2011-08-12 12:07:32 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/audioresample.c:
+ audioresample: add FFT based checks
+ Send a few simple tones through audioresample and check
+ that the main frequency spot is the same for the input and
+ the resampled output.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656392
+
+2011-08-15 23:41:24 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: add OSX specific hack to detect when a connection is refused
+ Unlike linux, OSX wakes up select with POLLOUT (instead of POLLERR) when
+ connect() is done async and the connection is refused. Therefore always check
+ for the socket error state using getsockopt (..., SO_ERROR, ...) after a
+ connection attempt.
+
+2011-08-15 18:39:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagepool.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ xvimage: avoid caps intersection
+ Store the video format in the XvImage format list so that we can quickly map
+ between the two.
+
+2011-08-15 18:38:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ gststreamsynchronizer: don't abuse PREROLL flag
+ the preroll flag is not implemented and will disappear soon.
+
+2011-08-15 12:18:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * tests/check/libs/struct_x86_64.h:
+ * tests/check/pipelines/oggmux.c:
+ fix for _negotiated_caps() change
+
+2011-08-15 00:17:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: add new license API to docs
+
+2011-08-15 00:03:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: try pkg-config first when looking for zlib
+
+2011-08-14 20:44:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.3.0.txt:
+ * gst-libs/gst/tag/id3v2.4.0-frames.txt:
+ * gst-libs/gst/tag/id3v2.4.0-structure.txt:
+ tag: id3v2: add specs to git for reference
+
+2011-08-14 13:32:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: avoid some relocations, make table static
+
+2011-08-14 01:47:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: add debug category for ID3 tag parsing
+
+2011-07-18 18:09:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * configure.ac:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/id3v2.c:
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/id3v2frames.c:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ * win32/common/libgsttag.def:
+ tag: id3v2: add id3v2 tag parsing helpers
+ https://bugzilla.gnome.org/show_bug.cgi?id=654388
+
+2011-02-22 15:19:00 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: return ID3TAGS_BROKEN_TAG for unsupported versions
+ This prevents us for trying to work with a NULL taglist.
+
+2011-01-02 19:23:51 +0000 Erich Schubert <erich@debian.org>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: 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
+
+2010-09-24 15:19:15 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: Sanitize id3 frame names
+ This is similar to what is done in qtdemux. Avoids providing invalid
+ structure/tags names
+
+2010-03-30 01:50:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: fix parsing of unsynced frames with data length indicator
+ Fixes bug #614158.
+
+2010-03-20 00:54:14 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/tag/id3v2.c:
+ Add -Wwrite-strings to the configure flags
+ ... and fix all warnings
+
+2009-12-13 13:19:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: prefer two letter ISO 639-1 code for extended comment
+
+2009-10-09 15:59:25 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: fixes warnings building on macosx
+ Another round on the formating of that debug line.
+
+2009-10-09 14:44:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: cast pointer math results to glong
+
+2009-10-09 13:38:17 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: don't cast, but use the right format specified instead
+ This correct some of the previous macos fixes.
+
+2009-10-09 11:42:36 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: fix printf warnings on macosx
+
+2009-10-07 14:03:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: fprintf, sprintf, sscanf need stdio.h
+
+2009-09-22 15:03:20 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: Fix compile warnings with gcc 4.0.1.
+
+2009-08-09 12:52:17 +0200 LoneStar <lone@auvtech.com>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: Try GST_*_TAG_ENCODING and locale encoding if tags are not UTF8
+ Fixes bug #499242.
+
+2009-08-07 16:42:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: 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 <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: fix typo in debug message
+
+2009-08-07 16:02:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/id3v2frames.c:
+ tag: id3v2: 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-04-24 01:51:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: 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 <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/id3v2.c:
+ tag: id3v2: 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.
+
+2008-06-04 10:42:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/id3v2frames.c: (parse_picture_frame):
+ Use new utility functions in libgsttag to process coverart (#512333).
+
+2008-01-11 21:08:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: 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-libs/gst/tag/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-09 15:20:19 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ tag: id3v2: 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 <ext-tommi.myohanen nokia com>
+ * gst-libs/gst/tag/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.
+
+2007-12-14 10:17:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Parse WOAF frames and put the result into GST_TAG_CONTACT, which is where it would end up...
+ Original commit message from CVS:
+ * tag: id3v2: (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-11-14 21:39:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/id3v2.c:
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/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-10-11 17:55:29 +0000 Jason Kivlighn <jkivlighn@gmail.com>
+
+ tag: id3v2: Extract license/copyright URIs from ID3v2 WCOP frames (Fixes #447000).
+ Original commit message from CVS:
+ Based on patch by: Jason Kivlighn <jkivlighn gmail com>
+ * gst-libs/gst/tag/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-06 16:13:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/gstid3demux.c:
+ * gst-libs/gst/tag/gstid3demux.h:
+ * gst-libs/gst/tag/id3v2.c:
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/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-03-12 13:28:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/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-06 18:16:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Do not convert obsolete TDA/TDAT frames to TDRC frames, otherwise the four-digit number will be interp...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.c: (id3demux_id3v2_frames_to_tag_list):
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/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.
+
+2006-11-19 13:41:53 +0000 René Stadler <mail@renestadler.de>
+
+ tag: id3v2: Make sure that g_free always gets called on the same pointer that was returned by g_mallo...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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 <mail@renestadler.de>
+
+2006-11-01 13:59:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: We require a -base more recent than 0.10.9, so it's safe to use
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-10-05 16:37:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/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-08-22 13:53:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: If strings in text fields are marked ISO8859-1, but contain valid UTF-8 already, then han...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-16 13:01:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-libs/gst/tag/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-07-25 16:47:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Extract frames for ID3v2 versions prior to ID3v2.3.0 properly as well, and add the version to...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.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-23 11:33:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/gstid3demux.c: (plugin_init):
+ * gst-libs/gst/tag/id3v2.c:
+ (id3demux_add_id3v2_frame_blob_to_taglist):
+ * gst-libs/gst/tag/id3v2.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 <tim@centricular.net>
+
+ tag: id3v2: 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-libs/gst/tag/id3v2.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 <wim.taymans@gmail.com>
+
+ tag: id3v2: Don't use \n in debug lines
+ Original commit message from CVS:
+ * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream),
+ (gst_avi_demux_process_next_entry):
+ Fix some leaks.
+ * gst-libs/gst/tag/id3v2.c: (id3demux_id3v2_frames_to_tag_list):
+ Don't use \n in debug lines.
+
+2006-06-22 12:17:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Set image type from APIC frame as "image-type" field of GST_TAG_IMAGE buffer caps (#344605).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2frames.c: (parse_picture_frame):
+ Set image type from APIC frame as "image-type" field
+ of GST_TAG_IMAGE buffer caps (#344605).
+
+2006-06-11 19:31:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Extract images from ID3v2 tags (APIC frames). Fixes #339704.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-05-28 10:05:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: A track/volume number or count of 0 does not make sense, just ignore it along with negati...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-19 14:05:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Don't output any tag when we encounter a negative track number - the tag type is uint, so...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-16 14:07:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Rework string parsing to always walk over BOM markers in UTF16 strings, using the endianness indicated by the innermost one ...
+ 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-libs/gst/tag/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-12 08:21:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Some more debug info. No need to check whether the string returned by g_convert() is real...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-10 13:51:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Fix parsing of numeric genre strings some more, by ensuring that we only try and parse st...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-04-28 11:37:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: Recognise and skip any byte order marker (BOM) in
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2frames.c: (has_utf16_bom),
+ (parse_split_strings):
+ Recognise and skip any byte order marker (BOM) in
+ UTF-16 strings.
+
+2006-04-17 10:01:51 +0000 Alex Lancaster <alexlan@fedoraproject.org>
+
+ tag: id3v2: Recognise TCO (Genre) tags in ID3v2.2
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.c:
+ Recognise TCO (Genre) tags in ID3v2.2. Patch by Alex Lancaster
+ (Fixes #338713)
+
+2006-03-30 23:37:16 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ tag: id3v2: 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-22 13:00:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: 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-libs/gst/tag/gstid3demux.c: (gst_id3demux_chain):
+ Don't attempt typefinding on too-short buffers that have been
+ completely trimmed away.
+ * gst-libs/gst/tag/id3v2.c: (id3demux_read_id3v2_tag):
+ Improve the debug output
+
+2006-03-16 16:06:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tag: id3v2: We only care about gain and peak data for the master volume.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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 <tim@centricular.net>
+
+ tag: id3v2: Read replay gain tags
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-14 17:56:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-libs/gst/tag/gstid3demux.c: (plugin_init):
+ * gst-libs/gst/tag/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-02-18 20:48:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Handle 0 data size in otherwise valid frames.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.c: (id3demux_id3v2_frames_to_tag_list):
+ * gst-libs/gst/tag/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-16 10:58:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: 3 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-libs/gst/tag/id3v2.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-13 12:00:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Add more validation to ensure that a char encoding conversion produced a valid UTF-8 string.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-04 13:30:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Adjust for data length indicators when parsing (Fixes #329810)
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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 13:06:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Never output a tag with a null contents string.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-01-30 23:13:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Someone should kick my butt. Remove ID3v1 tags from the end of the file.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3demux.c: (gst_id3demux_chain),
+ (gst_id3demux_read_id3v1), (gst_id3demux_sink_activate),
+ (gst_id3demux_send_tag_event):
+ * gst-libs/gst/tag/id3v2.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-25 18:23:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Never trust ANY information encoded in a media file, especially when it's giving you size...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/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-23 14:32:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Remove errant break statement, and fix compilation with older GCC.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2frames.c: (id3v2_tag_to_taglist):
+ Remove errant break statement, and fix compilation with
+ older GCC.
+
+2006-01-23 09:22:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: Rewrite parsing of text tags to handle multiple NULL terminated strings. Parse numeric genre strings a...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.c: (id3demux_read_id3v2_tag):
+ * gst-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/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-15 20:21:48 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ tag: id3v2: Fix compilation of id3demux when zlib is not present.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2frames.c: (id3demux_id3v2_parse_frame):
+ Fix compilation of id3demux when zlib is not present.
+ (Fixes #326602; patch by: Sergey Scobich)
+
+2006-01-06 11:46:53 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tag: id3v2: Add gst_element_no_more_pads() for proper decodebin behaviour.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3demux.c: (gst_id3demux_add_srcpad):
+ Add gst_element_no_more_pads() for proper decodebin behaviour.
+ * gst-libs/gst/tag/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.
+
+2005-12-28 18:55:32 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: If a broken tag has 0 bytes payload, at least still skip the 10 byte header
+ Original commit message from CVS:
+ * gst-libs/gst/tag/id3v2.c: (id3demux_read_id3v2_tag):
+ If a broken tag has 0 bytes payload, at least still skip
+ the 10 byte header
+
+2005-12-18 15:14:44 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tag: id3v2: all new LGPL id3 demuxer, can use zlib for compressed frames
+ Original commit message from CVS:
+ * configure.ac:
+ Check for optional dependency on zlib for id3demux
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/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-libs/gst/tag/gstid3demux.h:
+ * gst-libs/gst/tag/id3v2.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-libs/gst/tag/id3v2.h:
+ * gst-libs/gst/tag/id3v2.4.0-frames.txt:
+ * gst-libs/gst/tag/id3v2.4.0-structure.txt:
+ * gst-libs/gst/tag/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
+
+2011-08-11 18:50:08 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: fix quality setting being ignored by the resampler state
+ https://bugzilla.gnome.org/show_bug.cgi?id=636562
+
+2011-08-11 15:54:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * configure.ac:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/resample_sse.h:
+ * gst/audioresample/speex_resampler_double.c:
+ * gst/audioresample/speex_resampler_float.c:
+ audioresample: use SSE/SSE2 when possible
+ Compile in the code on i386 and x86_64, and use ORC to determine
+ when the runtime platform can run the code.
+ https://bugzilla.gnome.org/show_bug.cgi?id=636562
+
+2011-08-11 19:23:42 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/audioresample/resample_sse.h:
+ audioresample: fix SSE2 building with double precision
+ The full double implementation was missing.
+ https://bugzilla.gnome.org/show_bug.cgi?id=636562
+
+2011-08-11 12:12:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Check for utf8 before trying to convert
+ If the string is already on utf8, there is no need to
+ try to convert it, because it is useless and it might garble
+ the string.
+
+2011-08-10 13:16:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: tag: exif: Add tests for 'non-trivial' chars
+ Adds two new cases to check that characters are properly
+ converted to ascii when writen to exif and parsed correctly
+ back to utf8 when read.
+
+2011-08-09 16:02:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Exif strings should be ascii
+ Use g_convert to turn all strings into extended ascii before writing
+ to the exif buffer and converting back from ascii to utf8 when
+ reading them.
+
+2011-08-10 15:57:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgsttag.def:
+ win32: update libgsttag.def for new API
+
+2011-08-10 15:21:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ tag: don't build helper programs that generate/update data by default
+ No point building these by default. Also, these generated files
+ should go into the srcdir, not the builddir in this case, since
+ they're version controlled.
+
+2011-08-10 15:20:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/mklicensestables.c:
+ tag: fix stray printf in mklicensestables
+ Don't dump debug output to stdout.
+
+2011-08-10 15:06:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/licenses.c:
+ tag: fix compilation of new licenses code with GLib versions < 2.28
+ Add local g_variant_lookup_value() fallback for now when compiling
+ against older GLib versions.
+
+2011-08-10 14:57:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/licenses.c:
+ * gst-libs/gst/tag/tag.h:
+ tag: add GType for GstTagLicenseFlags
+ API: gst_tag_license_flags_get_type()
+
+2011-08-09 16:41:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmptag: fix compiler warning in release mode
+ Fix compiler warning caused by g_assert_not_reached() being skipped
+ because releases are compiled with -DG_DISABLE_ASSERT.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656264
+
+2011-08-10 10:49:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: fix runtime warnings when doing position query
+ Add missing 'break'.
+
+2011-07-15 13:19:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/tag.c:
+ * tests/files/Makefile.am:
+ * tests/files/license-uris:
+ tag: add unit test for new license API
+ https://bugzilla.gnome.org/show_bug.cgi?id=646868
+
+2011-07-15 13:14:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/mklicensestables.c:
+ tag: add mklicensestables utility
+ Add (uninstalled) tool to create licenses-table.dat from liblicense's
+ RDF files. It's not very pretty and makes loats of assumptions about
+ the input, but should work. If things change, we can fix it then.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646868
+
+2011-07-15 13:07:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/license-translations.dict:
+ * gst-libs/gst/tag/licenses-tables.dat:
+ * gst-libs/gst/tag/licenses.c:
+ * gst-libs/gst/tag/tag.h:
+ tag: add convenience API to handle creative commons licenses
+ Based on liblicense's RDF files.
+ API: GstTagLicenseFlags
+ API: gst_tag_get_licenses()
+ API: gst_tag_get_license_flags()
+ API: gst_tag_get_license_nick()
+ API: gst_tag_get_license_title()
+ API: gst_tag_get_license_version()
+ API: gst_tag_get_license_description()
+ API: gst_tag_get_license_jurisdiction()
+ https://bugzilla.gnome.org/show_bug.cgi?id=646868
+
+2011-08-08 10:00:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: bump probability if all frames we found are similar
+ Similar meaning same layer, same bitrate, and same number of channels
+ This fixes misdetection of (some MP3 files that have zero padding
+ between the ID3 tag and the MP3 stream) as H.264 video.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656018
+
+2011-08-09 16:39:31 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst-libs/gst/riff/riff-read.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/gstvideofilter.c:
+ * gst-libs/gst/video/video.h:
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcp.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/videoscale/gstvideoscale.c:
+ * tests/icles/stress-videooverlay.c:
+ Fix debug statements
+ Fixes build on MacOSX
+ Signed-off-by: Edward Hervey <edward.hervey@collabora.co.uk>
+
+2011-08-08 14:41:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/videooverlay.c:
+ * gst-libs/gst/interfaces/videooverlay.h:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/stress-videooverlay.c:
+ videooverlay: add convenience API to check if a message is a prepare-window-handle message
+ API: gst_is_video_overlay_prepare_window_handle_message()
+
+2011-08-08 14:16:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/Makefile.am:
+ * tests/icles/Makefile.am:
+ tests: fix libs order in some makefiles
+ Local libs should come first.
+
+2011-08-08 13:55:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/gstlibscpp.cc:
+ * tests/check/libs/libsabi.c:
+ * tests/examples/overlay/.gitignore:
+ * tests/examples/overlay/Makefile.am:
+ * tests/examples/overlay/gtk-videooverlay.c:
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/examples/overlay/qt-videooverlay.cpp:
+ * tests/examples/overlay/qt-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-videooverlay.cpp:
+ * tests/examples/overlay/qtgv-videooverlay.h:
+ * tests/examples/overlay/qtgv-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-xoverlay.h:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/stress-videooverlay.c:
+ * tests/icles/stress-xoverlay.c:
+ * tests/icles/test-colorkey.c:
+ * tests/icles/test-videooverlay.c:
+ * tests/icles/test-xoverlay.c:
+ tests: update for GstXOverlay => GstVideoOverlay
+
+2011-08-08 10:44:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ ximagesink, xvimagesink: update for GstXOverlay -> GstVideoOverlay
+
+2011-08-07 16:55:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * android/interfaces.mk:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/videooverlay.c:
+ * gst-libs/gst/interfaces/videooverlay.h:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ * gst-plugins-base.spec.in:
+ interfaces: rename GstXOverlay interface to GstVideoOverlay
+ And remove deprecated methods, and fix up some cruft.
+
+2011-08-07 18:36:04 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * gst-plugins-base.spec.in:
+ gst-plugins-base.spec.in: update for 0.11
+
+2011-08-05 16:53:47 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ gstvorbistag: map ENCODER Vorbis comment to application-name
+ What GStreamer calls encoder ("encoder used to encode this stream") is
+ stored in the vendor string in Vorbis/Theora/Kate and possibly others.
+ The Vorbis comment packet used in those streams uses ENCODER as the name
+ of the encoding program, which GStreamer calls application-name.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656034
+
+2011-08-05 11:32:09 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: fix sample depth typo
+ https://bugzilla.gnome.org/show_bug.cgi?id=656022
+
+2011-08-05 13:05:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ volume: Update disted ORC files
+
+2011-08-05 12:48:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagepool.c:
+ xvimagepool: cleanups
+
+2011-08-04 18:08:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: call parent alloc function
+ Call the parent alloc function to allocate buffers.
+
+2011-08-04 15:18:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: remove useless alignment
+
+2011-08-04 15:18:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: improve debug
+
+2011-08-03 14:14:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Set queues to silent=true
+ As encodebin doesn't connect to the queue signals, it can set
+ queues to silent mode to make queue not emit them.
+ Check https://bugzilla.gnome.org/show_bug.cgi?id=621299 for
+ more info on queue's silent property.
+
+2011-08-03 13:40:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Fix typo on installing properties
+ queue buffers and bytes properties have ids swapped, fix it.
+
+2011-08-03 12:08:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/multichannel-enumtypes.c:
+ * win32/common/multichannel-enumtypes.h:
+ back to development
+
+=== release 0.11.0 ===
+
+2011-08-03 10:55:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * gst-plugins-base.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/eo.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/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:
+ * win32/common/_stdint.h:
+ * win32/common/audio-enumtypes.c:
+ * win32/common/config.h:
+ * win32/common/video-enumtypes.c:
+ * win32/common/video-enumtypes.h:
+ Release 0.11.0
+
+2011-08-03 10:18:29 +0200 Jonathan Liu <net147@gmail.com>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: Fix crashes with 0-byte vorbis packets
+ Fixes bug #655574.
+
+2011-07-28 14:43:53 +0200 Jens Georg <jensg@openismus.com>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ pbutils: Add SP levels 4a, 5 and 6
+ https://bugzilla.gnome.org/show_bug.cgi?id=655503
+
+2011-07-26 16:10:17 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: segfault on 0-byte ogg_packet in _chain_reverse
+
+2011-08-02 12:53:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * 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/eo.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/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:
+ update po
+
+2011-08-02 12:24:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ update ORC dist files
+
+2011-08-02 12:24:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videoconvert/gstvideoconvertorc-dist.c:
+ * gst/videoconvert/gstvideoconvertorc-dist.h:
+ videoconvert: update ORC dist files
+
+2011-08-02 12:22:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ def: add new symbols
+
+2011-08-01 19:04:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagepool.h:
+ * sys/ximage/ximagesink.c:
+ ximage: add support for alignment bufferpool option
+
+2011-08-01 18:36:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagepool.h:
+ * sys/xvimage/xvimagesink.c:
+ xv: apply cropping on padded images
+ Store the dimensions of the unpadded image in the metadata and use that info to
+ display the valid region of the image.
+
+2011-08-01 17:10:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagepool.h:
+ xvimage: add suport for video alignment
+ Add support for the VideoAlignment option in the bufferpool. The extra
+ configuration options can be used to request special padding and alignment
+ requirements for the video buffers.
+
+2011-08-01 16:50:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: ensure sign in scale function
+
+2011-08-01 16:48:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/gstvideopool.c:
+ * gst-libs/gst/video/gstvideopool.h:
+ videopool: add implementation
+ Rename very long structure name to GstVideoAlignment
+ Add the implementation of the video alignment config setter and getters.
+
+2011-07-29 17:15:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ base: update for new bufferpool API
+
+2011-07-29 17:14:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstvideopool.h:
+ videopool: add stuff related to bufferpools
+ Add bufferpool options and extra config parameters.
+
+2011-07-29 12:22:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: relax bufferpool checks
+ Check if the metadata belongs to us instead of checking the current bufferpool.
+ The bufferpool can change at any time when upstream wants to renegotiate.
+
+2011-07-27 16:55:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add macro to access flags
+
+2011-07-29 10:23:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * win32/common/libgsttag.def:
+ Add new GstTagMux base class
+ Hook up new tag muxing base class to build system.
+ https://bugzilla.gnome.org/show_bug.cgi?id=555437
+ API: GstTagMux
+
+2011-07-29 10:22:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/gsttagmux.h:
+ docs: add documentation for GstTagMux
+
+2011-07-28 20:38:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ tagmux: require subclass to install sink pad template
+ Require the subclass to install both source and sink pad
+ templates. Also, print some warnings if the subclass doesn't
+ do that.
+ https://bugzilla.gnome.org/show_bug.cgi?id=555437
+
+2011-07-15 20:57:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagmux.h:
+ tagmux: const-ify GstTagList argument of render vfuncs
+
+2011-07-15 20:39:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/gsttagmux.h:
+ tagmux: fix up private base class header so it can be made public
+ Move private bits into a private struct, add some padding.
+ https://bugzilla.gnome.org/show_bug.cgi?id=555437
+
+2011-07-28 23:31:03 +0100 Michael Smith <msmith@songbirdnest.com>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/gsttagmux.h:
+ tagmux: add support for end tags
+ Originally "id3tag: Add new id3 tagging plugin, supports v1, v2.3,
+ and v2.4." from gst-plugins-bad. This is an artificial bridge commit.
+
+2010-06-06 18:00:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ ext: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs
+
+2007-11-20 11:41:13 +0000 Julien Moutte <julien@moutte.net>
+
+ Fix build on Mac OS X 10.5
+ Original commit message from CVS:
+ 2007-11-20 Julien MOUTTE <julien@moutte.net>
+ * gst-libs/gst/tag/gsttagmux.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-09-13 15:04:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Update my mail address.
+ Original commit message from CVS:
+ * ext/taglib/gstapev2mux.cc:
+ * ext/taglib/gstapev2mux.h:
+ * gst-libs/gst/tag/gsttagmux.c:
+ * tests/check/elements/apev2mux.c:
+ Update my mail address.
+
+2006-05-30 14:35:18 +0000 Sebastian Dröge <mail@slomosnail.de>
+
+ Add apev2mux element (#343122).
+ Original commit message from CVS:
+ Patch by: Sebastian Dröge <mail at slomosnail de >
+ * 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:
+ * gst-libs/gst/tag/gsttagmux.c: (plugin_init):
+ * gst-libs/gst/tag/gsttagmux.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-18 12:46:08 +0000 James Doc Livingston <doclivingston@gmail.com>
+
+ gst-libs/gst/tag/gsttagmux.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 <doclivingston gmail com>
+ * gst-libs/gst/tag/gsttagmux.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-01 11:46:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ 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:
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/gsttagmux.h:
+ move taglib-based id3v2muxer to -good. Fixes #336110.
+
+2006-04-30 16:16:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ small cleanups
+ Original commit message from CVS:
+ small cleanups
+
+2006-04-29 18:46:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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 <tim@centricular.net>
+
+ 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-28 15:33:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ * gst-libs/gst/tag/gsttagmux.h:
+ pedantic cleanups
+ Original commit message from CVS:
+ pedantic cleanups
+
+2006-04-01 16:50:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-libs/gst/tag/gsttagmux.c:
+ add taglib checks and docs
+ Original commit message from CVS:
+ add taglib checks and docs
+
+2006-03-26 19:56:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-25 21:57:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-20 08:59:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-13 17:22:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-12 15:02:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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-11 10:58:08 +0000 Alex Lancaster <alexlan@fedoraproject.org>
+
+ ext/taglib/gsttaglib.cc: and add support for TCOP (copyright)
+ Original commit message from CVS:
+ 2006-03-11 Christophe Fergeau <teuf@gnome.org>
+ Patch by: Alex Lancaster
+ * ext/taglib/gsttaglib.cc: fix writing of TPOS tags (album number),
+ and add support for TCOP (copyright)
+
+2006-03-09 17:44:17 +0000 Christophe Fergeau <teuf@gnome.org>
+
+ new id3v2 muxer based on TagLib
+ Original commit message from CVS:
+ 2006-03-09 Christophe Fergeau <teuf@gnome.org>
+ reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/taglib/Makefile.am:
+ * ext/taglib/gsttaglib.cc:
+ * ext/taglib/gsttaglib.h: new id3v2 muxer based on TagLib
+
+2011-07-28 15:28:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videotestsrc/Makefile.am:
+ videotestsrc: use local libgstvideo here as well
+
+2011-07-28 11:21:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: rename flags names
+ Rename flags names from native-audio/-video to
+ no-audio/video-conversion to be more explicit on what it does
+
+2011-07-28 14:18:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videoconvert/Makefile.am:
+ videoconvert: link to local libgstvideo-0.11
+
+2011-07-28 13:39:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ * tests/check/libs/video.c:
+ video: make GST_VIDEO_FORMATS_ALL define more readable
+ We don't need all those quotes, strings will be parsed as strings
+ regardless, and g-i doesn't seem to like all those escaped quotes.
+
+2011-07-20 18:10:57 +0200 Stefan Sauer <ensonic@google.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: fix latency calculation for live elements
+ Max_latency was computed on already adjusted min_latency. Introduce a new
+ variable for clarity. Spotted by Blaise Gassend.
+ Fixes #644284
+
+2011-07-28 11:44:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: fix max latency calculation
+ ... to allow infinite max, as also claimed by comment.
+
+2011-06-01 10:21:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: drop samples that are too late
+ ... rather than having all of them rendered at 0 or subsequently aligned,
+ likely inevitably leading to repeated resyncing.
+
+2011-07-27 01:18:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/gio.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ * tests/examples/snapshot/snapshot.c:
+ * tests/icles/playback/test3.c:
+ * tests/icles/playback/test7.c:
+ * tests/icles/playbin-text.c:
+ * tests/icles/position-formats.c:
+ tests: update for query API changes
+
+2011-07-27 01:16:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst/adder/gstadder.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gsturidecodebin.c:
+ ext,gst: update for query API changes
+
+2011-07-27 01:16:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ gst-libs: update for query API changes
+
+2011-07-26 13:51:31 +0200 Stefan Sauer <ensonic@google.com>
+
+ * tests/check/pipelines/basetime.c:
+ basetime: fix failing test
+ Always use audiotestsrc as it seems to have been the intention according to the
+ comment header. The test does not work with live-audiosources.
+
+2011-07-26 14:10:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: let old pool drain
+ Let the old pool drain without deactivating it, some elements might still be
+ using it.
+
+2011-07-26 13:17:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: use new setup_allocation vmethod
+
+2011-07-26 12:47:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ giosink: use new query vmethod
+
+2011-07-26 12:42:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: chain up to parent_class correctly
+
+2011-07-25 19:51:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/playbin2-compressed.c:
+ tests: rename the test suite to match the binary
+ This unbreaks determining the name for make elements/playbin2-compressed.check
+ from the test output.
+
+2011-07-25 19:39:55 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: rework pending event handling
+ Use atomic ops on pending flags. Rename the segment_pending to
+ new_segment_pending. Set new_segment_pending not when we received seek, but
+ when we received the first upstream new_segment.
+
+2011-07-25 19:11:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: more debug logging for events
+
+2011-07-26 12:37:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: use new basesink query vmethod
+
+2011-07-26 12:33:56 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Allow all EOS to go through if we don't have a next group
+ Only drop them if the current group isn't drained .. AND there is a
+ next group to switch to.
+ Should Fix #655268
+
+2011-07-25 18:37:15 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Avoid resetting playsink when not needed
+ When we don't have specific {audio|video|text}-sink properties, don't
+ set them on playsink when reconfiguring.
+ If we do that, we end up setting the previous configured sink to
+ GST_STATE_NULL resulting in any potentially pending push being returned
+ with GST_FLOW_WRONG_STATE which will cause the upstream elements to
+ silently stop.
+ https://bugzilla.gnome.org/show_bug.cgi?id=655279
+
+2011-07-25 18:35:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add pack and unpack functions
+ Add pack and unpack function to handle complex formats in the future.
+
+2011-07-25 18:08:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: add more info in the format structure
+ Add a field to describe how many bits are used to pack items.
+ Specify the shift for each component.
+ Add some more flags to better describe the format.
+
+2011-07-25 12:04:02 +0200 Stefan Sauer <ensonic@google.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: improve the example
+ Mentioned that this is not ment to be used with subtitles and suggest alternatives.
+
+2011-07-25 10:41:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Properly handle multi-stream chains
+ When we have a multi-stream (i.e. audio and video) input and the demuxer
+ adds/removes pads for a new stream (common in a mpeg-ts stream when the
+ program stream mapping is updated), the algorithm for EOS handling was
+ previously wrong (it would only drop the EOS of the *last* pad but would
+ let the EOS on the other pads go through).
+ The logic has only been changed a tiny bit for EOS handling resulting in:
+ * If there is no next group, let the EOS go through
+ * If there is a next group, but not all pads are drained in the active
+ group, drop the EOS event
+ * If there is a next group and all pads are drained, then the ghostpads
+ will be removed and the EOS event will be dropped automatically.
+
+2011-07-23 14:21:27 +0200 Stefan Sauer <ensonic@google.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: add example for feeding from stdin
+
+2011-07-23 13:46:31 +0200 Stefan Sauer <ensonic@google.com>
+
+ * tests/check/pipelines/basetime.c:
+ test: print actual timestamp on failure
+
+2011-07-20 13:46:31 +0200 Stefan Sauer <ensonic@google.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: keep untimestamped textbuffer until next one
+ Instead of discarding untimestamped text-buffers immeditely after rendering,
+ keep them until we receive the next text buffer.
+ Fixes #654959
+
+2011-07-22 21:19:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: fix for event handler change
+
+2011-07-19 18:31:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ the
+
+2011-07-19 18:21:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: make sure our buffer is big enough
+ Make sure we allocate a buffer that is big enough.
+
+2011-07-18 18:46:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ x11: call parent set_config
+ Call the parent set_config method to make it aware of the current config so that
+ its default methods can do preallocation.
+
+2011-07-18 16:48:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: improve allocation parameters
+ Set the min-buffers to 2 because our base class will hold on to 1 buffer for the
+ last-buffer property.
+
+2011-07-15 16:46:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/decodebin2.c:
+ tests: add decodebin2 test for parser autoplugging
+ Make sure decodebin2 doesn't try to plug the same parser twice
+ in a row.
+
+2011-07-06 19:40:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/decodebin.c:
+ * tests/files/Makefile.am:
+ * tests/files/test.mp3:
+ tests: add decodebin1 test for parser autoplugging
+ Make sure decodebin1 doesn't try to plug the same parser twice
+ in a row (so we can change all parsers to accept parsed input as
+ well without breaking applications still using the old decodebin1
+ element).
+
+2011-07-07 15:02:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin.c:
+ decodebin: don't plug the same parser multiple times in a row
+ This allows us to make parsers accept both parsed and unparsed input
+ without decodebin plugging them in a loop until things blow up, ie.
+ without affecting applications that still use the old playbin or the
+ old decodebin.
+ (Making parsers accept parsed input is useful for later when we want
+ to use parsers to convert the stream-format into something the decoder
+ can handle. It's also much more convenient for application authors
+ who can plug parsers unconditionally in transcoding pipelines, for
+ example).
+
+2011-07-15 16:34:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ X11: also check the bufferpool
+ Don't just check the availability of the metadata but also if the buffer is
+ really from our bufferpool.
+
+2011-07-15 12:32:25 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: decodebin2 is dead, long live decodebin
+
+2011-07-14 13:56:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * win32/common/libgstpbutils.def:
+ docs: add Since marker to gtk-doc chunk for new codec utils API
+ And add new API to .def file.
+ API: gst_codec_utils_h264_get_level_idc()
+
+2011-03-07 17:55:48 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * gst-libs/gst/pbutils/codec-utils.h:
+ codec-utils: Add method to convert H.264 text level in a level_idc
+
+2011-07-11 18:21:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ metavideo: fix for API change
+
+2011-07-10 21:47:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: init video info to some sensible defaults
+
+2011-07-10 13:49:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-07-10 13:39:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add macros for par and fps
+
+2011-07-09 18:33:38 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: check for EOS on both current and best pad
+ Oops, need both. Fixes #654270.
+
+2011-07-09 18:24:26 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: check for EOS on current pad, not best
+ Fixes #654270.
+
+2011-07-09 11:59:42 +0200 Piotr Fusik <fox@scene.pl>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: fixed detection of audio/x-sap
+ Fixes: #654295.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2011-07-06 17:03:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ rtcpbuffer: provide a WRITE map with maximum available size
+ ... which allows adding additional packets and may be needed to counteract
+ the shrink that implicitly occurred during a map/unmap cycle when adding
+ a previous packet.
+
+2011-07-08 20:02:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gdp/gstgdppay.c:
+ gdppay: parse caps event and payload caps
+ Which makes it actually output stuff.
+
+2011-07-07 23:57:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/adder.c:
+ * tests/check/libs/video.c:
+ tests: make adder test and libgstvideo test compile, disable some tests
+ Don't fully work yet though
+
+2011-07-07 21:24:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Android.mk:
+ * android/ffmpegcolorspace.mk:
+ * android/videoconvert.mk:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstclockoverlay.c:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-plugins-base.spec.in:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/encoding/gstencodebin.c:
+ * sys/ximage/ximagesink.c:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/videoscale.c:
+ * tests/check/pipelines/oggmux.c:
+ * tests/examples/dynamic/addstream.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/snapshot/snapshot.c:
+ * tests/icles/output-selector-test.c:
+ * tests/icles/playback/test.c:
+ * tests/icles/test-box.c:
+ * tests/icles/test-scale.c:
+ * tests/icles/test-textoverlay.c:
+ * tools/gst-launch-ext.1.in:
+ * tools/gst-visualise-m.m:
+ * win32/MANIFEST:
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstffmpegcolorspace.dsp:
+ * win32/vs6/libgsttag.dsp:
+ * win32/vs7/gst-plugins-base.sln:
+ * win32/vs7/libgstffmpegcolorspace.vcproj:
+ * win32/vs8/gst-plugins-base.sln:
+ * win32/vs8/libgstffmpegcolorspace.vcproj:
+ ffmpegcolorspace -> videoconvert
+
+2011-07-07 21:04:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/old/Makefile.am:
+ * tests/old/examples/Makefile.am:
+ * tests/old/examples/capsfilter/Makefile.am:
+ * tests/old/examples/capsfilter/capsfilter1.c:
+ * tests/old/examples/gob/Makefile.am:
+ * tests/old/examples/gob/gst-identity2.gob:
+ * tests/old/examples/indexing/.gitignore:
+ * tests/old/examples/indexing/Makefile.am:
+ * tests/old/examples/indexing/indexmpeg.c:
+ * tests/old/examples/seek/.gitignore:
+ * tests/old/examples/seek/Makefile.am:
+ * tests/old/examples/seek/cdparanoia.c:
+ * tests/old/examples/seek/cdplayer.c:
+ * tests/old/examples/seek/chained.c:
+ * tests/old/examples/stats/Makefile.am:
+ * tests/old/examples/stats/mp2ogg.c:
+ * tests/old/examples/switch/.gitignore:
+ * tests/old/examples/switch/Makefile.am:
+ * tests/old/examples/switch/switcher.c:
+ * tests/old/testsuite/alsa/.gitignore:
+ * tests/old/testsuite/alsa/Makefile.am:
+ * tests/old/testsuite/alsa/formats.c:
+ * tests/old/testsuite/alsa/sinesrc.c:
+ * tests/old/testsuite/alsa/sinesrc.h:
+ * tests/old/testsuite/alsa/srcstate.c:
+ * tests/old/testsuite/alsa/state.c:
+ * tests/old/testsuite/embed/Makefile.am:
+ * tests/old/testsuite/embed/embed.c:
+ * tests/old/testsuite/gst-lint:
+ tests: remove tests from ancient times
+ They're just noise.
+
+2011-07-07 11:10:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/tag/gstxmptag.c
+ gst/encoding/gststreamsplitter.c
+
+2011-07-07 10:28:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ audioconvert: update orc dist files
+
+2011-07-07 10:20:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ * gst/audioconvert/plugin.c:
+ audioconvert: don't use .init function
+ Don't use the .init function but compile all functions when needed instead of
+ when the plugin is registered.
+
+2011-07-06 12:54:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/netbuffer.c:
+ * tests/check/libs/tag.c:
+ tests: update netbuffer and tag tests for gst_buffer_take_memory() API change
+
+2011-07-06 12:51:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/pbutils.c:
+ tests: update libs/pbutils test for GstMessage API changes
+ Can't access msg->structure directly any more.
+
+2011-07-06 12:47:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/mixer.c:
+ tests: fix libs/mixer test for GstImplementsInterface removal
+ Not sure if we want to keep the GstMixer API in its current form
+ though..
+
+2011-07-06 12:42:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/theoraenc.c:
+ tests: update theoraenc test for new pad probe API
+ Compiles now, but fails.
+
+2011-07-06 12:38:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/typefindfunctions.c:
+ tests: update typefindfunctions test for latest API changes
+
+2011-07-06 12:36:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/audio.c:
+ tests: update libs/audio test for latest API changes
+
+2011-07-06 10:27:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: update exports for new libgstvideo API
+
+2011-07-06 10:27:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/Makefile.am:
+ docs: add -DGST_USE_UNSTABLE_API also to GTKDOC_CFLAGS
+ To avoid warnings
+
+2011-07-05 16:58:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: update docs
+
+2011-07-05 10:07:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ Add -DGST_USE_UNSTABLE_API to the compiler flags to avoid warnings
+
+2011-07-05 10:04:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: remove some unused code that caused a compiler warning
+ The video format is set up in the sink pad's setcaps() function.
+
+2011-07-04 18:08:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add macro to get frame size
+
+2011-07-04 16:27:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: add some more macros
+ Add macros to get the plane and offset of a component.
+
+2011-07-04 10:19:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoconvert/gstvideoconvert.h:
+ * gst/videoconvert/videoconvert.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/videotestsrc.c:
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ video: More video helper library improvements
+ Make a new GstVideoFormatinfo structure that contains the specific information
+ related to a format such as the number of planes, components, subsampling,
+ pixel stride etc. The result is that we are now able to introduce the concept of
+ components again in the API.
+ Use tables to specify the formats and its properties.
+ Use macros to get information about the video format description.
+ Move code to set strides, offsets and size into one function.
+ Remove methods that are not handled with the structures.
+ Add methods to retrieve pointers and strides to the components in the video.
+
+2011-06-30 20:33:36 +0200 Luis de Bethencourt <luis@debethencourt.com>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: fix compiler warning
+ cspace and cspace2 may run uninitialized.
+
+2011-06-29 13:12:49 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Add flags to disable conversion elements
+ Add a flags property and two flags to allow one to disable the
+ conversion elements within encodebin. Doing so insists that the
+ uncompressed input to encodebin for the appropriate stream type is
+ sufficient to meet the caps requirements of the encoders, muxers and
+ encodebin target.
+ This is mostly beneficial to bypass slow caps negotiations in the
+ conversion elements.
+
+2011-06-29 09:59:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Remove extra chars from end of xmp packet
+ Windows picture viewer is unhappy with extra trailing chars at the
+ end of the xmppacket footer. So remove them as they aren't needed.
+
+2011-06-29 11:30:51 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/encoding/gststreamsplitter.c:
+ streamsplitter: Fix getcaps src pad caps merge
+ Caps returned from gst_pad_peer_get_caps_reffed () may not be writable.
+ If they are not is should cause an assertion in gst_caps_merge (),
+ however, sometimes assertions are disabled in binary builds of -base and
+ it's safer to just be sure the caps are writable. Also, check that the
+ reffed caps pointer is not NULL.
+
+2011-06-28 19:03:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: only unset initialized GValue
+
+2011-06-15 13:51:31 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: NULL check in degas_type_find
+ The length check isn't sufficient, an source might
+ report the correct length, but then still fail to
+ read the requested number of bytes for some reason.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652642
+
+2011-06-26 23:17:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videoconvert/gstvideoconvert.c:
+ videoconvert: fix unused-but-set-variable compiler warning
+
+2011-06-26 23:16:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ * gst/volume/gstvolume.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ gst, sys: remove GstImplementsInterface usage
+
+2011-06-26 22:58:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/alsa/gstalsamixer.h:
+ * ext/alsa/gstalsamixerelement.c:
+ * ext/alsa/gstalsasrc.c:
+ alsa: don't use GstImplementsInterface
+
+2011-06-26 21:46:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/interfaces/tuner.c:
+ * gst-libs/gst/interfaces/tuner.h:
+ * gst-libs/gst/interfaces/videoorientation.c:
+ * gst-libs/gst/interfaces/videoorientation.h:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ gst-libs: remove GstImplementsInterface usage
+ Will need to add replacement API for some of these.
+
+2011-06-26 21:27:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Merge remote-tracking branch 'origin/master' into 0.11
+
+2011-06-26 01:06:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/design-decodebin.txt:
+ docs: minor addition to decodebin2 design doc
+
+2011-06-26 01:06:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/navigation.c:
+ tests: the navigation interface isn't GstImplementsInterface-wrapped
+
+2011-06-26 00:49:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/streamvolume.h:
+ interfaces: GstStreamVolume isn't wrapped by GstImplementsInterface
+ This interface depends on properties and isn't per-instance.
+
+2011-06-26 00:40:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspextension.h:
+ rtsp: GstRTSPExtension isn't wrapped by GstImplementsInterface
+ Fix copy'n'paste error in headers, GstRTSPExtension isn't
+ something that's per-instance.
+
+2011-06-26 00:36:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/xmpwriter.h:
+ tag: GstXmpWriter doesn't use the GstImplementsInterface
+ No need for per-instance checking of interface implementation here,
+ presumably just a copy'n'paste issue.
+
+2011-06-11 19:03:57 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ encoding-target: set names on audio and video profiles
+ https://bugzilla.gnome.org/show_bug.cgi?id=652342
+
+2011-06-23 11:28:04 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 69b981f to 605cd9a
+
+2011-06-23 18:02:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoradec.h:
+ theoradec: use cropping metadata
+
+2011-06-23 16:31:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: let upstream know we support cropping
+
+2011-06-23 12:55:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ x11: add image cropping
+ Use the cropping metadata to crop the image.
+ Remove deprecated display-region property to set a clipping rectangle.
+
+2011-06-23 09:55:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ meta: add some docs
+
+2011-06-23 09:30:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ meta: add video crop metadata
+
+2011-06-22 19:35:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: handle unknown formats
+
+2011-06-22 16:38:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgio.c:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ fix for uri changes
+
+2011-06-22 15:38:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ x11: use frame copy functions
+
+2011-06-22 15:25:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: add video copy function
+ Add a function to copy a video frame, taking care of source and destination
+ strides.
+
+2011-06-22 12:57:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: wait for the spinbutton widget
+ Wait for the spinbutton widget before trying to update it when the volume
+ changed callback is called.
+
+2011-06-22 11:45:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: fix for allocator name change
+
+2011-06-21 18:17:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ audio: clean up headers
+
+2011-06-21 18:13:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosink.h:
+ audio: clean up audiosink headers
+
+2011-06-21 18:08:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ audio: clean up ringbuffer header
+
+2011-06-21 17:57:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ docs/plugins/inspect/plugin-gnomevfs.xml
+
+2011-06-21 17:33:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/Makefile.am:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: port to video helpers
+ Port videotestsrc to use the video helper functions to parse caps and handle
+ video frames.
+ Enable GstMetaVideo to make us handle strided video.
+
+2011-06-21 17:31:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: use gint to make parsing easier
+ Use gint for with/height etc to make it easier to pass the variables to various
+ caps and structure parsing functions.
+
+2011-06-21 12:52:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: small cleanups
+
+2011-06-20 17:49:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: activate Video meta
+ Configure the allocator with GstMetaVideo because we can handle that using the
+ GstVideoFrame helpers.
+
+2011-06-20 17:36:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: delay pool activation
+ don't activate the pool we return in the ALLOCATION query because upstream might
+ still want to configure it
+
+2011-06-20 17:34:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videoconvert/gstvideoconvert.c:
+ videoconvert: use new allocation setup
+ Add setup_allocation to configure video metadata in the negotiated bufferpool.
+
+2011-06-20 15:43:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: bump required GLib to 2.26
+
+2011-06-20 13:30:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: enable video metadata in the bufferpool
+ Enable the video metadata in the bufferpool.
+
+2011-06-20 13:28:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ x11: handle new bufferpool metadata api
+ Provide a method to list the supported metadata apis.
+ Activate the video metadata on buffers when a downstream element configured the
+ bufferpool to support that api.
+
+2011-06-20 11:25:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * gst/videoconvert/videoconvert.c:
+ * gst/videoscale/gstvideoscale.c:
+ video: remove intermediate Plane structure
+ Remove the GstVideoPlane structure and move the fields directly into the
+ GstVideoInfo structure. This makes things a little easier to read and also makes
+ it more likely that we can pass the stride array to external libraries.
+
+2011-06-18 13:32:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Bump git version after unplanned 0.10.35 release
+ Merge branch '0.10.35'
+ Conflicts:
+ configure.ac
+ docs/plugins/inspect/plugin-adder.xml
+ docs/plugins/inspect/plugin-alsa.xml
+ docs/plugins/inspect/plugin-app.xml
+ docs/plugins/inspect/plugin-audioconvert.xml
+ docs/plugins/inspect/plugin-audiorate.xml
+ docs/plugins/inspect/plugin-audioresample.xml
+ docs/plugins/inspect/plugin-audiotestsrc.xml
+ docs/plugins/inspect/plugin-cdparanoia.xml
+ docs/plugins/inspect/plugin-decodebin.xml
+ docs/plugins/inspect/plugin-encoding.xml
+ docs/plugins/inspect/plugin-ffmpegcolorspace.xml
+ docs/plugins/inspect/plugin-gdp.xml
+ docs/plugins/inspect/plugin-gio.xml
+ docs/plugins/inspect/plugin-gnomevfs.xml
+ docs/plugins/inspect/plugin-libvisual.xml
+ docs/plugins/inspect/plugin-ogg.xml
+ docs/plugins/inspect/plugin-pango.xml
+ docs/plugins/inspect/plugin-playback.xml
+ docs/plugins/inspect/plugin-subparse.xml
+ docs/plugins/inspect/plugin-tcp.xml
+ docs/plugins/inspect/plugin-theora.xml
+ docs/plugins/inspect/plugin-typefindfunctions.xml
+ docs/plugins/inspect/plugin-uridecodebin.xml
+ docs/plugins/inspect/plugin-videorate.xml
+ docs/plugins/inspect/plugin-videoscale.xml
+ docs/plugins/inspect/plugin-videotestsrc.xml
+ docs/plugins/inspect/plugin-volume.xml
+ docs/plugins/inspect/plugin-vorbis.xml
+ docs/plugins/inspect/plugin-ximagesink.xml
+ docs/plugins/inspect/plugin-xvimagesink.xml
+ gst-libs/gst/audio/Makefile.am
+ gst/subparse/gstsubparse.c
+ win32/common/_stdint.h
+ win32/common/config.h
+
+2011-06-18 11:16:19 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Allow GError* argument to be NULL
+ This is how other methods taking GError* arguments behave.
+ Fixes #652838
+
+2011-06-17 17:54:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ x11: use GstVideoInfo to parse caps
+ Use GstVideoInfo to keep track of the configured format.
+ Add GstMetaVideo to buffers, disabled by default for now until we can have it
+ enabled with a property on the bufferpool configuration.
+
+2011-06-17 17:44:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ metavideo: small fixes
+ Set the buffer as a field in the metadata so that we can use it to map the
+ buffer data.
+ Fix wrong assert.
+
+2011-06-17 17:27:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagepool.h:
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagepool.h:
+ x11: make function static
+ Don't export buffer creation function, we need to use the bufferpool
+ now.
+
+2011-06-17 16:47:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: use metadata to set up strides
+ Use the GstMetaVideo when we can to map the buffers and set up the strides.
+
+2011-06-17 15:48:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ tests/examples/Makefile.am
+
+2011-06-17 15:31:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gstbasetextoverlay.h:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraenc.h:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoconvert/gstvideoconvert.h:
+ * gst/videoconvert/videoconvert.c:
+ * gst/videoconvert/videoconvert.h:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ -base: port to GstVideoFrame API
+
+2011-06-17 15:29:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add GstVideoFrame helper structure
+ The videoframe structure can be used to easily parse the contents of video
+ buffers.
+
+2011-06-17 09:21:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/gstvideofilter.c:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoconvert/gstvideoconvert.h:
+ * gst/videoconvert/videoconvert.c:
+ video: port to new API
+ Add support for palette again.
+ Rewrite setup code for videoconvert using the new video methods.
+
+2011-06-16 19:35:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: rework part 2
+ Update docs.
+ Add method to get number of components.
+ Implement method to calculate defaults from format and dimensions.
+ Improve caps parsing.
+ Implement GstVideoInfo to caps conversion.
+
+2011-06-16 16:27:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: rework part 1
+ Add GstVideoFlags similar to the flags on the metadata. The idea is to replace
+ the metadata flags with the GstVideoFlags.
+ Move VideoPlane to video.h, it contains the information for a plane.
+ Add GstVideoInfo structure that holds the current configuration of a video
+ format.
+ Add methods to parse caps into GstVideoInfo.
+
+2011-06-16 13:41:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/ffmpegcolorspace.c:
+ * tests/check/elements/libvisual.c:
+ * tests/check/elements/playbin-compressed.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/textoverlay.c:
+ * tests/check/elements/videorate.c:
+ * tests/check/elements/videoscale.c:
+ * tests/check/elements/videotestsrc.c:
+ * tests/check/libs/pbutils.c:
+ * tests/check/libs/profile.c:
+ * tests/check/libs/video.c:
+ * tests/check/pipelines/capsfilter-renegotiation.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/check/pipelines/theoraenc.c:
+ test: port some more tests
+
+2011-06-16 12:48:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * gst/encoding/gstencodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstrawcaps.h:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ -base: port elements to new video caps
+
+2011-06-16 12:43:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: add methods to parse X11 visuals
+ Add method to convert X11 visual description to GstVideoFormat
+
+2011-06-15 16:16:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: update video caps
+
+2011-06-16 14:23:25 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * 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/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:
+ Remove deleted playbin/decodebin files from POTFILES.in
+
+=== release 0.10.35 ===
+
+2011-06-15 19:29:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Release 0.10.35
+ This is an ad-hoc release that is almost identical to 0.10.34:
+ * work around GLib atomic ops API change
+ * don't use G_CONST_RETURN in public headers
+ * subparse: typefinding fixes for subtitles in non-UTF8 charsets
+
+2011-06-15 18:08:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * gst/playback/gstplay-enum.h:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ some more ffmpegcolorspace to videoconvert changes
+
+2011-06-15 18:01:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/dsputil.c:
+ * gst/ffmpegcolorspace/dsputil.h:
+ * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.h:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ * gst/ffmpegcolorspace/mem.c:
+ * gst/ffmpegcolorspace/utils.c:
+ * gst/playback/gstplaysink.c:
+ ffmpegcolorspace: remove plugin
+
+2011-06-15 17:49:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst/colorspace/Makefile.am:
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/colorspace.vcproj:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ * gst/colorspace/gstcolorspaceorc-dist.h:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ * gst/videoconvert/Makefile.am:
+ * gst/videoconvert/gstvideoconvert.c:
+ * gst/videoconvert/gstvideoconvert.h:
+ * gst/videoconvert/gstvideoconvertorc-dist.c:
+ * gst/videoconvert/gstvideoconvertorc-dist.h:
+ * gst/videoconvert/gstvideoconvertorc.orc:
+ * gst/videoconvert/videoconvert.c:
+ * gst/videoconvert/videoconvert.h:
+ * gst/videoconvert/videoconvert.vcproj:
+ videoconvert: renamed from colorspace
+
+2011-06-15 16:52:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspace.c:
+ colorspace: fix caps negotiation
+
+2011-06-15 16:28:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspace.c:
+ colorspace: port to 0.11
+
+2011-06-15 16:28:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ colorspace: add to build
+
+2011-04-30 19:46:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ [MOVED FROM BAD 68/68] Update orc-generated disted C backup code to orc 0.4.14
+
+2011-04-28 00:00:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ [MOVED FROM BAD 67/68] 0.10.21.3 pre-release
+
+2011-04-17 01:09:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ * gst/colorspace/gstcolorspaceorc-dist.h:
+ [MOVED FROM BAD 66/68] ext, gst: update disted orc backup files
+
+2011-04-15 00:09:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 65/68] Fix some unused-but-set-variable warnings with gcc 4.6
+
+2011-04-11 00:36:35 -0400 Thibault Saunier <thibault.saunier@collabora.co.uk>
+
+ * gst/colorspace/Makefile.am:
+ [MOVED FROM BAD 64/68] 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-02-25 19:59:05 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 63/68] colorspace: set dithering enum directly
+
+2011-02-25 19:57:47 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 62/68] colorspace: Add support for r210
+
+2011-02-20 23:01:30 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 61/68] colorspace: Fix YUV->RGB matrixing
+
+2011-02-20 22:43:56 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ [MOVED FROM BAD 60/68] colorspace: Add dithering
+ Dithering only happens when a 16-bit-per-channel format is
+ involved.
+
+2011-02-20 14:14:27 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 59/68] colorspace: fix a few formats
+
+2011-02-19 13:12:41 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 58/68] colorspace: Add 16-bit-per-channel handling
+
+2011-02-19 13:13:13 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 57/68] colorspace: Fix memleak
+
+2011-02-15 18:12:02 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 56/68] colorspace: Fix memory leak
+
+2011-01-02 16:13:56 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 55/68] colorspace: Disable matrixing on big-endian
+ It's broken until someone writes better Orc code. Fixes #631232.
+
+2010-11-21 23:11:19 -0800 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 54/68] colorspace: remove incorrect check
+
+2010-11-05 10:56:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ * gst/colorspace/gstcolorspaceorc-dist.h:
+ [MOVED FROM BAD 53/68] colorspace: Update generated ORC sources
+
+2010-11-04 14:18:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 52/68] colorspace: Inverse -base version check logic to actually make sense
+
+2010-11-03 15:37:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 51/68] colorspace: Add support for IYU1
+
+2010-11-03 15:12:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 50/68] colorspace: First version of YUV9 and YVU9 implementation
+
+2010-11-03 09:20:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 49/68] colorspace: Use GST_CHECK_PLUGINS_BASE_VERSION() instead of other hacks
+
+2010-11-02 16:54:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 48/68] colorspace: fix build with current git of gst-plugins-base
+ ifdef tests don't work so well if we define them in the code
+ above in case they aren't defined.
+
+2010-11-02 16:05:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ [MOVED FROM BAD 47/68] colorspace: Add support for 8 bit paletted RGB
+ This needs the 8 bit paletted support from -base
+ which will be committed after release. Without this
+ the 8 bit parts are disabled.
+
+2010-11-01 15:53:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ * gst/colorspace/gstcolorspaceorc-dist.h:
+ [MOVED FROM BAD 46/68] cog, colorspace: update orc backup functions for latest changes
+ Should fix build on systems without the latest orc.
+
+2010-10-31 23:46:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 45/68] colorspace: Add support for RGB15 and BGR15
+
+2010-10-31 23:44:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 44/68] colorspace: Add support for RGB16 and BGR16
+
+2010-10-31 23:25:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 43/68] colorspace: Add support for Y16
+
+2010-10-31 23:25:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 42/68] colorspace: Fix Y800 ORC getline implementation
+
+2010-10-31 23:07:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 41/68] colorspace: Add support for A420
+
+2010-10-31 23:00:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 40/68] colorspace: Add support for Y41B
+
+2010-10-31 22:39:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ [MOVED FROM BAD 39/68] colorspace: Add support for SDTV/HDTV YUV conversions
+
+2010-10-31 22:21:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 38/68] colorspace: Add comment for the A420 getline/putline table row
+
+2010-10-31 20:40:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ [MOVED FROM BAD 37/68] colorspace: Add const to the source arrays and the getline/putline table
+
+2010-10-31 19:42:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 36/68] colorspace: Make fast-path transform table const
+
+2010-10-31 19:39:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 35/68] colorspace: Only do the I420->YUY2 conversion once per scanline in the fast path
+
+2010-09-21 18:13:37 -0700 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/colorspace.c:
+ [MOVED FROM BAD 34/68] colorspace: quiet a GST_ERROR
+
+2010-09-15 21:47:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/colorspace/gstcolorspaceorc-dist.c:
+ * gst/colorspace/gstcolorspaceorc-dist.h:
+ [MOVED FROM BAD 33/68] colorspace: add orc-dist files
+ Should fix build without orc or too old orc.
+
+2010-09-13 18:49:43 -0700 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/Makefile.am:
+ * gst/colorspace/colorspace.c:
+ * gst/colorspace/colorspace.h:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ [MOVED FROM BAD 32/68] colorspace: Add conversion code
+ Work in progress. Colorspace handles most format conversion using
+ 3-stage getline/matrix/putline process using an AYUV or ARGB
+ intermediate, with most functions handled by Orc. There is also
+ a table of single-pass conversions, all handled by Orc. The plan
+ is to add optional stages for various chroma upsampling/downsampling
+ algorithms, dithering, and float/int16 intermediates, and then have
+ Orc create multi-stage functions at runtime.
+
+2010-09-13 12:48:50 -0700 David Schleef <ds@schleef.org>
+
+ * gst/colorspace/Makefile.am:
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/colorspace/gstcolorspaceorc.orc:
+ * gst/colorspace/yuv2rgb.c:
+ * gst/colorspace/yuv2rgb.h:
+ [MOVED FROM BAD 31/68] colorspace: Revive element
+ Now based on Orc.
+
+2010-03-18 17:30:26 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 30/68] gst_element_class_set_details => gst_element_class_set_details_simple
+
+2008-11-04 12:42:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM BAD 29/68] 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.
+
+2007-06-22 10:46:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ [MOVED FROM BAD 28/68] Fix leaks.
+ Original commit message from CVS:
+ * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_init):
+ * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_init):
+ * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_init):
+ * ext/audioresample/gstaudioresample.c:
+ * ext/bz2/gstbz2dec.c: (gst_bz2dec_init):
+ * ext/bz2/gstbz2enc.c: (gst_bz2enc_init):
+ * ext/divx/gstdivxdec.c: (gst_divxdec_init):
+ * ext/divx/gstdivxenc.c: (gst_divxenc_init):
+ * ext/faac/gstfaac.c: (gst_faac_init):
+ * ext/gsm/gstgsmdec.c: (gst_gsmdec_init):
+ * ext/gsm/gstgsmenc.c: (gst_gsmenc_init):
+ * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_init):
+ * ext/lcs/gstcolorspace.c: (gst_colorspace_init):
+ * ext/libfame/gstlibfame.c: (gst_fameenc_init):
+ * ext/snapshot/gstsnapshot.c: (gst_snapshot_init):
+ * ext/spc/gstspc.c: (gst_spc_dec_init):
+ * ext/swfdec/gstswfdec.c: (gst_swfdec_init):
+ * ext/xvid/gstxvidenc.c: (gst_xvidenc_init):
+ * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_init):
+ * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init):
+ * gst/chart/gstchart.c: (gst_chart_init):
+ * gst/colorspace/gstcolorspace.c: (gst_colorspace_init):
+ * gst/festival/gstfestival.c: (gst_festival_init):
+ * gst/freeze/gstfreeze.c: (gst_freeze_init):
+ * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_request_new_pad):
+ * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_system_encode_init):
+ * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
+ * gst/nsf/gstnsf.c: (gst_nsfdec_init):
+ * gst/overlay/gstoverlay.c: (gst_overlay_init):
+ * gst/passthrough/gstpassthrough.c: (passthrough_init):
+ * gst/playondemand/gstplayondemand.c: (play_on_demand_init):
+ * gst/smooth/gstsmooth.c: (gst_smooth_init):
+ * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_init):
+ * gst/speed/gstspeed.c: (speed_init):
+ * gst/vbidec/gstvbidec.c: (gst_vbidec_init):
+ * gst/videodrop/gstvideodrop.c: (gst_videodrop_init):
+ * sys/dxr3/dxr3spusink.c: (dxr3spusink_init):
+ * sys/dxr3/dxr3videosink.c: (dxr3videosink_init):
+ * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_init):
+ Fix leaks.
+
+2006-06-01 22:00:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM BAD 27/68] Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+ Original commit message from CVS:
+ * ext/alsaspdif/alsaspdifsink.h:
+ * ext/amrwb/gstamrwbdec.h:
+ * ext/amrwb/gstamrwbenc.h:
+ * ext/amrwb/gstamrwbparse.h:
+ * ext/arts/gst_arts.h:
+ * ext/artsd/gstartsdsink.h:
+ * ext/audiofile/gstafparse.h:
+ * ext/audiofile/gstafsink.h:
+ * ext/audiofile/gstafsrc.h:
+ * ext/audioresample/gstaudioresample.h:
+ * ext/bz2/gstbz2dec.h:
+ * ext/bz2/gstbz2enc.h:
+ * ext/dirac/gstdiracdec.h:
+ * ext/directfb/dfbvideosink.h:
+ * ext/divx/gstdivxdec.h:
+ * ext/divx/gstdivxenc.h:
+ * ext/dts/gstdtsdec.h:
+ * ext/faac/gstfaac.h:
+ * ext/gsm/gstgsmdec.h:
+ * ext/gsm/gstgsmenc.h:
+ * ext/ivorbis/vorbisenc.h:
+ * ext/libfame/gstlibfame.h:
+ * ext/nas/nassink.h:
+ * ext/neon/gstneonhttpsrc.h:
+ * ext/polyp/polypsink.h:
+ * ext/sdl/sdlaudiosink.h:
+ * ext/sdl/sdlvideosink.h:
+ * ext/shout/gstshout.h:
+ * ext/snapshot/gstsnapshot.h:
+ * ext/sndfile/gstsf.h:
+ * ext/swfdec/gstswfdec.h:
+ * ext/tarkin/gsttarkindec.h:
+ * ext/tarkin/gsttarkinenc.h:
+ * ext/theora/theoradec.h:
+ * ext/wavpack/gstwavpackdec.h:
+ * ext/wavpack/gstwavpackparse.h:
+ * ext/xine/gstxine.h:
+ * ext/xvid/gstxviddec.h:
+ * ext/xvid/gstxvidenc.h:
+ * gst/cdxaparse/gstcdxaparse.h:
+ * gst/cdxaparse/gstcdxastrip.h:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/festival/gstfestival.h:
+ * gst/freeze/gstfreeze.h:
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.h:
+ * gst/modplug/gstmodplug.h:
+ * gst/mpeg1sys/gstmpeg1systemencode.h:
+ * gst/mpeg1videoparse/gstmp1videoparse.h:
+ * gst/mpeg2sub/gstmpeg2subt.h:
+ * gst/mpegaudioparse/gstmpegaudioparse.h:
+ * gst/multifilesink/gstmultifilesink.h:
+ * gst/overlay/gstoverlay.h:
+ * gst/playondemand/gstplayondemand.h:
+ * gst/qtdemux/qtdemux.h:
+ * gst/rtjpeg/gstrtjpegdec.h:
+ * gst/rtjpeg/gstrtjpegenc.h:
+ * gst/smooth/gstsmooth.h:
+ * gst/smoothwave/gstsmoothwave.h:
+ * gst/spectrum/gstspectrum.h:
+ * gst/speed/gstspeed.h:
+ * gst/stereo/gststereo.h:
+ * gst/switch/gstswitch.h:
+ * gst/tta/gstttadec.h:
+ * gst/tta/gstttaparse.h:
+ * gst/videodrop/gstvideodrop.h:
+ * gst/xingheader/gstxingmux.h:
+ * sys/directdraw/gstdirectdrawsink.h:
+ * sys/directsound/gstdirectsoundsink.h:
+ * sys/dxr3/dxr3audiosink.h:
+ * sys/dxr3/dxr3spusink.h:
+ * sys/dxr3/dxr3videosink.h:
+ * sys/qcam/gstqcamsrc.h:
+ * sys/vcd/vcdsrc.h:
+ Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+
+2006-04-25 21:56:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ [MOVED FROM BAD 26/68] 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 <ensonic@users.sourceforge.net>
+
+ [MOVED FROM BAD 25/68] 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 <ensonic@users.sourceforge.net>
+
+ [MOVED FROM BAD 24/68] 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-01 10:09:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 23/68] rework build; add translations for v4l2
+ Original commit message from CVS:
+ rework build; add translations for v4l2
+
+2005-12-06 19:55:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/colorspace/yuv2rgb.c:
+ * gst/colorspace/yuv2rgb.h:
+ [MOVED FROM BAD 22/68] expand tabs
+ Original commit message from CVS:
+ expand tabs
+
+2005-12-05 13:04:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ [MOVED FROM BAD 21/68] Update for alloc_buffer changes.
+ Original commit message from CVS:
+ 2005-12-05 Andy Wingo <wingo@pobox.com>
+ * 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-09-05 17:20:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 20/68] Fix up all the state change functions.
+ Original commit message from CVS:
+ Fix up all the state change functions.
+
+2005-08-14 16:21:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/colorspace/Makefile.am:
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 19/68] pound some sense in the colorspace elements
+ Original commit message from CVS:
+ pound some sense in the colorspace elements
+
+2005-07-05 10:51:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ [MOVED FROM BAD 18/68] Way, way, way too many files: Remove crack comment from the 2000 era.
+ Original commit message from CVS:
+ 2005-07-05 Andy Wingo <wingo@pobox.com>
+ * Way, way, way too many files:
+ Remove crack comment from the 2000 era.
+
+2004-07-27 21:41:30 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ * gst/colorspace/colorspace.vcproj:
+ [MOVED FROM BAD 17/68] more working plugins
+ Original commit message from CVS:
+ more working plugins
+
+2004-07-27 09:57:33 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ * gst/colorspace/colorspace.vcproj:
+ [MOVED FROM BAD 16/68] 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 <steve.lhomme@free.fr>
+
+ * gst/colorspace/colorspace.vcproj:
+ [MOVED FROM BAD 15/68] avoid problems with math.h, fix release dependancy
+ Original commit message from CVS:
+ avoid problems with math.h, fix release dependancy
+
+2004-07-26 22:11:21 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/yuv2rgb.h:
+ [MOVED FROM BAD 14/68] local include fixes
+ Original commit message from CVS:
+ local include fixes
+ Fix some 64 bits constants to be glib friendly
+ issue for a vararg macro with MSVC
+
+2004-07-26 13:20:11 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ * gst/colorspace/colorspace.vcproj:
+ [MOVED FROM BAD 13/68] more plugins supported under windows
+ Original commit message from CVS:
+ more plugins supported under windows
+
+2004-05-21 22:39:30 +0000 Stéphane Loeuillet <gstreamer@leroutier.net>
+
+ * gst/colorspace/gstcolorspace.c:
+ [MOVED FROM BAD 12/68] first batch : remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc
+ Original commit message from CVS:
+ first batch :
+ remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc
+
+2004-04-22 03:52:52 +0000 Benjamin Otte <otte@gnome.org>
+
+ [MOVED FROM BAD 11/68] s/gst_caps_simplify/gst_caps_do_simplify/
+ Original commit message from CVS:
+ * 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-09 00:01:44 +0000 David Schleef <ds@schleef.org>
+
+ [MOVED FROM BAD 10/68] gst/colorspace/gstcolorspace.c: Don't advertise a conversion we don't support (bug #139532)
+ Original commit message from CVS:
+ * gst/colorspace/gstcolorspace.c: Don't advertise a conversion
+ we don't support (bug #139532)
+
+2004-03-30 07:07:46 +0000 David Schleef <ds@schleef.org>
+
+ [MOVED FROM BAD 09/68] ext/hermes/gsthermescolorspace.c: decrease rank by 2 to not interfere with other colorspaces.
+ Original commit message from CVS:
+ * 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-15 19:32:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/yuv2rgb.c:
+ [MOVED FROM BAD 08/68] 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 <johan@gnome.org>
+
+ [MOVED FROM BAD 07/68] *.h: Revert indenting
+ Original commit message from CVS:
+ * *.h: Revert indenting
+
+2004-03-14 22:34:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/colorspace/gstcolorspace.c:
+ * gst/colorspace/gstcolorspace.h:
+ * gst/colorspace/yuv2rgb.c:
+ * gst/colorspace/yuv2rgb.h:
+ [MOVED FROM BAD 06/68] gst-indent
+ Original commit message from CVS:
+ gst-indent
+
+2004-03-13 00:19:26 +0000 David Schleef <ds@schleef.org>
+
+ [MOVED FROM BAD 05/68] configure.ac: the Hermes library controls hermescolorspace, not colorspace.
+ Original commit message from CVS:
+ * 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-01-18 19:02:33 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst/colorspace/Makefile.am:
+ [MOVED FROM BAD 04/68] fix to make it possible to build from disted tarball
+ Original commit message from CVS:
+ fix to make it possible to build from disted tarball
+
+2004-01-16 00:55:29 +0000 David Schleef <ds@schleef.org>
+
+ [MOVED FROM BAD 03/68] gst-libs/gst/audio/Makefile.am: Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c from the template.
+ Original commit message from CVS:
+ * 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 10:45:55 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ [MOVED FROM BAD 02/68] gst/colorspace/: Fix compiling... Didn't test if it actually works.
+ Original commit message from CVS:
+ 2004-01-15 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * 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 08:58:22 +0000 David Schleef <ds@schleef.org>
+
+ [MOVED FROM BAD 01/68] Duplicate the ext/hermes colorspace plugin, and remove Hermes code and GPL code. Fix for new caps negotiation. Rewr...
+ Original commit message from CVS:
+ * 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.
+
+2011-06-15 15:08:32 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Add gobject introspection files to spec
+
+2011-06-15 14:53:56 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ remove old v4l plugin from spec file
+
+2011-06-15 14:49:41 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * tests/examples/Makefile.am:
+ Add missing dist subdir
+
+2011-06-15 14:21:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/Makefile.am:
+ audio: link test program against libgstaudio
+
+2011-06-15 13:01:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: cleanup and use playbin after rename
+ Remove the static pipelines and other unused things
+ Use playbin
+
+2011-06-15 12:48:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-media-types.txt:
+ docs: add more media type
+
+2011-06-15 00:52:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * ext/Makefile.am:
+ * ext/gnomevfs/Makefile.am:
+ * ext/gnomevfs/gstgnomevfs.c:
+ * ext/gnomevfs/gstgnomevfs.h:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssink.h:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ * ext/gnomevfs/gstgnomevfsuri.c:
+ * ext/gnomevfs/gstgnomevfsuri.h:
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst-plugins-base.spec.in:
+ * po/POTFILES.in:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/gnomevfssink.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/icles/playback/decodetest.c:
+ gnomevfs: remove GnomeVFS plugin
+ The gio plugin replaces it.
+
+2011-06-15 00:35:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/decodebin.c:
+ * tests/check/elements/decodebin2.c:
+ * tests/check/elements/playbin-compressed.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/playbin2-compressed.c:
+ * tests/check/elements/playbin2.c:
+ tests: fix up unit tests for playbin2/decodebin2 renames and updates
+ Even if they don't work yet.
+
+2011-06-15 00:32:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/design-decodebin.txt:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin, decodebin: remove new-decoded-pad and removed-decoded-pad signals
+ They were deprecated, use "pad-added" and "pad-removed" instead.
+
+2011-06-15 00:06:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamsynchronizer.c:
+ playback: rename playbin2 to playbin
+ But keep source file name as-is for now.
+
+2011-06-15 00:02:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplayback.c:
+ * gst/playback/gstplayback.h:
+ * gst/playback/gsturidecodebin.c:
+ playback: merge playbin and decodebin plugins into one single playback plugin again
+
+2011-06-14 23:51:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gsturidecodebin.c:
+ decodebin2: rename decodebin2 to decodebin
+ But don't rename source file for now, which hopefully
+ makes merging from master easier.
+
+2011-06-14 23:42:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/README:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstplayback.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreaminfo.c:
+ * gst/playback/gststreaminfo.h:
+ playback: remove old playbin and decodebin elements
+
+2011-06-15 01:55:31 +0530 Debarshi Ray <rishi@gnu.org>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst/tcp/gsttcpclientsink.c:
+ Remove unused but set variables
+ This is needed to satisfy the new -Wunused-but-set-variable added in
+ GCC 4.6: http://gcc.gnu.org/gcc-4.6/changes.html
+
+2011-06-14 18:25:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-media-types.txt:
+ docs: add beginnings of new media types design doc
+ Start with new video media types and properties
+
+2011-06-14 15:20:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-06-14 10:31:18 +0530 Debarshi Ray <rishi@gnu.org>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ codec-utils: restore 7350 as a valid sampling frequency for AAC
+ This was lost during c77f88cac675a1dbb89e40da8e3c28320523bfca.
+
+2011-06-09 18:30:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tag.h:
+ libs: replace G_CONST_RETURN with 'const'
+ G_CONST_RETURN will be deprecated soon.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652211
+
+2011-05-31 22:14:09 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioresample/resample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videotestsrc/generate_sine_table.c:
+ * gst/videotestsrc/videotestsrc.c:
+ * tests/icles/test-xoverlay.c:
+ convert M_PI to G_PI, for msvc
+
+2011-06-06 14:41:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: no input data implies no type can be found
+ ... and posting a proper error message to this effect is appropriately
+ informative and prevents auto-plugging otherwise stalling.
+
+2011-06-04 13:36:55 -0700 David Schleef <ds@schleef.org>
+
+ * gst/adder/gstadder.c:
+ adder: Work around changes in g_atomic API
+ See #651514 for details.
+
+2011-05-31 20:38:56 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: fix c99-ism
+
+2011-05-23 16:02:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Try to typefind even if conversion to UTF8 failed
+ Fixes bug #600043.
+
+2011-05-23 15:51:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Interprete typefind strings passed to GRegex as raw bytes instead of valid UTF8
+
+2011-05-20 10:48:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/lang.c:
+ lang: fix possible array overrun
+ We where checking for i<G_N_ELEMENTS, but where accessing i+1.
+
+2011-06-14 10:31:18 +0530 Debarshi Ray <rishi@gnu.org>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ codec-utils: restore 7350 as a valid sampling frequency for AAC
+ This was lost during c77f88cac675a1dbb89e40da8e3c28320523bfca.
+
+2011-06-13 19:09:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-06-13 16:32:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * gst/gdp/gstgdppay.c:
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ -base: update for buffer API change
+
+2011-06-13 16:28:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppayload: cleanup header
+
+2011-06-13 12:15:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: use _check_reconfigure method
+
+2011-06-13 12:09:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ videotestsrc: use baseclass allocator negotiation logic
+ Let the baseclass implement the negotiation of the allocators.
+ Influence the allocator buffersize.
+ Use the fill vmethod to fill the buffer with data.
+
+2011-06-11 20:47:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ ximage: fix alignment and size
+ Set the right alignment and size in the bufferpool.
+
+2011-06-11 18:54:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/theora/gsttheoradec.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagesink.c:
+ update for bufferpool api change
+
+2011-05-31 22:14:09 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioresample/resample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videotestsrc/generate_sine_table.c:
+ * gst/videotestsrc/videotestsrc.c:
+ * tests/icles/test-xoverlay.c:
+ convert M_PI to G_PI, for msvc
+
+2011-06-07 21:30:18 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: refactor how EOS is determined
+ This decreases the number of buffers held on each pad by one,
+ eliminating next_buffer. Simplifies the logic by relying solely
+ on CollectPads to let us know when a pad is in EOS. As a side
+ benefit, the collect pads related code is structured more like
+ other CollectPad users.
+ The previous code would occasionally mark the wrong pad as EOS,
+ causing the code to get in a state where all the streams were
+ finished, but EOS hadn't been sent to the source pad.
+
+2011-06-10 18:04:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/theora/gsttheoradec.c:
+ update for alignment change
+
+2011-06-10 17:58:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: small cleanups
+
+2011-06-10 17:58:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: fix for alignment value change
+
+2011-06-10 12:14:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ tests/examples/audio/Makefile.am
+ tests/examples/v4l/Makefile.am
+
+2011-06-10 11:59:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * gst/adder/gstadder.c:
+ * gst/encoding/gstsmartencoder.c:
+ -base: fix for flush_stop event API change
+
+2011-06-09 18:30:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tag.h:
+ libs: replace G_CONST_RETURN with 'const'
+ G_CONST_RETURN will be deprecated soon.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652211
+
+2011-06-09 00:02:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Fix LocationShown syntax
+ According to the specification, the LocationShown requires its
+ struct fields to be inside a Bag type.
+
+2011-06-09 11:52:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: small improvements
+
+2011-06-08 14:21:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add room for extra namespace definitions
+ Adds an extra field to the namespace definitions of the schemas
+ so they can add the namespace of any array/struct fields they
+ might use internally.
+
+2011-06-08 13:43:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: changes for message API changes
+
+2011-06-08 12:21:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/pango/Makefile.am:
+ * gst/audioresample/Makefile.am:
+ * tests/check/Makefile.am:
+ * tests/examples/v4l/Makefile.am:
+ GST_PLUGINS_BASE_LIBS is not defined in -base.
+
+2011-06-08 11:33:07 +0200 Christophe Fergeau <cfergeau@redhat.com>
+
+ * tests/examples/audio/Makefile.am:
+ examples: don't link testchannels example with system libgstaudio
+ The testchannels audio test program is using -lgstaudio-0.10 to link
+ with libgstaudio which won't use the gstaudio library that was just
+ built but the one from the system. This is an issue since it means
+ we won't be testing the code from the current source tree, and it
+ also breaks the build when building on a system which don't have
+ a libgstaudio yet.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652100
+
+2011-06-08 11:11:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/design-decodebin.txt:
+ docs: add some text about parser/decoder autoplugging issues
+
+2011-06-07 20:43:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * gst-plugins-base.spec.in:
+ * gst/videorate/gstvideorate.c:
+ * po/POTFILES.in:
+ * sys/Makefile.am:
+ * sys/v4l/.gitignore:
+ * sys/v4l/Makefile.am:
+ * sys/v4l/README:
+ * sys/v4l/TODO:
+ * sys/v4l/gstv4l.c:
+ * sys/v4l/gstv4lcolorbalance.c:
+ * sys/v4l/gstv4lcolorbalance.h:
+ * sys/v4l/gstv4lelement.c:
+ * sys/v4l/gstv4lelement.h:
+ * sys/v4l/gstv4ljpegsrc.c:
+ * sys/v4l/gstv4ljpegsrc.h:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lmjpegsink.h:
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * sys/v4l/gstv4lmjpegsrc.h:
+ * sys/v4l/gstv4lsrc.c:
+ * sys/v4l/gstv4lsrc.h:
+ * sys/v4l/gstv4ltuner.c:
+ * sys/v4l/gstv4ltuner.h:
+ * sys/v4l/gstv4lxoverlay.c:
+ * sys/v4l/gstv4lxoverlay.h:
+ * sys/v4l/v4l_calls.c:
+ * sys/v4l/v4l_calls.h:
+ * sys/v4l/v4lmjpegsink_calls.c:
+ * sys/v4l/v4lmjpegsink_calls.h:
+ * sys/v4l/v4lmjpegsrc_calls.c:
+ * sys/v4l/v4lmjpegsrc_calls.h:
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/v4l/v4lsrc_calls.h:
+ * sys/v4l/videodev_mjpeg.h:
+ * tests/examples/Makefile.am:
+ * tests/examples/v4l/.gitignore:
+ * tests/examples/v4l/Makefile.am:
+ * tests/examples/v4l/probe.c:
+ Remove v4l plugin
+ The old v4l interface has been deprecated for years and even
+ been removed from the kernel headers. If anyone still needs
+ this plugin, they can resurrect it in gst-plugins-bad, there's
+ no reason for it to be in -base.
+
+2011-06-07 16:18:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: use new memory alloc API
+
+2011-06-07 12:06:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ event: fix some event leaks
+
+2011-06-07 11:55:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggaviparse.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst/videorate/gstvideorate.c:
+ -base: use caps event
+ Remove uses of setcaps function and use the caps event.
+
+2011-06-07 10:58:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamsplitter.c:
+ * gst/subparse/gstssaparse.c:
+ -base: use caps event instead of setcapsfunction
+
+2011-06-06 16:27:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/theora/gsttheoraenc.c
+
+2011-06-06 12:03:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ videotestsrc: remove deprecated peer-alloc property
+ Remove the peer-alloc property, it's not used anymore because pad-alloc is gone.
+
+2011-06-06 14:30:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: also define GST_DISABLE_XML for now to fix subparse build
+
+2011-06-06 14:41:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: no input data implies no type can be found
+ ... and posting a proper error message to this effect is appropriately
+ informative and prevents auto-plugging otherwise stalling.
+
+2011-06-06 12:48:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: determine granulepos metadata using stream mapper whenever possible
+ ... which unfortunately is not the case for all types, but at least so for
+ most common ones.
+
+2011-06-06 12:46:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: convert incoming buffer timestamp to running time
+ ... so all subsequent manipulation can take place in the proper timeline
+ without further ado.
+
+2011-06-01 20:48:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: remove superfluous code
+ ... since there is nothing in oggstream that cares (or even should)
+ about granulepos for what is being asked from it.
+
+2011-06-05 23:47:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update for removed translatable strings
+
+2011-06-05 23:47:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: fix indentation
+
+2011-06-05 23:44:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: define USE_XML conditional used by subparse as FALSE for now
+ The subparse plugin needs to be split and/or moved to ext/ for the
+ libxml2 dependency. The media type needs to be format-specific instead
+ of a catch-all format. Maybe add a base class or line-based adapter.
+
+2011-06-04 13:36:55 -0700 David Schleef <ds@schleef.org>
+
+ * gst/adder/gstadder.c:
+ adder: Work around changes in g_atomic API
+ See #651514 for details.
+
+2011-05-31 20:38:56 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: fix c99-ism
+
+2011-06-03 16:29:00 +0200 Luis de Bethencourt <luis.debethencourt@collabora.como>
+
+ * ext/theora/gsttheoraenc.c:
+ theora: separate encode and push block in chain, into own function.
+
+2011-06-03 19:10:33 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/elements/vorbistag.c:
+ check/vorbistag: Convert to new probe API
+
+2011-06-03 19:07:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/pipelines/vorbisenc.c:
+ check/vorbisenc: Convert to new probe API
+
+2011-06-03 19:00:23 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/pipelines/oggmux.c:
+ check/oggmux: Convert to new probe API
+
+2011-06-03 15:51:08 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/elements/playbin2.c:
+ check/playbin2: Update for caps and structure API changes
+
+2011-06-03 12:19:49 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/elements/gnomevfssink.c:
+ check: Use new gst_event_new_segment() API
+
+2011-06-03 11:48:43 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/examples/audio/Makefile.am:
+ examples: Link against proper libgstaudio
+ It was previously attempting to link against the non-local one.
+
+2011-06-03 19:00:39 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Use the GstPad (and not the GstOggPadData for GstPad functions
+ For those willing, renaming that 'pad' variable to something more obvious
+ would be nice to avoid such bugs...
+
+2011-06-03 13:35:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ thoeraenc: port to 0.11
+
+2011-06-03 13:31:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/theora/gsttheoraenc.c
+
+2011-06-03 13:16:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: fix after merge
+
+2011-06-03 13:12:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ playback: fix compilation after ghostpad setcaps removal
+
+2011-06-02 19:08:41 +0200 Luis de Bethencourt <luis.debethencourt@collabora.como>
+
+ * ext/theora/gsttheoraenc.c:
+ theora: use fixed src cap pads
+
+2011-06-02 18:57:05 +0200 Luis de Bethencourt <luis.debethencourt@collabora.como>
+
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraenc.h:
+ theora: set the width/height/par on the srcpad caps
+
+2011-06-02 17:29:53 +0200 Luis de Bethencourt <luis.debethencourt@collabora.como>
+
+ * ext/theora/gsttheoraenc.c:
+ theora: get sink caps info from downstream element pad
+ https://bugzilla.gnome.org/show_bug.cgi?id=651564
+
+2011-06-02 19:26:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-06-02 19:21:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertp: use caps event instead of setcaps function
+ Use the caps event instead of the setcaps function to configure caps.
+ Use a default event handler for the base rtp payloader instead of the awkward
+ way of handling the return value.
+
+2011-05-27 14:41:39 -0700 Patrick McCarty <patrick.mccarty@intel.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for wbmp images.
+ https://bugzilla.gnome.org/show_bug.cgi?id=651294
+
+2011-06-02 00:55:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add typefinder for WAP WBMP bitmaps
+ https://bugzilla.gnome.org/show_bug.cgi?id=651294
+
+2011-06-02 12:21:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: fix header after merge
+
+2011-06-02 12:18:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/video/video.h
+ gst/playback/gstplaysinkaudioconvert.c
+ gst/playback/gstplaysinkvideoconvert.c
+ tests/check/libs/rtp.c
+
+2011-06-02 12:12:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ playsinconvert: clear the probe id when removing
+
+2011-06-02 12:08:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: refactor block/unblock code a little
+
+2011-06-02 11:53:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ playsink: Fix deadlock in the audio/video converter bins when linking fails
+
+2011-06-01 19:34:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkaudioconvert.h:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.h:
+ * gst/playback/gststreaminfo.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ * gst/playback/gsturidecodebin.c:
+ * tests/icles/audio-trickplay.c:
+ probes: port to new API for blocking and probes
+
+2011-06-01 17:31:35 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ check: ... and don't forget to add the new arm header
+ Forgot it in my previous commit
+
+2011-06-01 17:24:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_arm.h:
+ libsabi: Add structure sizes for arm
+
+2011-05-31 19:57:57 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/fft/gstfftf32.c:
+ * gst-libs/gst/fft/gstfftf64.c:
+ * gst-libs/gst/fft/gstffts16.c:
+ * gst-libs/gst/fft/gstffts32.c:
+ fft: s/M_PI/G_PI/ for MSVC
+
+2011-05-31 11:05:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ * tests/check/elements/volume.c:
+ volume: Fix handling of volume>=4.0 for 8 and 16 bit integer formats
+ Also add a unit test for this. Previously volumes bigger than 4.0
+ would have resulted in overflows in the fixed point processing.
+ Fixes bug #649642.
+
+2011-05-30 18:36:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ playbin: fixed for new pad block API
+
+2011-05-30 17:14:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: activate pad before pushing things
+ Activate the pad before pushing things on it or else we get errors.
+
+2011-05-29 13:32:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/adder.c:
+ * tests/check/elements/ffmpegcolorspace.c:
+ * tests/check/elements/vorbistag.c:
+ * tests/check/libs/rtp.c:
+ * tests/check/pipelines/theoraenc.c:
+ tests: fix some more unused-but-set-variable warnings with gcc 4.6
+
+2011-05-28 16:14:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: update .def file for new API
+
+2011-05-28 12:39:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * tests/check/elements/.gitignore:
+ Ignore new playbin2-compress test binary
+ And add old testchannels binary to CRUFT_FILES.
+
+2011-05-27 23:31:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: sprinkle some G_GNUC_CONST
+ Mark functions that have no effect besides their return value and
+ only inspect their input arguments with G_GNUC_CONST. (We just
+ ignore the g_return_val_if_fail() guards for this)
+
+2011-05-27 23:25:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: clean up header file
+ Sprinkle some spaces and newlines here and there.
+
+2011-05-27 14:30:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Optimize transform_caps()
+ If the second and next caps structures are a subset of the already existing
+ transformed caps we can safely skip them because we would transform them to
+ the same caps again.
+
+2011-05-27 14:28:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Optimize transform_caps()
+ If the second and next caps structures are a subset of the already existing
+ transformed caps we can safely skip them because we would transform them to
+ the same caps again.
+
+2011-05-27 14:20:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Optimize transform_caps()
+ If the second and next caps structures are a subset of the already existing
+ transformed caps we can safely skip them because we would transform them to
+ the same caps again.
+
+2011-05-27 14:10:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: Use new gst_caps_is_subset_structure() API
+ This prevents one copy of every structure and creating a new caps
+ instance.
+
+2011-05-27 15:03:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst-libs/gst/audio/.gitignore:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/testchannels.c:
+ * tests/examples/Makefile.am:
+ * tests/examples/audio/.gitignore:
+ * tests/examples/audio/Makefile.am:
+ * tests/examples/audio/testchannels.c:
+ audio: move testchannels example to 'tests/examples' dir
+ Also fix it up a little to not include 'c' file but link to the libs instead.
+
+2011-05-27 13:58:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-27 13:13:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: Optimize transform_caps()
+ If the second and next caps structures are a subset of the already existing
+ transformed caps we can safely skip them because we would transform them to
+ the same caps again.
+ This makes gst_pad_get_caps() on an audiotestsrc ! audioconvert !
+ audioconvert ! audioconvert ! fakesink pipeline about 1.7 times faster.
+
+2011-05-27 12:13:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/audioconvert.c:
+ audioconvert: Fix audioconvert unit test to work again
+
+2011-05-27 12:13:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/videoscale/gstvideoscale.c:
+ gst: Update for the GstBaseTransform::transform_caps() changes
+
+2011-05-27 11:39:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ code-utile: fix level descriptions for fgs
+ fgs levels range from 8-13 and are mapped to 0-5.
+
+2011-05-25 14:38:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ codec-utils: fix mpeg4 level verification
+ The current condition would never be true. As levels<6 are asp and levels>7 and
+ <14 are fgs, we should return NULL for cases 6,7,14,15.
+
+2011-05-26 16:08:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ -base: change for changed set_blocked API
+
+2011-05-26 13:47:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-26 12:33:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Fallback to non-XShm mode if allocating the XShm image failed
+ Fixes bug #630442.
+
+2011-05-26 12:30:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Fallback to non-XShm mode if allocating the XShm image failed
+ Fixes bug #630442.
+
+2011-05-26 11:41:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Let the input-selectors sync all streams to the running time
+ This is especially needed when switching between a non-sparse and sparse
+ video stream, see bug #537382. It also lowers the time needed for switching
+ between streams a bit.
+
+2011-01-20 00:52:50 -0700 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: added 'outline-color' parameter to control whether text gets a shadow
+
+2011-01-20 00:42:39 -0700 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: added 'shadow' option to control whether text gets a shadow
+
+2011-05-26 10:48:05 +0200 Jindrich Makovicka <makovick@gmail.com>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Correctly negotiate with downstream instead of just using random caps
+ Fixes bug #638897.
+
+2011-05-26 10:43:51 +0200 Jindrich Makovicka <makovick@gmail.com>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Add bound checks to not write outside the image area
+
+2011-05-26 10:42:46 +0200 Jindrich Makovicka <makovick@gmail.com>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Prevent double unref of caps if the caps can't be set on the srcpad
+
+2011-05-26 10:31:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ gnomevfssrc: Keep track of interruptions during read with a flag
+
+2010-09-03 09:11:30 -0400 American Dynamics <GStreamer-Bugs@tycosp.com>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ gnomevfssrc: Add support for cancelling the read operations
+ This allows the state change from PAUSED to READY to be faster.
+ Fixes bug #628337.
+
+2011-05-25 14:14:46 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Remove g_assert from interface query
+
+2011-05-25 14:08:43 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Remove the g_assert from interface query
+
+2011-05-26 00:17:40 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: add blue and violet noise by using spectral inversion
+ Add blue and violet noise by spectral inversion of pink and red noise.
+ Fixes #649969
+
+2011-05-25 23:40:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: add red (brownian) noise generator
+ Add another noise generator which produces a quite dark noise color.
+ Fixes parts of #649969.
+
+2010-09-27 13:32:31 +0400 Vladimir Eremeev <eremeev@atlantis.ru>
+
+ * tests/examples/seek/seek.c:
+ seek: set selected/default audio/video sinks on playbin and playbin2
+ https://bugzilla.gnome.org/show_bug.cgi?id=630322
+
+2011-05-25 19:03:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: add --audiosink and --videosink command line options
+
+2011-05-25 18:50:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: use the right GDK defines to differentiate between the backends
+
+2011-05-25 18:45:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: use gst_filename_to_uri() to convert a filename to a uri
+
+2010-09-27 12:46:54 +0400 Vladimir Eremeev <eremeev@atlantis.ru>
+
+ * tests/examples/seek/seek.c:
+ seek: make seek example work in win32
+ https://bugzilla.gnome.org/show_bug.cgi?id=630322
+
+2011-05-25 16:08:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: update GLib requirement to >= 2.24
+ Same as core (make implicit requirement explicit).
+ http://gstreamer.freedesktop.org/wiki/ReleasePlanning/GLibRequirement
+
+2011-05-25 15:24:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: remove bogus <0 check for unsigned var
+ bytes_written is a gsize which is unsigned and thus never < 0.
+
+2011-05-25 15:23:13 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: fix variable type for bytes_consumed
+ th_encode_ctl() returns an int. Using a gsize result in bogus <0 checks.
+
+2011-05-25 15:04:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/riff/riff-read.c:
+ riff: remove the g_return_if_fail as we test it below
+ We don't want to return without setting taglist=NULL if asserts are on and with
+ setting taglist=NULL otherwise.
+
+2011-05-25 14:28:18 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/volume/gstvolume.c:
+ volume: use a flag for 'mute' using the controller
+ Previously we checked mute_csource to determine wheter we need to premultiply
+ volumes and mute values. That fails as we unrefs mute_csource and set it to
+ NULL after. Use an extra flag instead.
+
+2011-05-25 14:12:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ exiftag: reflow the code
+ Move the warning on unsupported units to the swicth-case. Move fetching the
+ pending tags down to where we use them.
+
+2011-05-25 13:59:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ exiftag: set value=1 if we found the token
+ Otherwise we never write the tag. This would also be consistent with the code in
+ deserialize_scene_type().
+
+2011-05-25 12:30:51 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: run gst-indent
+
+2011-05-25 12:29:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: remove unneded !=NULL checks
+ We check for matching_attr!=NULL right before already.
+
+2011-05-24 18:21:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/mixerutils.c:
+ * gst/encoding/gstencodebin.c:
+ * gst/playback/gstplaybin2.c:
+ * tests/check/elements/libvisual.c:
+ feature: use object name instaed of feature name
+
+2011-05-24 17:37:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ scheduling: port to new scheduling query
+
+2011-05-24 10:46:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: handle reconfigure events
+ Handle the caps with the caps event.
+ Handle the reconfigure event and renegotiate the bufferpool when needed.
+
+2011-05-24 09:55:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ convertframe: fix for merge conflict
+
+2011-05-24 09:47:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/video/convertframe.c
+
+2011-05-24 09:45:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x11: free bufferpool whe activation fails
+
+2011-05-24 00:13:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: massage the section file more
+ Add more symbols (from unused.txt). Move the whole bunch of riff-fourcc defines
+ to std section too (no one is hoing to document them, right).
+
+2011-05-24 00:12:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/video.c:
+ docs: add missing parameter docs
+
+2011-05-23 23:53:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: move the riff structure to std-section
+ If someone intents to document them and the fields we can move them back.
+
+2011-05-23 23:53:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/gstpluginsbaseversion.c:
+ docs: move pluginbaseversion to separate section as we have section docs
+
+2011-05-23 23:51:15 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ docs: add minimal docblobs for status code and headers
+ Use a trick to avoid documenting all 100 enums.
+
+2011-05-23 23:41:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ docs: update xoverlay docs for api addition and deprecation
+
+2011-05-23 23:12:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ docs: rtp library docs update
+
+2011-05-23 22:58:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/cdda/gstcddabasesrc.h:
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/colorbalancechannel.h:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ * gst-libs/gst/interfaces/navigation.h:
+ * gst-libs/gst/interfaces/tuner.h:
+ * gst-libs/gst/video/gstvideofilter.h:
+ * gst-libs/gst/video/gstvideosink.h:
+ docs: add missing documentation for various pieces
+
+2010-02-19 12:54:18 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: recalibrate clock on setcaps
+ Because the spec for the ringbuffer can change when changing
+ the caps, we must recalibrate the clock.
+ https://bugzilla.gnome.org/show_bug.cgi?id=610443
+
+2011-05-23 16:02:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Try to typefind even if conversion to UTF8 failed
+ Fixes bug #600043.
+
+2011-05-23 16:02:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Compile the typefind regex with optimization to speed up matching
+
+2011-05-23 15:51:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Interprete typefind strings passed to GRegex as raw bytes instead of valid UTF8
+
+2011-05-23 15:21:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/convertframe.c:
+ convertframe: fix docs
+ Fixup paramter mismatch between func and prototype. Add missing parameter docs.
+
+2011-05-23 15:08:24 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/audio/gstaudiosrc.h:
+ * gst-libs/gst/audio/multichannel.h:
+ docs: fixup audio-library docs
+
+2011-05-23 15:02:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst/app/gstapp.c:
+ docs: fixup appsrc/sink api docs
+
+2011-05-23 14:53:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstaudioiec61937.c:
+ * gst-libs/gst/audio/gstaudioiec61937.h:
+ docs: fix docs for new api
+ Some parameters where wrong, first line missed the ':' and return docs where
+ broken.
+
+2011-05-23 14:45:23 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: update xmp api docs
+ Add missing section. Add new section to main-sgml. Add missing function.
+
+2011-05-23 14:07:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmptag: remove late check
+ We deref the pointer two lines before already and besides this internal function
+ should not be called with this parameter=NULL.
+
+2011-05-23 14:01:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmptag: have the default branch as the last one
+
+2011-05-23 14:00:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmptag: an uint value can't be <0
+
+2011-05-23 13:53:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/video.c:
+ whitespace: trim trailing whitespace
+
+2011-05-23 13:50:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/video.c:
+ video.c: use a break and a final warning instead of early returns
+ Use breaks for case branches instead of return 0. We don't expect these to
+ happen anyway. Thus have a warning before the final return to make it easier to
+ see when things go out of sync.
+
+2011-05-23 13:49:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/video.c:
+ video.c: use g_assert_not_reached() for logical error here.
+ This will help to detect them closer to the source if they ever happen.
+
+2011-05-20 12:50:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: use new method
+ Use the new element class method to get the metadata from an element. Not all
+ elements might have an elementfactory.
+
+2011-05-20 12:32:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Fix compilation after the removal of GstElementDetails
+
+2011-05-20 12:26:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ docs/plugins/gst-plugins-base-plugins.hierarchy
+ docs/plugins/gst-plugins-base-plugins.interfaces
+ docs/plugins/gst-plugins-base-plugins.prerequisites
+
+2011-05-20 10:48:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/lang.c:
+ lang: fix possible array overrun
+ We where checking for i<G_N_ELEMENTS, but where accessing i+1.
+
+2011-05-19 23:41:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: cleanup helper code
+ make_lossless_changes() returns the same structure that we're passing (probably
+ to enable chaining). Instead of reusing s and making it point to s2 as well,
+ keep using s2. Drop the assignment which in the 2nd case is a dead one anyway.
+
+2011-05-19 23:25:24 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-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:56:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 9e5bbd5 to 69b981f
+
+2011-05-19 15:56:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: implement ALLOCATION query
+
+2011-05-19 15:55:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: improve allocation query
+ If the allocation query contains the same caps as the current allocator, we can
+ return that one instead of making a new one.
+
+2011-05-19 13:40:29 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Add new header file
+
+2011-05-19 13:38:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: fix upstream renegotiation
+ Fix a refcount problem.
+ Handle reconfiguration requests.
+
+2011-05-19 08:30:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Autoplug formatters
+ Autoplug formatters for streams if a formatter with secondary or
+ higher rank is found. Formatters are autoplugged when there is no
+ muxer or when the muxer doesn't implement the tagsetter interface.
+ Currently only the first formatter found is plugged, this might
+ help in lots of cases, but it doesn't solve the
+ 'lamemp3 ! xingmux ! id3mux'
+ case.
+ https://bugzilla.gnome.org/show_bug.cgi?id=649841
+
+2011-05-19 08:27:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: fix typos
+
+2011-05-19 12:42:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: improve negotiation
+ Remove the setcaps function on the srcpad, we know exactly when we negotiate a
+ new format now.
+ Use a caps event to configure new caps.
+
+2011-05-19 12:29:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbis: fix for new API
+
+2011-05-19 11:31:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-18 22:07:58 +0200 Aleix Conchillo Flaque <aleix@oblong.com>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: Handle headers in caps
+
+2011-05-18 17:23:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/videorate/gstvideorate.c:
+ base: Update for SEGMENT event parse API changes
+
+2011-05-18 16:09:47 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From fd35073 to 9e5bbd5
+
+2011-05-18 13:18:15 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * tests/check/libs/video.c:
+ gstvideo: Add gst_video_get_size_from_caps function
+ gst_video_get_size_from_caps () allows easy calculation of the raw video
+ buffer size from some fixed video caps.
+ API: gst_video_get_size_from_caps()
+
+2011-05-18 12:24:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 46dfcea to fd35073
+
+2011-05-18 09:34:52 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * ext/alsa/gstalsasrc.c:
+ alsa: Remove unused but set variable
+ Unused but set variables cause warnings in GCC 4.6.x and newer.
+
+2011-05-17 13:04:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ gst: Update for caps/pad template related API changes
+
+2011-05-17 13:03:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/ffmpegcolorspace.c:
+ * tests/check/elements/videoscale.c:
+ * tests/check/elements/videotestsrc.c:
+ tests: Update for caps/pad template related API changes
+
+2011-05-17 13:01:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/vorbis/gstvorbisdec.c:
+ ext: Update for caps/pad template related API changes
+
+2011-05-17 12:54:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ sys: Update for caps/pad template related API changes
+
+2011-05-17 12:51:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Update for caps/pad template related API changes
+
+2011-05-17 12:47:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ encoding-profile: Returns a new reference of caps everywhere instead of const caps
+
+2011-05-17 12:29:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ audiofilter: gst_pad_template_new() does not take ownership of the caps anymore
+ There's no need to copy the caps before passing them to that function.
+
+2011-05-17 11:27:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-17 11:25:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/adder/gstadder.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamsplitter.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/v4l/gstv4lsrc.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/audio-trickplay.c:
+ * tests/icles/playback/test5.c:
+ * tests/icles/playback/test6.c:
+ Revert "-base_port to new query API"
+ This reverts commit c9f4e0676ba8c8074a50aa6d1d058f6da9a76b32.
+
+2011-05-17 11:24:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ Revert "decodebin2: Update for GstQuery related API changes"
+ This reverts commit 549128c2a3702a878c62f5603e097c8df7075f36.
+
+2011-05-17 10:20:36 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Fix typo which broke the build
+
+2011-05-17 09:31:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-16 15:35:50 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: not enter in not controllable state unless it is necessary
+ When closing rtspsrc the state change blocks until the polling in the
+ connection timeouts. This is because the second time we loop to read a
+ full message controllable is set to FALSE in the poll group, even though no
+ message is half read.
+ This can be avoided by not setting controllable to FALSE the poll group
+ unless we had begin to read a message.
+ Fixes #610916
+
+2011-05-16 15:35:50 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: not enter in not controllable state unless it is necessary
+ When closing rtspsrc the state change blocks until the polling in the
+ connection timeouts. This is because the second time we loop to read a
+ full message controllable is set to FALSE in the poll group, even though no
+ message is half read.
+ This can be avoided by not setting controllable to FALSE the poll group
+ unless we had begin to read a message.
+ Fixes #610916
+
+2010-05-30 13:21:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/cdparanoia/gstcdparanoiasrc.h:
+ cdparanoiasrc: fix build on OSX by #undef-ing VERSION before including system headers
+ On OSX the cdparanoia headers include IOKit framework headers (in particular
+ SCSICmds_INQUIRY_Definitions.h) which define a structure that has a member
+ named VERSION, so we must #undef VERSION before including those for things
+ to compile on OSX.
+ Fixes #609918.
+
+2011-05-16 17:44:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/v4l/gstv4lsrc.c:
+ v4l: Make sure to return a subset of the filter caps in getcaps
+
+2011-05-16 17:30:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/v4l/gstv4lsrc.c:
+ v4lsrc: fix for new getcaps function
+
+2011-05-16 17:14:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Update for segment API changes
+
+2011-05-16 17:13:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Update for GstQuery related API changes
+
+2011-05-16 17:13:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ playsink: Update for other 0.11 API changes
+
+2011-05-16 17:08:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Use correct number of parameters to gst_pad_get_caps()
+
+2011-05-16 17:06:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ ext/alsa/gstalsasrc.c
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ gst-libs/gst/tag/gstxmptag.c
+ gst/playback/gstsubtitleoverlay.c
+ gst/videorate/gstvideorate.c
+ sys/xvimage/xvimagesink.c
+
+2011-05-16 15:31:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/encoding/encoding.c:
+ * tests/icles/playback/test.c:
+ * tests/icles/playback/test5.c:
+ * tests/icles/playback/test6.c:
+ tests: Update for negotiation related API changes
+
+2011-05-16 15:25:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ vorbis: Update for negotiation related API changes
+
+2011-05-16 15:19:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ theora: Update for negotiation related API changes
+
+2011-05-16 12:23:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gstbasetextoverlay.c:
+ textoverlay: Update for negotiation related API changes
+
+2011-05-16 12:20:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ ogg: Update for negotiation related API changes
+
+2011-05-16 12:18:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: Update for negotiation related API changes
+
+2011-05-16 12:17:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ alsa: Update for negotiation related API changes
+
+2011-05-16 12:04:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Update for negotiation related API changes
+
+2011-05-16 12:01:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Update for negotiation related API changes
+
+2011-05-16 11:37:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/tcp/gsttcpclientsrc.c:
+ tcpclientsrc: Update for negotation related API changes
+
+2011-05-16 11:37:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Update for negotiation related API changes
+
+2011-05-16 11:33:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: Update for negotiation related API changes
+
+2011-05-16 11:26:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Update for negotiation related API changes
+
+2011-05-16 11:04:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamsplitter.c:
+ encodebin: Update for negotiation related API changes
+
+2011-05-16 10:56:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: Update for negotiation related API changes
+
+2011-05-16 10:52:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: Update for negotiation related API changes
+
+2011-05-16 10:48:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Update for the new gst_pad_get_caps() signature
+
+2011-05-16 10:47:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ appsink: Update for the negotiation related API changes
+
+2011-05-16 10:44:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppayload: Change ::get_caps to include the filter caps
+ And improve downstream negotiation a bit by passing our proposed
+ caps to the peer as a filter.
+
+2011-05-11 17:39:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Update for negotiation related API changes
+
+2011-05-11 17:39:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: Update for negotiation related API changes
+
+2011-05-16 12:02:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Update for negotiation related API changes
+
+2011-05-11 17:35:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: basetransform is now better at trying passthrough, remove workaround
+
+2011-05-16 13:48:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisenc.h:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ * gst/videorate/gstvideorate.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ -base: port to new SEGMENT API
+
+2011-05-02 11:43:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: optionally ensure maximum average output frame rate
+ See #628764.
+
+2011-04-29 14:58:02 +0200 Alexey Fisher <bug-track@fisher-privat.net>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: optionally only drop frames to ensure maximum frame rate
+ This adds option to arrange for maximal allowed variable frame rate.
+ Fixes #628764.
+
+2011-04-26 13:37:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: use bitrate to configure streaming buffer-duration default case
+ In particular, in audio only cases whose (estimated) metadata provides bitrate
+ information, the buffer-size based on such bitrate (and buffer-duration)
+ will be much more reasonable than queue2 default buffer-size.
+
+2011-04-26 11:27:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: remove some dead code
+ ... which was dead as pads were never added to the list, and need not be added,
+ since removing them is handled by a pad callback.
+
+2011-04-29 11:48:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/examples/encoding/Makefile.am:
+ encodebin: examples: Add missing base libs to makefile
+
+2011-04-28 10:58:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Check for missing converters
+ Adds checks for missing video and audio converter elements
+
+2011-04-27 22:05:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/xmpwriter.c:
+ tag: xmpwriter: Rename documentation headers
+ Fix some wrong documentation headers from the first name
+ given to this interface.
+
+2011-04-19 08:41:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: xmp: New tests for the Iptc4xmpExt tags
+
+2011-04-18 23:28:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add Iptc4xmpExt schema support
+ Adds Iptc4xmpExt schema with country, city and sublocation
+ tags mapped
+
+2011-04-19 11:00:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add support for reading struct tags
+ Adds a context variable that controls if the parsing is on
+ 'top level' tags or inside a struct tag.
+
+2011-04-18 16:54:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add struct xmp tag type support
+ Adds support for writing the xmp struct tag type, it is a compound tag
+ that has inner tags.
+
+2011-04-18 23:16:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Fixing schema maps
+ Do not forget to create a new schema for every supported schema
+ instead of reusing the same object
+
+2011-04-18 10:20:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Write the same tag to all schemas
+ Instead of writing only the xmp tag for the first found entry
+ that matches the gstreamer tag, look for all mappings to write
+ the tag to different schemas.
+ The rationale here is that some reader application might only
+ be interested on a particular schema tags, so we should try
+ to write as many tags for all schemas.
+
+2011-05-15 13:39:18 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstaudio.def:
+ win32: Update libgstaudio.def for new symbols
+
+2011-05-14 17:27:30 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ baseaudiosink: Use g_str_equal() instead of strncmp()
+ The strncmp is unnecessary anyway since one of the strings is a const
+ string.
+
+2011-05-14 16:49:53 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: Fix trivial indentation problems
+
+2011-03-07 20:49:16 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/gstaudioiec61937.c:
+ * gst-libs/gst/audio/gstaudioiec61937.h:
+ audio: Add an IEC 61937 payloading library
+ This can be used by sinks to take compressed formats, correctly payload
+ these in IEC 61937 frames and feed these to sinks that support
+ passthrough output over IEC 60958 (S/PDIF) or, in the case of MP3, over
+ Bluetooth.
+ Initial implementation includes AC3, E-AC3, MPEG-1, MPEG-2 (non-AAC),
+ and DTS (type-I/II/II) payloading. More formats can be added as needed.
+ API: gst_audio_iec61937_frame_size()
+ API: gst_audio_iec61937_payload()
+ https://bugzilla.gnome.org/show_bug.cgi?id=642730
+
+2011-03-09 11:12:39 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ baseaudiosink: Allow subclasses to provide payloaders
+ This allows subclasses to provide a "payload" function to prepare
+ buffers for consumption. The immediate use for this is for sinks that
+ can handle compressed formats - parsers are directly connected to the
+ sink, and for formats such as AC3, DTS, and MPEG, IEC 61937 patyloading
+ might be used.
+ API: GstBaseAudioSinkClass:payload()
+ https://bugzilla.gnome.org/show_bug.cgi?id=642730
+
+2011-04-09 09:49:10 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: Add support for E-AC3
+ Adds support for pushing E-AC3 buffers and doing bytes-to-ms conversion
+ correctly. The assumption (as with other formats) is that something like
+ IEC 61937 payloading will be used. Correspondingly the ringbuffer spec
+ is populated so that the data rate is 4x normal AC3.
+ https://bugzilla.gnome.org/show_bug.cgi?id=642730
+
+2011-03-14 15:51:40 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: Add support for MPEG audio buffers
+
+2011-03-14 15:49:57 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.h:
+ ringbuffer: Add AAC format types
+ These are meant to be used for buffers containing AAC data. Nothing uses
+ this yet, but for now it serves to distinguish from GST_BUFTYPE_MPEG
+ which represents non-AAC MPEG audio.
+ API: GST_BUFTYPE_MPEG2_AAC
+ API: GST_BUFTYPE_MPEG4_AAC
+
+2011-03-09 22:57:00 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: Add support for DTS buffers
+
+2011-05-14 11:42:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Require core 0.10.34.1 for the new ghostpad API
+
+2011-05-09 22:20:23 +0200 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: fix preroll for streams at low bitrates
+ For streams at low bitrates we need to set a limit in time because the limit
+ in bytes might not reached too late, sometimes more than 30 seconds.
+ This limit can only be set if upstream is seekable (see #584104)
+ Closes #647769
+
+2011-05-09 13:11:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Use new ghostpad/proxypad API to get the internal pad
+
+2011-05-09 12:59:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkaudioconvert.h:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.h:
+ playsink: Use new ghostpad/proxypad API
+
+2011-05-09 12:50:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/playbin2-compressed.c:
+ playbin2: Disable some compressed stream tests that are racy without a stream-activate event
+
+2011-03-29 19:15:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/playbin2-compressed.c:
+ playbin2: Reset buffer counter in playbin2-compressed tests every time when going to READY
+
+2011-03-25 08:26:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysinkaudioconvert.c:
+ * gst/playback/gstplaysinkaudioconvert.h:
+ * gst/playback/gstplaysinkvideoconvert.c:
+ * gst/playback/gstplaysinkvideoconvert.h:
+ playsink: Add audio and video converter convenience bins
+ These reconfigure based on the caps and plugin in converters if
+ necessary. This also makes switching between compressed and raw
+ streams work flawlessly without loosing the states of any element
+ somewhere or having running time problems.
+
+2011-03-15 12:51:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2/playsink: Decide if A/V caps are raw only inside playsink
+ Before playbin2 would use different selectors for raw audio and
+ compressed audio (and the same for video) and used different
+ pads from playsink. This made the involved logic much more
+ complex and was not implemented completely in playsink, which
+ made it impossible to support files with a compressed and
+ uncompressed stream that is support by the sink.
+ playbin2 handles raw/non-raw streams the same now and the
+ decision is left to playsink, which now can also handle
+ caps changes from raw to non-raw and the other way around.
+ Fixes bug #632788.
+
+2011-03-15 11:41:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/playbin2-compressed.c:
+ playbin2: Add unit test for compressed stream support in playbin2/playsink
+
+2011-05-09 12:56:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsasrc.c:
+ alsasrc: Fix some compilation errors
+
+2011-05-09 11:50:05 +0200 Pontus Oldberg <pontus.oldberg@invector.se>
+
+ * ext/alsa/gstalsasrc.c:
+ * ext/alsa/gstalsasrc.h:
+ alsasrc: Improve timestamp accuracy
+ Fixes bug #635256.
+
+2011-05-06 17:01:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Use new, public ghostpad functions
+
+2011-05-03 11:26:32 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Use GST_BOILERPLATE
+
+2011-05-14 09:41:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development
+
+=== release 0.10.34 ===
+
+2011-05-14 01:00:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.34
+
+2011-05-11 19:12:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/video/gstmetavideo.c:
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ -base: remove metadata (des)serialize functions
+
+2011-05-10 18:39:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/adder/gstadder.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamsplitter.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/v4l/gstv4lsrc.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/audio-trickplay.c:
+ * tests/icles/playback/test5.c:
+ * tests/icles/playback/test6.c:
+ -base_port to new query API
+
+2011-05-10 16:44:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * gst/adder/gstadder.c:
+ * gst/encoding/gstencodebin.c:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamsplitter.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ -base: fix for now request pad API
+
+2011-05-10 15:43:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: use new query method names
+
+2011-05-10 13:35:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gsturidecodebin.c:
+ * tests/examples/gio/giosrc-mounting.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ message: don't acces the structure directly
+
+=== release 0.10.33 ===
+
+2011-05-10 09:32:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.33
+ Highlights:
+ - support for 16-bit-per-component video formats
+ - playbin2 fixes and improvements for custom and non-raw sinks
+ - oggmux muxes based on running time now
+ - many other fixes and improvements
+
+2011-05-10 11:54:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ event: don't access the event structure
+ the event structure is now hidden, so don't access it directly.
+
+2011-05-09 18:53:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/theora/gsttheoradec.c:
+ * gst/playback/gststreamsynchronizer.c:
+ qos: _qos_full -> _qos
+
+2011-05-09 18:16:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/adder/gstadder.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/videorate/gstvideorate.c:
+ segment: fix for new core API
+ Fix for gst_*_segment_full rename.
+
+2011-05-09 16:42:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: abs_rate is removed from segment structure
+
+2011-05-09 15:41:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: use the right pad
+
+2011-05-09 15:37:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * ext/libvisual/visual.c:
+ visual: use CAPS event to configure caps
+
+2011-05-09 15:37:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/vorbis/gstvorbisdec.c:
+ theora/vorbis: use default pad handler
+ Use the default pad event handler because we are not supposed to pass on CAPS
+ events.
+
+2011-05-09 13:05:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tags.c:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaysink.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/videorate/gstvideorate.c:
+ * tests/examples/app/appsink-src.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/examples/snapshot/snapshot.c:
+ -base: don't use buffer caps
+ Port to newest 0.11 core API, remove GST_PAD_CAPS and GST_BUFFER_CAPS.
+
+2011-05-08 13:24:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: fix getcaps function
+ Explicitely get the possible caps in the sinkpad instead of using an old removed
+ function.
+
+2011-05-08 13:09:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: avoid setting caps on buffers
+ We don't need to set caps on buffers anymore, this is now done with a caps
+ event.
+
+2011-05-06 11:31:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: avoid unreffing a NULL object
+
+2011-05-05 18:47:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Update for new GstIterator API
+
+2011-05-05 18:47:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Update for new GstIterator API
+
+2011-05-05 18:38:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gststreamselector.c:
+ streamselector: Return a NULL iterator instead of an empty iterator that returns NULL if there's no otherpad
+
+2011-05-05 18:35:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybasebin.c:
+ playbasebin: Update for new GstIterator API
+
+2011-05-05 18:29:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Fix usage of gst_iterator_fold()
+
+2011-05-05 16:05:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: Update exports
+
+2011-05-05 16:04:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/icles/playback/test5.c:
+ * tests/icles/playback/test6.c:
+ icles: Update for new GstIterator API
+
+2011-05-05 16:03:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/encoding/gstencodebin.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ gst: Update for new GstIterator API
+
+2011-05-05 15:30:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/pipelines/capsfilter-renegotiation.c:
+ capsfilter-renegotiation: Fix for the removal of the bufferalloc function
+
+2011-05-03 12:57:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Send reconfigure event upstream if the window geometry changes
+
+2011-04-28 10:55:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Add caps with the current window geometry to the top in getcaps
+
+2011-01-17 14:12:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/pipelines/capsfilter-renegotiation.c:
+ tests: capsfilter-renegotiation: New renegotiation use cases
+ Adds some new tests for renegotiation use cases that would
+ use the new renegotiate event
+
+2011-04-29 14:14:53 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * tests/check/libs/profile.c:
+ base: presets moved from $HOME/.gstreamer-0.11 to $HOME/.local/share/gstreamer-0.11
+
+2011-05-03 09:49:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+
+2011-05-02 11:11:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/theora/gsttheoradec.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/xvimage/xvimagesink.c:
+ plugins: fix for allocation query API change
+
+2011-04-30 17:35:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * po/da.po:
+ * po/de.po:
+ * po/fr.po:
+ * po/uk.po:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.32.4 pre-release
+
+2011-04-30 17:21:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.c:
+ gst: update orc-generated disted C backup code to orc 0.4.14
+
+2011-04-29 18:23:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: add bufferpool support to libvisual
+
+2011-04-29 16:52:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoradec.h:
+ theoradec: use bufferpool
+
+2011-04-29 13:48:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/videoscale.c:
+ tests: make unit tests compile
+
+2011-04-29 13:28:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/subparse/gstsubparse.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ remove buffer_alloc
+
+2011-04-29 12:10:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ videotestsrc: use ALLOCATION query
+ Use the allocation query to get the buffer parameters and potentially a
+ bufferpool from downstream. Use the bufferpool to create buffers.
+
+2011-04-29 12:09:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: implement ALLOCATION query
+
+2011-04-29 11:27:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ metavideo: add flags and a define for the API
+
+2011-04-28 19:28:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+
+2011-04-28 19:20:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/gstmetavideo.c:
+ * gst-libs/gst/video/gstmetavideo.h:
+ metavideo: first attempt at video metadata
+ Add a first version of video metadata for buffers that can contain more info
+ about the video such as strides and flags etc.
+
+2011-04-27 12:09:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * po/bg.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * po/sl.po:
+ * po/tr.po:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.32.3 pre-release
+
+2011-04-25 11:32:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ tests: fix test
+
+2011-04-25 11:20:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/videoscale/gstvideoscale.c
+
+2011-04-24 18:45:40 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_image.c:
+ videoscale: Fix off-by-one error in previous commit
+ Fix for 7c0b702e. It helps to get your j+1's right.
+
+2011-04-24 18:16:20 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_image.c:
+ videoscale: Fix ARGB bilinear scaling
+ Fixes #648548. Orc generates bad code for
+ gst_videoscale_orc_resample_merge_bilinear_u32, so we'll use the
+ slightly slower two-stage process. I'd fix Orc, but it's hard to
+ get excited about fixing a feature that I'm planning to deprecate
+ and replace.
+
+2011-04-23 13:42:23 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_image.c:
+ videoscale: hack to fix invalid reads in linear
+ https://bugzilla.gnome.org/show_bug.cgi?id=633837
+
+2011-04-23 12:46:09 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: protect 4tap from out-of-bounds reads
+ https://bugzilla.gnome.org/show_bug.cgi?id=633837
+
+2011-04-24 14:03:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From c3cafe1 to 46dfcea
+
+2011-04-23 12:44:50 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: use simpler scaling method for small images
+ https://bugzilla.gnome.org/show_bug.cgi?id=633837
+
+2011-04-14 09:32:19 +0200 Marc Plano-Lesay <marc.planolesay@gmail.com>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: fix unused-but-set-variable warnings with gcc 4.6
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-22 13:55:20 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ tag: exif: register common tags from tag library
+ Exif uses tags like image-vertical-ppi or image-horizontal-ppi which are
+ registered in gst_tag_register_musicbrainz_tags(), but neither GstExifReader
+ nor GstExifWriter register them.
+ https://bugzilla.gnome.org/show_bug.cgi?id=648459
+
+2011-04-24 12:16:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tag: update some FIXMEs for 0.11
+
+2011-04-21 14:11:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ tests: add unit test for basetransform/videoscale negotiation regression
+ Turn Rene's test pipeline into a unit test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=648220
+
+2011-04-19 16:40:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/v4l/gstv4lelement.c:
+ * sys/v4l/gstv4lsrc.c:
+ v4l: use G_DEFINE_TYPE
+
+2011-04-19 14:31:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ audiofilter: GstElement takes ownership of pad templates and it should be called from class_init now, not base_init
+
+2011-04-19 14:21:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/audiorate.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/playbin2.c:
+ * tests/check/elements/videoscale.c:
+ * tests/check/libs/cddabasesrc.c:
+ * tests/check/libs/mixer.c:
+ * tests/check/libs/navigation.c:
+ * tests/check/libs/xmpwriter.c:
+ tests: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 14:11:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsamixerelement.c:
+ * ext/alsa/gstalsamixertrack.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * ext/vorbis/gstvorbistag.c:
+ ext: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 11:44:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ sys: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 11:36:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Remove filter-length property, it only existed for backward compatibility
+
+2011-04-19 11:35:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiorate/gstaudiorate.h:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c:
+ gst: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 10:54:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ cddabasesrc: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 10:52:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audio: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-19 10:47:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ app: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 18:30:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ gstbasertppayload: Use g_once_init_{enter,leave}() in the _get_type() function
+
+2011-04-18 18:29:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ rtp: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 13:23:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2010-11-25 17:01:53 +0100 Håvard Graff <havard.graff@.eu.tandberg.int>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: make sure to not start if the may_start flag is FALSE
+ Fixes #635784
+
+2011-04-18 11:24:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: If NULL caps are passed to buffer_alloc() do fallback allocation
+ Fixes bug #647857.
+
+2011-04-18 10:19:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/pipelines/oggmux.c:
+ oggmux: Remove bus GSource to prevent a valgrind warning
+
+2011-04-18 09:16:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/pipelines/gio.c:
+ gio: Remove the bus GSource from the main context
+ Prevents a valgrind warning about possibly leaked memory,
+ see bug #647763.
+
+2011-04-17 19:33:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/sdp/Makefile.am:
+ sdp: remove gst_init() for g-i scanner here again as well to avoid problems with -Wl,--as-needed
+
+2011-04-17 17:59:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/fft/Makefile.am:
+ fft: remove gst_init() for g-i scanner again
+ libgstfft doesn't actually use any symbols from libgstreamer, so when
+ compiling with -Wl,--as-needed it won't even link to it, which can
+ cause failures with older versions of g-i that ignore the --pkg
+ arguments.
+ Should fix PPA build failure on Ubuntu Maverick
+
+2011-04-16 16:31:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Always hold the class-global pango mutex when using pango API
+
+2011-04-16 16:23:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttimeoverlay.c:
+ {time,clock}overlay: Hold the class-global pango mutex when changing the pango context
+
+2011-04-16 16:21:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttimeoverlay.c:
+ {clock,time}overlay: Only set the global pango context options once in class_init
+ Instead of doing it over and over again when instantiating a new instance.
+
+2011-04-16 16:18:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ pango: Create a new pango context for every subclass
+ timeoverlay/clockoverlay are setting some global options
+ on the context that shouldn't be used for the generic textoverlay.
+
+2011-04-16 16:03:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/video-enumtypes.c:
+ 0.10.32.2 pre-release
+
+2011-04-16 15:58:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/adder/gstadderorc-dist.c:
+ * gst/adder/gstadderorc-dist.h:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.h:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ gst: update disted orc backup code
+
+2011-04-16 15:50:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ docs: update documentation
+
+2011-04-16 15:42:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translations
+
+2011-03-31 17:56:00 +0000 Thibault Saunier <thibault.saunier@collabora.co.uk>
+
+ * Android.mk:
+ * configure.ac:
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/gstvorbisdeclib.h:
+ vorbis: add support for using tremolo on android
+ Tremolo is an ARM-optimised version of xiph's tremor library.
+
+2011-04-16 16:14:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: Update new code for 0.11 buffer API
+
+2011-04-16 16:06:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-16 15:56:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/Makefile.am:
+ * ext/pango/gstbasetextoverlay.c:
+ * ext/pango/gstbasetextoverlay.h:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gstclockoverlay.h:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/pango/gsttimeoverlay.h:
+ pango: Create a new base class for all the elements
+ This prevents the ugly hack where the text_sink pad template
+ was only added for textoverlay but not for the subclasses.
+ Also makes this work with the core change that made
+ subclasses inherit the templates of their parent class.
+
+2011-04-15 13:36:39 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggmux: prefer headers from caps to determine stream type
+ Ogg mandates the first header packet must determine a stream's type.
+ However, some streams (such as VP8) do not include such a header
+ when muxed in other containers, and thus do not include this header
+ as a buffer, but only in caps. We thus use headers from caps when
+ available to determine a new stream's type.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647856
+
+2011-04-16 11:00:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ libs: gobject-introspection scanner doesn't need to scan or update plugin info
+ Make sure the scanner doesn't load or introspect or check any plugins,
+ (especially not outside the build directory).
+
+2011-04-16 09:33:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-16 09:12:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-15 21:09:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: list libs/struct*h files explicitly in Makefile.am
+ Hopefully makes the gentoo buildbot happy again.
+
+2011-04-15 11:11:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: avoid foregoing READY_TO_NULL when appropriate
+
+2011-04-14 22:13:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: ensure proper PAUSED_TO_READY cleanup
+ ... since going async to PAUSED might fail, and never making it to PAUSED
+ subsequently skips going down to READY.
+ Fixes #647781.
+
+2011-04-14 12:42:20 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ Revert "video: Remove the extensive checkings from switch"
+ This reverts commit 500d14c35c656890686574e1c041fb556df17056.
+
+2011-04-14 13:15:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ encodebin: Unref encoding profiles after usage in the test
+
+2011-04-14 12:55:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ encodebin: Release pads after setting the state to NULL in the unit test
+ See bug #647756.
+
+2011-04-14 12:23:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Set all elements to NULL and remove them from the bin when removing a source group
+
+2011-04-14 00:26:34 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * gst-libs/gst/video/video.c:
+ video: Remove the extensive checkings from switch
+ The default case handles them already
+
+2011-04-13 23:17:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: tag: Fix typo
+
+2011-04-13 23:17:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds mapping for GST_TAG_CAPTURING_EXPOSURE_COMPENSATION
+ Adds mapping for GST_TAG_CAPTURING_EXPOSURE_COMPENSATION for xmp
+ library.
+ Includes unit tests.
+
+2011-04-13 23:16:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds mapping for GST_TAG_CAPTURING_EXPOSURE_COMPENSATION
+ Adds mapping for GST_TAG_CAPTURING_EXPOSURE_COMPENSATION for exif
+ library.
+ Includes unit tests.
+
+2011-04-13 23:13:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tag: Adds GST_TAG_CAPTURING_EXPOSURE_COMPENSATION
+ Adds a new tag for indicating the used exposure compensation
+ level in EV used when capturing an image.
+ API: GST_TAG_CAPTURING_EXPOSURE_COMPENSATION
+
+2011-04-14 00:24:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/encoding/gstcapslist.c:
+ * tests/examples/gio/giosrc-mounting.c:
+ * tests/examples/playrec/playrec.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ tests: fix unused-but-set-variable warnings with gcc 4.6
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-13 23:57:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: fix unused-but-set-variable warnings with gcc 4.6
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-13 23:19:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: fix unused-but-set-variable warnings with gcc 4.6
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-13 22:59:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: fix unused-but-set-variable warning with gcc 4.6
+ We don't compare the bitrates of consecutive mp3 frames on purpose
+ here.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-13 09:10:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ docs: fix typo in video format docs
+
+2011-04-12 12:41:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: fix uninitialised variable usage and element leak
+ gcc on OSX complains about ret being used uninitialized in
+ this function, and it is right. Don't leak element ref
+ when returning early because newsegment event is not in
+ TIME format.
+
+2011-04-12 12:20:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: do check return values of fcntl() and fstat()
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-09 19:15:23 +0200 Marc Plano-Lesay <marc.planolesay@gmail.com>
+
+ * gst/playback/gstplaybasebin.c:
+ * gst/subparse/tmplayerparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/videoscale/vs_image.c:
+ fix unused-but-set-variable warnings with gcc 4.6
+ https://bugzilla.gnome.org/show_bug.cgi?id=647294
+
+2011-04-06 22:57:41 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ rtsptranport: ensure valid int result when parsing ranges
+ Specifically, make sure that the return value of strtol is falling in
+ between the range of G_MININT and G_MAXINT.
+ Fixes #646952.
+
+2011-04-06 16:27:54 +0100 Bastien Nocera <hadess@hadess.net>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ encoding-profile: fix unused-but-set-variable warnings with gcc 4.6
+ Top-level profiles don't have restrictions, only stream profiles,
+ so no need to serialise that here.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646925
+
+2011-04-11 14:29:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: dist all struct_*.h files for libs ABI test
+ Should fix distcheck on x86_64.
+
+2011-04-11 15:02:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: empty caps have no structure to pick
+
+2011-04-11 11:37:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ android/alsa.mk
+ android/app.mk
+ android/app_plugin.mk
+ android/audio.mk
+ android/audioconvert.mk
+ android/decodebin.mk
+ android/decodebin2.mk
+ android/gdp.mk
+ android/interfaces.mk
+ android/netbuffer.mk
+ android/pbutils.mk
+ android/playbin.mk
+ android/queue2.mk
+ android/riff.mk
+ android/rtp.mk
+ android/rtsp.mk
+ android/sdp.mk
+ android/tag.mk
+ android/tcp.mk
+ android/typefindfunctions.mk
+ android/video.mk
+
+2011-04-11 10:06:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ tag: fix typo in ID3 genres
+ psychadelic -> psychedelic. Spotted by Sébastien Wilmet.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647399
+
+2011-01-27 17:28:51 +0100 Alessandro Decina <alessandro.d@gmail.com>
+
+ * Android.mk:
+ * android/alsa.mk:
+ * android/app.mk:
+ * android/app_plugin.mk:
+ * android/audio.mk:
+ * android/audioconvert.mk:
+ * android/audioresample.mk:
+ * android/audiotestsrc.mk:
+ * android/decodebin.mk:
+ * android/decodebin2.mk:
+ * android/ffmpegcolorspace.mk:
+ * android/gdp.mk:
+ * android/gst-libs/gst/app/gstapp-marshal.c:
+ * android/gst-libs/gst/app/gstapp-marshal.h:
+ * android/gst-libs/gst/audio/audio-enumtypes.c:
+ * android/gst-libs/gst/audio/audio-enumtypes.h:
+ * android/gst-libs/gst/interfaces/interfaces-enumtypes.c:
+ * android/gst-libs/gst/interfaces/interfaces-enumtypes.h:
+ * android/gst-libs/gst/interfaces/interfaces-marshal.c:
+ * android/gst-libs/gst/interfaces/interfaces-marshal.h:
+ * android/gst-libs/gst/pbutils/pbutils-enumtypes.c:
+ * android/gst-libs/gst/pbutils/pbutils-enumtypes.h:
+ * android/gst-libs/gst/rtsp/gstrtsp-enumtypes.c:
+ * android/gst-libs/gst/rtsp/gstrtsp-enumtypes.h:
+ * android/gst-libs/gst/rtsp/gstrtsp-marshal.c:
+ * android/gst-libs/gst/rtsp/gstrtsp-marshal.h:
+ * android/gst-libs/gst/video/video-enumtypes.c:
+ * android/gst-libs/gst/video/video-enumtypes.h:
+ * android/gst/playback/gstplay-marshal.c:
+ * android/gst/playback/gstplay-marshal.h:
+ * android/gst/tcp/gsttcp-enumtypes.c:
+ * android/gst/tcp/gsttcp-enumtypes.h:
+ * android/gst/tcp/gsttcp-marshal.c:
+ * android/gst/tcp/gsttcp-marshal.h:
+ * android/interfaces.mk:
+ * android/netbuffer.mk:
+ * android/pbutils.mk:
+ * android/playbin.mk:
+ * android/queue2.mk:
+ * android/riff.mk:
+ * android/rtp.mk:
+ * android/rtsp.mk:
+ * android/sdp.mk:
+ * android/tag.mk:
+ * android/tcp.mk:
+ * android/typefindfunctions.mk:
+ * android/video.mk:
+ * android/videoscale.mk:
+ * android/videotestsrc.mk:
+ * ext/ogg/Makefile.am:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ * gst/adder/Makefile.am:
+ * gst/app/Makefile.am:
+ * gst/audioconvert/Makefile.am:
+ * gst/audiorate/Makefile.am:
+ * gst/audioresample/Makefile.am:
+ * gst/audiotestsrc/Makefile.am:
+ * gst/encoding/Makefile.am:
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.h:
+ * gst/gdp/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/tcp/Makefile.am:
+ * gst/typefind/Makefile.am:
+ * gst/videorate/Makefile.am:
+ * gst/videoscale/Makefile.am:
+ * gst/videotestsrc/Makefile.am:
+ * gst/volume/Makefile.am:
+ * tools/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-09 02:01:08 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Add new header file to spec file
+
+2011-04-08 15:10:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtp: Unref events if the parent element disappeared or has no event handler implemented
+
+2011-01-06 18:20:58 +0100 Ole André Vadla Ravnås <oravnas@cisco.com>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtp: 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.
+
+2011-03-20 08:59:33 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Make src query MT-safe
+ It is possible that the element might be going down while the event arrives
+
+2011-04-08 15:00:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: Unref events if the parent element disappeared
+
+2011-03-21 16:03:16 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: make upstream queries and events MT-safe
+
+2011-04-07 16:19:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/rtp/gstbasertpdepayload.c
+
+2011-04-07 16:07:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ ximage: don't share the memory
+ We can't share the memory on the buffer with other buffers because the metadata
+ X(v)Image points to it and we don't want it to go away.
+
+2011-04-06 16:25:37 +0100 Bastien Nocera <hadess@hadess.net>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: Remove unused variables
+ https://bugzilla.gnome.org/show_bug.cgi?id=646924
+
+2011-04-07 10:06:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix creation of grayscale caps
+ The endianness was not set correctly before.
+ Fixes bug #646923.
+
+2011-04-06 19:21:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: make the show_frame function prettier
+
+2011-04-06 17:54:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ ximage: more fixes
+
+2011-04-06 16:33:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ ext/theora/gsttheoraenc.c
+
+2011-04-06 16:26:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ ximage: more fixes
+
+2011-04-06 16:11:02 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * docs/design/part-interlaced-video.txt:
+ docs: Update interlaced video design document
+ The RFF flag is to be reused for buffers in the telecine state to
+ indicate that the buffer contains only unneeded repeated fields that are
+ present in other buffers and as such this buffer can be dropped.
+
+2011-04-06 12:26:47 +0200 benjamin gaignard <benjamin.gaignard@linaro.org>
+
+ * sys/ximage/ximage.c:
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagepool.h:
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/Makefile.am:
+ * sys/xvimage/xvimage.c:
+ * sys/xvimage/xvimagepool.c:
+ * sys/xvimage/xvimagepool.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ xvimagesink: use bufferpool
+ Improve bufferpool handling in ximagesink.
+ Implement bufferpool handling on xvimagesink.
+ Based on patches from benjamin gaignard <benjamin.gaignard@linaro.org>
+
+2011-03-25 16:59:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: refactor multipass file writing
+
+2011-02-08 14:02:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: minor simplification
+ ... which avoids crashing in the off-chance that structure == NULL.
+
+2011-04-05 18:14:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/.gitignore:
+ * tests/check/libs/discoverer.c:
+ tests: add basic unit tests for discoverer
+
+2010-08-24 13:14:33 +0200 Pascal Buhler <pascal.buhler@tandberg.com>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ rtcpbuffer: Round to next 32bit word, not current 32bit word at end of SDES chunk
+
+2011-04-05 11:32:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: don't paint the window black when going to NULL
+ Leave dealing with the appearance of the window when we are not playing to the
+ applications. We anyway want to go to NULL as quickly as possible.
+ Fixes #635800
+
+2011-04-04 16:00:30 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * tests/check/libs/video.c:
+ video: Fix YUV9 and YVU9 again
+
+2011-04-04 23:41:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ tag: fix compiler warning on OSX
+ gstvorbistag.c: In function 'gst_tag_list_from_vorbiscomment_buffer':
+ gstvorbistag.c:371: warning: 'data' may be used uninitialized in this function
+
+2011-04-04 23:23:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/.gitignore:
+ tests: ignore xmpwriter unit test binary
+
+2011-04-04 17:21:45 +0200 Haakon Sporsheim <haakon.sporsheim@gmail.com>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: use gst/math-compat.h header.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646744
+
+2011-04-04 17:23:53 +0200 Haakon Sporsheim <haakon.sporsheim@gmail.com>
+
+ * gst-libs/gst/tag/xmpwriter.c:
+ tag: Remove constness to silence MS compiler.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646744
+
+2011-04-04 17:23:13 +0200 Haakon Sporsheim <haakon.sporsheim@gmail.com>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: Explicit cast to GThreadFunc to silence MS compiler.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646744
+
+2011-04-04 15:56:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 1ccbe09 to c3cafe1
+
+2011-04-04 11:44:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * tests/check/libs/video.c:
+ fix compilation after merge
+
+2011-04-04 11:31:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst-libs/gst/tag/gstvorbistag.c
+
+2011-03-11 10:41:11 +0100 Trond Andersen <trondand@cisco.com>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ rtcpbuffer: fix invalid read in validation of padding in rtcp packet
+
+2011-02-23 10:55:12 +0100 Stian Johansen <stian.johansen@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: Add src object lock around call to ringbuffer parse caps.
+ A race was observed between query() and setcaps() where the latter would
+ change the ringbuffer spec while the former was performing operations
+ based this data.
+
+2011-01-22 23:09:32 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: protect against ringbuffer disappearing while in a query
+ Observed a case where the src went to null-state during the query,
+ hence the spec pointer was no longer valid, and
+ gst_util_unit64_scale_int crashed (assertion `denom > 0´failed)
+ Add locking to make sure the ringbuffer can't disappear.
+
+2011-02-08 18:27:43 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: don't allow aligning behind the read-segment
+ Given a large enough drift-tolerance, one could end up in a situation
+ where one would keep aligning the written buffers behind the current
+ read-segment position. The result for the reader would be complete
+ silence, possible preceded by very choppy audio.
+ By checking the available headroom, one can determine if there is
+ room to do alignment, or if one should resort to a resync instead to get
+ the pointers back on track.
+ Also refactor the alignment-logic out of the render function for cleaner
+ code.
+
+2011-04-01 13:55:26 -0700 David Schleef <ds@schleef.org>
+
+ * gst/encoding/Makefile.am:
+ * gst/playback/Makefile.am:
+ Remove setting of plugindir from Makefiles
+
+2011-03-23 23:10:51 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * tests/check/libs/video.c:
+ video: Fix height calculation for YUV9/YVU9
+
+2011-04-01 15:34:30 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: fix warning building in mac os x
+
+2011-04-01 15:33:42 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: fix comparison is always false due to limited range of data type
+ Perform calculation in a temp var with enough room as there's guarantee that
+ ret will be able to hold the result for example in _blit_AYUV.
+
+2011-04-01 12:52:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Write GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE as METADATA_BLOCK_PICTURE
+ This is the official, standardized way of embedding images into
+ vorbiscomments now.
+
+2011-04-01 12:28:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Add support for METADATA_BLOCK_PICTURE tags
+ This is the official, standardized way of embedding pictures
+ inside vorbiscomments now. Parsing code taken from flacparse
+ and slightly changed.
+ Fixes bug #635669.
+
+2011-04-01 12:09:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Use g_base64_decode_inplace()
+ Instead of using the GLib base64 decoding functions manually to
+ do inplace base64 decoding. This makes the code easier to understand.
+
+2011-04-01 11:00:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: Store the segment directly inside the pad
+ Also initialize it always in TIME format. We require TIME segments
+ in oggmux anyway and drop newsegment events in other formats and
+ assume an open-ended segment starting at 0.
+
+2011-04-01 10:57:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Reset the segment on flush-stop events and when going back to READY
+
+2011-03-03 08:45:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Use running time instead of timestamps
+ Theora and vorbis use running time (which is correct) for calculating
+ the granulepos for their ogg packets. Oggmux, however, used
+ timestamps to order the received buffers.
+ This patch makes it use the running time to compare buffer times
+ and also to timestamp pushed buffers.
+ Some bits of the code still use timestamps, but they are only
+ used to calculate durations, so it should be fine.
+ https://bugzilla.gnome.org/show_bug.cgi?id=643775
+
+2011-02-16 16:07:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: Keep track of pad's segments
+ https://bugzilla.gnome.org/show_bug.cgi?id=643775
+
+2011-04-01 10:39:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Add support for xBGR and RGBx
+ Now all RGB variants are supported.
+
+2011-01-17 21:12:18 -0700 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Added support for ARGB and other RGB alpha variants
+
+2011-01-11 10:34:33 -0700 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: converted AYUV to use 'A OVER B' alpha compositing
+ 'A OVER B' compositing is explained at
+ http://en.wikipedia.org/wiki/Alpha_compositing.
+ Previously, overlaying text on a transparent background image left the
+ text overlay also transparent. This pipeline shows such an example:
+ gst-launch videotestsrc pattern=white ! video/x-raw-yuv,format=\(fourcc\)AYUV ! alpha alpha=0.0 ! textoverlay text=Testing auto-resize=False font-desc=60px ! videomixer ! ffmpegcolorspace ! autovideosink
+ With this patch, text is composited "OVER" the background image and
+ thus is visible regardless of the alpha of the background image. The
+ overlay in the above pipeline works after applying this patch.
+
+2011-03-31 18:40:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_x86_64.h:
+ * tests/check/libs/xmpwriter.c:
+ fixes for new API
+
+2011-03-31 17:53:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-03-31 17:47:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst/gdp/gstgdppay.c:
+ * tests/check/elements/appsink.c:
+ bufferlist: fixes for new API
+
+2011-03-28 22:00:25 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ baseaudiosink: arrange for running clock when rendering eos
+ Commit ba2e500bd992d8ad7db0da923801964964835967 ensured to provide
+ a running clock when EOS had finished rendering. However,
+ other measures are needed (and were in place before) to ensure a
+ running clock when EOS still needs rendering (i.e. waiting).
+ So, specifically, re-introduce eos_rendering removed in aforementioned commit,
+ this time as a public variable so subclasses can be aware of the situation.
+ Fixes (part of) #645961.
+ API: GstBaseAudioSink:eos_rendering
+
+2011-03-31 12:37:32 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_i386_osx.h:
+ tests: Fixes libsabi for MacOSX/32bit.
+ GStaticRecMutex is 60bytes on macosx/32bit (As opposed to 40).
+ Fixes #644996
+
+2011-03-31 10:38:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_x86_64.h:
+ libsabi: Add structure sizes for x86-64
+
+2011-03-09 11:51:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ libs: make sure gobject-introspection scanner calls gst_init()
+ Cherry-picked from 0.11, since it's the right thing to do (we
+ now silently rely on various _get_type() working without
+ gst_init() having been called).
+
+2011-03-30 20:57:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ libs: replace 0.10 with @GST_MAJORMINOR@ in Makefile.am
+ For easier cherry-picking/merging later.
+
+2011-03-30 20:35:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmp: fix after merge conflict
+
+2011-03-30 20:23:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11-fdo
+ Conflicts:
+ gst-libs/gst/tag/gstxmptag.c
+
+2011-03-30 16:50:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/riff/riff-read.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst/audiorate/gstaudiorate.c:
+ Fix for latest API changes
+
+2011-03-30 15:47:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/typefindfunctions.c:
+ * tests/files/Makefile.am:
+ * tests/files/hls.m3u8:
+ tests: add typefind test for application/x-hls
+ To make sure we don't break detection when we add typefinding
+ for normal m3u8 playlists.
+
+2011-03-30 15:44:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: rename type playlist/m3u8 to application/x-hls
+ We should keep playlist/m3u8 available for normal m3u8 playlists,
+ which we we'll likely support some day. Also, we probably don't
+ want this handled like other playlists, so application/* seems
+ more appropriate in this case, even if it's really just a playlist.
+
+2011-03-30 09:18:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Fix comment typo and add a link the the HTTP live streaming spec
+
+2011-03-30 09:12:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Use the DataScanCtx for the m3u8 typefinder
+
+2011-02-14 19:05:09 +0100 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: add m3u8 playlists
+
+2011-03-21 15:34:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/xmpwriter.c:
+ tagxmpwriter: Add check tests
+ https://bugzilla.gnome.org/show_bug.cgi?id=645167
+
+2011-03-17 15:42:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/xmpwriter.c:
+ * gst-libs/gst/tag/xmpwriter.h:
+ * win32/common/libgsttag.def:
+ tagxmpwriter: Adds a new GstTagXmpWriter interface
+ The GstTagXmpWriter interface is to be implemented on elements that
+ provide xmp serialization. It allows users to select which
+ xmp schemas should be used on serialization.
+ API: GstTagXmpWriter
+ https://bugzilla.gnome.org/show_bug.cgi?id=645167
+
+2011-03-18 09:28:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * gst-libs/gst/tag/tag.h:
+ * win32/common/libgsttag.def:
+ tag: xmp: Add function to list the available schemas
+ Adds a function to list the available schemas in our xmp lib
+ https://bugzilla.gnome.org/show_bug.cgi?id=645167
+
+2011-03-29 15:41:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ encodebin: Requesting a pad again now gives a g_return_val_if_fail()
+ Before the behaviour was undefined and implemented differently by elements,
+ now core checks for this (and other problems) and returns NULL and an assertion.
+
+2011-03-29 11:08:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ remove deprecated buffer methods
+
+2011-03-28 20:19:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggparse.c:
+ oggparse: fix for _make_writable
+
+2011-03-28 20:13:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11-fdo
+
+2011-03-28 19:23:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisenc.c:
+ * gst-libs/gst/audio/audio.c:
+ * tests/check/pipelines/vorbisenc.c:
+ * win32/common/libgstapp.def:
+ * win32/common/libgstnetbuffer.def:
+ * win32/common/libgstrtp.def:
+ * win32/common/libgsttag.def:
+ tests: fix more checks
+
+2011-03-28 18:42:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * tests/check/libs/rtp.c:
+ tests: fix RTP and RTCP unit tests
+
+2011-03-28 18:22:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ test: fic tag check
+
+2011-03-28 18:17:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/profile.c:
+ tests: fix patch names and g_object_unref
+
+2011-03-28 18:01:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/pbutils.c:
+ tests: fix version number checks
+
+2011-03-28 17:58:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ netbuffer: fix netbuffer add function
+
+2011-03-28 17:53:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ tests: fix more tests
+ refcounts are always 1 because subbuffers don't ref the original buffer anymore,
+ just the memory.
+
+2011-03-28 17:46:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/gdppay.c:
+ * tests/check/elements/subparse.c:
+ tests: fix more unit tests
+
+2011-03-28 17:02:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ encodebin: fix new profile unref
+
+2011-03-28 16:54:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.c:
+ * tests/check/elements/decodebin.c:
+ * tests/check/elements/decodebin2.c:
+ * tests/check/elements/textoverlay.c:
+ * tests/check/elements/vorbistag.c:
+ * tests/check/pipelines/vorbisenc.c:
+ tests: fix some unit tests
+
+2011-03-28 15:51:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/gstlibscpp.cc:
+ * tests/check/libs/video.c:
+ * tests/check/pipelines/streamheader.c:
+ tests: fix remaining unit tests
+
+2011-03-28 14:12:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/appsink.c:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/audiorate.c:
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/decodebin.c:
+ * tests/check/elements/decodebin2.c:
+ * tests/check/elements/ffmpegcolorspace.c:
+ * tests/check/elements/gdpdepay.c:
+ * tests/check/elements/gdppay.c:
+ * tests/check/elements/gnomevfssink.c:
+ * tests/check/elements/multifdsink.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/playbin2.c:
+ * tests/check/elements/subparse.c:
+ * tests/check/elements/textoverlay.c:
+ * tests/check/elements/videorate.c:
+ * tests/check/elements/videoscale.c:
+ * tests/check/elements/videotestsrc.c:
+ * tests/check/elements/volume.c:
+ * tests/check/elements/vorbisdec.c:
+ * tests/check/elements/vorbistag.c:
+ * tests/check/gst/typefindfunctions.c:
+ * tests/check/libs/audio.c:
+ * tests/check/libs/cddabasesrc.c:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/netbuffer.c:
+ * tests/check/libs/profile.c:
+ * tests/check/libs/rtp.c:
+ * tests/check/libs/struct_i386.h:
+ * tests/check/libs/tag.c:
+ * tests/check/pipelines/oggmux.c:
+ * tests/examples/app/appsink-src.c:
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ * tests/examples/app/appsrc_ex.c:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/examples/snapshot/snapshot.c:
+ * tests/icles/playbin-text.c:
+ tests: work on porting the unit tests
+
+2011-03-28 10:25:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: improve comment
+
+2011-03-28 10:20:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * ext/vorbis/gstvorbistag.c:
+ * tools/gst-discoverer.c:
+ plugins: more porting
+
+2011-03-27 20:15:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoraparse.c:
+ theora: port to new memory API
+
+2011-03-27 18:30:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tag.h:
+ plugins: more porting to new memory API
+
+2011-03-27 17:16:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/libvisual/visual.c:
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ plugins: fix for new memory API
+
+2011-03-27 16:35:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcp.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c:
+ plugins: port some plugins to the new memory API
+
+2011-03-27 13:55:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst-libs/gst/riff/riff-read.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/gstvideofilter.c:
+ libs: port to new data API
+
+2011-03-26 19:36:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggparse.c:
+ oggparse: fix list iteration code
+ Not that it really matters, but let's fix it before someone
+ notices and makes fun of us.
+
+2011-03-26 12:01:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/.gitignore:
+ tests: ignore new libsabi test binary
+
+2011-03-26 11:59:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggparse.c:
+ oggparse: make sure buffer metadata is writable before setting caps on buffers
+
+2011-03-25 22:14:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 193b717 to 1ccbe09
+
+2011-03-25 19:52:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tags: port to new metadata and memory API
+
+2011-03-25 14:55:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From b77e2bf to 193b717
+
+2011-03-25 11:06:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/Makefile.am:
+ docs: do xrefs for non installed books too
+ Get the xrefs from the builddir for the books in the same package. This fixes
+ the cross references if one does not have the docs already installed.
+
+2011-02-25 16:46:29 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * docs/design/part-interlaced-video.txt:
+ docs: Add an interlaced video design document
+
+2011-03-25 09:29:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From d8814b6 to b77e2bf
+
+2011-03-25 09:03:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 6aaa286 to d8814b6
+
+2011-03-24 18:48:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 6aec6b9 to 6aaa286
+
+2011-03-24 14:22:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Update comment about why an audio queue is needed
+
+2011-03-24 14:21:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ Revert "playsink: Only add a queue before the audio sink if visualizations are enabled"
+ This reverts commit df886c0622257bb8635e5bd0fc7fc3da20bfc3be.
+
+2011-03-24 14:03:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Only add a queue before the audio sink if visualizations are enabled
+ The queue is not needed otherwise and will add some delay to track
+ switches.
+
+2011-03-23 12:42:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ tests: video: Uncommenting test
+ Pushed a commented test by accident, uncommenting it.
+
+2011-03-23 12:02:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ video: adds missing function to win32 def
+
+2011-03-23 12:02:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Getting component offsets without dimensions is fine if it is not YUV
+ This fixes a regression that an assertion would happen if
+ gst_video_get_component_offset would be called with width or
+ height as 0.
+ Calling it with 0 is fine if the format isn't yuv and this
+ was already being used in some other places of video.c
+
+2011-03-23 11:13:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ tests: video: Add a test for checking rgb caps creation
+ This new test for checking rgb caps creation exposes a regression
+
+2011-03-15 14:45:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Remember automatically created sinks for future reconfigures
+ Also allow reuse of sink elements in error cases.
+
+2011-03-16 15:27:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Check if an already existing sink supports the non-raw format too
+ Before we were assuming that a sink will always support all non-raw formats
+ in a single stream.
+
+2011-03-10 19:04:51 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Check if an element accepts requisite caps before selecting
+ In addition to ensuring that an element we want to select in
+ autoplug-select can enter the READY state, we also now check if it can
+ accept the caps we wish to plug it for. This is handy for sinks that
+ need to perform a probe to figure out whether they can actually handle a
+ given format.
+
+2011-03-16 15:56:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Set sinks to READY before checking if it accept caps
+ Fixes bug #642732.
+
+2011-03-16 15:56:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Always prefer the custom set sink and also set it back to NULL in all cases.
+
+2011-03-17 13:47:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Only consider the audio/video sinks in autoplug_continue for the normal uridecodebin
+ Considering them for the subtitle uridecodebin will add audio/video
+ streams that might be in a file used as subtitle file.
+
+2011-03-22 11:59:40 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add gst_video_format_new_template_caps()
+
+2011-02-24 08:42:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Fix assertion on caps fixation
+ When fixating caps, from_par should always be initialized
+ with a fixed value.
+ In case the fixation is from src to sink pad it was setting
+ the from par (srcpad par) to a fraction range, this patch initializes
+ it to 1/1, based on the assumption that missing PAR is 1/1.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641952
+
+2011-03-22 12:44:49 +0100 Luis de Bethencourt <luis@debethencourt.com>
+
+ * configure.ac:
+ configure.ac: redundant use of AC_MSG_RESULT()
+ cleaned the redundant use of AC_MSG_RESULT() in configure.ac
+
+2011-03-18 19:34:57 +0100 Luis de Bethencourt <luis@debethencourt.com>
+
+ * autogen.sh:
+ autogen: wingo signed comment
+
+2011-03-21 19:22:30 +0100 Fraxinas <andreas.frisch@multimedia-labs.de>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ encoding-profile: Fix syntax in Example: Creating a profile
+ https://bugzilla.gnome.org/show_bug.cgi?id=645437
+
+2011-03-21 18:33:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add missing schema creation
+ tiff schema entries were being added to the previous
+ schema (xap) because a new one wasn't being created
+ for it.
+
+2011-03-17 21:50:15 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtpbuffer: Off-by-one error when creating RTP header extensions with a two-byte header
+
+2011-03-16 15:38:31 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: Clean up alignment docs a bit and remove horiz top alignment enum
+
+2011-02-07 09:13:39 +0200 Mart Raudsepp <leio@gentoo.org>
+
+ * tests/check/Makefile.am:
+ check: Really fix the linking order of libs/tag
+ Follow-up to commit 5f5c52c, which only fixed the CFLAGS order.
+ Fix the linker order as well.
+
+2011-03-16 10:19:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: post proper error message if decodebin2/typefind elements are missing
+ Post better error messages in case typefind/decodebin2 are missing or
+ could not be loaded for some reason (e.g. because they inadvertently
+ got blacklisted).
+ https://bugzilla.gnome.org/show_bug.cgi?id=644892
+
+2011-03-15 19:47:11 +0100 Blaise Gassend <blaise@suitabletech.com>
+
+ * ext/alsa/gstalsamixer.c:
+ alsamixer: Store return values of poll functions in a signed integer
+ Negative return values are used for errors and storing
+ them in an unsigned integer will make it impossible to
+ detect the errors.
+ Fixes bug #644845.
+
+2011-03-15 11:11:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11-fdo
+
+2011-03-14 19:42:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Increase the seen header packets count when seeing a header packet
+ This fixes muxing of Speex content and possibly other formats where the
+ header detection works by counting the packets.
+ Fixes bug #644745.
+
+2011-03-14 18:35:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add depth and endianness to DTS caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=644208
+
+2011-03-14 11:14:04 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: use a class wide mutex to work around pango reentrance issues
+ Pango is not reentrant. Use a class wide mutex to protect pange use in
+ gst_text_overlay_render_pangocairo(). This works reliable in contrast to the
+ hack in my previous commit.
+ Fixes Bug #412678
+
+2011-03-14 11:12:53 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/pango/gsttextoverlay.c:
+ Revert "textoverlay: add a hack to init the pango engine"
+ This reverts commit fee3266056b522cdd34e606b5682553d35eec5a1.
+
+2011-03-14 10:09:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin2.c:
+ plaback: trim trailing whitespace
+
+2011-03-14 10:05:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: reflow configuring new multiqueue instance
+ Use a single g_object_set to configure the new multiqueue instance. Also don't
+ needlessly set "use-buffering" if it is the default.
+
+2011-03-04 14:52:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: drop trailing whitespaces
+
+2011-03-04 14:52:28 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: add a hack to init the pango engine
+ Layout a single char to pre-create all resources.
+
+2011-03-12 17:51:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/check/Makefile.am:
+ * tests/check/libs/.gitignore:
+ * tests/check/libs/gstlibscpp.cc:
+ tests: add libscpp unit test to make sure g++ likes our library headers
+
+2011-03-10 14:22:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ tests: encodebin: Add reuse test case
+ Adds a test case to check if encodebin can be reused
+ https://bugzilla.gnome.org/show_bug.cgi?id=644416
+
+2011-03-10 14:38:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Tear down old profiles when setting new ones
+ In NULL/READY, we should be able to switch profiles on encodebin,
+ this patch makes it tear down old profiles when new ones are set
+ if in NULL/READY states
+ https://bugzilla.gnome.org/show_bug.cgi?id=644416
+
+2010-10-22 14:01:26 +0200 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: disconnect inactive clients in the select loop too
+ Clients are usually disconnected in the streaming thread if their inactivity
+ is bigger than the timeout. If no new buffers are to be rendered in the sink,
+ these clients will never be disconnected and for that reason it should be
+ handled in the select() loop too.
+
+2010-10-22 14:01:26 +0200 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: disconnect inactive clients in the select loop too
+ Clients are usually disconnected in the streaming thread if their inactivity
+ is bigger than the timeout. If no new buffers are to be rendered in the sink,
+ these clients will never be disconnected and for that reason it should be
+ handled in the select() loop too.
+
+2011-03-09 11:51:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ libs: make sure gobject-introspection scanner calls gst_init()
+ Fixes introspection failures caused by type assertions/warnings.
+ Since we now moved from _get_type() functions to external GType
+ variables in a couple of places, we actually have to call gst_init()
+ to make sure these are set when we use GST_TYPE_FOO.
+
+2011-03-09 11:45:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ libgstapp: fix backticks in gobject-introspection section of Makefile.am
+
+2010-11-03 14:37:07 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Don't wait for subtitle streams to preroll
+ Subtitle streams being parse can cause the pipeline to wait indefinitely
+ to PREROLL. This makes subtitle streams got to PAUSED even if no data is
+ available. This should not be a cause for concern as we don't expect to
+ get much data for subtitle streams other than language tags from the
+ container.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632291
+
+2011-03-08 17:01:41 +0000 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/ximage/ximagepool.c:
+ * sys/xvimage/xvimagesink.c:
+ meta: update for new API
+
+2011-03-04 18:32:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagepool.h:
+ * sys/ximage/ximagesink.c:
+ ximagesink: make metadata methods more like core
+
+2011-03-04 17:25:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: use sink preroll lock
+
+2011-03-04 10:21:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: reset the pool
+
+2011-03-03 18:39:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagepool.c:
+ ximagesink: implement buffer_alloc from the pool
+ Use the bufferpool for pad_alloc when we are asked for the same caps as the
+ bufferpool.
+
+2011-03-03 16:48:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/Makefile.am:
+ * sys/ximage/ximage.c:
+ * sys/ximage/ximagepool.c:
+ * sys/ximage/ximagepool.h:
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ ximage: rewrite the buffer pool in ximagesink
+ Rewrite the pooling in ximagesink to extend from the bufferpool base class in
+ core. Move some code to a comon place and refactor.
+
+2011-03-04 16:21:13 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-03-03 19:14:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: start ringbuffer upon going to PLAYING and already EOS
+ ... otherwise we may end up without running clock in PLAYING.
+ Fixes #636886.
+
+2011-03-04 14:39:45 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: set several properties in one go
+ g_object_set is a varargs function. Save 7 g_obvject_calls (and the overhead of
+ them) by using it accordingly.
+
+2011-03-02 15:38:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: fix compiler warning on 32-bit systems
+ Mark 64-bit interger constant as such to avoid warnings such as:
+ gsttypefindfunctions.c:2152: error: integer constant is too large for ‘long’ type
+
+2011-02-28 18:52:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: export plugin description more platform independent
+ Fixes #642504.
+
+2011-02-28 18:32:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 1de7f6a to 6aec6b9
+
+2011-02-28 12:59:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ netbuffer: Implement NetAddress with metadata
+ Make a NetAddress metadata.
+
+2011-02-27 19:42:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ meta: fix for new API
+
+2011-02-26 18:19:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ ximagesink: experiment with convenience macros
+
+2011-02-25 16:28:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.h:
+ ximage: fix macros
+
+2011-02-25 16:01:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ ximage: reimplement buffer pooling with metadata
+ Use the buffer metadata to get back to the extra info we can use to optimize the
+ video rendering.
+
+2011-02-25 15:49:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ metadata: implement extra buffer data with metadata
+ Use buffer metadata to attach arbitrary extra data to buffers.
+
+2011-02-24 12:19:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/app/appsink-src.c:
+ * tests/examples/app/appsrc_ex.c:
+ tests: fix some tests now that appbuffer is gone
+
+2011-02-24 12:18:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ v4l: use buffer private data for extra buffer info
+ Since we can't subclass anymore, use the owber_priv pointer for storing extra
+ info for the buffer.
+
+2011-02-24 11:57:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ X11: port imagesinks to new miniobjects
+ Remove the subbuffer from X11 sinks and use the private pointer to store a
+ single buffer metadata with the extra info.
+
+2011-02-23 15:46:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/subparse/gstssaparse.c:
+ miniobject: fix for changed miniobject
+
+2011-02-23 14:12:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ pbutils: use GObject as the base class
+ We can't subclass miniobject so use GObject as the base class,
+
+2011-02-23 13:42:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: remove deprecated method
+
+2011-02-23 13:14:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ netbuffer: disable GstNetBuffer object
+ There are no more buffer subclasses and this should be implemented with
+ buffermetadata later.
+
+2011-02-23 13:13:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstappbuffer.c:
+ * gst-libs/gst/app/gstappbuffer.h:
+ app: remove appbuffer
+ There are no more buffer subclasses and the application can use the regular API
+ to make buffers.
+
+2011-02-28 11:47:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ gst-libs/gst/pbutils/Makefile.am
+
+2011-02-28 10:10:22 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_i386.h:
+ tests: add ABI test suite for libs
+
+2011-02-27 09:32:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Only prevent to autoplug the same parser multiple times for the same chain
+ Parsers are the only element class that are not changing the data and
+ could lead to an infinite loop. Other element classes like demuxers,
+ e.g. id3demux, can be used multiple times in a row and sometimes are.
+
+2011-02-26 23:43:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Break the double-factory checking loop immediately if the factory was used already
+
+2011-02-26 23:39:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't use the same element multiple times in the same chain
+ This is going to lead to an infinite loop of this element and can easily
+ happen with parsers that accept their own src caps on the sinkpad.
+
+2011-02-26 23:20:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Improve detection of raw caps in expose-all-streams=false mode
+ Previously we only checked against the raw caps but we should also
+ check against the return value of autoplug-continue. Additionally fix
+ a thread-safety issue with accessing the raw caps.
+
+2011-02-25 19:37:07 -0800 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add support for r210
+
+2011-01-03 11:41:56 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ gstvideo: Add GST_VIDEO_BUFFER_PROGRESSIVE flag
+ Maps to GST_BUFFER_FLAG_MEDIA4. The purpose is to explicitly indicate
+ whether a telecined buffer is progressive or not without having to make
+ assumptions based on previous buffers.
+
+2011-02-24 20:59:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ encodebin: Fix double unref in unit test
+
+2011-02-22 14:54:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/playbin2.c:
+ checks: add a simple unit test for the source-setup signal
+
+2011-02-22 12:56:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playbin2, uridecodebin: add "source-setup" signal
+ Add "source-setup" signal for convenience and discoverability. No need
+ to figure out "notify::source", look up the notify callback signature,
+ then do an g_object_get() to get the source element..
+ https://bugzilla.gnome.org/show_bug.cgi?id=626152
+
+2011-02-24 16:22:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Don't handle GstCollectData as GstObject, use the pad instead
+
+2011-02-24 16:02:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ encodebin: Fix memory leaks related to request pads
+ Request pads have to be released by the caller and must be
+ unreffed after releasing them.
+
+2011-02-24 15:55:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Return a new reference of the pad for the "request-pad" signal
+ The GObject signal code assumes that the signal handlers return a
+ new reference or copy. Fixes bug #641927.
+
+2011-02-21 20:34:41 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/adder/gstadder.c:
+ adder: Fill in offset_end field of outgoing buffers
+ ... rather than leave it as GST_BUFFER_OFFSET_NONE
+ Fix bug #642942.
+
+2011-02-23 14:31:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: release all chains when going to NULL
+ Also fixes #642466.
+
+2011-02-23 14:29:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: undo state change side effect on error way out
+ ... to avoid subsequent cleanup disposing an element not in NULL state.
+
+2011-02-23 10:32:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: avoid crashing on the way out when needed chain missing
+
+2011-02-22 15:26:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: update .def file for new libgstvideo API
+
+2011-02-22 16:41:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-discoverer.c:
+ discoverer: handle desc==NULL
+ It would otherwise be printed as (null) and mess up indentation (no \n).
+
+2011-02-08 12:42:32 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Chain dispose() up to parent class
+
+2011-02-07 13:04:55 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Keep a ref for the async timeout callback
+ This makes sure we maintain a ref on the discoverer object while the
+ async timeout callback is alive to prevent a potential crash if the
+ object is freed while the callback is pending.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641706
+
+2011-02-07 13:57:39 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Use g_signal_connect_object instead of g_signal_connect
+ We want to make sure the discoverer object passed to the various
+ callbacks doesn't become invalid if a callback is pending and the object
+ is free'd in the mean time.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641706
+
+2011-02-10 03:22:42 +1100 Parthasarathi Susarla <partha.susarla@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: detect raw h.263
+ https://bugzilla.gnome.org/show_bug.cgi?id=623846
+
+2011-02-21 15:58:16 +0200 Teemu Katajisto <teemu.katajisto@digia.com>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ pbutils: encoding-target: fix error checking in target file loading
+ https://bugzilla.gnome.org/show_bug.cgi?id=642949
+
+2011-02-21 17:55:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ tests: fix videoscale test by ignoring newly-added 64-bit formats
+ They probably fail because ffmpegcolorspace can't handle those formats.
+
+2011-02-21 18:01:04 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/sdp/Makefile.am:
+ sdp: Fix copy/paste error in inrospection part of Makefile
+
+2011-02-21 18:00:36 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/tag/Makefile.am:
+ tag: Fix copy/paste error in inrospection part of Makefile
+
+2011-02-21 18:00:02 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ rtsp: Fix copy/paste error in inrospection part of Makefile
+
+2011-02-21 12:40:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiorate/gstaudiorate.h:
+ audiorate: add skip-to-first property
+ API: GstAudioRate::skip-to-first
+
+2011-02-21 12:27:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: fix skip-to-first ts setup
+ ... such as avoiding arithmetic mixing counts and ts, although latter
+ would typically be 0 so far.
+
+2011-02-21 12:04:09 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * gst/adder/gstadder.c:
+ Revert "oggmux,adder: Check if collectpads has been freed"
+ This reverts commit 6d150873e8b4c23d694b0351570de323b1576d76.
+ Depends on a core commit that was reverted.
+
+2011-02-20 23:49:54 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ * gst/adder/gstadder.c:
+ oggmux,adder: Check if collectpads has been freed
+ Core now calls release_pad in finalize, which is usually after
+ the collectpads has been unreffed.
+
+2011-02-19 18:50:37 -0800 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ * gst/videoscale/vs_fill_borders.c:
+ * gst/videoscale/vs_fill_borders.h:
+ * gst/videoscale/vs_image.c:
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_scanline.c:
+ * gst/videoscale/vs_scanline.h:
+ videoscale: Add 16-bit-channel support
+
+2011-02-19 16:41:43 -0800 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add 16-bit-per-channel formats
+
+2011-02-19 12:03:17 -0800 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add ARGB64 and AYUV64
+ 16-bit per channel formats.
+
+2011-02-18 16:26:59 -0800 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add gst_video_format_get_component_depth()
+
+2011-02-18 13:27:23 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: each element gets its own instance of GRand, if needed
+ As a result, pipelines that contain multiple instances of audiotestsrc
+ with the 'wave' property set to 'white-noise', 'pink-noise', or
+ 'gaussian-noise' will run much faster, since they won't be competing
+ for access to the global, lock-protected instance of GRand.
+ Fixes bug #642720.
+
+2011-02-18 17:26:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If a sink claims to support ANY caps assume that it only supports the usual raw formats
+ This should be changed again in 0.11, if a sink really claims to support ANY
+ caps it should support everything or provide correct caps.
+
+2011-02-17 18:11:10 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Add a audioconverter after the audio resampler.
+ This allows handling non-native-endianness conversion properly.
+
+2011-02-18 14:04:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Use gst_pad_accept_caps() instead of intersecting with the getcaps caps
+ This might be faster and more accurate in some cases to detect if a
+ sink supports a format and autoplugging can be stopped.
+
+2011-02-18 12:06:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Add default handler for autoplug-select
+ uridecodebin proxies this signal and only the first signal handler
+ will ever be called from decodebin2, which is uridecodebin's proxy
+ signal handler.
+
+2011-02-18 12:02:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Return NULL from the default autoplug-sort handler
+ ...instead of copying the array. Returning NULL will result
+ in the original factories array to be used and prevents a useless
+ array copy in most use cases.
+
+2011-02-18 12:01:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Return NULL from the default autoplug-sort handler
+ ...instead of copying the array. Returning NULL will result
+ in the original factories array to be used and prevents a useless
+ array copy in most use cases.
+
+2011-02-18 12:00:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Update autoplug-* signal docs from decodebin2
+ uridecodebin proxies these signals.
+
+2011-02-18 11:58:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Update documentation of the autoplug-* signals
+ Add notes about the behaviour if multiple signal handlers are connected.
+ For most autoplug-* signals only the first signal handler will ever
+ be invoked.
+ Also add to the autoplug-sort docs that the signal handler can return NULL
+ to specify that the order should change and other handlers get the chance
+ to sort the array.
+
+2011-02-18 11:57:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Keep the original factory list if the sort signal handlers returned NULL
+
+2011-02-16 20:14:25 +0900 tskd2@yahoo.co.jp <tskd2@yahoo.co.jp>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: expose "autoplug-sort" signal
+ It is a proxy of the decodebin2's one, and was missing
+ in the previous code.
+ See bug #642433.
+
+2011-02-18 10:57:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Use a recursive mutex for the playbin lock
+ This lock is taken when activating a group, which could result in
+ calling the autoplug-continue callback, which also needs this lock
+ to access the sinks.
+ See bug #642174.
+
+2011-02-18 09:36:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Disconnect signal handlers when removing a failed element
+ This prevents crashes later if one of the signals is emitted after the
+ element was removed from decodebin2 already, which can happen in discoverer.
+
+2011-02-15 19:23:48 -0800 David Schleef <ds@schleef.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Fix mpeg TS detection
+
+2011-02-04 17:36:40 -0800 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: move debug category init earlier
+
+2011-02-03 22:41:23 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.h:
+ oggparse: better detection of delta unit flag
+
+2011-01-15 18:21:28 -0800 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: Set speed level while running
+
+2011-01-13 15:12:53 -0800 Ralph Giles <giles@thaumus.net>
+
+ * ext/theora/gsttheoraenc.c:
+ Set the theoraenc speed-level property from libtheora's defaults.
+ The speed-level property, which allows callers to trade of encoding
+ quality for speed in the libtheora api, has a version-dependent
+ maximum and default values. Instead of hardcoding the acceptable
+ range for the theoraenc element's presentation of this setting,
+ we query the library directly at class initialization time and
+ set the maximum and default values from that. If the query fails,
+ we fall back to the previous default setting.
+ To keep the values reported by gst-inspect (which I'm told use
+ the spec values from the class) with those available on an\
+ instantiated element, we remove to setting of enc->speed_level
+ from the initializer and instead pass G_PARAM_CONSTRUCT to
+ the property spec flags, asking g_object to set this property
+ when theoraenc objects are constructed.
+ NB in theory the maximum speed-level could depend on the actual
+ video caps. If later versions of libtheoraenc do this, a second
+ call will need to be made from theora_enc_reset to update the
+ property, since this function is mostly useful for realtime
+ adjustment of performance while the pipeline is running.
+
+2011-02-16 11:57:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: don't leak parent tags
+
+2011-02-16 11:56:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: improve logging (and reindent)
+ Add more logging for the tag merging and use the _OBJECT flavour more.
+
+2011-02-15 17:46:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Optimize autoplug-continue handler a bit
+ Don't build merge the caps of all sinks but check them one-by-one
+ until one supports the caps. Also get reffed caps from the sinkpads
+ instead of a writable copy and add debug output if a sink claims to
+ support ANY caps.
+
+2011-02-15 17:24:28 +0100 Akihiro Tsukada <tskd2@yahoo.co.jp>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Fix handling of non-raw custom sinks
+ When autoplugging elements in decodebin2, check if
+ the caps are supported by one of the sink before
+ continuing autoplugging.
+ Fixes bug #642174.
+
+2011-02-15 17:01:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't leak elements that fail to go to PAUSED after being autoplugged
+ Fixes bug #642381.
+
+2011-02-13 14:42:14 +0000 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: Don't reset the video quality setting the bitrate
+ libtheora has two encoding modes, CBR, where it tries to hit a target
+ bitrate and VBR where it tries to achieve a target quality.
+ Internally if the target bitrate is set to anything other then 0 the
+ encoding-mode is CBR.
+ This means that the gstreamer element can leave the video_quality
+ setting alone as long as the user is tweaking the bitrate. Which has the
+ nice side-effect that if the user explicitely sets the bitrate to 0
+ (which is actually the default), the quality value doesn't get reset and
+ one ends up encoding VBR at quality-level 0...
+
+2011-02-09 12:45:23 +0100 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/gdp/gstgdppay.c:
+ gdppay: ensure buffer's metadata is writable before setting caps
+
+2011-02-14 12:52:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From f94d739 to 1de7f6a
+
+2011-02-10 23:44:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-plugins-base.doap:
+ doap: update mailing list location
+
+2011-02-08 23:58:56 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Use nominal bitrate if bitrate tag is unavailable
+ If the bitrate tag is unavailable, this falls back to the nominal
+ bitrate tag instead, if that is present.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641860
+
+2011-02-08 12:31:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: caps can be NULL
+ Don't use and unref NULL caps.
+
+2011-02-02 16:49:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: also push cached events downstream when operating in pull mode
+ Otherwise, having 2 tagdemux in a row followed by an element operating in
+ pull mode will make the second tagdemux implictly eat the first tagdemux'
+ tag event(s).
+ Fixes (part of) #641047.
+
+2011-01-21 18:10:29 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: ensure serialnos are unique
+ We do that by checking a newly generated one is not already used in
+ an existing stream, and doing it again if it is.
+ https://bugzilla.gnome.org/show_bug.cgi?id=640211
+
+2011-02-02 17:30:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: free stream map caps when done
+
+2011-02-02 17:23:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: keep IN_CAPS flag check for header buffers as fallback
+ In case the ogg mapper doesn't handle all the accepted input formats
+ (although it really should). Saves us error handling for that case
+ though. Also log caps properly.
+ https://bugzilla.gnome.org/show_bug.cgi?id=629196
+
+2011-01-21 16:05:46 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: use oggstream for less brittleness in recognizing headers
+ Using the IN_CAPS flag for this is brittle, and will fail if either
+ vorbisparse or vorbistag (which is itself based on vorbisparse) is
+ inserted between oggdemux and oggmux. Possibly other elements too
+ (eg, theoraparse, etc).
+ Using oggstream ensures we Get It Right More Often Than Not.
+ https://bugzilla.gnome.org/show_bug.cgi?id=629196
+
+2011-02-02 15:33:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: fix copy-and-paste typo in property docs
+
+2011-01-21 10:56:00 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ oggmux: do not skip a pageno at start
+ Discontinuities are automatically signalled by oggdemux at the start
+ of a new stream. When oggmux is yet to output actual data pages,
+ do not signal these discontinuities in the ogg stream.
+ This patch may miss some actual discontinuities at the very start of
+ a stream, but avoids the spurious missing pages when encoding happens
+ normally.
+ A better fix might involve finding a way to distinguish between actual
+ data discontinuities and discontinuities merely marking the start of
+ a new stream.
+ Fixes an issue with ogg page numbering (would skip a number for no
+ reason, which then looks like a packet was lost somewhere) when
+ re-muxing an ogg stream, e.g. when re-tagging in rhythmbox.
+ https://bugzilla.gnome.org/show_bug.cgi?id=629196
+
+2011-02-01 15:57:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: clean up property descriptions
+ Remove "This property requires libtheora version >= 1.1" qualifiers
+ from property descriptions. They aren't needed any longer now that
+ we require libtheora >= 1.1.
+
+2010-08-19 22:31:07 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * configure.ac:
+ * gst-libs/gst/tag/gstid3tag.c:
+ id3tag: map the ID3v2 TENC frame to GST_TAG_ENCODED_BY
+ https://bugzilla.gnome.org/show_bug.cgi?id=627268
+
+2011-01-29 20:43:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/tcp/gsttcpserversink.c:
+ tcp: use socklen_t where appropriate rather than specific type
+ In particular, fixes Cygwin build where socklen_t is defined as int
+ in line with native win32 api definition.
+
+2011-01-29 19:40:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmptag: cast argument to isdigit to int
+ ... as that is the specification and fixes compilation on Cygwin:
+ gstxmptaag.c: In function 'read_one_tag':
+ gstxmptag.c:1015: error: array subscript has type 'char'
+
+2011-01-31 18:06:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * tests/check/elements/appsink.c:
+ appsink: add buffer fallback in case the application doesn't handle buffer lists
+ We shouldn't assume the application handles buffer lists, for
+ ease-of-use reasons and for backwards compatibility reasons.
+
+2011-01-26 10:32:32 +0800 Cai Yuanqing <Yuanqing.Cai@tieto.com>
+
+ * gst-libs/gst/app/gstappsink.c:
+ appsink: send new-buffer-list signal
+ Send new-buffer-list signal when emit-signals is TRUE
+ https://bugzilla.gnome.org/show_bug.cgi?id=640607
+
+2011-01-20 16:25:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: also add https to buffer protocols
+ HTTPS also needs buffering.
+
+2011-01-30 15:40:53 +0200 Felipe Contreras <felipe.contreras@nokia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: trivial cleanups
+ It seems these stuff was neglected from commmit d8942e2.
+ Signed-off-by: Felipe Contreras <felipe.contreras@nokia.com>
+
+2011-01-27 15:26:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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 12:32:35 +0100 Philippe Normand <pnormand@igalia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: register H264 typefinder with H264 caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=640709
+
+2011-01-26 12:16:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/encoding/gststreamsplitter.c:
+ streamsplitter: release pending events refs
+ Unref pending events when disposing the streamsplitter.
+ Also refactor a little to replace a for with a g_list_foreach
+
+2011-01-26 15:42:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: don't run encodebin test if vorbis or theora plugins aren't available
+
+2011-01-26 09:07:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for degas images
+
+2011-01-26 09:06:10 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: use image/x-icon as media type for ICON files
+ That's what we've been using so far (e.g. gdkpixbufdec).
+
+2011-01-18 10:20:29 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/snapshot/snapshot.c:
+ snapshot: use a keyframe seek
+ One would usualy get good quality snapshots quickly. The exact seek position
+ does not really matter.
+
+2011-01-17 23:13:29 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/snapshot/snapshot.c:
+ snapshot: add a newline to the usage and error output
+
+2011-01-25 18:03:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: add comment and whitespace trimming
+
+2011-01-12 14:03:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for x-annodex
+
+2011-01-25 13:39:25 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: add typefinder for DEGAS images
+ This fixes at least one DEGAS image from being misdetected as DTS audio.
+ https://bugzilla.gnome.org/show_bug.cgi?id=625129
+
+2011-01-21 14:56:28 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: cleanup
+ Remove a pointless string concatentation, and fix an off-by-one in
+ packetno in a log.
+ https://bugzilla.gnome.org/show_bug.cgi?id=640189
+
+2011-01-24 11:45:21 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: add detection for windows icon files to get them out of the way
+ Some of them can otherwise be misdetected for MPEG audio.
+ https://bugzilla.gnome.org/show_bug.cgi?id=620364
+
+2011-01-17 15:11:15 +0200 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Remove dead code
+
+2011-01-11 15:10:42 +0800 Yang Xichuan <xichuan.yang@tieto.com>
+
+ * ext/ogg/gstoggparse.c:
+ oggparse: Make gst_ogg_parse_submit_buffer() safe
+ By not passing zero-sized buffers to ogg_sync_buffer()
+ and checking the return values of libogg functions.
+ Fixes bug #639136.
+
+2011-01-11 18:18:34 +0100 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: Add support for vertical center alignment
+ Fixes bug #639159.
+
+2011-01-24 15:21:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Move static variable to local function
+ Variable was being written to and could cause crashes
+ if multiple elements were parsing xmp at the same time.
+ Moving it to local scope solves the problem.
+
+2011-01-24 18:27:30 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add support for video/x-camstudio
+
+2011-01-24 00:00:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development
+
+=== release 0.10.32 ===
+
+2011-01-21 10:50:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.32
+
+2011-01-18 10:45:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.31.4 pre-releases
+
+2011-01-18 10:44:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ docs: update docs
+
+2011-01-18 10:40:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * tests/check/libs/profile.c:
+ encoding-target: change keyfile header to 'GStreamer Encoding Target'
+ which is more in line with other files such as .desktop files.
+
+2011-01-18 01:06:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ pbutils: don't assume LC_MESSAGES is always defined, also check for ENABLE_NLS
+ Should fix build with mingw32 build bot again.
+
+2011-01-18 00:09:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/app/gstappsrc.h:
+ * win32/common/libgstapp.def:
+ app: export gst_app_stream_type_get_type()
+ API: gst_app_stream_type_get_type()
+ API: GST_TYPE_APP_STREAM_TYPE
+ https://bugzilla.gnome.org/show_bug.cgi?id=639747
+
+2011-01-17 23:59:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappbuffer.c:
+ app: make GstAppBuffer get_type() function thread-safe
+
+2011-01-18 01:09:53 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Drop new stream tags once preroll is done
+ This makes sure we do not touch the stream taglist once the pipeline has
+ been prerolled. Adding of stream tags happens in the pad event probe
+ which runs in a different thread from discoverer stream processing, so
+ modifying the tag list while discoverer might be processing it can
+ sometimes cause a crash.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639778
+
+2011-01-17 15:30:08 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Validate timeouts before processing them
+ This avoids a race where the timeout callback is scheduled to run but we
+ get sufficient information to finish discovery before actually getting
+ around to executing the callback. See the documentation of
+ g_source_is_destroyed() for more details.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639730
+
+2011-01-18 00:08:32 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Make sure we call _stop() before being freed
+ This ensures that everything is properly cleaned up before the
+ GstDiscoverer object is freed. Specifically, it makes sure that we've
+ removed the async timeout callback before freeing the object to avoid a
+ potential crash later on.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639755
+
+2011-01-16 14:55:46 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gdp/gstgdppay.c:
+ gdppay: make newsegment buffer metadata writable
+
+2011-01-16 16:46:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ pbutils: save localised strings properly when writing encoding targets to a file
+ Use LC_MESSAGES rather than LC_ALL. Save/load description as untranslated string
+ when using an English language locale. Strip locale information to the language,
+ so we don't save keys like description[fr_FR.UTF-8]=...
+ https://bugzilla.gnome.org/show_bug.cgi?id=638860
+
+2011-01-13 13:59:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: set framed=false on DTS caps
+
+2011-01-12 17:51:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ docs: add some more Since: markers for new encoding-profile API
+
+2011-01-12 15:51:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: require gobject-introspection >= 0.9.12
+ Earlier versions don't honour the -L/--library-path option,
+ which we need. See commit 4d0ccdad in gobject-introspection git.
+ Should "fix" build on lucid/maverick build bots.
+
+2011-01-11 19:19:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.31.3 pre-release
+
+2011-01-11 18:59:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/da.po:
+ * po/gl.po:
+ * po/pt_BR.po:
+ po: update translations
+
+2011-01-11 14:41:53 +0000 Bastien Nocera <hadess@hadess.net>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ examples: allow building with newer GTK+
+ GtkFunction is gone, and there's no update policies for
+ GtkRanges any more (but the default was continuous anyway,
+ so no need to set it to that mode explicitly).
+ https://bugzilla.gnome.org/show_bug.cgi?id=639215
+
+2011-01-11 14:59:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ gobject-introspection: pass --library-path as well to make it find the right libgstreamer
+ Makes things work again properly in uninstalled setups (and
+ presumably in installed setups where GStreamer is installed
+ into a non-standard prefix). Requires fixes from core git.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639039
+
+2011-01-11 14:52:51 +0000 Byeong-ryeol Kim <brofkims@gmail.com>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ gobject-introspection: fix issue when gold linker is used
+ Need to pass libgstreamer-0.10 explicitly to linker, since we're
+ calling gst_init(), which in turn is needed because the encoding
+ target get_type() function calls gst_value_register().
+ https://bugzilla.gnome.org/show_bug.cgi?id=639039
+
+2011-01-11 15:49:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From e572c87 to f94d739
+
+2011-01-10 16:35:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ccbaa85 to e572c87
+
+2011-01-10 14:53:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 46445ad to ccbaa85
+
+2011-01-10 15:55:26 +0800 Yang Xichuan <xichuan.yang@tieto.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: remove outdated comment
+ https://bugzilla.gnome.org/show_bug.cgi?id=639121
+
+2011-01-08 02:16:19 +0000 Koop Mast <kwm@FreeBSD.org>
+
+ * configure.ac:
+ configure: fix bash-ism
+ https://bugzilla.gnome.org/show_bug.cgi?id=638961
+
+2011-01-08 02:10:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ gobject-introspection: use same PKG_CONFIG_PATH for g-ir-compiler as for g-ir-scanner
+ Make sure to use the PKG_CONFIG_PATH set at configure time instead of
+ just relying on an env-var set one. This makes sure both g-ir-compiler
+ and g-ir-scanner use the same PKG_CONFIG_PATH for determining include
+ paths etc.
+
+2011-01-08 01:12:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-app-uninstalled.pc.in:
+ * pkgconfig/gstreamer-app.pc.in:
+ * pkgconfig/gstreamer-audio-uninstalled.pc.in:
+ * pkgconfig/gstreamer-audio.pc.in:
+ * pkgconfig/gstreamer-cdda-uninstalled.pc.in:
+ * pkgconfig/gstreamer-cdda.pc.in:
+ * pkgconfig/gstreamer-fft-uninstalled.pc.in:
+ * pkgconfig/gstreamer-fft.pc.in:
+ * pkgconfig/gstreamer-floatcast.pc.in:
+ * pkgconfig/gstreamer-interfaces-uninstalled.pc.in:
+ * pkgconfig/gstreamer-interfaces.pc.in:
+ * pkgconfig/gstreamer-netbuffer-uninstalled.pc.in:
+ * pkgconfig/gstreamer-netbuffer.pc.in:
+ * pkgconfig/gstreamer-pbutils-uninstalled.pc.in:
+ * pkgconfig/gstreamer-pbutils.pc.in:
+ * pkgconfig/gstreamer-riff-uninstalled.pc.in:
+ * pkgconfig/gstreamer-riff.pc.in:
+ * pkgconfig/gstreamer-rtp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtp.pc.in:
+ * pkgconfig/gstreamer-rtsp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtsp.pc.in:
+ * pkgconfig/gstreamer-sdp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-sdp.pc.in:
+ * pkgconfig/gstreamer-tag-uninstalled.pc.in:
+ * pkgconfig/gstreamer-tag.pc.in:
+ * pkgconfig/gstreamer-video-uninstalled.pc.in:
+ * pkgconfig/gstreamer-video.pc.in:
+ pkg-config: add girdir and typelibdir variables to .pc files
+ We need them when building gir and typelib files for
+ libraries that depend on these, such as gst-rtsp-server
+ for example, in an uninstalled setup.
+
+2011-01-07 12:50:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/pbutils-enumtypes.c:
+ * win32/common/video-enumtypes.c:
+ 0.10.31.2 pre-release
+
+2011-01-07 13:04:11 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ * gst/encoding/gstencodebin.h:
+ encodebin: Add missing-plugin support
+ https://bugzilla.gnome.org/show_bug.cgi?id=638903
+
+2011-01-07 12:51:11 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Extend documentation
+ https://bugzilla.gnome.org/show_bug.cgi?id=638901
+
+2011-01-07 00:43:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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, sometimes
+ containing functional code like set_state() calls in them even
+ (looking at you, pipeline/capsfilter-renegotiation). 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 23:17:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstpbutils.def:
+ win32: udpate pbutils .def file for API change
+
+2011-01-06 23:13:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ docs: update docs
+
+2011-01-06 23:13:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/fi.po:
+ * po/ru.po:
+ po: update translations
+
+2011-01-06 23:08:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: make text property controllable too
+ Because we can, and because it's the most interesting one
+ to control really, after xpos/ypos.
+
+2011-01-06 23:01:20 +0000 Lane Brooks <dirjud@gmail.com>
+
+ * ext/pango/Makefile.am:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: make some properties controllable
+ https://bugzilla.gnome.org/show_bug.cgi?id=638859
+
+2011-01-06 20:37:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/.gitignore:
+ tests: ignore new rtsp test binary
+
+2011-01-05 15:54:15 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: ignore header pages when looking for keyframe
+ This was causing keyframe_granule to be set to 0 for all streams
+ when seeking to the beginning of the stream, i.e., at the
+ beginning of playback. Fixes #619778.
+
+2010-12-29 15:27:44 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: when the last keyframe position is not known, do not use -1
+ Instead, use either 0 or 1, depending on bitstream version, which give
+ the correct result for streams which aren't cut off at start.
+ This allows that function to not return negative granpos.
+ https://bugzilla.gnome.org/show_bug.cgi?id=638276
+
+2011-01-06 17:57:41 +0000 christian schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Update spec file with discoverer and encodebinchanges
+
+2011-01-05 15:53:09 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ discoverer: Documentation updates
+ Some cosmetic changes and expands on some bits of the documentation to
+ make it more newbie-friendly.
+
+2011-01-06 13:08:53 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: Fix behaviour for frame rate cap changes
+ The outgoing buffer timestamp is calculated by scaling an output buffer
+ count by the src pad frame rate caps. If these caps change, we need to
+ reset the count and work from a new base timestamp. The new output
+ buffer timestamp is then the count scaled by the new caps values added
+ onto the base timestamp.
+
+2011-01-06 08:47:04 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-discoverer.c:
+ tools: Improve pretty-printing of tags
+ Avoids escaping strings for nothing and printing out useless buffer contents.
+
+2011-01-06 08:46:42 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-discoverer.c:
+ tools: don't leak the GMainLoop
+
+2011-01-06 00:28:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ pbutils: config.h include should come before all other includes
+
+2011-01-05 22:02:35 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ * gst/encoding/gstencodebin.c:
+ * tests/check/libs/profile.c:
+ * tests/examples/encoding/encoding.c:
+ encoding: encoding_profile_get_output_caps => _get_input_caps
+ Makes more sense name-wise
+
+2011-01-05 20:40:39 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: Add various new symbols
+
+2011-01-05 01:50:34 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ encoding-profile: Minor documentation updates
+
+2011-01-03 19:07:45 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ encoding-profile: Give a better usage example
+
+2011-01-03 18:52:00 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * tests/check/libs/profile.c:
+ * win32/common/libgstpbutils.def:
+ encoding-target: Fixup loading/saving methods
+
+2011-01-03 18:51:22 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ encoding-target: more docs cleanups
+
+2011-01-03 16:07:49 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * tests/check/libs/profile.c:
+ encoding-target: Change target suffix to .gep
+ Along with a bunch of other internal cleanups
+
+2011-01-03 13:21:26 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ encoding-target: Add more docs regarding categories
+
+2011-01-03 13:20:19 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * tests/check/libs/profile.c:
+ * win32/common/libgstpbutils.def:
+ encoding-target: Add API for list all categories and targets
+ API: gst_encoding_list_available_categories
+ API: gst_encoding_list_all_targets
+
+2010-12-22 18:18:00 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ * tests/check/libs/profile.c:
+ * win32/common/libgstpbutils.def:
+ encoding-profile: Add convenience method to find a profile
+ API: gst_encoding_profile_find
+
+2010-12-22 18:16:33 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * tests/check/libs/profile.c:
+ encoding-target: Implement save/load feature
+ Fixes #637735
+
+2010-12-22 11:41:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * tests/check/libs/profile.c:
+ * win32/common/libgstpbutils.def:
+ encoding-target: Add method to get a profile by name
+ API: gst_encoding_target_get_profile
+
+2011-01-05 19:30:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Convert to new GstElementClass::request_new_pad_full vmethod
+
+2011-01-05 15:31:09 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/pbutils.h:
+ pbutils: Don't forget to include the encoding headers
+
+2011-01-05 12:02:02 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix uninitialized variables
+ reported by macosx gcc
+
+2010-12-07 14:59:46 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ codec-utils: Minor documentation changes
+
+2011-01-02 15:48:47 -0800 David Schleef <ds@schleef.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Add stream-format to h264 caps
+
+2011-01-02 17:21:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: default to enable-last-buffer=FALSE for audio sinks
+ There isn't really any good reason to get the last buffer from an
+ audio sink, so don't make the sink keep it around unnecessarily.
+
+2010-12-31 12:14:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstinputselector.h:
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gstplaybin2.c:
+ playbin2: use input-selector from core instead of internal copy
+
+2010-12-31 01:24:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ tests: add input-selector-test and output-selector-test
+ Moved from gst-plugins-bad into -base, becasue it uses videotestsrc
+ and other elements from -base, so it can't be in core.
+
+2010-11-24 12:22:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/output-selector-test.c:
+ output-selector-test: don't hardcode videosinks and use more colorspace conv.
+ Use autovideosink instead of hardcoded sinks. Use an additional colorspace
+ converter between videotestsrc and timeoverlay.
+
+2009-10-27 11:51:05 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * tests/icles/output-selector-test.c:
+ tests: Remove executable bits from non-executable files.
+
+2009-02-24 16:33:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/icles/input-selector-test.c:
+ tests: move examples directory to tests/examples as in every other GStreamer module
+
+2008-06-19 13:18:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests: Use BOILERPLATE macro and update output-selector test to the latest api changes.
+ Original commit message from CVS:
+ * gst/selector/gstoutputselector.c:
+ * tests/icles/output-selector-test.c:
+ Use BOILERPLATE macro and update test to the latest api changes.
+
+2008-02-07 13:48:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/icles/output-selector-test.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-01-29 07:38:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Replace the switch plugin with the selector plugin. Add output-selector as the opposite of input-selector (was switc...
+ Original commit message from CVS:
+ * configure.ac:
+ * 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.signals:
+ * docs/plugins/inspect/plugin-metadata.xml:
+ * docs/plugins/inspect/plugin-selector.xml:
+ * docs/plugins/inspect/plugin-soundtouch.xml:
+ * docs/plugins/inspect/plugin-switch.xml:
+ * gst/selector/.cvsignore:
+ * gst/selector/Makefile.am:
+ * gst/selector/gstinputselector.c:
+ * gst/selector/gstinputselector.h:
+ * gst/selector/gstoutputselector.c:
+ * gst/selector/gstoutputselector.h:
+ * gst/selector/gstselector-marshal.list:
+ * gst/selector/gstselector.c:
+ * gst/selector/selector.vcproj:
+ * gst/switch/.cvsignore:
+ * gst/switch/Makefile.am:
+ * gst/switch/gstswitch-marshal.list:
+ * gst/switch/gstswitch.c:
+ * gst/switch/gstswitch.h:
+ * gst/switch/switch.vcproj:
+ * tests/icles/.cvsignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/output-selector-test.c:
+ Replace the switch plugin with the selector plugin. Add output-
+ selector as the opposite of input-selectoo (was switch). Add a test
+ for output-selector. Add docs for the elements. The vcproj needs
+ update. Fixes #500142.
+
+2010-12-30 18:08:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ baseaudiopay: fix timestamps on buffer lists
+ Fix the outgoing timestamps and RTP timestamps on outgoing buffers when using
+ buffer lists.
+
+2010-12-29 22:36:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: assume EBML files without doctype are matroska
+ https://bugzilla.gnome.org/show_bug.cgi?id=638019
+
+2010-12-29 12:53:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: only keep last valid timestamp
+ Fixes #634397
+
+2010-10-13 17:09:13 +0200 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ multifdsink: add first and last buffer's timestamp to the stats
+
+2010-12-29 11:51:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: fix typo in comment
+
+2010-12-28 17:39:58 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: fix interpretation of Theora granule position
+ The offset part of the granpos is not a sign of the newer encoding.
+ Use the version number instead.
+ This fixes the criticals thrown by theoraparse, and (at last) the
+ remaining part of #553244.
+
+2010-11-25 17:01:04 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: protect against ringbuffer disappearing while in a query
+ Observed a case where the sink went to null-state during the query,
+ hence the ringbuffer-pointer was NULL, causing a crash.
+ Moving the ringbuffer-check code until after the query, and hold the
+ lock during the check and while using the spec-values. It should not matter
+ to the query wether the ringbuffer is present or not, and it actually
+ gets a time bit more time to get the ringbuffer set up in this case!
+ Fixes #635231
+
+2010-12-28 19:39:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: handle pads that are not added yet
+ Don't try to stream data on pads that are not added yet. This happens while we
+ discover the different streams.
+
+2010-12-28 11:41:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basedepay: fix refcounting issue
+ Make sure that when _make_writable() returns a new buffer, we actually push that
+ one instead of the old one.
+
+2010-12-25 15:22:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: implement tag extraction for Kate streams
+ This will mainly allow Totem to know the language of those streams,
+ so the subtitle selection menu gets properly filled out.
+ https://bugzilla.gnome.org/show_bug.cgi?id=638005
+
+2010-12-26 17:29:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for DVB subtitle caps
+
+2010-12-23 17:18:17 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: set headers on caps
+ This will allow switching from one stream to another without having to send
+ the headers for the new stream again.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637927
+
+2010-12-22 15:29:56 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: Fix parsing of theora size
+
+2010-12-22 19:06:56 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't use gst_pad_alloc_buffer()
+ allocate buffers using gst_buffer_new_and_alloc() instead of
+ gst_pad_alloc_buffer_and_set_caps(), as the first one will
+ cause the pad to block, and we don't want that since that will
+ prevent subsequent pads from being fed if a block occurs at
+ start, when all pads must be fed for playback to start.
+ This fixes autoplugging of the tiger element and other things.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637822
+
+2010-12-22 18:12:14 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Also use "Formatter"s for container formats
+
+2010-12-22 18:19:48 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ encoding-target: Fix typo
+
+2010-12-22 10:32:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Fix unitialized data warning
+ Fixes a valgrind warning on jifmux tests on -bad caused by
+ unitialized bytes.
+ Fixes #637758
+
+2010-12-22 13:56:12 +0100 Alessandro Decina <alessandro.d@gmail.com>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: minor fix in error handling.
+ Don't call gst_bin_remove (bin, <invalid pointer>).
+
+2010-12-21 18:51:29 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ pbutils: More gtk-doc annotations
+
+2010-12-21 10:26:40 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: delay stream-changed messages
+ https://bugzilla.gnome.org/show_bug.cgi?id=637586
+
+2010-12-21 16:33:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * tests/check/libs/profile.c:
+ encoding-target: Ensure target names and categories are valid
+
+2010-12-21 15:11:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ depay: update some docs
+
+2010-12-21 15:02:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ rtpdepayloade: add support for getting events
+ Add support for intercepting sink events in the depayloader by adding a new
+ vmethod.
+
+2010-12-21 13:37:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: keep timestamps when no decoded output
+ Keep track of the timestamps even when we didn't generate decodable output.
+
+2010-12-21 13:19:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: avoid using invalid timestamps
+
+2010-12-21 10:41:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: don't pause for live buffering messages
+
+2010-12-20 18:29:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppay: use RTP base time when invalid timestamps
+ When we have an invalid running-time (because we clipped, for example) use the
+ RTP base time for timestamping instead of generating wrong RTP timestamps.
+
+2010-12-20 18:28:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtppayload: copy applied rate to segment
+ Use set_segment_full to copy all segment values to the segment structure.
+
+2010-12-21 13:09:34 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/elements/encodebin.c:
+ * tests/check/libs/profile.c:
+ tests: Update container-less profile checks
+
+2010-12-21 13:08:15 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ encoding-profile: Add guard against profiles without format
+
+2010-12-21 13:07:27 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/encoding/gstencodebin.c:
+ encodebin: Fix usage of non-container profiles
+
+2010-12-17 16:10:53 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ docs: Update for videoscale class changes
+
+2010-12-20 17:46:48 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 169462a to 46445ad
+
+2010-12-19 13:41:22 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ gstdiscoverer: Don't leak tags
+
+2010-12-19 13:22:23 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-discoverer.c:
+ gst-discoverer: show global tags by default
+
+2010-12-19 09:53:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/rtsp.c:
+ rtsp: Fix memory leaks in the gst_rtsp_url_decode_path_components() unit tests
+
+2010-12-18 20:47:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/encoding/Makefile.am:
+ examples: Fix encodebin example CFLAGS and LDFLAGS
+ Previously it would only succeed to link if a new enough
+ libgstpbutils-0.10 was installed in the default library
+ search path.
+
+2010-12-17 14:16:18 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: implement packet duration query for kate streams
+ https://bugzilla.gnome.org/show_bug.cgi?id=637519
+
+2010-12-17 19:06:27 -0600 Rob Clark <rob@ti.com>
+
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ * gst/encoding/gstencodebin.c:
+ fix compile errors on macosx
+ with i686-apple-darwin10-gcc-4.2.1:
+ encoding-profile.h:134: warning: type qualifiers ignored on function return type
+ encoding-profile.c:240: warning: type qualifiers ignored on function return type
+ gstencodebin.c: In function 'next_unused_stream_profile':
+ gstencodebin.c:454: warning: format '%d' expects type 'int', but argument 8 has type 'GType'
+ gstencodebin.c:464: warning: format '%d' expects type 'int', but argument 8 has type 'GType'
+
+2010-12-17 00:49:26 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: corrected buffer duration calculation to account for nonzero initial timestamp
+ Since we calculate timestamps by:
+ timestamp = t0 + (out samples) / (out rate)
+ and durations by:
+ duration = ((out samples) + (processed samples)) / (out rate) - timestamp
+ if t0 is nonzero, this would simplify to
+ duration = t0 + (processed samples) / (out rate).
+ This duration is too large by the amount t0. We should have done:
+ duration = t0 + ((out samples) + (processed samples)) / (out rate) - timestamp
+ so that
+ duration = (processed samples) / (out rate).
+
+2010-12-16 20:40:33 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.h:
+ audioresample: changed num_gap_samples, num_nongap_samples from guint32 to guint64 so that gaps of greater than or equal to 2^32 samples do not cause integer overflow
+
+2010-12-16 20:38:31 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: push half a history length, instead of a full history length, at end-of-stream so that output segment and input segment have same duration
+
+2010-12-16 20:34:13 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ audioresample: renamed count_gap, count_nongap to more descriptive num_gap_samples, num_nongap_samples
+
+2010-12-16 20:32:07 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: replaced void* with gpointer
+
+2010-12-16 20:30:24 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: initial filter transient discarded; unit tests passing
+
+2010-12-16 20:09:58 -0800 Leo Singer <leo.singer@ligo.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/speex_resampler.h:
+ * gst/audioresample/speex_resampler_wrapper.h:
+ Revert "Revert "audioresample: Add GAP flag support""
+ This reverts commit 35c76b3409dde7f2dcc8232388a47a1b99b661a7.
+ Conflicts:
+ gst/audioresample/gstaudioresample.c
+ gst/audioresample/gstaudioresample.h
+
+2010-12-16 10:26:43 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ timeoverlay: add missing break
+ https://bugzilla.gnome.org/show_bug.cgi?id=637377
+
+2010-12-16 10:11:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Change classification to Filter/Converter/Video/Scaler
+
+2010-12-15 23:47:29 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * win32/common/libgstrtsp.def:
+ win32: update the def file with the new rtsp api
+
+2010-12-15 17:51:36 +0100 Andy Wingo <wingo@oblong.com>
+
+ add gst_rtsp_url_decode_path_components
+ * gst-libs/gst/rtsp/gstrtspurl.h:
+ * gst-libs/gst/rtsp/gstrtspurl.c (gst_rtsp_url_decode_path_components):
+ New public function, returns a strv of uri-decoded path components.
+ * tests/check/Makefile.am:
+ * tests/check/libs/rtsp.c: Add tests.
+
+2010-12-15 16:35:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtp.def:
+ win32: update defs file
+
+2010-12-15 16:30:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtpbuffer: relax arrangement for RTP bufferlists
+ Don't assume there are exactly 2 buffers but allow cases where the header and
+ payload are in 1 buffer or where the payload is in more buffers.
+
+2010-12-15 14:55:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 20742ae to 169462a
+
+2010-12-15 12:58:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ basedepay: add support for buffer lists in the depayloader
+ Add support for buffer lists in the depayloader.
+
+2010-09-13 10:08:47 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/encoding/.gitignore:
+ * tests/examples/encoding/Makefile.am:
+ * tests/examples/encoding/encoding.c:
+ * tests/examples/encoding/gstcapslist.c:
+ * tests/examples/encoding/gstcapslist.h:
+ examples: encoding example
+ Along with gstcapslist
+
+2010-08-13 17:36:38 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-encoding.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * gst/encoding/.gitignore:
+ * gst/encoding/Makefile.am:
+ * gst/encoding/gstencode-marshal.list:
+ * gst/encoding/gstencodebin.c:
+ * gst/encoding/gstencodebin.h:
+ * gst/encoding/gstsmartencoder.c:
+ * gst/encoding/gstsmartencoder.h:
+ * gst/encoding/gststreamcombiner.c:
+ * gst/encoding/gststreamcombiner.h:
+ * gst/encoding/gststreamsplitter.c:
+ * gst/encoding/gststreamsplitter.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/encodebin.c:
+ gst: New encoding plugin
+ https://bugzilla.gnome.org/show_bug.cgi?id=627476
+
+2010-08-13 17:27:52 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ * docs/design/design-encoding.txt:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/encoding-profile.c:
+ * gst-libs/gst/pbutils/encoding-profile.h:
+ * gst-libs/gst/pbutils/encoding-target.c:
+ * gst-libs/gst/pbutils/encoding-target.h:
+ * tests/check/Makefile.am:
+ * tests/check/libs/.gitignore:
+ * tests/check/libs/profile.c:
+ * win32/common/libgstpbutils.def:
+ pbutils: New Profile library
+ https://bugzilla.gnome.org/show_bug.cgi?id=627476
+
+2010-12-15 12:21:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ configure: use the -Bsymbolic-functions linker flag if supported
+ This feature turns intra library calls into direct function calls and thus makes
+ them a little faster. The downside is that this causes problems for e.g.
+ LD_PRELOAD based tools. Thus add a configure option to turn it off.
+
+2010-12-14 00:16:13 -0800 David Schleef <ds@schleef.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Add check for yuv4mpeg
+
+2010-12-13 18:05:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: spell out two more container formats
+
+2010-12-13 16:20:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ * tools/gst-discoverer.c:
+ * win32/common/libgstpbutils.def:
+ discoverer: query seekability
+ Besides the duration we can also query the seekability of a stream. Use the new
+ API in the gst-discoverer tool.
+ API: gst_discoverer_info_get_seekable
+
+2010-12-13 16:23:04 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 011bcc8 to 20742ae
+
+2010-12-13 13:04:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/check/elements/audioresample.c:
+ tests: audioresample: adjust unit test to relaxed discont checking
+
+2010-12-13 12:34:58 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/Makefile.am:
+ * docs/design/Makefile.am:
+ make: move the design doc also on the Makefile.am level (for dist)
+
+2010-12-13 10:05:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: relax discont checking slightly
+
+2010-12-13 09:56:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ audioresample: provide as much valid output ts and offset as valid input
+ ... by independently tracking time and offset, rather than having no offset
+ leading to no output ts.
+
+2010-12-13 10:41:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinders: name "aac" typefinder "audio/aac"
+ This is in sync how we call the others.
+
+2010-12-13 09:58:53 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design-audiosinks.txt:
+ * docs/design/design-audiosinks.txt:
+ docs: move design doc to design folder
+
+2010-12-11 19:33:33 +0200 Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+
+ * gst/videotestsrc/generate_sine_table.c:
+ videotestsrc: Add a missing return statement
+
+2010-12-11 17:18:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Deprecate new-decoded-pad and removed-decoded-pad signals
+ They're really the same as pad-added and pad-removed from GstElement
+ and it doesn't make sense to have two signals for the same thing.
+
+2010-12-11 17:14:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Emit "remove-decoded-pad" signal when pads are removed from decodebin2
+ Fixes bug #636198.
+
+2010-12-10 18:57:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ appsink: unset flushing flag when starting
+ When we start again after being stopped, clear the flushing flag or else
+ it will always be TRUE.
+ Fixes #636769
+
+2010-12-09 16:57:35 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add/Fix some media descriptions
+ Fixes #623413
+
+2010-12-09 08:40:25 +0100 Gavin Stark <g.stark@realdigitalmedia.com>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Use gst_caps_can_intersect() instead of gst_caps_intersect()
+ Fixes a memory leak and bug #636827.
+
+2010-12-08 12:55:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: improve iso media typefinding
+ ... by also considering compatible brands rather than only aiming at major brand
+ (of which there are a seemingly ever expanding great many).
+
+2010-12-08 12:28:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/pbutils.c:
+ tests: remove superflous ';' and reindent
+
+2010-12-08 12:09:45 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ docs: fix wrong use of Since: keyword
+
+2010-12-07 20:28:37 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * tests/check/gst/typefindfunctions.c:
+ tests: add AC-3, E-AC-3 typefind tests
+
+2010-12-03 17:33:40 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: ignore AC-3 BSIDs 9, 10 and >16
+ These are reserved for future extensions which will not be backwards
+ compatible to E-AC-3.
+
+2010-12-03 16:54:21 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: accept consecutive AC-3 frames of different sizes
+ This is perfectly valid and occurs in particular when there are
+ (in)dependent substreams present.
+
+2010-12-03 16:22:32 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: remove useless masking in (E-)AC-3 typefinders
+
+2010-12-03 16:14:15 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: stop scanning after suggesting E-AC-3 caps
+
+2010-12-03 18:08:58 +0200 René Stadler <rene.stadler@nokia.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: fix E-AC-3 frame size parsing
+ Frame size is given in words; it is already multiplied by two where
+ needed, so the left shift is superfluous. This extra multiplication
+ caused the code to inspect the third packet instead of the second,
+ which would fail for files where the second packet has a size
+ different from the first.
+
+2010-12-07 17:35:14 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ rtsp: Move around the typedefs to make GIR happy
+ Otherwise it will generate they symbols as _GstRTSP* (with the leading
+ underscore).
+
+2010-12-07 11:31:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ use _object_ref_sink() when we can
+
+2010-12-07 11:30:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsadeviceprobe.c:
+ alsaprobe: don't abuse the object class lock
+ don't abuse the class lock but use a new static lock for protecting the probed
+ list of devices.
+
+2010-12-06 20:01:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ * 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/gsttcpserversrc.c:
+ * gst/tcp/gsttcpserversrc.h:
+ tcp: remove deprecated GDP protocol
+
+2010-12-06 17:09:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ more 0.10 -> 0.11 changes
+
+2010-12-06 16:50:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * android/alsa.mk:
+ * android/app.mk:
+ * android/app_plugin.mk:
+ * android/audio.mk:
+ * android/audioconvert.mk:
+ * android/decodebin.mk:
+ * android/decodebin2.mk:
+ * android/gdp.mk:
+ * android/interfaces.mk:
+ * android/netbuffer.mk:
+ * android/pbutils.mk:
+ * android/playbin.mk:
+ * android/queue2.mk:
+ * android/riff.mk:
+ * android/rtp.mk:
+ * android/rtsp.mk:
+ * android/sdp.mk:
+ * android/tag.mk:
+ * android/tcp.mk:
+ * android/typefindfunctions.mk:
+ * android/video.mk:
+ android: update for 0.11
+
+2010-12-06 12:11:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ configure: start 0.11 branch
+
+2010-12-04 14:48:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ tests: use GLib 2.22 API unconditionally
+
+2010-12-04 14:45:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/tag/lang.c:
+ * gst-libs/gst/tag/mklangtables.c:
+ * gst-libs/gst/video/convertframe.c:
+ libs: use GLib 2.22 API unconditionally
+
+2010-12-03 17:41:18 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com>
+
+ * Android.mk:
+ * android/NOTICE:
+ * android/alsa.mk:
+ * android/app.mk:
+ * android/app_plugin.mk:
+ * android/audio.mk:
+ * android/audioconvert.mk:
+ * android/decodebin.mk:
+ * android/decodebin2.mk:
+ * android/gdp.mk:
+ * android/gst-libs/gst/app/gstapp-marshal.c:
+ * android/gst-libs/gst/app/gstapp-marshal.h:
+ * android/gst-libs/gst/audio/audio-enumtypes.c:
+ * android/gst-libs/gst/audio/audio-enumtypes.h:
+ * android/gst-libs/gst/interfaces/interfaces-enumtypes.c:
+ * android/gst-libs/gst/interfaces/interfaces-enumtypes.h:
+ * android/gst-libs/gst/interfaces/interfaces-marshal.c:
+ * android/gst-libs/gst/interfaces/interfaces-marshal.h:
+ * android/gst-libs/gst/pbutils/pbutils-enumtypes.c:
+ * android/gst-libs/gst/pbutils/pbutils-enumtypes.h:
+ * android/gst-libs/gst/rtsp/gstrtsp-enumtypes.c:
+ * android/gst-libs/gst/rtsp/gstrtsp-enumtypes.h:
+ * android/gst-libs/gst/rtsp/gstrtsp-marshal.c:
+ * android/gst-libs/gst/rtsp/gstrtsp-marshal.h:
+ * android/gst-libs/gst/video/video-enumtypes.c:
+ * android/gst-libs/gst/video/video-enumtypes.h:
+ * android/gst/playback/gstplay-marshal.c:
+ * android/gst/playback/gstplay-marshal.h:
+ * android/gst/tcp/gsttcp-enumtypes.c:
+ * android/gst/tcp/gsttcp-enumtypes.h:
+ * android/gst/tcp/gsttcp-marshal.c:
+ * android/gst/tcp/gsttcp-marshal.h:
+ * android/interfaces.mk:
+ * android/netbuffer.mk:
+ * android/pbutils.mk:
+ * android/playbin.mk:
+ * android/queue2.mk:
+ * android/riff.mk:
+ * android/rtp.mk:
+ * android/rtsp.mk:
+ * android/sdp.mk:
+ * android/tag.mk:
+ * android/tcp.mk:
+ * android/typefindfunctions.mk:
+ * android/video.mk:
+ Add build system for Android
+
+2010-12-03 15:46:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ defs: add new symbol
+
+2010-10-27 13:49:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: additional tag extraction
+ ... supporting theora, flac, speex, celt.
+ Fixes #629349.
+
+2010-10-27 12:08:25 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggstream: use separate tag extraction vfunction
+
+2010-10-27 11:58:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: refactor vorbis comment tag extraction
+
+2010-10-27 11:16:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: plug some oggstream leaks
+
+2010-10-27 10:59:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggstream: streamline tag extraction and prevent some leaks
+
+2010-10-27 10:58:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: send stream tags after newsegment and global tags
+
+2010-09-14 23:08:51 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: perform more (vorbis comment header) tag extractions
+ In particular, move comment header parsing to gstoggstrem.c.
+ Thanks to Felipe Contreras.
+ Fixes #629349 (partially).
+
+2010-10-27 10:20:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ riff: document omitted field in _gst_riff_strf_auds
+ (aka WAVEFORMATEX)
+
+2010-10-10 17:15:53 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: fix incorrect warning on skeleton headers
+
+2010-11-20 19:02:50 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggparse: Set DELTA_UNIT on buffers
+
+2010-12-03 00:01:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ tests: fix video library unit test and skip non-working YUV9/YVU9 parts for now
+
+2010-12-02 23:49:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: add missing break statement for the GST_VIDEO_FORMAT_RGB8_PALETTED case
+
+2010-11-15 22:02:07 +0200 Evan Broder <evan@ebroder.net>
+
+ * tools/gst-visualise-m.m:
+ gst-visualise: trim unused perl dependency
+ Remove an unused perl module. Fixes #634522.
+
+2010-11-01 23:07:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: add some logging for failure case
+
+2010-11-01 23:06:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: log times in human readable form
+
+2010-11-01 22:44:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: more G_PARAM_STATIC_STRINGS use
+
+2010-11-01 22:42:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: move reoccuring logs to LOG and remove a double info
+ Less debug spew in DEBUG category. No need to log pad again if we use
+ GST_LOG_OBJECT(pad,...).
+
+2010-12-02 19:11:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ libgstrtsp: Fix typo in .pc to use for GIR
+
+2010-12-02 15:16:25 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ docs: Add a whole bunch of symbols that were unused to the proper sections
+
+2010-11-10 11:02:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: only parse TTL for IP4 addresses
+ Only IP4 addresses can have a TTL in the address.
+
+2010-11-10 10:53:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ * win32/common/libgstsdp.def:
+ sdp: add method to check for multicast addresses
+ Expose a previously internal method to check for multicast addresses.
+ See #634093
+
+2010-11-03 11:13:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstpluginsbaseversion.h.in:
+ pbutils: Take nano version into account in GST_CHECK_PLUGINS_BASE_VERSION()
+ If the nano is > 0 the current version should be handled the same as
+ micro + 1.
+
+2010-11-03 09:51:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add YUV9, YVU9 and IYU1 video formats
+ API: GST_VIDEO_FORMAT_YUV9: planar 4:1:0 YUV
+ API: GST_VIDEO_FORMAT_YVU9: planar 4:1:0 YUV (chroma planes swapped)
+ API: GST_VIDEO_FORMAT_IYU1: packed 4:1:1 YUV (Cr-Y0-Y1-Cb-Y2-Y3)
+
+2010-11-02 11:57:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add 8-bit paletted RGB
+ API: Add GST_VIDEO_FORMAT_RGB8_PALETTED
+ API: Add GST_VIDEO_CAPS_RGB8_PALETTED
+ API: Add gst_video_parse_caps_palette()
+
+2010-10-31 19:17:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ gnomevfssrc: Remove dead assignment
+
+2010-10-31 19:14:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/tcp/gsttcp.c:
+ tcp: Remove dead assignment
+
+2010-10-31 19:11:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: gen_video_chain() always returns a bin, no need to check for that
+
+2010-10-31 19:08:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: If we get EOS for an unknown stream just do nothing
+ instead of dereferencing NULL pointers. This can happen if the stream
+ was just removed from the streamsynchronizer in a bad time.
+
+2010-10-31 19:06:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: gen_video_deinterlace_chain() always returns a bin, no need to check that
+
+2010-10-31 19:01:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/v4l/v4l_calls.c:
+ v4l: If no video tuner is the requested one don't read unitialized data
+
+2010-10-25 14:13:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Add docs for the new property
+ Including Since markers
+
+2010-10-25 14:11:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Add docs for the new property
+ Including Since markers
+
+2010-10-25 14:09:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Use PROP_ instead of ARG_ for the property enums
+
+2010-10-25 14:09:20 +0100 Andrea Sebastianutti <andreailseba@virgilio.it>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Add read-only properties window-width and window-height
+
+2010-10-25 14:08:43 +0100 Andrea Sebastianutti <andreailseba@virgilio.it>
+
+ * sys/ximage/ximagesink.c:
+ ximagsink: Add read-only properties window-width and window-height
+
+2010-10-17 14:26:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Return correct component width/height for A420
+
+2010-12-02 00:15:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ Bump GLib requirement to >= 2.22
+ See http://gstreamer.freedesktop.org/wiki/ReleasePlanning/GLibRequirement
+
+2010-12-02 00:12:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development
+
+=== release 0.10.31 ===
+
+2010-11-30 19:25:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.31
+
+2010-11-24 17:34:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: disconnect signal handlers before disposing
+
+2010-11-22 00:54:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ docs: improve decodebin2 docs a little
+ Mention that new pads may be created even after no-more-pads.
+ https://bugzilla.gnome.org/show_bug.cgi?id=634584
+
+2010-11-20 15:45:49 -0800 Evan Nemerson <evan@coeus-group.com>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introspection: Add information on exported packages to GIRs
+ https://bugzilla.gnome.org/show_bug.cgi?id=635392
+
+2010-11-18 04:51:56 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ discoverer: Minor documentation fix
+ docs: Minor discoverer documentation fix
+
+2010-11-18 00:36:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.30.5 pre-release
+
+2010-11-18 00:35:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/bg.po:
+ * po/ca.po:
+ * po/es.po:
+ * po/hu.po:
+ * po/sk.po:
+ * po/tr.po:
+ po: update translations
+
+2010-11-18 00:33:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin.c:
+ decodebin: fix one more pad template ref leak
+
+2010-11-17 10:14:59 +0200 Harri Mähönen <harri.mahonen@gmail.com>
+
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gsturidecodebin.c:
+ *decodebin*: don't leak pad templates set on ghostpads
+ https://bugzilla.gnome.org/show_bug.cgi?id=635067
+
+2010-11-17 01:01:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ playbin2: disable streamsynchronizer magic for this release
+ Some things aren't quite right yet and cause problems (0-sized buffers
+ with PREROLL flag set cause crashes in elements that don't expect those;
+ getting pipeline back to preroll/playing again when audio/video streams
+ have different lengths and a seek past the end of one of the stream
+ happens doesn't always work, etc.). Needs further investigation in the
+ next cycle.
+ https://bugzilla.gnome.org/show_bug.cgi?id=633700
+ https://bugzilla.gnome.org/show_bug.cgi?id=634699
+
+2010-11-08 09:27:52 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Fix a gtk-doc gobject-introspection annotation
+ gst_discoverer_discover_uri() expects the caller to unref the returned
+ GstDiscovererInfo object. The corresponding gtk-doc annotation was not
+ updated to reflect this.
+
+2010-11-08 09:26:27 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * tools/gst-discoverer.c:
+ discoverer: Fix argument type to _container_info_get_streams()
+ No reason for gst_discoverer_container_info_get_streams() to not take a
+ GstDiscovererContainerInfo as its argument.
+
+2010-11-05 20:47:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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-03 10:35:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix IYU1 support
+ Fix conversions to IYU1, they allocated infinite amounts of memory before
+ because no conversion to IYU1 was actually implemented and it was running
+ into an infinite loop trying to find suitable intermediate formats.
+ Also fix the stride and sizes used for IYU1.
+
+2010-11-02 12:29:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/rtp.c:
+ tests: fix invalid free and buffer list leak in rtp library unit test
+
+2010-11-02 12:03:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: fix leak in tag library unit test
+
+2010-11-02 12:01:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: fix leak when parsing undefined EXIF tag into tag list
+ gst_buffer_set_data() does not set GST_BUFFER_MALLOCDATA, but
+ the code assumes the buffer takes ownership of the memory
+ allocated earlier.
+
+2010-11-02 11:57:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: fix GstDateTime leak when converting exif tag to tag list
+
+2010-11-01 17:00:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.30.4 pre-release
+
+2010-11-01 16:59:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/el.po:
+ * po/fr.po:
+ * po/ja.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/sl.po:
+ po: update translations
+
+2010-10-30 16:07:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: update docs for discoverer API changes as well
+
+2010-10-30 16:03:18 +0100 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ examples: update some more code for new Gtk+ API, with fallback for older Gtk+ versions
+ Move code to new Gtk+ 3.x / 2.9x API. We have defines in place
+ already that make this code work fine on older Gtk+ 2.x.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632653
+
+2010-10-28 15:13:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ seek: Define the new combobox API to the old functions if using older GTK
+ https://bugzilla.gnome.org/show_bug.cgi?id=632653
+
+2010-10-30 15:31:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstutils.def:
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstutils.dsp:
+ win32: remove unused libgstutils stuff
+ Cruft from before the lib was renamed to pbutils
+
+2010-10-28 18:51:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * tools/gst-discoverer.c:
+ * win32/common/libgstpbutils.def:
+ discoverer: rename boolean getters for consistency
+ Rename _get_is_image() to _is_image() and _get_interlaced() to _is_interlaced().
+ https://bugzilla.gnome.org/show_bug.cgi?id=633311
+
+2010-10-30 12:24:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ pbutils: remove padding from now-private GstDiscovererInfo structure
+
+2010-10-30 12:03:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * tools/.gitignore:
+ * tools/Makefile.am:
+ tools: rename gst-discoverer binary to gst-discoverer-0.10
+ We're not providing a wrapper like we do for the tools in core,
+ since wrappers are confusing (e.g. for debugging purposes),
+ mostly pointless (since the API is likely to change between
+ major versions), and cause packaging issues when packages for
+ two different major versions are to be installed in parallel.
+ https://bugzilla.gnome.org/show_bug.cgi?id=633023
+
+2010-10-30 11:41:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-discoverer.c:
+ tools: update gst-discoverer tool for last-minute API change
+ https://bugzilla.gnome.org/show_bug.cgi?id=633311
+
+2010-10-29 14:17:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: calculate better timeout value
+ We want to send the keealive message a little earlier than the timeout value
+ specifies. Scale this based on the value of the timeout instead of just assuming
+ 5 seconds.
+
+2010-10-29 14:24:54 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: don't let the rtsp connection timeout
+ Because we should act before the rtsp server does a timeout, we
+ reduce the timeout-time with 5 seconds, this should be safe to always
+ keep te rtsp connection alive.
+ https://bugzilla.gnome.org/show_bug.cgi?id=633455
+
+2010-10-28 15:55:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/videoscale.c:
+ videoscale: Add unit test for working reverse negotiation
+ See bug #633147.
+
+2010-10-29 11:48:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix wrong flowreturn handling
+ Oggdemux will currently try to pad alloc a buffer from the peer when it is
+ reading the header files. This is a relic from the time where we had an internal
+ parser and needs to be removed at some point in time.
+ The problem is that when there is no peer pad yet (which is normal when
+ collecting headers) we should still continue to parse all the packets of a
+ page instead of erroring out on NOT_LINKED.
+ Fixes #632167
+
+2010-10-29 11:47:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: add some more debug statements
+
+2010-10-26 16:41:28 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Fix subpicture overlay when deinterlacing disabled.
+ Fix a bug when reconfiguring the playsink where the subpicture
+ stream is broken by attempting to connect it through
+ streamsynchroniser and second time.
+
+2010-10-28 17:38:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ discoverer: use const in most of the getters
+
+2010-10-28 03:09:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ discoverer: use specific types in getters
+ Use GstDiscoverer{Audio,Video}Info in getters like
+ gst_discoverer_{audio,video}_info_get_*(). This avoids the casts in the macros,
+ help language bindings and is more correct.
+
+2010-10-28 11:56:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ discoverer: Move documentation to the correct section
+ And don't mention the (not existing) libgstdiscovery.
+ https://bugzilla.gnome.org/show_bug.cgi?id=633336
+
+2010-10-27 13:16:37 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 7bbd708 to 011bcc8
+
+2010-10-24 16:09:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Get pad caps if we can't get negotiated caps
+ Better provide something than nothing
+ https://bugzilla.gnome.org/show_bug.cgi?id=632988
+
+2010-10-24 15:38:30 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ discoverer: Don't ref a NULL caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=632988
+
+2010-09-24 16:02:42 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't add non prerolled stream to topology
+ If a final stream didn't preroll, don't add it to the topology since
+ it doesn't give any information at all.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632988
+
+2010-10-24 16:17:09 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Description for RealAudio container format
+
+2010-10-24 15:38:42 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for VP6 alpha and ASS subtitle
+
+2010-10-22 17:44:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.30.3 pre-release
+
+2010-10-20 11:01:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ seek: The new combo box text API is available since 2.23.0 and 2.91.1
+ Only use it conditionally.
+
+2010-10-20 11:01:14 +0200 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/examples/seek/jsseek.c:
+ seek: Don't use deprecated combo box text API
+ Fixes bug #632653.
+
+2010-10-21 12:24:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: workaround internal decodebin2 failing state change
+ Fixes #632656.
+
+2010-10-21 13:38:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/icles/test-colorkey.c:
+ * tests/icles/test-xoverlay.c:
+ tests: don't use deprecated gtk_widget_hide_all()
+ gtk_widget_hide_all() has been deprecated in gtk+ 2.x and
+ removed in 2.9x master. Just use gtk_widget_hide() instead.
+
+2010-10-21 13:07:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/Makefile.am:
+ tools: fix linking problems caused by accidentally linking against installed pbutils/gstvideo libs
+ Fixes build errors in jhbuild:
+ /foo/build/gst-plugins-base/gst-libs/gst/video/.libs/libgstvideo-0.10.so: undefined reference to `gst_element_factory_list_get_elements'
+ ../gst-libs/gst/pbutils/.libs/libgstpbutils-0.10.so: undefined reference to `gst_element_link_pads_full'
+ /foo/build/gst-plugins-base/gst-libs/gst/video/.libs/libgstvideo-0.10.so: undefined reference to `gst_element_factory_list_filter'
+ ../gst-libs/gst/pbutils/.libs/libgstpbutils-0.10.so: undefined reference to `gst_pad_link_full'
+ /foo/build/gst-plugins-base/gst-libs/gst/video/.libs/libgstvideo-0.10.so: undefined reference to `gst_plugin_feature_list_debug'
+
+2010-10-19 00:07:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/pbutils-marshal.list:
+ * gst-libs/gst/rtsp/gstrtsp-marshal.list:
+ libs: touch marshal.list files to force rebuild after Makefile.am changes
+ Force regeneration of marshal.[ch] files after prefix changes in
+ Makefile.am, to avoid build errors for those of us who don't
+ habitually make clean first.
+
+2010-10-16 01:08:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/pbutils-enumtypes.c:
+ * win32/common/pbutils-enumtypes.h:
+ * win32/common/video-enumtypes.c:
+ 0.10.30.2 pre-release
+
+2010-10-16 01:07:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/gl.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/lv.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: update translations
+
+2010-10-08 17:24:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ * tests/check/libs/tag.c:
+ tag: Adds GST_TAG_CAPTURING_SOURCE
+ Adds a tag to indicate the source/device used for the capture.
+ Already maps it in exif and adds tests.
+ API: GST_TAG_CAPTURING_SOURCE
+ https://bugzilla.gnome.org/show_bug.cgi?id=631773
+
+2010-10-08 15:51:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ * tests/check/libs/tag.c:
+ tag: Adds GST_TAG_CAPTURING_METERING_MODE
+ Adds a tag to inform what mode was used by a camera to calculate
+ the picture capturing exposure
+ Also adds mapping to exif and tests
+ API: GST_TAG_CAPTURING_METERING_MODE
+ https://bugzilla.gnome.org/show_bug.cgi?id=631773
+
+2010-10-08 15:14:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ * tests/check/libs/tag.c:
+ tag: Adds GST_TAG_CAPTURING_SHARPNESS
+ Adds new tag for tagging sharpness processing used
+ when capturing an image. Also maps it in the exif
+ tags.
+ Tests included.
+ API: GST_TAG_CAPTURING_SHARPNESS
+ https://bugzilla.gnome.org/show_bug.cgi?id=631773
+
+2010-10-15 23:54:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ * win32/common/libgstrtsp.def:
+ rtsp: don't export marshaller function
+ Make sure the marshaller function isn't exported. As it was
+ never in a public header file, this should be fine.
+
+2010-10-15 21:22:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ pbutils: fix distcheck
+ Apparently noinst implies dist.
+
+2010-10-15 11:23:02 -0700 David Schleef <ds@schleef.org>
+
+ * tests/check/Makefile.am:
+ tests: Don't dist generated orc code
+
+2010-10-15 11:22:45 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ Update generated orc code
+
+2010-10-15 19:18:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/pbutils.h:
+ * win32/common/libgstpbutils.def:
+ pbutils: make marshaller private
+ There's no reason to make the marshaller public API. Don't install
+ pbutils-marshal.h header file and use prefix that makes sure the
+ symbol doesn't get exported.
+
+2010-10-15 19:14:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ pbutils: use fewer variables in Makefile.am to make things clearer
+ Also fix typo in DISTCLEANFILES.
+
+2010-10-15 17:59:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump Orc requirement to 0.4.11
+ Has fixes for volume, among other things.
+
+2010-10-15 17:23:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ docs: improve gst_discoverer_new() docs a bit
+
+2010-10-15 16:43:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: private structs need to padding
+
+2010-10-15 11:26:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix stupid copy&paste error in last commit
+
+2010-10-13 22:51:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add support for A420
+
+2010-10-13 20:45:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: API: Add A420 video format
+ This is planar 4:2:0 YUV plus non-subsampled alpha plane.
+
+2010-10-14 12:31:39 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 5a668bf to 7bbd708
+
+2010-10-14 16:36:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: fix ADTS caps stream-format detail
+ Field should be "stream-format", not "stream-type".
+
+2010-07-08 15:22:08 +0200 Andrzej K. Haczewski <ahaczewski@gmail.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: extend AAC typefinder to detect LOAS streams
+ Extend AAC typefinder to recognize LOAS stream as specified by
+ ISO/IEC 14496-3:2009.
+ https://bugzilla.gnome.org/show_bug.cgi?id=623918
+
+2010-10-13 23:26:35 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gsturidecodebin.c:
+ *decodebin*: set pad-templates on ghostpads
+ This makes calling gst_pad_get_pad_template() work.
+
+2010-10-12 21:23:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: Update with latest datetime from core
+ Updates datetime functions to latest APIs in core
+
+2010-10-13 16:12:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/theora/gsttheoraparse.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstsubparse.c:
+ various: add a missing G_PARAM_STATIC_STRINGS flag to object properties
+
+2010-10-13 13:05:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: declare decodebin2 stable, deprecate the old decodebin
+ https://bugzilla.gnome.org/show_bug.cgi?id=624949
+
+2010-10-13 12:55:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ playbin2: declare stable, deprecate the old playbin
+ https://bugzilla.gnome.org/show_bug.cgi?id=624949
+
+2010-10-12 16:03:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: only keep last valid granulepos
+ Only keep the last valid granulepos we see when scanning the last
+ pages. It is possible that the last page that we inspect has a -1 granulepos, in
+ which case we want to keep the previous valid time instead.
+ Fixes #631703
+
+2010-10-10 15:22:52 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Fix check for last page
+
+2010-10-10 15:22:04 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: change checks from is_skeleton to is_sparse
+
+2010-10-10 15:17:31 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: move is_sparse into stream map
+
+2010-10-11 18:06:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: vorbis: adds missing lib
+ Adds missing lib to vorbis check tests makefile
+
+2010-10-11 14:30:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Set GST_ELEMENT_IS_SOURCE flag
+ uridecodebin behaves like a source, let's mark it as a source
+
+2010-10-10 00:52:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: expose telemetry properties only if libtheora was compiled with --enable-telemetry
+ Since this is just a debugging feature and libtheora will usually not be
+ compiled with that option enabled, we should maybe just hide these properties,
+ since they won't work anyway, and avoid confusing warnings.
+ Also rename properties to make them less cryptic.
+ https://bugzilla.gnome.org/show_bug.cgi?id=628488
+
+2010-10-09 23:49:35 +0100 Alexey Fisher <bug-track@fisher-privat.net>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoradec.h:
+ theoradec: add properties to enable debugging telemetry overlay
+ The theora decoder can overlay debugging information on the output
+ video. This functionality is only available if libtheora has been
+ compiled with --enable-telemetry. For more details see:
+ http://people.xiph.org/~xiphmont/demo/theora/demo2.html
+ Based on original patch by Michael Smith <msmith at xiph org>
+ https://bugzilla.gnome.org/show_bug.cgi?id=628488
+
+2010-10-10 18:35:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Make sure that the caps for upstream negotiation are simple caps
+ Fixes bug #631774.
+
+2010-10-09 14:17:57 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ examples: g_mapped_file_unref exists already since GLib 2.21.3
+
+2010-10-07 19:32:56 +0200 Guillaume Emont <gemont@igalia.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix seeking with negative rate with skeleton
+ Files with a skeleton, or other files with a stream that ends before the end of
+ the chain would start playing from the end of the chain when trying to seek with
+ a negative rate at a position between the end of any stream and the end of the
+ chain.
+ This is due to the loop in _do_seek() assuming that pages will be encountered
+ for all streams shortly after the place where we want to seek, as found by
+ do_binary_search().
+ In the first iteration of the loop, stream ends are now checked against the
+ time of the current page.
+
+2010-10-07 18:53:35 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: gdp protocol is deprecated. People should use gdppay instead.
+
+2010-10-08 12:43:28 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From c4a8adc to 5a668bf
+
+2010-09-28 12:17:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst-libs/gst/pbutils/gstdiscoverer-private.h:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ * gst-libs/gst/pbutils/pbutils-private.h:
+ pbutils: rename gstdiscoverer-private.h to pbutils-private.h
+
+2010-09-28 12:15:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst-libs/gst/pbutils/gstdiscoverer-private.h:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ pbutils: Use copy_and_clean_caps for description methods
+ This allows the various _get_*_description() methods to be more
+ forgiving with the provided caps.
+
+2010-10-08 12:51:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 5e3c9bf to c4a8adc
+
+2010-10-08 11:23:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ rtsp: make public _get_type() functions thread-safe
+
+2010-10-08 10:29:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ rtspurl: minor clean-up
+ Merge and const-ify two arrays that should be one.
+
+2010-10-08 10:06:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ rtsp: fix enum value name in enums that are public API
+ https://bugzilla.gnome.org/show_bug.cgi?id=629746
+
+2010-10-08 09:48:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audio: make public get_type() functions thread-safe
+
+2010-10-08 09:45:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audio: fix enum value name in enums that are public API
+ So run-time bindings can introspect the names correctly (we abuse this
+ field as description field only in elements, not for public API
+ (where the description belongs into the gtk-doc chunk).
+ https://bugzilla.gnome.org/show_bug.cgi?id=629746
+
+2010-10-08 12:30:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ volume: Regenerate generated orc C code again with an orc fix for loading double parameters
+
+2010-10-08 11:50:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ volume: Update generated orc sources
+
+2010-10-08 11:49:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Fix unit test failure for the controlled processing functions
+ Going over integer arithmetic will lead to minimal rounding errors,
+ leading to +/-1 changes for volume==1.0. Implement the controlled
+ processing with floating point arithmetic, which was already done
+ for the C versions anyway.
+
+2010-10-08 09:10:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Require orc 0.4.10
+
+2010-10-07 23:54:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ audioconvert: Update generated orc files
+
+2010-10-07 23:54:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc.orc:
+ volume: Update for orc changes
+ double parameters are declared with .doubleparam now.
+
+2010-10-03 11:21:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ volume: Update generated orc sources
+
+2010-10-03 12:00:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc.orc:
+ volume: Fix controlled processing via orc
+
+2010-10-03 11:24:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Actually enable usage of the orc optimized functions
+
+2010-10-03 11:20:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Implement int32 processing with orc
+
+2010-10-01 12:21:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Implement controlled processing for int16/1-2ch and int8/1,2,4ch with orc
+
+2010-10-01 11:13:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Implement controlled processing for f64/1ch and f32/1-2ch in orc
+
+2010-10-01 11:00:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Convert parts of the controlled processing to orc
+
+2010-10-01 10:44:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Implement f64 scaling with orc
+ This requires orc 0.4.10
+
+2010-10-01 10:38:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ audioconvert: Implement remaining conversion functions from/to doubles to orc
+ This requires orc 0.4.10
+
+2010-10-07 20:54:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: use g_object_notify_by_pspec() if possible
+ Use g_object_notify_by_pspec() when building against GLib >= 2.26.
+ This avoids the pspec lookup which takes the global paramspec pool lock.
+
+2010-10-07 20:37:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: use g_object_notify_by_pspec() if possible
+ Use g_object_notify_by_pspec() when building against GLib >= 2.26.
+ This avoids the pspec lookup which takes the global paramspec pool lock.
+
+2010-10-04 10:01:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: Do not advance segment starts beyond stop times
+ Advance stop times too when they are getting higher than the
+ stop time of segments, avoiding assertions.
+ The stop time has to be advanced too so that running time keep in sync
+ for gapless mode.
+ https://bugzilla.gnome.org/show_bug.cgi?id=631312
+
+2010-10-06 16:19:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/rtp.c:
+ tests: rtp: No need to unref buffer from bufferlist
+ Buffers obtained from buffer list iterators don't need to
+ be unreffed.
+ Test was failing due to this.
+
+2010-10-04 11:22:45 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ vorbisdec: reverse playback; decode pending buffers upon EOS
+
+2010-10-05 19:15:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: use math-compat.h here as well
+ Hopefully the powers that be don't mind the gst/glib include here
+ too much.
+
+2010-10-05 19:13:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: include new math-compat.h header for rint() on MSVC
+ Should fix compilation with Visual Studio 2008.
+ https://bugzilla.gnome.org/show_bug.cgi?id=630802
+
+2010-10-05 17:19:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtp.def:
+ win32: update def file with new RTP methods
+
+2010-10-05 17:13:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/rtp.c:
+ check: fix rtp checks
+ Fix the checks for the extension support in RTP.
+
+2010-10-05 16:36:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: fix position reporting
+
+2010-08-26 12:34:11 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ rtcpbuffer: Add function to manipulation the data in RTCP feedback packets
+ Add methods to get/set the length of the Feedback Control Information (FCI) as
+ well as getting a pointer to the FCI itself.
+
+2010-08-23 16:41:44 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * tests/check/libs/rtp.c:
+ tests: Test the manipulations of bufferlists containing RFC 5285 header extensions
+
+2010-08-23 14:24:21 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add function to transform a GstBuffer into a GstBufferList
+ Add a new function called gst_rtp_buffer_list_from_buffer() that takes
+ a GstBuffer containing a RTP packets and spits out a GstBufferList
+ containing two buffers, one with the header and the other with the payload.
+
+2010-08-22 19:44:38 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add functions to add RFC 5285 header extensions to GstBufferLists
+ Add functions to add header extensions to buffer lists, these functions only modify
+ the header part of the buffer lists, so the data is not copied.
+
+2010-08-22 17:22:21 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add function to read RFC 5285 header extensions from GstBufferLists
+
+2010-08-20 15:30:08 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * tests/check/libs/rtp.c:
+ tests: Add test for RTP header extension functions
+
+2010-08-20 17:13:06 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add function to add RTP header extensions with a two bytes header
+
+2010-08-20 12:54:38 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add function to append RFC 5285 one byte header extensions
+
+2010-08-19 16:26:18 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ rtpbuffer: Add function to parse RFC 5285 header extensions
+ RFC 5285 describes a generic method to add multiple header extensions to RTP packets.
+ These functions parse these headers and return them, both for the one-byte header and the
+ two bytes headers.
+
+2010-10-05 12:05:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ libvisual: only drop frames that are really too old
+ Also take the frame duration into account so that we don't drop frames that are
+ partially past the estimated QoS time.
+
+2010-10-05 12:01:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ libvisual: add latency query
+ Add our own latency to the latency query reply from upstream.
+
+2010-10-05 12:00:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ libvisual: add some defines
+ Add some defines for width/height/fps and a define for the minimum amount of
+ samples we need to buffer.
+
+2010-10-04 15:48:51 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * tools/gst-discoverer.c:
+ gst-discoverer: The 'ready' signal was renamed to 'finished'
+
+2010-10-04 17:27:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoraparse.c:
+ parse: Don't error on discont
+ We don't need to error out when we detect a discontinuity.
+
+2010-10-04 17:08:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoraparse.c:
+ theoraparse: set caps on streamheader too
+
+2010-10-04 13:07:14 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ build: Fix include path order for gir generation
+ This makes sure that the built girs are picked up over installed girs
+ where this is currently the case.
+
+2010-10-01 14:52:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ codec utils: populate mpeg4 caps "level" field with level, not profile
+ Call the right function to get the level. Also add some more debug
+ logging.
+
+2010-10-01 10:47:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ volume: Update generated orc files
+
+2010-10-01 10:42:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ volume: Improve f32 scaling by using only a single array
+ Passing the same array as dest and src is invalid anyway because
+ they're maked with the restrict qualifier.
+
+2010-09-30 15:19:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ pbutils: include config.h in codec utils
+
+2010-09-30 00:19:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/codec-utils.c:
+ docs: add new codec utils API to docs
+
+2010-05-01 01:03:18 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * gst-libs/gst/pbutils/codec-utils.h:
+ * win32/common/libgstpbutils.def:
+ pbutils: Add MPEG-4 Video profile/level extraction
+ This adds code to translate the profile_and_level indication from the
+ MPEG-4 video (ISO/IEC 14496-2) headers to a string profile/level. The
+ mappings are taken from the spec and Wireshark's code, and might need to
+ be expanded on.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617314
+ API: gst_codec_utils_mpeg4video_get_profile()
+ API: gst_codec_utils_mpeg4video_get_level()
+ API: gst_codec_utils_mpeg4video_caps_set_level_and_profile()
+
+2010-04-30 20:50:09 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * gst-libs/gst/pbutils/codec-utils.h:
+ pbutils: add H.264 profile/level extraction functions to codec utils
+ This adds code to parse the first few bytes of H.264 sequence parameter
+ set in order to extract the profile and level as const strings. This
+ code was originally in both qtdemux and matroskademux.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617314
+ API: gst_codec_utils_h264_get_level()
+ API: gst_codec_utils_h264_get_profile()
+ API: gst_codec_utils_h264_caps_set_level_and_profile()
+
+2010-04-30 15:12:04 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * gst-libs/gst/pbutils/codec-utils.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ * win32/common/libgstpbutils.def:
+ pbutils: add AAC profile detection to codec utils
+ This moves AAC profile detection to pbutils, and uses this in
+ typefindfunctions. This will also be used in qtdemux.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617314
+ API: gst_codec_utils_aac_get_profile()
+ API: codec_utils_aac_caps_set_level_and_profile()
+
+2010-04-30 13:41:17 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/codec-utils.c:
+ * gst-libs/gst/pbutils/codec-utils.h:
+ * gst-libs/gst/pbutils/pbutils.h:
+ * gst/typefind/Makefile.am:
+ * gst/typefind/gstaacutil.c:
+ * gst/typefind/gstaacutil.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ * win32/common/libgstpbutils.def:
+ pbutils: add codec-specific utility functions for AAC
+ This allows us to add generic codec-specific functionality, like
+ extracting profile/level data from headers, without having to duplicate
+ code across demuxers and typefindfunctions.
+ As a starting point, this moves over AAC level extraction code from
+ typefindfunctions, so it can be reused in qtdemux, etc.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617314
+ API: gst_codec_utils_aac_get_sample_rate_from_index()
+ API: gst_codec_utils_aac_get_level()
+
+2010-09-30 13:12:30 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: fix unused function warning with debug disabled
+
+2010-09-30 12:59:46 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: fix illegal use of internal debug category function
+ From gstinfo.h:
+ /* do not use this function, use the GST_DEBUG_CATEGORY_INIT macro */
+ GstDebugCategory *_gst_debug_category_new (const gchar * name,
+ And more importantly:
+ #pragma GCC poison _gst_debug_category_new
+ So this commit fixes --disable-gst-debug builds.
+
+2010-09-29 18:57:50 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-discoverer.c:
+ gst-discoverer: Print out topology if available.
+ If we have some unhandled streams, we can still print out the remaining
+ topology.
+
+2010-09-29 18:54:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't post async-done when not needed
+ Where it was previously located, we would get async-done for the first
+ unknown-type, even if other valid streams would appear afterwards.
+ decode_bin_expose() will take care of posting async-done when the group
+ is exposed.
+ But we still want to post it in case the typefinding returned an unknown
+ type, in which case we will post it after posting an error.
+ These two changes ensure we do as much as possible before posting async-done.
+
+2010-09-29 16:53:21 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basertpdepay: ensure metadata is writable
+
+2010-09-29 13:29:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add descriptions for more codecs
+
+2010-09-29 12:33:44 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/examples/seek/seek.c:
+ seek: Fix debug statement argument type
+
+2010-09-28 09:30:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tools/Makefile.am:
+ More makefile Fixes
+ Removing some not needed lines added in the last makefile
+ fixes commit (previous commit).
+ Also adds some more makefile files to check tests
+
+2010-06-17 14:32:22 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: allow render rectangle coordinates to be negative
+ Useful for cropped zooming.
+
+2010-06-17 14:33:44 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ xoverlay: allow render rectangle coordinates to be negative
+ This is useful for cropped zooming of the overlay.
+
+2010-09-28 15:15:57 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ xoverlay: fix endless loop in deprecated method
+
+2010-09-28 08:46:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/examples/app/Makefile.am:
+ * tools/Makefile.am:
+ Fixing Makefiles
+ Adds some missing lines to makefiles
+
+2010-09-27 18:14:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: add debug category for tags utility functions
+
+2010-09-27 14:36:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: try ISO-8859-1 as second fallback in case WINDOWS-1252 is not supported
+ Better safe than sorry. Some embedded systems may use crippled iconv
+ implementations or not support WINDOWS-1252 for other reasons.
+ https://bugzilla.gnome.org/show_bug.cgi?id=630471
+
+2010-09-23 23:53:48 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: when converting freeform strings try Windows-1252 as fallback instead of ISO-8859-1
+ Windows-1252 is a superset of ISO-8859-1, which uses some space
+ allocated to control characters for additional printable characters.
+ https://bugzilla.gnome.org/show_bug.cgi?id=630471
+
+2010-09-24 21:30:20 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: ptalarbvorm speed level goes to 3
+
+2010-09-24 16:31:37 +0200 Vladimir <wl2776 at gmail.com>
+
+ * tests/examples/seek/seek.c:
+ seek: Add #define for seekbar granularity
+ Fixes #630496
+
+2010-09-24 14:03:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/audio-enumtypes.c:
+ * win32/common/audio-enumtypes.h:
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/gstrtsp-enumtypes.h:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/interfaces-enumtypes.h:
+ * win32/common/pbutils-enumtypes.c:
+ * win32/common/pbutils-enumtypes.h:
+ * win32/common/video-enumtypes.c:
+ * win32/common/video-enumtypes.h:
+ win32: define GST_PACKAGE_RELEASE_DATETIME in win32 config.h as well
+ Also update enums.
+
+2010-09-24 00:25:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/.gitignore:
+ .gitignore: ignore new appsrc unit test
+
+2010-09-24 13:09:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: add Since markers
+ Fixes #630443
+
+2010-07-30 13:54:42 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * win32/common/libgstaudio.def:
+ baseaudiosink: Added getter and setter for drift tolerance.
+
+2010-09-24 12:54:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: subtract the render_delay from our latency
+ The latency reported by the base class includes the render_delay, which we don't
+ want to include when we start slaving our clocks.
+ See #630441
+
+2010-09-23 23:57:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: Use G_DEFINE_ABSTRACT_TYPE instead of manual GObject boilerplate code
+ This also makes the _get_type() function threadsafe.
+ Fixes bug #630440.
+
+2010-09-23 10:16:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tags: exif: Add mapping for _HORIZONTAL_ERROR
+ Maps GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR to the
+ GPSHPositionError tag in exif.
+ Tests included.
+
+2010-09-22 14:10:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ * tests/check/Makefile.am:
+ * tests/check/elements/appsrc.c:
+ appsrc: Do not override buffer caps if appsrc caps is null
+ Make appsrc not set caps on buffers when its own caps is NULL.
+ This avoids calling make_metadata_writable on all buffers and
+ prevents losing buffer caps in case we are not replacing it
+ with something meaningful.
+ https://bugzilla.gnome.org/show_bug.cgi?id=630353
+
+2010-09-21 18:57:42 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraenc.h:
+ theoraenc: Make the bitrate/quality dynamically modifiable
+ https://bugzilla.gnome.org/show_bug.cgi?id=630303
+
+2010-09-22 12:35:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * tools/gst-discoverer.c:
+ discoverer: Fixup DiscovererResult handling
+ This was a leftover from the changes from a flag to an enum
+
+2010-09-22 12:10:24 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: We don't need the signals from the queues
+
+2010-09-22 01:50:21 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/Makefile.am:
+ gst-libs: build pbutils after video
+ Because pbutils now depends on video.
+
+2010-09-21 18:33:36 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From aa0d1d0 to 5e3c9bf
+
+2010-09-20 21:04:48 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ discoverer: fix docs
+ While the doc parser allows for certain variation, it is a good idea to not
+ use random characters here and there, but try to stick to the little markup
+ syntax there is.
+
+2010-09-20 16:45:32 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ discoverer: Fix debug statement.
+ Fixes build on macosx
+
+2010-09-20 16:28:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/volume/gstvolumeorc-dist.c:
+ volume: orc fixup for loading float arguments
+ This is only used with DISABLE_ORC.
+
+2010-09-20 11:24:10 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/.gitignore:
+ * tools/Makefile.am:
+ * tools/gst-discoverer.c:
+ tools: Standalone tool for discovering media file properties
+ Fixes #625944
+
+2010-09-20 11:23:36 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstpbutils.def:
+ win32: Update with symbols from GstDiscoverer
+ Fixes #625944
+
+2010-09-20 11:23:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ docs: Documentation for new pbutils GstDiscoverer
+ Fixes #625944
+
+2010-09-20 11:22:32 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/pbutils/.gitignore:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/gstdiscoverer-private.h:
+ * gst-libs/gst/pbutils/gstdiscoverer-types.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.c:
+ * gst-libs/gst/pbutils/gstdiscoverer.h:
+ * gst-libs/gst/pbutils/pbutils-marshal.list:
+ * gst-libs/gst/pbutils/pbutils.h:
+ pbutils: New Discoverer utility
+ Fixes #625944
+
+2010-09-20 11:13:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add mp3 to the apetag extensions
+
+2010-09-18 13:15:08 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix regression in ball pattern
+ Was painting using two different methods.
+
+2010-09-17 11:46:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: Fix ACCEPTABLE_CHAR() macro to work with signed and unsigned chars
+
+2010-09-17 11:44:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ Revert "sdp: Remove useless check in macro"
+ This reverts commit e6a041b69fd21c42651d98cf8a3064e43cecc51c.
+ It's not a useless check, the signedness of "char" and "gchar" is
+ defined by the ABI.
+
+2010-09-17 10:43:04 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: Remove useless check in macro
+ A signed char is always < 128. Fixes a warning on macosx build.
+
+2010-09-16 18:03:23 -0700 David Schleef <ds@schleef.org>
+
+ * gst/adder/gstadderorc-dist.c:
+ * gst/adder/gstadderorc-dist.h:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.h:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ orc: update generated files to fix MSVC compile issues
+
+2010-09-16 17:56:31 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/gstvideoscaleorc.orc:
+ videoscale: Don't use broken orc feature
+
+2010-09-16 19:30:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ xoverlay: G_GUINTPTR_FORMAT is since 2.22
+ Don't rely on too new symbols, we only depend on 2.20.
+
+2010-09-16 15:01:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/playrec/.gitignore:
+ * tests/examples/playrec/Makefile.am:
+ * tests/examples/playrec/playrec.c:
+ examples: add synchronized playback and capture example
+ Add an example that demonstrates synchronized playback and capture.
+
+2010-09-16 17:15:32 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Fix indentation
+
+2010-09-16 17:14:20 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: add bar pattern
+ Simple bar with foreground color on the background color
+
+2010-09-16 15:07:15 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * tests/check/elements/videotestsrc.c:
+ tests: use gst-check API in videotestsrc
+ use gst_check_drop_buffers in videotestsrc to
+ clear the global buffers list.
+
+2010-09-16 14:55:55 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * tests/check/elements/videotestsrc.c:
+ tests: Fix unit test of videotestsrc
+ Use UYVY for unit tests, it's exactly the same as Y422.
+ (which is currently disabled in videotestsrc)
+
+2010-09-15 15:13:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update for new strings
+
+2010-09-15 15:12:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ docs: add Since: comment to docs for new GST_VIDEO_FORMAT_UYVP
+
+2010-09-14 11:20:42 -0400 Tristan Matthews <le.businessman@gmail.com>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ gnomevfsrc: set GST_PARAM_MUTABLE_READY flag on the "handle" property
+ Fixes #629672
+
+2010-09-15 15:19:04 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: fix segfault on negative horizontal-speed
+
+2010-09-15 14:15:13 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Actually dispose the unused ghostpads
+
+2010-09-15 11:28:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/speex_resampler.h:
+ * gst/audioresample/speex_resampler_wrapper.h:
+ Revert "audioresample: Add GAP flag support"
+ This reverts commit 129af0d8e6a74e8edef3e77c3626616b674b7cc1.
+ This shouldn't be committed at all, it isn't ready and apparently
+ was in the wrong branch locally.
+
+2010-09-15 11:26:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/video.h:
+ * tests/check/libs/video.c:
+ video: Add a destroy notify parameter to gst_video_convert_frame_async()
+ Binding generators apparently need this as they can't really know
+ that the callback is guaranteed to be called exactly once and that
+ the user_data can be freed at the end of it.
+
+2010-09-14 12:00:39 +0200 Leo Singer <lsinger@caltech.edu>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/speex_resampler.h:
+ * gst/audioresample/speex_resampler_wrapper.h:
+ audioresample: Add GAP flag support
+ Fixes bug #586570.
+
+2010-09-05 15:17:47 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ * sys/v4l/gstv4lxoverlay.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/examples/overlay/qt-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-xoverlay.cpp:
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/stress-xoverlay.c:
+ * tests/icles/test-colorkey.c:
+ * tests/icles/test-xoverlay.c:
+ * win32/common/libgstinterfaces.def:
+ xoverlay: Add guintptr versions of functions
+ And deprecate the gulong versions. This is to support platforms
+ where sizeof(unsigned long) < sizeof(void *). Fixes #627565.
+ API: Add gst_x_overlay_set_window_handle()
+ API: Deprecate: gst_x_overlay_set_xwindow_id()
+ API: Add gst_x_overlay_got_window_handle()
+ API: Deprecate: gst_x_overlay_got_xwindow_id()
+ API: Add GstXOverlay::set_window_handle()
+ API: Deprecate: GstXOverlay::set_xwindow_id()
+
+2010-09-14 12:31:58 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add UYVP
+
+2010-09-12 20:36:19 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Various improvements
+ Replace moving-color-bars pattern with smpte100, and change
+ moving-speed to horizontal-speed. Default is now 0. Add
+ a rotation stage to pattern building.
+ Allocate a temporary scanline for building images. Remove
+ unused code. Disable several patterns that we're unable to
+ test and probably never used. Add other variants of bayer
+ sampling. Convert some patterns to use videotestsrc_blend_line.
+
+2010-09-10 18:10:40 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: clean up blink pattern
+
+2010-09-10 15:57:54 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Clean up the RGB code
+
+2010-09-10 14:40:44 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Convert to intermediate AYUV/ARGB
+ Scanlines are generated into AYUV/ARGB, then converted to the
+ various formats.
+
+2010-09-10 12:48:30 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: rearrange code to work on scanlines
+
+2010-09-10 12:03:07 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix recent breakage of smpte75 pattern
+
+2010-09-01 15:18:31 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: add moving color bars pattern
+ This pattern is moving the color bars with a given
+ speed. Negative speed is inverting the moving direction.
+ https://bugzilla.gnome.org/show_bug.cgi?id=628500
+
+2010-06-14 15:42:09 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videoscale/vs_image.c:
+ * gst/videoscale/vs_scanline.c:
+ videoscale: refactor using more Orc code
+ Convert downsampling to Orc. Convert horizontal linear scaling
+ to Orc. Combine horizontal and vertical scaling into one pass.
+
+2010-09-12 19:34:28 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add UYVP, 10-bit 4:2:2
+
+2010-09-14 08:41:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ video: Add gst_video_convert_frame_async() to the docs
+
+2010-09-14 08:40:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: Add gst_video_convert_frame() and gst_video_convert_frame_async() to the .def files
+
+2010-09-14 08:40:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ video: Add unit test for gst_video_convert_frame_async()
+
+2010-09-14 08:39:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/video.h:
+ video: Add async variant of the convert frame function
+ API: gst_video_convert_frame_async()
+
+2010-09-12 16:53:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ video: Add a simple unit test for the new convert_frame API
+ Unfortunately this can't test the encoding because there's no
+ image encoder in base.
+
+2010-09-12 16:51:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ video: Strip framerate from the target caps
+ There will always be only a single output buffer and if the
+ target caps have a different framerate than the input there
+ will be a negotiation error during conversion.
+
+2010-09-12 16:36:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/convertframe.c:
+ video: Refactor convert_frame a bit and fix some minor memory leaks in error cases
+
+2010-09-09 14:11:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ * gst/playback/gstscreenshot.c:
+ * gst/playback/gstscreenshot.h:
+ playback: Switch to using gst_video_convert_frame
+ https://bugzilla.gnome.org/show_bug.cgi?id=629157
+
+2010-09-09 13:44:54 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/convertframe.c:
+ * gst-libs/gst/video/video.h:
+ video: Add new method for converting a video frame
+ https://bugzilla.gnome.org/show_bug.cgi?id=629157
+
+2010-09-13 10:02:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: prevent another race with shutdown state change
+
+2010-09-11 14:55:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstsdp.def:
+ win32: Add new SDP symbols to the .def files
+
+2010-09-10 18:42:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: remove leftover g_print
+
+2010-09-10 17:55:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ sdp: add methods to convert between uri and message
+ Add methods to convert between uri and sdpmessages, loosly based on
+ http://tools.ietf.org/html/draft-fujikawa-sdp-url-01
+ API: GstSDPMessage::gst_sdp_message_parse_uri
+ API: GstSDPMessage::gst_sdp_message_as_uri
+
+2010-09-10 10:40:52 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * tests/check/elements/videotestsrc.c:
+ tests: videotestsrc change the pattern property for the tests
+
+2010-09-10 08:42:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadderorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.c:
+ orc: Fix generated source files
+
+2010-09-09 20:45:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ tests: fix passing of URIs containing '*' and '?' to the seek example
+ Only do wildcard expansion (why?!) on things that look like local
+ file paths. Fixes passing of URIs containing '*' and '?' (see #629212).
+
+2010-09-09 21:51:18 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * 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 11:12:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: Do debug category initialization in plugin_init again
+
+2010-09-09 10:59:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadderorc-dist.c:
+ * gst/adder/gstadderorc-dist.h:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.h:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ orc: Update generated source files everywhere
+
+2010-09-09 10:57:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadderorc.orc:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ * gst/audioconvert/plugin.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrcorc.orc:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ Revert "Revert "Use init functions for Orc code""
+ This reverts commit 93aa13639d74449dc68296427e5dbcfe8aca5f51.
+ Everything should work now after regenerating the disted source files.
+
+2010-09-07 19:04:23 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstaudio.def:
+ win32: Add new symbol to libgstaudio
+
+2010-09-07 18:09:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudio: avoid taking extra ref on sink/src
+ Don't take an extra ref on the sink and source because that creates a reference
+ cycle. Instead, use the invalidate method of the clock when the sink and source
+ are freed. This way, we don't call into the time function anymore after the
+ objects are disposed.
+
+2010-09-07 18:06:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ audioclock: add a function to invalidate the clock
+ Add a function to invalidate the time function of a clock. Useful for when the
+ function becomes invalid.
+
+2010-09-07 16:26:56 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/Makefile.am:
+ check: Fix linking order of libs/tag
+
+2010-09-07 16:26:30 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/gst-plugins-base.supp:
+ check: Make fontconfig leak suppression more generic
+
+2010-09-07 08:46:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds mappings for new image ppi tags
+ Adds mappings for GST_TAG_IMAGE_HORIZONTAL/VERTICAL_PPI into
+ our exif lib
+ Tests included.
+ Fixes #626570
+
+2010-09-07 08:22:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tags: Add GST_TAG_IMAGE_HORIZONTAL/VERTICAL_PPI tags
+ Adds new tags for representing the intended PPI of images/videos
+ API: GST_TAG_IMAGE_HORIZONTAL_PPI
+ API: GST_TAG_IMAGE_VERTICAL_PPI
+ Fixes #626570
+
+2010-09-07 11:41:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From c2e10bf to aa0d1d0
+
+2010-09-06 18:17:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ rtp: improve basertpdepayload's error message when no input caps were set
+ This is pretty much an FAQ, so try to make the error message a bit
+ more helpful. Also, don't tell people to file a bug in bugzilla
+ about this (which is what happens if the default error message for
+ CORE_NEGOTIATION is used).
+
+2010-09-06 13:14:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtppayload: notify of first timestamp/seqnum
+ Notify of the first timestamp/seqnum pushed out by the payloader.
+ Fixes #612264
+
+2010-09-06 11:53:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/videotestsrc/.gitignore:
+ videotestsrc: .gitignore new generate_sine_table
+
+2010-09-06 11:44:17 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstinputselector.h:
+ * gst/playback/gstplaybin2.c:
+ playback: ref the selector pad class inside input-selector
+ Minimizes the delta to original element in -bad and allows us to keep the
+ type static.
+
+2010-09-05 20:57:48 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/Makefile.am:
+ * gst/videotestsrc/generate_sine_table.c:
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Use static sine table
+
+2010-09-05 20:35:13 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Add foreground/background-color properties
+ Replace solid-color property with foreground-color and add
+ background-color. Pull some common code out of each of the
+ pattern generating functions. Fix many of the patterns to
+ use foreground-color/background-color instead of white/black.
+ Generated images are indentical to previously if foreground-color
+ and background-color are left as default.
+ API: GstVideoTestSrc::foreground-color
+ API: GstVideoTestSrc::background-color
+
+2010-09-05 18:58:03 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From d3d9acf to c2e10bf
+
+2010-09-05 17:04:31 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: deprecate colorspec property
+ Fixes: #616392.
+
+2010-09-05 12:57:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ audioconvert: Simplify float->s32 conversion
+ orc 0.4.7 is doing saturated conversion from floats to integers
+ and it's not necessary to do this manually anymore.
+
+2010-09-05 12:14:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ca1c867 to d3d9acf
+
+2010-09-05 12:12:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ audioconvert: Update disted orc files
+
+2010-09-05 12:09:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Enable float processing with orc again
+
+2010-09-05 12:08:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Require orc 0.4.8.1 for the volume test
+
+2010-08-26 19:16:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ audioconvert: Use the ORC double support
+
+2010-09-04 09:06:08 +0200 Leo Singer <lsinger@caltech.edu>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ exiftag: Fix compiler warnings with old gcc versions
+ Old gcc complains about possibly uninitialized variables which
+ are always initialized before usage in reality. Fixes bug #628747.
+
+2010-08-06 11:53:38 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstfactorylists.c:
+ * gst/playback/gstfactorylists.h:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: Switch to gstfactorylist from core
+ https://bugzilla.gnome.org/show_bug.cgi?id=626181
+
+2010-09-02 12:57:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: fix typo in property description
+
+2010-09-01 17:52:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Add support for AYUV
+
+2010-09-01 11:37:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: Fill segment until the end on EOS
+
+2010-09-01 11:33:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Fill the segment on EOS or at least produce enough frames to use the complete buffer duration
+ Fixes bug #628400.
+
+2010-09-01 11:22:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Don't ignore flow returns when filling the previous segment during NEWSEGMENT handling
+
+2010-09-01 11:11:47 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * tests/examples/seek/seek.c:
+ seek: allow seeking behind the currently downloaded position.
+
+2010-09-01 10:06:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: use GST_BOILERPALTE macro
+
+2010-08-31 10:09:51 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ playback: Set queues silent property to TRUE
+ We don't use the queue signals within playsink.
+
+2010-08-30 14:59:22 -0500 Rob Clark <rob@ti.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: fix Cb/Cr inversion for colored text overlays
+ In case of odd values for xpos or ypos, the division by two in CbCr
+ plane would result in an off-by-one error, which in the case of NV12,
+ NV21, or UYVY would cause inversion of blue and red colors. (And
+ would be not so easily noticed for I420 as it would just cause the
+ chroma to be offset slightly from the luma.)
+ This patch also fixes a silly typo from the earlier patch which
+ added NV12 support that broke UYVY support.
+
+2010-08-30 15:50:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't reset the pad when pushing resulted in NOT_LINKED
+ The pad might be linked later and after resetting it it will
+ only work after resetting all of oggdemux.
+
+2010-08-27 20:45:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Only enable progressive downloading if the upstream duration in bytes is known
+ Otherwise we might try to enable it for live streams, where this would
+ cause playback to fail completely.
+ Fixes bug #628028.
+
+2010-08-27 17:23:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't use GST_FLOW_IS_FATAL()
+ And while we're at it, handle WRONG_STATE as error too
+ in oggdemux and WRONG_STATE and NOT_LINKED in oggaviparse.
+
+2010-08-27 11:49:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadderorc.orc:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ * gst/audioconvert/plugin.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrcorc.orc:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ Revert "Use init functions for Orc code"
+ This reverts commit b2051090b43f82b23bb01826f09053479bbd7874.
+ Fixes the build again until someone pushes the regenerated .c/.h
+ files too.
+
+2010-08-22 23:01:19 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: clean up code
+ Merge various color structures into one.
+
+2010-08-22 22:16:45 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Add ball pattern
+
+2010-08-19 15:43:09 -0700 David Schleef <ds@schleef.org>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadderorc.orc:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ * gst/audioconvert/plugin.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrcorc.orc:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc.orc:
+ Use init functions for Orc code
+
+2010-08-26 15:17:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/volume/gstvolume.c:
+ volume: make the orc usage for float conditional again
+ See bug #628009. The tests still fail in the orc code (which we just don't call
+ now).
+
+2010-08-25 12:19:05 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add support for 2vuy
+ It is the apple alternative for Microsofts UYVY.
+ (http://ntta.szm.com/Tutors/FourCC.htm)
+ Only use the UYVY for the caps to enable support in other
+ gstreamer elements.
+ https://bugzilla.gnome.org/show_bug.cgi?id=627924
+
+2010-08-25 19:01:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ * gst/volume/gstvolumeorc.orc:
+ volume: enable ORC for float in volume
+
+2010-08-25 11:19:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/tag/gstexiftag.c:
+ configure: Add check for log2
+ Adds check for log2 and only use it in exif library if it is
+ available.
+
+2010-08-25 15:32:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ tag: Link to $(LIBM) for pow(), log2() and friends
+
+2010-08-25 08:41:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Move some tags to their correct IFDs
+ Put some tags in their correct IFDs
+
+2010-08-20 16:39:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Always write FlashPixVersion tag
+ FlashPixVersion is mandatory and constant. Write it always.
+
+2010-08-20 15:59:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds flash tags mapping
+ Adds a mapping for GST_TAG_CAPTURING_FLASH_FIRED/_MODE to
+ the exif Flash tag.
+ Tests included.
+
+2010-08-19 15:47:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ * win32/common/libgsttag.def:
+ tag: exif: More photography mappings
+ Adds mappings from:
+ GST_TAG_CAPTURING_EXPOSURE_PROGRAM -> ExposureProgram
+ GST_TAG_CAPTURING_EXPOSURE_MODE -> ExposureMode
+ GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE -> SceneCaptureType
+ GST_TAG_CAPTURING_GAIN_ADJUSTMENT -> GainControl
+ GST_TAG_CAPTURING_WHITE_BALANCE -> WhiteBalance
+ GST_TAG_CAPTURING_CONTRAST -> Constrast
+ GST_TAG_CAPTURING_SATURATION -> Saturation
+ Also renames gst_tag_image_orientation_from_exif_value and
+ gst_tag_image_orientation_to_exif_value to remove the 'gst'
+ prefix and not including in the win32 defs.
+ Tests included.
+
+2010-08-19 09:39:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Add macros for the exif ids
+ Use macros for exif ids to avoid having those numbers spread
+ all over the code.
+
+2010-08-17 15:56:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds photography tags mappings
+ Adds the following mappings for the exif helper:
+ * GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO -> DigitalZoomRatio
+ * GST_TAG_CAPTURING_FOCAL_LENGTH -> FocalLength
+ * GST_TAG_CAPTURING_SHUTTER_SPEED -> ExposureTime, ShutterSpeedValue
+ * GST_TAG_CAPTURING_FOCAL_RATIO -> FNumber, ApertureValue
+ * GST_TAG_CAPTURING_ISO_SPEED -> ISOSpeed, PhotographicSensitivity
+ Tests included.
+
+2010-08-17 15:05:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds mapping for GST_TAG_APPLICATION_DATA
+ Adds mapping for GST_TAG_APPLICATION_DATA to the exif
+ 'maker-note' tag.
+
+2010-08-20 14:54:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tag: Adds GST_TAG_CAPTURE_FLASH_FIRED/_MODE
+ Adds a new tag for informing if flash was used while
+ capturing an image and the flash mode selected by the
+ user during this capture
+ API: GST_TAG_CAPTURING_FLASH_FIRED
+ API: GST_TAG_CAPTURING_FLASH_MODE
+ https://bugzilla.gnome.org/show_bug.cgi?id=626651
+
+2010-08-17 07:21:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tag: More photography related tags
+ API: GST_TAG_CAPTURING_EXPOSURE_PROGRAM
+ API: GST_TAG_CAPTURING_EXPOSURE_MODE
+ API: GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE
+ API: GST_TAG_CAPTURING_GAIN_ADJUSTMENT
+ API: GST_TAG_CAPTURING_WHITE_BALANCE
+ API: GST_TAG_CAPTURING_CONTRAST
+ API: GST_TAG_CAPTURING_SATURATION
+ Fixes #626651
+
+2010-08-17 06:47:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ tag: Adds some basic photography tags
+ Adds the following basic photography tags.
+ API: GST_TAG_CAPTURING_SHUTTER_SPEED
+ API: GST_TAG_CAPTURING_FOCAL_RATIO
+ API: GST_TAG_CAPTURING_FOCAL_LENGTH
+ API: GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO
+ API: GST_TAG_CAPTURING_ISO_SPEED
+ Fixes #626651
+
+2010-08-24 15:06:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ audioconvert: Require ORC 0.4.7 for the loadl/storel opcodes
+ And update disted files to allow compilation with no or too old ORC.
+
+2010-08-24 11:39:09 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: Make sure FLUSH_STOP is always sent after a flushing seek.
+ Send FLUSH_STOP right after forwarding the seek event upstream if necessary.
+ This makes sure that adder->srcpad is not left flushing if seeking fails or if
+ upstream is blocked.
+ The same fix was already applied to videomixer in 49b2a946.
+
+2010-08-24 11:11:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ audioconvert: Use ORC for the float<->int32 conversion
+ This should speed up standard Vorbis encoding and decoding pipelines a bit.
+ Thanks to David Schleef for the assistance to get the ORC code right
+ and explaining everything.
+
+2010-08-24 10:12:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Support NV21 too and minor cleanups
+
+2010-08-24 10:03:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix component width for NV12/NV21
+ Both have width/2 as component width for the chroma planes.
+
+2010-08-24 09:51:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix NV21 rendering
+ Using the same as for NV12 will result in wrong colors and crashes.
+
+2010-08-23 18:51:18 -0400 Chris Shoemaker <chris.shoemaker@cox.net>
+
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gstclockoverlay.h:
+ clockoverlay: only rerender text if time string has changed
+ The textoverlay element will rerender the text string whenever
+ overlay sets the 'need_render' flag to TRUE. Previously, we
+ lazily set the flag to TRUE every time the time string was requested.
+ Now, we save a copy of the previously given string, and only set
+ 'need_render' to TRUE if the string has changed.
+ In my tests with a 30fps video stream, and a time string including
+ a seconds field, this change reduced the CPU usage of the clockoverlay
+ element from 60% to 5%.
+ Fixes bug #627780.
+
+2010-08-23 13:59:38 -0500 Rob Clark <rob@ti.com>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: add NV12 support
+ Fixes bug #627768.
+
+2010-08-20 12:03:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Mark duplicated frames with the GAP flag
+ We currently don't use the GAP flag for video and the docs say
+ that this is for buffers, that have been created to fill a gap
+ and contains neutral data. For video this is the previous frame.
+ This information can be used by encoders to encode the duplicated
+ frames more efficiently. See bug #627459.
+
+2010-08-19 18:51:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Add back support for 8 bit paletted RGB
+ This was removed by 3a00a97fd2b4015e93cdcabaa75da406aa599570
+ while making the pad template caps more compact.
+ Fixes bug #626629.
+
+2010-08-18 16:45:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ alsasrc/sink: add property to get the card name
+ fixes #627203
+
+2010-08-18 16:42:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsa.c:
+ * ext/alsa/gstalsa.h:
+ alsa: add method to retrieve the card name
+ Reuse an existing method to retrieve the card name.
+
+2010-08-18 12:34:07 +0200 American Dynamics <GStreamer-Bugs at tycosp.com>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basertpdepay: don't clear the discont flag too early
+ Set the discont flag when we receive a DISCONT buffer and only clear the discont
+ state when we pushed out a DISCONT buffer.
+ Fixes #626869
+
+2010-08-14 19:08:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ docs: fix typo in appsink docs so function gets cross-referenced properly
+
+2010-08-14 19:02:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * configure.ac:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ build: use new AG_GST_PKG_CONFIG_PATH m4 macro from common
+ Sets up a GST_PKG_CONFIG_PATH variable for use in Makefile.am
+ (avoids trailing ':' in PKG_CONFIG_PATH used).
+
+2010-08-14 18:36:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introspection: set PKG_CONFIG_PATH so that our in-tree libs come first when calling scanner
+ When calling gobject-introspection scanner, make sure our own
+ freshly-built libs within the source tree (well, build dir) come
+ first in the PKG_CONFIG_PATH. May or may not help to make sure
+ that it doesn't pick up older external plugins-base libs (or
+ .gir files) from outside the source tree / build directory as
+ dependencies of the introspected lib instead of using the
+ stuff we just built in a sibling directory.
+ https://bugzilla.gnome.org/show_bug.cgi?id=623698
+
+2010-08-06 17:16:27 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: Delay usage of GstFactoryList
+ By delaying it to when it's actually needed, we speed things up a bit
+ since some elements might have been added/removed in between.
+ https://bugzilla.gnome.org/show_bug.cgi?id=626718
+
+2010-06-17 09:10:11 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playbin2: uridecodebin: add property to configure ring buffer size
+
+2010-08-13 17:23:46 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 3e8db1d to ec60217
+
+2010-08-13 13:59:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ plugin-docs: the <TITLE> tag should come right after <FILE>.
+ Fixes missing plugin entries. If the object name, e.g. GstGIOSrc came before the
+ title, we ended up with differnt section_id in the generated docbook.
+
+2010-08-12 18:14:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: fix the classification.
+ Change "Src" into "Source" (we use that elsewhere). I did not keept "Src" as it
+ is quite unlikely that someone plugs appsrc by searching the registry by classification.
+
+2010-08-12 15:26:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ alsa: remove 'dir' out variable
+ Alsa seems to expect that we initialize it. Remove the variable and pass NULL
+ as we actually don't use it. In alsasink also #ifdef one section that is
+ grabing diagnostics to be disabled, when logging is disabled (the code was
+ using the out parameter as well).
+ Fixes #626125
+
+2010-08-12 11:46:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: remove chroma-site and color-matrix fields from RGB caps
+
+2010-08-11 12:49:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: prevent deadlock with _chain when deactivating pad
+ Fixes #626581.
+
+2010-08-12 12:50:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/Makefile.am:
+ playback: bad bad editor, readd missing line to fix the build
+
+2010-08-12 12:08:35 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/playback/.gitignore:
+ * tests/examples/playback/Makefile.am:
+ * tests/examples/playback/decodetest.c:
+ * tests/examples/playback/test.c:
+ * tests/examples/playback/test2.c:
+ * tests/examples/playback/test3.c:
+ * tests/examples/playback/test4.c:
+ * tests/examples/playback/test5.c:
+ * tests/examples/playback/test6.c:
+ * tests/examples/playback/test7.c:
+ * tests/icles/Makefile.am:
+ * tests/icles/playback/.gitignore:
+ * tests/icles/playback/Makefile.am:
+ * tests/icles/playback/decodetest.c:
+ * tests/icles/playback/test.c:
+ * tests/icles/playback/test2.c:
+ * tests/icles/playback/test3.c:
+ * tests/icles/playback/test4.c:
+ * tests/icles/playback/test5.c:
+ * tests/icles/playback/test6.c:
+ * tests/icles/playback/test7.c:
+ tests/playback: due to popular demand mv them from examples to icles
+ The tests are toys and not reference demos.
+
+2010-08-12 10:02:56 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: send preroll buffer when delaying preroll eos
+ That is, if eos is received which will not be forwarded, and the stream
+ has not yet seen any data, then send a buffer to preroll downstream
+ (which might otherwise be accomplished by the eos event).
+
+2010-08-12 10:01:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: remove some heuristic in chain configuration code
+ .. since queues are now inserted unconditionally.
+
+2010-08-11 10:27:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ playbin2/playsink: update subtitle handling for streamsynchronizer
+ Streamsynchronizer excepts to see stream-changed msg for all streams, but to
+ arrange for this, video and subtitle streams need to be decoupled by means
+ of queues (due to pad blocks that may occur).
+ Fixes #626463.
+
+2010-08-10 13:06:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: always have a queue in chain head to aid streamsynchronizer
+ Specifically, as the latter may have one thread pushing EOS to several streams,
+ that needs to be decoupled into various thread to prevent preroll hanging
+ problems.
+
+2010-08-10 11:28:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: drop lock when pushing eos downstream
+ ... to prevent deadlock (e.g. upon seek) when downstream waits in preroll.
+
+2010-08-10 11:19:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: clear stream eos state on FLUSH and new stream
+
+2010-08-10 11:19:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: set READY sinks to NULL before freeing chain upon failure
+
+2010-08-12 10:49:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/playback/.gitignore:
+ * gst/playback/Makefile.am:
+ * gst/playback/decodetest.c:
+ * gst/playback/test.c:
+ * gst/playback/test2.c:
+ * gst/playback/test3.c:
+ * gst/playback/test4.c:
+ * gst/playback/test5.c:
+ * gst/playback/test6.c:
+ * gst/playback/test7.c:
+ * tests/examples/Makefile.am:
+ * tests/examples/playback/.gitignore:
+ * tests/examples/playback/Makefile.am:
+ * tests/examples/playback/decodetest.c:
+ * tests/examples/playback/test.c:
+ * tests/examples/playback/test2.c:
+ * tests/examples/playback/test3.c:
+ * tests/examples/playback/test4.c:
+ * tests/examples/playback/test5.c:
+ * tests/examples/playback/test6.c:
+ * tests/examples/playback/test7.c:
+ playback: move tests from plugin-dir to tests/examples/playback
+
+2010-08-11 18:08:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: Suggest caps with different width/height if bufferalloc is called with impossible width/height
+
+2010-08-11 17:16:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: Add some debug output to the videoscale negotiation test
+
+2010-08-11 17:03:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Only set the PAR if the caps already had a PAR
+ Otherwise we're producing different caps and basetransform thinks that it
+ can't passthrough buffer allocations, etc.
+ In 0.11 all video caps really should have the PAR set...
+
+2010-08-11 17:00:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: It's not a bad thing if the preferred video format needs less bytes per frame
+
+2010-08-11 08:47:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tags: exif: Fix bug in inner ifd parsing
+ Do not use the result of inner ifd's parsing to increment
+ the current tag index. The reasons are:
+ 1) The function returns a boolean.
+ 2) The inner ifd's tags are in a separate table, so they shouldn't
+ interfere with its parent ifd table parsing.
+
+2010-08-11 08:03:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Put ExifVersion in the correct IFD
+ ExifVersion is from the 'exif' ifd, not the 0th ifd.
+
+2010-08-10 19:50:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Refactor functions declaration
+ Use some macros to declare serialization/deserialization
+ functions prototypes.
+
+2010-08-10 19:30:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Add another DateTime mapping
+ datetimes can also be represented by the 0x132 tag. Map it, too.
+
+2010-08-10 11:29:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Fix bug on image-orientation parsing
+ Do not skip one extra tag when parsing image-orientation tags.
+
+2010-08-10 10:57:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From bd2054b to 3e8db1d
+
+2010-08-10 11:52:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ exiftag: Compare with G_MAXUINT16 instead of -1
+ Fixes a compiler warning on the OS X buildbot.
+
+2010-08-09 18:04:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ xmp: exif: Adds GST_TAG_APPLICATION_NAME mappings
+ adds xmp and exif helper library mappings for GST_TAG_APPLICATION_NAME
+ tag.
+
+2010-08-04 13:01:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Write ExifVersion tag
+ Write ExifVersion tag unconditionally when creating exif
+ buffers. Might help other applications parsing of this data.
+
+2010-08-04 13:02:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: tag: Test to try to serialize multiple exif tags
+ Adds a new test for exif data that tries serializing data
+ from multiple ifd tables and check if it works.
+
+2010-08-09 17:25:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tags: exif: Fix inner tags offset rewriting
+ Fixes a bug that made exif helper lib fail to rewrite inner ifd tags
+ offsets when there were more than 1 inner ifd.
+
+2010-07-22 17:29:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: configurable text color and position
+ Rather than only left, right, top, etc, allow for horizontal and vertical
+ positioning on a scale from 0 to 1.
+ Also cater for configuring rendered text color.
+ Fixes #624920.
+ API: GstTextOverlay:xpos
+ API: GstTextOverlay:ypos
+ API: GstTextOverlay:color
+
+2010-07-21 14:20:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: add solid-color pattern
+ ... which generalizes the current listing of white, black, etc.
+ In particular, also allow specifying alpha channel, and modify
+ some structures and pattern filling to cater for alpha value as well.
+ Fixes #624919.
+ API: GstVideoTestSrc:solid-color
+
+2010-08-08 17:42:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: static forward declarations are forbidden by the C standard
+ ...and actually cause compiler errors on VC++. Change it to an extern
+ forward declaration and non-static definition.
+
+2010-08-05 13:56:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 2004d03 to bd2054b
+
+2010-08-04 19:24:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * 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-08-04 15:18:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosink/baseaudiosrc: 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-08-03 15:03:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Make xmp lib aware for the different tag types
+ Makes the xmp helper lib aware that the tags can be simple,
+ sequences or bags (there is still struct and alt, but those
+ aren't handled yet). Adding this info makes serialization
+ and deserialization more consistent.
+
+2010-08-02 09:56:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmp: Add a new layer of indirection (GstXmpSchema)
+ Instead of storing all tags in a single hashtable, store them
+ grouped by schema in a GstXmpSchema, and add those to the toplevel
+ hashtable.
+
+2010-08-03 14:37:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Make bag tags deserialization work correctly
+ If we find a bag of tags of type string in the xmp packet, we
+ should concat them, this is not the ideal approach, but at
+ least works for now as we don't know what type of tag it
+ is (simple, structure, seq, alt or bag)
+
+2010-08-04 21:44:22 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/seek/seek.c:
+ examples/seek: Don't unpause on clock-lost unless playing
+ If the pipeline is paused by the user, don't pause/unpause
+ on clock-lost.
+
+2010-07-02 12:10:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: improve debugging
+
+2010-07-02 12:09:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.h:
+ ringbuffer: whitespace fixes
+
+2010-06-28 10:53:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: use more efficient way of getting caps
+ When inspecting the caps of a pad, try to get the pad _CAPS first before calling
+ the getcaps function.
+
+2010-08-02 11:06:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/pipelines/oggmux.c:
+ oggmux: Fix test build when theora and vorbis aren't available
+ Ifdef properly to avoid build failures
+
+2010-08-01 06:50:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Detect avc1 ftyp as video/quicktime
+ Detects avc1 ftyp as video/quicktime (iso variant)
+
+2010-07-27 11:25:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: removing useless locking
+ Everything in the xmp helper lib is initiallized once and on a thread
+ safe way, and after that there are only reads going on, no more
+ writing. Based on that, drop the locking.
+
+2010-06-20 23:53:38 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/seek/jsseek.c:
+ jsseek: Set joystick io encoding to 'NULL'
+ Fix problems with newer glib reporting bad encodings on the binary
+ data emerging from the joystick device fd.
+
+2010-07-26 20:25:55 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: fix printf format compiler warnings
+ Make OSX build bot happy.
+
+2010-07-26 18:23:33 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: initialize datetime variable in xmp tag parsing code
+ Fixes (correct) compiler warning on the OSX build bot.
+
+2010-07-26 17:48:14 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: require core from git
+ For GstDateTime stuff used in libgsttag.
+
+2010-07-26 17:04:02 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ * configure.ac:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/gstpluginsbaseversion.c:
+ * gst-libs/gst/pbutils/gstpluginsbaseversion.h.in:
+ * gst-libs/gst/pbutils/pbutils.h:
+ * tests/check/libs/pbutils.c:
+ * win32/common/libgstpbutils.def:
+ pbutils: add compile time and runtime version checks for gst-plugins-base
+ So people can check what version of the gst-plugins-base libs they're
+ building against or linked against.
+ API: GST_PLUGINS_BASE_VERSION_MAJOR
+ API: GST_PLUGINS_BASE_VERSION_MINOR
+ API: GST_PLUGINS_BASE_VERSION_MICRO
+ API: GST_PLUGINS_BASE_VERSION_NANO
+ API: GST_CHECK_PLUGINS_BASE_VERSION
+ API: gst_plugins_base_version()
+ API: gst_plugins_base_version_string()
+
+2010-06-30 16:36:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Map GST_TAG_DATE_TIME
+ Adds mapping to the exif helper library for GST_TAG_DATE_TIME.
+ Tests included.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594504
+
+2010-06-23 12:02:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Maps GST_TAG_DATE_TIME
+ Adds mapping for GST_TAG_DATE_TIME.
+ Tests included.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594504
+
+2010-07-26 16:05:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Fixate the pixel-aspect-ratio if necessary
+
+2010-07-24 18:17:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: Delay EOS events until all streams are EOS
+ This fixes a race condition in playbin2's gapless mode, where the
+ EOS of other streams might arrive in the sinks before the last stream
+ ends and the switch to the new track happens. The EOS sinks won't
+ accept any new data then and playback stops.
+ To prevent this, delay all EOS events until all streams are EOS
+ and advance the sinks of the EOS streams by filler newsegment
+ events if necessary.
+ Fixes bug #625118.
+
+2010-06-01 23:43:45 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: export 3gp profile in caps
+ This reads the 3gp profile from the major/compatible brands and puts
+ this as a 'profile' field in caps. This can be used by demuxers to
+ decide whether they can handle this stream or not. Also needed for
+ DLNA.
+ https://bugzilla.gnome.org/show_bug.cgi?id=620291
+
+2010-07-24 11:48:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/test-colorkey.c:
+ * tests/icles/test-xoverlay.c:
+ examples: Use cairo instead of to-be-deprecated GDK API
+ Fixes bug #625001.
+
+2010-07-24 09:22:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * configure.ac:
+ configure: set release date/time
+ Use the new AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO macro.
+
+2010-07-20 12:08:52 +0530 Parthasarathi Susarla <partha.susarla@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: detect enhanced AC-3
+ https://bugzilla.gnome.org/show_bug.cgi?id=623846
+
+2010-07-22 09:13:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gststreamsynchronizer.h:
+ streamsynchronizer: Fix another deadlock when going PAUSED->READY while streams are waiting for the GCond
+
+2010-07-20 21:05:45 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ playsink: Switch to faster pad linking methods
+ Logic for choice of GST_PAD_LINK_CHECK_* is as follows:
+ * Where return of pad_link wasn't checked before : NOTHING
+ * Where linking is between known compatible elements : NOTHING
+ * All other cases : TEMPLATE_CAPS
+ Slashes down playsink reconfigure by up to 50% cpu time.
+
+2010-07-19 15:58:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstscreenshot.c:
+ playsink: Set add-borders=true on the videoscale instances
+ This makes sure that we always keep the display aspect ratio and
+ add black borders if necessary, which is usually something you want
+ for viewing a video.
+
+2010-07-19 15:44:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Rename borders property to add-borders
+
+2010-07-19 09:39:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ videoscale: update disted orc files for latest changes
+
+2010-07-17 20:24:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videoscale/vs_fill_borders.c:
+ * gst/videoscale/vs_fill_borders.h:
+ * gst/videoscale/vs_image.h:
+ videoscale: Add support for adding black borders to keep the DAR if necessary
+ Fixes bug #617506.
+
+2010-07-18 15:08:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Fix linear scaling of UYVY scanlines
+ Fixes bug #624656.
+
+2010-07-17 19:57:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Fix caps fixating if the height is fixed but the width isn't
+
+2010-07-16 20:41:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ videoscale: Remove interlaced scaling again
+ This behaviour was not preferred and caused visible image quality
+ degradations. The real solution would be, to apply a real
+ deinterlacing filter before scaling the frames.
+ Fixes bug #615471.
+
+2010-07-16 19:06:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Add helper method for filling the VSImage struct
+
+2010-07-18 11:43:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/files/Makefile.am:
+ tests: don't forget to dist test file for typefinding unit test
+
+2010-07-18 11:38:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/typefindfunctions.c:
+ * tests/files/623663.mts:
+ tests: add unit test for mpeg-ts typefinding bug
+ See #623663.
+
+2010-07-18 11:24:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: make mpeg-ts typefinder scan more data
+ We only look for packets with payload, but it appears there may be packets without,
+ which makes it harder to find the N packets with payload in a row that we need in
+ order to typefind this successfully, so scan some more data than necessary in the
+ optimistic scenario. Alternatively we could change IS_MPEGTS_HEADER().
+ Fixes #623663.
+
+2010-07-16 18:51:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gststreamsynchronizer.c:
+ playsink/streamsynchronizer: Remove and deactivate pads after calling the change_state function of the parent class
+ Fixes some deadlocks.
+
+2010-07-16 18:25:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gststreamsynchronizer.c:
+ streamsynchronizer: Drop DISCONT flag on first buffer for new streams
+ Also reset stream state when going back to READY and on flush-stop.
+
+2010-07-11 14:44:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gststreamsynchronizer.c:
+ * gst/playback/gststreamsynchronizer.h:
+ * gst/playback/test7.c:
+ playsink: Fix gapless playback in many non-simple scenarios
+ Before gapless playback failed when switching between audio-only,
+ video-only and audio-video files, when choosing different clocks
+ and when the different streams had different durations.
+ This is now handled by a helper element, which keeps track of the
+ running times of all streams and synchronizes them.
+ Fixes bug #602437.
+
+2010-07-11 14:43:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Remove QOS event adjustments for gapless playback mode
+
+2010-07-09 17:15:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: Post clock-provide and clock-lost messages when going from/to PLAYING
+
+2010-07-09 17:15:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: Post clock-provide and clock-lost messages when going from/to PLAYING
+
+2010-07-08 16:11:12 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: only associate .webm with WebM
+ .weba (audio) and .webv (video) were speculation on my part before
+ the public launch. As of yet no decision has been made on the
+ file extension for audio-only WebM, and I'm pretty sure there will
+ never be one for video-only.
+ Fixes bug #623837.
+
+2010-07-08 09:54:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: Use new gst_audio_clock_new_full()
+
+2010-07-08 09:54:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: Use new gst_audio_clock_new_full()
+
+2010-07-08 08:32:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * win32/common/libgstaudio.def:
+ audioclock: API: Add gst_audio_clock_new_full() with a GDestroyNotify for the user_data
+ Elements usually use their own instance as instance data but the
+ clock can have a longer lifetime than their elements and the clock
+ doesn't own a reference of the element.
+ Fixes bug #623807.
+
+2010-07-04 20:29:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/Makefile.am:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraenc.h:
+ theoraenc: Implement two pass encoding
+ Fixes bug #621349.
+
+2010-07-04 20:14:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * ext/theora/gsttheoraenc.c:
+ configure: Require libtheora >= 1.1
+ It's more than a year old at the time of the next -base release,
+ has many encoder and decoder improvements and gets us rid of a lot
+ of #ifdefs
+
+2010-07-04 20:08:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ theora: Use PROP_ instead of ARG_ for property enum values
+
+2010-05-04 12:09:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: use proper error message code for failing state change
+
+2010-07-16 11:24:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development
+
+=== release 0.10.30 ===
+
+2010-07-15 01:20:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.30
+
+2010-07-15 00:32:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/cs.po:
+ * po/lv.po:
+ po: update translations
+
+2010-07-14 12:59:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Disconnect and destroy uridecodebins when going from READY to NULL
+ Fixes spurious errors that happen after an error and playing a working
+ stream afterwards or signals that are emitted for non-active groups.
+ Fixes bug #624266.
+
+2010-07-08 14:51:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ docs: dist more of the gst-plugin-base design docs
+
+2010-07-07 00:35:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.29.4 pre-release
+
+2010-07-07 00:24:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/LINGUAS:
+ * po/es.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nl.po:
+ * po/pt_BR.po:
+ * po/sl.po:
+ * po/sv.po:
+ po: update translations
+
+2010-07-06 09:47:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ Revert "playbin2: Don't put "raw" subtitle types in the raw caps for decodebin2"
+ This reverts commit 9d7538247ff1bf9841b53eeb71ddc47f2c662415.
+ If the DVD subpicture caps are not part of the raw caps, uridecodebin
+ doesn't qualify resindvdbin as raw source and plugs decodebins, which
+ causes broken DVD playback because of bugs elsewhere.
+ This change was originally added to only expose supported, raw subtitles,
+ e.g. if the subtitle sink did not support DVD subpictures but a converter
+ to some supported format exists. It's not very important right now because
+ we have nothing (that is autoplugged) to convert from plaintext/pango-markup
+ or DVD subpictures to something else.
+ Fixes bug #623583.
+
+2010-07-04 17:27:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Use correct Y offset for YVYU -> RGB conversions
+ Fixes bug #623530.
+
+2010-07-04 17:26:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Use correct Y offset for the YUY2 -> RGB conversions
+ Fixes bug #623530.
+
+2010-07-04 14:55:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/inspect/plugin-ogg.xml:
+ docs: update ogg introspection info after riff fourcc addition
+
+2010-07-02 20:09:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix conversion of packed 4:2:2 YUV to 8 bit grayscale
+ The last pixel wasn't written before for odd widths.
+ Fixes bug #623418.
+
+2010-07-02 14:56:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Fix conversion of packed 4:2:2 YUV to RGB
+ The last pixel wasn't written before.
+ Fixes bug #623384.
+
+2010-07-02 13:59:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix invalid memory accesses with odd widths/heights during subsampling
+ Fixes bug #623375.
+
+2010-07-01 21:21:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If setup of the source element fails in READY->PAUSED deactive the current group
+ Otherwise the uridecodebin will be still a child of playbin2 and
+ its signals will still be connected. In future state changes this
+ will then emit unrelated signals that will confuse playbin2 or,
+ even worse, cause crashes and assertions.
+ Fixes bug #623318.
+
+2010-06-30 21:20:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add FLV4 fourcc and map it to video/x-vp6-flash
+ Fixes #623176.
+
+2010-06-30 15:13:10 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ netbuffer: declare with G_DEFINE_TYPE for type safety
+ Fixes #623233.
+
+2010-06-24 16:55:57 +0200 Fredrik Söderquist <fs@opera.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Handle errors from _get_next_page in _do_seek.
+ If the source element failed here, oggdemux would crash.
+ Fixes #623218.
+
+2010-06-30 11:00:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: keep things sorted alphabetically
+ On special request. Because it's important, apparently.
+
+2010-06-29 18:48:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.29.3 pre-release
+
+2010-06-29 18:46:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: fix --disable-external
+
+2010-06-28 15:43:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ * configure.ac:
+ Bump automake requirement to 1.10
+ For maintainability reasons and $(builddir).
+ Fixes #622944.
+
+2010-06-27 10:43:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ * tests/examples/seek/seek.c:
+ examples: Remove some #if GTK_CHECK_VERSION(2,12,0)
+ We depend on GTK+ >= 2.14 already.
+
+2010-06-26 21:28:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/Makefile.am:
+ videotestsrc: Explicitely link with $(LIBM)
+
+2010-06-26 21:27:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/Makefile.am:
+ videoscale: Explicitely link with $(LIBM)
+
+2010-06-26 18:19:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/video-enumtypes.c:
+ 0.10.29.2 pre-release
+
+2010-06-26 18:19:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/adder/gstadderorc-dist.c:
+ * gst/adder/gstadderorc-dist.h:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.h:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ gst: update orc files
+
+2010-06-26 18:19:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translations
+
+2010-06-26 17:55:12 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Properly clean DecodeChain after errors.
+ If an error happens, the PAUSED state will never be reached. If an
+ application re-uses decodebin2 (like totem) where one would normally
+ set to READY between each file, the cleanup that normally happens in
+ the PAUSED=>READY codepath will never be called, resulting in the
+ following file to re-use the previous demuxer/decoder/...
+ https://bugzilla.gnome.org/show_bug.cgi?id=622807
+
+2010-06-26 12:39:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/design-orc-integration.txt:
+ docs: fix a few typos
+
+2010-06-26 12:03:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ checks: simplify GstBus usage in videoscale unit test
+ There's no need to run a main loop, add a bus watch and deal with
+ helper structs here just to wait for an EOS message.
+
+2010-06-26 11:38:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ checks: speed up videoscale unit test a little
+ Use new gst_element_link_pads_full() function to link elements,
+ and disable all checks when linking (don't try this at home).
+ Down to 18s from 3m20s. Scary.
+
+2010-06-25 17:18:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: check for ringbuffer state first
+ Check for the state of the ringbuffer before doing the checks of the other
+ buffer properties, when we're not started, we don't care about those values.
+
+2010-06-24 13:30:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Use a more concise pad template
+ Speeds up caps nego 2 fold
+ https://bugzilla.gnome.org/show_bug.cgi?id=622696
+
+2010-06-24 15:31:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/audio-trickplay.c:
+ tests: make audio-trickplay test compile when the gst debugging system is disabled
+ Fixes unused variable warning in that case.
+
+2010-06-24 15:13:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/typefindfunctions.c:
+ tests: add test that runs all typefinders over random data
+
+2010-06-06 12:31:35 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: Mark ISO 14496-14 files as video/quicktime
+ These are currently being marked as audio/x-m4a which is incorrect.
+ https://bugzilla.gnome.org/show_bug.cgi?id=620720
+
+2010-06-24 13:42:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ .gitignore: add temporary orc test directory
+
+2010-06-24 13:30:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: add plugin loading whitelist to test environment
+ Only want to load core/-base plugins here.
+
+2010-06-24 15:09:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 73ff93a to a519571
+
+2010-06-24 08:41:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ tag: Fix printf format string
+ Use %s for strings, not %d.
+
+2010-06-24 12:06:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Fix resampling of ARGB scanlines
+ Previously we would read behind the end of the source lines.
+
+2010-06-16 14:08:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds GST_TAG_IMAGE_ORIENTATION mapping
+ Adds GST_TAG_IMAGE_ORIENTATION mapping to xmp helper lib.
+ Tests included.
+
+2010-06-16 11:19:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/gsttageditingprivate.c:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * tests/check/libs/tag.c:
+ * win32/common/libgsttag.def:
+ tag: exif: Adds mapping for GST_TAG_IMAGE_ORIENTATION
+ Adds GST_TAG_IMAGE_ORIENTATION to the exif helper lib mapped tags.
+ Tests included.
+
+2010-06-23 12:10:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: clear ts-offset pointer
+ We need to clear the pointer to our ts-offset element when we destroy the video
+ chain elements to make sure nobody derefs it to invalid memory afterwards.
+
+2010-06-23 10:16:07 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Reset ts_offset field when freeing chain
+ Otherwise we would end up with a bogus ->audiochain->ts_offset field
+ which would cause segfaults/assertions when trying to modify the
+ 'ts-offset' property in update_av_offset().
+ Was easy to trigger when using a list of audio+video files mixed with
+ video-only files in totem.
+
+2010-06-18 16:37:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/adder.c:
+ * tests/check/elements/appsink.c:
+ * tests/check/elements/audiotestsrc.c:
+ * tests/check/elements/gdpdepay.c:
+ * tests/check/elements/gdppay.c:
+ * tests/check/elements/multifdsink.c:
+ * tests/check/elements/videotestsrc.c:
+ * tests/check/elements/vorbisdec.c:
+ tests: use our own macros for the tests main function
+
+2010-06-18 14:17:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ tag: Use gst_tag_list_peek_string_index in vorbistag
+ Use _peek_string_index instead of _get_string_index to avoid
+ a string copy
+
+2010-06-14 12:27:02 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ ximagesink: Ask pad peer to accept new caps once only
+ In buffer_alloc, if the buffer caps are new, call
+ gst_pad_peer_accept_caps once only, it's useless to call it in the
+ cases where we know it will always fail.
+ Fixes bug #621190
+
+2010-06-17 17:07:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add YUY2/YVYU to all RGB formats conversions
+
+2010-06-17 16:57:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix Y42B to YUY2/YVYU/UYVY conversion for odd widths
+
+2010-06-17 16:54:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix YUY2/YVYU/UYVY to Y42B conversion for odd widths
+
+2010-06-17 16:06:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.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. Update other gtk-doc files
+ for API additions and object hierarchy changes.
+
+2010-06-16 19:15:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: improve autoplugging
+ Use the pad caps when they are available to continue the autoplugging. If the
+ pad caps are set, they are fixed and then we can directly continue autoplugging.
+
+2010-06-15 16:49:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 9339ccc to 35617c2
+
+2010-06-15 16:53:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 5adb1ca to 9339ccc
+
+2010-06-15 16:34:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 57c89b7 to 5adb1ca
+
+2010-06-15 15:32:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From c804988 to 57c89b7
+
+2010-06-15 13:09:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/audioresample.c:
+ Revert "audioresample: set pads as negotiable"
+ This reverts commit 5f74f3a82eb54f9a9517f99dffbe45ce4d474870.
+
+2010-06-15 13:09:29 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/audioconvert.c:
+ Revert "audioconvert: set pads negotiable"
+ This reverts commit bbd7dee8f604bd0373a82e6e5cc3eec8313806ac.
+
+2010-06-14 15:19:32 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Fix black horizontal line in image
+
+2010-06-14 15:05:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Init char variable for gps coordinates
+ Initialize char variable for gps coordinates deserialization to 0
+ to identify when it couldn't be parsed/found and error out.
+ Fixes #621509
+
+2010-06-14 18:10:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/audioconvert.c:
+ audioconvert: set pads negotiable
+
+2010-06-14 17:48:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/audioresample.c:
+ audioresample: set pads as negotiable
+
+2010-06-14 16:25:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Revert accidental downgrade of common revision.
+
+2010-06-14 16:07:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: And only expect a single buffer in the unit test
+
+2010-06-14 16:02:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: Only convert one buffer instead of five
+ Should make the unit test a lot faster.
+
+2010-06-14 14:13:32 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Fix unitialized variables
+ yay macosx compilers :(
+
+2010-06-14 14:13:16 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix unitialized variable.
+ yay macosx compilers :(
+
+2010-06-14 13:27:01 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Use Quarks for structure name/field checking
+
+2010-06-14 13:26:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Speed up _remove_format_info
+ Instead of copying full caps, use the fact that the provided caps only have
+ one structure and only copy around structures.
+
+2010-06-14 13:24:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Transfer structures instead of copying them
+ Avoids many expensive structure copies
+
+2010-06-14 13:20:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Use GLIB_EXTRA_CFLAGS
+
+2010-06-14 13:02:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 7a0fdf5 to c804988
+
+2010-06-14 11:31:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 6da3bab to 7a0fdf5
+
+2010-06-14 11:20:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ jsseek: Don't use deprecated GLib API
+ Fixes once again bug #605100.
+
+2010-06-14 11:16:45 +0200 Prahal <prahal at yahoo.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: use accumulator for autoplug-sort
+ Use an accumulator for the autoplug-sort signal so that we can stop the emission
+ when a signal handler produced a valid result. This avoids the object handler
+ to overwrite the results from user signals.
+ Fixes #621161
+
+2010-06-14 11:11:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: activate_chain must not be called with a NULL chain
+ It will crash later and shouldn't really happen anyway unless
+ something is really wrong.
+
+2010-06-14 11:08:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ gnomevfssrc: Fix possible NULL pointer dereference
+ It's always an error if gst_buffer_try_new_and_alloc() returns NULL
+
+2010-06-14 11:03:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Return FALSE from the seek handler if no seek callback was set
+
+2010-06-14 09:53:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiostreamsrc.c:
+ giostreamsrc: Fix copy&paste error in the docs
+
+2010-06-14 00:33:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: fix debug message printf format some more
+ Just cast the pointer diff, so it works everywhere without
+ warnings. Can't use %tu, because that modifier is C99. Warning
+ was: "format '%li' expects type 'long int', but argument 8 has
+ type 'int'".
+
+2010-06-13 22:17:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: Add ffmpegcolorspace after videotestsrc for the unit test
+
+2010-06-13 20:57:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: ...and add Y16 case for the linear scaling
+
+2010-06-13 20:38:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Add Y16 case for 4-tap scaling
+
+2010-06-13 18:27:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: Fix linking of the tags test
+
+2010-06-13 08:20:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: Re-add (but deprecated) GST_VIDEO_{RED,GREEN,BLUE}_MASK_1[56]
+
+2010-06-12 21:04:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Use correct variables for debug output
+
+2010-06-12 16:51:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix Y16 from/to GRAY8 conversion
+
+2010-06-12 16:31:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Don't crash when doing gray YUV to GRAY conversion
+
+2010-06-12 16:23:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ videoscale: Update disted orc files
+
+2010-06-12 16:16:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Allow video/webm for progressive downloading
+
+2010-06-12 13:59:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Add support for more gray formats
+
+2010-06-01 16:45:34 +0000 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video.{c,h}: Fix an endianness bug fix.
+ This commit makes sure the endianness is ok for RGB/BGR 15/16 formats.
+
+2010-06-01 14:42:54 +0000 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video.{c,h}: Add support for RGB and BGR with 15 and 16 bits.
+
+2010-06-12 13:35:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ videoscale: Use libgstvideo for caps parsing, etc
+
+2010-06-12 13:04:43 +0200 Philippe Normand <phil@base-art.net>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Fix format string compiler warning on OS X
+
+2010-06-12 13:00:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Use GST_VIDEO_CAPS_GRAY{8,16}
+
+2010-06-12 12:57:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Implement linear merging of Y16 scanlines with orc
+
+2010-06-12 08:26:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 733fca9 to 6da3bab
+
+2010-06-11 22:16:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * ext/cdparanoia/Makefile.am:
+ cdparanoia: check for cdparanoia with pkg-config first
+ cdparanoia now has a .pc file in post-0.10.2 SVN, so use
+ that to check for cdparanoia before we try all the other
+ checks. Besides being generally nicer, this may help with
+ correctly detecting cdparanoia on OSX some day (see #609918).
+
+2010-06-11 12:34:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: look for dts frames at non-zero offsets too
+ Scan a bit into the data when checking for dts frames instead
+ of expecting the frame sync to be right at the start of the
+ data. This is needed for some dts-disguised-as-pcm-in-wav files.
+ See #413942.
+
+2010-06-10 18:12:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add typefinder for dts audio
+
+2010-06-11 15:23:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ gstexiftag: Fix unitialized variables
+ I hate thee macosx
+
+2010-06-11 08:47:27 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ gstexiftag: Fix debug statements
+
+2010-06-11 08:47:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ exiftag: Fix unitialized variable
+
+2010-06-10 20:45:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * win32/common/libgsttag.def:
+ win32: update def file
+
+2010-06-10 20:36:32 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/tag.h:
+ docs: fix gtk-doc warnings
+ Variable names in function prototypes in the headers should match the doc-
+ comment.
+
+2010-06-10 08:47:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If the text-sink claims to support ANY caps assume it only support raw plaintext subtitles
+ Fixes bug #621071.
+
+2010-06-10 08:46:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/icles/playbin-text.c:
+ icles: Only accept plain subtitles in the playbin-text icles test
+
+2010-06-09 22:34:24 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add support for VP6F (On2 VP6 Flash variant)
+
+2010-06-09 12:35:40 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ Use the Orc m4 macro
+
+2010-06-09 12:40:00 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From fad145b to 733fca9
+
+2010-06-09 12:33:51 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 47683c1 to fad145b
+
+2010-06-09 15:58:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ tag: exif: Refactor byte-order handling
+ Only check for valid byte-order values when creating the
+ exif readers and writers
+
+2010-05-10 14:01:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstexiftag.c:
+ * tests/check/libs/tag.c:
+ tag: exif: Adds new geo-location tag mappings
+ Adds mappings for:
+ GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION
+ GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION
+ GST_TAG_GEO_LOCATION_MOVEMENT_SPEED
+ GST_TAG_GEO_LOCATION_ELEVATION
+ Does some refactoring in the code to reduce number of parameters
+ passed to functions
+ Tests included.
+
+2010-04-04 22:25:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: tag: Adds unit tests for exif helper lib
+ Adds some simple unit tests for exif helper lib functions
+ Fixes #614872
+
+2010-04-03 23:02:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gstexiftag.c:
+ * gst-libs/gst/tag/tag.h:
+ * win32/common/libgsttag.def:
+ tag: Adds basic exif tags support
+ Adds exif helper lib functions to parse exif buffers from/to
+ taglists. Exif is tipically used in jpeg images, but it can
+ also be embedded into TIFF, AVI and WAV formats.
+ Adds a couple function to handle exif in tiff header structures, that is how
+ exif is embedded in jpeg and (obviously) in tiff.
+ API: gst_tag_list_to_exif_buffer
+ API: gst_tag_list_to_exif_buffer_with_tiff_header
+ API: gst_tag_list_from_exif_buffer
+ API: gst_tag_list_from_exif_buffer_with_tiff_header
+ Fixes #614872
+
+2010-06-09 17:02:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Handle SEEKING query in push mode too
+
+2010-06-09 16:38:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Update the total time from the Skeleton 4 indexes
+ Fixes bug #620939, see bug #607945.
+
+2010-06-09 16:33:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: Implement latest version of the Skeleton 4.0 spec
+ Fixes bug #620939.
+
+2010-06-09 16:59:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/volume/gstvolume.c:
+ volume: make the orc codes available for testing.
+ Add a USE_ORC define for now and switch 'this' to 'self'. Having orc enabled
+ passes the test suite and various manual gst-launch pipelines.
+
+2010-06-08 13:34:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ .gitignore: add orc-related temp files
+
+2010-06-08 13:26:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/gstaudioresample.c:
+ Fix build if orc is not installed
+ Orc is not a hard requirement. Things should still compile and
+ work without orc, but slow fallback code may be used in this
+ case. Fix up configure to not error out if orc is not installed
+ and wrap use of orc profiling in audioresample in #ifdefs.
+ Fixes #620136 some more.
+
+2010-06-08 13:11:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Implement correct parsing of Skeleton 4.0 index packets
+
+2010-06-08 12:01:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: Add parsing of Skeleton 4.0 indexes
+
+2010-06-08 11:40:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Parse segment length and content offset from fishead
+ And print them for debugging purposes. Not sure if we can do anything useful
+ with this information.
+
+2010-06-08 11:31:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: Parse Skeleton stream major/minor version
+
+2010-06-08 11:26:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Use binary search for searching in the index
+
+2010-06-08 11:02:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/video.c:
+ video: Fix unit test, the Y800 checks were not used before and were not working
+
+2010-06-08 11:01:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Return TRUE in gst_video_format_is_gray() for Y800 and Y16
+
+2010-06-08 00:33:31 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ audioconvert, videotestsrc: Update generated Orc code
+ Fixes compile errors with initialization of unions.
+
+2010-06-08 00:32:36 -0700 David Schleef <ds@schleef.org>
+
+ * REQUIREMENTS:
+ requirements: change liboil to Orc
+
+2010-06-06 23:50:05 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: convert from liboil to orc
+
+2010-06-06 23:48:35 -0700 David Schleef <ds@schleef.org>
+
+ * tests/check/Makefile.am:
+ tests: Add orc tests
+
+2010-06-06 23:48:15 -0700 David Schleef <ds@schleef.org>
+
+ * gst/volume/Makefile.am:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolumeorc-dist.c:
+ * gst/volume/gstvolumeorc-dist.h:
+ * gst/volume/gstvolumeorc.orc:
+ volume: convert from liboil to orc
+
+2010-06-06 23:47:53 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/Makefile.am:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.c:
+ * gst/videotestsrc/gstvideotestsrcorc-dist.h:
+ * gst/videotestsrc/gstvideotestsrcorc.orc:
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: convert from liboil to orc
+
+2010-06-06 23:47:16 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscaleorc-dist.c:
+ * gst/videoscale/gstvideoscaleorc-dist.h:
+ * gst/videoscale/gstvideoscaleorc.orc:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_scanline.c:
+ * gst/videoscale/vs_scanline.h:
+ videoscale: convert from liboil to orc
+
+2010-06-06 23:46:41 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioconvert/Makefile.am:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.c:
+ * gst/audioconvert/gstaudioconvertorc-dist.h:
+ * gst/audioconvert/gstaudioconvertorc.orc:
+ audioconvert: convert from liboil to orc
+
+2010-06-06 23:45:58 -0700 David Schleef <ds@schleef.org>
+
+ * gst/adder/Makefile.am:
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ * gst/adder/gstadderorc-dist.c:
+ * gst/adder/gstadderorc-dist.h:
+ * gst/adder/gstadderorc.orc:
+ adder: convert from liboil to orc
+
+2010-06-06 23:45:10 -0700 David Schleef <ds@schleef.org>
+
+ * docs/design/Makefile.am:
+ * docs/design/design-orc-integration.txt:
+ docs: Add notes about Orc integration
+
+2010-06-06 23:34:39 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ configure: convert liboil check to orc
+
+2010-06-08 07:34:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Start a new page for every CMML buffer
+
+2010-06-07 14:38:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: add av-offset property
+ Add av-offset property to control the audio and video sync offset. This can be
+ used to to manually correct badly synced streams.
+ See #620529
+
+2010-06-07 08:31:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ ffmpegcolorspace: Map "Y8 " and "GREY" to "Y800" and add it to the template caps
+
+2010-06-07 08:17:13 +0200 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add support for Y800 and Y16
+ Fixes bug #620441.
+
+2010-06-07 08:16:01 +0200 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add support for Y800 and Y16
+ Fixes bug #620441.
+
+2010-06-06 16:46:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: fix log function printf format issue
+
+2010-06-05 18:14:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: stop jpeg typefinding once we found a SOF marker
+
+2010-06-05 18:05:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/typefindfunctions.c:
+ tests: fix memory leak in unit test
+
+2010-05-19 15:40:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: improve jpeg typefinder
+ Make jpeg typefinder check more than just the first two bytes
+ plus Exif or JFIF marker. This allows us to report MAXIMUM
+ probability in cases where there's no Exif or JFIF marker,
+ making typefinding stop early. Also extract width and height,
+ because we can.
+
+2010-06-05 17:22:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/Makefile.am:
+ * tests/check/Makefile.am:
+ * tests/check/gst/typefindfunctions.c:
+ * tests/files/Makefile.am:
+ * tests/files/partialframe.mjpeg:
+ tests: add small unit test for AC3 vs. JPEG typefinding issue
+
+2010-06-05 16:58:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: fix AC-3 typefinding so that it actually checks for a second frame
+ Fix typo that made the AC-3 typefinder not actually check for a
+ second frame, but rather compare the sync point found to itself,
+ which resulted in the AC-3 typefinder reporting an overly optimistic
+ MAXIMUM or VERY_LIKELY probability when it found a possible frame
+ sync.
+
+2010-06-05 12:27:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstscreenshot.c:
+ playbin2: improve screenshot code
+ Use appsrc and appsink in the screenshot code to make things nicer.
+
+2010-06-05 11:28:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: fix documentation string
+
+2010-06-05 11:05:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: add convert-frame action signal
+ Add a convert-frame action signal.
+ Fixes #620279
+
+2010-06-05 11:02:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstscreenshot.c:
+ * gst/playback/gstscreenshot.h:
+ playbin2: move marshaller to screenshot
+ Move the marshaller for the convert_frame signal to the screenshot file in
+ preparation for moving it to playsink.
+ See #620279
+
+2010-06-05 10:42:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: move convert_frame to playsink
+ Move the convert_frame function to playsink and make it part of the API. This is
+ in preparation to add the convert_frame signal to playsink.
+ See #620279
+
+2010-06-05 10:31:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: add property to get the last frame
+ Add a property to get the last video frame.
+ See #620279
+
+2010-06-04 19:30:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Handle raw streams we don't want.
+ If a file contains raw streams (not requiring a decoder) that we do
+ not want (expose-all-streams == FALSE), we would previously consider
+ those of unknown-type (missing a decoder) ... whereas in fact it was just
+ because they don't need decoders.
+ This only applies if expose-all-streams is FALSE.
+
+2010-06-03 13:44:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ Revert "baseaudiosink: Allocate and free the clock in NULL->READY and reverse"
+ This reverts commit cea2644ed86097aadedc9e8731e78a22ffc6246b.
+ Many audio sink assume that they can create a clock in
+ the instance init function and it will be there forever
+ and not be cleared by the state change functions.
+
+2010-06-02 12:19:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: Allocate and free the clock in NULL->READY and reverse
+
+2010-06-01 23:49:07 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 17f89e5 to 47683c1
+
+2010-06-01 22:54:33 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From fd7ca04 to 17f89e5
+
+2010-06-01 13:00:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/overlay/Makefile.am:
+ examples: get the right Qt moc binary to use via pkg-config
+ Should make us do the right thing in cases where both Qt3 and Qt4
+ are installed.
+ Fixes #620211.
+
+2010-05-31 19:28:45 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * ext/gio/gstgiobasesink.c:
+ gio: map GIO NO_SPACE error to NO_SPACE_LEFT
+ Fixes bug #620140.
+
+2010-05-28 08:27:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/interfaces/streamvolume.c:
+ configure: Remove (now) useless check for cbrt
+
+2009-12-02 22:16:22 -0800 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/interfaces/streamvolume.c:
+ interfaces: Use pow() instead of cbrt() for MSVC
+
+2010-05-26 11:54:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 357b0db to fd7ca04
+
+2010-05-26 08:51:09 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: Fix buffer offset_end when within tolerance.
+ This fixes issues if we then have downstream elements that operate
+ on offset/offset_end.
+ And add the expected timestamp in the debug logs
+
+2010-05-24 11:27:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/fft/kiss_fft_f32.c:
+ * gst-libs/gst/fft/kiss_fft_f32.h:
+ * gst-libs/gst/fft/kiss_fft_f64.c:
+ * gst-libs/gst/fft/kiss_fft_f64.h:
+ * gst-libs/gst/fft/kiss_fft_s16.c:
+ * gst-libs/gst/fft/kiss_fft_s16.h:
+ * gst-libs/gst/fft/kiss_fft_s32.c:
+ * gst-libs/gst/fft/kiss_fft_s32.h:
+ * gst-libs/gst/fft/kiss_fftr_f32.c:
+ * gst-libs/gst/fft/kiss_fftr_f64.c:
+ * gst-libs/gst/fft/kiss_fftr_s16.c:
+ * gst-libs/gst/fft/kiss_fftr_s32.c:
+ fft: Merge kissfft 1.2.8
+ This reduces memory footprint for the FFT and adds
+ OpenMP support (but we don't use it).
+
+2010-05-22 10:05:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: Fixate interlaced, chroma-site and color-matrix fields if necessary
+
+2010-05-22 10:02:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/videorate/gstvideorate.c:
+ videorate: Use new string fixation function from core
+
+2010-05-22 09:48:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Fixate color-matrix and chroma-site fields if necessary
+
+2010-05-22 09:39:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Fixate the interlaced field if necessary
+ Fixes bug #619310.
+
+2010-05-22 08:55:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add IVF typefinder
+
+2010-05-21 18:16:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: pass object to logging functions, use GST_DEBUG_FUNCPTR
+
+2010-05-20 15:14:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add basic descriptions for new WebM and VP8 types
+
+2010-05-20 14:21:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Fix sizes again, this time for real
+
+2010-05-20 13:58:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Fix size checks
+
+2010-05-20 10:19:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Drop all other Ogg VP8 header packets and make VP8 mapping check a bit more strict
+
+2010-05-20 08:52:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: Some more minor adjustments for the VP8 Ogg mapping
+
+2010-05-19 21:35:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: Update to the latest VP8 mapping
+
+2010-05-10 05:53:22 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Detect WebM as video/webm
+ Refactor matroska_type_find into ebml_check_header and a new
+ matroska_type_find and webm_type_find.
+
+2010-05-14 13:31:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Fix granulepos->key granule calculation for Dirac
+
+2010-05-14 11:02:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Add support for mapping specific granulepos to key granule mapping
+
+2010-05-05 13:59:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ ogg: Implement Ogg VP8 mapping
+
+2010-04-27 15:24:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add support for On2 VP8
+
+2010-05-19 16:17:19 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: fix a typo introduced by 9d753824.
+ video/x-raw-float => audio/x-raw-float. Fixes #619090.
+
+2010-05-18 08:45:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't put "raw" subtitle types in the raw caps for decodebin2
+ We handle them from the autoplug-continue signal, where the caps supported
+ by the subtitle sink or overlay are known already.
+
+2010-05-15 21:15:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Use = instead of == in shell scripts for equality checks
+
+2010-05-14 18:23:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 4d67bd6 to 357b0db
+
+2010-05-14 17:24:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Always take the object lock when accessing the caps
+ Fixes bug #618625.
+
+2010-05-14 17:17:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Don't fail if subtitles are used but only audio is available and no visualizations
+ Instead simply disable displaying of the subtitles for now, as was
+ intended by that part of code...
+ Fixes bug #610866.
+
+2010-05-14 17:13:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Fix deadlock caused from an additional lock instead of unlock
+ Also improve debug output for the playsink lock.
+
+2010-05-13 12:16:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Use passthrough mode if width and height are not changed
+ It doesn't matter if the PAR changes or not, processing of every pixel
+ is only necessary when the width or height changes.
+
+2010-05-13 12:03:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: relax width and height constraints
+ Increase the acceptable video sizes from [16,4096] to [1, MAX].
+ See #618392
+
+2010-05-13 08:05:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Use simple fraction multiplication functions instead of going through GValues
+
+2010-05-10 17:09:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: Add a unit test for checking if the negotiation works as expected
+
+2010-05-10 17:09:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Try harder to keep the DAR if possible
+ Fixes bug #371108.
+
+2010-05-10 15:13:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Log PAR and DAR of input and output caps when setting caps
+
+2010-05-10 14:52:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Set input width/height if the output caps don't have any width or height
+
+2010-05-10 13:01:44 +0200 Andoni Morales <ylatuya@gmail.com>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Try to keep DAR when scaling
+ Fixes bug #371108.
+
+2010-05-10 19:09:28 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ basertpaudiopayload: Add extra frame for non-complete frame lengths
+ Some payloaders like rtpg729pay can add a shorter frame at the end of a
+ RTP packet. We need to count it like a full frame for timestamps.
+ https://bugzilla.gnome.org/show_bug.cgi?id=618324
+
+2010-05-10 18:53:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ basertpaudiopayload: Set duration on buffers
+ Set the duration of the buffers from their size
+
+2010-05-11 16:12:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: Fixate PAR to 1/1 if possible
+
+2010-05-11 10:07:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Check for GTK+ 3.0 and if it's not available for GTK+ 2.0
+
+2010-05-10 12:44:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Check if the X context is allocated before using it
+ It should be allocated at these places already or the state changes
+ would have failed... but better add an additional check here.
+
+2010-05-10 12:28:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Post an error message on the bus if no supported pixmap formats can be found
+ Might fix bug #615851.
+
+2010-05-07 19:49:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace : whooops
+
+2010-05-07 19:21:13 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: more minor cleanups
+
+2010-05-07 17:16:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: speedup caps transformation
+ * don't re-create our possible caps every single time, just use the
+ template caps.
+ * don't intersect the caps against the template, basetransform has already
+ done that for us.
+ 62% speedup of _transform_caps() (instruction calls, measured with callgrind)
+
+2010-05-07 12:19:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add the 'expose-all-streams' property from decodebin2
+ API: expose-all-streams
+ https://bugzilla.gnome.org/show_bug.cgi?id=617868
+
+2010-05-06 18:50:51 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Add a property to not expose/decode all streams
+ API : expose-all-streams
+ If disabled:
+ * only the streams that CAN be decoded and match the final caps will have a
+ decoder plugged in and be exposed.
+ * the streams that COULD HAVE BEEN decoded but do not match the finals caps
+ will not have a decoder plugged in and will not be exposed.
+ If no decoder is available to decode a certain stream, then the missing element
+ message will still be emitted regardless of the value of the property.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617868
+
+2010-05-06 17:47:12 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: rename are_raw_caps to are_final_caps, correct comment
+ https://bugzilla.gnome.org/show_bug.cgi?id=617868
+
+2010-05-07 17:16:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ sdpmessage: add new TIAS bandwidth modifier
+ Add TIAS modifier as specified in RFC 3890.
+ Do some whitespace fixes.
+
+2010-05-07 00:10:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioconvert/audioconvert.c:
+ audioconvert: disambigue comment due to popular demand
+ Write "target depth" instead of "our depth" or previous ambigous "out depth".
+
+2010-05-06 15:40:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: disconnect signals in some more cleanup cases
+
+2010-05-06 13:10:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: don't seek when no current chain
+ Avoid a crash when we try to seek when there is no current chain.
+
+2010-05-06 12:21:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: ignore the skeleton start time
+ Ignore the skeleton start time as it is usually wrong for live streams
+ and we have the needed logic to calculate it anyway.
+
+2010-05-06 12:06:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: wait for headers before exposing chains
+ Wait until we have all the stream headers before we start exposing the streams
+ of a chain.
+
+2010-05-06 10:56:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: use index to estimate bitrate
+ When we have an index, use it to much more accurately estimate the total stream
+ bitrate.
+
+2010-05-06 11:34:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ docs: be more firendly to gtk-doc limitted parsing capabilities
+
+2010-05-06 09:42:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ * gst-libs/gst/rtsp/gstrtsprange.c:
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ docs: fix wrong doc markup
+
+2010-05-06 09:17:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: use can_intersect to avoid a caps copy
+
+2010-05-06 09:14:25 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: trucate 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.
+ Besides gst-indent has chooses to line-up all caps in one line again :/.
+
+2010-05-06 09:12:32 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin.c:
+ decodebin: use can_intersect to avoid a caps copy
+
+2010-05-06 09:11:17 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/libvisual/visual.c:
+ libvisual: trucate 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 08:20:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/gstvorbisdeclib.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ vorbis: have a copy_sample func as a func pointer
+ Make some more variants for copy_sample funcs and use them via function pointer.
+
+2010-05-06 08:16:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioconvert/audioconvert.c:
+ audioconvert: fix typo in comment
+
+2010-05-06 08:15:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: use gst_caps_can_intersect() more
+ In place where we just need to know whether caps intersect, we can use this
+ quicker function.
+
+2010-04-15 13:09:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/position-formats.c:
+ examples: add a test for difference position formats
+ The test runs position and duration queries on the pipeline in all formats.
+
+2010-04-15 13:08:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/audio-trickplay.c:
+ example: update status (adder is fixed now)
+
+2010-04-15 13:08:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/playbin-text.c:
+ example: make app static
+
+2010-05-05 13:25:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: printf format fixes
+
+2010-05-04 15:32:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: weekday and month names in RTSP date string should be in C locale
+ Create date string using C locale weekday and month names.
+ Fixes #617636.
+
+2010-05-04 17:54:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add all qtdemux types to downloadable types
+ Add all the media types that qtdemux can handle to the list of downloadable
+ types.
+
+2010-05-04 17:38:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: handle corrupt indexes
+ Make sure we handle and receover from corrupt indexes.
+
+2010-05-04 15:47:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix EOS check
+
+2010-05-04 13:51:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: avoild division by 0
+
+2010-05-04 13:50:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: cleanup unused defines
+
+2010-05-04 13:36:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: use the index in push mode when we can
+ When seeking in push mode, try to use the index first before we use the bitrate
+ estimation.
+
+2010-05-04 13:05:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: use skeleton duration when possible
+
+2010-05-04 13:02:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggstream: parse duration from 3.3 skeleton
+
+2010-03-02 11:16:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: more index parsing work
+
+2010-03-01 13:50:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: clean up fishead/fisbone parsing
+ Remove some redundant code for parsing fishead streams. Actually use the data we
+ parsed (mostly start_time).
+
+2010-05-04 11:19:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: implement seek in push mode
+ Refactor start time collection code.
+ When we receive a flush_stop, resync to the new start time and push out a new
+ segment event.
+
+2010-05-03 16:52:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: make event handling better
+ Explicitly handle FLUSH events and resync on FLUSH_STOP.
+ Make send_event return a boolean.
+ Use more performant send_event function to forward events.
+
+2010-04-30 18:37:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: implement seeking in pushmode
+ Convert seek requests to bytes using the bitrate and forward them upstream. Does
+ not quite work because the flushing and resyncing is not implemented yet.
+
+2010-04-30 18:03:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: refactor for seeking in pushmode
+ refactor the code a little to prepare for seeking in push mode
+
+2010-05-03 12:46:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds new geo-location mappings
+ Adds GST_TAG_GEO_LOCATION_MOVEMENT_SPEED,
+ GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION and
+ GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION to xmp
+ mappings.
+ Tests included.
+
+2010-04-26 22:08:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds xmp mappings for device tags
+ Adds xmp mappings for GST_TAG_DEVICE_MANUFACTURER and
+ GST_TAG_DEVICE_MODEL. Also adds tests for it.
+
+2010-04-30 19:56:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspbase64.c:
+ * gst-libs/gst/rtsp/gstrtspbase64.h:
+ rtsp: deprecate remaining base64 function now that we depend on GLib 2.20
+ API: deprecate gst_rtsp_base64_decode_ip(), use g_base64_decode_inplace() instead
+
+2010-04-30 19:37:33 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basertpdepayload: ensure writable metadata
+
+2010-04-30 17:41:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: use bitrate to estimate length in pushmode
+ Parse the bitrate from the various streams.
+ Use the bitrate and the upstream length in bytes to estimate the total stream
+ duration in push mode.
+
+2010-04-30 14:07:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * ext/gio/gstgiobasesrc.c:
+ Bump GLib requirement to 2.20
+ See http://gstreamer.freedesktop.org/wiki/ReleasePlanning/GLibRequirement
+
+2010-04-30 13:36:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: forward duration query duration during group switch if no cached duration
+ ... such as during first group setup.
+ Fixes #616396.
+
+2010-04-02 16:37:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: only EOS when all streams are EOS
+
+2010-04-02 16:36:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix debug message
+
+2010-04-30 08:45:43 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/audio-trickplay.c:
+ test: fix copy and paste error of variable name
+
+2010-04-18 20:46:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: only accept seek-types none and set
+ Previously we were also acting on cur and end, but treating them like none.
+
+2010-04-14 23:31:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: rework timestamping
+ Adder was using always incrementing timestamps. Seeking was done by setting the
+ position in the newsegment event. This was failing when doing segmented seeks
+ with rate<0.0, as offset (and thus timestamp) would go below 0.
+ Now we take both cur and end from the seek event. We construct newsegment events
+ depending including cur and end from the seek event. We set position to the
+ start of the segment. Timestamp is set to start or end of segment depending on
+ rate. Offset is recalculated.
+
+2010-04-26 17:30:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Add support for deinterlacing
+ This is disabled by default and can be enabled with the
+ deinterlace flag.
+ Fixes bug #547603.
+
+2010-04-26 11:12:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplay-enum.c:
+ * gst/playback/gstplay-enum.h:
+ playbin2: Add flag for enabling/disabling automatic deinterlacing
+
+2010-04-26 11:11:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplay-enum.c:
+ playbin: Use g_once_init_{enter,leave} instead of GOnce for enum/flag registration
+
+2010-04-23 17:01:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ ffmpegcolorspace: Use GST_BOILERPLATE and use GstVideoFilter as base class
+ This gives automatic QoS handling.
+
+2010-04-23 16:24:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Correctly reconfigure the video chain when switching from a subtitle to a non-subtitle file
+ Fixes bug #616422.
+
+2010-04-23 16:08:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If a text sink is provided, let subtitle parsing be done by decodebin2 if required
+ This way subtitle sinks only get buffers in the format that they
+ understand, i.e. raw parsed text in most cases.
+ Fixes bug #614942.
+
+2010-04-23 15:30:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Set subtitle encoding on the decodebins again
+
+2010-04-23 15:22:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: API: Add GST_VIDEO_FORMAT_v308 for packed 4:4:4 YUV
+
+2010-04-23 15:14:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ videoscale: Some random cleanup
+
+2010-04-23 15:06:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Add support for Y444, Y42B and Y41B
+
+2010-04-23 14:42:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Reorder template caps by the amount of information contained in the color formats
+
+2010-04-22 15:46:17 -0400 Joshua M. Doe <joshua.doe@us.army.mil>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: add support for video/x-raw-gray
+
+2010-04-29 15:05:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ docs: remove references to and introspection data of plugins that no longer exist
+ Some plugins (decodebin2, playbin) have been renamed or merged
+ into different plugins (uridecodebin, playback).
+
+2010-04-29 15:02:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development.
+
+=== release 0.10.29 ===
+
+2010-04-28 02:16:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.29
+
+2010-04-28 01:34:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2010-04-25 23:14:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.28.3 pre-release
+
+2010-04-20 17:20:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-plugins-base.doap:
+ doap: update repository info from cvs->git and maintainers
+
+2010-04-23 14:39:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From fc85867 to 4d67bd6
+
+2010-04-22 20:58:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Fix Y41B->Y444 conversion
+ ...which is the intermediate conversion for conversion to all
+ other formats.
+ Fixes bug #616545.
+
+2010-04-16 20:03:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: Don't leak the input buffer in error cases
+ Fixes bug #615572.
+
+2010-03-29 12:53:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/ogg/gstoggmux.c:
+ docs: fix typo in link name
+
+2010-04-15 12:59:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: gracefully handle ximagesink>xwindow == NULL
+ Expose could be called before we have set the xwindow. Handle this gracefully
+ like we do in image_put.
+ Fixes #615789
+
+2010-04-15 11:44:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: refactor _update_geometry()
+ Refactor like in xvimagesink. Remove the extra parameter and adjust the assert check.
+
+2010-04-15 07:18:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * 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 14:13:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/tag/lang-tables.dat:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/video-enumtypes.c:
+ 0.10.28.2 pre-release
+
+2010-04-14 13:50:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translations
+
+2010-04-13 16:20:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: init geometry when setting new xid
+ Don't rely on expose event to query geomentry after new xid is set.
+ Fixes #615647.
+
+2010-04-14 13:43:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audioconvert/Makefile.am:
+ * tests/examples/app/Makefile.am:
+ * tests/examples/dynamic/Makefile.am:
+ * tests/examples/gio/Makefile.am:
+ * tests/examples/volume/Makefile.am:
+ * tests/old/examples/switch/Makefile.am:
+ build: use LDADD instead of LDFLAGS to specify libs to link to when building executables
+ 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 initial patch by Brian Cameron <brian.cameron@oracle.com>
+ Fixes #615697.
+
+2010-04-12 14:02:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add channels and rate to ADTS caps if we can
+
+2010-04-12 13:33:18 +0100 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/typefind/Makefile.am:
+ * gst/typefind/gstaacutil.c:
+ * gst/typefind/gstaacutil.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add AAC level to ADTS caps
+ This adds code to calculate the level for a given AAC stream and export
+ it in the stream caps. For AAC LC streams, the level is calculated
+ according to the definition under the AAC Profile. For other streams,
+ the definition under the Main Profile is used.
+ HE-AAC support is still to be done, and is dependent on detecting the
+ presence of SBR and PS in the stream.
+ Level is added as a field of type string because that's the way it's
+ done in H.264 caps as well. There are only a few possible levels, so
+ not using a numerical type is not too painful in this case, and
+ consistency is nice.
+ Fixes #613589.
+
+2010-03-10 13:32:53 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add AAC profile to ADTS caps
+ This looks at the AAC profile for ADTS streams and adds the profile as a
+ string in the corresponding caps.
+ Profile is the actual profile, base-profile denotes the minimum codec
+ requirements to decode this stream. In this case they're always the
+ same, but they may differ e.g. in case of certain HE-AAC streams that
+ can be partially decoded by LC decoders (with loss of quality of course)
+ if no suitable HE-AAC decoder is available.
+ Fixes #612312.
+
+2010-04-11 22:58:15 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: add support for negative playback rates
+ Decrement sample counter when playing backwards. Set proper segment when playing
+ backwards (0..cur instead or cur..-1). Add more logging and fix a format string.
+
+2010-03-26 19:00:47 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiopayload: use ptime-multiple
+ Based on patch by Olivier Crête <olivier.crete@collabora.co.uk>
+ Fixes #613248
+
+2010-04-09 16:06:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ audiopayload: add property to control packet duration
+ Add a property to specify that the amount of data in a packet should be a
+ multiple of ptime-multiple.
+ See #613248
+
+2010-04-09 11:20:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 218568f to fc85867
+
+2010-04-08 17:49:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplayback.h:
+ playback, ogg: dist new gstplayback.h and gstogg.h
+
+2010-04-09 08:23:33 +0200 Thomas Green <thomasgr33n@googlemail.com>
+
+ * gst/playback/gstplaybin.c:
+ playbin: Only unref the volume element on dispose and when a new audio sink is set
+ Unreffing it whenever the sinks are removed will make the volume
+ element unavailable after a playbin reuse because it is only
+ recreated if the audio sink has changed.
+ Fixes bug #614288.
+
+2010-04-08 07:39:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Be sure that metadata is writable before setting caps
+ Call gst_buffer_make_metadata_writable before attempting
+ to set caps on the buffer.
+
+2010-04-08 12:21:50 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/gio/gstgio.c:
+ * ext/gnomevfs/gstgnomevfs.c:
+ ext: Invert rank of gio and gnomevfs elements
+
+2010-04-08 01:26:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ alsa: don't pass non-constant strings as printf format strings
+ Fixes 'format not a string literal and no format arguments' compiler
+ warning when compiling with -DGST_DISABLE_PRINTF_EXTENSION.
+
+2010-04-07 20:21:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ docs: add gtk-doc chunks with Since: tags for new GST_VIDEO_CAPS_GRAY* API
+
+2010-04-07 19:07:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ * configure.ac:
+ build: bump autoconf requirement to 2.60 for gobject-introspection.m4
+ Require autoconf 2.60 (which was released in June 2006).
+ Fixes #600718.
+
+2010-04-07 17:25:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ video: Fix parsing of 8-bit grayscale caps
+
+2010-04-07 17:21:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/video/video.h:
+ video: API: Add GST_VIDEO_CAPS_GRAY{8,16}
+
+2010-04-07 17:08:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ video: API: Add gst_video_format_is_gray() to the docs
+
+2010-04-07 17:07:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ video: Add new symbol to the exported symbols list
+
+2010-04-07 17:06:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add support for 8-bit and 16-bit grayscale formats
+
+2010-04-06 10:55:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtspconnection: Handle closed POST socket in tunneling
+ Catch more socket errors.
+ Rework how sockets are managed in the GSource, wake up the maincontext instead
+ of adding/removing the sockets from the source.
+ Add callback for when the tunnel connection is lost. Some clients (Quicktime
+ Player) close the POST connection in tunneled mode and reopen the socket when
+ needed.
+ See #612915
+
+2010-04-04 21:24:44 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ configure: fix cdparanoia check
+ Linking with libcdda_paranoia.so requires also linking with
+ libcdda_interface.so.
+
+2010-04-04 18:00:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ tests: tag: Refactor a bit
+ Refactor xmp tags unit tests and remove an useless assertion.
+ This will make easier to add unit tests to serialize/deserialize
+ taglists.
+
+2010-04-04 21:18:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ alsa: Ignore errors when unpreparing or closing the device
+ Errors could happen here when the device was removed already
+ or when something is broken anyway. If errors happen here and
+ they're propagated, the element can't shutdown cleanly.
+ Fixes bug #614545.
+
+2010-04-04 20:55:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/alsa/gstalsamixer.c:
+ alsamixer: Detect errors from device polling, stop the task and post an error message
+ Partially fixes bug #614545.
+
+2010-04-04 12:13:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/seek/Makefile.am:
+ examples: build silly joystick seek example only on linux
+ jsseek depends on linux headers and should therefore only be built
+ on linux.
+ Fixes #614764.
+
+2010-04-03 22:49:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: swap timestamps in forward and reverse mode.
+ In reverse mode we want use the next next timestamp (and not the other way
+ around). Fixes the tests again. Also readd a log line that was dropped with
+ previous commit.
+
+2010-04-03 14:03:45 +0100 Vincent Untz <vuntz@gnome.org>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ libs: point gobject-introspection scanner to .la files
+ Point g-ir-scanner to the .la file of our library, which hopefully
+ makes it find the right dependencies in all cases (ie. our locally
+ built libgstreamer and not the system-installed one). This is also
+ how it's done in Gtk+ and how it's documented in the wiki, see
+ http://live.gnome.org/GObjectIntrospection/AutotoolsIntegration
+ Fixes #603710.
+
+2010-04-02 21:01:25 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: implement reverse playback
+ Support playback at negative rates. When having a GstController assigned, the
+ element will produce time dependend output.
+
+2010-04-02 20:56:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/audio-trickplay.c:
+ tests: extend audio-trickplay test app
+ Tell status in top comment. Use debug logging instead of print to be able to
+ see timing issue in debug log viewer. Add more commandline flags. Test reverse
+ playback.
+
+2010-04-02 18:56:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: Only use embed_xid if HAVE_X is defined
+ Fixes bug #614622.
+
+2010-04-01 19:13:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/pipelines/basetime.c:
+ tests/basetime: Don't run test with osxaudiosrc
+ libcheck runs the actual tests in a forked process and that makes the guys
+ in Cupertino really sad.
+
+2010-04-01 18:51:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/pipelines/capsfilter-renegotiation.c:
+ tests: Unref the bus once we're done with it
+
+2010-04-01 16:49:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ common: Update for new suppressions
+
+2010-04-01 13:55:15 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ gstplaysink: Remove unused variable.
+ The value of klass is never used
+
+2010-04-01 13:53:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Removing dead assignment.
+ The value of group is overwritten a few lines below before being used.
+
+2010-04-01 13:51:13 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: Remove unused variable
+
+2010-04-01 13:48:42 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/gnomevfs/gstgnomevfssink.c:
+ gstgnomevfssink: Return the proper GstFlowReturn.
+ We were always returning GST_FLOW_OK previously even if we encountered errors.
+
+2010-03-30 23:44:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ gst-libs: more gobject-introspection fixes
+ Use right .pc file variable for compiler includes this time:
+ g-ir-compiler wants the girdirs not the typelibdirs as includes.
+
+2010-03-30 20:21:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/jsseek.c:
+ examples: fix printf format warning in jsseek example
+ Yes, I know about G_GSIZE_FORMAT.
+
+2010-03-30 19:56:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ gst-libs: fix up gobject-introspection some more
+ Use new girdir and typlibdir from core .pc files, so we can figure
+ out the right includes to pass to the gobject-introspection tools,
+ whether core is installed in the same prefix as gobject-introspection
+ or in a different prefix or uninstalled. This also keeps us from adding
+ bogus paths to the includes that only work if core is uninstalled.
+ Also add some missing includes/pkgs where needed.
+
+2010-03-30 19:29:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ Our RIFF library depends on both the audio and tag libraries
+ Update rules in Makefile.am accordingly.
+
+2010-03-30 15:10:42 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Fix aduio_raw_sink typo
+
+2009-11-28 21:03:44 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/seek/.gitignore:
+ * tests/examples/seek/Makefile.am:
+ * tests/examples/seek/jsseek.c:
+ examples: Add a silly joystick based shuttle example
+
+2010-03-29 20:07:52 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraenc.c:
+ theoraenc: 0-length packets are delta units
+
+2010-03-29 10:47:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ gst-libs: build independent sub-directories in parallel if make -jN is used
+ Build those libraries that don't depend on any other gst-plugins-base
+ libraries in parallel if make -jN is used.
+
+2010-03-29 00:22:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * ext/Makefile.am:
+ * gst/Makefile.am:
+ * sys/Makefile.am:
+ * tests/examples/Makefile.am:
+ build: build plugin and example directories in parallel if make -jN is used
+ We know our plugins and examples are independent of each other, so may
+ just as well build them in parallel. Makes the output a bit messy, but
+ that shouldn't be a problem and can easily be avoided with make -j1.
+
+2010-03-28 21:50:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ gst-libs: specify dependencies in Makefile.am to make them explicit
+
+2010-03-24 09:59:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ * sys/xvimage/xvimagesink.c:
+ * tests/icles/test-xoverlay.c:
+ xoverlay: change new set_render_rectangle() vfunc to take four arguments so we don't depend on libgstvideo
+ Don't make libgstinterfaces (and thus libgstaudio etc.) indirectly depend
+ on libgstvideo by using the GstVideoRectangle helper structure in the API,
+ which causes undesirable dependencies, esp. with the gobject-introspection
+ (people will point and laugh at us if they find out that libgstaudio
+ depends on libgstvideo). Instead, pass the x, y, width and height parameters
+ directly to the function.
+ Re-fixes #610249.
+
+2010-03-25 18:45:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: we can handle avi in download mode too
+ Add avi to the whitelisted types that can be used for download buffering.
+
+2010-03-26 15:57:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: Provide packet duration function for old FLAC mapping too
+ Fixes bug #613809.
+
+2010-03-18 22:12:40 +0000 Damien Lespiau <damien.lespiau@intel.com>
+
+ * 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-24 23:04:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Do not remove tag from list twice
+ There was a but when parsing the tags that removed two tags
+ from the list when only one was parsed
+
+2010-03-24 14:43:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Add some comments
+ Just adds some comments explaining some stuff about the
+ (de)serialization functions. Add myself to the copyright list too.
+
+2010-03-24 10:18:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds _USER_RATING mapping for xmp
+ Adds a new mapping for _USER_RATING on xmp helper lib
+ and also adds tests for it
+
+2010-03-23 09:32:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Add Elevation tag mapping
+ Adds a mapping to the _ELEVATION tag, this is a different
+ mapping as it has to be mapped into exif:GPSAltitude and
+ exif:GPSAltitudeRef at the same time. So we needed to refactor
+ a little more to be able to deserialize it properly.
+ Now, when parsing a xmp buffer into a taglist all tags are
+ added to a list before being parsed so that when one of the
+ altitude tags are found the deserialization function can search
+ for its complementary tag to do the correct parsing
+ Fixes #613690
+
+2010-03-23 09:48:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Fix off by one
+ Avoid ignoring single char tags, like exif:GPSAltitudeRef
+ Fixes #613690
+
+2010-03-22 15:18:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ * tests/check/libs/tag.c:
+ tag: xmp: Adds mappings for LATITUDE and LONGITUDE
+ Adds the mappings for those tags and tests
+ for tags serialization.
+ Fixes #613690
+
+2010-03-22 22:03:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Refactor buffer parsing
+ When parsing the xmp buffer into the gst taglist store the
+ found tags into a list to be parsed only after finding all
+ tags on the buffer. This allows the parser function to search
+ this list for complimentary tags that should be parsed together
+ Fixes #613690
+
+2010-03-20 11:17:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tag: xmp: Refactor mappings storage
+ This commit is only refactoring, no fetaures added.
+ Do not store tags in flexible arrays as it doesn't allow us
+ to use nested flexible arrays. This is going to be needed in the
+ following commits to map gst tags that are stored into
+ 2 separate tags in xmp (Not that they are alternatives, but
+ they are complementary).
+ For example, GST_TAG_ELEVATION is represented in the exif
+ schema with 2 fields: the absolute altitude and an integer
+ to indicate if it is above or below sea level.
+ The previous mappings storage wouldn't allow us to
+ express it.
+ Also store a serialization and a deserialization function
+ for each xmp tag as some of them require some non-trivial
+ convertion to its string form.
+ Fixes #613690
+
+2010-03-24 18:51:42 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 55cd514 to c1d07dd
+
+2010-03-24 18:55:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: parse more info from the buffering query
+ Parse more info from the buffering query and log this as debug info.
+
+2010-03-24 12:10:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ rtsptransport: ignore unparsable ranges
+ Ignore unparsable port ranges instead of erroring out.
+ Fixes #613591
+
+2010-03-23 18:36:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstrtsp.def:
+ win32: Add new gst_rtsp_lower_trans_get_type() symbol to the symbol lists
+
+2010-03-23 11:01:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add some more fourcc for MPEG-4 video
+
+2010-03-22 09:15:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: require core git
+
+2010-03-22 08:38:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * pkgconfig/gstreamer-fft-uninstalled.pc.in:
+ * pkgconfig/gstreamer-fft.pc.in:
+ pkgconfig: Add @LIBM@ to the FFT pkg-config files
+
+2010-03-22 08:35:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * pkgconfig/gstreamer-app-uninstalled.pc.in:
+ * pkgconfig/gstreamer-audio-uninstalled.pc.in:
+ * pkgconfig/gstreamer-cdda-uninstalled.pc.in:
+ * pkgconfig/gstreamer-fft-uninstalled.pc.in:
+ * pkgconfig/gstreamer-floatcast-uninstalled.pc.in:
+ * pkgconfig/gstreamer-floatcast.pc.in:
+ * pkgconfig/gstreamer-interfaces-uninstalled.pc.in:
+ * pkgconfig/gstreamer-netbuffer-uninstalled.pc.in:
+ * pkgconfig/gstreamer-pbutils-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-riff-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtsp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-sdp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-tag-uninstalled.pc.in:
+ * pkgconfig/gstreamer-video-uninstalled.pc.in:
+ pkgconfig: Fix include and library paths for the uninstalled pc files
+
+2010-03-20 13:42:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ gio: add cast to avoid compiler warning with old GLib versions
+ g_file_input_stream_query_info() had char * instead of const char *
+ as attribute argument before 2.20.
+ Fixes #613387, spotted by tetsuyayasuda@gmail.com
+
+2010-03-20 12:55:36 +0000 Torsten Schönfeld <kaffeetisch@gmx.de>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ docs: add Since: tags to gst_x_overlay_handle_event() docs
+ Fixes #613403.
+
+2010-03-19 22:33:58 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ Constify some strings in the API
+ Needed by plugins-good
+
+2010-03-19 16:41:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Only set color-matrix and chroma-site for relevant formats
+ The color-matrix only makes sense for colorful formats, i.e. not Y800
+ and the chroma-site only for non-4:4:4(:4) formats.
+
+2010-03-19 15:37:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoradec.h:
+ theoradec: add QoS messages to the decoder
+ Post QoS messages when we drop a frame because of QoS.
+
+2010-03-19 15:00:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ rtsp: add GType for transport flags
+ Make a method to register the transport flags as a GType.
+
+2010-03-19 01:00:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/cdparanoia/Makefile.am:
+ * ext/gio/Makefile.am:
+ * ext/gnomevfs/Makefile.am:
+ * ext/libvisual/Makefile.am:
+ * ext/ogg/Makefile.am:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/tcp/Makefile.am:
+ * gst/videotestsrc/Makefile.am:
+ * sys/v4l/Makefile.am:
+ * tests/examples/app/Makefile.am:
+ * tests/examples/overlay/Makefile.am:
+ * tests/icles/Makefile.am:
+ build: Makefile.am fixes
+ Mostly just add missing $(GST_BASE_CFLAGS), but also fix up order
+ of flags (see docs/random/moving-plugins).
+
+2010-03-19 00:46:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/.gitignore:
+ .gitignore: ignore new unit test binary
+
+2010-03-17 23:57:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: -Wmissing-prototypes and -Wnested-externs are not valid for C++
+ Fixes building Qt-based overlay examples in combination with -Werror.
+
+2010-03-17 16:32:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: wrap overly long warning flag lines
+
+2010-03-17 19:24:27 -0300 Reuben Dowle <reube.dowle@navico.com>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: Fix caps leak
+ Unref caps when peer doesn't accept caps
+ Fixes #613198
+
+2010-03-17 08:13:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/capsfilter-renegotiation.c:
+ tests: capsfilter-renegotiation: Adds a new unit test
+ Adds a new test for checking that capsfilter 'caps' property
+ changes cause caps renegotiation on the pipeline.
+
+2010-03-17 16:46:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Use correct boundary checks for YUY2/UYVY
+ Fixes bug #613093.
+
+2010-03-17 16:39:13 +0100 Peter Kjellerstedt <peter.kjellerstedt@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ rtsp: Further clean up of gst_rtsp_strresult()
+ Since we no longer use an array of error messages, there is no reason
+ to clamp the error code, which allows us to simplify the code some more
+ and also to actually report the correct error code for unknown errors.
+
+2010-03-17 15:41:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Remove useless cast
+ It's not necessary anymore after latest core change to GstValueArray.
+
+2010-03-17 12:08:30 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Add more warning flags
+ The warnings are:
+ -Wcast-align
+ -Winit-self
+ -Wmissing-include-dirs
+ -Waddress
+ -Waggregate-return
+ -Wno-multichar
+ -Wnested-externs
+ No code needed to be fixed.
+
+2010-03-17 11:14:29 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/audioconvert/gstfastrandom.h:
+ Fix for -Wold-style-definition
+ I didn't add the flag to configure because libvisual ships headers that
+ trigger this warning.
+
+2010-03-17 10:53:21 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * ext/pango/gstclockoverlay.h:
+ * gst/subparse/mpl2parse.c:
+ Add -Wformat-nonliteral -Wformat-security
+ And fix the resulting compile failures.
+ I'm sorry about the patch necessary to gstclockoverlay.h but after
+ talking to Tim we decided we can live with it.
+
+2010-03-17 10:51:57 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ rtsp: Refactor gst_rtsp_strresult
+ 2 goals in the refactoring:
+ - Put the error messages closer to their enum values, so that it's easy
+ to see which error belongs to which value.
+ - Make gcc not complain with -Wformat-nonliteral
+
+2010-03-17 10:47:07 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ xmp: Refactor code
+ I initially looked here because I wanted compiles to not fail with
+ -Wformat-nonliteral but ended up refactoring the code to make it look
+ nicer.
+ As I lack a large collection of XMP tagged files, I only did rough
+ testing of the code. The testsuite passes though.
+
+2010-03-16 20:05:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * m4/Makefile.am:
+ * m4/a52.m4:
+ * m4/aalib.m4:
+ * m4/as-arts.m4:
+ * m4/as-ffmpeg.m4:
+ * m4/as-liblame.m4:
+ * m4/as-slurp-ffmpeg.m4:
+ * m4/esd.m4:
+ * m4/gconf-2.m4:
+ * m4/glib.m4:
+ * m4/gst-artsc.m4:
+ * m4/gst-matroska.m4:
+ * m4/gst-sdl.m4:
+ * m4/gst-shout2.m4:
+ * m4/gst-sid.m4:
+ * m4/gtk.m4:
+ * m4/libfame.m4:
+ * m4/libmikmod.m4:
+ m4: remove some unused .m4 files
+
+2010-03-16 18:31:15 +0100 Benjamin Otte <otte@redhat.com>
+
+ * ext/alsa/gstalsaplugin.c:
+ * ext/ogg/gstoggdemux.c:
+ More ENABLE_NLS fixes
+
+2010-03-16 18:06:16 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/gettext.h:
+ Fix for ENABLE_NLS being undefined for -Wundef
+
+2010-03-15 22:49:53 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * ext/libvisual/visual.c:
+ * ext/theora/gsttheoraenc.c:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ * gst-libs/gst/tag/tags.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/samiparse.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ * gst/volume/gstvolume.c:
+ * sys/v4l/gstv4lelement.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/gdpdepay.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/playbin2.c:
+ * tests/check/elements/videorate.c:
+ * tests/check/libs/pbutils.c:
+ * tests/check/libs/video.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/stress-playbin.c:
+ Add -Wwrite-strings to configure
+ Fixes for the code included
+
+2010-03-16 15:45:23 +0100 Benjamin Otte <otte@redhat.com>
+
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsamixerelement.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * ext/vorbis/gstvorbistag.c:
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gststreamselector.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/v4l/gstv4ljpegsrc.c:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * sys/v4l/gstv4lsrc.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/playbin.c:
+ * tests/check/elements/playbin2.c:
+ * tests/check/elements/textoverlay.c:
+ * tests/check/libs/cddabasesrc.c:
+ * tests/check/libs/pbutils.c:
+ * tests/old/testsuite/alsa/formats.c:
+ * tests/old/testsuite/alsa/sinesrc.c:
+ gst_element_class_set_details => gst_element_class_set_details_simple
+ Also change my email from the old university one to the current one.
+
+2010-03-15 22:17:56 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Add -Wundef flag
+
+2010-03-16 16:15:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: allow for more ipv6 addresses
+ Use hints in getaddrinfo() so that we can also resolve ipv6 addresses.
+
+2010-03-11 14:52:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: arrange for a running ringbuffer/clock for _wait_eos
+ Fixes #612223.
+
+2010-03-16 01:08:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ tests: fix videorate test
+ Fix up videorate test for latest videotestsrc changes: just check for
+ the important bits in the negotiated caps, not for exact equality with
+ our filter caps. Also don't leak the videorate element in the test.
+
+2010-03-15 12:54:32 -0500 Rob Clark <rob@ti.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add mapping for On2 VP7 fourccs
+ Fixes #612968.
+
+2010-03-15 12:54:01 -0500 Rob Clark <rob@ti.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add mapping for On2 VP62 fourcc
+ See #612968.
+
+2010-03-15 23:46:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/multichannel.c:
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ * gst-libs/gst/interfaces/tuner.c:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ docs: more helper libraries docs fixes
+ Quieten gtk-doc a bit more.
+
+2010-03-15 23:47:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ docs: add GstRTSPExtension to docs
+ Add minimal docs for GstRTSPExtension so people know it exists.
+
+2010-03-15 18:45:13 +0000 David Hoyt <dhoyt@llnl.gov>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: use g_ascii_strncasecmp() instead of strncasecmp()
+ g_ascii_strncasecmp() is more portable and likely more robust as
+ well (with random binary data as input).
+ Fixes #612845.
+
+2010-03-15 13:39:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ docs: fix typo in gst_tag_list_from_xmp_buffer() docs chunk
+
+2010-03-15 13:32:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ docs: fix up interfaces library docs to make gtk-doc happy
+
+2010-03-15 13:24:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: add new libgstvideo API to documentation
+
+2010-03-15 13:19:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgstvideo.def:
+ win32: add recently added API to .def files
+ Also add API markers to make life easier for the release manager:
+ API: gst_x_overlay_set_render_rectangle()
+ API: gst_video_parse_caps_color_matrix()
+ API: gst_video_parse_caps_chroma_site()
+
+2010-03-15 13:14:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: use C comments instead of C++-style comments
+
+2010-03-15 13:10:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: use g_value_set_static_string() for string constants
+
+2010-03-15 14:26:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Avoid g_object_set() on NULL if a text sink is used
+ Fixes bug #611702.
+
+2010-03-15 14:10:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Correctly escape brackets in DKS regex
+ Fixes bug #612783.
+
+2010-03-15 11:36:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: make timeout usec more accurate
+ Adjust the returned usec from the elapsed time so it represents the remaining
+ timeout.
+
+2010-03-15 11:41:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/videorate.c:
+ tests: update videorate test for videotestsrc changes
+ Add color-matrix to the caps we are comparing. Add logging og the caps in the
+ test.
+
+2010-03-15 01:35:15 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: add chroma-zone-plate pattern
+ pattern=chroma-zone-plate is pattern similar to zone-plate,
+ but in the chroma channels instead of luma.
+
+2010-03-15 01:34:09 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: add chroma-site to caps
+
+2010-03-15 01:33:36 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: add chroma-site to caps
+
+2010-03-15 01:31:20 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: add gst_video_parse_caps_chroma_site()
+
+2010-03-14 19:10:16 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: add color-matrix to caps
+
+2010-03-14 16:17:46 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add color-matrix to template caps
+
+2010-03-14 22:14:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/examples/seek/seek.c:
+ * tests/icles/test-colorkey.c:
+ * tests/icles/test-xoverlay.c:
+ tests: make Gtk+ test programs compile with -DGSEAL_ENABLE
+ Fixes #612552, at least for now.
+
+2010-03-14 22:13:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ build: add cruft alert for common/shave* leftovers to top-level Makefile.am
+
+2010-03-14 13:11:53 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't drop zero-sized packets
+ Zero-sized packets have relevence to Theora.
+
+2010-03-12 15:47:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Revert rounding behaviour changes when using controlled volume properties
+ Now the controlled and non-controlled code paths are all having
+ exactly the same rounding behaviour and the unit tests pass again.
+
+2010-03-12 15:44:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Only allocate a mute value array if a control source exists for the mute property
+
+2010-03-12 13:55:55 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From e272f71 to 55cd514
+
+2010-03-10 10:50:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstxmptag.c:
+ tags: Add new mapping to XMP helpers
+ Adds geotagging mappings to XMP helpers
+ Fixes #609539
+
+2010-03-11 20:16:44 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/interfaces/Makefile.am:
+ Don't have 2 include dirs
+ Seems to have been accidentally introduced in
+ 7269bc26d0a4bf44bd77a039fb54777625ef5f39.
+
+2010-03-11 16:35:10 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/icles/audio-trickplay.c:
+ tests: Fix another unitialized variable
+
+2010-03-11 16:09:26 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/icles/audio-trickplay.c:
+ tests: Fix unitialized variable.
+
+2010-03-11 15:38:18 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * ext/ogg/gstoggdemux.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/vorbis/gstvorbistag.c:
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioquantize.h:
+ * gst/audioconvert/gstchannelmix.h:
+ * gst/playback/gstplaysink.c:
+ Add -Wredundant-decls to warning flags
+ ... and fix all the warnings that flag throws.
+
+2010-03-11 13:32:14 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * ext/ogg/Makefile.am:
+ * ext/ogg/gstogg.c:
+ * ext/ogg/gstogg.h:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/ogg/vorbis_parse.c:
+ * ext/ogg/vorbis_parse.h:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/gsttheoraenc.h:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/riff/riff.c:
+ * gst-libs/gst/rtsp/gstrtspbase64.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/tag/lang.c:
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/ffmpegcolorspace/gstffmpeg.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.h:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplayback.c:
+ * gst/playback/gstplayback.h:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/videorate/gstvideorate.h:
+ * tests/check/elements/appsink.c:
+ * tests/check/elements/audiorate.c:
+ * tests/check/elements/audioresample.c:
+ * tests/check/libs/cddabasesrc.c:
+ * tests/check/libs/mixer.c:
+ * tests/check/libs/navigation.c:
+ * tests/examples/gio/giosrc-mounting.c:
+ Add -Wmissing-declarations -Wmissing-prototypes to warning flags
+ Includes all the fixes necessary to make stuff compile again.
+
+2010-03-11 12:49:02 +0100 Benjamin Otte <otte@redhat.com>
+
+ * ext/gio/gstgiobasesink.c:
+ gio: Remove unused function
+
+2010-03-11 11:14:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisparse.c:
+ vorbisparse: make sure header buffer metadata is writable before modifying it
+ Fixes unit test failures with core git.
+
+2010-03-11 12:18:00 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/check/elements/multifdsink.c:
+ check: Ref buffers after setting caps on them
+ Reffing makes metadata unwritable, so we need to set the caps before.
+
+2010-03-11 12:04:32 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Add WARNING_CXXFLAGS where ERROR_CXXFLAGS are
+ This matches the previous commit doing the same for CFLAGS in response
+ to the common/ module changes.
+
+2010-03-11 12:04:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * 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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2010-03-11 10:38:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/test-xoverlay.c:
+ tests: don't use Gtk+ 2.18 API for no good reason
+ The rest of the code directly uses widget->allocation as well, so no point
+ in using the new API in other places.
+
+2010-03-11 11:20:48 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From df8a7c8 to e272f71
+
+2010-03-11 10:55:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ xvoverlay: correct version number in docs
+
+2010-02-26 13:56:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/audio-trickplay.c:
+ tests: add a test for trickplay in audio synthesis graphs
+ Right now this mostly demonstatest what not works. That is seeking with
+ start-type = NONE to only update the rate and playing backwards. Also
+ it shows that non-flushing seeks tend to lockup adder. Separate unit tests
+ for the issues follow.
+
+2010-02-08 17:20:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gstxmptag.c:
+ * gst-libs/gst/tag/tag.h:
+ * tests/check/libs/tag.c:
+ * win32/common/libgsttag.def:
+ tags: add basic xmp metadata support
+ XMP metadata can be embedded in many media container formats. Implement own
+ parser and formatter that can be used to convert between an xpacket and a
+ GstTagList. Add unit tests.
+
+2010-02-19 14:38:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/test-xoverlay.c:
+ example: add an example for xoverlay::set_render_rectangle()
+ This add a new example which animates a target recangle for the video.
+
+2010-02-19 14:46:43 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ xvimagesink: implement set_render_rectangle
+ Previously we hardcoded the target rectangle passes to Xv(Shm)PutImage. Extend
+ the implementation to use a full rectangle and don't assume 0,0 for top,left.
+
+2010-02-17 15:00:13 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ xoverlay: add new vmethod ::set_render_rectangle()
+ Add set_render_rectangle() vmethod to the interface to better support windowless
+ toolkits (e.g. qt graphicsview or video on canvas in general). Right now we
+ always fill the widget to 100%. With the patch we can use a rectangular target
+ region. Fixes #610249.
+ API: GstXOverlay::set_render_rectangle()
+
+2010-02-16 12:06:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: take new size from event thread and do not poll for every frame
+ We can update the geometry in ConfigureNotify (unless we disable event-
+ handling). If event handling is disabled, one should use _expose() to trigger a
+ redraw and update the geometry.
+
+2010-03-10 21:51:59 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 9720a7d to df8a7c8
+
+2010-03-10 21:01:20 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ 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 20:43:46 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 0b6e072 to 9720a7d
+
+2010-03-10 16:09:45 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 7cc5eb4 to 0b6e072
+
+2010-03-10 14:36:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: do not cache FLUSH_START/_STOP events
+ ... and similarly so for serialized events.
+
+2010-03-10 14:34:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: provide correct error message if configured audio/video sink fails
+
+2010-03-10 10:22:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.h:
+ vorbisdec: remove unused field
+
+2010-02-02 11:34:10 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/check/pipelines/vorbisdec.c:
+ tests: enable strict discontinuity checking on vorbisdec pipeline
+ Closes #423086.
+
+2010-03-10 01:09:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 7aa65b5 to 7cc5eb4
+
+2010-03-10 01:07:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ docs: fix Returns: for gst_video_parse_caps_color_matrix()
+
+2010-03-10 00:46:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update for changed string
+
+2010-03-10 00:42:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ tests: fix typo in videorate unit test pipeline description
+ Two consecutive ! ! leave a 'Link without source' error in the debug log.
+
+2010-03-10 00:41:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ tests: don't use deprecated functions in videorate unit test
+
+2010-03-10 00:29:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ win32: add new API to libgstvideo.def
+
+2010-03-09 15:39:55 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Don't flush after every frame for theora
+
+2010-03-09 21:26:58 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 44ecce7 to 7aa65b5
+
+2010-03-09 13:05:23 -0800 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add color-matrix handling to caps
+
+2010-01-30 22:55:01 -0800 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: Add color-matrix to caps
+
+2010-02-26 16:25:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ * pkgconfig/Makefile.am:
+ * tests/examples/overlay/Makefile.am:
+ * tools/Makefile.am:
+ build: Make some more rules silent if requested
+
+2010-02-26 15:40:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * 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-02-23 19:12:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Don't fail if there are subtitles and audio but no video
+ Change playbin2 to not error out if there are subtitles and audio
+ but no video. If visualizations are enabled the subtitles are rendered on top
+ of the visualization stream, otherwise the subtitles are not linked at all and
+ only the audio is played (and a warning message is posted).
+ If there are only subtitles but neither audio nor video an error message is
+ still posted.
+ Fixes bug #610866.
+
+2010-02-17 19:18:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolume.h:
+ volume: If a controller is used, use sample accurate property values
+ Fixes bug #609801.
+
+2010-03-09 19:17:04 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/video/video.c:
+ gstvideo: Fix typos in comments
+
+2010-03-09 17:32:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Back to development
+
+=== release 0.10.28 ===
+
+2010-03-08 23:20:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.28
+
+2010-03-08 23:19:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2010-03-08 21:57:03 +0100 Benjamin Otte <otte@redhat.com>
+
+ * ext/theora/gsttheoraenc.c:
+ theora: Fix SIGFPE when using 0/1 framerate
+ libtheora crashes with a 0 framerate, so let's forbid it.
+ https://bugzilla.redhat.com/show_bug.cgi?id=571289
+
+2010-03-08 14:50:25 +0000 David Schleef <ds@schleef.org>
+
+ * ext/ogg/dirac_parse.c:
+ oggdemux: fix dirac header parsing
+ Fixes #611900.
+
+2010-03-08 14:46:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/Makefile.am:
+ examples: make sure to dist qtgv-xoverlay.h header file
+ This time for real.
+ Fixes #610832.
+
+2010-03-08 12:11:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basedepay: clarify some documentation
+
+2010-03-08 11:25:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasrc.c:
+ alsasrc: return right number of bytes that we wrote
+
+2010-03-08 11:20:51 +0100 Dake Gu <gudake@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: fix handling of x-server-ip-address
+ Fix handling of x-server-ip-address.
+
+2010-03-02 11:25:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-keyframe-force.txt:
+ docs: update keyframe force event
+ Add field to send all headers.
+
+=== release 0.10.27 ===
+
+2010-03-06 00:09:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.27
+
+2010-03-06 00:08:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2010-03-05 15:58:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: first check for QtGui >= 4.6, only then for >= 4.0
+ If we first check for >= 4.0 the second check for >= 4.6 will just
+ short-cut since we are using the same prefix for the variables for
+ both checks, and they've already been set previously. So the examples
+ requiring >= 4.6 were built even in the >= 4.0 case.
+
+2010-03-03 20:18:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.26.4 pre-release
+
+2010-03-03 20:17:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/ja.po:
+ po: update translations
+
+2010-03-03 20:15:44 +0000 Josep Torra Valles <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: avoid g_object_set() on NULL pointers
+ There may not be an overlay element if a text-sink is set.
+ Fixes #611702.
+
+2010-03-01 12:17:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: mark skeleton streams correctly
+ Mark skeleton streams because we need to ignore them for calculating the
+ duration of the stream.
+ Fixes #611227
+
+2010-02-24 01:10:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * po/nl.po:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.26.3 pre-release
+
+2010-02-23 16:57:53 +0100 Götz Waschk <waschk@mandriva.org>
+
+ * tests/examples/overlay/Makefile.am:
+ examples: Dist header file for the Qt graphics view example
+ Fixes bug #610832.
+
+2010-02-23 11:41:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: use the chain begin_time instead of our counter
+ We update the passed begintime argument to narrow our search region in the
+ binary search. This means that it does not always contain the chain begin time
+ after a couple of bisects. Use the real chain->begin_time to bring the
+ granuletime to the time in the chain instead.
+ Fixes #610005
+
+2010-02-19 18:24:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/elements/videorate.c:
+ videorate: tests: New unit tests for upstream caps nego
+ Adds unit tests that check videorate's upstream caps
+ negotiation works properly (put passthrough caps
+ first)
+ Fixes #608025
+
+2010-01-27 15:07:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Improve upstream negotiation
+ Put peer pad caps preferred framerates first, indicating
+ they are videorate's first choices, removing an unnecessary
+ conversion.
+ Fixes #608025
+
+2010-02-21 19:52:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ playbin2, playsink, subtitleoverlay: Set subtitle encoding properly
+ For this add subtitle encoding properties to playsink and subtitleoverlay
+ and update the values in the containing elements.
+ Also update the font description in textoverlay or the used renderer
+ element if it is changed during playback.
+ Fixes bug #610310.
+
+2010-02-22 13:01:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/examples/overlay/qt-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-xoverlay.cpp:
+ examples: also add sink detection and set title to qt examples
+ Also set a title in the qt examples like it is now done in the gtk example.
+ Fix the newly added find_video_sink in the gtk example and add similar function
+ to the qt examples.
+
+2010-02-19 14:40:43 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/overlay/.gitignore:
+ gitignore: ignore files in new example directroy
+
+2010-02-17 14:59:33 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/Makefile.am:
+ make: fix copy and paste error in git rules (audio<->video)
+
+2010-02-19 17:44:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Ghost the video sinkpad if a text sinkpad is available
+ Only don't ghost it if no visualizations are need and if
+ no text is needed and no textchain was created yet.
+ Fixes bug #610379.
+
+2010-02-19 00:22:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.26.2 pre-release
+
+2010-02-19 00:20:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translation files
+
+2010-02-19 00:17:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/.gitignore:
+ Ignore new overlay examples
+
+2010-02-18 23:47:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/overlay/gtk-xoverlay.c:
+ examples: don't hard-code xvimagesink for Gtk+ GstXOverlay example
+ Try to find a working videosink, don't hardcode xvimagesink. Also
+ add some borders to window and give it a title so that it's clear
+ that this is really a Gtk+ window and not a window created by the
+ videosink.
+
+2010-02-18 11:42:55 -0800 David Schleef <ds@schleef.org>
+
+ * gst/tcp/gsttcp.c:
+ tcp(client/server)src: Fix handling of closed sockets
+ The peer closing the socket should cause an EOS, instead of
+ silently doing nothing. This changes the behavior to be
+ more like fdsrc. Fixes: #610386
+
+2010-02-18 12:42:53 +0000 Patrick Radizi <patrick.radizi@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: make sure not to dereference NULL username or password
+ Fixes #610268.
+
+2010-02-17 21:22:54 -0800 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: Fix chroma copying for 4:2:2
+ Fix mixup of height/width, causing only half the chroma lines to
+ be copied when outputting buffers. Fixes: #610329.
+
+2010-02-16 15:43:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ * tests/examples/Makefile.am:
+ * tests/examples/overlay/Makefile.am:
+ * tests/examples/overlay/gtk-xoverlay.c:
+ * tests/examples/overlay/qt-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-xoverlay.cpp:
+ * tests/examples/overlay/qtgv-xoverlay.h:
+ examples: add video overlay examples for gtk, qt and qt graphics view
+ Add simple videotestsrc ! xvimagesink examples using gtk and qt. This patch also
+ adds all boilerplate to configure for using c++. The qt based examples are
+ optional like their gtk counterparts.
+
+2010-02-16 17:20:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/compiling.sgml:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: cleanup library docs
+ Correct name of included files. Remove files that are not used anymore. Add many
+ new api entries to their sections.
+
+2010-02-15 11:11:04 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/test-colorkey.c:
+ test-colorkey: remove the XInitThreads()
+ We don't do this is any other example, this should be done for us in gdk it if
+ would be needed.
+
+2010-02-16 10:09:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: use same message string for missing elements as in playbin
+ Use the same translated message string for missing core elements as
+ playbin uses, which is a bit nicer and also indicates that there is
+ something wrong with the user's GStreamer installation (which arguably
+ is the case if elements like typefind or queue2 are missing).
+
+2010-02-08 13:54:57 +0200 Kaj-Michael Lang <milang@tal.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Handle stm module format
+ Fixes #609314.
+
+2010-02-15 12:10:10 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/vorbis/gstivorbisdec.c:
+ ivorbisdec: set rank to SECONDARY
+
+2010-02-15 12:09:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/gstivorbisdec.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/gstvorbisdeclib.c:
+ * ext/vorbis/gstvorbisdeclib.h:
+ vorbisdec: also support ivorbis tremor decoder
+ ... which only needs a bit of refactoring and extracting to support
+ the minor difference in (i)vorbis interface.
+ Fixes #609063.
+
+2010-02-03 14:37:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisdec.h:
+ vorbisdec: reduce some hard-coding
+ ... such as assuming float all over, and base src caps on template caps.
+
+2010-02-15 10:23:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/playbin.c:
+ playbin: Fix the primary-decoder-missing test with USE_DECODEBIN2
+
+2010-02-15 09:04:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggparse.c:
+ oggparse: Fix another format string compiler warning
+
+2010-02-15 08:56:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Fix format string compiler warnings
+
+2010-02-15 08:48:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Post a missing element message and an error message if no uridecodebin can be found
+
+2010-02-15 08:46:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Post missing element messages if a core plugin is missing
+ And post a warning in cases where we can still continue to work
+ or an error when the missing element is fatal.
+
+2010-02-15 08:28:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/playbin2.c:
+ playbin2: Enable all unit tests
+ They're all working and valgrind clean now.
+
+2010-02-15 08:26:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: First post a missing-plugin message, then emit the unkown-type signal
+ This makes sure that there *always* is a missing plugin message in the bus
+ before any errors or warning messages.
+
+2010-02-15 08:20:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Missing decoder errors should be STREAM CODEC_NOT_FOUND
+ and not CORE MISSING_PLUGIN.
+
+2010-02-15 08:18:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Free the subtitle URI
+
+2010-02-15 08:06:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Post missing plugin messages if a required element can't be created
+ Especially if no suitable URI source can be found.
+
+2010-02-15 06:50:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/.gitignore:
+ tests: Add decodebin2 test to .gitignore
+
+2010-02-15 01:18:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Set ghostpad targets to NULL when freeing a decode chain
+ Otherwise the ghostpad will still be linked to the peer and there
+ will still be a reference kept, leading to nothing being unlinked
+ and destroyed until decodebin2 is finalized.
+ This fixes reuse of decodebin2 if a raw stream is connected to
+ its sinkpad.
+
+2010-02-15 01:17:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/decodebin2.c:
+ decodebin2: Add simple unit test, mainly a copy of the decodebin unit test
+ The only difference between the two unit tests right now is,
+ that the decodebin2 test resets the element to READY before trying
+ to reuse it instead of NULL. decodebin2 guarantees to be reusable
+ without going back to NULL.
+
+2010-02-15 00:11:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: theora PAR of 0:N, N:0 or 0:0 is allowed and maps to 1:1
+ See #609252.
+
+2010-02-14 23:16:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 96dc793 to 44ecce7
+
+2010-02-14 23:10:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ playbin2: Enable playbin2 unit test
+ It now contains a single working unit test and can be enabled.
+ The other more useful unit tests still need fixing.
+
+2010-02-14 22:16:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/playbin.c:
+ playbin: Fix indention in the unit test
+
+2010-02-13 01:08:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ volume: Replace this variables by self
+
+2010-02-12 19:43:13 +0100 Josep Torra Valles <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Reset the sink's state to NULL before unreffing it unless it's the same instance again
+ This makes sure that we don't destroy the last reference before the
+ element gets back to NULL state. Fixes assertion failures if a playbin2
+ instance is reused but different sinks are automatically chosen because
+ of different caps.
+
+2010-02-12 18:00:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: fix Since tag
+
+2010-02-12 14:19:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-read.c:
+ riff: treat JUNQ chunks like JUNK chunks
+
+2010-02-12 14:29:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Update basesrc segment duration and post duration messages from the streaming thread
+
+2010-02-11 14:10:02 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/tags.c:
+ tags: improve docs about determining the encoding
+
+2010-02-11 14:09:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ comment: fix wrong header comment
+
+2010-02-01 13:50:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ riff: add a variant of the JUNK tag that several adobe products produce
+ JUNQ has same semantics as JUNK.
+
+2010-02-01 19:01:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: add min-percent property
+ Emit need-data when the amount of data in the internal queue drops below
+ min-percent.
+ Fixes #608309
+
+2010-02-01 18:56:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: cleanups
+ Avoid some typechecks.
+ Avoid dereferencing appsrc->priv all the time.
+
+2010-02-01 18:55:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ appsink: cleanups
+ Avoid some typecasting.
+ Avoid dereferencing appsink->priv all the time.
+
+2010-02-01 15:09:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: avoid some typecasts
+
+2010-01-29 16:34:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: ignore \n and \r as the first line
+ Be more forgiving for bad servers and ignore \r and \n when we are looking for
+ the response/request line.
+ See #608417
+
+2010-02-10 16:05:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: fail gracefully on bad Content-Length headers
+ Be careful when allocating the amount of bytes specified in the Content-Length
+ because it can be an insanely huge value. Try to allocate the memory but fail
+ gracefully with a nice error when the allocation failed.
+
+2010-02-10 10:12:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add conversions from all ARGB formats to AYUV and back
+
+2010-02-09 17:39:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Update segment duration and post a duration message if the duration changes
+ Fixes bug #609423.
+
+2010-02-11 10:56:17 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/examples/seek/Makefile.am:
+ build: link to libm in examples that use it
+ This fixes build failure in Fedora 13.
+
+2010-02-11 01:11:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * MAINTAINERS:
+ Update MAINTAINERS, add myself
+
+2010-02-11 23:57:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: back to development
+ Slushy freeze remains in effect.
+
+=== release 0.10.26 ===
+
+2010-02-10 20:17:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.26
+
+2010-02-10 20:16:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2010-02-08 11:21:35 +0100 Benjamin M. Schwartz <bens@alum.mit.edu>
+
+ * ext/theora/gsttheoradec.c:
+ theoradec: PARs of 0:x, x:0 and 0:0 are all allowed and map to 1:1
+ Fixes #609252.
+
+2010-01-24 12:31:04 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: use the default granpos functions for kate streams
+ Set timestamps on kate packets. See bug #600929.
+
+2010-02-05 01:18:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.25.3 pre-release
+
+2010-02-04 18:52:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/bg.po:
+ po: update translations
+
+2010-02-04 18:32:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ Revert "playbin2: Only allow to set the URIs in states <= READY or from an about-to-finish signal handler"
+ This reverts commit 7335ce5d3e03c126a417a721571cb6f3af136ecf.
+ Support abusing the uri property to configure the next uri to play
+ outside of the about-to-finish handler for the time being after all.
+ We also shouldn't use thread private structures for this, since it
+ should be possible to block the thread that emitted about-to-finish
+ while the main thread sets the uri property. See #607226.
+
+2010-02-02 10:18:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't leak allocated buffers
+ This can happen if the combined flow return is not OK although the
+ allocation succeeded or if the packet in question is a BOS and we're
+ not going to push headers.
+ Fixes bug #608699.
+
+2010-02-01 11:44:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: clean up decodebin properties
+ When reusing a decodebin2 element, clear the properties we might have changed,
+ to their default values or else we might end up with old configuration.
+ Fixes #608484
+
+2010-01-29 13:56:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: when no uri is set, post an error message
+ When no uri is set, don't just return STATE_CHANGE_FAILURE from the
+ state change function, but actually post an error message.
+
+2010-01-30 15:18:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 15d47a6 to 96dc793
+
+2010-01-28 17:12:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: don't hold object lock when calling peer elements
+ Do not hold the object lock while we call methods on peer elements as this can
+ lead to deadlocks.
+ Fixes #608179
+
+2010-01-27 01:12:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ 0.10.25.2 pre-release
+
+2010-01-27 01:07:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/interfaces-enumtypes.h:
+ * win32/common/pbutils-enumtypes.c:
+ * win32/common/video-enumtypes.c:
+ win32: update generated files for non-autotools win32 builds
+
+2010-01-27 00:56:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translation files
+
+2010-01-27 00:41:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ audiosrc: add gratuitious FIXME for use of generic G_TYPE_POINTER type
+
+2010-01-26 16:47:40 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't skip an element when getting the topology
+ Fixes #608167
+
+2010-01-24 14:41:44 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: sparse streams aren't timed by end time, and their duration isn't implicit
+ Fixes timestamps and durations on Kate subtitle streams.
+ See http://www.xiph.org/ogg/doc/ogg-multiplex.html section 'start-time and
+ end-time positioning' for some more details, and bug #600929.
+
+2010-01-23 20:15:08 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: properly set up the media type for kate streams
+ See #600929.
+
+2010-01-25 18:57:52 +0100 Julien Moutte <julien@fluendo.com>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: relax caps template on sink pads
+ Allow any caps on sink pad templates as we could do passthrough with non raw
+ video caps.
+
+2010-01-25 15:14:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: use right type for the serialno
+ Use a consistent type for the serialno to avoid problems when comparing between
+ signed and unsigned variants.
+ Fixes #607926
+
+2010-01-25 14:00:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: don't push headers twice
+ Don't push the stream headers twice but only in the activation of a chain.
+ Fixes #607929
+
+2010-01-25 13:18:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base
+
+2010-01-25 12:31:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: rename a variable
+ Rename the 'seekable' variable to 'pullmode'. We might be able to seek in push
+ mode too eventually.
+
+2010-01-25 12:22:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ Revert "inputselector: Protect g_object_notify() with the object's mutex"
+ This reverts commit a37426c41c80fd21e5017fea01a786c05bcd9661, it's
+ causing deadlocks with playbin2.
+
+2010-01-24 20:55:26 +0100 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: Protect g_object_notify() with the object's mutex
+ This works around the thread unsafety of g_object_notify()
+ Fixes bug #607513.
+
+2010-01-24 20:46:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add typefinder for ISO MP4 files
+ Fixes bug #607848.
+
+2010-01-24 13:29:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix crash when freeing headers
+ Use _ogg_packet_free() instead of gst_mini_object_unref in one more
+ place now that the header list contains ogg packets and not buffers.
+ file: Stephen_Fry-Happy_Birthday_GNU-nq_600px_425kbit.ogv
+
+2010-01-24 08:57:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Strip trailing \0 for subtitle OGM streams
+ Fixes bug #607870.
+
+2010-01-23 22:09:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Correctly set DELTA_UNIT flag for OGM streams
+
+2010-01-23 22:05:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Don't strip all 0-bytes from the end of OGM packets
+ This fixes broken packets pushed downstream by oggdemux for
+ MPEG4 streams for example.
+
+2010-01-23 22:03:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Extract tags from OGM text streams and don't push them downstream
+
+2010-01-23 14:46:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Store header/queued packets as ogg_packet and use normal peer chaining functions to pass them downstream
+
+2010-01-23 15:25:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: optimise AC-3 typefinder a bit
+ Make AC-3 typefinder use the DataScanCtx stuff so we don't have to
+ do gst_type_find_peek() in the inner loop all the time. Also return
+ when we've suggested AC3 caps, instead of continuing with the loop.
+
+2010-01-23 14:31:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ Revert "typefind: Reduce number of calls to gst_type_find_peek."
+ This reverts commit c661bfaa991c58f1fbd9fbc0dae90b8b2c27f92b.
+ This breaks AC-3 typefinding for all cases where the first frame
+ is at an offset > 0.
+
+2010-01-23 15:35:05 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for Zip Block Motion Video
+
+2010-01-23 15:34:54 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add mapping for Zip Block Motion Video
+
+2010-01-23 15:26:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: YUNV is a fourcc which is also used for YUY2 raw video
+
+2010-01-23 15:13:45 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: vp61 and VP61 are also valid On2 VP6 fourcc
+
+2010-01-23 15:10:45 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add mapping for On2 VP5
+
+2010-01-23 15:04:35 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add mapping for Sigma-Designs MPEG4
+ It's actually a xvid-compatible stream. both xviddec and ffmpeg handle it.
+
+2010-01-23 14:35:28 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for LOCO Lossless codec
+
+2010-01-23 14:35:16 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add mapping for LOCO Lossless codec
+
+2010-01-23 14:08:39 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add support for YV12 / Uncompressed packed YVU 4:2:2
+
+2010-01-23 13:50:26 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for Autodesk Animator codec
+
+2010-01-23 13:50:09 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add mapping for Autodesk Animator Codec
+
+2010-01-23 13:20:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: ...and set caps on queued packet buffers too
+
+2010-01-23 13:19:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Set caps on header buffers
+
+2010-01-22 16:23:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: handle raw sources about-to-finish signals
+ When we are dealing with a source that produces raw audio/video, we don't use a
+ decodebin2 to decode the data and we thus don't have the drained/about-to-finish
+ signal emited. To fix this, we add a padprobe on the source pads and emit the
+ drained signal ourselves. This then makes playbin2 emit the about-to-finish
+ signal for raw sources such as cdda://
+ Fixes #607116
+
+2010-01-22 16:15:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: include stdio.h for sscanf
+
+2010-01-22 01:49:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: add PNM typefinder
+ Add PNM typefinder, so we can remove the one that's in the PNM plugin
+ in -bad (which btw uses different/wrong media types that don't match
+ the ones used by gdkpixbufdec) and people don't make fun of us for
+ loading image decoders when typefinding and playing back audio files.
+
+2010-01-21 19:31:23 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: rename performance category
+ rename the performance category to ffmpegcolorspace_performance
+ as there is already a global GST_CAT_PERFORMANCE in core
+
+2010-01-21 17:32:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: keep track of added pads
+ Keep track of the pads we added and removed.
+ Remove some unused fields.
+ Don't add pads for which we don't have caps.
+
+2010-01-21 17:31:13 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: don't call NULL setup functions
+ If we find a known mapper but it doesn't have a setup function, simply skip it
+ instead of crashing.
+
+2010-01-21 17:30:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggstream: avoid division by 0 on bad annodex streams
+
+2010-01-21 13:47:01 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for y4m container
+
+2010-01-19 14:31:34 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppayload: ptime/maxptime should be unsigned
+ https://bugzilla.gnome.org/show_bug.cgi?id=607403
+
+2010-01-18 21:16:32 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppayload: ptime should be in nanoseconds
+ https://bugzilla.gnome.org/show_bug.cgi?id=607403
+
+2010-01-20 00:53:20 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 14cec89 to 15d47a6
+
+2010-01-19 13:33:06 -0800 David Schleef <ds@schleef.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: rewrite h.264 detection
+ Make detection simpler: check for NALs, check that they make
+ sense, and report how certain we are that it's a raw H.264 stream.
+ Fixes: #583376.
+
+2010-01-18 14:33:30 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppayload: Reject empty caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=607353
+
+2010-01-19 08:39:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: No need to subtract begin time
+ Last stop is already based on the chain start and there is no need
+ to subtract the chain start as it may lead to a negative overflow.
+ This was causing seeking issues when the target chain was not
+ the first one (that has chain start = 0)
+ Fixes #606382
+
+2010-01-19 09:25:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/audio.h:
+ audio: Use rounding scaling functions for GST_CLOCK_TIME_TO_FRAMES and _FRAMES_TO_CLOCK_TIME
+ Fixes bug #607381.
+
+2010-01-18 15:22:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: granulepos is relative to its chain
+ When performing seeks, the granulepos should be offset by
+ its chain start time to avoid using wrong values to
+ update segment's last_stop. A sample file is indicated on
+ bug #606382
+
+2010-01-18 17:57:16 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for MXF container format
+
+2010-01-18 10:07:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: re-use iterator callback to avoid code duplication
+
+2010-01-18 02:08:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: when looking for sink properties, make sure they have the right type
+ We don't want to end up setting values on elements where the property is of
+ a different type than we expect. Can't transform the value either, since we
+ can't really make assumptions about the scale and transform function.
+ Fixes crashes when using playbin2 with apexsink (#606949).
+
+2010-01-18 09:30:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Only allow to set the URIs in states <= READY or from an about-to-finish signal handler
+ Changing the URIs in a state > READY results in unexpected behaviour,
+ i.e. the new URIs are only used after the current track has finished.
+ Fixes bug #607226.
+
+2010-01-15 19:52:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: sprinkle some more locking
+ ... to avoid races and ensure some data structure consistency.
+ See also #574289.
+
+2010-01-14 18:26:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: mind blocked pads when shutting down
+ Fix regression in shutdown deadlock handling now that the
+ target of a ghostpad is blocked instead of ghostpad itself.
+ See also #574293.
+
+2010-01-14 13:36:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Fix disabling of subtitles if subtitles were used before
+ In this case the video still goes through the text chain and
+ subtitles are still going in there, in case subtitles are
+ enabled again. This makes sure that re-enabling subtitles
+ happens instantly.
+ Fixes hanging video when disabling subtitles, caused by an
+ unliked video pad.
+
+2010-01-14 10:43:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: fix pad ref leak
+
+2010-01-12 21:42:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ docs: fix out-of-source build
+
+2009-04-29 11:50:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/icles/stress-playbin.c:
+ stress-playbin: fix error return check
+
+2010-01-14 10:10:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/Makefile.am:
+ * ext/theora/gsttheora.c:
+ * ext/theora/gsttheoradec.c:
+ * ext/theora/gsttheoraenc.c:
+ * ext/theora/gsttheoraparse.c:
+ * ext/theora/theora.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/theora/theoraparse.c:
+ theora: Rename source files to have the same name as the headers
+
+2010-01-14 10:07:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/gstvorbis.c:
+ * ext/vorbis/gstvorbisdec.c:
+ * ext/vorbis/gstvorbisenc.c:
+ * ext/vorbis/gstvorbisparse.c:
+ * ext/vorbis/gstvorbistag.c:
+ * ext/vorbis/vorbis.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * ext/vorbis/vorbisparse.c:
+ * ext/vorbis/vorbistag.c:
+ vorbis: Rename source files to have the same name as the headers
+
+2010-01-14 10:05:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/gstvorbiscommon.c:
+ * ext/vorbis/gstvorbiscommon.h:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ vorbis: Move channel layout definitions into a single separate file
+ ...instead of having two copies.
+
+2010-01-14 08:19:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ vorbis: Add official 6.1 and 7.1 channel mappings
+ These are in the Vorbis spec since 2010-01-13. Fixes bug #606926.
+
+2010-01-13 23:05:45 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ rtsp: Don't define h_error ourselves
+ It's included from netdb.h and that header might define it differently,
+ which can lead to build failures.
+
+2010-01-13 17:36:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: mp4 video is not parsed
+
+2010-01-13 12:49:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Add aac stream-format to caps
+ Also add the aac stream-format field on the caps when
+ detecting it.
+
+2010-01-13 09:39:54 +0100 Brijesh Singh <brijesh.ksingh@gmail.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Fix handling of the native audio/video flags
+ Fixes bug #606687.
+
+2010-01-12 16:35:50 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Fix unitialized variable.
+ If the package isn't handled, gracefully return GST_FLOW_OK.
+
+2010-01-10 23:50:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/xoverlay.c:
+ docs: flesh out GtkXOverlay docs some more and add example for Gtk+ >= 2.18
+ Explain why the whole bus sync handler mess is needed. Add section about
+ how to use GstXOverlay in connection with Gtk+ and mention the Gtk+ API
+ break issue and how to work around it (see #601809).
+
+2010-01-10 21:18:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ docs: minor netbuffer documentation fix
+
+2010-01-10 20:41:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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/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: update translated strings
+ Queue2 moved into core, so remove its strings.
+
+2010-01-08 16:57:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: push headers when activating chains
+ Keep a list of headers for each stream of a chain. When a chain is activated,
+ push the headers before pushing the data so that decoders can sync.
+ Fix seeking in chains, take the chain start time into account when comparing
+ timestamps.
+ See #606382
+
+2010-01-07 15:26:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/lang-tables.c:
+ * gst-libs/gst/tag/lang-tables.dat:
+ * gst-libs/gst/tag/lang.c:
+ tag: fix up disting of lang-tables.c more correctly
+ lang-tables.c is included by lang.c and not really a proper source
+ file that should be compiled into its own object, so rename it to
+ lang-tables.dat and put it into EXTRA_DIST instead to ensure it
+ gets disted.
+
+2010-01-07 13:50:03 +0000 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-plugins-base.spec.in:
+ Add missing source file for tagger to Makefile and update spec file
+
+2010-01-06 18:30:57 -0800 Mark Yen <mook@songbirdnest.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff-media: handle 32 bit raw RGB video.
+
+2010-01-06 13:57:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: decide flac header packet by content rather than count
+
+2010-01-06 13:56:26 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: reset header packet count at bos page
+
+2010-01-06 13:39:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiopayload: add support for buffer-lists
+
+2010-01-06 11:33:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base
+
+2010-01-05 17:17:58 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Ignore zero framerate
+ https://bugzilla.gnome.org/show_bug.cgi?id=606163
+
+2009-12-29 18:45:32 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ basertpaudiopayload: Respect ptime if it is given
+ If the ptime is given in the caps, respect it and force the minimum
+ and maximum sizes to be exactly the requested ptime.
+ https://bugzilla.gnome.org/show_bug.cgi?id=606050
+
+2009-12-29 18:36:29 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ rtpbasepayload: Store ptime from caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=606050
+
+2009-12-02 19:40:58 +0530 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppayload: Accept maxptime from caps
+ https://bugzilla.gnome.org/show_bug.cgi?id=606050
+
+2010-01-05 14:11:06 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: enhance flac packet duration calculation
+
+2010-01-05 10:38:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base
+
+2010-01-04 09:49:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ * tests/icles/test-colorkey.c:
+ examples: use Gtk+-2.18 API conditionally
+ so the seek example and colorkey test work with older Gtk+ versions
+ as well.
+ Fixes #605960.
+
+2009-12-29 00:53:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/test-colorkey.c:
+ tests: fix colorkey test up for Gtk+ >= 2.18
+ Make test-colorkey work with newer versions of Gtk+.
+ See #601809.
+
+2009-12-29 00:40:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ examples: make seek example work with Gtk+ >= 2.18
+ Gtk+ broke API slightly with the introduction of
+ client-side windows in Gtk+ 2.18. Fix up seek
+ example to work with newer Gtk+ versions.
+ Fixes #601809.
+
+2009-12-26 23:29:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/stress-xoverlay.c:
+ tests: fix warning and memory leak in stress-overlay test
+ Not all messages have structures and we need to unref messages
+ when returning GST_BUS_DROP in the sync bus handler.
+
+2009-12-26 18:46:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: correctly eat empty and dummy buffers
+
+2009-12-24 19:56:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: be a lot smarter with buffer management
+ Detect EOS faster.
+ Try to reuse one of the input buffer as the output buffer. This usually works
+ and avoids an allocation and a memcpy.
+ Be smarter with GAP buffers so that they don't get mixed or cleared at all. Also
+ try to use a GAP buffer as the output buffer when all input buffers are GAP
+ buffers.
+
+2009-12-24 16:30:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/Makefile.am:
+ * gst/adder/gstadder.c:
+ * tests/check/elements/adder.c:
+ adder: use collectpads clipping function
+ Install a clipping function in the collectpads and use the audio clipping helper
+ function to perform clipping to the segment boundaries.
+ Fixes #590265
+
+2009-12-24 13:58:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: fix juvenile comment
+
+2009-12-23 21:24:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: fix typo in debug message
+
+2009-12-23 18:18:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: avoid some type checks
+
+2009-12-23 17:08:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: avoid leaking selector request pads
+
+2009-12-23 15:46:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: avoid leaking queue and typefind
+ Don't leak the queue and typefind elements that we might link after the
+ source element.
+
+2009-12-23 15:43:52 +0100 Jonathan Matthew <jonathan@d14n.org>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: don't name the queue
+ There is no reason to name the queue.
+ Fixes #605219
+
+2009-12-23 15:30:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtp.def:
+ defs: update defs with new symbols
+
+2009-12-22 20:15:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ rtcpbuffer: add helper functions for SDES types
+ Add functions to convert SDES names to their types and back. Will be used later
+ to set SDES items using a GstStructure.
+ See #595265
+
+2009-12-21 19:12:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 47cb23a to 14cec89
+
+2009-12-21 18:45:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: add Since marker for the new tolerance property
+
+2009-12-21 07:57:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/lang.c:
+ docs: use 'Returns: xyz' rather than 'Returns xyz' to make gtk-doc happy
+
+2009-12-21 07:50:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ tests: don't use deprecated GLib API g_mapped_file_free
+ Fixes #605100.
+
+2009-12-20 17:34:46 -0800 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theoraenc: Add encoder controls for libtheora 1.1
+ Added drop-frames, cap-overflow, cap-underflow, and rate-buffer.
+
+2009-12-19 21:40:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: increase default drift tolerance to fix glitches with WMA
+ Increase default drift tolerance to 40ms to avoid glitches with decoders
+ or formats where there's a lot of timestamp jitter for some reason or
+ another (in this case: asf/wma), at least until we implement timestamp
+ smoothing.
+
+2009-12-16 11:43:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: add some debugging
+
+2009-12-15 18:41:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiorate/gstaudiorate.h:
+ audiorate: add a tolerance property
+ It may not be uncommon for the input timestamps to experience some jitter
+ around the 'perfect time'. As such, instead of regularly adding and dropping
+ samples, optionally allow for some tolerance in a more relaxed approach.
+ API: GstAudioRate:tolerance
+
+2009-12-15 19:50:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: add documentation
+
+2009-12-15 16:52:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/Makefile.am:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audiorate/gstaudiorate.h:
+ audiorate: use separate header file
+
+2009-12-14 21:17:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: set DISCONT when resyncing (e.g. newsegment)
+
+2009-12-14 18:47:27 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: also fill up segments if possible
+
+2009-12-15 19:29:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: fix segment handling
+ Do not compare a media (buffer) time to a (bogus) running time
+ (or their offset equivalents).
+
+2009-12-15 19:22:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: properly report truncated samples as dropped samples
+
+2009-12-13 18:43:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/lang.c:
+ docs: mention that gst_tag_get_language_name() may return NULL
+
+2009-12-13 18:42:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/tag.c:
+ checks: some more testing for the new language code functions
+
+2009-12-12 18:58:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/mixeroptions.c:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ docs: misc. mixer docs improvements
+
+2009-12-12 18:16:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ docs: add short descriptions for API reference contents page
+
+2009-12-12 17:43:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/lang-tables.c:
+ * gst-libs/gst/tag/mklangtables.c:
+ tag: make internal language names table static
+
+2009-12-12 17:41:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/lang.c:
+ * gst-libs/gst/tag/mklangtables.c:
+ tag: don't use GLib 2.22 API
+ g_mapped_file_unref() was introduced in GLib 2.22, but we depend
+ only on GLib 2.18, so use g_mapped_file_free() when compiling
+ against older GLib versions until we bump the GLib dependency.
+
+2009-12-11 23:59:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ * configure.ac:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/lang-tables.c:
+ * gst-libs/gst/tag/lang.c:
+ * gst-libs/gst/tag/mklangtables.c:
+ * gst-libs/gst/tag/tag.h:
+ * tests/check/libs/tag.c:
+ * win32/common/libgsttag.def:
+ tag: add some utility functions for language codes and tags
+ Add some utility functions for language tags and ISO-639
+ codes. These are useful for both GUIs and elements. The
+ iso-codes package is used for language name translations
+ if available.
+ API: gst_tag_get_language_codes()
+ API: gst_tag_get_language_name()
+ API: gst_tag_get_language_code()
+ API: gst_tag_get_language_code_iso_639_1()
+ API: gst_tag_get_language_code_iso_639_2B()
+ API: gst_tag_get_language_code_iso_639_2T()
+
+2009-12-11 12:02:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: ogm video has constant packet duration
+
+2009-12-10 22:47:53 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: implement old fLaC mapping
+
+2009-12-10 17:53:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gsttcpclientsrc.c:
+ tcpclientsrc: unset flushing state too
+ When unlocking, we set the flushing state on the fdset. Implement unlock_stop so
+ that we can use it to unset the flushing state again.
+ Fixes #577326
+
+2009-12-10 16:09:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: remove redundant fields
+
+2009-12-09 19:03:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: adapt to new oggdemux
+ Remove all granulepos hacks and simply use the timestamps from the new oggdemux
+ like any other decoder.
+
+2009-12-09 19:04:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: fix peer query
+
+2009-12-09 17:24:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: fix query
+
+2009-12-09 16:55:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: small cleanups
+
+2009-12-09 16:38:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: use gst_pad_peer_query()
+
+2009-12-09 12:10:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: fix video when subtitles disabled
+ When we have a source with subtitles but they were disabled with the flags,
+ still ghostpad the video pad instead of leaving it unlinked.
+
+2009-12-09 09:47:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Only flush downstream on seeks for flushing seeks
+
+2009-12-09 09:35:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Proxy buffer allocation on the video sinkpad to the srcpad
+
+2009-12-08 17:30:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: update slider only 25 times a second
+ don't update the slider a 100 times a second, it's likely higher than the screen
+ framerate and just wastes cpu.
+
+2009-12-08 17:23:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c:
+ theora: remove granulepos hacks
+ Remove the granulepos hacking now that oggdemux outputs timestamps like any
+ other demuxer.
+
+2009-12-08 13:40:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Fix stream-changed message list iteration
+ When iterating the list and removing the current element, first
+ get the next element and then remove the current one and not
+ the other way around.
+
+2009-12-07 18:49:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: improve keyframe seeking
+ Improve keyframe seeking.
+ Fix reverse playback.
+
+2009-12-07 15:42:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: implement keyframe seeking
+ Implement keyframe seeking in oggdemux by doing the double seek trick. First
+ seek to the required position, then read pages for all streams to grab the
+ granulepos (to know the timing of the keyframe) of each stream, then seek back
+ to the first keyframe.
+
+2009-12-07 09:13:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Some minor cleanup
+
+2009-12-06 18:05:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Reset stream segments on FLUSH_STOP and don't adjust QoS events for non-time segments
+
+2009-12-04 16:35:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix timestamps after seek
+ After a seek, discard all packets before the packet with the granulepos on it so
+ that the output buffers contain valid timestamps.
+ Reorder some code so that we check the timestamps before allocating and pushing
+ an output buffer.
+ Do more checks on valid packets in ogm mode.
+
+2009-12-04 15:39:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: add comment
+
+2009-12-04 14:01:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: don't do math with invalid granulepos
+ When the current granulepos is unknown and set to -1, don't try to add durations
+ to it.
+
+2009-12-04 13:14:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: guard against wrong granulepos
+ Clamp the initial granulepos to 0 instead of going negative for some badly muxed
+ ogg files.
+
+2009-12-04 12:26:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: don't fail on bogus granulepos
+ Do some additional checks on the granulpos timestamp before using it for
+ calculating the duration because oggdemux generates wrong granulepos now.
+ Fixes seeking somewhat again.
+
+2009-12-03 20:05:29 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: reimplement OGM support
+ OGM demuxing no longer requires helper elements. It's done internally
+ in oggdemux. Vorbis comments are still not handled because I don't
+ have anything to test with.
+
+2009-12-03 17:02:11 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggstream.c:
+ oggdemux: fix for I-frame-only theora
+
+2009-12-03 01:16:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: log when ogg mapper doesn't accept the setup header packet
+
+2009-12-02 02:08:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: extract width, height and PAR from theora header and add to caps
+
+2009-12-03 23:43:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggstream.c:
+ ogg: extract number of channels from FLAC, speex and vorbis headers
+ Because we can.
+
+2009-12-03 22:14:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaybin2.c:
+ build: fix build with debug logging disabled.
+
+2009-12-03 21:07:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: more print fixes
+ gstoggstream.c:419: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘gint64’
+ gstoggdemux.c:2253: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘GstClockTime’
+ gstoggdemux.c:2333: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘GstClockTime’
+
+2009-12-03 16:57:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.c:
+ ogg: Fixing some printf format strings
+ Fixes some printf format strings to make it build on mac.
+
+2009-12-03 18:08:49 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstfactorylists.c:
+ * gst/playback/gstfactorylists.h:
+ * gst/playback/gstplaybin2.c:
+ playbin2: don't iterate the factory lists in non-debug mode
+ When debugging is disabled, we won't see anything printed anyway.
+
+2009-12-02 23:55:55 -0800 David Schleef <ds@schleef.org>
+
+ * gst/videoscale/vs_4tap.c:
+ Build fix for MSVC
+
+2009-12-02 23:27:55 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/subparse/qttextparse.c:
+ build: add missing includes for sprintf and atoi
+
+2009-12-01 16:42:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/qttextparse.c:
+ subparse: Add support for some tags of qttext
+ Currently supporting timescale, timestamps, font, size,
+ textColor, backColor, plain, bold and italic
+ Fixes #603357
+
+2009-12-01 13:13:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ * gst/subparse/qttextparse.c:
+ * gst/subparse/qttextparse.h:
+ subparse: add qttext support
+ Adds basic support for qttext subtitles, still lacks markup tags
+ to make it prettier, but the plain text already works.
+ Implemented according to:
+ http://www.apple.com/quicktime/tutorials/texttracks.html
+ http://www.apple.com/quicktime/tutorials/textdescriptors.html
+ Fixes #603357
+
+2009-12-01 13:22:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: conditionally cleanup sami context
+ Only cleanup sami context if we are parsing sami subtitles,
+ otherwise we might have crashes.
+
+2009-12-01 13:19:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Add missing caps to sink caps template
+ Some caps were missing from the sink caps template when
+ xml was disabled
+
+2009-12-01 15:06:10 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 87bf428 to 47cb23a
+
+2009-12-01 14:14:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From da4c75c to 87bf428
+
+2009-11-30 10:22:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Fix some pad refcount issues
+ Fixes bug #603345.
+
+2009-11-27 18:54:57 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 53a2485 to da4c75c
+
+2009-11-25 17:04:41 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: handle theora streams with 0 keyoffset
+
+2009-11-25 16:53:26 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Handle unknown streams
+
+2009-11-26 14:30:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ Revert "textoverlay: First draw outline text and then the real text"
+ This reverts commit 60aa09d28c1f9fd29b56876d7ac6c0366d6cef4d.
+ First drawing the real text and then the outline produces ugly
+ text in lower resolutions. The outline line width needs to be somehow
+ changed relative to the resolution. Fixes bug #602924.
+
+2009-11-26 10:30:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ audiofilter: Use G_DEFINE_ABSTRACT_TYPE_WITH_CODE
+ ...and fix code style a bit.
+
+2009-11-26 10:31:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ audiofilter: Add _CAST variants of the cast macros
+
+2009-11-25 10:26:16 -0600 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: add adjustement when slaving
+ Our calibration against the pipeline clock is done with the adjusted
+ ringbuffer time, so take the adjustement into account. Fixes some audio dropouts
+ when reusing audio sinks after switching clocks and slaving methods in a
+ pipeline.
+
+2009-11-25 16:17:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Prefer transforming alpha formats to alpha formats and the other way around
+ Fixes bug #602834 and #350748.
+
+2009-11-25 00:46:55 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Reset last_granule during seeking
+ Fix case where we would reconstruct the wrong granulepos for
+ outgoing streams immediately after a seek.
+
+2009-11-24 22:08:09 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ oggdemux: Fix timestamp generation for theora
+ Timestamp generation was broken by the last commit for formats
+ with a non-zero granule shift. Also keep track of the last keyframe
+ so that we can regenerate granulepos for theora.
+
+2009-11-24 21:22:03 -0800 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ * ext/ogg/vorbis_parse.c:
+ oggdemux: Fix vorbis parsing
+ Add a granule to granulepos conversion function. Fix the duration
+ function for vorbis. Handle timestamps on header packets differently
+ and be more careful about calculating OFFSET and OFFSET_END. After
+ this change, timestamps for vorbis don't exactly match up with the
+ timestamps that vorbisparse outputs, but it's unclear if vorbisparse
+ is actually correct and it would add a lot more code to make oggdemux
+ match vorbisparse. Fixes #602790.
+
+2009-11-19 19:28:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Transform QoS events to be meaningful for upstream elements
+ This is necessary because the sinks don't notice the group switches
+ and the decoders/demuxers have a different running time than the
+ sinks.
+ Fixes bug #537050.
+
+2009-11-21 22:05:34 +0100 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ ogg: Fix generation of timestamps and durations
+ After changing some internal functions, I forgot to update
+ the code that puts the values on the buffers.
+
+2009-08-29 10:51:48 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/Makefile.am:
+ * ext/ogg/dirac_parse.c:
+ * ext/ogg/dirac_parse.h:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstoggstream.c:
+ * ext/ogg/gstoggstream.h:
+ * ext/ogg/vorbis_parse.c:
+ ogg: Add ogg stream parsing
+ Adds code that parses headers of various formats encapsulated in
+ Ogg in order to calculate timestamps and durations of each buffer.
+ Removes the creation of helper decoder elements to do this calculation
+ via conversion queries.
+ Fixes: #344013, #568014.
+
+2009-09-04 00:11:38 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: don't overwrite object properties
+
+2009-11-21 17:54:49 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/theora/theoradec.c:
+ debug: also cast packet.packetno to gint64 in debug log
+ We do this already for granulepos to handle ogg_int64_t mismatches.
+
+2009-11-21 17:47:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ debug: fix format string that was missing a var
+
+2009-10-10 00:32:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ * tests/check/elements/adder.c:
+ adder: make events succeed, if they succed on atleast one pad
+
+2009-11-19 14:51:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: error when all streams have no buffers
+ In some cases (all buffers dropped by a parser) a decodebin2
+ chain might receive an EOS before it gets enough data to
+ expose a decoded pad. In the case that no streams can expose
+ a pad we should error out instead of hang.
+ Fixes #542758
+
+2009-11-19 12:23:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Fix stupid bug introduced in last commit
+
+2009-11-19 12:10:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Aggregate the stream-changed message by looking at the seqnum
+ Just counting how many messages were sent and how many were received
+ is not good enough because they might've been duplicated (e.g. by the
+ visualization audio tee). Comparing the sequence numbers should give
+ better results in that case.
+
+2009-11-19 10:05:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Ignore async state changes of the uridecodebins
+ Otherwise the async state change from READY->PAUSED of the
+ uridecodebins will take playbin2 from PLAYING->PAUSED again
+ during gapless group switches.
+ Fixes bug #602000.
+
+2009-11-19 10:30:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 0702fe1 to 53a2485
+
+2009-11-18 14:50:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: set to buffer less on no-more-pads
+ When a decodebin2 receives no-more-pads of a group it
+ can set that group's multiqueue buffering thresholds to
+ 'playing' buffering method, avoiding that it buffers
+ too long and cause problems when using with queue2.
+ See the associated bug for details.
+ Fixes #600787
+
+2009-11-18 17:09:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: fix initial calibration
+ When we are calibrating the internal clock against the external clock take into
+ account the time offset applied to our internal clock because we will subtract
+ that in the render_function again.
+
+2009-11-18 09:22:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't handle DURATION queries during group switches
+ During a group switch return the cached duration of the old group
+ because the old group still didn't finish playback. If we have no
+ cached duration return FALSE.
+ Fixes bug #585969.
+
+2009-11-15 19:36:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Post a stream-changed message after activating a group
+ This is useful to detect when playbin2 has really switched to the next
+ group after about-to-finish for example.
+ Fixes bug #584987.
+
+2009-11-18 12:27:19 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstvideo.def:
+ win32: Add new still-frame API to the defs
+ Add gst_video_event_new_still_frame() and
+ gst_video_event_parse_still_frame() functions to the win32 defs files
+
+2009-11-18 12:37:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: fix 'uninitialized' compiler warning
+
+2009-11-18 10:14:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump core requirement to 0.10.25.1
+ We depend on new API that's only in git so far.
+
+2009-11-15 17:34:37 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ * tests/check/libs/video.c:
+ video: Add functions to create/parse still frame events.
+ Add a new video event to mark the start or end of a still-frame
+ sequence, and a parser function to identify and extract info from
+ such events.
+ API: gst_video_event_new_still_frame()
+ API: gst_video_event_parse_still_frame()
+ Fixes: #601942
+
+2009-11-17 16:39:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: make sure we always go to PAUSED async
+ Set the need_async_start flag before going to PAUSED so that we always post the
+ ASYNC_START message, even after reusing playsink.
+
+2009-11-17 16:37:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: make sure we remain a sink
+ When we remove our elements, we could lose our sink flag. Make sure we remain a
+ sink by setting the flag again after removing elements.
+
+2009-11-16 22:47:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: remove unused array
+
+2009-11-16 09:57:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Use new double->fraction transformation function from core
+
+2009-11-14 14:05:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Make subtitle error handling more robust and ignore late errors too
+ Make sure, to only "simulate" subtitle no-more-pads if it was still
+ pending and also handle errors in the subtitle pipeline as warnings
+ after the subtitles prerolled.
+ Don't set the suburidecodebin to READY after errors, handle_message
+ will usually be called from the streaming thread and doing that
+ from there is obviously not a good idea.
+
+2009-11-14 13:21:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Handle errors from subtitle elements as warning and go into passthrough mode
+
+2009-11-13 12:47:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't leak the GError and debug string when parsing error messages
+
+2009-11-13 11:16:44 +0100 Sreerenj B <bsreerenj@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: avoid crashing on SIGPIPE
+ Use send() instead of write() so that we can pass the MSG_NOSIGNAL flags to
+ avoid crashing with SIGPIPE when the remote end is not listening to us anymore.
+ Fixes #601772
+
+2009-11-11 17:35:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Improve subtitle passthrough in uridecodebin
+ Now the caps property isn't set anymore for the subtitle caps
+ but instead in the autoplug-continue signal it is detected
+ if the caps belong to a supported subtitle stream.
+ This makes automatic use of newly installed plugins.
+
+2009-11-11 17:08:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Only recreate factory caps if necessary and cache them
+
+2009-11-10 18:27:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Only update the factory list when the registry has changed
+ Also don't free the list every time we go to NULL.
+
+2009-11-08 15:04:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ subtitleoverlay: Use gst_pad_get_caps_reffed()
+
+2009-11-07 21:38:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ playbin2/playsink: Use new "silent" property instead of unlinking
+ This makes sure that subtitleoverlay still gets segment updates and
+ everything to pass on downstream. Without this segment problems happen.
+
+2009-11-07 21:10:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Update segments after pushing the events downstream
+ This makes sure that we don't apply segments twice downstream. Also
+ always send our newsegment events downstream.
+
+2009-11-07 21:09:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Add silent property to disable subtitles
+ This tries to disable subtitles in the overlay or renderer
+ and if that's not possible it goes into passthrough mode.
+
+2009-11-07 11:46:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Set the video framerate on parsers if possible
+ Fixes bug #599649.
+
+2009-11-07 11:31:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ subparse: Make fps a GstFraction typed property and use it properly
+
+2009-11-07 11:08:19 +0100 Iago Toral <itoral@igalia.com>
+
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ subparse: Add property for the video framerate
+
+2009-11-06 12:51:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Handle external subtitles better
+ First of all, make sure that suburidecodebin never
+ errors out because of not-linked in case external subtitles
+ are used but then subtitles are disabled.
+ And then make sure that external subtitles always start from
+ the correct position and are not racing until EOS if they
+ get unselected and selected again.
+
+2009-11-04 17:29:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Flush the subtitles before switching to a new subtitle stream
+ This makes sure that all currently shown subtitles disappear
+ and new ones can be shown as soon as possible.
+
+2009-11-03 12:47:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Set subtitle caps as raw caps for the uridecodebins
+ This will make sure that no subparse is ever plugged and subtitleoverlay,
+ that subpicture streams are handled the same was as subtitles and that
+ subtitle renderers are used if available.
+ Fixes bugs #595123, #570753, #591662, #591706.
+
+2009-11-03 12:33:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2/playsink: Remove everything related to subpicture streams
+ These will soon be handled the same way as subtitle streams.
+
+2009-11-02 15:50:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Add a queue before subtitleoverlay
+ This will improve playback, and the same thing is done
+ for subpicture streams too.
+
+2009-11-02 15:05:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Use subtitleoverlay for subtitles
+
+2009-11-02 07:43:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ subtitleoverlay: Add to the docs
+
+2009-10-13 16:48:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplayback.c:
+ * gst/playback/gstsubtitleoverlay.c:
+ * gst/playback/gstsubtitleoverlay.h:
+ subtitleoverlay: Add new element for generic subtitle overlaying
+ This autopluggs the required elements for parsing and rendering
+ different subtitle formats on a video stream.
+ Fixes bug #600370.
+
+2009-11-11 19:32:01 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: Keep timestamp from incoming buffer if it is valid
+ Fixes bug #601627.
+
+2009-11-11 14:00:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: Update factories list on every access if the registry has changed
+ This makes application's simpler because the element doesn't need to
+ go to NULL first to make use of newly installed plugins.
+ Fixes bug #601480.
+
+2009-11-10 18:13:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playback: When going from NULL->READY check if the registry has new features
+ This makes it possible to use newly installed plugins after going back
+ to NULL instead of requiring a new instance.
+ Fixes bug #599266.
+
+2009-11-10 13:55:26 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Clear the EOS state on a seek.
+ Allow seeking back into the stream after it hits EOS.
+
+2009-11-10 12:21:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/README:
+ * gst/audioresample/arch.h:
+ * gst/audioresample/fixed_arm4.h:
+ * gst/audioresample/fixed_arm5e.h:
+ * gst/audioresample/fixed_bfin.h:
+ * gst/audioresample/fixed_debug.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/resample_sse.h:
+ * gst/audioresample/speex_resampler.h:
+ audioresample: Update speex resampler to latest GIT
+
+2009-11-10 00:48:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: assign chain->mute before using it
+ Fixes GObject warnings when starting totem.
+
+2009-10-28 22:10:33 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/theoradec.c:
+ theora: Fix alignment of frames when converting
+ Fix logic inversion in calculating the offset in the theora
+ frame when copying to a GStreamer frame.
+
+2009-11-09 19:58:20 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstfactorylists.c:
+ playback: Fix the order in strcmp that I broke in previous commit.
+
+2009-11-09 19:16:21 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Reduce number of calls to gst_type_find_peek.
+ Shaves off a couple percents off typefinding
+
+2009-11-09 17:49:51 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstfactorylists.c:
+ playback: Avoid expensive API calls in tight loop.
+ We know we're dealing with GstPluginFeature.
+
+2009-11-09 18:11:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/cddabasesrc.c:
+ cddabasesrc: Add unit test for property settings
+ Also includes a regression test for bug #601104.
+
+2009-11-09 18:04:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ cddabasesrc: Never return a negative track number in get_uri()
+
+2009-11-09 18:03:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ cddabasesrc: Don't set the track to 1 every time a device is set
+ Fixes bug #601104.
+
+2009-11-08 11:27:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: Remove useless variables and fix a uninitialized variable compiler warnings
+
+2009-11-06 17:01:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Add property to disable/enable posting of stream-topology messages
+ Most people don't need this messages and generating them is quite
+ expensive.
+
+2009-11-06 15:12:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Protect subtitle elements and subtitle encoding by a new mutex
+ Using the object lock here can and will lead to deadlocks because
+ of deep-notifies of property changes: the deep-notify handler will
+ get the parent of objects, which will take the object lock again.
+ Fixes bug #600479.
+
+2009-11-06 13:13:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: Make sure that running_time->timestamp calculation never becomes negative
+
+2009-11-06 13:25:05 +0200 Mart Raudsepp <leio@gentoo.org>
+
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ examples: Correct casting of g_signal* funcs first arguments
+ This completes the deprecated GTK API fix in commits 81a0a986 and
+ 79adfa54 - unlike gtk_signal_connect and co, g_signal_connect and
+ co take a gpointer, not a GtkObject.
+
+2009-11-06 12:25:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Improve all-raw-caps detection for pads
+
+2009-11-06 12:19:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ basesrc: fix startup position in the ringbuffer
+ When we start and we need to produce the first sample, go to the next sample
+ that will be written into the ringbuffer instead of trying to go to sample 0.
+ We relied on rather small ringbuffer sizes to correctly go to the current
+ sample, which breaks whith large buffers.
+ Fixes #600945
+
+2009-11-06 11:26:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: Use the start time (i.e. timestamp) as the last stop
+ Using the end time makes it impossible to replace buffers, which is
+ a big problem for subtitles that could have very long durations.
+
+2009-11-06 12:08:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Synchronize video/text based on the running time
+ Instead of simply using the buffer timestamps.
+
+2009-11-06 09:30:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Clip text buffers to the text segment and reset segments properly
+
+2009-11-06 09:01:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: Put the video segment into the instance struct instead of allocating it separately
+
+2009-11-06 09:05:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Check if text timestamp/duration is valid before clipping
+
+2009-11-05 23:33:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: printf format fix
+
+2009-11-05 15:42:09 +0100 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/gdp/gstgdpdepay.c:
+ gdpdepay: Clear adapter on flush and state change
+ Fixes #600469
+
+2009-11-05 13:12:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: use _get_caps_reffed()
+
+2009-11-05 13:00:27 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ pad: rename new api from _refed to _reffed.
+ Due to popular demand rename the new api as we still can.
+
+2009-11-04 18:57:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playbin2: avoid copying caps
+ Use get_caps_refed() when we can.
+
+2009-11-04 18:31:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: use new getcaps function to avoid copies
+ Use the gst_pad_get_caps_refed() to avoid some caps copy functions.
+
+2009-11-04 17:50:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: use faster element_link_pads
+ Use the faster gst_element_link_pads because we know for sure the sinkpad name
+ and we don't need to have the function search for a suitable pad anymore.
+
+2009-11-04 16:16:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: make drift tolerance configurable
+ Add drift-tolerance property (defaulting to 20ms) to handle resync after clock
+ drift or timestamp drift instead of relying on the latency-time value for clock
+ drift and 500ms for timestamp drift.
+ Remove warning about discont timestamp and simply resync. The warning is in some
+ cases not correct and is triggered more frequently now that we lower the
+ tolerance value.
+
+2009-11-04 10:52:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Return NOT_LINKED for unselected text pads from a demuxer
+ We want to return NOT_LINKED for unselected pads but only for pads
+ from the normal uridecodebin. This makes sure that subtitle streams
+ are not raced past audio/video from decodebin2's multiqueue.
+ For pads from suburidecodebin OK should always be returned, otherwise
+ it will most likely stop with an error.
+
+2009-11-04 08:20:59 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: also add inline to the proto to fix the build
+ Merged from gst-plugins-bad, e1e9be6dbe1bd0df0543f2a72dcf9cc6d644dd78.
+
+2009-11-03 12:01:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Initialize caps property with the default raw caps
+
+2009-11-03 11:48:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstrawcaps.h:
+ decodebin2: Use static caps for the default raw caps and put them into a separate header
+ This way we can use the same default raw caps everywhere.
+
+2009-11-03 08:26:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: First draw outline text and then the real text
+ Improves the output a bit because no parts of the outline are
+ overwritten again.
+
+2009-10-31 14:02:40 +0100 Josep Torra Valles <n770galaxy@gmail.com>
+
+ * gst/playback/gstplaybin.c:
+ playbin: Make sure to keep a reference on the volume element
+ Fixes null pointer dereferences under certain circumstances.
+ Fixes bug #595401.
+
+2009-10-31 09:47:54 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * po/POTFILES.in:
+ po: queue2 has moved to core
+
+2009-10-30 09:24:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Reset {mute,volume}-changed flags after setting the volume
+ These flags are there to make sure that the volume is set, if there
+ is no volume element yet.
+
+2009-10-30 09:24:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: If notify::{volume,mute} is triggered by the volume element, update our internal state
+
+2009-10-29 14:30:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Proxy notify::volume and notify::mute from the volume/mute elements (or sinks)
+ Fixes bug #600027.
+
+2009-10-29 14:19:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Proxy notify::volume and notify::mute from the playsink to playbin2
+
+2009-10-29 11:37:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/plugins/inspect/plugin-queue2.xml:
+ queue2: Remove inspect file
+
+2009-10-29 11:29:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstqueue2.c:
+ queue2: Remove from gst-plugins-base
+ This is now in coreplugins.
+
+2009-10-28 11:29:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ docs: include more indexes
+
+2009-10-28 11:13:20 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ docs: turn entities into xi:includes
+ This is faster to process and easier to maintain. Its also less 80s.
+
+2009-10-28 10:17:43 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: dump packets which we reject
+
+2009-10-28 01:01:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/.gitignore:
+ .gitignore: ignore basetime unit test binary
+
+2009-10-28 00:59:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst/adder/gstadder.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstqueue2.c:
+ * gst/playback/gststreaminfo.c:
+ * gst/playback/gststreamselector.c:
+ * gst/subparse/gstssaparse.c:
+ Remove GST_DEBUG_FUNCPTR where they're pointless
+ There's not much point in using GST_DEBUG_FUNCPTR with GObject
+ virtual functions such as get_property, set_propery, finalize and
+ dispose, since they'll never be used by anyone anyway. Saves a
+ few bytes and possibly a sixteenth of a polar bear.
+
+2009-10-27 15:23:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ queue2: add custom acceptcaps function
+
+2009-10-27 15:22:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: implement low/high watermark property
+
+2009-10-23 14:56:11 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: add checkbox to enable buffering
+
+2009-10-23 14:54:47 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: don't use 2 buffering elements
+ Only use the multiqueue buffering when we don't have a stream (and thus are
+ using queue2 to do the buffering already).
+
+2009-10-23 14:34:42 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplay-enum.c:
+ * gst/playback/gstplay-enum.h:
+ * gst/playback/gstplaybin2.c:
+ playbin2: add flag to enable decodebin buffering
+ Add a flag that enables buffering in decodebin.
+
+2009-10-23 14:32:29 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: buffering is implemented now
+
+2009-10-23 14:30:52 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: buffering is implemented now
+
+2009-10-23 14:09:17 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: configure use-buffering on multiqueue
+
+2009-10-23 13:58:25 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: use 0 for max buffer size
+
+2009-10-23 13:53:21 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: set some reasonable defaults
+
+2009-10-23 13:44:12 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: set buffering properties on decodebin2
+ Propagate the buffering properties on decodebin2 but only if we are not already
+ doing download buffering.
+
+2009-10-23 11:52:09 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add use-buffering property
+ Add a use-buffering property that will perform buffering on the parsed or
+ demuxed media.
+
+2009-10-23 11:31:47 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: refactor queue size configuration.
+ Refactor the queue size configuration into a new method.
+ Use the same queue values for buffering as for preroll.
+
+2009-10-23 11:08:50 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: move error path down
+
+2009-10-23 11:02:40 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: implement max queue size properties
+
+2009-10-23 10:42:23 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: add properties for buffering
+ Add properties that can be used to configure the multiqueue buffers and
+ buffering methods
+
+2009-10-24 13:19:08 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/examples/app/Makefile.am:
+ * tests/examples/seek/Makefile.am:
+ * tests/examples/v4l/Makefile.am:
+ examples: fix linking order.
+ the uninstalled wrapper would create a LD_LIBRARY_PATH with system-wide
+ path before the local ones... resulting in the example applications picking
+ up the system-wide libraries and not the (potentially modified) uninstalled
+ libraries
+
+2009-10-24 13:08:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't destroy the suburidecodebin on errors
+ It can still be reused
+
+2009-10-24 13:07:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: If setting the state of the suburidecodebin fails just warn, don't error out
+
+2009-10-24 12:12:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't set uridecodebin states to NULL before reusing them
+ This makes sure that the internal decodebin2 and everything else can
+ be reused without reinstantiation.
+
+2009-10-18 17:28:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Store unused decodebin2 instances for further usage.
+ This allows faster re-use of uridecodebin.
+ https://bugzilla.gnome.org/show_bug.cgi?id=599471
+
+2009-10-23 17:49:15 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c:
+ theora: Convert theoraparse to libtheora 1.0 API
+
+2009-10-21 12:38:59 +0300 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ rtpaudiopayload: Only sent exact multiple of the frame size
+ Also align the maximum size with the frame size, not only the minimum
+
+2009-10-22 09:12:03 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: move debug calculation into debug macro
+ Remove in_duration and move its calculation to
+ GST_LOG_OBJECT macro. This way it will only be calculated
+ if we have debug enabled.
+
+2009-10-22 09:06:02 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: Removing unused variable
+ The in_stop variable was never read. Removing it.
+
+2009-10-22 08:40:01 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: be more accurate on offset math
+ Replace gst_util_uint64_scale_int for its rounding version
+ to improve accuracy and avoid inserting samples where
+ they aren't needed.
+ Fixes #499181
+
+2009-10-22 10:17:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Optimize a bit more
+ ...and add a FIXME for bug #598695 and explain
+ what we should do once Pango supports user fonts.
+
+2009-10-22 10:02:11 +0200 Iago Toral <itoral@igalia.com>
+
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ * tests/check/elements/subparse.c:
+ subparse: Add support for DKS subtitle format
+ Fixes bug #598936.
+
+2009-10-22 09:31:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Do shading as first operation
+
+2009-10-22 09:08:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Only use a single cairo surface for drawing
+ ... and comment/optimize what is going on here a bit better.
+
+2009-10-21 16:24:29 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: set output caps before pushing
+ Set the output caps on the srcpad before pushing the buffer because else core
+ will do a rather expensive check to see if we can actually accept those caps on
+ the srcpad.
+
+2009-10-21 15:58:11 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ inputselector: install an acceptcaps function
+ Install a custom acceptcaps function instead of using the default expensive
+ check. We accept whatever downstream accepts so we pass along the acceptcaps
+ call to the downstream peer.
+
+2009-10-21 20:35:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: fix typo in previous mxf typefinder change
+
+2009-10-21 20:44:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: speed up mxf_type_find over 300 times for worst case scenarios
+ * memcmp is expensive and was being abused, reduce calling it by checking
+ the first byte.
+ * iterating one byte at at time over 64 kbites introduces a certain overhead,
+ therefore we now do it in chunks of 1024 bytes
+ And I do mean over 300 times. The average instruction call per mxf_type_find
+ was previously 785685 and it's now down to 2458 :)
+
+2009-10-20 17:13:39 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstfactorylists.c:
+ decodebin2: avoid type checks
+
+2009-10-20 09:00:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ gst/decodebin2: Ensure we get fixed caps for topology message
+ There are some corner cases (like with dvdemux amongst others) where
+ the caps won't be negotiated, but the pad has fixed caps.
+
+2009-10-20 08:52:36 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ gst/decodebin2: Don't expose chains if we're shutting down.
+ This avoids adding flushing pads to ourself
+
+2009-10-17 21:16:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * ext/pango/gsttextoverlay.c:
+ pango: bump pango requirement to stable version and remove ifdefs
+ Bump pango requirement from an ancient development version to an
+ ancient stable version.
+
+2009-10-17 21:11:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/.gitignore:
+ .gitignore: update after files got renamed
+
+2009-10-16 10:54:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppayload: small comment fix
+
+2009-10-16 10:50:35 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtp: Correct timestamping of buffers when buffer_lists are used
+ The timestamping of buffers when buffer_lists are used failed if
+ a buffer did not have both a timestamp and an offset.
+
+2009-10-16 10:56:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtsp-marshal.list:
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ * gst-libs/gst/rtsp/rtsp-marshal.list:
+ * gst-libs/gst/video/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/tcp/Makefile.am:
+ build: fix previous commit to fully accomodate the glib-gen.mak changes
+ I also renamed glib_enum_prefix to glib_gen_prefix as we also use that for the
+ marshallers. Also rename the rtsp-marshal.list to work with the unified prefix.
+
+2009-10-16 10:18:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/tcp/Makefile.am:
+ build: use gst-glib-gen.mak to fix the glib build rules. Fixes #598114
+ The build rules in glib-gen.mak were using pattern rules in a non save way.
+
+2009-10-16 10:14:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 85d1530 to 0702fe1
+
+2009-09-10 11:39:18 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoradec.c:
+ theora: Make theoradec use gstvideo for image conversion
+ Vastly simplifies code.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-10 09:36:31 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoradec.c:
+ theora: Don't always round to even width/height
+ Previously, the code always rounded to even sizes. Now it only ensures
+ that pic_x and pic_y are multiples of 2 if the output format requires
+ it.
+ Also inlcudes fixes to take pic_x/y into account properly when copying
+ the buffer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-10 00:00:44 +0200 Benjamin Otte <otte@gnome.org>
+
+ * configure.ac:
+ theora: Don't check for theora.pc anymore
+ THe new APIs from theoradec and theoraenc are used now.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-07-31 14:59:03 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c:
+ theora: Convert theoradec to libtheora 1.0 API
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 23:44:36 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/Makefile.am:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Port encoder to new Theora API
+ Includes ripping out the old buffer copy code to fill up to frame size.
+ This is not necesary with the new encoder.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 21:59:31 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Disable sharpness property
+ It's ignored by libtheora
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 21:57:08 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Disable noise-sensitivity property
+ It is ignored by libtheora
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 21:50:57 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Disable keyframe-mindistance property
+ It's ignored by the current Theora library
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 21:48:08 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Disable keyframe_threshold property
+ It's ignored by the current theora encoder
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-09 20:26:47 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Get rid of "quick" property
+ The proeprty is not used by libtheora at all
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-08 15:12:23 +0200 Benjamin Otte <otte@gnome.org>
+
+ * configure.ac:
+ * ext/theora/theoraenc.c:
+ theora: remove support for outdated granulepos hack
+ This is in preparation to switching to switching to the new Theora API
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-08 13:23:04 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Ignore border property
+ Always make the video use black as padding color.
+ The output will be identical to previous versions.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-09-08 13:18:26 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theora: Ignore the center property, always set video to top left
+ This is not a necessary property, the output will be identical no matter
+ what.
+ https://bugzilla.gnome.org/show_bug.cgi?id=594729
+
+2009-10-15 16:34:28 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * 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-10-15 13:13:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Post a element message on the bus with the stream topology
+ Fixes bug #598533.
+
+2009-10-15 13:01:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Store the "endcaps" of a chain
+ This are the caps that either resulted in a deadend if
+ no plugin for them could be found or raw caps.
+
+2009-10-15 11:38:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Store for every chain, which pad resulted in its creation
+
+2009-10-15 10:28:39 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/pipelines/basetime.c:
+ check: Don't fail the basetime test when no audiosrc is available
+ On OS/X the DEFAULT_AUDIOSRC is not going to be available, because
+ it isn't in gst-plugins-base. Just defer the test, instead of
+ failing it.
+
+2009-10-14 10:41:03 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From a3e3ce4 to 85d1530
+
+2009-10-14 08:36:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Use gst_object_has_ancestor() instead of our own implementation of it
+
+2009-10-13 19:14:41 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: fix timestamp comparission, Fixes #597407
+
+2009-10-13 13:52:02 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com>
+
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/basetime.c:
+ tests: new test for baseaudiosrc base_time comparison
+ This test reveals a bug in comparison operation between timestamp and
+ GstElement's base_time in GstBaseAudioSrc.
+
+2009-10-08 19:55:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Don't stop completely on initialization errors from subtitle elements
+ Instead disable the subtitles and play the other parts of the stream.
+ Fixes bug #587704.
+
+2009-10-13 16:50:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Ignore no-more-pads from non-demuxer elements
+ instead of printing an error that no corresponding group could
+ be found. no-more-pads from non-demuxer elements doesn't give
+ any additional information because there can only be a single srcpad.
+ Fixes bug #598288.
+
+2009-10-12 21:30:15 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioconvert/gstaudioconvert.c:
+ audioconvert: track active conversion in perf log
+
+2009-10-12 15:48:46 +0200 Patrick Radizi <patrick.radizi at axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: handle socket errors
+ gstrtspconnection.c:gst_rtsp_connection_receive() can hang when an error occured
+ on a socekt. Fix this problem by checking for error on 'other' socket after poll
+ return.
+ Fixes #596159
+
+2009-10-06 14:08:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ audioclock: whitespace fixes
+
+2009-10-06 14:07:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: avoid confusing error
+
+2009-10-09 22:00:45 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ vorbis: fixes warings in macosx snow leopard
+
+2009-10-09 18:52:12 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraparse.c:
+ theora: fixes warnings on macosx snow leopard
+
+2009-10-09 16:56:29 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ ogg: fixes warnings on macosx snow leopard
+
+2009-10-09 16:19:17 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix a warning in macosx
+
+2009-10-08 14:16:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/tag/tags.c:
+ tag: use BOM to recognize UTF-16/32 encoding and convert accordingly
+
+2009-10-09 15:11:16 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst-plugins-base.supp:
+ check: Add valgrind suppressions for ALSA and fontconfig bits on Jaunty.
+
+2009-10-09 15:32:45 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ audioconvert: change the format instead of cast as ensonic asked
+
+2009-10-09 15:29:15 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/audioconvert/gstchannelmix.c:
+ audioconvert: fixes warning: format not a string literal and no format arguments
+ redo of valid part of my previous revert.
+
+2009-10-09 15:19:42 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * common:
+ * gst/audioconvert/gstchannelmix.c:
+ Revert "audioconvert: fixes warning: format not a string literal and no format arguments"
+ Revert this commit as unintentionally I've changed common.
+ This reverts commit 49ea0138223ec5f9e53780635cbcc70f33778667.
+
+2009-10-09 14:28:42 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ gnomevfssrc: fixes warnings in macosx
+ warning: format '%llu' expects type 'long long unsigned int', but argument 8 has type 'GnomeVFSFileOffset'
+ warning: format '%lld' expects type 'long long int', but argument 9 has type 'guint64'
+
+2009-10-09 14:23:36 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: fix warning in macosx
+
+2009-10-09 14:20:47 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/audiorate/gstaudiorate.c:
+ audiorate: fix warning in macosx
+
+2009-10-09 14:14:15 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * common:
+ * gst/audioconvert/gstchannelmix.c:
+ audioconvert: fixes warning: format not a string literal and no format arguments
+
+2009-10-09 14:07:24 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ audio: fix warnings building on macosx
+
+2009-10-08 18:08:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: chwck formats just once per _chain()
+
+2009-10-08 17:49:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: add perf-log-category and log suboptimal operation
+ Log if we use an intermediate colorspace for conversion.
+
+2009-10-08 10:59:36 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 19fa4f3 to a3e3ce4
+
+2009-10-08 00:17:21 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Fix type-punning warning
+
+2009-09-26 12:56:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Chains with an exposed endpad are complete too
+ This allows partial group changes, i.e. demuxer2 in the example below
+ goes EOS but has a next group and audio2 stays the same.
+ /-- >demuxer2---->video
+ demuxer--- \--->audio1
+ \--->audio2
+
+2009-09-26 12:47:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Use the iterate internal links function instead of string magic to get multiqueue srcpads
+
+2009-09-24 14:56:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Don't post missing plugin messages twice
+ decodebin2 already posts them after emitting the unknown-type signal,
+ there's no need to post another one.
+
+2009-09-26 12:17:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Rewrite autoplugging and how groups of pads are exposed
+ This now keeps track of everything that is going on, creates
+ a tree of chains and groups to allow "demuxer after demuxer" scenarios
+ and allows chained Oggs with multiple streams (needs oggdemux or playbin2 fixes).
+ Also document everything in detail and give a general overview of what
+ decodebin2 is doing at the top of the sources.
+ Fixes bug #596183, #563828 and #591677.
+
+2009-10-07 17:45:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: only start event thread if needed
+ The event thread is doing 20 wakeups per second to poll the events. If one
+ runs ximagesink with handle-events=false and handle-expose=false then we can
+ avoid the extra thread.
+
+2009-10-07 16:56:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/theora/theoraenc.c:
+ theoraenc: Make the default quality property 48.
+ This guarantees that people who use theoraenc without modifying any
+ properties will end up with a reasonably good quality output.
+ 48 is also the default of the encoder_example application shipped with
+ libtheora.
+
+2009-10-07 11:48:37 +0200 Benjamin Otte <otte@gnome.org>
+
+ * tests/check/libs/video.c:
+ tests/check/libs/video.c: Update strides for Y41B
+
+2009-10-07 10:32:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: we can use GLib 2.18 API unconditionally now
+
+2009-10-07 10:13:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump GLib requirement to 2.18
+ Bump required GLib version as per the release planning docs.
+
+2009-10-05 00:33:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/tuner.c:
+ docs: clarify GstTuner docs in two places
+
+2009-09-25 15:32:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/v4l/gstv4lelement.c:
+ v4l: fix compiler warning
+ Fix 'variable may be used uninitialized' compiler warning (which is
+ true in theory, but can't actually ever happen, since we always
+ call the function with check=FALSE).
+ Fixes #596313.
+
+2009-10-07 11:56:35 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstogmparse.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/mpl2parse.c:
+ * gst/subparse/tmplayerparse.c:
+ build: sprintf, sscanf need stdio.h
+
+2009-09-15 15:26:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: only start event thread if needed
+ The event thread is doing 20 wakeups per second to poll the events. If one runs
+ xvimagesink with handle-events=false and handle-expose=false then we can avoid
+ the extra thread.
+
+2009-10-07 09:58:27 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst-libs/gst/video/video.h:
+ Update Since tags for NV12/NV21
+ They are added in 0.10.26 now, not 0.10.25
+
+2009-09-23 15:31:50 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ [videotestsrc] Make checkers-8 pattern create 8x8 instead of 16x16 tiles
+
+2009-09-23 11:03:57 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ [ffmpegcolorspace] Fix NV12 and NV21 with odd width and height
+
+2009-09-23 10:25:02 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ Add NV12 and NV21 formats
+
+2009-09-21 18:49:42 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst-libs/gst/video/video.c:
+ [video] Fix Y41B
+ Chroma components should be aligned on 4byte boundaries.
+ https://bugzilla.gnome.org/show_bug.cgi?id=595849
+
+2009-09-21 18:49:06 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ [videotestsrc] Fix Y41B
+ Chroma components should be aligned on 4byte boundaries.
+ https://bugzilla.gnome.org/show_bug.cgi?id=595849
+
+2009-10-07 07:28:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/interfaces/streamvolume.c:
+ streamvolume: Define cbrt() if it's not available
+ Fixes build on Win32, bug #597537.
+
+2009-09-24 16:05:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstfactorylists.c:
+ factorylist: Use gst_caps_can_intersect() instead of _intersect()
+ This is faster and results in less allocations.
+
+2009-09-26 12:10:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't set the external ghostpads blocked but only their targets
+ Pad blocks should never be done on external pads as outside elements
+ might want to use their own pad blocks on them and this will lead to
+ conflicts and deadlocks.
+
+2009-09-26 12:04:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Only use the object lock for protecting the subtitle elements
+ Using the decodebin lock will result in deadlocks if the subtitle encoding
+ is accessed from a pad-added handler.
+
+2009-09-26 18:11:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Improve debugging of pad blocks
+
+2009-09-23 16:07:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ playbin2/playsink: Use gst_object_ref_sink() instead of calling both separately
+
+2009-10-06 19:59:11 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ configure: Add an 'else' to pangocairo check
+ Otherwise it exits if it fails.
+
+2009-10-06 19:35:50 -0700 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: add pattern with out-of-gamut colors
+ Adds a pattern with out-of-gamut colors in a checkerboard
+ pattern with in-gamut neighbors. Useful for checking YCbCr->RGB
+ color matrixing. Correct matrixing and clamping will cause the
+ checkerboard pattern to be invisible.
+
+2009-10-06 19:17:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: use CLOSE_SOCKET() instead of close()
+ Use CLOSE_SOCKET instead of directly calling close() because it does the right
+ thing for windows.
+ Fixes #597539
+
+2009-10-01 14:19:41 +0200 Robert Swain <robert swain gmail com>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: fix printf variable type
+ Change printf variable type from %lu to %" G_GUINT64_FORMAT " as it
+ should be for guint64.
+ Fixes #596981
+
+2009-09-30 23:22:35 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ ffmpegcolorspace: Use the ffmpegcolorspace debug category
+ Move gstffmpegcodecmap debug to the ffmpegcolorspace category
+
+2009-09-22 11:58:26 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gdp/gstgdppay.c:
+ gdppay: Don't repeat tags buffers for every new segment
+ Only send a tag buffer when one is received, not after every new segment
+ event/update.
+
+2009-09-28 20:25:35 -0700 David Schleef <ds@schleef.org>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: detect 'ftypqt ' as video/quicktime
+
+2009-10-06 19:47:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ back to development -> 0.10.25.1
+
+=== release 0.10.25 ===
+
+2009-10-05 13:56:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ Release 0.10.25
+
+2009-10-05 13:49:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/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/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2009-10-01 17:17:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/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/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:
+ 0.10.24.4 pre-release
+
+2009-10-01 10:37:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ pango: Unpremultiply Cairo's ARGB to match GStreamers ARGB
+
+2009-09-28 22:06:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: make the lock recursive for now
+ Fixes #583255
+
+2009-09-28 21:54:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: fix the vis property getter
+
+2009-09-30 18:06:56 +0100 Christian F.K. Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Add missing file to spec file
+
+2009-09-17 16:57:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * tests/check/libs/cddabasesrc.c:
+ cddabasesrc: Fix string leaks in the unit test and a leak in cddabasesrc
+
+2009-09-17 23:42:52 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * tests/check/libs/cddabasesrc.c:
+ cddabasesrc: ignore URI fragments that look like device paths
+ Rhythmbox uses cdda:// URIs of the form cdda://track#device, which
+ worked before the fix for bug #321532.
+ Also adds a check for negative track numbers and some unit tests for URI
+ parsing.
+ Fixes bug #595454.
+
+2009-09-17 01:20:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * 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/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:
+ 0.10.24.3 pre-release
+
+2009-09-15 15:23:49 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: don't ever return NULL in list of strings.
+
+2009-09-14 12:18:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Expose mute,volume,vis-plugin and font-desc properties
+ https://bugzilla.gnome.org/show_bug.cgi?id=594623
+
+2009-09-09 12:42:04 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ GstPlaySink: Expose 'reconfigure' as an action signal.
+
+2009-09-09 11:17:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaysink.c:
+ GstPlaySink: Expose flags as a gobject property.
+
+2009-09-08 11:35:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplayback.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playback: Register playsink as an element.
+ This allows using playsink from outside the playback plugin.
+ Add code to be able to request the sink pads using standard GStreamer API.
+ TODO : expose GObject properties/signals.
+
+2009-09-12 14:55:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs.types:
+ docs: add new gst_stream_volume_get_type to types file
+ This is needs to get Gobject features to show up in the docs.
+
+2009-09-12 15:48:11 -0700 David Schleef <ds@schleef.org>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Fix duration calculation for truncated files
+ If the last page of a stream has a granulepos of -1, that is,
+ it doesn't complete a packet, we need to continue to search
+ for the last granulepos.
+
+2009-09-12 14:01:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * Makefile.am:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introspection: Build pkgconfig before all libraries and set PKG_CONFIG_PATH
+ This way g-ir-scanner can find the gstreamer-*-0.10 pkg-config files.
+
+2009-09-12 02:23:07 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/theora/theoraenc.c:
+ theoraenc: Fix a string leak in _getcaps()
+
+2009-09-11 23:49:11 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * 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/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:
+ 0.10.24.2 pre-release
+
+2009-09-11 21:44:18 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/audioresample.c:
+ check: Improve audioresample test
+ Make the audioresample test work with CK_FORK=no, and
+ turn a g_print into a GST_INFO.
+
+2009-09-11 22:09:06 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix crashes with even widths
+ The fix for green lines introduced by commit
+ 35fdfcc6258c66ba462a4330a35deffb0f2b501d caused invalid memory accesses
+ for even widths. This patch fixes it.
+
+2009-09-11 15:11:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Implement GstStreamVolume interface
+
+2009-09-11 15:04:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolume.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/volume.c:
+ volume: Implement GstStreamVolume interface
+
+2009-09-11 14:54:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/streamvolume.c:
+ * gst-libs/gst/interfaces/streamvolume.h:
+ * gst/playback/Makefile.am:
+ * win32/common/libgstinterfaces.def:
+ interfaces: API: Add GstStreamVolume interface
+ Fixes bug #567660.
+
+2009-09-11 12:20:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: properly fix the HTTP manual mode
+ When we're not parsing HTTP, return EPARSE when we get an HTTP
+ message.
+
+2009-09-11 10:16:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/mixertrack.h:
+ mixertrack: add READONLY and WRITEONLY flags
+ Should really have been READABLE and WRITABLE, but those are hard to
+ add whilst maintaining backwards compatibility. See #343615.
+ API: GST_MIXER_TRACK_READONLY
+ API: GST_MIXER_TRACK_WRITEONLY
+
+2009-09-11 10:02:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: fix build against core that has debugging disabled
+ The macro is called GST_DISABLE_GST_DEBUG, not GST_DISABLE_DEBUG.
+
+2009-09-11 07:38:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ videorate: Add Since marker for the new skip-to-first property
+
+2009-09-11 07:36:10 +0200 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: Make videorate work with a live source
+ Add a property that makes videorate skip to the first buffer it
+ receives instead of padding the stream from segment start to the
+ first real buffer.
+ Fixes bug #567928.
+
+2009-09-11 07:20:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/fft/gstfft.h:
+ * gst-libs/gst/fft/gstfftf32.h:
+ * gst-libs/gst/fft/gstfftf64.h:
+ * gst-libs/gst/fft/gstffts16.h:
+ * gst-libs/gst/fft/gstffts32.h:
+ fft: Mark one function as const and add notes that the structs should be private in 0.11
+
+2009-09-10 22:28:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: add human readable format names when logging
+ Add string array with human readable names for format and type to be used in log
+ statements.
+
+2009-09-10 18:19:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppay: don't print RTP timestamps as clocktime
+ Don't try to print the RTP timestamp as a GstClockTime, it's just a guint32.
+ Fixes #594757
+
+2009-09-10 16:55:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ playbin(2): Document that the volume property uses a linear scale
+ Fixes bug #571610.
+
+2009-09-10 14:04:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: don't return EPARSE
+ Don't blindly return EPARSE when http mode is disabled.
+ Restore old http mode after temporarily setting it to TRUE.
+
+2009-09-10 12:38:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: add ugly backward compat hack
+ Check for pulsesink < 0.10.17 because it includes code that is now included in
+ baseaudiosink. Disable that code in baseaudiosink to be compatible with the
+ older version.
+
+2009-09-10 10:56:29 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Handle YVU9/YUV9 conversion with odd widths
+ A green border could be visible when converting to Y444 or RGB, because
+ the last chroma samples weren't copied correctly
+
+2009-09-10 10:43:37 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix YVU9 and YUV9
+ - Buffer sizes were computed different from ffmpegcolorspace
+ - Green bar on right size for widths not divisable by 4
+
+2009-09-10 10:08:28 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix image for odd widths in some formats
+ videotestsrc rounds chroma down. This causes it to omit the last chroma
+ value completely for odd widths when the chroma is downsampled.
+ This patch special cases the last pixel to not be rounded down.
+
+2009-09-10 10:02:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: Handle kate and cmml as sparse streams too
+
+2009-09-10 10:00:16 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: Better handling of sparse streams by sending segment updates
+ Fixes bug #397419.
+
+2009-09-10 09:43:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gsturidecodebin.c:
+ docs: tell a biit more about uri-decodebin and buffering
+
+2009-09-09 18:24:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: take clock time in setcaps
+ Take the time of the clock so that the last_time field is set. This is important
+ for sinks that restart their internal ringbuffer after a caps change and need to
+ know the last know position.
+
+2009-09-09 18:24:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ audioclock: add some more debug
+
+2009-09-09 16:44:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/theoraenc.c:
+ theoraenc: Print a debug message with supported formats
+
+2009-09-07 17:29:38 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Check supported input formats in getcaps function
+ We want to fail early when an older libtheora release is used that does
+ not support Y444 or Y42B formats, so use a getcaps function that does
+ this.
+
+2009-09-04 21:37:04 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Implement support in theoraenc for Y444 and Y42B
+ Fixes bug #594165.
+
+2009-09-04 20:23:52 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Refactor the buffer copy code
+
+2009-09-04 16:59:49 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Split yuv_buffer creation into its own function
+
+2009-09-04 16:49:08 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Split out buffer resize in its own function
+
+2009-09-04 14:06:09 +0200 Benjamin Otte <otte@gnome.org>
+
+ * ext/theora/theoraenc.c:
+ theora: Add assertions that functions don't fail
+ Some functions in libtheora can return an error, but that error cannot
+ ever happen inside theoraenc. In those cases assert that it doesn't.
+
+2009-09-09 16:21:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: make stop state configurable
+ Make it easy to experiment with different stop states (NULL and READY)
+
+2009-09-09 16:19:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: correct for clock reset
+ When going to NULL, we reset the ringbuffer so that it starts beck from 0. We
+ also make sure that the clock is updated with the elapsed time so that it
+ alsways increments even when the ringbuffer goes back to 0. When this happened
+ we need to adjust the sample position for the reset ringbuffer.
+ Fixes #594136
+
+2009-09-09 16:17:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ baseaudiosink: whitespace fixes
+
+2009-09-09 16:16:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: add more debug
+
+2009-09-09 10:25:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/mixer.h:
+ whitespace fixes
+
+2009-09-08 17:59:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/gstvideosink.c:
+ * gst-libs/gst/video/gstvideosink.h:
+ videosink: add "show-preroll-frame" property
+ Add a property to disable rendering of video frames during preroll. This
+ will only work for videosinks that use the new ::show_frame() vfunc instead
+ of overriding basesink's preroll and render vfuncs directly.
+ API: GstVideoSink:show-preroll-frame
+
+2009-09-08 17:43:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ ximagesink, xvimagesink: use new GstVideoSink::show_frame() vfunc
+
+2009-09-08 18:19:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/gstvideosink.c:
+ * gst-libs/gst/video/gstvideosink.h:
+ video: add GstVideoSinkClass::show_frame()
+ Add ::show_frame() vfunc which maps to basesink's ::preroll and ::render
+ vfuncs and add some gtk-doc chunks.
+ API: GstVideoSinkClass::show_frame()
+
+2009-09-08 16:00:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: don't do stuff inside g_return_val_if_fail() statements
+ Or it will all fall apart if someone compiles with -DG_DISABLE_ASSERT.
+
+2009-08-31 20:24:22 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: Fix compiler warning with MSVC
+ Fixes bug #594275.
+
+2009-08-31 20:31:56 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ basertpdepayload: fix event forwarding
+
+2009-08-31 20:36:37 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ rtcpbuffer: add missing break in handling of GST_RTCP_TYPE_PSFB
+ Fixes #594258
+
+2009-09-08 13:02:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ fix whitespace
+
+2009-09-08 12:59:20 +0200 Håvard Graff <havard.graff@tandberg.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: improve slave skew resync
+ The old one did the mistake of not actually advancing the ringbuffer, it just
+ adjusted the segbase, introducing the whole lenght of the ringbuffer as an
+ extra delay in the pipeline.
+ Also make sure that the resync can never go back in time, producing the same
+ timestamps that has already been produced, as this can cause severe problems
+ for sinks and other synching mechanisms.
+ Fixes #594256
+
+2009-09-07 17:13:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: disable typefinder for headerless flac
+ Disable headerless flac typefinder as long as it happily typefinds anything
+ including /dev/urandom as flac and as long as it's not particularly useful
+ given that such streams don't really exist in the wild.
+ Also fix up some comments so that gtk-doc doesn't complain about them.
+
+2009-09-06 15:21:43 +0300 René Stadler <mail@renestadler.de>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: fix small memory leak when setting window title
+
+2009-09-06 01:42:42 +0300 René Stadler <mail@renestadler.de>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: fix small memory leak when setting window title
+
+2009-09-05 13:55:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * .gitignore:
+ introspection: Add *.gir and *.typelib to .gitignore
+
+2009-09-05 13:46:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introduction: Fix out-of-tree build
+
+2009-09-05 13:13:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ rtsp: Fix introspection build by ordering sources/headers in dependency order
+
+2009-09-05 13:09:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/Makefile.am:
+ audio: Remove debug echo
+
+2009-09-05 13:08:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/Makefile.am:
+ audio: Fix build of introspection data by using dependency order for the headers/sources
+
+2009-09-05 12:31:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introspection: Strip Gst prefix from all types/functions
+
+2009-09-05 11:49:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/netbuffer/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/video/Makefile.am:
+ introspection: Fix build if gir-repository is not installed
+
+2009-09-05 11:37:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/Makefile.am:
+ video: Add gobject-introspection support
+
+2009-09-05 11:35:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/Makefile.am:
+ tag: Add gobject-introspection support
+
+2009-09-05 11:34:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/sdp/Makefile.am:
+ sdp: Add gobject-introspection support
+
+2009-09-05 11:31:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/pbutils/Makefile.am:
+ libs: Add nodist headers and sources to the introspection files
+
+2009-09-05 11:28:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ rtsp: Add gobject-introspection support
+
+2009-09-05 11:25:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtp/Makefile.am:
+ rtp: Add gobject-introspection support
+
+2009-09-05 11:23:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/riff/Makefile.am:
+ riff: Add gobject-introspection support
+
+2009-09-05 11:20:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/Makefile.am:
+ pbutils: Add gobject-introspection support
+
+2009-09-05 11:17:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/Makefile.am:
+ netbuffer: Add gobject-introspection support
+
+2009-09-05 11:15:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/Makefile.am:
+ interfaces: Add gobject-introspection support
+
+2009-09-05 11:04:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/fft/Makefile.am:
+ fft: Add gobject-introspection support
+
+2009-09-05 11:01:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/Makefile.am:
+ cdda: Add gobject-introspection support
+ This is disabled for now until gobject-introspection is fixed
+
+2009-09-05 10:50:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/audio/Makefile.am:
+ audio: Add gobject-introspection support
+
+2009-09-05 10:40:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst-libs/gst/app/Makefile.am:
+ app: Add gobject-introspection support
+
+2009-09-05 10:20:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 00a859e to 19fa4f3
+
+2009-09-04 15:48:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: fix midi typefinding
+ We already have a audio/midi typefinder so don't override it with the midi in
+ RIFF typefinder or else we fail to detect plain midi files.
+
+2009-09-04 11:29:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: do buffering for more uris
+ Add ssh://, ftp://, sftp://, myth:// to the list of uris that require
+ buffering.
+ Fixes #594020
+
+2009-09-04 07:36:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add typefinder for Midi inside RIFF
+ This is a standard Midi file format that should be supported by
+ all Midi decoders and also has the mimetype audio/mid according to
+ the Midi specification homepage.
+ Fixes bug #594094.
+
+2009-09-03 18:53:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: add some debugging
+
+2009-09-03 17:53:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: handle gaps
+ Add various conversion functions between time<->bytes<->rtptime that will be
+ used later on.
+ Refactor the min/max packet length code so that it can be used for both
+ sample/frame based payloaders. Cache the returned values.
+ code cleanups.
+ When we discover a DISCONT buffer, make the outgoing RTP timestamps have the
+ same gap as the GStreamer timestamps gap.
+
+2009-09-03 14:13:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: fix frame duration calculations
+ Fix the calculation of the frame duration and rtp timestamps.
+ Add some debugging
+
+2009-09-03 14:13:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ rtppay: add some debugging
+
+2009-09-02 19:49:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: use offsets for RTP timestamps
+ Have a custom sample/frame function to generate an offset that the base class
+ will use for generating RTP timestamps. This results in perfect RTP timestamps
+ on the output buffers.
+ Refactor setting metadata on output buffers.
+ Add some more functionality to _flush().
+ Handle DISCONT on the input buffers and set the marker bit and DISCONT flag on
+ the next outgoing buffer.
+ Flush the pending data on EOS.
+
+2009-09-02 13:13:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: move function around
+
+2009-09-02 13:12:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: fix sample duration calculation
+
+2009-09-02 12:24:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppay: more refactoring
+ Unify the sample/frame buffer handling code by making the functions plugable.
+
+2009-09-02 12:03:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ audiortppayload: refactor some more
+ Refactor getting the packet min/max size and alignment code.
+ Refactor converting bytes to time.
+ change some variable to something shorter.
+
+2009-09-02 10:46:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ * win32/common/libgstrtp.def:
+ audiortppayload: refactor and cleanup
+ Always use the adapter when we need to fragment the incomming buffer. Use more
+ modern adapter functions to avoid malloc and memcpy. The overall result is that
+ the code looks cleaner while it should be equally fast and in some case avoid a
+ memcpy and malloc.
+ Use the adapter timestamping functions for more precise timestamps in case of
+ weird disconts.
+ Cache some values instead of recalculating them.
+ Add gst_base_rtp_audio_payload_flush() to flush a certain amount of bytes from
+ the internal adapter.
+ API: GstBaseRTPAudioPayload::gst_base_rtp_audio_payload_flush()
+
+2009-09-03 16:56:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Update common
+
+2009-09-03 11:29:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppay: add property to disable perfect RTP time
+ Add a property to disable the generation of perfect RTP timestamps. By default
+ it is active.
+ API: GstBaseRTPPayload::perfect-rtptime
+
+2009-09-02 19:47:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ basertppay: allow subclasses to influence RTP time
+ Allow subclasses to use the OFFSET field on RTP buffers to influence the way in
+ which RTP timestamps are generated. Usually timestamps are created from the
+ GStreamer timestamps on the buffer, which could result in imperfect RTP
+ timestamps.
+
+2009-09-02 19:44:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppay: add macro to cast
+
+2009-09-01 18:26:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiopayload: code cleanups
+
+2009-09-01 18:08:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ audiortppayload: don't check adapter
+ the adapter is never NULL so we don't need to check it.
+ Use _scale functions to avoid overflows.
+
+2009-09-03 00:14:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/typefind/Makefile.am:
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: move gio-based xdg mime typefinder from -bad to -base
+ Its purposes is mainly to avoid false positives (e.g. mp3 typefinder
+ reporting a 20% probability and somesuch). Won't be registered if
+ the gio plugin has been disabled via ./configure --disable-gio.
+
+2009-09-01 15:06:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: GstAdapter is not a GstObject and should be freed with g_object_unref
+
+2009-09-01 15:02:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ v4lsrc: fix timestamping for when we do not have a clock yet
+ Should fix #559049.
+
+2009-09-01 14:30:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ v4lsrc: don't log not-yet-initialised integer value
+
+2009-09-01 14:28:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * sys/v4l/v4lsrc_calls.c:
+ v4lsrc: avoid unnecessary run-time type checks in custom buffer finalize
+ And reflow code to be more indent friendly.
+
+2009-09-01 10:39:52 +0200 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppayload: Make instance init faster by not reading /dev/urandom 3 times
+ ... which is the default seed when creating a new GRand. Because
+ GLib in older versions used buffered IO this would take a lot of time.
+ Instead use the global GRand for getting random numbers and keep the
+ three instance GRand for backward compatibility with a simple seed.
+ Fixes bug #593284.
+
+2009-08-31 22:48:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: improve caps filter functionality. Fixes #590146.
+ Also use the capsfilter if there is no src-peer as the caps constrain what
+ we can do. Don't create any_caps as a default, as we check for NULL to skip the
+ filtering. This is a (small) performance regression as we always intersect
+ otherwise.
+
+2009-08-31 11:10:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Post missing plugin messages before any error messages
+
+2009-08-28 19:06:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ cddabasesrc: safely handle the indexes
+
+2009-08-28 19:06:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtsp.def:
+ def: add new rtsp symbols
+
+2009-08-28 14:08:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ basertppayload: whitespace fixes.
+
+2009-08-27 18:59:49 +0200 Marc-André Lureau <mlureau@flumotion.com>
+
+ * gst/gdp/gstgdppay.c:
+ Bug 593035 - set IN_CAPS for streamheader buffer
+
+2009-08-26 16:56:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gststreamselector.c:
+ playbin: The internally linked pad of the selector might be NULL in some cases
+
+2009-08-26 16:45:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gststreamselector.c:
+ playbin: Fix iterate internal linked pads functions for the stream selectors
+ This now used the new gst_iterator_new_single() function and as a side effect
+ fixes bug #592864.
+
+2009-08-26 09:08:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-read.c:
+ riff: Add support for AVF files
+ AVF is valid RIFF but has AVF0 has first fourcc instead of RIFF.
+ Fixes bug #593117.
+
+2009-08-26 09:08:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Detect AVF files as RIFF files too
+ AVF is valid RIFF but has AVF0 as first fourcc instead of RIFF.
+ Partially fixes bug #593117.
+
+2009-08-21 11:51:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/audioresample.c:
+ audioresample: Add unit test for checking for timestamp drifts
+ This also checks for perfect timestamping and offsetting.
+
+2009-08-21 10:11:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Fix drain processing
+ In case we have to convert internally don't process output length input samples
+ but history length input samples.
+
+2009-08-21 10:02:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/audioresample.c:
+ audioresample: Improve debugging a bit in the unit test
+
+2009-08-21 10:00:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: On the first buffer we need discont handling
+ Otherwise we won't get upstream timestamps and everything and all
+ output buffers would have -1 timestamps.
+
+2009-08-21 08:23:39 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ * gst/subparse/gstsubparse.c:
+ subparse: Remove dependency on regex.h as it's not used anyway
+ Fixes bug #592544.
+
+2009-08-21 06:58:31 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Fix buffer overflow when pushing the drain
+
+2009-08-21 06:57:58 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ audioresample: Fix timestamp drift
+ Fixes bug #591934.
+
+2009-08-24 11:34:35 -0700 David Schleef <ds@schleef.org>
+
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gsttextrender.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gststreamselector.c:
+ * gst/subparse/gstsubparse.c:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * sys/v4l/gstv4lsrc.c:
+ Remove Ronald Bultje from Authors field
+ Replaced with "GStreamer maintainers
+ <gstreamer-devel@lists.sourceforge.net>" or just removed,
+ depending on the number of other authors.
+
+2009-08-24 15:06:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: fix refcounting of _get_sink()
+ g_value_set_object() increases the refcount of the sink, which is not needed
+ because the object should already be refcounted. Make sure this is always the
+ case and use g_value_take_object().
+ Fixes: #592884
+
+2009-08-24 14:39:16 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ rtsp: Mark Transport as supporting multiple values.
+
+2009-08-24 13:58:17 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ rtsp: Added missing Since tags.
+
+2009-08-24 13:27:55 +0200 Eero Nurkkala <ext-eero.nurkkala at nokia.com>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: Improve audiosink startup performance
+ When we start the ringbuffer, immediatly continue processing samples if the
+ writer prepared some for us.
+ Fixes #545807
+
+2009-08-17 11:53:43 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Added new API for sending using GstRTSPWatch.
+ The new API to send messages using GstRTSPWatch will first try to send the
+ message immediately. Then, if that failed (or the message was not sent
+ fully), it will queue the remaining message for later delivery. This avoids
+ unnecessary context switches, and makes it possible to keep track of
+ whether the connection is blocked (the unblocking of the connection is
+ indicated by the reception of the message_sent signal).
+ This also deprecates the old API (gst_rtsp_watch_queue_data() and
+ gst_rtsp_watch_queue_message().)
+ API: gst_rtsp_watch_write_data()
+ API: gst_rtsp_watch_send_message()
+
+2009-08-17 11:46:32 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Made gst_rtsp_watch_queue_data() thread safe.
+
+2009-06-17 15:37:53 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Added gst_rtsp_connection_set_http_mode().
+ With gst_rtsp_connection_set_http_mode() it is possible to tell the
+ connection whether to allow HTTP messages to be supported. By enabling HTTP
+ support the automatic HTTP tunnel support will also be disabled.
+ API: gst_rtsp_connection_set_http_mode()
+
+2009-06-16 19:35:23 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Allow gst_rtsp_connection_do_tunnel() to just setup decoding context.
+ If the second connection passed to gst_rtsp_connection_do_tunnel() is NULL
+ then just setup the base64 decoding context for the first connection.
+
+2009-06-16 19:04:54 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Write as much as possible in gst_rtsp_source_dispatch().
+ Try to write as much as possible if there are multiple messages queued.
+
+2009-06-16 18:38:02 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Add error_full callback to GstRTSPWatchFuncs.
+ The error_full callback is similar to the error callback, but allows for
+ better error handling. For read errors a partial message is provided to
+ help an RTSP server generate a more correct error response, and for write
+ errors the write queue id of the failed message is returned.
+
+2009-08-17 18:29:17 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Made read_line() support LWS.
+ Rewrote read_line() to support LWS (Line White Space), the method used by
+ RTSP (and HTTP) to break long lines. Also added support for \r and \n as
+ line endings (in addition to the official \r\n).
+
+2009-08-20 14:12:50 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: Do not split headers which should not be split.
+ From RFC 2068 section 4.2: "Multiple message-header fields with the same
+ field-name may be present in a message if and only if the entire
+ field-value for that header field is defined as a comma-separated list
+ [i.e., #(values)]." This means that we should not split other headers which
+ may contain a comma, e.g., Range and Date.
+
+2009-08-20 14:12:09 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Parse WWW-Authenticate headers correctly.
+ Due to the odd syntax for WWW-Authenticate (and Proxy-Authenticate) which
+ allows commas both to separate between multiple challenges, and within the
+ challenges themself, we need to take some extra care to split these headers
+ correctly.
+
+2009-06-17 21:46:27 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Improve parse_line().
+ Make parse_line() handle keys with multiple values on one line correctly.
+
+2009-06-17 23:15:23 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Rewrote setup_tunneling().
+ Rewrote setup_tunneling() to use normal GstRTSPMessages instead of hard
+ coded strings and duplicates of the message parsing code.
+
+2009-08-24 10:20:16 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: Rewrote gen_tunnel_reply().
+ Rewrote gen_tunnel_reply() to generate a normal GstRTSPMessage rather
+ than a hard coded string.
+
+2009-08-24 10:19:35 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Ignore the Content-Length for POST requests.
+ The Content-Length for POST requests with an x-sessioncookie header should
+ be ignored as the length is bogus and only there to fool proxies.
+
+2009-06-17 20:52:48 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Normalize lines (remove extra whitespace) before parsing.
+
+2009-06-10 13:11:31 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Made parse_string() return a result.
+ This will catch parsing errors when a too long string is received.
+
+2009-06-10 11:43:31 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Improved parsing of messages.
+ Do not abort message parsing as soon as there is an error. Instead parse
+ as much as possible to allow a server to return as meaningful an error as
+ possible.
+
+2009-06-09 17:54:20 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ rtsp: Added support for HTTP messages
+
+2009-06-09 16:22:17 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Added gst_rtsp_connection_create_from_fd().
+ API: gst_rtsp_connection_create_from_fd()
+
+2009-06-09 15:27:17 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Add initial buffer support.
+ The initial buffer contains data for a connection which should be used
+ before starting to actually read anything from the socket.
+
+2009-08-24 13:15:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ appsink: don't block in paused
+ When we are asked to unlock we should either leave the render function or call
+ the wait_preroll method to release the stream lock.
+ Fixes #592657
+
+2009-08-24 13:06:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: fix includes for appsrc/appsink
+
+2009-08-24 11:24:27 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: Add support for the Authentication-Info header.
+ The Authentication-Info header is defined in RFC 2617 (Digest Access
+ Authentication).
+
+2009-08-20 13:11:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * tests/check/pipelines/oggmux.c:
+ oggmux: don't drop the streamheader field from the output caps
+ Revert previous 'fix' for bug #588717 and fix it properly, whilst
+ maintaining the streamheader field on the output caps. Also make
+ sure we don't leak header buffers we couldn't push when downstream
+ is unlinked. Add unit test for the presence of the streamheader
+ field on the output caps and for the issue from bug #588717.
+
+2009-08-18 21:45:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gststreamselector.c:
+ streamselector/inputselector: Use iterate internal links instead of deprecated get internal links
+
+2009-08-19 09:31:51 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Avoid duplicated headers.
+ Remove any existing Session and Date headers before adding new ones
+ when sending a request. This may happen if the user of this code reuses
+ a request (rtspsrc does this when resending after authorization fails).
+
+2009-08-18 16:49:58 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Corrected the HTTP digest authorization computation.
+ Do not use sizeof() on an array passed as an argument to a function and
+ expect to get anything but the size of a pointer. As a result only the
+ first 4 (or 8) bytes of the response buffer were initialized to 0 in
+ auth_digest_compute_response() which caused it to return a string which
+ was not NUL-terminated...
+
+2009-08-18 11:15:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Also send SEEK events directly to a subpicture sink
+
+2009-08-18 08:39:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: If a custom text sink is used, send events to it too
+ Before, SEEK events would be sent to the video sink, which wouldn't
+ be linked in any way to the subtitle part of the pipeline and
+ subparse would never see the SEEK event. This would then seek
+ the audio/video but the subtitles would continue from the old
+ position instead.
+ Fixes bug #591664.
+
+2009-08-18 08:20:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Make missing plugins emit a warning message, not an error message
+ The problem with an error message is, that it will stop playback completely
+ while it could be that only a audio decoder plugin is missing and the video
+ could be played with the available plugins.
+ See bug #591677.
+
+2009-08-13 17:42:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Post a correct error message for unknown types
+ Before we had STREAM/WRONG_TYPE but it's really CORE/MISSING_PLUGIN
+ because a plugin is missing and nothing else is wrong.
+ Also make it an error instead of a warning.
+ Really fixes bug #591677.
+
+2009-08-13 15:48:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Post a missing plugin message additional to the error message on unknown types
+ Fixes bug #591677.
+
+2009-08-13 10:59:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/lv.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:
+ playbin2: fix error message string
+ Fixes #591577.
+
+2009-08-05 15:38:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-read.c:
+ riff: align API doc of gst_riff_parse_chunk with reality
+
+2009-08-05 15:36:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: avoid assertion failure on empty/NULL caps
+
+2009-08-12 12:09:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Also detect SVG by the <svg> starting tag
+ Not all SVG images have the DOCTYPE specified.
+
+2009-08-10 20:18:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: don't use GLib-2.18 function
+ g_checksum_reset() was added only in GLib 2.18, but we still require
+ only 2.16, so work around that if we only have 2.16. Fixes #591357.
+
+2009-08-10 15:40:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/pipelines/streamheader.c:
+ streamheader: Fix caps leak in the vorbisenc unit test
+
+2009-08-10 14:14:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/streamheader.c:
+ checks: fix stream header unit test hanging in gst_task_cleanup_all()
+ Set pipelines to NULL state and unref when done.
+
+2009-08-10 10:17:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/md5.c:
+ * gst-libs/gst/rtsp/md5.h:
+ rtsp: Use GLib's GChecksum instead of our own MD5 implementation
+
+2009-08-10 03:46:39 +0300 Mart Raudsepp <leio@gentoo.org>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: Fix doc blurb typo for gst_navigation_send_key_event
+
+2009-08-09 12:13:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Allow . instead of , as millisecond delimiter in srt subtitles
+ Fixes bug #591207.
+
+2009-08-08 17:51:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gststreamselector.c:
+ Revert inlines that cause compiler warnings and are not needed anyway
+
+2009-08-08 15:54:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ * gst-libs/gst/riff/riff-media.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/video/gstvideofilter.c:
+ * gst-libs/gst/video/gstvideosink.c:
+ gst-libs: Remove dead assignments and resulting unused variables.
+
+2009-08-08 15:54:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/alsa/gstalsadeviceprobe.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gsttextrender.c:
+ * ext/vorbis/vorbisenc.c:
+ ext: Remove dead assignments and resulting unused variables.
+
+2009-08-08 15:54:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstfactorylists.c:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gststreamselector.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/vs_image.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ gst: Remove dead assignments and resulting unused variables
+
+2009-08-07 13:05:42 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * docs/design/draft-va.txt:
+ docs: add draft for generic introduction of video acceleration APIs idea
+
+2009-08-07 08:53:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c:
+ Revert "theora: Convert theoradec to libtheora 1.0 API"
+ This reverts commit f1e142ac9dcfb754d85357b9077d5aee48559dd9.
+ Temporarily revert until we have a workaround for debian/ubuntu
+ packaging failure (see http://bugs.debian.org/528710).
+
+2009-08-07 09:32:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add typefinders for many game sound console formats supported by gme
+ These are AY, GBS, GYM, KSS, SAP and VGM. SPC and NSF already had typefinders.
+
+2009-07-16 11:29:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: fix warning when we're not linked downstream and error out properly
+ Fix caps warning when there's no element linked downstream, and pass
+ not-linked flow return value correctly up the chain, so we error out
+ correctly. Fixes #588717.
+
+2009-07-31 14:59:03 -0700 David Schleef <ds@schleef.org>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c:
+ theora: Convert theoradec to libtheora 1.0 API
+
+2009-08-06 20:47:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Fix blitting of text over the output buffer and cairo painting
+
+2009-08-06 09:13:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Fix endianness problems (i.e. make it work again on big endian architectures)
+
+2009-07-31 14:27:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/icles/test-colorkey.c:
+ colorkey-test: fix xsync error
+
+2009-07-06 23:06:50 +0300 Siarhei Siamashka <siarhei.siamashka@nokia.com>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: support for direct conversion from uyvy422 to rgb formats
+
+2009-07-14 12:33:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: smarter sink selection. Fixes #588523
+ Don't do fallbacks if application specified a sink element. When doing the
+ fallback use configured default elements instead of hardcoded linux only
+ elements. Improve error messages accordingly.
+
+2009-08-06 12:18:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ queue2: post error message when pausing task if so appropriate
+ If a downstream element returns an error while upstream has already
+ put all data into queue2 (including EOS), upstream will no longer
+ chain into queue2, so it is up to queue2 to perform some
+ EOS handling / message posting in such cases. See #589991.
+
+2009-08-06 12:58:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: change default slave method
+ Set the default slave method to the much better skew slaving algortihm.
+
+2009-08-06 12:01:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: make buffer writable
+ Make the input buffer writable before changing its contents.
+
+2009-08-06 09:55:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: fix postscript typefinder probability
+ Two bytes for a rare format hardly warrants MAXIMUM typefinding
+ probability, POSSIBLE seems more appropriate.
+
+2009-08-04 14:55:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ pango: Send queries from the srcpad directly to the video sinkpad
+
+2009-08-04 14:32:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Implement POSITION query
+
+2009-08-04 14:29:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/samiparse.c:
+ subparse: Implement SEEKING query
+
+2009-08-04 14:14:53 +0200 John Millikin <jmillikin@gmail.com>
+
+ * configure.ac:
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ tag: Add support for ALBUM_ARTIST tag in vorbiscomments and ID3v2 tags
+ Require latest core for this.
+ Fixes bug #590430.
+
+2009-08-04 12:46:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ pango: Add support for xRGB and BGRx formats
+
+2009-08-04 12:22:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ pango: Fix endianness issues from the pangocairo switch
+ cairo's ARGB is in native endianness, i.e. ARGB on big endian architectures
+ and BGRA on little endian architectures.
+
+2009-08-04 12:11:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ pango: Re-add shading support which was dropped by a previous patch
+
+2009-08-04 11:58:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * ext/pango/gsttextoverlay.c:
+ pango: Check if pangocairo supports vertical rendering and fix properties
+
+2009-08-04 11:45:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Use PROP_X instead of ARG_X consistently
+
+2009-08-04 11:42:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ pango: Some minor cleanup
+
+2009-08-04 11:36:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ pango: Check for pangocairo instead of pangoft2
+
+2009-08-04 11:35:10 +0200 Young-Ho Cha <ganadist@chollian.net>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttextrender.h:
+ pango: Use pango-cairo instead of pango-ft2
+ pango-cairo will always use the native font rendering backend
+ of the platform and provides better results.
+ Fixes bug #340887.
+
+2009-08-04 10:35:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add SVG typefinder
+
+2009-08-04 10:29:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Add postscript typefinder
+
+2009-07-30 15:08:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Use static caps again for MPEG4 typefinding
+
+2009-07-30 15:05:28 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Implement better & more flexible MPEG4 typefinding
+ This detects more MPEG4 streams as MPEG4.
+ Fixes bug #556537.
+
+2009-07-30 14:04:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ cddabasesrc: Allow to specify the device name in the URI
+ The allowed URI scheme is now:
+ cdda://(device#)?track
+ Also allow every combination of uppercase and lowercase
+ characters for the protocol part.
+ Fixes bug #321532.
+
+2009-07-30 12:37:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Restrict width/height to 2^15 - 1
+ Otherwise integer overflows will happen, resulting in segmentation faults.
+ Fixes bug #590243.
+
+2009-07-29 14:55:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Fix indention of template header
+
+2009-07-29 14:10:35 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: Clarify documentation about caps and linkage
+ Fixes bug #589095.
+
+2009-07-29 07:42:05 +0200 Benjamin Gaignard <benjamin@gaignard.net>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Fix typefinding of SDP files
+ Fixes bug #589574.
+
+2009-07-28 20:50:06 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Take the output offsets from the input if possible
+ Fixes bug #588915.
+
+2009-07-28 15:54:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Make sure to allocate enough memory for the temporary buffer
+ and fix scaling of odd-height interlaced video.
+
+2009-07-28 15:18:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Fix interlaced scaling for I420
+ ...and some other minor mistakes in the previous change.
+
+2009-07-28 14:12:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.h:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Include interlacing information in the AVPicture
+ This later allows to handle interlaced AVPicture different than
+ progressive ones which is needed for horizontally subsampled YUV
+ formats, see bug #589242.
+
+2009-07-28 13:55:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ videoscale: Add support for interlaced content
+ videoscale is not mixing content of two seperate fields anymore
+ and does scaling on every field separately.
+ Fixes bug #588761.
+
+2009-08-06 01:44:24 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ back to development -> 0.10.24.1
+
+2009-08-05 02:03:44 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-plugins-base.doap:
+ Add 0.10.24 release to the doap file
+
+=== release 0.10.24 ===
+
+2009-08-05 00:56:58 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Release 0.10.24
+
+2009-08-05 00:38:40 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/lv.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+
+2009-08-01 17:26:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ * tests/check/gst/typefindfunctions.c:
+ typefinding: fix detection of fLaC id packet in broken flac-in-ogg
+ There are flac-in-ogg files without the usual flac packet framing
+ and these files just have a 4-byte fLaC ID packet as first packet.
+ We need to recognise the type just from these four bytes if we
+ want oggdemux to recognise these streams correctly.
+
+2009-07-30 14:40:50 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/LINGUAS:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/lv.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:
+ 0.10.24.5 pre-release
+
+2009-07-29 14:15:53 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ audiofilter: Don't assert on slightly different caps
+ Plugins should not assert on incompatible caps, caps negotiation will
+ fail anyway.
+
+2009-07-30 13:42:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: reset pending flush-stop flag in state_changed. (mostly) Fixes #590146.
+
+2009-07-30 09:28:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump Gtk+ requirement of GUI examples from 2.12 to 2.14
+ The gio mount example needs GtkMountOperation, which is new in 2.14.
+
+2009-07-27 10:29:27 +0100 Balachandran C <balachandran_c@rediffmail.com>
+
+ * ext/alsa/gstalsasrc.c:
+ alsasrc: set alsasrc->handle back to NULL when closing device
+ Fixes crashes in gst_alsa_find_device_name() when probing or
+ reading the device-name property (e.g. when doing a dot-file
+ dump). Fixes #589797.
+
+2009-07-24 19:26:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gststreamselector.c:
+ playbin: rename GType of stream selector pad to avoid clash with input-selector from -bad
+ Rename the GType of the pads of playbin's internal stream selector
+ element so they don't use the same type name as input-selector's
+ pads. Fixes #589622.
+
+2009-07-24 13:39:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/nb.po:
+ * po/nl.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:
+ 0.10.23.4 pre-release
+
+2009-07-24 13:46:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/v4l/.gitignore:
+ ignores: Ignore v4l probing example binary
+
+2009-07-24 09:35:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: recognise Kate spu subtitles as well
+ Recognise spu-subtitles, SUB and K-SPU as valid categories for
+ Kate subtitles as well.
+
+2009-07-24 00:42:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From fedaaee to 94f95e3
+
+2009-07-22 14:21:43 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Update spec file with latest changes
+
+2009-07-20 17:28:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * win32/common/_stdint.h:
+ * win32/common/audio-enumtypes.c:
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/video-enumtypes.c:
+ 0.10.23.3 pre-release
+
+2009-07-20 12:51:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: call send_event directly
+ We can't call gst_element_send_event() from a streaming thread as it gets the
+ state lock. Instead call the send_event method directly until we have a nice API
+ for this in basesrc.
+ Fixes #588746
+
+2009-07-03 04:42:24 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ audiosink: Add stream-status messages
+ Fixes #587695
+
+2009-07-03 04:41:05 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ audiosrc: Add stream-status messages
+ See #587695
+
+2009-07-20 10:53:11 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/adder/gstadder.c:
+ gstadder: Don't forget to free pending events on flush/dispose.
+ Fixes #588747
+
+2009-07-12 10:08:12 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/adder.c:
+ tests/adder: Add stream consistency checking. Fixes #588748
+
+2009-07-12 10:07:34 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: Make sure tags are properly serialized. Fixes #588746
+ We do this by letting the basesrc base class handle the tags.
+
+2009-07-13 09:28:54 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: Collect incoming tag events and send them after newsegment. Fixes #588747
+
+2009-07-16 09:32:46 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: Check for empty tag strings. Fixes #588724
+
+2009-07-14 17:03:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ queue2: fix leak and improve buffering
+ Keep track of the max requested position and compare this to the write position
+ in the temp file to get the current amount of buffered data.
+ Fix memleak of all incomming buffers.
+ Fixes #588551
+
+2009-07-15 17:40:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/Makefile.am:
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstinputselector.h:
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gstplaybin2.c:
+ playbin2: use private copy of input-selector
+ We shouldn't really depend on elements from -bad for stream
+ selection in playbin2, so use a private copy of input-selector
+ until the selector plugin is ready to be moved to -base or -good.
+ Fixes #586356.
+
+2009-07-15 17:26:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstinputselector.c:
+ * gst/playback/gstinputselector.h:
+ playback: add private copy of the input-selector from gst-plugins-bad
+ Not hooked up yet though. See #586356.
+
+2009-07-14 19:00:36 +0200 Filippo Argiolas <filippo.argiolas@gmail.com>
+
+ * tests/examples/v4l/Makefile.am:
+ examples: fix v4l probe example build
+ Fixes bug #588550.
+
+2009-07-14 19:00:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ 0.10.23.2 pre-release
+
+2009-07-14 16:24:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/LINGUAS:
+ * po/tr.po:
+ Add Turkish translations
+
+2009-07-14 15:31:13 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/adder.c:
+ adder: One more attempt to fix the adder test
+ Give up and discard and recreate the alsasrc after checking it can
+ be opened, due to some strange crash inside alsa when we don't.
+
+2009-07-14 15:06:41 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/adder.c:
+ adder: Perform get_state() in the unit test
+ Wait for the alsasrc to return to NULL after setting it to PAUSED for
+ testing, otherwise it leads to segfaults later on.
+
+2009-07-14 14:39:32 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/adder.c:
+ adder: Don't fail when alsasrc is unavailable
+ Make the liveadder test succeed silently when it can't be completed
+ either because alsasrc is unavailable, or because the device is
+ inaccessible.
+
+2009-07-13 22:51:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: use subtitle/x-kate for Kate subtitle streams and application/x-kate for the rest
+ Differentiate subtitle streams and lyrics/cracktastic/complex streams via
+ the category string in the headers. This seems like a useful distinction
+ to make, and also seems more future-proof. See #525743.
+
+2009-02-21 13:18:10 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: add Kate caps to the list of accepted types
+ See #525743.
+
+2009-07-13 21:56:46 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: treat uri-schemas incasesensitive
+ Treat uri-schemas incasesensitive. This is mandated in rfc2396 section 3.1.
+ Fixes not showing buffering messages e.g. for HTTP://...
+
+2009-07-13 21:54:47 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: simplify docs
+ Make short-desc short - its used in the toc. Strip uneeded markup.
+
+2009-07-13 18:31:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstnetbuffer.def:
+ * win32/common/libgstvideo.def:
+ win32: Fix exports
+ Remove methods from video base classes that have moved to -bad.
+ Add gst_netaddress_to_string
+
+2009-07-13 17:56:58 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/gio/.gitignore:
+ ignores: ignore the giosrc-mounting example binary
+
+2009-07-13 17:54:40 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ navigation: Add some partial documentation
+ Add a general documentation blurb for the GstNavigation functionality.
+ Still lacks some example code and detail on how to implement it.
+
+2009-07-13 17:52:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for Siren codec and make two descriptions non-translatable
+
+2009-07-13 12:23:20 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 5845b63 to fedaaee
+
+2009-07-13 18:21:49 +0200 Elliott Sales de Andrade <quantum.analyst at gmail.com>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add siren to the RIFF parser
+ Add siren7 caps to the RIFF parser.
+
+2009-07-13 14:55:59 +0200 Filippo Argiolas <filippo.argiolas@gmail.com>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/v4l/Makefile.am:
+ * tests/examples/v4l/probe.c:
+ v4lsrc: add a simple test case for device probing
+
+2009-07-03 11:38:01 +0200 Filippo Argiolas <filippo.argiolas@gmail.com>
+
+ * configure.ac:
+ * sys/v4l/Makefile.am:
+ * sys/v4l/gstv4lelement.c:
+ v4lsrc: optional support for device probing with gudev
+ Enumerate v4l devices using gudev if available.
+ Fixes bug #583640.
+
+2009-07-10 23:24:36 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: add since tags to docs
+
+2009-07-10 21:29:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: don't automatically start pipeline in DB
+ Keep the pipeline paused when we detect download buffering. The user has to
+ manually start the pipeline for now because we can't estimate when the buffering
+ will finish or when we have underrun.
+
+2009-07-10 21:01:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ queue2: flush differently, avoiding deadlocks
+ Don't flush the file by closing and opening it but instead use g_freopen. This
+ avoids a deadlock in shutdown because we emit the temp-location property change
+ with the wrong lock held.
+
+2009-07-10 20:25:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: add a checkbox for progressive download
+
+2009-07-10 20:24:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: Fix template construction
+ Fix the construction of the temporary filename construction as the application
+ name can be NULL and we don't want a separator between the prgname and the
+ template.
+
+2009-07-10 20:04:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplay-enum.c:
+ * gst/playback/gstplay-enum.h:
+ * gst/playback/gstplaybin2.c:
+ playbin2: add support for progressive download
+ Add a new playbin2 flag (initially disabled) to enable progressive download
+ buffering in uridecodebin.
+
+2009-07-10 19:59:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add download property
+ Add a download property that will attempt to configure queue2 into progressive
+ download buffering.
+ Make sure we only enable download buffering for quicktime and flv formats.
+
+2009-07-10 19:49:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ queue2: add temp-template property
+ Add a new temp-template property so that queue2 can securely allocate a
+ temporary filename. Deprecate the temp-location property for setting the
+ location but still use it to notify the allocated temp file.
+
+2009-07-10 20:06:28 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: add a caps-property to avoid to need to plug a capsfilter afterwards
+ Adder can only handle one common format accross the pads. Thus one needed to add
+ a capsfilter afterwards and manage the caps. Now one can simply set the caps on
+ the property.
+
+2009-07-10 18:59:05 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/adder.c:
+ adder: skip live-seek text if we have no audiosrc, add new test
+ The seek-test needs a real audiosrc. Also add a test that checks that adder is
+ reusable. Finaly handle warnings as warnings to fix a assertion.
+
+2009-07-10 19:16:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosink.c:
+ gio: Also post a "not-mounted" message from giosink
+
+2009-07-10 17:15:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/gio/giosrc-mounting.c:
+ gio: Remove workaround for playbin2 bug in the sample application
+ The playbin2 bug was #588078.
+
+2009-07-10 17:08:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Make it possible for READY->PAUSED to succeed after it failed the first time
+ If READY->PAUSED failed in the source element we would've swapped
+ the current and next group already. To allow READY->PAUSED to succeed
+ after the first failure we have to swap the current and next group
+ back again. This also ensure that we're again in the same state
+ as before the failed state change and not at the next group.
+ This was especially a problem for playbin2 pipelines that use the
+ new mounting support in giosrc as the source would fail for READY->PAUSED
+ the first time, the application mounts the location and then tries
+ to go READY->PAUSED again (and this time it would succeed).
+ Fixes bug #588078.
+
+2009-07-10 11:42:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/gio/Makefile.am:
+ * tests/examples/gio/giosrc-mounting.c:
+ gio: Add example application that shows how to handle the "not-mounted" message
+
+2009-07-10 11:24:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ gio: Remove the experimental status from the GIO plugin
+ Fixes bug #510417.
+
+2009-07-10 11:24:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ gio: Add documentation for the new "not-mounted" and "file-exists" messages
+
+2009-07-09 13:45:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ gio: Make sure that we have the correct stream position when starting
+
+2009-07-08 17:24:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ gio: Make sure to flush the output stream if it shouldn't be closed
+ Otherwise there might still be unwritten data after the element
+ has stopped.
+
+2009-07-08 17:19:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesink.h:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiobasesrc.h:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ gio: Don't close the GIO streams for the giostream{src,sink} elements
+ This makes it possible to do something useful with the streams
+ after the element has stopped. Fixes bug #587896.
+
+2009-07-08 17:19:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/pipelines/gio.c:
+ gio: Try to reuse the pipeline with the same stream objects
+
+2009-07-08 17:02:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ gio: Improve the error message if a stream is already closed before usage
+
+2009-07-08 16:55:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosink.c:
+ gio: Post a custom file-exists message on the bus if the file already exists
+ An application can handle this message, remove the file in question
+ and restart the pipeline again without showing an error.
+ This fixes bug #529300.
+
+2009-07-08 16:54:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosrc.c:
+ gio: Use OPEN_READ instead of NOT_FOUND if a location is not mounted
+
+2009-07-08 16:50:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosink.c:
+ gio: Use OPEN_WRITE instead of OPEN_READ as error category in giosink
+
+2009-07-08 15:52:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiosrc.c:
+ gio: Post a custom "not-mounted" message on the bus
+ This allows applications to mount the GFile if possible and restart
+ the pipeline instead of simply giving an error.
+
+2009-07-08 15:08:32 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * gst/audioconvert/gstchannelmix.c:
+ audioconvert: Fix compilation when debugging is disabled
+ Fixes bug #587980.
+
+2009-07-07 20:23:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesink.h:
+ * ext/gio/gstgiobasesrc.h:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsink.h:
+ gio: Add vfunc for requesting the stream for the sinks too
+
+2009-07-07 20:21:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesink.h:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ gio: Some more random cleanup
+
+2009-07-07 20:20:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgio.c:
+ * ext/gio/gstgiobasesink.c:
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiobasesrc.h:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiosrc.h:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ * ext/gio/gstgiostreamsrc.h:
+ gio: Update my mail address and copyright
+
+2009-07-07 20:18:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/gio/gstgiobasesrc.c:
+ * ext/gio/gstgiobasesrc.h:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiostreamsrc.c:
+ * ext/gio/gstgiostreamsrc.h:
+ gio: General clean up and simplification
+ The GInputStreams are now requested by a vfunc from
+ the subclasses instead of relying that the subclass
+ sets it until it's needed.
+ This might also fix bug #587896.
+
+2009-07-06 22:31:12 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: keep sending newsegments after seeking
+ Adder sends with timestamps from 0 upwards. After seeking we need to send
+ new-segments to get correct positions-queries.
+
+2009-07-06 20:44:00 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/adder.c:
+ adder: make test more robust
+ Add audioconverts to the live-seeking test to make it negotiate.
+
+2009-06-30 17:19:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: use core performance log category
+
+2009-07-05 21:29:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/adder/gstadder.c:
+ adder: Call set_flushing(TRUE) for flushing seeks *when* the streaming is stopped.
+ This ensures that collectpads' cookie is properly updated so that when the streaming
+ threads will restart and be checking for the flushing status of all pads there will
+ be no inconsistent state.
+
+2009-07-05 18:01:38 +0200 Hans-Peter Nilsson <hp@gcc.gnu.org>
+
+ * ext/pango/gstclockoverlay.c:
+ pango: Call tzset() before localtime_r()
+ POSIX and your local friendly ctime(3) manual entry says that localtime_r isn't
+ required to set the state variables that define the current timezone. Indeed,
+ glibc (at least 2.9) doesn't do this for subsequent calls. The effect is that
+ if the system timezone is changed for a running program between two calls to
+ gst_clock_overlay_render_time, it won't be noticed. For glibc, changing the
+ timezone equals /etc/localtime being modified.
+ Fixes bug #587676.
+
+2009-07-01 17:33:14 -0700 David Schleef <ds@schleef.org>
+
+ * ext/Makefile.am:
+ build: remove spurious schroedinger reference
+
+2009-07-01 10:25:43 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/schroedinger/Makefile.am:
+ * ext/schroedinger/gstschro.c:
+ * ext/schroedinger/gstschrodec.c:
+ * ext/schroedinger/gstschroenc.c:
+ * ext/schroedinger/gstschroparse.c:
+ * ext/schroedinger/gstschroutils.c:
+ * ext/schroedinger/gstschroutils.h:
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/gstbasevideocodec.c:
+ * gst-libs/gst/video/gstbasevideocodec.h:
+ * gst-libs/gst/video/gstbasevideodecoder.c:
+ * gst-libs/gst/video/gstbasevideodecoder.h:
+ * gst-libs/gst/video/gstbasevideoencoder.c:
+ * gst-libs/gst/video/gstbasevideoencoder.h:
+ * gst-libs/gst/video/gstbasevideoparse.c:
+ * gst-libs/gst/video/gstbasevideoparse.h:
+ * gst-libs/gst/video/gstbasevideoutils.c:
+ * gst-libs/gst/video/gstbasevideoutils.h:
+ basevideo: send basevideo back to remedial school
+ Move basevideo classes and schroedinger plugin to -bad.
+
+2009-07-01 12:54:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ netaddress: add constant for max len
+
+2009-07-01 12:48:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ netbuffer: add gst_netaddress_to_string
+ Add function to serialize a net address to a string.
+ API: GstNetAddress::gst_netaddress_to_string()
+
+2009-06-30 18:44:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: make fd:// uri use buffering too
+ fd:// usually operate in push mode only and are thus suitable for buffering.
+
+2009-06-30 14:46:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/volume/gstvolume.c:
+ volume: include "1.0=100%" in property description
+
+2009-06-30 14:45:51 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaysink.c:
+ playsink: remove unused property defs
+
+2009-06-29 17:11:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/multichannel.c:
+ multichannel: rewrite the new doc comment a bit
+ Its part of the audio lib.
+
+2009-06-29 14:34:02 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaysink.c:
+ playsink: Avoid a segfault when the video sink fails to start
+ Don't attempt to display the subpictures and segfault when the
+ video sink failed to start (and hence the videochain is NULL).
+
+2009-06-29 15:14:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ ringbuffer: add vmethod to clear the ringbuffer
+ Add a vmethod so that subclasses can be notified when they should clear the data
+ in the ringbuffer.
+
+2009-06-29 14:00:14 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff-media: Fix the fourcc caps property for VC-1/WMVA
+ The caps property for carrying fourccs is 'format', not 'fourcc'
+
+2009-06-29 12:20:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: include in.h for FreeBSD compat
+ Fixes #586920
+
+2009-06-29 12:20:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstapp.def:
+ defs: add defs for new appsink buffer-list method
+
+2009-06-29 12:14:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsink.h:
+ appsink: add docs and signals
+ Add docs for the new callback.
+ Add signals for the new buffer-list support.
+
+2009-06-29 10:24:36 +0200 Branko Subasic <branko@lnxbranko2.se.axis.com>
+
+ * tests/check/elements/appsink.c:
+ Added unit tests for buffer list support in appsink.
+
+2009-06-17 11:12:08 +0200 Branko Subasic <branko@lnxbranko2.se.axis.com>
+
+ * gst-libs/gst/app/gstappsink.c:
+ Added buffer list support.
+
+2009-06-17 09:23:11 +0200 Branko Subasic <branko@lnxbranko2.se.axis.com>
+
+ * gst-libs/gst/app/gstappsink.h:
+ Added buffer list support.
+
+2009-06-29 09:36:27 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: Include winsock2.h after defining WINVER.
+ Similar to bug #587080.
+
+2009-06-29 09:31:40 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Moved a comment.
+
+2009-06-27 23:23:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/multichannel.c:
+ docs: add basic section docs for multichannel and relocate the ones for audio
+ Add section docs for multichannel, so that it has a short desc in the toc too.
+ Move the section docs in adio up, so that the follow the copyright like
+ elsewhere.
+
+2009-06-26 21:11:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/v4l/gstv4lelement.c:
+ * sys/v4l/gstv4lsrc.c:
+ v4l: open/close device in ready.
+ Simillar change like in v4l2src. This allows probing feature in paused, where
+ streaming is noit yet started.
+
+2009-06-10 17:05:22 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix initial volume handling also when reusing the element
+ This is a follow-up to commit 452988, making it work correctly when the audio
+ chain is reused.
+
+2009-06-26 21:48:58 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Define WINVER before including any win headers
+ Fixes bug #587080.
+
+2009-06-27 00:50:54 +0300 René Stadler <mail@renestadler.de>
+
+ * gst-libs/gst/riff/riff-read.c:
+ riff: prevent crash if rounded up tag size exceeds data size
+ When rounding up `tsize' exceeds the remaining buffer size, `size' underflows
+ and an invalid read past the buffer data follows.
+
+2009-06-26 15:17:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/gstbasevideocodec.c:
+ basevideocodec: By default don't allow caps changes on the srcpad
+ This fixed playback of Dirac files with schrodec when upstream wants
+ a different width/height, basevideocodec accepts this and then
+ pushes buffers with new caps but content of the old caps.
+ In the best case this will just result in wrong unit size and a
+ failure in basestransform elements.
+
+2009-06-26 14:11:21 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * 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:41:38 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From f810030 to 5845b63
+
+2009-06-26 13:14:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstscreenshot.c:
+ screenshot: don't leak message
+
+2009-06-25 12:04:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: lower the h264 typefinder's probability
+ A NEARLY_CERTAIN is absolutely not warranted given the kind
+ of things it checks for. Even a LIKELY is probably not entirely
+ appropriate.
+
+2009-06-24 15:13:56 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * common:
+ Automatic update of common submodule
+ From f3bb51b to f810030
+
+2009-06-24 09:48:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for multipart
+ So we get slightly nicer error messages when multipartdemux is missing.
+
+2009-06-23 18:07:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: only unflush when we flushed before
+ Ass suggested by Stefan Kost:
+ Keep track of when the sinkpad was set to flushing and unflush the pad when an
+ upstream flushing seek failed.
+
+2009-06-23 15:10:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: fix leak when the source fails to change state
+
+2009-06-23 12:40:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/subparse/gstssaparse.c:
+ ssaparse: avoid leaking all buffers
+
+2009-06-22 22:18:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/elements/adder.c:
+ adder: test seek handling in adder
+ This tests seeking on an adder that has a normal and a live source connected.
+ Wheter the current behavior is the desired one needs to be discussed still
+ (see #586033)
+
+2009-06-22 16:17:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: pass the xwindow along to not look at the yet unset var.
+ When we call this from xwindow_new, x(v)imagesink->xwindow is not yet set.
+
+2009-06-22 11:40:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ x(v)imagesink: catch tags and show title in own window
+ Refactor the code that sets the window title. Catch tag-events and use title
+ metadata for the window title.
+
+2009-06-21 19:42:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: Name gaussian noise "gaussian-noise" instead of just "gaussian"
+ Also make all the function arrays constant.
+
+2009-06-21 12:27:37 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: Add support for generating gaussian white noise
+ This patch adds support for stationary white Gaussian noise.
+ The Box-Muller algorithm is used to generate pairs of independent
+ normally-distributed random numbers.
+ Fixes bug #586519.
+
+2009-06-20 23:46:28 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Fix NV12 and NV21 transformations
+ Fix some stride problems, fix the nv12 to nv21 direct transformation,
+ and implement a direct conversion to yuv444 to save CPU.
+
+2009-06-20 22:36:21 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Fix NV12 painting for odd strides/heights
+
+2009-06-19 22:16:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ cdparanoia: run-time license is LGPL now that we require cdparanoia 0.10.2
+ cdparanoia has an LGPL v2.1 license since 0.10.1 and we now require 0.10.2.
+ Finally fixes #531035.
+
+2009-06-19 21:25:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ cdparanoia: try to guess a good cache size if it's set to -1
+ Try to guess from the paranoia-mode setting whether playback or
+ ripping is wanted, and use a smaller cache size if we're likely
+ to be doing playback, to avoid a long startup delay. Since this
+ was the value used in older cdparanoia versions, it should be
+ fine in any case. See #586331.
+
+2009-06-19 11:27:40 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * configure.ac:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/cdparanoia/gstcdparanoiasrc.h:
+ cdparanoia: expose cache size setting
+ This setting was added in cdparanoia 10.2. The default value is good
+ for audio extraction, but lower values (previous versions of cdparanoia
+ used 150) are better for realtime playback.
+ Fixes #586331.
+
+2009-06-19 17:43:03 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Make build of schro plugin conditional
+
+2009-06-19 15:52:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ * win32/common/libgstrtp.def:
+ basertppayload: add support for bufferlists
+ Based on patch from Ognyan Tonchev.
+ See #585559
+
+2009-06-19 15:33:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtpbuffer: use new convenience functions
+ New core convenience functions makes the list getters and setters trivial.
+ Maybe even too trivial...
+
+2009-06-18 19:07:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtp.def:
+ defs: add new symbol to win32 defs file
+ Based on patches by Ognyan Tonchev.
+ See #585559
+
+2009-06-18 19:04:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: cleanups, add _list_get_seq() too
+ Clean up the docs a little.
+ Add missing _list_get_seq method.
+ Add new symbols to the docs
+
+2009-06-18 18:47:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * win32/common/libgstrtp.def:
+ rtp: cleanups
+ Add Since tags to docs
+ Move some code around
+ Add win32 symbols
+
+2009-06-18 17:46:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * tests/check/libs/rtp.c:
+ rtp: add bufferlist support
+
+2009-06-18 18:03:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ rtp: pass data to macros instead of GstBuffer
+
+2009-06-18 17:42:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstrtsp.def:
+ win32: Add gst_rtsp_watch_queue_data() to the exports
+ Fix the tests by exporting the new symbol from the win32 dlls
+
+2009-06-18 18:13:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: appname might be NULL
+ Don't set title if appname is unknown.
+
+2009-06-18 17:58:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: set window title from application name
+
+2009-06-09 19:14:00 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ rtsp: Made the parsing of the RTSP URL scheme more generic.
+
+2009-06-15 13:58:26 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Added gst_rtsp_watch_queue_data().
+ gst_rtsp_watch_queue_data() is similar to gst_rtsp_watch_queue_message()
+ but allows for queuing any data block for writing (much like
+ gst_rtsp_connection_write() vs. gst_rtsp_connection_send().)
+ API: gst_rtsp_watch_queue_data()
+
+2009-06-09 16:37:09 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Only extract the session ID from RTSP responses.
+
+2009-06-09 19:06:57 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ rtsp: Added support for parsing IPv6 addresses in RTSP URLs.
+
+2009-06-09 14:31:18 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Use getaddrinfo() to support both IPv4 and IPv6.
+
+2009-06-17 15:37:53 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Improved base64 decoding in fill_bytes().
+ The base64 decoding in fill_bytes() expected the size of the read data to
+ be evenly divisible by four (which is true for the base64 encoded data
+ itself). This did not, however, take whitespace (especially line breaks)
+ into account and would fail the decoding if any whitespace was present.
+
+2009-06-17 14:00:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audiosrc: fix get_offset
+ When we need to jump to the most recently captured sample, jump to where the
+ next sample will be written instead of to some old data.
+ Fixes #581460
+
+2009-06-17 13:18:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: free the ringbuffer when going to NULL
+ Unparent and free the ringbuffer when going to NULL, like we do with the
+ audiosrc element. We can do this now because we correctly manage the time
+ jumping back to 0.
+
+2009-06-17 13:17:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ audio: correctly handle short read/writes
+
+2009-05-05 15:37:54 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: add some extra logging for buffer timestamps
+
+2009-06-17 11:22:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: more seeking fixes.
+ When a seek failed upstream, make sure the adder sinkpad is set unflushing again
+ so that streaming can continue.
+ We only have a pending segment when we flushed.
+ Set the flush_stop_pending flag inside the appropriate locks and before we
+ attempt to perform the upstream seek.
+ Add some more comments.
+ Use the right lock to protect the flags in flush_stop.
+ See #585708
+
+2009-06-17 07:24:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Free iterator after removing all groups
+
+2009-06-16 19:38:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/gstvideofilter.c:
+ videofilter: Add a default get_unit_size function
+ This returns the correct values for all formats that are handled by
+ GstVideoFormat and makes all the custom get_unit_size functions in
+ many elements unnecessary.
+
+2009-06-16 18:57:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: add Timestamp header field
+ fixes #585994
+
+2009-06-16 18:15:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: set smarter target state on uridecodebin
+ Set the target state of the newly added uridecodebins to somthing else that
+ PAUSED so that we keep their state in sync with the playsink state.
+ Fixes #585268
+
+2009-06-16 18:13:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: set the sink flag on the element
+
+2009-06-16 18:09:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add debug message
+
+2009-06-16 14:05:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ audiosink, audiosrc: do the class_ref()s in the right class_init functions
+ Spotted by Philip Jägenstedt. Hopefully fixes #585970 for real.
+
+2009-06-15 15:39:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ audiosink,audiosrc: ref the audio 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-15 12:57:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audiosrc: return FALSE when receiving a SEEK event
+ When receiving a seek event, return FALSE as we don't implement seeking.
+
+2009-06-15 11:06:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ Don't use deprecated GTK API
+ Fixes bug #585758.
+
+2009-06-15 11:40:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: send flush_stop when seeking failed
+ At least do the fix to sent the flush_stop when seeking failed to ensure we
+ keep no pads flushing. before it was send when the seeking worked which is just
+ plain wrong and was not the intention.
+
+2009-06-12 15:17:14 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Use a more consistent naming of GstRTSPRec variables.
+
+2009-06-12 15:11:05 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Call message_sent() callback for all sent messages.
+ Previously the messages_sent() callback was only called for messages
+ which had a CSeq, which excluded all data messages. Instead of using the
+ CSeq as ID, use a simple index counter.
+
+2009-06-14 22:13:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/theora/theoradec.c:
+ * ext/vorbis/vorbisdec.c:
+ oggdemux: post/send tags with the container-format tag
+ For this to work properly, theoradec and vorbisdec need to put
+ tag events received from upstream into the pending_events list
+ so they get pushed out after any newsegment event, not before.
+
+2009-06-14 20:30:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ * tests/old/examples/seek/cdplayer.c:
+ Don't use deprecated GTK API
+ Fixes bug #585758.
+
+2009-06-12 16:31:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/adder/gstadder.c:
+ adder: send flush-stop earlier
+ When no flush-stop has been sent by upstream, we have to send one ourselves to
+ continue playback. Do this as soon as the collect function is called instead of
+ after we possibly pushed segment events (that got then flushed out)
+
+2009-06-12 13:55:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: add shuttle controls
+
+2009-06-12 13:55:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/stepping2.c:
+ example: fix compile
+
+2009-06-12 13:52:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/Makefile.am:
+ examples: build the stepping2 example
+
+2009-06-12 13:52:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: update for new step API
+
+2009-06-12 13:22:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: do reverse seeks more accurate
+ For reverse seeking with the accurate flag set, try to be more precise by
+ seeking a little bit after the requested position.
+
+2009-06-11 22:32:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/ogg/gstogmparse.c:
+ * gst/subparse/gstssaparse.c:
+ * gst/subparse/gstssaparse.h:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/gstsubparse.h:
+ subparse, ogmparse: post tags with GST_TAG_SUBTITLE_CODEC
+ Make subtitle parsers post a taglist with codec tags, so the application
+ knows what kind of subtitle a subtitle stream is. Fixes #576552.
+
+2009-06-11 19:12:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ ringbuffer: handle border cases in resampler
+
+2009-06-11 13:28:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ docs: Update common. Use upload-doc.mak instead of upload.mak
+
+2009-06-11 12:39:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ docs: fix typo
+
+2009-06-11 12:17:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: reset accum when dropping samples
+ When we are resampling and we drop samples because we paused, reset the accum
+ counter because it's now invalid.
+
+2009-06-11 11:16:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/video/gstbasevideodecoder.h:
+ docs: Fix a couple of warnings from the docs build.
+
+2009-06-10 21:36:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/testchannels.c:
+ Don't include config.h multiple times when build audio testchannel app.
+ Fixes build problem on win32 (#585075).
+
+2009-06-10 16:56:51 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ playbin2/uridecodebin: Fix connection-speed propagation
+ uridecodebin expects the passed connection-speed value in kbps, so we
+ need to divide the value stored in bps by 1000. Also, lower the upper
+ limit on the properties to the value that we can actually store in our
+ internal guint (which is plenty high enough)
+
+2009-06-10 14:37:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/subparse/gstsubparse.c:
+ * tests/check/elements/subparse.c:
+ subparse: recognise more subrip timestamp variants
+ Be even less restrictive in what we accept for .srt timestamps when
+ typefinding and parsing subrip subtitles and add a unit test for
+ the 'new' format. Fixes #585197.
+
+2009-06-09 22:00:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ rtsp: add some more docs
+
+2009-06-09 18:24:55 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: Avoid a compiler warning.
+
+2009-06-09 18:23:28 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: Updated documentation for GstRTSPResult.
+ Moved GST_RTSP_ELAST to be last in the documentation to match the actual
+ enum values.
+
+2009-05-20 17:30:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ autogen: remove -Wno-portability from here
+ as it is in configure.ac now.
+
+2009-06-09 16:28:20 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Plug a memory leak.
+ Free memory related to any partially read and/or written RTSP messages.
+
+2009-06-09 12:09:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: no need to cause discont when clipping
+ Remove the discont-when-clipping hack now that basesink provides us with
+ correctly clipped samples when stepping.
+
+2009-06-08 17:26:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: don't align when we clip
+ Don't align samples when they were clipped. Not entirely correct but better than
+ nothing for now.
+
+2009-06-08 16:41:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/.gitignore:
+ * tests/examples/seek/stepping2.c:
+ examples: add stepping example in PLAYING
+ Add stepping example in PLAYING, audio is a bit distorted because basesink does
+ not provide good clipping info yet.
+
+2009-06-08 10:25:00 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: Add description for hdv/aux-* formats.
+
+2009-06-07 22:20:33 +0400 LRN <lrn1986@gmail.com>
+
+ * ext/schroedinger/Makefile.am:
+ Added libgstbase to schro's LIBADD
+ Fixes #585079
+
+2009-06-06 02:15:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ libgsttag: don't extract genres from empty ID3v1 tags
+ If we don't have any other info, don't try to interpret the
+ genre field. In particular we don't want to interpret a genre
+ of 0 as 'Blues' if no other fields are set and the entire tag
+ is just empty.
+
+2009-06-05 18:13:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: make sure varargs are of right type
+ Explicitly cast the variables to g_object_set to their right types.
+
+2009-06-05 16:49:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: increase stream probing queues
+ When we are probing for streams, we want to set the queue size in such a way
+ that we can scan a maximum amount of data without consuming too much memory.
+ Therefore, remove the time limit on the queue and only stop scanning after 2MB
+ of data.
+ See #584104.
+
+2009-06-05 14:06:17 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Fixed a typo.
+
+2009-06-05 14:05:54 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Remove an unused variable.
+
+2009-06-05 13:59:14 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Removed duplicate initialization of conn->writefd.
+
+2009-06-05 13:55:08 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Use #defined status codes.
+
+2009-06-05 13:53:29 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Correct gen_tunnel_reply().
+ Prevent gen_tunnel_reply() from generating an incomplete response
+ in case an error response code is given.
+
+2009-06-05 10:57:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/video-enumtypes.c:
+ configure: remove AC_C_INLINE which is not needed and causes problems with MSVC
+ See #584835. Also update win32 files while we're at it.
+
+2009-06-04 08:57:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: API: Add {audio,video,text}-tags-changed signals
+ Fixes bug #584686.
+
+2009-06-03 20:42:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: don't put invalid bitrate values into the taglist
+ Bitrates are stored as 32-bit signed integers in the vorbis
+ identification headers, but seem to be read incorrectly,
+ namely as unsigned 32-bit integers, into the vorbis structure
+ members which are of type long, which makes our check for
+ values <= 0 fail with files that put -1 in there for unset
+ values.
+
+2009-06-03 15:52:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/.gitignore:
+ ignore: add new stepping app to ignore
+
+2009-06-03 15:31:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/Makefile.am:
+ * tests/examples/seek/stepping.c:
+ examples: add stepping example.
+ Add an example of using playbin2 and frame stepping to simulate variable rate
+ playback based on a sine wave.
+
+2009-06-03 12:45:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: also set custom text and subp sinks
+ Set the custom subpicture and text sinks along with the custom audio and video
+ sinks when needed.
+ Fix a little docs blurb too.
+
+2009-06-02 12:10:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: add G_LIKELY because we can
+
+2009-06-02 09:53:05 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: Fix caps for ogg typefinder.
+
+2009-05-29 11:10:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ docs: remove some cruft from -sections.txt file
+
+2009-06-01 11:31:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * tests/examples/seek/seek.c:
+ add framestepping to playbin2 and seek
+
+2009-06-01 09:59:22 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Avoid compiler warnings with -Wextra.
+
+2009-06-01 09:58:27 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: Include gst/gstconfig.h to make sure GST_PADDING is defined.
+
+2009-06-01 09:43:04 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ sdp: Remove an unused variable.
+
+2009-05-30 14:17:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add a lot more conversions from/to 16 bit grayscale
+
+2009-05-29 00:09:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Have playbin recognise PGS subpicture streams
+ Recognise PGS subpicture streams and connect them to the SPU pad
+ in playsink. Unfortunately this fails badly with negotiation errors
+ if the SPU is not recent enough to support the stream. I'm not sure
+ how to add format negotiation in yet.
+
+2009-05-21 23:11:29 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gsturidecodebin.c:
+ decodebin/uridecodebin: Recognise subpicture/x-pgs pads and output them.
+
+2009-05-28 20:37:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix volume handling for audio sinks without "volume" property
+ When using an audio sink without a "volume" property, volume control
+ would only work for the first song. For the next song, we'd try to
+ re-use the existing audio chain, but inadvertently set chain->volume
+ to NULL instead of to the existing volume element.
+
+2009-05-28 17:05:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: cosmetic change to avoid unnecessary line breaks
+ Looks nicer and works around gst-indent silliness.
+
+2009-05-28 17:21:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: don't lose the ref to the volume element
+ Only release the ref to the volume element when it is controled by a sink. For
+ software volume we never have to fear that it will change.
+
+2009-05-28 15:21:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ playbin2: actually use configured audio/video sinks
+ playbin2 inadvertently used autoaudiosink and autovideosink up to now,
+ since it would overwrite the sinks configured via the "audio-sink"
+ and "video-sink" properties with the stream-specific group sinks when
+ configuring the outputs. Those are usually NULL however, so that would
+ overwrite the configured sinks with NULL which makes playbin2 then
+ default to the auto sinks. Fix this by keeping a reference to each
+ configured sink in playbin2 and setting up the right sinks depending
+ on whether there is a stream-specific sink or not.
+ Fixes #584020.
+
+2009-05-27 17:37:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/seek/seek.c:
+ seek: add volume label and sync with sink volume
+ Look at the volume and have the pulsemixer open at same time. Unfortunately
+ playbin2 does not emit notify on volume right, so this polls for now.
+
+2009-05-27 18:12:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: remove leftover elements
+ Remove all of the elements inside decodebin2 when goint to READY and NULL.
+ Makes decodebin2 reusable.
+ Fixes #583750
+
+2009-05-27 15:36:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2; release refs to volume/mute properties
+ Release the refs to the volume and mute property elemens before setting the
+ child elements to READY or NULL.
+ Fixes #583318
+
+2009-05-27 12:10:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gdp/gstgdppay.c:
+ gdppay: set caps on outgoing buffers
+ Set caps on outgoing buffers because NULL caps confuse basetransform.
+ Fixes #583867
+
+2009-05-27 11:08:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ netbuffer: also note the order of IP4 addresses
+ IP4 addresses are also stored in network byte order. Make a note of this in the
+ docs.
+
+2009-05-26 22:43:34 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * ext/theora/theoraparse.c:
+ theoraparse: fix assertions in make_granulepos when using the new theora granulepos mapping. Fixes #583903.
+
+2009-05-26 11:13:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Revert "rtspconnection: don't use GLib-2.16 API, we require only 2.14"
+ This reverts commit 418760cf740332c12c3fd9cf3244af134fa9534b.
+ We now require GLib 2.16.
+
+2009-05-26 15:18:09 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Update common
+
+2009-05-26 15:37:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ netbuffer: document that the port is network order
+ Document the fact that we store the port number in network order in
+ GstNetAddress and that the caller should byteswap appropriately.
+
+2009-05-26 15:23:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ * gst/videoscale/vs_image.c:
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_scanline.c:
+ * gst/videoscale/vs_scanline.h:
+ videoscale: Add support for 16 bit grayscale in native endianness
+
+2009-05-26 14:58:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Add support for 16 bit grayscale in little/big endian
+
+2009-05-26 14:38:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ videotestsrc: Add support for 16 bit grayscale in native endianness
+
+2009-01-21 12:33:59 +0100 Andy Wingo <wingo@oblong.net>
+
+ add can-activate-pull property to baseaudiosink
+ * gst-libs/gst/audio/gstbaseaudiosink.c: Add can-activate-pull property
+ to baseaudiosink.
+
+2009-05-26 13:14:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: fix boundary case for seeking.
+ When we have exactly 0 bytes left to search, make sure we stop instead of going
+ into an infinite loop.
+
+2009-05-26 11:11:03 +0200 Bastien Nocera <hadess at hadess.net>
+
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/cdda/sha1.c:
+ * gst-libs/gst/cdda/sha1.h:
+ cddabasesrc: Remove copy of sha1 digest
+ Remove our copy of sha1 digest now that we depend on glib 2.16.
+ Fixes #536313
+
+2009-05-25 17:54:01 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gst-plugins-base.spec.in:
+ Update spec file
+
+2009-05-23 00:33:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/video/gstbasevideodecoder.c:
+ * gst-libs/gst/video/gstbasevideoparse.c:
+ * gst-libs/gst/video/gstbasevideoutils.c:
+ * gst-libs/gst/video/gstbasevideoutils.h:
+ * win32/common/libgstvideo.def:
+ video: don't expose internal gst_adapter_get_buffer() helper function
+ If it's really needed it should go into GstAdapter in core.
+
+2009-05-22 21:29:51 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/gstbasevideodecoder.c:
+ basevideo: Fix memleak
+
+2009-05-22 21:27:58 -0700 David Schleef <ds@schleef.org>
+
+ * ext/schroedinger/gstschrodec.c:
+ * ext/schroedinger/gstschroparse.c:
+ schro: Fix usage of adapter_masked_scan_uint32
+ Because *somebody* changed the API without telling me.
+
+2009-05-22 21:25:06 -0700 David Schleef <ds@schleef.org>
+
+ * ext/schroedinger/gstschro.c:
+ schro: Change package name to GST_PACKAGE_NAME
+
+2009-05-22 17:34:10 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/gstbasevideoencoder.c:
+ basevideo: Add preset interface to encoder
+
+2009-05-22 17:31:14 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ Run liboil benchmark multiple times
+ The statistics function requires multiple runs, otherwise
+ it causes a divide by zero error.
+
+2009-05-22 19:36:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * m4/gst-fionread.m4:
+ m4: fix 'suspicious cache value' warning for gst-fionread.m4
+ .. here as well (should really be moved to common, but I'm too lazy).
+
+2009-05-22 17:41:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: detect and report errors better
+ Check the return values of a couple more libvorbis functions and post an error
+ when something is wrong instead of continuing and crashing.
+
+2009-05-22 15:49:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix initial volume and mute handling
+ Use two flags to remember volume/mute changes at times when we don't have the
+ audiochain yet (e.g. construction). Only set values when they were actualy
+ changed. This makes pulseaudio's stream restore functional.
+
+2009-05-22 10:19:51 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From d3a8fab to 888e0a2
+
+2009-05-22 09:03:22 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstvideo.def:
+ win32: Remove gst_adapter_masked_scan_uint32 from the exports
+
+2009-05-21 10:48:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: improve debug message
+
+2009-05-19 18:10:55 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * gst-libs/gst/tag/gstid3tag.c:
+ gstid3tag: Don't extract a track number unless present.
+ In ID3v1, a track number is present only if byte 125 is null AND
+ byte 126 is non-null. If the track number is not present, don't add
+ a track number tag with value 0.
+
+2009-05-20 00:48:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/video/gstbasevideoutils.c:
+ * gst-libs/gst/video/gstbasevideoutils.h:
+ videoutils: remove adapter methods
+ Remove adapter methods now that they are in core.
+
+2009-05-20 00:42:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstvideo.def:
+ defs: add new symbols
+
+2009-05-19 17:47:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ autogen: pass -Wno-portability to automake to suppress warnings
+ GNU make is needed.
+
+2009-05-19 02:28:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/.gitignore:
+ gitignore: remove bogus *.sgml wildcard - these files are tracked in git
+
+2009-05-19 18:41:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gsttcpclientsrc.c:
+ tcpclientsrc: this is not a live source
+ Don't mark us as a live source because we are not.
+
+2009-05-19 18:41:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: only send flush_stop when seek failed
+ This is still not the ultimate fix. Added some comment to explain the troubles.
+
+2009-05-19 17:17:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ audiosink: return the return value of wait_preroll
+ Return the value that _wait_preroll() returned instead of always WRONG_STATE.
+
+2009-05-19 16:45:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ adder: send flush_stop to match flush_start
+ Adder was relying that something else sends a flush stop. When using adder with
+ a livesource it was not getting a flush_stop and thus all pads downstream where
+ keept flushing. Mark a pending flush_stop and send it when we are working on
+ the new segment back in the streaming thread.
+
+2009-05-19 16:02:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/seek/seek.c:
+ seek: ui improvements
+ Repaint the window black on expose, as this looks nicer when resizing or using
+ the expander. Also show time after slider, as this saves a whole line (nice on
+ small displays).
+
+2009-04-29 18:36:17 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstdecodebin.c:
+ decodebin: use iterators instead of list
+ The list api is deprecated. Use threadsafe iterators instead.
+
+2009-05-19 15:35:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: configure caps on decodebin2
+ Implement the caps property by setting the configured caps on new decodebin2
+ objects.
+ Fixes #582749
+
+2009-05-19 15:34:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: avoid some _caps_ref in some cases
+ Only mess with the caps refcount when we configure different caps.
+
+2009-05-19 15:27:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: fix potential caps leak
+ Free the user-configured caps in finalize.
+
+2009-05-19 15:20:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: add queue after cdda://
+ Add a queue2 after the raw output pads of certain sources such as those for uris
+ like cdda://
+ No tuning of the queue is done yet as the defaults seem to work fine for me.
+ Fixes #582528
+
+2009-05-19 12:45:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: don't loop when at EOS
+ When we try to read the last page, don't try to read past the upper boundary, as
+ this might cause endless loops.
+ See #582942
+
+2009-05-19 11:20:19 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Don't drain remaining buffers after a flush.
+ If we were resetted (due to a flush), we can not drain the remaining
+ buffers since they would be pushed before a valid new newsegment event.
+
+2009-05-18 22:29:07 -0700 Michael Smith <msmith@syncword.(none)>
+
+ * ext/theora/theoradec.c:
+ theoradec: for 4:2:2, use Y42B (planar) rather than a packed format.
+
+2009-05-19 01:13:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: add more logging and return value checking
+
+2009-05-19 01:11:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: handle the return value from iterator_fold
+
+2009-05-19 01:03:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: use the pad in logging as objects
+ Helps to differenciate between source and sinks pads.
+
+2009-04-21 22:54:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/seek/seek.c:
+ seek: use parser for mp3 and rename variable
+
+2009-05-18 11:08:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: add playbin2 options in expander
+ Add the playbin2 stream selection options inside an expander to preserve some
+ space on screen.
+
+2009-02-10 15:29:10 -0800 David Schleef <ds@schleef.org>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add support for v210 and v216 formats
+
+2009-05-15 16:21:15 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/gstbasevideocodec.c:
+ * gst-libs/gst/video/gstbasevideodecoder.c:
+ * gst-libs/gst/video/gstbasevideoencoder.c:
+ * gst-libs/gst/video/gstbasevideoparse.c:
+ video: remove // comments
+
+2009-05-15 16:18:18 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add Y444, v210, v216 formats
+
+2009-05-15 16:12:37 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/schroedinger/Makefile.am:
+ * ext/schroedinger/gstschro.c:
+ * ext/schroedinger/gstschrodec.c:
+ * ext/schroedinger/gstschroenc.c:
+ * ext/schroedinger/gstschroparse.c:
+ * ext/schroedinger/gstschroutils.c:
+ * ext/schroedinger/gstschroutils.h:
+ schro: Move schro plugin from Schroedinger
+ Previous history is in Schroedinger. Depends on, and is an example
+ of using, GstBaseVideo* base classes.
+ Code was reindented, and an #ifdef HAVE_ENCODER removed.
+
+2009-05-15 10:23:08 -0700 David Schleef <ds@schleef.org>
+
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/gstbasevideocodec.c:
+ * gst-libs/gst/video/gstbasevideocodec.h:
+ * gst-libs/gst/video/gstbasevideodecoder.c:
+ * gst-libs/gst/video/gstbasevideodecoder.h:
+ * gst-libs/gst/video/gstbasevideoencoder.c:
+ * gst-libs/gst/video/gstbasevideoencoder.h:
+ * gst-libs/gst/video/gstbasevideoparse.c:
+ * gst-libs/gst/video/gstbasevideoparse.h:
+ * gst-libs/gst/video/gstbasevideoutils.c:
+ * gst-libs/gst/video/gstbasevideoutils.h:
+ video: Copy BaseVideo classes from Schroedinger
+
+2009-05-15 23:05:45 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: add num-fds property
+ multifdsink::num-fds
+
+2009-05-15 20:36:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add descriptions for 3GP, JPEG 2000 and Motion JPEG 2000
+
+2009-05-14 11:44:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/vorbis/vorbisenc.c:
+ vorbisenc: Implement Preset interface
+
+2009-05-14 11:43:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/theoraenc.c:
+ theoraenc: Implement Preset interface
+
+2009-05-14 11:41:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: Implement Preset interface
+
+2009-05-14 21:37:22 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: Fix cdda:// playback
+ Don't send async-start when the playsink has already been configured
+ before changing state.
+
+2009-05-14 01:31:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: require core CVS for gst_adapter_prev_timestamp()
+ which is used in the libvisual plugin.
+
+2009-04-22 18:34:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * AUTHORS:
+ AUTHORS: fix my email
+
+2009-04-22 18:35:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ audioclock: make our internal time monotonic
+ Make the internal time increase monotonically.
+
+2009-05-13 19:27:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: remove next_ts variable
+ We can remove the next_ts variable as we don't use it anymore.
+
+2009-05-13 19:24:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/libvisual/visual.c:
+ visual: use new adapter timestamp code
+ Use the new adapter timestamp tracking code to make things easier and produce
+ vastly better output timestamps.
+
+2009-05-13 01:35:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/Makevars:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/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: avoid conflicts of local *.po files with files in git
+ Make it so that filenames and line numbers are only stored in the *.pot file
+ (which is not in git), but not in the individual *.po files. This information
+ is hardly useful for translators in our case, and it should avoid the constant
+ conflicts of local *.po files with the ones in git which are caused by the
+ source files changing and the line numbers being updated. This commit might
+ cause one last merge conflict for you, which you can work around with
+ "git checkout po/*.po" before merging or pulling. After that there should
+ (hopefully) not be any more local modifications of these files (unless
+ someone committed additions or changes to translated strings and the
+ *.po files haven't been updated yet, that is).
+
+2009-05-12 23:51:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/audioresample.c:
+ tests: fix audioresample unit test on big endian architectures
+ Don't hardcode endianness=1234 in the filtercaps, it will cause
+ pad link failures which will result in the test timing out.
+
+2009-05-12 17:18:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: fix broken enum nick - it should have a hyphen
+ The enum nick should be 'sine-table', not 'sine table'. Technically this is
+ an API/ABI change I guess, but anyone who was using this and didn't report
+ it deserves this.
+
+2009-05-01 01:04:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ audiotestsrc: seek to the requested byte offset, not the expected byte offset
+
+2009-05-01 01:03:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ audiotestsrc: support more than just one channel
+
+2009-05-12 15:52:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/propertyprobe.h:
+ propertyprobe: Fix typo in the docs
+
+2009-05-12 12:17:55 +0100 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/theora/theora.c:
+ * ext/vorbis/vorbis.c:
+ Add ranks to the Oggmuxer, Vorbis encoder and Theora encoder
+
+2009-04-30 16:37:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: handle invalid timestamps better
+ Handle buffers with -1 timestamps better by keeping track of the en time of the
+ previous buffer and assuming the -1 timestamp buffer goes right after the
+ previous one.
+ when we have two buffers that are equally good, output the oldest buffer once to
+ minimize latency.
+ don't try to calculate latency when the input framerate is unknown.
+
+2009-04-28 11:37:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggmux.c:
+ oggmux: small debug statement in DISCONT
+
+2009-04-28 11:24:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ oggdemux: fix abuse of ogg API, handle broken oggs
+ When we feed the ogg sync layer, we need to feed it contiguous data even if the
+ sync layer did not consume all of it yet. This makes sure that it always finds
+ the next page even for more corrupted files. Use a different read_offset for
+ this purpose. since we now keep track of the sync layer, we don't have to reset
+ after finding a start of a page.
+ Add some more debug info for the error paths.
+ Only reset the sync layer when we perform a seek operation.
+ Avoid failure when the next chain has no bos pages but instead simply ignore it.
+ when we receive unknown page serial numbers mid stream, don't fail but post a
+ warning and hope that we get back on track later.
+ Fixes #579642
+
+2009-04-30 16:41:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: make subpictures a raw output format
+ Subpictures are a raw format, we want those pads exposed so that playbin2 can do
+ the subpicture mixing.
+
+2009-04-27 10:15:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ rtpdepay: add some more comments
+
+2009-04-17 10:54:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ audioclock: make sure values are ever increasing
+
+2009-05-05 17:17:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: make fallback identity silent
+ Set the signal-handoffs to FALSE and silent to TRUE for the fallback identity
+ element so that it consumes less CPU.
+
+2009-04-17 10:57:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ playbin2: handle custom audiosinks differently
+ Keep track of the autoplugged custom sinks and configure them in the playsink
+ element when we have collected all streams.
+ Also make sure that we only select one custom sink.
+ When unreffing the internal sink, we don't need to change the state to NULL.
+
+2009-05-12 10:36:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: unify custom sink get/set functions
+ Use one function to set/get all of the different sink types.
+ cleanup up the subpicture chain too.
+ Allow setting a custom subpicture sink.
+
+2009-05-11 18:29:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/tunernorm.h:
+ interfaces: Seperate some more struct definitions from typedefs
+
+2009-05-11 15:48:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/navigation.h:
+ * gst-libs/gst/interfaces/videoorientation.h:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ interfaces: Seperate some more struct definitions from typedefs
+
+2009-05-10 17:28:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstinterfaces.def:
+ Add new functions to win32 exports
+
+2009-05-10 17:28:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Add new functions to the docs
+
+2009-05-10 17:25:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/mixer.h:
+ interfaces: API: Add gst_mixer_get_mixer_type()
+ This is a convenience function that returns the mixer_type
+ of the interface struct.
+
+2009-05-10 17:25:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.c:
+ interfaces: Add docs for gst_color_balance_get_balance_type()
+
+2009-05-10 11:17:19 +0200 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ * autogen.sh:
+ Run libtoolize before aclocal
+ This unbreaks the build in some cases. Fixes bug #582021
+
+2009-05-07 17:38:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Correctly initialize the background for ARGB too
+
+2009-05-07 16:59:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttextrender.h:
+ textrender: Use libgstvideo functions to create caps
+ Also check if downstream wants ARGB always when we get
+ new caps.
+
+2009-05-07 16:52:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Don't always use ARGB if downstream supports it but take it's preference
+
+2009-05-07 16:48:08 +0200 Kapil Agrawal <kapil@mediamagictechnologies.com>
+
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttextrender.h:
+ textrender: Add support for ARGB and alignment properties
+ Fixes bug #581571.
+
+2009-05-07 16:42:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextrender.c:
+ textrender: Add ; after GST_BOILERPLATE to fix indention
+
+2009-05-07 15:10:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Use text/uri-list as mimetype instead of ---> for URI lists
+
+2009-05-07 14:59:36 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefindfunctions: made mp3_type_find less aggressive
+ mp3_type_find could suggest already when only a single valid header
+ was found, if it ran out of data before the end of the next frame.
+ Therefore, ignore the last found frame if it was incomplete.
+ Fixes bug #579692.
+
+2009-05-07 14:48:29 +0200 John Millikin <jmillikin@gmail.com>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Store cover art in vorbiscomments
+ Fixes bug #513373.
+
+2009-05-07 06:14:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/colorbalance.h:
+ interfaces: API: Add gst_color_balance_get_balance_type()
+ This is a convenience function that returns the balance_type
+ of the interface struct.
+
+2009-05-06 17:59:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/colorbalancechannel.h:
+ * gst-libs/gst/interfaces/tuner.h:
+ * gst-libs/gst/interfaces/tunerchannel.h:
+ interfaces: Separate struct definitions from typedefs
+
+2009-05-06 14:03:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * pkgconfig/gstreamer-app-uninstalled.pc.in:
+ Fix libdir for uninstalled gstreamer-app library
+
+2009-05-12 01:59:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/descriptions.c:
+ pbutils: add description for APE tag caps
+
+2009-05-12 01:35:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump core requirement to last release
+ as that's more likely to be true than that we need
+ only 0.21.1.
+
+2009-05-12 01:21:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * configure.ac:
+ configure: rename CVS -> git in a couple of places
+
+2009-05-12 01:17:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump GLib requirement to GLib >= 2.16
+ as per the New Regime (see wiki).
+
+2009-05-01 00:09:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: cache events from upstream and re-send them once we have a source pad
+ Makes sure tags don't get dropped when we have multiple tag demuxers in a row.
+ Fixes #580318.
+
+2009-05-07 14:07:44 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: support UYVY raw 4:2:2 in riff.
+
+2009-05-11 21:20:07 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ Back to development -> 0.10.23.1
+
+2009-04-27 22:42:55 -0700 Michael Smith <msmith@syncword.(none)>
+
+ * ext/theora/theoradec.c:
+ theoradec: fix buffer overrun on 422 decode.
+
+2009-04-27 21:39:01 -0700 Michael Smith <msmith@syncword.(none)>
+
+ * ext/theora/theoradec.c:
+ theoradec: 444 support.
+
+2009-04-27 21:30:04 -0700 Michael Smith <msmith@syncword.(none)>
+
+ * ext/theora/theoradec.c:
+ theoradec: handle 422 images (as YUY2).
+
+2009-04-27 21:01:51 -0700 Michael Smith <msmith@syncword.(none)>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c:
+ theoradec: rearrange code in preparation for 422 and 444 support.
+
+=== release 0.10.23 ===
+
+2009-05-10 23:57:01 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ Release 0.10.23
+
+2009-05-10 23:56:05 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/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:
+ Update .po files
+
+2009-05-08 20:32:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.22.6 pre-release
+
+2009-05-08 13:09:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix resume after pause
+ Don't ignore the state change of the children, they might be doing an ASYNC
+ state change.
+
+2009-05-08 11:05:41 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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:
+ 0.10.22.5 pre-release
+
+2009-05-07 22:01:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcp-marshal.list:
+ multifdsink: fix signature of the add-full signal
+ The second parameter is a GstSyncMethod enum, not a boolean.
+
+2009-05-07 15:19:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: initialize variable too
+
+2009-05-07 14:28:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: make playsink go ASYNC to PAUSED
+ Make playsink go async to the PAUSED state instead of relying on uridecodebin
+ for async behaviour in playbin. This solves some problems (mainly with DVD)
+ where the pipeline would go to PLAYING before preroll completed, failing to
+ select the audiosink clock.
+ Fixes #581727
+
+2009-05-06 16:09:52 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.22.4 pre-release
+
+2009-05-06 13:19:34 +0100 Zaheer Merali <zaheerabbas@merali.org>
+
+ * ext/theora/theoraenc.c:
+ * ext/vorbis/vorbisenc.c:
+ vorbisenc, theoraenc: Ensure gp is computed consistently + clip to segment
+ With vorbisenc, compute the granulepos with running time and clip incoming
+ buffers to segment.
+ With theoraenc, drop out of segment buffers.
+
+2009-05-01 16:47:53 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Fix buffer size transformations
+ When calculating the input/output buffer sizes in the transform_size function,
+ take the number of channels into account, so we don't end up calculating
+ a buffer size that only contains a partial number of audio frames.
+ Also, when going from output size to input size, round down rather than
+ up, so as to calculate the minimum number of samples that *might* yield
+ a buffer of the intended destination size.
+ Fixes: #580470 and #580952
+
+2009-04-29 16:45:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/vorbis/gstvorbisenc.h:
+ * ext/vorbis/vorbisenc.c:
+ vorbisenc: Ensure output buffers fall within the segment
+ Add the start position of the first segment to the running time
+ used to generate buffer timestamps in vorbisenc. This avoids generating
+ buffers which fall outside the initial segment. The element segment
+ handling requires more extensive fixing, but this at least prevents
+ regressions. Fixes: #580020
+
+2009-04-29 11:18:42 +0200 Andy Wingo <wingo@oblong.net>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ Revert "add can-activate-pull property to baseaudiosink"
+ This reverts commit c4074a2ee4f1e6cac734a145bf675bbb16fac985.
+
+2009-04-29 11:18:33 +0200 Andy Wingo <wingo@oblong.net>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ Revert "[baseaudiosink] add docs for can-activate-pull"
+ This reverts commit 416ce16f26b39c76ab35e1ef6a75dc41ec69f75b.
+
+2009-04-28 18:48:33 +0200 Andy Wingo <wingo@oblong.net>
+
+ [baseaudiosink] add docs for can-activate-pull
+ * gst-libs/gst/audio/gstbaseaudiosink.c: Add documentation for
+ can-activate-pull.
+
+2009-01-21 12:33:59 +0100 Andy Wingo <wingo@oblong.net>
+
+ add can-activate-pull property to baseaudiosink
+ * gst-libs/gst/audio/gstbaseaudiosink.c: Add can-activate-pull property
+ to baseaudiosink.
+
+2009-04-28 11:32:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/videorate/gstvideorate.c:
+ * gst/videorate/gstvideorate.h:
+ videorate: clear discont on duplicated buffers
+ When videorate duplicates a buffer with a DISCONT flag, it copies the discont on
+ the first pushed buffer but fails to clear it for subsequent buffers. This
+ causes theoraenc!oggmux and possibly other elements to consider this a discont
+ stream.
+ Fix videorate to produce discont as the first buffer and after a flushing seek.
+ Fixes #580271.
+
+2009-04-24 18:13:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/Makefile.am:
+ check: Disable the playbin2 for this release, as it is a bit racy.
+ Disable the test, as per the discussion in #580120. Needs re-enabling
+ after the release, when playbin2 is fixed.
+
+2009-04-23 08:41:19 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: Don't reduce max-size-time of exposed groups. Fixes #579912
+ The 2s limit is way too small for a lot of files (which have an interleave
+ in time of between 3 and 5s). Instead, leave it to the initial 5s value
+ and reduce the other limits (allowing us to stay memory-efficient).
+
+2009-04-21 21:06:59 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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:
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ 0.10.22.3 pre-release
+
+2009-04-21 20:41:23 +0100 René Stadler <mail@renestadler.de>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Fix unused variable in compilation with --disable-gst-debug
+ Fixes: #579668
+
+2009-04-21 22:12:28 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From b3941ea to 6ab11d1
+
+2009-04-21 20:57:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybasebin.c:
+ playbin: only use raw_decoding_mode when it's true
+ First check the pad caps if they are raw before setting the raw_decoding_mode to
+ TRUE. Fixes playback of transport streams and other streams that require large
+ queues.
+ Fixes #579734
+
+2009-04-19 18:15:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * tests/check/libs/cddabasesrc.c:
+ cddabasesrc: fix posting of discid tags after MERGE_MODE_REPLACE_ALL changes in core
+ Don't use REPLACE_ALL merge mode when that's not really what we want,
+ as now that REPLACE_ALL actually does what it's supposed to do in
+ core, we drop tags we wanted to keep, such as the various disc id
+ tags. Add unit test for this as well. Fixes #579463.
+
+2009-04-17 10:34:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: don't use GLib-2.16 API, we require only 2.14
+ Fixes #579267.
+
+2009-04-17 10:55:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: don't unparent the ringbuffer
+ when going to NULL, don't unparent the ringbuffer because we don't support going
+ back to 0 very well yet.
+ Fixes #579203
+
+2009-04-17 10:53:10 +0200 Olivier Crete <tester at tester.ca>
+
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ RTCP: don't fail when retrieving invalid PT
+ We can't meaningfully assert on valid packet types so just return the type as it
+ is. Update the comments to reflect this.
+ Fixes #579192.
+
+2009-04-16 12:12:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/app/gstappsink.h:
+ * gst-libs/gst/app/gstappsrc.h:
+ app: add trivial cast macros
+ Add trivial cast macros for appsrc and appsink. Mark them as being since 0.10.23
+ and add the macros to the standard macros in the docs.
+ Fixes #579130
+
+2009-04-16 12:09:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ pkgconfig: add the app/ directory to Libs
+ Add the appsrc/appsink directory to the Libs in the uninstalled
+ pkgconfig file so that one can build against it.
+ Fixes #579129
+
+2009-04-15 22:59:31 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ 0.10.22.2 pre-release
+
+2009-04-15 22:56:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ ChangeLog: regenerate changelog with the gen-changelog script
+
+2009-04-16 00:41:13 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/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: Update po files from TP
+
+2009-04-16 00:40:59 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/interfaces-enumtypes.h:
+ * win32/common/video-enumtypes.c:
+ win32: Update win32 build files
+
+2009-04-16 00:31:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/video.c:
+ check: Add GST_VIDEO_FORMAT_YVYU to the test so it passes.
+
+2009-04-16 00:31:00 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/playbin2.c:
+ check: Fix the input uri in playbin2 test.
+ Don't try and use a random file in wim's home directory as a test input
+
+2009-04-15 15:35:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.h:
+ video: Fix typo in the docs
+
+2009-04-15 14:53:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add support for YVYU YUV colorspace
+
+2009-04-15 00:17:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * gst-libs/gst/fft/gstfft.c:
+ docs: fix hyperlink and move fft attribution to the right place
+
+2009-04-15 00:02:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ log: use G_GUINT64_FORMAT instead of llu
+
+2009-04-14 18:31:52 +0200 Josep Torra <n770galaxy at gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ RTSP: add missing headers for WMS RTSP
+ Add missing headers related to Windows Media RTSP extension.
+ Fixes #578942
+
+2009-04-14 18:16:37 +0200 Olivier Crete <tester at tester.ca>
+
+ * docs/design/draft-keyframe-force.txt:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theoraenc: implement upstream keyframe force
+ Implement handling of upstream keyframe forcing.
+ Update the design documents too.
+ Fixes #578656
+
+2009-04-14 17:31:31 +0200 Olivier Crete <tester at tester.ca>
+
+ * ext/theora/theoraenc.c:
+ theoraenc: factor out keyframe forcing
+ See #578656
+
+2009-04-14 17:01:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * AUTHORS:
+ * gst-libs/gst/fft/gstfft.c:
+ Give credit to Mark Borgerding (kissfft author)
+ and add myself to AUTHORS as well. Fixes #575638.
+
+2009-04-14 17:04:06 +0200 Jan Urbanski <j.urbanski at students.mimuw.edu.pl>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ multifdsink: add property to resend streamheaders
+ Adds a new property in multifdsink, resend-streamheader.
+ If this property is false, the multifdsink will not send the streamheader if
+ there's already one set for a particular client.
+ There are some formats in which every stream needs to start with a certain
+ blob, but you can't inject this blob at leisure. If the producer wants to
+ change the blob in question and sets in as the streamheader on the outgoing
+ buffers' caps, new clients of multifdsink will get the new streamheader, but
+ old clients will break, because they'll see the blob in the middle of the
+ stream.
+ The property is true by default, so existing code will not see any difference.
+ Fixes #578118.
+
+2009-04-14 16:53:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ multifdsink: add property to handle client write
+ Add a property to disable listening to client writes. This property is usefull
+ when other code will deal with reading from the client socket.
+ API: GstMultiFdSink::handle-read property
+
+2009-04-14 16:45:20 +0200 Johann Prieur <johann.prieur at gmail.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ * win32/common/libgstrtp.def:
+ RTCP: add beginnings of Feedback messages
+ Add the beginnings of parsing and constructing Feedback messages.
+ Fixes #577610.
+
+2009-04-14 13:51:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: clear the target
+ Clear the target of our ghostpads before we remove the pad from the element.
+ This to make sure that the internal pad is not left linked to whatever pad we
+ were ghosted to. This should only be a problem when we leak the ghostpads.
+ Also release our subpicture pads.
+ Fixes #577288.
+
+2009-04-14 12:10:30 +0100 Hannes Bistry <hannesb@gmx.net>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: fix mouse pointer offsets in navigation event if window is smaller than the image
+ Fixes #570768.
+
+2009-04-14 13:16:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ baseaudiosrc: adjust the internal timestamp
+ Adjust the internal timestamp before comparing it against the adjusted clock
+ time.
+ Fixes #578506
+
+2009-04-14 13:12:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: use new clock time methods
+ Use the unadjusted internal clock times to calculate the internal/external
+ offset when calibrating the clock.
+ When going to NULL, unparent and free the ringbuffer, like we do in the source
+ element.
+ See #578506
+
+2009-04-14 13:08:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * win32/common/libgstaudio.def:
+ audioclock: add methods for the internal offset
+ Add two methods for getting the unadjusted time of the clock and one for
+ adjusting an internal time. We will need these methods for correctly handling
+ the time after a gst_audio_clock_reset().
+ Add a debug category and some debug lines to the audio clock.
+ API: gst_audio_clock_get_time()
+ API: gst_audio_clock_adjust()
+ API: GST_AUDIO_CLOCK_CAST()
+
+2009-04-14 11:34:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: fix up the debugs and warnings
+ Use _OBJECT variants because we can. Go over some log statements and put them in
+ the right category.
+ Fixes #567740.
+
+2009-04-12 22:26:33 +0200 Luca Ognibene <luca.ognibene at gmail.com>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: fix error in sync-method
+ Multifdsink did not handle sync-method=latest-keyframe correctly when the
+ soft-limit is set to -1 (unlimited).
+ Fixes #578583.
+
+2009-04-10 21:49:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: use the internal clock time
+ We can't assume that the internal clock time is the same as the function we
+ installed on our provided clock because somebody might have changed it.
+
+2009-04-10 14:12:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: handle clock-lost messages
+ When we receive a clock-lost message we need to pause and play to select a new
+ clock.
+
+2009-04-10 13:44:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/playbin2.c:
+ check: add a unit test for playbin2
+ Add unit test for playbin2 and include the refcount test in #577794.
+
+2009-04-10 13:42:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix refcounting of visualisations
+ See #577794.
+
+2009-04-10 13:27:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playsink: fix refcounting of custom elements
+ Sink the custom sinks, let other elements we create be sunken by the bin we add
+ them to.
+ Fixes #577794.
+
+2009-04-10 12:27:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/appsink.c:
+ check: fix appsink test
+ Fix the appsink test now that the method signature changed.
+
+2009-04-10 12:26:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: handle missing input-selector
+ Gracefully degrade and disable stream selection when input-selector is
+ missing.
+
+2009-04-09 23:46:17 +0200 Martin Samuelsson <martin.samuelsson at axis.com>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsink.h:
+ appsink: make callbacks return GstFlowReturn
+ Make the new_buffer and new_preroll callbacks return a GstFlowReturn so that
+ errors can be reported properly.
+ Fixes #577827.
+
+2009-04-09 18:04:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ ringbuffer: allow for custom commit functions
+ Allow subclasses to override the commit method.
+
+2009-04-08 18:04:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ baseaudiosink: fix a small glitch after pause
+ After we pause the stream and interrupt the writeout to the ringbuffer, also adjust
+ the amount of output samples we consumed. We can't do this reliably with the
+ current API when we are doing trick modes but we can do the right thing for
+ normal playback.
+
+2009-04-08 16:43:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: better error message on sink failure
+ If we could create the sinks, but the don't work, don't send the missing plugin
+ message and report that the state-changed failed.
+
+2009-04-07 22:38:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ audiofilter: don't leak pad-template
+ gst_element_class_add_pad_template() does not take ownership.
+
+2009-04-04 21:18:38 +0300 Felipe Contreras <felipe.contreras@gmail.com>
+
+ * common:
+ Automatic update of common submodule
+ From d0ea89e to b3941ea
+
+2009-04-04 16:28:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/interfaces/navigation.c:
+ * sys/v4l/v4lsrc_calls.c:
+ navigation/v4l: Don't use g_return_val_if_fail for computed/used values.
+
+2009-03-22 09:46:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/theora/theoradec.c:
+ theoradec: return GST_CLOCK_TIME_NONE for negative framecounts.
+ This fixes most seeking issues when used with gnonlin.
+ Fixes #543591
+
+2009-04-04 14:53:42 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From f8b3d91 to d0ea89e
+
+2009-04-03 10:51:42 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: don't leak selector when getting current stream numbers.
+
+2009-04-02 22:28:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: use fully qualified urls when using a proxy
+ Use a fully qualified url when specifying the url for tunneled requests through
+ a proxy.
+ See #573173
+
+2009-03-31 00:54:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/navigation.c:
+ * gst-libs/gst/interfaces/navigation.h:
+ * tests/check/Makefile.am:
+ * tests/check/libs/.gitignore:
+ * tests/check/libs/navigation.c:
+ * win32/common/libgstinterfaces.def:
+ navigation: Extend the navigation interface
+ Add support for a set of standard commands that can be queried and executed to
+ support applications like DVD. Add query construction and parsing functions.
+ Add new messages that can be sent on the bus to provide notifications related
+ to commands, multiangle changes, and button highlight activity.
+ Add some helper functions to parse the existing GstNavigation events that
+ elements might receive.
+ Document it all and add unit tests.
+
+2009-02-04 17:03:07 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybasebin.h:
+ playbin: Add simple 'raw decoding mode'.
+ Raw decoding mode removes almost all buffering in video and audio queues
+ when a source providing already decoded video/audio is detected, on the
+ possibly bogus assumption that such a source should provide sufficient
+ internal queueing. Fixes playback on some DVDs, and improves it
+ on all.
+
+2009-04-02 09:27:07 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/.gitignore:
+ ignores: Ignore the videoscale check binary
+
+2009-04-02 12:13:57 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstrtsp.def:
+ win32: Add gst_rtsp_connection_set_proxy to the win32 exports
+
+2009-04-02 10:42:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ext/alsa/gstalsamixer.c:
+ alsamixer: don't forget to release locks in a few places
+ Might fix #576585.
+
+2009-04-02 11:10:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: Don't read over line ends when taking the last Cr or Cb
+
+2009-04-02 10:52:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: Don't write to few pixels and don't mix Cr and Cb
+ Fixes bug #577054.
+
+2009-04-01 15:15:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ * tests/check/elements/audioresample.c:
+ audioresample: fix negotiation so that upstream can actually fixate to downstream's rate
+ If one side has a preference for a particular sample rate or set of sample rates, we
+ should honour this in the caps we advertise and transform to and from, so that elements
+ actually know about the other side's sample rate preference and can negotiate to it
+ if supported. Also add unit test for this.
+
+2009-03-26 19:34:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ docs: add a blurb about redirect messages to playbin2 docs
+
+2009-04-01 09:03:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: fix little typo in the comments
+
+2009-03-31 17:52:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: make gst_rtsp_watch_queue_message() thread-safe
+ People might queue messages from a thread other than the thread in which
+ the main context which this watch is attached is iterated from, so use
+ a GAsyncQueue instead of a GList, so g_list_append() doesn't trample
+ over list nodes just freed in the other thread. This just fixes issues
+ I've had with gst-rtsp-server. We might need more locking in various
+ places here.
+
+2009-03-31 18:13:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: clear the entire builder structure
+ And use structure instead of variable with sizeof when
+ clearing the rtsp message structure, for clarity.
+
+2009-03-31 17:56:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ docs: fix typo in gst_rtsp_message_unset() API docs
+
+2009-03-31 19:00:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: add support for proxies
+ Add suport for proxy servers. Currently only used for tunneled HTTP
+ connections without authentication.
+
+2009-03-31 18:57:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ Revert "rtsp: reset whole message (was sizeof pointer instead of sizeof type)"
+ This reverts commit 79de0b8d67df6fbbe79455adc2e06858295f5c03.
+
+2009-03-26 18:54:56 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: use xcontext->depth instead of bits in attr.max_value for colorkey
+ According to the drivers in http://cgit.freedesktop.org/xorg/driver/ we should
+ format the colorkey depending on xcontext->depth. This is what they will use to
+ interprete the value. The max_value in turn is usualy a constant regardless of
+ the depth.
+
+2009-03-31 12:22:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: reset whole message (was sizeof pointer instead of sizeof type)
+
+2009-03-31 00:56:18 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/interfaces/mixer.c:
+ doc: Fix a typo in the GstMixer docs
+
+2009-03-29 12:01:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Fix linear scaling for one byte components
+ Fixes bug #577054.
+
+2009-03-29 11:53:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: Fix 4tap scaling of YUYV and friends
+
+2009-03-28 16:08:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_image.c:
+ * gst/videoscale/vs_scanline.c:
+ * gst/videoscale/vs_scanline.h:
+ videoscale: Rewrite YUYV (and friends) scaling and don't read/write over line ends
+ Partially fixes bug #577054, there's just one issue left now.
+
+2009-03-28 12:48:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/videoscale.c:
+ videoscale: Add some more unit tests
+
+2009-03-28 11:51:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Use bilinear instead of 4tap scaling for heights < 4
+ Partially fixes bug #577054.
+
+2009-03-28 11:45:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Don't read after the end of a line when lineary scaling YUYV/UYVY/RGB/RGBA
+ This case is for upscaling a frame with width=1
+ Partially fixes bug #577054.
+
+2009-03-28 11:27:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_scanline.c:
+ videoscale: Don't read after the end of a line when lineary scaling YUYV/UYVY
+ Partially fixes bug #577054.
+
+2009-03-28 10:40:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/gstvideotestsrc.c:
+ videotestsrc: Initialize buffer memory with zeroes
+ This prevents valgrind warnings when accessing the "x" parts
+ of xRGB and friends in other elements that handle (and can handle)
+ xRGB like ARGB (for example videoscale).
+
+2009-03-28 10:25:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/videoscale.c:
+ videoscale: Add a lot of unit tests
+
+2009-03-28 10:06:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videocale: Add support for video/x-raw-gray with bpp=depth=8
+
+2009-03-28 10:01:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add support for generating video/x-raw-gray with bpp=depth=8
+
+2009-03-28 09:43:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ ffmpegcolorspace: video/x-raw-gray is the same as the YUV Y800 format
+
+2009-03-27 19:12:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: Take the next luma value instead of every second next when scaling UYVY and friends
+
+2009-03-27 19:09:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Add support for v308 YUV colorspace
+
+2009-03-27 13:15:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ videoscale: Add my copyright to the 4tap scalers
+
+2009-03-27 13:14:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/gstvideoscale.c:
+ videoscale: Enable 4-tap scaling for all supported formats
+
+2009-03-27 13:14:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ videoscale: Implement 4-tap scaling for RGB565 and RGB555
+
+2009-03-27 10:47:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ videoscale: Implement 4-tap scaling for UYVY
+
+2009-03-27 09:33:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ videoscale: Implement 4-tap scaling for YUY2 and YVYU
+
+2009-03-26 22:14:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ videoscale: Implement 4-tap scaling for RGB and BGR
+
+2009-03-26 22:08:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ videoscale: Implement 4-tap scaling for RGBA and other 4 byte formats
+
+2009-03-26 11:02:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/pango/gsttextoverlay.c:
+ textoverlay: Fix drawing of UYVY text borders
+
+2009-03-26 10:36:27 +0100 Zeeshan Ali <zeeshan.ali@nokia.com>
+
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ textoverlay: Add support for UYVY colorspace
+ Fixes bug #378094.
+
+2009-03-25 19:01:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: do some more cleanup
+ Free the groups when we go to READY.
+ Allow for NO_PREROLL elements.
+
+2009-03-25 16:37:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: start CSeq counting from 1 instead of 0
+ Start counting from 1 instead of 0 as this is what most other clients
+ seem to do.
+
+2009-03-25 16:35:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: add ETag and If-Match headers
+ Add new headers, we need them for RealMedia support.
+
+2009-03-25 14:16:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: scale the colorkey components in case of 16bit visuals
+ Use a default that won't be scales to 0,0,0
+
+2009-03-25 11:27:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ audiosrc: improve 'Dropped n samples' warning message
+
+2009-03-24 19:41:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ examples: use new method to set flags
+ Use the new core method for setting object enum properties by name.
+
+2009-03-24 18:29:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: add more support for subpictures
+
+2009-03-24 17:12:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: first support for subpictures
+ Add beginnings of subpicture support.
+
+2009-03-24 15:26:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: print tags from the different tracks
+
+2009-03-24 12:22:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: blacklist subpictures for now
+ Blacklist the subpictures until we add support for them.
+ Add some small debug info.
+ See #576408.
+
+2009-03-24 12:19:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: expose more media types
+ Expose more media types from a raw source, such as the subpicture and various
+ text pads.
+ Small cleanups and add some more debugging.
+ See #576408.
+
+2009-03-24 10:42:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: rescan audio sinks for volume/mute
+ Rescan the audio sinks for the mute and volume properties.
+ fixes #576180.
+
+2009-03-23 19:40:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix reuse of the video chains
+ When reusing playbin with visualisations, reset the async property on the video
+ sink because some sinks might dynamically recreate their sinks.
+ Fixes #576188
+
+2009-03-23 17:37:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: allow dynamic swtiching of subtitles
+ When we have the textpad configured, enable and disable the subtitles by setting
+ the silent flag on the overlay element instead of trying to remove elements.
+ See #576187
+
+2009-03-23 16:59:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/playbin-text.c:
+ tests: print some more info in the text example
+ Print both the position and the running_time when the subtitle becomes available
+ in the application.
+
+2009-03-23 16:04:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix dynamic switching of visualisations
+ Fix the switching of visualisations by requesting and releasing the tee request
+ pads on demand.
+ See #576187.
+
+2009-03-23 16:19:11 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/tcp/README:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ docs: add examples for tcp elements, also use correct section name. Fixes #564139
+ Updated the examples in the README to actually work. Add them to api docs. Tests
+ the api-docs and fix the section names to make the docs actualy show up.
+ The example for "tcpserversrc" needs review (might be an element bug).
+
+2009-03-17 09:14:02 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/videoscale/gstvideoscale.c:
+ indent: fix damange that gst-indent did some time ago
+
+2009-03-23 15:27:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: fix linking order
+ Link after doing the state change and unlink before shutting down. Makes the
+ window for causing races in toggling the visualisations smaller.
+ See #576187.
+
+2009-03-23 12:26:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ uridecodebin: reset counter
+ reset the number of pending dynamic operations back to 0 when we reuse
+ uridecodebin.
+ Fixes #576190
+
+2009-03-23 11:38:53 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * ext/theora/theoradec.c:
+ theoradec: Use GST_CLOCK_TIME_NONE for invalid positions. Fixes #543591
+ The problem was that previously we didn't check whether _theora_granule_frame
+ returned a negative framecount or not, resulting in bogus timestamps.
+
+2009-03-21 09:46:28 +0100 René Stadler <mail@renestadler.de>
+
+ * ext/vorbis/vorbisenc.c:
+ vorbisenc: Set caps on non-header ouput buffers.
+ Fixes #576142.
+
+2009-03-20 16:13:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/seek/seek.c:
+ seek: Add some more debug
+ Add some more info about the selected streams.
+
+2009-03-20 15:47:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: a pad starts out being not drained.
+ Mark a new pad as not drained until we get EOS on it.
+
+2009-03-20 14:17:19 +0100 LRN <lrn1986 at gmail dot com>
+
+ * gst/playback/gstqueue2.c:
+ win32: fix seeking in large files
+ Fix Seeking in large files by using the 64-bit seek functions.
+ Fixes #576019
+
+2009-03-19 20:31:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: recover from failing to add a pad
+ When we cannot add a pad to the decodebin2 for some reason, print a warning but
+ continue adding the remaining pads.
+
+2009-03-19 19:35:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: more cleanups and docs.
+ Add some more comments and use g_list_prepend().
+
+2009-03-19 19:19:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: refactoring and race fixes
+ Refactor some code so that we can take the right locks and in the right order.
+ Fixes quite a bit of races already.
+
+2009-03-19 19:03:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: remove the group cond + cleanups
+ Remove the group GCond that we used for waiting for groups to finish because we
+ use pad blocking on the selectors and counters instead for waiting for the
+ groups to complete.
+ remove the obsolete about_to_finish variable set while emiting the
+ about-to-finish signal and fix some old comments.
+ We don't need to take the playbin lock when querying the uridecodebin.
+
+2009-03-18 10:45:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/playbin-text.c:
+ icles: print better error and warning messages
+ --
+
+2009-03-17 22:53:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspbase64.c:
+ * gst-libs/gst/rtsp/gstrtspbase64.h:
+ rtsp: Use GLib base64 functions and deprecate gst_rtsp_base64_encode
+ This also fixes another instance of CVE-2008-4316.
+
+2009-03-17 19:53:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: report -1 for duration in push mode
+ In push mode we must return TRUE from the duration query with a value of -1
+ meaning that we know that we don't know the duration.
+
+2009-03-17 19:09:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: add extra dynamic ref for demuxers
+ When we make a group connected to a demuxer, keep an extra dynamic refcount for
+ the group which is only decremented when no_more_pads or a multiqueue overrun is
+ detected. This way we avoid a race between exposing the group while more dynamic
+ refs are added from new pads.
+ Fixes #575588.
+
+2009-03-17 15:39:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: sync state of the sink correctly
+ Sync the state of the newly added chains to the state of the parent sink element
+ to avoid lost async-start messages. Fixes cdda:// async-done message storm.
+
+2009-03-17 11:54:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: return NOT_LINKED for unselected streams
+ When streams are not selected in the selector, return NOT_LINKED so that
+ upstream elements can skip decoding. Only do this for audio and video pads
+ because for text streams the overhead is smaller and they could come from
+ external files.
+
+2009-03-17 11:51:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin: set custom text sink properties
+ Set the custom sink async=FALSE to not make it participate in preroll because we
+ are dealing with sparse streams.
+ Try to set sync=TRUE on the custom text sink.
+
+2009-03-17 11:30:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/playbin-text.c:
+ example: use appsink instead of fakesink
+ Use appsink instead of fakesink to get the subtitles.
+ Make things more pretty.
+
+2009-03-17 11:24:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/.gitignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/playbin-text.c:
+ examples: add example of intercepting subtitles
+ Add an example of how to install a custom sink for receiving subtitles in
+ playbin2.
+
+2009-03-17 11:03:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/appsink.c:
+ tests: fix include in the appsink test
+ Fix dist by doing the right include.
+
+2009-03-16 16:42:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: don't try to set invalid stream numbers
+ Fix a problem with setting the stream numbers because we check for the wrong
+ range.
+ See #575239.
+
+2009-03-16 16:16:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: release the shutdown lock
+ Release the shutdown lock when we wait for other groups to complete or else we
+ have a deadlock when the other group completes and tries to grab the shutdown
+ lock.
+ Fixes #575550.
+
+2009-03-16 15:31:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/app/appsrc-ra.c:
+ * tests/examples/app/appsrc-seekable.c:
+ * tests/examples/app/appsrc-stream.c:
+ * tests/examples/app/appsrc-stream2.c:
+ examples: fix g_object_set() value type.
+ Make sure we cast the length value as a gint64 to the vararg g_object_set() just
+ incase sizeof(gsize) != sizeof(gint64).
+
+2009-03-15 19:57:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: make flac typefinder return lower probability for frame headers
+ The flac frame header typefinder overstates the likelihood of a match, leading
+ to false positives with e.g. aac streams and PDF files. Reduce probabilty
+ returned from LIKELY to POSSIBLE for the frame header matchin code.
+ Fixes #574939.
+
+2009-03-11 12:59:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: improve image/bmp typefinder
+ Detect more variations and also bail out in more cases where the values
+ don't make sense. Furthermore, add width/height and bpp to the caps,
+ because we can.
+
+2009-03-13 15:22:42 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/Makefile.am:
+ check: Ignore alsamixer in the states test too
+
+2009-03-13 15:22:11 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * sys/v4l/v4l_calls.c:
+ v4lsrc: Fix some valgrind warnings about leaked memory and uninitialised data.
+
+2009-03-13 16:19:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: fix resolving of hostnames
+ We were returning a pointer to a stack variable with the resolved hostname,
+ which doesn't work.
+ return a copy of the resolved ip address instead.
+ Fixes #575256.
+
+2009-03-13 15:29:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/vorbis/vorbisparse.c:
+ vorbisparse: be smarter when queueing headers
+ Look at the first buffer byte to see if a buffer is a header instead of counting
+ packets.
+
+2009-03-13 15:27:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c:
+ theoraparse: be smarter when queuing headers
+ Look at the first byte of the buffer data (if we can) to decide if the packet is
+ a header packet or not instead of counting packets.
+
+2009-03-13 15:26:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/ogg/gstoggdemux.c:
+ oggdemux: add some debug info
+ Add some debug info to log when the seek worked.
+
+2009-03-13 15:14:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ appsrc: release lock in _eos flushing case
+ Release the mutex when we are flushing in gst_app_src_end_of_stream()
+ Fixes #574964.
+
+2009-03-13 11:49:10 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/vorbis/vorbisdec.c:
+ vorbisdec: Avoid an unnecessary memory allocation in vorbiscomment handling.
+
+2009-03-13 11:48:28 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/theora/theoradec.c:
+ theoradec: Avoid an unnecessary memory allocation in vorbiscomment handling.
+
+2009-03-12 18:27:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ playbin2: fix raw elements like cdda://
+ Fix a fixme with a one liner and make cd playback work again.
+
+2009-03-12 17:47:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playbin2: improve subtitle handling
+ Add property to playbin2 to configure a custom sink that receives the raw
+ subtitle buffers instead of using a textoverlay.
+ Improve the property finding code to make it more usable.
+ Use property find code to find async properties in custom sinks that are bins.
+ Improve text overlay code to gracefully handle missing elements.
+
+2009-02-24 15:58:42 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/tag/gstvorbistag.c:
+ vorbistag: Protect memory allocation calculation from overflow.
+ Patch by: Tomas Hoger <thoger@redhat.com> Fixes CVE-2009-0586
+
+2009-03-12 11:34:20 +0000 Jan Urbanski <jurbanski@flumotion.com>
+
+ * gst-plugins-base.spec.in:
+ Spec: fix up deps
+
+2009-03-11 18:45:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: fix parsing of the timeout parameter
+ --
+
+2009-03-11 16:20:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: fix g_return condition
+ when parsing a data message, we require a data message.
+
+2009-03-11 13:33:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefinding: flac typefinder fixes
+ Use scan context for initial peek as well. Peek 6 bytes in the initial
+ peek rather than 5 bytes, to match the length of the memcmp we're doing
+ on that data later. Return immediately when we found caps from looking
+ at the beginning of the data - no point in continuing to scan the next
+ 64kB for something matching a frame header.
+
+2009-03-11 14:08:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: free the right string.
+ Free the key value before we remove the header item from the array. The item we
+ retrieved from the array is only valid until we remove it from the array.
+
+2009-03-11 14:07:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: keep track of amount of decoded bytes
+ Keep track of the actual amount of decoded bytes, which can be less than 3 when
+ we decode the last bits of a base64 message.
+
+2009-03-10 21:00:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: log details in getcaps like in setcaps
+
+2009-03-10 13:11:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/MANIFEST:
+ win32: update MANIFEST, fixing 'make dist'
+
+2009-03-09 23:12:00 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 7032163 to f8b3d91
+
+2009-03-09 16:19:40 +0100 Jonathan Matthew <notverysmart at gmail dot com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: add photoshop typefind functions
+ Add photoshop typefind functions.
+ Fixes #574516.
+
+2009-03-09 15:46:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: only remove pads that were added
+ Flag pads that were added so that we can see if we need to remove them later or
+ not.
+
+2009-03-09 13:53:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ rtsp: only add ports when not using TCP
+ Only add the port numbers in the transport string when we are using udp or
+ multicast.
+
+2009-03-09 13:53:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ rtsp: use gstreamer dump mem
+ --
+
+2009-03-09 13:51:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: use glib base64 encoder
+ --
+
+2009-03-06 19:28:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ Unblock blocked ghostpads when shutting down. Fixes #574293.
+
+2009-03-09 10:03:13 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ Riff: Add mapping for Fraps video codec.
+ Found through insanity testrun. Confirmed mapping in libavformat.
+
+2009-03-09 09:07:13 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add the 'DVR ' mapping for mpeg2video.
+ Found this in 3 files from the insanity suite and mapping is also present
+ in libavformat.
+
+2009-03-09 09:06:40 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Use the proper data pointer instead of poking random memory.
+
+2009-03-08 18:17:48 +0100 LRN <lrn1986@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: fix compilation on windows.
+ Remove unused variable when building for windows.
+ Fixes #574443.
+
+2009-03-08 12:03:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ffa738d to 7032163
+
+2009-03-08 11:19:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 3f13e4e to ffa738d
+
+2009-03-07 11:44:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 3c7456b to 3f13e4e
+
+2009-03-07 10:44:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 57c83f2 to 3c7456b
+
+2009-03-06 19:02:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ theoradec: parse and use codec_data in the caps
+ Parse the codec_data in the caps and use this as the headers.
+ Fixes #574169.
+
+2009-03-06 18:53:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add theora mapping
+ Add theora mappings. See #574169.
+
+2009-03-06 16:31:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * win32/common/libgstrtsp.def:
+ rtsp: Add methods for getting the read/write fds
+ API:gst_rtsp_connection_get_readfd()
+ API:gst_rtsp_connection_get_writefd()
+
+2009-03-06 10:35:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * win32/common/audio-enumtypes.c:
+ win32: indent copied *-enumtypes.c files in make win32-update
+
+2009-03-06 10:35:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/MANIFEST:
+ win32: update MANIFEST
+
+2009-03-06 10:30:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ win32: fix configure logic for GST_INSTALL_PLUGINS_HELPER define
+
+2009-03-06 10:05:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/_stdint.h:
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/multichannel-enumtypes.c:
+ * win32/common/pbutils-enumtypes.c:
+ * win32/common/video-enumtypes.c:
+ * win32/common/video-enumtypes.h:
+ win32: update windows files via make win32-update
+ Updates win32 files using the new system/hook, and defines HAVE_PROCESS_H,
+ which fixes the build of pbutils on windows (#574319).
+
+2009-03-06 10:03:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ gitignore: ignore more
+
+2009-03-06 10:37:38 +0100 Julien Moutte <julien@fluendo.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Fix build on Mac OS X
+
+2009-03-05 15:42:23 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstdecodebin2.c:
+ decodebin2: don't stay connected to notify::caps after negotiation
+ Disconnect the notify::caps signal in our callback (it'll be re-added
+ if we're not, in fact, finished getting complete caps). Ensures that
+ caps changes mid-stream (e.g. from an mp3 that changes from
+ stereo->mono mid-file) don't cause us to try to add a new pad.
+
+2009-03-05 13:48:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsprange.c:
+ rtsp: fix parsing of 'now-' ranges.
+ --
+
+2009-03-05 12:43:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/dynamic/.gitignore:
+ * tests/examples/dynamic/Makefile.am:
+ * tests/examples/dynamic/sprinkle.c:
+ * tests/examples/dynamic/sprinkle2.c:
+ * tests/examples/dynamic/sprinkle3.c:
+ examples: add some more sprinkle examples
+ Add some more sprinle examples and add some more comments.
+ See #574160.
+
+2009-03-05 11:57:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ docs: add appsrc symbols to standard section
+ --
+
+2009-03-05 12:27:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/adder/gstadder.c:
+ adder: add variants for unsigned to fix warnings for unneeded check
+ For unsigned int out+in can't be < 0.
+
+2009-03-05 10:58:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: use the right variable in debug log, encoding is not yet initialized
+
+2009-03-05 10:51:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/v4l/v4l_calls.c:
+ v4l: add a fixme for broken code, that someone who has a v4l tuner device should fix
+
+2009-03-05 10:39:33 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: add missing break in event handling, remove dead code
+
+2009-03-04 16:24:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: do some more cleanup in _close
+ Do som more cleanup in gst_rtsp_connection_close() so that it's back into the
+ unconnected state as it was allocated.
+
+2009-03-04 16:11:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: fix the memory management of the url
+ Constify the url parameter in _create.
+ Make a copy of the url stored in the connection.
+ Free the url when the connection is freed.
+
+2009-03-04 12:21:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * win32/common/libgstrtsp.def:
+ RTSP: Add support for server tunneling
+ Save the tunnelid in the connection. Add a method to retrieve the tunnelid so
+ that a server can store and match the id against other tunnel requests.
+ Fix the URI in the tunnel requests so that they contain the absolute uri and the
+ query string if any instead of just the hostname.
+ Transparently base64 decode the input stream when tunneling.
+ Add method to set the connection ip address so that it can be included in the
+ tunnel response.
+ Add method to connect the two tunnel requests.
+ Add two callbacks for the async mode to notify a tunnel start and tunnel
+ complete event.
+ Add method to reset the watch after the connection has been tunneled.
+ Various little refactoring to make more stuff reusable.
+ API: RTSP::gst_rtsp_connection_set_ip()
+ API: RTSP::gst_rtsp_connection_get_tunnelid()
+ API: RTSP::gst_rtsp_connection_do_tunnel()
+ API: RTSP::gst_rtsp_watch_reset()
+
+2009-03-04 12:18:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ rtsp: add new defines for tunneling
+ Add two more result codes for tunneling support.
+
+2009-03-04 12:12:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ rtsp: remove , from last enum member
+ Remove , from last enum member to improve compatibility with other compilers.
+
+2009-02-28 15:23:20 -0800 LRN <lrn1986@gmail.com>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: Convert regex code to GRegex code
+ Fixes: #572993. Patch author prefers to use an alias, contact
+ ds if you actually need a real name.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-03-02 16:13:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: remove debugging g_message
+ --
+
+2009-03-02 16:03:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * win32/common/libgstrtsp.def:
+ RTSP: add support for Quicktime tunneled RTSP
+ Add support for tunneling RTSP over HTTP.
+ Fix documentation some more.
+ See also #573173.
+ API: RTSP:gst_rtsp_connection_is_tunneled()
+ API: RTSP:gst_rtsp_connection_set_tunneled()
+
+2009-03-02 15:48:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ RTSP: parse rtsph uris as RTSP tunneled over HTTP
+ Add transport define for RTSP tunneled over HTTP.
+ Parse rtsph:// uris as tunneled HTTP over TCP.
+ API: GstRTSPLowerTrans::GST_RTSP_LOWER_TRANS_HTTP
+ See also #573173.
+
+2009-03-02 12:48:18 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstrtsp.def:
+ win32: Add gst_rtsp_connection_get_url definition
+ No, I'm not wim's buildslave, seriously.
+
+2009-03-02 10:58:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ rtsp: add _get_url method and separate sockets
+ Add gst_rtsp_connection_get_url() method.
+ Reserve space for 2 sockets, one for reading and one for writing. Use socket
+ pointers to select the read and write sockets. This should allow us to implement
+ tunneling over HTTP soon.
+ API: RTSP::gst_rtsp_connection_get_url()
+
+2009-03-01 18:31:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/gstapp-marshal.list:
+ app: force automatic rebuild of gstapp-marshal.[ch] after previous change
+ The previous change to appsrc/appsink requires people to 'make clean'
+ to get the marshallers rebuilt (causing a build failure otherwise).
+ Change some lines in the .list file around to force a rebuild of
+ these files automatically.
+
+2009-02-28 11:07:04 -0800 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ Bump glib requirement to 2.14
+
+2009-02-28 19:37:53 +0100 LRN <lrn1986@gmail.com>
+
+ * ext/gio/gstgiobasesink.c:
+ gio: Use correct format modifier for size_t
+ Fixes bug #573528.
+
+2009-02-28 19:35:33 +0100 LRN <lrn1986@gmail.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: Use correct types for some functions on Win32
+ Fixes bug #573529.
+
+2009-02-28 13:11:59 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtspconnection: Fix warning about using unitialized value.
+
+2009-02-28 12:41:28 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c:
+ riff: Add more codec mappings.
+ This comes mostly from a review of ffmpeg/libavformat/riff.c
+
+2009-02-27 11:14:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/alsa/gstalsa.c:
+ alsa: release pcminfo after the strdup
+
+2009-02-26 17:38:47 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/rtsp/gstrtsprange.c:
+ rtsprange: don't leak the range in case of parsing error.
+ Free the gstRTSPTimeRange if we don't return it. Also simplify
+ gst_rtsp_range_free() as it is valid to pass NULL to g_free().
+
+2009-02-26 16:47:39 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/alsa/gstalsa.c:
+ alsa: cleanup name lookup.
+ We can break, once we have a name to make sure, we won't read it ever twice.
+
+2009-02-26 16:09:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/subparse/gstsubparse.c:
+ subparse: don't leak line, if flushing
+
+2009-02-26 16:03:39 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * ext/gio/gstgiosink.c:
+ giosink: reflow error handling to not leak uri
+
+2009-02-26 15:53:10 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: remove unused code/variables
+
+2009-02-26 12:10:47 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ ximagesink: use GST_FLOW_NOT_NEGOTIATED for partial caps
+
+2009-02-26 16:44:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/app/gstappsrc.h:
+ * win32/common/libgstapp.def:
+ app: add callbacks to appsrc, cleanups
+ Add a uri handler to appsink.
+ don't emit signals when we have installed callbacks on appsink.
+ Add callbacks to appsrc to replace the signals.
+ Add property to disable callbacks in appsrc, default to TRUE for backwards
+ compatibility but disable when callbacks are installed.
+ API: GstAppSrc::emit-signals
+ API: GstAppSrc::gst_app_src_set_emit_signals()
+ API: GstAppSrc::gst_app_src_get_emit_signals()
+ API: GstAppSrc::gst_app_src_set_callbacks()
+
+2009-02-26 11:42:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/app/gstappsink.h:
+ * tests/check/elements/appsink.c:
+ Appsink: add padding for callbacks + docs
+ Add some padding to the callbacks structure just to be safe.
+ Remove the now invisible marshaller methods from the docs.
+ Fix a comment in the unit test.
+
+2009-02-26 09:52:59 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstapp.def:
+ win32: Add new libgstapp symbol
+
+2009-02-26 10:07:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ docs: clean section.txt file.
+ Add appsrc/sink symbols to private, as they are covered in the libs docs.
+
+2009-02-26 10:06:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaybasebin.c:
+ docs: fix random text after since: tag. Also fix class name to make the docs actual appear.
+
+2009-02-26 09:56:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst/playback/gstplaybin2.c:
+ docs: playbin2 has no stream-info
+
+2009-02-26 09:53:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/video/video.h:
+ docs: fix newly added interlace constants and plug holes in video format docs
+
+2009-02-26 09:35:43 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ docs: don't put random stuff in tags.
+ Tags like Since: or Returns: can only be followed by more tags. gtk-doc has no
+ tag to append text again to the documentation body.
+
+2009-02-06 11:10:15 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/ximage/ximagesink.c:
+ ximagsink: do not access uninitialized height variable.
+ Exit like in xvimagesink, if we have partial caps.
+
+2009-02-25 20:26:05 -0800 David Schleef <ds@schleef.org>
+
+ * 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,
+ except that it adds a few -base specific defines.
+
+2009-02-25 19:40:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * win32/common/libgstapp.def:
+ app: add win32 .def file and only export functions we want exported
+ Add a .def file for win32 builds (and make check-exports).
+ Fix LDFLAGS in Makefile.am, so the usual export regexps are used (fixes #573165).
+ Make sure private marshaller functions aren't exported by prefixing them with __gst;
+ also rename gst_app_marshal_OBJECT__VOID to _BUFFER__VOID, make it static and add
+ a comment why we're not using glib-genmarshal for this one.
+
+2009-02-25 17:08:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/dynamic/.gitignore:
+ * tests/examples/dynamic/Makefile.am:
+ * tests/examples/dynamic/sprinkle.c:
+ sprinkle: Add another example app
+ Add an example app that dynamically adds and removes audiotestsrc elements from
+ adder.
+
+2009-02-25 16:25:33 +0100 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Fixed a typo.
+
+2009-02-25 11:31:02 +0100 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst/tcp/gstmultifdsink.c:
+ rtsp, multifdsink: Unify the use of union gst_sockaddr.
+
+2009-02-25 14:22:35 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ * configure.ac:
+ build: Update shave init statement for changes in common. Bump common.
+
+2009-02-25 13:16:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ xvimageink: protect buffer_alloc from shutdown
+ Use the pool_lock in the buffer_alloc function to detect shutdown. Avoids
+ crashes when the sink is shutdown.
+
+2009-02-25 12:43:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin: use flushing pads instead of fakesink
+ Use the flushing pads on playsink to terminate on shutdown instead of plugging
+ fakesinks. this should be a little cheaper.
+
+2009-02-25 12:42:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ * gst/playback/gstplaysink.h:
+ playsink: Add FLUSHING pad type
+ Make it possible to request a flushing pad from the playsink. We can eventually
+ use these flushing pads to quickly terminate the dataflow when we are shutting
+ down.
+
+2009-02-25 11:31:52 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 9cf8c9b to a6ce5c6
+
+2009-02-25 09:52:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-media.c:
+ riff: add fourcc for mpeg2-in-avi (as produced by mencoder)
+ Fixes: #565777
+
+2009-02-25 12:07:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/stress-playbin.c:
+ stress-playbin: print the current uri
+ Print the current uri so that we can more easily see what uri caused a crash or
+ error.
+
+2009-02-25 11:07:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/icles/stress-playbin.c:
+ Print the errors more clearly
+ Print some more verbose messages when dealing with errors.
+
+2009-02-25 10:08:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ Release the group lock when setting states
+ Release the group lock while we perform the state changes on the uridecodebins
+ because that might trigger callbacks that we need to handle with the group lock
+ taken. Avoids a possible deadly embrace in some id3/flac files.
+ Fixes #567396.
+
+2009-02-25 10:05:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ Combine finding and creating groups
+ Combine the search for the current group and optionally creating one into one
+ function so that we can avoid taking the lock multiple times.
+
+2009-02-25 08:22:00 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/playback/gstplaybin2.c:
+ Playbin2: Don't leave unused parameters in debug statements.
+ Fixes build on macosx
+
+2009-02-24 10:33:05 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ Riff: Add fourcc for mpeg1-in-avi (as produced by mencoder)
+
+2009-02-24 18:43:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ Add some G_UNLIKELY because we can
+ Add a G_UNLIKELY when checking the shutdown variable.
+
+2009-02-24 17:23:58 +0000 Garret D'Amore <garrett.damore@sun.com>
+
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ mixer interface: Add flags to enhance mixer interfaces
+ This patch adds a few flags to the mixer and mixerctrl interface to
+ better support OSSv4 (and potentially other backends).
+ Patch By: Garret D'Amore <garrett.damore@sun.com>
+ Signed-Off-By: Jan Schmidt <jan.schmidt@sun.com>
+ API: GST_MIXER_FLAG_HAS_WHITELIST, GST_MIXER_FLAG_GROUPING,
+ API: GST_MIXER_TRACK_NO_RECORD, GST_MIXER_TRACK_NO_MUTE,
+ API: GST_MIXER_TRACK_WHITELIST
+
+2009-02-24 17:03:08 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/tcp/gstmultifdsink.c:
+ multifdsink: Fix strict aliasing error using a union
+
+2009-02-24 16:49:40 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ rtsp: Fix a strict aliasing warning
+ Fix strict aliasing warnings from casting a sockaddr_storage and
+ using it as a sockaddr_in6. Use a union instead.
+
+2009-02-24 16:08:49 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/libs/.gitignore:
+ * docs/libs/tmpl/.gitignore:
+ * docs/plugins/.gitignore:
+ * docs/plugins/tmpl/.gitignore:
+ Remove .gitignore files from the docs tmpl dirs, that are killed by make clean.
+
+2009-02-24 14:36:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/gstvorbisdec.h:
+ * ext/vorbis/gstvorbisenc.h:
+ * ext/vorbis/gstvorbisparse.h:
+ * ext/vorbis/gstvorbistag.h:
+ * ext/vorbis/vorbis.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisdec.h:
+ * ext/vorbis/vorbisenc.c:
+ * ext/vorbis/vorbisenc.h:
+ * ext/vorbis/vorbisparse.c:
+ * ext/vorbis/vorbisparse.h:
+ * ext/vorbis/vorbistag.c:
+ * ext/vorbis/vorbistag.h:
+ vorbis: Rename vorbis*.h to gstvorbis*.h to prevent name conflicts
+
+2009-02-24 14:06:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Add conversion from/to YVYU colorspace
+ Fixes bug #572872.
+
+2009-02-24 13:42:01 +0100 Jonas Danielsson <jonas.danielsson@axis.com>
+
+ * gst/ffmpegcolorspace/imgconvert.c:
+ ffmpegcolorspace: Add direct UYVY->GRAY8 conversion
+ The conversion from UYVY to RGB24 and then to GRAY8
+ is quite slow. Fixes bug #569655.
+
+2009-02-19 17:16:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: fix deadlock when shutting down. Fixes #572577.
+
+2009-02-19 17:15:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/icles/stress-playbin.c:
+ stress-playbin: make more flexible, e.g. also useful for playbin2
+
+2009-02-24 12:11:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Match WSAStartup and WSACleanup correctly
+ Don't randomly call WSAStartup and WSACleanup but instead call the startup when
+ we create a connection and cleanup when we free it again. Because the internal
+ datastructure is refcounted, this should not cause any refcounting leaks when
+ the connection is managed correctly.
+ Fixes #562794.
+
+2009-02-18 11:59:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/playback/gstplaysink.c:
+ playbin2/playsink: Set audiotee to PAUSED state in all cases. Fixes #565105.
+
+2009-02-23 10:57:42 -0800 David Flynn <davidf@rd.bbc.co.uk>
+
+ * pkgconfig/gstreamer-app-uninstalled.pc.in:
+ * pkgconfig/gstreamer-audio-uninstalled.pc.in:
+ * pkgconfig/gstreamer-cdda-uninstalled.pc.in:
+ * pkgconfig/gstreamer-fft-uninstalled.pc.in:
+ * pkgconfig/gstreamer-floatcast-uninstalled.pc.in:
+ * pkgconfig/gstreamer-interfaces-uninstalled.pc.in:
+ * pkgconfig/gstreamer-netbuffer-uninstalled.pc.in:
+ * pkgconfig/gstreamer-pbutils-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-riff-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtsp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-sdp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-tag-uninstalled.pc.in:
+ * pkgconfig/gstreamer-video-uninstalled.pc.in:
+ Add srcdir to includes for out-of-source builds
+ When you use gstreamer uninstalled and build outside
+ the source tree, the includes need to be specified for
+ both the source tree and the build tree.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-02-22 17:23:52 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Use shave for the build output
+
+2009-02-23 12:17:07 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstrtsp.def:
+ win32: Add new symbol to libgstrtsp.def
+
+2009-02-23 10:57:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ * gst-libs/gst/rtsp/gstrtspextension.h:
+ Add method for handling server requests
+ Add a receive_request so that extensions can react to server requests.
+
+2009-02-22 19:20:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/netbuffer.c:
+ Correctly cast to GstBuffer * before passing to gst_buffer_(copy|unref)
+
+2009-02-22 19:19:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * ext/theora/theoraparse.c:
+ theoraparse: Use the correct unref functions
+
+2009-02-22 19:18:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ x(v)imagesink: Correctly cast to GstBuffer * before passing to gst_buffer_unref()
+
+2009-02-22 19:12:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: Unref the actual buffer instead of the memory address of the buffer
+
+2009-02-22 15:47:53 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 5d7c9cc to 9cf8c9b
+
+2009-02-22 14:49:29 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstrtsp.def:
+ * win32/common/libgstvideo.def:
+ win32/common: Update .def files for recent API addition
+
+2009-02-22 13:43:35 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/libs/rtp.c:
+ tests: Fix indentation
+
+2009-02-22 13:42:33 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/video/video.c:
+ libs/video: Fix gst_video_format_new_caps* functions.
+ Only add a 'interlaced=True' property to caps *IF* it is interlaced, else
+ don't add anything.
+
+2009-02-21 11:13:36 -0800 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 80c627d to 5d7c9cc
+
+2009-02-20 17:26:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ Improve key/value parsing
+ Improve header field parsing by keeping a ref to the key/value instead of
+ copying it into a local variable.
+
+2009-02-20 12:35:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Add trailing \0 to message length
+ We always put a trailing 0 at the end of the message body. Reflect this fact in
+ the length of the message.
+
+2009-02-20 09:50:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Don't parse headers for data messages
+ Don't try to parse the headers on a data message because they don't have
+ headers.
+
+2009-02-19 12:18:29 -0800 Benjamin M. Schwartz <bens@alum.mit.edu>
+
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ theoraenc: Add property for speed level control
+ Add property "speed-level" to control the amount of motion searching
+ the encoder does. This is only available in libtheora >= 1.0 and
+ will silently fail with earlier libraries. Fixes: #572275.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2009-02-19 17:40:45 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Fix 'Since' tags
+
+2009-01-26 10:30:53 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ video: Add flags for interlaced video along with convenience methods for interlaced caps.
+ These three flags allow all know combinations of interlaced formats. They should
+ only be used when the caps contain 'interlaced=True'.
+ Fixes #163577 (yes, it's a 4 year old bug).
+
+2009-02-19 15:51:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Make RTSPConnection opaque and rename RTSPChannel
+ Make the RTSPConnection object opaque so that we can extend it in the future.
+ Rename GstRTSPChannel to GstRTSPWatch to avoid confusing with the RTSP channels.
+
+2009-01-26 10:31:14 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst-libs/gst/riff/riff-media.c:
+ Add some more mappings for h264 in riff
+
+2009-02-19 10:49:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtsp.def:
+ Add new RTSP symbols to def files
+ Add the new RTSP symbols to the windows def file.
+
+2009-02-19 10:44:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsink.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/appsink.c:
+ Add method to install callbacks on appsink
+ Based on pacth by Martin Samuelsson <martin dot samuelsson at axis dot com>
+ Fixes #571299.
+ Add gst_app_sink_set_callbacks() to install a set of callbacks. This is a more
+ performant alternative to connecting to the signals.
+ Add a unit test for appsink.
+ Clean up some of the appsink docs.
+ API: GstAppSink::gst_app_sink_set_callbacks()
+
+2009-02-18 18:46:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Add RTSP accept method
+ Add a method to accept a connection on a socket and create a GstRTSPConnection
+ for it.
+ API: gst_rtsp_connection_accept()
+
+2009-02-18 17:42:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Add RTSP channel object for async io
+ Add a GstRTSPChannel object that wraps a GSource around the RTSP connection so
+ that the connection can be monitored from a maincontext. This allows us to
+ operate in ASYNC mode, which is handy when building a server.
+ Rework the old code to use the async code under the hood.
+ API: gst_rtsp_channel_new()
+ API: gst_rtsp_channel_unref()
+ API: gst_rtsp_channel_attach()
+ API: gst_rtsp_channel_queue_message()
+
+2009-02-15 07:30:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Add locking to protect the resampling context
+ When setting the quality/filter-length while PLAYING the
+ resampling context will be destroyed and created again in
+ some cases, which will cause crashes in the transform function
+ if it's called at that time.
+
+2009-02-13 10:10:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/videotestsrc/videotestsrc.c:
+ ffmpegcolorspace/videotestsrc: Use v308 instead of V308
+
+2009-02-12 19:02:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ ffmpegcolorspace: Add support for packed 4:4:4 YUV (format=V308)
+ Only conversions from/to are implemented, which
+ gives (indirect) support for all possible conversions.
+ Partially fixes bug #571147.
+
+2009-02-12 18:17:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add support for packed 4:4:4 YUV (format=V308)
+ Partially fixes bug #571147.
+
+2009-02-12 09:18:20 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/tag/gsttagdemux.c:
+ tagdemux: don't abort when downstream pulls a buffer of size 0
+ Pulling a 0-sized buffer is allowed, and we should handle this correctly instead of
+ aborting. Fixes #571009 (wma file with ID3v2 tag).
+
+2009-02-11 16:39:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-read.c:
+ riff: error out on nonsensical chunk sizes instead of aborting
+ When encountering a nonsensical chunk size such as (guint)-1, error out cleanly instead of
+ continuing and trying to g_memdup() 4GB of data that doesn't exist, which will either abort
+ in g_malloc() or crash.
+ Fixes #553295, crash with fuzzed AVI file.
+
+2009-02-11 16:39:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ Make git ignore backup files.
+
+2009-02-10 20:38:58 -0800 Michael Smith <msmith@syncword.(none)>
+
+ * gst/playback/gstplaybin2.c:
+ Revert "Remove pad-removed handlers after setting the decodebins to NULL."
+ This reverts commit b36d8f3e119f9edc5993c08025614ee32642972e.
+ This brought back some deadlocks. A small leak is better, for now. Need to
+ figure out a way to fix the leak properly.
+
+2009-02-10 17:16:07 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ playbin2: Fix segfault on notify after group change.
+ If our group has been switched, then we get a selector active-pad
+ notification, we don't need to notify.
+
+2009-02-10 17:10:33 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: Look for volume/mute properties recursively in audio element.
+ Rather than only checking for volume property on the audio sink
+ directly, recursively look for it on sinks within it (if it's a bin).
+ Allows use of sink-as-volume-control where the application has supplied
+ an audio-sink bin that includes a real audio sink internally.
+
+2009-02-10 18:29:22 +0000 Christian Schaller <cschalle@crazyhorse.localdomain>
+
+ * gst-plugins-base.spec.in:
+ Update spec file with latest additions and changes, most noteably the move of appsrc appsink into -base
+
+2009-02-10 17:39:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/videotestsrc/videotestsrc.c:
+ videotestsrc: Add support for Y444 (planar 4:4:4 YUV)
+ Partially fixes bug #571147.
+
+2009-02-10 17:37:06 +0100 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ gstrtspmessage: Minor documentation correction.
+ Corrected documentation about what needs to be freed after calling
+ gst_rtsp_message_new(), gst_rtsp_message_new_request(),
+ gst_rtsp_message_new_response() and gst_rtsp_message_new_data().
+
+2009-02-10 11:00:12 +0100 Antoine Tremblay <hexa00@gmail.com>
+
+ * ext/alsa/gstalsamixer.c:
+ alsamixer: Fix race condition that made alsamixer not working properly
+ This is due to race conditions between functions that
+ modified the mixer like set_volume and
+ snd_mixer_handle_events since the handle_events
+ can now be called at any time.
+ Fixed by adding locking around any snd_mixer call
+ since even read functions can modify the mixer stucture, since
+ alsa likes to clear it's values before reading new ones.
+ The favorite race condition seemed to be that set_volume
+ called read_elem (in alsalib) that reset the volumes to
+ 0 and then read them with read_x_volume. This read looped
+ on each channel and as the race condition occured the
+ channels value could be anything , most of the time
+ it was 0. Thus no value was read or only the value of
+ one channel was and the volume was reset to 0.
+ Fixes bug #478512.
+
+2009-02-09 12:02:21 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Bump revision to use for common submodule.
+
+2009-02-05 15:47:00 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * sys/xvimage/xvimagesink.c:
+ xvimagesink: do not call _xwindow_clear on ready->paused.
+ Calling clear at that transition does things like stopping xvideo (which is not
+ running at that time) and also clearing anything what the application might have drawn.
+ This breaks handle-expose and autopaint-colorkey features.
+
+2009-02-04 17:03:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtsprange.c:
+ * gst-libs/gst/rtsp/gstrtsprange.h:
+ RTSPRange: Add method to serialize ranges
+ Add gst_rtsp_range_to_string() to serialize a GstRTSPRange to a string that can
+ be used by a server.
+ API: GstRTSPRange::gst_rtsp_range_to_string()
+
+2009-02-04 13:16:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ * gst-libs/gst/rtsp/gstrtspurl.h:
+ GstRTSPUrl: Add some const to methods
+ Add const to the methods that do not modify the object.
+
+2009-02-04 13:53:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/playback/gstplaysink.c:
+ playbin2: implement GST_PLAY_FLAG_NATIVE_{AUDIO,VIDEO}
+ The flags where present but actually not been taken into account.
+
+2009-02-04 12:06:38 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Add a proper deprecation comment and also drop G_PARAM_CONSTRUCT.
+ The comment will ensure that is is marked properly in the docs and the
+ GParamSpecflag was causing a duplicated initialisation of the same value.
+
+2009-02-04 11:18:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Add more g_return_if_fail() calls
+ Check that we have a valid file descriptor before entering certain functions in
+ order to avoid undesirable situations.
+ Add some more debugging in the connect method.
+
+2009-02-04 10:31:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/gstaudioresample.c:
+ audioresample: Only pull in liboil if its actualy used.
+ Liboil still has quite significant startup overhead especialy on embedded
+ platforms. In audioresample it was only used for the profiling timer.
+
+2009-02-03 15:26:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ typefind: Make the flac check more tight to not mistace some aac files for flac. Fixes #570356.
+ Add comments about the flac format. Tighten the check to not allow values that
+ refer to headers.
+
+2009-02-03 10:52:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstrtsp.def:
+ Add new methods
+ Add new methods to the windows def file.
+
+2009-02-02 17:25:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * tests/check/libs/pbutils.c:
+ pbutils: remove duplicate detail strings when calling the external codec installer
+ It doesn't make sense to ask installers for the same codec or element twice, so filter out duplicate requests before calling the external helper script and make the unit test check this works right. Fixes #567636.
+
+2009-02-02 18:05:42 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosink.h:
+ Add a FIXME 0.11. Make the log message a bit more detailed and add comments.
+
+2009-02-02 15:43:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/audioresample/gstaudioresample.c:
+ Allow to configure the resampler function for integer to skip the benchmarking. Fix releasing the intger resampler in benchmark.
+
+2009-02-02 13:30:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/ximage/ximagesink.c:
+ Fix buffer_alloc in ximagesink
+ Remove some useless debug info that reported wrong image sizes.
+ When upstream does not accept out suggested size, fall back to allocating an
+ image of the requested width/height instead of the currently configured size.
+ The problem is that an image is reused from the pool because the width/height
+ match but the caps on the new buffer are the requested caps with possibly
+ different height/width resulting in errors.
+
+2009-02-02 12:54:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gsturidecodebin.c:
+ Fix documentation for autoplug-select
+ fix the documentation strings for the autoplug-select signal.
+ Fixes #570142.
+
+2009-02-02 10:09:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ Fix string leak in rtspmessage
+ when we remove a header field from a message we must free the value associated
+ with the key to avoid a memory leak.
+
+2009-01-31 18:45:47 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ Its "Base Library" and not just "Library".
+
+2009-01-31 18:44:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ Link to the class, as we can't link to the members yet.
+
+2009-01-30 17:48:23 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Remove pad-removed handlers after setting the decodebins to NULL.
+ They do needed cleanup; without this we leak selector requestpads.
+
+2009-01-30 17:47:07 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Unref selector request pad even if we no longer have a selector.
+ During destruction, we won't have a selector any more, but we still need
+ to unref the pad to avoid leaking it.
+
+2009-01-30 15:23:23 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Unref source in playbin2's finalize method
+
+2009-01-30 12:04:01 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaysink.c:
+ Fix more leaks of pads and elements in gstplaysink.
+ Don't keep extra references to volume and mute elements; we don't need
+ to do so.
+ Ensure we unref pads that we have references to, and release request
+ pads.
+
+2009-01-30 11:04:37 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaysink.c:
+ Avoid leaking all playsinks. Fix some internal leaks.
+ Playsink was holding references to itself. Don't do that, it's not cool.
+ Also, free all chains in dispose.
+
+2009-01-30 10:54:12 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Unref peer request pad after releasing it, since we hold a reference.
+
+2009-01-30 10:52:52 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Fix caps leak in playbin2.
+
+2009-01-30 10:51:11 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Unref active pad from selector when finding active stream.
+
+2009-01-30 10:49:55 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gstplaybin2.c:
+ Free uris when finalizing playbin2 instance.
+
+2009-01-30 10:38:17 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/playback/gsturidecodebin.c:
+ Unref pads when iterating over them in analyse_source.
+ Fixes leak of source's srcpad when using uridecodebin.
+
+2009-01-30 22:22:07 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ Add releaseinfo with online url.
+
+2009-01-30 17:58:15 +0000 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/playback/gstplaybasebin.c:
+ Fix compilation warning on Forte
+
+2009-01-30 17:16:39 +0000 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/adder/gstadder.c:
+ Don't do void pointer arithmetic.
+
+2009-01-30 17:25:51 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Bump common
+
+2009-01-30 08:50:53 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ * common:
+ Use a symbolic link for the pre-commit client-side hook
+
+2009-01-30 08:12:42 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * .gitignore:
+ Add more files/directories to ignore
+
+2009-01-29 14:00:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ fix some typos
+ Fix some typos in the doc string of the new
+ gst_rtsp_options_as_string() method.
+
+2009-01-29 11:55:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ Add new RTSP message method to set header
+ Add gst_rtsp_message_take_header() that takes ownership of the passed header
+ value. This allows us to avoid an allocations and memory copy in some
+ situations.
+ API: GstRTSPMessage::gst_rtsp_message_take_header()
+
+2009-01-29 11:51:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Add new method to docs
+ Add the new gst_rtsp_options_as_text() method to the docs.
+
+2009-01-28 11:48:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ Add method to serialize RTSP options
+ Add gst_rtsp_options_as_text() method to serialize a set of RTSP options to a
+ string.
+ API: GstRTSP::gst_rtsp_options_as_text()
+
+2009-01-26 17:59:37 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ Ensure we have sufficient data when using data scan contexts.
+ Fixes crashes typefinding things that look like they might contain AAC
+ data (but probably aren't actually AAC).
+
+2009-01-26 23:32:09 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * ext/gio/Makefile.am:
+ Fix include order for gio plugin
+
+2009-01-23 23:59:48 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/config.h:
+ Update win32 config.h for 0.10.22.1 dev cycle
+
+2009-01-23 23:16:11 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * .gitignore:
+ * docs/libs/.gitignore:
+ * gst-libs/gst/audio/.gitignore:
+ * gst-libs/gst/video/.gitignore:
+ * po/.gitignore:
+ * tests/examples/dynamic/.gitignore:
+ Extend and clean up git ignores
+
+2009-01-23 12:31:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/README:
+ * gst/audioresample/arch.h:
+ * gst/audioresample/buffer.c:
+ * gst/audioresample/buffer.h:
+ * gst/audioresample/debug.c:
+ * gst/audioresample/debug.h:
+ * gst/audioresample/fixed_arm4.h:
+ * gst/audioresample/fixed_arm5e.h:
+ * gst/audioresample/fixed_bfin.h:
+ * gst/audioresample/fixed_debug.h:
+ * gst/audioresample/fixed_generic.h:
+ * gst/audioresample/functable.c:
+ * gst/audioresample/functable.h:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/resample.h:
+ * gst/audioresample/resample_chunk.c:
+ * gst/audioresample/resample_functable.c:
+ * gst/audioresample/resample_ref.c:
+ * gst/audioresample/resample_sse.h:
+ * gst/audioresample/speex_resampler.h:
+ * gst/audioresample/speex_resampler_double.c:
+ * gst/audioresample/speex_resampler_float.c:
+ * gst/audioresample/speex_resampler_int.c:
+ * gst/audioresample/speex_resampler_wrapper.h:
+ * gst/speexresample/Makefile.am:
+ * gst/speexresample/README:
+ * gst/speexresample/arch.h:
+ * gst/speexresample/fixed_arm4.h:
+ * gst/speexresample/fixed_arm5e.h:
+ * gst/speexresample/fixed_bfin.h:
+ * gst/speexresample/fixed_debug.h:
+ * gst/speexresample/fixed_generic.h:
+ * gst/speexresample/gstspeexresample.c:
+ * gst/speexresample/gstspeexresample.h:
+ * gst/speexresample/resample.c:
+ * gst/speexresample/resample_sse.h:
+ * gst/speexresample/speex_resampler.h:
+ * gst/speexresample/speex_resampler_double.c:
+ * gst/speexresample/speex_resampler_float.c:
+ * gst/speexresample/speex_resampler_int.c:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ * tests/check/Makefile.am:
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/speexresample.c:
+ Rename files and types from speexresample to audioresample
+ Rename files and types from speexresample to audioresample
+ to finish the move and to prevent any confusion.
+
+2009-01-23 11:44:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * sys/xvimage/xvimagesink.c:
+ Add some more debugging to the Xv strides
+ Add some more debugging to the strides as they are received from the server and
+ the expected strides.
+
+2009-01-23 11:40:26 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ Add typefind function for gsm
+ Because core now supports typefindfactories without a typefind function we can
+ register a factory fo GSM that will --if all else fails-- assume the file is a
+ GSM file based on the registered extension.
+ Fixes #566661.
+
+2009-01-23 11:37:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/playback/gsturidecodebin.c:
+ Use more performant link function
+ We can use gst_element_link_pads() instead of the more generic
+ gst_element_link() function because we know the pads. This saves some cycles
+ because the more generic function needs to search for possible compatible caps
+ etc.
+
+2009-01-23 11:33:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c:
+ Add more codec ids for RIFF formats
+ Handle codec ID for various other AAC formats.
+ Sync the list of possible codec ids with that of ffmpeg.
+ Fixes #567255
+
+2009-01-23 11:27:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/theora/theoradec.c:
+ Use rounded values for image strides and sizes
+ Round up the height before calculating the expected size and
+ strides of the output image.
+
+2009-01-23 11:23:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ext/alsa/gstalsasink.c:
+ Improve debug message
+ Improve the debug message when alsa returns an error.
+
+2009-01-23 11:07:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ Reset queued_bytes counter when flushing
+ Set the amount of queued bytes in the internal queue back to 0 when we clear the
+ queue.
+ Fixes #567982
+
+2009-01-23 10:19:27 +0100 Benjamin Gaignard <benjamin@gaignard.net>
+
+ * gst/typefind/gsttypefindfunctions.c:
+ Add typefinder for Mobile XMF. Fixes bug #568707.
+
+2009-01-23 10:00:11 +0100 Brian Cameron <brian.cameron@sun.com>
+
+ * configure.ac:
+ Fix linking on Solaris. Fixes bug #568482.
+ Check for nsl and socket libraries and add them to
+ LIBS if they're found. They're needed for socket()
+ and gethostbyname() on Solaris.
+
+2009-01-22 22:09:47 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/playback/gstplaybasebin.c:
+ Fix use-after-unref problem noticed by Josep Torra Valles, and run gst-indent
+
+2009-01-22 17:46:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Update common snapshot.
+
+2009-01-22 13:47:24 +0100 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * common:
+ Fix pre-commit hook
+
+2009-01-22 13:12:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base
+
+2009-01-22 10:14:28 +0100 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * gst-libs/gst/fft/gstfftf32.c:
+ * gst-libs/gst/fft/gstfftf64.c:
+ * gst-libs/gst/fft/gstffts16.c:
+ * gst-libs/gst/fft/gstffts32.c:
+ Reduce the number of allocations for creating FFT contexts
+ Reduce the number of allocations from 2 to 1 for every FFT
+ context by allocating enough memory for the FFT context
+ and passing parts of it to the kissfft allocation functions.
+
+2009-01-22 11:32:56 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ Back to devel -> 0.10.22.1
+
+2009-01-22 05:57:53 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ * common:
+ Install and use pre-commit indentation hook from common
+
+2009-01-21 13:09:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * tests/check/libs/rtp.c:
+ Avoid overflows in the padding checks by doing the check slightly differently. Add a unit test to check for correct behaviour.
+
+2009-01-21 04:31:32 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ autogen.sh : Use git submodule
+
+=== release 0.10.22 ===
+
+2009-01-19 23:10:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-app.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * po/LINGUAS:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/nb.po:
+ * po/nl.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:
+ * win32/common/config.h:
+ Release 0.10.22
+ Original commit message from CVS:
+ Release 0.10.22
+
+2009-01-19 22:01:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/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:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2009-01-16 11:44:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/fft/: Use correct struct alignment everywhere to prevent unaligned memory accesses, resulting in SIGBUS ...
+ Original commit message from CVS:
+ * gst-libs/gst/fft/_kiss_fft_guts_f32.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_f64.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s16.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s32.h:
+ * gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc):
+ * gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc):
+ * gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc):
+ * gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc):
+ Use correct struct alignment everywhere to prevent unaligned
+ memory accesses, resulting in SIGBUS on sparc and probably others.
+ Fixes bug #500833.
+
+2009-01-16 11:40:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/tag/gsttagdemux.c: Forward unknown events upstream to allow latency configuration.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_srcpad_event):
+ Forward unknown events upstream to allow latency configuration.
+ Fixes bug #567960.
+
+2009-01-13 14:47:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Provide the right arguments to a debug line.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (groups_set_locked_state):
+ Provide the right arguments to a debug line.
+
+2009-01-13 06:51:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Don't reset the colorkey when element is reused. Fixes #567511.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Don't reset the colorkey when element is reused. Fixes #567511.
+
+2009-01-09 23:42:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: 0.10.21.3 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ 0.10.21.3 pre-release
+
+2009-01-09 23:13:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/app/gstappsink.c: Store the returned signal id in the right slot when registering the pull-buffer signal.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c:
+ Store the returned signal id in the right slot when
+ registering the pull-buffer signal.
+ Fixes #567168
+ Spotted by: Thomas Vander Stichele <thomas at apestaart dot org>
+
+2009-01-09 17:17:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixer.c: Small docs addition to clarify that one really mustn't free the constant GList retur...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixer.c:
+ Small docs addition to clarify that one really mustn't free
+ the constant GList returned (#566812).
+
+2009-01-08 17:18:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add GType for GstRTSPUrl and expose a copy function because we can.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspurl.c: (register_rtsp_url_type),
+ (gst_rtsp_url_get_type), (gst_rtsp_url_copy):
+ * gst-libs/gst/rtsp/gstrtspurl.h:
+ * win32/common/libgstrtsp.def:
+ Add GType for GstRTSPUrl and expose a copy function because we can.
+ API: gst_rtsp_url_copy()
+ Fixes #567027.
+
+2009-01-07 18:36:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add plugin dependency for the GIO and GVfs modules.
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/gio/gstgio.c: (plugin_init):
+ Add plugin dependency for the GIO and GVfs modules.
+ Fixes bug #566876.
+
+2009-01-07 18:32:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add plugin dependency for the gnomevfs modules.
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/gnomevfs/gstgnomevfs.c: (plugin_init):
+ Add plugin dependency for the gnomevfs modules.
+ Fixes bug #566875.
+
+2009-01-07 18:30:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstcdda.def: Add new symbol to the list of exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstcdda.def:
+ Add new symbol to the list of exported symbols.
+
+2009-01-07 13:52:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Fix some comments and docs.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (gst_play_bin_set_uri), (gst_play_bin_set_suburi),
+ (no_more_pads_cb), (drained_cb), (group_set_locked_state_unlocked),
+ (activate_group), (deactivate_group), (groups_set_locked_state),
+ (gst_play_bin_change_state):
+ Fix some comments and docs.
+ Post an error message when we fail to link the selector to the sink.
+ Remove pushing of EOS, this seems unneeded.
+ Lock the state of deactivated groups so that they don't accidentally
+ reactivate when the playbin2 state changes.
+ Reuse uridecodebins.
+ Unlock and relock state of groups when playbin goes to NULL.
+ Fixes #566654.
+ Fixes #566341.
+ * gst/playback/gsturidecodebin.c: (pad_removed_cb), (type_found):
+ Only do something in the pad removed callback when we are dealing with
+ our sourcepads because the sinkpads don't have a ghostpad.
+
+2009-01-07 10:50:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/cdda/gstcddabasesrc.*: Make the GType of GstCDDABaseSrcMode public for bindings.
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ * gst-libs/gst/cdda/gstcddabasesrc.h:
+ Make the GType of GstCDDABaseSrcMode public for bindings.
+ Fixes bug #566837.
+
+2009-01-06 18:03:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Use new core API to make registry re-scan the plugin whenever visualisations are added or removed (see #350477).
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/libvisual/visual.c: (plugin_init):
+ Use new core API to make registry re-scan the plugin
+ whenever visualisations are added or removed (see #350477).
+
+2009-01-06 17:30:31 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ gst-libs/gst/audio/gstaudioclock.*: Make gst_audio_clock_new use const gchar* to ease the wrapping of
+ Original commit message from CVS:
+ Patch by: José Alburquerque <jaalburqu svn gnome org>
+ * gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_new):
+ * gst-libs/gst/audio/gstaudioclock.h:
+ Make gst_audio_clock_new use const gchar* to ease the wrapping of
+ C++ bindings. Fixes #566723.
+
+2009-01-06 12:16:18 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add pkg-config files for libgstapp. Fixes bug #566761.
+ Original commit message from CVS:
+ * configure.ac:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-app-uninstalled.pc.in:
+ * pkgconfig/gstreamer-app.pc.in:
+ Add pkg-config files for libgstapp. Fixes bug #566761.
+
+2009-01-06 11:10:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/app/: Make debug categories static. Use _element_class_set_details_simple().
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsink.h:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/app/gstappsrc.h:
+ Make debug categories static. Use _element_class_set_details_simple().
+
+2009-01-06 10:56:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/app/: Move private data into a private instance struct. Add padding to instance and class structures exp...
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (_GstAppSinkPrivate),
+ (gst_app_sink_class_init), (gst_app_sink_init),
+ (gst_app_sink_dispose), (gst_app_sink_finalize),
+ (gst_app_sink_unlock_start), (gst_app_sink_unlock_stop),
+ (gst_app_sink_flush_unlocked), (gst_app_sink_start),
+ (gst_app_sink_stop), (gst_app_sink_event), (gst_app_sink_preroll),
+ (gst_app_sink_render), (gst_app_sink_getcaps),
+ (gst_app_sink_set_caps), (gst_app_sink_get_caps),
+ (gst_app_sink_is_eos), (gst_app_sink_set_emit_signals),
+ (gst_app_sink_get_emit_signals), (gst_app_sink_set_max_buffers),
+ (gst_app_sink_get_max_buffers), (gst_app_sink_set_drop),
+ (gst_app_sink_get_drop), (gst_app_sink_pull_preroll),
+ (gst_app_sink_pull_buffer)::
+ * gst-libs/gst/app/gstappsink.h: (GstAppSinkPrivate), (_GstAppSink)::
+ * gst-libs/gst/app/gstappsrc.c: (_GstAppSrcPrivate),
+ (gst_app_src_class_init), (gst_app_src_init),
+ (gst_app_src_flush_queued), (gst_app_src_dispose),
+ (gst_app_src_finalize), (gst_app_src_set_property),
+ (gst_app_src_get_property), (gst_app_src_unlock),
+ (gst_app_src_unlock_stop), (gst_app_src_start), (gst_app_src_stop),
+ (gst_app_src_is_seekable), (gst_app_src_check_get_range),
+ (gst_app_src_query), (gst_app_src_do_seek), (gst_app_src_create),
+ (gst_app_src_set_caps), (gst_app_src_get_caps),
+ (gst_app_src_set_size), (gst_app_src_get_size),
+ (gst_app_src_set_stream_type), (gst_app_src_get_stream_type),
+ (gst_app_src_set_max_bytes), (gst_app_src_get_max_bytes),
+ (gst_app_src_set_latencies), (gst_app_src_set_latency),
+ (gst_app_src_get_latency), (gst_app_src_push_buffer_full),
+ (gst_app_src_push_buffer_action), (gst_app_src_end_of_stream)::
+ * gst-libs/gst/app/gstappsrc.h: (GstAppSrcPrivate)::
+ Move private data into a private instance struct. Add padding to
+ instance and class structures exposed in public headers. Add
+ Since markers to the gtk-doc blurbs (#566750).
+
+2009-01-06 10:50:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/app/appsrc_ex.c: Some comments.
+ Original commit message from CVS:
+ * tests/examples/app/appsrc_ex.c: (main):
+ Some comments.
+ When pulling a buffer we can get NULL when the element is EOS, don't try
+ to unref this NULL buffer.
+
+2009-01-06 10:16:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/video/: Fix up build flags and include statement for the new generated enumtypes files, to fix dist.
+ Original commit message from CVS:
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/video.h:
+ Fix up build flags and include statement for the new generated
+ enumtypes files, to fix dist.
+
+2009-01-05 23:04:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Move AppSrc/AppSink from gst-plugins-bad. Fixes #564421
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-app.xml:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * tests/examples/Makefile.am:
+ * tests/examples/app/Makefile.am:
+ Move AppSrc/AppSink from gst-plugins-bad. Fixes #564421
+
+2009-01-05 17:13:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Avoid holding the OBJECT_LOCK when calling ringbuffer functions that take the ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_change_state):
+ Avoid holding the OBJECT_LOCK when calling ringbuffer functions that
+ take the ringbuffer lock because rinbuffer lock > OBJECT_LOCK. We can do
+ this because the async_play method is deprecated and usually not called
+ anymore.
+
+2009-01-05 12:18:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Disconnect signal handlers before destroying a previous decodebin so that we don't end up...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (notify_source_cb), (activate_group):
+ Disconnect signal handlers before destroying a previous decodebin so
+ that we don't end up causing deadlocks. Fixes #566586.
+
+2009-01-05 10:59:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: Add property to control pull/push based scheduling.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_class_init), (gst_audio_test_src_init),
+ (gst_audio_test_src_check_get_range),
+ (gst_audio_test_src_set_property),
+ (gst_audio_test_src_get_property):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Add property to control pull/push based scheduling.
+
+2009-01-02 15:04:13 +0000 Alessandro Decina <alessandro.d@gmail.com>
+
+ Make the seek and colorkey examples depend on gtk+-x11 as they use
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/examples/seek/Makefile.am:
+ * tests/icles/Makefile.am:
+ Make the seek and colorkey examples depend on gtk+-x11 as they use
+ GDK_WINDOW_XID.
+ Fixes the build with gtk+-quartz.
+
+2008-12-31 16:04:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/: Add new exports to win32 files.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ * win32/common/libgsttag.def:
+ * win32/common/libgstvideo.def:
+ Add new exports to win32 files.
+
+2008-12-31 13:31:55 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/tag/gsttagdemux.*: Add GType for GstTagDemuxResult enum.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_result_get_type):
+ * gst-libs/gst/tag/gsttagdemux.h:
+ Add GType for GstTagDemuxResult enum.
+
+2008-12-31 13:01:30 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/video/: Add glib-mkenum for GstVideoFormat enum GTYPE auto-generation.
+ Original commit message from CVS:
+ * gst-libs/gst/video/Makefile.am:
+ * gst-libs/gst/video/video.h:
+ Add glib-mkenum for GstVideoFormat enum GTYPE auto-generation.
+ This will help bindings to use it.
+
+2008-12-31 11:20:26 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Switch glib-mkenum for gst-libs/gst/audio from multichannel- to audio- in order to wrap all enums declarations of tha...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/audio/testchannels.c:
+ * win32/MANIFEST:
+ * win32/common/audio-enumtypes.c:
+ (gst_audio_channel_position_get_type),
+ (gst_ring_buffer_state_get_type),
+ (gst_ring_buffer_seg_state_get_type),
+ (gst_buffer_format_type_get_type), (gst_buffer_format_get_type):
+ * win32/common/audio-enumtypes.h:
+ * win32/common/multichannel-enumtypes.c:
+ * win32/common/multichannel-enumtypes.h:
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/libgstaudio.dsp:
+ * win32/vs7/libgstaudio.vcproj:
+ * win32/vs8/libgstaudio.vcproj:
+ Switch glib-mkenum for gst-libs/gst/audio from multichannel- to
+ audio- in order to wrap all enums declarations of that library.
+ This modification should not matter since that header file is not a
+ public header (it will be included by public headers).
+ Modify win32 crap^Wfiles accordingly.
+
+2008-12-30 17:55:07 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/audio/: Complete Sebastien's commit from the 13th by exporting the _slave_method_get_type() methods.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Complete Sebastien's commit from the 13th by exporting the
+ _slave_method_get_type() methods.
+
+2008-12-29 16:45:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsrc.*: Add properties and methods to configure and retrieve the min and max latencies.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_init), (gst_app_src_set_property),
+ (gst_app_src_get_property), (gst_app_src_query),
+ (gst_app_src_set_latencies), (gst_app_src_set_latency),
+ (gst_app_src_get_latency), (gst_app_src_push_buffer_full):
+ * gst-libs/gst/app/gstappsrc.h:
+ Add properties and methods to configure and retrieve the min and max
+ latencies.
+
+2008-12-20 17:38:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/: Implement URI query. Fixes bug #562949.
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesink.c: (gst_gio_base_sink_query):
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_class_init),
+ (gst_gio_base_src_query):
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_query):
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init),
+ (gst_gnome_vfs_src_query):
+ Implement URI query. Fixes bug #562949.
+
+2008-12-20 12:48:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Add some debug info.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (no_more_pads_cb):
+ Add some debug info.
+ * gst/playback/gstplaysink.c: (gen_video_chain), (gen_audio_chain),
+ (gst_play_sink_reconfigure), (gst_play_sink_request_pad),
+ (gst_play_sink_release_pad):
+ Add some more debug info.
+ Reconfigure the audio chain when we switch between raw and encoded audio
+ in gapless playback.
+
+2008-12-20 12:45:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Pause the write thread before deactivating and releasing the ringbuffer to avo...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_setcaps):
+ Pause the write thread before deactivating and releasing the ringbuffer
+ to avoid a deadlock when we do gapless playback with different sample
+ rates in playbin2. Fixes #564929.
+
+2008-12-19 13:03:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Make GstAudioSrcSlaveMethod get_type() function non-static as it's public now.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ Make GstAudioSrcSlaveMethod get_type() function non-static
+ as it's public now.
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstnetbuffer.def:
+ Add some missing functions to the list of exported symbols.
+
+2008-12-18 12:37:33 +0000 Andrew Feren <acferen@yahoo.com>
+
+ gst-libs/gst/netbuffer/gstnetbuffer.*: Make gst_netaddress_get_ip4_address fail for v6 addresses.
+ Original commit message from CVS:
+ Patch by: Andrew Feren <acferen at yahoo dot com>
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ (gst_netaddress_get_ip4_address), (gst_netaddress_get_ip6_address),
+ (gst_netaddress_get_address_bytes),
+ (gst_netaddress_set_address_bytes):
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ Make gst_netaddress_get_ip4_address fail for v6 addresses.
+ Make gst_netaddress_get_ip6_address either fail or return the v4
+ address as a transitional v6 address.
+ Add two convenience functions:
+ API: gst_netaddress_get_address_bytes()
+ API: gst_netaddress_set_address_bytes()
+ Fixes #564896.
+
+2008-12-17 13:51:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add appsrc and appsink documentation.
+ 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-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init):
+ Add appsrc and appsink documentation.
+
+2008-12-17 08:51:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/: Cleanup variable names to make the adder-loop easier to understand.
+ Original commit message from CVS:
+ * gst/adder/Makefile.am:
+ * gst/adder/gstadder.c:
+ Cleanup variable names to make the adder-loop easier to understand.
+ Also try to use liboil to spee it up, but ifdef it out as it does not
+ make any change for me (Intel pentim M (sse,sse2) please try on other
+ systems).
+
+2008-12-16 20:16:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add minimal docs to make the remaining tcp elements show up.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversrc.c:
+ Add minimal docs to make the remaining tcp elements show up.
+ Fixes #564139.
+
+2008-12-15 12:02:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/: Fix example to unref after emiting the push-buffer action.
+ Original commit message from CVS:
+ * examples/app/appsrc-ra.c: (feed_data):
+ * examples/app/appsrc-seekable.c: (feed_data):
+ * examples/app/appsrc-stream.c: (read_data):
+ * examples/app/appsrc-stream2.c: (feed_data):
+ Fix example to unref after emiting the push-buffer action.
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_push_buffer_full), (gst_app_src_push_buffer),
+ (gst_app_src_push_buffer_action):
+ Don't take the ref on the buffer in push-buffer action because it's too
+ awkward for bindings. Fixes #564482.
+
+2008-12-13 19:32:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/config.h: Update to CVS version.
+ Original commit message from CVS:
+ * win32/common/config.h:
+ Update to CVS version.
+ * win32/common/config.h.in:
+ Hardcode path to plugin install helper exe, just like we hardcode
+ the paths in core. Removes another source of VCS conflicts for
+ people hacking gst-plugins-base on systems with autotools.
+
+2008-12-13 16:21:12 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ m4/Makefile.am: And a couple more .m4 that don't exist anymore with gettext 0.17
+ Original commit message from CVS:
+ * m4/Makefile.am:
+ And a couple more .m4 that don't exist anymore with gettext 0.17
+
+2008-12-13 12:41:56 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ 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-13 06:57:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/: API: Add GST_TYPE_BASE_AUDIO_(SRC|SINK)_SLAVE_METHOD to the public API. This is needed for the C...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_slave_method_get_type),
+ (gst_base_audio_sink_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_slave_method_get_type),
+ (gst_base_audio_src_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ API: Add GST_TYPE_BASE_AUDIO_(SRC|SINK)_SLAVE_METHOD to the
+ public API. This is needed for the C++ bindings to be able
+ to use this base classes. Fixes bug #564200, #564206.
+
+2008-12-12 19:41:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: Remove erroneous gst_buffer_ref().
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_handle_event):
+ Remove erroneous gst_buffer_ref().
+ * tests/check/libs/rtp.c: (GST_START_TEST):
+ Don't forget to unref the buffer once you're done with it.
+
+2008-12-12 13:06:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/: XRef to GstXOverlay.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ XRef to GstXOverlay.
+
+2008-12-12 10:54:45 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gsturidecodebin.c: Free the factory array when finalizing.
+ Original commit message from CVS:
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_finalize):
+ Free the factory array when finalizing.
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init):
+ Use a GstStaticPadTemplate since the src pad caps are fixed.
+
+2008-12-12 07:17:21 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisenc.c: Make vorbisenc's pad template behave like vorbisdec's. Fixes a leak with pad templates.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_base_init),
+ (gst_vorbis_enc_init):
+ Make vorbisenc's pad template behave like vorbisdec's. Fixes a leak with
+ pad templates.
+
+2008-12-12 07:15:22 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Add mapping for VP6 in avi/riff.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add mapping for VP6 in avi/riff.
+
+2008-12-11 15:49:12 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/subparse/samiparse.c: Some versions of libxml seem to be very picky as to strict formatting of the input and neve...
+ Original commit message from CVS:
+ * gst/subparse/samiparse.c: (sami_context_push_state),
+ (sami_context_pop_state), (start_sami_element), (end_sami_element):
+ Some versions of libxml seem to be very picky as to strict formatting
+ of the input and never 'close' the final </body> tag.
+ In order to fix that bad behaviour, we trigger the flushing of
+ remaining data on both </body> and </sami>.
+ Fixes #557365
+
+2008-12-11 12:32:03 +0000 Guillaume Emont <guillaume@fluendo.com>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinders for MS Word files and OS X .DS_Store files to prevent them to be...
+ Original commit message from CVS:
+ Patch by: Guillaume Emont <guillaume at fluendo dot com>
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Add typefinders for MS Word files and OS X .DS_Store files to
+ prevent them to be recognized as MPEG files. Fixes bug #564098.
+
+2008-12-11 11:04:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Add some more debug info.
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gen_audio_chain),
+ (gst_play_sink_reconfigure):
+ Add some more debug info.
+ Fix linking of just an encoded sink.
+ Handle failure to create a sink chain more gracefully than crashing.
+
+2008-12-11 10:33:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/pipelines/theoraenc.c: Pushing 10 buffers is enough to run the test.
+ Original commit message from CVS:
+ * tests/check/pipelines/theoraenc.c: (GST_START_TEST):
+ Pushing 10 buffers is enough to run the test.
+
+2008-12-11 10:28:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Hook up the SKIP seek flag.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (do_seek), (stop_cb),
+ (skip_toggle_cb), (rate_spinbutton_changed_cb), (msg_segment_done),
+ (main):
+ Hook up the SKIP seek flag.
+
+2008-12-10 18:43:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Error out with a missing-plugin error when the input-selector was not found.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (pad_added_cb):
+ Error out with a missing-plugin error when the input-selector was not
+ found.
+ * gst/playback/gstplaysink.c: (gst_play_sink_reconfigure):
+ Indentation.
+
+2008-12-10 17:39:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Use G_DEFINE_TYPE.
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gst_play_sink_class_init),
+ (gst_play_sink_dispose), (gst_play_sink_finalize), (try_element),
+ (gen_video_chain), (gen_audio_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_send_event), (gst_play_sink_change_state):
+ Use G_DEFINE_TYPE.
+ Try to set the selected sink to READY before using it. This will allow
+ for detection of incompatible formats sooner.
+ Don't cause a fatal error when conversion elements are missing but post
+ a missing-element message and a warning instead because things might
+ still link and run fine.
+ Simplyfy the construction of audio and video sink chains.
+
+2008-12-10 14:55:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Use G_DEFINE_TYPE for the OggPad to get some threadsafe type init from glib.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_class_init),
+ (gst_ogg_pad_dispose), (gst_ogg_pad_finalize):
+ Use G_DEFINE_TYPE for the OggPad to get some threadsafe type
+ init from glib.
+
+2008-12-10 08:19:13 +0000 Luis Menina <liberforce@freeside.fr>
+
+ gst/: Include glib.h instead of a specific GLib header. Including single
+ Original commit message from CVS:
+ Patch by: Luis Menina <liberforce at freeside dot fr>
+ * gst-libs/gst/floatcast/floatcast.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ Include glib.h instead of a specific GLib header. Including single
+ GLib headers is deprecated. Fixes bug #563904.
+
+2008-12-09 18:30:10 +0000 Julien Moutte <julien@moutte.net>
+
+ gst-libs/gst/riff/riff-media.c: Support higher max audio rates for some formats (WAV, Vorbis, LPCM).
+ Original commit message from CVS:
+ 2008-12-09 Julien Moutte <julien@fluendo.com>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Support higher max audio rates for some formats (WAV, Vorbis, LPCM).
+
+2008-12-09 17:21:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-read.c: Fix handling of odd chunks in riff metadata.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c:
+ Fix handling of odd chunks in riff metadata.
+
+2008-12-08 18:44:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/volume/gstvolume.c: Use new basetransform vmethod to reconfigure the dynamic properties and any pending volume/mu...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (gst_volume_class_init),
+ (volume_before_transform), (volume_transform_ip):
+ Use new basetransform vmethod to reconfigure the dynamic properties and
+ any pending volume/mute changes. Fixes #563508.
+
+2008-12-08 18:12:18 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: First check for "theoraenc theoradec" and if that failed check for "theora >= 1.0alpha5". The former ap...
+ Original commit message from CVS:
+ * configure.ac:
+ First check for "theoraenc theoradec" and if that failed check
+ for "theora >= 1.0alpha5". The former appeared in 1.0beta3 and
+ deprecate the latter. Also linking on Windows fails with just "theora"
+ and the version check would fail for the release candidates.
+ Fixes bug #563718.
+
+2008-12-08 15:25:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/: Add basic docs to decodebin and link to decodebin from decodebin2.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ Add basic docs to decodebin and link to decodebin from decodebin2.
+
+2008-12-08 12:08:32 +0000 Olivier Crete <tester@tester.ca>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.*: Implement gst_rtcp_packet_remove(). Fixes #563174.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester ca>
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_remove):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Implement gst_rtcp_packet_remove(). Fixes #563174.
+ * tests/check/libs/rtp.c: (GST_START_TEST), (rtp_suite):
+ Add unit test for some RTCP functions.
+
+2008-12-04 20:09:19 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ 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:12 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ 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-12-03 17:47:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ sys/: Clear all flags on buffers returned from the image pool.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_buffer_alloc):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_buffer_alloc):
+ Clear all flags on buffers returned from the image pool.
+ Fixes #563143
+
+2008-12-01 19:36:35 +0000 이문형 <iwings@gmail.com>
+
+ gst-libs/gst/app/gstappsrc.c: Don't forget to release the lock again if we bail out because some pad is flushing or w...
+ Original commit message from CVS:
+ Patch by: 이문형 <iwings at gmail dot com>
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_push_buffer):
+ Don't forget to release the lock again if we bail out because some
+ pad is flushing or we've reached EOS, otherwise things will lock up
+ next time _push_buffer() is called (#562802).
+
+2008-11-29 13:31:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ 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
+ <yselkowitz at users dot sourceforge dot net>
+ * 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 13:30:36 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * ChangeLog:
+ * gst/speexresample/Makefile.am:
+ fix build
+ Original commit message from CVS:
+ fix build
+
+2008-11-28 09:44:12 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Update documentation of speexresample for the new element name.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * gst/speexresample/gstspeexresample.c:
+ Update documentation of speexresample for the new element name.
+
+2008-11-28 09:04:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/README: Update README with the latest diff between the Speex resampler and our copy.
+ Original commit message from CVS:
+ * gst/speexresample/README:
+ Update README with the latest diff between the Speex resampler
+ and our copy.
+
+2008-11-28 08:37:50 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Update the debug category from speex_resample to audioresample.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c: (plugin_init):
+ Update the debug category from speex_resample to audioresample.
+
+2008-11-27 19:13:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Remove audioresample files.
+ Original commit message from CVS:
+ * gst/audioresample/Makefile.am:
+ * gst/audioresample/buffer.c:
+ * gst/audioresample/buffer.h:
+ * gst/audioresample/debug.c:
+ * gst/audioresample/debug.h:
+ * gst/audioresample/functable.c:
+ * gst/audioresample/functable.h:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audioresample/resample.c:
+ * gst/audioresample/resample.h:
+ * gst/audioresample/resample_chunk.c:
+ * gst/audioresample/resample_functable.c:
+ * gst/audioresample/resample_ref.c:
+ * tests/check/elements/audioresample.c:
+ Remove audioresample files.
+
+2008-11-27 17:04:07 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/plugins/inspect/plugin-audioresample.xml: Regenerated for library filename change.
+ Original commit message from CVS:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ Regenerated for library filename change.
+
+2008-11-27 16:57:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Rename the moved speexresample to audioresample, integrate into the build system and remove the old audioresample fro...
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst/speexresample/gstspeexresample.c: (plugin_init):
+ * gst/speexresample/Makefile.am:
+ * tests/check/Makefile.am:
+ * tests/check/elements/speexresample.c: (setup_speexresample),
+ (GST_START_TEST), (test_pipeline):
+ Rename the moved speexresample to audioresample, integrate into the
+ build system and remove the old audioresample from the build system.
+ Fixes bug #558124, #385061, #346218, #116051.
+
+2008-11-27 16:47:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Avoid nasty int overflows after about 12 hours and 25 minutes when these code p...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_get_offset), (gst_base_audio_src_create):
+ Avoid nasty int overflows after about 12 hours and 25 minutes when these
+ code paths are triggered.
+ A free beer to Håvard Graff for finding this!
+
+2008-11-27 11:16:44 +0000 이문형 <iwings@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: A successful gst_poll_wait() doesn't always mean successful connect() on
+ Original commit message from CVS:
+ Patch by: 이문형 <iwings at gmail dot com>
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect):
+ A successful gst_poll_wait() doesn't always mean successful connect() on
+ Windows. We should check errors by calling gst_poll_fd_has_error().
+ See #561924.
+
+2008-11-25 16:37:50 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/speexresample.c: Make unit test again faster to prevent timeouts with valgrind.
+ Original commit message from CVS:
+ * tests/check/elements/speexresample.c: (test_pipeline):
+ Make unit test again faster to prevent timeouts with valgrind.
+
+2008-11-25 15:33:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.c: Fix typo in the docs.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ Fix typo in the docs.
+
+2008-11-25 15:28:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: If no stream was found before receiving EOS, post an error message.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_sink_event):
+ If no stream was found before receiving EOS, post an error message.
+ Fixes #561924.
+
+2008-11-25 15:14:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/: Parse segment events.
+ Original commit message from CVS:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c: (gst_theora_enc_init),
+ (theora_buffer_from_packet), (theora_push_packet),
+ (theora_enc_sink_event), (theora_enc_is_discontinuous),
+ (theora_enc_chain):
+ Parse segment events.
+ Pass incomming buffer timestamps to outgoing buffers.
+ Use the running_time to construct the granulepos.
+ Fixes #562163.
+
+2008-11-25 11:00:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Fix buffer-duration property.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (activate_group):
+ Fix buffer-duration property.
+
+2008-11-25 10:32:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Really fix audiosink drain handling by keeping track of the running_time of th...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain), (gst_base_audio_sink_event),
+ (gst_base_audio_sink_sync_latency), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_change_state):
+ Really fix audiosink drain handling by keeping track of the running_time
+ of the last sample.
+
+2008-11-24 20:25:24 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstplaybin2.c: Add notification of current stream. Add ability to configure buffer sizes.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c:
+ Add notification of current stream. Add ability to configure buffer
+ sizes.
+ * gst/playback/gsturidecodebin.c:
+ Add ability to configure buffer sizes for streaming mode.
+ Bug #561734.
+
+2008-11-24 20:11:52 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Time is already in running_time. Remove base_time handling. Fixes audiosinks n...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ Time is already in running_time. Remove base_time handling. Fixes
+ audiosinks not draining and thus chopping some audio in the end.
+
+2008-11-24 19:18:59 +0000 David Schleef <ds@schleef.org>
+
+ ext/ogg/gstoggmux.*: If we're muxing a dirac stream, flush the page after every picture.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ If we're muxing a dirac stream, flush the page after every picture.
+
+2008-11-24 12:56:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Add one log message to check for audio_drained. Sync one log message with the ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ Add one log message to check for audio_drained. Sync one log message
+ with the condition. Send EOS after draining audio in pull mode.
+
+2008-11-24 12:07:10 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/: Use gst_buffer_try_new_and_alloc() and fail properly if the allocation failed. This prevents abort() if downstr...
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_create):
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_create):
+ Use gst_buffer_try_new_and_alloc() and fail properly if the
+ allocation failed. This prevents abort() if downstream elements
+ request an insane amount of memory.
+
+2008-11-24 12:03:11 +0000 Jon Trowbridge <trow@ximian.com>
+
+ gst/volume/gstvolume.*: Cleanup volume, define and use default values.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (volume_update_volume), (gst_volume_set_volume),
+ (gst_volume_get_volume), (gst_volume_set_mute),
+ (gst_volume_class_init), (gst_volume_init),
+ (volume_process_double), (volume_process_float),
+ (volume_process_int32), (volume_process_int32_clamp),
+ (volume_process_int24), (volume_process_int24_clamp),
+ (volume_process_int16), (volume_process_int16_clamp),
+ (volume_process_int8), (volume_process_int8_clamp), (volume_setup),
+ (volume_transform_ip), (volume_set_property),
+ (volume_get_property):
+ * gst/volume/gstvolume.h:
+ Cleanup volume, define and use default values.
+ Recalculate new volume and mute setup before processing. Fixes #561789.
+ * tests/check/elements/volume.c: (GST_START_TEST), (volume_suite):
+ Add controller unit test. Patch by: Jonathan Matthew
+ Fix bogus test that messed with basetransform's internal state.
+
+2008-11-22 15:02:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/speexresample.c: Make the unit test a bit faster to prevent timeouts, especially with valgrind.
+ Original commit message from CVS:
+ * tests/check/elements/speexresample.c: (GST_START_TEST):
+ Make the unit test a bit faster to prevent timeouts, especially
+ with valgrind.
+
+2008-11-22 14:44:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videorate/gstvideorate.c: Add jpeg and png image media types to the caps. Fixes #561436.
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c:
+ Add jpeg and png image media types to the caps. Fixes #561436.
+
+2008-11-22 14:31:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Don't post an error when we can't configure the volume but post a warning instead. Fixes ...
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gen_audio_chain):
+ Don't post an error when we can't configure the volume but post a
+ warning instead. Fixes #561780.
+
+2008-11-21 20:32:56 +0000 Jonathan Rosser <jonathan.rosser@rd.bbc.co.uk>
+
+ gst/videotestsrc/: Add a zone plate pattern generator based on BBC R&D Report 1978/23 (yeah *that* 1978). Try 'video...
+ Original commit message from CVS:
+ Patch by: Jonathan Rosser <jonathan.rosser@rd.bbc.co.uk>
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ Add a zone plate pattern generator based on BBC R&D Report
+ 1978/23 (yeah *that* 1978). Try 'videotestsrc pattern=zone-plate
+ kx2=20 ky2=20 kt=1'.
+
+2008-11-21 15:45:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Add a "filter-length" property that maps to the quality values for compatibilty...
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_class_init), (gst_speex_resample_set_property),
+ (gst_speex_resample_get_property):
+ Add a "filter-length" property that maps to the quality values
+ for compatibilty with audioresample.
+
+2008-11-21 00:04:48 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstdecodebin2.c: Fix random fat-fingering making this not compile.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ Fix random fat-fingering making this not compile.
+
+2008-11-20 22:11:38 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstdecodebin2.c: If the top-level type of the stream is plain text, don't try to decode it, matching beh...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ If the top-level type of the stream is plain text, don't try to decode
+ it, matching behaviour of decodebin.
+ * gst/playback/gstplaysink.c:
+ If we fail to generate a text chain (e.g. due to missing optional
+ plugins), don't crash.
+
+2008-11-20 22:06:05 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/rtsp/gstrtspdefs.c: Fix win32 build. Oops.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ Fix win32 build. Oops.
+
+2008-11-20 21:40:49 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/rtsp/gstrtspdefs.c: Use WSAGetLastError() rather than errno/h_errno on win32.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspdefs.c:
+ Use WSAGetLastError() rather than errno/h_errno on win32.
+
+2008-11-20 21:20:27 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/riff/riff-media.c: Support WMA Lossless properly.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c:
+ Support WMA Lossless properly.
+
+2008-11-19 00:24:44 +0000 David Schleef <ds@schleef.org>
+
+ gst/videotestsrc/: Add "colorspec" property, specifying whether to generate BT.601 or BT.709 video. This only affect...
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ Add "colorspec" property, specifying whether to generate BT.601
+ or BT.709 video. This only affects YCbCr values, not RGB, since
+ if you're generating a 709 test pattern, presumably you want
+ 709 RGB primaries, not 601. Also add "smpte75" pattern, which
+ uses 75% colors instead of 100%, since this is often more useful
+ for testing (and also follows the SMPTE EG-1 guideline).
+
+2008-11-18 18:08:42 +0000 Alessandro Decina <alessandro.d@gmail.com>
+
+ gst/playback/gstdecodebin.c: Add a "sink-caps" property to decodebin like it's done for decodebin2.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c:
+ Add a "sink-caps" property to decodebin like it's done for decodebin2.
+ Fixes #560380.
+
+2008-11-14 21:44:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/audioresample/gstaudioresample.c: Guard against a NULL dereference I somehow encountered - with a FLUSH_STOP arri...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ Guard against a NULL dereference I somehow encountered -
+ with a FLUSH_STOP arriving either before basetransform _start(),
+ or after _stop().
+ * gst/typefind/gsttypefindfunctions.c:
+ Make sure we never jump backwards when typefinding corrupt mov files.
+
+2008-11-14 21:39:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/propertyprobe.c: Fix random type causing a docs warning.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ Fix random type causing a docs warning.
+
+2008-11-14 15:40:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/v4l/gstv4l.c: Give it a minimal rank for autovideosrc.
+ Original commit message from CVS:
+ * sys/v4l/gstv4l.c:
+ Give it a minimal rank for autovideosrc.
+
+2008-11-13 21:11:13 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ gst/typefind/gsttypefindfunctions.c: Improve typefinding of ISO JPEG2000 mime types.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (jp2_type_find),
+ (plugin_init):
+ Improve typefinding of ISO JPEG2000 mime types.
+
+2008-11-13 18:18:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/xvimage/xvimagesink.*: Avoid typechecking when we do trivial casts.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_finalize),
+ (gst_xvimagesink_xvimage_put), (gst_xvimagesink_setcaps),
+ (gst_xvimagesink_show_frame), (gst_xvimagesink_buffer_alloc):
+ * sys/xvimage/xvimagesink.h:
+ Avoid typechecking when we do trivial casts.
+ Move error handling out of the main program flow.
+ Sneak in the display-region caps property, not completely correct yet.
+ Cache the width/height in buffer_alloc instead of parsing it from the
+ caps all the time.
+
+2008-11-13 17:27:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: don't try to unlink the selector sinkpad when we don't have it yet. This can happen if an...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (deactivate_group):
+ don't try to unlink the selector sinkpad when we don't have it yet. This
+ can happen if an error occured before the group was complete.
+
+2008-11-13 15:37:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Avoid expensive type checks we already did as part of the _validate() function that ...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data),
+ (gst_rtp_buffer_set_packet_len), (gst_rtp_buffer_get_packet_len),
+ (gst_rtp_buffer_get_header_len), (gst_rtp_buffer_get_version),
+ (gst_rtp_buffer_set_version), (gst_rtp_buffer_get_padding),
+ (gst_rtp_buffer_set_padding), (gst_rtp_buffer_pad_to),
+ (gst_rtp_buffer_get_extension), (gst_rtp_buffer_set_extension),
+ (gst_rtp_buffer_get_extension_data),
+ (gst_rtp_buffer_set_extension_data), (gst_rtp_buffer_get_ssrc),
+ (gst_rtp_buffer_set_ssrc), (gst_rtp_buffer_get_csrc_count),
+ (gst_rtp_buffer_get_csrc), (gst_rtp_buffer_set_csrc),
+ (gst_rtp_buffer_get_marker), (gst_rtp_buffer_set_marker),
+ (gst_rtp_buffer_get_payload_type),
+ (gst_rtp_buffer_set_payload_type), (gst_rtp_buffer_get_seq),
+ (gst_rtp_buffer_set_seq), (gst_rtp_buffer_get_timestamp),
+ (gst_rtp_buffer_set_timestamp),
+ (gst_rtp_buffer_get_payload_subbuffer),
+ (gst_rtp_buffer_get_payload_len), (gst_rtp_buffer_get_payload):
+ Avoid expensive type checks we already did as part of the
+ _validate() function that should be called first.
+
+2008-11-11 16:40:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Fix some cases where a newsegment event was not sent.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c: (create_segment_event),
+ (gst_base_rtp_depayload_push_full),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Fix some cases where a newsegment event was not sent.
+
+2008-11-11 15:52:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Catch state change errors and stop from the uridecodebin elements instead of trying to co...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (activate_group):
+ Catch state change errors and stop from the uridecodebin elements
+ instead of trying to continue in vain.
+
+2008-11-10 14:53:45 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/: Wim, you're a bad boy. You don't want people to contact you or what?
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst/h264parse/gsth264parse.c:
+ Wim, you're a bad boy. You don't want people to contact you or what?
+
+2008-11-10 14:22:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Use gst_base_sink_do_preroll() to wait for PLAYING and before waiting for the ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_sync_latency), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_callback):
+ Use gst_base_sink_do_preroll() to wait for PLAYING and before waiting
+ for the latency to expire, fixes #559567.
+
+2008-11-10 13:55:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/adder/gstadder.c: Change author string after seeing output of gst-inspector.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Change author string after seeing output of gst-inspector.
+
+2008-11-10 10:33:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Don't try to do crazy things when we only have a text pad without a video pad. Fixes #559...
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gst_play_sink_reconfigure):
+ Don't try to do crazy things when we only have a text pad without a
+ video pad. Fixes #559478.
+
+2008-11-07 17:35:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsrc.*: Add is-live property.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_init), (gst_app_src_set_property),
+ (gst_app_src_get_property), (gst_app_src_push_buffer):
+ * gst-libs/gst/app/gstappsrc.h:
+ Add is-live property.
+ Add some more docs.
+
+2008-11-06 12:14:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: Fix case where we don't have a range for the rates or channels as is the case with tr...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Fix case where we don't have a range for the rates or channels as is the
+ case with truespeech.
+
+2008-11-05 19:18:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/volume/gstvolume.*: Keep negotiated state in a separate variable.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_update_real_volume),
+ (gst_volume_set_volume), (gst_volume_get_volume),
+ (gst_volume_set_mute), (gst_volume_init), (volume_setup),
+ (volume_transform_ip), (volume_update_mute),
+ (volume_update_volume), (volume_get_property):
+ * gst/volume/gstvolume.h:
+ Keep negotiated state in a separate variable.
+ Protect the volume and mute properties with the object lock.
+ Protect modifying the transform with the transform lock.
+
+2008-11-05 12:20:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Only convert caps to string when debug is enabled.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps):
+ Only convert caps to string when debug is enabled.
+
+2008-11-04 18:17:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/: Copy seqnum.
+ Original commit message from CVS:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_init),
+ (gst_theora_dec_reset), (theora_dec_src_event),
+ (theora_dec_sink_event), (theora_handle_type_packet):
+ Copy seqnum.
+ Keep events in a pending list, like vorbisdec, instead of trying
+ to construct a segment event ourselves.
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_reset),
+ (vorbis_dec_src_event), (vorbis_dec_sink_event):
+ * ext/vorbis/vorbisdec.h:
+ Copy seqnum.
+
+2008-11-04 17:24:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.*: Copy seqnums around to track playback segments and messages.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_deactivate_current_chain),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_handle_page),
+ (gst_ogg_demux_loop):
+ * ext/ogg/gstoggdemux.h:
+ Copy seqnums around to track playback segments and messages.
+
+2008-11-04 12:42:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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-11-03 15:30:14 +0000 Matthias Kretz <kretz@kde.org>
+
+ ext/alsa/gstalsasink.c: Make all access non-blocking so that we can better handle unplugging of usb devices. Fixes #5...
+ Original commit message from CVS:
+ Based on patch by: Matthias Kretz <kretz at kde dot org>
+ * ext/alsa/gstalsasink.c: (gst_alsasink_open),
+ (gst_alsasink_prepare), (gst_alsasink_unprepare),
+ (gst_alsasink_write):
+ Make all access non-blocking so that we can better handle unplugging
+ of usb devices. Fixes #559111
+
+2008-11-03 10:49:24 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Make the next call to poll not depend on previous calls to poll with or withou...
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien.lespiau gmail com>
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_write):
+ Make the next call to poll not depend on previous calls to poll with or
+ without reading from the active descriptor. Fixes #544293.
+
+2008-11-03 08:55:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Add TODO at the top of the file for enabling SSE/ARM specific optimizations and...
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_convert_buffer):
+ Add TODO at the top of the file for enabling SSE/ARM specific
+ optimizations and choosing the fastest implementation at runtime.
+ Add g_assert_not_reached() at two places that should really never
+ be reached.
+
+2008-11-02 09:19:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Fix format string and arguments.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_check_discont):
+ Fix format string and arguments.
+ * gst/speexresample/resample_sse.h:
+ Add missing file.
+
+2008-11-01 19:38:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/: Add missing headers to Makefile.am.
+ Original commit message from CVS:
+ * gst/speexresample/Makefile.am:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_base_init), (gst_speex_resample_get_funcs),
+ (gst_speex_resample_convert_buffer), (_benchmark_int_float),
+ (_benchmark_int_int), (_benchmark_integer_resampling),
+ (plugin_init):
+ * gst/speexresample/gstspeexresample.h:
+ * gst/speexresample/resample.c:
+ * gst/speexresample/speex_resampler_double.c:
+ * gst/speexresample/speex_resampler_float.c:
+ * gst/speexresample/speex_resampler_int.c:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ Add missing headers to Makefile.am.
+ Update copyright, years and my mail address.
+ Benchmark the integer resampling implementation against the
+ float implementation and use the faster one for 8/16 bit integer
+ input. On most recent systems the floating point version is faster.
+
+2008-10-31 09:49:57 +0000 Nick Haddad <nick@haddads.net>
+
+ gst-libs/gst/riff/: Add support for other fourcc codes that are commonly used for 'uncompressed RGB', including 'RGB ...
+ Original commit message from CVS:
+ Patch by: Nick Haddad <nick at haddads dot net>
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Add support for other fourcc codes that are commonly used for
+ 'uncompressed RGB', including 'RGB ', 'RAW ', and 0.
+ Fixes #558553.
+
+2008-10-30 14:55:43 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: The length for the buffer conversion function is the number of audio frames, i....
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_convert_buffer):
+ The length for the buffer conversion function is the number of
+ audio frames, i.e. we need to multiply it by the number of channels
+ to get the number of values. Also spotted by the unit test after
+ running in valgrind.
+
+2008-10-30 14:46:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/speexresample.c: Add pipeline unit tests for testing all supported formats with up/downsampling ...
+ Original commit message from CVS:
+ * tests/check/elements/speexresample.c: (element_message_cb),
+ (eos_message_cb), (test_pipeline), (GST_START_TEST),
+ (speexresample_suite):
+ Add pipeline unit tests for testing all supported formats with
+ up/downsampling and different in/outrates.
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_push_drain), (gst_speex_resample_process):
+ * gst/speexresample/speex_resampler_wrapper.h:
+ Fix bugs identified by the testsuite.
+
+2008-10-30 13:44:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/: Add support for int8, int24 and int32 input by converting internally to/from int16 or double.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c: (gst_speex_resample_stop),
+ (gst_speex_resample_get_funcs),
+ (gst_speex_resample_transform_size),
+ (gst_speex_resample_convert_buffer),
+ (gst_speex_resample_push_drain), (gst_speex_resample_process):
+ * gst/speexresample/gstspeexresample.h:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ Add support for int8, int24 and int32 input by converting internally
+ to/from int16 or double.
+
+2008-10-30 12:43:44 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add support for double samples as input and refactor the usage of the different compilation flavors of the speex resa...
+ Original commit message from CVS:
+ * gst/speexresample/Makefile.am:
+ * gst/speexresample/arch.h:
+ * gst/speexresample/gstspeexresample.c: (gst_speex_resample_stop),
+ (gst_speex_resample_get_unit_size), (gst_speex_resample_get_funcs),
+ (gst_speex_resample_init_state), (gst_speex_resample_update_state),
+ (gst_speex_resample_reset_state), (gst_speex_resample_parse_caps),
+ (_gcd), (gst_speex_resample_transform_size),
+ (gst_speex_resample_set_caps), (gst_speex_resample_push_drain),
+ (gst_speex_resample_process), (gst_speex_resample_transform),
+ (gst_speex_resample_query), (gst_speex_resample_set_property):
+ * gst/speexresample/gstspeexresample.h:
+ * gst/speexresample/resample.c:
+ * gst/speexresample/speex_resampler.h:
+ * gst/speexresample/speex_resampler_double.c:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ * tests/check/elements/speexresample.c: (setup_speexresample),
+ (test_perfect_stream_instance), (GST_START_TEST),
+ (test_discont_stream_instance):
+ Add support for double samples as input and refactor the usage
+ of the different compilation flavors of the speex resampler.
+
+2008-10-30 11:43:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioresample/gstaudioresample.c: Return the result of parent_class->event().
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ Return the result of parent_class->event().
+
+2008-10-29 17:02:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.c: Fix the docs.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init):
+ Fix the docs.
+
+2008-10-29 12:11:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.*: Rewrite timestamp tracking to make it more robust and guarantee a continous str...
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c: (gst_speex_resample_start),
+ (gst_speex_resample_get_unit_size),
+ (gst_speex_resample_push_drain), (gst_speex_resample_event),
+ (gst_speex_resample_check_discont), (gst_speex_resample_process),
+ (gst_speex_resample_transform):
+ * gst/speexresample/gstspeexresample.h:
+ Rewrite timestamp tracking to make it more robust and guarantee
+ a continous stream.
+ * tests/check/Makefile.am:
+ * tests/check/elements/speexresample.c: (setup_speexresample),
+ (cleanup_speexresample), (fail_unless_perfect_stream),
+ (test_perfect_stream_instance), (GST_START_TEST),
+ (test_discont_stream_instance), (live_switch_alloc_only_48000),
+ (live_switch_get_sink_caps), (live_switch_push),
+ (speexresample_suite):
+ Add unit tests for speexresample based on the audioresample unit tests.
+
+2008-10-28 19:30:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.*: Some random cleanup, add G_LIKELY and friends, use GST_DEBUG_OBJECT instead of ...
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_get_unit_size),
+ (gst_speex_resample_fixate_caps), (gst_speex_resample_init_state),
+ (gst_speex_resample_update_state), (gst_speex_resample_parse_caps),
+ (gst_speex_resample_transform_size), (gst_speex_resample_set_caps),
+ (gst_speex_resample_push_drain), (gst_speex_resample_event),
+ (gst_speex_resample_check_discont), (gst_speex_fix_output_buffer),
+ (gst_speex_resample_process), (gst_speex_resample_transform),
+ (gst_speex_resample_query), (gst_speex_resample_set_property):
+ * gst/speexresample/gstspeexresample.h:
+ Some random cleanup, add G_LIKELY and friends, use GST_DEBUG_OBJECT
+ instead of GST_DEBUG, ...
+
+2008-10-28 16:28:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Fixate to the nearest supported rate instead of the first one.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_class_init), (gst_speex_resample_fixate_caps),
+ (gst_speex_resample_process):
+ Fixate to the nearest supported rate instead of the first one.
+
+2008-10-28 16:25:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioresample/gstaudioresample.c: Fixate the rate to the nearest supported rate instead of the first one. Fixes b...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ (gst_audioresample_class_init), (audioresample_fixate_caps):
+ Fixate the rate to the nearest supported rate instead of
+ the first one. Fixes bug #549510.
+
+2008-10-28 11:46:28 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/: Update Speex resampler with latest version from Speex GIT.
+ Original commit message from CVS:
+ * gst/speexresample/README:
+ * gst/speexresample/arch.h:
+ * gst/speexresample/fixed_arm4.h:
+ * gst/speexresample/fixed_arm5e.h:
+ * gst/speexresample/fixed_bfin.h:
+ * gst/speexresample/fixed_debug.h:
+ * gst/speexresample/fixed_generic.h:
+ * gst/speexresample/resample.c: (compute_func), (main), (sinc),
+ (cubic_coef), (resampler_basic_direct_single),
+ (resampler_basic_direct_double),
+ (resampler_basic_interpolate_single),
+ (resampler_basic_interpolate_double), (update_filter),
+ (speex_resampler_init_frac), (speex_resampler_process_native),
+ (speex_resampler_magic), (speex_resampler_process_float),
+ (speex_resampler_process_int),
+ (speex_resampler_process_interleaved_float),
+ (speex_resampler_process_interleaved_int),
+ (speex_resampler_set_rate_frac), (speex_resampler_skip_zeros),
+ (speex_resampler_reset_mem):
+ * gst/speexresample/speex_resampler.h:
+ Update Speex resampler with latest version from Speex GIT.
+
+2008-10-27 14:57:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ win32/common/libgstaudio.def: Add new symbols.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ Add new symbols.
+
+2008-10-23 09:57:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Attempt to make obfuscated code clearer.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_identification_packet):
+ Attempt to make obfuscated code clearer.
+
+2008-10-23 07:11:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Move float endianness conversion macros to core. Second part of bug ##555196.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/floatcast/floatcast.h:
+ Move float endianness conversion macros to core. Second part of
+ bug ##555196.
+
+2008-10-22 12:29:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/: Don't mark as gtk-doc docs as they aren't public.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.h:
+ Don't mark as gtk-doc docs as they aren't public.
+
+2008-10-22 12:25:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Allow setting colorkey if possible. Implement property probe interface for optional X features (autopaint-colorkey, d...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ * tests/icles/Makefile.am:
+ * tests/icles/test-colorkey.c:
+ Allow setting colorkey if possible. Implement property probe interface
+ for optional X features (autopaint-colorkey, double-buffer and
+ colorkey). Fixes #554533
+
+2008-10-22 12:01:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/tag/tags.c: Remove useless buffer size assignment. It already has this value.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (gst_tag_image_data_to_image_buffer):
+ Remove useless buffer size assignment. It already has this value.
+
+2008-10-20 15:35:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Implement a separate activate functions to start monitoring the segments or, in pu...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ (gst_audioringbuffer_class_init), (gst_audioringbuffer_acquire),
+ (gst_audioringbuffer_activate), (gst_audioringbuffer_release),
+ (gst_audioringbuffer_stop):
+ Implement a separate activate functions to start monitoring the segments
+ or, in pull mode, pulling in data.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_init), (gst_base_audio_sink_dispose),
+ (gst_base_audio_sink_query_pad), (gst_base_audio_sink_query),
+ (gst_base_audio_sink_setcaps), (gst_base_audio_sink_callback),
+ (gst_base_audio_sink_activate_pull),
+ (gst_base_audio_sink_async_play),
+ (gst_base_audio_sink_change_state):
+ Implement pad and element convert query function.
+ Activate the ringbuffer.
+ Use the segment last_stop value as the offset to pull.
+ Use new basesink _do_preroll() method to preroll in the pulling thread.
+ Take appropriate locking in the pulling thread.
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Update some docs.
+
+2008-10-20 14:08:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Improve MXF typefinding a bit by searching for a header partition pack instead o...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mxf_type_find):
+ Improve MXF typefinding a bit by searching for a header partition
+ pack instead of just a general partition pack and checking more
+ bytes for valid values.
+
+2008-10-20 13:45:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/icles/.cvsignore: update ignore file.
+ Original commit message from CVS:
+ * tests/icles/.cvsignore:
+ update ignore file.
+ * tests/icles/Makefile.am:
+ * tests/icles/test-box.c: (make_pipeline), (main):
+ Add another interactive command line experimentation suite for
+ dynamically boxing/cropping/saling an input video.
+
+2008-10-17 13:19:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add methods to more accuratly control the pulling thread of a ringbuffer.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_convert),
+ (gst_ring_buffer_activate), (gst_ring_buffer_is_active):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Add methods to more accuratly control the pulling thread of a
+ ringbuffer.
+ Add format conversion helper code to the ringbuffer.
+ API: GstRingBuffer:gst_ring_buffer_activate()
+ API: GstRingBuffer:gst_ring_buffer_is_active()
+ API: GstRingBuffer:gst_ring_buffer_convert()
+
+2008-10-16 15:44:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Signal thread startup earlier so that we can immediatly go into pull mode when we ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func),
+ (gst_audioringbuffer_acquire), (gst_audioringbuffer_release),
+ (gst_audioringbuffer_stop):
+ Signal thread startup earlier so that we can immediatly go into pull
+ mode when we have to and block on preroll.
+
+2008-10-16 15:38:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: In pull mode we want the callback to prepull a buffer we can preroll on even when...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_prepare_read):
+ In pull mode we want the callback to prepull a buffer we can preroll on
+ even when we are not yet playing.
+
+2008-10-16 15:07:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Don't install static libs for plugins. Fixes #550851 for base.
+ Original commit message from CVS:
+ * ext/alsa/Makefile.am:
+ * ext/cdparanoia/Makefile.am:
+ * ext/gio/Makefile.am:
+ * ext/gnomevfs/Makefile.am:
+ * ext/libvisual/Makefile.am:
+ * ext/ogg/Makefile.am:
+ * ext/pango/Makefile.am:
+ * ext/theora/Makefile.am:
+ * ext/vorbis/Makefile.am:
+ * gst/adder/Makefile.am:
+ * gst/audioconvert/Makefile.am:
+ * gst/audiorate/Makefile.am:
+ * gst/audioresample/Makefile.am:
+ * gst/audiotestsrc/Makefile.am:
+ * gst/ffmpegcolorspace/Makefile.am:
+ * gst/gdp/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/subparse/Makefile.am:
+ * gst/tcp/Makefile.am:
+ * gst/typefind/Makefile.am:
+ * gst/videorate/Makefile.am:
+ * gst/videoscale/Makefile.am:
+ * gst/videotestsrc/Makefile.am:
+ * gst/volume/Makefile.am:
+ * sys/v4l/Makefile.am:
+ * sys/ximage/Makefile.am:
+ * sys/xvimage/Makefile.am:
+ Don't install static libs for plugins. Fixes #550851 for base.
+
+2008-10-16 13:50:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Set the default blocksize to -1 because we will then use the configured samplespe...
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_init):
+ Set the default blocksize to -1 because we will then use the configured
+ samplesperbuffer to create our output buffer.
+
+2008-10-15 15:28:41 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Add mappping for the KMVC (Karl Morton's Video) Codec.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add mappping for the KMVC (Karl Morton's Video) Codec.
+
+2008-10-15 14:25:50 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Don't forget to advance the offset of what we're matching against, else we end u...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (flac_type_find):
+ Don't forget to advance the offset of what we're matching against, else
+ we end up in a forever loop.
+
+2008-10-15 11:25:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/subparse/gstsubparse.c: Improve typefinding a bit. If we don't have a Unicode charset try GST_SUBTITLE_ENCODING a...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (gst_subparse_type_find):
+ Improve typefinding a bit. If we don't have a Unicode charset
+ try GST_SUBTITLE_ENCODING and otherwise try ISO-8859-15.
+
+2008-10-14 11:13:59 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/theora/theoradec.c: Fix build on macosx.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_decode_buffer):
+ Fix build on macosx.
+
+2008-10-13 11:36:13 +0000 Robin Stocker <robin@nibor.org>
+
+ ext/theora/: Parse input caps and make the PAR override the encoded PAR when specified by a container. Fixes #555699.
+ Original commit message from CVS:
+ Based on patch by: Robin Stocker <robin at nibor dot org>
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_init),
+ (theora_dec_setcaps), (theora_handle_type_packet),
+ (theora_dec_decode_buffer), (theora_dec_change_state):
+ Parse input caps and make the PAR override the encoded PAR when
+ specified by a container. Fixes #555699.
+
+2008-10-13 09:16:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Add some more G_LIKELY
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps), (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_change_state):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Add some more G_LIKELY
+ Fail when the setcaps function was not called.
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_set_outcaps):
+ Propagate return value of setcaps.
+
+2008-10-13 08:58:29 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/subparse/: Add support for UTF16/UTF32 subtitles as long as the first bytes of the first buffer contain the BOM. ...
+ Original commit message from CVS:
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_class_init), (gst_sub_parse_init),
+ (gst_convert_to_utf8), (detect_encoding), (convert_encoding),
+ (get_next_line), (gst_sub_parse_data_format_autodetect),
+ (feed_textbuf), (handle_buffer), (gst_sub_parse_change_state),
+ (gst_subparse_type_find):
+ * gst/subparse/gstsubparse.h:
+ Add support for UTF16/UTF32 subtitles as long as the first bytes of
+ the first buffer contain the BOM. This also adds support for other
+ encodings that allow NUL bytes via the encoding property.
+ Fixes bugs #552237 and #456788.
+
+2008-10-13 08:15:13 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/tag/tags.c: Don't drop the last byte of image tags if they're not an URI list.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (gst_tag_image_data_to_image_buffer):
+ Don't drop the last byte of image tags if they're not an URI list.
+ Fixes bug #556066.
+
+2008-10-13 08:00:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: For looking at the 4th byte we have to get 4 bytes of course and not 3.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (flac_type_find):
+ For looking at the 4th byte we have to get 4 bytes of course
+ and not 3.
+
+2008-10-13 07:52:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Improve FLAC-without-headers typefinding by looking at most of the frame header ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (flac_type_find):
+ Improve FLAC-without-headers typefinding by looking at most of the
+ frame header and checking if invalid values are used. Should prevent
+ quite some false positives compared to the old version which only
+ check if the first 14 bits are set.
+
+2008-10-11 16:27:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Don't assert on caps==NULL.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Don't assert on caps==NULL.
+
+2008-10-10 17:13:40 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add support for subtitle files with UTF-8 BOM at the beginning by simple stripping it from the first line before pass...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect), (handle_buffer),
+ (gst_sub_parse_change_state):
+ * gst/subparse/gstsubparse.h:
+ * tests/check/elements/subparse.c: (GST_START_TEST):
+ Add support for subtitle files with UTF-8 BOM at the beginning
+ by simple stripping it from the first line before passing it
+ to any parsing code. Fixes bug #555257 and playback of files
+ created by Gnome Subtitles.
+
+2008-10-10 15:45:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: Define the default property values in the usual place.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_class_init), (gst_audio_test_src_init),
+ (gst_audio_test_src_src_fixate), (gst_audio_test_src_setcaps),
+ (gst_audio_test_src_start), (gst_audio_test_src_stop),
+ (gst_audio_test_src_do_seek), (gst_audio_test_src_check_get_range),
+ (gst_audio_test_src_create):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Define the default property values in the usual place.
+ Implement start/stop to reset values correctly.
+ Calculate the sample size only once when we negotiate.
+ Rename some values to make more sense.
+ Keep track of our byte range.
+ Add support for pull based scheduling. Disabled for now until we have
+ the whole stack working.
+ Set the BUFFER_OFFSET correctly.
+
+2008-10-10 15:32:10 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Make the detection of the used subtitle a bit less strict for srt subtitles. Fixes bug #555607.
+ Original commit message from CVS:
+ Based on a patch by: xavierb at gmail dot com
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect):
+ * tests/check/elements/subparse.c: (GST_START_TEST):
+ Make the detection of the used subtitle a bit less strict
+ for srt subtitles. Fixes bug #555607.
+
+2008-10-10 15:21:38 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/vorbis/vorbisenc.c: Fix discontinuity detection which was broken by last commit.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c:
+ (gst_vorbis_enc_buffer_check_discontinuous):
+ Fix discontinuity detection which was broken by last commit.
+
+2008-10-09 11:18:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Require core CVS for ghostpad API additions used by decodebin2.
+ Original commit message from CVS:
+ * configure.ac::
+ Require core CVS for ghostpad API additions used by decodebin2.
+
+2008-10-08 15:30:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Fix debug statements (space between '%' and actual format).
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Fix debug statements (space between '%' and actual format).
+
+2008-10-08 14:44:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Remove bogus assert, the decodepad could have been created inside an already existing g...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_pad_activate):
+ Remove bogus assert, the decodepad could have been created inside an
+ already existing group.
+
+2008-10-08 14:01:42 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2008-10-08 14:00:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/playback/gstdecodebin2.c (expose_pad): Fix typo: unset target instead of setting it.
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * gst/playback/gstdecodebin2.c (expose_pad): Fix typo: unset
+ target instead of setting it.
+ (gst_decode_pad_activate, gst_decode_pad_unblock): This is now the
+ API for a decode pad. The bugfix is that we set the group in
+ activate(), not when the pad was created because it might be NULL
+ then.
+ (gst_decode_group_control_source_pad, gst_decode_group_expose):
+ Update to use the API.
+
+2008-10-08 12:49:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/playback/gstdecodebin2.c (struct _GstDecodePad): Change to be a subclass of GstGhostPad.
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * gst/playback/gstdecodebin2.c (struct _GstDecodePad): Change to
+ be a subclass of GstGhostPad.
+ (analyze_new_pad): So, when emitting the signals that determine
+ how we do autoplugging, already create the ghost pad and use it as
+ the pad in the signal arguments. This allows applications to make
+ a connection between the pad passed in e.g. autoplug-continue, and
+ the pad passed in new-decoded-pad.
+ (connect_pad, expose_pad): Update to receive the ghosted decode
+ pad in the args, retargetting it as necessary if we have to plug
+ the target pad through a multiqueue.
+ (gst_decode_group_control_source_pad): Adapt to receive an
+ already-ghosted pad that just needs activation, blocking, and
+ drain notification.
+ (sort_end_pads): Adapt for decode pads actually being pads.
+ (gst_decode_group_expose): Adapt for decode pads actually being
+ pads. Rewrite the decode pad names so they appear in order. Adds a
+ new error case if we couldn't set the name.
+ (gst_decode_group_free, gst_decode_group_hide): Adapt cleanup
+ logic.
+ (gst_decode_pad_set_blocked, gst_decode_pad_add_drained_check):
+ New API for the decode pad, needed because we shouldn't do these
+ things inside gst_decode_pad_new(), but after.
+ (gst_decode_pad_new): Change to actually make the real pad, and
+ delay the blocking/drainage bits.
+
+2008-10-08 12:12:01 +0000 Daniel Drake <dsd@laptop.org>
+
+ ext/ogg/gstoggmux.c: Unref all buffers when clearing collectpads. Fixes bug #546955.
+ Original commit message from CVS:
+ Patch by: Daniel Drake <dsd at laptop dot org>
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_clear_collectpads):
+ Unref all buffers when clearing collectpads. Fixes bug #546955.
+
+2008-10-08 12:08:01 +0000 Klaas <klaas@rivercrew.net>
+
+ ext/vorbis/vorbisenc.*: Keep track of the upstream segments and use the running time on that segment instead of the b...
+ Original commit message from CVS:
+ Based on a patch by: Klaas <klaas at rivercrew dot net>
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_sink_event),
+ (gst_vorbis_enc_buffer_check_discontinuous),
+ (gst_vorbis_enc_chain), (gst_vorbis_enc_change_state):
+ * ext/vorbis/vorbisenc.h:
+ Keep track of the upstream segments and use the running time on that
+ segment instead of the buffer timestamp everywhere. Fixes bug #525807.
+
+2008-10-08 11:50:50 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/audioconvert.c: Prevent overflows with big buffer when calculating the size of the intermediate buff...
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (audio_convert_convert):
+ Prevent overflows with big buffer when calculating the size of
+ the intermediate buffer by using gst_util_uint64_scale() instead of
+ plain arithmetics. Fixes bug #552801.
+
+2008-10-08 10:49:15 +0000 Pavel Zeldin <pzeldin@gmail.com>
+
+ ext/pango/gstclockoverlay.*: API: Add ability to specify format for date/time display by adding a "time-format" prope...
+ Original commit message from CVS:
+ Patch by: Pavel Zeldin <pzeldin at gmail dot com>
+ * ext/pango/gstclockoverlay.c: (gst_clock_overlay_render_time),
+ (gst_clock_overlay_class_init), (gst_clock_overlay_finalize),
+ (gst_clock_overlay_init), (gst_clock_overlay_set_property),
+ (gst_clock_overlay_get_property):
+ * ext/pango/gstclockoverlay.h:
+ API: Add ability to specify format for date/time display by
+ adding a "time-format" property.
+ Fixes bug #554879.
+
+2008-10-08 09:22:26 +0000 Jan Gerber <j@oil21.org>
+
+ gst-libs/gst/riff/riff-media.c: Add FFV1 fourcc to support playback of FFMPEG lossless video in AVI. Fixes bug #555319.
+ Original commit message from CVS:
+ Patch by: Jan Gerber <j at oil21 dot org>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add FFV1 fourcc to support playback of FFMPEG lossless video
+ in AVI. Fixes bug #555319.
+
+2008-10-08 09:12:36 +0000 Håvard Graff <havard.graff@tandberg.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Implement skew clock slaving. Fixes #552559.
+ Original commit message from CVS:
+ Patch by: Håvard Graff <havard dot graff at tandberg dot com>
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Implement skew clock slaving. Fixes #552559.
+
+2008-10-08 09:10:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/: Fix include of config.h
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ * gst-libs/gst/audio/testchannels.c:
+ Fix include of config.h
+
+2008-10-06 16:36:20 +0000 Tero Saarni <tero.saarni@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Fix parsing of the c= field containing multicast addresses.
+ Original commit message from CVS:
+ Based on Patch by: Tero Saarni <tero dot saarni at gmail dot com>
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_parse_line),
+ (print_media), (gst_sdp_message_dump):
+ Fix parsing of the c= field containing multicast addresses.
+ Fixes #552199.
+ Add the connection info to the session or streams.
+ Fix parsing of the bandwidth.
+ Add debugging for the connections and bandwidths for a media.
+ Add debugging for the bandwidth of the session.
+
+2008-10-06 16:31:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Configure the next seqnum and timestamp in the state change so that they can be...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_change_state):
+ Configure the next seqnum and timestamp in the state change so that they
+ can be queried soon after.
+
+2008-10-06 16:29:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Improve debugging of the rtptime.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain):
+ Improve debugging of the rtptime.
+
+2008-10-05 11:33:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to development -> 0.10.21.1
+ Original commit message from CVS:
+ * configure.ac:
+ Back to development -> 0.10.21.1
+
+2008-10-05 08:18:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * ChangeLog:
+ ChangeLog surgery
+ Original commit message from CVS:
+ ChangeLog surgery
+
+2008-10-05 08:11:53 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for MXF.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mxf_type_find),
+ (plugin_init):
+ Add typefinder for MXF.
+
+2008-10-05 08:10:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for MXF.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mxf_type_find),
+ (plugin_init):
+ Add typefinder for MXF.
+
+2008-10-03 15:19:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/icles/Makefile.am: Only build test-colorkey if GTK+ is available.
+ Original commit message from CVS:
+ * tests/icles/Makefile.am:
+ Only build test-colorkey if GTK+ is available.
+
+=== release 0.10.21 ===
+
+2008-10-03 00:03:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/config.h:
+ Release 0.10.21
+ Original commit message from CVS:
+ Release 0.10.21
+
+2008-10-02 23:44:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/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:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-09-28 22:58:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: 0.10.20.4 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ 0.10.20.4 pre-release
+
+2008-09-25 10:46:00 +0000 ogg.k.ogg.k <ogg.k.ogg.k@googlemail.com>
+
+ ext/theora/theoraparse.c: Set the BOS flag on the BOS packet. Fixes #553244.
+ Original commit message from CVS:
+ Patch by: ogg.k.ogg.k <ogg dot k dot ogg dot k at googlemail dot com>
+ * ext/theora/theoraparse.c: (theora_parse_set_streamheader):
+ Set the BOS flag on the BOS packet. Fixes #553244.
+
+2008-09-23 17:48:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspmessage.c: Fix the g_return_val_if_fail() statements.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspmessage.c:
+ (gst_rtsp_message_parse_request),
+ (gst_rtsp_message_parse_response):
+ Fix the g_return_val_if_fail() statements.
+
+2008-09-22 17:44:14 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/tag/gsttagdemux.c: Fail to activate if there's insufficient data in the file to be usable, preventing an...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ Fail to activate if there's insufficient data in the file to be usable,
+ preventing an assertion fail later. Fixes #552960
+
+2008-09-16 15:36:56 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Commit stuff that should have gone in last week when I made the pre-releases:
+ Original commit message from CVS:
+ Commit stuff that should have gone in last week when I made the pre-releases:
+ 2008-09-10 Jan Schmidt <jan.schmidt@sun.com>
+ * configure.ac:
+ 0.10.20.2 pre-release
+ * po/LINGUAS:
+ * po/id.po:
+ * po/pt_BR.po:
+ New translations.
+
+2008-09-15 15:11:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Recognise Kate subtitle streams (#550582).
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ Recognise Kate subtitle streams (#550582).
+
+2008-09-13 11:04:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/audio.h: Remove trailing comma from enum list, which causes problems with -pendantic (#550729).
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.h: (GST_AUDIO_FIELD_SIGNED):
+ Remove trailing comma from enum list, which causes problems
+ with -pendantic (#550729).
+
+2008-09-05 19:04:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/propertyprobe.c: More sanity checks for our second-favourite interface.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ (gst_property_probe_get_properties),
+ (gst_property_probe_get_property),
+ (gst_property_probe_probe_property),
+ (gst_property_probe_probe_property_name),
+ (gst_property_probe_needs_probe),
+ (gst_property_probe_needs_probe_name),
+ (gst_property_probe_get_values),
+ (gst_property_probe_get_values_name),
+ (gst_property_probe_probe_and_get_values),
+ (gst_property_probe_probe_and_get_values_name):
+ More sanity checks for our second-favourite interface.
+
+2008-09-05 14:12:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/interfaces/propertyprobe.c: Check for NULL pointer, in the hope that this fixes #532864.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ Check for NULL pointer, in the hope that this fixes #532864.
+
+2008-09-05 10:24:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/xvimage/xvimagesink.c: No really, the next release is 0.10.21 (fix Since: tags in docs).
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_class_init):
+ No really, the next release is 0.10.21 (fix Since: tags in docs).
+
+2008-09-04 16:25:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosrc.c: Disable a code path that is now called but causes a deadlock for some reason and is...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosrc.c: (gst_audioringbuffer_stop):
+ Disable a code path that is now called but causes a deadlock for some
+ reason and is unneeded.
+
+2008-09-04 13:46:52 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.*: Add a "draw-border" property that can be set to false to disable drawing borders.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ Add a "draw-border" property that can be set to false to disable
+ drawing borders.
+ * tests/icles/test-colorkey.c:
+ * tests/icles/Makefile.am:
+ Add new test application for the colorkey handling.
+
+2008-09-03 14:00:06 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Use a decent caps for TrueSpeech instead of a ffmpeg-specific one.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Use a decent caps for TrueSpeech instead of a ffmpeg-specific one.
+ This will also be fixed for upcoming gst-ffmpeg release so that once
+ this release of -base is out, it will work with the latest gst-ffmpeg
+ release.
+
+2008-09-03 13:27:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Add Truespeech mapping for RIFF formats (AVI/WAV).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Add Truespeech mapping for RIFF formats (AVI/WAV).
+ Fixes #550656
+
+2008-09-03 12:23:44 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ gst/typefind/gsttypefindfunctions.c: Typefind video/mj2 and image/jp2 ISO JPEG2000 mime types.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Typefind video/mj2 and image/jp2 ISO JPEG2000 mime types.
+ Fixes #550638.
+
+2008-09-03 10:12:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Rework last change, so that we build subparse, but just disable the sami parse functionality, if we're configured to ...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/samiparse.c:
+ * tests/check/elements/subparse.c:
+ Rework last change, so that we build subparse, but just disable the
+ sami parse functionality, if we're configured to not use xml. In the
+ tests only the sami test is disabled now.
+
+2008-09-02 15:07:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Disable subparse when xml is disabled. It woundn't work anyway. Fixes test runs.
+ Original commit message from CVS:
+ * configure.ac:
+ Disable subparse when xml is disabled. It woundn't work anyway. Fixes
+ test runs.
+
+2008-09-02 09:33:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ po/POTFILES.in: Add some more files with strings for translation.
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ Add some more files with strings for translation.
+
+2008-09-02 06:37:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Use new geo location tags from core. Fixes #481169
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * tests/check/libs/tag.c:
+ Use new geo location tags from core. Fixes #481169
+
+2008-09-01 16:05:45 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/elements/audioresample.c: Now that GstBaseTransform is 'fixed' ... remove cruft from tests.
+ Original commit message from CVS:
+ * tests/check/elements/audioresample.c: (setup_audioresample),
+ (fail_unless_perfect_stream), (test_perfect_stream_instance),
+ (test_discont_stream_instance):
+ Now that GstBaseTransform is 'fixed' ... remove cruft from tests.
+ Add debugging for coherence.
+
+2008-08-30 15:55:06 +0000 Jonathan Matthew <notverysmart@gmail.com>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for PDF documents (which is nice to have, since it's a common for...
+ Original commit message from CVS:
+ Patch by: Jonathan Matthew <notverysmart gmail com>
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Add typefinder for PDF documents (which is nice to have, since it's a
+ common format, but also helps prevent false positives). Fixes #549814.
+
+2008-08-27 15:30:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Fix nasty race where multiple decodebins could start pushing data before we manage to con...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (selector_blocked), (pad_added_cb),
+ (no_more_pads_cb):
+ Fix nasty race where multiple decodebins could start pushing data before
+ we manage to configure the sinks, resulting in not-linked errors in
+ typical RTSP streaming cases.
+
+2008-08-26 17:24:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Since we now call stop, we trigger this code path that causes a deadlock is appare...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_stop):
+ Since we now call stop, we trigger this code path that causes a deadlock
+ is apparently not needed.
+
+2008-08-26 15:45:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Also allow the case where the ringbuffer was paused when we try to stop it so tha...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_start),
+ (gst_ring_buffer_stop):
+ Also allow the case where the ringbuffer was paused when we try to stop
+ it so that the basesrc stop function is still called.
+
+2008-08-23 15:25:44 +0000 Mike Ruprecht <cmaiku@gmail.com>
+
+ sys/v4l/gstv4lelement.c: Reprobe devices again instead of taking a cached list as new devices could've been plugged i...
+ Original commit message from CVS:
+ Patch by: Mike Ruprecht <cmaiku at gmail dot com>
+ * sys/v4l/gstv4lelement.c: (gst_v4l_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-23 15:19:59 +0000 Alessandro Dessina <alessandro@nnva.org>
+
+ ext/ogg/gstoggdemux.c: Don't add pads and activate them for skeleton streams. These are already handled inside oggdem...
+ Original commit message from CVS:
+ Patch by: Alessandro Dessina <alessandro nnva org>
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_deactivate_current_chain),
+ (gst_ogg_demux_activate_chain):
+ Don't add pads and activate them for skeleton streams. These are already
+ handled inside oggdemux. Fixes bug #537599.
+
+2008-08-22 15:54:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Reset variable so that query and convert fail after going back to
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_change_state):
+ Reset variable so that query and convert fail after going back to
+ READY. Fixes #548898.
+
+2008-08-22 07:24:13 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/vorbis/vorbisenc.c: If a buffer arrives with a timestamp before the timestamp+duration of the previous buffer cli...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_chain):
+ If a buffer arrives with a timestamp before the timestamp+duration
+ of the previous buffer clip it instead of dropping it completely.
+ Slight improvement for the unfixable bug #548913.
+
+2008-08-21 14:19:21 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/vorbis/vorbisdec.c: Take the current timestamp instead of timestamp+duration for the offset.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ Take the current timestamp instead of timestamp+duration for the offset.
+ This offset will later be used for calculating the timestamp and
+ otherwise vorbisdec will interpolate timestamps wrong if upstream
+ only sends timestamps and no granulepos.
+
+2008-08-21 11:20:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Don't crash when having no visualisations.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c:
+ Don't crash when having no visualisations.
+
+2008-08-16 20:57:27 +0000 David Schleef <ds@schleef.org>
+
+ gst/typefind/gsttypefindfunctions.c: DV typefinding. Remove check for a bit that is 0 in IEC 61384, but not SMPTE 314M.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: DV typefinding. Remove
+ check for a bit that is 0 in IEC 61384, but not SMPTE 314M.
+ Fixes #548065.
+
+2008-08-15 07:24:38 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/pbutils/missing-plugins.c: When cleaning up the caps fields also remove "depth" for the same reason we r...
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/missing-plugins.c: (copy_and_clean_caps):
+ When cleaning up the caps fields also remove "depth" for the same
+ reason we remove "width".
+
+2008-08-14 17:14:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Add Lead H.264 here as well.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (format_info_get_desc):
+ Add Lead H.264 here as well.
+
+2008-08-14 15:17:31 +0000 Julien Moutte <julien@moutte.net>
+
+ gst-libs/gst/riff/riff-media.c: Add Lead H.264 variant.
+ Original commit message from CVS:
+ 2008-08-14 Julien Moutte <julien@fluendo.com>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps): Add Lead H.264 variant.
+
+2008-08-13 09:17:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: When not slaved to another clock also subtract the base_time from our internal ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ When not slaved to another clock also subtract the base_time from our
+ internal clock time to get the running time.
+
+2008-08-13 00:59:07 +0000 David Schleef <ds@schleef.org>
+
+ ext/theora/theoraenc.c: Remove the 2000 kbit limit to bitrate, since it has no basis in libtheora.
+ Original commit message from CVS:
+ * ext/theora/theoraenc.c: Remove the 2000 kbit limit to bitrate,
+ since it has no basis in libtheora.
+
+2008-08-12 06:31:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/interfaces/propertyprobe.h: Remove double "interface" from doc-string.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/propertyprobe.h:
+ Remove double "interface" from doc-string.
+ * gst-libs/gst/interfaces/xoverlay.h:
+ Document interface.
+ * gst-libs/gst/riff/riff.c:
+ Add basic doc blobs.
+
+2008-08-11 15:05:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/Makefile.am: Don't try to build that example anymore.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/Makefile.am:
+ Don't try to build that example anymore.
+
+2008-08-11 14:51:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/: Move audiofiltertemplate to gst-template.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/.cvsignore:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ * gst-libs/gst/audio/make_filter:
+ Move audiofiltertemplate to gst-template.
+
+2008-08-11 09:20:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More docs and shuffling. What can we do with the hundreds of #defines.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiosrc.h:
+ More docs and shuffling. What can we do with the hundreds of #defines.
+
+2008-08-11 08:34:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/: Reducing number of dundocumented symbols.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/interfaces/propertyprobe.h:
+ * gst-libs/gst/tag/gsttagdemux.h:
+ Reducing number of dundocumented symbols.
+
+2008-08-11 07:16:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/audio.c: Fix doc comment syntax.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.c:
+ Fix doc comment syntax.
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ Add more doc-comments and a FIXME: for the signal.
+
+2008-08-07 16:11:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/ogg/gstoggmux.*: Don't pretend to support NEWSEGMENT events, instead override the
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_sink_event),
+ (gst_ogg_mux_request_new_pad):
+ * ext/ogg/gstoggmux.h:
+ Don't pretend to support NEWSEGMENT events, instead override the
+ GstCollectPads event function to return FALSE on NEWSEGMENT events
+ and do the normal work for other events.
+ This prevents elements like flacenc to seek to the start and rewrite
+ some data which then results in a broken Ogg packet.
+
+2008-08-07 15:58:58 +0000 Frederic Crozat <fcrozat@mandriva.org>
+
+ 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 <fcrozat@mandriva.org>
+ * ext/alsa/gstalsaplugin.c: (plugin_init):
+ * ext/cdparanoia/gstcdparanoiasrc.c: (plugin_init):
+ * ext/gnomevfs/gstgnomevfs.c: (plugin_init):
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (_do_init):
+ * gst-libs/gst/pbutils/pbutils.c: (gst_pb_utils_init):
+ * gst-libs/gst/tag/tags.c: (gst_tag_register_tags_internal):
+ * gst/playback/gstdecodebin.c: (plugin_init):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_plugin_init):
+ * gst/playback/gstplayback.c: (plugin_init):
+ * gst/playback/gstqueue2.c: (plugin_init):
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_plugin_init):
+ * sys/v4l/gstv4l.c: (plugin_init):
+ Make sure gettext returns translations in UTF-8 encoding rather
+ than in the current locale encoding (#546822).
+
+2008-08-06 13:12:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Add audio/x-qdm for qtdemux.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c:
+ Add audio/x-qdm for qtdemux.
+
+2008-08-05 15:38:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/vorbis/vorbisdec.c: Do not leak old taglist.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c:
+ Do not leak old taglist.
+
+2008-08-04 12:35:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/icles/test-scale.c: Include <stdlib.h> for atoi().
+ Original commit message from CVS:
+ * tests/icles/test-scale.c:
+ Include <stdlib.h> for atoi().
+
+2008-08-04 09:11:08 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Very crucial and important documentation fix.
+ Original commit message from CVS:
+ 2008-08-04 Andy Wingo <wingo@pobox.com>
+ * gst/audiotestsrc/gstaudiotestsrc.c: Very crucial and important
+ documentation fix.
+
+2008-08-01 13:06:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/gstadder.c: Cleanup lots of empty lines that came from gst-indent going havoc before I added the INDENT_ON/...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Cleanup lots of empty lines that came from gst-indent going havoc
+ before I added the INDENT_ON/OFF marker some time agao.
+
+2008-08-01 11:55:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Bump requirement to latest core and use new tag for riff formats.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/riff/riff-read.c:
+ Bump requirement to latest core and use new tag for riff formats.
+ Needed for #520694.
+
+2008-08-01 11:14:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/dynamic/: Add example app that dynamically switches between 3 'encoders'.
+ Original commit message from CVS:
+ * tests/examples/dynamic/Makefile.am:
+ * tests/examples/dynamic/codec-select.c: (make_encoder),
+ (make_pipeline), (do_switch), (my_bus_callback), (main):
+ Add example app that dynamically switches between 3 'encoders'.
+
+2008-07-31 13:06:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Add some more comments.
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gst_play_sink_set_vis_plugin):
+ Add some more comments.
+
+2008-07-31 12:58:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videotestsrc/gstvideotestsrc.c: Discard buffers of the wrong size after renegotiation, this is perfectly possible...
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_getcaps),
+ (gst_video_test_src_create):
+ Discard buffers of the wrong size after renegotiation, this is perfectly
+ possible with things like capsfilter that could suggest caps changes
+ upstream without knowing the size of the buffer.
+
+2008-07-31 11:39:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/icles/: Add dynamic rescaling tests for the new basetransform.
+ Original commit message from CVS:
+ * tests/icles/.cvsignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/test-scale.c: (make_pipeline), (main):
+ Add dynamic rescaling tests for the new basetransform.
+
+2008-07-30 19:51:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/Makefile.am: Dist recently-added gstfastrandom.h.
+ Original commit message from CVS:
+ * gst/audioconvert/Makefile.am:
+ Dist recently-added gstfastrandom.h.
+
+2008-07-30 15:29:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ sys/xvimage/xvimagesink.c: Fix a "may be used uninitialized in this function" which weirdly only appears on macosx (?).
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support):
+ Fix a "may be used uninitialized in this function" which weirdly only
+ appears on macosx (?).
+
+2008-07-30 09:02:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-ids.h: Adding acid chunk for tempo and loop information.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ Adding acid chunk for tempo and loop information.
+
+2008-07-29 13:01:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/Makefile.am: floor() needs linking to $(LIBM).
+ Original commit message from CVS:
+ * sys/xvimage/Makefile.am:
+ floor() needs linking to $(LIBM).
+
+2008-07-29 12:35:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Aggregate short reads and add some comments and debug logging.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Aggregate short reads and add some comments and debug logging.
+ Fixes #537380
+
+2008-07-29 10:26:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstplaybasebin.c: Fix property doc markup (its not a signal).
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ Fix property doc markup (its not a signal).
+ * sys/xvimage/xvimagesink.c:
+ Add since tag for new proeprties (also add sice tags fro the last two
+ other additions).
+
+2008-07-29 08:59:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.*: Add autofill/colorkey properties. Fixes #538656.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ * sys/xvimage/xvimagesink.h:
+ Add autofill/colorkey properties. Fixes #538656.
+
+2008-07-29 01:58:05 +0000 David Schleef <ds@schleef.org>
+
+ sys/xvimage/xvimagesink.c: Fix rounding errors when converting colorbalance values between hardware and object proper...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Fix rounding errors when converting colorbalance values
+ between hardware and object property ranges. Partial
+ fix for #537889, however, there still seems to be a small
+ drift problem that could be totem's fault.
+
+2008-07-28 15:34:13 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/ogg/gstoggdemux.c: Don't use GST_CLOCK_TIME_NONE as start of NEWSEGMENT events.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain_peer),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_handle_page):
+ Don't use GST_CLOCK_TIME_NONE as start of NEWSEGMENT events.
+ This fixes a critical warning.
+
+2008-07-28 13:12:51 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/ogg/gstoggmux.c: Allow muxing of CELT into Ogg streams.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ Allow muxing of CELT into Ogg streams.
+
+2008-07-28 12:47:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add simple typefinder for the CELT codec (www.celt-codec.org).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (celt_type_find),
+ (plugin_init):
+ Add simple typefinder for the CELT codec (www.celt-codec.org).
+
+2008-07-27 11:12:41 +0000 Jan Gerber <j@oil21.org>
+
+ ext/ogg/gstoggdemux.c: Fix calculation of the start time from skeleton streams.
+ Original commit message from CVS:
+ Patch by: Jan Gerber <j at oil21 dot org>
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_parse_skeleton_fisbone):
+ Fix calculation of the start time from skeleton streams.
+ Fixes bug #530068.
+
+2008-07-24 13:19:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Use 64 bit constant GST_CLOCK_TIME_NONE instead of plain -1.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c:
+ Use 64 bit constant GST_CLOCK_TIME_NONE instead of plain -1.
+
+2008-07-23 18:34:19 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/: Implement a linear congruential generator as pseudo random number generator for the dither noise. ...
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioquantize.c:
+ (gst_audio_quantize_setup_dither),
+ (gst_audio_quantize_free_dither):
+ * gst/audioconvert/gstfastrandom.h:
+ Implement a linear congruential generator as pseudo random number
+ generator for the dither noise. This is about 2 times faster than
+ using GLib's mersenne twister. Also this uses only integer math for
+ generating integers while GLib internally uses floating point math.
+
+2008-07-23 18:27:15 +0000 Michael Smith <msmith@xiph.org>
+
+ configure.ac: Remove AC_ISC_POSIX; it breaks on some systems and is not needed.
+ Original commit message from CVS:
+ * configure.ac:
+ Remove AC_ISC_POSIX; it breaks on some systems and is not needed.
+
+2008-07-23 13:17:31 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Use GST_STR_NULL to avoid crashes with libcs that don't like NULL strings in printf...
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien.lespiau gmail com>
+ * gst-libs/gst/sdp/gstsdpmessage.c: (print_media):
+ Use GST_STR_NULL to avoid crashes with libcs that don't
+ like NULL strings in printf args (such as the win32 one).
+ Fixes #544306.
+
+2008-07-17 14:21:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/xvimage/xvimagesink.c: Oops - set the size of the image used for probing back to 1x1, for consistency with ximage...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls):
+ Oops - set the size of the image used for probing back to 1x1, for
+ consistency with ximagesink
+
+2008-07-17 13:57:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: it's not legal to ask the
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls),
+ (gst_ximagesink_ximage_new):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls),
+ (gst_xvimagesink_xvimage_new):
+ Apparently on Solaris and OS/X (at least), it's not legal to ask the
+ X server to attach to a shared memory segment after we've deleted it,
+ with the result that MIT-SHM is disabled. Instead, remove it only after
+ X succeeds in attaching too.
+
+2008-07-17 02:30:24 +0000 David Schleef <ds@schleef.org>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: Add 'ticks', a 1/30 second sine wave pulse every second.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Add 'ticks', a 1/30 second sine wave pulse every second.
+
+2008-07-15 22:43:16 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/video/video.c: Revert ABI change.
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: Revert ABI change.
+
+2008-07-15 13:05:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Make it impossible to have NULL caps at the point where we set framerate and other th...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Make it impossible to have NULL caps at the point where we set
+ framerate and other things. Also don't return immediately for "3ivd"
+ video and let framerate, etc be set. Might fix bug #542508.
+
+2008-07-14 17:06:26 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ gst-libs/gst/video/video.c: Video format can also be conveniently determined from (many) non-fixed caps.
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: (gst_video_format_parse_caps):
+ Video format can also be conveniently determined from (many)
+ non-fixed caps.
+
+2008-07-14 08:18:58 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/: First stab at integrating DVD subpicture overlay into playbin. Successfully plugs and plays, but the q...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreamselector.c:
+ First stab at integrating DVD subpicture overlay into
+ playbin. Successfully plugs and plays, but the queues need
+ shrinking - 3 seconds of video is too much buffering.
+
+2008-07-11 18:06:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/gstaudioconvert.c: Remove now obsolete note in the docs.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ Remove now obsolete note in the docs.
+
+2008-07-11 06:10:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Cleanup Plugin docs. Link to signals and properties. Fix sub-section titles. Drop mentining that all our example pipe...
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-overrides.txt:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/theora/theoraparse.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * ext/vorbis/vorbisparse.c:
+ * ext/vorbis/vorbistag.c:
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstqueue2.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ Cleanup Plugin docs. Link to signals and properties. Fix sub-section
+ titles. Drop mentining that all our example pipelines are "simple"
+ pipelines.
+
+2008-07-10 21:06:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Cleanup Plugin docs. Link to signals and properties. Fix sub-section titles. Drop mentining that all our example pipe...
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-overrides.txt:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/theora/theoraparse.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * ext/vorbis/vorbisparse.c:
+ * ext/vorbis/vorbistag.c:
+ * gst/adder/gstadder.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstqueue2.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ Cleanup Plugin docs. Link to signals and properties. Fix sub-section
+ titles. Drop mentining that all our example pipelines are "simple"
+ pipelines.
+
+2008-07-07 17:25:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/examples/seek/Makefile.am: Fix out of tree build by adding all required CFLAGS.
+ Original commit message from CVS:
+ * tests/examples/seek/Makefile.am:
+ Fix out of tree build by adding all required CFLAGS.
+
+2008-07-07 09:55:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/playback/gstdecodebin.c: And ref the pad before returning it again when linking to the queue failed. Otherwise we...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (add_raw_queue):
+ And ref the pad before returning it again when linking to the queue
+ failed. Otherwise we will unref the pad twice later and things break.
+
+2008-07-07 09:48:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/playback/gstdecodebin.c: If linking the raw pad with a queue fails, try it without a queue instead of failing com...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (add_raw_queue):
+ If linking the raw pad with a queue fails, try it without a queue
+ instead of failing completely. This should never happen.
+
+2008-07-06 23:22:12 +0000 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
+
+ gst/playback/gstdecodebin.c: Add a queue after a demuxer if the demuxer outputs raw data. This was done before only f...
+ Original commit message from CVS:
+ Patch by: Evgeniy Stepanov <eugeni dot stepanov at gmail dot com>
+ * gst/playback/gstdecodebin.c: (add_raw_queue), (close_pad_link):
+ Add a queue after a demuxer if the demuxer outputs raw data. This was
+ done before only for non-raw data but is required in this case too.
+ Fixes bug #540215.
+ decodebin2 doesn't have this issue because all streams of a group
+ go through multiqueue.
+
+2008-07-03 09:12:49 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Makes libgstsdp compile with mingw32 by defining the right WINVER so that getaddrin...
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ Makes libgstsdp compile with mingw32 by defining the right WINVER so
+ that getaddrinfo() can be used. Fixes #541358.
+
+2008-07-01 13:22:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videotestsrc/gstvideotestsrc.*: Cleanups, use default property values as defines.
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_class_init), (gst_video_test_src_init),
+ (gst_video_test_src_set_property),
+ (gst_video_test_src_get_property), (gst_video_test_src_create):
+ * gst/videotestsrc/gstvideotestsrc.h:
+ Cleanups, use default property values as defines.
+ Add property to enable/disable peer buffer allocation.
+
+2008-06-30 09:46:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/: Enable unit tests on PPC again as the bugs are now fixed.
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (gdpdepay_suite):
+ * tests/check/pipelines/streamheader.c: (streamheader_suite):
+ Enable unit tests on PPC again as the bugs are now fixed.
+
+2008-06-30 09:20:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/: Add support for ADPCM IMA DK3 and DK4 variant in RIFF containers.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Add support for ADPCM IMA DK3 and DK4 variant in RIFF containers.
+ Fixes bug #540351.
+
+2008-06-30 08:29:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/ffmpegcolorspace/: Only set/get on the PAL8 format, ffmpegcolorspace doesn't support it on other formats. Also ad...
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps):
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_get_unit_size):
+ Only set/get on the PAL8 format, ffmpegcolorspace doesn't support
+ it on other formats. Also adjust the unit size only for that format
+ to not include the palette. Fixes bug #540497.
+
+2008-06-29 13:45:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/gstadder.c: Use GST_DEBUG_FUNCPTR and remove some extra vlnak lines.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Use GST_DEBUG_FUNCPTR and remove some extra vlnak lines.
+
+2008-06-27 07:55:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: ChangeLog surgery.
+ Original commit message from CVS:
+ * ChangeLog:
+ ChangeLog surgery.
+ * tests/examples/seek/seek.c:
+ Move variable into ifdef too.
+
+2008-06-27 07:42:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Include config.h and check if we have X. Fixes: #540334.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c:
+ Include config.h and check if we have X. Fixes: #540334.
+
+2008-06-26 06:03:38 +0000 Sam Morris <sam@robots.org.to.uk>
+
+ gst-libs/gst/interfaces/mixertrack.c: API: Add "index" property to GstMixerTrack to differantiate between multiple mi...
+ Original commit message from CVS:
+ Patch by: Sam Morris <sam at robots dot org to uk>
+ * gst-libs/gst/interfaces/mixertrack.c:
+ (gst_mixer_track_class_init), (gst_mixer_track_get_property),
+ (gst_mixer_track_set_property):
+ API: Add "index" property to GstMixerTrack to differantiate between
+ multiple mixer tracks with the same label.
+ * ext/alsa/gstalsamixeroptions.c: (gst_alsa_mixer_options_new):
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new):
+ Set the "index" property of GstMixerTrack to the index given by ALSA.
+ Fixes bug #528299.
+
+2008-06-25 13:15:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/: Remove libgstvideo usage. Use gtk_get_option_group instead of gtk_init().
+ Original commit message from CVS:
+ * tests/examples/seek/Makefile.am:
+ * tests/examples/seek/seek.c:
+ Remove libgstvideo usage. Use gtk_get_option_group instead of
+ gtk_init().
+
+2008-06-24 16:27:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/Makefile.am: Name the test registry format neutral.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Name the test registry format neutral.
+
+2008-06-24 16:22:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstqueue2.c: Do not double notify. Remove the unsued return value.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c:
+ Do not double notify. Remove the unsued return value.
+
+2008-06-24 16:15:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/alsa/gstalsamixer.c: Also consider "speaker" as a name for master volume. If that doesn't help look for the first...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c:
+ Also consider "speaker" as a name for master volume. If that doesn't
+ help look for the first non-mono volume control that also has a
+ playback switch.
+
+2008-06-24 16:10:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: Forgot to save the ChangeLog :/
+ Original commit message from CVS:
+ * ChangeLog:
+ Forgot to save the ChangeLog :/
+
+2008-06-24 16:05:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/: Embedd the xwindow.
+ Original commit message from CVS:
+ * tests/examples/seek/Makefile.am:
+ * tests/examples/seek/seek.c:
+ Embedd the xwindow.
+
+2008-06-24 01:14:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/ximage/ximagesink.h: When the caps change, make sure to re-draw borders in force-aspect-ratio=true mode.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c (gst_ximagesink_ximage_put),
+ (gst_ximagesink_setcaps):
+ * sys/ximage/ximagesink.h:
+ When the caps change, make sure to re-draw borders in
+ force-aspect-ratio=true mode.
+ * sys/xvimage/xvimagesink.c (gst_xvimagesink_xvimage_put):
+ Don't clear the border_draw flag until we actually draw the border.
+ * tests/check/Makefile.am:
+ Ignore alsasink/src during the states test too, so it doesn't fail
+ when running without access to the sound device.
+
+2008-06-22 18:35:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Fix crasher when playing a parse-launch line the 2nd time.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c:
+ Fix crasher when playing a parse-launch line the 2nd time.
+
+2008-06-21 18:56:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/pipelines/oggmux.c: Properly ifdef tests to fix compilation.
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c:
+ Properly ifdef tests to fix compilation.
+
+2008-06-21 10:25:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ break long lines
+ Original commit message from CVS:
+ break long lines
+
+2008-06-20 18:24:24 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/: Add get-video-pad, get-audio-pad, get-text-pad action signals to playbin2. This allows the user to get...
+ Original commit message from CVS:
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gstplaybin2.c:
+ Add get-video-pad, get-audio-pad, get-text-pad action signals to
+ playbin2. This allows the user to get to the selector's sinkpads, and
+ thus inspect a range of things - caps, tags, etc.
+
+2008-06-20 17:27:03 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstplaybin2.c: Use a different constant for the convert-frame signal id.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c:
+ Use a different constant for the convert-frame signal id.
+ Fixes #537009.
+
+2008-06-20 17:18:55 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/: Fix a whole bunch of typos in comments and log statements.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gstplaysink.c:
+ Fix a whole bunch of typos in comments and log statements.
+
+2008-06-20 17:02:48 +0000 Michael Smith <msmith@xiph.org>
+
+ sys/xvimage/xvimagesink.c: Don't set colour balance values on the Xv port if the user hasn't changed them (via proper...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Don't set colour balance values on the Xv port if the user hasn't
+ changed them (via properties or the interface). Avoids accumulating
+ rounding errors for the common case.
+ Partial fix for bug #537889.
+
+2008-06-20 16:56:18 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstdecodebin2.c: Ensure decodebin2 emits 'drained' signal once, and only once, when all pads are drained.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ Ensure decodebin2 emits 'drained' signal once, and only once, when all
+ pads are drained.
+
+2008-06-20 16:12:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/README:
+ apparently it's an error to specify nc -l -p 3000 - though the short usage does not make it very clear that you can d...
+ Original commit message from CVS:
+ apparently it's an error to specify nc -l -p 3000 - though the short usage
+ does not make it very clear that you can drop the host arg with -l
+
+2008-06-20 09:25:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisenc.c: Report the encoder latency. Fixes #538232.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_get_latency),
+ (gst_vorbis_enc_src_query), (gst_vorbis_enc_chain):
+ Report the encoder latency. Fixes #538232.
+
+2008-06-20 09:19:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Implement the source property, emit notify when it changes in the underlying uridecodebin.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_get_property),
+ (notify_source), (activate_group):
+ Implement the source property, emit notify when it changes in the
+ underlying uridecodebin.
+
+2008-06-20 09:14:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Free and clear the seek element list so that we don't use invalid references when seeking...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (stop_cb):
+ Free and clear the seek element list so that we don't use invalid
+ references when seeking after recreating a gst-launch line.
+
+2008-06-20 09:09:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Report latency even if we are not live instead of hiding it.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_query), (gst_base_audio_sink_skew_slaving),
+ (gst_base_audio_sink_render):
+ Report latency even if we are not live instead of hiding it.
+ Take ts-offset and render-delay of the basesink into account when
+ scheduling samples.
+ Rework the clipping code so that we can take the various offsets into
+ account and still do correct clipping.
+
+2008-06-20 08:52:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump verion back to devel -> 0.10.20.1
+ Original commit message from CVS:
+ * configure.ac:
+ Bump verion back to devel -> 0.10.20.1
+
+2008-06-20 08:47:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/tag/tags.c: Don't increase the size of non-string image buffers by one as this might in theory confuse d...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (gst_tag_image_data_to_image_buffer):
+ Don't increase the size of non-string image buffers by one as this
+ might in theory confuse decoders. Still increase it by one for string
+ image buffers to append '\0'.
+
+2008-06-20 08:45:13 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gdp/gstgdppay.c: Fix a buffer memleak and remove a confusing and wrong debug output.
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset):
+ Fix a buffer memleak and remove a confusing and wrong debug output.
+ Fixes bug #538663.
+
+2008-06-19 11:25:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/appsink-src.c: Don't use a buffer after unreffing it.
+ Original commit message from CVS:
+ * examples/app/appsink-src.c: (on_new_buffer_from_source):
+ Don't use a buffer after unreffing it.
+
+=== release 0.10.20 ===
+
+2008-06-18 14:36:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * po/LINGUAS:
+ * win32/common/config.h:
+ Release 0.10.20
+ Original commit message from CVS:
+ Release 0.10.20
+
+2008-06-18 14:32:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/it.po:
+ * po/lt.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:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-06-18 06:31:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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-16 14:11:36 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst-libs/gst/app/gstappsrc.c:
+ gst-libs/gst/app/gstappsrc.c (gst_app_src_set_max_bytes)
+ Original commit message from CVS:
+ 2008-06-16 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/app/gstappsrc.c (gst_app_src_set_max_bytes)
+ (gst_app_src_get_max_bytes, gst_app_src_push_buffer): Use
+ G_GUINT64_FORMAT. Avoid overflow in get_max_bytes().
+
+2008-06-16 07:30:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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-13 11:59:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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 15:47:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/: Add beefed up example app from bug #413418. It now also uses appsink instead of fakesink for more ulti...
+ Original commit message from CVS:
+ * examples/app/.cvsignore:
+ * examples/app/Makefile.am:
+ * examples/app/appsink-src.c: (on_new_buffer_from_source),
+ (on_source_message), (on_sink_message), (main):
+ Add beefed up example app from bug #413418. It now also uses appsink
+ instead of fakesink for more ultimate coolness.
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_init), (gst_app_src_set_property),
+ (gst_app_src_get_property), (gst_app_src_unlock),
+ (gst_app_src_unlock_stop), (gst_app_src_create),
+ (gst_app_src_set_max_bytes), (gst_app_src_push_buffer),
+ (gst_app_src_end_of_stream):
+ * gst-libs/gst/app/gstappsrc.h:
+ Add block property to allow push based implementation to block when we
+ fill up the appsrc queues.
+ Emit the enough-data signal while releasing our lock.
+
+2008-06-12 14:50:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ examples/app/.cvsignore: Ignore more.
+ Original commit message from CVS:
+ * examples/app/.cvsignore:
+ Ignore more.
+
+2008-06-12 14:49:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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-11 21:17:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: 0.10.19.3 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ 0.10.19.3 pre-release
+
+2008-06-11 20:13:00 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Fix build on win32.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Fix build on win32.
+ Patch By: David Schleef <ds@schleef.org>
+ Fixes: #536874
+
+2008-06-11 09:35:51 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgiobasesrc.*: Try to read the requested number of bytes, even if the first read returns less than requeste...
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_finalize),
+ (gst_gio_base_src_create):
+ * ext/gio/gstgiobasesrc.h:
+ Try to read the requested number of bytes, even if the first
+ read returns less than requested, until nothing is read anymore
+ or we have the requested amount of bytes. This fixes playback of
+ files via Samba as Samba only allows to read 64k at once.
+ Implement a caching algorithm that makes sure that we read at
+ least 4k of data every time. Some elements will try to read a few
+ bytes, then seek, read again a few bytes and so on and this is
+ painfully slow as every operation has to go over DBus if GVfs is
+ used as backend.
+ Fixes bug #536849 and #536848.
+ * ext/gio/gstgiosrc.c: (gst_gio_src_class_init),
+ (gst_gio_src_check_get_range):
+ Override check_get_range() to blacklist http/https URIs
+ and whitelist file URIs. More to be added on demand.
+
+2008-06-06 16:50:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/: Added 3 more example application for using appsrc in random-access mode, pull-mode streaming and pull ...
+ Original commit message from CVS:
+ * examples/app/Makefile.am:
+ * examples/app/appsrc-ra.c: (feed_data), (seek_data),
+ (found_source), (bus_message), (main):
+ * examples/app/appsrc-seekable.c: (feed_data), (seek_data),
+ (found_source), (bus_message), (main):
+ * examples/app/appsrc-stream2.c: (feed_data), (found_source),
+ (bus_message), (main):
+ Added 3 more example application for using appsrc in random-access mode,
+ pull-mode streaming and pull mode seekable.
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_start), (gst_app_src_do_get_size),
+ (gst_app_src_create):
+ * gst-libs/gst/app/gstappsrc.h:
+ Make stream-type property writable.
+ Unset flushing when starting so that we reuse appsrc.
+ Inform basesrc about the configured size.
+ Emit seek-data signal when we are going to a different offset in
+ random-access mode.
+
+2008-06-06 14:19:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/appsrc-stream.c: Use deep-notify until we can depend on a playbin2 with support for the source property.
+ Original commit message from CVS:
+ * examples/app/appsrc-stream.c: (found_source), (main):
+ Use deep-notify until we can depend on a playbin2 with support for the
+ source property.
+
+2008-06-05 16:38:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/: Added an example on how to use appsrc in playbin in streaming mode from an mmapped file.
+ Original commit message from CVS:
+ * examples/app/.cvsignore:
+ * examples/app/Makefile.am:
+ * examples/app/appsrc-stream.c: (read_data), (start_feed),
+ (stop_feed), (found_source), (bus_message), (main):
+ Added an example on how to use appsrc in playbin in streaming mode from
+ an mmapped file.
+ * examples/app/appsrc_ex.c: (main):
+ Set pipeline to NULL to free queued buffers.
+ * gst-libs/gst/app/gstapp-marshal.list:
+ * gst-libs/gst/app/gstappsrc.c: (stream_type_get_type), (_do_init),
+ (gst_app_src_class_init), (gst_app_src_init),
+ (gst_app_src_flush_queued), (gst_app_src_dispose),
+ (gst_app_src_set_property), (gst_app_src_get_property),
+ (gst_app_src_unlock), (gst_app_src_unlock_stop),
+ (gst_app_src_start), (gst_app_src_stop), (gst_app_src_is_seekable),
+ (gst_app_src_check_get_range), (gst_app_src_do_seek),
+ (gst_app_src_create), (gst_app_src_set_stream_type),
+ (gst_app_src_get_stream_type), (gst_app_src_set_max_bytes),
+ (gst_app_src_get_max_bytes), (gst_app_src_push_buffer),
+ (gst_app_src_end_of_stream), (gst_app_src_uri_get_type),
+ (gst_app_src_uri_get_protocols), (gst_app_src_uri_get_uri),
+ (gst_app_src_uri_set_uri), (gst_app_src_uri_handler_init):
+ * gst-libs/gst/app/gstappsrc.h:
+ Measure max queue size in bytes instead.
+ Add support for 3 modes of operation, streaming, seekable and
+ random-access, making basesrc handle the scheduling modes for each.
+ Add appsrc:// uri handler so that automatic plugging can be done from
+ playbin2 or uridecodebin, for example.
+ Added support for custom segment formats.
+ Add support for push and pull based operations from the application.
+ Expand the methods so that errors can be detected.
+ Flush the queued buffers on seeks and when shutting down.
+ Add signals to inform the app that a seek must happen.
+
+2008-06-05 09:47:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: 0.10.19.2 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ 0.10.19.2 pre-release
+
+2008-06-04 21:48:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/: Add new API functions to the dll exports
+ Original commit message from CVS:
+ * win32/common/libgstrtsp.def:
+ * win32/common/libgsttag.def:
+ Add new API functions to the dll exports
+
+2008-06-04 17:42:38 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstplaybasebin.c: Disconnect signals from decodebins we created before we remove it from playbin, to avo...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ Disconnect signals from decodebins we created before we remove it from
+ playbin, to avoid crashes if the decodebin is eventually disposed after
+ the playbin itself (possible if the app takes a reference on the
+ decodebin).
+ Fixes #536521.
+
+2008-06-04 17:12:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Bunch of small clean-ups: use gst_type_find_suggest_simple(); don't copy caps fo...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (aac_type_find),
+ (mp3_type_find), (musepack_type_find), (MULTIPART_MAX_HEADER_SIZE),
+ (mpeg_sys_type_find), (mpeg_ts_type_find), (mpeg4_video_type_find),
+ (h264_video_type_find), (mpeg_video_stream_type_find),
+ (dv_type_find), (mmsh_type_find):
+ Bunch of small clean-ups: use gst_type_find_suggest_simple(); don't
+ copy caps for no good reason (this may be desirable to make it easier
+ to detect leaks, but then it should probably be done for all caps
+ in the typefinder somewhere).
+
+2008-06-04 16:06:49 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ tests/check/Makefile.am: Do not try to run the check tests for subparse unless it has been built.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Do not try to run the check tests for subparse unless it has been
+ built.
+
+2008-06-04 16:00:26 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ tests/check/pipelines/streamheader.c: Do not try to run a test which requires vorbisenc unless we have actually built...
+ Original commit message from CVS:
+ * tests/check/pipelines/streamheader.c: (buffer_probe_cb),
+ (test_multifdsink_gdp_vorbisenc), (streamheader_suite):
+ Do not try to run a test which requires vorbisenc unless we have
+ actually built it.
+
+2008-06-04 11:53:53 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.*: Add a couple of missing argument guards.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_set_auth), (gst_rtsp_connection_set_auth_param),
+ (gst_rtsp_connection_clear_auth_params),
+ (gst_rtsp_connection_set_qos_dscp), (gst_rtsp_connection_get_ip):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Add a couple of missing argument guards.
+ Add a way of setting the DSCP for an RTSP connection.
+ Add an accessor method for the ip member of GstRTSPConnection as all
+ members are supposed to be private.
+
+2008-06-04 11:33:23 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/tcp/gstmultifdsink.c: Fixed accidental use of IPv4 options for all IPv6 addresses.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (setup_dscp_client):
+ Fixed accidental use of IPv4 options for all IPv6 addresses.
+
+2008-06-04 10:18:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixertrack.h: Document mixer track flags.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ Document mixer track flags.
+
+2008-06-04 05:58:38 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gdp/gstgdppay.c: Don't set caps on the buffers that contain a copy of the buffer including the caps of them resul...
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader):
+ Don't set caps on the buffers that contain a copy of the buffer
+ including the caps of them resulting in an always increasing refcount
+ of the caps and insanely large caps. Instead include a buffer without
+ caps in the new caps. Fixes bug #536475.
+
+2008-06-04 05:44:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/videoscale/gstvideoscale.c: Transform a given PAR to a range on the struct with the generic height/width instead ...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform_caps):
+ Transform a given PAR to a range on the struct with the generic
+ height/width instead of the struct with the possibly restricted
+ height/width.
+
+2008-06-04 04:24:27 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/videoscale/gstvideoscale.c: Prefer the given format if it contains something stricter than [1,MAX] for height or ...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform_caps):
+ Prefer the given format if it contains something stricter than [1,MAX]
+ for height or width and only put a structure that requires rescaling
+ as second. This makes it possible to use videoscale in pipelines where
+ the source can actually produce the wanted height/width but usually
+ selects a different one from the requested.
+
+2008-06-03 20:01:58 +0000 John Millikin <jmillikin@gmail.com>
+
+ gst-libs/gst/tag/gstvorbistag.c: Retrieve COVERART tags from vorbis comments (#512333)
+ Original commit message from CVS:
+ Based on patch by: John Millikin <jmillikin gmail com>
+ * gst-libs/gst/tag/gstvorbistag.c: (tag_matches), (gst_vorbis_tag_add),
+ (gst_vorbis_tag_add_coverart):
+ Retrieve COVERART tags from vorbis comments (#512333)
+
+2008-06-03 19:44:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/: Don't forget to add new enum value here too (should probably use glib-mkenums here...).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c: (register_tag_image_type_enum):
+ Don't forget to add new enum value here too (should probably use
+ glib-mkenums here...).
+
+2008-06-03 19:29:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/: API: add gst_tag_image_data_to_image_buffer()
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c: (gst_tag_list_add_id3_image):
+ * gst-libs/gst/tag/tag.h: (GST_TAG_IMAGE_TYPE_NONE),
+ * gst-libs/gst/tag/tags.c: (register_tag_image_type_enum),
+ (gst_tag_image_type_get_type), (gst_tag_image_type_is_valid),
+ (gst_tag_image_data_to_image_buffer):
+ Add two utility functions to avoid code duplication (#512333):
+ API: add gst_tag_image_data_to_image_buffer()
+ API: add gst_tag_list_add_id3_image()
+
+2008-06-03 08:54:29 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstaudio.def: Add gst_audio_check_channel_positions() to the exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ Add gst_audio_check_channel_positions() to the exported symbols.
+
+2008-06-03 08:48:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Make gst_audio_check_channel_positions() public.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions):
+ * gst-libs/gst/audio/multichannel.h:
+ API: Make gst_audio_check_channel_positions() public.
+ * tests/check/libs/audio.c: (GST_START_TEST):
+ Add some simple checks for gst_audio_check_channel_positions().
+
+2008-06-02 20:09:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/v4l/v4l_calls.c: minrange and maxrange are scaled according to the frequency multiplier.
+ Original commit message from CVS:
+ * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names):
+ minrange and maxrange are scaled according to the frequency
+ multiplier.
+
+2008-06-02 18:37:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/: Use gstvideo functions to calculate strides and plane offsets. Fixes rendering issue ('ghost' images of t...
+ Original commit message from CVS:
+ * ext/pango/Makefile.am:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_shade_y),
+ (gst_text_overlay_blit_yuv420), (gst_text_overlay_push_frame):
+ Use gstvideo functions to calculate strides and plane offsets. Fixes
+ rendering issue ('ghost' images of the text on the chroma planes)
+ with widths or heights that are not multiples of 8 (#506659 and
+ probably also #485729).
+ * tests/icles/test-textoverlay.c: (show_text), (test_textoverlay),
+ (main):
+ Test with odd height/width too.
+
+2008-06-02 12:20:35 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: When using gst_element_iterate_pads() one has to unref every pad after usage.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_query_duration),
+ (gst_adder_query_latency):
+ When using gst_element_iterate_pads() one has to unref every pad
+ after usage.
+
+2008-05-31 19:57:57 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Add a gtk-doc chunk for the new properties to have a Since: indication.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init):
+ Add a gtk-doc chunk for the new properties to have a Since: indication.
+
+2008-05-31 19:50:59 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * ChangeLog:
+ ChangeLog surgery, mark API change
+ Original commit message from CVS:
+ ChangeLog surgery, mark API change
+
+2008-05-31 18:10:47 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Provide readable actual-buffer-time and actual-latency-time properties that ref...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init), (gst_base_audio_src_dispose),
+ (gst_base_audio_src_get_property), (gst_base_audio_src_setcaps),
+ (gst_base_audio_src_change_state):
+ Provide readable actual-buffer-time and actual-latency-time properties
+ that reflect the configured ringbuffer values. Fixes #524724.
+
+2008-05-30 15:29:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Simply converting the running time into an RTP timestamp by scaling it based on...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push),
+ (gst_basertppayload_change_state):
+ Simply converting the running time into an RTP timestamp by scaling it
+ based on the clock-rate is good enough for making an RTP timestamp. This
+ has the added benefit that we can later on expose a property with the
+ RTP timestamp of running time 0, as is needed for RTSP servers to
+ generate the response of the PLAY request.
+
+2008-05-30 08:42:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Allow up to 11 positioned channels now that audioconvert can handle this but add ...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (structure_has_fixed_channel_positions),
+ (gst_audio_convert_transform_caps):
+ Allow up to 11 positioned channels now that audioconvert can handle
+ this but add no default positions for > 8 channels.
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Add some unit tests for the above change: Test conversion of
+ 11 positioned channels to stereo and the other way around, test
+ conversion of 15 unpositioned channels in different ways.
+
+2008-05-29 19:45:40 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstaudio.def: Add gst_audio_clock_reset to the list of exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ Add gst_audio_clock_reset to the list of exported symbols.
+
+2008-05-29 19:37:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/vorbisdec.c: Remove wrong_channels_identification_header unit test as we now support 7 (and more...
+ Original commit message from CVS:
+ * tests/check/elements/vorbisdec.c: (vorbisdec_suite):
+ Remove wrong_channels_identification_header unit test as we now
+ support 7 (and more channels).
+
+2008-05-29 12:17:16 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstchannelmix.c: If mixing left or right to center (or the other way around) only take the complete ...
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c:
+ (gst_channel_mix_fill_one_other):
+ If mixing left or right to center (or the other way around) only take
+ the complete value if we don't already have the original position in
+ the source.
+
+2008-05-29 11:34:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/multichannel.c: Allow rear center together with rear left/right and other previously conflicting c...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions),
+ (gst_audio_set_structure_channel_positions_list),
+ (gst_audio_fixate_channel_positions):
+ Allow rear center together with rear left/right and other previously
+ conflicting channel positions. The reason why they weren't allowed
+ was the channel mixing implementation in audioconvert.
+ Also take this into account when fixing channel layouts.
+ Allow setting channel positions for 1/2 channels when using
+ gst_audio_set_structure_channel_position().
+ * gst/audioconvert/gstchannelmix.c:
+ (gst_channel_mix_fill_compatible), (gst_channel_mix_detect_pos),
+ (gst_channel_mix_fill_one_other), (gst_channel_mix_fill_others),
+ (gst_channel_mix_fill_special), (gst_channel_mix_fill_matrix):
+ Major rewrite of the channel mixing.
+ We now allow previously conflicting channel positions to appear
+ together (rear center and rear left/right for example).
+ Fixes bug #533817.
+ Rework the way channels are mixed together to take more possible
+ channel positions into account, properly mix from/to side channels
+ and don't assume that either center, left&right or nothing of a
+ specific position is available anymore.
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Adjust unit tests with non-standard 1/2 channel layouts to the more
+ correct new behaviour.
+ Add a unit test for 5.1->Stereo downmixing.
+
+2008-05-29 07:02:50 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/vorbis/: Add sane defaults for the 7 and 8 channel layouts as those are undefined in the Vorbis spec. Use NONE ch...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_identification_packet):
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_generate_sink_caps):
+ Add sane defaults for the 7 and 8 channel layouts as those are
+ undefined in the Vorbis spec. Use NONE channel layouts when decoding
+ more than 8 channels instead of erroring out. Fixes bug #535356.
+
+2008-05-28 16:10:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add theoraparse to the docs and fix some docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/theora/theoraparse.c:
+ Add theoraparse to the docs and fix some docs.
+
+2008-05-28 15:48:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: Fix EOS condition and track addition check, the track.end sector is included in t...
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_add_track), (gst_cdda_base_src_create):
+ Fix EOS condition and track addition check, the track.end sector is
+ included in the track. Fixes #533265.
+
+2008-05-28 14:49:24 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ gst/videorate/gstvideorate.*: React (more) to NEWSEGMENT
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * gst/videorate/gstvideorate.c: (gst_video_rate_reset),
+ (gst_video_rate_flush_prev), (gst_video_rate_event),
+ (gst_video_rate_chain):
+ * gst/videorate/gstvideorate.h:
+ React (more) to NEWSEGMENT
+ Small adjustment in timestamp calculation to prevent mismatches
+ Fixes #435633.
+
+2008-05-28 11:31:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/seek/seek.c: Initialise error to NULL as we should.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (make_parselaunch_pipeline):
+ Initialise error to NULL as we should.
+
+2008-05-28 08:14:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: Implement latency query.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_query_duration),
+ (gst_adder_query_latency), (gst_adder_query):
+ Implement latency query.
+
+2008-05-27 18:10:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: Correctly resync the iterator if gst_iterator_next() returns
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_query_duration):
+ Correctly resync the iterator if gst_iterator_next() returns
+ GST_ITERATOR_RESYNC.
+
+2008-05-27 17:14:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/vs6/libgstpbutils.dsp: Add pbutils-enumtypes.c to sources (#518037).
+ Original commit message from CVS:
+ * win32/vs6/libgstpbutils.dsp:
+ Add pbutils-enumtypes.c to sources (#518037).
+
+2008-05-27 16:20:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudioclock.*: Add method to inform the clock that the time starts from 0 again. We use this inf...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_init),
+ (gst_audio_clock_reset), (gst_audio_clock_get_internal_time):
+ * gst-libs/gst/audio/gstaudioclock.h:
+ Add method to inform the clock that the time starts from 0 again. We use
+ this info to calculate a clock offset so that the time we report in
+ internal_time is monotonically increasing, as required by the clock base
+ class. Fixes #521761.
+ API: GstAudioClock::gst_audio_clock_reset()
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_skew_slaving),
+ (gst_base_audio_sink_change_state):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create), (gst_base_audio_src_change_state):
+ Reset reported time when we (re)create the ringbuffer.
+
+2008-05-27 16:11:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsamixertrack.c: Make sure playback volumes aren't accidentally overwritten by capture volumes if an als...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixertrack.c:
+ (gst_alsa_mixer_track_update_alsa_capabilities):
+ Make sure playback volumes aren't accidentally overwritten by
+ capture volumes if an alsa mixer track has both playback and
+ capture capabilities: we create two GstMixerTracks in that
+ case, so make sure we query only the alsa capabilities that
+ refer to the type of GstMixerTrack we created from the dual
+ capability alsa element. Should fix issues with Audigy2 sound
+ cards (#518082).
+
+2008-05-27 10:57:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/oggmux.c: Don't use deprecated function.
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c: (test_pipeline):
+ Don't use deprecated function.
+
+2008-05-27 10:35:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Check for NULL cases and log them, creating ghostpads can, for example, fail when the p...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ (gst_decode_group_control_source_pad), (gst_decode_group_expose):
+ Check for NULL cases and log them, creating ghostpads can, for example,
+ fail when the pad returns wrong caps.
+ * gst/playback/gstplaybin2.c: (perform_eos):
+ When pushing out the EOS event, collect the return value and warn when
+ something failed.
+
+2008-05-26 17:18:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: Add support for DVCPRO.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add support for DVCPRO.
+
+2008-05-26 10:29:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videoscale/gstvideoscale.c: Change default scaling method from nearest-neighbour to bilinear.
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (DEFAULT_PROP_METHOD):
+ Change default scaling method from nearest-neighbour to bilinear.
+
+2008-05-26 10:26:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/video.c: More checks.
+ Original commit message from CVS:
+ * tests/check/libs/video.c:
+ More checks.
+
+2008-05-25 20:51:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Limit duration to a maximum of five seconds for tmplayer format where we can guess the duration only from the timesta...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (parser_state_init),
+ (gst_sub_parse_format_autodetect), (handle_buffer):
+ * gst/subparse/gstsubparse.h:
+ * tests/check/elements/subparse.c: (test_tmplayer_style3b):
+ Limit duration to a maximum of five seconds for tmplayer format where
+ we can guess the duration only from the timestamp of the next line of
+ text. We don't want to show a text for eternities just because nothing
+ else is being said for a while.
+
+2008-05-23 14:14:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Check sequence numbers, mark input buffers with a discont flag for the subcla...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_handle_sink_event),
+ (gst_base_rtp_depayload_push_full),
+ (gst_base_rtp_depayload_change_state):
+ Check sequence numbers, mark input buffers with a discont flag for the
+ subclass when we detected a gap, drop duplicate buffers. We do this
+ because one can use the element without a jitterbuffer in front and we
+ don't want to feed the subclasses invalid or reordered data.
+ Do an error when the subclass did not provide a process function instead
+ of crashing.
+ Some other small cleanups.
+
+2008-05-22 22:35:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/videotestsrc.c: May just as well use the precalculated uvstride here.
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c: (paint_hline_NV12_NV21):
+ May just as well use the precalculated uvstride here.
+
+2008-05-22 22:09:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add some documentation comments, and some new headers to be scanned.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-overrides.txt:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggdemux.h:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.h:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c:
+ * gst/playback/gsturidecodebin.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ * gst/tcp/gsttcp.h:
+ Add some documentation comments, and some new headers to be scanned.
+ Rename some internal enum declarations (audioconvert's DitherType and
+ NoiseShapingType, GstUnitType from the TCP elements) to match the
+ documented GObject type names so that the docs pick them up.
+ Name the playbin2 docs markups properly so they get picked up. They'll
+ need renaming back when/if playbin2 becomes playbin.
+ 100% symbol coverage for the plugin docs, booya.
+
+2008-05-22 18:30:15 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/videotestsrc/videotestsrc.c: Fix generation of NV12/NV21 frames. Fixes bug #532454.
+ Original commit message from CVS:
+ Patch by: Thijs Vermeir <thijsvermeir@gmail.com>
+ * gst/videotestsrc/videotestsrc.c: (paint_hline_NV12_NV21):
+ Fix generation of NV12/NV21 frames. Fixes bug #532454.
+
+2008-05-22 11:59:33 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/playback/gstdecodebin.c: Lock the fakesink before setting the state to NULL and removing it from the bin so that ...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * gst/playback/gstdecodebin.c: (remove_fakesink):
+ Lock the fakesink before setting the state to NULL and removing it from
+ the bin so that a concurrent state change cannot interfere.
+ Fixes #534331.
+
+2008-05-21 17:09:42 +0000 Felipe Contreras <felipe.contreras@nokia.com>
+
+ docs/Makefile.am: Fix installing plugin documentation when gtk-doc is disabled.
+ Original commit message from CVS:
+ * docs/Makefile.am:
+ Fix installing plugin documentation when gtk-doc is disabled.
+
+2008-05-21 17:01:16 +0000 Felipe Contreras <felipe.contreras@nokia.com>
+
+ gst-libs/gst/rtsp/Makefile.am: Distribute, don't install md5.h
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/Makefile.am:
+ Distribute, don't install md5.h
+
+2008-05-21 16:47:58 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/tcp/gstmultifdsink.c: Use IPPROTO_IP instead of SOL_IP, works on more platforms.
+ Original commit message from CVS:
+ 2008-05-21 Julien Moutte <julien@fluendo.com>
+ * gst/tcp/gstmultifdsink.c: (setup_dscp_client): Use IPPROTO_IP
+ instead of SOL_IP, works on more platforms.
+ * gst/typefind/gsttypefindfunctions.c: (aac_type_find): Fix printf
+ arguments.
+
+2008-05-21 16:44:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Some debug and comment fixes.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_show_frame):
+ Some debug and comment fixes.
+ * tests/examples/dynamic/addstream.c: (main):
+ Fix , to ;
+
+2008-05-21 16:36:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Don't use bad gst_element_get_pad().
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_typefind):
+ * gst/playback/decodetest.c: (new_decoded_pad_cb):
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_init),
+ (try_to_link_1), (elem_is_dynamic), (close_link), (type_found),
+ (cleanup_decodebin):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_init),
+ (connect_element), (gst_decode_group_control_demuxer_pad):
+ * gst/playback/gstplaybasebin.c: (queue_remove_probe),
+ (queue_out_of_data), (gen_preroll_element), (preroll_unlinked),
+ (mute_group_type):
+ * gst/playback/gstplaybin.c: (gst_play_bin_vis_blocked),
+ (gst_play_bin_set_property), (handoff), (gen_video_element),
+ (gen_text_element), (gen_audio_element), (gen_vis_element),
+ (remove_sinks), (add_sink), (setup_sinks):
+ * gst/playback/gstplaybin2.c: (pad_added_cb), (no_more_pads_cb):
+ * gst/playback/gstplaysink.c: (gst_play_sink_get_video_sink),
+ (gst_play_sink_get_audio_sink), (gst_play_sink_vis_unblocked),
+ (gst_play_sink_vis_blocked), (gst_play_sink_set_vis_plugin),
+ (gst_play_sink_get_vis_plugin), (gst_play_sink_set_mute),
+ (gen_video_chain), (gen_text_chain), (gen_audio_chain),
+ (gen_vis_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_set_font_desc), (gst_play_sink_get_font_desc),
+ (gst_play_sink_request_pad):
+ * gst/playback/gsturidecodebin.c: (type_found), (setup_source):
+ * gst/playback/test.c: (gen_video_element), (gen_audio_element),
+ (cb_newpad):
+ * gst/playback/test6.c: (new_decoded_pad_cb):
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ * tests/check/elements/audiorate.c: (test_injector_chain),
+ (do_perfect_stream_test):
+ * tests/check/elements/ffmpegcolorspace.c: (GST_START_TEST):
+ * tests/check/elements/gdpdepay.c: (GST_START_TEST):
+ * tests/check/elements/gnomevfssink.c:
+ * tests/check/elements/textoverlay.c:
+ (notgst_check_setup_src_pad2), (notgst_check_teardown_src_pad2):
+ * tests/check/elements/videotestsrc.c: (GST_START_TEST):
+ * tests/check/libs/cddabasesrc.c: (GST_START_TEST):
+ * tests/check/pipelines/oggmux.c: (test_pipeline):
+ * tests/check/pipelines/streamheader.c: (GST_START_TEST):
+ * tests/check/pipelines/theoraenc.c: (GST_START_TEST):
+ * tests/check/pipelines/vorbisenc.c: (GST_START_TEST):
+ * tests/examples/seek/scrubby.c: (make_wav_pipeline):
+ * tests/examples/seek/seek.c: (make_mod_pipeline),
+ (make_dv_pipeline), (make_wav_pipeline), (make_flac_pipeline),
+ (make_sid_pipeline), (make_parse_pipeline), (make_vorbis_pipeline),
+ (make_theora_pipeline), (make_vorbis_theora_pipeline),
+ (make_avi_msmpeg4v3_mp3_pipeline), (make_mp3_pipeline),
+ (make_avi_pipeline), (make_mpeg_pipeline), (make_mpegnt_pipeline),
+ (update_fill), (msg_buffering):
+ Don't use bad gst_element_get_pad().
+
+2008-05-21 14:35:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-media.c: Fix wrong method name in docs. Fix calculation of strf fields for broken mulaw/alaw.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c:
+ Fix wrong method name in docs. Fix calculation of strf fields for
+ broken mulaw/alaw.
+ * gst-libs/gst/riff/riff-read.c:
+ Whitespace fix and removing double ';'.
+
+2008-05-21 11:52:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-playbin2.txt: Add some leftover doc.
+ Original commit message from CVS:
+ * docs/design/part-playbin2.txt:
+ Add some leftover doc.
+
+2008-05-21 11:36:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstchannelmix.c: Fix copy & paste error in last commit.
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c: (gst_channel_mix_fill_others):
+ Fix copy & paste error in last commit.
+
+2008-05-21 11:30:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstchannelmix.c: Add support for mixing GST_AUDIO_CHANNEL_POSITION_SIDE_* from/to other channel posi...
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c: (gst_channel_mix_fill_others):
+ Add support for mixing GST_AUDIO_CHANNEL_POSITION_SIDE_* from/to
+ other channel positions when source has SIDE channels and dest doesn't
+ or the other way around.
+
+2008-05-21 11:29:25 +0000 Henrik Eriksson <henriken@axis.com>
+
+ gst/tcp/gstmultifdsink.*: Add support for DSCP QOS. Fixes #469933.
+ Original commit message from CVS:
+ Patch by: Henrik Eriksson <henriken at axis dot com>
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init),
+ (gst_multi_fd_sink_init), (setup_dscp_client), (setup_dscp),
+ (gst_multi_fd_sink_add_full), (gst_multi_fd_sink_set_property),
+ (gst_multi_fd_sink_get_property):
+ * gst/tcp/gstmultifdsink.h:
+ Add support for DSCP QOS. Fixes #469933.
+
+2008-05-21 07:46:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/audioconvert.c: Add another test that checks if conversion between standard 1 and 2 channel layo...
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Add another test that checks if conversion between standard 1 and 2
+ channel layouts with and without positions set is working.
+
+2008-05-21 07:39:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/multichannel.c: Allow non-standard 2 channel layouts.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions):
+ Allow non-standard 2 channel layouts.
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Add some tests for converting and remapping non-standard 1 and 2
+ channel layouts.
+
+2008-05-21 07:28:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstchannelmix.c: Prevent division by zero if the channel mix matrix contains only zeroes.
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c:
+ (gst_channel_mix_fill_normalize):
+ Prevent division by zero if the channel mix matrix contains only
+ zeroes.
+
+2008-05-21 06:45:22 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gdp/gstgdppay.c: Close a buffer memory leak. Fixes bug #534071.
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_chain):
+ Close a buffer memory leak. Fixes bug #534071.
+
+2008-05-21 06:39:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/rtsp/gstrtsptransport.h: Make the GstRTSPTransport struct members public as there are no setters/getters...
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ Make the GstRTSPTransport struct members public as there are no
+ setters/getters and it's supposed to be changed directly.
+ Fixes bug #533087.
+
+2008-05-21 05:48:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: Adder also doesn't support audio/x-raw-int with width!=depth so don't claim this on the pad tem...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Adder also doesn't support audio/x-raw-int with width!=depth so don't
+ claim this on the pad template caps.
+
+2008-05-20 16:26:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: We can only use our optimal calibration if we prerolled before the latency exp...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_sync_latency):
+ We can only use our optimal calibration if we prerolled before the
+ latency expired.
+
+2008-05-20 14:35:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Require core CVS for GstBaseSrc buffer caps setting magic.
+ Original commit message from CVS:
+ * configure.ac:
+ Require core CVS for GstBaseSrc buffer caps setting magic.
+
+2008-05-20 12:26:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Fix logic in last commit.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_fixate_channels):
+ Fix logic in last commit.
+
+2008-05-20 12:15:34 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Passthrough the channel positions if the number of output channels is the same as...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_fixate_channels):
+ Passthrough the channel positions if the number of output channels is
+ the same as the number of input channels, the input had a channel
+ layout and downstream requests no special one. We did this already for
+ > 2 channels but now it's also done for 1 channel. Fixes bug #533617.
+
+2008-05-20 11:13:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/gnomevfs/gstgnomevfssrc.*: Set the ICY caps on the srcpad from where they get picked up by the base class now and...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_init),
+ (gst_gnome_vfs_src_finalize),
+ (gst_gnome_vfs_src_received_headers_callback),
+ (gst_gnome_vfs_src_create), (gst_gnome_vfs_src_stop):
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ Set the ICY caps on the srcpad from where they get picked up by the base
+ class now and set on the outgoing buffers.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_buffer_new):
+ BaseSrc now sets the caps on outgoing buffers automatically.
+
+2008-05-20 11:09:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Change the way in which the ringbuffer is started when dealing with a slaved c...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_resample_slaving),
+ (gst_base_audio_sink_skew_slaving),
+ (gst_base_audio_sink_sync_latency), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_async_play),
+ (gst_base_audio_sink_change_state):
+ Change the way in which the ringbuffer is started when dealing with a
+ slaved clock and latency. We now sync to the clock until we reach
+ upstream latency before starting the ringbuffer. This has the effect
+ that we can accurately align the master and slave clocks and let the
+ rate correction code take care of the initial drift or rounding errors
+ instead of leaving them uncorrected with the old approach.
+
+2008-05-20 08:12:19 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Correctly set the default channel positions when converting to 8 channels.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_fixate_channels):
+ Correctly set the default channel positions when converting to 8
+ channels.
+
+2008-05-19 16:13:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Error out if we don't have the required version of core.
+ Original commit message from CVS:
+ * configure.ac:
+ Error out if we don't have the required version of core.
+
+2008-05-19 15:59:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Use data scan helper in aac typefinder and stop scanning for headers when we've ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (aac_type_find):
+ Use data scan helper in aac typefinder and stop scanning
+ for headers when we've found a type. Also fix potential invalid
+ memory access when calculating the frame length.
+
+2008-05-19 14:09:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Don't modify scan context when we return FALSE in ensure_data, so it's possible ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (data_scan_ctx_ensure_data),
+ (mpeg_sys_is_valid_pack):
+ Don't modify scan context when we return FALSE in ensure_data, so
+ it's possible to continue scanning, and we don't end up with a NULL
+ data pointer and a positive size, which might bite us the next time
+ we're called. Small constification.
+
+2008-05-16 21:12:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: Adder doesn't support 24 bit samples so don't claim it supports them in the pad template caps.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Adder doesn't support 24 bit samples so don't claim it supports them
+ in the pad template caps.
+
+2008-05-14 20:28:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Validate the RTP packet before further processing it. It's just too dangerous...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain):
+ Validate the RTP packet before further processing it. It's just too
+ dangerous to accept random packets and people are not forced to use a
+ jitterbuffer or session manager to filter out the bad packets.
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_set_extension_data),
+ (gst_rtp_buffer_get_payload_subbuffer):
+ Small cleanups.
+ When setting extension data in a buffer that is too small, we fail and
+ we should not set the extension bit.
+ Change GST_WARNINGS into g_warning because they really are
+ programming errors.
+ * tests/check/libs/rtp.c: (GST_START_TEST):
+ Catch the g_warnings now in the unit tests and that fact that failing to
+ set extension data left the extension bit untouched.
+
+2008-05-14 13:57:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioresample/gstaudioresample.c: Revert previous change which made basetransform handle buffer_alloc and which b...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init):
+ Revert previous change which made basetransform handle buffer_alloc
+ and which breaks things badly in the non-passthrough case since it
+ returned buffers with a different (ie. sometimes smaller) size than
+ the size requested.
+
+2008-05-14 13:43:12 +0000 Bernard B <b-gnome@largestprime.net>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Fix seqnum compare function for bordercase values and fix the docs again. Fixes #533...
+ Original commit message from CVS:
+ Patch by: Bernard B <b-gnome at largestprime dot net>
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_compare_seqnum):
+ Fix seqnum compare function for bordercase values and fix the docs
+ again. Fixes #533075.
+ * tests/check/libs/rtp.c: (GST_START_TEST), (rtp_suite):
+ Add a testcase for seqnum compare function.
+
+2008-05-14 10:58:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/adder/gstadder.c: Correctly declare the supported endianness on the pad templates and check for correct endiannes...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_setcaps),
+ (gst_adder_class_init):
+ Correctly declare the supported endianness on the pad templates
+ and check for correct endianness in the set caps function. Adder
+ only supports native endianness.
+ Also use gst_element_class_set_details_simple().
+
+2008-05-14 09:12:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Better debug logging in port value handling. Merging separate port value loops into one.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Better debug logging in port value handling. Merging separate port
+ value loops into one.
+
+2008-05-13 16:02:19 +0000 Hannes Bistry <hannesb@gmx.de>
+
+ gst/tcp/: Fix regression in clientsrc because we did not add the fd to the poll set anymore. Fixes #532364.
+ Original commit message from CVS:
+ Patch by: Hannes Bistry <hannesb at gmx dot de>
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_start):
+ * gst/tcp/gsttcpserversink.c:
+ (gst_tcp_server_sink_handle_server_read),
+ (gst_tcp_server_sink_handle_wait), (gst_tcp_server_sink_init_send):
+ Fix regression in clientsrc because we did not add the fd to the poll
+ set anymore. Fixes #532364.
+ Do some cleanups here and there.
+
+2008-05-13 13:04:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/playback/: Use correct marshallers. GstCaps are a boxed type and no GObject subclass.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init):
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init):
+ Use correct marshallers. GstCaps are a boxed type and no GObject
+ subclass.
+
+2008-05-13 11:37:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstrtsp.def: Add gst_rtsp_connection_(set|clear)_auth_param() to the exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstrtsp.def:
+ Add gst_rtsp_connection_(set|clear)_auth_param() to the exported
+ symbols.
+
+2008-05-13 10:59:49 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ tests/check/elements/audioresample.c: Add unit test for the latest basetransform negotiation changes.
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * tests/check/elements/audioresample.c:
+ (live_switch_alloc_only_48000), (live_switch_get_sink_caps),
+ (live_switch_push), (GST_START_TEST):
+ Add unit test for the latest basetransform negotiation changes.
+ See bug #526768.
+
+2008-05-13 09:14:44 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/ffmpegcolorspace/imgconvert.c: Fix nv12<->nv21 conversion if stride is larger than width.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/imgconvert.c: (nv12_to_nv21):
+ Fix nv12<->nv21 conversion if stride is larger than width.
+
+2008-05-13 07:28:21 +0000 j^ <j@oil21.org>
+
+ ext/ogg/gstoggdemux.*: Parse presentation time from skeleton streams and use it as offset for the timestamps. Fixes b...
+ Original commit message from CVS:
+ Patch by: j^ <j at oil21 dot org>
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_parse_skeleton_fishead),
+ (gst_ogg_pad_parse_skeleton_fisbone):
+ * ext/ogg/gstoggdemux.h:
+ Parse presentation time from skeleton streams and use it as offset
+ for the timestamps. Fixes bug #530068.
+
+2008-05-12 08:45:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Revert previous patch that attempted to more accurately calculate the initial ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render), (gst_base_audio_sink_async_play):
+ Revert previous patch that attempted to more accurately calculate the
+ initial offset between master and slave clock. The best thing we can do
+ in general is take the time of both clocks as the diff since we don't
+ know when the actual preroll happened.
+
+2008-05-11 19:52:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/install-plugins.c: Fix docs: type and missing word.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ Fix docs: type and missing word.
+
+2008-05-10 20:16:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Don't do lots of 4-byte peeks, but use the 'new' data scan helper for this inste...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (h264_video_type_find):
+ Don't do lots of 4-byte peeks, but use the 'new' data scan helper
+ for this instead; don't check if we've found enough markers after
+ each and every step, it's enough to do that only if we've actually
+ found a new marker.
+ Embed a G_UNLIKELY into the IS_MPEG_HEADER macro.
+
+2008-05-10 18:19:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Move scan helper thingy to the beginning of the file so we can use it in other t...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ (DATA_SCAN_CTX_CHUNK_SIZE), (DataScanCtx), (data_scan_ctx_advance),
+ (data_scan_ctx_ensure_data), (GST_MPEGVID_TYPEFIND_TRY_SYNC),
+ (mpeg_video_stream_type_find):
+ Move scan helper thingy to the beginning of the file so we can use
+ it in other typefind functions. Rename it to something more
+ generic. Also improve handling of things towards the end of the
+ typefind data: peek as much as we can if we know the size of the
+ data, rather than just min_size.
+
+2008-05-09 21:42:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Document the GstTuner and GstColorBalance interfaces, and some other random API functions that needed it. 70% symbol ...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/colorbalancechannel.c:
+ * gst-libs/gst/interfaces/colorbalancechannel.h:
+ * gst-libs/gst/interfaces/tuner.c:
+ * gst-libs/gst/interfaces/tunerchannel.c:
+ * gst-libs/gst/interfaces/tunerchannel.h:
+ * gst-libs/gst/interfaces/tunernorm.c:
+ * gst-libs/gst/interfaces/tunernorm.h:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ Document the GstTuner and GstColorBalance interfaces, and some
+ other random API functions that needed it. 70% symbol coverage, woo.
+
+2008-05-09 16:38:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Choose to allocate one less segment but require one additional segment as latency.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_acquire):
+ Choose to allocate one less segment but require one additional segment
+ as latency.
+ * gst-libs/gst/audio/gstaudiosrc.c: (gst_audioringbuffer_acquire):
+ No need to increment the number of segments in the source.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_get_time), (clock_convert_external),
+ (gst_base_audio_sink_resample_slaving),
+ (gst_base_audio_sink_skew_slaving),
+ (gst_base_audio_sink_none_slaving), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_async_play):
+ Remove adding latency when returning the internal time while subtracting
+ it again when we use the value a little later.
+ When calculating the end timestamp, we are making a rounding error
+ with the current algorithm. Ensure that we don't accumulate these
+ rounding errors when aligning samples by not resampling at all if we
+ don't need to. Fixes #419351.
+ Make the initial calibration of the clock slaving a little more
+ predictable and accurate. Also handle the case where we don't do
+ clock slaving.
+
+2008-05-09 08:34:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/ffmpegcolorspace/: Add conversions from/to NV12 and NV21 and conversions between those two formats. Fixes bug #53...
+ Original commit message from CVS:
+ Based on a patch by:
+ Björn Benderius <bjoern dot benderius at axis dot com>
+ * 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: (nv12_to_nv21):
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ Add conversions from/to NV12 and NV21 and conversions between those
+ two formats. Fixes bug #532166.
+
+2008-05-08 17:35:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Abort the h264 typefinding as soon as _peek() doesn't return anything, which hap...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (h264_video_type_find):
+ Abort the h264 typefinding as soon as _peek() doesn't return anything,
+ which happens for example with files smaller than 128kb.
+
+2008-05-08 14:46:27 +0000 Wouter Cloetens <zombie@e2big.org>
+
+ gst-libs/gst/rtsp/: Add Digest authorization support for RTSP connections. See #532065.
+ Original commit message from CVS:
+ Patch by: Wouter Cloetens <zombie at e2big dot org>
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_create), (md5_digest_to_hex_string),
+ (auth_digest_compute_hex_urp), (auth_digest_compute_response),
+ (add_auth_header), (gst_rtsp_connection_free),
+ (gst_rtsp_connection_set_auth), (str_case_hash), (str_case_equal),
+ (gst_rtsp_connection_set_auth_param),
+ (gst_rtsp_connection_clear_auth_params):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Add Digest authorization support for RTSP connections. See #532065.
+ * gst-libs/gst/rtsp/md5.c:
+ * gst-libs/gst/rtsp/md5.h:
+ Yeap, another md5 implementation until we can depend on a glib that has
+ support for it.
+
+2008-05-08 06:20:42 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/audioresample/gstaudioresample.c: Let audioresample use the buffer allocation of basetransform instead of it's ow...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init):
+ Let audioresample use the buffer allocation of basetransform instead
+ of it's own stuff.
+ * tests/check/elements/audioresample.c: (alloc_only_48000),
+ (GST_START_TEST), (audioresample_suite):
+ Add unit test for the recent basetransform bugfix, where upstream
+ changes caps to something that can't be passed through anymore.
+
+2008-05-07 19:50:27 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ win32/common/config.h.in: Don't define GST_FUNCTION, if GLib supports MSVC we'd much rather use the real thing than h...
+ Original commit message from CVS:
+ * win32/common/config.h.in:
+ Don't define GST_FUNCTION, if GLib supports MSVC we'd much rather
+ use the real thing than having "???" unconditionally.
+
+2008-05-07 15:47:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Report the latency with the new seglatency parameter.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_query):
+ Report the latency with the new seglatency parameter.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_debug_spec_buff), (gst_ring_buffer_parse_caps),
+ (gst_ring_buffer_acquire):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Add new field to the ringbufferspec to specify the expected latency
+ between the underlying device read/write pointer, this is needed
+ when writing sinks that sit a little closer to the hardware.
+ Add some more docs for other fields.
+
+2008-05-07 10:38:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/: Add marshal.list, make it compile and add to cvsignore.
+ Original commit message from CVS:
+ * gst-libs/gst/app/.cvsignore:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstapp-marshal.list:
+ Add marshal.list, make it compile and add to cvsignore.
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_dispose),
+ (gst_app_sink_stop):
+ Small cleanups.
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init),
+ (gst_app_src_init), (gst_app_src_set_property),
+ (gst_app_src_get_property), (gst_app_src_unlock),
+ (gst_app_src_unlock_stop), (gst_app_src_start), (gst_app_src_stop),
+ (gst_app_src_create), (gst_app_src_set_caps),
+ (gst_app_src_get_caps), (gst_app_src_set_size),
+ (gst_app_src_get_size), (gst_app_src_set_seekable),
+ (gst_app_src_get_seekable), (gst_app_src_set_max_buffers),
+ (gst_app_src_get_max_buffers), (gst_app_src_push_buffer),
+ (gst_app_src_end_of_stream):
+ * gst-libs/gst/app/gstappsrc.h:
+ Beat appsrc in shape, add signals and actions.
+ Add some docs.
+ Add properties for caps, size, seekability and max-buffers.
+ Fix unlock/stop code.
+
+2008-05-06 12:35:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/volume/gstvolume.c: Return NOT_NEGOTIATED if we didn't set a process function yet for some reason instead of cras...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_transform_ip):
+ Return NOT_NEGOTIATED if we didn't set a process function yet for some
+ reason instead of crashing later. Might fix bug #509125.
+
+2008-05-06 12:12:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ gst/audioconvert/: Add support for more than 8 channels and NONE channel layouts. For more than 8 channels no channel...
+ Original commit message from CVS:
+ Based on a patch by: Tim-Philipp Müller <tim.muller at collabora co uk>
+ * gst/audioconvert/audioconvert.c: (audio_convert_prepare_context):
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_parse_caps),
+ (structure_has_fixed_channel_positions),
+ (gst_audio_convert_transform_caps):
+ * gst/audioconvert/gstchannelmix.c: (gst_channel_mix_fill_matrix):
+ Add support for more than 8 channels and NONE channel layouts. For
+ more than 8 channels no channel conversion is supported yet, only
+ format conversions are supported. Fixes bug #398033.
+ * tests/check/elements/audioconvert.c: (verify_convert),
+ (GST_START_TEST), (audioconvert_suite):
+ Add some unit tests by Tim for checking the NONE channel layouts
+ and more than 8 channels and add some more unit tests for channel
+ conversions.
+
+2008-05-06 10:16:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: When autoplugging fails, set the element back to NULL before unreffing it.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (connect_pad):
+ When autoplugging fails, set the element back to NULL before
+ unreffing it.
+
+2008-05-06 09:59:43 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstaudio.def: Add gst_base_audio_src_[sg]et_slave_method() to the exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ Add gst_base_audio_src_[sg]et_slave_method() to the exported
+ symbols.
+
+2008-05-05 12:33:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/subparse/samiparse.c: Remove trailing, leading and double whitespaces.
+ Original commit message from CVS:
+ * gst/subparse/samiparse.c: (handle_start_sync),
+ (end_sami_element), (characters_sami):
+ Remove trailing, leading and double whitespaces.
+ Correctly timestamp buffers and output the last buffer too.
+ * tests/check/elements/subparse.c: (GST_START_TEST),
+ (subparse_suite):
+ Add a simple unit test for SAMI parsing.
+
+2008-05-05 11:14:48 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: Only output characters inside the "sync" elements. There could be other elements like "styl...
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian dot net>
+ * gst/subparse/samiparse.c: (handle_start_sync),
+ (start_sami_element), (end_sami_element), (characters_sami),
+ (sami_context_reset):
+ Only output characters inside the "sync" elements. There could be
+ other elements like "style" that have some content but should
+ not be printed. Fixes bug #467911.
+
+2008-05-05 10:27:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.*: Start some docs.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init),
+ (gst_app_sink_init), (gst_app_sink_set_property),
+ (gst_app_sink_get_property), (gst_app_sink_unlock_start),
+ (gst_app_sink_unlock_stop), (gst_app_sink_flush_unlocked),
+ (gst_app_sink_start), (gst_app_sink_stop), (gst_app_sink_event),
+ (gst_app_sink_preroll), (gst_app_sink_render),
+ (gst_app_sink_set_caps), (gst_app_sink_set_drop),
+ (gst_app_sink_get_drop):
+ * gst-libs/gst/app/gstappsink.h:
+ Start some docs.
+ Add property to drop buffers when the queue is filled
+ Fix unlocking and flushing when the queues are filled.
+
+2008-05-05 10:03:51 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/playback/: Allow setting -1 as current-audio to mute the current audio stream, similar to what is done for subtit...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (set_audio_mute),
+ (set_active_source):
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init),
+ (playbin_set_audio_mute):
+ Allow setting -1 as current-audio to mute the current audio stream,
+ similar to what is done for subtitles. Fixes bug #342294.
+
+2008-05-05 07:41:03 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/pbutils/descriptions.c: It's SorensOn and not SorensEn.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (formats):
+ It's SorensOn and not SorensEn.
+
+2008-05-04 15:23:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Fix description of video/x-flash-video.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (formats):
+ Fix description of video/x-flash-video.
+
+2008-05-04 15:02:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Remove some unused code.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func):
+ * gst-libs/gst/audio/gstaudiosrc.c: (audioringbuffer_thread_func):
+ * gst/tcp/gsttcp.c: (gst_tcp_socket_write):
+ * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_get_fps_list):
+ Remove some unused code.
+ * gst/audioconvert/gstaudioquantize.c:
+ (gst_audio_quantize_free_noise_shaping):
+ Don't return before freeing the noise shaping history.
+
+2008-05-03 16:00:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/subparse.c: Add unit test for the tmplayer variant from bug #530962.
+ Original commit message from CVS:
+ * tests/check/elements/subparse.c: (do_test),
+ (test_tmplayer_style3b), (subparse_suite):
+ Add unit test for the tmplayer variant from bug #530962.
+
+2008-05-03 15:45:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/: Fix parsing of tmplayer subtitle variant where every single line contains text and there isn't an empt...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (handle_buffer),
+ (gst_sub_parse_sink_event):
+ * gst/subparse/tmplayerparse.c: (tmplayer_process_buffer),
+ (tmplayer_parse_line):
+ Fix parsing of tmplayer subtitle variant where every single line contains
+ text and there isn't an empty line after each line to determine the
+ duration (#530962). Improve EOS handling for tmplayer subtitles a bit by
+ making sure that we push out the last line of text without a duration if
+ there's still text left in the buffer at the end.
+
+2008-05-03 15:39:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Fix detection of discontinuities based on the buffer offset (doesn't work so well if no b...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (feed_textbuf):
+ Fix detection of discontinuities based on the buffer offset (doesn't work
+ so well if no buffer offset is set) and also check for the DISCONT buffer
+ flag. This keeps the parser state from being reset after each buffer in
+ the unit test.
+
+2008-05-03 12:09:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Further fine-tuning: don't absolutely require sequence or GOP headers but adjust...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg_video_stream_type_find):
+ Further fine-tuning: don't absolutely require sequence or GOP headers
+ (as introduced in the previous commit), but adjust the typefind
+ probabilities returned accordingly if we don't see them. Also make sure
+ picture header and first slice are somewhat close to each other (which
+ is not perfect but still better than requiring a fixed offset or having
+ no limit at all).
+
+2008-05-02 12:13:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Rename the setcaps/getcaps function internally to make it clear that they are c...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_init),
+ (gst_basertppayload_sink_setcaps),
+ (gst_basertppayload_sink_getcaps):
+ Rename the setcaps/getcaps function internally to make it clear that
+ they are called for the sink pad.
+
+2008-05-02 12:11:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Catch packet-lost events from the jitterbuffer and convert them into a vmetho...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_class_init),
+ (gst_base_rtp_depayload_handle_sink_event), (create_segment_event),
+ (gst_base_rtp_depayload_packet_lost),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Catch packet-lost events from the jitterbuffer and convert them into a
+ vmethod call (lost-packet) so that depayloaders can do something smart.
+ Also add a default packet-lost function that sends out a segment update
+ to the decoders.
+
+2008-05-02 11:13:05 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/: Also include config.h when relying on defines from it. Fixes the build. Its been a please to serve :)
+ Original commit message from CVS:
+ * gst/playback/test4.c:
+ * gst/playback/test5.c:
+ * gst/playback/test6.c:
+ * gst/playback/test7.c:
+ Also include config.h when relying on defines from it. Fixes the
+ build. Its been a please to serve :)
+
+2008-05-02 10:54:51 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * ChangeLog:
+ * gst/videotestsrc/videotestsrc.c:
+ Add support for NV12 and NV21 in videotestsrc
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c (paint_setup_NV12),
+ (paint_setup_NV21), (paint_hline_NV12_NV21):
+ Add support for NV12 and NV21 in videotestsrc
+
+2008-05-02 10:02:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/videoscale/: Support 1x1 images as input and output as for example the BBC HQ new streams have 1x1 GIFs in the pl...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/vs_4tap.c: (vs_image_scale_4tap_Y):
+ * gst/videoscale/vs_image.c: (vs_image_scale_nearest_RGBA),
+ (vs_image_scale_linear_RGBA), (vs_image_scale_nearest_RGB),
+ (vs_image_scale_linear_RGB), (vs_image_scale_nearest_YUYV),
+ (vs_image_scale_linear_YUYV), (vs_image_scale_nearest_UYVY),
+ (vs_image_scale_linear_UYVY), (vs_image_scale_nearest_Y),
+ (vs_image_scale_linear_Y), (vs_image_scale_nearest_RGB565),
+ (vs_image_scale_linear_RGB565), (vs_image_scale_nearest_RGB555),
+ (vs_image_scale_linear_RGB555):
+ Support 1x1 images as input and output as for example the BBC HQ new
+ streams have 1x1 GIFs in the playlists for some reason.
+
+2008-05-01 19:11:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: If we can't activate one of the decoders we plugged in (such as, say, musepackdec) for s...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (free_pad_probe_for_element),
+ (try_to_link_1):
+ If we can't activate one of the decoders we plugged in (such as,
+ say, musepackdec) for some reason (it might not support push mode,
+ for example), remove any pad probes that close_pad_link() might
+ have set up. This makes sure we later don't try to remove a probe
+ for a pad that doesn't exist any longer, and avoids nast warnings
+ and probably other things too.
+
+2008-04-30 20:54:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Rework mpeg video stream typefinding a bit more: make sure sequence,
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ (mpeg_video_stream_ctx_ensure_data), (mpeg_video_stream_type_find),
+ (plugin_init):
+ Rework mpeg video stream typefinding a bit more: make sure sequence,
+ GOP, picture and slice headers appear in the order they should and
+ that we've in fact at least had one of each; fix picture header
+ detection; decouple picture and slice header check - don't assume
+ they're at a fixed offset, there may be extra data in between. Also,
+ announce varying degrees of probability depending on what we found
+ exactly (multiple pictures, at least one picture, just sequence and
+ GOP headers). Finally, in _ensure_data(), take into account that we
+ might be typefinding smaller amounts of data, such as the first
+ buffer of a stream, so fall back to the minimum size needed as long
+ as that's available, instead of erroring out if there's less than
+ 2kB of data. Fixes #526173. Conveniently also doesn't recognise the
+ fuzzed file from #399342 as valid.
+
+2008-04-30 17:06:45 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Cool kids don't divide by zero.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c:
+ Cool kids don't divide by zero.
+ Treat PAR of x:0 as 1:1.
+ Fixes #530719.
+
+2008-04-30 14:37:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Refactor a bit: use context structure to track parsing offset and size of availa...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (MpegVideoStreamCtx),
+ (mpeg_video_stream_ctx_advance), (mpeg_video_stream_ctx_ensure_data),
+ (mpeg_video_stream_type_find):
+ Refactor a bit: use context structure to track parsing offset and size of
+ available data and make the code a bit clearer. Fixes bad memory access
+ in #356937.
+
+2008-04-28 22:18:49 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: Include stdlib.h and unistd.h only if the appropriate HAVE_*_H macro is defined.
+ Original commit message from CVS:
+ * gst/playback/test4.c:
+ * gst/playback/test5.c:
+ * gst/playback/test6.c:
+ * gst/tcp/gstmultifdsink.c:
+ Include stdlib.h and unistd.h only if the appropriate HAVE_*_H macro
+ is defined.
+
+2008-04-28 08:51:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.h: Clarify some docs.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Clarify some docs.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (slave_method_get_type),
+ (gst_base_audio_src_class_init), (gst_base_audio_src_init),
+ (gst_base_audio_src_set_slave_method),
+ (gst_base_audio_src_get_slave_method),
+ (gst_base_audio_src_set_property),
+ (gst_base_audio_src_get_property), (gst_base_audio_src_create):
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ Add property and methods for selecting the clock slave method in the
+ source, like in the sink.
+ We only implement "none" and "re-timestamp" for now.
+ API: gst_base_audio_src_set_slave_method()
+ API: gst_base_audio_src_get_slave_method()
+
+2008-04-25 18:18:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.*: Add more docs.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init),
+ (gst_app_sink_init), (gst_app_sink_set_property),
+ (gst_app_sink_get_property), (gst_app_sink_event),
+ (gst_app_sink_preroll), (gst_app_sink_render),
+ (gst_app_sink_set_emit_signals), (gst_app_sink_get_emit_signals),
+ (gst_app_sink_set_max_buffers), (gst_app_sink_get_max_buffers),
+ (gst_app_sink_pull_buffer):
+ * gst-libs/gst/app/gstappsink.h:
+ Add more docs.
+ Add signals for when preroll and render buffers are available.
+ Add property to control signal emission.
+ Add property to control the max queue size.
+
+2008-04-25 07:37:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Fix the docs about the seqnum compare function, it returns a difference.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ Fix the docs about the seqnum compare function, it returns a difference.
+
+2008-04-24 09:27:35 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/alsa/gstalsadeviceprobe.c: Don't return before freeing up the allocated structures.
+ Original commit message from CVS:
+ * ext/alsa/gstalsadeviceprobe.c:
+ (gst_alsa_get_device_list): Don't return before freeing up
+ the allocated structures.
+
+2008-04-24 08:19:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstplaybin.c: Remove obsolete streaminfo code and fix a leak. Fixes #529546
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c:
+ Remove obsolete streaminfo code and fix a leak. Fixes #529546
+
+2008-04-23 13:50:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/ogg/gstoggdemux.c: Revert the event part, that should not go in.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c:
+ Revert the event part, that should not go in.
+
+2008-04-23 13:45:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/ogg/gstoggdemux.c: Don't leak GstPluginFeatures when filtering.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c:
+ Don't leak GstPluginFeatures when filtering.
+
+2008-04-23 08:58:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Add some logging for cases when grabbing the xv failed.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Add some logging for cases when grabbing the xv failed.
+
+2008-04-22 06:18:04 +0000 David Schleef <ds@schleef.org>
+
+ ext/ogg/gstoggmux.c: Update Ogg/Dirac muxing. Removes the weird "KW-DIRAC" bos packet. Should conform to what we cu...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ Update Ogg/Dirac muxing. Removes the weird "KW-DIRAC" bos
+ packet. Should conform to what we currently think is the
+ final Ogg/Dirac muxing spec.
+
+2008-04-22 06:13:43 +0000 David Schleef <ds@schleef.org>
+
+ sys/xvimage/xvimagesink.c: Fix typo that causes the overlay keying color to bright green on a 16-bit display. Dark g...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Fix typo that causes the overlay keying color to bright green
+ on a 16-bit display. Dark grey good. Bright green bad.
+
+2008-04-21 13:47:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/gnomevfs/gstgnomevfsuri.c: Add FIXME comment about using uri-list for source and sink.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfsuri.c:
+ Add FIXME comment about using uri-list for source and sink.
+
+2008-04-20 11:42:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/ogg/gstogmparse.c: GST_TYPE_FRACTION contains gints so correctly cast gint64 arguments to vaargs functions to gin...
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_stream_header):
+ GST_TYPE_FRACTION contains gints so correctly cast gint64 arguments to
+ vaargs functions to gint. Otherwise the fractions will get 0 set
+ instead of the correct value on big endian systems. Fixes bug #529018.
+
+2008-04-20 10:17:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gnomevfs/: Get the list of supported URI schemes in a threadsafe way and use the same list for the source and sink.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ (gst_gnome_vfs_sink_uri_get_protocols):
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ (gst_gnome_vfs_src_uri_get_protocols):
+ * ext/gnomevfs/gstgnomevfsuri.c: (_internal_get_supported_uris),
+ (gst_gnomevfs_get_supported_uris):
+ Get the list of supported URI schemes in a threadsafe way and use the
+ same list for the source and sink.
+
+2008-04-20 10:11:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Don't generate a new supported protocols list on each call but cache it. It's supposed to be static...
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (_internal_get_supported_protocols),
+ (gst_gio_get_supported_protocols):
+ Don't generate a new supported protocols list on each call but cache
+ it. It's supposed to be static anyway, this way we only leak it once
+ per process.
+ * ext/gio/gstgiosink.c: (gst_gio_sink_base_init),
+ (gst_gio_sink_class_init), (gst_gio_sink_finalize),
+ (gst_gio_sink_set_property), (gst_gio_sink_get_property),
+ (gst_gio_sink_start):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.c: (gst_gio_src_base_init),
+ (gst_gio_src_class_init), (gst_gio_src_finalize),
+ (gst_gio_src_set_property), (gst_gio_src_get_property),
+ (gst_gio_src_start):
+ * ext/gio/gstgiosrc.h:
+ API: Add "file" properties where one can set a GFile as source/destination.
+ Add locking to the properties and use gst_element_class_set_details_simple()
+ instead of a static GstElementDetails struct.
+
+2008-04-19 20:06:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add "mpp" and "mp+" as possible extensions for MusePack files.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (musepack_type_find),
+ (plugin_init):
+ Add "mpp" and "mp+" as possible extensions for MusePack files.
+ Add typefinding for MusePack StreamVersion 8 files and include the
+ stream version in the caps.
+
+2008-04-19 16:33:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/rtp/gstrtppayloads.c: Use g_ascii_strcasecmp() instead of the deprecated g_strcasecmp().
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtppayloads.c:
+ (gst_rtp_payload_info_for_name):
+ Use g_ascii_strcasecmp() instead of the deprecated g_strcasecmp().
+
+2008-04-18 17:10:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Bump Gtk+ requirement to 2.12.0 for gtk_range_set_fill_level (NB: this only affects compilation of some...
+ Original commit message from CVS:
+ * configure.ac:
+ Bump Gtk+ requirement to 2.12.0 for gtk_range_set_fill_level
+ (NB: this only affects compilation of some of the examples).
+ Remove some configure.ac cruft that's not needed any longer.
+
+2008-04-18 14:54:01 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gdp/gstgdpdepay.c: Don't validate the payload if there isn't any.
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain):
+ Don't validate the payload if there isn't any.
+ Fixes #525915
+
+2008-04-17 07:33:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/gstringbuffer.c: Use g_atomic_int_set() instead of gst_atomic_int_set().
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_may_start):
+ Use g_atomic_int_set() instead of gst_atomic_int_set().
+
+2008-04-17 07:29:28 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Return NULL instead of a gchar * array with one NULL element if we don't get any supported URI sche...
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (gst_gio_get_supported_protocols):
+ Return NULL instead of a gchar * array with one NULL element if we
+ don't get any supported URI schemes from GIO.
+
+2008-04-15 19:06:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Remove cpp style commented old code.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ Remove cpp style commented old code.
+
+2008-04-15 19:02:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstdecodebin2.c: Fix signal docs.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ Fix signal docs.
+
+2008-04-14 17:58:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Fix textoverlay unit test again by making the supposed default value for the wait-text pr...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init),
+ (gst_text_overlay_init):
+ Fix textoverlay unit test again by making the supposed default
+ value for the wait-text property the actual default value.
+ Also fix Since: tag for new property.
+
+2008-04-11 17:13:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/video/video.c: Add guards to these functions to ensure sane input values.
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: (gst_video_format_new_caps),
+ (gst_video_format_to_fourcc), (gst_video_format_get_row_stride),
+ (gst_video_format_get_pixel_stride),
+ (gst_video_format_get_component_width),
+ (gst_video_format_get_component_height),
+ (gst_video_format_get_component_offset), (gst_video_format_get_size),
+ (gst_video_format_convert):
+ Add guards to these functions to ensure sane input values.
+ * tests/check/libs/video.c:
+ Fix unit test not to create caps with width=0 and height=0.
+
+2008-04-11 01:25:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-keyframe-force.txt: Fix typo.
+ Original commit message from CVS:
+ * docs/design/draft-keyframe-force.txt:
+ Fix typo.
+ * gst/playback/gstqueue2.c: (update_buffering),
+ (gst_queue_handle_src_query):
+ Set buffering mode in the messages.
+ Set buffering percent in the query.
+ * tests/examples/seek/seek.c: (update_fill), (msg_state_changed),
+ (do_stream_buffering), (do_download_buffering), (msg_buffering):
+ Do some more fancy things based on the buffering method in use.
+
+2008-04-09 21:42:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add basic download reports to seek using the new buffering API.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (update_fill), (set_update_fill),
+ (play_cb), (pause_cb), (stop_cb), (msg_state_changed),
+ (msg_buffering), (main):
+ Add basic download reports to seek using the new buffering API.
+
+2008-04-09 21:40:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Include extra buffering stats in the buffering message.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (update_buffering),
+ (gst_queue_close_temp_location_file), (gst_queue_handle_src_query),
+ (gst_queue_src_checkgetrange_function):
+ Include extra buffering stats in the buffering message.
+ Implement BUFFERING query.
+ * gst/playback/gsturidecodebin.c: (do_async_start),
+ (do_async_done), (type_found), (setup_streaming), (setup_source),
+ (gst_uri_decode_bin_change_state):
+ Only add decodebin2 when the type is found in streaming mode.
+ Make uridecodebin async to PAUSED even when we don't have decodebin2
+ added yet.
+
+2008-04-09 08:38:19 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Filter cdda from the supported URI schemes. We can't support musicbrainz tags and everything else o...
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (gst_gio_get_supported_protocols):
+ Filter cdda from the supported URI schemes. We can't support
+ musicbrainz tags and everything else one expects from a cdda source
+ with GIO. Fixes bug #526794.
+
+2008-04-07 22:37:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * sys/xvimage/xvimagesink.c:
+ Fix calculation of 'expected size' for YV12 buffers.
+ Original commit message from CVS:
+ 2008-04-07 Jan Schmidt <jan.schmidt@sun.com>
+ * sys/xvimage/xvimagesink.c (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_buffer_alloc):
+ Fix calculation of 'expected size' for YV12 buffers.
+ Be a little more verbose in the debug output for buffer-alloc'ed
+ buffers which turn out to have the wrong size.
+
+2008-04-07 22:26:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Fix calculation of 'expected size' for YV12 buffers.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_buffer_alloc):
+ Fix calculation of 'expected size' for YV12 buffers.
+ Be a little more verbose in the debug output for buffer-alloc'ed
+ buffers which turn out to have the wrong size.
+
+2008-04-07 10:50:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Merge other changes from 0.10.19 release branch.
+ Original commit message from CVS:
+ * NEWS:
+ * RELEASE:
+ * gst-plugins-base.doap:
+ Merge other changes from 0.10.19 release branch.
+
+2008-04-06 20:16:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Work around missing bits of thread-safety on older GLibs some more to avoid assertions when starting up multipl...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init):
+ * gst/playback/gstplayback.c: (plugin_init):
+ * gst/volume/gstvolume.c: (plugin_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-04-06 17:19:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/missing-plugins.c: Remove some more fields.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/missing-plugins.c: (copy_and_clean_caps):
+ Remove some more fields.
+
+2008-04-06 08:56:07 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ configure.ac: Actually build dlls when cross-compiling with mingw32.
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
+ * configure.ac:
+ Actually build dlls when cross-compiling with mingw32.
+ Fixes bug #526247.
+
+2008-04-03 23:01:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Bump version to 0.10.19.1 after the unplanned 0.10.19 release.
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version to 0.10.19.1 after the unplanned 0.10.19 release.
+
+2008-04-03 16:10:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add statusbar.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (play_cb), (pause_cb), (stop_cb),
+ (msg_buffering), (connect_bus_signals), (main):
+ Add statusbar.
+ Add buffering support with feedback in the statusbar.
+
+2008-04-03 15:58:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggmux.c: Fix sample pipeline description.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ Fix sample pipeline description.
+
+2008-04-03 14:58:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/plugins/: Add playbin, playbin2, decodebin, decodebin2, uridecodebin and oggmux
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-overrides.txt:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ Add playbin, playbin2, decodebin, decodebin2, uridecodebin and oggmux
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Update introspection data.
+ * ext/ogg/gstoggmux.c:
+ Document oggmux.
+ * gst/playback/gstdecodebin2.c:
+ Don't use gtk-doc style comment start for private stuff, but make it
+ formatted like this for consistency.
+
+2008-04-03 12:16:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Remove fakesink hack, we can now implement this more elegantly.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
+ (gst_decode_bin_init), (gst_decode_bin_dispose),
+ (gst_decode_bin_set_sink_caps), (gst_decode_bin_get_sink_caps),
+ (gst_decode_bin_set_property), (gst_decode_bin_get_property),
+ (analyze_new_pad), (connect_pad), (expose_pad),
+ (gst_decode_group_new), (gst_decode_group_control_demuxer_pad),
+ (gst_decode_group_expose), (gst_decode_group_free),
+ (do_async_start), (do_async_done), (gst_decode_bin_change_state):
+ Remove fakesink hack, we can now implement this more elegantly.
+ Added property to bypass typefinding.
+ Removed underrun callback and demuxer pad probe, we now use the srcpad
+ probe to expose groups.
+ API::sink-caps property
+ * gst/playback/gstplaybin2.c: (no_more_pads_cb):
+ Guard against multiple emissions of the no_more_pads signal, which
+ happens when we are dealing with chained oggs.
+ * gst/playback/gsturidecodebin.c: (remove_decoders),
+ (make_decoder), (type_found), (setup_streaming), (source_new_pad),
+ (setup_source):
+ For streams, use our own typefind element and plug our queue after it.
+ We will need this to determine the type of buffering to use for the
+ queue soon.
+
+2008-04-03 10:37:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Guard against over and underflows because of clock slaving.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_skew_slaving), (gst_base_audio_sink_render):
+ Guard against over and underflows because of clock slaving.
+ When we are using our own clock, still compensate for any calibrations
+ that we might have done to our clock.
+
+2008-04-03 10:22:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Don't try to do anything fancy with the return code from pushing an event, it does not have e...
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_handle_type_packet),
+ (theora_dec_chain):
+ Don't try to do anything fancy with the return code from pushing an
+ event, it does not have enough information to turn it into a
+ GST_FLOW_ERROR.
+
+2008-04-03 10:19:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Add small debug line.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_reset),
+ (gst_ogg_demux_chain_elem_pad):
+ Add small debug line.
+ Pass return code from the internal decoder instead of the too generic
+ GST_FLOW_ERROR.
+
+2008-04-03 06:39:27 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/cdda/: Use GLib's base64 implementation instead of our own.
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/cdda/base64.c:
+ * gst-libs/gst/cdda/base64.h:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cddabasesrc_calculate_musicbrainz_discid):
+ Use GLib's base64 implementation instead of our own.
+
+2008-04-02 15:41:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Refix oggdemux, we only have a problem if we failed to find a chain and we are not EOF.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_activate_chain),
+ (gst_ogg_demux_read_chain):
+ Refix oggdemux, we only have a problem if we failed to find a chain and
+ we are not EOF.
+
+2008-04-02 15:07:01 +0000 Victor STINNER <victor.stinner@haypocalc.com>
+
+ ext/ogg/gstoggdemux.c: When we fail to find a BOS page and we and up with no chain, error out properly instead of seg...
+ Original commit message from CVS:
+ Patch by: Victor STINNER <victor dot stinner at haypocalc dot com>
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_activate_chain),
+ (gst_ogg_demux_read_chain):
+ When we fail to find a BOS page and we and up with no chain, error out
+ properly instead of segfaulting. Fixes #525665.
+
+2008-04-02 14:58:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: The new-pad-group sequence is add-pads, no-more-pads, add-pads, no-more-pads...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_activate_chain),
+ (gst_ogg_demux_read_chain), (gst_ogg_demux_handle_page):
+ The new-pad-group sequence is add-pads, no-more-pads, add-pads,
+ no-more-pads...
+
+2008-04-02 11:08:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Update the estimated input data when we push out a buffer.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (update_out_rates),
+ (gst_queue_open_temp_location_file),
+ (gst_queue_close_temp_location_file), (gst_queue_handle_src_event),
+ (gst_queue_handle_src_query), (gst_queue_set_property):
+ Update the estimated input data when we push out a buffer.
+ Add some debug info about the temp file.
+ Only forward src events when we are not using a temp file.
+ Don't block the duration query, we need to find something better.
+ Don't leak the temp filename.
+
+2008-04-01 14:01:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Require GLib 2.12 and liboil 0.3.14.
+ Original commit message from CVS:
+ * configure.ac:
+ Require GLib 2.12 and liboil 0.3.14.
+ * gst/volume/gstvolume.c: (volume_process_double):
+ Unconditionally use liboil 0.3.14 function.
+
+2008-03-31 16:08:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: ms-gsm can have arbitrarty sample rates. See #481354.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ ms-gsm can have arbitrarty sample rates. See #481354.
+
+2008-03-28 16:22:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: MP4S is generic MPEG-4, not a microsoft variant.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ MP4S is generic MPEG-4, not a microsoft variant.
+
+2008-03-27 15:26:38 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gdp/gstgdpdepay.c: Check the body CRC (if set) when depayloading.
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain):
+ Check the body CRC (if set) when depayloading.
+ Fixes #522401.
+
+2008-03-24 17:45:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Fix Since: version for new property.
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init):
+ Fix Since: version for new property.
+
+2008-03-24 16:40:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Don't error when poll_wait returns EAGAIN.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect), (gst_rtsp_connection_write),
+ (gst_rtsp_connection_read_internal), (gst_rtsp_connection_poll):
+ Don't error when poll_wait returns EAGAIN.
+
+2008-03-24 14:08:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: The queue is never filled when there are no buffers in the queue at all.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_is_filled):
+ The queue is never filled when there are no buffers in the queue at all.
+ Fixes #523993.
+
+2008-03-24 12:26:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Update some docs.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (init_group), (free_group), (gst_play_bin_init),
+ (gst_play_bin_finalize), (gst_play_bin_set_uri),
+ (gst_play_bin_set_suburi), (gst_play_bin_get_video_tags),
+ (gst_play_bin_get_audio_tags), (gst_play_bin_get_text_tags),
+ (gst_play_bin_set_current_video_stream),
+ (gst_play_bin_set_current_audio_stream),
+ (gst_play_bin_set_current_text_stream),
+ (gst_play_bin_set_encoding), (gst_play_bin_set_property),
+ (gst_play_bin_get_property), (pad_added_cb), (pad_removed_cb),
+ (no_more_pads_cb), (perform_eos), (autoplug_select_cb),
+ (activate_group), (deactivate_group), (setup_next_source),
+ (save_current_group), (gst_play_bin_change_state):
+ Update some docs.
+ Add new locks and conds to protect pipeline creation and group
+ switching.
+ Implement the sub-uri property.
+ Keep track of pending uridecodebin creation and configure the output
+ pipeline after all streams are configured.
+ Propagate subtitle encoding to the uridecodebins.
+ Implement getting the video/audio/visualisation elements.
+ Use input-selector for stream switching.
+ If we are asked to do visualisation, prefer to autoplug raw sinks
+ instead of sinks that accept encoded data.
+
+2008-03-24 12:15:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.*: Add methods to get audio/video/vis elements.
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gst_play_sink_class_init),
+ (gst_play_sink_init), (gst_play_sink_dispose),
+ (gst_play_sink_set_video_sink), (gst_play_sink_get_video_sink),
+ (gst_play_sink_set_audio_sink), (gst_play_sink_get_audio_sink),
+ (gst_play_sink_vis_unblocked), (gst_play_sink_vis_blocked),
+ (gst_play_sink_set_vis_plugin), (gst_play_sink_get_vis_plugin),
+ (gst_play_sink_set_volume), (gst_play_sink_get_volume),
+ (gst_play_sink_set_mute), (gen_video_chain), (gen_text_chain),
+ (gen_audio_chain), (gen_vis_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_set_font_desc), (gst_play_sink_get_font_desc),
+ (gst_play_sink_send_event_to_sink), (gst_play_sink_change_state):
+ * gst/playback/gstplaysink.h:
+ Add methods to get audio/video/vis elements.
+ Add methods to set the font description for the overlay.
+ Remove properties, we're using this element with its methods only.
+ Add support for subtitles.
+ Rearrange the locking a bit to not use the object lock for protecting
+ the pipeline construction.
+ Try to use the volume and mute property on the sink when its available.
+ Implement the mute option with volume when the sink does not have a mute
+ property.
+ Only add volume element when the sink has no volume property.
+ Only do visualisations with raw audio pads.
+
+2008-03-24 12:03:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/pango/gsttextoverlay.*: Add property to configure waiting for text on the textpad or not, with the default behavi...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init),
+ (gst_text_overlay_init), (gst_text_overlay_set_property),
+ (gst_text_overlay_get_property), (gst_text_overlay_src_event),
+ (gst_text_overlay_text_event), (gst_text_overlay_video_event),
+ (gst_text_overlay_text_chain), (gst_text_overlay_video_chain),
+ (gst_text_overlay_change_state):
+ * ext/pango/gsttextoverlay.h:
+ Add property to configure waiting for text on the textpad or not, with
+ the default behaviour being the old one (always wait for text before
+ rendering the video). This default behaviour is usually not the best one
+ because the text stream can very sparse and could require queueing a lot
+ of video.
+ Fix the flushing and EOS handing so that we don't mix up their meaning.
+
+2008-03-24 11:54:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gsturidecodebin.c: Add a readonly source property and notify.
+ Original commit message from CVS:
+ * gst/playback/gsturidecodebin.c:
+ (gst_uri_decode_bin_autoplug_factories),
+ (gst_uri_decode_bin_class_init), (gst_uri_decode_bin_init),
+ (gst_uri_decode_bin_finalize), (gst_uri_decode_bin_set_encoding),
+ (gst_uri_decode_bin_set_property),
+ (gst_uri_decode_bin_get_property), (no_more_pads_full),
+ (new_decoded_pad_cb), (gen_source_element), (remove_decoders),
+ (proxy_autoplug_factories_signal), (make_decoder),
+ (source_new_pad), (setup_source):
+ Add a readonly source property and notify.
+ Add new lock for protecting the construction of the pipeline.
+ Keep track of the decodebins we plugged.
+ Correctly proxy the autoplug signal so that it actually continues.
+ Proxy subtitle-encoding to the decodebins.
+
+2008-03-24 11:46:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Rearrange some buttons in playbin2 and make some other boxes insensitive when needed.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (audio_toggle_cb), (video_toggle_cb),
+ (text_toggle_cb), (update_streams), (main):
+ Rearrange some buttons in playbin2 and make some other boxes insensitive
+ when needed.
+ Add language codes to subtitle selection boxes when we gind the right
+ tags for the streams.
+
+2008-03-24 11:36:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Protect caps property with the object lock.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose),
+ (gst_decode_bin_set_caps), (gst_decode_bin_get_caps),
+ (gst_decode_bin_set_subs_encoding),
+ (gst_decode_bin_get_subs_encoding),
+ (gst_decode_bin_autoplug_factories), (connect_pad), (are_raw_caps),
+ (deactivate_free_recursive):
+ Protect caps property with the object lock.
+ Protect encoding property with the object lock.
+ Keep list of elements we added that have the subtitle-encoding property.
+ Distribute the subtitle-encoding to all of the elements when it
+ changes.
+
+2008-03-24 11:24:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Small debug improvement.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_release):
+ Small debug improvement.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ Fix bug in determining the sample start/stop position, we want to base
+ this decision on the fact that we are going forwards or backwards, not
+ slower or faster. This fixes some ugly resync warnings when playing at
+ very slow speeds.
+
+2008-03-23 13:41:28 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Correctly set the supported URI schemes and don't leave some schemes in the middle or at the start ...
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (gst_gio_get_supported_protocols):
+ Correctly set the supported URI schemes and don't leave
+ some schemes in the middle or at the start at NULL.
+
+2008-03-23 13:12:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/gdpdepay.c: Make test compile without unused function/variable warnings on PPC.
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c:
+ Make test compile without unused function/variable warnings on PPC.
+
+2008-03-22 15:00:53 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory u...
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_class_init):
+ * ext/alsa/gstalsasink.c: (gst_alsasink_class_init):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_class_init):
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ (gst_cd_paranoia_src_class_init):
+ * ext/gio/gstgiosink.c: (gst_gio_sink_class_init):
+ * ext/gio/gstgiosrc.c: (gst_gio_src_class_init):
+ * ext/gio/gstgiostreamsink.c: (gst_gio_stream_sink_class_init):
+ * ext/gio/gstgiostreamsrc.c: (gst_gio_stream_src_class_init):
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init):
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init):
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init):
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init):
+ * ext/pango/gsttextrender.c: (gst_text_render_class_init):
+ * ext/theora/theoradec.c: (gst_theora_dec_class_init):
+ * ext/theora/theoraenc.c: (gst_theora_enc_class_init):
+ * ext/theora/theoraparse.c: (gst_theora_parse_class_init):
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_class_init):
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ (gst_audio_filter_template_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init):
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_class_init):
+ * gst-libs/gst/interfaces/mixertrack.c:
+ (gst_mixer_track_class_init):
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_class_init):
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_class_init):
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_class_init):
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_class_init):
+ * gst/audioresample/gstaudioresample.c:
+ (gst_audioresample_class_init):
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_class_init):
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init):
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (preroll_unlinked):
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init):
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init):
+ * gst/playback/gstplaysink.c: (gst_play_sink_class_init):
+ * gst/playback/gstqueue2.c: (gst_queue_class_init):
+ * gst/playback/gststreaminfo.c: (gst_stream_info_class_init):
+ * gst/playback/gststreamselector.c: (gst_selector_pad_class_init),
+ (gst_stream_selector_class_init):
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init):
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init):
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init):
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_class_init):
+ * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_class_init):
+ * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_class_init):
+ * gst/videorate/gstvideorate.c: (gst_video_rate_class_init):
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init):
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_class_init):
+ * gst/volume/gstvolume.c: (gst_volume_class_init):
+ * sys/v4l/gstv4lelement.c: (gst_v4lelement_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/ximage/ximagesink.c: (gst_ximagesink_class_init):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_class_init):
+ Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use
+ static strings (i.e. all). This gives us less memory usage,
+ fewer allocations and thus less memory defragmentation. Depend
+ on core CVS for this. Fixes bug #523806.
+
+2008-03-22 14:13:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Filter http and https protocols. GIO/GVfs handles them but it's impossible to implement iradio/icec...
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (gst_gio_get_supported_protocols):
+ Filter http and https protocols. GIO/GVfs handles them but it's
+ impossible to implement iradio/icecast with it. Better use
+ souphttpsrc or something else for this.
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_get_size):
+ If getting the file informations by a query fails try it with the
+ seek-to-end trick too.
+
+2008-03-21 16:46:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/volume/gstvolume.c: memset buffers to zero if we get a GAP buffer. We usually see a buffer as one unit so let's h...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (gst_volume_interface_supported),
+ (gst_volume_base_init), (gst_volume_class_init),
+ (volume_process_double), (volume_process_float),
+ (volume_transform_ip), (plugin_init):
+ memset buffers to zero if we get a GAP buffer. We usually see a
+ buffer as one unit so let's handle it as one and don't care about
+ volume changes while processing one buffer.
+ Also clean up some stuff a bit.
+
+2008-03-21 15:58:44 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Make audioconvert GAP-aware by outputting silence buffers when the input has the ...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init),
+ (gst_audio_convert_create_silence_buffer),
+ (gst_audio_convert_transform):
+ Make audioconvert GAP-aware by outputting silence buffers when the
+ input has the GAP flag set. This is up to 8x faster.
+ Based on a patch by Stefan Kost. Fixes bug #517813.
+
+2008-03-21 15:54:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/volume/gstvolume.c: Use oil_scalarmultiply_f64_ns() for double processing when it's available at compile time.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_process_double):
+ Use oil_scalarmultiply_f64_ns() for double processing when it's
+ available at compile time.
+
+2008-03-21 13:27:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Fix lrint/lrintf checks to actually work. These functions are in libm on Linux at least so try to link ...
+ Original commit message from CVS:
+ * configure.ac:
+ Fix lrint/lrintf checks to actually work. These functions are
+ in libm on Linux at least so try to link to it.
+
+2008-03-21 00:36:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to development - 0.10.18.1
+ Original commit message from CVS:
+ * configure.ac:
+ Back to development - 0.10.18.1
+
+=== release 0.10.18 ===
+
+2008-03-21 00:26:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * po/LINGUAS:
+ * win32/common/config.h:
+ Release 0.10.18
+ Original commit message from CVS:
+ Release 0.10.18
+
+2008-03-21 00:16:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/hu.po:
+ * po/it.po:
+ * po/lt.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:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-03-18 12:19:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 0.10.17.4 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ 0.10.17.4 pre-release
+
+2008-03-18 11:20:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Use GST_STR_NULL when trying to print strings that could be NULL because this might...
+ Original commit message from CVS:
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_message_dump):
+ Use GST_STR_NULL when trying to print strings that could be NULL because
+ this might crash on some platforms. See #520808.
+
+2008-03-18 11:10:12 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Generic Windows fixes that makes libgstrtsp work on Windows when coupled with ...
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect), (gst_rtsp_connection_write),
+ (read_line), (gst_rtsp_connection_read_internal):
+ Generic Windows fixes that makes libgstrtsp work on Windows when
+ coupled with the new GstPoll API. See #520808.
+
+2008-03-17 22:06:56 +0000 Milosz Derezynski <internalerror@gmail.com>
+
+ ext/gio/gstgiobasesrc.c: If seeking to a new position succeeds don't simply return from create() without creating a b...
+ Original commit message from CVS:
+ Patch by: Milosz Derezynski <internalerror at gmail dot com>
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_create):
+ If seeking to a new position succeeds don't simply return from
+ create() without creating a buffer. Do this only in the case
+ seeking to the new position fails. Fixes bug #523054.
+
+2008-03-17 10:32:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/video/video.c: Fix gst_video_format_parse_caps() for RGB caps with alpha channel (#522635).
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: (gst_video_format_parse_caps),
+ (gst_video_format_from_rgba32_masks):
+ Fix gst_video_format_parse_caps() for RGB caps with alpha channel
+ (#522635).
+ * tests/check/libs/video.c: (test_parse_caps_rgb), (video_suite):
+ Add unit test for the RGB caps parsing and creation, checking for
+ internal consistency of the new API and consistency of the API with
+ the old GST_VIDEO_CAPS_* defines.
+
+2008-03-14 18:42:35 +0000 David Schleef <ds@schleef.org>
+
+ gst/videotestsrc/videotestsrc.c: Oops, revert last change because -base is in freeze.
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c: Oops, revert last change
+ because -base is in freeze.
+
+2008-03-14 17:33:09 +0000 William M. Brack <wbrack@mmm.hk>
+
+ gst/videotestsrc/videotestsrc.c: Fix Bayer pattern generation.
+ Original commit message from CVS:
+ Patch by: William M. Brack
+ * gst/videotestsrc/videotestsrc.c: Fix Bayer pattern generation.
+
+2008-03-14 09:54:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gststreamselector.*: Revert change that caused regression until a real fix is found.
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c: (gst_selector_pad_event),
+ (gst_selector_pad_chain):
+ * gst/playback/gststreamselector.h:
+ Revert change that caused regression until a real fix is found.
+ Fixes #522203.
+
+2008-03-12 12:39:13 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/audio/gstringbuffer.*: Rename recently added buffer types to make more sense.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_parse_caps):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Rename recently added buffer types to make more sense.
+ * ext/alsa/gstalsasink.c: (alsasink_parse_spec),
+ (gst_alsasink_write):
+ Adapt for above API changes.
+ Fixes bug #520523.
+
+2008-03-11 13:23:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstnetbuffer.def: Add new symbol gst_netaddress_equal. Fixes bug #521743.
+ Original commit message from CVS:
+ * win32/common/libgstnetbuffer.def:
+ Add new symbol gst_netaddress_equal. Fixes bug #521743.
+
+2008-03-11 00:25:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 0.10.17.3 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ 0.10.17.3 pre-release
+
+2008-03-10 17:19:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Fix duration when no clock was provided. Fixes #520300.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Fix duration when no clock was provided. Fixes #520300.
+
+2008-03-07 18:17:44 +0000 Olivier Crete <tester@tester.ca>
+
+ Add trivial function to compare GstNetAddress. See #520626.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester ca>
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/netbuffer/gstnetbuffer.c: (gst_netaddress_equal):
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ Add trivial function to compare GstNetAddress. See #520626.
+ API: GstNetBuffer::gst_netaddress_equal
+
+2008-03-07 16:10:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.c: Update mode property docs, it's deprecated now.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ Update mode property docs, it's deprecated now.
+
+2008-03-07 15:48:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Remove GstPollMode from gstpoll constructor.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_create):
+ * gst/tcp/gstmultifdsink.c: (gst_fdset_mode_get_type),
+ (gst_multi_fd_sink_class_init), (gst_multi_fd_sink_start):
+ * gst/tcp/gstmultifdsink.h:
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_start):
+ * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_start):
+ Remove GstPollMode from gstpoll constructor.
+
+2008-03-04 00:26:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 0.10.17.2 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ 0.10.17.2 pre-release
+
+2008-03-03 23:59:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/Makefile.am: GST_PLUGINS_ALL correctly lists subparse and tcp now, don't distclean them twice
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ GST_PLUGINS_ALL correctly lists subparse and tcp now, don't distclean
+ them twice
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgstrtp.def:
+ Add new API to the defs
+
+2008-03-03 16:11:50 +0000 Mersad Jelacic <mersad@axis.com>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.*: API: add gst_base_rtp_audio_payload_set_samplebits_options() to make it po...
+ Original commit message from CVS:
+ Patch by: Mersad Jelacic <mersad at axis dot com>
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ API: add gst_base_rtp_audio_payload_set_samplebits_options() to make it
+ possible to specify the sample size in bits. (#509637)
+
+2008-03-03 13:59:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/mixer.c: Add a few simple checks for the new message types.
+ Original commit message from CVS:
+ * tests/check/libs/mixer.c:
+ Add a few simple checks for the new message types.
+
+2008-03-03 13:56:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_mixer_options_list_changed(), gst_mixer_mixer_changed() and gst_mixer_message_parse_options_list_changed...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/interfaces/mixer.c: (gst_mixer_option_changed),
+ (gst_mixer_options_list_changed), (gst_mixer_mixer_changed),
+ (gst_mixer_message_get_type),
+ (gst_mixer_message_parse_option_changed),
+ (gst_mixer_message_parse_options_list_changed):
+ * gst-libs/gst/interfaces/mixer.h: (GstMixerType),
+ (GST_MIXER_MESSAGE_OPTION_CHANGED),
+ (GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED),
+ (GST_MIXER_MESSAGE_MIXER_CHANGED):
+ API: add gst_mixer_options_list_changed(), gst_mixer_mixer_changed()
+ and gst_mixer_message_parse_options_list_changed(). Fixes #519916.
+
+2008-03-03 13:50:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixeroptions.*: API: add GstMixerOptions::get_values vfunc (#519906)
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixeroptions.c: (gst_mixer_options_init),
+ (gst_mixer_options_get_values):
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ (GST_MIXER_OPTIONS_GET_CLASS), (GstMixerOptionsClass),
+ (_GstMixerOptions), (_GstMixerOptionsClass):
+ API: add GstMixerOptions::get_values vfunc (#519906)
+
+2008-03-03 12:01:15 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ 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-03-03 06:22:39 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for IMelody files, using audio/x-imelody.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Add typefinder for IMelody files, using audio/x-imelody.
+ See bug #519516.
+
+2008-03-03 06:04:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Correct all relevant warnings found by the sparse semantic code analyzer. This include marking several symbols static...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_get_type):
+ * ext/alsa/gstalsasink.c: (set_hwparams):
+ * ext/alsa/gstalsasrc.c: (set_hwparams):
+ * ext/gio/gstgio.c: (gst_gio_uri_handler_get_uri):
+ * ext/ogg/gstoggmux.h:
+ * ext/ogg/gstogmparse.c:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/fft/kiss_fft_f64.c: (kiss_fft_f64_alloc):
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ (gst_missing_uri_sink_message_new),
+ (gst_missing_element_message_new),
+ (gst_missing_decoder_message_new),
+ (gst_missing_encoder_message_new):
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ (gst_rtcp_packet_bye_get_reason):
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/playback/test.c: (gen_video_element), (gen_audio_element):
+ * gst/typefind/gsttypefindfunctions.c:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ * sys/v4l/gstv4lelement.c:
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_any_caps):
+ * sys/v4l/v4l_calls.c:
+ * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init),
+ (gst_v4lsrc_try_capture):
+ * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls),
+ (gst_ximagesink_ximage_new):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls),
+ (gst_xvimagesink_xvimage_new):
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/audioresample.c:
+ (fail_unless_perfect_stream):
+ * tests/check/elements/audiotestsrc.c: (setup_audiotestsrc):
+ * tests/check/elements/decodebin.c:
+ * tests/check/elements/gdpdepay.c: (setup_gdpdepay),
+ (setup_gdpdepay_streamheader):
+ * tests/check/elements/gdppay.c: (setup_gdppay), (GST_START_TEST),
+ (setup_gdppay_streamheader):
+ * tests/check/elements/gnomevfssink.c: (setup_gnomevfssink):
+ * tests/check/elements/multifdsink.c: (setup_multifdsink):
+ * tests/check/elements/textoverlay.c:
+ * tests/check/elements/videorate.c: (setup_videorate):
+ * tests/check/elements/videotestsrc.c: (setup_videotestsrc):
+ * tests/check/elements/volume.c: (setup_volume):
+ * tests/check/elements/vorbisdec.c: (setup_vorbisdec):
+ * tests/check/elements/vorbistag.c:
+ * tests/check/generic/clock-selection.c:
+ * tests/check/generic/states.c: (setup), (teardown):
+ * tests/check/libs/cddabasesrc.c:
+ * tests/check/libs/video.c:
+ * tests/check/pipelines/gio.c:
+ * tests/check/pipelines/oggmux.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ (simple_launch_lines_suite):
+ * tests/check/pipelines/streamheader.c:
+ * tests/check/pipelines/theoraenc.c:
+ * tests/check/pipelines/vorbisdec.c:
+ * tests/check/pipelines/vorbisenc.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c: (query_positions_elems),
+ (query_positions_pads):
+ * tests/icles/stress-xoverlay.c: (myclock):
+ Correct all relevant warnings found by the sparse semantic code
+ analyzer. This include marking several symbols static, using
+ NULL instead of 0 for pointers and using "foo (void)" instead
+ of "foo ()" for declarations.
+ * win32/common/libgstrtp.def:
+ Add gst_rtp_buffer_set_extension_data to the symbol definition file.
+
+2008-03-02 18:43:15 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ gst/playback/gstplaybin2.c: Make the function signature of the _get_*_tags() functions match the signature of the vfu...
+ Original commit message from CVS:
+ Patch by: José Alburquerque <jaalburqu svn gnome org>
+ * gst/playback/gstplaybin2.c:
+ Make the function signature of the _get_*_tags() functions match
+ the signature of the vfuncs they implement, ie. return a
+ GstTagList rather than a GstStructure, which is more correct,
+ even if one is typedef'ed to the other (#518940).
+
+2008-03-02 18:32:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Don't include unix headers unconditionally (fixes #518037).
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Don't include unix headers unconditionally (fixes #518037).
+
+2008-03-02 18:24:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/video.c: Add unit test that makes sure that the strides, offsets and sizes returned for the various ...
+ Original commit message from CVS:
+ * tests/check/libs/video.c: (paintinfo), (paintinfo_struct),
+ (fourcc_list_struct), (fourcc_list), (fourcc_get_size),
+ (paint_setup_I420), (paint_setup_YV12), (paint_setup_AYUV),
+ (paint_setup_YUY2), (paint_setup_UYVY), (paint_setup_YVYU),
+ (paint_setup_IYU2), (paint_setup_Y41B), (paint_setup_Y42B),
+ (paint_setup_Y800), (paint_setup_YVU9), (paint_setup_YUV9),
+ (gst_video_format_is_packed), (video_format_is_packed):
+ Add unit test that makes sure that the strides, offsets and
+ sizes returned for the various YUV formats by the new video API
+ match the old reference implementation in videotestsrc.
+
+2008-03-02 18:20:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/video/video.*: API: add GST_VIDEO_FORMAT_Y41B and GST_VIDEO_FORMAT_Y42B.
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: (gst_video_calculate_display_ratio),
+ (gst_video_format_from_fourcc), (gst_video_format_to_fourcc),
+ (gst_video_format_is_rgb), (gst_video_format_is_yuv),
+ (gst_video_format_has_alpha), (gst_video_format_get_row_stride),
+ (gst_video_format_get_pixel_stride),
+ (gst_video_format_get_component_width),
+ (gst_video_format_get_component_height),
+ (gst_video_format_get_component_offset), (gst_video_format_get_size):
+ * gst-libs/gst/video/video.h: (GST_VIDEO_FORMAT_Y41B),
+ (GST_VIDEO_FORMAT_Y42B):
+ API: add GST_VIDEO_FORMAT_Y41B and GST_VIDEO_FORMAT_Y42B.
+
+2008-03-02 18:07:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/video/video.c: YV12 is I420 with swapped components 1 and 2, so the offset of component 1 for I420 shoul...
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c: (gst_video_format_get_component_offset):
+ YV12 is I420 with swapped components 1 and 2, so the offset of
+ component 1 for I420 should be the offset for component 2 for YV12
+ and vice versa.
+
+2008-02-29 21:48:00 +0000 Rene Stadler <mail@renestadler.de>
+
+ sys/v4l/gstv4lelement.c: Add missing semicolon to fix indentation.
+ Original commit message from CVS:
+ * sys/v4l/gstv4lelement.c:
+ Add missing semicolon to fix indentation.
+
+2008-02-29 18:44:36 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/alsa/gstalsa.c: Probe for IEC958 pcm to detect if we can do SPDIF output.
+ Original commit message from CVS:
+ 2008-02-29 Julien Moutte <julien@fluendo.com>
+ * ext/alsa/gstalsa.c: (gst_alsa_open_iec958_pcm),
+ (gst_alsa_probe_supported_formats): Probe for IEC958 pcm to
+ detect
+ if we can do SPDIF output.
+ * ext/alsa/gstalsa.h:
+ * ext/alsa/gstalsasink.c: (set_hwparams), (alsasink_parse_spec),
+ (gst_alsasink_prepare), (gst_alsasink_close),
+ (gst_alsasink_write):
+ * ext/alsa/gstalsasink.h: Initial support for SPDIF.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_parse_caps):
+ * gst-libs/gst/audio/gstringbuffer.h: Add non linear buffer
+ types
+ to support AC3, EC3 and IEC958 buffers.
+
+2008-02-29 17:59:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixer.c: De-cruft and fix message type assertions (NULL is not a really valid mixer message t...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixer.c: (GST_MIXER_MESSAGE_HAS_TYPE),
+ (gst_mixer_message_parse_mute_toggled),
+ (gst_mixer_message_parse_record_toggled),
+ (gst_mixer_message_parse_volume_changed),
+ (gst_mixer_message_parse_option_changed):
+ De-cruft and fix message type assertions (NULL is not a really
+ valid mixer message type string).
+
+2008-02-29 14:52:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: When negotiating, actually start from a format that we can support instead of from the too ge...
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_vis_src_negotiate):
+ When negotiating, actually start from a format that we can support
+ instead of from the too generic template.
+
+2008-02-29 12:26:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Enable vis setting.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_set_property):
+ Enable vis setting.
+ * gst/playback/gstplaysink.c: (gst_play_sink_init),
+ (gst_play_sink_dispose), (gst_play_sink_vis_unblocked),
+ (gst_play_sink_vis_blocked), (gst_play_sink_set_vis_plugin),
+ (gen_vis_chain):
+ Implement vis switching while playing.
+
+2008-02-29 00:04:57 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/riff/riff-media.c: Add Dirac mapping
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: Add Dirac mapping
+
+2008-02-28 10:54:14 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/tcp/: Removed fdset and stress test, they are now known as GstPoll in core.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/tcp/Makefile.am:
+ * gst/tcp/fdsetstress.c:
+ * gst/tcp/gstfdset.c:
+ * gst/tcp/gstfdset.h:
+ Removed fdset and stress test, they are now known as GstPoll in
+ core.
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init),
+ (gst_multi_fd_sink_add_full), (gst_multi_fd_sink_remove),
+ (gst_multi_fd_sink_clear), (gst_multi_fd_sink_remove_client_link),
+ (gst_multi_fd_sink_handle_client_write),
+ (gst_multi_fd_sink_queue_buffer),
+ (gst_multi_fd_sink_handle_clients), (gst_multi_fd_sink_start),
+ (gst_multi_fd_sink_stop):
+ * gst/tcp/gstmultifdsink.h:
+ * gst/tcp/gsttcp.c: (gst_tcp_socket_read), (gst_tcp_socket_close),
+ (gst_tcp_read_buffer), (gst_tcp_gdp_read_buffer),
+ (gst_tcp_gdp_read_caps):
+ * gst/tcp/gsttcp.h:
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_init),
+ (gst_tcp_client_sink_setcaps), (gst_tcp_client_sink_render),
+ (gst_tcp_client_sink_start), (gst_tcp_client_sink_stop):
+ * gst/tcp/gsttcpclientsink.h:
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_init),
+ (gst_tcp_client_src_create), (gst_tcp_client_src_start),
+ (gst_tcp_client_src_stop), (gst_tcp_client_src_unlock):
+ * gst/tcp/gsttcpclientsrc.h:
+ * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_handle_wait),
+ (gst_tcp_server_sink_init_send), (gst_tcp_server_sink_close):
+ * gst/tcp/gsttcpserversink.h:
+ * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_init),
+ (gst_tcp_server_src_create), (gst_tcp_server_src_start),
+ (gst_tcp_server_src_stop), (gst_tcp_server_src_unlock):
+ * gst/tcp/gsttcpserversrc.h:
+ Port to GstPoll. See #505417.
+
+2008-02-28 09:54:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Patch Changelog a bit to give credit and refer to the relevant bug.
+ Original commit message from CVS:
+ Patch Changelog a bit to give credit and refer to the
+ relevant bug.
+
+2008-02-28 09:50:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.*: Use GstPoll for the rtsp connection.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_create), (gst_rtsp_connection_connect),
+ (gst_rtsp_connection_write), (gst_rtsp_connection_read_internal),
+ (gst_rtsp_connection_receive), (gst_rtsp_connection_close),
+ (gst_rtsp_connection_free), (gst_rtsp_connection_poll),
+ (gst_rtsp_connection_flush):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Use GstPoll for the rtsp connection.
+
+2008-02-27 12:19:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add combo box for visualisations, populate it with a factory list of all visualisation pl...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (vis_toggle_cb), (filter_features),
+ (init_visualization_features), (vis_combo_cb), (shot_cb), (main):
+ Add combo box for visualisations, populate it with a factory list
+ of all visualisation plugins, configure vis plugin instance in
+ playbin2.
+
+2008-02-27 10:55:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/libs/rtp.c: Add check for RTP buffer defaults, padding and marker bit API.
+ Original commit message from CVS:
+ * tests/check/libs/rtp.c: (GST_START_TEST):
+ Add check for RTP buffer defaults, padding and marker bit API.
+
+2008-02-27 10:42:08 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/cdda/sha1.c: Use memcpy() instead of upcasting a byte array to long *. This fixes an unaligned memory ac...
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/sha1.c: (sha_transform):
+ Use memcpy() instead of upcasting a byte array to long *. This
+ fixes an unaligned memory access, resulting in SIGBUS on IA64.
+ This should be ported to GCheckSum once we can use GLib 2.16.
+ Partially fixes bug #500833.
+
+2008-02-27 10:23:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gsttagdemux.c: Push tag event after the newsegment event. Log the pointer of the buffer we're actual...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_chain):
+ Push tag event after the newsegment event. Log the pointer of
+ the buffer we're actually going to push rather than the buffer
+ we're feeding to _make_metadata_writable().
+
+2008-02-25 07:21:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Comment smoke typefinder for now. The smokedec plugin needs one frame per buffer...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Comment smoke typefinder for now. The smokedec plugin needs one
+ frame per buffer but we have no parser yet, thus it simply crashes
+ in most situations.
+
+2008-02-25 06:48:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for the smoke video codec. Copied from the jpeg plugin.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Add typefinder for the smoke video codec. Copied from the jpeg plugin.
+
+2008-02-25 06:29:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/typefind/gsttypefindfunctions.c: Add midi typefinder, copied from the timidity plugin.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mid_type_find),
+ (plugin_init):
+ Add midi typefinder, copied from the timidity plugin.
+
+2008-02-23 09:51:26 +0000 Tomasz Sałaciński <tsalacinski@gmail.com>
+
+ Forward slashes at the beginning and end of a line also signify italics (Fixes: #518162).
+ Original commit message from CVS:
+ Based on patch by: Tomasz Sałaciński <tsalacinski gmail com>
+ * gst/subparse/gstsubparse.c: (parse_mdvdsub):
+ * tests/check/elements/subparse.c: (test_microdvd_with_italics),
+ (subparse_suite):
+ Forward slashes at the beginning and end of a line also signify
+ italics (Fixes: #518162).
+
+2008-02-22 06:38:08 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/gst-plugins-base.supp: Add a suppression for a cached value in GIO that wasn't moved while moving gio fro...
+ Original commit message from CVS:
+ * tests/check/gst-plugins-base.supp:
+ Add a suppression for a cached value in GIO that wasn't moved
+ while moving gio from -bad to -base.
+
+2008-02-22 05:27:24 +0000 Brian Cameron <brian.cameron@sun.com>
+
+ configure.ac: Don't hardcode -Wall and -Werror for configure checks, this fails with non-GCC compilers. Fixes bug #51...
+ Original commit message from CVS:
+ Patch by: Brian Cameron <brian dot cameron at sun dot com>
+ * configure.ac:
+ Don't hardcode -Wall and -Werror for configure checks, this fails
+ with non-GCC compilers. Fixes bug #517991.
+
+2008-02-21 08:05:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Mark buffers as GAP,if volume is 0.0 and fix the previous logic.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ Mark buffers as GAP,if volume is 0.0 and fix the previous logic.
+
+2008-02-20 15:37:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gnomevfs/gstgnomevfssink.c: Return FALSE when seeking for a new segment fails instead of silently ignoring the fa...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ (gst_gnome_vfs_sink_handle_event):
+ Return FALSE when seeking for a new segment fails instead
+ of silently ignoring the failure and appending every buffer
+ that comes for the new segment.
+
+2008-02-20 11:52:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Recursively search the sink element for a last-frame property so that we can also find th...
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (find_property),
+ (gst_play_sink_find_property), (gen_video_chain),
+ (gst_play_sink_reconfigure), (gst_play_sink_get_last_frame):
+ Recursively search the sink element for a last-frame property so that we
+ can also find the property in autovideosink and friends that don't
+ always proxy the internal sink properties.
+
+2008-02-19 20:42:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: Fix confusing terminology in docs and code: structure fields are 'fields' and not ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME),
+ (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):
+ Fix confusing terminology in docs and code: structure fields are
+ 'fields' and not 'properties'.
+
+2008-02-19 20:36:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: Give more useful warning messages if one of the channel layout enums passed to us ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions), (add_list_to_struct):
+ Give more useful warning messages if one of the channel
+ layout enums passed to us is invalid and if the "channels"
+ field in the caps has a GType we don't expect.
+
+2008-02-19 20:22:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: Fix typo in docs blurb.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ Fix typo in docs blurb.
+
+2008-02-19 16:16:55 +0000 Josep Torra Valles <josep@fluendo.com>
+
+ gst/typefind/gsttypefindfunctions.c: Increase the MPEG PS typefind lookup to fix typefinding on HD clips.
+ Original commit message from CVS:
+ 2008-02-19 Julien Moutte <julien@fluendo.com>
+ Patch by: Josep Torra Valles <josep@fluendo.com>
+ * gst/typefind/gsttypefindfunctions.c: Increase the MPEG PS
+ typefind lookup to fix typefinding on HD clips.
+
+2008-02-19 15:50:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstscreenshot.*: Fix up copyright (I rewrote the GStreamer-0.10 code for this from scratch back in the d...
+ Original commit message from CVS:
+ * gst/playback/gstscreenshot.c:
+ * gst/playback/gstscreenshot.h:
+ Fix up copyright (I rewrote the GStreamer-0.10 code for
+ this from scratch back in the days).
+
+2008-02-19 15:02:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Add screenshot conversion code from totem.
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstscreenshot.c: (feed_fakesrc), (save_result),
+ (create_element), (gst_play_frame_conv_convert):
+ * gst/playback/gstscreenshot.h:
+ Add screenshot conversion code from totem.
+ * gst/playback/gstplay-marshal.list:
+ * gst/playback/gstplaybin2.c: (gst_play_marshal_BUFFER__BOXED),
+ (gst_play_bin_class_init), (gst_play_bin_convert_frame),
+ (gst_play_bin_get_property), (no_more_pads_cb), (activate_group):
+ Implement frame property to get a color-unconverted snapshot.
+ Implement convert-frame action signal to get a converted snapshot image.
+ Configure connection speed in uridecodebin.
+ Document some more properties.
+ * gst/playback/gstplaysink.c: (gst_play_sink_class_init),
+ (gen_video_chain), (gen_audio_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_get_last_frame):
+ * gst/playback/gstplaysink.h:
+ Use last-buffer property of the video sink to get a video snapshot.
+ * tests/examples/seek/seek.c: (shot_cb), (main):
+ Add snapshot button for playbin2 and use the frame property to save the
+ frame as a png in the current directory.
+
+2008-02-19 11:45:56 +0000 Josep Torra Valles <josep@fluendo.com>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinding support for h264 elementary streams.
+ Original commit message from CVS:
+ Patch by: Josep Torra Valles <josep at fluendo dot com>
+ * gst/typefind/gsttypefindfunctions.c: (h264_video_type_find),
+ (plugin_init):
+ Add typefinding support for h264 elementary streams.
+ Fixes bug #517420.
+
+2008-02-18 13:51:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Require CVS of core for new API in collectpads.
+ Original commit message from CVS:
+ * configure.ac:
+ Require CVS of core for new API in collectpads.
+ * gst/adder/gstadder.c:
+ Use new API to make adder sparse stream aware.
+
+2008-02-18 11:54:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Get the object data correct so that we can remove our channels correctly.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (pad_added_cb), (pad_removed_cb),
+ (no_more_pads_cb):
+ Get the object data correct so that we can remove our channels
+ correctly.
+ * gst/playback/gstplaysink.c: (gen_video_chain), (gen_audio_chain),
+ (gen_vis_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_request_pad):
+ Add option to disable async behaviour in the sinks when possible. This
+ makes it possible to avoid an audio queue when dealing with
+ visualisations.
+ Add option to add a queue for the audio path.
+ * tests/examples/seek/seek.c: (clear_streams), (update_streams),
+ (main):
+ Disable the vis checkbox to match the defaults of playbin2.
+ Only get the stream info when we need to.
+
+2008-02-17 05:15:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Don't use async operations as they require a running main loop.
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesink.c: (gst_gio_base_sink_stop),
+ (gst_gio_base_sink_set_stream):
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_stop),
+ (gst_gio_base_src_set_stream):
+ * ext/gio/gstgiosink.c: (gst_gio_sink_start):
+ * ext/gio/gstgiosrc.c: (gst_gio_src_start):
+ Don't use async operations as they require a running main loop.
+ This makes us block again when closing streams and unable
+ to mount the enclosing volume of an URI if it isn't yet.
+
+2008-02-15 18:38:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaysink.c: Move tee in front of the audio and vis pipelines.
+ Original commit message from CVS:
+ * gst/playback/gstplaysink.c: (gst_play_sink_set_mute),
+ (gst_play_sink_get_mute), (gen_video_chain), (gen_audio_chain),
+ (gen_vis_chain), (gst_play_sink_reconfigure),
+ (gst_play_sink_request_pad):
+ Move tee in front of the audio and vis pipelines.
+ Add queue for audio for now.
+ Add visualisation support.
+ * tests/examples/seek/seek.c: (main):
+ Visualisation is by default disabled.
+
+2008-02-15 11:58:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Improve debugging a bit.
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesink.c: (close_stream_cb):
+ * ext/gio/gstgiobasesrc.c: (close_stream_cb):
+ Improve debugging a bit.
+ * ext/gio/gstgiosink.c: (mount_cb), (gst_gio_sink_start):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.c: (mount_cb), (gst_gio_src_start):
+ * ext/gio/gstgiosrc.h:
+ Try to mount the enclosing volume of a GFile if it isn't mounted
+ yet. This requires us to wait for an async operation to finish, done
+ with an nested GMainLoop. Authentication is not supported yet, will
+ come later.
+
+2008-02-14 18:24:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Add mute property.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (gst_play_bin_set_property), (gst_play_bin_get_property),
+ (pad_added_cb), (pad_removed_cb), (no_more_pads_cb):
+ * gst/playback/gstplaysink.c: (gst_play_sink_set_mute),
+ (gst_play_sink_get_mute), (gen_audio_chain):
+ * gst/playback/gstplaysink.h:
+ Add mute property.
+ * gst/playback/gststreamselector.c: (gst_selector_pad_event),
+ (gst_selector_pad_chain):
+ * gst/playback/gststreamselector.h:
+ Make sure we forward the event only once.
+ * tests/examples/seek/seek.c: (stop_cb), (mute_toggle_cb), (main):
+ Add and implement the mute button for playbin2.
+
+2008-02-13 14:34:55 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ ext/alsa/gstalsasink.c: Add some more debug info.
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * ext/alsa/gstalsasink.c: (set_hwparams), (gst_alsasink_delay):
+ Add some more debug info.
+ Make sure we never return a negative delay. Fixes #516246.
+
+2008-02-12 20:09:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsasink.c: Revert patch that makes the sink hold the object lock when calling snd_pcm_delay(), since it ...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_delay):
+ Revert patch that makes the sink hold the object lock when
+ calling snd_pcm_delay(), since it breaks playback for me.
+
+2008-02-12 19:50:36 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Add some seek flags when changing rate.
+ Original commit message from CVS:
+ 2008-02-12 Julien Moutte <julien@fluendo.com>
+ * tests/examples/seek/seek.c: (rate_spinbutton_changed_cb): Add
+ some seek flags when changing rate.
+
+2008-02-12 14:51:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Fix potential leaks.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_handle_frame_based_buffer),
+ (gst_base_rtp_audio_payload_handle_sample_based_buffer):
+ Fix potential leaks.
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_chain):
+ Fix leak when there is no function configured.
+
+2008-02-12 11:36:27 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ sys/v4l/v4lsrc_calls.c: Correctly chain up the finalize method.
+ Original commit message from CVS:
+ * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_buffer_class_init),
+ (gst_v4lsrc_buffer_finalize):
+ Correctly chain up the finalize method.
+
+2008-02-12 09:24:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Add documentation and example code for giostreamsink/giostreamsrc.
+ Original commit message from CVS:
+ * ext/gio/gstgiostreamsink.c:
+ * ext/gio/gstgiostreamsrc.c:
+ Add documentation and example code for giostreamsink/giostreamsrc.
+ * tests/check/pipelines/gio.c: (GST_START_TEST):
+ Ask the GMemoryOutputStream for the data instead of assuming that
+ the pointer to the data stayed the same. It could've been realloc'ed.
+
+2008-02-12 08:55:57 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Make the documentation of giosink/giosrc complete, large parts are based on the gnomevfssink/gnomevfssrc docs.
+ Original commit message from CVS:
+ * ext/gio/gstgiosink.c:
+ * ext/gio/gstgiosrc.c:
+ Make the documentation of giosink/giosrc complete, large parts
+ are based on the gnomevfssink/gnomevfssrc docs.
+
+2008-02-12 08:13:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/plugins/: Add the GIO documentation again and while at that run make update.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gio.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playback.xml:
+ * docs/plugins/inspect/plugin-queue2.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-uridecodebin.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ Add the GIO documentation again and while at that run make update.
+
+2008-02-11 20:23:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/: Don't use snd_pcm_sw_params_set_xfer_align() if we're compiling against libasound >= 1.0.16, since it's be...
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.h: (GST_CHECK_ALSA_VERSION):
+ * ext/alsa/gstalsasink.c: (set_swparams):
+ * ext/alsa/gstalsasrc.c: (set_swparams), (gst_alsasrc_open):
+ Don't use snd_pcm_sw_params_set_xfer_align() if we're compiling
+ against libasound >= 1.0.16, since it's been deprecated in
+ 0.10.16, and alignment is always 1 then, apparently. (#512899)
+
+2008-02-11 18:31:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Handle case where we can't create the volume element a bit better (#514307).
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_audio_element):
+ * gst/playback/gstplaysink.c: (gen_audio_chain):
+ Handle case where we can't create the volume element a bit
+ better (#514307).
+
+2008-02-11 18:02:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/: Add support for https protocol. Fixes #510229.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_check_get_range):
+ * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris):
+ Add support for https protocol. Fixes #510229.
+
+2008-02-11 17:03:18 +0000 Alan Peevers <peeves@pacbell.net>
+
+ ext/alsa/gstalsasink.c: Take appropriate lock when calling alsa methods.
+ Original commit message from CVS:
+ 2008-02-11 Julien Moutte <julien@fluendo.com>
+ Patch by: Alan Peevers <peeves@pacbell.net>
+ * ext/alsa/gstalsasink.c: (gst_alsasink_delay): Take appropriate
+ lock when calling alsa methods.
+
+2008-02-11 13:03:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Bump rank of jpeg and png typefinders, which will return maximum probability in ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ Bump rank of jpeg and png typefinders, which will return maximum
+ probability in the most common cases (thus short-circuiting more
+ expensive typefinders like the mp3 one for these two quite common
+ image types).
+
+2008-02-11 09:48:03 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/theora/theoraparse.c: Fix long description of the theora parser to be more verbose than just the type name.
+ Original commit message from CVS:
+ * ext/theora/theoraparse.c:
+ Fix long description of the theora parser to be more verbose than just
+ the type name.
+
+2008-02-11 06:47:50 +0000 Branko Čibej <brane@xbc.nu>
+
+ sys/xvimage/xvimagesink.c: Fix build of xvimagesink if we don't have XShm, e.g. on Mac OS X.
+ Original commit message from CVS:
+ Patch by: Branko Čibej <brane at xbc dot nu>
+ * sys/xvimage/xvimagesink.c:
+ Fix build of xvimagesink if we don't have XShm, e.g. on Mac OS X.
+ Fixes bug #515654.
+
+2008-02-09 10:41:36 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/playback/gstplaybasebin.c: Set is_dynamic as True if there are elements with both request and sometimes src pad t...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ Set is_dynamic as True if there are elements with both request
+ and sometimes src pad templates instead of breaking out when it
+ finds the first pad template that is a src.
+
+2008-02-08 18:17:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add some stream switching and volume gui for playbin2.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (stop_cb), (clear_streams),
+ (update_streams), (video_combo_cb), (audio_combo_cb),
+ (text_combo_cb), (volume_spinbutton_changed_cb), (main):
+ Add some stream switching and volume gui for playbin2.
+
+2008-02-08 17:47:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplay-marshal.list: Added marshal for streamselector Tags.
+ Original commit message from CVS:
+ * gst/playback/gstplay-marshal.list:
+ Added marshal for streamselector Tags.
+ * gst/playback/gstplaybasebin.c: (set_active_source):
+ Streamselector now selects pads based on the pad object instead of its
+ name.
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (init_group), (gst_play_bin_init), (get_group), (get_tags),
+ (gst_play_bin_get_video_tags), (gst_play_bin_get_audio_tags),
+ (gst_play_bin_get_text_tags),
+ (gst_play_bin_set_current_video_stream),
+ (gst_play_bin_set_current_audio_stream),
+ (gst_play_bin_set_current_text_stream),
+ (gst_play_bin_set_property), (gst_play_bin_get_property),
+ (pad_added_cb), (pad_removed_cb), (autoplug_select_cb):
+ Remove option to mute streams with the current-a/v/t property, we have
+ this functionality in the flags.
+ Add signals to notify when the number of A/V/T channels changed.
+ Add action signals to get tags for the A/V/T streams.
+ Implement setting the current A/V/T stream.
+ Rearrange some things to simplify stream selection.
+ Implement volume.
+ * gst/playback/gstplaysink.c: (gst_play_sink_set_volume),
+ (gst_play_sink_get_volume), (gst_play_sink_set_property),
+ (gst_play_sink_get_property), (gen_video_chain), (gen_audio_chain),
+ (activate_vis), (gst_play_sink_reconfigure):
+ * gst/playback/gstplaysink.h:
+ Add and implement volume setting methods.
+ * gst/playback/gststreamselector.c: (gst_selector_pad_class_init),
+ (gst_selector_pad_finalize), (gst_selector_pad_get_property),
+ (gst_selector_pad_event), (gst_stream_selector_class_init),
+ (gst_stream_selector_init), (gst_stream_selector_finalize),
+ (gst_stream_selector_set_property),
+ (gst_stream_selector_get_property),
+ (gst_stream_selector_get_linked_pad),
+ (gst_stream_selector_request_new_pad):
+ * gst/playback/gststreamselector.h:
+ Add pad properties for tags and status of pads.
+ Keep tags on pads.
+ Make active pad selection based on pad object instead of name.
+
+2008-02-08 16:10:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Revert last change as we now check in gtk-doc.m4 for sed.
+ Original commit message from CVS:
+ * configure.ac:
+ Revert last change as we now check in gtk-doc.m4 for sed.
+
+2008-02-08 14:54:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Find and subst SED when building the docs.
+ Original commit message from CVS:
+ * configure.ac:
+ Find and subst SED when building the docs.
+
+2008-02-08 14:34:41 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Make sure bus signals are reconnected when pressing STOP and then PLAY again for a parse ...
+ Original commit message from CVS:
+ 2008-02-08 Julien Moutte <julien@fluendo.com>
+ * tests/examples/seek/seek.c: (stop_cb), (connect_bus_signals),
+ (main): Make sure bus signals are reconnected when pressing STOP
+ and then PLAY again for a parse launch pipeline. Fix a ref leak
+ on the bus.
+ * win32/common/config.h: Updated.
+
+2008-02-08 00:57:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Make DISABLE_DEPRECATED defined *only* during CVS, not during pre-releases or releases.
+ Original commit message from CVS:
+ * configure.ac:
+ Make DISABLE_DEPRECATED defined *only* during CVS, not during
+ pre-releases or releases.
+
+2008-02-08 00:45:56 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Subst GIO_LDFLAGS to avoid undefined Makefile var error Zaheer is reporting
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/gio/Makefile.am:
+ Subst GIO_LDFLAGS to avoid undefined Makefile var error Zaheer is
+ reporting
+
+2008-02-07 23:40:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/plugins/Makefile.am: Add the headers which need scanning for the GIO plugin. The rest of the docs still need mig...
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ Add the headers which need scanning for the GIO plugin. The rest of
+ the docs still need migrating.
+
+2008-02-07 23:22:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add gio in a few more places.
+ Original commit message from CVS:
+ * ext/Makefile.am:
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/.cvsignore:
+ Add gio in a few more places.
+
+2008-02-07 23:18:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Move gio plugin from -bad and mark as experimental.
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/Makefile.am:
+ * tests/check/Makefile.am:
+ Move gio plugin from -bad and mark as experimental.
+
+2008-02-07 22:39:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/: Comment out a couple of other things which break the build when
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixeroptions.c:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ Comment out a couple of other things which break the build when
+ GST_DISABLE_DEPRECATED isn't on but -Werror is.
+
+2008-02-07 18:28:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Fix pbutils header.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Fix pbutils header.
+
+2008-02-07 18:07:41 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ commit spec file update which includes all the split .pc files
+ Original commit message from CVS:
+ commit spec file update which includes all the split .pc files
+
+2008-02-07 12:17:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspmessage.c: Fix compiler warning.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (gst_rtsp_message_unset):
+ Fix compiler warning.
+
+2008-02-07 11:00:45 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Clear the addrinfo struct using memset. Fixes #514937.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst-libs/gst/sdp/gstsdpmessage.c: (is_multicast_address):
+ Clear the addrinfo struct using memset. Fixes #514937.
+
+2008-02-06 15:07:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstfdset.h: Remove unused field to same some memory.
+ Original commit message from CVS:
+ * gst/tcp/gstfdset.h:
+ Remove unused field to same some memory.
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ Mark action signals as such.
+
+2008-02-06 13:35:58 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Increment granulepos for new-bitstream versions appropriately.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (_theora_granule_frame),
+ (_inc_granulepos):
+ Increment granulepos for new-bitstream versions appropriately.
+ Fixes #514623.
+
+2008-02-04 11:51:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Remove obsolete stream_time reset after flushing seek, core does that automatically now.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (do_seek),
+ (rate_spinbutton_changed_cb), (update_streams), (main):
+ Remove obsolete stream_time reset after flushing seek, core does that
+ automatically now.
+ Improve accuracy of speed spinbutton.
+ Only do playbin2 stuff when we actually use it.
+
+2008-02-02 17:29:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Revert previous change of the test environment's GST_PLUGIN_PATH.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Revert previous change of the test environment's GST_PLUGIN_PATH.
+ The problem is not with the plugins, but with element factories
+ and only occurs if elements are split out from existing plugins
+ or if plugins change name (see #512740).
+
+2008-02-02 15:32:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Fix the tests environment's GST_PLUGIN_PATH: we want the directory with the core's plugins f...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Fix the tests environment's GST_PLUGIN_PATH: we want the directory
+ with the core's plugins first and our local build directories last,
+ since we might be building against an installed core, and that
+ core's plugin directory may contain older or other versions of
+ our own -base plugins, but we really do want to test our local
+ ones (if there are multiple plugins or element factories with the
+ same name, those inspected last will trump those read in earlier).
+ Fixes #512740 for the most part.
+
+2008-02-02 07:13:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Use gmtime_r if available as gmtime is not MT-safe.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (add_date_header):
+ Use gmtime_r if available as gmtime is not MT-safe.
+ Fixes bug #511810.
+
+2008-02-02 06:52:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Cast glong to time_t as time_t might have a different type on other platforms,...
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (add_date_header):
+ Cast glong to time_t as time_t might have a different type on
+ other platforms, like FreeBSD, and we get a compiler warning
+ otherwise. Fixes bug #511825.
+
+2008-02-01 16:44:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Remove stream-info, we going for something easier.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (get_group), (get_n_pads), (gst_play_bin_get_property),
+ (pad_added_cb), (no_more_pads_cb), (perform_eos),
+ (autoplug_select_cb), (deactivate_group):
+ Remove stream-info, we going for something easier.
+ Refactor getting the current group.
+ Implement getting the number of audio/video/text streams.
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_class_init), (gst_stream_selector_init),
+ (gst_stream_selector_get_property),
+ (gst_stream_selector_request_new_pad),
+ (gst_stream_selector_release_pad):
+ * gst/playback/gststreamselector.h:
+ Add property for number of pads.
+ * tests/examples/seek/seek.c: (set_scale), (update_flag),
+ (vis_toggle_cb), (audio_toggle_cb), (video_toggle_cb),
+ (text_toggle_cb), (update_streams), (msg_async_done),
+ (msg_state_changed), (main):
+ Block slider callback when updating the slider position.
+ Add gui elements for controlling playbin2.
+ Add callback for async_done that updates position/duration.
+
+2008-02-01 12:56:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/plugins/: First round of plugin docs cleansups.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ First round of plugin docs cleansups.
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Regenerate.
+ * ext/ogg/Makefile.am:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggmux.h:
+ Add header for oggmux. the c-file needs a doc blob still.
+
+2008-02-01 11:09:16 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ Add gst_rtp_buffer_set_extension_data()
+ Original commit message from CVS:
+ Patch by: Thijs Vermeir <thijsvermeir at gmail dot com>
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_set_extension_data):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * tests/check/libs/rtp.c: (GST_START_TEST), (rtp_suite):
+ Add gst_rtp_buffer_set_extension_data()
+ Add a unit test for this addition. Fixes #511478.
+ API: GstRTPBuffer:gst_rtp_buffer_set_extension_data()
+
+2008-01-31 17:18:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.c: Really clean up the queue instead of just unreffing all buffers in it.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_dispose):
+ Really clean up the queue instead of just unreffing all buffers
+ in it.
+ * gst-libs/gst/app/gstappsrc.c: (gst_app_src_base_init),
+ (gst_app_src_class_init), (gst_app_src_init),
+ (gst_app_src_dispose), (gst_app_src_finalize):
+ Fix dispose/finalize.
+
+2008-01-30 15:34:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Use async variants of the close stream functions to prevent blocking for a long time there and add some mor...
+ Original commit message from CVS:
+ * ext/gio/gstgiobasesink.c: (close_stream_cb),
+ (gst_gio_base_sink_stop), (gst_gio_base_sink_event),
+ (gst_gio_base_sink_render), (gst_gio_base_sink_set_stream):
+ * ext/gio/gstgiobasesrc.c: (close_stream_cb),
+ (gst_gio_base_src_stop), (gst_gio_base_src_create),
+ (gst_gio_base_src_set_stream):
+ Use async variants of the close stream functions to prevent blocking
+ for a long time there and add some more sanity checks for a correct
+ stream.
+
+2008-01-30 14:42:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.17 ===
+
+2008-01-30 14:19:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/config.h:
+ Release 0.10.17
+ Original commit message from CVS:
+ Release 0.10.17
+
+2008-01-30 13:45:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/: Also remove the conditional registration of the signals that disappeared with the ABI chang...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixeroptions.c:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ Also remove the conditional registration of the signals
+ that disappeared with the ABI change in 0.10.14
+
+2008-01-30 12:28:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Revert patch to gstrtspconnection.c for brown paper bag release of -base. Re-o...
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ Revert patch to gstrtspconnection.c for brown paper bag
+ release of -base. Re-opens: #511825
+
+2008-01-30 12:20:42 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/: Change the way these deprecated function pointers are removed so that the compiled ABI is u...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ Change the way these deprecated function pointers are removed
+ so that the compiled ABI is unconditionally smaller. This
+ sets in stone an ABI break that actually occurred when the
+ things were deprecated in 0.10.14, which seems to be the best
+ fix as the only known users are oss-mixer and sunaudio-mixer in
+ gst-plugins-good.
+ Fixes: #513018
+
+2008-01-30 12:19:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/: Change the way these deprecated function pointers are removed so that the compiled ABI is u...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ Change the way these deprecated function pointers are removed
+ so that the compiled ABI is unconditionally smaller. This
+ sets in stone an ABI break that actually occurred when the
+ things were deprecated in 0.10.14, which seems to be the best
+ fix as the only known users are oss-mixer and sunaudio-mixer in
+ gst-plugins-good.
+
+2008-01-30 11:43:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/libgstpbutils.def: Export the two new _get_type() functions which are needed by the python bindings.
+ Original commit message from CVS:
+ * win32/common/libgstpbutils.def:
+ Export the two new _get_type() functions which are needed
+ by the python bindings.
+
+2008-01-29 09:59:03 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Cast glong to time_t as time_t might have a different type on other platforms,...
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (add_date_header):
+ Cast glong to time_t as time_t might have a different type on
+ other platforms, like FreeBSD, and we get a compiler warning
+ otherwise. Fixes bug #511825.
+
+2008-01-29 09:47:12 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/gstaudiofilter.c: Initialize the GstRingerBuffer class to get it's debug category initialized. gst...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ (gst_audio_filter_class_init):
+ Initialize the GstRingerBuffer class to get it's debug category
+ initialized. gst_ring_buffer_parse_caps() uses the ringbuffer debug
+ category and otherwise we get some g_critical(). Fixes bug #512334.
+
+2008-01-28 23:35:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.16 ===
+
+2008-01-28 23:31:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.prerequisites:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/config.h:
+ Release 0.10.16
+ Original commit message from CVS:
+ Release 0.10.16
+
+2008-01-28 22:15:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * common:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/hu.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-01-22 15:37:49 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Fix typos and wrong extension check. Fixes #511274.
+ Original commit message from CVS:
+ Patch by: Thijs Vermeir <thijsvermeir at gmail dot com>
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_get_extension_data):
+ Fix typos and wrong extension check. Fixes #511274.
+
+2008-01-18 00:03:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ po/sk.po: Oops - add new sk.po mentioned in the LINGUAS I just committed
+ Original commit message from CVS:
+ * po/sk.po:
+ Oops - add new sk.po mentioned in the LINGUAS I just committed
+
+2008-01-17 22:31:25 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ po/LINGUAS: Add ca translation to the disted list.
+ Original commit message from CVS:
+ * po/LINGUAS:
+ Add ca translation to the disted list.
+ * win32/vs6/libgstsdp.dsp:
+ Convert line endings to CRLF
+
+2008-01-17 21:58:53 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/MANIFEST: Add win32/vs6/libgstrtsp.dsp to MANIFEST
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ Add win32/vs6/libgstrtsp.dsp to MANIFEST
+
+2008-01-16 05:40:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Update for API changes in GIO and require GIO 2.15.2 for this.
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/check/pipelines/gio.c: (GST_START_TEST):
+ Update for API changes in GIO and require GIO 2.15.2 for this.
+
+2008-01-14 22:20:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/: Add new API declarations
+ Original commit message from CVS:
+ * win32/common/libgstsdp.def:
+ * win32/common/libgstvideo.def:
+ Add new API declarations
+
+2008-01-14 17:00:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/theora/: Take a 2nd stab at handling libtheora granulepos changes in the decoder and parser by inspecting the bit...
+ Original commit message from CVS:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraparse.c:
+ Take a 2nd stab at handling libtheora granulepos changes in the decoder
+ and parser by inspecting the bitstream version of the incoming data.
+
+2008-01-14 13:11:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Provide one pkg-config file for every gst-plugins-base library.
+ Original commit message from CVS:
+ * configure.ac:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-audio-uninstalled.pc.in:
+ * pkgconfig/gstreamer-audio.pc.in:
+ * pkgconfig/gstreamer-cdda-uninstalled.pc.in:
+ * pkgconfig/gstreamer-cdda.pc.in:
+ * pkgconfig/gstreamer-fft-uninstalled.pc.in:
+ * pkgconfig/gstreamer-fft.pc.in:
+ * pkgconfig/gstreamer-floatcast-uninstalled.pc.in:
+ * pkgconfig/gstreamer-floatcast.pc.in:
+ * pkgconfig/gstreamer-interfaces-uninstalled.pc.in:
+ * pkgconfig/gstreamer-interfaces.pc.in:
+ * pkgconfig/gstreamer-netbuffer-uninstalled.pc.in:
+ * pkgconfig/gstreamer-netbuffer.pc.in:
+ * pkgconfig/gstreamer-pbutils-uninstalled.pc.in:
+ * pkgconfig/gstreamer-pbutils.pc.in:
+ * pkgconfig/gstreamer-riff-uninstalled.pc.in:
+ * pkgconfig/gstreamer-riff.pc.in:
+ * pkgconfig/gstreamer-rtp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtp.pc.in:
+ * pkgconfig/gstreamer-rtsp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-rtsp.pc.in:
+ * pkgconfig/gstreamer-sdp-uninstalled.pc.in:
+ * pkgconfig/gstreamer-sdp.pc.in:
+ * pkgconfig/gstreamer-tag-uninstalled.pc.in:
+ * pkgconfig/gstreamer-tag.pc.in:
+ * pkgconfig/gstreamer-video-uninstalled.pc.in:
+ * pkgconfig/gstreamer-video.pc.in:
+ Provide one pkg-config file for every gst-plugins-base library.
+ This makes linking to those libraries much more intuitive and
+ provides standard pkg-config behaviour for them. Fixes bug #499697.
+
+2008-01-14 01:19:34 +0000 David Schleef <ds@schleef.org>
+
+ gst/videoscale/vs_4tap.c: Fix valgrind error on 4tap scaling method.
+ Original commit message from CVS:
+ * gst/videoscale/vs_4tap.c:
+ Fix valgrind error on 4tap scaling method.
+
+2008-01-13 21:40:45 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Include Winsock2.h for VS6 and use a different way initialize hints structure so it...
+ Original commit message from CVS:
+ * gst-libs/gst/sdp/gstsdpmessage.c: (is_multicast_address):
+ Include Winsock2.h for VS6 and use a different way initialize
+ hints structure so it can build with VS6.
+ * win32/MANIFEST:
+ * win32/vs6/libgstsdp.dsp:
+ * win32/common/libgstsdp.def:
+ Add new files for libgstsdp.
+ * win32/vs6/grammar.dsp:
+ Copy pbutils-enumtypes* from win32/common to pbutils sources folder.
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstdecodebin.dsp:
+ * win32/vs6/libgstdecodebin2.dsp:
+ * win32/vs6/libgstplaybin.dsp:
+ * win32/vs6/libgstvolume.dsp:
+ Add new dependencies to the link list.
+
+2008-01-13 17:24:49 +0000 Julien Moutte <julien@moutte.net>
+
+ win32/common/: Update/Add generated files in the win32 build directory.
+ Original commit message from CVS:
+ 2008-01-13 Julien Moutte <julien@fluendo.com>
+ * win32/common/config.h:
+ * win32/common/gstrtsp-enumtypes.c: (gst_rtsp_result_get_type),
+ (gst_rtsp_event_get_type), (gst_rtsp_family_get_type),
+ (gst_rtsp_state_get_type), (gst_rtsp_version_get_type),
+ (gst_rtsp_method_get_type), (gst_rtsp_auth_method_get_type),
+ (gst_rtsp_header_field_get_type),
+ (gst_rtsp_status_code_get_type):
+ * win32/common/interfaces-enumtypes.c:
+ (gst_color_balance_type_get_type), (gst_mixer_type_get_type),
+ (gst_mixer_message_type_get_type), (gst_mixer_flags_get_type),
+ (gst_mixer_track_flags_get_type),
+ (gst_tuner_channel_flags_get_type):
+ * win32/common/multichannel-enumtypes.c:
+ (gst_audio_channel_position_get_type):
+ * win32/common/pbutils-enumtypes.c:
+ (gst_install_plugins_return_get_type):
+ * win32/common/pbutils-enumtypes.h: Update/Add generated files
+ in the win32 build directory.
+
+2008-01-12 23:24:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/Makefile.am: Fix CFLAGS to also pull in the gstcheck cflags from AM_CFLAGS.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Fix CFLAGS to also pull in the gstcheck cflags from AM_CFLAGS.
+ * tests/check/elements/audiorate.c: (do_perfect_stream_test):
+ * tests/check/elements/playbin.c:
+ * tests/check/libs/mixer.c: (test_element_interface_supported),
+ (gst_implements_interface_init):
+ * tests/check/libs/rtp.c: (GST_START_TEST):
+ Fix various assignment type mismatches.
+
+2008-01-12 23:08:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add test to see if hstrerror is available or if we need libresolv (Solaris) for it, then use it in libgstrtsp.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/rtsp/Makefile.am:
+ Add test to see if hstrerror is available or if we need libresolv
+ (Solaris) for it, then use it in libgstrtsp.
+
+2008-01-12 14:54:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/tag/Makefile.am: Fix include path order
+ Original commit message from CVS:
+ * gst-libs/gst/tag/Makefile.am:
+ Fix include path order
+
+2008-01-11 17:15:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * gst-libs/gst/pbutils/.gitignore:
+ Ignore more and make buildbot happy
+ Original commit message from CVS:
+ Ignore more and make buildbot happy
+
+2008-01-11 16:18:10 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/pbutils/install-plugins.*: Add GBoxed GType for GstInstallPluginsContext, this eases the wrapping for bi...
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ (gst_install_plugins_context_copy),
+ (gst_install_plugins_context_get_type):
+ * gst-libs/gst/pbutils/install-plugins.h:
+ Add GBoxed GType for GstInstallPluginsContext, this eases the wrapping
+ for bindings.
+
+2008-01-11 15:48:11 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Adapt for post-alpha meaning of granulepos, when we have a newer version of libtheora.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (gst_theora_dec_class_init),
+ (_theora_granule_frame), (_theora_granule_start_time),
+ (theora_dec_sink_convert), (theora_dec_decode_buffer):
+ Adapt for post-alpha meaning of granulepos, when we
+ have a newer version of libtheora.
+ * ext/theora/theoraenc.c: (gst_theora_enc_class_init),
+ (theora_enc_get_ogg_packet_end_time), (theora_enc_sink_event),
+ (theora_enc_is_discontinuous), (theora_enc_chain):
+ Likewise.
+ * tests/check/Makefile.am:
+ Link libtheora into theoraenc test so we can check which version of
+ libtheora we're testing against.
+ * tests/check/pipelines/theoraenc.c: (check_libtheora),
+ (check_buffer_granulepos),
+ (check_buffer_granulepos_from_starttime), (GST_START_TEST),
+ (theoraenc_suite):
+ Adapt tests to check the values that are now defined for theora; make
+ the tests backwards-adapt the passed values if we're running against an
+ old libtheora.
+ Fixes #497964
+
+2008-01-10 17:55:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/: Ref audio clock class from a thread-safe context to make sure however unlikely that may be in pr...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init):
+ Ref audio clock class from a thread-safe context to make sure
+ we're not bit by GObjects lack of thread-safety here (#349410),
+ however unlikely that may be in practice.
+
+2008-01-10 12:22:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ 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-08 21:10:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gsttagdemux.c: Post an error message if we can't pull as many bytes as we need for the tag. This mak...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_pull_start_tag):
+ Post an error message if we can't pull as many bytes as we need
+ for the tag. This makes sure the user gets to see a proper error
+ message if a file with a partial ID3 tag is fed to decodebin, and
+ not a 'no ID3 tag demuxer' error, which would be confusing
+ (see #508138).
+
+2008-01-08 20:59:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Add description strings for ID3, APE, and ICY tags.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (formats):
+ Add description strings for ID3, APE, and ICY tags.
+
+2008-01-08 20:48:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: Make sure we error out correctly if we can't activate one of the elements we've added. ...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (try_to_link_1):
+ Make sure we error out correctly if we can't activate one of
+ the elements we've added. Fixes #508138.
+
+2008-01-07 13:59:43 +0000 Bastien Nocera <hadess@hadess.net>
+
+ ext/alsa/gstalsamixer.c: Use snd_mixer_selem_set_{playback|capture}_volume_all() if the volume is the same for all ch...
+ Original commit message from CVS:
+ Patch by: Bastien Nocera <hadess at hadess net>
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume),
+ (check_if_volumes_are_the_same), (gst_alsa_mixer_set_volume):
+ Use snd_mixer_selem_set_{playback|capture}_volume_all() if
+ the volume is the same for all channels. This works around
+ some problem in alsa that leaves us with inconsistent state
+ for some reason (#486840).
+
+2008-01-07 13:19:50 +0000 Jerone Young <jerone@gmail.com>
+
+ ext/alsa/gstalsamixer.c: If there's no mixer track by the name of 'Master' or 'Front', check if there's one called 'P...
+ Original commit message from CVS:
+ Patch by: Jerone Young <jerone at gmail com>
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_find_master_mixer):
+ If there's no mixer track by the name of 'Master' or 'Front',
+ check if there's one called 'PCM' before trying the generic
+ fallback logic (fixes #506928, where we pick 'Mic' as master
+ track for the AD1984 card in a Thinkpad T61/X61 laptop).
+
+2008-01-07 11:40:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplay-enum.*: Add enums for configuration flags.
+ Original commit message from CVS:
+ * gst/playback/gstplay-enum.c:
+ (register_gst_autoplug_select_result),
+ (gst_autoplug_select_result_get_type), (register_gst_play_flags),
+ (gst_play_flags_get_type):
+ * gst/playback/gstplay-enum.h:
+ Add enums for configuration flags.
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (init_group), (gst_play_bin_init), (gst_play_bin_set_property),
+ (gst_play_bin_get_property), (no_more_pads_cb),
+ (autoplug_select_cb), (gst_play_bin_change_state):
+ Merge mode with flags.
+ Add more property getters/setters, defaults and docs.
+ Add properties to get number of audio/video/text streams.
+ Create sink object in _init so that we can always rely on it being
+ there.
+ * gst/playback/gstplaysink.c: (gst_play_sink_init),
+ (gen_video_chain), (gen_audio_chain), (gen_vis_chain),
+ (activate_vis), (gst_play_sink_reconfigure),
+ (gst_play_sink_set_flags), (gst_play_sink_get_flags),
+ (gst_play_sink_change_state):
+ * gst/playback/gstplaysink.h:
+ Use flags to configure the sink pipelines.
+ Add tee before audio pipeline so that we can use it for visualisations.
+ Start working on integrating visualisations.
+ Remove mode, we can do everything with the flags now.
+ Add method to configue the sink pipeline.
+
+2008-01-06 16:36:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Update to GMemoryInputStream API changes in GLib SVN and require gio-2.0 >= 2.15.1 for this. Fixes bug #507584.
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_get_size):
+ * tests/check/pipelines/gio.c: (free_input), (GST_START_TEST):
+ Update to GMemoryInputStream API changes in GLib SVN and require
+ gio-2.0 >= 2.15.1 for this. Fixes bug #507584.
+ We can also report the duration for every GSeekable, not only
+ GFileInputStream and GMemoryInputStream.
+
+2008-01-06 14:39:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/theoraenc.c: Turn these functions into macros so we can see right away where the failure occured.
+ Original commit message from CVS:
+ * tests/check/pipelines/theoraenc.c: (check_buffer_is_header),
+ (check_buffer_timestamp), (check_buffer_duration):
+ Turn these functions into macros so we can see right away
+ where the failure occured.
+
+2008-01-05 22:25:05 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.c: Add debugging information to understand how X calculates the stride for XvImages.
+ Original commit message from CVS:
+ 2008-01-05 Julien Moutte <julien@fluendo.com>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Add
+ debugging information to understand how X calculates the stride
+ for XvImages.
+
+2008-01-03 20:33:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/volume/: Use GstAudioFilter as base class for the volume element instead of plain GstBaseTransform.
+ Original commit message from CVS:
+ * gst/volume/Makefile.am:
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (gst_volume_base_init), (gst_volume_class_init), (gst_volume_init),
+ (volume_setup):
+ * gst/volume/gstvolume.h:
+ Use GstAudioFilter as base class for the volume element instead of
+ plain GstBaseTransform.
+
+2008-01-03 07:17:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/gstaudiofilter.c: Don't set element details for the abstract GstAudioFilter class.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_get_type):
+ Don't set element details for the abstract GstAudioFilter class.
+
+2008-01-02 12:09:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/gstaudiofilter.c: Implement get_unit_size() vmethod of GstBaseTransform.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ (gst_audio_filter_class_init), (gst_audio_filter_get_unit_size):
+ Implement get_unit_size() vmethod of GstBaseTransform.
+
+2008-01-01 12:53:48 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/pbutils/: Use glib-enum generator to have a proper enum GType for
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/pbutils.h:
+ Use glib-enum generator to have a proper enum GType for
+ GST_TYPE_INSTALL_PLUGINS_RETURN so we can easily wrap it in bindings.
+
+2008-01-01 01:21:47 +0000 David Schleef <ds@schleef.org>
+
+ tests/check/: Reenable theoraenc test, which fails on the buildbot but not locally.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/theoraenc.c:
+ Reenable theoraenc test, which fails on the buildbot but
+ not locally.
+
+2007-12-31 21:31:01 +0000 David Schleef <ds@schleef.org>
+
+ docs/: Add *-undeclared.txt to fix buildbot.
+ Original commit message from CVS:
+ * docs/libs/.cvsignore:
+ * docs/plugins/.cvsignore:
+ Add *-undeclared.txt to fix buildbot.
+
+2007-12-31 20:45:28 +0000 David Schleef <ds@schleef.org>
+
+ tests/check/Makefile.am: Second attempt at disabling theoraenc test long enough to get buildbot to compile -base.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Second attempt at disabling theoraenc test long enough to
+ get buildbot to compile -base.
+
+2007-12-31 20:21:20 +0000 David Schleef <ds@schleef.org>
+
+ tests/check/pipelines/theoraenc.c: Disable theoraenc test long enough to get the buildbot to compile a recent -base.
+ Original commit message from CVS:
+ * tests/check/pipelines/theoraenc.c:
+ Disable theoraenc test long enough to get the buildbot to
+ compile a recent -base.
+
+2007-12-31 13:17:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Make sure we reset the slider value to 0.0 without racing against a possible g_idle that ...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (stop_cb):
+ Make sure we reset the slider value to 0.0 without racing against a
+ possible g_idle that sets it to something else.
+
+2007-12-31 00:32:53 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ sys/ximage/ximagesink.c: fix typo
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c:
+ fix typo
+
+2007-12-30 19:21:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspdefs.*: Add Location header so that we can start implementing redirects.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspdefs.c: (rtsp_init_status):
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ Add Location header so that we can start implementing redirects.
+ See #506025.
+
+2007-12-29 20:55:39 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/subparse/gstssaparse.c: combine if's
+ Original commit message from CVS:
+ * gst/subparse/gstssaparse.c:
+ combine if's
+
+2007-12-29 19:23:59 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/subparse/gstssaparse.c: remove duplicate log message
+ Original commit message from CVS:
+ * gst/subparse/gstssaparse.c:
+ remove duplicate log message
+
+2007-12-29 17:29:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Update to latest API changes in GLib/GIO and require at least gio-2.0 2.15.0 for this.
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/gio/gstgio.c:
+ * ext/gio/gstgio.h:
+ * ext/gio/gstgiobasesink.h:
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_get_size):
+ * ext/gio/gstgiobasesrc.h:
+ * ext/gio/gstgiosink.c: (gst_gio_sink_start):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.h:
+ * ext/gio/gstgiostreamsink.h:
+ * ext/gio/gstgiostreamsrc.h:
+ * tests/check/pipelines/gio.c:
+ Update to latest API changes in GLib/GIO and require at least
+ gio-2.0 2.15.0 for this.
+ * ext/gio/Makefile.am:
+ Add GST_PLUGIN_LDFLAGS to LDFLAGS.
+
+2007-12-29 16:23:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/libvisual/visual.c: Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached()...
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_chain):
+ 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 09:00:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin2.c: Code cleanups.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (gst_play_bin_finalize), (gst_play_bin_set_uri),
+ (gst_play_bin_set_suburi), (gst_play_bin_set_property),
+ (gst_play_bin_get_property), (pad_removed_cb), (drained_cb),
+ (autoplug_select_cb), (activate_group), (deactivate_group),
+ (setup_next_source), (save_current_group),
+ (gst_play_bin_change_state):
+ Code cleanups.
+ Remove next-uri, we can use the uri property just fine.
+ Fix some crasher.
+ Unref uridecodebin when switching.
+ Fix going to READY.
+ * gst/playback/gstplaysink.c: (gst_play_sink_class_init),
+ (gst_play_sink_init), (gst_play_sink_dispose),
+ (gst_play_sink_finalize), (gst_play_sink_vis_unblocked),
+ (gst_play_sink_vis_blocked), (gst_play_sink_set_video_sink),
+ (gst_play_sink_set_audio_sink), (gst_play_sink_set_vis_plugin),
+ (gst_play_sink_set_property), (gst_play_sink_get_property),
+ (gen_video_chain), (gen_text_element), (gen_audio_chain),
+ (gen_vis_element), (gst_play_sink_get_mode),
+ (gst_play_sink_set_mode), (gst_play_sink_set_flags),
+ (gst_play_sink_get_flags), (gst_play_sink_request_pad),
+ (gst_play_sink_release_pad), (gst_play_sink_send_event_to_sink),
+ (gst_play_sink_change_state):
+ * gst/playback/gstplaysink.h:
+ Add some locking to make things threadsafe.
+ * gst/playback/test7.c: (about_to_finish_cb):
+ Fix test.
+
+2007-12-22 12:06:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videoscale/gstvideoscale.c: Don't claim to be able to handle/transform caps that can't really be handled by the c...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_set_property),
+ (gst_video_scale_get_property), (gst_video_scale_transform_caps),
+ (gst_video_scale_transform):
+ Don't claim to be able to handle/transform caps that can't really
+ be handled by the currently selected scaling method (here: RGB or
+ packed YUV with 4-tap method). Also add locking to method property.
+ * tests/check/pipelines/simple-launch-lines.c: (setup_pipeline),
+ (test_basetransform_based):
+ Some test pipelines for the above (not entirely valgrind clean yet
+ apparently).
+
+2007-12-22 05:19:00 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/video/video.*: Add additional RGBA and RGB-24 video formats.
+ Original commit message from CVS:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ Add additional RGBA and RGB-24 video formats.
+
+2007-12-21 22:46:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Don't use GST_PLUGIN_DEFINE_STATIC, it's not portable and will be deprecated in the future (see #498924).
+ Original commit message from CVS:
+ * tests/check/elements/playbin.c: (test_sink_usage_video_only_stream),
+ (test_suburi_error_unknowntype), (test_suburi_error_invalidfile),
+ (test_suburi_error_wrongproto), (test_missing_primary_decoder):
+ * tests/check/libs/cddabasesrc.c: (GST_START_TEST), (GST_START_TEST),
+ (cddabasesrc_suite):
+ Don't use GST_PLUGIN_DEFINE_STATIC, it's not portable and will be
+ deprecated in the future (see #498924).
+
+2007-12-21 22:26:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreamselector.c: Don't leak event.
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c: (gst_selector_pad_event):
+ Don't leak event.
+
+2007-12-20 19:43:25 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst-libs/gst/riff/riff-read.c: Use GST_ROUND_UP_2 macro
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c:
+ Use GST_ROUND_UP_2 macro
+
+2007-12-20 17:13:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/.cvsignore: Ignore more.
+ Original commit message from CVS:
+ * gst/playback/.cvsignore:
+ Ignore more.
+
+2007-12-20 10:41:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Make switching off of subtitles work. To avoid all kind of problems with unlinking of the subtitle input, we just kee...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init):
+ * gst/playback/gstplaybasebin.c: (set_subtitles_visible),
+ (set_active_source):
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init),
+ (setup_sinks), (playbin_set_subtitles_visible):
+ Make switching off of subtitles work. To avoid all kind of
+ problems with unlinking of the subtitle input, we just keep
+ the subtitle inputs linked as they are and tell textoverlay
+ not to render them. Fixes #373011.
+ Other subtitle switching issues (esp. when there are both
+ external and in-stream subtitles) remain. They'll be solved
+ in playbin2.
+
+2007-12-18 16:21:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gststreamselector.c: Init the pad segment too.
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c: (gst_selector_pad_init):
+ Init the pad segment too.
+
+2007-12-18 15:56:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Improve debug output.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func),
+ (gst_audioringbuffer_open_device),
+ (gst_audioringbuffer_close_device), (gst_audioringbuffer_acquire),
+ (gst_audioringbuffer_release), (gst_audioringbuffer_start),
+ (gst_audioringbuffer_pause), (gst_audioringbuffer_stop),
+ (gst_audio_sink_create_ringbuffer):
+ Improve debug output.
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_start),
+ (gst_ring_buffer_pause), (gst_ring_buffer_delay):
+ Prevent some functions from doing things and failing when the
+ ringbuffer is not yet acquired.
+
+2007-12-18 15:32:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/interfaces/interfaces.h: Also remove interfaces.h from CVS as it is not needed anymore.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/interfaces.h:
+ Also remove interfaces.h from CVS as it is not needed anymore.
+
+2007-12-18 15:20:12 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/interfaces/Makefile.am: interfaces.h is not used anymore so remove it from the build process.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/Makefile.am:
+ interfaces.h is not used anymore so remove it from the build
+ process.
+
+2007-12-18 01:01:23 +0000 David Schleef <ds@schleef.org>
+
+ gst/videotestsrc/gstvideotestsrc.*: Add a "blink" pattern. Turn on the pain. Apologies. It's useful for testing ve...
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ Add a "blink" pattern. Turn on the pain. Apologies. It's useful
+ for testing vertical refresh synchronization.
+
+2007-12-18 00:13:26 +0000 David Schleef <ds@schleef.org>
+
+ Add new GstVideFormat enum and write a bunch of helper functions based around it.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/video/video.c:
+ * gst-libs/gst/video/video.h:
+ Add new GstVideFormat enum and write a bunch of helper functions
+ based around it.
+
+2007-12-17 23:41:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Makefile.am: Use new common/win32.mak.
+ Original commit message from CVS:
+ * Makefile.am:
+ Use new common/win32.mak.
+
+2007-12-17 16:44:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Add debug info.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create), (gst_base_audio_src_change_state):
+ Add debug info.
+ When going from PLAYING to PAUSED, pause the ringbuffer before calling
+ the parent state change function, just like the audiosink, because the
+ parent waits for the element to finish its processing before completing
+ the state change. This makes going to PAUSED a lot snappier.
+ When going from READY to PAUSED, don't allow the ringbuffer to start
+ yet.
+
+2007-12-17 00:01:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Yet another fix for broken software that produce files with an empty blockalign field...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Yet another fix for broken software that produce files with an empty
+ blockalign field. Instead of completely failing, make a second attempt
+ at guessing the width/depth by looking at strf->size.
+
+2007-12-16 23:52:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/: Turn a few g_assert_not_reached() into g_return_val_if_reached() to avoid compiler warnings (#503930).
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_do_seek),
+ (gst_cdda_base_src_handle_track_seek), (gst_cdda_base_src_create):
+ * gst-libs/gst/pbutils/install-plugins.c:
+ (gst_install_plugins_spawn_child), (gst_install_plugins_supported):
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ (gst_missing_plugin_message_get_installer_detail),
+ (gst_missing_encoder_installer_detail_new):
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (gst_rtsp_connection_send):
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (gst_rtsp_message_unset):
+ Turn a few g_assert_not_reached() into g_return_val_if_reached() to
+ avoid compiler warnings (#503930).
+
+2007-12-16 23:46:16 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Be apologetic of software that use the 'jpeg' instead of 'JPEG' FOURCC for jpeg video...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Be apologetic of software that use the 'jpeg' instead of 'JPEG' FOURCC
+ for jpeg video streams.
+ Add the 'avc1'/'AVC1' fourcc mapping for h264, same software-comment as
+ for the above modification.
+
+2007-12-15 17:27:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/xoverlay.c: More guards (we don't want klass to end up being NULL).
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/xoverlay.c: (gst_x_overlay_expose),
+ (gst_x_overlay_handle_events):
+ More guards (we don't want klass to end up being NULL).
+
+2007-12-15 03:40:34 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Use new gst_base_transform_set_gap_aware() function as volume correctly handles GST_BUFFER_FLAG_GAP. Require core 0.1...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/volume/gstvolume.c: (gst_volume_init):
+ Use new gst_base_transform_set_gap_aware() function as volume
+ correctly handles GST_BUFFER_FLAG_GAP. Require core 0.10.15.1
+ for this.
+
+2007-12-14 19:06:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Don't go to READY on EOS as this avoids testing of seeking and restarting after EOS, use ...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (msg_segment_done), (main):
+ Don't go to READY on EOS as this avoids testing of seeking and
+ restarting after EOS, use the stop button when you want to READY.
+ Don't try to do a flushing seek in segment-done, it does not make
+ sense to use this for gapless playback and is not needed.
+
+2007-12-14 18:46:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Use separate timers for input and output rates.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_init), (gst_queue_finalize),
+ (reset_rate_timer), (update_in_rates), (update_out_rates),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue),
+ (gst_queue_chain), (gst_queue_loop):
+ Use separate timers for input and output rates.
+ Pause measuring the output rate when we block for more data.
+ See #503262.
+
+2007-12-14 16:23:06 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst/speexresample/Makefile.am:
+ update spec file and add two missing files for disting
+ Original commit message from CVS:
+ update spec file and add two missing files for disting
+
+2007-12-14 09:24:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Pause the timer to measure the input rate when we block because the queue is filled. See #5...
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_chain):
+ Pause the timer to measure the input rate when we block because the
+ queue is filled. See #503262.
+
+2007-12-13 15:54:00 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Close control sockets. Fixes #503440.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_free):
+ Close control sockets. Fixes #503440.
+
+2007-12-13 12:31:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Expose the right pad in the right place with the right element.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (analyze_new_pad), (connect_pad):
+ Expose the right pad in the right place with the right element.
+
+2007-12-13 11:40:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Add description for 'private' dts caps (who come up with that name?).
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (formats):
+ Add description for 'private' dts caps (who come up with that name?).
+
+2007-12-13 10:10:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Makefile.am: Add check-exports target and run it with 'make check'.
+ Original commit message from CVS:
+ * Makefile.am:
+ Add check-exports target and run it with 'make check'.
+ * configure.ac:
+ Be stricter about what we export in our libraries: change regexp so that
+ we only export _gst_foo(), but not __gst_foo().
+ * gst-libs/gst/cdda/base64.h: (rfc822_binary):
+ * gst-libs/gst/cdda/sha1.h: (sha_init), (sha_update), (sha_final):
+ Change internal functions to __gst_foo so they dont' get exported.
+ * win32/common/libgstaudio.def:
+ Add missing symbols.
+
+2007-12-11 21:18:57 +0000 David Schleef <ds@schleef.org>
+
+ * ChangeLog:
+ ChangeLog: remove conflict markers
+ Original commit message from CVS:
+ ChangeLog: remove conflict markers
+
+2007-12-11 17:14:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/: Use gst_tag_freeform_string_to_utf8() here, which also takes into account any character sets specified...
+ Original commit message from CVS:
+ * ext/gnomevfs/Makefile.am:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_unicodify):
+ Use gst_tag_freeform_string_to_utf8() here, which also takes
+ into account any character sets specified by the user via
+ environment variables.
+
+2007-12-10 15:21:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audioconvert/Makefile.am: Also link to libm.
+ Original commit message from CVS:
+ * gst/audioconvert/Makefile.am:
+ Also link to libm.
+
+2007-12-10 15:13:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: No need for floating point operations here. avoids having to link against the math li...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ No need for floating point operations here. avoids having to link
+ against the math library too.
+
+2007-12-10 11:16:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add one or two missing formats. Generate ADPCM description dynamically depending on layout/format.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (formats),
+ (format_info_get_desc):
+ * tests/check/libs/pbutils.c: (GST_START_TEST), (caps_strings),
+ (GST_START_TEST):
+ Add one or two missing formats. Generate ADPCM description
+ dynamically depending on layout/format.
+
+2007-12-09 04:28:38 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ 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 18:38:39 +0000 Robin Stocker <robin.stocker@gmx.ch>
+
+ gst/subparse/gstsubparse.c: Some .srt files start with chunk number 0 and not chunk number 1, recognise and accept th...
+ Original commit message from CVS:
+ Patch by: Robin Stocker <robin dot stocker at gmx dot ch>
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_data_format_autodetect):
+ Some .srt files start with chunk number 0 and not chunk number 1,
+ recognise and accept those as well (fixes #502497).
+ * tests/check/elements/subparse.c: (srt_input), (srt_input0),
+ (test_src):
+ Add unit test for the above.
+
+2007-12-06 12:08:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplay-enum.*: Add missing files.
+ Original commit message from CVS:
+ * gst/playback/gstplay-enum.c:
+ (register_gst_autoplug_select_result),
+ (gst_autoplug_select_result_get_type):
+ * gst/playback/gstplay-enum.h:
+ Add missing files.
+
+2007-12-05 17:11:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/Makefile.am: Group decodebin2 and uridecodebin into the same plugin so that they can share the GEnumType.
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ Group decodebin2 and uridecodebin into the same plugin so that they
+ can share the GEnumType.
+ * gst/playback/gstdecodebin2.c: (_gst_array_accumulator),
+ (_gst_select_accumulator), (gst_decode_bin_class_init),
+ (gst_decode_bin_init), (gst_decode_bin_autoplug_sort),
+ (gst_decode_bin_autoplug_select), (gst_decode_bin_autoplug_add),
+ (analyze_new_pad), (connect_pad), (gst_decode_bin_plugin_init):
+ Add signal to sort factories instead of the more awkward autoplug-select
+ signal.
+ Modify autoplug_select so that we can try, skip or expose the
+ autopluggin of an element on a pad.
+ * gst/playback/gstfactorylists.c: (compare_ranks),
+ (decoders_filter), (sinks_filter), (gst_factory_list_is_type),
+ (element_filter), (gst_factory_list_get_elements),
+ (gst_factory_list_debug), (gst_factory_list_filter):
+ * gst/playback/gstfactorylists.h:
+ Simplify the API, allow getting elements based on mask.
+ * gst/playback/gstplay-marshal.list:
+ Add some more marshallers.
+ * gst/playback/gstplaybin2.c: (init_group), (gst_play_bin_init),
+ (gst_play_bin_finalize), (pad_removed_cb), (autoplug_factories_cb),
+ (autoplug_select_cb), (activate_group):
+ Add support for managing non-raw sinks by providing a custom element and
+ sink list to decodebin2.
+ Try to plug non-raw sinks when decodebin2 using autoplug-select of
+ decodebin2.
+ * gst/playback/gstplaysink.c: (gen_video_chain), (gen_audio_chain),
+ (gst_play_sink_set_mode), (gst_play_sink_request_pad):
+ * gst/playback/gstplaysink.h:
+ Add support for raw and non-raw sinks.
+ Add support to force sinks selected by playbin2.
+ Don't plug raw converters for non-raw sinks.
+ * gst/playback/gsturidecodebin.c: (_gst_array_accumulator),
+ (_gst_select_accumulator), (gst_uri_decode_bin_class_init),
+ (proxy_autoplug_select_signal), (gst_uri_decode_bin_plugin_init),
+ (plugin_init):
+ Use right accumulators.
+ Proxy new signal.
+
+2007-12-03 13:47:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Use runnning time as the base time instead of the timestamp.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push):
+ Use runnning time as the base time instead of the timestamp.
+ Spotted by Saur on IRC.
+
+2007-12-03 11:32:30 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Add 'WVC1' codec mapping for Windows Media VC-1 video codec.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Add 'WVC1' codec mapping for Windows Media VC-1 video codec.
+
+2007-12-03 10:58:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: If we find a new serial number but it does not contain a BOS page, make sure we initialize the...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_bisect_forward_serialno),
+ (gst_ogg_demux_read_chain):
+ If we find a new serial number but it does not contain a BOS page, make
+ sure we initialize the chain to NULL because else we will try to scan it
+ and crash. Fixes #500763
+
+2007-11-30 17:47:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Refactor some common code to filter factories and check caps compat.
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstfactorylists.c: (compare_ranks), (print_feature),
+ (get_feature_array), (decoders_filter), (sinks_filter),
+ (gst_factory_list_get_decoders), (gst_factory_list_get_sinks),
+ (gst_factory_list_filter):
+ * gst/playback/gstfactorylists.h:
+ Refactor some common code to filter factories and check caps compat.
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
+ (gst_decode_bin_init), (gst_decode_bin_dispose),
+ (gst_decode_bin_autoplug_continue),
+ (gst_decode_bin_autoplug_factories),
+ (gst_decode_bin_autoplug_select), (analyze_new_pad),
+ (find_compatibles):
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
+ (gst_play_bin_init), (gst_play_bin_finalize),
+ (autoplug_factories_cb), (activate_group):
+ * gst/playback/gstqueue2.c:
+ * gst/playback/gsturidecodebin.c: (proxy_unknown_type_signal),
+ (proxy_autoplug_continue_signal),
+ (proxy_autoplug_factories_signal), (proxy_autoplug_select_signal),
+ (proxy_drained_signal):
+ Add some more debug info and use factor filtering code.
+
+2007-11-26 13:19:46 +0000 Julien Moutte <julien@moutte.net>
+
+ configure.ac: Add QuickTime Wrapper plug-in.
+ Original commit message from CVS:
+ 2007-11-26 Julien Moutte <julien@fluendo.com>
+ * configure.ac: Add QuickTime Wrapper plug-in.
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_push_drain), (gst_speex_resample_process): Fix
+ build on Mac OS X Leopard. Incorrect printf format arguments.
+ * sys/Makefile.am:
+ * sys/qtwrapper/Makefile.am:
+ * sys/qtwrapper/audiodecoders.c:
+ (qtwrapper_audio_decoder_base_init),
+ (qtwrapper_audio_decoder_class_init),
+ (qtwrapper_audio_decoder_init),
+ (clear_AudioStreamBasicDescription), (fill_indesc_mp3),
+ (fill_indesc_aac), (fill_indesc_samr), (fill_indesc_generic),
+ (make_samr_magic_cookie), (open_decoder),
+ (qtwrapper_audio_decoder_sink_setcaps), (process_buffer_cb),
+ (qtwrapper_audio_decoder_chain),
+ (qtwrapper_audio_decoder_sink_event),
+ (qtwrapper_audio_decoders_register):
+ * sys/qtwrapper/codecmapping.c: (audio_caps_from_string),
+ (fourcc_to_caps):
+ * sys/qtwrapper/codecmapping.h:
+ * sys/qtwrapper/imagedescription.c: (image_description_for_avc1),
+ (image_description_for_mp4v), (image_description_from_stsd_buffer),
+ (image_description_from_codec_data):
+ * sys/qtwrapper/imagedescription.h:
+ * sys/qtwrapper/qtutils.c: (get_name_info_from_component),
+ (get_output_info_from_component), (dump_avcc_atom),
+ (dump_image_description), (dump_codec_decompress_params),
+ (addSInt32ToDictionary), (dump_cvpixel_buffer),
+ (DestroyAudioBufferList), (AllocateAudioBufferList):
+ * sys/qtwrapper/qtutils.h:
+ * sys/qtwrapper/qtwrapper.c: (plugin_init):
+ * sys/qtwrapper/qtwrapper.h:
+ * sys/qtwrapper/videodecoders.c:
+ (qtwrapper_video_decoder_base_init),
+ (qtwrapper_video_decoder_class_init),
+ (qtwrapper_video_decoder_init), (qtwrapper_video_decoder_finalize),
+ (fill_image_description), (new_image_description), (close_decoder),
+ (open_decoder), (qtwrapper_video_decoder_sink_setcaps),
+ (decompressCb), (qtwrapper_video_decoder_chain),
+ (qtwrapper_video_decoder_sink_event),
+ (qtwrapper_video_decoders_register): Initial import of QuickTime
+ wrapper jointly developped by Songbird authors (Pioneers of the
+ Inevitable) and Fluendo.
+
+2007-11-26 12:25:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Add GAP-flag support.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolume.h:
+ Add GAP-flag support.
+
+2007-11-26 08:43:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/: Update speex resampler to latest SVN. We're now down to only the changes noted in README again.
+ Original commit message from CVS:
+ * gst/speexresample/README:
+ * gst/speexresample/arch.h:
+ * gst/speexresample/resample.c: (resampler_basic_direct_single),
+ (resampler_basic_direct_double),
+ (resampler_basic_interpolate_single),
+ (resampler_basic_interpolate_double),
+ (speex_resampler_process_native), (speex_resampler_process_float),
+ (speex_resampler_process_int),
+ (speex_resampler_process_interleaved_float),
+ (speex_resampler_process_interleaved_int),
+ (speex_resampler_get_input_latency),
+ (speex_resampler_get_output_latency):
+ * gst/speexresample/speex_resampler.h:
+ Update speex resampler to latest SVN. We're now down to only the
+ changes noted in README again.
+ * gst/speexresample/speex_resampler_wrapper.h:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_push_drain), (gst_speex_resample_query):
+ Adjust to API changes.
+
+2007-11-24 15:02:01 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Increase the range of the rate selector as I would like to test QOS behavior at higher fo...
+ Original commit message from CVS:
+ 2007-11-24 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (main): Increase the range of the
+ rate selector as I would like to test QOS behavior at higher
+ forward and reverse playback speed like say 64x.
+
+2007-11-23 10:21:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Only post the latency message if we have a resampler state already.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_update_state):
+ Only post the latency message if we have a resampler state already.
+
+2007-11-23 10:21:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioresample/gstaudioresample.c: Implement latency query.
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init),
+ (audioresample_query), (audioresample_query_type),
+ (gst_audioresample_set_property):
+ Implement latency query.
+
+2007-11-23 10:01:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Also post GST_MESSAGE_LATENCY if the latency changes.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_update_state):
+ Also post GST_MESSAGE_LATENCY if the latency changes.
+
+2007-11-23 08:48:50 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/: Add functions to push the remaining samples and to get the latency of the resampler. These will g...
+ Original commit message from CVS:
+ * gst/speexresample/resample.c: (speex_resampler_get_latency),
+ (speex_resampler_drain_float), (speex_resampler_drain_int),
+ (speex_resampler_drain_interleaved_float),
+ (speex_resampler_drain_interleaved_int):
+ * gst/speexresample/speex_resampler.h:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ Add functions to push the remaining samples and to get the latency
+ of the resampler. These will get added to Speex SVN in this or a
+ slightly changed form at some point too and should get merged then
+ again.
+ * gst/speexresample/gstspeexresample.c: (gst_speex_resample_init),
+ (gst_speex_resample_init_state),
+ (gst_speex_resample_transform_size),
+ (gst_speex_resample_push_drain), (gst_speex_resample_event),
+ (gst_speex_fix_output_buffer), (gst_speex_resample_process),
+ (gst_speex_resample_query), (gst_speex_resample_query_type):
+ Drop the prepending zeroes and output the remaining samples on EOS.
+ Also properly implement the latency query for this. speexresample
+ should be completely ready for production use now.
+
+2007-11-21 18:02:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Our EOS time contains the base_time, _wait_eos() expects a running_time so we ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain):
+ Our EOS time contains the base_time, _wait_eos() expects a running_time
+ so we have to subtract the base_time again before calling the function.
+ This fixes an EOS regression where the base_time was added twice and EOS
+ took longer and longer in certain situations.
+ Fixes #498767.
+
+2007-11-21 13:04:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Expose methods for some object properties so that subclasses can more easily configure them.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type),
+ (gst_base_audio_sink_set_provide_clock),
+ (gst_base_audio_sink_get_provide_clock),
+ (gst_base_audio_sink_set_slave_method),
+ (gst_base_audio_sink_get_slave_method),
+ (gst_base_audio_sink_set_property),
+ (gst_base_audio_sink_get_property), (gst_base_audio_sink_drain),
+ (gst_base_audio_sink_none_slaving),
+ (gst_base_audio_sink_handle_slaving):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Expose methods for some object properties so that subclasses can more
+ easily configure them.
+ Added slave method none, that completely disables slaving to the
+ internal clock.
+ API: gst_base_audio_sink_set_provide_clock()
+ API: gst_base_audio_sink_get_provide_clock()
+ API: gst_base_audio_sink_set_slave_method()
+ API: gst_base_audio_sink_get_slave_method()
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_set_provide_clock),
+ (gst_base_audio_src_get_provide_clock),
+ (gst_base_audio_src_set_property),
+ (gst_base_audio_src_get_property), (gst_base_audio_src_create):
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ Expose methods for some object properties so that subclasses can more
+ easily configure them.
+ API: gst_base_audio_src_set_provide_clock()
+ API: gst_base_audio_src_get_provide_clock()
+
+2007-11-21 10:18:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/README: Add README explaining where the resampling code was taken from and which changes were done.
+ Original commit message from CVS:
+ * gst/speexresample/README:
+ Add README explaining where the resampling code was taken from
+ and which changes were done.
+ * gst/speexresample/resample.c: (speex_alloc), (speex_realloc),
+ (speex_free):
+ Use g_malloc() and friends instead of malloc() to achieve higher
+ portability and define the functions inline.
+ * gst/speexresample/speex_resampler.h:
+ Add back some useless preprocessor stuff to keep the diff between
+ our version and the one from the Speex SVN repository lower.
+
+2007-11-20 20:23:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: Some small cleanup and addition of a TODO item.
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_fix_output_buffer), (gst_speex_resample_transform):
+ Some small cleanup and addition of a TODO item.
+
+2007-11-20 12:56:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/Makefile.am: Add missing file.
+ Original commit message from CVS:
+ * gst/speexresample/Makefile.am:
+ Add missing file.
+
+2007-11-20 07:53:56 +0000 Joe Peterson <lavajoe@gentoo.org>
+
+ gst-libs/gst/sdp/gstsdpmessage.c: Fix compilation on FreeBSD (Gentoo). Fixes #498228.
+ Original commit message from CVS:
+ Patch by: Joe Peterson <lavajoe at gentoo dot org>
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ Fix compilation on FreeBSD (Gentoo). Fixes #498228.
+
+2007-11-20 07:47:27 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add speexresample to the docs and while at that do a make update.
+ 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-equalizer.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-gio.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/speexresample/gstspeexresample.h:
+ Add speexresample to the docs and while at that do a make update.
+
+2007-11-20 07:30:30 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/speexresample/gstspeexresample.c: If the resampler gives less output samples than expected adjust the output buff...
+ Original commit message from CVS:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_fix_output_buffer), (gst_speex_resample_process):
+ If the resampler gives less output samples than expected
+ adjust the output buffer and print a warning.
+
+2007-11-20 07:02:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add resample element based on the Speex resampling algorithm.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/speexresample/arch.h:
+ * gst/speexresample/fixed_generic.h:
+ * gst/speexresample/gstspeexresample.c:
+ (gst_speex_resample_base_init), (gst_speex_resample_class_init),
+ (gst_speex_resample_init), (gst_speex_resample_start),
+ (gst_speex_resample_stop), (gst_speex_resample_get_unit_size),
+ (gst_speex_resample_transform_caps),
+ (gst_speex_resample_init_state), (gst_speex_resample_update_state),
+ (gst_speex_resample_reset_state), (gst_speex_resample_parse_caps),
+ (gst_speex_resample_transform_size), (gst_speex_resample_set_caps),
+ (gst_speex_resample_event), (gst_speex_resample_check_discont),
+ (gst_speex_resample_process), (gst_speex_resample_transform),
+ (gst_speex_resample_set_property),
+ (gst_speex_resample_get_property), (plugin_init):
+ * gst/speexresample/gstspeexresample.h:
+ * gst/speexresample/resample.c: (speex_alloc), (speex_realloc),
+ (speex_free), (compute_func), (main), (sinc), (cubic_coef),
+ (resampler_basic_direct_single), (resampler_basic_direct_double),
+ (resampler_basic_interpolate_single),
+ (resampler_basic_interpolate_double), (update_filter),
+ (speex_resampler_init), (speex_resampler_init_frac),
+ (speex_resampler_destroy), (speex_resampler_process_native),
+ (speex_resampler_process_float), (speex_resampler_process_int),
+ (speex_resampler_process_interleaved_float),
+ (speex_resampler_process_interleaved_int),
+ (speex_resampler_set_rate), (speex_resampler_get_rate),
+ (speex_resampler_set_rate_frac), (speex_resampler_get_ratio),
+ (speex_resampler_set_quality), (speex_resampler_get_quality),
+ (speex_resampler_set_input_stride),
+ (speex_resampler_get_input_stride),
+ (speex_resampler_set_output_stride),
+ (speex_resampler_get_output_stride), (speex_resampler_skip_zeros),
+ (speex_resampler_reset_mem), (speex_resampler_strerror):
+ * gst/speexresample/speex_resampler.h:
+ * gst/speexresample/speex_resampler_float.c:
+ * gst/speexresample/speex_resampler_int.c:
+ * gst/speexresample/speex_resampler_wrapper.h:
+ Add resample element based on the Speex resampling algorithm.
+
+2007-11-19 12:30:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/libs/fft.c: Fix scaling to really have dB instead of something else.
+ Original commit message from CVS:
+ * tests/check/libs/fft.c: (GST_START_TEST):
+ Fix scaling to really have dB instead of something else.
+
+2007-11-19 12:08:16 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: There's a nice macro to check
+ Original commit message from CVS:
+ 2007-11-19 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (main): There's a nice macro to
+ check
+ GTK version, use it.
+
+2007-11-19 11:59:20 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Try to support stable version of GTK.
+ Original commit message from CVS:
+ 2007-11-19 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (main): Try to support stable version
+ of GTK.
+
+2007-11-17 15:25:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/: Fix the build + little README update.
+ Original commit message from CVS:
+ * gst/playback/README:
+ * gst/playback/test7.c:
+ Fix the build + little README update.
+
+2007-11-16 16:02:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add playbin2 seek pipeline.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (make_playerbin2_pipeline), (main):
+ Add playbin2 seek pipeline.
+
+2007-11-16 15:44:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Add playbin2.
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplayback.c: (plugin_init):
+ * gst/playback/test7.c: (update_scale), (warning_cb), (error_cb),
+ (eos_cb), (about_to_finish_cb), (main):
+ Add playbin2.
+ Added gapless playback example.
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c: (gst_play_bin_plugin_init):
+ * gst/playback/gstqueue2.c:
+ * gst/playback/test.c:
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init),
+ (pad_removed_cb):
+ * gst/playback/gststreaminfo.h:
+ Change email.
+ * gst/playback/gstplaybin2.c: (gst_play_bin_get_type),
+ (gst_play_bin_class_init), (init_group), (gst_play_bin_init),
+ (gst_play_bin_dispose), (gst_play_bin_set_uri),
+ (gst_play_bin_set_suburi), (gst_play_bin_set_property),
+ (gst_play_bin_get_property), (gst_play_bin_handle_message),
+ (pad_added_cb), (pad_removed_cb), (no_more_pads_cb), (perform_eos),
+ (drained_cb), (unlink_group), (activate_group),
+ (setup_next_source), (gst_play_bin_change_state),
+ (gst_play_bin2_plugin_init):
+ Added raw first version of playbin2. Does chained oggs and gapless
+ playback fine. No support for raw sinks yet. No visualisations or
+ subtitles yet.
+ * gst/playback/gstplaysink.c: (gst_play_sink_get_type),
+ (gst_play_sink_class_init), (gst_play_sink_init),
+ (gst_play_sink_dispose), (gst_play_sink_vis_unblocked),
+ (gst_play_sink_vis_blocked), (gst_play_sink_set_video_sink),
+ (gst_play_sink_set_audio_sink), (gst_play_sink_set_vis_plugin),
+ (gst_play_sink_set_property), (gst_play_sink_get_property),
+ (post_missing_element_message), (free_chain), (add_chain),
+ (activate_chain), (gen_video_chain), (gen_text_element),
+ (gen_audio_chain), (gen_vis_element), (gst_play_sink_get_mode),
+ (gst_play_sink_set_mode), (gst_play_sink_request_pad),
+ (gst_play_sink_release_pad), (gst_play_sink_send_event_to_sink),
+ (gst_play_sink_send_event), (gst_play_sink_change_state):
+ * gst/playback/gstplaysink.h:
+ Added Element that abstracts the sinks and their pipelines for playbin2.
+
+2007-11-16 15:05:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gststreamselector.*: Improve streamselector, make it select and unselect the current pad more intelligen...
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c: (gst_selector_pad_get_type),
+ (gst_selector_pad_class_init), (gst_selector_pad_init),
+ (gst_selector_pad_finalize), (gst_selector_pad_reset),
+ (gst_selector_pad_get_linked_pads), (gst_selector_pad_event),
+ (gst_selector_pad_getcaps), (gst_selector_pad_bufferalloc),
+ (gst_selector_pad_chain), (gst_stream_selector_get_type),
+ (gst_stream_selector_base_init), (gst_stream_selector_class_init),
+ (gst_stream_selector_init), (gst_stream_selector_set_property),
+ (gst_stream_selector_get_linked_pad),
+ (gst_stream_selector_getcaps),
+ (gst_stream_selector_is_active_sinkpad),
+ (gst_stream_selector_activate_sinkpad),
+ (gst_stream_selector_get_linked_pads),
+ (gst_stream_selector_request_new_pad),
+ (gst_stream_selector_release_pad):
+ * gst/playback/gststreamselector.h:
+ Improve streamselector, make it select and unselect the current pad more
+ intelligently.
+ Subclass GstPad for the sinkpads of the selector.
+ Handle segments more correctly.
+ Fix caps negotiation.
+ Implement release_pad.
+
+2007-11-16 12:51:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Add drained signal fired when decodebin finishes decoding the data.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
+ (gst_decode_group_check_if_drained), (source_pad_event_probe),
+ (remove_fakesink):
+ Add drained signal fired when decodebin finishes decoding the data.
+ Remove deprecated STATE_DIRTY message.
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init),
+ (unknown_type_cb), (new_decoded_pad_cb), (pad_removed_cb),
+ (analyse_source), (proxy_drained_signal), (make_decoder),
+ (source_new_pad), (value_list_append_structure_list),
+ (handle_redirect_message), (handle_message):
+ Proxy the new drained signal.
+ Handle pad removed from decodebin.
+ Handle redirect messages by sorting multiple redirections based on the
+ connection speed.
+
+2007-11-16 11:22:09 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ gst-libs/gst/rtsp/gstrtspmessage.c: Fix leaking headers. Fixes #496761.
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (gst_rtsp_message_unset):
+ Fix leaking headers. Fixes #496761.
+
+2007-11-16 11:16:58 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ sys/: Don't leak the PAR on errors. Fixes #496731.
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get),
+ (gst_ximagesink_change_state):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get):
+ Don't leak the PAR on errors. Fixes #496731.
+
+2007-11-16 10:14:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstid3tag.c: Add mapping for audio cd discid tags, so we can extract them from tags as well (see #34...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c: (user_tag_matches),
+ (gst_tag_from_id3_user_tag):
+ Add mapping for audio cd discid tags, so we can extract
+ them from tags as well (see #347848). Also compare identifiers
+ in ID3v2 TXXX frames in a case-insensitive way to increase
+ compatibility when reading tags (discid vs. DiscID vs. DiscId).
+
+2007-11-16 01:21:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-plugins-base.doap: Oops, fix the release name.
+ Original commit message from CVS:
+ * gst-plugins-base.doap:
+ Oops, fix the release name.
+
+2007-11-16 00:44:58 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-plugins-base.doap: Add 0.10.15 release
+ Original commit message from CVS:
+ * gst-plugins-base.doap:
+ Add 0.10.15 release
+
+2007-11-16 00:24:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.15 ===
+
+2007-11-16 00:14:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.15, "No need to argue"
+ Original commit message from CVS:
+ === release 0.10.15 ===
+ 2007-11-15 Jan Schmidt <jan.schmidt@sun.com>
+ * configure.ac:
+ releasing 0.10.15, "No need to argue"
+
+2007-11-16 00:04:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/hu.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-11-15 21:40:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/vs6/libgstfft.dsp: Convert line endings to DOS.
+ Original commit message from CVS:
+ * win32/vs6/libgstfft.dsp:
+ Convert line endings to DOS.
+
+2007-11-15 21:14:04 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/: Add a project file for fft plugin and remove socket based plugin which don't build from the workspace.* win32...
+ Original commit message from CVS:
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstfft.dsp:
+ * win32/MANIFEST:
+ Add a project file for fft plugin and remove socket
+ based plugin which don't build from the workspace.* win32/vs6/libgstaudio.dsp:
+ * win32/vs6/libgstrtp.dsp:
+ * win32/vs6/libgsttag.dsp:
+ Convert line endings back to DOS.
+ Fixes #496724
+
+2007-11-14 12:27:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/vs6/: Convert line endings back to DOS
+ Original commit message from CVS:
+ * win32/vs6/libgstinterfaces.dsp:
+ * win32/vs6/libgstrtsp.dsp:
+ Convert line endings back to DOS
+
+2007-11-14 11:08:48 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/fft/: Don't include malloc.h which doesn't exist on Mac OSX.
+ Original commit message from CVS:
+ * gst-libs/gst/fft/kiss_fft_f32.h:
+ * gst-libs/gst/fft/kiss_fft_f64.h:
+ * gst-libs/gst/fft/kiss_fft_s16.h:
+ * gst-libs/gst/fft/kiss_fft_s32.h:
+ Don't include malloc.h which doesn't exist on Mac OSX.
+ Instead, pull in glib.h and use g_malloc/g_free for
+ consistency. Fixes: #496548
+
+2007-11-09 15:54:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstdecodebin2.c: Dont leak ghostpad. Fixes #475451.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ Dont leak ghostpad. Fixes #475451.
+
+2007-11-09 12:21:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Update some more docs and comments.
+ Original commit message from CVS:
+ * docs/design/design-decodebin.txt:
+ * gst/playback/gstdecodebin2.c: (analyze_new_pad):
+ Update some more docs and comments.
+
+2007-11-07 16:47:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Require GIO >= 0.1.2 and adjust unit test for an API change.
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/check/pipelines/gio.c: (GST_START_TEST):
+ Require GIO >= 0.1.2 and adjust unit test for an API change.
+
+2007-11-07 15:18:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.h: Add macro to check if a stream supports seeking.
+ Original commit message from CVS:
+ * ext/gio/gstgio.h:
+ Add macro to check if a stream supports seeking.
+ * ext/gio/Makefile.am:
+ * ext/gio/gstgiobasesink.c: (gst_gio_base_sink_base_init),
+ (gst_gio_base_sink_class_init), (gst_gio_base_sink_init),
+ (gst_gio_base_sink_finalize), (gst_gio_base_sink_start),
+ (gst_gio_base_sink_stop), (gst_gio_base_sink_unlock),
+ (gst_gio_base_sink_unlock_stop), (gst_gio_base_sink_event),
+ (gst_gio_base_sink_render), (gst_gio_base_sink_query),
+ (gst_gio_base_sink_set_stream):
+ * ext/gio/gstgiobasesink.h:
+ * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_base_init),
+ (gst_gio_base_src_class_init), (gst_gio_base_src_init),
+ (gst_gio_base_src_finalize), (gst_gio_base_src_start),
+ (gst_gio_base_src_stop), (gst_gio_base_src_get_size),
+ (gst_gio_base_src_is_seekable), (gst_gio_base_src_unlock),
+ (gst_gio_base_src_unlock_stop), (gst_gio_base_src_check_get_range),
+ (gst_gio_base_src_create), (gst_gio_base_src_set_stream):
+ * ext/gio/gstgiobasesrc.h:
+ Refactor common GIO functions to GstGioBaseSink and GstGioBaseSrc
+ base classes that only require a GInputStream or GOutputStream to
+ work.
+ * ext/gio/gstgiosink.c: (gst_gio_sink_base_init),
+ (gst_gio_sink_class_init), (gst_gio_sink_init),
+ (gst_gio_sink_finalize), (gst_gio_sink_start):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.c: (gst_gio_src_base_init),
+ (gst_gio_src_class_init), (gst_gio_src_init),
+ (gst_gio_src_finalize), (gst_gio_src_start):
+ * ext/gio/gstgiosrc.h:
+ Use the newly created base classes here.
+ * ext/gio/gstgio.c: (plugin_init):
+ * ext/gio/gstgiostreamsink.c: (gst_gio_stream_sink_base_init),
+ (gst_gio_stream_sink_class_init), (gst_gio_stream_sink_init),
+ (gst_gio_stream_sink_finalize), (gst_gio_stream_sink_set_property),
+ (gst_gio_stream_sink_get_property):
+ * ext/gio/gstgiostreamsink.h:
+ * ext/gio/gstgiostreamsrc.c: (gst_gio_stream_src_base_init),
+ (gst_gio_stream_src_class_init), (gst_gio_stream_src_init),
+ (gst_gio_stream_src_finalize), (gst_gio_stream_src_set_property),
+ (gst_gio_stream_src_get_property):
+ * ext/gio/gstgiostreamsrc.h:
+ Implement GstGioStreamSink and GstGioStreamSrc that have a property
+ to set the GInputStream/GOutputStream that should be used.
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/.cvsignore:
+ * tests/check/pipelines/gio.c: (message_handler), (GST_START_TEST),
+ (gio_testsuite), (main):
+ Add unit test for giostreamsrc and giostreamsink.
+
+2007-11-07 11:48:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Remove nowadays unnecessary workaround for a crash.
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (plugin_init):
+ Remove nowadays unnecessary workaround for a crash.
+ * ext/gio/gstgiosink.c: (gst_gio_sink_finalize),
+ (gst_gio_sink_start), (gst_gio_sink_stop),
+ (gst_gio_sink_unlock_stop):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.c: (gst_gio_src_finalize), (gst_gio_src_start),
+ (gst_gio_src_stop), (gst_gio_src_unlock_stop):
+ * ext/gio/gstgiosrc.h:
+ Make the finalize function safer, clean up everything that could stay
+ around.
+ Reset the cancellable instead of creating a new one after cancelling
+ some operation.
+ Don't store the GFile in the element, it's only necessary for creating
+ the streams.
+
+2007-11-06 23:35:39 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/rtp/: Fix some C99-isms and and a missing function that some versions of
+ Original commit message from CVS:
+ Patch by: Sebastien Moutte <sebastien moutte net>
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_ntp_to_unix),
+ (gst_rtcp_unix_to_ntp):
+ * gst-libs/gst/rtp/gstrtppayloads.c: (gst_rtp_payload_info_for_name):
+ Fix some C99-isms and and a missing function that some versions of
+ MSVC don't like too much (#494346).
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstaudio.dsp:
+ * win32/vs6/libgstrtp.dsp:
+ * win32/vs6/libgsttag.dsp:
+ Update vs6 projects files (#494346).
+
+2007-11-06 16:38:49 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ win32/common/: More missing symbols to export (fixes #493986).
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstcdda.def:
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgstnetbuffer.def:
+ * win32/common/libgstpbutils.def:
+ * win32/common/libgstrtp.def:
+ * win32/common/libgstrtsp.def:
+ * win32/common/libgsttag.def:
+ * win32/common/libgstvideo.def:
+ More missing symbols to export (fixes #493986).
+
+2007-11-06 11:58:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Remove the magnitude and phase calculation functions as these have very special use cases and can't even be used for ...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/fft/gstfftf32.c:
+ * gst-libs/gst/fft/gstfftf32.h:
+ * gst-libs/gst/fft/gstfftf64.c:
+ * gst-libs/gst/fft/gstfftf64.h:
+ * gst-libs/gst/fft/gstffts16.c:
+ * gst-libs/gst/fft/gstffts16.h:
+ * gst-libs/gst/fft/gstffts32.c:
+ * gst-libs/gst/fft/gstffts32.h:
+ * tests/check/libs/fft.c: (GST_START_TEST):
+ Remove the magnitude and phase calculation functions as these have
+ very special use cases and can't even be used for the spectrum
+ element. Also adjust the docs to mention some properties of the used
+ FFT implemention, i.e. how the values are scaled. Fixes #492098.
+
+2007-11-06 11:09:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Avoid crash when there are external subtitles (fixes #491722).
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (queue_threshold_reached),
+ (finish_source):
+ Avoid crash when there are external subtitles (fixes #491722).
+
+2007-11-03 10:39:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/: 'Could not open resource for writing' is not an acceptable even less so when we're trying to open it to re...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_open):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_open):
+ 'Could not open resource for writing' is not an acceptable
+ error message when we can't open the audio device (see #492334),
+ even less so when we're trying to open it to record something.
+
+2007-11-02 21:03:01 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ win32/common/libgstrtp.def: Add some more missing symbols (#492813).
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * win32/common/libgstrtp.def:
+ Add some more missing symbols (#492813).
+
+2007-11-02 14:59:06 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ tests/check/elements/audioconvert.c: Add check to make sure that the out caps have a channel layout set on them where...
+ Original commit message from CVS:
+ Patch by: Thijs Vermeir <thijsvermeir@gmail.com>
+ * tests/check/elements/audioconvert.c: (verify_convert):
+ Add check to make sure that the out caps have a channel layout
+ set on them where they should have one.
+
+2007-11-01 13:28:59 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ gst-libs/gst/fft/: Include our own _stdint.h instead of sys/types.h, makes MingW happy (#492306).
+ Original commit message from CVS:
+ Patch by: Vincent Torri <vtorri at univ-evry dot fr>
+ * gst-libs/gst/fft/kiss_fft_s16.h: (KISS_FFT_S16_MALLOC):
+ * gst-libs/gst/fft/kiss_fft_s32.h: (KISS_FFT_S32_MALLOC):
+ Include our own _stdint.h instead of sys/types.h, makes MingW happy
+ (#492306).
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (gst_rtsp_connection_create):
+ Use _pipe directly, GLib doesn't have a pipe() macro any longer
+ (it disappeared in GLib 2.14.0) (#492306).
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ Fix includes and LIBS for win32/Mingw (#492306).
+ * tests/examples/dynamic/addstream.c (pause_play_stream):
+ Use more portable g_usleep() instead of sleep() (#492306).
+
+2007-11-01 12:51:57 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Return NULL instead of an enum that happens to be 0, fixes warning on MSVC (#4921...
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * gst-libs/gst/audio/gstringbuffer.c: (build_linear_format),
+ (gst_ring_buffer_parse_caps):
+ Return NULL instead of an enum that happens to be 0, fixes warning
+ on MSVC (#492114).
+ * gst-libs/gst/audio/gstringbuffer.h:
+ No trailing commas in enum list (for gcc-2.9x).
+ * gst/videotestsrc/videotestsrc.c: (random_char):
+ Make information loss explicit instead of implicitly truncating to
+ eight bits via the return value. Fixes runtime error on MSVC when
+ using the debug CRT (#492114).
+ * win32/common/config.h.in:
+ Fix a bunch of '#undef FOO bar', which MSVC doesn't like (#492114).
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgstrtp.def:
+ Export a few more symbols (#492114).
+
+2007-11-01 08:06:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/audio.*: Readd the deprecation guards, but preserve compilability.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ Readd the deprecation guards, but preserve compilability.
+
+2007-10-31 17:54:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/gstaudioconvert.c: Preserve channel layout when fixating the number of channels in the output caps, ...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (find_suitable_channel_layout),
+ (gst_audio_convert_fixate_channels), (gst_audio_convert_fixate_caps):
+ Preserve channel layout when fixating the number of channels in the
+ output caps, or make sure there's a suitable channel position layout
+ set on the caps if required. Fixes #430677.
+
+2007-10-31 17:32:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/decodebin.c: Make sure the pipeline really operates in push mode as it should in this case.
+ Original commit message from CVS:
+ * tests/check/elements/decodebin.c: (test_text_plain_streams):
+ Make sure the pipeline really operates in push mode as it should
+ in this case.
+
+2007-10-31 15:30:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/audio.h: Don't guard deprecated enum with #ifndef DISABLE_DEPRECATED, or compilation with DISABLE_...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.h:
+ Don't guard deprecated enum with #ifndef DISABLE_DEPRECATED, or
+ compilation with DISABLE_DEPRECATED and without REMOVE_DEPRECATED
+ (ie. normal cvs builds) will fail.
+
+2007-10-31 12:47:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tell gtk-doc about the deprecation guard. Apply more doc fixes.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/interfaces/mixer.c:
+ tell gtk-doc about the deprecation guard. Apply more doc fixes.
+
+2007-10-31 12:30:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/audio.c: Add simple unit test to make sure GstValue intersection of channel layouts works the way I ...
+ Original commit message from CVS:
+ * tests/check/libs/audio.c: (init_value_to_channel_layout),
+ (test_channel_layout_value_intersect), (audio_suite):
+ Add simple unit test to make sure GstValue intersection
+ of channel layouts works the way I think it does.
+
+2007-10-30 20:32:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix the docs according to what gtk-doc complained about.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ * gst-libs/gst/sdp/gstsdpmessage.c:
+ Fix the docs according to what gtk-doc complained about.
+
+2007-10-30 19:46:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/icles/stress-playbin.c: Fix the build.
+ Original commit message from CVS:
+ * tests/icles/stress-playbin.c:
+ Fix the build.
+
+2007-10-30 15:54:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Post nice/more useful error message if we don't have a decoder for the primary type.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (close_pad_link), (type_found):
+ * gst/playback/gstdecodebin2.c: (analyze_new_pad):
+ Post nice/more useful error message if we don't have a decoder for
+ the primary type.
+
+2007-10-30 15:07:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Be a bit more useful, unblock the pads after we fired the no-more-pads signal so that w...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_group_expose):
+ Be a bit more useful, unblock the pads after we fired the no-more-pads
+ signal so that we can use the signal to inspect and connect all pads
+ without having to keep extra state outside of decodebin.
+
+2007-10-30 15:00:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gsturidecodebin.c: Implement default signal handler so that we return TRUE when nothing is connected.
+ Original commit message from CVS:
+ * gst/playback/gsturidecodebin.c:
+ (gst_uri_decode_bin_autoplug_continue),
+ (gst_uri_decode_bin_class_init), (no_more_pads_full):
+ Implement default signal handler so that we return TRUE when nothing is
+ connected.
+
+2007-10-28 11:53:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Use the ALSA channel layout as default for wav files without channel layout informati...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c:
+ (gst_riff_wavext_add_channel_layout),
+ (gst_riff_wave_add_default_channel_layout),
+ (gst_riff_wavext_get_default_channel_mask),
+ (gst_riff_create_audio_caps):
+ Use the ALSA channel layout as default for wav files without channel
+ layout information. This fixes playback of chan-id.wav on 5.1 systems
+ for example. Also refactor the channel layout setting a bit and add
+ more default channel orders. Fixes #489010.
+
+2007-10-28 11:46:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * ChangeLog:
+ Use the ALSA channel layout as default for wav files without channel layout information. This fixes playback of chan-...
+ Original commit message from CVS:
+ (gst_riff_wavext_add_channel_layout),
+ (gst_riff_wave_add_default_channel_layout),
+ (gst_riff_wavext_get_default_channel_mask),
+ (gst_riff_create_audio_caps):
+ Use the ALSA channel layout as default for wav files without channel
+ layout information. This fixes playback of chan-id.wav on 5.1 systems
+ for example. Also refactor the channel layout setting a bit and add
+ more default channel orders. Fixes #489010.
+
+2007-10-26 18:57:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/tag.c: GST_TAG_MUSICBRAINZ_SORTNAME is deprecated and we compile with
+ Original commit message from CVS:
+ * tests/check/libs/tag.c: (test_musicbrainz_tag_registration):
+ GST_TAG_MUSICBRAINZ_SORTNAME is deprecated and we compile with
+ -DGST_DISABLE_DEPRECATED, so use new GST_TAG_ARTIST_SORTNAME
+ instead.
+
+2007-10-26 12:07:14 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2007-10-25 17:36:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Move subtitle encoding property to decodebin2 so that it can set the property value on ...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
+ (gst_decode_bin_dispose), (gst_decode_bin_set_caps),
+ (gst_decode_bin_set_subs_encoding),
+ (gst_decode_bin_get_subs_encoding), (gst_decode_bin_set_property),
+ (gst_decode_bin_get_property), (analyze_new_pad):
+ Move subtitle encoding property to decodebin2 so that it can set the
+ property value on all elements that it autoplugs and that require it.
+ Make caps refcounting more consistent in get/set.
+ * gst/playback/gsturidecodebin.c: (_gst_boolean_accumulator),
+ (gst_uri_decode_bin_class_init), (gst_uri_decode_bin_init),
+ (gst_uri_decode_bin_finalize), (gst_uri_decode_bin_set_property),
+ (gst_uri_decode_bin_get_property), (proxy_unknown_type_signal),
+ (proxy_autoplug_continue_signal),
+ (proxy_autoplug_factories_signal), (proxy_autoplug_select_signal),
+ (make_decoder):
+ Proxy properties and relevant signals from the internal decodebin.
+ Make properties MT safe.
+
+2007-10-25 15:10:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/: Deprecate GST_TAG_MUSICBRAINZ_SORTNAME, replaced by the newly-added
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tag.h: (GST_TAG_MUSICBRAINZ_SORTNAME):
+ * gst-libs/gst/tag/tags.c:
+ Deprecate GST_TAG_MUSICBRAINZ_SORTNAME, replaced by the newly-added
+ GST_TAG_ARTIST_SORTNAME (in an API and ABI compatible way).
+ * gst-libs/gst/tag/gstid3tag.c: (tag_matches):
+ Map ID3v2 TSOP, TSOA and TSOT frames to new SORTNAME tags (#414539).
+ * gst-libs/gst/tag/gstvorbistag.c: (tag_matches),
+ (gst_tag_to_vorbis_comments):
+ Map new SORTNAME tags (these tags aren't even semi-official, so I'm
+ just mapping everything I found in the wild) (#414539).
+
+2007-10-24 11:07:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Remove the autoplug-sort signal and replace it with a binding friendly autoplug-select signal.
+ Original commit message from CVS:
+ Inspired by patch of: René Stadler <mail at renestadler dot de>
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
+ (gst_decode_bin_autoplug_continue),
+ (gst_decode_bin_autoplug_factories),
+ (gst_decode_bin_autoplug_select), (analyze_new_pad), (connect_pad),
+ (find_compatibles):
+ * gst/playback/gstplay-marshal.list:
+ Remove the autoplug-sort signal and replace it with a binding friendly
+ autoplug-select signal.
+ Add an autoplug-factories signal that can be used to generate a list of
+ factories to try to autoplug.
+ Add the GstPad to the autoplugging signal args as it might be needed to
+ make a good factory selection.
+ Fix up the marshallers for this. Fixes #407282.
+
+2007-10-23 14:23:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gsttagdemux.c: Don't abort with an assertion if we receive a seek event with a start type of NONE (s...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ Don't abort with an assertion if we receive a seek event with
+ a start type of NONE (see launchpad bug #155878).
+
+2007-10-22 10:21:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/: Make sure that before we clean up the X resources, we shutdown and join the event thread.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_event_thread),
+ (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear),
+ (gst_ximagesink_change_state), (gst_ximagesink_reset):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_event_thread),
+ (gst_xvimagesink_xcontext_get), (gst_xvimagesink_xcontext_clear),
+ (gst_xvimagesink_change_state), (gst_xvimagesink_reset):
+ Make sure that before we clean up the X resources, we shutdown and join
+ the event thread.
+ Also make sure the event thread does not shut down immediatly after
+ startup because the running variable is not yet correctly set.
+ Fixes #378770.
+
+2007-10-16 16:48:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Make the window for a race in typefind and shutting down smaller until we figure out the...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (new_pad), (type_found):
+ Make the window for a race in typefind and shutting down smaller until
+ we figure out the right locking here. Avoids #485753 usually.
+ * gst/playback/gstdecodebin2.c: (type_found), (pad_added_group_cb):
+ Remove unneeded lock causing a race in typefind and shutting down.
+ Fixes #485753.
+ * gst/playback/gstplaybin.c: (gst_play_bin_change_state):
+ Also remove sinks when going to NULL because we might not complete the
+ state change to PAUSED, causing the PAUSED->READY state change not to
+ happen.
+
+2007-10-16 15:33:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Also explicitly release the ringbuffer when going to NULL because it is requir...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain), (gst_base_audio_sink_change_state):
+ Also explicitly release the ringbuffer when going to NULL because it
+ is required in the setcaps function, before the state change to PAUSED
+ completes.
+
+2007-10-16 14:58:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/icles/: Does what it says on the tin.
+ Original commit message from CVS:
+ * tests/icles/.cvsignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/stress-playbin.c:
+ Does what it says on the tin.
+
+2007-10-15 11:38:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Fix queue negotiation. See #486758.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_init), (gst_queue_push_one):
+ Fix queue negotiation. See #486758.
+
+2007-10-12 10:52:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Actual code change to go along with:
+ Original commit message from CVS:
+ Actual code change to go along with:
+ 2007-10-12 Jan Schmidt <Jan.Schmidt@sun.com>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate),
+ (gst_xvimagesink_xwindow_new),
+ (gst_xvimagesink_update_colorbalance),
+ (gst_xvimagesink_handle_xevents), (gst_xvimagesink_xcontext_get):
+ Fix handling of some of the X atoms. If the last parameter is True,
+ XInternAtom won't create the atom if it doesn't exist, and therefore
+ might return None. This causes X errors on Xv implementations that
+ don't provide the colour balance attributes.
+
+2007-10-12 10:37:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Remove stray character from the changelog.
+ Original commit message from CVS:
+ Remove stray character from the changelog.
+
+2007-10-12 10:33:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ I'm too lazy to comment this
+ Original commit message from CVS:
+ *** empty log message ***
+
+2007-10-11 18:24:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Extract vorbis comment LICENSE tags correctly.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * tests/check/libs/tag.c:
+ Extract vorbis comment LICENSE tags correctly.
+
+2007-10-11 16:12:21 +0000 Jason Kivlighn <jkivlighn@gmail.com>
+
+ Map ID3v2 WCOP frame to GST_TAG_COPYRIGHT_URI (#447000).
+ Original commit message from CVS:
+ Patch by: Jason Kivlighn <jkivlighn gmail com>
+ * gst-libs/gst/tag/gstid3tag.c:
+ * tests/check/libs/tag.c:
+ Map ID3v2 WCOP frame to GST_TAG_COPYRIGHT_URI (#447000).
+
+2007-10-10 17:01:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gsttagdemux.c: Don't error out when a buggy downstream element doesn't handle the newsegment event w...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ Don't error out when a buggy downstream element doesn't
+ handle the newsegment event we send properly (especially
+ not without posting a meaningful error message on the
+ bus). See bug #471370 and launchpad bug #136264.
+
+2007-10-10 15:36:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Use new basesink method to make our EOS drain interruptable.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain):
+ Use new basesink method to make our EOS drain interruptable.
+
+2007-10-10 09:37:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtp/gstrtppayloads.c: Fix silly search-replace oversight.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtppayloads.c:
+ Fix silly search-replace oversight.
+
+2007-10-09 09:57:17 +0000 Laurent Glayal <spglegle@yahoo.fr>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Fix caps memleak. Fixes #484989.
+ Original commit message from CVS:
+ Patch by: Laurent Glayal <spglegle at yahoo dot fr>
+ * gst-libs/gst/rtp/gstbasertppayload.c: (copy_fixed),
+ (gst_basertppayload_set_outcaps):
+ Fix caps memleak. Fixes #484989.
+
+2007-10-08 18:04:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Fix debug output.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps), (gst_base_rtp_depayload_chain):
+ Fix debug output.
+
+2007-10-08 18:02:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Also handle the case where there is no clock set on the audio source, like in t...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Also handle the case where there is no clock set on the audio source,
+ like in the unit tests.
+
+2007-10-08 17:40:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtp/gstrtppayloads.c: Use unsigned G_MAXUINT8 instead of -1 to initialise a guint8 to avoid compiler war...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtppayloads.c:
+ Use unsigned G_MAXUINT8 instead of -1 to initialise a guint8
+ to avoid compiler warnings
+
+2007-10-08 17:12:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Don't disconnect the have_type signal because we never reconnect it later on. Instead keep a variable ...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (type_found),
+ (gst_decode_bin_change_state):
+ * gst/playback/gstdecodebin2.c: (type_found),
+ (gst_decode_bin_change_state):
+ Don't disconnect the have_type signal because we never reconnect it
+ later on. Instead keep a variable to see if we already detected a type.
+
+2007-10-08 10:47:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Unlink the signal handler when we found the type, we're not going to do anything sensible with more ty...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (add_fakesink), (type_found):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_init),
+ (type_found):
+ Unlink the signal handler when we found the type, we're not going to do
+ anything sensible with more type_found signals anyway.
+
+2007-10-08 06:07:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgio.c: Use GIO function to get a list of supported URI schemes instead of hard coding something.
+ Original commit message from CVS:
+ * ext/gio/gstgio.c: (gst_gio_get_supported_protocols):
+ Use GIO function to get a list of supported URI schemes instead of
+ hard coding something.
+
+2007-10-06 16:49:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gsttagdemux.c: Don't leak caps.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ Don't leak caps.
+
+2007-10-06 15:04:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/: API: add GstTagDemux base class for simple tag demuxers.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gsttagdemux.c:
+ * gst-libs/gst/tag/gsttagdemux.h:
+ API: add GstTagDemux base class for simple tag demuxers.
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Add GstTagDemux to docs.
+
+2007-10-05 07:49:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Fix bug introduced with last commit which inverted the logic and caused all buffers ...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_get_payload_subbuffer):
+ Fix bug introduced with last commit which inverted the logic and
+ caused all buffers to be dropped. Fixes #483620.
+ Thanks to Laurent Glayal <spglegle at yahoo dot fr> for noticing.
+
+2007-10-04 06:50:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: with regular return and warning.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ Replace g_return_if_val (as it could be disabled), with regular return
+ and warning.
+
+2007-10-03 14:51:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/pipelines/simple-launch-lines.c: Print message name and not just number.
+ Original commit message from CVS:
+ * tests/check/pipelines/simple-launch-lines.c:
+ Print message name and not just number.
+
+2007-10-02 11:11:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: When slaved to the clock, don't try to align a sample with the previous one wh...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_async_play):
+ When slaved to the clock, don't try to align a sample with the previous
+ one when going to PLAYING again.
+
+2007-10-02 09:04:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/snapshot/snapshot.c: Fix the build.
+ Original commit message from CVS:
+ * tests/examples/snapshot/snapshot.c:
+ Fix the build.
+
+2007-10-02 07:43:57 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/gstgiosink.c: Update to API changes in GIO.
+ Original commit message from CVS:
+ * ext/gio/gstgiosink.c: (gst_gio_sink_start):
+ Update to API changes in GIO.
+
+2007-10-01 16:33:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.h: Add RFC 3556 bandwidth modifiers.
+ Original commit message from CVS:
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ Add RFC 3556 bandwidth modifiers.
+
+2007-10-01 13:37:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Update documentation.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtppayloads.c:
+ Update documentation.
+
+2007-10-01 13:22:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/: Added new file and header to deal with payload info.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtp/gstrtppayloads.c: (gst_rtp_payload_info_for_pt),
+ (gst_rtp_payload_info_for_name):
+ * gst-libs/gst/rtp/gstrtppayloads.h:
+ Added new file and header to deal with payload info.
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data),
+ (gst_rtp_buffer_default_clock_rate):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Payload specific stuff is move to new headers.
+ Implement _default_clock rate using the new payload function.
+ * gst-libs/gst/sdp/gstsdpmessage.c: (is_multicast_address),
+ (gst_sdp_parse_line):
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ Add some more comments.
+
+2007-10-01 10:22:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefind function for application/sdp.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (utf8_type_find),
+ (sdp_check_header), (sdp_type_find), (plugin_init):
+ Add typefind function for application/sdp.
+ Remove some old dirac typefind code that was ifdeffed out.
+
+2007-09-29 12:04:02 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstaudio.def: Add new exported functions.
+ Original commit message from CVS:
+ * win32/common/libgstaudio.def:
+ Add new exported functions.
+ * win32/vs6/grammar.dsp:
+ Add autogeneration and copy of some autegenerated files from win32/common
+ for rtsp library.
+ * win32/vs6/libgstaudioconvert.dsp:
+ Add gstaudioquantize.c to the build.
+ * win32/vs6/libgstinterfaces.dsp:
+ Add videoorientation.c to the build.
+ * win32/vs6/libgstriff.dsp:
+ Add libgsttag to the link libraries list.
+ * win32/vs6/libgstvolume.dsp:
+ Add liboil to the link.
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstrtsp.dsp:
+ * win32/common/libgstrtsp.def:
+ Add files to build libgstrtsp library.
+
+2007-09-29 07:01:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/gio/: Some minor cleanup and allow setting the location only when the element is not playing or paused.
+ Original commit message from CVS:
+ * ext/gio/gstgiosink.c: (gst_gio_sink_base_init),
+ (gst_gio_sink_set_property), (gst_gio_sink_render):
+ * ext/gio/gstgiosrc.c: (gst_gio_src_base_init),
+ (gst_gio_src_set_property):
+ Some minor cleanup and allow setting the location only when the
+ element is not playing or paused.
+
+2007-09-26 15:14:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/snapshot/snapshot.c: Print error when pipeline failed to construct.
+ Original commit message from CVS:
+ * tests/examples/snapshot/snapshot.c: (main):
+ Print error when pipeline failed to construct.
+
+2007-09-25 19:06:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add mappings for the new GST_TAG_COMPOSER for vorbis comments and ID3v2 tags.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Add mappings for the new GST_TAG_COMPOSER for vorbis comments
+ and ID3v2 tags.
+
+2007-09-25 11:54:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/floatcast/floatcast.h: Don't include config.h in an installed public header, this might break compilatio...
+ Original commit message from CVS:
+ * gst-libs/gst/floatcast/floatcast.h:
+ Don't include config.h in an installed public header, this
+ might break compilation of applications that don't have such
+ a header and doesn't necessarily do what it's supposed to do
+ anyway (ie. check for the lrint/lrintf defines) (#442065).
+ Add docs for the various macros and document how this header
+ has to be used (link against libm, etc.); add a few FIXMEs;
+ include math.h for non-c99 code path. Based on patch by
+ Jan Schmidt.
+
+2007-09-25 07:50:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Use AG_GST_ARG_WITH_PLUGINS and AG_GST_ARG_ENABLE_EXTERNAL instead of duplicating these macros in confi...
+ Original commit message from CVS:
+ * configure.ac:
+ Use AG_GST_ARG_WITH_PLUGINS and AG_GST_ARG_ENABLE_EXTERNAL instead
+ of duplicating these macros in configure.ac.
+
+2007-09-22 17:58:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Updated translations to 0.10.14
+ Original commit message from CVS:
+ * po/hu.po:
+ * po/sv.po:
+ * po/uk.po:
+ Updated translations to 0.10.14
+
+2007-09-22 17:57:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/LINGUAS:
+ add languages
+ Original commit message from CVS:
+ add languages
+
+2007-09-22 17:56:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/pl.po: Added Polish translation.
+ Original commit message from CVS:
+ translated by: Jakub Bogusz <qboosh@pld-linux.org>
+ * po/pl.po:
+ Added Polish translation.
+
+2007-09-22 17:55:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/fi.po: Added Finnish translation.
+ Original commit message from CVS:
+ translated by: Ilkka Tuohela <hile@iki.fi>
+ * po/fi.po:
+ Added Finnish translation.
+
+2007-09-22 17:54:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/es.po: Added Spanish translation.
+ Original commit message from CVS:
+ translated by: Jorge González González <aloriel@gmail.com>
+ * po/es.po:
+ Added Spanish translation.
+
+2007-09-22 17:53:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/da.po: Added Danish translation.
+ Original commit message from CVS:
+ translated by: Mogens Jaeger <mogens@jaeger.tf>
+ * po/da.po:
+ Added Danish translation.
+
+2007-09-22 17:52:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/zh_CN.po: Added Chinese (simplified) translation.
+ Original commit message from CVS:
+ translated by: Funda Wang <fundawang@linux.net.cn>
+ * po/zh_CN.po:
+ Added Chinese (simplified) translation.
+
+2007-09-22 17:51:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/bg.po: Added Bulgarian translation.
+ Original commit message from CVS:
+ translated by: Alexander Shopov <ash@contact.bg>
+ * po/bg.po:
+ Added Bulgarian translation.
+
+2007-09-21 18:00:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/plugins/gst-plugins-bad-plugins.hierarchy: Update hierarchy.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-bad-plugins.hierarchy:
+ Update hierarchy.
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.h:
+ Mark private fields of the instance structs private.
+
+2007-09-21 17:31:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/plugins/: Add the GIO plugin to the docs and do a make update while doing that.
+ 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-dfbvideosink.xml:
+ * docs/plugins/inspect/plugin-dtsdec.xml:
+ * docs/plugins/inspect/plugin-equalizer.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-gio.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:
+ Add the GIO plugin to the docs and do a make update
+ while doing that.
+ * ext/gio/gstgiosrc.c: (gst_gio_src_start):
+ Fix a small memleak.
+
+2007-09-21 17:07:56 +0000 René Stadler <mail@renestadler.de>
+
+ Add a GIO/GVFS plugin with source and sink elements. This will only be enabled when --enable-experimental is given to...
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * configure.ac:
+ * ext/Makefile.am:
+ * ext/gio/Makefile.am:
+ * ext/gio/gstgio.c: (gst_gio_error), (gst_gio_seek),
+ (gst_gio_get_supported_protocols),
+ (gst_gio_uri_handler_get_type_sink),
+ (gst_gio_uri_handler_get_type_src),
+ (gst_gio_uri_handler_get_protocols), (gst_gio_uri_handler_get_uri),
+ (gst_gio_uri_handler_set_uri), (gst_gio_uri_handler_init),
+ (gst_gio_uri_handler_do_init), (plugin_init):
+ * ext/gio/gstgio.h:
+ * ext/gio/gstgiosink.c: (gst_gio_sink_base_init),
+ (gst_gio_sink_class_init), (gst_gio_sink_init),
+ (gst_gio_sink_finalize), (gst_gio_sink_set_property),
+ (gst_gio_sink_get_property), (gst_gio_sink_start),
+ (gst_gio_sink_stop), (gst_gio_sink_unlock),
+ (gst_gio_sink_unlock_stop), (gst_gio_sink_event),
+ (gst_gio_sink_render), (gst_gio_sink_query):
+ * ext/gio/gstgiosink.h:
+ * ext/gio/gstgiosrc.c: (gst_gio_src_base_init),
+ (gst_gio_src_class_init), (gst_gio_src_init),
+ (gst_gio_src_finalize), (gst_gio_src_set_property),
+ (gst_gio_src_get_property), (gst_gio_src_start),
+ (gst_gio_src_stop), (gst_gio_src_get_size),
+ (gst_gio_src_is_seekable), (gst_gio_src_unlock),
+ (gst_gio_src_unlock_stop), (gst_gio_src_check_get_range),
+ (gst_gio_src_create):
+ * ext/gio/gstgiosrc.h:
+ Add a GIO/GVFS plugin with source and sink elements. This will
+ only be enabled when --enable-experimental is given to configure
+ for now as the GIO API is not stable yet. Fixes #476916.
+
+2007-09-21 14:37:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Fix compilation wrt printf arguments.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_push_one):
+ Fix compilation wrt printf arguments.
+
+2007-09-20 17:38:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ examples/app/appsrc_ex.c: Fix compilation after changing the name of a method.
+ Original commit message from CVS:
+ * examples/app/appsrc_ex.c: (main):
+ Fix compilation after changing the name of a method.
+
+2007-09-20 14:09:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add simple snapshot example program using appsink.
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/snapshot/.cvsignore:
+ * tests/examples/snapshot/Makefile.am:
+ * tests/examples/snapshot/snapshot.c: (main):
+ Add simple snapshot example program using appsink.
+
+2007-09-20 13:59:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.*: Add properties, signals and actions to access the element even without linking to the ...
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_marshal_OBJECT__VOID),
+ (gst_app_sink_class_init), (gst_app_sink_init),
+ (gst_app_sink_dispose), (gst_app_sink_finalize),
+ (gst_app_sink_set_property), (gst_app_sink_get_property),
+ (gst_app_sink_flush_unlocked), (gst_app_sink_start),
+ (gst_app_sink_event), (gst_app_sink_getcaps),
+ (gst_app_sink_set_caps), (gst_app_sink_get_caps),
+ (gst_app_sink_is_eos), (gst_app_sink_pull_preroll),
+ (gst_app_sink_pull_buffer):
+ * gst-libs/gst/app/gstappsink.h:
+ Add properties, signals and actions to access the element even without
+ linking to the library.
+ Fix some method names and signatures.
+
+2007-09-20 10:37:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/generic/states.c: Improved state change unit test.
+ Original commit message from CVS:
+ * tests/check/generic/states.c:
+ Improved state change unit test.
+
+2007-09-19 18:16:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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:09:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Only copy timestamp on outgoing packets if the depayloader did not set one.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Only copy timestamp on outgoing packets if the depayloader did not set
+ one.
+ Also copy duration on outgoing packets.
+
+2007-09-19 15:55:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Fix compilation because of missing %d in printf.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c: (copy_fixed),
+ (gst_basertppayload_set_outcaps):
+ Fix compilation because of missing %d in printf.
+ When fixating caps, fixate what we can and throw away all remaining
+ unfixed caps, subclasses should do something smart if they need to.
+
+2007-09-19 12:04:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Improve debug logs a bit and be more verbose if things go wrong.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Improve debug logs a bit and be more verbose if things go wrong.
+
+2007-09-17 17:24:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix a bunch of compile warnings shown with Forte.
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init),
+ (gst_text_overlay_set_property):
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_ntp_to_unix),
+ (gst_rtcp_unix_to_ntp):
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (gst_rtsp_message_get_type):
+ * gst/playback/gstqueue2.c:
+ * tests/examples/seek/seek.c: (set_scale):
+ Fix a bunch of compile warnings shown with Forte.
+ * gst/audiorate/gstaudiorate.c:
+ Always pull in config.h before including any system headers.
+
+2007-09-17 16:22:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Also fix #476514 for queue2.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (update_buffering),
+ (gst_queue_locked_flush), (gst_queue_locked_enqueue),
+ (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_push_one), (gst_queue_sink_activate_push),
+ (gst_queue_src_activate_push), (gst_queue_src_activate_pull):
+ Also fix #476514 for queue2.
+
+2007-09-16 19:31:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Remove code to deal with RTP to GST time conversion, we now just copy the GST...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_init), (gst_base_rtp_depayload_setcaps),
+ (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_handle_sink_event),
+ (gst_base_rtp_depayload_push_full),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_change_state):
+ Remove code to deal with RTP to GST time conversion, we now just copy
+ the GST timestamp we receive to the outgoing buffers.
+ Handle segment and flushes correctly.
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push):
+ When we have no valid input timestamp, use the previous rtp timestamp on
+ the outgoing RTP packet instead of the RTP base time.
+
+2007-09-16 01:56:21 +0000 David Schleef <ds@schleef.org>
+
+ ext/alsa/: Change alsa alloca's to malloc to fix warnings on gcc-4.2.
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c:
+ * ext/alsa/gstalsadeviceprobe.c:
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c:
+ Change alsa alloca's to malloc to fix warnings on gcc-4.2.
+
+2007-09-15 18:41:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Add some debug info when negotiating caps.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_set_outcaps), (gst_basertppayload_push):
+ Add some debug info when negotiating caps.
+
+2007-09-15 00:29:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: A buffer with an empty payload is also a valid buffer.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data):
+ A buffer with an empty payload is also a valid buffer.
+
+2007-09-14 20:52:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Make sure we start our RTP timestamp from the random base RTP timestamp even if...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_event),
+ (gst_basertppayload_set_outcaps), (gst_basertppayload_push),
+ (gst_basertppayload_change_state):
+ Make sure we start our RTP timestamp from the random base RTP
+ timestamp even if the buffer timestamp starts from some random value.
+
+2007-09-14 16:56:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add simple exmple app to demonstrate starting and pausing live and non-live bins in a PLAYING pipeline.
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/dynamic/.cvsignore:
+ * tests/examples/dynamic/Makefile.am:
+ * tests/examples/dynamic/addstream.c: (create_stream),
+ (pause_play_stream), (message_received), (eos_message_received),
+ (perform_step), (main):
+ Add simple exmple app to demonstrate starting and pausing live and
+ non-live bins in a PLAYING pipeline.
+
+2007-09-14 10:42:00 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add some typefind for QCP files (RFC #3625)
+ Original commit message from CVS:
+ 2007-09-14 Julien MOUTTE <julien@moutte.net>
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add some
+ typefind for QCP files (RFC #3625)
+
+2007-09-13 22:52:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Disable pull mode scheduling, we're not ready for it yet and it subtly breaks ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_init):
+ Disable pull mode scheduling, we're not ready for it yet and it subtly
+ breaks a lot of things.
+
+2007-09-12 17:35:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/libvisual.c: Test all libvisual plugins, not just the first one; this reproduces bug #450336 qui...
+ Original commit message from CVS:
+ * tests/check/elements/libvisual.c:
+ Test all libvisual plugins, not just the first one; this reproduces
+ bug #450336 quite easily. Looks like a problem with the 'jess'
+ visualisation.
+
+2007-09-12 17:15:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add basic libvisual test case in an attempt to reproduce bug #450336.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/libvisual.c:
+ Add basic libvisual test case in an attempt to reproduce bug #450336.
+ Doesn't reproduce that bug, but some other crasher instead (invalid
+ free), at least with make elements/libvisual.forever and the bumscope
+ plugin on x86-64/gutsy. Leaving test disabled for now.
+
+2007-09-12 08:38:21 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/: Printf format fixes (#476128).
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * 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 19:07:57 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.c: Make sure we can not cancel in the middle of receiving a message.
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_read_internal), (gst_rtsp_connection_read),
+ (read_body), (gst_rtsp_connection_receive):
+ Make sure we can not cancel in the middle of receiving a message.
+ Fixes #475731.
+
+2007-09-11 11:29:12 +0000 Josep Torra Valles <josep@fluendo.com>
+
+ gst/playback/gstplaybasebin.c: Increase upper limit for audio queue a bit; fixes preroll problem with playbin and dec...
+ Original commit message from CVS:
+ Patch by: Josep Torra Valles <josep@fluendo.com>
+ * gst/playback/gstplaybasebin.c:
+ Increase upper limit for audio queue a bit; fixes preroll problem
+ with playbin and decodebin2 when playing a quicktime trailer with
+ multichannel audio via http (#464666).
+
+2007-09-10 22:10:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.*: Allow othe clocks than the internal clock to be used for the pipeline.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init), (gst_base_audio_src_init),
+ (gst_base_audio_src_provide_clock),
+ (gst_base_audio_src_set_property),
+ (gst_base_audio_src_get_property), (gst_base_audio_src_create):
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ Allow othe clocks than the internal clock to be used for the pipeline.
+ Add property to disable clock provide.
+ API: GstBaseAudioSrc::provide-clock
+
+2007-09-10 12:05:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gstdecodebin2.c: Don't leak request pads. Fixes #475395.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ Don't leak request pads. Fixes #475395.
+
+2007-09-09 10:25:43 +0000 René Stadler <mail@renestadler.de>
+
+ sys/: Correctly chain up finalize with the parent class to prevent memory leaks. Fixes #474880.
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * sys/ximage/ximagesink.c: (gst_ximage_buffer_finalize),
+ (gst_ximage_buffer_class_init):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimage_buffer_class_init):
+ Correctly chain up finalize with the parent class to prevent
+ memory leaks. Fixes #474880.
+
+2007-09-09 04:08:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Revert the latest change: floating point samples are allowed to have any value, not only values in the range [-1,1]. ...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_choose_func):
+ * tests/check/elements/volume.c: (GST_START_TEST):
+ Revert the latest change: floating point samples are allowed to
+ have any value, not only values in the range [-1,1]. Thanks to Andy
+ Wingo for noticing.
+ Also fix processing of int32 samples with volumes > 4 by making the
+ unity value smaller which prevents overflows.
+
+2007-09-07 17:37:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Fix gst_rtp_buffer_set_csrc() and enable csrc-related unit test checks.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * tests/check/libs/rtp.c:
+ Fix gst_rtp_buffer_set_csrc() and enable csrc-related unit test checks.
+
+2007-09-07 16:46:05 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Fix up GstRTPHeader helper struct so that compilers will not under any circumstances...
+ Original commit message from CVS:
+ Based on patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ Fix up GstRTPHeader helper struct so that compilers will not under
+ any circumstances add padding in between our fields, as currently
+ happens with MSVC on win32, because that would lead to us sending
+ out RTP payloads with broken RTP headers (#471194).
+ Fix assertion guards for gst_rtp_buffer_get_csrc() and _set_csrc().
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/rtp.c:
+ Add some simple unit tests for GstRTPBuffer. Some are disabled
+ because the code tested still needs fixing (set_csrc() does not work).
+
+2007-09-07 15:05:24 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update spec file to include latest RTSP libraries and headers and more
+ Original commit message from CVS:
+ update spec file to include latest RTSP libraries and headers and more
+
+2007-09-07 12:41:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/: Add rtsp enumtypes (#474384) and update others.
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ * win32/common/gstrtsp-enumtypes.c:
+ * win32/common/gstrtsp-enumtypes.h:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/interfaces-enumtypes.h:
+ * win32/common/multichannel-enumtypes.c:
+ Add rtsp enumtypes (#474384) and update others.
+
+2007-09-06 20:31:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Fix configure check for HAVE_LIBXML_HTML.
+ Original commit message from CVS:
+ * configure.ac:
+ Fix configure check for HAVE_LIBXML_HTML.
+
+2007-09-06 12:14:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/.cvsignore: Ignore more, in case the build bots work again one day.
+ Original commit message from CVS:
+ * tests/check/libs/.cvsignore:
+ Ignore more, in case the build bots work again one day.
+
+2007-09-06 07:00:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add libgstfft, a FFT library based on Kiss FFT which is
+ Original commit message from CVS:
+ Reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * configure.ac:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/fft/Makefile.am:
+ * gst-libs/gst/fft/_kiss_fft_guts_f32.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_f64.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s16.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s32.h:
+ * gst-libs/gst/fft/gstfft.c: (gst_fft_next_fast_length):
+ * gst-libs/gst/fft/gstfft.h:
+ * gst-libs/gst/fft/gstfftf32.c: (gst_fft_f32_new),
+ (gst_fft_f32_fft), (gst_fft_f32_inverse_fft), (gst_fft_f32_free),
+ (gst_fft_f32_window), (gst_fft_f32_magnitude), (gst_fft_f32_phase):
+ * gst-libs/gst/fft/gstfftf32.h:
+ * gst-libs/gst/fft/gstfftf64.c: (gst_fft_f64_new),
+ (gst_fft_f64_fft), (gst_fft_f64_inverse_fft), (gst_fft_f64_free),
+ (gst_fft_f64_window), (gst_fft_f64_magnitude), (gst_fft_f64_phase):
+ * gst-libs/gst/fft/gstfftf64.h:
+ * gst-libs/gst/fft/gstffts16.c: (gst_fft_s16_new),
+ (gst_fft_s16_fft), (gst_fft_s16_inverse_fft), (gst_fft_s16_free),
+ (gst_fft_s16_window), (gst_fft_s16_magnitude), (gst_fft_s16_phase):
+ * gst-libs/gst/fft/gstffts16.h:
+ * gst-libs/gst/fft/gstffts32.c: (gst_fft_s32_new),
+ (gst_fft_s32_fft), (gst_fft_s32_inverse_fft), (gst_fft_s32_free),
+ (gst_fft_s32_window), (gst_fft_s32_magnitude), (gst_fft_s32_phase):
+ * gst-libs/gst/fft/gstffts32.h:
+ * gst-libs/gst/fft/kiss_fft_f32.c: (kf_bfly2), (kf_bfly4),
+ (kf_bfly3), (kf_bfly5), (kf_bfly_generic), (kf_work), (kf_factor),
+ (kiss_fft_f32_alloc), (kiss_fft_f32_stride), (kiss_fft_f32),
+ (kiss_fft_f32_cleanup), (kiss_fft_f32_next_fast_size):
+ * gst-libs/gst/fft/kiss_fft_f32.h:
+ * gst-libs/gst/fft/kiss_fft_f64.c: (kf_bfly2), (kf_bfly4),
+ (kf_bfly3), (kf_bfly5), (kf_bfly_generic), (kf_work), (kf_factor),
+ (kiss_fft_f64_alloc), (kiss_fft_f64_stride), (kiss_fft_f64),
+ (kiss_fft_f64_cleanup), (kiss_fft_f64_next_fast_size):
+ * gst-libs/gst/fft/kiss_fft_f64.h:
+ * gst-libs/gst/fft/kiss_fft_s16.c: (kf_bfly2), (kf_bfly4),
+ (kf_bfly3), (kf_bfly5), (kf_bfly_generic), (kf_work), (kf_factor),
+ (kiss_fft_s16_alloc), (kiss_fft_s16_stride), (kiss_fft_s16),
+ (kiss_fft_s16_cleanup), (kiss_fft_s16_next_fast_size):
+ * gst-libs/gst/fft/kiss_fft_s16.h:
+ * gst-libs/gst/fft/kiss_fft_s32.c: (kf_bfly2), (kf_bfly4),
+ (kf_bfly3), (kf_bfly5), (kf_bfly_generic), (kf_work), (kf_factor),
+ (kiss_fft_s32_alloc), (kiss_fft_s32_stride), (kiss_fft_s32),
+ (kiss_fft_s32_cleanup), (kiss_fft_s32_next_fast_size):
+ * gst-libs/gst/fft/kiss_fft_s32.h:
+ * gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc),
+ (kiss_fftr_f32), (kiss_fftri_f32):
+ * gst-libs/gst/fft/kiss_fftr_f32.h:
+ * gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc),
+ (kiss_fftr_f64), (kiss_fftri_f64):
+ * gst-libs/gst/fft/kiss_fftr_f64.h:
+ * gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc),
+ (kiss_fftr_s16), (kiss_fftri_s16):
+ * gst-libs/gst/fft/kiss_fftr_s16.h:
+ * gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc),
+ (kiss_fftr_s32), (kiss_fftri_s32):
+ * gst-libs/gst/fft/kiss_fftr_s32.h:
+ * gst-libs/gst/fft/kiss_version:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ Add libgstfft, a FFT library based on Kiss FFT which is
+ BSD licensed. Supported sample formats are int16, int32,
+ float and double. For those formats a real FFT and IFFT
+ can be done, different windowing functions can be applied
+ and functions for extracting the magnitude and phase exist.
+ Fixes #468619.
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Integrate libgstfft into the docs.
+ * tests/check/Makefile.am:
+ * tests/check/libs/fft.c: (GST_START_TEST), (fft_suite), (main):
+ Add unit tests for libgstfft, currently only testing the FFT.
+ Unit tests for IFFT will follow soon.
+
+2007-09-05 23:07:40 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.*: Separate INIT_ARRAY() and related macros into two versions, one for structures and ...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_time_init),
+ (gst_sdp_message_init), (gst_sdp_message_uninit),
+ (is_multicast_address), (gst_sdp_message_as_text),
+ (gst_sdp_message_get_origin), (gst_sdp_message_set_connection),
+ (gst_sdp_message_get_connection), (gst_sdp_message_add_bandwidth),
+ (gst_sdp_message_add_time), (gst_sdp_message_add_zone),
+ (gst_sdp_message_get_key), (gst_sdp_message_get_attribute_val_n),
+ (gst_sdp_message_get_attribute_val), (gst_sdp_message_add_media),
+ (gst_sdp_media_init), (gst_sdp_media_uninit),
+ (gst_sdp_media_as_text), (gst_sdp_media_set_port_info),
+ (gst_sdp_media_connections_len), (gst_sdp_media_add_connection),
+ (gst_sdp_media_bandwidths_len), (gst_sdp_media_get_bandwidth),
+ (gst_sdp_media_add_bandwidth), (gst_sdp_media_attributes_len),
+ (gst_sdp_parse_line), (print_media), (gst_sdp_message_dump):
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ Separate INIT_ARRAY() and related macros into two versions, one for
+ structures and one for pointers (e.g., INIT_ARRAY() and
+ INIT_PTR_ARRAY()). This fixes a segmentation error on freeing the
+ lists of emails and phone numbers.
+ Add missing const as appropriate.
+ Change all gint to guint since they all actually represent unsigned
+ values.
+ Do not use time as a variable name as it shadows the global time().
+ Add gst_sdp_message_as_text() and gst_sdp_media_as_text().
+ Actually implement gst_sdp_message_add_time().
+ Make gst_sdp_message_add_time() take repeat times as an argument.
+ Store repeat times in GstSDPTime as a GArray rather than as gchar**.
+ Corrected the definition of gst_sdp_media_get_bandwidth() (was
+ misspelled as badwidth).
+ gst-indented and a little clean up. Fixes #471067.
+
+2007-09-05 21:20:12 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/volume/gstvolume.c: Correctly clamp float/double samples in the [-1.0,1.0] range to prevent weird effects.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (volume_process_double), (volume_process_double_clamp),
+ (volume_process_float_clamp):
+ Correctly clamp float/double samples in the [-1.0,1.0] range to
+ prevent weird effects.
+ * tests/check/elements/volume.c: (GST_START_TEST), (volume_suite):
+ Add unit tests for all samples types that had none before.
+
+2007-09-05 14:09:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/rtp/gstrtpbuffer.c: Need to include stdlib.h for abs() here too.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ Need to include stdlib.h for abs() here too.
+
+2007-09-05 14:01:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreaminfo.c: Fix build.
+ Original commit message from CVS:
+ * gst/playback/gststreaminfo.c:
+ Fix build.
+
+2007-09-05 10:32:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/gststreaminfo.c: Clean up some half-disabled code and comment.
+ Original commit message from CVS:
+ * gst/playback/gststreaminfo.c:
+ Clean up some half-disabled code and comment.
+
+2007-09-04 16:18:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Return FALSE from the event handler to let the parent class handle the event.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_payload_audio_handle_event):
+ Return FALSE from the event handler to let the parent class handle the
+ event.
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain), (gst_base_rtp_depayload_push_full):
+ Mark outgoing buffers as DISCONT if the incomming buffer was DISCONT.
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ Bump the MTU to 1400.
+
+2007-09-04 01:50:55 +0000 Johan Dahlin <johan@gnome.org>
+
+ gst/typefind/gsttypefindfunctions.c (plugin_init): Add an audio/x-nsf typefind function for the nsfdec element.
+ Original commit message from CVS:
+ 2007-09-03 Johan Dahlin <jdahlin@async.com.br>
+ * gst/typefind/gsttypefindfunctions.c (plugin_init):
+ Add an audio/x-nsf typefind function for the nsfdec element.
+
+2007-09-03 20:46:38 +0000 Renato Filho <renato.filho@indt.org.br>
+
+ gst/playback/gstplaybasebin.c: Included "myth://" on stream_uris list for enable buffering to mythtv files
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ Included "myth://" on stream_uris list for enable buffering to mythtv files
+
+2007-09-03 19:31:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix parsing of RB blocks.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_get_rb),
+ (gst_rtcp_packet_sdes_copy_entry), (gst_rtcp_ntp_to_unix),
+ (gst_rtcp_unix_to_ntp):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Fix parsing of RB blocks.
+ Fix docs.
+ Added helper functions to convert to/from UNIX and NTP time.
+ API: gst_rtcp_ntp_to_unix()
+ API: gst_rtcp_unix_to_ntp()
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data),
+ (gst_rtp_buffer_get_header_len),
+ (gst_rtp_buffer_get_extension_data),
+ (gst_rtp_buffer_get_payload_subbuffer),
+ (gst_rtp_buffer_get_payload_len), (gst_rtp_buffer_get_payload),
+ (gst_rtp_buffer_ext_timestamp):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Fix some more docs.
+ Implement handling of packets with extensions.
+ Fix padding check in _validate().
+ Added function to get extension data.
+ API: gst_rtp_buffer_get_header_len()
+ API: gst_rtp_buffer_get_extension_data()
+
+2007-09-03 19:19:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Add some more docs for the queue-delay property and fix a typo in a comment.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_class_init),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Add some more docs for the queue-delay property and fix a typo in a
+ comment.
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push):
+ Fix typo.
+
+2007-09-03 19:17:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: When skew slaving, try to hover around the middle of a segment so that we at m...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_skew_slaving), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_change_state):
+ When skew slaving, try to hover around the middle of a segment so that
+ we at most drift by half a segment.
+ If we are aligning in the oposite direction of the clock skew, we don't
+ have to resync.
+
+2007-08-31 21:07:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Be less silly with the segment start, just apply the clock-base to the timest...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Be less silly with the segment start, just apply the clock-base to the
+ timestamp.
+
+2007-08-31 15:58:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Deprecate the queue handling thread thing and remove the code.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_class_init),
+ (gst_base_rtp_depayload_finalize),
+ (gst_base_rtp_depayload_setcaps), (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_handle_sink_event),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_change_state):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Deprecate the queue handling thread thing and remove the code.
+ Use new method to calculate the extended timestamp.
+
+2007-08-31 15:21:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.c: Use g_strndup which does exactly what we want.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ (gst_rtcp_packet_sdes_copy_entry):
+ Use g_strndup which does exactly what we want.
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_compare_seqnum),
+ (gst_rtp_buffer_ext_timestamp):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Add helper function to compare seqnums.
+ Add helper function to calculate extended timestamps.
+ API: gst_rtp_buffer_compare_seqnum()
+ API: gst_rtp_buffer_ext_timestamp()
+
+2007-08-30 21:59:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.*: Fix and document SDES item data function.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ (gst_rtcp_packet_sdes_get_entry),
+ (gst_rtcp_packet_sdes_copy_entry):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Fix and document SDES item data function.
+ Add new function that makes a proper copy of SDES item data.
+ API: gst_rtcp_packet_sdes_copy_entry()
+
+2007-08-30 07:29:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ The tcp and subparse plugins are under gst, but not totaly free of dependencies. Handle selection inconfigure.ac, so ...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/Makefile.am:
+ The tcp and subparse plugins are under gst, but not totaly free of
+ dependencies. Handle selection inconfigure.ac, so that they show up
+ on the final list of what is build and what is not. Maybe they should
+ better be moved to ext.
+
+2007-08-30 06:58:46 +0000 Daniel Díaz <yosoy@danieldiaz.org>
+
+ Check if libxml provides HTML parser which subparse needs.
+ Original commit message from CVS:
+ Patch by: Daniel Díaz <yosoy@danieldiaz.org>
+ * configure.ac:
+ * gst/Makefile.am:
+ Check if libxml provides HTML parser which subparse needs.
+ Fixes #451970.
+
+2007-08-29 14:22:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsa.c: Fix typo and compilation on big endian systems.
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c:
+ Fix typo and compilation on big endian systems.
+
+2007-08-29 12:16:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstssaparse.c: Convert SSA newline codes into actual newline characters (#470766).
+ Original commit message from CVS:
+ * gst/subparse/gstssaparse.c:
+ Convert SSA newline codes into actual newline characters (#470766).
+
+2007-08-28 14:58:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: also add gst_install_plugins_supported() while we're at it (see #470456).
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/pbutils/install-plugins.h:
+ * tests/check/libs/pbutils.c:
+ API: also add gst_install_plugins_supported() while we're at it
+ (see #470456).
+
+2007-08-28 14:23:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_missing_*_installer_detail_new() convenience API so that applications that know exactly what they're mis...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ * gst-libs/gst/pbutils/missing-plugins.h:
+ * tests/check/libs/pbutils.c:
+ API: add gst_missing_*_installer_detail_new() convenience API so
+ that applications that know exactly what they're missing can request
+ installer detail strings for those items directly instead of having
+ to first create a dummy missing-plugin message and then get the
+ installer detail string from that. Fixes #470456.
+
+2007-08-27 11:59:56 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: We need to set up delayed-linking whenever the caps are non-fixed, not just when there a...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (close_pad_link):
+ We need to set up delayed-linking whenever the caps are non-fixed,
+ not just when there are multiple types - use gst_pad_is_fixed()
+ to test.
+
+2007-08-26 14:14:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/missing-plugins.c: Add missing separator in PID fallback case.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ (gst_missing_plugin_message_get_installer_detail):
+ Add missing separator in PID fallback case.
+
+2007-08-24 15:28:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/alsa/Makefile.am: There is no GST_PLUGINS_BASE_LIBS defined.
+ Original commit message from CVS:
+ * ext/alsa/Makefile.am:
+ There is no GST_PLUGINS_BASE_LIBS defined.
+ * ext/alsa/gstalsa.c:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_delay):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_delay):
+ Add support for ALSA 24-bit formats.
+ snd_pcm_delay can return an error code, especially
+ during XRUNS. In that case, the best we can do is assume
+ delay = 0.
+ * gst/audioconvert/Makefile.am:
+ Add flags from -base before any more-remote dependencies.
+
+2007-08-23 20:45:45 +0000 Davyd <davyd@madeley.id.au>
+
+ gst/volume/gstvolume.*: Add support for int32, int24 and int8 to the volume element.
+ Original commit message from CVS:
+ Based on a patch by: Davyd <davyd at madeley dot id dot au>
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (volume_update_real_volume), (gst_volume_set_volume),
+ (gst_volume_init), (volume_process_int32),
+ (volume_process_int32_clamp), (volume_process_int24),
+ (volume_process_int24_clamp), (volume_process_int16),
+ (volume_process_int16_clamp), (volume_process_int8),
+ (volume_process_int8_clamp), (volume_update_volume), (plugin_init):
+ * gst/volume/gstvolume.h:
+ Add support for int32, int24 and int8 to the volume element.
+ Fixes #445529.
+
+2007-08-23 12:37:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/Makefile.am: Fix even more.
+ Original commit message from CVS:
+ * tests/examples/Makefile.am:
+ Fix even more.
+
+2007-08-23 10:58:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Revert unwanted commit. many thanks to moap. I want a fix for https://thomas.apestaart.org/moap/trac/ticket/239
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ * gst-libs/gst/Makefile.am:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ * sys/v4l/v4lsrc_calls.c:
+ * tests/examples/Makefile.am:
+ * win32/common/config.h:
+ Revert unwanted commit. many thanks to moap. I want a fix for
+ https://thomas.apestaart.org/moap/trac/ticket/239
+
+2007-08-23 08:33:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst/typefind/gsttypefindfunctions.c:
+ * gst/volume/gstvolume.c:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ * sys/v4l/v4lsrc_calls.c:
+ * tests/examples/Makefile.am:
+ * win32/common/config.h:
+ Original commit message from CVS: reviewed by: <delete if not using a buddy> patch by: <delete if not someone else's patch> * configure.ac: * docs/libs/Makefile.am: * docs/libs/gst-plugins-base-libs-docs.sgml: * docs/libs/gst-plugins-base-libs-sections.txt: * ext/gnomevfs/gstgnomevfssrc.c: * ext/gnomevfs/gstgnomevfssrc.h: * gst-libs/gst/Makefile.am: * gst-libs/gst/audio/gstaudiofilter.h: * gst/typefind/gsttypefindfunctions.c: * gst/volume/gstvolume.c: * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in: * pkgconfig/gstreamer-plugins-base.pc.in: * sys/v4l/v4lsrc_calls.c: * tests/examples/Makefile.am: * win32/common/config.h:
+
+2007-08-22 15:29:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/audio.c: Clarify the docs a little.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.c:
+ Clarify the docs a little.
+
+2007-08-22 11:20:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/volume/gstvolume.c: Enable liboil for float and add more details about problems with int16.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c:
+ Enable liboil for float and add more details about problems with
+ int16.
+
+2007-08-21 15:43:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/v4l/gstv4lsrc.c: Fix RGB24 masks as spotted by _ke (Daniel G. Siegel) on IRC.
+ Original commit message from CVS:
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps):
+ Fix RGB24 masks as spotted by _ke (Daniel G. Siegel) on IRC.
+
+2007-08-21 12:08:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: When calculating the first timestamp of the buffers, don't go below 0 and clip the samples be...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward):
+ When calculating the first timestamp of the buffers, don't go below 0
+ and clip the samples because the offset was on the eos page.
+ Fixes #466717.
+
+2007-08-21 11:42:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Also submit the eos page when trying to find the first timestamp.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_read_chain),
+ (gst_ogg_demux_collect_chain_info):
+ Also submit the eos page when trying to find the first timestamp.
+ See #466717.
+
+2007-08-17 15:24:43 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/audio/audio.h: Use gst_util_uint64_scale() instead of doing the math with double for GST_FRAMES_TO_CLOCK...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.h:
+ Use gst_util_uint64_scale() instead of doing the math
+ with double for GST_FRAMES_TO_CLOCK_TIME() and
+ GST_CLOCK_TIME_TO_FRAMES(). For large timestamps this
+ prevents rounding errors. Fixes #467667.
+
+2007-08-17 13:42:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspconnection.*: Small cleanups.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect), (gst_rtsp_connection_write),
+ (gst_rtsp_connection_read), (gst_rtsp_connection_poll):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ Small cleanups.
+ On shutdown, don't read the control socket yet.
+ Set timeout value correctly in all cases.
+ Add function to check if the server accepts reads or writes.
+ API: gst_rtsp_connection_poll()
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ Fix compilation with -pedantic.
+ Add enum for _poll.
+
+2007-08-16 17:11:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.c: Override the preroll vmethod instead of overriding the render method twice.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init):
+ Override the preroll vmethod instead of overriding the render method
+ twice.
+
+2007-08-16 16:06:21 +0000 Olivier Crete <tester@tester.ca>
+
+ gst-libs/gst/rtp/gstbasertppayload.*: Add getcaps vfunc to basertppayload. See #465146.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester ca>
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_init),
+ (gst_basertppayload_getcaps):
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ Add getcaps vfunc to basertppayload. See #465146.
+
+2007-08-16 11:20:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Only post buffering messages when we are a stream.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (queue_threshold_reached):
+ Only post buffering messages when we are a stream.
+
+2007-08-15 17:05:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/: Small docs fix and addition.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ Small docs fix and addition.
+
+2007-08-14 17:47:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.c: Don't use new API.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_flush_unlocked):
+ Don't use new API.
+
+2007-08-14 17:38:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/app/gstappsink.*: Make love to appsink.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsink.c: (gst_app_sink_base_init),
+ (gst_app_sink_class_init), (gst_app_sink_dispose),
+ (gst_app_sink_flush_unlocked), (gst_app_sink_start),
+ (gst_app_sink_stop), (gst_app_sink_event), (gst_app_sink_preroll),
+ (gst_app_sink_render), (gst_app_sink_get_caps),
+ (gst_app_sink_set_caps), (gst_app_sink_end_of_stream),
+ (gst_app_sink_pull_preroll), (gst_app_sink_pull_buffer):
+ * gst-libs/gst/app/gstappsink.h:
+ Make love to appsink.
+ Make it support pulling of the preroll buffer.
+ Add docs and debug statements.
+ Fix some races wrt to EOS handling and stopping.
+ Implement getcaps.
+ Implement FLUSHING.
+ API: gst_app_sink_pull_preroll()
+
+2007-08-13 15:37:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/icles/: Add a dumb little test for textoverlay alignments.
+ Original commit message from CVS:
+ * tests/icles/.cvsignore:
+ * tests/icles/Makefile.am:
+ * tests/icles/test-textoverlay.c:
+ Add a dumb little test for textoverlay alignments.
+
+2007-08-13 15:26:54 +0000 Dan Williams <dcbw@redhat.com>
+
+ ext/pango/gsttextoverlay.*: API: add "line-alignment" property (#459334). Add gtk-doc blurb for "silent" property so ...
+ Original commit message from CVS:
+ Patch by: Dan Williams <dcbw redhat com>
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ API: add "line-alignment" property (#459334). Add gtk-doc blurb for
+ "silent" property so there's a Since tag in the API reference.
+
+2007-08-13 11:21:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ fix ... by: lines
+ Original commit message from CVS:
+ fix ... by: lines
+
+2007-08-12 16:30:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.*: Improve caps negotiation so that downstream elements can confiure certain RTP p...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_set_outcaps):
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ Improve caps negotiation so that downstream elements can confiure
+ certain RTP properties by fixing them on the caps. See #465146.
+ Add docs.
+
+2007-08-11 12:39:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Mark as deprecated some macros which were presumably meant to be private API and accidentally exposed in the public h...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Mark as deprecated some macros which were presumably meant to be
+ private API and accidentally exposed in the public header file.
+ Also actually _init() lock (only works at the moment because the
+ struct is zeroed out when created and the initial values in the
+ mutex struct are zeroes too). (#459585)
+
+2007-08-10 17:35:52 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/Makefile.am: Remove cruft and do some cleanups.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ Remove cruft and do some cleanups.
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ Prepare for comming gtkdoc features (rebase against online docs).
+
+2007-08-10 13:55:44 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: Debug output fixes.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ Debug output fixes.
+ * tests/check/elements/audiorate.c: (do_perfect_stream_test),
+ (GST_START_TEST):
+ Change the number of buffers used; 500 is too many and leads to
+ timeouts.
+
+2007-08-10 10:08:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Printf format fixes (#465028).
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c:
+ * gst/videorate/gstvideorate.c:
+ Printf format fixes (#465028).
+
+2007-08-09 15:44:02 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: If we have a large (> 1 second) discontinuity, push a series of smaller buffers rather ...
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ If we have a large (> 1 second) discontinuity, push a series of
+ smaller buffers rather than a single very large buffer. Avoids
+ unreasonably large single buffer allocations when encountering a
+ large gap.
+ * tests/check/elements/audiorate.c: (GST_START_TEST),
+ (audiorate_suite):
+ Add a test for this.
+
+2007-08-09 12:06:43 +0000 Josep Torra Valles <josep@fluendo.com>
+
+ gst/playback/gstplaybasebin.c: Fixes: #465015
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (group_commit),
+ (queue_remove_probe), (queue_threshold_reached):
+ Patch by: Josep Torra Valles <josep@fluendo.com>
+ Fixes: #465015
+ Make sure we remove the check_queues buffer probe from the
+ correct queue to avoid racily going back to "buffering 99%" when
+ buffering is actually complete.
+ Also, fix the spelling of Josep's surname in the ChangeLog.
+
+2007-08-09 11:37:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/ogg/gstoggmux.c: Do not leak oggmux instance.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ Do not leak oggmux instance.
+ * ext/vorbis/vorbisenc.c:
+ Also log values.
+
+2007-08-09 10:51:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Updated translations.
+ Original commit message from CVS:
+ * po/hu.po:
+ * po/it.po:
+ * po/nl.po:
+ * po/uk.po:
+ * po/vi.po:
+ Updated translations.
+
+2007-08-08 16:07:21 +0000 Yang Hong <hongyang@redflag-linux.com>
+
+ ext/pango/gsttextoverlay.*: Add 'silent' property to GstTimeOverlay. Fixes #462979
+ Original commit message from CVS:
+ patch by: Yang Hong <hongyang@redflag-linux.com>
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextoverlay.h:
+ Add 'silent' property to GstTimeOverlay. Fixes #462979
+
+2007-08-08 15:05:22 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ Add connection-speed property. Fixes #464690.
+ Original commit message from CVS:
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init),
+ (gst_uri_decode_bin_init), (gst_uri_decode_bin_set_property),
+ (gst_uri_decode_bin_get_property), (gen_source_element):
+ Add connection-speed property. Fixes #464690.
+
+2007-08-07 15:13:46 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ Fix compilation on windows. Fixes #464320.
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
+ * configure.ac:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect):
+ Fix compilation on windows. Fixes #464320.
+
+2007-08-07 14:14:54 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ gst/playback/: Move connection-speed property from playbin to playbasebin so that we can also configure it in source ...
+ Original commit message from CVS:
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (gst_play_base_bin_init), (queue_threshold_reached),
+ (gen_source_element), (setup_substreams),
+ (gst_play_base_bin_set_property), (gst_play_base_bin_get_property),
+ (gst_play_base_bin_get_streaminfo_value_array):
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init),
+ (gst_play_bin_set_property), (gst_play_bin_get_property),
+ (gst_play_bin_handle_redirect_message):
+ Move connection-speed property from playbin to playbasebin so that we
+ can also configure it in source elements that have the connection-speed
+ property. Fixes #464028.
+ Add some debug info here and there.
+
+2007-08-06 16:42:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Properly respond to conversion queries. Fixes #464079.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_query):
+ Properly respond to conversion queries. Fixes #464079.
+
+2007-08-03 19:53:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: Add float/double and int32 support to audiotestsrc. Fixes #460422.
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_init),
+ (gst_audio_test_src_src_fixate), (gst_audio_test_src_setcaps),
+ (gst_audio_test_src_init_sine_table),
+ (gst_audio_test_src_change_wave), (gst_audio_test_src_create):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Add float/double and int32 support to audiotestsrc. Fixes #460422.
+ Also set the default volume to the default value specified in the
+ GParamSpec.
+
+2007-08-03 19:40:14 +0000 Jens Granseuer <jensgr@gmx.net>
+
+ gst/audioconvert/gstaudioquantize.c: Fix C89 incompatibilities and spelling of explanations. Fixes #463215.
+ Original commit message from CVS:
+ Patch by: Jens Granseuer <jensgr at gmx dot net>
+ * gst/audioconvert/gstaudioquantize.c:
+ Fix C89 incompatibilities and spelling of explanations. Fixes #463215.
+
+2007-08-03 15:44:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtsptransport.c: Add rdt manager for rdt transport.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtsptransport.c: (gst_rtsp_transport_parse):
+ Add rdt manager for rdt transport.
+ Fix parsing of RDT transport.
+
+2007-08-03 14:43:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.14 ===
+
+2007-08-03 14:41:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/config.h:
+ Release 0.10.14
+ Original commit message from CVS:
+ Release 0.10.14
+
+2007-08-03 14:24:08 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/cs.po:
+ * po/de.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
+
+2007-07-27 17:37:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/libs/audio.c: Fix the test to reflect the behaviour of gst_audio_clip_buffer.
+ Original commit message from CVS:
+ * tests/check/libs/audio.c: (GST_START_TEST):
+ Fix the test to reflect the behaviour of gst_audio_clip_buffer.
+
+2007-07-27 17:10:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/audio/audio.c: When clipping a buffer with no timestamp, assume it is within the segment without warnings.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.c:
+ When clipping a buffer with no timestamp, assume it is
+ within the segment without warnings.
+ Fixes: #460978
+
+2007-07-27 11:16:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtsp/gstrtspextension.c: Fire the signal on the object, not the interface.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/gstrtspextension.c: (gst_rtsp_extension_send):
+ Fire the signal on the object, not the interface.
+
+2007-07-27 09:17:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtsp/.cvsignore: Ber. Don't include the full path, idiot.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/.cvsignore:
+ Ber. Don't include the full path, idiot.
+
+2007-07-27 08:29:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtsp/.cvsignore: Ignore generated files.
+ Original commit message from CVS:
+ * gst-libs/gst/rtsp/.cvsignore:
+ Ignore generated files.
+
+2007-07-26 19:57:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/: Move the rtspextension.h interface into gstrtspextension.h as part of libgstrtsp instead of libgstinte...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/interfaces-marshal.list:
+ * gst-libs/gst/interfaces/rtspextension.c:
+ * gst-libs/gst/interfaces/rtspextension.h:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtsp.h:
+ * gst-libs/gst/rtsp/gstrtspextension.c:
+ (gst_rtsp_extension_get_type), (gst_rtsp_extension_iface_init),
+ (gst_rtsp_extension_detect_server),
+ (gst_rtsp_extension_before_send), (gst_rtsp_extension_after_send),
+ (gst_rtsp_extension_parse_sdp), (gst_rtsp_extension_setup_media),
+ (gst_rtsp_extension_configure_stream),
+ (gst_rtsp_extension_get_transports),
+ (gst_rtsp_extension_stream_select), (gst_rtsp_extension_send):
+ * gst-libs/gst/rtsp/gstrtspextension.h:
+ * gst-libs/gst/rtsp/rtsp-marshal.list:
+ Move the rtspextension.h interface into gstrtspextension.h
+ as part of libgstrtsp instead of libgstinterfaces, because it's
+ only for use within plugins, not applications.
+ Add stuff to do the enum & marshal generation needed in libgstrtsp now.
+ Use the GST_TYPE_RTSP_RESULT enum type for the return value of the
+ signal that the GstRTSPExtension interface emits, since G_TYPE_ENUM
+ is abstract.
+
+2007-07-26 15:48:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/interfaces/: Fix marshaller for the send signal.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/interfaces-marshal.list:
+ * gst-libs/gst/interfaces/rtspextension.c:
+ (gst_rtsp_extension_iface_init),
+ (gst_rtsp_extension_stream_select), (gst_rtsp_extension_send):
+ * gst-libs/gst/interfaces/rtspextension.h:
+ Fix marshaller for the send signal.
+ Add URL to stream selection interface method.
+
+2007-07-26 15:35:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/riff/Makefile.am: Pull in our dependencies from -base before those from outside.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/Makefile.am:
+ Pull in our dependencies from -base before those from outside.
+
+2007-07-26 14:33:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ API: gst_rtsp_base64_decode_ip()
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspbase64.c: (gst_rtsp_base64_decode_ip):
+ * gst-libs/gst/rtsp/gstrtspbase64.h:
+ API: gst_rtsp_base64_decode_ip()
+ Added function to decode Base64 in-place.
+
+2007-07-26 14:08:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/libs/.cvsignore: Ignore the mixer test binary.
+ Original commit message from CVS:
+ * tests/check/libs/.cvsignore:
+ Ignore the mixer test binary.
+
+2007-07-26 10:00:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/vorbis/vorbisdec.c: Gratuitous comment change to trigger a rebuild on the buildbots.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward):
+ Gratuitous comment change to trigger a rebuild on the buildbots.
+
+2007-07-25 18:20:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/sdp/gstsdpmessage.*: Constify args where we can.
+ Original commit message from CVS:
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_media_get_media),
+ (gst_sdp_media_get_port), (gst_sdp_media_get_num_ports),
+ (gst_sdp_media_get_proto), (gst_sdp_media_formats_len),
+ (gst_sdp_media_get_format), (gst_sdp_media_get_information),
+ (gst_sdp_media_connections_len), (gst_sdp_media_get_connection),
+ (gst_sdp_media_bandwidths_len), (gst_sdp_media_get_badwidth),
+ (gst_sdp_media_get_key), (gst_sdp_media_attributes_len),
+ (gst_sdp_media_get_attribute), (gst_sdp_media_get_attribute_val_n),
+ (gst_sdp_media_get_attribute_val):
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ Constify args where we can.
+
+2007-07-25 18:18:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/interfaces/: Move interface for RTSP extensions from -good to here.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/rtspextension.c:
+ (gst_rtsp_extension_get_type), (gst_rtsp_extension_iface_init),
+ (gst_rtsp_extension_detect_server),
+ (gst_rtsp_extension_before_send), (gst_rtsp_extension_after_send),
+ (gst_rtsp_extension_parse_sdp), (gst_rtsp_extension_setup_media),
+ (gst_rtsp_extension_configure_stream),
+ (gst_rtsp_extension_get_transports),
+ (gst_rtsp_extension_stream_select), (gst_rtsp_extension_send):
+ * gst-libs/gst/interfaces/rtspextension.h:
+ Move interface for RTSP extensions from -good to here.
+ Added helper methods to invoke interface methods.
+
+2007-07-25 11:22:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix some more RTSP docs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (key_value_foreach),
+ (gst_rtsp_message_get_type), (gst_rtsp_message_parse_request),
+ (gst_rtsp_message_init_response),
+ (gst_rtsp_message_parse_response), (gst_rtsp_message_new_data),
+ (gst_rtsp_message_parse_data), (gst_rtsp_message_add_header),
+ (gst_rtsp_message_remove_header), (gst_rtsp_message_get_header),
+ (gst_rtsp_message_append_headers), (gst_rtsp_message_set_body),
+ (gst_rtsp_message_get_body), (dump_key_value):
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ * gst-libs/gst/rtsp/gstrtsprange.c: (parse_npt_time),
+ (parse_npt_range), (parse_clock_range), (parse_smpte_range),
+ (gst_rtsp_range_parse):
+ * gst-libs/gst/rtsp/gstrtsprange.h:
+ * gst-libs/gst/rtsp/gstrtsptransport.c:
+ * gst-libs/gst/rtsp/gstrtspurl.c:
+ Fix some more RTSP docs.
+ Add some missing methods for dealing with messages.
+
+2007-07-24 19:19:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added beginnings of RTSP documentation.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtsp/gstrtspbase64.c: (gst_rtsp_base64_encode):
+ * gst-libs/gst/rtsp/gstrtspbase64.h:
+ * gst-libs/gst/rtsp/gstrtspconnection.c:
+ (gst_rtsp_connection_connect), (add_auth_header),
+ (gst_rtsp_connection_write), (gst_rtsp_connection_send),
+ (read_body), (gst_rtsp_connection_receive),
+ (gst_rtsp_connection_next_timeout),
+ (gst_rtsp_connection_reset_timeout),
+ (gst_rtsp_connection_set_auth):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * gst-libs/gst/rtsp/gstrtspdefs.c: (rtsp_init_status):
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ * gst-libs/gst/rtsp/gstrtsprange.c: (parse_npt_time),
+ (parse_npt_range), (parse_clock_range), (parse_smpte_range),
+ (gst_rtsp_range_parse):
+ * gst-libs/gst/rtsp/gstrtspurl.h:
+ Added beginnings of RTSP documentation.
+
+2007-07-24 17:37:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Document the SDP library.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/sdp/gstsdp.h:
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_message_set_origin),
+ (gst_sdp_message_set_connection), (gst_sdp_message_add_bandwidth),
+ (gst_sdp_message_add_time), (gst_sdp_message_add_zone),
+ (gst_sdp_message_set_key), (gst_sdp_message_get_attribute_val_n),
+ (gst_sdp_message_get_attribute_val),
+ (gst_sdp_message_add_attribute), (gst_sdp_media_new),
+ (gst_sdp_media_init), (gst_sdp_media_uninit), (gst_sdp_media_free),
+ (gst_sdp_media_get_media), (gst_sdp_media_set_media),
+ (gst_sdp_media_get_port), (gst_sdp_media_get_num_ports),
+ (gst_sdp_media_set_port_info), (gst_sdp_media_get_proto),
+ (gst_sdp_media_set_proto), (gst_sdp_media_formats_len),
+ (gst_sdp_media_get_format), (gst_sdp_media_add_format),
+ (gst_sdp_media_get_information), (gst_sdp_media_set_information),
+ (gst_sdp_media_connections_len), (gst_sdp_media_get_connection),
+ (gst_sdp_media_add_connection), (gst_sdp_media_bandwidths_len),
+ (gst_sdp_media_get_badwidth), (gst_sdp_media_add_bandwidth),
+ (gst_sdp_media_set_key), (gst_sdp_media_get_key),
+ (gst_sdp_media_attributes_len), (gst_sdp_media_add_attribute),
+ (gst_sdp_media_get_attribute_val_n),
+ (gst_sdp_media_get_attribute_val), (gst_sdp_message_parse_buffer),
+ (print_media), (gst_sdp_message_dump):
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ Document the SDP library.
+ Add some of the missing SDPMedia methods.
+
+2007-07-24 11:52:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Move SDP and RTSP from helper objects in -good to a reusable library.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/rtsp/Makefile.am:
+ * gst-libs/gst/rtsp/gstrtspbase64.c: (gst_rtsp_base64_encode):
+ * gst-libs/gst/rtsp/gstrtspbase64.h:
+ * gst-libs/gst/rtsp/gstrtspconnection.c: (inet_aton),
+ (gst_rtsp_connection_create), (gst_rtsp_connection_connect),
+ (add_auth_header), (add_date_header), (gst_rtsp_connection_write),
+ (gst_rtsp_connection_send), (read_line), (read_string), (read_key),
+ (parse_response_status), (parse_request_line), (parse_line),
+ (gst_rtsp_connection_read), (read_body),
+ (gst_rtsp_connection_receive), (gst_rtsp_connection_close),
+ (gst_rtsp_connection_free), (gst_rtsp_connection_next_timeout),
+ (gst_rtsp_connection_reset_timeout), (gst_rtsp_connection_flush),
+ (gst_rtsp_connection_set_auth):
+ * gst-libs/gst/rtsp/gstrtspconnection.h:
+ * gst-libs/gst/rtsp/gstrtspdefs.c: (rtsp_init_status),
+ (gst_rtsp_strresult), (gst_rtsp_method_as_text),
+ (gst_rtsp_version_as_text), (gst_rtsp_header_as_text),
+ (gst_rtsp_status_as_text), (gst_rtsp_find_header_field),
+ (gst_rtsp_find_method):
+ * gst-libs/gst/rtsp/gstrtspdefs.h:
+ * gst-libs/gst/rtsp/gstrtspmessage.c: (key_value_foreach),
+ (gst_rtsp_message_new), (gst_rtsp_message_init),
+ (gst_rtsp_message_new_request), (gst_rtsp_message_init_request),
+ (gst_rtsp_message_new_response), (gst_rtsp_message_init_response),
+ (gst_rtsp_message_init_data), (gst_rtsp_message_unset),
+ (gst_rtsp_message_free), (gst_rtsp_message_add_header),
+ (gst_rtsp_message_remove_header), (gst_rtsp_message_get_header),
+ (gst_rtsp_message_append_headers), (gst_rtsp_message_set_body),
+ (gst_rtsp_message_take_body), (gst_rtsp_message_get_body),
+ (gst_rtsp_message_steal_body), (dump_mem), (dump_key_value),
+ (gst_rtsp_message_dump):
+ * gst-libs/gst/rtsp/gstrtspmessage.h:
+ * gst-libs/gst/rtsp/gstrtsprange.c: (parse_npt_time),
+ (parse_npt_range), (parse_clock_range), (parse_smpte_range),
+ (gst_rtsp_range_parse), (gst_rtsp_range_free):
+ * gst-libs/gst/rtsp/gstrtsprange.h:
+ * gst-libs/gst/rtsp/gstrtsptransport.c: (gst_rtsp_transport_new),
+ (gst_rtsp_transport_init), (gst_rtsp_transport_get_mime),
+ (gst_rtsp_transport_get_manager), (parse_mode), (parse_range),
+ (range_as_text), (rtsp_transport_mode_as_text),
+ (rtsp_transport_profile_as_text), (rtsp_transport_ltrans_as_text),
+ (gst_rtsp_transport_parse), (gst_rtsp_transport_as_text),
+ (gst_rtsp_transport_free):
+ * gst-libs/gst/rtsp/gstrtsptransport.h:
+ * gst-libs/gst/rtsp/gstrtspurl.c: (gst_rtsp_url_parse),
+ (gst_rtsp_url_free), (gst_rtsp_url_set_port),
+ (gst_rtsp_url_get_port), (gst_rtsp_url_get_request_uri):
+ * gst-libs/gst/rtsp/gstrtspurl.h:
+ * gst-libs/gst/sdp/Makefile.am:
+ * gst-libs/gst/sdp/gstsdp.h:
+ * gst-libs/gst/sdp/gstsdpmessage.c: (gst_sdp_origin_init),
+ (gst_sdp_connection_init), (gst_sdp_bandwidth_init),
+ (gst_sdp_time_init), (gst_sdp_zone_init), (gst_sdp_key_init),
+ (gst_sdp_attribute_init), (gst_sdp_message_new),
+ (gst_sdp_message_init), (gst_sdp_message_uninit),
+ (gst_sdp_message_free), (gst_sdp_media_new), (gst_sdp_media_init),
+ (gst_sdp_media_uninit), (gst_sdp_media_free),
+ (gst_sdp_message_set_origin), (gst_sdp_message_get_origin),
+ (gst_sdp_message_set_connection), (gst_sdp_message_get_connection),
+ (gst_sdp_message_add_bandwidth), (gst_sdp_message_add_time),
+ (gst_sdp_message_add_zone), (gst_sdp_message_set_key),
+ (gst_sdp_message_get_key), (gst_sdp_message_get_attribute_val_n),
+ (gst_sdp_message_get_attribute_val),
+ (gst_sdp_message_add_attribute), (gst_sdp_message_add_media),
+ (gst_sdp_media_add_attribute), (gst_sdp_media_add_bandwidth),
+ (gst_sdp_media_add_format), (gst_sdp_media_get_attribute),
+ (gst_sdp_media_get_attribute_val_n),
+ (gst_sdp_media_get_attribute_val), (gst_sdp_media_get_format),
+ (read_string), (read_string_del), (gst_sdp_parse_line),
+ (gst_sdp_message_parse_buffer), (print_media),
+ (gst_sdp_message_dump):
+ * gst-libs/gst/sdp/gstsdpmessage.h:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ Move SDP and RTSP from helper objects in -good to a reusable library.
+ Use a proper gst_ namespace.
+
+2007-07-23 18:42:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/vorbis/vorbisdec.c: Use the new buffer clipping function from gstaudio here.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward),
+ (vorbis_dec_flush_decode):
+ Use the new buffer clipping function from gstaudio here.
+
+2007-07-23 18:26:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add buffer clipping function for raw audio buffers. Fixes #456656.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/audio.c: (gst_audio_buffer_clip):
+ * gst-libs/gst/audio/audio.h:
+ * tests/check/libs/audio.c: (GST_START_TEST), (audio_suite):
+ API: Add buffer clipping function for raw audio buffers. Fixes #456656.
+ Also add deprecation guards for gst_audio_structure_set_int() to the
+ header.
+
+2007-07-23 14:45:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Cleanup the docs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Cleanup the docs.
+
+2007-07-23 11:18:35 +0000 Dan Williams <dcbw@redhat.com>
+
+ gst/playback/gstplaybasebin.c: Don't return NULL when querying the stream info value array but instead return an empt...
+ Original commit message from CVS:
+ Patch by: Dan Williams <dcbw at redhat dot com>
+ * gst/playback/gstplaybasebin.c:
+ (gst_play_base_bin_get_streaminfo_value_array):
+ Don't return NULL when querying the stream info value array but instead
+ return an empty array. Fixes #459204.
+
+2007-07-23 10:41:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gsturidecodebin.c: Init debug category before using it.
+ Original commit message from CVS:
+ * gst/playback/gsturidecodebin.c:
+ Init debug category before using it.
+
+2007-07-21 09:56:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/interfaces/mixer.h: Add padding vars in place of the signal pointers when building with DISABLE_DEPRECAT...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixer.h:
+ Add padding vars in place of the signal pointers
+ when building with DISABLE_DEPRECATED so that the
+ interface structure doesn't change size.
+
+2007-07-21 09:21:12 +0000 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ Fixes: #152864
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsamixer.h:
+ * ext/alsa/gstalsamixerelement.c:
+ * ext/alsa/gstalsamixertrack.c:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/interfaces/mixeroptions.c:
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ * tests/check/Makefile.am:
+ * tests/check/libs/mixer.c:
+ Patch By: Marc-Andre Lureau <marcandre.lureau@gmail.com>
+ Fixes: #152864
+ Add support for notifying mixer changes on the message bus, and
+ implement it in alsamixer.
+ API: gst_mixer_get_mixer_flags
+ API: gst_mixer_message_parse_mute_toggled
+ API: gst_mixer_message_parse_record_toggled
+ API: gst_mixer_message_parse_volume_changed
+ API: gst_mixer_message_parse_option_changed
+ API: GstMixerMessageType
+ API: GstMixerFlags
+
+2007-07-20 16:09:03 +0000 Michael Smith <msmith@xiph.org>
+
+ sys/xvimage/xvimagesink.c: xcontext->im_format is only for testing XShm support (as the header file comments document...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_get_xv_support), (gst_xvimagesink_setcaps):
+ xcontext->im_format is only for testing XShm support (as the header
+ file comments document). Use xvimage->im_format for everything else.
+ Avoids spurious warnings on buffer allocation before setcaps.
+
+2007-07-20 07:22:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/: We should use $(LIBM).
+ Original commit message from CVS:
+ * tests/examples/volume/Makefile.am:
+ * tests/icles/Makefile.am:
+ We should use $(LIBM).
+
+2007-07-20 06:13:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/icles/Makefile.am: This needs -lm.
+ Original commit message from CVS:
+ * tests/icles/Makefile.am:
+ This needs -lm.
+
+2007-07-18 07:35:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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-16 10:10:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Don't break ABI, restore previous ranges. Keep the default random selection of ...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_class_init), (gst_basertppayload_init),
+ (gst_basertppayload_set_property),
+ (gst_basertppayload_get_property):
+ Don't break ABI, restore previous ranges. Keep the default random
+ selection of timestamp and seqnum offset but as soon as the app sets a
+ specific value, use that one.
+
+2007-07-14 18:33:15 +0000 Bastien Nocera <hadess@hadess.net>
+
+ sys/xvimage/xvimagesink.*: Add option to turn off double-buffering for debugging purposes.
+ Original commit message from CVS:
+ Patch by: Bastien Nocera <hadess at hadess dot net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support),
+ (gst_xvimagesink_set_property), (gst_xvimagesink_get_property),
+ (gst_xvimagesink_init), (gst_xvimagesink_class_init):
+ * sys/xvimage/xvimagesink.h:
+ Add option to turn off double-buffering for debugging purposes.
+ Fixes #437169.
+
+2007-07-14 18:20:41 +0000 Jorn Baayen <jorn@openedhand.com>
+
+ sys/: add 'handle-expose' property. Useful for video widgets which may want to be in control of Expose behaviour. Fix...
+ Original commit message from CVS:
+ Patch by: Jorn Baayen <jorn at openedhand dot com>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents),
+ (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_handle_xevents),
+ (gst_xvimagesink_set_property), (gst_xvimagesink_get_property),
+ (gst_xvimagesink_init), (gst_xvimagesink_class_init):
+ * sys/xvimage/xvimagesink.h:
+ add 'handle-expose' property. Useful for video widgets which may want to
+ be in control of Expose behaviour. Fixes #380625
+
+2007-07-14 17:23:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertppayload.*: Fix ranges of rtp payloader properties so that the full range can be used in ad...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_class_init), (gst_basertppayload_init),
+ (gst_basertppayload_event), (gst_basertppayload_push),
+ (gst_basertppayload_set_property),
+ (gst_basertppayload_get_property),
+ (gst_basertppayload_change_state):
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ Fix ranges of rtp payloader properties so that the full range can be
+ used in addition to -1 (random).
+ Fix wrong seqnum reporting in caps.
+ Fixes #420326.
+
+2007-07-13 18:12:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videorate/gstvideorate.c: Use boilerplate.
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_init),
+ (gst_video_rate_query):
+ Use boilerplate.
+ Add latency query, might not be perfect yet but already works a lot
+ better. Fixes #442557.
+
+2007-07-13 16:05:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/xvimage/xvimagesink.*: After a caps change, redraw our borders to avoid garbage left there when the image format ...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put),
+ (gst_xvimagesink_setcaps):
+ * sys/xvimage/xvimagesink.h:
+ After a caps change, redraw our borders to avoid garbage left there
+ when the image format changes to a smaller size, like 16:9 -> 4:3
+ Also, hold the flow_lock a bit longer in the set_caps while we're
+ fiddling with the xcontext.
+
+2007-07-13 16:02:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 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:
+ * Makefile.am:
+ * 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-13 15:52:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Fix the r_mask test for RGBA32 on little-endian.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_caps_to_pixfmt):
+ Fix the r_mask test for RGBA32 on little-endian.
+ Fix a stupid typo that would have obviously broken
+ compilation on big-endian, if anyone was testing.
+
+2007-07-12 15:02:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videotestsrc/videotestsrc.*: Add alpha to the color struct.
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c: (paint_hline_AYUV),
+ (paint_hline_str4):
+ * gst/videotestsrc/videotestsrc.h:
+ Add alpha to the color struct.
+ Use a default alpha value of 255 instead of 128.
+
+2007-07-12 12:01:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Clear the dynamic pads counter when starting a new uri. This makes reusing playbin wor...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (no_more_pads_full),
+ (setup_source):
+ Clear the dynamic pads counter when starting a new uri. This makes
+ reusing playbin work again.
+ Fixes #454264.
+
+2007-07-12 11:13:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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:12:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Fix 'make check' build against core CVS.
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/check/elements/volume.c: (GST_START_TEST):
+ Fix 'make check' build against core CVS.
+
+2007-07-10 20:46:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/: Make gtk-doc happy.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Make gtk-doc happy.
+
+2007-07-08 13:07:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Quick hack to make audiosinks stop at EOS when operating in pull-mode; needs t...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_callback):
+ Quick hack to make audiosinks stop at EOS when operating in
+ pull-mode; needs to be fixed properly some day.
+
+2007-07-06 18:19:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Fix location of includes in the docs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Fix location of includes in the docs.
+
+2007-07-06 11:40:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/ffmpegcolorspace/: Add 2 new pixel formats - ABGR32 and ARGB32, which are reflections of the existing BGRA32 and ...
+ Original commit message from CVS:
+ * 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_convert),
+ (img_get_alpha_info):
+ Add 2 new pixel formats - ABGR32 and ARGB32, which are reflections
+ of the existing BGRA32 and RGBA32 formats with the alpha at the other
+ end of the word. Partially fixes #451908
+
+2007-07-05 08:43:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Simplify --extra-dir as gtkdoc scans recursively.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Simplify --extra-dir as gtkdoc scans recursively.
+
+2007-07-03 11:52:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.c: Make getcaps more robust by not using the proxycaps function. This makes sure that we don't end...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_sink_getcaps),
+ (gst_adder_request_new_pad):
+ Make getcaps more robust by not using the proxycaps function. This makes
+ sure that we don't end up recursively calling getcaps upstream.
+ See #316248.
+
+2007-06-29 17:21:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audioconvert/audioconvert.c: Include math.h to fix compilation.
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c:
+ Include math.h to fix compilation.
+
+2007-06-29 14:47:42 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Add a mapping for YUV format "IYU1", which is a 4:1:1 packed pixel format, ...
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt):
+ Add a mapping for YUV format "IYU1", which is a 4:1:1 packed pixel
+ format, as produced by some dc1394 cameras like the iSight.
+ See http://www.fourcc.org/yuv.php#IYU1
+
+2007-06-28 20:37:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/: Implement dithering and noise shaping in audioconvert. By default now
+ Original commit message from CVS:
+ * gst/audioconvert/Makefile.am:
+ * gst/audioconvert/audioconvert.c: (audio_convert_get_func_index),
+ (check_default), (audio_convert_prepare_context),
+ (audio_convert_clean_context), (audio_convert_convert):
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_dithering_get_type),
+ (gst_audio_convert_ns_get_type), (gst_audio_convert_class_init),
+ (gst_audio_convert_init), (gst_audio_convert_set_caps),
+ (gst_audio_convert_set_property), (gst_audio_convert_get_property):
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/audioconvert/gstaudioquantize.c:
+ (gst_audio_quantize_setup_noise_shaping),
+ (gst_audio_quantize_free_noise_shaping),
+ (gst_audio_quantize_setup_dither),
+ (gst_audio_quantize_free_dither),
+ (gst_audio_quantize_setup_quantize_func),
+ (gst_audio_quantize_setup), (gst_audio_quantize_free):
+ * gst/audioconvert/gstaudioquantize.h:
+ Implement dithering and noise shaping in audioconvert. By default now
+ TPDF dithering (and no noise shaping) will be used when converting
+ from a higher bit depth to 20 bit depth or smaller, otherwise
+ everything will be as it is now.
+ For the last audioconvert in a pipeline it would make sense to
+ use some kind of noise shaping, enabling it by default for all
+ conversions would give undesired results though. Fixes #360246.
+ * tests/check/elements/audioconvert.c: (setup_audioconvert),
+ (GST_START_TEST):
+ Adjust unit test for the new audioconvert.
+
+2007-06-28 11:06:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Use other metrics as well when estimating the buffer level.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (apply_segment), (update_buffering):
+ Use other metrics as well when estimating the buffer level.
+
+2007-06-28 10:21:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Small debug improvement.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (make_decoder), (setup_source):
+ Small debug improvement.
+ * gst/playback/gstqueue2.c: (apply_segment), (update_buffering),
+ (plugin_init):
+ Tweak the rate estimation period.
+ When calculating the buffer filledness in rate estimation mode, don't
+ mix it with other metrics.
+
+2007-06-28 09:46:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: When creating the groups, allow for a 5 second, unlimited buffers preroll phase after w...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_group_new),
+ (gst_decode_group_expose), (gst_decode_group_free), (add_fakesink):
+ When creating the groups, allow for a 5 second, unlimited buffers
+ preroll phase after which we expose the group.
+ When the group is exposed, use a small number of buffers up to a 2
+ second limit. Also disconnect the overrun signal from multiqueue when we
+ exposed the group because it is not needed anymore.
+
+2007-06-27 22:30:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/tags.c: Don't pass trailing zeroes in fixed-size string arrays in ID3v1 tags to utf8-validate; fixes...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (gst_tag_freeform_string_to_utf8):
+ Don't pass trailing zeroes in fixed-size string arrays in ID3v1 tags
+ to utf8-validate; fixes recognition of ID3v1 tags in UTF-8 encoding
+ (#451707); also, output some debugging info when dealing with
+ freeform strings.
+ * tests/check/libs/tag.c: (GST_START_TEST), (tag_suite):
+ Add unit test for the above.
+
+2007-06-27 12:55:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/descriptions.c: Add description for Windows Media RTP caps.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/descriptions.c: (caps_are_rtp_caps):
+ Add description for Windows Media RTP caps.
+ * gst-libs/gst/pbutils/missing-plugins.c: (copy_and_clean_caps):
+ Remove RTP fields that don't define the format from caps.
+
+2007-06-27 10:14:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/vorbis/vorbisdec.c: Skip empty buffers, but not empty header buffers. That way the original vorbisdec unit test s...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_decode_buffer):
+ Skip empty buffers, but not empty header buffers. That way the original
+ vorbisdec unit test still passes (#451145); also, take into account
+ that those empty packets might carry a granulepos.
+ * tests/check/Makefile.am:
+ * tests/check/elements/vorbisdec.c:
+ (_create_codebook_header_buffer), (_create_audio_buffer),
+ (GST_START_TEST), (vorbisdec_suite):
+ Add unit test that sends an empty packet.
+
+2007-06-27 09:49:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Don't error out on 0-sized packets, just emit a warning because this is not a fatal error. Fi...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_decode_buffer):
+ Don't error out on 0-sized packets, just emit a warning because this is
+ not a fatal error. Fixes #451145.
+
+2007-06-25 12:43:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/plugins/: Update docs with caps info.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Update docs with caps info.
+
+2007-06-25 12:04:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ po/POTFILES.in: Add more files with translatable strings (#450875).
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ Add more files with translatable strings (#450875).
+
+2007-06-23 14:44:07 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/ogg/gstoggdemux.c: The chain should be freed if we error out here, else it will leak.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_find_chains):
+ The chain should be freed if we error out here, else it will leak.
+ * gst/playback/gstdecodebin.c: (disconnect_unlinked_signals),
+ (cleanup_decodebin):
+ Don't forget to *properly* remove the signals, else it will leak.
+
+2007-06-22 14:25:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ MAINTAINERS: Updating all the maintainers files
+ Original commit message from CVS:
+ * MAINTAINERS:
+ Updating all the maintainers files
+
+2007-06-21 08:34:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Destroy and recreate parse-launch based pipeline after stop to be able to play again. Reo...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (update_scale), (play_cb), (stop_cb),
+ (main):
+ Destroy and recreate parse-launch based pipeline after stop to be able
+ to play again. Reorder some code and add more comments.
+
+2007-06-20 11:09:03 +0000 Wim Taymans <wim@fluendo.com>
+
+ gst/playback/gstdecodebin2.c: When handling a delayed-caps notification case, mark the group as dynamic so that the n...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (analyze_new_pad):
+ When handling a delayed-caps notification case, mark
+ the group as dynamic so that the nbdynamic count is
+ incremented and decremented correctly. Fixes: #449156
+ Patch by: Wim Taymans <wim@fluendo.com>
+
+2007-06-19 19:13:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * win32/common/config.h:
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ Original commit message from CVS:
+ 2007-06-19 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_init): Enable pull-mode operation.
+
+2007-06-19 09:34:35 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/riff/riff-media.c: Change minimum rate back to 1000 to allow low-sample-rate wav files to play back.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Change minimum rate back to 1000 to allow low-sample-rate wav files
+ to play back.
+
+2007-06-17 17:27:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/vi.po: Update translations.
+ Original commit message from CVS:
+ * po/vi.po:
+ Update translations.
+
+2007-06-16 03:42:14 +0000 David Schleef <ds@schleef.org>
+
+ gst/playback/gstqueue2.c: Fix compile error from ignored return value.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c:
+ Fix compile error from ignored return value.
+
+2007-06-15 15:23:36 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/videoscale/vs_4tap.c: Update tmpbuf for all neccesary rows, not just one, as is required when downscaling.
+ Original commit message from CVS:
+ * gst/videoscale/vs_4tap.c: (vs_image_scale_4tap_Y):
+ Update tmpbuf for all neccesary rows, not just one, as is required
+ when downscaling.
+ Fixes #402076.
+
+2007-06-15 11:15:28 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/pipelines/oggmux.c: Add a test that ensures we set DELTA_UNIT on all non-header, non-video buffers, if we...
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c: (validate_ogg_page), (is_video),
+ (eos_buffer_probe):
+ Add a test that ensures we set DELTA_UNIT on all non-header,
+ non-video buffers, if we have a video stream.
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_queue_pads),
+ (gst_ogg_mux_process_best_pad):
+ Move setting delta_pad to earlier, where we inspect all pads, so
+ that leading audio pages don't get DELTA_UNIT unset if they come
+ before the first DELTA_UNIT from video pages. Fixes the newly-added
+ test. Fixes #385527.
+
+2007-06-14 19:53:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/streamheader.c: Disable test_multifdsink_gdp_vorbisenc() on ppc64 since it fails on the p5-ppc6...
+ Original commit message from CVS:
+ * tests/check/pipelines/streamheader.c: (streamheader_suite):
+ Disable test_multifdsink_gdp_vorbisenc() on ppc64 since it
+ fails on the p5-ppc64 build bot and the failure looks like it is due
+ to the same issue as #348114, ie. a compiler bug.
+
+2007-06-13 18:20:57 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstqueue2.c: Fix build on MacOSX.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_create_read):
+ Fix build on MacOSX.
+
+2007-06-13 09:01:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Fix compilation on mingw. Fixes #446972.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_read_chain):
+ Fix compilation on mingw. Fixes #446972.
+
+2007-06-12 08:38:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Fix a division by zero when the max percent is <= 0. Fixes #446572. also update the bufferi...
+ Original commit message from CVS:
+ Patches by: Thiago Sousa Santos <thiagossantos at gmail dot com>
+ * gst/playback/gstqueue2.c: (update_buffering),
+ (gst_queue_locked_enqueue):
+ Fix a division by zero when the max percent is <= 0. Fixes #446572.
+ also update the buffering status when receiving events. Fixes #446551.
+
+2007-06-11 11:32:26 +0000 Thiago Sousa Santos <thiagossantos@gmail.com>
+
+ gst/playback/gstqueue2.c: Wait for preroll before attempting to forward a duration query upstream.
+ Original commit message from CVS:
+ Based on patch by: Thiago Sousa Santos <thiagossantos at gmail dot com>
+ * gst/playback/gstqueue2.c: (gst_queue_peer_query),
+ (gst_queue_handle_src_query):
+ Wait for preroll before attempting to forward a duration query upstream.
+ Fixes #445505.
+
+2007-06-07 21:08:38 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Use G_GINT64_CONSTANT macro for int64 constant.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Use G_GINT64_CONSTANT macro for int64 constant.
+ * win32/common/libgstinterfaces.def:
+ * win32/common/libgsttag.def:
+ Add new exported functions.
+
+2007-06-07 14:25:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggmux.c: The BOS page of the first Dirac video stream needs to come before the BOS page of any Vorbis str...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_send_headers):
+ The BOS page of the first Dirac video stream needs to come before
+ the BOS page of any Vorbis streams or other audio streams, just like
+ it is with Theora.
+
+2007-06-07 09:11:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Fix compilation.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_get_range):
+ Fix compilation.
+
+2007-06-06 13:36:26 +0000 Thiago Sousa Santos <thiagossantos@gmail.com>
+
+ gst/playback/gstqueue2.c: Add pull based scheduling and fix some deadlocks. Fixes #444523.
+ Original commit message from CVS:
+ Patch by: Thiago Sousa Santos <thiagossantos at gmail dot com>
+ * gst/playback/gstqueue2.c: (gst_queue_init),
+ (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_get_range), (gst_queue_src_checkgetrange_function),
+ (gst_queue_sink_activate_push), (gst_queue_src_activate_push),
+ (gst_queue_src_activate_pull):
+ Add pull based scheduling and fix some deadlocks. Fixes #444523.
+ Does not yet completely work because duration queries upstream won't
+ block yet.
+
+2007-06-06 09:08:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Some more fseeko checks.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/playback/gstqueue2.c: (gst_queue_create_read):
+ Some more fseeko checks.
+
+2007-06-06 08:01:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ configure.ac: check for large file support.
+ Original commit message from CVS:
+ * configure.ac:
+ check for large file support.
+
+2007-06-05 21:36:11 +0000 Sven Arvidsson <sa@whiz.se>
+
+ gst/subparse/gstsubparse.*: Add support for SubViewer version 1 and 2 subtitles. Fixes #394061.
+ Original commit message from CVS:
+ Based on a patch by Sven Arvidsson <sa at whiz dot se>:
+ * gst/subparse/gstsubparse.c: (parse_subrip),
+ (subviewer_unescape_newlines), (parse_subviewer),
+ (gst_sub_parse_data_format_autodetect),
+ (gst_sub_parse_format_autodetect), (gst_subparse_type_find):
+ * gst/subparse/gstsubparse.h:
+ Add support for SubViewer version 1 and 2 subtitles. Fixes #394061.
+ * tests/check/elements/subparse.c: (GST_START_TEST),
+ (subparse_suite):
+ Add a unit test for both SubViewer formats.
+
+2007-06-05 17:08:04 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Don't overflow intermediate values when seeking to large time values in audiotest...
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_do_seek):
+ Don't overflow intermediate values when seeking to large time values
+ in audiotestsrc.
+
+2007-06-05 17:02:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Include stdio to define fseeko.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_have_data),
+ (gst_queue_create_read), (gst_queue_read_item_from_file),
+ (gst_queue_open_temp_location_file), (gst_queue_locked_enqueue):
+ Include stdio to define fseeko.
+
+2007-06-05 16:37:09 +0000 Edward Hervey <edward@fluendo.com>
+
+ sys/v4l/gstv4lsrc.c: Make v4lsrc output segments in GST_FORMAT_TIME. Fixes #442553.
+ Original commit message from CVS:
+ Patch by: Edward Hervey <edward@fluendo.com>
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_fixate),
+ (gst_v4lsrc_query):
+ Make v4lsrc output segments in GST_FORMAT_TIME. Fixes #442553.
+
+2007-06-05 16:20:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/: Use gst_tag_utf8_from_freeform_string() from libgsttag instead of our own implementation.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_parse_info):
+ Use gst_tag_utf8_from_freeform_string() from libgsttag instead of
+ our own implementation.
+
+2007-06-05 16:19:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Handle timestamp wraparound.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_change_state):
+ Handle timestamp wraparound.
+
+2007-06-05 16:17:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gsturidecodebin.c: Make sure we name srcpads uniquely even when using different internal decodebins.
+ Original commit message from CVS:
+ * gst/playback/gsturidecodebin.c: (no_more_pads_full),
+ (new_decoded_pad), (remove_pads), (make_decoder), (setup_source),
+ (gst_uri_decode_bin_change_state):
+ Make sure we name srcpads uniquely even when using different internal
+ decodebins.
+ Signal no-more-pads when no more dynamic elements exist.
+ Remove pads on cleanup.
+
+2007-06-05 16:14:23 +0000 Thiago Sousa Santos <thiagossantos@gmail.com>
+
+ gst/playback/gstqueue2.c: Add support for filebased buffering. Fixes #441264.
+ Original commit message from CVS:
+ Based on patch by: Thiago Sousa Santos <thiagossantos at gmail dot com>
+ * gst/playback/gstqueue2.c: (gst_queue_class_init),
+ (gst_queue_init), (gst_queue_finalize),
+ (gst_queue_write_buffer_to_file), (gst_queue_have_data),
+ (gst_queue_create_read), (gst_queue_read_item_from_file),
+ (gst_queue_open_temp_location_file),
+ (gst_queue_close_temp_location_file), (gst_queue_locked_flush),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue),
+ (gst_queue_is_empty), (gst_queue_is_filled),
+ (gst_queue_change_state), (gst_queue_set_temp_location),
+ (gst_queue_set_property):
+ Add support for filebased buffering. Fixes #441264.
+
+2007-06-05 16:05:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Add support for delayed caps fixation when autoplugging.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_factory_filter),
+ (analyze_new_pad), (connect_pad), (expose_pad), (caps_notify_cb),
+ (caps_notify_group_cb), (gst_decode_group_new),
+ (gst_decode_group_free):
+ Add support for delayed caps fixation when autoplugging.
+ Optimize cases where a multiqueue is not needed/wanted, like right after
+ anything that is not a demuxer.
+
+2007-06-05 16:02:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: consideratly speedup ogg chain detection by not trying to find a base timestamp for skeleton s...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_parse_skeleton_fisbone),
+ (gst_ogg_pad_submit_packet), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_read_chain), (gst_ogg_demux_collect_chain_info):
+ consideratly speedup ogg chain detection by not trying to find a base
+ timestamp for skeleton streams.
+
+2007-06-05 16:00:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.*: Add support for remuve_flush.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type),
+ (gst_multi_fd_sink_class_init), (gst_multi_fd_sink_add_full),
+ (gst_multi_fd_sink_remove_flush),
+ (gst_multi_fd_sink_remove_client_link),
+ (gst_multi_fd_sink_handle_client_write),
+ (gst_multi_fd_sink_handle_clients):
+ * gst/tcp/gstmultifdsink.h:
+ Add support for remuve_flush.
+
+2007-06-05 15:59:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add draft design for forcing keyframes in encoders and implement in theoraenc.
+ Original commit message from CVS:
+ * docs/design/draft-keyframe-force.txt:
+ * ext/theora/theoraenc.c: (theora_enc_sink_event),
+ (theora_enc_chain):
+ Add draft design for forcing keyframes in encoders and implement in
+ theoraenc.
+
+2007-06-05 13:22:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.13 ===
+
+2007-06-05 12:50:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * gst-plugins-base.doap:
+ * win32/common/config.h:
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstadder.dsp:
+ * win32/vs6/libgstaudio.dsp:
+ * win32/vs6/libgstaudioconvert.dsp:
+ * win32/vs6/libgstaudiorate.dsp:
+ * win32/vs6/libgstaudioresample.dsp:
+ * win32/vs6/libgstaudioscale.dsp:
+ * win32/vs6/libgstaudiotestsrc.dsp:
+ * win32/vs6/libgstcdda.dsp:
+ * win32/vs6/libgstdecodebin.dsp:
+ * win32/vs6/libgstdecodebin2.dsp:
+ * win32/vs6/libgstdirectsound.dsp:
+ * win32/vs6/libgstffmpegcolorspace.dsp:
+ * win32/vs6/libgstgdp.dsp:
+ * win32/vs6/libgstinterfaces.dsp:
+ * win32/vs6/libgstnetbuffer.dsp:
+ * win32/vs6/libgstogg.dsp:
+ * win32/vs6/libgstpbutils.dsp:
+ * win32/vs6/libgstplaybin.dsp:
+ * win32/vs6/libgstriff.dsp:
+ * win32/vs6/libgstrtp.dsp:
+ * win32/vs6/libgstsinesrc.dsp:
+ * win32/vs6/libgstsubparse.dsp:
+ * win32/vs6/libgsttag.dsp:
+ * win32/vs6/libgsttheora.dsp:
+ * win32/vs6/libgsttypefindfunctions.dsp:
+ * win32/vs6/libgstutils.dsp:
+ * win32/vs6/libgstvideo.dsp:
+ * win32/vs6/libgstvideorate.dsp:
+ * win32/vs6/libgstvideoscale.dsp:
+ * win32/vs6/libgstvideotestsrc.dsp:
+ * win32/vs6/libgstvolume.dsp:
+ * win32/vs6/libgstvorbis.dsp:
+ Release 0.10.13 "What's going on?"
+ Original commit message from CVS:
+ Release 0.10.13 "What's going on?"
+
+2007-06-05 12:32:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/cs.po:
+ * po/de.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
+
+2007-05-31 17:08:58 +0000 Wim Taymans <wim@fluendo.com>
+
+ gst-libs/gst/riff/riff-media.c: In riff, the depth is stored in the size field but it just means that the least signi...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ In riff, the depth is stored in the size field but it just means that
+ the least significant bits are cleared. We can therefore just play
+ the sample as if it had a depth == width. Fixes: #440997
+ Patch by: Wim Taymans <wim@fluendo.com>
+ Patch by: Sebastian Dröge <slomo@circular-chaos.org>
+
+2007-05-31 16:36:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/floatcast/floatcast.h: Define inline when needed on win32 builds. Fixes: #441295
+ Original commit message from CVS:
+ * gst-libs/gst/floatcast/floatcast.h:
+ Define inline when needed on win32 builds. Fixes: #441295
+
+2007-05-29 13:38:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Stop buffering when the group is commited because the queues filled up.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (queue_overrun),
+ (no_more_pads_full):
+ Stop buffering when the group is commited because the queues filled up.
+ Fixes #442024.
+
+2007-05-25 10:07:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Revert commits towards #152864 made so far. We'll pick it up again after the 0.10.13 release.
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_ensure_track_list),
+ (gst_alsa_mixer_free), (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):
+ * ext/alsa/gstalsamixer.h:
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_interface_supported),
+ (gst_alsa_mixer_element_finalize), (gst_alsa_mixer_element_init),
+ (gst_alsa_mixer_element_set_property),
+ (gst_alsa_mixer_element_get_property),
+ (gst_alsa_mixer_element_change_state):
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_update):
+ * gst-libs/gst/interfaces/mixer.c: (gst_mixer_volume_changed),
+ (gst_mixer_option_changed):
+ * gst-libs/gst/interfaces/mixer.h:
+ Revert commits towards #152864 made so far. We'll pick it up again
+ after the 0.10.13 release.
+
+2007-05-24 16:22:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: After an interrupt (PAUSED/flush) assume that the next sample should not be al...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ After an interrupt (PAUSED/flush) assume that the next sample should not
+ be aligned to the previous sample. Fixes #417992.
+
+2007-05-24 15:16:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Don't add channels and rate fields to the template caps for audio/x-dts, as wavparse ...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Don't add channels and rate fields to the template caps for
+ audio/x-dts, as wavparse might not always be able to set them,
+ which would then lead to 'caps are not a real subset of the
+ template caps' warnings.
+
+2007-05-24 11:15:32 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybasebin.c: Handle unknown or invalid pads without crashing, as might occur if a media file like a...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (new_decoded_pad_full):
+ Handle unknown or invalid pads without crashing, as might occur if
+ a media file like an mp3 is specified as a subtitle file.
+ Fixes: #410039
+
+2007-05-24 10:19:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybin.c: Block the subtitle bin output queue before ghosting it and linking, then unblock after. Th...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (add_sink), (dummy_blocked_cb),
+ (setup_sinks):
+ Block the subtitle bin output queue before ghosting it and linking,
+ then unblock after. This avoids spurious not-linked errors caused
+ by the queue starting up (because it gets linked when it is ghosted).
+ Fixes: #350299
+
+2007-05-23 15:54:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/playbin.c: Use /dev/zero instead of /dev/urandom to produce an invalid subtitle file. Avoids flu...
+ Original commit message from CVS:
+ * tests/check/elements/playbin.c: (test_suburi_error_unknowntype):
+ Use /dev/zero instead of /dev/urandom to produce an invalid subtitle
+ file. Avoids flukes where the input gets typefound to some valid but
+ useless type.
+
+2007-05-22 15:45:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add unit test for gnomevfssink seeking and position reporting for file:// URIs.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/gnomevfssink.c: (setup_gnomevfssink),
+ (cleanup_gnomevfssink), (GST_START_TEST), (gnomevfssink_suite):
+ Add unit test for gnomevfssink seeking and position reporting for
+ file:// URIs.
+
+2007-05-22 15:30:26 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ ext/gnomevfs/gstgnomevfssink.*: see #412648.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_init),
+ (gst_gnome_vfs_sink_open_file), (gst_gnome_vfs_sink_handle_event),
+ (gst_gnome_vfs_sink_query), (gst_gnome_vfs_sink_render):
+ * ext/gnomevfs/gstgnomevfssink.h:
+ Fix position reporting, especially after a seek (from upstream),
+ see #412648.
+
+2007-05-22 15:04:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/cdparanoia/gstcdparanoiasrc.c: Repair umlaut.
+ Original commit message from CVS:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ Repair umlaut.
+
+2007-05-22 11:40:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/riff/riff-media.c: Specify the full valid range for MP3 samplerates. Fixes a regression caused by extra ...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Specify the full valid range for MP3 samplerates. Fixes a regression
+ caused by extra header checks since the last release.
+
+2007-05-21 15:32:42 +0000 Mike Smith <msmith@xiph.org>
+
+ sys/: Fix a locking-order bug I introduced with my changes the other day.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents):
+ Fix a locking-order bug I introduced with my changes the other day.
+ Patch by Mike Smith.
+
+2007-05-21 15:24:21 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Don't look inside 0-length packets (which indicate duplicated frames)
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_handle_data_packet):
+ Don't look inside 0-length packets (which indicate duplicated
+ frames)
+
+2007-05-21 10:25:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small cleanups.
+ Original commit message from CVS:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ (gst_cd_paranoia_src_read_sector):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Small cleanups.
+ * ext/theora/theoradec.c: (theora_dec_sink_event):
+ Fix typo.
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Add some FIXME
+ * gst/playback/gstdecodebin.c: (queue_underrun_cb):
+ And some debug info when a FIXME path is hit.
+
+2007-05-21 09:45:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Some cleanups, remove minptime property as it is now in the parent class.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_class_init),
+ (gst_base_rtp_audio_payload_init),
+ (gst_base_rtp_audio_payload_finalize),
+ (gst_base_rtp_audio_payload_handle_frame_based_buffer),
+ (gst_base_rtp_audio_payload_handle_sample_based_buffer),
+ (gst_base_rtp_payload_audio_handle_event):
+ Some cleanups, remove minptime property as it is now in the parent
+ class.
+ Override parent class event function.
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_class_init), (gst_basertppayload_init),
+ (gst_basertppayload_event), (gst_basertppayload_set_property),
+ (gst_basertppayload_get_property):
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ Add min-ptime property.
+ Add handle-event vmethod. Fixes #415001.
+
+2007-05-18 17:10:03 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update spec
+ Original commit message from CVS:
+ update spec
+
+2007-05-18 15:23:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_change_state):
+ Fix typo in comment.
+ * gst/playback/gstdecodebin.c (gst_decode_bin_class_init,
+ free_dynamics, pad_probe, close_pad_link, try_to_link_1,
+ get_our_ghost_pad, remove_element_chain, queue_underrun_cb,
+ close_link):
+ * gst/playback/gstplaybin.c (gst_play_bin_set_property,
+ gen_audio_element, remove_sinks, gst_play_bin_send_event_to_sink):
+ Remove trailing whitespaces in comments.
+ * gst/volume/Makefile.am:
+ Fix tabs.
+
+2007-05-18 15:10:08 +0000 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ * ChangeLog:
+ * gst-libs/gst/interfaces/mixer.h:
+ gst-libs/gst/interfaces/mixer.h (mixer_type, option_changed, set_option, get_option, _gst_reserved):
+ Original commit message from CVS:
+ patch by: Marc-Andre Lureau <marcandre.lureau@gmail.com>
+ * gst-libs/gst/interfaces/mixer.h (mixer_type, option_changed,
+ set_option, get_option, _gst_reserved):
+ Revert reordering functions (keep ABI).
+
+2007-05-17 17:35:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: When we create our own window, indicate that we handle the
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_put),
+ (gst_ximagesink_xwindow_new), (gst_ximagesink_handle_xevents),
+ (gst_ximagesink_show_frame):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put),
+ (gst_xvimagesink_xwindow_new), (gst_xvimagesink_handle_xevents),
+ (gst_xvimagesink_show_frame):
+ When we create our own window, indicate that we handle the
+ WM_DELETE client message from the window manager, so that it won't
+ kill our window (and our app) along with it. Handle ClientMessage,
+ post an error on the bus, and close the window. Further buffers
+ arriving will result in a FlowError because the window has been
+ destroyed.
+ Fixes: #393975
+ Clean up the X event handling loop and make them the same for
+ both xvimagesink and ximagesink while I'm at it.
+
+2007-05-17 16:27:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin2.c: Make decodebin2 autoplug depayloaders too.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_factory_filter):
+ Make decodebin2 autoplug depayloaders too.
+ * gst/playback/gsturidecodebin.c: (source_new_pad):
+ Set the newly created decoder in a usable state when autoplugging a
+ dynamic source such as RTSP.
+
+2007-05-17 16:11:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreaminfo.c: Ignore video-codec tag for audio streams and ignore audio-codec tags for video streams....
+ Original commit message from CVS:
+ * gst/playback/gststreaminfo.c: (cb_probe):
+ Ignore video-codec tag for audio streams and ignore audio-codec tags
+ for video streams. Should make codec name collection a bit more
+ robust against sloppy demuxers that send tag events containing both
+ tags down each pad.
+
+2007-05-17 15:22:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: Tweak the buffering thresholds a little.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (update_rates):
+ Tweak the buffering thresholds a little.
+ Update the buffer size with the previously calculate rate instead of
+ only when we calculate a new rate so that we get smoother buffering
+ updates.
+ * gst/playback/Makefile.am:
+ * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_base_init),
+ (gst_uri_decode_bin_class_init), (gst_uri_decode_bin_init),
+ (gst_uri_decode_bin_finalize), (gst_uri_decode_bin_set_property),
+ (gst_uri_decode_bin_get_property), (unknown_type),
+ (add_element_stream), (no_more_pads_full), (no_more_pads),
+ (source_no_more_pads), (new_decoded_pad), (array_has_value),
+ (gen_source_element), (has_all_raw_caps), (analyse_source),
+ (remove_decoders), (make_decoder), (remove_source),
+ (source_new_pad), (setup_source), (decoder_query_init),
+ (decoder_query_duration_fold), (decoder_query_duration_done),
+ (decoder_query_position_fold), (decoder_query_position_done),
+ (decoder_query_latency_fold), (decoder_query_latency_done),
+ (decoder_query_seeking_fold), (decoder_query_seeking_done),
+ (decoder_query_generic_fold), (gst_uri_decode_bin_query),
+ (gst_uri_decode_bin_change_state), (plugin_init):
+ New element that intergrates a source, optional buffering element and
+ decodebin.
+
+2007-05-17 14:17:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Bump libtheora requirement to 1.0alpha5 for the pixformat check (also has a .pc file, so we don't need ...
+ Original commit message from CVS:
+ * configure.ac:
+ Bump libtheora requirement to 1.0alpha5 for the pixformat check
+ (also has a .pc file, so we don't need the fallback check any
+ longer). Fixes #438840.
+
+2007-05-17 13:36:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstqueue2.c: fix build.
+ Original commit message from CVS:
+ * gst/playback/gstqueue2.c: (gst_queue_get_type),
+ (gst_queue_class_init), (gst_queue_finalize), (update_time_level),
+ (apply_segment), (apply_buffer), (update_buffering),
+ (reset_rate_timer), (update_rates), (gst_queue_locked_flush),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue),
+ (gst_queue_handle_sink_event), (gst_queue_is_filled),
+ (gst_queue_chain), (gst_queue_push_one), (gst_queue_loop),
+ (plugin_init):
+ fix build.
+
+2007-05-17 11:57:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: On our way to playbin2 this is the new network queue that does buffering all by itself using high and ...
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstqueue2.c: (gst_queue_get_type),
+ (gst_queue_class_init), (gst_queue_init), (gst_queue_finalize),
+ (gst_queue_getcaps), (gst_queue_bufferalloc),
+ (gst_queue_acceptcaps), (update_time_level), (apply_segment),
+ (apply_buffer), (update_buffering), (reset_rate_timer),
+ (update_rates), (gst_queue_locked_flush),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue),
+ (gst_queue_handle_sink_event), (gst_queue_is_empty),
+ (gst_queue_is_filled), (gst_queue_chain), (gst_queue_push_one),
+ (gst_queue_loop), (gst_queue_handle_src_event),
+ (gst_queue_handle_src_query), (gst_queue_sink_activate_push),
+ (gst_queue_src_activate_push), (gst_queue_change_state),
+ (gst_queue_set_property), (gst_queue_get_property), (plugin_init):
+ On our way to playbin2 this is the new network queue that does buffering
+ all by itself using high and low watermarks. It can also measure up and
+ downstream bandwidth to optimally size the queue.
+
+2007-05-17 11:16:14 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: Use the segment->last_stop value to calculate the next timestamp to generate after a seek; not the segment->sta...
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_do_seek):
+ * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_do_seek):
+ Use the segment->last_stop value to calculate the next timestamp to
+ generate after a seek; not the segment->start value.
+
+2007-05-15 20:14:06 +0000 David Schleef <ds@schleef.org>
+
+ docs/Makefile.am: Install docs even when --disable-gtk-doc is disabled. This matches the behavior of gtk+. Fixes #3...
+ Original commit message from CVS:
+ * docs/Makefile.am: Install docs even when --disable-gtk-doc
+ is disabled. This matches the behavior of gtk+. Fixes #349099.
+
+2007-05-15 17:11:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Some more chained streaming ogg timestamp fixes.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_handle_page):
+ Some more chained streaming ogg timestamp fixes.
+
+2007-05-15 16:46:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Add some FIXMEs.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_activate_chain), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_handle_page):
+ Add some FIXMEs.
+ Fix chain start/stop segment handling based on patch by
+ <ahalda at cs dot mcgill dot ca> see #320984.
+
+2007-05-15 15:33:54 +0000 Michael Smith <msmith@xiph.org>
+
+ configure.ac: We don't require a C++ compiler. So don't require one.
+ Original commit message from CVS:
+ * configure.ac:
+ We don't require a C++ compiler. So don't require one.
+
+2007-05-15 15:29:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * ext/alsa/gstalsamixer.c:
+ ext/alsa/gstalsamixer.c (source, n_poll_fds, poll_fds, gst_alsa_mixer_check, gst_alsa_mixer_dispatch, gst_alsa_mixer_...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c (source, n_poll_fds, poll_fds,
+ gst_alsa_mixer_check, gst_alsa_mixer_dispatch,
+ gst_alsa_mixer_finalize, gst_alsa_mixer_handle_source_callback,
+ gst_alsa_mixer_handle_callback, gst_alsa_mixer_elem_handle_callback,
+ gst_alsa_mixer_ensure_track_list, gst_alsa_mixer_update_option,
+ gst_alsa_mixer_update_track):
+ Apply some of the cleanup Tim suggested in #152864 afterwards.
+
+2007-05-15 14:01:26 +0000 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ ext/alsa/gstalsamixer.c (main_context, GstAlsaMixerWatch, _GstAlsaMixerWatch, source, n_poll_fds, poll_fds, gst_alsa_...
+ Original commit message from CVS:
+ patch by: Marc-Andre Lureau <marcandre.lureau@gmail.com>
+ * ext/alsa/gstalsamixer.c (main_context, GstAlsaMixerWatch,
+ _GstAlsaMixerWatch, source, n_poll_fds, poll_fds,
+ gst_alsa_mixer_watch_funcs, gst_alsa_mixer_prepare,
+ gst_alsa_mixer_check, gst_alsa_mixer_dispatch,
+ gst_alsa_mixer_finalize, gst_alsa_mixer_find_master_mixer,
+ gst_alsa_mixer_handle_source_callback,
+ gst_alsa_mixer_handle_callback, gst_alsa_mixer_elem_handle_callback,
+ gst_alsa_mixer_ensure_track_list, gst_alsa_mixer_free,
+ gst_alsa_mixer_get_volume, gst_alsa_mixer_set_volume,
+ gst_alsa_mixer_set_mute, gst_alsa_mixer_set_record,
+ gst_alsa_mixer_get_option, gst_alsa_mixer_update_option,
+ gst_alsa_mixer_update_track, _gst_alsa_mixer_set_interface):
+ * ext/alsa/gstalsamixer.h (handle_source, interface, dir):
+ * ext/alsa/gstalsamixerelement.c (gst_alsa_mixer_element_details,
+ gst_alsa_mixer_element_interface_supported,
+ gst_alsa_mixer_element_finalize, gst_alsa_mixer_element_init,
+ gst_alsa_mixer_element_set_property,
+ gst_alsa_mixer_element_get_property,
+ gst_alsa_mixer_element_change_state):
+ * ext/alsa/gstalsamixertrack.c (gst_alsa_mixer_track_update):
+ * gst-libs/gst/interfaces/mixer.c (gst_mixer_volume_changed,
+ gst_mixer_option_changed):
+ * gst-libs/gst/interfaces/mixer.h (set_option, get_option,
+ volume_changed, option_changed, _gst_reserved):
+ Implement notification for alsamixer. Fixes #152864
+
+2007-05-15 03:53:11 +0000 David Schleef <ds@schleef.org>
+
+ gst/videotestsrc/videotestsrc.*: Add support for video/x-raw-bayer.
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ Add support for video/x-raw-bayer.
+
+2007-05-13 01:06:19 +0000 David Schleef <ds@schleef.org>
+
+ sys/xvimage/xvimagesink.c: Add some sanity checking for the XVImage size returned by X.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c:
+ Add some sanity checking for the XVImage size returned by X.
+ Related to #377400.
+
+2007-05-12 16:18:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Parse and use additional caps fields as described in updated application/x-rt...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ Parse and use additional caps fields as described in updated
+ application/x-rtp caps spec.
+
+2007-05-12 16:16:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: If there is a stream in a chain without any data packets, ignore the stream in the total lengt...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_collect_chain_info):
+ If there is a stream in a chain without any data packets, ignore the
+ stream in the total length calculations. Might be related to #436820.
+
+2007-05-11 17:33:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/typefind/gsttypefindfunctions.c: Consolidate and re-work our mpeg system stream detection to probe more packets a...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg_sys_is_valid_pack),
+ (mpeg_sys_is_valid_pes), (mpeg_sys_is_valid_sys),
+ (mpeg_sys_type_find), (mpeg_ts_type_find), (mpeg4_video_type_find),
+ (mpeg_video_type_find), (mpeg_video_stream_type_find),
+ (plugin_init):
+ Consolidate and re-work our mpeg system stream detection to probe
+ more packets and produce a higher confidence result. Fixes a
+ regression caused by lowering the typefind probability last year
+ - related to bug #397810. Remove the redundant MPEG-1 specific
+ typefind function, as the new one detects both MPEG-1 & MPEG-2
+ happily.
+ Also cleanup the MPEG elementary and MPEG-TS detection functions a
+ little.
+ Tested against my media test directory, with some improvements and
+ no regressions.
+
+2007-05-10 15:28:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Connect to the new queue "pushing" signal instead of the broken "running" one.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (fill_buffer), (check_queue),
+ (queue_out_of_data):
+ Connect to the new queue "pushing" signal instead of the broken
+ "running" one.
+
+2007-05-09 21:17:40 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Move variable declaration before the first instruction.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_handle_frame_based_buffer):
+ Move variable declaration before the first instruction.
+ * gst/videotestsrc/videotestsrc.c:
+ Define M_PI if it's not defined yet.
+ * win32/common/libgstrtp.def:
+ Add new exported functions.
+
+2007-05-09 11:54:32 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: gst_pad_push_event() does not return a GstFlowReturn!
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_handle_type_packet):
+ gst_pad_push_event() does not return a GstFlowReturn!
+
+2007-05-09 11:25:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/: Some small cosmetic changes.
+ Original commit message from CVS:
+ * tests/examples/seek/scrubby.c: (stop_cb), (main):
+ * tests/examples/seek/seek.c: (do_seek):
+ Some small cosmetic changes.
+
+2007-05-08 19:24:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ gst/adder/gstadder.c (gst_adder_src_event, gst_adder_collected, gst_adder_change_state): gst/adder/gstadder.h (bps, o...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c (gst_adder_src_event, gst_adder_collected,
+ gst_adder_change_state):
+ * gst/adder/gstadder.h (bps, offset, collect_event, segment,
+ segment_pending, segment_position, segment_rate):
+ Handle playback-rate on adder.
+
+2007-05-07 11:43:31 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/: Don't push events (newsegment, tags) before initialising the decoder.
+ Original commit message from CVS:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_reset),
+ (theora_dec_sink_event), (theora_handle_comment_packet),
+ (theora_handle_type_packet), (theora_dec_change_state):
+ Don't push events (newsegment, tags) before initialising the
+ decoder.
+ This is neccesary for seeking to work correctly in gnonlin.
+
+2007-05-04 13:10:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: gst/audiotestsrc/gstaudiotestsrc.c
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst/adder/gstadder.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c
+ (gst_audio_test_src_create_white_noise):
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c (VOLUME_UNITY_INT16,
+ VOLUME_UNITY_INT16_BIT_SHIFT, VOLUME_MAX_DOUBLE,
+ volume_sink_template, volume_src_template, gst_volume_init,
+ volume_process_double, volume_process_int16,
+ volume_process_int16_clamp):
+ Doc fixes and formatting.
+
+2007-05-04 12:41:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Minimal check for volume's GstController usability; also another test for #422295.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/volume.c: (GST_START_TEST), (volume_suite):
+ Minimal check for volume's GstController usability; also another
+ test for #422295.
+
+2007-05-04 09:06:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: Fix it so that it (a) makes sense and (b) doesn't break everything cdda-related i...
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_add_track):
+ Fix it so that it (a) makes sense and (b) doesn't break
+ everything cdda-related including the unit test.
+
+2007-05-04 08:46:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: Fix build when disabling asserts.
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_add_track):
+ Fix build when disabling asserts.
+
+2007-05-03 16:29:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/ximage/ximagesink.c: When XShm is not available, we might get row strides that are not rounded up to multiples of...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new):
+ When XShm is not available, we might get row strides that are not
+ rounded up to multiples of four; this is bad, because virtually
+ every RGB-processing element in GStreamer assumes rowstrides are
+ rounded up to multiples of four, so let's allocate at least enough
+ memory to avoid crashes in this case. The image will still be
+ displayed distorted though if this happens, so that still needs
+ fixing (maybe by allocating a bigger image with an 'even' width
+ and then clipping it appropriately when rendering - something for
+ Xlib aficionados in any case).
+
+2007-05-03 13:16:21 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: If a buffer doesn't have a timestamp, assume it's contiguous with the previous buffer, ...
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ If a buffer doesn't have a timestamp, assume it's contiguous with
+ the previous buffer, and synthesise timestamps appropriately.
+
+2007-05-03 11:24:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/elements/videorate.c: Set buffer timestamp to a valid value in order to test the buffer really does stay ...
+ Original commit message from CVS:
+ * tests/check/elements/videorate.c: (GST_START_TEST):
+ Set buffer timestamp to a valid value in order to test the buffer
+ really does stay in videorate.
+
+2007-05-03 10:47:22 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/videorate/gstvideorate.c: There is no sensible way to handle incoming buffers which don't have a valid timestamp....
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_chain):
+ There is no sensible way to handle incoming buffers which don't have a
+ valid timestamp. We therefore discard them and wait for the next one.
+
+2007-05-01 18:45:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Better error message for text files.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (type_found), (plugin_init):
+ * gst/playback/gstdecodebin2.c: (plugin_init):
+ Better error message for text files.
+
+2007-04-29 14:38:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.c: Fix offset bug in generation RR packets.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_add_rb):
+ Fix offset bug in generation RR packets.
+
+2007-04-27 15:33:46 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/theora/theoradec.c: Calculate buffer duration correctly to generate a perfect stream (#433888).
+ Original commit message from CVS:
+ 2007-04-27 Julien MOUTTE <julien@moutte.net>
+ * ext/theora/theoradec.c: (_theora_granule_time),
+ (theora_dec_push_forward), (theora_handle_data_packet),
+ (theora_dec_decode_buffer): Calculate buffer duration correctly
+ to generate a perfect stream (#433888).
+ * gst/audioresample/gstaudioresample.c:
+ (audioresample_check_discont): Glib provides ABS.
+
+2007-04-27 15:01:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.*: Fix RB block parsing and writing.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_get_rb),
+ (gst_rtcp_packet_add_rb), (gst_rtcp_packet_sdes_add_item),
+ (gst_rtcp_packet_sdes_add_entry), (gst_rtcp_packet_bye_add_ssrc),
+ (gst_rtcp_packet_bye_add_ssrcs), (get_reason_offset),
+ (gst_rtcp_packet_bye_set_reason):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Fix RB block parsing and writing.
+ Add support for constructing BYE packets.
+
+2007-04-25 08:54:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ When posting a warning message because samples were dropped, post something more intelligible than he default error m...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (_do_init),
+ (gst_base_audio_src_create):
+ * po/POTFILES.in:
+ When posting a warning message because samples were dropped, post
+ something more intelligible than he default error message for clock
+ errors which is just confusing in this context (#432984).
+
+2007-04-25 08:10:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtcpbuffer.*: Implement code to write SR, RR and SDES packets.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_buffer_new),
+ (gst_rtcp_buffer_end), (gst_rtcp_buffer_get_packet_count),
+ (read_packet_header), (gst_rtcp_packet_move_to_next),
+ (gst_rtcp_buffer_add_packet), (gst_rtcp_packet_sr_set_sender_info),
+ (gst_rtcp_packet_rr_set_ssrc), (gst_rtcp_packet_add_rb),
+ (gst_rtcp_packet_sdes_get_item_count),
+ (gst_rtcp_packet_sdes_first_item),
+ (gst_rtcp_packet_sdes_next_item), (gst_rtcp_packet_sdes_get_ssrc),
+ (gst_rtcp_packet_sdes_first_entry),
+ (gst_rtcp_packet_sdes_next_entry),
+ (gst_rtcp_packet_sdes_get_entry), (gst_rtcp_packet_sdes_add_item),
+ (gst_rtcp_packet_sdes_add_entry):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Implement code to write SR, RR and SDES packets.
+
+2007-04-24 20:45:24 +0000 Christian Kirbach <Christian.Kirbach@googlemail.com>
+
+ sys/ximage/ximagesink.c: Fix build if XShm is not available (#432362).
+ Original commit message from CVS:
+ Patch by: Christian Kirbach <Christian dot Kirbach at googlemail com>
+ * sys/ximage/ximagesink.c:
+ Fix build if XShm is not available (#432362).
+
+2007-04-24 18:58:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/gstaudioconvert.c: Initalize the AudioConvertCtx with zeroes, otherwise it will contain pointers to ...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init):
+ Initalize the AudioConvertCtx with zeroes, otherwise it will contain
+ pointers to random memory which are passed to g_free() when
+ audio_convert_prepare_context() is called the first time.
+
+2007-04-24 15:00:07 +0000 Dan Williams <dcbw@redhat.com>
+
+ gst/videorate/gstvideorate.c: Don't leak incoming buffer if gst_pad_push() returns a non-OK flow. Fixes #432755.
+ Original commit message from CVS:
+ Patch by: Dan Williams <dcbw redhat com>
+ * gst/videorate/gstvideorate.c: (gst_video_rate_chain):
+ Don't leak incoming buffer if gst_pad_push() returns a
+ non-OK flow. Fixes #432755.
+ * tests/check/elements/videorate.c: (GST_START_TEST),
+ (videorate_suite):
+ Unit test for the above by Yours Truly.
+
+2007-04-23 20:04:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/gstadder.c: Fix non-flushing segmented seeks, Fixes #340060 for me
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_setcaps), (gst_adder_src_event),
+ (gst_adder_sink_event), (gst_adder_collected):
+ Fix non-flushing segmented seeks, Fixes #340060 for me
+
+2007-04-21 15:29:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: add API keyword
+ Original commit message from CVS:
+ ChangeLog surgery: add API keyword
+
+2007-04-21 15:25:22 +0000 Olivier Crete <tester@tester.ca>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Chain up to parent class in dispose function; get rid of unnecessary 'dipo...
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester ca>
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_class_init),
+ (gst_base_rtp_audio_payload_init),
+ (gst_base_rtp_audio_payload_dispose):
+ Chain up to parent class in dispose function; get rid of
+ unnecessary 'diposed' flag in private structure (#415001).
+
+2007-04-21 15:10:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Some minor docs fixes and additions; also add missing 'Since' bits.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs.types:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_class_init):
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ Some minor docs fixes and additions; also add missing 'Since' bits.
+
+2007-04-21 14:40:45 +0000 Zeeshan Ali <zeenix@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.*: The recently-added gst_base_rtp_audio_payload_push() should take an object...
+ Original commit message from CVS:
+ Patch by: Zeeshan Ali <zeenix gmail com>
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_handle_frame_based_buffer),
+ (gst_base_rtp_audio_payload_handle_sample_based_buffer),
+ (gst_base_rtp_audio_payload_push):
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ The recently-added gst_base_rtp_audio_payload_push() should take an
+ object of type GstBaseRTPAudioPayload as first argument (#431672).
+
+2007-04-21 14:14:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioresample/gstaudioresample.c: Make more functions static, just because we can.
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ Make more functions static, just because we can.
+
+2007-04-21 13:54:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/audioresample.c: Add unit test for audioresample shutdown crasher (#420106).
+ Original commit message from CVS:
+ * tests/check/elements/audioresample.c:
+ Add unit test for audioresample shutdown crasher (#420106).
+
+2007-04-20 10:42:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/subparse/: Use GST_DISABLE_XML here
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c:
+ * gst/subparse/samiparse.c:
+ Use GST_DISABLE_XML here
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put),
+ (gst_xvimagesink_xwindow_new), (gst_xvimagesink_get_xv_support),
+ (gst_xvimagesink_buffer_alloc),
+ (gst_xvimagesink_navigation_send_event):
+ * sys/xvimage/xvimagesink.h:
+ Include stdlib.h when using atoi.
+ * tests/check/elements/playbin.c: (playbin_suite):
+ Use GST_DISABLE_REGISTRY here
+
+2007-04-19 16:58:53 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/: Track initialisation state; don't try to use encoder state if we're not initialised (it'll segfault).
+ Original commit message from CVS:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c: (theora_enc_sink_setcaps),
+ (theora_enc_sink_event), (theora_enc_change_state):
+ Track initialisation state; don't try to use encoder state if we're
+ not initialised (it'll segfault).
+
+2007-04-18 11:06:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/pipelines/.cvsignore: Fix build.
+ Original commit message from CVS:
+ * tests/check/pipelines/.cvsignore:
+ Fix build.
+
+2007-04-17 10:56:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/app/Makefile.am: Fix CFLAGS and hopefully #430594.
+ Original commit message from CVS:
+ * gst/app/Makefile.am:
+ Fix CFLAGS and hopefully #430594.
+
+2007-04-17 02:53:16 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Allow random depths between 1 and 32 instead of only multiplies of 8.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Allow random depths between 1 and 32 instead of only multiplies of 8.
+
+2007-04-17 02:04:21 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Set the maximum number of channels for PCM and float in the correct place to have it ...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Set the maximum number of channels for PCM and float in the correct
+ place to have it also used when creating the template caps.
+
+2007-04-17 01:56:07 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Correctly support 4, 6 and 8 channels with normal PCM and float wav files.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Correctly support 4, 6 and 8 channels with normal PCM and float
+ wav files.
+ Fix the depth and signedness calculation in extensible wav files and
+ also handle 1, 2, 4, 6, 8 channels here when a file without channel
+ mask is found.
+ Add support for float, alaw and mulaw in extensible wav files.
+ This allows correct playback of all but 5 files from
+ http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html
+ (gst_riff_create_audio_template_caps):
+ Add voxware and float formats to the template caps.
+
+2007-04-16 22:20:03 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ ext/pango/gstclockoverlay.c: Fix unused variable warning if HAVE_LOCALTIME_R is undefinied
+ Original commit message from CVS:
+ Patch by: Vincent Torri <vtorri at univ-evry dot fr>
+ * ext/pango/gstclockoverlay.c: (gst_clock_overlay_render_time):
+ Fix unused variable warning if HAVE_LOCALTIME_R is undefinied
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ * gst/audioresample/gstaudioresample.c: (audioresample_do_output):
+ Use the correct format strings for integer formats.
+
+2007-04-16 21:44:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-plugins-base.doap:
+ fix release date
+ Original commit message from CVS:
+ fix release date
+
+2007-04-16 21:42:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-plugins-base.doap:
+ fix release date
+ Original commit message from CVS:
+ fix release date
+
+2007-04-15 14:35:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/theora/theoraenc.c (theora_buffer_from_packet, theora_enc_chain): Don't use pad_alloc_buffer_and_set_caps to crea...
+ Original commit message from CVS:
+ * ext/theora/theoraenc.c (theora_buffer_from_packet, theora_enc_chain):
+ Don't use pad_alloc_buffer_and_set_caps to create a small header
+ packet, or, worse, to create a big temporary video buffer using the
+ src pad.
+
+2007-04-14 12:34:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gdp/gstgdppay.c (gst_gdp_pay_chain): tests/check/pipelines/streamheader.c (tag_event_probe_cb,
+ Original commit message from CVS:
+ * gst/gdp/gstgdppay.c (gst_gdp_pay_chain):
+ * tests/check/pipelines/streamheader.c (tag_event_probe_cb,
+ GST_START_TEST, buffer_probe_cb, GST_START_TEST):
+ Fix a bug where serialized IN_CAPS buffers needed to be set IN_CAPS.
+
+2007-04-13 22:10:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ add debug
+ Original commit message from CVS:
+ add debug
+
+2007-04-13 21:55:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * tests/check/pipelines/streamheader.c:
+ tests/check/pipelines/streamheader.c (tag_event_probe_cb,
+ Original commit message from CVS:
+ * tests/check/pipelines/streamheader.c (tag_event_probe_cb,
+ GST_START_TEST, n_in_caps, buffer_probe_cb, GST_START_TEST,
+ streamheader_suite):
+ Add another test set up for failure
+
+2007-04-13 21:09:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ * gst/gdp/gstgdpdepay.c:
+ debug changes
+ Original commit message from CVS:
+ debug changes
+
+2007-04-13 21:08:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/Makefile.am: tests/check/pipelines/streamheader.c (n_tags, tag_event_probe_cb,
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/streamheader.c (n_tags, tag_event_probe_cb,
+ GST_START_TEST, streamheader_suite, main):
+ Add a test for the streamheader bug Wim fixed.
+
+2007-04-13 11:42:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/theora/theoradec.c: Fix misleading comment.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_sink_event):
+ Fix misleading comment.
+
+2007-04-13 06:17:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-media.c: More sanity checks for the header fields.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ More sanity checks for the header fields.
+
+2007-04-12 16:36:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/tags.c: Try encodings from all environment variables, not just those in the first environment variab...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (gst_tag_freeform_string_to_utf8):
+ Try encodings from all environment variables, not just those in the
+ first environment variable that is set.
+
+2007-04-12 15:00:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videorate/gstvideorate.c: Add some debug.
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_setcaps),
+ (gst_video_rate_chain):
+ Add some debug.
+ * tests/check/elements/videorate.c: (GST_START_TEST),
+ (videorate_suite):
+ Added check for videorate changing caps handling. Closes #421834.
+
+2007-04-12 12:57:33 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisdec.c: Use scale functions to avoid overflow when calculating duration of vorbis buffers.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ Use scale functions to avoid overflow when calculating duration of
+ vorbis buffers.
+
+2007-04-12 12:19:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_tag_freeform_string_to_utf8() (#405072).
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c: (gst_tag_freeform_string_to_utf8):
+ API: add gst_tag_freeform_string_to_utf8() (#405072).
+ * gst-libs/gst/tag/gstid3tag.c: (gst_tag_extract_id3v1_string):
+ Use gst_tag_freeform_string_to_utf8() here.
+
+2007-04-12 10:38:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ log tweaking
+ Original commit message from CVS:
+ log tweaking
+
+2007-04-12 10:03:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gdp/gstgdppay.c: Make sure we set the IN_CAPS flag correctly.
+ Original commit message from CVS:
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_chain),
+ (gst_gdp_pay_sink_event):
+ Make sure we set the IN_CAPS flag correctly.
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_render):
+ Get the IN_CAPS flag before we call functions that mess with the flags.
+
+2007-04-10 20:37:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gdp/gstgdppay.c:
+ gst/gdp/gstgdppay.c (gst_gdp_pay_reset_streamheader, gst_gdp_pay_chain, gst_gdp_pay_sink_event):
+ Original commit message from CVS:
+ * gst/gdp/gstgdppay.c (gst_gdp_pay_reset_streamheader,
+ gst_gdp_pay_chain, gst_gdp_pay_sink_event):
+ Only stamp buffers with offset/offset_end right before they get
+ pushed. This ensures offset continuity, which was not the case
+ before as shown by
+ gst-launch -v -m audiotestsrc num-buffers=10 ! audioconvert ! vorbisenc ! gdppay ! identity check-imperfect-offset=TRUE ! fakesink silent=TRUE
+
+2007-04-10 20:25:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ adding debugging
+ Original commit message from CVS:
+ adding debugging
+
+2007-04-10 11:23:18 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * common:
+ * gst-plugins-base.spec.in:
+ update spec file for RTP changes
+ Original commit message from CVS:
+ update spec file for RTP changes
+
+2007-04-06 12:58:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin.c: Activate sync in playbin, we are ready to handle it for live streams.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (add_sink),
+ (gst_play_bin_change_state):
+ Activate sync in playbin, we are ready to handle it for live streams.
+
+2007-04-06 09:56:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/playbin.c: Add small test for stream-info-value-array code paths.
+ Original commit message from CVS:
+ * tests/check/elements/playbin.c:
+ (test_sink_usage_video_only_stream), (playbin_suite):
+ Add small test for stream-info-value-array code paths.
+
+2007-04-05 15:44:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Don't try to create invalid calibration parameters by making the internal time...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_skew_slaving):
+ Don't try to create invalid calibration parameters by making the
+ internal time go backwards, instead make external time go forward.
+
+2007-04-05 10:27:06 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ gst/playback/gstplaybasebin.c: Fix leak in add_stream(), when g_value_set_object() increases the refcount of streamin...
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * gst/playback/gstplaybasebin.c: (add_stream):
+ Fix leak in add_stream(), when g_value_set_object() increases the
+ refcount of streaminfo object. Fixes #426250.
+
+2007-04-04 02:45:03 +0000 David Schleef <ds@schleef.org>
+
+ gst/videotestsrc/: Add a test pattern called "circular", which has concentric rings with varying radial frequency. T...
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c:
+ * gst/videotestsrc/videotestsrc.h:
+ Add a test pattern called "circular", which has concentric
+ rings with varying radial frequency. The main purpose of this
+ pattern is to test fidelity loss in a filter or scaler element.
+ Notably, this pattern is scale invariant, and is optimally viewed
+ with a width (and height) of 400.
+
+2007-04-03 11:10:52 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ gst/playback/gstdecodebin2.c: Decodebin2 doesn't unref pads it obtains in some occasions:
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * gst/playback/gstdecodebin2.c: (connect_pad), (expose_pad),
+ (deactivate_free_recursive):
+ Decodebin2 doesn't unref pads it obtains in some occasions:
+ - multiqueue src pads, when either connecting further or exposing
+ - sink pads of new autoplugged elements
+ - peer pads when recursively freeing elements
+ Fixes #425455.
+
+2007-03-30 17:05:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: Add audio/x-raw-float support, now that audioconvert support non-native endianness fl...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Add audio/x-raw-float support, now that audioconvert support
+ non-native endianness floats.
+
+2007-03-30 15:00:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gst-plugins-base-libs-docs.sgml: gstreamer-plugins-base.pc doesn't exist, it's gstreamer-plugins-base-0.10.pc.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ gstreamer-plugins-base.pc doesn't exist, it's
+ gstreamer-plugins-base-0.10.pc.
+
+2007-03-29 18:42:34 +0000 René Stadler <mail@renestadler.de>
+
+ with some minor changes
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ with some minor changes
+ * gst-libs/gst/floatcast/floatcast.h:
+ Use more efficient float endianness conversion functions that don't
+ involve 2 function calls per value.
+ * gst/audioconvert/audioconvert.c: (audio_convert_get_func_index),
+ (check_default), (audio_convert_prepare_context):
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_parse_caps), (make_lossless_changes):
+ Support non-native endianness floats as input and output.
+ Fixes #339838.
+ * tests/check/elements/audioconvert.c: (verify_convert),
+ (GST_START_TEST):
+ Add unit tests for the non-native endianness float conversions.
+
+2007-03-29 16:23:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Add Private structure.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_base_init),
+ (gst_base_rtp_depayload_class_init), (gst_base_rtp_depayload_init),
+ (gst_base_rtp_depayload_setcaps), (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_change_state),
+ (gst_base_rtp_depayload_set_property),
+ (gst_base_rtp_depayload_get_property):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Add Private structure.
+ Bring element code to 2007.
+ Parse clock-base caps param and use it when generating the
+ newsegment.
+ Reset variables before going to PAUSED.
+ Fix some docs.
+
+2007-03-29 16:20:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add RTCP docs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_get_adapter):
+ Add RTCP docs.
+ Fix some more docs.
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtp/gstrtcpbuffer.c:
+ (gst_rtcp_buffer_new_take_data), (gst_rtcp_buffer_new_copy_data),
+ (gst_rtcp_buffer_validate_data), (gst_rtcp_buffer_validate),
+ (gst_rtcp_buffer_get_packet_count), (read_packet_header),
+ (gst_rtcp_buffer_get_first_packet), (gst_rtcp_packet_move_to_next),
+ (gst_rtcp_buffer_add_packet), (gst_rtcp_packet_remove),
+ (gst_rtcp_packet_get_padding), (gst_rtcp_packet_get_type),
+ (gst_rtcp_packet_get_count), (gst_rtcp_packet_get_length),
+ (gst_rtcp_packet_sr_get_sender_info),
+ (gst_rtcp_packet_sr_set_sender_info),
+ (gst_rtcp_packet_rr_get_ssrc), (gst_rtcp_packet_rr_set_ssrc),
+ (gst_rtcp_packet_get_rb_count), (gst_rtcp_packet_get_rb),
+ (gst_rtcp_packet_add_rb), (gst_rtcp_packet_set_rb),
+ (gst_rtcp_packet_sdes_get_chunk_count),
+ (gst_rtcp_packet_sdes_first_chunk),
+ (gst_rtcp_packet_sdes_next_chunk), (gst_rtcp_packet_sdes_get_ssrc),
+ (gst_rtcp_packet_sdes_first_item),
+ (gst_rtcp_packet_sdes_next_item), (gst_rtcp_packet_sdes_get_item),
+ (gst_rtcp_packet_bye_get_ssrc_count),
+ (gst_rtcp_packet_bye_get_nth_ssrc), (gst_rtcp_packet_bye_add_ssrc),
+ (gst_rtcp_packet_bye_add_ssrcs), (get_reason_offset),
+ (gst_rtcp_packet_bye_get_reason_len),
+ (gst_rtcp_packet_bye_get_reason), (gst_rtcp_packet_bye_set_reason):
+ * gst-libs/gst/rtp/gstrtcpbuffer.h:
+ Add new helper object for parsing and creating RTCP messages.
+
+2007-03-29 12:07:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst-libs/gst/riff/riff-media.c: PCM samples with width=8 must be always unsigned, no matter what depth they have.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ PCM samples with width=8 must be always unsigned, no matter what
+ depth they have.
+
+2007-03-29 11:24:47 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/videorate/gstvideorate.c (gst_video_rate_flush_prev): Make perfect offsets also, not just timestamps.
+ Original commit message from CVS:
+ 2007-03-29 Andy Wingo <wingo@pobox.com>
+ * gst/videorate/gstvideorate.c (gst_video_rate_flush_prev): Make
+ perfect offsets also, not just timestamps.
+ * tests/check/elements/videorate.c (test_more): Test that given
+ any incoming offsets, that videorate produces perfect offsets.
+
+2007-03-29 10:19:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-ids.h: Add some more RIFF formats.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ Add some more RIFF formats.
+
+2007-03-29 10:17:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.*: Fix fixed payload names and docs.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_default_clock_rate):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Fix fixed payload names and docs.
+ Added method to get the default clock rates of fixed payload types.
+ API: GstRTPBuffer::gst_rtp_buffer_default_clock_rate()
+
+2007-03-28 15:24:40 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ tests/check/pipelines/.cvsignore: Add new vorbisdec test to cvsignore.
+ Original commit message from CVS:
+ * tests/check/pipelines/.cvsignore:
+ Add new vorbisdec test to cvsignore.
+
+2007-03-28 14:50:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.*: Store private stuff in GstBaseAudioSinkPrivate.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type),
+ (gst_base_audio_sink_class_init), (gst_base_audio_sink_init),
+ (gst_base_audio_sink_query), (gst_base_audio_sink_get_time),
+ (gst_base_audio_sink_set_property),
+ (gst_base_audio_sink_get_property), (gst_base_audio_sink_event),
+ (clock_convert_external), (gst_base_audio_sink_resample_slaving),
+ (gst_base_audio_sink_skew_slaving),
+ (gst_base_audio_sink_handle_slaving), (gst_base_audio_sink_render),
+ (gst_base_audio_sink_async_play):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Store private stuff in GstBaseAudioSinkPrivate.
+ Add configurable clock slaving modes property.
+ API:: GstBaseAudioSink::slave-method property
+ Some more latency reporting tweaks.
+ Added skew based clock slaving correction and make it the default until
+ the resampling method is more robust.
+
+2007-03-27 12:44:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/audioconvert/audioconvert.c: Add docs to the integer pack functions and implement proper rounding. Before we had ...
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c:
+ Add docs to the integer pack functions and implement proper
+ rounding. Before we had rounding towards negative infinity, i.e.
+ always the smaller number was taken. Now we use natural rounding,
+ i.e. rounding to the nearest integer and to the one with the largest
+ absolute value for X.5. The old rounding introduced some minor
+ distortions. Fixes #420079
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Fix one unit test that assumed the old rounding and added unit tests
+ for checking signed/unsigned int16 <-> signed/unsigned int16 with
+ depth 8, one for signed int16 <-> unsigned int16 and one for the new
+ rounding from signed int32 to signed/unsigned int16.
+
+2007-03-27 11:31:17 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/gstaudioconvert.c: Fix typo in debug line introduced recently, as pointed out on irc.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (strip_width_64),
+ (gst_audio_convert_transform_caps):
+ Fix typo in debug line introduced recently, as pointed out on irc.
+
+2007-03-27 10:17:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Make sure we parse floating-point numbers in vorbis comments correctly with either '.' or ',' as separator, no matter...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Make sure we parse floating-point numbers in vorbis comments
+ correctly with either '.' or ',' as separator, no matter what
+ the current locale is. Add unit test for this too.
+
+2007-03-27 09:37:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/pipelines/vorbisdec.c:
+ commit new file
+ Original commit message from CVS:
+ commit new file
+
+2007-03-26 22:38:19 +0000 René Stadler <mail@renestadler.de>
+
+ gst-libs/gst/tag/gstvorbistag.c: When writing out floating-point numbers to vorbis comment tags, always use the same ...
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler de>
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_tag_to_vorbis_comments):
+ When writing out floating-point numbers to vorbis comment tags, always
+ use the same character as separator no matter what the current locale is
+ (fixes #423051).
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Add unit tests for replaygain tags in vorbis comments (closes #423055).
+
+2007-03-26 20:56:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/vorbis/vorbisdec.c (vorbis_dec_push_forward, vorbis_handle_data_packet):
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c (vorbis_dec_push_forward,
+ vorbis_handle_data_packet):
+ Correctly set DURATION to generate a timestamp-continuous stream.
+ One bug left at the end; see
+ ihttp://bugzilla.gnome.org/show_bug.cgi?id=423086
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/vorbisenc.c (GST_START_TEST):
+ Add a test to check this. Without the above patch this test fails.
+
+2007-03-26 11:44:07 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/rtp/Makefile.am: The base audio payloader uses GstAdapter - we need GST_BASE_LIBS.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/Makefile.am:
+ The base audio payloader uses GstAdapter - we need GST_BASE_LIBS.
+
+2007-03-23 15:43:24 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2007-03-23 12:32:33 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/videorate/gstvideorate.c: If videorate changes caps, we can no longer use the old buffer (which may have a differ...
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_setcaps),
+ (gst_video_rate_reset), (gst_video_rate_chain):
+ If videorate changes caps, we can no longer use the old buffer
+ (which may have a different size, incompatible with our caps).
+ So don't do that; just duplicate the new frame more times.
+
+2007-03-22 17:43:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybin.c: Remove playbin's override of the set_clock vmethod. It's irrelevant after Wim's commit on ...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init):
+ Remove playbin's override of the set_clock vmethod. It's irrelevant
+ after Wim's commit on the 19th.
+
+2007-03-22 14:37:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst-libs/gst/app/Makefile.am: Use GST_ALL_LDFLAGS, which actually exists, but maybe David can confirm that was what h...
+ Original commit message from CVS:
+ * gst-libs/gst/app/Makefile.am:
+ Use GST_ALL_LDFLAGS, which actually exists, but maybe David
+ can confirm that was what he wanted.
+
+2007-03-22 09:26:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/gnomevfs/gstgnomevfssrc.*: Don't cache file sizes. Fixes #341078.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_get_size),
+ (gst_gnome_vfs_src_start), (gst_gnome_vfs_src_stop):
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ Don't cache file sizes. Fixes #341078.
+
+2007-03-21 11:03:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Use GST_PTR_FORMAT to log caps.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (add_sink):
+ Use GST_PTR_FORMAT to log caps.
+
+2007-03-21 10:23:11 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: Special-case some more colour names that pango doesn't handle by default. Fixes #420578.
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/subparse/samiparse.c: (handle_start_font):
+ Special-case some more colour names that pango doesn't handle by
+ default. Fixes #420578.
+
+2007-03-20 11:49:55 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.c: If we get a zero-sized input buffer, don't pass it to libvorbis, as that marks EOS internally...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_chain):
+ If we get a zero-sized input buffer, don't pass it to libvorbis, as
+ that marks EOS internally. After that, libvorbis will buffer all
+ input data, and encode none of it, eventually leading to memory
+ exhaustion.
+
+2007-03-19 10:52:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Don't post STATE_DIRTY anymore.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (remove_fakesink):
+ Don't post STATE_DIRTY anymore.
+ * gst/playback/gstplaybin.c: (add_sink), (gst_play_bin_send_event),
+ (gst_play_bin_change_state):
+ Remove stream_time reset in seek handling, core does that now.
+ Disable clocking for live pipelines by forcing a NULL clock to the
+ complete pipeline, core is too smart now for our previous hack.
+ We can always autoplug in PAUSED now.
+
+2007-03-18 03:14:01 +0000 David Schleef <ds@schleef.org>
+
+ REQUIREMENTS: Update this file, change the formatting to make it more consistent, plus more machine readable.
+ Original commit message from CVS:
+ * REQUIREMENTS: Update this file, change the formatting to make
+ it more consistent, plus more machine readable.
+
+2007-03-16 17:29:09 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/gstaudioconvert.c: Previous fix was too simplistic, and broke the tests. Use a better approach; only...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (make_lossless_changes),
+ (strip_width_64), (append_with_other_format):
+ Previous fix was too simplistic, and broke the tests. Use a better
+ approach; only strip 64 from widths for integer audio.
+
+2007-03-16 16:42:23 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/gstaudioconvert.c: We don't support 64 bit integer audio, so don't try to claim we can.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (make_lossless_changes),
+ (gst_audio_convert_transform_caps):
+ We don't support 64 bit integer audio, so don't try to claim we can.
+ Stops us producing caps don't match our template caps.
+ Update comments.
+
+2007-03-15 10:52:21 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioresample/gstaudioresample.c: Don't trigger discontinuities for very small imperfections; a filter flush will...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ (audioresample_check_discont), (audioresample_transform):
+ Don't trigger discontinuities for very small imperfections; a filter
+ flush will sound bad, and many plugins have rounding errors leading
+ to these.
+
+2007-03-14 21:11:18 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.*: olivier.crete@collabora.co.uk.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ Add min-ptime property to RTP base audio payloader. Patch by
+ olivier.crete@collabora.co.uk.
+ Fixes #415001
+ Indentation/whitespace/documentation fixes.
+
+2007-03-14 17:16:30 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/audioresample/gstaudioresample.c: Handle discontinuous streams.
+ Original commit message from CVS:
+ 2007-03-14 Julien MOUTTE <julien@moutte.net>
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init),
+ (audioresample_transform_size), (audioresample_do_output),
+ (audioresample_transform), (audioresample_pushthrough): Handle
+ discontinuous streams.
+ * gst/audioresample/gstaudioresample.h:
+ * tests/check/elements/audioresample.c:
+ (test_discont_stream_instance), (GST_START_TEST),
+ (audioresample_suite): Add a test for discontinuous streams.
+ * win32/common/config.h: Updated.
+
+2007-03-14 15:16:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Update translations from translation project.
+ Original commit message from CVS:
+ * po/af.po:
+ * po/az.po:
+ * po/cs.po:
+ * po/en_GB.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 from translation project.
+
+2007-03-14 15:05:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/gstgdpdepay.c:
+ add buffer logging
+ Original commit message from CVS:
+ add buffer logging
+
+2007-03-14 14:48:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/audioresample/: Since I really am not interested in a debug line for each sample being processed, move the librar...
+ Original commit message from CVS:
+ * gst/audioresample/debug.h:
+ * gst/audioresample/resample.c: (resample_init):
+ Since I really am not interested in a debug line for each sample
+ being processed, move the library's debugging to its own category,
+ libaudioresample
+
+2007-03-14 14:09:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/audioresample/gstaudioresample.c:
+ add debugging and reformat docs
+ Original commit message from CVS:
+ add debugging and reformat docs
+
+2007-03-12 23:29:07 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Since the plugin doesn't support anything other than 4:2:0 right now, post an error and fail ...
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_handle_type_packet):
+ Since the plugin doesn't support anything other than 4:2:0 right
+ now, post an error and fail if we get something else. Won't matter
+ until libtheora supports the other pixel formats, but hopefully
+ that'll be soon...
+
+2007-03-12 15:50:35 +0000 Alex Lancaster <alexlan@fedoraproject.org>
+
+ * ChangeLog:
+ I'm too lazy to comment this
+ Original commit message from CVS:
+ Mention Patch by: Alex Lancaster in a recent commit.
+
+2007-03-12 11:47:42 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ examples/app/.cvsignore: The buildbot demands .cvsignore files, and I comply.
+ Original commit message from CVS:
+ * examples/app/.cvsignore:
+ The buildbot demands .cvsignore files, and I comply.
+
+2007-03-11 00:48:26 +0000 David Schleef <ds@schleef.org>
+
+ Add appsrc/appsink example.
+ Original commit message from CVS:
+ * configure.ac:
+ * examples/Makefile.am:
+ * examples/app/Makefile.am:
+ * examples/app/appsrc_ex.c:
+ Add appsrc/appsink example.
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstapp.c:
+ * gst-libs/gst/app/gstappsink.c:
+ * gst-libs/gst/app/gstappsink.h:
+ * gst/app/gstapp.c:
+ Add appsink.
+
+2007-03-10 15:59:33 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Use gst_guint64_to_gdouble for conversion.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:(gst_base_audio_sink_render):
+ Use gst_guint64_to_gdouble for conversion.
+ * win32/MANIFEST:
+ Add new files to the win32 MANIFEST.
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstpbutils.def:
+ Add new exported functions.
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstdecodebin.dsp:
+ * win32/vs6/libgstplaybin.dsp:
+ Change the link to libgstpbutils.lib.
+ * win32/vs6/libgstdecodebin2.dsp:
+ Add a new project for decodebin2.
+ * win32/vs6/libgstpbutils.dsp:
+ Add a new project for pbutils.
+
+2007-03-10 12:18:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Also accept partial dates with only year and month, like 1999-12-00 (fixes #410396 e...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ Also accept partial dates with only year and month,
+ like 1999-12-00 (fixes #410396 even more).
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Add unit test for the above.
+
+2007-03-10 11:21:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/subparse.c: Add unit test for MPL2 subtitle format (#413799).
+ Original commit message from CVS:
+ * tests/check/elements/subparse.c: (GST_START_TEST),
+ (subparse_suite):
+ Add unit test for MPL2 subtitle format (#413799).
+
+2007-03-10 11:17:52 +0000 Kamil Pawlowski <kamilpe@gmail.com>
+
+ gst/subparse/: Add support for MPL2 subtitle format (#413799).
+ Original commit message from CVS:
+ Patch by: Kamil Pawlowski <kamilpe gmail com>
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect),
+ (gst_sub_parse_format_autodetect), (gst_sub_parse_sink_event),
+ (gst_subparse_type_find):
+ * gst/subparse/gstsubparse.h:
+ * gst/subparse/mpl2parse.c: (mpl2_parse_line), (parse_mpl2):
+ * gst/subparse/mpl2parse.h:
+ Add support for MPL2 subtitle format (#413799).
+
+2007-03-09 17:33:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: We require core CVS for the new buffer metadata copy functions.
+ Original commit message from CVS:
+ * configure.ac:
+ We require core CVS for the new buffer metadata copy functions.
+
+2007-03-09 16:51:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/tag/gstid3tag.c: Add read support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Add read support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag.
+ Fixes #414496.
+
+2007-03-09 16:46:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: Improve adapter usage and comments.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_sink_setcaps),
+ (gst_vis_src_negotiate), (get_buffer), (gst_visual_chain):
+ Improve adapter usage and comments.
+
+2007-03-09 16:38:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Use new metadata copy function.
+ Original commit message from CVS:
+ * ext/pango/gsttextrender.c: (gst_text_render_chain):
+ * ext/vorbis/vorbistag.c: (gst_vorbis_tag_parse_packet):
+ * gst-libs/gst/netbuffer/gstnetbuffer.c: (gst_netbuffer_copy):
+ Use new metadata copy function.
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_transform):
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform):
+ Basetransform copied the metadata for us.
+
+2007-03-09 16:28:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Some more logging. Only accept newsegment events in TIME format and send a WARNING messag...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_text_event),
+ (gst_text_overlay_video_event):
+ Some more logging. Only accept newsegment events in TIME format and
+ send a WARNING message if they are not in TIME format.
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_init), (gst_sub_parse_src_event), (handle_buffer),
+ (gst_sub_parse_chain), (gst_sub_parse_sink_event):
+ * gst/subparse/gstsubparse.h:
+ No need to allocate GstSegment structure dynamically, just put it
+ into the instance structure; ignore newsegment events in BYTE
+ format and in particular don't let it overwrite our saved TIME
+ segment from the last seek.
+
+2007-03-09 13:05:04 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/typefind/gsttypefindfunctions.c: Replace AC3 typefinder with one that isn't terrible, and actually works usefully.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (ac3_type_find):
+ Replace AC3 typefinder with one that isn't terrible, and actually
+ works usefully.
+
+2007-03-09 12:22:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/audioconvert/gstaudioconvert.c: fix error category and translatable string
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_transform):
+ fix error category and translatable string
+
+2007-03-09 11:23:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ pkgconfig/: Fix up utils => pbutils here too.
+ Original commit message from CVS:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ Fix up utils => pbutils here too.
+
+2007-03-09 10:49:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Break out of loop in chain function as soon as possible if we get a non-OK flow return.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (handle_buffer):
+ Break out of loop in chain function as soon as possible if we get
+ a non-OK flow return.
+
+2007-03-08 18:26:07 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/alsa.c: Unref the mixer if the state change fails too (if the alsa devices are inaccessible, for...
+ Original commit message from CVS:
+ * tests/check/elements/alsa.c: (GST_START_TEST):
+ Unref the mixer if the state change fails too (if the
+ alsa devices are inaccessible, for example)
+
+2007-03-08 17:49:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/Makefile.am: Don't test libvisual elements in the states check, because libvisual seems to leak internally.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Don't test libvisual elements in the states check, because libvisual
+ seems to leak internally.
+ Re-enable the alsa and states tests now that there's new suppressions
+ in gst.supp.
+ * tests/check/elements/alsa.c: (GST_START_TEST):
+ Don't leak the alsamixer we instantiated.
+
+2007-03-08 15:22:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: Move some cleanup stuff from the state change handler into a _reset() function that can be called from _finaliz...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear),
+ (gst_ximagesink_change_state), (gst_ximagesink_reset),
+ (gst_ximagesink_finalize):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state),
+ (gst_xvimagesink_reset), (gst_xvimagesink_finalize):
+ Move some cleanup stuff from the state change handler into a _reset()
+ function that can be called from _finalize(). This ensures that things
+ get freed even if (for some reason) the NULL->READY state transition
+ fails in the parent class.
+ Even if a parent state change fails, process our downward state change
+ logic instead of bailing out early.
+ Free the correct xcontext pointer in ximagesink's xcontext_clear.
+
+2007-03-08 12:53:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/alsa/gstalsasink.c: Extra log line.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_open):
+ Extra log line.
+ * ext/pango/gstclockoverlay.c: (gst_clock_overlay_init):
+ * ext/pango/gsttimeoverlay.c: (gst_time_overlay_init):
+ Use pango_font_description_set_family_static instead of
+ pango_font_description_set_family to save a string copy (it was
+ leaking due to the strdup anyway)
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_finalize):
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_finalize):
+ * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_finalize):
+ * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_finalize):
+ Chain up in finalize.
+
+2007-03-07 18:50:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixertrack.c: API: add "untranslated-label" property which should be set by implementations a...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixertrack.c:
+ (gst_mixer_track_class_init), (gst_mixer_track_get_property),
+ (gst_mixer_track_set_property):
+ API: add "untranslated-label" property which should be set by
+ implementations at construct time (#414645).
+ * ext/alsa/gstalsamixeroptions.c: (gst_alsa_mixer_options_new):
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new):
+ Set "untranslated-label" when constructing mixer track objects.
+ * tests/check/elements/alsa.c: (GST_START_TEST), (alsa_suite):
+ Unit test to check the above.
+
+2007-03-07 17:15:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Fix confusing debug message.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_read_chain):
+ Fix confusing debug message.
+
+2007-03-07 17:12:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-plugins-base.doap: update doap file with new version
+ Original commit message from CVS:
+ * gst-plugins-base.doap:
+ update doap file with new version
+
+2007-03-07 17:05:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ update docs
+ Original commit message from CVS:
+ update docs
+
+2007-03-07 16:56:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.12 ===
+
+2007-03-07 16:46:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/config.h:
+ Release 0.10.12
+ Original commit message from CVS:
+ Release 0.10.12
+
+2007-03-07 15:35:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * common:
+ * po/af.po:
+ * po/az.po:
+ * po/cs.po:
+ * po/de.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
+
+2007-03-06 12:31:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump version to 0.10.11.4 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version to 0.10.11.4 pre-release
+
+2007-03-06 12:10:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Fix regression that made GStreamer skip the first samples of audio.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_async_play):
+ Fix regression that made GStreamer skip the first samples of audio.
+ Fixes #414684.
+
+2007-03-05 11:21:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump version to 0.10.11.3 pre-release
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version to 0.10.11.3 pre-release
+
+2007-03-05 09:35:29 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ po/POTFILES.in: Update paths for the rename from utils to pbutils to fix the build.
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ Update paths for the rename from utils to pbutils to fix the build.
+
+2007-03-05 09:27:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/pbutils/Makefile.am: Change directory to install headers in from gst/utils to gst/pbutils as well.
+ Original commit message from CVS:
+ * gst-libs/gst/pbutils/Makefile.am:
+ Change directory to install headers in from gst/utils to gst/pbutils
+ as well.
+
+2007-03-04 23:41:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/libs/.gitignore:
+ moap ignore
+ Original commit message from CVS:
+ moap ignore
+
+2007-03-04 23:41:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/libgstutils.def:
+ update defs
+ Original commit message from CVS:
+ update defs
+
+2007-03-04 23:39:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ rename utils to pbutils
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/pbutils/Makefile.am:
+ * gst-libs/gst/pbutils/descriptions.c:
+ (gst_pb_utils_get_source_description),
+ (gst_pb_utils_get_sink_description),
+ (gst_pb_utils_get_decoder_description),
+ (gst_pb_utils_get_encoder_description),
+ (gst_pb_utils_get_element_description),
+ (gst_pb_utils_add_codec_description_to_tag_list),
+ (gst_pb_utils_get_codec_description), (gst_pb_utils_list_all):
+ * gst-libs/gst/pbutils/descriptions.h:
+ * gst-libs/gst/pbutils/install-plugins.c:
+ * gst-libs/gst/pbutils/install-plugins.h:
+ * gst-libs/gst/pbutils/missing-plugins.c:
+ (gst_missing_uri_source_message_new),
+ (gst_missing_uri_sink_message_new),
+ (gst_missing_element_message_new),
+ (gst_missing_decoder_message_new),
+ (gst_missing_encoder_message_new),
+ (gst_missing_plugin_message_get_description):
+ * gst-libs/gst/pbutils/missing-plugins.h:
+ * gst-libs/gst/pbutils/pbutils.c: (gst_pb_utils_init):
+ * gst-libs/gst/pbutils/pbutils.h:
+ * gst-libs/gst/utils/Makefile.am:
+ * gst-libs/gst/utils/base-utils.c:
+ * gst-libs/gst/utils/base-utils.h:
+ * gst-libs/gst/utils/descriptions.c:
+ * gst-libs/gst/utils/descriptions.h:
+ * gst-libs/gst/utils/install-plugins.c:
+ * gst-libs/gst/utils/install-plugins.h:
+ * gst-libs/gst/utils/missing-plugins.c:
+ * gst-libs/gst/utils/missing-plugins.h:
+ * gst-plugins-base.spec.in:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstdecodebin2.c:
+ * gst/playback/gstplaybasebin.c: (setup_subtitle),
+ (gen_source_element):
+ * gst/playback/gstplaybin.c: (plugin_init):
+ * tests/check/Makefile.am:
+ * tests/check/libs/pbutils.c: (GST_START_TEST),
+ (test_pb_utils_install_plugins_do_callout), (libgstpbutils_suite):
+ * tests/check/libs/utils.c:
+ rename utils to pbutils
+
+2007-03-03 10:23:03 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/app/Makefile.am: Install the headers.
+ Original commit message from CVS:
+ * gst-libs/gst/app/Makefile.am:
+ Install the headers.
+
+2007-03-03 10:10:30 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/app/: Add GstAppBuffer that includes a callback and closure for proper handling of data chunks.
+ Original commit message from CVS:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstappbuffer.c:
+ * gst-libs/gst/app/gstappbuffer.h:
+ * gst-libs/gst/app/gstappsrc.c:
+ Add GstAppBuffer that includes a callback and closure for
+ proper handling of data chunks.
+
+2007-03-03 09:06:06 +0000 David Schleef <ds@schleef.org>
+
+ gst-libs/gst/app/gstappsrc.*: Hacking to address issues in 413418.
+ Original commit message from CVS:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/app/gstappsrc.h:
+ Hacking to address issues in 413418.
+
+2007-03-03 08:16:57 +0000 David Schleef <ds@schleef.org>
+
+ Move the app library to gst-libs/gst/app (duh!)
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ * ext/Makefile.am:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/app/Makefile.am:
+ * gst-libs/gst/app/gstapp.c:
+ * gst-libs/gst/app/gstappsrc.c:
+ * gst-libs/gst/app/gstappsrc.h:
+ * gst/app/Makefile.am:
+ * gst/app/gstapp.c:
+ * gst/app/gstappsrc.c:
+ * gst/app/gstappsrc.h:
+ Move the app library to gst-libs/gst/app (duh!)
+
+2007-03-02 12:59:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add documentation for decodebin2 that indicates that the API is still unstable.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/inspect/plugin-decodebin2.xml:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init):
+ Add documentation for decodebin2 that indicates that the API
+ is still unstable.
+
+2007-03-01 18:50:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Update to 0.10.11.2 (0.10.12 pre-release)
+ Original commit message from CVS:
+ * configure.ac:
+ Update to 0.10.11.2 (0.10.12 pre-release)
+
+2007-03-01 17:29:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: base time is irrelevant here.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_async_play):
+ base time is irrelevant here.
+
+2007-03-01 17:01:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/: Improve debugging.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func):
+ * gst-libs/gst/audio/gstaudiosrc.c: (audioringbuffer_thread_func):
+ Improve debugging.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_query), (gst_base_audio_sink_event),
+ (gst_base_audio_sink_render), (gst_base_audio_sink_async_play):
+ Improve latency and clock slaving calculations.
+ Improve slave clock calibration.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_commit_full):
+ When we are asked to render N sample to 0 bytes, return N.
+
+2007-03-01 16:48:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.*: Remove unused dispose function.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_class_init),
+ (gst_alsasink_write), (gst_alsasink_reset):
+ * ext/alsa/gstalsasink.h:
+ Remove unused dispose function.
+ Rename lock to not interfere with alsasrc lock.
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_finalize),
+ (gst_alsasrc_class_init), (gst_alsasrc_init), (set_swparams),
+ (gst_alsasrc_read), (gst_alsasrc_reset):
+ * ext/alsa/gstalsasrc.h:
+ Implement finalize function.
+ Use lock to protect alsa access.
+ Implement _reset.
+ Fine tune sw params.
+
+2007-03-01 10:20:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * configure.ac:
+ typo
+ Original commit message from CVS:
+ typo
+
+2007-02-28 19:27:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: Convert to new AG_GST style.
+ Original commit message from CVS:
+ * configure.ac:
+ Convert to new AG_GST style.
+
+2007-02-28 15:17:20 +0000 Ed Catmur <ed@catmur.co.uk>
+
+ gst/playback/gstplaybin.c: Fix race condition when rapidly switching visualisations in playbin.
+ Original commit message from CVS:
+ Patch by: Ed Catmur <ed at catmur dot co dot uk>
+ * gst/playback/gstplaybin.c: (gst_play_bin_vis_unblocked),
+ (gst_play_bin_vis_blocked), (gst_play_bin_set_property):
+ Fix race condition when rapidly switching visualisations in playbin.
+ Fixes #401029.
+
+2007-02-28 15:11:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/Makefile.am: Include local stuff before system installed things in LDFLAGS and
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Include local stuff before system installed things in LDFLAGS and
+ CFLAGS.
+
+2007-02-28 15:10:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Improve debugging.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_sink_activate):
+ Improve debugging.
+
+2007-02-28 15:05:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/v4l/: Fix duration and timestamping, taking latency into account.
+ Original commit message from CVS:
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init),
+ (gst_v4lsrc_fixate), (gst_v4lsrc_query):
+ * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_buffer_new):
+ Fix duration and timestamping, taking latency into account.
+ Implement latency query.
+
+2007-02-28 15:02:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudioclock.c: Fix clock name.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_init),
+ (gst_audio_clock_new):
+ Fix clock name.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_init), (gst_base_audio_sink_query):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init),
+ (gst_base_audio_src_query), (gst_base_audio_src_get_offset),
+ (gst_base_audio_src_create):
+ Improve latency query code.
+ Use proper clock names.
+
+2007-02-28 12:57:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/generic/states.c:
+ plug test leak
+ Original commit message from CVS:
+ plug test leak
+
+2007-02-28 12:44:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/generic/states.c: Copy the states.c test from core again
+ Original commit message from CVS:
+ * tests/check/generic/states.c: (GST_START_TEST):
+ Copy the states.c test from core again
+ * tests/check/Makefile.am:
+ ignore cdio and cdparanoiasrc
+
+2007-02-28 12:08:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/audioconvert.c: Also make valgrind happy and avoid copying data in some cases.
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float), (double), (float_hq),
+ (double_hq), (audio_convert_get_func_index), (check_default),
+ (audio_convert_prepare_context), (audio_convert_convert):
+ Also make valgrind happy and avoid copying data in some cases.
+
+2007-02-28 11:58:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/generic/states.c:
+ use a macro
+ Original commit message from CVS:
+ use a macro
+
+2007-02-28 11:47:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Don't run inplace if that overwrites source data as we go. Add more tests. Fixes #339837 even more.
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float), (double), (float_hq),
+ (double_hq), (audio_convert_get_func_index),
+ (audio_convert_prepare_context), (audio_convert_convert):
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_class_init), (gst_audio_convert_get_unit_size),
+ (gst_audio_convert_transform_caps):
+ * tests/check/elements/audioconvert.c: (GST_START_TEST),
+ (audioconvert_suite):
+ Don't run inplace if that overwrites source data as we go. Add more
+ tests. Fixes #339837 even more.
+
+2007-02-27 18:45:37 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Fix various seeking bugs (Slider was not updating when doing a non flushing seek, Reverse...
+ Original commit message from CVS:
+ 2007-02-27 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (do_seek), (set_update_scale),
+ (msg_segment_done): Fix various seeking bugs (Slider was not
+ updating when doing a non flushing seek, Reverse playback
+ on segment seek was wrong).
+
+2007-02-26 21:01:03 +0000 David Schleef <ds@schleef.org>
+
+ Add a new plugin/library to make it easy for apps to shove data into a pipeline.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/app/Makefile.am:
+ * gst/app/gstapp.c:
+ * gst/app/gstappsrc.c:
+ * gst/app/gstappsrc.h:
+ Add a new plugin/library to make it easy for apps to shove
+ data into a pipeline.
+
+2007-02-26 11:48:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: When we stop scrubbing, don't leave the pipeline PLAYING when we requested a PAUSED state.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (stop_seek):
+ When we stop scrubbing, don't leave the pipeline PLAYING when we
+ requested a PAUSED state.
+
+2007-02-25 23:51:03 +0000 René Stadler <mail@renestadler.de>
+
+ gst-libs/gst/tag/gstvorbistag.c: Parse date strings in vorbis comments that have an invalid (zero) month or day (#410...
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler de>
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ Parse date strings in vorbis comments that have an invalid (zero)
+ month or day (#410396).
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Test case for the above.
+
+2007-02-24 20:12:49 +0000 Loïc Minier <lool+gnome@via.ecp.fr>
+
+ Fix compilation with LDFLAGS='-Wl,-z,defs' (#410963).
+ Original commit message from CVS:
+ Patch by: Loïc Minier <lool+gnome at via ecp fr>
+ * configure.ac:
+ * ext/alsa/Makefile.am:
+ * gst/audiotestsrc/Makefile.am:
+ Fix compilation with LDFLAGS='-Wl,-z,defs' (#410963).
+
+2007-02-23 18:49:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Improve docs: point out that the application needs to assist playbin with buffering.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c:
+ Improve docs: point out that the application needs to assist playbin
+ with buffering.
+
+2007-02-23 13:10:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Change GStreamer marker prefix in detail string from 'gstreamer.net' to just 'gstreamer'. Document the caps string co...
+ Original commit message from CVS:
+ * gst-libs/gst/utils/install-plugins.c:
+ * gst-libs/gst/utils/missing-plugins.c:
+ * tests/check/libs/utils.c: (missing_msg_check_getters):
+ Change GStreamer marker prefix in detail string from 'gstreamer.net'
+ to just 'gstreamer'. Document the caps string component of the
+ decoder/encoder detail a bit better, since not everyone will be
+ familiar with the GStreamer media type/caps system (but they better
+ enjoy nested itemized lists).
+
+2007-02-22 12:57:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/netbuffer/gstnetbuffer.c: Fix copying of GstNetBuffer (would crash before, or at least lead to invalid m...
+ Original commit message from CVS:
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ (notgst_buffer_copy_fields_in_place), (gst_netbuffer_copy):
+ Fix copying of GstNetBuffer (would crash before, or at least lead to
+ invalid memory access, #410772), for now by copying the GstBuffer copy
+ code from the core over here so we can copy the GstBuffer fields on a
+ provided buffer instance (of type GstNetBuffer in this case). Would be
+ better to fix this with some support by the core though (and in the long
+ run change the broken GstBuffer/GstMiniObject copy semantics, #393099).
+ * tests/check/Makefile.am:
+ Enable unit test for GstNetBuffer.
+
+2007-02-22 11:04:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ Original commit message from CVS:
+ 2007-02-22 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_init): Disable pull-mode activation until we
+ figure out how to make audio sinks go to PLAYING.
+
+2007-02-22 09:04:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add float as an intermediate format, as well as float mixing. Enable test that was failing before. Fixes #339837
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float), (double), (float_hq),
+ (double_hq), (audio_convert_get_func_index),
+ (audio_convert_prepare_context), (audio_convert_convert):
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstchannelmix.c: (gst_channel_mix_setup_matrix),
+ (gst_channel_mix_mix_int), (gst_channel_mix_mix_float):
+ * gst/audioconvert/gstchannelmix.h:
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Add float as an intermediate format, as well as float mixing. Enable
+ test that was failing before. Fixes #339837
+
+2007-02-21 16:12:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/seek/seek.c: Undo the previous commit: -1 as a stop time implies that the stop time is the end of file...
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (do_seek):
+ Undo the previous commit: -1 as a stop time implies that the stop
+ time is the end of file, clearing any previously configured segment.
+
+2007-02-21 15:36:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/seek/seek.c: Don't SEEK_SET with a stop time of -1, use SEEK_NONE instead.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (do_seek):
+ Don't SEEK_SET with a stop time of -1, use SEEK_NONE instead.
+
+2007-02-21 13:55:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/volume/gstvolume.c: Unbreak volume, value remains gint.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_process_int16),
+ (volume_process_int16_clamp), (volume_set_caps):
+ Unbreak volume, value remains gint.
+
+2007-02-21 13:08:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/volume/gstvolume.*: Extend float audio support (double) and some int->uint cleanups.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (volume_update_real_volume), (gst_volume_set_volume),
+ (gst_volume_init), (volume_process_double), (volume_process_float),
+ (volume_process_int16), (volume_process_int16_clamp),
+ (volume_set_caps), (volume_transform_ip), (volume_update_volume):
+ * gst/volume/gstvolume.h:
+ Extend float audio support (double) and some int->uint cleanups.
+
+2007-02-20 15:44:32 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin2.c: Don't free groups from the streaming threads. Just put them aside and free them in disp...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose),
+ (multi_queue_underrun_cb), (gst_decode_group_check_if_drained),
+ (sort_end_pads), (gst_decode_group_expose),
+ (gst_decode_group_hide):
+ Don't free groups from the streaming threads. Just put them aside and
+ free them in dispose.
+
+2007-02-20 11:20:52 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin2.c: Handle dynamic pads within groups.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (connect_element),
+ (pad_added_group_cb), (gst_decode_group_check_if_blocked),
+ (sort_end_pads), (gst_decode_group_expose):
+ Handle dynamic pads within groups.
+ Sort pads before exposing them in order to make playbin happy.
+ There still is a race with the multiqueue filling up. This should be
+ solved separately.
+ Fixes #398721
+
+2007-02-18 21:02:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/utils/: Some more docs (and descriptions for two subtitle formats).
+ Original commit message from CVS:
+ * gst-libs/gst/utils/base-utils.c:
+ * gst-libs/gst/utils/descriptions.c:
+ * gst-libs/gst/utils/install-plugins.c:
+ * gst-libs/gst/utils/missing-plugins.c:
+ Some more docs (and descriptions for two subtitle formats).
+
+2007-02-16 10:19:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/audio.c: Fix documentation.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.c:
+ Fix documentation.
+
+2007-02-16 10:15:46 +0000 Yves Lefebvre <ivanohe@abacom.com>
+
+ gst/videorate/gstvideorate.c: Don't leak caps. Fixes #408278.
+ Original commit message from CVS:
+ Patch by: Yves Lefebvre <ivanohe abacom com>
+ * gst/videorate/gstvideorate.c: (gst_video_rate_setcaps):
+ Don't leak caps. Fixes #408278.
+
+2007-02-15 15:17:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More docs coverage and some ChangeLog surgery (add missing names)
+ Original commit message from CVS:
+ * ext/cdparanoia/gstcdparanoiasrc.h:
+ * ext/ogg/gstoggdemux.h:
+ * gst-libs/gst/audio/audio.c: (gst_audio_frame_byte_size),
+ (gst_audio_frame_length), (gst_audio_duration_from_pad_buffer),
+ (gst_audio_is_buffer_framed), (gst_audio_structure_set_int):
+ * gst-libs/gst/audio/audio.h:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/interfaces/videoorientation.h:
+ * gst/adder/gstadder.h:
+ More docs coverage and some ChangeLog surgery (add missing names)
+
+2007-02-15 12:07:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/: Small constifications.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c:
+ (gst_ximagesink_calculate_pixel_aspect_ratio):
+ * sys/xvimage/xvimagesink.c:
+ (gst_xvimagesink_calculate_pixel_aspect_ratio):
+ Small constifications.
+
+2007-02-15 12:06:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Answer latency query.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init), (gst_base_audio_sink_query),
+ (gst_base_audio_sink_render), (gst_base_audio_sink_callback),
+ (gst_base_audio_sink_async_play),
+ (gst_base_audio_sink_change_state):
+ Answer latency query.
+ Use configured latency when syncing.
+ Fix clock slaving.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init), (gst_base_audio_src_dispose),
+ (gst_base_audio_src_query), (gst_base_audio_src_change_state):
+ Fix possible memleak.
+ Implement latency query.
+ Small cleanups.
+
+2007-02-15 11:59:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.c: Ignore errors in reset, these are not fatal. They also grab the element lock which is already...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_reset):
+ Ignore errors in reset, these are not fatal. They also grab the element
+ lock which is already taking when this function is called. Fixes
+ #405451.
+
+2007-02-13 13:50:56 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ add header file for easy codec install
+ Original commit message from CVS:
+ add header file for easy codec install
+
+2007-02-13 10:24:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Remove 'tests/examples/xerror/Makefile' from output files again.
+ Original commit message from CVS:
+ * configure.ac:
+ Remove 'tests/examples/xerror/Makefile' from output files again.
+
+2007-02-13 09:12:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Also crossref against gst-plugins-base-libs.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ Also crossref against gst-plugins-base-libs.
+
+2007-02-12 20:42:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add crossreferences to glib/gobject/gstream docs.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Add crossreferences to glib/gobject/gstream docs.
+ * gst-libs/gst/audio/audio.h:
+ Source formatting.
+ * gst/audiotestsrc/gstaudiotestsrc.c: (plugin_init):
+ Add own debug category.
+
+2007-02-12 11:01:04 +0000 René Stadler <mail@renestadler.de>
+
+ gst-libs/gst/tag/gstvorbistag.c: Add vorbis/FLAC-tag mapping for new GST_TAG_REFERENCE_LEVEL (#403597).
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler de>
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Add vorbis/FLAC-tag mapping for new GST_TAG_REFERENCE_LEVEL
+ (#403597).
+
+2007-02-12 10:33:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: When we have external subtitles and wait for the subtitle decodebin to get up and runn...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source):
+ When we have external subtitles and wait for the subtitle decodebin
+ to get up and running, we set up a (sync) bus handler for the
+ subtitle decodebin, so we can stop waiting when it posts an error
+ message. However, we should do that before we set the subtitle
+ decodebin's state to playing, otherwise things are racy and we might
+ miss error messages posted before we had a chance to set up the bus.
+ This should finally fix totem hanging on .txt pseudo-subtitle files.
+
+2007-02-10 19:27:48 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Use gst_gdouble_to_guint64 for conversions.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:(gst_base_rtp_audio_payload_handle_frame_based_buffer):
+ Use gst_gdouble_to_guint64 for conversions.
+ * win32/common/config.h.in:
+ Add a define for GST_INSTALL_PLUGINS_HELPER
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstcdda.def:
+ * win32/common/libgstnetbuffer.def:
+ * win32/common/libgstrtp.def:
+ * win32/common/libgutils.def:
+ Add new exported functions.
+ * win32/vs6/gst_plugins_base.dsw:
+ * win32/vs6/libgstdecodebin.dsp:
+ * win32/vs6/libgstnetbuffer.dsp:
+ * win32/vs6/libgstplaybin.dsp:
+ * win32/vs6/libgstrtp.dsp:
+ * win32/vs6/libgstvorbis.dsp:
+ * win32/vs6/libgstcdda.dsp:
+ * win32/vs6/libgstgdp.dsp:
+ * win32/vs6/libgstutils.dsp:
+ Update and add new project files.
+
+2007-02-10 18:19:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: For SubRip (.srt) subtitles, ignore all markup tags we don't handle (like font tags, for ...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (subrip_remove_unhandled_tag),
+ (subrip_remove_unhandled_tags), (parse_subrip):
+ For SubRip (.srt) subtitles, ignore all markup tags we don't
+ handle (like font tags, for example).
+ * tests/check/elements/subparse.c:
+ Add test for this.
+
+2007-02-09 13:28:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery
+ Original commit message from CVS:
+ ChangeLog surgery
+
+2007-02-09 13:16:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Don't error out if there is no fakesink in the READY to NULL state change, since when decodebin is re-...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (add_fakesink),
+ (gst_decode_bin_change_state):
+ * gst/playback/gstdecodebin2.c: (add_fakesink),
+ (gst_decode_bin_change_state):
+ Don't error out if there is no fakesink in the READY to NULL state
+ change, since when decodebin is re-used, we're only adding the
+ fakesink element in READY to PAUSED.
+ * tests/check/elements/decodebin.c:
+ (new_decoded_pad_plug_fakesink_cb), (GST_START_TEST),
+ (decodebin_suite):
+ Minimal unit test to make sure we can use the same decodebin
+ instance twice (at least with audiotestsrc input).
+
+2007-02-09 09:58:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsa.c: Try to get devic-name from device string first, and from handle only as fallback (seems to yield ...
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c: (gst_alsa_find_device_name):
+ Try to get devic-name from device string first, and from handle only
+ as fallback (seems to yield better results and is more robust
+ against buggy probing code on the application side).
+
+2007-02-08 15:43:26 +0000 Julien Puydt <julien.puydt@laposte.net>
+
+ ext/alsa/: Improve device-name detection a bit, especially in the case where the device is not actually open (#405020...
+ Original commit message from CVS:
+ Based on patch by: Julien Puydt <julien.puydt at laposte net>
+ * ext/alsa/gstalsa.c: (gst_alsa_find_device_name_no_handle),
+ (gst_alsa_find_device_name):
+ * ext/alsa/gstalsa.h:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_get_property):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_get_property):
+ Improve device-name detection a bit, especially in the case where
+ the device is not actually open (#405020, #405024). Move common code
+ into gstalsa.c instead of duplicating it.
+
+2007-02-07 13:05:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/gstaudioconvert.c: Fix up docs chunk so that gtk-doc doesn't complain, and fix typo.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ Fix up docs chunk so that gtk-doc doesn't complain, and fix typo.
+
+2007-02-06 17:47:32 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.*: Implement PropertyProbe Interface for XVAdaptors so that one can choose the adaptor to use...
+ Original commit message from CVS:
+ 2007-02-06 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents),
+ (gst_xvimagesink_get_xv_support),
+ (gst_xvimagesink_xcontext_clear),
+ (gst_xvimagesink_interface_supported),
+ (gst_xvimagesink_probe_get_properties),
+ (gst_xvimagesink_probe_probe_property),
+ (gst_xvimagesink_probe_needs_probe),
+ (gst_xvimagesink_probe_get_values),
+ (gst_xvimagesink_property_probe_interface_init),
+ (gst_xvimagesink_set_property), (gst_xvimagesink_get_property),
+ (gst_xvimagesink_init), (gst_xvimagesink_class_init),
+ (gst_xvimagesink_get_type):
+ * sys/xvimage/xvimagesink.h: Implement PropertyProbe Interface
+ for XVAdaptors so that one can choose the adaptor to use with
+ gstreamer-properties.
+
+2007-02-06 14:00:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/gstaudioconvert.c: Also mention that a conversion from double to float is suboptimal still.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ Also mention that a conversion from double to float is suboptimal still.
+
+2007-02-06 09:42:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstaudiofilter.c: Clear our formats structure and free the caps contained in it when shutting down.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ (gst_audio_filter_class_init), (gst_audio_filter_change_state):
+ Clear our formats structure and free the caps contained in it when
+ shutting down.
+
+2007-02-05 18:39:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ Original commit message from CVS:
+ 2007-02-05 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_callback): Update basesink->offset so that we
+ pull monotonically increasing offsets instead of, um, seeking back
+ to 0 each time. Fixes alsasrc ! alsasink!
+
+2007-02-05 11:44:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videoscale/gstvideoscale.c: A width and height of 1 makes us crash, so increase minimum size to 2x2 pixels until ...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c:
+ A width and height of 1 makes us crash, so increase minimum size to
+ 2x2 pixels until someone feels like fixing this (#404512).
+
+2007-02-04 16:23:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/oggmux.c: Add small test to make sure request pads are cleaned up properly even if oggmux never...
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c: (GST_START_TEST), (oggmux_suite):
+ Add small test to make sure request pads are cleaned up properly
+ even if oggmux never changes state out of NULL.
+
+2007-02-04 14:11:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/utils.c: Fix unit test. Turns out things work much better when you
+ Original commit message from CVS:
+ * tests/check/libs/utils.c: (GST_START_TEST):
+ Fix unit test. Turns out things work much better when you
+ NULL-terminate string arrays. Should make p5 build bot happy again.
+
+2007-02-03 23:28:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/: Oops, forgot to commit fixed-up example.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ (gst_audio_filter_template_base_init),
+ (gst_audio_filter_template_class_init),
+ (gst_audio_filter_template_init),
+ (gst_audio_filter_template_set_property),
+ (gst_audio_filter_template_get_property),
+ (gst_audio_filter_template_setup),
+ (gst_audio_filter_template_filter),
+ (gst_audio_filter_template_filter_inplace), (plugin_init):
+ Oops, forgot to commit fixed-up example.
+
+2007-02-03 20:19:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Port GstAudioFilter to 0.10. This change technically breaks but seems justifiable on the grounds that the base class ...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_get_type),
+ (gst_audio_filter_class_init), (gst_audio_filter_init),
+ (gst_audio_filter_set_caps),
+ (gst_audio_filter_class_add_pad_templates):
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ Port GstAudioFilter to 0.10. This change technically breaks
+ API and ABI (and thus also every library developer's heart),
+ but seems justifiable on the grounds that the base class was
+ completely unusable before (ie. would crash immediately when
+ actually used). Fixes #403963 (and eventually also #403572).
+ Also document all of this a bit.
+
+2007-02-03 14:26:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Lowering log level to see why things fail on the p5 build bot; fix some typos in unit test messages.
+ Original commit message from CVS:
+ * gst-libs/gst/utils/install-plugins.c:
+ (gst_install_plugins_spawn_child):
+ * tests/check/libs/utils.c:
+ (test_base_utils_install_plugins_do_callout):
+ Lowering log level to see why things fail on the p5 build bot;
+ fix some typos in unit test messages.
+
+2007-02-03 13:59:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/utils.c: Don't hard-code temp directory for test helper; use GLib functions to write out file and do...
+ Original commit message from CVS:
+ * tests/check/libs/utils.c:
+ (test_base_utils_install_plugins_do_callout):
+ Don't hard-code temp directory for test helper; use GLib functions
+ to write out file and do error checking etc.
+
+2007-02-02 20:42:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/utils/: API: add API for applications to initiate installation of missing plugins, ie. gst_install_plugi...
+ Original commit message from CVS:
+ * gst-libs/gst/utils/Makefile.am:
+ * gst-libs/gst/utils/base-utils.h:
+ * gst-libs/gst/utils/install-plugins.c:
+ (gst_install_plugins_context_set_xid),
+ (gst_install_plugins_context_new),
+ (gst_install_plugins_context_free),
+ (gst_install_plugins_get_helper),
+ (gst_install_plugins_spawn_child),
+ (gst_install_plugins_return_from_status),
+ (gst_install_plugins_installer_exited),
+ (gst_install_plugins_async), (gst_install_plugins_sync),
+ (gst_install_plugins_return_get_name),
+ (gst_install_plugins_installation_in_progress):
+ * gst-libs/gst/utils/install-plugins.h:
+ API: add API for applications to initiate installation of missing
+ plugins, ie. gst_install_plugins_async() primarily.
+ Based on libgimme-codec by Ryan Lortie.
+ * configure.ac:
+ Add --with-install-plugins-helper configure option so distros can specify
+ the path of the helper script or program to call when plugin installation
+ is requested (distros: please do any argument munging in this helper
+ script instead of patching GStreamer to pass arguments differently
+ to another program directly).
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Build and document new API.
+ * tests/check/libs/utils.c: (result_cb),
+ (test_base_utils_install_plugins_do_callout), (GST_START_TEST),
+ (libgstbaseutils_suite):
+ Some simple checks for the new API.
+
+2007-02-02 14:44:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/audioconvert.c: Add small test for 32bit float <=> 64bit float conversion (works only one way so...
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (test_float_conversion):
+ Add small test for 32bit float <=> 64bit float conversion (works
+ only one way so far, 32=>64 produces structured noise).
+
+2007-02-02 11:21:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/gstaudioconvert.c: We don't support floats with a width of 40, 48 or 56 bits.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (set_structure_widths_32_and_64), (make_lossless_changes):
+ We don't support floats with a width of 40, 48 or 56 bits.
+
+2007-02-02 09:48:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/: Support for 64-bit float audio in audioconvert (#339837)
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float), (double),
+ (audio_convert_get_func_index):
+ * gst/audioconvert/gstaudioconvert.c: (set_structure_widths),
+ (make_lossless_changes):
+ Support for 64-bit float audio in audioconvert (#339837)
+
+2007-02-01 18:50:08 +0000 Holger Wansing <linux@wansing-online.de>
+
+ po/: Add German translation (#352069).
+ Original commit message from CVS:
+ Patch by: Holger Wansing <linux wansing-online de>
+ * po/LINGUAS:
+ * po/de.po:
+ Add German translation (#352069).
+
+2007-02-01 17:52:39 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ ext/ogg/gstoggmux.c: Use newly added GstCollectPads API to free the allocated resources in the GstOggPad structures (...
+ Original commit message from CVS:
+ reviewed by: Wim Taymans <wim@fluendo.com>
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_ogg_pad_destroy_notify),
+ (gst_ogg_mux_request_new_pad), (gst_ogg_mux_release_pad):
+ Use newly added GstCollectPads API to free the allocated resources in
+ the GstOggPad structures (#402393).
+
+2007-01-31 15:58:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybin.c: Add audioresample+audioconvert in front of the visualisation element, so that elements lik...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_vis_element):
+ Add audioresample+audioconvert in front of the visualisation
+ element, so that elements like libvisual 0.4 that don't support all
+ samplerates can work.
+ Fixes: #402505
+
+2007-01-30 19:19:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Take some locks and make a copy of the streaminfo value array we maintain while holdin...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property),
+ (gst_play_base_bin_get_streaminfo_value_array):
+ Take some locks and make a copy of the streaminfo value array we
+ maintain while holding the lock, so that the application can
+ retrieve the stream-info as a value array in a thread-safe way.
+
+2007-01-30 11:29:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audioconvert/gstaudioconvert.c: Don't fail on 0 sized buffers. Fixes #396835.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ Don't fail on 0 sized buffers. Fixes #396835.
+
+2007-01-29 21:13:07 +0000 David Schleef <ds@schleef.org>
+
+ gst/typefind/gsttypefindfunctions.c: Detect BBCD as video/x-dirac, so we can play raw dirac streams.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ Detect BBCD as video/x-dirac, so we can play raw dirac
+ streams.
+
+2007-01-29 18:14:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/theora/theoraenc.c: Check return value of theora_encode_header(), or we might try to allocate a random number of ...
+ Original commit message from CVS:
+ * ext/theora/theoraenc.c: (theora_enc_chain):
+ Check return value of theora_encode_header(), or we might try to
+ allocate a random number of bytes. theora_encode_header() can fail
+ if libtheora has been compiled with encoding support disabled.
+ Fixes #398110.
+
+2007-01-29 10:53:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/.cvsignore: Do as buildbot says.
+ Original commit message from CVS:
+ * tests/check/gst/.cvsignore:
+ Do as buildbot says.
+
+2007-01-29 10:25:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: Fix strides in libvisual. Gst uses X strides.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_src_setcaps):
+ Fix strides in libvisual. Gst uses X strides.
+ Inspired by: <ed at catmur dot co dot uk> and
+ <tim at centricular dot net>
+ Fixes #401118.
+
+2007-01-27 13:32:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.*: Properly propagate streaming errors when we are scanning the file for chains so that we don't ...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_submit_buffer),
+ (gst_ogg_demux_get_data), (gst_ogg_demux_get_next_page),
+ (gst_ogg_demux_get_prev_page), (gst_ogg_demux_do_seek),
+ (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_bisect_forward_serialno),
+ (gst_ogg_demux_read_chain), (gst_ogg_demux_read_end_chain),
+ (gst_ogg_demux_find_chains), (gst_ogg_demux_handle_page),
+ (gst_ogg_demux_chain), (gst_ogg_demux_combine_flows),
+ (gst_ogg_demux_loop_reverse), (gst_ogg_demux_loop):
+ * ext/ogg/gstoggdemux.h:
+ Properly propagate streaming errors when we are scanning the file for
+ chains so that we don't crash when shut down. Might fix some crashers
+ when quickly switching oggs in RB such as #332503 and #378436.
+
+2007-01-26 12:44:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Map a gnome-vfs HOST_NOT_FOUND error into a GStreamer NOT_FOUND error code as well.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_start):
+ Map a gnome-vfs HOST_NOT_FOUND error into a GStreamer NOT_FOUND
+ error code as well.
+
+2007-01-25 16:02:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Don't try to disconnect a signal from a finalized object.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (remove_source):
+ Don't try to disconnect a signal from a finalized object.
+
+2007-01-25 14:29:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin2.c: Cast lock macro parameters to make sure we're actually accessing the lock member at the...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose):
+ Cast lock macro parameters to make sure we're actually accessing the
+ lock member at the right class level. Free list itself in _dispose()
+ as well and NULL it in case dispose gets called multiple times.
+
+2007-01-25 14:02:37 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin2.c: Free GstDecodeGroups no longer used.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c:
+ (gst_decode_bin_dispose),(gst_decode_bin_finalize):
+ Free GstDecodeGroups no longer used.
+ (gst_decode_group_expose):
+ Don't unlock too many times !
+ (deactivate_free_recursive):
+ Free iterator once we're done with it.
+ Fix for recursively deactivating elements (stop at ghostpads).
+
+2007-01-25 12:24:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Fix up caps on the frame buffer before we save it and potentially make it accessible to ot...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (handoff):
+ Fix up caps on the frame buffer before we save it and potentially
+ make it accessible to other threads via g_object_get; also use
+ gst_buffer_replace() instead of gst_mini_object_replace().
+
+2007-01-25 12:06:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Make getting the current frame thread-safe.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gst_play_bin_get_property):
+ Make getting the current frame thread-safe.
+
+2007-01-25 11:48:10 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin2.c: Set queues to bigger sizes to cope with HD contents.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_finalize),
+ (gst_decode_group_new), (gst_decode_group_free):
+ Set queues to bigger sizes to cope with HD contents.
+ Fix some mutex freeing and add comment about MT safe methods.
+
+2007-01-24 12:51:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Don't unnecessarily ref (and then leak) upstream events if the text pad is not linked. Fi...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_src_event),
+ (gst_text_overlay_text_event):
+ Don't unnecessarily ref (and then leak) upstream events if the text
+ pad is not linked. Fixes #399948.
+ * tests/check/gst-plugins-base.supp:
+ Add suppression for pango on edgy/x86 for textoverlay test.
+
+2007-01-24 12:10:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstrtpbuffer.h: Add some more fixed payloads.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Add some more fixed payloads.
+
+2007-01-23 18:39:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggdemux.c: Error out properly if we get an error from libogg while reading the
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_read_chain):
+ Error out properly if we get an error from libogg while reading the
+ BOS page(s). Fixes crash parsing 'fuzzed' ogg file (#399340).
+
+2007-01-23 17:49:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin2.c: Don't leak mutex.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_finalize):
+ Don't leak mutex.
+ * tests/check/elements/playbin.c:
+ (test_sink_usage_video_only_stream),
+ (test_suburi_error_unknowntype), (test_suburi_error_invalidfile),
+ (test_suburi_error_wrongproto), (test_missing_urisource_handler),
+ (test_missing_suburisource_handler),
+ (test_missing_primary_decoder), (playbin_suite):
+ Run all tests once with decodebin and once with decodebin2.
+ One test does not pass yet with decodebin2.
+
+2007-01-23 14:30:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/ogg/gstoggmux.c: Fix the cases where oggmux doesn't properly figure out that all sinkpads have gone EOS, and ther...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (all_pads_eos), (gst_ogg_mux_collected):
+ Fix the cases where oggmux doesn't properly figure out that all
+ sinkpads have gone EOS, and therefore doesn't push out the remaining
+ buffers and the final EOS event.
+ Fixes #363379
+
+2007-01-23 13:19:19 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Don't lock on navigation event push, just on keysym to string.
+ Original commit message from CVS:
+ 2007-01-23 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents):
+ Don't lock on navigation event push, just on keysym to string.
+ Fixes #397673 again.
+
+2007-01-22 17:37:38 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin2.c: Cleanups.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin2.c: (gst_decode_group_new),
+ (get_current_group), (group_demuxer_event_probe),
+ (gst_decode_group_expose), (deactivate_free_recursive),
+ (gst_decode_group_free):
+ Cleanups.
+ Don't forget to emit 'no-more-pads' once a group is exposed.
+ Cleanup elements from a DecodeGroup once we remove it.
+ Protect call to gst_decode_group_expose() with the decodebin lock.
+
+2007-01-22 13:16:42 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Looking at Xorg code i can't figure out if that XKeysymToString function is thread sensible or not. Lock it jus...
+ Original commit message from CVS:
+ 2007-01-22 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents):
+ Looking at Xorg code i can't figure out if that XKeysymToString
+ function is thread sensible or not. Lock it just in case as
+ recommended by Radek Doulik <rodo at ximian dot com>.
+
+2007-01-22 13:10:13 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Lock that X Call as well. Fixes #397673.
+ Original commit message from CVS:
+ 2007-01-22 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents):
+ Lock that X Call as well. Fixes #397673.
+
+2007-01-22 12:03:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Don't go into an endless loop if the file starts with 00 00 01 2X, like quicktim...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg4_video_type_find):
+ Don't go into an endless loop if the file starts with 00 00 01 2X,
+ like quicktime redirect files might. Fixes #396042.
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/typefindfunctions.c: (GST_START_TEST),
+ (typefindfunctions_suite):
+ Add unit test for the above.
+
+2007-01-22 10:27:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: On second thought, use "depth" field rather than "bpp" field.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ On second thought, use "depth" field rather than "bpp" field.
+
+2007-01-22 09:23:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Camtasia caps apparently need a bpp field (#398875).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Camtasia caps apparently need a bpp field (#398875).
+
+2007-01-19 19:09:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Attempt at a better error message in case we don't have the required
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_subtitle),
+ (gen_source_element), (gst_play_base_bin_change_state):
+ Attempt at a better error message in case we don't have the required
+ URI handler installed; post missing-plugin message also when we're
+ missing an URI handler for the subtitle URI; clean up properly also
+ when an error occurs and we never made it to PAUSED state.
+ * tests/check/elements/playbin.c: (GST_START_TEST),
+ (playbin_suite):
+ Check that we're also getting a missing-plugin messsage for a
+ missing subtitle URI handler (and clean up properly).
+
+2007-01-19 18:47:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Plug a few reference leaks.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (analyse_source), (setup_source):
+ Plug a few reference leaks.
+
+2007-01-19 12:23:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Lower probability a bit if the marker isn't right at the start, to decrease the ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find):
+ Lower probability a bit if the marker isn't right at the start,
+ to decrease the chance of false positives.
+
+2007-01-19 11:31:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Small mpeg2 system stream typefinding improvement: make typefinder probe a bit i...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find):
+ Small mpeg2 system stream typefinding improvement: make typefinder
+ probe a bit into the stream instead of just looking for a marker
+ at the beginning. Fixes #397810.
+
+2007-01-18 16:23:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/gstchannelmix.c: Remove compatibility cruft for prehistoric GLib versions.
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c:
+ Remove compatibility cruft for prehistoric GLib versions.
+
+2007-01-17 16:11:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Let decodebin be the element to post missing-plugin messages for missing decoders (rather than playbin...
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin.c: (close_pad_link):
+ * gst/playback/gstdecodebin2.c: (analyze_new_pad):
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (gst_play_base_bin_handle_message_func), (unknown_type):
+ Let decodebin be the element to post missing-plugin messages for
+ missing decoders (rather than playbin); make playbin implement
+ GstBin::handle_message so we can suppress missing-plugin messages
+ for types we're not handling on purpose (don't want to bring up an
+ installer in those cases).
+
+2007-01-16 19:37:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Fix potentially unaligned access (#397207).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ * gst-libs/gst/tag/gstvorbistag.c:
+ (gst_tag_list_to_vorbiscomment_buffer):
+ * gst/typefind/gsttypefindfunctions.c: (vorbis_type_find):
+ Fix potentially unaligned access (#397207).
+
+2007-01-16 12:17:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/seek/seek.c: Allow to toggle looping while it plays. Fix callback prototype. Clean up code a bit more....
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (set_scale), (update_scale),
+ (do_seek), (stop_seek), (pause_cb), (stop_cb), (loop_toggle_cb),
+ (rate_spinbutton_changed_cb), (msg_eos), (msg_segment_done),
+ (main):
+ Allow to toggle looping while it plays. Fix callback prototype. Clean
+ up code a bit more. Add copyright header.
+
+2007-01-16 11:41:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Red and blue mask was swapped (spotted by Dan Williams).
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support):
+ Red and blue mask was swapped (spotted by Dan Williams).
+
+2007-01-15 13:58:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/tag/: Use new beats-per-minute tag from core.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Use new beats-per-minute tag from core.
+
+2007-01-15 11:30:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ po/POTFILES.in: Add new files with translatable strings, so they actually make it into the template file one day.
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ Add new files with translatable strings, so they actually make it
+ into the template file one day.
+
+2007-01-12 21:19:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ gst-libs/gst/audio/gstbaseaudiosink.c
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_fixate): Implement, stolen from baseaudiosrc.
+ (gst_base_audio_sink_activate_pull): Remove the handwavey nego
+ stuff, as the base class handles this now. Actually tell the ring
+ buffer to start.
+ (gst_base_audio_sink_callback): Cast the ring buffer correctly.
+ How did this work before? Maybe I'm not as awesome a programmer as
+ I think.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c
+ (gst_base_audio_src_fixate): Rework as a basesrc vmethod instead
+ of a pad function.
+
+2007-01-12 18:08:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/utils/missing-plugins.c: Remove more fields so that the application can better blacklist formats that ha...
+ Original commit message from CVS:
+ * gst-libs/gst/utils/missing-plugins.c: (copy_and_clean_caps):
+ Remove more fields so that the application can better blacklist
+ formats that have been tried before.
+
+2007-01-12 17:43:40 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ add latest files
+ Original commit message from CVS:
+ add latest files
+
+2007-01-12 12:47:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/mixerutils.h: Add G_BEGIN_DECLS and G_END_DECLS guards so these helpers can be used when compiling...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/mixerutils.h:
+ Add G_BEGIN_DECLS and G_END_DECLS guards so these helpers can be
+ used when compiling with c++ compilers as well.
+
+2007-01-12 09:45:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Fix comment.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ Fix comment.
+
+2007-01-11 13:12:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Post missing-plugin messages also when we error out because converters, textoverlay or aut...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (post_missing_element_message),
+ (gen_video_element), (gen_text_element), (gen_audio_element),
+ (gen_vis_element):
+ Post missing-plugin messages also when we error out because
+ converters, textoverlay or auto*sinks are missing (#161922).
+
+2007-01-10 16:08:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Fix the case where we try to ref a NULL element when we delay a link because of unfixed caps.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (dynamic_add), (close_pad_link),
+ (is_demuxer_element), (new_caps):
+ * gst/playback/gstplaybasebin.c: (source_new_pad):
+ Fix the case where we try to ref a NULL element when we delay a link
+ because of unfixed caps.
+ Set the state of autoplugged decodebins to PAUSED.
+ RTSP now works in playbin, we can remove it from the blacklist.
+
+2007-01-09 14:33:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Post missing-plugin messages on the bus for missing sources and missing decoders/demuxers/depayloaders...
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstplaybasebin.c: (string_arr_has_str),
+ (unknown_type), (setup_subtitle), (gen_source_element):
+ * gst/playback/gstplaybin.c: (plugin_init):
+ Post missing-plugin messages on the bus for missing sources and
+ missing decoders/demuxers/depayloaders; fix error code used when
+ we're missing an URI handler source; for media types that we are not
+ handling on purpose at the moment, don't print "don't know how to
+ handle xyz" messages to the terminal or post missing-plugin
+ messages on the bus.
+ * tests/check/elements/playbin.c: (create_playbin),
+ (GST_START_TEST), (gst_codec_src_uri_get_type),
+ (gst_codec_src_uri_get_protocols), (gst_codec_src_uri_get_uri),
+ (gst_codec_src_uri_set_uri), (gst_codec_src_uri_handler_init),
+ (gst_codec_src_init_type), (gst_codec_src_base_init),
+ (gst_codec_src_create), (gst_codec_src_class_init),
+ (gst_codec_src_init), (plugin_init), (playbin_suite):
+ Add some tests for the missing-plugin stuff.
+
+2007-01-09 14:20:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add new libgstbaseutils library with functions
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/utils/Makefile.am:
+ * gst-libs/gst/utils/base-utils.c: (gst_base_utils_init):
+ * gst-libs/gst/utils/base-utils.h:
+ * gst-libs/gst/utils/descriptions.c: (format_info_get_desc),
+ (find_format_info), (caps_are_rtp_caps),
+ (gst_base_utils_get_source_description),
+ (gst_base_utils_get_sink_description),
+ (gst_base_utils_get_decoder_description),
+ (gst_base_utils_get_encoder_description),
+ (gst_base_utils_get_element_description),
+ (gst_base_utils_add_codec_description_to_tag_list),
+ (gst_base_utils_get_codec_description), (gst_base_utils_list_all):
+ * gst-libs/gst/utils/descriptions.h:
+ * gst-libs/gst/utils/missing-plugins.c:
+ (missing_structure_get_type), (copy_and_clean_caps),
+ (gst_missing_uri_source_message_new),
+ (gst_missing_uri_sink_message_new),
+ (gst_missing_element_message_new),
+ (gst_missing_decoder_message_new),
+ (gst_missing_encoder_message_new),
+ (missing_structure_get_string_detail),
+ (missing_structure_get_caps_detail),
+ (gst_missing_plugin_message_get_installer_detail),
+ (gst_missing_plugin_message_get_description),
+ (gst_is_missing_plugin_message):
+ * gst-libs/gst/utils/missing-plugins.h:
+ API: add new libgstbaseutils library with functions
+ - to create and parse missing-plugins messages
+ - that provide (translated) descriptions for caps/decoders/sources/etc.
+ Closes #392393.
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ Add new lib.
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Generate docs for new lib and API.
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/utils.c: (missing_msg_check_getters),
+ (GST_START_TEST), (libgstbaseutils_suite):
+ Add some basic unit tests.
+
+2007-01-09 13:35:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/Makefile.am: Dist gstoggdemux.h to fix 'make distcheck'.
+ Original commit message from CVS:
+ * ext/ogg/Makefile.am:
+ Dist gstoggdemux.h to fix 'make distcheck'.
+ * sys/v4l/Makefile.am:
+ Fix 'make distcheck' even more.
+
+2007-01-09 12:30:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_page_copy), (gst_ogg_page_free),
+ (gst_ogg_pad_query_types), (gst_ogg_pad_submit_page),
+ (gst_ogg_chain_reset), (gst_ogg_chain_new_stream),
+ (gst_ogg_demux_perform_seek):
+ * ext/ogg/gstoggdemux.h:
+ Added docs.
+ Add some more comments.
+ Small cleanups.
+
+2007-01-09 11:15:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small documentation updates/fixes
+ Original commit message from CVS:
+ * ext/theora/theoradec.c:
+ * ext/vorbis/vorbisdec.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_commit_full):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Small documentation updates/fixes
+
+2007-01-09 10:37:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Require core CVS HEAD for Andy's basesrc/sink API additions.
+ Original commit message from CVS:
+ * configure.ac:
+ Require core CVS HEAD for Andy's basesrc/sink API additions.
+
+2007-01-08 14:01:23 +0000 Günter Thelen <daedalus.inc@gmx.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for flac-in-ogg in conformance with the ogg-mapping on flac.sf.ne...
+ Original commit message from CVS:
+ Patch by: Günter Thelen <daedalus dot inc at gmx net>
+ * gst/typefind/gsttypefindfunctions.c: (flac_type_find),
+ (plugin_init):
+ Add typefinder for flac-in-ogg in conformance with the ogg-mapping
+ on flac.sf.net (there appear to be other versions of the first
+ ogg page in the wild) (#391365).
+
+2007-01-08 13:32:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Check if localtime_r() is available.
+ Original commit message from CVS:
+ * configure.ac:
+ Check if localtime_r() is available.
+ * ext/pango/gstclockoverlay.c: (gst_clock_overlay_render_time):
+ If localtime_r() is not available, fall back to localtime(). Should
+ fix build on MingW (#393310).
+
+2007-01-08 12:30:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.*: Remove spurious 1000 subtrahend when calculating the timestamp from the frame number and ...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (parse_mdvdsub):
+ * gst/subparse/gstsubparse.h:
+ Remove spurious 1000 subtrahend when calculating the timestamp from
+ the frame number and the frame rate . Also, use the frames/second
+ value specified in the first line of the file, if one is specified
+ there. Should fix #357503.
+ * tests/check/elements/subparse.c: (do_test),
+ (test_tmplayer_do_test), (test_microdvd_do_test), (GST_START_TEST),
+ (subparse_suite):
+ Add some basic unit tests for the microdvd subtitle format.
+
+2007-01-07 21:53:38 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ sys/xvimage/xvimagesink.c: Fixes : #390076.
+ Original commit message from CVS:
+ 2007-01-07 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimage_buffer_finalize), (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_xvimage_put),
+ (gst_lookup_xv_port_from_adaptor),
+ (gst_xvimagesink_get_xv_support), (gst_xvimagesink_setcaps),
+ (gst_xvimagesink_set_xwindow_id),
+ (gst_xvimagesink_set_event_handling),
+ (gst_xvimagesink_set_property), (gst_xvimagesink_get_property),
+ (gst_xvimagesink_init), (gst_xvimagesink_class_init):
+ Patch by : Young-Ho Cha <ganadist at chollian dot net>
+ Fixes : #390076.
+ Add an adaptor property to select a specific XV adaptor.
+ * sys/xvimage/xvimagesink.h:
+
+2007-01-07 18:50:13 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Use flow_lock much more to protect every access to xwindow.
+ Original commit message from CVS:
+ 2007-01-07 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximage_buffer_finalize),
+ (gst_ximagesink_handle_xerror), (gst_ximagesink_ximage_new),
+ (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put),
+ (gst_ximagesink_handle_xevents), (gst_ximagesink_setcaps),
+ (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id),
+ (gst_ximagesink_expose), (gst_ximagesink_set_event_handling):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimage_buffer_finalize), (gst_xvimagesink_handle_xerror),
+ (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_put),
+ (gst_xvimagesink_handle_xevents), (gst_xvimagesink_setcaps),
+ (gst_xvimagesink_change_state),
+ (gst_xvimagesink_set_xwindow_id),
+ (gst_xvimagesink_expose), (gst_xvimagesink_set_event_handling):
+ Use flow_lock much more to protect every access to xwindow.
+ Try to catch erros while creating images in case some drivers
+ are
+ just generating an XError when the requested image is too big.
+ Should fix : #354698, #384008, #384060.
+ * tests/icles/stress-xoverlay.c: (cycle_window),
+ (create_window):
+ Implement some stress testing of setting window xid.
+
+2007-01-07 10:33:55 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgsaudio.def: Add new exported function.
+ Original commit message from CVS:
+ * win32/common/libgsaudio.def:
+ Add new exported function.
+ * win32/common/libgstogg.dsp:
+ Add gstoggaviparse.c to the build.
+ * win32/common/libgstvideoscale.dsp:
+ Add vs_4tap.c to the build.
+ * win32/common/libgstvorbis.dsp:
+ Add vorbistag.c to the build.
+
+2007-01-06 17:28:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ gst-libs/gst/audio/gstbaseaudiosink.c (gst_base_audio_sink_class_init)
+ Original commit message from CVS:
+ 2007-01-06 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstbaseaudiosink.c
+ (gst_base_audio_sink_class_init)
+ (gst_base_audio_sink_init):
+ (gst_base_audio_sink_activate_pull): Add an activate_pull function
+ to baseaudiosink, and tell basesink that we can work in pull mode.
+ This way the ring buffer thread drives the pipeline directly, if
+ pull mode is possible. There is some lingering nastiness regarding
+ capsnego, however.
+ (gst_base_audio_sink_callback): Implement the callback to pull
+ data. This interface is a bit light, though -- it should get a
+ GstFlowReturn return value at least.
+
+2007-01-05 19:43:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Printf format and missing argument fixes.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_stream_out):
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ * gst/playback/gstdecodebin2.c:
+ (gst_decode_group_check_if_blocked):
+ Printf format and missing argument fixes.
+
+2007-01-05 18:57:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/ogg/gstogmparse.c: Activate pads before adding them to the element.
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_stream_header),
+ (gst_ogm_parse_change_state):
+ Activate pads before adding them to the element.
+
+2007-01-05 16:02:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/seek/: Call g_thread_init() first thing in main() (see #391278).
+ Original commit message from CVS:
+ * tests/examples/seek/scrubby.c: (main):
+ * tests/examples/seek/seek.c: (main):
+ Call g_thread_init() first thing in main() (see #391278).
+
+2007-01-05 12:19:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add test for GstNetBuffer + gst_buffer_copy(). Disabled for the time being, since it's broken, see #393...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/netbuffer.c: (GST_START_TEST),
+ (netbuffer_suite):
+ Add test for GstNetBuffer + gst_buffer_copy(). Disabled
+ for the time being, since it's broken, see #393099.
+
+2007-01-05 12:13:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Update to use GST_PLUGINS_BASE_CFLAGS as well.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Update to use GST_PLUGINS_BASE_CFLAGS as well.
+
+2007-01-04 12:49:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: split out GST_CFLAGS into GST_PLUGINS_BASE_CFLAGS and GST_CFLAGS so that GST_BASE_CFLAGS can go inbetwe...
+ Original commit message from CVS:
+ * configure.ac:
+ split out GST_CFLAGS into GST_PLUGINS_BASE_CFLAGS and GST_CFLAGS
+ so that GST_BASE_CFLAGS can go inbetween them, making sure
+ we use uninstalled gst-libs headers
+ * docs/libs/Makefile.am:
+ * ext/alsa/Makefile.am:
+ * ext/cdparanoia/Makefile.am:
+ * ext/gnomevfs/Makefile.am:
+ * ext/libvisual/Makefile.am:
+ * ext/ogg/Makefile.am:
+ * ext/theora/Makefile.am:
+ * ext/vorbis/Makefile.am:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst/adder/Makefile.am:
+ * gst/audioconvert/Makefile.am:
+ * gst/audiorate/Makefile.am:
+ * gst/audioresample/Makefile.am:
+ * gst/playback/Makefile.am:
+ * gst/tcp/Makefile.am:
+ * gst/videoscale/Makefile.am:
+ * gst/volume/Makefile.am:
+ * sys/ximage/Makefile.am:
+ * sys/xvimage/Makefile.am:
+ * tests/icles/Makefile.am:
+ adapt
+
+2007-01-04 11:30:53 +0000 Julien Moutte <julien@moutte.net>
+
+ Add a method to the XOverlay interface to allow disabling of event handling in x[v]imagesink elements. This will let ...
+ Original commit message from CVS:
+ 2007-01-04 Julien MOUTTE <julien@moutte.net>
+ * gst-libs/gst/interfaces/xoverlay.c:
+ (gst_x_overlay_handle_events):
+ * gst-libs/gst/interfaces/xoverlay.h:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new),
+ (gst_ximagesink_set_xwindow_id),
+ (gst_ximagesink_set_event_handling),
+ (gst_ximagesink_xoverlay_init), (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_xwindow_new),
+ (gst_xvimagesink_set_xwindow_id),
+ (gst_xvimagesink_set_event_handling),
+ (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_set_property),
+ (gst_xvimagesink_get_property), (gst_xvimagesink_init),
+ (gst_xvimagesink_class_init):
+ * sys/xvimage/xvimagesink.h:
+ * tests/icles/stress-xoverlay.c: (toggle_events),
+ (create_window):
+ Add a method to the XOverlay interface to allow disabling of
+ event handling in x[v]imagesink elements. This will let X events
+ propagate to parent windows which can be usefull in some cases.
+ Be carefull that the application is then responsible of pushing
+ navigation events and expose events to the video sink.
+ Fixes: #387138.
+
+2007-01-03 15:45:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add vorbistag <=> GStreamer tag mapping for GST_TAG_LOCATION (fixes #392070).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Add vorbistag <=> GStreamer tag mapping for GST_TAG_LOCATION
+ (fixes #392070).
+
+2007-01-01 18:59:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Dist design docs.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/Makefile.am:
+ * docs/design/Makefile.am:
+ Dist design docs.
+
+2006-12-27 17:15:35 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Fix a documentation typo. Fixes: #390063.
+ Original commit message from CVS:
+ 2006-12-27 Julien MOUTTE <julien@moutte.net>
+ * docs/libs/gst-plugins-base-libs-sections.txt: Fix a
+ documentation
+ typo. Fixes: #390063.
+
+2006-12-27 12:08:13 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Plug a caps leak.
+ Original commit message from CVS:
+ 2006-12-27 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_setcaps):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_setcaps): Plug a
+ caps leak.
+ * win32/common/config.h: Updated.
+
+2006-12-22 12:10:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/: Fix the dp tests, but activating the pads for the streamheader tests too and cleaning up condi...
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (cleanup_gdpdepay),
+ (setup_gdpdepay_streamheader):
+ * tests/check/elements/gdppay.c: (cleanup_gdppay),
+ (setup_gdppay_streamheader):
+ Fix the dp tests, but activating the pads for the streamheader tests
+ too and cleaning up conditionaly
+
+2006-12-22 11:09:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/ffmpegcolorspace/: Add 2 new caps arrangements, for 24-bit RGB and BGR in 32-bits, but at the other end of the wo...
+ Original commit message from CVS:
+ * 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_convert),
+ (img_get_alpha_info):
+ Add 2 new caps arrangements, for 24-bit RGB and BGR in 32-bits, but at the
+ other end of the word. Fixes: #387073.
+ Add some inconsequential branch hints in a couple of places.
+
+2006-12-21 12:30:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: The "signed" field in raw audio caps is of boolean type, trying to extract ...
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_caps_to_smpfmt):
+ The "signed" field in raw audio caps is of boolean type, trying to
+ extract the value with _get_int() will fail (fix to keep in sync with
+ the copy in gst-ffmpeg)
+
+2006-12-21 08:12:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/: consistent pad (de)activation
+ Original commit message from CVS:
+ * tests/check/elements/audioresample.c: (cleanup_audioresample):
+ * tests/check/elements/audiotestsrc.c: (cleanup_audiotestsrc):
+ * tests/check/elements/gdpdepay.c: (setup_gdpdepay),
+ (cleanup_gdpdepay):
+ * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay):
+ * tests/check/elements/subparse.c: (teardown_subparse):
+ * tests/check/elements/textoverlay.c: (cleanup_textoverlay):
+ * tests/check/elements/videorate.c: (cleanup_videorate):
+ * tests/check/elements/videotestsrc.c: (cleanup_videotestsrc):
+ * tests/check/elements/volume.c: (cleanup_volume):
+ * tests/check/elements/vorbisdec.c: (setup_vorbisdec),
+ (cleanup_vorbisdec):
+ * tests/check/elements/vorbistag.c: (setup_vorbistag),
+ (cleanup_vorbistag):
+ consistent pad (de)activation
+
+2006-12-20 10:29:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Forgot to register the extensions.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Forgot to register the extensions.
+
+2006-12-20 09:25:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for VIVO files (my christmas present to the 90s).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (vivo_type_find),
+ (plugin_init):
+ Add typefinder for VIVO files (my christmas present to the 90s).
+
+2006-12-16 13:59:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: Special-case the text/plain media type: we only want to recognise it as a 'raw' decoded ...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (type_found):
+ Special-case the text/plain media type: we only want to recognise it
+ as a 'raw' decoded media type if it comes from a demuxer or subtitle
+ parser, but not if the entire stream is of text/plain type. If the
+ entire stream is text/plain, we should just error out.
+ This fixes playback of audio files with lyrics in totem. Totem can't
+ distinguish between text files and subtitle files and passes any
+ .txt file with the same basename as the main file to playbin as
+ suburi, and playbin will then throw a 'subtitle found, but no video
+ stream' error, which isn't entirely helpful. See #380342.
+ Also, with this change we'll show a slightly more correct error
+ message in case totem passes a playlist file to us (although a
+ custom error message wording instead of the default text would
+ probably not be a bad idea either).
+ Same problem also needs to be fixed for playbin+decodebin2.
+ * tests/check/Makefile.am:
+ * tests/check/elements/decodebin.c: (src_handoff_cb),
+ (decodebin_new_decoded_pad_cb), (GST_START_TEST),
+ (decodebin_suite):
+ Add simple unit test for decodebin for the above.
+
+2006-12-16 12:22:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Refuse to change state to READY when we failed to create any of the required elements in our instance ...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_change_state):
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_change_state):
+ Refuse to change state to READY when we failed to create any of the
+ required elements in our instance init function.
+
+2006-12-15 10:52:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Small docs fixes/updates.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Small docs fixes/updates.
+ * gst-libs/gst/video/gstvideosink.h:
+ Remove nonfunctional GST_VIDEO_SINK_CLOCK macro which is a leftover
+ from the 0.9 days (GST_BASE_SINK_CLOCK, which it points to, was
+ removed from the base sink API between 0.9.6 and 0.9.7).
+ API: add GST_VIDEO_SINK_CAST and use it for the height/width
+ accessor macros, so we don't do a runtime GObject type check every
+ time we use them.
+
+2006-12-15 00:20:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add doap file
+ Original commit message from CVS:
+ * Makefile.am:
+ * gst-plugins-base.doap:
+ * gst-plugins-base.spec.in:
+ add doap file
+
+2006-12-09 15:12:38 +0000 Jens Granseuer <jensgr@gmx.net>
+
+ Declare variables at the beginning of a block. Fixes #383195.
+ Original commit message from CVS:
+ Patch by: Jens Granseuer <jensgr at gmx net>
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create):
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_handle_frame_based_buffer),
+ (gst_base_rtp_audio_payload_handle_sample_based_buffer):
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_fixate):
+ Declare variables at the beginning of a block. Fixes #383195.
+
+2006-12-07 02:38:41 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump version nano - back to CVS.
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version nano - back to CVS.
+
+=== release 0.10.11 ===
+
+2006-12-07 02:30:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.11, "Dumb things"
+ Original commit message from CVS:
+ === release 0.10.11 ===
+ 2006-12-06 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.11, "Dumb things"
+
+2006-12-05 12:44:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: Handle the case where an element has multiple pads with unfixed caps as well as still po...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (find_dynamic), (dynamic_add),
+ (close_pad_link), (elem_is_dynamic), (unlinked), (close_link):
+ Handle the case where an element has multiple pads with
+ unfixed caps as well as still possibly producing more dynamic
+ pads by storing each case as a distinct entry in the dynamic list.
+ Fixes #38223 again.
+
+2006-12-04 13:02:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Fix #382223, add more dynamic caps handling.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (close_pad_link):
+ Fix #382223, add more dynamic caps handling.
+
+2006-12-01 11:35:57 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ * po/.gitignore:
+ Ignore all pot files
+ Original commit message from CVS:
+ Ignore all pot files
+
+2006-12-01 10:36:50 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: Delete bad debug code.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ Delete bad debug code.
+ Fixes #381219
+
+2006-12-01 10:27:54 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ Fix compilation on win32 under VS8
+ Original commit message from CVS:
+ * gst/videoscale/vs_4tap.c:
+ * win32/MANIFEST:
+ * win32/common/config.h:
+ * win32/vs8/libgstvideoscale.vcproj:
+ Fix compilation on win32 under VS8
+ Patch by: Sergey Scobich <sergey dot scobich at gmail dot com>
+ Partially fixes #381175
+
+2006-11-30 23:46:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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-11-30 12:50:42 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/pipelines/theoraenc.c: It would be very bad if, after a discont buffer, we thought every single following...
+ Original commit message from CVS:
+ * tests/check/pipelines/theoraenc.c: (check_buffer_granulepos),
+ (GST_START_TEST):
+ It would be very bad if, after a discont buffer, we thought every
+ single following buffer was also discont. So, add to the test to
+ ensure that this isn't the case.
+ * ext/theora/theoraenc.c: (theora_enc_is_discontinuous):
+ ... it was the case. So fix it.
+
+2006-11-28 16:43:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Improve debug.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (check_queue_event):
+ Improve debug.
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform_caps):
+ Fix width and height range from 16 - 4096 to 1 - MAXINT, just like the
+ padtemplate caps. Refixes #357577.
+
+2006-11-28 16:21:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Add event probe to see when EOS is in a queue and we can disable the underrun signals....
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (check_queue_event),
+ (queue_threshold_reached), (queue_out_of_data),
+ (gen_preroll_element):
+ Add event probe to see when EOS is in a queue and we can disable the
+ underrun signals. Fixes #357577.
+
+2006-11-28 14:40:39 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/: New decodebin2 element.
+ Original commit message from CVS:
+ * gst/playback/Makefile.am:
+ * gst/playback/gstdecodebin2.c: (gst_decode_bin_get_type),
+ (_gst_boolean_accumulator), (gst_decode_bin_class_init),
+ (gst_decode_bin_factory_filter), (compare_ranks), (print_feature),
+ (gst_decode_bin_init), (gst_decode_bin_dispose),
+ (gst_decode_bin_finalize), (gst_decode_bin_set_property),
+ (gst_decode_bin_get_property), (gst_decode_bin_set_caps),
+ (gst_decode_bin_get_caps), (gst_decode_bin_autoplug_continue),
+ (gst_decode_bin_autoplug_sort), (analyze_new_pad), (connect_pad),
+ (connect_element), (expose_pad), (type_found),
+ (pad_added_group_cb), (pad_removed_group_cb),
+ (no_more_pads_group_cb), (pad_added_cb), (pad_removed_cb),
+ (no_more_pads_cb), (find_compatibles), (is_demuxer_element),
+ (are_raw_caps), (multi_queue_overrun_cb),
+ (multi_queue_underrun_cb), (gst_decode_group_new),
+ (get_current_group), (group_demuxer_event_probe),
+ (gst_decode_group_control_demuxer_pad),
+ (gst_decode_group_control_source_pad),
+ (gst_decode_group_check_if_blocked),
+ (gst_decode_group_check_if_drained), (gst_decode_group_expose),
+ (gst_decode_group_hide), (gst_decode_group_free),
+ (gst_decode_group_set_complete), (source_pad_blocked_cb),
+ (source_pad_event_probe), (gst_decode_pad_new), (add_fakesink),
+ (remove_fakesink), (find_sink_pad), (gst_decode_bin_change_state),
+ (plugin_init):
+ New decodebin2 element.
+ Closes #370092
+ * gst/playback/gstplay-marshal.list:
+ Added marshallers for new signals in decodebin2
+ * gst/playback/gstplaybasebin.c: (setup_subtitle), (make_decoder):
+ Use decodebin2 if *and only if* the USE_DECODEBIN2 environment variable
+ is set.
+
+2006-11-28 10:45:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Disable rtsp:// uris for the release, it's not good enough yet.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source),
+ (gst_play_base_bin_change_state):
+ Disable rtsp:// uris for the release, it's not good enough yet.
+ Remove unused var.
+
+2006-11-26 16:39:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Implement reverse playback.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (gst_theora_dec_reset),
+ (theora_dec_push_forward), (theora_dec_push_reverse),
+ (theora_handle_data_packet), (theora_dec_decode_buffer),
+ (theora_dec_flush_decode), (theora_dec_chain_reverse),
+ (theora_dec_chain_forward), (theora_dec_chain):
+ Implement reverse playback.
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_reset),
+ (vorbis_dec_decode_buffer), (vorbis_dec_flush_decode),
+ (vorbis_dec_chain_forward):
+ Clear buffers used for reverse playback in _reset.
+ No need to set the eos flag, we clip samples using the segment.
+
+2006-11-24 15:40:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Some cleanups.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_page_copy), (gst_ogg_page_free),
+ (gst_ogg_pad_init), (gst_ogg_pad_dispose), (gst_ogg_pad_reset),
+ (gst_ogg_pad_stream_out), (gst_ogg_pad_submit_page),
+ (gst_ogg_chain_reset), (gst_ogg_demux_perform_seek):
+ Some cleanups.
+ Handle continued pages in reverse mode.
+
+2006-11-24 15:39:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Small cleanups.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward),
+ (vorbis_handle_data_packet), (vorbis_dec_decode_buffer),
+ (vorbis_dec_flush_decode):
+ Small cleanups.
+ Don't try to add invalid timestamps.
+ Clipping will unref the buffer.
+
+2006-11-24 08:56:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: remove obsolete _factory_init protos
+ Original commit message from CVS:
+ * gst/adder/gstadder.h:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ remove obsolete _factory_init protos
+
+2006-11-24 08:35:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: Fix spacing in debug message.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_buffer_alloc):
+ Fix spacing in debug message.
+
+2006-11-23 11:07:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Don't just ignore return values from _pad_push().
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_page),
+ (gst_ogg_demux_chain):
+ Don't just ignore return values from _pad_push().
+ Small debug improvements.
+
+2006-11-23 11:02:11 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggmux.c: If our incoming buffer is marked as DISCONT, then increment the page number (so that the discont...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_process_best_pad):
+ If our incoming buffer is marked as DISCONT, then increment the page
+ number (so that the discontinuity is marked in the final ogg
+ bitstream) and flush the previous page.
+
+2006-11-22 14:34:03 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/: Mark discontinuities of > 3/4 of a frame, reinit encoder.
+ Original commit message from CVS:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c: (gst_theora_enc_init),
+ (theora_enc_reset), (theora_enc_clear), (theora_enc_sink_setcaps),
+ (theora_buffer_from_packet), (theora_enc_is_discontinuous),
+ (theora_enc_chain), (theora_enc_change_state):
+ Mark discontinuities of > 3/4 of a frame, reinit encoder.
+ * tests/check/pipelines/theoraenc.c: (check_buffer_granulepos),
+ (GST_START_TEST), (theoraenc_suite):
+ Enable discontinuity test, fix it.
+
+2006-11-21 18:39:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.*: Some textoverlay fixes: for one, in the video chain function, actually wait for a text bu...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init),
+ (gst_text_overlay_text_pad_unlink), (gst_text_overlay_text_event),
+ (gst_text_overlay_video_event), (gst_text_overlay_pop_text),
+ (gst_text_overlay_text_chain), (gst_text_overlay_video_chain),
+ (gst_text_overlay_change_state):
+ * ext/pango/gsttextoverlay.h:
+ Some textoverlay fixes: for one, in the video chain function,
+ actually wait for a text buffer to come in if there is none at the
+ moment and there should be one; also, deal more gracefully with
+ incoming buffers that do not have a timestamp or duration; discard
+ text buffer when not needed any longer. Fixes #341681.
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/textoverlay.c:
+ (notgst_check_setup_src_pad2), (notgst_check_teardown_src_pad2),
+ (setup_textoverlay), (buffer_is_all_black), (create_black_buffer),
+ (create_text_buffer), (cleanup_textoverlay), (GST_START_TEST),
+ (test_video_waits_for_text_send_text_newsegment_thread),
+ (test_video_waits_for_text_shutdown_element),
+ (test_render_continuity_push_video_buffers_thread),
+ (textoverlay_suite):
+ Add some unit tests for textoverlay.
+
+2006-11-21 09:29:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Avoid integer underflow when the found probability for mp3 is smaller than the '...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset):
+ Avoid integer underflow when the found probability for mp3 is
+ smaller than the 'penalty' we subtract if there's not a clean
+ mp3 header sync at offset 0.
+
+2006-11-21 08:17:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/gst-plugins-base-libs-sections.txt: Add some new symbols to the docs
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ Add some new symbols to the docs
+
+2006-11-20 16:44:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Enable ffmpegcolorspace test now that the RGBA32 issue is fixed (for now not for valgrinding though, si...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/ffmpegcolorspace.c:
+ (ffmpegcolorspace_suite):
+ Enable ffmpegcolorspace test now that the RGBA32 issue is fixed
+ (for now not for valgrinding though, since it takes too long).
+
+2006-11-20 15:01:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Fix RGBA32 caps. Fixes #357038.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps):
+ Fix RGBA32 caps. Fixes #357038.
+
+2006-11-20 12:20:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixertrack.h: Add FIXME so we can add some padding here in 0.11
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ Add FIXME so we can add some padding here in 0.11
+
+2006-11-19 17:07:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.h: Fix GstBaseRTPAudioPayload structure so the whole GObject inheritance busi...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ Fix GstBaseRTPAudioPayload structure so the whole GObject
+ inheritance business actually works (parent class instance structure
+ must always come first in the derived class instance structure).
+
+2006-11-16 14:35:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Make sure our checks and the videotestsrc plugin link against the local uninstalled gst libs and not any installed gs...
+ Original commit message from CVS:
+ * gst/videotestsrc/Makefile.am:
+ * tests/check/Makefile.am:
+ Make sure our checks and the videotestsrc plugin link against the
+ local uninstalled gst libs and not any installed gst libs that
+ might happen to exist as well.
+ * tests/check/elements/adder.c: (message_received),
+ (test_event_message_received), (test_play_twice_message_received):
+ * tests/check/elements/ffmpegcolorspace.c: (GST_START_TEST):
+ Fix compiler warnings when compiling against core with disabled
+ debugging system.
+
+2006-11-16 12:55:08 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: Fix audiorate, so that it accurately sets offsets and timestamps.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_reset),
+ (gst_audio_rate_sink_event), (gst_audio_rate_chain):
+ Fix audiorate, so that it accurately sets offsets and timestamps.
+ Doesn't change the fundamental algorithmic decisions; so should be
+ safe.
+ * tests/check/Makefile.am:
+ Enable audiorate test now that it passes.
+
+2006-11-15 10:05:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: clear xv when going to NULL, remove // commented non-existant proto
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state):
+ clear xv when going to NULL, remove // commented non-existant proto
+ * tests/examples/seek/seek.c: (main):
+ add missing tooltip description for scrub and play_scrub
+
+2006-11-14 23:34:19 +0000 David Schleef <ds@schleef.org>
+
+ configure.ac: Bump liboil requirement to 0.3.8.
+ Original commit message from CVS:
+ * configure.ac:
+ Bump liboil requirement to 0.3.8.
+ * gst-libs/gst/riff/riff-media.c:
+ Add Dirac fourcc.
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_scanline.h:
+ Use liboil's stdint.h.
+ * gst/videotestsrc/videotestsrc.c:
+ Remove liboil related ifdef's, since they aren't needed now, and
+ won't work with future versions.
+
+2006-11-14 23:08:38 +0000 David Schleef <ds@schleef.org>
+
+ gst/videoscale/: Add a 4-tap image scaler. Theoretically looks much prettier.
+ Original commit message from CVS:
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videoscale/gstvideoscale.h:
+ * gst/videoscale/vs_4tap.c:
+ * gst/videoscale/vs_4tap.h:
+ * gst/videoscale/vs_image.c:
+ * gst/videoscale/vs_image.h:
+ * gst/videoscale/vs_scanline.c:
+ * gst/videoscale/vs_scanline.h:
+ Add a 4-tap image scaler. Theoretically looks much prettier.
+ The tap calculation could use some improvement.
+
+2006-11-14 11:54:14 +0000 Jan David Mol <j.j.d.mol@tudelft.nl>
+
+ Various gsize and gssize printf fixes. Fixes #372507.
+ Original commit message from CVS:
+ Patch by: Jan David Mol <j dot j dot d dot mol at tudelft dot nl>
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_parse_strf_auds),
+ (gst_riff_parse_strf_iavs):
+ * gst/subparse/gstsubparse.c: (convert_encoding):
+ * gst/tcp/gstmultifdsink.c:
+ (gst_multi_fd_sink_handle_client_write):
+ * gst/tcp/gsttcp.c: (gst_tcp_socket_write), (gst_tcp_socket_read),
+ (gst_tcp_read_buffer), (gst_tcp_gdp_read_caps),
+ (gst_tcp_gdp_write_buffer), (gst_tcp_gdp_write_caps):
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_render):
+ * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls),
+ (gst_ximagesink_ximage_new):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new):
+ Various gsize and gssize printf fixes. Fixes #372507.
+
+2006-11-13 18:14:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.*: First stab at vorbis reverse playback.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_sink_event),
+ (vorbis_dec_push_forward), (vorbis_dec_push_reverse),
+ (vorbis_handle_data_packet), (vorbis_dec_decode_buffer),
+ (vorbis_dec_flush_decode), (vorbis_dec_chain_reverse),
+ (vorbis_dec_chain_forward), (vorbis_dec_chain):
+ * ext/vorbis/vorbisdec.h:
+ First stab at vorbis reverse playback.
+
+2006-11-13 17:30:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.*: Make the clock sync code more accurate wrt resampling and playback at differen...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_event), (gst_base_audio_sink_render):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Make the clock sync code more accurate wrt resampling and playback
+ at different rates.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_commit_full), (gst_ring_buffer_commit):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Use better algorithm to interpolate sample rates.
+
+2006-11-13 15:31:01 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggdemux.c: Improve a debug line slightly.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_page):
+ Improve a debug line slightly.
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_plugin_init):
+ Call gst_riff_init() in plugin_init, to avoid getting errors from
+ the debug system (unrelated changes to another plugin made this turn
+ up; not sure why).
+
+2006-11-10 19:20:21 +0000 Sergey Scobich <sergery.scobich@gmail.com>
+
+ win32/common/libgsttag.def: Add missing symbol (#366492).
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergery.scobich at gmail com>
+ * win32/common/libgsttag.def:
+ Add missing symbol (#366492).
+
+2006-11-10 00:52:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreamselector.c: Don't unref a NULL pad.
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c: (gst_stream_selector_dispose):
+ Don't unref a NULL pad.
+
+2006-11-09 00:50:00 +0000 Christian Schaller <uraeus@gnome.org>
+
+ ext/ogg/gstoggdemux.c: Implement first stab at reverse playback.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_page),
+ (gst_ogg_demux_get_prev_page), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_handle_page), (gst_ogg_demux_chain),
+ (gst_ogg_demux_loop_forward), (gst_ogg_demux_loop_reverse),
+ (gst_ogg_demux_loop):
+ Implement first stab at reverse playback.
+
+2006-11-07 07:22:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-media.c: add h263/h264 variants to the caps, Fixes #363118
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ add h263/h264 variants to the caps, Fixes #363118
+
+2006-11-06 18:24:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/: Use g_strerror instead of strerror so we get UTF-8.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func):
+ * gst-libs/gst/audio/gstaudiosrc.c: (audioringbuffer_thread_func):
+ Use g_strerror instead of strerror so we get UTF-8.
+
+2006-11-04 07:25:58 +0000 David Schleef <ds@schleef.org>
+
+ ext/ogg/: Add/remove KW-DIRAC header here, since it is ogg-specific.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ Add/remove KW-DIRAC header here, since it is ogg-specific.
+
+2006-11-03 15:44:31 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/typefind/gsttypefindfunctions.c: Recognise more mpeg4 elementary video streams.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg4_video_type_find):
+ Recognise more mpeg4 elementary video streams.
+
+2006-11-02 17:26:03 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Lower the probability of mp3 typefinding functions if we don't find a valid mp3 ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset):
+ Lower the probability of mp3 typefinding functions if we don't find a
+ valid mp3 header at the start of the file.
+ Closes #369482
+
+2006-11-02 15:06:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/: Document and partially implement an algorithm for doing reverse playback of theora video.
+ Original commit message from CVS:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_init),
+ (theora_dec_sink_event), (theora_dec_chain_forward),
+ (theora_dec_flush_decode), (theora_dec_chain_reverse),
+ (theora_dec_chain):
+ Document and partially implement an algorithm for doing reverse playback
+ of theora video.
+
+2006-11-02 14:18:45 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ win32/: Misc. VS8 build fixes: fix syntax in config.h, add missing entries to libgsttag.def; add missing dependencies...
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergey.scobich at gmail com>
+ * win32/common/config.h:
+ * win32/common/interfaces-enumtypes.c:
+ * win32/common/libgsttag.def:
+ * win32/vs8/gst-plugins-base.sln:
+ * win32/vs8/libgstaudioresample.vcproj:
+ * win32/vs8/libgstinterfaces.vcproj:
+ * win32/vs8/libgstogg.vcproj:
+ * win32/vs8/libgstriff.vcproj:
+ * win32/vs8/libgsttag.vcproj:
+ * win32/vs8/libgsttheora.vcproj:
+ * win32/vs8/libgstvideoscale.vcproj:
+ * win32/vs8/libgstvorbis.vcproj:
+ Misc. VS8 build fixes: fix syntax in config.h, add missing entries
+ to libgsttag.def; add missing dependencies for some vs8 projects;
+ re-arrange placement of .def files in vs8 projects (#366334).
+
+2006-11-01 14:08:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstogg.c: Remove unused variable.
+ Original commit message from CVS:
+ * ext/ogg/gstogg.c:
+ Remove unused variable.
+ * ext/ogg/gstoggdemux.c:
+ Fix Wim's surname in plugin description.
+
+2006-10-31 15:05:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-plugins-base.spec.in: spec new .h file. Fixes #368310.
+ Original commit message from CVS:
+ * gst-plugins-base.spec.in:
+ spec new .h file. Fixes #368310.
+
+2006-10-31 14:19:07 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.*: Make using the remove or clear signals threadsafe.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_add_full),
+ (gst_multi_fd_sink_remove), (gst_multi_fd_sink_clear),
+ (gst_multi_fd_sink_get_stats),
+ (gst_multi_fd_sink_remove_client_link),
+ (gst_multi_fd_sink_queue_buffer),
+ (gst_multi_fd_sink_handle_clients):
+ * gst/tcp/gstmultifdsink.h:
+ Make using the remove or clear signals threadsafe.
+ Make calling get-stats with an invalid fd not segfault.
+ Fixes 368273.
+
+2006-10-31 10:49:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/: Fix and activate base audio payloader.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ (gst_base_rtp_audio_payload_init):
+ Fix and activate base audio payloader.
+
+2006-10-28 17:22:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for QuickTime Image Files (see #366156).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (qtif_type_find),
+ (plugin_init):
+ Add typefinder for QuickTime Image Files (see #366156).
+
+2006-10-28 16:00:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioresample/gstaudioresample.c: Another typo fix (#366212).
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init):
+ Another typo fix (#366212).
+
+2006-10-27 17:13:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/volume/gstvolume.c: Use stream time to synchronize volume property instead of rather random timestamps. This is n...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_transform_ip):
+ Use stream time to synchronize volume property instead of rather random
+ timestamps. This is needed when gnonlin does its time shifting.
+
+2006-10-27 16:46:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ I'm too lazy to comment this
+ Original commit message from CVS:
+ *** empty log message ***
+
+2006-10-27 16:45:30 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ ext/ogg/gstoggmux.c: Remove the pad from the element in release_pad.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet dot be>
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_release_pad):
+ Remove the pad from the element in release_pad.
+
+2006-10-27 11:57:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/: Explicitly create our custom buffer classes at a thread-safe location as well, since g_type_class_ref() doesn't...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_get_type):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_type):
+ Explicitly create our custom buffer classes at a thread-safe
+ location as well, since g_type_class_ref() doesn't seem to be
+ entirely thread-safe either (#365501; also see #349410).
+
+2006-10-26 10:49:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-read.c: If strings in INFO chunk are not UTF-8, do something similar to what we do for ID3v1 t...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c: (freeform_string_to_utf8),
+ (gst_riff_parse_info):
+ If strings in INFO chunk are not UTF-8, do something similar to
+ what we do for ID3v1 tags: check a number of environment variables
+ (GST_AVI_TAG_ENCODING, GST_RIFF_TAG_ENCODING, GST_TAG_ENCODING) for
+ character sets to try, otherwise try the current locale and/or fall
+ back on ISO-8859-1. Fixes #360552.
+
+2006-10-23 12:46:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/: Add a bunch of exciting new checkers patterns.
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_pattern_get_type),
+ (gst_video_test_src_set_pattern):
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c: (gst_video_test_src_checkers1),
+ (gst_video_test_src_checkers2), (gst_video_test_src_checkers4),
+ (gst_video_test_src_checkers8):
+ * gst/videotestsrc/videotestsrc.h:
+ Add a bunch of exciting new checkers patterns.
+
+2006-10-23 12:06:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/: Add support for TMPlayer-type subtitles (#362845).
+ Original commit message from CVS:
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect),
+ (gst_sub_parse_format_autodetect), (handle_buffer),
+ (gst_sub_parse_chain), (gst_subparse_type_find), (plugin_init):
+ * gst/subparse/gstsubparse.h:
+ * gst/subparse/tmplayerparse.c: (tmplayer_parse_line),
+ (parse_tmplayer):
+ * gst/subparse/tmplayerparse.h:
+ Add support for TMPlayer-type subtitles (#362845).
+ * tests/check/elements/subparse.c: (test_tmplayer_do_test),
+ (GST_START_TEST), (subparse_suite):
+ Add some basic unit tests for the above.
+
+2006-10-23 11:47:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/audiorate.c: More tests for audiorate: inject buffers to check behaviour when buffers overlap.
+ Original commit message from CVS:
+ * tests/check/elements/audiorate.c: (test_injector_base_init),
+ (test_injector_class_init), (test_injector_chain),
+ (test_injector_init), (probe_cb), (do_perfect_stream_test),
+ (GST_START_TEST), (audiorate_suite):
+ More tests for audiorate: inject buffers to check behaviour when
+ buffers overlap.
+
+2006-10-21 16:39:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add some basic unit tests for audiorate. Disabled at the moment since it doesn't pass yet (see bug #363...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/audiorate.c: (probe_cb), (got_buf),
+ (do_perfect_stream_test), (GST_START_TEST), (audiorate_suite):
+ Add some basic unit tests for audiorate. Disabled at the moment
+ since it doesn't pass yet (see bug #363119).
+
+2006-10-20 17:02:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Add missing closing tags for markup and fix broken markup, otherwise pango won't render a...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (subrip_fix_up_markup),
+ (parse_subrip), (handle_buffer):
+ Add missing closing tags for markup and fix broken markup,
+ otherwise pango won't render anything (fixes #357531). Also,
+ make sure the text we send out is always NUL-terminated
+ (better safe than sorry etc.).
+ * tests/check/elements/subparse.c: (test_srt_do_test),
+ (test_srt):
+ Some more tests for .srt incl. tests for the above stuff.
+
+2006-10-20 13:56:55 +0000 Stefan Kost <ensonic@users.sf.net>
+
+ sys/: Try to redraw borders only when needed. Apparently this consumes resources on small devices... :-O (#363607)
+ Original commit message from CVS:
+ 2006-10-20 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_put):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put):
+ Patch by: Stefan Kost <ensonic@users.sf.net>
+ Try to redraw borders only when needed. Apparently this consumes
+ resources on small devices... :-O (#363607)
+
+2006-10-20 13:54:19 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.c: If caps change, then update the client's idea of the caps so that we don't end up re-sendin...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c:
+ (gst_multi_fd_sink_client_queue_buffer):
+ If caps change, then update the client's idea of the caps so that we
+ don't end up re-sending streamheaders for every single buffer after
+ the caps change.
+
+2006-10-20 12:31:02 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggparse.c: Set caps on pushed buffers; fix up refcounting of caps objects.
+ Original commit message from CVS:
+ * ext/ogg/gstoggparse.c: (gst_ogg_parse_dispose),
+ (gst_ogg_parse_append_header), (gst_ogg_parse_chain):
+ Set caps on pushed buffers; fix up refcounting of caps objects.
+
+2006-10-19 14:09:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Typefind mmsh header data packet to application/x-mmsh (#362625).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mmsh_type_find),
+ (plugin_init):
+ Typefind mmsh header data packet to application/x-mmsh (#362625).
+
+2006-10-19 09:17:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add very simple unit test for subparse.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/subparse.c: (buffer_from_static_string),
+ (setup_subparse), (teardown_subparse), (test_srt_do_test),
+ (GST_START_TEST), (subparse_suite):
+ Add very simple unit test for subparse.
+
+2006-10-19 09:00:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Strip trailing newlines from subtitle text output.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (strip_trailing_newlines),
+ (parse_subrip):
+ Strip trailing newlines from subtitle text output.
+
+2006-10-18 18:40:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Fix memleak; clear subparse->textbuf n state change function.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_change_state):
+ Fix memleak; clear subparse->textbuf n state change function.
+
+2006-10-18 15:13:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Don't require subrip (.srt) files to start with a chunk number of 1.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect):
+ Don't require subrip (.srt) files to start with a chunk number of 1.
+
+2006-10-18 13:42:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.*: Extract rate from the NEWSEGMENT event.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_event), (gst_base_audio_sink_render):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ Extract rate from the NEWSEGMENT event.
+ Use commit_full to also take rate adjustment into account when writing
+ samples to the ringbuffer.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_commit_full), (gst_ring_buffer_commit),
+ (gst_ring_buffer_read):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Added _commit_full() to also take rate into account.
+ Use simple interpolation algorithm to resample audio.
+ API: gst_ring_buffer_commit_full()
+ * tests/examples/seek/scrubby.c: (speed_cb), (do_seek):
+ * tests/examples/seek/seek.c: (segment_done):
+ Don't try to seek with 0.0 rate, just pause instead.
+ Remove bogus debug line.
+
+2006-10-18 12:57:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Catch async errors when starting up the subtitle bin, so we can stop waiting and conti...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (subbin_startup_sync_msg),
+ (setup_source):
+ Catch async errors when starting up the subtitle bin, so we can
+ stop waiting and continue with the main film instead of hanging
+ forever. Fixes #339366.
+ * tests/check/elements/playbin.c: (playbin_suite):
+ Enable unit test for the above.
+
+2006-10-18 09:53:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Some small and basic unit tests for playbin; not very useful yet, but at least a start.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/playbin.c: (GST_START_TEST),
+ (gst_red_video_src_uri_get_type),
+ (gst_red_video_src_uri_get_protocols),
+ (gst_red_video_src_uri_get_uri), (gst_red_video_src_uri_set_uri),
+ (gst_red_video_src_uri_handler_init),
+ (gst_red_video_src_init_type), (gst_red_video_src_base_init),
+ (gst_red_video_src_create), (gst_red_video_src_class_init),
+ (gst_red_video_src_init), (plugin_init), (playbin_suite):
+ Some small and basic unit tests for playbin; not very useful yet,
+ but at least a start.
+
+2006-10-18 09:46:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: The old pad activation spiel.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (setup_sinks):
+ The old pad activation spiel.
+
+2006-10-18 09:31:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Don't hang forever if the subbin already fails to start up in the state change to PAUS...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source):
+ Don't hang forever if the subbin already fails to start up in
+ the state change to PAUSED (#339366).
+
+2006-10-17 17:17:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/tuner.c: Fix some function guards, add some more function guards.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/tuner.c: (gst_tuner_list_channels),
+ (gst_tuner_set_channel), (gst_tuner_get_channel),
+ (gst_tuner_list_norms), (gst_tuner_set_norm), (gst_tuner_get_norm),
+ (gst_tuner_set_frequency), (gst_tuner_get_frequency),
+ (gst_tuner_signal_strength), (gst_tuner_find_norm_by_name),
+ (gst_tuner_find_channel_by_name):
+ Fix some function guards, add some more function guards.
+
+2006-10-17 11:34:32 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: Don't return a pad from get_our_ghost_pad unless it is actually the one we want.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (get_our_ghost_pad),
+ (remove_element_chain):
+ Don't return a pad from get_our_ghost_pad unless it is actually the
+ one we want.
+ Change a cast in remove_element_chain slightly.
+
+2006-10-13 15:20:29 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Segment seeking needs to use the rate and set stop to -1.
+ Original commit message from CVS:
+ 2006-10-13 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (do_seek), (start_seek),
+ (rate_spinbutton_changed_cb), (segment_done),
+ (msg_state_changed):
+ Segment seeking needs to use the rate and set stop to -1.
+
+2006-10-13 14:15:42 +0000 Ville Syrjala <ville.syrjala@movial.fi>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Don't crash when ringbuffer is not yet created.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_setcaps):
+ Don't crash when ringbuffer is not yet created.
+ Patch by: Ville Syrjala <ville dot syrjala at movial dot fi>
+ Fixes #361634.
+ * gst/playback/gstplaybasebin.c: (new_decoded_pad_full):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_request_new_pad):
+ Activate pads befre adding them to running elements.
+
+2006-10-13 11:25:10 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Stop the scale updater when we start grabing the slider. Don't wait for the pipeline to b...
+ Original commit message from CVS:
+ 2006-10-13 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (do_seek), (start_seek),
+ (rate_spinbutton_changed_cb), (msg_state_changed): Stop the
+ scale
+ updater when we start grabing the slider. Don't wait for the
+ pipeline to be PAUSED.
+
+2006-10-13 08:57:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/mixer.c: Guard mixer interface functions against bogus arguments.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/mixer.c: (gst_mixer_list_tracks),
+ (gst_mixer_set_volume), (gst_mixer_get_volume),
+ (gst_mixer_set_mute), (gst_mixer_set_option),
+ (gst_mixer_get_option), (gst_mixer_mute_toggled),
+ (gst_mixer_record_toggled), (gst_mixer_volume_changed),
+ (gst_mixer_option_changed):
+ Guard mixer interface functions against bogus arguments.
+
+2006-10-12 19:39:07 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: Use state-changed messages to trigger start/stop of scale update timer. Indeed the scale ...
+ Original commit message from CVS:
+ 2006-10-12 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (do_seek), (start_seek),
+ (stop_seek),
+ (play_cb), (pause_cb), (stop_cb),
+ (rate_spinbutton_changed_cb),
+ (msg_state_changed), (main): Use state-changed messages to
+ trigger
+ start/stop of scale update timer. Indeed the scale slider was
+ jumping here and there because the update timer was activated
+ before seek completed. This fixes instant applying of rate
+ changes
+ by pressing the spinbutton like a crazy man !
+
+2006-10-12 19:09:06 +0000 Sebastien Cote <sebas642@yahoo.ca>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: Fix two small memory leaks (#361456).
+ Original commit message from CVS:
+ Patch by: Sebastien Cote <sebas642 at yahoo.ca>
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_init),
+ (gst_basertppayload_finalize):
+ Fix two small memory leaks (#361456).
+
+2006-10-10 18:56:01 +0000 Julien Moutte <julien@moutte.net>
+
+ tests/examples/seek/seek.c: When changing spinbutton we try to change the rate on the fly.
+ Original commit message from CVS:
+ 2006-10-10 Julien MOUTTE <julien@moutte.net>
+ * tests/examples/seek/seek.c: (do_seek),
+ (rate_spinbutton_changed_cb): When changing spinbutton we try
+ to change the rate on the fly.
+
+2006-10-10 16:50:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/: Add WMS caps.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Add WMS caps.
+
+2006-10-10 12:49:03 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ ext/gnomevfs/: Fix URI interface implementation return type.
+ Original commit message from CVS:
+ 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Fix URI interface implementation return type.
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_set_property):
+ Fix what looks like a copy/paste issue when assigning values.
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ (gst_audio_filter_template_get_type):
+ Cast to prevent Forte warnings.
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create):
+ Fix URI interface implementation return type.
+ gst_pad_query_position requires a signed integer pointer as
+ 3rd parameter, GstClockTime is unsigned.
+ * gst/audioconvert/audioconvert.c:
+ Fix integer overflow when treated as signed.
+ * gst/audioresample/resample.c: (resample_add_input_data):
+ Cast to prevent warnings on Forte.
+ * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette):
+ Fix integer overflow when treated as signed.
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ Fix integer overflow when treated as signed. RGBA_OUT shifts bits.
+ * gst/playback/gstdecodebin.c: (queue_filled_cb),
+ (cleanup_decodebin):
+ Who initialises a guint to -1!
+ Cast function pointers to prevent warnings on Forte.
+ * gst/playback/gstplaybasebin.c: (queue_deadlock_check),
+ (queue_threshold_reached):
+ Cast function pointers correctly to prevent warnings on Forte.
+ * gst/playback/gststreaminfo.c: (gst_stream_info_dispose):
+ Cast function pointers correctly to prevent warnings on Forte.
+ * gst/subparse/gstssaparse.c: (gst_ssa_parse_setcaps):
+ Obvious change to unsigned, 0xEF > max signed char.
+ * gst/tcp/gstmultifdsink.c: (get_buffers_max), (count_burst_unit):
+ GstClockTime is unsigned, initialise correctly.
+ * gst/tcp/gsttcp.c: (gst_tcp_socket_write):
+ Cast so pointer arithemetic doesn't cause warnings on Forte.
+ * gst/videorate/gstvideorate.c:
+ Use correct return value.
+ * tests/examples/seek/scrubby.c:
+ GstClockTime is unsigned, initialise correctly.
+
+2006-10-10 11:20:03 +0000 Ferenc Gerlits <fgerlits@gmail.com>
+
+ gst/typefind/gsttypefindfunctions.c: Recognise XML files and XML-like files shorter than 256 bytes as well (fixes #35...
+ Original commit message from CVS:
+ Patch by: Ferenc Gerlits <fgerlits at gmail com>
+ * gst/typefind/gsttypefindfunctions.c:
+ Recognise XML files and XML-like files shorter than 256 bytes as
+ well (fixes #359237).
+
+2006-10-09 15:01:30 +0000 Edgard Lima <edgard.lima@indt.org.br>
+
+ * ChangeLog:
+ * common:
+ * gst/typefind/gsttypefindfunctions.c:
+ Added typefind functions to video/x-nuv media.
+ Original commit message from CVS:
+ Added typefind functions to video/x-nuv media.
+
+2006-10-08 16:59:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/xoverlay.c: Some more guards against invalid input.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ (gst_x_overlay_set_xwindow_id), (gst_x_overlay_expose):
+ Some more guards against invalid input.
+
+2006-10-07 18:35:39 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Useless goto.
+ Original commit message from CVS:
+ 2006-10-07 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_text_event):
+ Useless goto.
+ * tests/examples/seek/seek.c: (do_seek),
+ (rate_spinbutton_changed_cb), (main): Add a rate spinbutton in
+ seek example to experiment with rates != 1.0 (reverse playback
+ !)
+
+2006-10-06 19:20:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/interfaces/xoverlay.c: Unref message in doc-example (spotted by Robert McQueen)
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ Unref message in doc-example (spotted by Robert McQueen)
+
+2006-10-06 17:04:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/typefind/gsttypefindfunctions.c: printf fix.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset),
+ (mpeg1_parse_header), (mpeg1_sys_type_find):
+ printf fix.
+
+2006-10-06 14:37:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/: Activate dynamic pads before adding them to the element.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_init),
+ (close_pad_link):
+ * gst/playback/gstplaybasebin.c: (new_decoded_pad_full):
+ Activate dynamic pads before adding them to the element.
+
+2006-10-06 14:04:53 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/floatcast/floatcast.h: Fix obviously-bogus macros; use the correct types.
+ Original commit message from CVS:
+ * gst-libs/gst/floatcast/floatcast.h:
+ Fix obviously-bogus macros; use the correct types.
+
+2006-10-06 13:34:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Also call parent state change function to activate pads.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_change_state):
+ Also call parent state change function to activate pads.
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset),
+ (mpeg1_parse_header), (mpeg1_sys_type_find):
+ Add some more debug info in mpeg typefinding.
+
+2006-10-06 12:57:10 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoradec.c: Zero byte theora packets are valid and well-defined; don't warn on them.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_chain):
+ Zero byte theora packets are valid and well-defined; don't warn on
+ them.
+
+2006-10-06 10:04:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gstmultifdsink.c: API: add dropped_buffers to the get-stats GValueArray
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init),
+ (gst_multi_fd_sink_get_stats), (find_limits),
+ (gst_multi_fd_sink_queue_buffer):
+ API: add dropped_buffers to the get-stats GValueArray
+
+2006-10-05 15:55:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Printf format fixes.
+ Original commit message from CVS:
+ * ext/alsa/gstalsadeviceprobe.c:
+ (gst_alsa_device_property_probe_get_values):
+ * ext/alsa/gstalsasink.c: (set_hwparams):
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain_elem_pad),
+ (gst_ogg_chain_new_stream), (gst_ogg_demux_read_chain):
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_send_headers),
+ (gst_ogg_mux_process_best_pad):
+ * ext/ogg/gstoggparse.c: (gst_ogg_parse_new_stream),
+ (gst_ogg_parse_chain):
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_stream_header):
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_setup),
+ (gst_vorbis_enc_buffer_check_discontinuous):
+ * ext/vorbis/vorbisparse.c: (vorbis_parse_src_query):
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_handle_track_seek):
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_push_full):
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push):
+ * gst/audioresample/resample.c: (resample_input_pushthrough):
+ * gst/playback/gstplaybasebin.c: (queue_out_of_data):
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_handle_clients):
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset),
+ (wavpack_type_find):
+ * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_create):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new):
+ * tests/check/elements/volume.c: (GST_START_TEST):
+ Printf format fixes.
+
+2006-10-04 13:18:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gsttcp.c: Fix a simple mistake (see the docs)
+ Original commit message from CVS:
+ * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_caps):
+ Fix a simple mistake (see the docs)
+ Fixes #359580
+
+2006-10-04 13:15:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ bump version
+ Original commit message from CVS:
+ bump version
+
+2006-10-03 12:11:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/plugins/: Add vorbistag element to docs; update version numbers to 0.10.10.1.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Add vorbistag element to docs; update version numbers to 0.10.10.1.
+
+2006-10-03 11:51:48 +0000 James Doc Livingston <doclivingston@gmail.com>
+
+ ext/vorbis/: Add new vorbistag element which derives from vorbisparse and is essentially the same as well, only that ...
+ Original commit message from CVS:
+ Patch by: James "Doc" Livingston <doclivingston at gmail com>
+ * ext/vorbis/Makefile.am:
+ * ext/vorbis/vorbis.c: (plugin_init):
+ * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_class_init),
+ (vorbis_parse_parse_packet), (vorbis_parse_chain):
+ * ext/vorbis/vorbisparse.h:
+ * ext/vorbis/vorbistag.c: (gst_vorbis_tag_base_init),
+ (gst_vorbis_tag_class_init), (gst_vorbis_tag_init),
+ (gst_vorbis_tag_parse_packet):
+ * ext/vorbis/vorbistag.h:
+ Add new vorbistag element which derives from vorbisparse
+ and is essentially the same as well, only that it implements
+ the GstTagSetter interface and can modify the stream's
+ vorbiscomment on the fly (#335635).
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/vorbistag.c: (setup_vorbistag),
+ (cleanup_vorbistag), (buffer_probe), (start_pipeline),
+ (get_buffer), (stop_pipeline), (_create_codebook_header_buffer),
+ (_create_audio_buffer), (GST_START_TEST), (vorbistag_suite):
+ Add unit test for new vorbistag element.
+
+2006-10-03 10:36:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/vorbis/vorbisparse.c: Set BOS flag in packet structure to fix 'jump depends on unitialized value' errors in valgr...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_init),
+ (vorbis_parse_push_headers), (vorbis_parse_chain):
+ Set BOS flag in packet structure to fix 'jump depends
+ on unitialized value' errors in valgrind; various minor
+ clean-ups.
+
+2006-09-30 15:30:07 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: Fix typo in a debug statement.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (close_pad_link):
+ Fix typo in a debug statement.
+ * gst/playback/gstplaybasebin.c: (probe_triggered),
+ (new_decoded_pad_full), (new_decoded_pad), (subs_new_decoded_pad),
+ (gen_source_element), (source_new_pad), (analyse_source),
+ (setup_source):
+ When handling no_more_pads in new_decoded_pad, make sure to treat
+ subtitle pads correctly. Fixes playback with subtitle files.
+ Move a recurring message to LOG level.
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support):
+ The maximum value for the Xv colorkey on this Radeon is 0xFFFFFFFF,
+ which ends up as -1 when cast to an int. Make the logic handle the
+ max value as an unsigned mask and only change the colorkey when it's
+ a value we recognise.
+
+2006-09-30 00:14:20 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Removed empty * between paragraphs
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ Removed empty * between paragraphs
+
+2006-09-29 23:50:53 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/: Moved some documentation into .c file
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/README:
+ Moved some documentation into .c file
+
+2006-09-29 17:35:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Fix compilation.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (no_more_pads):
+ Fix compilation.
+
+2006-09-29 16:04:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Remove g_print
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (new_caps):
+ Remove g_print
+ * gst/playback/gstplaybin.c:
+ Add some docs.
+
+2006-09-29 15:16:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Re-enable cddabasesrc test to see if it works again now.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Re-enable cddabasesrc test to see if it works again
+ now.
+
+2006-09-29 13:46:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Handle invalid URIs a bit more gracefully.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_subtitle),
+ (gen_source_element):
+ Handle invalid URIs a bit more gracefully.
+
+2006-09-29 12:54:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/oggmux.c: Remove obsolete comment.
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c:
+ Remove obsolete comment.
+
+2006-09-29 10:43:05 +0000 James Doc Livingston <doclivingston@gmail.com>
+
+ ext/ogg/gstoggmux.c: Commit patch from James "Doc" Livingston, adds proper EOS handling in oggmux. GStreamer can, for...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_request_new_pad),
+ (gst_ogg_mux_release_pad), (gst_ogg_mux_push_buffer),
+ (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads),
+ (gst_ogg_mux_send_headers), (gst_ogg_mux_process_best_pad),
+ (gst_ogg_mux_collected):
+ Commit patch from James "Doc" Livingston, adds proper EOS handling
+ in oggmux. GStreamer can, for the first time ever, create a valid
+ Ogg file! Yay!
+ * tests/check/pipelines/oggmux.c: (check_chain_final_state),
+ (oggmux_suite):
+ Reenable tests now that they pass.
+
+2006-09-29 08:20:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.c: Stop reading commands when EOF (we read 0) as well.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_handle_clients):
+ Stop reading commands when EOF (we read 0) as well.
+
+2006-09-28 15:29:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Implement delayed caps linking needed for element with a lot of different caps on the sr...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (dynamic_create), (dynamic_free),
+ (close_pad_link), (dynamic_remove), (no_more_pads), (new_caps),
+ (find_dynamic), (unlinked), (close_link):
+ Implement delayed caps linking needed for element with a lot of
+ different caps on the src pads that get fixed at runtime.
+ Improve management of dynamic elements.
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init),
+ (group_destroy), (group_commit), (check_queue), (queue_overrun),
+ (gen_preroll_element), (remove_groups), (unknown_type),
+ (add_element_stream), (no_more_pads_full), (no_more_pads),
+ (sub_no_more_pads), (source_no_more_pads), (preroll_unlinked),
+ (new_decoded_pad), (setup_subtitle), (array_has_value),
+ (gen_source_element), (source_new_pad), (has_all_raw_caps),
+ (analyse_source), (remove_decoders), (make_decoder),
+ (remove_source), (setup_source), (finish_source), (prepare_output),
+ (gst_play_base_bin_change_state):
+ * gst/playback/gstplaybasebin.h:
+ Use more _CAST instead of full type checking casts.
+ Small cleanups, plug some leaks.
+ Handle dynamic sources.
+ Add some helper functions to create lists of strings used for
+ blacklisting and other stuff.
+ Refactor some code dealing with analysing the source.
+ Re-enable sources without pads (like cd:// or other selfcontained
+ elements).
+
+2006-09-28 15:08:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: When we have a timestamp, we can still perform clipping.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ When we have a timestamp, we can still perform clipping.
+ When we have no clock, we must play the sample ASAP.
+
+2006-09-28 11:46:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiorate/gstaudiorate.c: Set caps on outgoing buffers.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ Set caps on outgoing buffers.
+ * gst/videorate/gstvideorate.c: (gst_video_rate_flush_prev),
+ (gst_video_rate_event), (gst_video_rate_chain):
+ * gst/videorate/gstvideorate.h:
+ Fix videorate some more. Fixes #357977
+
+2006-09-28 11:34:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/adder.c: Don't set timeout to 6 seconds when we're running in valgrind ... (and how is 6 seconds...
+ Original commit message from CVS:
+ * tests/check/elements/adder.c: (adder_suite):
+ Don't set timeout to 6 seconds when we're running
+ in valgrind ... (and how is 6 seconds longer than
+ the default anyway?)
+
+2006-09-28 10:49:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiorate/gstaudiorate.c: Keep sink and src segment to keep track of time and support more input formats.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_reset),
+ (gst_audio_rate_sink_event), (gst_audio_rate_convert),
+ (gst_audio_rate_convert_segments), (gst_audio_rate_chain):
+ Keep sink and src segment to keep track of time and support more
+ input formats.
+ Fix bogus next_offset and run_time calculation, don't understand how
+ this could have worked before. Fixes #357976.
+ Remove some unneeded vars.
+
+2006-09-28 09:41:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Only remove visualisation from visbin if there is a visbin (or: don't throw warnings when ...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (remove_sinks):
+ Only remove visualisation from visbin if there is a visbin (or:
+ don't throw warnings when closing totem without playing a file).
+
+2006-09-27 13:52:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Add some more info in a WARNING.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ Add some more info in a WARNING.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_create):
+ Handle PAUSE in create function, use new -core addition to
+ wait for playing. Fixes pausing and resuming capture from an
+ audiosrc.
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_commit),
+ (gst_ring_buffer_read):
+ Constify some more.
+ Caller supports interrupted reads now.
+
+2006-09-27 13:29:49 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ add new header file to spec
+ Original commit message from CVS:
+ add new header file to spec
+
+2006-09-27 12:55:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Another attempt to make the gen64 buildbot happy.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Another attempt to make the gen64 buildbot happy.
+
+2006-09-27 11:58:17 +0000 Jonathan Matthew <jonathan@kaolin.wh9.net>
+
+ ext/libvisual/visual.c: Libvisual plugin was not passing audio data to libvisual 0.4.0 correctly. Fixes #357800
+ Original commit message from CVS:
+ Patch by: Jonathan Matthew <jonathan@kaolin.wh9.net>
+ * ext/libvisual/visual.c: (gst_visual_clear_actors),
+ (gst_visual_chain), (gst_visual_change_state):
+ Libvisual plugin was not passing audio data to libvisual 0.4.0
+ correctly. Fixes #357800
+
+2006-09-27 11:31:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/simple-launch-lines.c: Add timeout to _get_state() so we see which pipeline it is that causes t...
+ Original commit message from CVS:
+ * tests/check/pipelines/simple-launch-lines.c: (run_pipeline):
+ Add timeout to _get_state() so we see which pipeline it is
+ that causes trouble on the gen64 build bot.
+
+2006-09-27 11:06:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: the source pad always uses fixed caps.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_init), (gst_base_rtp_depayload_push_full),
+ (gst_base_rtp_depayload_push_ts), (gst_base_rtp_depayload_process),
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ the source pad always uses fixed caps.
+
+2006-09-27 11:05:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added docs for the audio libs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/gstaudioclock.c:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosink.h:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Added docs for the audio libs.
+
+2006-09-27 10:59:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Temporarily disable test that fails on the bots for unknown reasons.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Temporarily disable test that fails on the bots for unknown reasons.
+
+2006-09-27 00:13:29 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.*: Moved AudioCodecType into priv
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ Moved AudioCodecType into priv
+ Renamed all gst_basertpaudiopayload to gst_base_rtp_audio_payload prefixes
+
+2006-09-25 15:47:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Cleanups and small leak fixes.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter),
+ (add_fakesink), (remove_fakesink), (pad_probe), (close_pad_link),
+ (is_demuxer_element), (try_to_link_1), (get_our_ghost_pad),
+ (new_pad):
+ Cleanups and small leak fixes.
+ Added Depayloaders to valid list of autopluggable elements.
+
+2006-09-25 13:24:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin.c: Detect NO_PREROLL state change returns and disable clock distribution to the sinks so that...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init),
+ (gst_play_bin_vis_blocked), (gst_play_bin_set_property),
+ (gen_video_element), (gen_text_element), (gen_audio_element),
+ (gen_vis_element), (remove_sinks), (add_sink), (setup_sinks),
+ (gst_play_bin_set_clock_func), (gst_play_bin_change_state):
+ Detect NO_PREROLL state change returns and disable clock distribution to
+ the sinks so that sync is disabled.
+ Avoid some type checking and do simple casts instead.
+ Small cleanups, fix some FIXMEs.
+ Be more robust when linking user specified elements, catch an report
+ errors. Fixes #357404.
+ Fix some leaks in the error paths.
+
+2006-09-25 12:55:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ ChangeLog surgery for missing bug-number
+ Original commit message from CVS:
+ ChangeLog surgery for missing bug-number
+
+2006-09-25 11:28:15 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/playback/test.c: Fix compilation with uClibc and -Werror (#357591).
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/playback/test.c:
+ Fix compilation with uClibc and -Werror (#357591).
+
+2006-09-25 10:21:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Parse dates that are followed by a time as well (#357532).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ Parse dates that are followed by a time as well (#357532).
+ * tests/check/libs/tag.c: (test_vorbis_tags):
+ Add unit test for this.
+
+2006-09-23 15:24:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: A few array const-ifications.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (make_lossless_changes),
+ (gst_audio_convert_transform_caps):
+ * gst/videotestsrc/videotestsrc.c: (gst_video_test_src_unicolor):
+ * gst/videotestsrc/videotestsrc.h:
+ A few array const-ifications.
+
+2006-09-23 15:02:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: See if this makes the build bots happy.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ See if this makes the build bots happy.
+ * tests/check/libs/cddabasesrc.c:
+ UTF8-ise my name.
+
+2006-09-23 14:30:53 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: More case-insensitivity for certain tags; recognise entities with decimal codes as special ...
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian dot net>
+ * gst/subparse/samiparse.c: (handle_start_font),
+ (fix_invalid_entities):
+ More case-insensitivity for certain tags; recognise entities with
+ decimal codes as special entities as well (#357330).
+
+2006-09-23 13:32:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/Makefile.am: Need to build tag directory before cdda.
+ Original commit message from CVS:
+ * gst-libs/gst/Makefile.am:
+ Need to build tag directory before cdda.
+
+2006-09-23 13:21:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Move GST_TAG_CDDA_* tags into libgsttag and make libgstcddabasesrc depend on libgsttag. This is required so we can ex...
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_base_init):
+ * gst-libs/gst/cdda/gstcddabasesrc.h:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c: (gst_tag_register_tags_internal),
+ (gst_tag_register_musicbrainz_tags):
+ Move GST_TAG_CDDA_* tags into libgsttag and make libgstcddabasesrc
+ depend on libgsttag. This is required so we can extract/read tags like
+ DISCID without depending on libgstcddabasesrc (which used to register
+ them).
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Add vorbiscomment mapping for CDDB_DISCID and MUSICBRAINZ_DISCID
+ tags (also see #347848).
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_metadata_set1):
+ Log vorbis comments we are actually writing. Const-ify array.
+
+2006-09-23 08:53:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Improve buffering a bit by avoiding a deadlock because we cannot assume the underrun i...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gen_preroll_element):
+ Improve buffering a bit by avoiding a deadlock because we cannot assume
+ the underrun is always called.
+
+2006-09-23 08:51:14 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst-libs/gst/riff/: Added MPEG-4 AAC and id and caps. Fixes #357289
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian dot net>
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Added MPEG-4 AAC and id and caps. Fixes #357289
+ Added WMA9 Lossless id.
+
+2006-09-22 14:50:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Fix misleading docs addition.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Fix misleading docs addition.
+ * tests/check/elements/videotestsrc.c: (check_rgb_buf):
+ Get rid of compiler warning the right way.
+
+2006-09-22 14:13:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Small cleanups.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_finalize),
+ (gst_base_rtp_depayload_setcaps), (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_push_full),
+ (gst_base_rtp_depayload_push_ts), (gst_base_rtp_depayload_push),
+ (gst_base_rtp_depayload_process),
+ (gst_base_rtp_depayload_set_gst_timestamp),
+ (gst_base_rtp_depayload_queue_release):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Small cleanups.
+ Fix some leaks.
+ Refactored the process method and added methods to push from the process
+ vmethod.
+ Use _scale functions.
+ API: gst_base_rtp_depayload_push_ts
+ API: gst_base_rtp_depayload_push
+ * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push):
+ timestamps are uint.
+
+2006-09-22 11:59:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/interfaces/xoverlay.c: Remove unused statement from doc example.
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ Remove unused statement from doc example.
+
+2006-09-22 09:52:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/videorate/gstvideorate.c:
+ update docs
+ Original commit message from CVS:
+ update docs
+
+2006-09-21 13:49:47 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/interfaces/videoorientation.c: Add since tags to new API docs, ChangeLog surgery (forgot API keyword in ...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/videoorientation.c:
+ (gst_video_orientation_iface_init),
+ (gst_video_orientation_get_hflip),
+ (gst_video_orientation_get_vflip),
+ (gst_video_orientation_get_hcenter),
+ (gst_video_orientation_get_vcenter),
+ (gst_video_orientation_set_hflip),
+ (gst_video_orientation_set_vflip),
+ (gst_video_orientation_set_hcenter),
+ (gst_video_orientation_set_vcenter):
+ Add since tags to new API docs, ChangeLog surgery (forgot API keyword
+ in ChangeLog)
+
+2006-09-21 09:27:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: but disable for now since it doesn't pass (something wrong with
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/ffmpegcolorspace.c: (rgb_format_to_caps),
+ (create_rgb_conversions), (rgb_conversion_free),
+ (right_shift_colour), (fix_expected_colour), (check_rgb_buf),
+ (got_buf_cb), (GST_START_TEST), (ffmpegcolorspace_suite):
+ Add unit test for ffmpegcolorspace (RGB <=> RGB only so far),
+ but disable for now since it doesn't pass (something wrong with
+ RGBA somewhere).
+
+2006-09-21 07:01:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Refactor handling of overrun detection.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (group_commit),
+ (queue_deadlock_check), (queue_overrun), (queue_threshold_reached),
+ (queue_out_of_data), (gen_preroll_element),
+ (preroll_remove_overrun), (probe_triggered):
+ Refactor handling of overrun detection.
+ Separate handling of group completion and deadlock detection when doing
+ network buffering. This should fix some deadlocks that were not detected
+ because the group was completed.
+ Add more comments, improve debugging.
+
+2006-09-21 05:31:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Some more compilation fixes.
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (GST_START_TEST):
+ * tests/check/libs/audio.c:
+ Some more compilation fixes.
+
+2006-09-21 05:12:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Early morning compilation fix.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_samples_done), (gst_ring_buffer_commit),
+ (gst_ring_buffer_read):
+ Early morning compilation fix.
+
+2006-09-20 18:09:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ bump nano
+ Original commit message from CVS:
+ bump nano
+
+2006-09-20 17:04:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Fix some warnings.
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (GST_START_TEST):
+ * tests/check/elements/multifdsink.c: (GST_START_TEST):
+ * tests/check/elements/videorate.c: (GST_START_TEST):
+ * tests/check/libs/cddabasesrc.c: (GST_START_TEST):
+ * tests/check/pipelines/oggmux.c: (eos_buffer_probe):
+ Fix some warnings.
+
+2006-09-20 10:59:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: change colorkey behaviour back according to #354773 comment 6/7
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support),
+ (gst_xvimagesink_get_times):
+ change colorkey behaviour back according to #354773 comment 6/7
+
+2006-09-20 10:42:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: remove junk
+ Original commit message from CVS:
+ ChangeLog surgery: remove junk
+
+2006-09-19 11:31:06 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.*: Implement stubbed out properties unit-type, units-soft-max, units-max, to allow specifying ...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type),
+ (gst_multi_fd_sink_class_init), (get_buffers_max), (find_limits),
+ (gst_multi_fd_sink_recover_client),
+ (gst_multi_fd_sink_queue_buffer), (gst_multi_fd_sink_set_property),
+ (gst_multi_fd_sink_get_property):
+ * gst/tcp/gstmultifdsink.h:
+ Implement stubbed out properties unit-type, units-soft-max,
+ units-max, to allow specifying maximum sizes in units other than
+ buffers.
+ Fixes #355935
+
+2006-09-19 10:23:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-media.c: Reorder the audio formats a bit for clarity.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Reorder the audio formats a bit for clarity.
+ Detect and create caps for MSGSM and MSN (WAV49).
+ Fixes #356596.
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_get_xv_support), (gst_xvimagesink_show_frame):
+ Small cleanups, move error handling out of normal flow for clarity.
+
+2006-09-18 15:59:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add new interface to control video orientation (fixes #354908)
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs.types:
+ * gst-libs/gst/interfaces/Makefile.am:
+ * gst-libs/gst/interfaces/videoorientation.c:
+ (gst_video_orientation_get_type),
+ (gst_video_orientation_iface_init),
+ (gst_video_orientation_get_hflip),
+ (gst_video_orientation_get_vflip),
+ (gst_video_orientation_get_hcenter),
+ (gst_video_orientation_get_vcenter),
+ (gst_video_orientation_set_hflip),
+ (gst_video_orientation_set_vflip),
+ (gst_video_orientation_set_hcenter),
+ (gst_video_orientation_set_vcenter):
+ * gst-libs/gst/interfaces/videoorientation.h:
+ Add new interface to control video orientation (fixes #354908)
+
+2006-09-18 15:48:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/videotestsrc/gstvideotestsrc.c: Use G_UNLIKELY in _create and log one more detail.
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ Use G_UNLIKELY in _create and log one more detail.
+ (gst_video_test_src_get_times), (gst_video_test_src_create):
+ * sys/ximage/ximagesink.c: (gst_ximagesink_get_times):
+ Use gst_util_uint64_scale_int in _get_times().
+
+2006-09-18 15:00:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support)
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support)
+ Give better warning message (add object and detail).
+
+2006-09-18 14:42:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ sys/xvimage/xvimagesink.c: xvimage assumed that XV_COLORKEY can be set in RGB888 format (fixes #354773), use gst_util...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support),
+ (gst_xvimagesink_get_times):
+ xvimage assumed that XV_COLORKEY can be set in RGB888 format (fixes
+ #354773), use gst_util_uint64_scale_int in _get_times()
+
+2006-09-18 14:21:45 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggmux.c: Timestamps are unsigned; comparision against GST_CLOCK_TIME_NONE was always true, leading to dro...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_push_buffer):
+ Timestamps are unsigned; comparision against GST_CLOCK_TIME_NONE was
+ always true, leading to dropping all timestamps.
+
+2006-09-18 11:40:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/libvisual/visual.c: update to work also with libvisual 0.4 API
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_vis_src_negotiate),
+ (gst_visual_chain), (gst_visual_change_state):
+ update to work also with libvisual 0.4 API
+ * tools/gst-launch-ext.1.in:
+ * tools/gst-visualise.1.in:
+ remove references to old man-pages
+ * tests/examples/seek/seek.c: (main):
+ add real meadi-buttons, add tool-tips for the seek-options, arrange
+ seek options in a table
+
+2006-09-18 10:57:28 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggmux.c: Don't generate out-of-order timestamps from oggmux, instead clamp output timestamps to be >= the...
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_clear),
+ (gst_ogg_mux_push_buffer):
+ Don't generate out-of-order timestamps from oggmux, instead clamp
+ output timestamps to be >= the previously output ts.
+ Fixes #355595
+
+2006-09-18 10:18:22 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.c: Updates, fixes, and typo corrections for multifdsink. No functional changes.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type),
+ (gst_multi_fd_sink_class_init):
+ Updates, fixes, and typo corrections for multifdsink. No functional
+ changes.
+
+2006-09-17 21:58:06 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/typefind/gsttypefindfunctions.c: Don't crash on truncated files - check that we got an 8 byte buffer before tryin...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find):
+ Don't crash on truncated files - check that we got an 8 byte buffer
+ before trying to memcmp it.
+
+2006-09-17 20:32:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Make stream-switching appear instant to the application (ie. make sure that a g_object...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (get_active_source):
+ Make stream-switching appear instant to the application
+ (ie. make sure that a g_object_get on 'current-foo' returns
+ the stream previously set with g_object_set(). Totem needs
+ this to update stream-related meta-info (like audio-codec)
+ correctly when switching streams.
+
+2006-09-17 20:14:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsamixer.c: Try harder to guess which mixer track is the master mixer track (instead of just taking the ...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_find_master_mixer),
+ (gst_alsa_mixer_ensure_track_list):
+ Try harder to guess which mixer track is the master mixer
+ track (instead of just taking the first one that has a pvolume).
+ Fixes #342228.
+
+2006-09-17 11:24:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/gstaudioconvert.c: Get structure-name just once.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (set_structure_widths),
+ (gst_audio_convert_transform_caps):
+ Get structure-name just once.
+
+2006-09-16 22:30:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/: Fix big batch of compiler warnings.
+ Original commit message from CVS:
+ * tests/check/elements/audioresample.c: (GST_START_TEST):
+ * tests/check/elements/videotestsrc.c: (check_rgb_buf):
+ * tests/check/elements/volume.c: (GST_START_TEST):
+ * tests/check/elements/vorbisdec.c: (GST_START_TEST):
+ * tests/check/pipelines/oggmux.c: (validate_ogg_page), (eos_watch),
+ (test_pipeline), (GST_START_TEST):
+ * tests/check/pipelines/theoraenc.c: (GST_START_TEST):
+ * tests/check/pipelines/vorbisenc.c: (GST_START_TEST):
+ Fix big batch of compiler warnings.
+
+2006-09-16 21:54:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Add docs about icydemux usage in connection with gnomevfssrc
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Add docs about icydemux usage in connection with gnomevfssrc
+ * ext/libvisual/visual.c:
+ * ext/ogg/gstoggaviparse.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst/audiorate/gstaudiorate.c:
+ More G_OBJECT macro fixing.
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Fix wrong info in header due to copy & paste
+
+2006-09-15 14:53:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/: Do the delay calculation in the source/sink base classes as this is specific for the capture/pla...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_get_time), (gst_base_audio_sink_callback):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_get_time), (gst_base_audio_src_fixate),
+ (gst_base_audio_src_get_times), (gst_base_audio_src_get_offset),
+ (gst_base_audio_src_create), (gst_base_audio_src_change_state):
+ Do the delay calculation in the source/sink base classes as this is
+ specific for the capture/playback mode.
+ Try to fixate a bit better, like round depth up to a multiple of 8
+ bigger than width.
+ Handle underruns correctly by marking DISCONT on buffers and adjusting
+ timestamps to handle the gap.
+ Set offset/offset_end correctly on buffers.
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_pause),
+ (gst_ring_buffer_samples_done), (gst_ring_buffer_commit),
+ (gst_ring_buffer_read):
+ Remove resync and underrun recovery from the ringbuffer.
+ Fix ringbuffer read code on under/overrun.
+
+2006-09-15 11:17:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.*: Don't use a 0 low watermark when buffering, it is catching starvation way too late. In...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (gst_play_base_bin_init), (fill_buffer), (check_queue),
+ (queue_threshold_reached), (gst_play_base_bin_set_property),
+ (gst_play_base_bin_get_property):
+ * gst/playback/gstplaybasebin.h:
+ Don't use a 0 low watermark when buffering, it is catching starvation
+ way too late. Instead, use a 3 second queue with 30 and 95
+ percent low/high watermarks.
+ Added queue-min-threshold property to configure low watermark.
+ Use new _buffering message API.
+ Make queue_threshold variable big enough to store a uint64 time value.
+ API: playbin::queue-min-threshold property.
+
+2006-09-15 09:13:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ configure.ac: We require 0.10.10.1 now because of _wait_preroll().
+ Original commit message from CVS:
+ * configure.ac:
+ We require 0.10.10.1 now because of _wait_preroll().
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ Use gst_base_sink_wait_preroll().
+
+2006-09-15 09:09:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/: Use DEBUG_OBJECT more.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (xrun_recovery), (gst_alsasink_write):
+ * ext/alsa/gstalsasrc.c: (xrun_recovery), (gst_alsasrc_read):
+ Use DEBUG_OBJECT more.
+
+=== release 0.10.10 ===
+
+2006-09-14 20:09:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * common:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * ext/theora/theoraparse.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst/playback/gstplaybin.c:
+ * tests/check/Makefile.am:
+ * win32/common/config.h:
+ releasing 0.10.10
+ Original commit message from CVS:
+ releasing 0.10.10
+
+2006-09-09 16:08:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ second prerelease
+ Original commit message from CVS:
+ second prerelease
+
+2006-09-07 19:01:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ update bug in changelog
+ Original commit message from CVS:
+ update bug in changelog
+
+2006-09-07 19:00:33 +0000 Michael Smith <msmith@fluendo.com>
+
+ Fix implementation of sync-method 'next-keyframe'
+ Original commit message from CVS:
+ patch by: Michael Smith <msmith at fluendo dot com>
+ * gst/tcp/gstmultifdsink.c: (is_sync_frame),
+ (gst_multi_fd_sink_client_queue_buffer),
+ (gst_multi_fd_sink_new_client):
+ * tests/check/elements/multifdsink.c: (GST_START_TEST),
+ (multifdsink_suite):
+ Fix implementation of sync-method 'next-keyframe'
+
+2006-09-07 15:00:08 +0000 Wim Taymans <wim@fluendo.com>
+
+ ext/gnomevfs/gstgnomevfssrc.c: This patch removes the RANDOM flag that was incorrectly introduced with revision 1.91....
+ Original commit message from CVS:
+ patch by: Wim Taymans <wim at fluendo dot com>
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_start):
+ This patch removes the RANDOM flag that was incorrectly introduced with
+ revision 1.91. Fixes #354590
+
+2006-09-07 14:56:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ first prerelease
+ Original commit message from CVS:
+ first prerelease
+
+2006-09-07 14:56:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * 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-09-05 09:12:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Random variation in Makefile line to see if it makes the gen64-base-full bot any happier.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Random variation in Makefile line to see if it makes the
+ gen64-base-full bot any happier.
+
+2006-09-04 19:04:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/oggmux.c: Disable test that fails at the moment (killed after timeout).
+ Original commit message from CVS:
+ * tests/check/pipelines/oggmux.c: (oggmux_suite):
+ Disable test that fails at the moment (killed after timeout).
+
+2006-09-04 18:19:06 +0000 James Livingston <doclivingston@gmail.com>
+
+ tests/check/: Add simple unit test for oggmux from #337026 with checking for the
+ Original commit message from CVS:
+ Patch by: James Livingston <doclivingston at gmail.com>
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/.cvsignore:
+ * tests/check/pipelines/oggmux.c: (get_page_codec),
+ (check_chain_final_state), (fail_if_audio), (validate_ogg_page),
+ (eos_buffer_probe), (start_pipeline), (stop_pipeline), (eos_watch),
+ (test_pipeline), (test_vorbis), (test_theora), (test_vorbis_theora),
+ (test_theora_vorbis), (oggmux_suite):
+ Add simple unit test for oggmux from #337026 with checking for the
+ EOS flags disabled for the time being.
+
+2006-09-04 09:13:01 +0000 Alessandro Dessina <alessandro@nnva.org>
+
+ ext/ogg/gstoggmux.c: Add cmml caps to oggmux. Fixes #353912
+ Original commit message from CVS:
+ patch by: Alessandro Dessina <alessandro nnva org>
+ * ext/ogg/gstoggmux.c:
+ Add cmml caps to oggmux. Fixes #353912
+
+2006-09-02 13:20:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/videotestsrc.c: Returning a return value often helps. In this case, we don't need the return val...
+ Original commit message from CVS:
+ * tests/check/elements/videotestsrc.c: (check_rgb_buf):
+ Returning a return value often helps. In this case, we
+ don't need the return value anyway, so just get rid of it.
+ Should make build bots much happier.
+
+2006-09-02 12:59:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/videotestsrc.*: Add support for AYUV and the various RGBA formats. Initialise fields of paintinfo st...
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c: (paintinfo_find_by_structure),
+ (paint_get_structure), (gst_video_test_src_get_size),
+ (gst_video_test_src_smpte), (gst_video_test_src_snow),
+ (gst_video_test_src_unicolor), (paint_setup_AYUV),
+ (paint_hline_AYUV), (paint_setup_ARGB8888), (paint_setup_ABGR8888),
+ (paint_setup_RGBA8888), (paint_setup_BGRA8888), (paint_hline_str4):
+ * gst/videotestsrc/videotestsrc.h:
+ Add support for AYUV and the various RGBA formats. Initialise
+ fields of paintinfo structs allocated on the stack.
+ * tests/check/elements/videotestsrc.c: (right_shift_colour),
+ (fix_expected_colour), (check_rgb_buf), (got_buf_cb),
+ (GST_START_TEST), (videotestsrc_suite):
+ Add unit tests for videotestsrc's RGB output.
+
+2006-09-01 16:12:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/: Add more uni-colour patterns ("white", "red", "green", and "blue").
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_pattern_get_type),
+ (gst_video_test_src_set_pattern):
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.c: (gst_video_test_src_unicolor),
+ (gst_video_test_src_black), (gst_video_test_src_white),
+ (gst_video_test_src_red), (gst_video_test_src_green),
+ (gst_video_test_src_blue):
+ * gst/videotestsrc/videotestsrc.h:
+ Add more uni-colour patterns ("white", "red", "green", and "blue").
+
+2006-09-01 10:07:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/videotestsrc.c: Fix stride for YVYU, should be word-aligned (#353658).
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.c: (paint_setup_YVYU):
+ Fix stride for YVYU, should be word-aligned (#353658).
+
+2006-08-31 14:37:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/adder/gstadder.c: Fix build.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_src_event):
+ Fix build.
+
+2006-08-31 12:39:17 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/adder/gstadder.*: Remember the start position asked in the incoming seeks, so we can output GST_EVENT_NEW_SEGMENT...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (forward_event_func),
+ (gst_adder_src_event), (gst_adder_collected),
+ (gst_adder_change_state):
+ * gst/adder/gstadder.h:
+ Remember the start position asked in the incoming seeks, so we can
+ output GST_EVENT_NEW_SEGMENT with a correct position value (instead
+ of assuming it will always be 0).
+
+2006-08-31 12:31:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/ogg/gstoggdemux.c: Send the GST_EVENT_NEW_SEGMENT from the streaming thread.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init),
+ (gst_ogg_demux_finalize), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_loop):
+ Send the GST_EVENT_NEW_SEGMENT from the streaming thread.
+
+2006-08-30 17:22:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/ffmpegcolorspace/gstffmpegcolorspace.c: Return FALSE instead of returning a random false unit size when the forma...
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_get_unit_size):
+ Return FALSE instead of returning a random false unit
+ size when the format isn't known/supported (even if
+ this shouldn't happen under normal circumstances).
+
+2006-08-29 15:23:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Try harder to get the size from a uri by using _info_uri() when _info_from_handle() do...
+ Original commit message from CVS:
+ Patch by: Tim-Philipp Müller <tim at centricular dot net>
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_create),
+ (gst_gnome_vfs_src_start):
+ Try harder to get the size from a uri by using _info_uri() when
+ _info_from_handle() does not give us enough info.
+ Also follow symlinks when getting the size.
+ Partially Fixes #332864.
+
+2006-08-29 11:50:51 +0000 Viktor Peters <viktor.peters@gmail.com>
+
+ ext/alsa/: Improve and fix mixer track handling, in particular better handling of alsa's pvolume/pswitch/cvolume/cswi...
+ Original commit message from CVS:
+ Patch by: Viktor Peters <viktor dot peters at gmail dot com>
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_ensure_track_list),
+ (gst_alsa_mixer_update), (gst_alsa_mixer_get_volume),
+ (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute),
+ (gst_alsa_mixer_set_record):
+ * ext/alsa/gstalsamixertrack.c:
+ (gst_alsa_mixer_track_update_alsa_capabilities),
+ (alsa_track_has_cap), (gst_alsa_mixer_track_new),
+ (gst_alsa_mixer_track_update):
+ * ext/alsa/gstalsamixertrack.h:
+ Improve and fix mixer track handling, in particular better handling
+ of alsa's pvolume/pswitch/cvolume/cswitch capabilities; create separate
+ track objects for tracks that have both capture and playback volume
+ (and label them differently as well so they're not mistakenly
+ assumed to be duplicates); classify mixer tracks that only affect
+ the audible volume of something (rather than the capture volume)
+ as playback tracks. Redefine/fix meaning of RECORD and MUTE flags
+ for capture tracks to correspond to alsa-pswitch alsa-cswitch
+ (following the meaning documented in the mixer interface header
+ file); add support for alsa's exclusive cswitch groups; update/sync
+ state/flags better if mixer settings are changed by another
+ application. Fixes #336075.
+
+2006-08-29 10:58:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Improve docs: add section about BUFFERING messages sent by playbin.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c:
+ Improve docs: add section about BUFFERING messages sent by playbin.
+
+2006-08-29 10:51:12 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.c: Ignore explicit DISCONT marked on buffers (which is often spurious, particularly when using m...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_push_buffer),
+ (gst_vorbis_enc_buffer_check_discontinuous),
+ (gst_vorbis_enc_chain):
+ Ignore explicit DISCONT marked on buffers (which is often spurious,
+ particularly when using multiple segments), in favour of solely
+ using the timestamps/durations.
+
+2006-08-29 10:32:34 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/audiorate/gstaudiorate.c: Don't rely on incoming buffers offset anymore, since it is completely broken when using...
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain):
+ Don't rely on incoming buffers offset anymore, since it is completely
+ broken when using multiple segments.
+ Instead convert the incoming buffers timestamp to running time, and
+ then convert that value to the offsets.
+ Also inform GstSegment of the last outputted stop position, which is
+ needed if we received several segments with an unknown stop value.
+
+2006-08-29 08:03:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/vorbis/vorbisenc.c: fix buffer unreffing on a header push failure
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_chain):
+ fix buffer unreffing on a header push failure
+
+2006-08-28 16:17:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiorate/gstaudiorate.c: Make the metadata of the buffer writable before changing its flags.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_sink_event),
+ (gst_audio_rate_chain):
+ Make the metadata of the buffer writable before changing its
+ flags.
+
+2006-08-28 16:09:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Fix changelog with bugzilla bug it fixed.
+ Original commit message from CVS:
+ Fix changelog with bugzilla bug it fixed.
+
+2006-08-28 16:08:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audiorate/gstaudiorate.c: Fix audiorate some more.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_reset),
+ (gst_audio_rate_setcaps), (gst_audio_rate_init),
+ (gst_audio_rate_sink_event), (gst_audio_rate_src_event),
+ (gst_audio_rate_chain), (gst_audio_rate_change_state):
+ Fix audiorate some more.
+ Reset and resync counters on flush and READY.
+ Handle the DISCONT flag correctly.
+ Use GstSegment to track position.
+ Fail when not negotiated.
+
+2006-08-25 16:48:28 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.c: Fix spelling.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_render):
+ Fix spelling.
+ Remove accidently included debug line.
+
+2006-08-25 16:39:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.c: Small cleanups.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_render):
+ Small cleanups.
+ If a buffer is received with no caps, make the buffer metadata
+ writable and set the caps, making sure that we don't screw up the
+ refcounts.
+
+2006-08-25 16:19:55 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gdp/gstgdppay.c: Fix memory leaks and misleading debug messages, add a couple of comments.
+ Original commit message from CVS:
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset),
+ (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_chain):
+ Fix memory leaks and misleading debug messages, add a couple of
+ comments.
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_get_stats),
+ (gst_multi_fd_sink_render):
+ Do not use gst_buffer_make_writable() in a basesink render method,
+ as it may incorrectly unref the buffer. Instead, use convoluted
+ dance to avoid copying the buffer except when we need to.
+
+2006-08-25 09:54:56 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.c: Allow very small discontinuities in the timestamps. These we can't do anything useful with an...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c:
+ (gst_vorbis_enc_buffer_check_discontinuous):
+ Allow very small discontinuities in the timestamps. These we can't
+ do anything useful with anyway (because vorbis's timestamps have
+ only sample granularity), and are commonly produced by elements with
+ minor bugs. Allow up to 1/2 a sample out.
+ Fixes #351742.
+
+2006-08-24 11:18:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add a checkbox to enable play scrubbing. Makes it possible to disable normal scrubbing.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (seek_cb), (start_seek), (stop_seek),
+ (play_scrub_toggle_cb), (main):
+ Add a checkbox to enable play scrubbing. Makes it possible to disable
+ normal scrubbing.
+
+2006-08-23 19:37:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/.cvsignore: make buildbot happy
+ Original commit message from CVS:
+ * tests/check/elements/.cvsignore:
+ make buildbot happy
+
+2006-08-23 16:43:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstogmparse.c: Refactor ogm parse, do better input checking, misc. clean-ups.
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_base_init),
+ (gst_ogm_video_parse_base_init), (gst_ogm_text_parse_base_init),
+ (gst_ogm_parse_class_init), (gst_ogm_parse_dispose),
+ (gst_ogm_parse_init), (gst_ogm_audio_parse_init),
+ (gst_ogm_video_parse_init), (gst_ogm_text_parse_init),
+ (gst_ogm_parse_stream_header), (gst_ogm_parse_comment_packet),
+ (gst_ogm_text_parse_strip_trailing_zeroes),
+ (gst_ogm_parse_data_packet), (gst_ogm_parse_chain),
+ (gst_ogm_parse_sink_event), (gst_ogm_parse_change_state):
+ Refactor ogm parse, do better input checking, misc. clean-ups.
+ Cache incoming events and push them once the source pad has
+ been created. Don't pass unterminated strings to sscanf().
+ Strip trailing zeroes from subtitle text output, since they
+ are not valid UTF-8. Don't push vorbiscomment packets on
+ the subtitle text pad. Output perfect streams if possible.
+
+2006-08-23 15:27:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/libs/cddabasesrc.c: Waits for tasks to settle down so that we clean up correctly for valgrind.
+ Original commit message from CVS:
+ * tests/check/libs/cddabasesrc.c: (GST_START_TEST):
+ Waits for tasks to settle down so that we clean up correctly for
+ valgrind.
+
+2006-08-23 15:11:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/tag.c: Unit test fixes: \377 is more likely to fit into 8 bits than \777; actually return return val...
+ Original commit message from CVS:
+ * tests/check/libs/tag.c: (GST_START_TEST), (taglists_are_equal):
+ Unit test fixes: \377 is more likely to fit into 8 bits than \777;
+ actually return return value in taglists_are_equal.
+
+2006-08-23 12:14:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstogmparse.c: Fix crash due to broken bitstream parsing on x86-64: can't make any assumptions about sizeof(s...
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain):
+ Fix crash due to broken bitstream parsing on x86-64: can't make
+ any assumptions about sizeof(struct) due to alignment/packing
+ differences on different architectures. Fixes #351790.
+
+2006-08-22 16:31:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/riff/riff-read.c: Protect public functions against bad input.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk),
+ (gst_riff_parse_chunk), (gst_riff_parse_file_header),
+ (gst_riff_parse_strh), (gst_riff_parse_strf_vids),
+ (gst_riff_parse_strf_auds), (gst_riff_parse_strf_iavs),
+ (gst_riff_parse_info):
+ Protect public functions against bad input.
+ Do some cleanups.
+ Fix documentation.
+
+2006-08-22 15:50:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/: Add voxware audio IDs (even if we can't play it) (#351795).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Add voxware audio IDs (even if we can't play it) (#351795).
+
+2006-08-22 15:11:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Const-ify some arrays and use G_N_ELEMENTS instead of wasting oodles of RAM on termin...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c:
+ (gst_riff_create_video_template_caps),
+ (gst_riff_create_audio_template_caps),
+ (gst_riff_create_iavs_template_caps):
+ Const-ify some arrays and use G_N_ELEMENTS instead
+ of wasting oodles of RAM on terminator bits.
+
+2006-08-22 08:27:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ And the same for _to_vorbiscomment_buffer(): allow id_data_len == 0 for speex.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ (gst_tag_list_to_vorbiscomment_buffer):
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ And the same for _to_vorbiscomment_buffer(): allow
+ id_data_len == 0 for speex.
+
+2006-08-21 19:04:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/README:
+ adding a README
+ Original commit message from CVS:
+ adding a README
+
+2006-08-21 19:01:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Move GDP plugin to -base from -bad. Closes #347783.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/inspect/plugin-gdp.xml:
+ * gst/gdp/Makefile.am:
+ * tests/check/Makefile.am:
+ Move GDP plugin to -base from -bad. Closes #347783.
+
+2006-08-21 18:34:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Allow id_data_len == 0 (needed for vorbis comments in Speex files).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ (gst_tag_list_from_vorbiscomment_buffer):
+ Allow id_data_len == 0 (needed for vorbis comments in Speex files).
+ Also add some checks to make sure we don't memcmp() beyond the end of
+ vorbiscomment buffer if the ID to check for is larger than the buffer.
+ * tests/check/libs/tag.c: (GST_START_TEST):
+ Some more tests for gst_tag_list_from_vorbiscomment_buffer().
+
+2006-08-21 16:39:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/vorbis/vorbisenc.c: Use vorbis comment utility functions from libgsttag instead of re-inventing the wheel (partia...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_metadata_set1),
+ (gst_vorbis_enc_set_metadata):
+ Use vorbis comment utility functions from libgsttag
+ instead of re-inventing the wheel (partially fixes #347091).
+
+2006-08-21 11:42:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/audioconvert.c: Fix leaks. Wait for state transitions that might happen ASYNC, as well as some t...
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (GST_START_TEST):
+ Fix leaks. Wait for state transitions that might happen ASYNC, as well
+ as some that won't.
+
+2006-08-21 10:32:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/: Don't try to GObject scan the netbuffer as it's not a GObject.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ Don't try to GObject scan the netbuffer as it's not a GObject.
+ Fixes #351308.
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ Document GstNetBuffer.
+
+2006-08-21 08:54:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/audioconvert.c: Add testcase for caps-size-explosion
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (GST_START_TEST),
+ (audioconvert_suite):
+ Add testcase for caps-size-explosion
+
+2006-08-20 13:05:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audioconvert/gstaudioconvert.c: Lower debug, use g_assert in _get_unit_size
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c:
+ (gst_audio_convert_get_unit_size), (set_structure_widths):
+ Lower debug, use g_assert in _get_unit_size
+ * gst/audioresample/gstaudioresample.c:
+ (audioresample_get_unit_size):
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_get_unit_size):
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_get_unit_size):
+ use g_assert in _get_unit_size
+
+2006-08-18 21:21:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: fix bug number
+ Original commit message from CVS:
+ ChangeLog surgery: fix bug number
+
+2006-08-18 16:43:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Document GstRTPBuffer.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_set_packet_len),
+ (gst_rtp_buffer_pad_to), (gst_rtp_buffer_get_payload_subbuffer),
+ (gst_rtp_buffer_get_payload_buffer):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Document GstRTPBuffer.
+ Added function to efficiently strip payload headers.
+ API: gst_rtp_buffer_get_payload_subbuffer()
+
+2006-08-17 16:52:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Serialise unknown vorbis comments into GST_TAG_EXTENDED_COMMENT tags and deserialise...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add),
+ (gst_tag_to_vorbis_comments):
+ Serialise unknown vorbis comments into GST_TAG_EXTENDED_COMMENT
+ tags and deserialise them properly as well (#351768).
+ Add some more gtk-doc blurbs and also some g_return_if_fail().
+ * tests/check/libs/tag.c: (GST_START_TEST),
+ (back_to_vorbis_comments), (taglists_are_equal), (tag_suite):
+ More tests.
+
+2006-08-17 15:43:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/: Added ogg-in-avi parser element. Fixes #140139.
+ Original commit message from CVS:
+ * ext/ogg/Makefile.am:
+ * ext/ogg/gstogg.c: (plugin_init):
+ * ext/ogg/gstoggaviparse.c: (gst_ogg_avi_parse_get_type),
+ (gst_ogg_avi_parse_base_init), (gst_ogg_avi_parse_class_init),
+ (gst_ogg_avi_parse_init), (gst_ogg_avi_parse_finalize),
+ (gst_ogg_avi_parse_setcaps), (gst_ogg_avi_parse_event),
+ (gst_ogg_avi_parse_push_packet), (gst_ogg_avi_parse_chain),
+ (gst_ogg_avi_parse_change_state), (gst_ogg_avi_parse_plugin_init):
+ Added ogg-in-avi parser element. Fixes #140139.
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_buffer_from_page):
+ Fixed a bug in oggdemux debug code.
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Recognise Ogg in the AVI extensible wave format.
+
+2006-08-17 10:00:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: Make buffer durations add up (duration should be next_ts-ts for perfect streams)....
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create):
+ Make buffer durations add up (duration should be next_ts-ts for
+ perfect streams). Fixes CD ripping to Ogg/Vorbis with vorbisenc
+ from CVS.
+ * tests/check/libs/cddabasesrc.c: (gst_cd_foo_src_close),
+ (test_buffer_timestamps), (cddabasesrc_suite):
+ Add unit test for the above.
+ * tests/check/Makefile.am:
+ Don't know why cddabasesrc test was in VALGRIND_TO_FIX, remove
+ to see what happens.
+
+2006-08-16 11:38:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/: Avoid setting and using a NULL device name.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_set_property),
+ (gst_alsasink_open):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_set_property),
+ (gst_alsasrc_open):
+ Avoid setting and using a NULL device name.
+ Print more info when we fail to open a device.
+
+2006-08-16 11:28:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_tag_parse_extended_comment() (#351426).
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c: (gst_tag_parse_extended_comment):
+ API: add gst_tag_parse_extended_comment() (#351426).
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/tag.c: (GST_START_TEST), (tag_suite), (main):
+ Add unit test for gst_tag_parse_extended_comment().
+
+2006-08-15 19:20:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/: Fix leak (#351502).
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_get_property):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_property):
+ Fix leak (#351502).
+
+2006-08-15 17:21:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Document playbin.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * gst/playback/gstplaybin.c:
+ Document playbin.
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ Update to CVS version.
+
+2006-08-14 17:54:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Add "connection-speed" property; re-order redirect messages with multiple redirect locatio...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init),
+ (gst_play_bin_set_property), (gst_play_bin_get_property),
+ (value_list_append_structure_list),
+ (gst_play_bin_handle_redirect_message),
+ (gst_play_bin_handle_message):
+ Add "connection-speed" property; re-order redirect messages with
+ multiple redirect locations depending on the minimum bitrate if
+ that information is available and a connection speed is set
+ (#350399).
+
+2006-08-14 11:41:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Update max volume to the same value that the volume element uses.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c:
+ Update max volume to the same value that the volume element uses.
+
+2006-08-14 10:50:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsamixer.c: Less uglyness..
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open):
+ Less uglyness..
+
+2006-08-14 10:49:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Add some more debug info.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_submit_buffer),
+ (gst_ogg_demux_get_next_page), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_read_chain), (gst_ogg_demux_loop):
+ Add some more debug info.
+ Don't crash when a seek failed.
+ Actually return the result of the seek instead of TRUE.
+ Ignore multiple BOS pages with the same serial so that we don't create
+ the same stream multiple times.
+ Post an error when we fail to do the initial seek.
+
+2006-08-13 14:34:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsa.c: Small code cleanup.
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c: (gst_alsa_detect_rates),
+ (gst_alsa_detect_channels), (gst_alsa_probe_supported_formats):
+ Small code cleanup.
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open),
+ (gst_alsa_mixer_new):
+ Remove hack that always set the device to hw:0*.
+ Properly find the card name for whatever device was configured.
+ Do some better debugging.
+ Fixes #350784.
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_set_property),
+ (gst_alsa_mixer_element_change_state):
+ Cleanups.
+ Handle setting of a NULL device name better.
+
+2006-08-11 15:53:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.c: Don't clip float values. Fixes #350900.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c:
+ Don't clip float values. Fixes #350900.
+
+2006-08-11 15:33:17 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/tcp/gsttcp.c: Really fix the build?
+ Original commit message from CVS:
+ 2006-08-11 Andy Wingo <wingo@pobox.com>
+ * gst/tcp/gsttcp.c: Really fix the build?
+
+2006-08-11 15:29:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/tcp/gsttcp.h: For now, always disable deprecation here -- fixes the build.
+ Original commit message from CVS:
+ 2006-08-11 Andy Wingo <wingo@pobox.com>
+ * gst/tcp/gsttcp.h: For now, always disable deprecation here --
+ fixes the build.
+
+2006-08-10 13:01:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/gstaudioconvert.c: Float caps shouldn't have a "signed" field.
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (make_lossless_changes):
+ Float caps shouldn't have a "signed" field.
+
+2006-08-10 08:56:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggdemux.c: Implement SEEKING query in its most basic form, so that we can at least check if we're seekabl...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_src_query):
+ Implement SEEKING query in its most basic form, so that we can
+ at least check if we're seekable or not (#350655).
+
+2006-08-09 14:42:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: The checks here are not even close to anything that would justify MAXIMUM probab...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find):
+ The checks here are not even close to anything that would
+ justify MAXIMUM probability, lowering to POSSIBLE until someone
+ fixes the checks (case at hand: quicktime redirection files
+ might start with 00 00 01 XX and pass the checks here just
+ fine, see #350399).
+
+2006-08-08 13:57:29 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/elements/gdpdepay.c: I forgot to include the file containing the #define :)
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (gdpdepay_suite):
+ I forgot to include the file containing the #define :)
+ Now includes "config.h"
+
+2006-08-08 13:45:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/elements/gdpdepay.c: Ignore test known to fail on PPC64. See #348114.
+ Original commit message from CVS:
+ * tests/check/elements/gdpdepay.c: (gdpdepay_suite):
+ Ignore test known to fail on PPC64. See #348114.
+
+2006-08-08 08:41:13 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/typefind/gsttypefindfunctions.c: Better detection for multipart/x-mixed-replace: accept leading whitespaces befor...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon net>
+ * gst/typefind/gsttypefindfunctions.c: (multipart_type_find):
+ Better detection for multipart/x-mixed-replace: accept leading
+ whitespaces before the boundary marker as well (as our very own
+ multipartmux used to produce) (#349068).
+
+2006-08-07 08:26:03 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst-libs/gst/riff/: Detect DTS audio streams (#350157).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps),
+ (gst_riff_create_audio_template_caps):
+ Detect DTS audio streams (#350157).
+
+2006-08-05 17:08:05 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/gsttheoraparse.h: ext/theora/theoraparse.c (gst_theora_parse_class_init) (theora_parse_dispose, theora_par...
+ Original commit message from CVS:
+ 2006-08-05 Andy Wingo <wingo@pobox.com>
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c (gst_theora_parse_class_init)
+ (theora_parse_dispose, theora_parse_set_property)
+ (theora_parse_get_property, theora_parse_munge_granulepos)
+ (theora_parse_push_buffer, theora_parse_change_state): Add a
+ property 'synchronization-points' to fix badly synchronized oggs.
+
+2006-08-04 13:20:23 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/gdp/gstgdpdepay.c: Fix event parsing by gdpdepay. Fixes #349916.
+ Original commit message from CVS:
+ 2006-08-04 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain):
+ Fix event parsing by gdpdepay. Fixes #349916.
+
+2006-08-03 15:04:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add a few tests for the channel position stuff in libgstaudio.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/audio.c: (structure_contains_channel_positions),
+ (fixed_caps_have_channel_positions), (GST_START_TEST),
+ (audio_suite), (main):
+ Add a few tests for the channel position stuff in libgstaudio.
+
+2006-08-03 14:16:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/: Add support for cards that (only) do more than 8 channels, like the Delta 44 (#345188).
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c: (caps_add_channel_configuration),
+ (gst_alsa_detect_channels):
+ * ext/alsa/gstalsasink.c:
+ Add support for cards that (only) do more than 8 channels,
+ like the Delta 44 (#345188).
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions):
+ * gst-libs/gst/audio/multichannel.h:
+ API: add GST_AUDIO_CHANNEL_POSITION_NONE, which stands for an
+ unspecified channel position and cannot be combined with any
+ of the other audio channel positions; adjust position layout
+ checks accordingly (#345188).
+
+2006-08-03 11:15:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Recognise ancient RealAudio files (see #349779).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Recognise ancient RealAudio files (see #349779).
+
+2006-08-03 09:01:25 +0000 Jens Granseuer <jensgr@gmx.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinder for Interplay's MVE format (#348973).
+ Original commit message from CVS:
+ Patch by: Jens Granseuer <jensgr at gmx net>
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Add typefinder for Interplay's MVE format (#348973).
+
+2006-08-02 17:03:29 +0000 Marcel Moreaux <marcelm@luon.net>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.*: Handle RTP sequence number rollover.
+ Original commit message from CVS:
+ Patch by: Marcel Moreaux <marcelm at luon dot net>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_add_to_queue):
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ Handle RTP sequence number rollover.
+ Disable jitterbuffer by default.
+
+2006-08-02 16:56:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gdp/gstgdpdepay.c: Disable seeking.
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init),
+ (gst_gdp_depay_finalize), (gst_gdp_depay_sink_event),
+ (gst_gdp_depay_src_event), (gst_gdp_depay_chain),
+ (gst_gdp_depay_change_state):
+ Disable seeking.
+ Small cleanups.
+ Clear adapter on disconts.
+ Clear caps when going to READY instead of NULL
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init),
+ (gst_gdp_pay_init), (gst_gdp_pay_finalize), (gst_gdp_pay_reset),
+ (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer),
+ (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader),
+ (gst_gdp_queue_buffer), (gst_gdp_pay_chain),
+ (gst_gdp_pay_sink_event), (gst_gdp_pay_src_event),
+ (gst_gdp_pay_change_state):
+ * gst/gdp/gstgdppay.h:
+ Reset payloader when going to READY.
+ Fix leaked buffers in ->queue on push errors.
+ Disable seeking.
+ Code cleanups.
+ Create packetizer in _init, free in _finalize.
+
+2006-07-31 08:48:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gdp/gstgdpdepay.c: Consume all events except EOS because we generate events from the gdp payload instead. Fixes #...
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init),
+ (gst_gdp_depay_sink_event), (gst_gdp_depay_chain):
+ Consume all events except EOS because we generate events from
+ the gdp payload instead. Fixes #349204
+
+2006-07-28 17:17:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/audioresample/gstaudioresample.c: Don't leak references to the incoming caps. Clean them up when stopping.
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c: (audioresample_stop),
+ (audioresample_set_caps):
+ Don't leak references to the incoming caps. Clean them up when
+ stopping.
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init),
+ (gst_video_scale_finalize):
+ Don't leak our temporary pixel buffer.
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/simple-launch-lines.c: (run_pipeline),
+ (GST_START_TEST), (simple_launch_lines_suite):
+ Fix leaks and re-enable the test for valgrind checking.
+
+2006-07-28 16:39:31 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefind function for multipart/x-mixed-replace (#348916).
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon net>
+ * gst/typefind/gsttypefindfunctions.c: (multipart_type_find),
+ (plugin_init):
+ Add typefind function for multipart/x-mixed-replace (#348916).
+
+2006-07-28 14:14:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.c: Fix leak in duration query.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_setcaps),
+ (gst_adder_query_duration):
+ Fix leak in duration query.
+ Reflow some docs and notes.
+
+2006-07-28 13:42:48 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/pipelines/vorbisenc.c: Enable Andy's extra vorbisenc test, now that it passes. Also fix one aspect of it.
+ Original commit message from CVS:
+ * tests/check/pipelines/vorbisenc.c: (GST_START_TEST),
+ (vorbisenc_suite):
+ Enable Andy's extra vorbisenc test, now that it passes. Also fix one
+ aspect of it.
+
+2006-07-28 12:48:21 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.*: Handle discontinuities in the input vorbis stream correctly, so that the output is properly t...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_generate_sink_caps),
+ (gst_vorbis_enc_sink_getcaps), (gst_vorbis_enc_buffer_from_packet),
+ (gst_vorbis_enc_push_buffer),
+ (gst_vorbis_enc_buffer_check_discontinuous),
+ (gst_vorbis_enc_chain), (gst_vorbis_enc_change_state):
+ * ext/vorbis/vorbisenc.h:
+ Handle discontinuities in the input vorbis stream correctly,
+ so that the output is properly timestamped (and has good granulepos
+ values). Needs some oggmux fixes too.
+
+2006-07-27 10:52:52 +0000 Kai Vehmanen <kv2004@eca.cx>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Don't send multiple newsegments with different formats.
+ Original commit message from CVS:
+ patch by: Kai Vehmanen <kv2004 eca cx>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_handle_sink_event),
+ (gst_base_rtp_depayload_change_state):
+ Don't send multiple newsegments with different formats.
+ Fixes #348677.
+
+2006-07-26 15:20:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Make seeking in ogg more accurate again by doing the more correct granuletime to stream time c...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_internal_chain),
+ (gst_ogg_demux_do_seek), (gst_ogg_demux_read_chain):
+ Make seeking in ogg more accurate again by doing the more correct
+ granuletime to stream time conversion.
+
+2006-07-26 10:59:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gstmultifdsink.c: debug a little more understandably do not use goto as a substitute for break, especially if...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_add_full),
+ (gst_multi_fd_sink_new_client):
+ debug a little more understandably
+ do not use goto as a substitute for break, especially if
+ break is also being used
+
+2006-07-26 10:55:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gsttcp.c:
+ move a recurring normal event to LOG, where it should be
+ Original commit message from CVS:
+ move a recurring normal event to LOG, where it should be
+
+2006-07-26 10:54:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/vorbis/vorbisdec.c:
+ tweak debug output
+ Original commit message from CVS:
+ tweak debug output
+
+2006-07-26 10:52:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gdp/gstgdpdepay.c: proxying get/set caps is the wrong thing to do, since we really do change caps quite fundament...
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init):
+ proxying get/set caps is the wrong thing to do, since we really
+ do change caps quite fundamentally
+ * tests/check/elements/gdpdepay.c:
+ * tests/check/elements/gdppay.c:
+ remove declaration of buffers, it's already done in gstcheck.h
+
+2006-07-26 10:31:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Remove GLib-2.6 compatibility cruft.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property):
+ * gst/playback/gstplaybin.c: (gst_play_bin_get_property):
+ Remove GLib-2.6 compatibility cruft.
+
+2006-07-24 16:47:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Don't try to align a sample to an unknown value.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ Don't try to align a sample to an unknown value.
+
+2006-07-24 15:14:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: When the audio clock is slaved to another clock, never try to align samples bu...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_provide_clock), (gst_base_audio_sink_render):
+ When the audio clock is slaved to another clock, never try to align
+ samples but trust the rate interpolation algorithm.
+
+2006-07-24 14:34:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.c: Don't try to calculate silence samples, base class does this much better now.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (set_hwparams), (gst_alsasink_prepare):
+ Don't try to calculate silence samples, base class does this much
+ better now.
+ * gst-libs/gst/audio/gstringbuffer.c: (build_linear_format),
+ (gst_ring_buffer_debug_spec_caps), (gst_ring_buffer_parse_caps),
+ (gst_ring_buffer_acquire):
+ Calculate silence samples correctly.
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Add _CAST macro.
+
+2006-07-22 17:01:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Limit search for the first markup tag to the first few kB of the file. If we don...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (xml_check_first_element):
+ Limit search for the first markup tag to the first few kB of
+ the file. If we don't find one there, it's highly unlikely that
+ this is an XML(-ish) file.
+
+2006-07-21 17:04:06 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/theoraenc.c (test_discontinuity): Similar test to the one in vorbisenc. Also commented out.
+ Original commit message from CVS:
+ 2006-07-21 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/theoraenc.c (test_discontinuity): Similar
+ test to the one in vorbisenc. Also commented out.
+
+2006-07-21 16:54:19 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/vorbisenc.c: New test, commented out until Mike lands some elite vorbisenc patches.
+ Original commit message from CVS:
+ 2006-07-21 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/vorbisenc.c:
+ (test_discontinuity): New test, commented out until Mike lands
+ some elite vorbisenc patches.
+
+2006-07-21 15:59:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/: Port to bufferstraw.
+ Original commit message from CVS:
+ 2006-07-21 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/vorbisenc.c:
+ * tests/check/pipelines/theoraenc.c: Port to bufferstraw.
+ Bufferstraw was actually factored out of these tests. Now we share
+ code yay.
+
+2006-07-21 11:03:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Better clipping.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (clip_buffer):
+ Better clipping.
+
+2006-07-21 10:43:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Fix leak.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c: (audioringbuffer_thread_func),
+ (gst_audioringbuffer_finalize), (gst_audioringbuffer_acquire),
+ (gst_audioringbuffer_release), (gst_audioringbuffer_stop):
+ Fix leak.
+ Avoid type casting when we can.
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_dispose):
+ Fix mem leak.
+
+2006-07-20 16:57:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsamixerelement.c: Make state change fail if the specified device can't be opened for some reason.
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_change_state):
+ Make state change fail if the specified device can't be opened
+ for some reason.
+
+2006-07-20 10:42:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/test.c: Example of a small audio/video player using decodebin.
+ Original commit message from CVS:
+ * gst/playback/test.c: (gen_video_element), (gen_audio_element),
+ (cb_newpad), (main):
+ Example of a small audio/video player using decodebin.
+
+2006-07-20 05:56:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/riff-ids.h: Add 'fact' chunk id
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ Add 'fact' chunk id
+
+2006-07-19 18:20:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Don't assert when not negotiated but post a meaningfull error message. Fixes ...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_chain),
+ (gst_base_rtp_depayload_change_state):
+ Don't assert when not negotiated but post a meaningfull
+ error message. Fixes #347918.
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ Add comment about better default MTU size.
+ * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data):
+ Small cleanups, start docs.
+
+2006-07-19 14:46:36 +0000 Martin Szulecki <compiz@sukimashita.com>
+
+ sys/v4l/gstv4lelement.c: If "device-name" is requested and the device is not open, try to temporarily open it to obta...
+ Original commit message from CVS:
+ Patch by: Martin Szulecki
+ * sys/v4l/gstv4lelement.c: (gst_v4lelement_get_property):
+ If "device-name" is requested and the device is not
+ open, try to temporarily open it to obtain this
+ information (#342494).
+
+2006-07-19 12:25:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstid3tag.c: Add TSSE <=> GST_TAG_ENCODER mapping (see #347898).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Add TSSE <=> GST_TAG_ENCODER mapping (see #347898).
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ Some more random const-ifications.
+
+2006-07-18 19:48:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst-libs/gst/riff/: add comment what those 16 bytes in struct _gst_riff_strh according to one avi-dumper are
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c:
+ (gst_riff_create_video_template_caps):
+ Add more FOURCCs (sort list to make stuff easier to find),
+ add comment what those 16 bytes in struct _gst_riff_strh according to
+ one avi-dumper are
+
+2006-07-17 14:17:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gdp/: remove parent_class setting, BOILERPLATE does this fix typo in comment
+ Original commit message from CVS:
+ 2006-07-17 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_class_init):
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init),
+ remove parent_class setting, BOILERPLATE does this
+ (gst_gdp_pay_reset_streamheader):
+ fix typo in comment
+
+2006-07-17 13:48:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: Const-ify two arrays.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions),
+ (gst_audio_fixate_channel_positions):
+ Const-ify two arrays.
+
+2006-07-17 12:33:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsa.c: Fix typo, so that alsasink also advertises 8 channels if that's supported (tags: can, worms, open...
+ Original commit message from CVS:
+ * ext/alsa/gstalsa.c: (caps_add_channel_configuration):
+ Fix typo, so that alsasink also advertises 8 channels
+ if that's supported (tags: can, worms, open, alsa, ph34r).
+
+2006-07-17 12:01:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: *sigh*, when is the compiler going to warn when the comments are out-of-sync with the code.. R...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_internal_chain),
+ (gst_ogg_pad_submit_packet), (gst_ogg_demux_read_chain):
+ *sigh*, when is the compiler going to warn when the comments
+ are out-of-sync with the code.. Refix case of busted theora
+ headers with 0 granule pos.
+
+2006-07-14 17:56:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Fix 99% cpu load by waiting for absolute times on the clock. Fixes #347300.
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_wait),
+ (gst_base_rtp_depayload_change_state),
+ (gst_base_rtp_depayload_set_property),
+ (gst_base_rtp_depayload_get_property):
+ Fix 99% cpu load by waiting for absolute times on the
+ clock. Fixes #347300.
+
+2006-07-14 17:07:08 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/gsttheoraparse.h: ext/theora/theoraparse.c (theora_parse_drain_event_queue) (theora_parse_push_headers, th...
+ Original commit message from CVS:
+ 2006-07-14 Andy Wingo <wingo@pobox.com>
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c (theora_parse_drain_event_queue)
+ (theora_parse_push_headers, theora_parse_clear_queue)
+ (theora_parse_drain_queue_prematurely, )
+ (theora_parse_sink_event, theora_parse_change_state): Queue events
+ until we initialized our state, like in vorbisparse.
+
+2006-07-14 16:45:17 +0000 Iain * <iaingnome@gmail.com>
+
+ ext/vorbis/vorbisparse.h: ext/vorbis/vorbisparse.c (vorbis_parse_drain_event_queue) (vorbis_parse_push_headers, vorbi...
+ Original commit message from CVS:
+ 2006-07-14 Andy Wingo <wingo@pobox.com>
+ * ext/vorbis/vorbisparse.h:
+ * ext/vorbis/vorbisparse.c (vorbis_parse_drain_event_queue)
+ (vorbis_parse_push_headers, vorbis_parse_clear_queue)
+ (vorbis_parse_drain_queue_prematurely, )
+ (vorbis_parse_sink_event, vorbis_parse_change_state): Queue events
+ until we have initialized our state. Fixes seeking after an
+ initial pad block.
+ 2006-07-14 Andy Wingo <wingo@pobox.com>
+ Patch by: Iain * <iaingnome@gmail.com>
+ * ext/ogg/gstoggdemux.c (gst_ogg_demux_finalize): Fix memleak.
+
+2006-07-14 15:52:39 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump nano back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Bump nano back to CVS
+
+=== release 0.10.9 ===
+
+2006-07-14 15:51:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.9, "I walk the line"
+ Original commit message from CVS:
+ 2006-07-13 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.9, "I walk the line"
+
+2006-07-14 14:12:40 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/pipelines/vorbisenc.c: Move a g_cond_signal to earlier to avoid sometimes deadlocking (commonly happens w...
+ Original commit message from CVS:
+ * tests/check/pipelines/vorbisenc.c: (stop_pipeline):
+ Move a g_cond_signal to earlier to avoid sometimes deadlocking
+ (commonly happens when running this test under valgrind) when trying
+ to remove the buffer probe.
+
+2006-07-14 10:34:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/Makefile.am:
+ build as a plugin, not a lib
+ Original commit message from CVS:
+ build as a plugin, not a lib
+
+2006-07-13 16:43:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/xvimage/xvimagesink.c: Fix missing g_unlock from the previous commit
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new):
+ Fix missing g_unlock from the previous commit
+
+2006-07-13 16:34:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: Implement a locking order to ensure we always take the object lock before the x_lock and never vice-versa.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new),
+ (gst_ximagesink_change_state):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_change_state):
+ Implement a locking order to ensure we always take the object lock
+ before the x_lock and never vice-versa.
+
+2006-07-13 15:25:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/plugins/: add more plugins and elements 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:
+ add more plugins and elements to docs
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain):
+ fix segfaults due to wrong g_free
+ add example
+ * gst/gdp/gstgdppay.c:
+ add example
+
+2006-07-13 14:38:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: Fix a caps leak when linking (#347304)
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (find_compatibles):
+ Fix a caps leak when linking (#347304)
+ * sys/ximage/ximagesink.c: (gst_ximage_buffer_finalize),
+ (gst_ximagesink_ximage_destroy), (gst_ximagesink_xcontext_clear),
+ (gst_ximagesink_change_state):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimage_buffer_finalize), (gst_xvimagesink_check_xshm_calls),
+ (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_put),
+ (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_change_state):
+ Don't leak shared memory resources. Use the object lock to protect
+ against the xcontext disappearing while returning a buffer from the
+ pipeline. (#347304)
+
+2006-07-12 14:20:43 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisdec.c: gst_tag_list_merge() returns a new object. Take that into account when using it. This avoids ...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_finalize),
+ (vorbis_handle_comment_packet):
+ gst_tag_list_merge() returns a new object. Take that into account when
+ using it. This avoids memleak.
+ Revert previous commit which is not needed.
+
+2006-07-12 13:30:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisdec.c: Reset the decoder in finalize so that all fields get cleared.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_finalize):
+ Reset the decoder in finalize so that all fields get cleared.
+
+2006-07-12 13:24:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Don't try to post an error message when setting the clock fails as this can hap...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_set_clock),
+ (gst_base_audio_src_check_get_range), (gst_base_audio_src_create):
+ Don't try to post an error message when setting the clock fails
+ as this can happen when adding an element to a bin which will then
+ deadlock. Fixes #347296.
+
+2006-07-12 13:04:15 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisdec.c: Post tag messages on the bus even if we're not initialized.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_reset),
+ (vorbis_dec_sink_event), (vorbis_handle_comment_packet),
+ (vorbis_handle_type_packet):
+ Post tag messages on the bus even if we're not initialized.
+ If we're not initialized, we still postpone the event pushing of tags.
+
+2006-07-12 11:28:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Revert last two changes that broke the freeze.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (set_hwparams), (gst_alsasink_prepare):
+ * gst-libs/gst/audio/gstringbuffer.c: (build_linear_format),
+ (gst_ring_buffer_debug_spec_caps), (gst_ring_buffer_parse_caps):
+ Revert last two changes that broke the freeze.
+
+2006-07-12 10:59:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.c: basesink calculates silence sample correctly for us.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (set_hwparams), (gst_alsasink_prepare):
+ basesink calculates silence sample correctly for us.
+
+2006-07-12 10:58:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Calculate correct silence samples so we don't fill our ringbuffer with noise.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (build_linear_format),
+ (gst_ring_buffer_debug_spec_caps), (gst_ring_buffer_parse_caps):
+ Calculate correct silence samples so we don't fill our ringbuffer
+ with noise.
+
+2006-07-12 10:37:18 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisdec.*: Delay sending events (newsegment, tags) until the decoder is properly initialized.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init),
+ (gst_vorbis_dec_reset), (vorbis_dec_sink_event),
+ (vorbis_handle_comment_packet), (vorbis_handle_type_packet):
+ * ext/vorbis/vorbisdec.h:
+ Delay sending events (newsegment, tags) until the decoder is properly
+ initialized.
+ Fixes #347295
+
+2006-07-11 22:40:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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-07-11 21:04:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/audioconvert.c: Patch from #347221 adding a test for audioconvert channel remappings.
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (get_float_mc_caps),
+ (get_int_mc_caps), (GST_START_TEST), (audioconvert_suite):
+ Patch from #347221 adding a test for audioconvert
+ channel remappings.
+
+2006-07-11 12:03:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstssaparse.c: Don't include the terminating NUL in the buffer size, it's only there for extra paranoia ...
+ Original commit message from CVS:
+ * gst/subparse/gstssaparse.c: (gst_ssa_parse_base_init),
+ (gst_ssa_parse_parse_line):
+ Don't include the terminating NUL in the buffer size,
+ it's only there for extra paranoia (would add random
+ '*' characters at the end of each subtitle since the
+ terminator itself is not valid UTF-8 technically).
+ Also fix indenting after boilerplate macro.
+
+2006-07-10 14:59:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: Also emit 'unknown-type' signal (which should really be called unhandled-type) if we fou...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (close_pad_link):
+ Also emit 'unknown-type' signal (which should really be
+ called unhandled-type) if we found potential decoders/demuxers
+ in the registry but none of them worked in the end (as in the
+ case where the plugins don't exist any longer but are still
+ listed in the registry). Fixes #329798.
+
+2006-07-08 13:48:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * ext/theora/theoraparse.c:
+ theoraparse.c (theora_parse_push_buffer)
+ Original commit message from CVS:
+ 2006-07-08 Andy Wingo <wingo@pobox.com>
+ * theoraparse.c (theora_parse_push_buffer)
+ (theora_parse_drain_queue_prematurely, theora_parse_drain_queue):
+ Add some more debugging. Fix granulepos reconstruction in the face
+ of discontinuities.
+
+2006-07-06 15:54:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Use gobject_class instead of G_OBJECT_CLASS (klass)
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init),
+ (gst_base_audio_sink_provide_clock):
+ Use gobject_class instead of G_OBJECT_CLASS (klass)
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init), (gst_base_audio_src_init),
+ (gst_base_audio_src_set_clock), (gst_base_audio_src_provide_clock),
+ (gst_base_audio_src_get_time),
+ (gst_base_audio_src_check_get_range), (gst_base_audio_src_create),
+ (gst_base_audio_src_create_ringbuffer):
+ Fix latency and buffer-time constants and properties ala basesink.
+ Implement pull based scheduling. Fixes #346527.
+ Set default blocksize in GstBaseSrc to 0, we default to pushing out
+ one segment.
+ Refuse slaving to another clock instead of silently not working.
+ Only provide a clock when we are actually able to do so.
+ Various small cleanups and compiler hints.
+
+2006-07-06 13:23:07 +0000 Lutz Mueller <lutz@topfrose.de>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefinding for text/html (#346581).
+ Original commit message from CVS:
+ Patch by: Lutz Mueller <lutz at topfrose de>
+ * gst/typefind/gsttypefindfunctions.c: (html_type_find),
+ (plugin_init):
+ Add typefinding for text/html (#346581).
+
+2006-07-06 13:12:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Fix SMIL typefinding, make xml_check_first_element() more useful.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (utf8_type_find),
+ (xml_check_first_element), (xml_type_find), (smil_type_find):
+ Fix SMIL typefinding, make xml_check_first_element() more
+ useful.
+
+2006-07-06 13:04:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.*: Protect list of elements with a subtitle-encoding property and the subtitle encoding m...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init),
+ (gst_play_base_bin_finalize), (decodebin_element_added_cb),
+ (decodebin_element_removed_cb), (gst_play_base_bin_set_property):
+ * gst/playback/gstplaybasebin.h:
+ Protect list of elements with a subtitle-encoding property and
+ the subtitle encoding member itself with a lock of their own
+ instead of using the object lock. This prevents a dead-lock in
+ the element-remove callback in some circumstances when shutting
+ down playbin.
+
+2006-07-05 20:11:13 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgsttag.def: Export some new functions.
+ Original commit message from CVS:
+ * win32/common/libgsttag.def:
+ Export some new functions.
+ * win32/vs6/libgstogg.dsp:
+ Add a link to libgsttag-0.10.lib.
+
+2006-07-04 16:50:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsamixertrack.c: Some const-ification.
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new):
+ Some const-ification.
+
+2006-07-04 14:06:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.c: Improve checking if we are dealing with a stream. Added some more uris that need buffe...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (is_stream), (gen_source_element):
+ Improve checking if we are dealing with a stream. Added some
+ more uris that need buffering.
+
+2006-07-03 10:43:31 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/vorbis/vorbisdec.c: Remove unused variable.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_do_clip):
+ Remove unused variable.
+
+2006-07-02 21:48:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: include lcov.mak
+ Original commit message from CVS:
+ * Makefile.am:
+ include lcov.mak
+ * configure.ac:
+ add GCOV_LIBS to GST_LIBS
+
+2006-07-02 11:08:58 +0000 Michael Sheldon <webmaster@mikeasoft.com>
+
+ ext/alsa/gstalsasrc.c: Add 32 bps to template caps and increase channels range from [1,2] to [1,MAX]. See #346326.
+ Original commit message from CVS:
+ Patch by: Michael Sheldon <webmaster at mikeasoft com>
+ * ext/alsa/gstalsasrc.c:
+ Add 32 bps to template caps and increase channels range
+ from [1,2] to [1,MAX]. See #346326.
+
+2006-06-30 12:04:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Recognise 'WMVA' video codec fourcc (#345879).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Recognise 'WMVA' video codec fourcc (#345879).
+
+2006-06-29 12:21:06 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: Fixed nasty memory leak
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ Fixed nasty memory leak
+
+2006-06-26 13:19:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gsttcp.c: fix logging
+ Original commit message from CVS:
+ * gst/tcp/gsttcp.c: (gst_tcp_read_buffer),
+ (gst_tcp_gdp_read_buffer), (gst_tcp_gdp_read_caps):
+ fix logging
+
+2006-06-23 16:45:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: Protect remove_fakesink using a mutex, so that we don't try and remove the fakesink simu...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init),
+ (gst_decode_bin_init), (gst_decode_bin_finalize), (add_fakesink),
+ (remove_fakesink), (pad_probe), (gst_decode_bin_change_state):
+ Protect remove_fakesink using a mutex, so that we don't try and
+ remove the fakesink simultaneously from multiple threads.
+ When going from READY to PAUSED, restore the fakesink, so that
+ it is there when decodebin gets reused.
+
+2006-06-23 09:53:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Use GST_DEBUG_CATEGORY_STATIC where possible (#342503).
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * sys/v4l/gstv4ljpegsrc.c:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lsrc.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ Use GST_DEBUG_CATEGORY_STATIC where possible (#342503).
+
+2006-06-23 09:09:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) and fix one GObject boilerplate macro.
+ Original commit message from CVS:
+ * ext/directfb/dfbvideosink.c:
+ * ext/gsm/gstgsmdec.c:
+ * ext/gsm/gstgsmenc.c:
+ * ext/libmms/gstmms.c:
+ * ext/neon/gstneonhttpsrc.c:
+ * ext/theora/theoradec.c:
+ * gst/freeze/gstfreeze.c:
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.c:
+ * sys/glsink/glimagesink.c:
+ Use GST_DEBUG_CATEGORY_STATIC where possible (#342503)
+ and fix one GObject boilerplate macro.
+
+2006-06-22 12:13:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/tags.c: Second field in GEnumValue shouldn't be a description, but a stringified version of the enum...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tags.c: (register_tag_image_type_enum):
+ Second field in GEnumValue shouldn't be a description,
+ but a stringified version of the enum value.
+
+2006-06-22 12:03:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/ximage/ximagesink.c: Avoid type checking in buffer casts.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximage_buffer_finalize),
+ (gst_ximage_buffer_free), (gst_ximagesink_ximage_put),
+ (gst_ximagesink_setcaps), (gst_ximagesink_buffer_alloc):
+ Avoid type checking in buffer casts.
+ Avoid caps copy in buffer_alloc when we can.
+ Use pad_peer_accept.
+
+2006-06-22 11:01:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/tag.h: Oops, make that 'Since: 0.10.9'.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/tag.h:
+ Oops, make that 'Since: 0.10.9'.
+
+2006-06-22 10:55:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GstTagImageType enum to describe images contained in image tags (#345641).
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c: (register_tag_image_type_enum),
+ (gst_tag_image_type_get_type):
+ API: add GstTagImageType enum to describe images contained
+ in image tags (#345641).
+
+2006-06-22 10:31:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/tcp/gstmultifdsink.c: Fix warnings with gst-inspect: "buffers-min" property should be of G_TYPE_INT and not G_TYP...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ Fix warnings with gst-inspect: "buffers-min" property
+ should be of G_TYPE_INT and not G_TYPE_INT64. Also fix
+ typo in property description.
+
+2006-06-22 10:10:51 +0000 Cody Russell <bratsche@gnome.org>
+
+ gst/: Avoid unnecessary class cast check in class_init functions (#337747).
+ Original commit message from CVS:
+ Patch by: Cody Russell <bratsche at gnome org>
+ * gst/audioresample/gstaudioresample.c:
+ (gst_audioresample_class_init):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_class_init):
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init):
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init):
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_class_init):
+ * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_class_init):
+ * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_class_init):
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init):
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_class_init):
+ * gst/volume/gstvolume.c: (gst_volume_class_init):
+ Avoid unnecessary class cast check in class_init
+ functions (#337747).
+
+2006-06-21 18:39:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: g_markup_escape_text() REALLY doesn't like non-UTF8 input and doesn't validate its input ...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_make_utf8),
+ (gst_text_overlay_video_chain):
+ g_markup_escape_text() REALLY doesn't like non-UTF8 input
+ and doesn't validate its input either (and neither did
+ textoverlay it seems). Let's do that then and fix #345206.
+
+2006-06-19 17:12:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.*: Added shiny new burst-on-connect methods.
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type),
+ (gst_unit_type_get_type), (gst_multi_fd_sink_class_init),
+ (gst_multi_fd_sink_init), (gst_multi_fd_sink_add_full),
+ (gst_multi_fd_sink_add), (gst_multi_fd_sink_handle_client_read),
+ (find_syncframe), (find_limits), (assign_value),
+ (count_burst_unit), (gst_multi_fd_sink_new_client),
+ (gst_multi_fd_sink_handle_client_write),
+ (gst_multi_fd_sink_queue_buffer), (gst_multi_fd_sink_render),
+ (gst_multi_fd_sink_set_property), (gst_multi_fd_sink_get_property),
+ (gst_multi_fd_sink_change_state):
+ * gst/tcp/gstmultifdsink.h:
+ Added shiny new burst-on-connect methods.
+ Add properties to control the minimal amount of data queued.
+ Small cleanups.
+ API: bytes-min property
+ API: time-min property
+ API: buffers-min property
+ API: burst-unit property
+ API: burst-value property
+ API: add-full signal
+ * gst/tcp/gsttcp-marshal.list:
+ Added new marshaller code for the new signal.
+ * tests/check/elements/multifdsink.c: (GST_START_TEST),
+ (multifdsink_suite):
+ Added testcases for new burst methods.
+
+2006-06-19 11:35:47 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update for latest changes
+ Original commit message from CVS:
+ update for latest changes
+
+2006-06-19 09:57:50 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/theora/theoradec.c: Implement clipping for accurate seeking.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (clip_buffer), (theora_dec_push):
+ Implement clipping for accurate seeking.
+ Closes #345225
+
+2006-06-19 09:08:05 +0000 Philip Jaegenstedt <philip@lysator.liu.se>
+
+ gst/videoscale/gstvideoscale.c: Make videoscale support RGBA, ARGB, BGRA and ABGR. Fixes #345131
+ Original commit message from CVS:
+ Patch by: Philip Jaegenstedt <philip at lysator dot liu dot se>
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_prepare_size),
+ (gst_video_scale_transform):
+ Make videoscale support RGBA, ARGB, BGRA and ABGR. Fixes #345131
+
+2006-06-17 14:18:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery
+ Original commit message from CVS:
+ ChangeLog surgery
+
+2006-06-17 14:13:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Fix --disable-extern (can't set conditionals conditionally, #343602).
+ Original commit message from CVS:
+ * configure.ac:
+ Fix --disable-extern (can't set conditionals conditionally,
+ #343602).
+
+2006-06-16 15:43:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/audioresample.c: Add test case for bug #342789 fixed below.
+ Original commit message from CVS:
+ * tests/check/elements/audioresample.c: (test_reuse),
+ (audioresample_suite):
+ Add test case for bug #342789 fixed below.
+
+2006-06-16 15:17:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioresample/gstaudioresample.c: Implement GstBaseTransform::start and ::stop so that audioresample can clear it...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ (gst_audioresample_class_init), (gst_audioresample_init),
+ (audioresample_start), (audioresample_stop),
+ (gst_audioresample_set_property), (gst_audioresample_get_property):
+ Implement GstBaseTransform::start and ::stop so that audioresample
+ can clear its internal state properly and be reused insted of
+ causing non-negotiated errors with playbin under some circumstances
+ (#342789).
+ * tests/check/elements/audioresample.c: (setup_audioresample),
+ (cleanup_audioresample):
+ Need to set element state here so that ::start and ::stop are
+ called.
+
+2006-06-16 13:59:29 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst-libs/gst/riff/riff-read.c: Parse extra data better, apparently it's right behind the normal strf header size. Fix...
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian dot net>
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_parse_strf_vids):
+ Parse extra data better, apparently it's right behind
+ the normal strf header size. Fixes #343500.
+
+2006-06-16 11:04:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.c: If we fail to set the buffer_time and period_time alsa parameters, post a warning and leave a...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (set_hwparams):
+ If we fail to set the buffer_time and period_time alsa
+ parameters, post a warning and leave alsa select a
+ default instead of failing. Fixes #342085
+
+2006-06-16 10:30:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery (it wouldn't have crashed, just shown bogus values)
+ Original commit message from CVS:
+ ChangeLog surgery (it wouldn't have crashed, just shown bogus values)
+
+2006-06-16 10:20:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Remove GST_CDDA_TAG_TRACK_TAGS again, it is #ifdef 0'ed out in the header file and shouldn't be listed in the docs.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/cdda/gstcddabasesrc.h:
+ Remove GST_CDDA_TAG_TRACK_TAGS again, it is #ifdef 0'ed
+ out in the header file and shouldn't be listed in the docs.
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk):
+ Fix it so that it doesn't crash in the debug statement.
+
+2006-06-16 10:02:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/: add remaining symbols into correct setions
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ add remaining symbols into correct setions
+ * gst-libs/gst/audio/gstringbuffer.c:
+ fix incomplete docs
+ * gst-libs/gst/audio/gstringbuffer.h:
+ comment out not yet implemented function
+ * gst-libs/gst/floatcast/floatcast.h:
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ add short descriptions
+ * gst-libs/gst/interfaces/propertyprobe.c:
+ fix return value docs
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk):
+ simplify debug logging
+ * gst-libs/gst/riff/riff-read.h:
+ sync function prototype and docs
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ remove left over symbol
+
+2006-06-16 09:56:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Use GST_PLUGIN_DOCS macro in configure.ac, add
+ Original commit message from CVS:
+ * autogen.sh:
+ * configure.ac:
+ * docs/Makefile.am:
+ Use GST_PLUGIN_DOCS macro in configure.ac, add
+ --enable-plugin-docs default to autogen.sh and use
+ ENABLE_PLUGIN_DOCS conditional in Makefile.am (#344039).
+
+2006-06-15 15:27:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Combine GstFlowReturn from the source pads to give a meaningfull result to the upstream peer o...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain_peer),
+ (gst_ogg_demux_activate_chain), (gst_ogg_demux_combine_flows),
+ (gst_ogg_demux_loop):
+ Combine GstFlowReturn from the source pads to give a
+ meaningfull result to the upstream peer or to stop the
+ processing task in case of errors.
+
+2006-06-14 14:49:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreaminfo.c: Try GST_TAG_CODEC as fallback when extracting the codec name; more debug info.
+ Original commit message from CVS:
+ * gst/playback/gststreaminfo.c: (cb_probe):
+ Try GST_TAG_CODEC as fallback when extracting the
+ codec name; more debug info.
+
+2006-06-14 14:34:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/: Extract language tags from ogm subtitle streams, so that the subtitle menu choices are labelled correctly in
+ Original commit message from CVS:
+ * ext/ogg/Makefile.am:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain):
+ Extract language tags from ogm subtitle streams, so that
+ the subtitle menu choices are labelled correctly in
+ Totem (fixes #344708).
+
+2006-06-14 09:13:54 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ ext/ogg/gstoggmux.c: Fix various leaks. Fixes #343699.
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro at nnva dot org>
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_clear),
+ (gst_ogg_mux_release_pad), (gst_ogg_mux_get_headers),
+ (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_init_collectpads),
+ (gst_ogg_mux_clear_collectpads), (gst_ogg_mux_change_state):
+ Fix various leaks. Fixes #343699.
+ Add x-smoke mime type.
+
+2006-06-14 08:17:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-ids.h: Add IDs for 'bext' chunks (see #343837).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-ids.h:
+ Add IDs for 'bext' chunks (see #343837).
+
+2006-06-12 12:44:38 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: Honour font face tags in SAMI subtitles (#344503).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/subparse/samiparse.c: (sami_context_pop_state),
+ (handle_start_font), (end_sami_element):
+ Honour font face tags in SAMI subtitles (#344503).
+
+2006-06-11 20:41:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ po/POTFILES.in: add missing files containing translatable strings
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ add missing files containing translatable strings
+
+2006-06-11 19:55:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/tmpl/.cvsignore: we don't want those *.sgml files in CVS either
+ Original commit message from CVS:
+ * docs/libs/tmpl/.cvsignore:
+ we don't want those *.sgml files in CVS either
+
+2006-06-11 19:44:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ignore more
+ Original commit message from CVS:
+ * docs/libs/.cvsignore:
+ * tests/check/elements/.cvsignore:
+ * tests/check/libs/.cvsignore:
+ ignore more
+
+2006-06-11 18:33:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/Makefile.am: also commiting the changed Makefile.am (added more libs to the doc-build)
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ also commiting the changed Makefile.am (added more libs to the
+ doc-build)
+
+2006-06-11 17:08:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/: first batch of reordering things, add index & hierarchy
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ first batch of reordering things, add index & hierarchy
+
+2006-06-11 14:08:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * ext/alsa/Makefile.am:
+ * ext/cdparanoia/Makefile.am:
+ * ext/gnomevfs/Makefile.am:
+ * ext/libvisual/Makefile.am:
+ * ext/ogg/Makefile.am:
+ * ext/pango/Makefile.am:
+ * ext/theora/Makefile.am:
+ * ext/vorbis/Makefile.am:
+ * sys/v4l/Makefile.am:
+ * sys/ximage/Makefile.am:
+ * sys/xvimage/Makefile.am:
+ further clean up build
+ Original commit message from CVS:
+ further clean up build
+
+2006-06-11 12:14:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: use GST_PKG_CHECK_MODULES, cleans up output
+ Original commit message from CVS:
+ * configure.ac:
+ use GST_PKG_CHECK_MODULES, cleans up output
+
+2006-06-11 12:10:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * win32/common/config.h:
+ update to cvs
+ Original commit message from CVS:
+ update to cvs
+
+2006-06-10 18:52:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfsuri.c: Add support for burn:// URIs (#343385); const-ify things a bit, use G_N_ELEMENTS inste...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris):
+ Add support for burn:// URIs (#343385); const-ify things a bit,
+ use G_N_ELEMENTS instead of hard-coded array size.
+
+2006-06-10 18:25:07 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: Fix up broken entities before passing them to libxml *sigh*. (#343303).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/subparse/samiparse.c: (fix_invalid_entities), (parse_sami):
+ Fix up broken entities before passing them to libxml *sigh*.
+ (#343303).
+
+2006-06-09 18:52:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to trunk
+ Original commit message from CVS:
+ back to trunk
+
+=== release 0.10.8 ===
+
+2006-06-09 18:49:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/config.h:
+ releasing 0.10.8
+ Original commit message from CVS:
+ releasing 0.10.8
+
+2006-06-07 11:04:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ 0.10.7.2 prerelease
+ Original commit message from CVS:
+ * 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:
+ * win32/common/config.h:
+ 0.10.7.2 prerelease
+
+2006-06-07 11:03:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ move last template doc snippets to source code and delete them
+ Original commit message from CVS:
+ * docs/libs/tmpl/gstaudio.sgml:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * docs/libs/tmpl/gstmixer.sgml:
+ * docs/libs/tmpl/gstringbuffer.sgml:
+ * docs/libs/tmpl/gsttuner.sgml:
+ * docs/libs/tmpl/gstxoverlay.sgml:
+ * gst-libs/gst/audio/audio.c:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/mixer.c:
+ * gst-libs/gst/interfaces/tuner.c:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ move last template doc snippets to source code and delete them
+
+2006-06-06 16:26:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/gstgdppay.c:
+ adapt to new api
+ Original commit message from CVS:
+ adapt to new api
+
+2006-06-06 14:39:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: enable building of GDP elements
+ Original commit message from CVS:
+ * configure.ac:
+ enable building of GDP elements
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain):
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init),
+ (gst_gdp_pay_init), (gst_gdp_buffer_from_caps),
+ (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event),
+ (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_sink_event),
+ (gst_gdp_pay_set_property), (gst_gdp_pay_get_property),
+ (gst_gdp_pay_change_state):
+ * gst/gdp/gstgdppay.h:
+ add version 1.0
+
+2006-06-06 11:13:18 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoraparse.c: Mark DELTA_UNIT on non-keyframes.
+ Original commit message from CVS:
+ * ext/theora/theoraparse.c: (theora_parse_drain_queue_prematurely),
+ (theora_parse_drain_queue):
+ Mark DELTA_UNIT on non-keyframes.
+
+2006-06-03 21:06:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/audio/: Document better the fact that latency_time and buffer_time are values stored in microseconds, an...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init), (gst_base_audio_sink_setcaps):
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_parse_caps),
+ (gst_ring_buffer_samples_done):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Document better the fact that latency_time and buffer_time are values
+ stored in microseconds, and not the usual GStreamer nanoseconds.
+ Change the variables (compatibly) that store them from GstClockTime
+ to guint64 to make it more clear that they're not storing clock times.
+ Also, remove the bogus property description that says the user can
+ specify -1 to get the default value, since that's never been the case.
+ When computing the default segment size for the ring buffer, make it
+ an integer number of samples.
+ When the sub-class indicates a delay greater than the number of
+ samples we've written return 0 from the audio sink get_time method.
+
+2006-06-02 17:01:02 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/: Don't busy-wait in tests; this was causing test timeouts very frequently when running under valgrind.
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (set_channel_positions),
+ (get_float_mc_caps), (get_int_mc_caps):
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/audiotestsrc.c: (GST_START_TEST):
+ * tests/check/elements/videorate.c:
+ * tests/check/elements/videotestsrc.c: (GST_START_TEST):
+ * tests/check/elements/volume.c:
+ * tests/check/elements/vorbisdec.c:
+ * tests/check/pipelines/vorbisenc.c: (GST_START_TEST):
+ Don't busy-wait in tests; this was causing test timeouts very
+ frequently when running under valgrind.
+
+2006-06-02 16:45:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gdp/gstgdpdepay.c:
+ * gst/gdp/gstgdppay.h:
+ small fixes
+ Original commit message from CVS:
+ small fixes
+
+2006-06-02 16:35:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ fail_if_can_read is racy
+ Original commit message from CVS:
+ fail_if_can_read is racy
+
+2006-06-02 16:26:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/: make multifdsink properly deal with streamheader:
+ Original commit message from CVS:
+ * gst/tcp/README:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_init),
+ (gst_multi_fd_sink_remove_client_link),
+ (gst_multi_fd_sink_client_queue_caps),
+ (gst_multi_fd_sink_client_queue_buffer),
+ (gst_multi_fd_sink_handle_client_write),
+ (gst_multi_fd_sink_render):
+ * gst/tcp/gstmultifdsink.h:
+ make multifdsink properly deal with streamheader:
+ - streamheader is taken from caps
+ - buffers marked with IN_CAPS are not sent
+ - streamheaders are sent, on connection, from the caps of the
+ buffer where the client gets positioned to
+ - further streamheader changes are done every time the client
+ will receive a buffer with different caps
+ * tests/check/elements/multifdsink.c: (GST_START_TEST),
+ (gst_multifdsink_create_streamheader):
+ add tests for this
+
+2006-06-02 15:06:59 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisdec.c: Reinstate limit on channel count. Vorbis does not define the meaning of > 6 channels, so they...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_identification_packet):
+ Reinstate limit on channel count. Vorbis does not define the meaning
+ of > 6 channels, so they're just independent channels. Gstreamer
+ currently has no mechanism to represent N independent channels.
+
+2006-06-02 14:23:34 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisdec.c: Don't arbitrarily restrict channel counts and rate in vorbis.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_identification_packet):
+ Don't arbitrarily restrict channel counts and rate in vorbis.
+ In terms of effects likely on real-world files, this fixes 96kHz
+ playback of vorbis.
+
+2006-06-02 14:19:18 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/audioconvert.c: More correct float->int conversion.
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float):
+ More correct float->int conversion.
+
+2006-06-02 14:07:42 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggdemux.c: Don't accidently send GST_CLOCK_TIME_NONE as a new segment start value. Fixes g-critical on tr...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_perform_seek):
+ Don't accidently send GST_CLOCK_TIME_NONE as a new segment start
+ value. Fixes g-critical on trying to play back ogg containing
+ unknown codec.
+
+2006-06-02 10:34:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybasebin.*: Make the subtitle detection work from any thread so we don't deadlock. Fixes #343397.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (group_create), (group_commit),
+ (setup_source):
+ * gst/playback/gstplaybasebin.h:
+ Make the subtitle detection work from any thread so we don't
+ deadlock. Fixes #343397.
+
+2006-06-02 10:28:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gdp/gstgdppay.c: add crc-header and crc-payload properties don't error out on some things that are recoverable
+ Original commit message from CVS:
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init),
+ (gst_gdp_pay_init), (gst_gdp_buffer_from_caps),
+ (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event),
+ (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_chain),
+ (gst_gdp_pay_sink_event), (gst_gdp_pay_set_property),
+ (gst_gdp_pay_get_property):
+ add crc-header and crc-payload properties
+ don't error out on some things that are recoverable
+ * tests/check/elements/gdppay.c: (GST_START_TEST), (gdppay_suite):
+ add test for crc
+
+2006-06-02 09:17:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gsttcp.c:
+ show type number when packet is of the wrong type
+ Original commit message from CVS:
+ show type number when packet is of the wrong type
+
+2006-06-01 23:04:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/volume/Makefile.am: Seriously, it's not *that* hard to get compilation right. Even a drunk can do it ! Add LIBOI...
+ Original commit message from CVS:
+ * gst/volume/Makefile.am:
+ Seriously, it's not *that* hard to get compilation right. Even
+ a drunk can do it ! Add LIBOIL CFLAGS and LIBS
+
+2006-06-01 22:00:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 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 20:39:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/volume/gstvolume.*: rewrite the passthrough check, split _int16 and _int16_clamp, fix another property desc., rem...
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_choose_func),
+ (volume_update_real_volume), (gst_volume_class_init),
+ (gst_volume_init), (volume_process_float), (volume_process_int16),
+ (volume_process_int16_clamp), (volume_set_caps),
+ (volume_transform_ip), (plugin_init):
+ * gst/volume/gstvolume.h:
+ rewrite the passthrough check, split _int16 and _int16_clamp, fix
+ another property desc., remove unused param from process function
+ * tests/check/elements/volume.c: (volume_suite):
+ reactivate the passthrough test
+
+2006-06-01 19:19:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixerelement.h:
+ * ext/alsa/gstalsamixeroptions.h:
+ * ext/alsa/gstalsamixertrack.h:
+ * ext/gnomevfs/gstgnomevfssink.h:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/gsttheoraparse.h:
+ * ext/vorbis/vorbisparse.h:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * gst-libs/gst/audio/gstaudiofilter.h:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/audioresample/gstaudioresample.h:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ * gst/playback/gststreamselector.h:
+ * gst/tcp/gstmultifdsink.h:
+ * gst/tcp/gsttcpclientsink.h:
+ * gst/tcp/gsttcpclientsrc.h:
+ * gst/tcp/gsttcpserversink.h:
+ * gst/tcp/gsttcpserversrc.h:
+ * gst/videorate/gstvideorate.h:
+ * gst/videoscale/gstvideoscale.h:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/volume/gstvolume.h:
+ * sys/v4l/gstv4ljpegsrc.h:
+ * sys/v4l/gstv4lmjpegsink.h:
+ * sys/v4l/gstv4lmjpegsrc.h:
+ * sys/v4l/gstv4lsrc.h:
+ * sys/ximage/ximagesink.h:
+ * sys/xvimage/xvimagesink.h:
+ * tests/old/testsuite/alsa/sinesrc.h:
+ Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+
+2006-05-31 16:56:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ remove wrong commit
+ Original commit message from CVS:
+ remove wrong commit
+
+2006-05-31 16:21:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: Handle DISCONT.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_reset),
+ (gst_visual_sink_setcaps), (gst_visual_sink_event),
+ (gst_visual_src_event), (get_buffer), (gst_visual_chain):
+ Handle DISCONT.
+ Use running time before doing QoS.
+ Handle mono too.
+
+2006-05-31 14:17:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/libs/Makefile.am: set a magic variable to indicate we know the docs are incomplete
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ set a magic variable to indicate we know the docs are incomplete
+
+2006-05-30 20:33:59 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstvideo.def: export gst_video_calculate_display_ratio
+ Original commit message from CVS:
+ * win32/common/libgstvideo.def:
+ export gst_video_calculate_display_ratio
+ * win32/vs6/libgstvideoscale.dsp:
+ add link to libgstvideo-0.10.lib
+
+2006-05-30 19:00:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Throw a more comprehensible error for rtsp:// URIs (rather than erroring out with a ne...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gen_source_element):
+ Throw a more comprehensible error for rtsp:// URIs (rather
+ than erroring out with a negotiation error later on) until
+ we fix playbin to handle rtspsrc etc.
+
+2006-05-30 16:09:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/pango/gsttextoverlay.c: Added some FIXMEs.
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_src_event),
+ (gst_text_overlay_text_event):
+ Added some FIXMEs.
+
+2006-05-30 16:07:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.*: Implement release_request_pad.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_class_init), (gst_adder_init),
+ (gst_adder_request_new_pad), (gst_adder_release_pad):
+ * gst/adder/gstadder.h:
+ Implement release_request_pad.
+ Make padcounter atomic.
+ * tests/check/elements/adder.c: (GST_START_TEST), (adder_suite):
+ Added check for release_pad in adder.
+
+2006-05-30 16:04:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Fix build again.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_chain_new_stream):
+ Fix build again.
+
+2006-05-30 14:59:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/ogg/gstoggdemux.c: add more debugging clean up printf formats for granulepos and serialno
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_typefind),
+ (gst_ogg_demux_chain_elem_pad), (gst_ogg_demux_queue_data),
+ (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet),
+ (gst_ogg_pad_submit_page), (gst_ogg_chain_new_stream),
+ (gst_ogg_demux_seek), (gst_ogg_demux_get_data),
+ (gst_ogg_demux_get_next_page), (gst_ogg_demux_do_seek),
+ (gst_ogg_demux_bisect_forward_serialno),
+ (gst_ogg_demux_read_chain), (gst_ogg_demux_find_chains),
+ (gst_ogg_demux_chain), (gst_ogg_demux_loop), (gst_ogg_print):
+ add more debugging
+ clean up printf formats for granulepos and serialno
+
+2006-05-30 14:31:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ * tests/check/generic/states.c:
+ properly fail if we can't make an element
+ Original commit message from CVS:
+ properly fail if we can't make an element
+
+2006-05-30 13:22:58 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.*: Multi-channel caps negotiation, so we can do proper multichannel vorbis encoding, negotiated ...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (raw_caps_factory),
+ (gst_vorbis_enc_class_init), (gst_vorbis_enc_dispose),
+ (gst_vorbis_enc_generate_sink_caps), (gst_vorbis_enc_sink_getcaps),
+ (gst_vorbis_enc_init), (gst_vorbis_enc_buffer_from_header_packet),
+ (gst_vorbis_enc_chain), (gst_vorbis_enc_change_state):
+ * ext/vorbis/vorbisenc.h:
+ Multi-channel caps negotiation, so we can do proper multichannel
+ vorbis encoding, negotiated through audioconvert.
+
+2006-05-30 11:45:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/elements/adder.c: Added check to show that #339935 is fixed with ongoing adder and collectpads fixes.
+ Original commit message from CVS:
+ * tests/check/elements/adder.c: (test_event_message_received),
+ (test_play_twice_message_received), (GST_START_TEST),
+ (adder_suite):
+ Added check to show that #339935 is fixed with ongoing
+ adder and collectpads fixes.
+
+2006-05-29 17:19:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.c: Don't leak pad name.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_request_new_pad):
+ Don't leak pad name.
+
+2006-05-29 15:49:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.c: Fix adder seeking.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_query_duration),
+ (forward_event_func), (forward_event), (gst_adder_src_event):
+ Fix adder seeking.
+ Make query/seeking code threadsafe.
+ * tests/check/Makefile.am:
+ * tests/check/elements/adder.c: (test_event_message_received),
+ (GST_START_TEST), (test_play_twice_message_received):
+ Fix adder test case.
+
+2006-05-29 13:21:00 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/playback/gstplaybasebin.*: Add 'subtitle-encoding' property to playbin, so applications can force a subtitle enco...
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (gst_play_base_bin_init), (gst_play_base_bin_dispose),
+ (set_encoding_element), (decodebin_element_added_cb),
+ (decodebin_element_removed_cb), (setup_subtitle), (setup_source),
+ (gst_play_base_bin_set_property), (gst_play_base_bin_get_property):
+ * gst/playback/gstplaybasebin.h:
+ Add 'subtitle-encoding' property to playbin, so applications can
+ force a subtitle encoding for non-UTF8 subtitles (#342268).
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init),
+ (gst_sub_parse_set_property):
+ Rename recently-added 'encoding' property to 'subtitle-encoding'
+ (so it can be proxied by playbin/decodebin in a generic way
+ with less danger of false positives).
+
+2006-05-29 11:04:48 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/gstaudioconvert.c: Patch from #341562: give more specific audio caps in get_caps, so that basetransf...
+ Original commit message from CVS:
+ * gst/audioconvert/gstaudioconvert.c: (make_lossless_changes),
+ (append_with_other_format), (set_structure_widths),
+ (gst_audio_convert_transform_caps):
+ Patch from #341562: give more specific audio caps in get_caps, so
+ that basetransform can make better decisions on what caps to
+ negotiate.
+
+2006-05-28 20:04:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/volume.c: make it compile again
+ Original commit message from CVS:
+ * tests/check/elements/volume.c:
+ make it compile again
+
+2006-05-28 19:56:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/volume.c: disable test until #343196 gets resolved
+ Original commit message from CVS:
+ * tests/check/elements/volume.c: (volume_suite):
+ disable test until #343196 gets resolved
+
+2006-05-28 19:42:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/gstadder.c: Make it easier to copy&paste
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_get_type):
+ Make it easier to copy&paste
+ * gst/volume/Makefile.am:
+ * gst/volume/gstvolume.c: (volume_update_real_volume),
+ (gst_volume_set_volume), (gst_volume_set_mute),
+ (gst_volume_class_init), (volume_process_int16), (volume_set_caps),
+ (volume_transform_ip), (volume_update_mute),
+ (volume_update_volume):
+ * gst/volume/gstvolume.h:
+ Add own debug category, move duplicate code to helper function, fix
+ property texts, add more comments and prepare ffor liboil-goodness
+ * tests/check/Makefile.am:
+ * tests/check/elements/volume.c: (GST_START_TEST), (volume_suite):
+ add test for mute and passtrough case, be a bit more verbose to track
+ failure
+ * tests/check/generic/states.c: (GST_START_TEST):
+ catch elements that fail to instantiate
+
+2006-05-28 09:37:18 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/pipelines/: Comment out tests using parse_launch() if core was built without parsing capabilities.
+ Original commit message from CVS:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/check/pipelines/theoraenc.c:
+ * tests/check/pipelines/vorbisenc.c:
+ Comment out tests using parse_launch() if core was built without
+ parsing capabilities.
+
+2006-05-27 13:34:03 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/Makefile.am: Extra bonus points for whoever explains to ensonic that you are meant to test unit tests tho...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Extra bonus points for whoever explains to ensonic that you are meant
+ to test unit tests thoroughly before commiting them, especially if
+ you know it's going to break.
+ De-activated element/adder tests.
+
+2006-05-27 13:09:16 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Marking caps conversion issues as GST_WARNING is way too verbose,
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_smpfmt_to_caps):
+ Marking caps conversion issues as GST_WARNING is way too verbose,
+ Moving them to GST_LOG.
+
+2006-05-27 11:26:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ 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 15:52:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Small cleanups.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query),
+ (vorbis_dec_src_event), (vorbis_dec_sink_event), (vorbis_do_clip),
+ (vorbis_dec_push), (vorbis_handle_data_packet), (vorbis_dec_chain),
+ (vorbis_dec_change_state):
+ Small cleanups.
+ Add some FIXMEs
+ Clip output samples to segment boundaries.
+
+2006-05-26 11:17:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/ximage/ximagesink.c: Improve the errors produced on bad output, including some human readable description strings.
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new),
+ (gst_ximagesink_xcontext_get), (gst_ximagesink_show_frame):
+ Improve the errors produced on bad output, including some human
+ readable description strings.
+ Handle the (theoretical for ximagesink) case where the XServer
+ has a different idea about the size required for a particular
+ frame and gives us too small a memory allocation.
+
+2006-05-26 10:18:41 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bugs fixed by previous commit
+ Original commit message from CVS:
+ Mention bugs fixed by previous commit
+
+2006-05-26 09:40:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/xvimage/xvimagesink.c: Improve the errors produced on bad output, including some human readable description strings.
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get),
+ (gst_xvimagesink_get_format_from_caps), (gst_xvimagesink_setcaps),
+ (gst_xvimagesink_show_frame), (gst_xvimagesink_buffer_alloc):
+ Improve the errors produced on bad output, including some human
+ readable description strings.
+ Handle RGB Xv formats properly by transforming them into our
+ big-endian caps description.
+ Use gst_caps_truncate to ensure that we never try and choose a
+ non-fixed caps in buffer_alloc.
+ Handle the case where the XServer has a different idea about the size
+ required for a particular frame and gives us too small a memory
+ allocation.
+ Use -1 to indicate 'no image format', because 0 is a valid XServer
+ image format number.
+ Put RGB Xv formats at the end of the caps, so that we always prefer
+ YUV format frames.
+ Iterate the available Xv Encodings to determine the maximum width and
+ height, and then return that in our caps.
+
+2006-05-25 16:50:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstdecodebin.c: When there is only one unfinished pad and it receives an event that doesn't match our re...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (remove_fakesink), (pad_probe):
+ When there is only one unfinished pad and it receives an event that
+ doesn't match our requirements, we need to set alldone=FALSE so that
+ the fakesink is not removed yet.
+
+2006-05-25 09:32:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggdemux.c: Use gst_type_find_helper_for_buffer() to find the type of stream from the first packet.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_typefind):
+ Use gst_type_find_helper_for_buffer() to find the type
+ of stream from the first packet.
+ * configure.ac:
+ Bump requirements to core CVS (needed for vorbis
+ typefinding to work).
+
+2006-05-24 08:34:53 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Added the 'prfl' atom type which MQV (no, it's not a typo) files contain.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (qt_type_find):
+ Added the 'prfl' atom type which MQV (no, it's not a typo) files contain.
+ Else they play perfectly fine with qtdemux.
+
+2006-05-23 20:38:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ make more debug catagories static
+ Original commit message from CVS:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/theora/theoraparse.c: (gst_theora_parse_class_init):
+ * gst/audiorate/gstaudiorate.c:
+ make more debug catagories static
+ * tests/check/Makefile.am:
+ * tests/check/elements/adder.c: (message_received),
+ (test_event_message_received), (GST_START_TEST),
+ (test_play_twice_message_received), (adder_suite):
+ added test case for using element twice, extra bonus points for anyone
+ who can make these test run reliably
+
+2006-05-23 15:18:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/theora/theoradec.c: Make work with time-stamped input buffers that do not have a granulepos in BUFFER_OFFSET_END ...
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_chain):
+ Make work with time-stamped input buffers that do not
+ have a granulepos in BUFFER_OFFSET_END (like theora
+ buffers coming from matroskademux). Fixes #342448.
+
+2006-05-22 15:53:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gdp/: Handle error cases when calling functions do downwards state change after parent's change_state
+ Original commit message from CVS:
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain),
+ (gst_gdp_depay_change_state):
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader),
+ (gst_gdp_pay_chain), (gst_gdp_pay_sink_event),
+ (gst_gdp_pay_change_state):
+ * gst/gdp/gstgdppay.h:
+ Handle error cases when calling functions
+ do downwards state change after parent's change_state
+ * tests/check/elements/gdpdepay.c: (GST_START_TEST):
+ * tests/check/elements/gdppay.c: (GST_START_TEST):
+ clean up more
+
+2006-05-22 13:25:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ adding GDP payloader and depayloader. Build integration will follow later when the GDP issues for core are sorted out.
+ Original commit message from CVS:
+ * gst/gdp/Makefile.am:
+ * gst/gdp/gstgdp.c: (plugin_init):
+ * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_base_init),
+ (gst_gdp_depay_class_init), (gst_gdp_depay_init),
+ (gst_gdp_depay_finalize), (gst_gdp_depay_chain),
+ (gst_gdp_depay_change_state), (gst_gdp_depay_plugin_init):
+ * gst/gdp/gstgdpdepay.h:
+ * gst/gdp/gstgdppay.c: (gst_gdp_pay_base_init),
+ (gst_gdp_pay_class_init), (gst_gdp_pay_init),
+ (gst_gdp_pay_dispose), (gst_gdp_stamp_buffer),
+ (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer),
+ (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader),
+ (gst_gdp_queue_buffer), (gst_gdp_pay_chain),
+ (gst_gdp_pay_sink_event), (gst_gdp_pay_change_state),
+ (gst_gdp_pay_plugin_init):
+ * gst/gdp/gstgdppay.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/gdpdepay.c: (setup_gdpdepay),
+ (cleanup_gdpdepay), (gdpdepay_push_per_byte), (GST_START_TEST),
+ (setup_gdpdepay_streamheader), (gdpdepay_suite), (main):
+ * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay),
+ (GST_START_TEST), (setup_gdppay_streamheader), (gdppay_suite),
+ (main):
+ adding GDP payloader and depayloader. Build integration will
+ follow later when the GDP issues for core are sorted out.
+
+2006-05-22 11:42:03 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/tcp/Makefile.am: fdstresstest doesn't need Gtk+, fix compilation if gtk is not available (#342566).
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/tcp/Makefile.am:
+ fdstresstest doesn't need Gtk+, fix compilation if
+ gtk is not available (#342566).
+
+2006-05-19 17:57:56 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpaudiopayload.c: 80 line columns
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ 80 line columns
+ Removed redundant floor()
+
+2006-05-19 15:00:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-read.c: On second thought, just skip JUNK chunks automatically, so the caller doesn't have to ...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk):
+ On second thought, just skip JUNK chunks automatically, so
+ the caller doesn't have to handle this. Fixes #342345.
+ Also, return GST_FLOW_UNEXPECTED if we get a short read,
+ not GST_FLOW_ERROR.
+
+2006-05-19 13:37:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-read.c: Don't bail out on JUNK chunks with a size of 0 (would try to pull_range 0 bytes before...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk):
+ Don't bail out on JUNK chunks with a size of 0 (would try to
+ pull_range 0 bytes before, which sources don't like too much).
+ See #342345.
+
+2006-05-19 13:02:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Use the gstutil scaling function to preserve 64 bits while calculating output width and height from the display-aspec...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_fixate_caps):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_setcaps):
+ Use the gstutil scaling function to preserve 64 bits while calculating
+ output width and height from the display-aspect-ratio. (A continuation
+ of #341542)
+
+2006-05-19 11:50:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/xvimage/xvimagesink.*: When performing buffer allocations, remember the caps and image format we return so that i...
+ Original commit message from CVS:
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear),
+ (gst_xvimagesink_buffer_alloc):
+ * sys/xvimage/xvimagesink.h:
+ When performing buffer allocations, remember the caps and image format
+ we return so that if the same caps are asked for next time we can
+ return them immediately without doing any caps intersections.
+
+2006-05-18 23:00:02 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/README: Some new documentation
+ Original commit message from CVS:
+ 2006-05-18 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+ * gst-libs/gst/rtp/README:
+ Some new documentation
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Added GST_RTP_PAYLOAD_DYNAMIC_STRING for use by children
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ New RTP audio base payloader class. Supports frame or sample based codecs.
+ Not enabled in Makefile.am until approved.
+
+2006-05-18 20:30:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/alsa.c: Fix test case: don't try to free NULL GValueArray when there are no devices.
+ Original commit message from CVS:
+ * tests/check/elements/alsa.c: (test_device_property_probe):
+ Fix test case: don't try to free NULL GValueArray when there
+ are no devices.
+
+2006-05-18 19:21:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add simple test that runs a device property probe on alsasrc, alsasink and alsamixer. Disable valgrind ...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/alsa.c: (test_device_property_probe),
+ (alsa_suite), (main):
+ Add simple test that runs a device property probe on alsasrc,
+ alsasink and alsamixer. Disable valgrind check for now (too
+ many leaks in libasound, and valgrind ignored my suppressions
+ additions).
+
+2006-05-18 17:19:39 +0000 Martin Szulecki <gnomebugzilla@sukimashita.com>
+
+ ext/alsa/: Clean up and simplify alsa device probing. Make it actually work for multiple classes. Don't cache results...
+ Original commit message from CVS:
+ * ext/alsa/gstalsadeviceprobe.c: (gst_alsa_get_device_list),
+ (gst_alsa_device_property_probe_probe_property),
+ (gst_alsa_device_property_probe_needs_probe),
+ (gst_alsa_device_property_probe_get_values),
+ (gst_alsa_type_add_device_property_probe_interface):
+ * ext/alsa/gstalsadeviceprobe.h:
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_init_interfaces):
+ * ext/alsa/gstalsamixerelement.h:
+ Clean up and simplify alsa device probing. Make it actually work
+ for multiple classes. Don't cache results any longer.
+ * ext/alsa/gstalsasink.c: (gst_alsasink_init_interfaces),
+ (gst_alsasink_init):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_dispose),
+ (gst_alsasrc_interface_supported), (gst_implements_interface_init),
+ (gst_alsasrc_init_interfaces), (gst_alsasrc_set_property):
+ Make alsasink and alsasrc implement the GstPropertyProbe interface
+ for device probing (#342181).
+ Patch by: Martin Szulecki <gnomebugzilla at sukimashita com>
+
+2006-05-18 10:05:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/samiparse.c: Don't ignore return value of strtol (++compiler_happiness).
+ Original commit message from CVS:
+ * gst/subparse/samiparse.c: (handle_start_font):
+ Don't ignore return value of strtol (++compiler_happiness).
+
+2006-05-17 17:49:10 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/gstsubparse.*: Add 'encoding' property (#341681).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist chollian net>
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_class_init), (gst_sub_parse_init),
+ (gst_sub_parse_set_property), (gst_sub_parse_get_property),
+ (convert_encoding):
+ * gst/subparse/gstsubparse.h:
+ Add 'encoding' property (#341681).
+ * gst/subparse/samiparse.c: (characters_sami):
+ Output is pango markup, so we need to escape text
+ between tags (#342143).
+
+2006-05-16 17:34:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: It's okay to have caps with channels=1 and a channel position different from GST_A...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_check_channel_positions):
+ It's okay to have caps with channels=1 and a channel position
+ different from GST_AUDIO_CHANNEL_POSITION_FRONT_MONO
+ (deinterleavers might want to keep the position in the caps,
+ so that they can be re-interleaved again properly later).
+ Leave check for unexpected 2-channel layouts intact for now.
+
+2006-05-16 16:28:10 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/tcp/gsttcp.c: Return GST_FLOW_UNEXPECTED when we have an eos on the socket so basesrc can do its job correctly.
+ Original commit message from CVS:
+ 2006-05-16 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * gst/tcp/gsttcp.c: (gst_tcp_socket_read):
+ Return GST_FLOW_UNEXPECTED when we have an eos on the socket so
+ basesrc can do its job correctly.
+
+2006-05-16 15:52:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/: Refactor and improve caps probing code: probe signedness when we probe the supported formats/widths; set e...
+ Original commit message from CVS:
+ * ext/alsa/Makefile.am:
+ * ext/alsa/gstalsa.c: (gst_alsa_detect_rates),
+ (gst_alsa_detect_formats), (get_channel_free_structure),
+ (caps_add_channel_configuration), (gst_alsa_detect_channels),
+ (gst_alsa_probe_supported_formats):
+ * ext/alsa/gstalsa.h:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_getcaps):
+ Refactor and improve caps probing code: probe signedness
+ when we probe the supported formats/widths; set endianness
+ to the one we actually probed for (ie. cpu endianness).
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_init), (gst_alsasrc_getcaps),
+ (gst_alsasrc_close):
+ * ext/alsa/gstalsasrc.h:
+ Implement caps probing for alsasrc.
+
+2006-05-15 17:42:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Cleanups, add some G_LIKELY.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (gst_theora_dec_reset),
+ (theora_dec_src_query), (theora_dec_src_event),
+ (theora_dec_sink_event), (theora_handle_comment_packet),
+ (theora_handle_data_packet), (theora_dec_change_state):
+ Cleanups, add some G_LIKELY.
+ Use segment helpers instead of our own wrong code.
+ Clear queued buffers on seek and READY.
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_reset),
+ (vorbis_dec_convert), (vorbis_dec_src_query),
+ (vorbis_dec_src_event), (vorbis_dec_sink_event),
+ (vorbis_handle_comment_packet), (vorbis_dec_push),
+ (vorbis_handle_data_packet), (vorbis_dec_chain),
+ (vorbis_dec_change_state):
+ * ext/vorbis/vorbisdec.h:
+ Remove old useless packetno variable.
+ Do position query properly.
+ Add some G_LIKELY.
+ Do cleanup of queued buffers in new helper function
+ and use it.
+
+2006-05-15 17:17:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsasink.c: Query supported sample rates. Fixes #341732.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_getcaps):
+ Query supported sample rates. Fixes #341732.
+
+2006-05-15 17:01:02 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gstdecodebin.c: Make decodebin reusable when going from PAUSE_TO_READY and then back to PAUSED.
+ Original commit message from CVS:
+ 2006-05-15 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gstdecodebin.c: (cleanup_decodebin),
+ (gst_decode_bin_change_state): Make decodebin reusable
+ when going from PAUSE_TO_READY and then back to PAUSED.
+ Fixes #331678.
+
+2006-05-15 16:49:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Cleanups. Use refcounting and DEBUG_OBJECT.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_get_query_types),
+ (vorbis_dec_convert), (vorbis_dec_src_query),
+ (vorbis_dec_sink_query), (vorbis_dec_src_event),
+ (vorbis_dec_sink_event), (vorbis_handle_identification_packet),
+ (vorbis_dec_clean_queued), (vorbis_dec_push),
+ (vorbis_handle_data_packet), (vorbis_dec_change_state):
+ Cleanups. Use refcounting and DEBUG_OBJECT.
+ Reset segment on flush, use code methods instead of our
+ own wrong version.
+ Fix potential memleak.
+
+2006-05-15 16:46:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsasink.*: Don't leak allocated snd_output_t structure if there's more than one alsasink instance at a t...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_finalise),
+ (gst_alsasink_init):
+ * ext/alsa/gstalsasink.h:
+ Don't leak allocated snd_output_t structure if there's
+ more than one alsasink instance at a time (#341873).
+ Also fix GObject macros in header file.
+
+2006-05-15 15:31:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Don't use libxml functions in the typefinding code.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect):
+ Don't use libxml functions in the typefinding code.
+
+2006-05-15 15:01:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Fix seeking performance in the case where a non-header packet has a 0 granulepos (busted theor...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet):
+ Fix seeking performance in the case where a non-header
+ packet has a 0 granulepos (busted theora case).
+ Fixes #341719
+
+2006-05-15 14:19:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Improve SAMI typefinding: handle case where there are whitespaces or newlines in front of...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c:
+ (gst_sub_parse_data_format_autodetect):
+ Improve SAMI typefinding: handle case where there are
+ whitespaces or newlines in front of the first <SAMI>
+ tag (#169936).
+
+2006-05-15 12:18:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Build video4linux plugin even if there's no XVIDEO, just without implementing the GstXOverlay interface...
+ Original commit message from CVS:
+ * configure.ac:
+ Build video4linux plugin even if there's no XVIDEO, just
+ without implementing the GstXOverlay interface (#334002).
+
+2006-05-15 10:17:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add tentative support for libvisual-0.4 (#336881).
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/libvisual/visual.c: (gst_visual_actor_plugin_is_gl),
+ (plugin_init):
+ Add tentative support for libvisual-0.4 (#336881).
+
+2006-05-15 09:41:03 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/samiparse.c: Need to map "silver" colour explicitly (#169936).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/subparse/samiparse.c: (handle_start_font):
+ Need to map "silver" colour explicitly (#169936).
+
+2006-05-15 09:14:35 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ gst/subparse/: Add support for SAMI subtitles (#169936).
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (parser_state_dispose), (gst_sub_parse_data_format_autodetect),
+ (gst_sub_parse_format_autodetect), (feed_textbuf),
+ (gst_subparse_type_find), (plugin_init):
+ * gst/subparse/gstsubparse.h:
+ * gst/subparse/samiparse.c:
+ * gst/subparse/samiparse.h:
+ Add support for SAMI subtitles (#169936).
+
+2006-05-14 21:18:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update config.h
+ Original commit message from CVS:
+ update config.h
+
+2006-05-14 21:18:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/README:
+ fix mistakes in README
+ Original commit message from CVS:
+ fix mistakes in README
+
+2006-05-14 18:15:17 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioconvert/gstchannelmix.c: Fix #341696: crash when mixing L+R+C to mono or stereo.
+ Original commit message from CVS:
+ * gst/audioconvert/gstchannelmix.c: (gst_channel_mix_fill_others):
+ Fix #341696: crash when mixing L+R+C to mono or stereo.
+ * tests/check/Makefile.am:
+ * tests/check/elements/audioconvert.c: (set_channel_positions),
+ (get_float_mc_caps), (get_int_mc_caps), (GST_START_TEST),
+ (audioconvert_suite):
+ Add test for the above, including some generic framework bits for
+ testing multichannel things.
+
+2006-05-14 16:05:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * configure.ac:
+ Back to CVS
+ Original commit message from CVS:
+ Back to CVS
+
+=== release 0.10.7 ===
+
+2006-05-14 16:00:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.7, "Leave the gun"
+ Original commit message from CVS:
+ 2006-05-14 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.7, "Leave the gun"
+
+2006-05-14 15:55:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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
+
+2006-05-12 22:22:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix the build.
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_fixate_caps):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_setcaps):
+ Fix the build.
+
+2006-05-12 21:30:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix integer overflow problem with pixel-aspect-ratio calculations in videoscale and xvimagesink (#341542)
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/video/video.c: (gst_video_calculate_display_ratio):
+ * gst-libs/gst/video/video.h:
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_fixate_caps):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_setcaps):
+ * tests/check/Makefile.am:
+ * tests/check/libs/video.c: (GST_START_TEST), (video_suite),
+ (main):
+ Fix integer overflow problem with pixel-aspect-ratio calculations
+ in videoscale and xvimagesink (#341542)
+
+2006-05-12 16:56:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstid3tag.c: Map GST_IMAGE_TAG to and from ID2v2 APIC frames (#341557).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Map GST_IMAGE_TAG to and from ID2v2 APIC frames (#341557).
+
+2006-05-12 10:39:08 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/MANIFEST: update win32 files listing
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ update win32 files listing
+
+2006-05-11 21:47:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ disable failing check on gentoo64
+ Original commit message from CVS:
+ disable failing check on gentoo64
+
+2006-05-11 21:35:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ disable failing check on gentoo64
+ Original commit message from CVS:
+ disable failing check on gentoo64
+
+2006-05-11 21:20:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ macros show the correct line
+ Original commit message from CVS:
+ macros show the correct line
+
+2006-05-11 21:04:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ macros show the correct line
+ Original commit message from CVS:
+ macros show the correct line
+
+2006-05-11 21:01:05 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/playback/gstplaybasebin.*: API: GstPlayBaseBin::stream-info-value-array property use a more bindings-friendly way...
+ Original commit message from CVS:
+ 2006-05-11 Thomas Vander Stichele <thomas at apestaart dot org>
+ patch by: Sjoerd Simons (sjoerd@luon.net)
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
+ (group_create), (group_destroy), (add_stream),
+ (gst_play_base_bin_get_property),
+ (gst_play_base_bin_get_streaminfo_value_array):
+ * gst/playback/gstplaybasebin.h:
+ API: GstPlayBaseBin::stream-info-value-array property
+ use a more bindings-friendly way of exposing streaminfo
+ using a GValueArray. Tested in ipython.
+ Closes #341114
+
+2006-05-11 19:44:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ fix some type warnings
+ Original commit message from CVS:
+ fix some type warnings
+
+2006-05-11 19:38:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Also catch queue underruns but don't do anything yet.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (try_to_link_1), (queue_enlarge),
+ (queue_underrun_cb), (queue_filled_cb):
+ Also catch queue underruns but don't do anything yet.
+ Refactor and comment queue enlarging code a bit.
+ * gst/playback/gstplaybasebin.c: (queue_overrun),
+ (queue_threshold_reached), (queue_out_of_data),
+ (gen_preroll_element):
+ If a queue over/underruns check that we don't create nasty
+ deadlocks when the min-threshold is not reached but the
+ max-bytes is. In those cases disable max-bytes when we
+ know that the queue is fed timed data.
+ Add more comments.
+
+2006-05-11 18:06:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Make playbin automatically plug an 'audioresample' element before the audio sink as well. ...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_audio_element):
+ Make playbin automatically plug an 'audioresample'
+ element before the audio sink as well. This solves
+ problems with sinks that only accept a very specific
+ sample rate, like esdsink (e.g. #340379).
+
+2006-05-11 16:04:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Make http sources send special headers so that we receive icecast metadata if the http...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gen_source_element):
+ Make http sources send special headers so that we receive
+ icecast metadata if the http stream is an icecast stream
+ (otherwise the server will just ignore them). This also
+ means that from now on users will need the 'icydemux'
+ element from gst-plugins-good installed if they want to
+ listen to icecast radio streams. (#341432, #333657).
+
+2006-05-11 12:34:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ more commenting
+ Original commit message from CVS:
+ more commenting
+
+2006-05-11 11:40:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gstmultifdsink.c: remove stupid example from docs - it should come with a simple
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_remove_client_link),
+ (gst_multi_fd_sink_new_client), (gst_multi_fd_sink_stop):
+ remove stupid example from docs - it should come with a simple
+ C program instead.
+ Clean up/fix docs
+ * tests/check/elements/multifdsink.c: (wait_bytes_served),
+ (fail_if_can_read), (GST_START_TEST),
+ (gst_multifdsink_create_streamheader), (multifdsink_suite):
+ add a test for changing streamheader which exposes a bug in
+ multifdsink
+
+2006-05-11 10:33:46 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/gnomevfs/gstgnomevfssrc.*: Don't set icy-caps unless we have a sane interval value. Move interval to a local vari...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_init),
+ (gst_gnome_vfs_src_received_headers_callback):
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ Don't set icy-caps unless we have a sane interval value. Move
+ interval to a local variable; we never use it outside this function.
+
+2006-05-11 10:14:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ sys/: Register special buffer types along with the objects so that they are not registered at runtime from N differen...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_get_type):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_type):
+ Register special buffer types along with the objects so
+ that they are not registered at runtime from N different
+ streaming threads since they are not threadsafe.
+
+2006-05-10 18:31:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/multifdsink.c:
+ set caps and plug leaks
+ Original commit message from CVS:
+ set caps and plug leaks
+
+2006-05-10 18:16:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/elements/multifdsink.c: add two more tests, one doing streamheader
+ Original commit message from CVS:
+ * tests/check/elements/multifdsink.c: (wait_bytes_served),
+ (GST_START_TEST), (fail_unless_read), (multifdsink_suite):
+ add two more tests, one doing streamheader
+
+2006-05-10 16:34:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/tcp/gstmultifdsink.c: clean up the bufqueue when shutting down
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_stop):
+ clean up the bufqueue when shutting down
+ * tests/check/Makefile.am:
+ * tests/check/elements/multifdsink.c: (setup_multifdsink),
+ (cleanup_multifdsink), (GST_START_TEST), (multifdsink_suite),
+ (main):
+ add a test for the leak that was just fixed
+
+2006-05-10 15:16:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ DEBUG_FUNCPTR'ing
+ Original commit message from CVS:
+ DEBUG_FUNCPTR'ing
+
+2006-05-10 15:14:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2006-05-10 11:54:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.*: Updated some docs. Added comments and FIXMEs all over the place.
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_setcaps),
+ (gst_adder_query_duration), (gst_adder_query), (forward_event),
+ (gst_adder_src_event), (gst_adder_sink_event),
+ (gst_adder_class_init), (gst_adder_finalize),
+ (gst_adder_request_new_pad), (gst_adder_collected):
+ * gst/adder/gstadder.h:
+ Updated some docs. Added comments and FIXMEs all over the place.
+ Improve debugging info.
+ Fix leak on finalize by not calling the parent.
+ Implement duration query.
+ Make event forwarding threadsafe.
+ Correctly send NEWSEGMENT at start and after flush.
+ Handle EOS correctly.
+ Post error when not negotiated.
+ * tests/check/elements/adder.c: (GST_START_TEST):
+ Added FIXME in the test.
+
+2006-05-09 19:24:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Const-ify GEnumValue and GFlagsValue arrays. Use
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_valign_get_type),
+ (gst_text_overlay_halign_get_type),
+ (gst_text_overlay_wrap_mode_get_type):
+ * ext/theora/theoradec.c: (theora_handle_type_packet),
+ (theora_handle_data_packet):
+ * ext/theora/theoraenc.c: (gst_border_mode_get_type),
+ (theora_enc_sink_setcaps), (theora_enc_chain):
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_mode_get_type):
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audiostestsrc_wave_get_type):
+ * gst/playback/gststreaminfo.c: (gst_stream_type_get_type):
+ * gst/tcp/gstfdset.c: (gst_fdset_mode_get_type):
+ * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type),
+ (gst_sync_method_get_type), (gst_unit_type_get_type),
+ (gst_client_status_get_type):
+ * gst/videoscale/gstvideoscale.c:
+ (gst_video_scale_method_get_type):
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_pattern_get_type):
+ * gst/videotestsrc/videotestsrc.c: (paint_setup_I420),
+ (paint_setup_YV12), (paint_setup_YUY2), (paint_setup_UYVY),
+ (paint_setup_YVYU), (paint_setup_IYU2), (paint_setup_Y41B),
+ (paint_setup_Y42B), (paint_setup_Y800), (paint_setup_YVU9),
+ (paint_setup_YUV9), (paint_setup_RGB888), (paint_setup_BGR888),
+ (paint_setup_RGB565), (paint_setup_xRGB1555):
+ Const-ify GEnumValue and GFlagsValue arrays. Use
+ GST_ROUND_UP_* macros instead of home-made ones.
+
+2006-05-09 17:40:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Require core CVS for the new newsegment stuff.
+ Original commit message from CVS:
+ * configure.ac:
+ Require core CVS for the new newsegment stuff.
+
+2006-05-09 17:30:48 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/tcp/gstmultifdsink.c: Register nick for enum value (#341160).
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon net>
+ * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type):
+ Register nick for enum value (#341160).
+
+2006-05-09 16:46:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/typefind/gsttypefindfunctions.c: backout typefind patch #340375
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (m4a_type_find),
+ (plugin_init):
+ backout typefind patch #340375
+ * tests/check/elements/adder.c: (message_received),
+ (GST_START_TEST), (adder_suite):
+ redo, signal-handling of test
+
+2006-05-09 16:14:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/adder/gstadder.*: Remove bogus segment merging and forwarding, we don't care about timestamps anyway and we just ...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_request_new_pad),
+ (gst_adder_collected):
+ * gst/adder/gstadder.h:
+ Remove bogus segment merging and forwarding, we don't
+ care about timestamps anyway and we just produce a
+ continuous stream.
+ Also create a nice NEWSEGMENT event when we start.
+ Use _scale_int some more.
+
+2006-05-09 11:59:13 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/icles/stress-xoverlay.c: Fix if core was built without parsing support.
+ Original commit message from CVS:
+ * tests/icles/stress-xoverlay.c:
+ Fix if core was built without parsing support.
+
+2006-05-09 11:37:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Add SEDG (Samsung MPEG-4) fourcc.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Add SEDG (Samsung MPEG-4) fourcc.
+
+2006-05-09 11:31:47 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/examples/volume/volume.c: Fox if core was built without parsing support.
+ Original commit message from CVS:
+ * tests/examples/volume/volume.c:
+ Fox if core was built without parsing support.
+ * tests/examples/seek/seek.c:
+ Disable the parse_launch example if core was built without parsing
+ support.
+
+2006-05-09 11:21:24 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/examples/seek/seek.c: Disable the parse_launch example if core was built without parsing support.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c:
+ Disable the parse_launch example if core was built without parsing
+ support.
+
+2006-05-08 15:51:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/videoscale/gstvideoscale.c:
+ doc reparagraphing and DEBUG_FUNCPTRing
+ Original commit message from CVS:
+ doc reparagraphing and DEBUG_FUNCPTRing
+
+2006-05-08 11:51:43 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ 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-07 17:39:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/: Disable the adder test, until the build-slaves posses the kindness to either like it or to give valid r...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/adder.c: (event_loop), (GST_START_TEST):
+ Disable the adder test, until the build-slaves posses the kindness to
+ either like it or to give valid reason for not doing so
+
+2006-05-07 17:25:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/adder.c: Shuffle NULL state change around and raise timeout more
+ Original commit message from CVS:
+ * tests/check/elements/adder.c: (event_loop), (GST_START_TEST),
+ (adder_suite):
+ Shuffle NULL state change around and raise timeout more
+
+2006-05-07 17:07:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/typefind/gsttypefindfunctions.c: Add typefind to distinguish between "audio/x-m4a" and new type "video/mp4". Fixe...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp4_find_box),
+ (mp4_type_find), (plugin_init):
+ Add typefind to distinguish between "audio/x-m4a" and new type
+ "video/mp4". Fixes #340375
+ * tests/check/elements/adder.c: (adder_suite):
+ Raise timeout to make buildbot happy
+
+2006-05-07 16:39:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add sink-event handling to adder. It tries to merge incomming newsegment-events. Added test to check if segment_done ...
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_sink_event),
+ (gst_adder_request_new_pad), (gst_adder_change_state):
+ * gst/adder/gstadder.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/adder.c: (event_loop), (GST_START_TEST),
+ (adder_suite), (main):
+ Add sink-event handling to adder. It tries to merge incomming
+ newsegment-events. Added test to check if segment_done is comming
+ through.
+
+2006-05-05 16:34:15 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * ext/theora/theoraparse.c:
+ * ext/vorbis/vorbisparse.c:
+ ext/theora/theoraparse.c (gst_theora_parse_init) ext/vorbis/vorbisparse.c (gst_vorbis_parse_init)
+ Original commit message from CVS:
+ 2006-05-05 Andy Wingo <wingo@pobox.com>
+ * ext/theora/theoraparse.c (gst_theora_parse_init)
+ (theora_parse_src_convert, theora_parse_src_query):
+ * ext/vorbis/vorbisparse.c (gst_vorbis_parse_init)
+ (vorbis_parse_convert, vorbis_parse_src_query): Add convert and
+ query functions on the source pads of the theora and vorbis parse
+ elements. Fixes position querying when doing a remux.
+
+2006-05-05 13:46:37 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/theora/theoraparse.c: Fix flushing.
+ Original commit message from CVS:
+ * ext/theora/theoraparse.c: (parse_granulepos),
+ (theora_parse_drain_queue_prematurely),
+ (theora_parse_queue_buffer), (theora_parse_sink_event):
+ Fix flushing.
+ Fix invalid granulepos outputs when starting with a non-keyframe.
+
+2006-05-05 12:37:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/typefind/gsttypefindfunctions.c: Rearrange MPEG system stream detection, fixing some memleaks in the process.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find),
+ (mpeg1_sys_type_find), (ogganx_type_find), (sw_data_destroy):
+ Rearrange MPEG system stream detection, fixing some memleaks in the
+ process.
+ Constify the data for STARTS_WITH and RIFF helper handlers. Make sure
+ they clean up their data correctly.
+ Remove unused ogganx caps and move the 'is_annodex' check to inside
+ the 'is_ogg' if statement.
+
+2006-05-05 11:33:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstdecodebin.c: Properly remove ghostpads. Fixes #340392
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (cleanup_decodebin):
+ Properly remove ghostpads. Fixes #340392
+
+2006-05-04 18:43:58 +0000 David Schleef <ds@schleef.org>
+
+ gst/typefind/gsttypefindfunctions.c:
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+
+2006-05-03 16:32:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/typefind/gsttypefindfunctions.c: When typefinding an MP3 in push-based mode, don't penalise the probability down ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset),
+ (mpeg_ts_probe_headers), (mpeg_ts_type_find):
+ When typefinding an MP3 in push-based mode, don't penalise the
+ probability down to 74% when we found 5 valid frames just because we
+ can't peek the end of the file.
+ Make the probability for detecting MPEG Transport Streams based on the
+ number of sequential headers we successfully detected.
+
+2006-05-03 15:52:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Still produce an error when we receive an empty packet.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_sink_event),
+ (vorbis_dec_push), (vorbis_dec_chain):
+ Still produce an error when we receive an empty packet.
+
+2006-05-03 15:34:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Mark buffers with DISCONT after seek and after activating new chains.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain_peer),
+ (gst_ogg_chain_mark_discont), (gst_ogg_chain_new_stream),
+ (gst_ogg_demux_activate_chain), (gst_ogg_demux_perform_seek):
+ Mark buffers with DISCONT after seek and after activating new
+ chains.
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_reset),
+ (theora_get_query_types), (theora_dec_sink_event),
+ (theora_dec_push), (theora_handle_data_packet), (theora_dec_chain),
+ (theora_dec_change_state):
+ Fix frame counter.
+ Detect and mark DISCONT buffers.
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query),
+ (vorbis_dec_sink_event), (vorbis_dec_push), (vorbis_dec_chain),
+ (vorbis_dec_change_state):
+ * ext/vorbis/vorbisdec.h:
+ Use GstSegment.
+ Detect and mark DISCONT buffers.
+ Don't crash on 0 sized buffers.
+
+2006-05-03 08:58:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/volume/gstvolume.c: Increase "volume" property to 10.0. Fixes #340369.
+ Original commit message from CVS:
+ * gst/volume/gstvolume.c: (volume_funcfind), (volume_set_caps),
+ (volume_transform_ip):
+ Increase "volume" property to 10.0. Fixes #340369.
+ Set the process function to NULL when capsnego fails so that
+ we properly error out.
+
+2006-05-02 18:15:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/playback/: free cpas using gst_caps_unref, don't leak caps-strings
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (add_sink):
+ * gst/playback/test.c: (main):
+ * gst/playback/test5.c: (dump_element_stats):
+ * gst/playback/test6.c: (main):
+ free cpas using gst_caps_unref, don't leak caps-strings
+
+2006-05-02 06:33:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ some RTP debug
+ Original commit message from CVS:
+ some RTP debug
+
+2006-05-01 19:08:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Refine musepack typefinding a bit. Return MAXIMUM probability when we detect str...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (musepack_type_find),
+ (plugin_init):
+ Refine musepack typefinding a bit. Return MAXIMUM
+ probability when we detect stream version 7 to make
+ sure the mpeg audio typefinder doesn't trump us.
+
+2006-04-29 16:25:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Protect against unexpected NULL strf_data buffer.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Protect against unexpected NULL strf_data buffer.
+
+2006-04-29 13:09:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/elements/audioconvert.c: interpret the out[] buffer in the order the bytes are actually put in, which is ...
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (verify_convert),
+ (GST_START_TEST):
+ interpret the out[] buffer in the order the bytes are actually
+ put in, which is LITTLE_ENDIAN, not BYTE_ORDER.
+ Other tests should use BYTE_ORDER since the array is filled in
+ with actual values
+
+2006-04-29 12:10:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/elements/audioconvert.c:
+ dump expected data when audioconvert test fails
+ Original commit message from CVS:
+ dump expected data when audioconvert test fails
+
+2006-04-29 11:55:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/elements/audioconvert.c: when a test fails, give an indication of which it is
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (verify_convert),
+ (GST_START_TEST):
+ when a test fails, give an indication of which it is
+
+2006-04-29 09:48:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ * ext/theora/theoraenc.c:
+ add another include
+ Original commit message from CVS:
+ add another include
+
+2006-04-29 01:24:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/subparse/gstssaparse.c:
+ atoi() needs stdlib.h
+ Original commit message from CVS:
+ atoi() needs stdlib.h
+
+2006-04-29 01:18:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/playback/test4.c:
+ * gst/playback/test5.c:
+ * gst/playback/test6.c:
+ exit needs stdlib.h
+ Original commit message from CVS:
+ exit needs stdlib.h
+
+2006-04-29 01:10:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: compile fix; strtol() needs <stdlib.h>
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ compile fix; strtol() needs <stdlib.h>
+
+2006-04-29 01:04:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * docs/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * docs/plugins/Makefile.am:
+ * docs/upload.mak:
+ use common upload.mak
+ Original commit message from CVS:
+ use common upload.mak
+
+2006-04-28 19:46:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ make GstElementDetails const
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixerelement.c:
+ * ext/alsa/gstalsasrc.c:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/ogg/gstogmparse.c:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreamselector.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ * gst/videorate/gstvideorate.c:
+ * gst/videoscale/gstvideoscale.c:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/volume/gstvolume.c:
+ * sys/v4l/gstv4ljpegsrc.c:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * sys/v4l/gstv4lsrc.c:
+ * sys/ximage/ximagesink.c:
+ * sys/xvimage/xvimagesink.c:
+ * tests/check/libs/cddabasesrc.c:
+ make GstElementDetails const
+
+2006-04-28 19:17:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/adder/gstadder.c: send events from src-pad to all sink-pads fixes #338657
+ Original commit message from CVS:
+ * gst/adder/gstadder.c: (gst_adder_setcaps), (gst_adder_src_event),
+ (gst_adder_init):
+ send events from src-pad to all sink-pads fixes #338657
+
+2006-04-28 19:08:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/alsa/gstalsasink.c: query witdh capabilities from alsa, fixes #338919
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_getcaps),
+ (alsasink_parse_spec):
+ query witdh capabilities from alsa, fixes #338919
+
+2006-04-28 15:31:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/tcp/gstmultifdsink.*: Fix race condition in multifdsink that can lead to spurious duplicate clients. this patch a...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init),
+ (gst_multi_fd_sink_remove_client_link):
+ * gst/tcp/gstmultifdsink.h:
+ Fix race condition in multifdsink that can lead to spurious
+ duplicate clients. this patch adds a new signal that is fired when
+ multifdsink has removed all references to the fd.
+ Fixes #339574.
+ Updated documentation.
+ API: client-fd-removed signal added
+
+2006-04-28 15:24:00 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/tcp/gstmultifdsink.c: When asking g_value_array_new to prealloc elements, we may as well ask for the right number...
+ Original commit message from CVS:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_get_stats):
+ When asking g_value_array_new to prealloc elements, we may as well
+ ask for the right number of elements.
+
+2006-04-28 15:08:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: patch to make timestamp checking more tollerant to rounding errors given that ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain), (gst_base_audio_sink_event),
+ (gst_base_audio_sink_render), (gst_base_audio_sink_change_state):
+ patch to make timestamp checking more tollerant to rounding
+ errors given that real discontinuities are to be marked on
+ buffers. Fixes some asf files and #338778.
+ Also avoid some crashers when we receive an event in the
+ NULL state.
+
+2006-04-28 15:01:58 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/gnomevfs/gstgnomevfssrc.*: Remove ICY handling (mostly) from gnomevfssrc, in favour of proper shared support with...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init),
+ (gst_gnome_vfs_src_init), (gst_gnome_vfs_src_finalize),
+ (gst_gnome_vfs_src_get_property),
+ (gst_gnome_vfs_src_send_additional_headers_callback),
+ (gst_gnome_vfs_src_received_headers_callback),
+ (gst_gnome_vfs_src_create), (gst_gnome_vfs_src_start),
+ (gst_gnome_vfs_src_stop):
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ Remove ICY handling (mostly) from gnomevfssrc, in favour of
+ proper shared support within icydemux.
+
+2006-04-28 14:49:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/videorate/gstvideorate.c: fix up docs fix a leak when no caps negotiated fix counting of input frames
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_reset),
+ (gst_video_rate_swap_prev), (gst_video_rate_chain):
+ fix up docs
+ fix a leak when no caps negotiated
+ fix counting of input frames
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/videorate.c: (assert_videorate_stats),
+ (GST_START_TEST), (videorate_suite):
+ add tests for these
+
+2006-04-28 14:48:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Check arguments passed to public functions instead of crashing.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_set_callback), (gst_ring_buffer_acquire),
+ (gst_ring_buffer_release), (gst_ring_buffer_is_acquired),
+ (gst_ring_buffer_set_flushing), (gst_ring_buffer_start),
+ (gst_ring_buffer_pause), (gst_ring_buffer_stop),
+ (gst_ring_buffer_delay), (gst_ring_buffer_samples_done),
+ (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all),
+ (gst_ring_buffer_commit), (gst_ring_buffer_read),
+ (gst_ring_buffer_prepare_read), (gst_ring_buffer_advance),
+ (gst_ring_buffer_clear), (gst_ring_buffer_may_start):
+ Check arguments passed to public functions instead of
+ crashing.
+
+2006-04-28 14:37:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: GstBaseAudioSrc must be live or it does not work.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init),
+ (gst_base_audio_src_get_time), (gst_base_audio_src_create):
+ GstBaseAudioSrc must be live or it does not work.
+ * gst-libs/gst/audio/gstaudiosrc.c: (gst_audio_src_init):
+ Don't set live to TRUE as this is the default in the parentclass.
+
+2006-04-28 14:37:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update config.h
+ Original commit message from CVS:
+ update config.h
+
+2006-04-28 14:33:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videoscale/gstvideoscale.c: Videoscale doesn't pass on pixel-aspect ratio. Handle all fixation cases better. Fixe...
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform_caps),
+ (gst_video_scale_fixate_caps), (gst_video_scale_src_event):
+ Videoscale doesn't pass on pixel-aspect ratio. Handle all
+ fixation cases better. Fixes #338991
+
+2006-04-28 14:24:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videotestsrc/gstvideotestsrc.c: Handle 0/1 framerate correctly Fixes #331901.
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_create):
+ Handle 0/1 framerate correctly Fixes #331901.
+
+2006-04-28 14:22:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/elements/audioconvert.c: Added check for correct clipping when doing float samples in audioconvert.
+ Original commit message from CVS:
+ * tests/check/elements/audioconvert.c: (get_float_caps),
+ (GST_START_TEST), (audioconvert_suite):
+ Added check for correct clipping when doing float samples
+ in audioconvert.
+
+2006-04-28 14:19:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videorate/gstvideorate.c: Print more debugging info.
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_event),
+ (gst_video_rate_chain):
+ Print more debugging info.
+
+2006-04-28 14:17:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audioresample/gstaudioresample.c: Add support for other formats audioresample can handle such as 32 bits in and f...
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c: (gst_audioresample_init),
+ (resample_set_state_from_caps):
+ Add support for other formats audioresample can handle such as
+ 32 bits in and float and 64 bits float. Fixes #301759
+
+2006-04-28 14:12:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/audioconvert/audioconvert.c: correctly clip float samples > 1.0. Fixes #338718
+ Original commit message from CVS:
+ * gst/audioconvert/audioconvert.c: (float):
+ correctly clip float samples > 1.0. Fixes #338718
+
+2006-04-28 13:35:34 +0000 Young-Ho Cha <ganadist@chollian.net>
+
+ ext/pango/gsttextoverlay.c: Don't strip newlines from the text. Also, center lines within multi-line paragraphs (#339...
+ Original commit message from CVS:
+ Patch by: Young-Ho Cha <ganadist at chollian net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init),
+ (gst_text_overlay_render_text):
+ Don't strip newlines from the text. Also, center lines
+ within multi-line paragraphs (#339405).
+
+2006-04-28 12:15:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Fix wavpack typefinding to work in more cases (don't peek for chunks of multiple...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (wavpack_type_find):
+ Fix wavpack typefinding to work in more cases (don't peek
+ for chunks of multiple hundred kBs at once, but process
+ things step-by-step in smaller units). Fixes #339786.
+
+2006-04-28 10:58:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.6 ===
+
+2006-04-28 10:53:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * docs/upload.mak:
+ releasing 0.10.6
+ Original commit message from CVS:
+ releasing 0.10.6
+
+2006-04-28 10:42:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ * win32/common/config.h:
+ dist more win32 files
+ Original commit message from CVS:
+ dist more win32 files
+
+2006-04-28 10:41:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * 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-04-27 00:19:29 +0000 David Schleef <ds@schleef.org>
+
+ gst/videoscale/gstvideoscale.c: Add call to oil_init().
+ Original commit message from CVS:
+ * gst/videoscale/gstvideoscale.c: Add call to oil_init().
+ Fixes #338897.
+
+2006-04-26 17:20:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * win32/common/config.h:
+ new prerelease
+ Original commit message from CVS:
+ new prerelease
+
+2006-04-26 17:17:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: make sure correct newsegments are sent, so that the decoder and the demuxer agree on timestamp...
+ Original commit message from CVS:
+ 2006-04-26 Thomas Vander Stichele <thomas at apestaart dot org>
+ patch by: Wim Taymans
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_perform_seek):
+ make sure correct newsegments are sent, so that the decoder
+ and the demuxer agree on timestamps. Fixes playback of a lot
+ of Ogg files that do not start from 0. Fixes #339833.
+
+2006-04-26 16:44:20 +0000 Edward Hervey <edward@fluendo.com>
+
+ Fix an infinite loop if frames are passed in with wrongly ordered timestamps. Fixes #339013.
+ Original commit message from CVS:
+ Patch by: Edward Hervey <edward@fluendo.com>
+ * gst/videorate/gstvideorate.c: (gst_video_rate_chain):
+ * tests/check/Makefile.am:
+ * tests/check/elements/videorate.c: (assert_videorate_stats),
+ (setup_videorate), (cleanup_videorate), (GST_START_TEST),
+ (videorate_suite), (main):
+ Fix an infinite loop if frames are passed in with wrongly ordered
+ timestamps. Fixes #339013.
+
+2006-04-26 13:55:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-04-22 21:25:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: fix typefinding on some ISO files. Fixes #339212.
+ Original commit message from CVS:
+ Patch by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/typefind/gsttypefindfunctions.c: (qt_type_find):
+ fix typefinding on some ISO files. Fixes #339212.
+
+2006-04-22 21:19:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: add another H264 fourcc. Fixes #339047.
+ Original commit message from CVS:
+ Patch by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ add another H264 fourcc. Fixes #339047.
+
+2006-04-22 21:12:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gststreamselector.c: Restore old StreamSelector behaviour.
+ Original commit message from CVS:
+ Patch by: Jan Schmidt
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_bufferalloc):
+ Restore old StreamSelector behaviour.
+ Fixes #338419.
+
+2006-04-13 09:26:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst-libs/gst/rtp/Makefile.am:
+ * gst-libs/gst/rtp/gstrtpbuffer.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 03:55:12 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstrtpbuffer.h: Added GST_RTP_PAYLOAD_DYNAMIC_STRING for use by children
+ Original commit message from CVS:
+ 2006-04-12 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ Added GST_RTP_PAYLOAD_DYNAMIC_STRING for use by children
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.c:
+ * gst-libs/gst/rtp/gstbasertpaudiopayload.h:
+ New RTP audio base payloader class. Supports frame or sample based codecs
+
+2006-04-12 11:04:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * 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:
+ update libtool versioning
+ Original commit message from CVS:
+ update libtool versioning
+
+2006-04-12 10:58:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * win32/common/config.h:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-04-11 17:31:29 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Fix some memory leaks: on finalize, free buffers left in the queue before des...
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_finalize), (gst_base_rtp_depayload_push):
+ Fix some memory leaks: on finalize, free buffers left in the queue
+ before destroying the queue; in _push(), unref rtp_buf even if
+ the process vfunc returned a NULL buffer as output buffer (#337548);
+ demote some recuring debug messages to LOG level.
+
+2006-04-11 15:01:51 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ fix version number macro
+ Original commit message from CVS:
+ fix version number macro
+
+2006-04-11 14:42:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: More cleanups.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_src_query),
+ (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet),
+ (gst_ogg_chain_free), (gst_ogg_demux_sink_event),
+ (gst_ogg_demux_loop):
+ More cleanups.
+ Respect segment stop when emiting EOS or SEGMENT_DONE.
+ Fixes (#337945).
+
+2006-04-11 10:45:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gststreamselector.c: Don't leak pad name.
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_get_property):
+ Don't leak pad name.
+
+2006-04-11 09:42:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bug #336617 closed by recent commit
+ Original commit message from CVS:
+ Mention bug #336617 closed by recent commit
+
+2006-04-10 20:32:46 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/: so that FC4 buildslaves can pass.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst-plugins-base.supp:
+ Suppress an old libtheora bug (fixed in more recent versions), so
+ that FC4 buildslaves can pass.
+
+2006-04-10 19:13:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Don't leak events.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_src_query),
+ (gst_ogg_demux_receive_event), (gst_ogg_pad_event),
+ (gst_ogg_demux_init), (gst_ogg_demux_finalize),
+ (gst_ogg_demux_sink_event), (gst_ogg_demux_get_data),
+ (gst_ogg_demux_loop):
+ Don't leak events.
+ Remember what error we got when finding chains, if we
+ were shutdown, that would not be an error.
+
+2006-04-10 17:05:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Starting the ringbuffer when we did not acquire it can cause a deadlock, is po...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_event):
+ Starting the ringbuffer when we did not acquire it can cause
+ a deadlock, is pointless and causes nasty things for
+ subclasses.
+ Fixes gst-launch audiotestsrc num-buffers=0 ! alsasink.
+
+2006-04-10 15:17:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Add some more debugging.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_src_query),
+ (gst_ogg_demux_receive_event), (gst_ogg_pad_event),
+ (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_submit_buffer), (gst_ogg_demux_get_data),
+ (gst_ogg_demux_deactivate_current_chain),
+ (gst_ogg_demux_activate_chain), (gst_ogg_demux_perform_seek),
+ (gst_ogg_demux_bisect_forward_serialno),
+ (gst_ogg_demux_find_chains), (gst_ogg_demux_chain):
+ Add some more debugging.
+
+2006-04-10 14:52:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * ext/theora/theoraenc.c:
+ fix width of docs
+ Original commit message from CVS:
+ fix width of docs
+
+2006-04-10 10:29:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Some more debug info.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_src_event),
+ (theora_handle_data_packet):
+ Some more debug info.
+ * tests/examples/seek/seek.c: (start_seek), (main):
+ Print element messages too.
+
+2006-04-09 17:14:22 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/audioresample/debug.h: replace debug macros with variable number of parameters by a simple alias to gstreamer sta...
+ Original commit message from CVS:
+ * gst/audioresample/debug.h:
+ replace debug macros with variable number of parameters
+ by a simple alias to gstreamer standard debug macros
+ (#define RESAMPLE_ERROR GST_ERROR, __VA_ARGS__ is not
+ supported by MSVC 6.0 and 7.1)
+ * gst/audioresample/resample.h:
+ define M_PI and rint for WIN32
+ * win32/common/libgstaudio.def:
+ * win32/common/libgstriff.def:
+ * win32/common/libgsttag.def:
+ * win32/common/libgstvideo.def:
+ add new exported functions
+ * win32/vs6:
+ update project files
+
+2006-04-08 21:02:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent)
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixeroptions.c:
+ (gst_alsa_mixer_options_class_init):
+ * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_class_init):
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_class_init):
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init):
+ * ext/ogg/gstoggparse.c: (gst_ogg_parse_class_init):
+ * gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_class_init):
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ (gst_audio_filter_class_init):
+ * gst-libs/gst/audio/gstaudiosink.c:
+ (gst_audioringbuffer_class_init):
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ (gst_audioringbuffer_class_init):
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_class_init):
+ * gst-libs/gst/interfaces/colorbalancechannel.c:
+ (gst_color_balance_channel_class_init):
+ * gst-libs/gst/interfaces/mixeroptions.c:
+ (gst_mixer_options_class_init):
+ * gst-libs/gst/interfaces/mixertrack.c:
+ (gst_mixer_track_class_init):
+ * gst-libs/gst/interfaces/tunerchannel.c:
+ (gst_tuner_channel_class_init):
+ * gst-libs/gst/interfaces/tunernorm.c: (gst_tuner_norm_class_init):
+ * gst-libs/gst/netbuffer/gstnetbuffer.c:
+ (gst_netbuffer_class_init):
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_class_init):
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init):
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init):
+ * gst/playback/gstplaybin.c: (gst_play_bin_class_init):
+ * gst/playback/gststreaminfo.c: (gst_stream_info_class_init):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_class_init):
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init):
+ * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init):
+ * sys/v4l/gstv4lcolorbalance.c:
+ (gst_v4l_color_balance_channel_class_init):
+ * sys/v4l/gstv4ljpegsrc.c: (gst_v4ljpegsrc_class_init):
+ * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init):
+ * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init):
+ * sys/v4l/gstv4ltuner.c: (gst_v4l_tuner_channel_class_init),
+ (gst_v4l_tuner_norm_class_init):
+ * sys/ximage/ximagesink.c: (gst_ximagesink_class_init):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_class_init):
+ * tests/old/testsuite/alsa/sinesrc.c: (sinesrc_class_init):
+ Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent)
+
+2006-04-08 18:09:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix broken GObject macros
+ Original commit message from CVS:
+ * ext/pango/gsttextrender.h:
+ * gst-libs/gst/audio/gstaudiosink.h:
+ * gst-libs/gst/audio/gstaudiosrc.h:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ * gst-libs/gst/video/gstvideofilter.h:
+ * gst-libs/gst/video/gstvideosink.h:
+ * gst/playback/gstplaybasebin.h:
+ * gst/tcp/gstmultifdsink.h:
+ * sys/v4l/gstv4lelement.h:
+ Fix broken GObject macros
+
+2006-04-08 16:21:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/alsa/gstalsasink.c: More debug to trace why my USB headset is not working with gst
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (set_hwparams), (alsasink_parse_spec):
+ More debug to trace why my USB headset is not working with gst
+
+2006-04-07 17:18:11 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybasebin.c: Clean up our group elements properly in the case where it never got committed - it sti...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (group_destroy):
+ Clean up our group elements properly in the case where it never
+ got committed - it still got added unconditionally to the bin.
+
+2006-04-07 15:14:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Unref unhandled events.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_dec_sink_event),
+ (theora_handle_data_packet), (theora_dec_chain):
+ Unref unhandled events.
+ Protect against empty buffers.
+ Perform QoS on running time.
+
+2006-04-07 13:24:54 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/vorbis/vorbisenc.c: Remove leaks from vorbisenc.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_set_header_on_caps),
+ (gst_vorbis_enc_chain):
+ Remove leaks from vorbisenc.
+ Mostly minor changes, the only significant one is that now the
+ buffers we set as 'streamheader' on the caps are copies of the
+ original buffers, to avoid circular refcounting problems.
+
+2006-04-07 09:51:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybasebin.c: Don't remove our mute-probe if someone else already did so.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (mute_stream), (setup_substreams):
+ Don't remove our mute-probe if someone else already did so.
+ Don't set a 2nd one if there is already one pending on the pad.
+ * gst/playback/gstplaybin.c: (gst_play_bin_send_event_to_sink),
+ (do_playbin_seek):
+ When a seek fails, ensure that playbin is still set back to playing.
+ * gst/typefind/gsttypefindfunctions.c: (mpeg_ts_probe_headers),
+ (mpeg_ts_type_find), (plugin_init):
+ Add a typefind function for mpeg-ts streams.
+
+2006-04-06 11:40:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ * gst/videorate/gstvideorate.c:
+ gst/videorate/gstvideorate.c (gst_video_rate_reset)
+ Original commit message from CVS:
+ 2006-04-06 Andy Wingo <wingo@pobox.com>
+ * gst/videorate/gstvideorate.c (gst_video_rate_reset)
+ (gst_video_rate_init): Caps-related parameters should not be reset
+ by a flush -- move their inits to the instance init function.
+ (gst_video_rate_flush_prev): Don't complain if gst_pad_push
+ is not OK, just return the result.
+ * gst/audiotestsrc/gstaudiotestsrc.c
+ (gst_audio_test_src_class_init)
+ (gst_audio_test_src_get_times): Re-enable is-live=true, as was
+ broken by Stefan's commit on 24 March.
+
+2006-04-06 10:50:14 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/ogg/gstoggmux.c (gst_ogg_mux_push_buffer): Set caps on buffers being pushed out. Fixes oggmux ! multifdsink.
+ Original commit message from CVS:
+ 2006-04-06 Andy Wingo <wingo@pobox.com>
+ * ext/ogg/gstoggmux.c (gst_ogg_mux_push_buffer): Set caps on
+ buffers being pushed out. Fixes oggmux ! multifdsink.
+
+2006-04-05 13:05:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/vorbis/: Remove left-over 0.8 cruft; use GST_DEBUG_FUNCPTR; make vorbisenc adhere to the official nomenclature; u...
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_class_init),
+ (gst_vorbis_dec_init), (vorbis_dec_finalize):
+ * ext/vorbis/vorbisdec.h:
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_add_interfaces),
+ (gst_vorbis_enc_base_init), (gst_vorbis_enc_class_init),
+ (gst_vorbis_enc_sink_setcaps), (gst_vorbis_enc_convert_src),
+ (gst_vorbis_enc_convert_sink), (gst_vorbis_enc_get_query_types),
+ (gst_vorbis_enc_src_query), (gst_vorbis_enc_sink_query),
+ (gst_vorbis_enc_init), (gst_vorbis_enc_get_tag_value),
+ (gst_vorbis_enc_metadata_set1), (gst_vorbis_enc_set_metadata),
+ (gst_vorbis_enc_setup), (gst_vorbis_enc_clear),
+ (gst_vorbis_enc_buffer_from_packet),
+ (gst_vorbis_enc_buffer_from_header_packet),
+ (gst_vorbis_enc_push_buffer), (gst_vorbis_enc_push_packet),
+ (gst_vorbis_enc_set_header_on_caps), (gst_vorbis_enc_sink_event),
+ (gst_vorbis_enc_chain), (gst_vorbis_enc_output_buffers),
+ (gst_vorbis_enc_get_property), (gst_vorbis_enc_set_property),
+ (gst_vorbis_enc_change_state):
+ * ext/vorbis/vorbisenc.h:
+ Remove left-over 0.8 cruft; use GST_DEBUG_FUNCPTR; make
+ vorbisenc adhere to the official nomenclature; use boilerplate
+ macro.
+
+2006-04-04 11:20:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/videorate/gstvideorate.c (gst_video_rate_flush_prev): Whoops, fix bug introduced. Bad hacker!
+ Original commit message from CVS:
+ 2006-04-04 Andy Wingo <wingo@pobox.com>
+ * gst/videorate/gstvideorate.c (gst_video_rate_flush_prev):
+ Whoops, fix bug introduced. Bad hacker!
+
+2006-04-04 11:15:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/videorate/gstvideorate.c (gst_video_rate_flush_prev): Properly handle the case where you get EOS before any buffe...
+ Original commit message from CVS:
+ 2006-04-04 Andy Wingo <wingo@pobox.com>
+ * gst/videorate/gstvideorate.c (gst_video_rate_flush_prev):
+ Properly handle the case where you get EOS before any buffers are
+ received. Use gst_buffer_make_metadata_writable where appropriate.
+
+2006-04-04 10:16:46 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/theoradec.c (theora_handle_data_packet): This value is often negative -- make it signed so as not to wrap ...
+ Original commit message from CVS:
+ 2006-04-04 Andy Wingo <wingo@pobox.com>
+ * ext/theora/theoradec.c (theora_handle_data_packet): This value
+ is often negative -- make it signed so as not to wrap around.
+ Fixes segfaults introduced on 9 March.
+
+2006-04-03 16:43:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/: Don't try to store a gdouble in a gboolean.
+ Original commit message from CVS:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (theora_dec_src_event):
+ Don't try to store a gdouble in a gboolean.
+ Small cleanups.
+
+2006-04-03 12:55:18 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggmux.c: Oggmux sucks.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_queue_pads):
+ Oggmux sucks.
+ Make it suck slightly less by writing out the final page.
+ Still can't encode a vorbis-in-ogg file correctly, though.
+
+2006-04-03 08:49:06 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/theoraparse.c (theora_parse_drain_queue): Um, remove a g_print.
+ Original commit message from CVS:
+ 2006-04-03 Andy Wingo <wingo@pobox.com>
+ * ext/theora/theoraparse.c (theora_parse_drain_queue): Um, remove
+ a g_print.
+
+2006-04-03 08:32:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/theora.c (plugin_init): Register theoraparse.
+ Original commit message from CVS:
+ 2006-04-03 Andy Wingo <wingo@pobox.com>
+ * ext/theora/theora.c (plugin_init): Register theoraparse.
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c: New files implementing a theora
+ parser. Now we can properly remux ogg/theora+vorbis, yay.
+
+2006-04-03 08:28:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/vorbis/vorbisparse.c: Add some docs and a copyright.
+ Original commit message from CVS:
+ 2006-04-03 Andy Wingo <wingo@pobox.com>
+ * ext/vorbis/vorbisparse.c: Add some docs and a copyright.
+
+2006-04-01 15:34:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * configure.ac:
+ don't use AS_LIBTOOL_TAGS, it doesn't work
+ Original commit message from CVS:
+ don't use AS_LIBTOOL_TAGS, it doesn't work
+
+2006-04-01 11:41:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * ext/pango/gsttextoverlay.c:
+ * sys/v4l/gstv4lsrc.c:
+ remove BT8x8 from description, works for more devices
+ Original commit message from CVS:
+ remove BT8x8 from description, works for more devices
+
+2006-04-01 11:21:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: Fixed the sample pipeline (see #323798)
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ Fixed the sample pipeline (see #323798)
+
+2006-04-01 09:50:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ use AS_VERSION and AS_NANO more cleanups
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ use AS_VERSION and AS_NANO
+ more cleanups
+
+2006-03-31 17:08:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/vorbis/vorbisparse.c (vorbis_parse_sink_event): Fix uninitialized variable return that would happen.
+ Original commit message from CVS:
+ 2006-03-31 Andy Wingo <wingo@pobox.com>
+ * ext/vorbis/vorbisparse.c (vorbis_parse_sink_event): Fix
+ uninitialized variable return that would happen.
+
+2006-03-31 16:57:47 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/vorbis/vorbisparse.c (vorbis_parse_drain_queue): Fix uninitialized variable return that would never happen.
+ Original commit message from CVS:
+ 2006-03-31 Andy Wingo <wingo@pobox.com>
+ * ext/vorbis/vorbisparse.c (vorbis_parse_drain_queue): Fix
+ uninitialized variable return that would never happen.
+
+2006-03-31 16:43:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/vorbis/vorbisparse.c (gst_vorbis_parse_init)
+ Original commit message from CVS:
+ 2006-03-31 Andy Wingo <wingo@pobox.com>
+ * ext/vorbis/vorbisparse.c (gst_vorbis_parse_init)
+ (vorbis_parse_sink_event): Add an event function to flush our
+ state on a seek, and to drain buffers on a premature EOS.
+ (vorbis_parse_push_headers, vorbis_parse_clear_queue)
+ (vorbis_parse_push_buffer, vorbis_parse_drain_queue_prematurely)
+ (vorbis_parse_chain, vorbis_parse_queue_buffer)
+ (vorbis_parse_drain_queue): Queue up buffers until we can set
+ their timestamps and granulepos values.
+ * ext/vorbis/vorbisparse.h: Include the vorbis decoder headers,
+ and keep track of data needed for deriving granulepos and
+ timestamps for buffers.
+
+2006-03-30 11:05:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ expose pluginsdir so gonlin can use it for tests
+ Original commit message from CVS:
+ expose pluginsdir so gonlin can use it for tests
+
+2006-03-30 10:03:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-plugins-base.pc.in:
+ add ccda to libraries
+ Original commit message from CVS:
+ add ccda to libraries
+
+2006-03-29 14:00:08 +0000 j^ <j@bootlab.org>
+
+ better/unified long descriptions
+ Original commit message from CVS:
+ Patch by: j^ <j at bootlab dot org>
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_class_init):
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_class_init):
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c:
+ * ext/pango/gstclockoverlay.c:
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/pango/gsttimeoverlay.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/subparse/gstsubparse.c:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ better/unified long descriptions
+ Fixes #336477
+
+2006-03-29 13:54:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Don't let double and tripple clicks mess up our state.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (end_scrub), (seek_cb), (start_seek),
+ (stop_seek):
+ Don't let double and tripple clicks mess up our state.
+
+2006-03-28 13:13:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybin.c: Error out gracefully when we can't create any of the usual conversion elements for some re...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_video_element),
+ (gen_text_element), (gen_audio_element), (gen_vis_element):
+ Error out gracefully when we can't create any of the usual
+ conversion elements for some reason. Also, don't try to
+ create an audioscale (sic) element that's not used anyway.
+
+2006-03-28 10:21:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Don't post RESOURCE_NOT_FOUND error when we can't find a source element for a particul...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source):
+ Don't post RESOURCE_NOT_FOUND error when we can't find a source
+ element for a particular protocol, that's confusing for users.
+ Instead, post a RESOURCE_FAILED error, so that our own error
+ message is actually shown in totem etc. (#336303).
+
+2006-03-27 16:36:46 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Fix some minor memory leaks (#336194).
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_finalize),
+ (gst_gnome_vfs_src_get_icy_metadata):
+ Fix some minor memory leaks (#336194).
+
+2006-03-27 16:15:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/: Make gnomevfssink accept filenames as well as URIs for the "location" property, just like gnomevfssrc ...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfs.c:
+ (gst_gnome_vfs_location_to_uri_string):
+ * ext/gnomevfs/gstgnomevfs.h:
+ * ext/gnomevfs/gstgnomevfssink.c:
+ (gst_gnome_vfs_sink_set_property):
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_set_property):
+ Make gnomevfssink accept filenames as well as URIs for the
+ "location" property, just like gnomevfssrc does (and
+ filesrc/filesink do) (#336190).
+
+2006-03-24 20:35:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/generic/clock-selection.c: set to NULL before unreffing, fixes a valgrind leak.
+ Original commit message from CVS:
+ * tests/check/generic/clock-selection.c: (GST_START_TEST):
+ set to NULL before unreffing, fixes a valgrind leak.
+ Why was this not triggering the error that an object needs to
+ be NULL before unreffing ?
+ * win32/common/config.h:
+ update
+
+2006-03-24 17:57:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.*: Text subtitle files may or may not be UTF-8. If it's not, we don't really want to see '?'...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (convert_encoding),
+ (gst_sub_parse_change_state):
+ * gst/subparse/gstsubparse.h:
+ Text subtitle files may or may not be UTF-8. If it's not, we
+ don't really want to see '?' characters in place of non-ASCII
+ characters like accented characters. So let's assume the input
+ is UTF-8 until we come across text that is clearly not. If it's
+ not UTF-8, we don't really know what it is, so try the following:
+ (a) see whether the GST_SUBTITLE_ENCODING environment variable
+ is set; if not, check (b) if the current locale encoding is
+ non-UTF-8 and use that if it is, or (c) assume ISO-8859-15 if
+ the current locale encoding is UTF-8 and the environment variable
+ was not set to any particular encoding. Not perfect, but better
+ than nothing (and better than before, I think) (fixes #172848).
+
+2006-03-24 17:39:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/tmpl/.gitignore:
+ * tests/check/libs/.gitignore:
+ * tests/check/pipelines/.gitignore:
+ * tests/examples/volume/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2006-03-24 17:26:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: update core requirement to 0.10.4.1 because of async_playback vmethod on GstBaseSink
+ Original commit message from CVS:
+ 2006-03-24 Thomas Vander Stichele <thomas at apestaart dot org>
+ * configure.ac:
+ update core requirement to 0.10.4.1 because of async_playback
+ vmethod on GstBaseSink
+
+2006-03-24 17:11:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ use DEBUG_FUNCPTR for collectpads
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_init):
+ * gst/adder/gstadder.c: (gst_adder_init):
+ use DEBUG_FUNCPTR for collectpads
+
+2006-03-24 14:11:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ don't go through check-torture if no check installed
+ Original commit message from CVS:
+ don't go through check-torture if no check installed
+
+2006-03-24 10:42:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add docs for adder, use GST_ELEMENT_DETAILS macro, define GstElementDetails at the top
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_base_init),
+ (gst_gnome_vfs_sink_class_init):
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_base_init):
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_base_init):
+ * ext/ogg/gstoggmux.c:
+ * ext/ogg/gstoggparse.c: (gst_ogg_parse_base_init):
+ * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_base_init),
+ (gst_ogm_video_parse_base_init), (gst_ogm_text_parse_base_init):
+ * ext/pango/gsttextoverlay.c:
+ * ext/pango/gsttextrender.c:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/vorbis/vorbisdec.c:
+ * ext/vorbis/vorbisenc.c:
+ * gst-libs/gst/audio/gstaudiofilter.c:
+ (gst_audio_filter_base_init):
+ * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+ (gst_audio_filter_template_base_init):
+ * gst/adder/gstadder.c: (gst_adder_get_type):
+ * gst/adder/gstadder.h:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audiostestsrc_wave_get_type), (gst_audio_test_src_class_init),
+ (gst_audio_test_src_create):
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_base_init):
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_base_init):
+ * gst/volume/gstvolume.c:
+ * sys/v4l/gstv4lmjpegsink.c:
+ * sys/v4l/gstv4lmjpegsrc.c:
+ * tests/check/libs/cddabasesrc.c:
+ * tests/old/examples/gob/gst-identity2.gob:
+ Add docs for adder, use GST_ELEMENT_DETAILS macro,
+ define GstElementDetails at the top
+
+2006-03-23 21:48:18 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstinterfaces.def: Add a lot of export functions for gst-python
+ Original commit message from CVS:
+ * win32/common/libgstinterfaces.def:
+ Add a lot of export functions for gst-python
+ * win32/common/libgstinterfaces.dsp:
+ Add a missing include folder in the project configuration
+
+2006-03-23 16:58:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: Fix audio sources, forgot to make the ringbuffer startable...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_get_time), (gst_base_audio_src_create),
+ (gst_base_audio_src_change_state):
+ Fix audio sources, forgot to make the ringbuffer
+ startable...
+
+2006-03-23 16:29:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosrc.c: unparent instead of unref the ringbuffer.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_get_time), (gst_base_audio_src_create),
+ (gst_base_audio_src_change_state):
+ unparent instead of unref the ringbuffer.
+
+2006-03-23 16:24:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Implement new async_play vmethod to start slaving and allow playback start in ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init), (gst_base_audio_sink_async_play),
+ (gst_base_audio_sink_do_play), (gst_base_audio_sink_change_state):
+ Implement new async_play vmethod to start slaving and allow
+ playback start in case of async PLAY state changes.
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_init):
+ Enable QoS with new method in base class.
+
+2006-03-23 11:18:19 +0000 Julien MOUTTE <julien@moutte.net>
+
+ gst/videotestsrc/gstvideotestsrc.c: Partially handle 0 framerate, only EOS after the first frame is missing.
+ Original commit message from CVS:
+ Patch by: Julien MOUTTE <julien at moutte dot net>
+ * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_query),
+ (gst_video_test_src_do_seek), (gst_video_test_src_create):
+ Partially handle 0 framerate, only EOS after the first frame
+ is missing.
+
+2006-03-23 09:38:59 +0000 Fabrizio Gennari <fabrizio.ge@tiscali.it>
+
+ gst/: Patch for support of YVU9 AVI files (#334822)
+ Original commit message from CVS:
+ Patch by: Fabrizio Gennari <fabrizio dot ge at tiscali dot it>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ * 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:
+ Patch for support of YVU9 AVI files (#334822)
+
+2006-03-22 15:29:25 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/design/design-decodebin.txt: Added design document for new decodebin text/x-pango-markup is also a default targe...
+ Original commit message from CVS:
+ * docs/design/design-decodebin.txt:
+ Added design document for new decodebin
+ (Target Caps): text/x-pango-markup is also a default target caps.
+
+2006-03-22 15:11:47 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/design/design-decodebin.txt: Added design document for new decodebin
+ Original commit message from CVS:
+ * docs/design/design-decodebin.txt:
+ Added design document for new decodebin
+
+2006-03-22 12:33:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Since we _parent the ringbuffer, we also need to _unparent instead of a plain ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_dispose):
+ Since we _parent the ringbuffer, we also need to
+ _unparent instead of a plain _unref.
+
+2006-03-22 12:28:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/seek.c: Add scrub checkbox.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (end_scrub), (do_seek), (seek_cb),
+ (stop_seek), (scrub_toggle_cb), (main):
+ Add scrub checkbox.
+
+2006-03-21 17:47:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstoggparse.c: Fix very inefficient usage of linked lists (#335365).
+ Original commit message from CVS:
+ * ext/ogg/gstoggparse.c: (gst_ogg_parse_find_stream),
+ (gst_ogg_parse_chain):
+ Fix very inefficient usage of linked lists (#335365).
+
+2006-03-21 14:26:01 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gcc 4.1 unreferenced pointer fixes.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_dispose):
+ * gst/playback/gstplaybin.c: (handoff):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_set_property):
+ gcc 4.1 unreferenced pointer fixes.
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_put):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put):
+ gst_buffer_ref() now takes a GstBuffer*.
+
+2006-03-20 18:09:41 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.c: Fix a memleak reported by Jan Schmidt.
+ Original commit message from CVS:
+ 2006-03-20 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c:
+ (gst_xvimagesink_get_format_from_caps): Fix a memleak reported
+ by Jan Schmidt.
+
+2006-03-19 11:37:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Can't do tag preferences via probability, as tags would then lose against types ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (id3v2_type_find),
+ (id3v1_type_find), (apetag_type_find), (plugin_init):
+ Can't do tag preferences via probability, as tags would then
+ lose against types that are recognised with MAXIMUM probability
+ (like .wav); so let all tag typefinders return MAXIMUM themselves
+ and order them via the rank. Split ID3v1 and ID3v2 typefinders so
+ that we can prefer APE to ID3v1 (fixes #335028).
+
+2006-03-17 17:48:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/: Only start playback if we are playing. should fix #330748.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_change_state):
+ * gst-libs/gst/audio/gstringbuffer.c: (wait_segment),
+ (gst_ring_buffer_may_start):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Only start playback if we are playing.
+ should fix #330748.
+
+2006-03-17 13:11:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Revert accidental commits to these files.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_getcaps):
+ * win32/common/config.h:
+ Revert accidental commits to these files.
+
+2006-03-16 20:01:03 +0000 Michal Benes <michal.benes@xeris.cz>
+
+ tests/Makefile.am: Don't try to build tests in tests/icles if we don't have X (#323852)
+ Original commit message from CVS:
+ Patch by: Michal Benes <michal dot benes at xeris dot cz>
+ * tests/Makefile.am:
+ Don't try to build tests in tests/icles if we
+ don't have X (#323852)
+
+2006-03-16 13:08:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstid3tag.c: Add TXXX frame identifiers for replaygain stuff as used by some taggers (see #323721).
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Add TXXX frame identifiers for replaygain stuff as used
+ by some taggers (see #323721).
+
+2006-03-16 10:22:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gststreamselector.c: Preserve the existing buggy streamselector behaviour by performing a fallback buffe...
+ Original commit message from CVS:
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_set_property),
+ (gst_stream_selector_bufferalloc):
+ Preserve the existing buggy streamselector behaviour by performing
+ a fallback buffer allocation when downstream isn't linked yet.
+ This should really be fixed in playbin by blocking pads until it's
+ linked them.
+ Also, use gst_pad_alloc_buffer instead of
+ gst_pad_alloc_buffer_and_set.
+
+2006-03-15 22:40:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstid3tag.c: Don't crash on unknown ID3v2 TXXX frames.
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Don't crash on unknown ID3v2 TXXX frames.
+
+2006-03-15 17:59:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/alsa/gstalsasink.c: Chain up to the parent finalize method.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_finalise):
+ Chain up to the parent finalize method.
+ Add 32-bit sample size to the template caps.
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add the fourcc that the VMWare codec uses.
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_set_property),
+ (gst_stream_selector_bufferalloc),
+ (gst_stream_selector_request_new_pad):
+ For the active pad, forward buffer-alloc requests, otherwise
+ return GST_FLOW_NOT_LINKED. This also prevents xvimagesink
+ having to memcpy every frame when used by playbin.
+ * gst/tcp/gstmultifdsink.c:
+ (gst_multi_fd_sink_handle_client_write):
+ Get negotiated caps from the sink pad, rather than the sink
+ pad's peer.
+
+2006-03-15 17:11:34 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Don't forget to set src->callbacks_pushed to FALSE again when popping them, otherwise ...
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_pop_callbacks):
+ Don't forget to set src->callbacks_pushed to FALSE again when
+ popping them, otherwise re-activation in a different mode won't
+ work (#334620).
+
+2006-03-15 11:30:29 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Replace __VA_ARGS__ caps creation macros with varargs functions. looks nice...
+ Original commit message from CVS:
+ Patch by: Sebastien Moutte <sebastien moutte net>
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ff_vid_caps_new),
+ (gst_ff_aud_caps_new), (gst_ffmpeg_pixfmt_to_caps),
+ (gst_ffmpeg_smpfmt_to_caps):
+ Replace __VA_ARGS__ caps creation macros with varargs functions.
+ Makes things compile on MSVC (#320765), looks nicer, and we can
+ tell the compiler to check for the NULL terminator.
+
+2006-03-14 15:13:04 +0000 Fabrizio Gennari <fabrizio.ge@tiscali.it>
+
+ gst-libs/gst/riff/riff-media.c: Make sure the buffer we copy into is really always big enough, this time for real (#3...
+ Original commit message from CVS:
+ Patch by: Fabrizio Gennari <fabrizio dot ge at tiscali dot it>
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Make sure the buffer we copy into is really always big
+ enough, this time for real (#333488).
+
+2006-03-14 13:16:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Add support for 24bpp DIB (#305279).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Add support for 24bpp DIB (#305279).
+
+2006-03-14 11:11:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Re-enable QoS after the release.
+ Original commit message from CVS:
+ * gst-libs/gst/video/gstvideofilter.c: (gst_video_filter_init):
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_init):
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_init):
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init),
+ (gst_video_scale_init), (gst_video_scale_src_event):
+ Re-enable QoS after the release.
+ Rework videoscale to use the base class src_event handler.
+
+2006-03-14 09:51:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: back to CVS.
+ Original commit message from CVS:
+ * configure.ac:
+ back to CVS.
+
+=== release 0.10.5 ===
+
+2006-03-13 19:50:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/config.h:
+ releasing 0.10.5
+ Original commit message from CVS:
+ releasing 0.10.5
+
+2006-03-13 17:28:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * 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-03-13 11:17:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/plugins/Makefile.am: Part of previous cdparanoiasrc docs fixes, forgot to commit.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ Part of previous cdparanoiasrc docs fixes, forgot to commit.
+
+2006-03-12 14:56:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/plugins/: Add cdparanoiasrc to docs.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ Add cdparanoiasrc to docs.
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ More GstCddaBaseSrc docs.
+
+2006-03-12 13:47:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new API to libgsttag: gst_tag_from_id3_user_tag().
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstid3tag.c: (gst_tag_from_id3_user_tag):
+ * gst-libs/gst/tag/tag.h:
+ Add new API to libgsttag: gst_tag_from_id3_user_tag().
+
+2006-03-11 19:47:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: NULL-terminate array of mpeg4 video file extensions.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ NULL-terminate array of mpeg4 video file extensions.
+ Fixes crash on PPC (#334226).
+
+2006-03-11 16:40:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: gnome_vfs_uri_is_local() alone is not a good indicator whether we can operate in pull-...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ (gst_gnome_vfs_src_check_get_range):
+ gnome_vfs_uri_is_local() alone is not a good indicator
+ whether we can operate in pull-mode with a specific URI,
+ as it returns FALSE for file:// URIs that point to an
+ NFS-mounted path. Be more conservative here: whitelist
+ local files, blacklist http URIs and use the old
+ mechanism for anything else (fixes #334216).
+
+2006-03-10 19:15:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: back to trunk
+ Original commit message from CVS:
+ * configure.ac:
+ back to trunk
+
+=== release 0.10.4 ===
+
+2006-03-10 19:05:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * docs/upload.mak:
+ * win32/common/config.h:
+ releasing 0.10.4
+ Original commit message from CVS:
+ releasing 0.10.4
+
+2006-03-10 12:37:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/video/gstvideosink.c: Disable max-lateness by setting it to -1 for now, so that we can bed QoS stuff in ...
+ Original commit message from CVS:
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_init):
+ Disable max-lateness by setting it to -1 for now, so that
+ we can bed QoS stuff in thoroughly between now and the next
+ release.
+
+2006-03-10 11:09:23 +0000 Fabrizio <fabrizio.ge@tiscali.it>
+
+ gst-libs/gst/riff/riff-media.c: Make sure we don't read beyond the palette buffer in case of
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Make sure we don't read beyond the palette buffer in case of
+ broken or manipulated files (#333488, patch by: Fabrizio
+ Gennari)
+
+2006-03-10 10:44:02 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Fix for variable not initialized.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset):
+ Fix for variable not initialized.
+
+2006-03-09 19:02:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * docs/libs/tmpl/gstringbuffer.sgml:
+ * 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:
+ * win32/common/config.h:
+ prereleasing
+ Original commit message from CVS:
+ prereleasing
+
+2006-03-09 17:58:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: Small cleanups.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_get_type),
+ (gst_visual_src_setcaps), (gst_vis_src_negotiate),
+ (gst_visual_chain):
+ Small cleanups.
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_init),
+ (gst_theora_dec_reset), (_theora_granule_time),
+ (theora_dec_src_convert), (theora_dec_sink_convert),
+ (theora_dec_src_query), (theora_dec_src_event),
+ (theora_dec_sink_event), (theora_handle_comment_packet),
+ (theora_handle_header_packet), (theora_dec_push),
+ (theora_handle_data_packet), (theora_dec_chain),
+ (theora_dec_change_state):
+ Add simple QoS.
+
+2006-03-09 17:50:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Some cleanups.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init),
+ (audiocast_register_listener), (gst_gnome_vfs_src_start):
+ Some cleanups.
+
+2006-03-09 17:45:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Don't try to activate NULL chains.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_activate_chain):
+ Don't try to activate NULL chains.
+
+2006-03-09 16:30:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Fix invalid memory access to region before peek'd data (#332964).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset):
+ Fix invalid memory access to region before peek'd data (#332964).
+
+2006-03-09 15:05:03 +0000 Christophe Fergeau <teuf@gnome.org>
+
+ closes #333510.
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init):
+ * ext/pango/gsttextrender.c: (gst_text_render_init):
+ * gst/adder/gstadder.c: (gst_adder_init):
+ Don't leak padtemplates, patch by Christophe Fergeau,
+ closes #333510.
+
+2006-03-09 12:56:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Fix invalid memory access: make sure string passed to regexec() is NUL-termianted.
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (gst_subparse_type_find):
+ Fix invalid memory access: make sure string passed to
+ regexec() is NUL-termianted.
+
+2006-03-09 12:37:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Refactor mpeg/audio typefinding to make it more maintainable and easier to fine-...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset),
+ (mp3_type_find):
+ Refactor mpeg/audio typefinding to make it more maintainable
+ and easier to fine-tune. Make probing into middle of the file
+ work properly (fixes #333900, also see #152688).
+
+2006-03-09 11:10:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Remove part from previous commit that was bogus: g_utf8_validate() does in fact ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ (utf8_type_find_have_valid_utf8_at_offset):
+ Remove part from previous commit that was bogus:
+ g_utf8_validate() does in fact not accept embedded
+ zeroes, so we don't need to check for those (thanks
+ to Mike for the hint).
+
+2006-03-08 17:11:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Make plain/text typefinder more conservative: firstly, check for embedded zeroes...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c:
+ (utf8_type_find_count_embedded_zeroes),
+ (utf8_type_find_have_valid_utf8_at_offset), (utf8_type_find):
+ Make plain/text typefinder more conservative: firstly, check
+ for embedded zeroes, which are perfectly valid UTF-8 characters,
+ but also a fairly good sign that something is not a plain text
+ file; secondly, probe into the middle of the file if possible.
+ If we can't probe into the middle, limit the probability value
+ to be returned to TYPE_FIND_POSSIBLE (see #333900).
+
+2006-03-08 11:34:45 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/typefind/gsttypefindfunctions.c: Make typefind function name for mpeg4 video unique.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Make typefind function name for mpeg4 video unique.
+
+2006-03-08 09:53:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/libvisual/visual.c: Cleanups, post nice errors.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_init),
+ (gst_visual_clear_actors), (gst_visual_dispose),
+ (gst_visual_reset), (gst_visual_src_setcaps),
+ (gst_visual_sink_setcaps), (gst_vis_src_negotiate),
+ (gst_visual_sink_event), (gst_visual_src_event), (get_buffer),
+ (gst_visual_chain), (gst_visual_change_state):
+ Cleanups, post nice errors.
+ Handle sink and src events.
+ Implement simple QoS.
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_init):
+ Use new basesink methods to configure max-lateness.
+ Small doc update.
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_transform_caps), (gst_ffmpegcsp_set_caps):
+ Debug statement cleanups.
+ * gst/volume/gstvolume.c: (gst_volume_class_init):
+ Simple cleanup.
+
+2006-03-08 09:50:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Revert API/ABI break from March 1. Keep 'halign' and 'valign' as string type properties, ...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init),
+ (gst_text_overlay_init), (gst_text_overlay_set_property),
+ (gst_text_overlay_get_property):
+ Revert API/ABI break from March 1. Keep 'halign' and 'valign'
+ as string type properties, but mark them deprecated. Add
+ 'halignment' and 'valignment' properties that use enums
+ instead of strings.
+
+2006-03-08 09:37:12 +0000 Fabrizio <fabrizio.ge@tiscali.it>
+
+ gst-libs/gst/riff/riff-media.c: Allow palettes with less than 256 colours in AVI files
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Allow palettes with less than 256 colours in AVI files
+ (#333488, patch by: Fabrizio Gennari).
+
+2006-03-07 21:56:09 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Fix wrong EOS handling on text pad. We were releasing the queued text buffer when we shou...
+ Original commit message from CVS:
+ 2006-03-07 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_text_event),
+ (gst_text_overlay_video_event): Fix wrong EOS handling on text
+ pad. We were releasing the queued text buffer when we should keep
+ it until video pad gets EOS or discard the text buffer because it's
+ too old. That was eating the last subtitle buffer. Add some more
+ debug.
+
+2006-03-07 17:28:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Fix invalid memory access (we can't access a buffer after it's been pushed downstream wit...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_render_text),
+ (gst_text_overlay_video_chain):
+ Fix invalid memory access (we can't access a buffer after it's been
+ pushed downstream without taking a reference); fix memory leak (if
+ there's no text to render, bail out before allocating stuff).
+
+2006-03-07 15:08:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.*: If input is plain text, escape it before passing it to pango_layout_set_markup().
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init),
+ (gst_text_overlay_setcaps_txt), (gst_text_overlay_video_chain):
+ * ext/pango/gsttextoverlay.h:
+ If input is plain text, escape it before passing it to
+ pango_layout_set_markup().
+
+2006-03-07 13:01:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstaudiofilter.c: Don't ignore flow return from gst_pad_push().
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_chain):
+ Don't ignore flow return from gst_pad_push().
+
+2006-03-07 12:49:03 +0000 Christophe Fergeau <teuf@gnome.org>
+
+ Don't leak references returned by gst_pad_get_parent()
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_getcaps),
+ (gst_visual_src_setcaps), (gst_visual_sink_setcaps):
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_sinkconnect):
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_convert_src),
+ (gst_vorbisenc_convert_sink):
+ * gst-libs/gst/audio/audio.c: (gst_audio_frame_byte_size),
+ (gst_audio_duration_from_pad_buffer):
+ * gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_link),
+ (gst_audio_filter_chain):
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps):
+ * gst-libs/gst/video/video.c: (gst_video_frame_rate),
+ (gst_video_get_size):
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_setcaps):
+ Don't leak references returned by gst_pad_get_parent()
+ (#333663, based on patch by: Christophe Fergeau).
+
+2006-03-06 20:52:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/gnomevfs/gstgnomevfssink.c: change location param details
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init):
+ change location param details
+ * gst/volume/gstvolume.c: (plugin_init):
+ correct plugin description
+
+2006-03-06 20:07:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Override GstBaseSrc::check_get_range() in order to avoid opening the resource just to ...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init),
+ (gst_gnome_vfs_src_check_get_range):
+ Override GstBaseSrc::check_get_range() in order to avoid opening
+ the resource just to check whether we can operate in pull-mode or
+ not - we can predict that pretty well from the URI alone. Should
+ fix problems with last.fm (#331690). (Requires latest core CVS).
+
+2006-03-06 16:18:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/video/gstvideosink.c: Throw away frames that are later than 20 ms.
+ Original commit message from CVS:
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_init),
+ (gst_video_sink_class_init):
+ Throw away frames that are later than 20 ms.
+
+2006-03-06 14:14:47 +0000 Fabrizio <fabrizio.ge@tiscali.it>
+
+ gst-libs/gst/riff/riff-media.c:
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Set depth on WMA caps (#333545, patch by: Fabrizio Gennari).
+
+2006-03-05 23:39:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/ogg/gstoggmux.c: put Theora BOS pages before others. This hardcodes the Ogg/Theora I profile, but hey.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_buffer_from_page),
+ (gst_ogg_mux_send_headers), (gst_ogg_mux_collected):
+ put Theora BOS pages before others. This hardcodes
+ the Ogg/Theora I profile, but hey.
+
+2006-03-05 23:06:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ changed more than 5 lines
+ Original commit message from CVS:
+ changed more than 5 lines
+
+2006-03-05 22:57:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ogg muxing of vorbis and theora now has pages ordered correctly again, even with delays.
+ Original commit message from CVS:
+ ogg muxing of vorbis and theora now has pages ordered correctly again,
+ even with delays.
+ * ext/ogg/README:
+ updated with some examples
+ * ext/theora/theoraenc.c: (granulepos_to_timestamp),
+ (granulepos_add), (theora_buffer_from_packet):
+ * ext/vorbis/vorbisenc.c: (granulepos_to_timestamp_offset),
+ (granulepos_to_timestamp), (gst_vorbisenc_buffer_from_packet),
+ (gst_vorbisenc_chain):
+ implement strategy from ext/ogg/README
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_buffer_from_page),
+ (gst_ogg_mux_push_buffer), (gst_ogg_mux_dequeue_page),
+ (gst_ogg_mux_pad_queue_page), (gst_ogg_mux_compare_pads),
+ (gst_ogg_mux_queue_pads), (gst_ogg_mux_collected):
+ Fix muxer so that oggz-validate is happy with all streams;
+ except for no eos mark, and the BOS page ordering
+ * tests/check/pipelines/theoraenc.c: (check_buffer_is_header),
+ (check_buffer_granulepos):
+ * tests/check/pipelines/vorbisenc.c: (check_buffer_granulepos):
+ update tests to check for OFFSET being set as requested
+ fixed type of granulepos, it's not a ClockTime
+
+2006-03-05 21:34:23 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.c: Check that the xvimage we are creating has a correct size before returning it. (#3...
+ Original commit message from CVS:
+ 2006-03-05 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
+ (gst_xvimagesink_show_frame), (gst_xvimagesink_buffer_alloc):
+ Check that the xvimage we are creating has a correct size before returning it. (#314897)
+
+2006-03-05 13:44:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Give id3 and ape tag typefinders a rank slightly higher than PRIMARY to ensure t...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Give id3 and ape tag typefinders a rank slightly higher
+ than PRIMARY to ensure they're always run before any of
+ the other typefinders (in particular wav and mp3) (#324186).
+
+2006-03-05 13:08:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Add support for '3IVD' fourcc (#333403).
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Add support for '3IVD' fourcc (#333403).
+
+2006-03-04 14:35:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Bump requirements to GStreamer CVS for the new error enum.
+ Original commit message from CVS:
+ * configure.ac:
+ Bump requirements to GStreamer CVS for the new error enum.
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_render):
+ Emit new GST_RESOURCE_ERROR_NO_SPACE_LEFT when there's no
+ space left on the device (fixes #333352).
+
+2006-03-03 23:53:50 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs6: add a project file for libgstvolume update the workspace
+ Original commit message from CVS:
+ * win32/vs6:
+ add a project file for libgstvolume
+ update the workspace
+
+2006-03-03 15:26:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/README:
+ * ext/ogg/gstoggmux.c:
+ debug updates
+ Original commit message from CVS:
+ debug updates
+
+2006-03-03 15:22:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Fix for http://bugzilla.gnome.org/show_bug.cgi?id=333254
+ Original commit message from CVS:
+ 2006-03-03 Thomas Vander Stichele <thomas at apestaart dot org>
+ * ext/theora/theoraenc.c: (theora_set_header_on_caps):
+ * tests/check/pipelines/theoraenc.c: (check_buffer_is_header),
+ (GST_START_TEST):
+ Fix for http://bugzilla.gnome.org/show_bug.cgi?id=333254
+ Set IN_CAPS on header buffers
+
+2006-03-02 18:23:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/plugins/: Add audioresample to docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ Add audioresample to docs.
+ * gst/audioconvert/gstaudioconvert.c:
+ Add revision date.
+ * gst/audioresample/gstaudioresample.c:
+ (gst_audioresample_base_init), (gst_audioresample_class_init),
+ (gst_audioresample_init), (gst_audioresample_dispose),
+ (audioresample_get_unit_size), (audioresample_transform_caps),
+ (resample_set_state_from_caps), (audioresample_transform_size),
+ (audioresample_set_caps), (audioresample_event),
+ (audioresample_do_output), (audioresample_transform),
+ (audioresample_pushthrough), (gst_audioresample_set_property),
+ (gst_audioresample_get_property), (plugin_init):
+ * gst/audioresample/gstaudioresample.h:
+ Added docs.
+ Small code cleanups.
+
+2006-03-02 18:12:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/videorate/Makefile.am:
+ fix wim's commit
+ Original commit message from CVS:
+ fix wim's commit
+
+2006-03-02 17:48:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ debug using the actual GstPad, that allows us to see the serialno in the padname
+ Original commit message from CVS:
+ debug using the actual GstPad, that allows us to see the serialno in the padname
+
+2006-03-02 17:46:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/plugins/: Added videoscale to docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ Added videoscale to docs.
+ * gst/videorate/gstvideorate.c: (gst_video_rate_flush_prev),
+ (gst_video_rate_swap_prev), (gst_video_rate_event),
+ (gst_video_rate_chain):
+ Fix typo in docs.
+ * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init),
+ (gst_video_scale_init), (gst_video_scale_prepare_size),
+ (gst_video_scale_set_caps), (gst_video_scale_get_unit_size),
+ (gst_video_scale_fixate_caps), (gst_video_scale_transform):
+ * gst/videoscale/gstvideoscale.h:
+ Added docs, examples.
+ Some code cleanups.
+ Post errors instead of g_warning.
+
+2006-03-02 17:30:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ clean up debug messages
+ Original commit message from CVS:
+ clean up debug messages
+
+2006-03-02 17:15:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ extra debugging from older version, makes it easier to compare
+ Original commit message from CVS:
+ extra debugging from older version, makes it easier to compare
+
+2006-03-02 17:04:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ext/ogg/gstoggmux.c:
+ some space cleanup and debug fixes
+ Original commit message from CVS:
+ some space cleanup and debug fixes
+
+2006-03-02 16:47:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/: Added some more docs to libs and plugins.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ Added some more docs to libs and plugins.
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_prepare_read), (gst_ring_buffer_clear):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Document ringbuffer some more.
+ * gst/videorate/gstvideorate.c: (gst_video_rate_class_init),
+ (gst_video_rate_setcaps), (gst_video_rate_reset),
+ (gst_video_rate_init), (gst_video_rate_flush_prev),
+ (gst_video_rate_swap_prev), (gst_video_rate_event),
+ (gst_video_rate_chain), (gst_video_rate_change_state):
+ * gst/videorate/gstvideorate.h:
+ Fix videorate to use segments.
+ Make it work with 0/1 framerates (closes #331903)
+ Handle EOS correctly.
+ Added docs.
+
+2006-03-02 13:13:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstogmparse.c: In state change function, first chain up to parent class, then handle downwards state change s...
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_class_init),
+ (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init),
+ (gst_ogm_text_parse_init), (gst_ogm_parse_change_state):
+ In state change function, first chain up to parent class,
+ then handle downwards state change stuff. Remove some
+ commented out cruft from 0.8 code.
+
+2006-03-02 12:35:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/ogg/gstogmparse.c: Don't remove/re-add source pad if the new caps are the same as the old caps anyway (#333042). ...
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_init),
+ (gst_ogm_video_parse_init), (gst_ogm_text_parse_init),
+ (gst_ogm_parse_sink_convert), (gst_ogm_parse_sink_query),
+ (gst_ogm_parse_chain):
+ Don't remove/re-add source pad if the new caps are the same as
+ the old caps anyway (#333042). When removing source pad, don't
+ unref it afterwards - we didn't ref it when adding. Sprinkle some
+ GST_DEBUG_FUNCPTR goodness here and there. Don't leak references
+ after using gst_pad_get_parent(). Return downstream flow return
+ value in chain function.
+
+2006-03-02 11:28:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/plugins/: Fix hierarchy, added some more elements to the docs.
+ Original commit message from CVS:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.interfaces:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ Fix hierarchy, added some more elements to the docs.
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_get_type):
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ Fix docs for ffmpegcolorspace.
+
+2006-03-01 19:24:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Some typefinding fine-tuning:
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (id3_type_find),
+ (apetag_type_find), (ape_type_find), (plugin_init):
+ Some typefinding fine-tuning:
+ - rank ID3/APE tags in order of preference via probabilities, so that
+ ID3v2 > APEv2 > APEv1 > ID3v1.
+ - three or four bytes don't really justify MAXIMUM probability,
+ change those to 'very likely' (musepack and monkeysaudio).
+
+2006-03-01 18:25:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added alsa docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/alsa/gstalsamixer.c:
+ * ext/alsa/gstalsamixer.h:
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_class_init), (gst_alsa_mixer_element_init):
+ * ext/alsa/gstalsamixerelement.h:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasink.h:
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_class_init),
+ (gst_alsasrc_init):
+ * ext/alsa/gstalsasrc.h:
+ Added alsa docs.
+ Small code cleanups.
+
+2006-03-01 17:52:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/Makefile.am: Dist new header too,
+ Original commit message from CVS:
+ * ext/theora/Makefile.am:
+ Dist new header too,
+
+2006-03-01 17:39:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix some more docs.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/gnomevfs/gstgnomevfssink.h:
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+ * ext/vorbis/vorbisdec.h:
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_convert_sink):
+ * ext/vorbis/vorbisenc.h:
+ * ext/vorbis/vorbisparse.c: (vorbis_parse_set_header_on_caps),
+ (vorbis_parse_chain), (vorbis_parse_change_state):
+ * ext/vorbis/vorbisparse.h:
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/tcp/gsttcpserversink.h:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/volume/gstvolume.c:
+ * gst/volume/gstvolume.h:
+ Fix some more docs.
+ Added docs for vorbisdec and vorbisparse.
+ Fix vorbisparse.
+
+2006-03-01 16:24:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Updated/added documentation.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * ext/pango/gstclockoverlay.h:
+ * ext/pango/gsttextoverlay.h:
+ * ext/pango/gsttextrender.h:
+ * ext/pango/gsttimeoverlay.h:
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * gst/audioconvert/gstaudioconvert.h:
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.h:
+ * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init):
+ * gst/tcp/gstmultifdsink.h:
+ Updated/added documentation.
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_valign_get_type),
+ (gst_text_overlay_halign_get_type),
+ (gst_text_overlay_wrap_mode_get_type),
+ (gst_text_overlay_base_init), (gst_text_overlay_class_init),
+ (gst_text_overlay_init), (gst_text_overlay_set_property),
+ (gst_text_overlay_get_property):
+ Fix up properties to be enums instead of string to make bindings,
+ introspection and automatic GUI creation possible.
+ Add getters for the properties.
+
+2006-02-28 21:21:07 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/audiotestsrc/gstaudiotestsrc.c: added defines of M_PI and M_PI_2
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ added defines of M_PI and M_PI_2
+ * gst/ffmpegcolorspace/avcodec.h:
+ removed #include "stdint.h" for win32 as _stdint.h is
+ autogenerated to win32/common
+ * win32/common/libgstaudio.def:
+ * win32/common/libgsttag.def:
+ added some exports
+ * win32/vs6:
+ some project files bugs corrected
+ * win32/vs7:
+ project files are reset to the default vs7 configuration
+ (they link to msvcr71.dll using default optimizations)
+
+2006-02-28 19:08:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/gnomevfs/gstgnomevfssink.c: Fix some docs.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init):
+ Fix some docs.
+
+2006-02-28 13:52:04 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/alsa/gstalsasrc.c: Set proper class on the ElementDetails:
+ Original commit message from CVS:
+ * ext/alsa/gstalsasrc.c:
+ Set proper class on the ElementDetails:
+ Source/Audio instead of Src/Audio
+
+2006-02-28 12:19:11 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/videoscale/vs_scanline.c: Revert optimization in videoscale. It should go in liboil and have an appropriate liboi...
+ Original commit message from CVS:
+ * gst/videoscale/vs_scanline.c:
+ (vs_scanline_resample_nearest_RGBA):
+ Revert optimization in videoscale. It should go in liboil and have
+ an appropriate liboil function.
+
+2006-02-28 11:06:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Don't try to provide a clock in the NULL state.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_provide_clock):
+ Don't try to provide a clock in the NULL state.
+
+2006-02-28 11:04:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/ogg/gstoggdemux.c: Use GstSegment infrastructure to remove duplicated code and handle more seek cases correctly.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_receive_event),
+ (gst_ogg_pad_event), (gst_ogg_pad_internal_chain),
+ (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_deactivate_current_chain),
+ (gst_ogg_demux_activate_chain), (gst_ogg_demux_do_seek),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_collect_info),
+ (gst_ogg_demux_find_chains), (gst_ogg_demux_chain),
+ (gst_ogg_demux_loop), (gst_ogg_demux_change_state):
+ Use GstSegment infrastructure to remove duplicated code
+ and handle more seek cases correctly.
+
+2006-02-28 10:39:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/ffmpegcolorspace/gstffmpegcolorspace.c: Don't ignore return code from ffmpeg convert function.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_transform):
+ Don't ignore return code from ffmpeg convert function.
+ * gst/ffmpegcolorspace/imgconvert.c: (img_convert):
+ Split out some long statements to ease debugging.
+
+2006-02-27 12:08:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/libvisual/visual.c: Don't use gst_pad_use_fixed_caps, because it prevents downstream from being able to renegotia...
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (gst_visual_init),
+ (gst_vis_src_negotiate), (get_buffer), (plugin_init):
+ Don't use gst_pad_use_fixed_caps, because it prevents downstream from
+ being able to renegotiate the size. Instead, use the negotiation
+ algorithm from the goom plugin to pick an initial output caps.
+ Also, allow theoretical libvisual plugins that might support non-GL
+ output even if they also do GL.
+
+2006-02-26 21:05:46 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/libvisual/visual.c: Load only non GL plugins. Fix some memleaks and possible negotiation issues.
+ Original commit message from CVS:
+ 2006-02-26 Julien MOUTTE <julien@moutte.net>
+ * ext/libvisual/visual.c: (gst_visual_init),
+ (gst_visual_src_setcaps), (get_buffer), (gst_visual_chain),
+ (plugin_init): Load only non GL plugins. Fix some memleaks and
+ possible negotiation issues.
+
+2006-02-24 23:19:44 +0000 Julien Moutte <julien@moutte.net>
+
+ gst-libs/gst/tag/tag.h: Adding Annodex tags here.
+ Original commit message from CVS:
+ 2006-02-25 Julien MOUTTE <julien@moutte.net>
+ * gst-libs/gst/tag/tag.h: Adding Annodex tags here.
+
+2006-02-24 18:55:27 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/typefind/gsttypefindfunctions.c: Fix CMML type find function to not require a specific minor version of the CMML ...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mpeg4_video_type_find),
+ (cmml_type_find), (plugin_init):
+ Fix CMML type find function to not require a specific minor version
+ of the CMML header.
+ Add an MPEG4 video elementary stream typefind function.
+
+2006-02-24 17:31:53 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggdemux.c: Annodex support in ogg demuxer. Doesn't do very much without the other annodex patches (to come).
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_parse_skeleton_fishead),
+ (gst_ogg_pad_parse_skeleton_fisbone), (gst_ogg_pad_query_convert),
+ (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet),
+ (gst_ogg_demux_perform_seek), (gst_ogg_demux_read_chain),
+ (gst_ogg_demux_read_end_chain), (gst_ogg_demux_collect_chain_info),
+ (gst_ogg_demux_change_state), (gst_annodex_granule_to_time):
+ Annodex support in ogg demuxer. Doesn't do very much without the
+ other annodex patches (to come).
+
+2006-02-24 16:21:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c:
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps):
+ Pick up palette for MS video v1 (#327028, patch by:
+ Fabrizio Gennari <fabrizio dot get at tiscali dot it>)
+
+2006-02-24 13:54:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/ffmpegcolorspace/gstffmpegcolorspace.c: The 'palette_data' field from incoming RGB caps shouldn't be proxied on o...
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_caps_remove_format_info),
+ (gst_ffmpegcsp_get_unit_size):
+ The 'palette_data' field from incoming RGB caps shouldn't be
+ proxied on outgoing YUV caps; also, restrict unit size
+ adjustment in case of paletted data only to the unit that
+ actually has a palette. Fixes #330711.
+
+2006-02-24 12:18:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/ffmpegcolorspace/gstffmpegcolorspace.c: Plug some memory leaks.
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcolorspace.c:
+ (gst_ffmpegcsp_transform_caps), (gst_ffmpegcsp_set_caps),
+ (gst_ffmpegcsp_finalize), (gst_ffmpegcsp_class_init),
+ (gst_ffmpegcsp_get_unit_size):
+ Plug some memory leaks.
+
+2006-02-24 10:18:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ sys/: Add some _CFLAGS and _LIBS that seem to be missing and/or required for Cygwin (see #317048).
+ Original commit message from CVS:
+ * sys/ximage/Makefile.am:
+ * sys/xvimage/Makefile.am:
+ Add some _CFLAGS and _LIBS that seem to be missing
+ and/or required for Cygwin (see #317048).
+
+2006-02-24 00:07:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: use UTF-8 encoding in stead of ISO-8859-15
+ Original commit message from CVS:
+ ChangeLog surgery: use UTF-8 encoding in stead of ISO-8859-15
+
+2006-02-22 18:46:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasrc.c: Fix description as pointed out by caugier.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasrc.c:
+ Fix description as pointed out by caugier.
+
+2006-02-22 10:29:22 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Better 3gp typefinding.
+ Original commit message from CVS:
+ Reviewed by : Edward Hervey <edward@fluendo.com>
+ * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find),
+ (qt_type_find):
+ Better 3gp typefinding.
+
+2006-02-21 12:16:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Don't send EOS event here, the base class will send one for us.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_create):
+ Don't send EOS event here, the base class will send one for us.
+ * gst/playback/gstplaybasebin.c: (prepare_output):
+ Subpictures without video stream aren't allowed either.
+ * gst/subparse/gstsubparse.c: (gst_subparse_type_find):
+ Fix debug statement copy'n'paste-o.
+
+2006-02-21 12:05:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsamixer.c: Fix issues with mixer keeping state when muting/unmuting and when changing the volume whilst...
+ Original commit message from CVS:
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume):
+ Fix issues with mixer keeping state when muting/unmuting
+ and when changing the volume whilst muted (see #331763
+ and #331765).
+
+2006-02-20 18:27:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Set right caps given that we send escaped text. Also, honour <i></i>, <b></b> and <u></u>...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (subrip_unescape_formatting),
+ (parse_subrip), (gst_sub_parse_format_autodetect):
+ Set right caps given that we send escaped text. Also,
+ honour <i></i>, <b></b> and <u></u> markers that can be found
+ in .srt files (fixes #310202).
+
+2006-02-20 16:21:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/mixerutils.c: Make order in which elements are tried more determinable.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/mixerutils.c:
+ (element_factory_rank_compare_func):
+ Make order in which elements are tried more determinable.
+
+2006-02-20 15:57:51 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gstdecodebin.c: Make decodebin reusable by fixing remove_element_chain first and then introduce a cleane...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (get_our_ghost_pad),
+ (remove_element_chain), (cleanup_decodebin),
+ (gst_decode_bin_change_state): Make decodebin reusable by
+ fixing remove_element_chain first and then introduce a
+ cleaner in state change to ->NULL. (Closes #331678)
+ ------------------------------------------------------
+
+2006-02-19 14:32:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/gnomevfs/gstgnomevfssink.c: use 0666 mask when creating files so umask gets applied correctly. Fixes #331295.
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_open_file):
+ use 0666 mask when creating files so umask gets applied
+ correctly. Fixes #331295.
+
+2006-02-19 14:16:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/: Add very basic parser for SSA subtitle streams (as often found in matroska files).
+ Original commit message from CVS:
+ * gst/subparse/Makefile.am:
+ * gst/subparse/gstssaparse.c: (gst_ssa_parse_base_init),
+ (gst_ssa_parse_dispose), (gst_ssa_parse_init),
+ (gst_ssa_parse_class_init), (gst_ssa_parse_src_event),
+ (gst_ssa_parse_sink_event), (gst_ssa_parse_setcaps),
+ (gst_ssa_parse_remove_override_codes), (gst_ssa_parse_parse_line),
+ (gst_ssa_parse_chain), (gst_ssa_parse_change_state):
+ * gst/subparse/gstssaparse.h:
+ * gst/subparse/gstsubparse.c: (plugin_init):
+ Add very basic parser for SSA subtitle streams (as often
+ found in matroska files).
+
+2006-02-19 14:09:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: That should be text/x-pango-markup, not text/x-pango-layout.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (mimetype_is_raw):
+ That should be text/x-pango-markup, not text/x-pango-layout.
+
+2006-02-19 12:41:03 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Polishing.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_finalize):
+ Polishing.
+
+2006-02-19 12:05:23 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Fix state change deadlock.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_base_init),
+ (gst_text_overlay_finalize), (gst_text_overlay_init),
+ (gst_text_overlay_setcaps), (gst_text_overlay_src_event),
+ (gst_text_overlay_render_text),
+ (gst_text_overlay_text_pad_link),
+ (gst_text_overlay_text_event), (gst_text_overlay_video_event),
+ (gst_text_overlay_pop_text), (gst_text_overlay_text_chain),
+ (gst_text_overlay_video_chain), (gst_text_overlay_change_state):
+ Fix state change deadlock.
+
+2006-02-19 11:56:28 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.*: Fix seeking both for muxed formats and subtitles files.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_base_init),
+ (gst_text_overlay_finalize), (gst_text_overlay_init),
+ (gst_text_overlay_setcaps), (gst_text_overlay_src_event),
+ (gst_text_overlay_render_text),
+ (gst_text_overlay_text_pad_link),
+ (gst_text_overlay_text_event), (gst_text_overlay_video_event),
+ (gst_text_overlay_pop_text), (gst_text_overlay_text_chain),
+ (gst_text_overlay_video_chain), (gst_text_overlay_change_state):
+ * ext/pango/gsttextoverlay.h: Fix seeking both for muxed formats
+ and subtitles files.
+
+2006-02-19 00:40:38 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gstdecodebin.c: pango layout should be considered as row.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gstdecodebin.c: (mimetype_is_raw): pango layout
+ should be considered as row.
+
+2006-02-19 00:25:16 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gststreaminfo.*: Introduce language informations.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gststreaminfo.c: (gst_stream_type_get_type),
+ (cb_probe):
+ * gst/playback/gststreaminfo.h: Introduce language informations.
+
+2006-02-18 22:41:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: Set shared memory segments to be deleted as soon as we have attached, that way they get cleaned up automaticall...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls),
+ (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new):
+ Set shared memory segments to be deleted as soon as we have attached,
+ that way they get cleaned up automatically if we crash.
+
+2006-02-18 19:53:48 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/: Those functions are called with lock held.
+ Original commit message from CVS:
+ 2006-02-18 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gstclockoverlay.c: (gst_clock_overlay_get_text):
+ * ext/pango/gsttimeoverlay.c: (gst_time_overlay_get_text): Those
+ functions are called with lock held.
+
+2006-02-18 19:51:47 +0000 Julien Moutte <julien@moutte.net>
+
+ * ChangeLog:
+ Forgot Changelog.
+ Original commit message from CVS:
+ Forgot Changelog.
+
+2006-02-18 19:10:35 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Refactoring of textoverlay without collectpads. This now supports sparse subtitles coming...
+ Original commit message from CVS:
+ 2006-02-18 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_base_init),
+ (gst_text_overlay_finalize), (gst_text_overlay_init),
+ (gst_text_overlay_setcaps), (gst_text_overlay_src_event),
+ (gst_text_overlay_render_text),
+ (gst_text_overlay_text_pad_link),
+ (gst_text_overlay_text_pad_unlink),
+ (gst_text_overlay_text_event),
+ (gst_text_overlay_video_event), (gst_text_overlay_pop_text),
+ (gst_text_overlay_text_chain), (gst_text_overlay_video_chain),
+ (gst_text_overlay_change_state): Refactoring of textoverlay
+ without collectpads. This now supports sparse subtitles coming
+ from a demuxer instead of a sub file. Seeking is still broken
+ though. Need to discuss with wtay some more on how to handle
+ seeking correctly.
+ * ext/pango/gsttextoverlay.h:
+ * gst/playback/gstplaybin.c: (setup_sinks): Support linking with
+ subtitles coming from the demuxer.
+
+2006-02-17 19:31:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisenc.c: Use some more scaling functions.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_convert_src),
+ (gst_vorbisenc_convert_sink):
+ Use some more scaling functions.
+
+2006-02-17 16:12:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/cdparanoia/gstcdparanoiasrc.*: Add back 'transport-error' and 'uncorrected-error' signals and make them actually ...
+ Original commit message from CVS:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ (gst_cd_paranoia_src_class_init), (gst_cd_paranoia_dummy_callback),
+ (gst_cd_paranoia_paranoia_callback),
+ (gst_cd_paranoia_src_signal_is_being_watched),
+ (gst_cd_paranoia_src_read_sector):
+ * ext/cdparanoia/gstcdparanoiasrc.h:
+ Add back 'transport-error' and 'uncorrected-error' signals and
+ make them actually be fired when bad stuff happens (#319340).
+
+2006-02-17 14:07:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Small cleanups.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_get_type),
+ (gst_ring_buffer_open_device), (gst_ring_buffer_close_device),
+ (gst_ring_buffer_device_is_open), (gst_ring_buffer_acquire),
+ (gst_ring_buffer_release), (gst_ring_buffer_set_flushing),
+ (gst_ring_buffer_start), (gst_ring_buffer_pause_unlocked),
+ (gst_ring_buffer_pause), (gst_ring_buffer_stop),
+ (gst_ring_buffer_delay), (gst_ring_buffer_samples_done),
+ (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all),
+ (gst_ring_buffer_commit), (gst_ring_buffer_prepare_read),
+ (gst_ring_buffer_clear):
+ Small cleanups.
+ Added some G_LIKELY.
+
+2006-02-17 10:15:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/TODO: Update TODO
+ Original commit message from CVS:
+ * gst-libs/gst/audio/TODO:
+ Update TODO
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_get_offset):
+ When trying to play samples ASAP and we don't have a
+ previous sample, try to play at position 0 instead of
+ an invalid position.
+
+2006-02-17 09:24:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.c: Also release lock when we get an error in _reset(); fix an error message.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_open),
+ (gst_alsasink_reset):
+ Also release lock when we get an error in _reset();
+ fix an error message.
+
+2006-02-16 21:01:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/gstalsasink.*: Add support for more than 2 channels (#326720).
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_class_init),
+ (gst_alsasink_init), (get_channel_free_structure),
+ (caps_add_channel_configuration), (gst_alsasink_getcaps),
+ (gst_alsasink_close):
+ * ext/alsa/gstalsasink.h:
+ Add support for more than 2 channels (#326720).
+
+2006-02-16 20:19:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/riff/riff-media.c: Set codec_name for WAVEFORMATEX as well. When we have 'normal PCM' with 4 or 6 channe...
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps):
+ Set codec_name for WAVEFORMATEX as well. When we have 'normal PCM'
+ with 4 or 6 channels, assume a default channel layout to make things
+ work (not sure there's anything else we can do in those cases).
+
+2006-02-16 19:18:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: Minor docs fix.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ Minor docs fix.
+ * gst-libs/gst/riff/Makefile.am:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c:
+ (gst_riff_wavext_add_channel_layout), (gst_riff_create_audio_caps):
+ Add support for WAVEFORMATEX, eg. PCM audio with more than two
+ channels and a channel layout map.
+
+2006-02-16 17:06:46 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/videoscale/vs_scanline.c: C-level optimization of the RGBA nearest neighbour function.
+ Original commit message from CVS:
+ Reviewed by Edward Hervey <edward@fluendo.com>
+ * gst/videoscale/vs_scanline.c: (vs_scanline_resample_nearest_RGBA):
+ C-level optimization of the RGBA nearest neighbour function.
+ Eventually this might end up in liboil with vectorized versions.
+
+2006-02-16 11:44:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/multichannel.c: When we have more than 2 channels, but no channel layout is specified in the caps,...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/multichannel.c:
+ (gst_audio_get_channel_positions):
+ When we have more than 2 channels, but no channel layout is
+ specified in the caps, return some default channel layout
+ to the caller and warn about about a possibly buggy element
+ (could be buggy filtercaps as well of course) (#317038).
+
+2006-02-16 09:29:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ pkgconfig/gstreamer-plugins-base-uninstalled.pc.in: Add gst-libs/gst/cdda to list of lib search paths.
+ Original commit message from CVS:
+ * pkgconfig/gstreamer-plugins-base-uninstalled.pc.in:
+ Add gst-libs/gst/cdda to list of lib search paths.
+
+2006-02-15 12:20:47 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/ogg/gstoggmux.c (gst_ogg_mux_collected): When updating timestamp, update timestamp_end as well. Fixes a bugaboo. ...
+ Original commit message from CVS:
+ 2006-02-15 Andy Wingo <wingo@pobox.com>
+ * ext/ogg/gstoggmux.c (gst_ogg_mux_collected): When updating
+ timestamp, update timestamp_end as well. Fixes a bugaboo. I hope
+ to the Lord Jesus that I do not have to touch the ogg muxer ever
+ again.
+
+2006-02-15 12:07:57 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: quicktime movie files can also contain 'uuid' atoms.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (qt_type_find):
+ quicktime movie files can also contain 'uuid' atoms.
+
+2006-02-14 18:52:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/audioconvert/plugin.c: Register the GstAudioChannelPosition enum type with the type system in the plugin_init fun...
+ Original commit message from CVS:
+ * gst/audioconvert/plugin.c: (plugin_init):
+ Register the GstAudioChannelPosition enum type with the type
+ system in the plugin_init function, so that it is known before
+ any element actually makes use of multi-channel stuff. This is
+ required for example if one wants to be able to deserialise/use
+ a caps string with channel positions before any pipeline has
+ been setup and started, like with gst-launch.
+
+2006-02-14 13:45:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstringbuffer.c: Add some compiler G_(UN_)LIKELY help.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c:
+ (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_delay),
+ (gst_ring_buffer_samples_done), (wait_segment),
+ (gst_ring_buffer_commit), (gst_ring_buffer_clear):
+ Add some compiler G_(UN_)LIKELY help.
+ SIGNAL the ringbuffer waiters when going to PAUSED as well to
+ make sure they can exit their functions. Should fix #330748
+
+2006-02-13 20:49:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Windows does not have long long; copy the generated _stdint.h
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ * win32/MANIFEST:
+ * win32/common/_stdint.h:
+ Windows does not have long long; copy the generated _stdint.h
+ * win32/common/interfaces-enumtypes.c:
+ (gst_color_balance_type_get_type), (gst_mixer_type_get_type),
+ (gst_mixer_track_flags_get_type),
+ (gst_tuner_channel_flags_get_type):
+ * win32/common/multichannel-enumtypes.c:
+ (gst_audio_channel_position_get_type):
+ update
+
+2006-02-13 18:49:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Always sync on first sample we receive when starting.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_get_time), (gst_base_audio_sink_preroll),
+ (gst_base_audio_sink_render), (gst_base_audio_sink_change_state):
+ Always sync on first sample we receive when starting.
+
+2006-02-13 15:59:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/playback/gstplaybin.c: Update vis bin docs.
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_vis_element):
+ Update vis bin docs.
+ Move queue after tee so we don't queue video buffers but
+ audio samples instead. Fixes problems where the video queue
+ is filled and the audio queue empty.
+
+2006-02-13 15:17:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: No need to push an EOS event here, GstBaseSrc will do that for us when we return ...
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create):
+ No need to push an EOS event here, GstBaseSrc will do that for us
+ when we return FLOW_UNEXPECTED.
+
+2006-02-12 14:54:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Use scale functions when possible.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_get_time), (gst_base_audio_sink_setcaps),
+ (gst_base_audio_sink_drain), (gst_base_audio_sink_preroll),
+ (gst_base_audio_sink_render), (gst_base_audio_sink_change_state):
+ Use scale functions when possible.
+ Fix error messages.
+ Free clockid when after waiting for EOS.
+ Use G_(UN_)LIKLY when it makes sense.
+ Fix sample clipping bug found by Arwed v. Merkatz fixes #330789.
+
+2006-02-12 14:26:55 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstplaybasebin.c: Remove stray semi-colon (fixes #330888).
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (prepare_output):
+ Remove stray semi-colon (fixes #330888).
+
+2006-02-11 23:35:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ sys/: Fix up the XShm call testing so that we catch errors, and don't cause new ones by attempting to detach from a s...
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls):
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls):
+ Fix up the XShm call testing so that we catch errors, and don't
+ cause new ones by attempting to detach from a segment we failed
+ to attach to. Fixes #312439.
+
+2006-02-10 11:29:55 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/typefind/gsttypefindfunctions.c: Added flv file typefind (video/x-flv).
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (plugin_init):
+ Added flv file typefind (video/x-flv).
+
+2006-02-10 10:53:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Added FLV1 <==> 'video/x-flash-video,flvversion=1' conversion.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Added FLV1 <==> 'video/x-flash-video,flvversion=1' conversion.
+ Also added the caps to the default set of riff video caps.
+
+2006-02-09 19:05:23 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/ogg/gstoggmux.c (GstOggPad): Keep track of both the start time and the end time of the last packet in the page.
+ Original commit message from CVS:
+ 2006-02-09 Andy Wingo <wingo@pobox.com>
+ * ext/ogg/gstoggmux.c (GstOggPad): Keep track of both the start
+ time and the end time of the last packet in the page.
+ (gst_ogg_mux_pad_queue_page): In addition to setting the timestamp
+ on the pages in our queue, set the duration as well. Reflow a
+ debug statement.
+ (gst_ogg_mux_collected): Keep track of GstOggPad->timestamp_end.
+ Fixes bad muxing order.
+
+2006-02-09 17:04:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst-libs/gst/rtp/gstbasertppayload.c: update seqnum before setting it on the packet; this makes sure that the timesta...
+ Original commit message from CVS:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ (gst_basertppayload_setcaps), (gst_basertppayload_push):
+ update seqnum before setting it on the packet; this makes sure
+ that the timestamp and seqnum properties match after pushing
+ a buffer
+
+2006-02-09 12:16:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog foo
+ Original commit message from CVS:
+ changelog foo
+
+2006-02-09 11:46:03 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst-libs/gst/audio/gstringbuffer.c:
+ * win32/common/config.h:
+ kapowpowpow
+ Original commit message from CVS:
+ kapowpowpow
+
+2006-02-09 11:36:18 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst-libs/gst/audio/gstringbuffer.c
+ Original commit message from CVS:
+ 2006-02-09 Andy Wingo <wingo@pobox.com>
+ * gst-libs/gst/audio/gstringbuffer.c
+ (gst_ring_buffer_samples_done): Cast to guint64, fixes an integer
+ overflow after 13.5 hours of recording. Kapow!
+ * ext/alsa/gstalsasrc.c (gst_alsasrc_delay): Clamp the delay to
+ the buffer size -- we don't care about underrun/overrun reporting
+ right now, just need to return a useful value.
+
+2006-02-09 11:21:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Back to CVS
+ Original commit message from CVS:
+ * configure.ac:
+ Back to CVS
+
+=== release 0.10.3 ===
+
+2006-02-09 11:18:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ * win32/common/config.h:
+ Releasing 0.10.3
+ Original commit message from CVS:
+ Releasing 0.10.3
+
+2006-02-08 18:37:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Drat. Bump libtool version number for new API.
+ Original commit message from CVS:
+ * configure.ac:
+ Drat. Bump libtool version number for new API.
+ Prelease 0.10.2.3 (of 0.10.3)
+
+2006-02-08 15:57:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 0.10.2.2 prerelease (of 0.10.3).
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ 0.10.2.2 prerelease (of 0.10.3).
+
+2006-02-08 15:50:08 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/tcp/gsttcpclientsrc.c: Revert Andy's newsegment change pending a more correct fix.
+ Original commit message from CVS:
+ * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_create):
+ Revert Andy's newsegment change pending a more correct
+ fix.
+
+2006-02-08 12:46:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 11:04:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/tcp/gstmultifdsink.c:
+ doc fixes
+ Original commit message from CVS:
+ doc fixes
+
+2006-02-08 09:20:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/typefind/gsttypefindfunctions.c: detect more files as 3gp group and reorder the iso file formats
+ Original commit message from CVS:
+ :
+ * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find),
+ (qt_type_find), (plugin_init):
+ detect more files as 3gp
+ group and reorder the iso file formats
+
+2006-02-07 18:32:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/vorbis/vorbis.c: Register musicbrainz tags, so apps don't have to.
+ Original commit message from CVS:
+ * ext/vorbis/vorbis.c: (plugin_init):
+ Register musicbrainz tags, so apps don't have to.
+
+2006-02-07 17:44:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Make sure we called gst_tag_register_musicbrainz_tags() before possibly mapping a vo...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_tag_from_vorbis_tag),
+ (gst_tag_to_vorbis_tag):
+ Make sure we called gst_tag_register_musicbrainz_tags()
+ before possibly mapping a vorbiscomment string from/to a
+ musicbrainz tag.
+
+2006-02-07 16:16:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: In case we can't find the required number of consecutive mpeg audio frames to po...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (mp3_type_find):
+ In case we can't find the required number of consecutive
+ mpeg audio frames to positively identify an MPEG audio
+ stream, check if there's at least a valid mpeg audio
+ frame right at offset 0 and if so suggest mpeg/audio
+ caps with a very low probability (#153004).
+
+2006-02-07 15:52:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/tcp/gsttcpclientsrc.c (gst_tcp_client_src_create): Switch to a TIME segment if we get timestamped buffers. Requir...
+ Original commit message from CVS:
+ 2006-02-07 Andy Wingo <wingo@pobox.com>
+ * gst/tcp/gsttcpclientsrc.c (gst_tcp_client_src_create): Switch to
+ a TIME segment if we get timestamped buffers. Requires recent
+ fixes in core to work properly.
+
+2006-02-07 14:57:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Don't print the URI as part of the error message, it makes error dialogs look rather u...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (prepare_output):
+ Don't print the URI as part of the error message, it
+ makes error dialogs look rather ugly, especially if
+ the URI is very long or has characters in it that
+ need escaping.
+
+2006-02-07 13:11:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Error out if we have only text or subtitles, but nothing else. Also error out if we ha...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (prepare_output):
+ Error out if we have only text or subtitles, but nothing
+ else. Also error out if we have subtitles but no video
+ stream.
+
+2006-02-07 11:44:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssrc.c: Treat GNOME_VFS_RESULT_EOF as EOS, not as error (#329194).
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_create):
+ Treat GNOME_VFS_RESULT_EOF as EOS, not as error (#329194).
+ Post an error message on the bus when we encounter an
+ error, which will hopefully be more meaningful than the
+ 'Internal Flow Error' message users get to see if we
+ just return GST_FLOW_ERROR.
+
+2006-02-07 11:28:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ configure.ac (GST_MAJORMINOR): Update core version req to 0.10.2.2, for the collectpads API addition (#330244).
+ Original commit message from CVS:
+ 2006-02-07 Andy Wingo <wingo@pobox.com>
+ * configure.ac (GST_MAJORMINOR): Update core version req to
+ 0.10.2.2, for the collectpads API addition (#330244).
+
+2006-02-06 19:09:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfs.c: Return FALSE from plugin_init() when GnomeVFS can't be initialised for some reason (#3284...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfs.c: (plugin_init):
+ Return FALSE from plugin_init() when GnomeVFS can't
+ be initialised for some reason (#328423).
+
+2006-02-06 13:26:54 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Stick to seeking theory until i find the bug.
+ Original commit message from CVS:
+ 2006-02-06 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_src_event):
+ Stick to seeking theory until i find the bug.
+ * gst/subparse/gstsubparse.c: (parse_subrip): Fix debug.
+
+2006-02-06 12:38:48 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Make theoraenc and the tests leak free. Like, really.
+ Original commit message from CVS:
+ * ext/theora/theoraenc.c: (gst_theora_enc_class_init),
+ (theora_enc_finalize), (theora_enc_sink_setcaps),
+ (theora_set_header_on_caps), (theora_enc_chain),
+ (theora_enc_change_state):
+ * tests/check/pipelines/theoraenc.c: (GST_START_TEST):
+ Make theoraenc and the tests leak free. Like, really.
+
+2006-02-05 23:31:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add a finalize method to ensure we clean up state even if someone omitted the state change back to NULL.
+ Original commit message from CVS:
+ (theora_enc_finalize), (theora_enc_sink_setcaps):
+ Add a finalize method to ensure we clean up state even if
+ someone omitted the state change back to NULL.
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_metadata_set1),
+ (gst_vorbisenc_chain):
+ Free some more leaked bits.
+ * tests/check/pipelines/theoraenc.c: (start_pipeline),
+ (stop_pipeline):
+ Wait for state changes to happen if they're ASYNC.
+ This ought to teach those fancy pants buildbots a lesson.
+
+2006-02-05 22:47:41 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/tag/gstid3tag.c: Add mapping for ID3 International Standard Recording Code tag "TSRC"
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstid3tag.c:
+ Add mapping for ID3 International Standard Recording Code
+ tag "TSRC"
+
+2006-02-05 22:44:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/vorbis/vorbisenc.c: Don't leak tag names.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_metadata_set1):
+ Don't leak tag names.
+
+2006-02-05 18:22:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Split libgsttag docs into multiple sections.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstid3tag.c:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tags.c:
+ Split libgsttag docs into multiple sections.
+
+2006-02-05 18:01:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add libgsttag to the docs.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/tag/gstid3tag.c: (gst_tag_from_id3_tag):
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ Add libgsttag to the docs.
+
+2006-02-05 17:21:23 +0000 Julien Moutte <julien@moutte.net>
+
+ ext/pango/gsttextoverlay.c: Fix clockoverlay.
+ Original commit message from CVS:
+ 2006-02-05 Julien MOUTTE <julien@moutte.net>
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_finalize),
+ (gst_text_overlay_init), (gst_text_overlay_src_event),
+ (gst_text_overlay_collected): Fix clockoverlay.
+
+2006-02-05 17:15:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/compiling.sgml: Fix typo: it's pkg-config, not pkg-gconfig
+ Original commit message from CVS:
+ * docs/libs/compiling.sgml:
+ Fix typo: it's pkg-config, not pkg-gconfig
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/tmpl/gstgconf.sgml:
+ There is no libgstgconf in 0.10, remove it
+ from the docs.
+
+2006-02-05 16:03:48 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/libs/tmpl/gstcolorbalance.sgml: Updated.
+ Original commit message from CVS:
+ 2006-02-05 Julien MOUTTE <julien@moutte.net>
+ * docs/libs/tmpl/gstcolorbalance.sgml: Updated.
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_init),
+ (gst_text_overlay_src_event), (gst_text_overlay_collected):
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_class_init), (gst_sub_parse_init),
+ (gst_sub_parse_src_event), (parse_mdvdsub), (parse_subrip),
+ (parse_mpsub), (parser_state_init), (handle_buffer),
+ (gst_sub_parse_chain), (gst_sub_parse_sink_event),
+ (plugin_init):
+ * gst/subparse/gstsubparse.h: Introduce seeking code.
+
+2006-02-05 15:14:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/gstvorbistag.c: Add comment about LANGUAGE tag inconsistency (we want
+ Original commit message from CVS:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ Add comment about LANGUAGE tag inconsistency (we want
+ ISO-639-1, but extract three-letter identifiers?)
+ * po/POTFILES.in:
+ Add two translatable files.
+
+2006-02-05 14:59:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/tag/: Forward-port some tags stuff from the 0.8 branch. This is mostly the addition of musicbrainz tags ...
+ Original commit message from CVS:
+ * gst-libs/gst/tag/Makefile.am:
+ * gst-libs/gst/tag/gstvorbistag.c: (gst_vorbis_tag_add):
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/tag/tags.c:
+ (gst_tag_register_musicbrainz_tags_internal),
+ (gst_tag_register_musicbrainz_tags):
+ Forward-port some tags stuff from the 0.8 branch. This is
+ mostly the addition of musicbrainz tags and their mapping
+ to vorbistags, and a vorbistag mapping of the language tag.
+
+2006-02-05 12:06:25 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gstplaybin.c: Fix broken code refactoring.
+ Original commit message from CVS:
+ 2006-02-05 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gstplaybin.c: (gen_text_element): Fix broken code
+ refactoring.
+
+2006-02-05 03:05:41 +0000 David Schleef <ds@schleef.org>
+
+ Add Dirac typefinding and add dirac format to oggmux.
+ Original commit message from CVS:
+ * ext/ogg/gstoggmux.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ Add Dirac typefinding and add dirac format to oggmux.
+
+2006-02-04 07:49:03 +0000 Michael Smith <msmith@xiph.org>
+
+ * configure.ac:
+ Improve error message for liboil missingness.
+ Original commit message from CVS:
+ Improve error message for liboil missingness.
+
+2006-02-03 19:23:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: Don't put essential function call into g_return_*() macro, otherwise it'll all be replac...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (try_to_link_1):
+ Don't put essential function call into
+ g_return_*() macro, otherwise it'll all be
+ replaced by NOOPs when compiling with
+ G_DISABLE_CHECKS defined.
+
+2006-02-03 17:45:44 +0000 Edgard Lima <edgard.lima@indt.org.br>
+
+ * ChangeLog:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggparse.c:
+ * gst/tcp/gsttcpserversink.c:
+ * sys/v4l/v4lsrc_calls.c:
+ * sys/v4l/v4lsrc_calls.h:
+ Just make it compile with --disable-gst-debug.
+ Original commit message from CVS:
+ Just make it compile with --disable-gst-debug.
+
+2006-02-03 12:51:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/alsa/gstalsasink.*: Add lock to protect alsa calls.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_finalise),
+ (gst_alsasink_class_init), (gst_alsasink_init),
+ (gst_alsasink_write), (gst_alsasink_reset):
+ * ext/alsa/gstalsasink.h:
+ Add lock to protect alsa calls.
+ Implement reset to flush samples ASAP, does not work
+ with dmix though.
+
+2006-02-02 18:18:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Ugh.. getting late I guess...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_provide_clock):
+ Ugh.. getting late I guess...
+
+2006-02-02 18:13:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Don't try to provide a clock when we are not negotiated since we might not be ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_provide_clock),
+ (gst_base_audio_sink_set_property),
+ (gst_base_audio_sink_get_property), (gst_base_audio_sink_render):
+ Don't try to provide a clock when we are not negotiated since
+ we might not be able to make it run.
+
+2006-02-02 17:51:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstdecodebin.c: Unlinking two source pads is ... hard.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (try_to_link_1):
+ Unlinking two source pads is ... hard.
+
+2006-02-02 12:14:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/TODO: Updated.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/TODO:
+ Updated.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_drain), (gst_base_audio_sink_event):
+ On EOS, wait till the last sample is played before posting EOS.
+
+2006-02-02 08:53:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/pipelines/theoraenc.c:
+ comment on my understanding
+ Original commit message from CVS:
+ comment on my understanding
+
+2006-02-02 08:47:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * tests/check/pipelines/theoraenc.c:
+ reformat to fit 80 chars
+ Original commit message from CVS:
+ reformat to fit 80 chars
+
+2006-02-02 00:04:37 +0000 Kai Vehmanen <kv2004@eca.cx>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: setting queue_delay to zero. Also avoid thread being started if queue_delay i...
+ Original commit message from CVS:
+ 2006-02-01 Philippe Kalaf <burger at speedy dot org>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ Patch by Kai Vehmanen : Adds ability to enable newsegment bypass by
+ setting queue_delay to zero. Also avoid thread being started if
+ queue_delay is zero.
+
+2006-02-01 14:51:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/test6.c: Make test work again by connecting fakesinks to each decoded pad, which makes the pipeline wait...
+ Original commit message from CVS:
+ * gst/playback/test6.c: (new_decoded_pad_cb), (show_error), (main):
+ Make test work again by connecting fakesinks to each decoded pad,
+ which makes the pipeline wait until each fakesink has a buffer
+ queued before going to PAUSED state. At that point we know the
+ decodebin pads are negotiated.
+
+2006-02-01 11:59:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Pass unhandled queries to the parent class's query function.
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_query),
+ (gst_cdda_base_src_handle_event):
+ * gst/audiotestsrc/gstaudiotestsrc.c: (gst_audio_test_src_query):
+ Pass unhandled queries to the parent class's query function.
+
+2006-02-01 11:56:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Pass unhandled queries upstream instead of just dropping them (#326447). Also, fix supported query types list for som...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_pad_query_types),
+ (gst_ogg_pad_src_query):
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_sink_query):
+ * ext/theora/theoradec.c: (theora_dec_src_query),
+ (theora_dec_sink_query):
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query),
+ (vorbis_dec_sink_query):
+ * ext/vorbis/vorbisenc.c: (gst_vorbisenc_src_query),
+ (gst_vorbisenc_sink_query):
+ * gst/adder/gstadder.c: (gst_adder_query):
+ Pass unhandled queries upstream instead of just
+ dropping them (#326447). Also, fix supported
+ query types list for some elements.
+
+2006-02-01 09:58:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Fix typefinding for audio/x-au, audio/x-paris and audio/iLBC-sh. We cannot use t...
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (au_type_find),
+ (paris_type_find), (ilbc_type_find), (plugin_init):
+ Fix typefinding for audio/x-au, audio/x-paris and
+ audio/iLBC-sh. We cannot use the START_WITH macros
+ here, because there can only be one typefind factory
+ with the same name (caps), so the second one would
+ replace the first one and the first one would never
+ be called when doing typefinding (see #161712).
+
+2006-01-31 19:25:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/vorbis/vorbisdec.c: Use scale_int when we can, add some more scaling.
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_convert),
+ (vorbis_handle_header_packet), (vorbis_dec_push),
+ (vorbis_handle_data_packet):
+ Use scale_int when we can, add some more scaling.
+ Check packettype before parsing it.
+
+2006-01-31 17:44:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Call right _scale functions.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (_theora_granule_time),
+ (theora_dec_src_convert), (theora_dec_sink_convert):
+ Call right _scale functions.
+ Use parameter instead of some other random value.
+
+2006-01-31 17:27:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/theora/theoradec.c: Use higher precision timestamps calculation.
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (_theora_granule_frame),
+ (_theora_granule_time), (_inc_granulepos),
+ (theora_dec_src_convert), (theora_dec_sink_convert),
+ (theora_handle_type_packet), (theora_handle_data_packet),
+ (theora_dec_chain):
+ Use higher precision timestamps calculation.
+ Convert some other conversions to _scale.
+
+2006-01-31 17:19:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: initialize gst_controller before using
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_create_sine_table), (plugin_init):
+ * gst/volume/gstvolume.c: (plugin_init):
+ initialize gst_controller before using
+
+2006-01-31 16:26:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/pipelines/: Define constant using G_GINT64_CONSTANT to avoid errors when passing it around - otherwise it...
+ Original commit message from CVS:
+ * tests/check/pipelines/theoraenc.c:
+ * tests/check/pipelines/vorbisenc.c:
+ Define constant using G_GINT64_CONSTANT to avoid errors when
+ passing it around - otherwise it gets truncated to 32 bits.
+ Fixes failing tests.
+
+2006-01-31 15:36:13 +0000 Andy Wingo <wingo@pobox.com>
+
+ sys/v4l/gstv4lsrc.c (gst_v4lsrc_set_caps): Don't segfault if the caps being set doesn't have a framerate value. Basic...
+ Original commit message from CVS:
+ 2006-01-31 Andy Wingo <wingo@pobox.com>
+ * sys/v4l/gstv4lsrc.c (gst_v4lsrc_set_caps): Don't segfault if the
+ caps being set doesn't have a framerate value. Basically a stopgap
+ measure.
+ * ext/ogg/gstoggmux.c (GST_BUFFER_END_TIME): New macro. Not
+ technically correct enough to put into core though.
+ (gst_ogg_mux_dequeue_page): Use END_TIME instead of TIMESTAMP +
+ DURATION. Fixes theoraenc ! oggmux.
+ * sys/v4l/gstv4lsrc.c (gst_v4lsrc_fixate): Fixate to the nearest
+ fraction, not double.
+
+2006-01-31 12:23:35 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update with latest files
+ Original commit message from CVS:
+ update with latest files
+
+2006-01-30 23:42:54 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs7: add vs7 project files created by Sergey Scobich
+ Original commit message from CVS:
+ * win32/vs7:
+ add vs7 project files created by Sergey Scobich
+
+2006-01-30 22:18:53 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs8: add vs8 project files created by Sergey Scobich
+ Original commit message from CVS:
+ * win32/vs8:
+ add vs8 project files created by Sergey Scobich
+
+2006-01-30 19:22:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/ogg/gstoggmux.c (gst_ogg_mux_dequeue_page): Compare timestamp + duration, not just timestamp -- ogg pages should ...
+ Original commit message from CVS:
+ 2006-01-30 Andy Wingo <wingo@pobox.com>
+ * ext/ogg/gstoggmux.c (gst_ogg_mux_dequeue_page): Compare
+ timestamp + duration, not just timestamp -- ogg pages should be
+ ordered by stop time. Necessary fix given the change in vorbis
+ timestamps.
+
+2006-01-30 19:21:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c:
+ * tests/check/pipelines/theoraenc.c:
+ ext/theora/theoraenc.c (theora_enc_sink_setcaps)
+ Original commit message from CVS:
+ 2006-01-30 Andy Wingo <wingo@pobox.com>
+ * ext/theora/theoraenc.c (theora_enc_sink_setcaps)
+ (gst_theora_enc_init): Pull the granule shift out of the encoder.
+ (granulepos_add): New function, handles the messiness of adjusting
+ granulepos values.
+ (theora_buffer_from_packet):
+ (theora_enc_chain):
+ (theora_enc_sink_event): Use granulepos_add, not +.
+ * tests/check/pipelines/theoraenc.c
+ (check_buffer_granulepos_from_starttime): Just check the frame
+ count, not the actual granulepos -- we can't dictate to the
+ encoder when it should be placing keyframes.
+
+2006-01-30 18:17:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/gnomevfs/gstgnomevfssrc.c: SERVICE_NOT_AVAILABLE happens for example when you're trying to play an http:// stream...
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_start):
+ SERVICE_NOT_AVAILABLE happens for example when you're trying to
+ play an http:// stream from a server that's not serving
+
+2006-01-30 17:08:11 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/: Totally remove the UINT64_CONSTANT macro, doesn't appear to be needed or available.
+ Original commit message from CVS:
+ 2006-01-30 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/vorbisenc.c (TIMESTAMP_OFFSET):
+ * tests/check/pipelines/theoraenc.c (TIMESTAMP_OFFSET): Totally
+ remove the UINT64_CONSTANT macro, doesn't appear to be needed or
+ available.
+
+2006-01-30 17:01:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ ext/theora/: Same changes as were done to vorbisenc, although theoraenc was timestamping correctly. Added handling of...
+ Original commit message from CVS:
+ 2006-01-30 Andy Wingo <wingo@pobox.com>
+ * ext/theora/gsttheoraenc.h:
+ * ext/theora/theoraenc.c: Same changes as were done to vorbisenc,
+ although theoraenc was timestamping correctly. Added handling of
+ streams that start with nonzero timestamps.
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/theoraenc.c: New file, basically does same
+ tests as vorbisenc.
+ * tests/check/pipelines/vorbisenc.c: I claim these bugs.
+
+2006-01-30 16:19:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstaudiosink.c: Implement pause that does not wait for completion.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ (gst_audioringbuffer_class_init), (gst_audioringbuffer_release),
+ (gst_audioringbuffer_pause):
+ Implement pause that does not wait for completion.
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render), (gst_base_audio_sink_change_state):
+ Don't drop buffers when going to PAUSED but perform preroll on
+ remaining samples now that core base class supports this.
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_release),
+ (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_stop),
+ (gst_ring_buffer_commit):
+ Pause should not signal waiters.
+ Implement return value of _commit correctly.
+
+2006-01-30 15:01:28 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/Makefile.am (check_vorbis): Add pipelines/vorbisenc.
+ Original commit message from CVS:
+ 2006-01-30 Andy Wingo <wingo@pobox.com>
+ * tests/check/Makefile.am (check_vorbis): Add pipelines/vorbisenc.
+ * ext/vorbis/vorbisenc.c (gst_vorbisenc_buffer_from_packet): Logic
+ updated to timestamp from the first sample, not the last.
+ (gst_vorbisenc_buffer_from_header_packet): New function, takes
+ special care of granulepos and timestamp for header packets.
+ (gst_vorbisenc_chain): Reflow, fix some leaks, and handle the case
+ when the first buffer has a nonzero timestamp.
+ * ext/vorbis/vorbisenc.h (GstVorbisEnc.granulepos_offset)
+ (GstVorbisEnc.subgranule_offset): New members. Take care of the
+ case when the first audio buffer we get has a nonzero timestamp.
+ (GstVorbisEnc.next_ts): Renamed from prev_ts, because now we
+ properly timestamp vorbis buffers with the time of the first
+ sample, not the last.
+ * ext/vorbis/vorbisenc.c (granulepos_to_clocktime): Renamed from
+ vorbis_granule_time_copy -- now it takes the granule/subgranule
+ offset into account.
+ * tests/check/pipelines/vorbisenc.c: New test for correctness of
+ timestamps, durations, and granulepos on buffers produced by
+ vorbisenc.
+
+2006-01-30 14:42:28 +0000 Eric Jonas <jonas@mit.edu>
+
+ gst/ffmpegcolorspace/gstffmpegcodecmap.c: Patch from Eric Jonas to support conversions to/from UYVY (Fixes: #324626)
+ Original commit message from CVS:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt):
+ Patch from Eric Jonas to support conversions to/from UYVY
+ (Fixes: #324626)
+
+2006-01-30 08:11:14 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/: Implement subtitles.
+ Original commit message from CVS:
+ 2006-01-30 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gstplaybasebin.c: (group_commit),
+ (queue_overrun),
+ (setup_subtitle), (setup_source), (set_active_source):
+ * gst/playback/gstplaybin.c: (gst_play_bin_dispose),
+ (gen_text_element), (gen_audio_element), (gen_vis_element),
+ (remove_sinks), (add_sink), (setup_sinks): Implement subtitles.
+
+2006-01-29 19:13:39 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst-libs/gst/audio/audio.h: (GST_CLOCK_TIME_TO_FRAMES)
+ Original commit message from CVS:
+ * gst-libs/gst/audio/audio.h: (GST_CLOCK_TIME_TO_FRAMES)
+ * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_render)
+ use of gst_guint64_to_gdouble to be compliant with vs6
+ * gst/playback/gstdecodebin.c: (try_to_link_1)
+ * gst/videorate/videorate.c: (gst_video_rate_blank_data)
+ use of G_GINT64_CONSTANT for int64 constants
+ * win32/common/libgstinterfaces.def:
+ export some symbols (gst_mixer_get_type,gst_mixer_track_get_type)
+ * win32/vs6:
+ update and add new project files
+
+2006-01-29 18:21:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add a win32-update rule like in core, and copy over enumtypes files
+ Original commit message from CVS:
+ * Makefile.am:
+ * win32/MANIFEST:
+ * win32/common/interfaces-enumtypes.c:
+ (gst_color_balance_type_get_type), (gst_mixer_type_get_type),
+ (gst_mixer_track_flags_get_type),
+ (gst_tuner_channel_flags_get_type):
+ * win32/common/interfaces-enumtypes.h:
+ * win32/common/multichannel-enumtypes.c:
+ (gst_audio_channel_position_get_type):
+ * win32/common/multichannel-enumtypes.h:
+ add a win32-update rule like in core, and copy over enumtypes files
+
+2006-01-29 18:07:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ generate win32/common/config.h
+ Original commit message from CVS:
+ generate win32/common/config.h
+
+2006-01-29 18:05:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/: add config files just like in core
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ add config files just like in core
+
+2006-01-28 18:22:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/alsa/: Update all error messages. All of them should either use the default translated message, or actually prov...
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_init), (set_hwparams),
+ (set_swparams), (gst_alsasink_prepare), (gst_alsasink_unprepare),
+ (gst_alsasink_close), (gst_alsasink_write), (gst_alsasink_reset):
+ * ext/alsa/gstalsasrc.c: (gst_alsasrc_init), (set_hwparams),
+ (set_swparams), (gst_alsasrc_open), (gst_alsasrc_prepare),
+ (gst_alsasrc_unprepare), (gst_alsasrc_read):
+ Update all error messages. All of them should either use
+ the default translated message, or actually provide a
+ translatable string.
+ Make the string for channel count problems meaningful.
+
+2006-01-28 18:19:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstringbuffer.c: Make gcc-4.1 happy (part of #327357).
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (build_linear_format):
+ Make gcc-4.1 happy (part of #327357).
+
+2006-01-28 16:35:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ sys/v4l/v4l_calls.c: check for and throw RESOURCE_BUSY
+ Original commit message from CVS:
+ * sys/v4l/v4l_calls.c: (gst_v4l_open):
+ check for and throw RESOURCE_BUSY
+
+2006-01-28 02:13:14 +0000 David Schleef <ds@schleef.org>
+
+ gst/videoscale/vs_scanline.c: Oops, *that's* why I never checked in this change -- it requires liboil features not in...
+ Original commit message from CVS:
+ * gst/videoscale/vs_scanline.c: Oops, *that's* why I never
+ checked in this change -- it requires liboil features not
+ in 0.3.6. Revert parts.
+
+2006-01-27 23:40:19 +0000 David Schleef <ds@schleef.org>
+
+ update liboil requirement to 0.3.6
+ Original commit message from CVS:
+ * REQUIREMENTS:
+ * configure.ac: update liboil requirement to 0.3.6
+ * gst/videoscale/Makefile.am:
+ * gst/videoscale/vs_scanline.c: liboilify
+
+2006-01-27 17:00:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/libvisual/visual.c: When pad_alloc returns a GstFlowReturn other than GST_FLOW_OK, make sure it is passed upstream.
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (get_buffer):
+ When pad_alloc returns a GstFlowReturn other
+ than GST_FLOW_OK, make sure it is passed upstream.
+
+2006-01-27 01:36:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/alsa/gstalsasink.c: Free the device name string.
+ Original commit message from CVS:
+ * ext/alsa/gstalsasink.c: (gst_alsasink_finalise),
+ (gst_alsasink_class_init):
+ Free the device name string.
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init),
+ (gst_ogg_mux_request_new_pad), (gst_ogg_mux_release_pad),
+ (gst_ogg_mux_handle_src_event), (gst_ogg_mux_clear_collectpads):
+ Don't remove a pad from the collectpads structure until it
+ is released - it's a request pad, and may receive data again
+ if the element gets moved back to PLAYING state.
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support):
+ Ensure we turn on double buffering on the Xv port, and
+ set the colour key to something dark and mysterious that
+ isn't black.
+
+2006-01-27 01:06:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/: - a library should not call setlocale. see Libraries node in gettext manual
+ Original commit message from CVS:
+ * ext/alsa/gstalsaplugin.c: (plugin_init):
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ (gst_cd_paranoia_src_base_init), (plugin_init):
+ * ext/gnomevfs/gstgnomevfs.c: (plugin_init):
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init):
+ - a library should not call setlocale. see Libraries node in
+ gettext manual
+ - make sure all plugins that use translation do bindtextdomain
+ to point to the localedir
+ * gst/playback/gstplaybin.c: (gen_vis_element), (add_sink),
+ (setup_sinks), (plugin_init):
+ all this, and check for NULL when creating sinks
+
+2006-01-26 23:21:31 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/subparse/gstsubparse.c: Make typefinding of subtitles work again.
+ Original commit message from CVS:
+ 2006-01-27 Julien MOUTTE <julien@moutte.net>
+ * gst/subparse/gstsubparse.c: (gst_subparse_type_find),
+ (plugin_init): Make typefinding of subtitles work again.
+
+2006-01-26 20:40:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/typefind/gsttypefindfunctions.c: Backport a bunch of typefinding fixes from the 0.8 branch.
+ Original commit message from CVS:
+ * gst/typefind/gsttypefindfunctions.c: (aac_type_find),
+ (mp3_type_frame_length_from_header), (mp3_type_find),
+ (wavpack_type_find), (m4a_type_find), (ircam_type_find),
+ (plugin_init):
+ Backport a bunch of typefinding fixes from the 0.8 branch.
+ Also, improve wavpack typefinding: if we can't peek the
+ entire wavpack block, try to parse the bits we can get and
+ see if we find what we're looking for in those.
+
+2006-01-26 19:17:38 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Handle some more cases of pixel aspect ratio.
+ Original commit message from CVS:
+ 2006-01-26 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c:
+ (gst_ximagesink_calculate_pixel_aspect_ratio):
+ * sys/xvimage/xvimagesink.c:
+ (gst_xvimagesink_calculate_pixel_aspect_ratio): Handle some
+ more cases of pixel aspect ratio.
+
+2006-01-26 13:09:24 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin.c: Also consider the flush-start and tag events as unblockers for the pad probes.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (pad_probe):
+ Also consider the flush-start and tag events as unblockers
+ for the pad probes.
+
+2006-01-26 12:32:58 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/playback/gstplaybin.c: On the fly visualisation switch, works disabling, enabling as well but it won't be able to...
+ Original commit message from CVS:
+ 2006-01-26 Julien MOUTTE <julien@moutte.net>
+ * gst/playback/gstplaybin.c: (gst_play_bin_init),
+ (gst_play_bin_dispose), (gst_play_bin_vis_unblocked),
+ (gst_play_bin_vis_blocked), (gst_play_bin_set_property):
+ On the fly visualisation switch, works disabling, enabling as
+ well but it won't be able to enable vis in a playbin that was
+ created with no visualisation.
+
+2006-01-25 10:50:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Undo previous commit, it breaks resume after pause.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render), (gst_base_audio_sink_change_state):
+ Undo previous commit, it breaks resume after pause.
+
+2006-01-25 09:27:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Improve debugging.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_setcaps), (gst_base_audio_sink_event),
+ (gst_base_audio_sink_preroll), (gst_base_audio_sink_render):
+ Improve debugging.
+ Post error when caps cannot be parsed.
+ Resync on discontinuity in the stream.
+ Clip samples to segment boundaries.
+ return WRONG_STATE sooner when we are flushing.
+ * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init),
+ (gst_base_audio_src_get_time), (gst_base_audio_src_create):
+ Make audiosrc operate in TIME.
+ Set TIMESTAMP and DURATION on buffers.
+
+2006-01-24 21:55:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/seek/seek.c: Output tag messages as well.
+ Original commit message from CVS:
+ * tests/examples/seek/seek.c: (main):
+ Output tag messages as well.
+
+2006-01-23 15:05:24 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/playback/gstdecodebin.c: Replace GstPadBlockCallback with pad probes that detect first buffer AND eos before remo...
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_init),
+ (free_pad_probes), (remove_fakesink), (pad_probe),
+ (close_pad_link), (gst_decode_bin_change_state):
+ Replace GstPadBlockCallback with pad probes that detect
+ first buffer AND eos before removing fakesink.
+ Fixes hang with demuxers doing EOS while pre-rolling.
+ Solves #328279
+
+2006-01-23 10:10:36 +0000 Jens Granseuer <jensgr@gmx.net>
+
+ GCC 2.95 fixes (#328263).
+ Original commit message from CVS:
+ 2006-01-23 Andy Wingo <wingo@pobox.com>
+ * ext/alsa/gstalsasink.c:
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_setcaps),
+ (gst_base_rtp_depayload_add_to_queue),
+ (gst_base_rtp_depayload_queue_release): GCC 2.95 fixes (#328263).
+ Patch by: Jens Granseuer <jensgr at gmx dot net>
+
+2006-01-22 17:24:02 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/: Playbin keeps some ref to some frames. We might get a frame destroyed after changing state to
+ Original commit message from CVS:
+ 2006-01-22 Julien MOUTTE <julien@moutte.net>
+ * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy),
+ (gst_xvimagesink_buffer_alloc): Playbin keeps some ref to some
+ frames. We might get a frame destroyed after changing state to
+ NULL, adding a safety check on xcontext.
+
+2006-01-22 14:50:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/interfaces/xoverlay.c: Fix prepare-xwindow-id code example in the docs - we need to ignore all messages ...
+ Original commit message from CVS:
+ * gst-libs/gst/interfaces/xoverlay.c:
+ Fix prepare-xwindow-id code example in the docs - we need to
+ ignore all messages that aren't element messages as well.
+
+2006-01-21 22:40:03 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.c: I think one day i'll completely undestand how caps negotiation is supposed to work. This r...
+ Original commit message from CVS:
+ 2006-01-21 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_buffer_alloc):
+ I think one day i'll completely undestand how caps negotiation
+ is supposed to work. This refactoring handles buffer_alloc
+ called with caps we can't handle. We definitely don't want a
+ set_caps with those caps, so we define and allocate a buffer
+ we would like to receive.
+
+2006-01-20 19:10:26 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * autogen.sh:
+ * common:
+ up automake requirement to 1.7
+ Original commit message from CVS:
+ up automake requirement to 1.7
+
+2006-01-19 10:59:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Free iterator when done.
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source):
+ Free iterator when done.
+
+2006-01-17 11:43:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst-libs/gst/audio/gstbaseaudiosink.c: Fix playback of non-synchronised streams by assuming a rate of 1.0 instead of ...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_render):
+ Fix playback of non-synchronised streams by assuming a rate
+ of 1.0 instead of a random one.
+ Makes this work again:
+ gst-launch filesrc location=raw_audio.file ! 'audio/x-raw-int,
+ endianness=(int)4321, signed=(boolean)true, width=(int)16,
+ depth=(int)16, rate=(int)44100, channels=(int)2' ! audioconvert !
+ audioresample ! alsasink
+
+2006-01-16 21:01:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.2 ===
+
+2006-01-16 20:59:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-cdparanoia.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ releasing 0.10.2
+ Original commit message from CVS:
+ releasing 0.10.2
+
+2006-01-16 16:38:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/: Comment out broken code that connects to the state-changed signal.
+ Original commit message from CVS:
+ * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_set_property):
+ Comment out broken code that connects to the state-changed signal.
+ At this point, changing current stream selection is broken, but
+ stuff like gst-launch playbin current-audio=1 works and filters
+ to the chosen stream.
+
+2006-01-16 15:31:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/vorbis/vorbisdec.c: Fix #327216 (null dereference in vorbisdec)
+ Original commit message from CVS:
+ * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query):
+ Fix #327216 (null dereference in vorbisdec)
+
+2006-01-16 15:19:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/theora/theoradec.c: Post taglist actually on bus instead of just freeing it (fixes #327114 and totem bug #327080).
+ Original commit message from CVS:
+ * ext/theora/theoradec.c: (theora_handle_comment_packet):
+ Post taglist actually on bus instead of just freeing it
+ (fixes #327114 and totem bug #327080).
+ * ext/vorbis/vorbisdec.c: (vorbis_handle_comment_packet):
+ Use gst_element_found_tags_for_pad(), so that the tags
+ are sent downstream as an event as well.
+
+2006-01-15 10:06:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ sys/: move all regularly occurring messages to GST_LOG level add some more object logs
+ Original commit message from CVS:
+ * sys/ximage/ximagesink.c: (gst_ximage_buffer_finalize),
+ (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_put),
+ (gst_ximagesink_buffer_alloc):
+ * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_finalize),
+ (gst_xvimagesink_xvimage_put), (gst_xvimagesink_show_frame),
+ (gst_xvimagesink_buffer_alloc):
+ move all regularly occurring messages to GST_LOG level
+ add some more object logs
+
+2006-01-14 22:59:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * 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:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-01-14 20:46:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ ext/ogg/gstoggmux.c: fix a silly segfault
+ Original commit message from CVS:
+ 2006-01-14 Thomas Vander Stichele <thomas at apestaart dot org>
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_collected):
+ fix a silly segfault
+
+2006-01-14 12:52:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add docs for mixerutils stuff.
+ Original commit message from CVS:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * gst-libs/gst/audio/mixerutils.c:
+ * gst-libs/gst/audio/mixerutils.h:
+ Add docs for mixerutils stuff.
+
+2006-01-13 17:17:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/gstplaybasebin.c: Fix playback for sources that emit raw audio or raw video streams (e.g.: cd audio sour...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (setup_source):
+ Fix playback for sources that emit raw audio or
+ raw video streams (e.g.: cd audio sources) (#325984).
+
+2006-01-13 16:45:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst-libs/gst/audio/mixerutils.c: actually save the element we create
+ Original commit message from CVS:
+ * gst-libs/gst/audio/mixerutils.c:
+ (gst_audio_mixer_filter_do_filter):
+ actually save the element we create
+
+2006-01-13 16:17:50 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ remove version suffix
+ Original commit message from CVS:
+ remove version suffix
+
+2006-01-12 14:56:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: No need to post a tag message on the bus when seeking within the same track, only...
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_handle_track_seek):
+ No need to post a tag message on the bus when seeking
+ within the same track, only post it when the current
+ track changes.
+
+2006-01-11 18:30:25 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/: Reenable stream selection. These mechanisms need a complete overhaul in the face of 0.8->0.10 changes ...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (group_destroy),
+ (probe_triggered), (new_decoded_pad), (mute_group_type),
+ (set_active_source):
+ * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute):
+ * gst/playback/gststreamselector.c:
+ (gst_stream_selector_base_init),
+ (gst_stream_selector_set_property),
+ (gst_stream_selector_request_new_pad):
+ Reenable stream selection. These mechanisms need a complete overhaul
+ in the face of 0.8->0.10 changes though.
+
+2006-01-11 18:03:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/ogg/gstoggdemux.c: Change the pad template to src_%d to match the pads that are created from it. decodebin needs ...
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c:
+ Change the pad template to src_%d to match the pads that
+ are created from it. decodebin needs this information in order
+ to decide that oggdemux is capable of producing multiple pads
+ (and hence needs queues inserted).
+ * ext/ogg/gstoggmux.c: (gst_ogg_mux_queue_pads),
+ (gst_ogg_mux_collected):
+ Make debug output more useful by using GST_PTR_FORMAT.
+
+2006-01-11 17:38:35 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gst-plugins-base.spec.in:
+ update spec.in file
+ Original commit message from CVS:
+ update spec.in file
+
+2006-01-11 15:11:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstringbuffer.c: Set depth and width for alaw/mulaw (fixes #326601).
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_parse_caps):
+ Set depth and width for alaw/mulaw (fixes #326601).
+
+2006-01-10 23:58:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/icles/Makefile.am: don't build the tests if we don't have the libs
+ Original commit message from CVS:
+ * tests/icles/Makefile.am:
+ don't build the tests if we don't have the libs
+
+2006-01-10 18:06:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/cdparanoia/gstcdparanoiasrc.c: Don't try to free NULL pointers.
+ Original commit message from CVS:
+ * ext/cdparanoia/gstcdparanoiasrc.c: (gst_cd_paranoia_src_close),
+ (gst_cd_paranoia_paranoia_callback):
+ Don't try to free NULL pointers.
+
+2006-01-10 15:47:48 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/audiorate/gstaudiorate.c: Add debugging category.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_chain),
+ (gst_audio_rate_change_state), (plugin_init):
+ Add debugging category.
+ Fix type issues.
+ Add case for incoming buffers without valid offset/offset_end.
+
+2006-01-10 12:25:59 +0000 Michael Smith <msmith@xiph.org>
+
+ gst-libs/gst/audio/gstaudiosrc.c: Don't leak GCond in audio sources.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstaudiosrc.c: (gst_audioringbuffer_dispose):
+ Don't leak GCond in audio sources.
+
+2006-01-10 11:49:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/playback/gstplaybin.c: Don't leak an autoaudiosink/alsasink when we generate a new audio element. (old code, I gu...
+ Original commit message from CVS:
+ * gst/playback/gstplaybin.c: (gen_audio_element):
+ Don't leak an autoaudiosink/alsasink when we generate
+ a new audio element. (old code, I guess)
+
+2006-01-10 11:04:21 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audiorate/gstaudiorate.c: Support float audio in audiorate.
+ Original commit message from CVS:
+ * gst/audiorate/gstaudiorate.c: (gst_audio_rate_setcaps):
+ Support float audio in audiorate.
+ Use width rather than depth for selecting sample width.
+
+2006-01-10 10:06:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/videotestsrc.h: Use GLib types here (that way we don't have to include the generated _stdint.h heade...
+ Original commit message from CVS:
+ * gst/videotestsrc/videotestsrc.h:
+ Use GLib types here (that way we don't have to include the
+ generated _stdint.h header, which makes life easier for win32
+ folks that don't use autotools for the build) (#325990, patch
+ by: Sergey Scobich).
+
+2006-01-10 09:38:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstringbuffer.*: Name (private) union, makes Forte compiler happy (this time for real) (#324900).
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_init),
+ (gst_ring_buffer_set_flushing), (gst_ring_buffer_start),
+ (gst_ring_buffer_pause), (wait_segment):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Name (private) union, makes Forte compiler happy (this time
+ for real) (#324900).
+
+2006-01-09 10:52:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/Makefile.am: Link against libgstinterfaces, needed for mixer and property probe stuff.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/Makefile.am:
+ Link against libgstinterfaces, needed for mixer
+ and property probe stuff.
+
+2006-01-09 10:46:52 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/Makefile.am:
+ Original commit message from CVS:
+ * gst-libs/gst/Makefile.am:
+
+2006-01-09 09:38:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/: Add gst_audio_default_registry_mixer_filter() utility function.
+ Original commit message from CVS:
+ * gst-libs/gst/audio/Makefile.am:
+ * gst-libs/gst/audio/mixerutils.c:
+ (gst_audio_mixer_filter_do_filter),
+ (gst_audio_mixer_filter_check_element),
+ (gst_audio_mixer_filter_probe_feature),
+ (element_factory_rank_compare_func),
+ (gst_audio_default_registry_mixer_filter):
+ * gst-libs/gst/audio/mixerutils.h:
+ Add gst_audio_default_registry_mixer_filter() utility
+ function.
+
+2006-01-03 17:33:16 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioresample/resample.h: As before, but for o_buf
+ Original commit message from CVS:
+ * gst/audioresample/resample.h:
+ As before, but for o_buf
+
+2006-01-03 17:27:13 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioresample/resample.h: Declare struct _ResampleState.buffer as unsigned char *, not void *, since we do arithm...
+ Original commit message from CVS:
+ * gst/audioresample/resample.h:
+ Declare struct _ResampleState.buffer as unsigned char *, not void *,
+ since we do arithmetic on it.
+
+2006-01-02 23:37:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/audio/gstringbuffer.*: Sun's Forte compiler doesn't seem to like anonymous structs, so use same setup as...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_init),
+ (gst_ring_buffer_set_flushing), (gst_ring_buffer_start),
+ (gst_ring_buffer_pause), (wait_segment):
+ * gst-libs/gst/audio/gstringbuffer.h:
+ Sun's Forte compiler doesn't seem to like anonymous structs,
+ so use same setup as in GstBaseSrc (fixes #324900).
+
+2005-12-30 14:54:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ move old example to tests/examples/volume/volune.c
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/volume/Makefile.am:
+ * gst/volume/demo.c:
+ move old example to tests/examples/volume/volune.c
+ * tests/examples/Makefile.am:
+ * tests/examples/seek/seek.c: (main):
+ change window-close event from "delete-event" to "destroy"
+ * tests/examples/volume/Makefile.am:
+ * tests/examples/volume/volume.c: (value_changed_callback),
+ (setup_gui), (message_received), (eos_message_received), (main):
+ fix event handling and bus usage
+
+2005-12-29 20:37:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: update to basesrc changes, implement segmented seeking and eos handling, add a 's...
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audiostestsrc_wave_get_type), (gst_audio_test_src_class_init),
+ (gst_audio_test_src_init), (gst_audio_test_src_src_fixate),
+ (gst_audio_test_src_query), (gst_audio_test_src_create_sine),
+ (gst_audio_test_src_create_square),
+ (gst_audio_test_src_create_saw),
+ (gst_audio_test_src_create_triangle),
+ (gst_audio_test_src_create_silence),
+ (gst_audio_test_src_create_white_noise),
+ (gst_audio_test_src_create_pink_noise),
+ (gst_audio_test_src_init_sine_table),
+ (gst_audio_test_src_create_sine_table),
+ (gst_audio_test_src_change_wave),
+ (gst_audio_test_src_change_volume), (gst_audio_test_src_do_seek),
+ (gst_audio_test_src_create), (gst_audio_test_src_set_property):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ update to basesrc changes, implement segmented seeking and eos handling,
+ add a 'sine-tab' waveform for performance critical playback
+
+2005-12-29 16:17:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ po/POTFILES.in: ... and this time the other modified file that I missed last time.
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ ... and this time the other modified file that I missed last time.
+
+2005-12-29 14:31:49 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/playback/gstdecodebin.c: Fix non-C89 variable declaration not at the start of a block. Should help some compilers.
+ Original commit message from CVS:
+ * gst/playback/gstdecodebin.c: (new_pad):
+ Fix non-C89 variable declaration not at the start of a block. Should
+ help some compilers.
+
+2005-12-29 12:43:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: And now fix 'make distcheck' (builddir != srcdir)
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ And now fix 'make distcheck' (builddir != srcdir)
+
+2005-12-29 12:22:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ New cdparanoiasrc element based on cddabasesrc; enable cdparanoia plugin again (there are still fixes required to pla...
+ Original commit message from CVS:
+ * configure.ac:
+ * ext/cdparanoia/Makefile.am:
+ * ext/cdparanoia/gstcdparanoia.c:
+ * ext/cdparanoia/gstcdparanoia.h:
+ * ext/cdparanoia/gstcdparanoiasrc.c:
+ (gst_cd_paranoia_mode_get_type), (gst_cd_paranoia_src_base_init),
+ (gst_cd_paranoia_src_init), (gst_cd_paranoia_src_class_init),
+ (gst_cd_paranoia_src_open), (gst_cd_paranoia_src_close),
+ (gst_cd_paranoia_paranoia_callback),
+ (gst_cd_paranoia_src_read_sector), (gst_cd_paranoia_src_finalize),
+ (gst_cd_paranoia_src_set_property),
+ (gst_cd_paranoia_src_get_property), (plugin_init):
+ * ext/cdparanoia/gstcdparanoiasrc.h:
+ New cdparanoiasrc element based on cddabasesrc; enable cdparanoia
+ plugin again (there are still fixes required to playbin to make
+ cdda:// uris work there).
+
+2005-12-29 12:13:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/Makefile.am: Fix test case compilation.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Fix test case compilation.
+
+2005-12-29 11:49:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst-libs/gst/cdda/gstcddabasesrc.c: An integer is not a string. Fix access to uninitialised variable.
+ Original commit message from CVS:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_update_duration),
+ (gst_cdda_base_src_calculate_cddb_id):
+ An integer is not a string. Fix access to uninitialised variable.
+ * tests/check/Makefile.am:
+ Add cddabasesrc unit test; also actually enable the vorbis test.
+ * tests/check/generic/states.c:
+ Blacklist new cd audio elements as well.
+ * tests/check/libs/cddabasesrc.c:
+ Unit test for GstCddaBaseSrc (discid calculation mostly).
+
+2005-12-28 18:19:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/: Add docs for libgstcdda/GstCddaBaseSrc.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gst-plugins-base-libs-docs.sgml:
+ * docs/libs/gst-plugins-base-libs-sections.txt:
+ * docs/libs/gst-plugins-base-libs.types:
+ Add docs for libgstcdda/GstCddaBaseSrc.
+ * gst-libs/gst/interfaces/mixertrack.h:
+ Do one struct member per line with a semicolon at the end, that way
+ even gtk-doc might parse it without complaining.
+
+2005-12-28 18:06:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new libgstcdda with GstCddaBaseSrc class.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst-libs/gst/Makefile.am:
+ * gst-libs/gst/cdda/Makefile.am:
+ * gst-libs/gst/cdda/base64.c:
+ * gst-libs/gst/cdda/base64.h:
+ * gst-libs/gst/cdda/gstcddabasesrc.c:
+ (gst_cdda_base_src_mode_get_type), (gst_cdda_base_src_base_init),
+ (gst_cdda_base_src_class_init), (gst_cdda_base_src_init),
+ (gst_cdda_base_src_finalize), (gst_cdda_base_src_set_property),
+ (gst_cdda_base_src_get_property),
+ (gst_cdda_base_src_get_track_from_sector),
+ (gst_cdda_base_src_get_query_types), (gst_cdda_base_src_convert),
+ (gst_cdda_base_src_query), (gst_cdda_base_src_is_seekable),
+ (gst_cdda_base_src_do_seek), (gst_cdda_base_src_handle_track_seek),
+ (gst_cdda_base_src_handle_event), (gst_cdda_base_src_uri_get_type),
+ (gst_cdda_base_src_uri_get_protocols),
+ (gst_cdda_base_src_uri_get_uri), (gst_cdda_base_src_uri_set_uri),
+ (gst_cdda_base_src_uri_handler_init),
+ (gst_cdda_base_src_setup_interfaces),
+ (gst_cdda_base_src_add_track), (gst_cdda_base_src_update_duration),
+ (cddb_sum), (gst_cddabasesrc_calculate_musicbrainz_discid),
+ (lba_to_msf), (gst_cdda_base_src_calculate_cddb_id),
+ (gst_cdda_base_src_add_tags),
+ (gst_cdda_base_src_add_index_associations),
+ (gst_cdda_base_src_set_index), (gst_cdda_base_src_get_index),
+ (gst_cdda_base_src_track_sort_func), (gst_cdda_base_src_start),
+ (gst_cdda_base_src_clear_tracks), (gst_cdda_base_src_stop),
+ (gst_cdda_base_src_create):
+ * gst-libs/gst/cdda/gstcddabasesrc.h:
+ * gst-libs/gst/cdda/sha1.c:
+ * gst-libs/gst/cdda/sha1.h:
+ Add new libgstcdda with GstCddaBaseSrc class.
+
+2005-12-28 14:59:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/gstgnomevfssink.h: Use GstBaseSinkClass as parent_class member for class struct, not
+ Original commit message from CVS:
+ * ext/gnomevfs/gstgnomevfssink.h:
+ Use GstBaseSinkClass as parent_class member for class struct, not
+ GstBaseSink.
+
+2005-12-27 22:29:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/videotestsrc/gstvideotestsrc.c: Add start method to reset running time and number of frames sent
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_class_init), (gst_video_test_src_start):
+ Add start method to reset running time and number of frames sent
+ when starting up (fixes #324696; patch by: Michal Benes).
+
+2005-12-27 21:58:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/plugins/: Add docs stuff for gnomevfssrc and gnomevfssink.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gst-plugins-base-plugins-docs.sgml:
+ * docs/plugins/gst-plugins-base-plugins-sections.txt:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.hierarchy:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ Add docs stuff for gnomevfssrc and gnomevfssink.
+ * ext/gnomevfs/gstgnomevfssrc.c:
+ Fix example pipeline in gtk-doc blurb.
+
+2005-12-27 21:42:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/gnomevfs/: Port gnomevfssink; add gtk-doc blurb.
+ Original commit message from CVS:
+ * ext/gnomevfs/Makefile.am:
+ * ext/gnomevfs/gstgnomevfs.c: (gst_gnome_vfs_uri_get_type),
+ (gst_gnome_vfs_handle_copy), (gst_gnome_vfs_handle_free),
+ (gst_gnome_vfs_handle_get_type), (plugin_init):
+ * ext/gnomevfs/gstgnomevfs.h:
+ * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_do_init),
+ (gst_gnome_vfs_sink_base_init), (gst_gnome_vfs_sink_class_init),
+ (gst_gnome_vfs_sink_finalize), (gst_gnome_vfs_sink_init),
+ (gst_gnome_vfs_sink_set_property),
+ (gst_gnome_vfs_sink_get_property), (gst_gnome_vfs_sink_open_file),
+ (gst_gnome_vfs_sink_close_file), (gst_gnome_vfs_sink_start),
+ (gst_gnome_vfs_sink_stop), (gst_gnome_vfs_sink_handle_event),
+ (gst_gnome_vfs_sink_query), (gst_gnome_vfs_sink_render),
+ (gst_gnome_vfs_sink_uri_get_type),
+ (gst_gnome_vfs_sink_uri_get_protocols),
+ (gst_gnome_vfs_sink_uri_get_uri), (gst_gnome_vfs_sink_uri_set_uri),
+ (gst_gnome_vfs_sink_uri_handler_init):
+ * ext/gnomevfs/gstgnomevfssink.h:
+ Port gnomevfssink; add gtk-doc blurb.
+ * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_get_type),
+ (gst_gnome_vfs_src_base_init), (gst_gnome_vfs_src_class_init),
+ (gst_gnome_vfs_src_init), (gst_gnome_vfs_src_finalize),
+ (gst_gnome_vfs_src_uri_get_type),
+ (gst_gnome_vfs_src_uri_get_protocols),
+ (gst_gnome_vfs_src_uri_get_uri), (gst_gnome_vfs_src_uri_set_uri),
+ (gst_gnome_vfs_src_uri_handler_init),
+ (gst_gnome_vfs_src_set_property), (gst_gnome_vfs_src_get_property),
+ (gst_gnome_vfs_src_unicodify), (audiocast_thread_run),
+ (gst_gnome_vfs_src_send_additional_headers_callback),
+ (gst_gnome_vfs_src_received_headers_callback),
+ (gst_gnome_vfs_src_push_callbacks),
+ (gst_gnome_vfs_src_pop_callbacks),
+ (gst_gnome_vfs_src_get_icy_metadata), (gst_gnome_vfs_src_create),
+ (gst_gnome_vfs_src_is_seekable), (gst_gnome_vfs_src_get_size),
+ (gst_gnome_vfs_src_start), (gst_gnome_vfs_src_stop):
+ * ext/gnomevfs/gstgnomevfssrc.h:
+ s/gst_gnomevfssrc/gst_gnome_vfs_src/; move header stuff to header
+ file; add gtk-doc blurb with example pipelines.
+
+2005-12-23 18:16:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.1 ===
+
+2005-12-23 18:08:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * docs/plugins/gst-plugins-base-plugins.args:
+ * docs/plugins/gst-plugins-base-plugins.signals:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ releasing 0.10.1
+ Original commit message from CVS:
+ releasing 0.10.1
+
+2005-12-21 20:59:52 +0000 Edgard Lima <edgard.lima@indt.org.br>
+
+ * ChangeLog:
+ * gst/typefind/gsttypefindfunctions.c:
+ iLBC30 and iLBC20 added to typefind.
+ Original commit message from CVS:
+ iLBC30 and iLBC20 added to typefind.
+
+2005-12-20 15:57:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * 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:
+ prereleasing
+ Original commit message from CVS:
+ prereleasing
+
+2005-12-20 12:24:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ stop making fun of older compilers
+ Original commit message from CVS:
+ stop making fun of older compilers
+
+2005-12-20 12:00:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst-libs/gst/audio/: update strings, values are in microseconds change the default sink buffer time to something that...
+ Original commit message from CVS:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ (gst_base_audio_sink_class_init):
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ (gst_base_audio_src_class_init):
+ update strings, values are in microseconds
+ change the default sink buffer time to something that is smaller
+ (to help software volume mixing have a slightly lower delay) but
+ still be acceptable on Wim's laptop
+
+2005-12-20 10:13:05 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst-libs/gst/riff/riff-media.c: Made a quack, forgot to add DUCK to the riff video template.
+ Original commit message from CVS:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_template_caps):
+ Made a quack, forgot to add DUCK to the riff video template.
+
+2005-12-19 15:00:38 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ ext/ogg/gstogmparse.c: Make sure pads are initialized correctly.
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_text_parse_base_init),
+ (gst_ogm_parse_init), (gst_ogm_audio_parse_init),
+ (gst_ogm_video_parse_init), (gst_ogm_text_parse_init),
+ (gst_ogm_parse_chain):
+ Make sure pads are initialized correctly.
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
+ (gst_riff_create_video_template_caps):
+ Add a whole bunch of FOURCC <=> MimeType.
+ Extend the riff video pad template to support the newly added fourcc.
+
+2005-12-18 15:04:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ ext/ogg/gstoggdemux.c: Extra debug output when activating/deactivating chains.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_demux_deactivate_current_chain),
+ (gst_ogg_demux_activate_chain):
+ Extra debug output when activating/deactivating chains.
+ * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter),
+ (is_demuxer_element), (try_to_link_1), (remove_element_chain),
+ (unlinked):
+ Remove a queue from our list when it becomes unlinked.
+ Don't add queues to elements in class 'Demux' if they
+ can only produce one pad
+
+2005-12-18 10:54:33 +0000 Julien Moutte <julien@moutte.net>
+
+ gst-libs/gst/video/gstvideosink.c: Add a debug category.
+ Original commit message from CVS:
+ 2005-12-18 Julien MOUTTE <julien@moutte.net>
+ * gst-libs/gst/video/gstvideosink.c: (gst_video_sink_base_init),
+ (gst_video_sink_get_type): Add a debug category.
+
+2005-12-18 00:56:07 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: Handle downstream newsegment by sending our own newsegment before the next bu...
+ Original commit message from CVS:
+ 2005-12-17 Philippe Khalaf <burger@speedy.org>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_init), (gst_base_rtp_depayload_handle_sink_event):
+ Handle downstream newsegment by sending our own newsegment before the
+ next buffer to be released. (#323900)
+
+2005-12-18 00:41:10 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst-libs/gst/rtp/gstbasertpdepayload.c: add queue delay to new segment as well (as opposed to just the first buffer)....
+ Original commit message from CVS:
+ 2005-12-17 Philippe Khalaf <burger@speedy.org>
+ * gst-libs/gst/rtp/gstbasertpdepayload.c:
+ (gst_base_rtp_depayload_set_gst_timestamp):
+ add queue delay to new segment as well (as opposed to just the first
+ buffer). (bug #322347)
+
+2005-12-16 22:00:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ext/libvisual/visual.c: change some char* into char[]
+ Original commit message from CVS:
+ * ext/libvisual/visual.c: (make_valid_name):
+ change some char* into char[]
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_class_init), (gst_audio_test_src_do_seek),
+ (gst_audio_test_src_create):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ prepare to handle EOS and SEGMENT_DONE
+
+2005-12-16 12:32:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/generic/states.c: Blacklist cdparanoia element in state test.
+ Original commit message from CVS:
+ * tests/check/generic/states.c: (GST_START_TEST):
+ Blacklist cdparanoia element in state test.
+
+2005-12-16 11:25:51 +0000 Benjamin Pineau <ben.pineau@gmail.com>
+
+ gst/tcp/: Add <string.h> includes for memset and FD_ZERO (fixes #323878;
+ Original commit message from CVS:
+ * gst/tcp/gsttcp.c:
+ * gst/tcp/gsttcpclientsink.c:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ Add <string.h> includes for memset and FD_ZERO (fixes #323878;
+ patch by: Benjamin Pineau).
+
+2005-12-15 14:43:38 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/videorate/gstvideorate.c: Fix timestamping for videorate when the first buffer it sees has a non-zero timestamp. ...
+ Original commit message from CVS:
+ * gst/videorate/gstvideorate.c: (gst_video_rate_blank_data),
+ (gst_video_rate_chain):
+ Fix timestamping for videorate when the first buffer it sees has a
+ non-zero timestamp. Fix some misleading debug output.
+
+2005-12-15 10:30:14 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/audioresample/gstaudioresample.c: Don't leak all input buffers to audioresample.
+ Original commit message from CVS:
+ * gst/audioresample/gstaudioresample.c:
+ Don't leak all input buffers to audioresample.
+
+2005-12-15 10:15:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/pango/gsttextoverlay.c: Don't operate on empty text buffers. Strip newlines and tabs only from the end of the tex...
+ Original commit message from CVS:
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_collected):
+ Don't operate on empty text buffers. Strip newlines and
+ tabs only from the end of the text, but leave them intact
+ in the middle. Fix typo in gtk-doc description.
+
+2005-12-15 09:48:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Make sure the video frame buffer we return to apps via the "frame" property always has caps set on it....
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c:
+ * gst/playback/gstplaybin.c: (handoff):
+ Make sure the video frame buffer we return to apps via the
+ "frame" property always has caps set on it. Modify
+ _gst_gvalue_set_object() macro to handle NULL objects
+ gracefully too.
+
+2005-12-14 20:42:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/audiotestsrc/gstaudiotestsrc.*: Adjust to some recent api changes and add wtays new cool seeking capabillities
+ Original commit message from CVS:
+ * gst/audiotestsrc/gstaudiotestsrc.c:
+ (gst_audio_test_src_class_init), (gst_audio_test_src_init),
+ (gst_audio_test_src_setcaps), (gst_audio_test_src_src_query),
+ (gst_audio_test_src_do_seek), (gst_audio_test_src_is_seekable),
+ (gst_audio_test_src_create):
+ * gst/audiotestsrc/gstaudiotestsrc.h:
+ Adjust to some recent api changes and add wtays new cool seeking
+ capabillities
+
+2005-12-14 17:58:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ ext/alsa/: Helper functions to add device probing via the GstPropertyProbe interface to a class.
+ Original commit message from CVS:
+ * ext/alsa/Makefile.am:
+ * ext/alsa/gstalsadeviceprobe.c:
+ * ext/alsa/gstalsadeviceprobe.h:
+ Helper functions to add device probing via the GstPropertyProbe
+ interface to a class.
+ * ext/alsa/gstalsamixer.h:
+ Comment out GST_ALSA_MIXER, it returns a struct that's not
+ used.
+ * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open):
+ Add some debug info.
+ * ext/alsa/gstalsamixerelement.c:
+ (gst_alsa_mixer_element_interface_supported),
+ (gst_implements_interface_init),
+ (gst_alsa_mixer_element_init_interfaces),
+ (gst_alsa_mixer_element_class_init),
+ (gst_alsa_mixer_element_finalize), (gst_alsa_mixer_element_init),
+ (gst_alsa_mixer_element_set_property),
+ (gst_alsa_mixer_element_get_property),
+ (gst_alsa_mixer_element_change_state):
+ * ext/alsa/gstalsamixerelement.h:
+ Add 'device' and 'device-name' properties. Add GstPropertyProbe
+ for device handling (gnome-volume-control will need that).
+
+2005-12-12 20:31:24 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * ChangeLog:
+ * ext/Makefile.am:
+ * gst-plugins-base.spec.in:
+ updates to activate cdparanoia plugin
+ Original commit message from CVS:
+ updates to activate cdparanoia plugin
+
+2005-12-12 19:13:09 +0000 Michael Smith <msmith@xiph.org>
+
+ ext/ogg/gstoggdemux.c: Use the correct function to free list of typefind factories.
+ Original commit message from CVS:
+ * ext/ogg/gstoggdemux.c: (gst_ogg_type_find):
+ Use the correct function to free list of typefind factories.
+
+2005-12-12 15:09:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/videotestsrc/gstvideotestsrc.*: Implement seeking in videotestsrc.
+ Original commit message from CVS:
+ * gst/videotestsrc/gstvideotestsrc.c:
+ (gst_video_test_src_class_init), (gst_video_test_src_init),
+ (gst_video_test_src_parse_caps), (gst_video_test_src_query),
+ (gst_video_test_src_do_seek), (gst_video_test_src_is_seekable),
+ (gst_video_test_src_create):
+ * gst/videotestsrc/gstvideotestsrc.h:
+ Implement seeking in videotestsrc.
+ Small cleanups.
+
+2005-12-12 15:06:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ ext/cdparanoia/: Partially ported cdparanoia now that basesrc can support a plugin like this..
+ Original commit message from CVS:
+ * ext/cdparanoia/Makefile.am:
+ * ext/cdparanoia/gstcdparanoia.c: (gst_paranoia_mode_get_type),
+ (gst_paranoia_endian_get_type), (_do_init),
+ (cdparanoia_class_init), (cdparanoia_init),
+ (cdparanoia_set_property), (cdparanoia_get_property),
+ (cdparanoia_do_seek), (cdparanoia_is_seekable),
+ (cdparanoia_create), (cdparanoia_start), (cdparanoia_stop),
+ (cdparanoia_convert), (cdparanoia_get_query_types),
+ (cdparanoia_query), (cdparanoia_set_index),
+ (cdparanoia_uri_set_uri):
+ * ext/cdparanoia/gstcdparanoia.h:
+ Partially ported cdparanoia now that basesrc can support a
+ plugin like this..
+
+2005-12-12 13:03:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/examples/seek/scrubby.c: Set higher priority for bus events so they don't get reordered with gtk gui events.
+ Original commit message from CVS:
+ * tests/examples/seek/scrubby.c: (main):
+ Set higher priority for bus events so they don't get reordered with
+ gtk gui events.
+ * tests/examples/seek/seek.c: (do_seek), (start_seek), (stop_seek),
+ (flush_toggle_cb), (main):
+ Added checkbox do disable flushing seeks.
+ Disable scrubbing when doing non flushing seeks.
+
+2005-12-12 09:52:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/subparse/gstsubparse.c: Implement some sort of event handling that doesn't rely on g_return_if_fail; make sure we...
+ Original commit message from CVS:
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_init),
+ (gst_sub_parse_do_seek), (gst_sub_parse_src_event), (parse_subrip),
+ (parser_state_init), (handle_buffer), (gst_sub_parse_chain),
+ (gst_sub_parse_sink_event), (gst_sub_parse_change_state):
+ Implement some sort of event handling that doesn't rely on
+ g_return_if_fail; make sure we always push the last chunk of an
+ .srt out when we receive an EOS; use gst_pad_alloc_buffer; fix
+ state change function; remove some old cruft. Seeking is still
+ rather unlikely to work though.
+ * tools/.cvsignore:
+ Ignore more.
+
+2005-12-11 22:26:08 +0000 Julien Moutte <julien@moutte.net>
+
+ sys/xvimage/xvimagesink.c: Fixed a leak of the current image reference when cleaning up.
+ Original commit message from CVS:
+ 2005-12-11 Julien MOUTTE <julien@moutte.net>
+ * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state):
+ Fixed a leak of the current image reference when cleaning up.
+ Thanks to Arwed von Merkatz (alley_cat) for pointing it out.
+
+2005-12-09 10:23:42 +0000 Michael Smith <msmith@xiph.org>
+
+ tools/: Remove gst-launch-ext. It doesn't work, and is no longer particularly useful.
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-launch-ext-m.m:
+ Remove gst-launch-ext. It doesn't work, and is no longer
+ particularly useful.
+
+2005-12-08 18:53:57 +0000 Luca Ognibene <luogni@tin.it>
+
+ ext/ogg/gstogmparse.c: don't pass random values to ogmparse convert function.
+ Original commit message from CVS:
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_sink_query):
+ don't pass random values to ogmparse convert function.
+ Make seeking possible in the exile1.ogm file.
+
+2005-12-07 18:51:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/playback/: Work around refcount problem with g_value_set_object() that occur if the core has been compiled agains...
+ Original commit message from CVS:
+ * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property):
+ * gst/playback/gstplaybin.c: (gst_play_bin_get_property):
+ Work around refcount problem with g_value_set_object() that occur
+ if the core has been compiled against GLib-2.6 (g_value_set_object()
+ will only g_object_ref() the element, but the caller will
+ gst_object_unref() it and bad things will happen due to the way
+ GstObjects are refcounted in the GLib-2.6 case). Fixes problems with
+ totem for people on FC4 using Thomas's 0.10 RPMs.
+
+2005-12-07 11:34:37 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Time to welcome ogm to 0.10 :)
+ Original commit message from CVS:
+ Time to welcome ogm to 0.10 :)
+ * ext/ogg/gstoggdemux.c: (internal_element_pad_added_cb),
+ (gst_ogg_pad_typefind):
+ Oggdemux can now properly typefind elements with dynamic pads.
+ * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain):
+ Properly set caps on src pad, and set caps on outgoing buffers.
+
+2005-12-06 19:42:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * ext/alsa/gstalsamixer.h:
+ * ext/alsa/gstalsamixerelement.h:
+ * ext/alsa/gstalsamixeroptions.h:
+ * ext/alsa/gstalsamixertrack.h:
+ * ext/alsa/gstalsasink.c:
+ * ext/alsa/gstalsasink.h:
+ * ext/alsa/gstalsasrc.c:
+ * ext/alsa/gstalsasrc.h:
+ * ext/cdparanoia/gstcdparanoia.h:
+ * ext/gnomevfs/gstgnomevfsuri.h:
+ * ext/ogg/gstoggdemux.c:
+ * ext/ogg/gstoggmux.c:
+ * ext/pango/gsttextoverlay.h:
+ * ext/theora/theoradec.c:
+ * ext/theora/theoraenc.c:
+ * ext/vorbis/vorbisdec.h:
+ * ext/vorbis/vorbisenc.c:
+ * ext/vorbis/vorbisenc.h:
+ * ext/vorbis/vorbisparse.h:
+ * gst-libs/gst/audio/gstaudioclock.h:
+ * gst-libs/gst/audio/gstaudiosink.c:
+ * gst-libs/gst/audio/gstaudiosink.h:
+ * gst-libs/gst/audio/gstaudiosrc.c:
+ * gst-libs/gst/audio/gstaudiosrc.h:
+ * gst-libs/gst/audio/gstbaseaudiosink.c:
+ * gst-libs/gst/audio/gstbaseaudiosink.h:
+ * gst-libs/gst/audio/gstbaseaudiosrc.c:
+ * gst-libs/gst/audio/gstbaseaudiosrc.h:
+ * gst-libs/gst/audio/gstringbuffer.h:
+ * gst-libs/gst/audio/multichannel.h:
+ * gst-libs/gst/floatcast/floatcast.h:
+ * gst-libs/gst/interfaces/colorbalance.c:
+ * gst-libs/gst/interfaces/colorbalance.h:
+ * gst-libs/gst/interfaces/colorbalancechannel.h:
+ * gst-libs/gst/interfaces/mixer.h:
+ * gst-libs/gst/interfaces/mixeroptions.h:
+ * gst-libs/gst/interfaces/mixertrack.h:
+ * gst-libs/gst/interfaces/navigation.h:
+ * gst-libs/gst/interfaces/propertyprobe.h:
+ * gst-libs/gst/interfaces/tuner.h:
+ * gst-libs/gst/interfaces/tunerchannel.h:
+ * gst-libs/gst/interfaces/tunernorm.h:
+ * gst-libs/gst/interfaces/xoverlay.h:
+ * gst-libs/gst/netbuffer/gstnetbuffer.h:
+ * gst-libs/gst/riff/riff-ids.h:
+ * gst-libs/gst/riff/riff-media.h:
+ * gst-libs/gst/riff/riff-read.h:
+ * gst-libs/gst/rtp/gstbasertpdepayload.h:
+ * gst-libs/gst/rtp/gstbasertppayload.c:
+ * gst-libs/gst/rtp/gstbasertppayload.h:
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * gst-libs/gst/tag/gsttageditingprivate.h:
+ * gst-libs/gst/tag/gstvorbistag.c:
+ * gst-libs/gst/tag/tag.h:
+ * gst-libs/gst/video/video.h:
+ * gst/adder/gstadder.c:
+ * gst/adder/gstadder.h:
+ * gst/audioconvert/audioconvert.c:
+ * gst/audioconvert/audioconvert.h:
+ * gst/audioconvert/gstaudioconvert.c:
+ * gst/audioconvert/gstchannelmix.c:
+ * gst/audioconvert/gstchannelmix.h:
+ * gst/audiorate/gstaudiorate.c:
+ * gst/audioresample/buffer.h:
+ * gst/audioresample/functable.h:
+ * gst/audioresample/gstaudioresample.c:
+ * gst/audioresample/resample.h:
+ * gst/ffmpegcolorspace/avcodec.h:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.c:
+ * gst/ffmpegcolorspace/gstffmpegcodecmap.h:
+ * gst/ffmpegcolorspace/imgconvert.c:
+ * gst/ffmpegcolorspace/imgconvert_template.h:
+ * gst/playback/gstdecodebin.c:
+ * gst/playback/gstplaybasebin.h:
+ * gst/playback/gstplaybin.c:
+ * gst/playback/gststreaminfo.h:
+ * gst/tcp/gstfdset.c:
+ * gst/tcp/gstfdset.h:
+ * gst/tcp/gstmultifdsink.c:
+ * gst/tcp/gstmultifdsink.h:
+ * gst/tcp/gsttcp.h:
+ * gst/tcp/gsttcpclientsrc.c:
+ * gst/tcp/gsttcpclientsrc.h:
+ * gst/tcp/gsttcpplugin.h:
+ * gst/tcp/gsttcpserversink.c:
+ * gst/tcp/gsttcpserversrc.c:
+ * gst/typefind/gsttypefindfunctions.c:
+ * gst/videorate/gstvideorate.c:
+ * gst/videotestsrc/gstvideotestsrc.h:
+ * gst/videotestsrc/videotestsrc.h:
+ * sys/v4l/gstv4lcolorbalance.h:
+ * sys/v4l/gstv4ltuner.h:
+ * sys/v4l/gstv4lxoverlay.h:
+ * sys/v4l/v4l_calls.h:
+ * sys/v4l/videodev_mjpeg.h:
+ * tests/check/elements/audioconvert.c:
+ * tests/check/elements/audioresample.c:
+ * tests/check/elements/audiotestsrc.c:
+ * tests/check/elements/videotestsrc.c:
+ * tests/check/elements/volume.c:
+ * tests/examples/seek/scrubby.c:
+ * tests/examples/seek/seek.c:
+ expand tabs
+ Original commit message from CVS:
+ expand tabs
+
+2005-12-06 19:28:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstaudio.sgml:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * docs/libs/tmpl/gstgconf.sgml:
+ * docs/libs/tmpl/gstmixer.sgml:
+ * docs/libs/tmpl/gstringbuffer.sgml:
+ * docs/libs/tmpl/gsttuner.sgml:
+ * docs/libs/tmpl/gstxoverlay.sgml:
+ put back stability level
+ Original commit message from CVS:
+ put back stability level
+
+2005-12-05 18:11:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.0 ===
+
+2005-12-05 18:02:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/libs/tmpl/gstcolorbalance.sgml:
+ * docs/plugins/inspect/plugin-adder.xml:
+ * docs/plugins/inspect/plugin-alsa.xml:
+ * docs/plugins/inspect/plugin-audioconvert.xml:
+ * docs/plugins/inspect/plugin-audiorate.xml:
+ * docs/plugins/inspect/plugin-audioresample.xml:
+ * docs/plugins/inspect/plugin-audiotestsrc.xml:
+ * docs/plugins/inspect/plugin-decodebin.xml:
+ * docs/plugins/inspect/plugin-ffmpegcolorspace.xml:
+ * docs/plugins/inspect/plugin-gnomevfs.xml:
+ * docs/plugins/inspect/plugin-libvisual.xml:
+ * docs/plugins/inspect/plugin-ogg.xml:
+ * docs/plugins/inspect/plugin-pango.xml:
+ * docs/plugins/inspect/plugin-playbin.xml:
+ * docs/plugins/inspect/plugin-subparse.xml:
+ * docs/plugins/inspect/plugin-tcp.xml:
+ * docs/plugins/inspect/plugin-theora.xml:
+ * docs/plugins/inspect/plugin-typefindfunctions.xml:
+ * docs/plugins/inspect/plugin-video4linux.xml:
+ * docs/plugins/inspect/plugin-videorate.xml:
+ * docs/plugins/inspect/plugin-videoscale.xml:
+ * docs/plugins/inspect/plugin-videotestsrc.xml:
+ * docs/plugins/inspect/plugin-volume.xml:
+ * docs/plugins/inspect/plugin-vorbis.xml:
+ * docs/plugins/inspect/plugin-ximagesink.xml:
+ * docs/plugins/inspect/plugin-xvimagesink.xml:
+ releasing 0.10.0
+ Original commit message from CVS:
+ releasing 0.10.0
+
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..126379f
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,88 @@
+DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
+
+if BUILD_EXTERNAL
+SUBDIRS_EXT = ext
+else
+SUBDIRS_EXT =
+endif
+
+SUBDIRS = \
+ pkgconfig \
+ gst-libs \
+ gst sys $(SUBDIRS_EXT) \
+ tools \
+ tests \
+ docs \
+ po \
+ common \
+ m4
+
+DIST_SUBDIRS = \
+ pkgconfig \
+ docs \
+ gst-libs \
+ gst sys ext \
+ tools \
+ tests \
+ po \
+ common \
+ m4
+
+# include before EXTRA_DIST for win32 assignment
+include $(top_srcdir)/common/win32.mak
+
+EXTRA_DIST = \
+ gst-plugins-base.spec depcomp \
+ AUTHORS COPYING COPYING.LIB NEWS README RELEASE REQUIREMENTS \
+ ChangeLog gst-plugins-base.doap autogen.sh $(win32)
+
+DISTCLEANFILES = _stdint.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_COPY = \
+ $(top_builddir)/gst-libs/gst/*/*-enumtypes.[ch] \
+ $(top_builddir)/_stdint.h
+
+win32-update:
+ for f in $(WIN32_COPY); do cp -v $$f win32/common; done; \
+ for f in win32/common/*-enumtypes.c; do \
+ echo "Indenting $$f"; \
+ gst-indent $$f; gst-indent $$f; \
+ done
+ cp -v $(top_builddir)/win32/common/config.h-new \
+ $(top_srcdir)/win32/common/config.h
+
+include $(top_srcdir)/common/coverage/lcov.mak
+
+check: check-exports
+
+# cruft: plugins that have been merged or moved or renamed
+
+CRUFT_FILES = \
+ $(top_builddir)/common/shave \
+ $(top_builddir)/common/shave-libtool \
+ $(top_builddir)/gst-libs/gst/audio/testchannels \
+ $(top_builddir)/tools/gst-discoverer
+
+CRUFT_DIRS = \
+ $(top_srcdir)/sys/v4l \
+ $(top_srcdir)/tests/examples/v4l
+
+include $(top_srcdir)/common/cruft.mak
+
+all-local: check-cruft
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..8a7e962
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,1199 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/gst-plugins-base.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 COPYING.LIB 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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-base.spec
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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 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 = \
+ { test ! -d "$(distdir)" \
+ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr "$(distdir)"; }; }
+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
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = -I m4 -I common/m4
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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
+@BUILD_EXTERNAL_FALSE@SUBDIRS_EXT =
+@BUILD_EXTERNAL_TRUE@SUBDIRS_EXT = ext
+SUBDIRS = \
+ pkgconfig \
+ gst-libs \
+ gst sys $(SUBDIRS_EXT) \
+ tools \
+ tests \
+ docs \
+ po \
+ common \
+ m4
+
+DIST_SUBDIRS = \
+ pkgconfig \
+ docs \
+ gst-libs \
+ gst sys ext \
+ tools \
+ tests \
+ po \
+ common \
+ m4
+
+
+# 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-base.spec depcomp \
+ AUTHORS COPYING COPYING.LIB NEWS README RELEASE REQUIREMENTS \
+ ChangeLog gst-plugins-base.doap autogen.sh $(win32)
+
+DISTCLEANFILES = _stdint.h
+
+# make bz2 as well
+AUTOMAKE_OPTIONS = dist-bzip2
+WIN32_COPY = \
+ $(top_builddir)/gst-libs/gst/*/*-enumtypes.[ch] \
+ $(top_builddir)/_stdint.h
+
+
+# cruft: plugins that have been merged or moved or renamed
+CRUFT_FILES = \
+ $(top_builddir)/common/shave \
+ $(top_builddir)/common/shave-libtool \
+ $(top_builddir)/gst-libs/gst/audio/testchannels \
+ $(top_builddir)/tools/gst-discoverer
+
+CRUFT_DIRS = \
+ $(top_srcdir)/sys/v4l \
+ $(top_srcdir)/tests/examples/v4l
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(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_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; \
+ $(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-base.spec: $(top_builddir)/config.status $(srcdir)/gst-plugins-base.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 -9 -c >$(distdir).tar.bz2
+ $(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 -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 -9 -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.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" \
+ $(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:
+ @$(am__cd) '$(distuninstallcheck_dir)' \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { 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 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-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 $(WIN32_COPY); do cp -v $$f win32/common; done; \
+ for f in win32/common/*-enumtypes.c; do \
+ echo "Indenting $$f"; \
+ gst-indent $$f; gst-indent $$f; \
+ done
+ cp -v $(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: check-exports
+
+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..d5d4ab8
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,9 @@
+This is GStreamer Base Plug-ins 0.11.1, "A handful sometimes, A heartful always"
+
+New in 0.11.1:
+
+ * Ported to 0.11.0 core API changes
+ * Rename GstXOverlay -> GstVideoOverlay
+ * Reworked audio caps
+ * Support for multiple frames in buffers
+ * Add video colorimetry support
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..7f2b749
--- /dev/null
+++ b/RELEASE
@@ -0,0 +1,127 @@
+
+Release notes for GStreamer Base Plug-ins 0.11.1 "A handful sometimes, A heartful always"
+
+
+
+The GStreamer team is proud to announce a new release
+in the 0.11.x unstable series of the
+GStreamer Base Plug-ins.
+
+
+The 0.11.x series is an unstable series targeted at developers.
+It is not API or ABI compatible with the stable 0.10.x series.
+It is, however, parallel installable with the 0.10.x series.
+
+
+
+This module contains a set of reference plugins, base classes for other
+plugins, and helper libraries.
+
+This module is kept up-to-date together with the core developments. Element
+writers should look at the elements in this module as a reference for
+their development.
+
+This module contains elements for, among others:
+
+ device plugins: x(v)imagesink, alsa, v4lsrc, cdparanoia
+ containers: ogg
+ codecs: vorbis, theora
+ text: textoverlay, subparse
+ sources: audiotestsrc, videotestsrc, gnomevfssrc, giosrc
+ network: tcp
+ typefind functions
+ audio processing: audioconvert, adder, audiorate, audioresample, volume
+ visualisation: libvisual
+ video processing: videoconvert
+ aggregate elements: uridecodebin, playbin, decodebin, encodebin
+ libraries: app, audio, cdda, fft, interfaces, netbuffer, pbutils, riff, rtp, rtsp, sdp, tag, video
+
+
+Other modules containing plug-ins are:
+
+
+gst-plugins-good
+contains a set of well-supported plug-ins under our preferred license
+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
+
+ * Parallel installability with 0.10.x series
+ * Rename GstXOverlay -> GstVideoOverlay
+ * Reworked audio caps
+ * Support for multiple frames in buffers
+ * Add video colorimetry support
+There were no bugs fixed in this release
+
+
+Download
+
+You can find source releases of gst-plugins-base in the download directory:
+http://gstreamer.freedesktop.org/src/gst-plugins-base/
+
+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
+
+ * Age Bosma
+ * Alessandro Decina
+ * Alex Lancaster
+ * Benjamin Otte
+ * Christian Fredrik Kalager Schaller
+ * David Schleef
+ * Edward Hervey
+ * Erich Schubert
+ * Iago Toral
+ * Jan Schmidt
+ * Jason Kivlighn
+ * Josep Torra
+ * LoneStar
+ * Mark Nauwelaerts
+ * Monty Montgomery
+ * Nicolas Dufresne
+ * Olivier Crête
+ * Raimo Järvi
+ * René Stadler
+ * Robert Swain
+ * Sebastian Dröge
+ * Sergey Scobich
+ * Sergey Scobich)
+ * Sjoerd Simons
+ * Stefan Kost
+ * Stefan Sauer
+ * Sébastien Moutte
+ * Thiago Santos
+ * Thomas Vander Stichele
+ * Tim-Philipp Müller
+ * Tommi Myöhänen
+ * Vincent Penquerc'h
+ * Wim Taymans
+ * Youness Alaoui
+  \ No newline at end of file
diff --git a/REQUIREMENTS b/REQUIREMENTS
new file mode 100644
index 0000000..e620fc6
--- /dev/null
+++ b/REQUIREMENTS
@@ -0,0 +1,105 @@
+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:
+===================
+
+The core GStreamer libraries. See the gstreamer/ module in GStreamer cvs, or
+the version that corresponds to this plugin release.
+
+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.
+
+
+Optional libraries:
+===================
+
+This file lists supporting libraries for which gst-plugins-base 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
+
+Package: GTK+
+Version: >= 2.0
+Recommended: >= 2.2
+URL: http://www.gtk.org/
+DebianPackage: libgtk2.0-dev
+Notes: Required by several examples
+
+Package: Xlib
+Plugins: xvimagesink, ximagesink, v4l (v4lsrc), ximagesrc
+DebianPackage: libx11-dev libxv-dev libxt-dev
+
+Package: Alsa
+Version: >= 0.9.1
+Plugins: alsa (alsasrc, alsasink)
+URL: http://www.alsa-project.org/
+DebianPackage: libasound2-dev
+
+Package: CDParanoia
+Plugins: cdparanoia
+URL: http://xiph.org/paranoia/
+DebianPackage: libcdparanoia0-dev
+
+Package: GnomeVFS
+Version: >= 2.0 (2.4?)
+Plugins: gnomevfs (gnomevfssrc)
+URL: http://www.gnome.org/
+DebianPackage: libgnomevfs2-dev
+
+Package: libvisual
+Version: >= 0.2.0
+Recommended: 0.4.0
+Plugins: libvisual
+URL: http://localhost.nl/~synap/libvisual-wiki/index.php/Main_Page
+DebianPackage: libvisual0.4-dev
+
+Package: Ogg
+Version: >= 1.0
+Plugins: ogg (oggdemux, oggmux)
+URL: http://xiph.org/ogg/
+DebianPackage: libogg-dev
+
+Package: Pango
+Plugins: pango
+DebianPackage: libpango1.0-dev
+URL: http://www.pango.org/
+
+Package: Theora
+Plugins: theora (theoradec, theoraenc)
+URL: http://www.theora.org/
+DebianPackage: libtheora-dev
+
+Package: Vorbis
+Plugins: vorbis (vorbisdec, vorbisenc)
+DebianPackage: libvorbis-dev
+URL: http://www.vorbis.com/
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..7127794
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1112 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 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.
+
+# 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.67],,
+[m4_warning([this file was generated for autoconf 2.67.
+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 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.
+
+# 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.1], [],
+ [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.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 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.
+
+# 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
+# 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 10
+
+# 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'.
+ 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
+ ;;
+ 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='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])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 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.
+
+# 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
+# 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 am_maintainer_other 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 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.
+
+# 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 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_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 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_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
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 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.
+
+# 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 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_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 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.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} 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 <conftest.tar])
+ grep GrepMe conftest.dir/file >/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-libtool.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-error.m4])
+m4_include([common/m4/gst-feature.m4])
+m4_include([common/m4/gst-function.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-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/introspection.m4])
+m4_include([common/m4/orc.m4])
+m4_include([common/m4/pkg.m4])
+m4_include([m4/freetype2.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/gst-alsa.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/lrint.m4])
+m4_include([m4/lrintf.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/ogg.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/vorbis.m4])
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..820a017
--- /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-base
+srcfile=gst/audiotestsrc/gstaudiotestsrc.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 --forward < 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 <bilboed@gmail.com>
+
+ * gst.supp:
+ And yet another variation of the GstAudioFilter leak.
+
+2008-12-15 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Patch by: Roland Illig <roland dot illig at gmx dot de>
+
+ * 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 <bilboed@gmail.com>
+
+ * gst.supp:
+ And yet another variant of the GstAudioFilter leak.
+
+2008-12-13 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * 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 <edward.hervey@collabora.co.uk>
+
+ * gst.supp:
+ Fix leak in GIO called by gnomevfs. Nothing we can do about this.
+
+2008-12-12 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * 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 <edward.hervey@collabora.co.uk>
+
+ * 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 <sebastian.droege@collabora.co.uk>
+
+ * 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 <mark.nauwelaerts@collabora.co.uk>
+
+ * gst.supp:
+ Add suppression variant for Ubuntu Hardy x86/64bit.
+
+2008-12-01 Stefan Kost <ensonic@users.sf.net>
+
+ * gtk-doc-plugins.mak:
+ * gtk-doc.mak:
+ Simplily uninstall rule. Its closer to upstream and fixes #150331.
+
+2008-11-29 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * m4/glib-gettext.m4:
+ Update glib-gettext.m4 from latest stable GLib release.
+
+2008-11-29 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Patch by: Cygwin Ports maintainer
+ <yselkowitz at users dot sourceforge dot net>
+
+ * 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 <sebastian.droege@collabora.co.uk>
+
+ * m4/gtk-doc.m4:
+ * m4/pkg.m4:
+ Update gtk-doc and pkg-config m4 macros from their latest releases.
+
+2008-11-20 Michael Smith <msmith@songbirdnest.com>
+
+ * m4/as-objc.m4:
+ Fix objective C test macro when none of the compilers are found at all.
+
+2008-10-30 Stefan Kost <ensonic@users.sf.net>
+
+ * 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 <jan.schmidt@sun.com>
+
+ * gtk-doc.mak:
+ Don't clobber the real registry cache file when
+ building docs.
+
+2008-10-07 Jan Schmidt - Sun Microsystems <jan.schmidt@sun.com>
+
+ * m4/gst-error.m4:
+ Also disable the bogus "loop not entered at top" warnings appearing on Sparc Forte builds.
+
+2008-10-06 Stefan Kost <ensonic@users.sf.net>
+
+ * 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 <ds@schleef.org>
+
+ * 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 <ds@schleef.org>
+
+ * 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 <ensonic@users.sf.net>
+
+ * 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 <ensonic@users.sf.net>
+
+ * 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 <mark.nauwelaerts@collabora.co.uk>
+
+ * gst.supp:
+ Add suppressions for Ubunty Hardy x86/64bit, similar to earlier
+ versions and 32bit variant.
+
+2008-07-31 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * m4/gst-feature.m4:
+ Remove GST_DISABLE_(ENUMTYPES|INDEX|URI).
+
+2008-07-21 Tim-Philipp Müller <tim.muller at collabora co uk>
+
+ * 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 <tim.muller at collabora co uk>
+
+ * 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 <ensonic@users.sf.net>
+
+ * plugins.xsl:
+ Split refsect2 also here to make "Element Pads" subtitle visible.
+
+2008-07-08 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * 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 <mark.nauwelaerts@collabora.co.uk>
+
+ * gtk-doc-plugins.mak:
+ Only clean doc maintainer stamps in maintainer-clean. Fixes #539977.
+
+2008-06-20 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <tim.muller at collabora co uk>
+
+ * 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 <jan.schmidt@sun.com>
+
+ * 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 <ensonic@users.sf.net>
+
+ * plugins.xsl:
+ The class was not shown in plugin docs. Fix typo in changelog below.
+
+2008-05-22 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gstdoc-scangobj:
+ Emit warnings if one of the GTypes we're expecting is 0
+ when scanning.
+
+2008-05-21 Felipe Contreras <felipe.contreras@gmail.com>
+
+ * gtk-doc-plugins.mak:
+ * gtk-doc.mak:
+ Fix installing png images when gtk-doc is disabled.
+
+2008-05-21 Felipe Contreras <felipe.contreras@gmail.com>
+
+ * gtk-doc-plugins.mak:
+ * gtk-doc.mak:
+ Fix make clean when gtk-doc is disabled and other cleanups.
+
+2008-05-17 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gtk-doc-plugins.mak:
+ Be more quiet when the files don't yet exist.
+
+2008-05-16 Jan Schmidt <jan.schmidt@sun.com>
+
+ * 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 <pkj@axis.com>
+
+ * 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 <tim.muller at collabora co uk>
+
+ * gst.supp:
+ Add suppression for glibc bug on gutsy/x86-64
+
+2008-05-12 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins.xsl:
+ Improve the layout of the caps, but splitting them on ";".
+
+2008-05-09 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Patch by: Brian Cameron <brian dot cameron at sun dot com>
+
+ * 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 <tim.muller at collabora co uk>
+
+ * check.mak: (help):
+ Document GST_CHECKS environment variable in checks 'make help'.
+
+2008-05-06 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Patch by: Marc-Andre Lureau <marcandre dot lureau at gmail dot com>
+
+ * 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 <edward.hervey@collabora.co.uk>
+
+ * 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 <bilboed@gmail.com>
+
+ * gst.supp: Make tls leak suppression a bit more generic.
+
+2008-04-22 Edward Hervey <bilboed@gmail.com>
+
+ * 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 <bilboed@gmail.com>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * Makefile.am:
+ * m4/Makefile.am:
+ Dist all files in common. Fixes bug #527984.
+
+2008-04-14 Tim-Philipp Müller <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * m4/gst-default.m4:
+ Add --with-default-{audiosink|audiosrc|videosink|videosrc|visualizer}
+ configure switches (#519417).
+
+2008-04-03 Tim-Philipp Müller <tim at centricular dot net>
+
+ * m4/gst-args.m4:
+ Add --disable-foo switch for dependency-less plugins (#525586).
+
+2008-04-01 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * m4/gst-parser.m4:
+ Unconditionally require flex 2.5.31 and bison 1.875.
+
+2008-03-23 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * m4/gst-arch.m4:
+ amd64/x86_64 allows unaligned memory access too.
+
+2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <edward.hervey@collabora.co.uk>
+
+ * 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 <ds@schleef.org>
+
+ * m4/ax_create_stdint_h.m4: Oops, checked in the wrong copy of
+ this file. (Update from upstream)
+
+2008-03-03 David Schleef <ds@schleef.org>
+
+ * m4/ax_create_stdint_h.m4: Update from upstream. Fixes a bug
+ compiling with MSVC.
+
+2008-03-03 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * 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 <pkj@axis.com>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * gst.supp:
+ Add another glibc suppression.
+
+2008-02-29 Peter Kjellerstedt <pkj@axis.com>
+
+ * m4/gst-feature.m4:
+ Make the comment before defines generated via AG_GST_CHECK_FEATURE
+ look nicer. (#498222)
+
+2008-02-26 Jan Schmidt <jan.schmidt@sun.com>
+
+ * 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 <wingo@pobox.com>
+
+ * 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 <Jan.Schmidt@sun.com>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * gst.supp:
+ Add even more glibc 2.7 suppressions.
+
+2008-02-22 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * gst.supp:
+ Add another suppression for GLib caching some values after
+ the first call.
+
+2008-02-12 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Patch by:
+ Tim Mooney <mooney at dogbert dot cc dot ndsu dot nodak dot edu>
+
+ * m4/gst-error.m4:
+ Use no%E_MACRO_REDEFINED on Solaris to prevent compiler warnings.
+ Fixes bug #515905.
+
+2008-02-11 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * 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 <ensonic@users.sf.net>
+
+ * ChangeLog:
+ Changelog surgery for last commit.
+
+2008-02-08 Stefan Kost <ensonic@users.sf.net>
+
+ * m4/gtk-doc.m4:
+ Conditionally check for SED. Also sync a bit with upstream macro.
+
+2008-02-08 Stefan Kost <ensonic@users.sf.net>
+
+ * 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 <ensonic@users.sf.net>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <ensonic@users.sf.net>
+
+ * ChangeLog:
+ ChangeLog surgery.
+
+ * gstdoc-scangobj:
+ Sync the object scanner with gtk-doc fixes. Update args and hierarchy
+ files.
+
+2008-01-20 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * gst.supp:
+ Add some glibc 2.7 supressions as found on Debian/unstable.
+
+2008-01-14 Jan Schmidt <jan.schmidt@sun.com>
+
+ * download-translations:
+ Apparently I have problems with leaving things commented out when
+ I edit shell scripts.
+
+2008-01-12 Jan Schmidt <Jan.Schmidt@sun.com>
+
+ * download-translations:
+ Remove bash-isms
+
+2008-01-12 Jan Schmidt <Jan.Schmidt@sun.com>
+
+ * check-exports:
+ Restore the cleanup rm of our tmp file which I didn't mean to leave
+ commented out.
+
+2008-01-12 Jan Schmidt <Jan.Schmidt@sun.com>
+
+ * 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 <tim at centricular dot net>
+
+ Patch by: Peter Kjellerstedt <pkj axis com>
+
+ * 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 <ensonic@users.sf.net>
+
+ * coverage/lcov.mak:
+ Update coverage make-rules: use them conditionaly, use libtool mode
+ and use lcov to cleanup.
+
+2007-12-18 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * glib-gen.mak:
+ Also use #include "header" instead of #include <header> 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 <slomo@circular-chaos.org>
+
+ * glib-gen.mak:
+ Use #include "header" instead of #include <header> 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * Makefile.am:
+ Don't forget to dist the new win32.mak.
+
+2007-12-17 Tim-Philipp Müller <tim at centricular dot net>
+
+ * win32.mak: (win32), (win32defs):
+ Move common win32 Makefile foo into this new file.
+
+2007-12-15 Stefan Kost <ensonic@users.sf.net>
+
+ * gtk-doc-plugins.mak:
+ * gtk-doc.mak:
+ We should have never forked this that much :/.
+
+2007-12-13 Tim-Philipp Müller <tim at centricular dot net>
+
+ * check-exports:
+ Fix build on the ppc64 build bot.
+
+2007-12-13 Tim-Philipp Müller <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * Makefile.am:
+ check-exports should be disted.
+
+2007-12-12 Tim-Philipp Müller <tim at centricular dot net>
+
+ * 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 <jan.schmidt@sun.com>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <tim at centricular dot net>
+
+ * gtk-doc-plugins.mak:
+ Just use the normal 'check' target and avoid a circular
+ dependency.
+
+2007-09-06 Tim-Philipp Müller <tim at centricular dot net>
+
+ * gtk-doc-plugins.mak:
+ Add rule to error out if .hierarchy file contains tabs.
+
+2007-08-20 Tim-Philipp Müller <tim at centricular dot net>
+
+ * download-translations:
+ * po.mak:
+ If there are new languages, they need to be added to po/LINGUAS.
+
+2007-08-20 Tim-Philipp Müller <tim at centricular dot net>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * gst.supp:
+ Add a suppression for GLib caching the tmp dir seen on an
+ Ubuntu Feisty system.
+
+2007-07-13 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <ensonic@users.sf.net>
+
+ * gst-xmlinspect.py:
+ * plugins.xsl:
+ Also extract element caps for plugin-docs. Fixes parts of #117692.
+
+2007-06-21 Tim-Philipp Müller <tim at centricular dot net>
+
+ Patch by: Andreas Schwab
+
+ * m4/gst-feature.m4:
+ Fix quoting (#449493).
+
+2007-06-10 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * 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 <msmith@fluendo.com>
+
+ * gst.supp:
+ Suppression variant for our good friend the TLS leak, this time for
+ Ubuntu Feisty/x86.
+
+2007-05-09 Tim-Philipp Müller <tim at centricular dot net>
+
+ * gtk-doc-plugins.mak:
+ Fix make distcheck again; change some spaces to tabs in makefile.
+
+2007-04-29 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gtk-doc-plugins.mak (-module):
+ Error out when the html build step gives warnings, so they get
+ fixed properly.
+
+2007-04-23 Stefan Kost <ensonic@users.sf.net>
+
+ * 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 <slomo@circular-chaos.org>
+
+ Patch by: Vincent Torri <vtorri at univ-evry dot fr>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <slomo@circular-chaos.org>
+
+ * m4/gst-parser.m4:
+ Fix the flex version check. It ignored the micro version before.
+
+2007-03-09 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * gst.supp:
+ add a suppression for this GConf flup on the FC5 buildbot.
+
+2007-03-06 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst.supp:
+ Make the suppression a little more generic, to catch the FC5
+ backtrace too.
+
+2007-03-06 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-arch.m4:
+ Move a line that was in the wrong macro
+
+2007-02-28 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <ensonic@users.sf.net>
+
+ * 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 <tim at centricular dot net>
+
+ Patch by: Will Newton <will.newton gmail com>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <msmith@fluendo.com>
+
+ * gst.supp:
+ More suppressions for edgy.
+
+2006-09-28 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <tim at centricular dot net>
+
+ * gst.supp:
+ Some suppressions for the more recent ld.so in ubuntu edgy.
+
+2006-08-23 Tim-Philipp Müller <tim at centricular dot net>
+
+ * gst.supp:
+ Shorten function trail so the suppression works on
+ my ubuntu dapper system with core cvs as well.
+
+2006-07-28 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst.supp:
+ Extra suppressions from my Ubuntu x86_64 machine
+
+2006-07-24 Tim-Philipp Müller <tim at centricular dot net>
+
+ Patch by: Frederic Peters <fpeters at entrouvert com>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * 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 <ensonic@users.sf.net>
+
+ Patch by: Frederic Peters <fpeters@entrouvert.com>
+
+ * m4/gst-parser.m4:
+ Fix bison detection (#348354)
+
+2006-07-21 Stefan Kost <ensonic@users.sf.net>
+
+ * m4/gst-parser.m4:
+ check for bison and flex
+
+2006-07-13 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-args.m4:
+ when building with gcov, reset CFLAGS and friends to O0
+
+2006-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <tim at centricular dot net>
+
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+
+ * 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 <tim at centricular dot net>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-arch.m4:
+ add PPC64 so we can have separate structure sizes for it
+
+2006-06-05 Edward Hervey <edward@fluendo.com>
+
+ * gtk-doc.mak:
+ Check for the proper .devhelp2 file to remove.
+
+2006-05-31 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gtk-doc.mak:
+ allow a magic variable to suppress errors from docbuilding
+
+2006-05-30 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * gtk-doc.mak:
+ error out if gtkdoc-mktmpl finds unused declarations
+
+2006-05-28 Edward Hervey <edward@fluendo.com>
+
+ * gst.supp:
+ Reverting previous commit. That's good to know, Edward, but why ?
+
+2006-05-28 Edward Hervey <edward@fluendo.com>
+
+ * gst.supp:
+ Added suppresion for memleak in g_option_context_parse on fc5-64
+
+2006-05-19 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-check.m4:
+ set GSTPB_PLUGINS_DIR just like GST_PLUGINS_DIR
+
+2006-05-18 Tim-Philipp Müller <tim at centricular dot net>
+
+ * 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 <thomas at apestaart dot org>
+
+ Patch by: Peter Kjellerstedt
+
+ * m4/gst-arch.m4:
+ add support for CRIS and CRISv32.
+
+2006-05-17 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * gtk-doc.mak:
+ Add uninstall rule to remove .devhelp2 files.
+
+2006-05-09 Edward Hervey <edward@fluendo.com>
+
+ * gst.supp:
+ Add suppression for GSlice version of
+ g_type_init calloc leak
+
+2006-04-05 Michael Smith <msmith@fluendo.com>
+
+ * gst.supp:
+ Delete a bogus suppression for the registry code.
+ Generalise a suppression for a glib bug (see #337404)
+
+2006-04-04 Michael Smith <msmith@fluendo.com>
+
+ * gst.supp:
+ Add a leak suppression: the existing glibc-doesn't-free-TLS one
+ wasn't triggering here.
+
+2006-04-04 Michael Smith <msmith@fluendo.com>
+
+ * gst.supp:
+ Add some minimally-neccesary suppressions for my x86/dapper system.
+
+2006-04-01 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * plugins.xsl:
+ Do not display an origin link if origin does not start with http
+ See #323798
+
+2006-04-01 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-args.m4:
+ * m4/gst-feature.m4:
+ add more macros
+ * m4/gst-x11.m4:
+ X11-related checks
+
+2006-04-01 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * gst.supp:
+ add a suppression for g_parse_debug_string
+
+2006-03-23 Stefan Kost <ensonic@users.sf.net>
+
+ * gstdoc-scangobj:
+ sync fully with gtkdoc-0.15
+
+2006-03-23 Stefan Kost <ensonic@users.sf.net>
+
+ * gstdoc-scangobj:
+ * gtk-doc.mak:
+ sync a little with gtk-doc mainline
+
+2006-03-17 Wim Taymans <wim@fluendo.com>
+
+ * gst.supp:
+ add another clone suppression
+ change all glibc suppressions to match 2.3.*
+
+2006-03-09 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thaytan@mad.scientist.com>
+
+ * check.mak:
+ Set G_SLICE=always-malloc when valgrinding tests
+ (closes #333272)
+
+2006-02-21 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * m4/gst-glib2.m4:
+ Fix debug output when the GLib version prerequisite is not found
+
+2006-02-13 Andy Wingo <wingo@pobox.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-default.m4:
+ switch to auto* sinks for defaults
+
+2006-02-02 Wim Taymans <wim@fluendo.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * gtk-doc-plugins.mak:
+ only add srcdir/gst if it exists
+
+2006-01-30 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * release.mak:
+ don't complain about disted enums in win32
+
+2006-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/pkg.m4:
+ update with a more recent version
+
+2006-01-07 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gettext.patch:
+ make Makefile depend on LINGUAS, so rebuilds work when adding
+ a language
+
+2006-01-03 Michael Smith <msmith@fluendo.com>
+
+ * check.mak:
+ Clarify error message from valgrind test runs.
+
+2005-12-16 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-arch.m4:
+ define HOST_CPU
+
+2005-11-29 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * check.mak:
+ add a valgrind-forever target for tests
+
+2005-11-28 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-check.m4:
+ check for tools correctly
+
+2005-10-18 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gtk-doc.mak:
+ only enable breaking on new API when make distcheck passes,
+ not before
+
+2005-10-18 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-check.m4:
+ Resurrect Julien's dead body and wipe his mind clean
+
+2005-10-18 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-check.m4:
+ Kill Julien
+
+2005-10-17 Julien MOUTTE <julien@moutte.net>
+
+ * 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 <ensonic@users.sf.net>
+
+ * gtk-doc.mak:
+ make build break on new api that has not been added to the
+ sections file
+
+2005-10-17 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-glib2.m4:
+ update, warn in error cases
+
+2005-10-16 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-error.m4:
+ add GST_SET_DEFAULT_LEVEL
+
+2005-10-16 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/Makefile.am:
+ * m4/gst-gettext.m4:
+ add macro for setting up gettext
+
+2005-10-15 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-args.m4:
+ add some .m4's for argument checking that can be shared among modules
+
+2005-10-15 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/as-libtool.m4:
+ set _LT_LDFLAGS
+ * m4/gst-libxml2.m4:
+ document
+
+2005-10-15 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-arch.m4:
+ indent a little
+ add AC_REQUIRE
+ * m4/gst-error.m4:
+ clean up
+
+2005-10-12 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gst-autogen.sh:
+ update version detection expression to catch stuff like
+ Libtool (libtool15) 1.5.0
+
+2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gst.supp:
+ commit 6 new suppressions related to g_module_open; can these
+ really not be folded into one ?
+
+2005-10-11 Edward Hervey <edward@fluendo.com>
+
+ * gst.supp:
+ made the <g_type_init calloc 2> suppression more generic
+ Added pthread memleak suppresions
+ Added nss_parse_* memleak suppresion (used by g_option_context_parse)
+
+2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * check.mak:
+ be more strict, more leak resolution
+ * gst.supp:
+ clean up the g_type_init suppressions
+
+2005-10-07 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/Makefile.am:
+ * m4/gst-valgrind.m4:
+ put the valgrind detection in an .m4
+
+2005-09-29 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * check.mak:
+ add some more targets, like "help", but also more intensive tests
+
+2005-09-23 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gtk-doc.mak:
+ make certain doc warnings fatal so people maintain docs again
+
+2005-09-23 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * gst-xmlinspect.py:
+ * gstdoc-scangobj:
+ some fixes for new API
+ * gtk-doc-plugins.mak:
+ set environment properly
+
+2005-09-17 David Schleef <ds@schleef.org>
+
+ * gtk-doc-plugins.mak: Use new environment variables.
+
+2005-09-16 Michael Smith <msmith@fluendo.com>
+
+ * gstdoc-scangobj:
+ Make the scanobj code reflect registry/plugin API changes
+
+2005-09-15 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <ds@schleef.org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * gtk-doc-plugins.mak:
+ error out on inspect failure
+
+2005-09-14 Michael Smith <msmith@fluendo.com>
+
+ * glib-gen.mak:
+ Don't call glib-mkenums with arguments that confuse/break MinGW,
+ fixes 316155.
+
+2005-09-03 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <rbultje@ronald.bitfreak.net>
+
+ * m4/gst-doc.m4:
+ s/pdf/eps/ in test for whether we output EPS images (#309379).
+
+2005-07-18 Andy Wingo <wingo@pobox.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-error.m4:
+ add macro to set ERROR_CFLAGS
+
+2005-06-30 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gtk-doc.m4:
+ added
+
+2005-06-03 Stefan Kost <ensonic@users.sf.net>
+
+ * gst-autogen.sh: create autoregen.sh *before* shifting the options
+
+2005-05-17 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gst-autogen.sh: only update autoregen.sh on actual runs
+
+2005-03-11 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/check.m4: m4 from the check unit test suite
+
+2004-12-14 David Schleef <ds@schleef.org>
+
+ * m4/gst-arch.m4: remove MMX stuff, since it doesn't work and
+ isn't needed anywhere
+
+2004-12-08 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gst-autogen.sh:
+ allow failure command to be run so we can clean upfrom autopoint
+
+2004-09-03 Zeeshan Ali Khattak <zeenix@gmail.com>
+ * m4/gst-feature.m4: Trying to correct the GST_CHECK_CONFIGPROG macro
+
+2004-07-21 Benjamin Otte <otte@gnome.org>
+
+ * m4/.cvsignore: exciting updates for libtool m4 files
+
+2004-07-12 David Schleef <ds@schleef.org>
+
+ * m4/as-objc.m4: Add a macro to test for objective C
+
+2004-06-12 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-feature.m4:
+ not all of them support --plugin-libs, so redirect stderr
+
+2004-06-12 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/as-scrub-include.m4:
+ sync with upstream to 0.1.4. Fixes #132440
+
+2004-06-07 Benjamin Otte <otte@gnome.org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/as-scrub-include.m4: synced with upstream
+
+2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * po.mak:
+ snippet for updating .po files
+
+2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * Makefile.am:
+ * m4/Makefile.am:
+ integrate these with the dist
+
+2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * release.mak: add a release target
+
+2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ patch by: Stephane Loeuillet
+
+ * m4/ax_create_stdint_h.m4:
+ use head -n instead of head - (#136500)
+
+2004-03-05 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-doc.m4: don't build PS without dvips binary
+
+2004-02-22 Julio M. Merino Vidal <jmmv@menta.net>
+
+ reviewed by: Benjamin Otte <otte@gnome.org>
+
+ * m4/as-docbook.m4:
+ don't use == operator with test(1) (fixes #135115)
+
+2004-02-16 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * common/m4/gst-arch.m4: x86_64 is x86 too (clue from Fedora 2 test)
+
+2004-02-13 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * m4/gst-libxml2.m4:
+ take required version as argument, and default to 2.4.9 if not
+ specified
+
+2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * m4/gst-feature.m4:
+ rename and fix up GST_CHECK_DISABLE_SUBSYSTEM
+
+2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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 <johan@gnome.org>
+
+ * gst-autogen.sh: Use A-Z instead of A-z in sed expression to
+ avoid a warning
+
+2004-02-05 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * 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 <thomas at apestaart dot org>
+
+ * glib-gen.mak: added; used to generate enums and marshal code
+
+2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * 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..5f94177
--- /dev/null
+++ b/common/Makefile.in
@@ -0,0 +1,780 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 '<?xml version="1.0"?>'
+ print '<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">'
+ print
+ print '<programlisting>'
+
+ # print content
+ print saxutils.escape(content).encode('UTF-8')
+ print '</programlisting>'
+
+main()
diff --git a/common/check-exports b/common/check-exports
new file mode 100755
index 0000000..c6d3eca
--- /dev/null
+++ b/common/check-exports
@@ -0,0 +1,72 @@
+#!/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_parse_yy/ && \
+ $3 !~ /^_gst_[a-z]*_init/ && \
+ $3 !~ /^_gst_parse_launch/ && \
+ $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 <<EOF;
+<html>
+<head>
+<title>Coverage report for $ARGV[0]</title>
+<style type="text/css">
+ span.perfect {
+ background: rgb(0,255,0);
+ }
+ span.terrible {
+ background: rgb(255,0,0);
+ }
+</style>
+</head>
+<body>
+<h1>Coverage report for $ARGV[0]</h1>
+
+<pre>
+EOF
+
+
+while (<>) {
+ s/&/&amp;/g;
+ s/</&lt;/g;
+ s/>/&gt;/g;
+
+ if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
+ my $class = $2 > 0 ? "perfect" : "terrible";
+ $_ = "<span class=\"$class\" id=\"" . $1 . "\">$_</span>";
+ } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
+ my $class = $1 > 0 ? "perfect" : "terrible";
+ $_ = "<span class=\"$class\">$_</span>";
+ } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
+ my $class = "terrible";
+ $_ = "<span class=\"$class\">$_</span>";
+ } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
+ my $class = "terrible";
+ $_ = "<span class=\"$class\">$_</span>";
+ } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
+ my $class = $1 > 0 ? "perfect" : "terrible";
+ $_ = "<span class=\"$class\">$_</span>";
+ }
+
+ print;
+}
+
+print <<EOF;
+</pre>
+</body>
+</html>
+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 "<coverage>\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 " <entry name=\"%s\" details=\"%s\">\n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
+ printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $rec->{lines}, $rec->{linesCoverage};
+ if (exists $rec->{branches}) {
+ printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $rec->{branches}, $rec->{branchesCoverage};
+ }
+ if (exists $rec->{conds}) {
+ printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $rec->{conds}, $rec->{condsCoverage};
+ }
+ if (exists $rec->{calls}) {
+ printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $rec->{calls}, $rec->{callsCoverage};
+ }
+ print " </entry>\n";
+ }
+
+ printf " <summary>\n";
+ printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
+ printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
+ printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
+ printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
+ printf " </summary>\n";
+ printf "</%ss>\n", $type;
+}
+
+print "</coverage>\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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+#
+# 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
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+ <xsl:output method="html"/>
+
+ <xsl:template match="coverage">
+ <html>
+ <head>
+ <title>Coverage report</title>
+ <style type="text/css">
+ tbody tr.odd td.label {
+ border-top: 1px solid rgb(128,128,128);
+ border-bottom: 1px solid rgb(128,128,128);
+ }
+ tbody tr.odd td.label {
+ background: rgb(200,200,200);
+ }
+
+ thead, tfoot {
+ background: rgb(60,60,60);
+ color: white;
+ font-weight: bold;
+ }
+
+ tr td.perfect {
+ background: rgb(0,255,0);
+ color: black;
+ }
+ tr td.excellant {
+ background: rgb(140,255,140);
+ color: black;
+ }
+ tr td.good {
+ background: rgb(160,255,0);
+ color: black;
+ }
+ tr td.poor {
+ background: rgb(255,160,0);
+ color: black;
+ }
+ tr td.bad {
+ background: rgb(255,140,140);
+ color: black;
+ }
+ tr td.terrible {
+ background: rgb(255,0,0);
+ color: black;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Coverage report</h1>
+ <xsl:apply-templates/>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="functions">
+ <h2>Function coverage</h2>
+ <xsl:call-template name="content">
+ <xsl:with-param name="type" select="'function'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+
+ <xsl:template match="files">
+ <h2>File coverage</h2>
+ <xsl:call-template name="content">
+ <xsl:with-param name="type" select="'file'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="content">
+ <xsl:param name="type"/>
+ <table>
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Lines</th>
+ <th>Branches</th>
+ <th>Conditions</th>
+ <th>Calls</th>
+ </tr>
+ </thead>
+ <tbody>
+ <xsl:for-each select="entry">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="position() mod 2">
+ <xsl:text>odd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>even</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:for-each>
+ </tbody>
+ <tfoot>
+ <xsl:for-each select="summary">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="type" select="'summary'"/>
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="position() mod 2">
+ <xsl:text>odd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>even</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:for-each>
+ </tfoot>
+ </table>
+ </xsl:template>
+
+ <xsl:template name="entry">
+ <xsl:param name="type"/>
+ <xsl:param name="class"/>
+ <tr class="{$class}">
+ <xsl:choose>
+ <xsl:when test="$type = 'function'">
+ <td class="label"><a href="{@details}.html#{@name}"><xsl:value-of select="@name"/></a></td>
+ </xsl:when>
+ <xsl:when test="$type = 'file'">
+ <td class="label"><a href="{@details}.html"><xsl:value-of select="@name"/></a></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td class="label">Summary</td>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="count(lines)">
+ <xsl:apply-templates select="lines"/>
+ </xsl:if>
+ <xsl:if test="not(count(lines))">
+ <xsl:call-template name="missing"/>
+ </xsl:if>
+
+ <xsl:if test="count(branches)">
+ <xsl:apply-templates select="branches"/>
+ </xsl:if>
+ <xsl:if test="not(count(branches))">
+ <xsl:call-template name="missing"/>
+ </xsl:if>
+
+ <xsl:if test="count(conditions)">
+ <xsl:apply-templates select="conditions"/>
+ </xsl:if>
+ <xsl:if test="not(count(conditions))">
+ <xsl:call-template name="missing"/>
+ </xsl:if>
+
+ <xsl:if test="count(calls)">
+ <xsl:apply-templates select="calls"/>
+ </xsl:if>
+ <xsl:if test="not(count(calls))">
+ <xsl:call-template name="missing"/>
+ </xsl:if>
+
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="lines">
+ <xsl:call-template name="row"/>
+ </xsl:template>
+
+ <xsl:template match="branches">
+ <xsl:call-template name="row"/>
+ </xsl:template>
+
+ <xsl:template match="conditions">
+ <xsl:call-template name="row"/>
+ </xsl:template>
+
+ <xsl:template match="calls">
+ <xsl:call-template name="row"/>
+ </xsl:template>
+
+ <xsl:template name="missing">
+ <td></td>
+ </xsl:template>
+
+ <xsl:template name="row">
+ <xsl:variable name="quality">
+ <xsl:choose>
+ <xsl:when test="@coverage = 100">
+ <xsl:text>perfect</xsl:text>
+ </xsl:when>
+ <xsl:when test="@coverage >= 80.0">
+ <xsl:text>excellant</xsl:text>
+ </xsl:when>
+ <xsl:when test="@coverage >= 60.0">
+ <xsl:text>good</xsl:text>
+ </xsl:when>
+ <xsl:when test="@coverage >= 40.0">
+ <xsl:text>poor</xsl:text>
+ </xsl:when>
+ <xsl:when test="@coverage >= 20.0">
+ <xsl:text>bad</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>terrible</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <td class="{$quality}"><xsl:value-of select="@coverage"/>% of <xsl:value-of select="@count"/></td>
+ </xsl:template>
+
+</xsl:stylesheet>
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 '<Project' "$2" >/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~"<release>") {x=1; chunk=""}
+if (x==1) {
+ if ($0~"<revision>") { chunk = chunk $0 }
+ if ($0~"<created>") { chunk = chunk $0 }
+}
+if ($0~"</release>") {x=0; print chunk}
+}' < "$2" | \
+\
+grep '<revision>'"$1"'</revision>' | \
+\
+sed -e 's/^.*<created>//' -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 <glib-object.h>\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 <glib-object.h>\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..c10005f
--- /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
+
+{
+ <clone on Wim's Debian>
+ Memcheck:Param
+ clone(parent_tidptr)
+ fun:clone
+ fun:clone
+}
+
+{
+ <clone on Wim's Debian>
+ Memcheck:Param
+ clone(child_tidptr)
+ fun:clone
+ fun:clone
+}
+
+{
+ <clone on Wim's Debian>
+ Memcheck:Param
+ clone(tlsinfo)
+ fun:clone
+ fun:clone
+}
+
+### glibc suppressions
+
+{
+ <conditional jump on wim's debian 2/2/06>
+ 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
+}
+
+{
+ <Conditional jump>
+ 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:*
+}
+
+{
+ <Conditional jump>
+ Memcheck:Cond
+ fun:_dl_relocate_object
+ fun:dl_main
+ fun:_dl_sysdep_start
+ fun:_dl_start
+}
+
+{
+ <insert a suppression name here>
+ 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
+
+{
+ <tls>
+ Memcheck:Leak
+ fun:calloc
+ fun:_dl_allocate_tls
+ fun:pthread_create@@*
+}
+
+# I get an extra stack entry on x86/dapper
+{
+ <tls>
+ Memcheck:Leak
+ fun:calloc
+ obj:/lib/ld-2.3.*.so
+ fun:_dl_allocate_tls
+ fun:pthread_create@@*
+}
+
+
+{
+ <pthread strstr>
+ 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
+}
+
+{
+ <a conditional jump on wim's debian>
+ 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
+{
+ <started showing up on fc4-quick>
+ 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
+}
+
+{
+ <started showing up on fc4-quick>
+ 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
+}
+
+{
+ <g_module_open on wim's debian>
+ 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
+}
+
+{
+ <g_module_open on wim's debian>
+ 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
+}
+{
+ <g_module_open on wim's debian>
+ 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
+}
+
+{
+ <leak on wim's debian in g_module_open>
+ 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
+}
+
+{
+ <invalid read on wim's debian>
+ 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
+}
+
+{
+ <invalid read on wim's debian>
+ 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
+}
+
+{
+ <invalid read on wim's debian - 2006-02-02>
+ 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
+}
+
+{
+ <invalid read on wim's debian - 2006-02-02>
+ 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
+}
+
+{
+ <invalid read on wim's debian - 2006-02-02>
+ 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
+}
+
+{
+ <futex on Andy's 64-bit ubuntu>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on Ubunty Hardy 64-bit>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on Ubunty Hardy 64-bit>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on Ubunty Hardy 64-bit>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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
+}
+
+{
+ <suppression for glibc 2.7 on debian>
+ 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>
+{
+ <Workaround for a glibc bug>
+ 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
+{
+ <workaround glibc bug 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
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+{
+ <Invalid read of size 1, 2, 4 on thomas's FC4>
+ 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
+}
+
+{
+ <Addr8 on Andy's AMD64 ubuntu in dl_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
+}
+
+{
+ <Conditional jump on Andy's AMD64 ubuntu>
+ 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
+}
+
+{
+ <Mike's x86 dapper>
+ 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
+}
+
+{
+ <Mike's x86 dapper>
+ 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
+}
+
+{
+ <Another dapper one>
+ 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
+{
+ <g_parse_debug_string>
+ Memcheck:Cond
+ fun:g_parse_debug_string
+ obj:/usr/lib*/libglib-2.0.so.*
+ fun:g_slice_alloc
+ fun:g_slice_alloc0
+}
+
+{
+ <g_type_init leaks>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:g_type_init*
+ fun:init_pre
+}
+
+{
+ <g_type_register_fundamental leaks>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:g_type_register_fundamental
+}
+
+{
+ <glib 2.21 static type data>
+ Memcheck:Leak
+ fun:malloc
+ fun:realloc
+ fun:g_realloc
+ fun:type_node_any_new_W
+}
+
+{
+ <glib 2.21 static type data>
+ Memcheck:Leak
+ fun:realloc
+ fun:g_realloc
+ fun:type_node_any_new_W
+}
+
+{
+ <glib 2.21 static type data>
+ Memcheck:Leak
+ fun:calloc
+ fun:g_malloc0
+ fun:g_type_class_ref
+}
+
+{
+ <glib 2.21 static type data>
+ Memcheck:Leak
+ fun:malloc
+ fun:realloc
+ fun:g_realloc
+ fun:type_add_flags_W
+}
+
+{
+ <glib 2.21 static type data>
+ 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
+{
+ <liboil cpu_fault_check_try>
+ 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
+}
+
+{
+ <annoying read error inside dlopen stuff on Ubuntu Dapper x86_64>
+ Memcheck:Addr8
+ obj:/lib/ld-2.3.6.so
+}
+
+{
+ <Ubuntu Dapper x86_64>
+ 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
+}
+
+{
+ <Ubuntu Dapper x86_64 dlopen stuff again>
+ 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
+{
+ <dlopen invalid read of size 4 suppression on tpm's Ubuntu edgy/x86>
+ Memcheck:Addr4
+ obj:/lib/ld-2.4.so
+ obj:/lib/ld-2.4.so
+}
+{
+ <and the same for 64bit systems>
+ Memcheck:Addr8
+ obj:/lib/ld-2.4.so
+ obj:/lib/ld-2.4.so
+}
+
+# More edgy suppressions (Mike)
+{
+ <dlopen Condition jump suppressions for Ubuntu Edgy/x86>
+ 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
+}
+
+{
+ <dlopen Condition jump suppressions for Ubuntu Edgy/x86>
+ 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
+}
+
+{
+ <dlopen Condition jump suppressions for Ubuntu Edgy/x86>
+ 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!
+{
+ <dlopen Condition jump suppressions for Ubuntu Edgy/x86>
+ 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
+}
+
+{
+ <tls leaks on Edgy/x86>
+ 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
+{
+ <tls leaks on Feisty/x86>
+ Memcheck:Leak
+ fun:calloc
+ fun:allocate_dtv
+ fun:_dl_allocate_tls
+ fun:pthread_create@@GLIBC_2.1
+}
+
+{
+ <libcdio 0.76 leak>
+ 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
+}
+
+{
+ <Addr8 on Jan's AMD64 ubuntu Feisty in dl_open>
+ Memcheck:Addr8
+ obj:/lib/ld-2.5.so
+}
+
+{
+ <First of many Alsa errors>
+ 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
+}
+
+{
+ <alsa error>
+ Memcheck:Cond
+ fun:snd*_pcm_hw_param_set_near
+}
+
+{
+ <alsa error>
+ Memcheck:Cond
+ ...
+ fun:snd*_pcm_hw_param_set_near
+}
+
+{
+ <alsa error>
+ 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
+}
+{
+ <alsa error>
+ 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
+}
+{
+ <alsa error>
+ 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
+{
+ <alsa error>
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:snd*_dlobj_cache_add
+ obj:/*lib*/libasound.so.2.0.0
+}
+
+{
+ <alsa leak in loading configuration>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:snd_pcm_open_conf
+}
+
+{
+ <alsa leak snd_config_hook_load>
+ Memcheck:Leak
+ fun:*alloc
+ obj:/*lib*/libasound.so.2.0.0
+ ...
+ fun:snd_config_hook_load
+}
+
+{
+ <alsa leak snd_config_update_r>
+ Memcheck:Leak
+ fun:*alloc
+ obj:/*lib*/libasound.so.2.0.0
+ ...
+ fun:snd_config_update_r
+ fun:snd_config_update
+}
+{
+ <alsa leak snd_config_update_r>
+ Memcheck:Leak
+ fun:*alloc
+ fun:strdup
+ ...
+ fun:snd_config_update_r
+ fun:snd_config_update
+}
+{
+ <nss lookup within ALSA>
+ 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
+}
+
+{
+ <libxcb leak on Ubuntu Feisty>
+ Memcheck:Leak
+ fun:calloc
+ fun:_XCBInitDisplayLock
+ fun:XOpenDisplay
+}
+
+# GConf internal initialisations related to getting the default client.
+{
+ <Orbit something or other>
+ 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
+}
+{
+ <gconf internal leak>
+ 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
+}
+{
+ <gconf internal leak>
+ 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
+}
+{
+ <gconf internal initialisation>
+ 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
+}
+{
+ <gconf internal init>
+ 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
+}
+{
+ <gconf internal init>
+ 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
+}
+{
+ <gconf internal init>
+ 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
+}
+
+{
+ <insert a suppression name here>
+ 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
+{
+ <bonobo init>
+ 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
+}
+{
+ <bonobo 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*
+}
+{
+ <bonobo init>
+ 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
+}
+{
+ <bonobo init - more recent variant of above>
+ 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
+}
+{
+ <bonobo 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
+{
+ <incompletely initialised ORBit buffer>
+ 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
+}
+{
+ <gconf 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/libgconf-2.so*
+ obj:/usr/lib/libgconf-2.so*
+ obj:/usr/lib/libgconf-2.so*
+ fun:gconf_engine_get_default
+}
+{
+ <gconf init>
+ 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
+}
+{
+ <gconf init>
+ 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
+}
+{
+ <bonobo init>
+ 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
+}
+{
+ <gconf init>
+ 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
+}
+{
+ <GLib caching the 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_home_dir
+}
+{
+ <GLib caching the 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_user_name
+}
+{
+ <GLib caching the 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.*
+ fun:g_get_tmp_dir
+}
+
+{
+ <GLib caching the host name>
+ 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.
+{
+ <First time load of a font - feisty x86_64>
+ 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
+}
+{
+ <First time load of a font - generic>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:FcInitLoadConfig
+}
+
+# Issues with ubuntu Hardy, same crack as for previous ubuntus
+{
+ <tls leak generic ubuntu hardy x86>
+ 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
+{
+ <tls leak generic>
+ 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
+{
+ <invalid read of size 4 within <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/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_*
+}
+
+{
+ <invalid read of size 4 within <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/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_*
+}
+
+{
+ <invalid read of size 4 within <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/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_*
+}
+
+{
+ <invalid read of size 4 within <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/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_*
+}
+
+{
+ <invalid read of size 4 within <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/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*
+}
+
+{
+ <invalid read of size 4 within <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/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
+{
+ <invalid read of size 8 within <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/libdl-2.7.so
+ obj:/lib/ld-2.7.so
+ obj:/lib/libdl-2.7.so
+ fun:dlopen
+ fun:g_module_open
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <invalid read of size 8 within <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
+}
+
+{
+ <GLib caching>
+ 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
+}
+
+{
+ <GLib caching>
+ 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
+}
+
+{
+ <GLib caching>
+ 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
+}
+
+{
+ <GLib caching>
+ 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
+}
+
+{
+ <GLib caching>
+ 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)
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:calloc
+ fun:_snd_config_make
+ fun:_snd_config_make_add
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+{
+ <Alsa leak>
+ 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
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:malloc
+ fun:snd1_dlobj_cache_add
+ fun:snd_ctl_open_noupdate
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:malloc
+ fun:*
+ fun:snd1_dlobj_cache_add
+ fun:snd_ctl_open_noupdate
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:snd_config_load1
+}
+
+{
+ <Alsa leak>
+ 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).
+
+{
+ <Leak in ogmparsers>
+ 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
+}
+
+{
+ <Leak in ogmparsers>
+ 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
+}
+
+{
+ <Leak in videotestsrc>
+ 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
+}
+
+{
+ <Leak in videotestsrc>
+ 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
+}
+
+{
+ <Leak in ffmpegcolorspace>
+ 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
+}
+
+{
+ <Leak in ffmpegocolorspace>
+ 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
+}
+
+{
+ <Leak in gstffmpegdemux>
+ 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
+}
+
+{
+ <Leak in GstAudioFilter subclasses>
+ 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
+}
+
+{
+ <Leak in GstAudioFilter subclasses, variant>
+ 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
+}
+
+{
+ <Leak in GstAudioFilter subclasses, variant>
+ 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
+}
+
+{
+ <Leak in GstAudioFilter subclasses, variant>
+ 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
+}
+
+{
+ <Leak in GstAudioFilter subclasses, variant2>
+ 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
+}
+{
+ <Leak in GstAudioFilter subclasses, variant3>
+ 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
+}
+{
+ <Leak in GstAudioFilter subclasses, variant4>
+ 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
+}
+{
+ <Leak in GstAudioFilter subclasses, variant5>
+ 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
+}
+
+{
+ <Leak in riff-media>
+ Memcheck:Leak
+ fun:malloc
+ fun:g_malloc
+ fun:g_slice_alloc
+ fun:gst_caps_new_empty
+ fun:gst_riff_create_*_template_caps
+}
+{
+ <Leak in riff-media>
+ 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
+}
+{
+ <Leak in riff-media>
+ 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)
+
+{
+ <Pango leak - generic>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:pango_layout_get_pixel_extents
+}
+{
+ <insert a suppression name here>
+ 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
+}
+
+{
+ <PangoLanguage can never be freed>
+ 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.
+{
+ <insert a suppression name here>
+ 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
+}
+{
+ <insert a suppression name here>
+ 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
+}
+
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:gst_ffmpeg_cfg_init
+ fun:gst_ffmpegenc_register
+}
+
+## Leak of GIO module through gnomevfs
+
+{
+ <gio leak>
+ 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)
+{
+ <Leak of addrinfo in esd>
+ Memcheck:Cond
+ fun:gaih_inet
+ fun:getaddrinfo
+}
+
+## Dynamic pad templates in mxfmux
+{
+ <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
+{
+ <insert a suppression name here>
+ 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
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:do_sym
+ fun:dlsym_doit
+ fun:_dl_catch_error
+ fun:_dlerror_run
+ fun:dlsym
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:do_sym
+ fun:dlsym_doit
+ fun:_dl_catch_error
+ fun:_dlerror_run
+ fun:dlsym
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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*
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ obj:/lib*/libc-2.10.*.so
+ obj:/lib*/libc-2.10.*.so
+ fun:_vgnU_freeres
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ obj:/lib*/libc-2.10.*.so
+ obj:/lib*/libc-2.10.*.so
+ fun:_vgnU_freeres
+}
+{
+ <glibc-2.10 mysterious invalid free on exit>
+ Memcheck:Free
+ fun:free
+ obj:/lib*/libc-2.10.*.so
+ obj:/lib*/libc-2.10.*.so
+ fun:_vgnU_freeres
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_fini
+ fun:__run_exit_handlers
+ fun:exit
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_fini
+ fun:__run_exit_handlers
+ fun:exit
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_sort_fini
+ fun:_dl_fini
+ fun:__run_exit_handlers
+ fun:exit
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_sort_fini
+ fun:_dl_fini
+ fun:__run_exit_handlers
+ fun:exit
+}
+
+# glibc-2.10 dl overreads
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_fixup
+ fun:_dl_runtime_resolve
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_fixup
+ fun:_dl_runtime_resolve
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_lookup_symbol_x
+ fun:_dl_fixup
+ fun:_dl_runtime_resolve
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_lookup_symbol_x
+ fun:_dl_fixup
+ fun:_dl_runtime_resolve
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:call_init
+ fun:_dl_init
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_init
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:dl_main
+ fun:_dl_sysdep_start
+ fun:_dl_start
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:dl_main
+ fun:_dl_sysdep_start
+ fun:_dl_start
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_check_map_versions
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_check_map_versions
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_check_map_versions
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_check_map_versions
+ fun:_dl_check_all_versions
+ fun:version_check_doit
+ fun:_dl_receive_error
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:init_tls
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:init_tls
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_protect_relro
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_setup_hash
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_new_object
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_new_object
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:open_path
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:open_path
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_new_object
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_new_object
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_new_object
+ fun:_dl_map_object_from_fd
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:*
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_name_match_p
+ fun:_dl_check_map_versions
+ fun:_dl_check_all_versions
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:do_lookup_x
+ fun:_dl_lookup_symbol_x
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+ fun:dl_open_worker
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+ fun:dl_open_worker
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+ fun:dl_open_worker
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+ fun:dl_open_worker
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_lookup_symbol_x
+ fun:_dl_relocate_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:_dl_check_map_versions
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_check_map_versions
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:*
+ fun:_dl_check_map_versions
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_check_map_versions
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:openaux
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_name_match_p
+ fun:_dl_map_object
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_close_worker
+ fun:_dl_close
+ fun:_dl_catch_error
+ fun:dlerror_run
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_close_worker
+ fun:_dl_close
+ fun:_dl_catch_error
+ fun:dlerror_run
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_close_worker
+ fun:_dl_close
+ fun:_dl_catch_error
+ fun:dlerror_run
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_close_worker
+ fun:_dl_close
+ fun:_dl_catch_error
+ fun:dlerror_run
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:fillin_rpath
+ fun:_dl_init_paths
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:fillin_rpath
+ fun:_dl_init_paths
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:fillin_rpath
+ fun:_dl_init_paths
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:fillin_rpath
+ fun:_dl_init_paths
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_map_object
+ fun:map_doit
+ fun:_dl_catch_error
+ fun:do_preload
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_map_object
+ fun:map_doit
+ fun:_dl_catch_error
+ fun:do_preload
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ 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
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ 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
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_catch_error
+ fun:_dl_map_object_deps
+ fun:dl_open_worker
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:_dl_map_object_deps
+ fun:dl_main
+}
+
+# glibc-2.10 tls issues
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:init_tls
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:init_tls
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:*
+ fun:init_tls
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:init_tls
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:_dl_allocate_tls_init
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:_dl_allocate_tls_init
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:*
+ fun:_dl_allocate_tls_init
+ fun:dl_main
+}
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Value8
+ fun:*
+ fun:_dl_allocate_tls_init
+ fun:dl_main
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Cond
+ fun:__tls*
+ obj:*
+ obj:*
+ fun:_vgnU_freeres
+}
+
+{
+ <glibc-2.10 overreads/conditionals>
+ Memcheck:Param
+ arch_prctl(arg2)
+ fun:init_tls
+}
+# GLib caching tmp/home directories (glibc-2.10 variants)
+{
+ <glibc-2.10 GLIB leaks>
+ 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*
+}
+{
+ <glibc-2.10 GLIB leaks>
+ 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*
+}
+{
+ <glibc-2.10 GLIB leaks>
+ 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*
+}
+{
+ <glibc-2.10 GLIB leaks>
+ 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*
+}
+
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:_dl_add_to_slotinfo
+ fun:dl_main
+}
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Param
+ open(filename)
+ fun:open
+ fun:open_verify
+ fun:open_path
+ fun:_dl_map_object
+}
+
+
+
+# GModule issues with glibc-2.10
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:dlsym
+ fun:g_module_symbol
+}
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:g_module_*
+ fun:gst_plugin*
+}
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:*
+ fun:g_module_*
+ fun:gst_plugin*
+}
+
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:dlopen*
+ fun:g_module_open
+}
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:dlsym
+ fun:g_module_symbol
+}
+
+{
+ <glibc-2.10 GLIB leaks>
+ Memcheck:Value8
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:*
+ fun:dlopen*
+ fun:g_module_open
+}
+
+# Leak in GSlice
+{
+ <insert a suppression name here>
+ 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
+{
+ <insert a suppression name here>
+ Memcheck:Value8
+ fun:__pthread_initialize_minimal
+}
+
+# glibc 2.11 conditional
+{
+ <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
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+}
+
+{
+ <insert_a_suppression_name_here>
+ 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
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:g_type_register_static
+}
+
+# new registry system
+# all of this will only be created once when loading registry.
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:_priv_gst_registry_chunks_load_plugin
+}
+
+# system-wide tags
+# these tags are registered once
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ fun:*
+ fun:*
+ fun:gst_tag_register
+ fun:_gst_tag_initialize
+}
+
+# system-wide type classes that we keep referenced
+
+{
+ <g_type_class_ref leaks>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:g_type_class_ref
+}
+
+# leaking cached queries which are only initialized once
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:_gst_query_initialize
+ fun:init_post
+}
+
+# macosx (leopard) library loader leak
+{
+ <insert_a_suppression_name_here>
+ 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
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:_g_atomic_array_copy
+}
+
+{
+ <getdelim one-time inits called from libselinux>
+ Memcheck:Leak
+ fun:*alloc
+ fun:getdelim
+ obj:*libselinux*
+}
+
+{
+ <weird one when re-reading registry>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ obj:*/sed
+}
+
+{
+ <weird one when re-reading registry>
+ Memcheck:Addr8
+ ...
+ obj:*/sed
+}
+
+# GLib 2.23 interface vtable
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:g_type_add_interface_static
+}
+
+{
+ <leak in dash on debian sid>
+ Memcheck:Leak
+ fun:*alloc
+ obj:*/dash
+}
+
+# libtool/gentoo fake leak
+# it actually runs bash and valgrind complains
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:*alloc
+ obj:/bin/bash
+}
+
+{
+ <ignore possbly-lost leaks in the plugin scanner which doesn't clean up properly>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:_gst_plugin_loader_client_run
+ fun:main
+}
+
+{
+ <warning with libc 2.13-2 as in Debian/unstable on amd64>
+ Memcheck:Cond
+ fun:*strcasecmp*
+ ...
+ fun:__dcigettext
+}
+
+{
+ <warning with libc 2.13-2 as in Debian/unstable on amd64>
+ Memcheck:Value8
+ fun:*strcasecmp*
+ ...
+ fun:__dcigettext
+}
+
+{
+ <GstSystemClock is a singleton and does not leak>
+ 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 <<EOF;
+gstdoc-scangobj version 1.5 - introspect gstreamer-plugins
+
+--module=MODULE_NAME Name of the doc module being parsed
+--source=SOURCE_NAME Name of the source module for plugins
+--types=FILE The name of the file to store the types in
+--type-init-func=FUNC The init function to call instead of g_type_init()
+--output-dir=DIRNAME The directory where the results are stored
+--inspect-dir=DIRNAME The directory where the plugin inspect data is stored
+--verbose Print extra output while processing
+--version Print the version of this program
+--help Print this help
+EOF
+ exit 0;
+}
+
+$OUTPUT_DIR = $OUTPUT_DIR ? $OUTPUT_DIR : ".";
+
+$TYPES_FILE = $TYPES_FILE ? $TYPES_FILE : "$OUTPUT_DIR/$MODULE.types";
+
+open (TYPES, $TYPES_FILE) || die "Cannot open $TYPES_FILE: $!\n";
+open (OUTPUT, ">$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 (<TYPES>) {
+ 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 <<EOT;
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+$includes
+
+#ifdef GTK_IS_WIDGET_CLASS
+#include <gtk/gtkversion.h>
+#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, "</%s>\\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 ("<plugin>\\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 (" <elements>\\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 (" <element>\\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 (" <pads>\\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 (" <caps>\\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 (" </caps>\\n", inspect);
+ }
+ g_list_free (pads);
+ fputs (" </pads>\\n </element>\\n", inspect);
+ }
+ }
+ features = g_list_next (features);
+ }
+
+ if (reinspect) {
+ fputs (" </elements>\\n</plugin>", 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 <<EOT;
+ type = $_ ();
+ if (type == 0) {
+ g_message ("$_ () didn't return a valid type");
+ }
+ else {
+ object_types[i++] = type;
+ }
+EOT
+}
+
+# Implicit types retrieved from GLib:
+for (@impl_types) {
+print OUTPUT <<EOT;
+ type = g_type_from_name ("$_");
+ if (type == 0) {
+ g_message ("Implicit type $_ not found");
+ }
+ else {
+ object_types[i++] = type;
+ }
+EOT
+}
+
+print OUTPUT <<EOT;
+
+ object_types[i] = 0;
+
+ /* reference the GObjectClass to initialize the param spec pool
+ * potentially needed by interfaces. See http://bugs.gnome.org/571820 */
+ g_object_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ /* Need to make sure all the types are loaded in and initialize
+ * their signals and properties.
+ */
+ for (i=0; object_types[i]; i++)
+ {
+ if (G_TYPE_IS_CLASSED (object_types[i]))
+ g_type_class_ref (object_types[i]);
+ if (G_TYPE_IS_INTERFACE (object_types[i]))
+ g_type_default_interface_ref (object_types[i]);
+ }
+
+ g_type_class_unref (g_object_class);
+
+ return object_types;
+}
+
+/*
+ * This uses GObject type functions to output signal prototypes and the object
+ * hierarchy.
+ */
+
+/* The output files */
+const gchar *signals_filename = "$new_signals_filename";
+const gchar *hierarchy_filename = "$new_hierarchy_filename";
+const gchar *interfaces_filename = "$new_interfaces_filename";
+const gchar *prerequisites_filename = "$new_prerequisites_filename";
+const gchar *args_filename = "$new_args_filename";
+
+
+static void output_signals (void);
+static void output_object_signals (FILE *fp,
+ GType object_type);
+static void output_object_signal (FILE *fp,
+ const gchar *object_class_name,
+ guint signal_id);
+static const gchar * get_type_name (GType type,
+ gboolean * is_pointer);
+static void output_object_hierarchy (void);
+static void output_hierarchy (FILE *fp,
+ GType type,
+ guint level);
+
+static void output_object_interfaces (void);
+static void output_interfaces (FILE *fp,
+ GType type);
+
+static void output_interface_prerequisites (void);
+static void output_prerequisites (FILE *fp,
+ GType type);
+
+static void output_args (void);
+static void output_object_args (FILE *fp, GType object_type);
+
+int
+main (int argc, char *argv[])
+{
+ /* Silence the compiler: */
+ if (argv != argv) argc = argc;
+
+ $TYPE_INIT_FUNC;
+
+ get_object_types ();
+
+ output_signals ();
+ output_object_hierarchy ();
+ output_object_interfaces ();
+ output_interface_prerequisites ();
+ output_args ();
+
+ return 0;
+}
+
+
+static void
+output_signals (void)
+{
+ FILE *fp;
+ gint i;
+
+ fp = fopen (signals_filename, "w");
+ if (fp == NULL)
+ {
+ g_warning ("Couldn't open output file: %s : %s", signals_filename, g_strerror(errno));
+ return;
+ }
+
+ for (i = 0; object_types[i]; i++)
+ output_object_signals (fp, object_types[i]);
+
+ fclose (fp);
+}
+
+static gint
+compare_signals (const void *a, const void *b)
+{
+ const guint *signal_a = a;
+ const guint *signal_b = b;
+
+ return strcmp (g_signal_name (*signal_a), g_signal_name (*signal_b));
+}
+
+/* This outputs all the signals of one object. */
+static void
+output_object_signals (FILE *fp, GType object_type)
+{
+ const gchar *object_class_name;
+ guint *signals, n_signals;
+ guint sig;
+
+ if (G_TYPE_IS_INSTANTIATABLE (object_type) ||
+ G_TYPE_IS_INTERFACE (object_type))
+ {
+
+ object_class_name = g_type_name (object_type);
+
+ signals = g_signal_list_ids (object_type, &n_signals);
+ qsort (signals, n_signals, sizeof (guint), compare_signals);
+
+ for (sig = 0; sig < n_signals; sig++)
+ {
+ output_object_signal (fp, object_class_name, signals[sig]);
+ }
+ g_free (signals);
+ }
+}
+
+
+/* This outputs one signal. */
+static void
+output_object_signal (FILE *fp,
+ const gchar *object_name,
+ guint signal_id)
+{
+ GSignalQuery query_info;
+ const gchar *type_name, *ret_type, *object_arg, *arg_name;
+ gchar *pos, *object_arg_lower;
+ gboolean is_pointer;
+ gchar buffer[1024];
+ guint i, param;
+ gint param_num, widget_num, event_num, callback_num;
+ gint *arg_num;
+ gchar signal_name[128];
+ gchar flags[16];
+
+ $debug_log ("Object: %s Signal: %u", object_name, signal_id);
+
+ param_num = 1;
+ widget_num = event_num = callback_num = 0;
+
+ g_signal_query (signal_id, &query_info);
+
+ /* Output the signal object type and the argument name. We assume the
+ type is a pointer - I think that is OK. We remove "Gtk" or "Gnome" and
+ convert to lower case for the argument name. */
+ pos = buffer;
+ sprintf (pos, "%s ", object_name);
+ pos += strlen (pos);
+
+ /* Try to come up with a sensible variable name for the first arg
+ * It chops off 2 know prefixes :/ and makes the name lowercase
+ * It should replace lowercase -> 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 = &param_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,
+ "<SIGNAL>\\n<NAME>%s::%s</NAME>\\n<RETURNS>%s%s</RETURNS>\\n<FLAGS>%s</FLAGS>\\n%s</SIGNAL>\\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, "<ARG>\\n<NAME>%s::%s</NAME>\\n<TYPE>%s%s</TYPE>\\n<RANGE>%s</RANGE>\\n<FLAGS>%s</FLAGS>\\n<NICK>%s</NICK>\\n<BLURB>%s%s</BLURB>\\n<DEFAULT>%s</DEFAULT>\\n</ARG>\\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 '<version>' $$each | grep -v '<version>$(VERSION)'); then \
+ echo $$each should be fixed to say version $(VERSION) or be removed ; \
+ echo "sed -i -e 's/<version.*version>/<version>$(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 '<version>$(PACKAGE_VERSION)</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..3425366
--- /dev/null
+++ b/common/m4/Makefile.in
@@ -0,0 +1,599 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 <ds@schleef.org>
+dnl Tim-Philipp Müller <tim centricular net>
+
+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 <thomas at apestaart dot org>
+
+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='<!--'
+ CAT_ENTRY_END='-->'
+ 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
+<?xml version="1.0" encoding='ISO-8859-1'?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook $TYPE_UC V$DOCBOOK_VERSION//EN" "http://www.oasis-open.org/docbook/$TYPE_LC/$DOCBOOK_VERSION/docbookx.dtd">
+<book id="test">
+</book>
+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 <ds@schleef.org>
+
+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 <thomas at apestaart dot org>
+
+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 <<EOF
+#include <objc/Object.h>
+@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
+# <wingo@pobox.com>
+# 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 <thomas at apestaart dot org>
+
+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 <thomas at apestaart dot org>
+
+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 <stdint.h>" section requires the
+# existence of an include file <stdint.h> 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 <inttypes.h>. In other enviroments we can
+# use the inet-types in <sys/types.h> 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
+# <stdint.h>" or "#include <inttypes.h>", 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 <mylib-int.h>" to
+# obtain the stdint-types.
+#
+# Remember, if the system already had a valid <stdint.h>, 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 <guidod@gmx.de>
+#
+# 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 <stdint.h>],[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 <stdint.h>],[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 <stdint.h>" >>$ac_stdint
+echo "#endif" >>$ac_stdint
+echo "#endif" >>$ac_stdint
+else
+
+cat >>$ac_stdint <<STDINT_EOF
+
+/* ................... shortcircuit part ........................... */
+
+#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
+#include <stdint.h>
+#else
+#include <stddef.h>
+
+/* .................... 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 <<STDINT_EOF
+/* .................... detections part ............................ */
+
+/* whether we need to define bitspecific types from compiler base types */
+#ifndef _STDINT_HEADER_INTPTR
+#ifndef _STDINT_HEADER_UINT32
+#ifndef _STDINT_HEADER_U_INT32
+#define _STDINT_NEED_INT_MODEL_T
+#else
+#define _STDINT_HAVE_U_INT_TYPES
+#endif
+#endif
+#endif
+
+#ifdef _STDINT_HAVE_U_INT_TYPES
+#undef _STDINT_NEED_INT_MODEL_T
+#endif
+
+#ifdef _STDINT_CHAR_MODEL
+#if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
+#ifndef _STDINT_BYTE_MODEL
+#define _STDINT_BYTE_MODEL 12
+#endif
+#endif
+#endif
+
+#ifndef _STDINT_HAVE_INT_LEAST32_T
+#define _STDINT_NEED_INT_LEAST_T
+#endif
+
+#ifndef _STDINT_HAVE_INT_FAST32_T
+#define _STDINT_NEED_INT_FAST_T
+#endif
+
+#ifndef _STDINT_HEADER_INTPTR
+#define _STDINT_NEED_INTPTR_T
+#ifndef _STDINT_HAVE_INTMAX_T
+#define _STDINT_NEED_INTMAX_T
+#endif
+#endif
+
+
+/* .................... definition part ............................ */
+
+/* some system headers have good uint64_t */
+#ifndef _HAVE_UINT64_T
+#if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T
+#define _HAVE_UINT64_T
+#elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
+#define _HAVE_UINT64_T
+typedef u_int64_t uint64_t;
+#endif
+#endif
+
+#ifndef _HAVE_UINT64_T
+/* .. here are some common heuristics using compiler runtime specifics */
+#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 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 <stdio.h>
+#include <stdlib.h>
+
+#include <check.h>
+
+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, &micro) != 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 <stdio.h>
+#include <stdlib.h>
+
+#include <check.h>
+], , [ 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 <drepper@cygnus.com>, 1995, 1996
+#
+# Modified to never use included libintl.
+# Owen Taylor <otaylor@redhat.com>, 12/15/1998
+#
+# Major rework to remove unused code
+# Owen Taylor <otaylor@redhat.com>, 12/11/2002
+#
+# Added better handling of ALL_LINGUAS from GNU gettext version
+# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
+#
+# Modified to require ngettext
+# Matthias Clasen <mclasen@redhat.com> 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 <locale.h>], [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 <locale.h> 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 <libintl.h>
+],
+ [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 <libintl.h>
+],
+ [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 <foo@bar.xx>\n"
+"Language-Team: C <LL@li.org>\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..d16fa79
--- /dev/null
+++ b/common/m4/gst-args.m4
@@ -0,0 +1,335 @@
+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=""
+ GST_PLUGINS_NONPORTED=""
+
+ AC_SUBST(GST_PLUGINS_ALL)
+ AC_SUBST(GST_PLUGINS_SELECTED)
+ AC_SUBST(GST_PLUGINS_NONPORTED)
+])
+
+dnl AG_GST_CHECK_PLUGIN(PLUGIN-NAME)
+dnl
+dnl This macro adds the plug-in <PLUGIN-NAME> 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_<PLUGIN-NAME>, ...) 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])
+
+ dnl First check inclusion
+ if [[ -z "$WITH_PLUGINS" ]] || echo " [$WITH_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED [$1]"
+ fi
+ dnl Then check exclusion
+ if echo " [$WITHOUT_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'`
+ fi
+ dnl Finally check if the plugin is ported or not
+ if echo " [$GST_PLUGINS_NONPORTED] " | 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 <PLUGIN-NAME> 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 <<EOF
+ (\$min_version_major, \$min_version_minor, \$min_version_micro ) = "$docbook2html_min_version" =~ /(\d+)\.(\d+)\.(\d+)/;
+ (\$docbook2html_version_major, \$docbook2html_version_minor, \$docbook2html_version_micro ) = "$docbook2html_version" =~ /(\d+)\.(\d+)\.(\d+)/;
+ exit (((\$docbook2html_version_major > \$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 </dev/null 2>&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 </dev/null 2>&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 </dev/null 2>&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 <thomas@apestaart.org>
+dnl Tim-Philipp Müller <tim centricular net>
+
+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..7f684b0
--- /dev/null
+++ b/common/m4/gst-feature.m4
@@ -0,0 +1,266 @@
+dnl Perform a check for a feature for GStreamer
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Thomas Vander Stichele <thomas@apestaart.org> 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_<FEATURE-NAME> to "yes" or "no" depending
+dnl on whether the feature is available.
+dnl
+dnl The macro will set USE_<FEATURE-NAME> to "yes" or "no" depending on
+dnl whether the feature is to be used.
+dnl Thomas changed this, so that when USE_<FEATURE-NAME> was already set
+dnl to no, then it stays that way.
+dnl
+dnl The macro will call AM_CONDITIONAL(USE_<FEATURE-NAME>, ...) 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_<FEATURE-NAME> 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 *** Check if it is ported or not
+if echo " [$GST_PLUGINS_NONPORTED] " | tr , ' ' | grep -i " [$1] " > /dev/null; then
+ USE_[$1]="no"
+ AC_MSG_WARN(*** $3 not ported)
+fi
+
+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 <richard-alsa@tartarus.org>
+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 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"
+
+printf "configure: *** Plug-ins that have NOT been ported:\n"
+( for i in $GST_PLUGINS_NONPORTED; do
+ printf '\t'$i'\n'
+ 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 <stdio.h>],
+ [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 <stdio.h>],
+ [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 <stdio.h>],
+ [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..bafba41
--- /dev/null
+++ b/common/m4/gst-glib2.m4
@@ -0,0 +1,73 @@
+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)
+])
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 <libxml/tree.h>
+#include <stdio.h>
+],[
+/* 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 <<EOF
+ (\$min_version_major, \$min_version_minor, \$min_version_micro ) = "$flex_min_version" =~ /(\d+)\.(\d+)\.(\d+)/;
+ (\$flex_version_major, \$flex_version_minor, \$flex_version_micro ) = "$flex_version" =~ /(\d+)\.(\d+)\.(\d+)/;
+ exit (((\$flex_version_major > \$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 <scott@netsplit.com>.
+#
+# 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 <http://pkg-config.freedesktop.org/>.])],
+ [$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("<!-- ##### SECTION (\S+) ##### -->\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("<!-- ##### SECTION %s ##### -->\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 = '<include xmlns="http://www.w3.org/2003/XInclude" href="' + \
+ 'element-' + element + '-details.xml">' + \
+ '<fallback xmlns="http://www.w3.org/2003/XInclude" />' + \
+ '</include>\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 @@
+<?xml version='1.0'?> <!--*- mode: xml -*-->
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:str="http://exslt.org/strings"
+ extension-element-prefixes="exsl str"
+ version="1.0">
+<xsl:output method="xml" indent="yes"
+ doctype-public ="-//OASIS//DTD DocBook XML V4.1.2//EN"
+ doctype-system = "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
+
+<xsl:param name="module" />
+
+ <xsl:template match="element">
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">
+ <xsl:element name="link">
+ <xsl:attribute name="linkend"><xsl:value-of select="$module" />-plugins-<xsl:value-of select="name"/></xsl:attribute>
+ <xsl:value-of select="name" />
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="description" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+ <xsl:variable name="name"><xsl:copy-of select="name"/></xsl:variable>
+ <!-- here we write an element-(name)-details.xml file for the element -->
+ <exsl:document href="{concat ('xml/element-', $name, '-details.xml')}" method="xml" indent="yes">
+
+ <xsl:element name="refsynopsisdiv">
+ <xsl:element name="refsect2">
+ <xsl:element name="title">Element Information</xsl:element>
+ <xsl:element name="variablelist">
+
+ <!-- plugin name and link -->
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">plugin</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara">
+ <xsl:element name="link">
+ <xsl:attribute name="linkend">plugin-<xsl:value-of select="../../name"/></xsl:attribute>
+ <xsl:value-of select="../../name" />
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">author</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="author" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">class</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="class" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element> <!-- variablelist -->
+ </xsl:element> <!-- refsect2 -->
+
+ <xsl:element name="refsect2">
+ <xsl:element name="title">Element Pads</xsl:element>
+ <!-- process all caps -->
+ <xsl:for-each select="pads/caps">
+ <xsl:element name="variablelist">
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">name</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="name" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">direction</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="direction" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">presence</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="presence" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:for-each select='str:tokenize(details, ";")'>
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">
+ <xsl:if test="position()=1">details</xsl:if>
+ </xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select='.'/></xsl:element>
+ </xsl:element>
+ </xsl:element>
+ </xsl:for-each>
+
+ </xsl:element> <!-- variablelist -->
+
+ <!--xsl:element name="programlisting"><xsl:value-of select="details" /></xsl:element-->
+
+ </xsl:for-each>
+ </xsl:element> <!-- refsect2 -->
+ </xsl:element> <!-- refsynopsisdiv -->
+
+ </exsl:document>
+ </xsl:template>
+
+ <xsl:template match="plugin">
+ <xsl:element name="refentry">
+ <xsl:attribute name="id"><xsl:value-of select="$module" />-plugins-plugin-<xsl:value-of select="name"/></xsl:attribute>
+
+ <xsl:element name="refmeta">
+ <xsl:element name="refentrytitle">
+ <xsl:value-of select="name"/>
+ </xsl:element>
+ <xsl:element name="manvolnum">3</xsl:element>
+ <xsl:element name="refmiscinfo">FIXME Library</xsl:element>
+ </xsl:element> <!-- refmeta -->
+
+ <xsl:element name="refnamediv">
+ <xsl:element name="refname">
+ <xsl:value-of select="name"/>
+ </xsl:element>
+
+ <xsl:element name="refpurpose">
+ <xsl:element name="anchor">
+ <xsl:attribute name="id">plugin-<xsl:value-of select="name"/></xsl:attribute>
+ </xsl:element>
+ <xsl:value-of select="description"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="refsect1">
+ <xsl:element name="title">Plugin Information</xsl:element>
+ <xsl:element name="variablelist">
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">filename</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="basename" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">version</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="version" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">run-time license</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="license" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">package</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara"><xsl:value-of select="package" /></xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="varlistentry">
+ <xsl:element name="term">origin</xsl:element>
+ <xsl:element name="listitem">
+ <xsl:element name="simpara">
+ <!-- only show origin as link if it starts with http -->
+ <xsl:choose>
+ <xsl:when test="substring(@href, 1, 4) = 'http'">
+ <xsl:element name="ulink">
+ <xsl:attribute name="url"><xsl:value-of select="origin" /></xsl:attribute>
+ <xsl:value-of select="origin" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="origin" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="refsect1">
+ <xsl:element name="title">Elements</xsl:element>
+ <!-- process all elements -->
+ <xsl:element name="variablelist">
+ <xsl:apply-templates select="elements"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ </xsl:template>
+
+ <!-- ignore -->
+ <xsl:template match="gst-plugin-paths" />
+
+</xsl:stylesheet>
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 "<Object %s>" % 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
+ '<SIGNAL>\n(.*?)</SIGNAL>\n'
+ )
+ nmatcher = re.compile(
+ '<NAME>'
+ '(?P<object>\S*)' # store object
+ '::'
+ '(?P<signal>\S*)' # store signal
+ '</NAME>'
+ )
+ rmatcher = re.compile(
+ '(?s)' # make . match \n
+ '<RETURNS>(?P<returns>\S*)</RETURNS>\n' # store returns
+ '(?P<args>.*)' # 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 = """<SIGNAL>
+<NAME>%(object)s::%(name)s</NAME>
+<RETURNS>%(returns)s</RETURNS>
+%(args)s</SIGNAL>
+"""
+ 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
+ '<ARG>\n(.*?)</ARG>\n'
+ )
+ nmatcher = re.compile(
+ '<NAME>'
+ '(?P<object>\S*)' # store object
+ '::'
+ '(?P<arg>\S*)' # store arg
+ '</NAME>'
+ )
+ rmatcher = re.compile(
+ '(?s)' # make . match \n
+ '<TYPE>(?P<type>\S*)</TYPE>\n' # store type
+ '<RANGE>(?P<range>.*?)</RANGE>\n' # store range
+ '<FLAGS>(?P<flags>\S*)</FLAGS>\n' # store flags
+ '<NICK>(?P<nick>.*?)</NICK>\n' # store nick
+ '<BLURB>(?P<blurb>.*?)</BLURB>\n' # store blurb
+ '<DEFAULT>(?P<default>.*?)</DEFAULT>\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 = """<ARG>
+<NAME>%(object)s::%(name)s</NAME>
+<TYPE>%(type)s</TYPE>
+<RANGE>%(range)s</RANGE>
+<FLAGS>%(flags)s</FLAGS>
+<NICK>%(nick)s</NICK>
+<BLURB>%(blurb)s</BLURB>
+<DEFAULT>%(default)s</DEFAULT>
+</ARG>
+"""
+ 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..c0096a7
--- /dev/null
+++ b/compile
@@ -0,0 +1,143 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2009-10-06.20; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
+# Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+# 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 <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+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 <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+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..c2246a4
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1502 @@
+#! /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
+# Free Software Foundation, Inc.
+
+timestamp='2009-12-30'
+
+# 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 <config-patches@gnu.org> 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 <config-patches@gnu.org>."
+
+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 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'`
+ exit ;;
+ 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 <stdio.h> /* 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 <sys/systemcfg.h>
+
+ 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:*:[456])
+ 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 <stdlib.h>
+ #include <unistd.h>
+
+ 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 <unistd.h>
+ 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
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ 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 ;;
+ 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' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/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 <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # 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 ;;
+ 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 <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#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 <sys/param.h>
+ 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 <sys/param.h>
+# 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 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> 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..6a69ed1
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,385 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* The implementation that should be used for integer audio resampling witll
+ be benchmarked at runtime */
+#undef AUDIORESAMPLE_FORMAT_AUTO
+
+/* The float implementation should be used for integer audio resampling */
+#undef AUDIORESAMPLE_FORMAT_FLOAT
+
+/* The int implementation should be used for integer audio resampling */
+#undef AUDIORESAMPLE_FORMAT_INT
+
+/* defined if cdda headers are in a cdda/ directory */
+#undef CDPARANOIA_HEADERS_IN_DIR
+
+/* 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
+
+/* The GIO library directory. */
+#undef GIO_LIBDIR
+
+/* The GIO modules directory. */
+#undef GIO_MODULE_DIR
+
+/* system wide data directory */
+#undef GST_DATADIR
+
+/* set to disable libxml2-dependent code in subparse */
+#undef GST_DISABLE_XML
+
+/* macro to use to show function name */
+#undef GST_FUNCTION
+
+/* Defined if gcov is enabled to force a rebuild due to config.h changing */
+#undef GST_GCOV_ENABLED
+
+/* plugin install helper script */
+#undef GST_INSTALL_PLUGINS_HELPER
+
+/* Default errorlevel to use */
+#undef GST_LEVEL_DEFAULT
+
+/* GStreamer license */
+#undef GST_LICENSE
+
+/* major/minor version */
+#undef GST_MAJORMINOR
+
+/* 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
+
+/* Define to enable ALSA (used by alsa). */
+#undef HAVE_ALSA
+
+/* Define to enable CDParanoia (used by cdparanoia). */
+#undef HAVE_CDPARANOIA
+
+/* 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 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 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to enable building of experimental plug-ins. */
+#undef HAVE_EXPERIMENTAL
+
+/* Define to enable building of plug-ins with external deps. */
+#undef HAVE_EXTERNAL
+
+/* 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 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* defined if the compiler implements __func__ */
+#undef HAVE_FUNC
+
+/* defined if the compiler implements __FUNCTION__ */
+#undef HAVE_FUNCTION
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to enable GIO library (used by gio). */
+#undef HAVE_GIO
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* make use of iso-codes for ISO-639 */
+#undef HAVE_ISO_CODES
+
+/* Define to enable integer vorbis plug-in (used by ivorbisdec). */
+#undef HAVE_IVORBIS
+
+/* Define to 1 if you have the `asound' library (-lasound). */
+#undef HAVE_LIBASOUND
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+#undef HAVE_LIBRESOLV
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Define to enable libvisual visualization library (used by libvisual). */
+#undef HAVE_LIBVISUAL
+
+/* Define to 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the `log2' function. */
+#undef HAVE_LOG2
+
+/* Define if you have C99's lrint function. */
+#undef HAVE_LRINT
+
+/* Define if you have C99's lrintf function. */
+#undef HAVE_LRINTF
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to enable Xiph Ogg library (used by ogg). */
+#undef HAVE_OGG
+
+/* Use Orc */
+#undef HAVE_ORC
+
+/* Define to enable Pango font rendering (used by pango). */
+#undef HAVE_PANGO
+
+/* defined if the compiler implements __PRETTY_FUNCTION__ */
+#undef HAVE_PRETTY_FUNCTION
+
+/* Define to 1 if you have the <process.h> header file. */
+#undef HAVE_PROCESS_H
+
+/* Define if RDTSC is available */
+#undef HAVE_RDTSC
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to enable Xiph Theora video codec (used by theora). */
+#undef HAVE_THEORA
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if valgrind should be used */
+#undef HAVE_VALGRIND
+
+/* Define to enable Xiph Vorbis audio codec (used by vorbis). */
+#undef HAVE_VORBIS
+
+/* defined if vorbis_synthesis_restart is present */
+#undef HAVE_VORBIS_SYNTHESIS_RESTART
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define to enable X libraries and plugins (used by ximagesink). */
+#undef HAVE_X
+
+/* Define to enable X Shared Memory extension. */
+#undef HAVE_XSHM
+
+/* Define to enable X11 XVideo extensions (used by xvimagesink). */
+#undef HAVE_XVIDEO
+
+/* Define to enable zlib support for ID3 parsing in libgsttag. */
+#undef HAVE_ZLIB
+
+/* the host CPU */
+#undef HOST_CPU
+
+/* prefix */
+#undef ISO_CODES_PREFIX
+
+/* */
+#undef ISO_CODES_VERSION
+
+/* directory in which the detected libvisual's plugins are located */
+#undef LIBVISUAL_PLUGINSBASEDIR
+
+/* gettext locale dir */
+#undef LOCALEDIR
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Define if you have no native hstrerror() function. */
+#undef NO_HSTRERROR
+
+/* 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
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* "Define if building for android" */
+#undef USE_TREMOLO
+
+/* Version number of package */
+#undef VERSION
+
+/* 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
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
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 <gord@gnu.ai.mit.edu>, 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 <kc5tja@dolphin.openprojects.net> 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=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..c2d1257
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1714 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Free Software Foundation, Inc.
+
+timestamp='2010-01-22'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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.
+
+
+# Please send patches to <config-patches@gnu.org>. 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 <config-patches@gnu.org>."
+
+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 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-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 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | 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 | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-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
+ ;;
+
+ # 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-* | c54x-* | c55x-* | c6x-* \
+ | 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-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | 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-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile-* | tilegx-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | 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
+ ;;
+ 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)
+ 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
+ ;;
+ 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) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) 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
+ ;;
+ 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
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ # 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
+ ;;
+ 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-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
+ ;;
+ # 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..da61958
--- /dev/null
+++ b/configure
@@ -0,0 +1,34264 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.67 for GStreamer Base Plug-ins 0.11.1.
+#
+# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
+#
+#
+# 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.
+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 \$(( 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.
+ BASH_ENV=/dev/null
+ ENV=/dev/null
+ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$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'"
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $ECHO works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<_LT_EOF
+$*
+_LT_EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$lt_ECHO"; then
+ if test "X${echo_test_string+set}" != Xset; then
+ # find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+ { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+ then
+ break
+ fi
+ done
+ fi
+
+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+ else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ ECHO="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$ECHO" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ ECHO='print -r'
+ elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ ECHO='printf %s\n'
+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ ECHO="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ ECHO="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ ECHO=echo
+ fi
+ fi
+ fi
+ fi
+ fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&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 Base Plug-ins'
+PACKAGE_TARNAME='gst-plugins-base'
+PACKAGE_VERSION='0.11.1'
+PACKAGE_STRING='GStreamer Base Plug-ins 0.11.1'
+PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
+PACKAGE_URL=''
+
+ac_unique_file="gst/audiotestsrc/gstaudiotestsrc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+gt_needs=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GST_PLUGIN_LDFLAGS
+GST_LIB_LDFLAGS
+GST_ALL_LDFLAGS
+GST_CXXFLAGS
+GST_PLUGINS_BASE_CFLAGS
+GST_OPTION_CXXFLAGS
+GST_OPTION_CFLAGS
+DEPRECATED_CFLAGS
+PROFILE_CFLAGS
+HAVE_FT2_FALSE
+HAVE_FT2_TRUE
+FT2_CONFIG
+FT2_LIBS
+FT2_CFLAGS
+USE_VORBIS_FALSE
+USE_VORBIS_TRUE
+VORBISENC_LIBS
+VORBISFILE_LIBS
+VORBIS_LIBS
+VORBIS_CFLAGS
+USE_THEORA_FALSE
+USE_THEORA_TRUE
+THEORA_LIBS
+THEORA_CFLAGS
+USE_PANGO_FALSE
+USE_PANGO_TRUE
+PANGO_LIBS
+PANGO_CFLAGS
+USE_OGG_FALSE
+USE_OGG_TRUE
+OGG_LIBS
+OGG_CFLAGS
+USE_LIBVISUAL_FALSE
+USE_LIBVISUAL_TRUE
+LIBVISUAL_LIBS
+LIBVISUAL_CFLAGS
+USE_GIO_FALSE
+USE_GIO_TRUE
+GIO_LDFLAGS
+GIO_LIBS
+GIO_CFLAGS
+USE_IVORBIS_FALSE
+USE_IVORBIS_TRUE
+IVORBIS_LIBS
+IVORBIS_CFLAGS
+USE_CDPARANOIA_FALSE
+USE_CDPARANOIA_TRUE
+HAVE_CDPARANOIA
+CDPARANOIA_LIBS
+CDPARANOIA_CFLAGS
+USE_ALSA_FALSE
+USE_ALSA_TRUE
+ALSA_LIBS
+ALSA_CFLAGS
+USE_XSHM_FALSE
+USE_XSHM_TRUE
+XSHM_LIBS
+HAVE_XSHM
+USE_XVIDEO_FALSE
+USE_XVIDEO_TRUE
+XVIDEO_LIBS
+USE_X_FALSE
+USE_X_TRUE
+HAVE_X
+X_EXTRA_LIBS
+X_LIBS
+X_PRE_LIBS
+X_CFLAGS
+XMKMF
+USE_ZLIB_FALSE
+USE_ZLIB_TRUE
+HAVE_ZLIB
+ZLIB_LIBS
+ZLIB_CFLAGS
+USE_ISO_CODES_FALSE
+USE_ISO_CODES_TRUE
+USE_XML_FALSE
+USE_XML_TRUE
+USE_PLUGIN_VOLUME_FALSE
+USE_PLUGIN_VOLUME_TRUE
+USE_PLUGIN_VIDEOSCALE_FALSE
+USE_PLUGIN_VIDEOSCALE_TRUE
+USE_PLUGIN_VIDEORATE_FALSE
+USE_PLUGIN_VIDEORATE_TRUE
+USE_PLUGIN_VIDEOTESTSRC_FALSE
+USE_PLUGIN_VIDEOTESTSRC_TRUE
+USE_PLUGIN_TYPEFIND_FALSE
+USE_PLUGIN_TYPEFIND_TRUE
+USE_PLUGIN_TCP_FALSE
+USE_PLUGIN_TCP_TRUE
+USE_PLUGIN_SUBPARSE_FALSE
+USE_PLUGIN_SUBPARSE_TRUE
+USE_PLUGIN_AUDIORESAMPLE_FALSE
+USE_PLUGIN_AUDIORESAMPLE_TRUE
+USE_PLUGIN_PLAYBACK_FALSE
+USE_PLUGIN_PLAYBACK_TRUE
+USE_PLUGIN_GDP_FALSE
+USE_PLUGIN_GDP_TRUE
+USE_PLUGIN_VIDEOCONVERT_FALSE
+USE_PLUGIN_VIDEOCONVERT_TRUE
+USE_PLUGIN_ENCODING_FALSE
+USE_PLUGIN_ENCODING_TRUE
+USE_PLUGIN_AUDIOTESTSRC_FALSE
+USE_PLUGIN_AUDIOTESTSRC_TRUE
+USE_PLUGIN_AUDIORATE_FALSE
+USE_PLUGIN_AUDIORATE_TRUE
+USE_PLUGIN_AUDIOCONVERT_FALSE
+USE_PLUGIN_AUDIOCONVERT_TRUE
+USE_PLUGIN_APP_FALSE
+USE_PLUGIN_APP_TRUE
+USE_PLUGIN_ADDER_FALSE
+USE_PLUGIN_ADDER_TRUE
+AUDIORESAMPLE_FORMAT_AUTO
+AUDIORESAMPLE_FORMAT_FLOAT
+AUDIORESAMPLE_FORMAT_INT
+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
+HAVE_LINUX_JOYSTICK_HEADERS_FALSE
+HAVE_LINUX_JOYSTICK_HEADERS_TRUE
+HAVE_QT_GV_FALSE
+HAVE_QT_GV_TRUE
+HAVE_QT_FALSE
+HAVE_QT_TRUE
+QT4_MOC
+QT_LIBS
+QT_CFLAGS
+HAVE_GTK_X11_FALSE
+HAVE_GTK_X11_TRUE
+HAVE_GTK_FALSE
+HAVE_GTK_TRUE
+GTK_X11_LIBS
+GTK_X11_CFLAGS
+GTK_LIBS
+GTK_CFLAGS
+GST_PREFIX
+GLIB_PREFIX
+HAVE_GST_CHECK_FALSE
+HAVE_GST_CHECK_TRUE
+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
+GLIB_LIBS
+GLIB_CFLAGS
+GLIB_REQ
+HSTRERROR_LIBS
+WIN32_LIBS
+HAVE_SYS_SOCKET_H_FALSE
+HAVE_SYS_SOCKET_H_TRUE
+HAVE_LIBXML_HTML_FALSE
+HAVE_LIBXML_HTML_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
+HAVE_INTROSPECTION_FALSE
+HAVE_INTROSPECTION_TRUE
+INTROSPECTION_MAKEFILE
+INTROSPECTION_LIBS
+INTROSPECTION_CFLAGS
+INTROSPECTION_TYPELIBDIR
+INTROSPECTION_GIRDIR
+INTROSPECTION_GENERATE
+INTROSPECTION_COMPILER
+INTROSPECTION_SCANNER
+HAVE_VALGRIND_FALSE
+HAVE_VALGRIND_TRUE
+VALGRIND_PATH
+HAVE_CXX_FALSE
+HAVE_CXX_TRUE
+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_NONPORTED
+GST_PLUGINS_SELECTED
+GST_PLUGINS_ALL
+GST_INSTALL_PLUGINS_HELPER
+GST_PKG_CONFIG_PATH
+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
+lt_ECHO
+RANLIB
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+GST_LT_LDFLAGS
+GST_LIBVERSION
+GST_AGE
+GST_REVISION
+GST_CURRENT
+GST_MAJORMINOR
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+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
+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_install_plugins_helper
+with_plugins
+enable_external
+enable_experimental
+enable_largefile
+enable_introspection
+with_html_dir
+enable_gtk_doc
+enable_gobject_cast_checks
+enable_glib_asserts
+enable_orc
+with_gtk
+enable_Bsymbolic
+with_default_audiosink
+with_default_audiosrc
+with_default_videosink
+with_default_videosrc
+with_default_visualizer
+with_audioresample_format
+enable_adder
+enable_app
+enable_audioconvert
+enable_audiorate
+enable_audiotestsrc
+enable_encoding
+enable_videoconvert
+enable_gdp
+enable_playback
+enable_audioresample
+enable_subparse
+enable_tcp
+enable_typefind
+enable_videotestsrc
+enable_videorate
+enable_videoscale
+enable_volume
+enable_iso_codes
+enable_zlib
+enable_x
+with_x
+enable_xvideo
+enable_xshm
+enable_alsa
+with_alsa_prefix
+with_alsa_inc_prefix
+enable_cdparanoia
+enable_ivorbis
+enable_gio
+enable_libvisual
+enable_ogg
+with_ogg
+with_ogg_libraries
+with_ogg_includes
+enable_oggtest
+enable_pango
+enable_theora
+enable_vorbis
+with_vorbis
+with_vorbis_libraries
+with_vorbis_includes
+enable_vorbistest
+with_ft_prefix
+with_ft_exec_prefix
+enable_freetypetest
+'
+ 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
+GLIB_CFLAGS
+GLIB_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
+GTK_CFLAGS
+GTK_LIBS
+GTK_X11_CFLAGS
+GTK_X11_LIBS
+QT_CFLAGS
+QT_LIBS
+ZLIB_CFLAGS
+ZLIB_LIBS
+XMKMF
+ALSA_CFLAGS
+ALSA_LIBS
+CDPARANOIA_CFLAGS
+CDPARANOIA_LIBS
+IVORBIS_CFLAGS
+IVORBIS_LIBS
+GIO_CFLAGS
+GIO_LIBS
+LIBVISUAL_CFLAGS
+LIBVISUAL_LIBS
+OGG_CFLAGS
+OGG_LIBS
+PANGO_CFLAGS
+PANGO_LIBS
+THEORA_CFLAGS
+THEORA_LIBS
+VORBIS_CFLAGS
+VORBIS_LIBS
+FT2_CFLAGS
+FT2_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 Base Plug-ins 0.11.1 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-base]
+ --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 Base Plug-ins 0.11.1:";;
+ 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-largefile omit support for large files
+ --enable-introspection=[no/auto/yes]
+ Enable introspection for this build
+ --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-Bsymbolic avoid linking with -Bsymbolic
+ --disable-adder disable dependency-less adder plugin
+ --disable-app disable dependency-less app plugin
+ --disable-audioconvert disable dependency-less audioconvert plugin
+ --disable-audiorate disable dependency-less audiorate plugin
+ --disable-audiotestsrc disable dependency-less audiotestsrc plugin
+ --disable-encoding disable dependency-less encoding plugin
+ --disable-videoconvert disable dependency-less videoconvert plugin
+ --disable-gdp disable dependency-less gdp plugin
+ --disable-playback disable dependency-less playback plugin
+ --disable-audioresample disable dependency-less audioresample plugin
+ --disable-subparse disable dependency-less subparse plugin
+ --disable-tcp disable dependency-less tcp plugin
+ --disable-typefind disable dependency-less typefind plugin
+ --disable-videotestsrc disable dependency-less videotestsrc plugin
+ --disable-videorate disable dependency-less videorate plugin
+ --disable-videoscale disable dependency-less videoscale plugin
+ --disable-volume disable dependency-less volume plugin
+ --enable-iso-codes use iso-codes if installed
+ --disable-zlib disable zlib support for ID3 parsing in libgsttag
+ --disable-x disable X libraries and plugins: ximagesink
+ --disable-xvideo disable X11 XVideo extensions: xvimagesink
+ --disable-xshm disable X Shared Memory extension
+ --disable-alsa disable ALSA: alsa
+ --disable-cdparanoia disable CDParanoia: cdparanoia
+ --disable-ivorbis disable integer vorbis plug-in: ivorbisdec
+ --disable-gio disable GIO library: gio
+ --disable-libvisual disable libvisual visualization library: libvisual
+ --disable-ogg disable Xiph Ogg library: ogg
+ --disable-oggtest Do not try to compile and run a test Ogg program
+ --disable-pango disable Pango font rendering: pango
+ --disable-theora disable Xiph Theora video codec: theora
+ --disable-vorbis disable Xiph Vorbis audio codec: vorbis
+ --disable-vorbistest Do not try to compile and run a test Vorbis program
+ --disable-freetypetest Do not try to compile and run
+ a test FreeType program
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --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-install-plugins-helper
+ specify path of helper script to call to install
+ plugins
+ --with-plugins comma-separated list of dependencyless plug-ins to
+ compile
+ --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-audioresample-format
+ Which implementation should be used for integer
+ audio resampling, int/float/auto, (default is auto)
+ --with-x use the X Window System
+ --with-alsa-prefix=PFX prefix where Alsa library is installed(optional)
+ --with-alsa-inc-prefix=PFX
+ prefix where include libraries are (optional)
+ --with-ogg=PFX Prefix where libogg is installed (optional)
+ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)
+ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)
+ --with-vorbis=PFX Prefix where libvorbis is installed (optional)
+ --with-vorbis-libraries=DIR Directory where libvorbis library is installed (optional)
+ --with-vorbis-includes=DIR Directory where libvorbis header files are installed (optional)
+ --with-ft-prefix=PREFIX
+ Prefix where FreeType is installed (optional)
+ --with-ft-exec-prefix=PREFIX
+ Exec prefix where FreeType is installed (optional)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ 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
+ GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
+ GLIB_LIBS linker flags for GLIB, 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
+ 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
+ QT_CFLAGS C compiler flags for QT, overriding pkg-config
+ QT_LIBS linker flags for QT, overriding pkg-config
+ ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
+ ZLIB_LIBS linker flags for ZLIB, overriding pkg-config
+ XMKMF Path to xmkmf, Makefile generator for X Window System
+ ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config
+ ALSA_LIBS linker flags for ALSA, overriding pkg-config
+ CDPARANOIA_CFLAGS
+ C compiler flags for CDPARANOIA, overriding pkg-config
+ CDPARANOIA_LIBS
+ linker flags for CDPARANOIA, overriding pkg-config
+ IVORBIS_CFLAGS
+ C compiler flags for IVORBIS, overriding pkg-config
+ IVORBIS_LIBS
+ linker flags for IVORBIS, overriding pkg-config
+ GIO_CFLAGS C compiler flags for GIO, overriding pkg-config
+ GIO_LIBS linker flags for GIO, overriding pkg-config
+ LIBVISUAL_CFLAGS
+ C compiler flags for LIBVISUAL, overriding pkg-config
+ LIBVISUAL_LIBS
+ linker flags for LIBVISUAL, overriding pkg-config
+ OGG_CFLAGS C compiler flags for OGG, overriding pkg-config
+ OGG_LIBS linker flags for OGG, overriding pkg-config
+ PANGO_CFLAGS
+ C compiler flags for PANGO, overriding pkg-config
+ PANGO_LIBS linker flags for PANGO, overriding pkg-config
+ THEORA_CFLAGS
+ C compiler flags for THEORA, overriding pkg-config
+ THEORA_LIBS linker flags for THEORA, overriding pkg-config
+ VORBIS_CFLAGS
+ C compiler flags for VORBIS, overriding pkg-config
+ VORBIS_LIBS linker flags for VORBIS, overriding pkg-config
+ FT2_CFLAGS C compiler flags for FT2, overriding pkg-config
+ FT2_LIBS linker flags for FT2, 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 <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
+_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 Base Plug-ins configure 0.11.1
+generated by GNU Autoconf 2.67
+
+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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 "test \"\${$3+set}\"" = set; 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 <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#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; test "x$as_lineno_stack" = x && { as_lineno=; 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 "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval "test \"\${$3+set}\"" = set; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval "test \"\${$3+set}\"" = set; 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 "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_mongrel
+
+# 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 "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 <stdio.h>
+#include <stdlib.h>
+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 <conftest.val; ac_retval=0
+else
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+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 Base Plug-ins $as_me 0.11.1, which was
+generated by GNU Autoconf 2.67. 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 "
+# 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 test "${ac_cv_path_install+set}" = set; 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 test "${ac_cv_prog_STRIP+set}" = set; 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 test "${ac_cv_path_mkdir+set}" = set; 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 test "${ac_cv_prog_AWK+set}" = set; 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 "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; 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-base'
+ VERSION='0.11.1'
+
+
+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.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+ PACKAGE_VERSION_MAJOR=$(echo 0.11.1 | cut -d'.' -f1)
+ PACKAGE_VERSION_MINOR=$(echo 0.11.1 | cut -d'.' -f2)
+ PACKAGE_VERSION_MICRO=$(echo 0.11.1 | cut -d'.' -f3)
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
+$as_echo_n "checking nano version... " >&6; }
+
+ NANO=$(echo 0.11.1 | 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 test "${ac_cv_build+set}" = set; 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 test "${ac_cv_host+set}" = set; 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_BACKSLASH='\'
+
+
+GST_MAJORMINOR=$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR
+GST_MAJORMINOR=0.11
+
+
+
+ GST_CURRENT=26
+ GST_REVISION=0
+ GST_AGE=0
+ GST_LIBVERSION=26:0:0
+
+
+
+
+
+ GST_LT_LDFLAGS="$GST_LT_LDFLAGS -version-info $GST_LIBVERSION"
+ if test ! -z ""
+ then
+ GST_LT_LDFLAGS="$GST_LT_LDFLAGS -release "
+ fi
+
+
+ enable_dlopen=yes
+
+
+
+
+
+
+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 test "${ac_cv_prog_AS+set}" = set; 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 test "${ac_cv_prog_ac_ct_AS+set}" = set; 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 test "${ac_cv_prog_DLLTOOL+set}" = set; 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 test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; 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 test "${ac_cv_prog_OBJDUMP+set}" = set; 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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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.2.6b'
+macro_revision='1.3017'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+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='\'
+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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 <stdio.h>
+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 test "${ac_cv_objext+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'.
+ 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
+ ;;
+ 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 test "${ac_cv_path_SED+set}" = set; 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 test "${ac_cv_path_GREP+set}" = set; 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 test "${ac_cv_path_EGREP+set}" = set; 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 test "${ac_cv_path_FGREP+set}" = set; 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 test "${lt_cv_path_LD+set}" = set; 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 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&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 test "${lt_cv_path_NM+set}" = set; 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 "$ac_tool_prefix"; then
+ for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+ 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 test "${ac_cv_prog_DUMPBIN+set}" = set; 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 -symbols" "link -dump -symbols"
+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 test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; 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
+
+
+ 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 test "${lt_cv_nm_interface+set}" = set; 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:5913: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:5916: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:5919: 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 test "${lt_cv_sys_max_cmd_len+set}" = set; 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;
+ ;;
+
+ 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
+ ;;
+
+ 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+ = "XX$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"}, \
+ = c,a/b,, \
+ && 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 for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; 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
+ 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 test "${ac_cv_prog_OBJDUMP+set}" = set; 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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 test "${lt_cv_deplibs_check_method+set}" = set; 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.
+ if ( 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
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ 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
+ ;;
+
+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]) 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 Linux 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_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}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; 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}ar"
+ $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
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; 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="ar"
+ $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
+
+ 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
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+
+
+
+
+
+
+
+
+
+
+
+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 test "${ac_cv_prog_STRIP+set}" = set; 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 test "${ac_cv_prog_RANLIB+set}" = set; 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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; 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};"\
+" /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
+
+ # 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
+#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. */
+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_save_LIBS="$LIBS"
+ lt_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_save_LIBS"
+ CFLAGS="$lt_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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 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 7122 "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 test "${lt_cv_cc_needs_belf+set}" = set; 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
+ ;;
+sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;;
+ *)
+ 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"
+
+
+ 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 test "${ac_cv_prog_DSYMUTIL+set}" = set; 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 test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; 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 test "${ac_cv_prog_NMEDIT+set}" = set; 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 test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; 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 test "${ac_cv_prog_LIPO+set}" = set; 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 test "${ac_cv_prog_ac_ct_LIPO+set}" = set; 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 test "${ac_cv_prog_OTOOL+set}" = set; 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 test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; 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 test "${ac_cv_prog_OTOOL64+set}" = set; 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 test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; 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 test "${lt_cv_apple_cc_single_mod+set}" = set; 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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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 test "${lt_cv_ld_exported_symbols_list+set}" = set; 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; }
+ 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" != ":"; 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 test "${ac_cv_prog_CPP+set}" = set; 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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 test "${ac_cv_header_stdc+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+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 <string.h>
+
+_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 <stdlib.h>
+
+_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 <ctype.h>
+#include <stdlib.h>
+#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" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+# Set options
+
+
+
+
+
+ # 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; pic_mode="$withval"
+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 test "${lt_cv_objdir+set}" = set; 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
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# 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'
+
+# 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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+ { $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 test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; 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:8647: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8651: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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=
+
+{ $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 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'
+ ;;
+
+ 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
+ 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'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # 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*)
+ # IBM XL C 8.0/Fortran 10.1 on PPC
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Sun\ F*)
+ # 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=''
+ ;;
+ 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*)
+ 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}: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+
+
+
+
+
+#
+# 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 test "${lt_cv_prog_compiler_pic_works+set}" = set; 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:8986: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8990: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_static_works+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:9091: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:9095: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:9146: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:9150: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_flag_spec_ld=
+ 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)
+ link_all_deplibs=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+ if test "$with_gnu_ld" = 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.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_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 <jrb3@best.com> 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'
+ 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/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+ 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
+ ;;
+
+ 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=
+ 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ 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; $ECHO \"$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*)
+ # 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=
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $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'
+ 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 $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
+ ;;
+
+ 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 $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
+
+ 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
+ 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")) && (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.
+ 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
+ }
+ }'
+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 "$aix_libpath"; then
+ 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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.
+ 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
+ }
+ }'
+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 "$aix_libpath"; then
+ 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ 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.
+ 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 `$ECHO "X$deplibs" | $Xsed -e '\''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'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ 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=echo
+ 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
+ ;;
+
+ freebsd1*)
+ ld_shlibs=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 -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 -fPIC ${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 -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${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_flag_spec_ld='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${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'
+ ;;
+ *)
+ archive_cmds='$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
+ 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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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.
+ 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) {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$save_LDFLAGS"
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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; }
+ $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
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
+$as_echo "$archive_cmds_need_lc" >&6; }
+ ;;
+ 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
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+ # 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 -e 's/;/ /g'`
+ else
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # 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; }
+}'`
+ sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+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
+ 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
+ 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<name>.so
+ # instead of lib<name>.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=`$ECHO "X$lib" | $Xsed -e '\''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
+ 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,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+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[123]*) 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
+ 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
+ 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'
+ ;;
+
+interix[3-9]*)
+ 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'
+ 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
+ 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 Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-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'
+ 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
+ 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 :
+ 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
+
+ # 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;/^$/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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dld_shl_load+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_svld_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_dld_dld_link+set}" = set; 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" = x""yes; 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 test "${lt_cv_dlopen_self+set}" = set; 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 11530 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#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
+
+void fnord() { int i=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;
+ /* 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 test "${lt_cv_dlopen_self_static+set}" = set; 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 11626 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#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
+
+void fnord() { int i=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;
+ /* 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.11.1
+
+
+
+
+# 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 test "${ac_cv_path_MSGFMT+set}" = set; 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 test "${ac_cv_path_GMSGFMT+set}" = set; 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 test "${ac_cv_path_XGETTEXT+set}" = set; 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 test "${ac_cv_path_MSGMERGE+set}" = set; 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 test "${acl_cv_path_LD+set}" = set; 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 test "${acl_cv_prog_gnu_ld+set}" = set; 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 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&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 test "${acl_cv_rpath+set}" = set; 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 test "${gt_cv_func_CFPreferencesCopyAppValue+set}" = set; 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 <CoreFoundation/CFPreferences.h>
+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 test "${gt_cv_func_CFLocaleCopyCurrent+set}" = set; 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 <CoreFoundation/CFLocale.h>
+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 "test \"\${$gt_func_gnugettext_libc+set}\"" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <libintl.h>
+$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 test "${am_cv_func_iconv+set}" = set; 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 <stdlib.h>
+#include <iconv.h>
+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 <stdlib.h>
+#include <iconv.h>
+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 test "${am_cv_func_iconv_works+set}" = set; 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 <iconv.h>
+#include <string.h>
+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 "test \"\${$gt_func_gnugettext_libintl+set}\"" = set; 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 <libintl.h>
+$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 <libintl.h>
+$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-base-$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 test "${ac_cv_path_PKG_CONFIG+set}" = set; 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 test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; 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
+
+
+
+
+
+ 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
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH" >&5
+$as_echo "$as_me: Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH" >&6;}
+
+
+
+# Check whether --with-install-plugins-helper was given.
+if test "${with_install_plugins_helper+set}" = set; then :
+ withval=$with_install_plugins_helper;
+ case "${withval}" in
+ yes) as_fn_error $? "bad value ${withval} for --with-install-plugins-helper" "$LINENO" 5 ;;
+ no) as_fn_error $? "bad value ${withval} for --with-install-plugins-helper" "$LINENO" 5 ;;
+ *) GST_INSTALL_PLUGINS_HELPER="${withval}" ;;
+ esac
+
+else
+
+
+ EXP_VAR=GST_INSTALL_PLUGINS_HELPER
+ FROM_VAR=${libexecdir}/gst-install-plugins-helper
+
+ 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
+ GST_INSTALL_PLUGINS_HELPER="$full_var"
+
+
+ prefix=$prefix_save
+ exec_prefix=$exec_prefix_save
+
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_INSTALL_PLUGINS_HELPER as plugin install helper" >&5
+$as_echo "$as_me: Using $GST_INSTALL_PLUGINS_HELPER as plugin install helper" >&6;}
+
+cat >>confdefs.h <<_ACEOF
+#define GST_INSTALL_PLUGINS_HELPER "$GST_INSTALL_PLUGINS_HELPER"
+_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=""
+ GST_PLUGINS_NONPORTED=""
+
+
+
+
+
+
+
+ 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 echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " EXTERNAL " > /dev/null; then
+ USE_EXTERNAL="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** not ported" >&5
+$as_echo "$as_me: WARNING: *** not ported" >&2;}
+fi
+
+
+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 echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " EXPERIMENTAL " > /dev/null; then
+ USE_EXPERIMENTAL="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** not ported" >&5
+$as_echo "$as_me: WARNING: *** not ported" >&2;}
+fi
+
+
+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" = x""yes; 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" = x""yes; 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 test "${ac_cv_c_bigendian+set}" = set; 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 <sys/types.h>
+ #include <sys/param.h>
+
+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 <sys/types.h>
+ #include <sys/param.h>
+
+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 <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+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 <limits.h>
+
+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
+
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ 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
+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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'.
+ 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
+ ;;
+ 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 test "${ac_cv_prog_cc_c99+set}" = set; 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 <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 test "${ac_cv_prog_cc_stdc+set}" = set; 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
+
+
+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 "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\"" = set; 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
+
+
+
+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 test "${ac_cv_prog_CXX+set}" = set; 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 test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cxx_g+set}" = set; 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'.
+ 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
+ ;;
+ 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
+
+
+
+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 test "${ac_cv_prog_CXX+set}" = set; 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 test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cxx_g+set}" = set; 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'.
+ 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
+ ;;
+ 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
+
+
+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 test "${ac_cv_prog_CXXCPP+set}" = set; 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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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;}
+_lt_caught_CXX_error=yes; }
+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_flag_spec_ld_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
+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_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++"}
+ 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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 test "${lt_cv_path_LD+set}" = set; 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 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -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 "\-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.
+ 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
+ }
+ }'
+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 "$aix_libpath"; then
+ 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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.
+ 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
+ }
+ }'
+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 "$aix_libpath"; then
+ 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ 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 <jrb3@best.com> 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*)
+ # _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'
+ 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
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX=''
+ 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=echo
+ 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
+ ;;
+
+ freebsd[12]*)
+ # 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*)
+ ;;
+
+ 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; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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; $ECHO "X$list" | $Xsed'
+
+ 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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ ;;
+ xl*)
+ # 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; $ECHO \"$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='echo'
+
+ # 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=echo
+ 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*)
+ # 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='echo'
+
+ # 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 -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 -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 "\-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 "\-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'
+ ;;
+ *)
+ 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
+
+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 $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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
+ ;;
+
+ *.$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
+
+# 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*)
+ # 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=
+
+{ $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; }
+
+ # 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=
+ ;;
+ 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
+ ;;
+ 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*)
+ # IBM XL 8.0 on PPC
+ 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*)
+ # 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}: result: $lt_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_prog_compiler_pic_CXX" >&6; }
+
+
+
+#
+# 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 test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; 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:19037: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:19041: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:19136: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:19140: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:19188: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:19192: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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'
+ 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
+ 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")) && (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*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ linux* | k*bsd*-gnu)
+ link_all_deplibs_CXX=no
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+
+{ $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; }
+ $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
+ archive_cmds_need_lc_CXX=no
+ else
+ 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*
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5
+$as_echo "$archive_cmds_need_lc_CXX" >&6; }
+ ;;
+ 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
+ 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
+ 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<name>.so
+ # instead of lib<name>.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=`$ECHO "X$lib" | $Xsed -e '\''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
+ 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,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+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[123]*) 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
+ 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
+ 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'
+ ;;
+
+interix[3-9]*)
+ 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'
+ 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
+ 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 Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-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'
+ 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
+ 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 :
+ 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
+
+ # 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;/^$/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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+
+
+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. */
+ class Foo { int bar; };
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ working_cxx=yes
+else
+ working_cxx=no
+fi
+rm -f core conftest.err conftest.$ac_objext 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
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: working c++ compiler found: $working_cxx" >&5
+$as_echo "$as_me: working c++ compiler found: $working_cxx" >&6;}
+ if test "x$working_cxx" = "xyes"; then
+ HAVE_CXX_TRUE=
+ HAVE_CXX_FALSE='#'
+else
+ HAVE_CXX_TRUE='#'
+ HAVE_CXX_FALSE=
+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 test "${ac_cv_path_VALGRIND_PATH+set}" = set; 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
+
+
+
+
+
+ # Check whether --enable-introspection was given.
+if test "${enable_introspection+set}" = set; then :
+ enableval=$enable_introspection;
+else
+ enable_introspection=auto
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
+$as_echo_n "checking for gobject-introspection... " >&6; }
+
+ case $enable_introspection in #(
+ no) :
+ found_introspection="no (disabled, use --enable-introspection to enable)"
+ ;; #(
+ yes) :
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ :
+else
+ as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+fi
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.9.12\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.9.12") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ found_introspection=yes
+else
+ as_fn_error $? "You need to have gobject-introspection >= 0.9.12 installed to build GStreamer Base Plug-ins" "$LINENO" 5
+fi
+ ;; #(
+ auto) :
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.9.12\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.9.12") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ found_introspection=yes
+else
+ found_introspection=no
+fi
+ ;; #(
+ *) :
+ as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
+$as_echo "$found_introspection" >&6; }
+
+ 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
+
+
+
+
+
+
+
+
+
+ if test "x$found_introspection" = "xyes"; then
+ HAVE_INTROSPECTION_TRUE=
+ HAVE_INTROSPECTION_FALSE='#'
+else
+ HAVE_INTROSPECTION_TRUE='#'
+ HAVE_INTROSPECTION_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 test "${ac_cv_path_SED+set}" = set; 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 test "${ac_cv_path_GTKDOC_CHECK+set}" = set; 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 test "${ac_cv_path_PYTHON+set}" = set; 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* | *-*-cygwin* | *-*-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 test "${ac_cv_lib_mw__mwvalidcheckl+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_m_cos+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_m_cos+set}" = set; 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" = x""yes; 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 test "${ac_cv_header_stdc+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+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 <string.h>
+
+_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 <stdlib.h>
+
+_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 <ctype.h>
+#include <stdlib.h>
+#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
+
+
+ac_cppflags_save="$CPPFLAGS"
+CPPFLAGS="`$PKG_CONFIG --cflags libxml-2.0`"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libxml/HTMLparser.h>
+
+int
+main ()
+{
+
+#ifndef LIBXML_HTML_ENABLED
+#error libxml2 has no HTML support
+#endif /* LIBXML_HTML_ENABLED */
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ HAVE_LIBXML_HTML="yes"
+else
+ HAVE_LIBXML_HTML="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CPPFLAGS="$ac_cppflags_save"
+ if test "x$HAVE_LIBXML_HTML" = "xyes"; then
+ HAVE_LIBXML_HTML_TRUE=
+ HAVE_LIBXML_HTML_FALSE='#'
+else
+ HAVE_LIBXML_HTML_TRUE='#'
+ HAVE_LIBXML_HTML_FALSE=
+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" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_SOCKET_H 1
+_ACEOF
+ HAVE_SYS_SOCKET_H="yes"
+else
+ HAVE_SYS_SOCKET_H="no"
+fi
+
+done
+
+ if test "x$HAVE_SYS_SOCKET_H" = "xyes"; then
+ HAVE_SYS_SOCKET_H_TRUE=
+ HAVE_SYS_SOCKET_H_FALSE='#'
+else
+ HAVE_SYS_SOCKET_H_TRUE='#'
+ HAVE_SYS_SOCKET_H_FALSE=
+fi
+
+
+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" = x""yes; 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
+ WIN32_LIBS="-lws2_32"
+
+fi
+
+save_libs="$LIBS"
+ac_fn_c_check_func "$LINENO" "hstrerror" "ac_cv_func_hstrerror"
+if test "x$ac_cv_func_hstrerror" = x""yes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hstrerror in -lresolv" >&5
+$as_echo_n "checking for hstrerror in -lresolv... " >&6; }
+if test "${ac_cv_lib_resolv_hstrerror+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $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 hstrerror ();
+int
+main ()
+{
+return hstrerror ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv_hstrerror=yes
+else
+ ac_cv_lib_resolv_hstrerror=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_resolv_hstrerror" >&5
+$as_echo "$ac_cv_lib_resolv_hstrerror" >&6; }
+if test "x$ac_cv_lib_resolv_hstrerror" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBRESOLV 1
+_ACEOF
+
+ LIBS="-lresolv $LIBS"
+
+else
+
+$as_echo "#define NO_HSTRERROR 1" >>confdefs.h
+
+fi
+
+fi
+
+HSTRERROR_LIBS=$LIBS
+
+LIBS="$save_libs"
+
+for ac_header in process.h sys/types.h sys/wait.h sys/stat.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
+
+fi
+
+done
+
+
+# ------ 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 test "${ac_cv_header_stdint_t+set}" = set; 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 <stdint.h>
+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 <stdint.h>
+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 test "${ac_cv_header_stdint_x+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_header_stdint_o+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_header_stdint_u+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_sizeof_char+set}" = set; 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 test "${ac_cv_sizeof_short+set}" = set; 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 test "${ac_cv_sizeof_int+set}" = set; 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 test "${ac_cv_sizeof_long+set}" = set; 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 test "${ac_cv_sizeof_voidp+set}" = set; 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" = x""yes; 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" = x""yes; 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" = x""yes; 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_func in localtime_r gmtime_r
+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_SAVE=$LIBS
+LIBS="$LIBS $LIBM"
+for ac_func in log2
+do :
+ ac_fn_c_check_func "$LINENO" "log2" "ac_cv_func_log2"
+if test "x$ac_cv_func_log2" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LOG2 1
+_ACEOF
+
+fi
+done
+
+LIBS=$LIBS_SAVE
+
+
+
+
+ { $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 test "${_cv_gst_fionread_in_sys_ioctl+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+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 test "${_cv_gst_fionread_in_sys_filio+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/filio.h>
+
+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 for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if test "${ac_cv_sys_largefile_source+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+
+save_libs=$LIBS
+LIBS="$LIBS $LIBM"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrint" >&5
+$as_echo_n "checking for lrint... " >&6; }
+if test "${ac_cv_c99_lrint+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _ISOC9X_SOURCE 1
+#define _ISOC99_SOURCE 1
+#define __USE_ISOC99 1
+#define __USE_ISOC9X 1
+#include <math.h>
+int
+main ()
+{
+ int value = lrint (0.432) ;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_c99_lrint=yes
+else
+ ac_cv_c99_lrint=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_c99_lrint" >&5
+$as_echo "$ac_cv_c99_lrint" >&6; }
+if test $ac_cv_c99_lrint = yes; then
+
+$as_echo "#define HAVE_LRINT 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrintf" >&5
+$as_echo_n "checking for lrintf... " >&6; }
+if test "${ac_cv_c99_lrintf+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _ISOC9X_SOURCE 1
+#define _ISOC99_SOURCE 1
+#define __USE_ISOC99 1
+#define __USE_ISOC9X 1
+#include <math.h>
+int
+main ()
+{
+ int value = lrintf (0.432) ;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_c99_lrintf=yes
+else
+ ac_cv_c99_lrintf=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_c99_lrintf" >&5
+$as_echo "$ac_cv_c99_lrintf" >&6; }
+if test $ac_cv_c99_lrintf = yes; then
+
+$as_echo "#define HAVE_LRINTF 1" >>confdefs.h
+
+fi
+
+LIBS=$save_libs
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC implements __PRETTY_FUNCTION__" >&5
+$as_echo_n "checking whether $CC implements __PRETTY_FUNCTION__... " >&6; }
+ if test "${gst_cv_have_pretty_function+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+printf("%s", __PRETTY_FUNCTION__);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gst_cv_have_pretty_function=yes
+else
+ gst_cv_have_pretty_function=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: $gst_cv_have_pretty_function" >&5
+$as_echo "$gst_cv_have_pretty_function" >&6; }
+ if test "$gst_cv_have_pretty_function" = yes; then
+
+$as_echo "#define HAVE_PRETTY_FUNCTION 1" >>confdefs.h
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC implements __FUNCTION__" >&5
+$as_echo_n "checking whether $CC implements __FUNCTION__... " >&6; }
+ if test "${gst_cv_have_function+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+printf("%s", __FUNCTION__);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gst_cv_have_function=yes
+else
+ gst_cv_have_function=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: $gst_cv_have_function" >&5
+$as_echo "$gst_cv_have_function" >&6; }
+ if test "$gst_cv_have_function" = yes; then
+
+$as_echo "#define HAVE_FUNCTION 1" >>confdefs.h
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC implements __func__" >&5
+$as_echo_n "checking whether $CC implements __func__... " >&6; }
+ if test "${gst_cv_have_func+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+printf("%s", __func__);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gst_cv_have_func=yes
+else
+ gst_cv_have_func=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: $gst_cv_have_func" >&5
+$as_echo "$gst_cv_have_func" >&6; }
+ if test "$gst_cv_have_func" = yes; then
+
+$as_echo "#define HAVE_FUNC 1" >>confdefs.h
+
+ fi
+
+ 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
+
+cat >>confdefs.h <<_ACEOF
+#define GST_FUNCTION $function
+_ACEOF
+
+
+
+ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket"
+if test "x$ac_cv_func_socket" = x""yes; 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 test "${ac_cv_lib_socket_socket+set}" = set; 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" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSOCKET 1
+_ACEOF
+
+ LIBS="-lsocket $LIBS"
+
+fi
+
+fi
+
+ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = x""yes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; 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" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNSL 1
+_ACEOF
+
+ LIBS="-lnsl $LIBS"
+
+fi
+
+fi
+
+
+
+
+
+
+ GLIB_REQ=2.26
+ 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
+
+
+
+
+ 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
+
+
+
+ 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`"
+
+
+
+HAVE_GTK=no
+HAVE_GTK_X11=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
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT" >&5
+$as_echo_n "checking for QT... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_CFLAGS"; then
+ pkg_cv_QT_CFLAGS="$QT_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.6\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.6") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "QtGui >= 4.6" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_LIBS"; then
+ pkg_cv_QT_LIBS="$QT_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.6\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.6") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "QtGui >= 4.6" 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
+ QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "QtGui >= 4.6"`
+ else
+ QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "QtGui >= 4.6"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$QT_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_QT_GV=no
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT" >&5
+$as_echo_n "checking for QT... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_CFLAGS"; then
+ pkg_cv_QT_CFLAGS="$QT_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "QtGui >= 4.0" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_LIBS"; then
+ pkg_cv_QT_LIBS="$QT_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "QtGui >= 4.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
+ QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "QtGui >= 4.0"`
+ else
+ QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "QtGui >= 4.0"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$QT_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_QT=no
+elif test $pkg_failed = untried; then
+ HAVE_QT=no
+else
+ QT_CFLAGS=$pkg_cv_QT_CFLAGS
+ QT_LIBS=$pkg_cv_QT_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_QT=yes
+fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_QT_GV=no
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT" >&5
+$as_echo_n "checking for QT... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_CFLAGS"; then
+ pkg_cv_QT_CFLAGS="$QT_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "QtGui >= 4.0" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$QT_LIBS"; then
+ pkg_cv_QT_LIBS="$QT_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui >= 4.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtGui >= 4.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "QtGui >= 4.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
+ QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "QtGui >= 4.0"`
+ else
+ QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "QtGui >= 4.0"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$QT_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_QT=no
+elif test $pkg_failed = untried; then
+ HAVE_QT=no
+else
+ QT_CFLAGS=$pkg_cv_QT_CFLAGS
+ QT_LIBS=$pkg_cv_QT_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_QT=yes
+fi
+
+else
+ QT_CFLAGS=$pkg_cv_QT_CFLAGS
+ QT_LIBS=$pkg_cv_QT_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_QT_GV=yes
+ HAVE_QT=yes
+
+fi
+if test "x$HAVE_QT" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Qt moc" >&5
+$as_echo_n "checking Qt moc... " >&6; }
+ QT4_MOC=`$PKG_CONFIG --variable=moc_location QtGui`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT4_MOC" >&5
+$as_echo "$QT4_MOC" >&6; }
+
+fi
+ if test "x$HAVE_QT" = "xyes"; then
+ HAVE_QT_TRUE=
+ HAVE_QT_FALSE='#'
+else
+ HAVE_QT_TRUE='#'
+ HAVE_QT_FALSE=
+fi
+
+ if test "x$HAVE_QT_GV" = "xyes"; then
+ HAVE_QT_GV_TRUE=
+ HAVE_QT_GV_FALSE='#'
+else
+ HAVE_QT_GV_TRUE='#'
+ HAVE_QT_GV_FALSE=
+fi
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #include <linux/input.h>
+ #include <linux/joystick.h>
+
+int
+main ()
+{
+
+ struct js_event js;
+ js.type = JS_EVENT_AXIS;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ HAVE_LINUX_JOYSTICK_HEADERS="yes"
+
+else
+
+ HAVE_LINUX_JOYSTICK_HEADERS="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test "x$HAVE_LINUX_JOYSTICK_HEADERS" = "xyes"; then
+ HAVE_LINUX_JOYSTICK_HEADERS_TRUE=
+ HAVE_LINUX_JOYSTICK_HEADERS_FALSE='#'
+else
+ HAVE_LINUX_JOYSTICK_HEADERS_TRUE='#'
+ HAVE_LINUX_JOYSTICK_HEADERS_FALSE=
+fi
+
+
+# Check whether --enable-Bsymbolic was given.
+if test "${enable_Bsymbolic+set}" = set; then :
+ enableval=$enable_Bsymbolic;
+else
+ SAVED_LDFLAGS="${LDFLAGS}"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5
+$as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; }
+ LDFLAGS=-Wl,-Bsymbolic-functions
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+int main (void) { return 0; }
+ ;
+ 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; }
+ enable_Bsymbolic=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ enable_Bsymbolic=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="${SAVED_LDFLAGS}"
+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-base.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-base.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
+
+
+
+
+
+
+ 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 -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -Wno-multichar -Wnested-externs " != "x"
+ then
+ UNSUPPORTED=""
+ list="
+ -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -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;}
+
+
+
+
+
+ { $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 -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -Wno-multichar" != "x"
+ then
+ UNSUPPORTED=""
+ list="
+ -Wmissing-declarations -Wredundant-decls -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -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_DATADIR="$GST_PREFIX/share"
+
+cat >>confdefs.h <<_ACEOF
+#define GST_DATADIR "$GST_DATADIR"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define GST_MAJORMINOR "$GST_MAJORMINOR"
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which audio resample format to use for integer" >&5
+$as_echo_n "checking which audio resample format to use for integer... " >&6; }
+
+# Check whether --with-audioresample_format was given.
+if test "${with_audioresample_format+set}" = set; then :
+ withval=$with_audioresample_format; ac_cv_audioresample_format=$withval
+else
+ ac_cv_audioresample_format=auto
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_audioresample_format" >&5
+$as_echo "$ac_cv_audioresample_format" >&6; }
+case $ac_cv_audioresample_format in
+ int)
+
+$as_echo "#define AUDIORESAMPLE_FORMAT_INT 1" >>confdefs.h
+
+
+ ;;
+ float)
+
+$as_echo "#define AUDIORESAMPLE_FORMAT_FLOAT 1" >>confdefs.h
+
+
+ ;;
+ auto)
+
+$as_echo "#define AUDIORESAMPLE_FORMAT_AUTO 1" >>confdefs.h
+
+
+esac
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL adder"
+
+
+
+ # Check whether --enable-adder was given.
+if test "${enable_adder+set}" = set; then :
+ enableval=$enable_adder;
+ case "${enableval}" in
+ yes) gst_use_adder=yes ;;
+ no) gst_use_adder=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-adder" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_adder=yes
+fi
+
+ if test x$gst_use_adder = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin adder" >&5
+$as_echo "$as_me: disabling dependency-less plugin adder" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS adder"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " adder " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED adder"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " adder " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adder / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " adder " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adder / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " adder " > /dev/null; then
+ USE_PLUGIN_ADDER_TRUE=
+ USE_PLUGIN_ADDER_FALSE='#'
+else
+ USE_PLUGIN_ADDER_TRUE='#'
+ USE_PLUGIN_ADDER_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL app"
+
+
+
+ # Check whether --enable-app was given.
+if test "${enable_app+set}" = set; then :
+ enableval=$enable_app;
+ case "${enableval}" in
+ yes) gst_use_app=yes ;;
+ no) gst_use_app=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-app" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_app=yes
+fi
+
+ if test x$gst_use_app = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin app" >&5
+$as_echo "$as_me: disabling dependency-less plugin app" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS app"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " app " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED app"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " app " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ app / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " app " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ app / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " app " > /dev/null; then
+ USE_PLUGIN_APP_TRUE=
+ USE_PLUGIN_APP_FALSE='#'
+else
+ USE_PLUGIN_APP_TRUE='#'
+ USE_PLUGIN_APP_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL audioconvert"
+
+
+
+ # Check whether --enable-audioconvert was given.
+if test "${enable_audioconvert+set}" = set; then :
+ enableval=$enable_audioconvert;
+ case "${enableval}" in
+ yes) gst_use_audioconvert=yes ;;
+ no) gst_use_audioconvert=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-audioconvert" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_audioconvert=yes
+fi
+
+ if test x$gst_use_audioconvert = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audioconvert" >&5
+$as_echo "$as_me: disabling dependency-less plugin audioconvert" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS audioconvert"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audioconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audioconvert"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audioconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioconvert / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audioconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioconvert / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " audioconvert " > /dev/null; then
+ USE_PLUGIN_AUDIOCONVERT_TRUE=
+ USE_PLUGIN_AUDIOCONVERT_FALSE='#'
+else
+ USE_PLUGIN_AUDIOCONVERT_TRUE='#'
+ USE_PLUGIN_AUDIOCONVERT_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiorate"
+
+
+
+ # Check whether --enable-audiorate was given.
+if test "${enable_audiorate+set}" = set; then :
+ enableval=$enable_audiorate;
+ case "${enableval}" in
+ yes) gst_use_audiorate=yes ;;
+ no) gst_use_audiorate=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-audiorate" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_audiorate=yes
+fi
+
+ if test x$gst_use_audiorate = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiorate" >&5
+$as_echo "$as_me: disabling dependency-less plugin audiorate" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiorate"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiorate " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiorate"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiorate " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiorate / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audiorate " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiorate / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " audiorate " > /dev/null; then
+ USE_PLUGIN_AUDIORATE_TRUE=
+ USE_PLUGIN_AUDIORATE_FALSE='#'
+else
+ USE_PLUGIN_AUDIORATE_TRUE='#'
+ USE_PLUGIN_AUDIORATE_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiotestsrc"
+
+
+
+ # Check whether --enable-audiotestsrc was given.
+if test "${enable_audiotestsrc+set}" = set; then :
+ enableval=$enable_audiotestsrc;
+ case "${enableval}" in
+ yes) gst_use_audiotestsrc=yes ;;
+ no) gst_use_audiotestsrc=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-audiotestsrc" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_audiotestsrc=yes
+fi
+
+ if test x$gst_use_audiotestsrc = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiotestsrc" >&5
+$as_echo "$as_me: disabling dependency-less plugin audiotestsrc" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiotestsrc"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiotestsrc"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiotestsrc / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audiotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiotestsrc / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " audiotestsrc " > /dev/null; then
+ USE_PLUGIN_AUDIOTESTSRC_TRUE=
+ USE_PLUGIN_AUDIOTESTSRC_FALSE='#'
+else
+ USE_PLUGIN_AUDIOTESTSRC_TRUE='#'
+ USE_PLUGIN_AUDIOTESTSRC_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL encoding"
+
+
+
+ # Check whether --enable-encoding was given.
+if test "${enable_encoding+set}" = set; then :
+ enableval=$enable_encoding;
+ case "${enableval}" in
+ yes) gst_use_encoding=yes ;;
+ no) gst_use_encoding=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-encoding" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_encoding=yes
+fi
+
+ if test x$gst_use_encoding = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin encoding" >&5
+$as_echo "$as_me: disabling dependency-less plugin encoding" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS encoding"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " encoding " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED encoding"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " encoding " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ encoding / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " encoding " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ encoding / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " encoding " > /dev/null; then
+ USE_PLUGIN_ENCODING_TRUE=
+ USE_PLUGIN_ENCODING_FALSE='#'
+else
+ USE_PLUGIN_ENCODING_TRUE='#'
+ USE_PLUGIN_ENCODING_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL videoconvert"
+
+
+
+ # Check whether --enable-videoconvert was given.
+if test "${enable_videoconvert+set}" = set; then :
+ enableval=$enable_videoconvert;
+ case "${enableval}" in
+ yes) gst_use_videoconvert=yes ;;
+ no) gst_use_videoconvert=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-videoconvert" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_videoconvert=yes
+fi
+
+ if test x$gst_use_videoconvert = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videoconvert" >&5
+$as_echo "$as_me: disabling dependency-less plugin videoconvert" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS videoconvert"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videoconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videoconvert"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videoconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoconvert / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videoconvert " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoconvert / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " videoconvert " > /dev/null; then
+ USE_PLUGIN_VIDEOCONVERT_TRUE=
+ USE_PLUGIN_VIDEOCONVERT_FALSE='#'
+else
+ USE_PLUGIN_VIDEOCONVERT_TRUE='#'
+ USE_PLUGIN_VIDEOCONVERT_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL gdp"
+
+
+
+ # Check whether --enable-gdp was given.
+if test "${enable_gdp+set}" = set; then :
+ enableval=$enable_gdp;
+ case "${enableval}" in
+ yes) gst_use_gdp=yes ;;
+ no) gst_use_gdp=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-gdp" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_gdp=yes
+fi
+
+ if test x$gst_use_gdp = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin gdp" >&5
+$as_echo "$as_me: disabling dependency-less plugin gdp" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS gdp"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " gdp " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED gdp"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " gdp " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gdp / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " gdp " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gdp / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " gdp " > /dev/null; then
+ USE_PLUGIN_GDP_TRUE=
+ USE_PLUGIN_GDP_FALSE='#'
+else
+ USE_PLUGIN_GDP_TRUE='#'
+ USE_PLUGIN_GDP_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL playback"
+
+
+
+ # Check whether --enable-playback was given.
+if test "${enable_playback+set}" = set; then :
+ enableval=$enable_playback;
+ case "${enableval}" in
+ yes) gst_use_playback=yes ;;
+ no) gst_use_playback=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-playback" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_playback=yes
+fi
+
+ if test x$gst_use_playback = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin playback" >&5
+$as_echo "$as_me: disabling dependency-less plugin playback" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS playback"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " playback " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED playback"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " playback " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ playback / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " playback " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ playback / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " playback " > /dev/null; then
+ USE_PLUGIN_PLAYBACK_TRUE=
+ USE_PLUGIN_PLAYBACK_FALSE='#'
+else
+ USE_PLUGIN_PLAYBACK_TRUE='#'
+ USE_PLUGIN_PLAYBACK_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL audioresample"
+
+
+
+ # Check whether --enable-audioresample was given.
+if test "${enable_audioresample+set}" = set; then :
+ enableval=$enable_audioresample;
+ case "${enableval}" in
+ yes) gst_use_audioresample=yes ;;
+ no) gst_use_audioresample=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-audioresample" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_audioresample=yes
+fi
+
+ if test x$gst_use_audioresample = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audioresample" >&5
+$as_echo "$as_me: disabling dependency-less plugin audioresample" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS audioresample"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audioresample " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audioresample"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audioresample " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioresample / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audioresample " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioresample / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " audioresample " > /dev/null; then
+ USE_PLUGIN_AUDIORESAMPLE_TRUE=
+ USE_PLUGIN_AUDIORESAMPLE_FALSE='#'
+else
+ USE_PLUGIN_AUDIORESAMPLE_TRUE='#'
+ USE_PLUGIN_AUDIORESAMPLE_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL subparse"
+
+
+
+ # Check whether --enable-subparse was given.
+if test "${enable_subparse+set}" = set; then :
+ enableval=$enable_subparse;
+ case "${enableval}" in
+ yes) gst_use_subparse=yes ;;
+ no) gst_use_subparse=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-subparse" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_subparse=yes
+fi
+
+ if test x$gst_use_subparse = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin subparse" >&5
+$as_echo "$as_me: disabling dependency-less plugin subparse" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS subparse"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " subparse " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED subparse"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " subparse " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ subparse / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " subparse " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ subparse / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " subparse " > /dev/null; then
+ USE_PLUGIN_SUBPARSE_TRUE=
+ USE_PLUGIN_SUBPARSE_FALSE='#'
+else
+ USE_PLUGIN_SUBPARSE_TRUE='#'
+ USE_PLUGIN_SUBPARSE_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL tcp"
+
+
+
+ # Check whether --enable-tcp was given.
+if test "${enable_tcp+set}" = set; then :
+ enableval=$enable_tcp;
+ case "${enableval}" in
+ yes) gst_use_tcp=yes ;;
+ no) gst_use_tcp=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-tcp" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_tcp=yes
+fi
+
+ if test x$gst_use_tcp = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin tcp" >&5
+$as_echo "$as_me: disabling dependency-less plugin tcp" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS tcp"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " tcp " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED tcp"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " tcp " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ tcp / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " tcp " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ tcp / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " tcp " > /dev/null; then
+ USE_PLUGIN_TCP_TRUE=
+ USE_PLUGIN_TCP_FALSE='#'
+else
+ USE_PLUGIN_TCP_TRUE='#'
+ USE_PLUGIN_TCP_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL typefind"
+
+
+
+ # Check whether --enable-typefind was given.
+if test "${enable_typefind+set}" = set; then :
+ enableval=$enable_typefind;
+ case "${enableval}" in
+ yes) gst_use_typefind=yes ;;
+ no) gst_use_typefind=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-typefind" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_typefind=yes
+fi
+
+ if test x$gst_use_typefind = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin typefind" >&5
+$as_echo "$as_me: disabling dependency-less plugin typefind" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS typefind"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " typefind " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED typefind"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " typefind " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ typefind / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " typefind " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ typefind / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " typefind " > /dev/null; then
+ USE_PLUGIN_TYPEFIND_TRUE=
+ USE_PLUGIN_TYPEFIND_FALSE='#'
+else
+ USE_PLUGIN_TYPEFIND_TRUE='#'
+ USE_PLUGIN_TYPEFIND_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL videotestsrc"
+
+
+
+ # Check whether --enable-videotestsrc was given.
+if test "${enable_videotestsrc+set}" = set; then :
+ enableval=$enable_videotestsrc;
+ case "${enableval}" in
+ yes) gst_use_videotestsrc=yes ;;
+ no) gst_use_videotestsrc=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-videotestsrc" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_videotestsrc=yes
+fi
+
+ if test x$gst_use_videotestsrc = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videotestsrc" >&5
+$as_echo "$as_me: disabling dependency-less plugin videotestsrc" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS videotestsrc"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videotestsrc"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videotestsrc / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videotestsrc " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videotestsrc / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " videotestsrc " > /dev/null; then
+ USE_PLUGIN_VIDEOTESTSRC_TRUE=
+ USE_PLUGIN_VIDEOTESTSRC_FALSE='#'
+else
+ USE_PLUGIN_VIDEOTESTSRC_TRUE='#'
+ USE_PLUGIN_VIDEOTESTSRC_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL videorate"
+
+
+
+ # Check whether --enable-videorate was given.
+if test "${enable_videorate+set}" = set; then :
+ enableval=$enable_videorate;
+ case "${enableval}" in
+ yes) gst_use_videorate=yes ;;
+ no) gst_use_videorate=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-videorate" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_videorate=yes
+fi
+
+ if test x$gst_use_videorate = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videorate" >&5
+$as_echo "$as_me: disabling dependency-less plugin videorate" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS videorate"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videorate " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videorate"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videorate " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videorate / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videorate " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videorate / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " videorate " > /dev/null; then
+ USE_PLUGIN_VIDEORATE_TRUE=
+ USE_PLUGIN_VIDEORATE_FALSE='#'
+else
+ USE_PLUGIN_VIDEORATE_TRUE='#'
+ USE_PLUGIN_VIDEORATE_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL videoscale"
+
+
+
+ # Check whether --enable-videoscale was given.
+if test "${enable_videoscale+set}" = set; then :
+ enableval=$enable_videoscale;
+ case "${enableval}" in
+ yes) gst_use_videoscale=yes ;;
+ no) gst_use_videoscale=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-videoscale" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_videoscale=yes
+fi
+
+ if test x$gst_use_videoscale = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videoscale" >&5
+$as_echo "$as_me: disabling dependency-less plugin videoscale" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS videoscale"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videoscale " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videoscale"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videoscale " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoscale / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videoscale " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoscale / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " videoscale " > /dev/null; then
+ USE_PLUGIN_VIDEOSCALE_TRUE=
+ USE_PLUGIN_VIDEOSCALE_FALSE='#'
+else
+ USE_PLUGIN_VIDEOSCALE_TRUE='#'
+ USE_PLUGIN_VIDEOSCALE_FALSE=
+fi
+
+
+
+ GST_PLUGINS_ALL="$GST_PLUGINS_ALL volume"
+
+
+
+ # Check whether --enable-volume was given.
+if test "${enable_volume+set}" = set; then :
+ enableval=$enable_volume;
+ case "${enableval}" in
+ yes) gst_use_volume=yes ;;
+ no) gst_use_volume=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-volume" "$LINENO" 5 ;;
+ esac
+
+else
+ gst_use_volume=yes
+fi
+
+ if test x$gst_use_volume = xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin volume" >&5
+$as_echo "$as_me: disabling dependency-less plugin volume" >&6;}
+ WITHOUT_PLUGINS="$WITHOUT_PLUGINS volume"
+ fi
+
+
+ if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " volume " > /dev/null; then
+ GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED volume"
+ fi
+ if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " volume " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ volume / /'`
+ fi
+ if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " volume " > /dev/null; then
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ volume / /'`
+ fi
+ if echo " $GST_PLUGINS_SELECTED " | grep -i " volume " > /dev/null; then
+ USE_PLUGIN_VOLUME_TRUE=
+ USE_PLUGIN_VOLUME_FALSE='#'
+else
+ USE_PLUGIN_VOLUME_TRUE='#'
+ USE_PLUGIN_VOLUME_FALSE=
+fi
+
+
+
+ if false; then
+ USE_XML_TRUE=
+ USE_XML_FALSE='#'
+else
+ USE_XML_TRUE='#'
+ USE_XML_FALSE=
+fi
+
+
+$as_echo "#define GST_DISABLE_XML 1" >>confdefs.h
+
+
+if test "x$HAVE_LIBXML_HTML" != "xyes"; then
+
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ subparse / /'`
+ if false; then
+ USE_PLUGIN_SUBPARSE_TRUE=
+ USE_PLUGIN_SUBPARSE_FALSE='#'
+else
+ USE_PLUGIN_SUBPARSE_TRUE='#'
+ USE_PLUGIN_SUBPARSE_FALSE=
+fi
+
+
+fi
+
+if test "x$HAVE_SYS_SOCKET_H" != "xyes"; then
+
+ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ tcp / /'`
+ if false; then
+ USE_PLUGIN_TCP_TRUE=
+ USE_PLUGIN_TCP_FALSE='#'
+else
+ USE_PLUGIN_TCP_TRUE='#'
+ USE_PLUGIN_TCP_FALSE=
+fi
+
+
+fi
+
+# Check whether --enable-iso-codes was given.
+if test "${enable_iso_codes+set}" = set; then :
+ enableval=$enable_iso_codes; case "${enableval}" in
+ yes) enable_iso_codes=yes ;;
+ no) enable_iso_codes=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-iso-codes" "$LINENO" 5 ;;
+esac
+
+else
+ enable_iso_codes=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use iso-codes if they are available" >&5
+$as_echo_n "checking whether to use iso-codes if they are available... " >&6; }
+if test "x$enable_iso_codes" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_iso_codes=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iso-codes are available on this system" >&5
+$as_echo_n "checking whether iso-codes are available on this system... " >&6; }
+ if $PKG_CONFIG iso-codes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iso-codes has iso-639 domain" >&5
+$as_echo_n "checking whether iso-codes has iso-639 domain... " >&6; }
+ if $PKG_CONFIG --variable=domains iso-codes | $GREP -q 639 ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iso-codes prefix" >&5
+$as_echo_n "checking for iso-codes prefix... " >&6; }
+ ISO_CODES_PREFIX=`$PKG_CONFIG --variable=prefix iso-codes`
+ if test -d "$ISO_CODES_PREFIX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking ISO_CODES_PREFIX" >&5
+$as_echo_n "checking ISO_CODES_PREFIX... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ISO_CODES_PREFIX" >&5
+$as_echo "$ISO_CODES_PREFIX" >&6; }
+ ISO_639_DOMAIN="iso_639"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking ISO_639_DOMAIN" >&5
+$as_echo_n "checking ISO_639_DOMAIN... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ISO_639_DOMAIN" >&5
+$as_echo "$ISO_639_DOMAIN" >&6; }
+ have_iso_codes=yes
+
+$as_echo "#define HAVE_ISO_CODES 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define ISO_CODES_PREFIX "$ISO_CODES_PREFIX"
+_ACEOF
+
+ ISO_CODES_VERSION=`$PKG_CONFIG --modversion iso-codes`
+
+cat >>confdefs.h <<_ACEOF
+#define ISO_CODES_VERSION "$ISO_CODES_VERSION"
+_ACEOF
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ if test "x$have_iso_codes" = "xyes"; then
+ USE_ISO_CODES_TRUE=
+ USE_ISO_CODES_FALSE='#'
+else
+ USE_ISO_CODES_TRUE='#'
+ USE_ISO_CODES_FALSE=
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (disabled via --disable-iso-codes)" >&5
+$as_echo "no (disabled via --disable-iso-codes)" >&6; }
+ if false; then
+ USE_ISO_CODES_TRUE=
+ USE_ISO_CODES_FALSE='#'
+else
+ USE_ISO_CODES_TRUE='#'
+ USE_ISO_CODES_FALSE=
+fi
+
+fi
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: zlib support for ID3 parsing in libgsttag ***" >&5
+$as_echo "$as_me: *** checking feature: zlib support for ID3 parsing in libgsttag ***" >&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 echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ZLIB " > /dev/null; then
+ USE_ZLIB="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** not ported" >&5
+$as_echo "$as_me: WARNING: *** not ported" >&2;}
+fi
+
+
+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
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZLIB" >&5
+$as_echo_n "checking for ZLIB... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$ZLIB_CFLAGS"; then
+ pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" zlib \""; } >&5
+ ($PKG_CONFIG --exists --print-errors " zlib ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags " zlib " 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$ZLIB_LIBS"; then
+ pkg_cv_ZLIB_LIBS="$ZLIB_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" zlib \""; } >&5
+ ($PKG_CONFIG --exists --print-errors " zlib ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs " zlib " 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
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " zlib "`
+ else
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " zlib "`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$ZLIB_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5
+$as_echo_n "checking for uncompress in -lz... " >&6; }
+if test "${ac_cv_lib_z_uncompress+set}" = set; 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" = x""yes; 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" = x""yes; then :
+ :
+else
+ HAVE_ZLIB=no
+fi
+
+
+ if test "x$HAVE_ZLIB" = "xyes"; then
+
+ HAVE_ZLIB="yes"
+ ZLIB_LIBS="-lz"
+
+
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+
+elif test $pkg_failed = untried; then
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5
+$as_echo_n "checking for uncompress in -lz... " >&6; }
+if test "${ac_cv_lib_z_uncompress+set}" = set; 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" = x""yes; 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" = x""yes; then :
+ :
+else
+ HAVE_ZLIB=no
+fi
+
+
+ if test "x$HAVE_ZLIB" = "xyes"; then
+
+ HAVE_ZLIB="yes"
+ ZLIB_LIBS="-lz"
+
+
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+
+else
+ ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS
+ ZLIB_LIBS=$pkg_cv_ZLIB_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_ZLIB="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_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 libraries for plugins in sys/" >&5
+$as_echo "$as_me: Checking libraries for plugins in sys/" >&6;}
+echo
+
+{ $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 test "${ac_cv_have_x+set}" = set; 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 <X11/Xlib.h>
+_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 <X11/Xlib.h>
+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 "xximagesink" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ximagesink ***" >&5
+$as_echo "$as_me: *** for plug-ins: ximagesink ***" >&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: *** ximagesink pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** ximagesink pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " X " > /dev/null; then
+ USE_X="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ximagesink not ported" >&5
+$as_echo "$as_me: WARNING: *** ximagesink not ported" >&2;}
+fi
+
+
+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 test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_nsl_gethostbyname+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_bsd_gethostbyname+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_socket_connect+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_posix_remove+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_ipc_shmat+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; 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" = x""yes; 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" = x""yes; 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"
+
+
+ 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: ximagesink" >&5
+$as_echo "$as_me: *** These plugins will be built: ximagesink" >&6;}
+ fi
+fi
+if test x$USE_X = xyes; then
+ :
+ if test "xximagesink" != "x"; then
+ GST_PLUGINS_YES="\tximagesink\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: ximagesink" >&5
+$as_echo "$as_me: *** These plugins will not be built: ximagesink" >&6;}
+ if test "xximagesink" != "x"; then
+ GST_PLUGINS_NO="\tximagesink\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: X11 XVideo extensions ***" >&5
+$as_echo "$as_me: *** checking feature: X11 XVideo extensions ***" >&6;}
+if test "xxvimagesink" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: xvimagesink ***" >&5
+$as_echo "$as_me: *** for plug-ins: xvimagesink ***" >&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: *** xvimagesink pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** xvimagesink pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " XVIDEO " > /dev/null; then
+ USE_XVIDEO="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** xvimagesink not ported" >&5
+$as_echo "$as_me: WARNING: *** xvimagesink not ported" >&2;}
+fi
+
+
+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 test "${ac_cv_lib_Xv_pic_XvQueryExtension+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_Xv_XvQueryExtension+set}" = set; 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" = x""yes; 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: xvimagesink" >&5
+$as_echo "$as_me: *** These plugins will be built: xvimagesink" >&6;}
+ fi
+fi
+if test x$USE_XVIDEO = xyes; then
+ :
+ if test "xxvimagesink" != "x"; then
+ GST_PLUGINS_YES="\txvimagesink\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_XVIDEO /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: xvimagesink" >&5
+$as_echo "$as_me: *** These plugins will not be built: xvimagesink" >&6;}
+ if test "xxvimagesink" != "x"; then
+ GST_PLUGINS_NO="\txvimagesink\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
+
+
+
+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 echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " XSHM " > /dev/null; then
+ USE_XSHM="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** not ported" >&5
+$as_echo "$as_me: WARNING: *** not ported" >&2;}
+fi
+
+
+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 test "${ac_cv_lib_Xext_XShmAttach+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_XextSam_XShmAttach+set}" = set; 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" = x""yes; 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
+
+
+
+
+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: ALSA ***" >&5
+$as_echo "$as_me: *** checking feature: ALSA ***" >&6;}
+if test "xalsa" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: alsa ***" >&5
+$as_echo "$as_me: *** for plug-ins: alsa ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_ALSA" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-alsa was given.
+if test "${enable_alsa+set}" = set; then :
+ enableval=$enable_alsa; case "${enableval}" in
+ yes) USE_ALSA=yes;;
+ no) USE_ALSA=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-alsa" "$LINENO" 5 ;;
+ esac
+else
+ USE_ALSA=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_ALSA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** alsa pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** alsa pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ALSA " > /dev/null; then
+ USE_ALSA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** alsa not ported" >&5
+$as_echo "$as_me: WARNING: *** alsa not ported" >&2;}
+fi
+
+
+if test x$USE_ALSA = 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_ALSA=no
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA" >&5
+$as_echo_n "checking for ALSA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$ALSA_CFLAGS"; then
+ pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 0.9.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "alsa >= 0.9.1") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa >= 0.9.1" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$ALSA_LIBS"; then
+ pkg_cv_ALSA_LIBS="$ALSA_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 0.9.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "alsa >= 0.9.1") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa >= 0.9.1" 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
+ ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "alsa >= 0.9.1"`
+ else
+ ALSA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "alsa >= 0.9.1"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$ALSA_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ alsa_save_CFLAGS="$CFLAGS"
+alsa_save_LDFLAGS="$LDFLAGS"
+alsa_save_LIBS="$LIBS"
+alsa_found=yes
+
+
+# Check whether --with-alsa-prefix was given.
+if test "${with_alsa_prefix+set}" = set; then :
+ withval=$with_alsa_prefix; alsa_prefix="$withval"
+else
+ alsa_prefix=""
+fi
+
+
+
+# Check whether --with-alsa-inc-prefix was given.
+if test "${with_alsa_inc_prefix+set}" = set; then :
+ withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval"
+else
+ alsa_inc_prefix=""
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5
+$as_echo_n "checking for ALSA CFLAGS... " >&6; }
+if test "$alsa_inc_prefix" != "" ; then
+ ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix"
+ CFLAGS="$CFLAGS -I$alsa_inc_prefix"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5
+$as_echo "$ALSA_CFLAGS" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5
+$as_echo_n "checking for ALSA LDFLAGS... " >&6; }
+if test "$alsa_prefix" != "" ; then
+ ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix"
+ LDFLAGS="$LDFLAGS $ALSA_LIBS"
+fi
+
+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"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5
+$as_echo "$ALSA_LIBS" >&6; }
+
+min_alsa_version=0.9.1
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5
+$as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; }
+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_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 <alsa/asoundlib.h>
+
+int
+main ()
+{
+
+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);
+}
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5
+$as_echo "found." >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5
+$as_echo "not present." >&6; }
+
+ alsa_found=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext 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
+
+
+if test "x$enable_alsatest" = "xyes"; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5
+$as_echo_n "checking for snd_ctl_open in -lasound... " >&6; }
+if test "${ac_cv_lib_asound_snd_ctl_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lasound $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 snd_ctl_open ();
+int
+main ()
+{
+return snd_ctl_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_asound_snd_ctl_open=yes
+else
+ ac_cv_lib_asound_snd_ctl_open=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_asound_snd_ctl_open" >&5
+$as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; }
+if test "x$ac_cv_lib_asound_snd_ctl_open" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBASOUND 1
+_ACEOF
+
+ LIBS="-lasound $LIBS"
+
+else
+
+ alsa_found=no
+
+fi
+
+fi
+
+if test "x$alsa_found" = "xyes" ; then
+ HAVE_ALSA="yes"
+ LIBS=`echo $LIBS | sed 's/-lasound//g'`
+ LIBS=`echo $LIBS | sed 's/ //'`
+ LIBS="-lasound $LIBS"
+fi
+if test "x$alsa_found" = "xno" ; then
+ HAVE_ALSA="no"
+ CFLAGS="$alsa_save_CFLAGS"
+ LDFLAGS="$alsa_save_LDFLAGS"
+ LIBS="$alsa_save_LIBS"
+ ALSA_CFLAGS=""
+ ALSA_LIBS=""
+fi
+
+
+
+
+
+elif test $pkg_failed = untried; then
+
+ alsa_save_CFLAGS="$CFLAGS"
+alsa_save_LDFLAGS="$LDFLAGS"
+alsa_save_LIBS="$LIBS"
+alsa_found=yes
+
+
+# Check whether --with-alsa-prefix was given.
+if test "${with_alsa_prefix+set}" = set; then :
+ withval=$with_alsa_prefix; alsa_prefix="$withval"
+else
+ alsa_prefix=""
+fi
+
+
+
+# Check whether --with-alsa-inc-prefix was given.
+if test "${with_alsa_inc_prefix+set}" = set; then :
+ withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval"
+else
+ alsa_inc_prefix=""
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5
+$as_echo_n "checking for ALSA CFLAGS... " >&6; }
+if test "$alsa_inc_prefix" != "" ; then
+ ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix"
+ CFLAGS="$CFLAGS -I$alsa_inc_prefix"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5
+$as_echo "$ALSA_CFLAGS" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5
+$as_echo_n "checking for ALSA LDFLAGS... " >&6; }
+if test "$alsa_prefix" != "" ; then
+ ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix"
+ LDFLAGS="$LDFLAGS $ALSA_LIBS"
+fi
+
+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"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5
+$as_echo "$ALSA_LIBS" >&6; }
+
+min_alsa_version=0.9.1
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5
+$as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; }
+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_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 <alsa/asoundlib.h>
+
+int
+main ()
+{
+
+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);
+}
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5
+$as_echo "found." >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5
+$as_echo "not present." >&6; }
+
+ alsa_found=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext 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
+
+
+if test "x$enable_alsatest" = "xyes"; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5
+$as_echo_n "checking for snd_ctl_open in -lasound... " >&6; }
+if test "${ac_cv_lib_asound_snd_ctl_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lasound $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 snd_ctl_open ();
+int
+main ()
+{
+return snd_ctl_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_asound_snd_ctl_open=yes
+else
+ ac_cv_lib_asound_snd_ctl_open=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_asound_snd_ctl_open" >&5
+$as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; }
+if test "x$ac_cv_lib_asound_snd_ctl_open" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBASOUND 1
+_ACEOF
+
+ LIBS="-lasound $LIBS"
+
+else
+
+ alsa_found=no
+
+fi
+
+fi
+
+if test "x$alsa_found" = "xyes" ; then
+ HAVE_ALSA="yes"
+ LIBS=`echo $LIBS | sed 's/-lasound//g'`
+ LIBS=`echo $LIBS | sed 's/ //'`
+ LIBS="-lasound $LIBS"
+fi
+if test "x$alsa_found" = "xno" ; then
+ HAVE_ALSA="no"
+ CFLAGS="$alsa_save_CFLAGS"
+ LDFLAGS="$alsa_save_LDFLAGS"
+ LIBS="$alsa_save_LIBS"
+ ALSA_CFLAGS=""
+ ALSA_LIBS=""
+fi
+
+
+
+
+
+else
+ ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS
+ ALSA_LIBS=$pkg_cv_ALSA_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_ALSA="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_ALSA = xno; then
+ USE_ALSA=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: alsa" >&5
+$as_echo "$as_me: *** These plugins will be built: alsa" >&6;}
+ fi
+fi
+if test x$USE_ALSA = xyes; then
+ :
+ if test "xalsa" != "x"; then
+ GST_PLUGINS_YES="\talsa\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_ALSA /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: alsa" >&5
+$as_echo "$as_me: *** These plugins will not be built: alsa" >&6;}
+ if test "xalsa" != "x"; then
+ GST_PLUGINS_NO="\talsa\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_ALSA = xyes; then
+ USE_ALSA_TRUE=
+ USE_ALSA_FALSE='#'
+else
+ USE_ALSA_TRUE='#'
+ USE_ALSA_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: CDParanoia ***" >&5
+$as_echo "$as_me: *** checking feature: CDParanoia ***" >&6;}
+if test "xcdparanoia" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cdparanoia ***" >&5
+$as_echo "$as_me: *** for plug-ins: cdparanoia ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_CDPARANOIA" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-cdparanoia was given.
+if test "${enable_cdparanoia+set}" = set; then :
+ enableval=$enable_cdparanoia; case "${enableval}" in
+ yes) USE_CDPARANOIA=yes;;
+ no) USE_CDPARANOIA=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-cdparanoia" "$LINENO" 5 ;;
+ esac
+else
+ USE_CDPARANOIA=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_CDPARANOIA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cdparanoia pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** cdparanoia pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " CDPARANOIA " > /dev/null; then
+ USE_CDPARANOIA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cdparanoia not ported" >&5
+$as_echo "$as_me: WARNING: *** cdparanoia not ported" >&2;}
+fi
+
+
+if test x$USE_CDPARANOIA = 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_CDPARANOIA=no
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CDPARANOIA" >&5
+$as_echo_n "checking for CDPARANOIA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$CDPARANOIA_CFLAGS"; then
+ pkg_cv_CDPARANOIA_CFLAGS="$CDPARANOIA_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cdparanoia-3 >= 10.2\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "cdparanoia-3 >= 10.2") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_CDPARANOIA_CFLAGS=`$PKG_CONFIG --cflags "cdparanoia-3 >= 10.2" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$CDPARANOIA_LIBS"; then
+ pkg_cv_CDPARANOIA_LIBS="$CDPARANOIA_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cdparanoia-3 >= 10.2\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "cdparanoia-3 >= 10.2") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_CDPARANOIA_LIBS=`$PKG_CONFIG --libs "cdparanoia-3 >= 10.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
+ CDPARANOIA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cdparanoia-3 >= 10.2"`
+ else
+ CDPARANOIA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cdparanoia-3 >= 10.2"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$CDPARANOIA_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cdda_open in -lcdda_interface" >&5
+$as_echo_n "checking for cdda_open in -lcdda_interface... " >&6; }
+if test "${ac_cv_lib_cdda_interface_cdda_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_interface -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 cdda_open ();
+int
+main ()
+{
+return cdda_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_interface_cdda_open=yes
+else
+ ac_cv_lib_cdda_interface_cdda_open=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_cdda_interface_cdda_open" >&5
+$as_echo "$ac_cv_lib_cdda_interface_cdda_open" >&6; }
+if test "x$ac_cv_lib_cdda_interface_cdda_open" = x""yes; then :
+ HAVE_CDPARANOIA=yes
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "cdda_interface.h" "ac_cv_header_cdda_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_cdda_interface_h" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="no"
+ FOUND_CDPARANOIA="yes"
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+ if test "x$FOUND_CDPARANOIA" != "xyes";
+ then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cdda_open in -lcdda_interface" >&5
+$as_echo_n "checking for cdda_open in -lcdda_interface... " >&6; }
+if test "${ac_cv_lib_cdda_interface_cdda_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_interface -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 cdda_open ();
+int
+main ()
+{
+return cdda_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_interface_cdda_open=yes
+else
+ ac_cv_lib_cdda_interface_cdda_open=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_cdda_interface_cdda_open" >&5
+$as_echo "$ac_cv_lib_cdda_interface_cdda_open" >&6; }
+if test "x$ac_cv_lib_cdda_interface_cdda_open" = x""yes; then :
+ HAVE_CDPARANOIA=yes
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "cdda/cdda_interface.h" "ac_cv_header_cdda_cdda_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_cdda_cdda_interface_h" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="yes"
+ FOUND_CDPARANOIA="yes"
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+ fi
+ if test "x$HEADER_DIR" = "xyes";
+ then
+
+cat >>confdefs.h <<_ACEOF
+#define CDPARANOIA_HEADERS_IN_DIR /**/
+_ACEOF
+
+ fi
+ if test "x$FOUND_CDPARANOIA" = "xyes";
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for paranoia_cachemodel_size in -lcdda_paranoia" >&5
+$as_echo_n "checking for paranoia_cachemodel_size in -lcdda_paranoia... " >&6; }
+if test "${ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_paranoia -lcdda_interface $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 paranoia_cachemodel_size ();
+int
+main ()
+{
+return paranoia_cachemodel_size ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size=yes
+else
+ ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size=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_cdda_paranoia_paranoia_cachemodel_size" >&5
+$as_echo "$ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size" >&6; }
+if test "x$ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ fi
+
+
+
+elif test $pkg_failed = untried; then
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cdda_open in -lcdda_interface" >&5
+$as_echo_n "checking for cdda_open in -lcdda_interface... " >&6; }
+if test "${ac_cv_lib_cdda_interface_cdda_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_interface -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 cdda_open ();
+int
+main ()
+{
+return cdda_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_interface_cdda_open=yes
+else
+ ac_cv_lib_cdda_interface_cdda_open=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_cdda_interface_cdda_open" >&5
+$as_echo "$ac_cv_lib_cdda_interface_cdda_open" >&6; }
+if test "x$ac_cv_lib_cdda_interface_cdda_open" = x""yes; then :
+ HAVE_CDPARANOIA=yes
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "cdda_interface.h" "ac_cv_header_cdda_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_cdda_interface_h" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="no"
+ FOUND_CDPARANOIA="yes"
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+ if test "x$FOUND_CDPARANOIA" != "xyes";
+ then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cdda_open in -lcdda_interface" >&5
+$as_echo_n "checking for cdda_open in -lcdda_interface... " >&6; }
+if test "${ac_cv_lib_cdda_interface_cdda_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_interface -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 cdda_open ();
+int
+main ()
+{
+return cdda_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_interface_cdda_open=yes
+else
+ ac_cv_lib_cdda_interface_cdda_open=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_cdda_interface_cdda_open" >&5
+$as_echo "$ac_cv_lib_cdda_interface_cdda_open" >&6; }
+if test "x$ac_cv_lib_cdda_interface_cdda_open" = x""yes; then :
+ HAVE_CDPARANOIA=yes
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "cdda/cdda_interface.h" "ac_cv_header_cdda_cdda_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_cdda_cdda_interface_h" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+
+ if test "x$HAVE_CDPARANOIA" = "xyes"; then
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="yes"
+ FOUND_CDPARANOIA="yes"
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+ fi
+ if test "x$HEADER_DIR" = "xyes";
+ then
+
+cat >>confdefs.h <<_ACEOF
+#define CDPARANOIA_HEADERS_IN_DIR /**/
+_ACEOF
+
+ fi
+ if test "x$FOUND_CDPARANOIA" = "xyes";
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for paranoia_cachemodel_size in -lcdda_paranoia" >&5
+$as_echo_n "checking for paranoia_cachemodel_size in -lcdda_paranoia... " >&6; }
+if test "${ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcdda_paranoia -lcdda_interface $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 paranoia_cachemodel_size ();
+int
+main ()
+{
+return paranoia_cachemodel_size ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size=yes
+else
+ ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size=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_cdda_paranoia_paranoia_cachemodel_size" >&5
+$as_echo "$ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size" >&6; }
+if test "x$ac_cv_lib_cdda_paranoia_paranoia_cachemodel_size" = x""yes; then :
+ :
+else
+ HAVE_CDPARANOIA=no
+fi
+
+ fi
+
+
+
+else
+ CDPARANOIA_CFLAGS=$pkg_cv_CDPARANOIA_CFLAGS
+ CDPARANOIA_LIBS=$pkg_cv_CDPARANOIA_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_CDPARANOIA="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_CDPARANOIA = xno; then
+ USE_CDPARANOIA=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cdparanoia" >&5
+$as_echo "$as_me: *** These plugins will be built: cdparanoia" >&6;}
+ fi
+fi
+if test x$USE_CDPARANOIA = xyes; then
+ :
+ if test "xcdparanoia" != "x"; then
+ GST_PLUGINS_YES="\tcdparanoia\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_CDPARANOIA /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cdparanoia" >&5
+$as_echo "$as_me: *** These plugins will not be built: cdparanoia" >&6;}
+ if test "xcdparanoia" != "x"; then
+ GST_PLUGINS_NO="\tcdparanoia\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_CDPARANOIA = xyes; then
+ USE_CDPARANOIA_TRUE=
+ USE_CDPARANOIA_FALSE='#'
+else
+ USE_CDPARANOIA_TRUE='#'
+ USE_CDPARANOIA_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: integer vorbis plug-in ***" >&5
+$as_echo "$as_me: *** checking feature: integer vorbis plug-in ***" >&6;}
+if test "xivorbisdec" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ivorbisdec ***" >&5
+$as_echo "$as_me: *** for plug-ins: ivorbisdec ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_IVORBIS" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-ivorbis was given.
+if test "${enable_ivorbis+set}" = set; then :
+ enableval=$enable_ivorbis; case "${enableval}" in
+ yes) USE_IVORBIS=yes;;
+ no) USE_IVORBIS=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-ivorbis" "$LINENO" 5 ;;
+ esac
+else
+ USE_IVORBIS=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_IVORBIS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ivorbisdec pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** ivorbisdec pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " IVORBIS " > /dev/null; then
+ USE_IVORBIS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ivorbisdec not ported" >&5
+$as_echo "$as_me: WARNING: *** ivorbisdec not ported" >&2;}
+fi
+
+
+if test x$USE_IVORBIS = 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_IVORBIS=no
+
+
+ which="vorbisidec"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IVORBIS" >&5
+$as_echo_n "checking for IVORBIS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$IVORBIS_CFLAGS"; then
+ pkg_cv_IVORBIS_CFLAGS="$IVORBIS_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_IVORBIS_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 "$IVORBIS_LIBS"; then
+ pkg_cv_IVORBIS_LIBS="$IVORBIS_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_IVORBIS_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
+ IVORBIS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ IVORBIS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$IVORBIS_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_IVORBIS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$IVORBIS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $IVORBIS_PKG_ERRORS" >&5
+$as_echo "$as_me: $IVORBIS_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_IVORBIS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$IVORBIS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $IVORBIS_PKG_ERRORS" >&5
+$as_echo "$as_me: $IVORBIS_PKG_ERRORS" >&6;}
+ fi
+
+else
+ IVORBIS_CFLAGS=$pkg_cv_IVORBIS_CFLAGS
+ IVORBIS_LIBS=$pkg_cv_IVORBIS_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_IVORBIS="yes"
+
+fi
+
+
+ if test $HAVE_IVORBIS = no
+ then
+ IVORBIS_LIBS=
+ IVORBIS_CFLAGS=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis_block_init in -lvorbisidec" >&5
+$as_echo_n "checking for vorbis_block_init in -lvorbisidec... " >&6; }
+if test "${ac_cv_lib_vorbisidec_vorbis_block_init+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lvorbisidec $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 vorbis_block_init ();
+int
+main ()
+{
+return vorbis_block_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_vorbisidec_vorbis_block_init=yes
+else
+ ac_cv_lib_vorbisidec_vorbis_block_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_vorbisidec_vorbis_block_init" >&5
+$as_echo "$ac_cv_lib_vorbisidec_vorbis_block_init" >&6; }
+if test "x$ac_cv_lib_vorbisidec_vorbis_block_init" = x""yes; then :
+ IVORBIS_LIBS=-lvorbisidec
+ HAVE_IVORBIS=yes
+ case $host in
+ arm-*-*)
+ IVORBIS_CFLAGS="-D_ARM_ASSEM_ $IVORBIS_CFLAGS"
+ esac
+
+else
+ HAVE_IVORBIS=no
+fi
+
+
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis_dsp_pcmout in -lvorbisidec" >&5
+$as_echo_n "checking for vorbis_dsp_pcmout in -lvorbisidec... " >&6; }
+if test "${ac_cv_lib_vorbisidec_vorbis_dsp_pcmout+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lvorbisidec $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 vorbis_dsp_pcmout ();
+int
+main ()
+{
+return vorbis_dsp_pcmout ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_vorbisidec_vorbis_dsp_pcmout=yes
+else
+ ac_cv_lib_vorbisidec_vorbis_dsp_pcmout=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_vorbisidec_vorbis_dsp_pcmout" >&5
+$as_echo "$ac_cv_lib_vorbisidec_vorbis_dsp_pcmout" >&6; }
+if test "x$ac_cv_lib_vorbisidec_vorbis_dsp_pcmout" = x""yes; then :
+
+$as_echo "#define USE_TREMOLO 1" >>confdefs.h
+
+else
+ USE_TREMOLO=no
+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_IVORBIS = xno; then
+ USE_IVORBIS=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ivorbisdec" >&5
+$as_echo "$as_me: *** These plugins will be built: ivorbisdec" >&6;}
+ fi
+fi
+if test x$USE_IVORBIS = xyes; then
+ :
+ if test "xivorbisdec" != "x"; then
+ GST_PLUGINS_YES="\tivorbisdec\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_IVORBIS /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ivorbisdec" >&5
+$as_echo "$as_me: *** These plugins will not be built: ivorbisdec" >&6;}
+ if test "xivorbisdec" != "x"; then
+ GST_PLUGINS_NO="\tivorbisdec\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_IVORBIS = xyes; then
+ USE_IVORBIS_TRUE=
+ USE_IVORBIS_FALSE='#'
+else
+ USE_IVORBIS_TRUE='#'
+ USE_IVORBIS_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GIO library ***" >&5
+$as_echo "$as_me: *** checking feature: GIO library ***" >&6;}
+if test "xgio" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gio ***" >&5
+$as_echo "$as_me: *** for plug-ins: gio ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_GIO" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-gio was given.
+if test "${enable_gio+set}" = set; then :
+ enableval=$enable_gio; case "${enableval}" in
+ yes) USE_GIO=yes;;
+ no) USE_GIO=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-gio" "$LINENO" 5 ;;
+ esac
+else
+ USE_GIO=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_GIO="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gio pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** gio pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " GIO " > /dev/null; then
+ USE_GIO="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gio not ported" >&5
+$as_echo "$as_me: WARNING: *** gio not ported" >&2;}
+fi
+
+
+if test x$USE_GIO = 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_GIO=no
+
+
+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.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-2.0 >= 2.16") 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.16" 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.16\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-2.0 >= 2.16") 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.16" 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.16"`
+ else
+ GIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gio-2.0 >= 2.16"`
+ 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; }
+
+ HAVE_GIO="no"
+
+elif test $pkg_failed = untried; then
+
+ HAVE_GIO="no"
+
+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; }
+
+ HAVE_GIO="yes"
+ GIO_MODULE_DIR="`$PKG_CONFIG --variable=giomoduledir gio-2.0`"
+
+cat >>confdefs.h <<_ACEOF
+#define GIO_MODULE_DIR "$GIO_MODULE_DIR"
+_ACEOF
+
+ GIO_LIBDIR="`$PKG_CONFIG --variable=libdir gio-2.0`"
+
+cat >>confdefs.h <<_ACEOF
+#define GIO_LIBDIR "$GIO_LIBDIR"
+_ACEOF
+
+
+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_GIO = xno; then
+ USE_GIO=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gio" >&5
+$as_echo "$as_me: *** These plugins will be built: gio" >&6;}
+ fi
+fi
+if test x$USE_GIO = xyes; then
+ :
+ if test "xgio" != "x"; then
+ GST_PLUGINS_YES="\tgio\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_GIO /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gio" >&5
+$as_echo "$as_me: *** These plugins will not be built: gio" >&6;}
+ if test "xgio" != "x"; then
+ GST_PLUGINS_NO="\tgio\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_GIO = xyes; then
+ USE_GIO_TRUE=
+ USE_GIO_FALSE='#'
+else
+ USE_GIO_TRUE='#'
+ USE_GIO_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libvisual visualization library ***" >&5
+$as_echo "$as_me: *** checking feature: libvisual visualization library ***" >&6;}
+if test "xlibvisual" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: libvisual ***" >&5
+$as_echo "$as_me: *** for plug-ins: libvisual ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_LIBVISUAL" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-libvisual was given.
+if test "${enable_libvisual+set}" = set; then :
+ enableval=$enable_libvisual; case "${enableval}" in
+ yes) USE_LIBVISUAL=yes;;
+ no) USE_LIBVISUAL=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-libvisual" "$LINENO" 5 ;;
+ esac
+else
+ USE_LIBVISUAL=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_LIBVISUAL="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libvisual pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** libvisual pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LIBVISUAL " > /dev/null; then
+ USE_LIBVISUAL="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libvisual not ported" >&5
+$as_echo "$as_me: WARNING: *** libvisual not ported" >&2;}
+fi
+
+
+if test x$USE_LIBVISUAL = 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_LIBVISUAL=no
+
+
+ which="libvisual-0.4 >= 0.4.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBVISUAL" >&5
+$as_echo_n "checking for LIBVISUAL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LIBVISUAL_CFLAGS"; then
+ pkg_cv_LIBVISUAL_CFLAGS="$LIBVISUAL_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_LIBVISUAL_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 "$LIBVISUAL_LIBS"; then
+ pkg_cv_LIBVISUAL_LIBS="$LIBVISUAL_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_LIBVISUAL_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
+ LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LIBVISUAL_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_LIBVISUAL="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
+$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_LIBVISUAL="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
+$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
+ fi
+
+else
+ LIBVISUAL_CFLAGS=$pkg_cv_LIBVISUAL_CFLAGS
+ LIBVISUAL_LIBS=$pkg_cv_LIBVISUAL_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_LIBVISUAL="yes"
+
+fi
+
+
+ if test $HAVE_LIBVISUAL = no
+ then
+
+ which="libvisual = 0.2.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBVISUAL" >&5
+$as_echo_n "checking for LIBVISUAL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$LIBVISUAL_CFLAGS"; then
+ pkg_cv_LIBVISUAL_CFLAGS="$LIBVISUAL_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_LIBVISUAL_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 "$LIBVISUAL_LIBS"; then
+ pkg_cv_LIBVISUAL_LIBS="$LIBVISUAL_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_LIBVISUAL_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
+ LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LIBVISUAL_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_LIBVISUAL="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
+$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_LIBVISUAL="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
+$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
+ fi
+
+else
+ LIBVISUAL_CFLAGS=$pkg_cv_LIBVISUAL_CFLAGS
+ LIBVISUAL_LIBS=$pkg_cv_LIBVISUAL_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_LIBVISUAL="yes"
+
+fi
+
+
+ if test x$HAVE_LIBVISUAL = xyes; then
+ LIBVIS_PLUGINSDIR="`$PKG_CONFIG --variable=pluginsbasedir libvisual-0.2`"
+ fi
+ else
+ if test x$HAVE_LIBVISUAL = xyes; then
+ LIBVIS_PLUGINSDIR="`$PKG_CONFIG --variable=pluginsbasedir libvisual-0.4`"
+ fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: libvisual pluginsdir: $LIBVIS_PLUGINSDIR" >&5
+$as_echo "$as_me: libvisual pluginsdir: $LIBVIS_PLUGINSDIR" >&6;}
+ if test x$LIBVIS_PLUGINSDIR != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define LIBVISUAL_PLUGINSBASEDIR "$LIBVIS_PLUGINSDIR"
+_ACEOF
+
+ 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_LIBVISUAL = xno; then
+ USE_LIBVISUAL=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: libvisual" >&5
+$as_echo "$as_me: *** These plugins will be built: libvisual" >&6;}
+ fi
+fi
+if test x$USE_LIBVISUAL = xyes; then
+ :
+ if test "xlibvisual" != "x"; then
+ GST_PLUGINS_YES="\tlibvisual\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_LIBVISUAL /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: libvisual" >&5
+$as_echo "$as_me: *** These plugins will not be built: libvisual" >&6;}
+ if test "xlibvisual" != "x"; then
+ GST_PLUGINS_NO="\tlibvisual\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_LIBVISUAL = xyes; then
+ USE_LIBVISUAL_TRUE=
+ USE_LIBVISUAL_FALSE='#'
+else
+ USE_LIBVISUAL_TRUE='#'
+ USE_LIBVISUAL_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Xiph Ogg library ***" >&5
+$as_echo "$as_me: *** checking feature: Xiph Ogg library ***" >&6;}
+if test "xogg" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ogg ***" >&5
+$as_echo "$as_me: *** for plug-ins: ogg ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_OGG" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-ogg was given.
+if test "${enable_ogg+set}" = set; then :
+ enableval=$enable_ogg; case "${enableval}" in
+ yes) USE_OGG=yes;;
+ no) USE_OGG=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-ogg" "$LINENO" 5 ;;
+ esac
+else
+ USE_OGG=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_OGG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ogg pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** ogg pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OGG " > /dev/null; then
+ USE_OGG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ogg not ported" >&5
+$as_echo "$as_me: WARNING: *** ogg not ported" >&2;}
+fi
+
+
+if test x$USE_OGG = 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_OGG=no
+
+
+ which="ogg >= 1.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OGG" >&5
+$as_echo_n "checking for OGG... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$OGG_CFLAGS"; then
+ pkg_cv_OGG_CFLAGS="$OGG_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_OGG_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 "$OGG_LIBS"; then
+ pkg_cv_OGG_LIBS="$OGG_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_OGG_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
+ OGG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ OGG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$OGG_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_OGG="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$OGG_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $OGG_PKG_ERRORS" >&5
+$as_echo "$as_me: $OGG_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_OGG="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$OGG_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $OGG_PKG_ERRORS" >&5
+$as_echo "$as_me: $OGG_PKG_ERRORS" >&6;}
+ fi
+
+else
+ OGG_CFLAGS=$pkg_cv_OGG_CFLAGS
+ OGG_LIBS=$pkg_cv_OGG_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_OGG="yes"
+
+fi
+
+
+ if test $HAVE_OGG = no
+ then
+
+# Check whether --with-ogg was given.
+if test "${with_ogg+set}" = set; then :
+ withval=$with_ogg; ogg_prefix="$withval"
+else
+ ogg_prefix=""
+fi
+
+
+# Check whether --with-ogg-libraries was given.
+if test "${with_ogg_libraries+set}" = set; then :
+ withval=$with_ogg_libraries; ogg_libraries="$withval"
+else
+ ogg_libraries=""
+fi
+
+
+# Check whether --with-ogg-includes was given.
+if test "${with_ogg_includes+set}" = set; then :
+ withval=$with_ogg_includes; ogg_includes="$withval"
+else
+ ogg_includes=""
+fi
+
+# Check whether --enable-oggtest was given.
+if test "${enable_oggtest+set}" = set; then :
+ enableval=$enable_oggtest;
+else
+ enable_oggtest=yes
+fi
+
+
+ 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
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ogg" >&5
+$as_echo_n "checking for Ogg... " >&6; }
+ 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"
+ rm -f conf.oggtest
+ 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ogg/ogg.h>
+
+int main ()
+{
+ system("touch conf.oggtest");
+ return 0;
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ no_ogg=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
+
+ if test "x$no_ogg" = "x" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_OGG="yes"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ if test -f conf.oggtest ; then
+ :
+ else
+ echo "*** Could not run Ogg test program, checking why..."
+ CFLAGS="$CFLAGS $OGG_CFLAGS"
+ LIBS="$LIBS $OGG_LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <ogg/ogg.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 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"
+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 Ogg was incorrectly installed"
+ echo "*** or that you have moved Ogg since it was installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ OGG_CFLAGS=""
+ OGG_LIBS=""
+ HAVE_OGG="no"
+ fi
+
+
+ rm -f conf.oggtest
+
+
+ GIVEN_CFLAGS=$OGG_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
+ OGG_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_OGG = xno; then
+ USE_OGG=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ogg" >&5
+$as_echo "$as_me: *** These plugins will be built: ogg" >&6;}
+ fi
+fi
+if test x$USE_OGG = xyes; then
+ :
+ if test "xogg" != "x"; then
+ GST_PLUGINS_YES="\togg\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_OGG /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ogg" >&5
+$as_echo "$as_me: *** These plugins will not be built: ogg" >&6;}
+ if test "xogg" != "x"; then
+ GST_PLUGINS_NO="\togg\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_OGG = xyes; then
+ USE_OGG_TRUE=
+ USE_OGG_FALSE='#'
+else
+ USE_OGG_TRUE='#'
+ USE_OGG_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Pango font rendering ***" >&5
+$as_echo "$as_me: *** checking feature: Pango font rendering ***" >&6;}
+if test "xpango" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: pango ***" >&5
+$as_echo "$as_me: *** for plug-ins: pango ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_PANGO" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-pango was given.
+if test "${enable_pango+set}" = set; then :
+ enableval=$enable_pango; case "${enableval}" in
+ yes) USE_PANGO=yes;;
+ no) USE_PANGO=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-pango" "$LINENO" 5 ;;
+ esac
+else
+ USE_PANGO=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_PANGO="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pango pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** pango pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " PANGO " > /dev/null; then
+ USE_PANGO="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pango not ported" >&5
+$as_echo "$as_me: WARNING: *** pango not ported" >&2;}
+fi
+
+
+if test x$USE_PANGO = 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_PANGO=no
+
+
+ which="pango >= 1.16.0 pangocairo >= 1.16.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PANGO" >&5
+$as_echo_n "checking for PANGO... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$PANGO_CFLAGS"; then
+ pkg_cv_PANGO_CFLAGS="$PANGO_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_PANGO_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 "$PANGO_LIBS"; then
+ pkg_cv_PANGO_LIBS="$PANGO_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_PANGO_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
+ PANGO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ PANGO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$PANGO_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_PANGO="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$PANGO_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $PANGO_PKG_ERRORS" >&5
+$as_echo "$as_me: $PANGO_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_PANGO="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$PANGO_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $PANGO_PKG_ERRORS" >&5
+$as_echo "$as_me: $PANGO_PKG_ERRORS" >&6;}
+ fi
+
+else
+ PANGO_CFLAGS=$pkg_cv_PANGO_CFLAGS
+ PANGO_LIBS=$pkg_cv_PANGO_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_PANGO="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_PANGO = xno; then
+ USE_PANGO=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: pango" >&5
+$as_echo "$as_me: *** These plugins will be built: pango" >&6;}
+ fi
+fi
+if test x$USE_PANGO = xyes; then
+ :
+ if test "xpango" != "x"; then
+ GST_PLUGINS_YES="\tpango\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_PANGO /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: pango" >&5
+$as_echo "$as_me: *** These plugins will not be built: pango" >&6;}
+ if test "xpango" != "x"; then
+ GST_PLUGINS_NO="\tpango\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_PANGO = xyes; then
+ USE_PANGO_TRUE=
+ USE_PANGO_FALSE='#'
+else
+ USE_PANGO_TRUE='#'
+ USE_PANGO_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Xiph Theora video codec ***" >&5
+$as_echo "$as_me: *** checking feature: Xiph Theora video codec ***" >&6;}
+if test "xtheora" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: theora ***" >&5
+$as_echo "$as_me: *** for plug-ins: theora ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_THEORA" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-theora was given.
+if test "${enable_theora+set}" = set; then :
+ enableval=$enable_theora; case "${enableval}" in
+ yes) USE_THEORA=yes;;
+ no) USE_THEORA=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-theora" "$LINENO" 5 ;;
+ esac
+else
+ USE_THEORA=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_THEORA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** theora pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** theora pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " THEORA " > /dev/null; then
+ USE_THEORA="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** theora not ported" >&5
+$as_echo "$as_me: WARNING: *** theora not ported" >&2;}
+fi
+
+
+if test x$USE_THEORA = 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_THEORA=no
+
+
+ which="theoradec >= 1.1 theoraenc >= 1.1"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for THEORA" >&5
+$as_echo_n "checking for THEORA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$THEORA_CFLAGS"; then
+ pkg_cv_THEORA_CFLAGS="$THEORA_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_THEORA_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 "$THEORA_LIBS"; then
+ pkg_cv_THEORA_LIBS="$THEORA_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_THEORA_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
+ THEORA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ THEORA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$THEORA_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_THEORA="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$THEORA_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $THEORA_PKG_ERRORS" >&5
+$as_echo "$as_me: $THEORA_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_THEORA="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$THEORA_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $THEORA_PKG_ERRORS" >&5
+$as_echo "$as_me: $THEORA_PKG_ERRORS" >&6;}
+ fi
+
+else
+ THEORA_CFLAGS=$pkg_cv_THEORA_CFLAGS
+ THEORA_LIBS=$pkg_cv_THEORA_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_THEORA="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_THEORA = xno; then
+ USE_THEORA=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: theora" >&5
+$as_echo "$as_me: *** These plugins will be built: theora" >&6;}
+ fi
+fi
+if test x$USE_THEORA = xyes; then
+ :
+ if test "xtheora" != "x"; then
+ GST_PLUGINS_YES="\ttheora\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_THEORA /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: theora" >&5
+$as_echo "$as_me: *** These plugins will not be built: theora" >&6;}
+ if test "xtheora" != "x"; then
+ GST_PLUGINS_NO="\ttheora\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_THEORA = xyes; then
+ USE_THEORA_TRUE=
+ USE_THEORA_FALSE='#'
+else
+ USE_THEORA_TRUE='#'
+ USE_THEORA_FALSE=
+fi
+
+
+
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Xiph Vorbis audio codec ***" >&5
+$as_echo "$as_me: *** checking feature: Xiph Vorbis audio codec ***" >&6;}
+if test "xvorbis" != "x"
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vorbis ***" >&5
+$as_echo "$as_me: *** for plug-ins: vorbis ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_VORBIS" = "xno"; then
+ NOUSE="yes"
+fi
+# Check whether --enable-vorbis was given.
+if test "${enable_vorbis+set}" = set; then :
+ enableval=$enable_vorbis; case "${enableval}" in
+ yes) USE_VORBIS=yes;;
+ no) USE_VORBIS=no;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-vorbis" "$LINENO" 5 ;;
+ esac
+else
+ USE_VORBIS=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+ USE_VORBIS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vorbis pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** vorbis pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VORBIS " > /dev/null; then
+ USE_VORBIS="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vorbis not ported" >&5
+$as_echo "$as_me: WARNING: *** vorbis not ported" >&2;}
+fi
+
+
+if test x$USE_VORBIS = 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_VORBIS=no
+
+
+ which="vorbis >= 1.0 vorbisenc >= 1.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VORBIS" >&5
+$as_echo_n "checking for VORBIS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$VORBIS_CFLAGS"; then
+ pkg_cv_VORBIS_CFLAGS="$VORBIS_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_VORBIS_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 "$VORBIS_LIBS"; then
+ pkg_cv_VORBIS_LIBS="$VORBIS_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_VORBIS_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
+ VORBIS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ VORBIS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$VORBIS_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_VORBIS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$VORBIS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $VORBIS_PKG_ERRORS" >&5
+$as_echo "$as_me: $VORBIS_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_VORBIS="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$VORBIS_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $VORBIS_PKG_ERRORS" >&5
+$as_echo "$as_me: $VORBIS_PKG_ERRORS" >&6;}
+ fi
+
+else
+ VORBIS_CFLAGS=$pkg_cv_VORBIS_CFLAGS
+ VORBIS_LIBS=$pkg_cv_VORBIS_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_VORBIS="yes"
+
+fi
+
+
+ if test $HAVE_VORBIS = no
+ then
+
+# Check whether --with-vorbis was given.
+if test "${with_vorbis+set}" = set; then :
+ withval=$with_vorbis; vorbis_prefix="$withval"
+else
+ vorbis_prefix=""
+fi
+
+
+# Check whether --with-vorbis-libraries was given.
+if test "${with_vorbis_libraries+set}" = set; then :
+ withval=$with_vorbis_libraries; vorbis_libraries="$withval"
+else
+ vorbis_libraries=""
+fi
+
+
+# Check whether --with-vorbis-includes was given.
+if test "${with_vorbis_includes+set}" = set; then :
+ withval=$with_vorbis_includes; vorbis_includes="$withval"
+else
+ vorbis_includes=""
+fi
+
+# Check whether --enable-vorbistest was given.
+if test "${enable_vorbistest+set}" = set; then :
+ enableval=$enable_vorbistest;
+else
+ enable_vorbistest=yes
+fi
+
+
+ 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
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Vorbis" >&5
+$as_echo_n "checking for Vorbis... " >&6; }
+ 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"
+ rm -f conf.vorbistest
+ 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vorbis/codec.h>
+#include <vorbis/vorbisenc.h>
+
+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
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ no_vorbis=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
+
+ if test "x$no_vorbis" = "x" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_VORBIS="yes"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ 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"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <vorbis/codec.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 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"
+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 Vorbis was incorrectly installed"
+ echo "*** or that you have moved Vorbis since it was installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ VORBIS_CFLAGS=""
+ VORBIS_LIBS=""
+ VORBISFILE_LIBS=""
+ VORBISENC_LIBS=""
+ HAVE_VORBIS="no"
+ fi
+
+
+
+
+ rm -f conf.vorbistest
+
+
+ GIVEN_CFLAGS=$VORBIS_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
+ VORBIS_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_VORBIS = xno; then
+ USE_VORBIS=no
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vorbis" >&5
+$as_echo "$as_me: *** These plugins will be built: vorbis" >&6;}
+ fi
+fi
+if test x$USE_VORBIS = xyes; then
+ :
+ if test "xvorbis" != "x"; then
+ GST_PLUGINS_YES="\tvorbis\n$GST_PLUGINS_YES"
+ fi
+
+$as_echo "#define HAVE_VORBIS /**/" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vorbis" >&5
+$as_echo "$as_me: *** These plugins will not be built: vorbis" >&6;}
+ if test "xvorbis" != "x"; then
+ GST_PLUGINS_NO="\tvorbis\n$GST_PLUGINS_NO"
+ fi
+ :
+fi
+ if test x$USE_VORBIS = xyes; then
+ USE_VORBIS_TRUE=
+ USE_VORBIS_FALSE='#'
+else
+ USE_VORBIS_TRUE='#'
+ USE_VORBIS_FALSE=
+fi
+
+
+
+if test "x$HAVE_VORBIS" = "xyes"; then
+ ac_cflags_save="$CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <vorbis/codec.h>
+
+int
+main ()
+{
+
+vorbis_dsp_state *v;
+
+vorbis_synthesis_restart (v);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ HAVE_VSR=yes
+else
+ HAVE_VSR=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test "x$HAVE_VSR" = "xyes"; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_VORBIS_SYNTHESIS_RESTART 1
+_ACEOF
+
+ fi
+ CFLAGS="$ac_cflags_save"
+fi
+
+else
+
+ if false; then
+ USE_ALSA_TRUE=
+ USE_ALSA_FALSE='#'
+else
+ USE_ALSA_TRUE='#'
+ USE_ALSA_FALSE=
+fi
+
+ if false; then
+ USE_CDPARANOIA_TRUE=
+ USE_CDPARANOIA_FALSE='#'
+else
+ USE_CDPARANOIA_TRUE='#'
+ USE_CDPARANOIA_FALSE=
+fi
+
+ if false; then
+ USE_GIO_TRUE=
+ USE_GIO_FALSE='#'
+else
+ USE_GIO_TRUE='#'
+ USE_GIO_FALSE=
+fi
+
+ if false; then
+ USE_IVORBIS_TRUE=
+ USE_IVORBIS_FALSE='#'
+else
+ USE_IVORBIS_TRUE='#'
+ USE_IVORBIS_FALSE=
+fi
+
+ if false; then
+ USE_LIBVISUAL_TRUE=
+ USE_LIBVISUAL_FALSE='#'
+else
+ USE_LIBVISUAL_TRUE='#'
+ USE_LIBVISUAL_FALSE=
+fi
+
+ if false; then
+ USE_OGG_TRUE=
+ USE_OGG_FALSE='#'
+else
+ USE_OGG_TRUE='#'
+ USE_OGG_FALSE=
+fi
+
+ if false; then
+ USE_PANGO_TRUE=
+ USE_PANGO_FALSE='#'
+else
+ USE_PANGO_TRUE='#'
+ USE_PANGO_FALSE=
+fi
+
+ if false; then
+ USE_THEORA_TRUE=
+ USE_THEORA_FALSE='#'
+else
+ USE_THEORA_TRUE='#'
+ USE_THEORA_FALSE=
+fi
+
+ if false; then
+ USE_VORBIS_TRUE=
+ USE_VORBIS_FALSE='#'
+else
+ USE_VORBIS_TRUE='#'
+ USE_VORBIS_FALSE=
+fi
+
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT2" >&5
+$as_echo_n "checking for FT2... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$FT2_CFLAGS"; then
+ pkg_cv_FT2_CFLAGS="$FT2_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 2.0.9\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "freetype2 >= 2.0.9") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_FT2_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= 2.0.9" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$FT2_LIBS"; then
+ pkg_cv_FT2_LIBS="$FT2_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 2.0.9\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "freetype2 >= 2.0.9") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_FT2_LIBS=`$PKG_CONFIG --libs "freetype2 >= 2.0.9" 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
+ FT2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "freetype2 >= 2.0.9"`
+ else
+ FT2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "freetype2 >= 2.0.9"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$FT2_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+# Check whether --with-ft-prefix was given.
+if test "${with_ft_prefix+set}" = set; then :
+ withval=$with_ft_prefix; ft_config_prefix="$withval"
+else
+ ft_config_prefix=""
+fi
+
+
+# Check whether --with-ft-exec-prefix was given.
+if test "${with_ft_exec_prefix+set}" = set; then :
+ withval=$with_ft_exec_prefix; ft_config_exec_prefix="$withval"
+else
+ ft_config_exec_prefix=""
+fi
+
+# Check whether --enable-freetypetest was given.
+if test "${enable_freetypetest+set}" = set; then :
+ enableval=$enable_freetypetest;
+else
+ enable_fttest=yes
+fi
+
+
+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
+# Extract the first word of "freetype-config", so it can be a program name with args.
+set dummy freetype-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 test "${ac_cv_path_FT2_CONFIG+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $FT2_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_FT2_CONFIG="$FT2_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_FT2_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_FT2_CONFIG" && ac_cv_path_FT2_CONFIG="no"
+ ;;
+esac
+fi
+FT2_CONFIG=$ac_cv_path_FT2_CONFIG
+if test -n "$FT2_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FT2_CONFIG" >&5
+$as_echo "$FT2_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+min_ft_version=2.0.9
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FreeType - version >= $min_ft_version" >&5
+$as_echo_n "checking for FreeType - version >= $min_ft_version... " >&6; }
+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"
+ 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 <ft2build.h>
+#include FT_FREETYPE_H
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ FT_Library library;
+ FT_Error error;
+
+ error = FT_Init_FreeType(&library);
+
+ if (error)
+ return 1;
+ else
+ {
+ FT_Done_FreeType(library);
+ return 0;
+ }
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ no_ft=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 # 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_FT2="yes"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ 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=""
+ HAVE_FT2="no"
+fi
+
+
+
+
+elif test $pkg_failed = untried; then
+
+
+# Check whether --with-ft-prefix was given.
+if test "${with_ft_prefix+set}" = set; then :
+ withval=$with_ft_prefix; ft_config_prefix="$withval"
+else
+ ft_config_prefix=""
+fi
+
+
+# Check whether --with-ft-exec-prefix was given.
+if test "${with_ft_exec_prefix+set}" = set; then :
+ withval=$with_ft_exec_prefix; ft_config_exec_prefix="$withval"
+else
+ ft_config_exec_prefix=""
+fi
+
+# Check whether --enable-freetypetest was given.
+if test "${enable_freetypetest+set}" = set; then :
+ enableval=$enable_freetypetest;
+else
+ enable_fttest=yes
+fi
+
+
+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
+# Extract the first word of "freetype-config", so it can be a program name with args.
+set dummy freetype-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 test "${ac_cv_path_FT2_CONFIG+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $FT2_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_FT2_CONFIG="$FT2_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_FT2_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_FT2_CONFIG" && ac_cv_path_FT2_CONFIG="no"
+ ;;
+esac
+fi
+FT2_CONFIG=$ac_cv_path_FT2_CONFIG
+if test -n "$FT2_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FT2_CONFIG" >&5
+$as_echo "$FT2_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+min_ft_version=2.0.9
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FreeType - version >= $min_ft_version" >&5
+$as_echo_n "checking for FreeType - version >= $min_ft_version... " >&6; }
+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"
+ 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 <ft2build.h>
+#include FT_FREETYPE_H
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ FT_Library library;
+ FT_Error error;
+
+ error = FT_Init_FreeType(&library);
+
+ if (error)
+ return 1;
+ else
+ {
+ FT_Done_FreeType(library);
+ return 0;
+ }
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ no_ft=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 # 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_FT2="yes"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ 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=""
+ HAVE_FT2="no"
+fi
+
+
+
+
+else
+ FT2_CFLAGS=$pkg_cv_FT2_CFLAGS
+ FT2_LIBS=$pkg_cv_FT2_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_FT2="yes"
+fi
+ if test "x$HAVE_FT2" = "xyes"; then
+ HAVE_FT2_TRUE=
+ HAVE_FT2_FALSE='#'
+else
+ HAVE_FT2_TRUE='#'
+ HAVE_FT2_FALSE=
+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_PLUGINS_BASE_CFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs"
+
+
+GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_CXXFLAGS="$GLIB_CFLAGS $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)"
+GST_CFLAGS="$GLIB_CFLAGS $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)"
+
+
+GST_LIBS="$GST_LIBS \$(GCOV_LIBS)"
+
+
+GST_ALL_LDFLAGS="-no-undefined"
+if test "x${enable_Bsymbolic}" = "xyes"; then
+ GST_ALL_LDFLAGS="$GST_ALL_LDFLAGS -Wl,-Bsymbolic-functions"
+fi
+
+
+GST_LIB_LDFLAGS="-export-symbols-regex ^_?\(gst_\|Gst\|GST_\).*"
+
+
+GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^_*gst_plugin_desc.*' $GST_ALL_LDFLAGS"
+
+
+
+ac_config_files="$ac_config_files Makefile gst-plugins-base.spec gst/Makefile gst/adder/Makefile gst/app/Makefile gst/audioconvert/Makefile gst/audiorate/Makefile gst/audiotestsrc/Makefile gst/encoding/Makefile gst/videoconvert/Makefile gst/gdp/Makefile gst/playback/Makefile gst/audioresample/Makefile gst/subparse/Makefile gst/tcp/Makefile gst/typefind/Makefile gst/videotestsrc/Makefile gst/videorate/Makefile gst/videoscale/Makefile gst/volume/Makefile sys/Makefile sys/ximage/Makefile sys/xvimage/Makefile ext/Makefile ext/alsa/Makefile ext/cdparanoia/Makefile ext/gio/Makefile ext/libvisual/Makefile ext/ogg/Makefile ext/pango/Makefile ext/theora/Makefile ext/vorbis/Makefile gst-libs/Makefile gst-libs/gst/Makefile gst-libs/gst/audio/Makefile gst-libs/gst/app/Makefile gst-libs/gst/cdda/Makefile gst-libs/gst/fft/Makefile gst-libs/gst/interfaces/Makefile gst-libs/gst/netbuffer/Makefile gst-libs/gst/riff/Makefile gst-libs/gst/rtp/Makefile gst-libs/gst/rtsp/Makefile gst-libs/gst/sdp/Makefile gst-libs/gst/tag/Makefile gst-libs/gst/pbutils/Makefile gst-libs/gst/pbutils/gstpluginsbaseversion.h gst-libs/gst/video/Makefile tools/Makefile pkgconfig/Makefile pkgconfig/gstreamer-audio.pc pkgconfig/gstreamer-audio-uninstalled.pc pkgconfig/gstreamer-app.pc pkgconfig/gstreamer-app-uninstalled.pc pkgconfig/gstreamer-cdda.pc pkgconfig/gstreamer-cdda-uninstalled.pc pkgconfig/gstreamer-fft.pc pkgconfig/gstreamer-fft-uninstalled.pc pkgconfig/gstreamer-interfaces.pc pkgconfig/gstreamer-interfaces-uninstalled.pc pkgconfig/gstreamer-netbuffer.pc pkgconfig/gstreamer-netbuffer-uninstalled.pc pkgconfig/gstreamer-pbutils.pc pkgconfig/gstreamer-pbutils-uninstalled.pc pkgconfig/gstreamer-riff.pc pkgconfig/gstreamer-riff-uninstalled.pc pkgconfig/gstreamer-rtp.pc pkgconfig/gstreamer-rtp-uninstalled.pc pkgconfig/gstreamer-rtsp.pc pkgconfig/gstreamer-rtsp-uninstalled.pc pkgconfig/gstreamer-sdp.pc pkgconfig/gstreamer-sdp-uninstalled.pc pkgconfig/gstreamer-tag.pc pkgconfig/gstreamer-tag-uninstalled.pc pkgconfig/gstreamer-video.pc pkgconfig/gstreamer-video-uninstalled.pc pkgconfig/gstreamer-plugins-base.pc pkgconfig/gstreamer-plugins-base-uninstalled.pc tests/Makefile tests/check/Makefile tests/examples/Makefile tests/examples/app/Makefile tests/examples/audio/Makefile tests/examples/dynamic/Makefile tests/examples/encoding/Makefile tests/examples/gio/Makefile tests/examples/overlay/Makefile tests/examples/seek/Makefile tests/examples/snapshot/Makefile tests/examples/playrec/Makefile tests/examples/volume/Makefile tests/files/Makefile tests/icles/Makefile tests/icles/playback/Makefile docs/Makefile docs/design/Makefile docs/libs/Makefile docs/plugins/Makefile docs/version.entities po/Makefile.in common/Makefile common/m4/Makefile m4/Makefile"
+
+
+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"/' \
+ -e 's/.* GST_INSTALL_PLUGINS_HELPER/#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_ISO_CODES$/#undef HAVE_ISO_CODES/' \
+ -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/.* ISO_CODES_PREFIX$/#undef ISO_CODES_PREFIX/' \
+ -e 's/.* ISO_CODES_VERSION$/#undef ISO_CODES_VERSION/' \
+ -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.11"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.11"\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_VIDEOSINK$/#define DEFAULT_VIDEOSINK \"directdrawsink\"/" \
+ -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
+ test "x$cache_file" != "x/dev/null" &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ 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__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 "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CXX\" 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 "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_INTROSPECTION\" 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_LIBXML_HTML_TRUE}" && test -z "${HAVE_LIBXML_HTML_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_LIBXML_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SYS_SOCKET_H_TRUE}" && test -z "${HAVE_SYS_SOCKET_H_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_SYS_SOCKET_H\" 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 "${HAVE_QT_TRUE}" && test -z "${HAVE_QT_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_QT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_QT_GV_TRUE}" && test -z "${HAVE_QT_GV_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_QT_GV\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_LINUX_JOYSTICK_HEADERS_TRUE}" && test -z "${HAVE_LINUX_JOYSTICK_HEADERS_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_LINUX_JOYSTICK_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_ADDER_TRUE}" && test -z "${USE_PLUGIN_ADDER_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_ADDER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_APP_TRUE}" && test -z "${USE_PLUGIN_APP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_APP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_AUDIOCONVERT_TRUE}" && test -z "${USE_PLUGIN_AUDIOCONVERT_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_AUDIOCONVERT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_AUDIORATE_TRUE}" && test -z "${USE_PLUGIN_AUDIORATE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_AUDIORATE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_AUDIOTESTSRC_TRUE}" && test -z "${USE_PLUGIN_AUDIOTESTSRC_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_AUDIOTESTSRC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_ENCODING_TRUE}" && test -z "${USE_PLUGIN_ENCODING_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_ENCODING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_VIDEOCONVERT_TRUE}" && test -z "${USE_PLUGIN_VIDEOCONVERT_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_VIDEOCONVERT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_GDP_TRUE}" && test -z "${USE_PLUGIN_GDP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_GDP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_PLAYBACK_TRUE}" && test -z "${USE_PLUGIN_PLAYBACK_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_PLAYBACK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_AUDIORESAMPLE_TRUE}" && test -z "${USE_PLUGIN_AUDIORESAMPLE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_AUDIORESAMPLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_SUBPARSE_TRUE}" && test -z "${USE_PLUGIN_SUBPARSE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_SUBPARSE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_TCP_TRUE}" && test -z "${USE_PLUGIN_TCP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_TCP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_TYPEFIND_TRUE}" && test -z "${USE_PLUGIN_TYPEFIND_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_TYPEFIND\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_VIDEOTESTSRC_TRUE}" && test -z "${USE_PLUGIN_VIDEOTESTSRC_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_VIDEOTESTSRC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_VIDEORATE_TRUE}" && test -z "${USE_PLUGIN_VIDEORATE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_VIDEORATE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_VIDEOSCALE_TRUE}" && test -z "${USE_PLUGIN_VIDEOSCALE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_VIDEOSCALE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_VOLUME_TRUE}" && test -z "${USE_PLUGIN_VOLUME_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_VOLUME\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then
+ as_fn_error $? "conditional \"USE_XML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_SUBPARSE_TRUE}" && test -z "${USE_PLUGIN_SUBPARSE_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_SUBPARSE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PLUGIN_TCP_TRUE}" && test -z "${USE_PLUGIN_TCP_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PLUGIN_TCP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_ISO_CODES_TRUE}" && test -z "${USE_ISO_CODES_FALSE}"; then
+ as_fn_error $? "conditional \"USE_ISO_CODES\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_ISO_CODES_TRUE}" && test -z "${USE_ISO_CODES_FALSE}"; then
+ as_fn_error $? "conditional \"USE_ISO_CODES\" 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_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_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_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_ALSA_TRUE}" && test -z "${USE_ALSA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_ALSA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_CDPARANOIA_TRUE}" && test -z "${USE_CDPARANOIA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_CDPARANOIA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_IVORBIS_TRUE}" && test -z "${USE_IVORBIS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_IVORBIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GIO_TRUE}" && test -z "${USE_GIO_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GIO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBVISUAL_TRUE}" && test -z "${USE_LIBVISUAL_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBVISUAL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_OGG_TRUE}" && test -z "${USE_OGG_FALSE}"; then
+ as_fn_error $? "conditional \"USE_OGG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PANGO_TRUE}" && test -z "${USE_PANGO_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PANGO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_THEORA_TRUE}" && test -z "${USE_THEORA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_THEORA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_VORBIS_TRUE}" && test -z "${USE_VORBIS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_VORBIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_ALSA_TRUE}" && test -z "${USE_ALSA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_ALSA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_CDPARANOIA_TRUE}" && test -z "${USE_CDPARANOIA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_CDPARANOIA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GIO_TRUE}" && test -z "${USE_GIO_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GIO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_IVORBIS_TRUE}" && test -z "${USE_IVORBIS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_IVORBIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBVISUAL_TRUE}" && test -z "${USE_LIBVISUAL_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBVISUAL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_OGG_TRUE}" && test -z "${USE_OGG_FALSE}"; then
+ as_fn_error $? "conditional \"USE_OGG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PANGO_TRUE}" && test -z "${USE_PANGO_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PANGO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_THEORA_TRUE}" && test -z "${USE_THEORA_FALSE}"; then
+ as_fn_error $? "conditional \"USE_THEORA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_VORBIS_TRUE}" && test -z "${USE_VORBIS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_VORBIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_FT2_TRUE}" && test -z "${HAVE_FT2_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_FT2\" 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.
+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 Base Plug-ins $as_me 0.11.1, which was
+generated by GNU Autoconf 2.67. 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 <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>."
+
+_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 Base Plug-ins config.status 0.11.1
+configured by $0, generated by GNU Autoconf 2.67,
+ 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 "X$AS" | $Xsed -e "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
+macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
+enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
+host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
+host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
+host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
+build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
+build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
+build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
+SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
+Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
+GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
+EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
+FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
+LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
+NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
+LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
+exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
+AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
+GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
+SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
+ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
+need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
+LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
+libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
+version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
+striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+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 \
+SHELL \
+ECHO \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+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_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_pic_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_flag_spec_ld_CXX \
+hardcode_libdir_separator_CXX \
+fix_srcfile_path_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 "X\\\\\$\$var"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+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; do
+ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
+ ;;
+esac
+
+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-plugins-base.spec") CONFIG_FILES="$CONFIG_FILES gst-plugins-base.spec" ;;
+ "gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst/Makefile" ;;
+ "gst/adder/Makefile") CONFIG_FILES="$CONFIG_FILES gst/adder/Makefile" ;;
+ "gst/app/Makefile") CONFIG_FILES="$CONFIG_FILES gst/app/Makefile" ;;
+ "gst/audioconvert/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audioconvert/Makefile" ;;
+ "gst/audiorate/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiorate/Makefile" ;;
+ "gst/audiotestsrc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiotestsrc/Makefile" ;;
+ "gst/encoding/Makefile") CONFIG_FILES="$CONFIG_FILES gst/encoding/Makefile" ;;
+ "gst/videoconvert/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoconvert/Makefile" ;;
+ "gst/gdp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/gdp/Makefile" ;;
+ "gst/playback/Makefile") CONFIG_FILES="$CONFIG_FILES gst/playback/Makefile" ;;
+ "gst/audioresample/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audioresample/Makefile" ;;
+ "gst/subparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/subparse/Makefile" ;;
+ "gst/tcp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/tcp/Makefile" ;;
+ "gst/typefind/Makefile") CONFIG_FILES="$CONFIG_FILES gst/typefind/Makefile" ;;
+ "gst/videotestsrc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videotestsrc/Makefile" ;;
+ "gst/videorate/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videorate/Makefile" ;;
+ "gst/videoscale/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoscale/Makefile" ;;
+ "gst/volume/Makefile") CONFIG_FILES="$CONFIG_FILES gst/volume/Makefile" ;;
+ "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;;
+ "sys/ximage/Makefile") CONFIG_FILES="$CONFIG_FILES sys/ximage/Makefile" ;;
+ "sys/xvimage/Makefile") CONFIG_FILES="$CONFIG_FILES sys/xvimage/Makefile" ;;
+ "ext/Makefile") CONFIG_FILES="$CONFIG_FILES ext/Makefile" ;;
+ "ext/alsa/Makefile") CONFIG_FILES="$CONFIG_FILES ext/alsa/Makefile" ;;
+ "ext/cdparanoia/Makefile") CONFIG_FILES="$CONFIG_FILES ext/cdparanoia/Makefile" ;;
+ "ext/gio/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gio/Makefile" ;;
+ "ext/libvisual/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libvisual/Makefile" ;;
+ "ext/ogg/Makefile") CONFIG_FILES="$CONFIG_FILES ext/ogg/Makefile" ;;
+ "ext/pango/Makefile") CONFIG_FILES="$CONFIG_FILES ext/pango/Makefile" ;;
+ "ext/theora/Makefile") CONFIG_FILES="$CONFIG_FILES ext/theora/Makefile" ;;
+ "ext/vorbis/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vorbis/Makefile" ;;
+ "gst-libs/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/Makefile" ;;
+ "gst-libs/gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/Makefile" ;;
+ "gst-libs/gst/audio/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/audio/Makefile" ;;
+ "gst-libs/gst/app/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/app/Makefile" ;;
+ "gst-libs/gst/cdda/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/cdda/Makefile" ;;
+ "gst-libs/gst/fft/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/fft/Makefile" ;;
+ "gst-libs/gst/interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/interfaces/Makefile" ;;
+ "gst-libs/gst/netbuffer/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/netbuffer/Makefile" ;;
+ "gst-libs/gst/riff/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/riff/Makefile" ;;
+ "gst-libs/gst/rtp/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/rtp/Makefile" ;;
+ "gst-libs/gst/rtsp/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/rtsp/Makefile" ;;
+ "gst-libs/gst/sdp/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/sdp/Makefile" ;;
+ "gst-libs/gst/tag/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/tag/Makefile" ;;
+ "gst-libs/gst/pbutils/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/pbutils/Makefile" ;;
+ "gst-libs/gst/pbutils/gstpluginsbaseversion.h") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/pbutils/gstpluginsbaseversion.h" ;;
+ "gst-libs/gst/video/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/video/Makefile" ;;
+ "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+ "pkgconfig/Makefile") CONFIG_FILES="$CONFIG_FILES pkgconfig/Makefile" ;;
+ "pkgconfig/gstreamer-audio.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-audio.pc" ;;
+ "pkgconfig/gstreamer-audio-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-audio-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-app.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-app.pc" ;;
+ "pkgconfig/gstreamer-app-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-app-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-cdda.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-cdda.pc" ;;
+ "pkgconfig/gstreamer-cdda-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-cdda-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-fft.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-fft.pc" ;;
+ "pkgconfig/gstreamer-fft-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-fft-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-interfaces.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-interfaces.pc" ;;
+ "pkgconfig/gstreamer-interfaces-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-interfaces-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-netbuffer.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-netbuffer.pc" ;;
+ "pkgconfig/gstreamer-netbuffer-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-netbuffer-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-pbutils.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-pbutils.pc" ;;
+ "pkgconfig/gstreamer-pbutils-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-pbutils-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-riff.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-riff.pc" ;;
+ "pkgconfig/gstreamer-riff-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-riff-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-rtp.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-rtp.pc" ;;
+ "pkgconfig/gstreamer-rtp-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-rtp-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-rtsp.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-rtsp.pc" ;;
+ "pkgconfig/gstreamer-rtsp-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-rtsp-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-sdp.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-sdp.pc" ;;
+ "pkgconfig/gstreamer-sdp-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-sdp-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-tag.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-tag.pc" ;;
+ "pkgconfig/gstreamer-tag-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-tag-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-video.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-video.pc" ;;
+ "pkgconfig/gstreamer-video-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-video-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-plugins-base.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-base.pc" ;;
+ "pkgconfig/gstreamer-plugins-base-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-base-uninstalled.pc" ;;
+ "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/app/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/app/Makefile" ;;
+ "tests/examples/audio/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/audio/Makefile" ;;
+ "tests/examples/dynamic/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/dynamic/Makefile" ;;
+ "tests/examples/encoding/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/encoding/Makefile" ;;
+ "tests/examples/gio/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gio/Makefile" ;;
+ "tests/examples/overlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/overlay/Makefile" ;;
+ "tests/examples/seek/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/seek/Makefile" ;;
+ "tests/examples/snapshot/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/snapshot/Makefile" ;;
+ "tests/examples/playrec/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/playrec/Makefile" ;;
+ "tests/examples/volume/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/volume/Makefile" ;;
+ "tests/files/Makefile") CONFIG_FILES="$CONFIG_FILES tests/files/Makefile" ;;
+ "tests/icles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/Makefile" ;;
+ "tests/icles/playback/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/playback/Makefile" ;;
+ "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+ "docs/design/Makefile") CONFIG_FILES="$CONFIG_FILES docs/design/Makefile" ;;
+ "docs/libs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libs/Makefile" ;;
+ "docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;;
+ "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "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" ;;
+
+ *) 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=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+
+# 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 2>/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 {' >"$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 >>"\$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
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$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 < "$tmp/subs1.awk" > "$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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_t"; 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
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$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="$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 >"$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 "$tmp/subs.awk" >$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' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$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 "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$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 "$tmp/defines.awk"' "$ac_file_inputs"
+ } >"$tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$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 "$tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$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 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=$AS
+
+# DLL creation program.
+DLLTOOL=$DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$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
+
+# 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
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# 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
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# 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
+
+# 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
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that does not interpret backslashes.
+ECHO=$lt_ECHO
+
+# 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
+
+# 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
+
+# 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
+
+# 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
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# 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
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking. This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# 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
+
+# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ case $xsi_shell in
+ yes)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# 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 ()
+{
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+}
+
+# func_basename file
+func_basename ()
+{
+ func_basename_result="${1##*/}"
+}
+
+# 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 ()
+{
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+ func_basename_result="${1##*/}"
+}
+
+# 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_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}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+ func_opt_split_opt=${1%%=*}
+ func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+ case ${1} in
+ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+ *) func_lo2o_result=${1} ;;
+ esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=${#1}
+}
+
+_LT_EOF
+ ;;
+ *) # Bourne compatible functions.
+ cat << \_LT_EOF >> "$cfgfile"
+
+# 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 ()
+{
+ # Extract subdirectory from the argument.
+ func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file
+func_basename ()
+{
+ func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+
+# 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 "X${3}" \
+ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "X${3}" \
+ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+ esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+ func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+ func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+ func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=`expr "$@"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+ yes)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "$1+=\$2"
+}
+_LT_EOF
+ ;;
+ *)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "$1=\$$1\$2"
+}
+
+_LT_EOF
+ ;;
+ esac
+
+
+ sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ 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
+
+# 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
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_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
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking. This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path_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
+
+# 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 <stdint.h>" >>$ac_stdint
+echo "#endif" >>$ac_stdint
+echo "#endif" >>$ac_stdint
+else
+
+cat >>$ac_stdint <<STDINT_EOF
+
+/* ................... shortcircuit part ........................... */
+
+#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
+#include <stdint.h>
+#else
+#include <stddef.h>
+
+/* .................... 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 <<STDINT_EOF
+/* .................... detections part ............................ */
+
+/* whether we need to define bitspecific types from compiler base types */
+#ifndef _STDINT_HEADER_INTPTR
+#ifndef _STDINT_HEADER_UINT32
+#ifndef _STDINT_HEADER_U_INT32
+#define _STDINT_NEED_INT_MODEL_T
+#else
+#define _STDINT_HAVE_U_INT_TYPES
+#endif
+#endif
+#endif
+
+#ifdef _STDINT_HAVE_U_INT_TYPES
+#undef _STDINT_NEED_INT_MODEL_T
+#endif
+
+#ifdef _STDINT_CHAR_MODEL
+#if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
+#ifndef _STDINT_BYTE_MODEL
+#define _STDINT_BYTE_MODEL 12
+#endif
+#endif
+#endif
+
+#ifndef _STDINT_HAVE_INT_LEAST32_T
+#define _STDINT_NEED_INT_LEAST_T
+#endif
+
+#ifndef _STDINT_HAVE_INT_FAST32_T
+#define _STDINT_NEED_INT_FAST_T
+#endif
+
+#ifndef _STDINT_HEADER_INTPTR
+#define _STDINT_NEED_INTPTR_T
+#ifndef _STDINT_HAVE_INTMAX_T
+#define _STDINT_NEED_INTMAX_T
+#endif
+#endif
+
+
+/* .................... definition part ............................ */
+
+/* some system headers have good uint64_t */
+#ifndef _HAVE_UINT64_T
+#if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T
+#define _HAVE_UINT64_T
+#elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
+#define _HAVE_UINT64_T
+typedef u_int64_t uint64_t;
+#endif
+#endif
+
+#ifndef _HAVE_UINT64_T
+/* .. here are some common heuristics using compiler runtime specifics */
+#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 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"
+
+printf "configure: *** Plug-ins that have NOT been ported:\n"
+( for i in $GST_PLUGINS_NONPORTED; do
+ printf '\t'$i'\n'
+ 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..7844148
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,1021 @@
+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/prerelease
+AC_INIT(GStreamer Base Plug-ins, 0.11.1,
+ http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
+ gst-plugins-base)
+
+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/audiotestsrc/gstaudiotestsrc.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.11
+AC_SUBST(GST_MAJORMINOR)
+
+dnl CURRENT, REVISION, AGE
+dnl - library source changed -> increment REVISION
+dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0
+dnl - interfaces added -> increment AGE
+dnl - interfaces removed -> AGE = 0
+dnl sets GST_LT_LDFLAGS
+AS_LIBTOOL(GST, 26, 0, 0)
+
+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.11.1
+
+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-base-$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_PKG_CONFIG_PATH
+
+dnl let distro override plugin install helper path
+AC_ARG_WITH(install-plugins-helper,
+ AC_HELP_STRING([--with-install-plugins-helper],
+ [specify path of helper script to call to install plugins]),
+ [
+ case "${withval}" in
+ yes) AC_MSG_ERROR(bad value ${withval} for --with-install-plugins-helper) ;;
+ no) AC_MSG_ERROR(bad value ${withval} for --with-install-plugins-helper) ;;
+ *) GST_INSTALL_PLUGINS_HELPER="${withval}" ;;
+ esac
+ ],
+ [
+ dnl Default value
+ AS_AC_EXPAND(GST_INSTALL_PLUGINS_HELPER,${libexecdir}/gst-install-plugins-helper)
+ ]
+)
+AC_MSG_NOTICE(Using $GST_INSTALL_PLUGINS_HELPER as plugin install helper)
+AC_DEFINE_UNQUOTED(GST_INSTALL_PLUGINS_HELPER, "$GST_INSTALL_PLUGINS_HELPER",
+ [plugin install helper script])
+AC_SUBST(GST_INSTALL_PLUGINS_HELPER)
+
+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 check for large file support
+dnl affected plugins must include config.h
+AC_SYS_LARGEFILE
+
+dnl *** checks for programs ***
+
+dnl find a compiler
+AC_PROG_CC
+AC_PROG_CC_STDC
+
+dnl check if the compiler supports '-c' and '-o' options
+AM_PROG_CC_C_O
+
+dnl determine if c++ is available on this system
+AC_PROG_CXX
+dnl CXX may be set to some default even if no c++ compiler is available
+dnl (thanks autotools!), so just try to compile some c++ code to make sure
+AC_LANG_PUSH([C++])
+AC_TRY_COMPILE([ class Foo { int bar; };], , working_cxx=yes, working_cxx=no)
+AC_LANG_POP([C++])
+AC_MSG_NOTICE([working c++ compiler found: $working_cxx])
+AM_CONDITIONAL(HAVE_CXX, test "x$working_cxx" = "xyes")
+
+AC_PATH_PROG(VALGRIND_PATH, valgrind, no)
+AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno")
+
+dnl check for gobject-introspection
+GOBJECT_INTROSPECTION_CHECK([0.9.12])
+
+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 libm, for sin() etc.
+AC_CHECK_LIBM
+AC_SUBST(LIBM)
+
+dnl *** checks for header files ***
+
+dnl check if we have ANSI C header files
+AC_HEADER_STDC
+
+ac_cppflags_save="$CPPFLAGS"
+CPPFLAGS="`$PKG_CONFIG --cflags libxml-2.0`"
+AC_COMPILE_IFELSE(
+ AC_LANG_PROGRAM([
+#include <libxml/HTMLparser.h>
+ ],[
+#ifndef LIBXML_HTML_ENABLED
+#error libxml2 has no HTML support
+#endif /* LIBXML_HTML_ENABLED */
+ ]), HAVE_LIBXML_HTML="yes", HAVE_LIBXML_HTML="no")
+CPPFLAGS="$ac_cppflags_save"
+AM_CONDITIONAL(HAVE_LIBXML_HTML, test "x$HAVE_LIBXML_HTML" = "xyes")
+
+dnl used in gst/tcp
+AC_CHECK_HEADERS([sys/socket.h],
+ HAVE_SYS_SOCKET_H="yes", HAVE_SYS_SOCKET_H="no")
+AM_CONDITIONAL(HAVE_SYS_SOCKET_H, test "x$HAVE_SYS_SOCKET_H" = "xyes")
+
+dnl used in gst-libs/gst/rtsp
+AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes)
+if test "x$HAVE_WINSOCK2_H" = "xyes"; then
+ WIN32_LIBS="-lws2_32"
+ AC_SUBST(WIN32_LIBS)
+fi
+
+dnl check for hstrerror, for gst-libs/gst/rtsp
+save_libs="$LIBS"
+AC_CHECK_FUNC(hstrerror, ,
+ AC_CHECK_LIB(resolv, hstrerror, ,
+ [AC_DEFINE(NO_HSTRERROR, 1,
+ [Define if you have no native hstrerror() function.])]))
+HSTRERROR_LIBS=$LIBS
+AC_SUBST(HSTRERROR_LIBS)
+LIBS="$save_libs"
+
+dnl used in gst-libs/gst/pbutils and associated unit test
+AC_CHECK_HEADERS([process.h sys/types.h sys/wait.h sys/stat.h])
+
+dnl also, Windows does not have long long
+AX_CREATE_STDINT_H
+
+dnl *** checks for functions ***
+AC_CHECK_FUNCS([localtime_r gmtime_r])
+
+dnl *** checks for math functions ***
+LIBS_SAVE=$LIBS
+LIBS="$LIBS $LIBM"
+AC_CHECK_FUNCS(log2)
+LIBS=$LIBS_SAVE
+
+dnl *** checks for types/defines ***
+
+dnl Check for FIONREAD ioctl declaration
+dnl used in gst/tcp
+GST_CHECK_FIONREAD
+
+dnl *** checks for structures ***
+
+dnl *** checks for compiler characteristics ***
+
+dnl *** checks for library functions ***
+
+dnl check for fseeko()
+AC_FUNC_FSEEKO
+
+dnl Check for fast float to int casting as defined in C99
+dnl used to be used in gst-libs/gst/floatcast/floatcast.h (FIXME: still needed?)
+save_libs=$LIBS
+LIBS="$LIBS $LIBM"
+AC_C99_FUNC_LRINT
+AC_C99_FUNC_LRINTF
+LIBS=$save_libs
+
+dnl Check for a way to display the function name in debug output
+AG_GST_CHECK_FUNCTION
+
+dnl *** checks for socket and nsl libraries ***
+AC_CHECK_FUNC(socket,,[AC_CHECK_LIB(socket,socket)])
+AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)])
+
+dnl *** checks for dependency libraries ***
+
+dnl GLib is required
+AG_GST_GLIB_CHECK([2.26])
+
+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)
+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`"
+AC_SUBST(GLIB_PREFIX)
+AC_SUBST(GST_PREFIX)
+
+dnl GTK is optional and only used in examples
+HAVE_GTK=no
+HAVE_GTK_X11=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 QT is optional and only used in examples
+PKG_CHECK_MODULES(QT, QtGui >= 4.6, [
+ HAVE_QT_GV=yes
+ HAVE_QT=yes
+], [
+ HAVE_QT_GV=no
+ PKG_CHECK_MODULES(QT, QtGui >= 4.0, HAVE_QT=yes, HAVE_QT=no)
+])
+if test "x$HAVE_QT" = "xyes"; then
+ AC_MSG_CHECKING([Qt moc])
+ QT4_MOC=`$PKG_CONFIG --variable=moc_location QtGui`
+ AC_MSG_RESULT($QT4_MOC)
+ AC_SUBST(QT4_MOC)
+fi
+AM_CONDITIONAL(HAVE_QT, test "x$HAVE_QT" = "xyes")
+AM_CONDITIONAL(HAVE_QT_GV, test "x$HAVE_QT_GV" = "xyes")
+
+dnl chck for linux headers needed by the joystick seek example
+AC_COMPILE_IFELSE(
+[
+ AC_LANG_PROGRAM([
+ #include <linux/input.h>
+ #include <linux/joystick.h>
+ ],[
+ struct js_event js;
+ js.type = JS_EVENT_AXIS;
+ ])
+], [
+ HAVE_LINUX_JOYSTICK_HEADERS="yes"
+], [
+ HAVE_LINUX_JOYSTICK_HEADERS="no"
+])
+AM_CONDITIONAL(HAVE_LINUX_JOYSTICK_HEADERS, test "x$HAVE_LINUX_JOYSTICK_HEADERS" = "xyes")
+
+dnl Check for -Bsymbolic-functions linker flag used to avoid
+dnl intra-library PLT jumps, if available.
+AC_ARG_ENABLE(Bsymbolic,
+ [AC_HELP_STRING([--disable-Bsymbolic],
+ [avoid linking with -Bsymbolic])],,
+ [SAVED_LDFLAGS="${LDFLAGS}"
+ AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
+ LDFLAGS=-Wl,-Bsymbolic-functions
+ AC_TRY_LINK([], [int main (void) { return 0; }],
+ AC_MSG_RESULT(yes)
+ enable_Bsymbolic=yes,
+ AC_MSG_RESULT(no)
+ enable_Bsymbolic=no)
+ LDFLAGS="${SAVED_LDFLAGS}"])
+
+
+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-base.doap"],
+ [$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO])
+
+dnl define an ERROR_CFLAGS Makefile variable
+dnl -Wformat-nonliteral - see ext/pango/gstclockoverlay.c and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39438
+AG_GST_SET_ERROR_CFLAGS($GST_GIT, [
+ -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -Wno-multichar -Wnested-externs ])
+
+dnl define an ERROR_CXXFLAGS Makefile variable
+AG_GST_SET_ERROR_CXXFLAGS($GST_GIT, [
+ -Wmissing-declarations -Wredundant-decls -Wundef
+ -Wwrite-strings -Wformat-nonliteral -Wformat-security
+ -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
+ -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 needed for encoding-target
+GST_DATADIR="$GST_PREFIX/share"
+AC_DEFINE_UNQUOTED(GST_DATADIR, "$GST_DATADIR", [system wide data directory])
+AC_DEFINE_UNQUOTED(GST_MAJORMINOR, "$GST_MAJORMINOR", [major/minor version])
+
+dnl behaviour of speex based audio resampler
+AC_MSG_CHECKING(which audio resample format to use for integer)
+AC_ARG_WITH([audioresample_format],
+ AS_HELP_STRING([--with-audioresample-format],[Which implementation should be used for integer audio resampling, int/float/auto, (default is auto)]),
+ [ac_cv_audioresample_format=$withval], [ac_cv_audioresample_format=auto])dnl
+AC_MSG_RESULT($ac_cv_audioresample_format)
+case $ac_cv_audioresample_format in
+ int)
+ AC_DEFINE(AUDIORESAMPLE_FORMAT_INT,1,[The int implementation should be used for integer audio resampling])
+ AC_SUBST(AUDIORESAMPLE_FORMAT_INT)
+ ;;
+ float)
+ AC_DEFINE(AUDIORESAMPLE_FORMAT_FLOAT,1,[The float implementation should be used for integer audio resampling])
+ AC_SUBST(AUDIORESAMPLE_FORMAT_FLOAT)
+ ;;
+ auto)
+ AC_DEFINE(AUDIORESAMPLE_FORMAT_AUTO,1,[The implementation that should be used for integer audio resampling witll be benchmarked at runtime])
+ AC_SUBST(AUDIORESAMPLE_FORMAT_AUTO)
+esac
+
+dnl *** plug-ins to include ***
+
+dnl these are all the gst plug-ins, compilable without additional libs
+AG_GST_CHECK_PLUGIN(adder)
+AG_GST_CHECK_PLUGIN(app)
+AG_GST_CHECK_PLUGIN(audioconvert)
+AG_GST_CHECK_PLUGIN(audiorate)
+AG_GST_CHECK_PLUGIN(audiotestsrc)
+AG_GST_CHECK_PLUGIN(encoding)
+AG_GST_CHECK_PLUGIN(videoconvert)
+AG_GST_CHECK_PLUGIN(gdp)
+AG_GST_CHECK_PLUGIN(playback)
+AG_GST_CHECK_PLUGIN(audioresample)
+AG_GST_CHECK_PLUGIN(subparse)
+AG_GST_CHECK_PLUGIN(tcp)
+AG_GST_CHECK_PLUGIN(typefind)
+AG_GST_CHECK_PLUGIN(videotestsrc)
+AG_GST_CHECK_PLUGIN(videorate)
+AG_GST_CHECK_PLUGIN(videoscale)
+AG_GST_CHECK_PLUGIN(volume)
+
+dnl FIXME 0.11: check for libxml, split subparse and move libxml parts to ext/
+AM_CONDITIONAL(USE_XML, false)
+AC_DEFINE([GST_DISABLE_XML], [1], [set to disable libxml2-dependent code in subparse])
+
+dnl disable plug-ins that require libxml2's HTML support if it is not available
+if test "x$HAVE_LIBXML_HTML" != "xyes"; then
+ AG_GST_DISABLE_PLUGIN(subparse)
+fi
+
+dnl disable plug-ins that require sys/socket.h if it is not available
+if test "x$HAVE_SYS_SOCKET_H" != "xyes"; then
+ AG_GST_DISABLE_PLUGIN(tcp)
+fi
+
+dnl iso-codes is optional, used by libgsttag
+AC_ARG_ENABLE(iso-codes,
+AC_HELP_STRING([--enable-iso-codes],[use iso-codes if installed]),
+[case "${enableval}" in
+ yes) enable_iso_codes=yes ;;
+ no) enable_iso_codes=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-iso-codes) ;;
+esac
+],
+[enable_iso_codes=yes]) dnl Default value
+
+AC_MSG_CHECKING([whether to use iso-codes if they are available])
+if test "x$enable_iso_codes" = "xyes"; then
+ AC_MSG_RESULT([yes])
+ have_iso_codes=no
+ AC_MSG_CHECKING([whether iso-codes are available on this system])
+ if $PKG_CONFIG iso-codes; then
+ AC_MSG_RESULT([yes])
+ AC_MSG_CHECKING([whether iso-codes has iso-639 domain])
+ if $PKG_CONFIG --variable=domains iso-codes | $GREP -q 639 ; then
+ AC_MSG_RESULT([yes])
+ AC_MSG_CHECKING([for iso-codes prefix])
+ ISO_CODES_PREFIX=`$PKG_CONFIG --variable=prefix iso-codes`
+ if test -d "$ISO_CODES_PREFIX"; then
+ AC_MSG_RESULT([yes])
+ AC_MSG_CHECKING([ISO_CODES_PREFIX])
+ AC_MSG_RESULT([$ISO_CODES_PREFIX])
+ ISO_639_DOMAIN="iso_639"
+ AC_MSG_CHECKING([ISO_639_DOMAIN])
+ AC_MSG_RESULT([$ISO_639_DOMAIN])
+ have_iso_codes=yes
+ AC_DEFINE([HAVE_ISO_CODES], [1], [make use of iso-codes for ISO-639])
+ AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX], ["$ISO_CODES_PREFIX"], [prefix])
+ ISO_CODES_VERSION=`$PKG_CONFIG --modversion iso-codes`
+ AC_DEFINE_UNQUOTED([ISO_CODES_VERSION], ["$ISO_CODES_VERSION"], [ ])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ else
+ AC_MSG_RESULT([no])
+ fi
+ else
+ AC_MSG_RESULT([no])
+ fi
+ AM_CONDITIONAL(USE_ISO_CODES, test "x$have_iso_codes" = "xyes")
+else
+ AC_MSG_RESULT([no (disabled via --disable-iso-codes)])
+ AM_CONDITIONAL(USE_ISO_CODES, false)
+fi
+
+dnl *** zlib is optionally used by id3 tag parsing in libgsttag ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_ZLIB, true)
+AG_GST_CHECK_FEATURE(ZLIB, [zlib support for ID3 parsing in libgsttag],, [
+ PKG_CHECK_MODULES(ZLIB, [ zlib ], [
+ HAVE_ZLIB="yes"
+ ], [
+ AG_GST_CHECK_LIBHEADER(ZLIB, z, uncompress,, zlib.h, [
+ HAVE_ZLIB="yes"
+ ZLIB_LIBS="-lz"
+ AC_SUBST(ZLIB_LIBS)
+ ])
+ ])
+])
+
+dnl *** sys plug-ins ***
+
+echo
+AC_MSG_NOTICE([Checking libraries for plugins in sys/])
+echo
+
+dnl *** X11 ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_X, true)
+AG_GST_CHECK_FEATURE(X, [X libraries and plugins],
+ [ximagesink], [
+ 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 Check for Xv extension
+translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true)
+AG_GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions],
+ [xvimagesink], [
+ AG_GST_CHECK_XV
+])
+
+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 *** 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 *** alsa ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_ALSA, true)
+AG_GST_CHECK_FEATURE(ALSA, [ALSA], alsa, [
+ PKG_CHECK_MODULES(ALSA, alsa >= 0.9.1, [
+ HAVE_ALSA="yes"
+ AC_SUBST(ALSA_CFLAGS)
+ AC_SUBST(ALSA_LIBS)
+ ], [
+ AM_PATH_ALSA(0.9.1, HAVE_ALSA="yes", HAVE_ALSA="no")
+ ])
+])
+
+dnl *** CDParanoia ***
+dnl Note: upstream has a pkg-config file only in post-10.2 SVN so far
+translit(dnm, m, l) AM_CONDITIONAL(USE_CDPARANOIA, true)
+AG_GST_CHECK_FEATURE(CDPARANOIA, [CDParanoia], cdparanoia, [
+ PKG_CHECK_MODULES(CDPARANOIA, cdparanoia-3 >= 10.2, [
+ HAVE_CDPARANOIA="yes"
+ ], [
+ AG_GST_CHECK_LIBHEADER(CDPARANOIA, cdda_interface,
+ cdda_open, -lm,
+ cdda_interface.h,
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="no"
+ FOUND_CDPARANOIA="yes")
+ if test "x$FOUND_CDPARANOIA" != "xyes";
+ then
+ AG_GST_CHECK_LIBHEADER(CDPARANOIA, cdda_interface,
+ cdda_open, -lm,
+ cdda/cdda_interface.h,
+ CDPARANOIA_LIBS="-lcdda_interface -lcdda_paranoia"
+ HEADER_DIR="yes"
+ FOUND_CDPARANOIA="yes")
+ fi
+ if test "x$HEADER_DIR" = "xyes";
+ then
+ AC_DEFINE_UNQUOTED(CDPARANOIA_HEADERS_IN_DIR, ,
+ defined if cdda headers are in a cdda/ directory)
+ fi
+ if test "x$FOUND_CDPARANOIA" = "xyes";
+ then
+ AC_CHECK_LIB(cdda_paranoia,
+ paranoia_cachemodel_size,
+ : ,
+ HAVE_CDPARANOIA=no,
+ [-lcdda_interface])
+ fi
+
+ AC_SUBST(CDPARANOIA_LIBS)
+ ])
+])
+dnl FIXME : add second check somehow if that is necessary
+dnl AC_CHECK_LIB(cdda_paranoia, paranoia_init, : , HAVE_CDPARANOIA=no, -lcdda_interface )
+dnl AC_CHECK_HEADER(cdda_paranoia.h, :, HAVE_CDPARANOIA=no)
+
+dnl *** ivorbis ***
+dnl AM_PATH_IVORBIS only takes two options
+translit(dnm, m, l) AM_CONDITIONAL(USE_IVORBIS, true)
+AG_GST_CHECK_FEATURE(IVORBIS, [integer vorbis plug-in], ivorbisdec, [
+ AG_GST_PKG_CHECK_MODULES(IVORBIS, vorbisidec)
+ if test $HAVE_IVORBIS = no
+ then
+ IVORBIS_LIBS=
+ IVORBIS_CFLAGS=
+ AC_CHECK_LIB(vorbisidec, vorbis_block_init,
+ [IVORBIS_LIBS=-lvorbisidec
+ HAVE_IVORBIS=yes
+ case $host in
+ arm-*-*)
+ IVORBIS_CFLAGS="-D_ARM_ASSEM_ $IVORBIS_CFLAGS"
+ esac
+ ],
+ HAVE_IVORBIS=no)
+ AC_SUBST(IVORBIS_LIBS)
+ AC_SUBST(IVORBIS_CFLAGS)
+ else
+ AC_CHECK_LIB(vorbisidec, vorbis_dsp_pcmout,
+ AC_DEFINE([USE_TREMOLO],1, "Define if building for android"),
+ USE_TREMOLO=no)
+ fi
+])
+
+dnl *** libgio ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_GIO, true)
+AG_GST_CHECK_FEATURE(GIO, [GIO library], gio, [
+ PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.16, [
+ HAVE_GIO="yes"
+ GIO_MODULE_DIR="`$PKG_CONFIG --variable=giomoduledir gio-2.0`"
+ AC_DEFINE_UNQUOTED(GIO_MODULE_DIR, "$GIO_MODULE_DIR",
+ [The GIO modules directory.])
+ GIO_LIBDIR="`$PKG_CONFIG --variable=libdir gio-2.0`"
+ AC_DEFINE_UNQUOTED(GIO_LIBDIR, "$GIO_LIBDIR",
+ [The GIO library directory.])
+ ], [
+ HAVE_GIO="no"
+ ])
+ AC_SUBST(GIO_CFLAGS)
+ AC_SUBST(GIO_LIBS)
+ AC_SUBST(GIO_LDFLAGS)
+])
+
+dnl *** libvisual ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_LIBVISUAL, true)
+AG_GST_CHECK_FEATURE(LIBVISUAL, [libvisual visualization library], libvisual, [
+ AG_GST_PKG_CHECK_MODULES(LIBVISUAL, libvisual-0.4 >= 0.4.0)
+ if test $HAVE_LIBVISUAL = no
+ then
+ AG_GST_PKG_CHECK_MODULES(LIBVISUAL, libvisual = 0.2.0)
+ if test x$HAVE_LIBVISUAL = xyes; then
+ LIBVIS_PLUGINSDIR="`$PKG_CONFIG --variable=pluginsbasedir libvisual-0.2`"
+ fi
+ else
+ if test x$HAVE_LIBVISUAL = xyes; then
+ LIBVIS_PLUGINSDIR="`$PKG_CONFIG --variable=pluginsbasedir libvisual-0.4`"
+ fi
+ fi
+ AC_MSG_NOTICE([libvisual pluginsdir: $LIBVIS_PLUGINSDIR])
+ if test x$LIBVIS_PLUGINSDIR != x; then
+ AC_DEFINE_UNQUOTED(LIBVISUAL_PLUGINSBASEDIR,
+ "$LIBVIS_PLUGINSDIR",
+ [directory in which the detected libvisual's plugins are located])
+ fi
+])
+
+dnl *** ogg ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_OGG, true)
+AG_GST_CHECK_FEATURE(OGG, [Xiph Ogg library], ogg, [
+ AG_GST_PKG_CHECK_MODULES(OGG, ogg >= 1.0)
+ if test $HAVE_OGG = no
+ then
+ XIPH_PATH_OGG(HAVE_OGG="yes", HAVE_OGG="no")
+ AS_SCRUB_INCLUDE(OGG_CFLAGS)
+ fi
+])
+
+dnl *** pango ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_PANGO, true)
+AG_GST_CHECK_FEATURE(PANGO, [Pango font rendering], pango, [
+ AG_GST_PKG_CHECK_MODULES(PANGO, pango >= 1.16.0 pangocairo >= 1.16.0)
+])
+
+dnl *** theora ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_THEORA, true)
+AG_GST_CHECK_FEATURE(THEORA, [Xiph Theora video codec], theora, [
+ AG_GST_PKG_CHECK_MODULES(THEORA, theoradec >= 1.1 theoraenc >= 1.1)
+])
+
+dnl *** vorbis ***
+dnl AM_PATH_VORBIS only takes two options
+translit(dnm, m, l) AM_CONDITIONAL(USE_VORBIS, true)
+AG_GST_CHECK_FEATURE(VORBIS, [Xiph Vorbis audio codec], vorbis, [
+ AG_GST_PKG_CHECK_MODULES(VORBIS, vorbis >= 1.0 vorbisenc >= 1.0)
+ if test $HAVE_VORBIS = no
+ then
+ XIPH_PATH_VORBIS(HAVE_VORBIS="yes", HAVE_VORBIS="no")
+ AS_SCRUB_INCLUDE(VORBIS_CFLAGS)
+ fi
+])
+
+if test "x$HAVE_VORBIS" = "xyes"; then
+ ac_cflags_save="$CFLAGS"
+ AC_COMPILE_IFELSE(
+ AC_LANG_PROGRAM([
+#include <vorbis/codec.h>
+ ],[
+vorbis_dsp_state *v;
+
+vorbis_synthesis_restart (v);
+ ]), HAVE_VSR=yes, HAVE_VSR=no)
+ if test "x$HAVE_VSR" = "xyes"; then
+ AC_DEFINE_UNQUOTED(HAVE_VORBIS_SYNTHESIS_RESTART, 1,
+ [defined if vorbis_synthesis_restart is present])
+ fi
+ CFLAGS="$ac_cflags_save"
+fi
+
+else
+
+dnl not building plugins with external dependencies,
+dnl but we still need to set the conditionals
+AM_CONDITIONAL(USE_ALSA, false)
+AM_CONDITIONAL(USE_CDPARANOIA, false)
+AM_CONDITIONAL(USE_GIO, false)
+AM_CONDITIONAL(USE_IVORBIS, false)
+AM_CONDITIONAL(USE_LIBVISUAL, false)
+AM_CONDITIONAL(USE_OGG, false)
+AM_CONDITIONAL(USE_PANGO, false)
+AM_CONDITIONAL(USE_THEORA, false)
+AM_CONDITIONAL(USE_VORBIS, false)
+
+fi dnl of EXT plugins
+
+dnl seeking needs freetype, so check for it here
+PKG_CHECK_MODULES(FT2, freetype2 >= 2.0.9, HAVE_FT2="yes", [
+ AC_CHECK_FT2(2.0.9, HAVE_FT2="yes", HAVE_FT2="no")
+])
+dnl make the HAVE_FT2 variable available to automake and Makefile.am
+AM_CONDITIONAL(HAVE_FT2, test "x$HAVE_FT2" = "xyes")
+AC_SUBST(FT2_CFLAGS)
+AC_SUBST(FT2_LIBS)
+
+dnl *** finalize CFLAGS, LDFLAGS, LIBS
+
+dnl Overview:
+dnl GST_OPTION_CFLAGS: common flags for profiling, debugging, errors, ...
+dnl GST_*: flags shared by built objects to link against GStreamer
+dnl GST_PLUGINS_BASE_CFLAGS: to link internally against the plugins base libs
+dnl (compare to other modules) or for i18n
+dnl GST_ALL_LDFLAGS: linker flags shared by all
+dnl GST_LIB_LDFLAGS: additional linker flags for all libaries
+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_ when compiling a git version (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 GST_PLUGINS_BASE_CFLAGS
+dnl prefer internal headers to already installed ones
+dnl also add builddir include for enumtypes and marshal
+GST_PLUGINS_BASE_CFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs"
+AC_SUBST(GST_PLUGINS_BASE_CFLAGS)
+
+dnl FIXME: do we want to rename to GST_ALL_* ?
+dnl add GST_OPTION_CFLAGS, but overridable
+GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_CXXFLAGS="$GLIB_CFLAGS $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)"
+GST_CFLAGS="$GLIB_CFLAGS $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)"
+AC_SUBST(GST_CFLAGS)
+AC_SUBST(GST_CXXFLAGS)
+dnl add GCOV libs because libtool strips -fprofile-arcs -ftest-coverage
+GST_LIBS="$GST_LIBS \$(GCOV_LIBS)"
+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"
+if test "x${enable_Bsymbolic}" = "xyes"; then
+ GST_ALL_LDFLAGS="$GST_ALL_LDFLAGS -Wl,-Bsymbolic-functions"
+fi
+AC_SUBST(GST_ALL_LDFLAGS)
+
+dnl GST_LIB_LDFLAGS
+dnl linker flags shared by all libraries
+dnl LDFLAGS modifier defining exported symbols from built libraries
+dnl (export _gst_foo but not __gst_foo)
+GST_LIB_LDFLAGS="-export-symbols-regex ^_?\(gst_\|Gst\|GST_\).*"
+AC_SUBST(GST_LIB_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 ***
+
+AC_CONFIG_FILES(
+Makefile
+gst-plugins-base.spec
+gst/Makefile
+gst/adder/Makefile
+gst/app/Makefile
+gst/audioconvert/Makefile
+gst/audiorate/Makefile
+gst/audiotestsrc/Makefile
+gst/encoding/Makefile
+gst/videoconvert/Makefile
+gst/gdp/Makefile
+gst/playback/Makefile
+gst/audioresample/Makefile
+gst/subparse/Makefile
+gst/tcp/Makefile
+gst/typefind/Makefile
+gst/videotestsrc/Makefile
+gst/videorate/Makefile
+gst/videoscale/Makefile
+gst/volume/Makefile
+sys/Makefile
+sys/ximage/Makefile
+sys/xvimage/Makefile
+ext/Makefile
+ext/alsa/Makefile
+ext/cdparanoia/Makefile
+ext/gio/Makefile
+ext/libvisual/Makefile
+ext/ogg/Makefile
+ext/pango/Makefile
+ext/theora/Makefile
+ext/vorbis/Makefile
+gst-libs/Makefile
+gst-libs/gst/Makefile
+gst-libs/gst/audio/Makefile
+gst-libs/gst/app/Makefile
+gst-libs/gst/cdda/Makefile
+gst-libs/gst/fft/Makefile
+gst-libs/gst/interfaces/Makefile
+gst-libs/gst/netbuffer/Makefile
+gst-libs/gst/riff/Makefile
+gst-libs/gst/rtp/Makefile
+gst-libs/gst/rtsp/Makefile
+gst-libs/gst/sdp/Makefile
+gst-libs/gst/tag/Makefile
+gst-libs/gst/pbutils/Makefile
+gst-libs/gst/pbutils/gstpluginsbaseversion.h
+gst-libs/gst/video/Makefile
+tools/Makefile
+pkgconfig/Makefile
+pkgconfig/gstreamer-audio.pc
+pkgconfig/gstreamer-audio-uninstalled.pc
+pkgconfig/gstreamer-app.pc
+pkgconfig/gstreamer-app-uninstalled.pc
+pkgconfig/gstreamer-cdda.pc
+pkgconfig/gstreamer-cdda-uninstalled.pc
+pkgconfig/gstreamer-fft.pc
+pkgconfig/gstreamer-fft-uninstalled.pc
+pkgconfig/gstreamer-interfaces.pc
+pkgconfig/gstreamer-interfaces-uninstalled.pc
+pkgconfig/gstreamer-netbuffer.pc
+pkgconfig/gstreamer-netbuffer-uninstalled.pc
+pkgconfig/gstreamer-pbutils.pc
+pkgconfig/gstreamer-pbutils-uninstalled.pc
+pkgconfig/gstreamer-riff.pc
+pkgconfig/gstreamer-riff-uninstalled.pc
+pkgconfig/gstreamer-rtp.pc
+pkgconfig/gstreamer-rtp-uninstalled.pc
+pkgconfig/gstreamer-rtsp.pc
+pkgconfig/gstreamer-rtsp-uninstalled.pc
+pkgconfig/gstreamer-sdp.pc
+pkgconfig/gstreamer-sdp-uninstalled.pc
+pkgconfig/gstreamer-tag.pc
+pkgconfig/gstreamer-tag-uninstalled.pc
+pkgconfig/gstreamer-video.pc
+pkgconfig/gstreamer-video-uninstalled.pc
+pkgconfig/gstreamer-plugins-base.pc
+pkgconfig/gstreamer-plugins-base-uninstalled.pc
+tests/Makefile
+tests/check/Makefile
+tests/examples/Makefile
+tests/examples/app/Makefile
+tests/examples/audio/Makefile
+tests/examples/dynamic/Makefile
+tests/examples/encoding/Makefile
+tests/examples/gio/Makefile
+tests/examples/overlay/Makefile
+tests/examples/seek/Makefile
+tests/examples/snapshot/Makefile
+tests/examples/playrec/Makefile
+tests/examples/volume/Makefile
+tests/files/Makefile
+tests/icles/Makefile
+tests/icles/playback/Makefile
+docs/Makefile
+docs/design/Makefile
+docs/libs/Makefile
+docs/plugins/Makefile
+docs/version.entities
+po/Makefile.in
+common/Makefile
+common/m4/Makefile
+m4/Makefile
+)
+
+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"/' \
+ -e 's/.* GST_INSTALL_PLUGINS_HELPER/#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_ISO_CODES$/#undef HAVE_ISO_CODES/' \
+ -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/.* ISO_CODES_PREFIX$/#undef ISO_CODES_PREFIX/' \
+ -e 's/.* ISO_CODES_VERSION$/#undef ISO_CODES_VERSION/' \
+ -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.11"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.11"\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_VIDEOSINK$/#define DEFAULT_VIDEOSINK \"directdrawsink\"/" \
+ -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/depcomp b/depcomp
new file mode 100755
index 0000000..df8eea7
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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 <http://www.gnu.org/licenses/>.
+
+# 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 <oliva@dcc.unicamp.br>.
+
+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 outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+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
+
+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.
+## 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"
+ ;;
+
+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"
+ ;;
+
+#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"
+ cat < "$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..b0d55f4
--- /dev/null
+++ b/docs/Makefile.am
@@ -0,0 +1,18 @@
+if ENABLE_GTK_DOC
+if ENABLE_PLUGIN_DOCS
+PLUGIN_DOCS_DIRS = plugins
+else
+PLUGIN_DOCS_DIRS =
+endif
+else
+PLUGIN_DOCS_DIRS = plugins
+endif
+
+SUBDIRS = design libs $(PLUGIN_DOCS_DIRS)
+DIST_SUBDIRS = design libs plugins
+
+EXTRA_DIST = \
+ 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..a7095a4
--- /dev/null
+++ b/docs/Makefile.in
@@ -0,0 +1,771 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_GTK_DOC_FALSE@PLUGIN_DOCS_DIRS = plugins
+@ENABLE_GTK_DOC_TRUE@@ENABLE_PLUGIN_DOCS_FALSE@PLUGIN_DOCS_DIRS =
+@ENABLE_GTK_DOC_TRUE@@ENABLE_PLUGIN_DOCS_TRUE@PLUGIN_DOCS_DIRS = plugins
+SUBDIRS = design libs $(PLUGIN_DOCS_DIRS)
+DIST_SUBDIRS = design libs plugins
+EXTRA_DIST = \
+ 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/design/Makefile.am b/docs/design/Makefile.am
new file mode 100644
index 0000000..357af4c
--- /dev/null
+++ b/docs/design/Makefile.am
@@ -0,0 +1,11 @@
+SUBDIRS =
+
+
+EXTRA_DIST = \
+ design-audiosinks.txt \
+ design-decodebin.txt \
+ design-encoding.txt \
+ design-orc-integration.txt \
+ draft-keyframe-force.txt \
+ draft-va.txt \
+ part-playbin2.txt
diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in
new file mode 100644
index 0000000..009becd
--- /dev/null
+++ b/docs/design/Makefile.in
@@ -0,0 +1,768 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/design
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 =
+EXTRA_DIST = \
+ design-audiosinks.txt \
+ design-decodebin.txt \
+ design-encoding.txt \
+ design-orc-integration.txt \
+ draft-keyframe-force.txt \
+ draft-va.txt \
+ part-playbin2.txt
+
+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/design/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/design/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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/docs/design/design-audiosinks.txt b/docs/design/design-audiosinks.txt
new file mode 100644
index 0000000..0a84a98
--- /dev/null
+++ b/docs/design/design-audiosinks.txt
@@ -0,0 +1,138 @@
+Audiosink design
+----------------
+
+Requirements:
+
+ - must operate chain based.
+ Most simple playback pipelines will push audio from the decoders
+ into the audio sink.
+
+ - must operate getrange based
+ Most professional audio applications will operate in a mode where
+ the audio sink pulls samples from the pipeline. This is typically
+ done in a callback from the audiosink requesting N samples. The
+ callback is either scheduled from a thread or from an interrupt
+ from the audio hardware device.
+
+ - Exact sample accurate clocks.
+ the audiosink must be able to provide a clock that is sample
+ accurate even if samples are dropped or when discontinuities are
+ found in the stream.
+
+ - Exact timing of playback.
+ The audiosink must be able to play samples at their exact times.
+
+ - use DMA access when possible.
+ When the hardware can do DMA we should use it. This should also
+ work over bufferpools to avoid data copying to/from kernel space.
+
+
+Design:
+
+ The design is based on a set of base classes and the concept of a
+ ringbuffer of samples.
+
+ +-----------+ - provide preroll, rendering, timing
+ + basesink + - caps nego
+ +-----+-----+
+ |
+ +-----V----------+ - manages ringbuffer
+ + baseaudiosink + - manages scheduling (push/pull)
+ +-----+----------+ - manages clock/query/seek
+ | - manages scheduling of samples in the ringbuffer
+ | - manages caps parsing
+ |
+ +-----V------+ - default ringbuffer implementation with a GThread
+ + audiosink + - subclasses provide open/read/close methods
+ +------------+
+
+ The ringbuffer is a contiguous piece of memory divided into segtotal
+ pieces of segments. Each segment has segsize bytes.
+
+ play position
+ v
+ +---+---+---+-------------------------------------+----------+
+ + 0 | 1 | 2 | .... | segtotal |
+ +---+---+---+-------------------------------------+----------+
+ <--->
+ segsize bytes = N samples * bytes_per_sample.
+
+
+ The ringbuffer has a play position, which is expressed in
+ segments. The play position is where the device is currently reading
+ samples from the buffer.
+
+ The ringbuffer can be put to the PLAYING or STOPPED state.
+
+ In the STOPPED state no samples are played to the device and the play
+ pointer does not advance.
+
+ In the PLAYING state samples are written to the device and the ringbuffer
+ should call a configurable callback after each segment is written to the
+ device. In this state the play pointer is advanced after each segment is
+ written.
+
+ A write operation to the ringbuffer will put new samples in the ringbuffer.
+ If there is not enough space in the ringbuffer, the write operation will
+ block. The playback of the buffer never stops, even if the buffer is
+ empty. When the buffer is empty, silence is played by the device.
+
+ The ringbuffer is implemented with lockfree atomic operations, especially
+ on the reading side so that low-latency operations are possible.
+
+ Whenever new samples are to be put into the ringbuffer, the position of the
+ read pointer is taken. The required write position is taken and the diff
+ is made between the required qnd actual position. If the defference is <0,
+ the sample is too late. If the difference is bigger than segtotal, the
+ writing part has to wait for the play pointer to advance.
+
+
+Scheduling:
+
+ - chain based mode:
+
+ In chain based mode, bytes are written into the ringbuffer. This operation
+ will eventually block when the ringbuffer is filled.
+
+ When no samples arrive in time, the ringbuffer will play silence. Each
+ buffer that arrives will be placed into the ringbuffer at the correct
+ times. This means that dropping samples or inserting silence is done
+ automatically and very accurate and independend of the play pointer.
+
+ In this mode, the ringbuffer is usually kept as full as possible. When
+ using a small buffer (small segsize and segtotal), the latency for audio
+ to start from the sink to when it is played can be kept low but at least
+ one context switch has to be made between read and write.
+
+ - getrange based mode
+
+ In getrange based mode, the baseaudiosink will use the callback function
+ of the ringbuffer to get a segsize samples from the peer element. These
+ samples will then be placed in the ringbuffer at the next play position.
+ It is assumed that the getrange function returns fast enough to fill the
+ ringbuffer before the play pointer reaches the write pointer.
+
+ In this mode, the ringbuffer is usually kept as empty as possible. There
+ is no context switch needed between the elements that create the samples
+ and the actual writing of the samples to the device.
+
+
+DMA mode:
+
+ - Elements that can do DMA based access to the audio device have to subclass
+ from the GstBaseAudioSink class and wrap the DMA ringbuffer in a subclass
+ of GstRingBuffer.
+
+ The ringbuffer subclass should trigger a callback after writing or playing
+ each sample to the device. This callback can be triggered from a thread or
+ from a signal from the audio device.
+
+
+Clocks:
+
+ The GstBaseAudioSink class will use the ringbuffer to act as a clock provider.
+ It can do this by using the play pointer and the delay to calculate the
+ clock time.
+
+
+
diff --git a/docs/design/design-decodebin.txt b/docs/design/design-decodebin.txt
new file mode 100644
index 0000000..7ca84b6
--- /dev/null
+++ b/docs/design/design-decodebin.txt
@@ -0,0 +1,274 @@
+Decodebin design
+
+GstDecodeBin
+------------
+
+Description:
+
+ Autoplug and decode to raw media
+
+ Input : single pad with ANY caps Output : Dynamic pads
+
+* Contents
+
+ _ a GstTypeFindElement connected to the single sink pad
+
+ _ optionally a demuxer/parser
+
+ _ optionally one or more DecodeGroup
+
+* Autoplugging
+
+ The goal is to reach 'target' caps (by default raw media).
+
+ This is done by using the GstCaps of a source pad and finding the available
+demuxers/decoders GstElement that can be linked to that pad.
+
+ The process starts with the source pad of typefind and stops when no more
+non-target caps are left. It is commonly done while pre-rolling, but can also
+happen whenever a new pad appears on any element.
+
+ Once a target caps has been found, that pad is ghosted and the
+'pad-added' signal is emitted.
+
+ If no compatible elements can be found for a GstCaps, the pad is ghosted and
+the 'unknown-type' signal is emitted.
+
+
+* Assisted auto-plugging
+
+ When starting the auto-plugging process for a given GstCaps, two signals are
+emitted in the following way in order to allow the application/user to assist or
+fine-tune the process.
+
+ _ 'autoplug-continue' :
+
+ gboolean user_function (GstElement * decodebin, GstPad *pad, GstCaps * caps)
+
+ This signal is fired at the very beginning with the source pad GstCaps. If
+ the callback returns TRUE, the process continues normally. If the callback
+ returns FALSE, then the GstCaps are considered as a target caps and the
+ autoplugging process stops.
+
+ - 'autoplug-factories' :
+
+ GValueArray user_function (GstElement* decodebin, GstPad* pad,
+ GstCaps* caps);
+
+ Get a list of elementfactories for @pad with @caps. This function is used to
+ instruct decodebin2 of the elements it should try to autoplug. The default
+ behaviour when this function is not overridern is to get all elements that
+ can handle @caps from the registry sorted by rank.
+
+ - 'autoplug-select' :
+
+ gint user_function (GstElement* decodebin, GstPad* pad, GstCaps* caps,
+ GValueArray* factories);
+
+ This signal is fired once autoplugging has got a list of compatible
+ GstElementFactory. The signal is emitted with the GstCaps of the source pad
+ and a pointer on the GValueArray of compatible factories.
+
+ The callback should return the index of the elementfactory in @factories
+ that should be tried next.
+
+ If the callback returns -1, the autoplugging process will stop as if no
+ compatible factories were found.
+
+ The default implementation of this function will try to autoplug the first
+ factory of the list.
+
+* Target Caps
+
+ The target caps are a read/write GObject property of decodebin.
+
+ By default the target caps are:
+
+ _ Raw audio : audio/x-raw-int, audio/x-raw-float
+
+ _ and raw video : video/x-raw-rgb, video/x-raw-yuv
+
+ _ and Text : text/plain, text/x-pango-markup
+
+
+* media chain/group handling
+
+ When autoplugging, all streams coming out of a demuxer will be grouped in a
+DecodeGroup.
+
+ All new source pads created on that demuxer after it has emitted the
+'no-more-pads' signal will be put in another DecodeGroup.
+
+ Only one decodegroup can be active at any given time. If a new decodegroup is
+created while another one exists, that decodegroup will be set as blocking until
+the existing one has drained.
+
+
+
+DecodeGroup
+-----------
+
+Description:
+
+ Streams belonging to the same group/chain of a media file.
+
+* Contents
+
+ The DecodeGroup contains:
+
+ _ a GstMultiQueue to which all streams of a the media group are connected.
+
+ _ the eventual decoders which are autoplugged in order to produce the
+ requested target pads.
+
+* Proper group draining
+
+ The DecodeGroup takes care that all the streams in the group are completely
+drained (EOS has come through all source ghost pads).
+
+* Pre-roll and block
+
+ The DecodeGroup has a global blocking feature. If enabled, all the ghosted
+source pads for that group will be blocked.
+
+ A method is available to unblock all blocked pads for that group.
+
+
+
+GstMultiQueue
+-------------
+
+Description:
+
+ Multiple input-output data queue
+
+ The GstMultiQueue achieves the same functionnality as GstQueue, with a few
+differences:
+
+ * Multiple streams handling.
+
+ The element handles queueing data on more than one stream at once. To
+ achieve such a feature it has request sink pads (sink_%d) and 'sometimes' src
+ pads (src_%d).
+
+ When requesting a given sinkpad, the associated srcpad for that stream will
+ be created. Ex: requesting sink_1 will generate src_1.
+
+
+ * Non-starvation on multiple streams.
+
+ If more than one stream is used with the element, the streams' queues will
+ be dynamically grown (up to a limit), in order to ensure that no stream is
+ risking data starvation. This guarantees that at any given time there are at
+ least N bytes queued and available for each individual stream.
+
+ If an EOS event comes through a srcpad, the associated queue should be
+ considered as 'not-empty' in the queue-size-growing algorithm.
+
+
+ * Non-linked srcpads graceful handling.
+
+ A GstTask is started for all srcpads when going to GST_STATE_PAUSED.
+
+ The task are blocking against a GCondition which will be fired in two
+ different cases:
+
+ _ When the associated queue has received a buffer.
+
+ _ When the associated queue was previously declared as 'not-linked' and the
+ first buffer of the queue is scheduled to be pushed synchronously in
+ relation to the order in which it arrived globally in the element (see
+ 'Synchronous data pushing' below).
+
+ When woken up by the GCondition, the GstTask will try to push the next
+ GstBuffer/GstEvent on the queue. If pushing the GstBuffer/GstEvent returns
+ GST_FLOW_NOT_LINKED, then the associated queue is marked as 'not-linked'. If
+ pushing the GstBuffer/GstEvent succeeded the queue will no longer be marked as
+ 'not-linked'.
+
+ If pushing on all srcpads returns GstFlowReturn different from GST_FLOW_OK,
+ then all the srcpads' tasks are stopped and subsequent pushes on sinkpads will
+ return GST_FLOW_NOT_LINKED.
+
+ * Synchronous data pushing for non-linked pads.
+
+ In order to better support dynamic switching between streams, the multiqueue
+ (unlike the current GStreamer queue) continues to push buffers on non-linked
+ pads rather than shutting down.
+
+ In addition, to prevent a non-linked stream from very quickly consuming all
+ available buffers and thus 'racing ahead' of the other streams, the element
+ must ensure that buffers and inlined events for a non-linked stream are pushed
+ in the same order as they were received, relative to the other streams
+ controlled by the element. This means that a buffer cannot be pushed to a
+ non-linked pad any sooner than buffers in any other stream which were received
+ before it.
+
+
+=====================================
+ Parsers, decoders and auto-plugging
+=====================================
+
+This section has DRAFT status.
+
+Some media formats come in different "flavours" or "stream formats". These
+formats differ in the way the setup data and media data is signalled and/or
+packaged. An example for this is H.264 video, where there is a bytestream
+format (with codec setup data signalled inline and units prefixed by a sync
+code and packet length information) and a "raw" format where codec setup
+data is signalled out of band (via the caps) and the chunking is implicit
+in the way the buffers were muxed into a container, to mention just two of
+the possible variants.
+
+Especially on embedded platforms it is common that decoders can only
+handle one particular stream format, and not all of them.
+
+Where there are multiple stream formats, parsers are usually expected
+to be able to convert between the different formats. This will, if
+implemented correctly, work as expected in a static pipeline such as
+
+ ... ! parser ! decoder ! sink
+
+where the parser can query the decoder's capabilities even before
+processing the first piece of data, and configure itself to convert
+accordingly, if conversion is needed at all.
+
+In an auto-plugging context this is not so straight-forward though,
+because elements are plugged incrementally and not before the previous
+element has processes some data and decided what it will output exactly
+(unless the template caps are completely fixed, then it can continue
+right away, this is not always the case here though, see below). A
+parser will thus have to decide on *some* output format so auto-plugging
+can continue. It doesn't know anything about the available decoders and
+their capabilities though, so it's possible that it will choose a format
+that is not supported by any of the available decoders, or by the preferred
+decoder.
+
+If the parser had sufficiently concise but fixed source pad template caps,
+decodebin could continue to plug a decoder right away, allowing the
+parser to configure itself in the same way as it would with a static
+pipeline. This is not an option, unfortunately, because often the
+parser needs to process some data to determine e.g. the format's profile or
+other stream properties (resolution, sample rate, channel configuration, etc.),
+and there may be different decoders for different profiles (e.g. DSP codec
+for baseline profile, and software fallback for main/high profile; or a DSP
+codec only supporting certain resolutions, with a software fallback for
+unusual resolutions). So if decodebin just plugged the most highest-ranking
+decoder, that decoder might not be be able to handle the actual stream later
+on, which would yield an error (this is a data flow error then which would
+be hard to intercept and avoid in decodebin). In other words, we can't solve
+this issue by plugging a decoder right away with the parser.
+
+So decodebin needs to communicate to the parser the set of available decoder
+caps (which would contain the relevant capabilities/restrictions such as
+supported profiles, resolutions, etc.), after the usual "autoplug-*" signal
+filtering/sorting of course.
+
+This is done by plugging a capsfilter element right after the parser, and
+constructing set of filter caps from the list of available decoders (one
+appends at the end just the name(s) of the caps structures from the parser
+pad template caps to function as an 'ANY other' caps equivalent). This let
+the parser negotiate to a supported stream format in the same way as with
+the static pipeline mentioned above, but of course incur some overhead
+through the additional capsfilter element.
+
diff --git a/docs/design/design-encoding.txt b/docs/design/design-encoding.txt
new file mode 100644
index 0000000..dda79ad
--- /dev/null
+++ b/docs/design/design-encoding.txt
@@ -0,0 +1,571 @@
+Encoding and Muxing
+-------------------
+
+Summary
+-------
+ A. Problems
+ B. Goals
+ 1. EncodeBin
+ 2. Encoding Profile System
+ 3. Helper Library for Profiles
+ I. Use-cases researched
+
+
+A. Problems this proposal attempts to solve
+-------------------------------------------
+
+* Duplication of pipeline code for gstreamer-based applications
+ wishing to encode and or mux streams, leading to subtle differences
+ and inconsistencies accross those applications.
+
+* No unified system for describing encoding targets for applications
+ in a user-friendly way.
+
+* No unified system for creating encoding targets for applications,
+ resulting in duplication of code accross all applications,
+ differences and inconsistencies that come with that duplication,
+ and applications hardcoding element names and settings resulting in
+ poor portability.
+
+
+
+B. Goals
+--------
+
+1. Convenience encoding element
+
+ Create a convenience GstBin for encoding and muxing several streams,
+ hereafter called 'EncodeBin'.
+
+ This element will only contain one single property, which is a
+ profile.
+
+2. Define a encoding profile system
+
+2. Encoding profile helper library
+
+ Create a helper library to:
+ * create EncodeBin instances based on profiles, and
+ * help applications to create/load/save/browse those profiles.
+
+
+
+
+1. EncodeBin
+------------
+
+1.1 Proposed API
+----------------
+
+ EncodeBin is a GstBin subclass.
+
+ It implements the GstTagSetter interface, by which it will proxy the
+ calls to the muxer.
+
+ Only two introspectable property (i.e. usable without extra API):
+ * A GstEncodingProfile*
+ * The name of the profile to use
+
+ When a profile is selected, encodebin will:
+ * Add REQUEST sinkpads for all the GstStreamProfile
+ * Create the muxer and expose the source pad
+
+ Whenever a request pad is created, encodebin will:
+ * Create the chain of elements for that pad
+ * Ghost the sink pad
+ * Return that ghost pad
+
+ This allows reducing the code to the minimum for applications
+ wishing to encode a source for a given profile:
+
+ ...
+
+ encbin = gst_element_factory_make("encodebin, NULL);
+ g_object_set (encbin, "profile", "N900/H264 HQ", NULL);
+ gst_element_link (encbin, filesink);
+
+ ...
+
+ vsrcpad = gst_element_get_src_pad(source, "src1");
+ vsinkpad = gst_element_get_request_pad (encbin, "video_%d");
+ gst_pad_link(vsrcpad, vsinkpad);
+
+ ...
+
+
+1.2 Explanation of the Various stages in EncodeBin
+--------------------------------------------------
+
+ This describes the various stages which can happen in order to end
+ up with a multiplexed stream that can then be stored or streamed.
+
+1.2.1 Incoming streams
+
+ The streams fed to EncodeBin can be of various types:
+
+ * Video
+ * Uncompressed (but maybe subsampled)
+ * Compressed
+ * Audio
+ * Uncompressed (audio/x-raw-{int|float})
+ * Compressed
+ * Timed text
+ * Private streams
+
+
+1.2.2 Steps involved for raw video encoding
+
+(0) Incoming Stream
+
+(1) Transform raw video feed (optional)
+
+ Here we modify the various fundamental properties of a raw video
+ stream to be compatible with the intersection of:
+ * The encoder GstCaps and
+ * The specified "Stream Restriction" of the profile/target
+
+ The fundamental properties that can be modified are:
+ * width/height
+ This is done with a video scaler.
+ The DAR (Display Aspect Ratio) MUST be respected.
+ If needed, black borders can be added to comply with the target DAR.
+ * framerate
+ * format/colorspace/depth
+ All of this is done with a colorspace converter
+
+(2) Actual encoding (optional for raw streams)
+
+ An encoder (with some optional settings) is used.
+
+(3) Muxing
+
+ A muxer (with some optional settings) is used.
+
+(4) Outgoing encoded and muxed stream
+
+
+1.2.3 Steps involved for raw audio encoding
+
+ This is roughly the same as for raw video, expect for (1)
+
+(1) Transform raw audo feed (optional)
+
+ We modify the various fundamental properties of a raw audio stream to
+ be compatible with the intersection of:
+ * The encoder GstCaps and
+ * The specified "Stream Restriction" of the profile/target
+
+ The fundamental properties that can be modifier are:
+ * Number of channels
+ * Type of raw audio (integer or floating point)
+ * Depth (number of bits required to encode one sample)
+
+
+1.2.4 Steps involved for encoded audio/video streams
+
+ Steps (1) and (2) are replaced by a parser if a parser is available
+ for the given format.
+
+
+1.2.5 Steps involved for other streams
+
+ Other streams will just be forwarded as-is to the muxer, provided the
+ muxer accepts the stream type.
+
+
+
+
+2. Encoding Profile System
+--------------------------
+
+ This work is based on:
+ * The existing GstPreset system for elements [0]
+ * The gnome-media GConf audio profile system [1]
+ * The investigation done into device profiles by Arista and
+ Transmageddon [2 and 3]
+
+2.2 Terminology
+---------------
+
+* Encoding Target Category
+ A Target Category is a classification of devices/systems/use-cases
+ for encoding.
+
+ Such a classification is required in order for:
+ * Applications with a very-specific use-case to limit the number of
+ profiles they can offer the user. A screencasting application has
+ no use with the online services targets for example.
+ * Offering the user some initial classification in the case of a
+ more generic encoding application (like a video editor or a
+ transcoder).
+
+ Ex:
+ Consumer devices
+ Online service
+ Intermediate Editing Format
+ Screencast
+ Capture
+ Computer
+
+* Encoding Profile Target
+ A Profile Target describes a specific entity for which we wish to
+ encode.
+ A Profile Target must belong to at least one Target Category.
+ It will define at least one Encoding Profile.
+
+ Ex (with category):
+ Nokia N900 (Consumer device)
+ Sony PlayStation 3 (Consumer device)
+ Youtube (Online service)
+ DNxHD (Intermediate editing format)
+ HuffYUV (Screencast)
+ Theora (Computer)
+
+* Encoding Profile
+ A specific combination of muxer, encoders, presets and limitations.
+
+ Ex:
+ Nokia N900/H264 HQ
+ Ipod/High Quality
+ DVD/Pal
+ Youtube/High Quality
+ HTML5/Low Bandwith
+ DNxHD
+
+2.3 Encoding Profile
+--------------------
+
+An encoding profile requires the following information:
+
+ * Name
+ This string is not translatable and must be unique.
+ A recommendation to guarantee uniqueness of the naming could be:
+ <target>/<name>
+ * Description
+ This is a translatable string describing the profile
+ * Muxing format
+ This is a string containing the GStreamer media-type of the
+ container format.
+ * Muxing preset
+ This is an optional string describing the preset(s) to use on the
+ muxer.
+ * Multipass setting
+ This is a boolean describing whether the profile requires several
+ passes.
+ * List of Stream Profile
+
+2.3.1 Stream Profiles
+
+A Stream Profile consists of:
+
+ * Type
+ The type of stream profile (audio, video, text, private-data)
+ * Encoding Format
+ This is a string containing the GStreamer media-type of the encoding
+ format to be used. If encoding is not to be applied, the raw audio
+ media type will be used.
+ * Encoding preset
+ This is an optional string describing the preset(s) to use on the
+ encoder.
+ * Restriction
+ This is an optional GstCaps containing the restriction of the
+ stream that can be fed to the encoder.
+ This will generally containing restrictions in video
+ width/heigh/framerate or audio depth.
+ * presence
+ This is an integer specifying how many streams can be used in the
+ containing profile. 0 means that any number of streams can be
+ used.
+ * pass
+ This is an integer which is only meaningful if the multipass flag
+ has been set in the profile. If it has been set it indicates which
+ pass this Stream Profile corresponds to.
+
+2.4 Example profile
+-------------------
+
+The representation used here is XML only as an example. No decision is
+made as to which formatting to use for storing targets and profiles.
+
+<gst-encoding-target>
+ <name>Nokia N900</name>
+ <category>Consumer Device</category>
+ <profiles>
+ <profile>Nokia N900/H264 HQ</profile>
+ <profile>Nokia N900/MP3</profile>
+ <profile>Nokia N900/AAC</profile>
+ </profiles>
+</gst-encoding-target>
+
+<gst-encoding-profile>
+ <name>Nokia N900/H264 HQ</name>
+ <description>
+ High Quality H264/AAC for the Nokia N900
+ </description>
+ <format>video/quicktime,variant=iso</format>
+ <streams>
+ <stream-profile>
+ <type>audio</type>
+ <format>audio/mpeg,mpegversion=4</format>
+ <preset>Quality High/Main</preset>
+ <restriction>audio/x-raw-int,channels=[1,2]</restriction>
+ <presence>1</presence>
+ </stream-profile>
+ <stream-profile>
+ <type>video</type>
+ <format>video/x-h264</format>
+ <preset>Profile Baseline/Quality High</preset>
+ <restriction>
+ video/x-raw-yuv,width=[16, 800],\
+ height=[16, 480],framerate=[1/1, 30000/1001]
+ </restriction>
+ <presence>1</presence>
+ </stream-profile>
+ </streams>
+
+</gst-encoding-profile>
+
+2.5 API
+-------
+ A proposed C API is contained in the gstprofile.h file in this directory.
+
+
+2.6 Modifications required in the existing GstPreset system
+-----------------------------------------------------------
+
+2.6.1. Temporary preset.
+
+ Currently a preset needs to be saved on disk in order to be
+ used.
+
+ This makes it impossible to have temporary presets (that exist only
+ during the lifetime of a process), which might be required in the
+ new proposed profile system
+
+2.6.2 Categorisation of presets.
+
+ Currently presets are just aliases of a group of property/value
+ without any meanings or explanation as to how they exclude each
+ other.
+
+ Take for example the H264 encoder. It can have presets for:
+ * passes (1,2 or 3 passes)
+ * profiles (Baseline, Main, ...)
+ * quality (Low, medium, High)
+
+ In order to programmatically know which presets exclude each other,
+ we here propose the categorisation of these presets.
+
+ This can be done in one of two ways
+ 1. in the name (by making the name be [<category>:]<name>)
+ This would give for example: "Quality:High", "Profile:Baseline"
+ 2. by adding a new _meta key
+ This would give for example: _meta/category:quality
+
+2.6.3 Aggregation of presets.
+
+ There can be more than one choice of presets to be done for an
+ element (quality, profile, pass).
+
+ This means that one can not currently describe the full
+ configuration of an element with a single string but with many.
+
+ The proposal here is to extend the GstPreset API to be able to set
+ all presets using one string and a well-known separator ('/').
+
+ This change only requires changes in the core preset handling code.
+
+ This would allow doing the following:
+ gst_preset_load_preset (h264enc,
+ "pass:1/profile:baseline/quality:high");
+
+2.7 Points to be determined
+---------------------------
+
+ This document hasn't determined yet how to solve the following
+ problems:
+
+2.7.1 Storage of profiles
+
+ One proposal for storage would be to use a system wide directory
+ (like $prefix/share/gstreamer-0.10/profiles) and store XML files for
+ every individual profiles.
+
+ Users could then add their own profiles in ~/.gstreamer-0.10/profiles
+
+ This poses some limitations as to what to do if some applications
+ want to have some profiles limited to their own usage.
+
+
+3. Helper library for profiles
+------------------------------
+
+ These helper methods could also be added to existing libraries (like
+ GstPreset, GstPbUtils, ..).
+
+ The various API proposed are in the accompanying gstprofile.h file.
+
+3.1 Getting user-readable names for formats
+
+ This is already provided by GstPbUtils.
+
+3.2 Hierarchy of profiles
+
+ The goal is for applications to be able to present to the user a list
+ of combo-boxes for choosing their output profile:
+
+ [ Category ] # optional, depends on the application
+ [ Device/Site/.. ] # optional, depends on the application
+ [ Profile ]
+
+ Convenience methods are offered to easily get lists of categories,
+ devices, and profiles.
+
+3.3 Creating Profiles
+
+ The goal is for applications to be able to easily create profiles.
+
+ The applications needs to be able to have a fast/efficient way to:
+ * select a container format and see all compatible streams he can use
+ with it.
+ * select a codec format and see which container formats he can use
+ with it.
+
+ The remaining parts concern the restrictions to encoder
+ input.
+
+3.4 Ensuring availability of plugins for Profiles
+
+ When an application wishes to use a Profile, it should be able to
+ query whether it has all the needed plugins to use it.
+
+ This part will use GstPbUtils to query, and if needed install the
+ missing plugins through the installed distribution plugin installer.
+
+
+I. Use-cases researched
+-----------------------
+
+ This is a list of various use-cases where encoding/muxing is being
+ used.
+
+* Transcoding
+
+ The goal is to convert with as minimal loss of quality any input
+ file for a target use.
+ A specific variant of this is transmuxing (see below).
+
+ Example applications: Arista, Transmageddon
+
+* Rendering timelines
+
+ The incoming streams are a collection of various segments that need
+ to be rendered.
+ Those segments can vary in nature (i.e. the video width/height can
+ change).
+ This requires the use of identiy with the single-segment property
+ activated to transform the incoming collection of segments to a
+ single continuous segment.
+
+ Example applications: PiTiVi, Jokosher
+
+* Encoding of live sources
+
+ The major risk to take into account is the encoder not encoding the
+ incoming stream fast enough. This is outside of the scope of
+ encodebin, and should be solved by using queues between the sources
+ and encodebin, as well as implementing QoS in encoders and sources
+ (the encoders emitting QoS events, and the upstream elements
+ adapting themselves accordingly).
+
+ Example applications: camerabin, cheese
+
+* Screencasting applications
+
+ This is similar to encoding of live sources.
+ The difference being that due to the nature of the source (size and
+ amount/frequency of updates) one might want to do the encoding in
+ two parts:
+ * The actual live capture is encoded with a 'almost-lossless' codec
+ (such as huffyuv)
+ * Once the capture is done, the file created in the first step is
+ then rendered to the desired target format.
+
+ Fixing sources to only emit region-updates and having encoders
+ capable of encoding those streams would fix the need for the first
+ step but is outside of the scope of encodebin.
+
+ Example applications: Istanbul, gnome-shell, recordmydesktop
+
+* Live transcoding
+
+ This is the case of an incoming live stream which will be
+ broadcasted/transmitted live.
+ One issue to take into account is to reduce the encoding latency to
+ a minimum. This should mostly be done by picking low-latency
+ encoders.
+
+ Example applications: Rygel, Coherence
+
+* Transmuxing
+
+ Given a certain file, the aim is to remux the contents WITHOUT
+ decoding into either a different container format or the same
+ container format.
+ Remuxing into the same container format is useful when the file was
+ not created properly (for example, the index is missing).
+ Whenever available, parsers should be applied on the encoded streams
+ to validate and/or fix the streams before muxing them.
+
+ Metadata from the original file must be kept in the newly created
+ file.
+
+ Example applications: Arista, Transmaggedon
+
+* Loss-less cutting
+
+ Given a certain file, the aim is to extract a certain part of the
+ file without going through the process of decoding and re-encoding
+ that file.
+ This is similar to the transmuxing use-case.
+
+ Example applications: PiTiVi, Transmageddon, Arista, ...
+
+* Multi-pass encoding
+
+ Some encoders allow doing a multi-pass encoding.
+ The initial pass(es) are only used to collect encoding estimates and
+ are not actually muxed and outputted.
+ The final pass uses previously collected information, and the output
+ is then muxed and outputted.
+
+* Archiving and intermediary format
+
+ The requirement is to have lossless
+
+* CD ripping
+
+ Example applications: Sound-juicer
+
+* DVD ripping
+
+ Example application: Thoggen
+
+
+
+* Research links
+
+ Some of these are still active documents, some other not
+
+[0] GstPreset API documentation
+ http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html
+
+[1] gnome-media GConf profiles
+ http://www.gnome.org/~bmsmith/gconf-docs/C/gnome-media.html
+
+[2] Research on a Device Profile API
+ http://gstreamer.freedesktop.org/wiki/DeviceProfile
+
+[3] Research on defining presets usage
+ http://gstreamer.freedesktop.org/wiki/PresetDesign
+
diff --git a/docs/design/design-orc-integration.txt b/docs/design/design-orc-integration.txt
new file mode 100644
index 0000000..d5d146c
--- /dev/null
+++ b/docs/design/design-orc-integration.txt
@@ -0,0 +1,204 @@
+
+Orc Integration
+===============
+
+Sections
+--------
+
+ - About Orc
+ - Fast memcpy()
+ - Normal Usage
+ - Build Process
+ - Testing
+ - Orc Limitations
+
+
+About Orc
+---------
+
+Orc code can be in one of two forms: in .orc files that is converted
+by orcc to C code that calls liborc functions, or C code that calls
+liborc to create complex operations at runtime. The former is mostly
+for functions with predetermined functionality. The latter is for
+functionality that is determined at runtime, where writing .orc
+functions for all combinations would be prohibitive. Orc also has
+a fast memcpy and memset which are useful independently.
+
+
+Fast memcpy()
+-------------
+
+*** This part is not integrated yet. ***
+
+Orc has built-in functions orc_memcpy() and orc_memset() that work
+like memcpy() and memset(). These are meant for large copies only.
+A reasonable cutoff for using orc_memcpy() instead of memcpy() is
+if the number of bytes is generally greater than 100. DO NOT use
+orc_memcpy() if the typical is size is less than 20 bytes, especially
+if the size is known at compile time, as these cases are inlined by
+the compiler.
+
+(Example: sys/ximage/ximagesink.c)
+
+Add $(ORC_CFLAGS) to libgstximagesink_la_CFLAGS and $(ORC_LIBS) to
+libgstximagesink_la_LIBADD. Then, in the source file, add:
+
+ #ifdef HAVE_ORC
+ #include <orc/orc.h>
+ #else
+ #define orc_memcpy(a,b,c) memcpy(a,b,c)
+ #endif
+
+Then switch relevant uses of memcpy() to orc_memcpy().
+
+The above example works whether or not Orc is enabled at compile
+time.
+
+
+Normal Usage
+------------
+
+The following lines are added near the top of Makefile.am for plugins
+that use Orc code in .orc files (this is for the volume plugin):
+
+ ORC_BASE=volume
+ include $(top_srcdir)/common/orc.mk
+
+Also add the generated source file to the plugin build:
+
+ nodist_libgstvolume_la_SOURCES = $(ORC_SOURCES)
+
+And of course, add $(ORC_CFLAGS) to libgstvolume_la_CFLAGS, and
+$(ORC_LIBS) to libgstvolume_la_LIBADD.
+
+The value assigned to ORC_BASE does not need to be related to
+the name of the plugin.
+
+
+Advanced Usage
+--------------
+
+The Holy Grail of Orc usage is to programmatically generate Orc code
+at runtime, have liborc compile it into binary code at runtime, and
+then execute this code. Currently, the best example of this is in
+Schroedinger. An example of how this would be used is audioconvert:
+given an input format, channel position manipulation, dithering and
+quantizing configuration, and output format, a Orc code generator
+would create an OrcProgram, add the appropriate instructions to do
+each step based on the configuration, and then compile the program.
+Sucessfully compiling the program would return a function pointer
+that can be called to perform the operation.
+
+This sort of advanced usage requires structural changes to current
+plugins (e.g., audioconvert) and will probably be developed
+incrementally. Moreover, if such code is intended to be used without
+Orc as strict build/runtime requirement, two codepaths would need to
+be developed and tested. For this reason, until GStreamer requires
+Orc, I think it's a good idea to restrict such advanced usage to the
+cog plugin in -bad, which requires Orc.
+
+
+Build Process
+-------------
+
+The goal of the build process is to make Orc non-essential for most
+developers and users. This is not to say you shouldn't have Orc
+installed -- without it, you will get slow backup C code, just that
+people compiling GStreamer are not forced to switch from Liboil to
+Orc immediately.
+
+With Orc installed, the build process will use the Orc Compiler (orcc)
+to convert each .orc file into a temporary C source (tmp-orc.c) and a
+temporary header file (${name}orc.h if constructed from ${base}.orc).
+The C source file is compiled and linked to the plugin, and the header
+file is included by other source files in the plugin.
+
+If 'make orc-update' is run in the source directory, the files
+tmp-orc.c and ${base}orc.h are copied to ${base}orc-dist.c and
+${base}orc-dist.h respectively. The -dist.[ch] files are automatically
+disted via orc.mk. The -dist.[ch] files should be checked in to
+git whenever the .orc source is changed and checked in. Example
+workflow:
+
+ edit .orc file
+ ... make, test, etc.
+ make orc-update
+ git add volume.orc volumeorc-dist.c volumeorc-dist.h
+ git commit
+
+At 'make dist' time, all of the .orc files are compiled, and then
+copied to their -dist.[ch] counterparts, and then the -dist.[ch]
+files are added to the dist directory.
+
+Without Orc installed (or --disable-orc given to configure), the
+-dist.[ch] files are copied to tmp-orc.c and ${name}orc.h. When
+compiled Orc disabled, DISABLE_ORC is defined in config.h, and
+the C backup code is compiled. This backup code is pure C, and
+does not include orc headers or require linking against liborc.
+
+The common/orc.mk build method is limited by the inflexibility of
+automake. The file tmp-orc.c must be a fixed filename, using ORC_NAME
+to generate the filename does not work because it conflicts with
+automake's dependency generation. Building multiple .orc files
+is not possible due to this restriction.
+
+
+Testing
+-------
+
+If you create another .orc file, please add it to
+tests/orc/Makefile.am. This causes automatic test code to be
+generated and run during 'make check'. Each function in the .orc
+file is tested by comparing the results of executing the run-time
+compiled code and the C backup function.
+
+
+Orc Limitations
+---------------
+
+audioconvert
+
+ Orc doesn't have a mechanism for generating random numbers, which
+ prevents its use as-is for dithering. One way around this is to
+ generate suitable dithering values in one pass, then use those
+ values in a second Orc-based pass.
+
+ Orc doesn't handle 64-bit float, for no good reason.
+
+ Irrespective of Orc handling 64-bit float, it would be useful to
+ have a direct 32-bit float to 16-bit integer conversion.
+
+ audioconvert is a good candidate for programmatically generated
+ Orc code.
+
+ audioconvert enumerates functions in terms of big-endian vs.
+ little-endian. Orc's functions are "native" and "swapped".
+ Programmatically generating code removes the need to worry about
+ this.
+
+ Orc doesn't handle 24-bit samples. Fixing this is not a priority
+ (for ds).
+
+videoscale
+
+ Orc doesn't handle horizontal resampling yet. The plan is to add
+ special sampling opcodes, for nearest, bilinear, and cubic
+ interpolation.
+
+videotestsrc
+
+ Lots of code in videotestsrc needs to be rewritten to be SIMD
+ (and Orc) friendly, e.g., stuff that uses oil_splat_u8().
+
+ A fast low-quality random number generator in Orc would be useful
+ here.
+
+volume
+
+ Many of the comments on audioconvert apply here as well.
+
+ There are a bunch of FIXMEs in here that are due to misapplied
+ patches.
+
+
+
diff --git a/docs/design/draft-keyframe-force.txt b/docs/design/draft-keyframe-force.txt
new file mode 100644
index 0000000..8dd0f01
--- /dev/null
+++ b/docs/design/draft-keyframe-force.txt
@@ -0,0 +1,91 @@
+Forcing keyframes
+-----------------
+
+Consider the following use case:
+
+ We have a pipeline that performs video and audio capture from a live source,
+ compresses and muxes the streams and writes the resulting data into a file.
+
+ Inside the uncompressed video data we have a specific pattern inserted at
+ specific moments that should trigger a switch to a new file, meaning, we close
+ the existing file we are writing to and start writing to a new file.
+
+ We want the new file to start with a keyframe so that one can start decoding
+ the file immediatly.
+
+Components:
+
+ 1) We need an element that is able to detect the pattern in the video stream.
+
+ 2) We need to inform the video encoder that it should start encoding a keyframe
+ starting from exactly the frame with the pattern.
+
+ 3) We need to inform the demuxer that it should flush out any pending data and
+ start creating the start of a new file with the keyframe as a first video
+ frame.
+
+ 4) We need to inform the sink element that it should start writing to the next
+ file. This requires application interaction to instruct the sink of the new
+ filename. The application should also be free to ignore the boundary and
+ continue to write to the existing file. The application will typically use
+ an event pad probe to detect the custom event.
+
+Implementation:
+
+ The implementation would consist of generating a GST_EVENT_CUSTOM_DOWNSTREAM
+ event that marks the keyframe boundary. This event is inserted into the
+ pipeline by the application upon a certain trigger. In the above use case this
+ trigger would be given by the element that detects the pattern, in the form of
+ an element message.
+
+ The custom event would travel further downstream to instruct encoder, muxer and
+ sink about the possible switch.
+
+ The information passed in the event consists of:
+
+ name: GstForceKeyUnit
+ (G_TYPE_UINT64)"timestamp" : the timestamp of the buffer that
+ triggered the event.
+ (G_TYPE_UINT64)"stream-time" : the stream position that triggered the
+ event.
+ (G_TYPE_UINT64)"running-time" : the running time of the stream when the
+ event was triggered.
+ (G_TYPE_BOOLEAN)"all-headers" : Send all headers, including those in
+ the caps or those sent at the start of
+ the stream.
+
+ .... : optional other data fields.
+
+ Note that this event is purely informational, no element is required to
+ perform an action but it should forward the event downstream, just like any
+ other event it does not handle.
+
+ Elements understanding the event should behave as follows:
+
+ 1) The video encoder receives the event before the next frame. Upon reception
+ of the event it schedules to encode the next frame as a keyframe.
+ Before pushing out the encoded keyframe it must push the GstForceKeyUnit
+ event downstream.
+
+ 2) The muxer receives the GstForceKeyUnit event and flushes out its current state,
+ preparing to produce data that can be used as a keyunit. Before pushing out
+ the new data it pushes the GstForceKeyUnit event downstream.
+
+ 3) The application receives the GstForceKeyUnit on a sink padprobe of the sink
+ and reconfigures the sink to make it perform new actions after receiving
+ the next buffer.
+
+
+Upstream
+--------
+
+When using RTP packets can get lost or receivers can be added at any time,
+they may request a new key frame.
+
+An downstream element sends an upstream "GstForceKeyUnit" event up the
+pipeline.
+
+When an element produces some kind of key unit in output, but has
+no such concept in its input (like an encoder that takes raw frames),
+it consumes the event (doesn't pass it upstream), and instead sends
+a downstream GstForceKeyUnit event and a new keyframe.
diff --git a/docs/design/draft-va.txt b/docs/design/draft-va.txt
new file mode 100644
index 0000000..a63a643
--- /dev/null
+++ b/docs/design/draft-va.txt
@@ -0,0 +1,111 @@
+Video Acceleration
+------------------
+
+Status:
+
+ DRAFT.
+
+Purpose:
+
+ Provide an standarized generic way to introduce Video Acceleration APIs in
+ already available elements instead of duplicating those into specialized ones.
+
+ Provide a mechanism for a light GstBuffer subclassing in order to be able
+ exchange VA related context and surfaces between elements.
+
+ Provide some basic primitives to be used in the elements keeping
+ the implementation of those in the backends of the helper library.
+
+ The motivation of this proposal is:
+ - to avoid multiple duplicty of code
+ - to avoid the use of GstBuffer subclassing and be more close to GstBuffer2
+ - to avoid the overhead that's introduced with subclassing/GType checks
+ - to permit multiple elements interact having a common standard
+
+Proposal:
+
+ video/x-raw-va
+
+ Light subclassing embeding an structure in the data field of a standard
+ GstBuffer.
+
+ struct {
+ context;
+ surface;
+ flags;
+ subpicture, x, y, w, h;
+ parent *
+ ...
+ } VASurface
+
+ GstVA helper library
+ --------------------
+
+ Common API that it's implemented by a backend for each VA API.
+
+ +-------+ +---------------+
+ | |----> | VDPAU backend |
+ | GstVA | +---------------+
+ | | +---------------+
+ | |----> | VAAPI backend |
+ +-------+ +---------------+
+
+ gst_va_init () : Iterate in the backends and try to initialize those, stops
+ when a backend is able to be created.
+
+ bool gst_va_available() : permit to query if there's VA available in runtime.
+
+ GstBuffer * gst_va_buffer_new (vacontext, vasurface, vaflags, parent*,
+ free_func*):
+ Create a new GstBuffer with the proper light subclass and store on it
+ the provided context, surface, flags...
+ - parent* and free_func* to implement a mechanism to return surfaces in
+ the pool driven by parent.
+
+ gst_va_buffer_get_context (GstBuffer *)
+ gst_va_buffer_get_surface (GstBuffer *)
+ gst_va_buffer_get_flags (GstBuffer *)
+ ....
+ Some public/private? accessors to be able recover fields from a VA GstBuffer
+ internal structure.
+
+ Primitives:
+
+ gst_va_render_display (GstBuffer * va, display, x, y, w, h, ...)
+ Put a surface in the screen at the specified position.
+
+ gst_va_render_pixmap (GstBuffer * va, pixmap *, w, h, ...)
+ Put a surface in a pixmap, to be used paired with GLX_texture_from_pixmap to
+ upload into a OpenGL texture.
+
+ gst_va_render_memory (GstBuffer * va, planes *, strides *, w, h, ...)
+ To pull back into main memory a VA surface.
+
+ gst_va_buffer_associate_subpicture (GstBuffer * va, GstBuffer * subpicture,
+ x, y, w, h,...)
+ Take a reference of subpicture and keep it in va internal structure.
+
+Use cases:
+
+ Instead of create a new specialized element for each API just change
+ a generic element once.
+
+ To add support for a new API just have to create a new backend.
+
+ xvimagesink
+ -----------
+
+ - In _setcaps negotiate accept VA kind of stream when gst_va_init and
+ gst_va_available tell us that we have hardware capable of it.
+
+ - In _render when the buffers have the VA flag render display it with
+ gst_va_render_display()
+
+ videomixer, dvdspu, textoverlay, ...
+ ------------------------------------
+
+ - In _setcaps negotiate accept VA kind of stream when gst_va_init and
+ gst_va_available tell us that we have hardware capable of it.
+
+ - Use gst_va_buffer_associate_subpicture () where necessary.
+
diff --git a/docs/design/part-playbin2.txt b/docs/design/part-playbin2.txt
new file mode 100644
index 0000000..195d048
--- /dev/null
+++ b/docs/design/part-playbin2.txt
@@ -0,0 +1,69 @@
+playbin2
+--------
+
+The purpose of this element is to decode and render the media contained in a
+given generic uri. The element extends GstPipeline and is typically used in
+playback situations.
+
+Required features:
+
+ - accept and play any valid uri. This includes
+ - rendering video/audio
+ - overlaying subtitles on the video
+ - optionally read external subtitle files
+ - allow for hardware (non raw) sinks
+ - selection of audio/video/subtitle streams based on language.
+ - perform network buffering/incremental download
+ - gapless playback
+ - support for visualisations with configurable sizes
+ - ability to reject files that are too big, or of a format that would require
+ too much CPU/memory usage.
+ - be very efficient with adding elements such as converters to reduce the
+ amount of negotiation that has to happen.
+ - handle chained oggs. This includes having support for dynamic pad add and
+ remove from a demuxer.
+
+Components
+----------
+
+* decodebin2
+
+ - performs the autoplugging of demuxers/decoders
+ - emits signals when for steering the autoplugging
+ - to decide if a non-raw media format is acceptable as output
+ - to sort the possible decoders for a non-raw format
+ - see also decodebin2 design doc
+
+* uridecodebin
+
+ - combination of a source to handle the given uri, an optional queueing element
+ and one or more decodebin2 elements to decode the non-raw streams.
+
+* playsink
+
+ - handles display of audio/video/text.
+ - has request audio/video/text input pad. There is only one sinkpad per type.
+ The requested pads define the configuration of the internal pipeline.
+ - allows for setting audio/video sinks or does automatic sink selection.
+ - allows for configuration of visualisation element.
+ - allows for enable/disable of visualisation, audio and video.
+
+* playbin2
+
+ - combination of one or more uridecodebin elements to read the uri and subtitle
+ uri.
+ - support for queuing new media to support gapless playback.
+ - handles stream selection.
+ - uses playsink to display.
+ - selection of sinks and configuration of uridecodebin with raw output formats.
+
+
+Gapless playback
+----------------
+
+playbin2 has an "about-to-finish" signal. The application should configure a new
+uri (and optional suburi) in the callback. When the current media finishes, this
+new media will be played next.
+
+
+
diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am
new file mode 100644
index 0000000..83e8039
--- /dev/null
+++ b/docs/libs/Makefile.am
@@ -0,0 +1,79 @@
+## Process this file with automake to produce Makefile.in
+
+# FIXME: fix the docs then remove this variable
+DOCS_ARE_INCOMPLETE_PLEASE_FIXME=yespleasedo
+
+# The name of the module, e.g. 'glib'.
+#DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@
+DOC_MODULE=gst-plugins-base-libs
+
+# for upload-doc.mak
+DOC=gst-plugins-base-libs
+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-libs/gst
+
+# Extra options to supply to gtkdoc-scan.
+SCAN_OPTIONS=--deprecated-guards="GST_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+MKDB_OPTIONS=--sgml-mode --output-format=xml
+
+# 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
+
+# Used for dependencies.
+HFILE_GLOB=$(top_srcdir)/gst-libs/gst/*/*.h
+CFILE_GLOB=$(top_srcdir)/gst-libs/gst/*/*.c
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = pbutils-private.h gsttageditingprivate.h id3v2.h \
+ kiss_fft_f32.h kiss_fft_f64.h kiss_fftr_f32.h kiss_fftr_f64.h \
+ kiss_fftr_s16.h kiss_fftr_s32.h kiss_fft_s16.h kiss_fft_s32.h \
+ _kiss_fft_guts_f32.h _kiss_fft_guts_f64.h _kiss_fft_guts_s16.h \
+ _kiss_fft_guts_s16.h _kiss_fft_guts_s32.h _kiss_fft_guts_s32.h \
+ interfaces-marshal.h pbutils-marshal.h
+
+
+# Images to copy into HTML directory.
+HTML_IMAGES =
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+content_files = compiling.sgml
+
+# 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_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -DGST_USE_UNSTABLE_API
+GTKDOC_LIBS = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/sdp/libgstsdp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(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
+DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+
+include $(top_srcdir)/common/gtk-doc.mak
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
new file mode 100644
index 0000000..e9bc35f
--- /dev/null
+++ b/docs/libs/Makefile.in
@@ -0,0 +1,931 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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
+
+###########################################################################
+# Everything below here is generic and you shouldn't need to change it.
+###########################################################################
+# thomas: except of course that we did
+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.mak \
+ $(top_srcdir)/common/upload-doc.mak
+subdir = docs/libs
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# FIXME: fix the docs then remove this variable
+DOCS_ARE_INCOMPLETE_PLEASE_FIXME = yespleasedo
+
+# The name of the module, e.g. 'glib'.
+#DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@
+DOC_MODULE = gst-plugins-base-libs
+
+# for upload-doc.mak
+DOC = gst-plugins-base-libs
+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-libs/gst
+
+# Extra options to supply to gtkdoc-scan.
+SCAN_OPTIONS = --deprecated-guards="GST_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+MKDB_OPTIONS = --sgml-mode --output-format=xml
+
+# 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
+
+
+# Used for dependencies.
+HFILE_GLOB = $(top_srcdir)/gst-libs/gst/*/*.h
+CFILE_GLOB = $(top_srcdir)/gst-libs/gst/*/*.c
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = pbutils-private.h gsttageditingprivate.h id3v2.h \
+ kiss_fft_f32.h kiss_fft_f64.h kiss_fftr_f32.h kiss_fftr_f64.h \
+ kiss_fftr_s16.h kiss_fftr_s32.h kiss_fft_s16.h kiss_fft_s32.h \
+ _kiss_fft_guts_f32.h _kiss_fft_guts_f64.h _kiss_fft_guts_s16.h \
+ _kiss_fft_guts_s16.h _kiss_fft_guts_s32.h _kiss_fft_guts_s32.h \
+ interfaces-marshal.h pbutils-marshal.h
+
+
+# Images to copy into HTML directory.
+HTML_IMAGES =
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+content_files = compiling.sgml
+
+# 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_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -DGST_USE_UNSTABLE_API
+GTKDOC_LIBS = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/sdp/libgstsdp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(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
+DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+
+# 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
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc.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/libs/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/libs/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
+ $(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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-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 \
+ maintainer-clean-local
+
+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 \
+ maintainer-clean-local 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
+
+@ENABLE_GTK_DOC_TRUE@all-local: html-build.stamp
+
+#### setup ####
+
+@ENABLE_GTK_DOC_TRUE@setup-build.stamp: $(content_files)
+@ENABLE_GTK_DOC_TRUE@ -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+@ENABLE_GTK_DOC_TRUE@ echo ' DOC Preparing build'; \
+@ENABLE_GTK_DOC_TRUE@ files=`echo $(DOC_MAIN_SGML_FILE) $(DOC_OVERRIDES) $(DOC_MODULE)-sections.txt $(DOC_MODULE).types $(content_files)`; \
+@ENABLE_GTK_DOC_TRUE@ if test "x$$files" != "x" ; then \
+@ENABLE_GTK_DOC_TRUE@ for file in $$files ; do \
+@ENABLE_GTK_DOC_TRUE@ test -f $(abs_srcdir)/$$file && \
+@ENABLE_GTK_DOC_TRUE@ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+@ENABLE_GTK_DOC_TRUE@ done; \
+@ENABLE_GTK_DOC_TRUE@ fi; \
+@ENABLE_GTK_DOC_TRUE@ fi
+@ENABLE_GTK_DOC_TRUE@ @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
+@ENABLE_GTK_DOC_TRUE@scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Scanning header files'
+@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@ @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null; then \
+@ENABLE_GTK_DOC_TRUE@ echo " DOC Introspecting gobjects"; \
+@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd` \
+@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_PATH= \
+@ENABLE_GTK_DOC_TRUE@ GST_REGISTRY=doc-registry.xml \
+@ENABLE_GTK_DOC_TRUE@ $(GTKDOC_EXTRA_ENVIRONMENT) \
+@ENABLE_GTK_DOC_TRUE@ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \
+@ENABLE_GTK_DOC_TRUE@ CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" \
+@ENABLE_GTK_DOC_TRUE@ LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+@ENABLE_GTK_DOC_TRUE@ gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)" \
+@ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) ; \
+@ENABLE_GTK_DOC_TRUE@ else \
+@ENABLE_GTK_DOC_TRUE@ for i in $(SCANOBJ_FILES) ; do \
+@ENABLE_GTK_DOC_TRUE@ test -f $$i || touch $$i ; \
+@ENABLE_GTK_DOC_TRUE@ done \
+@ENABLE_GTK_DOC_TRUE@ fi
+@ENABLE_GTK_DOC_TRUE@ @touch scan-build.stamp
+
+@ENABLE_GTK_DOC_TRUE@$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+@ENABLE_GTK_DOC_TRUE@ @true
+
+#### xml ####
+
+@ENABLE_GTK_DOC_TRUE@sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files)
+@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building XML'
+@ENABLE_GTK_DOC_TRUE@ @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)
+@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 -pr xml html
+@ENABLE_GTK_DOC_TRUE@ @cp ../version.entities ./
+@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@ @gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
+@ENABLE_GTK_DOC_TRUE@ if test "$(?)" = "0"; then \
+@ENABLE_GTK_DOC_TRUE@ mkhtml_options=--path="$(abs_srcdir)"; \
+@ENABLE_GTK_DOC_TRUE@ fi; \
+@ENABLE_GTK_DOC_TRUE@ cd html && gtkdoc-mkhtml $$mkhtml_options $(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 -rf html/xml
+@ENABLE_GTK_DOC_TRUE@ @rm -f version.entities
+@ENABLE_GTK_DOC_TRUE@ @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html )
+@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 $(DOC_MODULE).types; \
+@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_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
+#
+@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
+
+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:
+
+# 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/libs/compiling.sgml b/docs/libs/compiling.sgml
new file mode 100644
index 0000000..70a130c
--- /dev/null
+++ b/docs/libs/compiling.sgml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+]>
+<refentry id="compiling" revision="17 Jan 2002">
+<refmeta>
+<refentrytitle>Compiling</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GStreamer-Base Library</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Compiling against the base plugins libraries</refname>
+<refpurpose>
+How to compile against the base plugins libraries
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Compiling against the base plugins libraries</title>
+
+<para>
+To compile against these libraries, you need to tell the compiler where to
+find the header files and libraries. This is done with the
+<application>pkg-config</application> utility.
+</para>
+<para>
+The following interactive shell session demonstrates how
+<application>pkg-config</application> is used:
+<programlisting>
+$ pkg-config --cflags gstreamer-plugins-base-&GST_MAJORMINOR;
+-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -pthread -I/usr/include/gstreamer-&GST_MAJORMINOR; -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libxml2
+$ pkg-config --libs gstreamer-plugins-base-&GST_MAJORMINOR;
+-Wl,--export-dynamic -pthread -lgstreamer-&GST_MAJORMINOR; -lgobject-2.0 -lgmodule-2.0 -ldl -lgthread-2.0 -lxml2 -lpthread -lz -lm -lglib-2.0
+</programlisting>
+</para>
+
+<para>
+Note that, because of the number of libraries provided in this package,
+the pkg-config information <emphasis>does not add -l flags</emphasis> itself
+to choose the libraries to link to. You must add these yourself to select
+which of the libraries you want to use.
+</para>
+</refsect1>
+
+</refentry>
diff --git a/docs/libs/gst-plugins-base-libs-docs.sgml b/docs/libs/gst-plugins-base-libs-docs.sgml
new file mode 100644
index 0000000..b470767
--- /dev/null
+++ b/docs/libs/gst-plugins-base-libs-docs.sgml
@@ -0,0 +1,238 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>GStreamer Base Plugins &GST_MAJORMINOR; Library Reference Manual</title>
+ <releaseinfo>
+ for GStreamer Base Library &GST_MAJORMINOR; (&GST_VERSION;)
+ <ulink role="online-location" url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/</ulink>.
+ </releaseinfo>
+ </bookinfo>
+
+ <part id="gstreamer-plugins-base">
+ <title>GStreamer Base Plugins Libraries</title>
+ <para>
+ This manual describes the libraries provided by the GStreamer Base Plugins
+ package.
+ </para>
+ <xi:include href="compiling.sgml" />
+
+ <chapter id="gstreamer-app">
+ <title>App Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstapp-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <para>
+ To use it the functionality, insert an appsrc or appsink element into a pipeline and call the appropriate functions on the element.
+ </para>
+ <xi:include href="xml/gstappsrc.xml" />
+ <xi:include href="xml/gstappsink.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-audio">
+ <title>Audio Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstaudio-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstaudio.xml" />
+ <xi:include href="xml/gstaudioclock.xml" />
+ <xi:include href="xml/gstaudiodecoder.xml" />
+ <xi:include href="xml/gstaudioencoder.xml" />
+ <xi:include href="xml/gstaudiofilter.xml" />
+ <xi:include href="xml/gstaudiomixerutils.xml" />
+ <xi:include href="xml/gstaudiosink.xml" />
+ <xi:include href="xml/gstaudiosrc.xml" />
+ <xi:include href="xml/gstbaseaudiosink.xml" />
+ <xi:include href="xml/gstbaseaudiosrc.xml" />
+ <xi:include href="xml/gstmultichannel.xml" />
+ <xi:include href="xml/gstringbuffer.xml" />
+ <xi:include href="xml/gstaudioiec61937.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-cdda">
+ <title>CDDA Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstcdda-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstcddabasesrc.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-ffft">
+ <title>FFT Library</title>
+ <para>
+ The gstfft library is based on
+ <ulink role="online-location" url="http://sourceforge.net/projects/kissfft">kissfft</ulink>
+ by Mark Borgerding.
+ </para>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstfft-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstfft.xml" />
+ <xi:include href="xml/gstffts16.xml" />
+ <xi:include href="xml/gstffts32.xml" />
+ <xi:include href="xml/gstfftf32.xml" />
+ <xi:include href="xml/gstfftf64.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-interfaces">
+ <title>Interfaces Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstinterfaces-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstcolorbalance.xml" />
+ <xi:include href="xml/gstcolorbalancechannel.xml" />
+ <xi:include href="xml/gstmixer.xml" />
+ <xi:include href="xml/gstmixeroptions.xml" />
+ <xi:include href="xml/gstmixertrack.xml" />
+ <xi:include href="xml/gstnavigation.xml" />
+ <xi:include href="xml/gstpropertyprobe.xml" />
+ <xi:include href="xml/gststreamvolume.xml" />
+ <xi:include href="xml/gsttuner.xml" />
+ <xi:include href="xml/gsttunerchannel.xml" />
+ <xi:include href="xml/gsttunernorm.xml" />
+ <xi:include href="xml/gstvideoorientation.xml" />
+ <xi:include href="xml/gstvideooverlay.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-netbuffer">
+ <title>Network Buffer Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstnetbuffer-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstnetbuffer.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-riff">
+ <title>Riff Media Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstriff-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstriff.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-rtp">
+ <title>RTP Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstrtp-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstbasertpaudiopayload.xml" />
+ <xi:include href="xml/gstbasertpdepayload.xml" />
+ <xi:include href="xml/gstbasertppayload.xml" />
+ <xi:include href="xml/gstrtpbuffer.xml" />
+ <xi:include href="xml/gstrtcpbuffer.xml" />
+ <xi:include href="xml/gstrtppayloads.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-rtsp">
+ <title>RTSP Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstrtsp-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstrtspbase64.xml" />
+ <xi:include href="xml/gstrtspconnection.xml" />
+ <xi:include href="xml/gstrtspdefs.xml" />
+ <xi:include href="xml/gstrtspextension.xml" />
+ <xi:include href="xml/gstrtspmessage.xml" />
+ <xi:include href="xml/gstrtsprange.xml" />
+ <xi:include href="xml/gstrtsptransport.xml" />
+ <xi:include href="xml/gstrtspurl.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-sdp">
+ <title>SDP Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstsdp-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstsdpmessage.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-tag">
+ <title>Tag Support Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgsttag-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gsttag.xml" />
+ <xi:include href="xml/gsttagvorbis.xml" />
+ <xi:include href="xml/gsttagid3.xml" />
+ <xi:include href="xml/gsttagexif.xml" />
+ <xi:include href="xml/gsttagxmp.xml" />
+ <xi:include href="xml/gsttagxmpwriter.xml" />
+ <xi:include href="xml/gsttagdemux.xml" />
+ <xi:include href="xml/gsttagmux.xml" />
+ <xi:include href="xml/gsttaglanguagecodes.xml" />
+ <xi:include href="xml/gsttaglicenses.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-base-utils">
+ <title>Base Utils Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstpbutils-&GST_MAJORMINOR;</filename> to the library
+ flags.
+ </para>
+ <xi:include href="xml/gstpbutils.xml" />
+ <xi:include href="xml/gstpluginsbaseversion.xml" />
+ <xi:include href="xml/gstpbutilscodecutils.xml" />
+ <xi:include href="xml/gstpbutilsdescriptions.xml" />
+ <xi:include href="xml/gstpbutilsmissingplugins.xml" />
+ <xi:include href="xml/gstpbutilsinstallplugins.xml" />
+ <xi:include href="xml/gstdiscoverer.xml" />
+ <xi:include href="xml/encoding-profile.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-video">
+ <title>Video Library</title>
+ <para>
+ This library should be linked to by getting cflags and libs from
+ <filename>gstreamer-plugins-base-&GST_MAJORMINOR;.pc</filename> and adding
+ <filename>-lgstvideo-&GST_MAJORMINOR;</filename> to the library flags.
+ </para>
+ <xi:include href="xml/gstvideo.xml" />
+ <xi:include href="xml/gstvideofilter.xml" />
+ <xi:include href="xml/gstvideosink.xml" />
+ </chapter>
+ </part>
+
+ <part id="gstreamer-libs-hierarchy">
+ <title>Object Hierarchy</title>
+ <xi:include href="xml/tree_index.sgml" />
+ </part>
+
+ <index id="api-index-full">
+ <title>Index</title>
+ <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
+ </index>
+ <index id="api-index-deprecated" role="deprecated">
+ <title>Index of deprecated API</title>
+ <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
+ </index>
+
+ <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+</book>
diff --git a/docs/libs/gst-plugins-base-libs-overrides.txt b/docs/libs/gst-plugins-base-libs-overrides.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/libs/gst-plugins-base-libs-overrides.txt
diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt
new file mode 100644
index 0000000..6272fef
--- /dev/null
+++ b/docs/libs/gst-plugins-base-libs-sections.txt
@@ -0,0 +1,2351 @@
+# app
+<SECTION>
+<FILE>gstappsrc</FILE>
+<TITLE>appsrc</TITLE>
+<INCLUDE>gst/app/gstappsrc.h</INCLUDE>
+GstAppStreamType
+gst_app_src_set_caps
+gst_app_src_get_caps
+gst_app_src_get_latency
+gst_app_src_set_latency
+gst_app_src_set_size
+gst_app_src_get_size
+gst_app_src_set_stream_type
+gst_app_src_get_stream_type
+gst_app_src_set_max_bytes
+gst_app_src_get_max_bytes
+gst_app_src_get_emit_signals
+gst_app_src_set_emit_signals
+GstAppSrcCallbacks
+gst_app_src_set_callbacks
+gst_app_src_push_buffer
+gst_app_src_end_of_stream
+<SUBSECTION Standard>
+GstAppSrcClass
+GST_APP_SRC
+GST_APP_SRC_CAST
+GST_IS_APP_SRC
+GST_TYPE_APP_SRC
+gst_app_src_get_type
+GST_APP_SRC_CLASS
+GST_IS_APP_SRC_CLASS
+GST_APP_BUFFER
+GST_APP_BUFFER_CLASS
+GST_IS_APP_BUFFER
+GST_IS_APP_BUFFER_CLASS
+GST_TYPE_APP_BUFFER
+GST_TYPE_APP_STREAM_TYPE
+gst_app_stream_type_get_type
+<SUBSECTION Private>
+GstAppSrc
+GstAppSrcPrivate
+GstAppBuffer
+GstAppBufferClass
+GstAppBufferFinalizeFunc
+gst_app_buffer_get_type
+gst_app_buffer_new
+</SECTION>
+
+<SECTION>
+<FILE>gstappsink</FILE>
+<TITLE>appsink</TITLE>
+<INCLUDE>gst/app/gstappsink.h</INCLUDE>
+gst_app_sink_set_caps
+gst_app_sink_get_caps
+gst_app_sink_is_eos
+gst_app_sink_set_emit_signals
+gst_app_sink_get_emit_signals
+gst_app_sink_set_max_buffers
+gst_app_sink_get_max_buffers
+gst_app_sink_set_drop
+gst_app_sink_get_drop
+gst_app_sink_pull_preroll
+gst_app_sink_pull_buffer
+gst_app_sink_pull_buffer_list
+GstAppSinkCallbacks
+gst_app_sink_set_callbacks
+<SUBSECTION Standard>
+GstAppSink
+GstAppSinkPrivate
+GstAppSinkClass
+GST_APP_SINK
+GST_APP_SINK_CAST
+GST_IS_APP_SINK
+GST_TYPE_APP_SINK
+gst_app_sink_get_type
+GST_APP_SINK_CLASS
+GST_IS_APP_SINK_CLASS
+</SECTION>
+
+# audio
+
+<SECTION>
+<FILE>gstaudio</FILE>
+<INCLUDE>gst/audio/audio.h</INCLUDE>
+GstAudioFlags
+GstAudioFormat
+GstAudioFormatFlags
+GstAudioFormatInfo
+GstAudioInfo
+gst_audio_info_init
+gst_audio_info_from_caps
+gst_audio_info_to_caps
+gst_audio_info_convert
+gst_audio_format_get_info
+GST_AUDIO_FORMAT_INFO_DEPTH
+GST_AUDIO_FORMAT_INFO_ENDIANNESS
+GST_AUDIO_FORMAT_INFO_FLAGS
+GST_AUDIO_FORMAT_INFO_FORMAT
+GST_AUDIO_FORMAT_INFO_IS_FLOAT
+GST_AUDIO_FORMAT_INFO_IS_INTEGER
+GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN
+GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN
+GST_AUDIO_FORMAT_INFO_IS_SIGNED
+GST_AUDIO_FORMAT_INFO_NAME
+GST_AUDIO_FORMAT_INFO_WIDTH
+GST_AUDIO_INFO_BPF
+GST_AUDIO_INFO_BPS
+GST_AUDIO_INFO_CHANNELS
+GST_AUDIO_INFO_DEPTH
+GST_AUDIO_INFO_FLAGS
+GST_AUDIO_INFO_FORMAT
+GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS
+GST_AUDIO_INFO_NAME
+GST_AUDIO_INFO_POSITION
+GST_AUDIO_INFO_RATE
+GST_AUDIO_INFO_WIDTH
+
+GST_FRAMES_TO_CLOCK_TIME
+GST_CLOCK_TIME_TO_FRAMES
+GST_AUDIO_DEF_RATE
+gst_audio_buffer_clip
+<SUBSECTION Standard>
+GST_TYPE_BUFFER_FORMAT
+GST_TYPE_BUFFER_FORMAT_TYPE
+gst_buffer_format_get_type
+gst_buffer_format_type_get_type
+<SUBSECTION Private>
+_GST_AUDIO_FORMAT_NE
+</SECTION>
+
+<SECTION>
+<FILE>gstaudioclock</FILE>
+<INCLUDE>gst/audio/gstaudioclock.h</INCLUDE>
+GstAudioClock
+GstAudioClockGetTimeFunc
+gst_audio_clock_new
+gst_audio_clock_new_full
+gst_audio_clock_adjust
+gst_audio_clock_get_time
+gst_audio_clock_reset
+gst_audio_clock_invalidate
+<SUBSECTION Standard>
+GstAudioClockClass
+GST_AUDIO_CLOCK
+GST_IS_AUDIO_CLOCK
+GST_TYPE_AUDIO_CLOCK
+gst_audio_clock_get_type
+GST_AUDIO_CLOCK_CLASS
+GST_IS_AUDIO_CLOCK_CLASS
+GST_AUDIO_CLOCK_CAST
+</SECTION>
+
+<SECTION>
+<FILE>gstaudiodecoder</FILE>
+<INCLUDE>gst/audio/gstaudiodecoder.h</INCLUDE>
+GstAudioDecoder
+GstAudioDecoderClass
+GST_AUDIO_DECODER_ERROR
+GST_AUDIO_DECODER_SINK_NAME
+GST_AUDIO_DECODER_SINK_PAD
+GST_AUDIO_DECODER_SRC_NAME
+GST_AUDIO_DECODER_SRC_PAD
+gst_audio_decoder_finish_frame
+gst_audio_decoder_get_audio_info
+gst_audio_decoder_get_byte_time
+gst_audio_decoder_get_delay
+gst_audio_decoder_get_latency
+gst_audio_decoder_get_max_errors
+gst_audio_decoder_get_min_latency
+gst_audio_decoder_get_parse_state
+gst_audio_decoder_get_plc
+gst_audio_decoder_get_plc_aware
+gst_audio_decoder_get_tolerance
+gst_audio_decoder_set_byte_time
+gst_audio_decoder_set_latency
+gst_audio_decoder_set_max_errors
+gst_audio_decoder_set_min_latency
+gst_audio_decoder_set_plc
+gst_audio_decoder_set_plc_aware
+gst_audio_decoder_set_tolerance
+<SUBSECTION Standard>
+GST_AUDIO_DECODER
+GST_IS_AUDIO_DECODER
+GST_TYPE_AUDIO_DECODER
+gst_audio_decoder_get_type
+GST_AUDIO_DECODER_CLASS
+GST_IS_AUDIO_DECODER_CLASS
+GST_AUDIO_DECODER_GET_CLASS
+GstAudioDecoderPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gstaudioencoder</FILE>
+<INCLUDE>gst/audio/gstaudioencoder.h</INCLUDE>
+GstAudioEncoder
+GstAudioEncoderClass
+GST_AUDIO_ENCODER_SEGMENT
+GST_AUDIO_ENCODER_SINK_NAME
+GST_AUDIO_ENCODER_SINK_PAD
+GST_AUDIO_ENCODER_SRC_NAME
+GST_AUDIO_ENCODER_SRC_PAD
+gst_audio_encoder_finish_frame
+gst_audio_encoder_get_audio_info
+gst_audio_encoder_get_frame_max
+gst_audio_encoder_get_frame_samples_min
+gst_audio_encoder_get_frame_samples_max
+gst_audio_encoder_get_hard_resync
+gst_audio_encoder_get_latency
+gst_audio_encoder_get_lookahead
+gst_audio_encoder_get_mark_granule
+gst_audio_encoder_get_perfect_timestamp
+gst_audio_encoder_get_tolerance
+gst_audio_encoder_proxy_getcaps
+gst_audio_encoder_set_frame_max
+gst_audio_encoder_set_frame_samples_min
+gst_audio_encoder_set_frame_samples_max
+gst_audio_encoder_set_hard_resync
+gst_audio_encoder_set_latency
+gst_audio_encoder_set_lookahead
+gst_audio_encoder_set_mark_granule
+gst_audio_encoder_set_perfect_timestamp
+gst_audio_encoder_set_tolerance
+<SUBSECTION Standard>
+GST_AUDIO_ENCODER
+GST_AUDIO_ENCODER_CAST
+GST_IS_AUDIO_ENCODER
+GST_TYPE_AUDIO_ENCODER
+gst_audio_encoder_get_type
+GST_AUDIO_ENCODER_CLASS
+GST_IS_AUDIO_ENCODER_CLASS
+GST_AUDIO_ENCODER_GET_CLASS
+GstAudioEncoderPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gstaudiofilter</FILE>
+<INCLUDE>gst/audio/gstaudiofilter.h</INCLUDE>
+GstAudioFilter
+GstAudioFilterClass
+gst_audio_filter_class_add_pad_templates
+<SUBSECTION Standard>
+GST_AUDIO_FILTER
+GST_IS_AUDIO_FILTER
+GST_TYPE_AUDIO_FILTER
+gst_audio_filter_get_type
+GST_AUDIO_FILTER_CLASS
+GST_IS_AUDIO_FILTER_CLASS
+GST_AUDIO_FILTER_CAST
+GST_AUDIO_FILTER_CLASS_CAST
+</SECTION>
+
+<SECTION>
+<FILE>gstaudiomixerutils</FILE>
+<INCLUDE>gst/audio/mixerutils.h</INCLUDE>
+GstAudioMixerFilterFunc
+gst_audio_default_registry_mixer_filter
+</SECTION>
+
+<SECTION>
+<FILE>gstaudiosink</FILE>
+<INCLUDE>gst/audio/gstaudiosink.h</INCLUDE>
+GstAudioSink
+GstAudioSinkClass
+<SUBSECTION Standard>
+GST_AUDIO_SINK
+GST_IS_AUDIO_SINK
+GST_TYPE_AUDIO_SINK
+gst_audio_sink_get_type
+GST_AUDIO_SINK_CLASS
+GST_IS_AUDIO_SINK_CLASS
+GST_AUDIO_SINK_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gstaudiosrc</FILE>
+<INCLUDE>gst/audio/gstaudiosrc.h</INCLUDE>
+GstAudioSrc
+GstAudioSrcClass
+<SUBSECTION Standard>
+GST_AUDIO_SRC
+GST_IS_AUDIO_SRC
+GST_TYPE_AUDIO_SRC
+gst_audio_src_get_type
+GST_AUDIO_SRC_CLASS
+GST_IS_AUDIO_SRC_CLASS
+GST_AUDIO_SRC_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gstbaseaudiosink</FILE>
+<INCLUDE>gst/audio/gstbaseaudiosink.h</INCLUDE>
+GstBaseAudioSink
+GstBaseAudioSinkClass
+GstBaseAudioSinkSlaveMethod
+
+GST_BASE_AUDIO_SINK_CLOCK
+GST_BASE_AUDIO_SINK_PAD
+gst_base_audio_sink_create_ringbuffer
+gst_base_audio_sink_set_provide_clock
+gst_base_audio_sink_get_provide_clock
+gst_base_audio_sink_set_slave_method
+gst_base_audio_sink_get_slave_method
+gst_base_audio_sink_get_drift_tolerance
+gst_base_audio_sink_set_drift_tolerance
+<SUBSECTION Standard>
+GST_BASE_AUDIO_SINK
+GST_IS_BASE_AUDIO_SINK
+GST_TYPE_BASE_AUDIO_SINK
+gst_base_audio_sink_get_type
+GST_BASE_AUDIO_SINK_CLASS
+GST_IS_BASE_AUDIO_SINK_CLASS
+GST_BASE_AUDIO_SINK_GET_CLASS
+GstBaseAudioSinkPrivate
+gst_base_audio_sink_slave_method_get_type
+GST_TYPE_BASE_AUDIO_SINK_SLAVE_METHOD
+</SECTION>
+
+<SECTION>
+<FILE>gstbaseaudiosrc</FILE>
+<INCLUDE>gst/audio/gstbaseaudiosrc.h</INCLUDE>
+GstBaseAudioSrc
+GstBaseAudioSrcClass
+GstBaseAudioSrcSlaveMethod
+
+GST_BASE_AUDIO_SRC_CLOCK
+GST_BASE_AUDIO_SRC_PAD
+gst_base_audio_src_create_ringbuffer
+gst_base_audio_src_set_provide_clock
+gst_base_audio_src_get_provide_clock
+gst_base_audio_src_get_slave_method
+gst_base_audio_src_set_slave_method
+<SUBSECTION Standard>
+GstBaseAudioSrcPrivate
+GST_BASE_AUDIO_SRC
+GST_IS_BASE_AUDIO_SRC
+GST_TYPE_BASE_AUDIO_SRC
+gst_base_audio_src_get_type
+GST_BASE_AUDIO_SRC_CLASS
+GST_IS_BASE_AUDIO_SRC_CLASS
+GST_BASE_AUDIO_SRC_GET_CLASS
+gst_base_audio_src_slave_method_get_type
+GST_TYPE_BASE_AUDIO_SRC_SLAVE_METHOD
+</SECTION>
+
+<SECTION>
+<FILE>gstmultichannel</FILE>
+<INCLUDE>gst/audio/multichannel.h</INCLUDE>
+GstAudioChannelPosition
+gst_audio_fixate_channel_positions
+gst_audio_get_channel_positions
+gst_audio_set_caps_channel_positions_list
+gst_audio_set_channel_positions
+gst_audio_set_structure_channel_positions_list
+gst_audio_check_channel_positions
+<SUBSECTION Standard>
+GST_TYPE_AUDIO_CHANNEL_POSITION
+gst_audio_channel_position_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstringbuffer</FILE>
+<INCLUDE>gst/audio/gstringbuffer.h</INCLUDE>
+GstRingBuffer
+GstRingBufferClass
+GstRingBufferSpec
+GstRingBufferCallback
+GstRingBufferSegState
+GstRingBufferState
+GstBufferFormatType
+
+GST_RING_BUFFER_BROADCAST
+GST_RING_BUFFER_GET_COND
+GST_RING_BUFFER_SIGNAL
+GST_RING_BUFFER_WAIT
+
+gst_ring_buffer_set_callback
+
+gst_ring_buffer_acquire
+gst_ring_buffer_release
+gst_ring_buffer_is_acquired
+
+gst_ring_buffer_activate
+gst_ring_buffer_is_active
+
+gst_ring_buffer_start
+gst_ring_buffer_pause
+gst_ring_buffer_stop
+
+gst_ring_buffer_delay
+gst_ring_buffer_samples_done
+gst_ring_buffer_set_sample
+gst_ring_buffer_commit
+gst_ring_buffer_commit_full
+gst_ring_buffer_convert
+
+gst_ring_buffer_prepare_read
+gst_ring_buffer_read
+gst_ring_buffer_clear
+gst_ring_buffer_clear_all
+gst_ring_buffer_advance
+
+gst_ring_buffer_close_device
+gst_ring_buffer_open_device
+gst_ring_buffer_device_is_open
+
+gst_ring_buffer_may_start
+gst_ring_buffer_parse_caps
+gst_ring_buffer_set_flushing
+
+<SUBSECTION Standard>
+GST_TYPE_RING_BUFFER
+GST_RING_BUFFER
+GST_RING_BUFFER_CLASS
+GST_RING_BUFFER_GET_CLASS
+GST_IS_RING_BUFFER
+GST_IS_RING_BUFFER_CLASS
+GST_RING_BUFFER_CAST
+gst_ring_buffer_get_type
+GST_TYPE_RING_BUFFER_SEG_STATE
+gst_ring_buffer_seg_state_get_type
+GST_TYPE_RING_BUFFER_STATE
+gst_ring_buffer_state_get_type
+<SUBSECTION Private>
+gst_ring_buffer_debug_spec_buff
+gst_ring_buffer_debug_spec_caps
+</SECTION>
+
+<SECTION>
+<FILE>gstaudioiec61937</FILE>
+<INCLUDE>gst/audio/gstaudioiec61937.h</INCLUDE>
+gst_audio_iec61937_frame_size
+gst_audio_iec61937_payload
+</SECTION>
+
+
+# cdda
+
+<SECTION>
+<FILE>gstcddabasesrc</FILE>
+<INCLUDE>gst/cdda/gstcddabasesrc.h</INCLUDE>
+GstCddaBaseSrc
+GstCddaBaseSrcClass
+GstCddaBaseSrcTrack
+GstCddaBaseSrcMode
+gst_cdda_base_src_add_track
+<SUBSECTION Standard>
+GST_TYPE_CDDA_BASE_SRC_MODE
+gst_cdda_base_src_mode_get_type
+GST_CDDA_BASE_SRC
+GST_CDDA_BASE_SRC_CLASS
+GST_CDDA_BASE_SRC_GET_CLASS
+GST_IS_CDDA_BASE_SRC
+GST_IS_CDDA_BASE_SRC_CLASS
+GST_TYPE_CDDA_BASE_SRC
+gst_cdda_base_src_get_type
+</SECTION>
+
+# fft
+
+<SECTION>
+<FILE>gstfft</FILE>
+<INCLUDE>gst/fft/gstfft.h</INCLUDE>
+GstFFTWindow
+gst_fft_next_fast_length
+</SECTION>
+
+<SECTION>
+<FILE>gstffts16</FILE>
+<INCLUDE>gst/fft/gstffts16.h</INCLUDE>
+GstFFTS16
+GstFFTS16Complex
+gst_fft_s16_new
+gst_fft_s16_fft
+gst_fft_s16_inverse_fft
+gst_fft_s16_window
+gst_fft_s16_free
+<SUBSECTION Standard>
+kiss_fft_s16
+kiss_fft_s16_alloc
+kiss_fft_s16_cfg
+kiss_fft_s16_cleanup
+kiss_fft_s16_cpx
+kiss_fft_s16_free
+kiss_fft_s16_next_fast_size
+kiss_fft_s16_scalar
+kiss_fft_s16_stride
+KISS_FFT_S16_COS
+KISS_FFT_S16_MALLOC
+KISS_FFT_S16_SIN
+</SECTION>
+
+<SECTION>
+<FILE>gstffts32</FILE>
+<INCLUDE>gst/fft/gstffts32.h</INCLUDE>
+GstFFTS32
+GstFFTS32Complex
+gst_fft_s32_new
+gst_fft_s32_fft
+gst_fft_s32_inverse_fft
+gst_fft_s32_window
+gst_fft_s32_free
+<SUBSECTION Standard>
+kiss_fft_s32
+kiss_fft_s32_alloc
+kiss_fft_s32_cfg
+kiss_fft_s32_cleanup
+kiss_fft_s32_cpx
+kiss_fft_s32_free
+kiss_fft_s32_next_fast_size
+kiss_fft_s32_scalar
+kiss_fft_s32_stride
+KISS_FFT_S32_COS
+KISS_FFT_S32_MALLOC
+KISS_FFT_S32_SIN
+
+</SECTION>
+
+<SECTION>
+<FILE>gstfftf32</FILE>
+<INCLUDE>gst/fft/gstfftf32.h</INCLUDE>
+GstFFTF32
+GstFFTF32Complex
+gst_fft_f32_new
+gst_fft_f32_fft
+gst_fft_f32_inverse_fft
+gst_fft_f32_window
+gst_fft_f32_free
+<SUBSECTION Standard>
+kiss_fft_f32
+kiss_fft_f32_alloc
+kiss_fft_f32_cfg
+kiss_fft_f32_cleanup
+kiss_fft_f32_cpx
+kiss_fft_f32_free
+kiss_fft_f32_next_fast_size
+kiss_fft_f32_scalar
+kiss_fft_f32_stride
+KISS_FFT_F32_COS
+KISS_FFT_F32_MALLOC
+KISS_FFT_F32_SIN
+</SECTION>
+
+<SECTION>
+<FILE>gstfftf64</FILE>
+<INCLUDE>gst/fft/gstfftf64.h</INCLUDE>
+GstFFTF64
+GstFFTF64Complex
+gst_fft_f64_new
+gst_fft_f64_fft
+gst_fft_f64_inverse_fft
+gst_fft_f64_window
+gst_fft_f64_free
+<SUBSECTION Standard>
+kiss_fft_f64
+kiss_fft_f64_alloc
+kiss_fft_f64_cfg
+kiss_fft_f64_cleanup
+kiss_fft_f64_cpx
+kiss_fft_f64_free
+kiss_fft_f64_next_fast_size
+kiss_fft_f64_scalar
+kiss_fft_f64_stride
+KISS_FFT_F64_COS
+KISS_FFT_F64_MALLOC
+KISS_FFT_F64_SIN
+</SECTION>
+
+# interfaces
+
+<SECTION>
+<FILE>gstcolorbalance</FILE>
+<INCLUDE>gst/interfaces/color.h</INCLUDE>
+GstColorBalance
+GstColorBalanceClass
+GstColorBalanceType
+gst_color_balance_list_channels
+gst_color_balance_get_value
+gst_color_balance_set_value
+gst_color_balance_value_changed
+gst_color_balance_get_balance_type
+<SUBSECTION Standard>
+GST_COLOR_BALANCE
+GST_COLOR_BALANCE_CLASS
+GST_COLOR_BALANCE_GET_CLASS
+GST_COLOR_BALANCE_TYPE
+GST_IS_COLOR_BALANCE
+GST_IS_COLOR_BALANCE_CLASS
+GST_TYPE_COLOR_BALANCE
+GST_TYPE_COLOR_BALANCE_TYPE
+gst_color_balance_get_type
+gst_color_balance_type_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcolorbalancechannel</FILE>
+<INCLUDE>gst/interfaces/colorbalancechannel.h</INCLUDE>
+GstColorBalanceChannel
+GstColorBalanceChannelClass
+<SUBSECTION Standard>
+GST_COLOR_BALANCE_CHANNEL
+GST_COLOR_BALANCE_CHANNEL_CLASS
+GST_IS_COLOR_BALANCE_CHANNEL
+GST_IS_COLOR_BALANCE_CHANNEL_CLASS
+GST_TYPE_COLOR_BALANCE_CHANNEL
+gst_color_balance_channel_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstmixer</FILE>
+<INCLUDE>gst/interfaces/mixer.h</INCLUDE>
+GstMixer
+GstMixerType
+GstMixerFlags
+GstMixerMessageType
+
+gst_mixer_list_tracks
+gst_mixer_get_volume
+gst_mixer_set_volume
+
+gst_mixer_set_mute
+gst_mixer_set_record
+gst_mixer_set_option
+
+gst_mixer_mute_toggled
+gst_mixer_record_toggled
+gst_mixer_volume_changed
+gst_mixer_option_changed
+gst_mixer_options_list_changed
+gst_mixer_get_option
+
+gst_mixer_mixer_changed
+
+gst_mixer_get_mixer_flags
+gst_mixer_get_mixer_type
+
+gst_mixer_message_get_type
+gst_mixer_message_parse_mute_toggled
+gst_mixer_message_parse_option_changed
+gst_mixer_message_parse_record_toggled
+gst_mixer_message_parse_volume_changed
+gst_mixer_message_parse_options_list_changed
+
+<SUBSECTION Standard>
+GstMixerClass
+GST_TYPE_MIXER
+GST_TYPE_MIXER_TYPE
+GST_TYPE_MIXER_FLAGS
+GST_TYPE_MIXER_MESSAGE_TYPE
+GST_MIXER
+GST_MIXER_CLASS
+GST_MIXER_GET_CLASS
+GST_MIXER_TYPE
+GST_IS_MIXER
+GST_IS_MIXER_CLASS
+GST_TYPE_STREAM_VOLUME_FORMAT
+gst_mixer_get_type
+gst_mixer_type_get_type
+gst_mixer_flags_get_type
+gst_mixer_message_type_get_type
+gst_stream_volume_format_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstmixeroptions</FILE>
+<INCLUDE>gst/interfaces/mixer.h</INCLUDE>
+GstMixerOptions
+gst_mixer_options_get_values
+<SUBSECTION Standard>
+GstMixerOptionsClass
+GST_TYPE_MIXER_OPTIONS
+GST_MIXER_OPTIONS
+GST_MIXER_OPTIONS_CLASS
+GST_IS_MIXER_OPTIONS
+GST_IS_MIXER_OPTIONS_CLASS
+GST_MIXER_OPTIONS_GET_CLASS
+gst_mixer_options_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstmixertrack</FILE>
+<INCLUDE>gst/interfaces/mixer.h</INCLUDE>
+GstMixerTrack
+GstMixerTrackFlags
+GST_MIXER_TRACK_HAS_FLAG
+<SUBSECTION Standard>
+GstMixerTrackClass
+GST_TYPE_MIXER_TRACK
+GST_TYPE_MIXER_TRACK_FLAGS
+GST_MIXER_TRACK
+GST_MIXER_TRACK_CLASS
+GST_IS_MIXER_TRACK
+GST_IS_MIXER_TRACK_CLASS
+gst_mixer_track_flags_get_type
+gst_mixer_track_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstnavigation</FILE>
+<INCLUDE>gst/interfaces/navigation.h</INCLUDE>
+GstNavigation
+GstNavigationInterface
+GstNavigationCommand
+GstNavigationEventType
+GstNavigationMessageType
+GstNavigationQueryType
+
+gst_navigation_send_event
+gst_navigation_send_key_event
+gst_navigation_send_mouse_event
+gst_navigation_send_command
+
+gst_navigation_event_parse_command
+gst_navigation_event_parse_key_event
+gst_navigation_event_parse_mouse_button_event
+gst_navigation_event_parse_mouse_move_event
+gst_navigation_message_get_type
+gst_navigation_message_new_angles_changed
+gst_navigation_message_new_commands_changed
+gst_navigation_message_new_mouse_over
+gst_navigation_message_parse_mouse_over
+gst_navigation_message_parse_angles_changed
+gst_navigation_query_new_angles
+gst_navigation_query_get_type
+gst_navigation_query_new_commands
+gst_navigation_query_parse_angles
+gst_navigation_query_parse_commands_length
+gst_navigation_query_parse_commands_nth
+gst_navigation_query_set_angles
+gst_navigation_query_set_commands
+gst_navigation_query_set_commandsv
+
+GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU
+GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU
+GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU
+GST_NAVIGATION_COMMAND_DVD_MENU
+GST_NAVIGATION_COMMAND_DVD_ROOT_MENU
+GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU
+GST_NAVIGATION_COMMAND_DVD_TITLE_MENU
+
+<SUBSECTION Standard>
+GST_TYPE_NAVIGATION
+GST_NAVIGATION
+GST_NAVIGATION_GET_IFACE
+GST_TYPE_NAVIGATION_COMMAND
+GST_TYPE_NAVIGATION_EVENT_TYPE
+GST_TYPE_NAVIGATION_MESSAGE_TYPE
+GST_TYPE_NAVIGATION_QUERY_TYPE
+GST_IS_NAVIGATION
+gst_navigation_get_type
+gst_navigation_event_get_type
+gst_navigation_event_type_get_type
+gst_navigation_message_type_get_type
+gst_navigation_query_type_get_type
+gst_navigation_command_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstpropertyprobe</FILE>
+<INCLUDE>gst/interfaces/propertyprobe.h</INCLUDE>
+GstPropertyProbe
+GstPropertyProbeInterface
+
+gst_property_probe_get_properties
+gst_property_probe_get_property
+gst_property_probe_get_values
+gst_property_probe_get_values_name
+gst_property_probe_needs_probe
+gst_property_probe_needs_probe_name
+gst_property_probe_probe_and_get_values
+gst_property_probe_probe_and_get_values_name
+gst_property_probe_probe_property
+gst_property_probe_probe_property_name
+<SUBSECTION Standard>
+GST_TYPE_PROPERTY_PROBE
+GST_PROPERTY_PROBE
+GST_PROPERTY_PROBE_GET_IFACE
+GST_IS_PROPERTY_PROBE
+gst_property_probe_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gststreamvolume</FILE>
+<INCLUDE>gst/interfaces/streamvolume.h</INCLUDE>
+GstStreamVolume
+GstStreamVolumeFormat
+
+gst_stream_volume_get_volume
+gst_stream_volume_set_volume
+
+gst_stream_volume_get_mute
+gst_stream_volume_set_mute
+
+gst_stream_volume_convert_volume
+
+<SUBSECTION Standard>
+GstStreamVolumeInterface
+GST_TYPE_STREAM_VOLUME
+GST_STREAM_VOLUME
+GST_STREAM_VOLUME_INTERFACE
+GST_STREAM_VOLUME_GET_INTERFACE
+GST_IS_STREAM_VOLUME
+GST_IS_STREAM_VOLUME_INTERFACE
+gst_stream_volume_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttuner</FILE>
+<INCLUDE>gst/interfaces/tuner.h</INCLUDE>
+GstTuner
+GstTunerClass
+
+gst_tuner_list_channels
+gst_tuner_get_channel
+gst_tuner_set_channel
+
+gst_tuner_list_norms
+gst_tuner_get_norm
+gst_tuner_set_norm
+
+gst_tuner_get_frequency
+gst_tuner_set_frequency
+gst_tuner_signal_strength
+
+gst_tuner_find_norm_by_name
+gst_tuner_find_channel_by_name
+
+gst_tuner_channel_changed
+gst_tuner_norm_changed
+gst_tuner_frequency_changed
+gst_tuner_signal_changed
+<SUBSECTION Standard>
+GST_TYPE_TUNER
+GST_TUNER
+GST_TUNER_CLASS
+GST_TUNER_GET_CLASS
+GST_IS_TUNER
+GST_IS_TUNER_CLASS
+gst_tuner_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttunerchannel</FILE>
+<INCLUDE>gst/interfaces/tuner.h</INCLUDE>
+GstTunerChannel
+GstTunerChannelFlags
+GST_TUNER_CHANNEL_HAS_FLAG
+<SUBSECTION Standard>
+GstTunerChannelClass
+GST_TYPE_TUNER_CHANNEL
+GST_TYPE_TUNER_CHANNEL_FLAGS
+GST_TUNER_CHANNEL
+GST_TUNER_CHANNEL_CLASS
+GST_IS_TUNER_CHANNEL
+GST_IS_TUNER_CHANNEL_CLASS
+gst_tuner_channel_flags_get_type
+gst_tuner_channel_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttunernorm</FILE>
+<INCLUDE>gst/interfaces/tuner.h</INCLUDE>
+GstTunerNorm
+<SUBSECTION Standard>
+GstTunerNormClass
+GST_TYPE_TUNER_NORM
+GST_TUNER_NORM
+GST_TUNER_NORM_CLASS
+GST_IS_TUNER_NORM
+GST_IS_TUNER_NORM_CLASS
+gst_tuner_norm_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstvideoorientation</FILE>
+<INCLUDE>gst/interfaces/videoorientation.h</INCLUDE>
+GstVideoOrientation
+GstVideoOrientationInterface
+gst_video_orientation_get_hcenter
+gst_video_orientation_get_hflip
+gst_video_orientation_get_vcenter
+gst_video_orientation_get_vflip
+gst_video_orientation_set_hcenter
+gst_video_orientation_set_hflip
+gst_video_orientation_set_vcenter
+gst_video_orientation_set_vflip
+<SUBSECTION Standard>
+GST_TYPE_VIDEO_ORIENTATION
+GST_VIDEO_ORIENTATION
+GST_IS_VIDEO_ORIENTATION
+GST_VIDEO_ORIENTATION_GET_IFACE
+gst_video_orientation_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstvideooverlay</FILE>
+<INCLUDE>gst/interfaces/videooverlay.h</INCLUDE>
+GstXOverlay
+GstXOverlayIface
+gst_video_overlay_got_window_handle
+gst_video_overlay_set_window_handle
+gst_video_overlay_prepare_window_handle
+gst_video_overlay_expose
+gst_video_overlay_handle_events
+gst_video_overlay_set_render_rectangle
+<SUBSECTION Standard>
+GST_TYPE_VIDEO_OVERLAY
+GST_VIDEO_OVERLAY
+GST_IS_VIDEO_OVERLAY
+GST_VIDEO_OVERLAY_GET_IFACE
+gst_video_overlay_get_type
+</SECTION>
+
+
+# netbuffer
+
+<SECTION>
+<FILE>gstnetbuffer</FILE>
+<INCLUDE>gst/netbuffer/gstnetbuffer.h</INCLUDE>
+GstNetBuffer
+GstNetType
+GST_NETADDRESS_MAX_LEN
+GstNetAddress
+
+gst_netbuffer_new
+gst_netaddress_get_net_type
+
+gst_netaddress_set_ip4_address
+gst_netaddress_get_ip4_address
+
+gst_netaddress_set_ip6_address
+gst_netaddress_get_ip6_address
+
+gst_netaddress_get_address_bytes
+gst_netaddress_set_address_bytes
+
+gst_netaddress_equal
+
+gst_netaddress_to_string
+<SUBSECTION Standard>
+GstNetBufferClass
+GST_TYPE_NETBUFFER
+GST_NETBUFFER
+GST_NETBUFFER_CLASS
+GST_NETBUFFER_GET_CLASS
+GST_IS_NETBUFFER
+GST_IS_NETBUFFER_CLASS
+gst_netbuffer_get_type
+</SECTION>
+
+
+# riff
+
+<SECTION>
+<FILE>gstriff</FILE>
+<INCLUDE>gst/riff/riff-media.h</INCLUDE>
+gst_riff_create_audio_caps
+gst_riff_create_audio_template_caps
+gst_riff_create_iavs_caps
+gst_riff_create_iavs_template_caps
+gst_riff_create_video_caps
+gst_riff_create_video_template_caps
+gst_riff_init
+gst_riff_parse_chunk
+gst_riff_parse_file_header
+gst_riff_parse_info
+gst_riff_parse_strf_auds
+gst_riff_parse_strf_iavs
+gst_riff_parse_strf_vids
+gst_riff_parse_strh
+gst_riff_read_chunk
+<SUBSECTION Standard>
+GST_RIFF_00
+GST_RIFF_0021
+GST_RIFF_0031
+GST_RIFF_0032
+GST_RIFF_00AM
+GST_RIFF_00__
+GST_RIFF_00db
+GST_RIFF_00dc
+GST_RIFF_00dx
+GST_RIFF_00id
+GST_RIFF_00iv
+GST_RIFF_00pc
+GST_RIFF_00rt
+GST_RIFF_00vc
+GST_RIFF_00xm
+GST_RIFF_00xx
+GST_RIFF_01
+GST_RIFF_01dc
+GST_RIFF_01pc
+GST_RIFF_01wb
+GST_RIFF_02
+GST_RIFF_03
+GST_RIFF_04
+GST_RIFF_05
+GST_RIFF_06
+GST_RIFF_07
+GST_RIFF_AURA
+GST_RIFF_BW10
+GST_RIFF_CCC
+GST_RIFF_CRAM
+GST_RIFF_CVID
+GST_RIFF_CYUV
+GST_RIFF_DIB
+GST_RIFF_DISP
+GST_RIFF_DIV3
+GST_RIFF_DMB1
+GST_RIFF_FCCH_MSVC
+GST_RIFF_FCCH_RLE
+GST_RIFF_FCCH_msvc
+GST_RIFF_FCC_auds
+GST_RIFF_FCC_iavs
+GST_RIFF_FCC_pads
+GST_RIFF_FCC_txts
+GST_RIFF_FCC_vidc
+GST_RIFF_FCC_vids
+GST_RIFF_FF00
+GST_RIFF_H263
+GST_RIFF_I420
+GST_RIFF_IDIT
+GST_RIFF_IJPG
+GST_RIFF_INFO_IARL
+GST_RIFF_INFO_IART
+GST_RIFF_INFO_ICMS
+GST_RIFF_INFO_ICMT
+GST_RIFF_INFO_ICOP
+GST_RIFF_INFO_ICRD
+GST_RIFF_INFO_ICRP
+GST_RIFF_INFO_IDIM
+GST_RIFF_INFO_IDPI
+GST_RIFF_INFO_IENG
+GST_RIFF_INFO_IGNR
+GST_RIFF_INFO_IKEY
+GST_RIFF_INFO_ILGT
+GST_RIFF_INFO_IMED
+GST_RIFF_INFO_INAM
+GST_RIFF_INFO_IPLT
+GST_RIFF_INFO_IPRD
+GST_RIFF_INFO_ISBJ
+GST_RIFF_INFO_ISFT
+GST_RIFF_INFO_ISHP
+GST_RIFF_INFO_ISRC
+GST_RIFF_INFO_ISRF
+GST_RIFF_INFO_ITCH
+GST_RIFF_ISBJ
+GST_RIFF_ISFT
+GST_RIFF_IV31
+GST_RIFF_IV32
+GST_RIFF_IV41
+GST_RIFF_IV50
+GST_RIFF_IYUV
+GST_RIFF_JPEG
+GST_RIFF_L263
+GST_RIFF_LIST_AVIX
+GST_RIFF_LIST_INFO
+GST_RIFF_LIST_adtl
+GST_RIFF_LIST_hdrl
+GST_RIFF_LIST_movi
+GST_RIFF_LIST_odml
+GST_RIFF_LIST_strl
+GST_RIFF_M263
+GST_RIFF_MJPG
+GST_RIFF_MPIX
+GST_RIFF_MVI1
+GST_RIFF_NONE
+GST_RIFF_PACK
+GST_RIFF_Q1_0
+GST_RIFF_RAW
+GST_RIFF_RGB
+GST_RIFF_RIFF_AVI
+GST_RIFF_RIFF_CDXA
+GST_RIFF_RIFF_WAVE
+GST_RIFF_RLE4
+GST_RIFF_RLE8
+GST_RIFF_RT21
+GST_RIFF_SFMC
+GST_RIFF_TAG_acid
+GST_RIFF_TAG_AVF0
+GST_RIFF_TAG_BEXT
+GST_RIFF_TAG_JUNK
+GST_RIFF_TAG_JUNQ
+GST_RIFF_TAG_LIST
+GST_RIFF_TAG_RIFF
+GST_RIFF_TAG_RIFX
+GST_RIFF_TAG_avih
+GST_RIFF_TAG_bext
+GST_RIFF_TAG_cue
+GST_RIFF_TAG_data
+GST_RIFF_TAG_dmlh
+GST_RIFF_TAG_fact
+GST_RIFF_TAG_fmt
+GST_RIFF_TAG_idx1
+GST_RIFF_TAG_plst
+GST_RIFF_TAG_strd
+GST_RIFF_TAG_strf
+GST_RIFF_TAG_strh
+GST_RIFF_TAG_strn
+GST_RIFF_TAG_vedt
+GST_RIFF_TRAN
+GST_RIFF_ULTI
+GST_RIFF_V422
+GST_RIFF_VDOW
+GST_RIFF_VIXL
+GST_RIFF_VSSH
+GST_RIFF_VYUY
+GST_RIFF_WHAM
+GST_RIFF_WINX
+GST_RIFF_WPY2
+GST_RIFF_XMPG
+GST_RIFF_Y41P
+GST_RIFF_YUV8
+GST_RIFF_YUV9
+GST_RIFF_YUY2
+GST_RIFF_YV12
+GST_RIFF_YVU9
+GST_RIFF_azpr
+GST_RIFF_bw10
+GST_RIFF_ccc
+GST_RIFF_cram
+GST_RIFF_cvid
+GST_RIFF_cyuv
+GST_RIFF_dmb1
+GST_RIFF_h263
+GST_RIFF_i263
+GST_RIFF_i420
+GST_RIFF_iv31
+GST_RIFF_iv32
+GST_RIFF_iv41
+GST_RIFF_iv50
+GST_RIFF_iyuv
+GST_RIFF_jpeg
+GST_RIFF_m263
+GST_RIFF_mJPG
+GST_RIFF_mvi1
+GST_RIFF_none
+GST_RIFF_pack
+GST_RIFF_rec
+GST_RIFF_rgb
+GST_RIFF_rle4
+GST_RIFF_rle8
+GST_RIFF_rpza
+GST_RIFF_rt21
+GST_RIFF_tran
+GST_RIFF_ulti
+GST_RIFF_v422
+GST_RIFF_vixl
+GST_RIFF_vyuy
+GST_RIFF_wham
+GST_RIFF_x263
+GST_RIFF_xmpg
+GST_RIFF_y41p
+GST_RIFF_yuy2
+GST_RIFF_yv12
+
+gst_riff_acid
+gst_riff_dmlh
+gst_riff_index_entry
+gst_riff_strf_auds
+gst_riff_strf_iavs
+gst_riff_strf_vids
+gst_riff_strh
+</SECTION>
+
+
+# rtp
+
+<SECTION>
+<FILE>gstbasertpaudiopayload</FILE>
+<INCLUDE>gst/rtp/gstbasertpaudiopayload.h</INCLUDE>
+GstBaseRTPAudioPayload
+GstBaseRTPAudioPayloadClass
+
+gst_base_rtp_audio_payload_set_frame_based
+gst_base_rtp_audio_payload_set_frame_options
+gst_base_rtp_audio_payload_set_sample_based
+gst_base_rtp_audio_payload_set_sample_options
+gst_base_rtp_audio_payload_get_adapter
+gst_base_rtp_audio_payload_push
+gst_base_rtp_audio_payload_flush
+gst_base_rtp_audio_payload_set_samplebits_options
+<SUBSECTION Standard>
+GST_TYPE_BASE_RTP_AUDIO_PAYLOAD
+GST_BASE_RTP_AUDIO_PAYLOAD
+GST_BASE_RTP_AUDIO_PAYLOAD_CLASS
+GST_IS_BASE_RTP_AUDIO_PAYLOAD
+GST_IS_BASE_RTP_AUDIO_PAYLOAD_CLASS
+GST_BASE_RTP_AUDIO_PAYLOAD_CAST
+gst_base_rtp_audio_payload_get_type
+GstBaseRTPAudioPayloadPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gstbasertpdepayload</FILE>
+<INCLUDE>gst/rtp/gstbasertpdepayload.h</INCLUDE>
+GstBaseRTPDepayload
+GstBaseRTPDepayloadClass
+
+GST_BASE_RTP_DEPAYLOAD_SINKPAD
+GST_BASE_RTP_DEPAYLOAD_SRCPAD
+
+gst_base_rtp_depayload_push
+gst_base_rtp_depayload_push_ts
+gst_base_rtp_depayload_push_list
+
+<SUBSECTION Standard>
+GstBaseRTPDepayloadPrivate
+GST_TYPE_BASE_RTP_DEPAYLOAD
+GST_BASE_RTP_DEPAYLOAD
+GST_BASE_RTP_DEPAYLOAD_CLASS
+GST_BASE_RTP_DEPAYLOAD_GET_CLASS
+GST_IS_BASE_RTP_DEPAYLOAD
+GST_IS_BASE_RTP_DEPAYLOAD_CLASS
+GST_BASE_RTP_PAYLOAD_CAST
+gst_base_rtp_depayload_get_type
+GstBaseRTPPayloadPrivate
+
+<SUBSECTION Private>
+QUEUE_LOCK_INIT
+QUEUE_LOCK_FREE
+QUEUE_LOCK
+QUEUE_UNLOCK
+</SECTION>
+
+<SECTION>
+<FILE>gstbasertppayload</FILE>
+<INCLUDE>gst/rtp/gstbasertppayload.h</INCLUDE>
+GstBaseRTPPayload
+GstBaseRTPPayloadClass
+
+GST_BASE_RTP_PAYLOAD_MTU
+GST_BASE_RTP_PAYLOAD_PT
+GST_BASE_RTP_PAYLOAD_SINKPAD
+GST_BASE_RTP_PAYLOAD_SRCPAD
+
+gst_basertppayload_is_filled
+gst_basertppayload_push
+gst_basertppayload_push_list
+gst_basertppayload_set_options
+gst_basertppayload_set_outcaps
+<SUBSECTION Standard>
+GST_TYPE_BASE_RTP_PAYLOAD
+GST_BASE_RTP_PAYLOAD
+GST_BASE_RTP_PAYLOAD_CLASS
+GST_BASE_RTP_PAYLOAD_GET_CLASS
+GST_IS_BASE_RTP_PAYLOAD
+GST_IS_BASE_RTP_PAYLOAD_CLASS
+gst_basertppayload_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstrtcpbuffer</FILE>
+<INCLUDE>gst/rtp/gstrtcpbuffer.h</INCLUDE>
+
+GST_RTCP_VERSION
+
+GST_RTCP_MAX_SDES
+GST_RTCP_MAX_BYE_SSRC_COUNT
+GST_RTCP_MAX_RB_COUNT
+GST_RTCP_MAX_SDES_ITEM_COUNT
+GST_RTCP_VALID_MASK
+GST_RTCP_VALID_VALUE
+
+GstRTCPType
+GstRTCPPacket
+GstRTCPSDESType
+GstRTCPFBType
+
+gst_rtcp_buffer_new_take_data
+gst_rtcp_buffer_new_copy_data
+
+gst_rtcp_buffer_validate_data
+gst_rtcp_buffer_validate
+
+gst_rtcp_buffer_new
+gst_rtcp_buffer_end
+
+gst_rtcp_buffer_get_packet_count
+gst_rtcp_buffer_get_first_packet
+gst_rtcp_packet_move_to_next
+gst_rtcp_buffer_add_packet
+gst_rtcp_packet_remove
+
+gst_rtcp_packet_get_padding
+gst_rtcp_packet_get_count
+gst_rtcp_packet_get_type
+gst_rtcp_packet_get_length
+
+gst_rtcp_packet_sr_get_sender_info
+gst_rtcp_packet_sr_set_sender_info
+
+gst_rtcp_packet_rr_get_ssrc
+gst_rtcp_packet_rr_set_ssrc
+
+gst_rtcp_packet_get_rb_count
+gst_rtcp_packet_get_rb
+gst_rtcp_packet_add_rb
+gst_rtcp_packet_set_rb
+
+gst_rtcp_packet_sdes_get_item_count
+gst_rtcp_packet_sdes_first_item
+gst_rtcp_packet_sdes_next_item
+gst_rtcp_packet_sdes_get_ssrc
+gst_rtcp_packet_sdes_first_entry
+gst_rtcp_packet_sdes_next_entry
+gst_rtcp_packet_sdes_get_entry
+gst_rtcp_packet_sdes_copy_entry
+
+gst_rtcp_packet_sdes_add_item
+gst_rtcp_packet_sdes_add_entry
+
+gst_rtcp_packet_bye_get_ssrc_count
+gst_rtcp_packet_bye_get_nth_ssrc
+gst_rtcp_packet_bye_add_ssrc
+gst_rtcp_packet_bye_add_ssrcs
+
+gst_rtcp_packet_bye_get_reason_len
+gst_rtcp_packet_bye_get_reason
+gst_rtcp_packet_bye_set_reason
+
+gst_rtcp_packet_fb_get_type
+gst_rtcp_packet_fb_set_type
+
+gst_rtcp_packet_fb_get_sender_ssrc
+gst_rtcp_packet_fb_set_sender_ssrc
+
+gst_rtcp_packet_fb_get_media_ssrc
+gst_rtcp_packet_fb_set_media_ssrc
+
+gst_rtcp_packet_fb_get_fci_length
+gst_rtcp_packet_fb_set_fci_length
+gst_rtcp_packet_fb_get_fci
+
+gst_rtcp_ntp_to_unix
+gst_rtcp_unix_to_ntp
+
+gst_rtcp_sdes_name_to_type
+gst_rtcp_sdes_type_to_name
+
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>gstrtppayloads</FILE>
+<INCLUDE>gst/rtp/gstrtppayload.h</INCLUDE>
+GstRTPPayload
+GST_RTP_PAYLOAD_IS_DYNAMIC
+
+GstRTPPayloadInfo
+
+gst_rtp_payload_info_for_name
+gst_rtp_payload_info_for_pt
+
+<SUBSECTION Standard>
+GST_RTP_PAYLOAD_DYNAMIC_STRING
+GST_RTP_PAYLOAD_G723_53_STRING
+GST_RTP_PAYLOAD_G723_63_STRING
+GST_RTP_PAYLOAD_G728_STRING
+GST_RTP_PAYLOAD_G729_STRING
+GST_RTP_PAYLOAD_GSM_STRING
+GST_RTP_PAYLOAD_H263_STRING
+GST_RTP_PAYLOAD_L16_MONO_STRING
+GST_RTP_PAYLOAD_L16_STEREO_STRING
+GST_RTP_PAYLOAD_MPA_STRING
+GST_RTP_PAYLOAD_MPV_STRING
+GST_RTP_PAYLOAD_PCMA_STRING
+GST_RTP_PAYLOAD_PCMU_STRING
+GST_RTP_PAYLOAD_TS41_STRING
+GST_RTP_PAYLOAD_TS48_STRING
+GST_RTP_PAYLOAD_1016_STRING
+GST_RTP_PAYLOAD_CELLB_STRING
+GST_RTP_PAYLOAD_CN_STRING
+GST_RTP_PAYLOAD_DVI4_11025_STRING
+GST_RTP_PAYLOAD_DVI4_16000_STRING
+GST_RTP_PAYLOAD_DVI4_22050_STRING
+GST_RTP_PAYLOAD_DVI4_8000_STRING
+GST_RTP_PAYLOAD_G721_STRING
+GST_RTP_PAYLOAD_G722_STRING
+GST_RTP_PAYLOAD_G723_53
+GST_RTP_PAYLOAD_G723_63
+GST_RTP_PAYLOAD_G723_STRING
+GST_RTP_PAYLOAD_H261_STRING
+GST_RTP_PAYLOAD_JPEG_STRING
+GST_RTP_PAYLOAD_LPC_STRING
+GST_RTP_PAYLOAD_MP2T_STRING
+GST_RTP_PAYLOAD_NV_STRING
+GST_RTP_PAYLOAD_QCELP_STRING
+GST_RTP_PAYLOAD_TS41
+GST_RTP_PAYLOAD_TS48
+</SECTION>
+
+<SECTION>
+<FILE>gstrtpbuffer</FILE>
+<INCLUDE>gst/rtp/gstrtpbuffer.h</INCLUDE>
+
+GST_RTP_VERSION
+
+gst_rtp_buffer_allocate_data
+
+gst_rtp_buffer_new_take_data
+gst_rtp_buffer_new_copy_data
+gst_rtp_buffer_new_allocate
+gst_rtp_buffer_new_allocate_len
+gst_rtp_buffer_list_from_buffer
+
+gst_rtp_buffer_calc_header_len
+gst_rtp_buffer_calc_packet_len
+gst_rtp_buffer_calc_payload_len
+
+gst_rtp_buffer_validate
+gst_rtp_buffer_validate_data
+
+gst_rtp_buffer_set_packet_len
+gst_rtp_buffer_get_packet_len
+
+gst_rtp_buffer_get_header_len
+
+gst_rtp_buffer_get_version
+gst_rtp_buffer_set_version
+
+gst_rtp_buffer_get_padding
+gst_rtp_buffer_set_padding
+gst_rtp_buffer_pad_to
+
+gst_rtp_buffer_get_extension
+gst_rtp_buffer_set_extension
+gst_rtp_buffer_get_extension_data
+
+gst_rtp_buffer_get_ssrc
+gst_rtp_buffer_set_ssrc
+
+gst_rtp_buffer_get_csrc_count
+gst_rtp_buffer_get_csrc
+gst_rtp_buffer_set_csrc
+
+gst_rtp_buffer_get_marker
+gst_rtp_buffer_set_marker
+
+gst_rtp_buffer_get_payload_type
+gst_rtp_buffer_set_payload_type
+
+gst_rtp_buffer_get_seq
+gst_rtp_buffer_set_seq
+
+gst_rtp_buffer_get_timestamp
+gst_rtp_buffer_set_timestamp
+
+gst_rtp_buffer_get_payload_buffer
+gst_rtp_buffer_get_payload_subbuffer
+gst_rtp_buffer_get_payload_len
+gst_rtp_buffer_get_payload
+
+gst_rtp_buffer_default_clock_rate
+gst_rtp_buffer_compare_seqnum
+gst_rtp_buffer_ext_timestamp
+gst_rtp_buffer_set_extension_data
+
+gst_rtp_buffer_list_validate
+
+gst_rtp_buffer_list_get_payload_len
+
+gst_rtp_buffer_list_get_payload_type
+gst_rtp_buffer_list_set_payload_type
+
+gst_rtp_buffer_list_get_seq
+gst_rtp_buffer_list_set_seq
+
+gst_rtp_buffer_list_get_ssrc
+gst_rtp_buffer_list_set_ssrc
+
+gst_rtp_buffer_list_get_timestamp
+gst_rtp_buffer_list_set_timestamp
+
+gst_rtp_buffer_get_extension_onebyte_header
+gst_rtp_buffer_get_extension_twobytes_header
+gst_rtp_buffer_add_extension_onebyte_header
+gst_rtp_buffer_add_extension_twobytes_header
+
+gst_rtp_buffer_list_get_extension_onebyte_header
+gst_rtp_buffer_list_get_extension_twobytes_header
+gst_rtp_buffer_list_add_extension_onebyte_header
+gst_rtp_buffer_list_add_extension_twobytes_header
+</SECTION>
+
+# rtsp
+<SECTION>
+<FILE>gstrtspdefs</FILE>
+<INCLUDE>gst/rtsp/gstrtspdefs.h</INCLUDE>
+GST_RTSP_CHECK
+GST_RTSP_AUTH_MAX
+GstRTSPEvent
+GstRTSPResult
+GstRTSPFamily
+GstRTSPState
+GstRTSPVersion
+GstRTSPMethod
+GstRTSPAuthMethod
+GstRTSPHeaderField
+GstRTSPStatusCode
+gst_rtsp_strresult
+gst_rtsp_method_as_text
+gst_rtsp_version_as_text
+gst_rtsp_header_as_text
+gst_rtsp_header_allow_multiple
+gst_rtsp_status_as_text
+gst_rtsp_options_as_text
+gst_rtsp_find_header_field
+gst_rtsp_find_method
+<SUBSECTION Standard>
+GST_TYPE_RTSP_AUTH_METHOD
+GST_TYPE_RTSP_EVENT
+GST_TYPE_RTSP_FAMILY
+GST_TYPE_RTSP_HEADER_FIELD
+GST_TYPE_RTSP_LOWER_TRANS
+GST_TYPE_RTSP_METHOD
+GST_TYPE_RTSP_RESULT
+GST_TYPE_RTSP_STATE
+GST_TYPE_RTSP_STATUS_CODE
+GST_TYPE_RTSP_URL
+GST_TYPE_RTSP_VERSION
+gst_rtsp_event_get_type
+gst_rtsp_auth_method_get_type
+gst_rtsp_family_get_type
+gst_rtsp_method_get_type
+gst_rtsp_result_get_type
+gst_rtsp_state_get_type
+gst_rtsp_status_code_get_type
+gst_rtsp_version_get_type
+gst_rtsp_header_field_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstrtsptransport</FILE>
+<INCLUDE>gst/rtsp/gstrtsptransport.h</INCLUDE>
+GstRTSPTransMode
+GstRTSPProfile
+GstRTSPRange
+GstRTSPLowerTrans
+GstRTSPTransport
+gst_rtsp_transport_new
+gst_rtsp_transport_init
+gst_rtsp_transport_parse
+gst_rtsp_transport_as_text
+gst_rtsp_transport_get_mime
+gst_rtsp_transport_get_manager
+gst_rtsp_transport_free
+<SUBSECTION Standard>
+gst_rtsp_lower_trans_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstrtspbase64</FILE>
+<INCLUDE>gst/rtsp/gstrtspbase64.h</INCLUDE>
+gst_rtsp_base64_encode
+gst_rtsp_base64_decode_ip
+</SECTION>
+
+<SECTION>
+<FILE>gstrtspconnection</FILE>
+<INCLUDE>gst/rtsp/gstrtspconnection.h</INCLUDE>
+GstRTSPConnection
+gst_rtsp_connection_create
+gst_rtsp_connection_create_from_fd
+gst_rtsp_connection_accept
+gst_rtsp_connection_connect
+gst_rtsp_connection_close
+gst_rtsp_connection_free
+
+gst_rtsp_connection_read
+gst_rtsp_connection_write
+gst_rtsp_connection_poll
+
+gst_rtsp_connection_send
+gst_rtsp_connection_receive
+
+gst_rtsp_connection_next_timeout
+gst_rtsp_connection_reset_timeout
+
+gst_rtsp_connection_flush
+
+gst_rtsp_connection_set_auth
+gst_rtsp_connection_set_auth_param
+gst_rtsp_connection_clear_auth_params
+
+gst_rtsp_connection_set_qos_dscp
+
+gst_rtsp_connection_set_ip
+gst_rtsp_connection_get_ip
+
+gst_rtsp_connection_get_url
+
+gst_rtsp_connection_set_tunneled
+gst_rtsp_connection_is_tunneled
+
+gst_rtsp_connection_get_tunnelid
+gst_rtsp_connection_do_tunnel
+
+gst_rtsp_connection_get_readfd
+gst_rtsp_connection_get_writefd
+gst_rtsp_connection_set_http_mode
+gst_rtsp_connection_set_proxy
+
+GstRTSPWatch
+GstRTSPWatchFuncs
+gst_rtsp_watch_new
+gst_rtsp_watch_unref
+gst_rtsp_watch_attach
+gst_rtsp_watch_reset
+gst_rtsp_watch_queue_message
+gst_rtsp_watch_queue_data
+gst_rtsp_watch_send_message
+gst_rtsp_watch_write_data
+</SECTION>
+
+<SECTION>
+<FILE>gstrtspextension</FILE>
+<INCLUDE>gst/rtsp/gstrtspextension.h</INCLUDE>
+GstRTSPExtension
+GstRTSPExtensionInterface
+<SUBSECTION Standard>
+GST_IS_RTSP_EXTENSION
+GST_RTSP_EXTENSION
+GST_RTSP_EXTENSION_GET_IFACE
+GST_TYPE_RTSP_EXTENSION
+gst_rtsp_extension_after_send
+gst_rtsp_extension_before_send
+gst_rtsp_extension_configure_stream
+gst_rtsp_extension_detect_server
+gst_rtsp_extension_get_transports
+gst_rtsp_extension_parse_sdp
+gst_rtsp_extension_receive_request
+gst_rtsp_extension_send
+gst_rtsp_extension_setup_media
+gst_rtsp_extension_stream_select
+gst_rtsp_extension_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstrtspmessage</FILE>
+<INCLUDE>gst/rtsp/gstrtspmessage.h</INCLUDE>
+GstRTSPMsgType
+GstRTSPMessage
+gst_rtsp_message_new
+gst_rtsp_message_init
+gst_rtsp_message_unset
+gst_rtsp_message_free
+gst_rtsp_message_get_type
+gst_rtsp_message_new_request
+gst_rtsp_message_init_request
+gst_rtsp_message_parse_request
+gst_rtsp_message_new_response
+gst_rtsp_message_init_response
+gst_rtsp_message_parse_response
+gst_rtsp_message_new_data
+gst_rtsp_message_init_data
+gst_rtsp_message_parse_data
+gst_rtsp_message_add_header
+gst_rtsp_message_take_header
+gst_rtsp_message_remove_header
+gst_rtsp_message_get_header
+gst_rtsp_message_append_headers
+gst_rtsp_message_set_body
+gst_rtsp_message_take_body
+gst_rtsp_message_get_body
+gst_rtsp_message_steal_body
+gst_rtsp_message_dump
+</SECTION>
+
+<SECTION>
+<FILE>gstrtspurl</FILE>
+<INCLUDE>gst/rtsp/gstrtspurl.h</INCLUDE>
+GST_RTSP_DEFAULT_PORT
+GstRTSPUrl
+gst_rtsp_url_parse
+gst_rtsp_url_copy
+gst_rtsp_url_free
+gst_rtsp_url_get_request_uri
+gst_rtsp_url_set_port
+gst_rtsp_url_get_port
+gst_rtsp_url_decode_path_components
+<SUBSECTION Standard>
+gst_rtsp_url_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstrtsprange</FILE>
+<INCLUDE>gst/rtsp/gstrtsrange.h</INCLUDE>
+GstRTSPRangeUnit
+GstRTSPTimeRange
+GstRTSPTime
+GstRTSPTimeType
+gst_rtsp_range_parse
+gst_rtsp_range_to_string
+gst_rtsp_range_free
+</SECTION>
+
+# sdp
+<SECTION>
+<FILE>gstsdpmessage</FILE>
+<INCLUDE>gst/sdp/gstsdpmessage.h</INCLUDE>
+GstSDPResult
+GstSDPOrigin
+GstSDPConnection
+GST_SDP_BWTYPE_CT
+GST_SDP_BWTYPE_AS
+GST_SDP_BWTYPE_EXT_PREFIX
+GST_SDP_BWTYPE_RR
+GST_SDP_BWTYPE_RS
+GST_SDP_BWTYPE_TIAS
+GstSDPBandwidth
+GstSDPTime
+GstSDPZone
+GstSDPKey
+GstSDPAttribute
+GstSDPMedia
+GstSDPMessage
+gst_sdp_message_new
+gst_sdp_message_init
+gst_sdp_message_uninit
+gst_sdp_message_free
+
+gst_sdp_message_parse_buffer
+gst_sdp_message_as_text
+
+gst_sdp_message_parse_uri
+gst_sdp_message_as_uri
+
+gst_sdp_address_is_multicast
+
+gst_sdp_message_get_version
+gst_sdp_message_set_version
+gst_sdp_message_get_origin
+gst_sdp_message_set_origin
+gst_sdp_message_get_session_name
+gst_sdp_message_set_session_name
+gst_sdp_message_get_information
+gst_sdp_message_set_information
+gst_sdp_message_get_uri
+gst_sdp_message_set_uri
+gst_sdp_message_emails_len
+gst_sdp_message_get_email
+gst_sdp_message_add_email
+gst_sdp_message_phones_len
+gst_sdp_message_get_phone
+gst_sdp_message_add_phone
+gst_sdp_message_get_connection
+gst_sdp_message_set_connection
+gst_sdp_message_bandwidths_len
+gst_sdp_message_get_bandwidth
+gst_sdp_message_add_bandwidth
+gst_sdp_message_times_len
+gst_sdp_message_get_time
+gst_sdp_message_add_time
+gst_sdp_message_zones_len
+gst_sdp_message_get_zone
+gst_sdp_message_add_zone
+gst_sdp_message_get_key
+gst_sdp_message_set_key
+gst_sdp_message_attributes_len
+gst_sdp_message_get_attribute
+gst_sdp_message_get_attribute_val
+gst_sdp_message_get_attribute_val_n
+gst_sdp_message_add_attribute
+gst_sdp_message_medias_len
+gst_sdp_message_get_media
+gst_sdp_message_add_media
+gst_sdp_message_dump
+
+gst_sdp_media_new
+gst_sdp_media_init
+gst_sdp_media_uninit
+gst_sdp_media_free
+gst_sdp_media_get_media
+gst_sdp_media_set_media
+gst_sdp_media_get_port
+gst_sdp_media_get_num_ports
+gst_sdp_media_set_port_info
+gst_sdp_media_get_proto
+gst_sdp_media_set_proto
+gst_sdp_media_formats_len
+gst_sdp_media_get_format
+gst_sdp_media_add_format
+gst_sdp_media_get_information
+gst_sdp_media_set_information
+gst_sdp_media_connections_len
+gst_sdp_media_get_connection
+gst_sdp_media_add_connection
+gst_sdp_media_bandwidths_len
+gst_sdp_media_get_bandwidth
+gst_sdp_media_add_bandwidth
+gst_sdp_media_get_key
+gst_sdp_media_set_key
+gst_sdp_media_attributes_len
+gst_sdp_media_get_attribute
+gst_sdp_media_get_attribute_val
+gst_sdp_media_get_attribute_val_n
+gst_sdp_media_add_attribute
+gst_sdp_media_as_text
+</SECTION>
+
+# tag
+
+<SECTION>
+<FILE>gsttag</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+GST_TAG_MUSICBRAINZ_TRACKID
+GST_TAG_MUSICBRAINZ_ARTISTID
+GST_TAG_MUSICBRAINZ_ALBUMID
+GST_TAG_MUSICBRAINZ_ALBUMARTISTID
+GST_TAG_MUSICBRAINZ_TRMID
+GST_TAG_MUSICBRAINZ_SORTNAME
+GST_TAG_CDDA_CDDB_DISCID
+GST_TAG_CDDA_CDDB_DISCID_FULL
+GST_TAG_CDDA_MUSICBRAINZ_DISCID
+GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL
+GST_TAG_CDDA_TRACK_TAGS
+GST_TAG_CMML_CLIP
+GST_TAG_CMML_HEAD
+GST_TAG_CMML_STREAM
+GST_TAG_CAPTURING_SHUTTER_SPEED
+GST_TAG_CAPTURING_FOCAL_RATIO
+GST_TAG_CAPTURING_FOCAL_LENGTH
+GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO
+GST_TAG_CAPTURING_ISO_SPEED
+GST_TAG_CAPTURING_EXPOSURE_PROGRAM
+GST_TAG_CAPTURING_EXPOSURE_MODE
+GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE
+GST_TAG_CAPTURING_GAIN_ADJUSTMENT
+GST_TAG_CAPTURING_WHITE_BALANCE
+GST_TAG_CAPTURING_CONTRAST
+GST_TAG_CAPTURING_SATURATION
+GST_TAG_CAPTURING_SHARPNESS
+GST_TAG_CAPTURING_FLASH_FIRED
+GST_TAG_CAPTURING_FLASH_MODE
+GST_TAG_CAPTURING_METERING_MODE
+GST_TAG_CAPTURING_SOURCE
+GST_TAG_CAPTURING_EXPOSURE_COMPENSATION
+GST_TAG_IMAGE_HORIZONTAL_PPI
+GST_TAG_IMAGE_VERTICAL_PPI
+GST_TAG_ID3V2_HEADER_SIZE
+gst_tag_register_musicbrainz_tags
+gst_tag_freeform_string_to_utf8
+gst_tag_parse_extended_comment
+gst_tag_image_data_to_image_buffer
+GstTagImageType
+<SUBSECTION Standard>
+GST_TYPE_TAG_IMAGE_TYPE
+gst_tag_image_type_get_type
+<SUBSECTION Private>
+GstTagEntryMatch
+</SECTION>
+
+<SECTION>
+<FILE>gsttagvorbis</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+<SUBSECTION>
+gst_tag_from_vorbis_tag
+gst_tag_to_vorbis_tag
+gst_vorbis_tag_add
+gst_tag_to_vorbis_comments
+<SUBSECTION>
+gst_tag_list_from_vorbiscomment_buffer
+gst_tag_list_to_vorbiscomment_buffer
+<SUBSECTION Standard>
+gst_vorbis_tag_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttagid3</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+<SUBSECTION>
+gst_tag_id3_genre_count
+gst_tag_id3_genre_get
+gst_tag_list_new_from_id3v1
+gst_tag_from_id3_tag
+gst_tag_from_id3_user_tag
+gst_tag_to_id3_tag
+gst_tag_list_add_id3_image
+gst_tag_get_id3v2_tag_size
+gst_tag_list_from_id3v2_tag
+</SECTION>
+
+<SECTION>
+<FILE>gsttagxmp</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+gst_tag_list_from_xmp_buffer
+gst_tag_list_to_xmp_buffer
+gst_tag_list_to_xmp_buffer_full
+gst_tag_xmp_list_schemas
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>gsttagexif</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+gst_tag_list_to_exif_buffer
+gst_tag_list_to_exif_buffer_with_tiff_header
+gst_tag_list_from_exif_buffer
+gst_tag_list_from_exif_buffer_with_tiff_header
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>gsttagdemux</FILE>
+<INCLUDE>gst/tag/gsttagdemux.h</INCLUDE>
+GstTagDemux
+GstTagDemuxClass
+GstTagDemuxResult
+<SUBSECTION Standard>
+GstTagDemuxPrivate
+GST_IS_TAG_DEMUX
+GST_IS_TAG_DEMUX_CLASS
+GST_TAG_DEMUX
+GST_TAG_DEMUX_CLASS
+GST_TYPE_TAG_DEMUX
+GST_TYPE_TAG_DEMUX_RESULT
+gst_tag_demux_get_type
+gst_tag_demux_result_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttagmux</FILE>
+<INCLUDE>gst/tag/gsttagmux.h</INCLUDE>
+GstTagMux
+GstTagMuxClass
+<SUBSECTION Standard>
+GstTagMuxPrivate
+GST_IS_TAG_MUX
+GST_IS_TAG_MUX_CLASS
+GST_TAG_MUX
+GST_TAG_MUX_CLASS
+GST_TYPE_TAG_MUX
+gst_tag_mux_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttaglanguagecodes</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+gst_tag_get_language_codes
+gst_tag_get_language_name
+gst_tag_get_language_code
+gst_tag_get_language_code_iso_639_1
+gst_tag_get_language_code_iso_639_2B
+gst_tag_get_language_code_iso_639_2T
+</SECTION>
+
+<SECTION>
+<FILE>gsttaglicenses</FILE>
+<INCLUDE>gst/tag/tag.h</INCLUDE>
+GstTagLicenseFlags
+gst_tag_get_license_flags
+gst_tag_get_license_nick
+gst_tag_get_license_title
+gst_tag_get_license_description
+gst_tag_get_license_jurisdiction
+gst_tag_get_license_version
+gst_tag_get_licenses
+<SUBSECTION Standard>
+gst_tag_license_flags_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttagxmpwriter</FILE>
+gst_tag_xmp_writer_add_all_schemas
+gst_tag_xmp_writer_add_schema
+gst_tag_xmp_writer_has_schema
+gst_tag_xmp_writer_remove_schema
+gst_tag_xmp_writer_remove_all_schemas
+gst_tag_xmp_writer_tag_list_to_xmp_buffer
+<SUBSECTION Standard>
+GstTagXmpWriter
+GstTagXmpWriterInterface
+GST_TYPE_TAG_XMP_WRITER
+GST_TAG_XMP_WRITER
+GST_TAG_XMP_WRITER_INTERFACE
+GST_IS_TAG_XMP_WRITER
+GST_IS_TAG_XMP_WRITER_INTERFACE
+GST_TAG_XMP_WRITER_GET_INTERFACE
+gst_tag_xmp_writer_get_type
+</SECTION>
+
+# base utils
+
+<SECTION>
+<FILE>gstpbutils</FILE>
+<INCLUDE>gst/pbutils/pbutils.h</INCLUDE>
+<SUBSECTION>
+gst_pb_utils_init
+</SECTION>
+
+<SECTION>
+<FILE>gstpluginsbaseversion</FILE>
+<INCLUDE>gst/pbutils/gstpluginsbaseversion.h</INCLUDE>
+<SUBSECTION>
+GST_PLUGINS_BASE_VERSION_MAJOR
+GST_PLUGINS_BASE_VERSION_MINOR
+GST_PLUGINS_BASE_VERSION_MICRO
+GST_PLUGINS_BASE_VERSION_NANO
+GST_CHECK_PLUGINS_BASE_VERSION
+gst_plugins_base_version
+gst_plugins_base_version_string
+</SECTION>
+
+<SECTION>
+<FILE>gstpbutilsmissingplugins</FILE>
+<INCLUDE>gst/pbutils/missing-plugins.h</INCLUDE>
+<SUBSECTION>
+gst_missing_plugin_message_get_installer_detail
+gst_missing_plugin_message_get_description
+gst_is_missing_plugin_message
+<SUBSECTION>
+gst_missing_decoder_message_new
+gst_missing_encoder_message_new
+gst_missing_uri_source_message_new
+gst_missing_uri_sink_message_new
+gst_missing_element_message_new
+<SUBSECTION>
+gst_missing_uri_source_installer_detail_new
+gst_missing_uri_sink_installer_detail_new
+gst_missing_element_installer_detail_new
+gst_missing_decoder_installer_detail_new
+gst_missing_encoder_installer_detail_new
+</SECTION>
+
+<SECTION>
+<FILE>gstpbutilsinstallplugins</FILE>
+<INCLUDE>gst/pbutils/install-plugins.h</INCLUDE>
+<SUBSECTION>
+GstInstallPluginsReturn
+GstInstallPluginsResultFunc
+gst_install_plugins_async
+gst_install_plugins_sync
+gst_install_plugins_return_get_name
+gst_install_plugins_installation_in_progress
+gst_install_plugins_supported
+<SUBSECTION>
+GstInstallPluginsContext
+gst_install_plugins_context_new
+gst_install_plugins_context_free
+gst_install_plugins_context_set_xid
+<SUBSECTION Standard>
+GST_TYPE_INSTALL_PLUGINS_CONTEXT
+GST_TYPE_INSTALL_PLUGINS_RETURN
+gst_install_plugins_context_get_type
+gst_install_plugins_return_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstpbutilsdescriptions</FILE>
+<INCLUDE>gst/pbutils/descriptions.h</INCLUDE>
+<SUBSECTION>
+gst_pb_utils_get_source_description
+gst_pb_utils_get_sink_description
+gst_pb_utils_get_decoder_description
+gst_pb_utils_get_encoder_description
+gst_pb_utils_get_element_description
+<SUBSECTION>
+gst_pb_utils_add_codec_description_to_tag_list
+gst_pb_utils_get_codec_description
+</SECTION>
+
+<SECTION>
+<FILE>gstpbutilscodecutils</FILE>
+<INCLUDE>gst/pbutils/codec-utils.h</INCLUDE>
+<SUBSECTION>
+gst_codec_utils_aac_get_sample_rate_from_index
+gst_codec_utils_aac_get_profile
+gst_codec_utils_aac_get_level
+gst_codec_utils_aac_caps_set_level_and_profile
+<SUBSECTION>
+gst_codec_utils_h264_get_profile
+gst_codec_utils_h264_get_level
+gst_codec_utils_h264_caps_set_level_and_profile
+gst_codec_utils_h264_get_level_idc
+<SUBSECTION>
+gst_codec_utils_mpeg4video_get_profile
+gst_codec_utils_mpeg4video_get_level
+gst_codec_utils_mpeg4video_caps_set_level_and_profile
+</SECTION>
+
+<SECTION>
+<FILE>encoding-profile</FILE>
+<INCLUDE>gst/pbutils/encoding-profile.h</INCLUDE>
+GstEncodingProfile
+gst_encoding_profile_unref
+gst_encoding_profile_ref
+gst_encoding_profile_find
+gst_encoding_profile_get_name
+gst_encoding_profile_get_description
+gst_encoding_profile_get_format
+gst_encoding_profile_get_preset
+gst_encoding_profile_get_presence
+gst_encoding_profile_get_restriction
+gst_encoding_profile_set_name
+gst_encoding_profile_set_description
+gst_encoding_profile_set_format
+gst_encoding_profile_set_preset
+gst_encoding_profile_set_restriction
+gst_encoding_profile_set_presence
+gst_encoding_profile_is_equal
+gst_encoding_profile_get_input_caps
+gst_encoding_profile_get_type_nick
+<SUBSECTION container>
+GstEncodingContainerProfile
+gst_encoding_container_profile_new
+gst_encoding_container_profile_add_profile
+gst_encoding_container_profile_contains_profile
+gst_encoding_container_profile_get_profiles
+<SUBSECTION audio>
+GstEncodingAudioProfile
+gst_encoding_audio_profile_new
+<SUBSECTION video>
+GstEncodingVideoProfile
+gst_encoding_video_profile_new
+gst_encoding_video_profile_get_pass
+gst_encoding_video_profile_get_variableframerate
+gst_encoding_video_profile_set_pass
+gst_encoding_video_profile_set_variableframerate
+<SUBSECTION targets>
+GST_ENCODING_CATEGORY_DEVICE
+GST_ENCODING_CATEGORY_ONLINE_SERVICE
+GST_ENCODING_CATEGORY_STORAGE_EDITING
+GST_ENCODING_CATEGORY_CAPTURE
+GstEncodingTarget
+gst_encoding_target_unref
+gst_encoding_target_ref
+gst_encoding_target_new
+gst_encoding_target_get_name
+gst_encoding_target_get_category
+gst_encoding_target_get_description
+gst_encoding_target_get_profiles
+gst_encoding_target_get_profile
+gst_encoding_target_add_profile
+gst_encoding_target_save
+gst_encoding_target_save_to_file
+gst_encoding_target_load
+gst_encoding_target_load_from_file
+gst_encoding_list_all_targets
+gst_encoding_list_available_categories
+<SUBSECTION Standard>
+GST_ENCODING_PROFILE
+GST_IS_ENCODING_PROFILE
+GST_TYPE_ENCODING_PROFILE
+gst_encoding_profile_get_type
+GST_ENCODING_TARGET
+GST_IS_ENCODING_TARGET
+GST_TYPE_ENCODING_TARGET
+gst_encoding_target_get_type
+GstEncodingProfileClass
+GST_TYPE_ENCODING_CONTAINER_PROFILE
+GST_ENCODING_CONTAINER_PROFILE
+gst_encoding_container_profile_get_type
+GST_TYPE_ENCODING_VIDEO_PROFILE
+GST_ENCODING_VIDEO_PROFILE
+GST_IS_ENCODING_VIDEO_PROFILE
+GstEncodingVideoProfileClass
+gst_encoding_video_profile_get_type
+GST_TYPE_ENCODING_AUDIO_PROFILE
+GST_ENCODING_AUDIO_PROFILE
+GST_IS_ENCODING_AUDIO_PROFILE
+GstEncodingAudioProfileClass
+gst_encoding_audio_profile_get_type
+GST_IS_ENCODING_CONTAINER_PROFILE
+GstEncodingContainerProfileClass
+GstEncodingTargetClass
+</SECTION>
+
+
+
+# video
+
+<SECTION>
+<FILE>gstvideo</FILE>
+<INCLUDE>gst/video/video.h</INCLUDE>
+GST_VIDEO_FPS_RANGE
+GST_VIDEO_SIZE_RANGE
+GstVideoFormat
+gst_video_calculate_display_ratio
+gst_video_format_to_fourcc
+gst_video_format_from_fourcc
+gst_video_parse_caps_palette
+GstVideoConvertFrameCallback
+gst_video_convert_frame
+gst_video_convert_frame_async
+gst_video_event_new_still_frame
+gst_video_event_parse_still_frame
+<SUBSECTION Standard>
+gst_video_format_get_type
+GST_TYPE_VIDEO_FORMAT
+</SECTION>
+
+<SECTION>
+<FILE>gstvideofilter</FILE>
+<INCLUDE>gst/video/gstvideofilter.h</INCLUDE>
+GstVideoFilter
+GstVideoFilterClass
+<SUBSECTION Standard>
+GST_TYPE_VIDEO_FILTER
+GST_VIDEO_FILTER
+GST_VIDEO_FILTER_CLASS
+GST_VIDEO_FILTER_GET_CLASS
+GST_IS_VIDEO_FILTER
+GST_IS_VIDEO_FILTER_CLASS
+gst_video_filter_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstvideosink</FILE>
+<INCLUDE>gst/video/gstvideosink.h</INCLUDE>
+GstVideoSink
+GstVideoSinkClass
+GstVideoRectangle
+GST_VIDEO_SINK_HEIGHT
+GST_VIDEO_SINK_PAD
+GST_VIDEO_SINK_WIDTH
+gst_video_sink_center_rect
+<SUBSECTION Standard>
+GstVideoSinkPrivate
+GST_TYPE_VIDEO_SINK
+GST_VIDEO_SINK
+GST_VIDEO_SINK_CAST
+GST_VIDEO_SINK_CLASS
+GST_VIDEO_SINK_GET_CLASS
+GST_IS_VIDEO_SINK
+GST_IS_VIDEO_SINK_CLASS
+gst_video_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstdiscoverer</FILE>
+<INCLUDE>gst/pbutils/pbutils.h</INCLUDE>
+<SUBSECTION>
+GstDiscoverer
+gst_discoverer_new
+gst_discoverer_start
+gst_discoverer_stop
+gst_discoverer_discover_uri
+gst_discoverer_discover_uri_async
+<SUBSECTION>
+GstDiscovererInfo
+GstDiscovererResult
+gst_discoverer_info_get_duration
+gst_discoverer_info_get_misc
+gst_discoverer_info_get_result
+gst_discoverer_info_get_stream_info
+gst_discoverer_info_get_stream_list
+gst_discoverer_info_get_tags
+gst_discoverer_info_get_uri
+gst_discoverer_info_get_seekable
+gst_discoverer_info_ref
+gst_discoverer_info_unref
+<SUBSECTION>
+GstDiscovererStreamInfo
+GstDiscovererContainerInfo
+GstDiscovererAudioInfo
+GstDiscovererVideoInfo
+GstDiscovererSubtitleInfo
+gst_discoverer_stream_info_get_caps
+gst_discoverer_stream_info_get_misc
+gst_discoverer_stream_info_get_next
+gst_discoverer_stream_info_get_previous
+gst_discoverer_stream_info_get_tags
+gst_discoverer_stream_info_ref
+gst_discoverer_stream_info_unref
+gst_discoverer_stream_info_list_free
+gst_discoverer_stream_info_get_stream_type_nick
+gst_discoverer_info_get_audio_streams
+gst_discoverer_info_get_container_streams
+gst_discoverer_info_get_streams
+gst_discoverer_info_get_subtitle_streams
+gst_discoverer_info_get_video_streams
+gst_discoverer_audio_info_get_bitrate
+gst_discoverer_audio_info_get_channels
+gst_discoverer_audio_info_get_depth
+gst_discoverer_audio_info_get_language
+gst_discoverer_audio_info_get_max_bitrate
+gst_discoverer_audio_info_get_sample_rate
+gst_discoverer_container_info_get_streams
+gst_discoverer_subtitle_info_get_language
+gst_discoverer_video_info_get_bitrate
+gst_discoverer_video_info_get_depth
+gst_discoverer_video_info_get_framerate_denom
+gst_discoverer_video_info_get_framerate_num
+gst_discoverer_video_info_get_height
+gst_discoverer_video_info_is_interlaced
+gst_discoverer_video_info_is_image
+gst_discoverer_video_info_get_max_bitrate
+gst_discoverer_video_info_get_par_denom
+gst_discoverer_video_info_get_par_num
+gst_discoverer_video_info_get_width
+<SUBSECTION Standard>
+GST_DISCOVERER
+GST_DISCOVERER_AUDIO_INFO
+GST_DISCOVERER_CLASS
+GST_DISCOVERER_CONTAINER_INFO
+GST_DISCOVERER_INFO
+GST_DISCOVERER_STREAM_INFO
+GST_DISCOVERER_VIDEO_INFO
+GST_DISCOVERER_SUBTITLE_INFO
+GST_IS_DISCOVERER
+GST_IS_DISCOVERER_INFO
+GST_IS_DISCOVERER_AUDIO_INFO
+GST_IS_DISCOVERER_CLASS
+GST_IS_DISCOVERER_CONTAINER_INFO
+GST_IS_DISCOVERER_STREAM_INFO
+GST_IS_DISCOVERER_VIDEO_INFO
+GST_IS_DISCOVERER_SUBTITLE_INFO
+GST_TYPE_DISCOVERER
+GST_TYPE_DISCOVERER_AUDIO_INFO
+GST_TYPE_DISCOVERER_CONTAINER_INFO
+GST_TYPE_DISCOVERER_INFO
+GST_TYPE_DISCOVERER_RESULT
+GST_TYPE_DISCOVERER_STREAM_INFO
+GST_TYPE_DISCOVERER_VIDEO_INFO
+GST_TYPE_DISCOVERER_SUBTITLE_INFO
+GstDiscovererAudioInfoClass
+GstDiscovererClass
+GstDiscovererContainerInfoClass
+GstDiscovererPrivate
+GstDiscovererStreamInfoClass
+GstDiscovererVideoInfoClass
+GstDiscovererSubtitleInfoClass
+GstDiscovererInfoClass
+gst_discoverer_audio_info_get_type
+gst_discoverer_container_info_get_type
+gst_discoverer_get_type
+gst_discoverer_info_get_type
+gst_discoverer_info_copy
+gst_discoverer_result_get_type
+gst_discoverer_stream_info_get_type
+gst_discoverer_subtitle_info_get_type
+gst_discoverer_video_info_get_type
+</SECTION>
+
+# private
+
+<SECTION>
+<FILE>private</FILE>
+<SUBSECTION Private>
+bind_textdomain_codeset
+bindtextdomain
+dcgettext
+dcngettext
+dgettext
+dngettext
+gettext
+gettext_noop
+ngettext
+textdomain
+_
+N_
+</SECTION>
diff --git a/docs/libs/gst-plugins-base-libs.types b/docs/libs/gst-plugins-base-libs.types
new file mode 100644
index 0000000..cce4c91
--- /dev/null
+++ b/docs/libs/gst-plugins-base-libs.types
@@ -0,0 +1,76 @@
+#include <gst/gst.h>
+
+
+#include <gst/audio/gstaudioclock.h>
+gst_audio_clock_get_type
+#include <gst/audio/gstaudiodecoder.h>
+gst_audio_decoder_get_type
+#include <gst/audio/gstaudioencoder.h>
+gst_audio_encoder_get_type
+#include <gst/audio/gstaudiofilter.h>
+gst_audio_filter_get_type
+#include <gst/audio/gstaudiosink.h>
+gst_audio_sink_get_type
+#include <gst/audio/gstaudiosrc.h>
+gst_audio_src_get_type
+#include <gst/audio/gstbaseaudiosink.h>
+gst_base_audio_sink_get_type
+#include <gst/audio/gstbaseaudiosrc.h>
+gst_base_audio_src_get_type
+#include <gst/audio/gstringbuffer.h>
+gst_ring_buffer_get_type
+
+
+#include <gst/cdda/gstcddabasesrc.h>
+gst_cdda_base_src_get_type
+
+
+#include <gst/interfaces/colorbalance.h>
+gst_color_balance_get_type
+gst_color_balance_channel_get_type
+#include <gst/interfaces/mixer.h>
+gst_mixer_get_type
+gst_mixer_options_get_type
+gst_mixer_track_get_type
+#include <gst/interfaces/navigation.h>
+gst_navigation_get_type
+#include <gst/interfaces/propertyprobe.h>
+gst_property_probe_get_type
+#include <gst/interfaces/tuner.h>
+gst_tuner_get_type
+gst_tuner_channel_get_type
+gst_tuner_norm_get_type
+#include <gst/interfaces/streamvolume.h>
+gst_stream_volume_get_type
+#include <gst/interfaces/videoorientation.h>
+gst_video_orientation_get_type
+#include <gst/interfaces/videooverlay.h>
+gst_video_overlay_get_type
+
+
+#include <gst/rtp/gstbasertpdepayload.h>
+gst_base_rtp_depayload_get_type
+#include <gst/rtp/gstbasertppayload.h>
+gst_basertppayload_get_type
+#include <gst/rtp/gstbasertpaudiopayload.h>
+gst_base_rtp_audio_payload_get_type
+
+
+#include <gst/video/gstvideofilter.h>
+gst_video_filter_get_type
+#include <gst/video/gstvideosink.h>
+gst_video_sink_get_type
+
+#include <gst/pbutils/pbutils.h>
+gst_discoverer_get_type
+
+#include <gst/pbutils/encoding-profile.h>
+#include <gst/pbutils/encoding-target.h>
+gst_encoding_profile_get_type
+gst_encoding_video_profile_get_type
+gst_encoding_video_profile_get_type
+gst_encoding_audio_profile_get_type
+gst_encoding_container_profile_get_type
+gst_encoding_target_get_type
+
+
diff --git a/docs/libs/html/annotation-glossary.html b/docs/libs/html/annotation-glossary.html
new file mode 100644
index 0000000..b035e01
--- /dev/null
+++ b/docs/libs/html/annotation-glossary.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Annotation Glossary</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="prev" href="api-index-deprecated.html" title="Index of deprecated API">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-deprecated.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td> </td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#glsO">O</a>
+  | 
+ <a class="shortcut" href="#glsS">S</a>
+  | 
+ <a class="shortcut" href="#glsA">A</a>
+  | 
+ <a class="shortcut" href="#glsC">C</a>
+  | 
+ <a class="shortcut" href="#glsT">T</a>
+  | 
+ <a class="shortcut" href="#glsE">E</a>
+  | 
+ <a class="shortcut" href="#glsT">T</a>
+</td></tr>
+</table>
+<div class="glossary">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsO"></a><h3 class="title">O</h3>
+<dt>
+<a name="annotation-glossterm-out"></a>out</dt>
+<dd><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
+<a name="glsS"></a><h3 class="title">S</h3>
+<dt>
+<a name="annotation-glossterm-scope%20async"></a>scope async</dt>
+<dd><p>The callback is valid until first called.</p></dd>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
+<dd><p>NULL is ok, both for passing and for returning.</p></dd>
+<a name="glsC"></a><h3 class="title">C</h3>
+<dt>
+<a name="annotation-glossterm-closure"></a>closure</dt>
+<dd><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20none"></a>transfer none</dt>
+<dd><p>Don't free data after the code is done.</p></dd>
+<a name="glsE"></a><h3 class="title">E</h3>
+<dt>
+<a name="annotation-glossterm-element-type"></a>element-type</dt>
+<dd><p>Generics and defining elements of containers and arrays.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
+<dd><p>Free data after the code is done.</p></dd>
+<dt>
+<a name="annotation-glossterm-type"></a>type</dt>
+<dd><p>Override the parsed C type with given type</p></dd>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/api-index-deprecated.html b/docs/libs/html/api-index-deprecated.html
new file mode 100644
index 0000000..f7a2206
--- /dev/null
+++ b/docs/libs/html/api-index-deprecated.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of deprecated API</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="prev" href="api-index-full.html" title="Index">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-full.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxR">R</a>
+  | 
+ <a class="shortcut" href="#idxT">T</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-deprecated"></a>Index of deprecated API</h2></div></div></div>
+<a name="idx"></a><a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-decode-ip" title="gst_rtsp_base64_decode_ip ()">gst_rtsp_base64_decode_ip</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">gstrtspbase64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-encode" title="gst_rtsp_base64_encode ()">gst_rtsp_base64_encode</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">gstrtspbase64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-data" title="gst_rtsp_watch_queue_data ()">gst_rtsp_watch_queue_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-message" title="gst_rtsp_watch_queue_message ()">gst_rtsp_watch_queue_message</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-SORTNAME:CAPS" title="GST_TAG_MUSICBRAINZ_SORTNAME">GST_TAG_MUSICBRAINZ_SORTNAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/api-index-full.html b/docs/libs/html/api-index-full.html
new file mode 100644
index 0000000..9c8b623
--- /dev/null
+++ b/docs/libs/html/api-index-full.html
@@ -0,0 +1,4403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="prev" href="gstreamer-libs-hierarchy.html" title="Part II. Object Hierarchy">
+<link rel="next" href="api-index-deprecated.html" title="Index of deprecated API">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-libs-hierarchy.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="api-index-deprecated.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxA">A</a>
+  | 
+ <a class="shortcut" href="#idxB">B</a>
+  | 
+ <a class="shortcut" href="#idxC">C</a>
+  | 
+ <a class="shortcut" href="#idxD">D</a>
+  | 
+ <a class="shortcut" href="#idxE">E</a>
+  | 
+ <a class="shortcut" href="#idxF">F</a>
+  | 
+ <a class="shortcut" href="#idxI">I</a>
+  | 
+ <a class="shortcut" href="#idxM">M</a>
+  | 
+ <a class="shortcut" href="#idxN">N</a>
+  | 
+ <a class="shortcut" href="#idxP">P</a>
+  | 
+ <a class="shortcut" href="#idxR">R</a>
+  | 
+ <a class="shortcut" href="#idxS">S</a>
+  | 
+ <a class="shortcut" href="#idxT">T</a>
+  | 
+ <a class="shortcut" href="#idxV">V</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-full"></a>Index</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks" title="GstAppSinkCallbacks">GstAppSinkCallbacks</a>, struct in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks" title="GstAppSrcCallbacks">GstAppSrcCallbacks</a>, struct in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType">GstAppStreamType</a>, enum in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-caps" title="gst_app_sink_get_caps ()">gst_app_sink_get_caps</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-drop" title="gst_app_sink_get_drop ()">gst_app_sink_get_drop</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-emit-signals" title="gst_app_sink_get_emit_signals ()">gst_app_sink_get_emit_signals</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-max-buffers" title="gst_app_sink_get_max_buffers ()">gst_app_sink_get_max_buffers</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()">gst_app_sink_is_eos</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" title="gst_app_sink_pull_buffer ()">gst_app_sink_pull_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer-list" title="gst_app_sink_pull_buffer_list ()">gst_app_sink_pull_buffer_list</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll" title="gst_app_sink_pull_preroll ()">gst_app_sink_pull_preroll</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-callbacks" title="gst_app_sink_set_callbacks ()">gst_app_sink_set_callbacks</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-caps" title="gst_app_sink_set_caps ()">gst_app_sink_set_caps</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-drop" title="gst_app_sink_set_drop ()">gst_app_sink_set_drop</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-emit-signals" title="gst_app_sink_set_emit_signals ()">gst_app_sink_set_emit_signals</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-max-buffers" title="gst_app_sink_set_max_buffers ()">gst_app_sink_set_max_buffers</a>, function in <a class="link" href="gst-plugins-base-libs-appsink.html" title="appsink">appsink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-end-of-stream" title="gst_app_src_end_of_stream ()">gst_app_src_end_of_stream</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-caps" title="gst_app_src_get_caps ()">gst_app_src_get_caps</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-emit-signals" title="gst_app_src_get_emit_signals ()">gst_app_src_get_emit_signals</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-latency" title="gst_app_src_get_latency ()">gst_app_src_get_latency</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-max-bytes" title="gst_app_src_get_max_bytes ()">gst_app_src_get_max_bytes</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-size" title="gst_app_src_get_size ()">gst_app_src_get_size</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-stream-type" title="gst_app_src_get_stream_type ()">gst_app_src_get_stream_type</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-push-buffer" title="gst_app_src_push_buffer ()">gst_app_src_push_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-callbacks" title="gst_app_src_set_callbacks ()">gst_app_src_set_callbacks</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-caps" title="gst_app_src_set_caps ()">gst_app_src_set_caps</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-emit-signals" title="gst_app_src_set_emit_signals ()">gst_app_src_set_emit_signals</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-latency" title="gst_app_src_set_latency ()">gst_app_src_set_latency</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-max-bytes" title="gst_app_src_set_max_bytes ()">gst_app_src_set_max_bytes</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-size" title="gst_app_src_set_size ()">gst_app_src_set_size</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-stream-type" title="gst_app_src_set_stream_type ()">gst_app_src_set_stream_type</a>, function in <a class="link" href="gst-plugins-base-libs-appsrc.html" title="appsrc">appsrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition">GstAudioChannelPosition</a>, enum in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock-struct" title="struct GstAudioClock">GstAudioClock</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()">GstAudioClockGetTimeFunc</a>, user_function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder-struct" title="struct GstAudioDecoder">GstAudioDecoder</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--min-latency" title='The "min-latency" property'>GstAudioDecoder:min-latency</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--plc" title='The "plc" property'>GstAudioDecoder:plc</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--tolerance" title='The "tolerance" property'>GstAudioDecoder:tolerance</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoderClass" title="struct GstAudioDecoderClass">GstAudioDecoderClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder-struct" title="struct GstAudioEncoder">GstAudioEncoder</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--hard-resync" title='The "hard-resync" property'>GstAudioEncoder:hard-resync</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--mark-granule" title='The "mark-granule" property'>GstAudioEncoder:mark-granule</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--perfect-timestamp" title='The "perfect-timestamp" property'>GstAudioEncoder:perfect-timestamp</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--tolerance" title='The "tolerance" property'>GstAudioEncoder:tolerance</a>, object property in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoderClass" title="struct GstAudioEncoderClass">GstAudioEncoderClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct" title="struct GstAudioFilter">GstAudioFilter</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html" title="gstaudiofilter">gstaudiofilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" title="struct GstAudioFilterClass">GstAudioFilterClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html" title="gstaudiofilter">gstaudiofilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFlags" title="enum GstAudioFlags">GstAudioFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat">GstAudioFormat</a>, enum in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags" title="enum GstAudioFormatFlags">GstAudioFormatFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo">GstAudioFormatInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo">GstAudioInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc" title="GstAudioMixerFilterFunc ()">GstAudioMixerFilterFunc</a>, user_function in <a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html" title="gstaudiomixerutils">gstaudiomixerutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink-struct" title="struct GstAudioSink">GstAudioSink</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiosink.html" title="gstaudiosink">gstaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSinkClass" title="struct GstAudioSinkClass">GstAudioSinkClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiosink.html" title="gstaudiosink">gstaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc-struct" title="struct GstAudioSrc">GstAudioSrc</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html" title="gstaudiosrc">gstaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrcClass" title="struct GstAudioSrcClass">GstAudioSrcClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html" title="gstaudiosrc">gstaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-buffer-clip" title="gst_audio_buffer_clip ()">gst_audio_buffer_clip</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-check-channel-positions" title="gst_audio_check_channel_positions ()">gst_audio_check_channel_positions</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-adjust" title="gst_audio_clock_adjust ()">gst_audio_clock_adjust</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-get-time" title="gst_audio_clock_get_time ()">gst_audio_clock_get_time</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-invalidate" title="gst_audio_clock_invalidate ()">gst_audio_clock_invalidate</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new" title="gst_audio_clock_new ()">gst_audio_clock_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new-full" title="gst_audio_clock_new_full ()">gst_audio_clock_new_full</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-reset" title="gst_audio_clock_reset ()">gst_audio_clock_reset</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">gstaudioclock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-ERROR:CAPS" title="GST_AUDIO_DECODER_ERROR()">GST_AUDIO_DECODER_ERROR</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-finish-frame" title="gst_audio_decoder_finish_frame ()">gst_audio_decoder_finish_frame</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-audio-info" title="gst_audio_decoder_get_audio_info ()">gst_audio_decoder_get_audio_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-byte-time" title="gst_audio_decoder_get_byte_time ()">gst_audio_decoder_get_byte_time</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-delay" title="gst_audio_decoder_get_delay ()">gst_audio_decoder_get_delay</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-latency" title="gst_audio_decoder_get_latency ()">gst_audio_decoder_get_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-max-errors" title="gst_audio_decoder_get_max_errors ()">gst_audio_decoder_get_max_errors</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-min-latency" title="gst_audio_decoder_get_min_latency ()">gst_audio_decoder_get_min_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-parse-state" title="gst_audio_decoder_get_parse_state ()">gst_audio_decoder_get_parse_state</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc" title="gst_audio_decoder_get_plc ()">gst_audio_decoder_get_plc</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc-aware" title="gst_audio_decoder_get_plc_aware ()">gst_audio_decoder_get_plc_aware</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-tolerance" title="gst_audio_decoder_get_tolerance ()">gst_audio_decoder_get_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-byte-time" title="gst_audio_decoder_set_byte_time ()">gst_audio_decoder_set_byte_time</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-latency" title="gst_audio_decoder_set_latency ()">gst_audio_decoder_set_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-max-errors" title="gst_audio_decoder_set_max_errors ()">gst_audio_decoder_set_max_errors</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-min-latency" title="gst_audio_decoder_set_min_latency ()">gst_audio_decoder_set_min_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc" title="gst_audio_decoder_set_plc ()">gst_audio_decoder_set_plc</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc-aware" title="gst_audio_decoder_set_plc_aware ()">gst_audio_decoder_set_plc_aware</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-tolerance" title="gst_audio_decoder_set_tolerance ()">gst_audio_decoder_set_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-NAME:CAPS" title="GST_AUDIO_DECODER_SINK_NAME">GST_AUDIO_DECODER_SINK_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-PAD:CAPS" title="GST_AUDIO_DECODER_SINK_PAD()">GST_AUDIO_DECODER_SINK_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-NAME:CAPS" title="GST_AUDIO_DECODER_SRC_NAME">GST_AUDIO_DECODER_SRC_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-PAD:CAPS" title="GST_AUDIO_DECODER_SRC_PAD()">GST_AUDIO_DECODER_SRC_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">gstaudiodecoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#gst-audio-default-registry-mixer-filter" title="gst_audio_default_registry_mixer_filter ()">gst_audio_default_registry_mixer_filter</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html" title="gstaudiomixerutils">gstaudiomixerutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-DEF-RATE:CAPS" title="GST_AUDIO_DEF_RATE">GST_AUDIO_DEF_RATE</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-finish-frame" title="gst_audio_encoder_finish_frame ()">gst_audio_encoder_finish_frame</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-audio-info" title="gst_audio_encoder_get_audio_info ()">gst_audio_encoder_get_audio_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-max" title="gst_audio_encoder_get_frame_max ()">gst_audio_encoder_get_frame_max</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-max" title="gst_audio_encoder_get_frame_samples_max ()">gst_audio_encoder_get_frame_samples_max</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-min" title="gst_audio_encoder_get_frame_samples_min ()">gst_audio_encoder_get_frame_samples_min</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-hard-resync" title="gst_audio_encoder_get_hard_resync ()">gst_audio_encoder_get_hard_resync</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-latency" title="gst_audio_encoder_get_latency ()">gst_audio_encoder_get_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-lookahead" title="gst_audio_encoder_get_lookahead ()">gst_audio_encoder_get_lookahead</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-mark-granule" title="gst_audio_encoder_get_mark_granule ()">gst_audio_encoder_get_mark_granule</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-perfect-timestamp" title="gst_audio_encoder_get_perfect_timestamp ()">gst_audio_encoder_get_perfect_timestamp</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-tolerance" title="gst_audio_encoder_get_tolerance ()">gst_audio_encoder_get_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-proxy-getcaps" title="gst_audio_encoder_proxy_getcaps ()">gst_audio_encoder_proxy_getcaps</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SEGMENT:CAPS" title="GST_AUDIO_ENCODER_SEGMENT()">GST_AUDIO_ENCODER_SEGMENT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-max" title="gst_audio_encoder_set_frame_max ()">gst_audio_encoder_set_frame_max</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-max" title="gst_audio_encoder_set_frame_samples_max ()">gst_audio_encoder_set_frame_samples_max</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-min" title="gst_audio_encoder_set_frame_samples_min ()">gst_audio_encoder_set_frame_samples_min</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-hard-resync" title="gst_audio_encoder_set_hard_resync ()">gst_audio_encoder_set_hard_resync</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-latency" title="gst_audio_encoder_set_latency ()">gst_audio_encoder_set_latency</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-lookahead" title="gst_audio_encoder_set_lookahead ()">gst_audio_encoder_set_lookahead</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-mark-granule" title="gst_audio_encoder_set_mark_granule ()">gst_audio_encoder_set_mark_granule</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-perfect-timestamp" title="gst_audio_encoder_set_perfect_timestamp ()">gst_audio_encoder_set_perfect_timestamp</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-tolerance" title="gst_audio_encoder_set_tolerance ()">gst_audio_encoder_set_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-NAME:CAPS" title="GST_AUDIO_ENCODER_SINK_NAME">GST_AUDIO_ENCODER_SINK_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-PAD:CAPS" title="GST_AUDIO_ENCODER_SINK_PAD()">GST_AUDIO_ENCODER_SINK_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-NAME:CAPS" title="GST_AUDIO_ENCODER_SRC_NAME">GST_AUDIO_ENCODER_SRC_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-PAD:CAPS" title="GST_AUDIO_ENCODER_SRC_PAD()">GST_AUDIO_ENCODER_SRC_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">gstaudioencoder</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#gst-audio-filter-class-add-pad-templates" title="gst_audio_filter_class_add_pad_templates ()">gst_audio_filter_class_add_pad_templates</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html" title="gstaudiofilter">gstaudiofilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-fixate-channel-positions" title="gst_audio_fixate_channel_positions ()">gst_audio_fixate_channel_positions</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-format-get-info" title="gst_audio_format_get_info ()">gst_audio_format_get_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-DEPTH:CAPS" title="GST_AUDIO_FORMAT_INFO_DEPTH()">GST_AUDIO_FORMAT_INFO_DEPTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS" title="GST_AUDIO_FORMAT_INFO_ENDIANNESS()">GST_AUDIO_FORMAT_INFO_ENDIANNESS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FLAGS:CAPS" title="GST_AUDIO_FORMAT_INFO_FLAGS()">GST_AUDIO_FORMAT_INFO_FLAGS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FORMAT:CAPS" title="GST_AUDIO_FORMAT_INFO_FORMAT()">GST_AUDIO_FORMAT_INFO_FORMAT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN()">GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_FLOAT()">GST_AUDIO_FORMAT_INFO_IS_FLOAT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_INTEGER()">GST_AUDIO_FORMAT_INFO_IS_INTEGER</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN()">GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_SIGNED()">GST_AUDIO_FORMAT_INFO_IS_SIGNED</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-NAME:CAPS" title="GST_AUDIO_FORMAT_INFO_NAME()">GST_AUDIO_FORMAT_INFO_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-WIDTH:CAPS" title="GST_AUDIO_FORMAT_INFO_WIDTH()">GST_AUDIO_FORMAT_INFO_WIDTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-get-channel-positions" title="gst_audio_get_channel_positions ()">gst_audio_get_channel_positions</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-frame-size" title="gst_audio_iec61937_frame_size ()">gst_audio_iec61937_frame_size</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html" title="gstaudioiec61937">gstaudioiec61937</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-payload" title="gst_audio_iec61937_payload ()">gst_audio_iec61937_payload</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html" title="gstaudioiec61937">gstaudioiec61937</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPF:CAPS" title="GST_AUDIO_INFO_BPF()">GST_AUDIO_INFO_BPF</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPS:CAPS" title="GST_AUDIO_INFO_BPS()">GST_AUDIO_INFO_BPS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-CHANNELS:CAPS" title="GST_AUDIO_INFO_CHANNELS()">GST_AUDIO_INFO_CHANNELS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-convert" title="gst_audio_info_convert ()">gst_audio_info_convert</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-DEPTH:CAPS" title="GST_AUDIO_INFO_DEPTH()">GST_AUDIO_INFO_DEPTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FLAGS:CAPS" title="GST_AUDIO_INFO_FLAGS()">GST_AUDIO_INFO_FLAGS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FORMAT:CAPS" title="GST_AUDIO_INFO_FORMAT()">GST_AUDIO_INFO_FORMAT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-from-caps" title="gst_audio_info_from_caps ()">gst_audio_info_from_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS" title="GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS()">GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-init" title="gst_audio_info_init ()">gst_audio_info_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-NAME:CAPS" title="GST_AUDIO_INFO_NAME()">GST_AUDIO_INFO_NAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-POSITION:CAPS" title="GST_AUDIO_INFO_POSITION()">GST_AUDIO_INFO_POSITION</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-RATE:CAPS" title="GST_AUDIO_INFO_RATE()">GST_AUDIO_INFO_RATE</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-to-caps" title="gst_audio_info_to_caps ()">gst_audio_info_to_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-WIDTH:CAPS" title="GST_AUDIO_INFO_WIDTH()">GST_AUDIO_INFO_WIDTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-caps-channel-positions-list" title="gst_audio_set_caps_channel_positions_list ()">gst_audio_set_caps_channel_positions_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-channel-positions" title="gst_audio_set_channel_positions ()">gst_audio_set_channel_positions</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-structure-channel-positions-list" title="gst_audio_set_structure_channel_positions_list ()">gst_audio_set_structure_channel_positions_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">gstmultichannel</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink-struct" title="struct GstBaseAudioSink">GstBaseAudioSink</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--buffer-time" title='The "buffer-time" property'>GstBaseAudioSink:buffer-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--can-activate-pull" title='The "can-activate-pull" property'>GstBaseAudioSink:can-activate-pull</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--drift-tolerance" title='The "drift-tolerance" property'>GstBaseAudioSink:drift-tolerance</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--latency-time" title='The "latency-time" property'>GstBaseAudioSink:latency-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--provide-clock" title='The "provide-clock" property'>GstBaseAudioSink:provide-clock</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--slave-method" title='The "slave-method" property'>GstBaseAudioSink:slave-method</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkClass" title="struct GstBaseAudioSinkClass">GstBaseAudioSinkClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod">GstBaseAudioSinkSlaveMethod</a>, enum in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc-struct" title="struct GstBaseAudioSrc">GstBaseAudioSrc</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-buffer-time" title='The "actual-buffer-time" property'>GstBaseAudioSrc:actual-buffer-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-latency-time" title='The "actual-latency-time" property'>GstBaseAudioSrc:actual-latency-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--buffer-time" title='The "buffer-time" property'>GstBaseAudioSrc:buffer-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--latency-time" title='The "latency-time" property'>GstBaseAudioSrc:latency-time</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--provide-clock" title='The "provide-clock" property'>GstBaseAudioSrc:provide-clock</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--slave-method" title='The "slave-method" property'>GstBaseAudioSrc:slave-method</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcClass" title="struct GstBaseAudioSrcClass">GstBaseAudioSrcClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod">GstBaseAudioSrcSlaveMethod</a>, enum in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload-struct" title="struct GstBaseRTPAudioPayload">GstBaseRTPAudioPayload</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload--buffer-list" title='The "buffer-list" property'>GstBaseRTPAudioPayload:buffer-list</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayloadClass" title="struct GstBaseRTPAudioPayloadClass">GstBaseRTPAudioPayloadClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload-struct" title="struct GstBaseRTPDepayload">GstBaseRTPDepayload</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayloadClass" title="struct GstBaseRTPDepayloadClass">GstBaseRTPDepayloadClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload-struct" title="struct GstBaseRTPPayload">GstBaseRTPPayload</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--max-ptime" title='The "max-ptime" property'>GstBaseRTPPayload:max-ptime</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--min-ptime" title='The "min-ptime" property'>GstBaseRTPPayload:min-ptime</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--mtu" title='The "mtu" property'>GstBaseRTPPayload:mtu</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--perfect-rtptime" title='The "perfect-rtptime" property'>GstBaseRTPPayload:perfect-rtptime</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--pt" title='The "pt" property'>GstBaseRTPPayload:pt</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ptime-multiple" title='The "ptime-multiple" property'>GstBaseRTPPayload:ptime-multiple</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum" title='The "seqnum" property'>GstBaseRTPPayload:seqnum</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum-offset" title='The "seqnum-offset" property'>GstBaseRTPPayload:seqnum-offset</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ssrc" title='The "ssrc" property'>GstBaseRTPPayload:ssrc</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp" title='The "timestamp" property'>GstBaseRTPPayload:timestamp</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp-offset" title='The "timestamp-offset" property'>GstBaseRTPPayload:timestamp-offset</a>, object property in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayloadClass" title="struct GstBaseRTPPayloadClass">GstBaseRTPPayloadClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-is-filled" title="gst_basertppayload_is_filled ()">gst_basertppayload_is_filled</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push" title="gst_basertppayload_push ()">gst_basertppayload_push</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push-list" title="gst_basertppayload_push_list ()">gst_basertppayload_push_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-options" title="gst_basertppayload_set_options ()">gst_basertppayload_set_options</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-outcaps" title="gst_basertppayload_set_outcaps ()">gst_basertppayload_set_outcaps</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-CLOCK:CAPS" title="GST_BASE_AUDIO_SINK_CLOCK()">GST_BASE_AUDIO_SINK_CLOCK</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-create-ringbuffer" title="gst_base_audio_sink_create_ringbuffer ()">gst_base_audio_sink_create_ringbuffer</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-drift-tolerance" title="gst_base_audio_sink_get_drift_tolerance ()">gst_base_audio_sink_get_drift_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-provide-clock" title="gst_base_audio_sink_get_provide_clock ()">gst_base_audio_sink_get_provide_clock</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-slave-method" title="gst_base_audio_sink_get_slave_method ()">gst_base_audio_sink_get_slave_method</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-PAD:CAPS" title="GST_BASE_AUDIO_SINK_PAD()">GST_BASE_AUDIO_SINK_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-drift-tolerance" title="gst_base_audio_sink_set_drift_tolerance ()">gst_base_audio_sink_set_drift_tolerance</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-provide-clock" title="gst_base_audio_sink_set_provide_clock ()">gst_base_audio_sink_set_provide_clock</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-slave-method" title="gst_base_audio_sink_set_slave_method ()">gst_base_audio_sink_set_slave_method</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">gstbaseaudiosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-CLOCK:CAPS" title="GST_BASE_AUDIO_SRC_CLOCK()">GST_BASE_AUDIO_SRC_CLOCK</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-create-ringbuffer" title="gst_base_audio_src_create_ringbuffer ()">gst_base_audio_src_create_ringbuffer</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-provide-clock" title="gst_base_audio_src_get_provide_clock ()">gst_base_audio_src_get_provide_clock</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-slave-method" title="gst_base_audio_src_get_slave_method ()">gst_base_audio_src_get_slave_method</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-PAD:CAPS" title="GST_BASE_AUDIO_SRC_PAD()">GST_BASE_AUDIO_SRC_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-provide-clock" title="gst_base_audio_src_set_provide_clock ()">gst_base_audio_src_set_provide_clock</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-slave-method" title="gst_base_audio_src_set_slave_method ()">gst_base_audio_src_set_slave_method</a>, function in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">gstbaseaudiosrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-flush" title="gst_base_rtp_audio_payload_flush ()">gst_base_rtp_audio_payload_flush</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-get-adapter" title="gst_base_rtp_audio_payload_get_adapter ()">gst_base_rtp_audio_payload_get_adapter</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-push" title="gst_base_rtp_audio_payload_push ()">gst_base_rtp_audio_payload_push</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-based" title="gst_base_rtp_audio_payload_set_frame_based ()">gst_base_rtp_audio_payload_set_frame_based</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-options" title="gst_base_rtp_audio_payload_set_frame_options ()">gst_base_rtp_audio_payload_set_frame_options</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-samplebits-options" title="gst_base_rtp_audio_payload_set_samplebits_options ()">gst_base_rtp_audio_payload_set_samplebits_options</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-based" title="gst_base_rtp_audio_payload_set_sample_based ()">gst_base_rtp_audio_payload_set_sample_based</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-options" title="gst_base_rtp_audio_payload_set_sample_options ()">gst_base_rtp_audio_payload_set_sample_options</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">gstbasertpaudiopayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push" title="gst_base_rtp_depayload_push ()">gst_base_rtp_depayload_push</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-list" title="gst_base_rtp_depayload_push_list ()">gst_base_rtp_depayload_push_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-ts" title="gst_base_rtp_depayload_push_ts ()">gst_base_rtp_depayload_push_ts</a>, function in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS" title="GST_BASE_RTP_DEPAYLOAD_SINKPAD()">GST_BASE_RTP_DEPAYLOAD_SINKPAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS" title="GST_BASE_RTP_DEPAYLOAD_SRCPAD()">GST_BASE_RTP_DEPAYLOAD_SRCPAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">gstbasertpdepayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-MTU:CAPS" title="GST_BASE_RTP_PAYLOAD_MTU()">GST_BASE_RTP_PAYLOAD_MTU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-PT:CAPS" title="GST_BASE_RTP_PAYLOAD_PT()">GST_BASE_RTP_PAYLOAD_PT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS" title="GST_BASE_RTP_PAYLOAD_SINKPAD()">GST_BASE_RTP_PAYLOAD_SINKPAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS" title="GST_BASE_RTP_PAYLOAD_SRCPAD()">GST_BASE_RTP_PAYLOAD_SRCPAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">gstbasertppayload</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstBufferFormatType" title="enum GstBufferFormatType">GstBufferFormatType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc-struct" title="struct GstCddaBaseSrc">GstCddaBaseSrc</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--device" title='The "device" property'>GstCddaBaseSrc:device</a>, object property in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--mode" title='The "mode" property'>GstCddaBaseSrc:mode</a>, object property in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--track" title='The "track" property'>GstCddaBaseSrc:track</a>, object property in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcClass" title="struct GstCddaBaseSrcClass">GstCddaBaseSrcClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode" title="enum GstCddaBaseSrcMode">GstCddaBaseSrcMode</a>, enum in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack" title="struct GstCddaBaseSrcTrack">GstCddaBaseSrcTrack</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#gst-cdda-base-src-add-track" title="gst_cdda_base_src_add_track ()">gst_cdda_base_src_add_track</a>, function in <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">gstcddabasesrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-CHECK-PLUGINS-BASE-VERSION:CAPS" title="GST_CHECK_PLUGINS_BASE_VERSION()">GST_CHECK_PLUGINS_BASE_VERSION</a>, macro in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-CLOCK-TIME-TO-FRAMES:CAPS" title="GST_CLOCK_TIME_TO_FRAMES()">GST_CLOCK_TIME_TO_FRAMES</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-caps-set-level-and-profile" title="gst_codec_utils_aac_caps_set_level_and_profile ()">gst_codec_utils_aac_caps_set_level_and_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level" title="gst_codec_utils_aac_get_level ()">gst_codec_utils_aac_get_level</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-profile" title="gst_codec_utils_aac_get_profile ()">gst_codec_utils_aac_get_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-sample-rate-from-index" title="gst_codec_utils_aac_get_sample_rate_from_index ()">gst_codec_utils_aac_get_sample_rate_from_index</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-caps-set-level-and-profile" title="gst_codec_utils_h264_caps_set_level_and_profile ()">gst_codec_utils_h264_caps_set_level_and_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level" title="gst_codec_utils_h264_get_level ()">gst_codec_utils_h264_get_level</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level-idc" title="gst_codec_utils_h264_get_level_idc ()">gst_codec_utils_h264_get_level_idc</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile" title="gst_codec_utils_h264_get_profile ()">gst_codec_utils_h264_get_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-caps-set-level-and-profile" title="gst_codec_utils_mpeg4video_caps_set_level_and_profile ()">gst_codec_utils_mpeg4video_caps_set_level_and_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-level" title="gst_codec_utils_mpeg4video_get_level ()">gst_codec_utils_mpeg4video_get_level</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-profile" title="gst_codec_utils_mpeg4video_get_profile ()">gst_codec_utils_mpeg4video_get_profile</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">gstpbutilscodecutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct" title="GstColorBalance">GstColorBalance</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-value-changed" title='The "value-changed" signal'>GstColorBalance::value-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-struct" title="struct GstColorBalanceChannel">GstColorBalanceChannel</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html" title="gstcolorbalancechannel">gstcolorbalancechannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-value-changed" title='The "value-changed" signal'>GstColorBalanceChannel::value-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html" title="gstcolorbalancechannel">gstcolorbalancechannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannelClass" title="struct GstColorBalanceChannelClass">GstColorBalanceChannelClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html" title="gstcolorbalancechannel">gstcolorbalancechannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceClass" title="struct GstColorBalanceClass">GstColorBalanceClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType">GstColorBalanceType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-balance-type" title="gst_color_balance_get_balance_type ()">gst_color_balance_get_balance_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-value" title="gst_color_balance_get_value ()">gst_color_balance_get_value</a>, function in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-list-channels" title="gst_color_balance_list_channels ()">gst_color_balance_list_channels</a>, function in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-set-value" title="gst_color_balance_set_value ()">gst_color_balance_set_value</a>, function in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-value-changed" title="gst_color_balance_value_changed ()">gst_color_balance_value_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">gstcolorbalance</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-struct" title="struct GstDiscoverer">GstDiscoverer</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-discovered" title='The "discovered" signal'>GstDiscoverer::discovered</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-finished" title='The "finished" signal'>GstDiscoverer::finished</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-starting" title='The "starting" signal'>GstDiscoverer::starting</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer--timeout" title='The "timeout" property'>GstDiscoverer:timeout</a>, object property in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo">GstDiscovererAudioInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo">GstDiscovererContainerInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo-struct" title="GstDiscovererInfo">GstDiscovererInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" title="enum GstDiscovererResult">GstDiscovererResult</a>, enum in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo">GstDiscovererStreamInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo">GstDiscovererSubtitleInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo">GstDiscovererVideoInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-bitrate" title="gst_discoverer_audio_info_get_bitrate ()">gst_discoverer_audio_info_get_bitrate</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-channels" title="gst_discoverer_audio_info_get_channels ()">gst_discoverer_audio_info_get_channels</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-depth" title="gst_discoverer_audio_info_get_depth ()">gst_discoverer_audio_info_get_depth</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-language" title="gst_discoverer_audio_info_get_language ()">gst_discoverer_audio_info_get_language</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-max-bitrate" title="gst_discoverer_audio_info_get_max_bitrate ()">gst_discoverer_audio_info_get_max_bitrate</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-sample-rate" title="gst_discoverer_audio_info_get_sample_rate ()">gst_discoverer_audio_info_get_sample_rate</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-container-info-get-streams" title="gst_discoverer_container_info_get_streams ()">gst_discoverer_container_info_get_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri" title="gst_discoverer_discover_uri ()">gst_discoverer_discover_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri-async" title="gst_discoverer_discover_uri_async ()">gst_discoverer_discover_uri_async</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-audio-streams" title="gst_discoverer_info_get_audio_streams ()">gst_discoverer_info_get_audio_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-container-streams" title="gst_discoverer_info_get_container_streams ()">gst_discoverer_info_get_container_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-duration" title="gst_discoverer_info_get_duration ()">gst_discoverer_info_get_duration</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-misc" title="gst_discoverer_info_get_misc ()">gst_discoverer_info_get_misc</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-result" title="gst_discoverer_info_get_result ()">gst_discoverer_info_get_result</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-seekable" title="gst_discoverer_info_get_seekable ()">gst_discoverer_info_get_seekable</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-streams" title="gst_discoverer_info_get_streams ()">gst_discoverer_info_get_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-info" title="gst_discoverer_info_get_stream_info ()">gst_discoverer_info_get_stream_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-list" title="gst_discoverer_info_get_stream_list ()">gst_discoverer_info_get_stream_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-subtitle-streams" title="gst_discoverer_info_get_subtitle_streams ()">gst_discoverer_info_get_subtitle_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-tags" title="gst_discoverer_info_get_tags ()">gst_discoverer_info_get_tags</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-uri" title="gst_discoverer_info_get_uri ()">gst_discoverer_info_get_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-video-streams" title="gst_discoverer_info_get_video_streams ()">gst_discoverer_info_get_video_streams</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-ref" title="gst_discoverer_info_ref()">gst_discoverer_info_ref</a>, macro in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-unref" title="gst_discoverer_info_unref()">gst_discoverer_info_unref</a>, macro in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-new" title="gst_discoverer_new ()">gst_discoverer_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start" title="gst_discoverer_start ()">gst_discoverer_start</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stop" title="gst_discoverer_stop ()">gst_discoverer_stop</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-caps" title="gst_discoverer_stream_info_get_caps ()">gst_discoverer_stream_info_get_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-misc" title="gst_discoverer_stream_info_get_misc ()">gst_discoverer_stream_info_get_misc</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-next" title="gst_discoverer_stream_info_get_next ()">gst_discoverer_stream_info_get_next</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-previous" title="gst_discoverer_stream_info_get_previous ()">gst_discoverer_stream_info_get_previous</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-stream-type-nick" title="gst_discoverer_stream_info_get_stream_type_nick ()">gst_discoverer_stream_info_get_stream_type_nick</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-tags" title="gst_discoverer_stream_info_get_tags ()">gst_discoverer_stream_info_get_tags</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()">gst_discoverer_stream_info_list_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-ref" title="gst_discoverer_stream_info_ref()">gst_discoverer_stream_info_ref</a>, macro in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" title="gst_discoverer_stream_info_unref()">gst_discoverer_stream_info_unref</a>, macro in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-subtitle-info-get-language" title="gst_discoverer_subtitle_info_get_language ()">gst_discoverer_subtitle_info_get_language</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-bitrate" title="gst_discoverer_video_info_get_bitrate ()">gst_discoverer_video_info_get_bitrate</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-depth" title="gst_discoverer_video_info_get_depth ()">gst_discoverer_video_info_get_depth</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-denom" title="gst_discoverer_video_info_get_framerate_denom ()">gst_discoverer_video_info_get_framerate_denom</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-num" title="gst_discoverer_video_info_get_framerate_num ()">gst_discoverer_video_info_get_framerate_num</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-height" title="gst_discoverer_video_info_get_height ()">gst_discoverer_video_info_get_height</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-max-bitrate" title="gst_discoverer_video_info_get_max_bitrate ()">gst_discoverer_video_info_get_max_bitrate</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-denom" title="gst_discoverer_video_info_get_par_denom ()">gst_discoverer_video_info_get_par_denom</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-num" title="gst_discoverer_video_info_get_par_num ()">gst_discoverer_video_info_get_par_num</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-width" title="gst_discoverer_video_info_get_width ()">gst_discoverer_video_info_get_width</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-image" title="gst_discoverer_video_info_is_image ()">gst_discoverer_video_info_is_image</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-interlaced" title="gst_discoverer_video_info_is_interlaced ()">gst_discoverer_video_info_is_interlaced</a>, function in <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">gstdiscoverer</a>
+</dt>
+<dd></dd>
+<a name="idxE"></a><h3 class="title">E</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile-struct" title="GstEncodingAudioProfile">GstEncodingAudioProfile</a>, struct in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile-struct" title="GstEncodingContainerProfile">GstEncodingContainerProfile</a>, struct in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile-struct" title="GstEncodingProfile">GstEncodingProfile</a>, struct in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget-struct" title="GstEncodingTarget">GstEncodingTarget</a>, struct in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile-struct" title="GstEncodingVideoProfile">GstEncodingVideoProfile</a>, struct in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-audio-profile-new" title="gst_encoding_audio_profile_new ()">gst_encoding_audio_profile_new</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-CAPTURE:CAPS" title="GST_ENCODING_CATEGORY_CAPTURE">GST_ENCODING_CATEGORY_CAPTURE</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE">GST_ENCODING_CATEGORY_DEVICE</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS" title="GST_ENCODING_CATEGORY_ONLINE_SERVICE">GST_ENCODING_CATEGORY_ONLINE_SERVICE</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS" title="GST_ENCODING_CATEGORY_STORAGE_EDITING">GST_ENCODING_CATEGORY_STORAGE_EDITING</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-add-profile" title="gst_encoding_container_profile_add_profile ()">gst_encoding_container_profile_add_profile</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-contains-profile" title="gst_encoding_container_profile_contains_profile ()">gst_encoding_container_profile_contains_profile</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-get-profiles" title="gst_encoding_container_profile_get_profiles ()">gst_encoding_container_profile_get_profiles</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-new" title="gst_encoding_container_profile_new ()">gst_encoding_container_profile_new</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-all-targets" title="gst_encoding_list_all_targets ()">gst_encoding_list_all_targets</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-available-categories" title="gst_encoding_list_available_categories ()">gst_encoding_list_available_categories</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-find" title="gst_encoding_profile_find ()">gst_encoding_profile_find</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-description" title="gst_encoding_profile_get_description ()">gst_encoding_profile_get_description</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-format" title="gst_encoding_profile_get_format ()">gst_encoding_profile_get_format</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-input-caps" title="gst_encoding_profile_get_input_caps ()">gst_encoding_profile_get_input_caps</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-name" title="gst_encoding_profile_get_name ()">gst_encoding_profile_get_name</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-presence" title="gst_encoding_profile_get_presence ()">gst_encoding_profile_get_presence</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-preset" title="gst_encoding_profile_get_preset ()">gst_encoding_profile_get_preset</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction" title="gst_encoding_profile_get_restriction ()">gst_encoding_profile_get_restriction</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-type-nick" title="gst_encoding_profile_get_type_nick ()">gst_encoding_profile_get_type_nick</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-is-equal" title="gst_encoding_profile_is_equal ()">gst_encoding_profile_is_equal</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-ref" title="gst_encoding_profile_ref()">gst_encoding_profile_ref</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-description" title="gst_encoding_profile_set_description ()">gst_encoding_profile_set_description</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-format" title="gst_encoding_profile_set_format ()">gst_encoding_profile_set_format</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-name" title="gst_encoding_profile_set_name ()">gst_encoding_profile_set_name</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-presence" title="gst_encoding_profile_set_presence ()">gst_encoding_profile_set_presence</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-preset" title="gst_encoding_profile_set_preset ()">gst_encoding_profile_set_preset</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-restriction" title="gst_encoding_profile_set_restriction ()">gst_encoding_profile_set_restriction</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-unref" title="gst_encoding_profile_unref()">gst_encoding_profile_unref</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-add-profile" title="gst_encoding_target_add_profile ()">gst_encoding_target_add_profile</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-category" title="gst_encoding_target_get_category ()">gst_encoding_target_get_category</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-description" title="gst_encoding_target_get_description ()">gst_encoding_target_get_description</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-name" title="gst_encoding_target_get_name ()">gst_encoding_target_get_name</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profile" title="gst_encoding_target_get_profile ()">gst_encoding_target_get_profile</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profiles" title="gst_encoding_target_get_profiles ()">gst_encoding_target_get_profiles</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load" title="gst_encoding_target_load ()">gst_encoding_target_load</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load-from-file" title="gst_encoding_target_load_from_file ()">gst_encoding_target_load_from_file</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-new" title="gst_encoding_target_new ()">gst_encoding_target_new</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-ref" title="gst_encoding_target_ref()">gst_encoding_target_ref</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save" title="gst_encoding_target_save ()">gst_encoding_target_save</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save-to-file" title="gst_encoding_target_save_to_file ()">gst_encoding_target_save_to_file</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-unref" title="gst_encoding_target_unref()">gst_encoding_target_unref</a>, macro in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-pass" title="gst_encoding_video_profile_get_pass ()">gst_encoding_video_profile_get_pass</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-variableframerate" title="gst_encoding_video_profile_get_variableframerate ()">gst_encoding_video_profile_get_variableframerate</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-new" title="gst_encoding_video_profile_new ()">gst_encoding_video_profile_new</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-pass" title="gst_encoding_video_profile_set_pass ()">gst_encoding_video_profile_set_pass</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-variableframerate" title="gst_encoding_video_profile_set_variableframerate ()">gst_encoding_video_profile_set_variableframerate</a>, function in <a class="link" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">encoding-profile</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32">GstFFTF32</a>, struct in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex">GstFFTF32Complex</a>, struct in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64">GstFFTF64</a>, struct in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex">GstFFTF64Complex</a>, struct in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16">GstFFTS16</a>, struct in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex">GstFFTS16Complex</a>, struct in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32">GstFFTS32</a>, struct in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex">GstFFTS32Complex</a>, struct in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow">GstFFTWindow</a>, enum in <a class="link" href="gst-plugins-base-libs-gstfft.html" title="gstfft">gstfft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft" title="gst_fft_f32_fft ()">gst_fft_f32_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-free" title="gst_fft_f32_free ()">gst_fft_f32_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft" title="gst_fft_f32_inverse_fft ()">gst_fft_f32_inverse_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()">gst_fft_f32_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-window" title="gst_fft_f32_window ()">gst_fft_f32_window</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">gstfftf32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-fft" title="gst_fft_f64_fft ()">gst_fft_f64_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free" title="gst_fft_f64_free ()">gst_fft_f64_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft" title="gst_fft_f64_inverse_fft ()">gst_fft_f64_inverse_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()">gst_fft_f64_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-window" title="gst_fft_f64_window ()">gst_fft_f64_window</a>, function in <a class="link" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">gstfftf64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()">gst_fft_next_fast_length</a>, function in <a class="link" href="gst-plugins-base-libs-gstfft.html" title="gstfft">gstfft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft" title="gst_fft_s16_fft ()">gst_fft_s16_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-free" title="gst_fft_s16_free ()">gst_fft_s16_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft" title="gst_fft_s16_inverse_fft ()">gst_fft_s16_inverse_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()">gst_fft_s16_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-window" title="gst_fft_s16_window ()">gst_fft_s16_window</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">gstffts16</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft" title="gst_fft_s32_fft ()">gst_fft_s32_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-free" title="gst_fft_s32_free ()">gst_fft_s32_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft" title="gst_fft_s32_inverse_fft ()">gst_fft_s32_inverse_fft</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()">gst_fft_s32_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-window" title="gst_fft_s32_window ()">gst_fft_s32_window</a>, function in <a class="link" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">gstffts32</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-FRAMES-TO-CLOCK-TIME:CAPS" title="GST_FRAMES_TO_CLOCK_TIME()">GST_FRAMES_TO_CLOCK_TIME</a>, macro in <a class="link" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">gstaudio</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext">GstInstallPluginsContext</a>, struct in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" title="GstInstallPluginsResultFunc ()">GstInstallPluginsResultFunc</a>, user_function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn">GstInstallPluginsReturn</a>, enum in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()">gst_install_plugins_async</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-free" title="gst_install_plugins_context_free ()">gst_install_plugins_context_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-new" title="gst_install_plugins_context_new ()">gst_install_plugins_context_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-set-xid" title="gst_install_plugins_context_set_xid ()">gst_install_plugins_context_set_xid</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-installation-in-progress" title="gst_install_plugins_installation_in_progress ()">gst_install_plugins_installation_in_progress</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-return-get-name" title="gst_install_plugins_return_get_name ()">gst_install_plugins_return_get_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-supported" title="gst_install_plugins_supported ()">gst_install_plugins_supported</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()">gst_install_plugins_sync</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">gstpbutilsinstallplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-is-missing-plugin-message" title="gst_is_missing_plugin_message ()">gst_is_missing_plugin_message</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-installer-detail-new" title="gst_missing_decoder_installer_detail_new ()">gst_missing_decoder_installer_detail_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-message-new" title="gst_missing_decoder_message_new ()">gst_missing_decoder_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-installer-detail-new" title="gst_missing_element_installer_detail_new ()">gst_missing_element_installer_detail_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new" title="gst_missing_element_message_new ()">gst_missing_element_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-installer-detail-new" title="gst_missing_encoder_installer_detail_new ()">gst_missing_encoder_installer_detail_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-message-new" title="gst_missing_encoder_message_new ()">gst_missing_encoder_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()">gst_missing_plugin_message_get_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()">gst_missing_plugin_message_get_installer_detail</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-installer-detail-new" title="gst_missing_uri_sink_installer_detail_new ()">gst_missing_uri_sink_installer_detail_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-message-new" title="gst_missing_uri_sink_message_new ()">gst_missing_uri_sink_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-installer-detail-new" title="gst_missing_uri_source_installer_detail_new ()">gst_missing_uri_source_installer_detail_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-message-new" title="gst_missing_uri_source_message_new ()">gst_missing_uri_source_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">gstpbutilsmissingplugins</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-struct" title="GstMixer">GstMixer</a>, struct in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-mute-toggled" title='The "mute-toggled" signal'>GstMixer::mute-toggled</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-option-changed" title='The "option-changed" signal'>GstMixer::option-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-record-toggled" title='The "record-toggled" signal'>GstMixer::record-toggled</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-volume-changed" title='The "volume-changed" signal'>GstMixer::volume-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerFlags" title="enum GstMixerFlags">GstMixerFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerMessageType" title="enum GstMixerMessageType">GstMixerMessageType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions-struct" title="struct GstMixerOptions">GstMixerOptions</a>, struct in <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html" title="gstmixeroptions">gstmixeroptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack-struct" title="struct GstMixerTrack">GstMixerTrack</a>, struct in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--flags" title='The "flags" property'>GstMixerTrack:flags</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--index" title='The "index" property'>GstMixerTrack:index</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--label" title='The "label" property'>GstMixerTrack:label</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--max-volume" title='The "max-volume" property'>GstMixerTrack:max-volume</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--min-volume" title='The "min-volume" property'>GstMixerTrack:min-volume</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--num-channels" title='The "num-channels" property'>GstMixerTrack:num-channels</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--untranslated-label" title='The "untranslated-label" property'>GstMixerTrack:untranslated-label</a>, object property in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrackFlags" title="enum GstMixerTrackFlags">GstMixerTrackFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType">GstMixerType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-flags" title="gst_mixer_get_mixer_flags ()">gst_mixer_get_mixer_flags</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-type" title="gst_mixer_get_mixer_type ()">gst_mixer_get_mixer_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-option" title="gst_mixer_get_option ()">gst_mixer_get_option</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-volume" title="gst_mixer_get_volume ()">gst_mixer_get_volume</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-list-tracks" title="gst_mixer_list_tracks ()">gst_mixer_list_tracks</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-get-type" title="gst_mixer_message_get_type ()">gst_mixer_message_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-mute-toggled" title="gst_mixer_message_parse_mute_toggled ()">gst_mixer_message_parse_mute_toggled</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-options-list-changed" title="gst_mixer_message_parse_options_list_changed ()">gst_mixer_message_parse_options_list_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-option-changed" title="gst_mixer_message_parse_option_changed ()">gst_mixer_message_parse_option_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-record-toggled" title="gst_mixer_message_parse_record_toggled ()">gst_mixer_message_parse_record_toggled</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-volume-changed" title="gst_mixer_message_parse_volume_changed ()">gst_mixer_message_parse_volume_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-mixer-changed" title="gst_mixer_mixer_changed ()">gst_mixer_mixer_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-mute-toggled" title="gst_mixer_mute_toggled ()">gst_mixer_mute_toggled</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values" title="gst_mixer_options_get_values ()">gst_mixer_options_get_values</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html" title="gstmixeroptions">gstmixeroptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-options-list-changed" title="gst_mixer_options_list_changed ()">gst_mixer_options_list_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-option-changed" title="gst_mixer_option_changed ()">gst_mixer_option_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-record-toggled" title="gst_mixer_record_toggled ()">gst_mixer_record_toggled</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-mute" title="gst_mixer_set_mute ()">gst_mixer_set_mute</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-option" title="gst_mixer_set_option ()">gst_mixer_set_option</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-record" title="gst_mixer_set_record ()">gst_mixer_set_record</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-volume" title="gst_mixer_set_volume ()">gst_mixer_set_volume</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS" title="GST_MIXER_TRACK_HAS_FLAG()">GST_MIXER_TRACK_HAS_FLAG</a>, macro in <a class="link" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">gstmixertrack</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-volume-changed" title="gst_mixer_volume_changed ()">gst_mixer_volume_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">gstmixer</a>
+</dt>
+<dd></dd>
+<a name="idxN"></a><h3 class="title">N</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct" title="GstNavigation">GstNavigation</a>, struct in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand">GstNavigationCommand</a>, enum in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationEventType" title="enum GstNavigationEventType">GstNavigationEventType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationInterface" title="struct GstNavigationInterface">GstNavigationInterface</a>, struct in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" title="enum GstNavigationMessageType">GstNavigationMessageType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType">GstNavigationQueryType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU">GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU">GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU">GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_MENU">GST_NAVIGATION_COMMAND_DVD_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_ROOT_MENU">GST_NAVIGATION_COMMAND_DVD_ROOT_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU">GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_TITLE_MENU">GST_NAVIGATION_COMMAND_DVD_TITLE_MENU</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-command" title="gst_navigation_event_parse_command ()">gst_navigation_event_parse_command</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event" title="gst_navigation_event_parse_key_event ()">gst_navigation_event_parse_key_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event" title="gst_navigation_event_parse_mouse_button_event ()">gst_navigation_event_parse_mouse_button_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-move-event" title="gst_navigation_event_parse_mouse_move_event ()">gst_navigation_event_parse_mouse_move_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-get-type" title="gst_navigation_message_get_type ()">gst_navigation_message_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-angles-changed" title="gst_navigation_message_new_angles_changed ()">gst_navigation_message_new_angles_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-commands-changed" title="gst_navigation_message_new_commands_changed ()">gst_navigation_message_new_commands_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-mouse-over" title="gst_navigation_message_new_mouse_over ()">gst_navigation_message_new_mouse_over</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-angles-changed" title="gst_navigation_message_parse_angles_changed ()">gst_navigation_message_parse_angles_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-mouse-over" title="gst_navigation_message_parse_mouse_over ()">gst_navigation_message_parse_mouse_over</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-get-type" title="gst_navigation_query_get_type ()">gst_navigation_query_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-angles" title="gst_navigation_query_new_angles ()">gst_navigation_query_new_angles</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-commands" title="gst_navigation_query_new_commands ()">gst_navigation_query_new_commands</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-angles" title="gst_navigation_query_parse_angles ()">gst_navigation_query_parse_angles</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-length" title="gst_navigation_query_parse_commands_length ()">gst_navigation_query_parse_commands_length</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-nth" title="gst_navigation_query_parse_commands_nth ()">gst_navigation_query_parse_commands_nth</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-angles" title="gst_navigation_query_set_angles ()">gst_navigation_query_set_angles</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commands" title="gst_navigation_query_set_commands ()">gst_navigation_query_set_commands</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commandsv" title="gst_navigation_query_set_commandsv ()">gst_navigation_query_set_commandsv</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-command" title="gst_navigation_send_command ()">gst_navigation_send_command</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-event" title="gst_navigation_send_event ()">gst_navigation_send_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-key-event" title="gst_navigation_send_key_event ()">gst_navigation_send_key_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-mouse-event" title="gst_navigation_send_mouse_event ()">gst_navigation_send_mouse_event</a>, function in <a class="link" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">gstnavigation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress">GstNetAddress</a>, struct in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-equal" title="gst_netaddress_equal ()">gst_netaddress_equal</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-address-bytes" title="gst_netaddress_get_address_bytes ()">gst_netaddress_get_address_bytes</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip4-address" title="gst_netaddress_get_ip4_address ()">gst_netaddress_get_ip4_address</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip6-address" title="gst_netaddress_get_ip6_address ()">gst_netaddress_get_ip6_address</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-net-type" title="gst_netaddress_get_net_type ()">gst_netaddress_get_net_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GST-NETADDRESS-MAX-LEN:CAPS" title="GST_NETADDRESS_MAX_LEN">GST_NETADDRESS_MAX_LEN</a>, macro in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-address-bytes" title="gst_netaddress_set_address_bytes ()">gst_netaddress_set_address_bytes</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip4-address" title="gst_netaddress_set_ip4_address ()">gst_netaddress_set_ip4_address</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip6-address" title="gst_netaddress_set_ip6_address ()">gst_netaddress_set_ip6_address</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-to-string" title="gst_netaddress_to_string ()">gst_netaddress_to_string</a>, function in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetBuffer" title="GstNetBuffer">GstNetBuffer</a>, struct in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType">GstNetType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">gstnetbuffer</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list" title="gst_pb_utils_add_codec_description_to_tag_list ()">gst_pb_utils_add_codec_description_to_tag_list</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-codec-description" title="gst_pb_utils_get_codec_description ()">gst_pb_utils_get_codec_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-decoder-description" title="gst_pb_utils_get_decoder_description ()">gst_pb_utils_get_decoder_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-element-description" title="gst_pb_utils_get_element_description ()">gst_pb_utils_get_element_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-encoder-description" title="gst_pb_utils_get_encoder_description ()">gst_pb_utils_get_encoder_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-sink-description" title="gst_pb_utils_get_sink_description ()">gst_pb_utils_get_sink_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-source-description" title="gst_pb_utils_get_source_description ()">gst_pb_utils_get_source_description</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">gstpbutilsdescriptions</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpbutils.html#gst-pb-utils-init" title="gst_pb_utils_init ()">gst_pb_utils_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstpbutils.html" title="gstpbutils">gstpbutils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version" title="gst_plugins_base_version ()">gst_plugins_base_version</a>, function in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MAJOR:CAPS" title="GST_PLUGINS_BASE_VERSION_MAJOR">GST_PLUGINS_BASE_VERSION_MAJOR</a>, macro in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MICRO:CAPS" title="GST_PLUGINS_BASE_VERSION_MICRO">GST_PLUGINS_BASE_VERSION_MICRO</a>, macro in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MINOR:CAPS" title="GST_PLUGINS_BASE_VERSION_MINOR">GST_PLUGINS_BASE_VERSION_MINOR</a>, macro in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-NANO:CAPS" title="GST_PLUGINS_BASE_VERSION_NANO">GST_PLUGINS_BASE_VERSION_NANO</a>, macro in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version-string" title="gst_plugins_base_version_string ()">gst_plugins_base_version_string</a>, function in <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">gstpluginsbaseversion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-struct" title="GstPropertyProbe">GstPropertyProbe</a>, struct in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-probe-needed" title='The "probe-needed" signal'>GstPropertyProbe::probe-needed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbeInterface" title="struct GstPropertyProbeInterface">GstPropertyProbeInterface</a>, struct in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-properties" title="gst_property_probe_get_properties ()">gst_property_probe_get_properties</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-property" title="gst_property_probe_get_property ()">gst_property_probe_get_property</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values" title="gst_property_probe_get_values ()">gst_property_probe_get_values</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values-name" title="gst_property_probe_get_values_name ()">gst_property_probe_get_values_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe" title="gst_property_probe_needs_probe ()">gst_property_probe_needs_probe</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe-name" title="gst_property_probe_needs_probe_name ()">gst_property_probe_needs_probe_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values" title="gst_property_probe_probe_and_get_values ()">gst_property_probe_probe_and_get_values</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values-name" title="gst_property_probe_probe_and_get_values_name ()">gst_property_probe_probe_and_get_values_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property" title="gst_property_probe_probe_property ()">gst_property_probe_probe_property</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property-name" title="gst_property_probe_probe_property_name ()">gst_property_probe_probe_property_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">gstpropertyprobe</a>
+</dt>
+<dd></dd>
+<a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-caps" title="gst_riff_create_audio_caps ()">gst_riff_create_audio_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-template-caps" title="gst_riff_create_audio_template_caps ()">gst_riff_create_audio_template_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-caps" title="gst_riff_create_iavs_caps ()">gst_riff_create_iavs_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-template-caps" title="gst_riff_create_iavs_template_caps ()">gst_riff_create_iavs_template_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-caps" title="gst_riff_create_video_caps ()">gst_riff_create_video_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-template-caps" title="gst_riff_create_video_template_caps ()">gst_riff_create_video_template_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-init" title="gst_riff_init ()">gst_riff_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-chunk" title="gst_riff_parse_chunk ()">gst_riff_parse_chunk</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-file-header" title="gst_riff_parse_file_header ()">gst_riff_parse_file_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-info" title="gst_riff_parse_info ()">gst_riff_parse_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-auds" title="gst_riff_parse_strf_auds ()">gst_riff_parse_strf_auds</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-iavs" title="gst_riff_parse_strf_iavs ()">gst_riff_parse_strf_iavs</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-vids" title="gst_riff_parse_strf_vids ()">gst_riff_parse_strf_vids</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strh" title="gst_riff_parse_strh ()">gst_riff_parse_strh</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-read-chunk" title="gst_riff_read_chunk ()">gst_riff_read_chunk</a>, function in <a class="link" href="gst-plugins-base-libs-gstriff.html" title="gstriff">gstriff</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer-struct" title="struct GstRingBuffer">GstRingBuffer</a>, struct in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback" title="GstRingBufferCallback ()">GstRingBufferCallback</a>, user_function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferClass" title="struct GstRingBufferClass">GstRingBufferClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSegState" title="enum GstRingBufferSegState">GstRingBufferSegState</a>, enum in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec">GstRingBufferSpec</a>, struct in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferState" title="enum GstRingBufferState">GstRingBufferState</a>, enum in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-acquire" title="gst_ring_buffer_acquire ()">gst_ring_buffer_acquire</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-activate" title="gst_ring_buffer_activate ()">gst_ring_buffer_activate</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-advance" title="gst_ring_buffer_advance ()">gst_ring_buffer_advance</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-BROADCAST:CAPS" title="GST_RING_BUFFER_BROADCAST()">GST_RING_BUFFER_BROADCAST</a>, macro in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear" title="gst_ring_buffer_clear ()">gst_ring_buffer_clear</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear-all" title="gst_ring_buffer_clear_all ()">gst_ring_buffer_clear_all</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-close-device" title="gst_ring_buffer_close_device ()">gst_ring_buffer_close_device</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit" title="gst_ring_buffer_commit ()">gst_ring_buffer_commit</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit-full" title="gst_ring_buffer_commit_full ()">gst_ring_buffer_commit_full</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-convert" title="gst_ring_buffer_convert ()">gst_ring_buffer_convert</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-delay" title="gst_ring_buffer_delay ()">gst_ring_buffer_delay</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-device-is-open" title="gst_ring_buffer_device_is_open ()">gst_ring_buffer_device_is_open</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-GET-COND:CAPS" title="GST_RING_BUFFER_GET_COND()">GST_RING_BUFFER_GET_COND</a>, macro in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-acquired" title="gst_ring_buffer_is_acquired ()">gst_ring_buffer_is_acquired</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-active" title="gst_ring_buffer_is_active ()">gst_ring_buffer_is_active</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-may-start" title="gst_ring_buffer_may_start ()">gst_ring_buffer_may_start</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-open-device" title="gst_ring_buffer_open_device ()">gst_ring_buffer_open_device</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-parse-caps" title="gst_ring_buffer_parse_caps ()">gst_ring_buffer_parse_caps</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-pause" title="gst_ring_buffer_pause ()">gst_ring_buffer_pause</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-prepare-read" title="gst_ring_buffer_prepare_read ()">gst_ring_buffer_prepare_read</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-read" title="gst_ring_buffer_read ()">gst_ring_buffer_read</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-release" title="gst_ring_buffer_release ()">gst_ring_buffer_release</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-samples-done" title="gst_ring_buffer_samples_done ()">gst_ring_buffer_samples_done</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-callback" title="gst_ring_buffer_set_callback ()">gst_ring_buffer_set_callback</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-flushing" title="gst_ring_buffer_set_flushing ()">gst_ring_buffer_set_flushing</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-sample" title="gst_ring_buffer_set_sample ()">gst_ring_buffer_set_sample</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-SIGNAL:CAPS" title="GST_RING_BUFFER_SIGNAL()">GST_RING_BUFFER_SIGNAL</a>, macro in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-start" title="gst_ring_buffer_start ()">gst_ring_buffer_start</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-stop" title="gst_ring_buffer_stop ()">gst_ring_buffer_stop</a>, function in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-WAIT:CAPS" title="GST_RING_BUFFER_WAIT()">GST_RING_BUFFER_WAIT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">gstringbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType">GstRTCPFBType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket">GstRTCPPacket</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType">GstRTCPSDESType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType">GstRTCPType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-add-packet" title="gst_rtcp_buffer_add_packet ()">gst_rtcp_buffer_add_packet</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet" title="gst_rtcp_buffer_get_first_packet ()">gst_rtcp_buffer_get_first_packet</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-packet-count" title="gst_rtcp_buffer_get_packet_count ()">gst_rtcp_buffer_get_packet_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new" title="gst_rtcp_buffer_new ()">gst_rtcp_buffer_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-copy-data" title="gst_rtcp_buffer_new_copy_data ()">gst_rtcp_buffer_new_copy_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-take-data" title="gst_rtcp_buffer_new_take_data ()">gst_rtcp_buffer_new_take_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate" title="gst_rtcp_buffer_validate ()">gst_rtcp_buffer_validate</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate-data" title="gst_rtcp_buffer_validate_data ()">gst_rtcp_buffer_validate_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS" title="GST_RTCP_MAX_BYE_SSRC_COUNT">GST_RTCP_MAX_BYE_SSRC_COUNT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-RB-COUNT:CAPS" title="GST_RTCP_MAX_RB_COUNT">GST_RTCP_MAX_RB_COUNT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES:CAPS" title="GST_RTCP_MAX_SDES">GST_RTCP_MAX_SDES</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS" title="GST_RTCP_MAX_SDES_ITEM_COUNT">GST_RTCP_MAX_SDES_ITEM_COUNT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-ntp-to-unix" title="gst_rtcp_ntp_to_unix ()">gst_rtcp_ntp_to_unix</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-add-rb" title="gst_rtcp_packet_add_rb ()">gst_rtcp_packet_add_rb</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrc" title="gst_rtcp_packet_bye_add_ssrc ()">gst_rtcp_packet_bye_add_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrcs" title="gst_rtcp_packet_bye_add_ssrcs ()">gst_rtcp_packet_bye_add_ssrcs</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-nth-ssrc" title="gst_rtcp_packet_bye_get_nth_ssrc ()">gst_rtcp_packet_bye_get_nth_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason" title="gst_rtcp_packet_bye_get_reason ()">gst_rtcp_packet_bye_get_reason</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason-len" title="gst_rtcp_packet_bye_get_reason_len ()">gst_rtcp_packet_bye_get_reason_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-ssrc-count" title="gst_rtcp_packet_bye_get_ssrc_count ()">gst_rtcp_packet_bye_get_ssrc_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-set-reason" title="gst_rtcp_packet_bye_set_reason ()">gst_rtcp_packet_bye_set_reason</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci" title="gst_rtcp_packet_fb_get_fci ()">gst_rtcp_packet_fb_get_fci</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci-length" title="gst_rtcp_packet_fb_get_fci_length ()">gst_rtcp_packet_fb_get_fci_length</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-media-ssrc" title="gst_rtcp_packet_fb_get_media_ssrc ()">gst_rtcp_packet_fb_get_media_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-sender-ssrc" title="gst_rtcp_packet_fb_get_sender_ssrc ()">gst_rtcp_packet_fb_get_sender_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-type" title="gst_rtcp_packet_fb_get_type ()">gst_rtcp_packet_fb_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-fci-length" title="gst_rtcp_packet_fb_set_fci_length ()">gst_rtcp_packet_fb_set_fci_length</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-media-ssrc" title="gst_rtcp_packet_fb_set_media_ssrc ()">gst_rtcp_packet_fb_set_media_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-sender-ssrc" title="gst_rtcp_packet_fb_set_sender_ssrc ()">gst_rtcp_packet_fb_set_sender_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-type" title="gst_rtcp_packet_fb_set_type ()">gst_rtcp_packet_fb_set_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-count" title="gst_rtcp_packet_get_count ()">gst_rtcp_packet_get_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-length" title="gst_rtcp_packet_get_length ()">gst_rtcp_packet_get_length</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-padding" title="gst_rtcp_packet_get_padding ()">gst_rtcp_packet_get_padding</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb" title="gst_rtcp_packet_get_rb ()">gst_rtcp_packet_get_rb</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb-count" title="gst_rtcp_packet_get_rb_count ()">gst_rtcp_packet_get_rb_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-type" title="gst_rtcp_packet_get_type ()">gst_rtcp_packet_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-move-to-next" title="gst_rtcp_packet_move_to_next ()">gst_rtcp_packet_move_to_next</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-remove" title="gst_rtcp_packet_remove ()">gst_rtcp_packet_remove</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-get-ssrc" title="gst_rtcp_packet_rr_get_ssrc ()">gst_rtcp_packet_rr_get_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-set-ssrc" title="gst_rtcp_packet_rr_set_ssrc ()">gst_rtcp_packet_rr_set_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-entry" title="gst_rtcp_packet_sdes_add_entry ()">gst_rtcp_packet_sdes_add_entry</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-item" title="gst_rtcp_packet_sdes_add_item ()">gst_rtcp_packet_sdes_add_item</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-copy-entry" title="gst_rtcp_packet_sdes_copy_entry ()">gst_rtcp_packet_sdes_copy_entry</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-entry" title="gst_rtcp_packet_sdes_first_entry ()">gst_rtcp_packet_sdes_first_entry</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-item" title="gst_rtcp_packet_sdes_first_item ()">gst_rtcp_packet_sdes_first_item</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-entry" title="gst_rtcp_packet_sdes_get_entry ()">gst_rtcp_packet_sdes_get_entry</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-item-count" title="gst_rtcp_packet_sdes_get_item_count ()">gst_rtcp_packet_sdes_get_item_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-ssrc" title="gst_rtcp_packet_sdes_get_ssrc ()">gst_rtcp_packet_sdes_get_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-entry" title="gst_rtcp_packet_sdes_next_entry ()">gst_rtcp_packet_sdes_next_entry</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-item" title="gst_rtcp_packet_sdes_next_item ()">gst_rtcp_packet_sdes_next_item</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-set-rb" title="gst_rtcp_packet_set_rb ()">gst_rtcp_packet_set_rb</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-get-sender-info" title="gst_rtcp_packet_sr_get_sender_info ()">gst_rtcp_packet_sr_get_sender_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-set-sender-info" title="gst_rtcp_packet_sr_set_sender_info ()">gst_rtcp_packet_sr_set_sender_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-name-to-type" title="gst_rtcp_sdes_name_to_type ()">gst_rtcp_sdes_name_to_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-type-to-name" title="gst_rtcp_sdes_type_to_name ()">gst_rtcp_sdes_type_to_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-unix-to-ntp" title="gst_rtcp_unix_to_ntp ()">gst_rtcp_unix_to_ntp</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-MASK:CAPS" title="GST_RTCP_VALID_MASK">GST_RTCP_VALID_MASK</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-VALUE:CAPS" title="GST_RTCP_VALID_VALUE">GST_RTCP_VALID_VALUE</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VERSION:CAPS" title="GST_RTCP_VERSION">GST_RTCP_VERSION</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">gstrtcpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayload" title="enum GstRTPPayload">GstRTPPayload</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">gstrtppayloads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo">GstRTPPayloadInfo</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">gstrtppayloads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-onebyte-header" title="gst_rtp_buffer_add_extension_onebyte_header ()">gst_rtp_buffer_add_extension_onebyte_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-twobytes-header" title="gst_rtp_buffer_add_extension_twobytes_header ()">gst_rtp_buffer_add_extension_twobytes_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-allocate-data" title="gst_rtp_buffer_allocate_data ()">gst_rtp_buffer_allocate_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-header-len" title="gst_rtp_buffer_calc_header_len ()">gst_rtp_buffer_calc_header_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-packet-len" title="gst_rtp_buffer_calc_packet_len ()">gst_rtp_buffer_calc_packet_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-payload-len" title="gst_rtp_buffer_calc_payload_len ()">gst_rtp_buffer_calc_payload_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-compare-seqnum" title="gst_rtp_buffer_compare_seqnum ()">gst_rtp_buffer_compare_seqnum</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-default-clock-rate" title="gst_rtp_buffer_default_clock_rate ()">gst_rtp_buffer_default_clock_rate</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-ext-timestamp" title="gst_rtp_buffer_ext_timestamp ()">gst_rtp_buffer_ext_timestamp</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc" title="gst_rtp_buffer_get_csrc ()">gst_rtp_buffer_get_csrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc-count" title="gst_rtp_buffer_get_csrc_count ()">gst_rtp_buffer_get_csrc_count</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension" title="gst_rtp_buffer_get_extension ()">gst_rtp_buffer_get_extension</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-data" title="gst_rtp_buffer_get_extension_data ()">gst_rtp_buffer_get_extension_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-onebyte-header" title="gst_rtp_buffer_get_extension_onebyte_header ()">gst_rtp_buffer_get_extension_onebyte_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-twobytes-header" title="gst_rtp_buffer_get_extension_twobytes_header ()">gst_rtp_buffer_get_extension_twobytes_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-header-len" title="gst_rtp_buffer_get_header_len ()">gst_rtp_buffer_get_header_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-marker" title="gst_rtp_buffer_get_marker ()">gst_rtp_buffer_get_marker</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-packet-len" title="gst_rtp_buffer_get_packet_len ()">gst_rtp_buffer_get_packet_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-padding" title="gst_rtp_buffer_get_padding ()">gst_rtp_buffer_get_padding</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload" title="gst_rtp_buffer_get_payload ()">gst_rtp_buffer_get_payload</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-buffer" title="gst_rtp_buffer_get_payload_buffer ()">gst_rtp_buffer_get_payload_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-len" title="gst_rtp_buffer_get_payload_len ()">gst_rtp_buffer_get_payload_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-subbuffer" title="gst_rtp_buffer_get_payload_subbuffer ()">gst_rtp_buffer_get_payload_subbuffer</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-type" title="gst_rtp_buffer_get_payload_type ()">gst_rtp_buffer_get_payload_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-seq" title="gst_rtp_buffer_get_seq ()">gst_rtp_buffer_get_seq</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-ssrc" title="gst_rtp_buffer_get_ssrc ()">gst_rtp_buffer_get_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-timestamp" title="gst_rtp_buffer_get_timestamp ()">gst_rtp_buffer_get_timestamp</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-version" title="gst_rtp_buffer_get_version ()">gst_rtp_buffer_get_version</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate" title="gst_rtp_buffer_new_allocate ()">gst_rtp_buffer_new_allocate</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate-len" title="gst_rtp_buffer_new_allocate_len ()">gst_rtp_buffer_new_allocate_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-copy-data" title="gst_rtp_buffer_new_copy_data ()">gst_rtp_buffer_new_copy_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-take-data" title="gst_rtp_buffer_new_take_data ()">gst_rtp_buffer_new_take_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-pad-to" title="gst_rtp_buffer_pad_to ()">gst_rtp_buffer_pad_to</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-csrc" title="gst_rtp_buffer_set_csrc ()">gst_rtp_buffer_set_csrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension" title="gst_rtp_buffer_set_extension ()">gst_rtp_buffer_set_extension</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension-data" title="gst_rtp_buffer_set_extension_data ()">gst_rtp_buffer_set_extension_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-marker" title="gst_rtp_buffer_set_marker ()">gst_rtp_buffer_set_marker</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-packet-len" title="gst_rtp_buffer_set_packet_len ()">gst_rtp_buffer_set_packet_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-padding" title="gst_rtp_buffer_set_padding ()">gst_rtp_buffer_set_padding</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-payload-type" title="gst_rtp_buffer_set_payload_type ()">gst_rtp_buffer_set_payload_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-seq" title="gst_rtp_buffer_set_seq ()">gst_rtp_buffer_set_seq</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-ssrc" title="gst_rtp_buffer_set_ssrc ()">gst_rtp_buffer_set_ssrc</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-timestamp" title="gst_rtp_buffer_set_timestamp ()">gst_rtp_buffer_set_timestamp</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-version" title="gst_rtp_buffer_set_version ()">gst_rtp_buffer_set_version</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate" title="gst_rtp_buffer_validate ()">gst_rtp_buffer_validate</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate-data" title="gst_rtp_buffer_validate_data ()">gst_rtp_buffer_validate_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-name" title="gst_rtp_payload_info_for_name ()">gst_rtp_payload_info_for_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">gstrtppayloads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-pt" title="gst_rtp_payload_info_for_pt ()">gst_rtp_payload_info_for_pt</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">gstrtppayloads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS" title="GST_RTP_PAYLOAD_IS_DYNAMIC()">GST_RTP_PAYLOAD_IS_DYNAMIC</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">gstrtppayloads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#GST-RTP-VERSION:CAPS" title="GST_RTP_VERSION">GST_RTP_VERSION</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">gstrtpbuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod" title="enum GstRTSPAuthMethod">GstRTSPAuthMethod</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection">GstRTSPConnection</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent">GstRTSPEvent</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtension" title="GstRTSPExtension">GstRTSPExtension</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspextension.html" title="gstrtspextension">gstrtspextension</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtensionInterface" title="struct GstRTSPExtensionInterface">GstRTSPExtensionInterface</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspextension.html" title="gstrtspextension">gstrtspextension</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPFamily" title="enum GstRTSPFamily">GstRTSPFamily</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField">GstRTSPHeaderField</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans" title="enum GstRTSPLowerTrans">GstRTSPLowerTrans</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage">GstRTSPMessage</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod">GstRTSPMethod</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType" title="enum GstRTSPMsgType">GstRTSPMsgType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPProfile" title="enum GstRTSPProfile">GstRTSPProfile</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange">GstRTSPRange</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPRangeUnit" title="enum GstRTSPRangeUnit">GstRTSPRangeUnit</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult">GstRTSPResult</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPState" title="enum GstRTSPState">GstRTSPState</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode">GstRTSPStatusCode</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime" title="struct GstRTSPTime">GstRTSPTime</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange">GstRTSPTimeRange</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeType" title="enum GstRTSPTimeType">GstRTSPTimeType</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode">GstRTSPTransMode</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport">GstRTSPTransport</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl">GstRTSPUrl</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion">GstRTSPVersion</a>, enum in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch">GstRTSPWatch</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs" title="GstRTSPWatchFuncs">GstRTSPWatchFuncs</a>, struct in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-MAX:CAPS" title="GST_RTSP_AUTH_MAX">GST_RTSP_AUTH_MAX</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-decode-ip" title="gst_rtsp_base64_decode_ip ()">gst_rtsp_base64_decode_ip</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">gstrtspbase64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-encode" title="gst_rtsp_base64_encode ()">gst_rtsp_base64_encode</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">gstrtspbase64</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-CHECK:CAPS" title="GST_RTSP_CHECK()">GST_RTSP_CHECK</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-accept" title="gst_rtsp_connection_accept ()">gst_rtsp_connection_accept</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-clear-auth-params" title="gst_rtsp_connection_clear_auth_params ()">gst_rtsp_connection_clear_auth_params</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-close" title="gst_rtsp_connection_close ()">gst_rtsp_connection_close</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-connect" title="gst_rtsp_connection_connect ()">gst_rtsp_connection_connect</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create" title="gst_rtsp_connection_create ()">gst_rtsp_connection_create</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create-from-fd" title="gst_rtsp_connection_create_from_fd ()">gst_rtsp_connection_create_from_fd</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel" title="gst_rtsp_connection_do_tunnel ()">gst_rtsp_connection_do_tunnel</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()">gst_rtsp_connection_flush</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-free" title="gst_rtsp_connection_free ()">gst_rtsp_connection_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-ip" title="gst_rtsp_connection_get_ip ()">gst_rtsp_connection_get_ip</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-readfd" title="gst_rtsp_connection_get_readfd ()">gst_rtsp_connection_get_readfd</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-tunnelid" title="gst_rtsp_connection_get_tunnelid ()">gst_rtsp_connection_get_tunnelid</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-url" title="gst_rtsp_connection_get_url ()">gst_rtsp_connection_get_url</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-writefd" title="gst_rtsp_connection_get_writefd ()">gst_rtsp_connection_get_writefd</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-is-tunneled" title="gst_rtsp_connection_is_tunneled ()">gst_rtsp_connection_is_tunneled</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-next-timeout" title="gst_rtsp_connection_next_timeout ()">gst_rtsp_connection_next_timeout</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-poll" title="gst_rtsp_connection_poll ()">gst_rtsp_connection_poll</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-read" title="gst_rtsp_connection_read ()">gst_rtsp_connection_read</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-receive" title="gst_rtsp_connection_receive ()">gst_rtsp_connection_receive</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-reset-timeout" title="gst_rtsp_connection_reset_timeout ()">gst_rtsp_connection_reset_timeout</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-send" title="gst_rtsp_connection_send ()">gst_rtsp_connection_send</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth" title="gst_rtsp_connection_set_auth ()">gst_rtsp_connection_set_auth</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth-param" title="gst_rtsp_connection_set_auth_param ()">gst_rtsp_connection_set_auth_param</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-http-mode" title="gst_rtsp_connection_set_http_mode ()">gst_rtsp_connection_set_http_mode</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-ip" title="gst_rtsp_connection_set_ip ()">gst_rtsp_connection_set_ip</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-proxy" title="gst_rtsp_connection_set_proxy ()">gst_rtsp_connection_set_proxy</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-qos-dscp" title="gst_rtsp_connection_set_qos_dscp ()">gst_rtsp_connection_set_qos_dscp</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-tunneled" title="gst_rtsp_connection_set_tunneled ()">gst_rtsp_connection_set_tunneled</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-write" title="gst_rtsp_connection_write ()">gst_rtsp_connection_write</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GST-RTSP-DEFAULT-PORT:CAPS" title="GST_RTSP_DEFAULT_PORT">GST_RTSP_DEFAULT_PORT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-header-field" title="gst_rtsp_find_header_field ()">gst_rtsp_find_header_field</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-method" title="gst_rtsp_find_method ()">gst_rtsp_find_method</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-allow-multiple" title="gst_rtsp_header_allow_multiple ()">gst_rtsp_header_allow_multiple</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-as-text" title="gst_rtsp_header_as_text ()">gst_rtsp_header_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-add-header" title="gst_rtsp_message_add_header ()">gst_rtsp_message_add_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-append-headers" title="gst_rtsp_message_append_headers ()">gst_rtsp_message_append_headers</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-dump" title="gst_rtsp_message_dump ()">gst_rtsp_message_dump</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()">gst_rtsp_message_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-body" title="gst_rtsp_message_get_body ()">gst_rtsp_message_get_body</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-header" title="gst_rtsp_message_get_header ()">gst_rtsp_message_get_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-type" title="gst_rtsp_message_get_type ()">gst_rtsp_message_get_type</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init" title="gst_rtsp_message_init ()">gst_rtsp_message_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-data" title="gst_rtsp_message_init_data ()">gst_rtsp_message_init_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-request" title="gst_rtsp_message_init_request ()">gst_rtsp_message_init_request</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-response" title="gst_rtsp_message_init_response ()">gst_rtsp_message_init_response</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new" title="gst_rtsp_message_new ()">gst_rtsp_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-data" title="gst_rtsp_message_new_data ()">gst_rtsp_message_new_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-request" title="gst_rtsp_message_new_request ()">gst_rtsp_message_new_request</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-response" title="gst_rtsp_message_new_response ()">gst_rtsp_message_new_response</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-data" title="gst_rtsp_message_parse_data ()">gst_rtsp_message_parse_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-request" title="gst_rtsp_message_parse_request ()">gst_rtsp_message_parse_request</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-response" title="gst_rtsp_message_parse_response ()">gst_rtsp_message_parse_response</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-remove-header" title="gst_rtsp_message_remove_header ()">gst_rtsp_message_remove_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-set-body" title="gst_rtsp_message_set_body ()">gst_rtsp_message_set_body</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-steal-body" title="gst_rtsp_message_steal_body ()">gst_rtsp_message_steal_body</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-body" title="gst_rtsp_message_take_body ()">gst_rtsp_message_take_body</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-header" title="gst_rtsp_message_take_header ()">gst_rtsp_message_take_header</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset" title="gst_rtsp_message_unset ()">gst_rtsp_message_unset</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">gstrtspmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-method-as-text" title="gst_rtsp_method_as_text ()">gst_rtsp_method_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-options-as-text" title="gst_rtsp_options_as_text ()">gst_rtsp_options_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-free" title="gst_rtsp_range_free ()">gst_rtsp_range_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-parse" title="gst_rtsp_range_parse ()">gst_rtsp_range_parse</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-to-string" title="gst_rtsp_range_to_string ()">gst_rtsp_range_to_string</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">gstrtsprange</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-status-as-text" title="gst_rtsp_status_as_text ()">gst_rtsp_status_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-strresult" title="gst_rtsp_strresult ()">gst_rtsp_strresult</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-as-text" title="gst_rtsp_transport_as_text ()">gst_rtsp_transport_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-free" title="gst_rtsp_transport_free ()">gst_rtsp_transport_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-manager" title="gst_rtsp_transport_get_manager ()">gst_rtsp_transport_get_manager</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-mime" title="gst_rtsp_transport_get_mime ()">gst_rtsp_transport_get_mime</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-init" title="gst_rtsp_transport_init ()">gst_rtsp_transport_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-new" title="gst_rtsp_transport_new ()">gst_rtsp_transport_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-parse" title="gst_rtsp_transport_parse ()">gst_rtsp_transport_parse</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">gstrtsptransport</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-copy" title="gst_rtsp_url_copy ()">gst_rtsp_url_copy</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-decode-path-components" title="gst_rtsp_url_decode_path_components ()">gst_rtsp_url_decode_path_components</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free" title="gst_rtsp_url_free ()">gst_rtsp_url_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-port" title="gst_rtsp_url_get_port ()">gst_rtsp_url_get_port</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-request-uri" title="gst_rtsp_url_get_request_uri ()">gst_rtsp_url_get_request_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-parse" title="gst_rtsp_url_parse ()">gst_rtsp_url_parse</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-set-port" title="gst_rtsp_url_set_port ()">gst_rtsp_url_set_port</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">gstrtspurl</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-version-as-text" title="gst_rtsp_version_as_text ()">gst_rtsp_version_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">gstrtspdefs</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-attach" title="gst_rtsp_watch_attach ()">gst_rtsp_watch_attach</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-new" title="gst_rtsp_watch_new ()">gst_rtsp_watch_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-data" title="gst_rtsp_watch_queue_data ()">gst_rtsp_watch_queue_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-message" title="gst_rtsp_watch_queue_message ()">gst_rtsp_watch_queue_message</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-reset" title="gst_rtsp_watch_reset ()">gst_rtsp_watch_reset</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-send-message" title="gst_rtsp_watch_send_message ()">gst_rtsp_watch_send_message</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-unref" title="gst_rtsp_watch_unref ()">gst_rtsp_watch_unref</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-write-data" title="gst_rtsp_watch_write_data ()">gst_rtsp_watch_write_data</a>, function in <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">gstrtspconnection</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute">GstSDPAttribute</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth">GstSDPBandwidth</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection">GstSDPConnection</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey">GstSDPKey</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia">GstSDPMedia</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage">GstSDPMessage</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin">GstSDPOrigin</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult">GstSDPResult</a>, enum in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime">GstSDPTime</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone">GstSDPZone</a>, struct in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-address-is-multicast" title="gst_sdp_address_is_multicast ()">gst_sdp_address_is_multicast</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-AS:CAPS" title="GST_SDP_BWTYPE_AS">GST_SDP_BWTYPE_AS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-CT:CAPS" title="GST_SDP_BWTYPE_CT">GST_SDP_BWTYPE_CT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-EXT-PREFIX:CAPS" title="GST_SDP_BWTYPE_EXT_PREFIX">GST_SDP_BWTYPE_EXT_PREFIX</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RR:CAPS" title="GST_SDP_BWTYPE_RR">GST_SDP_BWTYPE_RR</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RS:CAPS" title="GST_SDP_BWTYPE_RS">GST_SDP_BWTYPE_RS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-TIAS:CAPS" title="GST_SDP_BWTYPE_TIAS">GST_SDP_BWTYPE_TIAS</a>, macro in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-attribute" title="gst_sdp_media_add_attribute ()">gst_sdp_media_add_attribute</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-bandwidth" title="gst_sdp_media_add_bandwidth ()">gst_sdp_media_add_bandwidth</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-connection" title="gst_sdp_media_add_connection ()">gst_sdp_media_add_connection</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-format" title="gst_sdp_media_add_format ()">gst_sdp_media_add_format</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-as-text" title="gst_sdp_media_as_text ()">gst_sdp_media_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-attributes-len" title="gst_sdp_media_attributes_len ()">gst_sdp_media_attributes_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-bandwidths-len" title="gst_sdp_media_bandwidths_len ()">gst_sdp_media_bandwidths_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-connections-len" title="gst_sdp_media_connections_len ()">gst_sdp_media_connections_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-formats-len" title="gst_sdp_media_formats_len ()">gst_sdp_media_formats_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-free" title="gst_sdp_media_free ()">gst_sdp_media_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute" title="gst_sdp_media_get_attribute ()">gst_sdp_media_get_attribute</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val" title="gst_sdp_media_get_attribute_val ()">gst_sdp_media_get_attribute_val</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val-n" title="gst_sdp_media_get_attribute_val_n ()">gst_sdp_media_get_attribute_val_n</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-bandwidth" title="gst_sdp_media_get_bandwidth ()">gst_sdp_media_get_bandwidth</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-connection" title="gst_sdp_media_get_connection ()">gst_sdp_media_get_connection</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-format" title="gst_sdp_media_get_format ()">gst_sdp_media_get_format</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-information" title="gst_sdp_media_get_information ()">gst_sdp_media_get_information</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-key" title="gst_sdp_media_get_key ()">gst_sdp_media_get_key</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-media" title="gst_sdp_media_get_media ()">gst_sdp_media_get_media</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-num-ports" title="gst_sdp_media_get_num_ports ()">gst_sdp_media_get_num_ports</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-port" title="gst_sdp_media_get_port ()">gst_sdp_media_get_port</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-proto" title="gst_sdp_media_get_proto ()">gst_sdp_media_get_proto</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init" title="gst_sdp_media_init ()">gst_sdp_media_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new" title="gst_sdp_media_new ()">gst_sdp_media_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-information" title="gst_sdp_media_set_information ()">gst_sdp_media_set_information</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-key" title="gst_sdp_media_set_key ()">gst_sdp_media_set_key</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-media" title="gst_sdp_media_set_media ()">gst_sdp_media_set_media</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-port-info" title="gst_sdp_media_set_port_info ()">gst_sdp_media_set_port_info</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-proto" title="gst_sdp_media_set_proto ()">gst_sdp_media_set_proto</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-uninit" title="gst_sdp_media_uninit ()">gst_sdp_media_uninit</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-attribute" title="gst_sdp_message_add_attribute ()">gst_sdp_message_add_attribute</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-bandwidth" title="gst_sdp_message_add_bandwidth ()">gst_sdp_message_add_bandwidth</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-email" title="gst_sdp_message_add_email ()">gst_sdp_message_add_email</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-media" title="gst_sdp_message_add_media ()">gst_sdp_message_add_media</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-phone" title="gst_sdp_message_add_phone ()">gst_sdp_message_add_phone</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-time" title="gst_sdp_message_add_time ()">gst_sdp_message_add_time</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-zone" title="gst_sdp_message_add_zone ()">gst_sdp_message_add_zone</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-text" title="gst_sdp_message_as_text ()">gst_sdp_message_as_text</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-uri" title="gst_sdp_message_as_uri ()">gst_sdp_message_as_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-attributes-len" title="gst_sdp_message_attributes_len ()">gst_sdp_message_attributes_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-bandwidths-len" title="gst_sdp_message_bandwidths_len ()">gst_sdp_message_bandwidths_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-dump" title="gst_sdp_message_dump ()">gst_sdp_message_dump</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-emails-len" title="gst_sdp_message_emails_len ()">gst_sdp_message_emails_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-free" title="gst_sdp_message_free ()">gst_sdp_message_free</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute" title="gst_sdp_message_get_attribute ()">gst_sdp_message_get_attribute</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val" title="gst_sdp_message_get_attribute_val ()">gst_sdp_message_get_attribute_val</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val-n" title="gst_sdp_message_get_attribute_val_n ()">gst_sdp_message_get_attribute_val_n</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-bandwidth" title="gst_sdp_message_get_bandwidth ()">gst_sdp_message_get_bandwidth</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-connection" title="gst_sdp_message_get_connection ()">gst_sdp_message_get_connection</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-email" title="gst_sdp_message_get_email ()">gst_sdp_message_get_email</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-information" title="gst_sdp_message_get_information ()">gst_sdp_message_get_information</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-key" title="gst_sdp_message_get_key ()">gst_sdp_message_get_key</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-media" title="gst_sdp_message_get_media ()">gst_sdp_message_get_media</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-origin" title="gst_sdp_message_get_origin ()">gst_sdp_message_get_origin</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-phone" title="gst_sdp_message_get_phone ()">gst_sdp_message_get_phone</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-session-name" title="gst_sdp_message_get_session_name ()">gst_sdp_message_get_session_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-time" title="gst_sdp_message_get_time ()">gst_sdp_message_get_time</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-uri" title="gst_sdp_message_get_uri ()">gst_sdp_message_get_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-version" title="gst_sdp_message_get_version ()">gst_sdp_message_get_version</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-zone" title="gst_sdp_message_get_zone ()">gst_sdp_message_get_zone</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-init" title="gst_sdp_message_init ()">gst_sdp_message_init</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-medias-len" title="gst_sdp_message_medias_len ()">gst_sdp_message_medias_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new" title="gst_sdp_message_new ()">gst_sdp_message_new</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-buffer" title="gst_sdp_message_parse_buffer ()">gst_sdp_message_parse_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-uri" title="gst_sdp_message_parse_uri ()">gst_sdp_message_parse_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-phones-len" title="gst_sdp_message_phones_len ()">gst_sdp_message_phones_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-connection" title="gst_sdp_message_set_connection ()">gst_sdp_message_set_connection</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-information" title="gst_sdp_message_set_information ()">gst_sdp_message_set_information</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-key" title="gst_sdp_message_set_key ()">gst_sdp_message_set_key</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-origin" title="gst_sdp_message_set_origin ()">gst_sdp_message_set_origin</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-session-name" title="gst_sdp_message_set_session_name ()">gst_sdp_message_set_session_name</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-uri" title="gst_sdp_message_set_uri ()">gst_sdp_message_set_uri</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-version" title="gst_sdp_message_set_version ()">gst_sdp_message_set_version</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-times-len" title="gst_sdp_message_times_len ()">gst_sdp_message_times_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-uninit" title="gst_sdp_message_uninit ()">gst_sdp_message_uninit</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-zones-len" title="gst_sdp_message_zones_len ()">gst_sdp_message_zones_len</a>, function in <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">gstsdpmessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume-struct" title="GstStreamVolume">GstStreamVolume</a>, struct in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--mute" title='The "mute" property'>GstStreamVolume:mute</a>, object property in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--volume" title='The "volume" property'>GstStreamVolume:volume</a>, object property in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat">GstStreamVolumeFormat</a>, enum in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume" title="gst_stream_volume_convert_volume ()">gst_stream_volume_convert_volume</a>, function in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-mute" title="gst_stream_volume_get_mute ()">gst_stream_volume_get_mute</a>, function in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-volume" title="gst_stream_volume_get_volume ()">gst_stream_volume_get_volume</a>, function in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-mute" title="gst_stream_volume_set_mute ()">gst_stream_volume_set_mute</a>, function in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-volume" title="gst_stream_volume_set_volume ()">gst_stream_volume_set_volume</a>, function in <a class="link" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">gststreamvolume</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemux" title="struct GstTagDemux">GstTagDemux</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttagdemux.html" title="gsttagdemux">gsttagdemux</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxClass" title="struct GstTagDemuxClass">GstTagDemuxClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttagdemux.html" title="gsttagdemux">gsttagdemux</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxResult" title="enum GstTagDemuxResult">GstTagDemuxResult</a>, enum in <a class="link" href="gst-plugins-base-libs-gsttagdemux.html" title="gsttagdemux">gsttagdemux</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GstTagImageType" title="enum GstTagImageType">GstTagImageType</a>, enum in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags" title="enum GstTagLicenseFlags">GstTagLicenseFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMux" title="struct GstTagMux">GstTagMux</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttagmux.html" title="gsttagmux">gsttagmux</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMuxClass" title="struct GstTagMuxClass">GstTagMuxClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttagmux.html" title="gsttagmux">gsttagmux</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-CONTRAST:CAPS" title="GST_TAG_CAPTURING_CONTRAST">GST_TAG_CAPTURING_CONTRAST</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS" title="GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO">GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_COMPENSATION">GST_TAG_CAPTURING_EXPOSURE_COMPENSATION</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_MODE">GST_TAG_CAPTURING_EXPOSURE_MODE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_PROGRAM">GST_TAG_CAPTURING_EXPOSURE_PROGRAM</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-FIRED:CAPS" title="GST_TAG_CAPTURING_FLASH_FIRED">GST_TAG_CAPTURING_FLASH_FIRED</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-MODE:CAPS" title="GST_TAG_CAPTURING_FLASH_MODE">GST_TAG_CAPTURING_FLASH_MODE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS" title="GST_TAG_CAPTURING_FOCAL_LENGTH">GST_TAG_CAPTURING_FOCAL_LENGTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-RATIO:CAPS" title="GST_TAG_CAPTURING_FOCAL_RATIO">GST_TAG_CAPTURING_FOCAL_RATIO</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS" title="GST_TAG_CAPTURING_GAIN_ADJUSTMENT">GST_TAG_CAPTURING_GAIN_ADJUSTMENT</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-ISO-SPEED:CAPS" title="GST_TAG_CAPTURING_ISO_SPEED">GST_TAG_CAPTURING_ISO_SPEED</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-METERING-MODE:CAPS" title="GST_TAG_CAPTURING_METERING_MODE">GST_TAG_CAPTURING_METERING_MODE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SATURATION:CAPS" title="GST_TAG_CAPTURING_SATURATION">GST_TAG_CAPTURING_SATURATION</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS" title="GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE">GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHARPNESS:CAPS" title="GST_TAG_CAPTURING_SHARPNESS">GST_TAG_CAPTURING_SHARPNESS</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS" title="GST_TAG_CAPTURING_SHUTTER_SPEED">GST_TAG_CAPTURING_SHUTTER_SPEED</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SOURCE:CAPS" title="GST_TAG_CAPTURING_SOURCE">GST_TAG_CAPTURING_SOURCE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-WHITE-BALANCE:CAPS" title="GST_TAG_CAPTURING_WHITE_BALANCE">GST_TAG_CAPTURING_WHITE_BALANCE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID:CAPS" title="GST_TAG_CDDA_CDDB_DISCID">GST_TAG_CDDA_CDDB_DISCID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS" title="GST_TAG_CDDA_CDDB_DISCID_FULL">GST_TAG_CDDA_CDDB_DISCID_FULL</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID">GST_TAG_CDDA_MUSICBRAINZ_DISCID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL">GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-TRACK-TAGS:CAPS" title="GST_TAG_CDDA_TRACK_TAGS">GST_TAG_CDDA_TRACK_TAGS</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-CLIP:CAPS" title="GST_TAG_CMML_CLIP">GST_TAG_CMML_CLIP</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-HEAD:CAPS" title="GST_TAG_CMML_HEAD">GST_TAG_CMML_HEAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-STREAM:CAPS" title="GST_TAG_CMML_STREAM">GST_TAG_CMML_STREAM</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-freeform-string-to-utf8" title="gst_tag_freeform_string_to_utf8 ()">gst_tag_freeform_string_to_utf8</a>, function in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-tag" title="gst_tag_from_id3_tag ()">gst_tag_from_id3_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-user-tag" title="gst_tag_from_id3_user_tag ()">gst_tag_from_id3_user_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-from-vorbis-tag" title="gst_tag_from_vorbis_tag ()">gst_tag_from_vorbis_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-get-id3v2-tag-size" title="gst_tag_get_id3v2_tag_size ()">gst_tag_get_id3v2_tag_size</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code" title="gst_tag_get_language_code()">gst_tag_get_language_code</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-codes" title="gst_tag_get_language_codes ()">gst_tag_get_language_codes</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-1" title="gst_tag_get_language_code_iso_639_1 ()">gst_tag_get_language_code_iso_639_1</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2B" title="gst_tag_get_language_code_iso_639_2B ()">gst_tag_get_language_code_iso_639_2B</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2T" title="gst_tag_get_language_code_iso_639_2T ()">gst_tag_get_language_code_iso_639_2T</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-name" title="gst_tag_get_language_name ()">gst_tag_get_language_name</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">gsttaglanguagecodes</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-licenses" title="gst_tag_get_licenses ()">gst_tag_get_licenses</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-description" title="gst_tag_get_license_description ()">gst_tag_get_license_description</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-flags" title="gst_tag_get_license_flags ()">gst_tag_get_license_flags</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-jurisdiction" title="gst_tag_get_license_jurisdiction ()">gst_tag_get_license_jurisdiction</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-nick" title="gst_tag_get_license_nick ()">gst_tag_get_license_nick</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-title" title="gst_tag_get_license_title ()">gst_tag_get_license_title</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-version" title="gst_tag_get_license_version ()">gst_tag_get_license_version</a>, function in <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">gsttaglicenses</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-ID3V2-HEADER-SIZE:CAPS" title="GST_TAG_ID3V2_HEADER_SIZE">GST_TAG_ID3V2_HEADER_SIZE</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-count" title="gst_tag_id3_genre_count ()">gst_tag_id3_genre_count</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-get" title="gst_tag_id3_genre_get ()">gst_tag_id3_genre_get</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer" title="gst_tag_image_data_to_image_buffer ()">gst_tag_image_data_to_image_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS" title="GST_TAG_IMAGE_HORIZONTAL_PPI">GST_TAG_IMAGE_HORIZONTAL_PPI</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-VERTICAL-PPI:CAPS" title="GST_TAG_IMAGE_VERTICAL_PPI">GST_TAG_IMAGE_VERTICAL_PPI</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-add-id3-image" title="gst_tag_list_add_id3_image ()">gst_tag_list_add_id3_image</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer" title="gst_tag_list_from_exif_buffer ()">gst_tag_list_from_exif_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">gsttagexif</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer-with-tiff-header" title="gst_tag_list_from_exif_buffer_with_tiff_header ()">gst_tag_list_from_exif_buffer_with_tiff_header</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">gsttagexif</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-from-id3v2-tag" title="gst_tag_list_from_id3v2_tag ()">gst_tag_list_from_id3v2_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-from-vorbiscomment-buffer" title="gst_tag_list_from_vorbiscomment_buffer ()">gst_tag_list_from_vorbiscomment_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-from-xmp-buffer" title="gst_tag_list_from_xmp_buffer ()">gst_tag_list_from_xmp_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">gsttagxmp</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-new-from-id3v1" title="gst_tag_list_new_from_id3v1 ()">gst_tag_list_new_from_id3v1</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer" title="gst_tag_list_to_exif_buffer ()">gst_tag_list_to_exif_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">gsttagexif</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer-with-tiff-header" title="gst_tag_list_to_exif_buffer_with_tiff_header ()">gst_tag_list_to_exif_buffer_with_tiff_header</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">gsttagexif</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-to-vorbiscomment-buffer" title="gst_tag_list_to_vorbiscomment_buffer ()">gst_tag_list_to_vorbiscomment_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer" title="gst_tag_list_to_xmp_buffer ()">gst_tag_list_to_xmp_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">gsttagxmp</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer-full" title="gst_tag_list_to_xmp_buffer_full ()">gst_tag_list_to_xmp_buffer_full</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">gsttagxmp</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS" title="GST_TAG_MUSICBRAINZ_ALBUMARTISTID">GST_TAG_MUSICBRAINZ_ALBUMARTISTID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMID:CAPS" title="GST_TAG_MUSICBRAINZ_ALBUMID">GST_TAG_MUSICBRAINZ_ALBUMID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ARTISTID:CAPS" title="GST_TAG_MUSICBRAINZ_ARTISTID">GST_TAG_MUSICBRAINZ_ARTISTID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-SORTNAME:CAPS" title="GST_TAG_MUSICBRAINZ_SORTNAME">GST_TAG_MUSICBRAINZ_SORTNAME</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRACKID:CAPS" title="GST_TAG_MUSICBRAINZ_TRACKID">GST_TAG_MUSICBRAINZ_TRACKID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRMID:CAPS" title="GST_TAG_MUSICBRAINZ_TRMID">GST_TAG_MUSICBRAINZ_TRMID</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-parse-extended-comment" title="gst_tag_parse_extended_comment ()">gst_tag_parse_extended_comment</a>, function in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-register-musicbrainz-tags" title="gst_tag_register_musicbrainz_tags ()">gst_tag_register_musicbrainz_tags</a>, function in <a class="link" href="gst-plugins-base-libs-gsttag.html" title="gsttag">gsttag</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-to-id3-tag" title="gst_tag_to_id3_tag ()">gst_tag_to_id3_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">gsttagid3</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-comments" title="gst_tag_to_vorbis_comments ()">gst_tag_to_vorbis_comments</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-tag" title="gst_tag_to_vorbis_tag ()">gst_tag_to_vorbis_tag</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-xmp-list-schemas" title="gst_tag_xmp_list_schemas ()">gst_tag_xmp_list_schemas</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">gsttagxmp</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-all-schemas" title="gst_tag_xmp_writer_add_all_schemas ()">gst_tag_xmp_writer_add_all_schemas</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-schema" title="gst_tag_xmp_writer_add_schema ()">gst_tag_xmp_writer_add_schema</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-has-schema" title="gst_tag_xmp_writer_has_schema ()">gst_tag_xmp_writer_has_schema</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-all-schemas" title="gst_tag_xmp_writer_remove_all_schemas ()">gst_tag_xmp_writer_remove_all_schemas</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-schema" title="gst_tag_xmp_writer_remove_schema ()">gst_tag_xmp_writer_remove_schema</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-tag-list-to-xmp-buffer" title="gst_tag_xmp_writer_tag_list_to_xmp_buffer ()">gst_tag_xmp_writer_tag_list_to_xmp_buffer</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">gsttagxmpwriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-struct" title="GstTuner">GstTuner</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-channel-changed" title='The "channel-changed" signal'>GstTuner::channel-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-frequency-changed" title='The "frequency-changed" signal'>GstTuner::frequency-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-norm-changed" title='The "norm-changed" signal'>GstTuner::norm-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-signal-changed" title='The "signal-changed" signal'>GstTuner::signal-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-struct" title="struct GstTunerChannel">GstTunerChannel</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">gsttunerchannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-frequency-changed" title='The "frequency-changed" signal'>GstTunerChannel::frequency-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">gsttunerchannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-signal-changed" title='The "signal-changed" signal'>GstTunerChannel::signal-changed</a>, object signal in <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">gsttunerchannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags" title="enum GstTunerChannelFlags">GstTunerChannelFlags</a>, enum in <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">gsttunerchannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTunerClass" title="struct GstTunerClass">GstTunerClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm-struct" title="struct GstTunerNorm">GstTunerNorm</a>, struct in <a class="link" href="gst-plugins-base-libs-gsttunernorm.html" title="gsttunernorm">gsttunernorm</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-channel-changed" title="gst_tuner_channel_changed ()">gst_tuner_channel_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS" title="GST_TUNER_CHANNEL_HAS_FLAG()">GST_TUNER_CHANNEL_HAS_FLAG</a>, macro in <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">gsttunerchannel</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-channel-by-name" title="gst_tuner_find_channel_by_name ()">gst_tuner_find_channel_by_name</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-norm-by-name" title="gst_tuner_find_norm_by_name ()">gst_tuner_find_norm_by_name</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-frequency-changed" title="gst_tuner_frequency_changed ()">gst_tuner_frequency_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-channel" title="gst_tuner_get_channel ()">gst_tuner_get_channel</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-frequency" title="gst_tuner_get_frequency ()">gst_tuner_get_frequency</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-norm" title="gst_tuner_get_norm ()">gst_tuner_get_norm</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-channels" title="gst_tuner_list_channels ()">gst_tuner_list_channels</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-norms" title="gst_tuner_list_norms ()">gst_tuner_list_norms</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-norm-changed" title="gst_tuner_norm_changed ()">gst_tuner_norm_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-channel" title="gst_tuner_set_channel ()">gst_tuner_set_channel</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency" title="gst_tuner_set_frequency ()">gst_tuner_set_frequency</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-norm" title="gst_tuner_set_norm ()">gst_tuner_set_norm</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-changed" title="gst_tuner_signal_changed ()">gst_tuner_signal_changed</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength" title="gst_tuner_signal_strength ()">gst_tuner_signal_strength</a>, function in <a class="link" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">gsttuner</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback" title="GstVideoConvertFrameCallback ()">GstVideoConvertFrameCallback</a>, user_function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct" title="struct GstVideoFilter">GstVideoFilter</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideofilter.html" title="gstvideofilter">gstvideofilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilterClass" title="struct GstVideoFilterClass">GstVideoFilterClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideofilter.html" title="gstvideofilter">gstvideofilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat">GstVideoFormat</a>, enum in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation-struct" title="GstVideoOrientation">GstVideoOrientation</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientationInterface" title="struct GstVideoOrientationInterface">GstVideoOrientationInterface</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle">GstVideoRectangle</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink-struct" title="struct GstVideoSink">GstVideoSink</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink--show-preroll-frame" title='The "show-preroll-frame" property'>GstVideoSink:show-preroll-frame</a>, object property in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSinkClass" title="struct GstVideoSinkClass">GstVideoSinkClass</a>, struct in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-calculate-display-ratio" title="gst_video_calculate_display_ratio ()">gst_video_calculate_display_ratio</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame" title="gst_video_convert_frame ()">gst_video_convert_frame</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame-async" title="gst_video_convert_frame_async ()">gst_video_convert_frame_async</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame" title="gst_video_event_new_still_frame ()">gst_video_event_new_still_frame</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-parse-still-frame" title="gst_video_event_parse_still_frame ()">gst_video_event_parse_still_frame</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-format-from-fourcc" title="gst_video_format_from_fourcc ()">gst_video_format_from_fourcc</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-format-to-fourcc" title="gst_video_format_to_fourcc ()">gst_video_format_to_fourcc</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FPS-RANGE:CAPS" title="GST_VIDEO_FPS_RANGE">GST_VIDEO_FPS_RANGE</a>, macro in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hcenter" title="gst_video_orientation_get_hcenter ()">gst_video_orientation_get_hcenter</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hflip" title="gst_video_orientation_get_hflip ()">gst_video_orientation_get_hflip</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vcenter" title="gst_video_orientation_get_vcenter ()">gst_video_orientation_get_vcenter</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vflip" title="gst_video_orientation_get_vflip ()">gst_video_orientation_get_vflip</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hcenter" title="gst_video_orientation_set_hcenter ()">gst_video_orientation_set_hcenter</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hflip" title="gst_video_orientation_set_hflip ()">gst_video_orientation_set_hflip</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vcenter" title="gst_video_orientation_set_vcenter ()">gst_video_orientation_set_vcenter</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vflip" title="gst_video_orientation_set_vflip ()">gst_video_orientation_set_vflip</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">gstvideoorientation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-expose" title="gst_video_overlay_expose ()">gst_video_overlay_expose</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-got-window-handle" title="gst_video_overlay_got_window_handle ()">gst_video_overlay_got_window_handle</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-handle-events" title="gst_video_overlay_handle_events ()">gst_video_overlay_handle_events</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-prepare-window-handle" title="gst_video_overlay_prepare_window_handle ()">gst_video_overlay_prepare_window_handle</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-render-rectangle" title="gst_video_overlay_set_render_rectangle ()">gst_video_overlay_set_render_rectangle</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()">gst_video_overlay_set_window_handle</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">gstvideooverlay</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-parse-caps-palette" title="gst_video_parse_caps_palette ()">gst_video_parse_caps_palette</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#gst-video-sink-center-rect" title="gst_video_sink_center_rect ()">gst_video_sink_center_rect</a>, function in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-HEIGHT:CAPS" title="GST_VIDEO_SINK_HEIGHT()">GST_VIDEO_SINK_HEIGHT</a>, macro in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-PAD:CAPS" title="GST_VIDEO_SINK_PAD()">GST_VIDEO_SINK_PAD</a>, macro in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-WIDTH:CAPS" title="GST_VIDEO_SINK_WIDTH()">GST_VIDEO_SINK_WIDTH</a>, macro in <a class="link" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">gstvideosink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-SIZE-RANGE:CAPS" title="GST_VIDEO_SIZE_RANGE">GST_VIDEO_SIZE_RANGE</a>, macro in <a class="link" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">gstvideo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-vorbis-tag-add" title="gst_vorbis_tag_add ()">gst_vorbis_tag_add</a>, function in <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">gsttagvorbis</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/compiling.html b/docs/libs/html/compiling.html
new file mode 100644
index 0000000..0a45ce1
--- /dev/null
+++ b/docs/libs/html/compiling.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Compiling</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="next" href="gstreamer-app.html" title="App Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gstreamer-plugins-base.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-app.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="compiling"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">Compiling</span></h2>
+<p>Compiling against the base plugins libraries —
+How to compile against the base plugins libraries
+</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id444048"></a><h2>Compiling against the base plugins libraries</h2>
+<p>
+To compile against these libraries, you need to tell the compiler where to
+find the header files and libraries. This is done with the
+<span class="application">pkg-config</span> utility.
+</p>
+<p>
+The following interactive shell session demonstrates how
+<span class="application">pkg-config</span> is used:
+</p>
+<pre class="programlisting">
+$ pkg-config --cflags gstreamer-plugins-base-0.11
+-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -pthread -I/usr/include/gstreamer-0.11 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libxml2
+$ pkg-config --libs gstreamer-plugins-base-0.11
+-Wl,--export-dynamic -pthread -lgstreamer-0.11 -lgobject-2.0 -lgmodule-2.0 -ldl -lgthread-2.0 -lxml2 -lpthread -lz -lm -lglib-2.0
+</pre>
+<p>
+</p>
+<p>
+Note that, because of the number of libraries provided in this package,
+the pkg-config information <span class="emphasis"><em>does not add -l flags</em></span> itself
+to choose the libraries to link to. You must add these yourself to select
+which of the libraries you want to use.
+</p>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-appsink.html b/docs/libs/html/gst-plugins-base-libs-appsink.html
new file mode 100644
index 0000000..de655e2
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-appsink.html
@@ -0,0 +1,559 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>appsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-app.html" title="App Library">
+<link rel="prev" href="gst-plugins-base-libs-appsrc.html" title="appsrc">
+<link rel="next" href="gstreamer-audio.html" title="Audio Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-appsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-app.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-audio.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-appsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-appsink.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-appsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-appsink.top_of_page"></a>appsink</span></h2>
+<p>appsink — Easy way for applications to extract buffers from a
+ pipeline</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-appsink.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/app/gstappsink.h&gt;
+
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-caps" title="gst_app_sink_set_caps ()">gst_app_sink_set_caps</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-caps" title="gst_app_sink_get_caps ()">gst_app_sink_get_caps</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()">gst_app_sink_is_eos</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-emit-signals" title="gst_app_sink_set_emit_signals ()">gst_app_sink_set_emit_signals</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> emit</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-emit-signals" title="gst_app_sink_get_emit_signals ()">gst_app_sink_get_emit_signals</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-max-buffers" title="gst_app_sink_set_max_buffers ()">gst_app_sink_set_max_buffers</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> max</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-max-buffers" title="gst_app_sink_get_max_buffers ()">gst_app_sink_get_max_buffers</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-drop" title="gst_app_sink_set_drop ()">gst_app_sink_set_drop</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> drop</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-get-drop" title="gst_app_sink_get_drop ()">gst_app_sink_get_drop</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll" title="gst_app_sink_pull_preroll ()">gst_app_sink_pull_preroll</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" title="gst_app_sink_pull_buffer ()">gst_app_sink_pull_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="returnvalue">GstBufferList</span></a> * <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer-list" title="gst_app_sink_pull_buffer_list ()">gst_app_sink_pull_buffer_list</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);
+ <a class="link" href="gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks" title="GstAppSinkCallbacks">GstAppSinkCallbacks</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-callbacks" title="gst_app_sink_set_callbacks ()">gst_app_sink_set_callbacks</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks" title="GstAppSinkCallbacks"><span class="type">GstAppSinkCallbacks</span></a> *callbacks</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsink.description"></a><h2>Description</h2>
+<p>
+Appsink is a sink plugin that supports many different methods for making
+the application get a handle on the GStreamer data in a pipeline. Unlike
+most GStreamer elements, Appsink provides external API functions.
+</p>
+<p>
+appsink can be used by linking to the gstappsink.h header file to access the
+methods or by using the appsink action signals and properties.
+</p>
+<p>
+The normal way of retrieving buffers from appsink is by using the
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" title="gst_app_sink_pull_buffer ()"><code class="function">gst_app_sink_pull_buffer()</code></a> and <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll" title="gst_app_sink_pull_preroll ()"><code class="function">gst_app_sink_pull_preroll()</code></a> methods.
+These methods block until a buffer becomes available in the sink or when the
+sink is shut down or reaches EOS.
+</p>
+<p>
+Appsink will internally use a queue to collect buffers from the streaming
+thread. If the application is not pulling buffers fast enough, this queue
+will consume a lot of memory over time. The "max-buffers" property can be
+used to limit the queue size. The "drop" property controls whether the
+streaming thread blocks or if older buffers are dropped when the maximum
+queue size is reached. Note that blocking the streaming thread can negatively
+affect real-time performance and should be avoided.
+</p>
+<p>
+If a blocking behaviour is not desirable, setting the "emit-signals" property
+to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> will make appsink emit the "new-buffer" and "new-preroll" signals
+when a buffer can be pulled without blocking.
+</p>
+<p>
+The "caps" property on appsink can be used to control the formats that
+appsink can receive. This property can contain non-fixed caps, the format of
+the pulled buffers can be obtained by getting the buffer caps.
+</p>
+<p>
+If one of the pull-preroll or pull-buffer methods return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the appsink
+is stopped or in the EOS state. You can check for the EOS state with the
+"eos" property or with the <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()"><code class="function">gst_app_sink_is_eos()</code></a> method.
+</p>
+<p>
+The eos signal can also be used to be informed when the EOS state is reached
+to avoid polling.
+</p>
+<p>
+Last reviewed on 2008-12-17 (0.10.22)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-app-sink-set-caps"></a><h3>gst_app_sink_set_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_sink_set_caps (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Set the capabilities on the appsink element. This function takes
+a copy of the caps structure. After calling this method, the sink will only
+accept caps that match <em class="parameter"><code>caps</code></em>. If <em class="parameter"><code>caps</code></em> is non-fixed, you must check the caps
+on the buffers to get the actual used caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>caps to set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-get-caps"></a><h3>gst_app_sink_get_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_app_sink_get_caps (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Get the configured caps on <em class="parameter"><code>appsink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> accepted by the sink. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-is-eos"></a><h3>gst_app_sink_is_eos ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_app_sink_is_eos (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>appsink</code></em> is EOS, which is when no more buffers can be pulled because
+an EOS event was received.
+</p>
+<p>
+This function also returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when the appsink is not in the PAUSED or
+PLAYING state.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if no more buffers can be pulled and the appsink is EOS.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-set-emit-signals"></a><h3>gst_app_sink_set_emit_signals ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_sink_set_emit_signals (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> emit</code></em>);</pre>
+<p>
+Make appsink emit the "new-preroll" and "new-buffer" signals. This option is
+by default disabled because signal emission is expensive and unneeded when
+the application prefers to operate in pull mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>emit</code></em> :</span></p></td>
+<td>the new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-get-emit-signals"></a><h3>gst_app_sink_get_emit_signals ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_app_sink_get_emit_signals (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Check if appsink will emit the "new-preroll" and "new-buffer" signals.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>appsink</code></em> is emiting the "new-preroll" and "new-buffer"
+signals.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-set-max-buffers"></a><h3>gst_app_sink_set_max_buffers ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_sink_set_max_buffers (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> max</code></em>);</pre>
+<p>
+Set the maximum amount of buffers that can be queued in <em class="parameter"><code>appsink</code></em>. After this
+amount of buffers are queued in appsink, any more buffers will block upstream
+elements until a buffer is pulled from <em class="parameter"><code>appsink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>the maximum number of buffers to queue</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-get-max-buffers"></a><h3>gst_app_sink_get_max_buffers ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_app_sink_get_max_buffers (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Get the maximum amount of buffers that can be queued in <em class="parameter"><code>appsink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The maximum amount of buffers that can be queued.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-set-drop"></a><h3>gst_app_sink_set_drop ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_sink_set_drop (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> drop</code></em>);</pre>
+<p>
+Instruct <em class="parameter"><code>appsink</code></em> to drop old buffers when the maximum amount of queued
+buffers is reached.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>drop</code></em> :</span></p></td>
+<td>the new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-get-drop"></a><h3>gst_app_sink_get_drop ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_app_sink_get_drop (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>appsink</code></em> will drop old buffers when the maximum amount of queued
+buffers is reached.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>appsink</code></em> is dropping old buffers when the queue is
+filled.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-pull-preroll"></a><h3>gst_app_sink_pull_preroll ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_app_sink_pull_preroll (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+Get the last preroll buffer in <em class="parameter"><code>appsink</code></em>. This was the buffer that caused the
+appsink to preroll in the PAUSED state. This buffer can be pulled many times
+and remains available to the application even after EOS.
+</p>
+<p>
+This function is typically used when dealing with a pipeline in the PAUSED
+state. Calling this function after doing a seek will give the buffer right
+after the seek position.
+</p>
+<p>
+Note that the preroll buffer will also be returned as the first buffer
+when calling <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" title="gst_app_sink_pull_buffer ()"><code class="function">gst_app_sink_pull_buffer()</code></a>.
+</p>
+<p>
+If an EOS event was received before any buffers, this function returns
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. Use <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()"><code class="function">gst_app_sink_is_eos()</code></a> to check for the EOS condition.
+</p>
+<p>
+This function blocks until a preroll buffer or EOS is received or the appsink
+element is set to the READY/NULL state.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> or NULL when the appsink is stopped or EOS.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-pull-buffer"></a><h3>gst_app_sink_pull_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_app_sink_pull_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+This function blocks until a buffer or EOS becomes available or the appsink
+element is set to the READY/NULL state.
+</p>
+<p>
+This function will only return buffers when the appsink is in the PLAYING
+state. All rendered buffers will be put in a queue so that the application
+can pull buffers at its own rate. Note that when the application does not
+pull buffers fast enough, the queued buffers could consume a lot of memory,
+especially when dealing with raw video frames.
+</p>
+<p>
+If an EOS event was received before any buffers, this function returns
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. Use <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()"><code class="function">gst_app_sink_is_eos()</code></a> to check for the EOS condition.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> or NULL when the appsink is stopped or EOS.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-pull-buffer-list"></a><h3>gst_app_sink_pull_buffer_list ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="returnvalue">GstBufferList</span></a> * gst_app_sink_pull_buffer_list (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>);</pre>
+<p>
+This function blocks until a buffer list or EOS becomes available or the
+appsink element is set to the READY/NULL state.
+</p>
+<p>
+This function will only return buffer lists when the appsink is in the
+PLAYING state. All rendered buffer lists will be put in a queue so that
+the application can pull buffer lists at its own rate. Note that when
+the application does not pull buffer lists fast enough, the queued buffer
+lists could consume a lot of memory, especially when dealing with raw
+video frames.
+</p>
+<p>
+If an EOS event was received before any buffer lists, this function returns
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. Use <a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" title="gst_app_sink_is_eos ()"><code class="function">gst_app_sink_is_eos()</code></a> to check for the EOS condition.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a> or NULL when the appsink is stopped or EOS.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSinkCallbacks"></a><h3>GstAppSinkCallbacks</h3>
+<pre class="programlisting">typedef struct {
+ void (*eos) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_preroll) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_buffer) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_buffer_list) (GstAppSink *sink, gpointer user_data);
+} GstAppSinkCallbacks;
+</pre>
+<p>
+A set of callbacks that can be installed on the appsink with
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-set-callbacks" title="gst_app_sink_set_callbacks ()"><code class="function">gst_app_sink_set_callbacks()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSinkCallbacks.eos"></a>eos</code></em> ()</span></p></td>
+<td>Called when the end-of-stream has been reached. This callback
+is called from the steaming thread.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSinkCallbacks.new-preroll"></a>new_preroll</code></em> ()</span></p></td>
+<td>Called when a new preroll buffer is available.
+This callback is called from the steaming thread.
+The new preroll buffer can be retrieved with
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll" title="gst_app_sink_pull_preroll ()"><code class="function">gst_app_sink_pull_preroll()</code></a> either from this callback
+or from any other thread.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSinkCallbacks.new-buffer"></a>new_buffer</code></em> ()</span></p></td>
+<td>Called when a new buffer is available.
+This callback is called from the steaming thread.
+The new buffer can be retrieved with
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" title="gst_app_sink_pull_buffer ()"><code class="function">gst_app_sink_pull_buffer()</code></a> either from this callback
+or from any other thread.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSinkCallbacks.new-buffer-list"></a>new_buffer_list</code></em> ()</span></p></td>
+<td>Called when a new bufferlist is available.
+This callback is called from the steaming thread.
+The new bufferlist can be retrieved with
+<a class="link" href="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer-list" title="gst_app_sink_pull_buffer_list ()"><code class="function">gst_app_sink_pull_buffer_list()</code></a> either from this callback
+or from any other thread.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-sink-set-callbacks"></a><h3>gst_app_sink_set_callbacks ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_sink_set_callbacks (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *appsink</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks" title="GstAppSinkCallbacks"><span class="type">GstAppSinkCallbacks</span></a> *callbacks</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
+<p>
+Set callbacks which will be executed for each new preroll, new buffer and eos.
+This is an alternative to using the signals, it has lower overhead and is thus
+less expensive, but also less flexible.
+</p>
+<p>
+If callbacks are installed, no signals will be emited for performance
+reasons.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsink</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callbacks</code></em> :</span></p></td>
+<td>the callbacks</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>a user_data argument for the callbacks</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>a destroy notify function</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsink.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html"><span class="type">GstBaseSink</span></a>, appsrc
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-appsrc.html b/docs/libs/html/gst-plugins-base-libs-appsrc.html
new file mode 100644
index 0000000..cb18273
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-appsrc.html
@@ -0,0 +1,654 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>appsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-app.html" title="App Library">
+<link rel="prev" href="gstreamer-app.html" title="App Library">
+<link rel="next" href="gst-plugins-base-libs-appsink.html" title="appsink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-app.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-app.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-appsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-appsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-appsrc.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-appsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-appsrc.top_of_page"></a>appsrc</span></h2>
+<p>appsrc — Easy way for applications to inject buffers into a
+ pipeline</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-appsrc.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/app/gstappsrc.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType">GstAppStreamType</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-caps" title="gst_app_src_set_caps ()">gst_app_src_set_caps</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-caps" title="gst_app_src_get_caps ()">gst_app_src_get_caps</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-latency" title="gst_app_src_get_latency ()">gst_app_src_get_latency</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *max</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-latency" title="gst_app_src_set_latency ()">gst_app_src_set_latency</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> max</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-size" title="gst_app_src_set_size ()">gst_app_src_set_size</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-size" title="gst_app_src_get_size ()">gst_app_src_get_size</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-stream-type" title="gst_app_src_set_stream_type ()">gst_app_src_set_stream_type</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType"><span class="type">GstAppStreamType</span></a> type</code></em>);
+<a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType"><span class="returnvalue">GstAppStreamType</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-stream-type" title="gst_app_src_get_stream_type ()">gst_app_src_get_stream_type</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-max-bytes" title="gst_app_src_set_max_bytes ()">gst_app_src_set_max_bytes</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> max</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-max-bytes" title="gst_app_src_get_max_bytes ()">gst_app_src_get_max_bytes</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-get-emit-signals" title="gst_app_src_get_emit_signals ()">gst_app_src_get_emit_signals</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-emit-signals" title="gst_app_src_set_emit_signals ()">gst_app_src_set_emit_signals</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> emit</code></em>);
+ <a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks" title="GstAppSrcCallbacks">GstAppSrcCallbacks</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-callbacks" title="gst_app_src_set_callbacks ()">gst_app_src_set_callbacks</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks" title="GstAppSrcCallbacks"><span class="type">GstAppSrcCallbacks</span></a> *callbacks</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-push-buffer" title="gst_app_src_push_buffer ()">gst_app_src_push_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-end-of-stream" title="gst_app_src_end_of_stream ()">gst_app_src_end_of_stream</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsrc.description"></a><h2>Description</h2>
+<p>
+The appsrc element can be used by applications to insert data into a
+GStreamer pipeline. Unlike most GStreamer elements, Appsrc provides
+external API functions.
+</p>
+<p>
+appsrc can be used by linking with the libgstapp library to access the
+methods directly or by using the appsrc action signals.
+</p>
+<p>
+Before operating appsrc, the caps property must be set to a fixed caps
+describing the format of the data that will be pushed with appsrc. An
+exception to this is when pushing buffers with unknown caps, in which case no
+caps should be set. This is typically true of file-like sources that push raw
+byte buffers.
+</p>
+<p>
+The main way of handing data to the appsrc element is by calling the
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-push-buffer" title="gst_app_src_push_buffer ()"><code class="function">gst_app_src_push_buffer()</code></a> method or by emiting the push-buffer action signal.
+This will put the buffer onto a queue from which appsrc will read from in its
+streaming thread. It is important to note that data transport will not happen
+from the thread that performed the push-buffer call.
+</p>
+<p>
+The "max-bytes" property controls how much data can be queued in appsrc
+before appsrc considers the queue full. A filled internal queue will always
+signal the "enough-data" signal, which signals the application that it should
+stop pushing data into appsrc. The "block" property will cause appsrc to
+block the push-buffer method until free data becomes available again.
+</p>
+<p>
+When the internal queue is running out of data, the "need-data" signal is
+emited, which signals the application that it should start pushing more data
+into appsrc.
+</p>
+<p>
+In addition to the "need-data" and "enough-data" signals, appsrc can emit the
+"seek-data" signal when the "stream-mode" property is set to "seekable" or
+"random-access". The signal argument will contain the new desired position in
+the stream expressed in the unit set with the "format" property. After
+receiving the seek-data signal, the application should push-buffers from the
+new position.
+</p>
+<p>
+These signals allow the application to operate the appsrc in two different
+ways:
+</p>
+<p>
+The push model, in which the application repeadedly calls the push-buffer method
+with a new buffer. Optionally, the queue size in the appsrc can be controlled
+with the enough-data and need-data signals by respectively stopping/starting
+the push-buffer calls. This is a typical mode of operation for the
+stream-type "stream" and "seekable". Use this model when implementing various
+network protocols or hardware devices.
+</p>
+<p>
+The pull model where the need-data signal triggers the next push-buffer call.
+This mode is typically used in the "random-access" stream-type. Use this
+model for file access or other randomly accessable sources. In this mode, a
+buffer of exactly the amount of bytes given by the need-data signal should be
+pushed into appsrc.
+</p>
+<p>
+In all modes, the size property on appsrc should contain the total stream
+size in bytes. Setting this property is mandatory in the random-access mode.
+For the stream and seekable modes, setting this property is optional but
+recommended.
+</p>
+<p>
+When the application is finished pushing data into appsrc, it should call
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-end-of-stream" title="gst_app_src_end_of_stream ()"><code class="function">gst_app_src_end_of_stream()</code></a> or emit the end-of-stream action signal. After
+this call, no more buffers can be pushed into appsrc until a flushing seek
+happened or the state of the appsrc has gone through READY.
+</p>
+<p>
+Last reviewed on 2008-12-17 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAppStreamType"></a><h3>enum GstAppStreamType</h3>
+<pre class="programlisting">typedef enum {
+ GST_APP_STREAM_TYPE_STREAM,
+ GST_APP_STREAM_TYPE_SEEKABLE,
+ GST_APP_STREAM_TYPE_RANDOM_ACCESS
+} GstAppStreamType;
+</pre>
+<p>
+The stream type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-APP-STREAM-TYPE-STREAM:CAPS"></a><span class="term"><code class="literal">GST_APP_STREAM_TYPE_STREAM</code></span></p></td>
+<td>No seeking is supported in the stream, such as a
+live stream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-APP-STREAM-TYPE-SEEKABLE:CAPS"></a><span class="term"><code class="literal">GST_APP_STREAM_TYPE_SEEKABLE</code></span></p></td>
+<td>The stream is seekable but seeking might not
+be very fast, such as data from a webserver.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-APP-STREAM-TYPE-RANDOM-ACCESS:CAPS"></a><span class="term"><code class="literal">GST_APP_STREAM_TYPE_RANDOM_ACCESS</code></span></p></td>
+<td>The stream is seekable and seeking is fast,
+such as in a local file.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-caps"></a><h3>gst_app_src_set_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_caps (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Set the capabilities on the appsrc element. This function takes
+a copy of the caps structure. After calling this method, the source will
+only produce caps that match <em class="parameter"><code>caps</code></em>. <em class="parameter"><code>caps</code></em> must be fixed and the caps on the
+buffers must match the caps or left NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>caps to set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-caps"></a><h3>gst_app_src_get_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_app_src_get_caps (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Get the configured caps on <em class="parameter"><code>appsrc</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> produced by the source. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-latency"></a><h3>gst_app_src_get_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_get_latency (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *max</code></em>);</pre>
+<p>
+Retrieve the min and max latencies in <em class="parameter"><code>min</code></em> and <em class="parameter"><code>max</code></em> respectively.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>the min latency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>the min latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-latency"></a><h3>gst_app_src_set_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_latency (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> max</code></em>);</pre>
+<p>
+Configure the <em class="parameter"><code>min</code></em> and <em class="parameter"><code>max</code></em> latency in <em class="parameter"><code>src</code></em>. If <em class="parameter"><code>min</code></em> is set to -1, the
+default latency calculations for pseudo-live sources will be used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>the min latency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>the min latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-size"></a><h3>gst_app_src_set_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_size (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> size</code></em>);</pre>
+<p>
+Set the size of the stream in bytes. A value of -1 means that the size is
+not known.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size to set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-size"></a><h3>gst_app_src_get_size ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> gst_app_src_get_size (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Get the size of the stream in bytes. A value of -1 means that the size is
+not known.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the size of the stream previously set with <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-size" title="gst_app_src_set_size ()"><code class="function">gst_app_src_set_size()</code></a>;</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-stream-type"></a><h3>gst_app_src_set_stream_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_stream_type (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType"><span class="type">GstAppStreamType</span></a> type</code></em>);</pre>
+<p>
+Set the stream type on <em class="parameter"><code>appsrc</code></em>. For seekable streams, the "seek" signal must
+be connected to.
+</p>
+<p>
+A stream_type stream
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-stream-type"></a><h3>gst_app_src_get_stream_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppStreamType" title="enum GstAppStreamType"><span class="returnvalue">GstAppStreamType</span></a> gst_app_src_get_stream_type (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Get the stream type. Control the stream type of <em class="parameter"><code>appsrc</code></em>
+with <a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-stream-type" title="gst_app_src_set_stream_type ()"><code class="function">gst_app_src_set_stream_type()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the stream type.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-max-bytes"></a><h3>gst_app_src_set_max_bytes ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_max_bytes (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> max</code></em>);</pre>
+<p>
+Set the maximum amount of bytes that can be queued in <em class="parameter"><code>appsrc</code></em>.
+After the maximum amount of bytes are queued, <em class="parameter"><code>appsrc</code></em> will emit the
+"enough-data" signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>the maximum number of bytes to queue</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-max-bytes"></a><h3>gst_app_src_get_max_bytes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> gst_app_src_get_max_bytes (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Get the maximum amount of bytes that can be queued in <em class="parameter"><code>appsrc</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The maximum amount of bytes that can be queued.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-get-emit-signals"></a><h3>gst_app_src_get_emit_signals ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_app_src_get_emit_signals (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Check if appsrc will emit the "new-preroll" and "new-buffer" signals.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>appsrc</code></em> is emiting the "new-preroll" and "new-buffer"
+signals.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-emit-signals"></a><h3>gst_app_src_set_emit_signals ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_emit_signals (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> emit</code></em>);</pre>
+<p>
+Make appsrc emit the "new-preroll" and "new-buffer" signals. This option is
+by default disabled because signal emission is expensive and unneeded when
+the application prefers to operate in pull mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>emit</code></em> :</span></p></td>
+<td>the new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrcCallbacks"></a><h3>GstAppSrcCallbacks</h3>
+<pre class="programlisting">typedef struct {
+ void (*need_data) (GstAppSrc *src, guint length, gpointer user_data);
+ void (*enough_data) (GstAppSrc *src, gpointer user_data);
+ gboolean (*seek_data) (GstAppSrc *src, guint64 offset, gpointer user_data);
+} GstAppSrcCallbacks;
+</pre>
+<p>
+A set of callbacks that can be installed on the appsrc with
+<a class="link" href="gst-plugins-base-libs-appsrc.html#gst-app-src-set-callbacks" title="gst_app_src_set_callbacks ()"><code class="function">gst_app_src_set_callbacks()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSrcCallbacks.need-data"></a>need_data</code></em> ()</span></p></td>
+<td>Called when the appsrc needs more data. A buffer or EOS should be
+pushed to appsrc from this thread or another thread. <em class="parameter"><code>length</code></em> is just a hint
+and when it is set to -1, any number of bytes can be pushed into <em class="parameter"><code>appsrc</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSrcCallbacks.enough-data"></a>enough_data</code></em> ()</span></p></td>
+<td>Called when appsrc has enough data. It is recommended that the
+application stops calling push-buffer until the need_data callback is
+emited again to avoid excessive buffer queueing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAppSrcCallbacks.seek-data"></a>seek_data</code></em> ()</span></p></td>
+<td>Called when a seek should be performed to the offset.
+The next push-buffer should produce buffers from the new <em class="parameter"><code>offset</code></em>.
+This callback is only called for seekable stream types.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-set-callbacks"></a><h3>gst_app_src_set_callbacks ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_app_src_set_callbacks (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks" title="GstAppSrcCallbacks"><span class="type">GstAppSrcCallbacks</span></a> *callbacks</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
+<p>
+Set callbacks which will be executed when data is needed, enough data has
+been collected or when a seek should be performed.
+This is an alternative to using the signals, it has lower overhead and is thus
+less expensive, but also less flexible.
+</p>
+<p>
+If callbacks are installed, no signals will be emited for performance
+reasons.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callbacks</code></em> :</span></p></td>
+<td>the callbacks</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>a user_data argument for the callbacks</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>a destroy notify function</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-push-buffer"></a><h3>gst_app_src_push_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_app_src_push_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Adds a buffer to the queue of buffers that the appsrc element will
+push to its source pad. This function takes ownership of the buffer.
+</p>
+<p>
+When the block property is TRUE, this function can block until free
+space becomes available in the queue.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> to push</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> when the buffer was successfuly queued.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a> when <em class="parameter"><code>appsrc</code></em> is not PAUSED or PLAYING.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-UNEXPECTED:CAPS"><span class="type">GST_FLOW_UNEXPECTED</span></a> when EOS occured.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-app-src-end-of-stream"></a><h3>gst_app_src_end_of_stream ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_app_src_end_of_stream (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *appsrc</code></em>);</pre>
+<p>
+Indicates to the appsrc element that the last buffer queued in the
+element is the last buffer of the stream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appsrc</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> when the EOS was successfuly queued.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a> when <em class="parameter"><code>appsrc</code></em> is not PAUSED or PLAYING.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-appsrc.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html"><span class="type">GstBaseSrc</span></a>, appsink
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-encoding-profile.html b/docs/libs/html/gst-plugins-base-libs-encoding-profile.html
new file mode 100644
index 0000000..48f1404
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-encoding-profile.html
@@ -0,0 +1,1545 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>encoding-profile</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">
+<link rel="next" href="gstreamer-video.html" title="Video Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstdiscoverer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-video.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-encoding-profile.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-encoding-profile.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-encoding-profile.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-encoding-profile"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-encoding-profile.top_of_page"></a>encoding-profile</span></h2>
+<p>encoding-profile — Encoding profile library</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-encoding-profile.synopsis"></a><h2>Synopsis</h2>
+<a name="GstEncodingProfile"></a><a name="GstEncodingContainerProfile"></a><a name="GstEncodingAudioProfile"></a><a name="GstEncodingVideoProfile"></a><a name="GstEncodingTarget"></a><pre class="synopsis">
+#include &lt;gst/pbutils/encoding-profile.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile-struct" title="GstEncodingProfile">GstEncodingProfile</a>;
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-unref" title="gst_encoding_profile_unref()">gst_encoding_profile_unref</a> (profile)
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-ref" title="gst_encoding_profile_ref()">gst_encoding_profile_ref</a> (profile)
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="returnvalue">GstEncodingProfile</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-find" title="gst_encoding_profile_find ()">gst_encoding_profile_find</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *targetname</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *profilename</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-name" title="gst_encoding_profile_get_name ()">gst_encoding_profile_get_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-description" title="gst_encoding_profile_get_description ()">gst_encoding_profile_get_description</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-format" title="gst_encoding_profile_get_format ()">gst_encoding_profile_get_format</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-preset" title="gst_encoding_profile_get_preset ()">gst_encoding_profile_get_preset</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-presence" title="gst_encoding_profile_get_presence ()">gst_encoding_profile_get_presence</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction" title="gst_encoding_profile_get_restriction ()">gst_encoding_profile_get_restriction</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-name" title="gst_encoding_profile_set_name ()">gst_encoding_profile_set_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-description" title="gst_encoding_profile_set_description ()">gst_encoding_profile_set_description</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-format" title="gst_encoding_profile_set_format ()">gst_encoding_profile_set_format</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-preset" title="gst_encoding_profile_set_preset ()">gst_encoding_profile_set_preset</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-restriction" title="gst_encoding_profile_set_restriction ()">gst_encoding_profile_set_restriction</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-presence" title="gst_encoding_profile_set_presence ()">gst_encoding_profile_set_presence</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-is-equal" title="gst_encoding_profile_is_equal ()">gst_encoding_profile_is_equal</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *a</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *b</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-input-caps" title="gst_encoding_profile_get_input_caps ()">gst_encoding_profile_get_input_caps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-type-nick" title="gst_encoding_profile_get_type_nick ()">gst_encoding_profile_get_type_nick</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile-struct" title="GstEncodingContainerProfile">GstEncodingContainerProfile</a>;
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="returnvalue">GstEncodingContainerProfile</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-new" title="gst_encoding_container_profile_new ()">gst_encoding_container_profile_new</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-add-profile" title="gst_encoding_container_profile_add_profile ()">gst_encoding_container_profile_add_profile</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *container</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-contains-profile" title="gst_encoding_container_profile_contains_profile ()">gst_encoding_container_profile_contains_profile</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *container</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-get-profiles" title="gst_encoding_container_profile_get_profiles ()">gst_encoding_container_profile_get_profiles</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *profile</code></em>);
+
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile-struct" title="GstEncodingAudioProfile">GstEncodingAudioProfile</a>;
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile"><span class="returnvalue">GstEncodingAudioProfile</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-audio-profile-new" title="gst_encoding_audio_profile_new ()">gst_encoding_audio_profile_new</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);
+
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile-struct" title="GstEncodingVideoProfile">GstEncodingVideoProfile</a>;
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="returnvalue">GstEncodingVideoProfile</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-new" title="gst_encoding_video_profile_new ()">gst_encoding_video_profile_new</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-pass" title="gst_encoding_video_profile_get_pass ()">gst_encoding_video_profile_get_pass</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-variableframerate" title="gst_encoding_video_profile_get_variableframerate ()">gst_encoding_video_profile_get_variableframerate</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-pass" title="gst_encoding_video_profile_set_pass ()">gst_encoding_video_profile_set_pass</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> pass</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-variableframerate" title="gst_encoding_video_profile_set_variableframerate ()">gst_encoding_video_profile_set_variableframerate</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> variableframerate</code></em>);
+
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE">GST_ENCODING_CATEGORY_DEVICE</a>
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS" title="GST_ENCODING_CATEGORY_ONLINE_SERVICE">GST_ENCODING_CATEGORY_ONLINE_SERVICE</a>
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS" title="GST_ENCODING_CATEGORY_STORAGE_EDITING">GST_ENCODING_CATEGORY_STORAGE_EDITING</a>
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-CAPTURE:CAPS" title="GST_ENCODING_CATEGORY_CAPTURE">GST_ENCODING_CATEGORY_CAPTURE</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget-struct" title="GstEncodingTarget">GstEncodingTarget</a>;
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-unref" title="gst_encoding_target_unref()">gst_encoding_target_unref</a> (target)
+#define <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-ref" title="gst_encoding_target_ref()">gst_encoding_target_ref</a> (target)
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-new" title="gst_encoding_target_new ()">gst_encoding_target_new</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *profiles</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-name" title="gst_encoding_target_get_name ()">gst_encoding_target_get_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-category" title="gst_encoding_target_get_category ()">gst_encoding_target_get_category</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-description" title="gst_encoding_target_get_description ()">gst_encoding_target_get_description</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profiles" title="gst_encoding_target_get_profiles ()">gst_encoding_target_get_profiles</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="returnvalue">GstEncodingProfile</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profile" title="gst_encoding_target_get_profile ()">gst_encoding_target_get_profile</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-add-profile" title="gst_encoding_target_add_profile ()">gst_encoding_target_add_profile</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save" title="gst_encoding_target_save ()">gst_encoding_target_save</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save-to-file" title="gst_encoding_target_save_to_file ()">gst_encoding_target_save_to_file</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *filepath</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load" title="gst_encoding_target_load ()">gst_encoding_target_load</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load-from-file" title="gst_encoding_target_load_from_file ()">gst_encoding_target_load_from_file</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *filepath</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-all-targets" title="gst_encoding_list_all_targets ()">gst_encoding_list_all_targets</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *categoryname</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-available-categories" title="gst_encoding_list_available_categories ()">gst_encoding_list_available_categories</a>
+ (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-encoding-profile.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstEncodingProfile
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile">GstEncodingVideoProfile</a>
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile">GstEncodingAudioProfile</a>
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile">GstEncodingContainerProfile</a>
+</pre>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile">GstEncodingProfile</a>
+ +----GstEncodingContainerProfile
+</pre>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile">GstEncodingProfile</a>
+ +----GstEncodingAudioProfile
+</pre>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile">GstEncodingProfile</a>
+ +----GstEncodingVideoProfile
+</pre>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstEncodingTarget
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-encoding-profile.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id614507"></a><p>
+Functions to create and handle encoding profiles.
+</p>
+<p>
+Encoding profiles describe the media types and settings one wishes to use for
+an encoding process. The top-level profiles are commonly
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a>(s) (which contains a user-readable name and
+description along with which container format to use). These, in turn,
+reference one or more <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>(s) which indicate which encoding
+format should be used on each individual streams.
+</p>
+<p>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>(s) can be provided to the 'encodebin' element, which will take
+care of selecting and setting up the required elements to produce an output stream
+conforming to the specifications of the profile.
+</p>
+<p>
+Unlike other systems, the encoding profiles do not specify which <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> to use
+for the various encoding and muxing steps, but instead relies on specifying the format
+one wishes to use.
+</p>
+<p>
+Encoding profiles can be created at runtime by the application or loaded from (and saved
+to) file using the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> API.
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id614570"></a><h3>Example: Creating a profile</h3>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+#include &lt;gst/pbutils/encoding-profile.h&gt;
+...
+GstEncodingProfile *
+create_ogg_theora_profile(void)
+{
+ GstEncodingContainerProfile *prof;
+ GstCaps *caps;
+
+ caps = gst_caps_from_string("application/ogg");
+ prof = gst_encoding_container_profile_new("Ogg audio/video",
+ "Standard OGG/THEORA/VORBIS",
+ caps, NULL);
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string("video/x-theora");
+ gst_encoding_container_profile_add_profile(prof,
+ (GstEncodingProfile*) gst_encoding_video_profile_new(caps, NULL, NULL, 0));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string("audio/x-vorbis");
+ gst_encoding_container_profile_add_profile(prof,
+ (GstEncodingProfile*) gst_encoding_audio_profile_new(caps, NULL, NULL, 0));
+ gst_caps_unref (caps);
+
+ return (GstEncodingProfile*) prof;
+}
+
+
+</pre></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id614595"></a><h3>Example: Listing categories, targets and profiles</h3>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+#include &lt;gst/pbutils/encoding-profile.h&gt;
+...
+GstEncodingProfile *prof;
+GList *categories, *tmpc;
+GList *targets, *tmpt;
+...
+categories = gst_encoding_target_list_available_categories();
+
+... Show available categories to user ...
+
+for (tmpc = categories; tmpc; tmpc = tmpc-&gt;next) {
+ gchar *category = (gchar *) tmpc-&gt;data;
+
+ ... and we can list all targets within that category ...
+
+ targets = gst_encoding_target_list_all (category);
+
+ ... and show a list to our users ...
+
+ g_list_foreach (targets, (GFunc) gst_encoding_target_unref, NULL);
+ g_list_free (targets);
+}
+
+g_list_foreach (categories, (GFunc) g_free, NULL);
+g_list_free (categories);
+
+...
+</pre></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-encoding-profile.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstEncodingProfile-struct"></a><h3>GstEncodingProfile</h3>
+<pre class="programlisting">typedef struct _GstEncodingProfile GstEncodingProfile;</pre>
+<p>
+The opaque base class object for all encoding profiles. This contains generic
+information like name, description, format and preset.
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-unref"></a><h3>gst_encoding_profile_unref()</h3>
+<pre class="programlisting">#define gst_encoding_profile_unref(profile) (g_object_unref ((GObject*) profile))
+</pre>
+<p>
+Decreases the reference count of the <em class="parameter"><code>profile</code></em>, possibly freeing the <em class="parameter"><code>profile</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-ref"></a><h3>gst_encoding_profile_ref()</h3>
+<pre class="programlisting">#define gst_encoding_profile_ref(profile) (g_object_ref ((GObject*) profile))
+</pre>
+<p>
+Increases the reference count of the <em class="parameter"><code>profile</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-find"></a><h3>gst_encoding_profile_find ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="returnvalue">GstEncodingProfile</span></a> * gst_encoding_profile_find (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *targetname</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *profilename</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>);</pre>
+<p>
+Find the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> with the specified name and category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>targetname</code></em> :</span></p></td>
+<td>The name of the target. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profilename</code></em> :</span></p></td>
+<td>The name of the profile. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>The target category. Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The matching <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-name"></a><h3>gst_encoding_profile_get_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_profile_get_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the profile, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-description"></a><h3>gst_encoding_profile_get_description ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_profile_get_description
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the description of the profile, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-format"></a><h3>gst_encoding_profile_get_format ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_encoding_profile_get_format (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the media format used
+in the profile. Unref after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-preset"></a><h3>gst_encoding_profile_get_preset ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_profile_get_preset (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html"><span class="type">GstPreset</span></a> to be used in the profile.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-presence"></a><h3>gst_encoding_profile_get_presence ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_encoding_profile_get_presence (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of times the profile is used in its parent
+container profile. If 0, it is not a mandatory stream.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-restriction"></a><h3>gst_encoding_profile_get_restriction ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_encoding_profile_get_restriction
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The restriction <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to apply before the encoder
+that will be used in the profile. The fields present in restriction caps are
+properties of the raw stream (that is before encoding), such as height and
+width for video and depth and sampling rate for audio. Does not apply to
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> (since there is no corresponding raw stream).
+Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. Unref after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-name"></a><h3>gst_encoding_profile_set_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>name</code></em> as the given name for the <em class="parameter"><code>profile</code></em>. A copy of <em class="parameter"><code>name</code></em> will be made
+internally.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name to set on the profile</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-description"></a><h3>gst_encoding_profile_set_description ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_description
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>description</code></em> as the given description for the <em class="parameter"><code>profile</code></em>. A copy of <em class="parameter"><code>description</code></em> will be made
+internally.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>the description to set on the profile</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-format"></a><h3>gst_encoding_profile_set_format ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_format (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>);</pre>
+<p>
+Sets the media format used in the profile.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the media format to use in the profile.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-preset"></a><h3>gst_encoding_profile_set_preset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_preset (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>);</pre>
+<p>
+Sets the preset to use for the profile.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>the element preset to use</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-restriction"></a><h3>gst_encoding_profile_set_restriction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_restriction
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>);</pre>
+<p>
+Set the restriction <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to apply before the encoder
+that will be used in the profile. See <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-restriction" title="gst_encoding_profile_set_restriction ()"><code class="function">gst_encoding_profile_set_restriction()</code></a>
+for more about restrictions. Does not apply to <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>the restriction to apply</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-set-presence"></a><h3>gst_encoding_profile_set_presence ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_profile_set_presence (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);</pre>
+<p>
+Set the number of time the profile is used in its parent
+container profile. If 0, it is not a mandatory stream
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>presence</code></em> :</span></p></td>
+<td>the number of time the profile can be used</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-is-equal"></a><h3>gst_encoding_profile_is_equal ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_profile_is_equal (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *a</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *b</code></em>);</pre>
+<p>
+Checks whether the two <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> are equal
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>a</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-input-caps"></a><h3>gst_encoding_profile_get_input_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_encoding_profile_get_input_caps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<p>
+Computes the full output caps that this <em class="parameter"><code>profile</code></em> will be able to consume.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The full caps the given <em class="parameter"><code>profile</code></em> can consume. Call
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a> when you are done with the caps. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-profile-get-type-nick"></a><h3>gst_encoding_profile_get_type_nick ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_profile_get_type_nick (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the human-readable name of the type of <em class="parameter"><code>profile</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodingContainerProfile-struct"></a><h3>GstEncodingContainerProfile</h3>
+<pre class="programlisting">typedef struct _GstEncodingContainerProfile GstEncodingContainerProfile;</pre>
+<p>
+Encoding profiles for containers. Keeps track of a list of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-container-profile-new"></a><h3>gst_encoding_container_profile_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="returnvalue">GstEncodingContainerProfile</span></a> * gst_encoding_container_profile_new
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>The name of the container profile, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>The description of the container profile, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>The format to use for this profile</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>The preset to use for this profile</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The newly created <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-container-profile-add-profile"></a><h3>gst_encoding_container_profile_add_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_container_profile_add_profile
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *container</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<p>
+Add a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> to the list of profiles handled by <em class="parameter"><code>container</code></em>.
+</p>
+<p>
+No copy of <em class="parameter"><code>profile</code></em> will be made, if you wish to use it elsewhere after this
+method you should increment its reference count.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>container</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> to add.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <em class="parameter"><code>stream</code></em> was properly added, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-container-profile-contains-profile"></a><h3>gst_encoding_container_profile_contains_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_container_profile_contains_profile
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *container</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>container</code></em> contains a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> identical to
+<em class="parameter"><code>profile</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>container</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>container</code></em> contains a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> identical
+to <em class="parameter"><code>profile</code></em>, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-container-profile-get-profiles"></a><h3>gst_encoding_container_profile_get_profiles ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_encoding_container_profile_get_profiles
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> *profile</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodingAudioProfile-struct"></a><h3>GstEncodingAudioProfile</h3>
+<pre class="programlisting">typedef struct _GstEncodingAudioProfile GstEncodingAudioProfile;</pre>
+<p>
+Variant of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> for audio streams.
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-audio-profile-new"></a><h3>gst_encoding_audio_profile_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile"><span class="returnvalue">GstEncodingAudioProfile</span></a> * gst_encoding_audio_profile_new
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile"><span class="type">GstEncodingAudioProfile</span></a>
+</p>
+<p>
+All provided allocatable arguments will be internally copied, so can be
+safely freed/unreferenced after calling this method.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>the preset(s) to use on the encoder, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> used to restrict the input to the encoder, can be
+NULL. See <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction" title="gst_encoding_profile_get_restriction ()"><code class="function">gst_encoding_profile_get_restriction()</code></a> for more details.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>presence</code></em> :</span></p></td>
+<td>the number of time this stream must be used. 0 means any number of
+times (including never)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the newly created <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile"><span class="type">GstEncodingAudioProfile</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodingVideoProfile-struct"></a><h3>GstEncodingVideoProfile</h3>
+<pre class="programlisting">typedef struct _GstEncodingVideoProfile GstEncodingVideoProfile;</pre>
+<p>
+Variant of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> for video streams, allows specifying the <em class="parameter"><code>pass</code></em>.
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-video-profile-new"></a><h3>gst_encoding_video_profile_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="returnvalue">GstEncodingVideoProfile</span></a> * gst_encoding_video_profile_new
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *format</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *preset</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *restriction</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> presence</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>
+</p>
+<p>
+All provided allocatable arguments will be internally copied, so can be
+safely freed/unreferenced after calling this method.
+</p>
+<p>
+If you wish to control the pass number (in case of multi-pass scenarios),
+please refer to the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-pass" title="gst_encoding_video_profile_set_pass ()"><code class="function">gst_encoding_video_profile_set_pass()</code></a> documentation.
+</p>
+<p>
+If you wish to use/force a constant framerate please refer to the
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-variableframerate" title="gst_encoding_video_profile_set_variableframerate ()"><code class="function">gst_encoding_video_profile_set_variableframerate()</code></a> documentation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>the preset(s) to use on the encoder, can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> used to restrict the input to the encoder, can be
+NULL. See <a class="link" href="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction" title="gst_encoding_profile_get_restriction ()"><code class="function">gst_encoding_profile_get_restriction()</code></a> for more details.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>presence</code></em> :</span></p></td>
+<td>the number of time this stream must be used. 0 means any number of
+times (including never)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the newly created <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-video-profile-get-pass"></a><h3>gst_encoding_video_profile_get_pass ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_encoding_video_profile_get_pass (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prof</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The pass number if this is part of a multi-pass profile. Starts at
+1 for multi-pass. 0 if this is not a multi-pass profile</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-video-profile-get-variableframerate"></a><h3>gst_encoding_video_profile_get_variableframerate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_video_profile_get_variableframerate
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prof</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Whether non-constant video framerate is allowed for encoding.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-video-profile-set-pass"></a><h3>gst_encoding_video_profile_set_pass ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_video_profile_set_pass (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> pass</code></em>);</pre>
+<p>
+Sets the pass number of this video profile. The first pass profile should have
+this value set to 1. If this video profile isn't part of a multi-pass profile,
+you may set it to 0 (the default value).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prof</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pass</code></em> :</span></p></td>
+<td>the pass number for this profile</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-video-profile-set-variableframerate"></a><h3>gst_encoding_video_profile_set_variableframerate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_encoding_video_profile_set_variableframerate
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> *prof</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> variableframerate</code></em>);</pre>
+<p>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, then the incoming streamm will be allowed to have non-constant
+framerate. If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (default value), then the incoming stream will
+be normalized by dropping/duplicating frames in order to produce a
+constance framerate.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prof</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>variableframerate</code></em> :</span></p></td>
+<td>a boolean</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ENCODING-CATEGORY-DEVICE:CAPS"></a><h3>GST_ENCODING_CATEGORY_DEVICE</h3>
+<pre class="programlisting">#define GST_ENCODING_CATEGORY_DEVICE "device"
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> category for device-specific targets.
+The name of the target will usually be the contructor and model of the device,
+and that target will contain <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfiles</span></a> suitable for that device.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS"></a><h3>GST_ENCODING_CATEGORY_ONLINE_SERVICE</h3>
+<pre class="programlisting">#define GST_ENCODING_CATEGORY_ONLINE_SERVICE "online-service"
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> category for online-services.
+The name of the target will usually be the name of the online service
+and that target will contain <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfiles</span></a> suitable for that online
+service.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS"></a><h3>GST_ENCODING_CATEGORY_STORAGE_EDITING</h3>
+<pre class="programlisting">#define GST_ENCODING_CATEGORY_STORAGE_EDITING "storage-editing"
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> category for storage, archiving and editing targets.
+Those targets can be lossless and/or provide very fast random access content.
+The name of the target will usually be the container type or editing target,
+and that target will contain <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfiles</span></a> suitable for editing or
+storage.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ENCODING-CATEGORY-CAPTURE:CAPS"></a><h3>GST_ENCODING_CATEGORY_CAPTURE</h3>
+<pre class="programlisting">#define GST_ENCODING_CATEGORY_CAPTURE "capture"
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> category for recording and capture.
+Targets within this category are optimized for low latency encoding.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodingTarget-struct"></a><h3>GstEncodingTarget</h3>
+<pre class="programlisting">typedef struct _GstEncodingTarget GstEncodingTarget;</pre>
+<p>
+Collection of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> for a specific target or use-case.
+</p>
+<p>
+When being stored/loaded, targets come from a specific category, like
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>.
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-unref"></a><h3>gst_encoding_target_unref()</h3>
+<pre class="programlisting">#define gst_encoding_target_unref(target)</pre>
+<p>
+Decreases the reference count of the <em class="parameter"><code>target</code></em>, possibly freeing it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-ref"></a><h3>gst_encoding_target_ref()</h3>
+<pre class="programlisting">#define gst_encoding_target_ref(target)</pre>
+<p>
+Increases the reference count of the <em class="parameter"><code>target</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-new"></a><h3>gst_encoding_target_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * gst_encoding_target_new (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *description</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *profiles</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>.
+</p>
+<p>
+The name and category can only consist of lowercase ASCII letters for the
+first character, followed by either lowercase ASCII letters, digits or
+hyphens ('-').
+</p>
+<p>
+The <em class="parameter"><code>category</code></em> <span class="emphasis"><em>should</em></span> be one of the existing
+well-defined categories, like <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>, but it
+<span class="emphasis"><em>can</em></span> be a application or user specific category if
+needed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>The name of the target.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>The name of the category to which this <em class="parameter"><code>target</code></em>
+belongs. For example: <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>A description of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> in the
+current locale. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profiles</code></em> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.EncodingProfile]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The newly created <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+there was an error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-get-name"></a><h3>gst_encoding_target_get_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_target_get_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The name of the <em class="parameter"><code>target</code></em>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-get-category"></a><h3>gst_encoding_target_get_category ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_target_get_category (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The category of the <em class="parameter"><code>target</code></em>. For example:
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-get-description"></a><h3>gst_encoding_target_get_description ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_encoding_target_get_description (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The description of the <em class="parameter"><code>target</code></em>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-get-profiles"></a><h3>gst_encoding_target_get_profiles ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_encoding_target_get_profiles (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>(s) this <em class="parameter"><code>target</code></em> handles. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.EncodingProfile]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-get-profile"></a><h3>gst_encoding_target_get_profile ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="returnvalue">GstEncodingProfile</span></a> * gst_encoding_target_get_profile (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the profile to retrieve</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The matching <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-add-profile"></a><h3>gst_encoding_target_add_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_target_add_profile (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> *profile</code></em>);</pre>
+<p>
+Adds the given <em class="parameter"><code>profile</code></em> to the <em class="parameter"><code>target</code></em>. Each added profile must have
+a unique name within the profile.
+</p>
+<p>
+The <em class="parameter"><code>target</code></em> will steal a reference to the <em class="parameter"><code>profile</code></em>. If you wish to use
+the profile after calling this method, you should increase its reference
+count.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> to add a profile to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> to add. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the profile was added, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-save"></a><h3>gst_encoding_target_save ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_target_save (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves the <em class="parameter"><code>target</code></em> to a default user-local directory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>If an error occured, this field will be filled in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the target was correctly saved, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-save-to-file"></a><h3>gst_encoding_target_save_to_file ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_encoding_target_save_to_file (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> *target</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *filepath</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves the <em class="parameter"><code>target</code></em> to the provided file location.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filepath</code></em> :</span></p></td>
+<td>the location to store the <em class="parameter"><code>target</code></em> at.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>If an error occured, this field will be filled in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the target was correctly saved, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-load"></a><h3>gst_encoding_target_load ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * gst_encoding_target_load (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *category</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Searches for the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> with the given name, loads it
+and returns it.
+</p>
+<p>
+If the category name is specified only targets from that category will be
+searched for.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> to load.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>the name of the target category, like
+<a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>. Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>If an error occured, this field will be filled in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> if available, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-target-load-from-file"></a><h3>gst_encoding_target_load_from_file ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="returnvalue">GstEncodingTarget</span></a> * gst_encoding_target_load_from_file (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *filepath</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Opens the provided file and returns the contained <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filepath</code></em> :</span></p></td>
+<td>The file location to load the <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>If an error occured, this field will be filled in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> contained in the file, else
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-list-all-targets"></a><h3>gst_encoding_list_all_targets ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_encoding_list_all_targets (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *categoryname</code></em>);</pre>
+<p>
+List all available <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> for the specified category, or all categories
+if <em class="parameter"><code>categoryname</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>categoryname</code></em> :</span></p></td>
+<td>The category, for ex: <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS" title="GST_ENCODING_CATEGORY_DEVICE"><span class="type">GST_ENCODING_CATEGORY_DEVICE</span></a>.
+Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The list of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstEncodingTarget]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-encoding-list-available-categories"></a><h3>gst_encoding_list_available_categories ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_encoding_list_available_categories
+ (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Lists all <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> categories present on disk.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list
+of <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget"><span class="type">GstEncodingTarget</span></a> categories. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> gchar*]</span>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudio.html b/docs/libs/html/gst-plugins-base-libs-gstaudio.html
new file mode 100644
index 0000000..e0a846a
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudio.html
@@ -0,0 +1,919 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudio</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gstreamer-audio.html" title="Audio Library">
+<link rel="next" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-audio.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudioclock.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudio.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudio.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudio"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudio.top_of_page"></a>gstaudio</span></h2>
+<p>gstaudio — Support library for audio elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudio.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/audio/audio.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFlags" title="enum GstAudioFlags">GstAudioFlags</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat">GstAudioFormat</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags" title="enum GstAudioFormatFlags">GstAudioFormatFlags</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo">GstAudioFormatInfo</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo">GstAudioInfo</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-init" title="gst_audio_info_init ()">gst_audio_info_init</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-from-caps" title="gst_audio_info_from_caps ()">gst_audio_info_from_caps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-to-caps" title="gst_audio_info_to_caps ()">gst_audio_info_to_caps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-convert" title="gst_audio_info_convert ()">gst_audio_info_convert</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> src_val</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dest_val</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo"><span class="returnvalue">GstAudioFormatInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-format-get-info" title="gst_audio_format_get_info ()">gst_audio_format_get_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a> format</code></em>);
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-DEPTH:CAPS" title="GST_AUDIO_FORMAT_INFO_DEPTH()">GST_AUDIO_FORMAT_INFO_DEPTH</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS" title="GST_AUDIO_FORMAT_INFO_ENDIANNESS()">GST_AUDIO_FORMAT_INFO_ENDIANNESS</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FLAGS:CAPS" title="GST_AUDIO_FORMAT_INFO_FLAGS()">GST_AUDIO_FORMAT_INFO_FLAGS</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FORMAT:CAPS" title="GST_AUDIO_FORMAT_INFO_FORMAT()">GST_AUDIO_FORMAT_INFO_FORMAT</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_FLOAT()">GST_AUDIO_FORMAT_INFO_IS_FLOAT</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_INTEGER()">GST_AUDIO_FORMAT_INFO_IS_INTEGER</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN()">GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN()">GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN</a>(info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS" title="GST_AUDIO_FORMAT_INFO_IS_SIGNED()">GST_AUDIO_FORMAT_INFO_IS_SIGNED</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-NAME:CAPS" title="GST_AUDIO_FORMAT_INFO_NAME()">GST_AUDIO_FORMAT_INFO_NAME</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-WIDTH:CAPS" title="GST_AUDIO_FORMAT_INFO_WIDTH()">GST_AUDIO_FORMAT_INFO_WIDTH</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPF:CAPS" title="GST_AUDIO_INFO_BPF()">GST_AUDIO_INFO_BPF</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPS:CAPS" title="GST_AUDIO_INFO_BPS()">GST_AUDIO_INFO_BPS</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-CHANNELS:CAPS" title="GST_AUDIO_INFO_CHANNELS()">GST_AUDIO_INFO_CHANNELS</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-DEPTH:CAPS" title="GST_AUDIO_INFO_DEPTH()">GST_AUDIO_INFO_DEPTH</a> (i)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FLAGS:CAPS" title="GST_AUDIO_INFO_FLAGS()">GST_AUDIO_INFO_FLAGS</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FORMAT:CAPS" title="GST_AUDIO_INFO_FORMAT()">GST_AUDIO_INFO_FORMAT</a> (i)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS" title="GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS()">GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS</a>(info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-NAME:CAPS" title="GST_AUDIO_INFO_NAME()">GST_AUDIO_INFO_NAME</a> (i)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-POSITION:CAPS" title="GST_AUDIO_INFO_POSITION()">GST_AUDIO_INFO_POSITION</a> (info,
+ c)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-RATE:CAPS" title="GST_AUDIO_INFO_RATE()">GST_AUDIO_INFO_RATE</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-WIDTH:CAPS" title="GST_AUDIO_INFO_WIDTH()">GST_AUDIO_INFO_WIDTH</a> (i)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-FRAMES-TO-CLOCK-TIME:CAPS" title="GST_FRAMES_TO_CLOCK_TIME()">GST_FRAMES_TO_CLOCK_TIME</a> (frames,
+ rate)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-CLOCK-TIME-TO-FRAMES:CAPS" title="GST_CLOCK_TIME_TO_FRAMES()">GST_CLOCK_TIME_TO_FRAMES</a> (clocktime,
+ rate)
+#define <a class="link" href="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-DEF-RATE:CAPS" title="GST_AUDIO_DEF_RATE">GST_AUDIO_DEF_RATE</a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-buffer-clip" title="gst_audio_buffer_clip ()">gst_audio_buffer_clip</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> rate</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> bpf</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudio.description"></a><h2>Description</h2>
+<p>
+This library contains some helper functions for audio elements.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudio.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioFlags"></a><h3>enum GstAudioFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUDIO_FLAG_NONE = 0,
+ GST_AUDIO_FLAG_DEFAULT_POSITIONS = (1 &lt;&lt; 0)
+} GstAudioFlags;
+</pre>
+<p>
+Extra audio flags
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUDIO-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FLAG_NONE</code></span></p></td>
+<td>no valid flag
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FLAG-DEFAULT-POSITIONS:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FLAG_DEFAULT_POSITIONS</code></span></p></td>
+<td>position array
+ contains the default layout for the number of channels.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioFormat"></a><h3>enum GstAudioFormat</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUDIO_FORMAT_UNKNOWN,
+ /* 8 bit */
+ GST_AUDIO_FORMAT_S8,
+ GST_AUDIO_FORMAT_U8,
+ /* 16 bit */
+ GST_AUDIO_FORMAT_S16LE,
+ GST_AUDIO_FORMAT_S16BE,
+ GST_AUDIO_FORMAT_U16LE,
+ GST_AUDIO_FORMAT_U16BE,
+ /* 24 bit in low 3 bytes of 32 bits*/
+ GST_AUDIO_FORMAT_S24_32LE,
+ GST_AUDIO_FORMAT_S24_32BE,
+ GST_AUDIO_FORMAT_U24_32LE,
+ GST_AUDIO_FORMAT_U24_32BE,
+ /* 32 bit */
+ GST_AUDIO_FORMAT_S32LE,
+ GST_AUDIO_FORMAT_S32BE,
+ GST_AUDIO_FORMAT_U32LE,
+ GST_AUDIO_FORMAT_U32BE,
+ /* 24 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S24LE,
+ GST_AUDIO_FORMAT_S24BE,
+ GST_AUDIO_FORMAT_U24LE,
+ GST_AUDIO_FORMAT_U24BE,
+ /* 20 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S20LE,
+ GST_AUDIO_FORMAT_S20BE,
+ GST_AUDIO_FORMAT_U20LE,
+ GST_AUDIO_FORMAT_U20BE,
+ /* 18 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S18LE,
+ GST_AUDIO_FORMAT_S18BE,
+ GST_AUDIO_FORMAT_U18LE,
+ GST_AUDIO_FORMAT_U18BE,
+ /* float */
+ GST_AUDIO_FORMAT_F32LE,
+ GST_AUDIO_FORMAT_F32BE,
+ GST_AUDIO_FORMAT_F64LE,
+ GST_AUDIO_FORMAT_F64BE,
+ /* native endianness equivalents */
+ GST_AUDIO_FORMAT_S16 = _GST_AUDIO_FORMAT_NE(S16),
+ GST_AUDIO_FORMAT_U16 = _GST_AUDIO_FORMAT_NE(U16),
+ GST_AUDIO_FORMAT_S24_32 = _GST_AUDIO_FORMAT_NE(S24_32),
+ GST_AUDIO_FORMAT_U24_32 = _GST_AUDIO_FORMAT_NE(U24_32),
+ GST_AUDIO_FORMAT_S32 = _GST_AUDIO_FORMAT_NE(S32),
+ GST_AUDIO_FORMAT_U32 = _GST_AUDIO_FORMAT_NE(U32),
+ GST_AUDIO_FORMAT_S24 = _GST_AUDIO_FORMAT_NE(S24),
+ GST_AUDIO_FORMAT_U24 = _GST_AUDIO_FORMAT_NE(U24),
+ GST_AUDIO_FORMAT_S20 = _GST_AUDIO_FORMAT_NE(S20),
+ GST_AUDIO_FORMAT_U20 = _GST_AUDIO_FORMAT_NE(U20),
+ GST_AUDIO_FORMAT_S18 = _GST_AUDIO_FORMAT_NE(S18),
+ GST_AUDIO_FORMAT_U18 = _GST_AUDIO_FORMAT_NE(U18),
+ GST_AUDIO_FORMAT_F32 = _GST_AUDIO_FORMAT_NE(F32),
+ GST_AUDIO_FORMAT_F64 = _GST_AUDIO_FORMAT_NE(F64)
+} GstAudioFormat;
+</pre>
+<p>
+Enum value describing the most common audio formats.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_UNKNOWN</code></span></p></td>
+<td>unknown audio format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S8:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S8</code></span></p></td>
+<td>8 bits in 8 bits, signed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U8:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U8</code></span></p></td>
+<td>8 bits in 8 bits, unsigned
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S16LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S16LE</code></span></p></td>
+<td>16 bits in 16 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S16BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S16BE</code></span></p></td>
+<td>16 bits in 16 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U16LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U16LE</code></span></p></td>
+<td>16 bits in 16 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U16BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U16BE</code></span></p></td>
+<td>16 bits in 16 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24-32LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24_32LE</code></span></p></td>
+<td>24 bits in 32 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24-32BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24_32BE</code></span></p></td>
+<td>24 bits in 32 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24-32LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24_32LE</code></span></p></td>
+<td>24 bits in 32 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24-32BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24_32BE</code></span></p></td>
+<td>24 bits in 32 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S32LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S32LE</code></span></p></td>
+<td>32 bits in 32 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S32BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S32BE</code></span></p></td>
+<td>32 bits in 32 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U32LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U32LE</code></span></p></td>
+<td>32 bits in 32 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U32BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U32BE</code></span></p></td>
+<td>32 bits in 32 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24LE</code></span></p></td>
+<td>24 bits in 24 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24BE</code></span></p></td>
+<td>24 bits in 24 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24LE</code></span></p></td>
+<td>24 bits in 24 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24BE</code></span></p></td>
+<td>24 bits in 24 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S20LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S20LE</code></span></p></td>
+<td>20 bits in 24 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S20BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S20BE</code></span></p></td>
+<td>20 bits in 24 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U20LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U20LE</code></span></p></td>
+<td>20 bits in 24 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U20BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U20BE</code></span></p></td>
+<td>20 bits in 24 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S18LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S18LE</code></span></p></td>
+<td>18 bits in 24 bits, signed, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S18BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S18BE</code></span></p></td>
+<td>18 bits in 24 bits, signed, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U18LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U18LE</code></span></p></td>
+<td>18 bits in 24 bits, unsigned, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U18BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U18BE</code></span></p></td>
+<td>18 bits in 24 bits, unsigned, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F32LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F32LE</code></span></p></td>
+<td>32-bit floating point samples, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F32BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F32BE</code></span></p></td>
+<td>32-bit floating point samples, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F64LE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F64LE</code></span></p></td>
+<td>64-bit floating point samples, little endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F64BE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F64BE</code></span></p></td>
+<td>64-bit floating point samples, big endian
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S16:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S16</code></span></p></td>
+<td>16 bits in 16 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U16:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U16</code></span></p></td>
+<td>16 bits in 16 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24-32:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24_32</code></span></p></td>
+<td>24 bits in 32 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24-32:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24_32</code></span></p></td>
+<td>24 bits in 32 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S32:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S32</code></span></p></td>
+<td>32 bits in 32 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U32:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U32</code></span></p></td>
+<td>32 bits in 32 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S24:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S24</code></span></p></td>
+<td>24 bits in 24 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U24:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U24</code></span></p></td>
+<td>24 bits in 24 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S20:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S20</code></span></p></td>
+<td>20 bits in 24 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U20:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U20</code></span></p></td>
+<td>20 bits in 24 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-S18:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_S18</code></span></p></td>
+<td>18 bits in 24 bits, signed, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-U18:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_U18</code></span></p></td>
+<td>18 bits in 24 bits, unsigned, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F32:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F32</code></span></p></td>
+<td>32-bit floating point samples, native endianness
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-F64:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_F64</code></span></p></td>
+<td>64-bit floating point samples, native endianness
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioFormatFlags"></a><h3>enum GstAudioFormatFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUDIO_FORMAT_FLAG_INTEGER = (1 &lt;&lt; 0),
+ GST_AUDIO_FORMAT_FLAG_FLOAT = (1 &lt;&lt; 1),
+ GST_AUDIO_FORMAT_FLAG_SIGNED = (1 &lt;&lt; 2),
+ GST_AUDIO_FORMAT_FLAG_COMPLEX = (1 &lt;&lt; 4)
+} GstAudioFormatFlags;
+</pre>
+<p>
+The different audio flags that a format info can have.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-FLAG-INTEGER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_FLAG_INTEGER</code></span></p></td>
+<td>integer samples
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-FLAG-FLOAT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_FLAG_FLOAT</code></span></p></td>
+<td>float samples
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-FLAG-SIGNED:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_FLAG_SIGNED</code></span></p></td>
+<td>signed samples
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-FORMAT-FLAG-COMPLEX:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_FORMAT_FLAG_COMPLEX</code></span></p></td>
+<td>complex layout
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioFormatInfo"></a><h3>struct GstAudioFormatInfo</h3>
+<pre class="programlisting">struct GstAudioFormatInfo {
+ GstAudioFormat format;
+ const gchar *name;
+ const gchar *description;
+ GstAudioFormatFlags flags;
+ gint endianness;
+ gint width;
+ gint depth;
+ guint8 silence[8];
+
+ GstAudioFormat unpack_format;
+ GstAudioFormatUnpack unpack_func;
+ GstAudioFormatPack pack_func;
+};
+</pre>
+<p>
+Information for an audio format.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.format"></a>format</code></em>;</span></p></td>
+<td><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstAudioFormatInfo.name"></a>name</code></em>;</span></p></td>
+<td>string representation of the format</td>
+</tr>
+<tr>
+<td><p><span class="term">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstAudioFormatInfo.description"></a>description</code></em>;</span></p></td>
+<td>user readable description of the format</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags" title="enum GstAudioFormatFlags"><span class="type">GstAudioFormatFlags</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.flags"></a>flags</code></em>;</span></p></td>
+<td><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags" title="enum GstAudioFormatFlags"><span class="type">GstAudioFormatFlags</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.endianness"></a>endianness</code></em>;</span></p></td>
+<td>the endianness</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.width"></a>width</code></em>;</span></p></td>
+<td>amount of bits used for one sample</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.depth"></a>depth</code></em>;</span></p></td>
+<td>amount of valid bits in <em class="parameter"><code>width</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.silence"></a>silence</code></em>[8];</span></p></td>
+<td>
+<em class="parameter"><code>width</code></em>/8 bytes with 1 silent sample</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a> <em class="structfield"><code><a name="GstAudioFormatInfo.unpack-format"></a>unpack_format</code></em>;</span></p></td>
+<td>the format of the unpacked samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">GstAudioFormatUnpack</span> <em class="structfield"><code><a name="GstAudioFormatInfo.unpack-func"></a>unpack_func</code></em>;</span></p></td>
+<td>function to unpack samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">GstAudioFormatPack</span> <em class="structfield"><code><a name="GstAudioFormatInfo.pack-func"></a>pack_func</code></em>;</span></p></td>
+<td>function to pack samples</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioInfo"></a><h3>struct GstAudioInfo</h3>
+<pre class="programlisting">struct GstAudioInfo {
+ const GstAudioFormatInfo *finfo;
+ GstAudioFlags flags;
+ gint rate;
+ gint channels;
+ gint bpf;
+ GstAudioChannelPosition position[64];
+};
+</pre>
+<p>
+Information describing audio properties. This information can be filled
+in from GstCaps with <a class="link" href="gst-plugins-base-libs-gstaudio.html#gst-audio-info-from-caps" title="gst_audio_info_from_caps ()"><code class="function">gst_audio_info_from_caps()</code></a>.
+</p>
+<p>
+Use the provided macros to access the info in this structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">const <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo"><span class="type">GstAudioFormatInfo</span></a> *<em class="structfield"><code><a name="GstAudioInfo.finfo"></a>finfo</code></em>;</span></p></td>
+<td>the format info of the audio</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFlags" title="enum GstAudioFlags"><span class="type">GstAudioFlags</span></a> <em class="structfield"><code><a name="GstAudioInfo.flags"></a>flags</code></em>;</span></p></td>
+<td>additional audio flags</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioInfo.rate"></a>rate</code></em>;</span></p></td>
+<td>the audio sample rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioInfo.channels"></a>channels</code></em>;</span></p></td>
+<td>the number of channels</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstAudioInfo.bpf"></a>bpf</code></em>;</span></p></td>
+<td>the number of bytes for one frame, this is the size of one
+sample * <em class="parameter"><code>channels</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> <em class="structfield"><code><a name="GstAudioInfo.position"></a>position</code></em>[64];</span></p></td>
+<td>the positions for each channel</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-info-init"></a><h3>gst_audio_info_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_info_init (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>info</code></em> with default values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-info-from-caps"></a><h3>gst_audio_info_from_caps ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_info_from_caps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Parse <em class="parameter"><code>caps</code></em> and update <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>caps</code></em> could be parsed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-info-to-caps"></a><h3>gst_audio_info_to_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_audio_info_to_caps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>);</pre>
+<p>
+Convert the values of <em class="parameter"><code>info</code></em> into a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> containing the
+info of <em class="parameter"><code>info</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-info-convert"></a><h3>gst_audio_info_convert ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_info_convert (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> *info</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> src_val</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dest_val</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-format-get-info"></a><h3>gst_audio_format_get_info ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo"><span class="returnvalue">GstAudioFormatInfo</span></a> * gst_audio_format_get_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a> format</code></em>);</pre>
+<p>
+Get the <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo"><span class="type">GstAudioFormatInfo</span></a> for <em class="parameter"><code>format</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormat" title="enum GstAudioFormat"><span class="type">GstAudioFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo" title="struct GstAudioFormatInfo"><span class="type">GstAudioFormatInfo</span></a> for <em class="parameter"><code>format</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-DEPTH:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_DEPTH()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_DEPTH(info) ((info)-&gt;depth)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_ENDIANNESS()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_ENDIANNESS(info) ((info)-&gt;endianness)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-FLAGS:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_FLAGS()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_FLAGS(info) ((info)-&gt;flags)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-FORMAT:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_FORMAT()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_FORMAT(info) ((info)-&gt;format)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_IS_FLOAT()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_IS_FLOAT(info) !!((info)-&gt;flags &amp; GST_AUDIO_FORMAT_FLAG_FLOAT)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_IS_INTEGER()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_IS_INTEGER(info) !!((info)-&gt;flags &amp; GST_AUDIO_FORMAT_FLAG_INTEGER)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN(info) ((info)-&gt;endianness == G_BIG_ENDIAN)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN(info) ((info)-&gt;endianness == G_LITTLE_ENDIAN)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_IS_SIGNED()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_IS_SIGNED(info) !!((info)-&gt;flags &amp; GST_AUDIO_FORMAT_FLAG_SIGNED)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-NAME:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_NAME()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_NAME(info) ((info)-&gt;name)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-FORMAT-INFO-WIDTH:CAPS"></a><h3>GST_AUDIO_FORMAT_INFO_WIDTH()</h3>
+<pre class="programlisting">#define GST_AUDIO_FORMAT_INFO_WIDTH(info) ((info)-&gt;width)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-BPF:CAPS"></a><h3>GST_AUDIO_INFO_BPF()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_BPF(info) ((info)-&gt;bpf)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-BPS:CAPS"></a><h3>GST_AUDIO_INFO_BPS()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_BPS(info) (GST_AUDIO_INFO_DEPTH(info) &gt;&gt; 3)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-CHANNELS:CAPS"></a><h3>GST_AUDIO_INFO_CHANNELS()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_CHANNELS(info) ((info)-&gt;channels)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-DEPTH:CAPS"></a><h3>GST_AUDIO_INFO_DEPTH()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_DEPTH(i) (GST_AUDIO_FORMAT_INFO_DEPTH((i)-&gt;finfo))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-FLAGS:CAPS"></a><h3>GST_AUDIO_INFO_FLAGS()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_FLAGS(info) ((info)-&gt;flags)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-FORMAT:CAPS"></a><h3>GST_AUDIO_INFO_FORMAT()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_FORMAT(i) (GST_AUDIO_FORMAT_INFO_FORMAT((i)-&gt;finfo))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS"></a><h3>GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS(info) ((info)-&gt;flags &amp; GST_AUDIO_FLAG_DEFAULT_POSITIONS)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-NAME:CAPS"></a><h3>GST_AUDIO_INFO_NAME()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_NAME(i) (GST_AUDIO_FORMAT_INFO_NAME((i)-&gt;finfo))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-POSITION:CAPS"></a><h3>GST_AUDIO_INFO_POSITION()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_POSITION(info,c) ((info)-&gt;position[c])
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-RATE:CAPS"></a><h3>GST_AUDIO_INFO_RATE()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_RATE(info) ((info)-&gt;rate)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-INFO-WIDTH:CAPS"></a><h3>GST_AUDIO_INFO_WIDTH()</h3>
+<pre class="programlisting">#define GST_AUDIO_INFO_WIDTH(i) (GST_AUDIO_FORMAT_INFO_WIDTH((i)-&gt;finfo))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FRAMES-TO-CLOCK-TIME:CAPS"></a><h3>GST_FRAMES_TO_CLOCK_TIME()</h3>
+<pre class="programlisting">#define GST_FRAMES_TO_CLOCK_TIME(frames, rate)</pre>
+<p>
+Calculate clocktime from sample <em class="parameter"><code>frames</code></em> and <em class="parameter"><code>rate</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frames</code></em> :</span></p></td>
+<td>sample frames</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>sampling rate</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-TIME-TO-FRAMES:CAPS"></a><h3>GST_CLOCK_TIME_TO_FRAMES()</h3>
+<pre class="programlisting">#define GST_CLOCK_TIME_TO_FRAMES(clocktime, rate)</pre>
+<p>
+Calculate frames from <em class="parameter"><code>clocktime</code></em> and sample <em class="parameter"><code>rate</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clocktime</code></em> :</span></p></td>
+<td>clock time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>sampling rate</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DEF-RATE:CAPS"></a><h3>GST_AUDIO_DEF_RATE</h3>
+<pre class="programlisting">#define GST_AUDIO_DEF_RATE 44100
+</pre>
+<p>
+Standard sampling rate used in consumer audio.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-buffer-clip"></a><h3>gst_audio_buffer_clip ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_audio_buffer_clip (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> rate</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> bpf</code></em>);</pre>
+<p>
+Clip the the buffer to the given <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#GstSegment"><code class="literal">GstSegment</code></a>.
+</p>
+<p>
+After calling this function the caller does not own a reference to
+<em class="parameter"><code>buffer</code></em> anymore.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>The buffer to clip.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>Segment in <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><code class="literal">GST_FORMAT_TIME</code></a> or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><code class="literal">GST_FORMAT_DEFAULT</code></a> to which
+the buffer should be clipped.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>sample rate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bpf</code></em> :</span></p></td>
+<td>size of one audio frame in bytes. This is the size of one sample
+* channels.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the buffer is completely outside the configured segment,
+otherwise the clipped buffer is returned.
+If the buffer has no timestamp, it is assumed to be inside the segment and
+is not clipped</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudioclock.html b/docs/libs/html/gst-plugins-base-libs-gstaudioclock.html
new file mode 100644
index 0000000..508118e
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudioclock.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudioclock</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">
+<link rel="next" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudio.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudiodecoder.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudioclock.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioclock.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioclock.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudioclock"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudioclock.top_of_page"></a>gstaudioclock</span></h2>
+<p>gstaudioclock — Helper object for implementing audio clocks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudioclock.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioClock"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudioclock.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock-struct" title="struct GstAudioClock">GstAudioClock</a>;
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> (<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()">*GstAudioClockGetTimeFunc</a>) (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new" title="gst_audio_clock_new ()">gst_audio_clock_new</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new-full" title="gst_audio_clock_new_full ()">gst_audio_clock_new_full</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-adjust" title="gst_audio_clock_adjust ()">gst_audio_clock_adjust</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-get-time" title="gst_audio_clock_get_time ()">gst_audio_clock_get_time</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-reset" title="gst_audio_clock_reset ()">gst_audio_clock_reset</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-invalidate" title="gst_audio_clock_invalidate ()">gst_audio_clock_invalidate</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioclock.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html">GstClock</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSystemClock.html">GstSystemClock</a>
+ +----GstAudioClock
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioclock.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> makes it easy for elements to implement a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>, they
+simply need to provide a function that returns the current clock time.
+</p>
+<p>
+This object is internally used to implement the clock in <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>.
+</p>
+<p>
+Last reviewed on 2006-09-27 (0.10.12)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioclock.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioClock-struct"></a><h3>struct GstAudioClock</h3>
+<pre class="programlisting">struct GstAudioClock;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioClockGetTimeFunc"></a><h3>GstAudioClockGetTimeFunc ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> (*GstAudioClockGetTimeFunc) (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+This function will be called whenever the current clock time needs to be
+calculated. If this function returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>, the last reported
+time will be returned by the clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current time or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a> if the previous time should
+be used.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-new"></a><h3>gst_audio_clock_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * gst_audio_clock_new (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> instance. Whenever the clock time should be
+calculated it will call <em class="parameter"><code>func</code></em> with <em class="parameter"><code>user_data</code></em>. When <em class="parameter"><code>func</code></em> returns
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>, the clock will return the last reported time.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> casted to a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-new-full"></a><h3>gst_audio_clock_new_full ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * gst_audio_clock_new_full (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> instance. Whenever the clock time should be
+calculated it will call <em class="parameter"><code>func</code></em> with <em class="parameter"><code>user_data</code></em>. When <em class="parameter"><code>func</code></em> returns
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>, the clock will return the last reported time.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>destroy_notify</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> for <em class="parameter"><code>user_data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> casted to a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-adjust"></a><h3>gst_audio_clock_adjust ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_audio_clock_adjust (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Adjust <em class="parameter"><code>time</code></em> with the internal offset of the audio clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>time</code></em> adjusted with the internal offset.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-get-time"></a><h3>gst_audio_clock_get_time ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_audio_clock_get_time (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Report the time as returned by the <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> without applying
+any offsets.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the time as reported by the time function of the audio clock</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-reset"></a><h3>gst_audio_clock_reset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_clock_reset (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Inform <em class="parameter"><code>clock</code></em> that future calls to <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> will return values
+starting from <em class="parameter"><code>time</code></em>. The clock will update an internal offset to make sure that
+future calls to internal_time will return an increasing result as required by
+the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-clock-invalidate"></a><h3>gst_audio_clock_invalidate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_clock_invalidate (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Invalidate the clock function. Call this function when the provided
+<a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc" title="GstAudioClockGetTimeFunc ()"><span class="type">GstAudioClockGetTimeFunc</span></a> cannot be called anymore, for example, when the
+user_data becomes invalid.
+</p>
+<p>
+After calling this function, <em class="parameter"><code>clock</code></em> will return the last returned time for
+the rest of its lifetime.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock"><span class="type">GstAudioClock</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioclock.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSystemClock.html"><span class="type">GstSystemClock</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudiodecoder.html b/docs/libs/html/gst-plugins-base-libs-gstaudiodecoder.html
new file mode 100644
index 0000000..d76e5a7
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudiodecoder.html
@@ -0,0 +1,912 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudiodecoder</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudioclock.html" title="gstaudioclock">
+<link rel="next" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudioclock.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudioencoder.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudiodecoder.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiodecoder.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiodecoder.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiodecoder.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudiodecoder"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudiodecoder.top_of_page"></a>gstaudiodecoder</span></h2>
+<p>gstaudiodecoder — Base class for audio decoders</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudiodecoder.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioDecoder"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudiodecoder.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder-struct" title="struct GstAudioDecoder">GstAudioDecoder</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoderClass" title="struct GstAudioDecoderClass">GstAudioDecoderClass</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-ERROR:CAPS" title="GST_AUDIO_DECODER_ERROR()">GST_AUDIO_DECODER_ERROR</a> (el,
+ weight,
+ domain,
+ code,
+ text,
+ debug,
+ ret)
+#define <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-NAME:CAPS" title="GST_AUDIO_DECODER_SINK_NAME">GST_AUDIO_DECODER_SINK_NAME</a>
+#define <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-PAD:CAPS" title="GST_AUDIO_DECODER_SINK_PAD()">GST_AUDIO_DECODER_SINK_PAD</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-NAME:CAPS" title="GST_AUDIO_DECODER_SRC_NAME">GST_AUDIO_DECODER_SRC_NAME</a>
+#define <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-PAD:CAPS" title="GST_AUDIO_DECODER_SRC_PAD()">GST_AUDIO_DECODER_SRC_PAD</a> (obj)
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-finish-frame" title="gst_audio_decoder_finish_frame ()">gst_audio_decoder_finish_frame</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frames</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="returnvalue">GstAudioInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-audio-info" title="gst_audio_decoder_get_audio_info ()">gst_audio_decoder_get_audio_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-byte-time" title="gst_audio_decoder_get_byte_time ()">gst_audio_decoder_get_byte_time</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-delay" title="gst_audio_decoder_get_delay ()">gst_audio_decoder_get_delay</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-latency" title="gst_audio_decoder_get_latency ()">gst_audio_decoder_get_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-max-errors" title="gst_audio_decoder_get_max_errors ()">gst_audio_decoder_get_max_errors</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-min-latency" title="gst_audio_decoder_get_min_latency ()">gst_audio_decoder_get_min_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-parse-state" title="gst_audio_decoder_get_parse_state ()">gst_audio_decoder_get_parse_state</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *sync</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *eos</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc" title="gst_audio_decoder_get_plc ()">gst_audio_decoder_get_plc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc-aware" title="gst_audio_decoder_get_plc_aware ()">gst_audio_decoder_get_plc_aware</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-tolerance" title="gst_audio_decoder_get_tolerance ()">gst_audio_decoder_get_tolerance</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-byte-time" title="gst_audio_decoder_set_byte_time ()">gst_audio_decoder_set_byte_time</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-latency" title="gst_audio_decoder_set_latency ()">gst_audio_decoder_set_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-max-errors" title="gst_audio_decoder_set_max_errors ()">gst_audio_decoder_set_max_errors</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-min-latency" title="gst_audio_decoder_set_min_latency ()">gst_audio_decoder_set_min_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc" title="gst_audio_decoder_set_plc ()">gst_audio_decoder_set_plc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc-aware" title="gst_audio_decoder_set_plc_aware ()">gst_audio_decoder_set_plc_aware</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> plc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-tolerance" title="gst_audio_decoder_set_tolerance ()">gst_audio_decoder_set_tolerance</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> tolerance</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstAudioDecoder
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--min-latency" title='The "min-latency" property'>min-latency</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--plc" title='The "plc" property'>plc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--tolerance" title='The "tolerance" property'>tolerance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.description"></a><h2>Description</h2>
+<p>
+This base class is for audio decoders turning encoded data into
+raw audio samples.
+</p>
+<p>
+GstAudioDecoder and subclass should cooperate as follows.
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Configuration</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Initially, GstAudioDecoder calls <em class="parameter"><code>start</code></em> when the decoder element
+ is activated, which allows subclass to perform any global setup.
+ Base class (context) parameters can already be set according to subclass
+ capabilities (or possibly upon receive more information in subsequent
+ <em class="parameter"><code>set_format</code></em>).
+ </p></li>
+<li class="listitem"><p>
+ GstAudioDecoder calls <em class="parameter"><code>set_format</code></em> to inform subclass of the format
+ of input audio data that it is about to receive.
+ While unlikely, it might be called more than once, if changing input
+ parameters require reconfiguration.
+ </p></li>
+<li class="listitem"><p>
+ GstAudioDecoder calls <em class="parameter"><code>stop</code></em> at end of all processing.
+ </p></li>
+</ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Data processing</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Base class gathers input data, and optionally allows subclass
+ to parse this into subsequently manageable (as defined by subclass)
+ chunks. Such chunks are subsequently referred to as 'frames',
+ though they may or may not correspond to 1 (or more) audio format frame.
+ </p></li>
+<li class="listitem"><p>
+ Input frame is provided to subclass' <em class="parameter"><code>handle_frame</code></em>.
+ </p></li>
+<li class="listitem"><p>
+ If codec processing results in decoded data, subclass should call
+ <em class="parameter"><code>gst_audio_decoder_finish_frame</code></em> to have decoded data pushed
+ downstream.
+ </p></li>
+<li class="listitem"><p>
+ Just prior to actually pushing a buffer downstream,
+ it is passed to <em class="parameter"><code>pre_push</code></em>. Subclass should either use this callback
+ to arrange for additional downstream pushing or otherwise ensure such
+ custom pushing occurs after at least a method call has finished since
+ setting src pad caps.
+ </p></li>
+<li class="listitem"><p>
+ During the parsing process GstAudioDecoderClass will handle both
+ srcpad and sinkpad events. Sink events will be passed to subclass
+ if <em class="parameter"><code>event</code></em> callback has been provided.
+ </p></li>
+</ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Shutdown phase</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem"><p>
+ GstAudioDecoder class calls <em class="parameter"><code>stop</code></em> to inform the subclass that data
+ parsing will be stopped.
+ </p></li></ul>
+</div></li>
+</ol></div>
+<p>
+</p>
+<p>
+Subclass is responsible for providing pad template caps for
+source and sink pads. The pads need to be named "sink" and "src". It also
+needs to set the fixed caps on srcpad, when the format is ensured. This
+is typically when base class calls subclass' <em class="parameter"><code>set_format</code></em> function, though
+it might be delayed until calling <em class="parameter"><code>gst_audio_decoder_finish_frame</code></em>.
+</p>
+<p>
+In summary, above process should have subclass concentrating on
+codec data processing while leaving other matters to base class,
+such as most notably timestamp handling. While it may exert more control
+in this area (see e.g. <em class="parameter"><code>pre_push</code></em>), it is very much not recommended.
+</p>
+<p>
+In particular, base class will try to arrange for perfect output timestamps
+as much as possible while tracking upstream timestamps.
+To this end, if deviation between the next ideal expected perfect timestamp
+and upstream exceeds <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--tolerance" title='The "tolerance" property'><span class="type">"tolerance"</span></a>, then resync to upstream
+occurs (which would happen always if the tolerance mechanism is disabled).
+</p>
+<p>
+In non-live pipelines, baseclass can also (configurably) arrange for
+output buffer aggregation which may help to redue large(r) numbers of
+small(er) buffers being pushed and processed downstream.
+</p>
+<p>
+On the other hand, it should be noted that baseclass only provides limited
+seeking support (upon explicit subclass request), as full-fledged support
+should rather be left to upstream demuxer, parser or alike. This simple
+approach caters for seeking and duration reporting using estimated input
+bitrates.
+</p>
+<p>
+Things that subclass need to take care of:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>Provide pad templates</p></li>
+<li class="listitem"><p>
+ Set source pad caps when appropriate
+ </p></li>
+<li class="listitem"><p>
+ Set user-configurable properties to sane defaults for format and
+ implementing codec at hand, and convey some subclass capabilities and
+ expectations in context.
+ </p></li>
+<li class="listitem"><p>
+ Accept data in <em class="parameter"><code>handle_frame</code></em> and provide encoded results to
+ <em class="parameter"><code>gst_audio_decoder_finish_frame</code></em>. If it is prepared to perform
+ PLC, it should also accept NULL data in <em class="parameter"><code>handle_frame</code></em> and provide for
+ data for indicated duration.
+ </p></li>
+</ul></div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioDecoder-struct"></a><h3>struct GstAudioDecoder</h3>
+<pre class="programlisting">struct GstAudioDecoder;</pre>
+<p>
+The opaque <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> data structure.
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioDecoderClass"></a><h3>struct GstAudioDecoderClass</h3>
+<pre class="programlisting">struct GstAudioDecoderClass {
+ GstElementClass element_class;
+
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstAudioDecoder *dec);
+
+ gboolean (*stop) (GstAudioDecoder *dec);
+
+ gboolean (*set_format) (GstAudioDecoder *dec,
+ GstCaps *caps);
+
+ GstFlowReturn (*parse) (GstAudioDecoder *dec,
+ GstAdapter *adapter,
+ gint *offset, gint *length);
+
+ GstFlowReturn (*handle_frame) (GstAudioDecoder *dec,
+ GstBuffer *buffer);
+
+ void (*flush) (GstAudioDecoder *dec, gboolean hard);
+
+ GstFlowReturn (*pre_push) (GstAudioDecoder *dec,
+ GstBuffer **buffer);
+
+ gboolean (*event) (GstAudioDecoder *dec,
+ GstEvent *event);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At minimum <em class="parameter"><code>handle_frame</code></em> (and likely <em class="parameter"><code>set_format</code></em>) needs to be
+overridden.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstAudioDecoderClass.element-class"></a>element_class</code></em>;</span></p></td>
+<td>The parent class structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.start"></a>start</code></em> ()</span></p></td>
+<td>Optional.
+Called when the element starts processing.
+Allows opening external resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>Optional.
+Called when the element stops processing.
+Allows closing external resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.set-format"></a>set_format</code></em> ()</span></p></td>
+<td>Notifies subclass of incoming data format (caps).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.parse"></a>parse</code></em> ()</span></p></td>
+<td>Optional.
+Allows chopping incoming data into manageable units (frames)
+for subsequent decoding. This division is at subclass
+discretion and may or may not correspond to 1 (or more)
+frames as defined by audio format.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.handle-frame"></a>handle_frame</code></em> ()</span></p></td>
+<td>Provides input data (or NULL to clear any remaining data)
+to subclass. Input data ref management is performed by
+base class, subclass should not care or intervene.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.flush"></a>flush</code></em> ()</span></p></td>
+<td>Optional.
+Instructs subclass to clear any codec caches and discard
+any pending samples and not yet returned encoded data.
+<em class="parameter"><code>hard</code></em> indicates whether a FLUSH is being processed,
+or otherwise a DISCONT (or conceptually similar).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.pre-push"></a>pre_push</code></em> ()</span></p></td>
+<td>Optional.
+Called just prior to pushing (encoded data) buffer downstream.
+Subclass has full discretionary access to buffer,
+and a not OK flow return will abort downstream pushing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioDecoderClass.event"></a>event</code></em> ()</span></p></td>
+<td>Optional.
+Event handler on the sink pad. This function should return
+TRUE if the event was handled and should be discarded
+(i.e. not unref'ed).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DECODER-ERROR:CAPS"></a><h3>GST_AUDIO_DECODER_ERROR()</h3>
+<pre class="programlisting">#define GST_AUDIO_DECODER_ERROR(el, weight, domain, code, text, debug, ret)</pre>
+<p>
+Utility function that audio decoder elements can use in case they encountered
+a data processing error that may be fatal for the current "data unit" but
+need not prevent subsequent decoding. Such errors are counted and if there
+are too many, as configured in the context's max_errors, the pipeline will
+post an error message and the application will be requested to stop further
+media processing. Otherwise, it is considered a "glitch" and only a warning
+is logged. In either case, <em class="parameter"><code>ret</code></em> is set to the proper value to
+return to upstream/caller (indicating either GST_FLOW_ERROR or GST_FLOW_OK).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>el</code></em> :</span></p></td>
+<td>the base audio decoder element that generates the error</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>weight</code></em> :</span></p></td>
+<td>element defined weight of the error, added to error count</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>domain</code></em> :</span></p></td>
+<td>like CORE, LIBRARY, RESOURCE or STREAM (see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstGError.html"><span class="type">gstreamer-GstGError</span></a>)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>error code defined for that domain (see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstGError.html"><span class="type">gstreamer-GstGError</span></a>)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>the message to display (format string and args enclosed in
+parentheses)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>debugging information for the message (format string and args
+enclosed in parentheses)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ret</code></em> :</span></p></td>
+<td>variable to receive return value</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DECODER-SINK-NAME:CAPS"></a><h3>GST_AUDIO_DECODER_SINK_NAME</h3>
+<pre class="programlisting">#define GST_AUDIO_DECODER_SINK_NAME "sink"
+</pre>
+<p>
+The name of the templates for the sink pad.
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DECODER-SINK-PAD:CAPS"></a><h3>GST_AUDIO_DECODER_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_AUDIO_DECODER_SINK_PAD(obj) (((GstAudioDecoder *) (obj))-&gt;sinkpad)
+</pre>
+<p>
+Gives the pointer to the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>base audio codec instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DECODER-SRC-NAME:CAPS"></a><h3>GST_AUDIO_DECODER_SRC_NAME</h3>
+<pre class="programlisting">#define GST_AUDIO_DECODER_SRC_NAME "src"
+</pre>
+<p>
+The name of the templates for the source pad.
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-DECODER-SRC-PAD:CAPS"></a><h3>GST_AUDIO_DECODER_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_AUDIO_DECODER_SRC_PAD(obj) (((GstAudioDecoder *) (obj))-&gt;srcpad)
+</pre>
+<p>
+Gives the pointer to the source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>base audio codec instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-finish-frame"></a><h3>gst_audio_decoder_finish_frame ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_audio_decoder_finish_frame (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frames</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-audio-info"></a><h3>gst_audio_decoder_get_audio_info ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="returnvalue">GstAudioInfo</span></a> * gst_audio_decoder_get_audio_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> describing the input audio format</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-byte-time"></a><h3>gst_audio_decoder_get_byte_time ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_decoder_get_byte_time (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured byte to time conversion setting</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-delay"></a><h3>gst_audio_decoder_get_delay ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_decoder_get_delay (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured decoder delay</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-latency"></a><h3>gst_audio_decoder_get_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_get_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max</code></em>);</pre>
+<p>
+Sets the variables pointed to by <em class="parameter"><code>min</code></em> and <em class="parameter"><code>max</code></em> to the currently configured
+latency.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>a pointer to storage to hold minimum latency. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>a pointer to storage to hold maximum latency. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-max-errors"></a><h3>gst_audio_decoder_get_max_errors ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_decoder_get_max_errors (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured decoder tolerated error count.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-min-latency"></a><h3>gst_audio_decoder_get_min_latency ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> gst_audio_decoder_get_min_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<p>
+Queries decoder's latency aggregation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>aggregation latency.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-parse-state"></a><h3>gst_audio_decoder_get_parse_state ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_get_parse_state (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *sync</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *eos</code></em>);</pre>
+<p>
+Return current parsing (sync and eos) state.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sync</code></em> :</span></p></td>
+<td>a pointer to a variable to hold the current sync state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>eos</code></em> :</span></p></td>
+<td>a pointer to a variable to hold the current eos state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-plc"></a><h3>gst_audio_decoder_get_plc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_decoder_get_plc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<p>
+Queries decoder packet loss concealment handling.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if packet loss concealment is enabled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-plc-aware"></a><h3>gst_audio_decoder_get_plc_aware ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_decoder_get_plc_aware (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured plc handling</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-get-tolerance"></a><h3>gst_audio_decoder_get_tolerance ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> gst_audio_decoder_get_tolerance (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>);</pre>
+<p>
+Queries current audio jitter tolerance threshold.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>decoder audio jitter tolerance threshold.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-byte-time"></a><h3>gst_audio_decoder_set_byte_time ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_byte_time (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>
+Allows baseclass to perform byte to time estimated conversion.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>whether to enable byte to time conversion</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-latency"></a><h3>gst_audio_decoder_set_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max</code></em>);</pre>
+<p>
+Sets decoder latency.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>minimum latency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>maximum latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-max-errors"></a><h3>gst_audio_decoder_set_max_errors ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_max_errors (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);</pre>
+<p>
+Sets numbers of tolerated decoder errors, where a tolerated one is then only
+warned about, but more than tolerated will lead to fatal error.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>max tolerated errors</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-min-latency"></a><h3>gst_audio_decoder_set_min_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_min_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> num</code></em>);</pre>
+<p>
+Sets decoder minimum aggregation latency.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>new minimum latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-plc"></a><h3>gst_audio_decoder_set_plc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_plc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>
+Enable or disable decoder packet loss concealment, provided subclass
+and codec are capable and allow handling plc.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-plc-aware"></a><h3>gst_audio_decoder_set_plc_aware ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_plc_aware (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> plc</code></em>);</pre>
+<p>
+Indicates whether or not subclass handles packet loss concealment (plc).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plc</code></em> :</span></p></td>
+<td>new plc state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-decoder-set-tolerance"></a><h3>gst_audio_decoder_set_tolerance ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_decoder_set_tolerance (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a> *dec</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> tolerance</code></em>);</pre>
+<p>
+Configures decoder audio jitter tolerance threshold.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dec</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder"><span class="type">GstAudioDecoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tolerance</code></em> :</span></p></td>
+<td>new tolerance</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioDecoder--min-latency"></a><h3>The <code class="literal">"min-latency"</code> property</h3>
+<pre class="programlisting"> "min-latency" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Aggregate output data to a minimum of latency time (ns).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioDecoder--plc"></a><h3>The <code class="literal">"plc"</code> property</h3>
+<pre class="programlisting"> "plc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Perform packet loss concealment (if supported).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioDecoder--tolerance"></a><h3>The <code class="literal">"tolerance"</code> property</h3>
+<pre class="programlisting"> "tolerance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Perfect ts while timestamp jitter/imperfection within tolerance (ns).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiodecoder.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html"><span class="type">GstBaseTransform</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudioencoder.html b/docs/libs/html/gst-plugins-base-libs-gstaudioencoder.html
new file mode 100644
index 0000000..c9fb9c7
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudioencoder.html
@@ -0,0 +1,964 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudioencoder</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudiodecoder.html" title="gstaudiodecoder">
+<link rel="next" href="gst-plugins-base-libs-gstaudiofilter.html" title="gstaudiofilter">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudiodecoder.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudiofilter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudioencoder.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioencoder.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioencoder.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioencoder.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioencoder.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudioencoder"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudioencoder.top_of_page"></a>gstaudioencoder</span></h2>
+<p>gstaudioencoder — Base class for audio encoders</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudioencoder.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioEncoder"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudioencoder.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder-struct" title="struct GstAudioEncoder">GstAudioEncoder</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoderClass" title="struct GstAudioEncoderClass">GstAudioEncoderClass</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SEGMENT:CAPS" title="GST_AUDIO_ENCODER_SEGMENT()">GST_AUDIO_ENCODER_SEGMENT</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-NAME:CAPS" title="GST_AUDIO_ENCODER_SINK_NAME">GST_AUDIO_ENCODER_SINK_NAME</a>
+#define <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-PAD:CAPS" title="GST_AUDIO_ENCODER_SINK_PAD()">GST_AUDIO_ENCODER_SINK_PAD</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-NAME:CAPS" title="GST_AUDIO_ENCODER_SRC_NAME">GST_AUDIO_ENCODER_SRC_NAME</a>
+#define <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-PAD:CAPS" title="GST_AUDIO_ENCODER_SRC_PAD()">GST_AUDIO_ENCODER_SRC_PAD</a> (obj)
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-finish-frame" title="gst_audio_encoder_finish_frame ()">gst_audio_encoder_finish_frame</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> samples</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="returnvalue">GstAudioInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-audio-info" title="gst_audio_encoder_get_audio_info ()">gst_audio_encoder_get_audio_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-max" title="gst_audio_encoder_get_frame_max ()">gst_audio_encoder_get_frame_max</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-min" title="gst_audio_encoder_get_frame_samples_min ()">gst_audio_encoder_get_frame_samples_min</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-max" title="gst_audio_encoder_get_frame_samples_max ()">gst_audio_encoder_get_frame_samples_max</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-hard-resync" title="gst_audio_encoder_get_hard_resync ()">gst_audio_encoder_get_hard_resync</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-latency" title="gst_audio_encoder_get_latency ()">gst_audio_encoder_get_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-lookahead" title="gst_audio_encoder_get_lookahead ()">gst_audio_encoder_get_lookahead</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-mark-granule" title="gst_audio_encoder_get_mark_granule ()">gst_audio_encoder_get_mark_granule</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-perfect-timestamp" title="gst_audio_encoder_get_perfect_timestamp ()">gst_audio_encoder_get_perfect_timestamp</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-tolerance" title="gst_audio_encoder_get_tolerance ()">gst_audio_encoder_get_tolerance</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-proxy-getcaps" title="gst_audio_encoder_proxy_getcaps ()">gst_audio_encoder_proxy_getcaps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-max" title="gst_audio_encoder_set_frame_max ()">gst_audio_encoder_set_frame_max</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-min" title="gst_audio_encoder_set_frame_samples_min ()">gst_audio_encoder_set_frame_samples_min</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-max" title="gst_audio_encoder_set_frame_samples_max ()">gst_audio_encoder_set_frame_samples_max</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-hard-resync" title="gst_audio_encoder_set_hard_resync ()">gst_audio_encoder_set_hard_resync</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-latency" title="gst_audio_encoder_set_latency ()">gst_audio_encoder_set_latency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-lookahead" title="gst_audio_encoder_set_lookahead ()">gst_audio_encoder_set_lookahead</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-mark-granule" title="gst_audio_encoder_set_mark_granule ()">gst_audio_encoder_set_mark_granule</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-perfect-timestamp" title="gst_audio_encoder_set_perfect_timestamp ()">gst_audio_encoder_set_perfect_timestamp</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-tolerance" title="gst_audio_encoder_set_tolerance ()">gst_audio_encoder_set_tolerance</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> tolerance</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstAudioEncoder
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAudioEncoder implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html">GstPreset</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--hard-resync" title='The "hard-resync" property'>hard-resync</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--mark-granule" title='The "mark-granule" property'>mark-granule</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--perfect-timestamp" title='The "perfect-timestamp" property'>perfect-timestamp</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--tolerance" title='The "tolerance" property'>tolerance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.description"></a><h2>Description</h2>
+<p>
+This base class is for audio encoders turning raw audio samples into
+encoded audio data.
+</p>
+<p>
+GstAudioEncoder and subclass should cooperate as follows.
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Configuration</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Initially, GstAudioEncoder calls <em class="parameter"><code>start</code></em> when the encoder element
+ is activated, which allows subclass to perform any global setup.
+ </p></li>
+<li class="listitem"><p>
+ GstAudioEncoder calls <em class="parameter"><code>set_format</code></em> to inform subclass of the format
+ of input audio data that it is about to receive. Subclass should
+ setup for encoding and configure various base class parameters
+ appropriately, notably those directing desired input data handling.
+ While unlikely, it might be called more than once, if changing input
+ parameters require reconfiguration.
+ </p></li>
+<li class="listitem"><p>
+ GstAudioEncoder calls <em class="parameter"><code>stop</code></em> at end of all processing.
+ </p></li>
+</ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Data processing</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Base class gathers input sample data (as directed by the context's
+ frame_samples and frame_max) and provides this to subclass' <em class="parameter"><code>handle_frame</code></em>.
+ </p></li>
+<li class="listitem"><p>
+ If codec processing results in encoded data, subclass should call
+ <em class="parameter"><code>gst_audio_encoder_finish_frame</code></em> to have encoded data pushed
+ downstream. Alternatively, it might also call to indicate dropped
+ (non-encoded) samples.
+ </p></li>
+<li class="listitem"><p>
+ Just prior to actually pushing a buffer downstream,
+ it is passed to <em class="parameter"><code>pre_push</code></em>.
+ </p></li>
+<li class="listitem"><p>
+ During the parsing process GstAudioEncoderClass will handle both
+ srcpad and sinkpad events. Sink events will be passed to subclass
+ if <em class="parameter"><code>event</code></em> callback has been provided.
+ </p></li>
+</ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Shutdown phase</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem"><p>
+ GstAudioEncoder class calls <em class="parameter"><code>stop</code></em> to inform the subclass that data
+ parsing will be stopped.
+ </p></li></ul>
+</div></li>
+</ol></div>
+<p>
+</p>
+<p>
+Subclass is responsible for providing pad template caps for
+source and sink pads. The pads need to be named "sink" and "src". It also
+needs to set the fixed caps on srcpad, when the format is ensured. This
+is typically when base class calls subclass' <em class="parameter"><code>set_format</code></em> function, though
+it might be delayed until calling <em class="parameter"><code>gst_audio_encoder_finish_frame</code></em>.
+</p>
+<p>
+In summary, above process should have subclass concentrating on
+codec data processing while leaving other matters to base class,
+such as most notably timestamp handling. While it may exert more control
+in this area (see e.g. <em class="parameter"><code>pre_push</code></em>), it is very much not recommended.
+</p>
+<p>
+In particular, base class will either favor tracking upstream timestamps
+(at the possible expense of jitter) or aim to arrange for a perfect stream of
+output timestamps, depending on <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--perfect-timestamp" title='The "perfect-timestamp" property'><span class="type">"perfect-timestamp"</span></a>.
+However, in the latter case, the input may not be so perfect or ideal, which
+is handled as follows. An input timestamp is compared with the expected
+timestamp as dictated by input sample stream and if the deviation is less
+than <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--tolerance" title='The "tolerance" property'><span class="type">"tolerance"</span></a>, the deviation is discarded.
+Otherwise, it is considered a discontuinity and subsequent output timestamp
+is resynced to the new position after performing configured discontinuity
+processing. In the non-perfect-timestamp case, an upstream variation
+exceeding tolerance only leads to marking DISCONT on subsequent outgoing
+(while timestamps are adjusted to upstream regardless of variation).
+While DISCONT is also marked in the perfect-timestamp case, this one
+optionally (see <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--hard-resync" title='The "hard-resync" property'><span class="type">"hard-resync"</span></a>)
+performs some additional steps, such as clipping of (early) input samples
+or draining all currently remaining input data, depending on the direction
+of the discontuinity.
+</p>
+<p>
+If perfect timestamps are arranged, it is also possible to request baseclass
+(usually set by subclass) to provide additional buffer metadata (in OFFSET
+and OFFSET_END) fields according to granule defined semantics currently
+needed by oggmux. Specifically, OFFSET is set to granulepos (= sample count
+including buffer) and OFFSET_END to corresponding timestamp (as determined
+by same sample count and sample rate).
+</p>
+<p>
+Things that subclass need to take care of:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>Provide pad templates</p></li>
+<li class="listitem"><p>
+ Set source pad caps when appropriate
+ </p></li>
+<li class="listitem"><p>
+ Inform base class of buffer processing needs using context's
+ frame_samples and frame_bytes.
+ </p></li>
+<li class="listitem"><p>
+ Set user-configurable properties to sane defaults for format and
+ implementing codec at hand, e.g. those controlling timestamp behaviour
+ and discontinuity processing.
+ </p></li>
+<li class="listitem"><p>
+ Accept data in <em class="parameter"><code>handle_frame</code></em> and provide encoded results to
+ <em class="parameter"><code>gst_audio_encoder_finish_frame</code></em>.
+ </p></li>
+</ul></div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioEncoder-struct"></a><h3>struct GstAudioEncoder</h3>
+<pre class="programlisting">struct GstAudioEncoder;</pre>
+<p>
+The opaque <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> data structure.
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioEncoderClass"></a><h3>struct GstAudioEncoderClass</h3>
+<pre class="programlisting">struct GstAudioEncoderClass {
+ GstElementClass element_class;
+
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstAudioEncoder *enc);
+
+ gboolean (*stop) (GstAudioEncoder *enc);
+
+ gboolean (*set_format) (GstAudioEncoder *enc,
+ GstAudioInfo *info);
+
+ GstFlowReturn (*handle_frame) (GstAudioEncoder *enc,
+ GstBuffer *buffer);
+
+ void (*flush) (GstAudioEncoder *enc);
+
+ GstFlowReturn (*pre_push) (GstAudioEncoder *enc,
+ GstBuffer **buffer);
+
+ gboolean (*event) (GstAudioEncoder *enc,
+ GstEvent *event);
+
+ GstCaps * (*getcaps) (GstAudioEncoder *enc, GstCaps *filter);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At minimum <em class="parameter"><code>set_format</code></em> and <em class="parameter"><code>handle_frame</code></em> needs to be overridden.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstAudioEncoderClass.element-class"></a>element_class</code></em>;</span></p></td>
+<td>The parent class structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.start"></a>start</code></em> ()</span></p></td>
+<td>Optional.
+Called when the element starts processing.
+Allows opening external resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>Optional.
+Called when the element stops processing.
+Allows closing external resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.set-format"></a>set_format</code></em> ()</span></p></td>
+<td>Notifies subclass of incoming data format.
+GstAudioInfo contains the format according to provided caps.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.handle-frame"></a>handle_frame</code></em> ()</span></p></td>
+<td>Provides input samples (or NULL to clear any remaining data)
+according to directions as configured by the subclass
+using the API. Input data ref management is performed
+by base class, subclass should not care or intervene.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.flush"></a>flush</code></em> ()</span></p></td>
+<td>Optional.
+Instructs subclass to clear any codec caches and discard
+any pending samples and not yet returned encoded data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.pre-push"></a>pre_push</code></em> ()</span></p></td>
+<td>Optional.
+Called just prior to pushing (encoded data) buffer downstream.
+Subclass has full discretionary access to buffer,
+and a not OK flow return will abort downstream pushing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.event"></a>event</code></em> ()</span></p></td>
+<td>Optional.
+Event handler on the sink pad. This function should return
+TRUE if the event was handled and should be discarded
+(i.e. not unref'ed).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioEncoderClass.getcaps"></a>getcaps</code></em> ()</span></p></td>
+<td>Optional.
+Allows for a custom sink getcaps implementation (e.g.
+for multichannel input specification). If not implemented,
+default returns gst_audio_encoder_proxy_getcaps
+applied to sink template caps.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-ENCODER-SEGMENT:CAPS"></a><h3>GST_AUDIO_ENCODER_SEGMENT()</h3>
+<pre class="programlisting">#define GST_AUDIO_ENCODER_SEGMENT(obj) (GST_AUDIO_ENCODER_CAST (obj)-&gt;segment)
+</pre>
+<p>
+Gives the segment of the element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>base parse instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-ENCODER-SINK-NAME:CAPS"></a><h3>GST_AUDIO_ENCODER_SINK_NAME</h3>
+<pre class="programlisting">#define GST_AUDIO_ENCODER_SINK_NAME "sink"
+</pre>
+<p>
+the name of the templates for the sink pad
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-ENCODER-SINK-PAD:CAPS"></a><h3>GST_AUDIO_ENCODER_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_AUDIO_ENCODER_SINK_PAD(obj) (GST_AUDIO_ENCODER_CAST (obj)-&gt;sinkpad)
+</pre>
+<p>
+Gives the pointer to the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>base parse instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-ENCODER-SRC-NAME:CAPS"></a><h3>GST_AUDIO_ENCODER_SRC_NAME</h3>
+<pre class="programlisting">#define GST_AUDIO_ENCODER_SRC_NAME "src"
+</pre>
+<p>
+the name of the templates for the source pad
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-AUDIO-ENCODER-SRC-PAD:CAPS"></a><h3>GST_AUDIO_ENCODER_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_AUDIO_ENCODER_SRC_PAD(obj) (GST_AUDIO_ENCODER_CAST (obj)-&gt;srcpad)
+</pre>
+<p>
+Gives the pointer to the source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>base parse instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-finish-frame"></a><h3>gst_audio_encoder_finish_frame ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_audio_encoder_finish_frame (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> samples</code></em>);</pre>
+<p>
+Collects encoded data and pushes encoded data downstream.
+Source pad caps must be set when this is called.
+</p>
+<p>
+If <em class="parameter"><code>samples</code></em> &lt; 0, then best estimate is all samples provided to encoder
+(subclass) so far. <em class="parameter"><code>buf</code></em> may be NULL, in which case next number of <em class="parameter"><code>samples</code></em>
+are considered discarded, e.g. as a result of discontinuous transmission,
+and a discontinuity is marked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>encoded data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>samples</code></em> :</span></p></td>
+<td>number of samples (per channel) represented by encoded data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that should be escalated to caller (of caller)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-audio-info"></a><h3>gst_audio_encoder_get_audio_info ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="returnvalue">GstAudioInfo</span></a> * gst_audio_encoder_get_audio_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> describing the input audio format</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-frame-max"></a><h3>gst_audio_encoder_get_frame_max ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_encoder_get_frame_max (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured maximum handled frames</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-frame-samples-min"></a><h3>gst_audio_encoder_get_frame_samples_min ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_encoder_get_frame_samples_min
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently maximum requested samples per frame</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-frame-samples-max"></a><h3>gst_audio_encoder_get_frame_samples_max ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_encoder_get_frame_samples_max
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-hard-resync"></a><h3>gst_audio_encoder_get_hard_resync ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_encoder_get_hard_resync (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-latency"></a><h3>gst_audio_encoder_get_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_get_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max</code></em>);</pre>
+<p>
+Sets the variables pointed to by <em class="parameter"><code>min</code></em> and <em class="parameter"><code>max</code></em> to the currently configured
+latency.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>a pointer to storage to hold minimum latency. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>a pointer to storage to hold maximum latency. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-lookahead"></a><h3>gst_audio_encoder_get_lookahead ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_audio_encoder_get_lookahead (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>currently configured encoder lookahead</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-mark-granule"></a><h3>gst_audio_encoder_get_mark_granule ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_encoder_get_mark_granule (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<p>
+Queries if the encoder will handle granule marking.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if granule marking is enabled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-perfect-timestamp"></a><h3>gst_audio_encoder_get_perfect_timestamp ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_encoder_get_perfect_timestamp
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<p>
+Queries encoder perfect timestamp behaviour.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if pefect timestamp setting enabled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-get-tolerance"></a><h3>gst_audio_encoder_get_tolerance ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> gst_audio_encoder_get_tolerance (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>);</pre>
+<p>
+Queries current audio jitter tolerance threshold.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>encoder audio jitter tolerance threshold.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-proxy-getcaps"></a><h3>gst_audio_encoder_proxy_getcaps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_audio_encoder_proxy_getcaps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Returns caps that express <em class="parameter"><code>caps</code></em> (or sink template caps if <em class="parameter"><code>caps</code></em> == NULL)
+restricted to channel/rate combinations supported by downstream elements
+(e.g. muxers).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>initial caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> owned by caller</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-frame-max"></a><h3>gst_audio_encoder_set_frame_max ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_frame_max (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);</pre>
+<p>
+Sets max number of frames accepted at once (assumed minimally 1).
+Requires <em class="parameter"><code>frame_samples_min</code></em> and <em class="parameter"><code>frame_samples_max</code></em> to be the equal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>number of frames</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-frame-samples-min"></a><h3>gst_audio_encoder_set_frame_samples_min ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_frame_samples_min
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);</pre>
+<p>
+Sets number of samples (per channel) subclass needs to be handed,
+at least or will be handed all available if 0.
+</p>
+<p>
+If an exact number of samples is required, <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-max" title="gst_audio_encoder_set_frame_samples_max ()"><code class="function">gst_audio_encoder_set_frame_samples_max()</code></a>
+must be called with the same number.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>number of samples per frame</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-frame-samples-max"></a><h3>gst_audio_encoder_set_frame_samples_max ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_frame_samples_max
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);</pre>
+<p>
+Sets number of samples (per channel) subclass needs to be handed,
+at most or will be handed all available if 0.
+</p>
+<p>
+If an exact number of samples is required, <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-min" title="gst_audio_encoder_set_frame_samples_min ()"><code class="function">gst_audio_encoder_set_frame_samples_min()</code></a>
+must be called with the same number.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>number of samples per frame</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-hard-resync"></a><h3>gst_audio_encoder_set_hard_resync ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_hard_resync (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-latency"></a><h3>gst_audio_encoder_set_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_latency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max</code></em>);</pre>
+<p>
+Sets encoder latency.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min</code></em> :</span></p></td>
+<td>minimum latency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max</code></em> :</span></p></td>
+<td>maximum latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-lookahead"></a><h3>gst_audio_encoder_set_lookahead ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_lookahead (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num</code></em>);</pre>
+<p>
+Sets encoder lookahead (in units of input rate samples)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>lookahead</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-mark-granule"></a><h3>gst_audio_encoder_set_mark_granule ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_mark_granule (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>
+Enable or disable encoder granule handling.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-perfect-timestamp"></a><h3>gst_audio_encoder_set_perfect_timestamp ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_perfect_timestamp
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>
+Enable or disable encoder perfect output timestamp preference.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-encoder-set-tolerance"></a><h3>gst_audio_encoder_set_tolerance ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_encoder_set_tolerance (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a> *enc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> tolerance</code></em>);</pre>
+<p>
+Configures encoder audio jitter tolerance threshold.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enc</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder"><span class="type">GstAudioEncoder</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tolerance</code></em> :</span></p></td>
+<td>new tolerance</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioEncoder--hard-resync"></a><h3>The <code class="literal">"hard-resync"</code> property</h3>
+<pre class="programlisting"> "hard-resync" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Perform clipping and sample flushing upon discontinuity.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioEncoder--mark-granule"></a><h3>The <code class="literal">"mark-granule"</code> property</h3>
+<pre class="programlisting"> "mark-granule" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read</pre>
+<p>Apply granule semantics to buffer metadata (implies perfect-timestamp).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioEncoder--perfect-timestamp"></a><h3>The <code class="literal">"perfect-timestamp"</code> property</h3>
+<pre class="programlisting"> "perfect-timestamp" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Favour perfect timestamps over tracking upstream timestamps.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioEncoder--tolerance"></a><h3>The <code class="literal">"tolerance"</code> property</h3>
+<pre class="programlisting"> "tolerance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Consider discontinuity if timestamp jitter/imperfection exceeds tolerance (ns).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 40000000</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioencoder.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html"><span class="type">GstBaseTransform</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudiofilter.html b/docs/libs/html/gst-plugins-base-libs-gstaudiofilter.html
new file mode 100644
index 0000000..c026875
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudiofilter.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudiofilter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudioencoder.html" title="gstaudioencoder">
+<link rel="next" href="gst-plugins-base-libs-gstaudiomixerutils.html" title="gstaudiomixerutils">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudioencoder.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudiomixerutils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudiofilter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiofilter.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiofilter.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudiofilter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudiofilter.top_of_page"></a>gstaudiofilter</span></h2>
+<p>gstaudiofilter — Base class for simple audio filters</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudiofilter.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioFilter"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudiofilter.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct" title="struct GstAudioFilter">GstAudioFilter</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" title="struct GstAudioFilterClass">GstAudioFilterClass</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#gst-audio-filter-class-add-pad-templates" title="gst_audio_filter_class_add_pad_templates ()">gst_audio_filter_class_add_pad_templates</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" title="struct GstAudioFilterClass"><span class="type">GstAudioFilterClass</span></a> *klass</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *allowed_caps</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiofilter.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstAudioFilter
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiofilter.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter"><span class="type">GstAudioFilter</span></a> is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html"><span class="type">GstBaseTransform</span></a>-derived base class for simple audio
+filters, ie. those that output the same format that they get as input.
+</p>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter"><span class="type">GstAudioFilter</span></a> will parse the input format for you (with error checking)
+before calling your setup function. Also, elements deriving from
+<a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter"><span class="type">GstAudioFilter</span></a> may use <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#gst-audio-filter-class-add-pad-templates" title="gst_audio_filter_class_add_pad_templates ()"><code class="function">gst_audio_filter_class_add_pad_templates()</code></a> from
+their class_init function to easily configure the set of caps/formats that
+the element is able to handle.
+</p>
+<p>
+Derived classes should override the <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass.setup"><code class="function">GstAudioFilterClass.setup()</code></a> and
+<code class="function">GstBaseTransformClass.transform_ip()</code> and/or
+<code class="function">GstBaseTransformClass.transform()</code>
+virtual functions in their class_init function.
+</p>
+<p>
+Last reviewed on 2007-02-03 (0.10.11.1)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiofilter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioFilter-struct"></a><h3>struct GstAudioFilter</h3>
+<pre class="programlisting">struct GstAudioFilter;</pre>
+<p>
+Base class for audio filters with the same format for input and output.
+</p>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioFilterClass"></a><h3>struct GstAudioFilterClass</h3>
+<pre class="programlisting">struct GstAudioFilterClass {
+ GstBaseTransformClass basetransformclass;
+
+ /* virtual function, called whenever the format changes */
+ gboolean (*setup) (GstAudioFilter * filter, const GstAudioInfo * info);
+};
+</pre>
+<p>
+In addition to the <em class="parameter"><code>setup</code></em> virtual function, you should also override the
+GstBaseTransform::transform and/or GstBaseTransform::transform_ip virtual
+function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html#GstBaseTransformClass"><span class="type">GstBaseTransformClass</span></a> <em class="structfield"><code><a name="GstAudioFilterClass.basetransformclass"></a>basetransformclass</code></em>;</span></p></td>
+<td>parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioFilterClass.setup"></a>setup</code></em> ()</span></p></td>
+<td>virtual function called whenever the format changes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-filter-class-add-pad-templates"></a><h3>gst_audio_filter_class_add_pad_templates ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_filter_class_add_pad_templates
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" title="struct GstAudioFilterClass"><span class="type">GstAudioFilterClass</span></a> *klass</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *allowed_caps</code></em>);</pre>
+<p>
+Convenience function to add pad templates to this element class, with
+<em class="parameter"><code>allowed_caps</code></em> as the caps that can be handled.
+</p>
+<p>
+This function is usually used from within a GObject class_init function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>klass</code></em> :</span></p></td>
+<td>an <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" title="struct GstAudioFilterClass"><span class="type">GstAudioFilterClass</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>allowed_caps</code></em> :</span></p></td>
+<td>what formats the filter can handle, as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudioiec61937.html b/docs/libs/html/gst-plugins-base-libs-gstaudioiec61937.html
new file mode 100644
index 0000000..abbf5b4
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudioiec61937.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudioiec61937</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">
+<link rel="next" href="gstreamer-cdda.html" title="CDDA Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstringbuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-cdda.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudioiec61937.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudioiec61937.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudioiec61937"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudioiec61937.top_of_page"></a>gstaudioiec61937</span></h2>
+<p>gstaudioiec61937 — Utility functions for IEC 61937 payloading</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudioiec61937.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/audio/gstaudioiec61937.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-frame-size" title="gst_audio_iec61937_frame_size ()">gst_audio_iec61937_frame_size</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-payload" title="gst_audio_iec61937_payload ()">gst_audio_iec61937_payload</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> src_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *dst</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> dst_n</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioiec61937.description"></a><h2>Description</h2>
+<p>
+This module contains some helper functions for encapsulating various
+audio formats in IEC 61937 headers and padding.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudioiec61937.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-audio-iec61937-frame-size"></a><h3>gst_audio_iec61937_frame_size ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_audio_iec61937_frame_size (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);</pre>
+<p>
+Calculated the size of the buffer expected by <a class="link" href="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-payload" title="gst_audio_iec61937_payload ()"><code class="function">gst_audio_iec61937_payload()</code></a> for
+payloading type from <em class="parameter"><code>spec</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>spec</code></em> :</span></p></td>
+<td>the ringbufer spec</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the size or 0 if the given <em class="parameter"><code>type</code></em> is not supported or cannot be
+payloaded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-iec61937-payload"></a><h3>gst_audio_iec61937_payload ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_iec61937_payload (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> src_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *dst</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> dst_n</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);</pre>
+<p>
+Payloads <em class="parameter"><code>src</code></em> in the form specified by IEC 61937 for the type from <em class="parameter"><code>spec</code></em> and
+stores the result in <em class="parameter"><code>dst</code></em>. <em class="parameter"><code>src</code></em> must contain exactly one frame of data and
+the frame is not checked for errors.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a buffer containing the data to payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_n</code></em> :</span></p></td>
+<td>size of <em class="parameter"><code>src</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dst</code></em> :</span></p></td>
+<td>the destination buffer to store the payloaded contents in. Should not
+overlap with <em class="parameter"><code>src</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dst_n</code></em> :</span></p></td>
+<td>size of <em class="parameter"><code>dst</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>spec</code></em> :</span></p></td>
+<td>the ringbufer spec for <em class="parameter"><code>src</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>transfer-full: <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the payloading was successful, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudiomixerutils.html b/docs/libs/html/gst-plugins-base-libs-gstaudiomixerutils.html
new file mode 100644
index 0000000..9c5dfb3
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudiomixerutils.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudiomixerutils</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudiofilter.html" title="gstaudiofilter">
+<link rel="next" href="gst-plugins-base-libs-gstaudiosink.html" title="gstaudiosink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudiofilter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudiosink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudiomixerutils.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiomixerutils.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudiomixerutils"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudiomixerutils.top_of_page"></a>gstaudiomixerutils</span></h2>
+<p>gstaudiomixerutils — utility functions to find available audio mixers
+ from the plugin registry</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudiomixerutils.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/audio/mixerutils.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (<a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc" title="GstAudioMixerFilterFunc ()">*GstAudioMixerFilterFunc</a>) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#gst-audio-default-registry-mixer-filter" title="gst_audio_default_registry_mixer_filter ()">gst_audio_default_registry_mixer_filter</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc" title="GstAudioMixerFilterFunc ()"><span class="type">GstAudioMixerFilterFunc</span></a> filter_func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> first</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiomixerutils.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id439560"></a><p>
+Provides some utility functions to detect available audio mixers
+on the system.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiomixerutils.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioMixerFilterFunc"></a><h3>GstAudioMixerFilterFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstAudioMixerFilterFunc) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Function that will be called by <a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#gst-audio-default-registry-mixer-filter" title="gst_audio_default_registry_mixer_filter ()"><code class="function">gst_audio_default_registry_mixer_filter()</code></a>
+so the caller can decide which mixer elements should be kept and returned.
+When the mixer element is passed to the callback function, it is opened
+and in READY state. If you decide to keep the element, you need to set it
+back to NULL state yourself (unless you want to keep it opened of course).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> implementing the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the element should be kept, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-default-registry-mixer-filter"></a><h3>gst_audio_default_registry_mixer_filter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_audio_default_registry_mixer_filter
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc" title="GstAudioMixerFilterFunc ()"><span class="type">GstAudioMixerFilterFunc</span></a> filter_func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> first</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Utility function to find audio mixer elements.
+</p>
+<p>
+Will traverse the default plugin registry in order of plugin rank and
+find usable audio mixer elements. The caller may optionally fine-tune
+the selection by specifying a filter function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter_func</code></em> :</span></p></td>
+<td>filter function, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first</code></em> :</span></p></td>
+<td>set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a> if you only want the first suitable mixer element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data to pass to the filter function</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of audio mixer <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>s. You must free each
+element in the list by setting it to NULL state and calling
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-unref"><code class="function">gst_object_unref()</code></a>. After that the list itself should be freed
+using <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-free"><code class="function">g_list_free()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.2</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudiosink.html b/docs/libs/html/gst-plugins-base-libs-gstaudiosink.html
new file mode 100644
index 0000000..b4a492b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudiosink.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudiosink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudiomixerutils.html" title="gstaudiomixerutils">
+<link rel="next" href="gst-plugins-base-libs-gstaudiosrc.html" title="gstaudiosrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudiomixerutils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudiosrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudiosink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiosink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiosink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudiosink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudiosink.top_of_page"></a>gstaudiosink</span></h2>
+<p>gstaudiosink — Simple base class for audio sinks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudiosink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioSink"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudiosink.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink-struct" title="struct GstAudioSink">GstAudioSink</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSinkClass" title="struct GstAudioSinkClass">GstAudioSinkClass</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink">GstBaseAudioSink</a>
+ +----GstAudioSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosink.description"></a><h2>Description</h2>
+<p>
+This is the most simple base class for audio sinks that only requires
+subclasses to implement a set of simple functions:
+</p>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><code class="function">open()</code></span></p></td>
+<td><p>Open the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">prepare()</code></span></p></td>
+<td><p>Configure the device with the specified format.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">write()</code></span></p></td>
+<td><p>Write samples to the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">reset()</code></span></p></td>
+<td><p>Unblock writes and flush the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">delay()</code></span></p></td>
+<td><p>Get the number of samples written but not yet played
+ by the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">unprepare()</code></span></p></td>
+<td><p>Undo operations done by prepare.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">close()</code></span></p></td>
+<td><p>Close the device.</p></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p>
+All scheduling of samples and timestamps is done in this base class
+together with <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> using a default implementation of a
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> that uses threads.
+</p>
+<p>
+Last reviewed on 2006-09-27 (0.10.12)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioSink-struct"></a><h3>struct GstAudioSink</h3>
+<pre class="programlisting">struct GstAudioSink;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink"><span class="type">GstAudioSink</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioSinkClass"></a><h3>struct GstAudioSinkClass</h3>
+<pre class="programlisting">struct GstAudioSinkClass {
+ GstBaseAudioSinkClass parent_class;
+
+ /* vtable */
+
+ /* open the device with given specs */
+ gboolean (*open) (GstAudioSink *sink);
+ /* prepare resources and state to operate with the given specs */
+ gboolean (*prepare) (GstAudioSink *sink, GstRingBufferSpec *spec);
+ /* undo anything that was done in prepare() */
+ gboolean (*unprepare) (GstAudioSink *sink);
+ /* close the device */
+ gboolean (*close) (GstAudioSink *sink);
+ /* write samples to the device */
+ gint (*write) (GstAudioSink *sink, gpointer data, guint length);
+ /* get number of samples queued in the device */
+ guint (*delay) (GstAudioSink *sink);
+ /* reset the audio device, unblock from a write */
+ void (*reset) (GstAudioSink *sink);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink"><span class="type">GstAudioSink</span></a> class. Override the vmethods to implement functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkClass" title="struct GstBaseAudioSinkClass"><span class="type">GstBaseAudioSinkClass</span></a> <em class="structfield"><code><a name="GstAudioSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.open"></a>open</code></em> ()</span></p></td>
+<td>Open the device. No configuration needs to be done at this point.
+This function is also used to check if the device is available.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.prepare"></a>prepare</code></em> ()</span></p></td>
+<td>Prepare the device to operate with the specified parameters.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.unprepare"></a>unprepare</code></em> ()</span></p></td>
+<td>Undo operations done in prepare.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.close"></a>close</code></em> ()</span></p></td>
+<td>Close the device.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.write"></a>write</code></em> ()</span></p></td>
+<td>Write data to the device.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.delay"></a>delay</code></em> ()</span></p></td>
+<td>Return how many samples are still in the device. This is used to
+drive the synchronisation.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSinkClass.reset"></a>reset</code></em> ()</span></p></td>
+<td>Returns as quickly as possible from a write and flush any pending
+samples from the device.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosink.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>, <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>, <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink"><span class="type">GstAudioSink</span></a>.
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstaudiosrc.html b/docs/libs/html/gst-plugins-base-libs-gstaudiosrc.html
new file mode 100644
index 0000000..64ba82b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstaudiosrc.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstaudiosrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudiosink.html" title="gstaudiosink">
+<link rel="next" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudiosink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstbaseaudiosink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstaudiosrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiosrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstaudiosrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstaudiosrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstaudiosrc.top_of_page"></a>gstaudiosrc</span></h2>
+<p>gstaudiosrc — Simple base class for audio sources</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstaudiosrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioSrc"></a><pre class="synopsis">
+#include &lt;gst/audio/gstaudiosrc.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc-struct" title="struct GstAudioSrc">GstAudioSrc</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrcClass" title="struct GstAudioSrcClass">GstAudioSrcClass</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc">GstBaseAudioSrc</a>
+ +----GstAudioSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosrc.description"></a><h2>Description</h2>
+<p>
+This is the most simple base class for audio sources that only requires
+subclasses to implement a set of simple functions:
+</p>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><code class="function">open()</code></span></p></td>
+<td><p>Open the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">prepare()</code></span></p></td>
+<td><p>Configure the device with the specified format.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">read()</code></span></p></td>
+<td><p>Read samples from the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">reset()</code></span></p></td>
+<td><p>Unblock reads and flush the device.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">delay()</code></span></p></td>
+<td><p>Get the number of samples in the device but not yet read.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">unprepare()</code></span></p></td>
+<td><p>Undo operations done by prepare.</p></td>
+</tr>
+<tr>
+<td><p><span class="term"><code class="function">close()</code></span></p></td>
+<td><p>Close the device.</p></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p>
+All scheduling of samples and timestamps is done in this base class
+together with <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> using a default implementation of a
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> that uses threads.
+</p>
+<p>
+Last reviewed on 2006-09-27 (0.10.12)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioSrc-struct"></a><h3>struct GstAudioSrc</h3>
+<pre class="programlisting">struct GstAudioSrc;</pre>
+<p>
+Base class for simple audio sources.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioSrcClass"></a><h3>struct GstAudioSrcClass</h3>
+<pre class="programlisting">struct GstAudioSrcClass {
+ GstBaseAudioSrcClass parent_class;
+
+ /* vtable */
+
+ /* open the device with given specs */
+ gboolean (*open) (GstAudioSrc *src);
+ /* prepare resources and state to operate with the given specs */
+ gboolean (*prepare) (GstAudioSrc *src, GstRingBufferSpec *spec);
+ /* undo anything that was done in prepare() */
+ gboolean (*unprepare) (GstAudioSrc *src);
+ /* close the device */
+ gboolean (*close) (GstAudioSrc *src);
+ /* read samples from the device */
+ guint (*read) (GstAudioSrc *src, gpointer data, guint length);
+ /* get number of samples queued in the device */
+ guint (*delay) (GstAudioSrc *src);
+ /* reset the audio device, unblock from a write */
+ void (*reset) (GstAudioSrc *src);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc"><span class="type">GstAudioSrc</span></a> class. Override the vmethod to implement
+functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcClass" title="struct GstBaseAudioSrcClass"><span class="type">GstBaseAudioSrcClass</span></a> <em class="structfield"><code><a name="GstAudioSrcClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.open"></a>open</code></em> ()</span></p></td>
+<td>open the device with the specified caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.prepare"></a>prepare</code></em> ()</span></p></td>
+<td>configure device with format</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.unprepare"></a>unprepare</code></em> ()</span></p></td>
+<td>undo the configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.close"></a>close</code></em> ()</span></p></td>
+<td>close the device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.read"></a>read</code></em> ()</span></p></td>
+<td>read samples to the audio device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.delay"></a>delay</code></em> ()</span></p></td>
+<td>the number of samples queued in the device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstAudioSrcClass.reset"></a>reset</code></em> ()</span></p></td>
+<td>unblock a read to the device and reset.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstaudiosrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>, <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>, <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc"><span class="type">GstAudioSrc</span></a>.
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosink.html b/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosink.html
new file mode 100644
index 0000000..62c4501
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosink.html
@@ -0,0 +1,458 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstbaseaudiosink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstaudiosrc.html" title="gstaudiosrc">
+<link rel="next" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudiosrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstbaseaudiosrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstbaseaudiosink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstbaseaudiosink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstbaseaudiosink.top_of_page"></a>gstbaseaudiosink</span></h2>
+<p>gstbaseaudiosink — Base class for audio sinks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstBaseAudioSink"></a><pre class="synopsis">
+#include &lt;gst/audio/gstbaseaudiosink.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink-struct" title="struct GstBaseAudioSink">GstBaseAudioSink</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkClass" title="struct GstBaseAudioSinkClass">GstBaseAudioSinkClass</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod">GstBaseAudioSinkSlaveMethod</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-CLOCK:CAPS" title="GST_BASE_AUDIO_SINK_CLOCK()">GST_BASE_AUDIO_SINK_CLOCK</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-PAD:CAPS" title="GST_BASE_AUDIO_SINK_PAD()">GST_BASE_AUDIO_SINK_PAD</a> (obj)
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="returnvalue">GstRingBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-create-ringbuffer" title="gst_base_audio_sink_create_ringbuffer ()">gst_base_audio_sink_create_ringbuffer</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-provide-clock" title="gst_base_audio_sink_set_provide_clock ()">gst_base_audio_sink_set_provide_clock</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> provide</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-provide-clock" title="gst_base_audio_sink_get_provide_clock ()">gst_base_audio_sink_get_provide_clock</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-slave-method" title="gst_base_audio_sink_set_slave_method ()">gst_base_audio_sink_set_slave_method</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="type">GstBaseAudioSinkSlaveMethod</span></a> method</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="returnvalue">GstBaseAudioSinkSlaveMethod</span></a> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-slave-method" title="gst_base_audio_sink_get_slave_method ()">gst_base_audio_sink_get_slave_method</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-drift-tolerance" title="gst_base_audio_sink_get_drift_tolerance ()">gst_base_audio_sink_get_drift_tolerance</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-drift-tolerance" title="gst_base_audio_sink_set_drift_tolerance ()">gst_base_audio_sink_set_drift_tolerance</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> drift_tolerance</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstBaseAudioSink
+ +----<a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink">GstAudioSink</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--buffer-time" title='The "buffer-time" property'>buffer-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--can-activate-pull" title='The "can-activate-pull" property'>can-activate-pull</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--drift-tolerance" title='The "drift-tolerance" property'>drift-tolerance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--latency-time" title='The "latency-time" property'>latency-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--provide-clock" title='The "provide-clock" property'>provide-clock</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--slave-method" title='The "slave-method" property'>slave-method</a>" <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="type">GstBaseAudioSinkSlaveMethod</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.description"></a><h2>Description</h2>
+<p>
+This is the base class for audio sinks. Subclasses need to implement the
+::create_ringbuffer vmethod. This base class will then take care of
+writing samples to the ringbuffer, synchronisation, clipping and flushing.
+</p>
+<p>
+Last reviewed on 2006-09-27 (0.10.12)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseAudioSink-struct"></a><h3>struct GstBaseAudioSink</h3>
+<pre class="programlisting">struct GstBaseAudioSink;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSinkClass"></a><h3>struct GstBaseAudioSinkClass</h3>
+<pre class="programlisting">struct GstBaseAudioSinkClass {
+ GstBaseSinkClass parent_class;
+
+ /* subclass ringbuffer allocation */
+ GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSink *sink);
+
+ /* subclass payloader */
+ GstBuffer* (*payload) (GstBaseAudioSink *sink,
+ GstBuffer *buffer);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> class. Override the vmethod to implement
+functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html#GstBaseSinkClass"><span class="type">GstBaseSinkClass</span></a> <em class="structfield"><code><a name="GstBaseAudioSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseAudioSinkClass.create-ringbuffer"></a>create_ringbuffer</code></em> ()</span></p></td>
+<td>create and return a <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to write to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseAudioSinkClass.payload"></a>payload</code></em> ()</span></p></td>
+<td>payload data in a format suitable to write to the sink. If no
+payloading is required, returns a reffed copy of the original
+buffer, else returns the payloaded buffer with all other metadata
+copied. (Since: 0.10.35)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSinkSlaveMethod"></a><h3>enum GstBaseAudioSinkSlaveMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE,
+ GST_BASE_AUDIO_SINK_SLAVE_SKEW,
+ GST_BASE_AUDIO_SINK_SLAVE_NONE
+} GstBaseAudioSinkSlaveMethod;
+</pre>
+<p>
+Different possible clock slaving algorithms used when the internal audio
+clock is not selected as the pipeline master clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SINK-SLAVE-RESAMPLE:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE</code></span></p></td>
+<td>Resample to match the master clock
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SINK-SLAVE-SKEW:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SINK_SLAVE_SKEW</code></span></p></td>
+<td>Adjust playout pointer when master clock
+drifts too much.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SINK-SLAVE-NONE:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SINK_SLAVE_NONE</code></span></p></td>
+<td>No adjustment is done.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-AUDIO-SINK-CLOCK:CAPS"></a><h3>GST_BASE_AUDIO_SINK_CLOCK()</h3>
+<pre class="programlisting">#define GST_BASE_AUDIO_SINK_CLOCK(obj) (GST_BASE_AUDIO_SINK (obj)-&gt;clock)
+</pre>
+<p>
+Get the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> of <em class="parameter"><code>obj</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-AUDIO-SINK-PAD:CAPS"></a><h3>GST_BASE_AUDIO_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_AUDIO_SINK_PAD(obj) (GST_BASE_SINK (obj)-&gt;sinkpad)
+</pre>
+<p>
+Get the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> of <em class="parameter"><code>obj</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-create-ringbuffer"></a><h3>gst_base_audio_sink_create_ringbuffer ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="returnvalue">GstRingBuffer</span></a> * gst_base_audio_sink_create_ringbuffer
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);</pre>
+<p>
+Create and return the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> for <em class="parameter"><code>sink</code></em>. This function will call the
+::create_ringbuffer vmethod and will set <em class="parameter"><code>sink</code></em> as the parent of the returned
+buffer (see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-set-parent"><code class="function">gst_object_set_parent()</code></a>).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new ringbuffer of <em class="parameter"><code>sink</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-set-provide-clock"></a><h3>gst_base_audio_sink_set_provide_clock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_audio_sink_set_provide_clock
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> provide</code></em>);</pre>
+<p>
+Controls whether <em class="parameter"><code>sink</code></em> will provide a clock or not. If <em class="parameter"><code>provide</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-provide-clock"><code class="function">gst_element_provide_clock()</code></a> will return a clock that reflects the datarate
+of <em class="parameter"><code>sink</code></em>. If <em class="parameter"><code>provide</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-provide-clock"><code class="function">gst_element_provide_clock()</code></a> will return NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>provide</code></em> :</span></p></td>
+<td>new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-get-provide-clock"></a><h3>gst_base_audio_sink_get_provide_clock ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_audio_sink_get_provide_clock
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);</pre>
+<p>
+Queries whether <em class="parameter"><code>sink</code></em> will provide a clock or not. See also
+gst_base_audio_sink_set_provide_clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>sink</code></em> will provide a clock.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-set-slave-method"></a><h3>gst_base_audio_sink_set_slave_method ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_audio_sink_set_slave_method
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="type">GstBaseAudioSinkSlaveMethod</span></a> method</code></em>);</pre>
+<p>
+Controls how clock slaving will be performed in <em class="parameter"><code>sink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>the new slave method</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-get-slave-method"></a><h3>gst_base_audio_sink_get_slave_method ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="returnvalue">GstBaseAudioSinkSlaveMethod</span></a> gst_base_audio_sink_get_slave_method
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the current slave method used by <em class="parameter"><code>sink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current slave method used by <em class="parameter"><code>sink</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-get-drift-tolerance"></a><h3>gst_base_audio_sink_get_drift_tolerance ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> gst_base_audio_sink_get_drift_tolerance
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the current drift tolerance, in microseconds, used by <em class="parameter"><code>sink</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current drift tolerance used by <em class="parameter"><code>sink</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-sink-set-drift-tolerance"></a><h3>gst_base_audio_sink_set_drift_tolerance ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_audio_sink_set_drift_tolerance
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> drift_tolerance</code></em>);</pre>
+<p>
+Controls the sink's drift tolerance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>drift_tolerance</code></em> :</span></p></td>
+<td>the new drift tolerance in microseconds</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseAudioSink--buffer-time"></a><h3>The <code class="literal">"buffer-time"</code> property</h3>
+<pre class="programlisting"> "buffer-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Size of audio buffer in microseconds.</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 200000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSink--can-activate-pull"></a><h3>The <code class="literal">"can-activate-pull"</code> property</h3>
+<pre class="programlisting"> "can-activate-pull" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Allow pull-based scheduling.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSink--drift-tolerance"></a><h3>The <code class="literal">"drift-tolerance"</code> property</h3>
+<pre class="programlisting"> "drift-tolerance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>
+Controls the amount of time in milliseconds that timestamps or clocks are allowed
+to drift before resynchronisation happens.
+</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 40000</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSink--latency-time"></a><h3>The <code class="literal">"latency-time"</code> property</h3>
+<pre class="programlisting"> "latency-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Audio latency in microseconds.</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 10000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSink--provide-clock"></a><h3>The <code class="literal">"provide-clock"</code> property</h3>
+<pre class="programlisting"> "provide-clock" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Provide a clock to be used as the global pipeline clock.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSink--slave-method"></a><h3>The <code class="literal">"slave-method"</code> property</h3>
+<pre class="programlisting"> "slave-method" <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod" title="enum GstBaseAudioSinkSlaveMethod"><span class="type">GstBaseAudioSinkSlaveMethod</span></a> : Read / Write</pre>
+<p>Algorithm to use to match the rate of the masterclock.</p>
+<p>Default value: GST_BASE_AUDIO_SINK_SLAVE_SKEW</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosink.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink"><span class="type">GstAudioSink</span></a>, <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>.
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosrc.html b/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosrc.html
new file mode 100644
index 0000000..c36288b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstbaseaudiosrc.html
@@ -0,0 +1,402 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstbaseaudiosrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstbaseaudiosink.html" title="gstbaseaudiosink">
+<link rel="next" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstbaseaudiosink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstmultichannel.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstbaseaudiosrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbaseaudiosrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstbaseaudiosrc.top_of_page"></a>gstbaseaudiosrc</span></h2>
+<p>gstbaseaudiosrc — Base class for audio sources</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstBaseAudioSrc"></a><pre class="synopsis">
+#include &lt;gst/audio/gstbaseaudiosrc.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc-struct" title="struct GstBaseAudioSrc">GstBaseAudioSrc</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcClass" title="struct GstBaseAudioSrcClass">GstBaseAudioSrcClass</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod">GstBaseAudioSrcSlaveMethod</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-CLOCK:CAPS" title="GST_BASE_AUDIO_SRC_CLOCK()">GST_BASE_AUDIO_SRC_CLOCK</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-PAD:CAPS" title="GST_BASE_AUDIO_SRC_PAD()">GST_BASE_AUDIO_SRC_PAD</a> (obj)
+<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="returnvalue">GstRingBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-create-ringbuffer" title="gst_base_audio_src_create_ringbuffer ()">gst_base_audio_src_create_ringbuffer</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-provide-clock" title="gst_base_audio_src_set_provide_clock ()">gst_base_audio_src_set_provide_clock</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> provide</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-provide-clock" title="gst_base_audio_src_get_provide_clock ()">gst_base_audio_src_get_provide_clock</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="returnvalue">GstBaseAudioSrcSlaveMethod</span></a> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-slave-method" title="gst_base_audio_src_get_slave_method ()">gst_base_audio_src_get_slave_method</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-slave-method" title="gst_base_audio_src_set_slave_method ()">gst_base_audio_src_set_slave_method</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="type">GstBaseAudioSrcSlaveMethod</span></a> method</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----GstBaseAudioSrc
+ +----<a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc">GstAudioSrc</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-buffer-time" title='The "actual-buffer-time" property'>actual-buffer-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-latency-time" title='The "actual-latency-time" property'>actual-latency-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--buffer-time" title='The "buffer-time" property'>buffer-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--latency-time" title='The "latency-time" property'>latency-time</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--provide-clock" title='The "provide-clock" property'>provide-clock</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--slave-method" title='The "slave-method" property'>slave-method</a>" <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="type">GstBaseAudioSrcSlaveMethod</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.description"></a><h2>Description</h2>
+<p>
+This is the base class for audio sources. Subclasses need to implement the
+::create_ringbuffer vmethod. This base class will then take care of
+reading samples from the ringbuffer, synchronisation and flushing.
+</p>
+<p>
+Last reviewed on 2006-09-27 (0.10.12)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseAudioSrc-struct"></a><h3>struct GstBaseAudioSrc</h3>
+<pre class="programlisting">struct GstBaseAudioSrc;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrcClass"></a><h3>struct GstBaseAudioSrcClass</h3>
+<pre class="programlisting">struct GstBaseAudioSrcClass {
+ GstPushSrcClass parent_class;
+
+ /* subclass ringbuffer allocation */
+ GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSrc *src);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> class. Override the vmethod to implement
+functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><span class="type">GstPushSrcClass</span> <em class="structfield"><code><a name="GstBaseAudioSrcClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseAudioSrcClass.create-ringbuffer"></a>create_ringbuffer</code></em> ()</span></p></td>
+<td>create and return a <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to read from.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrcSlaveMethod"></a><h3>enum GstBaseAudioSrcSlaveMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE,
+ GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP,
+ GST_BASE_AUDIO_SRC_SLAVE_SKEW,
+ GST_BASE_AUDIO_SRC_SLAVE_NONE
+} GstBaseAudioSrcSlaveMethod;
+</pre>
+<p>
+Different possible clock slaving algorithms when the internal audio clock was
+not selected as the pipeline clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SRC-SLAVE-RESAMPLE:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE</code></span></p></td>
+<td>Resample to match the master clock.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SRC-SLAVE-RETIMESTAMP:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP</code></span></p></td>
+<td>Retimestamp output buffers with master
+clock time.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SRC-SLAVE-SKEW:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SRC_SLAVE_SKEW</code></span></p></td>
+<td>Adjust capture pointer when master clock
+drifts too much.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-AUDIO-SRC-SLAVE-NONE:CAPS"></a><span class="term"><code class="literal">GST_BASE_AUDIO_SRC_SLAVE_NONE</code></span></p></td>
+<td>No adjustment is done.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-AUDIO-SRC-CLOCK:CAPS"></a><h3>GST_BASE_AUDIO_SRC_CLOCK()</h3>
+<pre class="programlisting">#define GST_BASE_AUDIO_SRC_CLOCK(obj) (GST_BASE_AUDIO_SRC (obj)-&gt;clock)
+</pre>
+<p>
+Get the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> of <em class="parameter"><code>obj</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-AUDIO-SRC-PAD:CAPS"></a><h3>GST_BASE_AUDIO_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_AUDIO_SRC_PAD(obj) (GST_BASE_SRC (obj)-&gt;srcpad)
+</pre>
+<p>
+Get the source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> of <em class="parameter"><code>obj</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-src-create-ringbuffer"></a><h3>gst_base_audio_src_create_ringbuffer ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="returnvalue">GstRingBuffer</span></a> * gst_base_audio_src_create_ringbuffer
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);</pre>
+<p>
+Create and return the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> for <em class="parameter"><code>src</code></em>. This function will call the
+::create_ringbuffer vmethod and will set <em class="parameter"><code>src</code></em> as the parent of the returned
+buffer (see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-set-parent"><code class="function">gst_object_set_parent()</code></a>).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new ringbuffer of <em class="parameter"><code>src</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-src-set-provide-clock"></a><h3>gst_base_audio_src_set_provide_clock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_audio_src_set_provide_clock
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> provide</code></em>);</pre>
+<p>
+Controls whether <em class="parameter"><code>src</code></em> will provide a clock or not. If <em class="parameter"><code>provide</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-provide-clock"><code class="function">gst_element_provide_clock()</code></a> will return a clock that reflects the datarate
+of <em class="parameter"><code>src</code></em>. If <em class="parameter"><code>provide</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-provide-clock"><code class="function">gst_element_provide_clock()</code></a> will return NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>provide</code></em> :</span></p></td>
+<td>new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-src-get-provide-clock"></a><h3>gst_base_audio_src_get_provide_clock ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_audio_src_get_provide_clock
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);</pre>
+<p>
+Queries whether <em class="parameter"><code>src</code></em> will provide a clock or not. See also
+gst_base_audio_src_set_provide_clock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>src</code></em> will provide a clock.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-src-get-slave-method"></a><h3>gst_base_audio_src_get_slave_method ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="returnvalue">GstBaseAudioSrcSlaveMethod</span></a> gst_base_audio_src_get_slave_method
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>);</pre>
+<p>
+Get the current slave method used by <em class="parameter"><code>src</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current slave method used by <em class="parameter"><code>src</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-audio-src-set-slave-method"></a><h3>gst_base_audio_src_set_slave_method ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_audio_src_set_slave_method (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="type">GstBaseAudioSrcSlaveMethod</span></a> method</code></em>);</pre>
+<p>
+Controls how clock slaving will be performed in <em class="parameter"><code>src</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc"><span class="type">GstBaseAudioSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>the new slave method</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--actual-buffer-time"></a><h3>The <code class="literal">"actual-buffer-time"</code> property</h3>
+<pre class="programlisting"> "actual-buffer-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read</pre>
+<p>
+Actual configured size of audio buffer in microseconds.
+</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--actual-latency-time"></a><h3>The <code class="literal">"actual-latency-time"</code> property</h3>
+<pre class="programlisting"> "actual-latency-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read</pre>
+<p>
+Actual configured audio latency in microseconds.
+</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--buffer-time"></a><h3>The <code class="literal">"buffer-time"</code> property</h3>
+<pre class="programlisting"> "buffer-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Size of audio buffer in microseconds.</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 200000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--latency-time"></a><h3>The <code class="literal">"latency-time"</code> property</h3>
+<pre class="programlisting"> "latency-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Audio latency in microseconds.</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 10000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--provide-clock"></a><h3>The <code class="literal">"provide-clock"</code> property</h3>
+<pre class="programlisting"> "provide-clock" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Provide a clock to be used as the global pipeline clock.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseAudioSrc--slave-method"></a><h3>The <code class="literal">"slave-method"</code> property</h3>
+<pre class="programlisting"> "slave-method" <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod" title="enum GstBaseAudioSrcSlaveMethod"><span class="type">GstBaseAudioSrcSlaveMethod</span></a> : Read / Write</pre>
+<p>Algorithm to use to match the rate of the masterclock.</p>
+<p>Default value: GST_BASE_AUDIO_SRC_SLAVE_SKEW</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbaseaudiosrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc"><span class="type">GstAudioSrc</span></a>, <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>.
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstbasertpaudiopayload.html b/docs/libs/html/gst-plugins-base-libs-gstbasertpaudiopayload.html
new file mode 100644
index 0000000..52703fc
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstbasertpaudiopayload.html
@@ -0,0 +1,386 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstbasertpaudiopayload</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="next" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-rtp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstbasertpdepayload.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstbasertpaudiopayload.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertpaudiopayload.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertpaudiopayload.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertpaudiopayload.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstbasertpaudiopayload.top_of_page"></a>gstbasertpaudiopayload</span></h2>
+<p>gstbasertpaudiopayload — Base class for audio RTP payloader</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.synopsis"></a><h2>Synopsis</h2>
+<a name="GstBaseRTPAudioPayload"></a><pre class="synopsis">
+#include &lt;gst/rtp/gstbasertpaudiopayload.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload-struct" title="struct GstBaseRTPAudioPayload">GstBaseRTPAudioPayload</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayloadClass" title="struct GstBaseRTPAudioPayloadClass">GstBaseRTPAudioPayloadClass</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-based" title="gst_base_rtp_audio_payload_set_frame_based ()">gst_base_rtp_audio_payload_set_frame_based</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-options" title="gst_base_rtp_audio_payload_set_frame_options ()">gst_base_rtp_audio_payload_set_frame_options</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frame_duration</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frame_size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-based" title="gst_base_rtp_audio_payload_set_sample_based ()">gst_base_rtp_audio_payload_set_sample_based</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-options" title="gst_base_rtp_audio_payload_set_sample_options ()">gst_base_rtp_audio_payload_set_sample_options</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sample_size</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html"><span class="returnvalue">GstAdapter</span></a> * <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-get-adapter" title="gst_base_rtp_audio_payload_get_adapter ()">gst_base_rtp_audio_payload_get_adapter</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-push" title="gst_base_rtp_audio_payload_push ()">gst_base_rtp_audio_payload_push</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *baseaudiopayload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-flush" title="gst_base_rtp_audio_payload_flush ()">gst_base_rtp_audio_payload_flush</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *baseaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-samplebits-options" title="gst_base_rtp_audio_payload_set_samplebits_options ()">gst_base_rtp_audio_payload_set_samplebits_options</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sample_size</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload">GstBaseRTPPayload</a>
+ +----GstBaseRTPAudioPayload
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload--buffer-list" title='The "buffer-list" property'>buffer-list</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.description"></a><h2>Description</h2>
+<p>
+Provides a base class for audio RTP payloaders for frame or sample based
+audio codecs (constant bitrate)
+</p>
+<p>
+This class derives from GstBaseRTPPayload. It can be used for payloading
+audio codecs. It will only work with constant bitrate codecs. It supports
+both frame based and sample based codecs. It takes care of packing up the
+audio data into RTP packets and filling up the headers accordingly. The
+payloading is done based on the maximum MTU (mtu) and the maximum time per
+packet (max-ptime). The general idea is to divide large data buffers into
+smaller RTP packets. The RTP packet size is the minimum of either the MTU,
+max-ptime (if set) or available data. The RTP packet size is always larger or
+equal to min-ptime (if set). If min-ptime is not set, any residual data is
+sent in a last RTP packet. In the case of frame based codecs, the resulting
+RTP packets always contain full frames.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id529590"></a><h3>Usage</h3>
+<p>
+To use this base class, your child element needs to call either
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-based" title="gst_base_rtp_audio_payload_set_frame_based ()"><code class="function">gst_base_rtp_audio_payload_set_frame_based()</code></a> or
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-based" title="gst_base_rtp_audio_payload_set_sample_based ()"><code class="function">gst_base_rtp_audio_payload_set_sample_based()</code></a>. This is usually done in the
+element's <code class="function">_init()</code> function. Then, the child element must call either
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-options" title="gst_base_rtp_audio_payload_set_frame_options ()"><code class="function">gst_base_rtp_audio_payload_set_frame_options()</code></a>,
+<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-options" title="gst_base_rtp_audio_payload_set_sample_options ()"><code class="function">gst_base_rtp_audio_payload_set_sample_options()</code></a> or
+gst_base_rtp_audio_payload_set_samplebits_options. Since
+GstBaseRTPAudioPayload derives from GstBaseRTPPayload, the child element
+must set any variables or call/override any functions required by that base
+class. The child element does not need to override any other functions
+specific to GstBaseRTPAudioPayload.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseRTPAudioPayload-struct"></a><h3>struct GstBaseRTPAudioPayload</h3>
+<pre class="programlisting">struct GstBaseRTPAudioPayload;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPAudioPayloadClass"></a><h3>struct GstBaseRTPAudioPayloadClass</h3>
+<pre class="programlisting">struct GstBaseRTPAudioPayloadClass {
+ GstBaseRTPPayloadClass parent_class;
+};
+</pre>
+<p>
+Base class for audio RTP payloader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayloadClass" title="struct GstBaseRTPPayloadClass"><span class="type">GstBaseRTPPayloadClass</span></a> <em class="structfield"><code><a name="GstBaseRTPAudioPayloadClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-set-frame-based"></a><h3>gst_base_rtp_audio_payload_set_frame_based ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_rtp_audio_payload_set_frame_based
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);</pre>
+<p>
+Tells <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> that the child element is for a frame based
+audio codec
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a pointer to the element.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-set-frame-options"></a><h3>gst_base_rtp_audio_payload_set_frame_options ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_rtp_audio_payload_set_frame_options
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frame_duration</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> frame_size</code></em>);</pre>
+<p>
+Sets the options for frame based audio codecs.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a pointer to the element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frame_duration</code></em> :</span></p></td>
+<td>The duraction of an audio frame in milliseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frame_size</code></em> :</span></p></td>
+<td>The size of an audio frame in bytes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-set-sample-based"></a><h3>gst_base_rtp_audio_payload_set_sample_based ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_rtp_audio_payload_set_sample_based
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);</pre>
+<p>
+Tells <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> that the child element is for a sample based
+audio codec
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a pointer to the element.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-set-sample-options"></a><h3>gst_base_rtp_audio_payload_set_sample_options ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_rtp_audio_payload_set_sample_options
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sample_size</code></em>);</pre>
+<p>
+Sets the options for sample based audio codecs.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a pointer to the element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample_size</code></em> :</span></p></td>
+<td>Size per sample in bytes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-get-adapter"></a><h3>gst_base_rtp_audio_payload_get_adapter ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html"><span class="returnvalue">GstAdapter</span></a> * gst_base_rtp_audio_payload_get_adapter
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>);</pre>
+<p>
+Gets the internal adapter used by the depayloader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html"><span class="type">GstAdapter</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-push"></a><h3>gst_base_rtp_audio_payload_push ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_rtp_audio_payload_push (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *baseaudiopayload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Create an RTP buffer and store <em class="parameter"><code>payload_len</code></em> bytes of <em class="parameter"><code>data</code></em> as the
+payload. Set the timestamp on the new buffer to <em class="parameter"><code>timestamp</code></em> before pushing
+the buffer downstream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>baseaudiopayload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data to set as payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_len</code></em> :</span></p></td>
+<td>length of payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-flush"></a><h3>gst_base_rtp_audio_payload_flush ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_rtp_audio_payload_flush (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *baseaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Create an RTP buffer and store <em class="parameter"><code>payload_len</code></em> bytes of the adapter as the
+payload. Set the timestamp on the new buffer to <em class="parameter"><code>timestamp</code></em> before pushing
+the buffer downstream.
+</p>
+<p>
+If <em class="parameter"><code>payload_len</code></em> is -1, all pending bytes will be flushed. If <em class="parameter"><code>timestamp</code></em> is
+-1, the timestamp will be calculated automatically.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>baseaudiopayload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_len</code></em> :</span></p></td>
+<td>length of payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-audio-payload-set-samplebits-options"></a><h3>gst_base_rtp_audio_payload_set_samplebits_options ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_rtp_audio_payload_set_samplebits_options
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload"><span class="type">GstBaseRTPAudioPayload</span></a> *basertpaudiopayload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sample_size</code></em>);</pre>
+<p>
+Sets the options for sample based audio codecs.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>basertpaudiopayload</code></em> :</span></p></td>
+<td>a pointer to the element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample_size</code></em> :</span></p></td>
+<td>Size per sample in bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpaudiopayload.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseRTPAudioPayload--buffer-list"></a><h3>The <code class="literal">"buffer-list"</code> property</h3>
+<pre class="programlisting"> "buffer-list" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Use Buffer Lists.</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstbasertpdepayload.html b/docs/libs/html/gst-plugins-base-libs-gstbasertpdepayload.html
new file mode 100644
index 0000000..51dad49
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstbasertpdepayload.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstbasertpdepayload</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">
+<link rel="next" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstbasertpaudiopayload.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstbasertppayload.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstbasertpdepayload.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertpdepayload.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertpdepayload.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstbasertpdepayload"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstbasertpdepayload.top_of_page"></a>gstbasertpdepayload</span></h2>
+<p>gstbasertpdepayload — Base class for RTP depayloader</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstbasertpdepayload.synopsis"></a><h2>Synopsis</h2>
+<a name="GstBaseRTPDepayload"></a><pre class="synopsis">
+#include &lt;gst/rtp/gstbasertpdepayload.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload-struct" title="struct GstBaseRTPDepayload">GstBaseRTPDepayload</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayloadClass" title="struct GstBaseRTPDepayloadClass">GstBaseRTPDepayloadClass</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS" title="GST_BASE_RTP_DEPAYLOAD_SINKPAD()">GST_BASE_RTP_DEPAYLOAD_SINKPAD</a> (depayload)
+#define <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS" title="GST_BASE_RTP_DEPAYLOAD_SRCPAD()">GST_BASE_RTP_DEPAYLOAD_SRCPAD</a> (depayload)
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push" title="gst_base_rtp_depayload_push ()">gst_base_rtp_depayload_push</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *out_buf</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-ts" title="gst_base_rtp_depayload_push_ts ()">gst_base_rtp_depayload_push_ts</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *out_buf</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-list" title="gst_base_rtp_depayload_push_list ()">gst_base_rtp_depayload_push_list</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a> *out_list</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpdepayload.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstBaseRTPDepayload
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpdepayload.description"></a><h2>Description</h2>
+<p>
+Provides a base class for RTP depayloaders
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertpdepayload.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseRTPDepayload-struct"></a><h3>struct GstBaseRTPDepayload</h3>
+<pre class="programlisting">struct GstBaseRTPDepayload;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPDepayloadClass"></a><h3>struct GstBaseRTPDepayloadClass</h3>
+<pre class="programlisting">struct GstBaseRTPDepayloadClass {
+ GstElementClass parent_class;
+
+ /* virtuals, inform the subclass of the caps. */
+ gboolean (*set_caps) (GstBaseRTPDepayload *filter, GstCaps *caps);
+
+ /* pure virtual function, child must use this to process incoming
+ * rtp packets. If the child returns a buffer without a valid timestamp,
+ * the timestamp of @in will be applied to the result buffer and the
+ * buffer will be pushed. If this function returns %NULL, nothing is
+ * pushed. */
+ GstBuffer * (*process) (GstBaseRTPDepayload *base, GstBuffer *in);
+
+ /* non-pure function used to convert from RTP timestamp to GST timestamp
+ * this function is used by the child class before gst_pad_pushing */
+ void (*set_gst_timestamp) (GstBaseRTPDepayload *filter, guint32 timestamp, GstBuffer *buf);
+
+ /* non-pure function used to to signal the depayloader about packet loss. the
+ * timestamp and duration are the estimated values of the lost packet.
+ * The default implementation of this message pushes a segment update. */
+ gboolean (*packet_lost) (GstBaseRTPDepayload *filter, GstEvent *event);
+
+ /* the default implementation does the default actions for events but
+ * implementation can override.
+ * Since: 0.10.32 */
+ gboolean (*handle_event) (GstBaseRTPDepayload * filter, GstEvent * event);
+};
+</pre>
+<p>
+Base class for audio RTP payloader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseRTPDepayloadClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPDepayloadClass.set-caps"></a>set_caps</code></em> ()</span></p></td>
+<td>configure the depayloader</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPDepayloadClass.process"></a>process</code></em> ()</span></p></td>
+<td>process incoming rtp packets</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPDepayloadClass.set-gst-timestamp"></a>set_gst_timestamp</code></em> ()</span></p></td>
+<td>convert from RTP timestamp to GST timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPDepayloadClass.packet-lost"></a>packet_lost</code></em> ()</span></p></td>
+<td>signal the depayloader about packet loss</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPDepayloadClass.handle-event"></a>handle_event</code></em> ()</span></p></td>
+<td>custom event handling</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS"></a><h3>GST_BASE_RTP_DEPAYLOAD_SINKPAD()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_DEPAYLOAD_SINKPAD(depayload) (GST_BASE_RTP_DEPAYLOAD (depayload)-&gt;sinkpad)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS"></a><h3>GST_BASE_RTP_DEPAYLOAD_SRCPAD()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_DEPAYLOAD_SRCPAD(depayload) (GST_BASE_RTP_DEPAYLOAD (depayload)-&gt;srcpad)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-depayload-push"></a><h3>gst_base_rtp_depayload_push ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_rtp_depayload_push (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *out_buf</code></em>);</pre>
+<p>
+Push <em class="parameter"><code>out_buf</code></em> to the peer of <em class="parameter"><code>filter</code></em>. This function takes ownership of
+<em class="parameter"><code>out_buf</code></em>.
+</p>
+<p>
+Unlike <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-ts" title="gst_base_rtp_depayload_push_ts ()"><code class="function">gst_base_rtp_depayload_push_ts()</code></a>, this function will not apply
+any timestamp on the outgoing buffer. Subclasses should therefore timestamp
+outgoing buffers themselves.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>out_buf</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-depayload-push-ts"></a><h3>gst_base_rtp_depayload_push_ts ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_rtp_depayload_push_ts (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *out_buf</code></em>);</pre>
+<p>
+Push <em class="parameter"><code>out_buf</code></em> to the peer of <em class="parameter"><code>filter</code></em>. This function takes ownership of
+<em class="parameter"><code>out_buf</code></em>.
+</p>
+<p>
+Unlike <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push" title="gst_base_rtp_depayload_push ()"><code class="function">gst_base_rtp_depayload_push()</code></a>, this function will by default apply
+the last incomming timestamp on the outgoing buffer when it didn't have a
+timestamp already. The set_get_timestamp vmethod can be overwritten to change
+this behaviour (and take, for example, <em class="parameter"><code>timestamp</code></em> into account).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>an RTP timestamp to apply</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>out_buf</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-rtp-depayload-push-list"></a><h3>gst_base_rtp_depayload_push_list ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_rtp_depayload_push_list (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a> *filter</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a> *out_list</code></em>);</pre>
+<p>
+Push <em class="parameter"><code>out_list</code></em> to the peer of <em class="parameter"><code>filter</code></em>. This function takes ownership of
+<em class="parameter"><code>out_list</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>out_list</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstbasertppayload.html b/docs/libs/html/gst-plugins-base-libs-gstbasertppayload.html
new file mode 100644
index 0000000..2c3acb0
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstbasertppayload.html
@@ -0,0 +1,494 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstbasertppayload</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstbasertpdepayload.html" title="gstbasertpdepayload">
+<link rel="next" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstbasertpdepayload.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtpbuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstbasertppayload.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertppayload.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertppayload.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstbasertppayload.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstbasertppayload"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstbasertppayload.top_of_page"></a>gstbasertppayload</span></h2>
+<p>gstbasertppayload — Base class for RTP payloader</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstbasertppayload.synopsis"></a><h2>Synopsis</h2>
+<a name="GstBaseRTPPayload"></a><pre class="synopsis">
+#include &lt;gst/rtp/gstbasertppayload.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload-struct" title="struct GstBaseRTPPayload">GstBaseRTPPayload</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayloadClass" title="struct GstBaseRTPPayloadClass">GstBaseRTPPayloadClass</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-MTU:CAPS" title="GST_BASE_RTP_PAYLOAD_MTU()">GST_BASE_RTP_PAYLOAD_MTU</a> (payload)
+#define <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-PT:CAPS" title="GST_BASE_RTP_PAYLOAD_PT()">GST_BASE_RTP_PAYLOAD_PT</a> (payload)
+#define <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS" title="GST_BASE_RTP_PAYLOAD_SINKPAD()">GST_BASE_RTP_PAYLOAD_SINKPAD</a> (payload)
+#define <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS" title="GST_BASE_RTP_PAYLOAD_SRCPAD()">GST_BASE_RTP_PAYLOAD_SRCPAD</a> (payload)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-is-filled" title="gst_basertppayload_is_filled ()">gst_basertppayload_is_filled</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> duration</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push" title="gst_basertppayload_push ()">gst_basertppayload_push</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push-list" title="gst_basertppayload_push_list ()">gst_basertppayload_push_list</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-options" title="gst_basertppayload_set_options ()">gst_basertppayload_set_options</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> dynamic</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *encoding_name</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> clock_rate</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-outcaps" title="gst_basertppayload_set_outcaps ()">gst_basertppayload_set_outcaps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertppayload.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstBaseRTPPayload
+ +----<a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload">GstBaseRTPAudioPayload</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertppayload.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--max-ptime" title='The "max-ptime" property'>max-ptime</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--min-ptime" title='The "min-ptime" property'>min-ptime</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--mtu" title='The "mtu" property'>mtu</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--perfect-rtptime" title='The "perfect-rtptime" property'>perfect-rtptime</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--pt" title='The "pt" property'>pt</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ptime-multiple" title='The "ptime-multiple" property'>ptime-multiple</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum" title='The "seqnum" property'>seqnum</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum-offset" title='The "seqnum-offset" property'>seqnum-offset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ssrc" title='The "ssrc" property'>ssrc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp" title='The "timestamp" property'>timestamp</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp-offset" title='The "timestamp-offset" property'>timestamp-offset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertppayload.description"></a><h2>Description</h2>
+<p>
+Provides a base class for RTP payloaders
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertppayload.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseRTPPayload-struct"></a><h3>struct GstBaseRTPPayload</h3>
+<pre class="programlisting">struct GstBaseRTPPayload;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayloadClass"></a><h3>struct GstBaseRTPPayloadClass</h3>
+<pre class="programlisting">struct GstBaseRTPPayloadClass {
+ GstElementClass parent_class;
+
+ /* query accepted caps */
+ GstCaps * (*get_caps) (GstBaseRTPPayload *payload, GstPad * pad, GstCaps * filter);
+ /* receive caps on the sink pad, configure the payloader. */
+ gboolean (*set_caps) (GstBaseRTPPayload *payload, GstCaps *caps);
+
+ /* handle a buffer, perform 0 or more gst_basertppayload_push() on
+ * the RTP buffers. This function takes ownership of the buffer. */
+ GstFlowReturn (*handle_buffer) (GstBaseRTPPayload *payload,
+ GstBuffer *buffer);
+ gboolean (*handle_event) (GstBaseRTPPayload *payload, GstEvent * event);
+};
+</pre>
+<p>
+Base class for audio RTP payloader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseRTPPayloadClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPPayloadClass.get-caps"></a>get_caps</code></em> ()</span></p></td>
+<td>get desired caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPPayloadClass.set-caps"></a>set_caps</code></em> ()</span></p></td>
+<td>configure the payloader</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPPayloadClass.handle-buffer"></a>handle_buffer</code></em> ()</span></p></td>
+<td>process data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseRTPPayloadClass.handle-event"></a>handle_event</code></em> ()</span></p></td>
+<td>custom event handling</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-PAYLOAD-MTU:CAPS"></a><h3>GST_BASE_RTP_PAYLOAD_MTU()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_PAYLOAD_MTU(payload) (GST_BASE_RTP_PAYLOAD (payload)-&gt;mtu)
+</pre>
+<p>
+Get access to the configured MTU of <em class="parameter"><code>payload</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-PAYLOAD-PT:CAPS"></a><h3>GST_BASE_RTP_PAYLOAD_PT()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_PAYLOAD_PT(payload) (GST_BASE_RTP_PAYLOAD (payload)-&gt;pt)
+</pre>
+<p>
+Get access to the configured payload type of <em class="parameter"><code>payload</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS"></a><h3>GST_BASE_RTP_PAYLOAD_SINKPAD()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_PAYLOAD_SINKPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)-&gt;sinkpad)
+</pre>
+<p>
+Get access to the sinkpad of <em class="parameter"><code>payload</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS"></a><h3>GST_BASE_RTP_PAYLOAD_SRCPAD()</h3>
+<pre class="programlisting">#define GST_BASE_RTP_PAYLOAD_SRCPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)-&gt;srcpad)
+</pre>
+<p>
+Get access to the srcpad of <em class="parameter"><code>payload</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-basertppayload-is-filled"></a><h3>gst_basertppayload_is_filled ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_basertppayload_is_filled (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> duration</code></em>);</pre>
+<p>
+Check if the packet with <em class="parameter"><code>size</code></em> and <em class="parameter"><code>duration</code></em> would exceed the configured
+maximum size.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>the duration of the packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the packet of <em class="parameter"><code>size</code></em> and <em class="parameter"><code>duration</code></em> would exceed the
+configured MTU or max_ptime.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-basertppayload-push"></a><h3>gst_basertppayload_push ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_basertppayload_push (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Push <em class="parameter"><code>buffer</code></em> to the peer element of the payloader. The SSRC, payload type,
+seqnum and timestamp of the RTP buffer will be updated first.
+</p>
+<p>
+This function takes ownership of <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-basertppayload-push-list"></a><h3>gst_basertppayload_push_list ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_basertppayload_push_list (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Push <em class="parameter"><code>list</code></em> to the peer element of the payloader. The SSRC, payload type,
+seqnum and timestamp of the RTP buffer will be updated first.
+</p>
+<p>
+This function takes ownership of <em class="parameter"><code>list</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="type">GstBufferList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-basertppayload-set-options"></a><h3>gst_basertppayload_set_options ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_basertppayload_set_options (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> dynamic</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *encoding_name</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> clock_rate</code></em>);</pre>
+<p>
+Set the rtp options of the payloader. These options will be set in the caps
+of the payloader. Subclasses must call this method before calling
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push" title="gst_basertppayload_push ()"><code class="function">gst_basertppayload_push()</code></a> or <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-outcaps" title="gst_basertppayload_set_outcaps ()"><code class="function">gst_basertppayload_set_outcaps()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>the media type (typically "audio" or "video")</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dynamic</code></em> :</span></p></td>
+<td>if the payload type is dynamic</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>encoding_name</code></em> :</span></p></td>
+<td>the encoding name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock_rate</code></em> :</span></p></td>
+<td>the clock rate of the media</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-basertppayload-set-outcaps"></a><h3>gst_basertppayload_set_outcaps ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_basertppayload_set_outcaps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a> *payload</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Configure the output caps with the optional parameters.
+</p>
+<p>
+Variable arguments should be in the form field name, field type
+(as a GType), value(s). The last variable argument should be NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the first field name or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>field values</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the caps could be set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstbasertppayload.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--max-ptime"></a><h3>The <code class="literal">"max-ptime"</code> property</h3>
+<pre class="programlisting"> "max-ptime" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Maximum duration of the packet data in ns (-1 = unlimited up to MTU).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--min-ptime"></a><h3>The <code class="literal">"min-ptime"</code> property</h3>
+<pre class="programlisting"> "min-ptime" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Minimum duration of the packet data in ns (can't go above MTU).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--mtu"></a><h3>The <code class="literal">"mtu"</code> property</h3>
+<pre class="programlisting"> "mtu" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Maximum size of one packet.</p>
+<p>Allowed values: &gt;= 28</p>
+<p>Default value: 1400</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--perfect-rtptime"></a><h3>The <code class="literal">"perfect-rtptime"</code> property</h3>
+<pre class="programlisting"> "perfect-rtptime" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Generate perfect RTP timestamps when possible.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--pt"></a><h3>The <code class="literal">"pt"</code> property</h3>
+<pre class="programlisting"> "pt" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>The payload type of the packets.</p>
+<p>Allowed values: &lt;= 128</p>
+<p>Default value: 96</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--ptime-multiple"></a><h3>The <code class="literal">"ptime-multiple"</code> property</h3>
+<pre class="programlisting"> "ptime-multiple" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Force buffers to be multiples of this duration in ns (0 disables).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--seqnum"></a><h3>The <code class="literal">"seqnum"</code> property</h3>
+<pre class="programlisting"> "seqnum" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>The RTP sequence number of the last processed packet.</p>
+<p>Allowed values: &lt;= 65535</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--seqnum-offset"></a><h3>The <code class="literal">"seqnum-offset"</code> property</h3>
+<pre class="programlisting"> "seqnum-offset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Offset to add to all outgoing seqnum (-1 = random).</p>
+<p>Allowed values: [G_MAXULONG,65535]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--ssrc"></a><h3>The <code class="literal">"ssrc"</code> property</h3>
+<pre class="programlisting"> "ssrc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>The SSRC of the packets (default == random).</p>
+<p>Default value: 4294967295</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--timestamp"></a><h3>The <code class="literal">"timestamp"</code> property</h3>
+<pre class="programlisting"> "timestamp" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>The RTP timestamp of the last processed packet.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseRTPPayload--timestamp-offset"></a><h3>The <code class="literal">"timestamp-offset"</code> property</h3>
+<pre class="programlisting"> "timestamp-offset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Offset to add to all outgoing timestamps (default = random).</p>
+<p>Default value: 4294967295</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstcddabasesrc.html b/docs/libs/html/gst-plugins-base-libs-gstcddabasesrc.html
new file mode 100644
index 0000000..65a4a23
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstcddabasesrc.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstcddabasesrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-cdda.html" title="CDDA Library">
+<link rel="prev" href="gstreamer-cdda.html" title="CDDA Library">
+<link rel="next" href="gstreamer-ffft.html" title="FFT Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-cdda.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-cdda.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-ffft.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstcddabasesrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcddabasesrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcddabasesrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcddabasesrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcddabasesrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstcddabasesrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstcddabasesrc.top_of_page"></a>gstcddabasesrc</span></h2>
+<p>gstcddabasesrc — Base class for CD digital audio (CDDA) sources</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstcddabasesrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstCddaBaseSrc"></a><pre class="synopsis">
+#include &lt;gst/cdda/gstcddabasesrc.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc-struct" title="struct GstCddaBaseSrc">GstCddaBaseSrc</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcClass" title="struct GstCddaBaseSrcClass">GstCddaBaseSrcClass</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack" title="struct GstCddaBaseSrcTrack">GstCddaBaseSrcTrack</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode" title="enum GstCddaBaseSrcMode">GstCddaBaseSrcMode</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#gst-cdda-base-src-add-track" title="gst_cdda_base_src_add_track ()">gst_cdda_base_src_add_track</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc"><span class="type">GstCddaBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack" title="struct GstCddaBaseSrcTrack"><span class="type">GstCddaBaseSrcTrack</span></a> *track</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----GstCddaBaseSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstCddaBaseSrc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--device" title='The "device" property'>device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--mode" title='The "mode" property'>mode</a>" <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode" title="enum GstCddaBaseSrcMode"><span class="type">GstCddaBaseSrcMode</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--track" title='The "track" property'>track</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id471435"></a><h3>Using GstCddaBaseSrc-based elements in applications</h3>
+<p>
+Provides a base class for CDDA sources, which handles things like seeking,
+querying, discid calculation, tags, and buffer timestamping.
+</p>
+<p>
+GstCddaBaseSrc registers two <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a>s of its own, namely
+the "track" format and the "sector" format. Applications will usually
+only find the "track" format interesting. You can retrieve that <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a>
+for use in seek events or queries with gst_format_get_by_nick("track").
+</p>
+<p>
+In order to query the number of tracks, for example, an application would
+set the CDDA source element to READY or PAUSED state and then query the
+the number of tracks via <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-query-duration"><code class="function">gst_element_query_duration()</code></a> using the track
+format acquired above. Applications can query the currently playing track
+in the same way.
+</p>
+<p>
+Alternatively, applications may retrieve the currently playing track and
+the total number of tracks from the taglist that will posted on the bus
+whenever the CD is opened or the currently playing track changes. The
+taglist will contain GST_TAG_TRACK_NUMBER and GST_TAG_TRACK_COUNT tags.
+</p>
+<p>
+Applications playing back CD audio using playbin and cdda://n URIs should
+issue a seek command in track format to change between tracks, rather than
+setting a new cdda://n+1 URI on playbin (as setting a new URI on playbin
+involves closing and re-opening the CD device, which is much much slower).
+</p>
+<p>
+CDDA sources will automatically emit a number of tags, details about which
+can be found in the libgsttag documentation. Those tags are:
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID:CAPS" title="GST_TAG_CDDA_CDDB_DISCID"><span class="type">GST_TAG_CDDA_CDDB_DISCID</span></a>, <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS" title="GST_TAG_CDDA_CDDB_DISCID_FULL"><span class="type">GST_TAG_CDDA_CDDB_DISCID_FULL</span></a>,
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID"><span class="type">GST_TAG_CDDA_MUSICBRAINZ_DISCID</span></a>, <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL"><span class="type">GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL</span></a>,
+among others.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCddaBaseSrc-struct"></a><h3>struct GstCddaBaseSrc</h3>
+<pre class="programlisting">struct GstCddaBaseSrc;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCddaBaseSrcClass"></a><h3>struct GstCddaBaseSrcClass</h3>
+<pre class="programlisting">struct GstCddaBaseSrcClass {
+ GstPushSrcClass pushsrc_class;
+
+ /* open/close the CD device */
+ gboolean (*open) (GstCddaBaseSrc *src, const gchar *device);
+ void (*close) (GstCddaBaseSrc *src);
+
+ /* read one sector (LBA) */
+ GstBuffer * (*read_sector) (GstCddaBaseSrc *src, gint sector);
+
+ /* return default device or NULL (optional) */
+ gchar * (*get_default_device) (GstCddaBaseSrc *src);
+
+ /* return NULL-terminated string array of CD devices, or NULL (optional) */
+ gchar ** (*probe_devices) (GstCddaBaseSrc *src);
+};
+</pre>
+<p>
+Cdda source base class.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><span class="type">GstPushSrcClass</span> <em class="structfield"><code><a name="GstCddaBaseSrcClass.pushsrc-class"></a>pushsrc_class</code></em>;</span></p></td>
+<td>the parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstCddaBaseSrcClass.open"></a>open</code></em> ()</span></p></td>
+<td>opening the device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstCddaBaseSrcClass.close"></a>close</code></em> ()</span></p></td>
+<td>closing the device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstCddaBaseSrcClass.read-sector"></a>read_sector</code></em> ()</span></p></td>
+<td>reading a sector</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstCddaBaseSrcClass.get-default-device"></a>get_default_device</code></em> ()</span></p></td>
+<td>getting the default device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstCddaBaseSrcClass.probe-devices"></a>probe_devices</code></em> ()</span></p></td>
+<td>probing possible devices</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCddaBaseSrcTrack"></a><h3>struct GstCddaBaseSrcTrack</h3>
+<pre class="programlisting">struct GstCddaBaseSrcTrack {
+ gboolean is_audio; /* TRUE if this is an audio track */
+ guint num; /* real track number (usually starts from 1) */
+ guint start; /* first sector of track (LBA, not LSN!) */
+ guint end; /* last sector of track (LBA, not LSN!) */
+ GstTagList *tags; /* NULL or tags for track (e.g. from cd-text) */
+};
+</pre>
+<p>
+CD track abstraction to communicate TOC entries to the base class.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstCddaBaseSrcTrack.is-audio"></a>is_audio</code></em>;</span></p></td>
+<td>Whether this is an audio track</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstCddaBaseSrcTrack.num"></a>num</code></em>;</span></p></td>
+<td>Track number in TOC (usually starts from 1, but not always)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstCddaBaseSrcTrack.start"></a>start</code></em>;</span></p></td>
+<td>The first sector of this track (LBA)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstCddaBaseSrcTrack.end"></a>end</code></em>;</span></p></td>
+<td>The last sector of this track (LBA)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *<em class="structfield"><code><a name="GstCddaBaseSrcTrack.tags"></a>tags</code></em>;</span></p></td>
+<td>Track-specific tags (e.g. from cd-text information), or NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCddaBaseSrcMode"></a><h3>enum GstCddaBaseSrcMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_CDDA_BASE_SRC_MODE_NORMAL, /* stream = one track */
+ GST_CDDA_BASE_SRC_MODE_CONTINUOUS /* stream = whole disc */
+} GstCddaBaseSrcMode;
+</pre>
+<p>
+Mode in which the CD audio source operates. Influences timestamping,
+EOS handling and seeking.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CDDA-BASE-SRC-MODE-NORMAL:CAPS"></a><span class="term"><code class="literal">GST_CDDA_BASE_SRC_MODE_NORMAL</code></span></p></td>
+<td>each single track is a stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CDDA-BASE-SRC-MODE-CONTINUOUS:CAPS"></a><span class="term"><code class="literal">GST_CDDA_BASE_SRC_MODE_CONTINUOUS</code></span></p></td>
+<td>the entire disc is a single stream
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-cdda-base-src-add-track"></a><h3>gst_cdda_base_src_add_track ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_cdda_base_src_add_track (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc"><span class="type">GstCddaBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack" title="struct GstCddaBaseSrcTrack"><span class="type">GstCddaBaseSrcTrack</span></a> *track</code></em>);</pre>
+<p>
+CDDA sources use this function from their start vfunc to announce the
+available data and audio tracks to the base source class. The caller
+should allocate <em class="parameter"><code>track</code></em> on the stack, the base source will do a shallow
+copy of the structure (and take ownership of the taglist if there is one).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc"><span class="type">GstCddaBaseSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>address of <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack" title="struct GstCddaBaseSrcTrack"><span class="type">GstCddaBaseSrcTrack</span></a> to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE on error, otherwise TRUE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcddabasesrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstCddaBaseSrc--device"></a><h3>The <code class="literal">"device"</code> property</h3>
+<pre class="programlisting"> "device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>CD device location.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCddaBaseSrc--mode"></a><h3>The <code class="literal">"mode"</code> property</h3>
+<pre class="programlisting"> "mode" <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode" title="enum GstCddaBaseSrcMode"><span class="type">GstCddaBaseSrcMode</span></a> : Read / Write</pre>
+<p>Mode.</p>
+<p>Default value: Stream consists of a single track</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCddaBaseSrc--track"></a><h3>The <code class="literal">"track"</code> property</h3>
+<pre class="programlisting"> "track" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Track.</p>
+<p>Allowed values: [1,99]</p>
+<p>Default value: 1</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstcolorbalance.html b/docs/libs/html/gst-plugins-base-libs-gstcolorbalance.html
new file mode 100644
index 0000000..06a3bcb
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstcolorbalance.html
@@ -0,0 +1,367 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstcolorbalance</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="next" href="gst-plugins-base-libs-gstcolorbalancechannel.html" title="gstcolorbalancechannel">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-interfaces.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstcolorbalancechannel.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstcolorbalance.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalance.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalance.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalance.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstcolorbalance"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstcolorbalance.top_of_page"></a>gstcolorbalance</span></h2>
+<p>gstcolorbalance — Interface for adjusting color balance settings</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstcolorbalance.synopsis"></a><h2>Synopsis</h2>
+<a name="GstColorBalance"></a><pre class="synopsis">
+#include &lt;gst/interfaces/color.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct" title="GstColorBalance">GstColorBalance</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceClass" title="struct GstColorBalanceClass">GstColorBalanceClass</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType">GstColorBalanceType</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-list-channels" title="gst_color_balance_list_channels ()">gst_color_balance_list_channels</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-value" title="gst_color_balance_get_value ()">gst_color_balance_get_value</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-set-value" title="gst_color_balance_set_value ()">gst_color_balance_set_value</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-value-changed" title="gst_color_balance_value_changed ()">gst_color_balance_value_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType"><span class="returnvalue">GstColorBalanceType</span></a> <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-balance-type" title="gst_color_balance_get_balance_type ()">gst_color_balance_get_balance_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalance.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstColorBalance
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalance.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-value-changed" title='The "value-changed" signal'>value-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalance.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id487947"></a><p>
+This interface is implemented by elements which can perform some color
+balance operation on video frames they process. For example, modifying
+the brightness, contrast, hue or saturation.
+</p>
+<p>
+Example elements are 'xvimagesink' and 'colorbalance'
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalance.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstColorBalance-struct"></a><h3>GstColorBalance</h3>
+<pre class="programlisting">typedef struct _GstColorBalance GstColorBalance;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstColorBalanceClass"></a><h3>struct GstColorBalanceClass</h3>
+<pre class="programlisting">struct GstColorBalanceClass {
+ GTypeInterface klass;
+
+ GstColorBalanceType balance_type;
+
+ /* virtual functions */
+ const GList * (* list_channels) (GstColorBalance *balance);
+
+ void (* set_value) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+ gint (* get_value) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel);
+
+ /* signals */
+ void (* value_changed) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+};
+</pre>
+<p>
+Color-balance interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInterface"><span class="type">GTypeInterface</span></a> <em class="structfield"><code><a name="GstColorBalanceClass.klass"></a>klass</code></em>;</span></p></td>
+<td>the parent interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType"><span class="type">GstColorBalanceType</span></a> <em class="structfield"><code><a name="GstColorBalanceClass.balance-type"></a>balance_type</code></em>;</span></p></td>
+<td>implementation type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstColorBalanceClass.list-channels"></a>list_channels</code></em> ()</span></p></td>
+<td>list handled channels</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstColorBalanceClass.set-value"></a>set_value</code></em> ()</span></p></td>
+<td>set a channel value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstColorBalanceClass.get-value"></a>get_value</code></em> ()</span></p></td>
+<td>get a channel value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstColorBalanceClass.value-changed"></a>value_changed</code></em> ()</span></p></td>
+<td>default handler for value changed notification</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstColorBalanceType"></a><h3>enum GstColorBalanceType</h3>
+<pre class="programlisting">typedef enum {
+ GST_COLOR_BALANCE_HARDWARE,
+ GST_COLOR_BALANCE_SOFTWARE
+} GstColorBalanceType;
+</pre>
+<p>
+An enumeration indicating whether an element implements color balancing
+operations in software or in dedicated hardware. In general, dedicated
+hardware implementations (such as those provided by xvimagesink) are
+preferred.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-COLOR-BALANCE-HARDWARE:CAPS"></a><span class="term"><code class="literal">GST_COLOR_BALANCE_HARDWARE</code></span></p></td>
+<td>Color balance is implemented with dedicated
+ hardware.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-COLOR-BALANCE-SOFTWARE:CAPS"></a><span class="term"><code class="literal">GST_COLOR_BALANCE_SOFTWARE</code></span></p></td>
+<td>Color balance is implemented via software
+ processing.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-color-balance-list-channels"></a><h3>gst_color_balance_list_channels ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_color_balance_list_channels (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>);</pre>
+<p>
+Retrieve a list of the available channels.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>balance</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A GList containing pointers to <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> objects.
+The list is owned by the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> instance and must not
+be freed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-color-balance-get-value"></a><h3>gst_color_balance_get_value ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_color_balance_get_value (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>);</pre>
+<p>
+Retrieve the current value of the indicated channel, between min_value
+and max_value.
+</p>
+<p>
+See Also: The <span class="type">GstColorBalanceChannel.min_value</span> and
+ <span class="type">GstColorBalanceChannel.max_value</span> members of the
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>balance</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current value of the channel.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-color-balance-set-value"></a><h3>gst_color_balance_set_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_color_balance_set_value (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value</code></em>);</pre>
+<p>
+Sets the current value of the channel to the passed value, which must
+be between min_value and max_value.
+</p>
+<p>
+See Also: The <span class="type">GstColorBalanceChannel.min_value</span> and
+ <span class="type">GstColorBalanceChannel.max_value</span> members of the
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>balance</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>The new value for the channel.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-color-balance-value-changed"></a><h3>gst_color_balance_value_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_color_balance_value_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value</code></em>);</pre>
+<p>
+A helper function called by implementations of the GstColorBalance
+interface. It fires the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-value-changed" title='The "value-changed" signal'><span class="type">"value-changed"</span></a> signal on the
+instance, and the <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-value-changed" title='The "value-changed" signal'><span class="type">"value-changed"</span></a> signal on the
+channel object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>balance</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> whose value has changed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>The new value of the channel</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-color-balance-get-balance-type"></a><h3>gst_color_balance_get_balance_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType"><span class="returnvalue">GstColorBalanceType</span></a> gst_color_balance_get_balance_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *balance</code></em>);</pre>
+<p>
+Get the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType"><span class="type">GstColorBalanceType</span></a> of this implementation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>balance</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> implementation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType" title="enum GstColorBalanceType"><span class="type">GstColorBalanceType</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalance.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstColorBalance-value-changed"></a><h3>The <code class="literal">"value-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> *colorbalance,
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Fired when the value of the indicated channel has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>colorbalance</code></em> :</span></p></td>
+<td>The GstColorBalance instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>The new value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstcolorbalancechannel.html b/docs/libs/html/gst-plugins-base-libs-gstcolorbalancechannel.html
new file mode 100644
index 0000000..308afd6
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstcolorbalancechannel.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstcolorbalancechannel</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">
+<link rel="next" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstcolorbalance.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstmixer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstcolorbalancechannel.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalancechannel.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalancechannel.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstcolorbalancechannel.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstcolorbalancechannel.top_of_page"></a>gstcolorbalancechannel</span></h2>
+<p>gstcolorbalancechannel — Object representing a channel from the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a>
+ interface.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.synopsis"></a><h2>Synopsis</h2>
+<a name="GstColorBalanceChannel"></a><pre class="synopsis">
+#include &lt;gst/interfaces/colorbalancechannel.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-struct" title="struct GstColorBalanceChannel">GstColorBalanceChannel</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannelClass" title="struct GstColorBalanceChannelClass">GstColorBalanceChannelClass</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstColorBalanceChannel
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-value-changed" title='The "value-changed" signal'>value-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id494532"></a><p>The <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> object represents a parameter
+for modifying the color balance implemented by an element providing the
+<a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a> interface. For example, Hue or Saturation.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstColorBalanceChannel-struct"></a><h3>struct GstColorBalanceChannel</h3>
+<pre class="programlisting">struct GstColorBalanceChannel {
+ gchar *label;
+ gint min_value;
+ gint max_value;
+};
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstColorBalanceChannel-struct.label"></a>label</code></em>;</span></p></td>
+<td>A string containing a descriptive name for this channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstColorBalanceChannel-struct.min-value"></a>min_value</code></em>;</span></p></td>
+<td>The minimum valid value for this channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstColorBalanceChannel-struct.max-value"></a>max_value</code></em>;</span></p></td>
+<td>The maximum valid value for this channel.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstColorBalanceChannelClass"></a><h3>struct GstColorBalanceChannelClass</h3>
+<pre class="programlisting">struct GstColorBalanceChannelClass {
+ GObjectClass parent;
+
+ /* signals */
+ void (* value_changed) (GstColorBalanceChannel *channel,
+ gint value);
+};
+</pre>
+<p>
+Color-balance channel class.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GstColorBalanceChannelClass.parent"></a>parent</code></em>;</span></p></td>
+<td>the parent interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstColorBalanceChannelClass.value-changed"></a>value_changed</code></em> ()</span></p></td>
+<td>default handler for value changed notification</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstcolorbalancechannel.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstColorBalanceChannel-value-changed"></a><h3>The <code class="literal">"value-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a> *channel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Fired when the value of the indicated channel has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel"><span class="type">GstColorBalanceChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>The new value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstdiscoverer.html b/docs/libs/html/gst-plugins-base-libs-gstdiscoverer.html
new file mode 100644
index 0000000..f997b76
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstdiscoverer.html
@@ -0,0 +1,1532 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstdiscoverer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">
+<link rel="next" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-encoding-profile.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstdiscoverer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstdiscoverer.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstdiscoverer.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstdiscoverer.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstdiscoverer.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstdiscoverer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstdiscoverer.top_of_page"></a>gstdiscoverer</span></h2>
+<p>gstdiscoverer — Utility for discovering information on URIs.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstdiscoverer.synopsis"></a><h2>Synopsis</h2>
+<a name="GstDiscoverer"></a><a name="GstDiscovererInfo"></a><pre class="synopsis">
+#include &lt;gst/pbutils/pbutils.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-struct" title="struct GstDiscoverer">GstDiscoverer</a>;
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="returnvalue">GstDiscoverer</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-new" title="gst_discoverer_new ()">gst_discoverer_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **err</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start" title="gst_discoverer_start ()">gst_discoverer_start</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stop" title="gst_discoverer_stop ()">gst_discoverer_stop</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="returnvalue">GstDiscovererInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri" title="gst_discoverer_discover_uri ()">gst_discoverer_discover_uri</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **err</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri-async" title="gst_discoverer_discover_uri_async ()">gst_discoverer_discover_uri_async</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);
+
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo-struct" title="GstDiscovererInfo">GstDiscovererInfo</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" title="enum GstDiscovererResult">GstDiscovererResult</a>;
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-duration" title="gst_discoverer_info_get_duration ()">gst_discoverer_info_get_duration</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-misc" title="gst_discoverer_info_get_misc ()">gst_discoverer_info_get_misc</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" title="enum GstDiscovererResult"><span class="returnvalue">GstDiscovererResult</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-result" title="gst_discoverer_info_get_result ()">gst_discoverer_info_get_result</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-info" title="gst_discoverer_info_get_stream_info ()">gst_discoverer_info_get_stream_info</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-list" title="gst_discoverer_info_get_stream_list ()">gst_discoverer_info_get_stream_list</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-tags" title="gst_discoverer_info_get_tags ()">gst_discoverer_info_get_tags</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-uri" title="gst_discoverer_info_get_uri ()">gst_discoverer_info_get_uri</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-seekable" title="gst_discoverer_info_get_seekable ()">gst_discoverer_info_get_seekable</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+#define <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-ref" title="gst_discoverer_info_ref()">gst_discoverer_info_ref</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-unref" title="gst_discoverer_info_unref()">gst_discoverer_info_unref</a> (info)
+
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo">GstDiscovererStreamInfo</a>;
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo">GstDiscovererContainerInfo</a>;
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo">GstDiscovererAudioInfo</a>;
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo">GstDiscovererVideoInfo</a>;
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo">GstDiscovererSubtitleInfo</a>;
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-caps" title="gst_discoverer_stream_info_get_caps ()">gst_discoverer_stream_info_get_caps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-misc" title="gst_discoverer_stream_info_get_misc ()">gst_discoverer_stream_info_get_misc</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-next" title="gst_discoverer_stream_info_get_next ()">gst_discoverer_stream_info_get_next</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-previous" title="gst_discoverer_stream_info_get_previous ()">gst_discoverer_stream_info_get_previous</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-tags" title="gst_discoverer_stream_info_get_tags ()">gst_discoverer_stream_info_get_tags</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+#define <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-ref" title="gst_discoverer_stream_info_ref()">gst_discoverer_stream_info_ref</a> (info)
+#define <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" title="gst_discoverer_stream_info_unref()">gst_discoverer_stream_info_unref</a> (info)
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()">gst_discoverer_stream_info_list_free</a>
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *infos</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-stream-type-nick" title="gst_discoverer_stream_info_get_stream_type_nick ()">gst_discoverer_stream_info_get_stream_type_nick</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-audio-streams" title="gst_discoverer_info_get_audio_streams ()">gst_discoverer_info_get_audio_streams</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-container-streams" title="gst_discoverer_info_get_container_streams ()">gst_discoverer_info_get_container_streams</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-streams" title="gst_discoverer_info_get_streams ()">gst_discoverer_info_get_streams</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> streamtype</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-subtitle-streams" title="gst_discoverer_info_get_subtitle_streams ()">gst_discoverer_info_get_subtitle_streams</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-video-streams" title="gst_discoverer_info_get_video_streams ()">gst_discoverer_info_get_video_streams</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-bitrate" title="gst_discoverer_audio_info_get_bitrate ()">gst_discoverer_audio_info_get_bitrate</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-channels" title="gst_discoverer_audio_info_get_channels ()">gst_discoverer_audio_info_get_channels</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-depth" title="gst_discoverer_audio_info_get_depth ()">gst_discoverer_audio_info_get_depth</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-language" title="gst_discoverer_audio_info_get_language ()">gst_discoverer_audio_info_get_language</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-max-bitrate" title="gst_discoverer_audio_info_get_max_bitrate ()">gst_discoverer_audio_info_get_max_bitrate</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-sample-rate" title="gst_discoverer_audio_info_get_sample_rate ()">gst_discoverer_audio_info_get_sample_rate</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-container-info-get-streams" title="gst_discoverer_container_info_get_streams ()">gst_discoverer_container_info_get_streams</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a> *info</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-subtitle-info-get-language" title="gst_discoverer_subtitle_info_get_language ()">gst_discoverer_subtitle_info_get_language</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo"><span class="type">GstDiscovererSubtitleInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-bitrate" title="gst_discoverer_video_info_get_bitrate ()">gst_discoverer_video_info_get_bitrate</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-depth" title="gst_discoverer_video_info_get_depth ()">gst_discoverer_video_info_get_depth</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-denom" title="gst_discoverer_video_info_get_framerate_denom ()">gst_discoverer_video_info_get_framerate_denom</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-num" title="gst_discoverer_video_info_get_framerate_num ()">gst_discoverer_video_info_get_framerate_num</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-height" title="gst_discoverer_video_info_get_height ()">gst_discoverer_video_info_get_height</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-interlaced" title="gst_discoverer_video_info_is_interlaced ()">gst_discoverer_video_info_is_interlaced</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-image" title="gst_discoverer_video_info_is_image ()">gst_discoverer_video_info_is_image</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-max-bitrate" title="gst_discoverer_video_info_get_max_bitrate ()">gst_discoverer_video_info_get_max_bitrate</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-denom" title="gst_discoverer_video_info_get_par_denom ()">gst_discoverer_video_info_get_par_denom</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-num" title="gst_discoverer_video_info_get_par_num ()">gst_discoverer_video_info_get_par_num</a>
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-width" title="gst_discoverer_video_info_get_width ()">gst_discoverer_video_info_get_width</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstDiscoverer
+</pre>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstDiscovererInfo
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer--timeout" title='The "timeout" property'>timeout</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write / Construct
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-discovered" title='The "discovered" signal'>discovered</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-finished" title='The "finished" signal'>finished</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-starting" title='The "starting" signal'>starting</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> is a utility object which allows to get as much
+information as possible from one or many URIs.
+</p>
+<p>
+It provides two APIs, allowing usage in blocking or non-blocking mode.
+</p>
+<p>
+The blocking mode just requires calling <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri" title="gst_discoverer_discover_uri ()"><code class="function">gst_discoverer_discover_uri()</code></a>
+with the URI one wishes to discover.
+</p>
+<p>
+The non-blocking mode requires a running <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainLoop"><span class="type">GMainLoop</span></a> in the default
+<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><span class="type">GMainContext</span></a>, where one connects to the various signals, appends the
+URIs to be processed (through <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri-async" title="gst_discoverer_discover_uri_async ()"><code class="function">gst_discoverer_discover_uri_async()</code></a>) and then
+asks for the discovery to begin (through <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start" title="gst_discoverer_start ()"><code class="function">gst_discoverer_start()</code></a>).
+</p>
+<p>
+All the information is returned in a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> structure.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDiscoverer-struct"></a><h3>struct GstDiscoverer</h3>
+<pre class="programlisting">struct GstDiscoverer;</pre>
+<p>
+The <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> structure.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-new"></a><h3>gst_discoverer_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="returnvalue">GstDiscoverer</span></a> * gst_discoverer_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **err</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> with the provided timeout.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>timeout per file, in nanoseconds. Allowed are values between
+one second (<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-SECOND:CAPS"><span class="type">GST_SECOND</span></a>) and one hour (3600 * <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-SECOND:CAPS"><span class="type">GST_SECOND</span></a>)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
+<td>a pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>. can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>.
+If an error occurred when creating the discoverer, <em class="parameter"><code>err</code></em> will be set
+accordingly and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> will be returned. If <em class="parameter"><code>err</code></em> is set, the caller must
+free it when no longer needed using <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#g-error-free"><code class="function">g_error_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-start"></a><h3>gst_discoverer_start ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_discoverer_start (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>);</pre>
+<p>
+Allow asynchronous discovering of URIs to take place.
+A <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainLoop"><span class="type">GMainLoop</span></a> must be available for <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> to properly work in
+asynchronous mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stop"></a><h3>gst_discoverer_stop ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_discoverer_stop (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>);</pre>
+<p>
+Stop the discovery of any pending URIs and clears the list of
+pending URIS (if any).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-discover-uri"></a><h3>gst_discoverer_discover_uri ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="returnvalue">GstDiscovererInfo</span></a> * gst_discoverer_discover_uri (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **err</code></em>);</pre>
+<p>
+Synchronously discovers the given <em class="parameter"><code>uri</code></em>.
+</p>
+<p>
+A copy of <em class="parameter"><code>uri</code></em> will be made internally, so the caller can safely <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
+afterwards.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>The URI to run on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
+<td>If an error occurred, this field will be filled in. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the scanning. Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if an
+error occurred. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-discover-uri-async"></a><h3>gst_discoverer_discover_uri_async ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_discoverer_discover_uri_async (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<p>
+Appends the given <em class="parameter"><code>uri</code></em> to the list of URIs to discoverer. The actual
+discovery of the <em class="parameter"><code>uri</code></em> will only take place if <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start" title="gst_discoverer_start ()"><code class="function">gst_discoverer_start()</code></a> has
+been called.
+</p>
+<p>
+A copy of <em class="parameter"><code>uri</code></em> will be made internally, so the caller can safely <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
+afterwards.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the URI to add.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <em class="parameter"><code>uri</code></em> was succesfully appended to the list of pending
+uris, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererInfo-struct"></a><h3>GstDiscovererInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererInfo GstDiscovererInfo;</pre>
+<p>
+Structure containing the information of a URI analyzed by <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererResult"></a><h3>enum GstDiscovererResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_DISCOVERER_OK = 0,
+ GST_DISCOVERER_URI_INVALID = 1,
+ GST_DISCOVERER_ERROR = 2,
+ GST_DISCOVERER_TIMEOUT = 3,
+ GST_DISCOVERER_BUSY = 4,
+ GST_DISCOVERER_MISSING_PLUGINS = 5
+} GstDiscovererResult;
+</pre>
+<p>
+Result values for the discovery process.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DISCOVERER-OK:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_OK</code></span></p></td>
+<td>The discovery was successful
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DISCOVERER-URI-INVALID:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_URI_INVALID</code></span></p></td>
+<td>the URI is invalid
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DISCOVERER-ERROR:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_ERROR</code></span></p></td>
+<td>an error happened and the GError is set
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DISCOVERER-TIMEOUT:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_TIMEOUT</code></span></p></td>
+<td>the discovery timed-out
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DISCOVERER-BUSY:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_BUSY</code></span></p></td>
+<td>the discoverer was already discovering a file
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DISCOVERER-MISSING-PLUGINS:CAPS"></a><span class="term"><code class="literal">GST_DISCOVERER_MISSING_PLUGINS</code></span></p></td>
+<td>Some plugins are missing for full discovery
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-duration"></a><h3>gst_discoverer_info_get_duration ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_discoverer_info_get_duration (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the duration of the URI in <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> (nanoseconds).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-misc"></a><h3>gst_discoverer_info_get_misc ()</h3>
+<pre class="programlisting">const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_discoverer_info_get_misc (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Miscellaneous information stored as a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a>
+(for example: information about missing plugins). If you wish to use the
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> after the life-time of <em class="parameter"><code>info</code></em>, you will need to copy it. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-result"></a><h3>gst_discoverer_info_get_result ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" title="enum GstDiscovererResult"><span class="returnvalue">GstDiscovererResult</span></a> gst_discoverer_info_get_result (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the discovery as a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" title="enum GstDiscovererResult"><span class="type">GstDiscovererResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-stream-info"></a><h3>gst_discoverer_info_get_stream_info ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * gst_discoverer_info_get_stream_info
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the structure (or topology) of the URI as a
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>.
+This structure can be traversed to see the original hierarchy. Unref with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" title="gst_discoverer_stream_info_unref()"><code class="function">gst_discoverer_stream_info_unref()</code></a> after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-stream-list"></a><h3>gst_discoverer_info_get_stream_list ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_stream_list (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the list of
+all streams contained in the <span class="type">info</span>. Free after usage
+with <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-tags"></a><h3>gst_discoverer_info_get_tags ()</h3>
+<pre class="programlisting">const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_discoverer_info_get_tags (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>all tags contained in the URI. If you wish to use
+the tags after the life-time of <em class="parameter"><code>info</code></em>, you will need to copy them. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-uri"></a><h3>gst_discoverer_info_get_uri ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_discoverer_info_get_uri (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the URI to which this information corresponds to.
+Copy it if you wish to use it after the life-time of <em class="parameter"><code>info</code></em>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-seekable"></a><h3>gst_discoverer_info_get_seekable ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_discoverer_info_get_seekable (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the wheter the URI is seekable.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-ref"></a><h3>gst_discoverer_info_ref()</h3>
+<pre class="programlisting">#define gst_discoverer_info_ref(info) (g_object_ref((Gbject*)info))
+</pre>
+<p>
+Increments the reference count of <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the same <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> object</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-unref"></a><h3>gst_discoverer_info_unref()</h3>
+<pre class="programlisting">#define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
+</pre>
+<p>
+Decrements the reference count of <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererStreamInfo"></a><h3>GstDiscovererStreamInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererStreamInfo GstDiscovererStreamInfo;</pre>
+<p>
+Base structure for information concerning a media stream. Depending on the
+stream type, one can find more media-specific information in
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>, <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>, and
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a>.
+</p>
+<p>
+The <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> represents the topology of the stream. Siblings
+can be iterated over with <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-next" title="gst_discoverer_stream_info_get_next ()"><code class="function">gst_discoverer_stream_info_get_next()</code></a> and
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-previous" title="gst_discoverer_stream_info_get_previous ()"><code class="function">gst_discoverer_stream_info_get_previous()</code></a>. Children (sub-streams) of a
+stream can be accessed using the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a> API.
+</p>
+<p>
+As a simple example, if you run <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> on an AVI file with one audio
+and one video stream, you will get a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a>
+corresponding to the AVI container, which in turn will have a
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> sub-stream and a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> sub-stream
+for the audio and video streams respectively.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererContainerInfo"></a><h3>GstDiscovererContainerInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> specific to container streams.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererAudioInfo"></a><h3>GstDiscovererAudioInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> specific to audio streams.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererVideoInfo"></a><h3>GstDiscovererVideoInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> specific to video streams (this includes images).
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscovererSubtitleInfo"></a><h3>GstDiscovererSubtitleInfo</h3>
+<pre class="programlisting">typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> specific to subtitle streams (this includes text and
+image based ones).
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-caps"></a><h3>gst_discoverer_stream_info_get_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_discoverer_stream_info_get_caps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> of the stream. Unref with
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><span class="type">gst_caps_unref</span></a> after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-misc"></a><h3>gst_discoverer_stream_info_get_misc ()</h3>
+<pre class="programlisting">const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_discoverer_stream_info_get_misc
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>additional information regarding the stream (for
+example codec version, profile, etc..). If you wish to use the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a>
+after the life-time of <em class="parameter"><code>info</code></em> you will need to copy it. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-next"></a><h3>gst_discoverer_stream_info_get_next ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * gst_discoverer_stream_info_get_next
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the next <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> in a chain. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+for final streams.
+Unref with <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" title="gst_discoverer_stream_info_unref()"><span class="type">gst_discoverer_stream_info_unref</span></a> after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-previous"></a><h3>gst_discoverer_stream_info_get_previous ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="returnvalue">GstDiscovererStreamInfo</span></a> * gst_discoverer_stream_info_get_previous
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the previous <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> in a chain.
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> for starting points. Unref with <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" title="gst_discoverer_stream_info_unref()"><span class="type">gst_discoverer_stream_info_unref</span></a>
+after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-tags"></a><h3>gst_discoverer_stream_info_get_tags ()</h3>
+<pre class="programlisting">const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_discoverer_stream_info_get_tags (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the tags contained in this stream. If you wish to
+use the tags after the life-time of <em class="parameter"><code>info</code></em> you will need to copy them. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-ref"></a><h3>gst_discoverer_stream_info_ref()</h3>
+<pre class="programlisting">#define gst_discoverer_stream_info_ref(info) ((GstDiscovererStreamInfo*) g_object_ref((GObject*) info))
+</pre>
+<p>
+Increments the reference count of <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the same <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> object</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-unref"></a><h3>gst_discoverer_stream_info_unref()</h3>
+<pre class="programlisting">#define gst_discoverer_stream_info_unref(info) (g_object_unref((GObject*) info))
+</pre>
+<p>
+Decrements the reference count of <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-list-free"></a><h3>gst_discoverer_stream_info_list_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_discoverer_stream_info_list_free
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *infos</code></em>);</pre>
+<p>
+Decrements the reference count of all contained <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+and fress the <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>infos</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-stream-info-get-stream-type-nick"></a><h3>gst_discoverer_stream_info_get_stream_type_nick ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_discoverer_stream_info_get_stream_type_nick
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a human readable name for the stream type of the given <em class="parameter"><code>info</code></em> (ex : "audio",
+"container",...).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-audio-streams"></a><h3>gst_discoverer_info_get_audio_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_audio_streams
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<p>
+Finds all the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> contained in <em class="parameter"><code>info</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>. The caller should free it with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-container-streams"></a><h3>gst_discoverer_info_get_container_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_container_streams
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<p>
+Finds all the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a> contained in <em class="parameter"><code>info</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>. The caller should free it with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-streams"></a><h3>gst_discoverer_info_get_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_streams (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> streamtype</code></em>);</pre>
+<p>
+Finds the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> contained in <em class="parameter"><code>info</code></em> that match the
+given <em class="parameter"><code>streamtype</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>streamtype</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> derived from <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>. The caller should free it with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-subtitle-streams"></a><h3>gst_discoverer_info_get_subtitle_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_subtitle_streams
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<p>
+Finds all the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo"><span class="type">GstDiscovererSubtitleInfo</span></a> contained in <em class="parameter"><code>info</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>. The caller should free it with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-info-get-video-streams"></a><h3>gst_discoverer_info_get_video_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_info_get_video_streams
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info</code></em>);</pre>
+<p>
+Finds all the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> contained in <em class="parameter"><code>info</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>. The caller should free it with
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-bitrate"></a><h3>gst_discoverer_audio_info_get_bitrate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_audio_info_get_bitrate
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the average or nominal bitrate of the stream in bits/second.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-channels"></a><h3>gst_discoverer_audio_info_get_channels ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_audio_info_get_channels
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of channels in the stream.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-depth"></a><h3>gst_discoverer_audio_info_get_depth ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_audio_info_get_depth (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bits used per sample in each channel.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-language"></a><h3>gst_discoverer_audio_info_get_language ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_discoverer_audio_info_get_language
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the language of the stream, or NULL if unknown.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-max-bitrate"></a><h3>gst_discoverer_audio_info_get_max_bitrate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_audio_info_get_max_bitrate
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maximum bitrate of the stream in bits/second.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-audio-info-get-sample-rate"></a><h3>gst_discoverer_audio_info_get_sample_rate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_audio_info_get_sample_rate
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" title="GstDiscovererAudioInfo"><span class="type">GstDiscovererAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the sample rate of the stream in Hertz.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-container-info-get-streams"></a><h3>gst_discoverer_container_info_get_streams ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_discoverer_container_info_get_streams
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" title="GstDiscovererContainerInfo"><span class="type">GstDiscovererContainerInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the list of
+<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" title="GstDiscovererStreamInfo"><span class="type">GstDiscovererStreamInfo</span></a> this container stream offers.
+Free with <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free" title="gst_discoverer_stream_info_list_free ()"><code class="function">gst_discoverer_stream_info_list_free()</code></a> after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DiscovererStreamInfo]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-subtitle-info-get-language"></a><h3>gst_discoverer_subtitle_info_get_language ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_discoverer_subtitle_info_get_language
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo"><span class="type">GstDiscovererSubtitleInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" title="GstDiscovererSubtitleInfo"><span class="type">GstDiscovererSubtitleInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the language of the stream, or NULL if unknown.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-bitrate"></a><h3>gst_discoverer_video_info_get_bitrate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_bitrate
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the average or nominal bitrate of the video stream in bits/second.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-depth"></a><h3>gst_discoverer_video_info_get_depth ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_depth (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the depth in bits of the video stream.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-framerate-denom"></a><h3>gst_discoverer_video_info_get_framerate_denom ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_framerate_denom
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the framerate of the video stream (denominator).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-framerate-num"></a><h3>gst_discoverer_video_info_get_framerate_num ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_framerate_num
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the framerate of the video stream (numerator).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-height"></a><h3>gst_discoverer_video_info_get_height ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_height
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the height of the video stream in pixels.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-is-interlaced"></a><h3>gst_discoverer_video_info_is_interlaced ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_discoverer_video_info_is_interlaced
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the stream is interlaced, else <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-is-image"></a><h3>gst_discoverer_video_info_is_image ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_discoverer_video_info_is_image (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a> if the video stream corresponds to an image (i.e. only contains
+one frame).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-max-bitrate"></a><h3>gst_discoverer_video_info_get_max_bitrate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_max_bitrate
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maximum bitrate of the video stream in bits/second.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-par-denom"></a><h3>gst_discoverer_video_info_get_par_denom ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_par_denom
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the Pixel Aspect Ratio (PAR) of the video stream (denominator).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-par-num"></a><h3>gst_discoverer_video_info_get_par_num ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_par_num
+ (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the Pixel Aspect Ratio (PAR) of the video stream (numerator).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-discoverer-video-info-get-width"></a><h3>gst_discoverer_video_info_get_width ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_discoverer_video_info_get_width (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" title="GstDiscovererVideoInfo"><span class="type">GstDiscovererVideoInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the width of the video stream in pixels.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstDiscoverer--timeout"></a><h3>The <code class="literal">"timeout"</code> property</h3>
+<pre class="programlisting"> "timeout" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write / Construct</pre>
+<p>
+The duration (in nanoseconds) after which the discovery of an individual
+URI will timeout.
+</p>
+<p>
+If the discovery of a URI times out, the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-TIMEOUT:CAPS"><code class="literal">GST_DISCOVERER_TIMEOUT</code></a> will be
+set on the result flags.
+</p>
+<p>Allowed values: [1000000000,3600000000000]</p>
+<p>Default value: 15000000000</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstdiscoverer.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstDiscoverer-discovered"></a><h3>The <code class="literal">"discovered"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer,
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a> *info,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> *error,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Will be emitted when all information on a URI could be discovered.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>the results <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo"><span class="type">GstDiscovererInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>, which will be non-NULL if an error
+occurred during discovery. <span class="annotation">[<acronym title="Override the parsed C type with given type"><span class="acronym">type</span></acronym> GLib.Error]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscoverer-finished"></a><h3>The <code class="literal">"finished"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Will be emitted when all pending URIs have been processed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDiscoverer-starting"></a><h3>The <code class="literal">"starting"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a> *discoverer,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Will be emitted when the discover starts analyzing the pending URIs
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer"><span class="type">GstDiscoverer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstfft.html b/docs/libs/html/gst-plugins-base-libs-gstfft.html
new file mode 100644
index 0000000..8e5b2cb
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstfft.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstfft</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="prev" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="next" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-ffft.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-ffft.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstffts16.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstfft.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstfft.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstfft"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstfft.top_of_page"></a>gstfft</span></h2>
+<p>gstfft — General FFT functions and declarations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstfft.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/fft/gstfft.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow">GstFFTWindow</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()">gst_fft_next_fast_length</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfft.description"></a><h2>Description</h2>
+<p>
+This library includes general definitions and functions, useful for
+all typed FFT classes.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfft.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFFTWindow"></a><h3>enum GstFFTWindow</h3>
+<pre class="programlisting">typedef enum {
+ GST_FFT_WINDOW_RECTANGULAR,
+ GST_FFT_WINDOW_HAMMING,
+ GST_FFT_WINDOW_HANN,
+ GST_FFT_WINDOW_BARTLETT,
+ GST_FFT_WINDOW_BLACKMAN
+} GstFFTWindow;
+</pre>
+<p>
+The various window functions available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-FFT-WINDOW-RECTANGULAR:CAPS"></a><span class="term"><code class="literal">GST_FFT_WINDOW_RECTANGULAR</code></span></p></td>
+<td>Rectangular window
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FFT-WINDOW-HAMMING:CAPS"></a><span class="term"><code class="literal">GST_FFT_WINDOW_HAMMING</code></span></p></td>
+<td>Hamming window
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FFT-WINDOW-HANN:CAPS"></a><span class="term"><code class="literal">GST_FFT_WINDOW_HANN</code></span></p></td>
+<td>Hann (sometimes also called Hanning) window
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FFT-WINDOW-BARTLETT:CAPS"></a><span class="term"><code class="literal">GST_FFT_WINDOW_BARTLETT</code></span></p></td>
+<td>Bartlett window
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FFT-WINDOW-BLACKMAN:CAPS"></a><span class="term"><code class="literal">GST_FFT_WINDOW_BLACKMAN</code></span></p></td>
+<td>Blackman window
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-next-fast-length"></a><h3>gst_fft_next_fast_length ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_fft_next_fast_length (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n</code></em>);</pre>
+<p>
+Returns the next number to <em class="parameter"><code>n</code></em> that is entirely a product
+of 2, 3 and 5. Using this as the <em class="parameter"><code>len</code></em> parameter for
+the different GstFFT types will provide the best performance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n</code></em> :</span></p></td>
+<td>Number for which the next fast length should be returned</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the next fast FFT length.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstfftf32.html b/docs/libs/html/gst-plugins-base-libs-gstfftf32.html
new file mode 100644
index 0000000..7649c05
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstfftf32.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstfftf32</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="prev" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">
+<link rel="next" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstffts32.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-ffft.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstfftf64.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstfftf32.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstfftf32.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstfftf32"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstfftf32.top_of_page"></a>gstfftf32</span></h2>
+<p>gstfftf32 — FFT functions for 32 bit float samples</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstfftf32.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/fft/gstfftf32.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32">GstFFTF32</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex">GstFFTF32Complex</a>;
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="returnvalue">GstFFTF32</span></a> * <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()">gst_fft_f32_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft" title="gst_fft_f32_fft ()">gst_fft_f32_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex"><span class="type">GstFFTF32Complex</span></a> *freqdata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft" title="gst_fft_f32_inverse_fft ()">gst_fft_f32_inverse_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex"><span class="type">GstFFTF32Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-window" title="gst_fft_f32_window ()">gst_fft_f32_window</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-free" title="gst_fft_f32_free ()">gst_fft_f32_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfftf32.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> provides a FFT implementation and related functions for
+32 bit float samples. To use this call <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()"><code class="function">gst_fft_f32_new()</code></a> for
+allocating a <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance with the appropiate parameters and
+then call <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft" title="gst_fft_f32_fft ()"><code class="function">gst_fft_f32_fft()</code></a> or <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft" title="gst_fft_f32_inverse_fft ()"><code class="function">gst_fft_f32_inverse_fft()</code></a> to perform the
+FFT or inverse FFT on a buffer of samples.
+</p>
+<p>
+After use free the <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-free" title="gst_fft_f32_free ()"><code class="function">gst_fft_f32_free()</code></a>.
+</p>
+<p>
+For the best performance use <a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a> to get a
+number that is entirely a product of 2, 3 and 5 and use this as the
+<em class="parameter"><code>len</code></em> parameter for <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()"><code class="function">gst_fft_f32_new()</code></a>.
+</p>
+<p>
+The <em class="parameter"><code>len</code></em> parameter specifies the number of samples in the time domain that
+will be processed or generated. The number of samples in the frequency domain
+is <em class="parameter"><code>len</code></em>/2 + 1. To get n samples in the frequency domain use 2*n - 2 as <em class="parameter"><code>len</code></em>.
+</p>
+<p>
+Before performing the FFT on time domain data it usually makes sense
+to apply a window function to it. For this <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-window" title="gst_fft_f32_window ()"><code class="function">gst_fft_f32_window()</code></a> can comfortably
+be used.
+</p>
+<p>
+Be aware, that you can't simply run <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft" title="gst_fft_f32_inverse_fft ()"><code class="function">gst_fft_f32_inverse_fft()</code></a> on the
+resulting frequency data of <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft" title="gst_fft_f32_fft ()"><code class="function">gst_fft_f32_fft()</code></a> to get the original data back.
+The relation between them is iFFT (FFT (x)) = x * nfft where nfft is the
+length of the FFT. This also has to be taken into account when calculation
+the magnitude of the frequency data.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfftf32.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFFTF32"></a><h3>struct GstFFTF32</h3>
+<pre class="programlisting">struct GstFFTF32 {
+};
+</pre>
+<p>
+Instance structure for <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFFTF32Complex"></a><h3>struct GstFFTF32Complex</h3>
+<pre class="programlisting">struct GstFFTF32Complex {
+ gfloat r;
+ gfloat i;
+};
+</pre>
+<p>
+Data type for complex numbers composed of
+32 bit float.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> <em class="structfield"><code><a name="GstFFTF32Complex.r"></a>r</code></em>;</span></p></td>
+<td>Real part</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> <em class="structfield"><code><a name="GstFFTF32Complex.i"></a>i</code></em>;</span></p></td>
+<td>Imaginary part</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f32-new"></a><h3>gst_fft_f32_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="returnvalue">GstFFTF32</span></a> * gst_fft_f32_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);</pre>
+<p>
+This returns a new <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance with the given parameters. It makes
+sense to keep one instance for several calls for speed reasons.
+</p>
+<p>
+<em class="parameter"><code>len</code></em> must be even and to get the best performance a product of
+2, 3 and 5. To get the next number with this characteristics use
+<a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the FFT in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>inverse</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance should be used for the inverse FFT</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f32-fft"></a><h3>gst_fft_f32_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f32_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex"><span class="type">GstFFTF32Complex</span></a> *freqdata</code></em>);</pre>
+<p>
+This performs the FFT on <em class="parameter"><code>timedata</code></em> and puts the result in <em class="parameter"><code>freqdata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must have as many samples as specified with the <em class="parameter"><code>len</code></em> parameter while
+allocating the <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()"><code class="function">gst_fft_f32_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em>/2 + 1 <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex"><span class="type">GstFFTF32Complex</span></a> frequency
+domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Buffer of the samples in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the frequency domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f32-inverse-fft"></a><h3>gst_fft_f32_inverse_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f32_inverse_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex" title="struct GstFFTF32Complex"><span class="type">GstFFTF32Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>);</pre>
+<p>
+This performs the inverse FFT on <em class="parameter"><code>freqdata</code></em> and puts the result in <em class="parameter"><code>timedata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must have <em class="parameter"><code>len</code></em>/2 + 1 samples, where <em class="parameter"><code>len</code></em> is the parameter specified
+while allocating the <a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new" title="gst_fft_f32_new ()"><code class="function">gst_fft_f32_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em> time domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Buffer of the samples in the frequency domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the time domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f32-window"></a><h3>gst_fft_f32_window ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f32_window (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);</pre>
+<p>
+This calls the window function <em class="parameter"><code>window</code></em> on the <em class="parameter"><code>timedata</code></em> sample buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Time domain samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>window</code></em> :</span></p></td>
+<td>Window function to apply</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f32-free"></a><h3>gst_fft_f32_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f32_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> *self</code></em>);</pre>
+<p>
+This frees the memory allocated for <em class="parameter"><code>self</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf32.html#GstFFTF32" title="struct GstFFTF32"><span class="type">GstFFTF32</span></a> instance for this call</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstfftf64.html b/docs/libs/html/gst-plugins-base-libs-gstfftf64.html
new file mode 100644
index 0000000..85ef842
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstfftf64.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstfftf64</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="prev" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">
+<link rel="next" href="gstreamer-interfaces.html" title="Interfaces Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstfftf32.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-ffft.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-interfaces.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstfftf64.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstfftf64.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstfftf64"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstfftf64.top_of_page"></a>gstfftf64</span></h2>
+<p>gstfftf64 — FFT functions for 64 bit float samples</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstfftf64.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/fft/gstfftf64.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64">GstFFTF64</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex">GstFFTF64Complex</a>;
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="returnvalue">GstFFTF64</span></a> * <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()">gst_fft_f64_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-fft" title="gst_fft_f64_fft ()">gst_fft_f64_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex"><span class="type">GstFFTF64Complex</span></a> *freqdata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft" title="gst_fft_f64_inverse_fft ()">gst_fft_f64_inverse_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex"><span class="type">GstFFTF64Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-window" title="gst_fft_f64_window ()">gst_fft_f64_window</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free" title="gst_fft_f64_free ()">gst_fft_f64_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfftf64.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> provides a FFT implementation and related functions for
+64 bit float samples. To use this call <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()"><code class="function">gst_fft_f64_new()</code></a> for
+allocating a <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance with the appropiate parameters and
+then call <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-fft" title="gst_fft_f64_fft ()"><code class="function">gst_fft_f64_fft()</code></a> or <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft" title="gst_fft_f64_inverse_fft ()"><code class="function">gst_fft_f64_inverse_fft()</code></a> to perform the
+FFT or inverse FFT on a buffer of samples.
+</p>
+<p>
+After use free the <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free" title="gst_fft_f64_free ()"><code class="function">gst_fft_f64_free()</code></a>.
+</p>
+<p>
+For the best performance use <a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a> to get a
+number that is entirely a product of 2, 3 and 5 and use this as the
+<em class="parameter"><code>len</code></em> parameter for <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()"><code class="function">gst_fft_f64_new()</code></a>.
+</p>
+<p>
+The <em class="parameter"><code>len</code></em> parameter specifies the number of samples in the time domain that
+will be processed or generated. The number of samples in the frequency domain
+is <em class="parameter"><code>len</code></em>/2 + 1. To get n samples in the frequency domain use 2*n - 2 as <em class="parameter"><code>len</code></em>.
+</p>
+<p>
+Before performing the FFT on time domain data it usually makes sense
+to apply a window function to it. For this <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-window" title="gst_fft_f64_window ()"><code class="function">gst_fft_f64_window()</code></a> can comfortably
+be used.
+</p>
+<p>
+Be aware, that you can't simply run <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft" title="gst_fft_f32_inverse_fft ()"><code class="function">gst_fft_f32_inverse_fft()</code></a> on the
+resulting frequency data of <a class="link" href="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft" title="gst_fft_f32_fft ()"><code class="function">gst_fft_f32_fft()</code></a> to get the original data back.
+The relation between them is iFFT (FFT (x)) = x * nfft where nfft is the
+length of the FFT. This also has to be taken into account when calculation
+the magnitude of the frequency data.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstfftf64.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFFTF64"></a><h3>struct GstFFTF64</h3>
+<pre class="programlisting">struct GstFFTF64 {
+};
+</pre>
+<p>
+Instance structure for <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFFTF64Complex"></a><h3>struct GstFFTF64Complex</h3>
+<pre class="programlisting">struct GstFFTF64Complex {
+ gdouble r;
+ gdouble i;
+};
+</pre>
+<p>
+Data type for complex numbers composed of
+64 bit float.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GstFFTF64Complex.r"></a>r</code></em>;</span></p></td>
+<td>Real part</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GstFFTF64Complex.i"></a>i</code></em>;</span></p></td>
+<td>Imaginary part</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f64-new"></a><h3>gst_fft_f64_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="returnvalue">GstFFTF64</span></a> * gst_fft_f64_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);</pre>
+<p>
+This returns a new <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance with the given parameters. It makes
+sense to keep one instance for several calls for speed reasons.
+</p>
+<p>
+<em class="parameter"><code>len</code></em> must be even and to get the best performance a product of
+2, 3 and 5. To get the next number with this characteristics use
+<a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the FFT in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>inverse</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance should be used for the inverse FFT</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f64-fft"></a><h3>gst_fft_f64_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f64_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex"><span class="type">GstFFTF64Complex</span></a> *freqdata</code></em>);</pre>
+<p>
+This performs the FFT on <em class="parameter"><code>timedata</code></em> and puts the result in <em class="parameter"><code>freqdata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must have as many samples as specified with the <em class="parameter"><code>len</code></em> parameter while
+allocating the <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()"><code class="function">gst_fft_f64_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em>/2 + 1 <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex"><span class="type">GstFFTF64Complex</span></a> frequency
+domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Buffer of the samples in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the frequency domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f64-inverse-fft"></a><h3>gst_fft_f64_inverse_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f64_inverse_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex" title="struct GstFFTF64Complex"><span class="type">GstFFTF64Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>);</pre>
+<p>
+This performs the inverse FFT on <em class="parameter"><code>freqdata</code></em> and puts the result in <em class="parameter"><code>timedata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must have <em class="parameter"><code>len</code></em>/2 + 1 samples, where <em class="parameter"><code>len</code></em> is the parameter specified
+while allocating the <a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new" title="gst_fft_f64_new ()"><code class="function">gst_fft_f64_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em> time domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Buffer of the samples in the frequency domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the time domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f64-window"></a><h3>gst_fft_f64_window ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f64_window (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);</pre>
+<p>
+This calls the window function <em class="parameter"><code>window</code></em> on the <em class="parameter"><code>timedata</code></em> sample buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Time domain samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>window</code></em> :</span></p></td>
+<td>Window function to apply</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-f64-free"></a><h3>gst_fft_f64_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_f64_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> *self</code></em>);</pre>
+<p>
+This frees the memory allocated for <em class="parameter"><code>self</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstfftf64.html#GstFFTF64" title="struct GstFFTF64"><span class="type">GstFFTF64</span></a> instance for this call</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstffts16.html b/docs/libs/html/gst-plugins-base-libs-gstffts16.html
new file mode 100644
index 0000000..e8e2d46
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstffts16.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstffts16</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="prev" href="gst-plugins-base-libs-gstfft.html" title="gstfft">
+<link rel="next" href="gst-plugins-base-libs-gstffts32.html" title="gstffts32">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstfft.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-ffft.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstffts32.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstffts16.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstffts16.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstffts16"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstffts16.top_of_page"></a>gstffts16</span></h2>
+<p>gstffts16 — FFT functions for signed 16 bit integer samples</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstffts16.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/fft/gstffts16.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16">GstFFTS16</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex">GstFFTS16Complex</a>;
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="returnvalue">GstFFTS16</span></a> * <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()">gst_fft_s16_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft" title="gst_fft_s16_fft ()">gst_fft_s16_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex"><span class="type">GstFFTS16Complex</span></a> *freqdata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft" title="gst_fft_s16_inverse_fft ()">gst_fft_s16_inverse_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex"><span class="type">GstFFTS16Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-window" title="gst_fft_s16_window ()">gst_fft_s16_window</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-free" title="gst_fft_s16_free ()">gst_fft_s16_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstffts16.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> provides a FFT implementation and related functions for
+signed 16 bit integer samples. To use this call <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()"><code class="function">gst_fft_s16_new()</code></a> for
+allocating a <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance with the appropiate parameters and
+then call <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft" title="gst_fft_s16_fft ()"><code class="function">gst_fft_s16_fft()</code></a> or <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft" title="gst_fft_s16_inverse_fft ()"><code class="function">gst_fft_s16_inverse_fft()</code></a> to perform the
+FFT or inverse FFT on a buffer of samples.
+</p>
+<p>
+After use free the <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-free" title="gst_fft_s16_free ()"><code class="function">gst_fft_s16_free()</code></a>.
+</p>
+<p>
+For the best performance use <a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a> to get a
+number that is entirely a product of 2, 3 and 5 and use this as the
+<em class="parameter"><code>len</code></em> parameter for <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()"><code class="function">gst_fft_s16_new()</code></a>.
+</p>
+<p>
+The <em class="parameter"><code>len</code></em> parameter specifies the number of samples in the time domain that
+will be processed or generated. The number of samples in the frequency domain
+is <em class="parameter"><code>len</code></em>/2 + 1. To get n samples in the frequency domain use 2*n - 2 as <em class="parameter"><code>len</code></em>.
+</p>
+<p>
+Before performing the FFT on time domain data it usually makes sense
+to apply a window function to it. For this <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-window" title="gst_fft_s16_window ()"><code class="function">gst_fft_s16_window()</code></a> can comfortably
+be used.
+</p>
+<p>
+Be aware, that you can't simply run <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft" title="gst_fft_s16_inverse_fft ()"><code class="function">gst_fft_s16_inverse_fft()</code></a> on the
+resulting frequency data of <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft" title="gst_fft_s16_fft ()"><code class="function">gst_fft_s16_fft()</code></a> to get the original data back.
+The relation between them is iFFT (FFT (x)) = x / nfft where nfft is the
+length of the FFT. This also has to be taken into account when calculation
+the magnitude of the frequency data.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstffts16.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFFTS16"></a><h3>struct GstFFTS16</h3>
+<pre class="programlisting">struct GstFFTS16 {
+};
+</pre>
+<p>
+Instance structure for <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFFTS16Complex"></a><h3>struct GstFFTS16Complex</h3>
+<pre class="programlisting">struct GstFFTS16Complex {
+ gint16 r;
+ gint16 i;
+};
+</pre>
+<p>
+Data type for complex numbers composed of
+signed 16 bit integers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> <em class="structfield"><code><a name="GstFFTS16Complex.r"></a>r</code></em>;</span></p></td>
+<td>Real part</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> <em class="structfield"><code><a name="GstFFTS16Complex.i"></a>i</code></em>;</span></p></td>
+<td>Imaginary part</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s16-new"></a><h3>gst_fft_s16_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="returnvalue">GstFFTS16</span></a> * gst_fft_s16_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);</pre>
+<p>
+This returns a new <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance with the given parameters. It makes
+sense to keep one instance for several calls for speed reasons.
+</p>
+<p>
+<em class="parameter"><code>len</code></em> must be even and to get the best performance a product of
+2, 3 and 5. To get the next number with this characteristics use
+<a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the FFT in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>inverse</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance should be used for the inverse FFT</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s16-fft"></a><h3>gst_fft_s16_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s16_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex"><span class="type">GstFFTS16Complex</span></a> *freqdata</code></em>);</pre>
+<p>
+This performs the FFT on <em class="parameter"><code>timedata</code></em> and puts the result in <em class="parameter"><code>freqdata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must have as many samples as specified with the <em class="parameter"><code>len</code></em> parameter while
+allocating the <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()"><code class="function">gst_fft_s16_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em>/2 + 1 <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex"><span class="type">GstFFTS16Complex</span></a> frequency
+domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Buffer of the samples in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the frequency domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s16-inverse-fft"></a><h3>gst_fft_s16_inverse_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s16_inverse_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex" title="struct GstFFTS16Complex"><span class="type">GstFFTS16Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>);</pre>
+<p>
+This performs the inverse FFT on <em class="parameter"><code>freqdata</code></em> and puts the result in <em class="parameter"><code>timedata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must have <em class="parameter"><code>len</code></em>/2 + 1 samples, where <em class="parameter"><code>len</code></em> is the parameter specified
+while allocating the <a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new" title="gst_fft_s16_new ()"><code class="function">gst_fft_s16_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em> time domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Buffer of the samples in the frequency domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the time domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s16-window"></a><h3>gst_fft_s16_window ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s16_window (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);</pre>
+<p>
+This calls the window function <em class="parameter"><code>window</code></em> on the <em class="parameter"><code>timedata</code></em> sample buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Time domain samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>window</code></em> :</span></p></td>
+<td>Window function to apply</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s16-free"></a><h3>gst_fft_s16_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s16_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> *self</code></em>);</pre>
+<p>
+This frees the memory allocated for <em class="parameter"><code>self</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts16.html#GstFFTS16" title="struct GstFFTS16"><span class="type">GstFFTS16</span></a> instance for this call</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstffts32.html b/docs/libs/html/gst-plugins-base-libs-gstffts32.html
new file mode 100644
index 0000000..0da33e9
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstffts32.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstffts32</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-ffft.html" title="FFT Library">
+<link rel="prev" href="gst-plugins-base-libs-gstffts16.html" title="gstffts16">
+<link rel="next" href="gst-plugins-base-libs-gstfftf32.html" title="gstfftf32">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstffts16.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-ffft.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstfftf32.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstffts32.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstffts32.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstffts32"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstffts32.top_of_page"></a>gstffts32</span></h2>
+<p>gstffts32 — FFT functions for signed 32 bit integer samples</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstffts32.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/fft/gstffts32.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32">GstFFTS32</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex">GstFFTS32Complex</a>;
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="returnvalue">GstFFTS32</span></a> * <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()">gst_fft_s32_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft" title="gst_fft_s32_fft ()">gst_fft_s32_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex"><span class="type">GstFFTS32Complex</span></a> *freqdata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft" title="gst_fft_s32_inverse_fft ()">gst_fft_s32_inverse_fft</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex"><span class="type">GstFFTS32Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-window" title="gst_fft_s32_window ()">gst_fft_s32_window</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-free" title="gst_fft_s32_free ()">gst_fft_s32_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstffts32.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> provides a FFT implementation and related functions for
+signed 32 bit integer samples. To use this call <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()"><code class="function">gst_fft_s32_new()</code></a> for
+allocating a <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance with the appropiate parameters and
+then call <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft" title="gst_fft_s32_fft ()"><code class="function">gst_fft_s32_fft()</code></a> or <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft" title="gst_fft_s32_inverse_fft ()"><code class="function">gst_fft_s32_inverse_fft()</code></a> to perform the
+FFT or inverse FFT on a buffer of samples.
+</p>
+<p>
+After use free the <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-free" title="gst_fft_s32_free ()"><code class="function">gst_fft_s32_free()</code></a>.
+</p>
+<p>
+For the best performance use <a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a> to get a
+number that is entirely a product of 2, 3 and 5 and use this as the
+<em class="parameter"><code>len</code></em> parameter for <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()"><code class="function">gst_fft_s32_new()</code></a>.
+</p>
+<p>
+The <em class="parameter"><code>len</code></em> parameter specifies the number of samples in the time domain that
+will be processed or generated. The number of samples in the frequency domain
+is <em class="parameter"><code>len</code></em>/2 + 1. To get n samples in the frequency domain use 2*n - 2 as <em class="parameter"><code>len</code></em>.
+</p>
+<p>
+Before performing the FFT on time domain data it usually makes sense
+to apply a window function to it. For this <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-window" title="gst_fft_s32_window ()"><code class="function">gst_fft_s32_window()</code></a> can comfortably
+be used.
+</p>
+<p>
+Be aware, that you can't simply run <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft" title="gst_fft_s32_inverse_fft ()"><code class="function">gst_fft_s32_inverse_fft()</code></a> on the
+resulting frequency data of <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft" title="gst_fft_s32_fft ()"><code class="function">gst_fft_s32_fft()</code></a> to get the original data back.
+The relation between them is iFFT (FFT (x)) = x / nfft where nfft is the
+length of the FFT. This also has to be taken into account when calculation
+the magnitude of the frequency data.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstffts32.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFFTS32"></a><h3>struct GstFFTS32</h3>
+<pre class="programlisting">struct GstFFTS32 {
+};
+</pre>
+<p>
+Instance structure for <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFFTS32Complex"></a><h3>struct GstFFTS32Complex</h3>
+<pre class="programlisting">struct GstFFTS32Complex {
+ gint32 r;
+ gint32 i;
+};
+</pre>
+<p>
+Data type for complex numbers composed of
+signed 32 bit integers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> <em class="structfield"><code><a name="GstFFTS32Complex.r"></a>r</code></em>;</span></p></td>
+<td>Real part</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> <em class="structfield"><code><a name="GstFFTS32Complex.i"></a>i</code></em>;</span></p></td>
+<td>Imaginary part</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s32-new"></a><h3>gst_fft_s32_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="returnvalue">GstFFTS32</span></a> * gst_fft_s32_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> inverse</code></em>);</pre>
+<p>
+This returns a new <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance with the given parameters. It makes
+sense to keep one instance for several calls for speed reasons.
+</p>
+<p>
+<em class="parameter"><code>len</code></em> must be even and to get the best performance a product of
+2, 3 and 5. To get the next number with this characteristics use
+<a class="link" href="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length" title="gst_fft_next_fast_length ()"><code class="function">gst_fft_next_fast_length()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the FFT in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>inverse</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance should be used for the inverse FFT</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s32-fft"></a><h3>gst_fft_s32_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s32_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex"><span class="type">GstFFTS32Complex</span></a> *freqdata</code></em>);</pre>
+<p>
+This performs the FFT on <em class="parameter"><code>timedata</code></em> and puts the result in <em class="parameter"><code>freqdata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must have as many samples as specified with the <em class="parameter"><code>len</code></em> parameter while
+allocating the <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()"><code class="function">gst_fft_s32_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em>/2 + 1 <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex"><span class="type">GstFFTS32Complex</span></a> frequency
+domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Buffer of the samples in the time domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the frequency domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s32-inverse-fft"></a><h3>gst_fft_s32_inverse_fft ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s32_inverse_fft (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex" title="struct GstFFTS32Complex"><span class="type">GstFFTS32Complex</span></a> *freqdata</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>);</pre>
+<p>
+This performs the inverse FFT on <em class="parameter"><code>freqdata</code></em> and puts the result in <em class="parameter"><code>timedata</code></em>.
+</p>
+<p>
+<em class="parameter"><code>freqdata</code></em> must have <em class="parameter"><code>len</code></em>/2 + 1 samples, where <em class="parameter"><code>len</code></em> is the parameter specified
+while allocating the <a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance with <a class="link" href="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new" title="gst_fft_s32_new ()"><code class="function">gst_fft_s32_new()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>timedata</code></em> must be large enough to hold <em class="parameter"><code>len</code></em> time domain samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>freqdata</code></em> :</span></p></td>
+<td>Buffer of the samples in the frequency domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Target buffer for the samples in the time domain</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s32-window"></a><h3>gst_fft_s32_window ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s32_window (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *timedata</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstfft.html#GstFFTWindow" title="enum GstFFTWindow"><span class="type">GstFFTWindow</span></a> window</code></em>);</pre>
+<p>
+This calls the window function <em class="parameter"><code>window</code></em> on the <em class="parameter"><code>timedata</code></em> sample buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance for this call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedata</code></em> :</span></p></td>
+<td>Time domain samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>window</code></em> :</span></p></td>
+<td>Window function to apply</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-fft-s32-free"></a><h3>gst_fft_s32_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_fft_s32_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> *self</code></em>);</pre>
+<p>
+This frees the memory allocated for <em class="parameter"><code>self</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstffts32.html#GstFFTS32" title="struct GstFFTS32"><span class="type">GstFFTS32</span></a> instance for this call</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstmixer.html b/docs/libs/html/gst-plugins-base-libs-gstmixer.html
new file mode 100644
index 0000000..a14a685
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstmixer.html
@@ -0,0 +1,963 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstmixer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstcolorbalancechannel.html" title="gstcolorbalancechannel">
+<link rel="next" href="gst-plugins-base-libs-gstmixeroptions.html" title="gstmixeroptions">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstcolorbalancechannel.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstmixeroptions.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstmixer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixer.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixer.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixer.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstmixer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstmixer.top_of_page"></a>gstmixer</span></h2>
+<p>gstmixer — Interface for elements that provide mixer operations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstmixer.synopsis"></a><h2>Synopsis</h2>
+<a name="GstMixer"></a><pre class="synopsis">
+#include &lt;gst/interfaces/mixer.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-struct" title="GstMixer">GstMixer</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType">GstMixerType</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerFlags" title="enum GstMixerFlags">GstMixerFlags</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerMessageType" title="enum GstMixerMessageType">GstMixerMessageType</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-list-tracks" title="gst_mixer_list_tracks ()">gst_mixer_list_tracks</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-volume" title="gst_mixer_get_volume ()">gst_mixer_get_volume</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-volume" title="gst_mixer_set_volume ()">gst_mixer_set_volume</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-mute" title="gst_mixer_set_mute ()">gst_mixer_set_mute</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-record" title="gst_mixer_set_record ()">gst_mixer_set_record</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> record</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-option" title="gst_mixer_set_option ()">gst_mixer_set_option</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-mute-toggled" title="gst_mixer_mute_toggled ()">gst_mixer_mute_toggled</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-record-toggled" title="gst_mixer_record_toggled ()">gst_mixer_record_toggled</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> record</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-volume-changed" title="gst_mixer_volume_changed ()">gst_mixer_volume_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-option-changed" title="gst_mixer_option_changed ()">gst_mixer_option_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-options-list-changed" title="gst_mixer_options_list_changed ()">gst_mixer_options_list_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-option" title="gst_mixer_get_option ()">gst_mixer_get_option</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-mixer-changed" title="gst_mixer_mixer_changed ()">gst_mixer_mixer_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerFlags" title="enum GstMixerFlags"><span class="returnvalue">GstMixerFlags</span></a> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-flags" title="gst_mixer_get_mixer_flags ()">gst_mixer_get_mixer_flags</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType"><span class="returnvalue">GstMixerType</span></a> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-type" title="gst_mixer_get_mixer_type ()">gst_mixer_get_mixer_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerMessageType" title="enum GstMixerMessageType"><span class="returnvalue">GstMixerMessageType</span></a> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-get-type" title="gst_mixer_message_get_type ()">gst_mixer_message_get_type</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-mute-toggled" title="gst_mixer_message_parse_mute_toggled ()">gst_mixer_message_parse_mute_toggled</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *mute</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-option-changed" title="gst_mixer_message_parse_option_changed ()">gst_mixer_message_parse_option_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> **options</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-record-toggled" title="gst_mixer_message_parse_record_toggled ()">gst_mixer_message_parse_record_toggled</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *record</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-volume-changed" title="gst_mixer_message_parse_volume_changed ()">gst_mixer_message_parse_volume_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> **volumes</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *num_channels</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-options-list-changed" title="gst_mixer_message_parse_options_list_changed ()">gst_mixer_message_parse_options_list_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> **options</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstMixer
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-mute-toggled" title='The "mute-toggled" signal'>mute-toggled</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-option-changed" title='The "option-changed" signal'>option-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-record-toggled" title='The "record-toggled" signal'>record-toggled</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer-volume-changed" title='The "volume-changed" signal'>volume-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.description"></a><h2>Description</h2>
+<p>
+Basic interface for hardware mixer controls.
+</p>
+<p>
+Applications rarely need to use this interface, it is provided mainly
+for system-level mixer applets and the like. Volume control in playback
+applications should be done using a <code class="classname">volume</code>
+element or, if available, using the <span class="quote">“<span class="quote">volume</span>”</span> property of
+the audio sink element used (as provided by <code class="classname">pulsesink</code>
+for example), or even better: just use the <code class="classname">playbin2</code>
+element's <span class="quote">“<span class="quote">volume</span>”</span> property.
+</p>
+<p>
+Usage: In order to use the <code class="classname">GstMixer</code> interface, the
+element needs to be at least in READY state (so that the element has opened
+the mixer device). Once the element has been set to READY state or higher,
+it can be cast to a <code class="classname">GstMixer</code> using the GST_MIXER
+macro (in C) and the mixer API can be used.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMixer-struct"></a><h3>GstMixer</h3>
+<pre class="programlisting">typedef struct _GstMixer GstMixer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerType"></a><h3>enum GstMixerType</h3>
+<pre class="programlisting">typedef enum {
+ GST_MIXER_HARDWARE,
+ GST_MIXER_SOFTWARE
+} GstMixerType;
+</pre>
+<p>
+Mixer classification.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MIXER-HARDWARE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_HARDWARE</code></span></p></td>
+<td>mixing is implemented with dedicated hardware.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-SOFTWARE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_SOFTWARE</code></span></p></td>
+<td>mixing is implemented via software processing.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerFlags"></a><h3>enum GstMixerFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_MIXER_FLAG_NONE = 0,
+ GST_MIXER_FLAG_AUTO_NOTIFICATIONS = (1&lt;&lt;0),
+ GST_MIXER_FLAG_HAS_WHITELIST = (1&lt;&lt;1),
+ GST_MIXER_FLAG_GROUPING = (1&lt;&lt;2),
+} GstMixerFlags;
+</pre>
+<p>
+Flags indicating which optional features are supported by a mixer
+implementation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MIXER-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_FLAG_NONE</code></span></p></td>
+<td>No flags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-FLAG-AUTO-NOTIFICATIONS:CAPS"></a><span class="term"><code class="literal">GST_MIXER_FLAG_AUTO_NOTIFICATIONS</code></span></p></td>
+<td>The mixer implementation automatically
+ sends notification messages.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-FLAG-HAS-WHITELIST:CAPS"></a><span class="term"><code class="literal">GST_MIXER_FLAG_HAS_WHITELIST</code></span></p></td>
+<td>The mixer implementation flags tracks that
+ should be displayed by default (whitelisted). Since: 0.10.23
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-FLAG-GROUPING:CAPS"></a><span class="term"><code class="literal">GST_MIXER_FLAG_GROUPING</code></span></p></td>
+<td>The mixer implementation will leave some controls
+ marked without either input or output. Controls marked as input or
+ output should be grouped with input &amp; output sliders, even if they
+ are options or bare switches. Since: 0.10.23
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerMessageType"></a><h3>enum GstMixerMessageType</h3>
+<pre class="programlisting">typedef enum {
+ GST_MIXER_MESSAGE_INVALID,
+ GST_MIXER_MESSAGE_MUTE_TOGGLED,
+ GST_MIXER_MESSAGE_RECORD_TOGGLED,
+ GST_MIXER_MESSAGE_VOLUME_CHANGED,
+ GST_MIXER_MESSAGE_OPTION_CHANGED,
+ GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED,
+ GST_MIXER_MESSAGE_MIXER_CHANGED
+} GstMixerMessageType;
+</pre>
+<p>
+An enumeration for the type of a GstMixer message received on the bus
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_INVALID</code></span></p></td>
+<td>Not a GstMixer message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-MUTE-TOGGLED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_MUTE_TOGGLED</code></span></p></td>
+<td>A mute-toggled GstMixer message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-RECORD-TOGGLED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_RECORD_TOGGLED</code></span></p></td>
+<td>A record-toggled GstMixer message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-VOLUME-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_VOLUME_CHANGED</code></span></p></td>
+<td>A volume-changed GstMixer message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-OPTION-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_OPTION_CHANGED</code></span></p></td>
+<td>An option-changed GstMixer message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-OPTIONS-LIST-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED</code></span></p></td>
+<td>An options-list-changed
+ GstMixer message, posted when the list of available options for a
+ GstMixerOptions object has changed (Since: 0.10.18)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-MESSAGE-MIXER-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_MIXER_MESSAGE_MIXER_CHANGED</code></span></p></td>
+<td>A mixer-changed GstMixer message, posted
+ when the list of available mixer tracks has changed. The application
+ should re-build its interface in this case (Since: 0.10.18)
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-list-tracks"></a><h3>gst_mixer_list_tracks ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_mixer_list_tracks (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);</pre>
+<p>
+Returns a list of available tracks for this mixer/element. Note
+that it is allowed for sink (output) elements to only provide
+the output tracks in this list. Likewise, for sources (inputs),
+it is allowed to only provide input elements in this list.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to get the tracks from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> consisting of zero or more <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTracks</span></a>.
+The list is owned by the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> instance and must not be freed
+or modified.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-get-volume"></a><h3>gst_mixer_get_volume ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_get_volume (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);</pre>
+<p>
+Get the current volume(s) on the given track.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the GstMixerTrack to get the volume from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volumes</code></em> :</span></p></td>
+<td>a pre-allocated array of integers (of size
+track-&gt;num_channels) to store the current volume
+of each channel in the given track in.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-set-volume"></a><h3>gst_mixer_set_volume ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_set_volume (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);</pre>
+<p>
+Sets the volume on each channel in a track. Short note about
+naming: a track is defined as one separate stream owned by
+the mixer/element, such as 'Line-in' or 'Microphone'. A
+channel is said to be a mono-stream inside this track. A
+stereo track thus contains two channels.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> to set the volume on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volumes</code></em> :</span></p></td>
+<td>an array of integers (of size track-&gt;num_channels)
+that gives the wanted volume for each channel in
+this track.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-set-mute"></a><h3>gst_mixer_set_mute ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_set_mute (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);</pre>
+<p>
+Mutes or unmutes the given channel. To find out whether a
+track is currently muted, use <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS" title="GST_MIXER_TRACK_HAS_FLAG()"><code class="function">GST_MIXER_TRACK_HAS_FLAG()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> to operate on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mute</code></em> :</span></p></td>
+<td>a boolean value indicating whether to turn on or off
+muting.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-set-record"></a><h3>gst_mixer_set_record ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_set_record (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> record</code></em>);</pre>
+<p>
+Enables or disables recording on the given track. Note that
+this is only possible on input tracks, not on output tracks
+(see <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS" title="GST_MIXER_TRACK_HAS_FLAG()"><code class="function">GST_MIXER_TRACK_HAS_FLAG()</code></a> and the GST_MIXER_TRACK_INPUT
+flag).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> to operate on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>record</code></em> :</span></p></td>
+<td>a boolean value that indicates whether to turn on
+or off recording.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-set-option"></a><h3>gst_mixer_set_option ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_set_option (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Sets a name/value option in the mixer to the requested value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the optionlist.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>opts</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> that we operate on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>The requested new option value.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-mute-toggled"></a><h3>gst_mixer_mute_toggled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_mute_toggled (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the given track
+has changed mute state.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the GstMixerTrack that has change mute state.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mute</code></em> :</span></p></td>
+<td>the new state of the mute flag on the track</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-record-toggled"></a><h3>gst_mixer_record_toggled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_record_toggled (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> record</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the given track
+has changed recording state.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the GstMixerTrack that has changed recording state.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>record</code></em> :</span></p></td>
+<td>the new state of the record flag on the track</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-volume-changed"></a><h3>gst_mixer_volume_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_volume_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *volumes</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the volume(s) for the
+given track have changed.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the track</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>the GstMixerTrack that has changed.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volumes</code></em> :</span></p></td>
+<td>Array of volume values, one per channel on the mixer track.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-option-changed"></a><h3>gst_mixer_option_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_option_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the given options
+object has changed state.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the options</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>opts</code></em> :</span></p></td>
+<td>the GstMixerOptions that has changed value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the new value of the GstMixerOptions.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-options-list-changed"></a><h3>gst_mixer_options_list_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_options_list_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the list of possible
+options of a given options object has changed.
+</p>
+<p>
+The new options are not contained in the message on purpose. Applications
+should call <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values" title="gst_mixer_options_get_values ()"><code class="function">gst_mixer_options_get_values()</code></a> on <em class="parameter"><code>opts</code></em> to make <em class="parameter"><code>opts</code></em> update
+its internal state and obtain the new list of values.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus
+for this to work.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the options</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>opts</code></em> :</span></p></td>
+<td>the GstMixerOptions whose list of values has changed</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-get-option"></a><h3>gst_mixer_get_option ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_mixer_get_option (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *opts</code></em>);</pre>
+<p>
+Get the current value of a name/value option in the mixer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the optionlist.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>opts</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> that we operate on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>current value of the name/value option.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-mixer-changed"></a><h3>gst_mixer_mixer_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_mixer_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);</pre>
+<p>
+This function is called by the mixer implementation to produce
+a notification message on the bus indicating that the list of available
+mixer tracks for a given mixer object has changed. Applications should
+rebuild their interface when they receive this message.
+</p>
+<p>
+This function only works for GstElements that are implementing the
+GstMixer interface, and the element needs to have been provided a bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) which has changed</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-get-mixer-flags"></a><h3>gst_mixer_get_mixer_flags ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerFlags" title="enum GstMixerFlags"><span class="returnvalue">GstMixerFlags</span></a> gst_mixer_get_mixer_flags (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);</pre>
+<p>
+Get the set of supported flags for this mixer implementation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> implementation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A set of or-ed GstMixerFlags for supported features.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-get-mixer-type"></a><h3>gst_mixer_get_mixer_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType"><span class="returnvalue">GstMixerType</span></a> gst_mixer_get_mixer_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *mixer</code></em>);</pre>
+<p>
+Get the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType"><span class="type">GstMixerType</span></a> of this mixer implementation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> implementation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A the <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerType" title="enum GstMixerType"><span class="type">GstMixerType</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-get-type"></a><h3>gst_mixer_message_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixerMessageType" title="enum GstMixerMessageType"><span class="returnvalue">GstMixerMessageType</span></a> gst_mixer_message_get_type (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Check a bus message to see if it is a GstMixer notification
+message and return the GstMixerMessageType identifying which
+type of notification it is.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A GstMessage to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The type of the GstMixerMessage, or GST_MIXER_MESSAGE_INVALID
+if the message is not a GstMixer notification.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-parse-mute-toggled"></a><h3>gst_mixer_message_parse_mute_toggled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_message_parse_mute_toggled
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *mute</code></em>);</pre>
+<p>
+Extracts the contents of a mute-toggled bus message. Reads
+the GstMixerTrack that has changed, and the new value of the mute
+flag.
+</p>
+<p>
+The GstMixerTrack remains valid until the message is freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A mute-toggled change notification message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>Pointer to hold a GstMixerTrack object, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mute</code></em> :</span></p></td>
+<td>A pointer to a gboolean variable, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-parse-option-changed"></a><h3>gst_mixer_message_parse_option_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_message_parse_option_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> **options</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>);</pre>
+<p>
+Extracts the GstMixerOptions and new value from a option-changed bus notification
+message.
+</p>
+<p>
+The options and value returned remain valid until the message is freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A volume-changed change notification message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>options</code></em> :</span></p></td>
+<td>Pointer to hold a GstMixerOptions object, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>Result location to receive the new options value, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-parse-record-toggled"></a><h3>gst_mixer_message_parse_record_toggled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_message_parse_record_toggled
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *record</code></em>);</pre>
+<p>
+Extracts the contents of a record-toggled bus message. Reads
+the GstMixerTrack that has changed, and the new value of the
+recording flag.
+</p>
+<p>
+The GstMixerTrack remains valid until the message is freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A record-toggled change notification message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>Pointer to hold a GstMixerTrack object, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>record</code></em> :</span></p></td>
+<td>A pointer to a gboolean variable, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-parse-volume-changed"></a><h3>gst_mixer_message_parse_volume_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_message_parse_volume_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> **track</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> **volumes</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *num_channels</code></em>);</pre>
+<p>
+Parses a volume-changed notification message and extracts the track object
+it refers to, as well as an array of volumes and the size of the volumes array.
+</p>
+<p>
+The track object remains valid until the message is freed.
+</p>
+<p>
+The caller must free the array returned in the volumes parameter using g_free
+when they are done with it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A volume-changed change notification message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>track</code></em> :</span></p></td>
+<td>Pointer to hold a GstMixerTrack object, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volumes</code></em> :</span></p></td>
+<td>A pointer to receive an array of gint values, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num_channels</code></em> :</span></p></td>
+<td>Result location to receive the number of channels, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-message-parse-options-list-changed"></a><h3>gst_mixer_message_parse_options_list_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mixer_message_parse_options_list_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> **options</code></em>);</pre>
+<p>
+Extracts the GstMixerOptions whose value list has changed from an
+options-list-changed bus notification message.
+</p>
+<p>
+The options object returned remains valid until the message is freed. You
+do not need to unref it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A volume-changed change notification message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>options</code></em> :</span></p></td>
+<td>Pointer to hold a GstMixerOptions object, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstMixer-mute-toggled"></a><h3>The <code class="literal">"mute-toggled"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *gstmixer,
+ <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixer-option-changed"></a><h3>The <code class="literal">"option-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *gstmixer,
+ <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixer-record-toggled"></a><h3>The <code class="literal">"record-toggled"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *gstmixer,
+ <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixer-volume-changed"></a><h3>The <code class="literal">"volume-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer"><span class="type">GstMixer</span></a> *gstmixer,
+ <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack"><span class="type">GstMixerTrack</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixer.see-also"></a><h2>See Also</h2>
+alsamixer, oss4mixer, sunaudiomixer
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstmixeroptions.html b/docs/libs/html/gst-plugins-base-libs-gstmixeroptions.html
new file mode 100644
index 0000000..8180f78
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstmixeroptions.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstmixeroptions</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstmixer.html" title="gstmixer">
+<link rel="next" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstmixer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstmixertrack.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstmixeroptions.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixeroptions.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixeroptions.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstmixeroptions"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstmixeroptions.top_of_page"></a>gstmixeroptions</span></h2>
+<p>gstmixeroptions — Multi-option mixer control</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstmixeroptions.synopsis"></a><h2>Synopsis</h2>
+<a name="GstMixerOptions"></a><pre class="synopsis">
+#include &lt;gst/interfaces/mixer.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions-struct" title="struct GstMixerOptions">GstMixerOptions</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values" title="gst_mixer_options_get_values ()">gst_mixer_options_get_values</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *mixer_options</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixeroptions.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack">GstMixerTrack</a>
+ +----GstMixerOptions
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixeroptions.description"></a><h2>Description</h2>
+<p>
+Mixer control object that allows switching between multiple options.
+Note that <code class="classname">GstMixerOptions</code> is a subclass of
+<code class="classname">GstMixerTrack</code>.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixeroptions.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMixerOptions-struct"></a><h3>struct GstMixerOptions</h3>
+<pre class="programlisting">struct GstMixerOptions {
+ /* list of strings (do not access directly) (FIXME 0.11: make private) */
+ GList *values;
+};
+</pre>
+<p>
+Mixer control object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *<em class="structfield"><code><a name="GstMixerOptions-struct.values"></a>values</code></em>;</span></p></td>
+<td>List of option strings. Do not access this member directly,
+always use <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values" title="gst_mixer_options_get_values ()"><code class="function">gst_mixer_options_get_values()</code></a> instead.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mixer-options-get-values"></a><h3>gst_mixer_options_get_values ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_mixer_options_get_values (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> *mixer_options</code></em>);</pre>
+<p>
+Get the values for the mixer option.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mixer_options</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions"><span class="type">GstMixerOptions</span></a> item that owns the values.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of strings with all the possible values for the mixer
+option. You must not free or modify the list or its contents, it belongs
+to the <em class="parameter"><code>mixer_options</code></em> object.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixeroptions.see-also"></a><h2>See Also</h2>
+GstMixer, GstMixerTrack
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstmixertrack.html b/docs/libs/html/gst-plugins-base-libs-gstmixertrack.html
new file mode 100644
index 0000000..3751f3d
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstmixertrack.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstmixertrack</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstmixeroptions.html" title="gstmixeroptions">
+<link rel="next" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstmixeroptions.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstnavigation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstmixertrack.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixertrack.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixertrack.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmixertrack.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstmixertrack"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstmixertrack.top_of_page"></a>gstmixertrack</span></h2>
+<p>gstmixertrack — Basic mixer control object (volume slider, switch)</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstmixertrack.synopsis"></a><h2>Synopsis</h2>
+<a name="GstMixerTrack"></a><pre class="synopsis">
+#include &lt;gst/interfaces/mixer.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack-struct" title="struct GstMixerTrack">GstMixerTrack</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrackFlags" title="enum GstMixerTrackFlags">GstMixerTrackFlags</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS" title="GST_MIXER_TRACK_HAS_FLAG()">GST_MIXER_TRACK_HAS_FLAG</a> (channel,
+ flag)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstMixerTrack
+ +----<a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions">GstMixerOptions</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--flags" title='The "flags" property'>flags</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--index" title='The "index" property'>index</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write / Construct Only
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--label" title='The "label" property'>label</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--max-volume" title='The "max-volume" property'>max-volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--min-volume" title='The "min-volume" property'>min-volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--num-channels" title='The "num-channels" property'>num-channels</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--untranslated-label" title='The "untranslated-label" property'>untranslated-label</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.description"></a><h2>Description</h2>
+<p>
+Basic mixer control object (note that it is a GObject and not a GstObject).
+</p>
+<p>
+A mixer track represents a single slider control of none, one or more
+channels. A mixer track with no channels is usually interpreted as a
+on/off switch control.
+</p>
+<p>
+Note the presence of both min_volume and max_volume fields. Applications
+must not assume that min_volume is 0 or max_volume is any particular
+value.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMixerTrack-struct"></a><h3>struct GstMixerTrack</h3>
+<pre class="programlisting">struct GstMixerTrack;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrackFlags"></a><h3>enum GstMixerTrackFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_MIXER_TRACK_INPUT = (1&lt;&lt;0),
+ GST_MIXER_TRACK_OUTPUT = (1&lt;&lt;1),
+ GST_MIXER_TRACK_MUTE = (1&lt;&lt;2),
+ GST_MIXER_TRACK_RECORD = (1&lt;&lt;3),
+ GST_MIXER_TRACK_MASTER = (1&lt;&lt;4),
+ GST_MIXER_TRACK_SOFTWARE = (1&lt;&lt;5),
+ GST_MIXER_TRACK_NO_RECORD = (1&lt;&lt;6),
+ GST_MIXER_TRACK_NO_MUTE = (1&lt;&lt;7),
+ GST_MIXER_TRACK_WHITELIST = (1&lt;&lt;8),
+ GST_MIXER_TRACK_READONLY = (1&lt;&lt;9),
+ GST_MIXER_TRACK_WRITEONLY = (1&lt;&lt;10)
+} GstMixerTrackFlags;
+</pre>
+<p>
+Mixer track flags.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-INPUT:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_INPUT</code></span></p></td>
+<td>mixer track is for input
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-OUTPUT:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_OUTPUT</code></span></p></td>
+<td>mixer track is for output
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-MUTE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_MUTE</code></span></p></td>
+<td>input or output is muted
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-RECORD:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_RECORD</code></span></p></td>
+<td>input is audible in speakers attached to output
+ (for <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-INPUT:CAPS"><span class="type">GST_MIXER_TRACK_INPUT</span></a> mixer tracks only)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-MASTER:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_MASTER</code></span></p></td>
+<td>this mixer track is likely to be the master control
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-SOFTWARE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_SOFTWARE</code></span></p></td>
+<td>mixer track's' volume control is implemented
+ in software (as opposed to a hardware control)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-NO-RECORD:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_NO_RECORD</code></span></p></td>
+<td>input track lacks support for recordable.
+ Since: 0.10.23
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-NO-MUTE:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_NO_MUTE</code></span></p></td>
+<td>play track doesn't support mute. Since: 0.10.23
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-WHITELIST:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_WHITELIST</code></span></p></td>
+<td>track should be displayed "by default" in apps.
+ Since: 0.10.23
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-READONLY:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_READONLY</code></span></p></td>
+<td>track is read-only. Since: 0.10.25
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MIXER-TRACK-WRITEONLY:CAPS"></a><span class="term"><code class="literal">GST_MIXER_TRACK_WRITEONLY</code></span></p></td>
+<td>track is write-only. Since: 0.10.25
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MIXER-TRACK-HAS-FLAG:CAPS"></a><h3>GST_MIXER_TRACK_HAS_FLAG()</h3>
+<pre class="programlisting">#define GST_MIXER_TRACK_HAS_FLAG(channel, flag)</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstMixerTrack--flags"></a><h3>The <code class="literal">"flags"</code> property</h3>
+<pre class="programlisting"> "flags" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Flags indicating the type of mixer track.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--index"></a><h3>The <code class="literal">"index"</code> property</h3>
+<pre class="programlisting"> "index" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write / Construct Only</pre>
+<p>
+Index of the mixer track, if available. Mixer track implementations
+must set this at construct time. This can be used to discern between
+multiple tracks with identical labels.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--label"></a><h3>The <code class="literal">"label"</code> property</h3>
+<pre class="programlisting"> "label" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>The label assigned to the track (may be translated).</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--max-volume"></a><h3>The <code class="literal">"max-volume"</code> property</h3>
+<pre class="programlisting"> "max-volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read</pre>
+<p>The maximum possible volume level.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--min-volume"></a><h3>The <code class="literal">"min-volume"</code> property</h3>
+<pre class="programlisting"> "min-volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read</pre>
+<p>The minimum possible volume level.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--num-channels"></a><h3>The <code class="literal">"num-channels"</code> property</h3>
+<pre class="programlisting"> "num-channels" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read</pre>
+<p>The number of channels contained within the track.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMixerTrack--untranslated-label"></a><h3>The <code class="literal">"untranslated-label"</code> property</h3>
+<pre class="programlisting"> "untranslated-label" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write / Construct Only</pre>
+<p>
+The untranslated label of the mixer track, if available. Mixer track
+implementations must set this at construct time. Applications may find
+this useful to determine icons for various kind of tracks. However,
+applications mustn't make any assumptions about the naming of tracks,
+the untranslated labels are purely informational and may change.
+</p>
+<p>Default value: NULL</p>
+<p class="since">Since 0.10.13</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmixertrack.see-also"></a><h2>See Also</h2>
+GstMixer, GstMixerOptions
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstmultichannel.html b/docs/libs/html/gst-plugins-base-libs-gstmultichannel.html
new file mode 100644
index 0000000..fcb4c1b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstmultichannel.html
@@ -0,0 +1,438 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstmultichannel</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstbaseaudiosrc.html" title="gstbaseaudiosrc">
+<link rel="next" href="gst-plugins-base-libs-gstringbuffer.html" title="gstringbuffer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstbaseaudiosrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstringbuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstmultichannel.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstmultichannel.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstmultichannel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstmultichannel.top_of_page"></a>gstmultichannel</span></h2>
+<p>gstmultichannel — Support for multichannel audio elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstmultichannel.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/audio/multichannel.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition">GstAudioChannelPosition</a>;
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="returnvalue">GstAudioChannelPosition</span></a> * <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-fixate-channel-positions" title="gst_audio_fixate_channel_positions ()">gst_audio_fixate_channel_positions</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="returnvalue">GstAudioChannelPosition</span></a> * <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-get-channel-positions" title="gst_audio_get_channel_positions ()">gst_audio_get_channel_positions</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-caps-channel-positions-list" title="gst_audio_set_caps_channel_positions_list ()">gst_audio_set_caps_channel_positions_list</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num_positions</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-channel-positions" title="gst_audio_set_channel_positions ()">gst_audio_set_channel_positions</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-structure-channel-positions-list" title="gst_audio_set_structure_channel_positions_list ()">gst_audio_set_structure_channel_positions_list</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num_positions</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#gst-audio-check-channel-positions" title="gst_audio_check_channel_positions ()">gst_audio_check_channel_positions</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> channels</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmultichannel.description"></a><h2>Description</h2>
+<p>
+This module contains some helper functions and a enum to work with
+multichannel audio.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstmultichannel.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioChannelPosition"></a><h3>enum GstAudioChannelPosition</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUDIO_CHANNEL_POSITION_INVALID = -1,
+
+ /* Main front speakers. Mono and left/right are mututally exclusive! */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+
+ /* rear. Left/right and center are mututally exclusive! */
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+
+ /* subwoofer/low-frequency */
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+
+ /* Center front speakers. Center and left/right_of_center cannot be
+ * used together! */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+
+ /* sides */
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+
+ GST_AUDIO_CHANNEL_POSITION_TOP_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER,
+
+ /* for multi-channel input and output with more than 8 channels,
+ * incompatible with all other positions, either all positions
+ * are defined or all positions are undefined, but can't mix'n'match */
+ GST_AUDIO_CHANNEL_POSITION_NONE,
+} GstAudioChannelPosition;
+</pre>
+<p>
+Audio channel positions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-INVALID:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_INVALID</code></span></p></td>
+<td>invalid position
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-MONO:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_MONO</code></span></p></td>
+<td>front mono
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT</code></span></p></td>
+<td>front left
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT</code></span></p></td>
+<td>front right
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-REAR-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_REAR_CENTER</code></span></p></td>
+<td>rear center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-REAR-LEFT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_REAR_LEFT</code></span></p></td>
+<td>rear left
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-REAR-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT</code></span></p></td>
+<td>rear right
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-LFE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_LFE</code></span></p></td>
+<td>subwoofer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER</code></span></p></td>
+<td>front center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT-OF-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER</code></span></p></td>
+<td>front left of center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT-OF-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER</code></span></p></td>
+<td>front right of center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-SIDE-LEFT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT</code></span></p></td>
+<td>side left
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-SIDE-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT</code></span></p></td>
+<td>side right
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_CENTER</code></span></p></td>
+<td>top center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-LEFT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT</code></span></p></td>
+<td>top front left
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT</code></span></p></td>
+<td>top front right
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER</code></span></p></td>
+<td>top front center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-LEFT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT</code></span></p></td>
+<td>top rear left
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT</code></span></p></td>
+<td>top rear right
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-CENTER:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER</code></span></p></td>
+<td>top rear center
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-CHANNEL-POSITION-NONE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_CHANNEL_POSITION_NONE</code></span></p></td>
+<td>used for position-less channels, e.g.
+ from a sound card that records 1024 channels; mutually exclusive with
+ any other channel position
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-fixate-channel-positions"></a><h3>gst_audio_fixate_channel_positions ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="returnvalue">GstAudioChannelPosition</span></a> * gst_audio_fixate_channel_positions
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>);</pre>
+<p>
+Custom fixate function. Elements that implement some sort of
+channel conversion algorithm should use this function for
+fixating on GstAudioChannelPosition properties. It will take
+care of equal channel positioning (left/right). Caller <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>s
+the return value. The input properties may be (and are supposed
+to be) unfixed.
+Note that this function is mostly a hack because we currently
+have no way to add default fixation functions for new GTypes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> containing a (possibly unfixed)
+"channel-positions" field.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>fixed values that the caller could use as a fixed
+set of <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> values.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-get-channel-positions"></a><h3>gst_audio_get_channel_positions ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="returnvalue">GstAudioChannelPosition</span></a> * gst_audio_get_channel_positions
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>);</pre>
+<p>
+Retrieves a number of (fixed!) audio channel positions from
+the provided <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> and returns it as a newly allocated
+array. The caller should <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> this array. The caller
+should also check that the members in this <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> are
+indeed "fixed" before calling this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> to retrieve channel positions from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated array containing the channel
+positions as provided in the given <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a>. Returns
+NULL on error.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-set-caps-channel-positions-list"></a><h3>gst_audio_set_caps_channel_positions_list ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_set_caps_channel_positions_list
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num_positions</code></em>);</pre>
+<p>
+Sets a (possibly non-fixed) list of possible audio channel
+positions (given in pos) on the given caps. Each of the
+structures of the caps, after this function has been called,
+will contain a "channel-positions" field with an array.
+Each value in the array will contain each of the values given
+in the pos array. Note that the size of the caps might be
+increased by this, since each structure with a "channel-
+positions" field needs to have a fixed "channels" field.
+The input caps is not required to have this.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to set the list of channel positions on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>the array containing one or more possible audio
+channel positions that we should add in each value
+of the array in the given structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num_positions</code></em> :</span></p></td>
+<td>the number of values in pos.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-set-channel-positions"></a><h3>gst_audio_set_channel_positions ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_set_channel_positions (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>);</pre>
+<p>
+Adds a "channel-positions" field to the given <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a>,
+which will represent the channel positions as given in the
+provided <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> array.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> to set channel positions on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>an array of channel positions. The number of members
+in this array should be equal to the (fixed!) number
+of the "channels" field in the given <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-set-structure-channel-positions-list"></a><h3>gst_audio_set_structure_channel_positions_list ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_audio_set_structure_channel_positions_list
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *str</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> num_positions</code></em>);</pre>
+<p>
+Sets a (possibly non-fixed) list of possible audio channel
+positions (given in pos) on the given structure. The
+structure, after this function has been called, will contain
+a "channel-positions" field with an array of the size of
+the "channels" field value in the given structure (note
+that this means that the channels field in the provided
+structure should be fixed!). Each value in the array will
+contain each of the values given in the pos array.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> to set the list of channel positions
+on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>the array containing one or more possible audio
+channel positions that we should add in each value
+of the array in the given structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num_positions</code></em> :</span></p></td>
+<td>the number of values in pos.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-audio-check-channel-positions"></a><h3>gst_audio_check_channel_positions ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_audio_check_channel_positions (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a> *pos</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> channels</code></em>);</pre>
+<p>
+This functions checks if the given channel positions are valid. Channel
+positions are valid if:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>No channel positions appears twice or all positions are <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-NONE:CAPS"><code class="literal">GST_AUDIO_CHANNEL_POSITION_NONE</code></a>.
+ </p></li>
+<li class="listitem"><p>Either all or none of the channel positions are <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-NONE:CAPS"><code class="literal">GST_AUDIO_CHANNEL_POSITION_NONE</code></a>.
+ </p></li>
+<li class="listitem"><p><a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-MONO:CAPS"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_MONO</code></a> and <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT:CAPS"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT</code></a> or <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT:CAPS"><code class="literal">GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT</code></a> don't appear together in the given positions.
+ </p></li>
+</ul></div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>An array of <a class="link" href="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition" title="enum GstAudioChannelPosition"><span class="type">GstAudioChannelPosition</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channels</code></em> :</span></p></td>
+<td>The number of elements in <em class="parameter"><code>pos</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the given channel positions are valid
+and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstnavigation.html b/docs/libs/html/gst-plugins-base-libs-gstnavigation.html
new file mode 100644
index 0000000..d46cafb
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstnavigation.html
@@ -0,0 +1,1202 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstnavigation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstmixertrack.html" title="gstmixertrack">
+<link rel="next" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstmixertrack.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpropertyprobe.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstnavigation.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstnavigation.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstnavigation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstnavigation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstnavigation.top_of_page"></a>gstnavigation</span></h2>
+<p>gstnavigation — Interface for creating, sending and parsing navigation
+events.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstnavigation.synopsis"></a><h2>Synopsis</h2>
+<a name="GstNavigation"></a><pre class="synopsis">
+#include &lt;gst/interfaces/navigation.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct" title="GstNavigation">GstNavigation</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationInterface" title="struct GstNavigationInterface">GstNavigationInterface</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand">GstNavigationCommand</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationEventType" title="enum GstNavigationEventType">GstNavigationEventType</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" title="enum GstNavigationMessageType">GstNavigationMessageType</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType">GstNavigationQueryType</a>;
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-event" title="gst_navigation_send_event ()">gst_navigation_send_event</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-key-event" title="gst_navigation_send_key_event ()">gst_navigation_send_key_event</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *event</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *key</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-mouse-event" title="gst_navigation_send_mouse_event ()">gst_navigation_send_mouse_event</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *event</code></em>,
+ <em class="parameter"><code><span class="type">int</span> button</code></em>,
+ <em class="parameter"><code><span class="type">double</span> x</code></em>,
+ <em class="parameter"><code><span class="type">double</span> y</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-command" title="gst_navigation_send_command ()">gst_navigation_send_command</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> command</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-command" title="gst_navigation_event_parse_command ()">gst_navigation_event_parse_command</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *command</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event" title="gst_navigation_event_parse_key_event ()">gst_navigation_event_parse_key_event</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **key</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event" title="gst_navigation_event_parse_mouse_button_event ()">gst_navigation_event_parse_mouse_button_event</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *button</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-move-event" title="gst_navigation_event_parse_mouse_move_event ()">gst_navigation_event_parse_mouse_move_event</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" title="enum GstNavigationMessageType"><span class="returnvalue">GstNavigationMessageType</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-get-type" title="gst_navigation_message_get_type ()">gst_navigation_message_get_type</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-angles-changed" title="gst_navigation_message_new_angles_changed ()">gst_navigation_message_new_angles_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> n_angles</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-commands-changed" title="gst_navigation_message_new_commands_changed ()">gst_navigation_message_new_commands_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-mouse-over" title="gst_navigation_message_new_mouse_over ()">gst_navigation_message_new_mouse_over</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> active</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-mouse-over" title="gst_navigation_message_parse_mouse_over ()">gst_navigation_message_parse_mouse_over</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *active</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-angles-changed" title="gst_navigation_message_parse_angles_changed ()">gst_navigation_message_parse_angles_changed</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_angles</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-angles" title="gst_navigation_query_new_angles ()">gst_navigation_query_new_angles</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType"><span class="returnvalue">GstNavigationQueryType</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-get-type" title="gst_navigation_query_get_type ()">gst_navigation_query_get_type</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-commands" title="gst_navigation_query_new_commands ()">gst_navigation_query_new_commands</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-angles" title="gst_navigation_query_parse_angles ()">gst_navigation_query_parse_angles</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_angles</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-length" title="gst_navigation_query_parse_commands_length ()">gst_navigation_query_parse_commands_length</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_cmds</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-nth" title="gst_navigation_query_parse_commands_nth ()">gst_navigation_query_parse_commands_nth</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *cmd</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-angles" title="gst_navigation_query_set_angles ()">gst_navigation_query_set_angles</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> n_angles</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commands" title="gst_navigation_query_set_commands ()">gst_navigation_query_set_commands</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_cmds</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commandsv" title="gst_navigation_query_set_commandsv ()">gst_navigation_query_set_commandsv</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_cmds</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *cmds</code></em>);
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU">GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU">GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU">GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_MENU">GST_NAVIGATION_COMMAND_DVD_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_ROOT_MENU">GST_NAVIGATION_COMMAND_DVD_ROOT_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU">GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU</a>
+#define <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS" title="GST_NAVIGATION_COMMAND_DVD_TITLE_MENU">GST_NAVIGATION_COMMAND_DVD_TITLE_MENU</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstnavigation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstNavigation
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstnavigation.description"></a><h2>Description</h2>
+<p>
+The Navigation interface is used for creating and injecting navigation related
+events such as mouse button presses, cursor motion and key presses. The associated
+library also provides methods for parsing received events, and for sending and
+receiving navigation related bus events. One main usecase is DVD menu navigation.
+</p>
+<p>
+The main parts of the API are:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+The GstNavigation interface, implemented by elements which provide an application
+with the ability to create and inject navigation events into the pipeline.
+</p></li>
+<li class="listitem"><p>
+GstNavigation event handling API. GstNavigation events are created in response to
+calls on a GstNavigation interface implementation, and sent in the pipeline. Upstream
+elements can use the navigation event API functions to parse the contents of received
+messages.
+</p></li>
+<li class="listitem">
+<p>
+GstNavigation message handling API. GstNavigation messages may be sent on the message
+bus to inform applications of navigation related changes in the pipeline, such as the
+mouse moving over a clickable region, or the set of available angles changing.
+</p>
+<p>
+The GstNavigation message functions provide functions for creating and parsing
+custom bus messages for signalling GstNavigation changes.
+</p>
+</li>
+</ul></div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstnavigation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstNavigation-struct"></a><h3>GstNavigation</h3>
+<pre class="programlisting">typedef struct _GstNavigation GstNavigation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNavigationInterface"></a><h3>struct GstNavigationInterface</h3>
+<pre class="programlisting">struct GstNavigationInterface {
+ GTypeInterface g_iface;
+
+ /* virtual functions */
+ void (*send_event) (GstNavigation *navigation, GstStructure *structure);
+};
+</pre>
+<p>
+Color-balance interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInterface"><span class="type">GTypeInterface</span></a> <em class="structfield"><code><a name="GstNavigationInterface.g-iface"></a>g_iface</code></em>;</span></p></td>
+<td>the parent interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstNavigationInterface.send-event"></a>send_event</code></em> ()</span></p></td>
+<td>sending a navigation event</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNavigationCommand"></a><h3>enum GstNavigationCommand</h3>
+<pre class="programlisting">typedef enum {
+ GST_NAVIGATION_COMMAND_INVALID = 0,
+
+ GST_NAVIGATION_COMMAND_MENU1 = 1,
+ GST_NAVIGATION_COMMAND_MENU2 = 2,
+ GST_NAVIGATION_COMMAND_MENU3 = 3,
+ GST_NAVIGATION_COMMAND_MENU4 = 4,
+ GST_NAVIGATION_COMMAND_MENU5 = 5,
+ GST_NAVIGATION_COMMAND_MENU6 = 6,
+ GST_NAVIGATION_COMMAND_MENU7 = 7,
+
+ GST_NAVIGATION_COMMAND_LEFT = 20,
+ GST_NAVIGATION_COMMAND_RIGHT = 21,
+ GST_NAVIGATION_COMMAND_UP = 22,
+ GST_NAVIGATION_COMMAND_DOWN = 23,
+ GST_NAVIGATION_COMMAND_ACTIVATE = 24,
+
+ GST_NAVIGATION_COMMAND_PREV_ANGLE = 30,
+ GST_NAVIGATION_COMMAND_NEXT_ANGLE = 31
+} GstNavigationCommand;
+</pre>
+<p>
+A set of commands that may be issued to an element providing the
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> interface. The available commands can be queried via
+the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-commands" title="gst_navigation_query_new_commands ()"><code class="function">gst_navigation_query_new_commands()</code></a> query.
+</p>
+<p>
+For convenience in handling DVD navigation, the MENU commands are aliased as:
+ GST_NAVIGATION_COMMAND_DVD_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU1</code></em>
+ GST_NAVIGATION_COMMAND_DVD_TITLE_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU2</code></em>
+ GST_NAVIGATION_COMMAND_DVD_ROOT_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU3</code></em>
+ GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU4</code></em>
+ GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU5</code></em>
+ GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU6</code></em>
+ GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU = <em class="parameter"><code>GST_NAVIGATION_COMMAND_MENU7</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-INVALID:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_INVALID</code></span></p></td>
+<td>An invalid command entry
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU1:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU1</code></span></p></td>
+<td>Execute navigation menu command 1. For DVD,
+this enters the DVD root menu, or exits back to the title from the menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU2:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU2</code></span></p></td>
+<td>Execute navigation menu command 2. For DVD,
+this jumps to the DVD title menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU3:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU3</code></span></p></td>
+<td>Execute navigation menu command 3. For DVD,
+this jumps into the DVD root menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU4:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU4</code></span></p></td>
+<td>Execute navigation menu command 4. For DVD,
+this jumps to the Subpicture menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU5:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU5</code></span></p></td>
+<td>Execute navigation menu command 5. For DVD,
+the jumps to the audio menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU6:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU6</code></span></p></td>
+<td>Execute navigation menu command 6. For DVD,
+this jumps to the angles menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-MENU7:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_MENU7</code></span></p></td>
+<td>Execute navigation menu command 7. For DVD,
+this jumps to the chapter menu.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-LEFT:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_LEFT</code></span></p></td>
+<td>Select the next button to the left in a menu,
+if such a button exists.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-RIGHT:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_RIGHT</code></span></p></td>
+<td>Select the next button to the right in a menu,
+if such a button exists.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-UP:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_UP</code></span></p></td>
+<td>Select the button above the current one in a
+menu, if such a button exists.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-DOWN:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_DOWN</code></span></p></td>
+<td>Select the button below the current one in a
+menu, if such a button exists.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-ACTIVATE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_ACTIVATE</code></span></p></td>
+<td>Activate (click) the currently selected
+button in a menu, if such a button exists.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-PREV-ANGLE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_PREV_ANGLE</code></span></p></td>
+<td>Switch to the previous angle in a
+multiangle feature.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-COMMAND-NEXT-ANGLE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_COMMAND_NEXT_ANGLE</code></span></p></td>
+<td>Switch to the next angle in a multiangle
+feature.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNavigationEventType"></a><h3>enum GstNavigationEventType</h3>
+<pre class="programlisting">typedef enum {
+ GST_NAVIGATION_EVENT_INVALID = 0,
+ GST_NAVIGATION_EVENT_KEY_PRESS = 1,
+ GST_NAVIGATION_EVENT_KEY_RELEASE = 2,
+ GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS = 3,
+ GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE = 4,
+ GST_NAVIGATION_EVENT_MOUSE_MOVE = 5,
+ GST_NAVIGATION_EVENT_COMMAND = 6
+} GstNavigationEventType;
+</pre>
+<p>
+Enum values for the various events that an element implementing the
+GstNavigation interface might send up the pipeline.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-INVALID:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_INVALID</code></span></p></td>
+<td>Returned from
+<code class="function">gst_navigation_event_get_type()</code> when the passed event is not a navigation event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-KEY-PRESS:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_KEY_PRESS</code></span></p></td>
+<td>A key press event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event" title="gst_navigation_event_parse_key_event ()"><code class="function">gst_navigation_event_parse_key_event()</code></a> to extract the details from the event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-KEY-RELEASE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_KEY_RELEASE</code></span></p></td>
+<td>A key release event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event" title="gst_navigation_event_parse_key_event ()"><code class="function">gst_navigation_event_parse_key_event()</code></a> to extract the details from the event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-MOUSE-BUTTON-PRESS:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS</code></span></p></td>
+<td>A mouse button press event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event" title="gst_navigation_event_parse_mouse_button_event ()"><code class="function">gst_navigation_event_parse_mouse_button_event()</code></a> to extract the details from the
+event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-MOUSE-BUTTON-RELEASE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE</code></span></p></td>
+<td>A mouse button release event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event" title="gst_navigation_event_parse_mouse_button_event ()"><code class="function">gst_navigation_event_parse_mouse_button_event()</code></a> to extract the details from the
+event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-MOUSE-MOVE:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_MOUSE_MOVE</code></span></p></td>
+<td>A mouse movement event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-move-event" title="gst_navigation_event_parse_mouse_move_event ()"><code class="function">gst_navigation_event_parse_mouse_move_event()</code></a> to extract the details from the
+event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-EVENT-COMMAND:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_EVENT_COMMAND</code></span></p></td>
+<td>A navigation command event. Use
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-command" title="gst_navigation_event_parse_command ()"><code class="function">gst_navigation_event_parse_command()</code></a> to extract the details from the event.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNavigationMessageType"></a><h3>enum GstNavigationMessageType</h3>
+<pre class="programlisting">typedef enum {
+ GST_NAVIGATION_MESSAGE_INVALID,
+ GST_NAVIGATION_MESSAGE_MOUSE_OVER,
+ GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED,
+ GST_NAVIGATION_MESSAGE_ANGLES_CHANGED
+} GstNavigationMessageType;
+</pre>
+<p>
+A set of notifications that may be received on the bus when navigation
+related status changes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-NAVIGATION-MESSAGE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_MESSAGE_INVALID</code></span></p></td>
+<td>Returned from
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-get-type" title="gst_navigation_message_get_type ()"><code class="function">gst_navigation_message_get_type()</code></a> when the passed message is not a
+navigation message.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_MESSAGE_MOUSE_OVER</code></span></p></td>
+<td>Sent when the mouse moves over or leaves a
+clickable region of the output, such as a DVD menu button.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-MESSAGE-COMMANDS-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED</code></span></p></td>
+<td>Sent when the set of available commands
+changes and should re-queried by interested applications.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-MESSAGE-ANGLES-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_MESSAGE_ANGLES_CHANGED</code></span></p></td>
+<td>Sent when display angles in a multi-angle
+feature (such as a multiangle DVD) change - either angles have appeared or
+disappeared.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNavigationQueryType"></a><h3>enum GstNavigationQueryType</h3>
+<pre class="programlisting">typedef enum {
+ GST_NAVIGATION_QUERY_INVALID = 0,
+ GST_NAVIGATION_QUERY_COMMANDS = 1,
+ GST_NAVIGATION_QUERY_ANGLES = 2
+} GstNavigationQueryType;
+</pre>
+<p>
+Tyoes of navigation interface queries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-NAVIGATION-QUERY-INVALID:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_QUERY_INVALID</code></span></p></td>
+<td>invalid query
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-QUERY-COMMANDS:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_QUERY_COMMANDS</code></span></p></td>
+<td>command query
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NAVIGATION-QUERY-ANGLES:CAPS"></a><span class="term"><code class="literal">GST_NAVIGATION_QUERY_ANGLES</code></span></p></td>
+<td>viewing angle query
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-send-event"></a><h3>gst_navigation_send_event ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_send_event (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-send-key-event"></a><h3>gst_navigation_send_key_event ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_send_key_event (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *event</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *key</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>navigation</code></em> :</span></p></td>
+<td>The navigation interface instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>The type of the key event. Recognised values are "key-press" and
+"key-release"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>Character representation of the key. This is typically as produced
+by XKeysymToString.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-send-mouse-event"></a><h3>gst_navigation_send_mouse_event ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_send_mouse_event (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *event</code></em>,
+ <em class="parameter"><code><span class="type">int</span> button</code></em>,
+ <em class="parameter"><code><span class="type">double</span> x</code></em>,
+ <em class="parameter"><code><span class="type">double</span> y</code></em>);</pre>
+<p>
+Sends a mouse event to the navigation interface. Mouse event coordinates
+are sent relative to the display space of the related output area. This is
+usually the size in pixels of the window associated with the element
+implementing the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>navigation</code></em> :</span></p></td>
+<td>The navigation interface instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>The type of mouse event, as a text string. Recognised values are
+"mouse-button-press", "mouse-button-release" and "mouse-move".</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>button</code></em> :</span></p></td>
+<td>The button number of the button being pressed or released. Pass 0
+for mouse-move events.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>The x coordinate of the mouse event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>y</code></em> :</span></p></td>
+<td>The y coordinate of the mouse event.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-send-command"></a><h3>gst_navigation_send_command ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_send_command (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> *navigation</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> command</code></em>);</pre>
+<p>
+Sends the indicated command to the navigation interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>navigation</code></em> :</span></p></td>
+<td>The navigation interface instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>command</code></em> :</span></p></td>
+<td>The command to issue</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-event-parse-command"></a><h3>gst_navigation_event_parse_command ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_event_parse_command (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *command</code></em>);</pre>
+<p>
+Inspect a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> command event and retrieve the enum value of the
+associated command.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>command</code></em> :</span></p></td>
+<td>Pointer to GstNavigationCommand to receive the type of the
+navigation event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the navigation command could be extracted, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-event-parse-key-event"></a><h3>gst_navigation_event_parse_key_event ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_event_parse_key_event
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **key</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>A pointer to a location to receive the string identifying the key
+press. The returned string is owned by the event, and valid only until the
+event is unreffed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-event-parse-mouse-button-event"></a><h3>gst_navigation_event_parse_mouse_button_event ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_event_parse_mouse_button_event
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *button</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);</pre>
+<p>
+Retrieve the details of either a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> mouse button press event or
+a mouse button release event. Determine which type the event is using
+<code class="function">gst_navigation_event_get_type()</code> to retrieve the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationEventType" title="enum GstNavigationEventType"><span class="type">GstNavigationEventType</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>button</code></em> :</span></p></td>
+<td>Pointer to a gint that will receive the button number associated
+with the event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>Pointer to a gdouble to receive the x coordinate of the mouse button
+event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>y</code></em> :</span></p></td>
+<td>Pointer to a gdouble to receive the y coordinate of the mouse button
+event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the button number and both coordinates could be extracted,
+otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-event-parse-mouse-move-event"></a><h3>gst_navigation_event_parse_mouse_move_event ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_event_parse_mouse_move_event
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *y</code></em>);</pre>
+<p>
+Inspect a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> mouse movement event and extract the coordinates
+of the event.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>Pointer to a gdouble to receive the x coordinate of the mouse movement.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>y</code></em> :</span></p></td>
+<td>Pointer to a gdouble to receive the y coordinate of the mouse movement.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if both coordinates could be extracted, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-get-type"></a><h3>gst_navigation_message_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" title="enum GstNavigationMessageType"><span class="returnvalue">GstNavigationMessageType</span></a> gst_navigation_message_get_type
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Check a bus message to see if it is a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> event, and return
+the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" title="enum GstNavigationMessageType"><span class="type">GstNavigationMessageType</span></a> identifying the type of the message if so.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The type of the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-INVALID:CAPS"><span class="type">GST_NAVIGATION_MESSAGE_INVALID</span></a> if the message is not a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a>
+notification.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-new-angles-changed"></a><h3>gst_navigation_message_new_angles_changed ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_navigation_message_new_angles_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> n_angles</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> message with type
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-ANGLES-CHANGED:CAPS"><span class="type">GST_NAVIGATION_MESSAGE_ANGLES_CHANGED</span></a> for notifying an application
+that the current angle, or current number of angles available in a
+multiangle video has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> to set as source of the new message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur_angle</code></em> :</span></p></td>
+<td>The currently selected angle.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_angles</code></em> :</span></p></td>
+<td>The number of viewing angles now available.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-new-commands-changed"></a><h3>gst_navigation_message_new_commands_changed ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_navigation_message_new_commands_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> message with type
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-COMMANDS-CHANGED:CAPS"><span class="type">GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> to set as source of the new message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-new-mouse-over"></a><h3>gst_navigation_message_new_mouse_over ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_navigation_message_new_mouse_over
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> message with type
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS"><span class="type">GST_NAVIGATION_MESSAGE_MOUSE_OVER</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> to set as source of the new message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the mouse has entered a clickable area of the display.
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if it over a non-clickable area.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-parse-mouse-over"></a><h3>gst_navigation_message_parse_mouse_over ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_message_parse_mouse_over
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *active</code></em>);</pre>
+<p>
+Parse a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> message of type <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS"><span class="type">GST_NAVIGATION_MESSAGE_MOUSE_OVER</span></a>
+and extract the active/inactive flag. If the mouse over event is marked
+active, it indicates that the mouse is over a clickable area.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>A pointer to a gboolean to receive the active/inactive state,
+or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the message could be successfully parsed. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-message-parse-angles-changed"></a><h3>gst_navigation_message_parse_angles_changed ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_message_parse_angles_changed
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_angles</code></em>);</pre>
+<p>
+Parse a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> message of type GST_NAVIGATION_MESSAGE_ANGLES_CHANGED
+and extract the <em class="parameter"><code>cur_angle</code></em> and <em class="parameter"><code>n_angles</code></em> parameters.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> to inspect.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur_angle</code></em> :</span></p></td>
+<td>A pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> to receive the new current angle number,
+or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_angles</code></em> :</span></p></td>
+<td>A pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> to receive the new angle count, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the message could be successfully parsed. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-new-angles"></a><h3>gst_navigation_query_new_angles ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_navigation_query_new_angles (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> angles query. When executed, it will
+query the pipeline for the set of currently available angles, which may be
+greater than one in a multiangle video.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new query.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-get-type"></a><h3>gst_navigation_query_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType"><span class="returnvalue">GstNavigationQueryType</span></a> gst_navigation_query_get_type (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Inspect a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> and return the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType"><span class="type">GstNavigationQueryType</span></a> associated with
+it if it is a <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> query.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>The query to inspect</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType" title="enum GstNavigationQueryType"><span class="type">GstNavigationQueryType</span></a> of the query, or
+<a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-INVALID:CAPS"><span class="type">GST_NAVIGATION_QUERY_INVALID</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-new-commands"></a><h3>gst_navigation_query_new_commands ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_navigation_query_new_commands (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> commands query. When executed, it will
+query the pipeline for the set of currently available commands.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new query.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-parse-angles"></a><h3>gst_navigation_query_parse_angles ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_query_parse_angles (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_angles</code></em>);</pre>
+<p>
+Parse the current angle number in the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> angles <em class="parameter"><code>query</code></em> into the
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> pointed to by the <em class="parameter"><code>cur_angle</code></em> variable, and the number of available
+angles into the <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> pointed to by the <em class="parameter"><code>n_angles</code></em> variable.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur_angle</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> into which to store the currently selected
+angle value from the query, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_angles</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> into which to store the number of angles
+value from the query, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be successfully parsed. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-parse-commands-length"></a><h3>gst_navigation_query_parse_commands_length ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_query_parse_commands_length
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_cmds</code></em>);</pre>
+<p>
+Parse the number of commands in the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> commands <em class="parameter"><code>query</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_cmds</code></em> :</span></p></td>
+<td>the number of commands in this query.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be successfully parsed. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-parse-commands-nth"></a><h3>gst_navigation_query_parse_commands_nth ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_navigation_query_parse_commands_nth
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *cmd</code></em>);</pre>
+<p>
+Parse the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> command query and retrieve the <em class="parameter"><code>nth</code></em> command from
+it into <em class="parameter"><code>cmd</code></em>. If the list contains less elements than <em class="parameter"><code>nth</code></em>, <em class="parameter"><code>cmd</code></em> will be
+set to <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-INVALID:CAPS"><span class="type">GST_NAVIGATION_COMMAND_INVALID</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the nth command to retrieve.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cmd</code></em> :</span></p></td>
+<td>a pointer to store the nth command into.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be successfully parsed. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-set-angles"></a><h3>gst_navigation_query_set_angles ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_query_set_angles (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> cur_angle</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> n_angles</code></em>);</pre>
+<p>
+Set the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> angles query result field in <em class="parameter"><code>query</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur_angle</code></em> :</span></p></td>
+<td>the current viewing angle to set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_angles</code></em> :</span></p></td>
+<td>the number of viewing angles to set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-set-commands"></a><h3>gst_navigation_query_set_commands ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_query_set_commands (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_cmds</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Set the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> command query result fields in <em class="parameter"><code>query</code></em>. The number
+of commands passed must be equal to <em class="parameter"><code>n_commands</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_cmds</code></em> :</span></p></td>
+<td>the number of commands to set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>A list of <em class="parameter"><code>GstNavigationCommand</code></em> values, <em class="parameter"><code>n_cmds</code></em> entries long.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-navigation-query-set-commandsv"></a><h3>gst_navigation_query_set_commandsv ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_navigation_query_set_commandsv (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_cmds</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" title="enum GstNavigationCommand"><span class="type">GstNavigationCommand</span></a> *cmds</code></em>);</pre>
+<p>
+Set the <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation"><span class="type">GstNavigation</span></a> command query result fields in <em class="parameter"><code>query</code></em>. The number
+of commands passed must be equal to <em class="parameter"><code>n_commands</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_cmds</code></em> :</span></p></td>
+<td>the number of commands to set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cmds</code></em> :</span></p></td>
+<td>An array containing <em class="parameter"><code>n_cmds</code></em> <em class="parameter"><code>GstNavigationCommand</code></em> values.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU GST_NAVIGATION_COMMAND_MENU6
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU GST_NAVIGATION_COMMAND_MENU5
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU GST_NAVIGATION_COMMAND_MENU7
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_MENU GST_NAVIGATION_COMMAND_MENU1
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_ROOT_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_ROOT_MENU GST_NAVIGATION_COMMAND_MENU3
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU GST_NAVIGATION_COMMAND_MENU4
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS"></a><h3>GST_NAVIGATION_COMMAND_DVD_TITLE_MENU</h3>
+<pre class="programlisting">#define GST_NAVIGATION_COMMAND_DVD_TITLE_MENU GST_NAVIGATION_COMMAND_MENU2
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstnetbuffer.html b/docs/libs/html/gst-plugins-base-libs-gstnetbuffer.html
new file mode 100644
index 0000000..bf5c732
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstnetbuffer.html
@@ -0,0 +1,454 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstnetbuffer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-netbuffer.html" title="Network Buffer Library">
+<link rel="prev" href="gstreamer-netbuffer.html" title="Network Buffer Library">
+<link rel="next" href="gstreamer-riff.html" title="Riff Media Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-netbuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-netbuffer.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-riff.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstnetbuffer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstnetbuffer.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstnetbuffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstnetbuffer.top_of_page"></a>gstnetbuffer</span></h2>
+<p>gstnetbuffer — Buffer for use in network sources and sinks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstnetbuffer.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/netbuffer/gstnetbuffer.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetBuffer" title="GstNetBuffer">GstNetBuffer</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType">GstNetType</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GST-NETADDRESS-MAX-LEN:CAPS" title="GST_NETADDRESS_MAX_LEN">GST_NETADDRESS_MAX_LEN</a>
+struct <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress">GstNetAddress</a>;
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType"><span class="returnvalue">GstNetType</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-net-type" title="gst_netaddress_get_net_type ()">gst_netaddress_get_net_type</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip4-address" title="gst_netaddress_set_ip4_address ()">gst_netaddress_set_ip4_address</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip4-address" title="gst_netaddress_get_ip4_address ()">gst_netaddress_get_ip4_address</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip6-address" title="gst_netaddress_set_ip6_address ()">gst_netaddress_set_ip6_address</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip6-address" title="gst_netaddress_get_ip6_address ()">gst_netaddress_get_ip6_address</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-address-bytes" title="gst_netaddress_get_address_bytes ()">gst_netaddress_get_address_bytes</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-address-bytes" title="gst_netaddress_set_address_bytes ()">gst_netaddress_set_address_bytes</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType"><span class="type">GstNetType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-equal" title="gst_netaddress_equal ()">gst_netaddress_equal</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr2</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-to-string" title="gst_netaddress_to_string ()">gst_netaddress_to_string</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *dest</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> len</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstnetbuffer.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetBuffer" title="GstNetBuffer"><span class="type">GstNetBuffer</span></a> is a subclass of a normal <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> that contains two
+additional metadata fields of type <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> named 'to' and 'from'. The
+buffer can be used to store additional information about the origin of the
+buffer data and is used in various network elements to track the to and from
+addresses.
+</p>
+<p>
+Last reviewed on 2006-08-21 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstnetbuffer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstNetBuffer"></a><h3>GstNetBuffer</h3>
+<pre class="programlisting">typedef struct _GstNetBuffer GstNetBuffer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetType"></a><h3>enum GstNetType</h3>
+<pre class="programlisting">typedef enum {
+ GST_NET_TYPE_UNKNOWN,
+ GST_NET_TYPE_IP4,
+ GST_NET_TYPE_IP6,
+} GstNetType;
+</pre>
+<p>
+The Address type used in <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-NET-TYPE-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_NET_TYPE_UNKNOWN</code></span></p></td>
+<td>unknown address type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NET-TYPE-IP4:CAPS"></a><span class="term"><code class="literal">GST_NET_TYPE_IP4</code></span></p></td>
+<td>an IPv4 address type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-NET-TYPE-IP6:CAPS"></a><span class="term"><code class="literal">GST_NET_TYPE_IP6</code></span></p></td>
+<td>and IPv6 address type
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NETADDRESS-MAX-LEN:CAPS"></a><h3>GST_NETADDRESS_MAX_LEN</h3>
+<pre class="programlisting">#define GST_NETADDRESS_MAX_LEN 64
+</pre>
+<p>
+The maximum length of a string representation of a GstNetAddress as produced
+by <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-to-string" title="gst_netaddress_to_string ()"><code class="function">gst_netaddress_to_string()</code></a>.
+</p>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetAddress"></a><h3>struct GstNetAddress</h3>
+<pre class="programlisting">struct GstNetAddress {
+};
+</pre>
+<p>
+An opaque network address as used in <span class="type">GstMetaNetAddress</span>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-get-net-type"></a><h3>gst_netaddress_get_net_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType"><span class="returnvalue">GstNetType</span></a> gst_netaddress_get_net_type (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>);</pre>
+<p>
+Get the type of address stored in <em class="parameter"><code>naddr</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the network type stored in <em class="parameter"><code>naddr</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-set-ip4-address"></a><h3>gst_netaddress_set_ip4_address ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_netaddress_set_ip4_address (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>naddr</code></em> with the IPv4 <em class="parameter"><code>address</code></em> and <em class="parameter"><code>port</code></em> pair.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> and <em class="parameter"><code>address</code></em> must be expressed in network byte order,
+use <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-htons"><code class="function">g_htons()</code></a> and <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-htonl"><code class="function">g_htonl()</code></a> to convert them to network byte order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>an IPv4 network address.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a port number to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-get-ip4-address"></a><h3>gst_netaddress_get_ip4_address ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_netaddress_get_ip4_address (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);</pre>
+<p>
+Get the IPv4 address stored in <em class="parameter"><code>naddr</code></em> into <em class="parameter"><code>address</code></em>. This function requires
+that the address type of <em class="parameter"><code>naddr</code></em> is of type <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-IP4:CAPS"><span class="type">GST_NET_TYPE_IP4</span></a>.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> and <em class="parameter"><code>address</code></em> are expressed in network byte order, use
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-ntohs"><code class="function">g_ntohs()</code></a> and <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-ntohl"><code class="function">g_ntohl()</code></a> to convert them to host order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>a location to store the address.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a location to store the port.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the address could be retrieved.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-set-ip6-address"></a><h3>gst_netaddress_set_ip6_address ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_netaddress_set_ip6_address (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>naddr</code></em> with the IPv6 <em class="parameter"><code>address</code></em> and <em class="parameter"><code>port</code></em> pair.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> must be expressed in network byte order, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-htons"><code class="function">g_htons()</code></a> to convert
+it to network byte order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>an IPv6 network address.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a port number to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-get-ip6-address"></a><h3>gst_netaddress_get_ip6_address ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_netaddress_get_ip6_address (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);</pre>
+<p>
+Get the IPv6 address stored in <em class="parameter"><code>naddr</code></em> into <em class="parameter"><code>address</code></em>.
+</p>
+<p>
+If <em class="parameter"><code>naddr</code></em> is of type GST_NET_TYPE_IP4, the transitional IP6 address is
+returned.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> is expressed in network byte order, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-ntohs"><code class="function">g_ntohs()</code></a> to convert
+it to host order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>a location to store the result.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a location to store the port.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the address could be retrieved.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-get-address-bytes"></a><h3>gst_netaddress_get_address_bytes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_netaddress_get_address_bytes (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);</pre>
+<p>
+Get just the address bytes stored in <em class="parameter"><code>naddr</code></em> into <em class="parameter"><code>address</code></em>.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> is expressed in network byte order, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-ntohs"><code class="function">g_ntohs()</code></a> to convert
+it to host order. IP4 addresses are also stored in network byte order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>a location to store the result.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a location to store the port.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>number of bytes actually copied</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-set-address-bytes"></a><h3>gst_netaddress_set_address_bytes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_netaddress_set_address_bytes (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetType" title="enum GstNetType"><span class="type">GstNetType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> address[16]</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);</pre>
+<p>
+Set just the address bytes stored in <em class="parameter"><code>naddr</code></em> into <em class="parameter"><code>address</code></em>.
+</p>
+<p>
+Note that <em class="parameter"><code>port</code></em> must be expressed in network byte order, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Byte-Order-Macros.html#g-htons"><code class="function">g_htons()</code></a> to
+convert it to network byte order order. IP4 address bytes must also be
+stored in network byte order.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a network address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the address type (IPv4 or IPV6)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>a location to store the result.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a location to store the port.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>number of bytes actually copied</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-equal"></a><h3>gst_netaddress_equal ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_netaddress_equal (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr2</code></em>);</pre>
+<p>
+Compare two <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> structures
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr1</code></em> :</span></p></td>
+<td>The first <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr2</code></em> :</span></p></td>
+<td>The second <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if they are identical, FALSE otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-netaddress-to-string"></a><h3>gst_netaddress_to_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_netaddress_to_string (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a> *naddr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *dest</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> len</code></em>);</pre>
+<p>
+Copies a string representation of <em class="parameter"><code>naddr</code></em> into <em class="parameter"><code>dest</code></em>. Up to <em class="parameter"><code>len</code></em> bytes are
+copied.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>naddr</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress" title="struct GstNetAddress"><span class="type">GstNetAddress</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>destination</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>len of <em class="parameter"><code>dest</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bytes which would be produced if the buffer was large
+enough</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpbutils.html b/docs/libs/html/gst-plugins-base-libs-gstpbutils.html
new file mode 100644
index 0000000..da57d12
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpbutils.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpbutils</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="next" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-base-utils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpluginsbaseversion.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpbutils.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpbutils.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpbutils"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpbutils.top_of_page"></a>gstpbutils</span></h2>
+<p>gstpbutils — General Application and Plugin Utility Library</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpbutils.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/pbutils.h&gt;
+
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpbutils.html#gst-pb-utils-init" title="gst_pb_utils_init ()">gst_pb_utils_init</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutils.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id442245"></a><h3>Linking to this library</h3>
+<p>
+libgstpbutils is a general utility library for plugins and applications,
+available since gst-plugins-base 0.10.12. It currently provides the
+following:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+human-readable description strings of codecs, elements, sources, decoders,
+encoders, or sinks from decoder/encoder caps, element names, or protocol
+names.
+</p></li>
+<li class="listitem"><p>
+support for applications to initiate installation of missing plugins (if
+this is supported by the distribution or operating system used)
+</p></li>
+<li class="listitem"><p>
+API for GStreamer elements to create missing-plugin messages in order to
+communicate to the application that a certain type of plugin is missing
+(decoder, encoder, URI protocol source, URI protocol sink, named element)
+</p></li>
+<li class="listitem"><p>
+API for applications to recognise and handle missing-plugin messages
+</p></li>
+</ul></div>
+<p>
+You should obtain the required CFLAGS and LIBS using pkg-config on the
+gstreamer-plugins-base-0.10 module. You will then also need to add
+'-lgstpbutils-0.10' manually to your LIBS line.
+</p>
+<p>
+Before using any of its functions, applications and plugins must call
+<a class="link" href="gst-plugins-base-libs-gstpbutils.html#gst-pb-utils-init" title="gst_pb_utils_init ()"><code class="function">gst_pb_utils_init()</code></a> to initialise the library.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutils.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-pb-utils-init"></a><h3>gst_pb_utils_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pb_utils_init (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Initialises the base utils support library. This function is not
+thread-safe. Applications should call it after calling <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-init"><code class="function">gst_init()</code></a>,
+plugins should call it from their plugin_init function.
+</p>
+<p>
+This function may be called multiple times. It will do nothing if the
+library has already been initialised.
+</p>
+<p class="since">Since 0.10.12</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpbutilscodecutils.html b/docs/libs/html/gst-plugins-base-libs-gstpbutilscodecutils.html
new file mode 100644
index 0000000..4c498b3
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpbutilscodecutils.html
@@ -0,0 +1,492 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpbutilscodecutils</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpluginsbaseversion.html" title="gstpluginsbaseversion">
+<link rel="next" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpluginsbaseversion.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpbutilsdescriptions.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpbutilscodecutils.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpbutilscodecutils.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpbutilscodecutils"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpbutilscodecutils.top_of_page"></a>gstpbutilscodecutils</span></h2>
+<p>gstpbutilscodecutils — Miscellaneous codec-specific utility functions</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpbutilscodecutils.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/codec-utils.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-sample-rate-from-index" title="gst_codec_utils_aac_get_sample_rate_from_index ()">gst_codec_utils_aac_get_sample_rate_from_index</a>
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> sr_idx</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-profile" title="gst_codec_utils_aac_get_profile ()">gst_codec_utils_aac_get_profile</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level" title="gst_codec_utils_aac_get_level ()">gst_codec_utils_aac_get_level</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-caps-set-level-and-profile" title="gst_codec_utils_aac_caps_set_level_and_profile ()">gst_codec_utils_aac_caps_set_level_and_profile</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile" title="gst_codec_utils_h264_get_profile ()">gst_codec_utils_h264_get_profile</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level" title="gst_codec_utils_h264_get_level ()">gst_codec_utils_h264_get_level</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-caps-set-level-and-profile" title="gst_codec_utils_h264_caps_set_level_and_profile ()">gst_codec_utils_h264_caps_set_level_and_profile</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level-idc" title="gst_codec_utils_h264_get_level_idc ()">gst_codec_utils_h264_get_level_idc</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *level</code></em>);
+
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-profile" title="gst_codec_utils_mpeg4video_get_profile ()">gst_codec_utils_mpeg4video_get_profile</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-level" title="gst_codec_utils_mpeg4video_get_level ()">gst_codec_utils_mpeg4video_get_level</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-caps-set-level-and-profile" title="gst_codec_utils_mpeg4video_caps_set_level_and_profile ()">gst_codec_utils_mpeg4video_caps_set_level_and_profile</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilscodecutils.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id602451"></a><p>
+Provides codec-specific ulility functions such as functions to provide the
+codec profile and level in human-readable string form from header data.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilscodecutils.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-codec-utils-aac-get-sample-rate-from-index"></a><h3>gst_codec_utils_aac_get_sample_rate_from_index ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_codec_utils_aac_get_sample_rate_from_index
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> sr_idx</code></em>);</pre>
+<p>
+Translates the sample rate index found in AAC headers to the actual sample
+rate.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sr_idx</code></em> :</span></p></td>
+<td>Sample rate index as from the AudioSpecificConfig (MPEG-4
+container) or ADTS frame header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The sample rate if <em class="parameter"><code>sr_idx</code></em> is valid, 0 otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-aac-get-profile"></a><h3>gst_codec_utils_aac_get_profile ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_aac_get_profile (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Returns the profile of the given AAC stream as a string. The profile is
+determined using the AudioObjectType field which is in the first 5 bits of
+<em class="parameter"><code>audio_config</code></em>.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+HE-AAC support has not yet been implemented.
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>audio_config</code></em> :</span></p></td>
+<td>a pointer to the AudioSpecificConfig as specified in the
+Elementary Stream Descriptor (esds) in ISO/IEC 14496-1 (see
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level" title="gst_codec_utils_aac_get_level ()"><code class="function">gst_codec_utils_aac_get_level()</code></a> for a more details).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of <em class="parameter"><code>audio_config</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The profile as a const string and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the profile could not be
+determined.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-aac-get-level"></a><h3>gst_codec_utils_aac_get_level ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_aac_get_level (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Determines the level of a stream as defined in ISO/IEC 14496-3. For AAC LC
+streams, the constraints from the AAC audio profile are applied. For AAC
+Main, LTP, SSR and others, the Main profile is used.
+</p>
+<p>
+The <em class="parameter"><code>audio_config</code></em> parameter follows the following format, starting from the
+most significant bit of the first byte:
+</p>
+<p>
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Bit 0:4 contains the AudioObjectType
+ </p></li>
+<li class="listitem"><p>
+ Bit 5:8 contains the sample frequency index (if this is 0xf, then the
+ next 24 bits define the actual sample frequency, and subsequent
+ fields are appropriately shifted).
+ </p></li>
+<li class="listitem"><p>
+ Bit 9:12 contains the channel configuration
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+HE-AAC support has not yet been implemented.
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>audio_config</code></em> :</span></p></td>
+<td>a pointer to the AudioSpecificConfig as specified in the
+Elementary Stream Descriptor (esds) in ISO/IEC 14496-1.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of <em class="parameter"><code>audio_config</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The level as a const string and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the level could not be
+determined.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-aac-caps-set-level-and-profile"></a><h3>gst_codec_utils_aac_caps_set_level_and_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_codec_utils_aac_caps_set_level_and_profile
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *audio_config</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Sets the level and profile on <em class="parameter"><code>caps</code></em> if it can be determined from
+<em class="parameter"><code>audio_config</code></em>. See <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level" title="gst_codec_utils_aac_get_level ()"><code class="function">gst_codec_utils_aac_get_level()</code></a> and
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-profile" title="gst_codec_utils_aac_get_profile ()"><code class="function">gst_codec_utils_aac_get_profile()</code></a> for more details on the parameters.
+<em class="parameter"><code>caps</code></em> must be audio/mpeg caps with an "mpegversion" field of either 2 or 4.
+If mpegversion is 4, the "base-profile" field is also set in <em class="parameter"><code>caps</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to which level and profile fields are to be added</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>audio_config</code></em> :</span></p></td>
+<td>a pointer to the AudioSpecificConfig as specified in the
+Elementary Stream Descriptor (esds) in ISO/IEC 14496-1 (see
+below for a more details).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of <em class="parameter"><code>audio_config</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the level and profile could be set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-h264-get-profile"></a><h3>gst_codec_utils_h264_get_profile ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_h264_get_profile (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Converts the profile indication (profile_idc) in the stream's
+sequence parameter set into a string. The SPS is expected to have the
+following format, as defined in the H.264 specification. The SPS is viewed
+as a bitstream here, with bit 0 being the most significant bit of the first
+byte.
+</p>
+<p>
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>Bit 0:7 - Profile indication</p></li>
+<li class="listitem"><p>Bit 8 - constraint_set0_flag</p></li>
+<li class="listitem"><p>Bit 9 - constraint_set1_flag</p></li>
+<li class="listitem"><p>Bit 10 - constraint_set2_flag</p></li>
+<li class="listitem"><p>Bit 11 - constraint_set3_flag</p></li>
+<li class="listitem"><p>Bit 12 - constraint_set3_flag</p></li>
+<li class="listitem"><p>Bit 13:15 - Reserved</p></li>
+<li class="listitem"><p>Bit 16:24 - Level indication</p></li>
+</ul></div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sps</code></em> :</span></p></td>
+<td>Pointer to the sequence parameter set for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The profile as a const string, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if there is an error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-h264-get-level"></a><h3>gst_codec_utils_h264_get_level ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_h264_get_level (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Converts the level indication (level_idc) in the stream's
+sequence parameter set into a string. The SPS is expected to have the
+same format as for <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile" title="gst_codec_utils_h264_get_profile ()"><code class="function">gst_codec_utils_h264_get_profile()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sps</code></em> :</span></p></td>
+<td>Pointer to the sequence parameter set for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The level as a const string, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if there is an error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-h264-caps-set-level-and-profile"></a><h3>gst_codec_utils_h264_caps_set_level_and_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_codec_utils_h264_caps_set_level_and_profile
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *sps</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Sets the level and profile in <em class="parameter"><code>caps</code></em> if it can be determined from <em class="parameter"><code>sps</code></em>. See
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level" title="gst_codec_utils_h264_get_level ()"><code class="function">gst_codec_utils_h264_get_level()</code></a> and <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile" title="gst_codec_utils_h264_get_profile ()"><code class="function">gst_codec_utils_h264_get_profile()</code></a>
+for more details on the parameters.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to which the level and profile are to be added</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sps</code></em> :</span></p></td>
+<td>Pointer to the sequence parameter set for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the level and profile could be set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-h264-get-level-idc"></a><h3>gst_codec_utils_h264_get_level_idc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_codec_utils_h264_get_level_idc (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *level</code></em>);</pre>
+<p>
+Transform a level string from the caps into the level_idc
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>A level string from caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the level_idc or 0 if the level is unknown</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-mpeg4video-get-profile"></a><h3>gst_codec_utils_mpeg4video_get_profile ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_mpeg4video_get_profile
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Converts the profile indication in the stream's visual object sequence into
+a string. <em class="parameter"><code>vis_obj_seq</code></em> is expected to be the data following the visual
+object sequence start code. Only the first byte
+(profile_and_level_indication) is used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vis_obj_seq</code></em> :</span></p></td>
+<td>Pointer to the visual object sequence for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The profile as a const string, or NULL if there is an error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-mpeg4video-get-level"></a><h3>gst_codec_utils_mpeg4video_get_level ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_codec_utils_mpeg4video_get_level
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Converts the level indication in the stream's visual object sequence into
+a string. <em class="parameter"><code>vis_obj_seq</code></em> is expected to be the data following the visual
+object sequence start code. Only the first byte
+(profile_and_level_indication) is used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vis_obj_seq</code></em> :</span></p></td>
+<td>Pointer to the visual object sequence for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The level as a const string, or NULL if there is an error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-codec-utils-mpeg4video-caps-set-level-and-profile"></a><h3>gst_codec_utils_mpeg4video_caps_set_level_and_profile ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_codec_utils_mpeg4video_caps_set_level_and_profile
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *vis_obj_seq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Sets the level and profile in <em class="parameter"><code>caps</code></em> if it can be determined from
+<em class="parameter"><code>vis_obj_seq</code></em>. See <a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-level" title="gst_codec_utils_mpeg4video_get_level ()"><code class="function">gst_codec_utils_mpeg4video_get_level()</code></a> and
+<a class="link" href="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-profile" title="gst_codec_utils_mpeg4video_get_profile ()"><code class="function">gst_codec_utils_mpeg4video_get_profile()</code></a> for more details on the
+parameters.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to which the level and profile are to be added</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vis_obj_seq</code></em> :</span></p></td>
+<td>Pointer to the visual object sequence for the stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>Length of the data available in <em class="parameter"><code>sps</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the level and profile could be set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpbutilsdescriptions.html b/docs/libs/html/gst-plugins-base-libs-gstpbutilsdescriptions.html
new file mode 100644
index 0000000..6d139db
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpbutilsdescriptions.html
@@ -0,0 +1,297 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpbutilsdescriptions</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">
+<link rel="next" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpbutilscodecutils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpbutilsdescriptions.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpbutilsdescriptions.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpbutilsdescriptions"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpbutilsdescriptions.top_of_page"></a>gstpbutilsdescriptions</span></h2>
+<p>gstpbutilsdescriptions — Provides human-readable descriptions for caps/codecs
+and encoder, decoder, URI source and URI sink elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpbutilsdescriptions.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/descriptions.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-source-description" title="gst_pb_utils_get_source_description ()">gst_pb_utils_get_source_description</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-sink-description" title="gst_pb_utils_get_sink_description ()">gst_pb_utils_get_sink_description</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-decoder-description" title="gst_pb_utils_get_decoder_description ()">gst_pb_utils_get_decoder_description</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-encoder-description" title="gst_pb_utils_get_encoder_description ()">gst_pb_utils_get_encoder_description</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-element-description" title="gst_pb_utils_get_element_description ()">gst_pb_utils_get_element_description</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list" title="gst_pb_utils_add_codec_description_to_tag_list ()">gst_pb_utils_add_codec_description_to_tag_list</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *codec_tag</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-codec-description" title="gst_pb_utils_get_codec_description ()">gst_pb_utils_get_codec_description</a> (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsdescriptions.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id585754"></a><p>
+The above functions provide human-readable strings for media formats
+and decoder/demuxer/depayloader/encoder/muxer/payloader elements for use
+in error dialogs or other messages shown to users.
+</p>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list" title="gst_pb_utils_add_codec_description_to_tag_list ()"><code class="function">gst_pb_utils_add_codec_description_to_tag_list()</code></a> is a utility function
+for demuxer and decoder elements to add audio/video codec tags from a
+given (fixed) <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsdescriptions.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-pb-utils-get-source-description"></a><h3>gst_pb_utils_get_source_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_source_description (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Returns a localised string describing a source element handling the protocol
+specified in <em class="parameter"><code>protocol</code></em>, for use in error dialogs or other messages to be
+seen by the user. Should never return NULL unless <em class="parameter"><code>protocol</code></em> is invalid.
+</p>
+<p>
+This function is mainly for internal use, applications would typically
+use <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a> to get a description of
+a missing feature from a missing-plugin message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the protocol the source element needs to handle, e.g. "http"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-get-sink-description"></a><h3>gst_pb_utils_get_sink_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_sink_description (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Returns a localised string describing a sink element handling the protocol
+specified in <em class="parameter"><code>protocol</code></em>, for use in error dialogs or other messages to be
+seen by the user. Should never return NULL unless <em class="parameter"><code>protocol</code></em> is invalid.
+</p>
+<p>
+This function is mainly for internal use, applications would typically
+use <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a> to get a description of
+a missing feature from a missing-plugin message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the protocol the sink element needs to handle, e.g. "http"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-get-decoder-description"></a><h3>gst_pb_utils_get_decoder_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_decoder_description
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Returns a localised string describing an decoder for the format specified
+in <em class="parameter"><code>caps</code></em>, for use in error dialogs or other messages to be seen by the user.
+Should never return NULL unless <em class="parameter"><code>factory_name</code></em> or <em class="parameter"><code>caps</code></em> are invalid.
+</p>
+<p>
+This function is mainly for internal use, applications would typically
+use <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a> to get a description of
+a missing feature from a missing-plugin message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the (fixed) <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> for which an decoder description is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-get-encoder-description"></a><h3>gst_pb_utils_get_encoder_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_encoder_description
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Returns a localised string describing an encoder for the format specified
+in <em class="parameter"><code>caps</code></em>, for use in error dialogs or other messages to be seen by the user.
+Should never return NULL unless <em class="parameter"><code>factory_name</code></em> or <em class="parameter"><code>caps</code></em> are invalid.
+</p>
+<p>
+This function is mainly for internal use, applications would typically
+use <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a> to get a description of
+a missing feature from a missing-plugin message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the (fixed) <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> for which an encoder description is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-get-element-description"></a><h3>gst_pb_utils_get_element_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_element_description
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);</pre>
+<p>
+Returns a localised string describing the given element, for use in
+error dialogs or other messages to be seen by the user. Should never
+return NULL unless <em class="parameter"><code>factory_name</code></em> is invalid.
+</p>
+<p>
+This function is mainly for internal use, applications would typically
+use <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a> to get a description of
+a missing feature from a missing-plugin message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory_name</code></em> :</span></p></td>
+<td>the name of the element, e.g. "giosrc"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-add-codec-description-to-tag-list"></a><h3>gst_pb_utils_add_codec_description_to_tag_list ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_pb_utils_add_codec_description_to_tag_list
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *codec_tag</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Adds a codec tag describing the format specified by <em class="parameter"><code>caps</code></em> to <em class="parameter"><code>taglist</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>taglist</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>codec_tag</code></em> :</span></p></td>
+<td>a GStreamer codec tag such as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-AUDIO-CODEC:CAPS"><span class="type">GST_TAG_AUDIO_CODEC</span></a>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-VIDEO-CODEC:CAPS"><span class="type">GST_TAG_VIDEO_CODEC</span></a> or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-CODEC:CAPS"><span class="type">GST_TAG_CODEC</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the (fixed) <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> for which a codec tag should be added.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if a codec tag was added, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pb-utils-get-codec-description"></a><h3>gst_pb_utils_get_codec_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_pb_utils_get_codec_description (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Returns a localised (as far as this is possible) string describing the
+media format specified in <em class="parameter"><code>caps</code></em>, for use in error dialogs or other messages
+to be seen by the user. Should never return NULL unless <em class="parameter"><code>caps</code></em> is invalid.
+</p>
+<p>
+Also see the convenience function
+<a class="link" href="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list" title="gst_pb_utils_add_codec_description_to_tag_list ()"><code class="function">gst_pb_utils_add_codec_description_to_tag_list()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the (fixed) <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> for which an format description is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpbutilsinstallplugins.html b/docs/libs/html/gst-plugins-base-libs-gstpbutilsinstallplugins.html
new file mode 100644
index 0000000..b912f5f
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpbutilsinstallplugins.html
@@ -0,0 +1,821 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpbutilsinstallplugins</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html" title="gstpbutilsmissingplugins">
+<link rel="next" href="gst-plugins-base-libs-gstdiscoverer.html" title="gstdiscoverer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstdiscoverer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpbutilsinstallplugins.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpbutilsinstallplugins.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpbutilsinstallplugins"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpbutilsinstallplugins.top_of_page"></a>gstpbutilsinstallplugins</span></h2>
+<p>gstpbutilsinstallplugins — Missing plugin installation support for applications</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpbutilsinstallplugins.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/install-plugins.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn">GstInstallPluginsReturn</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" title="GstInstallPluginsResultFunc ()">*GstInstallPluginsResultFunc</a>) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="type">GstInstallPluginsReturn</span></a> result</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="returnvalue">GstInstallPluginsReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()">gst_install_plugins_async</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **details</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" title="GstInstallPluginsResultFunc ()"><span class="type">GstInstallPluginsResultFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="returnvalue">GstInstallPluginsReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()">gst_install_plugins_sync</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **details</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-return-get-name" title="gst_install_plugins_return_get_name ()">gst_install_plugins_return_get_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="type">GstInstallPluginsReturn</span></a> ret</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-installation-in-progress" title="gst_install_plugins_installation_in_progress ()">gst_install_plugins_installation_in_progress</a>
+ (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-supported" title="gst_install_plugins_supported ()">gst_install_plugins_supported</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+
+ <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext">GstInstallPluginsContext</a>;
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="returnvalue">GstInstallPluginsContext</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-new" title="gst_install_plugins_context_new ()">gst_install_plugins_context_new</a>
+ (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-free" title="gst_install_plugins_context_free ()">gst_install_plugins_context_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-set-xid" title="gst_install_plugins_context_set_xid ()">gst_install_plugins_context_set_xid</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> xid</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsinstallplugins.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id583118"></a><h3>Overview</h3>
+<p>
+Using this API, applications can request the installation of missing
+GStreamer plugins. These may be missing decoders/demuxers or encoders/muxers
+for a certain format, sources or sinks for a certain URI protocol
+(e.g. 'http'), or certain elements known by their element factory name
+('audioresample').
+</p>
+<p>
+Whether plugin installation is supported or not depends on the operating
+system and/or distribution in question. The vendor of the operating system
+needs to make sure the necessary hooks and mechanisms are in place for
+plugin installation to work. See below for more detailed information.
+</p>
+<p>
+From the application perspective, plugin installation is usually triggered
+either
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+when the application itself has found that it wants or needs to install a
+certain element
+</p></li>
+<li class="listitem"><p>
+when the application has been notified by an element (such as playbin or
+decodebin) that one or more plugins are missing <span class="emphasis"><em>and</em></span>
+the application has decided that it wants to install one or more of those
+missing plugins
+</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+The install functions in this section all take one or more 'detail strings'.
+These detail strings contain information about the type of plugin that
+needs to be installed (decoder, encoder, source, sink, or named element),
+and some additional information such GStreamer version used and a
+human-readable description of the component to install for user dialogs.
+</p>
+<p>
+Applications should not concern themselves with the composition of the
+string itself. They should regard the string as if it was a shared secret
+between GStreamer and the plugin installer application.
+</p>
+<p>
+Detail strings can be obtained using the function
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()"><code class="function">gst_missing_plugin_message_get_installer_detail()</code></a> on a missing-plugin
+message. Such a message will either have been found by the application on
+a pipeline's <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBus.html"><span class="type">GstBus</span></a>, or the application will have created it itself using
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new" title="gst_missing_element_message_new ()"><code class="function">gst_missing_element_message_new()</code></a>, <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-message-new" title="gst_missing_decoder_message_new ()"><code class="function">gst_missing_decoder_message_new()</code></a>,
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-message-new" title="gst_missing_encoder_message_new ()"><code class="function">gst_missing_encoder_message_new()</code></a>, <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-message-new" title="gst_missing_uri_sink_message_new ()"><code class="function">gst_missing_uri_sink_message_new()</code></a>, or
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-message-new" title="gst_missing_uri_source_message_new ()"><code class="function">gst_missing_uri_source_message_new()</code></a>.
+</p>
+<p>
+For each GStreamer element/plugin/component that should be installed, the
+application needs one of those 'installer detail' string mentioned in the
+previous section. This string can be obtained, as already mentioned above,
+from a missing-plugin message using the function
+<a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()"><code class="function">gst_missing_plugin_message_get_installer_detail()</code></a>. The missing-plugin
+message is either posted by another element and then found on the bus
+by the application, or the application has created it itself as described
+above.
+</p>
+<p>
+The application will then call <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a>, passing a
+NULL-terminated array of installer detail strings, and a function that
+should be called when the installation of the plugins has finished
+(successfully or not). Optionally, a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> created
+with <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-new" title="gst_install_plugins_context_new ()"><code class="function">gst_install_plugins_context_new()</code></a> may be passed as well. This way
+additional optional arguments like the application window's XID can be
+passed to the external installer application.
+</p>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> will return almost immediately, with the
+return code indicating whether plugin installation was started or not.
+If the necessary hooks for plugin installation are in place and an
+external installer application has in fact been called, the passed in
+function will be called with a result code as soon as the external installer
+has finished. If the result code indicates that new plugins have been
+installed, the application will want to call <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-update-registry"><code class="function">gst_update_registry()</code></a> so the
+run-time plugin registry is updated and the new plugins are made available
+to the application.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+A Gtk/GLib main loop must be running in order for the result function to
+be called when the external installer has finished. If this is not the case,
+make sure to regularly call
+<pre class="programlisting">
+g_main_context_iteration (NULL,FALSE);
+</pre>
+from your code.
+</div>
+<p>
+</p>
+<p>
+<span class="emphasis"><em>1. Installer hook</em></span>
+</p>
+<p>
+When GStreamer applications initiate plugin installation via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>, a pre-defined
+helper application will be called.
+</p>
+<p>
+The exact path of the helper application to be called is set at compile
+time, usually by the <code class="literal">./configure</code> script based on the
+install prefix. For a normal package build into the <code class="literal">/usr</code>
+prefix, this will usually default to
+<code class="filename">/usr/libexec/gst-install-plugins-helper</code> or
+<code class="filename">/usr/lib/gst-install-plugins-helper</code>.
+</p>
+<p>
+Vendors/distros who want to support GStreamer plugin installation should
+either provide such a helper script/application or use the
+<code class="literal">./configure</code> option
+<code class="literal">--with-install-plugins-helper=/path/to/installer</code> to
+make GStreamer call an installer of their own directly.
+</p>
+<p>
+It is strongly recommended that vendors provide a small helper application
+as interlocutor to the real installer though, even more so if command line
+argument munging is required to transform the command line arguments
+passed by GStreamer to the helper application into arguments that are
+understood by the real installer.
+</p>
+<p>
+The helper application path defined at compile time can be overriden at
+runtime by setting the <code class="envar">GST_INSTALL_PLUGINS_HELPER</code>
+environment variable. This can be useful for testing/debugging purposes.
+</p>
+<p>
+<span class="emphasis"><em>2. Arguments passed to the install helper</em></span>
+</p>
+<p>
+GStreamer will pass the following arguments to the install helper (this is
+in addition to the path of the executable itself, which is by convention
+argv[0]):
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ none to many optional arguments in the form of
+ <code class="literal">--foo-bar=val</code>. Example:
+ <code class="literal">--transient-for=XID</code> where XID is the X Window ID of
+ the main window of the calling application (so the installer can make
+ itself transient to that window). Unknown optional arguments should
+ be ignored by the installer.
+ </p></li>
+<li class="listitem"><p>
+ one 'installer detail string' argument for each plugin to be installed;
+ these strings will have a <code class="literal">gstreamer</code> prefix; the
+ exact format of the detail string is explained below
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+<span class="emphasis"><em>3. Detail string describing the missing plugin</em></span>
+</p>
+<p>
+The string is in UTF-8 encoding and is made up of several fields, separated
+by '|' characters (but neither the first nor the last character is a '|').
+The fields are:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+<p>
+ plugin system identifier, ie. "gstreamer"
+ </p>
+<p>
+ This identifier determines the format of the rest of the detail string.
+ Automatic plugin installers should not process detail strings with
+ unknown identifiers. This allows other plugin-based libraries to use
+ the same mechanism for their automatic plugin installation needs, or
+ for the format to be changed should it turn out to be insufficient.
+ </p>
+</li>
+<li class="listitem">
+<p>
+ plugin system version, e.g. "0.10"
+ </p>
+<p>
+ This is required so that when there is a GStreamer-0.12 or GStreamer-1.0
+ at some point in future, the different major versions can still co-exist
+ and use the same plugin install mechanism in the same way.
+ </p>
+</li>
+<li class="listitem">
+<p>
+ application identifier, e.g. "totem"
+ </p>
+<p>
+ This may also be in the form of "pid/12345" if the program name can't
+ be obtained for some reason.
+ </p>
+</li>
+<li class="listitem"><p>
+ human-readable localised description of the required component,
+ e.g. "Vorbis audio decoder"
+ </p></li>
+<li class="listitem">
+<p>
+ identifier string for the required component (see below for details about
+ how to map this to the package/plugin that needs installing), e.g.
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="circle">
+<li class="listitem"><p>
+ urisource-$(PROTOCOL_REQUIRED), e.g. urisource-http or urisource-mms
+ </p></li>
+<li class="listitem"><p>
+ element-$(ELEMENT_REQUIRED), e.g. element-videoconvert
+ </p></li>
+<li class="listitem">
+<p>
+ decoder-$(CAPS_REQUIRED), e.g. (do read below for more details!):
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="square">
+<li class="listitem"><p>decoder-audio/x-vorbis</p></li>
+<li class="listitem"><p>decoder-application/ogg</p></li>
+<li class="listitem"><p>decoder-audio/mpeg, mpegversion=(int)4</p></li>
+<li class="listitem"><p>decoder-video/mpeg, systemstream=(boolean)true, mpegversion=(int)2</p></li>
+</ul></div>
+<p>
+ </p>
+</li>
+<li class="listitem"><p>
+ encoder-$(CAPS_REQUIRED), e.g. encoder-audio/x-vorbis
+ </p></li>
+</ul></div>
+<p>
+ </p>
+</li>
+<li class="listitem"><p>
+ optional further fields not yet specified
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+An entire ID string might then look like this, for example:
+<code class="literal">
+gstreamer|0.10|totem|Vorbis audio decoder|decoder-audio/x-vorbis
+</code>
+</p>
+<p>
+Plugin installers parsing this ID string should expect further fields also
+separated by '|' symbols and either ignore them, warn the user, or error
+out when encountering them.
+</p>
+<p>
+Those unfamiliar with the GStreamer 'caps' system should note a few things
+about the caps string used in the above decoder/encoder case:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ the first part ("video/mpeg") of the caps string is a GStreamer media
+ type and <span class="emphasis"><em>not</em></span> a MIME type. Wherever possible, the
+ GStreamer media type will be the same as the corresponding MIME type,
+ but often it is not.
+ </p></li>
+<li class="listitem"><p>
+ a caps string may or may not have additional comma-separated fields
+ of various types (as seen in the examples above)
+ </p></li>
+<li class="listitem">
+<p>
+ the caps string of a 'required' component (as above) will always have
+ fields with fixed values, whereas an introspected string (see below)
+ may have fields with non-fixed values. Compare for example:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="circle">
+<li class="listitem"><p>
+ <code class="literal">audio/mpeg, mpegversion=(int)4</code> vs.
+ <code class="literal">audio/mpeg, mpegversion=(int){2, 4}</code>
+ </p></li>
+<li class="listitem"><p>
+ <code class="literal">video/mpeg, mpegversion=(int)2</code> vs.
+ <code class="literal">video/mpeg, systemstream=(boolean){ true, false}, mpegversion=(int)[1, 2]</code>
+ </p></li>
+</ul></div>
+<p>
+ </p>
+</li>
+</ul></div>
+<p>
+</p>
+<p>
+<span class="emphasis"><em>4. Exit codes the installer should return</em></span>
+</p>
+<p>
+The installer should return one of the following exit codes when it exits:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ 0 if all of the requested plugins could be installed
+ (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-SUCCESS:CAPS"><span class="type">GST_INSTALL_PLUGINS_SUCCESS</span></a>)
+ </p></li>
+<li class="listitem"><p>
+ 1 if no appropriate installation candidate for any of the requested
+ plugins could be found. Only return this if nothing has been installed
+ (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-NOT-FOUND:CAPS"><span class="type">GST_INSTALL_PLUGINS_NOT_FOUND</span></a>)
+ </p></li>
+<li class="listitem"><p>
+ 2 if an error occured during the installation. The application will
+ assume that the user will already have seen an error message by the
+ installer in this case and will usually not show another one
+ (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-ERROR:CAPS"><span class="type">GST_INSTALL_PLUGINS_ERROR</span></a>)
+ </p></li>
+<li class="listitem"><p>
+ 3 if some of the requested plugins could be installed, but not all
+ (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS"><span class="type">GST_INSTALL_PLUGINS_PARTIAL_SUCCESS</span></a>)
+ </p></li>
+<li class="listitem"><p>
+ 4 if the user aborted the installation (<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-USER-ABORT:CAPS"><span class="type">GST_INSTALL_PLUGINS_USER_ABORT</span></a>)
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+<span class="emphasis"><em>5. How to map the required detail string to packages</em></span>
+</p>
+<p>
+It is up to the vendor to find mechanism to map required components from
+the detail string to the actual packages/plugins to install. This could
+be a hardcoded list of mappings, for example, or be part of the packaging
+system metadata.
+</p>
+<p>
+GStreamer plugin files can be introspected for this information. The
+<code class="literal">gst-inspect</code> utility has a special command line option
+that will output information similar to what is required. For example
+<span class="command"><strong>
+$ gst-inspect-0.10 --print-plugin-auto-install-info /path/to/libgstvorbis.so
+</strong></span>
+should output something along the lines of
+<code class="computeroutput">
+decoder-audio/x-vorbis
+element-vorbisdec
+element-vorbisenc
+element-vorbisparse
+element-vorbistag
+encoder-audio/x-vorbis
+</code>
+Note that in the encoder and decoder case the introspected caps can be more
+complex with additional fields, e.g.
+<code class="literal">audio/mpeg,mpegversion=(int){2,4}</code>, so they will not
+always exactly match the caps wanted by the application. It is up to the
+installer to deal with this (either by doing proper caps intersection using
+the GStreamer <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> API, or by only taking into account the media type).
+</p>
+<p>
+Another potential source of problems are plugins such as ladspa or
+libvisual where the list of elements depends on the installed
+ladspa/libvisual plugins at the time. This is also up to the distribution
+to handle (but usually not relevant for playback applications).
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsinstallplugins.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstInstallPluginsReturn"></a><h3>enum GstInstallPluginsReturn</h3>
+<pre class="programlisting">typedef enum {
+ /* Return codes from the installer. Returned by gst_install_plugins_sync(),
+ * or passed as result code to your #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_SUCCESS = 0,
+ GST_INSTALL_PLUGINS_NOT_FOUND = 1,
+ GST_INSTALL_PLUGINS_ERROR = 2,
+ GST_INSTALL_PLUGINS_PARTIAL_SUCCESS = 3,
+ GST_INSTALL_PLUGINS_USER_ABORT = 4,
+
+ /* Returned by gst_install_plugins_sync(), or passed as result code to your
+ * #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_CRASHED = 100,
+ GST_INSTALL_PLUGINS_INVALID,
+
+ /* Return codes from starting the external helper, may be returned by both
+ * gst_install_plugins_sync() and gst_install_plugins_async(), but should
+ * never be seen by a #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_STARTED_OK = 200,
+ GST_INSTALL_PLUGINS_INTERNAL_FAILURE,
+ GST_INSTALL_PLUGINS_HELPER_MISSING,
+ GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS
+} GstInstallPluginsReturn;
+</pre>
+<p>
+Result codes returned by <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> and
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>, and also the result code passed to the
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" title="GstInstallPluginsResultFunc ()"><span class="type">GstInstallPluginsResultFunc</span></a> specified with <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a>.
+</p>
+<p>
+These codes indicate success or failure of starting an external installer
+program and to what extent the requested plugins could be installed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-SUCCESS:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_SUCCESS</code></span></p></td>
+<td>all of the requested plugins could be
+ installed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-NOT-FOUND:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_NOT_FOUND</code></span></p></td>
+<td>no appropriate installation candidate for
+ any of the requested plugins could be found. Only return this if nothing
+ has been installed. Return <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS"><span class="type">GST_INSTALL_PLUGINS_PARTIAL_SUCCESS</span></a> if
+ some (but not all) of the requested plugins could be installed.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-ERROR:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_ERROR</code></span></p></td>
+<td>an error occured during the installation. If
+ this happens, the user has already seen an error message and another
+ one should not be displayed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_PARTIAL_SUCCESS</code></span></p></td>
+<td>some of the requested plugins could
+ be installed, but not all
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-USER-ABORT:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_USER_ABORT</code></span></p></td>
+<td>the user has aborted the installation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-CRASHED:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_CRASHED</code></span></p></td>
+<td>the installer had an unclean exit code
+ (ie. death by signal)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-INVALID:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_INVALID</code></span></p></td>
+<td>the helper returned an invalid status code
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-STARTED-OK:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_STARTED_OK</code></span></p></td>
+<td>returned by <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> to
+ indicate that everything went fine so far and the provided callback
+ will be called with the result of the installation later
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-INTERNAL-FAILURE:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_INTERNAL_FAILURE</code></span></p></td>
+<td>some internal failure has
+ occured when trying to start the installer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-HELPER-MISSING:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_HELPER_MISSING</code></span></p></td>
+<td>the helper script to call the
+ actual installer is not installed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INSTALL-PLUGINS-INSTALL-IN-PROGRESS:CAPS"></a><span class="term"><code class="literal">GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS</code></span></p></td>
+<td>a previously-started plugin
+ installation is still in progress, try again later
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInstallPluginsResultFunc"></a><h3>GstInstallPluginsResultFunc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstInstallPluginsResultFunc) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="type">GstInstallPluginsReturn</span></a> result</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+The prototype of the callback function that will be called once the
+external plugin installer program has returned. You only need to provide
+a callback function if you are using the asynchronous interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>result</code></em> :</span></p></td>
+<td>whether the installation of the requested plugins succeeded or not</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the user data passed to <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-async"></a><h3>gst_install_plugins_async ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="returnvalue">GstInstallPluginsReturn</span></a> gst_install_plugins_async (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **details</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" title="GstInstallPluginsResultFunc ()"><span class="type">GstInstallPluginsResultFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Requests plugin installation without blocking. Once the plugins have been
+installed or installation has failed, <em class="parameter"><code>func</code></em> will be called with the result
+of the installation and your provided <em class="parameter"><code>user_data</code></em> pointer.
+</p>
+<p>
+This function requires a running GLib/Gtk main loop. If you are not
+running a GLib/Gtk main loop, make sure to regularly call
+g_main_context_iteration(NULL,FALSE).
+</p>
+<p>
+The installer strings that make up <em class="parameter"><code>detail</code></em> are typically obtained by
+calling <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()"><code class="function">gst_missing_plugin_message_get_installer_detail()</code></a> on missing-plugin
+messages that have been caught on a pipeline's bus or created by the
+application via the provided API, such as <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new" title="gst_missing_element_message_new ()"><code class="function">gst_missing_element_message_new()</code></a>.
+</p>
+<p>
+It is possible to request the installation of multiple missing plugins in
+one go (as might be required if there is a demuxer for a certain format
+installed but no suitable video decoder and no suitable audio decoder).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>details</code></em> :</span></p></td>
+<td>NULL-terminated array of installer string details (see below)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ctx</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function to call when the installer program returns. <span class="annotation">[<acronym title="The callback is valid until first called."><span class="acronym">scope async</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the user data to pass to <em class="parameter"><code>func</code></em> when called, or NULL. <span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>result code whether an external installer could be started</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-sync"></a><h3>gst_install_plugins_sync ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="returnvalue">GstInstallPluginsReturn</span></a> gst_install_plugins_sync (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **details</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>);</pre>
+<p>
+Requests plugin installation and block until the plugins have been
+installed or installation has failed.
+</p>
+<p>
+This function should almost never be used, it only exists for cases where
+a non-GLib main loop is running and the user wants to run it in a separate
+thread and marshal the result back asynchronously into the main thread
+using the other non-GLib main loop. You should almost always use
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> instead of this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>details</code></em> :</span></p></td>
+<td>NULL-terminated array of installer string details</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ctx</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the installation.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-return-get-name"></a><h3>gst_install_plugins_return_get_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_install_plugins_return_get_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" title="enum GstInstallPluginsReturn"><span class="type">GstInstallPluginsReturn</span></a> ret</code></em>);</pre>
+<p>
+Convenience function to return the descriptive string associated
+with a status code. This function returns English strings and
+should not be used for user messages. It is here only to assist
+in debugging.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ret</code></em> :</span></p></td>
+<td>the return status code</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a descriptive string for the status code in <em class="parameter"><code>ret</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-installation-in-progress"></a><h3>gst_install_plugins_installation_in_progress ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_install_plugins_installation_in_progress
+ (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Checks whether plugin installation (initiated by this application only)
+is currently in progress.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if plugin installation is in progress, otherwise FALSE</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-supported"></a><h3>gst_install_plugins_supported ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_install_plugins_supported (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Checks whether plugin installation is likely to be supported by the
+current environment. This currently only checks whether the helper script
+that is to be provided by the distribution or operating system vendor
+exists.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if plugin installation is likely to be supported.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInstallPluginsContext"></a><h3>GstInstallPluginsContext</h3>
+<pre class="programlisting">typedef struct _GstInstallPluginsContext GstInstallPluginsContext;</pre>
+<p>
+Opaque context structure for the plugin installation. Use the provided
+API to set details on it.
+</p>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-context-new"></a><h3>gst_install_plugins_context_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="returnvalue">GstInstallPluginsContext</span></a> * gst_install_plugins_context_new
+ (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>. Free with
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-free" title="gst_install_plugins_context_free ()"><code class="function">gst_install_plugins_context_free()</code></a> when no longer needed</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-context-free"></a><h3>gst_install_plugins_context_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_install_plugins_context_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>);</pre>
+<p>
+Frees a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ctx</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-install-plugins-context-set-xid"></a><h3>gst_install_plugins_context_set_xid ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_install_plugins_context_set_xid (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a> *ctx</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> xid</code></em>);</pre>
+<p>
+This function is for X11-based applications (such as most Gtk/Qt
+applications on linux/unix) only. You can use it to tell the external
+installer the XID of your main application window. That way the installer
+can make its own window transient to your application window during the
+installation.
+</p>
+<p>
+If set, the XID will be passed to the installer via a --transient-for=XID
+command line option.
+</p>
+<p>
+Gtk+/Gnome application should be able to obtain the XID of the top-level
+window like this:
+</p>
+<pre class="programlisting">
+##include &lt;gtk/gtk.h&gt;
+##ifdef GDK_WINDOWING_X11
+##include &lt;gdk/gdkx.h&gt;
+##endif
+...
+##ifdef GDK_WINDOWING_X11
+ xid = GDK_WINDOW_XWINDOW (GTK_WIDGET (application_window)-&gt;window);
+##endif
+...
+</pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ctx</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" title="GstInstallPluginsContext"><span class="type">GstInstallPluginsContext</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>xid</code></em> :</span></p></td>
+<td>the XWindow ID (XID) of the top-level application</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpbutilsmissingplugins.html b/docs/libs/html/gst-plugins-base-libs-gstpbutilsmissingplugins.html
new file mode 100644
index 0000000..95f0f50
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpbutilsmissingplugins.html
@@ -0,0 +1,510 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpbutilsmissingplugins</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpbutilsdescriptions.html" title="gstpbutilsdescriptions">
+<link rel="next" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html" title="gstpbutilsinstallplugins">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpbutilsdescriptions.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpbutilsmissingplugins.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpbutilsmissingplugins.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpbutilsmissingplugins"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpbutilsmissingplugins.top_of_page"></a>gstpbutilsmissingplugins</span></h2>
+<p>gstpbutilsmissingplugins — Create, recognise and parse missing-plugins messages</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpbutilsmissingplugins.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/missing-plugins.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()">gst_missing_plugin_message_get_installer_detail</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()">gst_missing_plugin_message_get_description</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-is-missing-plugin-message" title="gst_is_missing_plugin_message ()">gst_is_missing_plugin_message</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-message-new" title="gst_missing_decoder_message_new ()">gst_missing_decoder_message_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *decode_caps</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-message-new" title="gst_missing_encoder_message_new ()">gst_missing_encoder_message_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *encode_caps</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-message-new" title="gst_missing_uri_source_message_new ()">gst_missing_uri_source_message_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-message-new" title="gst_missing_uri_sink_message_new ()">gst_missing_uri_sink_message_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new" title="gst_missing_element_message_new ()">gst_missing_element_message_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-installer-detail-new" title="gst_missing_uri_source_installer_detail_new ()">gst_missing_uri_source_installer_detail_new</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-installer-detail-new" title="gst_missing_uri_sink_installer_detail_new ()">gst_missing_uri_sink_installer_detail_new</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-installer-detail-new" title="gst_missing_element_installer_detail_new ()">gst_missing_element_installer_detail_new</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-installer-detail-new" title="gst_missing_decoder_installer_detail_new ()">gst_missing_decoder_installer_detail_new</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *decode_caps</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-installer-detail-new" title="gst_missing_encoder_installer_detail_new ()">gst_missing_encoder_installer_detail_new</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *encode_caps</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsmissingplugins.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id605343"></a><p>
+Functions to create, recognise and parse missing-plugins messages for
+applications and elements.
+</p>
+<p>
+Missing-plugin messages are posted on the bus by elements like decodebin
+or playbin if they can't find an appropriate source element or decoder
+element. The application can use these messages for two things:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ concise error/problem reporting to the user mentioning what exactly
+ is missing, see <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description" title="gst_missing_plugin_message_get_description ()"><code class="function">gst_missing_plugin_message_get_description()</code></a>
+ </p></li>
+<li class="listitem"><p>
+ initiate installation of missing plugins, see
+ <a class="link" href="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail" title="gst_missing_plugin_message_get_installer_detail ()"><code class="function">gst_missing_plugin_message_get_installer_detail()</code></a> and
+ <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a>
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+Applications may also create missing-plugin messages themselves to install
+required elements that are missing, using the install mechanism mentioned
+above.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpbutilsmissingplugins.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-missing-plugin-message-get-installer-detail"></a><h3>gst_missing_plugin_message_get_installer_detail ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_plugin_message_get_installer_detail
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a missing-plugin <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> of type <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-ELEMENT:CAPS"><span class="type">GST_MESSAGE_ELEMENT</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-plugin-message-get-description"></a><h3>gst_missing_plugin_message_get_description ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_plugin_message_get_description
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Returns a localised string describing the missing feature, for use in
+error dialogs and the like. Should never return NULL unless <em class="parameter"><code>msg</code></em> is not
+a valid missing-plugin message.
+</p>
+<p>
+This function is mainly for applications that need a human-readable string
+describing a missing plugin, given a previously collected missing-plugin
+message
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a missing-plugin <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> of type <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-ELEMENT:CAPS"><span class="type">GST_MESSAGE_ELEMENT</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated description string, or NULL on error. Free
+string with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-is-missing-plugin-message"></a><h3>gst_is_missing_plugin_message ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_is_missing_plugin_message (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Checks whether <em class="parameter"><code>msg</code></em> is a missing plugins message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>msg</code></em> is a missing-plugins message, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-decoder-message-new"></a><h3>gst_missing_decoder_message_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_missing_decoder_message_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *decode_caps</code></em>);</pre>
+<p>
+Creates a missing-plugin message for <em class="parameter"><code>element</code></em> to notify the application
+that a decoder element for a particular set of (fixed) caps is missing.
+This function is mainly for use in plugins.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>decode_caps</code></em> :</span></p></td>
+<td>the (fixed) caps for which a decoder element is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or NULL on error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-encoder-message-new"></a><h3>gst_missing_encoder_message_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_missing_encoder_message_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *encode_caps</code></em>);</pre>
+<p>
+Creates a missing-plugin message for <em class="parameter"><code>element</code></em> to notify the application
+that an encoder element for a particular set of (fixed) caps is missing.
+This function is mainly for use in plugins.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>encode_caps</code></em> :</span></p></td>
+<td>the (fixed) caps for which an encoder element is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or NULL on error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-uri-source-message-new"></a><h3>gst_missing_uri_source_message_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_missing_uri_source_message_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Creates a missing-plugin message for <em class="parameter"><code>element</code></em> to notify the application
+that a source element for a particular URI protocol is missing. This
+function is mainly for use in plugins.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the URI protocol the missing source needs to implement,
+e.g. "http" or "mms"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or NULL on error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-uri-sink-message-new"></a><h3>gst_missing_uri_sink_message_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_missing_uri_sink_message_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Creates a missing-plugin message for <em class="parameter"><code>element</code></em> to notify the application
+that a sink element for a particular URI protocol is missing. This
+function is mainly for use in plugins.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the URI protocol the missing sink needs to implement,
+e.g. "http" or "smb"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or NULL on error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-element-message-new"></a><h3>gst_missing_element_message_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_missing_element_message_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);</pre>
+<p>
+Creates a missing-plugin message for <em class="parameter"><code>element</code></em> to notify the application
+that a certain required element is missing. This function is mainly for
+use in plugins.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory_name</code></em> :</span></p></td>
+<td>the name of the missing element (element factory),
+e.g. "videoscale" or "cdparanoiasrc"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a>, or NULL on error. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-uri-source-installer-detail-new"></a><h3>gst_missing_uri_source_installer_detail_new ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_uri_source_installer_detail_new
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions in
+the case where the application knows exactly what kind of plugin it is
+missing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the URI protocol the missing source needs to implement,
+e.g. "http" or "mms"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-uri-sink-installer-detail-new"></a><h3>gst_missing_uri_sink_installer_detail_new ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_uri_sink_installer_detail_new
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *protocol</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions in
+the case where the application knows exactly what kind of plugin it is
+missing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>the URI protocol the missing source needs to implement,
+e.g. "http" or "mms"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-element-installer-detail-new"></a><h3>gst_missing_element_installer_detail_new ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_element_installer_detail_new
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory_name</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions in
+the case where the application knows exactly what kind of plugin it is
+missing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory_name</code></em> :</span></p></td>
+<td>the name of the missing element (element factory),
+e.g. "videoscale" or "cdparanoiasrc"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-decoder-installer-detail-new"></a><h3>gst_missing_decoder_installer_detail_new ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_decoder_installer_detail_new
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *decode_caps</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions in
+the case where the application knows exactly what kind of plugin it is
+missing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>decode_caps</code></em> :</span></p></td>
+<td>the (fixed) caps for which a decoder element is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-missing-encoder-installer-detail-new"></a><h3>gst_missing_encoder_installer_detail_new ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_missing_encoder_installer_detail_new
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *encode_caps</code></em>);</pre>
+<p>
+Returns an opaque string containing all the details about the missing
+element to be passed to an external installer called via
+<a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" title="gst_install_plugins_async ()"><code class="function">gst_install_plugins_async()</code></a> or <a class="link" href="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" title="gst_install_plugins_sync ()"><code class="function">gst_install_plugins_sync()</code></a>.
+</p>
+<p>
+This function is mainly for applications that call external plugin
+installation mechanisms using one of the two above-mentioned functions in
+the case where the application knows exactly what kind of plugin it is
+missing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>encode_caps</code></em> :</span></p></td>
+<td>the (fixed) caps for which an encoder element is needed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated detail string, or NULL on error. Free string
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed any longer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpluginsbaseversion.html b/docs/libs/html/gst-plugins-base-libs-gstpluginsbaseversion.html
new file mode 100644
index 0000000..6338efa
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpluginsbaseversion.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpluginsbaseversion</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base-utils.html" title="Base Utils Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpbutils.html" title="gstpbutils">
+<link rel="next" href="gst-plugins-base-libs-gstpbutilscodecutils.html" title="gstpbutilscodecutils">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpbutils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-base-utils.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpbutilscodecutils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpluginsbaseversion.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpluginsbaseversion.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpluginsbaseversion"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpluginsbaseversion.top_of_page"></a>gstpluginsbaseversion</span></h2>
+<p>gstpluginsbaseversion — GStreamer gst-plugins-base libraries version macros.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpluginsbaseversion.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/pbutils/gstpluginsbaseversion.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MAJOR:CAPS" title="GST_PLUGINS_BASE_VERSION_MAJOR">GST_PLUGINS_BASE_VERSION_MAJOR</a>
+#define <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MINOR:CAPS" title="GST_PLUGINS_BASE_VERSION_MINOR">GST_PLUGINS_BASE_VERSION_MINOR</a>
+#define <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MICRO:CAPS" title="GST_PLUGINS_BASE_VERSION_MICRO">GST_PLUGINS_BASE_VERSION_MICRO</a>
+#define <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-NANO:CAPS" title="GST_PLUGINS_BASE_VERSION_NANO">GST_PLUGINS_BASE_VERSION_NANO</a>
+#define <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-CHECK-PLUGINS-BASE-VERSION:CAPS" title="GST_CHECK_PLUGINS_BASE_VERSION()">GST_CHECK_PLUGINS_BASE_VERSION</a> (major,
+ minor,
+ micro)
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version" title="gst_plugins_base_version ()">gst_plugins_base_version</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *major</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *minor</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *micro</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *nano</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version-string" title="gst_plugins_base_version_string ()">gst_plugins_base_version_string</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpluginsbaseversion.description"></a><h2>Description</h2>
+<p>
+Use the GST_PLUGINS_BASE_VERSION_* macros e.g. to check what version of
+gst-plugins-base you are building against, and <a class="link" href="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version" title="gst_plugins_base_version ()"><code class="function">gst_plugins_base_version()</code></a>
+if you need to check at runtime what version of the gst-plugins-base
+libraries are being used / you are currently linked against.
+</p>
+<p>
+The version macros get defined by including &lt;gst/pbutils/pbutils.h&gt;.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpluginsbaseversion.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-PLUGINS-BASE-VERSION-MAJOR:CAPS"></a><h3>GST_PLUGINS_BASE_VERSION_MAJOR</h3>
+<pre class="programlisting">#define GST_PLUGINS_BASE_VERSION_MAJOR (0)
+</pre>
+<p>
+The major version of GStreamer's gst-plugins-base libraries at compile time.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGINS-BASE-VERSION-MINOR:CAPS"></a><h3>GST_PLUGINS_BASE_VERSION_MINOR</h3>
+<pre class="programlisting">#define GST_PLUGINS_BASE_VERSION_MINOR (11)
+</pre>
+<p>
+The minor version of GStreamer's gst-plugins-base libraries at compile time.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGINS-BASE-VERSION-MICRO:CAPS"></a><h3>GST_PLUGINS_BASE_VERSION_MICRO</h3>
+<pre class="programlisting">#define GST_PLUGINS_BASE_VERSION_MICRO (1)
+</pre>
+<p>
+The micro version of GStreamer's gst-plugins-base libraries at compile time.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGINS-BASE-VERSION-NANO:CAPS"></a><h3>GST_PLUGINS_BASE_VERSION_NANO</h3>
+<pre class="programlisting">#define GST_PLUGINS_BASE_VERSION_NANO (0)
+</pre>
+<p>
+The nano version of GStreamer's gst-plugins-base libraries at compile time.
+Actual releases have 0, GIT versions have 1, prerelease versions have 2-...
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CHECK-PLUGINS-BASE-VERSION:CAPS"></a><h3>GST_CHECK_PLUGINS_BASE_VERSION()</h3>
+<pre class="programlisting">#define GST_CHECK_PLUGINS_BASE_VERSION(major,minor,micro)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugins-base-version"></a><h3>gst_plugins_base_version ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugins_base_version (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *major</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *minor</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *micro</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *nano</code></em>);</pre>
+<p>
+Gets the version number of the GStreamer Plugins Base libraries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>major</code></em> :</span></p></td>
+<td>pointer to a guint to store the major version number, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor</code></em> :</span></p></td>
+<td>pointer to a guint to store the minor version number, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>micro</code></em> :</span></p></td>
+<td>pointer to a guint to store the micro version number, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nano</code></em> :</span></p></td>
+<td>pointer to a guint to store the nano version number, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugins-base-version-string"></a><h3>gst_plugins_base_version_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_plugins_base_version_string (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+This function returns a string that is useful for describing this version
+of GStreamer's gst-plugins-base libraries to the outside world: user agent
+strings, logging, about dialogs ...
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated string describing this version of gst-plugins-base</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstpropertyprobe.html b/docs/libs/html/gst-plugins-base-libs-gstpropertyprobe.html
new file mode 100644
index 0000000..81fa29b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstpropertyprobe.html
@@ -0,0 +1,449 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstpropertyprobe</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstnavigation.html" title="gstnavigation">
+<link rel="next" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstnavigation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gststreamvolume.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstpropertyprobe.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpropertyprobe.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpropertyprobe.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstpropertyprobe.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstpropertyprobe"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstpropertyprobe.top_of_page"></a>gstpropertyprobe</span></h2>
+<p>gstpropertyprobe — Interface for probing possible property values</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstpropertyprobe.synopsis"></a><h2>Synopsis</h2>
+<a name="GstPropertyProbe"></a><pre class="synopsis">
+#include &lt;gst/interfaces/propertyprobe.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-struct" title="GstPropertyProbe">GstPropertyProbe</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbeInterface" title="struct GstPropertyProbeInterface">GstPropertyProbeInterface</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-properties" title="gst_property_probe_get_properties ()">gst_property_probe_get_properties</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="returnvalue">GParamSpec</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-property" title="gst_property_probe_get_property ()">gst_property_probe_get_property</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values" title="gst_property_probe_get_values ()">gst_property_probe_get_values</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values-name" title="gst_property_probe_get_values_name ()">gst_property_probe_get_values_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe" title="gst_property_probe_needs_probe ()">gst_property_probe_needs_probe</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe-name" title="gst_property_probe_needs_probe_name ()">gst_property_probe_needs_probe_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values" title="gst_property_probe_probe_and_get_values ()">gst_property_probe_probe_and_get_values</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values-name" title="gst_property_probe_probe_and_get_values_name ()">gst_property_probe_probe_and_get_values_name</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property" title="gst_property_probe_probe_property ()">gst_property_probe_probe_property</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property-name" title="gst_property_probe_probe_property_name ()">gst_property_probe_probe_property_name</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpropertyprobe.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstPropertyProbe
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpropertyprobe.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-probe-needed" title='The "probe-needed" signal'>probe-needed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpropertyprobe.description"></a><h2>Description</h2>
+<p>
+The property probe is a way to autodetect allowed values for a GObject
+property. It's primary use is to autodetect device-names in several elements.
+</p>
+<p>
+The interface is implemented by many hardware sources and sinks.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpropertyprobe.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPropertyProbe-struct"></a><h3>GstPropertyProbe</h3>
+<pre class="programlisting">typedef struct _GstPropertyProbe GstPropertyProbe;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPropertyProbeInterface"></a><h3>struct GstPropertyProbeInterface</h3>
+<pre class="programlisting">struct GstPropertyProbeInterface {
+ GTypeInterface klass;
+
+ /* signals */
+ void (*probe_needed) (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+
+ /* virtual functions */
+ const GList * (*get_properties) (GstPropertyProbe *probe);
+ gboolean (*needs_probe) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+ void (*probe_property) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+ GValueArray * (*get_values) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInterface"><span class="type">GTypeInterface</span></a> <em class="structfield"><code><a name="GstPropertyProbeInterface.klass"></a>klass</code></em>;</span></p></td>
+<td>parent interface type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPropertyProbeInterface.probe-needed"></a>probe_needed</code></em> ()</span></p></td>
+<td>default signal handler</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPropertyProbeInterface.get-properties"></a>get_properties</code></em> ()</span></p></td>
+<td>virtual method to get list of probable properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPropertyProbeInterface.needs-probe"></a>needs_probe</code></em> ()</span></p></td>
+<td>virtual method to tell if probe need update</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPropertyProbeInterface.probe-property"></a>probe_property</code></em> ()</span></p></td>
+<td>virtual method to probe a property</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPropertyProbeInterface.get-values"></a>get_values</code></em> ()</span></p></td>
+<td>virtual method to get probe results for a property</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-get-properties"></a><h3>gst_property_probe_get_properties ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_property_probe_get_properties (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>);</pre>
+<p>
+Get a list of properties for which probing is supported.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> to get the properties for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the list of properties for which probing is supported
+by this element.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-get-property"></a><h3>gst_property_probe_get_property ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="returnvalue">GParamSpec</span></a> * gst_property_probe_get_property (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Get <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> for a property for which probing is supported.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> to get the properties for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the property.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> of <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-get-values"></a><h3>gst_property_probe_get_values ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * gst_property_probe_get_values (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Gets the possible (probed) values for the given property,
+requires the property to have been probed before.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> property identifier.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of valid values for the given property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-get-values-name"></a><h3>gst_property_probe_get_values_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * gst_property_probe_get_values_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Same as <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values" title="gst_property_probe_get_values ()"><code class="function">gst_property_probe_get_values()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the property to get values for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of valid values for the given property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-needs-probe"></a><h3>gst_property_probe_needs_probe ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_property_probe_needs_probe (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Checks whether a property needs a probe. This might be because
+the property wasn't initialized before, or because host setup
+changed. This might be, for example, because a new device was
+added, and thus device probing needs to be refreshed to display
+the new device.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object to which the given property belongs.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> that identifies the property to check.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the property needs a new probe, FALSE if not.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-needs-probe-name"></a><h3>gst_property_probe_needs_probe_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_property_probe_needs_probe_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Same as <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe" title="gst_property_probe_needs_probe ()"><code class="function">gst_property_probe_needs_probe()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object to which the given property belongs.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the property to check.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the property needs a new probe, FALSE if not.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-probe-and-get-values"></a><h3>gst_property_probe_probe_and_get_values ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * gst_property_probe_probe_and_get_values
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Check whether the given property requires a new probe. If so,
+fo the probe. After that, retrieve a value list. Meant as a
+utility function that wraps the above functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>The <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> property identifier.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the list of valid values for this property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-probe-and-get-values-name"></a><h3>gst_property_probe_probe_and_get_values_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a> * gst_property_probe_probe_and_get_values_name
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Same as <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values" title="gst_property_probe_probe_and_get_values ()"><code class="function">gst_property_probe_probe_and_get_values()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the property to get values for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the list of valid values for this property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-probe-property"></a><h3>gst_property_probe_probe_property ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_property_probe_probe_property (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Runs a probe on the property specified by <em class="parameter"><code>pspec</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> to check.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> of the property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-property-probe-probe-property-name"></a><h3>gst_property_probe_probe_property_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_property_probe_probe_property_name
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *probe</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Runs a probe on the property specified by <em class="parameter"><code>name</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probe</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> to check.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the property.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstpropertyprobe.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstPropertyProbe-probe-needed"></a><h3>The <code class="literal">"probe-needed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe"><span class="type">GstPropertyProbe</span></a> *pspec,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> that needs a probe</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstriff.html b/docs/libs/html/gst-plugins-base-libs-gstriff.html
new file mode 100644
index 0000000..83b7f23
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstriff.html
@@ -0,0 +1,507 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstriff</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-riff.html" title="Riff Media Library">
+<link rel="prev" href="gstreamer-riff.html" title="Riff Media Library">
+<link rel="next" href="gstreamer-rtp.html" title="RTP Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-riff.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-riff.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-rtp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstriff.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstriff.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstriff"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstriff.top_of_page"></a>gstriff</span></h2>
+<p>gstriff — Riff fileformat utillity functions.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstriff.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/riff/riff-media.h&gt;
+
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-caps" title="gst_riff_create_audio_caps ()">gst_riff_create_audio_caps</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> codec_id</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-auds"><span class="type">gst_riff_strf_auds</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-template-caps" title="gst_riff_create_audio_template_caps ()">gst_riff_create_audio_template_caps</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-caps" title="gst_riff_create_iavs_caps ()">gst_riff_create_iavs_caps</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> codec_fcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-iavs"><span class="type">gst_riff_strf_iavs</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-template-caps" title="gst_riff_create_iavs_template_caps ()">gst_riff_create_iavs_template_caps</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-caps" title="gst_riff_create_video_caps ()">gst_riff_create_video_caps</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> codec_fcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-vids"><span class="type">gst_riff_strf_vids</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-template-caps" title="gst_riff_create_video_template_caps ()">gst_riff_create_video_template_caps</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-init" title="gst_riff_init ()">gst_riff_init</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-chunk" title="gst_riff_parse_chunk ()">gst_riff_parse_chunk</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *fourcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **chunk_data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-file-header" title="gst_riff_parse_file_header ()">gst_riff_parse_file_header</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *doctype</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-info" title="gst_riff_parse_info ()">gst_riff_parse_info</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> **taglist</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-auds" title="gst_riff_parse_strf_auds ()">gst_riff_parse_strf_auds</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-auds"><span class="type">gst_riff_strf_auds</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-iavs" title="gst_riff_parse_strf_iavs ()">gst_riff_parse_strf_iavs</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-iavs"><span class="type">gst_riff_strf_iavs</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-vids" title="gst_riff_parse_strf_vids ()">gst_riff_parse_strf_vids</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-vids"><span class="type">gst_riff_strf_vids</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strh" title="gst_riff_parse_strh ()">gst_riff_parse_strh</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> **strh</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gst-plugins-base-libs-gstriff.html#gst-riff-read-chunk" title="gst_riff_read_chunk ()">gst_riff_read_chunk</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *tag</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **chunk_data</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstriff.description"></a><h2>Description</h2>
+<p>
+A collection of functions to handle riff base files, such as avi, wav and
+asf.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstriff.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-riff-create-audio-caps"></a><h3>gst_riff_create_audio_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_audio_caps (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> codec_id</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-auds"><span class="type">gst_riff_strf_auds</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-create-audio-template-caps"></a><h3>gst_riff_create_audio_template_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_audio_template_caps (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-create-iavs-caps"></a><h3>gst_riff_create_iavs_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_iavs_caps (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> codec_fcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-iavs"><span class="type">gst_riff_strf_iavs</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-create-iavs-template-caps"></a><h3>gst_riff_create_iavs_template_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_iavs_template_caps (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-create-video-caps"></a><h3>gst_riff_create_video_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_video_caps (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> codec_fcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> *strh</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-vids"><span class="type">gst_riff_strf_vids</span></a> *strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strf_data</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *strd_data</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **codec_name</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>codec_fcc</code></em> :</span></p></td>
+<td>fourCC codec for this codec.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strh</code></em> :</span></p></td>
+<td>pointer to the strh stream header structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strf</code></em> :</span></p></td>
+<td>pointer to the strf stream header structure, including any
+data that is within the range of strf.size, but excluding any
+additional data withint this chunk but outside strf.size.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strf_data</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the additional data in the strf
+chunk outside reach of strf.size. Ususally a palette.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strd_data</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the data in the strd stream header
+chunk. Usually codec initialization data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>codec_name</code></em> :</span></p></td>
+<td>if given, will be filled with a human-readable codec name.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-create-video-template-caps"></a><h3>gst_riff_create_video_template_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_riff_create_video_template_caps (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-init"></a><h3>gst_riff_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_riff_init (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Initialize riff library.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-chunk"></a><h3>gst_riff_parse_chunk ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_chunk (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *fourcc</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **chunk_data</code></em>);</pre>
+<p>
+Reads a single chunk.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input buffer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset in the buffer in the caller. Is incremented
+by the read size by this function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fourcc</code></em> :</span></p></td>
+<td>fourcc (returned by this function0 of the chunk.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>chunk_data</code></em> :</span></p></td>
+<td>buffer (returned by the function) containing the
+chunk data, which may be NULL if chunksize == 0</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE on error, TRUE otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-file-header"></a><h3>gst_riff_parse_file_header ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_file_header (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *doctype</code></em>);</pre>
+<p>
+Reads the first few bytes from the provided buffer, checks
+if this stream is a RIFF stream, and determines document type.
+This function takes ownership of <em class="parameter"><code>buf</code></em> so it should not be used anymore
+after calling this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input buffer from which the file header will be parsed,
+should be at least 12 bytes long.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>doctype</code></em> :</span></p></td>
+<td>a fourcc (returned by this function) to indicate the
+type of document (according to the header).</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if this is not a RIFF stream (in which case the
+caller should error out; we already throw an error), or TRUE
+if it is.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-info"></a><h3>gst_riff_parse_info ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_riff_parse_info (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> **taglist</code></em>);</pre>
+<p>
+Parses stream metadata from input data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input data to be used for parsing, stripped from header.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>taglist</code></em> :</span></p></td>
+<td>a pointer to a taglist (returned by this function)
+containing information about this stream. May be
+NULL if no supported tags were found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-strf-auds"></a><h3>gst_riff_parse_strf_auds ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_strf_auds (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-auds"><span class="type">gst_riff_strf_auds</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);</pre>
+<p>
+Parses an audio stream´s strf structure plus optionally some
+extradata from input data. This function takes ownership of <em class="parameter"><code>buf</code></em>.
+use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input data to be used for parsing, stripped from header.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strf</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a filled-in
+strf/auds structure. Caller should free it.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a buffer
+containing extradata for this particular stream (e.g.
+codec initialization data).</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if parsing succeeded, otherwise FALSE. The stream
+should be skipped on error, but it is not fatal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-strf-iavs"></a><h3>gst_riff_parse_strf_iavs ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_strf_iavs (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-iavs"><span class="type">gst_riff_strf_iavs</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);</pre>
+<p>
+Parses a interleaved (also known as "complex") stream´s strf
+structure plus optionally some extradata from input data. This
+function takes ownership of <em class="parameter"><code>buf</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input data to be used for parsing, stripped from header.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strf</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a filled-in
+strf/iavs structure. Caller should free it.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a buffer
+containing extradata for this particular stream (e.g.
+codec initialization data).</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if parsing succeeded, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-strf-vids"></a><h3>gst_riff_parse_strf_vids ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_strf_vids (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strf-vids"><span class="type">gst_riff_strf_vids</span></a> **strf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **data</code></em>);</pre>
+<p>
+Parses a video stream´s strf structure plus optionally some
+extradata from input data. This function takes ownership of <em class="parameter"><code>buf</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input data to be used for parsing, stripped from header.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strf</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a filled-in
+strf/vids structure. Caller should free it.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a buffer
+containing extradata for this particular stream (e.g.
+palette, codec initialization data).</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if parsing succeeded, otherwise FALSE. The stream
+should be skipped on error, but it is not fatal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-parse-strh"></a><h3>gst_riff_parse_strh ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_riff_parse_strh (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstriff.html#gst-riff-strh"><span class="type">gst_riff_strh</span></a> **strh</code></em>);</pre>
+<p>
+Parses a strh structure from input data. Takes ownership of <em class="parameter"><code>buf</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging/error).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>input data to be used for parsing, stripped from header.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>strh</code></em> :</span></p></td>
+<td>a pointer (returned by this function) to a filled-in
+strh structure. Caller should free it.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if parsing succeeded, otherwise FALSE. The stream
+should be skipped on error, but it is not fatal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-riff-read-chunk"></a><h3>gst_riff_read_chunk ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_riff_read_chunk (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *tag</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **chunk_data</code></em>);</pre>
+<p>
+Reads a single chunk of data. Since 0.10.8 'JUNK' chunks
+are skipped automatically.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>caller element (used for debugging).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>pad to pull data from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset to pull from, incremented by this function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>fourcc of the chunk (returned by this function).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>chunk_data</code></em> :</span></p></td>
+<td>buffer (returned by this function).</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>flow status.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstringbuffer.html b/docs/libs/html/gst-plugins-base-libs-gstringbuffer.html
new file mode 100644
index 0000000..3520159
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstringbuffer.html
@@ -0,0 +1,1393 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstringbuffer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-audio.html" title="Audio Library">
+<link rel="prev" href="gst-plugins-base-libs-gstmultichannel.html" title="gstmultichannel">
+<link rel="next" href="gst-plugins-base-libs-gstaudioiec61937.html" title="gstaudioiec61937">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstmultichannel.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-audio.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudioiec61937.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstringbuffer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstringbuffer.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstringbuffer.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstringbuffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstringbuffer.top_of_page"></a>gstringbuffer</span></h2>
+<p>gstringbuffer — Base class for audio ringbuffer implementations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstringbuffer.synopsis"></a><h2>Synopsis</h2>
+<a name="GstRingBuffer"></a><pre class="synopsis">
+#include &lt;gst/audio/gstringbuffer.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer-struct" title="struct GstRingBuffer">GstRingBuffer</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferClass" title="struct GstRingBufferClass">GstRingBufferClass</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec">GstRingBufferSpec</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback" title="GstRingBufferCallback ()">*GstRingBufferCallback</a>) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *rbuf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+enum <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSegState" title="enum GstRingBufferSegState">GstRingBufferSegState</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferState" title="enum GstRingBufferState">GstRingBufferState</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstBufferFormatType" title="enum GstBufferFormatType">GstBufferFormatType</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-BROADCAST:CAPS" title="GST_RING_BUFFER_BROADCAST()">GST_RING_BUFFER_BROADCAST</a> (buf)
+#define <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-GET-COND:CAPS" title="GST_RING_BUFFER_GET_COND()">GST_RING_BUFFER_GET_COND</a> (buf)
+#define <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-SIGNAL:CAPS" title="GST_RING_BUFFER_SIGNAL()">GST_RING_BUFFER_SIGNAL</a> (buf)
+#define <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-WAIT:CAPS" title="GST_RING_BUFFER_WAIT()">GST_RING_BUFFER_WAIT</a> (buf)
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-callback" title="gst_ring_buffer_set_callback ()">gst_ring_buffer_set_callback</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback" title="GstRingBufferCallback ()"><span class="type">GstRingBufferCallback</span></a> cb</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-acquire" title="gst_ring_buffer_acquire ()">gst_ring_buffer_acquire</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-release" title="gst_ring_buffer_release ()">gst_ring_buffer_release</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-acquired" title="gst_ring_buffer_is_acquired ()">gst_ring_buffer_is_acquired</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-activate" title="gst_ring_buffer_activate ()">gst_ring_buffer_activate</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> active</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-active" title="gst_ring_buffer_is_active ()">gst_ring_buffer_is_active</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-start" title="gst_ring_buffer_start ()">gst_ring_buffer_start</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-pause" title="gst_ring_buffer_pause ()">gst_ring_buffer_pause</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-stop" title="gst_ring_buffer_stop ()">gst_ring_buffer_stop</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-delay" title="gst_ring_buffer_delay ()">gst_ring_buffer_delay</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-samples-done" title="gst_ring_buffer_samples_done ()">gst_ring_buffer_samples_done</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-sample" title="gst_ring_buffer_set_sample ()">gst_ring_buffer_set_sample</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit" title="gst_ring_buffer_commit ()">gst_ring_buffer_commit</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit-full" title="gst_ring_buffer_commit_full ()">gst_ring_buffer_commit_full</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> in_samples</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> out_samples</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *accum</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-convert" title="gst_ring_buffer_convert ()">gst_ring_buffer_convert</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> src_val</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dest_val</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-prepare-read" title="gst_ring_buffer_prepare_read ()">gst_ring_buffer_prepare_read</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *segment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **readptr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-read" title="gst_ring_buffer_read ()">gst_ring_buffer_read</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear" title="gst_ring_buffer_clear ()">gst_ring_buffer_clear</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> segment</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear-all" title="gst_ring_buffer_clear_all ()">gst_ring_buffer_clear_all</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-advance" title="gst_ring_buffer_advance ()">gst_ring_buffer_advance</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> advance</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-close-device" title="gst_ring_buffer_close_device ()">gst_ring_buffer_close_device</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-open-device" title="gst_ring_buffer_open_device ()">gst_ring_buffer_open_device</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-device-is-open" title="gst_ring_buffer_device_is_open ()">gst_ring_buffer_device_is_open</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-may-start" title="gst_ring_buffer_may_start ()">gst_ring_buffer_may_start</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> allowed</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-parse-caps" title="gst_ring_buffer_parse_caps ()">gst_ring_buffer_parse_caps</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-flushing" title="gst_ring_buffer_set_flushing ()">gst_ring_buffer_set_flushing</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flushing</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstringbuffer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----GstRingBuffer
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstringbuffer.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id484218"></a><p>
+This object is the base class for audio ringbuffers used by the base
+audio source and sink classes.
+</p>
+<p>
+The ringbuffer abstracts a circular buffer of data. One reader and
+one writer can operate on the data from different threads in a lockfree
+manner. The base class is sufficiently flexible to be used as an
+abstraction for DMA based ringbuffers as well as a pure software
+implementations.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-02-02 (0.10.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstringbuffer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRingBuffer-struct"></a><h3>struct GstRingBuffer</h3>
+<pre class="programlisting">struct GstRingBuffer {
+ GCond *cond;
+ gboolean open;
+ gboolean acquired;
+ guint8 *memory;
+ gsize size;
+ GstRingBufferSpec spec;
+ GstRingBufferSegState *segstate;
+ gint samples_per_seg;
+ guint8 *empty_seg;
+
+ gint state;
+ gint segdone;
+ gint segbase;
+ gint waiting;
+};
+</pre>
+<p>
+The ringbuffer base class structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GCond"><span class="type">GCond</span></a> *<em class="structfield"><code><a name="GstRingBuffer-struct.cond"></a>cond</code></em>;</span></p></td>
+<td>used to signal start/stop/pause/resume actions</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.open"></a>open</code></em>;</span></p></td>
+<td>boolean indicating that the ringbuffer is open</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.acquired"></a>acquired</code></em>;</span></p></td>
+<td>boolean indicating that the ringbuffer is acquired</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *<em class="structfield"><code><a name="GstRingBuffer-struct.memory"></a>memory</code></em>;</span></p></td>
+<td>data in the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.size"></a>size</code></em>;</span></p></td>
+<td>size of data in the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.spec"></a>spec</code></em>;</span></p></td>
+<td>format and layout of the ringbuffer data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSegState" title="enum GstRingBufferSegState"><span class="type">GstRingBufferSegState</span></a> *<em class="structfield"><code><a name="GstRingBuffer-struct.segstate"></a>segstate</code></em>;</span></p></td>
+<td>status of each segment in the ringbuffer (unused)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.samples-per-seg"></a>samples_per_seg</code></em>;</span></p></td>
+<td>number of samples in one segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *<em class="structfield"><code><a name="GstRingBuffer-struct.empty-seg"></a>empty_seg</code></em>;</span></p></td>
+<td>pointer to memory holding one segment of silence samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.state"></a>state</code></em>;</span></p></td>
+<td>state of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.segdone"></a>segdone</code></em>;</span></p></td>
+<td>readpointer in the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.segbase"></a>segbase</code></em>;</span></p></td>
+<td>segment corresponding to segment 0 (unused)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBuffer-struct.waiting"></a>waiting</code></em>;</span></p></td>
+<td>is a reader or writer waiting for a free segment</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRingBufferClass"></a><h3>struct GstRingBufferClass</h3>
+<pre class="programlisting">struct GstRingBufferClass {
+ GstObjectClass parent_class;
+
+ gboolean (*open_device) (GstRingBuffer *buf);
+ gboolean (*acquire) (GstRingBuffer *buf, GstRingBufferSpec *spec);
+ gboolean (*release) (GstRingBuffer *buf);
+ gboolean (*close_device) (GstRingBuffer *buf);
+
+ gboolean (*start) (GstRingBuffer *buf);
+ gboolean (*pause) (GstRingBuffer *buf);
+ gboolean (*resume) (GstRingBuffer *buf);
+ gboolean (*stop) (GstRingBuffer *buf);
+
+ guint (*delay) (GstRingBuffer *buf);
+
+ /* ABI added */
+ gboolean (*activate) (GstRingBuffer *buf, gboolean active);
+
+ guint (*commit) (GstRingBuffer * buf, guint64 *sample,
+ guchar * data, gint in_samples,
+ gint out_samples, gint * accum);
+
+ void (*clear_all) (GstRingBuffer * buf);
+};
+</pre>
+<p>
+The vmethods that subclasses can override to implement the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstRingBufferClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.open-device"></a>open_device</code></em> ()</span></p></td>
+<td>open the device, don't set any params or allocate anything</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.acquire"></a>acquire</code></em> ()</span></p></td>
+<td>allocate the resources for the ringbuffer using the given spec</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.release"></a>release</code></em> ()</span></p></td>
+<td>free resources of the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.close-device"></a>close_device</code></em> ()</span></p></td>
+<td>close the device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.start"></a>start</code></em> ()</span></p></td>
+<td>start processing of samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.pause"></a>pause</code></em> ()</span></p></td>
+<td>pause processing of samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.resume"></a>resume</code></em> ()</span></p></td>
+<td>resume processing of samples after pause</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>stop processing of samples</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.delay"></a>delay</code></em> ()</span></p></td>
+<td>get number of samples queued in device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.activate"></a>activate</code></em> ()</span></p></td>
+<td>activate the thread that starts pulling and monitoring the
+consumed segments in the device. Since 0.10.22</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.commit"></a>commit</code></em> ()</span></p></td>
+<td>write samples into the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRingBufferClass.clear-all"></a>clear_all</code></em> ()</span></p></td>
+<td>clear the entire ringbuffer Since 0.10.24</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRingBufferSpec"></a><h3>struct GstRingBufferSpec</h3>
+<pre class="programlisting">struct GstRingBufferSpec {
+ /* in */
+ GstCaps *caps; /* the caps of the buffer */
+
+ /* in/out */
+ GstBufferFormatType type;
+ GstAudioInfo info;
+
+ guint64 latency_time; /* the required/actual latency time, this is the
+ * actual the size of one segment and the
+ * minimum possible latency we can achieve. */
+ guint64 buffer_time; /* the required/actual time of the buffer, this is
+ * the total size of the buffer and maximum
+ * latency we can compensate for. */
+ gint segsize; /* size of one buffer segment in bytes, this value
+ * should be chosen to match latency_time as
+ * well as possible. */
+ gint segtotal; /* total number of segments, this value is the
+ * number of segments of @segsize and should be
+ * chosen so that it matches buffer_time as
+ * close as possible. */
+ /* ABI added 0.10.20 */
+ gint seglatency; /* number of segments queued in the lower
+ * level device, defaults to segtotal. */
+};
+</pre>
+<p>
+The structure containing the format specification of the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *<em class="structfield"><code><a name="GstRingBufferSpec.caps"></a>caps</code></em>;</span></p></td>
+<td>The caps that generated the Spec.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstBufferFormatType" title="enum GstBufferFormatType"><span class="type">GstBufferFormatType</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.type"></a>type</code></em>;</span></p></td>
+<td>the sample type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.info"></a>info</code></em>;</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstaudio.html#GstAudioInfo" title="struct GstAudioInfo"><span class="type">GstAudioInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.latency-time"></a>latency_time</code></em>;</span></p></td>
+<td>the latency in microseconds</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.buffer-time"></a>buffer_time</code></em>;</span></p></td>
+<td>the total buffer size in microseconds</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.segsize"></a>segsize</code></em>;</span></p></td>
+<td>the size of one segment in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.segtotal"></a>segtotal</code></em>;</span></p></td>
+<td>the total number of segments</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRingBufferSpec.seglatency"></a>seglatency</code></em>;</span></p></td>
+<td>number of segments queued in the lower level device,
+defaults to segtotal</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRingBufferCallback"></a><h3>GstRingBufferCallback ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstRingBufferCallback) (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *rbuf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+This function is set with <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-callback" title="gst_ring_buffer_set_callback ()"><code class="function">gst_ring_buffer_set_callback()</code></a> and is
+called to fill the memory at <em class="parameter"><code>data</code></em> with <em class="parameter"><code>len</code></em> bytes of samples.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rbuf</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>target to fill</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>amount to fill</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRingBufferSegState"></a><h3>enum GstRingBufferSegState</h3>
+<pre class="programlisting">typedef enum {
+ GST_SEGSTATE_INVALID,
+ GST_SEGSTATE_EMPTY,
+ GST_SEGSTATE_FILLED,
+ GST_SEGSTATE_PARTIAL
+} GstRingBufferSegState;
+</pre>
+<p>
+The state of a segment in the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SEGSTATE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_SEGSTATE_INVALID</code></span></p></td>
+<td>The content of the segment is invalid
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEGSTATE-EMPTY:CAPS"></a><span class="term"><code class="literal">GST_SEGSTATE_EMPTY</code></span></p></td>
+<td>The segment is empty
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEGSTATE-FILLED:CAPS"></a><span class="term"><code class="literal">GST_SEGSTATE_FILLED</code></span></p></td>
+<td>The segment contains valid data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEGSTATE-PARTIAL:CAPS"></a><span class="term"><code class="literal">GST_SEGSTATE_PARTIAL</code></span></p></td>
+<td>The segment partially contains valid data
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRingBufferState"></a><h3>enum GstRingBufferState</h3>
+<pre class="programlisting">typedef enum {
+ GST_RING_BUFFER_STATE_STOPPED,
+ GST_RING_BUFFER_STATE_PAUSED,
+ GST_RING_BUFFER_STATE_STARTED
+} GstRingBufferState;
+</pre>
+<p>
+The state of the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RING-BUFFER-STATE-STOPPED:CAPS"></a><span class="term"><code class="literal">GST_RING_BUFFER_STATE_STOPPED</code></span></p></td>
+<td>The ringbuffer is stopped
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RING-BUFFER-STATE-PAUSED:CAPS"></a><span class="term"><code class="literal">GST_RING_BUFFER_STATE_PAUSED</code></span></p></td>
+<td>The ringbuffer is paused
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RING-BUFFER-STATE-STARTED:CAPS"></a><span class="term"><code class="literal">GST_RING_BUFFER_STATE_STARTED</code></span></p></td>
+<td>The ringbuffer is started
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferFormatType"></a><h3>enum GstBufferFormatType</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUFTYPE_RAW,
+ GST_BUFTYPE_MU_LAW,
+ GST_BUFTYPE_A_LAW,
+ GST_BUFTYPE_IMA_ADPCM,
+ GST_BUFTYPE_MPEG,
+ GST_BUFTYPE_GSM,
+ GST_BUFTYPE_IEC958,
+ GST_BUFTYPE_AC3,
+ GST_BUFTYPE_EAC3,
+ GST_BUFTYPE_DTS,
+ GST_BUFTYPE_MPEG2_AAC,
+ GST_BUFTYPE_MPEG4_AAC,
+} GstBufferFormatType;
+</pre>
+<p>
+The format of the samples in the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUFTYPE-RAW:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_RAW</code></span></p></td>
+<td>samples in linear or float
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-MU-LAW:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_MU_LAW</code></span></p></td>
+<td>samples in mulaw
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-A-LAW:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_A_LAW</code></span></p></td>
+<td>samples in alaw
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-IMA-ADPCM:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_IMA_ADPCM</code></span></p></td>
+<td>samples in ima adpcm
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-MPEG:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_MPEG</code></span></p></td>
+<td>samples in mpeg audio (but not AAC) format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-GSM:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_GSM</code></span></p></td>
+<td>samples in gsm format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-IEC958:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_IEC958</code></span></p></td>
+<td>samples in IEC958 frames (e.g. AC3)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-AC3:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_AC3</code></span></p></td>
+<td>samples in AC3 format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-EAC3:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_EAC3</code></span></p></td>
+<td>samples in EAC3 format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-DTS:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_DTS</code></span></p></td>
+<td>samples in DTS format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-MPEG2-AAC:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_MPEG2_AAC</code></span></p></td>
+<td>samples in MPEG-2 AAC format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFTYPE-MPEG4-AAC:CAPS"></a><span class="term"><code class="literal">GST_BUFTYPE_MPEG4_AAC</code></span></p></td>
+<td>samples in MPEG-4 AAC format
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RING-BUFFER-BROADCAST:CAPS"></a><h3>GST_RING_BUFFER_BROADCAST()</h3>
+<pre class="programlisting">#define GST_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_RING_BUFFER_GET_COND (buf)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RING-BUFFER-GET-COND:CAPS"></a><h3>GST_RING_BUFFER_GET_COND()</h3>
+<pre class="programlisting">#define GST_RING_BUFFER_GET_COND(buf) (((GstRingBuffer *)buf)-&gt;cond)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RING-BUFFER-SIGNAL:CAPS"></a><h3>GST_RING_BUFFER_SIGNAL()</h3>
+<pre class="programlisting">#define GST_RING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_RING_BUFFER_GET_COND (buf)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RING-BUFFER-WAIT:CAPS"></a><h3>GST_RING_BUFFER_WAIT()</h3>
+<pre class="programlisting">#define GST_RING_BUFFER_WAIT(buf) (g_cond_wait (GST_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-set-callback"></a><h3>gst_ring_buffer_set_callback ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_set_callback (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback" title="GstRingBufferCallback ()"><span class="type">GstRingBufferCallback</span></a> cb</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Sets the given callback function on the buffer. This function
+will be called every time a segment has been written to a device.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to set the callback on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cb</code></em> :</span></p></td>
+<td>the callback to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to the callback</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-acquire"></a><h3>gst_ring_buffer_acquire ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_acquire (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>);</pre>
+<p>
+Allocate the resources for the ringbuffer. This function fills
+in the data pointer of the ring buffer with a valid <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+to which samples can be written.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to acquire</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>spec</code></em> :</span></p></td>
+<td>the specs of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be acquired, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-release"></a><h3>gst_ring_buffer_release ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_release (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Free the resources of the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to release</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be released, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-is-acquired"></a><h3>gst_ring_buffer_is_acquired ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_is_acquired (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Check if the ringbuffer is acquired and ready to use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the ringbuffer is acquired, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-activate"></a><h3>gst_ring_buffer_activate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_activate (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Activate <em class="parameter"><code>buf</code></em> to start or stop pulling data.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to activate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>the new mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be activated in the requested mode,
+FALSE on error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-is-active"></a><h3>gst_ring_buffer_is_active ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_is_active (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>buf</code></em> is activated.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device is active.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-start"></a><h3>gst_ring_buffer_start ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_start (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Start processing samples from the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to start</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be started, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-pause"></a><h3>gst_ring_buffer_pause ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_pause (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Pause processing samples from the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to pause</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be paused, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-stop"></a><h3>gst_ring_buffer_stop ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_stop (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Stop processing samples from the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to stop</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be stopped, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-delay"></a><h3>gst_ring_buffer_delay ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_ring_buffer_delay (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Get the number of samples queued in the audio device. This is
+usually less than the segment size but can be bigger when the
+implementation uses another internal buffer between the audio
+device.
+</p>
+<p>
+For playback ringbuffers this is the amount of samples transfered from the
+ringbuffer to the device but still not played.
+</p>
+<p>
+For capture ringbuffers this is the amount of samples in the device that are
+not yet transfered to the ringbuffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of samples queued in the audio device.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-samples-done"></a><h3>gst_ring_buffer_samples_done ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> gst_ring_buffer_samples_done (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Get the number of samples that were processed by the ringbuffer
+since it was last started. This does not include the number of samples not
+yet processed (see <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-delay" title="gst_ring_buffer_delay ()"><code class="function">gst_ring_buffer_delay()</code></a>).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of samples processed by the ringbuffer.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-set-sample"></a><h3>gst_ring_buffer_set_sample ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_set_sample (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>);</pre>
+<p>
+Make sure that the next sample written to the device is
+accounted for as being the <em class="parameter"><code>sample</code></em> sample written to the
+device. This value will be used in reporting the current
+sample position of the ringbuffer.
+</p>
+<p>
+This function will also clear the buffer with silence.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample</code></em> :</span></p></td>
+<td>the sample number to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-commit"></a><h3>gst_ring_buffer_commit ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_ring_buffer_commit (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Same as <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit-full" title="gst_ring_buffer_commit_full ()"><code class="function">gst_ring_buffer_commit_full()</code></a> but with a in_samples and out_samples
+equal to <em class="parameter"><code>len</code></em>, ignoring accum.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample</code></em> :</span></p></td>
+<td>the sample position of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the number of samples in the data to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of samples written to the ringbuffer or -1 on
+error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-commit-full"></a><h3>gst_ring_buffer_commit_full ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_ring_buffer_commit_full (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> in_samples</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> out_samples</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *accum</code></em>);</pre>
+<p>
+Commit <em class="parameter"><code>in_samples</code></em> samples pointed to by <em class="parameter"><code>data</code></em> to the ringbuffer <em class="parameter"><code>buf</code></em>.
+</p>
+<p>
+<em class="parameter"><code>in_samples</code></em> and <em class="parameter"><code>out_samples</code></em> define the rate conversion to perform on the the
+samples in <em class="parameter"><code>data</code></em>. For negative rates, <em class="parameter"><code>out_samples</code></em> must be negative and
+<em class="parameter"><code>in_samples</code></em> positive.
+</p>
+<p>
+When <em class="parameter"><code>out_samples</code></em> is positive, the first sample will be written at position <em class="parameter"><code>sample</code></em>
+in the ringbuffer. When <em class="parameter"><code>out_samples</code></em> is negative, the last sample will be written to
+<em class="parameter"><code>sample</code></em> in reverse order.
+</p>
+<p>
+<em class="parameter"><code>out_samples</code></em> does not need to be a multiple of the segment size of the ringbuffer
+although it is recommended for optimal performance.
+</p>
+<p>
+<em class="parameter"><code>accum</code></em> will hold a temporary accumulator used in rate conversion and should be
+set to 0 when this function is first called. In case the commit operation is
+interrupted, one can resume the processing by passing the previously returned
+<em class="parameter"><code>accum</code></em> value back to this function.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample</code></em> :</span></p></td>
+<td>the sample position of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in_samples</code></em> :</span></p></td>
+<td>the number of samples in the data to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>out_samples</code></em> :</span></p></td>
+<td>the number of samples to write to the ringbuffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>accum</code></em> :</span></p></td>
+<td>accumulator for rate conversion.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of samples written to the ringbuffer or -1 on error. The
+number of samples written can be less than <em class="parameter"><code>out_samples</code></em> when <em class="parameter"><code>buf</code></em> was interrupted
+with a flush or stop.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-convert"></a><h3>gst_ring_buffer_convert ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_convert (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> src_val</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_fmt</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dest_val</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>src_val</code></em> in <em class="parameter"><code>src_fmt</code></em> to the equivalent value in <em class="parameter"><code>dest_fmt</code></em>. The result
+will be put in <em class="parameter"><code>dest_val</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_fmt</code></em> :</span></p></td>
+<td>the source format</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_val</code></em> :</span></p></td>
+<td>the source value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_fmt</code></em> :</span></p></td>
+<td>the destination format</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_val</code></em> :</span></p></td>
+<td>a location to store the converted value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the conversion succeeded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-prepare-read"></a><h3>gst_ring_buffer_prepare_read ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_prepare_read (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *segment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **readptr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *len</code></em>);</pre>
+<p>
+Returns a pointer to memory where the data from segment <em class="parameter"><code>segment</code></em>
+can be found. This function is mostly used by subclasses.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to read from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>the segment to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>readptr</code></em> :</span></p></td>
+<td>the pointer to the memory where samples can be read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the number of bytes to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if the buffer is not started.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-read"></a><h3>gst_ring_buffer_read ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_ring_buffer_read (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> sample</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>len</code></em> samples from the ringbuffer into the memory pointed
+to by <em class="parameter"><code>data</code></em>.
+The first sample should be read from position <em class="parameter"><code>sample</code></em> in
+the ringbuffer.
+</p>
+<p>
+<em class="parameter"><code>len</code></em> should not be a multiple of the segment size of the ringbuffer
+although it is recommended.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to read from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sample</code></em> :</span></p></td>
+<td>the sample position of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>where the data should be read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the number of samples in data to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of samples read from the ringbuffer or -1 on
+error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-clear"></a><h3>gst_ring_buffer_clear ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_clear (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> segment</code></em>);</pre>
+<p>
+Clear the given segment of the buffer with silence samples.
+This function is used by subclasses.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to clear</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>the segment to clear</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-clear-all"></a><h3>gst_ring_buffer_clear_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_clear_all (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Fill the ringbuffer with silence.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to clear</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-advance"></a><h3>gst_ring_buffer_advance ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_advance (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> advance</code></em>);</pre>
+<p>
+Subclasses should call this function to notify the fact that
+<em class="parameter"><code>advance</code></em> segments are now processed by the device.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to advance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>advance</code></em> :</span></p></td>
+<td>the number of segments written</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-close-device"></a><h3>gst_ring_buffer_close_device ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_close_device (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Close the audio device associated with the ring buffer. The ring buffer
+should already have been released via <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-release" title="gst_ring_buffer_release ()"><code class="function">gst_ring_buffer_release()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be closed, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-open-device"></a><h3>gst_ring_buffer_open_device ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_open_device (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Open the audio device associated with the ring buffer. Does not perform any
+setup on the device. You must open the device before acquiring the ring
+buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device could be opened, FALSE on error.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-device-is-open"></a><h3>gst_ring_buffer_device_is_open ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_device_is_open (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Checks the status of the device associated with the ring buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the device was open, FALSE if it was closed.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-may-start"></a><h3>gst_ring_buffer_may_start ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_may_start (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> allowed</code></em>);</pre>
+<p>
+Tell the ringbuffer that it is allowed to start playback when
+the ringbuffer is filled with samples.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>allowed</code></em> :</span></p></td>
+<td>the new value</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.6</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-parse-caps"></a><h3>gst_ring_buffer_parse_caps ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_ring_buffer_parse_caps (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec" title="struct GstRingBufferSpec"><span class="type">GstRingBufferSpec</span></a> *spec</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Parse <em class="parameter"><code>caps</code></em> into <em class="parameter"><code>spec</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>spec</code></em> :</span></p></td>
+<td>a spec</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the caps could be parsed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ring-buffer-set-flushing"></a><h3>gst_ring_buffer_set_flushing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ring_buffer_set_flushing (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flushing</code></em>);</pre>
+<p>
+Set the ringbuffer to flushing mode or normal mode.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer"><span class="type">GstRingBuffer</span></a> to flush</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flushing</code></em> :</span></p></td>
+<td>the new mode</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstringbuffer.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink"><span class="type">GstBaseAudioSink</span></a>, <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink"><span class="type">GstAudioSink</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtcpbuffer.html b/docs/libs/html/gst-plugins-base-libs-gstrtcpbuffer.html
new file mode 100644
index 0000000..af06d66
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtcpbuffer.html
@@ -0,0 +1,1961 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtcpbuffer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtpbuffer.html" title="gstrtpbuffer">
+<link rel="next" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtpbuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtppayloads.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtcpbuffer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtcpbuffer.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtcpbuffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtcpbuffer.top_of_page"></a>gstrtcpbuffer</span></h2>
+<p>gstrtcpbuffer — Helper methods for dealing with RTCP buffers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtcpbuffer.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtp/gstrtcpbuffer.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VERSION:CAPS" title="GST_RTCP_VERSION">GST_RTCP_VERSION</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES:CAPS" title="GST_RTCP_MAX_SDES">GST_RTCP_MAX_SDES</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS" title="GST_RTCP_MAX_BYE_SSRC_COUNT">GST_RTCP_MAX_BYE_SSRC_COUNT</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-RB-COUNT:CAPS" title="GST_RTCP_MAX_RB_COUNT">GST_RTCP_MAX_RB_COUNT</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS" title="GST_RTCP_MAX_SDES_ITEM_COUNT">GST_RTCP_MAX_SDES_ITEM_COUNT</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-MASK:CAPS" title="GST_RTCP_VALID_MASK">GST_RTCP_VALID_MASK</a>
+#define <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-VALUE:CAPS" title="GST_RTCP_VALID_VALUE">GST_RTCP_VALID_VALUE</a>
+enum <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType">GstRTCPType</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket">GstRTCPPacket</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType">GstRTCPSDESType</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType">GstRTCPFBType</a>;
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-take-data" title="gst_rtcp_buffer_new_take_data ()">gst_rtcp_buffer_new_take_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-copy-data" title="gst_rtcp_buffer_new_copy_data ()">gst_rtcp_buffer_new_copy_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate-data" title="gst_rtcp_buffer_validate_data ()">gst_rtcp_buffer_validate_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate" title="gst_rtcp_buffer_validate ()">gst_rtcp_buffer_validate</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new" title="gst_rtcp_buffer_new ()">gst_rtcp_buffer_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> mtu</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-packet-count" title="gst_rtcp_buffer_get_packet_count ()">gst_rtcp_buffer_get_packet_count</a> (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet" title="gst_rtcp_buffer_get_first_packet ()">gst_rtcp_buffer_get_first_packet</a> (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-move-to-next" title="gst_rtcp_packet_move_to_next ()">gst_rtcp_packet_move_to_next</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-add-packet" title="gst_rtcp_buffer_add_packet ()">gst_rtcp_buffer_add_packet</a> (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType"><span class="type">GstRTCPType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-remove" title="gst_rtcp_packet_remove ()">gst_rtcp_packet_remove</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-padding" title="gst_rtcp_packet_get_padding ()">gst_rtcp_packet_get_padding</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-count" title="gst_rtcp_packet_get_count ()">gst_rtcp_packet_get_count</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType"><span class="returnvalue">GstRTCPType</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-type" title="gst_rtcp_packet_get_type ()">gst_rtcp_packet_get_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-length" title="gst_rtcp_packet_get_length ()">gst_rtcp_packet_get_length</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-get-sender-info" title="gst_rtcp_packet_sr_get_sender_info ()">gst_rtcp_packet_sr_get_sender_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *ntptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *rtptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *packet_count</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *octet_count</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-set-sender-info" title="gst_rtcp_packet_sr_set_sender_info ()">gst_rtcp_packet_sr_set_sender_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> ntptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> rtptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> packet_count</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> octet_count</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-get-ssrc" title="gst_rtcp_packet_rr_get_ssrc ()">gst_rtcp_packet_rr_get_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-set-ssrc" title="gst_rtcp_packet_rr_set_ssrc ()">gst_rtcp_packet_rr_set_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb-count" title="gst_rtcp_packet_get_rb_count ()">gst_rtcp_packet_get_rb_count</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb" title="gst_rtcp_packet_get_rb ()">gst_rtcp_packet_get_rb</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *dlsr</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-add-rb" title="gst_rtcp_packet_add_rb ()">gst_rtcp_packet_add_rb</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> dlsr</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-set-rb" title="gst_rtcp_packet_set_rb ()">gst_rtcp_packet_set_rb</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> dlsr</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-item-count" title="gst_rtcp_packet_sdes_get_item_count ()">gst_rtcp_packet_sdes_get_item_count</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-item" title="gst_rtcp_packet_sdes_first_item ()">gst_rtcp_packet_sdes_first_item</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-item" title="gst_rtcp_packet_sdes_next_item ()">gst_rtcp_packet_sdes_next_item</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-ssrc" title="gst_rtcp_packet_sdes_get_ssrc ()">gst_rtcp_packet_sdes_get_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-entry" title="gst_rtcp_packet_sdes_first_entry ()">gst_rtcp_packet_sdes_first_entry</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-entry" title="gst_rtcp_packet_sdes_next_entry ()">gst_rtcp_packet_sdes_next_entry</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-entry" title="gst_rtcp_packet_sdes_get_entry ()">gst_rtcp_packet_sdes_get_entry</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> *type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-copy-entry" title="gst_rtcp_packet_sdes_copy_entry ()">gst_rtcp_packet_sdes_copy_entry</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> *type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-item" title="gst_rtcp_packet_sdes_add_item ()">gst_rtcp_packet_sdes_add_item</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-entry" title="gst_rtcp_packet_sdes_add_entry ()">gst_rtcp_packet_sdes_add_entry</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> len</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-ssrc-count" title="gst_rtcp_packet_bye_get_ssrc_count ()">gst_rtcp_packet_bye_get_ssrc_count</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-nth-ssrc" title="gst_rtcp_packet_bye_get_nth_ssrc ()">gst_rtcp_packet_bye_get_nth_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrc" title="gst_rtcp_packet_bye_add_ssrc ()">gst_rtcp_packet_bye_add_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrcs" title="gst_rtcp_packet_bye_add_ssrcs ()">gst_rtcp_packet_bye_add_ssrcs</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason-len" title="gst_rtcp_packet_bye_get_reason_len ()">gst_rtcp_packet_bye_get_reason_len</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason" title="gst_rtcp_packet_bye_get_reason ()">gst_rtcp_packet_bye_get_reason</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-set-reason" title="gst_rtcp_packet_bye_set_reason ()">gst_rtcp_packet_bye_set_reason</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType"><span class="returnvalue">GstRTCPFBType</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-type" title="gst_rtcp_packet_fb_get_type ()">gst_rtcp_packet_fb_get_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-type" title="gst_rtcp_packet_fb_set_type ()">gst_rtcp_packet_fb_set_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType"><span class="type">GstRTCPFBType</span></a> type</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-sender-ssrc" title="gst_rtcp_packet_fb_get_sender_ssrc ()">gst_rtcp_packet_fb_get_sender_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-sender-ssrc" title="gst_rtcp_packet_fb_set_sender_ssrc ()">gst_rtcp_packet_fb_set_sender_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-media-ssrc" title="gst_rtcp_packet_fb_get_media_ssrc ()">gst_rtcp_packet_fb_get_media_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-media-ssrc" title="gst_rtcp_packet_fb_set_media_ssrc ()">gst_rtcp_packet_fb_set_media_ssrc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci-length" title="gst_rtcp_packet_fb_get_fci_length ()">gst_rtcp_packet_fb_get_fci_length</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-fci-length" title="gst_rtcp_packet_fb_set_fci_length ()">gst_rtcp_packet_fb_set_fci_length</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> wordlen</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci" title="gst_rtcp_packet_fb_get_fci ()">gst_rtcp_packet_fb_get_fci</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-ntp-to-unix" title="gst_rtcp_ntp_to_unix ()">gst_rtcp_ntp_to_unix</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> ntptime</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-unix-to-ntp" title="gst_rtcp_unix_to_ntp ()">gst_rtcp_unix_to_ntp</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> unixtime</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="returnvalue">GstRTCPSDESType</span></a> <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-name-to-type" title="gst_rtcp_sdes_name_to_type ()">gst_rtcp_sdes_name_to_type</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-type-to-name" title="gst_rtcp_sdes_type_to_name ()">gst_rtcp_sdes_type_to_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> type</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtcpbuffer.description"></a><h2>Description</h2>
+<p>
+Note: The API in this module is not yet declared stable.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id539655"></a><p>
+The GstRTPCBuffer helper functions makes it easy to parse and create regular
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> objects that contain compound RTCP packets. These buffers are typically
+of 'application/x-rtcp' <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.
+</p>
+<p>
+An RTCP buffer consists of 1 or more <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> structures that you can
+retrieve with <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet" title="gst_rtcp_buffer_get_first_packet ()"><code class="function">gst_rtcp_buffer_get_first_packet()</code></a>. <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> acts as a pointer
+into the RTCP buffer; you can move to the next packet with
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-move-to-next" title="gst_rtcp_packet_move_to_next ()"><code class="function">gst_rtcp_packet_move_to_next()</code></a>.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2007-03-26 (0.10.13)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtcpbuffer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-RTCP-VERSION:CAPS"></a><h3>GST_RTCP_VERSION</h3>
+<pre class="programlisting">#define GST_RTCP_VERSION 2
+</pre>
+<p>
+The supported RTCP version 2.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-MAX-SDES:CAPS"></a><h3>GST_RTCP_MAX_SDES</h3>
+<pre class="programlisting">#define GST_RTCP_MAX_SDES 255
+</pre>
+<p>
+The maximum text length for an SDES item.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS"></a><h3>GST_RTCP_MAX_BYE_SSRC_COUNT</h3>
+<pre class="programlisting">#define GST_RTCP_MAX_BYE_SSRC_COUNT 31
+</pre>
+<p>
+The maximum amount of SSRCs in a BYE packet.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-MAX-RB-COUNT:CAPS"></a><h3>GST_RTCP_MAX_RB_COUNT</h3>
+<pre class="programlisting">#define GST_RTCP_MAX_RB_COUNT 31
+</pre>
+<p>
+The maximum amount of Receiver report blocks in RR and SR messages.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS"></a><h3>GST_RTCP_MAX_SDES_ITEM_COUNT</h3>
+<pre class="programlisting">#define GST_RTCP_MAX_SDES_ITEM_COUNT 31
+</pre>
+<p>
+The maximum amount of SDES items.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-VALID-MASK:CAPS"></a><h3>GST_RTCP_VALID_MASK</h3>
+<pre class="programlisting">#define GST_RTCP_VALID_MASK (0xc000 | 0x2000 | 0xfe)
+</pre>
+<p>
+Mask for version, padding bit and packet type pair
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTCP-VALID-VALUE:CAPS"></a><h3>GST_RTCP_VALID_VALUE</h3>
+<pre class="programlisting">#define GST_RTCP_VALID_VALUE ((GST_RTCP_VERSION &lt;&lt; 14) | GST_RTCP_TYPE_SR)
+</pre>
+<p>
+Valid value for the first two bytes of an RTCP packet after applying
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-MASK:CAPS" title="GST_RTCP_VALID_MASK"><span class="type">GST_RTCP_VALID_MASK</span></a> to them.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTCPType"></a><h3>enum GstRTCPType</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTCP_TYPE_INVALID = 0,
+ GST_RTCP_TYPE_SR = 200,
+ GST_RTCP_TYPE_RR = 201,
+ GST_RTCP_TYPE_SDES = 202,
+ GST_RTCP_TYPE_BYE = 203,
+ GST_RTCP_TYPE_APP = 204,
+ GST_RTCP_TYPE_RTPFB = 205,
+ GST_RTCP_TYPE_PSFB = 206
+} GstRTCPType;
+</pre>
+<p>
+Different RTCP packet types.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_INVALID</code></span></p></td>
+<td>Invalid type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-SR:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_SR</code></span></p></td>
+<td>Sender report
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-RR:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_RR</code></span></p></td>
+<td>Receiver report
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-SDES:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_SDES</code></span></p></td>
+<td>Source description
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-BYE:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_BYE</code></span></p></td>
+<td>Goodbye
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-APP:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_APP</code></span></p></td>
+<td>Application defined
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-RTPFB:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_RTPFB</code></span></p></td>
+<td>Transport layer feedback. Since: 0.10.23
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-TYPE-PSFB:CAPS"></a><span class="term"><code class="literal">GST_RTCP_TYPE_PSFB</code></span></p></td>
+<td>Payload-specific feedback. Since: 0.10.23
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTCPPacket"></a><h3>struct GstRTCPPacket</h3>
+<pre class="programlisting">struct GstRTCPPacket {
+ GstRTCPBuffer *rtcp;
+ guint offset;
+};
+</pre>
+<p>
+Data structure that points to a packet at <em class="parameter"><code>offset</code></em> in <em class="parameter"><code>buffer</code></em>.
+The size of the structure is made public to allow stack allocations.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><span class="type">GstRTCPBuffer</span> *<em class="structfield"><code><a name="GstRTCPPacket.rtcp"></a>rtcp</code></em>;</span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTCPPacket.offset"></a>offset</code></em>;</span></p></td>
+<td>offset of packet in buffer data</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTCPSDESType"></a><h3>enum GstRTCPSDESType</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTCP_SDES_INVALID = -1,
+ GST_RTCP_SDES_END = 0,
+ GST_RTCP_SDES_CNAME = 1,
+ GST_RTCP_SDES_NAME = 2,
+ GST_RTCP_SDES_EMAIL = 3,
+ GST_RTCP_SDES_PHONE = 4,
+ GST_RTCP_SDES_LOC = 5,
+ GST_RTCP_SDES_TOOL = 6,
+ GST_RTCP_SDES_NOTE = 7,
+ GST_RTCP_SDES_PRIV = 8
+} GstRTCPSDESType;
+</pre>
+<p>
+Different types of SDES content.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTCP-SDES-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_INVALID</code></span></p></td>
+<td>Invalid SDES entry
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-END:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_END</code></span></p></td>
+<td>End of SDES list
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-CNAME:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_CNAME</code></span></p></td>
+<td>Canonical name
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-NAME:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_NAME</code></span></p></td>
+<td>User name
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-EMAIL:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_EMAIL</code></span></p></td>
+<td>User's electronic mail address
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-PHONE:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_PHONE</code></span></p></td>
+<td>User's phone number
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-LOC:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_LOC</code></span></p></td>
+<td>Geographic user location
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-TOOL:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_TOOL</code></span></p></td>
+<td>Name of application or tool
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-NOTE:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_NOTE</code></span></p></td>
+<td>Notice about the source
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-SDES-PRIV:CAPS"></a><span class="term"><code class="literal">GST_RTCP_SDES_PRIV</code></span></p></td>
+<td>Private extensions
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTCPFBType"></a><h3>enum GstRTCPFBType</h3>
+<pre class="programlisting">typedef enum {
+ /* generic */
+ GST_RTCP_FB_TYPE_INVALID = 0,
+ /* RTPFB types */
+ GST_RTCP_RTPFB_TYPE_NACK = 1,
+ /* PSFB types */
+ GST_RTCP_PSFB_TYPE_PLI = 1,
+ GST_RTCP_PSFB_TYPE_SLI = 2,
+ GST_RTCP_PSFB_TYPE_RPSI = 3,
+ GST_RTCP_PSFB_TYPE_AFB = 15
+} GstRTCPFBType;
+</pre>
+<p>
+Different types of feedback messages.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTCP-FB-TYPE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTCP_FB_TYPE_INVALID</code></span></p></td>
+<td>Invalid type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-RTPFB-TYPE-NACK:CAPS"></a><span class="term"><code class="literal">GST_RTCP_RTPFB_TYPE_NACK</code></span></p></td>
+<td>Generic NACK
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-PSFB-TYPE-PLI:CAPS"></a><span class="term"><code class="literal">GST_RTCP_PSFB_TYPE_PLI</code></span></p></td>
+<td>Picture Loss Indication
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-PSFB-TYPE-SLI:CAPS"></a><span class="term"><code class="literal">GST_RTCP_PSFB_TYPE_SLI</code></span></p></td>
+<td>Slice Loss Indication
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-PSFB-TYPE-RPSI:CAPS"></a><span class="term"><code class="literal">GST_RTCP_PSFB_TYPE_RPSI</code></span></p></td>
+<td>Reference Picture Selection Indication
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTCP-PSFB-TYPE-AFB:CAPS"></a><span class="term"><code class="literal">GST_RTCP_PSFB_TYPE_AFB</code></span></p></td>
+<td>Application layer Feedback
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-new-take-data"></a><h3>gst_rtcp_buffer_new_take_data ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtcp_buffer_new_take_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Create a new buffer and set the data and size of the buffer to <em class="parameter"><code>data</code></em> and <em class="parameter"><code>len</code></em>
+respectively. <em class="parameter"><code>data</code></em> will be freed when the buffer is unreffed, so this
+function transfers ownership of <em class="parameter"><code>data</code></em> to the new buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data for the new buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer with <em class="parameter"><code>data</code></em> and of size <em class="parameter"><code>len</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-new-copy-data"></a><h3>gst_rtcp_buffer_new_copy_data ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtcp_buffer_new_copy_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Create a new buffer and set the data to a copy of <em class="parameter"><code>len</code></em>
+bytes of <em class="parameter"><code>data</code></em> and the size to <em class="parameter"><code>len</code></em>. The data will be freed when the buffer
+is freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data for the new buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer with a copy of <em class="parameter"><code>data</code></em> and of size <em class="parameter"><code>len</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-validate-data"></a><h3>gst_rtcp_buffer_validate_data ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_buffer_validate_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Check if the <em class="parameter"><code>data</code></em> and <em class="parameter"><code>size</code></em> point to the data of a valid RTCP (compound)
+packet.
+Use this function to validate a packet before using the other functions in
+this module.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of <em class="parameter"><code>data</code></em> to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the data points to a valid RTCP packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-validate"></a><h3>gst_rtcp_buffer_validate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_buffer_validate (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Check if the data pointed to by <em class="parameter"><code>buffer</code></em> is a valid RTCP packet using
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate-data" title="gst_rtcp_buffer_validate_data ()"><code class="function">gst_rtcp_buffer_validate_data()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> is a valid RTCP packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-new"></a><h3>gst_rtcp_buffer_new ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtcp_buffer_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> mtu</code></em>);</pre>
+<p>
+Create a new buffer for constructing RTCP packets. The packet will have a
+maximum size of <em class="parameter"><code>mtu</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mtu</code></em> :</span></p></td>
+<td>the maximum mtu size.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-get-packet-count"></a><h3>gst_rtcp_buffer_get_packet_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtcp_buffer_get_packet_count (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>);</pre>
+<p>
+Get the number of RTCP packets in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a valid RTCP buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of RTCP packets in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-get-first-packet"></a><h3>gst_rtcp_buffer_get_first_packet ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_buffer_get_first_packet (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Initialize a new <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> pointer that points to the first packet in
+<em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a valid RTCP buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the packet existed in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-move-to-next"></a><h3>gst_rtcp_packet_move_to_next ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_move_to_next (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Move the packet pointer <em class="parameter"><code>packet</code></em> to the next packet in the payload.
+Use <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet" title="gst_rtcp_buffer_get_first_packet ()"><code class="function">gst_rtcp_buffer_get_first_packet()</code></a> to initialize <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>packet</code></em> is pointing to a valid packet after calling this
+function.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-buffer-add-packet"></a><h3>gst_rtcp_buffer_add_packet ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_buffer_add_packet (<em class="parameter"><code><span class="type">GstRTCPBuffer</span> *rtcp</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType"><span class="type">GstRTCPType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Add a new packet of <em class="parameter"><code>type</code></em> to <em class="parameter"><code>buffer</code></em>. <em class="parameter"><code>packet</code></em> will point to the newly created
+packet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a valid RTCP buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType"><span class="type">GstRTCPType</span></a> of the new packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>pointer to new packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the packet could be created. This function returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+if the max mtu is exceeded for the buffer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-remove"></a><h3>gst_rtcp_packet_remove ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_remove (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Removes the packet pointed to by <em class="parameter"><code>packet</code></em> and moves pointer to the next one
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>packet</code></em> is pointing to a valid packet after calling this
+function.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-padding"></a><h3>gst_rtcp_packet_get_padding ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_get_padding (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the packet padding of the packet pointed to by <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>If the packet has the padding bit set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-count"></a><h3>gst_rtcp_packet_get_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_rtcp_packet_get_count (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the count field in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The count field in <em class="parameter"><code>packet</code></em> or -1 if <em class="parameter"><code>packet</code></em> does not point to a
+valid packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-type"></a><h3>gst_rtcp_packet_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType" title="enum GstRTCPType"><span class="returnvalue">GstRTCPType</span></a> gst_rtcp_packet_get_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the packet type of the packet pointed to by <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The packet type or GST_RTCP_TYPE_INVALID when <em class="parameter"><code>packet</code></em> is not
+pointing to a valid packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-length"></a><h3>gst_rtcp_packet_get_length ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> gst_rtcp_packet_get_length (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the length field of <em class="parameter"><code>packet</code></em>. This is the length of the packet in
+32-bit words minus one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length field of <em class="parameter"><code>packet</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sr-get-sender-info"></a><h3>gst_rtcp_packet_sr_get_sender_info ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_sr_get_sender_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *ntptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *rtptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *packet_count</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *octet_count</code></em>);</pre>
+<p>
+Parse the SR sender info and store the values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>result SSRC</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ntptime</code></em> :</span></p></td>
+<td>result NTP time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtptime</code></em> :</span></p></td>
+<td>result RTP time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet_count</code></em> :</span></p></td>
+<td>result packet count</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>octet_count</code></em> :</span></p></td>
+<td>result octect count</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sr-set-sender-info"></a><h3>gst_rtcp_packet_sr_set_sender_info ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_sr_set_sender_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> ntptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> rtptime</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> packet_count</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> octet_count</code></em>);</pre>
+<p>
+Set the given values in the SR packet <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>the SSRC</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ntptime</code></em> :</span></p></td>
+<td>the NTP time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtptime</code></em> :</span></p></td>
+<td>the RTP time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet_count</code></em> :</span></p></td>
+<td>the packet count</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>octet_count</code></em> :</span></p></td>
+<td>the octect count</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-rr-get-ssrc"></a><h3>gst_rtcp_packet_rr_get_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtcp_packet_rr_get_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the ssrc field of the RR <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the ssrc.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-rr-set-ssrc"></a><h3>gst_rtcp_packet_rr_set_ssrc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_rr_set_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Set the ssrc field of the RR <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>the SSRC to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-rb-count"></a><h3>gst_rtcp_packet_get_rb_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtcp_packet_get_rb_count (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the number of report blocks in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR or RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of report blocks in <em class="parameter"><code>packet</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-get-rb"></a><h3>gst_rtcp_packet_get_rb ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_get_rb (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> *packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *dlsr</code></em>);</pre>
+<p>
+Parse the values of the <em class="parameter"><code>nth</code></em> report block in <em class="parameter"><code>packet</code></em> and store the result in
+the values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR or RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the nth report block in <em class="parameter"><code>packet</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>result for data source being reported</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fractionlost</code></em> :</span></p></td>
+<td>result for fraction lost since last SR/RR</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packetslost</code></em> :</span></p></td>
+<td>result for the cumululative number of packets lost</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>exthighestseq</code></em> :</span></p></td>
+<td>result for the extended last sequence number received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>result for the interarrival jitter</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lsr</code></em> :</span></p></td>
+<td>result for the last SR packet from this source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dlsr</code></em> :</span></p></td>
+<td>result for the delay since last SR packet</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-add-rb"></a><h3>gst_rtcp_packet_add_rb ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_add_rb (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> dlsr</code></em>);</pre>
+<p>
+Add a new report block to <em class="parameter"><code>packet</code></em> with the given values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR or RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>data source being reported</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fractionlost</code></em> :</span></p></td>
+<td>fraction lost since last SR/RR</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packetslost</code></em> :</span></p></td>
+<td>the cumululative number of packets lost</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>exthighestseq</code></em> :</span></p></td>
+<td>the extended last sequence number received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>the interarrival jitter</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lsr</code></em> :</span></p></td>
+<td>the last SR packet from this source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dlsr</code></em> :</span></p></td>
+<td>the delay since last SR packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the packet was created. This function can return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if
+the max MTU is exceeded or the number of report blocks is greater than
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-RB-COUNT:CAPS" title="GST_RTCP_MAX_RB_COUNT"><span class="type">GST_RTCP_MAX_RB_COUNT</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-set-rb"></a><h3>gst_rtcp_packet_set_rb ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_set_rb (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> fractionlost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> packetslost</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> exthighestseq</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> jitter</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> lsr</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> dlsr</code></em>);</pre>
+<p>
+Set the <em class="parameter"><code>nth</code></em> new report block in <em class="parameter"><code>packet</code></em> with the given values.
+</p>
+<p>
+Note: Not implemented.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SR or RR <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the nth report block to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>data source being reported</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fractionlost</code></em> :</span></p></td>
+<td>fraction lost since last SR/RR</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packetslost</code></em> :</span></p></td>
+<td>the cumululative number of packets lost</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>exthighestseq</code></em> :</span></p></td>
+<td>the extended last sequence number received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>the interarrival jitter</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lsr</code></em> :</span></p></td>
+<td>the last SR packet from this source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dlsr</code></em> :</span></p></td>
+<td>the delay since last SR packet</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-get-item-count"></a><h3>gst_rtcp_packet_sdes_get_item_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtcp_packet_sdes_get_item_count (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the number of items in the SDES packet <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of items in <em class="parameter"><code>packet</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-first-item"></a><h3>gst_rtcp_packet_sdes_first_item ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_first_item (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Move to the first SDES item in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if there was a first item.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-next-item"></a><h3>gst_rtcp_packet_sdes_next_item ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_next_item (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Move to the next SDES item in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if there was a next item.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-get-ssrc"></a><h3>gst_rtcp_packet_sdes_get_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtcp_packet_sdes_get_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the SSRC of the current SDES item.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the SSRC of the current item.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-first-entry"></a><h3>gst_rtcp_packet_sdes_first_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_first_entry (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Move to the first SDES entry in the current item.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was a first entry.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-next-entry"></a><h3>gst_rtcp_packet_sdes_next_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_next_entry (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Move to the next SDES entry in the current item.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was a next entry.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-get-entry"></a><h3>gst_rtcp_packet_sdes_get_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_get_entry (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> *type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>);</pre>
+<p>
+Get the data of the current SDES item entry. <em class="parameter"><code>type</code></em> (when not NULL) will
+contain the type of the entry. <em class="parameter"><code>data</code></em> (when not NULL) will point to <em class="parameter"><code>len</code></em>
+bytes.
+</p>
+<p>
+When <em class="parameter"><code>type</code></em> refers to a text item, <em class="parameter"><code>data</code></em> will point to a UTF8 string. Note
+that this UTF8 string is NOT null-terminated. Use
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-copy-entry" title="gst_rtcp_packet_sdes_copy_entry ()"><code class="function">gst_rtcp_packet_sdes_copy_entry()</code></a> to get a null-termined copy of the entry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>result of the entry type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>result length of the entry data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>result entry data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was valid data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-copy-entry"></a><h3>gst_rtcp_packet_sdes_copy_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_copy_entry (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> *type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>);</pre>
+<p>
+This function is like <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-entry" title="gst_rtcp_packet_sdes_get_entry ()"><code class="function">gst_rtcp_packet_sdes_get_entry()</code></a> but it returns a
+null-terminated copy of the data instead. use <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>result of the entry type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>result length of the entry data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>result entry data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was valid data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-add-item"></a><h3>gst_rtcp_packet_sdes_add_item ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_add_item (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Add a new SDES item for <em class="parameter"><code>ssrc</code></em> to <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>the SSRC of the new item to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the item could be added, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if the maximum amount of
+items has been exceeded for the SDES packet or the MTU has been reached.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-sdes-add-entry"></a><h3>gst_rtcp_packet_sdes_add_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_sdes_add_entry (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> len</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>);</pre>
+<p>
+Add a new SDES entry to the current item in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid SDES <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> of the SDES entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the data length</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the item could be added, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if the MTU has been
+reached.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-get-ssrc-count"></a><h3>gst_rtcp_packet_bye_get_ssrc_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtcp_packet_bye_get_ssrc_count (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the number of SSRC fields in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of SSRC fields in <em class="parameter"><code>packet</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-get-nth-ssrc"></a><h3>gst_rtcp_packet_bye_get_nth_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtcp_packet_bye_get_nth_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);</pre>
+<p>
+Get the <em class="parameter"><code>nth</code></em> SSRC of the BYE <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the nth SSRC to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <em class="parameter"><code>nth</code></em> SSRC of <em class="parameter"><code>packet</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-add-ssrc"></a><h3>gst_rtcp_packet_bye_add_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_bye_add_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>ssrc</code></em> to the BYE <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>an SSRC to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the ssrc was added. This function can return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if
+the max MTU is exceeded or the number of sources blocks is greater than
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS" title="GST_RTCP_MAX_BYE_SSRC_COUNT"><span class="type">GST_RTCP_MAX_BYE_SSRC_COUNT</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-add-ssrcs"></a><h3>gst_rtcp_packet_bye_add_ssrcs ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_bye_add_ssrcs (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *ssrc</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Adds <em class="parameter"><code>len</code></em> SSRCs in <em class="parameter"><code>ssrc</code></em> to BYE <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>an array of SSRCs to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>number of elements in <em class="parameter"><code>ssrc</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the all the SSRCs were added. This function can return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if
+the max MTU is exceeded or the number of sources blocks is greater than
+<a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS" title="GST_RTCP_MAX_BYE_SSRC_COUNT"><span class="type">GST_RTCP_MAX_BYE_SSRC_COUNT</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-get-reason-len"></a><h3>gst_rtcp_packet_bye_get_reason_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_rtcp_packet_bye_get_reason_len (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the length of the reason string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of the reason string or 0 when there is no reason string
+present.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-get-reason"></a><h3>gst_rtcp_packet_bye_get_reason ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtcp_packet_bye_get_reason (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the reason in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The reason for the BYE <em class="parameter"><code>packet</code></em> or NULL if the packet did not contain
+a reason string. The string must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-bye-set-reason"></a><h3>gst_rtcp_packet_bye_set_reason ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_bye_set_reason (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>);</pre>
+<p>
+Set the reason string to <em class="parameter"><code>reason</code></em> in <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid BYE <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reason</code></em> :</span></p></td>
+<td>a reason string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the string could be set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-get-type"></a><h3>gst_rtcp_packet_fb_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType"><span class="returnvalue">GstRTCPFBType</span></a> gst_rtcp_packet_fb_get_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the feedback message type of the FB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The feedback message type.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-set-type"></a><h3>gst_rtcp_packet_fb_set_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_fb_set_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType"><span class="type">GstRTCPFBType</span></a> type</code></em>);</pre>
+<p>
+Set the feedback message type of the FB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" title="enum GstRTCPFBType"><span class="type">GstRTCPFBType</span></a> to set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-get-sender-ssrc"></a><h3>gst_rtcp_packet_fb_get_sender_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtcp_packet_fb_get_sender_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the sender SSRC field of the RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the sender SSRC.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-set-sender-ssrc"></a><h3>gst_rtcp_packet_fb_set_sender_ssrc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_fb_set_sender_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Set the sender SSRC field of the RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>a sender SSRC</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-get-media-ssrc"></a><h3>gst_rtcp_packet_fb_get_media_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtcp_packet_fb_get_media_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the media SSRC field of the RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the media SSRC.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-set-media-ssrc"></a><h3>gst_rtcp_packet_fb_set_media_ssrc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtcp_packet_fb_set_media_ssrc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Set the media SSRC field of the RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>a media SSRC</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-get-fci-length"></a><h3>gst_rtcp_packet_fb_get_fci_length ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> gst_rtcp_packet_fb_get_fci_length (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the length of the Feedback Control Information attached to a
+RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of the FCI in 32-bit words.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-set-fci-length"></a><h3>gst_rtcp_packet_fb_set_fci_length ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtcp_packet_fb_set_fci_length (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> wordlen</code></em>);</pre>
+<p>
+Set the length of the Feedback Control Information attached to a
+RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>wordlen</code></em> :</span></p></td>
+<td>Length of the FCI in 32-bit words</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if there was enough space in the packet to add this much FCI</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-packet-fb-get-fci"></a><h3>gst_rtcp_packet_fb_get_fci ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * gst_rtcp_packet_fb_get_fci (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a> *packet</code></em>);</pre>
+<p>
+Get the Feedback Control Information attached to a RTPFB or PSFB <em class="parameter"><code>packet</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet</code></em> :</span></p></td>
+<td>a valid RTPFB or PSFB <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket" title="struct GstRTCPPacket"><span class="type">GstRTCPPacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the FCI</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-ntp-to-unix"></a><h3>gst_rtcp_ntp_to_unix ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> gst_rtcp_ntp_to_unix (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> ntptime</code></em>);</pre>
+<p>
+Converts an NTP time to UNIX nanoseconds. <em class="parameter"><code>ntptime</code></em> can typically be
+the NTP time of an SR RTCP message and contains, in the upper 32 bits, the
+number of seconds since 1900 and, in the lower 32 bits, the fractional
+seconds. The resulting value will be the number of nanoseconds since 1970.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ntptime</code></em> :</span></p></td>
+<td>an NTP timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the UNIX time for <em class="parameter"><code>ntptime</code></em> in nanoseconds.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-unix-to-ntp"></a><h3>gst_rtcp_unix_to_ntp ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> gst_rtcp_unix_to_ntp (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> unixtime</code></em>);</pre>
+<p>
+Converts a UNIX timestamp in nanoseconds to an NTP time. The caller should
+pass a value with nanoseconds since 1970. The NTP time will, in the upper
+32 bits, contain the number of seconds since 1900 and, in the lower 32
+bits, the fractional seconds. The resulting value can be used as an ntptime
+for constructing SR RTCP packets.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>unixtime</code></em> :</span></p></td>
+<td>an UNIX timestamp in nanoseconds</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the NTP time for <em class="parameter"><code>unixtime</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-sdes-name-to-type"></a><h3>gst_rtcp_sdes_name_to_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="returnvalue">GstRTCPSDESType</span></a> gst_rtcp_sdes_name_to_type (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>name</code></em> into a <em class="parameter"><code>GstRTCPSDESType</code></em>. <em class="parameter"><code>name</code></em> is typically a key in a
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> containing SDES items.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>a SDES name</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> for <em class="parameter"><code>name</code></em> or <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-PRIV:CAPS"><span class="type">GST_RTCP_SDES_PRIV</span></a> when <em class="parameter"><code>name</code></em>
+is a private sdes item.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtcp-sdes-type-to-name"></a><h3>gst_rtcp_sdes_type_to_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtcp_sdes_type_to_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a> type</code></em>);</pre>
+<p>
+Converts <em class="parameter"><code>type</code></em> to the string equivalent. The string is typically used as a
+key in a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstStructure.html#GstStructure"><span class="type">GstStructure</span></a> containing SDES items.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType" title="enum GstRTCPSDESType"><span class="type">GstRTCPSDESType</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the string equivalent of <em class="parameter"><code>type</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtcpbuffer.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>, <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a>, <span class="type">gstrtpbuffer</span>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtpbuffer.html b/docs/libs/html/gst-plugins-base-libs-gstrtpbuffer.html
new file mode 100644
index 0000000..25c9ecd
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtpbuffer.html
@@ -0,0 +1,1447 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtpbuffer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstbasertppayload.html" title="gstbasertppayload">
+<link rel="next" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstbasertppayload.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtcpbuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtpbuffer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtpbuffer.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtpbuffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtpbuffer.top_of_page"></a>gstrtpbuffer</span></h2>
+<p>gstrtpbuffer — Helper methods for dealing with RTP buffers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtpbuffer.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtp/gstrtpbuffer.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#GST-RTP-VERSION:CAPS" title="GST_RTP_VERSION">GST_RTP_VERSION</a>
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-allocate-data" title="gst_rtp_buffer_allocate_data ()">gst_rtp_buffer_allocate_data</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-take-data" title="gst_rtp_buffer_new_take_data ()">gst_rtp_buffer_new_take_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-copy-data" title="gst_rtp_buffer_new_copy_data ()">gst_rtp_buffer_new_copy_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate" title="gst_rtp_buffer_new_allocate ()">gst_rtp_buffer_new_allocate</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate-len" title="gst_rtp_buffer_new_allocate_len ()">gst_rtp_buffer_new_allocate_len</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> packet_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-header-len" title="gst_rtp_buffer_calc_header_len ()">gst_rtp_buffer_calc_header_len</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-packet-len" title="gst_rtp_buffer_calc_packet_len ()">gst_rtp_buffer_calc_packet_len</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-payload-len" title="gst_rtp_buffer_calc_payload_len ()">gst_rtp_buffer_calc_payload_len</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> packet_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate" title="gst_rtp_buffer_validate ()">gst_rtp_buffer_validate</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate-data" title="gst_rtp_buffer_validate_data ()">gst_rtp_buffer_validate_data</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-packet-len" title="gst_rtp_buffer_set_packet_len ()">gst_rtp_buffer_set_packet_len</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-packet-len" title="gst_rtp_buffer_get_packet_len ()">gst_rtp_buffer_get_packet_len</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-header-len" title="gst_rtp_buffer_get_header_len ()">gst_rtp_buffer_get_header_len</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-version" title="gst_rtp_buffer_get_version ()">gst_rtp_buffer_get_version</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-version" title="gst_rtp_buffer_set_version ()">gst_rtp_buffer_set_version</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> version</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-padding" title="gst_rtp_buffer_get_padding ()">gst_rtp_buffer_get_padding</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-padding" title="gst_rtp_buffer_set_padding ()">gst_rtp_buffer_set_padding</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> padding</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-pad-to" title="gst_rtp_buffer_pad_to ()">gst_rtp_buffer_pad_to</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension" title="gst_rtp_buffer_get_extension ()">gst_rtp_buffer_get_extension</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension" title="gst_rtp_buffer_set_extension ()">gst_rtp_buffer_set_extension</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> extension</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-data" title="gst_rtp_buffer_get_extension_data ()">gst_rtp_buffer_get_extension_data</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *bits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *wordlen</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-ssrc" title="gst_rtp_buffer_get_ssrc ()">gst_rtp_buffer_get_ssrc</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-ssrc" title="gst_rtp_buffer_set_ssrc ()">gst_rtp_buffer_set_ssrc</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc-count" title="gst_rtp_buffer_get_csrc_count ()">gst_rtp_buffer_get_csrc_count</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc" title="gst_rtp_buffer_get_csrc ()">gst_rtp_buffer_get_csrc</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> idx</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-csrc" title="gst_rtp_buffer_set_csrc ()">gst_rtp_buffer_set_csrc</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> idx</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> csrc</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-marker" title="gst_rtp_buffer_get_marker ()">gst_rtp_buffer_get_marker</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-marker" title="gst_rtp_buffer_set_marker ()">gst_rtp_buffer_set_marker</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> marker</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-type" title="gst_rtp_buffer_get_payload_type ()">gst_rtp_buffer_get_payload_type</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-payload-type" title="gst_rtp_buffer_set_payload_type ()">gst_rtp_buffer_set_payload_type</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-seq" title="gst_rtp_buffer_get_seq ()">gst_rtp_buffer_get_seq</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-seq" title="gst_rtp_buffer_set_seq ()">gst_rtp_buffer_set_seq</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seq</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-timestamp" title="gst_rtp_buffer_get_timestamp ()">gst_rtp_buffer_get_timestamp</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-timestamp" title="gst_rtp_buffer_set_timestamp ()">gst_rtp_buffer_set_timestamp</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-buffer" title="gst_rtp_buffer_get_payload_buffer ()">gst_rtp_buffer_get_payload_buffer</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-subbuffer" title="gst_rtp_buffer_get_payload_subbuffer ()">gst_rtp_buffer_get_payload_subbuffer</a>
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-len" title="gst_rtp_buffer_get_payload_len ()">gst_rtp_buffer_get_payload_len</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload" title="gst_rtp_buffer_get_payload ()">gst_rtp_buffer_get_payload</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-default-clock-rate" title="gst_rtp_buffer_default_clock_rate ()">gst_rtp_buffer_default_clock_rate</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-compare-seqnum" title="gst_rtp_buffer_compare_seqnum ()">gst_rtp_buffer_compare_seqnum</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seqnum1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seqnum2</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-ext-timestamp" title="gst_rtp_buffer_ext_timestamp ()">gst_rtp_buffer_ext_timestamp</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *exttimestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension-data" title="gst_rtp_buffer_set_extension_data ()">gst_rtp_buffer_set_extension_data</a> (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> bits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> length</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-onebyte-header" title="gst_rtp_buffer_get_extension_onebyte_header ()">gst_rtp_buffer_get_extension_onebyte_header</a>
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-twobytes-header" title="gst_rtp_buffer_get_extension_twobytes_header ()">gst_rtp_buffer_get_extension_twobytes_header</a>
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *appbits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-onebyte-header" title="gst_rtp_buffer_add_extension_onebyte_header ()">gst_rtp_buffer_add_extension_onebyte_header</a>
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-twobytes-header" title="gst_rtp_buffer_add_extension_twobytes_header ()">gst_rtp_buffer_add_extension_twobytes_header</a>
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> appbits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtpbuffer.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id535614"></a><p>
+The GstRTPBuffer helper functions makes it easy to parse and create regular
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> objects that contain RTP payloads. These buffers are typically of
+'application/x-rtp' <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-07-17 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtpbuffer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-RTP-VERSION:CAPS"></a><h3>GST_RTP_VERSION</h3>
+<pre class="programlisting">#define GST_RTP_VERSION 2
+</pre>
+<p>
+The supported RTP version 2.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-allocate-data"></a><h3>gst_rtp_buffer_allocate_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_allocate_data (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Allocate enough data in <em class="parameter"><code>buffer</code></em> to hold an RTP packet with <em class="parameter"><code>csrc_count</code></em> CSRCs,
+a payload length of <em class="parameter"><code>payload_len</code></em> and padding of <em class="parameter"><code>pad_len</code></em>.
+MALLOCDATA of <em class="parameter"><code>buffer</code></em> will be overwritten and will not be freed.
+All other RTP header fields will be set to 0/FALSE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_len</code></em> :</span></p></td>
+<td>the length of the payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_len</code></em> :</span></p></td>
+<td>the amount of padding</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-new-take-data"></a><h3>gst_rtp_buffer_new_take_data ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_new_take_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);</pre>
+<p>
+Create a new buffer and set the data and size of the buffer to <em class="parameter"><code>data</code></em> and <em class="parameter"><code>len</code></em>
+respectively. <em class="parameter"><code>data</code></em> will be freed when the buffer is unreffed, so this
+function transfers ownership of <em class="parameter"><code>data</code></em> to the new buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data for the new buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer with <em class="parameter"><code>data</code></em> and of size <em class="parameter"><code>len</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-new-copy-data"></a><h3>gst_rtp_buffer_new_copy_data ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_new_copy_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);</pre>
+<p>
+Create a new buffer and set the data to a copy of <em class="parameter"><code>len</code></em>
+bytes of <em class="parameter"><code>data</code></em> and the size to <em class="parameter"><code>len</code></em>. The data will be freed when the buffer
+is freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data for the new buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer with a copy of <em class="parameter"><code>data</code></em> and of size <em class="parameter"><code>len</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-new-allocate"></a><h3>gst_rtp_buffer_new_allocate ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_new_allocate (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Allocate a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> with enough data to hold an RTP packet with
+<em class="parameter"><code>csrc_count</code></em> CSRCs, a payload length of <em class="parameter"><code>payload_len</code></em> and padding of <em class="parameter"><code>pad_len</code></em>.
+All other RTP header fields will be set to 0/FALSE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_len</code></em> :</span></p></td>
+<td>the length of the payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_len</code></em> :</span></p></td>
+<td>the amount of padding</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer that can hold an RTP packet with given
+parameters.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-new-allocate-len"></a><h3>gst_rtp_buffer_new_allocate_len ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_new_allocate_len (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> packet_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Create a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> that can hold an RTP packet that is exactly
+<em class="parameter"><code>packet_len</code></em> long. The length of the payload depends on <em class="parameter"><code>pad_len</code></em> and
+<em class="parameter"><code>csrc_count</code></em> and can be calculated with <a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-payload-len" title="gst_rtp_buffer_calc_payload_len ()"><code class="function">gst_rtp_buffer_calc_payload_len()</code></a>.
+All RTP header fields will be set to 0/FALSE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp_len</code></em> :</span></p></td>
+<td>the total length of the packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_len</code></em> :</span></p></td>
+<td>the amount of padding</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated buffer that can hold an RTP packet of <em class="parameter"><code>packet_len</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-calc-header-len"></a><h3>gst_rtp_buffer_calc_header_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_calc_header_len (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Calculate the header length of an RTP packet with <em class="parameter"><code>csrc_count</code></em> CSRC entries.
+An RTP packet can have at most 15 CSRC entries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of an RTP header with <em class="parameter"><code>csrc_count</code></em> CSRC entries.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-calc-packet-len"></a><h3>gst_rtp_buffer_calc_packet_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_calc_packet_len (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> payload_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Calculate the total length of an RTP packet with a payload size of <em class="parameter"><code>payload_len</code></em>,
+a padding of <em class="parameter"><code>pad_len</code></em> and a <em class="parameter"><code>csrc_count</code></em> CSRC entries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_len</code></em> :</span></p></td>
+<td>the length of the payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_len</code></em> :</span></p></td>
+<td>the amount of padding</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The total length of an RTP header with given parameters.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-calc-payload-len"></a><h3>gst_rtp_buffer_calc_payload_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_calc_payload_len (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> packet_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pad_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> csrc_count</code></em>);</pre>
+<p>
+Calculate the length of the payload of an RTP packet with size <em class="parameter"><code>packet_len</code></em>,
+a padding of <em class="parameter"><code>pad_len</code></em> and a <em class="parameter"><code>csrc_count</code></em> CSRC entries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>packet_len</code></em> :</span></p></td>
+<td>the length of the total RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_len</code></em> :</span></p></td>
+<td>the amount of padding</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc_count</code></em> :</span></p></td>
+<td>the number of CSRC entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of the payload of an RTP packet with given parameters.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-validate"></a><h3>gst_rtp_buffer_validate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_validate (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Check if the data pointed to by <em class="parameter"><code>buffer</code></em> is a valid RTP packet using
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate-data" title="gst_rtp_buffer_validate_data ()"><code class="function">gst_rtp_buffer_validate_data()</code></a>.
+Use this function to validate a packet before using the other functions in
+this module.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> is a valid RTP packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-validate-data"></a><h3>gst_rtp_buffer_validate_data ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_validate_data (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);</pre>
+<p>
+Check if the <em class="parameter"><code>data</code></em> and <em class="parameter"><code>size</code></em> point to the data of a valid RTP packet.
+This function checks the length, version and padding of the packet data.
+Use this function to validate a packet before using the other functions in
+this module.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of <em class="parameter"><code>data</code></em> to validate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the data points to a valid RTP packet.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-packet-len"></a><h3>gst_rtp_buffer_set_packet_len ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_packet_len (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Set the total <em class="parameter"><code>rtp</code></em> size to <em class="parameter"><code>len</code></em>. The data in the buffer will be made
+larger if needed. Any padding will be removed from the packet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the new packet length</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-packet-len"></a><h3>gst_rtp_buffer_get_packet_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_get_packet_len (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Return the total length of the packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The total length of the packet in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-header-len"></a><h3>gst_rtp_buffer_get_header_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_get_header_len (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Return the total length of the header in <em class="parameter"><code>buffer</code></em>. This include the length of
+the fixed header, the CSRC list and the extension header.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The total length of the header in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-version"></a><h3>gst_rtp_buffer_get_version ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_rtp_buffer_get_version (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the version number of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The version of <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-version"></a><h3>gst_rtp_buffer_set_version ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_version (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> version</code></em>);</pre>
+<p>
+Set the version of the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>version</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>the new version</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-padding"></a><h3>gst_rtp_buffer_get_padding ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_padding (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Check if the padding bit is set on the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> has the padding bit set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-padding"></a><h3>gst_rtp_buffer_set_padding ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_padding (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> padding</code></em>);</pre>
+<p>
+Set the padding bit on the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>padding</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>padding</code></em> :</span></p></td>
+<td>the new padding</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-pad-to"></a><h3>gst_rtp_buffer_pad_to ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_pad_to (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Set the amount of padding in the RTP packet in <em class="parameter"><code>buffer</code></em> to
+<em class="parameter"><code>len</code></em>. If <em class="parameter"><code>len</code></em> is 0, the padding is removed.
+</p>
+<p>
+NOTE: This function does not work correctly.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the new amount of padding</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-extension"></a><h3>gst_rtp_buffer_get_extension ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_extension (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Check if the extension bit is set on the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> has the extension bit set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-extension"></a><h3>gst_rtp_buffer_set_extension ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_extension (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> extension</code></em>);</pre>
+<p>
+Set the extension bit on the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>extension</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extension</code></em> :</span></p></td>
+<td>the new extension</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-extension-data"></a><h3>gst_rtp_buffer_get_extension_data ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_extension_data (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *bits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *wordlen</code></em>);</pre>
+<p>
+Get the extension data. <em class="parameter"><code>bits</code></em> will contain the extension 16 bits of custom
+data. <em class="parameter"><code>data</code></em> will point to the data in the extension and <em class="parameter"><code>wordlen</code></em> will contain
+the length of <em class="parameter"><code>data</code></em> in 32 bits words.
+</p>
+<p>
+If <em class="parameter"><code>buffer</code></em> did not contain an extension, this function will return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+with <em class="parameter"><code>bits</code></em>, <em class="parameter"><code>data</code></em> and <em class="parameter"><code>wordlen</code></em> unchanged.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bits</code></em> :</span></p></td>
+<td>location for result bits</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>wordlen</code></em> :</span></p></td>
+<td>location for length of <em class="parameter"><code>data</code></em> in 32 bits words</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> had the extension bit set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-ssrc"></a><h3>gst_rtp_buffer_get_ssrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtp_buffer_get_ssrc (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the SSRC of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the SSRC of <em class="parameter"><code>buffer</code></em> in host order.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-ssrc"></a><h3>gst_rtp_buffer_set_ssrc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_ssrc (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> ssrc</code></em>);</pre>
+<p>
+Set the SSRC on the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>ssrc</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ssrc</code></em> :</span></p></td>
+<td>the new SSRC</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-csrc-count"></a><h3>gst_rtp_buffer_get_csrc_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_rtp_buffer_get_csrc_count (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the CSRC count of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the CSRC count of <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-csrc"></a><h3>gst_rtp_buffer_get_csrc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtp_buffer_get_csrc (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> idx</code></em>);</pre>
+<p>
+Get the CSRC at index <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index of the CSRC to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the CSRC at index <em class="parameter"><code>idx</code></em> in host order.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-csrc"></a><h3>gst_rtp_buffer_set_csrc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_csrc (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> idx</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> csrc</code></em>);</pre>
+<p>
+Modify the CSRC at index <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>csrc</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the CSRC index to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csrc</code></em> :</span></p></td>
+<td>the CSRC in host order to set at <em class="parameter"><code>idx</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-marker"></a><h3>gst_rtp_buffer_get_marker ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_marker (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Check if the marker bit is set on the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> has the marker bit set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-marker"></a><h3>gst_rtp_buffer_set_marker ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_marker (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> marker</code></em>);</pre>
+<p>
+Set the marker bit on the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>marker</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>marker</code></em> :</span></p></td>
+<td>the new marker</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-payload-type"></a><h3>gst_rtp_buffer_get_payload_type ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> gst_rtp_buffer_get_payload_type (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the payload type of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The payload type.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-payload-type"></a><h3>gst_rtp_buffer_set_payload_type ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_payload_type (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);</pre>
+<p>
+Set the payload type of the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>payload_type</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_type</code></em> :</span></p></td>
+<td>the new type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-seq"></a><h3>gst_rtp_buffer_get_seq ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="returnvalue">guint16</span></a> gst_rtp_buffer_get_seq (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the sequence number of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The sequence number in host order.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-seq"></a><h3>gst_rtp_buffer_set_seq ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_seq (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seq</code></em>);</pre>
+<p>
+Set the sequence number of the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>seq</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seq</code></em> :</span></p></td>
+<td>the new sequence number</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-timestamp"></a><h3>gst_rtp_buffer_get_timestamp ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtp_buffer_get_timestamp (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the timestamp of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The timestamp in host order.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-timestamp"></a><h3>gst_rtp_buffer_set_timestamp ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtp_buffer_set_timestamp (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>);</pre>
+<p>
+Set the timestamp of the RTP packet in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>timestamp</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the new timestamp</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-payload-buffer"></a><h3>gst_rtp_buffer_get_payload_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_get_payload_buffer (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Create a buffer of the payload of the RTP packet in <em class="parameter"><code>buffer</code></em>. This function
+will internally create a subbuffer of <em class="parameter"><code>buffer</code></em> so that a memcpy can be
+avoided.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new buffer with the data of the payload.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-payload-subbuffer"></a><h3>gst_rtp_buffer_get_payload_subbuffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_rtp_buffer_get_payload_subbuffer
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> len</code></em>);</pre>
+<p>
+Create a subbuffer of the payload of the RTP packet in <em class="parameter"><code>buffer</code></em>. <em class="parameter"><code>offset</code></em> bytes
+are skipped in the payload and the subbuffer will be of size <em class="parameter"><code>len</code></em>.
+If <em class="parameter"><code>len</code></em> is -1 the total payload starting from <em class="parameter"><code>offset</code></em> if subbuffered.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset in the payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length in the payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new buffer with the specified data of the payload.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-payload-len"></a><h3>gst_rtp_buffer_get_payload_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtp_buffer_get_payload_len (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get the length of the payload of the RTP packet in <em class="parameter"><code>buffer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of the payload in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-payload"></a><h3>gst_rtp_buffer_get_payload ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> gst_rtp_buffer_get_payload (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>);</pre>
+<p>
+Get a pointer to the payload data in <em class="parameter"><code>buffer</code></em>. This pointer is valid as long
+as a reference to <em class="parameter"><code>buffer</code></em> is held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A pointer to the payload data in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-default-clock-rate"></a><h3>gst_rtp_buffer_default_clock_rate ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_rtp_buffer_default_clock_rate (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);</pre>
+<p>
+Get the default clock-rate for the static payload type <em class="parameter"><code>payload_type</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_type</code></em> :</span></p></td>
+<td>the static payload type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the default clock rate or -1 if the payload type is not static or
+the clock-rate is undefined.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-compare-seqnum"></a><h3>gst_rtp_buffer_compare_seqnum ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_rtp_buffer_compare_seqnum (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seqnum1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> seqnum2</code></em>);</pre>
+<p>
+Compare two sequence numbers, taking care of wraparounds. This function
+returns the difference between <em class="parameter"><code>seqnum1</code></em> and <em class="parameter"><code>seqnum2</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seqnum1</code></em> :</span></p></td>
+<td>a sequence number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seqnum2</code></em> :</span></p></td>
+<td>a sequence number</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a negative value if <em class="parameter"><code>seqnum1</code></em> is bigger than <em class="parameter"><code>seqnum2</code></em>, 0 if they
+are equal or a positive value if <em class="parameter"><code>seqnum1</code></em> is smaller than <em class="parameter"><code>segnum2</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-ext-timestamp"></a><h3>gst_rtp_buffer_ext_timestamp ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a> gst_rtp_buffer_ext_timestamp (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *exttimestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> timestamp</code></em>);</pre>
+<p>
+Update the <em class="parameter"><code>exttimestamp</code></em> field with <em class="parameter"><code>timestamp</code></em>. For the first call of the
+method, <em class="parameter"><code>exttimestamp</code></em> should point to a location with a value of -1.
+</p>
+<p>
+This function makes sure that the returned value is a constantly increasing
+value even in the case where there is a timestamp wraparound.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>exttimestamp</code></em> :</span></p></td>
+<td>a previous extended timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>a new timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The extended timestamp of <em class="parameter"><code>timestamp</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-set-extension-data"></a><h3>gst_rtp_buffer_set_extension_data ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_set_extension_data (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> bits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> length</code></em>);</pre>
+<p>
+Set the extension bit of the rtp buffer and fill in the <em class="parameter"><code>bits</code></em> and <em class="parameter"><code>length</code></em> of the
+extension header. It will refuse to set the extension data if the buffer is not
+large enough.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bits</code></em> :</span></p></td>
+<td>the bits specific for the extension</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length that counts the number of 32-bit words in
+the extension, excluding the extension header ( therefore zero is a valid length)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>True if done.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-extension-onebyte-header"></a><h3>gst_rtp_buffer_get_extension_onebyte_header ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_extension_onebyte_header
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);</pre>
+<p>
+Parses RFC 5285 style header extensions with a one byte header. It will
+return the nth extension with the requested id.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>The ID of the header extension to be read (between 1 and 14).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>Read the nth extension packet with the requested ID</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the data in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> had the requested header extension</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-get-extension-twobytes-header"></a><h3>gst_rtp_buffer_get_extension_twobytes_header ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_get_extension_twobytes_header
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *appbits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);</pre>
+<p>
+Parses RFC 5285 style header extensions with a two bytes header. It will
+return the nth extension with the requested id.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appbits</code></em> :</span></p></td>
+<td>Application specific bits</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>The ID of the header extension to be read (between 1 and 14).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>Read the nth extension packet with the requested ID</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the data in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>buffer</code></em> had the requested header extension</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-add-extension-onebyte-header"></a><h3>gst_rtp_buffer_add_extension_onebyte_header ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_add_extension_onebyte_header
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<p>
+Adds a RFC 5285 header extension with a one byte header to the end of the
+RTP header. If there is already a RFC 5285 header extension with a one byte
+header, the new extension will be appended.
+It will not work if there is already a header extension that does not follow
+the mecanism described in RFC 5285 or if there is a header extension with
+a two bytes header as described in RFC 5285. In that case, use
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-twobytes-header" title="gst_rtp_buffer_add_extension_twobytes_header ()"><code class="function">gst_rtp_buffer_add_extension_twobytes_header()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>The ID of the header extension (between 1 and 14).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the data in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if header extension could be added</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-buffer-add-extension-twobytes-header"></a><h3>gst_rtp_buffer_add_extension_twobytes_header ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtp_buffer_add_extension_twobytes_header
+ (<em class="parameter"><code><span class="type">GstRTPBuffer</span> *rtp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> appbits</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<p>
+Adds a RFC 5285 header extension with a two bytes header to the end of the
+RTP header. If there is already a RFC 5285 header extension with a two bytes
+header, the new extension will be appended.
+It will not work if there is already a header extension that does not follow
+the mecanism described in RFC 5285 or if there is a header extension with
+a one byte header as described in RFC 5285. In that case, use
+<a class="link" href="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-onebyte-header" title="gst_rtp_buffer_add_extension_onebyte_header ()"><code class="function">gst_rtp_buffer_add_extension_onebyte_header()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rtp</code></em> :</span></p></td>
+<td>the RTP packet</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>appbits</code></em> :</span></p></td>
+<td>Application specific bits</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>The ID of the header extension</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the data in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if header extension could be added</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtpbuffer.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload"><span class="type">GstBaseRTPPayload</span></a>, <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload"><span class="type">GstBaseRTPDepayload</span></a>, gstrtcpbuffer
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtppayloads.html b/docs/libs/html/gst-plugins-base-libs-gstrtppayloads.html
new file mode 100644
index 0000000..3ff01db
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtppayloads.html
@@ -0,0 +1,388 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtppayloads</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtp.html" title="RTP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtcpbuffer.html" title="gstrtcpbuffer">
+<link rel="next" href="gstreamer-rtsp.html" title="RTSP Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtcpbuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-rtsp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtppayloads.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtppayloads.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtppayloads"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtppayloads.top_of_page"></a>gstrtppayloads</span></h2>
+<p>gstrtppayloads — Helper methods for dealing with RTP payloads</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtppayloads.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtp/gstrtppayload.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayload" title="enum GstRTPPayload">GstRTPPayload</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS" title="GST_RTP_PAYLOAD_IS_DYNAMIC()">GST_RTP_PAYLOAD_IS_DYNAMIC</a> (pt)
+struct <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo">GstRTPPayloadInfo</a>;
+const <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="returnvalue">GstRTPPayloadInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-name" title="gst_rtp_payload_info_for_name ()">gst_rtp_payload_info_for_name</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *encoding_name</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="returnvalue">GstRTPPayloadInfo</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-pt" title="gst_rtp_payload_info_for_pt ()">gst_rtp_payload_info_for_pt</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtppayloads.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id420172"></a><p>
+The GstRTPPayloads helper functions makes it easy to deal with static and dynamic
+payloads. Its main purpose is to retrieve properties such as the default clock-rate
+and get session bandwidth information.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2007-10-01 (0.10.15)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtppayloads.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTPPayload"></a><h3>enum GstRTPPayload</h3>
+<pre class="programlisting">typedef enum {
+ /* Audio: */
+ GST_RTP_PAYLOAD_PCMU = 0,
+ GST_RTP_PAYLOAD_1016 = 1, /* RFC 3551 says reserved */
+ GST_RTP_PAYLOAD_G721 = 2, /* RFC 3551 says reserved */
+ GST_RTP_PAYLOAD_GSM = 3,
+ GST_RTP_PAYLOAD_G723 = 4,
+ GST_RTP_PAYLOAD_DVI4_8000 = 5,
+ GST_RTP_PAYLOAD_DVI4_16000 = 6,
+ GST_RTP_PAYLOAD_LPC = 7,
+ GST_RTP_PAYLOAD_PCMA = 8,
+ GST_RTP_PAYLOAD_G722 = 9,
+ GST_RTP_PAYLOAD_L16_STEREO = 10,
+ GST_RTP_PAYLOAD_L16_MONO = 11,
+ GST_RTP_PAYLOAD_QCELP = 12,
+ GST_RTP_PAYLOAD_CN = 13,
+ GST_RTP_PAYLOAD_MPA = 14,
+ GST_RTP_PAYLOAD_G728 = 15,
+ GST_RTP_PAYLOAD_DVI4_11025 = 16,
+ GST_RTP_PAYLOAD_DVI4_22050 = 17,
+ GST_RTP_PAYLOAD_G729 = 18,
+
+ /* Video: */
+
+ GST_RTP_PAYLOAD_CELLB = 25,
+ GST_RTP_PAYLOAD_JPEG = 26,
+ GST_RTP_PAYLOAD_NV = 28,
+ GST_RTP_PAYLOAD_H261 = 31,
+ GST_RTP_PAYLOAD_MPV = 32,
+ GST_RTP_PAYLOAD_MP2T = 33,
+ GST_RTP_PAYLOAD_H263 = 34,
+
+ /* BOTH */
+} GstRTPPayload;
+</pre>
+<p>
+Standard predefined fixed payload types.
+</p>
+<p>
+The official list is at:
+http://www.iana.org/assignments/rtp-parameters
+</p>
+<p>
+Audio:
+reserved: 19
+unassigned: 20-23,
+</p>
+<p>
+Video:
+unassigned: 24, 27, 29, 30, 35-71, 77-95
+Reserved for RTCP conflict avoidance: 72-76
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-PCMU:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_PCMU</code></span></p></td>
+<td>ITU-T G.711. mu-law audio (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-1016:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_1016</code></span></p></td>
+<td>RFC 3551 says reserved
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-G721:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_G721</code></span></p></td>
+<td>RFC 3551 says reserved
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-GSM:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_GSM</code></span></p></td>
+<td>GSM audio
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-G723:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_G723</code></span></p></td>
+<td>ITU G.723.1 audio
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-DVI4-8000:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_DVI4_8000</code></span></p></td>
+<td>IMA ADPCM wave type (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-DVI4-16000:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_DVI4_16000</code></span></p></td>
+<td>IMA ADPCM wave type (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-LPC:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_LPC</code></span></p></td>
+<td>experimental linear predictive encoding
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-PCMA:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_PCMA</code></span></p></td>
+<td>ITU-T G.711 A-law audio (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-G722:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_G722</code></span></p></td>
+<td>ITU-T G.722 (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-L16-STEREO:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_L16_STEREO</code></span></p></td>
+<td>stereo PCM
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-L16-MONO:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_L16_MONO</code></span></p></td>
+<td>mono PCM
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-QCELP:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_QCELP</code></span></p></td>
+<td>EIA &amp; TIA standard IS-733
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-CN:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_CN</code></span></p></td>
+<td>Comfort Noise (RFC 3389)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-MPA:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_MPA</code></span></p></td>
+<td>Audio MPEG 1-3.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-G728:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_G728</code></span></p></td>
+<td>ITU-T G.728 Speech coder (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-DVI4-11025:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_DVI4_11025</code></span></p></td>
+<td>IMA ADPCM wave type (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-DVI4-22050:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_DVI4_22050</code></span></p></td>
+<td>IMA ADPCM wave type (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-G729:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_G729</code></span></p></td>
+<td>ITU-T G.729 Speech coder (RFC 3551)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-CELLB:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_CELLB</code></span></p></td>
+<td>See RFC 2029
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-JPEG:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_JPEG</code></span></p></td>
+<td>ISO Standards 10918-1 and 10918-2 (RFC 2435)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-NV:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_NV</code></span></p></td>
+<td>nv encoding by Ron Frederick
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-H261:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_H261</code></span></p></td>
+<td>ITU-T Recommendation H.261 (RFC 2032)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-MPV:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_MPV</code></span></p></td>
+<td>Video MPEG 1 &amp; 2 (RFC 2250)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-MP2T:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_MP2T</code></span></p></td>
+<td>MPEG-2 transport stream (RFC 2250)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTP-PAYLOAD-H263:CAPS"></a><span class="term"><code class="literal">GST_RTP_PAYLOAD_H263</code></span></p></td>
+<td>Video H263 (RFC 2190)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS"></a><h3>GST_RTP_PAYLOAD_IS_DYNAMIC()</h3>
+<pre class="programlisting">#define GST_RTP_PAYLOAD_IS_DYNAMIC(pt) ((pt) &gt;= 96 &amp;&amp; (pt) &lt;= 127)
+</pre>
+<p>
+Check if <em class="parameter"><code>pt</code></em> is a dynamic payload type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pt</code></em> :</span></p></td>
+<td>a payload type</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTPPayloadInfo"></a><h3>struct GstRTPPayloadInfo</h3>
+<pre class="programlisting">struct GstRTPPayloadInfo {
+ guint8 payload_type;
+ const gchar *media;
+ const gchar *encoding_name;
+ guint clock_rate;
+ const gchar *encoding_parameters;
+ guint bitrate;
+};
+</pre>
+<p>
+Structure holding default payload type information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> <em class="structfield"><code><a name="GstRTPPayloadInfo.payload-type"></a>payload_type</code></em>;</span></p></td>
+<td>payload type, -1 means dynamic</td>
+</tr>
+<tr>
+<td><p><span class="term">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTPPayloadInfo.media"></a>media</code></em>;</span></p></td>
+<td>the media type(s), usually "audio", "video", "application", "text",
+"message".</td>
+</tr>
+<tr>
+<td><p><span class="term">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTPPayloadInfo.encoding-name"></a>encoding_name</code></em>;</span></p></td>
+<td>the encoding name of <em class="parameter"><code>pt</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTPPayloadInfo.clock-rate"></a>clock_rate</code></em>;</span></p></td>
+<td>default clock rate, 0 = unknown/variable</td>
+</tr>
+<tr>
+<td><p><span class="term">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTPPayloadInfo.encoding-parameters"></a>encoding_parameters</code></em>;</span></p></td>
+<td>encoding parameters. For audio this is the number of
+channels. NULL = not applicable.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTPPayloadInfo.bitrate"></a>bitrate</code></em>;</span></p></td>
+<td>the bitrate of the media. 0 = unknown/variable.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-payload-info-for-name"></a><h3>gst_rtp_payload_info_for_name ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="returnvalue">GstRTPPayloadInfo</span></a> * gst_rtp_payload_info_for_name (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *encoding_name</code></em>);</pre>
+<p>
+Get the <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="type">GstRTPPayloadInfo</span></a> for <em class="parameter"><code>media</code></em> and <em class="parameter"><code>encoding_name</code></em>. This function is
+mostly used to get the default clock-rate and bandwidth for dynamic payload
+types specified with <em class="parameter"><code>media</code></em> and <em class="parameter"><code>encoding</code></em> name.
+</p>
+<p>
+The search for <em class="parameter"><code>encoding_name</code></em> will be performed in a case insensitve way.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>the media to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>encoding_name</code></em> :</span></p></td>
+<td>the encoding name to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="type">GstRTPPayloadInfo</span></a> or NULL when no info could be found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtp-payload-info-for-pt"></a><h3>gst_rtp_payload_info_for_pt ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="returnvalue">GstRTPPayloadInfo</span></a> * gst_rtp_payload_info_for_pt (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> payload_type</code></em>);</pre>
+<p>
+Get the <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="type">GstRTPPayloadInfo</span></a> for <em class="parameter"><code>payload_type</code></em>. This function is
+mostly used to get the default clock-rate and bandwidth for static payload
+types specified with <em class="parameter"><code>payload_type</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload_type</code></em> :</span></p></td>
+<td>the payload_type to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo" title="struct GstRTPPayloadInfo"><span class="type">GstRTPPayloadInfo</span></a> or NULL when no info could be found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtppayloads.see-also"></a><h2>See Also</h2>
+gstrtpbuffer
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspbase64.html b/docs/libs/html/gst-plugins-base-libs-gstrtspbase64.html
new file mode 100644
index 0000000..8f15711
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspbase64.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspbase64</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="next" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-rtsp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspconnection.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspbase64.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspbase64.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspbase64"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspbase64.top_of_page"></a>gstrtspbase64</span></h2>
+<p>gstrtspbase64 — Helper functions to handle Base64</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspbase64.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspbase64.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-encode" title="gst_rtsp_base64_encode ()">gst_rtsp_base64_encode</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-decode-ip" title="gst_rtsp_base64_decode_ip ()">gst_rtsp_base64_decode_ip</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> *len</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspbase64.description"></a><h2>Description</h2>
+<p>
+Last reviewed on 2007-07-24 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspbase64.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-rtsp-base64-encode"></a><h3>gst_rtsp_base64_encode ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_base64_encode (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> len</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">gst_rtsp_base64_encode</code> is deprecated and should not be used in newly-written code. Use <a href="http://library.gnome.org/devel/glib/unstable/glib-Base64-Encoding.html#g-base64-encode"><code class="function">g_base64_encode()</code></a></p>
+</div>
+<p>
+Encode a sequence of binary data into its Base-64 stringified representation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the binary data to encode</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the length of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated, zero-terminated Base-64 encoded string
+representing <em class="parameter"><code>data</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-base64-decode-ip"></a><h3>gst_rtsp_base64_decode_ip ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_base64_decode_ip (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="type">gsize</span></a> *len</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">gst_rtsp_base64_decode_ip</code> is deprecated and should not be used in newly-written code. use <a href="http://library.gnome.org/devel/glib/unstable/glib-Base64-Encoding.html#g-base64-decode-inplace"><code class="function">g_base64_decode_inplace()</code></a> instead.</p>
+</div>
+<p>
+Decode the base64 string pointed to by <em class="parameter"><code>data</code></em> in-place. When <em class="parameter"><code>len</code></em> is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+it will contain the length of the decoded data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the base64 encoded data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>location for output length or NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspconnection.html b/docs/libs/html/gst-plugins-base-libs-gstrtspconnection.html
new file mode 100644
index 0000000..1943073
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspconnection.html
@@ -0,0 +1,1421 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspconnection</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">
+<link rel="next" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspbase64.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspdefs.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspconnection.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspconnection.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspconnection"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspconnection.top_of_page"></a>gstrtspconnection</span></h2>
+<p>gstrtspconnection — manage RTSP connections</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspconnection.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspconnection.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection">GstRTSPConnection</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create" title="gst_rtsp_connection_create ()">gst_rtsp_connection_create</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create-from-fd" title="gst_rtsp_connection_create_from_fd ()">gst_rtsp_connection_create_from_fd</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ip</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *initial_buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-accept" title="gst_rtsp_connection_accept ()">gst_rtsp_connection_accept</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sock</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-connect" title="gst_rtsp_connection_connect ()">gst_rtsp_connection_connect</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-close" title="gst_rtsp_connection_close ()">gst_rtsp_connection_close</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-free" title="gst_rtsp_connection_free ()">gst_rtsp_connection_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-read" title="gst_rtsp_connection_read ()">gst_rtsp_connection_read</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-write" title="gst_rtsp_connection_write ()">gst_rtsp_connection_write</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-poll" title="gst_rtsp_connection_poll ()">gst_rtsp_connection_poll</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent"><span class="type">GstRTSPEvent</span></a> events</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent"><span class="type">GstRTSPEvent</span></a> *revents</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-send" title="gst_rtsp_connection_send ()">gst_rtsp_connection_send</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-receive" title="gst_rtsp_connection_receive ()">gst_rtsp_connection_receive</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-next-timeout" title="gst_rtsp_connection_next_timeout ()">gst_rtsp_connection_next_timeout</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-reset-timeout" title="gst_rtsp_connection_reset_timeout ()">gst_rtsp_connection_reset_timeout</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()">gst_rtsp_connection_flush</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flush</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth" title="gst_rtsp_connection_set_auth ()">gst_rtsp_connection_set_auth</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod" title="enum GstRTSPAuthMethod"><span class="type">GstRTSPAuthMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *user</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *pass</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth-param" title="gst_rtsp_connection_set_auth_param ()">gst_rtsp_connection_set_auth_param</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *param</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-clear-auth-params" title="gst_rtsp_connection_clear_auth_params ()">gst_rtsp_connection_clear_auth_params</a>
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-qos-dscp" title="gst_rtsp_connection_set_qos_dscp ()">gst_rtsp_connection_set_qos_dscp</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> qos_dscp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-ip" title="gst_rtsp_connection_set_ip ()">gst_rtsp_connection_set_ip</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ip</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-ip" title="gst_rtsp_connection_get_ip ()">gst_rtsp_connection_get_ip</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="returnvalue">GstRTSPUrl</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-url" title="gst_rtsp_connection_get_url ()">gst_rtsp_connection_get_url</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-tunneled" title="gst_rtsp_connection_set_tunneled ()">gst_rtsp_connection_set_tunneled</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> tunneled</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-is-tunneled" title="gst_rtsp_connection_is_tunneled ()">gst_rtsp_connection_is_tunneled</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-tunnelid" title="gst_rtsp_connection_get_tunnelid ()">gst_rtsp_connection_get_tunnelid</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel" title="gst_rtsp_connection_do_tunnel ()">gst_rtsp_connection_do_tunnel</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn2</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-readfd" title="gst_rtsp_connection_get_readfd ()">gst_rtsp_connection_get_readfd</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-writefd" title="gst_rtsp_connection_get_writefd ()">gst_rtsp_connection_get_writefd</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-http-mode" title="gst_rtsp_connection_set_http_mode ()">gst_rtsp_connection_set_http_mode</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enable</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-proxy" title="gst_rtsp_connection_set_proxy ()">gst_rtsp_connection_set_proxy</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *host</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> port</code></em>);
+ <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch">GstRTSPWatch</a>;
+ <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs" title="GstRTSPWatchFuncs">GstRTSPWatchFuncs</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="returnvalue">GstRTSPWatch</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-new" title="gst_rtsp_watch_new ()">gst_rtsp_watch_new</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs" title="GstRTSPWatchFuncs"><span class="type">GstRTSPWatchFuncs</span></a> *funcs</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-unref" title="gst_rtsp_watch_unref ()">gst_rtsp_watch_unref</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-attach" title="gst_rtsp_watch_attach ()">gst_rtsp_watch_attach</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><span class="type">GMainContext</span></a> *context</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-reset" title="gst_rtsp_watch_reset ()">gst_rtsp_watch_reset</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-message" title="gst_rtsp_watch_queue_message ()">gst_rtsp_watch_queue_message</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-data" title="gst_rtsp_watch_queue_data ()">gst_rtsp_watch_queue_data</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-send-message" title="gst_rtsp_watch_send_message ()">gst_rtsp_watch_send_message</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *id</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-write-data" title="gst_rtsp_watch_write_data ()">gst_rtsp_watch_write_data</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *id</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspconnection.description"></a><h2>Description</h2>
+<p>
+This object manages the RTSP connection to the server. It provides function
+to receive and send bytes and messages.
+
+Last reviewed on 2007-07-24 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspconnection.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTSPConnection"></a><h3>GstRTSPConnection</h3>
+<pre class="programlisting">typedef struct _GstRTSPConnection GstRTSPConnection;</pre>
+<p>
+Opaque RTSP connection object.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-create"></a><h3>gst_rtsp_connection_create ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_create (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);</pre>
+<p>
+Create a newly allocated <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> from <em class="parameter"><code>url</code></em> and store it in <em class="parameter"><code>conn</code></em>.
+The connection will not yet attempt to connect to <em class="parameter"><code>url</code></em>, use
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-connect" title="gst_rtsp_connection_connect ()"><code class="function">gst_rtsp_connection_connect()</code></a>.
+</p>
+<p>
+A copy of <em class="parameter"><code>url</code></em> will be made.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>storage for a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> when <em class="parameter"><code>conn</code></em> contains a valid connection.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-create-from-fd"></a><h3>gst_rtsp_connection_create_from_fd ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_create_from_fd (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ip</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *initial_buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> for handling communication on the existing
+file descriptor <em class="parameter"><code>fd</code></em>. The <em class="parameter"><code>initial_buffer</code></em> contains any data already read from
+<em class="parameter"><code>fd</code></em> which should be used before starting to read new data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>a file descriptor</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ip</code></em> :</span></p></td>
+<td>the IP address of the other end</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>the port used by the other end</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>initial_buffer</code></em> :</span></p></td>
+<td>data already read from <em class="parameter"><code>fd</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>storage for a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> when <em class="parameter"><code>conn</code></em> contains a valid connection.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-accept"></a><h3>gst_rtsp_connection_accept ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_accept (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> sock</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> **conn</code></em>);</pre>
+<p>
+Accept a new connection on <em class="parameter"><code>sock</code></em> and create a new <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> for
+handling communication on new socket.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sock</code></em> :</span></p></td>
+<td>a socket</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>storage for a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> when <em class="parameter"><code>conn</code></em> contains a valid connection.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-connect"></a><h3>gst_rtsp_connection_connect ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_connect (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Attempt to connect to the url of <em class="parameter"><code>conn</code></em> made with
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create" title="gst_rtsp_connection_create ()"><code class="function">gst_rtsp_connection_create()</code></a>. If <em class="parameter"><code>timeout</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> this function can block
+forever. If <em class="parameter"><code>timeout</code></em> contains a valid timeout, this function will return
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETIMEOUT:CAPS"><span class="type">GST_RTSP_ETIMEOUT</span></a> after the timeout expired.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> timeout</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> when a connection could be made.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-close"></a><h3>gst_rtsp_connection_close ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_close (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Close the connected <em class="parameter"><code>conn</code></em>. After this call, the connection is in the same
+state as when it was first created.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-free"></a><h3>gst_rtsp_connection_free ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Close and free <em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-read"></a><h3>gst_rtsp_connection_read ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_read (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Attempt to read <em class="parameter"><code>size</code></em> bytes into <em class="parameter"><code>data</code></em> from the connected <em class="parameter"><code>conn</code></em>, blocking up to
+the specified <em class="parameter"><code>timeout</code></em>. <em class="parameter"><code>timeout</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, in which case this function
+might block forever.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout value or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-write"></a><h3>gst_rtsp_connection_write ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_write (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Attempt to write <em class="parameter"><code>size</code></em> bytes of <em class="parameter"><code>data</code></em> to the connected <em class="parameter"><code>conn</code></em>, blocking up to
+the specified <em class="parameter"><code>timeout</code></em>. <em class="parameter"><code>timeout</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, in which case this function
+might block forever.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to write</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout value or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-poll"></a><h3>gst_rtsp_connection_poll ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_poll (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent"><span class="type">GstRTSPEvent</span></a> events</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent"><span class="type">GstRTSPEvent</span></a> *revents</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Wait up to the specified <em class="parameter"><code>timeout</code></em> for the connection to become available for
+at least one of the operations specified in <em class="parameter"><code>events</code></em>. When the function returns
+with <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>, <em class="parameter"><code>revents</code></em> will contain a bitmask of available operations on
+<em class="parameter"><code>conn</code></em>.
+</p>
+<p>
+<em class="parameter"><code>timeout</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, in which case this function might block forever.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>events</code></em> :</span></p></td>
+<td>a bitmask of <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent"><span class="type">GstRTSPEvent</span></a> flags to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>revents</code></em> :</span></p></td>
+<td>location for result flags</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-send"></a><h3>gst_rtsp_connection_send ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_send (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Attempt to send <em class="parameter"><code>message</code></em> to the connected <em class="parameter"><code>conn</code></em>, blocking up to
+the specified <em class="parameter"><code>timeout</code></em>. <em class="parameter"><code>timeout</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, in which case this function
+might block forever.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the message to send</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout value or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-receive"></a><h3>gst_rtsp_connection_receive ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_receive (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Attempt to read into <em class="parameter"><code>message</code></em> from the connected <em class="parameter"><code>conn</code></em>, blocking up to
+the specified <em class="parameter"><code>timeout</code></em>. <em class="parameter"><code>timeout</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, in which case this function
+might block forever.
+</p>
+<p>
+This function can be cancelled with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush" title="gst_rtsp_connection_flush ()"><code class="function">gst_rtsp_connection_flush()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the message to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout value or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-next-timeout"></a><h3>gst_rtsp_connection_next_timeout ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_next_timeout (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> *timeout</code></em>);</pre>
+<p>
+Calculate the next timeout for <em class="parameter"><code>conn</code></em>, storing the result in <em class="parameter"><code>timeout</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-reset-timeout"></a><h3>gst_rtsp_connection_reset_timeout ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_reset_timeout (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Reset the timeout of <em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-flush"></a><h3>gst_rtsp_connection_flush ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_flush (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flush</code></em>);</pre>
+<p>
+Start or stop the flushing action on <em class="parameter"><code>conn</code></em>. When flushing, all current
+and future actions on <em class="parameter"><code>conn</code></em> will return <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EINTR:CAPS"><span class="type">GST_RTSP_EINTR</span></a> until the connection
+is set to non-flushing mode again.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>start or stop the flush</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-auth"></a><h3>gst_rtsp_connection_set_auth ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_set_auth (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod" title="enum GstRTSPAuthMethod"><span class="type">GstRTSPAuthMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *user</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *pass</code></em>);</pre>
+<p>
+Configure <em class="parameter"><code>conn</code></em> for authentication mode <em class="parameter"><code>method</code></em> with <em class="parameter"><code>user</code></em> and <em class="parameter"><code>pass</code></em> as the
+user and password respectively.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>authentication method</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user</code></em> :</span></p></td>
+<td>the user</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pass</code></em> :</span></p></td>
+<td>the password</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-auth-param"></a><h3>gst_rtsp_connection_set_auth_param ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_connection_set_auth_param (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *param</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Setup <em class="parameter"><code>conn</code></em> with authentication directives. This is not necesary for
+methods <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-NONE:CAPS"><span class="type">GST_RTSP_AUTH_NONE</span></a> and <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-BASIC:CAPS"><span class="type">GST_RTSP_AUTH_BASIC</span></a>. For
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-DIGEST:CAPS"><span class="type">GST_RTSP_AUTH_DIGEST</span></a>, directives should be taken from the digest challenge
+in the WWW-Authenticate response header and can include realm, domain,
+nonce, opaque, stale, algorithm, qop as per RFC2617.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>param</code></em> :</span></p></td>
+<td>authentication directive</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>value</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-clear-auth-params"></a><h3>gst_rtsp_connection_clear_auth_params ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_connection_clear_auth_params
+ (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Clear the list of authentication directives stored in <em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-qos-dscp"></a><h3>gst_rtsp_connection_set_qos_dscp ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_set_qos_dscp (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> qos_dscp</code></em>);</pre>
+<p>
+Configure <em class="parameter"><code>conn</code></em> to use the specified DSCP value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>qos_dscp</code></em> :</span></p></td>
+<td>DSCP value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-ip"></a><h3>gst_rtsp_connection_set_ip ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_connection_set_ip (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ip</code></em>);</pre>
+<p>
+Set the IP address of the server.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ip</code></em> :</span></p></td>
+<td>an ip address</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-get-ip"></a><h3>gst_rtsp_connection_get_ip ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_connection_get_ip (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Retrieve the IP address of the other end of <em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The IP address as a string. this value remains valid until the
+connection is closed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-get-url"></a><h3>gst_rtsp_connection_get_url ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="returnvalue">GstRTSPUrl</span></a> * gst_rtsp_connection_get_url (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Retrieve the URL of the other end of <em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The URL. This value remains valid until the
+connection is freed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-tunneled"></a><h3>gst_rtsp_connection_set_tunneled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_connection_set_tunneled (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> tunneled</code></em>);</pre>
+<p>
+Set the HTTP tunneling state of the connection. This must be configured before
+the <em class="parameter"><code>conn</code></em> is connected.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tunneled</code></em> :</span></p></td>
+<td>the new state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-is-tunneled"></a><h3>gst_rtsp_connection_is_tunneled ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtsp_connection_is_tunneled (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Get the tunneling state of the connection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>if <em class="parameter"><code>conn</code></em> is using HTTP tunneling.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-get-tunnelid"></a><h3>gst_rtsp_connection_get_tunnelid ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_connection_get_tunnelid (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Get the tunnel session id the connection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>returns a non-empty string if <em class="parameter"><code>conn</code></em> is being tunneled over HTTP.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-do-tunnel"></a><h3>gst_rtsp_connection_do_tunnel ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_do_tunnel (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn2</code></em>);</pre>
+<p>
+If <em class="parameter"><code>conn</code></em> received the first tunnel connection and <em class="parameter"><code>conn2</code></em> received
+the second tunnel connection, link the two connections together so that
+<em class="parameter"><code>conn</code></em> manages the tunneled connection.
+</p>
+<p>
+After this call, <em class="parameter"><code>conn2</code></em> cannot be used anymore and must be freed with
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-free" title="gst_rtsp_connection_free ()"><code class="function">gst_rtsp_connection_free()</code></a>.
+</p>
+<p>
+If <em class="parameter"><code>conn2</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> then only the base64 decoding context will be setup for
+<em class="parameter"><code>conn</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn2</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>return GST_RTSP_OK on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-get-readfd"></a><h3>gst_rtsp_connection_get_readfd ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_rtsp_connection_get_readfd (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Get the file descriptor for reading.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the file descriptor used for reading or -1 on error. The file
+descriptor remains valid until the connection is closed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-get-writefd"></a><h3>gst_rtsp_connection_get_writefd ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_rtsp_connection_get_writefd (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>);</pre>
+<p>
+Get the file descriptor for writing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the file descriptor used for writing or -1 on error. The file
+descriptor remains valid until the connection is closed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-http-mode"></a><h3>gst_rtsp_connection_set_http_mode ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_connection_set_http_mode (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enable</code></em>);</pre>
+<p>
+By setting the HTTP mode to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the message parsing will support HTTP
+messages in addition to the RTSP messages. It will also disable the
+automatic handling of setting up an HTTP tunnel.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enable</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable manual HTTP mode</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-connection-set-proxy"></a><h3>gst_rtsp_connection_set_proxy ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_connection_set_proxy (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *host</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> port</code></em>);</pre>
+<p>
+Set the proxy host and port.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>host</code></em> :</span></p></td>
+<td>the proxy host</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>the proxy port</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPWatch"></a><h3>GstRTSPWatch</h3>
+<pre class="programlisting">typedef struct _GstRTSPWatch GstRTSPWatch;</pre>
+<p>
+Opaque RTSP watch object that can be used for asynchronous RTSP
+operations.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPWatchFuncs"></a><h3>GstRTSPWatchFuncs</h3>
+<pre class="programlisting">typedef struct {
+ GstRTSPResult (*message_received) (GstRTSPWatch *watch, GstRTSPMessage *message,
+ gpointer user_data);
+ GstRTSPResult (*message_sent) (GstRTSPWatch *watch, guint id,
+ gpointer user_data);
+ GstRTSPResult (*closed) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*error) (GstRTSPWatch *watch, GstRTSPResult result,
+ gpointer user_data);
+ GstRTSPStatusCode (*tunnel_start) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*tunnel_complete) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*error_full) (GstRTSPWatch *watch, GstRTSPResult result,
+ GstRTSPMessage *message, guint id,
+ gpointer user_data);
+ GstRTSPResult (*tunnel_lost) (GstRTSPWatch *watch, gpointer user_data);
+} GstRTSPWatchFuncs;
+</pre>
+<p>
+Callback functions from a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.message-received"></a>message_received</code></em> ()</span></p></td>
+<td>callback when a message was received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.message-sent"></a>message_sent</code></em> ()</span></p></td>
+<td>callback when a message was sent</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.closed"></a>closed</code></em> ()</span></p></td>
+<td>callback when the connection is closed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.error"></a>error</code></em> ()</span></p></td>
+<td>callback when an error occured</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.tunnel-start"></a>tunnel_start</code></em> ()</span></p></td>
+<td>a client started a tunneled connection. The tunnelid of the
+connection must be saved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.tunnel-complete"></a>tunnel_complete</code></em> ()</span></p></td>
+<td>a client finished a tunneled connection. In this callback
+you usually pair the tunnelid of this connection with the saved one using
+<a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel" title="gst_rtsp_connection_do_tunnel ()"><code class="function">gst_rtsp_connection_do_tunnel()</code></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.error-full"></a>error_full</code></em> ()</span></p></td>
+<td>callback when an error occured with more information than
+the <em class="parameter"><code>error</code></em> callback. Since 0.10.25</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstRTSPWatchFuncs.tunnel-lost"></a>tunnel_lost</code></em> ()</span></p></td>
+<td>callback when the post connection of a tunnel is closed.
+Since 0.10.29</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-new"></a><h3>gst_rtsp_watch_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="returnvalue">GstRTSPWatch</span></a> * gst_rtsp_watch_new (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a> *conn</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs" title="GstRTSPWatchFuncs"><span class="type">GstRTSPWatchFuncs</span></a> *funcs</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
+<p>
+Create a watch object for <em class="parameter"><code>conn</code></em>. The functions provided in <em class="parameter"><code>funcs</code></em> will be
+called with <em class="parameter"><code>user_data</code></em> when activity happened on the watch.
+</p>
+<p>
+The new watch is usually created so that it can be attached to a
+maincontext with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-attach" title="gst_rtsp_watch_attach ()"><code class="function">gst_rtsp_watch_attach()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>conn</code></em> must exist for the entire lifetime of the watch.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>conn</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection" title="GstRTSPConnection"><span class="type">GstRTSPConnection</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>funcs</code></em> :</span></p></td>
+<td>watch functions</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data to pass to <em class="parameter"><code>funcs</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>notify when <em class="parameter"><code>user_data</code></em> is not referenced anymore</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> that can be used for asynchronous RTSP
+communication. Free with <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-unref" title="gst_rtsp_watch_unref ()"><code class="function">gst_rtsp_watch_unref()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-unref"></a><h3>gst_rtsp_watch_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_watch_unref (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>);</pre>
+<p>
+Decreases the reference count of <em class="parameter"><code>watch</code></em> by one. If the resulting reference
+count is zero the watch and associated memory will be destroyed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-attach"></a><h3>gst_rtsp_watch_attach ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtsp_watch_attach (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><span class="type">GMainContext</span></a> *context</code></em>);</pre>
+<p>
+Adds a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> to a context so that it will be executed within that context.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em> :</span></p></td>
+<td>a GMainContext (if NULL, the default context will be used)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the ID (greater than 0) for the watch within the GMainContext.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-reset"></a><h3>gst_rtsp_watch_reset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_watch_reset (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>);</pre>
+<p>
+Reset <em class="parameter"><code>watch</code></em>, this is usually called after <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel" title="gst_rtsp_connection_do_tunnel ()"><code class="function">gst_rtsp_connection_do_tunnel()</code></a>
+when the file descriptors of the connection might have changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-queue-message"></a><h3>gst_rtsp_watch_queue_message ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtsp_watch_queue_message (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">gst_rtsp_watch_queue_message</code> is deprecated and should not be used in newly-written code. Use <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-send-message" title="gst_rtsp_watch_send_message ()"><code class="function">gst_rtsp_watch_send_message()</code></a></p>
+</div>
+<p>
+Queue a <em class="parameter"><code>message</code></em> for transmission in <em class="parameter"><code>watch</code></em>. The contents of this
+message will be serialized and transmitted when the connection of the
+<em class="parameter"><code>watch</code></em> becomes writable.
+</p>
+<p>
+The return value of this function will be used as the id argument in the
+message_sent callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>an id.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-queue-data"></a><h3>gst_rtsp_watch_queue_data ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_rtsp_watch_queue_data (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">gst_rtsp_watch_queue_data</code> is deprecated and should not be used in newly-written code. Use <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-write-data" title="gst_rtsp_watch_write_data ()"><code class="function">gst_rtsp_watch_write_data()</code></a></p>
+</div>
+<p>
+Queue <em class="parameter"><code>data</code></em> for transmission in <em class="parameter"><code>watch</code></em>. It will be transmitted when the
+connection of the <em class="parameter"><code>watch</code></em> becomes writable.
+</p>
+<p>
+This function will take ownership of <em class="parameter"><code>data</code></em> and <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> it after use.
+</p>
+<p>
+The return value of this function will be used as the id argument in the
+message_sent callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>an id.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-send-message"></a><h3>gst_rtsp_watch_send_message ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_watch_send_message (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *id</code></em>);</pre>
+<p>
+Send a <em class="parameter"><code>message</code></em> using the connection of the <em class="parameter"><code>watch</code></em>. If it cannot be sent
+immediately, it will be queued for transmission in <em class="parameter"><code>watch</code></em>. The contents of
+<em class="parameter"><code>message</code></em> will then be serialized and transmitted when the connection of the
+<em class="parameter"><code>watch</code></em> becomes writable. In case the <em class="parameter"><code>message</code></em> is queued, the ID returned in
+<em class="parameter"><code>id</code></em> will be non-zero and used as the ID argument in the message_sent
+callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>location for a message ID or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-watch-write-data"></a><h3>gst_rtsp_watch_write_data ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_watch_write_data (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a> *watch</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *id</code></em>);</pre>
+<p>
+Write <em class="parameter"><code>data</code></em> using the connection of the <em class="parameter"><code>watch</code></em>. If it cannot be sent
+immediately, it will be queued for transmission in <em class="parameter"><code>watch</code></em>. The contents of
+<em class="parameter"><code>message</code></em> will then be serialized and transmitted when the connection of the
+<em class="parameter"><code>watch</code></em> becomes writable. In case the <em class="parameter"><code>message</code></em> is queued, the ID returned in
+<em class="parameter"><code>id</code></em> will be non-zero and used as the ID argument in the message_sent
+callback.
+</p>
+<p>
+This function will take ownership of <em class="parameter"><code>data</code></em> and <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> it after use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>watch</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch" title="GstRTSPWatch"><span class="type">GstRTSPWatch</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>location for a message ID or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspconnection.see-also"></a><h2>See Also</h2>
+gstrtspurl
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspdefs.html b/docs/libs/html/gst-plugins-base-libs-gstrtspdefs.html
new file mode 100644
index 0000000..0b78628
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspdefs.html
@@ -0,0 +1,738 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspdefs</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspconnection.html" title="gstrtspconnection">
+<link rel="next" href="gst-plugins-base-libs-gstrtspextension.html" title="gstrtspextension">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspconnection.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspextension.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspdefs.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspdefs.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspdefs"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspdefs.top_of_page"></a>gstrtspdefs</span></h2>
+<p>gstrtspdefs — common RTSP defines</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspdefs.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspdefs.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-CHECK:CAPS" title="GST_RTSP_CHECK()">GST_RTSP_CHECK</a> (stmt,
+ label)
+#define <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-MAX:CAPS" title="GST_RTSP_AUTH_MAX">GST_RTSP_AUTH_MAX</a>
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent" title="enum GstRTSPEvent">GstRTSPEvent</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult">GstRTSPResult</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPFamily" title="enum GstRTSPFamily">GstRTSPFamily</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPState" title="enum GstRTSPState">GstRTSPState</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion">GstRTSPVersion</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod">GstRTSPMethod</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod" title="enum GstRTSPAuthMethod">GstRTSPAuthMethod</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField">GstRTSPHeaderField</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode">GstRTSPStatusCode</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-strresult" title="gst_rtsp_strresult ()">gst_rtsp_strresult</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a> result</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-method-as-text" title="gst_rtsp_method_as_text ()">gst_rtsp_method_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-version-as-text" title="gst_rtsp_version_as_text ()">gst_rtsp_version_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> version</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-as-text" title="gst_rtsp_header_as_text ()">gst_rtsp_header_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-allow-multiple" title="gst_rtsp_header_allow_multiple ()">gst_rtsp_header_allow_multiple</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-status-as-text" title="gst_rtsp_status_as_text ()">gst_rtsp_status_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-options-as-text" title="gst_rtsp_options_as_text ()">gst_rtsp_options_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> options</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="returnvalue">GstRTSPHeaderField</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-header-field" title="gst_rtsp_find_header_field ()">gst_rtsp_find_header_field</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *header</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="returnvalue">GstRTSPMethod</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-method" title="gst_rtsp_find_method ()">gst_rtsp_find_method</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *method</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspdefs.description"></a><h2>Description</h2>
+<p>
+Provides common defines for the RTSP library.
+
+Last reviewed on 2007-07-24 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspdefs.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-RTSP-CHECK:CAPS"></a><h3>GST_RTSP_CHECK()</h3>
+<pre class="programlisting">#define GST_RTSP_CHECK(stmt, label)</pre>
+<p>
+Macro that checks the return value of <em class="parameter"><code>stmt</code></em> and jumps to <em class="parameter"><code>label</code></em> when it does
+not equal <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stmt</code></em> :</span></p></td>
+<td>a statement</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>label</code></em> :</span></p></td>
+<td>a label</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RTSP-AUTH-MAX:CAPS"></a><h3>GST_RTSP_AUTH_MAX</h3>
+<pre class="programlisting">#define GST_RTSP_AUTH_MAX GST_RTSP_AUTH_DIGEST
+</pre>
+<p>
+Strongest available authentication method
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPEvent"></a><h3>enum GstRTSPEvent</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_EV_READ = (1 &lt;&lt; 0),
+ GST_RTSP_EV_WRITE = (1 &lt;&lt; 1)
+} GstRTSPEvent;
+</pre>
+<p>
+The possible events for the connection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-EV-READ:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EV_READ</code></span></p></td>
+<td>connection is readable
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EV-WRITE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EV_WRITE</code></span></p></td>
+<td>connection is writable
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPResult"></a><h3>enum GstRTSPResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_OK = 0,
+ /* errors */
+ GST_RTSP_ERROR = -1,
+ GST_RTSP_EINVAL = -2,
+ GST_RTSP_EINTR = -3,
+ GST_RTSP_ENOMEM = -4,
+ GST_RTSP_ERESOLV = -5,
+ GST_RTSP_ENOTIMPL = -6,
+ GST_RTSP_ESYS = -7,
+ GST_RTSP_EPARSE = -8,
+ GST_RTSP_EWSASTART = -9,
+ GST_RTSP_EWSAVERSION = -10,
+ GST_RTSP_EEOF = -11,
+ GST_RTSP_ENET = -12,
+ GST_RTSP_ENOTIP = -13,
+ GST_RTSP_ETIMEOUT = -14,
+ GST_RTSP_ETGET = -15,
+ GST_RTSP_ETPOST = -16,
+
+ GST_RTSP_ELAST = -17
+} GstRTSPResult;
+</pre>
+<p>
+Result codes from the RTSP functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-OK:CAPS"></a><span class="term"><code class="literal">GST_RTSP_OK</code></span></p></td>
+<td>no error
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ERROR:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ERROR</code></span></p></td>
+<td>some unspecified error occured
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EINVAL:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EINVAL</code></span></p></td>
+<td>invalid arguments were provided to a function
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EINTR:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EINTR</code></span></p></td>
+<td>an operation was canceled
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ENOMEM:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ENOMEM</code></span></p></td>
+<td>no memory was available for the operation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ERESOLV:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ERESOLV</code></span></p></td>
+<td>a host resolve error occured
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ENOTIMPL:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ENOTIMPL</code></span></p></td>
+<td>function not implemented
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ESYS:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ESYS</code></span></p></td>
+<td>a system error occured, errno contains more details
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EPARSE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EPARSE</code></span></p></td>
+<td>a persing error occured
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EWSASTART:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EWSASTART</code></span></p></td>
+<td>windows networking could not start
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EWSAVERSION:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EWSAVERSION</code></span></p></td>
+<td>windows networking stack has wrong version
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-EEOF:CAPS"></a><span class="term"><code class="literal">GST_RTSP_EEOF</code></span></p></td>
+<td>end-of-file was reached
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ENET:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ENET</code></span></p></td>
+<td>a network problem occured, h_errno contains more details
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ENOTIP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ENOTIP</code></span></p></td>
+<td>the host is not an IP host
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ETIMEOUT:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ETIMEOUT</code></span></p></td>
+<td>a timeout occured
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ETGET:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ETGET</code></span></p></td>
+<td>the tunnel GET request has been performed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ETPOST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ETPOST</code></span></p></td>
+<td>the tunnel POST request has been performed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ELAST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ELAST</code></span></p></td>
+<td>last error
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPFamily"></a><h3>enum GstRTSPFamily</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_FAM_NONE,
+ GST_RTSP_FAM_INET,
+ GST_RTSP_FAM_INET6
+} GstRTSPFamily;
+</pre>
+<p>
+The possible network families.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-FAM-NONE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_FAM_NONE</code></span></p></td>
+<td>unknown network family
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-FAM-INET:CAPS"></a><span class="term"><code class="literal">GST_RTSP_FAM_INET</code></span></p></td>
+<td>internet
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-FAM-INET6:CAPS"></a><span class="term"><code class="literal">GST_RTSP_FAM_INET6</code></span></p></td>
+<td>internet V6
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPState"></a><h3>enum GstRTSPState</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_STATE_INVALID,
+ GST_RTSP_STATE_INIT,
+ GST_RTSP_STATE_READY,
+ GST_RTSP_STATE_SEEKING,
+ GST_RTSP_STATE_PLAYING,
+ GST_RTSP_STATE_RECORDING
+} GstRTSPState;
+</pre>
+<p>
+The different RTSP states.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-STATE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_INVALID</code></span></p></td>
+<td>invalid state
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-STATE-INIT:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_INIT</code></span></p></td>
+<td>initializing
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-STATE-READY:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_READY</code></span></p></td>
+<td>ready for operation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-STATE-SEEKING:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_SEEKING</code></span></p></td>
+<td>seeking in progress
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-STATE-PLAYING:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_PLAYING</code></span></p></td>
+<td>playing
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-STATE-RECORDING:CAPS"></a><span class="term"><code class="literal">GST_RTSP_STATE_RECORDING</code></span></p></td>
+<td>recording
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPVersion"></a><h3>enum GstRTSPVersion</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_VERSION_INVALID = 0x00,
+ GST_RTSP_VERSION_1_0 = 0x10,
+ GST_RTSP_VERSION_1_1 = 0x11
+} GstRTSPVersion;
+</pre>
+<p>
+The supported RTSP versions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-VERSION-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTSP_VERSION_INVALID</code></span></p></td>
+<td>unknown/invalid version
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-VERSION-1-0:CAPS"></a><span class="term"><code class="literal">GST_RTSP_VERSION_1_0</code></span></p></td>
+<td>version 1.0
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-VERSION-1-1:CAPS"></a><span class="term"><code class="literal">GST_RTSP_VERSION_1_1</code></span></p></td>
+<td>version 1.1. Since 0.10.25
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPMethod"></a><h3>enum GstRTSPMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_INVALID = 0,
+ GST_RTSP_DESCRIBE = (1 &lt;&lt; 0),
+ GST_RTSP_ANNOUNCE = (1 &lt;&lt; 1),
+ GST_RTSP_GET_PARAMETER = (1 &lt;&lt; 2),
+ GST_RTSP_OPTIONS = (1 &lt;&lt; 3),
+ GST_RTSP_PAUSE = (1 &lt;&lt; 4),
+ GST_RTSP_PLAY = (1 &lt;&lt; 5),
+ GST_RTSP_RECORD = (1 &lt;&lt; 6),
+ GST_RTSP_REDIRECT = (1 &lt;&lt; 7),
+ GST_RTSP_SETUP = (1 &lt;&lt; 8),
+ GST_RTSP_SET_PARAMETER = (1 &lt;&lt; 9),
+ GST_RTSP_TEARDOWN = (1 &lt;&lt; 10),
+ GST_RTSP_GET = (1 &lt;&lt; 11),
+ GST_RTSP_POST = (1 &lt;&lt; 12)
+} GstRTSPMethod;
+</pre>
+<p>
+The different supported RTSP methods.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTSP_INVALID</code></span></p></td>
+<td>invalid method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-DESCRIBE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_DESCRIBE</code></span></p></td>
+<td>the DESCRIBE method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-ANNOUNCE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_ANNOUNCE</code></span></p></td>
+<td>the ANNOUNCE method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-GET-PARAMETER:CAPS"></a><span class="term"><code class="literal">GST_RTSP_GET_PARAMETER</code></span></p></td>
+<td>the GET_PARAMETER method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-OPTIONS:CAPS"></a><span class="term"><code class="literal">GST_RTSP_OPTIONS</code></span></p></td>
+<td>the OPTIONS method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-PAUSE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_PAUSE</code></span></p></td>
+<td>the PAUSE method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-PLAY:CAPS"></a><span class="term"><code class="literal">GST_RTSP_PLAY</code></span></p></td>
+<td>the PLAY method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-RECORD:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RECORD</code></span></p></td>
+<td>the RECORD method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-REDIRECT:CAPS"></a><span class="term"><code class="literal">GST_RTSP_REDIRECT</code></span></p></td>
+<td>the REDIRECT method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-SETUP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_SETUP</code></span></p></td>
+<td>the SETUP method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-SET-PARAMETER:CAPS"></a><span class="term"><code class="literal">GST_RTSP_SET_PARAMETER</code></span></p></td>
+<td>the SET_PARAMETER method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-TEARDOWN:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TEARDOWN</code></span></p></td>
+<td>the TEARDOWN method
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-GET:CAPS"></a><span class="term"><code class="literal">GST_RTSP_GET</code></span></p></td>
+<td>the GET method (HTTP). Since 0.10.25
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-POST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_POST</code></span></p></td>
+<td>the POST method (HTTP). Since 0.10.25
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPAuthMethod"></a><h3>enum GstRTSPAuthMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_AUTH_NONE = 0x00,
+ GST_RTSP_AUTH_BASIC = 0x01,
+ GST_RTSP_AUTH_DIGEST = 0x02
+} GstRTSPAuthMethod;
+</pre>
+<p>
+Authentication methods, ordered by strength
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-AUTH-NONE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_AUTH_NONE</code></span></p></td>
+<td>no authentication
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-AUTH-BASIC:CAPS"></a><span class="term"><code class="literal">GST_RTSP_AUTH_BASIC</code></span></p></td>
+<td>basic authentication
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-AUTH-DIGEST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_AUTH_DIGEST</code></span></p></td>
+<td>digest authentication
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPHeaderField"></a><h3>enum GstRTSPHeaderField</h3>
+<pre class="programlisting">typedef enum {
+} GstRTSPHeaderField;
+</pre>
+<p>
+Enumeration of rtsp header fields.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPStatusCode"></a><h3>enum GstRTSPStatusCode</h3>
+<pre class="programlisting">typedef enum {
+} GstRTSPStatusCode;
+</pre>
+<p>
+Enumeration of rtsp status codes.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-strresult"></a><h3>gst_rtsp_strresult ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_strresult (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a> result</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>result</code></em> in a human readable string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>result</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated string. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-method-as-text"></a><h3>gst_rtsp_method_as_text ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_method_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>method</code></em> to a string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string representation of <em class="parameter"><code>method</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-version-as-text"></a><h3>gst_rtsp_version_as_text ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_version_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> version</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>version</code></em> to a string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string representation of <em class="parameter"><code>version</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-header-as-text"></a><h3>gst_rtsp_header_as_text ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_header_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>field</code></em> to a string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string representation of <em class="parameter"><code>field</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-header-allow-multiple"></a><h3>gst_rtsp_header_allow_multiple ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_rtsp_header_allow_multiple (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>);</pre>
+<p>
+Check whether <em class="parameter"><code>field</code></em> may appear multiple times in a message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if multiple headers are allowed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-status-as-text"></a><h3>gst_rtsp_status_as_text ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_status_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>code</code></em> to a string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string representation of <em class="parameter"><code>code</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-options-as-text"></a><h3>gst_rtsp_options_as_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_options_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> options</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>options</code></em> to a string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>options</code></em> :</span></p></td>
+<td>one or more <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new string of <em class="parameter"><code>options</code></em>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-find-header-field"></a><h3>gst_rtsp_find_header_field ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="returnvalue">GstRTSPHeaderField</span></a> gst_rtsp_find_header_field (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *header</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>header</code></em> to a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>a header string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> for <em class="parameter"><code>header</code></em> or <span class="type">GST_RTSP_HDR_INVALID</span> if the
+header field is unknown.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-find-method"></a><h3>gst_rtsp_find_method ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="returnvalue">GstRTSPMethod</span></a> gst_rtsp_find_method (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *method</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>method</code></em> to a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>a method</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> for <em class="parameter"><code>method</code></em> or <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-INVALID:CAPS"><span class="type">GST_RTSP_INVALID</span></a> if the
+method is unknown.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspdefs.see-also"></a><h2>See Also</h2>
+gstrtspurl, gstrtspconnection
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspextension.html b/docs/libs/html/gst-plugins-base-libs-gstrtspextension.html
new file mode 100644
index 0000000..57a0517
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspextension.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspextension</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspdefs.html" title="gstrtspdefs">
+<link rel="next" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspdefs.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspmessage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspextension.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspextension.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspextension"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspextension.top_of_page"></a>gstrtspextension</span></h2>
+<p>gstrtspextension — Interface for extending RTSP protocols</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspextension.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspextension.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtension" title="GstRTSPExtension">GstRTSPExtension</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtensionInterface" title="struct GstRTSPExtensionInterface">GstRTSPExtensionInterface</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspextension.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id434543"></a><p>
+ This interface is implemented e.g. by the Windows Media Streaming RTSP
+ exentension (rtspwms) and the RealMedia RTSP extension (rtspreal).
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2007-07-25 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspextension.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTSPExtension"></a><h3>GstRTSPExtension</h3>
+<pre class="programlisting">typedef struct _GstRTSPExtension GstRTSPExtension;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPExtensionInterface"></a><h3>struct GstRTSPExtensionInterface</h3>
+<pre class="programlisting">struct GstRTSPExtensionInterface {
+ GTypeInterface parent;
+
+ /* vfunctions */
+ gboolean (*detect_server) (GstRTSPExtension *ext, GstRTSPMessage *resp);
+
+ GstRTSPResult (*before_send) (GstRTSPExtension *ext, GstRTSPMessage *req);
+ GstRTSPResult (*after_send) (GstRTSPExtension *ext, GstRTSPMessage *req, GstRTSPMessage *resp);
+
+ GstRTSPResult (*parse_sdp) (GstRTSPExtension *ext, GstSDPMessage *sdp, GstStructure *s);
+ GstRTSPResult (*setup_media) (GstRTSPExtension *ext, GstSDPMedia *media);
+
+ gboolean (*configure_stream) (GstRTSPExtension *ext, GstCaps *caps);
+
+ GstRTSPResult (*get_transports) (GstRTSPExtension *ext, GstRTSPLowerTrans protocols, gchar **transport);
+
+ GstRTSPResult (*stream_select) (GstRTSPExtension *ext, GstRTSPUrl *url);
+
+ /* signals */
+ GstRTSPResult (*send) (GstRTSPExtension *ext, GstRTSPMessage *req, GstRTSPMessage *resp);
+
+ /* ABI: more vfunctions added later */
+ GstRTSPResult (*receive_request) (GstRTSPExtension *ext, GstRTSPMessage *req);
+};
+</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspmessage.html b/docs/libs/html/gst-plugins-base-libs-gstrtspmessage.html
new file mode 100644
index 0000000..3c814a7
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspmessage.html
@@ -0,0 +1,988 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspmessage</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspextension.html" title="gstrtspextension">
+<link rel="next" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspextension.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtsprange.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspmessage.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspmessage.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspmessage"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspmessage.top_of_page"></a>gstrtspmessage</span></h2>
+<p>gstrtspmessage — RTSP messages</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspmessage.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspmessage.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType" title="enum GstRTSPMsgType">GstRTSPMsgType</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage">GstRTSPMessage</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new" title="gst_rtsp_message_new ()">gst_rtsp_message_new</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init" title="gst_rtsp_message_init ()">gst_rtsp_message_init</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset" title="gst_rtsp_message_unset ()">gst_rtsp_message_unset</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()">gst_rtsp_message_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType" title="enum GstRTSPMsgType"><span class="returnvalue">GstRTSPMsgType</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-type" title="gst_rtsp_message_get_type ()">gst_rtsp_message_get_type</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-request" title="gst_rtsp_message_new_request ()">gst_rtsp_message_new_request</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-request" title="gst_rtsp_message_init_request ()">gst_rtsp_message_init_request</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-request" title="gst_rtsp_message_parse_request ()">gst_rtsp_message_parse_request</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> *method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **uri</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> *version</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-response" title="gst_rtsp_message_new_response ()">gst_rtsp_message_new_response</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *request</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-response" title="gst_rtsp_message_init_response ()">gst_rtsp_message_init_response</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *request</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-response" title="gst_rtsp_message_parse_response ()">gst_rtsp_message_parse_response</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> *code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **reason</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> *version</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-data" title="gst_rtsp_message_new_data ()">gst_rtsp_message_new_data</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> channel</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-data" title="gst_rtsp_message_init_data ()">gst_rtsp_message_init_data</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> channel</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-data" title="gst_rtsp_message_parse_data ()">gst_rtsp_message_parse_data</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *channel</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-add-header" title="gst_rtsp_message_add_header ()">gst_rtsp_message_add_header</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-header" title="gst_rtsp_message_take_header ()">gst_rtsp_message_take_header</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-remove-header" title="gst_rtsp_message_remove_header ()">gst_rtsp_message_remove_header</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> indx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-header" title="gst_rtsp_message_get_header ()">gst_rtsp_message_get_header</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> indx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-append-headers" title="gst_rtsp_message_append_headers ()">gst_rtsp_message_append_headers</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</span></a> *str</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-set-body" title="gst_rtsp_message_set_body ()">gst_rtsp_message_set_body</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-body" title="gst_rtsp_message_take_body ()">gst_rtsp_message_take_body</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-body" title="gst_rtsp_message_get_body ()">gst_rtsp_message_get_body</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-steal-body" title="gst_rtsp_message_steal_body ()">gst_rtsp_message_steal_body</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-dump" title="gst_rtsp_message_dump ()">gst_rtsp_message_dump</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspmessage.description"></a><h2>Description</h2>
+<p>
+Provides methods for creating and parsing request, response and data messages.
+
+Last reviewed on 2007-07-25 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspmessage.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTSPMsgType"></a><h3>enum GstRTSPMsgType</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_MESSAGE_INVALID,
+ GST_RTSP_MESSAGE_REQUEST,
+ GST_RTSP_MESSAGE_RESPONSE,
+ GST_RTSP_MESSAGE_HTTP_REQUEST,
+ GST_RTSP_MESSAGE_HTTP_RESPONSE,
+ GST_RTSP_MESSAGE_DATA
+} GstRTSPMsgType;
+</pre>
+<p>
+The type of a message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_INVALID</code></span></p></td>
+<td>invalid message type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-REQUEST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_REQUEST</code></span></p></td>
+<td>RTSP request message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-RESPONSE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_RESPONSE</code></span></p></td>
+<td>RTSP response message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-HTTP-REQUEST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_HTTP_REQUEST</code></span></p></td>
+<td>HTTP request message. Since 0.10.25
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-HTTP-RESPONSE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_HTTP_RESPONSE</code></span></p></td>
+<td>HTTP response message. Since 0.10.25
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-MESSAGE-DATA:CAPS"></a><span class="term"><code class="literal">GST_RTSP_MESSAGE_DATA</code></span></p></td>
+<td>data message
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPMessage"></a><h3>struct GstRTSPMessage</h3>
+<pre class="programlisting">struct GstRTSPMessage {
+ GstRTSPMsgType type;
+
+ union {
+ struct {
+ GstRTSPMethod method;
+ gchar *uri;
+ GstRTSPVersion version;
+ } request;
+ struct {
+ GstRTSPStatusCode code;
+ gchar *reason;
+ GstRTSPVersion version;
+ } response;
+ struct {
+ guint8 channel;
+ } data;
+ } type_data;
+};
+</pre>
+<p>
+An RTSP message containing request, response or data messages. Depending on
+the <em class="parameter"><code>type</code></em>, the appropriate structure may be accessed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType" title="enum GstRTSPMsgType"><span class="type">GstRTSPMsgType</span></a> <em class="structfield"><code><a name="GstRTSPMessage.type"></a>type</code></em>;</span></p></td>
+<td>the message type</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-new"></a><h3>gst_rtsp_message_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_new (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>);</pre>
+<p>
+Create a new initialized <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>. Free with <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()"><code class="function">gst_rtsp_message_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a location for the new <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-init"></a><h3>gst_rtsp_message_init ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_init (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>msg</code></em>. This function is mostly used when <em class="parameter"><code>msg</code></em> is allocated on the
+stack. The reverse operation of this is <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset" title="gst_rtsp_message_unset ()"><code class="function">gst_rtsp_message_unset()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-unset"></a><h3>gst_rtsp_message_unset ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_unset (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Unset the contents of <em class="parameter"><code>msg</code></em> so that it becomes an uninitialized
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> again. This function is mostly used in combination with
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-request" title="gst_rtsp_message_init_request ()"><code class="function">gst_rtsp_message_init_request()</code></a>, <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-response" title="gst_rtsp_message_init_response ()"><code class="function">gst_rtsp_message_init_response()</code></a> and
+<a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-data" title="gst_rtsp_message_init_data ()"><code class="function">gst_rtsp_message_init_data()</code></a> on stack allocated <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> structures.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-free"></a><h3>gst_rtsp_message_free ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Free the memory used by <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-get-type"></a><h3>gst_rtsp_message_get_type ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType" title="enum GstRTSPMsgType"><span class="returnvalue">GstRTSPMsgType</span></a> gst_rtsp_message_get_type (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the message type of <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the message type.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-new-request"></a><h3>gst_rtsp_message_new_request ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_new_request (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<p>
+Create a new <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> with <em class="parameter"><code>method</code></em> and <em class="parameter"><code>uri</code></em> and store the result
+request message in <em class="parameter"><code>msg</code></em>. Free with <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()"><code class="function">gst_rtsp_message_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a location for the new <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>the request method to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the uri of the request</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-init-request"></a><h3>gst_rtsp_message_init_request ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_init_request (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>msg</code></em> as a request message with <em class="parameter"><code>method</code></em> and <em class="parameter"><code>uri</code></em>. To clear <em class="parameter"><code>msg</code></em>
+again, use <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset" title="gst_rtsp_message_unset ()"><code class="function">gst_rtsp_message_unset()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>the request method to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the uri of the request</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-parse-request"></a><h3>gst_rtsp_message_parse_request ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_parse_request (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod" title="enum GstRTSPMethod"><span class="type">GstRTSPMethod</span></a> *method</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **uri</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> *version</code></em>);</pre>
+<p>
+Parse the request message <em class="parameter"><code>msg</code></em> and store the values <em class="parameter"><code>method</code></em>, <em class="parameter"><code>uri</code></em> and
+<em class="parameter"><code>version</code></em>. The result locations can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if one is not interested in its
+value.
+</p>
+<p>
+<em class="parameter"><code>uri</code></em> remains valid for as long as <em class="parameter"><code>msg</code></em> is valid and unchanged.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>location to hold the method</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>location to hold the uri</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>location to hold the version</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-new-response"></a><h3>gst_rtsp_message_new_response ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_new_response (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *request</code></em>);</pre>
+<p>
+Create a new response <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> with <em class="parameter"><code>code</code></em> and <em class="parameter"><code>reason</code></em> and store the
+result message in <em class="parameter"><code>msg</code></em>. Free with <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()"><code class="function">gst_rtsp_message_free()</code></a>.
+</p>
+<p>
+When <em class="parameter"><code>reason</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, the default reason for <em class="parameter"><code>code</code></em> will be used.
+</p>
+<p>
+When <em class="parameter"><code>request</code></em> is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, the relevant headers will be copied to the new
+response message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a location for the new <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>the status code</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reason</code></em> :</span></p></td>
+<td>the status reason or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>request</code></em> :</span></p></td>
+<td>the request that triggered the response or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-init-response"></a><h3>gst_rtsp_message_init_response ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_init_response (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *reason</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *request</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>msg</code></em> with <em class="parameter"><code>code</code></em> and <em class="parameter"><code>reason</code></em>.
+</p>
+<p>
+When <em class="parameter"><code>reason</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, the default reason for <em class="parameter"><code>code</code></em> will be used.
+</p>
+<p>
+When <em class="parameter"><code>request</code></em> is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, the relevant headers will be copied to the new
+response message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>the status code</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reason</code></em> :</span></p></td>
+<td>the status reason or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>request</code></em> :</span></p></td>
+<td>the request that triggered the response or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-parse-response"></a><h3>gst_rtsp_message_parse_response ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_parse_response (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode" title="enum GstRTSPStatusCode"><span class="type">GstRTSPStatusCode</span></a> *code</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **reason</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion" title="enum GstRTSPVersion"><span class="type">GstRTSPVersion</span></a> *version</code></em>);</pre>
+<p>
+Parse the response message <em class="parameter"><code>msg</code></em> and store the values <em class="parameter"><code>code</code></em>, <em class="parameter"><code>reason</code></em> and
+<em class="parameter"><code>version</code></em>. The result locations can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if one is not interested in its
+value.
+</p>
+<p>
+<em class="parameter"><code>reason</code></em> remains valid for as long as <em class="parameter"><code>msg</code></em> is valid and unchanged.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>location to hold the status code</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reason</code></em> :</span></p></td>
+<td>location to hold the status reason</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>location to hold the version</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-new-data"></a><h3>gst_rtsp_message_new_data ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_new_data (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> **msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> channel</code></em>);</pre>
+<p>
+Create a new data <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> with <em class="parameter"><code>channel</code></em> and store the
+result message in <em class="parameter"><code>msg</code></em>. Free with <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free" title="gst_rtsp_message_free ()"><code class="function">gst_rtsp_message_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a location for the new <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>the channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-init-data"></a><h3>gst_rtsp_message_init_data ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_init_data (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> channel</code></em>);</pre>
+<p>
+Initialize a new data <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> for <em class="parameter"><code>channel</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>a channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-parse-data"></a><h3>gst_rtsp_message_parse_data ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_parse_data (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *channel</code></em>);</pre>
+<p>
+Parse the data message <em class="parameter"><code>msg</code></em> and store the channel in <em class="parameter"><code>channel</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>location to hold the channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-add-header"></a><h3>gst_rtsp_message_add_header ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_add_header (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Add a header with key <em class="parameter"><code>field</code></em> and <em class="parameter"><code>value</code></em> to <em class="parameter"><code>msg</code></em>. This function takes a copy
+of <em class="parameter"><code>value</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value of the header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-take-header"></a><h3>gst_rtsp_message_take_header ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_take_header (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Add a header with key <em class="parameter"><code>field</code></em> and <em class="parameter"><code>value</code></em> to <em class="parameter"><code>msg</code></em>. This function takes
+ownership of <em class="parameter"><code>value</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value of the header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-remove-header"></a><h3>gst_rtsp_message_remove_header ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_remove_header (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> indx</code></em>);</pre>
+<p>
+Remove the <em class="parameter"><code>indx</code></em> header with key <em class="parameter"><code>field</code></em> from <em class="parameter"><code>msg</code></em>. If <em class="parameter"><code>indx</code></em> equals -1, all
+headers will be removed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>indx</code></em> :</span></p></td>
+<td>the index of the header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-get-header"></a><h3>gst_rtsp_message_get_header ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_get_header (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> indx</code></em>);</pre>
+<p>
+Get the <em class="parameter"><code>indx</code></em> header value with key <em class="parameter"><code>field</code></em> from <em class="parameter"><code>msg</code></em>. The result in <em class="parameter"><code>value</code></em>
+stays valid as long as it remains present in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField" title="enum GstRTSPHeaderField"><span class="type">GstRTSPHeaderField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>pointer to hold the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>indx</code></em> :</span></p></td>
+<td>the index of the header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> when <em class="parameter"><code>field</code></em> was found, <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOTIMPL:CAPS"><span class="type">GST_RTSP_ENOTIMPL</span></a> if the key
+was not found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-append-headers"></a><h3>gst_rtsp_message_append_headers ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_append_headers (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</span></a> *str</code></em>);</pre>
+<p>
+Append the currently configured headers in <em class="parameter"><code>msg</code></em> to the <a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</span></a> <em class="parameter"><code>str</code></em> suitable
+for transmission.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>a string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-set-body"></a><h3>gst_rtsp_message_set_body ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_set_body (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<p>
+Set the body of <em class="parameter"><code>msg</code></em> to a copy of <em class="parameter"><code>data</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-take-body"></a><h3>gst_rtsp_message_take_body ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_take_body (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<p>
+Set the body of <em class="parameter"><code>msg</code></em> to <em class="parameter"><code>data</code></em> and <em class="parameter"><code>size</code></em>. This method takes ownership of
+<em class="parameter"><code>data</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-get-body"></a><h3>gst_rtsp_message_get_body ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_get_body (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);</pre>
+<p>
+Get the body of <em class="parameter"><code>msg</code></em>. <em class="parameter"><code>data</code></em> remains valid for as long as <em class="parameter"><code>msg</code></em> is valid and
+unchanged.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>location for the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-steal-body"></a><h3>gst_rtsp_message_steal_body ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_steal_body (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *size</code></em>);</pre>
+<p>
+Take the body of <em class="parameter"><code>msg</code></em> and store it in <em class="parameter"><code>data</code></em> and <em class="parameter"><code>size</code></em>. After this method,
+the body and size of <em class="parameter"><code>msg</code></em> will be set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> and 0 respectively.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>location for the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>location for the size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-message-dump"></a><h3>gst_rtsp_message_dump ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_message_dump (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Dump the contents of <em class="parameter"><code>msg</code></em> to stdout.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage" title="struct GstRTSPMessage"><span class="type">GstRTSPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspmessage.see-also"></a><h2>See Also</h2>
+gstrtspconnection
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtsprange.html b/docs/libs/html/gst-plugins-base-libs-gstrtsprange.html
new file mode 100644
index 0000000..fa6ad22
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtsprange.html
@@ -0,0 +1,268 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtsprange</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspmessage.html" title="gstrtspmessage">
+<link rel="next" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspmessage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtsptransport.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtsprange.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtsprange.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtsprange"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtsprange.top_of_page"></a>gstrtsprange</span></h2>
+<p>gstrtsprange — dealing with time ranges</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtsprange.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtsrange.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPRangeUnit" title="enum GstRTSPRangeUnit">GstRTSPRangeUnit</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange">GstRTSPTimeRange</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime" title="struct GstRTSPTime">GstRTSPTime</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeType" title="enum GstRTSPTimeType">GstRTSPTimeType</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-parse" title="gst_rtsp_range_parse ()">gst_rtsp_range_parse</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *rangestr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> **range</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-to-string" title="gst_rtsp_range_to_string ()">gst_rtsp_range_to_string</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> *range</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-free" title="gst_rtsp_range_free ()">gst_rtsp_range_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> *range</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtsprange.description"></a><h2>Description</h2>
+<p>
+Provides helper functions to deal with time ranges.
+
+Last reviewed on 2007-07-25 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtsprange.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTSPRangeUnit"></a><h3>enum GstRTSPRangeUnit</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_RANGE_SMPTE,
+ GST_RTSP_RANGE_SMPTE_30_DROP,
+ GST_RTSP_RANGE_SMPTE_25,
+ GST_RTSP_RANGE_NPT,
+ GST_RTSP_RANGE_CLOCK
+} GstRTSPRangeUnit;
+</pre>
+<p>
+Different possible time range units.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-RANGE-SMPTE:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RANGE_SMPTE</code></span></p></td>
+<td>SMPTE timecode
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-RANGE-SMPTE-30-DROP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RANGE_SMPTE_30_DROP</code></span></p></td>
+<td>29.97 frames per second
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-RANGE-SMPTE-25:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RANGE_SMPTE_25</code></span></p></td>
+<td>25 frames per second
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-RANGE-NPT:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RANGE_NPT</code></span></p></td>
+<td>Normal play time
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-RANGE-CLOCK:CAPS"></a><span class="term"><code class="literal">GST_RTSP_RANGE_CLOCK</code></span></p></td>
+<td>Absolute time expressed as ISO 8601 timestamps
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPTimeRange"></a><h3>struct GstRTSPTimeRange</h3>
+<pre class="programlisting">struct GstRTSPTimeRange {
+ GstRTSPRangeUnit unit;
+
+ GstRTSPTime min;
+ GstRTSPTime max;
+};
+</pre>
+<p>
+A time range.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPRangeUnit" title="enum GstRTSPRangeUnit"><span class="type">GstRTSPRangeUnit</span></a> <em class="structfield"><code><a name="GstRTSPTimeRange.unit"></a>unit</code></em>;</span></p></td>
+<td>the time units used</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime" title="struct GstRTSPTime"><span class="type">GstRTSPTime</span></a> <em class="structfield"><code><a name="GstRTSPTimeRange.min"></a>min</code></em>;</span></p></td>
+<td>the minimum interval</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime" title="struct GstRTSPTime"><span class="type">GstRTSPTime</span></a> <em class="structfield"><code><a name="GstRTSPTimeRange.max"></a>max</code></em>;</span></p></td>
+<td>the maximum interval</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPTime"></a><h3>struct GstRTSPTime</h3>
+<pre class="programlisting">struct GstRTSPTime {
+ GstRTSPTimeType type;
+ gdouble seconds;
+};
+</pre>
+<p>
+A time indication.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeType" title="enum GstRTSPTimeType"><span class="type">GstRTSPTimeType</span></a> <em class="structfield"><code><a name="GstRTSPTime.type"></a>type</code></em>;</span></p></td>
+<td>the time of the time</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GstRTSPTime.seconds"></a>seconds</code></em>;</span></p></td>
+<td>seconds when <em class="parameter"><code>type</code></em> is GST_RTSP_TIME_SECONDS</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPTimeType"></a><h3>enum GstRTSPTimeType</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_TIME_SECONDS,
+ GST_RTSP_TIME_NOW,
+ GST_RTSP_TIME_END
+} GstRTSPTimeType;
+</pre>
+<p>
+Possible time types.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-TIME-SECONDS:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TIME_SECONDS</code></span></p></td>
+<td>seconds
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-TIME-NOW:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TIME_NOW</code></span></p></td>
+<td>now
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-TIME-END:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TIME_END</code></span></p></td>
+<td>end
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-range-parse"></a><h3>gst_rtsp_range_parse ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_range_parse (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *rangestr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> **range</code></em>);</pre>
+<p>
+Parse <em class="parameter"><code>rangestr</code></em> to a <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rangestr</code></em> :</span></p></td>
+<td>a range string to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>location to hold the <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-range-to-string"></a><h3>gst_rtsp_range_to_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_range_to_string (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> *range</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>range</code></em> into a string representation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The string representation of <em class="parameter"><code>range</code></em>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-range-free"></a><h3>gst_rtsp_range_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_range_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a> *range</code></em>);</pre>
+<p>
+Free the memory alocated by <em class="parameter"><code>range</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange" title="struct GstRTSPTimeRange"><span class="type">GstRTSPTimeRange</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtsptransport.html b/docs/libs/html/gst-plugins-base-libs-gstrtsptransport.html
new file mode 100644
index 0000000..620f399
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtsptransport.html
@@ -0,0 +1,498 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtsptransport</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtsprange.html" title="gstrtsprange">
+<link rel="next" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtsprange.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspurl.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtsptransport.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtsptransport.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtsptransport"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtsptransport.top_of_page"></a>gstrtsptransport</span></h2>
+<p>gstrtsptransport — dealing with RTSP transports</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtsptransport.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtsptransport.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode">GstRTSPTransMode</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPProfile" title="enum GstRTSPProfile">GstRTSPProfile</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange">GstRTSPRange</a>;
+enum <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans" title="enum GstRTSPLowerTrans">GstRTSPLowerTrans</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport">GstRTSPTransport</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-new" title="gst_rtsp_transport_new ()">gst_rtsp_transport_new</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> **transport</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-init" title="gst_rtsp_transport_init ()">gst_rtsp_transport_init</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-parse" title="gst_rtsp_transport_parse ()">gst_rtsp_transport_parse</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *str</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-as-text" title="gst_rtsp_transport_as_text ()">gst_rtsp_transport_as_text</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-mime" title="gst_rtsp_transport_get_mime ()">gst_rtsp_transport_get_mime</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a> trans</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **mime</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-manager" title="gst_rtsp_transport_get_manager ()">gst_rtsp_transport_get_manager</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a> trans</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **manager</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> option</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-free" title="gst_rtsp_transport_free ()">gst_rtsp_transport_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtsptransport.description"></a><h2>Description</h2>
+<p>
+Provides helper functions to deal with RTSP transport strings.
+
+Last reviewed on 2007-07-25 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtsptransport.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRTSPTransMode"></a><h3>enum GstRTSPTransMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_TRANS_UNKNOWN = 0,
+ GST_RTSP_TRANS_RTP = (1 &lt;&lt; 0),
+ GST_RTSP_TRANS_RDT = (1 &lt;&lt; 1)
+} GstRTSPTransMode;
+</pre>
+<p>
+The transfer mode to use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-TRANS-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TRANS_UNKNOWN</code></span></p></td>
+<td>invalid tansport mode
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-TRANS-RTP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TRANS_RTP</code></span></p></td>
+<td>transfer RTP data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-TRANS-RDT:CAPS"></a><span class="term"><code class="literal">GST_RTSP_TRANS_RDT</code></span></p></td>
+<td>transfer RDT (RealMedia) data
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPProfile"></a><h3>enum GstRTSPProfile</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_PROFILE_UNKNOWN = 0,
+ GST_RTSP_PROFILE_AVP = (1 &lt;&lt; 0),
+ GST_RTSP_PROFILE_SAVP = (1 &lt;&lt; 1)
+} GstRTSPProfile;
+</pre>
+<p>
+The transfer profile to use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-PROFILE-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_RTSP_PROFILE_UNKNOWN</code></span></p></td>
+<td>invalid profile
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-PROFILE-AVP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_PROFILE_AVP</code></span></p></td>
+<td>the Audio/Visual profile
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-PROFILE-SAVP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_PROFILE_SAVP</code></span></p></td>
+<td>the secure Audio/Visual profile
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPRange"></a><h3>struct GstRTSPRange</h3>
+<pre class="programlisting">struct GstRTSPRange {
+ gint min;
+ gint max;
+};
+</pre>
+<p>
+A type to specify a range.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRTSPRange.min"></a>min</code></em>;</span></p></td>
+<td>minimum value of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstRTSPRange.max"></a>max</code></em>;</span></p></td>
+<td>maximum value of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPLowerTrans"></a><h3>enum GstRTSPLowerTrans</h3>
+<pre class="programlisting">typedef enum {
+ GST_RTSP_LOWER_TRANS_UNKNOWN = 0,
+ GST_RTSP_LOWER_TRANS_UDP = (1 &lt;&lt; 0),
+ GST_RTSP_LOWER_TRANS_UDP_MCAST = (1 &lt;&lt; 1),
+ GST_RTSP_LOWER_TRANS_TCP = (1 &lt;&lt; 2),
+ GST_RTSP_LOWER_TRANS_HTTP = (1 &lt;&lt; 4)
+} GstRTSPLowerTrans;
+</pre>
+<p>
+The different transport methods.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RTSP-LOWER-TRANS-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_RTSP_LOWER_TRANS_UNKNOWN</code></span></p></td>
+<td>invalid transport flag
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-LOWER-TRANS-UDP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_LOWER_TRANS_UDP</code></span></p></td>
+<td>stream data over UDP
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-LOWER-TRANS-UDP-MCAST:CAPS"></a><span class="term"><code class="literal">GST_RTSP_LOWER_TRANS_UDP_MCAST</code></span></p></td>
+<td>stream data over UDP multicast
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-LOWER-TRANS-TCP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_LOWER_TRANS_TCP</code></span></p></td>
+<td>stream data over TCP
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RTSP-LOWER-TRANS-HTTP:CAPS"></a><span class="term"><code class="literal">GST_RTSP_LOWER_TRANS_HTTP</code></span></p></td>
+<td>stream data tunneled over HTTP. Since: 0.10.23
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPTransport"></a><h3>struct GstRTSPTransport</h3>
+<pre class="programlisting">struct GstRTSPTransport {
+ GstRTSPTransMode trans;
+ GstRTSPProfile profile;
+ GstRTSPLowerTrans lower_transport;
+
+ gchar *destination;
+ gchar *source;
+ guint layers;
+ gboolean mode_play;
+ gboolean mode_record;
+ gboolean append;
+ GstRTSPRange interleaved;
+
+ /* multicast specific */
+ guint ttl;
+
+ /* UDP specific */
+ GstRTSPRange port;
+ GstRTSPRange client_port;
+ GstRTSPRange server_port;
+ /* RTP specific */
+ guint ssrc;
+};
+</pre>
+<p>
+A structure holding the RTSP transport values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a> <em class="structfield"><code><a name="GstRTSPTransport.trans"></a>trans</code></em>;</span></p></td>
+<td>the transport mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPProfile" title="enum GstRTSPProfile"><span class="type">GstRTSPProfile</span></a> <em class="structfield"><code><a name="GstRTSPTransport.profile"></a>profile</code></em>;</span></p></td>
+<td>the tansport profile</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans" title="enum GstRTSPLowerTrans"><span class="type">GstRTSPLowerTrans</span></a> <em class="structfield"><code><a name="GstRTSPTransport.lower-transport"></a>lower_transport</code></em>;</span></p></td>
+<td>the lower transport</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPTransport.destination"></a>destination</code></em>;</span></p></td>
+<td>the destination ip/hostname</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPTransport.source"></a>source</code></em>;</span></p></td>
+<td>the source ip/hostname</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTSPTransport.layers"></a>layers</code></em>;</span></p></td>
+<td>the number of layers</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstRTSPTransport.mode-play"></a>mode_play</code></em>;</span></p></td>
+<td>if play mode was selected</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstRTSPTransport.mode-record"></a>mode_record</code></em>;</span></p></td>
+<td>if record mode was selected</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GstRTSPTransport.append"></a>append</code></em>;</span></p></td>
+<td>is append mode was selected</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange"><span class="type">GstRTSPRange</span></a> <em class="structfield"><code><a name="GstRTSPTransport.interleaved"></a>interleaved</code></em>;</span></p></td>
+<td>the interleave range</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTSPTransport.ttl"></a>ttl</code></em>;</span></p></td>
+<td>the time to live for multicast UDP</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange"><span class="type">GstRTSPRange</span></a> <em class="structfield"><code><a name="GstRTSPTransport.port"></a>port</code></em>;</span></p></td>
+<td>the port pair for multicast sessions</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange"><span class="type">GstRTSPRange</span></a> <em class="structfield"><code><a name="GstRTSPTransport.client-port"></a>client_port</code></em>;</span></p></td>
+<td>the client port pair for receiving data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange" title="struct GstRTSPRange"><span class="type">GstRTSPRange</span></a> <em class="structfield"><code><a name="GstRTSPTransport.server-port"></a>server_port</code></em>;</span></p></td>
+<td>the server port pair for receiving data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstRTSPTransport.ssrc"></a>ssrc</code></em>;</span></p></td>
+<td>the ssrc that the sender/receiver will use</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-new"></a><h3>gst_rtsp_transport_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_new (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> **transport</code></em>);</pre>
+<p>
+Allocate a new initialized <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>. Use <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-free" title="gst_rtsp_transport_free ()"><code class="function">gst_rtsp_transport_free()</code></a>
+after usage.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transport</code></em> :</span></p></td>
+<td>location to hold the new <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-init"></a><h3>gst_rtsp_transport_init ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_init (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>transport</code></em> so that it can be used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transport</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-parse"></a><h3>gst_rtsp_transport_parse ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_parse (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *str</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);</pre>
+<p>
+Parse the RTSP transport string <em class="parameter"><code>str</code></em> into <em class="parameter"><code>transport</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>a transport string</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transport</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-as-text"></a><h3>gst_rtsp_transport_as_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_transport_as_text (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>transport</code></em> into a string that can be used to signal the transport in
+an RTSP SETUP response.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transport</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string describing the RTSP transport or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> when the transport
+is invalid.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-get-mime"></a><h3>gst_rtsp_transport_get_mime ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_get_mime (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a> trans</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **mime</code></em>);</pre>
+<p>
+Get the mime type of the transport mode <em class="parameter"><code>trans</code></em>. This mime type is typically
+used to generate <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> on buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mime</code></em> :</span></p></td>
+<td>location to hold the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-get-manager"></a><h3>gst_rtsp_transport_get_manager ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_get_manager (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a> trans</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **manager</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> option</code></em>);</pre>
+<p>
+Get the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> that can handle the buffers transported over <em class="parameter"><code>trans</code></em>.
+</p>
+<p>
+It is possible that there are several managers available, use <em class="parameter"><code>option</code></em> to
+selected one.
+</p>
+<p>
+<em class="parameter"><code>manager</code></em> will contain an element name or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> when no manager is
+needed/available for <em class="parameter"><code>trans</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode" title="enum GstRTSPTransMode"><span class="type">GstRTSPTransMode</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>manager</code></em> :</span></p></td>
+<td>location to hold the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>option</code></em> :</span></p></td>
+<td>option index.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-transport-free"></a><h3>gst_rtsp_transport_free ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_transport_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a> *transport</code></em>);</pre>
+<p>
+Free the memory used by <em class="parameter"><code>transport</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transport</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport" title="struct GstRTSPTransport"><span class="type">GstRTSPTransport</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstrtspurl.html b/docs/libs/html/gst-plugins-base-libs-gstrtspurl.html
new file mode 100644
index 0000000..9cc2dea
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstrtspurl.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstrtspurl</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-rtsp.html" title="RTSP Library">
+<link rel="prev" href="gst-plugins-base-libs-gstrtsptransport.html" title="gstrtsptransport">
+<link rel="next" href="gstreamer-sdp.html" title="SDP Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtsptransport.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-rtsp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-sdp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstrtspurl.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstrtspurl.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstrtspurl"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstrtspurl.top_of_page"></a>gstrtspurl</span></h2>
+<p>gstrtspurl — handling RTSP urls</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstrtspurl.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/rtsp/gstrtspurl.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GST-RTSP-DEFAULT-PORT:CAPS" title="GST_RTSP_DEFAULT_PORT">GST_RTSP_DEFAULT_PORT</a>
+struct <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl">GstRTSPUrl</a>;
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-parse" title="gst_rtsp_url_parse ()">gst_rtsp_url_parse</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *urlstr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> **url</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="returnvalue">GstRTSPUrl</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-copy" title="gst_rtsp_url_copy ()">gst_rtsp_url_copy</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free" title="gst_rtsp_url_free ()">gst_rtsp_url_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-request-uri" title="gst_rtsp_url_get_request_uri ()">gst_rtsp_url_get_request_uri</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-set-port" title="gst_rtsp_url_set_port ()">gst_rtsp_url_set_port</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-port" title="gst_rtsp_url_get_port ()">gst_rtsp_url_get_port</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-decode-path-components" title="gst_rtsp_url_decode_path_components ()">gst_rtsp_url_decode_path_components</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspurl.description"></a><h2>Description</h2>
+<p>
+Provides helper functions to handle RTSP urls.
+
+Last reviewed on 2007-07-25 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstrtspurl.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-RTSP-DEFAULT-PORT:CAPS"></a><h3>GST_RTSP_DEFAULT_PORT</h3>
+<pre class="programlisting">#define GST_RTSP_DEFAULT_PORT 554
+</pre>
+<p>
+The default RTSP port to connect to.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRTSPUrl"></a><h3>struct GstRTSPUrl</h3>
+<pre class="programlisting">struct GstRTSPUrl {
+ GstRTSPLowerTrans transports;
+ GstRTSPFamily family;
+ gchar *user;
+ gchar *passwd;
+ gchar *host;
+ guint16 port;
+ gchar *abspath;
+ gchar *query;
+};
+</pre>
+<p>
+This structure contains the result of a parsed RTSP URL
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans" title="enum GstRTSPLowerTrans"><span class="type">GstRTSPLowerTrans</span></a> <em class="structfield"><code><a name="GstRTSPUrl.transports"></a>transports</code></em>;</span></p></td>
+<td>the transports allowed</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPFamily" title="enum GstRTSPFamily"><span class="type">GstRTSPFamily</span></a> <em class="structfield"><code><a name="GstRTSPUrl.family"></a>family</code></em>;</span></p></td>
+<td>the family</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPUrl.user"></a>user</code></em>;</span></p></td>
+<td>the user</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPUrl.passwd"></a>passwd</code></em>;</span></p></td>
+<td>the password</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPUrl.host"></a>host</code></em>;</span></p></td>
+<td>the host</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> <em class="structfield"><code><a name="GstRTSPUrl.port"></a>port</code></em>;</span></p></td>
+<td>the port</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPUrl.abspath"></a>abspath</code></em>;</span></p></td>
+<td>the absolute path</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstRTSPUrl.query"></a>query</code></em>;</span></p></td>
+<td>additional query parameters</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-parse"></a><h3>gst_rtsp_url_parse ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_url_parse (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *urlstr</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> **url</code></em>);</pre>
+<p>
+Parse the RTSP <em class="parameter"><code>urlstr</code></em> into a newly allocated <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>. Free after usage
+with <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free" title="gst_rtsp_url_free ()"><code class="function">gst_rtsp_url_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>urlstr</code></em> :</span></p></td>
+<td>the url string to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>location to hold the result.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="type">GstRTSPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-copy"></a><h3>gst_rtsp_url_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="returnvalue">GstRTSPUrl</span></a> * gst_rtsp_url_copy (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);</pre>
+<p>
+Make a copy of <em class="parameter"><code>url</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a copy of <em class="parameter"><code>url</code></em>. Free with <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free" title="gst_rtsp_url_free ()"><code class="function">gst_rtsp_url_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-free"></a><h3>gst_rtsp_url_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_rtsp_url_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);</pre>
+<p>
+Free the memory used by <em class="parameter"><code>url</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-get-request-uri"></a><h3>gst_rtsp_url_get_request_uri ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_rtsp_url_get_request_uri (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);</pre>
+<p>
+Get a newly allocated string describing the request URI for <em class="parameter"><code>url</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string with the request URI. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-set-port"></a><h3>gst_rtsp_url_set_port ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_url_set_port (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> port</code></em>);</pre>
+<p>
+Set the port number in <em class="parameter"><code>url</code></em> to <em class="parameter"><code>port</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>the port</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-get-port"></a><h3>gst_rtsp_url_get_port ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult" title="enum GstRTSPResult"><span class="returnvalue">GstRTSPResult</span></a> gst_rtsp_url_get_port (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *port</code></em>);</pre>
+<p>
+Get the port number of <em class="parameter"><code>url</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>location to hold the port</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"><span class="type">GST_RTSP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-rtsp-url-decode-path-components"></a><h3>gst_rtsp_url_decode_path_components ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** gst_rtsp_url_decode_path_components (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a> *url</code></em>);</pre>
+<p>
+Splits the path of <em class="parameter"><code>url</code></em> on '/' boundaries, decoding the resulting components,
+</p>
+<p>
+The decoding performed by this routine is "URI decoding", as defined in RFC
+3986, commonly known as percent-decoding. For example, a string "foo%2fbar"
+will decode to "foo/bar" -- the %2f being replaced by the corresponding byte
+with hex value 0x2f. Note that there is no guarantee that the resulting byte
+sequence is valid in any given encoding. As a special case, %00 is not
+unescaped to NUL, as that would prematurely terminate the string.
+</p>
+<p>
+Also note that since paths usually start with a slash, the first component
+will usually be the empty string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>url</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl" title="struct GstRTSPUrl"><span class="type">GstRTSPUrl</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string vector. <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strfreev"><code class="function">g_strfreev()</code></a> after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstsdpmessage.html b/docs/libs/html/gst-plugins-base-libs-gstsdpmessage.html
new file mode 100644
index 0000000..8d516a1
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstsdpmessage.html
@@ -0,0 +1,2788 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstsdpmessage</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-sdp.html" title="SDP Library">
+<link rel="prev" href="gstreamer-sdp.html" title="SDP Library">
+<link rel="next" href="gstreamer-tag.html" title="Tag Support Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-sdp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-sdp.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-tag.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstsdpmessage.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstsdpmessage.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstsdpmessage"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstsdpmessage.top_of_page"></a>gstsdpmessage</span></h2>
+<p>gstsdpmessage — Helper methods for dealing with SDP messages</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstsdpmessage.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/sdp/gstsdpmessage.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult">GstSDPResult</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin">GstSDPOrigin</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection">GstSDPConnection</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-CT:CAPS" title="GST_SDP_BWTYPE_CT">GST_SDP_BWTYPE_CT</a>
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-AS:CAPS" title="GST_SDP_BWTYPE_AS">GST_SDP_BWTYPE_AS</a>
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-EXT-PREFIX:CAPS" title="GST_SDP_BWTYPE_EXT_PREFIX">GST_SDP_BWTYPE_EXT_PREFIX</a>
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RR:CAPS" title="GST_SDP_BWTYPE_RR">GST_SDP_BWTYPE_RR</a>
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RS:CAPS" title="GST_SDP_BWTYPE_RS">GST_SDP_BWTYPE_RS</a>
+#define <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-TIAS:CAPS" title="GST_SDP_BWTYPE_TIAS">GST_SDP_BWTYPE_TIAS</a>
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth">GstSDPBandwidth</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime">GstSDPTime</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone">GstSDPZone</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey">GstSDPKey</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute">GstSDPAttribute</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia">GstSDPMedia</a>;
+ <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage">GstSDPMessage</a>;
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new" title="gst_sdp_message_new ()">gst_sdp_message_new</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> **msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-init" title="gst_sdp_message_init ()">gst_sdp_message_init</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-uninit" title="gst_sdp_message_uninit ()">gst_sdp_message_uninit</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-free" title="gst_sdp_message_free ()">gst_sdp_message_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-buffer" title="gst_sdp_message_parse_buffer ()">gst_sdp_message_parse_buffer</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-text" title="gst_sdp_message_as_text ()">gst_sdp_message_as_text</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-uri" title="gst_sdp_message_parse_uri ()">gst_sdp_message_parse_uri</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-uri" title="gst_sdp_message_as_uri ()">gst_sdp_message_as_uri</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *scheme</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-address-is-multicast" title="gst_sdp_address_is_multicast ()">gst_sdp_address_is_multicast</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addr</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-version" title="gst_sdp_message_get_version ()">gst_sdp_message_get_version</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-version" title="gst_sdp_message_set_version ()">gst_sdp_message_set_version</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *version</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin"><span class="returnvalue">GstSDPOrigin</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-origin" title="gst_sdp_message_get_origin ()">gst_sdp_message_get_origin</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-origin" title="gst_sdp_message_set_origin ()">gst_sdp_message_set_origin</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *username</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *sess_id</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *sess_version</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addr</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-session-name" title="gst_sdp_message_get_session_name ()">gst_sdp_message_get_session_name</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-session-name" title="gst_sdp_message_set_session_name ()">gst_sdp_message_set_session_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *session_name</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-information" title="gst_sdp_message_get_information ()">gst_sdp_message_get_information</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-information" title="gst_sdp_message_set_information ()">gst_sdp_message_set_information</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *information</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-uri" title="gst_sdp_message_get_uri ()">gst_sdp_message_get_uri</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-uri" title="gst_sdp_message_set_uri ()">gst_sdp_message_set_uri</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-emails-len" title="gst_sdp_message_emails_len ()">gst_sdp_message_emails_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-email" title="gst_sdp_message_get_email ()">gst_sdp_message_get_email</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-email" title="gst_sdp_message_add_email ()">gst_sdp_message_add_email</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *email</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-phones-len" title="gst_sdp_message_phones_len ()">gst_sdp_message_phones_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-phone" title="gst_sdp_message_get_phone ()">gst_sdp_message_get_phone</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-phone" title="gst_sdp_message_add_phone ()">gst_sdp_message_add_phone</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *phone</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="returnvalue">GstSDPConnection</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-connection" title="gst_sdp_message_get_connection ()">gst_sdp_message_get_connection</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-connection" title="gst_sdp_message_set_connection ()">gst_sdp_message_set_connection</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> ttl</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> addr_number</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-bandwidths-len" title="gst_sdp_message_bandwidths_len ()">gst_sdp_message_bandwidths_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="returnvalue">GstSDPBandwidth</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-bandwidth" title="gst_sdp_message_get_bandwidth ()">gst_sdp_message_get_bandwidth</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-bandwidth" title="gst_sdp_message_add_bandwidth ()">gst_sdp_message_add_bandwidth</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *bwtype</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> bandwidth</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-times-len" title="gst_sdp_message_times_len ()">gst_sdp_message_times_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime"><span class="returnvalue">GstSDPTime</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-time" title="gst_sdp_message_get_time ()">gst_sdp_message_get_time</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-time" title="gst_sdp_message_add_time ()">gst_sdp_message_add_time</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *start</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *stop</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **repeat</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-zones-len" title="gst_sdp_message_zones_len ()">gst_sdp_message_zones_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone"><span class="returnvalue">GstSDPZone</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-zone" title="gst_sdp_message_get_zone ()">gst_sdp_message_get_zone</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-zone" title="gst_sdp_message_add_zone ()">gst_sdp_message_add_zone</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *adj_time</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *typed_time</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="returnvalue">GstSDPKey</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-key" title="gst_sdp_message_get_key ()">gst_sdp_message_get_key</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-key" title="gst_sdp_message_set_key ()">gst_sdp_message_set_key</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-attributes-len" title="gst_sdp_message_attributes_len ()">gst_sdp_message_attributes_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="returnvalue">GstSDPAttribute</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute" title="gst_sdp_message_get_attribute ()">gst_sdp_message_get_attribute</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val" title="gst_sdp_message_get_attribute_val ()">gst_sdp_message_get_attribute_val</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val-n" title="gst_sdp_message_get_attribute_val_n ()">gst_sdp_message_get_attribute_val_n</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-attribute" title="gst_sdp_message_add_attribute ()">gst_sdp_message_add_attribute</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-medias-len" title="gst_sdp_message_medias_len ()">gst_sdp_message_medias_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="returnvalue">GstSDPMedia</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-media" title="gst_sdp_message_get_media ()">gst_sdp_message_get_media</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-media" title="gst_sdp_message_add_media ()">gst_sdp_message_add_media</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-dump" title="gst_sdp_message_dump ()">gst_sdp_message_dump</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new" title="gst_sdp_media_new ()">gst_sdp_media_new</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> **media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init" title="gst_sdp_media_init ()">gst_sdp_media_init</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-uninit" title="gst_sdp_media_uninit ()">gst_sdp_media_uninit</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-free" title="gst_sdp_media_free ()">gst_sdp_media_free</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-media" title="gst_sdp_media_get_media ()">gst_sdp_media_get_media</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-media" title="gst_sdp_media_set_media ()">gst_sdp_media_set_media</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *med</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-port" title="gst_sdp_media_get_port ()">gst_sdp_media_get_port</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-num-ports" title="gst_sdp_media_get_num_ports ()">gst_sdp_media_get_num_ports</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-port-info" title="gst_sdp_media_set_port_info ()">gst_sdp_media_set_port_info</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> port</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> num_ports</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-proto" title="gst_sdp_media_get_proto ()">gst_sdp_media_get_proto</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-proto" title="gst_sdp_media_set_proto ()">gst_sdp_media_set_proto</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *proto</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-formats-len" title="gst_sdp_media_formats_len ()">gst_sdp_media_formats_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-format" title="gst_sdp_media_get_format ()">gst_sdp_media_get_format</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-format" title="gst_sdp_media_add_format ()">gst_sdp_media_add_format</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *format</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-information" title="gst_sdp_media_get_information ()">gst_sdp_media_get_information</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-information" title="gst_sdp_media_set_information ()">gst_sdp_media_set_information</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *information</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-connections-len" title="gst_sdp_media_connections_len ()">gst_sdp_media_connections_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="returnvalue">GstSDPConnection</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-connection" title="gst_sdp_media_get_connection ()">gst_sdp_media_get_connection</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-connection" title="gst_sdp_media_add_connection ()">gst_sdp_media_add_connection</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> ttl</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> addr_number</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-bandwidths-len" title="gst_sdp_media_bandwidths_len ()">gst_sdp_media_bandwidths_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="returnvalue">GstSDPBandwidth</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-bandwidth" title="gst_sdp_media_get_bandwidth ()">gst_sdp_media_get_bandwidth</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-bandwidth" title="gst_sdp_media_add_bandwidth ()">gst_sdp_media_add_bandwidth</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *bwtype</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> bandwidth</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="returnvalue">GstSDPKey</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-key" title="gst_sdp_media_get_key ()">gst_sdp_media_get_key</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-key" title="gst_sdp_media_set_key ()">gst_sdp_media_set_key</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-attributes-len" title="gst_sdp_media_attributes_len ()">gst_sdp_media_attributes_len</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="returnvalue">GstSDPAttribute</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute" title="gst_sdp_media_get_attribute ()">gst_sdp_media_get_attribute</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val" title="gst_sdp_media_get_attribute_val ()">gst_sdp_media_get_attribute_val</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val-n" title="gst_sdp_media_get_attribute_val_n ()">gst_sdp_media_get_attribute_val_n</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-attribute" title="gst_sdp_media_add_attribute ()">gst_sdp_media_add_attribute</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-as-text" title="gst_sdp_media_as_text ()">gst_sdp_media_as_text</a> (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstsdpmessage.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id590545"></a><p>
+The GstSDPMessage helper functions makes it easy to parse and create SDP
+messages.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2007-07-24 (0.10.14)
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstsdpmessage.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstSDPResult"></a><h3>enum GstSDPResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_SDP_OK = 0,
+ GST_SDP_EINVAL = -1
+} GstSDPResult;
+</pre>
+<p>
+Return values for the SDP functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SDP-OK:CAPS"></a><span class="term"><code class="literal">GST_SDP_OK</code></span></p></td>
+<td>A successful return value
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SDP-EINVAL:CAPS"></a><span class="term"><code class="literal">GST_SDP_EINVAL</code></span></p></td>
+<td>a function was given invalid parameters
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPOrigin"></a><h3>GstSDPOrigin</h3>
+<pre class="programlisting">typedef struct {
+ gchar *username;
+ gchar *sess_id;
+ gchar *sess_version;
+ gchar *nettype;
+ gchar *addrtype;
+ gchar *addr;
+} GstSDPOrigin;
+</pre>
+<p>
+The contents of the SDP "o=" field which gives the originator of the session
+(their username and the address of the user's host) plus a session id and
+session version number.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.username"></a>username</code></em>;</span></p></td>
+<td>the user's login on the originating host, or it is "-"
+if the originating host does not support the concept of user ids.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.sess-id"></a>sess_id</code></em>;</span></p></td>
+<td>is a numeric string such that the tuple of <em class="parameter"><code>username</code></em>, <em class="parameter"><code>sess_id</code></em>,
+<em class="parameter"><code>nettype</code></em>, <em class="parameter"><code>addrtype</code></em> and <em class="parameter"><code>addr</code></em> form a globally unique identifier for the
+session.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.sess-version"></a>sess_version</code></em>;</span></p></td>
+<td>a version number for this announcement</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.nettype"></a>nettype</code></em>;</span></p></td>
+<td>the type of network. "IN" is defined to have the meaning
+"Internet".</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.addrtype"></a>addrtype</code></em>;</span></p></td>
+<td>the type of <em class="parameter"><code>addr</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPOrigin.addr"></a>addr</code></em>;</span></p></td>
+<td>the globally unique address of the machine from which the session was
+created.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPConnection"></a><h3>GstSDPConnection</h3>
+<pre class="programlisting">typedef struct {
+ gchar *nettype;
+ gchar *addrtype;
+ gchar *address;
+ guint ttl;
+ guint addr_number;
+} GstSDPConnection;
+</pre>
+<p>
+The contents of the SDP "c=" field which contains connection data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPConnection.nettype"></a>nettype</code></em>;</span></p></td>
+<td>the type of network. "IN" is defined to have the meaning
+"Internet".</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPConnection.addrtype"></a>addrtype</code></em>;</span></p></td>
+<td>the type of <em class="parameter"><code>address</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPConnection.address"></a>address</code></em>;</span></p></td>
+<td>the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstSDPConnection.ttl"></a>ttl</code></em>;</span></p></td>
+<td>the time to live of the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstSDPConnection.addr-number"></a>addr_number</code></em>;</span></p></td>
+<td>the number of layers</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-CT:CAPS"></a><h3>GST_SDP_BWTYPE_CT</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_CT "CT"
+</pre>
+<p>
+The Conference Total bandwidth modifier.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-AS:CAPS"></a><h3>GST_SDP_BWTYPE_AS</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_AS "AS"
+</pre>
+<p>
+The Application-Specific Maximum bandwidth modifier.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-EXT-PREFIX:CAPS"></a><h3>GST_SDP_BWTYPE_EXT_PREFIX</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_EXT_PREFIX "X-"
+</pre>
+<p>
+The extension prefix bandwidth modifier.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-RR:CAPS"></a><h3>GST_SDP_BWTYPE_RR</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_RR "RR"
+</pre>
+<p>
+RTCP bandwidth allocated to data receivers (RFC 3556).
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-RS:CAPS"></a><h3>GST_SDP_BWTYPE_RS</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_RS "RS"
+</pre>
+<p>
+RTCP bandwidth allocated to active data senders (RFC 3556).
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SDP-BWTYPE-TIAS:CAPS"></a><h3>GST_SDP_BWTYPE_TIAS</h3>
+<pre class="programlisting">#define GST_SDP_BWTYPE_TIAS "TIAS"
+</pre>
+<p>
+Transport Independent Application Specific Maximum bandwidth (RFC 3890).
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPBandwidth"></a><h3>GstSDPBandwidth</h3>
+<pre class="programlisting">typedef struct {
+ gchar *bwtype;
+ guint bandwidth;
+} GstSDPBandwidth;
+</pre>
+<p>
+The contents of the SDP "b=" field which specifies the proposed bandwidth to
+be used by the session or media.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPBandwidth.bwtype"></a>bwtype</code></em>;</span></p></td>
+<td>the bandwidth modifier type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstSDPBandwidth.bandwidth"></a>bandwidth</code></em>;</span></p></td>
+<td>the bandwidth in kilobits per second</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPTime"></a><h3>GstSDPTime</h3>
+<pre class="programlisting">typedef struct {
+ gchar *start;
+ gchar *stop;
+ GArray *repeat;
+} GstSDPTime;
+</pre>
+<p>
+The contents of the SDP "t=" field which specify the start and stop times for
+a conference session.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPTime.start"></a>start</code></em>;</span></p></td>
+<td>start time for the conference. The value is the decimal
+representation of Network Time Protocol (NTP) time values in seconds</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPTime.stop"></a>stop</code></em>;</span></p></td>
+<td>stop time for the conference. The value is the decimal
+representation of Network Time Protocol (NTP) time values in seconds</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPTime.repeat"></a>repeat</code></em>;</span></p></td>
+<td>repeat times for a session</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPZone"></a><h3>GstSDPZone</h3>
+<pre class="programlisting">typedef struct {
+ gchar *time;
+ gchar *typed_time;
+} GstSDPZone;
+</pre>
+<p>
+The contents of the SDP "z=" field which allows the sender to
+specify a list of time zone adjustments and offsets from the base
+time.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPZone.time"></a>time</code></em>;</span></p></td>
+<td>the NTP time that a time zone adjustment happens</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPZone.typed-time"></a>typed_time</code></em>;</span></p></td>
+<td>the offset from the time when the session was first scheduled</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPKey"></a><h3>GstSDPKey</h3>
+<pre class="programlisting">typedef struct {
+ gchar *type;
+ gchar *data;
+} GstSDPKey;
+</pre>
+<p>
+The contents of the SDP "k=" field which is used to convey encryption
+keys.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPKey.type"></a>type</code></em>;</span></p></td>
+<td>the encryption type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPKey.data"></a>data</code></em>;</span></p></td>
+<td>the encryption data</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPAttribute"></a><h3>GstSDPAttribute</h3>
+<pre class="programlisting">typedef struct {
+ gchar *key;
+ gchar *value;
+} GstSDPAttribute;
+</pre>
+<p>
+The contents of the SDP "a=" field which contains a key/value pair.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPAttribute.key"></a>key</code></em>;</span></p></td>
+<td>the attribute key</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPAttribute.value"></a>value</code></em>;</span></p></td>
+<td>the attribute value or NULL when it was a property attribute</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPMedia"></a><h3>GstSDPMedia</h3>
+<pre class="programlisting">typedef struct {
+ gchar *media;
+ guint port;
+ guint num_ports;
+ gchar *proto;
+ GArray *fmts;
+ gchar *information;
+ GArray *connections;
+ GArray *bandwidths;
+ GstSDPKey key;
+ GArray *attributes;
+} GstSDPMedia;
+</pre>
+<p>
+The contents of the SDP "m=" field with all related fields.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMedia.media"></a>media</code></em>;</span></p></td>
+<td>the media type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstSDPMedia.port"></a>port</code></em>;</span></p></td>
+<td>the transport port to which the media stream will be sent</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstSDPMedia.num-ports"></a>num_ports</code></em>;</span></p></td>
+<td>the number of ports or -1 if only one port was specified</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMedia.proto"></a>proto</code></em>;</span></p></td>
+<td>the transport protocol</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMedia.fmts"></a>fmts</code></em>;</span></p></td>
+<td>an array of <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> formats</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMedia.information"></a>information</code></em>;</span></p></td>
+<td>the media title</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMedia.connections"></a>connections</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="type">GstSDPConnection</span></a> with media connection information</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMedia.bandwidths"></a>bandwidths</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="type">GstSDPBandwidth</span></a> with media bandwidth information</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="type">GstSDPKey</span></a> <em class="structfield"><code><a name="GstSDPMedia.key"></a>key</code></em>;</span></p></td>
+<td>the encryption key</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMedia.attributes"></a>attributes</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="type">GstSDPAttribute</span></a> with the additional media attributes</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSDPMessage"></a><h3>GstSDPMessage</h3>
+<pre class="programlisting">typedef struct {
+ gchar *version;
+ GstSDPOrigin origin;
+ gchar *session_name;
+ gchar *information;
+ gchar *uri;
+ GArray *emails;
+ GArray *phones;
+ GstSDPConnection connection;
+ GArray *bandwidths;
+ GArray *times;
+ GArray *zones;
+ GstSDPKey key;
+ GArray *attributes;
+ GArray *medias;
+} GstSDPMessage;
+</pre>
+<p>
+The contents of the SDP message.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMessage.version"></a>version</code></em>;</span></p></td>
+<td>the protocol version</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin"><span class="type">GstSDPOrigin</span></a> <em class="structfield"><code><a name="GstSDPMessage.origin"></a>origin</code></em>;</span></p></td>
+<td>owner/creator and session identifier</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMessage.session-name"></a>session_name</code></em>;</span></p></td>
+<td>session name</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMessage.information"></a>information</code></em>;</span></p></td>
+<td>session information</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstSDPMessage.uri"></a>uri</code></em>;</span></p></td>
+<td>URI of description</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.emails"></a>emails</code></em>;</span></p></td>
+<td>array of <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> with email addresses</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.phones"></a>phones</code></em>;</span></p></td>
+<td>array of <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> with phone numbers</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="type">GstSDPConnection</span></a> <em class="structfield"><code><a name="GstSDPMessage.connection"></a>connection</code></em>;</span></p></td>
+<td>connection information for the session</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.bandwidths"></a>bandwidths</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="type">GstSDPBandwidth</span></a> with bandwidth information</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.times"></a>times</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime"><span class="type">GstSDPTime</span></a> with time descriptions</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.zones"></a>zones</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone"><span class="type">GstSDPZone</span></a> with time zone adjustments</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="type">GstSDPKey</span></a> <em class="structfield"><code><a name="GstSDPMessage.key"></a>key</code></em>;</span></p></td>
+<td>encryption key</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.attributes"></a>attributes</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="type">GstSDPAttribute</span></a> with session attributes</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Arrays.html#GArray"><span class="type">GArray</span></a> *<em class="structfield"><code><a name="GstSDPMessage.medias"></a>medias</code></em>;</span></p></td>
+<td>array of <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> with media descriptions</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-new"></a><h3>gst_sdp_message_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_new (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> **msg</code></em>);</pre>
+<p>
+Allocate a new GstSDPMessage and store the result in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>pointer to new <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-init"></a><h3>gst_sdp_message_init ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_init (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>msg</code></em> so that its contents are as if it was freshly allocated
+with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new" title="gst_sdp_message_new ()"><code class="function">gst_sdp_message_new()</code></a>. This function is mostly used to initialize a message
+allocated on the stack. <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-uninit" title="gst_sdp_message_uninit ()"><code class="function">gst_sdp_message_uninit()</code></a> undoes this operation.
+</p>
+<p>
+When this function is invoked on newly allocated data (with malloc or on the
+stack), its contents should be set to 0 before calling this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-uninit"></a><h3>gst_sdp_message_uninit ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_uninit (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Free all resources allocated in <em class="parameter"><code>msg</code></em>. <em class="parameter"><code>msg</code></em> should not be used anymore after
+this function. This function should be used when <em class="parameter"><code>msg</code></em> was allocated on the
+stack and initialized with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-init" title="gst_sdp_message_init ()"><code class="function">gst_sdp_message_init()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-free"></a><h3>gst_sdp_message_free ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Free all resources allocated by <em class="parameter"><code>msg</code></em>. <em class="parameter"><code>msg</code></em> should not be used anymore after
+this function. This function should be used when <em class="parameter"><code>msg</code></em> was dynamically
+allocated with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new" title="gst_sdp_message_new ()"><code class="function">gst_sdp_message_new()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-parse-buffer"></a><h3>gst_sdp_message_parse_buffer ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_parse_buffer (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Parse the contents of <em class="parameter"><code>size</code></em> bytes pointed to by <em class="parameter"><code>data</code></em> and store the result in
+<em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the start of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>the result <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-as-text"></a><h3>gst_sdp_message_as_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_as_text (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Convert the contents of <em class="parameter"><code>msg</code></em> to a text string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A dynamically allocated string representing the SDP description.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-parse-uri"></a><h3>gst_sdp_message_parse_uri ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_parse_uri (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Parse the null-terminated <em class="parameter"><code>uri</code></em> and store the result in <em class="parameter"><code>msg</code></em>.
+</p>
+<p>
+The uri should be of the form:
+</p>
+<p>
+ scheme://[address[:ttl=ttl][:noa=noa]]/[sessionname]
+ [<span class="type">type</span>=value *[&amp;type=value]]
+</p>
+<p>
+ where value is url encoded. This looslely resembles
+ http://tools.ietf.org/html/draft-fujikawa-sdp-url-01
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the start of the uri</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>the result <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a> on success.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-as-uri"></a><h3>gst_sdp_message_as_uri ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_as_uri (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *scheme</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Creates a uri from <em class="parameter"><code>msg</code></em> with the given <em class="parameter"><code>scheme</code></em>. The uri has the format:
+</p>
+<p>
+ <em class="parameter"><code>scheme</code></em>:///[<span class="type">type</span>=value *[&amp;type=value]]
+</p>
+<p>
+ Where each value is url encoded.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>scheme</code></em> :</span></p></td>
+<td>the uri scheme</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a uri for <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-address-is-multicast"></a><h3>gst_sdp_address_is_multicast ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_sdp_address_is_multicast (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addr</code></em>);</pre>
+<p>
+Check if the given <em class="parameter"><code>addr</code></em> is a multicast address.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nettype</code></em> :</span></p></td>
+<td>a network type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addrtype</code></em> :</span></p></td>
+<td>an address type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr</code></em> :</span></p></td>
+<td>an address</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE when <em class="parameter"><code>addr</code></em> is multicast.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-version"></a><h3>gst_sdp_message_get_version ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_version (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the version in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-version"></a><h3>gst_sdp_message_set_version ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_version (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *version</code></em>);</pre>
+<p>
+Set the version in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>the version</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-origin"></a><h3>gst_sdp_message_get_origin ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin"><span class="returnvalue">GstSDPOrigin</span></a> * gst_sdp_message_get_origin (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the origin of <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin" title="GstSDPOrigin"><span class="type">GstSDPOrigin</span></a>. The result remains valid as long as <em class="parameter"><code>msg</code></em> is valid.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-origin"></a><h3>gst_sdp_message_set_origin ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_origin (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *username</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *sess_id</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *sess_version</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addr</code></em>);</pre>
+<p>
+Configure the SDP origin in <em class="parameter"><code>msg</code></em> with the given parameters.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>username</code></em> :</span></p></td>
+<td>the user name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sess_id</code></em> :</span></p></td>
+<td>a session id</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sess_version</code></em> :</span></p></td>
+<td>a session version</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nettype</code></em> :</span></p></td>
+<td>a network type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addrtype</code></em> :</span></p></td>
+<td>an address type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr</code></em> :</span></p></td>
+<td>an address</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-session-name"></a><h3>gst_sdp_message_get_session_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_session_name (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the session name in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-session-name"></a><h3>gst_sdp_message_set_session_name ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_session_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *session_name</code></em>);</pre>
+<p>
+Set the session name in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>session_name</code></em> :</span></p></td>
+<td>the session name</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-information"></a><h3>gst_sdp_message_get_information ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_information (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the information in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-information"></a><h3>gst_sdp_message_set_information ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_information (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *information</code></em>);</pre>
+<p>
+Set the information in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>information</code></em> :</span></p></td>
+<td>the information</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-uri"></a><h3>gst_sdp_message_get_uri ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_uri (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the URI in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-uri"></a><h3>gst_sdp_message_set_uri ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_uri (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<p>
+Set the URI in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the URI</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-emails-len"></a><h3>gst_sdp_message_emails_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_emails_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of emails in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of emails in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-email"></a><h3>gst_sdp_message_get_email ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_email (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the email with number <em class="parameter"><code>idx</code></em> from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>an email index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the email at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-email"></a><h3>gst_sdp_message_add_email ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_email (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *email</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>email</code></em> to the list of emails in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>email</code></em> :</span></p></td>
+<td>an email</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-phones-len"></a><h3>gst_sdp_message_phones_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_phones_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of phones in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of phones in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-phone"></a><h3>gst_sdp_message_get_phone ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_phone (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the phone with number <em class="parameter"><code>idx</code></em> from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>a phone index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the phone at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-phone"></a><h3>gst_sdp_message_add_phone ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_phone (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *phone</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>phone</code></em> to the list of phones in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>phone</code></em> :</span></p></td>
+<td>a phone</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-connection"></a><h3>gst_sdp_message_get_connection ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="returnvalue">GstSDPConnection</span></a> * gst_sdp_message_get_connection (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the connection of <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="type">GstSDPConnection</span></a>. The result remains valid as long as <em class="parameter"><code>msg</code></em> is valid.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-connection"></a><h3>gst_sdp_message_set_connection ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_connection (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> ttl</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> addr_number</code></em>);</pre>
+<p>
+Configure the SDP connection in <em class="parameter"><code>msg</code></em> with the given parameters.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nettype</code></em> :</span></p></td>
+<td>the type of network. "IN" is defined to have the meaning
+"Internet".</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addrtype</code></em> :</span></p></td>
+<td>the type of address.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ttl</code></em> :</span></p></td>
+<td>the time to live of the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr_number</code></em> :</span></p></td>
+<td>the number of layers</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-bandwidths-len"></a><h3>gst_sdp_message_bandwidths_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_bandwidths_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of bandwidth information in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bandwidth information in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-bandwidth"></a><h3>gst_sdp_message_get_bandwidth ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="returnvalue">GstSDPBandwidth</span></a> * gst_sdp_message_get_bandwidth (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the bandwidth at index <em class="parameter"><code>idx</code></em> from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the bandwidth index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="type">GstSDPBandwidth</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-bandwidth"></a><h3>gst_sdp_message_add_bandwidth ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_bandwidth (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *bwtype</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> bandwidth</code></em>);</pre>
+<p>
+Add the specified bandwidth information to <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bwtype</code></em> :</span></p></td>
+<td>the bandwidth modifier type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bandwidth</code></em> :</span></p></td>
+<td>the bandwidth in kilobits per second</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-times-len"></a><h3>gst_sdp_message_times_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_times_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of time information entries in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of time information entries in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-time"></a><h3>gst_sdp_message_get_time ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime"><span class="returnvalue">GstSDPTime</span></a> * gst_sdp_message_get_time (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get time information with index <em class="parameter"><code>idx</code></em> from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the time index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime" title="GstSDPTime"><span class="type">GstSDPTime</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-time"></a><h3>gst_sdp_message_add_time ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_time (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *start</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *stop</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **repeat</code></em>);</pre>
+<p>
+Add time information <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> to <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>the stop time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>repeat</code></em> :</span></p></td>
+<td>the repeat times</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-zones-len"></a><h3>gst_sdp_message_zones_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_zones_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of time zone information entries in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of time zone information entries in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-zone"></a><h3>gst_sdp_message_get_zone ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone"><span class="returnvalue">GstSDPZone</span></a> * gst_sdp_message_get_zone (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get time zone information with index <em class="parameter"><code>idx</code></em> from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the zone index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone" title="GstSDPZone"><span class="type">GstSDPZone</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-zone"></a><h3>gst_sdp_message_add_zone ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_zone (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *adj_time</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *typed_time</code></em>);</pre>
+<p>
+Add time zone information to <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adj_time</code></em> :</span></p></td>
+<td>the NTP time that a time zone adjustment happens</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>typed_time</code></em> :</span></p></td>
+<td>the offset from the time when the session was first scheduled</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-key"></a><h3>gst_sdp_message_get_key ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="returnvalue">GstSDPKey</span></a> * gst_sdp_message_get_key (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the encryption information from <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="type">GstSDPKey</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-set-key"></a><h3>gst_sdp_message_set_key ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_set_key (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>);</pre>
+<p>
+Adds the encryption information to <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the encryption type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the encryption data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-attributes-len"></a><h3>gst_sdp_message_attributes_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_attributes_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of attributes in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of attributes in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-attribute"></a><h3>gst_sdp_message_get_attribute ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="returnvalue">GstSDPAttribute</span></a> * gst_sdp_message_get_attribute (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the attribute at position <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="type">GstSDPAttribute</span></a> at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-attribute-val"></a><h3>gst_sdp_message_get_attribute_val ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_attribute_val (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>);</pre>
+<p>
+Get the first attribute with key <em class="parameter"><code>key</code></em> in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>the key</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the attribute value of the first attribute with <em class="parameter"><code>key</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-attribute-val-n"></a><h3>gst_sdp_message_get_attribute_val_n ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_message_get_attribute_val_n (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);</pre>
+<p>
+Get the <em class="parameter"><code>nth</code></em> attribute with key <em class="parameter"><code>key</code></em> in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>the key</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the attribute value of the <em class="parameter"><code>nth</code></em> attribute with <em class="parameter"><code>key</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-attribute"></a><h3>gst_sdp_message_add_attribute ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_attribute (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Add the attribute with <em class="parameter"><code>key</code></em> and <em class="parameter"><code>value</code></em> to <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>the key</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>GST_SDP_OK</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-medias-len"></a><h3>gst_sdp_message_medias_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_message_medias_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Get the number of media descriptions in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of media descriptions in <em class="parameter"><code>msg</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-get-media"></a><h3>gst_sdp_message_get_media ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="returnvalue">GstSDPMedia</span></a> * gst_sdp_message_get_media (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the media description at index <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>msg</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-add-media"></a><h3>gst_sdp_message_add_media ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_add_media (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Adds <em class="parameter"><code>media</code></em> to the array of medias in <em class="parameter"><code>msg</code></em>. This function takes ownership of
+the contents of <em class="parameter"><code>media</code></em> so that <em class="parameter"><code>media</code></em> will have to be reinitialized with
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init" title="gst_sdp_media_init ()"><code class="function">gst_sdp_media_init()</code></a> before it can be used again.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-message-dump"></a><h3>gst_sdp_message_dump ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_message_dump (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a> *msg</code></em>);</pre>
+<p>
+Dump the parsed contents of <em class="parameter"><code>msg</code></em> to stdout.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage" title="GstSDPMessage"><span class="type">GstSDPMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-new"></a><h3>gst_sdp_media_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_new (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> **media</code></em>);</pre>
+<p>
+Allocate a new GstSDPMedia and store the result in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>pointer to new <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-init"></a><h3>gst_sdp_media_init ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_init (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Initialize <em class="parameter"><code>media</code></em> so that its contents are as if it was freshly allocated
+with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new" title="gst_sdp_media_new ()"><code class="function">gst_sdp_media_new()</code></a>. This function is mostly used to initialize a media
+allocated on the stack. <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-uninit" title="gst_sdp_media_uninit ()"><code class="function">gst_sdp_media_uninit()</code></a> undoes this operation.
+</p>
+<p>
+When this function is invoked on newly allocated data (with malloc or on the
+stack), its contents should be set to 0 before calling this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-uninit"></a><h3>gst_sdp_media_uninit ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_uninit (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Free all resources allocated in <em class="parameter"><code>media</code></em>. <em class="parameter"><code>media</code></em> should not be used anymore after
+this function. This function should be used when <em class="parameter"><code>media</code></em> was allocated on the
+stack and initialized with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init" title="gst_sdp_media_init ()"><code class="function">gst_sdp_media_init()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-free"></a><h3>gst_sdp_media_free ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_free (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Free all resources allocated by <em class="parameter"><code>media</code></em>. <em class="parameter"><code>media</code></em> should not be used anymore after
+this function. This function should be used when <em class="parameter"><code>media</code></em> was dynamically
+allocated with <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new" title="gst_sdp_media_new ()"><code class="function">gst_sdp_media_new()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-media"></a><h3>gst_sdp_media_get_media ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_media (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the media description of <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the media description.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-set-media"></a><h3>gst_sdp_media_set_media ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_set_media (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *med</code></em>);</pre>
+<p>
+Set the media description of <em class="parameter"><code>media</code></em> to <em class="parameter"><code>med</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>med</code></em> :</span></p></td>
+<td>the media description</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-port"></a><h3>gst_sdp_media_get_port ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_get_port (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the port number for <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the port number of <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-num-ports"></a><h3>gst_sdp_media_get_num_ports ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_get_num_ports (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the number of ports for <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of ports for <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-set-port-info"></a><h3>gst_sdp_media_set_port_info ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_set_port_info (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> port</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> num_ports</code></em>);</pre>
+<p>
+Set the port information in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>the port number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num_ports</code></em> :</span></p></td>
+<td>the number of ports</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-proto"></a><h3>gst_sdp_media_get_proto ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_proto (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the transport protocol of <em class="parameter"><code>media</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the transport protocol of <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-set-proto"></a><h3>gst_sdp_media_set_proto ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_set_proto (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *proto</code></em>);</pre>
+<p>
+Set the media transport protocol of <em class="parameter"><code>media</code></em> to <em class="parameter"><code>proto</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>proto</code></em> :</span></p></td>
+<td>the media transport protocol</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-formats-len"></a><h3>gst_sdp_media_formats_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_formats_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the number of formats in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of formats in <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-format"></a><h3>gst_sdp_media_get_format ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_format (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the format information at position <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the format at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-add-format"></a><h3>gst_sdp_media_add_format ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_add_format (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *format</code></em>);</pre>
+<p>
+Add the format information to <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-information"></a><h3>gst_sdp_media_get_information ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_information (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the information of <em class="parameter"><code>media</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the information of <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-set-information"></a><h3>gst_sdp_media_set_information ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_set_information (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *information</code></em>);</pre>
+<p>
+Set the media information of <em class="parameter"><code>media</code></em> to <em class="parameter"><code>information</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>information</code></em> :</span></p></td>
+<td>the media information</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-connections-len"></a><h3>gst_sdp_media_connections_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_connections_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the number of connection fields in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of connections in <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-connection"></a><h3>gst_sdp_media_get_connection ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="returnvalue">GstSDPConnection</span></a> * gst_sdp_media_get_connection (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the connection at position <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection" title="GstSDPConnection"><span class="type">GstSDPConnection</span></a> at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-add-connection"></a><h3>gst_sdp_media_add_connection ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_add_connection (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nettype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *addrtype</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> ttl</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> addr_number</code></em>);</pre>
+<p>
+Add the given connection parameters to <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nettype</code></em> :</span></p></td>
+<td>the type of network. "IN" is defined to have the meaning
+"Internet".</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addrtype</code></em> :</span></p></td>
+<td>the type of address.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ttl</code></em> :</span></p></td>
+<td>the time to live of the address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr_number</code></em> :</span></p></td>
+<td>the number of layers</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-bandwidths-len"></a><h3>gst_sdp_media_bandwidths_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_bandwidths_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the number of bandwidth fields in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bandwidths in <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-bandwidth"></a><h3>gst_sdp_media_get_bandwidth ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="returnvalue">GstSDPBandwidth</span></a> * gst_sdp_media_get_bandwidth (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the bandwidth at position <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth" title="GstSDPBandwidth"><span class="type">GstSDPBandwidth</span></a> at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-add-bandwidth"></a><h3>gst_sdp_media_add_bandwidth ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_add_bandwidth (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *bwtype</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> bandwidth</code></em>);</pre>
+<p>
+Add the bandwidth information with <em class="parameter"><code>bwtype</code></em> and <em class="parameter"><code>bandwidth</code></em> to <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bwtype</code></em> :</span></p></td>
+<td>the bandwidth modifier type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bandwidth</code></em> :</span></p></td>
+<td>the bandwidth in kilobits per second</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-key"></a><h3>gst_sdp_media_get_key ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="returnvalue">GstSDPKey</span></a> * gst_sdp_media_get_key (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the encryption information from <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey" title="GstSDPKey"><span class="type">GstSDPKey</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-set-key"></a><h3>gst_sdp_media_set_key ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_set_key (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>);</pre>
+<p>
+Adds the encryption information to <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the encryption type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the encryption data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="type">GstSDPResult</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-attributes-len"></a><h3>gst_sdp_media_attributes_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_sdp_media_attributes_len (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Get the number of attribute fields in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of attributes in <em class="parameter"><code>media</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-attribute"></a><h3>gst_sdp_media_get_attribute ()</h3>
+<pre class="programlisting">const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="returnvalue">GstSDPAttribute</span></a> * gst_sdp_media_get_attribute (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> idx</code></em>);</pre>
+<p>
+Get the attribute at position <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute" title="GstSDPAttribute"><span class="type">GstSDPAttribute</span></a> at position <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-attribute-val"></a><h3>gst_sdp_media_get_attribute_val ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_attribute_val (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>);</pre>
+<p>
+Get the first attribute value for <em class="parameter"><code>key</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>a key</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the first attribute value for <em class="parameter"><code>key</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-get-attribute-val-n"></a><h3>gst_sdp_media_get_attribute_val_n ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_get_attribute_val_n (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> nth</code></em>);</pre>
+<p>
+Get the <em class="parameter"><code>nth</code></em> attribute value for <em class="parameter"><code>key</code></em> in <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>a key</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <em class="parameter"><code>nth</code></em> attribute value.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-add-attribute"></a><h3>gst_sdp_media_add_attribute ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult" title="enum GstSDPResult"><span class="returnvalue">GstSDPResult</span></a> gst_sdp_media_add_attribute (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *key</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Add the attribute with <em class="parameter"><code>key</code></em> and <em class="parameter"><code>value</code></em> to <em class="parameter"><code>media</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>a key</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"><span class="type">GST_SDP_OK</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-sdp-media-as-text"></a><h3>gst_sdp_media_as_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_sdp_media_as_text (<em class="parameter"><code>const <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a> *media</code></em>);</pre>
+<p>
+Convert the contents of <em class="parameter"><code>media</code></em> to a text string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia" title="GstSDPMedia"><span class="type">GstSDPMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A dynamically allocated string representing the media.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gststreamvolume.html b/docs/libs/html/gst-plugins-base-libs-gststreamvolume.html
new file mode 100644
index 0000000..2c744ef
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gststreamvolume.html
@@ -0,0 +1,308 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gststreamvolume</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstpropertyprobe.html" title="gstpropertyprobe">
+<link rel="next" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstpropertyprobe.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttuner.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gststreamvolume.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gststreamvolume.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gststreamvolume.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gststreamvolume.prerequisites" class="shortcut">Prerequisites</a>
+  | 
+ <a href="#gst-plugins-base-libs-gststreamvolume.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gststreamvolume"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gststreamvolume.top_of_page"></a>gststreamvolume</span></h2>
+<p>gststreamvolume — Interface for elements that provide a stream volume</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gststreamvolume.synopsis"></a><h2>Synopsis</h2>
+<a name="GstStreamVolume"></a><pre class="synopsis">
+#include &lt;gst/interfaces/streamvolume.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume-struct" title="GstStreamVolume">GstStreamVolume</a>;
+enum <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat">GstStreamVolumeFormat</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-volume" title="gst_stream_volume_get_volume ()">gst_stream_volume_get_volume</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-volume" title="gst_stream_volume_set_volume ()">gst_stream_volume_set_volume</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> val</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-mute" title="gst_stream_volume_get_mute ()">gst_stream_volume_get_mute</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-mute" title="gst_stream_volume_set_mute ()">gst_stream_volume_set_mute</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume" title="gst_stream_volume_convert_volume ()">gst_stream_volume_convert_volume</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> from</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> to</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> val</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstStreamVolume
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.prerequisites"></a><h2>Prerequisites</h2>
+<p>
+GstStreamVolume requires
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--mute" title='The "mute" property'>mute</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--volume" title='The "volume" property'>volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id504808"></a><p>
+This interface is implemented by elements that provide a stream volume. Examples for
+such elements are <span class="type">volume</span> and <span class="type">playbin2</span>.
+</p>
+<p>
+Applications can use this interface to get or set the current stream volume. For this
+the "volume" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> property can be used or the helper functions <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-volume" title="gst_stream_volume_set_volume ()"><code class="function">gst_stream_volume_set_volume()</code></a>
+and <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-volume" title="gst_stream_volume_get_volume ()"><code class="function">gst_stream_volume_get_volume()</code></a>. This volume is always a linear factor, i.e. 0.0 is muted
+1.0 is 100%. For showing the volume in a GUI it might make sense to convert it to
+a different format by using <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume" title="gst_stream_volume_convert_volume ()"><code class="function">gst_stream_volume_convert_volume()</code></a>. Volume sliders should usually
+use a cubic volume.
+</p>
+<p>
+Separate from the volume the stream can also be muted by the "mute" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> property or
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-mute" title="gst_stream_volume_set_mute ()"><code class="function">gst_stream_volume_set_mute()</code></a> and <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-mute" title="gst_stream_volume_get_mute ()"><code class="function">gst_stream_volume_get_mute()</code></a>.
+</p>
+<p>
+Elements that provide some kind of stream volume should implement the "volume" and
+"mute" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> properties and handle setting and getting of them properly.
+The volume property is defined to be a linear volume factor.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstStreamVolume-struct"></a><h3>GstStreamVolume</h3>
+<pre class="programlisting">typedef struct _GstStreamVolume GstStreamVolume;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStreamVolumeFormat"></a><h3>enum GstStreamVolumeFormat</h3>
+<pre class="programlisting">typedef enum {
+ GST_STREAM_VOLUME_FORMAT_LINEAR = 0,
+ GST_STREAM_VOLUME_FORMAT_CUBIC,
+ GST_STREAM_VOLUME_FORMAT_DB
+} GstStreamVolumeFormat;
+</pre>
+<p>
+Different representations of a stream volume. <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume" title="gst_stream_volume_convert_volume ()"><code class="function">gst_stream_volume_convert_volume()</code></a>
+allows to convert between the different representations.
+</p>
+<p>
+Formulas to convert from a linear to a cubic or dB volume are
+cbrt(val) and 20 * log10 (val).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STREAM-VOLUME-FORMAT-LINEAR:CAPS"></a><span class="term"><code class="literal">GST_STREAM_VOLUME_FORMAT_LINEAR</code></span></p></td>
+<td>Linear scale factor, 1.0 = 100%
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-VOLUME-FORMAT-CUBIC:CAPS"></a><span class="term"><code class="literal">GST_STREAM_VOLUME_FORMAT_CUBIC</code></span></p></td>
+<td>Cubic volume scale
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-VOLUME-FORMAT-DB:CAPS"></a><span class="term"><code class="literal">GST_STREAM_VOLUME_FORMAT_DB</code></span></p></td>
+<td>Logarithmic volume scale (dB, amplitude not power)
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-stream-volume-get-volume"></a><h3>gst_stream_volume_get_volume ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> gst_stream_volume_get_volume (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> format</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volume</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> that should be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> which should be returned</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current stream volume as linear factor</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-stream-volume-set-volume"></a><h3>gst_stream_volume_set_volume ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_stream_volume_set_volume (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> val</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volume</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> that should be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> of <em class="parameter"><code>val</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Linear volume factor that should be set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-stream-volume-get-mute"></a><h3>gst_stream_volume_get_mute ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_stream_volume_get_mute (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volume</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> that should be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the stream is muted</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-stream-volume-set-mute"></a><h3>gst_stream_volume_set_mute ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_stream_volume_set_mute (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> *volume</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> mute</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>volume</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume"><span class="type">GstStreamVolume</span></a> that should be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mute</code></em> :</span></p></td>
+<td>Mute state that should be set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-stream-volume-convert-volume"></a><h3>gst_stream_volume_convert_volume ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> gst_stream_volume_convert_volume (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> from</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> to</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> val</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>from</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> to convert from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>to</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" title="enum GstStreamVolumeFormat"><span class="type">GstStreamVolumeFormat</span></a> to convert to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Volume in <em class="parameter"><code>from</code></em> format that should be converted</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the converted volume</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gststreamvolume.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstStreamVolume--mute"></a><h3>The <code class="literal">"mute"</code> property</h3>
+<pre class="programlisting"> "mute" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Mute the audio channel without changing the volume.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStreamVolume--volume"></a><h3>The <code class="literal">"volume"</code> property</h3>
+<pre class="programlisting"> "volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Linear volume factor, 1.0=100%.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 1</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttag.html b/docs/libs/html/gst-plugins-base-libs-gsttag.html
new file mode 100644
index 0000000..882113f
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttag.html
@@ -0,0 +1,852 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttag</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="next" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-tag.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagvorbis.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttag.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttag.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttag"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttag.top_of_page"></a>gsttag</span></h2>
+<p>gsttag — additional tag definitions for plugins and applications</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttag.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRACKID:CAPS" title="GST_TAG_MUSICBRAINZ_TRACKID">GST_TAG_MUSICBRAINZ_TRACKID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ARTISTID:CAPS" title="GST_TAG_MUSICBRAINZ_ARTISTID">GST_TAG_MUSICBRAINZ_ARTISTID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMID:CAPS" title="GST_TAG_MUSICBRAINZ_ALBUMID">GST_TAG_MUSICBRAINZ_ALBUMID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS" title="GST_TAG_MUSICBRAINZ_ALBUMARTISTID">GST_TAG_MUSICBRAINZ_ALBUMARTISTID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRMID:CAPS" title="GST_TAG_MUSICBRAINZ_TRMID">GST_TAG_MUSICBRAINZ_TRMID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-SORTNAME:CAPS" title="GST_TAG_MUSICBRAINZ_SORTNAME">GST_TAG_MUSICBRAINZ_SORTNAME</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID:CAPS" title="GST_TAG_CDDA_CDDB_DISCID">GST_TAG_CDDA_CDDB_DISCID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS" title="GST_TAG_CDDA_CDDB_DISCID_FULL">GST_TAG_CDDA_CDDB_DISCID_FULL</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID">GST_TAG_CDDA_MUSICBRAINZ_DISCID</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS" title="GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL">GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-TRACK-TAGS:CAPS" title="GST_TAG_CDDA_TRACK_TAGS">GST_TAG_CDDA_TRACK_TAGS</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-CLIP:CAPS" title="GST_TAG_CMML_CLIP">GST_TAG_CMML_CLIP</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-HEAD:CAPS" title="GST_TAG_CMML_HEAD">GST_TAG_CMML_HEAD</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-STREAM:CAPS" title="GST_TAG_CMML_STREAM">GST_TAG_CMML_STREAM</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS" title="GST_TAG_CAPTURING_SHUTTER_SPEED">GST_TAG_CAPTURING_SHUTTER_SPEED</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-RATIO:CAPS" title="GST_TAG_CAPTURING_FOCAL_RATIO">GST_TAG_CAPTURING_FOCAL_RATIO</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS" title="GST_TAG_CAPTURING_FOCAL_LENGTH">GST_TAG_CAPTURING_FOCAL_LENGTH</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS" title="GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO">GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-ISO-SPEED:CAPS" title="GST_TAG_CAPTURING_ISO_SPEED">GST_TAG_CAPTURING_ISO_SPEED</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_PROGRAM">GST_TAG_CAPTURING_EXPOSURE_PROGRAM</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_MODE">GST_TAG_CAPTURING_EXPOSURE_MODE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS" title="GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE">GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS" title="GST_TAG_CAPTURING_GAIN_ADJUSTMENT">GST_TAG_CAPTURING_GAIN_ADJUSTMENT</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-WHITE-BALANCE:CAPS" title="GST_TAG_CAPTURING_WHITE_BALANCE">GST_TAG_CAPTURING_WHITE_BALANCE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-CONTRAST:CAPS" title="GST_TAG_CAPTURING_CONTRAST">GST_TAG_CAPTURING_CONTRAST</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SATURATION:CAPS" title="GST_TAG_CAPTURING_SATURATION">GST_TAG_CAPTURING_SATURATION</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHARPNESS:CAPS" title="GST_TAG_CAPTURING_SHARPNESS">GST_TAG_CAPTURING_SHARPNESS</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-FIRED:CAPS" title="GST_TAG_CAPTURING_FLASH_FIRED">GST_TAG_CAPTURING_FLASH_FIRED</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-MODE:CAPS" title="GST_TAG_CAPTURING_FLASH_MODE">GST_TAG_CAPTURING_FLASH_MODE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-METERING-MODE:CAPS" title="GST_TAG_CAPTURING_METERING_MODE">GST_TAG_CAPTURING_METERING_MODE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SOURCE:CAPS" title="GST_TAG_CAPTURING_SOURCE">GST_TAG_CAPTURING_SOURCE</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS" title="GST_TAG_CAPTURING_EXPOSURE_COMPENSATION">GST_TAG_CAPTURING_EXPOSURE_COMPENSATION</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS" title="GST_TAG_IMAGE_HORIZONTAL_PPI">GST_TAG_IMAGE_HORIZONTAL_PPI</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-VERTICAL-PPI:CAPS" title="GST_TAG_IMAGE_VERTICAL_PPI">GST_TAG_IMAGE_VERTICAL_PPI</a>
+#define <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-ID3V2-HEADER-SIZE:CAPS" title="GST_TAG_ID3V2_HEADER_SIZE">GST_TAG_ID3V2_HEADER_SIZE</a>
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-register-musicbrainz-tags" title="gst_tag_register_musicbrainz_tags ()">gst_tag_register_musicbrainz_tags</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-freeform-string-to-utf8" title="gst_tag_freeform_string_to_utf8 ()">gst_tag_freeform_string_to_utf8</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> size</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **env_vars</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-parse-extended-comment" title="gst_tag_parse_extended_comment ()">gst_tag_parse_extended_comment</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ext_comment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **lang</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> fail_if_no_key</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer" title="gst_tag_image_data_to_image_buffer ()">gst_tag_image_data_to_image_buffer</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *image_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> image_data_len</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttag.html#GstTagImageType" title="enum GstTagImageType"><span class="type">GstTagImageType</span></a> image_type</code></em>);
+enum <a class="link" href="gst-plugins-base-libs-gsttag.html#GstTagImageType" title="enum GstTagImageType">GstTagImageType</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttag.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id587777"></a><p>
+Contains additional standardized GStreamer tag definitions for plugins
+and applications, and functions to register them with the GStreamer
+tag system.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttag.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-TRACKID:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_TRACKID</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_TRACKID "musicbrainz-trackid"
+</pre>
+<p>
+MusicBrainz track ID
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-ARTISTID:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_ARTISTID</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_ARTISTID "musicbrainz-artistid"
+</pre>
+<p>
+MusicBrainz artist ID
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-ALBUMID:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_ALBUMID</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_ALBUMID "musicbrainz-albumid"
+</pre>
+<p>
+MusicBrainz album ID
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_ALBUMARTISTID</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_ALBUMARTISTID "musicbrainz-albumartistid"
+</pre>
+<p>
+MusicBrainz album artist ID
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-TRMID:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_TRMID</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_TRMID "musicbrainz-trmid"
+</pre>
+<p>
+MusicBrainz track TRM ID
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MUSICBRAINZ-SORTNAME:CAPS"></a><h3>GST_TAG_MUSICBRAINZ_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_MUSICBRAINZ_SORTNAME GST_TAG_ARTIST_SORTNAME
+</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">GST_TAG_MUSICBRAINZ_SORTNAME</code> is deprecated and should not be used in newly-written code.</p>
+</div>
+<p>
+MusicBrainz artist sort name
+</p>
+<p>
+Deprecated. Use GST_TAG_ARTIST_SORTNAME instead.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CDDA-CDDB-DISCID:CAPS"></a><h3>GST_TAG_CDDA_CDDB_DISCID</h3>
+<pre class="programlisting">#define GST_TAG_CDDA_CDDB_DISCID "discid"
+</pre>
+<p>
+CDDB disc id in its short form (e.g. 'aa063d0f')
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS"></a><h3>GST_TAG_CDDA_CDDB_DISCID_FULL</h3>
+<pre class="programlisting">#define GST_TAG_CDDA_CDDB_DISCID_FULL "discid-full"
+</pre>
+<p>
+CDDB disc id including all details
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS"></a><h3>GST_TAG_CDDA_MUSICBRAINZ_DISCID</h3>
+<pre class="programlisting">#define GST_TAG_CDDA_MUSICBRAINZ_DISCID "musicbrainz-discid"
+</pre>
+<p>
+Musicbrainz disc id (e.g. 'ahg7JUcfR3vCYBphSDIogOOWrr0-')
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS"></a><h3>GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL</h3>
+<pre class="programlisting">#define GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL "musicbrainz-discid-full"
+</pre>
+<p>
+Musicbrainz disc id details
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CDDA-TRACK-TAGS:CAPS"></a><h3>GST_TAG_CDDA_TRACK_TAGS</h3>
+<pre class="programlisting">#define GST_TAG_CDDA_TRACK_TAGS "track-tags"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CMML-CLIP:CAPS"></a><h3>GST_TAG_CMML_CLIP</h3>
+<pre class="programlisting">#define GST_TAG_CMML_CLIP "cmml-clip"
+</pre>
+<p>
+Annodex CMML clip element tag
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CMML-HEAD:CAPS"></a><h3>GST_TAG_CMML_HEAD</h3>
+<pre class="programlisting">#define GST_TAG_CMML_HEAD "cmml-head"
+</pre>
+<p>
+Annodex CMML head element tag
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CMML-STREAM:CAPS"></a><h3>GST_TAG_CMML_STREAM</h3>
+<pre class="programlisting">#define GST_TAG_CMML_STREAM "cmml-stream"
+</pre>
+<p>
+Annodex CMML stream element tag
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS"></a><h3>GST_TAG_CAPTURING_SHUTTER_SPEED</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_SHUTTER_SPEED "capturing-shutter-speed"
+</pre>
+<p>
+Shutter speed used when capturing an image, in seconds. (fraction)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-FOCAL-RATIO:CAPS"></a><h3>GST_TAG_CAPTURING_FOCAL_RATIO</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_FOCAL_RATIO "capturing-focal-ratio"
+</pre>
+<p>
+Focal ratio (f-number) used when capturing an image. (double)
+</p>
+<p>
+The value stored is the denominator of the focal ratio (f-number).
+For example, if this tag value is 2, the focal ratio is f/2.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS"></a><h3>GST_TAG_CAPTURING_FOCAL_LENGTH</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_FOCAL_LENGTH "capturing-focal-length"
+</pre>
+<p>
+Focal length used when capturing an image, in mm. (double)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS"></a><h3>GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO "capturing-digital-zoom-ratio"
+</pre>
+<p>
+Digital zoom ratio used when capturing an image. (double)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-ISO-SPEED:CAPS"></a><h3>GST_TAG_CAPTURING_ISO_SPEED</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_ISO_SPEED "capturing-iso-speed"
+</pre>
+<p>
+ISO speed used when capturing an image. (integer)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS"></a><h3>GST_TAG_CAPTURING_EXPOSURE_PROGRAM</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_EXPOSURE_PROGRAM "capturing-exposure-program"
+</pre>
+<p>
+Type of exposure control used when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "undefined"
+ "manual"
+ "normal" - automatically controlled
+ "aperture-priority" - user selects aperture value
+ "shutter-priority" - user selects shutter speed
+ "creative" - biased towards depth of field
+ "action" - biased towards fast shutter speed
+ "portrait" - closeup, leaving background out of focus
+ "landscape" - landscape photos, background in focus
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS"></a><h3>GST_TAG_CAPTURING_EXPOSURE_MODE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_EXPOSURE_MODE "capturing-exposure-mode"
+</pre>
+<p>
+Exposure mode used when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "auto-exposure"
+ "manual-exposure"
+ "auto-bracket"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS"></a><h3>GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE "capturing-scene-capture-type"
+</pre>
+<p>
+Scene mode used when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "standard"
+ "landscape"
+ "portrait"
+ "night-scene"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS"></a><h3>GST_TAG_CAPTURING_GAIN_ADJUSTMENT</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_GAIN_ADJUSTMENT "capturing-gain-adjustment"
+</pre>
+<p>
+Gain adjustment applied to an image. (string)
+</p>
+<p>
+The allowed values are:
+ "none"
+ "low-gain-up"
+ "high-gain-up"
+ "low-gain-down"
+ "high-gain-down"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-WHITE-BALANCE:CAPS"></a><h3>GST_TAG_CAPTURING_WHITE_BALANCE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_WHITE_BALANCE "capturing-white-balance"
+</pre>
+<p>
+White balance mode used when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "auto"
+ "manual"
+ "daylight"
+ "cloudy"
+ "tungsten"
+ "fluorescent"
+ "fluorescent h" (newer daylight-calibrated fluorescents)
+ "flash"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-CONTRAST:CAPS"></a><h3>GST_TAG_CAPTURING_CONTRAST</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_CONTRAST "capturing-contrast"
+</pre>
+<p>
+Direction of contrast processing applied when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "normal"
+ "soft"
+ "hard"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-SATURATION:CAPS"></a><h3>GST_TAG_CAPTURING_SATURATION</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_SATURATION "capturing-saturation"
+</pre>
+<p>
+Direction of saturation processing applied when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "normal"
+ "low-saturation"
+ "high-saturation"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-SHARPNESS:CAPS"></a><h3>GST_TAG_CAPTURING_SHARPNESS</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_SHARPNESS "capturing-sharpness"
+</pre>
+<p>
+Direction of sharpness processing applied when capturing an image. (string)
+</p>
+<p>
+The allowed values are:
+ "normal"
+ "soft"
+ "hard"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-FLASH-FIRED:CAPS"></a><h3>GST_TAG_CAPTURING_FLASH_FIRED</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_FLASH_FIRED "capturing-flash-fired"
+</pre>
+<p>
+If flash was fired during the capture of an image. (boolean)
+</p>
+<p>
+Note that if this tag isn't present, it should not be assumed that
+the flash did not fire. It should be treated as unknown.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-FLASH-MODE:CAPS"></a><h3>GST_TAG_CAPTURING_FLASH_MODE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_FLASH_MODE "capturing-flash-mode"
+</pre>
+<p>
+The flash mode selected during the capture of an image. (string)
+</p>
+<p>
+The allowed values are:
+ "auto"
+ "always"
+ "never"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-METERING-MODE:CAPS"></a><h3>GST_TAG_CAPTURING_METERING_MODE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_METERING_MODE "capturing-metering-mode"
+</pre>
+<p>
+Defines the way a camera determines the exposure. (string)
+</p>
+<p>
+The allowed values are:
+ "unknown"
+ "average"
+ "center-weighted-average"
+ "spot"
+ "multi-spot"
+ "pattern"
+ "partial"
+ "other"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-SOURCE:CAPS"></a><h3>GST_TAG_CAPTURING_SOURCE</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_SOURCE "capturing-source"
+</pre>
+<p>
+Indicates the source of capture. The device/medium used to do the
+capture. (string)
+</p>
+<p>
+Allowed values are:
+ "dsc" (= digital still camera)
+ "transparent-scanner"
+ "reflex-scanner"
+ "other"
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS"></a><h3>GST_TAG_CAPTURING_EXPOSURE_COMPENSATION</h3>
+<pre class="programlisting">#define GST_TAG_CAPTURING_EXPOSURE_COMPENSATION "capturing-exposure-compensation"
+</pre>
+<p>
+Exposure compensation using when capturing an image in EV. (double)
+</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS"></a><h3>GST_TAG_IMAGE_HORIZONTAL_PPI</h3>
+<pre class="programlisting">#define GST_TAG_IMAGE_HORIZONTAL_PPI "image-horizontal-ppi"
+</pre>
+<p>
+Media (image/video) intended horizontal pixel density in ppi. (double)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-IMAGE-VERTICAL-PPI:CAPS"></a><h3>GST_TAG_IMAGE_VERTICAL_PPI</h3>
+<pre class="programlisting">#define GST_TAG_IMAGE_VERTICAL_PPI "image-vertical-ppi"
+</pre>
+<p>
+Media (image/video) intended vertical pixel density in ppi. (double)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ID3V2-HEADER-SIZE:CAPS"></a><h3>GST_TAG_ID3V2_HEADER_SIZE</h3>
+<pre class="programlisting">#define GST_TAG_ID3V2_HEADER_SIZE 10
+</pre>
+<p>
+ID3V2 header size considered minimum input for some functions such as
+<a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-from-id3v2-tag" title="gst_tag_list_from_id3v2_tag ()"><code class="function">gst_tag_list_from_id3v2_tag()</code></a> and <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-get-id3v2-tag-size" title="gst_tag_get_id3v2_tag_size ()"><code class="function">gst_tag_get_id3v2_tag_size()</code></a> for example.
+</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-register-musicbrainz-tags"></a><h3>gst_tag_register_musicbrainz_tags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_register_musicbrainz_tags (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Registers additional musicbrainz-specific tags with the GStreamer tag
+system. Plugins and applications that use these tags should call this
+function before using them. Can be called multiple times.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-freeform-string-to-utf8"></a><h3>gst_tag_freeform_string_to_utf8 ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_freeform_string_to_utf8 (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> size</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **env_vars</code></em>);</pre>
+<p>
+Convenience function to read a string with unknown character encoding. If
+the string is already in UTF-8 encoding, it will be returned right away.
+If not it tries to detect byte-order-mark for UTF-16/32 cases and use that.
+Otherwise, the environment will be searched for a number of environment
+variables (whose names are specified in the NULL-terminated string array
+<em class="parameter"><code>env_vars</code></em>) containing a list of character encodings to try/use. If none
+are specified, the current locale will be tried. If that also doesn't work,
+WINDOWS-1252/ISO-8859-1 is assumed (which will almost always succeed).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>string data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>length of string data, or -1 if the string is NUL-terminated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>env_vars</code></em> :</span></p></td>
+<td>a NULL-terminated string array of environment variable names,
+or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated string in UTF-8 encoding, or NULL</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-parse-extended-comment"></a><h3>gst_tag_parse_extended_comment ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_tag_parse_extended_comment (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *ext_comment</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **key</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **lang</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> fail_if_no_key</code></em>);</pre>
+<p>
+Convenience function to parse a GST_TAG_EXTENDED_COMMENT string and
+separate it into its components.
+</p>
+<p>
+If successful, <em class="parameter"><code>key</code></em>, <em class="parameter"><code>lang</code></em> and/or <em class="parameter"><code>value</code></em> will be set to newly allocated
+strings that you need to free with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done. <em class="parameter"><code>key</code></em> and <em class="parameter"><code>lang</code></em>
+may also be set to NULL by this function if there is no key or no language
+code in the extended comment string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ext_comment</code></em> :</span></p></td>
+<td>an extended comment string, see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS"><span class="type">GST_TAG_EXTENDED_COMMENT</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>return location for the comment description key, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lang</code></em> :</span></p></td>
+<td>return location for the comment ISO-639 language code, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>return location for the actual comment string, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fail_if_no_key</code></em> :</span></p></td>
+<td>whether to fail if strings are not in key=value form</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the string could be parsed, otherwise FALSE</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-image-data-to-image-buffer"></a><h3>gst_tag_image_data_to_image_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_image_data_to_image_buffer (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *image_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> image_data_len</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttag.html#GstTagImageType" title="enum GstTagImageType"><span class="type">GstTagImageType</span></a> image_type</code></em>);</pre>
+<p>
+Helper function for tag-reading plugins to create a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> suitable to
+add to a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> as an image tag (such as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-IMAGE:CAPS"><span class="type">GST_TAG_IMAGE</span></a> or
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS"><span class="type">GST_TAG_PREVIEW_IMAGE</span></a>) from the encoded image data and an (optional) image
+type.
+</p>
+<p>
+Background: cover art and other images in tags are usually stored as a
+blob of binary image data, often accompanied by a MIME type or some other
+content type string (e.g. 'png', 'jpeg', 'jpg'). Sometimes there is also an
+'image type' to indicate what kind of image this is (e.g. front cover,
+back cover, artist, etc.). The image data may also be an URI to the image
+rather than the image itself.
+</p>
+<p>
+In GStreamer, image tags are <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>s containing the raw image
+data, with the buffer caps describing the content type of the image
+(e.g. image/jpeg, image/png, text/uri-list). The buffer caps may contain
+an additional 'image-type' field of <span class="type">GST_TYPE_TAG_IMAGE_TYPE</span> to describe
+the type of image (front cover, back cover etc.). <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS"><span class="type">GST_TAG_PREVIEW_IMAGE</span></a>
+tags should not carry an image type, their type is already indicated via
+the special tag name.
+</p>
+<p>
+This function will do various checks and typefind the encoded image
+data (we can't trust the declared mime type).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_data</code></em> :</span></p></td>
+<td>the (encoded) image</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_data_len</code></em> :</span></p></td>
+<td>the length of the encoded image data at <em class="parameter"><code>image_data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_type</code></em> :</span></p></td>
+<td>type of the image, or <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-UNDEFINED:CAPS"><span class="type">GST_TAG_IMAGE_TYPE_UNDEFINED</span></a>. Pass
+<a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-NONE:CAPS"><span class="type">GST_TAG_IMAGE_TYPE_NONE</span></a> if no image type should be set at all (e.g.
+for preview images)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated image buffer for use in tag lists, or NULL</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagImageType"></a><h3>enum GstTagImageType</h3>
+<pre class="programlisting">typedef enum {
+ GST_TAG_IMAGE_TYPE_NONE = -1,
+ GST_TAG_IMAGE_TYPE_UNDEFINED = 0,
+ GST_TAG_IMAGE_TYPE_FRONT_COVER,
+ GST_TAG_IMAGE_TYPE_BACK_COVER,
+ GST_TAG_IMAGE_TYPE_LEAFLET_PAGE,
+ GST_TAG_IMAGE_TYPE_MEDIUM,
+ GST_TAG_IMAGE_TYPE_LEAD_ARTIST,
+ GST_TAG_IMAGE_TYPE_ARTIST,
+ GST_TAG_IMAGE_TYPE_CONDUCTOR,
+ GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA,
+ GST_TAG_IMAGE_TYPE_COMPOSER,
+ GST_TAG_IMAGE_TYPE_LYRICIST,
+ GST_TAG_IMAGE_TYPE_RECORDING_LOCATION,
+ GST_TAG_IMAGE_TYPE_DURING_RECORDING,
+ GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE,
+ GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE,
+ GST_TAG_IMAGE_TYPE_FISH,
+ GST_TAG_IMAGE_TYPE_ILLUSTRATION,
+ GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO,
+ GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO
+} GstTagImageType;
+</pre>
+<p>
+Type of image contained in an image tag (specified as field in
+the image buffer's caps structure)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-NONE:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_NONE</code></span></p></td>
+<td>No image type. Can be used to
+ tell functions such as <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer" title="gst_tag_image_data_to_image_buffer ()"><code class="function">gst_tag_image_data_to_image_buffer()</code></a> that no
+ image type should be set. (Since: 0.10.20)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-UNDEFINED:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_UNDEFINED</code></span></p></td>
+<td>Undefined/other image type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-FRONT-COVER:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_FRONT_COVER</code></span></p></td>
+<td>Cover (front)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-BACK-COVER:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_BACK_COVER</code></span></p></td>
+<td>Cover (back)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-LEAFLET-PAGE:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_LEAFLET_PAGE</code></span></p></td>
+<td>Leaflet page
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-MEDIUM:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_MEDIUM</code></span></p></td>
+<td>Medium (e.g. label side of CD)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-LEAD-ARTIST:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_LEAD_ARTIST</code></span></p></td>
+<td>Lead artist/lead performer/soloist
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-ARTIST:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_ARTIST</code></span></p></td>
+<td>Artist/performer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-CONDUCTOR:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_CONDUCTOR</code></span></p></td>
+<td>Conductor
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-BAND-ORCHESTRA:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA</code></span></p></td>
+<td>Band/orchestra
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-COMPOSER:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_COMPOSER</code></span></p></td>
+<td>Composer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-LYRICIST:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_LYRICIST</code></span></p></td>
+<td>Lyricist/text writer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-RECORDING-LOCATION:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_RECORDING_LOCATION</code></span></p></td>
+<td>Recording location
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-DURING-RECORDING:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_DURING_RECORDING</code></span></p></td>
+<td>During recording
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-DURING-PERFORMANCE:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE</code></span></p></td>
+<td>During performance
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-VIDEO-CAPTURE:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE</code></span></p></td>
+<td>Movie/video screen capture
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-FISH:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_FISH</code></span></p></td>
+<td>A fish as funny as the ID3v2 spec
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-ILLUSTRATION:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_ILLUSTRATION</code></span></p></td>
+<td>Illustration
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-BAND-ARTIST-LOGO:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO</code></span></p></td>
+<td>Band/artist logotype
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-IMAGE-TYPE-PUBLISHER-STUDIO-LOGO:CAPS"></a><span class="term"><code class="literal">GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO</code></span></p></td>
+<td>Publisher/studio logotype
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.9</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttag.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagdemux.html b/docs/libs/html/gst-plugins-base-libs-gsttagdemux.html
new file mode 100644
index 0000000..95d183c
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagdemux.html
@@ -0,0 +1,248 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagdemux</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">
+<link rel="next" href="gst-plugins-base-libs-gsttagmux.html" title="gsttagmux">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagxmpwriter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagmux.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagdemux.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagdemux.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagdemux"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagdemux.top_of_page"></a>gsttagdemux</span></h2>
+<p>gsttagdemux — Base class for demuxing tags that are in chunks
+ directly at the beginning or at the end of a file</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagdemux.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/gsttagdemux.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemux" title="struct GstTagDemux">GstTagDemux</a>;
+struct <a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxClass" title="struct GstTagDemuxClass">GstTagDemuxClass</a>;
+enum <a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxResult" title="enum GstTagDemuxResult">GstTagDemuxResult</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagdemux.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id453782"></a><h3>Deriving from GstTagDemux</h3>
+<p>
+Provides a base class for demuxing tags at the beginning or end of a
+stream and handles things like typefinding, querying, seeking, and
+different modes of operation (chain-based, pull_range-based, and providing
+downstream elements with random access if upstream supports that). The tag
+is stripped from the output, and all offsets are adjusted for the tag
+sizes, so that to the downstream element the stream will appear as if
+there was no tag at all. Also, once the tag has been parsed, GstTagDemux
+will try to determine the media type of the resulting stream and add a
+source pad with the appropriate caps in order to facilitate auto-plugging.
+</p>
+<p>
+Subclasses have to do four things:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ In their base init function, they must add a pad template for the sink
+ pad to the element class, describing the media type they can parse in
+ the caps of the pad template.
+ </p></li>
+<li class="listitem"><p>
+ In their class init function, they must override
+ GST_TAG_DEMUX_CLASS(demux_klass)-&gt;identify_tag with their own identify
+ function.
+ </p></li>
+<li class="listitem"><p>
+ In their class init function, they must override
+ GST_TAG_DEMUX_CLASS(demux_klass)-&gt;parse_tag with their own parse
+ function.
+ </p></li>
+<li class="listitem"><p>
+ In their class init function, they must also set
+ GST_TAG_DEMUX_CLASS(demux_klass)-&gt;min_start_size and/or
+ GST_TAG_DEMUX_CLASS(demux_klass)-&gt;min_end_size to the minimum size required
+ for the identify function to decide whether the stream has a supported tag
+ or not. A class parsing ID3v1 tags, for example, would set min_end_size to
+ 128 bytes.
+ </p></li>
+</ul></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagdemux.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTagDemux"></a><h3>struct GstTagDemux</h3>
+<pre class="programlisting">struct GstTagDemux {
+ GstElement element;
+};
+</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemux" title="struct GstTagDemux"><span class="type">GstTagDemux</span></a> structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> <em class="structfield"><code><a name="GstTagDemux.element"></a>element</code></em>;</span></p></td>
+<td>parent element</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagDemuxClass"></a><h3>struct GstTagDemuxClass</h3>
+<pre class="programlisting">struct GstTagDemuxClass {
+ GstElementClass parent_class;
+
+ /* minimum size required to identify a tag at the start and determine
+ * its total size */
+ guint min_start_size;
+
+ /* minimum size required to identify a tag at the end and determine
+ * its total size */
+ guint min_end_size;
+
+ /* vtable */
+
+ /* identify tag and determine the size required to parse the tag */
+ gboolean (*identify_tag) (GstTagDemux * demux,
+ GstBuffer * buffer,
+ gboolean start_tag,
+ guint * tag_size);
+
+ /* parse the tag once it is identified and its size is known */
+ GstTagDemuxResult (*parse_tag) (GstTagDemux * demux,
+ GstBuffer * buffer,
+ gboolean start_tag,
+ guint * tag_size,
+ GstTagList ** tags);
+
+ /* merge start and end tags (optional) */
+ GstTagList * (*merge_tags) (GstTagDemux * demux,
+ const GstTagList * start_tags,
+ const GstTagList * end_tags);
+};
+</pre>
+<p>
+The <a class="link" href="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxClass" title="struct GstTagDemuxClass"><span class="type">GstTagDemuxClass</span></a> structure. See documentation at beginning of section
+for details about what subclasses need to override and do.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstTagDemuxClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstTagDemuxClass.min-start-size"></a>min_start_size</code></em>;</span></p></td>
+<td>minimum size required to identify a tag at the start and
+determine its total size. Set to 0 if not interested in start tags.
+Subclasses should set this in their class_init function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstTagDemuxClass.min-end-size"></a>min_end_size</code></em>;</span></p></td>
+<td>minimum size required to identify a tag at the end and
+determine its total size. Set to 0 if not interested in end tags.
+Subclasses should set this in their class_init function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTagDemuxClass.identify-tag"></a>identify_tag</code></em> ()</span></p></td>
+<td>identify tag and determine the size required to parse the
+tag. Buffer may be larger than the specified minimum size.
+Subclassed MUST override this vfunc in their class_init function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTagDemuxClass.parse-tag"></a>parse_tag</code></em> ()</span></p></td>
+<td>parse the tag. Buffer will be exactly of the size determined by
+the identify_tag vfunc before. The parse_tag vfunc may change the size
+stored in *tag_size and return GST_TAG_DEMUX_RESULT_AGAIN to request a
+larger or smaller buffer. It is also permitted to adjust the tag_size to a
+smaller value and then return GST_TAG_DEMUX_RESULT_OK in one go.
+Subclassed MUST override the parse_tag vfunc in their class_init function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTagDemuxClass.merge-tags"></a>merge_tags</code></em> ()</span></p></td>
+<td>merge start and end tags. Subclasses may want to override this
+vfunc to allow prioritising of start or end tag according to user
+preference. Note that both start_tags and end_tags may be NULL. By default
+start tags are prefered over end tags.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagDemuxResult"></a><h3>enum GstTagDemuxResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_TAG_DEMUX_RESULT_BROKEN_TAG,
+ GST_TAG_DEMUX_RESULT_AGAIN,
+ GST_TAG_DEMUX_RESULT_OK
+} GstTagDemuxResult;
+</pre>
+<p>
+Result values from the parse_tag virtual function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TAG-DEMUX-RESULT-BROKEN-TAG:CAPS"></a><span class="term"><code class="literal">GST_TAG_DEMUX_RESULT_BROKEN_TAG</code></span></p></td>
+<td>cannot parse tag, just skip it
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-DEMUX-RESULT-AGAIN:CAPS"></a><span class="term"><code class="literal">GST_TAG_DEMUX_RESULT_AGAIN</code></span></p></td>
+<td>call again with less or more data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-DEMUX-RESULT-OK:CAPS"></a><span class="term"><code class="literal">GST_TAG_DEMUX_RESULT_OK</code></span></p></td>
+<td>parsed tag successfully
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagdemux.see-also"></a><h2>See Also</h2>
+GstApeDemux, GstID3Demux
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagexif.html b/docs/libs/html/gst-plugins-base-libs-gsttagexif.html
new file mode 100644
index 0000000..b2d6b90
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagexif.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagexif</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">
+<link rel="next" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagid3.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagxmp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagexif.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagexif.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagexif"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagexif.top_of_page"></a>gsttagexif</span></h2>
+<p>gsttagexif — tag mappings and support functions for plugins
+ dealing with exif tags</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagexif.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer" title="gst_tag_list_to_exif_buffer ()">gst_tag_list_to_exif_buffer</a> (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> byte_order</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> base_offset</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer-with-tiff-header" title="gst_tag_list_to_exif_buffer_with_tiff_header ()">gst_tag_list_to_exif_buffer_with_tiff_header</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer" title="gst_tag_list_from_exif_buffer ()">gst_tag_list_from_exif_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> byte_order</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> base_offset</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer-with-tiff-header" title="gst_tag_list_from_exif_buffer_with_tiff_header ()">gst_tag_list_from_exif_buffer_with_tiff_header</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagexif.description"></a><h2>Description</h2>
+<p>
+Contains utility function to parse <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>s from exif
+buffers and to create exif buffers from <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>s
+</p>
+<p>
+Note that next IFD fields on the created exif buffers are set to 0.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagexif.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-list-to-exif-buffer"></a><h3>gst_tag_list_to_exif_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_list_to_exif_buffer (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> byte_order</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> base_offset</code></em>);</pre>
+<p>
+Formats the tags in taglist on exif format. The resulting buffer contains
+the tags IFD and is followed by the data pointed by the tag entries.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>taglist</code></em> :</span></p></td>
+<td>The taglist</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>byte_order</code></em> :</span></p></td>
+<td>byte order used in writing (G_LITTLE_ENDIAN or G_BIG_ENDIAN)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>base_offset</code></em> :</span></p></td>
+<td>Offset from the tiff header first byte</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A GstBuffer containing the tag entries followed by the tag data</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-to-exif-buffer-with-tiff-header"></a><h3>gst_tag_list_to_exif_buffer_with_tiff_header ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_list_to_exif_buffer_with_tiff_header
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>);</pre>
+<p>
+Formats the tags in taglist into exif structure, a tiff header
+is put in the beginning of the buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>taglist</code></em> :</span></p></td>
+<td>The taglist</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A GstBuffer containing the data</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-from-exif-buffer"></a><h3>gst_tag_list_from_exif_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_from_exif_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> byte_order</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> base_offset</code></em>);</pre>
+<p>
+Parses the IFD and IFD tags data contained in the buffer and puts it
+on a taglist. The base_offset is used to subtract from the offset in
+the tag entries and be able to get the offset relative to the buffer
+start
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>The exif buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>byte_order</code></em> :</span></p></td>
+<td>byte order of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>base_offset</code></em> :</span></p></td>
+<td>Offset from the tiff header to this buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The parsed taglist</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-from-exif-buffer-with-tiff-header"></a><h3>gst_tag_list_from_exif_buffer_with_tiff_header ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_from_exif_buffer_with_tiff_header
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Parses the exif tags starting with a tiff header structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>The exif buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The taglist</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagexif.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagid3.html b/docs/libs/html/gst-plugins-base-libs-gsttagid3.html
new file mode 100644
index 0000000..1032c72
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagid3.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagid3</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagvorbis.html" title="gsttagvorbis">
+<link rel="next" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagvorbis.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagexif.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagid3.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagid3.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagid3"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagid3.top_of_page"></a>gsttagid3</span></h2>
+<p>gsttagid3 — tag mappings and support functions for plugins
+ dealing with ID3v1 and ID3v2 tags</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagid3.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-count" title="gst_tag_id3_genre_count ()">gst_tag_id3_genre_count</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-get" title="gst_tag_id3_genre_get ()">gst_tag_id3_genre_get</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-new-from-id3v1" title="gst_tag_list_new_from_id3v1 ()">gst_tag_list_new_from_id3v1</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-tag" title="gst_tag_from_id3_tag ()">gst_tag_from_id3_tag</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *id3_tag</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-user-tag" title="gst_tag_from_id3_user_tag ()">gst_tag_from_id3_user_tag</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *id3_user_tag</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-to-id3-tag" title="gst_tag_to_id3_tag ()">gst_tag_to_id3_tag</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *gst_tag</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-add-id3-image" title="gst_tag_list_add_id3_image ()">gst_tag_list_add_id3_image</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *tag_list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *image_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> image_data_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id3_picture_type</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-get-id3v2-tag-size" title="gst_tag_get_id3v2_tag_size ()">gst_tag_get_id3v2_tag_size</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-from-id3v2-tag" title="gst_tag_list_from_id3v2_tag ()">gst_tag_list_from_id3v2_tag</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagid3.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id587290"></a><p>
+Contains various utility functions for plugins to parse or create
+ID3 tags and map ID3v2 identifiers to and from GStreamer identifiers.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagid3.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-id3-genre-count"></a><h3>gst_tag_id3_genre_count ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_tag_id3_genre_count (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Gets the number of ID3v1 genres that can be identified. Winamp genres are
+included.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of ID3v1 genres that can be identified</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-id3-genre-get"></a><h3>gst_tag_id3_genre_get ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_id3_genre_get (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id</code></em>);</pre>
+<p>
+Gets the ID3v1 genre name for a given ID.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>ID of genre to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the genre or NULL if no genre is associated with that ID.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-new-from-id3v1"></a><h3>gst_tag_list_new_from_id3v1 ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_new_from_id3v1 (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *data</code></em>);</pre>
+<p>
+Parses the data containing an ID3v1 tag and returns a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> from the
+parsed data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>128 bytes of data containing the ID3v1 tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new tag list or NULL if the data was not an ID3v1 tag.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-from-id3-tag"></a><h3>gst_tag_from_id3_tag ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_from_id3_tag (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *id3_tag</code></em>);</pre>
+<p>
+Looks up the GStreamer tag for a ID3v2 tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id3_tag</code></em> :</span></p></td>
+<td>ID3v2 tag to convert to GStreamer tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The corresponding GStreamer tag or NULL if none exists.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-from-id3-user-tag"></a><h3>gst_tag_from_id3_user_tag ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_from_id3_user_tag (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *id3_user_tag</code></em>);</pre>
+<p>
+Looks up the GStreamer tag for an ID3v2 user tag (e.g. description in
+TXXX frame or owner in UFID frame).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the type of ID3v2 user tag (e.g. "TXXX" or "UDIF")</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id3_user_tag</code></em> :</span></p></td>
+<td>ID3v2 user tag to convert to GStreamer tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The corresponding GStreamer tag or NULL if none exists.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-to-id3-tag"></a><h3>gst_tag_to_id3_tag ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_to_id3_tag (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *gst_tag</code></em>);</pre>
+<p>
+Looks up the ID3v2 tag for a GStreamer tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gst_tag</code></em> :</span></p></td>
+<td>GStreamer tag to convert to vorbiscomment tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The corresponding ID3v2 tag or NULL if none exists.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add-id3-image"></a><h3>gst_tag_list_add_id3_image ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_tag_list_add_id3_image (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *tag_list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *image_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> image_data_len</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id3_picture_type</code></em>);</pre>
+<p>
+Adds an image from an ID3 APIC frame (or similar, such as used in FLAC)
+to the given tag list. Also see <a class="link" href="gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer" title="gst_tag_image_data_to_image_buffer ()"><code class="function">gst_tag_image_data_to_image_buffer()</code></a> for
+more information on image tags in GStreamer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag_list</code></em> :</span></p></td>
+<td>a tag list</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_data</code></em> :</span></p></td>
+<td>the (encoded) image</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_data_len</code></em> :</span></p></td>
+<td>the length of the encoded image data at <em class="parameter"><code>image_data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id3_picture_type</code></em> :</span></p></td>
+<td>picture type as per the ID3 (v2.4.0) specification for
+the APIC frame (0 = unknown/other)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the image was processed, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-id3v2-tag-size"></a><h3>gst_tag_get_id3v2_tag_size ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> gst_tag_get_id3v2_tag_size (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Determines size of an ID3v2 tag on buffer containing at least ID3v2 header,
+i.e. at least <a class="link" href="gst-plugins-base-libs-gsttag.html#GST-TAG-ID3V2-HEADER-SIZE:CAPS" title="GST_TAG_ID3V2_HEADER_SIZE"><span class="type">GST_TAG_ID3V2_HEADER_SIZE</span></a> (10) bytes;
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>buffer holding ID3v2 tag (or at least the start of one)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Size of tag, or 0 if header is invalid or too small.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-from-id3v2-tag"></a><h3>gst_tag_list_from_id3v2_tag ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_from_id3v2_tag (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Creates a new tag list that contains the information parsed out of a
+ID3 tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>buffer to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> with all tags that could be extracted from the
+given vorbiscomment buffer or NULL on error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagid3.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttaglanguagecodes.html b/docs/libs/html/gst-plugins-base-libs-gsttaglanguagecodes.html
new file mode 100644
index 0000000..6544dc8
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttaglanguagecodes.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttaglanguagecodes</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagmux.html" title="gsttagmux">
+<link rel="next" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagmux.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttaglicenses.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttaglanguagecodes.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttaglanguagecodes.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttaglanguagecodes"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttaglanguagecodes.top_of_page"></a>gsttaglanguagecodes</span></h2>
+<p>gsttaglanguagecodes — mappings for ISO-639 language codes and names</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttaglanguagecodes.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-codes" title="gst_tag_get_language_codes ()">gst_tag_get_language_codes</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-name" title="gst_tag_get_language_name ()">gst_tag_get_language_name</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *language_code</code></em>);
+#define <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code" title="gst_tag_get_language_code()">gst_tag_get_language_code</a> (lang_code)
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-1" title="gst_tag_get_language_code_iso_639_1 ()">gst_tag_get_language_code_iso_639_1</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2B" title="gst_tag_get_language_code_iso_639_2B ()">gst_tag_get_language_code_iso_639_2B</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2T" title="gst_tag_get_language_code_iso_639_2T ()">gst_tag_get_language_code_iso_639_2T</a>
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglanguagecodes.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id577297"></a><p>
+Provides helper functions to convert between the various ISO-639 language
+codes, and to map language codes to language names.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglanguagecodes.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-get-language-codes"></a><h3>gst_tag_get_language_codes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** gst_tag_get_language_codes (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns a list of known language codes (in form of two-letter ISO-639-1
+codes). This is useful for UIs to build a list of available languages for
+tagging purposes (e.g. to tag an audio track appropriately in a video or
+audio editor).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>NULL-terminated string array with two-letter language codes. Free
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strfreev"><code class="function">g_strfreev()</code></a> when no longer needed.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-language-name"></a><h3>gst_tag_get_language_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_language_name (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *language_code</code></em>);</pre>
+<p>
+Returns the name of the language given an ISO-639 language code, such
+as often found in a GST_TAG_LANGUAGE tag. The name will be translated
+according to the current locale (if the library was built against the
+iso-codes package, otherwise the English name will be returned).
+</p>
+<p>
+Language codes are case-sensitive and expected to be lower case.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>language_code</code></em> :</span></p></td>
+<td>two or three-letter ISO-639 language code</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>language name in UTF-8 format, or NULL if <em class="parameter"><code>language_code</code></em> could
+not be mapped to a language name. The returned string must not be
+modified and does not need to freed; it will stay valid until the
+application is terminated.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-language-code"></a><h3>gst_tag_get_language_code()</h3>
+<pre class="programlisting">#define gst_tag_get_language_code(lang_code)</pre>
+<p>
+Convenience macro wrapping <a class="link" href="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-1" title="gst_tag_get_language_code_iso_639_1 ()"><code class="function">gst_tag_get_language_code_iso_639_1()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>lang_code</code></em> :</span></p></td>
+<td>ISO-639 language code (e.g. "deu" or "ger" or "de")</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-language-code-iso-639-1"></a><h3>gst_tag_get_language_code_iso_639_1 ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_language_code_iso_639_1 (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);</pre>
+<p>
+Returns two-letter ISO-639-1 language code given a three-letter ISO-639-2
+language code or two-letter ISO-639-1 language code (both are accepted for
+convenience).
+</p>
+<p>
+Language codes are case-sensitive and expected to be lower case.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lang_code</code></em> :</span></p></td>
+<td>ISO-639 language code (e.g. "deu" or "ger" or "de")</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>two-letter ISO-639-1 language code string that maps to <em class="parameter"><code>lang_code</code></em>,
+or NULL if no mapping is known. The returned string must not be
+modified or freed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-language-code-iso-639-2B"></a><h3>gst_tag_get_language_code_iso_639_2B ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_language_code_iso_639_2B
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);</pre>
+<p>
+Returns three-letter ISO-639-2 "bibliographic" language code given a
+two-letter ISO-639-1 language code or a three-letter ISO-639-2 language
+code (both are accepted for convenience).
+</p>
+<p>
+The "bibliographic" code is derived from the English name of the language
+(e.g. "ger" for German instead of "de" or "deu"). In most scenarios, the
+"terminological" codes are prefered.
+</p>
+<p>
+Language codes are case-sensitive and expected to be lower case.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lang_code</code></em> :</span></p></td>
+<td>ISO-639 language code (e.g. "deu" or "ger" or "de")</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>three-letter ISO-639-2 language code string that maps to <em class="parameter"><code>lang_code</code></em>,
+or NULL if no mapping is known. The returned string must not be
+modified or freed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-language-code-iso-639-2T"></a><h3>gst_tag_get_language_code_iso_639_2T ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_language_code_iso_639_2T
+ (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *lang_code</code></em>);</pre>
+<p>
+Returns three-letter ISO-639-2 "terminological" language code given a
+two-letter ISO-639-1 language code or a three-letter ISO-639-2 language
+code (both are accepted for convenience).
+</p>
+<p>
+The "terminological" code is derived from the local name of the language
+(e.g. "deu" for German instead of "ger"). In most scenarios, the
+"terminological" codes are prefered over the "bibliographic" ones.
+</p>
+<p>
+Language codes are case-sensitive and expected to be lower case.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lang_code</code></em> :</span></p></td>
+<td>ISO-639 language code (e.g. "deu" or "ger" or "de")</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>three-letter ISO-639-2 language code string that maps to <em class="parameter"><code>lang_code</code></em>,
+or NULL if no mapping is known. The returned string must not be
+modified or freed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglanguagecodes.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttaglicenses.html b/docs/libs/html/gst-plugins-base-libs-gsttaglicenses.html
new file mode 100644
index 0000000..402caa9
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttaglicenses.html
@@ -0,0 +1,367 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttaglicenses</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">
+<link rel="next" href="gstreamer-base-utils.html" title="Base Utils Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttaglanguagecodes.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-base-utils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttaglicenses.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttaglicenses.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttaglicenses"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttaglicenses.top_of_page"></a>gsttaglicenses</span></h2>
+<p>gsttaglicenses — utility functions for Creative Commons licenses</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttaglicenses.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+enum <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags" title="enum GstTagLicenseFlags">GstTagLicenseFlags</a>;
+<a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags" title="enum GstTagLicenseFlags"><span class="returnvalue">GstTagLicenseFlags</span></a> <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-flags" title="gst_tag_get_license_flags ()">gst_tag_get_license_flags</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-nick" title="gst_tag_get_license_nick ()">gst_tag_get_license_nick</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-title" title="gst_tag_get_license_title ()">gst_tag_get_license_title</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-description" title="gst_tag_get_license_description ()">gst_tag_get_license_description</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-jurisdiction" title="gst_tag_get_license_jurisdiction ()">gst_tag_get_license_jurisdiction</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-version" title="gst_tag_get_license_version ()">gst_tag_get_license_version</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** <a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-licenses" title="gst_tag_get_licenses ()">gst_tag_get_licenses</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglicenses.description"></a><h2>Description</h2>
+<p>
+Provides information about Creative Commons media licenses, which are
+often expressed in media files as a license URI in tags. Also useful
+for applications creating media files, in case the user wants to license
+the content under a Creative Commons license.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglicenses.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTagLicenseFlags"></a><h3>enum GstTagLicenseFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_TAG_LICENSE_PERMITS_REPRODUCTION = (1 &lt;&lt; 0),
+ GST_TAG_LICENSE_PERMITS_DISTRIBUTION = (1 &lt;&lt; 1),
+ GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS = (1 &lt;&lt; 2),
+ GST_TAG_LICENSE_PERMITS_SHARING = (1 &lt;&lt; 3),
+
+ GST_TAG_LICENSE_REQUIRES_NOTICE = (1 &lt;&lt; 8),
+ GST_TAG_LICENSE_REQUIRES_ATTRIBUTION = (1 &lt;&lt; 9),
+ GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE = (1 &lt;&lt; 10),
+ GST_TAG_LICENSE_REQUIRES_SOURCE_CODE = (1 &lt;&lt; 11),
+ GST_TAG_LICENSE_REQUIRES_COPYLEFT = (1 &lt;&lt; 12),
+ GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT = (1 &lt;&lt; 13),
+
+ GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE = (1 &lt;&lt; 16),
+ GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE = (1 &lt;&lt; 17),
+
+ GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE = (1 &lt;&lt; 24),
+ GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE = (1 &lt;&lt; 25)
+} GstTagLicenseFlags;
+</pre>
+<p>
+See http://creativecommons.org/ns for more information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PERMITS-REPRODUCTION:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PERMITS_REPRODUCTION</code></span></p></td>
+<td>making multiple copies
+ is allowed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PERMITS-DISTRIBUTION:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PERMITS_DISTRIBUTION</code></span></p></td>
+<td>distribution, public display
+ and public performance are allowed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PERMITS-DERIVATIVE-WORKS:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS</code></span></p></td>
+<td>distribution of derivative
+ works is allowed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PERMITS-SHARING:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PERMITS_SHARING</code></span></p></td>
+<td>commercial derivatives are allowed,
+ but only non-commercial distribution is allowed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-NOTICE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_NOTICE</code></span></p></td>
+<td>copyright and license notices
+ must be kept intact
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-ATTRIBUTION:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_ATTRIBUTION</code></span></p></td>
+<td>credit must be given to
+ copyright holder and/or author
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-SHARE-ALIKE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE</code></span></p></td>
+<td>derivative works must be
+ licensed under the same terms or compatible terms as the original work
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-SOURCE-CODE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_SOURCE_CODE</code></span></p></td>
+<td>source code (the preferred
+ form for making modifications) must be provided when exercising some
+ rights granted by the license
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-COPYLEFT:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_COPYLEFT</code></span></p></td>
+<td>derivative and combined works
+ must be licensed under specified terms, similar to those of the original
+ work
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-REQUIRES-LESSER-COPYLEFT:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT</code></span></p></td>
+<td>derivative works must be
+ licensed under specified terms, with at least the same conditions as
+ the original work; combinations with the work may be licensed under
+ different terms
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PROHIBITS-COMMERCIAL-USE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE</code></span></p></td>
+<td>exercising rights for
+ commercial purposes is prohibited
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-PROHIBITS-HIGH-INCOME-NATION-USE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE</code></span></p></td>
+<td>use in a
+ non-developing country is prohibited
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-CREATIVE-COMMONS-LICENSE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE</code></span></p></td>
+<td>this license was created
+ by the Creative Commons project
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-LICENSE-FREE-SOFTWARE-FOUNDATION-LICENSE:CAPS"></a><span class="term"><code class="literal">GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE</code></span></p></td>
+<td>this license was
+ created by the Free Software Foundation (FSF)
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-flags"></a><h3>gst_tag_get_license_flags ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags" title="enum GstTagLicenseFlags"><span class="returnvalue">GstTagLicenseFlags</span></a> gst_tag_get_license_flags (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the flags of a license, which describe most of the features of
+a license in their most general form.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the flags of the license, or 0 if the license is unknown</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-nick"></a><h3>gst_tag_get_license_nick ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_license_nick (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the nick name of a license, which is a short (untranslated) string
+such as e.g. "CC BY-NC-ND 2.0 UK".
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the nick name of the license, or NULL if the license is unknown</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-title"></a><h3>gst_tag_get_license_title ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_license_title (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the title of a license, which is a short translated description
+of the license's features (generally not very pretty though).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the title of the license, or NULL if the license is unknown or
+no title is available.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-description"></a><h3>gst_tag_get_license_description ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_license_description (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the description of a license, which is a translated description
+of the license's main features.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the description of the license, or NULL if the license is unknown
+or a description is not available.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-jurisdiction"></a><h3>gst_tag_get_license_jurisdiction ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_license_jurisdiction (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the jurisdiction code of a license. This is usually a two-letter
+ISO 3166-1 alpha-2 code, but there is also the special case of Scotland,
+for which no code exists and which is thus represented as "scotland".
+</p>
+<p>
+Known jurisdictions: ar, at, au, be, bg, br, ca, ch, cl, cn, co, de,
+dk, es, fi, fr, hr, hu, il, in, it, jp, kr, mk, mt, mx, my, nl, pe, pl,
+pt, scotland, se, si, tw, uk, us, za.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the jurisdiction code of the license, or NULL if the license is
+unknown or is not specific to a particular jurisdiction.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-license-version"></a><h3>gst_tag_get_license_version ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_get_license_version (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *license_ref</code></em>);</pre>
+<p>
+Get the version of a license.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license_ref</code></em> :</span></p></td>
+<td>a license reference string in form of a URI,
+e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the version of the license, or NULL if the license is not known or
+has no version</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-licenses"></a><h3>gst_tag_get_licenses ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** gst_tag_get_licenses (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns a list of known license references (in form of URIs). This is
+useful for UIs to build a list of available licenses for tagging purposes
+(e.g. to tag an audio track appropriately in a video or audio editor, or
+an image in a camera application).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>NULL-terminated array of license strings. Free with <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strfreev"><code class="function">g_strfreev()</code></a>
+when no longer needed.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttaglicenses.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagmux.html b/docs/libs/html/gst-plugins-base-libs-gsttagmux.html
new file mode 100644
index 0000000..a46a6ff
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagmux.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagmux</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagdemux.html" title="gsttagdemux">
+<link rel="next" href="gst-plugins-base-libs-gsttaglanguagecodes.html" title="gsttaglanguagecodes">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagdemux.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttaglanguagecodes.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagmux.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagmux.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagmux"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagmux.top_of_page"></a>gsttagmux</span></h2>
+<p>gsttagmux — Base class for adding tags that are in one single chunk
+ directly at the beginning or at the end of a file</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagmux.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/gsttagmux.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMux" title="struct GstTagMux">GstTagMux</a>;
+struct <a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMuxClass" title="struct GstTagMuxClass">GstTagMuxClass</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagmux.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id428505"></a><h3>Deriving from GstTagMux</h3>
+<p>
+Provides a base class for adding tags at the beginning or end of a
+stream.
+</p>
+<p>
+Subclasses have to do the following things:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ In their base init function, they must add pad templates for the sink
+ pad and the source pad to the element class, describing the media type
+ they accept and output in the caps of the pad template.
+ </p></li>
+<li class="listitem"><p>
+ In their class init function, they must override the
+ GST_TAG_MUX_CLASS(mux_klass)-&gt;render_start_tag and/or
+ GST_TAG_MUX_CLASS(mux_klass)-&gt;render_end_tag vfuncs and set up a render
+ function.
+ </p></li>
+</ul></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+<p>
+Since 0.10.36
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagmux.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTagMux"></a><h3>struct GstTagMux</h3>
+<pre class="programlisting">struct GstTagMux {
+ GstElement element;
+};
+</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMux" title="struct GstTagMux"><span class="type">GstTagMux</span></a> structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> <em class="structfield"><code><a name="GstTagMux.element"></a>element</code></em>;</span></p></td>
+<td>parent element</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagMuxClass"></a><h3>struct GstTagMuxClass</h3>
+<pre class="programlisting">struct GstTagMuxClass {
+ GstElementClass parent_class;
+
+ /* vfuncs */
+ GstBuffer * (*render_start_tag) (GstTagMux * mux, const GstTagList * tag_list);
+ GstBuffer * (*render_end_tag) (GstTagMux * mux, const GstTagList * tag_list);
+};
+</pre>
+<p>
+The <a class="link" href="gst-plugins-base-libs-gsttagmux.html#GstTagMuxClass" title="struct GstTagMuxClass"><span class="type">GstTagMuxClass</span></a> structure. Subclasses need to override at least one
+of the two render vfuncs.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstTagMuxClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTagMuxClass.render-start-tag"></a>render_start_tag</code></em> ()</span></p></td>
+<td>create a tag buffer to add to the beginning of the
+input stream given a tag list, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTagMuxClass.render-end-tag"></a>render_end_tag</code></em> ()</span></p></td>
+<td>create a tag buffer to add to the end of the
+input stream given a tag list, or NULL</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagmux.see-also"></a><h2>See Also</h2>
+GstApeMux, GstId3Mux
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagvorbis.html b/docs/libs/html/gst-plugins-base-libs-gsttagvorbis.html
new file mode 100644
index 0000000..4076771
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagvorbis.html
@@ -0,0 +1,272 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagvorbis</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttag.html" title="gsttag">
+<link rel="next" href="gst-plugins-base-libs-gsttagid3.html" title="gsttagid3">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttag.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagid3.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagvorbis.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagvorbis.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagvorbis"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagvorbis.top_of_page"></a>gsttagvorbis</span></h2>
+<p>gsttagvorbis — tag mappings and support functions for plugins
+ dealing with vorbiscomments</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagvorbis.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-from-vorbis-tag" title="gst_tag_from_vorbis_tag ()">gst_tag_from_vorbis_tag</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *vorbis_tag</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-tag" title="gst_tag_to_vorbis_tag ()">gst_tag_to_vorbis_tag</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *gst_tag</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-vorbis-tag-add" title="gst_vorbis_tag_add ()">gst_vorbis_tag_add</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *tag</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-comments" title="gst_tag_to_vorbis_comments ()">gst_tag_to_vorbis_comments</a> (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *tag</code></em>);
+
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-from-vorbiscomment-buffer" title="gst_tag_list_from_vorbiscomment_buffer ()">gst_tag_list_from_vorbiscomment_buffer</a>
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *id_data</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id_data_length</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **vendor_string</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-to-vorbiscomment-buffer" title="gst_tag_list_to_vorbiscomment_buffer ()">gst_tag_list_to_vorbiscomment_buffer</a>
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *id_data</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id_data_length</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *vendor_string</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagvorbis.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id586856"></a><p>
+Contains various utility functions for plugins to parse or create
+vorbiscomments and map them to and from <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>s.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagvorbis.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-from-vorbis-tag"></a><h3>gst_tag_from_vorbis_tag ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_from_vorbis_tag (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *vorbis_tag</code></em>);</pre>
+<p>
+Looks up the GStreamer tag for a vorbiscomment tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vorbis_tag</code></em> :</span></p></td>
+<td>vorbiscomment tag to convert to GStreamer tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The corresponding GStreamer tag or NULL if none exists.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-to-vorbis-tag"></a><h3>gst_tag_to_vorbis_tag ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * gst_tag_to_vorbis_tag (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *gst_tag</code></em>);</pre>
+<p>
+Looks up the vorbiscomment tag for a GStreamer tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gst_tag</code></em> :</span></p></td>
+<td>GStreamer tag to convert to vorbiscomment tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The corresponding vorbiscomment tag or NULL if none exists.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-vorbis-tag-add"></a><h3>gst_vorbis_tag_add ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_vorbis_tag_add (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *tag</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *value</code></em>);</pre>
+<p>
+Convenience function using <a class="link" href="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-from-vorbis-tag" title="gst_tag_from_vorbis_tag ()"><code class="function">gst_tag_from_vorbis_tag()</code></a>, parsing
+a vorbis comment string into the right type and adding it to the
+given taglist <em class="parameter"><code>list</code></em>.
+</p>
+<p>
+Unknown vorbiscomment tags will be added to the tag list in form
+of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS"><span class="type">GST_TAG_EXTENDED_COMMENT</span></a> (since 0.10.10 at least).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>a vorbiscomment tag string (key in key=value), must be valid UTF-8</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a vorbiscomment value string (value in key=value), must be valid UTF-8</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-to-vorbis-comments"></a><h3>gst_tag_to_vorbis_comments ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_tag_to_vorbis_comments (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *tag</code></em>);</pre>
+<p>
+Creates a new tag list that contains the information parsed out of a
+vorbiscomment packet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>a GStreamer tag identifier, such as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GST-TAG-ARTIST:CAPS"><span class="type">GST_TAG_ARTIST</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of newly-allowcated key=value strings. Free with
+g_list_foreach (list, (GFunc) g_free, NULL) plus g_list_free (list)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-from-vorbiscomment-buffer"></a><h3>gst_tag_list_from_vorbiscomment_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_from_vorbiscomment_buffer
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *id_data</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id_data_length</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **vendor_string</code></em>);</pre>
+<p>
+Creates a new tag list that contains the information parsed out of a
+vorbiscomment packet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>buffer to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id_data</code></em> :</span></p></td>
+<td>identification data at start of stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id_data_length</code></em> :</span></p></td>
+<td>length of identification data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vendor_string</code></em> :</span></p></td>
+<td>pointer to a string that should take the vendor string
+of this vorbis comment or NULL if you don't need it.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> with all tags that could be extracted from the
+given vorbiscomment buffer or NULL on error.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-to-vorbiscomment-buffer"></a><h3>gst_tag_list_to_vorbiscomment_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_list_to_vorbiscomment_buffer
+ (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> *id_data</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> id_data_length</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *vendor_string</code></em>);</pre>
+<p>
+Creates a new vorbiscomment buffer from a tag list.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>tag list to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id_data</code></em> :</span></p></td>
+<td>identification data at start of stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id_data_length</code></em> :</span></p></td>
+<td>length of identification data, may be 0 if <em class="parameter"><code>id_data</code></em> is NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>vendor_string</code></em> :</span></p></td>
+<td>string that describes the vendor string or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing a vorbiscomment buffer with all tags
+that could be converted from the given tag list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagvorbis.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagxmp.html b/docs/libs/html/gst-plugins-base-libs-gsttagxmp.html
new file mode 100644
index 0000000..84bca1f
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagxmp.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagxmp</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagexif.html" title="gsttagexif">
+<link rel="next" href="gst-plugins-base-libs-gsttagxmpwriter.html" title="gsttagxmpwriter">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagexif.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagxmpwriter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagxmp.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagxmp.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagxmp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagxmp.top_of_page"></a>gsttagxmp</span></h2>
+<p>gsttagxmp — tag mappings and support functions for plugins
+ dealing with xmp packets</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagxmp.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/tag/tag.h&gt;
+
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-from-xmp-buffer" title="gst_tag_list_from_xmp_buffer ()">gst_tag_list_from_xmp_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer" title="gst_tag_list_to_xmp_buffer ()">gst_tag_list_to_xmp_buffer</a> (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer-full" title="gst_tag_list_to_xmp_buffer_full ()">gst_tag_list_to_xmp_buffer_full</a> (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **schemas</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** <a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-xmp-list-schemas" title="gst_tag_xmp_list_schemas ()">gst_tag_xmp_list_schemas</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagxmp.description"></a><h2>Description</h2>
+<p>
+Contains various utility functions for plugins to parse or create
+xmp packets and map them to and from <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>s.
+</p>
+<p>
+Please note that the xmp parser is very lightweight and not strict at all.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagxmp.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-list-from-xmp-buffer"></a><h3>gst_tag_list_from_xmp_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_from_xmp_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Parse a xmp packet into a taglist.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>new taglist or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, free the list when done</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-to-xmp-buffer"></a><h3>gst_tag_list_to_xmp_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_list_to_xmp_buffer (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>);</pre>
+<p>
+Formats a taglist as a xmp packet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>tags</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>read_only</code></em> :</span></p></td>
+<td>does the container forbid inplace editing</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>new buffer or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, unref the buffer when done</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-to-xmp-buffer-full"></a><h3>gst_tag_list_to_xmp_buffer_full ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_list_to_xmp_buffer_full (<em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **schemas</code></em>);</pre>
+<p>
+Formats a taglist as a xmp packet using only the selected
+schemas. An empty list (<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>) means that all schemas should
+be used
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>tags</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>read_only</code></em> :</span></p></td>
+<td>does the container forbid inplace editing</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>schemas</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated array of schemas to be used on serialization</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>new buffer or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, unref the buffer when done</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-list-schemas"></a><h3>gst_tag_xmp_list_schemas ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> ** gst_tag_xmp_list_schemas (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Gets the list of supported schemas in the xmp lib
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated array of strings with the schema names</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagxmp.see-also"></a><h2>See Also</h2>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttagxmpwriter.html b/docs/libs/html/gst-plugins-base-libs-gsttagxmpwriter.html
new file mode 100644
index 0000000..d56548a
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttagxmpwriter.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttagxmpwriter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-tag.html" title="Tag Support Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttagxmp.html" title="gsttagxmp">
+<link rel="next" href="gst-plugins-base-libs-gsttagdemux.html" title="gsttagdemux">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttagxmp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-tag.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttagdemux.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttagxmpwriter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttagxmpwriter.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttagxmpwriter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttagxmpwriter.top_of_page"></a>gsttagxmpwriter</span></h2>
+<p>gsttagxmpwriter — Interface for elements that provide XMP serialization</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttagxmpwriter.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis"><span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-all-schemas" title="gst_tag_xmp_writer_add_all_schemas ()">gst_tag_xmp_writer_add_all_schemas</a> (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-schema" title="gst_tag_xmp_writer_add_schema ()">gst_tag_xmp_writer_add_schema</a> (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-has-schema" title="gst_tag_xmp_writer_has_schema ()">gst_tag_xmp_writer_has_schema</a> (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-schema" title="gst_tag_xmp_writer_remove_schema ()">gst_tag_xmp_writer_remove_schema</a> (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-all-schemas" title="gst_tag_xmp_writer_remove_all_schemas ()">gst_tag_xmp_writer_remove_all_schemas</a>
+ (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-tag-list-to-xmp-buffer" title="gst_tag_xmp_writer_tag_list_to_xmp_buffer ()">gst_tag_xmp_writer_tag_list_to_xmp_buffer</a>
+ (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagxmpwriter.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id579853"></a><p>
+This interface is implemented by elements that are able to do XMP serialization. Examples for
+such elements are <span class="type">jifmux</span> and <span class="type">qtmux</span>.
+</p>
+<p>
+Applications can use this interface to configure which XMP schemas should be used when serializing
+tags into XMP. Schemas are represented by their names, a full list of the supported schemas can be
+obtained from <a class="link" href="gst-plugins-base-libs-gsttagxmp.html#gst-tag-xmp-list-schemas" title="gst_tag_xmp_list_schemas ()"><code class="function">gst_tag_xmp_list_schemas()</code></a>. By default, all schemas are used.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttagxmpwriter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-add-all-schemas"></a><h3>gst_tag_xmp_writer_add_all_schemas ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_xmp_writer_add_all_schemas (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>);</pre>
+<p>
+Adds all available XMP schemas to the configuration. Meaning that
+all will be used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <span class="type">GstTagXmpWriter</span>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-add-schema"></a><h3>gst_tag_xmp_writer_add_schema ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_xmp_writer_add_schema (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);</pre>
+<p>
+Adds <em class="parameter"><code>schema</code></em> to the list schemas
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <span class="type">GstTagXmpWriter</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>schema</code></em> :</span></p></td>
+<td>the schema to be added</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-has-schema"></a><h3>gst_tag_xmp_writer_has_schema ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_tag_xmp_writer_has_schema (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>schema</code></em> is going to be used
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <span class="type">GstTagXmpWriter</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>schema</code></em> :</span></p></td>
+<td>the schema to test</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if it is going to be used</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-remove-schema"></a><h3>gst_tag_xmp_writer_remove_schema ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_xmp_writer_remove_schema (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *schema</code></em>);</pre>
+<p>
+Removes a schema from the list of schemas to use. Nothing is done if
+the schema wasn't in the list
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <span class="type">GstTagXmpWriter</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>schema</code></em> :</span></p></td>
+<td>the schema to remove</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-remove-all-schemas"></a><h3>gst_tag_xmp_writer_remove_all_schemas ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_xmp_writer_remove_all_schemas
+ (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>);</pre>
+<p>
+Removes all schemas from the list of schemas to use. Meaning that no
+XMP will be generated.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <span class="type">GstTagXmpWriter</span>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-xmp-writer-tag-list-to-xmp-buffer"></a><h3>gst_tag_xmp_writer_tag_list_to_xmp_buffer ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_tag_xmp_writer_tag_list_to_xmp_buffer
+ (<em class="parameter"><code><span class="type">GstTagXmpWriter</span> *config</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> read_only</code></em>);</pre>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttuner.html b/docs/libs/html/gst-plugins-base-libs-gsttuner.html
new file mode 100644
index 0000000..249acd4
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttuner.html
@@ -0,0 +1,777 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttuner</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gststreamvolume.html" title="gststreamvolume">
+<link rel="next" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gststreamvolume.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttunerchannel.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttuner.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttuner.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttuner.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttuner.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttuner"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttuner.top_of_page"></a>gsttuner</span></h2>
+<p>gsttuner — Interface for elements providing tuner operations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttuner.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTuner"></a><pre class="synopsis">
+#include &lt;gst/interfaces/tuner.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-struct" title="GstTuner">GstTuner</a>;
+struct <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTunerClass" title="struct GstTunerClass">GstTunerClass</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-channels" title="gst_tuner_list_channels ()">gst_tuner_list_channels</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="returnvalue">GstTunerChannel</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-channel" title="gst_tuner_get_channel ()">gst_tuner_get_channel</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-channel" title="gst_tuner_set_channel ()">gst_tuner_set_channel</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-norms" title="gst_tuner_list_norms ()">gst_tuner_list_norms</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);
+<a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="returnvalue">GstTunerNorm</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-norm" title="gst_tuner_get_norm ()">gst_tuner_get_norm</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-norm" title="gst_tuner_set_norm ()">gst_tuner_set_norm</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> *norm</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="returnvalue">gulong</span></a> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-frequency" title="gst_tuner_get_frequency ()">gst_tuner_get_frequency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency" title="gst_tuner_set_frequency ()">gst_tuner_set_frequency</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> frequency</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength" title="gst_tuner_signal_strength ()">gst_tuner_signal_strength</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);
+<a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="returnvalue">GstTunerNorm</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-norm-by-name" title="gst_tuner_find_norm_by_name ()">gst_tuner_find_norm_by_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *norm</code></em>);
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="returnvalue">GstTunerChannel</span></a> * <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-channel-by-name" title="gst_tuner_find_channel_by_name ()">gst_tuner_find_channel_by_name</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *channel</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-channel-changed" title="gst_tuner_channel_changed ()">gst_tuner_channel_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-norm-changed" title="gst_tuner_norm_changed ()">gst_tuner_norm_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> *norm</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-frequency-changed" title="gst_tuner_frequency_changed ()">gst_tuner_frequency_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> frequency</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-changed" title="gst_tuner_signal_changed ()">gst_tuner_signal_changed</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> signal</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttuner.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstTuner
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttuner.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-channel-changed" title='The "channel-changed" signal'>channel-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-frequency-changed" title='The "frequency-changed" signal'>frequency-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-norm-changed" title='The "norm-changed" signal'>norm-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-signal-changed" title='The "signal-changed" signal'>signal-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttuner.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id516504"></a><p>
+The GstTuner interface is provided by elements that have the ability to
+tune into multiple input signals, for example TV or radio capture cards.
+</p>
+<p>
+The interpretation of 'tuning into' an input stream depends on the element
+implementing the interface. For v4lsrc, it might imply selection of an
+input source and/or frequency to be configured on a TV card. Another
+GstTuner implementation might be to allow selection of an active input pad
+from multiple input pads.
+</p>
+<p>
+That said, the GstTuner interface functions are biased toward the
+TV capture scenario.
+</p>
+<p>
+The general parameters provided are for configuration are:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">Selection of a current <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>. The current channel
+represents the input source (e.g. Composite, S-Video etc for TV capture).
+</li>
+<li class="listitem">The <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> for the channel. The norm chooses the
+interpretation of the incoming signal for the current channel. For example,
+PAL or NTSC, or more specific variants there-of.
+</li>
+<li class="listitem">Channel frequency. If the current channel has the ability to tune
+between multiple frequencies (if it has the GST_TUNER_CHANNEL_FREQUENCY flag)
+then the frequency can be changed/retrieved via the
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency" title="gst_tuner_set_frequency ()"><code class="function">gst_tuner_set_frequency()</code></a> and <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-frequency" title="gst_tuner_get_frequency ()"><code class="function">gst_tuner_get_frequency()</code></a> methods.
+</li>
+</ul></div>
+<p>
+</p>
+<p>
+Where applicable, the signal strength can be retrieved and/or monitored
+via a signal.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttuner.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTuner-struct"></a><h3>GstTuner</h3>
+<pre class="programlisting">typedef struct _GstTuner GstTuner;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTunerClass"></a><h3>struct GstTunerClass</h3>
+<pre class="programlisting">struct GstTunerClass {
+ GTypeInterface klass;
+
+ /* virtual functions */
+ const GList * (* list_channels) (GstTuner *tuner);
+ void (* set_channel) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ GstTunerChannel *
+ (* get_channel) (GstTuner *tuner);
+
+ const GList * (* list_norms) (GstTuner *tuner);
+ void (* set_norm) (GstTuner *tuner,
+ GstTunerNorm *norm);
+ GstTunerNorm *(* get_norm) (GstTuner *tuner);
+
+ void (* set_frequency) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+ gulong (* get_frequency) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ gint (* signal_strength) (GstTuner *tuner,
+ GstTunerChannel *channel);
+
+ /* signals */
+ void (*channel_changed) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ void (*norm_changed) (GstTuner *tuner,
+ GstTunerNorm *norm);
+ void (*frequency_changed) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+ void (*signal_changed) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gint signal);
+};
+</pre>
+<p>
+Tuner interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInterface"><span class="type">GTypeInterface</span></a> <em class="structfield"><code><a name="GstTunerClass.klass"></a>klass</code></em>;</span></p></td>
+<td>the parent interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.list-channels"></a>list_channels</code></em> ()</span></p></td>
+<td>list available channels</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.set-channel"></a>set_channel</code></em> ()</span></p></td>
+<td>set to a channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.get-channel"></a>get_channel</code></em> ()</span></p></td>
+<td>return the current channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.list-norms"></a>list_norms</code></em> ()</span></p></td>
+<td>list available norms</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.set-norm"></a>set_norm</code></em> ()</span></p></td>
+<td>set a norm</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.get-norm"></a>get_norm</code></em> ()</span></p></td>
+<td>return the current norm</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.set-frequency"></a>set_frequency</code></em> ()</span></p></td>
+<td>set the frequency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.get-frequency"></a>get_frequency</code></em> ()</span></p></td>
+<td>return the current frequency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.signal-strength"></a>signal_strength</code></em> ()</span></p></td>
+<td>get the signal strength</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.channel-changed"></a>channel_changed</code></em> ()</span></p></td>
+<td>default handler for channel changed notification</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.norm-changed"></a>norm_changed</code></em> ()</span></p></td>
+<td>default handler for norm changed notification</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.frequency-changed"></a>frequency_changed</code></em> ()</span></p></td>
+<td>default handler for frequency changed notification</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTunerClass.signal-changed"></a>signal_changed</code></em> ()</span></p></td>
+<td>default handler for signal-strength changed notification</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-list-channels"></a><h3>gst_tuner_list_channels ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_tuner_list_channels (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);</pre>
+<p>
+Retrieve a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannels</span></a> available
+(e.g. 'composite', 's-video', ...) from the given tuner object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to get the channels from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of channels available on this tuner. The list is
+owned by the GstTuner and must not be freed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-get-channel"></a><h3>gst_tuner_get_channel ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="returnvalue">GstTunerChannel</span></a> * gst_tuner_get_channel (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);</pre>
+<p>
+Retrieve the current channel from the tuner.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to get the current channel from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current channel of the tuner object.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-set-channel"></a><h3>gst_tuner_set_channel ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_set_channel (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);</pre>
+<p>
+Tunes the object to the given channel, which should be one of the
+channels returned by <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-channels" title="gst_tuner_list_channels ()"><code class="function">gst_tuner_list_channels()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>the channel to tune to.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-list-norms"></a><h3>gst_tuner_list_norms ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_tuner_list_norms (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);</pre>
+<p>
+Retrieve a GList of available <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> settings for the currently
+tuned channel on the given tuner object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (*a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to get the list of norms from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list of norms available on the current channel for this
+tuner object. The list is owned by the GstTuner and must not
+be freed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-get-norm"></a><h3>gst_tuner_get_norm ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="returnvalue">GstTunerNorm</span></a> * gst_tuner_get_norm (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>);</pre>
+<p>
+Get the current video norm from the given tuner object for the
+currently selected channel.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to get the current norm from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current norm.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-set-norm"></a><h3>gst_tuner_set_norm ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_set_norm (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> *norm</code></em>);</pre>
+<p>
+Changes the video norm on this tuner to the given norm, which should be
+one of the norms returned by <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-norms" title="gst_tuner_list_norms ()"><code class="function">gst_tuner_list_norms()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) to set the norm on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>norm</code></em> :</span></p></td>
+<td>the norm to use for the current channel.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-get-frequency"></a><h3>gst_tuner_get_frequency ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="returnvalue">gulong</span></a> gst_tuner_get_frequency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);</pre>
+<p>
+Retrieve the current frequency from the given channel. As for
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency" title="gst_tuner_set_frequency ()"><code class="function">gst_tuner_set_frequency()</code></a>, the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> must support frequency
+operations, as indicated by the GST_TUNER_CHANNEL_FREQUENCY flag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the given channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> to retrieve the frequency from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current frequency, or 0 on error.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-set-frequency"></a><h3>gst_tuner_set_frequency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_set_frequency (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> frequency</code></em>);</pre>
+<p>
+Sets a tuning frequency on the given tuner/channel. Note that this
+requires the given channel to be a "tuning" channel, which can be
+checked using <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS" title="GST_TUNER_CHANNEL_HAS_FLAG()"><code class="function">GST_TUNER_CHANNEL_HAS_FLAG()</code></a>, with the proper flag
+being GST_TUNER_CHANNEL_FREQUENCY.
+</p>
+<p>
+The frequency is in Hz, with minimum steps indicated by the
+frequency_multiplicator provided in the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>. The
+valid range is provided in the min_frequency and max_frequency properties
+of the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the given channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> to set the frequency on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frequency</code></em> :</span></p></td>
+<td>The frequency to tune in to.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-signal-strength"></a><h3>gst_tuner_signal_strength ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> gst_tuner_signal_strength (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);</pre>
+<p>
+Get the strength of the signal on this channel. Note that this
+requires the current channel to be a "tuning" channel, i.e. a
+channel on which frequency can be set. This can be checked using
+<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS" title="GST_TUNER_CHANNEL_HAS_FLAG()"><code class="function">GST_TUNER_CHANNEL_HAS_FLAG()</code></a>, and the appropriate flag to check
+for is GST_TUNER_CHANNEL_FREQUENCY.
+</p>
+<p>
+The valid range of the signal strength is indicated in the
+min_signal and max_signal properties of the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> (a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>) that owns the given channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> to get the signal strength from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Signal strength, or 0 on error.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-find-norm-by-name"></a><h3>gst_tuner_find_norm_by_name ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="returnvalue">GstTunerNorm</span></a> * gst_tuner_find_norm_by_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *norm</code></em>);</pre>
+<p>
+Look up a <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> by name.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>norm</code></em> :</span></p></td>
+<td>A string containing the name of a <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a>, or NULL if no norm with the provided name
+is available.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-find-channel-by-name"></a><h3>gst_tuner_find_channel_by_name ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="returnvalue">GstTunerChannel</span></a> * gst_tuner_find_channel_by_name (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *channel</code></em>);</pre>
+<p>
+Look up a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> by name.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A string containing the name of a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>, or NULL if no channel with the provided name
+is available.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-channel-changed"></a><h3>gst_tuner_channel_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_channel_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>);</pre>
+<p>
+Called by elements implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface when the
+current channel changes. Fires the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-channel-changed" title='The "channel-changed" signal'><span class="type">"channel-changed"</span></a> signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> instance</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-norm-changed"></a><h3>gst_tuner_norm_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_norm_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> *norm</code></em>);</pre>
+<p>
+Called by elements implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface when the
+current norm changes. Fires the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-norm-changed" title='The "norm-changed" signal'><span class="type">"norm-changed"</span></a> signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>norm</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> instance</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-frequency-changed"></a><h3>gst_tuner_frequency_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_frequency_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> frequency</code></em>);</pre>
+<p>
+Called by elements implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface when the
+configured frequency changes. Fires the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-frequency-changed" title='The "frequency-changed" signal'><span class="type">"frequency-changed"</span></a>
+signal on the tuner, and the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-frequency-changed" title='The "frequency-changed" signal'><span class="type">"frequency-changed"</span></a> signal
+on the channel.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The current <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frequency</code></em> :</span></p></td>
+<td>The new frequency setting</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tuner-signal-changed"></a><h3>gst_tuner_signal_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tuner_signal_changed (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> signal</code></em>);</pre>
+<p>
+Called by elements implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface when the
+incoming signal strength changes. Fires the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner-signal-changed" title='The "signal-changed" signal'><span class="type">"signal-changed"</span></a>
+signal on the tuner and the <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-signal-changed" title='The "signal-changed" signal'><span class="type">"signal-changed"</span></a> signal on
+the channel.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The current <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>signal</code></em> :</span></p></td>
+<td>The new signal strength</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttuner.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstTuner-channel-changed"></a><h3>The <code class="literal">"channel-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner,
+ <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the current <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The element providing the GstTuner interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The new configured channel.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTuner-frequency-changed"></a><h3>The <code class="literal">"frequency-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner,
+ <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *frequency,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the current frequency has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The element providing the GstTuner interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frequency</code></em> :</span></p></td>
+<td>The new frequency (an unsigned long)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTuner-norm-changed"></a><h3>The <code class="literal">"norm-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner,
+ <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> *norm,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the current <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The element providing the GstTuner interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>norm</code></em> :</span></p></td>
+<td>The new configured norm.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTuner-signal-changed"></a><h3>The <code class="literal">"signal-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> *tuner,
+ <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *channel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> signal,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the signal strength has changed.
+</p>
+<p>
+See Also: <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength" title="gst_tuner_signal_strength ()"><code class="function">gst_tuner_signal_strength()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tuner</code></em> :</span></p></td>
+<td>The element providing the GstTuner interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>The current <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>signal</code></em> :</span></p></td>
+<td>The new signal strength (an integer)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttunerchannel.html b/docs/libs/html/gst-plugins-base-libs-gsttunerchannel.html
new file mode 100644
index 0000000..9745dc1
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttunerchannel.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttunerchannel</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttuner.html" title="gsttuner">
+<link rel="next" href="gst-plugins-base-libs-gsttunernorm.html" title="gsttunernorm">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttuner.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttunernorm.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttunerchannel.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttunerchannel.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttunerchannel.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttunerchannel.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttunerchannel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttunerchannel.top_of_page"></a>gsttunerchannel</span></h2>
+<p>gsttunerchannel — A channel from an element implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a>
+interface.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttunerchannel.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTunerChannel"></a><pre class="synopsis">
+#include &lt;gst/interfaces/tuner.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-struct" title="struct GstTunerChannel">GstTunerChannel</a>;
+enum <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags" title="enum GstTunerChannelFlags">GstTunerChannelFlags</a>;
+#define <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS" title="GST_TUNER_CHANNEL_HAS_FLAG()">GST_TUNER_CHANNEL_HAS_FLAG</a> (channel,
+ flag)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunerchannel.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstTunerChannel
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunerchannel.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-frequency-changed" title='The "frequency-changed" signal'>frequency-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-signal-changed" title='The "signal-changed" signal'>signal-changed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunerchannel.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id451732"></a><p>The <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> object is provided by an element implementing
+the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface.
+</p>
+<p>
+GstTunerChannel provides a name and flags to determine the type and
+capabilities of the channel. If the GST_TUNER_CHANNEL_FREQUENCY flag is
+set, then the channel also information about the minimum and maximum
+frequency, and range of the reported signal strength.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunerchannel.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTunerChannel-struct"></a><h3>struct GstTunerChannel</h3>
+<pre class="programlisting">struct GstTunerChannel {
+ gchar *label;
+ GstTunerChannelFlags flags;
+ gfloat freq_multiplicator;
+ gulong min_frequency;
+ gulong max_frequency;
+ gint min_signal;
+ gint max_signal;
+};
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstTunerChannel-struct.label"></a>label</code></em>;</span></p></td>
+<td>A string containing a descriptive name for this channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags" title="enum GstTunerChannelFlags"><span class="type">GstTunerChannelFlags</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.flags"></a>flags</code></em>;</span></p></td>
+<td>A set of <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags" title="enum GstTunerChannelFlags"><span class="type">GstTunerChannelFlags</span></a> for this channel</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.freq-multiplicator"></a>freq_multiplicator</code></em>;</span></p></td>
+<td>The step size (in Hz) for the frequency setting.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.min-frequency"></a>min_frequency</code></em>;</span></p></td>
+<td>Minimum valid frequency setting (in Hz).</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.max-frequency"></a>max_frequency</code></em>;</span></p></td>
+<td>Maximum valid frequency setting (in Hz).</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.min-signal"></a>min_signal</code></em>;</span></p></td>
+<td>Minimum reported signal strength value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstTunerChannel-struct.max-signal"></a>max_signal</code></em>;</span></p></td>
+<td>Maximum reported signal strength value.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTunerChannelFlags"></a><h3>enum GstTunerChannelFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_TUNER_CHANNEL_INPUT = (1&lt;&lt;0),
+ GST_TUNER_CHANNEL_OUTPUT = (1&lt;&lt;1),
+ GST_TUNER_CHANNEL_FREQUENCY = (1&lt;&lt;2),
+ GST_TUNER_CHANNEL_AUDIO = (1&lt;&lt;3)
+} GstTunerChannelFlags;
+</pre>
+<p>
+An enumeration for flags indicating the available capabilities
+of a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TUNER-CHANNEL-INPUT:CAPS"></a><span class="term"><code class="literal">GST_TUNER_CHANNEL_INPUT</code></span></p></td>
+<td>The channel is for input
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TUNER-CHANNEL-OUTPUT:CAPS"></a><span class="term"><code class="literal">GST_TUNER_CHANNEL_OUTPUT</code></span></p></td>
+<td>The channel is for output
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TUNER-CHANNEL-FREQUENCY:CAPS"></a><span class="term"><code class="literal">GST_TUNER_CHANNEL_FREQUENCY</code></span></p></td>
+<td>The channel has a frequency setting
+ and signal strength.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TUNER-CHANNEL-AUDIO:CAPS"></a><span class="term"><code class="literal">GST_TUNER_CHANNEL_AUDIO</code></span></p></td>
+<td>The channel carries audio.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TUNER-CHANNEL-HAS-FLAG:CAPS"></a><h3>GST_TUNER_CHANNEL_HAS_FLAG()</h3>
+<pre class="programlisting">#define GST_TUNER_CHANNEL_HAS_FLAG(channel, flag)</pre>
+<p>
+Macro to check if the given flag is set on a channel
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>channel</code></em> :</span></p></td>
+<td>A <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>The flag to check for</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunerchannel.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstTunerChannel-frequency-changed"></a><h3>The <code class="literal">"frequency-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *tunerchannel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> frequency,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the current frequency has changed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tunerchannel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frequency</code></em> :</span></p></td>
+<td>The new frequency (an unsigned long)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTunerChannel-signal-changed"></a><h3>The <code class="literal">"signal-changed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a> *tunerchannel,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> signal,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Reports that the signal strength has changed.
+</p>
+<p>
+See Also: <a class="link" href="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength" title="gst_tuner_signal_strength ()"><code class="function">gst_tuner_signal_strength()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tunerchannel</code></em> :</span></p></td>
+<td>The <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>signal</code></em> :</span></p></td>
+<td>The new signal strength (an integer)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gsttunernorm.html b/docs/libs/html/gst-plugins-base-libs-gsttunernorm.html
new file mode 100644
index 0000000..97b2cca
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gsttunernorm.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gsttunernorm</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttunerchannel.html" title="gsttunerchannel">
+<link rel="next" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttunerchannel.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstvideoorientation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gsttunernorm.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttunernorm.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gsttunernorm.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gsttunernorm"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gsttunernorm.top_of_page"></a>gsttunernorm</span></h2>
+<p>gsttunernorm — Encapsulates information about the data format(s)
+for a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gsttunernorm.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTunerNorm"></a><pre class="synopsis">
+#include &lt;gst/interfaces/tuner.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm-struct" title="struct GstTunerNorm">GstTunerNorm</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunernorm.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GstTunerNorm
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunernorm.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id445343"></a><p>The <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm"><span class="type">GstTunerNorm</span></a> object is created by an element implementing the
+<a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a> interface and encapsulates the selection of a capture/output format
+for a selected <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gsttunernorm.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTunerNorm-struct"></a><h3>struct GstTunerNorm</h3>
+<pre class="programlisting">struct GstTunerNorm {
+ gchar *label;
+ GValue framerate;
+};
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstTunerNorm-struct.label"></a>label</code></em>;</span></p></td>
+<td>A string containing a descriptive name for the norm</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> <em class="structfield"><code><a name="GstTunerNorm-struct.framerate"></a>framerate</code></em>;</span></p></td>
+<td>A GValue containing the framerate associated with this norm,
+if any. (May be unset).</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstvideo.html b/docs/libs/html/gst-plugins-base-libs-gstvideo.html
new file mode 100644
index 0000000..4b7f549
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstvideo.html
@@ -0,0 +1,706 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstvideo</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-video.html" title="Video Library">
+<link rel="prev" href="gstreamer-video.html" title="Video Library">
+<link rel="next" href="gst-plugins-base-libs-gstvideofilter.html" title="gstvideofilter">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gstreamer-video.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-video.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstvideofilter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstvideo.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideo.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstvideo"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstvideo.top_of_page"></a>gstvideo</span></h2>
+<p>gstvideo — Support library for video operations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstvideo.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/video/video.h&gt;
+
+#define <a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FPS-RANGE:CAPS" title="GST_VIDEO_FPS_RANGE">GST_VIDEO_FPS_RANGE</a>
+#define <a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-SIZE-RANGE:CAPS" title="GST_VIDEO_SIZE_RANGE">GST_VIDEO_SIZE_RANGE</a>
+enum <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat">GstVideoFormat</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-calculate-display-ratio" title="gst_video_calculate_display_ratio ()">gst_video_calculate_display_ratio</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *dar_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *dar_d</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_width</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_height</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_par_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_par_d</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> display_par_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> display_par_d</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-format-to-fourcc" title="gst_video_format_to_fourcc ()">gst_video_format_to_fourcc</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a> format</code></em>);
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="returnvalue">GstVideoFormat</span></a> <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-format-from-fourcc" title="gst_video_format_from_fourcc ()">gst_video_format_from_fourcc</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-parse-caps-palette" title="gst_video_parse_caps_palette ()">gst_video_parse_caps_palette</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback" title="GstVideoConvertFrameCallback ()">*GstVideoConvertFrameCallback</a>) (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> *error</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame" title="gst_video_convert_frame ()">gst_video_convert_frame</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *from_caps</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *to_caps</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame-async" title="gst_video_convert_frame_async ()">gst_video_convert_frame_async</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *from_caps</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *to_caps</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback" title="GstVideoConvertFrameCallback ()"><span class="type">GstVideoConvertFrameCallback</span></a> callback</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame" title="gst_video_event_new_still_frame ()">gst_video_event_new_still_frame</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> in_still</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-parse-still-frame" title="gst_video_event_parse_still_frame ()">gst_video_event_parse_still_frame</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *in_still</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideo.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id625709"></a><p>
+This library contains some helper functions and includes the
+videosink and videofilter base classes.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideo.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-VIDEO-FPS-RANGE:CAPS"></a><h3>GST_VIDEO_FPS_RANGE</h3>
+<pre class="programlisting">#define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VIDEO-SIZE-RANGE:CAPS"></a><h3>GST_VIDEO_SIZE_RANGE</h3>
+<pre class="programlisting">#define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoFormat"></a><h3>enum GstVideoFormat</h3>
+<pre class="programlisting">typedef enum {
+ GST_VIDEO_FORMAT_UNKNOWN,
+ GST_VIDEO_FORMAT_I420,
+ GST_VIDEO_FORMAT_YV12,
+ GST_VIDEO_FORMAT_YUY2,
+ GST_VIDEO_FORMAT_UYVY,
+ GST_VIDEO_FORMAT_AYUV,
+ GST_VIDEO_FORMAT_RGBx,
+ GST_VIDEO_FORMAT_BGRx,
+ GST_VIDEO_FORMAT_xRGB,
+ GST_VIDEO_FORMAT_xBGR,
+ GST_VIDEO_FORMAT_RGBA,
+ GST_VIDEO_FORMAT_BGRA,
+ GST_VIDEO_FORMAT_ARGB,
+ GST_VIDEO_FORMAT_ABGR,
+ GST_VIDEO_FORMAT_RGB,
+ GST_VIDEO_FORMAT_BGR,
+ GST_VIDEO_FORMAT_Y41B,
+ GST_VIDEO_FORMAT_Y42B,
+ GST_VIDEO_FORMAT_YVYU,
+ GST_VIDEO_FORMAT_Y444,
+ GST_VIDEO_FORMAT_v210,
+ GST_VIDEO_FORMAT_v216,
+ GST_VIDEO_FORMAT_NV12,
+ GST_VIDEO_FORMAT_NV21,
+ GST_VIDEO_FORMAT_GRAY8,
+ GST_VIDEO_FORMAT_GRAY16_BE,
+ GST_VIDEO_FORMAT_GRAY16_LE,
+ GST_VIDEO_FORMAT_v308,
+ GST_VIDEO_FORMAT_Y800,
+ GST_VIDEO_FORMAT_Y16,
+ GST_VIDEO_FORMAT_RGB16,
+ GST_VIDEO_FORMAT_BGR16,
+ GST_VIDEO_FORMAT_RGB15,
+ GST_VIDEO_FORMAT_BGR15,
+ GST_VIDEO_FORMAT_UYVP,
+ GST_VIDEO_FORMAT_A420,
+ GST_VIDEO_FORMAT_RGB8_PALETTED,
+ GST_VIDEO_FORMAT_YUV9,
+ GST_VIDEO_FORMAT_YVU9,
+ GST_VIDEO_FORMAT_IYU1,
+ GST_VIDEO_FORMAT_ARGB64,
+ GST_VIDEO_FORMAT_AYUV64,
+ GST_VIDEO_FORMAT_r210
+} GstVideoFormat;
+</pre>
+<p>
+Enum value describing the most common video formats.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_UNKNOWN</code></span></p></td>
+<td>Unknown or unset video format id
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-I420:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_I420</code></span></p></td>
+<td>planar 4:2:0 YUV
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-YV12:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_YV12</code></span></p></td>
+<td>planar 4:2:0 YVU (like I420 but UV planes swapped)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-YUY2:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_YUY2</code></span></p></td>
+<td>packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-UYVY:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_UYVY</code></span></p></td>
+<td>packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-AYUV:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_AYUV</code></span></p></td>
+<td>packed 4:4:4 YUV with alpha channel (A0-Y0-U0-V0 ...)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGBx"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGBx</code></span></p></td>
+<td>sparse rgb packed into 32 bit, space last
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-BGRx"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_BGRx</code></span></p></td>
+<td>sparse reverse rgb packed into 32 bit, space last
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-xRGB"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_xRGB</code></span></p></td>
+<td>sparse rgb packed into 32 bit, space first
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-xBGR"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_xBGR</code></span></p></td>
+<td>sparse reverse rgb packed into 32 bit, space first
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGBA:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGBA</code></span></p></td>
+<td>rgb with alpha channel last
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-BGRA:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_BGRA</code></span></p></td>
+<td>reverse rgb with alpha channel last
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-ARGB:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_ARGB</code></span></p></td>
+<td>rgb with alpha channel first
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-ABGR:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_ABGR</code></span></p></td>
+<td>reverse rgb with alpha channel first
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGB:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGB</code></span></p></td>
+<td>rgb
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-BGR:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_BGR</code></span></p></td>
+<td>reverse rgb
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-Y41B:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_Y41B</code></span></p></td>
+<td>planar 4:1:1 YUV (Since: 0.10.18)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-Y42B:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_Y42B</code></span></p></td>
+<td>planar 4:2:2 YUV (Since: 0.10.18)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-YVYU:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_YVYU</code></span></p></td>
+<td>packed 4:2:2 YUV (Y0-V0-Y1-U0 Y2-V2-Y3-U2 Y4 ...) (Since: 0.10.23)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-Y444:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_Y444</code></span></p></td>
+<td>planar 4:4:4 YUV (Since: 0.10.24)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-v210"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_v210</code></span></p></td>
+<td>packed 4:2:2 10-bit YUV, complex format (Since: 0.10.24)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-v216"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_v216</code></span></p></td>
+<td>packed 4:2:2 16-bit YUV, Y0-U0-Y1-V1 order (Since: 0.10.24)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-NV12:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_NV12</code></span></p></td>
+<td>planar 4:2:0 YUV with interleaved UV plane (Since: 0.10.26)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-NV21:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_NV21</code></span></p></td>
+<td>planar 4:2:0 YUV with interleaved VU plane (Since: 0.10.26)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-GRAY8:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_GRAY8</code></span></p></td>
+<td>8-bit grayscale (Since: 0.10.29)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-GRAY16-BE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_GRAY16_BE</code></span></p></td>
+<td>16-bit grayscale, most significant byte first (Since: 0.10.29)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-GRAY16-LE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_GRAY16_LE</code></span></p></td>
+<td>16-bit grayscale, least significant byte first (Since: 0.10.29)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-v308"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_v308</code></span></p></td>
+<td>packed 4:4:4 YUV (Since: 0.10.29)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-Y800:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_Y800</code></span></p></td>
+<td>same as GST_VIDEO_FORMAT_GRAY8 (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-Y16:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_Y16</code></span></p></td>
+<td>same as GST_VIDEO_FORMAT_GRAY16_LE (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGB16:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGB16</code></span></p></td>
+<td>rgb 5-6-5 bits per component (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-BGR16:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_BGR16</code></span></p></td>
+<td>reverse rgb 5-6-5 bits per component (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGB15:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGB15</code></span></p></td>
+<td>rgb 5-5-5 bits per component (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-BGR15:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_BGR15</code></span></p></td>
+<td>reverse rgb 5-5-5 bits per component (Since: 0.10.30)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-UYVP:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_UYVP</code></span></p></td>
+<td>packed 10-bit 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...) (Since: 0.10.31)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-A420:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_A420</code></span></p></td>
+<td>planar 4:4:2:0 AYUV (Since: 0.10.31)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-RGB8-PALETTED:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_RGB8_PALETTED</code></span></p></td>
+<td>8-bit paletted RGB (Since: 0.10.32)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-YUV9:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_YUV9</code></span></p></td>
+<td>planar 4:1:0 YUV (Since: 0.10.32)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-YVU9:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_YVU9</code></span></p></td>
+<td>planar 4:1:0 YUV (like YUV9 but UV planes swapped) (Since: 0.10.32)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-IYU1:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_IYU1</code></span></p></td>
+<td>packed 4:1:1 YUV (Cb-Y0-Y1-Cr-Y2-Y3 ...) (Since: 0.10.32)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-ARGB64:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_ARGB64</code></span></p></td>
+<td>rgb with alpha channel first, 16 bits per channel (Since: 0.10.33)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-AYUV64:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_AYUV64</code></span></p></td>
+<td>packed 4:4:4 YUV with alpha channel, 16 bits per channel (A0-Y0-U0-V0 ...) (Since: 0.10.33)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-FORMAT-r210"></a><span class="term"><code class="literal">GST_VIDEO_FORMAT_r210</code></span></p></td>
+<td>packed 4:4:4 RGB, 10 bits per channel (Since: 0.10.33)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-calculate-display-ratio"></a><h3>gst_video_calculate_display_ratio ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_calculate_display_ratio (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *dar_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *dar_d</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_width</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_height</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_par_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> video_par_d</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> display_par_n</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> display_par_d</code></em>);</pre>
+<p>
+Given the Pixel Aspect Ratio and size of an input video frame, and the
+pixel aspect ratio of the intended display device, calculates the actual
+display ratio the video will be rendered with.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dar_n</code></em> :</span></p></td>
+<td>Numerator of the calculated display_ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dar_d</code></em> :</span></p></td>
+<td>Denominator of the calculated display_ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_width</code></em> :</span></p></td>
+<td>Width of the video frame in pixels</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_height</code></em> :</span></p></td>
+<td>Height of the video frame in pixels</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_par_n</code></em> :</span></p></td>
+<td>Numerator of the pixel aspect ratio of the input video.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_par_d</code></em> :</span></p></td>
+<td>Denominator of the pixel aspect ratio of the input video.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>display_par_n</code></em> :</span></p></td>
+<td>Numerator of the pixel aspect ratio of the display device</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>display_par_d</code></em> :</span></p></td>
+<td>Denominator of the pixel aspect ratio of the display device</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A boolean indicating success and a calculated Display Ratio in the
+dar_n and dar_d parameters.
+The return value is FALSE in the case of integer overflow or other error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.7</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-format-to-fourcc"></a><h3>gst_video_format_to_fourcc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> gst_video_format_to_fourcc (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a> format</code></em>);</pre>
+<p>
+Converts a <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a> value into the corresponding FOURCC. Only
+a few YUV formats have corresponding FOURCC values. If <em class="parameter"><code>format</code></em> has
+no corresponding FOURCC value, 0 is returned.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a> video format</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the FOURCC corresponding to <em class="parameter"><code>format</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-format-from-fourcc"></a><h3>gst_video_format_from_fourcc ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="returnvalue">GstVideoFormat</span></a> gst_video_format_from_fourcc (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc</code></em>);</pre>
+<p>
+Converts a FOURCC value into the corresponding <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a>.
+If the FOURCC cannot be represented by <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a>,
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UNKNOWN:CAPS"><span class="type">GST_VIDEO_FORMAT_UNKNOWN</span></a> is returned.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fourcc</code></em> :</span></p></td>
+<td>a FOURCC value representing raw YUV video</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoFormat" title="enum GstVideoFormat"><span class="type">GstVideoFormat</span></a> describing the FOURCC value</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-parse-caps-palette"></a><h3>gst_video_parse_caps_palette ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_video_parse_caps_palette (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Returns the palette data from the caps as a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>. For
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB8-PALETTED:CAPS"><span class="type">GST_VIDEO_FORMAT_RGB8_PALETTED</span></a> this is containing 256 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a>
+values, each containing ARGB colors in native endianness.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the palette data. Unref after usage.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoConvertFrameCallback"></a><h3>GstVideoConvertFrameCallback ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstVideoConvertFrameCallback) (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> *error</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-convert-frame"></a><h3>gst_video_convert_frame ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_video_convert_frame (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *from_caps</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *to_caps</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Converts a raw video buffer into the specified output caps.
+</p>
+<p>
+The output caps can be any raw video formats or any image formats (jpeg, png, ...).
+</p>
+<p>
+The width, height and pixel-aspect-ratio can also be specified in the output caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>from_caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to convert from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>to_caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to convert to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>the maximum amount of time allowed for the processing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>. Can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The converted <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if an error happened (in which case <em class="parameter"><code>err</code></em>
+will point to the <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>).</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-convert-frame-async"></a><h3>gst_video_convert_frame_async ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_convert_frame_async (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *from_caps</code></em>,
+ <em class="parameter"><code>const <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *to_caps</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback" title="GstVideoConvertFrameCallback ()"><span class="type">GstVideoConvertFrameCallback</span></a> callback</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);</pre>
+<p>
+Converts a raw video buffer into the specified output caps.
+</p>
+<p>
+The output caps can be any raw video formats or any image formats (jpeg, png, ...).
+</p>
+<p>
+The width, height and pixel-aspect-ratio can also be specified in the output caps.
+</p>
+<p>
+<em class="parameter"><code>callback</code></em> will be called after conversion, when an error occured or if conversion didn't
+finish after <em class="parameter"><code>timeout</code></em>. <em class="parameter"><code>callback</code></em> will always be called from the thread default
+<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><code class="literal">GMainContext</code></a>, see <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-get-thread-default"><code class="function">g_main_context_get_thread_default()</code></a>. If GLib before 2.22 is used,
+this will always be the global default main context.
+</p>
+<p>
+<em class="parameter"><code>destroy_notify</code></em> will be called after the callback was called and <em class="parameter"><code>user_data</code></em> is not needed
+anymore.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>from_caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to convert from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>to_caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> to convert to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>the maximum amount of time allowed for the processing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callback</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback" title="GstVideoConvertFrameCallback ()"><code class="literal">GstVideoConvertFrameCallback</code></a> that will be called after conversion.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>extra data that will be passed to the <em class="parameter"><code>callback</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>destroy_notify</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><code class="literal">GDestroyNotify</code></a> to be called after <em class="parameter"><code>user_data</code></em> is not needed anymore</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-event-new-still-frame"></a><h3>gst_video_event_new_still_frame ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_video_event_new_still_frame (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> in_still</code></em>);</pre>
+<p>
+Creates a new Still Frame event. If <em class="parameter"><code>in_still</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, then the event
+represents the start of a still frame sequence. If it is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, then
+the event ends a still frame sequence.
+</p>
+<p>
+To parse an event created by <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame" title="gst_video_event_new_still_frame ()"><code class="function">gst_video_event_new_still_frame()</code></a> use
+<a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-parse-still-frame" title="gst_video_event_parse_still_frame ()"><code class="function">gst_video_event_parse_still_frame()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in_still</code></em> :</span></p></td>
+<td>boolean value for the still-frame state of the event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new GstEvent</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-event-parse-still-frame"></a><h3>gst_video_event_parse_still_frame ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_event_parse_still_frame (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *in_still</code></em>);</pre>
+<p>
+Parse a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a>, identify if it is a Still Frame event, and
+return the still-frame state from the event if it is.
+If the event represents the start of a still frame, the in_still
+variable will be set to TRUE, otherwise FALSE. It is OK to pass NULL for the
+in_still variable order to just check whether the event is a valid still-frame
+event.
+</p>
+<p>
+Create a still frame event using <a class="link" href="gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame" title="gst_video_event_new_still_frame ()"><code class="function">gst_video_event_new_still_frame()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in_still</code></em> :</span></p></td>
+<td>A boolean to receive the still-frame status from the event, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the event is a valid still-frame event. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstvideofilter.html b/docs/libs/html/gst-plugins-base-libs-gstvideofilter.html
new file mode 100644
index 0000000..b32ad9b
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstvideofilter.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstvideofilter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-video.html" title="Video Library">
+<link rel="prev" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">
+<link rel="next" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstvideo.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-video.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstvideosink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstvideofilter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideofilter.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideofilter.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstvideofilter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstvideofilter.top_of_page"></a>gstvideofilter</span></h2>
+<p>gstvideofilter — Base class for video filters</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstvideofilter.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoFilter"></a><pre class="synopsis">
+#include &lt;gst/video/gstvideofilter.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct" title="struct GstVideoFilter">GstVideoFilter</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilterClass" title="struct GstVideoFilterClass">GstVideoFilterClass</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideofilter.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstVideoFilter
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideofilter.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id583206"></a><p>
+Provides useful functions and a base class for video filters.
+</p>
+<p>
+The videofilter will by default enable QoS on the parent GstBaseTransform
+to implement frame dropping.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideofilter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoFilter-struct"></a><h3>struct GstVideoFilter</h3>
+<pre class="programlisting">struct GstVideoFilter;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoFilterClass"></a><h3>struct GstVideoFilterClass</h3>
+<pre class="programlisting">struct GstVideoFilterClass {
+ GstBaseTransformClass parent_class;
+};
+</pre>
+<p>
+The video filter class structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html#GstBaseTransformClass"><span class="type">GstBaseTransformClass</span></a> <em class="structfield"><code><a name="GstVideoFilterClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class structure</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstvideoorientation.html b/docs/libs/html/gst-plugins-base-libs-gstvideoorientation.html
new file mode 100644
index 0000000..b3d334a
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstvideoorientation.html
@@ -0,0 +1,402 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstvideoorientation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gsttunernorm.html" title="gsttunernorm">
+<link rel="next" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttunernorm.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstvideooverlay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstvideoorientation.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideoorientation.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideoorientation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstvideoorientation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstvideoorientation.top_of_page"></a>gstvideoorientation</span></h2>
+<p>gstvideoorientation — Interface for elements providing video orientation
+controls</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstvideoorientation.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoOrientation"></a><pre class="synopsis">
+#include &lt;gst/interfaces/videoorientation.h&gt;
+
+ <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation-struct" title="GstVideoOrientation">GstVideoOrientation</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientationInterface" title="struct GstVideoOrientationInterface">GstVideoOrientationInterface</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hcenter" title="gst_video_orientation_get_hcenter ()">gst_video_orientation_get_hcenter</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *center</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hflip" title="gst_video_orientation_get_hflip ()">gst_video_orientation_get_hflip</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *flip</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vcenter" title="gst_video_orientation_get_vcenter ()">gst_video_orientation_get_vcenter</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *center</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vflip" title="gst_video_orientation_get_vflip ()">gst_video_orientation_get_vflip</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *flip</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hcenter" title="gst_video_orientation_set_hcenter ()">gst_video_orientation_set_hcenter</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> center</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hflip" title="gst_video_orientation_set_hflip ()">gst_video_orientation_set_hflip</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flip</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vcenter" title="gst_video_orientation_set_vcenter ()">gst_video_orientation_set_vcenter</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> center</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vflip" title="gst_video_orientation_set_vflip ()">gst_video_orientation_set_vflip</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flip</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideoorientation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstVideoOrientation
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideoorientation.description"></a><h2>Description</h2>
+<p>
+The interface allows unified access to control flipping and autocenter
+operation of video-sources or operators.
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideoorientation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoOrientation-struct"></a><h3>GstVideoOrientation</h3>
+<pre class="programlisting">typedef struct _GstVideoOrientation GstVideoOrientation;</pre>
+<p>
+Opaque <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoOrientationInterface"></a><h3>struct GstVideoOrientationInterface</h3>
+<pre class="programlisting">struct GstVideoOrientationInterface {
+ GTypeInterface parent;
+
+ /* FIXME 0.11: fix awkward API? add some kind of get_supported flags thing
+ * and then just return booleans/int from all vfuncs requiring the caller
+ * to check the flags first */
+
+ /* virtual functions */
+ gboolean (* get_hflip) (GstVideoOrientation *video_orientation, gboolean *flip);
+ gboolean (* get_vflip) (GstVideoOrientation *video_orientation, gboolean *flip);
+ gboolean (* get_hcenter) (GstVideoOrientation *video_orientation, gint *center);
+ gboolean (* get_vcenter) (GstVideoOrientation *video_orientation, gint *center);
+
+ gboolean (* set_hflip) (GstVideoOrientation *video_orientation, gboolean flip);
+ gboolean (* set_vflip) (GstVideoOrientation *video_orientation, gboolean flip);
+ gboolean (* set_hcenter) (GstVideoOrientation *video_orientation, gint center);
+ gboolean (* set_vcenter) (GstVideoOrientation *video_orientation, gint center);
+};
+</pre>
+<p>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientationInterface" title="struct GstVideoOrientationInterface"><span class="type">GstVideoOrientationInterface</span></a> interface.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInterface"><span class="type">GTypeInterface</span></a> <em class="structfield"><code><a name="GstVideoOrientationInterface.parent"></a>parent</code></em>;</span></p></td>
+<td>parent interface type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.get-hflip"></a>get_hflip</code></em> ()</span></p></td>
+<td>virtual method to get horizontal flipping state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.get-vflip"></a>get_vflip</code></em> ()</span></p></td>
+<td>virtual method to get vertical flipping state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.get-hcenter"></a>get_hcenter</code></em> ()</span></p></td>
+<td>virtual method to get horizontal centering state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.get-vcenter"></a>get_vcenter</code></em> ()</span></p></td>
+<td>virtual method to get vertical centering state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.set-hflip"></a>set_hflip</code></em> ()</span></p></td>
+<td>virtual method to set horizontal flipping state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.set-vflip"></a>set_vflip</code></em> ()</span></p></td>
+<td>virtual method to set vertical flipping state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.set-hcenter"></a>set_hcenter</code></em> ()</span></p></td>
+<td>virtual method to set horizontal centering state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoOrientationInterface.set-vcenter"></a>set_vcenter</code></em> ()</span></p></td>
+<td>virtual method to set vertical centering state</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-get-hcenter"></a><h3>gst_video_orientation_get_hcenter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_get_hcenter (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *center</code></em>);</pre>
+<p>
+Get the horizontal centering offset from the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>center</code></em> :</span></p></td>
+<td>return location for the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports centering</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-get-hflip"></a><h3>gst_video_orientation_get_hflip ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_get_hflip (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *flip</code></em>);</pre>
+<p>
+Get the horizontal flipping state (<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for flipped) from the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flip</code></em> :</span></p></td>
+<td>return location for the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports flipping</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-get-vcenter"></a><h3>gst_video_orientation_get_vcenter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_get_vcenter (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *center</code></em>);</pre>
+<p>
+Get the vertical centering offset from the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>center</code></em> :</span></p></td>
+<td>return location for the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports centering</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-get-vflip"></a><h3>gst_video_orientation_get_vflip ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_get_vflip (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *flip</code></em>);</pre>
+<p>
+Get the vertical flipping state (<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for flipped) from the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flip</code></em> :</span></p></td>
+<td>return location for the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports flipping</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-set-hcenter"></a><h3>gst_video_orientation_set_hcenter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_set_hcenter (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> center</code></em>);</pre>
+<p>
+Set the horizontal centering offset for the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>center</code></em> :</span></p></td>
+<td>centering offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports centering</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-set-hflip"></a><h3>gst_video_orientation_set_hflip ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_set_hflip (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flip</code></em>);</pre>
+<p>
+Set the horizontal flipping state (<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for flipped) for the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flip</code></em> :</span></p></td>
+<td>use flipping</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports flipping</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-set-vcenter"></a><h3>gst_video_orientation_set_vcenter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_set_vcenter (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> center</code></em>);</pre>
+<p>
+Set the vertical centering offset for the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>center</code></em> :</span></p></td>
+<td>centering offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports centering</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-orientation-set-vflip"></a><h3>gst_video_orientation_set_vflip ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_orientation_set_vflip (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> *video_orientation</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> flip</code></em>);</pre>
+<p>
+Set the vertical flipping state (<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for flipped) for the given object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>video_orientation</code></em> :</span></p></td>
+<td>
+<a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation"><span class="type">GstVideoOrientation</span></a> interface of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flip</code></em> :</span></p></td>
+<td>use flipping</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> in case the element supports flipping</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstvideooverlay.html b/docs/libs/html/gst-plugins-base-libs-gstvideooverlay.html
new file mode 100644
index 0000000..b4059b2
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstvideooverlay.html
@@ -0,0 +1,520 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstvideooverlay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-interfaces.html" title="Interfaces Library">
+<link rel="prev" href="gst-plugins-base-libs-gstvideoorientation.html" title="gstvideoorientation">
+<link rel="next" href="gstreamer-netbuffer.html" title="Network Buffer Library">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstvideoorientation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-interfaces.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-netbuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstvideooverlay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideooverlay.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstvideooverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstvideooverlay.top_of_page"></a>gstvideooverlay</span></h2>
+<p>gstvideooverlay — Interface for setting/getting a window system resource
+ on elements supporting it to configure a window into which to render a
+ video.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstvideooverlay.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/interfaces/videooverlay.h&gt;
+
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-got-window-handle" title="gst_video_overlay_got_window_handle ()">gst_video_overlay_got_window_handle</a> (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guintptr"><span class="type">guintptr</span></a> handle</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()">gst_video_overlay_set_window_handle</a> (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guintptr"><span class="type">guintptr</span></a> handle</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-prepare-window-handle" title="gst_video_overlay_prepare_window_handle ()">gst_video_overlay_prepare_window_handle</a>
+ (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-expose" title="gst_video_overlay_expose ()">gst_video_overlay_expose</a> (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-handle-events" title="gst_video_overlay_handle_events ()">gst_video_overlay_handle_events</a> (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> handle_events</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-render-rectangle" title="gst_video_overlay_set_render_rectangle ()">gst_video_overlay_set_render_rectangle</a>
+ (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> y</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideooverlay.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id511383"></a><p>
+The <span class="type">GstVideoOverlay</span> interface is used for 2 main purposes :
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+To get a grab on the Window where the video sink element is going to render.
+This is achieved by either being informed about the Window identifier that
+the video sink element generated, or by forcing the video sink element to use
+a specific Window identifier for rendering.
+</p></li>
+<li class="listitem"><p>
+To force a redrawing of the latest video frame the video sink element
+displayed on the Window. Indeed if the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a> is in <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-PAUSED:CAPS"><span class="type">GST_STATE_PAUSED</span></a>
+state, moving the Window around will damage its content. Application
+developers will want to handle the Expose events themselves and force the
+video sink element to refresh the Window's content.
+</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+Using the Window created by the video sink is probably the simplest scenario,
+in some cases, though, it might not be flexible enough for application
+developers if they need to catch events such as mouse moves and button
+clicks.
+</p>
+<p>
+Setting a specific Window identifier on the video sink element is the most
+flexible solution but it has some issues. Indeed the application needs to set
+its Window identifier at the right time to avoid internal Window creation
+from the video sink element. To solve this issue a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> is posted on
+the bus to inform the application that it should set the Window identifier
+immediately. Here is an example on how to do that correctly:
+</p>
+<div class="informalexample"><pre class="programlisting">
+static GstBusSyncReply
+create_window (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ // ignore anything but 'prepare-window-handle' element messages
+ if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ return GST_BUS_PASS;
+
+ win = XCreateSimpleWindow (disp, root, 0, 0, 320, 240, 0, 0, 0);
+
+ XSetWindowBackgroundPixmap (disp, win, None);
+
+ XMapRaised (disp, win);
+
+ XSync (disp, FALSE);
+
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)),
+ win);
+
+ gst_message_unref (message);
+
+ return GST_BUS_DROP;
+}
+...
+int
+main (int argc, char **argv)
+{
+...
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, pipeline);
+...
+}
+</pre></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id511467"></a><h3>Two basic usage scenarios</h3>
+<p>
+There are two basic usage scenarios: in the simplest case, the application
+knows exactly what particular element is used for video output, which is
+usually the case when the application creates the videosink to use
+(e.g. <span class="type">xvimagesink</span>, <span class="type">ximagesink</span>, etc.) itself; in this case, the application
+can just create the videosink element, create and realize the window to
+render the video on and then call <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()"><code class="function">gst_video_overlay_set_window_handle()</code></a> directly
+with the XID or native window handle, before starting up the pipeline.
+</p>
+<p>
+In the other and more common case, the application does not know in advance
+what GStreamer video sink element will be used for video output. This is
+usually the case when an element such as <span class="type">autovideosink</span> or <span class="type">gconfvideosink</span>
+is used. In this case, the video sink element itself is created
+asynchronously from a GStreamer streaming thread some time after the
+pipeline has been started up. When that happens, however, the video sink
+will need to know right then whether to render onto an already existing
+application window or whether to create its own window. This is when it
+posts a prepare-window-handle message, and that is also why this message needs
+to be handled in a sync bus handler which will be called from the streaming
+thread directly (because the video sink will need an answer right then).
+</p>
+<p>
+As response to the prepare-window-handle element message in the bus sync
+handler, the application may use <a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()"><code class="function">gst_video_overlay_set_window_handle()</code></a> to tell
+the video sink to render onto an existing window surface. At this point the
+application should already have obtained the window handle / XID, so it
+just needs to set it. It is generally not advisable to call any GUI toolkit
+functions or window system functions from the streaming thread in which the
+prepare-window-handle message is handled, because most GUI toolkits and
+windowing systems are not thread-safe at all and a lot of care would be
+required to co-ordinate the toolkit and window system calls of the
+different threads (Gtk+ users please note: prior to Gtk+ 2.18
+<a href="http://library.gnome.org/devel/gdk/gdk3-X-Window-System-Interaction.html#GDK-WINDOW-XID:CAPS"><code class="function">GDK_WINDOW_XID()</code></a> was just a simple structure access, so generally fine to do
+within the bus sync handler; this macro was changed to a function call in
+Gtk+ 2.18 and later, which is likely to cause problems when called from a
+sync handler; see below for a better approach without <a href="http://library.gnome.org/devel/gdk/gdk3-X-Window-System-Interaction.html#GDK-WINDOW-XID:CAPS"><code class="function">GDK_WINDOW_XID()</code></a>
+used in the callback).
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id519984"></a><h3>GstVideoOverlay and Gtk+</h3>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+#include &lt;gtk/gtk.h&gt;
+#ifdef GDK_WINDOWING_X11
+#include &lt;gdk/gdkx.h&gt; // for GDK_WINDOW_XID
+#endif
+...
+static gulong video_window_xid = 0;
+...
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ // ignore anything but 'prepare-window-handle' element messages
+ if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ return GST_BUS_PASS;
+
+ if (video_window_xid != 0) {
+ GstVideoOverlay *xoverlay;
+
+ // GST_MESSAGE_SRC (message) will be the video sink element
+ xoverlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
+ gst_video_overlay_set_window_handle (xoverlay, video_window_xid);
+ } else {
+ g_warning ("Should have obtained video_window_xid by now!");
+ }
+
+ gst_message_unref (message);
+ return GST_BUS_DROP;
+}
+...
+static void
+video_widget_realize_cb (GtkWidget * widget, gpointer data)
+{
+#if GTK_CHECK_VERSION(2,18,0)
+ // This is here just for pedagogical purposes, GDK_WINDOW_XID will call
+ // it as well in newer Gtk versions
+ if (!gdk_window_ensure_native (widget-&gt;window))
+ g_error ("Couldn't create native window needed for GstVideoOverlay!");
+#endif
+
+#ifdef GDK_WINDOWING_X11
+ video_window_xid = GDK_WINDOW_XID (video_window-&gt;window);
+#endif
+}
+...
+int
+main (int argc, char **argv)
+{
+ GtkWidget *video_window;
+ GtkWidget *app_window;
+ ...
+ app_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ ...
+ video_window = gtk_drawing_area_new ();
+ g_signal_connect (video_window, "realize",
+ G_CALLBACK (video_widget_realize_cb), NULL);
+ gtk_widget_set_double_buffered (video_window, FALSE);
+ ...
+ // usually the video_window will not be directly embedded into the
+ // application window like this, but there will be many other widgets
+ // and the video window will be embedded in one of them instead
+ gtk_container_add (GTK_CONTAINER (ap_window), video_window);
+ ...
+ // show the GUI
+ gtk_widget_show_all (app_window);
+
+ // realize window now so that the video window gets created and we can
+ // obtain its XID before the pipeline is started up and the videosink
+ // asks for the XID of the window to render onto
+ gtk_widget_realize (window);
+
+ // we should have the XID now
+ g_assert (video_window_xid != 0);
+ ...
+ // set up sync handler for setting the xid once the pipeline is started
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, NULL);
+ gst_object_unref (bus);
+ ...
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ ...
+}
+</pre></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id520023"></a><h3>GstVideoOverlay and Qt</h3>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+#include &lt;glib.h&gt;
+#include &lt;gst/gst.h&gt;
+#include &lt;gst/interfaces/videooverlay.h&gt;
+
+#include &lt;QApplication&gt;
+#include &lt;QTimer&gt;
+#include &lt;QWidget&gt;
+
+int main(int argc, char *argv[])
+{
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gst_init (&amp;argc, &amp;argv);
+ QApplication app(argc, argv);
+ app.connect(&amp;app, SIGNAL(lastWindowClosed()), &amp;app, SLOT(quit ()));
+
+ // prepare the pipeline
+
+ GstElement *pipeline = gst_pipeline_new ("xvoverlay");
+ GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
+ GstElement *sink = gst_element_factory_make ("xvimagesink", NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ // prepare the ui
+
+ QWidget window;
+ window.resize(320, 240);
+ window.show();
+
+ WId xwinid = window.winId();
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
+
+ // run the pipeline
+
+ GstStateChangeReturn sret = gst_element_set_state (pipeline,
+ GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ // Exit application
+ QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
+ }
+
+ int ret = app.exec();
+
+ window.hide();
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return ret;
+}
+</pre></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideooverlay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-video-overlay-got-window-handle"></a><h3>gst_video_overlay_got_window_handle ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_overlay_got_window_handle (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guintptr"><span class="type">guintptr</span></a> handle</code></em>);</pre>
+<p>
+This will post a "have-window-handle" element message on the bus.
+</p>
+<p>
+This function should only be used by video overlay plugin developers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span> which got a window</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handle</code></em> :</span></p></td>
+<td>a platform-specific handle referencing the window</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-overlay-set-window-handle"></a><h3>gst_video_overlay_set_window_handle ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_overlay_set_window_handle (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guintptr"><span class="type">guintptr</span></a> handle</code></em>);</pre>
+<p>
+This will call the video overlay's set_window_handle method. You
+should use this method to tell to a XOverlay to display video output to a
+specific window (e.g. an XWindow on X11). Passing 0 as the <em class="parameter"><code>handle</code></em> will
+tell the overlay to stop using that window and create an internal one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span> to set the window on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handle</code></em> :</span></p></td>
+<td>a handle referencing the window.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-overlay-prepare-window-handle"></a><h3>gst_video_overlay_prepare_window_handle ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_overlay_prepare_window_handle
+ (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>);</pre>
+<p>
+This will post a "prepare-window-handle" element message on the bus
+to give applications an opportunity to call
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()"><code class="function">gst_video_overlay_set_window_handle()</code></a> before a plugin creates its own
+window.
+</p>
+<p>
+This function should only be used by video overlay plugin developers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span> which does not yet have an Window handle set</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-overlay-expose"></a><h3>gst_video_overlay_expose ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_overlay_expose (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>);</pre>
+<p>
+Tell an overlay that it has been exposed. This will redraw the current frame
+in the drawable even if the pipeline is PAUSED.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span> to expose.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-overlay-handle-events"></a><h3>gst_video_overlay_handle_events ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_overlay_handle_events (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> handle_events</code></em>);</pre>
+<p>
+Tell an overlay that it should handle events from the window system. These
+events are forwared upstream as navigation events. In some window system,
+events are not propagated in the window hierarchy if a client is listening
+for them. This method allows you to disable events handling completely
+from the XOverlay.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span> to expose.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handle_events</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> indicating if events should be handled or not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-overlay-set-render-rectangle"></a><h3>gst_video_overlay_set_render_rectangle ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_video_overlay_set_render_rectangle
+ (<em class="parameter"><code><span class="type">GstVideoOverlay</span> *overlay</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> x</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> y</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>);</pre>
+<p>
+Configure a subregion as a video target within the window set by
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" title="gst_video_overlay_set_window_handle ()"><code class="function">gst_video_overlay_set_window_handle()</code></a>. If this is not used or not supported
+the video will fill the area of the window set as the overlay to 100%.
+By specifying the rectangle, the video can be overlayed to a specific region
+of that window only. After setting the new rectangle one should call
+<a class="link" href="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-expose" title="gst_video_overlay_expose ()"><code class="function">gst_video_overlay_expose()</code></a> to force a redraw. To unset the region pass -1 for
+the <em class="parameter"><code>width</code></em> and <em class="parameter"><code>height</code></em> parameters.
+</p>
+<p>
+This method is needed for non fullscreen video overlay in UI toolkits that
+do not support subwindows.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>overlay</code></em> :</span></p></td>
+<td>a <span class="type">GstVideoOverlay</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the horizontal offset of the render area inside the window</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>y</code></em> :</span></p></td>
+<td>the vertical offset of the render area inside the window</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>width</code></em> :</span></p></td>
+<td>the width of the render area inside the window</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>height</code></em> :</span></p></td>
+<td>the height of the render area inside the window</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if not supported by the sink.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.29</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs-gstvideosink.html b/docs/libs/html/gst-plugins-base-libs-gstvideosink.html
new file mode 100644
index 0000000..1ffb6ba
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs-gstvideosink.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstvideosink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-video.html" title="Video Library">
+<link rel="prev" href="gst-plugins-base-libs-gstvideofilter.html" title="gstvideofilter">
+<link rel="next" href="gstreamer-libs-hierarchy.html" title="Part II. Object Hierarchy">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstvideofilter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-video.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-hierarchy.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-libs-gstvideosink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideosink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideosink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-libs-gstvideosink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-libs-gstvideosink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-libs-gstvideosink.top_of_page"></a>gstvideosink</span></h2>
+<p>gstvideosink — Base class for video sinks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-libs-gstvideosink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoSink"></a><pre class="synopsis">
+#include &lt;gst/video/gstvideosink.h&gt;
+
+struct <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink-struct" title="struct GstVideoSink">GstVideoSink</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSinkClass" title="struct GstVideoSinkClass">GstVideoSinkClass</a>;
+struct <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle">GstVideoRectangle</a>;
+#define <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-HEIGHT:CAPS" title="GST_VIDEO_SINK_HEIGHT()">GST_VIDEO_SINK_HEIGHT</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-PAD:CAPS" title="GST_VIDEO_SINK_PAD()">GST_VIDEO_SINK_PAD</a> (obj)
+#define <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-WIDTH:CAPS" title="GST_VIDEO_SINK_WIDTH()">GST_VIDEO_SINK_WIDTH</a> (obj)
+<span class="returnvalue">void</span> <a class="link" href="gst-plugins-base-libs-gstvideosink.html#gst-video-sink-center-rect" title="gst_video_sink_center_rect ()">gst_video_sink_center_rect</a> (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> dst</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> *result</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> scaling</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideosink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstVideoSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideosink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink--show-preroll-frame" title='The "show-preroll-frame" property'>show-preroll-frame</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write / Construct
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideosink.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id618482"></a><p>
+Provides useful functions and a base class for video sinks.
+</p>
+<p>
+GstVideoSink will configure the default base sink to drop frames that
+arrive later than 20ms as this is considered the default threshold for
+observing out-of-sync frames.
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideosink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoSink-struct"></a><h3>struct GstVideoSink</h3>
+<pre class="programlisting">struct GstVideoSink {
+ gint width, height;
+};
+</pre>
+<p>
+The video sink instance structure. Derived video sinks should set the
+<em class="parameter"><code>height</code></em> and <em class="parameter"><code>width</code></em> members.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoSink-struct.width"></a>width</code></em>;</span></p></td>
+<td>video width (derived class needs to set this)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoSink-struct.height"></a>height</code></em>;</span></p></td>
+<td>video height (derived class needs to set this)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoSinkClass"></a><h3>struct GstVideoSinkClass</h3>
+<pre class="programlisting">struct GstVideoSinkClass {
+ GstBaseSinkClass parent_class;
+
+ GstFlowReturn (*show_frame) (GstVideoSink *video_sink, GstBuffer *buf);
+};
+</pre>
+<p>
+The video sink class structure. Derived classes should override the
+<em class="parameter"><code>show_frame</code></em> virtual function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html#GstBaseSinkClass"><span class="type">GstBaseSinkClass</span></a> <em class="structfield"><code><a name="GstVideoSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstVideoSinkClass.show-frame"></a>show_frame</code></em> ()</span></p></td>
+<td>render a video frame. Maps to <code class="function">GstBaseSinkClass.render()</code> and
+<code class="function">GstBaseSinkClass.preroll()</code> vfuncs. Rendering during preroll will be
+suppressed if the <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink--show-preroll-frame" title='The "show-preroll-frame" property'><span class="type">"show-preroll-frame"</span></a> property is set to
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>. Since: 0.10.25</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRectangle"></a><h3>struct GstVideoRectangle</h3>
+<pre class="programlisting">struct GstVideoRectangle {
+ gint x;
+ gint y;
+ gint w;
+ gint h;
+};
+</pre>
+<p>
+Helper structure representing a rectangular area.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoRectangle.x"></a>x</code></em>;</span></p></td>
+<td>X coordinate of rectangle's top-left point</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoRectangle.y"></a>y</code></em>;</span></p></td>
+<td>Y coordinate of rectangle's top-left point</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoRectangle.w"></a>w</code></em>;</span></p></td>
+<td>width of the rectangle</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GstVideoRectangle.h"></a>h</code></em>;</span></p></td>
+<td>height of the rectangle</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VIDEO-SINK-HEIGHT:CAPS"></a><h3>GST_VIDEO_SINK_HEIGHT()</h3>
+<pre class="programlisting">#define GST_VIDEO_SINK_HEIGHT(obj) (GST_VIDEO_SINK_CAST (obj)-&gt;height)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VIDEO-SINK-PAD:CAPS"></a><h3>GST_VIDEO_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_VIDEO_SINK_PAD(obj) GST_BASE_SINK_PAD(obj)
+</pre>
+<p>
+Get the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> of <em class="parameter"><code>obj</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink"><span class="type">GstVideoSink</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VIDEO-SINK-WIDTH:CAPS"></a><h3>GST_VIDEO_SINK_WIDTH()</h3>
+<pre class="programlisting">#define GST_VIDEO_SINK_WIDTH(obj) (GST_VIDEO_SINK_CAST (obj)-&gt;width)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-video-sink-center-rect"></a><h3>gst_video_sink_center_rect ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_video_sink_center_rect (<em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> src</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> dst</code></em>,
+ <em class="parameter"><code><a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> *result</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> scaling</code></em>);</pre>
+<p>
+Takes <em class="parameter"><code>src</code></em> rectangle and position it at the center of <em class="parameter"><code>dst</code></em> rectangle with or
+without <em class="parameter"><code>scaling</code></em>. It handles clipping if the <em class="parameter"><code>src</code></em> rectangle is bigger than
+the <em class="parameter"><code>dst</code></em> one and <em class="parameter"><code>scaling</code></em> is set to FALSE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> describing the source area</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dst</code></em> :</span></p></td>
+<td>the <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> describing the destination area</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>result</code></em> :</span></p></td>
+<td>a pointer to a <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle" title="struct GstVideoRectangle"><span class="type">GstVideoRectangle</span></a> which will receive the result area</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>scaling</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> indicating if scaling should be applied or not</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-libs-gstvideosink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVideoSink--show-preroll-frame"></a><h3>The <code class="literal">"show-preroll-frame"</code> property</h3>
+<pre class="programlisting"> "show-preroll-frame" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write / Construct</pre>
+<p>
+Whether to show video frames during preroll. If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>, video
+frames will only be rendered in PLAYING state.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.25</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-base-libs.devhelp2 b/docs/libs/html/gst-plugins-base-libs.devhelp2
new file mode 100644
index 0000000..adb3315
--- /dev/null
+++ b/docs/libs/html/gst-plugins-base-libs.devhelp2
@@ -0,0 +1,1628 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="GStreamer Base Plugins 0.11 Library Reference Manual" link="index.html" author="" name="gst-plugins-base-libs" version="2" language="c">
+ <chapters>
+ <sub name="GStreamer Base Plugins Libraries" link="gstreamer-plugins-base.html">
+ <sub name="Compiling" link="compiling.html"/>
+ <sub name="App Library" link="gstreamer-app.html">
+ <sub name="appsrc" link="gst-plugins-base-libs-appsrc.html"/>
+ <sub name="appsink" link="gst-plugins-base-libs-appsink.html"/>
+ </sub>
+ <sub name="Audio Library" link="gstreamer-audio.html">
+ <sub name="gstaudio" link="gst-plugins-base-libs-gstaudio.html"/>
+ <sub name="gstaudioclock" link="gst-plugins-base-libs-gstaudioclock.html"/>
+ <sub name="gstaudiodecoder" link="gst-plugins-base-libs-gstaudiodecoder.html"/>
+ <sub name="gstaudioencoder" link="gst-plugins-base-libs-gstaudioencoder.html"/>
+ <sub name="gstaudiofilter" link="gst-plugins-base-libs-gstaudiofilter.html"/>
+ <sub name="gstaudiomixerutils" link="gst-plugins-base-libs-gstaudiomixerutils.html"/>
+ <sub name="gstaudiosink" link="gst-plugins-base-libs-gstaudiosink.html"/>
+ <sub name="gstaudiosrc" link="gst-plugins-base-libs-gstaudiosrc.html"/>
+ <sub name="gstbaseaudiosink" link="gst-plugins-base-libs-gstbaseaudiosink.html"/>
+ <sub name="gstbaseaudiosrc" link="gst-plugins-base-libs-gstbaseaudiosrc.html"/>
+ <sub name="gstmultichannel" link="gst-plugins-base-libs-gstmultichannel.html"/>
+ <sub name="gstringbuffer" link="gst-plugins-base-libs-gstringbuffer.html"/>
+ <sub name="gstaudioiec61937" link="gst-plugins-base-libs-gstaudioiec61937.html"/>
+ </sub>
+ <sub name="CDDA Library" link="gstreamer-cdda.html">
+ <sub name="gstcddabasesrc" link="gst-plugins-base-libs-gstcddabasesrc.html"/>
+ </sub>
+ <sub name="FFT Library" link="gstreamer-ffft.html">
+ <sub name="gstfft" link="gst-plugins-base-libs-gstfft.html"/>
+ <sub name="gstffts16" link="gst-plugins-base-libs-gstffts16.html"/>
+ <sub name="gstffts32" link="gst-plugins-base-libs-gstffts32.html"/>
+ <sub name="gstfftf32" link="gst-plugins-base-libs-gstfftf32.html"/>
+ <sub name="gstfftf64" link="gst-plugins-base-libs-gstfftf64.html"/>
+ </sub>
+ <sub name="Interfaces Library" link="gstreamer-interfaces.html">
+ <sub name="gstcolorbalance" link="gst-plugins-base-libs-gstcolorbalance.html"/>
+ <sub name="gstcolorbalancechannel" link="gst-plugins-base-libs-gstcolorbalancechannel.html"/>
+ <sub name="gstmixer" link="gst-plugins-base-libs-gstmixer.html"/>
+ <sub name="gstmixeroptions" link="gst-plugins-base-libs-gstmixeroptions.html"/>
+ <sub name="gstmixertrack" link="gst-plugins-base-libs-gstmixertrack.html"/>
+ <sub name="gstnavigation" link="gst-plugins-base-libs-gstnavigation.html"/>
+ <sub name="gstpropertyprobe" link="gst-plugins-base-libs-gstpropertyprobe.html"/>
+ <sub name="gststreamvolume" link="gst-plugins-base-libs-gststreamvolume.html"/>
+ <sub name="gsttuner" link="gst-plugins-base-libs-gsttuner.html"/>
+ <sub name="gsttunerchannel" link="gst-plugins-base-libs-gsttunerchannel.html"/>
+ <sub name="gsttunernorm" link="gst-plugins-base-libs-gsttunernorm.html"/>
+ <sub name="gstvideoorientation" link="gst-plugins-base-libs-gstvideoorientation.html"/>
+ <sub name="gstvideooverlay" link="gst-plugins-base-libs-gstvideooverlay.html"/>
+ </sub>
+ <sub name="Network Buffer Library" link="gstreamer-netbuffer.html">
+ <sub name="gstnetbuffer" link="gst-plugins-base-libs-gstnetbuffer.html"/>
+ </sub>
+ <sub name="Riff Media Library" link="gstreamer-riff.html">
+ <sub name="gstriff" link="gst-plugins-base-libs-gstriff.html"/>
+ </sub>
+ <sub name="RTP Library" link="gstreamer-rtp.html">
+ <sub name="gstbasertpaudiopayload" link="gst-plugins-base-libs-gstbasertpaudiopayload.html"/>
+ <sub name="gstbasertpdepayload" link="gst-plugins-base-libs-gstbasertpdepayload.html"/>
+ <sub name="gstbasertppayload" link="gst-plugins-base-libs-gstbasertppayload.html"/>
+ <sub name="gstrtpbuffer" link="gst-plugins-base-libs-gstrtpbuffer.html"/>
+ <sub name="gstrtcpbuffer" link="gst-plugins-base-libs-gstrtcpbuffer.html"/>
+ <sub name="gstrtppayloads" link="gst-plugins-base-libs-gstrtppayloads.html"/>
+ </sub>
+ <sub name="RTSP Library" link="gstreamer-rtsp.html">
+ <sub name="gstrtspbase64" link="gst-plugins-base-libs-gstrtspbase64.html"/>
+ <sub name="gstrtspconnection" link="gst-plugins-base-libs-gstrtspconnection.html"/>
+ <sub name="gstrtspdefs" link="gst-plugins-base-libs-gstrtspdefs.html"/>
+ <sub name="gstrtspextension" link="gst-plugins-base-libs-gstrtspextension.html"/>
+ <sub name="gstrtspmessage" link="gst-plugins-base-libs-gstrtspmessage.html"/>
+ <sub name="gstrtsprange" link="gst-plugins-base-libs-gstrtsprange.html"/>
+ <sub name="gstrtsptransport" link="gst-plugins-base-libs-gstrtsptransport.html"/>
+ <sub name="gstrtspurl" link="gst-plugins-base-libs-gstrtspurl.html"/>
+ </sub>
+ <sub name="SDP Library" link="gstreamer-sdp.html">
+ <sub name="gstsdpmessage" link="gst-plugins-base-libs-gstsdpmessage.html"/>
+ </sub>
+ <sub name="Tag Support Library" link="gstreamer-tag.html">
+ <sub name="gsttag" link="gst-plugins-base-libs-gsttag.html"/>
+ <sub name="gsttagvorbis" link="gst-plugins-base-libs-gsttagvorbis.html"/>
+ <sub name="gsttagid3" link="gst-plugins-base-libs-gsttagid3.html"/>
+ <sub name="gsttagexif" link="gst-plugins-base-libs-gsttagexif.html"/>
+ <sub name="gsttagxmp" link="gst-plugins-base-libs-gsttagxmp.html"/>
+ <sub name="gsttagxmpwriter" link="gst-plugins-base-libs-gsttagxmpwriter.html"/>
+ <sub name="gsttagdemux" link="gst-plugins-base-libs-gsttagdemux.html"/>
+ <sub name="gsttagmux" link="gst-plugins-base-libs-gsttagmux.html"/>
+ <sub name="gsttaglanguagecodes" link="gst-plugins-base-libs-gsttaglanguagecodes.html"/>
+ <sub name="gsttaglicenses" link="gst-plugins-base-libs-gsttaglicenses.html"/>
+ </sub>
+ <sub name="Base Utils Library" link="gstreamer-base-utils.html">
+ <sub name="gstpbutils" link="gst-plugins-base-libs-gstpbutils.html"/>
+ <sub name="gstpluginsbaseversion" link="gst-plugins-base-libs-gstpluginsbaseversion.html"/>
+ <sub name="gstpbutilscodecutils" link="gst-plugins-base-libs-gstpbutilscodecutils.html"/>
+ <sub name="gstpbutilsdescriptions" link="gst-plugins-base-libs-gstpbutilsdescriptions.html"/>
+ <sub name="gstpbutilsmissingplugins" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html"/>
+ <sub name="gstpbutilsinstallplugins" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html"/>
+ <sub name="gstdiscoverer" link="gst-plugins-base-libs-gstdiscoverer.html"/>
+ <sub name="encoding-profile" link="gst-plugins-base-libs-encoding-profile.html"/>
+ </sub>
+ <sub name="Video Library" link="gstreamer-video.html">
+ <sub name="gstvideo" link="gst-plugins-base-libs-gstvideo.html"/>
+ <sub name="gstvideofilter" link="gst-plugins-base-libs-gstvideofilter.html"/>
+ <sub name="gstvideosink" link="gst-plugins-base-libs-gstvideosink.html"/>
+ </sub>
+ </sub>
+ <sub name="Object Hierarchy" link="gstreamer-libs-hierarchy.html"/>
+ <sub name="Index" link="api-index-full.html"/>
+ <sub name="Index of deprecated API" link="api-index-deprecated.html"/>
+ <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+ </chapters>
+ <functions>
+ <keyword type="enum" name="enum GstAppStreamType" link="gst-plugins-base-libs-appsrc.html#GstAppStreamType"/>
+ <keyword type="function" name="gst_app_src_set_caps ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-caps" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_caps ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-caps" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_latency ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-latency" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_set_latency ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-latency" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_set_size ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-size" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_size ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-size" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_set_stream_type ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-stream-type" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_stream_type ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-stream-type" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_set_max_bytes ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-max-bytes" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_max_bytes ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-max-bytes" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_get_emit_signals ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-get-emit-signals" since="0.10.23"/>
+ <keyword type="function" name="gst_app_src_set_emit_signals ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-emit-signals" since="0.10.23"/>
+ <keyword type="struct" name="GstAppSrcCallbacks" link="gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks" since="0.10.23"/>
+ <keyword type="function" name="gst_app_src_set_callbacks ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-set-callbacks" since="0.10.23"/>
+ <keyword type="function" name="gst_app_src_push_buffer ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-push-buffer" since="0.10.22"/>
+ <keyword type="function" name="gst_app_src_end_of_stream ()" link="gst-plugins-base-libs-appsrc.html#gst-app-src-end-of-stream" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_set_caps ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-set-caps" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_get_caps ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-get-caps" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_is_eos ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_set_emit_signals ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-set-emit-signals" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_get_emit_signals ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-get-emit-signals" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_set_max_buffers ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-set-max-buffers" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_get_max_buffers ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-get-max-buffers" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_set_drop ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-set-drop" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_get_drop ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-get-drop" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_pull_preroll ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_pull_buffer ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer" since="0.10.22"/>
+ <keyword type="function" name="gst_app_sink_pull_buffer_list ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer-list"/>
+ <keyword type="struct" name="GstAppSinkCallbacks" link="gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks" since="0.10.23"/>
+ <keyword type="function" name="gst_app_sink_set_callbacks ()" link="gst-plugins-base-libs-appsink.html#gst-app-sink-set-callbacks" since="0.10.23"/>
+ <keyword type="enum" name="enum GstAudioFlags" link="gst-plugins-base-libs-gstaudio.html#GstAudioFlags"/>
+ <keyword type="enum" name="enum GstAudioFormat" link="gst-plugins-base-libs-gstaudio.html#GstAudioFormat"/>
+ <keyword type="enum" name="enum GstAudioFormatFlags" link="gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags"/>
+ <keyword type="struct" name="struct GstAudioFormatInfo" link="gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo"/>
+ <keyword type="struct" name="struct GstAudioInfo" link="gst-plugins-base-libs-gstaudio.html#GstAudioInfo"/>
+ <keyword type="function" name="gst_audio_info_init ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-info-init"/>
+ <keyword type="function" name="gst_audio_info_from_caps ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-info-from-caps"/>
+ <keyword type="function" name="gst_audio_info_to_caps ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-info-to-caps"/>
+ <keyword type="function" name="gst_audio_info_convert ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-info-convert"/>
+ <keyword type="function" name="gst_audio_format_get_info ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-format-get-info"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_DEPTH()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-DEPTH:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_ENDIANNESS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_FLAGS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_FORMAT()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_IS_FLOAT()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_IS_INTEGER()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_IS_SIGNED()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_NAME()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-NAME:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_FORMAT_INFO_WIDTH()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-WIDTH:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_BPF()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPF:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_BPS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_CHANNELS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-CHANNELS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_DEPTH()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-DEPTH:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_FLAGS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_FORMAT()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_NAME()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-NAME:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_POSITION()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-POSITION:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_RATE()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-RATE:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_INFO_WIDTH()" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-WIDTH:CAPS"/>
+ <keyword type="macro" name="GST_FRAMES_TO_CLOCK_TIME()" link="gst-plugins-base-libs-gstaudio.html#GST-FRAMES-TO-CLOCK-TIME:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_TIME_TO_FRAMES()" link="gst-plugins-base-libs-gstaudio.html#GST-CLOCK-TIME-TO-FRAMES:CAPS"/>
+ <keyword type="macro" name="GST_AUDIO_DEF_RATE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-DEF-RATE:CAPS"/>
+ <keyword type="function" name="gst_audio_buffer_clip ()" link="gst-plugins-base-libs-gstaudio.html#gst-audio-buffer-clip" since="0.10.14"/>
+ <keyword type="struct" name="struct GstAudioClock" link="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock-struct"/>
+ <keyword type="function" name="GstAudioClockGetTimeFunc ()" link="gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc"/>
+ <keyword type="function" name="gst_audio_clock_new ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new"/>
+ <keyword type="function" name="gst_audio_clock_new_full ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new-full" since="0.10.31"/>
+ <keyword type="function" name="gst_audio_clock_adjust ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-adjust" since="0.10.23"/>
+ <keyword type="function" name="gst_audio_clock_get_time ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-get-time" since="0.10.23"/>
+ <keyword type="function" name="gst_audio_clock_reset ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-reset"/>
+ <keyword type="function" name="gst_audio_clock_invalidate ()" link="gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-invalidate" since="0.10.31"/>
+ <keyword type="struct" name="struct GstAudioDecoder" link="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder-struct"/>
+ <keyword type="struct" name="struct GstAudioDecoderClass" link="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoderClass" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_DECODER_ERROR()" link="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-ERROR:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_DECODER_SINK_NAME" link="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-NAME:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_DECODER_SINK_PAD()" link="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-PAD:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_DECODER_SRC_NAME" link="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-NAME:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_DECODER_SRC_PAD()" link="gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-PAD:CAPS" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_finish_frame ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-finish-frame"/>
+ <keyword type="function" name="gst_audio_decoder_get_audio_info ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-audio-info" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_byte_time ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-byte-time" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_delay ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-delay" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_latency ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_max_errors ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-max-errors" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_min_latency ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-min-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_parse_state ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-parse-state" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_plc ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_plc_aware ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc-aware" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_get_tolerance ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-tolerance" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_byte_time ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-byte-time" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_latency ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_max_errors ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-max-errors" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_min_latency ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-min-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_plc ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_plc_aware ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc-aware" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_decoder_set_tolerance ()" link="gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-tolerance" since="0.10.36"/>
+ <keyword type="property" name="The &quot;min-latency&quot; property" link="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--min-latency"/>
+ <keyword type="property" name="The &quot;plc&quot; property" link="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--plc"/>
+ <keyword type="property" name="The &quot;tolerance&quot; property" link="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--tolerance"/>
+ <keyword type="struct" name="struct GstAudioEncoder" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder-struct"/>
+ <keyword type="struct" name="struct GstAudioEncoderClass" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoderClass" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_ENCODER_SEGMENT()" link="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SEGMENT:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_ENCODER_SINK_NAME" link="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-NAME:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_ENCODER_SINK_PAD()" link="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-PAD:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_ENCODER_SRC_NAME" link="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-NAME:CAPS" since="0.10.36"/>
+ <keyword type="macro" name="GST_AUDIO_ENCODER_SRC_PAD()" link="gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-PAD:CAPS" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_finish_frame ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-finish-frame" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_audio_info ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-audio-info" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_frame_max ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-max" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_frame_samples_min ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-min" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_frame_samples_max ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-max"/>
+ <keyword type="function" name="gst_audio_encoder_get_hard_resync ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-hard-resync"/>
+ <keyword type="function" name="gst_audio_encoder_get_latency ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_lookahead ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-lookahead"/>
+ <keyword type="function" name="gst_audio_encoder_get_mark_granule ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-mark-granule" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_perfect_timestamp ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-perfect-timestamp" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_get_tolerance ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-tolerance" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_proxy_getcaps ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-proxy-getcaps" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_frame_max ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-max" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_frame_samples_min ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-min" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_frame_samples_max ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-max" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_hard_resync ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-hard-resync"/>
+ <keyword type="function" name="gst_audio_encoder_set_latency ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-latency" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_lookahead ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-lookahead" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_mark_granule ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-mark-granule" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_perfect_timestamp ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-perfect-timestamp" since="0.10.36"/>
+ <keyword type="function" name="gst_audio_encoder_set_tolerance ()" link="gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-tolerance" since="0.10.36"/>
+ <keyword type="property" name="The &quot;hard-resync&quot; property" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--hard-resync"/>
+ <keyword type="property" name="The &quot;mark-granule&quot; property" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--mark-granule"/>
+ <keyword type="property" name="The &quot;perfect-timestamp&quot; property" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--perfect-timestamp"/>
+ <keyword type="property" name="The &quot;tolerance&quot; property" link="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--tolerance"/>
+ <keyword type="struct" name="struct GstAudioFilter" link="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct"/>
+ <keyword type="struct" name="struct GstAudioFilterClass" link="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass" since="0.10.12"/>
+ <keyword type="function" name="gst_audio_filter_class_add_pad_templates ()" link="gst-plugins-base-libs-gstaudiofilter.html#gst-audio-filter-class-add-pad-templates" since="0.10.12"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstaudiomixerutils.html#id439560"/>
+ <keyword type="function" name="GstAudioMixerFilterFunc ()" link="gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc"/>
+ <keyword type="function" name="gst_audio_default_registry_mixer_filter ()" link="gst-plugins-base-libs-gstaudiomixerutils.html#gst-audio-default-registry-mixer-filter" since="0.10.2"/>
+ <keyword type="struct" name="struct GstAudioSink" link="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink-struct"/>
+ <keyword type="struct" name="struct GstAudioSinkClass" link="gst-plugins-base-libs-gstaudiosink.html#GstAudioSinkClass"/>
+ <keyword type="struct" name="struct GstAudioSrc" link="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc-struct"/>
+ <keyword type="struct" name="struct GstAudioSrcClass" link="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrcClass"/>
+ <keyword type="struct" name="struct GstBaseAudioSink" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink-struct"/>
+ <keyword type="struct" name="struct GstBaseAudioSinkClass" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkClass"/>
+ <keyword type="enum" name="enum GstBaseAudioSinkSlaveMethod" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod"/>
+ <keyword type="macro" name="GST_BASE_AUDIO_SINK_CLOCK()" link="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-CLOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_AUDIO_SINK_PAD()" link="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-PAD:CAPS"/>
+ <keyword type="function" name="gst_base_audio_sink_create_ringbuffer ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-create-ringbuffer"/>
+ <keyword type="function" name="gst_base_audio_sink_set_provide_clock ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-provide-clock" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_sink_get_provide_clock ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-provide-clock" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_sink_set_slave_method ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-slave-method" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_sink_get_slave_method ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-slave-method" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_sink_get_drift_tolerance ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-drift-tolerance" since="0.10.31"/>
+ <keyword type="function" name="gst_base_audio_sink_set_drift_tolerance ()" link="gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-drift-tolerance" since="0.10.31"/>
+ <keyword type="property" name="The &quot;buffer-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--buffer-time"/>
+ <keyword type="property" name="The &quot;can-activate-pull&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--can-activate-pull"/>
+ <keyword type="property" name="The &quot;drift-tolerance&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--drift-tolerance"/>
+ <keyword type="property" name="The &quot;latency-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--latency-time"/>
+ <keyword type="property" name="The &quot;provide-clock&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--provide-clock"/>
+ <keyword type="property" name="The &quot;slave-method&quot; property" link="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--slave-method"/>
+ <keyword type="struct" name="struct GstBaseAudioSrc" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc-struct"/>
+ <keyword type="struct" name="struct GstBaseAudioSrcClass" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcClass"/>
+ <keyword type="enum" name="enum GstBaseAudioSrcSlaveMethod" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod"/>
+ <keyword type="macro" name="GST_BASE_AUDIO_SRC_CLOCK()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-CLOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_AUDIO_SRC_PAD()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-PAD:CAPS"/>
+ <keyword type="function" name="gst_base_audio_src_create_ringbuffer ()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-create-ringbuffer"/>
+ <keyword type="function" name="gst_base_audio_src_set_provide_clock ()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-provide-clock" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_src_get_provide_clock ()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-provide-clock" since="0.10.16"/>
+ <keyword type="function" name="gst_base_audio_src_get_slave_method ()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-slave-method" since="0.10.20"/>
+ <keyword type="function" name="gst_base_audio_src_set_slave_method ()" link="gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-slave-method" since="0.10.20"/>
+ <keyword type="property" name="The &quot;actual-buffer-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-buffer-time"/>
+ <keyword type="property" name="The &quot;actual-latency-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-latency-time"/>
+ <keyword type="property" name="The &quot;buffer-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--buffer-time"/>
+ <keyword type="property" name="The &quot;latency-time&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--latency-time"/>
+ <keyword type="property" name="The &quot;provide-clock&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--provide-clock"/>
+ <keyword type="property" name="The &quot;slave-method&quot; property" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--slave-method"/>
+ <keyword type="enum" name="enum GstAudioChannelPosition" link="gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition"/>
+ <keyword type="function" name="gst_audio_fixate_channel_positions ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-fixate-channel-positions"/>
+ <keyword type="function" name="gst_audio_get_channel_positions ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-get-channel-positions"/>
+ <keyword type="function" name="gst_audio_set_caps_channel_positions_list ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-caps-channel-positions-list"/>
+ <keyword type="function" name="gst_audio_set_channel_positions ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-channel-positions"/>
+ <keyword type="function" name="gst_audio_set_structure_channel_positions_list ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-structure-channel-positions-list"/>
+ <keyword type="function" name="gst_audio_check_channel_positions ()" link="gst-plugins-base-libs-gstmultichannel.html#gst-audio-check-channel-positions" since="0.10.20"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstringbuffer.html#id484218"/>
+ <keyword type="struct" name="struct GstRingBuffer" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer-struct"/>
+ <keyword type="struct" name="struct GstRingBufferClass" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferClass"/>
+ <keyword type="struct" name="struct GstRingBufferSpec" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec"/>
+ <keyword type="function" name="GstRingBufferCallback ()" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback"/>
+ <keyword type="enum" name="enum GstRingBufferSegState" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSegState"/>
+ <keyword type="enum" name="enum GstRingBufferState" link="gst-plugins-base-libs-gstringbuffer.html#GstRingBufferState"/>
+ <keyword type="enum" name="enum GstBufferFormatType" link="gst-plugins-base-libs-gstringbuffer.html#GstBufferFormatType"/>
+ <keyword type="macro" name="GST_RING_BUFFER_BROADCAST()" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-BROADCAST:CAPS"/>
+ <keyword type="macro" name="GST_RING_BUFFER_GET_COND()" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-GET-COND:CAPS"/>
+ <keyword type="macro" name="GST_RING_BUFFER_SIGNAL()" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-SIGNAL:CAPS"/>
+ <keyword type="macro" name="GST_RING_BUFFER_WAIT()" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-WAIT:CAPS"/>
+ <keyword type="function" name="gst_ring_buffer_set_callback ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-callback"/>
+ <keyword type="function" name="gst_ring_buffer_acquire ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-acquire"/>
+ <keyword type="function" name="gst_ring_buffer_release ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-release"/>
+ <keyword type="function" name="gst_ring_buffer_is_acquired ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-acquired"/>
+ <keyword type="function" name="gst_ring_buffer_activate ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-activate" since="0.10.22."/>
+ <keyword type="function" name="gst_ring_buffer_is_active ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-active" since="0.10.22."/>
+ <keyword type="function" name="gst_ring_buffer_start ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-start"/>
+ <keyword type="function" name="gst_ring_buffer_pause ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-pause"/>
+ <keyword type="function" name="gst_ring_buffer_stop ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-stop"/>
+ <keyword type="function" name="gst_ring_buffer_delay ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-delay"/>
+ <keyword type="function" name="gst_ring_buffer_samples_done ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-samples-done"/>
+ <keyword type="function" name="gst_ring_buffer_set_sample ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-sample"/>
+ <keyword type="function" name="gst_ring_buffer_commit ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit"/>
+ <keyword type="function" name="gst_ring_buffer_commit_full ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit-full" since="0.10.11."/>
+ <keyword type="function" name="gst_ring_buffer_convert ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-convert" since="0.10.22."/>
+ <keyword type="function" name="gst_ring_buffer_prepare_read ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-prepare-read"/>
+ <keyword type="function" name="gst_ring_buffer_read ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-read"/>
+ <keyword type="function" name="gst_ring_buffer_clear ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear"/>
+ <keyword type="function" name="gst_ring_buffer_clear_all ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear-all"/>
+ <keyword type="function" name="gst_ring_buffer_advance ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-advance"/>
+ <keyword type="function" name="gst_ring_buffer_close_device ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-close-device"/>
+ <keyword type="function" name="gst_ring_buffer_open_device ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-open-device"/>
+ <keyword type="function" name="gst_ring_buffer_device_is_open ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-device-is-open"/>
+ <keyword type="function" name="gst_ring_buffer_may_start ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-may-start" since="0.10.6"/>
+ <keyword type="function" name="gst_ring_buffer_parse_caps ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-parse-caps"/>
+ <keyword type="function" name="gst_ring_buffer_set_flushing ()" link="gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-flushing"/>
+ <keyword type="function" name="gst_audio_iec61937_frame_size ()" link="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-frame-size" since="0.10.35"/>
+ <keyword type="function" name="gst_audio_iec61937_payload ()" link="gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-payload" since="0.10.35"/>
+ <keyword type="" name="Using GstCddaBaseSrc-based elements in applications" link="gst-plugins-base-libs-gstcddabasesrc.html#id471435"/>
+ <keyword type="struct" name="struct GstCddaBaseSrc" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc-struct"/>
+ <keyword type="struct" name="struct GstCddaBaseSrcClass" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcClass"/>
+ <keyword type="struct" name="struct GstCddaBaseSrcTrack" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack"/>
+ <keyword type="enum" name="enum GstCddaBaseSrcMode" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode"/>
+ <keyword type="function" name="gst_cdda_base_src_add_track ()" link="gst-plugins-base-libs-gstcddabasesrc.html#gst-cdda-base-src-add-track"/>
+ <keyword type="property" name="The &quot;device&quot; property" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--device"/>
+ <keyword type="property" name="The &quot;mode&quot; property" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--mode"/>
+ <keyword type="property" name="The &quot;track&quot; property" link="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--track"/>
+ <keyword type="enum" name="enum GstFFTWindow" link="gst-plugins-base-libs-gstfft.html#GstFFTWindow"/>
+ <keyword type="function" name="gst_fft_next_fast_length ()" link="gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length"/>
+ <keyword type="struct" name="struct GstFFTS16" link="gst-plugins-base-libs-gstffts16.html#GstFFTS16"/>
+ <keyword type="struct" name="struct GstFFTS16Complex" link="gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex"/>
+ <keyword type="function" name="gst_fft_s16_new ()" link="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new"/>
+ <keyword type="function" name="gst_fft_s16_fft ()" link="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft"/>
+ <keyword type="function" name="gst_fft_s16_inverse_fft ()" link="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft"/>
+ <keyword type="function" name="gst_fft_s16_window ()" link="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-window"/>
+ <keyword type="function" name="gst_fft_s16_free ()" link="gst-plugins-base-libs-gstffts16.html#gst-fft-s16-free"/>
+ <keyword type="struct" name="struct GstFFTS32" link="gst-plugins-base-libs-gstffts32.html#GstFFTS32"/>
+ <keyword type="struct" name="struct GstFFTS32Complex" link="gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex"/>
+ <keyword type="function" name="gst_fft_s32_new ()" link="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new"/>
+ <keyword type="function" name="gst_fft_s32_fft ()" link="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft"/>
+ <keyword type="function" name="gst_fft_s32_inverse_fft ()" link="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft"/>
+ <keyword type="function" name="gst_fft_s32_window ()" link="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-window"/>
+ <keyword type="function" name="gst_fft_s32_free ()" link="gst-plugins-base-libs-gstffts32.html#gst-fft-s32-free"/>
+ <keyword type="struct" name="struct GstFFTF32" link="gst-plugins-base-libs-gstfftf32.html#GstFFTF32"/>
+ <keyword type="struct" name="struct GstFFTF32Complex" link="gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex"/>
+ <keyword type="function" name="gst_fft_f32_new ()" link="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new"/>
+ <keyword type="function" name="gst_fft_f32_fft ()" link="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft"/>
+ <keyword type="function" name="gst_fft_f32_inverse_fft ()" link="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft"/>
+ <keyword type="function" name="gst_fft_f32_window ()" link="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-window"/>
+ <keyword type="function" name="gst_fft_f32_free ()" link="gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-free"/>
+ <keyword type="struct" name="struct GstFFTF64" link="gst-plugins-base-libs-gstfftf64.html#GstFFTF64"/>
+ <keyword type="struct" name="struct GstFFTF64Complex" link="gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex"/>
+ <keyword type="function" name="gst_fft_f64_new ()" link="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new"/>
+ <keyword type="function" name="gst_fft_f64_fft ()" link="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-fft"/>
+ <keyword type="function" name="gst_fft_f64_inverse_fft ()" link="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft"/>
+ <keyword type="function" name="gst_fft_f64_window ()" link="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-window"/>
+ <keyword type="function" name="gst_fft_f64_free ()" link="gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstcolorbalance.html#id487947"/>
+ <keyword type="struct" name="GstColorBalance" link="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct"/>
+ <keyword type="struct" name="struct GstColorBalanceClass" link="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceClass"/>
+ <keyword type="enum" name="enum GstColorBalanceType" link="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType"/>
+ <keyword type="function" name="gst_color_balance_list_channels ()" link="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-list-channels"/>
+ <keyword type="function" name="gst_color_balance_get_value ()" link="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-value"/>
+ <keyword type="function" name="gst_color_balance_set_value ()" link="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-set-value"/>
+ <keyword type="function" name="gst_color_balance_value_changed ()" link="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-value-changed"/>
+ <keyword type="function" name="gst_color_balance_get_balance_type ()" link="gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-balance-type" since="0.10.24"/>
+ <keyword type="signal" name="The &quot;value-changed&quot; signal" link="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-value-changed"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstcolorbalancechannel.html#id494532"/>
+ <keyword type="struct" name="struct GstColorBalanceChannel" link="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-struct"/>
+ <keyword type="struct" name="struct GstColorBalanceChannelClass" link="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannelClass"/>
+ <keyword type="signal" name="The &quot;value-changed&quot; signal" link="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-value-changed"/>
+ <keyword type="struct" name="GstMixer" link="gst-plugins-base-libs-gstmixer.html#GstMixer-struct"/>
+ <keyword type="enum" name="enum GstMixerType" link="gst-plugins-base-libs-gstmixer.html#GstMixerType"/>
+ <keyword type="enum" name="enum GstMixerFlags" link="gst-plugins-base-libs-gstmixer.html#GstMixerFlags" since="0.10.14"/>
+ <keyword type="enum" name="enum GstMixerMessageType" link="gst-plugins-base-libs-gstmixer.html#GstMixerMessageType" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_list_tracks ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-list-tracks"/>
+ <keyword type="function" name="gst_mixer_get_volume ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-volume"/>
+ <keyword type="function" name="gst_mixer_set_volume ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-volume"/>
+ <keyword type="function" name="gst_mixer_set_mute ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-mute"/>
+ <keyword type="function" name="gst_mixer_set_record ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-record"/>
+ <keyword type="function" name="gst_mixer_set_option ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-set-option"/>
+ <keyword type="function" name="gst_mixer_mute_toggled ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-mute-toggled"/>
+ <keyword type="function" name="gst_mixer_record_toggled ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-record-toggled"/>
+ <keyword type="function" name="gst_mixer_volume_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-volume-changed"/>
+ <keyword type="function" name="gst_mixer_option_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-option-changed"/>
+ <keyword type="function" name="gst_mixer_options_list_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-options-list-changed" since="0.10.18"/>
+ <keyword type="function" name="gst_mixer_get_option ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-option"/>
+ <keyword type="function" name="gst_mixer_mixer_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-mixer-changed" since="0.10.18"/>
+ <keyword type="function" name="gst_mixer_get_mixer_flags ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-flags"/>
+ <keyword type="function" name="gst_mixer_get_mixer_type ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-type" since="0.10.24"/>
+ <keyword type="function" name="gst_mixer_message_get_type ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-get-type" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_message_parse_mute_toggled ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-mute-toggled" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_message_parse_option_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-option-changed" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_message_parse_record_toggled ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-record-toggled" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_message_parse_volume_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-volume-changed" since="0.10.14"/>
+ <keyword type="function" name="gst_mixer_message_parse_options_list_changed ()" link="gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-options-list-changed" since="0.10.18"/>
+ <keyword type="signal" name="The &quot;mute-toggled&quot; signal" link="gst-plugins-base-libs-gstmixer.html#GstMixer-mute-toggled"/>
+ <keyword type="signal" name="The &quot;option-changed&quot; signal" link="gst-plugins-base-libs-gstmixer.html#GstMixer-option-changed"/>
+ <keyword type="signal" name="The &quot;record-toggled&quot; signal" link="gst-plugins-base-libs-gstmixer.html#GstMixer-record-toggled"/>
+ <keyword type="signal" name="The &quot;volume-changed&quot; signal" link="gst-plugins-base-libs-gstmixer.html#GstMixer-volume-changed"/>
+ <keyword type="struct" name="struct GstMixerOptions" link="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions-struct"/>
+ <keyword type="function" name="gst_mixer_options_get_values ()" link="gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values"/>
+ <keyword type="struct" name="struct GstMixerTrack" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack-struct"/>
+ <keyword type="enum" name="enum GstMixerTrackFlags" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrackFlags"/>
+ <keyword type="macro" name="GST_MIXER_TRACK_HAS_FLAG()" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS"/>
+ <keyword type="property" name="The &quot;flags&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--flags"/>
+ <keyword type="property" name="The &quot;index&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--index"/>
+ <keyword type="property" name="The &quot;label&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--label"/>
+ <keyword type="property" name="The &quot;max-volume&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--max-volume"/>
+ <keyword type="property" name="The &quot;min-volume&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--min-volume"/>
+ <keyword type="property" name="The &quot;num-channels&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--num-channels"/>
+ <keyword type="property" name="The &quot;untranslated-label&quot; property" link="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--untranslated-label"/>
+ <keyword type="struct" name="GstNavigation" link="gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct"/>
+ <keyword type="struct" name="struct GstNavigationInterface" link="gst-plugins-base-libs-gstnavigation.html#GstNavigationInterface"/>
+ <keyword type="enum" name="enum GstNavigationCommand" link="gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand" since="0.10.23"/>
+ <keyword type="enum" name="enum GstNavigationEventType" link="gst-plugins-base-libs-gstnavigation.html#GstNavigationEventType" since="0.10.23"/>
+ <keyword type="enum" name="enum GstNavigationMessageType" link="gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType" since="0.10.23"/>
+ <keyword type="enum" name="enum GstNavigationQueryType" link="gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType"/>
+ <keyword type="function" name="gst_navigation_send_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-event"/>
+ <keyword type="function" name="gst_navigation_send_key_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-key-event"/>
+ <keyword type="function" name="gst_navigation_send_mouse_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-mouse-event"/>
+ <keyword type="function" name="gst_navigation_send_command ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-command" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_event_parse_command ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-command" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_event_parse_key_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_event_parse_mouse_button_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_event_parse_mouse_move_event ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-move-event" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_get_type ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-get-type" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_new_angles_changed ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-angles-changed" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_new_commands_changed ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-commands-changed" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_new_mouse_over ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-mouse-over" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_parse_mouse_over ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-mouse-over" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_message_parse_angles_changed ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-angles-changed" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_new_angles ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-angles" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_get_type ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-get-type" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_new_commands ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-commands" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_parse_angles ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-angles" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_parse_commands_length ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-length" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_parse_commands_nth ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-nth" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_set_angles ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-angles" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_set_commands ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commands" since="0.10.23"/>
+ <keyword type="function" name="gst_navigation_query_set_commandsv ()" link="gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commandsv" since="0.10.23"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_ROOT_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS"/>
+ <keyword type="macro" name="GST_NAVIGATION_COMMAND_DVD_TITLE_MENU" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS"/>
+ <keyword type="struct" name="GstPropertyProbe" link="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-struct"/>
+ <keyword type="struct" name="struct GstPropertyProbeInterface" link="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbeInterface"/>
+ <keyword type="function" name="gst_property_probe_get_properties ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-properties"/>
+ <keyword type="function" name="gst_property_probe_get_property ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-property"/>
+ <keyword type="function" name="gst_property_probe_get_values ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values"/>
+ <keyword type="function" name="gst_property_probe_get_values_name ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values-name"/>
+ <keyword type="function" name="gst_property_probe_needs_probe ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe"/>
+ <keyword type="function" name="gst_property_probe_needs_probe_name ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe-name"/>
+ <keyword type="function" name="gst_property_probe_probe_and_get_values ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values"/>
+ <keyword type="function" name="gst_property_probe_probe_and_get_values_name ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values-name"/>
+ <keyword type="function" name="gst_property_probe_probe_property ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property"/>
+ <keyword type="function" name="gst_property_probe_probe_property_name ()" link="gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property-name"/>
+ <keyword type="signal" name="The &quot;probe-needed&quot; signal" link="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-probe-needed"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gststreamvolume.html#id504808"/>
+ <keyword type="struct" name="GstStreamVolume" link="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume-struct"/>
+ <keyword type="enum" name="enum GstStreamVolumeFormat" link="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat" since="0.10.25"/>
+ <keyword type="function" name="gst_stream_volume_get_volume ()" link="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-volume" since="0.10.25"/>
+ <keyword type="function" name="gst_stream_volume_set_volume ()" link="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-volume" since="0.10.25"/>
+ <keyword type="function" name="gst_stream_volume_get_mute ()" link="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-mute" since="0.10.25"/>
+ <keyword type="function" name="gst_stream_volume_set_mute ()" link="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-mute" since="0.10.25"/>
+ <keyword type="function" name="gst_stream_volume_convert_volume ()" link="gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume" since="0.10.25"/>
+ <keyword type="property" name="The &quot;mute&quot; property" link="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--mute"/>
+ <keyword type="property" name="The &quot;volume&quot; property" link="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--volume"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttuner.html#id516504"/>
+ <keyword type="struct" name="GstTuner" link="gst-plugins-base-libs-gsttuner.html#GstTuner-struct"/>
+ <keyword type="struct" name="struct GstTunerClass" link="gst-plugins-base-libs-gsttuner.html#GstTunerClass"/>
+ <keyword type="function" name="gst_tuner_list_channels ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-channels"/>
+ <keyword type="function" name="gst_tuner_get_channel ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-channel"/>
+ <keyword type="function" name="gst_tuner_set_channel ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-channel"/>
+ <keyword type="function" name="gst_tuner_list_norms ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-list-norms"/>
+ <keyword type="function" name="gst_tuner_get_norm ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-norm"/>
+ <keyword type="function" name="gst_tuner_set_norm ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-norm"/>
+ <keyword type="function" name="gst_tuner_get_frequency ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-get-frequency"/>
+ <keyword type="function" name="gst_tuner_set_frequency ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency"/>
+ <keyword type="function" name="gst_tuner_signal_strength ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength"/>
+ <keyword type="function" name="gst_tuner_find_norm_by_name ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-norm-by-name"/>
+ <keyword type="function" name="gst_tuner_find_channel_by_name ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-find-channel-by-name"/>
+ <keyword type="function" name="gst_tuner_channel_changed ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-channel-changed"/>
+ <keyword type="function" name="gst_tuner_norm_changed ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-norm-changed"/>
+ <keyword type="function" name="gst_tuner_frequency_changed ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-frequency-changed"/>
+ <keyword type="function" name="gst_tuner_signal_changed ()" link="gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-changed"/>
+ <keyword type="signal" name="The &quot;channel-changed&quot; signal" link="gst-plugins-base-libs-gsttuner.html#GstTuner-channel-changed"/>
+ <keyword type="signal" name="The &quot;frequency-changed&quot; signal" link="gst-plugins-base-libs-gsttuner.html#GstTuner-frequency-changed"/>
+ <keyword type="signal" name="The &quot;norm-changed&quot; signal" link="gst-plugins-base-libs-gsttuner.html#GstTuner-norm-changed"/>
+ <keyword type="signal" name="The &quot;signal-changed&quot; signal" link="gst-plugins-base-libs-gsttuner.html#GstTuner-signal-changed"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttunerchannel.html#id451732"/>
+ <keyword type="struct" name="struct GstTunerChannel" link="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-struct"/>
+ <keyword type="enum" name="enum GstTunerChannelFlags" link="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags"/>
+ <keyword type="macro" name="GST_TUNER_CHANNEL_HAS_FLAG()" link="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS"/>
+ <keyword type="signal" name="The &quot;frequency-changed&quot; signal" link="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-frequency-changed"/>
+ <keyword type="signal" name="The &quot;signal-changed&quot; signal" link="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-signal-changed"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttunernorm.html#id445343"/>
+ <keyword type="struct" name="struct GstTunerNorm" link="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm-struct"/>
+ <keyword type="struct" name="GstVideoOrientation" link="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation-struct"/>
+ <keyword type="struct" name="struct GstVideoOrientationInterface" link="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientationInterface"/>
+ <keyword type="function" name="gst_video_orientation_get_hcenter ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hcenter" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_get_hflip ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hflip" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_get_vcenter ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vcenter" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_get_vflip ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vflip" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_set_hcenter ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hcenter" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_set_hflip ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hflip" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_set_vcenter ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vcenter" since="0.10.11"/>
+ <keyword type="function" name="gst_video_orientation_set_vflip ()" link="gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vflip" since="0.10.11"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstvideooverlay.html#id511383"/>
+ <keyword type="" name="Two basic usage scenarios" link="gst-plugins-base-libs-gstvideooverlay.html#id511467"/>
+ <keyword type="" name="GstVideoOverlay and Gtk+" link="gst-plugins-base-libs-gstvideooverlay.html#id519984"/>
+ <keyword type="" name="GstVideoOverlay and Qt" link="gst-plugins-base-libs-gstvideooverlay.html#id520023"/>
+ <keyword type="function" name="gst_video_overlay_got_window_handle ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-got-window-handle"/>
+ <keyword type="function" name="gst_video_overlay_set_window_handle ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle" since="0.10.31"/>
+ <keyword type="function" name="gst_video_overlay_prepare_window_handle ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-prepare-window-handle"/>
+ <keyword type="function" name="gst_video_overlay_expose ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-expose"/>
+ <keyword type="function" name="gst_video_overlay_handle_events ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-handle-events" since="0.10.12"/>
+ <keyword type="function" name="gst_video_overlay_set_render_rectangle ()" link="gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-render-rectangle" since="0.10.29"/>
+ <keyword type="struct" name="GstNetBuffer" link="gst-plugins-base-libs-gstnetbuffer.html#GstNetBuffer"/>
+ <keyword type="enum" name="enum GstNetType" link="gst-plugins-base-libs-gstnetbuffer.html#GstNetType"/>
+ <keyword type="macro" name="GST_NETADDRESS_MAX_LEN" link="gst-plugins-base-libs-gstnetbuffer.html#GST-NETADDRESS-MAX-LEN:CAPS" since="0.10.24"/>
+ <keyword type="struct" name="struct GstNetAddress" link="gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress"/>
+ <keyword type="function" name="gst_netaddress_get_net_type ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-net-type"/>
+ <keyword type="function" name="gst_netaddress_set_ip4_address ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip4-address"/>
+ <keyword type="function" name="gst_netaddress_get_ip4_address ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip4-address"/>
+ <keyword type="function" name="gst_netaddress_set_ip6_address ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip6-address"/>
+ <keyword type="function" name="gst_netaddress_get_ip6_address ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip6-address"/>
+ <keyword type="function" name="gst_netaddress_get_address_bytes ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-address-bytes" since="0.10.22"/>
+ <keyword type="function" name="gst_netaddress_set_address_bytes ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-address-bytes" since="0.10.22"/>
+ <keyword type="function" name="gst_netaddress_equal ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-equal" since="0.10.18"/>
+ <keyword type="function" name="gst_netaddress_to_string ()" link="gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-to-string" since="0.10.24"/>
+ <keyword type="function" name="gst_riff_create_audio_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-caps"/>
+ <keyword type="function" name="gst_riff_create_audio_template_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-template-caps"/>
+ <keyword type="function" name="gst_riff_create_iavs_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-caps"/>
+ <keyword type="function" name="gst_riff_create_iavs_template_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-template-caps"/>
+ <keyword type="function" name="gst_riff_create_video_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-caps"/>
+ <keyword type="function" name="gst_riff_create_video_template_caps ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-create-video-template-caps"/>
+ <keyword type="function" name="gst_riff_init ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-init"/>
+ <keyword type="function" name="gst_riff_parse_chunk ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-chunk"/>
+ <keyword type="function" name="gst_riff_parse_file_header ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-file-header"/>
+ <keyword type="function" name="gst_riff_parse_info ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-info"/>
+ <keyword type="function" name="gst_riff_parse_strf_auds ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-auds"/>
+ <keyword type="function" name="gst_riff_parse_strf_iavs ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-iavs"/>
+ <keyword type="function" name="gst_riff_parse_strf_vids ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-vids"/>
+ <keyword type="function" name="gst_riff_parse_strh ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-parse-strh"/>
+ <keyword type="function" name="gst_riff_read_chunk ()" link="gst-plugins-base-libs-gstriff.html#gst-riff-read-chunk"/>
+ <keyword type="" name="Usage" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#id529590"/>
+ <keyword type="struct" name="struct GstBaseRTPAudioPayload" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload-struct"/>
+ <keyword type="struct" name="struct GstBaseRTPAudioPayloadClass" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayloadClass"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_set_frame_based ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-based"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_set_frame_options ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-options"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_set_sample_based ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-based"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_set_sample_options ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-options"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_get_adapter ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-get-adapter" since="0.10.13"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_push ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-push" since="0.10.13"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_flush ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-flush" since="0.10.25"/>
+ <keyword type="function" name="gst_base_rtp_audio_payload_set_samplebits_options ()" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-samplebits-options" since="0.10.18"/>
+ <keyword type="property" name="The &quot;buffer-list&quot; property" link="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload--buffer-list"/>
+ <keyword type="struct" name="struct GstBaseRTPDepayload" link="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload-struct"/>
+ <keyword type="struct" name="struct GstBaseRTPDepayloadClass" link="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayloadClass"/>
+ <keyword type="macro" name="GST_BASE_RTP_DEPAYLOAD_SINKPAD()" link="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS"/>
+ <keyword type="macro" name="GST_BASE_RTP_DEPAYLOAD_SRCPAD()" link="gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS"/>
+ <keyword type="function" name="gst_base_rtp_depayload_push ()" link="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push"/>
+ <keyword type="function" name="gst_base_rtp_depayload_push_ts ()" link="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-ts"/>
+ <keyword type="function" name="gst_base_rtp_depayload_push_list ()" link="gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-list" since="0.10.32"/>
+ <keyword type="struct" name="struct GstBaseRTPPayload" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload-struct"/>
+ <keyword type="struct" name="struct GstBaseRTPPayloadClass" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayloadClass"/>
+ <keyword type="macro" name="GST_BASE_RTP_PAYLOAD_MTU()" link="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-MTU:CAPS"/>
+ <keyword type="macro" name="GST_BASE_RTP_PAYLOAD_PT()" link="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-PT:CAPS"/>
+ <keyword type="macro" name="GST_BASE_RTP_PAYLOAD_SINKPAD()" link="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS"/>
+ <keyword type="macro" name="GST_BASE_RTP_PAYLOAD_SRCPAD()" link="gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS"/>
+ <keyword type="function" name="gst_basertppayload_is_filled ()" link="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-is-filled"/>
+ <keyword type="function" name="gst_basertppayload_push ()" link="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push"/>
+ <keyword type="function" name="gst_basertppayload_push_list ()" link="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push-list" since="0.10.24"/>
+ <keyword type="function" name="gst_basertppayload_set_options ()" link="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-options"/>
+ <keyword type="function" name="gst_basertppayload_set_outcaps ()" link="gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-outcaps"/>
+ <keyword type="property" name="The &quot;max-ptime&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--max-ptime"/>
+ <keyword type="property" name="The &quot;min-ptime&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--min-ptime"/>
+ <keyword type="property" name="The &quot;mtu&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--mtu"/>
+ <keyword type="property" name="The &quot;perfect-rtptime&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--perfect-rtptime"/>
+ <keyword type="property" name="The &quot;pt&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--pt"/>
+ <keyword type="property" name="The &quot;ptime-multiple&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ptime-multiple"/>
+ <keyword type="property" name="The &quot;seqnum&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum"/>
+ <keyword type="property" name="The &quot;seqnum-offset&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum-offset"/>
+ <keyword type="property" name="The &quot;ssrc&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ssrc"/>
+ <keyword type="property" name="The &quot;timestamp&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp"/>
+ <keyword type="property" name="The &quot;timestamp-offset&quot; property" link="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp-offset"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstrtpbuffer.html#id535614"/>
+ <keyword type="macro" name="GST_RTP_VERSION" link="gst-plugins-base-libs-gstrtpbuffer.html#GST-RTP-VERSION:CAPS"/>
+ <keyword type="function" name="gst_rtp_buffer_allocate_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-allocate-data"/>
+ <keyword type="function" name="gst_rtp_buffer_new_take_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-take-data"/>
+ <keyword type="function" name="gst_rtp_buffer_new_copy_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-copy-data"/>
+ <keyword type="function" name="gst_rtp_buffer_new_allocate ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate"/>
+ <keyword type="function" name="gst_rtp_buffer_new_allocate_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate-len"/>
+ <keyword type="function" name="gst_rtp_buffer_calc_header_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-header-len"/>
+ <keyword type="function" name="gst_rtp_buffer_calc_packet_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-packet-len"/>
+ <keyword type="function" name="gst_rtp_buffer_calc_payload_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-payload-len"/>
+ <keyword type="function" name="gst_rtp_buffer_validate ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate"/>
+ <keyword type="function" name="gst_rtp_buffer_validate_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate-data"/>
+ <keyword type="function" name="gst_rtp_buffer_set_packet_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-packet-len"/>
+ <keyword type="function" name="gst_rtp_buffer_get_packet_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-packet-len"/>
+ <keyword type="function" name="gst_rtp_buffer_get_header_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-header-len"/>
+ <keyword type="function" name="gst_rtp_buffer_get_version ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-version"/>
+ <keyword type="function" name="gst_rtp_buffer_set_version ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-version"/>
+ <keyword type="function" name="gst_rtp_buffer_get_padding ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-padding"/>
+ <keyword type="function" name="gst_rtp_buffer_set_padding ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-padding"/>
+ <keyword type="function" name="gst_rtp_buffer_pad_to ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-pad-to"/>
+ <keyword type="function" name="gst_rtp_buffer_get_extension ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension"/>
+ <keyword type="function" name="gst_rtp_buffer_set_extension ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension"/>
+ <keyword type="function" name="gst_rtp_buffer_get_extension_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-data" since="0.10.15"/>
+ <keyword type="function" name="gst_rtp_buffer_get_ssrc ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-ssrc"/>
+ <keyword type="function" name="gst_rtp_buffer_set_ssrc ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-ssrc"/>
+ <keyword type="function" name="gst_rtp_buffer_get_csrc_count ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc-count"/>
+ <keyword type="function" name="gst_rtp_buffer_get_csrc ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc"/>
+ <keyword type="function" name="gst_rtp_buffer_set_csrc ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-csrc"/>
+ <keyword type="function" name="gst_rtp_buffer_get_marker ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-marker"/>
+ <keyword type="function" name="gst_rtp_buffer_set_marker ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-marker"/>
+ <keyword type="function" name="gst_rtp_buffer_get_payload_type ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-type"/>
+ <keyword type="function" name="gst_rtp_buffer_set_payload_type ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-payload-type"/>
+ <keyword type="function" name="gst_rtp_buffer_get_seq ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-seq"/>
+ <keyword type="function" name="gst_rtp_buffer_set_seq ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-seq"/>
+ <keyword type="function" name="gst_rtp_buffer_get_timestamp ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-timestamp"/>
+ <keyword type="function" name="gst_rtp_buffer_set_timestamp ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-timestamp"/>
+ <keyword type="function" name="gst_rtp_buffer_get_payload_buffer ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-buffer"/>
+ <keyword type="function" name="gst_rtp_buffer_get_payload_subbuffer ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-subbuffer" since="0.10.10"/>
+ <keyword type="function" name="gst_rtp_buffer_get_payload_len ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-len"/>
+ <keyword type="function" name="gst_rtp_buffer_get_payload ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload"/>
+ <keyword type="function" name="gst_rtp_buffer_default_clock_rate ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-default-clock-rate" since="0.10.13"/>
+ <keyword type="function" name="gst_rtp_buffer_compare_seqnum ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-compare-seqnum" since="0.10.15"/>
+ <keyword type="function" name="gst_rtp_buffer_ext_timestamp ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-ext-timestamp" since="0.10.15"/>
+ <keyword type="function" name="gst_rtp_buffer_set_extension_data ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension-data" since="0.10.18"/>
+ <keyword type="function" name="gst_rtp_buffer_get_extension_onebyte_header ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-onebyte-header" since="0.10.31"/>
+ <keyword type="function" name="gst_rtp_buffer_get_extension_twobytes_header ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-twobytes-header" since="0.10.31"/>
+ <keyword type="function" name="gst_rtp_buffer_add_extension_onebyte_header ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-onebyte-header" since="0.10.31"/>
+ <keyword type="function" name="gst_rtp_buffer_add_extension_twobytes_header ()" link="gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-twobytes-header" since="0.10.31"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstrtcpbuffer.html#id539655"/>
+ <keyword type="macro" name="GST_RTCP_VERSION" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VERSION:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_MAX_SDES" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_MAX_BYE_SSRC_COUNT" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_MAX_RB_COUNT" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-RB-COUNT:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_MAX_SDES_ITEM_COUNT" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_VALID_MASK" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-MASK:CAPS"/>
+ <keyword type="macro" name="GST_RTCP_VALID_VALUE" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-VALUE:CAPS"/>
+ <keyword type="enum" name="enum GstRTCPType" link="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType"/>
+ <keyword type="struct" name="struct GstRTCPPacket" link="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket"/>
+ <keyword type="enum" name="enum GstRTCPSDESType" link="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType"/>
+ <keyword type="enum" name="enum GstRTCPFBType" link="gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_buffer_new_take_data ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-take-data"/>
+ <keyword type="function" name="gst_rtcp_buffer_new_copy_data ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-copy-data"/>
+ <keyword type="function" name="gst_rtcp_buffer_validate_data ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate-data"/>
+ <keyword type="function" name="gst_rtcp_buffer_validate ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate"/>
+ <keyword type="function" name="gst_rtcp_buffer_new ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new"/>
+ <keyword type="function" name="gst_rtcp_buffer_get_packet_count ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-packet-count"/>
+ <keyword type="function" name="gst_rtcp_buffer_get_first_packet ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet"/>
+ <keyword type="function" name="gst_rtcp_packet_move_to_next ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-move-to-next"/>
+ <keyword type="function" name="gst_rtcp_buffer_add_packet ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-add-packet"/>
+ <keyword type="function" name="gst_rtcp_packet_remove ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-remove"/>
+ <keyword type="function" name="gst_rtcp_packet_get_padding ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-padding"/>
+ <keyword type="function" name="gst_rtcp_packet_get_count ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-count"/>
+ <keyword type="function" name="gst_rtcp_packet_get_type ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-type"/>
+ <keyword type="function" name="gst_rtcp_packet_get_length ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-length"/>
+ <keyword type="function" name="gst_rtcp_packet_sr_get_sender_info ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-get-sender-info"/>
+ <keyword type="function" name="gst_rtcp_packet_sr_set_sender_info ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-set-sender-info"/>
+ <keyword type="function" name="gst_rtcp_packet_rr_get_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-get-ssrc"/>
+ <keyword type="function" name="gst_rtcp_packet_rr_set_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-set-ssrc"/>
+ <keyword type="function" name="gst_rtcp_packet_get_rb_count ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb-count"/>
+ <keyword type="function" name="gst_rtcp_packet_get_rb ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb"/>
+ <keyword type="function" name="gst_rtcp_packet_add_rb ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-add-rb"/>
+ <keyword type="function" name="gst_rtcp_packet_set_rb ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-set-rb"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_get_item_count ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-item-count"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_first_item ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-item"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_next_item ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-item"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_get_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-ssrc"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_first_entry ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-entry"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_next_entry ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-entry"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_get_entry ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-entry"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_copy_entry ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-copy-entry"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_add_item ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-item"/>
+ <keyword type="function" name="gst_rtcp_packet_sdes_add_entry ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-entry"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_get_ssrc_count ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-ssrc-count"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_get_nth_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-nth-ssrc"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_add_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrc"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_add_ssrcs ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrcs"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_get_reason_len ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason-len"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_get_reason ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason"/>
+ <keyword type="function" name="gst_rtcp_packet_bye_set_reason ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-set-reason"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_get_type ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-type" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_set_type ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-type" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_get_sender_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-sender-ssrc" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_set_sender_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-sender-ssrc" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_get_media_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-media-ssrc" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_set_media_ssrc ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-media-ssrc" since="0.10.23"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_get_fci_length ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci-length" since="0.10.31"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_set_fci_length ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-fci-length" since="0.10.31"/>
+ <keyword type="function" name="gst_rtcp_packet_fb_get_fci ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci" since="0.10.31"/>
+ <keyword type="function" name="gst_rtcp_ntp_to_unix ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-ntp-to-unix"/>
+ <keyword type="function" name="gst_rtcp_unix_to_ntp ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-unix-to-ntp"/>
+ <keyword type="function" name="gst_rtcp_sdes_name_to_type ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-name-to-type" since="0.10.26"/>
+ <keyword type="function" name="gst_rtcp_sdes_type_to_name ()" link="gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-type-to-name" since="0.10.26"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstrtppayloads.html#id420172"/>
+ <keyword type="enum" name="enum GstRTPPayload" link="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayload"/>
+ <keyword type="macro" name="GST_RTP_PAYLOAD_IS_DYNAMIC()" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS"/>
+ <keyword type="struct" name="struct GstRTPPayloadInfo" link="gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo"/>
+ <keyword type="function" name="gst_rtp_payload_info_for_name ()" link="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-name"/>
+ <keyword type="function" name="gst_rtp_payload_info_for_pt ()" link="gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-pt"/>
+ <keyword type="function" name="gst_rtsp_base64_encode ()" link="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-encode" deprecated="Use g_base64_encode()"/>
+ <keyword type="function" name="gst_rtsp_base64_decode_ip ()" link="gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-decode-ip" deprecated="use g_base64_decode_inplace() instead."/>
+ <keyword type="struct" name="GstRTSPConnection" link="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection"/>
+ <keyword type="function" name="gst_rtsp_connection_create ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create"/>
+ <keyword type="function" name="gst_rtsp_connection_create_from_fd ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create-from-fd" since="0.10.25"/>
+ <keyword type="function" name="gst_rtsp_connection_accept ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-accept" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_connect ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-connect"/>
+ <keyword type="function" name="gst_rtsp_connection_close ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-close"/>
+ <keyword type="function" name="gst_rtsp_connection_free ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-free"/>
+ <keyword type="function" name="gst_rtsp_connection_read ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-read"/>
+ <keyword type="function" name="gst_rtsp_connection_write ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-write"/>
+ <keyword type="function" name="gst_rtsp_connection_poll ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-poll" since="0.10.15"/>
+ <keyword type="function" name="gst_rtsp_connection_send ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-send"/>
+ <keyword type="function" name="gst_rtsp_connection_receive ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-receive"/>
+ <keyword type="function" name="gst_rtsp_connection_next_timeout ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-next-timeout"/>
+ <keyword type="function" name="gst_rtsp_connection_reset_timeout ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-reset-timeout"/>
+ <keyword type="function" name="gst_rtsp_connection_flush ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush"/>
+ <keyword type="function" name="gst_rtsp_connection_set_auth ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth"/>
+ <keyword type="function" name="gst_rtsp_connection_set_auth_param ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth-param" since="0.10.20"/>
+ <keyword type="function" name="gst_rtsp_connection_clear_auth_params ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-clear-auth-params" since="0.10.20"/>
+ <keyword type="function" name="gst_rtsp_connection_set_qos_dscp ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-qos-dscp" since="0.10.20"/>
+ <keyword type="function" name="gst_rtsp_connection_set_ip ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-ip" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_get_ip ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-ip" since="0.10.20"/>
+ <keyword type="function" name="gst_rtsp_connection_get_url ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-url" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_set_tunneled ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-tunneled" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_is_tunneled ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-is-tunneled" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_get_tunnelid ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-tunnelid" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_do_tunnel ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_get_readfd ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-readfd" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_get_writefd ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-writefd" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_connection_set_http_mode ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-http-mode" since="0.10.25"/>
+ <keyword type="function" name="gst_rtsp_connection_set_proxy ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-proxy" since="0.10.23"/>
+ <keyword type="struct" name="GstRTSPWatch" link="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch"/>
+ <keyword type="struct" name="GstRTSPWatchFuncs" link="gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_new ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-new" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_unref ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-unref" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_attach ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-attach" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_reset ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-reset" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_queue_message ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-message" deprecated="Use gst_rtsp_watch_send_message()" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_watch_queue_data ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-data" deprecated="Use gst_rtsp_watch_write_data()" since="0.10.24"/>
+ <keyword type="function" name="gst_rtsp_watch_send_message ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-send-message" since="0.10.25"/>
+ <keyword type="function" name="gst_rtsp_watch_write_data ()" link="gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-write-data" since="0.10.25"/>
+ <keyword type="macro" name="GST_RTSP_CHECK()" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-CHECK:CAPS"/>
+ <keyword type="macro" name="GST_RTSP_AUTH_MAX" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-MAX:CAPS"/>
+ <keyword type="enum" name="enum GstRTSPEvent" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent"/>
+ <keyword type="enum" name="enum GstRTSPResult" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult"/>
+ <keyword type="enum" name="enum GstRTSPFamily" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPFamily"/>
+ <keyword type="enum" name="enum GstRTSPState" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPState"/>
+ <keyword type="enum" name="enum GstRTSPVersion" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion"/>
+ <keyword type="enum" name="enum GstRTSPMethod" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod"/>
+ <keyword type="enum" name="enum GstRTSPAuthMethod" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod"/>
+ <keyword type="enum" name="enum GstRTSPHeaderField" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField"/>
+ <keyword type="enum" name="enum GstRTSPStatusCode" link="gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode"/>
+ <keyword type="function" name="gst_rtsp_strresult ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-strresult"/>
+ <keyword type="function" name="gst_rtsp_method_as_text ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-method-as-text"/>
+ <keyword type="function" name="gst_rtsp_version_as_text ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-version-as-text"/>
+ <keyword type="function" name="gst_rtsp_header_as_text ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-as-text"/>
+ <keyword type="function" name="gst_rtsp_header_allow_multiple ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-allow-multiple" since="0.10.25"/>
+ <keyword type="function" name="gst_rtsp_status_as_text ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-status-as-text"/>
+ <keyword type="function" name="gst_rtsp_options_as_text ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-options-as-text" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_find_header_field ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-header-field"/>
+ <keyword type="function" name="gst_rtsp_find_method ()" link="gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-method"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstrtspextension.html#id434543"/>
+ <keyword type="struct" name="GstRTSPExtension" link="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtension"/>
+ <keyword type="struct" name="struct GstRTSPExtensionInterface" link="gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtensionInterface"/>
+ <keyword type="enum" name="enum GstRTSPMsgType" link="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType"/>
+ <keyword type="struct" name="struct GstRTSPMessage" link="gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage"/>
+ <keyword type="function" name="gst_rtsp_message_new ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new"/>
+ <keyword type="function" name="gst_rtsp_message_init ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init"/>
+ <keyword type="function" name="gst_rtsp_message_unset ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset"/>
+ <keyword type="function" name="gst_rtsp_message_free ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free"/>
+ <keyword type="function" name="gst_rtsp_message_get_type ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-type"/>
+ <keyword type="function" name="gst_rtsp_message_new_request ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-request"/>
+ <keyword type="function" name="gst_rtsp_message_init_request ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-request"/>
+ <keyword type="function" name="gst_rtsp_message_parse_request ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-request"/>
+ <keyword type="function" name="gst_rtsp_message_new_response ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-response"/>
+ <keyword type="function" name="gst_rtsp_message_init_response ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-response"/>
+ <keyword type="function" name="gst_rtsp_message_parse_response ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-response"/>
+ <keyword type="function" name="gst_rtsp_message_new_data ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-data"/>
+ <keyword type="function" name="gst_rtsp_message_init_data ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-data"/>
+ <keyword type="function" name="gst_rtsp_message_parse_data ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-data"/>
+ <keyword type="function" name="gst_rtsp_message_add_header ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-add-header"/>
+ <keyword type="function" name="gst_rtsp_message_take_header ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-header" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_message_remove_header ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-remove-header"/>
+ <keyword type="function" name="gst_rtsp_message_get_header ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-header"/>
+ <keyword type="function" name="gst_rtsp_message_append_headers ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-append-headers"/>
+ <keyword type="function" name="gst_rtsp_message_set_body ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-set-body"/>
+ <keyword type="function" name="gst_rtsp_message_take_body ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-body"/>
+ <keyword type="function" name="gst_rtsp_message_get_body ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-body"/>
+ <keyword type="function" name="gst_rtsp_message_steal_body ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-steal-body"/>
+ <keyword type="function" name="gst_rtsp_message_dump ()" link="gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-dump"/>
+ <keyword type="enum" name="enum GstRTSPRangeUnit" link="gst-plugins-base-libs-gstrtsprange.html#GstRTSPRangeUnit"/>
+ <keyword type="struct" name="struct GstRTSPTimeRange" link="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange"/>
+ <keyword type="struct" name="struct GstRTSPTime" link="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime"/>
+ <keyword type="enum" name="enum GstRTSPTimeType" link="gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeType"/>
+ <keyword type="function" name="gst_rtsp_range_parse ()" link="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-parse"/>
+ <keyword type="function" name="gst_rtsp_range_to_string ()" link="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-to-string" since="0.10.23"/>
+ <keyword type="function" name="gst_rtsp_range_free ()" link="gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-free"/>
+ <keyword type="enum" name="enum GstRTSPTransMode" link="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode"/>
+ <keyword type="enum" name="enum GstRTSPProfile" link="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPProfile"/>
+ <keyword type="struct" name="struct GstRTSPRange" link="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange"/>
+ <keyword type="enum" name="enum GstRTSPLowerTrans" link="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans"/>
+ <keyword type="struct" name="struct GstRTSPTransport" link="gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport"/>
+ <keyword type="function" name="gst_rtsp_transport_new ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-new"/>
+ <keyword type="function" name="gst_rtsp_transport_init ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-init"/>
+ <keyword type="function" name="gst_rtsp_transport_parse ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-parse"/>
+ <keyword type="function" name="gst_rtsp_transport_as_text ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-as-text"/>
+ <keyword type="function" name="gst_rtsp_transport_get_mime ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-mime"/>
+ <keyword type="function" name="gst_rtsp_transport_get_manager ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-manager"/>
+ <keyword type="function" name="gst_rtsp_transport_free ()" link="gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-free"/>
+ <keyword type="macro" name="GST_RTSP_DEFAULT_PORT" link="gst-plugins-base-libs-gstrtspurl.html#GST-RTSP-DEFAULT-PORT:CAPS"/>
+ <keyword type="struct" name="struct GstRTSPUrl" link="gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl"/>
+ <keyword type="function" name="gst_rtsp_url_parse ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-parse"/>
+ <keyword type="function" name="gst_rtsp_url_copy ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-copy" since="0.10.22"/>
+ <keyword type="function" name="gst_rtsp_url_free ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free"/>
+ <keyword type="function" name="gst_rtsp_url_get_request_uri ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-request-uri"/>
+ <keyword type="function" name="gst_rtsp_url_set_port ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-set-port"/>
+ <keyword type="function" name="gst_rtsp_url_get_port ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-port"/>
+ <keyword type="function" name="gst_rtsp_url_decode_path_components ()" link="gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-decode-path-components" since="0.10.32"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstsdpmessage.html#id590545"/>
+ <keyword type="enum" name="enum GstSDPResult" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult"/>
+ <keyword type="struct" name="GstSDPOrigin" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin"/>
+ <keyword type="struct" name="GstSDPConnection" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_CT" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-CT:CAPS"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_AS" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-AS:CAPS"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_EXT_PREFIX" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-EXT-PREFIX:CAPS"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_RR" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RR:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_RS" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RS:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_SDP_BWTYPE_TIAS" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-TIAS:CAPS" since="0.10.30"/>
+ <keyword type="struct" name="GstSDPBandwidth" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth"/>
+ <keyword type="struct" name="GstSDPTime" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime"/>
+ <keyword type="struct" name="GstSDPZone" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone"/>
+ <keyword type="struct" name="GstSDPKey" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey"/>
+ <keyword type="struct" name="GstSDPAttribute" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute"/>
+ <keyword type="struct" name="GstSDPMedia" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia"/>
+ <keyword type="struct" name="GstSDPMessage" link="gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage"/>
+ <keyword type="function" name="gst_sdp_message_new ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new"/>
+ <keyword type="function" name="gst_sdp_message_init ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-init"/>
+ <keyword type="function" name="gst_sdp_message_uninit ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-uninit"/>
+ <keyword type="function" name="gst_sdp_message_free ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-free"/>
+ <keyword type="function" name="gst_sdp_message_parse_buffer ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-buffer"/>
+ <keyword type="function" name="gst_sdp_message_as_text ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-text"/>
+ <keyword type="function" name="gst_sdp_message_parse_uri ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-uri" since="0.10.31"/>
+ <keyword type="function" name="gst_sdp_message_as_uri ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-uri" since="0.10.31"/>
+ <keyword type="function" name="gst_sdp_address_is_multicast ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-address-is-multicast" since="0.10.32"/>
+ <keyword type="function" name="gst_sdp_message_get_version ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-version"/>
+ <keyword type="function" name="gst_sdp_message_set_version ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-version"/>
+ <keyword type="function" name="gst_sdp_message_get_origin ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-origin"/>
+ <keyword type="function" name="gst_sdp_message_set_origin ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-origin"/>
+ <keyword type="function" name="gst_sdp_message_get_session_name ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-session-name"/>
+ <keyword type="function" name="gst_sdp_message_set_session_name ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-session-name"/>
+ <keyword type="function" name="gst_sdp_message_get_information ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-information"/>
+ <keyword type="function" name="gst_sdp_message_set_information ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-information"/>
+ <keyword type="function" name="gst_sdp_message_get_uri ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-uri"/>
+ <keyword type="function" name="gst_sdp_message_set_uri ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-uri"/>
+ <keyword type="function" name="gst_sdp_message_emails_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-emails-len"/>
+ <keyword type="function" name="gst_sdp_message_get_email ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-email"/>
+ <keyword type="function" name="gst_sdp_message_add_email ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-email"/>
+ <keyword type="function" name="gst_sdp_message_phones_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-phones-len"/>
+ <keyword type="function" name="gst_sdp_message_get_phone ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-phone"/>
+ <keyword type="function" name="gst_sdp_message_add_phone ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-phone"/>
+ <keyword type="function" name="gst_sdp_message_get_connection ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-connection"/>
+ <keyword type="function" name="gst_sdp_message_set_connection ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-connection"/>
+ <keyword type="function" name="gst_sdp_message_bandwidths_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-bandwidths-len"/>
+ <keyword type="function" name="gst_sdp_message_get_bandwidth ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-bandwidth"/>
+ <keyword type="function" name="gst_sdp_message_add_bandwidth ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-bandwidth"/>
+ <keyword type="function" name="gst_sdp_message_times_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-times-len"/>
+ <keyword type="function" name="gst_sdp_message_get_time ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-time"/>
+ <keyword type="function" name="gst_sdp_message_add_time ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-time"/>
+ <keyword type="function" name="gst_sdp_message_zones_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-zones-len"/>
+ <keyword type="function" name="gst_sdp_message_get_zone ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-zone"/>
+ <keyword type="function" name="gst_sdp_message_add_zone ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-zone"/>
+ <keyword type="function" name="gst_sdp_message_get_key ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-key"/>
+ <keyword type="function" name="gst_sdp_message_set_key ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-key"/>
+ <keyword type="function" name="gst_sdp_message_attributes_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-attributes-len"/>
+ <keyword type="function" name="gst_sdp_message_get_attribute ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute"/>
+ <keyword type="function" name="gst_sdp_message_get_attribute_val ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val"/>
+ <keyword type="function" name="gst_sdp_message_get_attribute_val_n ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val-n"/>
+ <keyword type="function" name="gst_sdp_message_add_attribute ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-attribute"/>
+ <keyword type="function" name="gst_sdp_message_medias_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-medias-len"/>
+ <keyword type="function" name="gst_sdp_message_get_media ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-media"/>
+ <keyword type="function" name="gst_sdp_message_add_media ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-media"/>
+ <keyword type="function" name="gst_sdp_message_dump ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-dump"/>
+ <keyword type="function" name="gst_sdp_media_new ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new"/>
+ <keyword type="function" name="gst_sdp_media_init ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init"/>
+ <keyword type="function" name="gst_sdp_media_uninit ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-uninit"/>
+ <keyword type="function" name="gst_sdp_media_free ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-free"/>
+ <keyword type="function" name="gst_sdp_media_get_media ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-media"/>
+ <keyword type="function" name="gst_sdp_media_set_media ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-media"/>
+ <keyword type="function" name="gst_sdp_media_get_port ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-port"/>
+ <keyword type="function" name="gst_sdp_media_get_num_ports ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-num-ports"/>
+ <keyword type="function" name="gst_sdp_media_set_port_info ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-port-info"/>
+ <keyword type="function" name="gst_sdp_media_get_proto ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-proto"/>
+ <keyword type="function" name="gst_sdp_media_set_proto ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-proto"/>
+ <keyword type="function" name="gst_sdp_media_formats_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-formats-len"/>
+ <keyword type="function" name="gst_sdp_media_get_format ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-format"/>
+ <keyword type="function" name="gst_sdp_media_add_format ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-format"/>
+ <keyword type="function" name="gst_sdp_media_get_information ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-information"/>
+ <keyword type="function" name="gst_sdp_media_set_information ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-information"/>
+ <keyword type="function" name="gst_sdp_media_connections_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-connections-len"/>
+ <keyword type="function" name="gst_sdp_media_get_connection ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-connection"/>
+ <keyword type="function" name="gst_sdp_media_add_connection ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-connection"/>
+ <keyword type="function" name="gst_sdp_media_bandwidths_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-bandwidths-len"/>
+ <keyword type="function" name="gst_sdp_media_get_bandwidth ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-bandwidth"/>
+ <keyword type="function" name="gst_sdp_media_add_bandwidth ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-bandwidth"/>
+ <keyword type="function" name="gst_sdp_media_get_key ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-key"/>
+ <keyword type="function" name="gst_sdp_media_set_key ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-key"/>
+ <keyword type="function" name="gst_sdp_media_attributes_len ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-attributes-len"/>
+ <keyword type="function" name="gst_sdp_media_get_attribute ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute"/>
+ <keyword type="function" name="gst_sdp_media_get_attribute_val ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val"/>
+ <keyword type="function" name="gst_sdp_media_get_attribute_val_n ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val-n"/>
+ <keyword type="function" name="gst_sdp_media_add_attribute ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-attribute"/>
+ <keyword type="function" name="gst_sdp_media_as_text ()" link="gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-as-text"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttag.html#id587777"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_TRACKID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRACKID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_ARTISTID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ARTISTID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_ALBUMID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_ALBUMARTISTID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_TRMID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRMID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MUSICBRAINZ_SORTNAME" link="gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-SORTNAME:CAPS" deprecated=""/>
+ <keyword type="macro" name="GST_TAG_CDDA_CDDB_DISCID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CDDA_CDDB_DISCID_FULL" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CDDA_MUSICBRAINZ_DISCID" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CDDA_TRACK_TAGS" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-TRACK-TAGS:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CMML_CLIP" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-CLIP:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CMML_HEAD" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-HEAD:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CMML_STREAM" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-STREAM:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_SHUTTER_SPEED" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_FOCAL_RATIO" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-RATIO:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_FOCAL_LENGTH" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_ISO_SPEED" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-ISO-SPEED:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_EXPOSURE_PROGRAM" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_EXPOSURE_MODE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_GAIN_ADJUSTMENT" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_WHITE_BALANCE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-WHITE-BALANCE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_CONTRAST" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-CONTRAST:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_SATURATION" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SATURATION:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_SHARPNESS" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHARPNESS:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_FLASH_FIRED" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-FIRED:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_FLASH_MODE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-MODE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_METERING_MODE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-METERING-MODE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_SOURCE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SOURCE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_CAPTURING_EXPOSURE_COMPENSATION" link="gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_TAG_IMAGE_HORIZONTAL_PPI" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_IMAGE_VERTICAL_PPI" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-VERTICAL-PPI:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_ID3V2_HEADER_SIZE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-ID3V2-HEADER-SIZE:CAPS" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_register_musicbrainz_tags ()" link="gst-plugins-base-libs-gsttag.html#gst-tag-register-musicbrainz-tags"/>
+ <keyword type="function" name="gst_tag_freeform_string_to_utf8 ()" link="gst-plugins-base-libs-gsttag.html#gst-tag-freeform-string-to-utf8" since="0.10.13"/>
+ <keyword type="function" name="gst_tag_parse_extended_comment ()" link="gst-plugins-base-libs-gsttag.html#gst-tag-parse-extended-comment" since="0.10.10"/>
+ <keyword type="function" name="gst_tag_image_data_to_image_buffer ()" link="gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer" since="0.10.20"/>
+ <keyword type="enum" name="enum GstTagImageType" link="gst-plugins-base-libs-gsttag.html#GstTagImageType" since="0.10.9"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttagvorbis.html#id586856"/>
+ <keyword type="function" name="gst_tag_from_vorbis_tag ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-from-vorbis-tag"/>
+ <keyword type="function" name="gst_tag_to_vorbis_tag ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-tag"/>
+ <keyword type="function" name="gst_vorbis_tag_add ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-vorbis-tag-add"/>
+ <keyword type="function" name="gst_tag_to_vorbis_comments ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-comments"/>
+ <keyword type="function" name="gst_tag_list_from_vorbiscomment_buffer ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-from-vorbiscomment-buffer"/>
+ <keyword type="function" name="gst_tag_list_to_vorbiscomment_buffer ()" link="gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-to-vorbiscomment-buffer"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttagid3.html#id587290"/>
+ <keyword type="function" name="gst_tag_id3_genre_count ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-count"/>
+ <keyword type="function" name="gst_tag_id3_genre_get ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-get"/>
+ <keyword type="function" name="gst_tag_list_new_from_id3v1 ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-new-from-id3v1"/>
+ <keyword type="function" name="gst_tag_from_id3_tag ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-tag"/>
+ <keyword type="function" name="gst_tag_from_id3_user_tag ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-user-tag"/>
+ <keyword type="function" name="gst_tag_to_id3_tag ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-to-id3-tag"/>
+ <keyword type="function" name="gst_tag_list_add_id3_image ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-add-id3-image" since="0.10.20"/>
+ <keyword type="function" name="gst_tag_get_id3v2_tag_size ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-get-id3v2-tag-size" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_list_from_id3v2_tag ()" link="gst-plugins-base-libs-gsttagid3.html#gst-tag-list-from-id3v2-tag" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_list_to_exif_buffer ()" link="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer" since="0.10.30"/>
+ <keyword type="function" name="gst_tag_list_to_exif_buffer_with_tiff_header ()" link="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer-with-tiff-header" since="0.10.30"/>
+ <keyword type="function" name="gst_tag_list_from_exif_buffer ()" link="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer" since="0.10.30"/>
+ <keyword type="function" name="gst_tag_list_from_exif_buffer_with_tiff_header ()" link="gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer-with-tiff-header" since="0.10.30"/>
+ <keyword type="function" name="gst_tag_list_from_xmp_buffer ()" link="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-from-xmp-buffer" since="0.10.29"/>
+ <keyword type="function" name="gst_tag_list_to_xmp_buffer ()" link="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer" since="0.10.29"/>
+ <keyword type="function" name="gst_tag_list_to_xmp_buffer_full ()" link="gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer-full" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_list_schemas ()" link="gst-plugins-base-libs-gsttagxmp.html#gst-tag-xmp-list-schemas" since="0.10.33"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttagxmpwriter.html#id579853"/>
+ <keyword type="function" name="gst_tag_xmp_writer_add_all_schemas ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-all-schemas" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_writer_add_schema ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-schema" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_writer_has_schema ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-has-schema" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_writer_remove_schema ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-schema" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_writer_remove_all_schemas ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-all-schemas" since="0.10.33"/>
+ <keyword type="function" name="gst_tag_xmp_writer_tag_list_to_xmp_buffer ()" link="gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-tag-list-to-xmp-buffer"/>
+ <keyword type="" name="Deriving from GstTagDemux" link="gst-plugins-base-libs-gsttagdemux.html#id453782"/>
+ <keyword type="struct" name="struct GstTagDemux" link="gst-plugins-base-libs-gsttagdemux.html#GstTagDemux" since="0.10.15"/>
+ <keyword type="struct" name="struct GstTagDemuxClass" link="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxClass" since="0.10.15"/>
+ <keyword type="enum" name="enum GstTagDemuxResult" link="gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxResult" since="0.10.15"/>
+ <keyword type="" name="Deriving from GstTagMux" link="gst-plugins-base-libs-gsttagmux.html#id428505"/>
+ <keyword type="struct" name="struct GstTagMux" link="gst-plugins-base-libs-gsttagmux.html#GstTagMux" since="0.10.36"/>
+ <keyword type="struct" name="struct GstTagMuxClass" link="gst-plugins-base-libs-gsttagmux.html#GstTagMuxClass" since="0.10.36"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gsttaglanguagecodes.html#id577297"/>
+ <keyword type="function" name="gst_tag_get_language_codes ()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-codes" since="0.10.26"/>
+ <keyword type="function" name="gst_tag_get_language_name ()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-name" since="0.10.26"/>
+ <keyword type="macro" name="gst_tag_get_language_code()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code" since="0.10.26"/>
+ <keyword type="function" name="gst_tag_get_language_code_iso_639_1 ()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-1" since="0.10.26"/>
+ <keyword type="function" name="gst_tag_get_language_code_iso_639_2B ()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2B" since="0.10.26"/>
+ <keyword type="function" name="gst_tag_get_language_code_iso_639_2T ()" link="gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2T" since="0.10.26"/>
+ <keyword type="enum" name="enum GstTagLicenseFlags" link="gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_flags ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-flags" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_nick ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-nick" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_title ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-title" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_description ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-description" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_jurisdiction ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-jurisdiction" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_license_version ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-version" since="0.10.36"/>
+ <keyword type="function" name="gst_tag_get_licenses ()" link="gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-licenses" since="0.10.36"/>
+ <keyword type="" name="Linking to this library" link="gst-plugins-base-libs-gstpbutils.html#id442245"/>
+ <keyword type="function" name="gst_pb_utils_init ()" link="gst-plugins-base-libs-gstpbutils.html#gst-pb-utils-init" since="0.10.12"/>
+ <keyword type="macro" name="GST_PLUGINS_BASE_VERSION_MAJOR" link="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MAJOR:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_PLUGINS_BASE_VERSION_MINOR" link="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MINOR:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_PLUGINS_BASE_VERSION_MICRO" link="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MICRO:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_PLUGINS_BASE_VERSION_NANO" link="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-NANO:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_CHECK_PLUGINS_BASE_VERSION()" link="gst-plugins-base-libs-gstpluginsbaseversion.html#GST-CHECK-PLUGINS-BASE-VERSION:CAPS"/>
+ <keyword type="function" name="gst_plugins_base_version ()" link="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version" since="0.10.31"/>
+ <keyword type="function" name="gst_plugins_base_version_string ()" link="gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version-string" since="0.10.31"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstpbutilscodecutils.html#id602451"/>
+ <keyword type="function" name="gst_codec_utils_aac_get_sample_rate_from_index ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-sample-rate-from-index" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_aac_get_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-profile" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_aac_get_level ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_aac_caps_set_level_and_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-caps-set-level-and-profile" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_h264_get_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_h264_get_level ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_h264_caps_set_level_and_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-caps-set-level-and-profile" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_h264_get_level_idc ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level-idc" since="0.10.36"/>
+ <keyword type="function" name="gst_codec_utils_mpeg4video_get_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-profile" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_mpeg4video_get_level ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-level" since="0.10.31"/>
+ <keyword type="function" name="gst_codec_utils_mpeg4video_caps_set_level_and_profile ()" link="gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-caps-set-level-and-profile" since="0.10.31"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#id585754"/>
+ <keyword type="function" name="gst_pb_utils_get_source_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-source-description"/>
+ <keyword type="function" name="gst_pb_utils_get_sink_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-sink-description"/>
+ <keyword type="function" name="gst_pb_utils_get_decoder_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-decoder-description"/>
+ <keyword type="function" name="gst_pb_utils_get_encoder_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-encoder-description"/>
+ <keyword type="function" name="gst_pb_utils_get_element_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-element-description"/>
+ <keyword type="function" name="gst_pb_utils_add_codec_description_to_tag_list ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list"/>
+ <keyword type="function" name="gst_pb_utils_get_codec_description ()" link="gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-codec-description"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#id605343"/>
+ <keyword type="function" name="gst_missing_plugin_message_get_installer_detail ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail"/>
+ <keyword type="function" name="gst_missing_plugin_message_get_description ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description"/>
+ <keyword type="function" name="gst_is_missing_plugin_message ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-is-missing-plugin-message"/>
+ <keyword type="function" name="gst_missing_decoder_message_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-message-new"/>
+ <keyword type="function" name="gst_missing_encoder_message_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-message-new"/>
+ <keyword type="function" name="gst_missing_uri_source_message_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-message-new"/>
+ <keyword type="function" name="gst_missing_uri_sink_message_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-message-new"/>
+ <keyword type="function" name="gst_missing_element_message_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new"/>
+ <keyword type="function" name="gst_missing_uri_source_installer_detail_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-installer-detail-new" since="0.10.15"/>
+ <keyword type="function" name="gst_missing_uri_sink_installer_detail_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-installer-detail-new" since="0.10.15"/>
+ <keyword type="function" name="gst_missing_element_installer_detail_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-installer-detail-new" since="0.10.15"/>
+ <keyword type="function" name="gst_missing_decoder_installer_detail_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-installer-detail-new" since="0.10.15"/>
+ <keyword type="function" name="gst_missing_encoder_installer_detail_new ()" link="gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-installer-detail-new" since="0.10.15"/>
+ <keyword type="" name="Overview" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#id583118"/>
+ <keyword type="enum" name="enum GstInstallPluginsReturn" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn" since="0.10.12"/>
+ <keyword type="function" name="GstInstallPluginsResultFunc ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_async ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_sync ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_return_get_name ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-return-get-name" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_installation_in_progress ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-installation-in-progress" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_supported ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-supported" since="0.10.15"/>
+ <keyword type="struct" name="GstInstallPluginsContext" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_context_new ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-new" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_context_free ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-free" since="0.10.12"/>
+ <keyword type="function" name="gst_install_plugins_context_set_xid ()" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-set-xid" since="0.10.12"/>
+ <keyword type="struct" name="struct GstDiscoverer" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-struct"/>
+ <keyword type="function" name="gst_discoverer_new ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-new" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_start ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stop ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stop" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_discover_uri ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_discover_uri_async ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri-async" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo-struct"/>
+ <keyword type="enum" name="enum GstDiscovererResult" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_duration ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-duration" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_misc ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-misc" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_result ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-result" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_stream_info ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-info" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_stream_list ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-list" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_tags ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-tags" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_uri ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-uri" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_seekable ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-seekable" since="0.10.32"/>
+ <keyword type="macro" name="gst_discoverer_info_ref()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-ref" since="0.10.31"/>
+ <keyword type="macro" name="gst_discoverer_info_unref()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-unref" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererStreamInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererContainerInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererAudioInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererVideoInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo" since="0.10.31"/>
+ <keyword type="struct" name="GstDiscovererSubtitleInfo" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo" since="0.10.36"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_caps ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-caps" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_misc ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-misc" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_next ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-next" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_previous ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-previous" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_tags ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-tags" since="0.10.31"/>
+ <keyword type="macro" name="gst_discoverer_stream_info_ref()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-ref" since="0.10.31"/>
+ <keyword type="macro" name="gst_discoverer_stream_info_unref()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_stream_info_list_free ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free"/>
+ <keyword type="function" name="gst_discoverer_stream_info_get_stream_type_nick ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-stream-type-nick" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_audio_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-audio-streams" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_container_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-container-streams" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-streams" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_info_get_subtitle_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-subtitle-streams" since="0.10.36"/>
+ <keyword type="function" name="gst_discoverer_info_get_video_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-video-streams" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_bitrate ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-bitrate" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_channels ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-channels" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_depth ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-depth" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_language ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-language" since="0.10.36"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_max_bitrate ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-max-bitrate" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_audio_info_get_sample_rate ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-sample-rate" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_container_info_get_streams ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-container-info-get-streams" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_subtitle_info_get_language ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-subtitle-info-get-language" since="0.10.36"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_bitrate ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-bitrate" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_depth ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-depth" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_framerate_denom ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-denom" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_framerate_num ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-num" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_height ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-height" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_is_interlaced ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-interlaced" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_is_image ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-image" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_max_bitrate ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-max-bitrate" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_par_denom ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-denom" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_par_num ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-num" since="0.10.31"/>
+ <keyword type="function" name="gst_discoverer_video_info_get_width ()" link="gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-width" since="0.10.31"/>
+ <keyword type="property" name="The &quot;timeout&quot; property" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer--timeout"/>
+ <keyword type="signal" name="The &quot;discovered&quot; signal" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-discovered"/>
+ <keyword type="signal" name="The &quot;finished&quot; signal" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-finished"/>
+ <keyword type="signal" name="The &quot;starting&quot; signal" link="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-starting"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-encoding-profile.html#id614507"/>
+ <keyword type="" name="Example: Creating a profile" link="gst-plugins-base-libs-encoding-profile.html#id614570"/>
+ <keyword type="" name="Example: Listing categories, targets and profiles" link="gst-plugins-base-libs-encoding-profile.html#id614595"/>
+ <keyword type="struct" name="GstEncodingProfile" link="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile-struct"/>
+ <keyword type="macro" name="gst_encoding_profile_unref()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-unref" since="0.10.32"/>
+ <keyword type="macro" name="gst_encoding_profile_ref()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-ref" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_find ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-find" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_name ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-name" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_description ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-description" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_format ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-format" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_preset ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-preset" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_presence ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-presence" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_restriction ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_name ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-name" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_description ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-description" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_format ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-format" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_preset ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-preset" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_restriction ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-restriction" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_set_presence ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-presence" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_is_equal ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-is-equal" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_input_caps ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-input-caps" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_profile_get_type_nick ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-type-nick" since="0.10.32"/>
+ <keyword type="struct" name="GstEncodingContainerProfile" link="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile-struct"/>
+ <keyword type="function" name="gst_encoding_container_profile_new ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-new" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_container_profile_add_profile ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-add-profile" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_container_profile_contains_profile ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-contains-profile" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_container_profile_get_profiles ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-get-profiles"/>
+ <keyword type="struct" name="GstEncodingAudioProfile" link="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile-struct"/>
+ <keyword type="function" name="gst_encoding_audio_profile_new ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-audio-profile-new" since="0.10.32"/>
+ <keyword type="struct" name="GstEncodingVideoProfile" link="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile-struct"/>
+ <keyword type="function" name="gst_encoding_video_profile_new ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-new" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_video_profile_get_pass ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-pass" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_video_profile_get_variableframerate ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-variableframerate" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_video_profile_set_pass ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-pass" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_video_profile_set_variableframerate ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-variableframerate" since="0.10.32"/>
+ <keyword type="macro" name="GST_ENCODING_CATEGORY_DEVICE" link="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS"/>
+ <keyword type="macro" name="GST_ENCODING_CATEGORY_ONLINE_SERVICE" link="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS"/>
+ <keyword type="macro" name="GST_ENCODING_CATEGORY_STORAGE_EDITING" link="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS"/>
+ <keyword type="macro" name="GST_ENCODING_CATEGORY_CAPTURE" link="gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-CAPTURE:CAPS"/>
+ <keyword type="struct" name="GstEncodingTarget" link="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget-struct"/>
+ <keyword type="macro" name="gst_encoding_target_unref()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-unref" since="0.10.32"/>
+ <keyword type="macro" name="gst_encoding_target_ref()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-ref" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_new ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-new" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_get_name ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-name" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_get_category ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-category" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_get_description ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-description" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_get_profiles ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profiles" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_get_profile ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profile" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_add_profile ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-add-profile" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_save ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_save_to_file ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save-to-file" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_load ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_target_load_from_file ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load-from-file" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_list_all_targets ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-all-targets" since="0.10.32"/>
+ <keyword type="function" name="gst_encoding_list_available_categories ()" link="gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-available-categories" since="0.10.32"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstvideo.html#id625709"/>
+ <keyword type="macro" name="GST_VIDEO_FPS_RANGE" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FPS-RANGE:CAPS"/>
+ <keyword type="macro" name="GST_VIDEO_SIZE_RANGE" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-SIZE-RANGE:CAPS"/>
+ <keyword type="enum" name="enum GstVideoFormat" link="gst-plugins-base-libs-gstvideo.html#GstVideoFormat"/>
+ <keyword type="function" name="gst_video_calculate_display_ratio ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-calculate-display-ratio" since="0.10.7"/>
+ <keyword type="function" name="gst_video_format_to_fourcc ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-format-to-fourcc" since="0.10.16"/>
+ <keyword type="function" name="gst_video_format_from_fourcc ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-format-from-fourcc" since="0.10.16"/>
+ <keyword type="function" name="gst_video_parse_caps_palette ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-parse-caps-palette" since="0.10.32"/>
+ <keyword type="function" name="GstVideoConvertFrameCallback ()" link="gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback"/>
+ <keyword type="function" name="gst_video_convert_frame ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame" since="0.10.31"/>
+ <keyword type="function" name="gst_video_convert_frame_async ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame-async" since="0.10.31"/>
+ <keyword type="function" name="gst_video_event_new_still_frame ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame" since="0.10.26"/>
+ <keyword type="function" name="gst_video_event_parse_still_frame ()" link="gst-plugins-base-libs-gstvideo.html#gst-video-event-parse-still-frame" since="0.10.26"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstvideofilter.html#id583206"/>
+ <keyword type="struct" name="struct GstVideoFilter" link="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct"/>
+ <keyword type="struct" name="struct GstVideoFilterClass" link="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilterClass"/>
+ <keyword type="" name="" link="gst-plugins-base-libs-gstvideosink.html#id618482"/>
+ <keyword type="struct" name="struct GstVideoSink" link="gst-plugins-base-libs-gstvideosink.html#GstVideoSink-struct"/>
+ <keyword type="struct" name="struct GstVideoSinkClass" link="gst-plugins-base-libs-gstvideosink.html#GstVideoSinkClass"/>
+ <keyword type="struct" name="struct GstVideoRectangle" link="gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle"/>
+ <keyword type="macro" name="GST_VIDEO_SINK_HEIGHT()" link="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-HEIGHT:CAPS"/>
+ <keyword type="macro" name="GST_VIDEO_SINK_PAD()" link="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-PAD:CAPS"/>
+ <keyword type="macro" name="GST_VIDEO_SINK_WIDTH()" link="gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-WIDTH:CAPS"/>
+ <keyword type="function" name="gst_video_sink_center_rect ()" link="gst-plugins-base-libs-gstvideosink.html#gst-video-sink-center-rect"/>
+ <keyword type="property" name="The &quot;show-preroll-frame&quot; property" link="gst-plugins-base-libs-gstvideosink.html#GstVideoSink--show-preroll-frame"/>
+ <keyword type="constant" name="GST_APP_STREAM_TYPE_STREAM" link="gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-STREAM:CAPS"/>
+ <keyword type="constant" name="GST_APP_STREAM_TYPE_SEEKABLE" link="gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-SEEKABLE:CAPS"/>
+ <keyword type="constant" name="GST_APP_STREAM_TYPE_RANDOM_ACCESS" link="gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-RANDOM-ACCESS:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FLAG_NONE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FLAG_DEFAULT_POSITIONS" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FLAG-DEFAULT-POSITIONS:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_UNKNOWN" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S8" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S8:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U8" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U8:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S16LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S16BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U16LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U16BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24_32LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24_32BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24_32LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24_32BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S32LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S32BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U32LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U32BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S20LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S20BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U20LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U20BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S18LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S18BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U18LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U18BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F32LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F32BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F64LE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64LE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F64BE" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64BE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S16" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U16" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24_32" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24_32" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S32" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U32" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S24" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U24" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S20" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U20" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_S18" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_U18" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F32" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_F64" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_FLAG_INTEGER" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-INTEGER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_FLAG_FLOAT" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-FLOAT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_FLAG_SIGNED" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-SIGNED:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_FORMAT_FLAG_COMPLEX" link="gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-COMPLEX:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE" link="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-RESAMPLE:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SINK_SLAVE_SKEW" link="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-SKEW:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SINK_SLAVE_NONE" link="gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-RESAMPLE:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-RETIMESTAMP:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SRC_SLAVE_SKEW" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-SKEW:CAPS"/>
+ <keyword type="constant" name="GST_BASE_AUDIO_SRC_SLAVE_NONE" link="gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_INVALID" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_MONO" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-MONO:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_REAR_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_REAR_LEFT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_LFE" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-LFE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT-OF-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT-OF-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-SIDE-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-SIDE-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-CENTER:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_CHANNEL_POSITION_NONE" link="gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-NONE:CAPS"/>
+ <keyword type="constant" name="GST_SEGSTATE_INVALID" link="gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_SEGSTATE_EMPTY" link="gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-EMPTY:CAPS"/>
+ <keyword type="constant" name="GST_SEGSTATE_FILLED" link="gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-FILLED:CAPS"/>
+ <keyword type="constant" name="GST_SEGSTATE_PARTIAL" link="gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-PARTIAL:CAPS"/>
+ <keyword type="constant" name="GST_RING_BUFFER_STATE_STOPPED" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-STOPPED:CAPS"/>
+ <keyword type="constant" name="GST_RING_BUFFER_STATE_PAUSED" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-PAUSED:CAPS"/>
+ <keyword type="constant" name="GST_RING_BUFFER_STATE_STARTED" link="gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-STARTED:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_RAW" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-RAW:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_MU_LAW" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MU-LAW:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_A_LAW" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-A-LAW:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_IMA_ADPCM" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-IMA-ADPCM:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_MPEG" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_GSM" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-GSM:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_IEC958" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-IEC958:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_AC3" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-AC3:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_EAC3" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-EAC3:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_DTS" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-DTS:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_MPEG2_AAC" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG2-AAC:CAPS"/>
+ <keyword type="constant" name="GST_BUFTYPE_MPEG4_AAC" link="gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG4-AAC:CAPS"/>
+ <keyword type="constant" name="GST_CDDA_BASE_SRC_MODE_NORMAL" link="gst-plugins-base-libs-gstcddabasesrc.html#GST-CDDA-BASE-SRC-MODE-NORMAL:CAPS"/>
+ <keyword type="constant" name="GST_CDDA_BASE_SRC_MODE_CONTINUOUS" link="gst-plugins-base-libs-gstcddabasesrc.html#GST-CDDA-BASE-SRC-MODE-CONTINUOUS:CAPS"/>
+ <keyword type="constant" name="GST_FFT_WINDOW_RECTANGULAR" link="gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-RECTANGULAR:CAPS"/>
+ <keyword type="constant" name="GST_FFT_WINDOW_HAMMING" link="gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-HAMMING:CAPS"/>
+ <keyword type="constant" name="GST_FFT_WINDOW_HANN" link="gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-HANN:CAPS"/>
+ <keyword type="constant" name="GST_FFT_WINDOW_BARTLETT" link="gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-BARTLETT:CAPS"/>
+ <keyword type="constant" name="GST_FFT_WINDOW_BLACKMAN" link="gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-BLACKMAN:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_BALANCE_HARDWARE" link="gst-plugins-base-libs-gstcolorbalance.html#GST-COLOR-BALANCE-HARDWARE:CAPS"/>
+ <keyword type="constant" name="GST_COLOR_BALANCE_SOFTWARE" link="gst-plugins-base-libs-gstcolorbalance.html#GST-COLOR-BALANCE-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_HARDWARE" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-HARDWARE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_SOFTWARE" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_FLAG_NONE" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_FLAG_AUTO_NOTIFICATIONS" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-AUTO-NOTIFICATIONS:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_FLAG_HAS_WHITELIST" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-HAS-WHITELIST:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_FLAG_GROUPING" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-GROUPING:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_INVALID" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_MUTE_TOGGLED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-MUTE-TOGGLED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_RECORD_TOGGLED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-RECORD-TOGGLED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_VOLUME_CHANGED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-VOLUME-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_OPTION_CHANGED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-OPTION-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-OPTIONS-LIST-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_MESSAGE_MIXER_CHANGED" link="gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-MIXER-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_INPUT" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-INPUT:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_OUTPUT" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-OUTPUT:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_MUTE" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-MUTE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_RECORD" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-RECORD:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_MASTER" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-MASTER:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_SOFTWARE" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_NO_RECORD" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-NO-RECORD:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_NO_MUTE" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-NO-MUTE:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_WHITELIST" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-WHITELIST:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_READONLY" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-READONLY:CAPS"/>
+ <keyword type="constant" name="GST_MIXER_TRACK_WRITEONLY" link="gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-WRITEONLY:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_INVALID" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU1" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU1:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU2" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU2:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU3" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU3:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU4" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU4:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU5" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU5:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU6" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU6:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_MENU7" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU7:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_LEFT" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_RIGHT" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-RIGHT:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_UP" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-UP:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_DOWN" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DOWN:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_ACTIVATE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-ACTIVATE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_PREV_ANGLE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-PREV-ANGLE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_COMMAND_NEXT_ANGLE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-NEXT-ANGLE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_INVALID" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_KEY_PRESS" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-KEY-PRESS:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_KEY_RELEASE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-KEY-RELEASE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-BUTTON-PRESS:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-BUTTON-RELEASE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_MOUSE_MOVE" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-MOVE:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_EVENT_COMMAND" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-COMMAND:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_MESSAGE_INVALID" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_MESSAGE_MOUSE_OVER" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-COMMANDS-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_MESSAGE_ANGLES_CHANGED" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-ANGLES-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_QUERY_INVALID" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_QUERY_COMMANDS" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-COMMANDS:CAPS"/>
+ <keyword type="constant" name="GST_NAVIGATION_QUERY_ANGLES" link="gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-ANGLES:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_VOLUME_FORMAT_LINEAR" link="gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-LINEAR:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_VOLUME_FORMAT_CUBIC" link="gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-CUBIC:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_VOLUME_FORMAT_DB" link="gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-DB:CAPS"/>
+ <keyword type="constant" name="GST_TUNER_CHANNEL_INPUT" link="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-INPUT:CAPS"/>
+ <keyword type="constant" name="GST_TUNER_CHANNEL_OUTPUT" link="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-OUTPUT:CAPS"/>
+ <keyword type="constant" name="GST_TUNER_CHANNEL_FREQUENCY" link="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-FREQUENCY:CAPS"/>
+ <keyword type="constant" name="GST_TUNER_CHANNEL_AUDIO" link="gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-AUDIO:CAPS"/>
+ <keyword type="constant" name="GST_NET_TYPE_UNKNOWN" link="gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_NET_TYPE_IP4" link="gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-IP4:CAPS"/>
+ <keyword type="constant" name="GST_NET_TYPE_IP6" link="gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-IP6:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_INVALID" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_SR" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-SR:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_RR" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-RR:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_SDES" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-SDES:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_BYE" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-BYE:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_APP" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-APP:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_RTPFB" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-RTPFB:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_TYPE_PSFB" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-PSFB:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_INVALID" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_END" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-END:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_CNAME" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-CNAME:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_NAME" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-NAME:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_EMAIL" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-EMAIL:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_PHONE" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-PHONE:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_LOC" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-LOC:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_TOOL" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-TOOL:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_NOTE" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-NOTE:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_SDES_PRIV" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-PRIV:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_FB_TYPE_INVALID" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-FB-TYPE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_RTPFB_TYPE_NACK" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-RTPFB-TYPE-NACK:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_PSFB_TYPE_PLI" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-PLI:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_PSFB_TYPE_SLI" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-SLI:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_PSFB_TYPE_RPSI" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-RPSI:CAPS"/>
+ <keyword type="constant" name="GST_RTCP_PSFB_TYPE_AFB" link="gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-AFB:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_PCMU" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-PCMU:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_1016" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-1016:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_G721" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G721:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_GSM" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-GSM:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_G723" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G723:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_DVI4_8000" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-8000:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_DVI4_16000" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-16000:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_LPC" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-LPC:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_PCMA" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-PCMA:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_G722" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G722:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_L16_STEREO" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-L16-STEREO:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_L16_MONO" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-L16-MONO:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_QCELP" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-QCELP:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_CN" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-CN:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_MPA" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MPA:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_G728" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G728:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_DVI4_11025" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-11025:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_DVI4_22050" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-22050:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_G729" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G729:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_CELLB" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-CELLB:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_JPEG" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-JPEG:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_NV" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-NV:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_H261" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-H261:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_MPV" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MPV:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_MP2T" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MP2T:CAPS"/>
+ <keyword type="constant" name="GST_RTP_PAYLOAD_H263" link="gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-H263:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EV_READ" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EV-READ:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EV_WRITE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EV-WRITE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_OK" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ERROR" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EINVAL" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EINVAL:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EINTR" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EINTR:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ENOMEM" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOMEM:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ERESOLV" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ERESOLV:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ENOTIMPL" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOTIMPL:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ESYS" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ESYS:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EPARSE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EPARSE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EWSASTART" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EWSASTART:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EWSAVERSION" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EWSAVERSION:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_EEOF" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EEOF:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ENET" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENET:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ENOTIP" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOTIP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ETIMEOUT" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETIMEOUT:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ETGET" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETGET:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ETPOST" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETPOST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ELAST" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ELAST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_FAM_NONE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-NONE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_FAM_INET" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-INET:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_FAM_INET6" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-INET6:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_INVALID" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_INIT" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-INIT:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_READY" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-READY:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_SEEKING" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-SEEKING:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_PLAYING" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-PLAYING:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_STATE_RECORDING" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-RECORDING:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_VERSION_INVALID" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_VERSION_1_0" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-1-0:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_VERSION_1_1" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-1-1:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_INVALID" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_DESCRIBE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-DESCRIBE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_ANNOUNCE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ANNOUNCE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_GET_PARAMETER" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-GET-PARAMETER:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_OPTIONS" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OPTIONS:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_PAUSE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-PAUSE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_PLAY" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-PLAY:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RECORD" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-RECORD:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_REDIRECT" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-REDIRECT:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_SETUP" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-SETUP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_SET_PARAMETER" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-SET-PARAMETER:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TEARDOWN" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-TEARDOWN:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_GET" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-GET:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_POST" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-POST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_AUTH_NONE" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-NONE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_AUTH_BASIC" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-BASIC:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_AUTH_DIGEST" link="gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-DIGEST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_INVALID" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_REQUEST" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-REQUEST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_RESPONSE" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-RESPONSE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_HTTP_REQUEST" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-HTTP-REQUEST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_HTTP_RESPONSE" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-HTTP-RESPONSE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_MESSAGE_DATA" link="gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-DATA:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RANGE_SMPTE" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RANGE_SMPTE_30_DROP" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE-30-DROP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RANGE_SMPTE_25" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE-25:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RANGE_NPT" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-NPT:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_RANGE_CLOCK" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-CLOCK:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TIME_SECONDS" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-SECONDS:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TIME_NOW" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-NOW:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TIME_END" link="gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-END:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TRANS_UNKNOWN" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TRANS_RTP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-RTP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_TRANS_RDT" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-RDT:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_PROFILE_UNKNOWN" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_PROFILE_AVP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-AVP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_PROFILE_SAVP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-SAVP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_LOWER_TRANS_UNKNOWN" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_LOWER_TRANS_UDP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UDP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_LOWER_TRANS_UDP_MCAST" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UDP-MCAST:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_LOWER_TRANS_TCP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-TCP:CAPS"/>
+ <keyword type="constant" name="GST_RTSP_LOWER_TRANS_HTTP" link="gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-HTTP:CAPS"/>
+ <keyword type="constant" name="GST_SDP_OK" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS"/>
+ <keyword type="constant" name="GST_SDP_EINVAL" link="gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-EINVAL:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_NONE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_UNDEFINED" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-UNDEFINED:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_FRONT_COVER" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-FRONT-COVER:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_BACK_COVER" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BACK-COVER:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_LEAFLET_PAGE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LEAFLET-PAGE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_MEDIUM" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-MEDIUM:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_LEAD_ARTIST" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LEAD-ARTIST:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_ARTIST" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-ARTIST:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_CONDUCTOR" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-CONDUCTOR:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BAND-ORCHESTRA:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_COMPOSER" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-COMPOSER:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_LYRICIST" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LYRICIST:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_RECORDING_LOCATION" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-RECORDING-LOCATION:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_DURING_RECORDING" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-DURING-RECORDING:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-DURING-PERFORMANCE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-VIDEO-CAPTURE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_FISH" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-FISH:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_ILLUSTRATION" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-ILLUSTRATION:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BAND-ARTIST-LOGO:CAPS"/>
+ <keyword type="constant" name="GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO" link="gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-PUBLISHER-STUDIO-LOGO:CAPS"/>
+ <keyword type="constant" name="GST_TAG_DEMUX_RESULT_BROKEN_TAG" link="gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-BROKEN-TAG:CAPS"/>
+ <keyword type="constant" name="GST_TAG_DEMUX_RESULT_AGAIN" link="gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-AGAIN:CAPS"/>
+ <keyword type="constant" name="GST_TAG_DEMUX_RESULT_OK" link="gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-OK:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PERMITS_REPRODUCTION" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-REPRODUCTION:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PERMITS_DISTRIBUTION" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-DISTRIBUTION:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-DERIVATIVE-WORKS:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PERMITS_SHARING" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-SHARING:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_NOTICE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-NOTICE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_ATTRIBUTION" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-ATTRIBUTION:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-SHARE-ALIKE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_SOURCE_CODE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-SOURCE-CODE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_COPYLEFT" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-COPYLEFT:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-LESSER-COPYLEFT:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PROHIBITS-COMMERCIAL-USE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PROHIBITS-HIGH-INCOME-NATION-USE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-CREATIVE-COMMONS-LICENSE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE" link="gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-FREE-SOFTWARE-FOUNDATION-LICENSE:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_SUCCESS" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-SUCCESS:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_NOT_FOUND" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_ERROR" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_PARTIAL_SUCCESS" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_USER_ABORT" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-USER-ABORT:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_CRASHED" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-CRASHED:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_INVALID" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_STARTED_OK" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-STARTED-OK:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_INTERNAL_FAILURE" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INTERNAL-FAILURE:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_HELPER_MISSING" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-HELPER-MISSING:CAPS"/>
+ <keyword type="constant" name="GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS" link="gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INSTALL-IN-PROGRESS:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_OK" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-OK:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_URI_INVALID" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-URI-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_ERROR" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_TIMEOUT" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_BUSY" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-BUSY:CAPS"/>
+ <keyword type="constant" name="GST_DISCOVERER_MISSING_PLUGINS" link="gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-MISSING-PLUGINS:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_UNKNOWN" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_I420" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-I420:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_YV12" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YV12:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_YUY2" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YUY2:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_UYVY" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UYVY:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_AYUV" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-AYUV:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGBx" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGBx"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_BGRx" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGRx"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_xRGB" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-xRGB"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_xBGR" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-xBGR"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGBA" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGBA:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_BGRA" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGRA:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_ARGB" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ARGB:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_ABGR" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ABGR:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGB" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_BGR" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_Y41B" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y41B:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_Y42B" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y42B:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_YVYU" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YVYU:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_Y444" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y444:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_v210" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v210"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_v216" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v216"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_NV12" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-NV12:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_NV21" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-NV21:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_GRAY8" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY8:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_GRAY16_BE" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY16-BE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_GRAY16_LE" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY16-LE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_v308" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v308"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_Y800" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y800:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_Y16" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y16:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGB16" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB16:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_BGR16" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR16:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGB15" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB15:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_BGR15" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR15:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_UYVP" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UYVP:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_A420" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-A420:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_RGB8_PALETTED" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB8-PALETTED:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_YUV9" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YUV9:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_YVU9" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YVU9:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_IYU1" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-IYU1:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_ARGB64" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ARGB64:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_AYUV64" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-AYUV64:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_FORMAT_r210" link="gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-r210"/>
+ </functions>
+</book>
diff --git a/docs/libs/html/gstreamer-app.html b/docs/libs/html/gstreamer-app.html
new file mode 100644
index 0000000..4c2b7df
--- /dev/null
+++ b/docs/libs/html/gstreamer-app.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>App Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="compiling.html" title="Compiling">
+<link rel="next" href="gst-plugins-base-libs-appsrc.html" title="appsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="compiling.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-appsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-app"></a>App Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsrc.html">appsrc</a></span><span class="refpurpose"> — Easy way for applications to inject buffers into a
+ pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsink.html">appsink</a></span><span class="refpurpose"> — Easy way for applications to extract buffers from a
+ pipeline</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstapp-0.11</code> to the library flags.
+ </p>
+<p>
+ To use it the functionality, insert an appsrc or appsink element into a pipeline and call the appropriate functions on the element.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-audio.html b/docs/libs/html/gstreamer-audio.html
new file mode 100644
index 0000000..045707a
--- /dev/null
+++ b/docs/libs/html/gstreamer-audio.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Audio Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-appsink.html" title="appsink">
+<link rel="next" href="gst-plugins-base-libs-gstaudio.html" title="gstaudio">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-appsink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstaudio.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-audio"></a>Audio Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudio.html">gstaudio</a></span><span class="refpurpose"> — Support library for audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioclock.html">gstaudioclock</a></span><span class="refpurpose"> — Helper object for implementing audio clocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiodecoder.html">gstaudiodecoder</a></span><span class="refpurpose"> — Base class for audio decoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioencoder.html">gstaudioencoder</a></span><span class="refpurpose"> — Base class for audio encoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiofilter.html">gstaudiofilter</a></span><span class="refpurpose"> — Base class for simple audio filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiomixerutils.html">gstaudiomixerutils</a></span><span class="refpurpose"> — utility functions to find available audio mixers
+ from the plugin registry</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosink.html">gstaudiosink</a></span><span class="refpurpose"> — Simple base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosrc.html">gstaudiosrc</a></span><span class="refpurpose"> — Simple base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosink.html">gstbaseaudiosink</a></span><span class="refpurpose"> — Base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosrc.html">gstbaseaudiosrc</a></span><span class="refpurpose"> — Base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmultichannel.html">gstmultichannel</a></span><span class="refpurpose"> — Support for multichannel audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstringbuffer.html">gstringbuffer</a></span><span class="refpurpose"> — Base class for audio ringbuffer implementations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioiec61937.html">gstaudioiec61937</a></span><span class="refpurpose"> — Utility functions for IEC 61937 payloading</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstaudio-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-base-utils.html b/docs/libs/html/gstreamer-base-utils.html
new file mode 100644
index 0000000..4a56e71
--- /dev/null
+++ b/docs/libs/html/gstreamer-base-utils.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Base Utils Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gsttaglicenses.html" title="gsttaglicenses">
+<link rel="next" href="gst-plugins-base-libs-gstpbutils.html" title="gstpbutils">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gsttaglicenses.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstpbutils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-base-utils"></a>Base Utils Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutils.html">gstpbutils</a></span><span class="refpurpose"> — General Application and Plugin Utility Library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpluginsbaseversion.html">gstpluginsbaseversion</a></span><span class="refpurpose"> — GStreamer gst-plugins-base libraries version macros.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilscodecutils.html">gstpbutilscodecutils</a></span><span class="refpurpose"> — Miscellaneous codec-specific utility functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsdescriptions.html">gstpbutilsdescriptions</a></span><span class="refpurpose"> — Provides human-readable descriptions for caps/codecs
+and encoder, decoder, URI source and URI sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsmissingplugins.html">gstpbutilsmissingplugins</a></span><span class="refpurpose"> — Create, recognise and parse missing-plugins messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsinstallplugins.html">gstpbutilsinstallplugins</a></span><span class="refpurpose"> — Missing plugin installation support for applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstdiscoverer.html">gstdiscoverer</a></span><span class="refpurpose"> — Utility for discovering information on URIs.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-encoding-profile.html">encoding-profile</a></span><span class="refpurpose"> — Encoding profile library</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstpbutils-0.11</code> to the library
+ flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-cdda.html b/docs/libs/html/gstreamer-cdda.html
new file mode 100644
index 0000000..523ef20
--- /dev/null
+++ b/docs/libs/html/gstreamer-cdda.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>CDDA Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstaudioiec61937.html" title="gstaudioiec61937">
+<link rel="next" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstaudioiec61937.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstcddabasesrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-cdda"></a>CDDA Library</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcddabasesrc.html">gstcddabasesrc</a></span><span class="refpurpose"> — Base class for CD digital audio (CDDA) sources</span>
+</dt></dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstcdda-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-ffft.html b/docs/libs/html/gstreamer-ffft.html
new file mode 100644
index 0000000..19ed4b3
--- /dev/null
+++ b/docs/libs/html/gstreamer-ffft.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>FFT Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstcddabasesrc.html" title="gstcddabasesrc">
+<link rel="next" href="gst-plugins-base-libs-gstfft.html" title="gstfft">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstcddabasesrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstfft.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-ffft"></a>FFT Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfft.html">gstfft</a></span><span class="refpurpose"> — General FFT functions and declarations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts16.html">gstffts16</a></span><span class="refpurpose"> — FFT functions for signed 16 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts32.html">gstffts32</a></span><span class="refpurpose"> — FFT functions for signed 32 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf32.html">gstfftf32</a></span><span class="refpurpose"> — FFT functions for 32 bit float samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf64.html">gstfftf64</a></span><span class="refpurpose"> — FFT functions for 64 bit float samples</span>
+</dt>
+</dl></div>
+<p>
+ The gstfft library is based on
+ <a class="ulink" href="http://sourceforge.net/projects/kissfft" target="_top">kissfft</a>
+ by Mark Borgerding.
+ </p>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstfft-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-interfaces.html b/docs/libs/html/gstreamer-interfaces.html
new file mode 100644
index 0000000..bd0c40c
--- /dev/null
+++ b/docs/libs/html/gstreamer-interfaces.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Interfaces Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstfftf64.html" title="gstfftf64">
+<link rel="next" href="gst-plugins-base-libs-gstcolorbalance.html" title="gstcolorbalance">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstfftf64.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstcolorbalance.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-interfaces"></a>Interfaces Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalance.html">gstcolorbalance</a></span><span class="refpurpose"> — Interface for adjusting color balance settings</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalancechannel.html">gstcolorbalancechannel</a></span><span class="refpurpose"> — Object representing a channel from the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a>
+ interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixer.html">gstmixer</a></span><span class="refpurpose"> — Interface for elements that provide mixer operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixeroptions.html">gstmixeroptions</a></span><span class="refpurpose"> — Multi-option mixer control</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixertrack.html">gstmixertrack</a></span><span class="refpurpose"> — Basic mixer control object (volume slider, switch)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnavigation.html">gstnavigation</a></span><span class="refpurpose"> — Interface for creating, sending and parsing navigation
+events.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpropertyprobe.html">gstpropertyprobe</a></span><span class="refpurpose"> — Interface for probing possible property values</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gststreamvolume.html">gststreamvolume</a></span><span class="refpurpose"> — Interface for elements that provide a stream volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttuner.html">gsttuner</a></span><span class="refpurpose"> — Interface for elements providing tuner operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunerchannel.html">gsttunerchannel</a></span><span class="refpurpose"> — A channel from an element implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a>
+interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunernorm.html">gsttunernorm</a></span><span class="refpurpose"> — Encapsulates information about the data format(s)
+for a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideoorientation.html">gstvideoorientation</a></span><span class="refpurpose"> — Interface for elements providing video orientation
+controls</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideooverlay.html">gstvideooverlay</a></span><span class="refpurpose"> — Interface for setting/getting a window system resource
+ on elements supporting it to configure a window into which to render a
+ video.</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstinterfaces-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-libs-hierarchy.html b/docs/libs/html/gstreamer-libs-hierarchy.html
new file mode 100644
index 0000000..0a8d01e
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-hierarchy.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part II. Object Hierarchy</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="prev" href="gst-plugins-base-libs-gstvideosink.html" title="gstvideosink">
+<link rel="next" href="api-index-full.html" title="Index">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstvideosink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="api-index-full.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="gstreamer-libs-hierarchy"></a>Part II. Object Hierarchy</h1></div></div></div>
+<pre class="screen">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder">GstAudioDecoder</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder">GstAudioEncoder</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter">GstAudioFilter</a>
+ <a class="link" href="gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter">GstVideoFilter</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ <a class="link" href="gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink">GstBaseAudioSink</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudiosink.html#GstAudioSink">GstAudioSink</a>
+ <a class="link" href="gst-plugins-base-libs-gstvideosink.html#GstVideoSink">GstVideoSink</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ <a class="link" href="gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc">GstBaseAudioSrc</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc">GstAudioSrc</a>
+ <a class="link" href="gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc">GstCddaBaseSrc</a>
+ <a class="link" href="gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload">GstBaseRTPDepayload</a>
+ <a class="link" href="gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload">GstBaseRTPPayload</a>
+ <a class="link" href="gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload">GstBaseRTPAudioPayload</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html">GstClock</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSystemClock.html">GstSystemClock</a>
+ <a class="link" href="gst-plugins-base-libs-gstaudioclock.html#GstAudioClock">GstAudioClock</a>
+ <a class="link" href="gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer">GstRingBuffer</a>
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel">GstColorBalanceChannel</a>
+ <a class="link" href="gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack">GstMixerTrack</a>
+ <a class="link" href="gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions">GstMixerOptions</a>
+ <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel">GstTunerChannel</a>
+ <a class="link" href="gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm">GstTunerNorm</a>
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer">GstDiscoverer</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile">GstEncodingProfile</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile">GstEncodingVideoProfile</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile">GstEncodingAudioProfile</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile">GstEncodingContainerProfile</a>
+ <a class="link" href="gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget">GstEncodingTarget</a>
+ <a class="link" href="gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo">GstDiscovererInfo</a>
+ GInterface
+ <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance">GstColorBalance</a>
+ <a class="link" href="gst-plugins-base-libs-gstmixer.html#GstMixer">GstMixer</a>
+ <a class="link" href="gst-plugins-base-libs-gstnavigation.html#GstNavigation">GstNavigation</a>
+ <a class="link" href="gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">GstPropertyProbe</a>
+ <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner">GstTuner</a>
+ <a class="link" href="gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume">GstStreamVolume</a>
+ <a class="link" href="gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation">GstVideoOrientation</a>
+</pre>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-netbuffer.html b/docs/libs/html/gstreamer-netbuffer.html
new file mode 100644
index 0000000..231967b
--- /dev/null
+++ b/docs/libs/html/gstreamer-netbuffer.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Network Buffer Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstvideooverlay.html" title="gstvideooverlay">
+<link rel="next" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstvideooverlay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstnetbuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-netbuffer"></a>Network Buffer Library</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnetbuffer.html">gstnetbuffer</a></span><span class="refpurpose"> — Buffer for use in network sources and sinks</span>
+</dt></dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstnetbuffer-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-plugins-base.html b/docs/libs/html/gstreamer-plugins-base.html
new file mode 100644
index 0000000..c31ea29
--- /dev/null
+++ b/docs/libs/html/gstreamer-plugins-base.html
@@ -0,0 +1,308 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part I. GStreamer Base Plugins Libraries</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="prev" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="next" href="compiling.html" title="Compiling">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="compiling.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="gstreamer-plugins-base"></a>Part I. GStreamer Base Plugins Libraries</h1></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt>
+<span class="refentrytitle"><a href="compiling.html">Compiling</a></span><span class="refpurpose"> —
+How to compile against the base plugins libraries
+</span>
+</dt>
+<dt><span class="chapter"><a href="gstreamer-app.html">App Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsrc.html">appsrc</a></span><span class="refpurpose"> — Easy way for applications to inject buffers into a
+ pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsink.html">appsink</a></span><span class="refpurpose"> — Easy way for applications to extract buffers from a
+ pipeline</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-audio.html">Audio Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudio.html">gstaudio</a></span><span class="refpurpose"> — Support library for audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioclock.html">gstaudioclock</a></span><span class="refpurpose"> — Helper object for implementing audio clocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiodecoder.html">gstaudiodecoder</a></span><span class="refpurpose"> — Base class for audio decoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioencoder.html">gstaudioencoder</a></span><span class="refpurpose"> — Base class for audio encoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiofilter.html">gstaudiofilter</a></span><span class="refpurpose"> — Base class for simple audio filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiomixerutils.html">gstaudiomixerutils</a></span><span class="refpurpose"> — utility functions to find available audio mixers
+ from the plugin registry</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosink.html">gstaudiosink</a></span><span class="refpurpose"> — Simple base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosrc.html">gstaudiosrc</a></span><span class="refpurpose"> — Simple base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosink.html">gstbaseaudiosink</a></span><span class="refpurpose"> — Base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosrc.html">gstbaseaudiosrc</a></span><span class="refpurpose"> — Base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmultichannel.html">gstmultichannel</a></span><span class="refpurpose"> — Support for multichannel audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstringbuffer.html">gstringbuffer</a></span><span class="refpurpose"> — Base class for audio ringbuffer implementations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioiec61937.html">gstaudioiec61937</a></span><span class="refpurpose"> — Utility functions for IEC 61937 payloading</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-cdda.html">CDDA Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcddabasesrc.html">gstcddabasesrc</a></span><span class="refpurpose"> — Base class for CD digital audio (CDDA) sources</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-ffft.html">FFT Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfft.html">gstfft</a></span><span class="refpurpose"> — General FFT functions and declarations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts16.html">gstffts16</a></span><span class="refpurpose"> — FFT functions for signed 16 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts32.html">gstffts32</a></span><span class="refpurpose"> — FFT functions for signed 32 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf32.html">gstfftf32</a></span><span class="refpurpose"> — FFT functions for 32 bit float samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf64.html">gstfftf64</a></span><span class="refpurpose"> — FFT functions for 64 bit float samples</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-interfaces.html">Interfaces Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalance.html">gstcolorbalance</a></span><span class="refpurpose"> — Interface for adjusting color balance settings</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalancechannel.html">gstcolorbalancechannel</a></span><span class="refpurpose"> — Object representing a channel from the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a>
+ interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixer.html">gstmixer</a></span><span class="refpurpose"> — Interface for elements that provide mixer operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixeroptions.html">gstmixeroptions</a></span><span class="refpurpose"> — Multi-option mixer control</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixertrack.html">gstmixertrack</a></span><span class="refpurpose"> — Basic mixer control object (volume slider, switch)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnavigation.html">gstnavigation</a></span><span class="refpurpose"> — Interface for creating, sending and parsing navigation
+events.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpropertyprobe.html">gstpropertyprobe</a></span><span class="refpurpose"> — Interface for probing possible property values</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gststreamvolume.html">gststreamvolume</a></span><span class="refpurpose"> — Interface for elements that provide a stream volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttuner.html">gsttuner</a></span><span class="refpurpose"> — Interface for elements providing tuner operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunerchannel.html">gsttunerchannel</a></span><span class="refpurpose"> — A channel from an element implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a>
+interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunernorm.html">gsttunernorm</a></span><span class="refpurpose"> — Encapsulates information about the data format(s)
+for a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideoorientation.html">gstvideoorientation</a></span><span class="refpurpose"> — Interface for elements providing video orientation
+controls</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideooverlay.html">gstvideooverlay</a></span><span class="refpurpose"> — Interface for setting/getting a window system resource
+ on elements supporting it to configure a window into which to render a
+ video.</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-netbuffer.html">Network Buffer Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnetbuffer.html">gstnetbuffer</a></span><span class="refpurpose"> — Buffer for use in network sources and sinks</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-riff.html">Riff Media Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstriff.html">gstriff</a></span><span class="refpurpose"> — Riff fileformat utillity functions.</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-rtp.html">RTP Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpaudiopayload.html">gstbasertpaudiopayload</a></span><span class="refpurpose"> — Base class for audio RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpdepayload.html">gstbasertpdepayload</a></span><span class="refpurpose"> — Base class for RTP depayloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertppayload.html">gstbasertppayload</a></span><span class="refpurpose"> — Base class for RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtpbuffer.html">gstrtpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtcpbuffer.html">gstrtcpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTCP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtppayloads.html">gstrtppayloads</a></span><span class="refpurpose"> — Helper methods for dealing with RTP payloads</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-rtsp.html">RTSP Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspbase64.html">gstrtspbase64</a></span><span class="refpurpose"> — Helper functions to handle Base64</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspconnection.html">gstrtspconnection</a></span><span class="refpurpose"> — manage RTSP connections</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspdefs.html">gstrtspdefs</a></span><span class="refpurpose"> — common RTSP defines</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspextension.html">gstrtspextension</a></span><span class="refpurpose"> — Interface for extending RTSP protocols</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspmessage.html">gstrtspmessage</a></span><span class="refpurpose"> — RTSP messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsprange.html">gstrtsprange</a></span><span class="refpurpose"> — dealing with time ranges</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsptransport.html">gstrtsptransport</a></span><span class="refpurpose"> — dealing with RTSP transports</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspurl.html">gstrtspurl</a></span><span class="refpurpose"> — handling RTSP urls</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-sdp.html">SDP Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstsdpmessage.html">gstsdpmessage</a></span><span class="refpurpose"> — Helper methods for dealing with SDP messages</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-tag.html">Tag Support Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttag.html">gsttag</a></span><span class="refpurpose"> — additional tag definitions for plugins and applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagvorbis.html">gsttagvorbis</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with vorbiscomments</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagid3.html">gsttagid3</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with ID3v1 and ID3v2 tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagexif.html">gsttagexif</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with exif tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmp.html">gsttagxmp</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with xmp packets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmpwriter.html">gsttagxmpwriter</a></span><span class="refpurpose"> — Interface for elements that provide XMP serialization</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagdemux.html">gsttagdemux</a></span><span class="refpurpose"> — Base class for demuxing tags that are in chunks
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagmux.html">gsttagmux</a></span><span class="refpurpose"> — Base class for adding tags that are in one single chunk
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglanguagecodes.html">gsttaglanguagecodes</a></span><span class="refpurpose"> — mappings for ISO-639 language codes and names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglicenses.html">gsttaglicenses</a></span><span class="refpurpose"> — utility functions for Creative Commons licenses</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-base-utils.html">Base Utils Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutils.html">gstpbutils</a></span><span class="refpurpose"> — General Application and Plugin Utility Library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpluginsbaseversion.html">gstpluginsbaseversion</a></span><span class="refpurpose"> — GStreamer gst-plugins-base libraries version macros.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilscodecutils.html">gstpbutilscodecutils</a></span><span class="refpurpose"> — Miscellaneous codec-specific utility functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsdescriptions.html">gstpbutilsdescriptions</a></span><span class="refpurpose"> — Provides human-readable descriptions for caps/codecs
+and encoder, decoder, URI source and URI sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsmissingplugins.html">gstpbutilsmissingplugins</a></span><span class="refpurpose"> — Create, recognise and parse missing-plugins messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsinstallplugins.html">gstpbutilsinstallplugins</a></span><span class="refpurpose"> — Missing plugin installation support for applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstdiscoverer.html">gstdiscoverer</a></span><span class="refpurpose"> — Utility for discovering information on URIs.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-encoding-profile.html">encoding-profile</a></span><span class="refpurpose"> — Encoding profile library</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-video.html">Video Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideo.html">gstvideo</a></span><span class="refpurpose"> — Support library for video operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideofilter.html">gstvideofilter</a></span><span class="refpurpose"> — Base class for video filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideosink.html">gstvideosink</a></span><span class="refpurpose"> — Base class for video sinks</span>
+</dt>
+</dl></dd>
+</dl>
+</div>
+<p>
+ This manual describes the libraries provided by the GStreamer Base Plugins
+ package.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-riff.html b/docs/libs/html/gstreamer-riff.html
new file mode 100644
index 0000000..81ea693
--- /dev/null
+++ b/docs/libs/html/gstreamer-riff.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Riff Media Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstnetbuffer.html" title="gstnetbuffer">
+<link rel="next" href="gst-plugins-base-libs-gstriff.html" title="gstriff">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstnetbuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstriff.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-riff"></a>Riff Media Library</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstriff.html">gstriff</a></span><span class="refpurpose"> — Riff fileformat utillity functions.</span>
+</dt></dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstriff-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-rtp.html b/docs/libs/html/gstreamer-rtp.html
new file mode 100644
index 0000000..d2d507d
--- /dev/null
+++ b/docs/libs/html/gstreamer-rtp.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>RTP Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstriff.html" title="gstriff">
+<link rel="next" href="gst-plugins-base-libs-gstbasertpaudiopayload.html" title="gstbasertpaudiopayload">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstriff.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstbasertpaudiopayload.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-rtp"></a>RTP Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpaudiopayload.html">gstbasertpaudiopayload</a></span><span class="refpurpose"> — Base class for audio RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpdepayload.html">gstbasertpdepayload</a></span><span class="refpurpose"> — Base class for RTP depayloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertppayload.html">gstbasertppayload</a></span><span class="refpurpose"> — Base class for RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtpbuffer.html">gstrtpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtcpbuffer.html">gstrtcpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTCP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtppayloads.html">gstrtppayloads</a></span><span class="refpurpose"> — Helper methods for dealing with RTP payloads</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstrtp-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-rtsp.html b/docs/libs/html/gstreamer-rtsp.html
new file mode 100644
index 0000000..6e6651d
--- /dev/null
+++ b/docs/libs/html/gstreamer-rtsp.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>RTSP Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstrtppayloads.html" title="gstrtppayloads">
+<link rel="next" href="gst-plugins-base-libs-gstrtspbase64.html" title="gstrtspbase64">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtppayloads.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstrtspbase64.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-rtsp"></a>RTSP Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspbase64.html">gstrtspbase64</a></span><span class="refpurpose"> — Helper functions to handle Base64</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspconnection.html">gstrtspconnection</a></span><span class="refpurpose"> — manage RTSP connections</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspdefs.html">gstrtspdefs</a></span><span class="refpurpose"> — common RTSP defines</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspextension.html">gstrtspextension</a></span><span class="refpurpose"> — Interface for extending RTSP protocols</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspmessage.html">gstrtspmessage</a></span><span class="refpurpose"> — RTSP messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsprange.html">gstrtsprange</a></span><span class="refpurpose"> — dealing with time ranges</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsptransport.html">gstrtsptransport</a></span><span class="refpurpose"> — dealing with RTSP transports</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspurl.html">gstrtspurl</a></span><span class="refpurpose"> — handling RTSP urls</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstrtsp-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-sdp.html b/docs/libs/html/gstreamer-sdp.html
new file mode 100644
index 0000000..f997111
--- /dev/null
+++ b/docs/libs/html/gstreamer-sdp.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>SDP Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstrtspurl.html" title="gstrtspurl">
+<link rel="next" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstrtspurl.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstsdpmessage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-sdp"></a>SDP Library</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstsdpmessage.html">gstsdpmessage</a></span><span class="refpurpose"> — Helper methods for dealing with SDP messages</span>
+</dt></dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstsdp-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-tag.html b/docs/libs/html/gstreamer-tag.html
new file mode 100644
index 0000000..3337b30
--- /dev/null
+++ b/docs/libs/html/gstreamer-tag.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Tag Support Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-gstsdpmessage.html" title="gstsdpmessage">
+<link rel="next" href="gst-plugins-base-libs-gsttag.html" title="gsttag">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-gstsdpmessage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gsttag.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-tag"></a>Tag Support Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttag.html">gsttag</a></span><span class="refpurpose"> — additional tag definitions for plugins and applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagvorbis.html">gsttagvorbis</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with vorbiscomments</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagid3.html">gsttagid3</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with ID3v1 and ID3v2 tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagexif.html">gsttagexif</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with exif tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmp.html">gsttagxmp</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with xmp packets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmpwriter.html">gsttagxmpwriter</a></span><span class="refpurpose"> — Interface for elements that provide XMP serialization</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagdemux.html">gsttagdemux</a></span><span class="refpurpose"> — Base class for demuxing tags that are in chunks
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagmux.html">gsttagmux</a></span><span class="refpurpose"> — Base class for adding tags that are in one single chunk
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglanguagecodes.html">gsttaglanguagecodes</a></span><span class="refpurpose"> — mappings for ISO-639 language codes and names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglicenses.html">gsttaglicenses</a></span><span class="refpurpose"> — utility functions for Creative Commons licenses</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgsttag-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/gstreamer-video.html b/docs/libs/html/gstreamer-video.html
new file mode 100644
index 0000000..069a917
--- /dev/null
+++ b/docs/libs/html/gstreamer-video.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Video Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<link rel="prev" href="gst-plugins-base-libs-encoding-profile.html" title="encoding-profile">
+<link rel="next" href="gst-plugins-base-libs-gstvideo.html" title="gstvideo">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-libs-encoding-profile.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-base.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-libs-gstvideo.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-video"></a>Video Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideo.html">gstvideo</a></span><span class="refpurpose"> — Support library for video operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideofilter.html">gstvideofilter</a></span><span class="refpurpose"> — Base class for video filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideosink.html">gstvideosink</a></span><span class="refpurpose"> — Base class for video sinks</span>
+</dt>
+</dl></div>
+<p>
+ This library should be linked to by getting cflags and libs from
+ <code class="filename">gstreamer-plugins-base-0.11.pc</code> and adding
+ <code class="filename">-lgstvideo-0.11</code> to the library flags.
+ </p>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/home.png b/docs/libs/html/home.png
new file mode 100644
index 0000000..1700361
--- /dev/null
+++ b/docs/libs/html/home.png
Binary files differ
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
new file mode 100644
index 0000000..87dafdb
--- /dev/null
+++ b/docs/libs/html/index.html
@@ -0,0 +1,307 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GStreamer Base Plugins 0.11 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Library Reference Manual">
+<link rel="next" href="gstreamer-plugins-base.html" title="Part I. GStreamer Base Plugins Libraries">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Base Plugins 0.11 Library Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+ for GStreamer Base Library 0.11 (0.11.1)
+ <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/</a>.
+ </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="part"><a href="gstreamer-plugins-base.html">I. GStreamer Base Plugins Libraries</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="compiling.html">Compiling</a></span><span class="refpurpose"> —
+How to compile against the base plugins libraries
+</span>
+</dt>
+<dt><span class="chapter"><a href="gstreamer-app.html">App Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsrc.html">appsrc</a></span><span class="refpurpose"> — Easy way for applications to inject buffers into a
+ pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-appsink.html">appsink</a></span><span class="refpurpose"> — Easy way for applications to extract buffers from a
+ pipeline</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-audio.html">Audio Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudio.html">gstaudio</a></span><span class="refpurpose"> — Support library for audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioclock.html">gstaudioclock</a></span><span class="refpurpose"> — Helper object for implementing audio clocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiodecoder.html">gstaudiodecoder</a></span><span class="refpurpose"> — Base class for audio decoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioencoder.html">gstaudioencoder</a></span><span class="refpurpose"> — Base class for audio encoders</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiofilter.html">gstaudiofilter</a></span><span class="refpurpose"> — Base class for simple audio filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiomixerutils.html">gstaudiomixerutils</a></span><span class="refpurpose"> — utility functions to find available audio mixers
+ from the plugin registry</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosink.html">gstaudiosink</a></span><span class="refpurpose"> — Simple base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudiosrc.html">gstaudiosrc</a></span><span class="refpurpose"> — Simple base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosink.html">gstbaseaudiosink</a></span><span class="refpurpose"> — Base class for audio sinks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbaseaudiosrc.html">gstbaseaudiosrc</a></span><span class="refpurpose"> — Base class for audio sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmultichannel.html">gstmultichannel</a></span><span class="refpurpose"> — Support for multichannel audio elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstringbuffer.html">gstringbuffer</a></span><span class="refpurpose"> — Base class for audio ringbuffer implementations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstaudioiec61937.html">gstaudioiec61937</a></span><span class="refpurpose"> — Utility functions for IEC 61937 payloading</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-cdda.html">CDDA Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcddabasesrc.html">gstcddabasesrc</a></span><span class="refpurpose"> — Base class for CD digital audio (CDDA) sources</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-ffft.html">FFT Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfft.html">gstfft</a></span><span class="refpurpose"> — General FFT functions and declarations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts16.html">gstffts16</a></span><span class="refpurpose"> — FFT functions for signed 16 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstffts32.html">gstffts32</a></span><span class="refpurpose"> — FFT functions for signed 32 bit integer samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf32.html">gstfftf32</a></span><span class="refpurpose"> — FFT functions for 32 bit float samples</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstfftf64.html">gstfftf64</a></span><span class="refpurpose"> — FFT functions for 64 bit float samples</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-interfaces.html">Interfaces Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalance.html">gstcolorbalance</a></span><span class="refpurpose"> — Interface for adjusting color balance settings</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstcolorbalancechannel.html">gstcolorbalancechannel</a></span><span class="refpurpose"> — Object representing a channel from the <a class="link" href="gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance"><span class="type">GstColorBalance</span></a>
+ interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixer.html">gstmixer</a></span><span class="refpurpose"> — Interface for elements that provide mixer operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixeroptions.html">gstmixeroptions</a></span><span class="refpurpose"> — Multi-option mixer control</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstmixertrack.html">gstmixertrack</a></span><span class="refpurpose"> — Basic mixer control object (volume slider, switch)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnavigation.html">gstnavigation</a></span><span class="refpurpose"> — Interface for creating, sending and parsing navigation
+events.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpropertyprobe.html">gstpropertyprobe</a></span><span class="refpurpose"> — Interface for probing possible property values</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gststreamvolume.html">gststreamvolume</a></span><span class="refpurpose"> — Interface for elements that provide a stream volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttuner.html">gsttuner</a></span><span class="refpurpose"> — Interface for elements providing tuner operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunerchannel.html">gsttunerchannel</a></span><span class="refpurpose"> — A channel from an element implementing the <a class="link" href="gst-plugins-base-libs-gsttuner.html#GstTuner"><span class="type">GstTuner</span></a>
+interface.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttunernorm.html">gsttunernorm</a></span><span class="refpurpose"> — Encapsulates information about the data format(s)
+for a <a class="link" href="gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel"><span class="type">GstTunerChannel</span></a>.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideoorientation.html">gstvideoorientation</a></span><span class="refpurpose"> — Interface for elements providing video orientation
+controls</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideooverlay.html">gstvideooverlay</a></span><span class="refpurpose"> — Interface for setting/getting a window system resource
+ on elements supporting it to configure a window into which to render a
+ video.</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-netbuffer.html">Network Buffer Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstnetbuffer.html">gstnetbuffer</a></span><span class="refpurpose"> — Buffer for use in network sources and sinks</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-riff.html">Riff Media Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstriff.html">gstriff</a></span><span class="refpurpose"> — Riff fileformat utillity functions.</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-rtp.html">RTP Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpaudiopayload.html">gstbasertpaudiopayload</a></span><span class="refpurpose"> — Base class for audio RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertpdepayload.html">gstbasertpdepayload</a></span><span class="refpurpose"> — Base class for RTP depayloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstbasertppayload.html">gstbasertppayload</a></span><span class="refpurpose"> — Base class for RTP payloader</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtpbuffer.html">gstrtpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtcpbuffer.html">gstrtcpbuffer</a></span><span class="refpurpose"> — Helper methods for dealing with RTCP buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtppayloads.html">gstrtppayloads</a></span><span class="refpurpose"> — Helper methods for dealing with RTP payloads</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-rtsp.html">RTSP Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspbase64.html">gstrtspbase64</a></span><span class="refpurpose"> — Helper functions to handle Base64</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspconnection.html">gstrtspconnection</a></span><span class="refpurpose"> — manage RTSP connections</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspdefs.html">gstrtspdefs</a></span><span class="refpurpose"> — common RTSP defines</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspextension.html">gstrtspextension</a></span><span class="refpurpose"> — Interface for extending RTSP protocols</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspmessage.html">gstrtspmessage</a></span><span class="refpurpose"> — RTSP messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsprange.html">gstrtsprange</a></span><span class="refpurpose"> — dealing with time ranges</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtsptransport.html">gstrtsptransport</a></span><span class="refpurpose"> — dealing with RTSP transports</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstrtspurl.html">gstrtspurl</a></span><span class="refpurpose"> — handling RTSP urls</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-sdp.html">SDP Library</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstsdpmessage.html">gstsdpmessage</a></span><span class="refpurpose"> — Helper methods for dealing with SDP messages</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-tag.html">Tag Support Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttag.html">gsttag</a></span><span class="refpurpose"> — additional tag definitions for plugins and applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagvorbis.html">gsttagvorbis</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with vorbiscomments</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagid3.html">gsttagid3</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with ID3v1 and ID3v2 tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagexif.html">gsttagexif</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with exif tags</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmp.html">gsttagxmp</a></span><span class="refpurpose"> — tag mappings and support functions for plugins
+ dealing with xmp packets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagxmpwriter.html">gsttagxmpwriter</a></span><span class="refpurpose"> — Interface for elements that provide XMP serialization</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagdemux.html">gsttagdemux</a></span><span class="refpurpose"> — Base class for demuxing tags that are in chunks
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttagmux.html">gsttagmux</a></span><span class="refpurpose"> — Base class for adding tags that are in one single chunk
+ directly at the beginning or at the end of a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglanguagecodes.html">gsttaglanguagecodes</a></span><span class="refpurpose"> — mappings for ISO-639 language codes and names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gsttaglicenses.html">gsttaglicenses</a></span><span class="refpurpose"> — utility functions for Creative Commons licenses</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-base-utils.html">Base Utils Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutils.html">gstpbutils</a></span><span class="refpurpose"> — General Application and Plugin Utility Library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpluginsbaseversion.html">gstpluginsbaseversion</a></span><span class="refpurpose"> — GStreamer gst-plugins-base libraries version macros.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilscodecutils.html">gstpbutilscodecutils</a></span><span class="refpurpose"> — Miscellaneous codec-specific utility functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsdescriptions.html">gstpbutilsdescriptions</a></span><span class="refpurpose"> — Provides human-readable descriptions for caps/codecs
+and encoder, decoder, URI source and URI sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsmissingplugins.html">gstpbutilsmissingplugins</a></span><span class="refpurpose"> — Create, recognise and parse missing-plugins messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstpbutilsinstallplugins.html">gstpbutilsinstallplugins</a></span><span class="refpurpose"> — Missing plugin installation support for applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstdiscoverer.html">gstdiscoverer</a></span><span class="refpurpose"> — Utility for discovering information on URIs.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-encoding-profile.html">encoding-profile</a></span><span class="refpurpose"> — Encoding profile library</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-video.html">Video Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideo.html">gstvideo</a></span><span class="refpurpose"> — Support library for video operations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideofilter.html">gstvideofilter</a></span><span class="refpurpose"> — Base class for video filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-libs-gstvideosink.html">gstvideosink</a></span><span class="refpurpose"> — Base class for video sinks</span>
+</dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="part"><a href="gstreamer-libs-hierarchy.html">II. Object Hierarchy</a></span></dt>
+<dt><span class="index"><a href="api-index-full.html">Index</a></span></dt>
+<dt><span class="index"><a href="api-index-deprecated.html">Index of deprecated API</a></span></dt>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml
new file mode 100644
index 0000000..d86f6e3
--- /dev/null
+++ b/docs/libs/html/index.sgml
@@ -0,0 +1,1906 @@
+<ONLINE href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/">
+<ANCHOR id="compiling" href="gst-plugins-base-libs-0.11/compiling.html">
+<ANCHOR id="gst-plugins-base-libs-appsrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html">
+<ANCHOR id="gst-plugins-base-libs-appsrc.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-plugins-base-libs-appsrc.synopsis">
+<ANCHOR id="gst-plugins-base-libs-appsrc.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-plugins-base-libs-appsrc.description">
+<ANCHOR id="gst-plugins-base-libs-appsrc.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-plugins-base-libs-appsrc.details">
+<ANCHOR id="GstAppStreamType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GstAppStreamType">
+<ANCHOR id="GST-APP-STREAM-TYPE-STREAM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-STREAM:CAPS">
+<ANCHOR id="GST-APP-STREAM-TYPE-SEEKABLE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-SEEKABLE:CAPS">
+<ANCHOR id="GST-APP-STREAM-TYPE-RANDOM-ACCESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GST-APP-STREAM-TYPE-RANDOM-ACCESS:CAPS">
+<ANCHOR id="gst-app-src-set-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-caps">
+<ANCHOR id="gst-app-src-get-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-caps">
+<ANCHOR id="gst-app-src-get-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-latency">
+<ANCHOR id="gst-app-src-set-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-latency">
+<ANCHOR id="gst-app-src-set-size" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-size">
+<ANCHOR id="gst-app-src-get-size" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-size">
+<ANCHOR id="gst-app-src-set-stream-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-stream-type">
+<ANCHOR id="gst-app-src-get-stream-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-stream-type">
+<ANCHOR id="gst-app-src-set-max-bytes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-max-bytes">
+<ANCHOR id="gst-app-src-get-max-bytes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-max-bytes">
+<ANCHOR id="gst-app-src-get-emit-signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-get-emit-signals">
+<ANCHOR id="gst-app-src-set-emit-signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-emit-signals">
+<ANCHOR id="GstAppSrcCallbacks" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GstAppSrcCallbacks">
+<ANCHOR id="gst-app-src-set-callbacks" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-set-callbacks">
+<ANCHOR id="gst-app-src-push-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-push-buffer">
+<ANCHOR id="gst-app-src-end-of-stream" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-app-src-end-of-stream">
+<ANCHOR id="gst-plugins-base-libs-appsrc.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#gst-plugins-base-libs-appsrc.see-also">
+<ANCHOR id="gst-plugins-base-libs-appsink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html">
+<ANCHOR id="gst-plugins-base-libs-appsink.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-plugins-base-libs-appsink.synopsis">
+<ANCHOR id="gst-plugins-base-libs-appsink.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-plugins-base-libs-appsink.description">
+<ANCHOR id="gst-plugins-base-libs-appsink.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-plugins-base-libs-appsink.details">
+<ANCHOR id="gst-app-sink-set-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-set-caps">
+<ANCHOR id="gst-app-sink-get-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-get-caps">
+<ANCHOR id="gst-app-sink-is-eos" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-is-eos">
+<ANCHOR id="gst-app-sink-set-emit-signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-set-emit-signals">
+<ANCHOR id="gst-app-sink-get-emit-signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-get-emit-signals">
+<ANCHOR id="gst-app-sink-set-max-buffers" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-set-max-buffers">
+<ANCHOR id="gst-app-sink-get-max-buffers" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-get-max-buffers">
+<ANCHOR id="gst-app-sink-set-drop" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-set-drop">
+<ANCHOR id="gst-app-sink-get-drop" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-get-drop">
+<ANCHOR id="gst-app-sink-pull-preroll" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-pull-preroll">
+<ANCHOR id="gst-app-sink-pull-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer">
+<ANCHOR id="gst-app-sink-pull-buffer-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-pull-buffer-list">
+<ANCHOR id="GstAppSinkCallbacks" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#GstAppSinkCallbacks">
+<ANCHOR id="gst-app-sink-set-callbacks" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-app-sink-set-callbacks">
+<ANCHOR id="gst-plugins-base-libs-appsink.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html#gst-plugins-base-libs-appsink.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudio" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudio.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-plugins-base-libs-gstaudio.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstaudio.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-plugins-base-libs-gstaudio.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudio.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-plugins-base-libs-gstaudio.details">
+<ANCHOR id="GstAudioFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GstAudioFlags">
+<ANCHOR id="GST-AUDIO-FLAG-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FLAG-NONE:CAPS">
+<ANCHOR id="GST-AUDIO-FLAG-DEFAULT-POSITIONS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FLAG-DEFAULT-POSITIONS:CAPS">
+<ANCHOR id="GstAudioFormat" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GstAudioFormat">
+<ANCHOR id="GST-AUDIO-FORMAT-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-UNKNOWN:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S8:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S8:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U8:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U8:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S16LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S16BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U16LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U16BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24-32LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24-32BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24-32LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24-32BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S32LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S32BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U32LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U32BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S20LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S20BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U20LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U20BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S18LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S18BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U18LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U18BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F32LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F32BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F64LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64LE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F64BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64BE:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S16:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S16:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U16:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U16:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24-32:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24-32:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24-32:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24-32:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S32:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S32:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U32:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U32:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S24:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S24:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U24:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U24:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S20:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S20:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U20:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U20:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-S18:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-S18:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-U18:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-U18:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F32:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F32:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-F64:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-F64:CAPS">
+<ANCHOR id="GstAudioFormatFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GstAudioFormatFlags">
+<ANCHOR id="GST-AUDIO-FORMAT-FLAG-INTEGER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-INTEGER:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-FLAG-FLOAT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-FLOAT:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-FLAG-SIGNED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-SIGNED:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-FLAG-COMPLEX:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-FLAG-COMPLEX:CAPS">
+<ANCHOR id="GstAudioFormatInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GstAudioFormatInfo">
+<ANCHOR id="GstAudioInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GstAudioInfo">
+<ANCHOR id="gst-audio-info-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-info-init">
+<ANCHOR id="gst-audio-info-from-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-info-from-caps">
+<ANCHOR id="gst-audio-info-to-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-info-to-caps">
+<ANCHOR id="gst-audio-info-convert" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-info-convert">
+<ANCHOR id="gst-audio-format-get-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-format-get-info">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-DEPTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-DEPTH:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-ENDIANNESS:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-FLAGS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FLAGS:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-FORMAT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-FORMAT:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-FLOAT:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-INTEGER:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-BIG-ENDIAN:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-LITTLE-ENDIAN:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-IS-SIGNED:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-FORMAT-INFO-WIDTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-FORMAT-INFO-WIDTH:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-BPF:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPF:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-BPS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-BPS:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-CHANNELS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-CHANNELS:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-DEPTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-DEPTH:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-FLAGS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FLAGS:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-FORMAT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-FORMAT:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-HAS-DEFAULT-POSITIONS:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-POSITION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-POSITION:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-RATE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-RATE:CAPS">
+<ANCHOR id="GST-AUDIO-INFO-WIDTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-INFO-WIDTH:CAPS">
+<ANCHOR id="GST-FRAMES-TO-CLOCK-TIME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-FRAMES-TO-CLOCK-TIME:CAPS">
+<ANCHOR id="GST-CLOCK-TIME-TO-FRAMES:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-CLOCK-TIME-TO-FRAMES:CAPS">
+<ANCHOR id="GST-AUDIO-DEF-RATE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#GST-AUDIO-DEF-RATE:CAPS">
+<ANCHOR id="gst-audio-buffer-clip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudio.html#gst-audio-buffer-clip">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-plugins-base-libs-gstaudioclock.synopsis">
+<ANCHOR id="GstAudioClock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#GstAudioClock">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-plugins-base-libs-gstaudioclock.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-plugins-base-libs-gstaudioclock.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-plugins-base-libs-gstaudioclock.details">
+<ANCHOR id="GstAudioClock-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#GstAudioClock-struct">
+<ANCHOR id="GstAudioClockGetTimeFunc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#GstAudioClockGetTimeFunc">
+<ANCHOR id="gst-audio-clock-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new">
+<ANCHOR id="gst-audio-clock-new-full" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-new-full">
+<ANCHOR id="gst-audio-clock-adjust" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-adjust">
+<ANCHOR id="gst-audio-clock-get-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-get-time">
+<ANCHOR id="gst-audio-clock-reset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-reset">
+<ANCHOR id="gst-audio-clock-invalidate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-audio-clock-invalidate">
+<ANCHOR id="gst-plugins-base-libs-gstaudioclock.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioclock.html#gst-plugins-base-libs-gstaudioclock.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.synopsis">
+<ANCHOR id="GstAudioDecoder" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.properties">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.details">
+<ANCHOR id="GstAudioDecoder-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder-struct">
+<ANCHOR id="GstAudioDecoderClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoderClass">
+<ANCHOR id="GST-AUDIO-DECODER-ERROR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-ERROR:CAPS">
+<ANCHOR id="GST-AUDIO-DECODER-SINK-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-DECODER-SINK-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SINK-PAD:CAPS">
+<ANCHOR id="GST-AUDIO-DECODER-SRC-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-DECODER-SRC-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GST-AUDIO-DECODER-SRC-PAD:CAPS">
+<ANCHOR id="gst-audio-decoder-finish-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-finish-frame">
+<ANCHOR id="gst-audio-decoder-get-audio-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-audio-info">
+<ANCHOR id="gst-audio-decoder-get-byte-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-byte-time">
+<ANCHOR id="gst-audio-decoder-get-delay" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-delay">
+<ANCHOR id="gst-audio-decoder-get-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-latency">
+<ANCHOR id="gst-audio-decoder-get-max-errors" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-max-errors">
+<ANCHOR id="gst-audio-decoder-get-min-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-min-latency">
+<ANCHOR id="gst-audio-decoder-get-parse-state" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-parse-state">
+<ANCHOR id="gst-audio-decoder-get-plc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc">
+<ANCHOR id="gst-audio-decoder-get-plc-aware" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-plc-aware">
+<ANCHOR id="gst-audio-decoder-get-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-get-tolerance">
+<ANCHOR id="gst-audio-decoder-set-byte-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-byte-time">
+<ANCHOR id="gst-audio-decoder-set-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-latency">
+<ANCHOR id="gst-audio-decoder-set-max-errors" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-max-errors">
+<ANCHOR id="gst-audio-decoder-set-min-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-min-latency">
+<ANCHOR id="gst-audio-decoder-set-plc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc">
+<ANCHOR id="gst-audio-decoder-set-plc-aware" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-plc-aware">
+<ANCHOR id="gst-audio-decoder-set-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-audio-decoder-set-tolerance">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.property-details">
+<ANCHOR id="GstAudioDecoder--min-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--min-latency">
+<ANCHOR id="GstAudioDecoder--plc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--plc">
+<ANCHOR id="GstAudioDecoder--tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#GstAudioDecoder--tolerance">
+<ANCHOR id="gst-plugins-base-libs-gstaudiodecoder.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiodecoder.html#gst-plugins-base-libs-gstaudiodecoder.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.synopsis">
+<ANCHOR id="GstAudioEncoder" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.implemented-interfaces" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.properties">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.details">
+<ANCHOR id="GstAudioEncoder-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder-struct">
+<ANCHOR id="GstAudioEncoderClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoderClass">
+<ANCHOR id="GST-AUDIO-ENCODER-SEGMENT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SEGMENT:CAPS">
+<ANCHOR id="GST-AUDIO-ENCODER-SINK-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-ENCODER-SINK-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SINK-PAD:CAPS">
+<ANCHOR id="GST-AUDIO-ENCODER-SRC-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-NAME:CAPS">
+<ANCHOR id="GST-AUDIO-ENCODER-SRC-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GST-AUDIO-ENCODER-SRC-PAD:CAPS">
+<ANCHOR id="gst-audio-encoder-finish-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-finish-frame">
+<ANCHOR id="gst-audio-encoder-get-audio-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-audio-info">
+<ANCHOR id="gst-audio-encoder-get-frame-max" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-max">
+<ANCHOR id="gst-audio-encoder-get-frame-samples-min" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-min">
+<ANCHOR id="gst-audio-encoder-get-frame-samples-max" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-frame-samples-max">
+<ANCHOR id="gst-audio-encoder-get-hard-resync" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-hard-resync">
+<ANCHOR id="gst-audio-encoder-get-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-latency">
+<ANCHOR id="gst-audio-encoder-get-lookahead" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-lookahead">
+<ANCHOR id="gst-audio-encoder-get-mark-granule" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-mark-granule">
+<ANCHOR id="gst-audio-encoder-get-perfect-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-perfect-timestamp">
+<ANCHOR id="gst-audio-encoder-get-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-get-tolerance">
+<ANCHOR id="gst-audio-encoder-proxy-getcaps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-proxy-getcaps">
+<ANCHOR id="gst-audio-encoder-set-frame-max" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-max">
+<ANCHOR id="gst-audio-encoder-set-frame-samples-min" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-min">
+<ANCHOR id="gst-audio-encoder-set-frame-samples-max" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-frame-samples-max">
+<ANCHOR id="gst-audio-encoder-set-hard-resync" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-hard-resync">
+<ANCHOR id="gst-audio-encoder-set-latency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-latency">
+<ANCHOR id="gst-audio-encoder-set-lookahead" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-lookahead">
+<ANCHOR id="gst-audio-encoder-set-mark-granule" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-mark-granule">
+<ANCHOR id="gst-audio-encoder-set-perfect-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-perfect-timestamp">
+<ANCHOR id="gst-audio-encoder-set-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-audio-encoder-set-tolerance">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.property-details">
+<ANCHOR id="GstAudioEncoder--hard-resync" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--hard-resync">
+<ANCHOR id="GstAudioEncoder--mark-granule" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--mark-granule">
+<ANCHOR id="GstAudioEncoder--perfect-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--perfect-timestamp">
+<ANCHOR id="GstAudioEncoder--tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#GstAudioEncoder--tolerance">
+<ANCHOR id="gst-plugins-base-libs-gstaudioencoder.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioencoder.html#gst-plugins-base-libs-gstaudioencoder.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudiofilter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudiofilter.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#gst-plugins-base-libs-gstaudiofilter.synopsis">
+<ANCHOR id="GstAudioFilter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter">
+<ANCHOR id="gst-plugins-base-libs-gstaudiofilter.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#gst-plugins-base-libs-gstaudiofilter.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudiofilter.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#gst-plugins-base-libs-gstaudiofilter.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudiofilter.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#gst-plugins-base-libs-gstaudiofilter.details">
+<ANCHOR id="GstAudioFilter-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct">
+<ANCHOR id="GstAudioFilterClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilterClass">
+<ANCHOR id="gst-audio-filter-class-add-pad-templates" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#gst-audio-filter-class-add-pad-templates">
+<ANCHOR id="gst-plugins-base-libs-gstaudiomixerutils" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudiomixerutils.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html#gst-plugins-base-libs-gstaudiomixerutils.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstaudiomixerutils.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html#gst-plugins-base-libs-gstaudiomixerutils.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudiomixerutils.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html#gst-plugins-base-libs-gstaudiomixerutils.details">
+<ANCHOR id="GstAudioMixerFilterFunc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html#GstAudioMixerFilterFunc">
+<ANCHOR id="gst-audio-default-registry-mixer-filter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiomixerutils.html#gst-audio-default-registry-mixer-filter">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#gst-plugins-base-libs-gstaudiosink.synopsis">
+<ANCHOR id="GstAudioSink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#GstAudioSink">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#gst-plugins-base-libs-gstaudiosink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#gst-plugins-base-libs-gstaudiosink.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#gst-plugins-base-libs-gstaudiosink.details">
+<ANCHOR id="GstAudioSink-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#GstAudioSink-struct">
+<ANCHOR id="GstAudioSinkClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#GstAudioSinkClass">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosink.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#gst-plugins-base-libs-gstaudiosink.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#gst-plugins-base-libs-gstaudiosrc.synopsis">
+<ANCHOR id="GstAudioSrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#gst-plugins-base-libs-gstaudiosrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#gst-plugins-base-libs-gstaudiosrc.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#gst-plugins-base-libs-gstaudiosrc.details">
+<ANCHOR id="GstAudioSrc-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc-struct">
+<ANCHOR id="GstAudioSrcClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrcClass">
+<ANCHOR id="gst-plugins-base-libs-gstaudiosrc.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#gst-plugins-base-libs-gstaudiosrc.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.synopsis">
+<ANCHOR id="GstBaseAudioSink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.properties">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.description">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.details">
+<ANCHOR id="GstBaseAudioSink-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink-struct">
+<ANCHOR id="GstBaseAudioSinkClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkClass">
+<ANCHOR id="GstBaseAudioSinkSlaveMethod" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSinkSlaveMethod">
+<ANCHOR id="GST-BASE-AUDIO-SINK-SLAVE-RESAMPLE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-RESAMPLE:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SINK-SLAVE-SKEW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-SKEW:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SINK-SLAVE-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-SLAVE-NONE:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SINK-CLOCK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-CLOCK:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SINK-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GST-BASE-AUDIO-SINK-PAD:CAPS">
+<ANCHOR id="gst-base-audio-sink-create-ringbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-create-ringbuffer">
+<ANCHOR id="gst-base-audio-sink-set-provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-provide-clock">
+<ANCHOR id="gst-base-audio-sink-get-provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-provide-clock">
+<ANCHOR id="gst-base-audio-sink-set-slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-slave-method">
+<ANCHOR id="gst-base-audio-sink-get-slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-slave-method">
+<ANCHOR id="gst-base-audio-sink-get-drift-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-get-drift-tolerance">
+<ANCHOR id="gst-base-audio-sink-set-drift-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-base-audio-sink-set-drift-tolerance">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.property-details">
+<ANCHOR id="GstBaseAudioSink--buffer-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--buffer-time">
+<ANCHOR id="GstBaseAudioSink--can-activate-pull" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--can-activate-pull">
+<ANCHOR id="GstBaseAudioSink--drift-tolerance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--drift-tolerance">
+<ANCHOR id="GstBaseAudioSink--latency-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--latency-time">
+<ANCHOR id="GstBaseAudioSink--provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--provide-clock">
+<ANCHOR id="GstBaseAudioSink--slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink--slave-method">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosink.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#gst-plugins-base-libs-gstbaseaudiosink.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.synopsis">
+<ANCHOR id="GstBaseAudioSrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.properties">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.description">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.details">
+<ANCHOR id="GstBaseAudioSrc-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc-struct">
+<ANCHOR id="GstBaseAudioSrcClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcClass">
+<ANCHOR id="GstBaseAudioSrcSlaveMethod" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrcSlaveMethod">
+<ANCHOR id="GST-BASE-AUDIO-SRC-SLAVE-RESAMPLE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-RESAMPLE:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SRC-SLAVE-RETIMESTAMP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-RETIMESTAMP:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SRC-SLAVE-SKEW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-SKEW:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SRC-SLAVE-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-SLAVE-NONE:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SRC-CLOCK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-CLOCK:CAPS">
+<ANCHOR id="GST-BASE-AUDIO-SRC-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GST-BASE-AUDIO-SRC-PAD:CAPS">
+<ANCHOR id="gst-base-audio-src-create-ringbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-create-ringbuffer">
+<ANCHOR id="gst-base-audio-src-set-provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-provide-clock">
+<ANCHOR id="gst-base-audio-src-get-provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-provide-clock">
+<ANCHOR id="gst-base-audio-src-get-slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-get-slave-method">
+<ANCHOR id="gst-base-audio-src-set-slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-base-audio-src-set-slave-method">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.property-details">
+<ANCHOR id="GstBaseAudioSrc--actual-buffer-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-buffer-time">
+<ANCHOR id="GstBaseAudioSrc--actual-latency-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--actual-latency-time">
+<ANCHOR id="GstBaseAudioSrc--buffer-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--buffer-time">
+<ANCHOR id="GstBaseAudioSrc--latency-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--latency-time">
+<ANCHOR id="GstBaseAudioSrc--provide-clock" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--provide-clock">
+<ANCHOR id="GstBaseAudioSrc--slave-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc--slave-method">
+<ANCHOR id="gst-plugins-base-libs-gstbaseaudiosrc.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#gst-plugins-base-libs-gstbaseaudiosrc.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstmultichannel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html">
+<ANCHOR id="gst-plugins-base-libs-gstmultichannel.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-plugins-base-libs-gstmultichannel.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstmultichannel.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-plugins-base-libs-gstmultichannel.description">
+<ANCHOR id="gst-plugins-base-libs-gstmultichannel.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-plugins-base-libs-gstmultichannel.details">
+<ANCHOR id="GstAudioChannelPosition" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GstAudioChannelPosition">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-INVALID:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-MONO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-MONO:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-REAR-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-REAR-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-LEFT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-REAR-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-REAR-RIGHT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-LFE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-LFE:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT-OF-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-LEFT-OF-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT-OF-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-FRONT-RIGHT-OF-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-SIDE-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-SIDE-LEFT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-SIDE-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-SIDE-RIGHT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-LEFT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-RIGHT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-FRONT-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-LEFT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-RIGHT:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-TOP-REAR-CENTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-TOP-REAR-CENTER:CAPS">
+<ANCHOR id="GST-AUDIO-CHANNEL-POSITION-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#GST-AUDIO-CHANNEL-POSITION-NONE:CAPS">
+<ANCHOR id="gst-audio-fixate-channel-positions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-fixate-channel-positions">
+<ANCHOR id="gst-audio-get-channel-positions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-get-channel-positions">
+<ANCHOR id="gst-audio-set-caps-channel-positions-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-caps-channel-positions-list">
+<ANCHOR id="gst-audio-set-channel-positions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-channel-positions">
+<ANCHOR id="gst-audio-set-structure-channel-positions-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-set-structure-channel-positions-list">
+<ANCHOR id="gst-audio-check-channel-positions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmultichannel.html#gst-audio-check-channel-positions">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-plugins-base-libs-gstringbuffer.synopsis">
+<ANCHOR id="GstRingBuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-plugins-base-libs-gstringbuffer.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-plugins-base-libs-gstringbuffer.description">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-plugins-base-libs-gstringbuffer.details">
+<ANCHOR id="GstRingBuffer-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBuffer-struct">
+<ANCHOR id="GstRingBufferClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBufferClass">
+<ANCHOR id="GstRingBufferSpec" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSpec">
+<ANCHOR id="GstRingBufferCallback" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBufferCallback">
+<ANCHOR id="GstRingBufferSegState" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBufferSegState">
+<ANCHOR id="GST-SEGSTATE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-INVALID:CAPS">
+<ANCHOR id="GST-SEGSTATE-EMPTY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-EMPTY:CAPS">
+<ANCHOR id="GST-SEGSTATE-FILLED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-FILLED:CAPS">
+<ANCHOR id="GST-SEGSTATE-PARTIAL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-SEGSTATE-PARTIAL:CAPS">
+<ANCHOR id="GstRingBufferState" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstRingBufferState">
+<ANCHOR id="GST-RING-BUFFER-STATE-STOPPED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-STOPPED:CAPS">
+<ANCHOR id="GST-RING-BUFFER-STATE-PAUSED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-PAUSED:CAPS">
+<ANCHOR id="GST-RING-BUFFER-STATE-STARTED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-STATE-STARTED:CAPS">
+<ANCHOR id="GstBufferFormatType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GstBufferFormatType">
+<ANCHOR id="GST-BUFTYPE-RAW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-RAW:CAPS">
+<ANCHOR id="GST-BUFTYPE-MU-LAW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MU-LAW:CAPS">
+<ANCHOR id="GST-BUFTYPE-A-LAW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-A-LAW:CAPS">
+<ANCHOR id="GST-BUFTYPE-IMA-ADPCM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-IMA-ADPCM:CAPS">
+<ANCHOR id="GST-BUFTYPE-MPEG:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG:CAPS">
+<ANCHOR id="GST-BUFTYPE-GSM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-GSM:CAPS">
+<ANCHOR id="GST-BUFTYPE-IEC958:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-IEC958:CAPS">
+<ANCHOR id="GST-BUFTYPE-AC3:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-AC3:CAPS">
+<ANCHOR id="GST-BUFTYPE-EAC3:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-EAC3:CAPS">
+<ANCHOR id="GST-BUFTYPE-DTS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-DTS:CAPS">
+<ANCHOR id="GST-BUFTYPE-MPEG2-AAC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG2-AAC:CAPS">
+<ANCHOR id="GST-BUFTYPE-MPEG4-AAC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-BUFTYPE-MPEG4-AAC:CAPS">
+<ANCHOR id="GST-RING-BUFFER-BROADCAST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-BROADCAST:CAPS">
+<ANCHOR id="GST-RING-BUFFER-GET-COND:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-GET-COND:CAPS">
+<ANCHOR id="GST-RING-BUFFER-SIGNAL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-SIGNAL:CAPS">
+<ANCHOR id="GST-RING-BUFFER-WAIT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#GST-RING-BUFFER-WAIT:CAPS">
+<ANCHOR id="gst-ring-buffer-set-callback" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-callback">
+<ANCHOR id="gst-ring-buffer-acquire" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-acquire">
+<ANCHOR id="gst-ring-buffer-release" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-release">
+<ANCHOR id="gst-ring-buffer-is-acquired" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-acquired">
+<ANCHOR id="gst-ring-buffer-activate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-activate">
+<ANCHOR id="gst-ring-buffer-is-active" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-is-active">
+<ANCHOR id="gst-ring-buffer-start" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-start">
+<ANCHOR id="gst-ring-buffer-pause" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-pause">
+<ANCHOR id="gst-ring-buffer-stop" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-stop">
+<ANCHOR id="gst-ring-buffer-delay" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-delay">
+<ANCHOR id="gst-ring-buffer-samples-done" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-samples-done">
+<ANCHOR id="gst-ring-buffer-set-sample" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-sample">
+<ANCHOR id="gst-ring-buffer-commit" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit">
+<ANCHOR id="gst-ring-buffer-commit-full" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-commit-full">
+<ANCHOR id="gst-ring-buffer-convert" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-convert">
+<ANCHOR id="gst-ring-buffer-prepare-read" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-prepare-read">
+<ANCHOR id="gst-ring-buffer-read" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-read">
+<ANCHOR id="gst-ring-buffer-clear" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear">
+<ANCHOR id="gst-ring-buffer-clear-all" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-clear-all">
+<ANCHOR id="gst-ring-buffer-advance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-advance">
+<ANCHOR id="gst-ring-buffer-close-device" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-close-device">
+<ANCHOR id="gst-ring-buffer-open-device" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-open-device">
+<ANCHOR id="gst-ring-buffer-device-is-open" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-device-is-open">
+<ANCHOR id="gst-ring-buffer-may-start" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-may-start">
+<ANCHOR id="gst-ring-buffer-parse-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-parse-caps">
+<ANCHOR id="gst-ring-buffer-set-flushing" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-ring-buffer-set-flushing">
+<ANCHOR id="gst-plugins-base-libs-gstringbuffer.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstringbuffer.html#gst-plugins-base-libs-gstringbuffer.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstaudioiec61937" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html">
+<ANCHOR id="gst-plugins-base-libs-gstaudioiec61937.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html#gst-plugins-base-libs-gstaudioiec61937.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstaudioiec61937.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html#gst-plugins-base-libs-gstaudioiec61937.description">
+<ANCHOR id="gst-plugins-base-libs-gstaudioiec61937.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html#gst-plugins-base-libs-gstaudioiec61937.details">
+<ANCHOR id="gst-audio-iec61937-frame-size" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-frame-size">
+<ANCHOR id="gst-audio-iec61937-payload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudioiec61937.html#gst-audio-iec61937-payload">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.synopsis">
+<ANCHOR id="GstCddaBaseSrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.implemented-interfaces" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.properties">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.description">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.details">
+<ANCHOR id="GstCddaBaseSrc-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc-struct">
+<ANCHOR id="GstCddaBaseSrcClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcClass">
+<ANCHOR id="GstCddaBaseSrcTrack" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcTrack">
+<ANCHOR id="GstCddaBaseSrcMode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrcMode">
+<ANCHOR id="GST-CDDA-BASE-SRC-MODE-NORMAL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GST-CDDA-BASE-SRC-MODE-NORMAL:CAPS">
+<ANCHOR id="GST-CDDA-BASE-SRC-MODE-CONTINUOUS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GST-CDDA-BASE-SRC-MODE-CONTINUOUS:CAPS">
+<ANCHOR id="gst-cdda-base-src-add-track" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-cdda-base-src-add-track">
+<ANCHOR id="gst-plugins-base-libs-gstcddabasesrc.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#gst-plugins-base-libs-gstcddabasesrc.property-details">
+<ANCHOR id="GstCddaBaseSrc--device" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--device">
+<ANCHOR id="GstCddaBaseSrc--mode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--mode">
+<ANCHOR id="GstCddaBaseSrc--track" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc--track">
+<ANCHOR id="gst-plugins-base-libs-gstfft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html">
+<ANCHOR id="gst-plugins-base-libs-gstfft.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#gst-plugins-base-libs-gstfft.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstfft.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#gst-plugins-base-libs-gstfft.description">
+<ANCHOR id="gst-plugins-base-libs-gstfft.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#gst-plugins-base-libs-gstfft.details">
+<ANCHOR id="GstFFTWindow" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GstFFTWindow">
+<ANCHOR id="GST-FFT-WINDOW-RECTANGULAR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-RECTANGULAR:CAPS">
+<ANCHOR id="GST-FFT-WINDOW-HAMMING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-HAMMING:CAPS">
+<ANCHOR id="GST-FFT-WINDOW-HANN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-HANN:CAPS">
+<ANCHOR id="GST-FFT-WINDOW-BARTLETT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-BARTLETT:CAPS">
+<ANCHOR id="GST-FFT-WINDOW-BLACKMAN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#GST-FFT-WINDOW-BLACKMAN:CAPS">
+<ANCHOR id="gst-fft-next-fast-length" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfft.html#gst-fft-next-fast-length">
+<ANCHOR id="gst-plugins-base-libs-gstffts16" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html">
+<ANCHOR id="gst-plugins-base-libs-gstffts16.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-plugins-base-libs-gstffts16.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstffts16.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-plugins-base-libs-gstffts16.description">
+<ANCHOR id="gst-plugins-base-libs-gstffts16.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-plugins-base-libs-gstffts16.details">
+<ANCHOR id="GstFFTS16" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#GstFFTS16">
+<ANCHOR id="GstFFTS16Complex" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#GstFFTS16Complex">
+<ANCHOR id="gst-fft-s16-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-fft-s16-new">
+<ANCHOR id="gst-fft-s16-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-fft-s16-fft">
+<ANCHOR id="gst-fft-s16-inverse-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-fft-s16-inverse-fft">
+<ANCHOR id="gst-fft-s16-window" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-fft-s16-window">
+<ANCHOR id="gst-fft-s16-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts16.html#gst-fft-s16-free">
+<ANCHOR id="gst-plugins-base-libs-gstffts32" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html">
+<ANCHOR id="gst-plugins-base-libs-gstffts32.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-plugins-base-libs-gstffts32.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstffts32.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-plugins-base-libs-gstffts32.description">
+<ANCHOR id="gst-plugins-base-libs-gstffts32.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-plugins-base-libs-gstffts32.details">
+<ANCHOR id="GstFFTS32" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#GstFFTS32">
+<ANCHOR id="GstFFTS32Complex" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#GstFFTS32Complex">
+<ANCHOR id="gst-fft-s32-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-fft-s32-new">
+<ANCHOR id="gst-fft-s32-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-fft-s32-fft">
+<ANCHOR id="gst-fft-s32-inverse-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-fft-s32-inverse-fft">
+<ANCHOR id="gst-fft-s32-window" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-fft-s32-window">
+<ANCHOR id="gst-fft-s32-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstffts32.html#gst-fft-s32-free">
+<ANCHOR id="gst-plugins-base-libs-gstfftf32" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html">
+<ANCHOR id="gst-plugins-base-libs-gstfftf32.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-plugins-base-libs-gstfftf32.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstfftf32.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-plugins-base-libs-gstfftf32.description">
+<ANCHOR id="gst-plugins-base-libs-gstfftf32.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-plugins-base-libs-gstfftf32.details">
+<ANCHOR id="GstFFTF32" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#GstFFTF32">
+<ANCHOR id="GstFFTF32Complex" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#GstFFTF32Complex">
+<ANCHOR id="gst-fft-f32-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-new">
+<ANCHOR id="gst-fft-f32-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-fft">
+<ANCHOR id="gst-fft-f32-inverse-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-inverse-fft">
+<ANCHOR id="gst-fft-f32-window" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-window">
+<ANCHOR id="gst-fft-f32-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf32.html#gst-fft-f32-free">
+<ANCHOR id="gst-plugins-base-libs-gstfftf64" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html">
+<ANCHOR id="gst-plugins-base-libs-gstfftf64.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-plugins-base-libs-gstfftf64.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstfftf64.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-plugins-base-libs-gstfftf64.description">
+<ANCHOR id="gst-plugins-base-libs-gstfftf64.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-plugins-base-libs-gstfftf64.details">
+<ANCHOR id="GstFFTF64" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#GstFFTF64">
+<ANCHOR id="GstFFTF64Complex" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#GstFFTF64Complex">
+<ANCHOR id="gst-fft-f64-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new">
+<ANCHOR id="gst-fft-f64-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-fft">
+<ANCHOR id="gst-fft-f64-inverse-fft" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft">
+<ANCHOR id="gst-fft-f64-window" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-window">
+<ANCHOR id="gst-fft-f64-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.synopsis">
+<ANCHOR id="GstColorBalance" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.signals">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.description">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.details">
+<ANCHOR id="GstColorBalance-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-struct">
+<ANCHOR id="GstColorBalanceClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceClass">
+<ANCHOR id="GstColorBalanceType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalanceType">
+<ANCHOR id="GST-COLOR-BALANCE-HARDWARE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GST-COLOR-BALANCE-HARDWARE:CAPS">
+<ANCHOR id="GST-COLOR-BALANCE-SOFTWARE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GST-COLOR-BALANCE-SOFTWARE:CAPS">
+<ANCHOR id="gst-color-balance-list-channels" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-list-channels">
+<ANCHOR id="gst-color-balance-get-value" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-value">
+<ANCHOR id="gst-color-balance-set-value" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-set-value">
+<ANCHOR id="gst-color-balance-value-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-value-changed">
+<ANCHOR id="gst-color-balance-get-balance-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-color-balance-get-balance-type">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalance.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#gst-plugins-base-libs-gstcolorbalance.signal-details">
+<ANCHOR id="GstColorBalance-value-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance-value-changed">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.synopsis">
+<ANCHOR id="GstColorBalanceChannel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.signals">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.description">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.details">
+<ANCHOR id="GstColorBalanceChannel-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-struct">
+<ANCHOR id="GstColorBalanceChannelClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannelClass">
+<ANCHOR id="gst-plugins-base-libs-gstcolorbalancechannel.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#gst-plugins-base-libs-gstcolorbalancechannel.signal-details">
+<ANCHOR id="GstColorBalanceChannel-value-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalancechannel.html#GstColorBalanceChannel-value-changed">
+<ANCHOR id="gst-plugins-base-libs-gstmixer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.synopsis">
+<ANCHOR id="GstMixer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.signals">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.description">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.details">
+<ANCHOR id="GstMixer-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer-struct">
+<ANCHOR id="GstMixerType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixerType">
+<ANCHOR id="GST-MIXER-HARDWARE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-HARDWARE:CAPS">
+<ANCHOR id="GST-MIXER-SOFTWARE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-SOFTWARE:CAPS">
+<ANCHOR id="GstMixerFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixerFlags">
+<ANCHOR id="GST-MIXER-FLAG-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-NONE:CAPS">
+<ANCHOR id="GST-MIXER-FLAG-AUTO-NOTIFICATIONS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-AUTO-NOTIFICATIONS:CAPS">
+<ANCHOR id="GST-MIXER-FLAG-HAS-WHITELIST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-HAS-WHITELIST:CAPS">
+<ANCHOR id="GST-MIXER-FLAG-GROUPING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-FLAG-GROUPING:CAPS">
+<ANCHOR id="GstMixerMessageType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixerMessageType">
+<ANCHOR id="GST-MIXER-MESSAGE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-INVALID:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-MUTE-TOGGLED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-MUTE-TOGGLED:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-RECORD-TOGGLED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-RECORD-TOGGLED:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-VOLUME-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-VOLUME-CHANGED:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-OPTION-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-OPTION-CHANGED:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-OPTIONS-LIST-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-OPTIONS-LIST-CHANGED:CAPS">
+<ANCHOR id="GST-MIXER-MESSAGE-MIXER-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GST-MIXER-MESSAGE-MIXER-CHANGED:CAPS">
+<ANCHOR id="gst-mixer-list-tracks" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-list-tracks">
+<ANCHOR id="gst-mixer-get-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-get-volume">
+<ANCHOR id="gst-mixer-set-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-set-volume">
+<ANCHOR id="gst-mixer-set-mute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-set-mute">
+<ANCHOR id="gst-mixer-set-record" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-set-record">
+<ANCHOR id="gst-mixer-set-option" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-set-option">
+<ANCHOR id="gst-mixer-mute-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-mute-toggled">
+<ANCHOR id="gst-mixer-record-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-record-toggled">
+<ANCHOR id="gst-mixer-volume-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-volume-changed">
+<ANCHOR id="gst-mixer-option-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-option-changed">
+<ANCHOR id="gst-mixer-options-list-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-options-list-changed">
+<ANCHOR id="gst-mixer-get-option" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-get-option">
+<ANCHOR id="gst-mixer-mixer-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-mixer-changed">
+<ANCHOR id="gst-mixer-get-mixer-flags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-flags">
+<ANCHOR id="gst-mixer-get-mixer-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-get-mixer-type">
+<ANCHOR id="gst-mixer-message-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-get-type">
+<ANCHOR id="gst-mixer-message-parse-mute-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-mute-toggled">
+<ANCHOR id="gst-mixer-message-parse-option-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-option-changed">
+<ANCHOR id="gst-mixer-message-parse-record-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-record-toggled">
+<ANCHOR id="gst-mixer-message-parse-volume-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-volume-changed">
+<ANCHOR id="gst-mixer-message-parse-options-list-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-mixer-message-parse-options-list-changed">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.signal-details">
+<ANCHOR id="GstMixer-mute-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer-mute-toggled">
+<ANCHOR id="GstMixer-option-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer-option-changed">
+<ANCHOR id="GstMixer-record-toggled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer-record-toggled">
+<ANCHOR id="GstMixer-volume-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer-volume-changed">
+<ANCHOR id="gst-plugins-base-libs-gstmixer.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#gst-plugins-base-libs-gstmixer.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-plugins-base-libs-gstmixeroptions.synopsis">
+<ANCHOR id="GstMixerOptions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-plugins-base-libs-gstmixeroptions.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-plugins-base-libs-gstmixeroptions.description">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-plugins-base-libs-gstmixeroptions.details">
+<ANCHOR id="GstMixerOptions-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#GstMixerOptions-struct">
+<ANCHOR id="gst-mixer-options-get-values" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-mixer-options-get-values">
+<ANCHOR id="gst-plugins-base-libs-gstmixeroptions.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixeroptions.html#gst-plugins-base-libs-gstmixeroptions.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.synopsis">
+<ANCHOR id="GstMixerTrack" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.properties">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.description">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.details">
+<ANCHOR id="GstMixerTrack-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack-struct">
+<ANCHOR id="GstMixerTrackFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrackFlags">
+<ANCHOR id="GST-MIXER-TRACK-INPUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-INPUT:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-OUTPUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-OUTPUT:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-MUTE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-MUTE:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-RECORD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-RECORD:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-MASTER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-MASTER:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-SOFTWARE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-SOFTWARE:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-NO-RECORD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-NO-RECORD:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-NO-MUTE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-NO-MUTE:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-WHITELIST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-WHITELIST:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-READONLY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-READONLY:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-WRITEONLY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-WRITEONLY:CAPS">
+<ANCHOR id="GST-MIXER-TRACK-HAS-FLAG:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GST-MIXER-TRACK-HAS-FLAG:CAPS">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.property-details">
+<ANCHOR id="GstMixerTrack--flags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--flags">
+<ANCHOR id="GstMixerTrack--index" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--index">
+<ANCHOR id="GstMixerTrack--label" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--label">
+<ANCHOR id="GstMixerTrack--max-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--max-volume">
+<ANCHOR id="GstMixerTrack--min-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--min-volume">
+<ANCHOR id="GstMixerTrack--num-channels" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--num-channels">
+<ANCHOR id="GstMixerTrack--untranslated-label" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#GstMixerTrack--untranslated-label">
+<ANCHOR id="gst-plugins-base-libs-gstmixertrack.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixertrack.html#gst-plugins-base-libs-gstmixertrack.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstnavigation" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html">
+<ANCHOR id="gst-plugins-base-libs-gstnavigation.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-plugins-base-libs-gstnavigation.synopsis">
+<ANCHOR id="GstNavigation" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigation">
+<ANCHOR id="gst-plugins-base-libs-gstnavigation.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-plugins-base-libs-gstnavigation.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstnavigation.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-plugins-base-libs-gstnavigation.description">
+<ANCHOR id="gst-plugins-base-libs-gstnavigation.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-plugins-base-libs-gstnavigation.details">
+<ANCHOR id="GstNavigation-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigation-struct">
+<ANCHOR id="GstNavigationInterface" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigationInterface">
+<ANCHOR id="GstNavigationCommand" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigationCommand">
+<ANCHOR id="GST-NAVIGATION-COMMAND-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-INVALID:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU1:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU1:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU2:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU2:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU3:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU3:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU4:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU4:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU5:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU5:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU6:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU6:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-MENU7:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-MENU7:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-LEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-LEFT:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-RIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-RIGHT:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-UP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-UP:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DOWN:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-ACTIVATE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-ACTIVATE:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-PREV-ANGLE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-PREV-ANGLE:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-NEXT-ANGLE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-NEXT-ANGLE:CAPS">
+<ANCHOR id="GstNavigationEventType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigationEventType">
+<ANCHOR id="GST-NAVIGATION-EVENT-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-INVALID:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-KEY-PRESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-KEY-PRESS:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-KEY-RELEASE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-KEY-RELEASE:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-MOUSE-BUTTON-PRESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-BUTTON-PRESS:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-MOUSE-BUTTON-RELEASE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-BUTTON-RELEASE:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-MOUSE-MOVE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-MOUSE-MOVE:CAPS">
+<ANCHOR id="GST-NAVIGATION-EVENT-COMMAND:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-EVENT-COMMAND:CAPS">
+<ANCHOR id="GstNavigationMessageType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigationMessageType">
+<ANCHOR id="GST-NAVIGATION-MESSAGE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-INVALID:CAPS">
+<ANCHOR id="GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-MOUSE-OVER:CAPS">
+<ANCHOR id="GST-NAVIGATION-MESSAGE-COMMANDS-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-COMMANDS-CHANGED:CAPS">
+<ANCHOR id="GST-NAVIGATION-MESSAGE-ANGLES-CHANGED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-MESSAGE-ANGLES-CHANGED:CAPS">
+<ANCHOR id="GstNavigationQueryType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigationQueryType">
+<ANCHOR id="GST-NAVIGATION-QUERY-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-INVALID:CAPS">
+<ANCHOR id="GST-NAVIGATION-QUERY-COMMANDS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-COMMANDS:CAPS">
+<ANCHOR id="GST-NAVIGATION-QUERY-ANGLES:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-QUERY-ANGLES:CAPS">
+<ANCHOR id="gst-navigation-send-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-event">
+<ANCHOR id="gst-navigation-send-key-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-key-event">
+<ANCHOR id="gst-navigation-send-mouse-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-mouse-event">
+<ANCHOR id="gst-navigation-send-command" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-send-command">
+<ANCHOR id="gst-navigation-event-parse-command" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-command">
+<ANCHOR id="gst-navigation-event-parse-key-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-key-event">
+<ANCHOR id="gst-navigation-event-parse-mouse-button-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-button-event">
+<ANCHOR id="gst-navigation-event-parse-mouse-move-event" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-event-parse-mouse-move-event">
+<ANCHOR id="gst-navigation-message-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-get-type">
+<ANCHOR id="gst-navigation-message-new-angles-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-angles-changed">
+<ANCHOR id="gst-navigation-message-new-commands-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-commands-changed">
+<ANCHOR id="gst-navigation-message-new-mouse-over" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-new-mouse-over">
+<ANCHOR id="gst-navigation-message-parse-mouse-over" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-mouse-over">
+<ANCHOR id="gst-navigation-message-parse-angles-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-message-parse-angles-changed">
+<ANCHOR id="gst-navigation-query-new-angles" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-angles">
+<ANCHOR id="gst-navigation-query-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-get-type">
+<ANCHOR id="gst-navigation-query-new-commands" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-new-commands">
+<ANCHOR id="gst-navigation-query-parse-angles" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-angles">
+<ANCHOR id="gst-navigation-query-parse-commands-length" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-length">
+<ANCHOR id="gst-navigation-query-parse-commands-nth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-parse-commands-nth">
+<ANCHOR id="gst-navigation-query-set-angles" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-angles">
+<ANCHOR id="gst-navigation-query-set-commands" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commands">
+<ANCHOR id="gst-navigation-query-set-commandsv" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#gst-navigation-query-set-commandsv">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ANGLE-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-AUDIO-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-CHAPTER-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-ROOT-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-SUBPICTURE-MENU:CAPS">
+<ANCHOR id="GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GST-NAVIGATION-COMMAND-DVD-TITLE-MENU:CAPS">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.synopsis">
+<ANCHOR id="GstPropertyProbe" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.signals">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.description">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.details">
+<ANCHOR id="GstPropertyProbe-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-struct">
+<ANCHOR id="GstPropertyProbeInterface" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbeInterface">
+<ANCHOR id="gst-property-probe-get-properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-properties">
+<ANCHOR id="gst-property-probe-get-property" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-property">
+<ANCHOR id="gst-property-probe-get-values" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values">
+<ANCHOR id="gst-property-probe-get-values-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-get-values-name">
+<ANCHOR id="gst-property-probe-needs-probe" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe">
+<ANCHOR id="gst-property-probe-needs-probe-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-needs-probe-name">
+<ANCHOR id="gst-property-probe-probe-and-get-values" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values">
+<ANCHOR id="gst-property-probe-probe-and-get-values-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-and-get-values-name">
+<ANCHOR id="gst-property-probe-probe-property" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property">
+<ANCHOR id="gst-property-probe-probe-property-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-property-probe-probe-property-name">
+<ANCHOR id="gst-plugins-base-libs-gstpropertyprobe.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#gst-plugins-base-libs-gstpropertyprobe.signal-details">
+<ANCHOR id="GstPropertyProbe-probe-needed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe-probe-needed">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.synopsis">
+<ANCHOR id="GstStreamVolume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.prerequisites" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.prerequisites">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.properties">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.description">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.details">
+<ANCHOR id="GstStreamVolume-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume-struct">
+<ANCHOR id="GstStreamVolumeFormat" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolumeFormat">
+<ANCHOR id="GST-STREAM-VOLUME-FORMAT-LINEAR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-LINEAR:CAPS">
+<ANCHOR id="GST-STREAM-VOLUME-FORMAT-CUBIC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-CUBIC:CAPS">
+<ANCHOR id="GST-STREAM-VOLUME-FORMAT-DB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GST-STREAM-VOLUME-FORMAT-DB:CAPS">
+<ANCHOR id="gst-stream-volume-get-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-volume">
+<ANCHOR id="gst-stream-volume-set-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-volume">
+<ANCHOR id="gst-stream-volume-get-mute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-get-mute">
+<ANCHOR id="gst-stream-volume-set-mute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-set-mute">
+<ANCHOR id="gst-stream-volume-convert-volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-stream-volume-convert-volume">
+<ANCHOR id="gst-plugins-base-libs-gststreamvolume.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#gst-plugins-base-libs-gststreamvolume.property-details">
+<ANCHOR id="GstStreamVolume--mute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--mute">
+<ANCHOR id="GstStreamVolume--volume" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume--volume">
+<ANCHOR id="gst-plugins-base-libs-gsttuner" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.synopsis">
+<ANCHOR id="GstTuner" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.signals">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.description">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.details">
+<ANCHOR id="GstTuner-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner-struct">
+<ANCHOR id="GstTunerClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTunerClass">
+<ANCHOR id="gst-tuner-list-channels" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-list-channels">
+<ANCHOR id="gst-tuner-get-channel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-get-channel">
+<ANCHOR id="gst-tuner-set-channel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-set-channel">
+<ANCHOR id="gst-tuner-list-norms" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-list-norms">
+<ANCHOR id="gst-tuner-get-norm" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-get-norm">
+<ANCHOR id="gst-tuner-set-norm" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-set-norm">
+<ANCHOR id="gst-tuner-get-frequency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-get-frequency">
+<ANCHOR id="gst-tuner-set-frequency" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-set-frequency">
+<ANCHOR id="gst-tuner-signal-strength" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-strength">
+<ANCHOR id="gst-tuner-find-norm-by-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-find-norm-by-name">
+<ANCHOR id="gst-tuner-find-channel-by-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-find-channel-by-name">
+<ANCHOR id="gst-tuner-channel-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-channel-changed">
+<ANCHOR id="gst-tuner-norm-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-norm-changed">
+<ANCHOR id="gst-tuner-frequency-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-frequency-changed">
+<ANCHOR id="gst-tuner-signal-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-tuner-signal-changed">
+<ANCHOR id="gst-plugins-base-libs-gsttuner.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#gst-plugins-base-libs-gsttuner.signal-details">
+<ANCHOR id="GstTuner-channel-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner-channel-changed">
+<ANCHOR id="GstTuner-frequency-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner-frequency-changed">
+<ANCHOR id="GstTuner-norm-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner-norm-changed">
+<ANCHOR id="GstTuner-signal-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttuner.html#GstTuner-signal-changed">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.synopsis">
+<ANCHOR id="GstTunerChannel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.signals">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.description">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.details">
+<ANCHOR id="GstTunerChannel-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-struct">
+<ANCHOR id="GstTunerChannelFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannelFlags">
+<ANCHOR id="GST-TUNER-CHANNEL-INPUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-INPUT:CAPS">
+<ANCHOR id="GST-TUNER-CHANNEL-OUTPUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-OUTPUT:CAPS">
+<ANCHOR id="GST-TUNER-CHANNEL-FREQUENCY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-FREQUENCY:CAPS">
+<ANCHOR id="GST-TUNER-CHANNEL-AUDIO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-AUDIO:CAPS">
+<ANCHOR id="GST-TUNER-CHANNEL-HAS-FLAG:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GST-TUNER-CHANNEL-HAS-FLAG:CAPS">
+<ANCHOR id="gst-plugins-base-libs-gsttunerchannel.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#gst-plugins-base-libs-gsttunerchannel.signal-details">
+<ANCHOR id="GstTunerChannel-frequency-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-frequency-changed">
+<ANCHOR id="GstTunerChannel-signal-changed" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunerchannel.html#GstTunerChannel-signal-changed">
+<ANCHOR id="gst-plugins-base-libs-gsttunernorm" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html">
+<ANCHOR id="gst-plugins-base-libs-gsttunernorm.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#gst-plugins-base-libs-gsttunernorm.synopsis">
+<ANCHOR id="GstTunerNorm" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm">
+<ANCHOR id="gst-plugins-base-libs-gsttunernorm.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#gst-plugins-base-libs-gsttunernorm.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gsttunernorm.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#gst-plugins-base-libs-gsttunernorm.description">
+<ANCHOR id="gst-plugins-base-libs-gsttunernorm.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#gst-plugins-base-libs-gsttunernorm.details">
+<ANCHOR id="GstTunerNorm-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttunernorm.html#GstTunerNorm-struct">
+<ANCHOR id="gst-plugins-base-libs-gstvideoorientation" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html">
+<ANCHOR id="gst-plugins-base-libs-gstvideoorientation.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-plugins-base-libs-gstvideoorientation.synopsis">
+<ANCHOR id="GstVideoOrientation" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation">
+<ANCHOR id="gst-plugins-base-libs-gstvideoorientation.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-plugins-base-libs-gstvideoorientation.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstvideoorientation.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-plugins-base-libs-gstvideoorientation.description">
+<ANCHOR id="gst-plugins-base-libs-gstvideoorientation.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-plugins-base-libs-gstvideoorientation.details">
+<ANCHOR id="GstVideoOrientation-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientation-struct">
+<ANCHOR id="GstVideoOrientationInterface" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#GstVideoOrientationInterface">
+<ANCHOR id="gst-video-orientation-get-hcenter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hcenter">
+<ANCHOR id="gst-video-orientation-get-hflip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-hflip">
+<ANCHOR id="gst-video-orientation-get-vcenter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vcenter">
+<ANCHOR id="gst-video-orientation-get-vflip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-get-vflip">
+<ANCHOR id="gst-video-orientation-set-hcenter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hcenter">
+<ANCHOR id="gst-video-orientation-set-hflip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-hflip">
+<ANCHOR id="gst-video-orientation-set-vcenter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vcenter">
+<ANCHOR id="gst-video-orientation-set-vflip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideoorientation.html#gst-video-orientation-set-vflip">
+<ANCHOR id="gst-plugins-base-libs-gstvideooverlay" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html">
+<ANCHOR id="gst-plugins-base-libs-gstvideooverlay.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-plugins-base-libs-gstvideooverlay.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstvideooverlay.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-plugins-base-libs-gstvideooverlay.description">
+<ANCHOR id="gst-plugins-base-libs-gstvideooverlay.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-plugins-base-libs-gstvideooverlay.details">
+<ANCHOR id="gst-video-overlay-got-window-handle" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-got-window-handle">
+<ANCHOR id="gst-video-overlay-set-window-handle" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle">
+<ANCHOR id="gst-video-overlay-prepare-window-handle" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-prepare-window-handle">
+<ANCHOR id="gst-video-overlay-expose" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-expose">
+<ANCHOR id="gst-video-overlay-handle-events" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-handle-events">
+<ANCHOR id="gst-video-overlay-set-render-rectangle" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-render-rectangle">
+<ANCHOR id="gst-plugins-base-libs-gstnetbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html">
+<ANCHOR id="gst-plugins-base-libs-gstnetbuffer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-plugins-base-libs-gstnetbuffer.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstnetbuffer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-plugins-base-libs-gstnetbuffer.description">
+<ANCHOR id="gst-plugins-base-libs-gstnetbuffer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-plugins-base-libs-gstnetbuffer.details">
+<ANCHOR id="GstNetBuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GstNetBuffer">
+<ANCHOR id="GstNetType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GstNetType">
+<ANCHOR id="GST-NET-TYPE-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="GST-NET-TYPE-IP4:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-IP4:CAPS">
+<ANCHOR id="GST-NET-TYPE-IP6:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GST-NET-TYPE-IP6:CAPS">
+<ANCHOR id="GST-NETADDRESS-MAX-LEN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GST-NETADDRESS-MAX-LEN:CAPS">
+<ANCHOR id="GstNetAddress" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#GstNetAddress">
+<ANCHOR id="gst-netaddress-get-net-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-net-type">
+<ANCHOR id="gst-netaddress-set-ip4-address" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip4-address">
+<ANCHOR id="gst-netaddress-get-ip4-address" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip4-address">
+<ANCHOR id="gst-netaddress-set-ip6-address" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-ip6-address">
+<ANCHOR id="gst-netaddress-get-ip6-address" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-ip6-address">
+<ANCHOR id="gst-netaddress-get-address-bytes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-get-address-bytes">
+<ANCHOR id="gst-netaddress-set-address-bytes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-set-address-bytes">
+<ANCHOR id="gst-netaddress-equal" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-equal">
+<ANCHOR id="gst-netaddress-to-string" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnetbuffer.html#gst-netaddress-to-string">
+<ANCHOR id="gst-plugins-base-libs-gstriff" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html">
+<ANCHOR id="gst-plugins-base-libs-gstriff.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-plugins-base-libs-gstriff.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstriff.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-plugins-base-libs-gstriff.description">
+<ANCHOR id="gst-plugins-base-libs-gstriff.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-plugins-base-libs-gstriff.details">
+<ANCHOR id="gst-riff-create-audio-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-caps">
+<ANCHOR id="gst-riff-create-audio-template-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-audio-template-caps">
+<ANCHOR id="gst-riff-create-iavs-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-caps">
+<ANCHOR id="gst-riff-create-iavs-template-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-iavs-template-caps">
+<ANCHOR id="gst-riff-create-video-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-video-caps">
+<ANCHOR id="gst-riff-create-video-template-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-create-video-template-caps">
+<ANCHOR id="gst-riff-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-init">
+<ANCHOR id="gst-riff-parse-chunk" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-chunk">
+<ANCHOR id="gst-riff-parse-file-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-file-header">
+<ANCHOR id="gst-riff-parse-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-info">
+<ANCHOR id="gst-riff-parse-strf-auds" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-auds">
+<ANCHOR id="gst-riff-parse-strf-iavs" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-iavs">
+<ANCHOR id="gst-riff-parse-strf-vids" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-strf-vids">
+<ANCHOR id="gst-riff-parse-strh" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-parse-strh">
+<ANCHOR id="gst-riff-read-chunk" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstriff.html#gst-riff-read-chunk">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.synopsis">
+<ANCHOR id="GstBaseRTPAudioPayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.properties">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.description">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.details">
+<ANCHOR id="GstBaseRTPAudioPayload-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload-struct">
+<ANCHOR id="GstBaseRTPAudioPayloadClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayloadClass">
+<ANCHOR id="gst-base-rtp-audio-payload-set-frame-based" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-based">
+<ANCHOR id="gst-base-rtp-audio-payload-set-frame-options" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-frame-options">
+<ANCHOR id="gst-base-rtp-audio-payload-set-sample-based" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-based">
+<ANCHOR id="gst-base-rtp-audio-payload-set-sample-options" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-sample-options">
+<ANCHOR id="gst-base-rtp-audio-payload-get-adapter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-get-adapter">
+<ANCHOR id="gst-base-rtp-audio-payload-push" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-push">
+<ANCHOR id="gst-base-rtp-audio-payload-flush" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-flush">
+<ANCHOR id="gst-base-rtp-audio-payload-set-samplebits-options" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-base-rtp-audio-payload-set-samplebits-options">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpaudiopayload.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#gst-plugins-base-libs-gstbasertpaudiopayload.property-details">
+<ANCHOR id="GstBaseRTPAudioPayload--buffer-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpaudiopayload.html#GstBaseRTPAudioPayload--buffer-list">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpdepayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpdepayload.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-plugins-base-libs-gstbasertpdepayload.synopsis">
+<ANCHOR id="GstBaseRTPDepayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpdepayload.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-plugins-base-libs-gstbasertpdepayload.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpdepayload.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-plugins-base-libs-gstbasertpdepayload.description">
+<ANCHOR id="gst-plugins-base-libs-gstbasertpdepayload.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-plugins-base-libs-gstbasertpdepayload.details">
+<ANCHOR id="GstBaseRTPDepayload-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayload-struct">
+<ANCHOR id="GstBaseRTPDepayloadClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#GstBaseRTPDepayloadClass">
+<ANCHOR id="GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SINKPAD:CAPS">
+<ANCHOR id="GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#GST-BASE-RTP-DEPAYLOAD-SRCPAD:CAPS">
+<ANCHOR id="gst-base-rtp-depayload-push" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push">
+<ANCHOR id="gst-base-rtp-depayload-push-ts" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-ts">
+<ANCHOR id="gst-base-rtp-depayload-push-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertpdepayload.html#gst-base-rtp-depayload-push-list">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.synopsis">
+<ANCHOR id="GstBaseRTPPayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.properties">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.description">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.details">
+<ANCHOR id="GstBaseRTPPayload-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload-struct">
+<ANCHOR id="GstBaseRTPPayloadClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayloadClass">
+<ANCHOR id="GST-BASE-RTP-PAYLOAD-MTU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-MTU:CAPS">
+<ANCHOR id="GST-BASE-RTP-PAYLOAD-PT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-PT:CAPS">
+<ANCHOR id="GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SINKPAD:CAPS">
+<ANCHOR id="GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GST-BASE-RTP-PAYLOAD-SRCPAD:CAPS">
+<ANCHOR id="gst-basertppayload-is-filled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-is-filled">
+<ANCHOR id="gst-basertppayload-push" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push">
+<ANCHOR id="gst-basertppayload-push-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-push-list">
+<ANCHOR id="gst-basertppayload-set-options" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-options">
+<ANCHOR id="gst-basertppayload-set-outcaps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-basertppayload-set-outcaps">
+<ANCHOR id="gst-plugins-base-libs-gstbasertppayload.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#gst-plugins-base-libs-gstbasertppayload.property-details">
+<ANCHOR id="GstBaseRTPPayload--max-ptime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--max-ptime">
+<ANCHOR id="GstBaseRTPPayload--min-ptime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--min-ptime">
+<ANCHOR id="GstBaseRTPPayload--mtu" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--mtu">
+<ANCHOR id="GstBaseRTPPayload--perfect-rtptime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--perfect-rtptime">
+<ANCHOR id="GstBaseRTPPayload--pt" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--pt">
+<ANCHOR id="GstBaseRTPPayload--ptime-multiple" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ptime-multiple">
+<ANCHOR id="GstBaseRTPPayload--seqnum" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum">
+<ANCHOR id="GstBaseRTPPayload--seqnum-offset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--seqnum-offset">
+<ANCHOR id="GstBaseRTPPayload--ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--ssrc">
+<ANCHOR id="GstBaseRTPPayload--timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp">
+<ANCHOR id="GstBaseRTPPayload--timestamp-offset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbasertppayload.html#GstBaseRTPPayload--timestamp-offset">
+<ANCHOR id="gst-plugins-base-libs-gstrtpbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtpbuffer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-plugins-base-libs-gstrtpbuffer.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtpbuffer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-plugins-base-libs-gstrtpbuffer.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtpbuffer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-plugins-base-libs-gstrtpbuffer.details">
+<ANCHOR id="GST-RTP-VERSION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#GST-RTP-VERSION:CAPS">
+<ANCHOR id="gst-rtp-buffer-allocate-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-allocate-data">
+<ANCHOR id="gst-rtp-buffer-new-take-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-take-data">
+<ANCHOR id="gst-rtp-buffer-new-copy-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-copy-data">
+<ANCHOR id="gst-rtp-buffer-new-allocate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate">
+<ANCHOR id="gst-rtp-buffer-new-allocate-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-new-allocate-len">
+<ANCHOR id="gst-rtp-buffer-calc-header-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-header-len">
+<ANCHOR id="gst-rtp-buffer-calc-packet-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-packet-len">
+<ANCHOR id="gst-rtp-buffer-calc-payload-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-calc-payload-len">
+<ANCHOR id="gst-rtp-buffer-validate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate">
+<ANCHOR id="gst-rtp-buffer-validate-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-validate-data">
+<ANCHOR id="gst-rtp-buffer-set-packet-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-packet-len">
+<ANCHOR id="gst-rtp-buffer-get-packet-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-packet-len">
+<ANCHOR id="gst-rtp-buffer-get-header-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-header-len">
+<ANCHOR id="gst-rtp-buffer-get-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-version">
+<ANCHOR id="gst-rtp-buffer-set-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-version">
+<ANCHOR id="gst-rtp-buffer-get-padding" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-padding">
+<ANCHOR id="gst-rtp-buffer-set-padding" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-padding">
+<ANCHOR id="gst-rtp-buffer-pad-to" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-pad-to">
+<ANCHOR id="gst-rtp-buffer-get-extension" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension">
+<ANCHOR id="gst-rtp-buffer-set-extension" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension">
+<ANCHOR id="gst-rtp-buffer-get-extension-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-data">
+<ANCHOR id="gst-rtp-buffer-get-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-ssrc">
+<ANCHOR id="gst-rtp-buffer-set-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-ssrc">
+<ANCHOR id="gst-rtp-buffer-get-csrc-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc-count">
+<ANCHOR id="gst-rtp-buffer-get-csrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-csrc">
+<ANCHOR id="gst-rtp-buffer-set-csrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-csrc">
+<ANCHOR id="gst-rtp-buffer-get-marker" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-marker">
+<ANCHOR id="gst-rtp-buffer-set-marker" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-marker">
+<ANCHOR id="gst-rtp-buffer-get-payload-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-type">
+<ANCHOR id="gst-rtp-buffer-set-payload-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-payload-type">
+<ANCHOR id="gst-rtp-buffer-get-seq" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-seq">
+<ANCHOR id="gst-rtp-buffer-set-seq" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-seq">
+<ANCHOR id="gst-rtp-buffer-get-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-timestamp">
+<ANCHOR id="gst-rtp-buffer-set-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-timestamp">
+<ANCHOR id="gst-rtp-buffer-get-payload-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-buffer">
+<ANCHOR id="gst-rtp-buffer-get-payload-subbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-subbuffer">
+<ANCHOR id="gst-rtp-buffer-get-payload-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload-len">
+<ANCHOR id="gst-rtp-buffer-get-payload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-payload">
+<ANCHOR id="gst-rtp-buffer-default-clock-rate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-default-clock-rate">
+<ANCHOR id="gst-rtp-buffer-compare-seqnum" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-compare-seqnum">
+<ANCHOR id="gst-rtp-buffer-ext-timestamp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-ext-timestamp">
+<ANCHOR id="gst-rtp-buffer-set-extension-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-set-extension-data">
+<ANCHOR id="gst-rtp-buffer-get-extension-onebyte-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-onebyte-header">
+<ANCHOR id="gst-rtp-buffer-get-extension-twobytes-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-get-extension-twobytes-header">
+<ANCHOR id="gst-rtp-buffer-add-extension-onebyte-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-onebyte-header">
+<ANCHOR id="gst-rtp-buffer-add-extension-twobytes-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-rtp-buffer-add-extension-twobytes-header">
+<ANCHOR id="gst-plugins-base-libs-gstrtpbuffer.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtpbuffer.html#gst-plugins-base-libs-gstrtpbuffer.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtcpbuffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtcpbuffer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-plugins-base-libs-gstrtcpbuffer.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtcpbuffer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-plugins-base-libs-gstrtcpbuffer.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtcpbuffer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-plugins-base-libs-gstrtcpbuffer.details">
+<ANCHOR id="GST-RTCP-VERSION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VERSION:CAPS">
+<ANCHOR id="GST-RTCP-MAX-SDES:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES:CAPS">
+<ANCHOR id="GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-BYE-SSRC-COUNT:CAPS">
+<ANCHOR id="GST-RTCP-MAX-RB-COUNT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-RB-COUNT:CAPS">
+<ANCHOR id="GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-MAX-SDES-ITEM-COUNT:CAPS">
+<ANCHOR id="GST-RTCP-VALID-MASK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-MASK:CAPS">
+<ANCHOR id="GST-RTCP-VALID-VALUE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-VALID-VALUE:CAPS">
+<ANCHOR id="GstRTCPType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPType">
+<ANCHOR id="GST-RTCP-TYPE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-INVALID:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-SR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-SR:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-RR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-RR:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-SDES:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-SDES:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-BYE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-BYE:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-APP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-APP:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-RTPFB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-RTPFB:CAPS">
+<ANCHOR id="GST-RTCP-TYPE-PSFB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-TYPE-PSFB:CAPS">
+<ANCHOR id="GstRTCPPacket" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPPacket">
+<ANCHOR id="GstRTCPSDESType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPSDESType">
+<ANCHOR id="GST-RTCP-SDES-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-INVALID:CAPS">
+<ANCHOR id="GST-RTCP-SDES-END:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-END:CAPS">
+<ANCHOR id="GST-RTCP-SDES-CNAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-CNAME:CAPS">
+<ANCHOR id="GST-RTCP-SDES-NAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-NAME:CAPS">
+<ANCHOR id="GST-RTCP-SDES-EMAIL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-EMAIL:CAPS">
+<ANCHOR id="GST-RTCP-SDES-PHONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-PHONE:CAPS">
+<ANCHOR id="GST-RTCP-SDES-LOC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-LOC:CAPS">
+<ANCHOR id="GST-RTCP-SDES-TOOL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-TOOL:CAPS">
+<ANCHOR id="GST-RTCP-SDES-NOTE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-NOTE:CAPS">
+<ANCHOR id="GST-RTCP-SDES-PRIV:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-SDES-PRIV:CAPS">
+<ANCHOR id="GstRTCPFBType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GstRTCPFBType">
+<ANCHOR id="GST-RTCP-FB-TYPE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-FB-TYPE-INVALID:CAPS">
+<ANCHOR id="GST-RTCP-RTPFB-TYPE-NACK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-RTPFB-TYPE-NACK:CAPS">
+<ANCHOR id="GST-RTCP-PSFB-TYPE-PLI:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-PLI:CAPS">
+<ANCHOR id="GST-RTCP-PSFB-TYPE-SLI:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-SLI:CAPS">
+<ANCHOR id="GST-RTCP-PSFB-TYPE-RPSI:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-RPSI:CAPS">
+<ANCHOR id="GST-RTCP-PSFB-TYPE-AFB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#GST-RTCP-PSFB-TYPE-AFB:CAPS">
+<ANCHOR id="gst-rtcp-buffer-new-take-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-take-data">
+<ANCHOR id="gst-rtcp-buffer-new-copy-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new-copy-data">
+<ANCHOR id="gst-rtcp-buffer-validate-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate-data">
+<ANCHOR id="gst-rtcp-buffer-validate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-validate">
+<ANCHOR id="gst-rtcp-buffer-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-new">
+<ANCHOR id="gst-rtcp-buffer-get-packet-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-packet-count">
+<ANCHOR id="gst-rtcp-buffer-get-first-packet" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-get-first-packet">
+<ANCHOR id="gst-rtcp-packet-move-to-next" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-move-to-next">
+<ANCHOR id="gst-rtcp-buffer-add-packet" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-buffer-add-packet">
+<ANCHOR id="gst-rtcp-packet-remove" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-remove">
+<ANCHOR id="gst-rtcp-packet-get-padding" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-padding">
+<ANCHOR id="gst-rtcp-packet-get-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-count">
+<ANCHOR id="gst-rtcp-packet-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-type">
+<ANCHOR id="gst-rtcp-packet-get-length" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-length">
+<ANCHOR id="gst-rtcp-packet-sr-get-sender-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-get-sender-info">
+<ANCHOR id="gst-rtcp-packet-sr-set-sender-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sr-set-sender-info">
+<ANCHOR id="gst-rtcp-packet-rr-get-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-get-ssrc">
+<ANCHOR id="gst-rtcp-packet-rr-set-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-rr-set-ssrc">
+<ANCHOR id="gst-rtcp-packet-get-rb-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb-count">
+<ANCHOR id="gst-rtcp-packet-get-rb" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-get-rb">
+<ANCHOR id="gst-rtcp-packet-add-rb" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-add-rb">
+<ANCHOR id="gst-rtcp-packet-set-rb" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-set-rb">
+<ANCHOR id="gst-rtcp-packet-sdes-get-item-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-item-count">
+<ANCHOR id="gst-rtcp-packet-sdes-first-item" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-item">
+<ANCHOR id="gst-rtcp-packet-sdes-next-item" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-item">
+<ANCHOR id="gst-rtcp-packet-sdes-get-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-ssrc">
+<ANCHOR id="gst-rtcp-packet-sdes-first-entry" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-first-entry">
+<ANCHOR id="gst-rtcp-packet-sdes-next-entry" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-next-entry">
+<ANCHOR id="gst-rtcp-packet-sdes-get-entry" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-get-entry">
+<ANCHOR id="gst-rtcp-packet-sdes-copy-entry" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-copy-entry">
+<ANCHOR id="gst-rtcp-packet-sdes-add-item" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-item">
+<ANCHOR id="gst-rtcp-packet-sdes-add-entry" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-sdes-add-entry">
+<ANCHOR id="gst-rtcp-packet-bye-get-ssrc-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-ssrc-count">
+<ANCHOR id="gst-rtcp-packet-bye-get-nth-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-nth-ssrc">
+<ANCHOR id="gst-rtcp-packet-bye-add-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrc">
+<ANCHOR id="gst-rtcp-packet-bye-add-ssrcs" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-add-ssrcs">
+<ANCHOR id="gst-rtcp-packet-bye-get-reason-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason-len">
+<ANCHOR id="gst-rtcp-packet-bye-get-reason" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-get-reason">
+<ANCHOR id="gst-rtcp-packet-bye-set-reason" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-bye-set-reason">
+<ANCHOR id="gst-rtcp-packet-fb-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-type">
+<ANCHOR id="gst-rtcp-packet-fb-set-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-type">
+<ANCHOR id="gst-rtcp-packet-fb-get-sender-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-sender-ssrc">
+<ANCHOR id="gst-rtcp-packet-fb-set-sender-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-sender-ssrc">
+<ANCHOR id="gst-rtcp-packet-fb-get-media-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-media-ssrc">
+<ANCHOR id="gst-rtcp-packet-fb-set-media-ssrc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-media-ssrc">
+<ANCHOR id="gst-rtcp-packet-fb-get-fci-length" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci-length">
+<ANCHOR id="gst-rtcp-packet-fb-set-fci-length" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-set-fci-length">
+<ANCHOR id="gst-rtcp-packet-fb-get-fci" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-packet-fb-get-fci">
+<ANCHOR id="gst-rtcp-ntp-to-unix" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-ntp-to-unix">
+<ANCHOR id="gst-rtcp-unix-to-ntp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-unix-to-ntp">
+<ANCHOR id="gst-rtcp-sdes-name-to-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-name-to-type">
+<ANCHOR id="gst-rtcp-sdes-type-to-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-rtcp-sdes-type-to-name">
+<ANCHOR id="gst-plugins-base-libs-gstrtcpbuffer.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtcpbuffer.html#gst-plugins-base-libs-gstrtcpbuffer.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtppayloads" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtppayloads.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-plugins-base-libs-gstrtppayloads.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtppayloads.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-plugins-base-libs-gstrtppayloads.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtppayloads.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-plugins-base-libs-gstrtppayloads.details">
+<ANCHOR id="GstRTPPayload" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayload">
+<ANCHOR id="GST-RTP-PAYLOAD-PCMU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-PCMU:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-1016:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-1016:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-G721:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G721:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-GSM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-GSM:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-G723:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G723:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-DVI4-8000:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-8000:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-DVI4-16000:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-16000:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-LPC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-LPC:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-PCMA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-PCMA:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-G722:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G722:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-L16-STEREO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-L16-STEREO:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-L16-MONO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-L16-MONO:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-QCELP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-QCELP:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-CN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-CN:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-MPA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MPA:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-G728:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G728:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-DVI4-11025:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-11025:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-DVI4-22050:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-DVI4-22050:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-G729:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-G729:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-CELLB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-CELLB:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-JPEG:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-JPEG:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-NV:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-NV:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-H261:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-H261:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-MPV:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MPV:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-MP2T:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-MP2T:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-H263:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-H263:CAPS">
+<ANCHOR id="GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GST-RTP-PAYLOAD-IS-DYNAMIC:CAPS">
+<ANCHOR id="GstRTPPayloadInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#GstRTPPayloadInfo">
+<ANCHOR id="gst-rtp-payload-info-for-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-name">
+<ANCHOR id="gst-rtp-payload-info-for-pt" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-rtp-payload-info-for-pt">
+<ANCHOR id="gst-plugins-base-libs-gstrtppayloads.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtppayloads.html#gst-plugins-base-libs-gstrtppayloads.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtspbase64" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspbase64.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html#gst-plugins-base-libs-gstrtspbase64.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspbase64.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html#gst-plugins-base-libs-gstrtspbase64.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspbase64.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html#gst-plugins-base-libs-gstrtspbase64.details">
+<ANCHOR id="gst-rtsp-base64-encode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-encode">
+<ANCHOR id="gst-rtsp-base64-decode-ip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspbase64.html#gst-rtsp-base64-decode-ip">
+<ANCHOR id="gst-plugins-base-libs-gstrtspconnection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspconnection.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-plugins-base-libs-gstrtspconnection.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspconnection.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-plugins-base-libs-gstrtspconnection.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspconnection.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-plugins-base-libs-gstrtspconnection.details">
+<ANCHOR id="GstRTSPConnection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#GstRTSPConnection">
+<ANCHOR id="gst-rtsp-connection-create" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create">
+<ANCHOR id="gst-rtsp-connection-create-from-fd" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-create-from-fd">
+<ANCHOR id="gst-rtsp-connection-accept" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-accept">
+<ANCHOR id="gst-rtsp-connection-connect" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-connect">
+<ANCHOR id="gst-rtsp-connection-close" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-close">
+<ANCHOR id="gst-rtsp-connection-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-free">
+<ANCHOR id="gst-rtsp-connection-read" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-read">
+<ANCHOR id="gst-rtsp-connection-write" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-write">
+<ANCHOR id="gst-rtsp-connection-poll" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-poll">
+<ANCHOR id="gst-rtsp-connection-send" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-send">
+<ANCHOR id="gst-rtsp-connection-receive" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-receive">
+<ANCHOR id="gst-rtsp-connection-next-timeout" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-next-timeout">
+<ANCHOR id="gst-rtsp-connection-reset-timeout" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-reset-timeout">
+<ANCHOR id="gst-rtsp-connection-flush" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-flush">
+<ANCHOR id="gst-rtsp-connection-set-auth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth">
+<ANCHOR id="gst-rtsp-connection-set-auth-param" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-auth-param">
+<ANCHOR id="gst-rtsp-connection-clear-auth-params" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-clear-auth-params">
+<ANCHOR id="gst-rtsp-connection-set-qos-dscp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-qos-dscp">
+<ANCHOR id="gst-rtsp-connection-set-ip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-ip">
+<ANCHOR id="gst-rtsp-connection-get-ip" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-ip">
+<ANCHOR id="gst-rtsp-connection-get-url" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-url">
+<ANCHOR id="gst-rtsp-connection-set-tunneled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-tunneled">
+<ANCHOR id="gst-rtsp-connection-is-tunneled" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-is-tunneled">
+<ANCHOR id="gst-rtsp-connection-get-tunnelid" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-tunnelid">
+<ANCHOR id="gst-rtsp-connection-do-tunnel" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-do-tunnel">
+<ANCHOR id="gst-rtsp-connection-get-readfd" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-readfd">
+<ANCHOR id="gst-rtsp-connection-get-writefd" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-get-writefd">
+<ANCHOR id="gst-rtsp-connection-set-http-mode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-http-mode">
+<ANCHOR id="gst-rtsp-connection-set-proxy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-connection-set-proxy">
+<ANCHOR id="GstRTSPWatch" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatch">
+<ANCHOR id="GstRTSPWatchFuncs" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#GstRTSPWatchFuncs">
+<ANCHOR id="gst-rtsp-watch-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-new">
+<ANCHOR id="gst-rtsp-watch-unref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-unref">
+<ANCHOR id="gst-rtsp-watch-attach" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-attach">
+<ANCHOR id="gst-rtsp-watch-reset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-reset">
+<ANCHOR id="gst-rtsp-watch-queue-message" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-message">
+<ANCHOR id="gst-rtsp-watch-queue-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-queue-data">
+<ANCHOR id="gst-rtsp-watch-send-message" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-send-message">
+<ANCHOR id="gst-rtsp-watch-write-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-rtsp-watch-write-data">
+<ANCHOR id="gst-plugins-base-libs-gstrtspconnection.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspconnection.html#gst-plugins-base-libs-gstrtspconnection.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtspdefs" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspdefs.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-plugins-base-libs-gstrtspdefs.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspdefs.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-plugins-base-libs-gstrtspdefs.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspdefs.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-plugins-base-libs-gstrtspdefs.details">
+<ANCHOR id="GST-RTSP-CHECK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-CHECK:CAPS">
+<ANCHOR id="GST-RTSP-AUTH-MAX:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-MAX:CAPS">
+<ANCHOR id="GstRTSPEvent" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPEvent">
+<ANCHOR id="GST-RTSP-EV-READ:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EV-READ:CAPS">
+<ANCHOR id="GST-RTSP-EV-WRITE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EV-WRITE:CAPS">
+<ANCHOR id="GstRTSPResult" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPResult">
+<ANCHOR id="GST-RTSP-OK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OK:CAPS">
+<ANCHOR id="GST-RTSP-ERROR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ERROR:CAPS">
+<ANCHOR id="GST-RTSP-EINVAL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EINVAL:CAPS">
+<ANCHOR id="GST-RTSP-EINTR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EINTR:CAPS">
+<ANCHOR id="GST-RTSP-ENOMEM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOMEM:CAPS">
+<ANCHOR id="GST-RTSP-ERESOLV:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ERESOLV:CAPS">
+<ANCHOR id="GST-RTSP-ENOTIMPL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOTIMPL:CAPS">
+<ANCHOR id="GST-RTSP-ESYS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ESYS:CAPS">
+<ANCHOR id="GST-RTSP-EPARSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EPARSE:CAPS">
+<ANCHOR id="GST-RTSP-EWSASTART:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EWSASTART:CAPS">
+<ANCHOR id="GST-RTSP-EWSAVERSION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EWSAVERSION:CAPS">
+<ANCHOR id="GST-RTSP-EEOF:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-EEOF:CAPS">
+<ANCHOR id="GST-RTSP-ENET:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENET:CAPS">
+<ANCHOR id="GST-RTSP-ENOTIP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ENOTIP:CAPS">
+<ANCHOR id="GST-RTSP-ETIMEOUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETIMEOUT:CAPS">
+<ANCHOR id="GST-RTSP-ETGET:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETGET:CAPS">
+<ANCHOR id="GST-RTSP-ETPOST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ETPOST:CAPS">
+<ANCHOR id="GST-RTSP-ELAST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ELAST:CAPS">
+<ANCHOR id="GstRTSPFamily" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPFamily">
+<ANCHOR id="GST-RTSP-FAM-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-NONE:CAPS">
+<ANCHOR id="GST-RTSP-FAM-INET:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-INET:CAPS">
+<ANCHOR id="GST-RTSP-FAM-INET6:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-FAM-INET6:CAPS">
+<ANCHOR id="GstRTSPState" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPState">
+<ANCHOR id="GST-RTSP-STATE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-INVALID:CAPS">
+<ANCHOR id="GST-RTSP-STATE-INIT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-INIT:CAPS">
+<ANCHOR id="GST-RTSP-STATE-READY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-READY:CAPS">
+<ANCHOR id="GST-RTSP-STATE-SEEKING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-SEEKING:CAPS">
+<ANCHOR id="GST-RTSP-STATE-PLAYING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-PLAYING:CAPS">
+<ANCHOR id="GST-RTSP-STATE-RECORDING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-STATE-RECORDING:CAPS">
+<ANCHOR id="GstRTSPVersion" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPVersion">
+<ANCHOR id="GST-RTSP-VERSION-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-INVALID:CAPS">
+<ANCHOR id="GST-RTSP-VERSION-1-0:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-1-0:CAPS">
+<ANCHOR id="GST-RTSP-VERSION-1-1:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-VERSION-1-1:CAPS">
+<ANCHOR id="GstRTSPMethod" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPMethod">
+<ANCHOR id="GST-RTSP-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-INVALID:CAPS">
+<ANCHOR id="GST-RTSP-DESCRIBE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-DESCRIBE:CAPS">
+<ANCHOR id="GST-RTSP-ANNOUNCE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-ANNOUNCE:CAPS">
+<ANCHOR id="GST-RTSP-GET-PARAMETER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-GET-PARAMETER:CAPS">
+<ANCHOR id="GST-RTSP-OPTIONS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-OPTIONS:CAPS">
+<ANCHOR id="GST-RTSP-PAUSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-PAUSE:CAPS">
+<ANCHOR id="GST-RTSP-PLAY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-PLAY:CAPS">
+<ANCHOR id="GST-RTSP-RECORD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-RECORD:CAPS">
+<ANCHOR id="GST-RTSP-REDIRECT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-REDIRECT:CAPS">
+<ANCHOR id="GST-RTSP-SETUP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-SETUP:CAPS">
+<ANCHOR id="GST-RTSP-SET-PARAMETER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-SET-PARAMETER:CAPS">
+<ANCHOR id="GST-RTSP-TEARDOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-TEARDOWN:CAPS">
+<ANCHOR id="GST-RTSP-GET:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-GET:CAPS">
+<ANCHOR id="GST-RTSP-POST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-POST:CAPS">
+<ANCHOR id="GstRTSPAuthMethod" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPAuthMethod">
+<ANCHOR id="GST-RTSP-AUTH-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-NONE:CAPS">
+<ANCHOR id="GST-RTSP-AUTH-BASIC:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-BASIC:CAPS">
+<ANCHOR id="GST-RTSP-AUTH-DIGEST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GST-RTSP-AUTH-DIGEST:CAPS">
+<ANCHOR id="GstRTSPHeaderField" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPHeaderField">
+<ANCHOR id="GstRTSPStatusCode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#GstRTSPStatusCode">
+<ANCHOR id="gst-rtsp-strresult" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-strresult">
+<ANCHOR id="gst-rtsp-method-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-method-as-text">
+<ANCHOR id="gst-rtsp-version-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-version-as-text">
+<ANCHOR id="gst-rtsp-header-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-as-text">
+<ANCHOR id="gst-rtsp-header-allow-multiple" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-header-allow-multiple">
+<ANCHOR id="gst-rtsp-status-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-status-as-text">
+<ANCHOR id="gst-rtsp-options-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-options-as-text">
+<ANCHOR id="gst-rtsp-find-header-field" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-header-field">
+<ANCHOR id="gst-rtsp-find-method" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-rtsp-find-method">
+<ANCHOR id="gst-plugins-base-libs-gstrtspdefs.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspdefs.html#gst-plugins-base-libs-gstrtspdefs.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtspextension" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspextension.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html#gst-plugins-base-libs-gstrtspextension.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspextension.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html#gst-plugins-base-libs-gstrtspextension.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspextension.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html#gst-plugins-base-libs-gstrtspextension.details">
+<ANCHOR id="GstRTSPExtension" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtension">
+<ANCHOR id="GstRTSPExtensionInterface" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspextension.html#GstRTSPExtensionInterface">
+<ANCHOR id="gst-plugins-base-libs-gstrtspmessage" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspmessage.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-plugins-base-libs-gstrtspmessage.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspmessage.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-plugins-base-libs-gstrtspmessage.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspmessage.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-plugins-base-libs-gstrtspmessage.details">
+<ANCHOR id="GstRTSPMsgType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMsgType">
+<ANCHOR id="GST-RTSP-MESSAGE-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-INVALID:CAPS">
+<ANCHOR id="GST-RTSP-MESSAGE-REQUEST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-REQUEST:CAPS">
+<ANCHOR id="GST-RTSP-MESSAGE-RESPONSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-RESPONSE:CAPS">
+<ANCHOR id="GST-RTSP-MESSAGE-HTTP-REQUEST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-HTTP-REQUEST:CAPS">
+<ANCHOR id="GST-RTSP-MESSAGE-HTTP-RESPONSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-HTTP-RESPONSE:CAPS">
+<ANCHOR id="GST-RTSP-MESSAGE-DATA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GST-RTSP-MESSAGE-DATA:CAPS">
+<ANCHOR id="GstRTSPMessage" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#GstRTSPMessage">
+<ANCHOR id="gst-rtsp-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new">
+<ANCHOR id="gst-rtsp-message-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init">
+<ANCHOR id="gst-rtsp-message-unset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-unset">
+<ANCHOR id="gst-rtsp-message-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-free">
+<ANCHOR id="gst-rtsp-message-get-type" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-type">
+<ANCHOR id="gst-rtsp-message-new-request" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-request">
+<ANCHOR id="gst-rtsp-message-init-request" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-request">
+<ANCHOR id="gst-rtsp-message-parse-request" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-request">
+<ANCHOR id="gst-rtsp-message-new-response" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-response">
+<ANCHOR id="gst-rtsp-message-init-response" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-response">
+<ANCHOR id="gst-rtsp-message-parse-response" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-response">
+<ANCHOR id="gst-rtsp-message-new-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-new-data">
+<ANCHOR id="gst-rtsp-message-init-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-init-data">
+<ANCHOR id="gst-rtsp-message-parse-data" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-parse-data">
+<ANCHOR id="gst-rtsp-message-add-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-add-header">
+<ANCHOR id="gst-rtsp-message-take-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-header">
+<ANCHOR id="gst-rtsp-message-remove-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-remove-header">
+<ANCHOR id="gst-rtsp-message-get-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-header">
+<ANCHOR id="gst-rtsp-message-append-headers" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-append-headers">
+<ANCHOR id="gst-rtsp-message-set-body" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-set-body">
+<ANCHOR id="gst-rtsp-message-take-body" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-take-body">
+<ANCHOR id="gst-rtsp-message-get-body" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-get-body">
+<ANCHOR id="gst-rtsp-message-steal-body" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-steal-body">
+<ANCHOR id="gst-rtsp-message-dump" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-rtsp-message-dump">
+<ANCHOR id="gst-plugins-base-libs-gstrtspmessage.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspmessage.html#gst-plugins-base-libs-gstrtspmessage.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstrtsprange" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtsprange.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-plugins-base-libs-gstrtsprange.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtsprange.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-plugins-base-libs-gstrtsprange.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtsprange.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-plugins-base-libs-gstrtsprange.details">
+<ANCHOR id="GstRTSPRangeUnit" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GstRTSPRangeUnit">
+<ANCHOR id="GST-RTSP-RANGE-SMPTE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE:CAPS">
+<ANCHOR id="GST-RTSP-RANGE-SMPTE-30-DROP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE-30-DROP:CAPS">
+<ANCHOR id="GST-RTSP-RANGE-SMPTE-25:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-SMPTE-25:CAPS">
+<ANCHOR id="GST-RTSP-RANGE-NPT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-NPT:CAPS">
+<ANCHOR id="GST-RTSP-RANGE-CLOCK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-RANGE-CLOCK:CAPS">
+<ANCHOR id="GstRTSPTimeRange" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeRange">
+<ANCHOR id="GstRTSPTime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GstRTSPTime">
+<ANCHOR id="GstRTSPTimeType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GstRTSPTimeType">
+<ANCHOR id="GST-RTSP-TIME-SECONDS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-SECONDS:CAPS">
+<ANCHOR id="GST-RTSP-TIME-NOW:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-NOW:CAPS">
+<ANCHOR id="GST-RTSP-TIME-END:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#GST-RTSP-TIME-END:CAPS">
+<ANCHOR id="gst-rtsp-range-parse" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-parse">
+<ANCHOR id="gst-rtsp-range-to-string" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-to-string">
+<ANCHOR id="gst-rtsp-range-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsprange.html#gst-rtsp-range-free">
+<ANCHOR id="gst-plugins-base-libs-gstrtsptransport" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtsptransport.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-plugins-base-libs-gstrtsptransport.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtsptransport.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-plugins-base-libs-gstrtsptransport.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtsptransport.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-plugins-base-libs-gstrtsptransport.details">
+<ANCHOR id="GstRTSPTransMode" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransMode">
+<ANCHOR id="GST-RTSP-TRANS-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-UNKNOWN:CAPS">
+<ANCHOR id="GST-RTSP-TRANS-RTP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-RTP:CAPS">
+<ANCHOR id="GST-RTSP-TRANS-RDT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-TRANS-RDT:CAPS">
+<ANCHOR id="GstRTSPProfile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GstRTSPProfile">
+<ANCHOR id="GST-RTSP-PROFILE-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-UNKNOWN:CAPS">
+<ANCHOR id="GST-RTSP-PROFILE-AVP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-AVP:CAPS">
+<ANCHOR id="GST-RTSP-PROFILE-SAVP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-PROFILE-SAVP:CAPS">
+<ANCHOR id="GstRTSPRange" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GstRTSPRange">
+<ANCHOR id="GstRTSPLowerTrans" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GstRTSPLowerTrans">
+<ANCHOR id="GST-RTSP-LOWER-TRANS-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UNKNOWN:CAPS">
+<ANCHOR id="GST-RTSP-LOWER-TRANS-UDP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UDP:CAPS">
+<ANCHOR id="GST-RTSP-LOWER-TRANS-UDP-MCAST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-UDP-MCAST:CAPS">
+<ANCHOR id="GST-RTSP-LOWER-TRANS-TCP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-TCP:CAPS">
+<ANCHOR id="GST-RTSP-LOWER-TRANS-HTTP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GST-RTSP-LOWER-TRANS-HTTP:CAPS">
+<ANCHOR id="GstRTSPTransport" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#GstRTSPTransport">
+<ANCHOR id="gst-rtsp-transport-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-new">
+<ANCHOR id="gst-rtsp-transport-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-init">
+<ANCHOR id="gst-rtsp-transport-parse" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-parse">
+<ANCHOR id="gst-rtsp-transport-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-as-text">
+<ANCHOR id="gst-rtsp-transport-get-mime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-mime">
+<ANCHOR id="gst-rtsp-transport-get-manager" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-get-manager">
+<ANCHOR id="gst-rtsp-transport-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtsptransport.html#gst-rtsp-transport-free">
+<ANCHOR id="gst-plugins-base-libs-gstrtspurl" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html">
+<ANCHOR id="gst-plugins-base-libs-gstrtspurl.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-plugins-base-libs-gstrtspurl.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstrtspurl.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-plugins-base-libs-gstrtspurl.description">
+<ANCHOR id="gst-plugins-base-libs-gstrtspurl.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-plugins-base-libs-gstrtspurl.details">
+<ANCHOR id="GST-RTSP-DEFAULT-PORT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#GST-RTSP-DEFAULT-PORT:CAPS">
+<ANCHOR id="GstRTSPUrl" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#GstRTSPUrl">
+<ANCHOR id="gst-rtsp-url-parse" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-parse">
+<ANCHOR id="gst-rtsp-url-copy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-copy">
+<ANCHOR id="gst-rtsp-url-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-free">
+<ANCHOR id="gst-rtsp-url-get-request-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-request-uri">
+<ANCHOR id="gst-rtsp-url-set-port" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-set-port">
+<ANCHOR id="gst-rtsp-url-get-port" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-get-port">
+<ANCHOR id="gst-rtsp-url-decode-path-components" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstrtspurl.html#gst-rtsp-url-decode-path-components">
+<ANCHOR id="gst-plugins-base-libs-gstsdpmessage" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html">
+<ANCHOR id="gst-plugins-base-libs-gstsdpmessage.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-plugins-base-libs-gstsdpmessage.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstsdpmessage.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-plugins-base-libs-gstsdpmessage.description">
+<ANCHOR id="gst-plugins-base-libs-gstsdpmessage.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-plugins-base-libs-gstsdpmessage.details">
+<ANCHOR id="GstSDPResult" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPResult">
+<ANCHOR id="GST-SDP-OK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-OK:CAPS">
+<ANCHOR id="GST-SDP-EINVAL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-EINVAL:CAPS">
+<ANCHOR id="GstSDPOrigin" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPOrigin">
+<ANCHOR id="GstSDPConnection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPConnection">
+<ANCHOR id="GST-SDP-BWTYPE-CT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-CT:CAPS">
+<ANCHOR id="GST-SDP-BWTYPE-AS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-AS:CAPS">
+<ANCHOR id="GST-SDP-BWTYPE-EXT-PREFIX:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-EXT-PREFIX:CAPS">
+<ANCHOR id="GST-SDP-BWTYPE-RR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RR:CAPS">
+<ANCHOR id="GST-SDP-BWTYPE-RS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-RS:CAPS">
+<ANCHOR id="GST-SDP-BWTYPE-TIAS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GST-SDP-BWTYPE-TIAS:CAPS">
+<ANCHOR id="GstSDPBandwidth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPBandwidth">
+<ANCHOR id="GstSDPTime" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPTime">
+<ANCHOR id="GstSDPZone" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPZone">
+<ANCHOR id="GstSDPKey" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPKey">
+<ANCHOR id="GstSDPAttribute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPAttribute">
+<ANCHOR id="GstSDPMedia" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPMedia">
+<ANCHOR id="GstSDPMessage" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#GstSDPMessage">
+<ANCHOR id="gst-sdp-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-new">
+<ANCHOR id="gst-sdp-message-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-init">
+<ANCHOR id="gst-sdp-message-uninit" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-uninit">
+<ANCHOR id="gst-sdp-message-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-free">
+<ANCHOR id="gst-sdp-message-parse-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-buffer">
+<ANCHOR id="gst-sdp-message-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-text">
+<ANCHOR id="gst-sdp-message-parse-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-parse-uri">
+<ANCHOR id="gst-sdp-message-as-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-as-uri">
+<ANCHOR id="gst-sdp-address-is-multicast" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-address-is-multicast">
+<ANCHOR id="gst-sdp-message-get-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-version">
+<ANCHOR id="gst-sdp-message-set-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-version">
+<ANCHOR id="gst-sdp-message-get-origin" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-origin">
+<ANCHOR id="gst-sdp-message-set-origin" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-origin">
+<ANCHOR id="gst-sdp-message-get-session-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-session-name">
+<ANCHOR id="gst-sdp-message-set-session-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-session-name">
+<ANCHOR id="gst-sdp-message-get-information" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-information">
+<ANCHOR id="gst-sdp-message-set-information" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-information">
+<ANCHOR id="gst-sdp-message-get-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-uri">
+<ANCHOR id="gst-sdp-message-set-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-uri">
+<ANCHOR id="gst-sdp-message-emails-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-emails-len">
+<ANCHOR id="gst-sdp-message-get-email" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-email">
+<ANCHOR id="gst-sdp-message-add-email" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-email">
+<ANCHOR id="gst-sdp-message-phones-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-phones-len">
+<ANCHOR id="gst-sdp-message-get-phone" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-phone">
+<ANCHOR id="gst-sdp-message-add-phone" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-phone">
+<ANCHOR id="gst-sdp-message-get-connection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-connection">
+<ANCHOR id="gst-sdp-message-set-connection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-connection">
+<ANCHOR id="gst-sdp-message-bandwidths-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-bandwidths-len">
+<ANCHOR id="gst-sdp-message-get-bandwidth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-bandwidth">
+<ANCHOR id="gst-sdp-message-add-bandwidth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-bandwidth">
+<ANCHOR id="gst-sdp-message-times-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-times-len">
+<ANCHOR id="gst-sdp-message-get-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-time">
+<ANCHOR id="gst-sdp-message-add-time" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-time">
+<ANCHOR id="gst-sdp-message-zones-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-zones-len">
+<ANCHOR id="gst-sdp-message-get-zone" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-zone">
+<ANCHOR id="gst-sdp-message-add-zone" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-zone">
+<ANCHOR id="gst-sdp-message-get-key" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-key">
+<ANCHOR id="gst-sdp-message-set-key" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-set-key">
+<ANCHOR id="gst-sdp-message-attributes-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-attributes-len">
+<ANCHOR id="gst-sdp-message-get-attribute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute">
+<ANCHOR id="gst-sdp-message-get-attribute-val" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val">
+<ANCHOR id="gst-sdp-message-get-attribute-val-n" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-attribute-val-n">
+<ANCHOR id="gst-sdp-message-add-attribute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-attribute">
+<ANCHOR id="gst-sdp-message-medias-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-medias-len">
+<ANCHOR id="gst-sdp-message-get-media" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-get-media">
+<ANCHOR id="gst-sdp-message-add-media" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-add-media">
+<ANCHOR id="gst-sdp-message-dump" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-message-dump">
+<ANCHOR id="gst-sdp-media-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-new">
+<ANCHOR id="gst-sdp-media-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-init">
+<ANCHOR id="gst-sdp-media-uninit" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-uninit">
+<ANCHOR id="gst-sdp-media-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-free">
+<ANCHOR id="gst-sdp-media-get-media" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-media">
+<ANCHOR id="gst-sdp-media-set-media" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-media">
+<ANCHOR id="gst-sdp-media-get-port" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-port">
+<ANCHOR id="gst-sdp-media-get-num-ports" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-num-ports">
+<ANCHOR id="gst-sdp-media-set-port-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-port-info">
+<ANCHOR id="gst-sdp-media-get-proto" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-proto">
+<ANCHOR id="gst-sdp-media-set-proto" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-proto">
+<ANCHOR id="gst-sdp-media-formats-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-formats-len">
+<ANCHOR id="gst-sdp-media-get-format" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-format">
+<ANCHOR id="gst-sdp-media-add-format" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-format">
+<ANCHOR id="gst-sdp-media-get-information" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-information">
+<ANCHOR id="gst-sdp-media-set-information" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-information">
+<ANCHOR id="gst-sdp-media-connections-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-connections-len">
+<ANCHOR id="gst-sdp-media-get-connection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-connection">
+<ANCHOR id="gst-sdp-media-add-connection" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-connection">
+<ANCHOR id="gst-sdp-media-bandwidths-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-bandwidths-len">
+<ANCHOR id="gst-sdp-media-get-bandwidth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-bandwidth">
+<ANCHOR id="gst-sdp-media-add-bandwidth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-bandwidth">
+<ANCHOR id="gst-sdp-media-get-key" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-key">
+<ANCHOR id="gst-sdp-media-set-key" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-set-key">
+<ANCHOR id="gst-sdp-media-attributes-len" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-attributes-len">
+<ANCHOR id="gst-sdp-media-get-attribute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute">
+<ANCHOR id="gst-sdp-media-get-attribute-val" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val">
+<ANCHOR id="gst-sdp-media-get-attribute-val-n" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-get-attribute-val-n">
+<ANCHOR id="gst-sdp-media-add-attribute" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-add-attribute">
+<ANCHOR id="gst-sdp-media-as-text" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstsdpmessage.html#gst-sdp-media-as-text">
+<ANCHOR id="gst-plugins-base-libs-gsttag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html">
+<ANCHOR id="gst-plugins-base-libs-gsttag.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-plugins-base-libs-gsttag.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttag.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-plugins-base-libs-gsttag.description">
+<ANCHOR id="gst-plugins-base-libs-gsttag.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-plugins-base-libs-gsttag.details">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-TRACKID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRACKID:CAPS">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-ARTISTID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ARTISTID:CAPS">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-ALBUMID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMID:CAPS">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-ALBUMARTISTID:CAPS">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-TRMID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-TRMID:CAPS">
+<ANCHOR id="GST-TAG-MUSICBRAINZ-SORTNAME:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-MUSICBRAINZ-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-CDDA-CDDB-DISCID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID:CAPS">
+<ANCHOR id="GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-CDDB-DISCID-FULL:CAPS">
+<ANCHOR id="GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID:CAPS">
+<ANCHOR id="GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-MUSICBRAINZ-DISCID-FULL:CAPS">
+<ANCHOR id="GST-TAG-CDDA-TRACK-TAGS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CDDA-TRACK-TAGS:CAPS">
+<ANCHOR id="GST-TAG-CMML-CLIP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-CLIP:CAPS">
+<ANCHOR id="GST-TAG-CMML-HEAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-HEAD:CAPS">
+<ANCHOR id="GST-TAG-CMML-STREAM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CMML-STREAM:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHUTTER-SPEED:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-FOCAL-RATIO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-RATIO:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FOCAL-LENGTH:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-DIGITAL-ZOOM-RATIO:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-ISO-SPEED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-ISO-SPEED:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-PROGRAM:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-MODE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SCENE-CAPTURE-TYPE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-GAIN-ADJUSTMENT:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-WHITE-BALANCE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-WHITE-BALANCE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-CONTRAST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-CONTRAST:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-SATURATION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SATURATION:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-SHARPNESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SHARPNESS:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-FLASH-FIRED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-FIRED:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-FLASH-MODE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-FLASH-MODE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-METERING-MODE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-METERING-MODE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-SOURCE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-SOURCE:CAPS">
+<ANCHOR id="GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-CAPTURING-EXPOSURE-COMPENSATION:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-HORIZONTAL-PPI:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-VERTICAL-PPI:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-VERTICAL-PPI:CAPS">
+<ANCHOR id="GST-TAG-ID3V2-HEADER-SIZE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-ID3V2-HEADER-SIZE:CAPS">
+<ANCHOR id="gst-tag-register-musicbrainz-tags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-tag-register-musicbrainz-tags">
+<ANCHOR id="gst-tag-freeform-string-to-utf8" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-tag-freeform-string-to-utf8">
+<ANCHOR id="gst-tag-parse-extended-comment" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-tag-parse-extended-comment">
+<ANCHOR id="gst-tag-image-data-to-image-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-tag-image-data-to-image-buffer">
+<ANCHOR id="GstTagImageType" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GstTagImageType">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-NONE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-NONE:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-UNDEFINED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-UNDEFINED:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-FRONT-COVER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-FRONT-COVER:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-BACK-COVER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BACK-COVER:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-LEAFLET-PAGE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LEAFLET-PAGE:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-MEDIUM:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-MEDIUM:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-LEAD-ARTIST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LEAD-ARTIST:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-ARTIST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-ARTIST:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-CONDUCTOR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-CONDUCTOR:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-BAND-ORCHESTRA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BAND-ORCHESTRA:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-COMPOSER:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-COMPOSER:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-LYRICIST:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-LYRICIST:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-RECORDING-LOCATION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-RECORDING-LOCATION:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-DURING-RECORDING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-DURING-RECORDING:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-DURING-PERFORMANCE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-DURING-PERFORMANCE:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-VIDEO-CAPTURE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-VIDEO-CAPTURE:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-FISH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-FISH:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-ILLUSTRATION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-ILLUSTRATION:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-BAND-ARTIST-LOGO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-BAND-ARTIST-LOGO:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-TYPE-PUBLISHER-STUDIO-LOGO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#GST-TAG-IMAGE-TYPE-PUBLISHER-STUDIO-LOGO:CAPS">
+<ANCHOR id="gst-plugins-base-libs-gsttag.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttag.html#gst-plugins-base-libs-gsttag.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagvorbis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagvorbis.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-plugins-base-libs-gsttagvorbis.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagvorbis.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-plugins-base-libs-gsttagvorbis.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagvorbis.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-plugins-base-libs-gsttagvorbis.details">
+<ANCHOR id="gst-tag-from-vorbis-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-tag-from-vorbis-tag">
+<ANCHOR id="gst-tag-to-vorbis-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-tag">
+<ANCHOR id="gst-vorbis-tag-add" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-vorbis-tag-add">
+<ANCHOR id="gst-tag-to-vorbis-comments" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-tag-to-vorbis-comments">
+<ANCHOR id="gst-tag-list-from-vorbiscomment-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-from-vorbiscomment-buffer">
+<ANCHOR id="gst-tag-list-to-vorbiscomment-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-tag-list-to-vorbiscomment-buffer">
+<ANCHOR id="gst-plugins-base-libs-gsttagvorbis.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagvorbis.html#gst-plugins-base-libs-gsttagvorbis.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagid3" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagid3.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-plugins-base-libs-gsttagid3.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagid3.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-plugins-base-libs-gsttagid3.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagid3.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-plugins-base-libs-gsttagid3.details">
+<ANCHOR id="gst-tag-id3-genre-count" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-count">
+<ANCHOR id="gst-tag-id3-genre-get" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-id3-genre-get">
+<ANCHOR id="gst-tag-list-new-from-id3v1" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-list-new-from-id3v1">
+<ANCHOR id="gst-tag-from-id3-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-tag">
+<ANCHOR id="gst-tag-from-id3-user-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-from-id3-user-tag">
+<ANCHOR id="gst-tag-to-id3-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-to-id3-tag">
+<ANCHOR id="gst-tag-list-add-id3-image" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-list-add-id3-image">
+<ANCHOR id="gst-tag-get-id3v2-tag-size" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-get-id3v2-tag-size">
+<ANCHOR id="gst-tag-list-from-id3v2-tag" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-tag-list-from-id3v2-tag">
+<ANCHOR id="gst-plugins-base-libs-gsttagid3.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagid3.html#gst-plugins-base-libs-gsttagid3.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagexif" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagexif.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-plugins-base-libs-gsttagexif.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagexif.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-plugins-base-libs-gsttagexif.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagexif.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-plugins-base-libs-gsttagexif.details">
+<ANCHOR id="gst-tag-list-to-exif-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer">
+<ANCHOR id="gst-tag-list-to-exif-buffer-with-tiff-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-tag-list-to-exif-buffer-with-tiff-header">
+<ANCHOR id="gst-tag-list-from-exif-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer">
+<ANCHOR id="gst-tag-list-from-exif-buffer-with-tiff-header" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-tag-list-from-exif-buffer-with-tiff-header">
+<ANCHOR id="gst-plugins-base-libs-gsttagexif.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagexif.html#gst-plugins-base-libs-gsttagexif.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmp" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmp.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-plugins-base-libs-gsttagxmp.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmp.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-plugins-base-libs-gsttagxmp.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmp.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-plugins-base-libs-gsttagxmp.details">
+<ANCHOR id="gst-tag-list-from-xmp-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-from-xmp-buffer">
+<ANCHOR id="gst-tag-list-to-xmp-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer">
+<ANCHOR id="gst-tag-list-to-xmp-buffer-full" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-tag-list-to-xmp-buffer-full">
+<ANCHOR id="gst-tag-xmp-list-schemas" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-tag-xmp-list-schemas">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmp.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmp.html#gst-plugins-base-libs-gsttagxmp.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmpwriter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmpwriter.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-plugins-base-libs-gsttagxmpwriter.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmpwriter.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-plugins-base-libs-gsttagxmpwriter.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagxmpwriter.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-plugins-base-libs-gsttagxmpwriter.details">
+<ANCHOR id="gst-tag-xmp-writer-add-all-schemas" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-all-schemas">
+<ANCHOR id="gst-tag-xmp-writer-add-schema" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-add-schema">
+<ANCHOR id="gst-tag-xmp-writer-has-schema" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-has-schema">
+<ANCHOR id="gst-tag-xmp-writer-remove-schema" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-schema">
+<ANCHOR id="gst-tag-xmp-writer-remove-all-schemas" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-remove-all-schemas">
+<ANCHOR id="gst-tag-xmp-writer-tag-list-to-xmp-buffer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagxmpwriter.html#gst-tag-xmp-writer-tag-list-to-xmp-buffer">
+<ANCHOR id="gst-plugins-base-libs-gsttagdemux" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagdemux.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#gst-plugins-base-libs-gsttagdemux.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagdemux.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#gst-plugins-base-libs-gsttagdemux.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagdemux.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#gst-plugins-base-libs-gsttagdemux.details">
+<ANCHOR id="GstTagDemux" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GstTagDemux">
+<ANCHOR id="GstTagDemuxClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxClass">
+<ANCHOR id="GstTagDemuxResult" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GstTagDemuxResult">
+<ANCHOR id="GST-TAG-DEMUX-RESULT-BROKEN-TAG:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-BROKEN-TAG:CAPS">
+<ANCHOR id="GST-TAG-DEMUX-RESULT-AGAIN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-AGAIN:CAPS">
+<ANCHOR id="GST-TAG-DEMUX-RESULT-OK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#GST-TAG-DEMUX-RESULT-OK:CAPS">
+<ANCHOR id="gst-plugins-base-libs-gsttagdemux.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagdemux.html#gst-plugins-base-libs-gsttagdemux.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttagmux" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html">
+<ANCHOR id="gst-plugins-base-libs-gsttagmux.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#gst-plugins-base-libs-gsttagmux.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttagmux.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#gst-plugins-base-libs-gsttagmux.description">
+<ANCHOR id="gst-plugins-base-libs-gsttagmux.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#gst-plugins-base-libs-gsttagmux.details">
+<ANCHOR id="GstTagMux" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#GstTagMux">
+<ANCHOR id="GstTagMuxClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#GstTagMuxClass">
+<ANCHOR id="gst-plugins-base-libs-gsttagmux.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttagmux.html#gst-plugins-base-libs-gsttagmux.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttaglanguagecodes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html">
+<ANCHOR id="gst-plugins-base-libs-gsttaglanguagecodes.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-plugins-base-libs-gsttaglanguagecodes.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttaglanguagecodes.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-plugins-base-libs-gsttaglanguagecodes.description">
+<ANCHOR id="gst-plugins-base-libs-gsttaglanguagecodes.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-plugins-base-libs-gsttaglanguagecodes.details">
+<ANCHOR id="gst-tag-get-language-codes" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-codes">
+<ANCHOR id="gst-tag-get-language-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-name">
+<ANCHOR id="gst-tag-get-language-code" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code">
+<ANCHOR id="gst-tag-get-language-code-iso-639-1" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-1">
+<ANCHOR id="gst-tag-get-language-code-iso-639-2B" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2B">
+<ANCHOR id="gst-tag-get-language-code-iso-639-2T" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-tag-get-language-code-iso-639-2T">
+<ANCHOR id="gst-plugins-base-libs-gsttaglanguagecodes.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglanguagecodes.html#gst-plugins-base-libs-gsttaglanguagecodes.see-also">
+<ANCHOR id="gst-plugins-base-libs-gsttaglicenses" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html">
+<ANCHOR id="gst-plugins-base-libs-gsttaglicenses.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-plugins-base-libs-gsttaglicenses.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gsttaglicenses.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-plugins-base-libs-gsttaglicenses.description">
+<ANCHOR id="gst-plugins-base-libs-gsttaglicenses.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-plugins-base-libs-gsttaglicenses.details">
+<ANCHOR id="GstTagLicenseFlags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GstTagLicenseFlags">
+<ANCHOR id="GST-TAG-LICENSE-PERMITS-REPRODUCTION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-REPRODUCTION:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-PERMITS-DISTRIBUTION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-DISTRIBUTION:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-PERMITS-DERIVATIVE-WORKS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-DERIVATIVE-WORKS:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-PERMITS-SHARING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PERMITS-SHARING:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-NOTICE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-NOTICE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-ATTRIBUTION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-ATTRIBUTION:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-SHARE-ALIKE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-SHARE-ALIKE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-SOURCE-CODE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-SOURCE-CODE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-COPYLEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-COPYLEFT:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-REQUIRES-LESSER-COPYLEFT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-REQUIRES-LESSER-COPYLEFT:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-PROHIBITS-COMMERCIAL-USE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PROHIBITS-COMMERCIAL-USE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-PROHIBITS-HIGH-INCOME-NATION-USE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-PROHIBITS-HIGH-INCOME-NATION-USE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-CREATIVE-COMMONS-LICENSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-CREATIVE-COMMONS-LICENSE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-FREE-SOFTWARE-FOUNDATION-LICENSE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#GST-TAG-LICENSE-FREE-SOFTWARE-FOUNDATION-LICENSE:CAPS">
+<ANCHOR id="gst-tag-get-license-flags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-flags">
+<ANCHOR id="gst-tag-get-license-nick" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-nick">
+<ANCHOR id="gst-tag-get-license-title" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-title">
+<ANCHOR id="gst-tag-get-license-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-description">
+<ANCHOR id="gst-tag-get-license-jurisdiction" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-jurisdiction">
+<ANCHOR id="gst-tag-get-license-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-license-version">
+<ANCHOR id="gst-tag-get-licenses" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-tag-get-licenses">
+<ANCHOR id="gst-plugins-base-libs-gsttaglicenses.see-also" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gsttaglicenses.html#gst-plugins-base-libs-gsttaglicenses.see-also">
+<ANCHOR id="gst-plugins-base-libs-gstpbutils" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutils.html">
+<ANCHOR id="gst-plugins-base-libs-gstpbutils.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutils.html#gst-plugins-base-libs-gstpbutils.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpbutils.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutils.html#gst-plugins-base-libs-gstpbutils.description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutils.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutils.html#gst-plugins-base-libs-gstpbutils.details">
+<ANCHOR id="gst-pb-utils-init" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutils.html#gst-pb-utils-init">
+<ANCHOR id="gst-plugins-base-libs-gstpluginsbaseversion" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html">
+<ANCHOR id="gst-plugins-base-libs-gstpluginsbaseversion.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-libs-gstpluginsbaseversion.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpluginsbaseversion.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-libs-gstpluginsbaseversion.description">
+<ANCHOR id="gst-plugins-base-libs-gstpluginsbaseversion.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-libs-gstpluginsbaseversion.details">
+<ANCHOR id="GST-PLUGINS-BASE-VERSION-MAJOR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MAJOR:CAPS">
+<ANCHOR id="GST-PLUGINS-BASE-VERSION-MINOR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MINOR:CAPS">
+<ANCHOR id="GST-PLUGINS-BASE-VERSION-MICRO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-MICRO:CAPS">
+<ANCHOR id="GST-PLUGINS-BASE-VERSION-NANO:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#GST-PLUGINS-BASE-VERSION-NANO:CAPS">
+<ANCHOR id="GST-CHECK-PLUGINS-BASE-VERSION:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#GST-CHECK-PLUGINS-BASE-VERSION:CAPS">
+<ANCHOR id="gst-plugins-base-version" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version">
+<ANCHOR id="gst-plugins-base-version-string" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpluginsbaseversion.html#gst-plugins-base-version-string">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilscodecutils" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilscodecutils.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-plugins-base-libs-gstpbutilscodecutils.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilscodecutils.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-plugins-base-libs-gstpbutilscodecutils.description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilscodecutils.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-plugins-base-libs-gstpbutilscodecutils.details">
+<ANCHOR id="gst-codec-utils-aac-get-sample-rate-from-index" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-sample-rate-from-index">
+<ANCHOR id="gst-codec-utils-aac-get-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-profile">
+<ANCHOR id="gst-codec-utils-aac-get-level" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-get-level">
+<ANCHOR id="gst-codec-utils-aac-caps-set-level-and-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-aac-caps-set-level-and-profile">
+<ANCHOR id="gst-codec-utils-h264-get-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-profile">
+<ANCHOR id="gst-codec-utils-h264-get-level" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level">
+<ANCHOR id="gst-codec-utils-h264-caps-set-level-and-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-caps-set-level-and-profile">
+<ANCHOR id="gst-codec-utils-h264-get-level-idc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-h264-get-level-idc">
+<ANCHOR id="gst-codec-utils-mpeg4video-get-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-profile">
+<ANCHOR id="gst-codec-utils-mpeg4video-get-level" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-get-level">
+<ANCHOR id="gst-codec-utils-mpeg4video-caps-set-level-and-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilscodecutils.html#gst-codec-utils-mpeg4video-caps-set-level-and-profile">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsdescriptions" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsdescriptions.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-plugins-base-libs-gstpbutilsdescriptions.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsdescriptions.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-plugins-base-libs-gstpbutilsdescriptions.description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsdescriptions.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-plugins-base-libs-gstpbutilsdescriptions.details">
+<ANCHOR id="gst-pb-utils-get-source-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-source-description">
+<ANCHOR id="gst-pb-utils-get-sink-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-sink-description">
+<ANCHOR id="gst-pb-utils-get-decoder-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-decoder-description">
+<ANCHOR id="gst-pb-utils-get-encoder-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-encoder-description">
+<ANCHOR id="gst-pb-utils-get-element-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-element-description">
+<ANCHOR id="gst-pb-utils-add-codec-description-to-tag-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-add-codec-description-to-tag-list">
+<ANCHOR id="gst-pb-utils-get-codec-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsdescriptions.html#gst-pb-utils-get-codec-description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsmissingplugins" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsmissingplugins.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-plugins-base-libs-gstpbutilsmissingplugins.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsmissingplugins.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-plugins-base-libs-gstpbutilsmissingplugins.description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsmissingplugins.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-plugins-base-libs-gstpbutilsmissingplugins.details">
+<ANCHOR id="gst-missing-plugin-message-get-installer-detail" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-installer-detail">
+<ANCHOR id="gst-missing-plugin-message-get-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-plugin-message-get-description">
+<ANCHOR id="gst-is-missing-plugin-message" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-is-missing-plugin-message">
+<ANCHOR id="gst-missing-decoder-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-message-new">
+<ANCHOR id="gst-missing-encoder-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-message-new">
+<ANCHOR id="gst-missing-uri-source-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-message-new">
+<ANCHOR id="gst-missing-uri-sink-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-message-new">
+<ANCHOR id="gst-missing-element-message-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-message-new">
+<ANCHOR id="gst-missing-uri-source-installer-detail-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-source-installer-detail-new">
+<ANCHOR id="gst-missing-uri-sink-installer-detail-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-uri-sink-installer-detail-new">
+<ANCHOR id="gst-missing-element-installer-detail-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-element-installer-detail-new">
+<ANCHOR id="gst-missing-decoder-installer-detail-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-decoder-installer-detail-new">
+<ANCHOR id="gst-missing-encoder-installer-detail-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsmissingplugins.html#gst-missing-encoder-installer-detail-new">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsinstallplugins" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsinstallplugins.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-plugins-base-libs-gstpbutilsinstallplugins.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsinstallplugins.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-plugins-base-libs-gstpbutilsinstallplugins.description">
+<ANCHOR id="gst-plugins-base-libs-gstpbutilsinstallplugins.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-plugins-base-libs-gstpbutilsinstallplugins.details">
+<ANCHOR id="GstInstallPluginsReturn" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsReturn">
+<ANCHOR id="GST-INSTALL-PLUGINS-SUCCESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-SUCCESS:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-NOT-FOUND:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-NOT-FOUND:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-ERROR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-ERROR:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-PARTIAL-SUCCESS:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-USER-ABORT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-USER-ABORT:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-CRASHED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-CRASHED:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INVALID:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-STARTED-OK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-STARTED-OK:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-INTERNAL-FAILURE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INTERNAL-FAILURE:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-HELPER-MISSING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-HELPER-MISSING:CAPS">
+<ANCHOR id="GST-INSTALL-PLUGINS-INSTALL-IN-PROGRESS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GST-INSTALL-PLUGINS-INSTALL-IN-PROGRESS:CAPS">
+<ANCHOR id="GstInstallPluginsResultFunc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsResultFunc">
+<ANCHOR id="gst-install-plugins-async" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-async">
+<ANCHOR id="gst-install-plugins-sync" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-sync">
+<ANCHOR id="gst-install-plugins-return-get-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-return-get-name">
+<ANCHOR id="gst-install-plugins-installation-in-progress" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-installation-in-progress">
+<ANCHOR id="gst-install-plugins-supported" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-supported">
+<ANCHOR id="GstInstallPluginsContext" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#GstInstallPluginsContext">
+<ANCHOR id="gst-install-plugins-context-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-new">
+<ANCHOR id="gst-install-plugins-context-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-free">
+<ANCHOR id="gst-install-plugins-context-set-xid" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpbutilsinstallplugins.html#gst-install-plugins-context-set-xid">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.synopsis">
+<ANCHOR id="GstDiscoverer" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer">
+<ANCHOR id="GstDiscovererInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.properties">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.signals" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.signals">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.description">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.details">
+<ANCHOR id="GstDiscoverer-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-struct">
+<ANCHOR id="gst-discoverer-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-new">
+<ANCHOR id="gst-discoverer-start" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-start">
+<ANCHOR id="gst-discoverer-stop" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stop">
+<ANCHOR id="gst-discoverer-discover-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri">
+<ANCHOR id="gst-discoverer-discover-uri-async" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-discover-uri-async">
+<ANCHOR id="GstDiscovererInfo-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererInfo-struct">
+<ANCHOR id="GstDiscovererResult" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererResult">
+<ANCHOR id="GST-DISCOVERER-OK:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-OK:CAPS">
+<ANCHOR id="GST-DISCOVERER-URI-INVALID:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-URI-INVALID:CAPS">
+<ANCHOR id="GST-DISCOVERER-ERROR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-ERROR:CAPS">
+<ANCHOR id="GST-DISCOVERER-TIMEOUT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-TIMEOUT:CAPS">
+<ANCHOR id="GST-DISCOVERER-BUSY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-BUSY:CAPS">
+<ANCHOR id="GST-DISCOVERER-MISSING-PLUGINS:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GST-DISCOVERER-MISSING-PLUGINS:CAPS">
+<ANCHOR id="gst-discoverer-info-get-duration" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-duration">
+<ANCHOR id="gst-discoverer-info-get-misc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-misc">
+<ANCHOR id="gst-discoverer-info-get-result" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-result">
+<ANCHOR id="gst-discoverer-info-get-stream-info" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-info">
+<ANCHOR id="gst-discoverer-info-get-stream-list" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-stream-list">
+<ANCHOR id="gst-discoverer-info-get-tags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-tags">
+<ANCHOR id="gst-discoverer-info-get-uri" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-uri">
+<ANCHOR id="gst-discoverer-info-get-seekable" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-seekable">
+<ANCHOR id="gst-discoverer-info-ref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-ref">
+<ANCHOR id="gst-discoverer-info-unref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-unref">
+<ANCHOR id="GstDiscovererStreamInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererStreamInfo">
+<ANCHOR id="GstDiscovererContainerInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererContainerInfo">
+<ANCHOR id="GstDiscovererAudioInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererAudioInfo">
+<ANCHOR id="GstDiscovererVideoInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererVideoInfo">
+<ANCHOR id="GstDiscovererSubtitleInfo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscovererSubtitleInfo">
+<ANCHOR id="gst-discoverer-stream-info-get-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-caps">
+<ANCHOR id="gst-discoverer-stream-info-get-misc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-misc">
+<ANCHOR id="gst-discoverer-stream-info-get-next" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-next">
+<ANCHOR id="gst-discoverer-stream-info-get-previous" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-previous">
+<ANCHOR id="gst-discoverer-stream-info-get-tags" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-tags">
+<ANCHOR id="gst-discoverer-stream-info-ref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-ref">
+<ANCHOR id="gst-discoverer-stream-info-unref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-unref">
+<ANCHOR id="gst-discoverer-stream-info-list-free" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-list-free">
+<ANCHOR id="gst-discoverer-stream-info-get-stream-type-nick" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-stream-info-get-stream-type-nick">
+<ANCHOR id="gst-discoverer-info-get-audio-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-audio-streams">
+<ANCHOR id="gst-discoverer-info-get-container-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-container-streams">
+<ANCHOR id="gst-discoverer-info-get-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-streams">
+<ANCHOR id="gst-discoverer-info-get-subtitle-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-subtitle-streams">
+<ANCHOR id="gst-discoverer-info-get-video-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-info-get-video-streams">
+<ANCHOR id="gst-discoverer-audio-info-get-bitrate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-bitrate">
+<ANCHOR id="gst-discoverer-audio-info-get-channels" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-channels">
+<ANCHOR id="gst-discoverer-audio-info-get-depth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-depth">
+<ANCHOR id="gst-discoverer-audio-info-get-language" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-language">
+<ANCHOR id="gst-discoverer-audio-info-get-max-bitrate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-max-bitrate">
+<ANCHOR id="gst-discoverer-audio-info-get-sample-rate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-audio-info-get-sample-rate">
+<ANCHOR id="gst-discoverer-container-info-get-streams" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-container-info-get-streams">
+<ANCHOR id="gst-discoverer-subtitle-info-get-language" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-subtitle-info-get-language">
+<ANCHOR id="gst-discoverer-video-info-get-bitrate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-bitrate">
+<ANCHOR id="gst-discoverer-video-info-get-depth" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-depth">
+<ANCHOR id="gst-discoverer-video-info-get-framerate-denom" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-denom">
+<ANCHOR id="gst-discoverer-video-info-get-framerate-num" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-framerate-num">
+<ANCHOR id="gst-discoverer-video-info-get-height" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-height">
+<ANCHOR id="gst-discoverer-video-info-is-interlaced" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-interlaced">
+<ANCHOR id="gst-discoverer-video-info-is-image" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-is-image">
+<ANCHOR id="gst-discoverer-video-info-get-max-bitrate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-max-bitrate">
+<ANCHOR id="gst-discoverer-video-info-get-par-denom" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-denom">
+<ANCHOR id="gst-discoverer-video-info-get-par-num" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-par-num">
+<ANCHOR id="gst-discoverer-video-info-get-width" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-discoverer-video-info-get-width">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.property-details">
+<ANCHOR id="GstDiscoverer--timeout" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer--timeout">
+<ANCHOR id="gst-plugins-base-libs-gstdiscoverer.signal-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#gst-plugins-base-libs-gstdiscoverer.signal-details">
+<ANCHOR id="GstDiscoverer-discovered" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-discovered">
+<ANCHOR id="GstDiscoverer-finished" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-finished">
+<ANCHOR id="GstDiscoverer-starting" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstdiscoverer.html#GstDiscoverer-starting">
+<ANCHOR id="gst-plugins-base-libs-encoding-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html">
+<ANCHOR id="gst-plugins-base-libs-encoding-profile.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-plugins-base-libs-encoding-profile.synopsis">
+<ANCHOR id="GstEncodingProfile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile">
+<ANCHOR id="GstEncodingContainerProfile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile">
+<ANCHOR id="GstEncodingAudioProfile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile">
+<ANCHOR id="GstEncodingVideoProfile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile">
+<ANCHOR id="GstEncodingTarget" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget">
+<ANCHOR id="gst-plugins-base-libs-encoding-profile.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-plugins-base-libs-encoding-profile.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-encoding-profile.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-plugins-base-libs-encoding-profile.description">
+<ANCHOR id="gst-plugins-base-libs-encoding-profile.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-plugins-base-libs-encoding-profile.details">
+<ANCHOR id="GstEncodingProfile-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile-struct">
+<ANCHOR id="gst-encoding-profile-unref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-unref">
+<ANCHOR id="gst-encoding-profile-ref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-ref">
+<ANCHOR id="gst-encoding-profile-find" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-find">
+<ANCHOR id="gst-encoding-profile-get-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-name">
+<ANCHOR id="gst-encoding-profile-get-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-description">
+<ANCHOR id="gst-encoding-profile-get-format" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-format">
+<ANCHOR id="gst-encoding-profile-get-preset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-preset">
+<ANCHOR id="gst-encoding-profile-get-presence" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-presence">
+<ANCHOR id="gst-encoding-profile-get-restriction" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-restriction">
+<ANCHOR id="gst-encoding-profile-set-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-name">
+<ANCHOR id="gst-encoding-profile-set-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-description">
+<ANCHOR id="gst-encoding-profile-set-format" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-format">
+<ANCHOR id="gst-encoding-profile-set-preset" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-preset">
+<ANCHOR id="gst-encoding-profile-set-restriction" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-restriction">
+<ANCHOR id="gst-encoding-profile-set-presence" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-set-presence">
+<ANCHOR id="gst-encoding-profile-is-equal" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-is-equal">
+<ANCHOR id="gst-encoding-profile-get-input-caps" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-input-caps">
+<ANCHOR id="gst-encoding-profile-get-type-nick" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-profile-get-type-nick">
+<ANCHOR id="GstEncodingContainerProfile-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile-struct">
+<ANCHOR id="gst-encoding-container-profile-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-new">
+<ANCHOR id="gst-encoding-container-profile-add-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-add-profile">
+<ANCHOR id="gst-encoding-container-profile-contains-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-contains-profile">
+<ANCHOR id="gst-encoding-container-profile-get-profiles" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-container-profile-get-profiles">
+<ANCHOR id="GstEncodingAudioProfile-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile-struct">
+<ANCHOR id="gst-encoding-audio-profile-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-audio-profile-new">
+<ANCHOR id="GstEncodingVideoProfile-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile-struct">
+<ANCHOR id="gst-encoding-video-profile-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-new">
+<ANCHOR id="gst-encoding-video-profile-get-pass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-pass">
+<ANCHOR id="gst-encoding-video-profile-get-variableframerate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-get-variableframerate">
+<ANCHOR id="gst-encoding-video-profile-set-pass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-pass">
+<ANCHOR id="gst-encoding-video-profile-set-variableframerate" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-video-profile-set-variableframerate">
+<ANCHOR id="GST-ENCODING-CATEGORY-DEVICE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-DEVICE:CAPS">
+<ANCHOR id="GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-ONLINE-SERVICE:CAPS">
+<ANCHOR id="GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-STORAGE-EDITING:CAPS">
+<ANCHOR id="GST-ENCODING-CATEGORY-CAPTURE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GST-ENCODING-CATEGORY-CAPTURE:CAPS">
+<ANCHOR id="GstEncodingTarget-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingTarget-struct">
+<ANCHOR id="gst-encoding-target-unref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-unref">
+<ANCHOR id="gst-encoding-target-ref" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-ref">
+<ANCHOR id="gst-encoding-target-new" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-new">
+<ANCHOR id="gst-encoding-target-get-name" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-name">
+<ANCHOR id="gst-encoding-target-get-category" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-category">
+<ANCHOR id="gst-encoding-target-get-description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-description">
+<ANCHOR id="gst-encoding-target-get-profiles" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profiles">
+<ANCHOR id="gst-encoding-target-get-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-get-profile">
+<ANCHOR id="gst-encoding-target-add-profile" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-add-profile">
+<ANCHOR id="gst-encoding-target-save" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save">
+<ANCHOR id="gst-encoding-target-save-to-file" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-save-to-file">
+<ANCHOR id="gst-encoding-target-load" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load">
+<ANCHOR id="gst-encoding-target-load-from-file" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-target-load-from-file">
+<ANCHOR id="gst-encoding-list-all-targets" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-all-targets">
+<ANCHOR id="gst-encoding-list-available-categories" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#gst-encoding-list-available-categories">
+<ANCHOR id="gst-plugins-base-libs-gstvideo" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html">
+<ANCHOR id="gst-plugins-base-libs-gstvideo.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-plugins-base-libs-gstvideo.synopsis">
+<ANCHOR id="gst-plugins-base-libs-gstvideo.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-plugins-base-libs-gstvideo.description">
+<ANCHOR id="gst-plugins-base-libs-gstvideo.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-plugins-base-libs-gstvideo.details">
+<ANCHOR id="GST-VIDEO-FPS-RANGE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FPS-RANGE:CAPS">
+<ANCHOR id="GST-VIDEO-SIZE-RANGE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-SIZE-RANGE:CAPS">
+<ANCHOR id="GstVideoFormat" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GstVideoFormat">
+<ANCHOR id="GST-VIDEO-FORMAT-UNKNOWN:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UNKNOWN:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-I420:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-I420:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-YV12:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YV12:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-YUY2:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YUY2:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-UYVY:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UYVY:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-AYUV:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-AYUV:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-RGBx" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGBx">
+<ANCHOR id="GST-VIDEO-FORMAT-BGRx" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGRx">
+<ANCHOR id="GST-VIDEO-FORMAT-xRGB" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-xRGB">
+<ANCHOR id="GST-VIDEO-FORMAT-xBGR" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-xBGR">
+<ANCHOR id="GST-VIDEO-FORMAT-RGBA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGBA:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-BGRA:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGRA:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-ARGB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ARGB:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-ABGR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ABGR:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-RGB:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-BGR:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-Y41B:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y41B:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-Y42B:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y42B:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-YVYU:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YVYU:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-Y444:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y444:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-v210" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v210">
+<ANCHOR id="GST-VIDEO-FORMAT-v216" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v216">
+<ANCHOR id="GST-VIDEO-FORMAT-NV12:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-NV12:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-NV21:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-NV21:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-GRAY8:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY8:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-GRAY16-BE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY16-BE:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-GRAY16-LE:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-GRAY16-LE:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-v308" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-v308">
+<ANCHOR id="GST-VIDEO-FORMAT-Y800:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y800:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-Y16:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-Y16:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-RGB16:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB16:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-BGR16:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR16:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-RGB15:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB15:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-BGR15:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-BGR15:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-UYVP:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-UYVP:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-A420:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-A420:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-RGB8-PALETTED:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-RGB8-PALETTED:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-YUV9:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YUV9:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-YVU9:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-YVU9:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-IYU1:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-IYU1:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-ARGB64:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-ARGB64:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-AYUV64:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-AYUV64:CAPS">
+<ANCHOR id="GST-VIDEO-FORMAT-r210" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GST-VIDEO-FORMAT-r210">
+<ANCHOR id="gst-video-calculate-display-ratio" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-calculate-display-ratio">
+<ANCHOR id="gst-video-format-to-fourcc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-format-to-fourcc">
+<ANCHOR id="gst-video-format-from-fourcc" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-format-from-fourcc">
+<ANCHOR id="gst-video-parse-caps-palette" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-parse-caps-palette">
+<ANCHOR id="GstVideoConvertFrameCallback" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#GstVideoConvertFrameCallback">
+<ANCHOR id="gst-video-convert-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame">
+<ANCHOR id="gst-video-convert-frame-async" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-convert-frame-async">
+<ANCHOR id="gst-video-event-new-still-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-event-new-still-frame">
+<ANCHOR id="gst-video-event-parse-still-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideo.html#gst-video-event-parse-still-frame">
+<ANCHOR id="gst-plugins-base-libs-gstvideofilter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html">
+<ANCHOR id="gst-plugins-base-libs-gstvideofilter.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#gst-plugins-base-libs-gstvideofilter.synopsis">
+<ANCHOR id="GstVideoFilter" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter">
+<ANCHOR id="gst-plugins-base-libs-gstvideofilter.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#gst-plugins-base-libs-gstvideofilter.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstvideofilter.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#gst-plugins-base-libs-gstvideofilter.description">
+<ANCHOR id="gst-plugins-base-libs-gstvideofilter.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#gst-plugins-base-libs-gstvideofilter.details">
+<ANCHOR id="GstVideoFilter-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter-struct">
+<ANCHOR id="GstVideoFilterClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilterClass">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.synopsis" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.synopsis">
+<ANCHOR id="GstVideoSink" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSink">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.object-hierarchy" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.properties" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.properties">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.description" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.description">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.details">
+<ANCHOR id="GstVideoSink-struct" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSink-struct">
+<ANCHOR id="GstVideoSinkClass" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSinkClass">
+<ANCHOR id="GstVideoRectangle" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoRectangle">
+<ANCHOR id="GST-VIDEO-SINK-HEIGHT:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-HEIGHT:CAPS">
+<ANCHOR id="GST-VIDEO-SINK-PAD:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-PAD:CAPS">
+<ANCHOR id="GST-VIDEO-SINK-WIDTH:CAPS" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GST-VIDEO-SINK-WIDTH:CAPS">
+<ANCHOR id="gst-video-sink-center-rect" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-video-sink-center-rect">
+<ANCHOR id="gst-plugins-base-libs-gstvideosink.property-details" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#gst-plugins-base-libs-gstvideosink.property-details">
+<ANCHOR id="GstVideoSink--show-preroll-frame" href="gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSink--show-preroll-frame">
+<ANCHOR id="annotation-glossterm-out" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-out">
+<ANCHOR id="annotation-glossterm-scope async" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-scope async">
+<ANCHOR id="annotation-glossterm-allow-none" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-closure" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-closure">
+<ANCHOR id="annotation-glossterm-transfer none" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-transfer none">
+<ANCHOR id="annotation-glossterm-element-type" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-element-type">
+<ANCHOR id="annotation-glossterm-transfer full" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-transfer full">
+<ANCHOR id="annotation-glossterm-type" href="gst-plugins-base-libs-0.11/annotation-glossary.html#annotation-glossterm-type">
diff --git a/docs/libs/html/left.png b/docs/libs/html/left.png
new file mode 100644
index 0000000..2d05b3d
--- /dev/null
+++ b/docs/libs/html/left.png
Binary files differ
diff --git a/docs/libs/html/right.png b/docs/libs/html/right.png
new file mode 100644
index 0000000..92832e3
--- /dev/null
+++ b/docs/libs/html/right.png
Binary files differ
diff --git a/docs/libs/html/style.css b/docs/libs/html/style.css
new file mode 100644
index 0000000..d6f6c26
--- /dev/null
+++ b/docs/libs/html/style.css
@@ -0,0 +1,266 @@
+.synopsis, .classsynopsis
+{
+ /* tango:aluminium 1/2 */
+ background: #eeeeec;
+ border: solid 1px #d3d7cf;
+ padding: 0.5em;
+}
+.programlisting
+{
+ /* tango:sky blue 0/1 */
+ background: #e6f3ff;
+ border: solid 1px #729fcf;
+ padding: 0.5em;
+}
+.variablelist
+{
+ padding: 4px;
+ margin-left: 3em;
+}
+.variablelist td:first-child
+{
+ vertical-align: top;
+}
+
+@media screen {
+ sup a.footnote
+ {
+ position: relative;
+ top: 0em ! important;
+
+ }
+ /* this is needed so that the local anchors are displayed below the naviagtion */
+ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+ {
+ display: inline-block;
+ position: relative;
+ top:-5em;
+ }
+ /* this seems to be a bug in the xsl style sheets when generating indexes */
+ div.index div.index
+ {
+ top: 0em;
+ }
+ /* make space for the fixed navigation bar and add space at the bottom so that
+ * link targets appear somewhat close to top
+ */
+ body
+ {
+ padding-top: 3.2em;
+ padding-bottom: 20em;
+ }
+ /* style and size the navigation bar */
+ table.navigation#top
+ {
+ position: fixed;
+ /* tango:scarlet red 0/1 */
+ background: #ffe6e6;
+ border: solid 1px #ef2929;
+ margin-top: 0;
+ margin-bottom: 0;
+ top: 0;
+ left: 0;
+ height: 3em;
+ z-index: 10;
+ }
+ .navigation a, .navigation a:visited
+ {
+ /* tango:scarlet red 3 */
+ color: #a40000;
+ }
+ .navigation a:hover
+ {
+ /* tango:scarlet red 1 */
+ color: #ef2929;
+ }
+ td.shortcuts
+ {
+ /* tango:scarlet red 1 */
+ color: #ef2929;
+ font-size: 80%;
+ white-space: nowrap;
+ }
+}
+@media print {
+ table.navigation {
+ visibility: collapse;
+ display: none;
+ }
+ div.titlepage table.navigation {
+ visibility: visible;
+ display: table;
+ /* tango:scarlet red 0/1 */
+ background: #ffe6e6;
+ border: solid 1px #ef2929;
+ margin-top: 0;
+ margin-bottom: 0;
+ top: 0;
+ left: 0;
+ height: 3em;
+ }
+}
+
+.navigation .title
+{
+ font-size: 200%;
+}
+
+div.gallery-float
+{
+ float: left;
+ padding: 10px;
+}
+div.gallery-float img
+{
+ border-style: none;
+}
+div.gallery-spacer
+{
+ clear: both;
+}
+
+a, a:visited
+{
+ text-decoration: none;
+ /* tango:sky blue 2 */
+ color: #3465a4;
+}
+a:hover
+{
+ text-decoration: underline;
+ /* tango:sky blue 1 */
+ color: #729fcf;
+}
+
+div.table table
+{
+ border-collapse: collapse;
+ border-spacing: 0px;
+ /* tango:aluminium 3 */
+ border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+ /* tango:aluminium 3 */
+ border: solid 1px #babdb6;
+ padding: 3px;
+ vertical-align: top;
+}
+
+div.table table th
+{
+ /* tango:aluminium 2 */
+ background-color: #d3d7cf;
+}
+
+hr
+{
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ background: #babdb6;
+ border: none 0px;
+ height: 1px;
+ clear: both;
+}
+
+.footer
+{
+ padding-top: 3.5em;
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ text-align: center;
+ font-size: 80%;
+}
+
+.warning
+{
+ /* tango:orange 0/1 */
+ background: #ffeed9;
+ border-color: #ffb04f;
+}
+.note
+{
+ /* tango:chameleon 0/0.5 */
+ background: #d8ffb2;
+ border-color: #abf562;
+}
+.note, .warning
+{
+ padding: 0.5em;
+ border-width: 1px;
+ border-style: solid;
+}
+.note h3, .warning h3
+{
+ margin-top: 0.0em
+}
+.note p, .warning p
+{
+ margin-bottom: 0.0em
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+ float: right;
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ font-size: 80%;
+ font-weight: normal;
+}
+
+.annotation
+{
+ /* tango:aluminium 5 */
+ color: #555753;
+ font-size: 80%;
+ font-weight: normal;
+}
+
+/* code listings */
+
+.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */
+.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */
+.listing_code .programlisting .function { color: #000000; font-weight: bold; }
+.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */
+.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */
+.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .normal { color: #000000; }
+.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */
+.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */
+.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */
+.listing_code .programlisting .type { color: #000000; }
+.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */
+.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */
+
+.listing_frame {
+ /* tango:sky blue 1 */
+ border: solid 1px #729fcf;
+ padding: 0px;
+}
+
+.listing_lines, .listing_code {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0.5em;
+}
+.listing_lines {
+ /* tango:sky blue 0.5 */
+ background: #a6c5e3;
+ /* tango:aluminium 6 */
+ color: #2e3436;
+}
+.listing_code {
+ /* tango:sky blue 0 */
+ background: #e6f3ff;
+}
+.listing_code .programlisting {
+ /* override from previous */
+ border: none 0px;
+ padding: 0px;
+}
+.listing_lines pre, .listing_code pre {
+ margin: 0px;
+}
+
diff --git a/docs/libs/html/up.png b/docs/libs/html/up.png
new file mode 100644
index 0000000..85b3e2a
--- /dev/null
+++ b/docs/libs/html/up.png
Binary files differ
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
new file mode 100644
index 0000000..60111f3
--- /dev/null
+++ b/docs/plugins/Makefile.am
@@ -0,0 +1,121 @@
+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-base
+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
+
+# Extra options to supply to gtkdoc-fixref.
+FIXXREF_OPTIONS=--extra-dir=$(top_builddir)/docs/libs/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/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
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = avcodec.h dsputil.h arch.h speex_resampler.h speex_resampler_wrapper.h fixed_arm4.h fixed_arm5e.h fixed_bfin.h fixed_debug.h fixed_generic.h resample_sse.h
+IGNORE_CFILES = utils.c mem.c imgconvert.c
+
+# 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/alsa/gstalsamixerelement.h \
+ $(top_srcdir)/ext/alsa/gstalsasink.h \
+ $(top_srcdir)/ext/alsa/gstalsasrc.h \
+ $(top_srcdir)/ext/cdparanoia/gstcdparanoiasrc.h \
+ $(top_srcdir)/ext/gio/gstgiosink.h \
+ $(top_srcdir)/ext/gio/gstgiosrc.h \
+ $(top_srcdir)/ext/gio/gstgiostreamsink.h \
+ $(top_srcdir)/ext/gio/gstgiostreamsrc.h \
+ $(top_srcdir)/ext/ogg/gstoggdemux.h \
+ $(top_srcdir)/ext/ogg/gstoggmux.h \
+ $(top_srcdir)/ext/pango/gstclockoverlay.h \
+ $(top_srcdir)/ext/pango/gsttextoverlay.h \
+ $(top_srcdir)/ext/pango/gsttextrender.h \
+ $(top_srcdir)/ext/pango/gsttimeoverlay.h \
+ $(top_srcdir)/ext/theora/gsttheoradec.h \
+ $(top_srcdir)/ext/theora/gsttheoraenc.h \
+ $(top_srcdir)/ext/theora/gsttheoraparse.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisdec.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisenc.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisparse.h \
+ $(top_srcdir)/ext/vorbis/gstvorbistag.h \
+ $(top_srcdir)/gst/adder/gstadder.h \
+ $(top_srcdir)/gst/audioconvert/audioconvert.h \
+ $(top_srcdir)/gst/audioconvert/gstaudioconvert.h \
+ $(top_srcdir)/gst/audiotestsrc/gstaudiotestsrc.h \
+ $(top_srcdir)/gst/encoding/gstencodebin.h \
+ $(top_srcdir)/gst/gdp/gstgdpdepay.h \
+ $(top_srcdir)/gst/gdp/gstgdppay.h \
+ $(top_srcdir)/gst/playback/gstplay-enum.h \
+ $(top_srcdir)/gst/playback/gstsubtitleoverlay.h \
+ $(top_srcdir)/gst/audiorate/gstaudiorate.h \
+ $(top_srcdir)/gst/audioresample/gstaudioresample.h \
+ $(top_srcdir)/gst/tcp/gstmultifdsink.h \
+ $(top_srcdir)/gst/tcp/gsttcpclientsrc.h \
+ $(top_srcdir)/gst/tcp/gsttcpclientsink.h \
+ $(top_srcdir)/gst/tcp/gsttcpserversrc.h \
+ $(top_srcdir)/gst/tcp/gsttcpserversink.h \
+ $(top_builddir)/gst/tcp/gsttcp-enumtypes.h \
+ $(top_srcdir)/gst/tcp/gsttcp.h \
+ $(top_srcdir)/gst/videorate/gstvideorate.h \
+ $(top_srcdir)/gst/videoscale/gstvideoscale.h \
+ $(top_srcdir)/gst/videotestsrc/gstvideotestsrc.h \
+ $(top_srcdir)/gst/volume/gstvolume.h \
+ $(top_srcdir)/sys/ximage/ximagesink.h \
+ $(top_srcdir)/sys/xvimage/xvimagesink.h \
+ $(top_srcdir)/gst-libs/gst/app/gstappsrc.h \
+ $(top_srcdir)/gst-libs/gst/app/gstappsink.h
+
+# 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) -I$(top_builddir)/gst-libs
+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
+DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+
+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..785309e
--- /dev/null
+++ b/docs/plugins/Makefile.in
@@ -0,0 +1,1127 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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-base
+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
+
+# Extra options to supply to gtkdoc-fixref.
+FIXXREF_OPTIONS = --extra-dir=$(top_builddir)/docs/libs/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/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
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = avcodec.h dsputil.h arch.h speex_resampler.h speex_resampler_wrapper.h fixed_arm4.h fixed_arm5e.h fixed_bfin.h fixed_debug.h fixed_generic.h resample_sse.h
+IGNORE_CFILES = utils.c mem.c imgconvert.c
+
+# 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/alsa/gstalsamixerelement.h \
+ $(top_srcdir)/ext/alsa/gstalsasink.h \
+ $(top_srcdir)/ext/alsa/gstalsasrc.h \
+ $(top_srcdir)/ext/cdparanoia/gstcdparanoiasrc.h \
+ $(top_srcdir)/ext/gio/gstgiosink.h \
+ $(top_srcdir)/ext/gio/gstgiosrc.h \
+ $(top_srcdir)/ext/gio/gstgiostreamsink.h \
+ $(top_srcdir)/ext/gio/gstgiostreamsrc.h \
+ $(top_srcdir)/ext/ogg/gstoggdemux.h \
+ $(top_srcdir)/ext/ogg/gstoggmux.h \
+ $(top_srcdir)/ext/pango/gstclockoverlay.h \
+ $(top_srcdir)/ext/pango/gsttextoverlay.h \
+ $(top_srcdir)/ext/pango/gsttextrender.h \
+ $(top_srcdir)/ext/pango/gsttimeoverlay.h \
+ $(top_srcdir)/ext/theora/gsttheoradec.h \
+ $(top_srcdir)/ext/theora/gsttheoraenc.h \
+ $(top_srcdir)/ext/theora/gsttheoraparse.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisdec.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisenc.h \
+ $(top_srcdir)/ext/vorbis/gstvorbisparse.h \
+ $(top_srcdir)/ext/vorbis/gstvorbistag.h \
+ $(top_srcdir)/gst/adder/gstadder.h \
+ $(top_srcdir)/gst/audioconvert/audioconvert.h \
+ $(top_srcdir)/gst/audioconvert/gstaudioconvert.h \
+ $(top_srcdir)/gst/audiotestsrc/gstaudiotestsrc.h \
+ $(top_srcdir)/gst/encoding/gstencodebin.h \
+ $(top_srcdir)/gst/gdp/gstgdpdepay.h \
+ $(top_srcdir)/gst/gdp/gstgdppay.h \
+ $(top_srcdir)/gst/playback/gstplay-enum.h \
+ $(top_srcdir)/gst/playback/gstsubtitleoverlay.h \
+ $(top_srcdir)/gst/audiorate/gstaudiorate.h \
+ $(top_srcdir)/gst/audioresample/gstaudioresample.h \
+ $(top_srcdir)/gst/tcp/gstmultifdsink.h \
+ $(top_srcdir)/gst/tcp/gsttcpclientsrc.h \
+ $(top_srcdir)/gst/tcp/gsttcpclientsink.h \
+ $(top_srcdir)/gst/tcp/gsttcpserversrc.h \
+ $(top_srcdir)/gst/tcp/gsttcpserversink.h \
+ $(top_builddir)/gst/tcp/gsttcp-enumtypes.h \
+ $(top_srcdir)/gst/tcp/gsttcp.h \
+ $(top_srcdir)/gst/videorate/gstvideorate.h \
+ $(top_srcdir)/gst/videoscale/gstvideoscale.h \
+ $(top_srcdir)/gst/videotestsrc/gstvideotestsrc.h \
+ $(top_srcdir)/gst/volume/gstvolume.h \
+ $(top_srcdir)/sys/ximage/ximagesink.h \
+ $(top_srcdir)/sys/xvimage/xvimagesink.h \
+ $(top_srcdir)/gst-libs/gst/app/gstappsrc.h \
+ $(top_srcdir)/gst-libs/gst/app/gstappsink.h
+
+
+# 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) -I$(top_builddir)/gst-libs
+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
+DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+
+# 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_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 '<version>' $$each | grep -v '<version>$(VERSION)'); then \
+ echo $$each should be fixed to say version $(VERSION) or be removed ; \
+ echo "sed -i -e 's/<version.*version>/<version>$(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 '<version>$(PACKAGE_VERSION)</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-base-plugins-docs.sgml b/docs/plugins/gst-plugins-base-plugins-docs.sgml
new file mode 100644
index 0000000..e121096
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins-docs.sgml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+]>
+
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>GStreamer Base Plugins &GST_MAJORMINOR; Plugins Reference Manual</title>
+ <releaseinfo>
+ for GStreamer Base Plugins &GST_MAJORMINOR; (&GST_VERSION;)
+ The latest version of this documentation can be found on-line at
+ <ulink role="online-location" url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/</ulink>.
+ </releaseinfo>
+ </bookinfo>
+
+ <chapter>
+ <title>gst-plugins-base Elements</title>
+ <xi:include href="xml/element-adder.xml" />
+ <xi:include href="xml/element-appsrc.xml" />
+ <xi:include href="xml/element-appsink.xml" />
+ <xi:include href="xml/element-alsamixer.xml" />
+ <xi:include href="xml/element-alsasink.xml" />
+ <xi:include href="xml/element-alsasrc.xml" />
+ <xi:include href="xml/element-audioconvert.xml" />
+ <xi:include href="xml/element-audiorate.xml" />
+ <xi:include href="xml/element-audioresample.xml" />
+ <xi:include href="xml/element-audiotestsrc.xml" />
+ <xi:include href="xml/element-cdparanoiasrc.xml" />
+ <xi:include href="xml/element-clockoverlay.xml" />
+ <xi:include href="xml/element-decodebin.xml" />
+ <xi:include href="xml/element-decodebin2.xml" />
+ <xi:include href="xml/element-encodebin.xml" />
+ <xi:include href="xml/element-videoconvert.xml" />
+ <xi:include href="xml/element-gdpdepay.xml" />
+ <xi:include href="xml/element-gdppay.xml" />
+ <xi:include href="xml/element-giosink.xml" />
+ <xi:include href="xml/element-giosrc.xml" />
+ <xi:include href="xml/element-giostreamsink.xml" />
+ <xi:include href="xml/element-giostreamsrc.xml" />
+ <xi:include href="xml/element-multifdsink.xml" />
+ <xi:include href="xml/element-oggdemux.xml" />
+ <xi:include href="xml/element-oggmux.xml" />
+ <xi:include href="xml/element-playbin.xml" />
+ <xi:include href="xml/element-playbin2.xml" />
+ <xi:include href="xml/element-subtitleoverlay.xml" />
+ <xi:include href="xml/element-tcpclientsrc.xml" />
+ <xi:include href="xml/element-tcpclientsink.xml" />
+ <xi:include href="xml/element-tcpserversrc.xml" />
+ <xi:include href="xml/element-tcpserversink.xml" />
+ <xi:include href="xml/element-textoverlay.xml" />
+ <xi:include href="xml/element-textrender.xml" />
+ <xi:include href="xml/element-theoradec.xml" />
+ <xi:include href="xml/element-theoraenc.xml" />
+ <xi:include href="xml/element-theoraparse.xml" />
+ <xi:include href="xml/element-timeoverlay.xml" />
+ <xi:include href="xml/element-uridecodebin.xml" />
+ <xi:include href="xml/element-videorate.xml" />
+ <xi:include href="xml/element-videoscale.xml" />
+ <xi:include href="xml/element-videotestsrc.xml" />
+ <xi:include href="xml/element-volume.xml" />
+ <xi:include href="xml/element-vorbisdec.xml" />
+ <xi:include href="xml/element-vorbisenc.xml" />
+ <xi:include href="xml/element-vorbisparse.xml" />
+ <xi:include href="xml/element-vorbistag.xml" />
+ <xi:include href="xml/element-ximagesink.xml" />
+ <xi:include href="xml/element-xvimagesink.xml" />
+ </chapter>
+
+ <chapter>
+ <title>gst-plugins-base Plugins</title>
+ <xi:include href="xml/plugin-adder.xml" />
+ <xi:include href="xml/plugin-alsa.xml" />
+ <xi:include href="xml/plugin-app.xml" />
+ <xi:include href="xml/plugin-audioconvert.xml" />
+ <xi:include href="xml/plugin-audiorate.xml" />
+ <xi:include href="xml/plugin-audioresample.xml" />
+ <xi:include href="xml/plugin-audiotestsrc.xml" />
+ <xi:include href="xml/plugin-cdparanoia.xml" />
+ <xi:include href="xml/plugin-decodebin.xml" />
+ <xi:include href="xml/plugin-encoding.xml" />
+ <xi:include href="xml/plugin-videoconvert.xml" />
+ <xi:include href="xml/plugin-gdp.xml" />
+ <xi:include href="xml/plugin-gio.xml" />
+ <xi:include href="xml/plugin-libvisual.xml" />
+ <xi:include href="xml/plugin-ogg.xml" />
+ <xi:include href="xml/plugin-pango.xml" />
+ <xi:include href="xml/plugin-playback.xml" />
+ <xi:include href="xml/plugin-subparse.xml" />
+ <xi:include href="xml/plugin-tcp.xml" />
+ <xi:include href="xml/plugin-theora.xml" />
+ <xi:include href="xml/plugin-typefindfunctions.xml" />
+ <xi:include href="xml/plugin-uridecodebin.xml" />
+ <xi:include href="xml/plugin-videorate.xml" />
+ <xi:include href="xml/plugin-videoscale.xml" />
+ <xi:include href="xml/plugin-videotestsrc.xml" />
+ <xi:include href="xml/plugin-volume.xml" />
+ <xi:include href="xml/plugin-vorbis.xml" />
+ <xi:include href="xml/plugin-ximagesink.xml" />
+ <xi:include href="xml/plugin-xvimagesink.xml" />
+ </chapter>
+
+ <chapter>
+ <title>gst-plugins-base Classes</title>
+ <xi:include href="xml/gstplaybasebin.xml" />
+ </chapter>
+</book>
+
diff --git a/docs/plugins/gst-plugins-base-plugins-overrides.txt b/docs/plugins/gst-plugins-base-plugins-overrides.txt
new file mode 100644
index 0000000..57b5802
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins-overrides.txt
@@ -0,0 +1,30 @@
+<STRUCT>
+<NAME>GstDecodeBin</NAME>
+struct _GstDecodeBin {
+};
+</STRUCT>
+<STRUCT>
+<NAME>GstDecodeBin2</NAME>
+struct _GstDecodeBin2 {
+};
+</STRUCT>
+<STRUCT>
+<NAME>GstPlayBaseBin</NAME>
+struct _GstPlayBaseBin {
+};
+</STRUCT>
+<STRUCT>
+<NAME>GstPlayBin</NAME>
+struct _GstPlayBin {
+};
+</STRUCT>
+<STRUCT>
+<NAME>GstPlayBin2</NAME>
+struct _GstPlayBin2 {
+};
+</STRUCT>
+<STRUCT>
+<NAME>GstURIDecodeBin</NAME>
+struct _GstURIDecodeBin {
+};
+</STRUCT>
diff --git a/docs/plugins/gst-plugins-base-plugins-sections.txt b/docs/plugins/gst-plugins-base-plugins-sections.txt
new file mode 100644
index 0000000..b9fde4d
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins-sections.txt
@@ -0,0 +1,791 @@
+<SECTION>
+<FILE>element-adder</FILE>
+<TITLE>adder</TITLE>
+GstAdder
+<SUBSECTION Standard>
+GST_ADDER
+GST_IS_ADDER
+GST_TYPE_ADDER
+GST_ADDER_CLASS
+GST_IS_ADDER_CLASS
+GST_ADDER_GET_CLASS
+gst_adder_get_type
+GstAdderClass
+GstAdderFormat
+GstAdderFunction
+GstAdderInputChannel
+</SECTION>
+
+<SECTION>
+<FILE>element-appsrc</FILE>
+<TITLE>appsrc</TITLE>
+GstAppSrc
+<SUBSECTION Standard>
+gst_app_src_set_caps
+gst_app_src_get_caps
+gst_app_src_set_size
+gst_app_src_get_size
+gst_app_src_set_stream_type
+gst_app_src_get_stream_type
+gst_app_src_set_max_bytes
+gst_app_src_get_max_bytes
+gst_app_src_set_latency
+gst_app_src_get_latency
+gst_app_src_set_emit_signals
+gst_app_src_get_emit_signals
+gst_app_src_push_buffer
+gst_app_src_end_of_stream
+GstAppSrcCallbacks
+gst_app_src_set_callbacks
+
+GstAppSrcClass
+GstAppSrcPrivate
+GstAppStreamType
+GST_APP_SRC
+GST_IS_APP_SRC
+GST_TYPE_APP_SRC
+gst_app_src_get_type
+GST_APP_SRC_CLASS
+GST_IS_APP_SRC_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-appsink</FILE>
+<TITLE>appsink</TITLE>
+GstAppSink
+<SUBSECTION Standard>
+gst_app_sink_set_caps
+gst_app_sink_get_caps
+gst_app_sink_is_eos
+gst_app_sink_set_emit_signals
+gst_app_sink_get_emit_signals
+gst_app_sink_set_max_buffers
+gst_app_sink_get_max_buffers
+gst_app_sink_set_drop
+gst_app_sink_get_drop
+gst_app_sink_pull_preroll
+gst_app_sink_pull_buffer
+gst_app_sink_set_callbacks
+GstAppSinkClass
+GstAppSinkPrivate
+GstAppSinkCallbacks
+GST_APP_SINK
+GST_IS_APP_SINK
+GST_TYPE_APP_SINK
+gst_app_sink_get_type
+GST_APP_SINK_CLASS
+GST_IS_APP_SINK_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-alsamixer</FILE>
+<TITLE>alsamixer</TITLE>
+GstAlsaMixerElement
+<SUBSECTION Standard>
+GstAlsaMixerElementClass
+GST_ALSA_MIXER_ELEMENT
+GST_IS_ALSA_MIXER_ELEMENT
+GST_TYPE_ALSA_MIXER_ELEMENT
+gst_alsa_mixer_element_get_type
+GST_ALSA_MIXER_ELEMENT_CLASS
+GST_IS_ALSA_MIXER_ELEMENT_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-alsasink</FILE>
+<TITLE>alsasink</TITLE>
+GstAlsaSink
+<SUBSECTION Standard>
+GstAlsaSinkClass
+GST_ALSA_SINK
+GST_ALSA_SINK_CAST
+GST_IS_ALSA_SINK
+GST_TYPE_ALSA_SINK
+GST_ALSA_SINK_CLASS
+GST_IS_ALSA_SINK_CLASS
+GST_ALSA_SINK_GET_LOCK
+GST_ALSA_SINK_LOCK
+GST_ALSA_SINK_UNLOCK
+gst_alsasink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-alsasrc</FILE>
+<TITLE>alsasrc</TITLE>
+GstAlsaSrc
+<SUBSECTION Standard>
+GstAlsaSrcClass
+GST_ALSA_SRC
+GST_IS_ALSA_SRC
+GST_TYPE_ALSA_SRC
+GST_ALSA_SRC_CLASS
+GST_IS_ALSA_SRC_CLASS
+GST_ALSA_SRC_CAST
+GST_ALSA_SRC_GET_LOCK
+GST_ALSA_SRC_LOCK
+GST_ALSA_SRC_UNLOCK
+gst_alsasrc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-audioconvert</FILE>
+<TITLE>audioconvert</TITLE>
+GstAudioConvert
+GstAudioConvertDithering
+GstAudioConvertNoiseShaping
+<SUBSECTION Standard>
+GST_AUDIO_CONVERT
+GST_AUDIO_CONVERT_CLASS
+GST_IS_AUDIO_CONVERT
+GST_IS_AUDIO_CONVERT_CLASS
+GST_TYPE_AUDIO_CONVERT
+GstAudioConvertClass
+AudioConvertCtx
+AudioConvertFmt
+AudioConvertMix
+AudioConvertPack
+AudioConvertQuantize
+AudioConvertUnpack
+audio_convert_clean_context
+audio_convert_clean_fmt
+audio_convert_convert
+audio_convert_get_sizes
+audio_convert_prepare_context
+</SECTION>
+
+<SECTION>
+<FILE>element-audiorate</FILE>
+<TITLE>audiorate</TITLE>
+GstAudioRate
+<SUBSECTION Standard>
+GST_AUDIO_RATE
+GST_IS_AUDIO_RATE
+GST_TYPE_AUDIO_RATE
+gst_audio_rate_get_type
+GST_AUDIO_RATE_CLASS
+GST_IS_AUDIO_RATE_CLASS
+GstAudioRateClass
+</SECTION>
+
+<SECTION>
+<FILE>element-audioresample</FILE>
+<TITLE>audioresample</TITLE>
+GstAudioResample
+<SUBSECTION Standard>
+GST_AUDIO_RESAMPLE
+GST_IS_AUDIO_RESAMPLE
+GST_TYPE_AUDIO_RESAMPLE
+gst_audio_resample_get_type
+GST_AUDIO_RESAMPLE_CLASS
+GST_IS_AUDIO_RESAMPLE_CLASS
+GstAudioResampleClass
+</SECTION>
+
+<SECTION>
+<FILE>element-audiotestsrc</FILE>
+<TITLE>audiotestsrc</TITLE>
+GstAudioTestSrc
+GstAudioTestSrcWave
+<SUBSECTION Standard>
+GST_AUDIO_TEST_SRC
+GST_AUDIO_TEST_SRC_CLASS
+GST_IS_AUDIO_TEST_SRC
+GST_IS_AUDIO_TEST_SRC_CLASS
+GST_TYPE_AUDIO_TEST_SRC
+GstAudioTestSrcClass
+GstAudioTestSrcFormat
+gst_audio_test_src_get_type
+GstPinkNoise
+PINK_MAX_RANDOM_ROWS
+PINK_RANDOM_BITS
+PINK_RANDOM_SHIFT
+ProcessFunc
+</SECTION>
+
+<SECTION>
+<FILE>element-cdparanoiasrc</FILE>
+<TITLE>cdparanoiasrc</TITLE>
+GstCdParanoiaSrc
+<SUBSECTION Standard>
+GstCdParanoiaSrcClass
+GST_CD_PARANOIA_SRC
+GST_CD_PARANOIA_SRC_CLASS
+GST_CD_PARANOIA_SRC_GET_CLASS
+GST_IS_CD_PARANOIA_SRC
+GST_IS_CD_PARANOIA_SRC_CLASS
+GST_TYPE_CD_PARANOIA_SRC
+gst_cd_paranoia_src_get_type
+size16
+size32
+</SECTION>
+
+<SECTION>
+<FILE>element-clockoverlay</FILE>
+<TITLE>clockoverlay</TITLE>
+GstClockOverlay
+<SUBSECTION Standard>
+GST_CLOCK_OVERLAY
+GST_CLOCK_OVERLAY_CLASS
+GST_IS_CLOCK_OVERLAY
+GST_IS_CLOCK_OVERLAY_CLASS
+GST_TYPE_CLOCK_OVERLAY
+GstClockOverlayClass
+gst_clock_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-decodebin</FILE>
+<TITLE>decodebin</TITLE>
+GstDecodeBin
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>element-decodebin</FILE>
+<TITLE>decodebin</TITLE>
+GstDecodeBin
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>element-encodebin</FILE>
+<TITLE>encodebin</TITLE>
+GstEncodeBin
+<SUBSECTION Standard>
+GST_ENCODE_BIN
+GST_ENCODE_BIN_CLASS
+GST_IS_ENCODE_BIN
+GST_IS_ENCODE_BIN_CLASS
+GST_TYPE_ENCODE_BIN
+GstEncodeBinClass
+gst_encode_bin_get_type
+</SECTION>
+
+
+
+<SECTION>
+<FILE>element-videoconvert</FILE>
+<TITLE>videoconvert</TITLE>
+GstVideoConvert
+<SUBSECTION Standard>
+GST_VIDEO_CONVERT
+GST_VIDEO_CONVERT_CLASS
+GST_IS_VIDEO_CONVERT_
+GST_IS_VIDEO_CONVERT_CLASS
+GST_TYPE_VIDEO_CONVERT_
+GstVideoConvertClass
+</SECTION>
+
+<SECTION>
+<FILE>element-gdpdepay</FILE>
+<TITLE>gdpdepay</TITLE>
+GstGDPDepay
+<SUBSECTION Standard>
+GstGDPDepayClass
+GstGDPDepayState
+GST_GDP_DEPAY
+GST_GDP_DEPAY_CLASS
+GST_IS_GDP_DEPAY
+GST_IS_GDP_DEPAY_CLASS
+GST_TYPE_GDP_DEPAY
+gst_gdp_depay_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-gdppay</FILE>
+<TITLE>gdppay</TITLE>
+GstGDPPay
+<SUBSECTION Standard>
+GstGDPPayClass
+GST_GDP_PAY
+GST_GDP_PAY_CLASS
+GST_IS_GDP_PAY
+GST_IS_GDP_PAY_CLASS
+GST_TYPE_GDP_PAY
+gst_gdp_pay_plugin_init
+</SECTION>
+
+<SECTION>
+<FILE>element-giosink</FILE>
+<TITLE>giosink</TITLE>
+GstGioSink
+<SUBSECTION Standard>
+GstGioSinkClass
+GST_GIO_SINK
+GST_GIO_SINK_CLASS
+GST_IS_GIO_SINK
+GST_IS_GIO_SINK_CLASS
+GST_TYPE_GIO_SINK
+gst_gio_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-giosrc</FILE>
+<TITLE>giosrc</TITLE>
+GstGioSrc
+<SUBSECTION Standard>
+GstGioSrcClass
+GST_GIO_SRC
+GST_GIO_SRC_CLASS
+GST_IS_GIO_SRC
+GST_IS_GIO_SRC_CLASS
+GST_TYPE_GIO_SRC
+gst_gio_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-giostreamsink</FILE>
+<TITLE>giostreamsink</TITLE>
+GstGioStreamSink
+<SUBSECTION Standard>
+GstGioStreamSinkClass
+GST_GIO_STREAM_SINK
+GST_GIO_STREAM_SINK_CLASS
+GST_IS_GIO_STREAM_SINK
+GST_IS_GIO_STREAM_SINK_CLASS
+GST_TYPE_GIO_STREAM_SINK
+gst_gio_stream_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-giostreamsrc</FILE>
+<TITLE>giostreamsrc</TITLE>
+GstGioStreamSrc
+<SUBSECTION Standard>
+GstGioStreamSrcClass
+GST_GIO_STREAM_SRC
+GST_GIO_STREAM_SRC_CLASS
+GST_IS_GIO_STREAM_SRC
+GST_IS_GIO_STREAM_SRC_CLASS
+GST_TYPE_GIO_STREAM_SRC
+gst_gio_stream_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-multifdsink</FILE>
+<TITLE>multifdsink</TITLE>
+GstMultiFdSink
+GstRecoverPolicy
+GstSyncMethod
+GstClientStatus
+GstTCPProtocol
+GstTCPUnitType
+<SUBSECTION Standard>
+CLIENTS_LOCK
+CLIENTS_LOCK_FREE
+CLIENTS_LOCK_INIT
+CLIENTS_UNLOCK
+GST_TYPE_MULTI_FD_SINK
+GST_IS_MULTI_FD_SINK
+GST_IS_MULTI_FD_SINK_CLASS
+GST_MULTI_FD_SINK
+GST_MULTI_FD_SINK_CLASS
+GST_MULTI_FD_SINK_GET_CLASS
+GstTCPClient
+GstMultiFdSinkFlags
+GstMultiFdSinkClass
+gst_multi_fd_sink_add
+gst_multi_fd_sink_add_full
+gst_multi_fd_sink_clear
+gst_multi_fd_sink_get_stats
+gst_multi_fd_sink_get_type
+gst_multi_fd_sink_remove
+gst_multi_fd_sink_remove_flush
+GST_TYPE_TCP_PROTOCOL
+gst_tcp_protocol_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-oggdemux</FILE>
+<TITLE>oggdemux</TITLE>
+GstOggDemux
+<SUBSECTION Standard>
+GST_OGG_DEMUX
+GST_OGG_DEMUX_CLASS
+GST_IS_OGG_DEMUX
+GST_IS_OGG_DEMUX_CLASS
+GST_TYPE_OGG_DEMUX
+GstOggDemuxClass
+GST_IS_OGG_PAD
+GST_IS_OGG_PAD_CLASS
+GST_OGG_PAD
+GST_OGG_PAD_CLASS
+GST_TYPE_OGG_PAD
+GstOggChain
+GstOggPad
+GstOggPadClass
+GstOggPadMode
+GstOggPadState
+</SECTION>
+
+<SECTION>
+<FILE>element-oggmux</FILE>
+<TITLE>oggmux</TITLE>
+GstOggMux
+<SUBSECTION Standard>
+gst_ogg_mux_get_type
+GST_OGG_MUX
+GST_OGG_MUX_CLASS
+GST_IS_OGG_MUX
+GST_IS_OGG_MUX_CLASS
+GST_TYPE_OGG_MUX
+GstOggMuxClass
+</SECTION>
+
+<SECTION>
+<FILE>element-playbin</FILE>
+<TITLE>playbin</TITLE>
+GstPlayBin
+<SUBSECTION Standard>
+</SECTION>
+
+<SECTION>
+<FILE>element-playbin</FILE>
+<TITLE>playbin</TITLE>
+GstPlayBin
+GstPlayFlags
+<SUBSECTION Standard>
+gst_play_flags_get_type
+GST_TYPE_PLAY_FLAGS
+</SECTION>
+
+<SECTION>
+<FILE>element-subtitleoverlay</FILE>
+<TITLE>subtitleoverlay</TITLE>
+GstSubtitleOverlay
+<SUBSECTION Standard>
+GstSubtitleOverlayClass
+
+GST_IS_SUBTITLE_OVERLAY
+GST_IS_SUBTITLE_OVERLAY_CLASS
+GST_SUBTITLE_OVERLAY
+GST_SUBTITLE_OVERLAY_CAST
+GST_SUBTITLE_OVERLAY_CLASS
+GST_SUBTITLE_OVERLAY_LOCK
+GST_SUBTITLE_OVERLAY_UNLOCK
+GST_TYPE_SUBTITLE_OVERLAY
+gst_subtitle_overlay_plugin_init
+gst_subtitle_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-tcpclientsrc</FILE>
+<TITLE>tcpclientsrc</TITLE>
+GstTCPClientSrc
+<SUBSECTION Standard>
+GstTCPClientSrcClass
+GST_TCP_CLIENT_SRC
+GST_TCP_CLIENT_SINK_CLASS
+GstTCPClientSrcFlags
+GST_TYPE_TCP_CLIENT_SRC
+gst_tcp_client_src_get_type
+GST_IS_TCP_CLIENT_SRC_CLASS
+GST_IS_TCP_CLIENT_SRC
+</SECTION>
+
+<SECTION>
+<FILE>element-tcpclientsink</FILE>
+<TITLE>tcpclientsink</TITLE>
+GstTCPClientSink
+<SUBSECTION Standard>
+GstTCPClientSinkClass
+GST_TCP_CLIENT_SINK
+GST_TCP_CLIENT_SRC_CLASS
+GstTCPClientSinkFlags
+GST_TYPE_TCP_CLIENT_SINK
+gst_tcp_client_sink_get_type
+GST_IS_TCP_CLIENT_SINK_CLASS
+GST_IS_TCP_CLIENT_SINK
+</SECTION>
+
+<SECTION>
+<FILE>element-tcpserversrc</FILE>
+<TITLE>tcpserversrc</TITLE>
+GstTCPServerSrc
+<SUBSECTION Standard>
+GstTCPServerSrcClass
+GST_TCP_SERVER_SRC
+GST_TCP_SERVER_SRC_CLASS
+GstTCPServerSrcFlags
+GST_TYPE_TCP_SERVER_SRC
+gst_tcp_server_src_get_type
+GST_IS_TCP_SERVER_SRC_CLASS
+GST_IS_TCP_SERVER_SRC
+</SECTION>
+
+<SECTION>
+<FILE>element-tcpserversink</FILE>
+<TITLE>tcpserversink</TITLE>
+GstTCPServerSink
+<SUBSECTION Standard>
+GstTCPServerSinkClass
+GST_TCP_SERVER_SINK
+GST_TCP_SERVER_SINK_CLASS
+GstTCPServerSinkFlags
+GST_TYPE_TCP_SERVER_SINK
+gst_tcp_server_sink_get_type
+GST_IS_TCP_SERVER_SINK_CLASS
+GST_IS_TCP_SERVER_SINK
+TCP_DEFAULT_HOST
+TCP_DEFAULT_PORT
+TCP_HIGHEST_PORT
+gst_tcp_gdp_read_buffer
+gst_tcp_gdp_read_caps
+gst_tcp_gdp_read_event
+gst_tcp_gdp_write_buffer
+gst_tcp_gdp_write_caps
+gst_tcp_gdp_write_event
+gst_tcp_host_to_ip
+gst_tcp_read_buffer
+gst_tcp_socket_close
+gst_tcp_socket_write
+</SECTION>
+
+<SECTION>
+<FILE>element-textoverlay</FILE>
+<TITLE>textoverlay</TITLE>
+GstTextOverlay
+GstTextOverlayVAlign
+GstTextOverlayHAlign
+GstTextOverlayWrapMode
+<SUBSECTION Standard>
+GST_TEXT_OVERLAY
+GST_TEXT_OVERLAY_CLASS
+GST_TEXT_OVERLAY_GET_CLASS
+GST_IS_TEXT_OVERLAY
+GST_IS_TEXT_OVERLAY_CLASS
+GST_TYPE_TEXT_OVERLAY
+GstTextOverlayClass
+gst_text_overlay_get_type
+GstTextOverlayLineAlign
+</SECTION>
+
+<SECTION>
+<FILE>element-textrender</FILE>
+<TITLE>textrender</TITLE>
+GstTextRender
+<SUBSECTION Standard>
+GST_TEXT_RENDER
+GST_TEXT_RENDER_CLASS
+GST_TEXT_RENDER_GET_CLASS
+GST_IS_TEXT_RENDER
+GST_IS_TEXT_RENDER_CLASS
+GST_TYPE_TEXT_RENDER
+GstTextRenderClass
+gst_text_render_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-theoradec</FILE>
+<TITLE>theoradec</TITLE>
+GstTheoraDec
+<SUBSECTION Standard>
+GST_THEORA_DEC
+GST_IS_THEORA_DEC
+GST_TYPE_THEORA_DEC
+GST_THEORA_DEC_CLASS
+GST_IS_THEORA_DEC_CLASS
+GstTheoraDecClass
+</SECTION>
+
+<SECTION>
+<FILE>element-theoraenc</FILE>
+<TITLE>theoraenc</TITLE>
+GstTheoraEnc
+GstTheoraEncBorderMode
+<SUBSECTION Standard>
+GST_THEORA_ENC
+GST_THEORA_ENC_CLASS
+GST_IS_THEORA_ENC
+GST_IS_THEORA_ENC_CLASS
+GST_TYPE_THEORA_ENC
+GstTheoraEncClass
+</SECTION>
+
+<SECTION>
+<FILE>element-theoraparse</FILE>
+<TITLE>theoraparse</TITLE>
+GstTheoraParse
+<SUBSECTION Standard>
+GstTheoraParseClass
+GST_THEORA_PARSE
+GST_IS_THEORA_PARSE
+GST_TYPE_THEORA_PARSE
+gst_theora_parse_get_type
+GST_THEORA_PARSE_CLASS
+GST_IS_THEORA_PARSE_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-timeoverlay</FILE>
+<TITLE>timeoverlay</TITLE>
+GstTimeOverlay
+<SUBSECTION Standard>
+GST_TIME_OVERLAY
+GST_TIME_OVERLAY_CLASS
+GST_IS_TIME_OVERLAY
+GST_IS_TIME_OVERLAY_CLASS
+GST_TYPE_TIME_OVERLAY
+GstTimeOverlayClass
+gst_time_overlay_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-uridecodebin</FILE>
+<TITLE>uridecodebin</TITLE>
+GstURIDecodeBin
+GstAutoplugSelectResult
+<SUBSECTION Standard>
+GST_TYPE_AUTOPLUG_SELECT_RESULT
+gst_autoplug_select_result_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-videorate</FILE>
+<TITLE>videorate</TITLE>
+GstVideoRate
+<SUBSECTION Standard>
+GstVideoRateClass
+GST_VIDEO_RATE
+GST_IS_VIDEO_RATE
+GST_TYPE_VIDEO_RATE
+GST_VIDEO_RATE_CLASS
+GST_IS_VIDEO_RATE_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-videoscale</FILE>
+<TITLE>videoscale</TITLE>
+GstVideoScale
+GstVideoScaleMethod
+<SUBSECTION Standard>
+GstVideoScaleClass
+GST_CAT_DEFAULT
+GST_VIDEO_SCALE
+GST_IS_VIDEO_SCALE
+GST_TYPE_VIDEO_SCALE
+gst_video_scale_get_type
+GST_VIDEO_SCALE_CLASS
+GST_IS_VIDEO_SCALE_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-videotestsrc</FILE>
+<TITLE>videotestsrc</TITLE>
+GstVideoTestSrc
+GstVideoTestSrcPattern
+GstVideoTestSrcColorSpec
+<SUBSECTION Standard>
+GST_VIDEO_TEST_SRC
+GST_VIDEO_TEST_SRC_CLASS
+GST_IS_VIDEO_TEST_SRC
+GST_IS_VIDEO_TEST_SRC_CLASS
+GST_TYPE_VIDEO_TEST_SRC
+GstVideoTestSrcClass
+gst_video_test_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-volume</FILE>
+<TITLE>volume</TITLE>
+GstVolume
+<SUBSECTION Standard>
+GST_VOLUME
+GST_VOLUME_CLASS
+GST_IS_VOLUME
+GST_IS_VOLUME_CLASS
+GST_TYPE_VOLUME
+GstVolumeClass
+gst_volume_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vorbisdec</FILE>
+<TITLE>vorbisdec</TITLE>
+GstVorbisDec
+<SUBSECTION Standard>
+GstVorbisDecClass
+GST_VORBIS_DEC
+GST_IS_VORBIS_DEC
+GST_TYPE_VORBIS_DEC
+gst_vorbis_dec_get_type
+GST_VORBIS_DEC_CLASS
+GST_IS_VORBIS_DEC_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-vorbisenc</FILE>
+<TITLE>vorbisenc</TITLE>
+GstVorbisEnc
+<SUBSECTION Standard>
+GstVorbisEncClass
+GST_IS_VORBISENC
+GST_VORBISENC_CLASS
+GST_VORBISENC
+GST_TYPE_VORBISENC
+GST_IS_VORBISENC_CLASS
+gst_vorbis_enc_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-vorbisparse</FILE>
+<TITLE>vorbisparse</TITLE>
+GstVorbisParse
+<SUBSECTION Standard>
+GstVorbisParseClass
+GST_VORBIS_PARSE
+GST_IS_VORBIS_PARSE
+GST_TYPE_VORBIS_PARSE
+gst_vorbis_parse_get_type
+GST_VORBIS_PARSE_CLASS
+GST_IS_VORBIS_PARSE_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-vorbistag</FILE>
+<TITLE>vorbistag</TITLE>
+GstVorbisTag
+<SUBSECTION Standard>
+GstVorbisTagClass
+GST_VORBIS_TAG
+GST_IS_VORBIS_TAG
+GST_TYPE_VORBIS_TAG
+gst_vorbis_tag_get_type
+GST_VORBIS_TAG_CLASS
+GST_IS_VORBIS_TAG_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>element-ximagesink</FILE>
+<TITLE>ximagesink</TITLE>
+GstXImageSink
+<SUBSECTION Standard>
+GST_XIMAGESINK
+GST_XIMAGESINK_CLASS
+GST_IS_XIMAGESINK
+GST_IS_XIMAGESINK_CLASS
+GST_TYPE_XIMAGESINK
+gst_ximagesink_get_type
+GstXImageBuffer
+GstXImageBufferClass
+GstXImageSinkClass
+GstXContext
+GstXWindow
+</SECTION>
+
+<SECTION>
+<FILE>element-xvimagesink</FILE>
+<TITLE>xvimagesink</TITLE>
+GstXvImageSink
+<SUBSECTION Standard>
+GST_XVIMAGESINK
+GST_XVIMAGESINK_CLASS
+GST_IS_XVIMAGESINK
+GST_IS_XVIMAGESINK_CLASS
+GST_TYPE_XVIMAGESINK
+gst_xvimagesink_get_type
+GstXvImageBuffer
+GstXvImageBufferClass
+GstXvImageFormat
+GstXvImageSinkClass
+</SECTION>
diff --git a/docs/plugins/gst-plugins-base-plugins.args b/docs/plugins/gst-plugins-base-plugins.args
new file mode 100644
index 0000000..ffb6e3f
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.args
@@ -0,0 +1,3510 @@
+<ARG>
+<NAME>GstXvImageSink::brightness</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1000,1000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Brightness</NICK>
+<BLURB>The brightness of the video.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::contrast</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1000,1000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Contrast</NICK>
+<BLURB>The contrast of the video.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::display</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display</NICK>
+<BLURB>X Display name.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::hue</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1000,1000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Hue</NICK>
+<BLURB>The hue of the video.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::pixel-aspect-ratio</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pixel Aspect Ratio</NICK>
+<BLURB>The pixel aspect ratio of the device.</BLURB>
+<DEFAULT>"1/1"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::saturation</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1000,1000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Saturation</NICK>
+<BLURB>The saturation of the video.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::synchronous</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Synchronous</NICK>
+<BLURB>When enabled, runs the X display in synchronous mode. (used only for debugging).</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::force-aspect-ratio</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Force aspect ratio</NICK>
+<BLURB>When enabled, scaling will respect original aspect ratio.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::device</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Adaptor number</NICK>
+<BLURB>The number of the video adaptor.</BLURB>
+<DEFAULT>"0"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::device-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Adaptor name</NICK>
+<BLURB>The name of the video adaptor.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::handle-events</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Handle XEvents</NICK>
+<BLURB>When enabled, XEvents will be selected and handled.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::double-buffer</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Double-buffer</NICK>
+<BLURB>Whether to double-buffer the output.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::handle-expose</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Handle expose</NICK>
+<BLURB>When enabled, the current frame will always be drawn in response to X Expose events.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::autopaint-colorkey</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Autofill with colorkey</NICK>
+<BLURB>Whether to autofill overlay with colorkey.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::colorkey</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Colorkey</NICK>
+<BLURB>Color to use for the overlay mask.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::draw-borders</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Colorkey</NICK>
+<BLURB>Draw black borders to fill unused area in force-aspect-ratio mode.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::window-height</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>window-height</NICK>
+<BLURB>Height of the window.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXvImageSink::window-width</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>window-width</NICK>
+<BLURB>Width of the window.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::display</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Display</NICK>
+<BLURB>X Display name.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::pixel-aspect-ratio</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pixel Aspect Ratio</NICK>
+<BLURB>The pixel aspect ratio of the device.</BLURB>
+<DEFAULT>"1/1"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::synchronous</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Synchronous</NICK>
+<BLURB>When enabled, runs the X display in synchronous mode. (used only for debugging).</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::force-aspect-ratio</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Force aspect ratio</NICK>
+<BLURB>When enabled, reverse caps negotiation (scaling) will respect original aspect ratio.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::handle-events</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Handle XEvents</NICK>
+<BLURB>When enabled, XEvents will be selected and handled.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::handle-expose</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Handle expose</NICK>
+<BLURB>When enabled, the current frame will always be drawn in response to X Expose events.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::window-height</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>window-height</NICK>
+<BLURB>Height of the window.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstXImageSink::window-width</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>window-width</NICK>
+<BLURB>Width of the window.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstV4lSrc::autoprobe</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Autoprobe</NICK>
+<BLURB>Whether the device should be probed for all possible features.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstV4lSrc::autoprobe-fps</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Autoprobe FPS</NICK>
+<BLURB>Whether the device should be probed for framerates.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstV4lSrc::copy-mode</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Copy mode</NICK>
+<BLURB>Whether to send out copies of buffers, or direct pointers to the mmap region.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstV4lSrc::timestamp-offset</NAME>
+<TYPE>gint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Timestamp offset</NICK>
+<BLURB>A time offset subtracted from timestamps set on buffers (in ns).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioresample::filter-length</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>filter length</NICK>
+<BLURB>Length of the resample filter.</BLURB>
+<DEFAULT>16</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVolume::mute</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mute</NICK>
+<BLURB>mute channel.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVolume::volume</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Volume</NICK>
+<BLURB>volume factor, 1.0=100%.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::pattern</NAME>
+<TYPE>GstVideoTestSrcPattern</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pattern</NICK>
+<BLURB>Type of test pattern to generate.</BLURB>
+<DEFAULT>SMPTE 100% color bars</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::timestamp-offset</NAME>
+<TYPE>gint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Timestamp offset</NICK>
+<BLURB>An offset added to timestamps set on buffers (in ns).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::is-live</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Is Live</NICK>
+<BLURB>Whether to act as a live source.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::peer-alloc</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Peer Alloc</NICK>
+<BLURB>Ask the peer to allocate an output buffer.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::colorspec</NAME>
+<TYPE>GstVideoTestSrcColorSpec</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color Specification</NICK>
+<BLURB>Generate video in the given color specification (Deprecated: use a caps filter with video/x-raw-yuv,color-matrix="sdtv" or "hdtv" instead).</BLURB>
+<DEFAULT>ITU-R Rec. BT.601</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::k0</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate zero order phase</NICK>
+<BLURB>Zoneplate zero order phase, for generating plain fields or phase offsets.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kt</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 1st order t phase</NICK>
+<BLURB>Zoneplate 1st order t phase, for generating phase rotation as a function of time.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kt2</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 2nd order t phase</NICK>
+<BLURB>Zoneplate 2nd order t phase, t*t/256 cycles per picture.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kx</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 1st order x phase</NICK>
+<BLURB>Zoneplate 1st order x phase, for generating constant horizontal frequencies.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kx2</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 2nd order x phase</NICK>
+<BLURB>Zoneplate 2nd order x phase, normalised to kx2/256 cycles per horizontal pixel at width/2 from origin.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kxt</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate x*t product phase</NICK>
+<BLURB>Zoneplate x*t product phase, normalised to kxy/256 cycles per vertical pixel at width/2 from origin.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kxy</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate x*y product phase</NICK>
+<BLURB>Zoneplate x*y product phase.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::ky</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 1st order y phase</NICK>
+<BLURB>Zoneplate 1st order y phase, for generating contant vertical frequencies.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::ky2</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 2nd order y phase</NICK>
+<BLURB>Zoneplate 2nd order y phase, normailsed to ky2/256 cycles per vertical pixel at height/2 from origin.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::kyt</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate y*t product phase</NICK>
+<BLURB>Zoneplate y*t product phase.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::xoffset</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 2nd order products x offset</NICK>
+<BLURB>Zoneplate 2nd order products x offset.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::yoffset</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Zoneplate 2nd order products y offset</NICK>
+<BLURB>Zoneplate 2nd order products y offset.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::background-color</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Background Color</NICK>
+<BLURB>Background color to use (big-endian ARGB).</BLURB>
+<DEFAULT>4278190080</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::foreground-color</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Foreground Color</NICK>
+<BLURB>Foreground color to use (big-endian ARGB).</BLURB>
+<DEFAULT>4294967295</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoTestSrc::horizontal-speed</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Horizontal Speed</NICK>
+<BLURB>Scroll image number of pixels per frame (positive is scroll to the left).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoscale::method</NAME>
+<TYPE>GstVideoscaleMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>method</NICK>
+<BLURB>method.</BLURB>
+<DEFAULT>Nearest Neighbour</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::drop</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Drop</NICK>
+<BLURB>Number of dropped frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::duplicate</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Duplicate</NICK>
+<BLURB>Number of duplicated frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::in</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>In</NICK>
+<BLURB>Number of input frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::new-pref</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>New Pref</NICK>
+<BLURB>Value indicating how much to prefer new frames.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::out</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Out</NICK>
+<BLURB>Number of output frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideorate::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>Don't emit notify for dropped and duplicated frames.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSink::host</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Host</NICK>
+<BLURB>The host/IP to send the packets to.</BLURB>
+<DEFAULT>"localhost"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSink::port</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,65535]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Port</NICK>
+<BLURB>The port to send the packets to.</BLURB>
+<DEFAULT>4953</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSink::protocol</NAME>
+<TYPE>GstTCPProtocol</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Protocol</NICK>
+<BLURB>The protocol to wrap data in.</BLURB>
+<DEFAULT>GST_TCP_PROTOCOL_NONE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSrc::host</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Host</NICK>
+<BLURB>The host IP address to receive packets from.</BLURB>
+<DEFAULT>"localhost"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSrc::port</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,65535]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Port</NICK>
+<BLURB>The port to receive packets from.</BLURB>
+<DEFAULT>4953</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPClientSrc::protocol</NAME>
+<TYPE>GstTCPProtocol</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Protocol</NICK>
+<BLURB>The protocol to wrap data in.</BLURB>
+<DEFAULT>GST_TCP_PROTOCOL_NONE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPServerSink::host</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>host</NICK>
+<BLURB>The host/IP to send the packets to.</BLURB>
+<DEFAULT>"localhost"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPServerSink::port</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,65535]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>port</NICK>
+<BLURB>The port to send the packets to.</BLURB>
+<DEFAULT>4953</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPServerSrc::host</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Host</NICK>
+<BLURB>The hostname to listen as.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPServerSrc::port</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,65535]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Port</NICK>
+<BLURB>The port to listen to.</BLURB>
+<DEFAULT>4953</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTCPServerSrc::protocol</NAME>
+<TYPE>GstTCPProtocol</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Protocol</NICK>
+<BLURB>The protocol to wrap data in.</BLURB>
+<DEFAULT>GST_TCP_PROTOCOL_NONE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::buffers-max</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffers max</NICK>
+<BLURB>max number of buffers to queue for a client (-1 = no limit).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::buffers-queued</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Buffers queued</NICK>
+<BLURB>Number of buffers currently queued.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::buffers-soft-max</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffers soft max</NICK>
+<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::bytes-served</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Bytes served</NICK>
+<BLURB>Total number of bytes send to all clients.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::bytes-to-serve</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Bytes to serve</NICK>
+<BLURB>Number of bytes received to serve to clients.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::mode</NAME>
+<TYPE>GstFDSetMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mode</NICK>
+<BLURB>The mode for selecting activity on the fds (deprecated).</BLURB>
+<DEFAULT>Poll</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::protocol</NAME>
+<TYPE>GstTCPProtocol</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Protocol</NICK>
+<BLURB>The protocol to wrap data in. GDP protocol here is deprecated. Please use gdppay element.</BLURB>
+<DEFAULT>GST_TCP_PROTOCOL_NONE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::recover-policy</NAME>
+<TYPE>GstRecoverPolicy</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Recover Policy</NICK>
+<BLURB>How to recover when client reaches the soft max.</BLURB>
+<DEFAULT>Do not try to recover</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::sync-clients</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync clients</NICK>
+<BLURB>(DEPRECATED) Sync clients to a keyframe.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::sync-method</NAME>
+<TYPE>GstSyncMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync Method</NICK>
+<BLURB>How to sync new clients to the stream.</BLURB>
+<DEFAULT>Serve starting from the latest buffer</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::timeout</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Timeout</NICK>
+<BLURB>Maximum inactivity timeout in nanoseconds for a client (0 = no limit).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::buffers-min</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffers min</NICK>
+<BLURB>min number of buffers to queue (-1 = as few as possible).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::burst-unit</NAME>
+<TYPE>GstTCPUnitType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Burst unit</NICK>
+<BLURB>The format of the burst units (when sync-method is burst[[-with]-keyframe]).</BLURB>
+<DEFAULT>Undefined</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::burst-value</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Burst value</NICK>
+<BLURB>The amount of burst expressed in burst-unit.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::bytes-min</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Bytes min</NICK>
+<BLURB>min number of bytes to queue (-1 = as little as possible).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::time-min</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Time min</NICK>
+<BLURB>min number of time to queue (-1 = as little as possible).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::unit-type</NAME>
+<TYPE>GstTCPUnitType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Units type</NICK>
+<BLURB>The unit to measure the max/soft-max/queued properties.</BLURB>
+<DEFAULT>Buffers</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::units-max</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Units max</NICK>
+<BLURB>max number of units to queue (-1 = no limit).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::units-soft-max</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Units soft max</NICK>
+<BLURB>Recover client when going over this limit (-1 = no limit).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::qos-dscp</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,63]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>QoS diff srv code point</NICK>
+<BLURB>Quality of Service, differentiated services code point (-1 default).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::handle-read</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Handle Read</NICK>
+<BLURB>Handle client reads and discard the data.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::resend-streamheader</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Resend streamheader</NICK>
+<BLURB>Resend the streamheader if it changes in the caps.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiFdSink::num-fds</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Number of fds</NICK>
+<BLURB>The current number of client file descriptors.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin::threaded</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Threaded</NICK>
+<BLURB>Use threads.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin::sink-caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sink Caps</NICK>
+<BLURB>The caps of the input data. (NULL = use typefind element).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::audio-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Audio Sink</NICK>
+<BLURB>the audio output element to use (NULL = default sink).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::frame</NAME>
+<TYPE>GstBuffer*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Frame</NICK>
+<BLURB>The last frame (NULL = no video available).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::subtitle-font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>Subtitle font description</NICK>
+<BLURB>Pango font description of font to be used for subtitle rendering.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::video-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Video Sink</NICK>
+<BLURB>the video output element to use (NULL = default sink).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::vis-plugin</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Vis plugin</NICK>
+<BLURB>the visualization element to use (NULL = none).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::volume</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>volume</NICK>
+<BLURB>volume.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin::connection-speed</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Connection Speed</NICK>
+<BLURB>Network connection speed in kbps (0 = unknown).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudiorate::add</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Add</NICK>
+<BLURB>Number of added samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudiorate::drop</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Drop</NICK>
+<BLURB>Number of dropped samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudiorate::in</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>In</NICK>
+<BLURB>Number of input samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudiorate::out</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Out</NICK>
+<BLURB>Number of output samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudiorate::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>Don't emit notify for dropped and duplicated frames.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::bitrate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,250001]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target Bitrate</NICK>
+<BLURB>Attempt to encode at a bitrate averaging this (in bps). This uses the bitrate management engine, and is not recommended for most users. Quality is a better alternative. (-1 == disabled).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::last-message</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>last-message</NICK>
+<BLURB>The last status message.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::managed</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Managed</NICK>
+<BLURB>Enable bitrate management engine.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::max-bitrate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,250001]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Maximum Bitrate</NICK>
+<BLURB>Specify a maximum bitrate (in bps). Useful for streaming applications. (-1 == disabled).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::min-bitrate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,250001]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Minimum Bitrate</NICK>
+<BLURB>Specify a minimum bitrate (in bps). Useful for encoding for a fixed-size channel. (-1 == disabled).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVorbisEnc::quality</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[-0.1,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Quality</NICK>
+<BLURB>Specify quality instead of specifying a particular bitrate.</BLURB>
+<DEFAULT>0.3</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraDec::crop</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Crop</NICK>
+<BLURB>Crop the image to the visible region.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::bitrate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,16777215]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Bitrate</NICK>
+<BLURB>Compressed video bitrate (kbps).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::border</NAME>
+<TYPE>GstTheoraEncBorderMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Border</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>Black Border</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::center</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Center</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::keyframe-auto</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keyframe Auto</NICK>
+<BLURB>Automatic keyframe detection.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::keyframe-force</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32768]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keyframe force</NICK>
+<BLURB>Force keyframe every N frames.</BLURB>
+<DEFAULT>64</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::keyframe-freq</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32768]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keyframe frequency</NICK>
+<BLURB>Keyframe frequency.</BLURB>
+<DEFAULT>64</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::keyframe-mindistance</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[1,32768]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keyframe mindistance</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::keyframe-threshold</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,32768]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Keyframe threshold</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>80</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::noise-sensitivity</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,32768]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Noise sensitivity</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::quality</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,63]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Quality</NICK>
+<BLURB>Video quality.</BLURB>
+<DEFAULT>48</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::quick</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Quick</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::sharpness</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sharpness</NICK>
+<BLURB>ignored and kept for API compat only.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::speed-level</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,2]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Speed level</NICK>
+<BLURB>Controls the amount of analysis performed when encoding. Higher values trade compression quality for speed. This property requires libtheora version >= 1.0, and the maximum value may vary based on encoder version.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::cap-overflow</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VP3 Compatible</NICK>
+<BLURB>Enable capping of bit reservoir overflows.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::cap-underflow</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VP3 Compatible</NICK>
+<BLURB>Enable capping of bit reservoir underflows.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::drop-frames</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VP3 Compatible</NICK>
+<BLURB>Allow or disallow frame dropping.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::rate-buffer</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,1000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Rate Control Buffer</NICK>
+<BLURB>Sets the size of the rate control buffer, in units of frames. The default value of 0 instructs the encoder to automatically select an appropriate value.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::vp3-compatible</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>VP3 Compatible</NICK>
+<BLURB>Disables non-VP3 compatible features.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::multipass-cache-file</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Multipass Cache File</NICK>
+<BLURB>Multipass cache file.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraEnc::multipass-mode</NAME>
+<TYPE>GstTheoraEncMultipassMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Multipass mode</NICK>
+<BLURB>Single pass or first/second pass.</BLURB>
+<DEFAULT>Single pass</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::handle</NAME>
+<TYPE>GnomeVFSHandle*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>GnomeVFSHandle</NICK>
+<BLURB>Handle for GnomeVFS.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::iradio-genre</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>iradio-genre</NICK>
+<BLURB>Genre of the stream.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::iradio-mode</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>iradio-mode</NICK>
+<BLURB>Enable internet radio mode (extraction of shoutcast/icecast metadata).</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::iradio-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>iradio-name</NICK>
+<BLURB>Name of the stream.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::iradio-title</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>iradio-title</NICK>
+<BLURB>Name of currently playing song.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::iradio-url</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>iradio-url</NICK>
+<BLURB>Homepage URL for radio stream.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>File Location</NICK>
+<BLURB>Location of the file to read.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSrc::random-access</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>random-mode</NICK>
+<BLURB>Enable random file access.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstOggMux::max-delay</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max delay</NICK>
+<BLURB>Maximum delay in multiplexing streams.</BLURB>
+<DEFAULT>500000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstOggMux::max-page-delay</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max page delay</NICK>
+<BLURB>Maximum delay for sending out a page.</BLURB>
+<DEFAULT>500000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSrc::device</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Device</NICK>
+<BLURB>ALSA device, as defined in an asound configuration file.</BLURB>
+<DEFAULT>"default"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSrc::device-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Device name</NICK>
+<BLURB>Human-readable name of the sound device.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSrc::card-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Card name</NICK>
+<BLURB>Human-readable name of the sound card.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSink::device</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Device</NICK>
+<BLURB>ALSA device, as defined in an asound configuration file.</BLURB>
+<DEFAULT>"default"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSink::device-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Device name</NICK>
+<BLURB>Human-readable name of the sound device.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaSink::card-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Card name</NICK>
+<BLURB>Human-readable name of the sound card.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::freq</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,20000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Frequency</NICK>
+<BLURB>Frequency of test signal.</BLURB>
+<DEFAULT>440</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::is-live</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Is Live</NICK>
+<BLURB>Whether to act as a live source.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::samplesperbuffer</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Samples per buffer</NICK>
+<BLURB>Number of samples in each outgoing buffer.</BLURB>
+<DEFAULT>1024</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::timestamp-offset</NAME>
+<TYPE>gint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Timestamp offset</NICK>
+<BLURB>An offset added to timestamps set on buffers (in ns).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::volume</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Volume</NICK>
+<BLURB>Volume of test signal.</BLURB>
+<DEFAULT>0.8</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::wave</NAME>
+<TYPE>GstAudioTestSrcWave</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Waveform</NICK>
+<BLURB>Oscillator waveform.</BLURB>
+<DEFAULT>Sine</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::can-activate-pull</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Can activate pull</NICK>
+<BLURB>Can activate in pull mode.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioTestSrc::can-activate-push</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Can activate push</NICK>
+<BLURB>Can activate in push mode.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoScale::method</NAME>
+<TYPE>GstVideoScaleMethod</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>method</NICK>
+<BLURB>method.</BLURB>
+<DEFAULT>Bilinear</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoScale::add-borders</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Add Borders</NICK>
+<BLURB>Add black borders if necessary to keep the display aspect ratio.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::drop</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Drop</NICK>
+<BLURB>Number of dropped frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::duplicate</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Duplicate</NICK>
+<BLURB>Number of duplicated frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::in</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>In</NICK>
+<BLURB>Number of input frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::new-pref</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>New Pref</NICK>
+<BLURB>Value indicating how much to prefer new frames (unused).</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::out</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Out</NICK>
+<BLURB>Number of output frames.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>Don't emit notify for dropped and duplicated frames.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::skip-to-first</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Skip to first buffer</NICK>
+<BLURB>Don't produce buffers before the first one we receive.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::average-period</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXINT64</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Period over which to average</NICK>
+<BLURB>Period over which to average the framerate (in ns) (0 = disabled).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstVideoRate::drop-only</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Only Drop</NICK>
+<BLURB>Only drop frames, no duplicates are produced.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::add</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Add</NICK>
+<BLURB>Number of added samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::drop</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Drop</NICK>
+<BLURB>Number of dropped samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::in</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>In</NICK>
+<BLURB>Number of input samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::out</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Out</NICK>
+<BLURB>Number of output samples.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>Don't emit notify for dropped and duplicated frames.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::tolerance</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>tolerance</NICK>
+<BLURB>Only act if timestamp jitter/imperfection exceeds indicated tolerance (ns).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioRate::skip-to-first</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Skip to first buffer</NICK>
+<BLURB>Don't produce buffers before the first one we receive.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>font description</NICK>
+<BLURB>Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::halignment</NAME>
+<TYPE>GstTextRenderHAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>horizontal alignment</NICK>
+<BLURB>Horizontal alignment of the text.</BLURB>
+<DEFAULT>center</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::line-alignment</NAME>
+<TYPE>GstTextRenderLineAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>line alignment</NICK>
+<BLURB>Alignment of text lines relative to each other.</BLURB>
+<DEFAULT>center</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::valignment</NAME>
+<TYPE>GstTextRenderVAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical alignment</NICK>
+<BLURB>Vertical alignment of the text.</BLURB>
+<DEFAULT>baseline</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::xpad</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>horizontal paddding</NICK>
+<BLURB>Horizontal paddding when using left/right alignment.</BLURB>
+<DEFAULT>25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextRender::ypad</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical padding</NICK>
+<BLURB>Vertical padding when using top/bottom alignment.</BLURB>
+<DEFAULT>25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::deltax</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>X position modifier</NICK>
+<BLURB>Shift X position to the left or to the right. Unit is pixels.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::deltay</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Y position modifier</NICK>
+<BLURB>Shift Y position up or down. Unit is pixels.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>font description</NICK>
+<BLURB>Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::halign</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>horizontal alignment</NICK>
+<BLURB>Horizontal alignment of the text (deprecated; use halignment).</BLURB>
+<DEFAULT>"center"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::shaded-background</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>shaded background</NICK>
+<BLURB>Whether to shade the background under the text area.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::text</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>text</NICK>
+<BLURB>Text to be display.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::valign</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>vertical alignment</NICK>
+<BLURB>Vertical alignment of the text (deprecated; use valignment).</BLURB>
+<DEFAULT>"baseline"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::wrap-mode</NAME>
+<TYPE>GstTextOverlayWrapMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>wrap mode</NICK>
+<BLURB>Whether to wrap the text and if so how.</BLURB>
+<DEFAULT>wordchar</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::xpad</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>horizontal paddding</NICK>
+<BLURB>Horizontal paddding when using left/right alignment.</BLURB>
+<DEFAULT>25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::ypad</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical padding</NICK>
+<BLURB>Vertical padding when using top/bottom alignment.</BLURB>
+<DEFAULT>25</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::halignment</NAME>
+<TYPE>GstTextOverlayHAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>horizontal alignment</NICK>
+<BLURB>Horizontal alignment of the text.</BLURB>
+<DEFAULT>center</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::valignment</NAME>
+<TYPE>GstTextOverlayVAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical alignment</NICK>
+<BLURB>Vertical alignment of the text.</BLURB>
+<DEFAULT>baseline</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::line-alignment</NAME>
+<TYPE>GstTextOverlayLineAlign</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>line alignment</NICK>
+<BLURB>Alignment of text lines relative to each other.</BLURB>
+<DEFAULT>center</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>Whether to render the text string.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::wait-text</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Wait Text</NICK>
+<BLURB>Whether to wait for subtitles.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::auto-resize</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>auto resize</NICK>
+<BLURB>Automatically adjust font size to screen-size.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::vertical-render</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical render</NICK>
+<BLURB>Vertical Render.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::color</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Color</NICK>
+<BLURB>Color to use for text (big-endian ARGB).</BLURB>
+<DEFAULT>4294967295</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::xpos</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>horizontal position</NICK>
+<BLURB>Horizontal position when using position alignment.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTextOverlay::ypos</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>vertical position</NICK>
+<BLURB>Vertical position when using position alignment.</BLURB>
+<DEFAULT>0.5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::abort-on-skip</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Abort on skip</NICK>
+<BLURB>Abort on imperfect reads/skips.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::default-sectors</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Default sectors</NICK>
+<BLURB>Force default number of sectors in read to n sectors.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::device</NAME>
+<TYPE>gchararray</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Device</NICK>
+<BLURB>CD device location.</BLURB>
+<DEFAULT>"/dev/cdrom"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::discid</NAME>
+<TYPE>gchararray</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>discid</NICK>
+<BLURB>The dics id.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::endian</NAME>
+<TYPE>GstParanoiaEndian</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Endian</NICK>
+<BLURB>Force endian on drive.</BLURB>
+<DEFAULT>treat drive as little endian</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::generic-device</NAME>
+<TYPE>gchararray</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Generic device</NICK>
+<BLURB>Use specified generic scsi device.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::never-skip</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Never skip</NICK>
+<BLURB>never accept any less than perfect data reconstruction (don't allow 'V's) but if [n] is given, skip after [n] retries without progress.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::paranoia-mode</NAME>
+<TYPE>GstParanoiaMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Paranoia mode</NICK>
+<BLURB>Type of checking to perform.</BLURB>
+<DEFAULT>Disable paranoid checking</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::read-speed</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Read speed</NICK>
+<BLURB>Read from device at specified speed.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::search-overlap</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,75]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Search overlap</NICK>
+<BLURB>Force minimum overlap search during verification to n sectors.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::toc-bias</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>TOC bias</NICK>
+<BLURB>Assume that the beginning offset of track 1 as reported in the TOC will be addressed as LBA 0. Necessary for some Toshiba drives to get track boundaries.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>CDParanoia::toc-offset</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>TOC offset</NICK>
+<BLURB>Add <n> sectors to the values reported.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaMixerElement::device</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Device</NICK>
+<BLURB>ALSA device, as defined in an asound configuration file.</BLURB>
+<DEFAULT>"default"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAlsaMixerElement::device-name</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Device name</NICK>
+<BLURB>Human-readable name of the sound device.</BLURB>
+<DEFAULT>""</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSink::handle</NAME>
+<TYPE>GnomeVFSHandle*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>GnomeVFSHandle</NICK>
+<BLURB>Handle for GnomeVFS.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSink::location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>File Location</NICK>
+<BLURB>Location of the file to write.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGnomeVFSSink::uri</NAME>
+<TYPE>GnomeVFSURI*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>GnomeVFSURI</NICK>
+<BLURB>URI for GnomeVFS.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCdParanoiaSrc::generic-device</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Generic device</NICK>
+<BLURB>Use specified generic scsi device.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCdParanoiaSrc::paranoia-mode</NAME>
+<TYPE>GstCdParanoiaMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Paranoia mode</NICK>
+<BLURB>Type of checking to perform.</BLURB>
+<DEFAULT>PARANOIA_MODE_FRAGMENT</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCdParanoiaSrc::read-speed</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Read speed</NICK>
+<BLURB>Read from device at specified speed.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCdParanoiaSrc::search-overlap</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[-1,75]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Search overlap</NICK>
+<BLURB>Force minimum overlap search during verification to n sectors.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCdParanoiaSrc::cache-size</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Cache size</NICK>
+<BLURB>Set CD cache size to n sectors (-1 = auto).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSubParse::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle charset encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 or any other Unicode encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSubParse::video-fps</NAME>
+<TYPE>GstFraction</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Video framerate</NICK>
+<BLURB>Framerate of the video stream. This is needed by some subtitle formats to synchronize subtitles and video properly. If not set and the subtitle format requires it subtitles may be out of sync.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTheoraParse::synchronization-points</NAME>
+<TYPE>GValueArray*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Synchronization points</NICK>
+<BLURB>An array of (granuletime, buffertime) pairs.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGDPPay::crc-header</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>CRC Header</NICK>
+<BLURB>Calculate and store a CRC checksum on the header.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGDPPay::crc-payload</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>CRC Payload</NICK>
+<BLURB>Calculate and store a CRC checksum on the payload.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGDPPay::version</NAME>
+<TYPE>GstDPVersion</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Version</NICK>
+<BLURB>Version of the GStreamer Data Protocol.</BLURB>
+<DEFAULT>GST_DP_VERSION_1_0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Caps</NICK>
+<BLURB>The caps on which to stop decoding.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::sink-caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sink Caps</NICK>
+<BLURB>The caps of the input data. (NULL = use typefind element).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::high-percent</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>High percent</NICK>
+<BLURB>High threshold for buffering to finish.</BLURB>
+<DEFAULT>99</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::low-percent</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Low percent</NICK>
+<BLURB>Low threshold for buffering to start.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::max-size-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (buffers)</NICK>
+<BLURB>Max. number of buffers in the queue (0=automatic).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::max-size-bytes</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (bytes)</NICK>
+<BLURB>Max. amount of bytes in the queue (0=automatic).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::max-size-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (ns)</NICK>
+<BLURB>Max. amount of data in the queue (in ns, 0=automatic).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::use-buffering</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use Buffering</NICK>
+<BLURB>Emit GST_MESSAGE_BUFFERING based on low-/high-percent thresholds.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::post-stream-topology</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Post Stream Topology</NICK>
+<BLURB>Post stream-topology messages.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstDecodeBin2::expose-all-streams</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Expose All Streams</NICK>
+<BLURB>Expose all streams, including those of unknown type or that don't match the 'caps' property.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::uri</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>URI</NICK>
+<BLURB>URI to decode.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::connection-speed</NAME>
+<TYPE>guint</TYPE>
+<RANGE><= 4294967</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Connection Speed</NICK>
+<BLURB>Network connection speed in kbps (0 = unknown).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Caps</NICK>
+<BLURB>The caps on which to stop decoding. (NULL = default).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::source</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Source</NICK>
+<BLURB>Source object used.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::buffer-duration</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffer duration (ns)</NICK>
+<BLURB>Buffer duration when buffering streams (-1 default value).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::buffer-size</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffer size (bytes)</NICK>
+<BLURB>Buffer size when buffering streams (-1 default value).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::download</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Download</NICK>
+<BLURB>Attempt download buffering when buffering network streams.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::use-buffering</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use Buffering</NICK>
+<BLURB>Perform buffering on demuxed/parsed media.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::expose-all-streams</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Expose All Streams</NICK>
+<BLURB>Expose all streams, including those of unknown type or that don't match the 'caps' property.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstURIDecodeBin::ring-buffer-max-size</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXULONG</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. ring buffer size (bytes)</NICK>
+<BLURB>Max. amount of data in the ring buffer (bytes, 0 = ring buffer disabled).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::current-level-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Current level (buffers)</NICK>
+<BLURB>Current number of buffers in the queue.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::current-level-bytes</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Current level (kB)</NICK>
+<BLURB>Current amount of data in the queue (bytes).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::current-level-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Current level (ns)</NICK>
+<BLURB>Current amount of data in the queue (in ns).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::high-percent</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>High percent</NICK>
+<BLURB>High threshold for buffering to finish.</BLURB>
+<DEFAULT>99</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::low-percent</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Low percent</NICK>
+<BLURB>Low threshold for buffering to start.</BLURB>
+<DEFAULT>10</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::max-size-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (buffers)</NICK>
+<BLURB>Max. number of buffers in the queue (0=disable).</BLURB>
+<DEFAULT>100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::max-size-bytes</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (kB)</NICK>
+<BLURB>Max. amount of data in the queue (bytes, 0=disable).</BLURB>
+<DEFAULT>2097152</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::max-size-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (ns)</NICK>
+<BLURB>Max. amount of data in the queue (in ns, 0=disable).</BLURB>
+<DEFAULT>2000000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::temp-location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Temporary File Location</NICK>
+<BLURB>Location to store temporary files in (Deprecated: Only read this property, use temp-tmpl to configure the name template).</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::use-buffering</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use buffering</NICK>
+<BLURB>Emit GST_MESSAGE_BUFFERING based on low-/high-percent thresholds.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::use-rate-estimate</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use Rate Estimate</NICK>
+<BLURB>Estimate the bitrate of the stream to calculate time level.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::temp-template</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Temporary File Template</NICK>
+<BLURB>File template to store temporary files in, should contain directory and XXXXXX. (NULL == disabled).</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioConvert::dithering</NAME>
+<TYPE>GstAudioConvertDithering</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Dithering</NICK>
+<BLURB>Selects between different dithering methods.</BLURB>
+<DEFAULT>Triangular dithering (default)</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioConvert::noise-shaping</NAME>
+<TYPE>GstAudioConvertNoiseShaping</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Noise shaping</NICK>
+<BLURB>Selects between different noise shaping methods.</BLURB>
+<DEFAULT>No noise shaping (default)</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::audio-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Audio Sink</NICK>
+<BLURB>the audio output element to use (NULL = default sink).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::connection-speed</NAME>
+<TYPE>guint</TYPE>
+<RANGE><= 4294967</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Connection Speed</NICK>
+<BLURB>Network connection speed in kbps (0 = unknown).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::current-audio</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current audio</NICK>
+<BLURB>Currently playing audio stream (-1 = auto).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::current-text</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current Text</NICK>
+<BLURB>Currently playing text stream (-1 = auto).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::current-video</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current Video</NICK>
+<BLURB>Currently playing video stream (-1 = auto).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::flags</NAME>
+<TYPE>GstPlayFlags</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Flags</NICK>
+<BLURB>Flags to control behaviour.</BLURB>
+<DEFAULT>Render the video stream|Render the audio stream|Render subtitles|Use software volume</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::frame</NAME>
+<TYPE>GstBuffer*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Frame</NICK>
+<BLURB>The last frame (NULL = no video available).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::n-audio</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Number Audio</NICK>
+<BLURB>Total number of audio streams.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::n-text</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Number Text</NICK>
+<BLURB>Total number of text streams.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::n-video</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Number Video</NICK>
+<BLURB>Total number of video streams.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::source</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Source</NICK>
+<BLURB>Source element.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::subtitle-font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>Subtitle font description</NICK>
+<BLURB>Pango font description of font to be used for subtitle rendering.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::suburi</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>.sub-URI</NICK>
+<BLURB>Optional URI of a subtitle.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::uri</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>URI</NICK>
+<BLURB>URI of the media to play.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::video-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Video Sink</NICK>
+<BLURB>the video output element to use (NULL = default sink).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::vis-plugin</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Vis plugin</NICK>
+<BLURB>the visualization element to use (NULL = default).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::volume</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Volume</NICK>
+<BLURB>The audio volume, 1.0=100%.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::mute</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mute</NICK>
+<BLURB>Mute the audio channel without changing the volume.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::buffer-duration</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffer duration (ns)</NICK>
+<BLURB>Buffer duration when buffering network streams.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::buffer-size</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffer size (bytes)</NICK>
+<BLURB>Buffer size when buffering network streams.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::text-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Text plugin</NICK>
+<BLURB>the text output element to use (NULL = default textoverlay).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::subpic-sink</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Subpicture plugin</NICK>
+<BLURB>the subpicture output element to use (NULL = default dvdspu).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::av-offset</NAME>
+<TYPE>gint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>AV Offset</NICK>
+<BLURB>The synchronisation offset between audio and video in nanoseconds.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBin2::ring-buffer-max-size</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXULONG</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. ring buffer size (bytes)</NICK>
+<BLURB>Max. amount of data in the ring buffer (bytes, 0 = ring buffer disabled).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioSink::location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Location</NICK>
+<BLURB>URI location to write to.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioSink::file</NAME>
+<TYPE>GFile*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>File</NICK>
+<BLURB>GFile to write to.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioSrc::location</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Location</NICK>
+<BLURB>URI location to read from.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioSrc::file</NAME>
+<TYPE>GFile*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>File</NICK>
+<BLURB>GFile to read from.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioStreamSink::stream</NAME>
+<TYPE>GOutputStream*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Stream</NICK>
+<BLURB>Stream to write to.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGioStreamSrc::stream</NAME>
+<TYPE>GInputStream*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Stream</NICK>
+<BLURB>Stream to read from.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::connection-speed</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Connection Speed</NICK>
+<BLURB>Network connection speed in kbps (0 = unknown).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::current-audio</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current audio</NICK>
+<BLURB>Currently playing audio stream (-1 = none).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::current-text</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current text</NICK>
+<BLURB>Currently playing text stream (-1 = none).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::current-video</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Current video</NICK>
+<BLURB>Currently playing video stream (-1 = none).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::nstreams</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>NStreams</NICK>
+<BLURB>number of streams.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::queue-min-threshold</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXINT64</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Queue min threshold</NICK>
+<BLURB>Buffering low threshold of internal queues in nanoseconds.</BLURB>
+<DEFAULT>900000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::queue-size</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXINT64</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Queue size</NICK>
+<BLURB>Size of internal queues in nanoseconds.</BLURB>
+<DEFAULT>3000000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::queue-threshold</NAME>
+<TYPE>guint64</TYPE>
+<RANGE><= G_MAXINT64</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Queue threshold</NICK>
+<BLURB>Buffering threshold of internal queues in nanoseconds.</BLURB>
+<DEFAULT>2850000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::source</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Source</NICK>
+<BLURB>Source element.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::stream-info</NAME>
+<TYPE>gpointer</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Stream info</NICK>
+<BLURB>List of streaminfo.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::stream-info-value-array</NAME>
+<TYPE>GValueArray*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>StreamInfo GValueArray</NICK>
+<BLURB>value array of streaminfo.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::suburi</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>.sub-URI</NICK>
+<BLURB>Optional URI of a subtitle.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlayBaseBin::uri</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>URI</NICK>
+<BLURB>URI of the media to play.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSpeexResample::filter-length</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Filter length</NICK>
+<BLURB>DEPRECATED, DON'T USE THIS! Length of the resample filter.</BLURB>
+<DEFAULT>64</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSpeexResample::quality</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Quality</NICK>
+<BLURB>Resample quality with 0 being the lowest and 10 being the best.</BLURB>
+<DEFAULT>4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstClockOverlay::time-format</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Date/Time Format</NICK>
+<BLURB>Format to use for time and date value, as in strftime.</BLURB>
+<DEFAULT>"%H:%M:%S"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSink::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Caps</NICK>
+<BLURB>The allowed caps for the sink pad.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSink::drop</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Drop</NICK>
+<BLURB>Drop old buffers when the buffer queue is filled.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSink::emit-signals</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Emit signals</NICK>
+<BLURB>Emit new-preroll, new-buffer and new-buffer-list signals.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSink::eos</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>EOS</NICK>
+<BLURB>Check if the sink is EOS or not started.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSink::max-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max Buffers</NICK>
+<BLURB>The maximum number of buffers to queue internally (0 = unlimited).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::block</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Block</NICK>
+<BLURB>Block push-buffer when max-bytes are queued.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Caps</NICK>
+<BLURB>The allowed caps for the src pad.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::format</NAME>
+<TYPE>GstFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Format</NICK>
+<BLURB>The format of the segment events and seek.</BLURB>
+<DEFAULT>GST_FORMAT_BYTES</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::is-live</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Is Live</NICK>
+<BLURB>Whether to act as a live source.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::max-bytes</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max bytes</NICK>
+<BLURB>The maximum number of bytes to queue internally (0 = unlimited).</BLURB>
+<DEFAULT>200000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::max-latency</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max Latency</NICK>
+<BLURB>The maximum latency (-1 = unlimited).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::min-latency</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min Latency</NICK>
+<BLURB>The minimum latency (-1 = default).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::size</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Size</NICK>
+<BLURB>The size of the data stream in bytes (-1 if unknown).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::stream-type</NAME>
+<TYPE>GstAppStreamType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Stream Type</NICK>
+<BLURB>the type of the stream.</BLURB>
+<DEFAULT>GST_APP_STREAM_TYPE_STREAM</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::emit-signals</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Emit signals</NICK>
+<BLURB>Emit need-data, enough-data and seek-data signals.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAppSrc::min-percent</NAME>
+<TYPE>guint</TYPE>
+<RANGE><= 100</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min Percent</NICK>
+<BLURB>Emit need-data when queued bytes drops below this percent of max-bytes.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioResample::filter-length</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Filter length</NICK>
+<BLURB>Length of the resample filter.</BLURB>
+<DEFAULT>64</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAudioResample::quality</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Quality</NICK>
+<BLURB>Resample quality with 0 being the lowest and 10 being the best.</BLURB>
+<DEFAULT>4</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstAdder::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Target caps</NICK>
+<BLURB>Set target format for mixing (NULL means ANY). Setting this property takes a reference to the supplied GstCaps object.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::flags</NAME>
+<TYPE>GstPlayFlags</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Flags</NICK>
+<BLURB>Flags to control behaviour.</BLURB>
+<DEFAULT>Render the video stream|Render the audio stream|Render subtitles|Use software volume</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::mute</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Mute</NICK>
+<BLURB>Mute the audio channel without changing the volume.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::subtitle-font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>Subtitle font description</NICK>
+<BLURB>Pango font description of font to be used for subtitle rendering.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::vis-plugin</NAME>
+<TYPE>GstElement*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Vis plugin</NICK>
+<BLURB>the visualization element to use (NULL = default).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::volume</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>[0,10]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Volume</NICK>
+<BLURB>The audio volume, 1.0=100%.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::av-offset</NAME>
+<TYPE>gint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>AV Offset</NICK>
+<BLURB>The synchronisation offset between audio and video in nanoseconds.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPlaySink::frame</NAME>
+<TYPE>GstBuffer*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Frame</NICK>
+<BLURB>The last frame (NULL = no video available).</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSubtitleOverlay::font-desc</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Subtitle font description</NICK>
+<BLURB>Pango font description of font to be used for subtitle rendering.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSubtitleOverlay::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Silent</NICK>
+<BLURB>Whether to show subtitles.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstSubtitleOverlay::subtitle-encoding</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>subtitle encoding</NICK>
+<BLURB>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::audio-jitter-tolerance</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Audio jitter tolerance</NICK>
+<BLURB>Amount of timestamp jitter/imperfection to allow on audio streams before inserting/dropping samples (ns).</BLURB>
+<DEFAULT>20000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::avoid-reencoding</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Avoid re-encoding</NICK>
+<BLURB>Whether to re-encode portions of compatible video streams that lay on segment boundaries.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::profile</NAME>
+<TYPE>GstEncodingProfile*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Profile</NICK>
+<BLURB>The GstEncodingProfile to use.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::queue-buffers-max</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (buffers)</NICK>
+<BLURB>Max. number of buffers in the queue (0=disable).</BLURB>
+<DEFAULT>200</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::queue-bytes-max</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (kB)</NICK>
+<BLURB>Max. amount of data in the queue (bytes, 0=disable).</BLURB>
+<DEFAULT>10485760</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstEncodeBin::queue-time-max</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. size (ns)</NICK>
+<BLURB>Max. amount of data in the queue (in ns, 0=disable).</BLURB>
+<DEFAULT>1000000000</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gst-plugins-base-plugins.hierarchy b/docs/plugins/gst-plugins-base-plugins.hierarchy
new file mode 100644
index 0000000..d28dd63
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.hierarchy
@@ -0,0 +1,139 @@
+GObject
+ GInitiallyUnowned
+ GstObject
+ GstPad
+ GstPadTemplate
+ GstPluginFeature
+ GstElementFactory
+ GstTypeFindFactory
+ GstIndexFactory
+ GstElement
+ GstBin
+ GstPipeline
+ GstPlayBaseBin
+ GstPlayBin
+ GstPlayBin2
+ GstEncodeBin
+ GstDecodeBin
+ GstPlaySink
+ GstSubtitleOverlay
+ GstDecodeBin2
+ GstURIDecodeBin
+ GstVisual
+ GstVisualjess
+ GstVisualbumpscope
+ GstVisualcorona
+ GstVisualinfinite
+ GstVisualjakdaw
+ GstVisuallv_analyzer
+ GstVisuallv_scope
+ GstVisualoinksie
+ GstBaseSrc
+ GstGnomeVFSSrc
+ GstGioBaseSrc
+ GstGioSrc
+ GstGioStreamSrc
+ GstPushSrc
+ GstCddaBaseSrc
+ GstCdParanoiaSrc
+ GstBaseAudioSrc
+ GstAudioSrc
+ GstAlsaSrc
+ GstV4lElement
+ GstV4lSrc
+ GstVideoTestSrc
+ GstTCPClientSrc
+ GstTCPServerSrc
+ GstAppSrc
+ GstAudioTestSrc
+ GstBaseSink
+ GstGnomeVFSSink
+ GstGioBaseSink
+ GstGioSink
+ GstGioStreamSink
+ GstBaseAudioSink
+ GstAudioSink
+ GstAlsaSink
+ GstVideoSink
+ GstXvImageSink
+ GstXImageSink
+ GstAppSink
+ GstTCPClientSink
+ GstMultiFdSink
+ GstTCPServerSink
+ GstTheoraDec
+ GstTheoraEnc
+ GstTheoraParse
+ GstBaseTextOverlay
+ GstTextOverlay
+ GstTimeOverlay
+ GstClockOverlay
+ GstTextRender
+ GstOggDemux
+ GstOggMux
+ GstOgmParse
+ GstOgmAudioParse
+ GstOgmVideoParse
+ GstOgmTextParse
+ GstOggParse
+ GstOggAviParse
+ GstVorbisEnc
+ GstVorbisDec
+ GstVorbisParse
+ GstVorbisTag
+ GstAlsaMixerElement
+ GstSubParse
+ GstSsaParse
+ GstBaseTransform
+ GstAudioFilter
+ GstVolume
+ GstVideoFilter
+ GstVideoScale
+ GstFFMpegCsp
+ GstAudioResample
+ GstAudioConvert
+ GstGDPDepay
+ GstGDPPay
+ GstAudioRate
+ GstAdder
+ GstVideoRate
+ GstStreamSelector
+ GstBus
+ GstTask
+ GstTaskPool
+ GstClock
+ GstSystemClock
+ GstAudioClock
+ GstPlugin
+ GstRegistry
+ GstRingBuffer
+ GstAudioSrcRingBuffer
+ GstAudioSinkRingBuffer
+ GstMixerTrack
+ GstStreamInfo
+ GstEncodingProfile
+ GstTunerNorm
+ GstTunerChannel
+ GstColorBalanceChannel
+ PangoFontMap
+ PangoFcFontMap
+ PangoCairoFcFontMap
+ PangoContext
+ GInputStream
+ GOutputStream
+GInterface
+ GTypePlugin
+ GstChildProxy
+ GstURIHandler
+ GstPreset
+ GstTagSetter
+ GstImplementsInterface
+ GstMixer
+ GstPropertyProbe
+ GstNavigation
+ GstXOverlay
+ GstColorBalance
+ GstTuner
+ GstStreamVolume
+ PangoCairoFontMap
+ GFile
diff --git a/docs/plugins/gst-plugins-base-plugins.interfaces b/docs/plugins/gst-plugins-base-plugins.interfaces
new file mode 100644
index 0000000..4b602b1
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.interfaces
@@ -0,0 +1,32 @@
+GstBin GstChildProxy
+GstPipeline GstChildProxy
+GstPlayBaseBin GstChildProxy
+GstPlayBin GstChildProxy
+GstPlayBin2 GstChildProxy GstStreamVolume
+GstEncodeBin GstChildProxy
+GstDecodeBin GstChildProxy
+GstPlaySink GstChildProxy
+GstSubtitleOverlay GstChildProxy
+GstDecodeBin2 GstChildProxy
+GstURIDecodeBin GstChildProxy
+GstGnomeVFSSrc GstURIHandler
+GstGioSrc GstURIHandler
+GstCddaBaseSrc GstURIHandler
+GstCdParanoiaSrc GstURIHandler
+GstAlsaSrc GstImplementsInterface GstMixer GstPropertyProbe
+GstV4lElement GstImplementsInterface GstTuner GstXOverlay GstColorBalance GstPropertyProbe
+GstV4lSrc GstImplementsInterface GstTuner GstXOverlay GstColorBalance GstPropertyProbe
+GstAppSrc GstURIHandler
+GstGnomeVFSSink GstURIHandler
+GstGioSink GstURIHandler
+GstAlsaSink GstPropertyProbe
+GstXvImageSink GstImplementsInterface GstNavigation GstXOverlay GstColorBalance GstPropertyProbe
+GstXImageSink GstImplementsInterface GstNavigation GstXOverlay
+GstAppSink GstURIHandler
+GstTheoraEnc GstPreset
+GstOggMux GstPreset
+GstVorbisEnc GstTagSetter GstPreset
+GstVorbisTag GstTagSetter
+GstAlsaMixerElement GstImplementsInterface GstMixer GstPropertyProbe
+GstVolume GstImplementsInterface GstMixer GstStreamVolume
+PangoCairoFcFontMap PangoCairoFontMap
diff --git a/docs/plugins/gst-plugins-base-plugins.prerequisites b/docs/plugins/gst-plugins-base-plugins.prerequisites
new file mode 100644
index 0000000..176f319
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.prerequisites
@@ -0,0 +1,10 @@
+GstChildProxy GstObject
+GstTagSetter GstElement
+GstImplementsInterface GstElement
+GstMixer GstImplementsInterface GstElement
+GstXOverlay GstImplementsInterface GstElement
+GstColorBalance GstImplementsInterface GstElement
+GstTuner GstImplementsInterface GstElement
+GstStreamVolume GObject
+PangoCairoFontMap PangoFontMap
+GFile GObject
diff --git a/docs/plugins/gst-plugins-base-plugins.signals b/docs/plugins/gst-plugins-base-plugins.signals
new file mode 100644
index 0000000..67d8e8d
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.signals
@@ -0,0 +1,507 @@
+<SIGNAL>
+<NAME>GstMultiFdSink::add</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::clear</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::client-added</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::client-removed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+GstClientStatus arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::get-stats</NAME>
+<RETURNS>GValueArray*</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::remove</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::client-fd-removed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::add-full</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+GstSyncMethod arg2
+GstTCPUnitType arg3
+guint64 arg4
+GstTCPUnitType arg5
+guint64 arg6
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiFdSink::remove-flush</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstMultiFdSink *gstmultifdsink
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin::new-decoded-pad</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin *gstdecodebin
+GstPad *arg1
+gboolean arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin::removed-decoded-pad</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin *gstdecodebin
+GstPad *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin::unknown-type</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin *gstdecodebin
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>CDParanoia::smilie-change</NAME>
+<RETURNS>void</RETURNS>
+CDParanoia *cdparanoia
+gchar *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>CDParanoia::transport-error</NAME>
+<RETURNS>void</RETURNS>
+CDParanoia *cdparanoia
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>CDParanoia::uncorrected-error</NAME>
+<RETURNS>void</RETURNS>
+CDParanoia *cdparanoia
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstGnomeVFSSink::allow-overwrite</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>c</FLAGS>
+GstGnomeVFSSink *gstgnomevfssink
+GnomeVFSURI *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstCdParanoiaSrc::transport-error</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstCdParanoiaSrc *gstcdparanoiasrc
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstCdParanoiaSrc::uncorrected-error</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstCdParanoiaSrc *gstcdparanoiasrc
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::autoplug-continue</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::autoplug-sort</NAME>
+<RETURNS>GValueArray*</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+GstCaps *arg2
+GValueArray *arg3
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::new-decoded-pad</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+gboolean arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::removed-decoded-pad</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::unknown-type</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::autoplug-factories</NAME>
+<RETURNS>GValueArray*</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::autoplug-select</NAME>
+<RETURNS>GstAutoplugSelectResult</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+GstPad *arg1
+GstCaps *arg2
+GstElementFactory *arg3
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstDecodeBin2::drained</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstDecodeBin2 *gstdecodebin2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::autoplug-continue</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::autoplug-factories</NAME>
+<RETURNS>GValueArray*</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::autoplug-select</NAME>
+<RETURNS>GstAutoplugSelectResult</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstPad *arg1
+GstCaps *arg2
+GstElementFactory *arg3
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::unknown-type</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstPad *arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::drained</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::autoplug-sort</NAME>
+<RETURNS>GValueArray*</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstPad *arg1
+GstCaps *arg2
+GValueArray *arg3
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstURIDecodeBin::source-setup</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstURIDecodeBin *gsturidecodebin
+GstElement *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::about-to-finish</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::audio-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-audio-tags</NAME>
+<RETURNS>GstTagList*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-text-tags</NAME>
+<RETURNS>GstTagList*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-video-tags</NAME>
+<RETURNS>GstTagList*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::text-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::video-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::convert-frame</NAME>
+<RETURNS>GstBuffer*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+GstCaps *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-audio-pad</NAME>
+<RETURNS>GstPad*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-text-pad</NAME>
+<RETURNS>GstPad*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::get-video-pad</NAME>
+<RETURNS>GstPad*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::audio-tags-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::text-tags-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::video-tags-changed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+gint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlayBin2::source-setup</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstPlayBin2 *gstplaybin2
+GstElement *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::eos</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::new-buffer</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::new-preroll</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::pull-buffer</NAME>
+<RETURNS>GstBuffer*</RETURNS>
+<FLAGS>la</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::pull-preroll</NAME>
+<RETURNS>GstBuffer*</RETURNS>
+<FLAGS>la</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::new-buffer-list</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSink::pull-buffer-list</NAME>
+<RETURNS>GstBufferList*</RETURNS>
+<FLAGS>la</FLAGS>
+GstAppSink *gstappsink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSrc::end-of-stream</NAME>
+<RETURNS>GstFlowReturn</RETURNS>
+<FLAGS>la</FLAGS>
+GstAppSrc *gstappsrc
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSrc::enough-data</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSrc *gstappsrc
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSrc::need-data</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSrc *gstappsrc
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSrc::push-buffer</NAME>
+<RETURNS>GstFlowReturn</RETURNS>
+<FLAGS>la</FLAGS>
+GstAppSrc *gstappsrc
+GstBuffer *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstAppSrc::seek-data</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>l</FLAGS>
+GstAppSrc *gstappsrc
+guint64 arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlaySink::reconfigure</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlaySink *gstplaysink
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstPlaySink::convert-frame</NAME>
+<RETURNS>GstBuffer*</RETURNS>
+<FLAGS>la</FLAGS>
+GstPlaySink *gstplaysink
+GstCaps *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstEncodeBin::request-pad</NAME>
+<RETURNS>GstPad*</RETURNS>
+<FLAGS>la</FLAGS>
+GstEncodeBin *gstencodebin
+GstCaps *arg1
+</SIGNAL>
+
diff --git a/docs/plugins/gst-plugins-base-plugins.types b/docs/plugins/gst-plugins-base-plugins.types
new file mode 100644
index 0000000..9f4950e
--- /dev/null
+++ b/docs/plugins/gst-plugins-base-plugins.types
@@ -0,0 +1 @@
+#include <gst/gst.h>
diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html
new file mode 100644
index 0000000..5a32aee
--- /dev/null
+++ b/docs/plugins/html/ch01.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gst-plugins-base Elements</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="prev" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="next" href="gst-plugins-base-plugins-adder.html" title="adder">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-adder.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id435033"></a>gst-plugins-base Elements</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-adder.html">adder</a></span><span class="refpurpose"> — Add N audio channels together</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-appsrc.html">appsrc</a></span><span class="refpurpose"> — Allow the application to feed buffers to a pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-appsink.html">appsink</a></span><span class="refpurpose"> — Allow the application to get access to raw buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsamixer.html">alsamixer</a></span><span class="refpurpose"> — Control sound input and output levels with ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsasink.html">alsasink</a></span><span class="refpurpose"> — Output to a sound card via ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsasrc.html">alsasrc</a></span><span class="refpurpose"> — Read from a sound card via ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audioconvert.html">audioconvert</a></span><span class="refpurpose"> — Convert audio to different formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audiorate.html">audiorate</a></span><span class="refpurpose"> — Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audioresample.html">audioresample</a></span><span class="refpurpose"> — Resamples audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audiotestsrc.html">audiotestsrc</a></span><span class="refpurpose"> — Creates audio test signals of given frequency and volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-cdparanoiasrc.html">cdparanoiasrc</a></span><span class="refpurpose"> — Read audio from CD in paranoid mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-clockoverlay.html">clockoverlay</a></span><span class="refpurpose"> — Overlays the current clock time on a video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-decodebin.html">decodebin</a></span><span class="refpurpose"> — Autoplug and decode to raw media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-encodebin.html">encodebin</a></span><span class="refpurpose"> — Convenience encoding/muxing element</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videoconvert.html">videoconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-gdpdepay.html">gdpdepay</a></span><span class="refpurpose"> — Depayloads GStreamer Data Protocol buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-gdppay.html">gdppay</a></span><span class="refpurpose"> — Payloads GStreamer Data Protocol buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giosink.html">giosink</a></span><span class="refpurpose"> — Write to any GIO-supported location</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giosrc.html">giosrc</a></span><span class="refpurpose"> — Read from any GIO-supported location</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giostreamsink.html">giostreamsink</a></span><span class="refpurpose"> — Write to any GIO stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giostreamsrc.html">giostreamsrc</a></span><span class="refpurpose"> — Read from any GIO stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-multifdsink.html">multifdsink</a></span><span class="refpurpose"> — Send data to multiple filedescriptors</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-oggdemux.html">oggdemux</a></span><span class="refpurpose"> — demux ogg streams (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-oggmux.html">oggmux</a></span><span class="refpurpose"> — mux ogg streams (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-playbin.html">playbin</a></span><span class="refpurpose"> — Autoplug and play media from an uri</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-subtitleoverlay.html">subtitleoverlay</a></span><span class="refpurpose"> — Overlays a video stream with subtitles</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpclientsrc.html">tcpclientsrc</a></span><span class="refpurpose"> — Receive data as a client over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpclientsink.html">tcpclientsink</a></span><span class="refpurpose"> — Send data as a client over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpserversrc.html">tcpserversrc</a></span><span class="refpurpose"> — Receive data as a server over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpserversink.html">tcpserversink</a></span><span class="refpurpose"> — Send data as a server over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-textoverlay.html">textoverlay</a></span><span class="refpurpose"> — Adds text strings on top of a video buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-textrender.html">textrender</a></span><span class="refpurpose"> — Renders a text string to an image bitmap</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoradec.html">theoradec</a></span><span class="refpurpose"> — decode raw theora streams to raw YUV video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoraenc.html">theoraenc</a></span><span class="refpurpose"> — encode raw YUV video to a theora stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoraparse.html">theoraparse</a></span><span class="refpurpose"> — parse raw theora streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-timeoverlay.html">timeoverlay</a></span><span class="refpurpose"> — Overlays buffer time stamps on a video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-uridecodebin.html">uridecodebin</a></span><span class="refpurpose"> — Autoplug and decode an URI to raw media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videorate.html">videorate</a></span><span class="refpurpose"> — Drops/duplicates/adjusts timestamps on video frames to make a perfect stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videoscale.html">videoscale</a></span><span class="refpurpose"> — Resizes video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videotestsrc.html">videotestsrc</a></span><span class="refpurpose"> — Creates a test video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-volume.html">volume</a></span><span class="refpurpose"> — Set volume on audio/raw streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisdec.html">vorbisdec</a></span><span class="refpurpose"> — decode raw vorbis streams to float audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisenc.html">vorbisenc</a></span><span class="refpurpose"> — Encodes audio in Vorbis format</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisparse.html">vorbisparse</a></span><span class="refpurpose"> — parse raw vorbis streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbistag.html">vorbistag</a></span><span class="refpurpose"> — Retags vorbis streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-ximagesink.html">ximagesink</a></span><span class="refpurpose"> — A standard X based videosink</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-xvimagesink.html">xvimagesink</a></span><span class="refpurpose"> — A Xv based videosink</span>
+</dt>
+</dl></div>
+<span style="color: red">&lt;xi:include&gt;&lt;/xi:include&gt;</span><span style="color: red">&lt;xi:include&gt;&lt;/xi:include&gt;</span>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ 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..55ab127
--- /dev/null
+++ b/docs/plugins/html/ch02.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gst-plugins-base Plugins</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="prev" href="gst-plugins-base-plugins-xvimagesink.html" title="xvimagesink">
+<link rel="next" href="gst-plugins-base-plugins-plugin-adder.html" title="adder">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-xvimagesink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-adder.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id434348"></a>gst-plugins-base Plugins</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-adder.html">adder</a></span><span class="refpurpose"> — <a name="plugin-adder"></a>Adds multiple streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-alsa.html">alsa</a></span><span class="refpurpose"> — <a name="plugin-alsa"></a>ALSA plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-app.html">app</a></span><span class="refpurpose"> — <a name="plugin-app"></a>Elements used to communicate with applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audioconvert.html">audioconvert</a></span><span class="refpurpose"> — <a name="plugin-audioconvert"></a>Convert audio to different formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audiorate.html">audiorate</a></span><span class="refpurpose"> — <a name="plugin-audiorate"></a>Adjusts audio frames</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audioresample.html">audioresample</a></span><span class="refpurpose"> — <a name="plugin-audioresample"></a>Resamples audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audiotestsrc.html">audiotestsrc</a></span><span class="refpurpose"> — <a name="plugin-audiotestsrc"></a>Creates audio test signals of given frequency and volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-cdparanoia.html">cdparanoia</a></span><span class="refpurpose"> — <a name="plugin-cdparanoia"></a>Read audio from CD in paranoid mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-decodebin.html">decodebin</a></span><span class="refpurpose"> — <a name="plugin-decodebin"></a>decoder bin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-encoding.html">encoding</a></span><span class="refpurpose"> — <a name="plugin-encoding"></a>various encoding-related elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-gdp.html">gdp</a></span><span class="refpurpose"> — <a name="plugin-gdp"></a>Payload/depayload GDP packets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-gio.html">gio</a></span><span class="refpurpose"> — <a name="plugin-gio"></a>GIO elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-libvisual.html">libvisual</a></span><span class="refpurpose"> — <a name="plugin-libvisual"></a>libvisual visualization plugins</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-ogg.html">ogg</a></span><span class="refpurpose"> — <a name="plugin-ogg"></a>ogg stream manipulation (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-pango.html">pango</a></span><span class="refpurpose"> — <a name="plugin-pango"></a>Pango-based text rendering and overlay</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-playback.html">playback</a></span><span class="refpurpose"> — <a name="plugin-playback"></a>various playback elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-subparse.html">subparse</a></span><span class="refpurpose"> — <a name="plugin-subparse"></a>Subtitle parsing</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-tcp.html">tcp</a></span><span class="refpurpose"> — <a name="plugin-tcp"></a>transfer data over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-theora.html">theora</a></span><span class="refpurpose"> — <a name="plugin-theora"></a>Theora plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-typefindfunctions.html">typefindfunctions</a></span><span class="refpurpose"> — <a name="plugin-typefindfunctions"></a>default typefind functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-uridecodebin.html">uridecodebin</a></span><span class="refpurpose"> — <a name="plugin-uridecodebin"></a>URI Decoder bin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videorate.html">videorate</a></span><span class="refpurpose"> — <a name="plugin-videorate"></a>Adjusts video frames</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videoscale.html">videoscale</a></span><span class="refpurpose"> — <a name="plugin-videoscale"></a>Resizes video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videotestsrc.html">videotestsrc</a></span><span class="refpurpose"> — <a name="plugin-videotestsrc"></a>Creates a test video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-volume.html">volume</a></span><span class="refpurpose"> — <a name="plugin-volume"></a>plugin for controlling audio volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-vorbis.html">vorbis</a></span><span class="refpurpose"> — <a name="plugin-vorbis"></a>Vorbis plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-ximagesink.html">ximagesink</a></span><span class="refpurpose"> — <a name="plugin-ximagesink"></a>X11 video output element based on standard Xlib calls</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-xvimagesink.html">xvimagesink</a></span><span class="refpurpose"> — <a name="plugin-xvimagesink"></a>XFree86 video output plugin using Xv extension</span>
+</dt>
+</dl></div>
+<span style="color: red">&lt;xi:include&gt;&lt;/xi:include&gt;</span>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ 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..4a140db
--- /dev/null
+++ b/docs/plugins/html/ch03.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gst-plugins-base Classes</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-xvimagesink.html" title="xvimagesink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-xvimagesink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td> </td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="id434484"></a>gst-plugins-base Classes</h2></div></div></div>
+<span style="color: red">&lt;xi:include&gt;&lt;/xi:include&gt;</span>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-adder.html b/docs/plugins/html/gst-plugins-base-plugins-adder.html
new file mode 100644
index 0000000..094375b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-adder.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>adder</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="next" href="gst-plugins-base-plugins-appsrc.html" title="appsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-appsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-adder.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-adder.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-adder.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-adder.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-adder"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-adder.top_of_page"></a>adder</span></h2>
+<p>adder — Add N audio channels together</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-adder.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAdder"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-adder.html#GstAdder-struct" title="struct GstAdder">GstAdder</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-adder.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstAdder
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-adder.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-adder.html#GstAdder--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-adder.description"></a><h2>Description</h2>
+<p>
+The adder allows to mix several streams into one by adding the data.
+Mixed data is clamped to the min/max values of the data format.
+</p>
+<p>
+The adder currently mixes all data received on the sinkpads as soon as
+possible without trying to synchronize the streams.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id473522"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch audiotestsrc freq=100 ! adder name=mix ! audioconvert ! alsasink audiotestsrc freq=500 ! mix.
+</pre></div> This pipeline produces two sine waves mixed together.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-05-09 (0.10.7)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id473497"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-adder.html#plugin-adder">adder</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id500681"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-adder.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAdder-struct"></a><h3>struct GstAdder</h3>
+<pre class="programlisting">struct GstAdder;</pre>
+<p>
+The adder object structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-adder.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAdder--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>Set target format for mixing (NULL means ANY). Setting this property takes a reference to the supplied GstCaps object.</p>
+<p class="since">Since 0.10.24</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-alsamixer.html b/docs/plugins/html/gst-plugins-base-plugins-alsamixer.html
new file mode 100644
index 0000000..3293e51
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-alsamixer.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>alsamixer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-appsink.html" title="appsink">
+<link rel="next" href="gst-plugins-base-plugins-alsasink.html" title="alsasink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-appsink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-alsasink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-alsamixer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsamixer.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsamixer.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsamixer.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsamixer.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-alsamixer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-alsamixer.top_of_page"></a>alsamixer</span></h2>
+<p>alsamixer — Control sound input and output levels with ALSA</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-alsamixer.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAlsaMixerElement"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement-struct" title="struct GstAlsaMixerElement">GstAlsaMixerElement</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstAlsaMixerElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAlsaMixerElement implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstImplementsInterface.html">GstImplementsInterface</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer">GstMixer</a> and <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">GstPropertyProbe</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device" title='The "device" property'>device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device-name" title='The "device-name" property'>device-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id475040"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-alsa.html#plugin-alsa">alsa</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Leif Johnson &lt;leif@ambient.2y.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id475102"></a><h3>Element Pads</h3>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAlsaMixerElement-struct"></a><h3>struct GstAlsaMixerElement</h3>
+<pre class="programlisting">struct GstAlsaMixerElement;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsamixer.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAlsaMixerElement--device"></a><h3>The <code class="literal">"device"</code> property</h3>
+<pre class="programlisting"> "device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>ALSA device, as defined in an asound configuration file.</p>
+<p>Default value: "default"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAlsaMixerElement--device-name"></a><h3>The <code class="literal">"device-name"</code> property</h3>
+<pre class="programlisting"> "device-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>Human-readable name of the sound device.</p>
+<p>Default value: ""</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-alsasink.html b/docs/plugins/html/gst-plugins-base-plugins-alsasink.html
new file mode 100644
index 0000000..37b8d48
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-alsasink.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>alsasink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-alsamixer.html" title="alsamixer">
+<link rel="next" href="gst-plugins-base-plugins-alsasrc.html" title="alsasrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-alsamixer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-alsasrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-alsasink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-alsasink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-alsasink.top_of_page"></a>alsasink</span></h2>
+<p>alsasink — Output to a sound card via ALSA</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-alsasink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAlsaSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-alsasink.html#GstAlsaSink-struct" title="struct GstAlsaSink">GstAlsaSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosink.html#GstBaseAudioSink">GstBaseAudioSink</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosink.html#GstAudioSink">GstAudioSink</a>
+ +----GstAlsaSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAlsaSink implements
+ <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">GstPropertyProbe</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device" title='The "device" property'>device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device-name" title='The "device-name" property'>device-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--card-name" title='The "card-name" property'>card-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id500156"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-alsa.html#plugin-alsa">alsa</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id514777"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-iec958</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAlsaSink-struct"></a><h3>struct GstAlsaSink</h3>
+<pre class="programlisting">struct GstAlsaSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAlsaSink--device"></a><h3>The <code class="literal">"device"</code> property</h3>
+<pre class="programlisting"> "device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>ALSA device, as defined in an asound configuration file.</p>
+<p>Default value: "default"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAlsaSink--device-name"></a><h3>The <code class="literal">"device-name"</code> property</h3>
+<pre class="programlisting"> "device-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>Human-readable name of the sound device.</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAlsaSink--card-name"></a><h3>The <code class="literal">"card-name"</code> property</h3>
+<pre class="programlisting"> "card-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>Human-readable name of the sound card.</p>
+<p>Default value: ""</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-alsasrc.html b/docs/plugins/html/gst-plugins-base-plugins-alsasrc.html
new file mode 100644
index 0000000..e430887
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-alsasrc.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>alsasrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-alsasink.html" title="alsasink">
+<link rel="next" href="gst-plugins-base-plugins-audioconvert.html" title="audioconvert">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-alsasink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-audioconvert.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-alsasrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-alsasrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-alsasrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-alsasrc.top_of_page"></a>alsasrc</span></h2>
+<p>alsasrc — Read from a sound card via ALSA</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-alsasrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAlsaSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc-struct" title="struct GstAlsaSrc">GstAlsaSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstbaseaudiosrc.html#GstBaseAudioSrc">GstBaseAudioSrc</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiosrc.html#GstAudioSrc">GstAudioSrc</a>
+ +----GstAlsaSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAlsaSrc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstImplementsInterface.html">GstImplementsInterface</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer">GstMixer</a> and <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">GstPropertyProbe</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device" title='The "device" property'>device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device-name" title='The "device-name" property'>device-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--card-name" title='The "card-name" property'>card-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id486142"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-alsa.html#plugin-alsa">alsa</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id515248"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAlsaSrc-struct"></a><h3>struct GstAlsaSrc</h3>
+<pre class="programlisting">struct GstAlsaSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-alsasrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAlsaSrc--device"></a><h3>The <code class="literal">"device"</code> property</h3>
+<pre class="programlisting"> "device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>ALSA device, as defined in an asound configuration file.</p>
+<p>Default value: "default"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAlsaSrc--device-name"></a><h3>The <code class="literal">"device-name"</code> property</h3>
+<pre class="programlisting"> "device-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>Human-readable name of the sound device.</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAlsaSrc--card-name"></a><h3>The <code class="literal">"card-name"</code> property</h3>
+<pre class="programlisting"> "card-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>Human-readable name of the sound card.</p>
+<p>Default value: ""</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-appsink.html b/docs/plugins/html/gst-plugins-base-plugins-appsink.html
new file mode 100644
index 0000000..bbbf61d
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-appsink.html
@@ -0,0 +1,354 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>appsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-appsrc.html" title="appsrc">
+<link rel="next" href="gst-plugins-base-plugins-alsamixer.html" title="alsamixer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-appsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-alsamixer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-appsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsink.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsink.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-appsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-appsink.top_of_page"></a>appsink</span></h2>
+<p>appsink — Allow the application to get access to raw buffer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-appsink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAppSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-struct" title="struct GstAppSink">GstAppSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstAppSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAppSink implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink--drop" title='The "drop" property'>drop</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink--emit-signals" title='The "emit-signals" property'>emit-signals</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink--eos" title='The "eos" property'>eos</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink--max-buffers" title='The "max-buffers" property'>max-buffers</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-eos" title='The "eos" signal'>eos</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer" title='The "new-buffer" signal'>new-buffer</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-new-preroll" title='The "new-preroll" signal'>new-preroll</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer" title='The "pull-buffer" signal'>pull-buffer</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-preroll" title='The "pull-preroll" signal'>pull-preroll</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer-list" title='The "new-buffer-list" signal'>new-buffer-list</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer-list" title='The "pull-buffer-list" signal'>pull-buffer-list</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.description"></a><h2>Description</h2>
+<p>
+Appsink is a sink plugin that supports many different methods for making
+the application get a handle on the GStreamer data in a pipeline. Unlike
+most GStreamer elements, Appsink provides external API functions.
+</p>
+<p>
+For the documentation of the API, please see the
+<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsink.html">libgstapp</a> section in
+the GStreamer Plugins Base Libraries documentation.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id513544"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-app.html#plugin-app">app</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David Schleef &lt;ds@schleef.org&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Sink</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id513605"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAppSink-struct"></a><h3>struct GstAppSink</h3>
+<pre class="programlisting">struct GstAppSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAppSink--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>The allowed caps for the sink pad.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink--drop"></a><h3>The <code class="literal">"drop"</code> property</h3>
+<pre class="programlisting"> "drop" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Drop old buffers when the buffer queue is filled.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink--emit-signals"></a><h3>The <code class="literal">"emit-signals"</code> property</h3>
+<pre class="programlisting"> "emit-signals" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Emit new-preroll, new-buffer and new-buffer-list signals.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink--eos"></a><h3>The <code class="literal">"eos"</code> property</h3>
+<pre class="programlisting"> "eos" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read</pre>
+<p>Check if the sink is EOS or not started.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink--max-buffers"></a><h3>The <code class="literal">"max-buffers"</code> property</h3>
+<pre class="programlisting"> "max-buffers" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>The maximum number of buffers to queue internally (0 = unlimited).</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsink.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstAppSink-eos"></a><h3>The <code class="literal">"eos"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-new-buffer"></a><h3>The <code class="literal">"new-buffer"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-new-preroll"></a><h3>The <code class="literal">"new-preroll"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-pull-buffer"></a><h3>The <code class="literal">"pull-buffer"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-pull-preroll"></a><h3>The <code class="literal">"pull-preroll"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-new-buffer-list"></a><h3>The <code class="literal">"new-buffer-list"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSink-pull-buffer-list"></a><h3>The <code class="literal">"pull-buffer-list"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferList.html#GstBufferList"><span class="returnvalue">GstBufferList</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-appsink.html#GstAppSink"><span class="type">GstAppSink</span></a> *gstappsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsink</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-appsrc.html b/docs/plugins/html/gst-plugins-base-plugins-appsrc.html
new file mode 100644
index 0000000..9138340
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-appsrc.html
@@ -0,0 +1,365 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>appsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-adder.html" title="adder">
+<link rel="next" href="gst-plugins-base-plugins-appsink.html" title="appsink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-adder.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-appsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-appsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsrc.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-appsrc.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-appsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-appsrc.top_of_page"></a>appsrc</span></h2>
+<p>appsrc — Allow the application to feed buffers to a pipeline</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-appsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAppSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-struct" title="struct GstAppSrc">GstAppSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstAppSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstAppSrc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--block" title='The "block" property'>block</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--format" title='The "format" property'>format</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--is-live" title='The "is-live" property'>is-live</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-bytes" title='The "max-bytes" property'>max-bytes</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-latency" title='The "max-latency" property'>max-latency</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-latency" title='The "min-latency" property'>min-latency</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--size" title='The "size" property'>size</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--stream-type" title='The "stream-type" property'>stream-type</a>" <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GstAppStreamType"><span class="type">GstAppStreamType</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--emit-signals" title='The "emit-signals" property'>emit-signals</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-percent" title='The "min-percent" property'>min-percent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-end-of-stream" title='The "end-of-stream" signal'>end-of-stream</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-enough-data" title='The "enough-data" signal'>enough-data</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-need-data" title='The "need-data" signal'>need-data</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-push-buffer" title='The "push-buffer" signal'>push-buffer</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc-seek-data" title='The "seek-data" signal'>seek-data</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.description"></a><h2>Description</h2>
+<p>
+The appsrc element can be used by applications to insert data into a
+GStreamer pipeline. Unlike most GStreamer elements, Appsrc provides
+external API functions.
+</p>
+<p>
+For the documentation of the API, please see the
+<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html">libgstapp</a> section in the
+GStreamer Plugins Base Libraries documentation.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id507510"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-app.html#plugin-app">app</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David Schleef &lt;ds@schleef.org&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Source</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id507572"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAppSrc-struct"></a><h3>struct GstAppSrc</h3>
+<pre class="programlisting">struct GstAppSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAppSrc--block"></a><h3>The <code class="literal">"block"</code> property</h3>
+<pre class="programlisting"> "block" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Block push-buffer when max-bytes are queued.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>The allowed caps for the src pad.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--format"></a><h3>The <code class="literal">"format"</code> property</h3>
+<pre class="programlisting"> "format" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write</pre>
+<p>The format of the segment events and seek.</p>
+<p>Default value: GST_FORMAT_BYTES</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--is-live"></a><h3>The <code class="literal">"is-live"</code> property</h3>
+<pre class="programlisting"> "is-live" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to act as a live source.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--max-bytes"></a><h3>The <code class="literal">"max-bytes"</code> property</h3>
+<pre class="programlisting"> "max-bytes" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>The maximum number of bytes to queue internally (0 = unlimited).</p>
+<p>Default value: 200000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--max-latency"></a><h3>The <code class="literal">"max-latency"</code> property</h3>
+<pre class="programlisting"> "max-latency" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>The maximum latency (-1 = unlimited).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--min-latency"></a><h3>The <code class="literal">"min-latency"</code> property</h3>
+<pre class="programlisting"> "min-latency" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>The minimum latency (-1 = default).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--size"></a><h3>The <code class="literal">"size"</code> property</h3>
+<pre class="programlisting"> "size" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>The size of the data stream in bytes (-1 if unknown).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--stream-type"></a><h3>The <code class="literal">"stream-type"</code> property</h3>
+<pre class="programlisting"> "stream-type" <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-appsrc.html#GstAppStreamType"><span class="type">GstAppStreamType</span></a> : Read / Write</pre>
+<p>the type of the stream.</p>
+<p>Default value: GST_APP_STREAM_TYPE_STREAM</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--emit-signals"></a><h3>The <code class="literal">"emit-signals"</code> property</h3>
+<pre class="programlisting"> "emit-signals" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Emit need-data, enough-data and seek-data signals.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc--min-percent"></a><h3>The <code class="literal">"min-percent"</code> property</h3>
+<pre class="programlisting"> "min-percent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Emit need-data when queued bytes drops below this percent of max-bytes.</p>
+<p>Allowed values: &lt;= 100</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-appsrc.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstAppSrc-end-of-stream"></a><h3>The <code class="literal">"end-of-stream"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> user_function (<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *gstappsrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc-enough-data"></a><h3>The <code class="literal">"enough-data"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *gstappsrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc-need-data"></a><h3>The <code class="literal">"need-data"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *gstappsrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc-push-buffer"></a><h3>The <code class="literal">"push-buffer"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> user_function (<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *gstappsrc,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAppSrc-seek-data"></a><h3>The <code class="literal">"seek-data"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> user_function (<a class="link" href="gst-plugins-base-plugins-appsrc.html#GstAppSrc"><span class="type">GstAppSrc</span></a> *gstappsrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstappsrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-audioconvert.html b/docs/plugins/html/gst-plugins-base-plugins-audioconvert.html
new file mode 100644
index 0000000..8c8352b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-audioconvert.html
@@ -0,0 +1,321 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audioconvert</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-alsasrc.html" title="alsasrc">
+<link rel="next" href="gst-plugins-base-plugins-audiorate.html" title="audiorate">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-alsasrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-audiorate.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-audioconvert.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioconvert.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioconvert.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioconvert.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-audioconvert"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-audioconvert.top_of_page"></a>audioconvert</span></h2>
+<p>audioconvert — Convert audio to different formats</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-audioconvert.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioConvert"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert-struct" title="struct GstAudioConvert">GstAudioConvert</a>;
+enum <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertDithering" title="enum GstAudioConvertDithering">GstAudioConvertDithering</a>;
+enum <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertNoiseShaping" title="enum GstAudioConvertNoiseShaping">GstAudioConvertNoiseShaping</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioconvert.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstAudioConvert
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioconvert.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--dithering" title='The "dithering" property'>dithering</a>" <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertDithering" title="enum GstAudioConvertDithering"><span class="type">GstAudioConvertDithering</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--noise-shaping" title='The "noise-shaping" property'>noise-shaping</a>" <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertNoiseShaping" title="enum GstAudioConvertNoiseShaping"><span class="type">GstAudioConvertNoiseShaping</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioconvert.description"></a><h2>Description</h2>
+<p>
+Audioconvert converts raw audio buffers between various possible formats.
+It supports integer to float conversion, width/depth conversion,
+signedness and endianness conversion and channel transformations.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id516683"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v -m audiotestsrc ! audioconvert ! audio/x-raw,format=S8,channels=2 ! level ! fakesink silent=TRUE
+</pre></div> This pipeline converts audio to 8-bit. The level element shows that
+the output levels still match the one for a sine wave.
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v -m audiotestsrc ! audioconvert ! vorbisenc ! fakesink silent=TRUE
+</pre></div> The vorbis encoder takes float audio data instead of the integer data
+generated by audiotestsrc.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-03-02 (0.10.4)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id514682"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-audioconvert.html#plugin-audioconvert">audioconvert</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Benjamin Otte &lt;otte@gnome.org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Converter/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id492892"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)64</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)8, depth=(int)[ 1, 8 ], signed=(boolean){ true, false }</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)64</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean){ true, false }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)8, depth=(int)[ 1, 8 ], signed=(boolean){ true, false }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioconvert.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioConvert-struct"></a><h3>struct GstAudioConvert</h3>
+<pre class="programlisting">struct GstAudioConvert;</pre>
+<p>
+The audioconvert object structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioConvertDithering"></a><h3>enum GstAudioConvertDithering</h3>
+<pre class="programlisting">typedef enum {
+ DITHER_NONE = 0,
+ DITHER_RPDF,
+ DITHER_TPDF,
+ DITHER_TPDF_HF
+} GstAudioConvertDithering;
+</pre>
+<p>
+Set of available dithering methods when converting audio.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="DITHER-NONE:CAPS"></a><span class="term"><code class="literal">DITHER_NONE</code></span></p></td>
+<td>No dithering
+</td>
+</tr>
+<tr>
+<td><p><a name="DITHER-RPDF:CAPS"></a><span class="term"><code class="literal">DITHER_RPDF</code></span></p></td>
+<td>Rectangular dithering
+</td>
+</tr>
+<tr>
+<td><p><a name="DITHER-TPDF:CAPS"></a><span class="term"><code class="literal">DITHER_TPDF</code></span></p></td>
+<td>Triangular dithering (default)
+</td>
+</tr>
+<tr>
+<td><p><a name="DITHER-TPDF-HF:CAPS"></a><span class="term"><code class="literal">DITHER_TPDF_HF</code></span></p></td>
+<td>High frequency triangular dithering
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioConvertNoiseShaping"></a><h3>enum GstAudioConvertNoiseShaping</h3>
+<pre class="programlisting">typedef enum {
+ NOISE_SHAPING_NONE = 0,
+ NOISE_SHAPING_ERROR_FEEDBACK,
+ NOISE_SHAPING_SIMPLE,
+ NOISE_SHAPING_MEDIUM,
+ NOISE_SHAPING_HIGH
+} GstAudioConvertNoiseShaping;
+</pre>
+<p>
+Set of available noise shaping methods
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="NOISE-SHAPING-NONE:CAPS"></a><span class="term"><code class="literal">NOISE_SHAPING_NONE</code></span></p></td>
+<td>No noise shaping (default)
+</td>
+</tr>
+<tr>
+<td><p><a name="NOISE-SHAPING-ERROR-FEEDBACK:CAPS"></a><span class="term"><code class="literal">NOISE_SHAPING_ERROR_FEEDBACK</code></span></p></td>
+<td>Error feedback
+</td>
+</tr>
+<tr>
+<td><p><a name="NOISE-SHAPING-SIMPLE:CAPS"></a><span class="term"><code class="literal">NOISE_SHAPING_SIMPLE</code></span></p></td>
+<td>Simple 2-pole noise shaping
+</td>
+</tr>
+<tr>
+<td><p><a name="NOISE-SHAPING-MEDIUM:CAPS"></a><span class="term"><code class="literal">NOISE_SHAPING_MEDIUM</code></span></p></td>
+<td>Medium 5-pole noise shaping
+</td>
+</tr>
+<tr>
+<td><p><a name="NOISE-SHAPING-HIGH:CAPS"></a><span class="term"><code class="literal">NOISE_SHAPING_HIGH</code></span></p></td>
+<td>High 8-pole noise shaping
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioconvert.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioConvert--dithering"></a><h3>The <code class="literal">"dithering"</code> property</h3>
+<pre class="programlisting"> "dithering" <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertDithering" title="enum GstAudioConvertDithering"><span class="type">GstAudioConvertDithering</span></a> : Read / Write</pre>
+<p>Selects between different dithering methods.</p>
+<p>Default value: Triangular dithering (default)</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioConvert--noise-shaping"></a><h3>The <code class="literal">"noise-shaping"</code> property</h3>
+<pre class="programlisting"> "noise-shaping" <a class="link" href="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertNoiseShaping" title="enum GstAudioConvertNoiseShaping"><span class="type">GstAudioConvertNoiseShaping</span></a> : Read / Write</pre>
+<p>Selects between different noise shaping methods.</p>
+<p>Default value: No noise shaping (default)</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-audiorate.html b/docs/plugins/html/gst-plugins-base-plugins-audiorate.html
new file mode 100644
index 0000000..8dd4b52
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-audiorate.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audiorate</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-audioconvert.html" title="audioconvert">
+<link rel="next" href="gst-plugins-base-plugins-audioresample.html" title="audioresample">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-audioconvert.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-audioresample.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-audiorate.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiorate.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiorate.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiorate.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-audiorate"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-audiorate.top_of_page"></a>audiorate</span></h2>
+<p>audiorate — Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-audiorate.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioRate"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate-struct" title="struct GstAudioRate">GstAudioRate</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstAudioRate
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--add" title='The "add" property'>add</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--drop" title='The "drop" property'>drop</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--in" title='The "in" property'>in</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--out" title='The "out" property'>out</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--silent" title='The "silent" property'>silent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--tolerance" title='The "tolerance" property'>tolerance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--skip-to-first" title='The "skip-to-first" property'>skip-to-first</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.description"></a><h2>Description</h2>
+<p>
+This element takes an incoming stream of timestamped raw audio frames and
+produces a perfect stream by inserting or dropping samples as needed.
+</p>
+<p>
+This operation may be of use to link to elements that require or otherwise
+implicitly assume a perfect stream as they do not store timestamps,
+but derive this by some means (e.g. bitrate for some AVI cases).
+</p>
+<p>
+The properties <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--in" title='The "in" property'><span class="type">"in"</span></a>, <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--out" title='The "out" property'><span class="type">"out"</span></a>, <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--add" title='The "add" property'><span class="type">"add"</span></a>
+and <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--drop" title='The "drop" property'><span class="type">"drop"</span></a> can be read to obtain information about number of
+input samples, output samples, dropped samples (i.e. the number of unused
+input samples) and inserted samples (i.e. the number of samples added to
+stream).
+</p>
+<p>
+When the <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--silent" title='The "silent" property'><span class="type">"silent"</span></a> property is set to FALSE, a GObject property
+notification will be emitted whenever one of the <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--add" title='The "add" property'><span class="type">"add"</span></a> or
+<a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--drop" title='The "drop" property'><span class="type">"drop"</span></a> values changes.
+This can potentially cause performance degradation.
+Note that property notification will happen from the streaming thread, so
+applications should be prepared for this.
+</p>
+<p>
+If the <a class="link" href="gst-plugins-base-plugins-audiorate.html#GstAudioRate--tolerance" title='The "tolerance" property'><span class="type">"tolerance"</span></a> property is non-zero, and an incoming buffer's
+timestamp deviates less than the property indicates from what would make a
+'perfect time', then no samples will be added or dropped.
+Note that the output is still guaranteed to be a perfect stream, which means
+that the incoming data is then simply shifted (by less than the indicated
+tolerance) to a perfect time.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id517721"></a><h3>Example pipelines</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v alsasrc ! audiorate ! wavenc ! filesink location=alsa.wav
+</pre></div> Capture audio from an ALSA device, and turn it into a perfect stream
+for saving in a raw audio file.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id517744"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-audiorate.html#plugin-audiorate">audiorate</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id517806"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioRate-struct"></a><h3>struct GstAudioRate</h3>
+<pre class="programlisting">struct GstAudioRate;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioRate--add"></a><h3>The <code class="literal">"add"</code> property</h3>
+<pre class="programlisting"> "add" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of added samples.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--drop"></a><h3>The <code class="literal">"drop"</code> property</h3>
+<pre class="programlisting"> "drop" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of dropped samples.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--in"></a><h3>The <code class="literal">"in"</code> property</h3>
+<pre class="programlisting"> "in" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of input samples.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--out"></a><h3>The <code class="literal">"out"</code> property</h3>
+<pre class="programlisting"> "out" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of output samples.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--silent"></a><h3>The <code class="literal">"silent"</code> property</h3>
+<pre class="programlisting"> "silent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Don't emit notify for dropped and duplicated frames.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--tolerance"></a><h3>The <code class="literal">"tolerance"</code> property</h3>
+<pre class="programlisting"> "tolerance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>
+The difference between incoming timestamp and next timestamp must exceed
+the given value for audiorate to add or drop samples.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioRate--skip-to-first"></a><h3>The <code class="literal">"skip-to-first"</code> property</h3>
+<pre class="programlisting"> "skip-to-first" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+Don't produce buffers before the first one we receive.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.33</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiorate.see-also"></a><h2>See Also</h2>
+<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate"><span class="type">GstVideoRate</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-audioresample.html b/docs/plugins/html/gst-plugins-base-plugins-audioresample.html
new file mode 100644
index 0000000..bf75f41
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-audioresample.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audioresample</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-audiorate.html" title="audiorate">
+<link rel="next" href="gst-plugins-base-plugins-audiotestsrc.html" title="audiotestsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-audiorate.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-audiotestsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-audioresample.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioresample.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioresample.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audioresample.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-audioresample"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-audioresample.top_of_page"></a>audioresample</span></h2>
+<p>audioresample — Resamples audio</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-audioresample.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioResample"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-audioresample.html#GstAudioResample-struct" title="struct GstAudioResample">GstAudioResample</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioresample.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstAudioResample
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioresample.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-audioresample.html#GstAudioResample--filter-length" title='The "filter-length" property'>filter-length</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audioresample.html#GstAudioResample--quality" title='The "quality" property'>quality</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write / Construct
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioresample.description"></a><h2>Description</h2>
+<p>
+audioresample resamples raw audio buffers to different sample rates using
+a configurable windowing function to enhance quality.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id497912"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! audio/x-raw, rate=8000 ! alsasink
+</pre></div> Decode an Ogg/Vorbis downsample to 8Khz and play sound through alsa.
+To create the Ogg/Vorbis file refer to the documentation of vorbisenc.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id497906"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-audioresample.html#plugin-audioresample">audioresample</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Converter/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id494031"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioresample.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioResample-struct"></a><h3>struct GstAudioResample</h3>
+<pre class="programlisting">struct GstAudioResample;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audioresample.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioResample--filter-length"></a><h3>The <code class="literal">"filter-length"</code> property</h3>
+<pre class="programlisting"> "filter-length" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Length of the resample filter.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 64</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioResample--quality"></a><h3>The <code class="literal">"quality"</code> property</h3>
+<pre class="programlisting"> "quality" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write / Construct</pre>
+<p>Resample quality with 0 being the lowest and 10 being the best.</p>
+<p>Allowed values: [0,10]</p>
+<p>Default value: 4</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-audiotestsrc.html b/docs/plugins/html/gst-plugins-base-plugins-audiotestsrc.html
new file mode 100644
index 0000000..fa2b51a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-audiotestsrc.html
@@ -0,0 +1,324 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audiotestsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-audioresample.html" title="audioresample">
+<link rel="next" href="gst-plugins-base-plugins-cdparanoiasrc.html" title="cdparanoiasrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-audioresample.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-cdparanoiasrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-audiotestsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiotestsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiotestsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-audiotestsrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-audiotestsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-audiotestsrc.top_of_page"></a>audiotestsrc</span></h2>
+<p>audiotestsrc — Creates audio test signals of given frequency and volume</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-audiotestsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstAudioTestSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc-struct" title="struct GstAudioTestSrc">GstAudioTestSrc</a>;
+enum <a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrcWave" title="enum GstAudioTestSrcWave">GstAudioTestSrcWave</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiotestsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstAudioTestSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiotestsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--freq" title='The "freq" property'>freq</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--is-live" title='The "is-live" property'>is-live</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--samplesperbuffer" title='The "samplesperbuffer" property'>samplesperbuffer</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--timestamp-offset" title='The "timestamp-offset" property'>timestamp-offset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--volume" title='The "volume" property'>volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--wave" title='The "wave" property'>wave</a>" <a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrcWave" title="enum GstAudioTestSrcWave"><span class="type">GstAudioTestSrcWave</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-pull" title='The "can-activate-pull" property'>can-activate-pull</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-push" title='The "can-activate-push" property'>can-activate-push</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiotestsrc.description"></a><h2>Description</h2>
+<p>
+AudioTestSrc can be used to generate basic audio signals. It support several
+different waveforms and allows to set the base frequency and volume.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id519060"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch audiotestsrc ! audioconvert ! alsasink
+</pre></div> This pipeline produces a sine with default frequency, 440 Hz, and the
+default volume, 0.8 (relative to a maximum 1.0).
+<div class="informalexample"><pre class="programlisting">
+gst-launch audiotestsrc wave=2 freq=200 ! audioconvert ! tee name=t ! queue ! alsasink t. ! queue ! libvisual_lv_scope ! videoconvert ! xvimagesink
+</pre></div> In this example a saw wave is generated. The wave is shown using a
+scope visualizer from libvisual, allowing you to visually verify that
+the saw wave is correct.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id519093"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-audiotestsrc.html#plugin-audiotestsrc">audiotestsrc</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Stefan Kost &lt;ensonic@users.sf.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id519155"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiotestsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAudioTestSrc-struct"></a><h3>struct GstAudioTestSrc</h3>
+<pre class="programlisting">struct GstAudioTestSrc;</pre>
+<p>
+audiotestsrc object structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrcWave"></a><h3>enum GstAudioTestSrcWave</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUDIO_TEST_SRC_WAVE_SINE,
+ GST_AUDIO_TEST_SRC_WAVE_SQUARE,
+ GST_AUDIO_TEST_SRC_WAVE_SAW,
+ GST_AUDIO_TEST_SRC_WAVE_TRIANGLE,
+ GST_AUDIO_TEST_SRC_WAVE_SILENCE,
+ GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_SINE_TAB,
+ GST_AUDIO_TEST_SRC_WAVE_TICKS,
+ GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_RED_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE
+} GstAudioTestSrcWave;
+</pre>
+<p>
+Different types of supported sound waves.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-SINE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_SINE</code></span></p></td>
+<td>a sine wave
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-SQUARE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_SQUARE</code></span></p></td>
+<td>a square wave
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-SAW:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_SAW</code></span></p></td>
+<td>a saw wave
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-TRIANGLE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_TRIANGLE</code></span></p></td>
+<td>a tringle wave
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-SILENCE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_SILENCE</code></span></p></td>
+<td>silence
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-WHITE-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE</code></span></p></td>
+<td>white uniform noise
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-PINK-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE</code></span></p></td>
+<td>pink noise
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-SINE-TAB:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_SINE_TAB</code></span></p></td>
+<td>sine wave using a table
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-TICKS:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_TICKS</code></span></p></td>
+<td>periodic ticks
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-GAUSSIAN-WHITE-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE</code></span></p></td>
+<td>white (zero mean) Gaussian noise; volume sets the standard deviation of the noise in units of the range of values of the sample type, e.g. volume=0.1 produces noise with a standard deviation of 0.1*32767=3277 with 16-bit integer samples, or 0.1*1.0=0.1 with floating-point samples.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-RED-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_RED_NOISE</code></span></p></td>
+<td>red (brownian) noise
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-BLUE-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE</code></span></p></td>
+<td>spectraly inverted pink noise
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUDIO-TEST-SRC-WAVE-VIOLET-NOISE:CAPS"></a><span class="term"><code class="literal">GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE</code></span></p></td>
+<td>spectraly inverted red (brownian) noise
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-audiotestsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstAudioTestSrc--freq"></a><h3>The <code class="literal">"freq"</code> property</h3>
+<pre class="programlisting"> "freq" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Frequency of test signal.</p>
+<p>Allowed values: [0,20000]</p>
+<p>Default value: 440</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--is-live"></a><h3>The <code class="literal">"is-live"</code> property</h3>
+<pre class="programlisting"> "is-live" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to act as a live source.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--samplesperbuffer"></a><h3>The <code class="literal">"samplesperbuffer"</code> property</h3>
+<pre class="programlisting"> "samplesperbuffer" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Number of samples in each outgoing buffer.</p>
+<p>Allowed values: &gt;= 1</p>
+<p>Default value: 1024</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--timestamp-offset"></a><h3>The <code class="literal">"timestamp-offset"</code> property</h3>
+<pre class="programlisting"> "timestamp-offset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>An offset added to timestamps set on buffers (in ns).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--volume"></a><h3>The <code class="literal">"volume"</code> property</h3>
+<pre class="programlisting"> "volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Volume of test signal.</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--wave"></a><h3>The <code class="literal">"wave"</code> property</h3>
+<pre class="programlisting"> "wave" <a class="link" href="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrcWave" title="enum GstAudioTestSrcWave"><span class="type">GstAudioTestSrcWave</span></a> : Read / Write</pre>
+<p>Oscillator waveform.</p>
+<p>Default value: Sine</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--can-activate-pull"></a><h3>The <code class="literal">"can-activate-pull"</code> property</h3>
+<pre class="programlisting"> "can-activate-pull" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Can activate in pull mode.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAudioTestSrc--can-activate-push"></a><h3>The <code class="literal">"can-activate-push"</code> property</h3>
+<pre class="programlisting"> "can-activate-push" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Can activate in push mode.</p>
+<p>Default value: TRUE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-cdparanoiasrc.html b/docs/plugins/html/gst-plugins-base-plugins-cdparanoiasrc.html
new file mode 100644
index 0000000..66a2e75
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-cdparanoiasrc.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>cdparanoiasrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-audiotestsrc.html" title="audiotestsrc">
+<link rel="next" href="gst-plugins-base-plugins-clockoverlay.html" title="clockoverlay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-audiotestsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-clockoverlay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-cdparanoiasrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-cdparanoiasrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-cdparanoiasrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-cdparanoiasrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-cdparanoiasrc.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-cdparanoiasrc.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-cdparanoiasrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-cdparanoiasrc.top_of_page"></a>cdparanoiasrc</span></h2>
+<p>cdparanoiasrc — Read audio from CD in paranoid mode</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstCdParanoiaSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-struct" title="struct GstCdParanoiaSrc">GstCdParanoiaSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcddabasesrc.html#GstCddaBaseSrc">GstCddaBaseSrc</a>
+ +----GstCdParanoiaSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstCdParanoiaSrc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--generic-device" title='The "generic-device" property'>generic-device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--paranoia-mode" title='The "paranoia-mode" property'>paranoia-mode</a>" <span class="type">GstCdParanoiaMode</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--read-speed" title='The "read-speed" property'>read-speed</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--search-overlap" title='The "search-overlap" property'>search-overlap</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--cache-size" title='The "cache-size" property'>cache-size</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-transport-error" title='The "transport-error" signal'>transport-error</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-uncorrected-error" title='The "uncorrected-error" signal'>uncorrected-error</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id520071"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-cdparanoia.html#plugin-cdparanoia">cdparanoia</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/File</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id520133"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc-struct"></a><h3>struct GstCdParanoiaSrc</h3>
+<pre class="programlisting">struct GstCdParanoiaSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc--generic-device"></a><h3>The <code class="literal">"generic-device"</code> property</h3>
+<pre class="programlisting"> "generic-device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Use specified generic scsi device.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc--paranoia-mode"></a><h3>The <code class="literal">"paranoia-mode"</code> property</h3>
+<pre class="programlisting"> "paranoia-mode" <span class="type">GstCdParanoiaMode</span> : Read / Write</pre>
+<p>Type of checking to perform.</p>
+<p>Default value: PARANOIA_MODE_FRAGMENT</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc--read-speed"></a><h3>The <code class="literal">"read-speed"</code> property</h3>
+<pre class="programlisting"> "read-speed" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Read from device at specified speed.</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc--search-overlap"></a><h3>The <code class="literal">"search-overlap"</code> property</h3>
+<pre class="programlisting"> "search-overlap" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Force minimum overlap search during verification to n sectors.</p>
+<p>Allowed values: [-1,75]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc--cache-size"></a><h3>The <code class="literal">"cache-size"</code> property</h3>
+<pre class="programlisting"> "cache-size" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Set CD cache size to n sectors (-1 = auto).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-cdparanoiasrc.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc-transport-error"></a><h3>The <code class="literal">"transport-error"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc"><span class="type">GstCdParanoiaSrc</span></a> *gstcdparanoiasrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstcdparanoiasrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCdParanoiaSrc-uncorrected-error"></a><h3>The <code class="literal">"uncorrected-error"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc"><span class="type">GstCdParanoiaSrc</span></a> *gstcdparanoiasrc,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstcdparanoiasrc</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-clockoverlay.html b/docs/plugins/html/gst-plugins-base-plugins-clockoverlay.html
new file mode 100644
index 0000000..385561e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-clockoverlay.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>clockoverlay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-cdparanoiasrc.html" title="cdparanoiasrc">
+<link rel="next" href="gst-plugins-base-plugins-decodebin.html" title="decodebin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-cdparanoiasrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-decodebin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-clockoverlay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-clockoverlay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-clockoverlay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-clockoverlay.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-clockoverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-clockoverlay.top_of_page"></a>clockoverlay</span></h2>
+<p>clockoverlay — Overlays the current clock time on a video stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-clockoverlay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstClockOverlay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay-struct" title="struct GstClockOverlay">GstClockOverlay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-clockoverlay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstBaseTextOverlay
+ +----GstClockOverlay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-clockoverlay.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay--time-format" title='The "time-format" property'>time-format</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-clockoverlay.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id520875"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-pango.html#plugin-pango">pango</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Tim-Philipp Müller &lt;tim@centricular.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Editor/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id520820"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>video_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-clockoverlay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstClockOverlay-struct"></a><h3>struct GstClockOverlay</h3>
+<pre class="programlisting">struct GstClockOverlay;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-clockoverlay.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstClockOverlay--time-format"></a><h3>The <code class="literal">"time-format"</code> property</h3>
+<pre class="programlisting"> "time-format" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Format to use for time and date value, as in strftime.</p>
+<p>Default value: "%H:%M:%S"</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-decodebin.html b/docs/plugins/html/gst-plugins-base-plugins-decodebin.html
new file mode 100644
index 0000000..63efb2f
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-decodebin.html
@@ -0,0 +1,304 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>decodebin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-clockoverlay.html" title="clockoverlay">
+<link rel="next" href="gst-plugins-base-plugins-encodebin.html" title="encodebin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-clockoverlay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-encodebin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-decodebin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-decodebin.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-decodebin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-decodebin.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-decodebin.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-decodebin.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-decodebin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-decodebin.top_of_page"></a>decodebin</span></h2>
+<p>decodebin — Autoplug and decode to raw media</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-decodebin.synopsis"></a><h2>Synopsis</h2>
+<a name="GstDecodeBin"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-struct" title="struct GstDecodeBin">GstDecodeBin</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+ +----GstDecodeBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstDecodeBin implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstChildProxy.html">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin--threaded" title='The "threaded" property'>threaded</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin--sink-caps" title='The "sink-caps" property'>sink-caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-new-decoded-pad" title='The "new-decoded-pad" signal'>new-decoded-pad</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-removed-decoded-pad" title='The "removed-decoded-pad" signal'>removed-decoded-pad</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-unknown-type" title='The "unknown-type" signal'>unknown-type</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.description"></a><h2>Description</h2>
+<p>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html"><span class="type">GstBin</span></a> that auto-magically constructs a decoding pipeline using available
+decoders and demuxers via auto-plugging.
+</p>
+<p>
+When using decodebin in your application, connect a signal handler to
+<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-new-decoded-pad" title='The "new-decoded-pad" signal'><span class="type">"new-decoded-pad"</span></a> and connect your sinks from within the
+callback function.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+This element is deprecated and no longer supported. You should use the
+<span class="type">uridecodebin</span> or <span class="type">decodebin2</span> element instead (or, even better: <span class="type">playbin2</span>).
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id522627"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-decodebin.html#plugin-decodebin">decodebin</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Bin/Decoder</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id522690"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>sometimes</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDecodeBin-struct"></a><h3>struct GstDecodeBin</h3>
+<pre class="programlisting">struct GstDecodeBin;</pre>
+<p>
+Auto-plugging decoder element structure
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstDecodeBin--threaded"></a><h3>The <code class="literal">"threaded"</code> property</h3>
+<pre class="programlisting"> "threaded" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Use threads.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDecodeBin--sink-caps"></a><h3>The <code class="literal">"sink-caps"</code> property</h3>
+<pre class="programlisting"> "sink-caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>The caps of the input data. (NULL = use typefind element).</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-decodebin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstDecodeBin-new-decoded-pad"></a><h3>The <code class="literal">"new-decoded-pad"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin"><span class="type">GstDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> islast,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal gets emitted as soon as a new pad of the same type as one of
+the valid 'raw' types is added.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The decodebin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The newly created pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>islast</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a> if this is the last pad to be added. Deprecated.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDecodeBin-removed-decoded-pad"></a><h3>The <code class="literal">"removed-decoded-pad"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin"><span class="type">GstDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted when a 'final' caps pad has been removed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The decodebin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The pad that was removed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDecodeBin-unknown-type"></a><h3>The <code class="literal">"unknown-type"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-decodebin.html#GstDecodeBin"><span class="type">GstDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted when a pad for which there is no further possible
+decoding is added to the decodebin.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The decodebin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The new pad containing caps that cannot be resolved to a 'final'
+stream type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> of the pad that cannot be resolved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-encodebin.html b/docs/plugins/html/gst-plugins-base-plugins-encodebin.html
new file mode 100644
index 0000000..42ef3eb
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-encodebin.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>encodebin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-decodebin.html" title="decodebin">
+<link rel="next" href="gst-plugins-base-plugins-videoconvert.html" title="videoconvert">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-decodebin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-videoconvert.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-encodebin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-encodebin.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-encodebin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-encodebin.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-encodebin.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-encodebin.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-encodebin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-encodebin.top_of_page"></a>encodebin</span></h2>
+<p>encodebin — Convenience encoding/muxing element</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-encodebin.synopsis"></a><h2>Synopsis</h2>
+<a name="GstEncodeBin"></a><pre class="synopsis"> <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin-struct" title="GstEncodeBin">GstEncodeBin</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+ +----GstEncodeBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstEncodeBin implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstChildProxy.html">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--audio-jitter-tolerance" title='The "audio-jitter-tolerance" property'>audio-jitter-tolerance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--avoid-reencoding" title='The "avoid-reencoding" property'>avoid-reencoding</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--profile" title='The "profile" property'>profile</a>" <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-buffers-max" title='The "queue-buffers-max" property'>queue-buffers-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-bytes-max" title='The "queue-bytes-max" property'>queue-bytes-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-time-max" title='The "queue-time-max" property'>queue-time-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin-request-pad" title='The "request-pad" signal'>request-pad</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.description"></a><h2>Description</h2>
+<p>
+EncodeBin provides a bin for encoding/muxing various streams according to
+a specified <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>.
+</p>
+<p>
+Based on the profile that was set (via the <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--profile" title='The "profile" property'><span class="type">"profile"</span></a> property),
+EncodeBin will internally select and configure the required elements
+(encoders, muxers, but also audio and video converters) so that you can
+provide it raw or pre-encoded streams of data in input and have your
+encoded/muxed/converted stream in output.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id511302"></a><h3>Features</h3>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+Automatic encoder and muxer selection based on elements available on the
+system.
+</li>
+<li class="listitem">
+Conversion of raw audio/video streams (scaling, framerate conversion,
+colorspace conversion, samplerate conversion) to conform to the profile
+output format.
+</li>
+<li class="listitem">
+Variable number of streams. If the presence property for a stream encoding
+profile is 0, you can request any number of sink pads for it via the
+standard request pad gstreamer API or the <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin-request-pad" title='The "request-pad" signal'><span class="type">"request-pad"</span></a> action
+signal.
+</li>
+<li class="listitem">
+Avoid reencoding (passthrough). If the input stream is already encoded and is
+compatible with what the <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> expects, then the stream won't
+be re-encoded but just passed through downstream to the muxer or the output.
+</li>
+<li class="listitem">
+Mix pre-encoded and raw streams as input. In addition to the passthrough
+feature above, you can feed both raw audio/video *AND* already-encoded data
+to a pad. <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin"><span class="type">GstEncodeBin</span></a> will take care of passing through the compatible
+segments and re-encoding the segments of media that need encoding.
+</li>
+<li class="listitem">
+Standard behaviour is to use a <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingContainerProfile"><span class="type">GstEncodingContainerProfile</span></a> to have both
+encoding and muxing performed. But you can also provide a single stream
+profile (like <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingAudioProfile"><span class="type">GstEncodingAudioProfile</span></a>) to only have the encoding done and
+handle the encoded output yourself.
+</li>
+<li class="listitem">
+Audio imperfection corrections. Incoming audio streams can have non perfect
+timestamps (jitter), like the streams coming from ASF files. <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin"><span class="type">GstEncodeBin</span></a>
+will automatically fix those imperfections for you. See
+<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--audio-jitter-tolerance" title='The "audio-jitter-tolerance" property'><span class="type">"audio-jitter-tolerance"</span></a> for more details.
+</li>
+<li class="listitem">
+Variable or Constant video framerate. If your <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingVideoProfile"><span class="type">GstEncodingVideoProfile</span></a> has
+the variableframerate property deactivated (default), then the incoming
+raw video stream will be retimestampped in order to produce a constant
+framerate.
+</li>
+<li class="listitem">
+Cross-boundary re-encoding. When feeding compatible pre-encoded streams that
+fall on segment boundaries, and for supported formats (right now only H263),
+the GOP will be decoded/reencoded when needed to produce an encoded output
+that fits exactly within the request GstSegment.
+</li>
+<li class="listitem">
+Missing plugin support. If a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> is missing to encode/mux to the
+request profile formats, a missing-plugin <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> will be posted on the
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBus.html"><span class="type">GstBus</span></a>, allowing systems that support the missing-plugin system to offer the
+user a way to install the missing element.
+</li>
+</ul></div>
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id524019"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-encoding.html#plugin-encoding">encoding</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Edward Hervey &lt;edward.hervey@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Bin/Encoder</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id524080"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>audio_%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>private_%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>video_%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstEncodeBin-struct"></a><h3>GstEncodeBin</h3>
+<pre class="programlisting">typedef struct _GstEncodeBin GstEncodeBin;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstEncodeBin--audio-jitter-tolerance"></a><h3>The <code class="literal">"audio-jitter-tolerance"</code> property</h3>
+<pre class="programlisting"> "audio-jitter-tolerance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Amount of timestamp jitter/imperfection to allow on audio streams before inserting/dropping samples (ns).</p>
+<p>Default value: 20000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodeBin--avoid-reencoding"></a><h3>The <code class="literal">"avoid-reencoding"</code> property</h3>
+<pre class="programlisting"> "avoid-reencoding" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to re-encode portions of compatible video streams that lay on segment boundaries.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodeBin--profile"></a><h3>The <code class="literal">"profile"</code> property</h3>
+<pre class="programlisting"> "profile" <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a>* : Read / Write</pre>
+<p>
+The <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-encoding-profile.html#GstEncodingProfile"><span class="type">GstEncodingProfile</span></a> to use. This property must be set before going
+to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a> or higher.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodeBin--queue-buffers-max"></a><h3>The <code class="literal">"queue-buffers-max"</code> property</h3>
+<pre class="programlisting"> "queue-buffers-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Max. number of buffers in the queue (0=disable).</p>
+<p>Default value: 200</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodeBin--queue-bytes-max"></a><h3>The <code class="literal">"queue-bytes-max"</code> property</h3>
+<pre class="programlisting"> "queue-bytes-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Max. amount of data in the queue (bytes, 0=disable).</p>
+<p>Default value: 10485760</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEncodeBin--queue-time-max"></a><h3>The <code class="literal">"queue-time-max"</code> property</h3>
+<pre class="programlisting"> "queue-time-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Max. amount of data in the queue (in ns, 0=disable).</p>
+<p>Default value: 1000000000</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-encodebin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstEncodeBin-request-pad"></a><h3>The <code class="literal">"request-pad"</code> signal</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin"><span class="type">GstEncodeBin</span></a> *encodebin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Use this method to request an unused sink request <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> that can take the
+provided <em class="parameter"><code>caps</code></em> as input. You must release the pad with
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-release-request-pad"><code class="function">gst_element_release_request_pad()</code></a> when you are done with it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>encodebin</code></em> :</span></p></td>
+<td>a <a class="link" href="gst-plugins-base-plugins-encodebin.html#GstEncodeBin"><span class="type">GstEncodeBin</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A compatible <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if no compatible <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> could be
+created or is available.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-gdpdepay.html b/docs/plugins/html/gst-plugins-base-plugins-gdpdepay.html
new file mode 100644
index 0000000..a811aa9
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-gdpdepay.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gdpdepay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-videoconvert.html" title="videoconvert">
+<link rel="next" href="gst-plugins-base-plugins-gdppay.html" title="gdppay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-videoconvert.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-gdppay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-gdpdepay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-gdpdepay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-gdpdepay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-gdpdepay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-gdpdepay.top_of_page"></a>gdpdepay</span></h2>
+<p>gdpdepay — Depayloads GStreamer Data Protocol buffers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-gdpdepay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGDPDepay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-gdpdepay.html#GstGDPDepay-struct" title="struct GstGDPDepay">GstGDPDepay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdpdepay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstGDPDepay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdpdepay.description"></a><h2>Description</h2>
+<p>
+This element depayloads GStreamer Data Protocol buffers back to deserialized
+buffers and events.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id477795"></a><div class="informalexample"><pre class="programlisting">
+gst-launch -v -m filesrc location=test.gdp ! gdpdepay ! xvimagesink
+</pre></div> This pipeline plays back a serialized video stream as created in the
+example for gdppay.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id505139"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gdp.html#plugin-gdp">gdp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>GDP/Depayloader</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id498695"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>application/x-gdp</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdpdepay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGDPDepay-struct"></a><h3>struct GstGDPDepay</h3>
+<pre class="programlisting">struct GstGDPDepay;</pre>
+<p>
+Private gdpdepay element structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdpdepay.see-also"></a><h2>See Also</h2>
+gdppay
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-gdppay.html b/docs/plugins/html/gst-plugins-base-plugins-gdppay.html
new file mode 100644
index 0000000..7f936c7
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-gdppay.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gdppay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-gdpdepay.html" title="gdpdepay">
+<link rel="next" href="gst-plugins-base-plugins-giosink.html" title="giosink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-gdpdepay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-giosink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-gdppay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-gdppay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-gdppay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-gdppay.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-gdppay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-gdppay.top_of_page"></a>gdppay</span></h2>
+<p>gdppay — Payloads GStreamer Data Protocol buffers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-gdppay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGDPPay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-gdppay.html#GstGDPPay-struct" title="struct GstGDPPay">GstGDPPay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstGDPPay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-header" title='The "crc-header" property'>crc-header</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-payload" title='The "crc-payload" property'>crc-payload</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-gdppay.html#GstGDPPay--version" title='The "version" property'>version</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/gstreamer-libs-gstdataprotocol.html#GstDPVersion"><span class="type">GstDPVersion</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.description"></a><h2>Description</h2>
+<p>
+This element payloads GStreamer buffers and events using the
+GStreamer Data Protocol.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id497584"></a><div class="informalexample"><pre class="programlisting">
+gst-launch -v -m videotestsrc num-buffers=50 ! gdppay ! filesink location=test.gdp
+</pre></div> This pipeline creates a serialized video stream that can be played back
+with the example shown in gdpdepay.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id504604"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gdp.html#plugin-gdp">gdp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>GDP/Payloader</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id521730"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>application/x-gdp</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGDPPay-struct"></a><h3>struct GstGDPPay</h3>
+<pre class="programlisting">struct GstGDPPay;</pre>
+<p>
+Private gdppay element structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGDPPay--crc-header"></a><h3>The <code class="literal">"crc-header"</code> property</h3>
+<pre class="programlisting"> "crc-header" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Calculate and store a CRC checksum on the header.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGDPPay--crc-payload"></a><h3>The <code class="literal">"crc-payload"</code> property</h3>
+<pre class="programlisting"> "crc-payload" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Calculate and store a CRC checksum on the payload.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGDPPay--version"></a><h3>The <code class="literal">"version"</code> property</h3>
+<pre class="programlisting"> "version" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/gstreamer-libs-gstdataprotocol.html#GstDPVersion"><span class="type">GstDPVersion</span></a> : Read / Write</pre>
+<p>Version of the GStreamer Data Protocol.</p>
+<p>Default value: GST_DP_VERSION_1_0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-gdppay.see-also"></a><h2>See Also</h2>
+gdpdepay
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-giosink.html b/docs/plugins/html/gst-plugins-base-plugins-giosink.html
new file mode 100644
index 0000000..31f0cf0
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-giosink.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>giosink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-gdppay.html" title="gdppay">
+<link rel="next" href="gst-plugins-base-plugins-giosrc.html" title="giosrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-gdppay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-giosrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-giosink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-giosink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-giosink.top_of_page"></a>giosink</span></h2>
+<p>giosink — Write to any GIO-supported location</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-giosink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGioSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-giosink.html#GstGioSink-struct" title="struct GstGioSink">GstGioSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstGioBaseSink
+ +----GstGioSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGioSink implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-giosink.html#GstGioSink--location" title='The "location" property'>location</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-giosink.html#GstGioSink--file" title='The "file" property'>file</a>" <a href="http://library.gnome.org/devel/gio/unstable/GFile.html"><span class="type">GFile</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id488791"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gio.html#plugin-gio">gio</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>René Stadler &lt;mail@renestadler.de&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/File</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id525824"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGioSink-struct"></a><h3>struct GstGioSink</h3>
+<pre class="programlisting">struct GstGioSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGioSink--location"></a><h3>The <code class="literal">"location"</code> property</h3>
+<pre class="programlisting"> "location" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>URI location to write to.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGioSink--file"></a><h3>The <code class="literal">"file"</code> property</h3>
+<pre class="programlisting"> "file" <a href="http://library.gnome.org/devel/gio/unstable/GFile.html"><span class="type">GFile</span></a>* : Read / Write</pre>
+<p>GFile to write to.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-giosrc.html b/docs/plugins/html/gst-plugins-base-plugins-giosrc.html
new file mode 100644
index 0000000..5532348
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-giosrc.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>giosrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-giosink.html" title="giosink">
+<link rel="next" href="gst-plugins-base-plugins-giostreamsink.html" title="giostreamsink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-giosink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-giostreamsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-giosrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giosrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-giosrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-giosrc.top_of_page"></a>giosrc</span></h2>
+<p>giosrc — Read from any GIO-supported location</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-giosrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGioSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-giosrc.html#GstGioSrc-struct" title="struct GstGioSrc">GstGioSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstGioBaseSrc
+ +----GstGioSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstGioSrc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-giosrc.html#GstGioSrc--location" title='The "location" property'>location</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-giosrc.html#GstGioSrc--file" title='The "file" property'>file</a>" <a href="http://library.gnome.org/devel/gio/unstable/GFile.html"><span class="type">GFile</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id488494"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gio.html#plugin-gio">gio</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>René Stadler &lt;mail@renestadler.de&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/File</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id525447"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGioSrc-struct"></a><h3>struct GstGioSrc</h3>
+<pre class="programlisting">struct GstGioSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giosrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGioSrc--location"></a><h3>The <code class="literal">"location"</code> property</h3>
+<pre class="programlisting"> "location" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>URI location to read from.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGioSrc--file"></a><h3>The <code class="literal">"file"</code> property</h3>
+<pre class="programlisting"> "file" <a href="http://library.gnome.org/devel/gio/unstable/GFile.html"><span class="type">GFile</span></a>* : Read / Write</pre>
+<p>GFile to read from.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-giostreamsink.html b/docs/plugins/html/gst-plugins-base-plugins-giostreamsink.html
new file mode 100644
index 0000000..fffd1b3
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-giostreamsink.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>giostreamsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-giosrc.html" title="giosrc">
+<link rel="next" href="gst-plugins-base-plugins-giostreamsrc.html" title="giostreamsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-giosrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-giostreamsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-giostreamsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-giostreamsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-giostreamsink.top_of_page"></a>giostreamsink</span></h2>
+<p>giostreamsink — Write to any GIO stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-giostreamsink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGioStreamSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink-struct" title="struct GstGioStreamSink">GstGioStreamSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstGioBaseSink
+ +----GstGioStreamSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink--stream" title='The "stream" property'>stream</a>" <a href="http://library.gnome.org/devel/gio/unstable/GOutputStream.html"><span class="type">GOutputStream</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsink.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id521076"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gio.html#plugin-gio">gio</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id525229"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGioStreamSink-struct"></a><h3>struct GstGioStreamSink</h3>
+<pre class="programlisting">struct GstGioStreamSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGioStreamSink--stream"></a><h3>The <code class="literal">"stream"</code> property</h3>
+<pre class="programlisting"> "stream" <a href="http://library.gnome.org/devel/gio/unstable/GOutputStream.html"><span class="type">GOutputStream</span></a>* : Read / Write</pre>
+<p>Stream to write to.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-giostreamsrc.html b/docs/plugins/html/gst-plugins-base-plugins-giostreamsrc.html
new file mode 100644
index 0000000..ca196cb
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-giostreamsrc.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>giostreamsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-giostreamsink.html" title="giostreamsink">
+<link rel="next" href="gst-plugins-base-plugins-multifdsink.html" title="multifdsink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-giostreamsink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-multifdsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-giostreamsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-giostreamsrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-giostreamsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-giostreamsrc.top_of_page"></a>giostreamsrc</span></h2>
+<p>giostreamsrc — Read from any GIO stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-giostreamsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstGioStreamSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc-struct" title="struct GstGioStreamSrc">GstGioStreamSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstGioBaseSrc
+ +----GstGioStreamSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc--stream" title='The "stream" property'>stream</a>" <a href="http://library.gnome.org/devel/gio/unstable/GInputStream.html"><span class="type">GInputStream</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsrc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id527868"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-gio.html#plugin-gio">gio</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id480417"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstGioStreamSrc-struct"></a><h3>struct GstGioStreamSrc</h3>
+<pre class="programlisting">struct GstGioStreamSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-giostreamsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstGioStreamSrc--stream"></a><h3>The <code class="literal">"stream"</code> property</h3>
+<pre class="programlisting"> "stream" <a href="http://library.gnome.org/devel/gio/unstable/GInputStream.html"><span class="type">GInputStream</span></a>* : Read / Write</pre>
+<p>Stream to read from.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-multifdsink.html b/docs/plugins/html/gst-plugins-base-plugins-multifdsink.html
new file mode 100644
index 0000000..2730e30
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-multifdsink.html
@@ -0,0 +1,935 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>multifdsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-giostreamsrc.html" title="giostreamsrc">
+<link rel="next" href="gst-plugins-base-plugins-oggdemux.html" title="oggdemux">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-giostreamsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-oggdemux.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-multifdsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-multifdsink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-multifdsink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-multifdsink.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-multifdsink.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-multifdsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-multifdsink.top_of_page"></a>multifdsink</span></h2>
+<p>multifdsink — Send data to multiple filedescriptors</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-multifdsink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstMultiFdSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-struct" title="struct GstMultiFdSink">GstMultiFdSink</a>;
+enum <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstRecoverPolicy" title="enum GstRecoverPolicy">GstRecoverPolicy</a>;
+enum <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstSyncMethod" title="enum GstSyncMethod">GstSyncMethod</a>;
+enum <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstClientStatus" title="enum GstClientStatus">GstClientStatus</a>;
+enum <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType">GstTCPUnitType</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstMultiFdSink
+ +----<a class="link" href="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink">GstTCPServerSink</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-max" title='The "buffers-max" property'>buffers-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-queued" title='The "buffers-queued" property'>buffers-queued</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-soft-max" title='The "buffers-soft-max" property'>buffers-soft-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-served" title='The "bytes-served" property'>bytes-served</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-to-serve" title='The "bytes-to-serve" property'>bytes-to-serve</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--mode" title='The "mode" property'>mode</a>" <span class="type">GstFDSetMode</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--protocol" title='The "protocol" property'>protocol</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--recover-policy" title='The "recover-policy" property'>recover-policy</a>" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstRecoverPolicy" title="enum GstRecoverPolicy"><span class="type">GstRecoverPolicy</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-clients" title='The "sync-clients" property'>sync-clients</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-method" title='The "sync-method" property'>sync-method</a>" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstSyncMethod" title="enum GstSyncMethod"><span class="type">GstSyncMethod</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--timeout" title='The "timeout" property'>timeout</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-min" title='The "buffers-min" property'>buffers-min</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-unit" title='The "burst-unit" property'>burst-unit</a>" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-value" title='The "burst-value" property'>burst-value</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-min" title='The "bytes-min" property'>bytes-min</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--time-min" title='The "time-min" property'>time-min</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--unit-type" title='The "unit-type" property'>unit-type</a>" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-max" title='The "units-max" property'>units-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-soft-max" title='The "units-soft-max" property'>units-soft-max</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--qos-dscp" title='The "qos-dscp" property'>qos-dscp</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--handle-read" title='The "handle-read" property'>handle-read</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--resend-streamheader" title='The "resend-streamheader" property'>resend-streamheader</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--num-fds" title='The "num-fds" property'>num-fds</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add" title='The "add" signal'>add</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-clear" title='The "clear" signal'>clear</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-added" title='The "client-added" signal'>client-added</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed" title='The "client-removed" signal'>client-removed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-get-stats" title='The "get-stats" signal'>get-stats</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove" title='The "remove" signal'>remove</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-fd-removed" title='The "client-fd-removed" signal'>client-fd-removed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add-full" title='The "add-full" signal'>add-full</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove-flush" title='The "remove-flush" signal'>remove-flush</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.description"></a><h2>Description</h2>
+<p>
+This plugin writes incoming data to a set of file descriptors. The
+file descriptors can be added to multifdsink by emitting the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add" title='The "add" signal'><span class="type">"add"</span></a> signal.
+For each descriptor added, the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-added" title='The "client-added" signal'><span class="type">"client-added"</span></a> signal will be called.
+</p>
+<p>
+As of version 0.10.8, a client can also be added with the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add-full" title='The "add-full" signal'><span class="type">"add-full"</span></a> signal
+that allows for more control over what and how much data a client
+initially receives.
+</p>
+<p>
+Clients can be removed from multifdsink by emitting the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove" title='The "remove" signal'><span class="type">"remove"</span></a> signal. For
+each descriptor removed, the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed" title='The "client-removed" signal'><span class="type">"client-removed"</span></a> signal will be called. The
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed" title='The "client-removed" signal'><span class="type">"client-removed"</span></a> signal can also be fired when multifdsink decides that a
+client is not active anymore or, depending on the value of the
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--recover-policy" title='The "recover-policy" property'><span class="type">"recover-policy"</span></a> property, if the client is reading too slowly.
+In all cases, multifdsink will never close a file descriptor itself.
+The user of multifdsink is responsible for closing all file descriptors.
+This can for example be done in response to the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-fd-removed" title='The "client-fd-removed" signal'><span class="type">"client-fd-removed"</span></a> signal.
+Note that multifdsink still has a reference to the file descriptor when the
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed" title='The "client-removed" signal'><span class="type">"client-removed"</span></a> signal is emitted, so that "get-stats" can be performed on
+the descriptor; it is therefore not safe to close the file descriptor in
+the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed" title='The "client-removed" signal'><span class="type">"client-removed"</span></a> signal handler, and you should use the
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-fd-removed" title='The "client-fd-removed" signal'><span class="type">"client-fd-removed"</span></a> signal to safely close the fd.
+</p>
+<p>
+Multifdsink internally keeps a queue of the incoming buffers and uses a
+separate thread to send the buffers to the clients. This ensures that no
+client write can block the pipeline and that clients can read with different
+speeds.
+</p>
+<p>
+When adding a client to multifdsink, the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-method" title='The "sync-method" property'><span class="type">"sync-method"</span></a> property will define
+which buffer in the queued buffers will be sent first to the client. Clients
+can be sent the most recent buffer (which might not be decodable by the
+client if it is not a keyframe), the next keyframe received in
+multifdsink (which can take some time depending on the keyframe rate), or the
+last received keyframe (which will cause a simple burst-on-connect).
+Multifdsink will always keep at least one keyframe in its internal buffers
+when the sync-mode is set to latest-keyframe.
+</p>
+<p>
+As of version 0.10.8, there are additional values for the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-method" title='The "sync-method" property'><span class="type">"sync-method"</span></a>
+property to allow finer control over burst-on-connect behaviour. By selecting
+the 'burst' method a minimum burst size can be chosen, 'burst-keyframe'
+additionally requires that the burst begin with a keyframe, and
+'burst-with-keyframe' attempts to burst beginning with a keyframe, but will
+prefer a minimum burst size even if it requires not starting with a keyframe.
+</p>
+<p>
+Multifdsink can be instructed to keep at least a minimum amount of data
+expressed in time or byte units in its internal queues with the the
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--time-min" title='The "time-min" property'><span class="type">"time-min"</span></a> and <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-min" title='The "bytes-min" property'><span class="type">"bytes-min"</span></a> properties respectively.
+These properties are useful if the application adds clients with the
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add-full" title='The "add-full" signal'><span class="type">"add-full"</span></a> signal to make sure that a burst connect can
+actually be honored.
+</p>
+<p>
+When streaming data, clients are allowed to read at a different rate than
+the rate at which multifdsink receives data. If the client is reading too
+fast, no data will be send to the client until multifdsink receives more
+data. If the client, however, reads too slowly, data for that client will be
+queued up in multifdsink. Two properties control the amount of data
+(buffers) that is queued in multifdsink: <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-max" title='The "buffers-max" property'><span class="type">"buffers-max"</span></a> and
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-soft-max" title='The "buffers-soft-max" property'><span class="type">"buffers-soft-max"</span></a>. A client that falls behind by
+<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-max" title='The "buffers-max" property'><span class="type">"buffers-max"</span></a> is removed from multifdsink forcibly.
+</p>
+<p>
+A client with a lag of at least <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-soft-max" title='The "buffers-soft-max" property'><span class="type">"buffers-soft-max"</span></a> enters the recovery
+procedure which is controlled with the <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--recover-policy" title='The "recover-policy" property'><span class="type">"recover-policy"</span></a> property.
+A recover policy of NONE will do nothing, RESYNC_LATEST will send the most recently
+received buffer as the next buffer for the client, RESYNC_SOFT_LIMIT
+positions the client to the soft limit in the buffer queue and
+RESYNC_KEYFRAME positions the client at the most recent keyframe in the
+buffer queue.
+</p>
+<p>
+multifdsink will by default synchronize on the clock before serving the
+buffers to the clients. This behaviour can be disabled by setting the sync
+property to FALSE. Multifdsink will by default not do QoS and will never
+drop late buffers.
+</p>
+<p>
+Last reviewed on 2006-09-12 (0.10.10)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id528543"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">tcp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Network</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id528604"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMultiFdSink-struct"></a><h3>struct GstMultiFdSink</h3>
+<pre class="programlisting">struct GstMultiFdSink;</pre>
+<p>
+The multifdsink object structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRecoverPolicy"></a><h3>enum GstRecoverPolicy</h3>
+<pre class="programlisting">typedef enum {
+ GST_RECOVER_POLICY_NONE,
+ GST_RECOVER_POLICY_RESYNC_LATEST,
+ GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT,
+ GST_RECOVER_POLICY_RESYNC_KEYFRAME
+} GstRecoverPolicy;
+</pre>
+<p>
+Possible values for the recovery procedure to use when a client consumes
+data too slow and has a backlag of more that soft-limit buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RECOVER-POLICY-NONE:CAPS"></a><span class="term"><code class="literal">GST_RECOVER_POLICY_NONE</code></span></p></td>
+<td>no recovering is done
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RECOVER-POLICY-RESYNC-LATEST:CAPS"></a><span class="term"><code class="literal">GST_RECOVER_POLICY_RESYNC_LATEST</code></span></p></td>
+<td>client is moved to last buffer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RECOVER-POLICY-RESYNC-SOFT-LIMIT:CAPS"></a><span class="term"><code class="literal">GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT</code></span></p></td>
+<td>client is moved to the soft limit
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RECOVER-POLICY-RESYNC-KEYFRAME:CAPS"></a><span class="term"><code class="literal">GST_RECOVER_POLICY_RESYNC_KEYFRAME</code></span></p></td>
+<td>client is moved to latest keyframe
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSyncMethod"></a><h3>enum GstSyncMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_SYNC_METHOD_LATEST,
+ GST_SYNC_METHOD_NEXT_KEYFRAME,
+ GST_SYNC_METHOD_LATEST_KEYFRAME,
+ GST_SYNC_METHOD_BURST,
+ GST_SYNC_METHOD_BURST_KEYFRAME,
+ GST_SYNC_METHOD_BURST_WITH_KEYFRAME
+} GstSyncMethod;
+</pre>
+<p>
+This enum defines the selection of the first buffer that is sent
+to a new client.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-LATEST:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_LATEST</code></span></p></td>
+<td>client receives most recent buffer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-NEXT-KEYFRAME:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_NEXT_KEYFRAME</code></span></p></td>
+<td>client receives next keyframe
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-LATEST-KEYFRAME:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_LATEST_KEYFRAME</code></span></p></td>
+<td>client receives latest keyframe (burst)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-BURST:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_BURST</code></span></p></td>
+<td>client receives specific amount of data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-BURST-KEYFRAME:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_BURST_KEYFRAME</code></span></p></td>
+<td>client receives specific amount of data
+ starting from latest keyframe
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SYNC-METHOD-BURST-WITH-KEYFRAME:CAPS"></a><span class="term"><code class="literal">GST_SYNC_METHOD_BURST_WITH_KEYFRAME</code></span></p></td>
+<td>client receives specific amount of data from
+ a keyframe, or if there is not enough data after
+ the keyframe, starting before the keyframe
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClientStatus"></a><h3>enum GstClientStatus</h3>
+<pre class="programlisting">typedef enum {
+ GST_CLIENT_STATUS_OK = 0,
+ GST_CLIENT_STATUS_CLOSED = 1,
+ GST_CLIENT_STATUS_REMOVED = 2,
+ GST_CLIENT_STATUS_SLOW = 3,
+ GST_CLIENT_STATUS_ERROR = 4,
+ GST_CLIENT_STATUS_DUPLICATE = 5,
+ GST_CLIENT_STATUS_FLUSHING = 6
+} GstClientStatus;
+</pre>
+<p>
+This specifies the reason why a client was removed from
+multifdsink and is received in the "client-removed" signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-OK:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_OK</code></span></p></td>
+<td>client is ok
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-CLOSED:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_CLOSED</code></span></p></td>
+<td>client closed the socket
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-REMOVED:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_REMOVED</code></span></p></td>
+<td>client is removed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-SLOW:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_SLOW</code></span></p></td>
+<td>client is too slow
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-ERROR:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_ERROR</code></span></p></td>
+<td>client is in error
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-DUPLICATE:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_DUPLICATE</code></span></p></td>
+<td>same client added twice
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLIENT-STATUS-FLUSHING:CAPS"></a><span class="term"><code class="literal">GST_CLIENT_STATUS_FLUSHING</code></span></p></td>
+<td>client is flushing out the remaining buffers.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPUnitType"></a><h3>enum GstTCPUnitType</h3>
+<pre class="programlisting">typedef enum {
+ GST_TCP_UNIT_TYPE_UNDEFINED,
+ GST_TCP_UNIT_TYPE_BUFFERS,
+ GST_TCP_UNIT_TYPE_TIME,
+ GST_TCP_UNIT_TYPE_BYTES
+} GstTCPUnitType;
+</pre>
+<p>
+The units used to specify limits.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TCP-UNIT-TYPE-UNDEFINED:CAPS"></a><span class="term"><code class="literal">GST_TCP_UNIT_TYPE_UNDEFINED</code></span></p></td>
+<td>undefined
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TCP-UNIT-TYPE-BUFFERS:CAPS"></a><span class="term"><code class="literal">GST_TCP_UNIT_TYPE_BUFFERS</code></span></p></td>
+<td>buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TCP-UNIT-TYPE-TIME:CAPS"></a><span class="term"><code class="literal">GST_TCP_UNIT_TYPE_TIME</code></span></p></td>
+<td>timeunits (in nanoseconds)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TCP-UNIT-TYPE-BYTES:CAPS"></a><span class="term"><code class="literal">GST_TCP_UNIT_TYPE_BYTES</code></span></p></td>
+<td>bytes
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstMultiFdSink--buffers-max"></a><h3>The <code class="literal">"buffers-max"</code> property</h3>
+<pre class="programlisting"> "buffers-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>max number of buffers to queue for a client (-1 = no limit).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--buffers-queued"></a><h3>The <code class="literal">"buffers-queued"</code> property</h3>
+<pre class="programlisting"> "buffers-queued" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Number of buffers currently queued.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--buffers-soft-max"></a><h3>The <code class="literal">"buffers-soft-max"</code> property</h3>
+<pre class="programlisting"> "buffers-soft-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Recover client when going over this limit (-1 = no limit).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--bytes-served"></a><h3>The <code class="literal">"bytes-served"</code> property</h3>
+<pre class="programlisting"> "bytes-served" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Total number of bytes send to all clients.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--bytes-to-serve"></a><h3>The <code class="literal">"bytes-to-serve"</code> property</h3>
+<pre class="programlisting"> "bytes-to-serve" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of bytes received to serve to clients.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--mode"></a><h3>The <code class="literal">"mode"</code> property</h3>
+<pre class="programlisting"> "mode" <span class="type">GstFDSetMode</span> : Read / Write</pre>
+<p>The mode for selecting activity on the fds (deprecated).</p>
+<p>Default value: Poll</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--protocol"></a><h3>The <code class="literal">"protocol"</code> property</h3>
+<pre class="programlisting"> "protocol" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write</pre>
+<p>The protocol to wrap data in. GDP protocol here is deprecated. Please use gdppay element.</p>
+<p>Default value: GST_TCP_PROTOCOL_NONE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--recover-policy"></a><h3>The <code class="literal">"recover-policy"</code> property</h3>
+<pre class="programlisting"> "recover-policy" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstRecoverPolicy" title="enum GstRecoverPolicy"><span class="type">GstRecoverPolicy</span></a> : Read / Write</pre>
+<p>How to recover when client reaches the soft max.</p>
+<p>Default value: Do not try to recover</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--sync-clients"></a><h3>The <code class="literal">"sync-clients"</code> property</h3>
+<pre class="programlisting"> "sync-clients" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>(DEPRECATED) Sync clients to a keyframe.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--sync-method"></a><h3>The <code class="literal">"sync-method"</code> property</h3>
+<pre class="programlisting"> "sync-method" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstSyncMethod" title="enum GstSyncMethod"><span class="type">GstSyncMethod</span></a> : Read / Write</pre>
+<p>How to sync new clients to the stream.</p>
+<p>Default value: Serve starting from the latest buffer</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--timeout"></a><h3>The <code class="literal">"timeout"</code> property</h3>
+<pre class="programlisting"> "timeout" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Maximum inactivity timeout in nanoseconds for a client (0 = no limit).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--buffers-min"></a><h3>The <code class="literal">"buffers-min"</code> property</h3>
+<pre class="programlisting"> "buffers-min" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>min number of buffers to queue (-1 = as few as possible).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--burst-unit"></a><h3>The <code class="literal">"burst-unit"</code> property</h3>
+<pre class="programlisting"> "burst-unit" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> : Read / Write</pre>
+<p>The format of the burst units (when sync-method is burst[[-with]-keyframe]).</p>
+<p>Default value: Undefined</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--burst-value"></a><h3>The <code class="literal">"burst-value"</code> property</h3>
+<pre class="programlisting"> "burst-value" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>The amount of burst expressed in burst-unit.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--bytes-min"></a><h3>The <code class="literal">"bytes-min"</code> property</h3>
+<pre class="programlisting"> "bytes-min" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>min number of bytes to queue (-1 = as little as possible).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--time-min"></a><h3>The <code class="literal">"time-min"</code> property</h3>
+<pre class="programlisting"> "time-min" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>min number of time to queue (-1 = as little as possible).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--unit-type"></a><h3>The <code class="literal">"unit-type"</code> property</h3>
+<pre class="programlisting"> "unit-type" <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> : Read / Write</pre>
+<p>The unit to measure the max/soft-max/queued properties.</p>
+<p>Default value: Buffers</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--units-max"></a><h3>The <code class="literal">"units-max"</code> property</h3>
+<pre class="programlisting"> "units-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>max number of units to queue (-1 = no limit).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--units-soft-max"></a><h3>The <code class="literal">"units-soft-max"</code> property</h3>
+<pre class="programlisting"> "units-soft-max" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Recover client when going over this limit (-1 = no limit).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--qos-dscp"></a><h3>The <code class="literal">"qos-dscp"</code> property</h3>
+<pre class="programlisting"> "qos-dscp" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Quality of Service, differentiated services code point (-1 default).</p>
+<p>Allowed values: [-1,63]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--handle-read"></a><h3>The <code class="literal">"handle-read"</code> property</h3>
+<pre class="programlisting"> "handle-read" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Handle client reads and discard the data.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--resend-streamheader"></a><h3>The <code class="literal">"resend-streamheader"</code> property</h3>
+<pre class="programlisting"> "resend-streamheader" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Resend the streamheader if it changes in the caps.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink--num-fds"></a><h3>The <code class="literal">"num-fds"</code> property</h3>
+<pre class="programlisting"> "num-fds" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>The current number of client file descriptors.</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstMultiFdSink-add"></a><h3>The <code class="literal">"add"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Hand the given open file descriptor to multifdsink to write to.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor to add to multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-clear"></a><h3>The <code class="literal">"clear"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Remove all file descriptors from multifdsink. Since multifdsink did not
+open fd's itself, it does not explicitly close the fd. The application
+should do so by connecting to the client-fd-removed callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-client-added"></a><h3>The <code class="literal">"client-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+The given file descriptor was added to multifdsink. This signal will
+be emitted from the streaming thread so application should be prepared
+for that.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element that emitted this signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor that was added to multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-client-removed"></a><h3>The <code class="literal">"client-removed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstClientStatus" title="enum GstClientStatus"><span class="type">GstClientStatus</span></a> status,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+The given file descriptor is about to be removed from multifdsink. This
+signal will be emitted from the streaming thread so applications should
+be prepared for that.
+</p>
+<p>
+<em class="parameter"><code>gstmultifdsink</code></em> still holds a handle to <em class="parameter"><code>fd</code></em> so it is possible to call
+the get-stats signal from this callback. For the same reason it is
+not safe to <code class="function">close()</code> and reuse <em class="parameter"><code>fd</code></em> in this callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element that emitted this signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor that is to be removed from multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>status</code></em> :</span></p></td>
+<td>the reason why the client was removed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-get-stats"></a><h3>The <code class="literal">"get-stats"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Get statistics about <em class="parameter"><code>fd</code></em>. This function returns a GValueArray to ease
+automatic wrapping for bindings.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor to get stats of from multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a GValueArray with the statistics. The array contains guint64
+values that represent respectively: total number of bytes sent, time
+when the client was added, time when the client was
+disconnected/removed, time the client is/was active, last activity
+time (in epoch seconds), number of buffers dropped.
+All times are expressed in nanoseconds (GstClockTime).
+The array can be 0-length if the client was not found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-remove"></a><h3>The <code class="literal">"remove"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Remove the given open file descriptor from multifdsink.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor to remove from multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-client-fd-removed"></a><h3>The <code class="literal">"client-fd-removed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+The given file descriptor was removed from multifdsink. This signal will
+be emitted from the streaming thread so applications should be prepared
+for that.
+</p>
+<p>
+In this callback, <em class="parameter"><code>gstmultifdsink</code></em> has removed all the information
+associated with <em class="parameter"><code>fd</code></em> and it is therefore not possible to call get-stats
+with <em class="parameter"><code>fd</code></em>. It is however safe to <code class="function">close()</code> and reuse <em class="parameter"><code>fd</code></em> in the callback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element that emitted this signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor that was removed from multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.7</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-add-full"></a><h3>The <code class="literal">"add-full"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstSyncMethod" title="enum GstSyncMethod"><span class="type">GstSyncMethod</span></a> sync,
+ <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> unit_type_min,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value_min,
+ <a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType" title="enum GstTCPUnitType"><span class="type">GstTCPUnitType</span></a> unit_type_max,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value_max,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Hand the given open file descriptor to multifdsink to write to and
+specify the burst parameters for the new connection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor to add to multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sync</code></em> :</span></p></td>
+<td>the sync method to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>unit_type_min</code></em> :</span></p></td>
+<td>the unit-type of <em class="parameter"><code>value_min</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_min</code></em> :</span></p></td>
+<td>the minimum amount of data to burst expressed in
+<em class="parameter"><code>unit_type_min</code></em> units.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>unit_type_max</code></em> :</span></p></td>
+<td>the unit-type of <em class="parameter"><code>value_max</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_max</code></em> :</span></p></td>
+<td>the maximum amount of data to burst expressed in
+<em class="parameter"><code>unit_type_max</code></em> units.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiFdSink-remove-flush"></a><h3>The <code class="literal">"remove-flush"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink"><span class="type">GstMultiFdSink</span></a> *gstmultifdsink,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> fd,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-ACTION:CAPS"><code class="literal">Action</code></a></pre>
+<p>
+Remove the given open file descriptor from multifdsink after flushing all
+the pending data to the fd.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstmultifdsink</code></em> :</span></p></td>
+<td>the multifdsink element to emit this signal on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>the file descriptor to remove from multifdsink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-multifdsink.see-also"></a><h2>See Also</h2>
+tcpserversink
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-oggdemux.html b/docs/plugins/html/gst-plugins-base-plugins-oggdemux.html
new file mode 100644
index 0000000..dc47472
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-oggdemux.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>oggdemux</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-multifdsink.html" title="multifdsink">
+<link rel="next" href="gst-plugins-base-plugins-oggmux.html" title="oggmux">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-multifdsink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-oggmux.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-oggdemux.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggdemux.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggdemux.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-oggdemux"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-oggdemux.top_of_page"></a>oggdemux</span></h2>
+<p>oggdemux — demux ogg streams (info about ogg: http://xiph.org)</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-oggdemux.synopsis"></a><h2>Synopsis</h2>
+<a name="GstOggDemux"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-oggdemux.html#GstOggDemux-struct" title="struct GstOggDemux">GstOggDemux</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggdemux.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstOggDemux
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggdemux.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id489789"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-ogg.html#plugin-ogg">ogg</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Demuxer</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id484410"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>application/ogg</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> application/x-annodex</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src_%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>sometimes</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggdemux.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstOggDemux-struct"></a><h3>struct GstOggDemux</h3>
+<pre class="programlisting">struct GstOggDemux;</pre>
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-oggmux.html b/docs/plugins/html/gst-plugins-base-plugins-oggmux.html
new file mode 100644
index 0000000..4c340c2
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-oggmux.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>oggmux</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-oggdemux.html" title="oggdemux">
+<link rel="next" href="gst-plugins-base-plugins-playbin.html" title="playbin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-oggdemux.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-playbin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-oggmux.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggmux.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggmux.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggmux.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-oggmux.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-oggmux"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-oggmux.top_of_page"></a>oggmux</span></h2>
+<p>oggmux — mux ogg streams (info about ogg: http://xiph.org)</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-oggmux.synopsis"></a><h2>Synopsis</h2>
+<a name="GstOggMux"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-oggmux.html#GstOggMux-struct" title="struct GstOggMux">GstOggMux</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstOggMux
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstOggMux implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html">GstPreset</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-oggmux.html#GstOggMux--max-delay" title='The "max-delay" property'>max-delay</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-oggmux.html#GstOggMux--max-page-delay" title='The "max-page-delay" property'>max-page-delay</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id533167"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-ogg.html#plugin-ogg">ogg</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Muxer</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id512151"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink_%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>request</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-theora</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-vorbis</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-flac</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-speex</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-celt</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> application/x-ogm-video</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> application/x-ogm-audio</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-dirac</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-smoke</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-vp8</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> text/x-cmml, encoded=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> subtitle/x-kate</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> application/x-kate</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>application/ogg</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstOggMux-struct"></a><h3>struct GstOggMux</h3>
+<pre class="programlisting">struct GstOggMux;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-oggmux.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstOggMux--max-delay"></a><h3>The <code class="literal">"max-delay"</code> property</h3>
+<pre class="programlisting"> "max-delay" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Maximum delay in multiplexing streams.</p>
+<p>Default value: 500000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOggMux--max-page-delay"></a><h3>The <code class="literal">"max-page-delay"</code> property</h3>
+<pre class="programlisting"> "max-page-delay" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Maximum delay for sending out a page.</p>
+<p>Default value: 500000000</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-playbin.html b/docs/plugins/html/gst-plugins-base-plugins-playbin.html
new file mode 100644
index 0000000..f7ce4ea
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-playbin.html
@@ -0,0 +1,492 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>playbin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-oggmux.html" title="oggmux">
+<link rel="next" href="gst-plugins-base-plugins-subtitleoverlay.html" title="subtitleoverlay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-oggmux.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-subtitleoverlay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-playbin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-playbin.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-playbin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-playbin.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-playbin.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-playbin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-playbin.top_of_page"></a>playbin</span></h2>
+<p>playbin — Autoplug and play media from an uri</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-playbin.synopsis"></a><h2>Synopsis</h2>
+<a name="GstPlayBin"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin-struct" title="struct GstPlayBin">GstPlayBin</a>;
+enum <a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayFlags" title="enum GstPlayFlags">GstPlayFlags</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html">GstPipeline</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/GstPlayBaseBin.html">GstPlayBaseBin</a>
+ +----GstPlayBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstPlayBin implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstChildProxy.html">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--audio-sink" title='The "audio-sink" property'>audio-sink</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--frame" title='The "frame" property'>frame</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--subtitle-font-desc" title='The "subtitle-font-desc" property'>subtitle-font-desc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--video-sink" title='The "video-sink" property'>video-sink</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--vis-plugin" title='The "vis-plugin" property'>vis-plugin</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--volume" title='The "volume" property'>volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--connection-speed" title='The "connection-speed" property'>connection-speed</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.description"></a><h2>Description</h2>
+<p>
+Playbin provides a stand-alone everything-in-one abstraction for an
+audio and/or video player.
+</p>
+<p>
+Playbin can handle both audio and video files and features
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+automatic file type recognition and based on that automatic
+selection and usage of the right audio/video/subtitle demuxers/decoders
+</li>
+<li class="listitem">
+visualisations for audio files
+</li>
+<li class="listitem">
+subtitle support for video files. Subtitles can be store in external
+files.
+</li>
+<li class="listitem">
+stream selection between different video/audio/subtitles streams
+</li>
+<li class="listitem">
+meta info (tag) extraction
+</li>
+<li class="listitem">
+easy access to the last video frame
+</li>
+<li class="listitem">
+buffering when playing streams over a network
+</li>
+<li class="listitem">
+volume control with mute option
+</li>
+</ul></div>
+<p>
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id535719"></a><h3>Usage</h3>
+<p>
+A playbin element can be created just like any other element using
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make"><code class="function">gst_element_factory_make()</code></a>. The file/URI to play should be set via the <span class="type">"uri"</span>
+property. This must be an absolute URI, relative file paths are not allowed.
+Example URIs are file:///home/joe/movie.avi or http://www.joedoe.com/foo.ogg
+</p>
+<p>
+Playbin is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a>. It will notify the application of everything
+that's happening (errors, end of stream, tags found, state changes, etc.)
+by posting messages on its <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBus.html"><span class="type">GstBus</span></a>. The application needs to watch the
+bus.
+</p>
+<p>
+Playback can be initiated by setting the element to PLAYING state using
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-set-state"><code class="function">gst_element_set_state()</code></a>. Note that the state change will take place in
+the background in a separate thread, when the function returns playback
+is probably not happening yet and any errors might not have occured yet.
+Applications using playbin should ideally be written to deal with things
+completely asynchroneous.
+</p>
+<p>
+When playback has finished (an EOS message has been received on the bus)
+or an error has occured (an ERROR message has been received on the bus) or
+the user wants to play a different track, playbin should be set back to
+READY or NULL state, then the <span class="type">"uri"</span> property should be set to the
+new location and then playbin be set to PLAYING state again.
+</p>
+<p>
+Seeking can be done using <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-seek-simple"><code class="function">gst_element_seek_simple()</code></a> or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-seek"><code class="function">gst_element_seek()</code></a>
+on the playbin element. Again, the seek will not be executed
+instantaneously, but will be done in a background thread. When the seek
+call returns the seek will most likely still be in process. An application
+may wait for the seek to finish (or fail) using <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-get-state"><code class="function">gst_element_get_state()</code></a> with
+-1 as the timeout, but this will block the user interface and is not
+recommended at all.
+</p>
+<p>
+Applications may query the current position and duration of the stream
+via <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-query-position"><code class="function">gst_element_query_position()</code></a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-query-duration"><code class="function">gst_element_query_duration()</code></a> and
+setting the format passed to GST_FORMAT_TIME. If the query was successful,
+the duration or position will have been returned in units of nanoseconds.
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531133"></a><h3>Advanced Usage: specifying the audio and video sink</h3>
+<p>
+By default, if no audio sink or video sink has been specified via the
+<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--audio-sink" title='The "audio-sink" property'><span class="type">"audio-sink"</span></a> or <a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--video-sink" title='The "video-sink" property'><span class="type">"video-sink"</span></a> property, playbin will use the autoaudiosink
+and autovideosink elements to find the first-best available output method.
+This should work in most cases, but is not always desirable. Often either
+the user or application might want to specify more explicitly what to use
+for audio and video output.
+</p>
+<p>
+If the application wants more control over how audio or video should be
+output, it may create the audio/video sink elements itself (for example
+using <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make"><code class="function">gst_element_factory_make()</code></a>) and provide them to playbin using the
+<a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--audio-sink" title='The "audio-sink" property'><span class="type">"audio-sink"</span></a> or <a class="link" href="gst-plugins-base-plugins-playbin.html#GstPlayBin--video-sink" title='The "video-sink" property'><span class="type">"video-sink"</span></a> property.
+</p>
+<p>
+GNOME-based applications, for example, will usually want to create
+gconfaudiosink and gconfvideosink elements and make playbin use those,
+so that output happens to whatever the user has configured in the GNOME
+Multimedia System Selector configuration dialog.
+</p>
+<p>
+The sink elements do not necessarily need to be ready-made sinks. It is
+possible to create container elements that look like a sink to playbin,
+but in reality contain a number of custom elements linked together. This
+can be achieved by creating a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html"><span class="type">GstBin</span></a> and putting elements in there and
+linking them, and then creating a sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstGhostPad.html"><span class="type">GstGhostPad</span></a> for the bin and pointing
+it to the sink pad of the first element within the bin. This can be used
+for a number of purposes, for example to force output to a particular
+format or to modify or observe the data before it is output.
+</p>
+<p>
+It is also possible to 'suppress' audio and/or video output by using
+'fakesink' elements (or capture it from there using the fakesink element's
+"handoff" signal, which, nota bene, is fired from the streaming thread!).
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531221"></a><h3>Retrieving Tags and Other Meta Data</h3>
+<p>
+Most of the common meta data (artist, title, etc.) can be retrieved by
+watching for TAG messages on the pipeline's bus (see above).
+</p>
+<p>
+Other more specific meta information like width/height/framerate of video
+streams or samplerate/number of channels of audio streams can be obtained
+from the negotiated caps on the sink pads of the sinks.
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531239"></a><h3>Buffering</h3>
+Playbin handles buffering automatically for the most part, but applications
+need to handle parts of the buffering process as well. Whenever playbin is
+buffering, it will post BUFFERING messages on the bus with a percentage
+value that shows the progress of the buffering process. Applications need
+to set playbin to PLAYING or PAUSED state in response to these messages.
+They may also want to convey the buffering progress to the user in some
+way. Here is how to extract the percentage information from the message
+(requires GStreamer &gt;= 0.10.11):
+<div class="informalexample"><pre class="programlisting">
+switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_BUFFERING: {
+ gint percent = 0;
+ gst_message_parse_buffering (msg, &amp;percent);
+ g_print ("Buffering (%%u percent done)", percent);
+ break;
+ }
+ ...
+}
+</pre></div>
+Note that applications should keep/set the pipeline in the PAUSED state when
+a BUFFERING message is received with a buffer percent value &lt; 100 and set
+the pipeline back to PLAYING state when a BUFFERING message with a value
+of 100 percent is received (if PLAYING is the desired state, that is).
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531262"></a><h3>Embedding the video window in your application</h3>
+By default, playbin (or rather the video sinks used) will create their own
+window. Applications will usually want to force output to a window of their
+own, however. This can be done using the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstxoverlay.html#GstXOverlay"><span class="type">GstXOverlay</span></a> interface, which most
+video sinks implement. See the documentation there for more details.
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531278"></a><h3>Specifying which CD/DVD device to use</h3>
+The device to use for CDs/DVDs needs to be set on the source element
+playbin creates before it is opened. The only way to do this at the moment
+is to connect to playbin's "notify::source" signal, which will be emitted
+by playbin when it has created the source element for a particular URI.
+In the signal callback you can check if the source element has a "device"
+property and set it appropriately. In future ways might be added to specify
+the device as part of the URI, but at the time of writing this is not
+possible yet.
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531290"></a><h3>Handling redirects</h3>
+<p>
+Some elements may post 'redirect' messages on the bus to tell the
+application to open another location. These are element messages containing
+a structure named 'redirect' along with a 'new-location' field of string
+type. The new location may be a relative or an absolute URI. Examples
+for such redirects can be found in many quicktime movie trailers.
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id531304"></a><h3>Examples</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v playbin uri=file:///path/to/somefile.avi
+</pre></div> This will play back the given AVI video file, given that the video and
+audio decoders required to decode the content are installed. Since no
+special audio sink or video sink is supplied (not possible via gst-launch),
+playbin will try to find a suitable audio and video sink automatically
+using the autoaudiosink and autovideosink elements.
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v playbin uri=cdda://4
+</pre></div> This will play back track 4 on an audio CD in your disc drive (assuming
+the drive is detected automatically by the plugin).
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v playbin uri=dvd://1
+</pre></div> This will play back title 1 of a DVD in your disc drive (assuming
+the drive is detected automatically by the plugin).
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id531345"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-playback.html#plugin-playback">playback</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Bin/Player</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id531407"></a><h3>Element Pads</h3>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPlayBin-struct"></a><h3>struct GstPlayBin</h3>
+<pre class="programlisting">struct GstPlayBin;</pre>
+<p>
+playbin element structure
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayFlags"></a><h3>enum GstPlayFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PLAY_FLAG_VIDEO = (1 &lt;&lt; 0),
+ GST_PLAY_FLAG_AUDIO = (1 &lt;&lt; 1),
+ GST_PLAY_FLAG_TEXT = (1 &lt;&lt; 2),
+ GST_PLAY_FLAG_VIS = (1 &lt;&lt; 3),
+ GST_PLAY_FLAG_SOFT_VOLUME = (1 &lt;&lt; 4),
+ GST_PLAY_FLAG_NATIVE_AUDIO = (1 &lt;&lt; 5),
+ GST_PLAY_FLAG_NATIVE_VIDEO = (1 &lt;&lt; 6),
+ GST_PLAY_FLAG_DOWNLOAD = (1 &lt;&lt; 7),
+ GST_PLAY_FLAG_BUFFERING = (1 &lt;&lt; 8),
+ GST_PLAY_FLAG_DEINTERLACE = (1 &lt;&lt; 9)
+} GstPlayFlags;
+</pre>
+<p>
+Extra flags to configure the behaviour of the sinks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-VIDEO:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_VIDEO</code></span></p></td>
+<td>Enable rendering of the video stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-AUDIO:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_AUDIO</code></span></p></td>
+<td>Enable rendering of the audio stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-TEXT:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_TEXT</code></span></p></td>
+<td>Enable rendering of subtitles
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-VIS:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_VIS</code></span></p></td>
+<td>Enable rendering of visualisations when there is
+ no video stream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-SOFT-VOLUME:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_SOFT_VOLUME</code></span></p></td>
+<td>Use software volume
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-NATIVE-AUDIO:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_NATIVE_AUDIO</code></span></p></td>
+<td>only allow native audio formats, this omits
+ configuration of audioconvert and audioresample.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-NATIVE-VIDEO:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_NATIVE_VIDEO</code></span></p></td>
+<td>only allow native video formats, this omits
+ configuration of videoconvert and videoscale.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-DOWNLOAD:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_DOWNLOAD</code></span></p></td>
+<td>enable progressice download buffering for selected
+ formats.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-BUFFERING:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_BUFFERING</code></span></p></td>
+<td>enable buffering of the demuxed or parsed data.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLAY-FLAG-DEINTERLACE:CAPS"></a><span class="term"><code class="literal">GST_PLAY_FLAG_DEINTERLACE</code></span></p></td>
+<td>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-playbin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstPlayBin--audio-sink"></a><h3>The <code class="literal">"audio-sink"</code> property</h3>
+<pre class="programlisting"> "audio-sink" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write</pre>
+<p>the audio output element to use (NULL = default sink).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--frame"></a><h3>The <code class="literal">"frame"</code> property</h3>
+<pre class="programlisting"> "frame" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>* : Read</pre>
+<p>
+Get the currently rendered or prerolled frame in the video sink.
+The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> on the buffer will describe the format of the buffer.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--subtitle-font-desc"></a><h3>The <code class="literal">"subtitle-font-desc"</code> property</h3>
+<pre class="programlisting"> "subtitle-font-desc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write</pre>
+<p>Pango font description of font to be used for subtitle rendering.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--video-sink"></a><h3>The <code class="literal">"video-sink"</code> property</h3>
+<pre class="programlisting"> "video-sink" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write</pre>
+<p>the video output element to use (NULL = default sink).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--vis-plugin"></a><h3>The <code class="literal">"vis-plugin"</code> property</h3>
+<pre class="programlisting"> "vis-plugin" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read / Write</pre>
+<p>the visualization element to use (NULL = none).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--volume"></a><h3>The <code class="literal">"volume"</code> property</h3>
+<pre class="programlisting"> "volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>
+Get or set the current audio stream volume. 1.0 means 100%,
+0.0 means mute. This uses a linear volume scale.
+</p>
+<p>Allowed values: [0,10]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayBin--connection-speed"></a><h3>The <code class="literal">"connection-speed"</code> property</h3>
+<pre class="programlisting"> "connection-speed" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Network connection speed in kbps (0 = unknown).</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-adder.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-adder.html
new file mode 100644
index 0000000..05d67d8
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-adder.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>adder</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="next" href="gst-plugins-base-plugins-plugin-alsa.html" title="alsa">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="ch02.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-alsa.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-adder"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">adder</span></h2>
+<p>adder — <a name="plugin-adder"></a>Adds multiple streams</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id527559"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstadder.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id487672"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-adder.html" title="adder">adder</a></span></p></td>
+<td>Add N audio channels together</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-alsa.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-alsa.html
new file mode 100644
index 0000000..db2e25c
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-alsa.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>alsa</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-adder.html" title="adder">
+<link rel="next" href="gst-plugins-base-plugins-plugin-app.html" title="app">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-adder.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-app.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-alsa"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">alsa</span></h2>
+<p>alsa — <a name="plugin-alsa"></a>ALSA plugin library</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id483711"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstalsa.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id511020"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-alsamixer.html" title="alsamixer">alsamixer</a></span></p></td>
+<td>Control sound input and output levels with ALSA</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-alsasink.html" title="alsasink">alsasink</a></span></p></td>
+<td>Output to a sound card via ALSA</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-alsasrc.html" title="alsasrc">alsasrc</a></span></p></td>
+<td>Read from a sound card via ALSA</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-app.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-app.html
new file mode 100644
index 0000000..c935ee7
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-app.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>app</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-alsa.html" title="alsa">
+<link rel="next" href="gst-plugins-base-plugins-plugin-audioconvert.html" title="audioconvert">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-alsa.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-audioconvert.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-app"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">app</span></h2>
+<p>app — <a name="plugin-app"></a>Elements used to communicate with applications</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id553259"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstapp.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id502882"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-appsink.html" title="appsink">appsink</a></span></p></td>
+<td>Allow the application to get access to raw buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-appsrc.html" title="appsrc">appsrc</a></span></p></td>
+<td>Allow the application to feed buffers to a pipeline</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-audioconvert.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-audioconvert.html
new file mode 100644
index 0000000..5b02bd3
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-audioconvert.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audioconvert</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-app.html" title="app">
+<link rel="next" href="gst-plugins-base-plugins-plugin-audiorate.html" title="audiorate">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-app.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-audiorate.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-audioconvert"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">audioconvert</span></h2>
+<p>audioconvert — <a name="plugin-audioconvert"></a>Convert audio to different formats</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id488278"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstaudioconvert.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id486075"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-audioconvert.html" title="audioconvert">audioconvert</a></span></p></td>
+<td>Convert audio to different formats</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-audiorate.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-audiorate.html
new file mode 100644
index 0000000..46f19fa
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-audiorate.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audiorate</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-audioconvert.html" title="audioconvert">
+<link rel="next" href="gst-plugins-base-plugins-plugin-audioresample.html" title="audioresample">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-audioconvert.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-audioresample.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-audiorate"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">audiorate</span></h2>
+<p>audiorate — <a name="plugin-audiorate"></a>Adjusts audio frames</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id555558"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstaudiorate.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id477744"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-audiorate.html" title="audiorate">audiorate</a></span></p></td>
+<td>Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-audioresample.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-audioresample.html
new file mode 100644
index 0000000..b6a3d0a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-audioresample.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audioresample</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-audiorate.html" title="audiorate">
+<link rel="next" href="gst-plugins-base-plugins-plugin-audiotestsrc.html" title="audiotestsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-audiorate.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-audiotestsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-audioresample"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">audioresample</span></h2>
+<p>audioresample — <a name="plugin-audioresample"></a>Resamples audio</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id505318"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstaudioresample.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id504917"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-audioresample.html" title="audioresample">audioresample</a></span></p></td>
+<td>Resamples audio</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-audiotestsrc.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-audiotestsrc.html
new file mode 100644
index 0000000..1c049b8
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-audiotestsrc.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>audiotestsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-audioresample.html" title="audioresample">
+<link rel="next" href="gst-plugins-base-plugins-plugin-cdparanoia.html" title="cdparanoia">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-audioresample.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-cdparanoia.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-audiotestsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">audiotestsrc</span></h2>
+<p>audiotestsrc — <a name="plugin-audiotestsrc"></a>Creates audio test signals of given frequency and volume</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id496539"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstaudiotestsrc.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id486711"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-audiotestsrc.html" title="audiotestsrc">audiotestsrc</a></span></p></td>
+<td>Creates audio test signals of given frequency and volume</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-cdparanoia.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-cdparanoia.html
new file mode 100644
index 0000000..68af7d3
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-cdparanoia.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>cdparanoia</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-audiotestsrc.html" title="audiotestsrc">
+<link rel="next" href="gst-plugins-base-plugins-plugin-decodebin.html" title="decodebin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-audiotestsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-decodebin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-cdparanoia"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">cdparanoia</span></h2>
+<p>cdparanoia — <a name="plugin-cdparanoia"></a>Read audio from CD in paranoid mode</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id498811"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstcdparanoia.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id483696"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-cdparanoiasrc.html" title="cdparanoiasrc">cdparanoiasrc</a></span></p></td>
+<td>Read audio from CD in paranoid mode</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-decodebin.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-decodebin.html
new file mode 100644
index 0000000..778e4e0
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-decodebin.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>decodebin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-cdparanoia.html" title="cdparanoia">
+<link rel="next" href="gst-plugins-base-plugins-plugin-encoding.html" title="encoding">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-cdparanoia.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-encoding.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-decodebin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">decodebin</span></h2>
+<p>decodebin — <a name="plugin-decodebin"></a>decoder bin</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id516425"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstdecodebin.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id491462"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-decodebin.html" title="decodebin">decodebin</a></span></p></td>
+<td>Autoplug and decode to raw media</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-encoding.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-encoding.html
new file mode 100644
index 0000000..9c64e8b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-encoding.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>encoding</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-decodebin.html" title="decodebin">
+<link rel="next" href="gst-plugins-base-plugins-plugin-gdp.html" title="gdp">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-decodebin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-gdp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-encoding"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">encoding</span></h2>
+<p>encoding — <a name="plugin-encoding"></a>various encoding-related elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id476189"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstencodebin.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id477980"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-encodebin.html" title="encodebin">encodebin</a></span></p></td>
+<td>Convenience encoding/muxing element</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-gdp.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-gdp.html
new file mode 100644
index 0000000..f2a67ae
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-gdp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gdp</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-encoding.html" title="encoding">
+<link rel="next" href="gst-plugins-base-plugins-plugin-gio.html" title="gio">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-encoding.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-gio.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-gdp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">gdp</span></h2>
+<p>gdp — <a name="plugin-gdp"></a>Payload/depayload GDP packets</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id484938"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstgdp.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id494507"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-gdpdepay.html" title="gdpdepay">gdpdepay</a></span></p></td>
+<td>Depayloads GStreamer Data Protocol buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-gdppay.html" title="gdppay">gdppay</a></span></p></td>
+<td>Payloads GStreamer Data Protocol buffers</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-gio.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-gio.html
new file mode 100644
index 0000000..737a0de
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-gio.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gio</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-gdp.html" title="gdp">
+<link rel="next" href="gst-plugins-base-plugins-plugin-libvisual.html" title="libvisual">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-gdp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-libvisual.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-gio"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">gio</span></h2>
+<p>gio — <a name="plugin-gio"></a>GIO elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id486594"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstgio.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id511488"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-giosink.html" title="giosink">giosink</a></span></p></td>
+<td>Write to any GIO-supported location</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-giosrc.html" title="giosrc">giosrc</a></span></p></td>
+<td>Read from any GIO-supported location</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-giostreamsink.html" title="giostreamsink">giostreamsink</a></span></p></td>
+<td>Write to any GIO stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-giostreamsrc.html" title="giostreamsrc">giostreamsrc</a></span></p></td>
+<td>Read from any GIO stream</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-libvisual.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-libvisual.html
new file mode 100644
index 0000000..d2adc59
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-libvisual.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>libvisual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-gio.html" title="gio">
+<link rel="next" href="gst-plugins-base-plugins-plugin-ogg.html" title="ogg">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-gio.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-ogg.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-libvisual"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">libvisual</span></h2>
+<p>libvisual — <a name="plugin-libvisual"></a>libvisual visualization plugins</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id555355"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstlibvisual.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id501091"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">libvisual_bumpscope</span></p></td>
+<td>Bumpscope visual plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_corona</span></p></td>
+<td>Libvisual corona plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_infinite</span></p></td>
+<td>Infinite visual plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_jakdaw</span></p></td>
+<td>jakdaw visual plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_jess</span></p></td>
+<td>Jess visual plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_lv_analyzer</span></p></td>
+<td>Libvisual analyzer plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_lv_scope</span></p></td>
+<td>Libvisual scope plugin</td>
+</tr>
+<tr>
+<td><p><span class="term">libvisual_oinksie</span></p></td>
+<td>Libvisual Oinksie visual plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-ogg.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-ogg.html
new file mode 100644
index 0000000..bdce776
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-ogg.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>ogg</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-libvisual.html" title="libvisual">
+<link rel="next" href="gst-plugins-base-plugins-plugin-pango.html" title="pango">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-libvisual.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-pango.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-ogg"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">ogg</span></h2>
+<p>ogg — <a name="plugin-ogg"></a>ogg stream manipulation (info about ogg: http://xiph.org)</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id506149"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstogg.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id504464"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">oggaviparse</span></p></td>
+<td>parse an ogg avi stream into pages (info about ogg: http://xiph.org)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-oggdemux.html" title="oggdemux">oggdemux</a></span></p></td>
+<td>demux ogg streams (info about ogg: http://xiph.org)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-oggmux.html" title="oggmux">oggmux</a></span></p></td>
+<td>mux ogg streams (info about ogg: http://xiph.org)</td>
+</tr>
+<tr>
+<td><p><span class="term">oggparse</span></p></td>
+<td>parse ogg streams into pages (info about ogg: http://xiph.org)</td>
+</tr>
+<tr>
+<td><p><span class="term">ogmaudioparse</span></p></td>
+<td>parse an OGM audio header and stream</td>
+</tr>
+<tr>
+<td><p><span class="term">ogmtextparse</span></p></td>
+<td>parse an OGM text header and stream</td>
+</tr>
+<tr>
+<td><p><span class="term">ogmvideoparse</span></p></td>
+<td>parse an OGM video header and stream</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-pango.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-pango.html
new file mode 100644
index 0000000..9cfb723
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-pango.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>pango</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-ogg.html" title="ogg">
+<link rel="next" href="gst-plugins-base-plugins-plugin-playback.html" title="playback">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-ogg.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-playback.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-pango"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">pango</span></h2>
+<p>pango — <a name="plugin-pango"></a>Pango-based text rendering and overlay</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id479749"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstpango.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id488334"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-clockoverlay.html" title="clockoverlay">clockoverlay</a></span></p></td>
+<td>Overlays the current clock time on a video stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-textoverlay.html" title="textoverlay">textoverlay</a></span></p></td>
+<td>Adds text strings on top of a video buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-textrender.html" title="textrender">textrender</a></span></p></td>
+<td>Renders a text string to an image bitmap</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-timeoverlay.html" title="timeoverlay">timeoverlay</a></span></p></td>
+<td>Overlays buffer time stamps on a video stream</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-playback.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-playback.html
new file mode 100644
index 0000000..e26e123
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-playback.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>playback</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-pango.html" title="pango">
+<link rel="next" href="gst-plugins-base-plugins-plugin-subparse.html" title="subparse">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-pango.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-subparse.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-playback"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">playback</span></h2>
+<p>playback — <a name="plugin-playback"></a>various playback elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id556321"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstplaybin.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id495440"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-playbin.html" title="playbin">playbin</a></span></p></td>
+<td>Autoplug and play media from an uri</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-playbin2.html">playbin2</a></span></p></td>
+<td>Autoplug and play media from an uri</td>
+</tr>
+<tr>
+<td><p><span class="term">playsink</span></p></td>
+<td>Convenience sink for multiple streams</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-subtitleoverlay.html" title="subtitleoverlay">subtitleoverlay</a></span></p></td>
+<td>Overlays a video stream with subtitles</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-subparse.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-subparse.html
new file mode 100644
index 0000000..26d0f0e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-subparse.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>subparse</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-playback.html" title="playback">
+<link rel="next" href="gst-plugins-base-plugins-plugin-tcp.html" title="tcp">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-playback.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-tcp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-subparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">subparse</span></h2>
+<p>subparse — <a name="plugin-subparse"></a>Subtitle parsing</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id473973"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstsubparse.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id478655"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">ssaparse</span></p></td>
+<td>Parses SSA subtitle streams</td>
+</tr>
+<tr>
+<td><p><span class="term">subparse</span></p></td>
+<td>Parses subtitle (.sub) files into text streams</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-tcp.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-tcp.html
new file mode 100644
index 0000000..fac189a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-tcp.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>tcp</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-subparse.html" title="subparse">
+<link rel="next" href="gst-plugins-base-plugins-plugin-theora.html" title="theora">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-subparse.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-theora.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-tcp"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">tcp</span></h2>
+<p>tcp — <a name="plugin-tcp"></a>transfer data over the network via TCP</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id540291"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgsttcp.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id492678"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-multifdsink.html" title="multifdsink">multifdsink</a></span></p></td>
+<td>Send data to multiple filedescriptors</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-tcpclientsink.html" title="tcpclientsink">tcpclientsink</a></span></p></td>
+<td>Send data as a client over the network via TCP</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-tcpclientsrc.html" title="tcpclientsrc">tcpclientsrc</a></span></p></td>
+<td>Receive data as a client over the network via TCP</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-tcpserversink.html" title="tcpserversink">tcpserversink</a></span></p></td>
+<td>Send data as a server over the network via TCP</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-tcpserversrc.html" title="tcpserversrc">tcpserversrc</a></span></p></td>
+<td>Receive data as a server over the network via TCP</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-theora.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-theora.html
new file mode 100644
index 0000000..dbaa753
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-theora.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>theora</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-tcp.html" title="tcp">
+<link rel="next" href="gst-plugins-base-plugins-plugin-typefindfunctions.html" title="typefindfunctions">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-tcp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-typefindfunctions.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-theora"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">theora</span></h2>
+<p>theora — <a name="plugin-theora"></a>Theora plugin library</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id516302"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgsttheora.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id530180"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-theoradec.html" title="theoradec">theoradec</a></span></p></td>
+<td>decode raw theora streams to raw YUV video</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-theoraenc.html" title="theoraenc">theoraenc</a></span></p></td>
+<td>encode raw YUV video to a theora stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-theoraparse.html" title="theoraparse">theoraparse</a></span></p></td>
+<td>parse raw theora streams</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-typefindfunctions.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-typefindfunctions.html
new file mode 100644
index 0000000..e2608e6
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-typefindfunctions.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>typefindfunctions</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-theora.html" title="theora">
+<link rel="next" href="gst-plugins-base-plugins-plugin-uridecodebin.html" title="uridecodebin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-theora.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-uridecodebin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-typefindfunctions"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">typefindfunctions</span></h2>
+<p>typefindfunctions — <a name="plugin-typefindfunctions"></a>default typefind functions</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id493664"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgsttypefindfunctions.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id504039"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-uridecodebin.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-uridecodebin.html
new file mode 100644
index 0000000..d113d97
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-uridecodebin.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>uridecodebin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-typefindfunctions.html" title="typefindfunctions">
+<link rel="next" href="gst-plugins-base-plugins-plugin-videorate.html" title="videorate">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-typefindfunctions.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-videorate.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-uridecodebin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">uridecodebin</span></h2>
+<p>uridecodebin — <a name="plugin-uridecodebin"></a>URI Decoder bin</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id559524"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstdecodebin2.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id482194"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-decodebin2.html">decodebin2</a></span></p></td>
+<td>Autoplug and decode to raw media</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-uridecodebin.html" title="uridecodebin">uridecodebin</a></span></p></td>
+<td>Autoplug and decode an URI to raw media</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-videorate.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-videorate.html
new file mode 100644
index 0000000..cef5573
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-videorate.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videorate</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-uridecodebin.html" title="uridecodebin">
+<link rel="next" href="gst-plugins-base-plugins-plugin-videoscale.html" title="videoscale">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-uridecodebin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-videoscale.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-videorate"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">videorate</span></h2>
+<p>videorate — <a name="plugin-videorate"></a>Adjusts video frames</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id477644"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstvideorate.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id478952"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-videorate.html" title="videorate">videorate</a></span></p></td>
+<td>Drops/duplicates/adjusts timestamps on video frames to make a perfect stream</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-videoscale.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-videoscale.html
new file mode 100644
index 0000000..2f87b69
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-videoscale.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videoscale</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-videorate.html" title="videorate">
+<link rel="next" href="gst-plugins-base-plugins-plugin-videotestsrc.html" title="videotestsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-videorate.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-videotestsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-videoscale"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">videoscale</span></h2>
+<p>videoscale — <a name="plugin-videoscale"></a>Resizes video</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id515897"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstvideoscale.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id490377"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-videoscale.html" title="videoscale">videoscale</a></span></p></td>
+<td>Resizes video</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-videotestsrc.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-videotestsrc.html
new file mode 100644
index 0000000..ce8080d
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-videotestsrc.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videotestsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-videoscale.html" title="videoscale">
+<link rel="next" href="gst-plugins-base-plugins-plugin-volume.html" title="volume">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-videoscale.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-volume.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-videotestsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">videotestsrc</span></h2>
+<p>videotestsrc — <a name="plugin-videotestsrc"></a>Creates a test video stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id474320"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstvideotestsrc.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id500216"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-videotestsrc.html" title="videotestsrc">videotestsrc</a></span></p></td>
+<td>Creates a test video stream</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-volume.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-volume.html
new file mode 100644
index 0000000..3a17310
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-volume.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>volume</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-videotestsrc.html" title="videotestsrc">
+<link rel="next" href="gst-plugins-base-plugins-plugin-vorbis.html" title="vorbis">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-videotestsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-vorbis.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-volume"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">volume</span></h2>
+<p>volume — <a name="plugin-volume"></a>plugin for controlling audio volume</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id491352"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstvolume.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id481139"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-volume.html" title="volume">volume</a></span></p></td>
+<td>Set volume on audio/raw streams</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-vorbis.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-vorbis.html
new file mode 100644
index 0000000..5693e7e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-vorbis.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>vorbis</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-volume.html" title="volume">
+<link rel="next" href="gst-plugins-base-plugins-plugin-ximagesink.html" title="ximagesink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-volume.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-ximagesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-vorbis"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">vorbis</span></h2>
+<p>vorbis — <a name="plugin-vorbis"></a>Vorbis plugin library</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id510918"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstvorbis.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id490918"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-vorbisdec.html" title="vorbisdec">vorbisdec</a></span></p></td>
+<td>decode raw vorbis streams to float audio</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-vorbisenc.html" title="vorbisenc">vorbisenc</a></span></p></td>
+<td>Encodes audio in Vorbis format</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-vorbisparse.html" title="vorbisparse">vorbisparse</a></span></p></td>
+<td>parse raw vorbis streams</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-vorbistag.html" title="vorbistag">vorbistag</a></span></p></td>
+<td>Retags vorbis streams</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-ximagesink.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-ximagesink.html
new file mode 100644
index 0000000..32f466a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-ximagesink.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>ximagesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-vorbis.html" title="vorbis">
+<link rel="next" href="gst-plugins-base-plugins-plugin-xvimagesink.html" title="xvimagesink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-vorbis.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-plugin-xvimagesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-ximagesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">ximagesink</span></h2>
+<p>ximagesink — <a name="plugin-ximagesink"></a>X11 video output element based on standard Xlib calls</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id501258"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstximagesink.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id496268"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-ximagesink.html" title="ximagesink">ximagesink</a></span></p></td>
+<td>A standard X based videosink</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-plugin-xvimagesink.html b/docs/plugins/html/gst-plugins-base-plugins-plugin-xvimagesink.html
new file mode 100644
index 0000000..99a4540
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-plugin-xvimagesink.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>xvimagesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gst-plugins-base Plugins">
+<link rel="prev" href="gst-plugins-base-plugins-plugin-ximagesink.html" title="ximagesink">
+<link rel="next" href="ch03.html" title="gst-plugins-base Classes">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-plugin-ximagesink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch02.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="ch03.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-plugin-xvimagesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">xvimagesink</span></h2>
+<p>xvimagesink — <a name="plugin-xvimagesink"></a>XFree86 video output plugin using Xv extension</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id487828"></a><h2>Plugin Information</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">filename</span></p></td>
+<td>libgstxvimagesink.so</td>
+</tr>
+<tr>
+<td><p><span class="term">version</span></p></td>
+<td>0.10.35.1</td>
+</tr>
+<tr>
+<td><p><span class="term">run-time license</span></p></td>
+<td>LGPL</td>
+</tr>
+<tr>
+<td><p><span class="term">package</span></p></td>
+<td>GStreamer Base Plug-ins git</td>
+</tr>
+<tr>
+<td><p><span class="term">origin</span></p></td>
+<td>Unknown package origin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="id535615"></a><h2>Elements</h2>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-base-plugins-xvimagesink.html" title="xvimagesink">xvimagesink</a></span></p></td>
+<td>A Xv based videosink</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-subtitleoverlay.html b/docs/plugins/html/gst-plugins-base-plugins-subtitleoverlay.html
new file mode 100644
index 0000000..1ea2759
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-subtitleoverlay.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>subtitleoverlay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-playbin.html" title="playbin">
+<link rel="next" href="gst-plugins-base-plugins-tcpclientsrc.html" title="tcpclientsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-playbin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-tcpclientsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-subtitleoverlay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-subtitleoverlay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-subtitleoverlay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-subtitleoverlay.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-subtitleoverlay.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-subtitleoverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-subtitleoverlay.top_of_page"></a>subtitleoverlay</span></h2>
+<p>subtitleoverlay — Overlays a video stream with subtitles</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-subtitleoverlay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstSubtitleOverlay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay-struct" title="struct GstSubtitleOverlay">GstSubtitleOverlay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+ +----GstSubtitleOverlay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstSubtitleOverlay implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstChildProxy.html">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--font-desc" title='The "font-desc" property'>font-desc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--silent" title='The "silent" property'>silent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--subtitle-encoding" title='The "subtitle-encoding" property'>subtitle-encoding</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.description"></a><h2>Description</h2>
+<p>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html"><span class="type">GstBin</span></a> that auto-magically overlays a video stream with subtitles by
+autoplugging the required elements.
+</p>
+<p>
+It supports raw, timestamped text, different textual subtitle formats and
+DVD subpicture subtitles.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id479357"></a><h3>Examples</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v filesrc location=test.mkv ! matroskademux name=demux ! "video/x-h264" ! queue2 ! decodebin ! subtitleoverlay name=overlay ! videoconvert ! autovideosink demux. ! "video/x-dvd-subpicture" ! queue2 ! overlay.
+</pre></div> This will play back the given Matroska file with h264 video and subpicture subtitles.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id489687"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-playback.html#plugin-playback">playback</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Video/Overlay/Subtitle</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id534893"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>subtitle_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>video_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstSubtitleOverlay-struct"></a><h3>struct GstSubtitleOverlay</h3>
+<pre class="programlisting">struct GstSubtitleOverlay;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-subtitleoverlay.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstSubtitleOverlay--font-desc"></a><h3>The <code class="literal">"font-desc"</code> property</h3>
+<pre class="programlisting"> "font-desc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Pango font description of font to be used for subtitle rendering.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSubtitleOverlay--silent"></a><h3>The <code class="literal">"silent"</code> property</h3>
+<pre class="programlisting"> "silent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to show subtitles.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSubtitleOverlay--subtitle-encoding"></a><h3>The <code class="literal">"subtitle-encoding"</code> property</h3>
+<pre class="programlisting"> "subtitle-encoding" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</p>
+<p>Default value: NULL</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-tcpclientsink.html b/docs/plugins/html/gst-plugins-base-plugins-tcpclientsink.html
new file mode 100644
index 0000000..9d69a5b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-tcpclientsink.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>tcpclientsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-tcpclientsrc.html" title="tcpclientsrc">
+<link rel="next" href="gst-plugins-base-plugins-tcpserversrc.html" title="tcpserversrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-tcpclientsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-tcpserversrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-tcpclientsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-tcpclientsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-tcpclientsink.top_of_page"></a>tcpclientsink</span></h2>
+<p>tcpclientsink — Send data as a client over the network via TCP</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-tcpclientsink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTCPClientSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink-struct" title="struct GstTCPClientSink">GstTCPClientSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----GstTCPClientSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--host" title='The "host" property'>host</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--protocol" title='The "protocol" property'>protocol</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id530053"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+# server:
+nc -l -p 3000
+# client:
+gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+</pre></div> everything you type in the client is shown on the server
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id530076"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">tcp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Network</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id530319"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTCPClientSink-struct"></a><h3>struct GstTCPClientSink</h3>
+<pre class="programlisting">struct GstTCPClientSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTCPClientSink--host"></a><h3>The <code class="literal">"host"</code> property</h3>
+<pre class="programlisting"> "host" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The host/IP to send the packets to.</p>
+<p>Default value: "localhost"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPClientSink--port"></a><h3>The <code class="literal">"port"</code> property</h3>
+<pre class="programlisting"> "port" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The port to send the packets to.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 4953</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPClientSink--protocol"></a><h3>The <code class="literal">"protocol"</code> property</h3>
+<pre class="programlisting"> "protocol" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write</pre>
+<p>The protocol to wrap data in.</p>
+<p>Default value: GST_TCP_PROTOCOL_NONE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsink.see-also"></a><h2>See Also</h2>
+<span class="type">tcpclientsrc</span>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-tcpclientsrc.html b/docs/plugins/html/gst-plugins-base-plugins-tcpclientsrc.html
new file mode 100644
index 0000000..c6eaf9c
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-tcpclientsrc.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>tcpclientsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-subtitleoverlay.html" title="subtitleoverlay">
+<link rel="next" href="gst-plugins-base-plugins-tcpclientsink.html" title="tcpclientsink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-subtitleoverlay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-tcpclientsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-tcpclientsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpclientsrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-tcpclientsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-tcpclientsrc.top_of_page"></a>tcpclientsrc</span></h2>
+<p>tcpclientsrc — Receive data as a client over the network via TCP</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-tcpclientsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTCPClientSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc-struct" title="struct GstTCPClientSrc">GstTCPClientSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----GstTCPClientSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--host" title='The "host" property'>host</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--protocol" title='The "protocol" property'>protocol</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id535377"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+# server:
+nc -l -p 3000
+# client:
+gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+</pre></div> everything you type in the server is shown on the client
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id535400"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">tcp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Network</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id530891"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTCPClientSrc-struct"></a><h3>struct GstTCPClientSrc</h3>
+<pre class="programlisting">struct GstTCPClientSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTCPClientSrc--host"></a><h3>The <code class="literal">"host"</code> property</h3>
+<pre class="programlisting"> "host" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The host IP address to receive packets from.</p>
+<p>Default value: "localhost"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPClientSrc--port"></a><h3>The <code class="literal">"port"</code> property</h3>
+<pre class="programlisting"> "port" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The port to receive packets from.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 4953</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPClientSrc--protocol"></a><h3>The <code class="literal">"protocol"</code> property</h3>
+<pre class="programlisting"> "protocol" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write</pre>
+<p>The protocol to wrap data in.</p>
+<p>Default value: GST_TCP_PROTOCOL_NONE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpclientsrc.see-also"></a><h2>See Also</h2>
+<span class="type">tcpclientsink</span>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-tcpserversink.html b/docs/plugins/html/gst-plugins-base-plugins-tcpserversink.html
new file mode 100644
index 0000000..c60dfb6
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-tcpserversink.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>tcpserversink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-tcpserversrc.html" title="tcpserversrc">
+<link rel="next" href="gst-plugins-base-plugins-textoverlay.html" title="textoverlay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-tcpserversrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-textoverlay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-tcpserversink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-tcpserversink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-tcpserversink.top_of_page"></a>tcpserversink</span></h2>
+<p>tcpserversink — Send data as a server over the network via TCP</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-tcpserversink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTCPServerSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink-struct" title="struct GstTCPServerSink">GstTCPServerSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----<a class="link" href="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink">GstMultiFdSink</a>
+ +----GstTCPServerSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--host" title='The "host" property'>host</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id533005"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+# server:
+gst-launch fdsrc fd=1 ! tcpserversink protocol=none port=3000
+# client:
+gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+</pre></div>
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id533028"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">tcp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Network</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id487079"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTCPServerSink-struct"></a><h3>struct GstTCPServerSink</h3>
+<pre class="programlisting">struct GstTCPServerSink;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTCPServerSink--host"></a><h3>The <code class="literal">"host"</code> property</h3>
+<pre class="programlisting"> "host" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The host/IP to send the packets to.</p>
+<p>Default value: "localhost"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPServerSink--port"></a><h3>The <code class="literal">"port"</code> property</h3>
+<pre class="programlisting"> "port" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The port to send the packets to.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 4953</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversink.see-also"></a><h2>See Also</h2>
+<span class="type">multifdsink</span>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-tcpserversrc.html b/docs/plugins/html/gst-plugins-base-plugins-tcpserversrc.html
new file mode 100644
index 0000000..d63d808
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-tcpserversrc.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>tcpserversrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-tcpclientsink.html" title="tcpclientsink">
+<link rel="next" href="gst-plugins-base-plugins-tcpserversink.html" title="tcpserversink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-tcpclientsink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-tcpserversink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-tcpserversrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-tcpserversrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-tcpserversrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-tcpserversrc.top_of_page"></a>tcpserversrc</span></h2>
+<p>tcpserversrc — Receive data as a server over the network via TCP</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-tcpserversrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTCPServerSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc-struct" title="struct GstTCPServerSrc">GstTCPServerSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----GstTCPServerSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--host" title='The "host" property'>host</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--protocol" title='The "protocol" property'>protocol</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id532197"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+# server:
+gst-launch tcpserversrc protocol=none port=3000 ! fdsink fd=2
+# client:
+gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+</pre></div>
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id532220"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">tcp</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Network</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id535478"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTCPServerSrc-struct"></a><h3>struct GstTCPServerSrc</h3>
+<pre class="programlisting">struct GstTCPServerSrc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTCPServerSrc--host"></a><h3>The <code class="literal">"host"</code> property</h3>
+<pre class="programlisting"> "host" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The hostname to listen as.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPServerSrc--port"></a><h3>The <code class="literal">"port"</code> property</h3>
+<pre class="programlisting"> "port" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The port to listen to.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 4953</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTCPServerSrc--protocol"></a><h3>The <code class="literal">"protocol"</code> property</h3>
+<pre class="programlisting"> "protocol" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-multifdsink.html#GstTCPProtocol"><span class="type">GstTCPProtocol</span></a> : Read / Write</pre>
+<p>The protocol to wrap data in.</p>
+<p>Default value: GST_TCP_PROTOCOL_NONE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-tcpserversrc.see-also"></a><h2>See Also</h2>
+<span class="type">tcpserversink</span>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-textoverlay.html b/docs/plugins/html/gst-plugins-base-plugins-textoverlay.html
new file mode 100644
index 0000000..2ef3dad
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-textoverlay.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>textoverlay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-tcpserversink.html" title="tcpserversink">
+<link rel="next" href="gst-plugins-base-plugins-textrender.html" title="textrender">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-tcpserversink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-textrender.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-textoverlay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textoverlay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textoverlay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textoverlay.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-textoverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-textoverlay.top_of_page"></a>textoverlay</span></h2>
+<p>textoverlay — Adds text strings on top of a video buffer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-textoverlay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTextOverlay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay-struct" title="struct GstTextOverlay">GstTextOverlay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textoverlay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstBaseTextOverlay
+ +----GstTextOverlay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textoverlay.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltax" title='The "deltax" property'>deltax</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltay" title='The "deltay" property'>deltay</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--font-desc" title='The "font-desc" property'>font-desc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halign" title='The "halign" property'>halign</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--shaded-background" title='The "shaded-background" property'>shaded-background</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--text" title='The "text" property'>text</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valign" title='The "valign" property'>valign</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wrap-mode" title='The "wrap-mode" property'>wrap-mode</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayWrapMode"><span class="type">GstTextOverlayWrapMode</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpad" title='The "xpad" property'>xpad</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypad" title='The "ypad" property'>ypad</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halignment" title='The "halignment" property'>halignment</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayHAlign"><span class="type">GstTextOverlayHAlign</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valignment" title='The "valignment" property'>valignment</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayVAlign"><span class="type">GstTextOverlayVAlign</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--line-alignment" title='The "line-alignment" property'>line-alignment</a>" <span class="type">GstTextOverlayLineAlign</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--silent" title='The "silent" property'>silent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wait-text" title='The "wait-text" property'>wait-text</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--auto-resize" title='The "auto-resize" property'>auto-resize</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--vertical-render" title='The "vertical-render" property'>vertical-render</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--color" title='The "color" property'>color</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpos" title='The "xpos" property'>xpos</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypos" title='The "ypos" property'>ypos</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textoverlay.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id492124"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-pango.html#plugin-pango">pango</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David Schleef &lt;ds@schleef.org&gt;, Zeeshan Ali &lt;zeeshan.ali@nokia.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Editor/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id494648"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>text_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>text/x-pango-markup</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> text/plain</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>video_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textoverlay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTextOverlay-struct"></a><h3>struct GstTextOverlay</h3>
+<pre class="programlisting">struct GstTextOverlay;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textoverlay.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTextOverlay--deltax"></a><h3>The <code class="literal">"deltax"</code> property</h3>
+<pre class="programlisting"> "deltax" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Shift X position to the left or to the right. Unit is pixels.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--deltay"></a><h3>The <code class="literal">"deltay"</code> property</h3>
+<pre class="programlisting"> "deltay" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Shift Y position up or down. Unit is pixels.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--font-desc"></a><h3>The <code class="literal">"font-desc"</code> property</h3>
+<pre class="programlisting"> "font-desc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write</pre>
+<p>Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--halign"></a><h3>The <code class="literal">"halign"</code> property</h3>
+<pre class="programlisting"> "halign" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write</pre>
+<p>Horizontal alignment of the text (deprecated; use halignment).</p>
+<p>Default value: "center"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--shaded-background"></a><h3>The <code class="literal">"shaded-background"</code> property</h3>
+<pre class="programlisting"> "shaded-background" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to shade the background under the text area.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--text"></a><h3>The <code class="literal">"text"</code> property</h3>
+<pre class="programlisting"> "text" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Text to be display.</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--valign"></a><h3>The <code class="literal">"valign"</code> property</h3>
+<pre class="programlisting"> "valign" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write</pre>
+<p>Vertical alignment of the text (deprecated; use valignment).</p>
+<p>Default value: "baseline"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--wrap-mode"></a><h3>The <code class="literal">"wrap-mode"</code> property</h3>
+<pre class="programlisting"> "wrap-mode" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayWrapMode"><span class="type">GstTextOverlayWrapMode</span></a> : Read / Write</pre>
+<p>Whether to wrap the text and if so how.</p>
+<p>Default value: wordchar</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--xpad"></a><h3>The <code class="literal">"xpad"</code> property</h3>
+<pre class="programlisting"> "xpad" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Horizontal paddding when using left/right alignment.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--ypad"></a><h3>The <code class="literal">"ypad"</code> property</h3>
+<pre class="programlisting"> "ypad" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Vertical padding when using top/bottom alignment.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--halignment"></a><h3>The <code class="literal">"halignment"</code> property</h3>
+<pre class="programlisting"> "halignment" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayHAlign"><span class="type">GstTextOverlayHAlign</span></a> : Read / Write</pre>
+<p>Horizontal alignment of the text.</p>
+<p>Default value: center</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--valignment"></a><h3>The <code class="literal">"valignment"</code> property</h3>
+<pre class="programlisting"> "valignment" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-textoverlay.html#GstTextOverlayVAlign"><span class="type">GstTextOverlayVAlign</span></a> : Read / Write</pre>
+<p>Vertical alignment of the text.</p>
+<p>Default value: baseline</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--line-alignment"></a><h3>The <code class="literal">"line-alignment"</code> property</h3>
+<pre class="programlisting"> "line-alignment" <span class="type">GstTextOverlayLineAlign</span> : Read / Write</pre>
+<p>Alignment of text lines relative to each other.</p>
+<p>Default value: center</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--silent"></a><h3>The <code class="literal">"silent"</code> property</h3>
+<pre class="programlisting"> "silent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to render the text string.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--wait-text"></a><h3>The <code class="literal">"wait-text"</code> property</h3>
+<pre class="programlisting"> "wait-text" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to wait for subtitles.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--auto-resize"></a><h3>The <code class="literal">"auto-resize"</code> property</h3>
+<pre class="programlisting"> "auto-resize" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Automatically adjust font size to screen-size.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--vertical-render"></a><h3>The <code class="literal">"vertical-render"</code> property</h3>
+<pre class="programlisting"> "vertical-render" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Vertical Render.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--color"></a><h3>The <code class="literal">"color"</code> property</h3>
+<pre class="programlisting"> "color" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Color to use for text (big-endian ARGB).</p>
+<p>Default value: 4294967295</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--xpos"></a><h3>The <code class="literal">"xpos"</code> property</h3>
+<pre class="programlisting"> "xpos" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Horizontal position when using position alignment.</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextOverlay--ypos"></a><h3>The <code class="literal">"ypos"</code> property</h3>
+<pre class="programlisting"> "ypos" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Vertical position when using position alignment.</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0.5</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-textrender.html b/docs/plugins/html/gst-plugins-base-plugins-textrender.html
new file mode 100644
index 0000000..2347049
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-textrender.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>textrender</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-textoverlay.html" title="textoverlay">
+<link rel="next" href="gst-plugins-base-plugins-theoradec.html" title="theoradec">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-textoverlay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-theoradec.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-textrender.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textrender.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textrender.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-textrender.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-textrender"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-textrender.top_of_page"></a>textrender</span></h2>
+<p>textrender — Renders a text string to an image bitmap</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-textrender.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTextRender"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender-struct" title="struct GstTextRender">GstTextRender</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textrender.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstTextRender
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textrender.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--font-desc" title='The "font-desc" property'>font-desc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--halignment" title='The "halignment" property'>halignment</a>" <span class="type">GstTextRenderHAlign</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--line-alignment" title='The "line-alignment" property'>line-alignment</a>" <span class="type">GstTextRenderLineAlign</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--valignment" title='The "valignment" property'>valignment</a>" <span class="type">GstTextRenderVAlign</span> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--xpad" title='The "xpad" property'>xpad</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-textrender.html#GstTextRender--ypad" title='The "ypad" property'>ypad</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textrender.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id475160"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-pango.html#plugin-pango">pango</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David Schleef &lt;ds@schleef.org&gt;, GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Editor/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id538258"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>text/x-pango-markup</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> text/plain</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textrender.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTextRender-struct"></a><h3>struct GstTextRender</h3>
+<pre class="programlisting">struct GstTextRender;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-textrender.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTextRender--font-desc"></a><h3>The <code class="literal">"font-desc"</code> property</h3>
+<pre class="programlisting"> "font-desc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Write</pre>
+<p>Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.</p>
+<p>Default value: ""</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextRender--halignment"></a><h3>The <code class="literal">"halignment"</code> property</h3>
+<pre class="programlisting"> "halignment" <span class="type">GstTextRenderHAlign</span> : Read / Write</pre>
+<p>Horizontal alignment of the text.</p>
+<p>Default value: center</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextRender--line-alignment"></a><h3>The <code class="literal">"line-alignment"</code> property</h3>
+<pre class="programlisting"> "line-alignment" <span class="type">GstTextRenderLineAlign</span> : Read / Write</pre>
+<p>Alignment of text lines relative to each other.</p>
+<p>Default value: center</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextRender--valignment"></a><h3>The <code class="literal">"valignment"</code> property</h3>
+<pre class="programlisting"> "valignment" <span class="type">GstTextRenderVAlign</span> : Read / Write</pre>
+<p>Vertical alignment of the text.</p>
+<p>Default value: baseline</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextRender--xpad"></a><h3>The <code class="literal">"xpad"</code> property</h3>
+<pre class="programlisting"> "xpad" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Horizontal paddding when using left/right alignment.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTextRender--ypad"></a><h3>The <code class="literal">"ypad"</code> property</h3>
+<pre class="programlisting"> "ypad" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Vertical padding when using top/bottom alignment.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 25</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-theoradec.html b/docs/plugins/html/gst-plugins-base-plugins-theoradec.html
new file mode 100644
index 0000000..245b950
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-theoradec.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>theoradec</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-textrender.html" title="textrender">
+<link rel="next" href="gst-plugins-base-plugins-theoraenc.html" title="theoraenc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-textrender.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-theoraenc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-theoradec.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoradec.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoradec.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoradec.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-theoradec"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-theoradec.top_of_page"></a>theoradec</span></h2>
+<p>theoradec — decode raw theora streams to raw YUV video</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-theoradec.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTheoraDec"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-theoradec.html#GstTheoraDec-struct" title="struct GstTheoraDec">GstTheoraDec</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoradec.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstTheoraDec
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoradec.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-theoradec.html#GstTheoraDec--crop" title='The "crop" property'>crop</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoradec.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id487813"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-theora.html#plugin-theora">theora</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Benjamin Otte &lt;otte@gnome.org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Decoder/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id536181"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-theora</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv, format=(fourcc){ I420, Y42B, Y444 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoradec.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTheoraDec-struct"></a><h3>struct GstTheoraDec</h3>
+<pre class="programlisting">struct GstTheoraDec;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoradec.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTheoraDec--crop"></a><h3>The <code class="literal">"crop"</code> property</h3>
+<pre class="programlisting"> "crop" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Crop the image to the visible region.</p>
+<p>Default value: TRUE</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-theoraenc.html b/docs/plugins/html/gst-plugins-base-plugins-theoraenc.html
new file mode 100644
index 0000000..69f62fa
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-theoraenc.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>theoraenc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-theoradec.html" title="theoradec">
+<link rel="next" href="gst-plugins-base-plugins-theoraparse.html" title="theoraparse">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-theoradec.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-theoraparse.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-theoraenc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraenc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraenc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraenc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraenc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-theoraenc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-theoraenc.top_of_page"></a>theoraenc</span></h2>
+<p>theoraenc — encode raw YUV video to a theora stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-theoraenc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTheoraEnc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc-struct" title="struct GstTheoraEnc">GstTheoraEnc</a>;
+enum <a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEncBorderMode" title="enum GstTheoraEncBorderMode">GstTheoraEncBorderMode</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstTheoraEnc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstTheoraEnc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html">GstPreset</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--bitrate" title='The "bitrate" property'>bitrate</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--border" title='The "border" property'>border</a>" <a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEncBorderMode" title="enum GstTheoraEncBorderMode"><span class="type">GstTheoraEncBorderMode</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--center" title='The "center" property'>center</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-auto" title='The "keyframe-auto" property'>keyframe-auto</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-force" title='The "keyframe-force" property'>keyframe-force</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-freq" title='The "keyframe-freq" property'>keyframe-freq</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-mindistance" title='The "keyframe-mindistance" property'>keyframe-mindistance</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-threshold" title='The "keyframe-threshold" property'>keyframe-threshold</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--noise-sensitivity" title='The "noise-sensitivity" property'>noise-sensitivity</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quality" title='The "quality" property'>quality</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quick" title='The "quick" property'>quick</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--sharpness" title='The "sharpness" property'>sharpness</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--speed-level" title='The "speed-level" property'>speed-level</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write / Construct
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-overflow" title='The "cap-overflow" property'>cap-overflow</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-underflow" title='The "cap-underflow" property'>cap-underflow</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--drop-frames" title='The "drop-frames" property'>drop-frames</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--rate-buffer" title='The "rate-buffer" property'>rate-buffer</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--vp3-compatible" title='The "vp3-compatible" property'>vp3-compatible</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-cache-file" title='The "multipass-cache-file" property'>multipass-cache-file</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-mode" title='The "multipass-mode" property'>multipass-mode</a>" <span class="type">GstTheoraEncMultipassMode</span> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id542106"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-theora.html#plugin-theora">theora</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Encoder/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id542168"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv, format=(fourcc){ I420, Y42B, Y444 }, framerate=(fraction)[ 1/2147483647, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-theora</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTheoraEnc-struct"></a><h3>struct GstTheoraEnc</h3>
+<pre class="programlisting">struct GstTheoraEnc;</pre>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEncBorderMode"></a><h3>enum GstTheoraEncBorderMode</h3>
+<pre class="programlisting">typedef enum {
+ BORDER_NONE,
+ BORDER_BLACK,
+ BORDER_MIRROR
+} GstTheoraEncBorderMode;
+</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraenc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTheoraEnc--bitrate"></a><h3>The <code class="literal">"bitrate"</code> property</h3>
+<pre class="programlisting"> "bitrate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Compressed video bitrate (kbps).</p>
+<p>Allowed values: [0,16777215]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--border"></a><h3>The <code class="literal">"border"</code> property</h3>
+<pre class="programlisting"> "border" <a class="link" href="gst-plugins-base-plugins-theoraenc.html#GstTheoraEncBorderMode" title="enum GstTheoraEncBorderMode"><span class="type">GstTheoraEncBorderMode</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Default value: Black Border</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--center"></a><h3>The <code class="literal">"center"</code> property</h3>
+<pre class="programlisting"> "center" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--keyframe-auto"></a><h3>The <code class="literal">"keyframe-auto"</code> property</h3>
+<pre class="programlisting"> "keyframe-auto" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Automatic keyframe detection.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--keyframe-force"></a><h3>The <code class="literal">"keyframe-force"</code> property</h3>
+<pre class="programlisting"> "keyframe-force" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Force keyframe every N frames.</p>
+<p>Allowed values: [1,32768]</p>
+<p>Default value: 64</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--keyframe-freq"></a><h3>The <code class="literal">"keyframe-freq"</code> property</h3>
+<pre class="programlisting"> "keyframe-freq" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Keyframe frequency.</p>
+<p>Allowed values: [1,32768]</p>
+<p>Default value: 64</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--keyframe-mindistance"></a><h3>The <code class="literal">"keyframe-mindistance"</code> property</h3>
+<pre class="programlisting"> "keyframe-mindistance" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Allowed values: [1,32768]</p>
+<p>Default value: 8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--keyframe-threshold"></a><h3>The <code class="literal">"keyframe-threshold"</code> property</h3>
+<pre class="programlisting"> "keyframe-threshold" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Allowed values: [0,32768]</p>
+<p>Default value: 80</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--noise-sensitivity"></a><h3>The <code class="literal">"noise-sensitivity"</code> property</h3>
+<pre class="programlisting"> "noise-sensitivity" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Allowed values: [0,32768]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--quality"></a><h3>The <code class="literal">"quality"</code> property</h3>
+<pre class="programlisting"> "quality" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Video quality.</p>
+<p>Allowed values: [0,63]</p>
+<p>Default value: 48</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--quick"></a><h3>The <code class="literal">"quick"</code> property</h3>
+<pre class="programlisting"> "quick" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--sharpness"></a><h3>The <code class="literal">"sharpness"</code> property</h3>
+<pre class="programlisting"> "sharpness" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>ignored and kept for API compat only.</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--speed-level"></a><h3>The <code class="literal">"speed-level"</code> property</h3>
+<pre class="programlisting"> "speed-level" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write / Construct</pre>
+<p>Controls the amount of analysis performed when encoding. Higher values trade compression quality for speed. This property requires libtheora version &gt;= 1.0, and the maximum value may vary based on encoder version.</p>
+<p>Allowed values: [0,2]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--cap-overflow"></a><h3>The <code class="literal">"cap-overflow"</code> property</h3>
+<pre class="programlisting"> "cap-overflow" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Enable capping of bit reservoir overflows.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--cap-underflow"></a><h3>The <code class="literal">"cap-underflow"</code> property</h3>
+<pre class="programlisting"> "cap-underflow" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Enable capping of bit reservoir underflows.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--drop-frames"></a><h3>The <code class="literal">"drop-frames"</code> property</h3>
+<pre class="programlisting"> "drop-frames" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Allow or disallow frame dropping.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--rate-buffer"></a><h3>The <code class="literal">"rate-buffer"</code> property</h3>
+<pre class="programlisting"> "rate-buffer" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Sets the size of the rate control buffer, in units of frames. The default value of 0 instructs the encoder to automatically select an appropriate value.</p>
+<p>Allowed values: [0,1000]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--vp3-compatible"></a><h3>The <code class="literal">"vp3-compatible"</code> property</h3>
+<pre class="programlisting"> "vp3-compatible" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Disables non-VP3 compatible features.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--multipass-cache-file"></a><h3>The <code class="literal">"multipass-cache-file"</code> property</h3>
+<pre class="programlisting"> "multipass-cache-file" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Multipass cache file.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTheoraEnc--multipass-mode"></a><h3>The <code class="literal">"multipass-mode"</code> property</h3>
+<pre class="programlisting"> "multipass-mode" <span class="type">GstTheoraEncMultipassMode</span> : Read / Write</pre>
+<p>Single pass or first/second pass.</p>
+<p>Default value: Single pass</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-theoraparse.html b/docs/plugins/html/gst-plugins-base-plugins-theoraparse.html
new file mode 100644
index 0000000..4e38458
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-theoraparse.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>theoraparse</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-theoraenc.html" title="theoraenc">
+<link rel="next" href="gst-plugins-base-plugins-timeoverlay.html" title="timeoverlay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-theoraenc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-timeoverlay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-theoraparse.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraparse.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraparse.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-theoraparse.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-theoraparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-theoraparse.top_of_page"></a>theoraparse</span></h2>
+<p>theoraparse — parse raw theora streams</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-theoraparse.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTheoraParse"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-theoraparse.html#GstTheoraParse-struct" title="struct GstTheoraParse">GstTheoraParse</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstTheoraParse
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraparse.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-theoraparse.html#GstTheoraParse--synchronization-points" title='The "synchronization-points" property'>synchronization-points</a>" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraparse.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id489696"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-theora.html#plugin-theora">theora</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Andy Wingo &lt;wingo@pobox.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id536676"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-theora</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-theora</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraparse.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTheoraParse-struct"></a><h3>struct GstTheoraParse</h3>
+<pre class="programlisting">struct GstTheoraParse;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-theoraparse.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTheoraParse--synchronization-points"></a><h3>The <code class="literal">"synchronization-points"</code> property</h3>
+<pre class="programlisting"> "synchronization-points" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a>* : Read / Write</pre>
+<p>An array of (granuletime, buffertime) pairs.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-timeoverlay.html b/docs/plugins/html/gst-plugins-base-plugins-timeoverlay.html
new file mode 100644
index 0000000..36f6cc5
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-timeoverlay.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>timeoverlay</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-theoraparse.html" title="theoraparse">
+<link rel="next" href="gst-plugins-base-plugins-uridecodebin.html" title="uridecodebin">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-theoraparse.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-uridecodebin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-timeoverlay.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-timeoverlay.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-timeoverlay.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-timeoverlay"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-timeoverlay.top_of_page"></a>timeoverlay</span></h2>
+<p>timeoverlay — Overlays buffer time stamps on a video stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-timeoverlay.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTimeOverlay"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-timeoverlay.html#GstTimeOverlay-struct" title="struct GstTimeOverlay">GstTimeOverlay</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-timeoverlay.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstBaseTextOverlay
+ +----GstTimeOverlay
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-timeoverlay.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id530207"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-pango.html#plugin-pango">pango</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Tim-Philipp Müller &lt;tim@centricular.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Editor/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id538141"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>video_sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc){ AYUV, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-timeoverlay.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTimeOverlay-struct"></a><h3>struct GstTimeOverlay</h3>
+<pre class="programlisting">struct GstTimeOverlay;</pre>
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-uridecodebin.html b/docs/plugins/html/gst-plugins-base-plugins-uridecodebin.html
new file mode 100644
index 0000000..9477620
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-uridecodebin.html
@@ -0,0 +1,609 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>uridecodebin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-timeoverlay.html" title="timeoverlay">
+<link rel="next" href="gst-plugins-base-plugins-videorate.html" title="videorate">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-timeoverlay.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-videorate.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-uridecodebin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-uridecodebin.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-uridecodebin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-uridecodebin.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-uridecodebin.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gst-plugins-base-plugins-uridecodebin.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-uridecodebin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-uridecodebin.top_of_page"></a>uridecodebin</span></h2>
+<p>uridecodebin — Autoplug and decode an URI to raw media</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-uridecodebin.synopsis"></a><h2>Synopsis</h2>
+<a name="GstURIDecodeBin"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-struct" title="struct GstURIDecodeBin">GstURIDecodeBin</a>;
+enum <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstAutoplugSelectResult" title="enum GstAutoplugSelectResult">GstAutoplugSelectResult</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+ +----GstURIDecodeBin
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstURIDecodeBin implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstChildProxy.html">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--uri" title='The "uri" property'>uri</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--connection-speed" title='The "connection-speed" property'>connection-speed</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--subtitle-encoding" title='The "subtitle-encoding" property'>subtitle-encoding</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--source" title='The "source" property'>source</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-duration" title='The "buffer-duration" property'>buffer-duration</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-size" title='The "buffer-size" property'>buffer-size</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--download" title='The "download" property'>download</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--use-buffering" title='The "use-buffering" property'>use-buffering</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--expose-all-streams" title='The "expose-all-streams" property'>expose-all-streams</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--ring-buffer-max-size" title='The "ring-buffer-max-size" property'>ring-buffer-max-size</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-continue" title='The "autoplug-continue" signal'>autoplug-continue</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-factories" title='The "autoplug-factories" signal'>autoplug-factories</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-select" title='The "autoplug-select" signal'>autoplug-select</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-unknown-type" title='The "unknown-type" signal'>unknown-type</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-drained" title='The "drained" signal'>drained</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-sort" title='The "autoplug-sort" signal'>autoplug-sort</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-source-setup" title='The "source-setup" signal'>source-setup</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.description"></a><h2>Description</h2>
+<p>
+Decodes data from a URI into raw media. It selects a source element that can
+handle the given <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--uri" title='The "uri" property'><span class="type">"uri"</span></a> scheme and connects it to a decodebin.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id544408"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-uridecodebin.html#plugin-uridecodebin">uridecodebin</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic/Bin/Decoder</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id544471"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src%d</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>sometimes</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstURIDecodeBin-struct"></a><h3>struct GstURIDecodeBin</h3>
+<pre class="programlisting">struct GstURIDecodeBin;</pre>
+<p>
+uridecodebin element struct
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAutoplugSelectResult"></a><h3>enum GstAutoplugSelectResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_AUTOPLUG_SELECT_TRY,
+ GST_AUTOPLUG_SELECT_EXPOSE,
+ GST_AUTOPLUG_SELECT_SKIP
+} GstAutoplugSelectResult;
+</pre>
+<p>
+return values for the autoplug-select signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-AUTOPLUG-SELECT-TRY:CAPS"></a><span class="term"><code class="literal">GST_AUTOPLUG_SELECT_TRY</code></span></p></td>
+<td>try to autoplug the current factory
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUTOPLUG-SELECT-EXPOSE:CAPS"></a><span class="term"><code class="literal">GST_AUTOPLUG_SELECT_EXPOSE</code></span></p></td>
+<td>expose the pad as a raw stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-AUTOPLUG-SELECT-SKIP:CAPS"></a><span class="term"><code class="literal">GST_AUTOPLUG_SELECT_SKIP</code></span></p></td>
+<td>skip the current factory
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstURIDecodeBin--uri"></a><h3>The <code class="literal">"uri"</code> property</h3>
+<pre class="programlisting"> "uri" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>URI to decode.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--connection-speed"></a><h3>The <code class="literal">"connection-speed"</code> property</h3>
+<pre class="programlisting"> "connection-speed" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Network connection speed in kbps (0 = unknown).</p>
+<p>Allowed values: &lt;= 4294967</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>The caps on which to stop decoding. (NULL = default).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--subtitle-encoding"></a><h3>The <code class="literal">"subtitle-encoding"</code> property</h3>
+<pre class="programlisting"> "subtitle-encoding" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>Encoding to assume if input subtitles are not in UTF-8 encoding. If not set, the GST_SUBTITLE_ENCODING environment variable will be checked for an encoding to use. If that is not set either, ISO-8859-15 will be assumed.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--source"></a><h3>The <code class="literal">"source"</code> property</h3>
+<pre class="programlisting"> "source" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>* : Read</pre>
+<p>Source object used.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--buffer-duration"></a><h3>The <code class="literal">"buffer-duration"</code> property</h3>
+<pre class="programlisting"> "buffer-duration" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>Buffer duration when buffering streams (-1 default value).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--buffer-size"></a><h3>The <code class="literal">"buffer-size"</code> property</h3>
+<pre class="programlisting"> "buffer-size" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Buffer size when buffering streams (-1 default value).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--download"></a><h3>The <code class="literal">"download"</code> property</h3>
+<pre class="programlisting"> "download" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Attempt download buffering when buffering network streams.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--use-buffering"></a><h3>The <code class="literal">"use-buffering"</code> property</h3>
+<pre class="programlisting"> "use-buffering" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Perform buffering on demuxed/parsed media.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--expose-all-streams"></a><h3>The <code class="literal">"expose-all-streams"</code> property</h3>
+<pre class="programlisting"> "expose-all-streams" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Expose all streams, including those of unknown type or that don't match the 'caps' property.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin--ring-buffer-max-size"></a><h3>The <code class="literal">"ring-buffer-max-size"</code> property</h3>
+<pre class="programlisting"> "ring-buffer-max-size" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Max. amount of data in the ring buffer (bytes, 0 = ring buffer disabled).</p>
+<p>Allowed values: &lt;= G_MAXULONG</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-uridecodebin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstURIDecodeBin-autoplug-continue"></a><h3>The <code class="literal">"autoplug-continue"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted whenever uridecodebin finds a new stream. It is
+emitted before looking for any elements that can handle that stream.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ Invocation of signal handlers stops after the first signal handler
+returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>. Signal handlers are invoked in the order they were
+ connected in.
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> found.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a> if you wish uridecodebin to look for elements that can
+handle the given <em class="parameter"><code>caps</code></em>. If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>, those caps will be considered as
+final and the pad will be exposed as such (see 'pad-added' signal of
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>).</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-autoplug-factories"></a><h3>The <code class="literal">"autoplug-factories"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This function is emited when an array of possible factories for <em class="parameter"><code>caps</code></em> on
+<em class="parameter"><code>pad</code></em> is needed. Uridecodebin will by default return an array with all
+compatible factories, sorted by rank.
+</p>
+<p>
+If this function returns NULL, <em class="parameter"><code>pad</code></em> will be exposed as a final caps.
+</p>
+<p>
+If this function returns an empty array, the pad will be considered as
+having an unhandled type media type.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ Only the signal handler that is connected first will ever by invoked.
+ Don't connect signal handlers with the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-CONNECT-AFTER:CAPS"><span class="type">G_CONNECT_AFTER</span></a> flag to this
+ signal, they will never be invoked!
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> found.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a>* with a list of factories to try. The factories are
+by default tried in the returned order or based on the index returned by
+"autoplug-select".</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-autoplug-select"></a><h3>The <code class="literal">"autoplug-select"</code> signal</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstAutoplugSelectResult" title="enum GstAutoplugSelectResult"><span class="returnvalue">GstAutoplugSelectResult</span></a>user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> *factory,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted once uridecodebin has found all the possible
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> that can be used to handle the given <em class="parameter"><code>caps</code></em>. For each of
+those factories, this signal is emited.
+</p>
+<p>
+The signal handler should return a <span class="type">GST_TYPE_AUTOPLUG_SELECT_RESULT</span> enum
+value indicating what decodebin should do next.
+</p>
+<p>
+A value of <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-TRY:CAPS"><span class="type">GST_AUTOPLUG_SELECT_TRY</span></a> will try to autoplug an element from
+<em class="parameter"><code>factory</code></em>.
+</p>
+<p>
+A value of <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-EXPOSE:CAPS"><span class="type">GST_AUTOPLUG_SELECT_EXPOSE</span></a> will expose <em class="parameter"><code>pad</code></em> without plugging
+any element to it.
+</p>
+<p>
+A value of <a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-SKIP:CAPS"><span class="type">GST_AUTOPLUG_SELECT_SKIP</span></a> will skip <em class="parameter"><code>factory</code></em> and move to the
+next factory.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ Only the signal handler that is connected first will ever by invoked.
+ Don't connect signal handlers with the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-CONNECT-AFTER:CAPS"><span class="type">G_CONNECT_AFTER</span></a> flag to this
+ signal, they will never be invoked!
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> to use.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <span class="type">GST_TYPE_AUTOPLUG_SELECT_RESULT</span> that indicates the required
+operation. The default handler will always return
+<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-TRY:CAPS"><span class="type">GST_AUTOPLUG_SELECT_TRY</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-unknown-type"></a><h3>The <code class="literal">"unknown-type"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted when a pad for which there is no further possible
+decoding is added to the uridecodebin.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the new pad containing caps that cannot be resolved to a 'final'.
+stream type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> of the pad that cannot be resolved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-drained"></a><h3>The <code class="literal">"drained"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *arg0,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted when the data for the current uri is played.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-autoplug-sort"></a><h3>The <code class="literal">"autoplug-sort"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="returnvalue">GValueArray</span></a>* user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *factories,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Once decodebin has found the possible <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> objects to try
+for <em class="parameter"><code>caps</code></em> on <em class="parameter"><code>pad</code></em>, this signal is emited. The purpose of the signal is for
+the application to perform additional sorting or filtering on the element
+factory array.
+</p>
+<p>
+The callee should copy and modify <em class="parameter"><code>factories</code></em> or return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if the
+order should not change.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ Invocation of signal handlers stops after one signal handler has
+ returned something else than <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>. Signal handlers are invoked in
+ the order they were connected in.
+ Don't connect signal handlers with the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-CONNECT-AFTER:CAPS"><span class="type">G_CONNECT_AFTER</span></a> flag to this
+ signal, they will never be invoked!
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>The uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factories</code></em> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> of possible <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> to use.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new sorted array of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html"><span class="type">GstElementFactory</span></a> objects.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIDecodeBin-source-setup"></a><h3>The <code class="literal">"source-setup"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin"><span class="type">GstURIDecodeBin</span></a> *bin,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *source,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+This signal is emitted after the source element has been created, so
+it can be configured by setting additional properties (e.g. set a
+proxy server for an http source, or set the device and read speed for
+an audio cd source). This is functionally equivalent to connecting to
+the notify::source signal, but more convenient.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin</code></em> :</span></p></td>
+<td>the uridecodebin.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>source</code></em> :</span></p></td>
+<td>source element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-videoconvert.html b/docs/plugins/html/gst-plugins-base-plugins-videoconvert.html
new file mode 100644
index 0000000..e1c7e9e
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-videoconvert.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videoconvert</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-encodebin.html" title="encodebin">
+<link rel="next" href="gst-plugins-base-plugins-gdpdepay.html" title="gdpdepay">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-encodebin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-gdpdepay.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-videoconvert.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videoconvert.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-videoconvert"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-videoconvert.top_of_page"></a>videoconvert</span></h2>
+<p>videoconvert</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-videoconvert.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-videoconvert.html#GstVideoConvert" title="struct GstVideoConvert">GstVideoConvert</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoconvert.description"></a><h2>Description</h2>
+<p>
+Convert video frames between a great variety of video formats.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id503871"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v videotestsrc ! video/x-raw,format=\(fourcc\)YUY2 ! videoconvert ! ximagesink
+</pre></div>
+</div>
+<p>
+</p>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoconvert.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoConvert"></a><h3>struct GstVideoConvert</h3>
+<pre class="programlisting">struct GstVideoConvert {
+ GstVideoFilter element;
+
+ GstVideoInfo from_info;
+ GstVideoInfo to_info;
+ gboolean negotiated;
+
+ ColorSpaceColorSpec from_spec;
+ ColorSpaceColorSpec to_spec;
+
+ VideoConvert *convert;
+ gboolean dither;
+};
+</pre>
+<p>
+Opaque object data structure.
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-videorate.html b/docs/plugins/html/gst-plugins-base-plugins-videorate.html
new file mode 100644
index 0000000..d955753
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-videorate.html
@@ -0,0 +1,330 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videorate</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-uridecodebin.html" title="uridecodebin">
+<link rel="next" href="gst-plugins-base-plugins-videoscale.html" title="videoscale">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-uridecodebin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-videoscale.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-videorate.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videorate.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videorate.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videorate.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-videorate"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-videorate.top_of_page"></a>videorate</span></h2>
+<p>videorate — Drops/duplicates/adjusts timestamps on video frames to make a perfect stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-videorate.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoRate"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate-struct" title="struct GstVideoRate">GstVideoRate</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videorate.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstVideoRate
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videorate.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop" title='The "drop" property'>drop</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--duplicate" title='The "duplicate" property'>duplicate</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--in" title='The "in" property'>in</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--new-pref" title='The "new-pref" property'>new-pref</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--out" title='The "out" property'>out</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--silent" title='The "silent" property'>silent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--skip-to-first" title='The "skip-to-first" property'>skip-to-first</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--average-period" title='The "average-period" property'>average-period</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop-only" title='The "drop-only" property'>drop-only</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videorate.description"></a><h2>Description</h2>
+<p>
+This element takes an incoming stream of timestamped video frames.
+It will produce a perfect stream that matches the source pad's framerate.
+</p>
+<p>
+The correction is performed by dropping and duplicating frames, no fancy
+algorithm is used to interpolate frames (yet).
+</p>
+<p>
+By default the element will simply negotiate the same framerate on its
+source and sink pad.
+</p>
+<p>
+This operation is useful to link to elements that require a perfect stream.
+Typical examples are formats that do not store timestamps for video frames,
+but only store a framerate, like Ogg and AVI.
+</p>
+<p>
+A conversion to a specific framerate can be forced by using filtered caps on
+the source pad.
+</p>
+<p>
+The properties <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--in" title='The "in" property'><span class="type">"in"</span></a>, <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--out" title='The "out" property'><span class="type">"out"</span></a>, <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--duplicate" title='The "duplicate" property'><span class="type">"duplicate"</span></a>
+and <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop" title='The "drop" property'><span class="type">"drop"</span></a> can be read to obtain information about number of
+input frames, output frames, dropped frames (i.e. the number of unused input
+frames) and duplicated frames (i.e. the number of times an input frame was
+duplicated, beside being used normally).
+</p>
+<p>
+An input stream that needs no adjustments will thus never have dropped or
+duplicated frames.
+</p>
+<p>
+When the <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--silent" title='The "silent" property'><span class="type">"silent"</span></a> property is set to FALSE, a GObject property
+notification will be emitted whenever one of the <a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--duplicate" title='The "duplicate" property'><span class="type">"duplicate"</span></a> or
+<a class="link" href="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop" title='The "drop" property'><span class="type">"drop"</span></a> values changes.
+This can potentially cause performance degradation.
+Note that property notification will happen from the streaming thread, so
+applications should be prepared for this.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id512718"></a><h3>Example pipelines</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videorate ! video/x-raw,framerate=15/1 ! xvimagesink
+</pre></div> Decode an Ogg/Theora file and adjust the framerate to 15 fps before playing.
+To create the test Ogg/Theora file refer to the documentation of theoraenc.
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v v4l2src ! videorate ! video/x-raw,framerate=25/2 ! theoraenc ! oggmux ! filesink location=recording.ogg
+</pre></div> Capture video from a V4L device, and adjust the stream to 12.5 fps before
+encoding to Ogg/Theora.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-09-02 (0.10.11)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id547163"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-videorate.html#plugin-videorate">videorate</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id547225"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> image/jpeg</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> image/png</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> image/jpeg</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> image/png</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videorate.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoRate-struct"></a><h3>struct GstVideoRate</h3>
+<pre class="programlisting">struct GstVideoRate;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videorate.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVideoRate--drop"></a><h3>The <code class="literal">"drop"</code> property</h3>
+<pre class="programlisting"> "drop" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of dropped frames.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--duplicate"></a><h3>The <code class="literal">"duplicate"</code> property</h3>
+<pre class="programlisting"> "duplicate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of duplicated frames.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--in"></a><h3>The <code class="literal">"in"</code> property</h3>
+<pre class="programlisting"> "in" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of input frames.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--new-pref"></a><h3>The <code class="literal">"new-pref"</code> property</h3>
+<pre class="programlisting"> "new-pref" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>Value indicating how much to prefer new frames (unused).</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--out"></a><h3>The <code class="literal">"out"</code> property</h3>
+<pre class="programlisting"> "out" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Number of output frames.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--silent"></a><h3>The <code class="literal">"silent"</code> property</h3>
+<pre class="programlisting"> "silent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Don't emit notify for dropped and duplicated frames.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--skip-to-first"></a><h3>The <code class="literal">"skip-to-first"</code> property</h3>
+<pre class="programlisting"> "skip-to-first" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+Don't produce buffers before the first one we receive.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--average-period"></a><h3>The <code class="literal">"average-period"</code> property</h3>
+<pre class="programlisting"> "average-period" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>
+Arrange for maximum framerate by dropping frames beyond a certain framerate,
+where the framerate is calculated using a moving average over the
+configured.
+</p>
+<p>Allowed values: &lt;= G_MAXINT64</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.36</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoRate--drop-only"></a><h3>The <code class="literal">"drop-only"</code> property</h3>
+<pre class="programlisting"> "drop-only" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+Only drop frames, no duplicates are produced.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.36</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-videoscale.html b/docs/plugins/html/gst-plugins-base-plugins-videoscale.html
new file mode 100644
index 0000000..40b8fde
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-videoscale.html
@@ -0,0 +1,480 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videoscale</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-videorate.html" title="videorate">
+<link rel="next" href="gst-plugins-base-plugins-videotestsrc.html" title="videotestsrc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-videorate.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-videotestsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-videoscale.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videoscale.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videoscale.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videoscale.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-videoscale"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-videoscale.top_of_page"></a>videoscale</span></h2>
+<p>videoscale — Resizes video</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-videoscale.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoScale"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScale-struct" title="struct GstVideoScale">GstVideoScale</a>;
+enum <a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScaleMethod" title="enum GstVideoScaleMethod">GstVideoScaleMethod</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter">GstVideoFilter</a>
+ +----GstVideoScale
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScale--method" title='The "method" property'>method</a>" <a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScaleMethod" title="enum GstVideoScaleMethod"><span class="type">GstVideoScaleMethod</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScale--add-borders" title='The "add-borders" property'>add-borders</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.description"></a><h2>Description</h2>
+<p>
+This element resizes video frames. By default the element will try to
+negotiate to the same size on the source and sinkpad so that no scaling
+is needed. It is therefore safe to insert this element in a pipeline to
+get more robust behaviour without any cost if no scaling is needed.
+</p>
+<p>
+This element supports a wide range of color spaces including various YUV and
+RGB formats and is therefore generally able to operate anywhere in a
+pipeline.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id543783"></a><h3>Example pipelines</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videoconvert ! videoscale ! ximagesink
+</pre></div> Decode an Ogg/Theora and display the video using ximagesink. Since
+ximagesink cannot perform scaling, the video scaling will be performed by
+videoscale when you resize the video window.
+To create the test Ogg/Theora file refer to the documentation of theoraenc.
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videoscale ! video/x-raw, width=50 ! xvimagesink
+</pre></div> Decode an Ogg/Theora and display the video using xvimagesink with a width
+of 50.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-03-02 (0.10.4)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id543753"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-videoscale.html#plugin-videoscale">videoscale</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Wim Taymans &lt;wim.taymans@chello.be&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Converter/Video/Scaler</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id543694"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)v308, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y16 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y8 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)GREY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AY64, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)v308, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y16 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y8 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)GREY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AY64, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoScale-struct"></a><h3>struct GstVideoScale</h3>
+<pre class="programlisting">struct GstVideoScale;</pre>
+<p>
+Opaque data structure
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoScaleMethod"></a><h3>enum GstVideoScaleMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_VIDEO_SCALE_NEAREST,
+ GST_VIDEO_SCALE_BILINEAR,
+ GST_VIDEO_SCALE_4TAP,
+ GST_VIDEO_SCALE_LANCZOS
+} GstVideoScaleMethod;
+</pre>
+<p>
+The videoscale method to use.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-VIDEO-SCALE-NEAREST:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_SCALE_NEAREST</code></span></p></td>
+<td>use nearest neighbour scaling (fast and ugly)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-SCALE-BILINEAR:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_SCALE_BILINEAR</code></span></p></td>
+<td>use bilinear scaling (slower but prettier).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-SCALE-4TAP:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_SCALE_4TAP</code></span></p></td>
+<td>use a 4-tap filter for scaling (slow).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-SCALE-LANCZOS:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_SCALE_LANCZOS</code></span></p></td>
+<td>use a multitap Lanczos filter for scaling (slow).
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVideoScale--method"></a><h3>The <code class="literal">"method"</code> property</h3>
+<pre class="programlisting"> "method" <a class="link" href="gst-plugins-base-plugins-videoscale.html#GstVideoScaleMethod" title="enum GstVideoScaleMethod"><span class="type">GstVideoScaleMethod</span></a> : Read / Write</pre>
+<p>method.</p>
+<p>Default value: Bilinear</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoScale--add-borders"></a><h3>The <code class="literal">"add-borders"</code> property</h3>
+<pre class="programlisting"> "add-borders" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Add black borders if necessary to keep the display aspect ratio.</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videoscale.see-also"></a><h2>See Also</h2>
+videorate, videoconvert
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-videotestsrc.html b/docs/plugins/html/gst-plugins-base-plugins-videotestsrc.html
new file mode 100644
index 0000000..c5d5265
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-videotestsrc.html
@@ -0,0 +1,628 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>videotestsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-videoscale.html" title="videoscale">
+<link rel="next" href="gst-plugins-base-plugins-volume.html" title="volume">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-videoscale.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-volume.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-videotestsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videotestsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videotestsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-videotestsrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-videotestsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-videotestsrc.top_of_page"></a>videotestsrc</span></h2>
+<p>videotestsrc — Creates a test video stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-videotestsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVideoTestSrc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc-struct" title="struct GstVideoTestSrc">GstVideoTestSrc</a>;
+enum <a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcPattern" title="enum GstVideoTestSrcPattern">GstVideoTestSrcPattern</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videotestsrc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+ +----GstVideoTestSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videotestsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--pattern" title='The "pattern" property'>pattern</a>" <a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcPattern" title="enum GstVideoTestSrcPattern"><span class="type">GstVideoTestSrcPattern</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--timestamp-offset" title='The "timestamp-offset" property'>timestamp-offset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--is-live" title='The "is-live" property'>is-live</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--peer-alloc" title='The "peer-alloc" property'>peer-alloc</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--colorspec" title='The "colorspec" property'>colorspec</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcColorSpec"><span class="type">GstVideoTestSrcColorSpec</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--k0" title='The "k0" property'>k0</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt" title='The "kt" property'>kt</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt2" title='The "kt2" property'>kt2</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx" title='The "kx" property'>kx</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx2" title='The "kx2" property'>kx2</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxt" title='The "kxt" property'>kxt</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxy" title='The "kxy" property'>kxy</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky" title='The "ky" property'>ky</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky2" title='The "ky2" property'>ky2</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kyt" title='The "kyt" property'>kyt</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--xoffset" title='The "xoffset" property'>xoffset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--yoffset" title='The "yoffset" property'>yoffset</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--background-color" title='The "background-color" property'>background-color</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--foreground-color" title='The "foreground-color" property'>foreground-color</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--horizontal-speed" title='The "horizontal-speed" property'>horizontal-speed</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videotestsrc.description"></a><h2>Description</h2>
+<p>
+The videotestsrc element is used to produce test video data in a wide variaty
+of formats. The video test data produced can be controlled with the "pattern"
+property.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id550571"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v videotestsrc pattern=snow ! ximagesink
+</pre></div> Shows random noise in an X window.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id550552"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-videotestsrc.html#plugin-videotestsrc">videotestsrc</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David A. Schleef &lt;ds@schleef.org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Source/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id550478"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-yuv, format=(fourcc)YUY2, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)UYVY, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YVYU, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)v308, color-matrix=(string){ sdtv, hdtv }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AYUV, color-matrix=(string){ sdtv, hdtv }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)v210, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)v216, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)UYVP, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)AY64, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YVU9, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YUV9, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)YV12, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)I420, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)NV12, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)NV21, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y41B, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y42B, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y444, color-matrix=(string){ sdtv, hdtv }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)32, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)32, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)32, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)32, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)24, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)24, endianness=(int)4321, depth=(int)24, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)16, endianness=(int)1234, depth=(int)16, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)16, endianness=(int)1234, depth=(int)15, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-rgb, bpp=(int)64, endianness=(int)4321, depth=(int)64, 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 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-bayer, format=(string)bggr, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-bayer, format=(string)rggb, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-bayer, format=(string)grbg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-bayer, format=(string)gbrg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videotestsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVideoTestSrc-struct"></a><h3>struct GstVideoTestSrc</h3>
+<pre class="programlisting">struct GstVideoTestSrc;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrcPattern"></a><h3>enum GstVideoTestSrcPattern</h3>
+<pre class="programlisting">typedef enum {
+ GST_VIDEO_TEST_SRC_SMPTE,
+ GST_VIDEO_TEST_SRC_SNOW,
+ GST_VIDEO_TEST_SRC_BLACK,
+ GST_VIDEO_TEST_SRC_WHITE,
+ GST_VIDEO_TEST_SRC_RED,
+ GST_VIDEO_TEST_SRC_GREEN,
+ GST_VIDEO_TEST_SRC_BLUE,
+ GST_VIDEO_TEST_SRC_CHECKERS1,
+ GST_VIDEO_TEST_SRC_CHECKERS2,
+ GST_VIDEO_TEST_SRC_CHECKERS4,
+ GST_VIDEO_TEST_SRC_CHECKERS8,
+ GST_VIDEO_TEST_SRC_CIRCULAR,
+ GST_VIDEO_TEST_SRC_BLINK,
+ GST_VIDEO_TEST_SRC_SMPTE75,
+ GST_VIDEO_TEST_SRC_ZONE_PLATE,
+ GST_VIDEO_TEST_SRC_GAMUT,
+ GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE,
+ GST_VIDEO_TEST_SRC_SOLID,
+ GST_VIDEO_TEST_SRC_BALL,
+ GST_VIDEO_TEST_SRC_SMPTE100,
+ GST_VIDEO_TEST_SRC_BAR
+} GstVideoTestSrcPattern;
+</pre>
+<p>
+The test pattern to produce.
+</p>
+<p>
+The Gamut pattern creates a checkerboard pattern of colors at the
+edge of the YCbCr gamut and nearby colors that are out of gamut.
+The pattern is divided into 4 regions: black, white, red, and blue.
+After conversion to RGB, the out-of-gamut colors should be converted
+to the same value as their in-gamut neighbors. If the checkerboard
+pattern is still visible after conversion, this indicates a faulty
+conversion. Image manipulation, such as adjusting contrast or
+brightness, can also cause the pattern to be visible.
+</p>
+<p>
+The Zone Plate pattern is based on BBC R&amp;D Report 1978/23, and can
+be used to test spatial frequency response of a system. This
+pattern generator is controlled by the xoffset and yoffset parameters
+and also by all the parameters starting with 'k'. The default
+parameters produce a grey pattern. Try 'videotestsrc
+pattern=zone-plate kx2=20 ky2=20 kt=1' to produce something
+interesting.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-SMPTE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_SMPTE</code></span></p></td>
+<td>A standard SMPTE test pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-SNOW:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_SNOW</code></span></p></td>
+<td>Random noise
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-BLACK:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_BLACK</code></span></p></td>
+<td>A black image
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-WHITE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_WHITE</code></span></p></td>
+<td>A white image
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-RED:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_RED</code></span></p></td>
+<td>A red image
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-GREEN:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_GREEN</code></span></p></td>
+<td>A green image
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-BLUE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_BLUE</code></span></p></td>
+<td>A blue image
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CHECKERS1:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CHECKERS1</code></span></p></td>
+<td>Checkers pattern (1px)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CHECKERS2:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CHECKERS2</code></span></p></td>
+<td>Checkers pattern (2px)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CHECKERS4:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CHECKERS4</code></span></p></td>
+<td>Checkers pattern (4px)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CHECKERS8:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CHECKERS8</code></span></p></td>
+<td>Checkers pattern (8px)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CIRCULAR:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CIRCULAR</code></span></p></td>
+<td>Circular pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-BLINK:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_BLINK</code></span></p></td>
+<td>Alternate between black and white
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-SMPTE75:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_SMPTE75</code></span></p></td>
+<td>SMPTE test pattern (75% color bars)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-ZONE-PLATE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_ZONE_PLATE</code></span></p></td>
+<td>Zone plate
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-GAMUT:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_GAMUT</code></span></p></td>
+<td>Gamut checking pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-CHROMA-ZONE-PLATE:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE</code></span></p></td>
+<td>Chroma zone plate
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-SOLID:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_SOLID</code></span></p></td>
+<td>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-BALL:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_BALL</code></span></p></td>
+<td>Moving ball
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-SMPTE100:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_SMPTE100</code></span></p></td>
+<td>SMPTE test pattern (100% color bars)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-VIDEO-TEST-SRC-BAR:CAPS"></a><span class="term"><code class="literal">GST_VIDEO_TEST_SRC_BAR</code></span></p></td>
+<td>Bar with foreground color
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-videotestsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVideoTestSrc--pattern"></a><h3>The <code class="literal">"pattern"</code> property</h3>
+<pre class="programlisting"> "pattern" <a class="link" href="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcPattern" title="enum GstVideoTestSrcPattern"><span class="type">GstVideoTestSrcPattern</span></a> : Read / Write</pre>
+<p>Type of test pattern to generate.</p>
+<p>Default value: SMPTE 100% color bars</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--timestamp-offset"></a><h3>The <code class="literal">"timestamp-offset"</code> property</h3>
+<pre class="programlisting"> "timestamp-offset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> : Read / Write</pre>
+<p>An offset added to timestamps set on buffers (in ns).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--is-live"></a><h3>The <code class="literal">"is-live"</code> property</h3>
+<pre class="programlisting"> "is-live" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to act as a live source.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--peer-alloc"></a><h3>The <code class="literal">"peer-alloc"</code> property</h3>
+<pre class="programlisting"> "peer-alloc" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Ask the peer to allocate an output buffer.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--colorspec"></a><h3>The <code class="literal">"colorspec"</code> property</h3>
+<pre class="programlisting"> "colorspec" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcColorSpec"><span class="type">GstVideoTestSrcColorSpec</span></a> : Read / Write</pre>
+<p>Generate video in the given color specification (Deprecated: use a caps filter with video/x-raw-yuv,color-matrix="sdtv" or "hdtv" instead).</p>
+<p>Default value: ITU-R Rec. BT.601</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--k0"></a><h3>The <code class="literal">"k0"</code> property</h3>
+<pre class="programlisting"> "k0" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate zero order phase, for generating plain fields or phase offsets.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kt"></a><h3>The <code class="literal">"kt"</code> property</h3>
+<pre class="programlisting"> "kt" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 1st order t phase, for generating phase rotation as a function of time.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kt2"></a><h3>The <code class="literal">"kt2"</code> property</h3>
+<pre class="programlisting"> "kt2" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 2nd order t phase, t*t/256 cycles per picture.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kx"></a><h3>The <code class="literal">"kx"</code> property</h3>
+<pre class="programlisting"> "kx" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 1st order x phase, for generating constant horizontal frequencies.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kx2"></a><h3>The <code class="literal">"kx2"</code> property</h3>
+<pre class="programlisting"> "kx2" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 2nd order x phase, normalised to kx2/256 cycles per horizontal pixel at width/2 from origin.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kxt"></a><h3>The <code class="literal">"kxt"</code> property</h3>
+<pre class="programlisting"> "kxt" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate x*t product phase, normalised to kxy/256 cycles per vertical pixel at width/2 from origin.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kxy"></a><h3>The <code class="literal">"kxy"</code> property</h3>
+<pre class="programlisting"> "kxy" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate x*y product phase.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--ky"></a><h3>The <code class="literal">"ky"</code> property</h3>
+<pre class="programlisting"> "ky" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 1st order y phase, for generating contant vertical frequencies.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--ky2"></a><h3>The <code class="literal">"ky2"</code> property</h3>
+<pre class="programlisting"> "ky2" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 2nd order y phase, normailsed to ky2/256 cycles per vertical pixel at height/2 from origin.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--kyt"></a><h3>The <code class="literal">"kyt"</code> property</h3>
+<pre class="programlisting"> "kyt" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate y*t product phase.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--xoffset"></a><h3>The <code class="literal">"xoffset"</code> property</h3>
+<pre class="programlisting"> "xoffset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 2nd order products x offset.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--yoffset"></a><h3>The <code class="literal">"yoffset"</code> property</h3>
+<pre class="programlisting"> "yoffset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Zoneplate 2nd order products y offset.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--background-color"></a><h3>The <code class="literal">"background-color"</code> property</h3>
+<pre class="programlisting"> "background-color" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>
+Color to use for background color of some patterns. Default is
+black (0xff000000).
+</p>
+<p>Default value: 4278190080</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--foreground-color"></a><h3>The <code class="literal">"foreground-color"</code> property</h3>
+<pre class="programlisting"> "foreground-color" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>
+Color to use for solid-color pattern and foreground color of other
+patterns. Default is white (0xffffffff).
+</p>
+<p>Default value: 4294967295</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVideoTestSrc--horizontal-speed"></a><h3>The <code class="literal">"horizontal-speed"</code> property</h3>
+<pre class="programlisting"> "horizontal-speed" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Scroll image number of pixels per frame (positive is scroll to the left).</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-volume.html b/docs/plugins/html/gst-plugins-base-plugins-volume.html
new file mode 100644
index 0000000..7cdeb15
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-volume.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>volume</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-videotestsrc.html" title="videotestsrc">
+<link rel="next" href="gst-plugins-base-plugins-vorbisdec.html" title="vorbisdec">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-videotestsrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-vorbisdec.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-volume.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-volume.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-volume.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-volume.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-volume.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-volume"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-volume.top_of_page"></a>volume</span></h2>
+<p>volume — Set volume on audio/raw streams</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-volume.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVolume"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-volume.html#GstVolume-struct" title="struct GstVolume">GstVolume</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter">GstAudioFilter</a>
+ +----GstVolume
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstVolume implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstImplementsInterface.html">GstImplementsInterface</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstmixer.html#GstMixer">GstMixer</a> and <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gststreamvolume.html#GstStreamVolume">GstStreamVolume</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-volume.html#GstVolume--mute" title='The "mute" property'>mute</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-volume.html#GstVolume--volume" title='The "volume" property'>volume</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.description"></a><h2>Description</h2>
+<p>
+The volume element changes the volume of the audio data.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id523359"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v -m audiotestsrc ! volume volume=0.5 ! level ! fakesink silent=TRUE
+</pre></div> This pipeline shows that the level of audiotestsrc has been halved
+(peak values are around -6 dB and RMS around -9 dB) compared to
+the same pipeline without the volume element.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id499668"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-volume.html#plugin-volume">volume</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Andy Wingo &lt;wingo@pobox.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter/Effect/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id496503"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVolume-struct"></a><h3>struct GstVolume</h3>
+<pre class="programlisting">struct GstVolume;</pre>
+<p>
+Opaque data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-volume.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVolume--mute"></a><h3>The <code class="literal">"mute"</code> property</h3>
+<pre class="programlisting"> "mute" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>mute channel.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVolume--volume"></a><h3>The <code class="literal">"volume"</code> property</h3>
+<pre class="programlisting"> "volume" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>volume factor, 1.0=100%.</p>
+<p>Allowed values: [0,10]</p>
+<p>Default value: 1</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-vorbisdec.html b/docs/plugins/html/gst-plugins-base-plugins-vorbisdec.html
new file mode 100644
index 0000000..a944122
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-vorbisdec.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>vorbisdec</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-volume.html" title="volume">
+<link rel="next" href="gst-plugins-base-plugins-vorbisenc.html" title="vorbisenc">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-volume.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-vorbisenc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-vorbisdec.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisdec.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisdec.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-vorbisdec"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-vorbisdec.top_of_page"></a>vorbisdec</span></h2>
+<p>vorbisdec — decode raw vorbis streams to float audio</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-vorbisdec.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVorbisDec"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-vorbisdec.html#GstVorbisDec-struct" title="struct GstVorbisDec">GstVorbisDec</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisdec.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstVorbisDec
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisdec.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id487196"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-vorbis.html#plugin-vorbis">vorbis</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Benjamin Otte &lt;otte@gnome.org&gt;, Chris Lord &lt;chris@openedhand.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Decoder/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id506258"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 256 ], endianness=(int)1234, width=(int)32</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisdec.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVorbisDec-struct"></a><h3>struct GstVorbisDec</h3>
+<pre class="programlisting">struct GstVorbisDec;</pre>
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-vorbisenc.html b/docs/plugins/html/gst-plugins-base-plugins-vorbisenc.html
new file mode 100644
index 0000000..238372b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-vorbisenc.html
@@ -0,0 +1,214 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>vorbisenc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-vorbisdec.html" title="vorbisdec">
+<link rel="next" href="gst-plugins-base-plugins-vorbisparse.html" title="vorbisparse">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-vorbisdec.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-vorbisparse.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-vorbisenc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisenc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisenc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisenc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisenc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-vorbisenc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-vorbisenc.top_of_page"></a>vorbisenc</span></h2>
+<p>vorbisenc — Encodes audio in Vorbis format</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-vorbisenc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVorbisEnc"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc-struct" title="struct GstVorbisEnc">GstVorbisEnc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstVorbisEnc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstVorbisEnc implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagSetter.html">GstTagSetter</a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPreset.html">GstPreset</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--bitrate" title='The "bitrate" property'>bitrate</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--last-message" title='The "last-message" property'>last-message</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--managed" title='The "managed" property'>managed</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--max-bitrate" title='The "max-bitrate" property'>max-bitrate</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--min-bitrate" title='The "min-bitrate" property'>min-bitrate</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--quality" title='The "quality" property'>quality</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id548991"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-vorbis.html#plugin-vorbis">vorbis</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Monty &lt;monty@xiph.org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Encoder/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id552484"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-raw-float, rate=(int)[ 1, 200000 ], channels=(int)[ 1, 256 ], endianness=(int)1234, width=(int)32</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVorbisEnc-struct"></a><h3>struct GstVorbisEnc</h3>
+<pre class="programlisting">struct GstVorbisEnc;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisenc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstVorbisEnc--bitrate"></a><h3>The <code class="literal">"bitrate"</code> property</h3>
+<pre class="programlisting"> "bitrate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Attempt to encode at a bitrate averaging this (in bps). This uses the bitrate management engine, and is not recommended for most users. Quality is a better alternative. (-1 == disabled).</p>
+<p>Allowed values: [-1,250001]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVorbisEnc--last-message"></a><h3>The <code class="literal">"last-message"</code> property</h3>
+<pre class="programlisting"> "last-message" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>The last status message.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVorbisEnc--managed"></a><h3>The <code class="literal">"managed"</code> property</h3>
+<pre class="programlisting"> "managed" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Enable bitrate management engine.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVorbisEnc--max-bitrate"></a><h3>The <code class="literal">"max-bitrate"</code> property</h3>
+<pre class="programlisting"> "max-bitrate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Specify a maximum bitrate (in bps). Useful for streaming applications. (-1 == disabled).</p>
+<p>Allowed values: [-1,250001]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVorbisEnc--min-bitrate"></a><h3>The <code class="literal">"min-bitrate"</code> property</h3>
+<pre class="programlisting"> "min-bitrate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Specify a minimum bitrate (in bps). Useful for encoding for a fixed-size channel. (-1 == disabled).</p>
+<p>Allowed values: [-1,250001]</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstVorbisEnc--quality"></a><h3>The <code class="literal">"quality"</code> property</h3>
+<pre class="programlisting"> "quality" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> : Read / Write</pre>
+<p>Specify quality instead of specifying a particular bitrate.</p>
+<p>Allowed values: [-0.1,1]</p>
+<p>Default value: 0.3</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-vorbisparse.html b/docs/plugins/html/gst-plugins-base-plugins-vorbisparse.html
new file mode 100644
index 0000000..074f436
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-vorbisparse.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>vorbisparse</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-vorbisenc.html" title="vorbisenc">
+<link rel="next" href="gst-plugins-base-plugins-vorbistag.html" title="vorbistag">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-vorbisenc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-vorbistag.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-vorbisparse.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisparse.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbisparse.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-vorbisparse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-vorbisparse.top_of_page"></a>vorbisparse</span></h2>
+<p>vorbisparse — parse raw vorbis streams</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-vorbisparse.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVorbisParse"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-vorbisparse.html#GstVorbisParse-struct" title="struct GstVorbisParse">GstVorbisParse</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisparse.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----GstVorbisParse
+ +----<a class="link" href="gst-plugins-base-plugins-vorbistag.html#GstVorbisTag">GstVorbisTag</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisparse.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id511403"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-vorbis.html#plugin-vorbis">vorbis</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Codec/Parser/Audio</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id473624"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbisparse.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVorbisParse-struct"></a><h3>struct GstVorbisParse</h3>
+<pre class="programlisting">struct GstVorbisParse;</pre>
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-vorbistag.html b/docs/plugins/html/gst-plugins-base-plugins-vorbistag.html
new file mode 100644
index 0000000..303b68a
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-vorbistag.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>vorbistag</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-vorbisparse.html" title="vorbisparse">
+<link rel="next" href="gst-plugins-base-plugins-ximagesink.html" title="ximagesink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-vorbisparse.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-ximagesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-vorbistag.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbistag.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbistag.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-vorbistag.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-vorbistag"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-vorbistag.top_of_page"></a>vorbistag</span></h2>
+<p>vorbistag — Retags vorbis streams</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-vorbistag.synopsis"></a><h2>Synopsis</h2>
+<a name="GstVorbisTag"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-vorbistag.html#GstVorbisTag-struct" title="struct GstVorbisTag">GstVorbisTag</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbistag.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a class="link" href="gst-plugins-base-plugins-vorbisparse.html#GstVorbisParse">GstVorbisParse</a>
+ +----GstVorbisTag
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbistag.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstVorbisTag implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagSetter.html">GstTagSetter</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbistag.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id476646"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-vorbis.html#plugin-vorbis">vorbis</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>James Livingston &lt;doclivingston@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Formatter/Metadata</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id551251"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>src</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>source</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>audio/x-vorbis</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-vorbistag.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstVorbisTag-struct"></a><h3>struct GstVorbisTag</h3>
+<pre class="programlisting">struct GstVorbisTag;</pre>
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-ximagesink.html b/docs/plugins/html/gst-plugins-base-plugins-ximagesink.html
new file mode 100644
index 0000000..2e17d8b
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-ximagesink.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>ximagesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-vorbistag.html" title="vorbistag">
+<link rel="next" href="gst-plugins-base-plugins-xvimagesink.html" title="xvimagesink">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-vorbistag.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gst-plugins-base-plugins-xvimagesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-ximagesink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-ximagesink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-ximagesink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-ximagesink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-ximagesink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-ximagesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-ximagesink.top_of_page"></a>ximagesink</span></h2>
+<p>ximagesink — A standard X based videosink</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-ximagesink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstXImageSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink-struct" title="struct GstXImageSink">GstXImageSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSink">GstVideoSink</a>
+ +----GstXImageSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstXImageSink implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstImplementsInterface.html">GstImplementsInterface</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigation">GstNavigation</a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstxoverlay.html#GstXOverlay">GstXOverlay</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--display" title='The "display" property'>display</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--pixel-aspect-ratio" title='The "pixel-aspect-ratio" property'>pixel-aspect-ratio</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--synchronous" title='The "synchronous" property'>synchronous</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--force-aspect-ratio" title='The "force-aspect-ratio" property'>force-aspect-ratio</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-events" title='The "handle-events" property'>handle-events</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-expose" title='The "handle-expose" property'>handle-expose</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-height" title='The "window-height" property'>window-height</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-width" title='The "window-width" property'>window-width</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id554711"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-ximagesink.html#plugin-ximagesink">ximagesink</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Moutte &lt;julien@moutte.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id554773"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstXImageSink-struct"></a><h3>struct GstXImageSink</h3>
+<pre class="programlisting">struct GstXImageSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-ximagesink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstXImageSink--display"></a><h3>The <code class="literal">"display"</code> property</h3>
+<pre class="programlisting"> "display" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>X Display name.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--pixel-aspect-ratio"></a><h3>The <code class="literal">"pixel-aspect-ratio"</code> property</h3>
+<pre class="programlisting"> "pixel-aspect-ratio" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The pixel aspect ratio of the device.</p>
+<p>Default value: "1/1"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--synchronous"></a><h3>The <code class="literal">"synchronous"</code> property</h3>
+<pre class="programlisting"> "synchronous" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, runs the X display in synchronous mode. (used only for debugging).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--force-aspect-ratio"></a><h3>The <code class="literal">"force-aspect-ratio"</code> property</h3>
+<pre class="programlisting"> "force-aspect-ratio" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, reverse caps negotiation (scaling) will respect original aspect ratio.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--handle-events"></a><h3>The <code class="literal">"handle-events"</code> property</h3>
+<pre class="programlisting"> "handle-events" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, XEvents will be selected and handled.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--handle-expose"></a><h3>The <code class="literal">"handle-expose"</code> property</h3>
+<pre class="programlisting"> "handle-expose" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, the current frame will always be drawn in response to X Expose events.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--window-height"></a><h3>The <code class="literal">"window-height"</code> property</h3>
+<pre class="programlisting"> "window-height" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Height of the window.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXImageSink--window-width"></a><h3>The <code class="literal">"window-width"</code> property</h3>
+<pre class="programlisting"> "window-width" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Width of the window.</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins-xvimagesink.html b/docs/plugins/html/gst-plugins-base-plugins-xvimagesink.html
new file mode 100644
index 0000000..ddd7f01
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins-xvimagesink.html
@@ -0,0 +1,295 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>xvimagesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gst-plugins-base Elements">
+<link rel="prev" href="gst-plugins-base-plugins-ximagesink.html" title="ximagesink">
+<link rel="next" href="ch02.html" title="gst-plugins-base Plugins">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gst-plugins-base-plugins-ximagesink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GStreamer Base Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="ch02.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gst-plugins-base-plugins-xvimagesink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gst-plugins-base-plugins-xvimagesink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gst-plugins-base-plugins-xvimagesink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gst-plugins-base-plugins-xvimagesink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gst-plugins-base-plugins-xvimagesink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gst-plugins-base-plugins-xvimagesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-base-plugins-xvimagesink.top_of_page"></a>xvimagesink</span></h2>
+<p>xvimagesink — A Xv based videosink</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gst-plugins-base-plugins-xvimagesink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstXvImageSink"></a><pre class="synopsis">struct <a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink-struct" title="struct GstXvImageSink">GstXvImageSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstvideosink.html#GstVideoSink">GstVideoSink</a>
+ +----GstXvImageSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstXvImageSink implements
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstImplementsInterface.html">GstImplementsInterface</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstnavigation.html#GstNavigation">GstNavigation</a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstxoverlay.html#GstXOverlay">GstXOverlay</a>, <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstcolorbalance.html#GstColorBalance">GstColorBalance</a> and <a href="../gst-plugins-base-libs-0.11/gst-plugins-base-libs-gstpropertyprobe.html#GstPropertyProbe">GstPropertyProbe</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--brightness" title='The "brightness" property'>brightness</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--contrast" title='The "contrast" property'>contrast</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--display" title='The "display" property'>display</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--hue" title='The "hue" property'>hue</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--pixel-aspect-ratio" title='The "pixel-aspect-ratio" property'>pixel-aspect-ratio</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--saturation" title='The "saturation" property'>saturation</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--synchronous" title='The "synchronous" property'>synchronous</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--force-aspect-ratio" title='The "force-aspect-ratio" property'>force-aspect-ratio</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device" title='The "device" property'>device</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device-name" title='The "device-name" property'>device-name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-events" title='The "handle-events" property'>handle-events</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--double-buffer" title='The "double-buffer" property'>double-buffer</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-expose" title='The "handle-expose" property'>handle-expose</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--autopaint-colorkey" title='The "autopaint-colorkey" property'>autopaint-colorkey</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--colorkey" title='The "colorkey" property'>colorkey</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--draw-borders" title='The "draw-borders" property'>draw-borders</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-height" title='The "window-height" property'>window-height</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+ "<a class="link" href="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-width" title='The "window-width" property'>window-width</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.description"></a><h2>Description</h2>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id557132"></a><h3>Element Information</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">plugin</span></p></td>
+<td>
+ <a class="link" href="gst-plugins-base-plugins-plugin-xvimagesink.html#plugin-xvimagesink">xvimagesink</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Moutte &lt;julien@moutte.net&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Sink/Video</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id557194"></a><h3>Element Pads</h3>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">name</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">direction</span></p></td>
+<td>sink</td>
+</tr>
+<tr>
+<td><p><span class="term">presence</span></p></td>
+<td>always</td>
+</tr>
+<tr>
+<td><p><span class="term">details</span></p></td>
+<td>video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> video/x-raw-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstXvImageSink-struct"></a><h3>struct GstXvImageSink</h3>
+<pre class="programlisting">struct GstXvImageSink;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-base-plugins-xvimagesink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstXvImageSink--brightness"></a><h3>The <code class="literal">"brightness"</code> property</h3>
+<pre class="programlisting"> "brightness" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The brightness of the video.</p>
+<p>Allowed values: [-1000,1000]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--contrast"></a><h3>The <code class="literal">"contrast"</code> property</h3>
+<pre class="programlisting"> "contrast" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The contrast of the video.</p>
+<p>Allowed values: [-1000,1000]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--display"></a><h3>The <code class="literal">"display"</code> property</h3>
+<pre class="programlisting"> "display" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>X Display name.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--hue"></a><h3>The <code class="literal">"hue"</code> property</h3>
+<pre class="programlisting"> "hue" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The hue of the video.</p>
+<p>Allowed values: [-1000,1000]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--pixel-aspect-ratio"></a><h3>The <code class="literal">"pixel-aspect-ratio"</code> property</h3>
+<pre class="programlisting"> "pixel-aspect-ratio" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The pixel aspect ratio of the device.</p>
+<p>Default value: "1/1"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--saturation"></a><h3>The <code class="literal">"saturation"</code> property</h3>
+<pre class="programlisting"> "saturation" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>The saturation of the video.</p>
+<p>Allowed values: [-1000,1000]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--synchronous"></a><h3>The <code class="literal">"synchronous"</code> property</h3>
+<pre class="programlisting"> "synchronous" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, runs the X display in synchronous mode. (used only for debugging).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--force-aspect-ratio"></a><h3>The <code class="literal">"force-aspect-ratio"</code> property</h3>
+<pre class="programlisting"> "force-aspect-ratio" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, scaling will respect original aspect ratio.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--device"></a><h3>The <code class="literal">"device"</code> property</h3>
+<pre class="programlisting"> "device" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>The number of the video adaptor.</p>
+<p>Default value: "0"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--device-name"></a><h3>The <code class="literal">"device-name"</code> property</h3>
+<pre class="programlisting"> "device-name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read</pre>
+<p>The name of the video adaptor.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--handle-events"></a><h3>The <code class="literal">"handle-events"</code> property</h3>
+<pre class="programlisting"> "handle-events" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, XEvents will be selected and handled.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--double-buffer"></a><h3>The <code class="literal">"double-buffer"</code> property</h3>
+<pre class="programlisting"> "double-buffer" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to double-buffer the output.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--handle-expose"></a><h3>The <code class="literal">"handle-expose"</code> property</h3>
+<pre class="programlisting"> "handle-expose" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>When enabled, the current frame will always be drawn in response to X Expose events.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--autopaint-colorkey"></a><h3>The <code class="literal">"autopaint-colorkey"</code> property</h3>
+<pre class="programlisting"> "autopaint-colorkey" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Whether to autofill overlay with colorkey.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--colorkey"></a><h3>The <code class="literal">"colorkey"</code> property</h3>
+<pre class="programlisting"> "colorkey" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Color to use for the overlay mask.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--draw-borders"></a><h3>The <code class="literal">"draw-borders"</code> property</h3>
+<pre class="programlisting"> "draw-borders" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Draw black borders to fill unused area in force-aspect-ratio mode.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--window-height"></a><h3>The <code class="literal">"window-height"</code> property</h3>
+<pre class="programlisting"> "window-height" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Height of the window.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstXvImageSink--window-width"></a><h3>The <code class="literal">"window-width"</code> property</h3>
+<pre class="programlisting"> "window-width" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Width of the window.</p>
+<p>Default value: 0</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-base-plugins.devhelp2 b/docs/plugins/html/gst-plugins-base-plugins.devhelp2
new file mode 100644
index 0000000..1020971
--- /dev/null
+++ b/docs/plugins/html/gst-plugins-base-plugins.devhelp2
@@ -0,0 +1,617 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="GStreamer Base Plugins 0.11 Plugins Reference Manual" link="index.html" author="" name="gst-plugins-base-plugins" version="2" language="c">
+ <chapters>
+ <sub name="gst-plugins-base Elements" link="ch01.html">
+ <sub name="adder" link="gst-plugins-base-plugins-adder.html"/>
+ <sub name="appsrc" link="gst-plugins-base-plugins-appsrc.html"/>
+ <sub name="appsink" link="gst-plugins-base-plugins-appsink.html"/>
+ <sub name="alsamixer" link="gst-plugins-base-plugins-alsamixer.html"/>
+ <sub name="alsasink" link="gst-plugins-base-plugins-alsasink.html"/>
+ <sub name="alsasrc" link="gst-plugins-base-plugins-alsasrc.html"/>
+ <sub name="audioconvert" link="gst-plugins-base-plugins-audioconvert.html"/>
+ <sub name="audiorate" link="gst-plugins-base-plugins-audiorate.html"/>
+ <sub name="audioresample" link="gst-plugins-base-plugins-audioresample.html"/>
+ <sub name="audiotestsrc" link="gst-plugins-base-plugins-audiotestsrc.html"/>
+ <sub name="cdparanoiasrc" link="gst-plugins-base-plugins-cdparanoiasrc.html"/>
+ <sub name="clockoverlay" link="gst-plugins-base-plugins-clockoverlay.html"/>
+ <sub name="decodebin" link="gst-plugins-base-plugins-decodebin.html"/>
+ <sub name="encodebin" link="gst-plugins-base-plugins-encodebin.html"/>
+ <sub name="videoconvert" link="gst-plugins-base-plugins-videoconvert.html"/>
+ <sub name="gdpdepay" link="gst-plugins-base-plugins-gdpdepay.html"/>
+ <sub name="gdppay" link="gst-plugins-base-plugins-gdppay.html"/>
+ <sub name="giosink" link="gst-plugins-base-plugins-giosink.html"/>
+ <sub name="giosrc" link="gst-plugins-base-plugins-giosrc.html"/>
+ <sub name="giostreamsink" link="gst-plugins-base-plugins-giostreamsink.html"/>
+ <sub name="giostreamsrc" link="gst-plugins-base-plugins-giostreamsrc.html"/>
+ <sub name="multifdsink" link="gst-plugins-base-plugins-multifdsink.html"/>
+ <sub name="oggdemux" link="gst-plugins-base-plugins-oggdemux.html"/>
+ <sub name="oggmux" link="gst-plugins-base-plugins-oggmux.html"/>
+ <sub name="playbin" link="gst-plugins-base-plugins-playbin.html"/>
+ <sub name="subtitleoverlay" link="gst-plugins-base-plugins-subtitleoverlay.html"/>
+ <sub name="tcpclientsrc" link="gst-plugins-base-plugins-tcpclientsrc.html"/>
+ <sub name="tcpclientsink" link="gst-plugins-base-plugins-tcpclientsink.html"/>
+ <sub name="tcpserversrc" link="gst-plugins-base-plugins-tcpserversrc.html"/>
+ <sub name="tcpserversink" link="gst-plugins-base-plugins-tcpserversink.html"/>
+ <sub name="textoverlay" link="gst-plugins-base-plugins-textoverlay.html"/>
+ <sub name="textrender" link="gst-plugins-base-plugins-textrender.html"/>
+ <sub name="theoradec" link="gst-plugins-base-plugins-theoradec.html"/>
+ <sub name="theoraenc" link="gst-plugins-base-plugins-theoraenc.html"/>
+ <sub name="theoraparse" link="gst-plugins-base-plugins-theoraparse.html"/>
+ <sub name="timeoverlay" link="gst-plugins-base-plugins-timeoverlay.html"/>
+ <sub name="uridecodebin" link="gst-plugins-base-plugins-uridecodebin.html"/>
+ <sub name="videorate" link="gst-plugins-base-plugins-videorate.html"/>
+ <sub name="videoscale" link="gst-plugins-base-plugins-videoscale.html"/>
+ <sub name="videotestsrc" link="gst-plugins-base-plugins-videotestsrc.html"/>
+ <sub name="volume" link="gst-plugins-base-plugins-volume.html"/>
+ <sub name="vorbisdec" link="gst-plugins-base-plugins-vorbisdec.html"/>
+ <sub name="vorbisenc" link="gst-plugins-base-plugins-vorbisenc.html"/>
+ <sub name="vorbisparse" link="gst-plugins-base-plugins-vorbisparse.html"/>
+ <sub name="vorbistag" link="gst-plugins-base-plugins-vorbistag.html"/>
+ <sub name="ximagesink" link="gst-plugins-base-plugins-ximagesink.html"/>
+ <sub name="xvimagesink" link="gst-plugins-base-plugins-xvimagesink.html"/>
+ </sub>
+ <sub name="gst-plugins-base Plugins" link="ch02.html">
+ <sub name="adder" link="gst-plugins-base-plugins-plugin-adder.html"/>
+ <sub name="alsa" link="gst-plugins-base-plugins-plugin-alsa.html"/>
+ <sub name="app" link="gst-plugins-base-plugins-plugin-app.html"/>
+ <sub name="audioconvert" link="gst-plugins-base-plugins-plugin-audioconvert.html"/>
+ <sub name="audiorate" link="gst-plugins-base-plugins-plugin-audiorate.html"/>
+ <sub name="audioresample" link="gst-plugins-base-plugins-plugin-audioresample.html"/>
+ <sub name="audiotestsrc" link="gst-plugins-base-plugins-plugin-audiotestsrc.html"/>
+ <sub name="cdparanoia" link="gst-plugins-base-plugins-plugin-cdparanoia.html"/>
+ <sub name="decodebin" link="gst-plugins-base-plugins-plugin-decodebin.html"/>
+ <sub name="encoding" link="gst-plugins-base-plugins-plugin-encoding.html"/>
+ <sub name="gdp" link="gst-plugins-base-plugins-plugin-gdp.html"/>
+ <sub name="gio" link="gst-plugins-base-plugins-plugin-gio.html"/>
+ <sub name="libvisual" link="gst-plugins-base-plugins-plugin-libvisual.html"/>
+ <sub name="ogg" link="gst-plugins-base-plugins-plugin-ogg.html"/>
+ <sub name="pango" link="gst-plugins-base-plugins-plugin-pango.html"/>
+ <sub name="playback" link="gst-plugins-base-plugins-plugin-playback.html"/>
+ <sub name="subparse" link="gst-plugins-base-plugins-plugin-subparse.html"/>
+ <sub name="tcp" link="gst-plugins-base-plugins-plugin-tcp.html"/>
+ <sub name="theora" link="gst-plugins-base-plugins-plugin-theora.html"/>
+ <sub name="typefindfunctions" link="gst-plugins-base-plugins-plugin-typefindfunctions.html"/>
+ <sub name="uridecodebin" link="gst-plugins-base-plugins-plugin-uridecodebin.html"/>
+ <sub name="videorate" link="gst-plugins-base-plugins-plugin-videorate.html"/>
+ <sub name="videoscale" link="gst-plugins-base-plugins-plugin-videoscale.html"/>
+ <sub name="videotestsrc" link="gst-plugins-base-plugins-plugin-videotestsrc.html"/>
+ <sub name="volume" link="gst-plugins-base-plugins-plugin-volume.html"/>
+ <sub name="vorbis" link="gst-plugins-base-plugins-plugin-vorbis.html"/>
+ <sub name="ximagesink" link="gst-plugins-base-plugins-plugin-ximagesink.html"/>
+ <sub name="xvimagesink" link="gst-plugins-base-plugins-plugin-xvimagesink.html"/>
+ </sub>
+ <sub name="gst-plugins-base Classes" link="ch03.html"/>
+ </chapters>
+ <functions>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-adder.html#id473522"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-adder.html#id473497"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-adder.html#id500681"/>
+ <keyword type="struct" name="struct GstAdder" link="gst-plugins-base-plugins-adder.html#GstAdder-struct"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gst-plugins-base-plugins-adder.html#GstAdder--caps"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-appsrc.html#id507510"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-appsrc.html#id507572"/>
+ <keyword type="struct" name="struct GstAppSrc" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-struct"/>
+ <keyword type="property" name="The &quot;block&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--block"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--caps"/>
+ <keyword type="property" name="The &quot;format&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--format"/>
+ <keyword type="property" name="The &quot;is-live&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--is-live"/>
+ <keyword type="property" name="The &quot;max-bytes&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-bytes"/>
+ <keyword type="property" name="The &quot;max-latency&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-latency"/>
+ <keyword type="property" name="The &quot;min-latency&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-latency"/>
+ <keyword type="property" name="The &quot;size&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--size"/>
+ <keyword type="property" name="The &quot;stream-type&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--stream-type"/>
+ <keyword type="property" name="The &quot;emit-signals&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--emit-signals"/>
+ <keyword type="property" name="The &quot;min-percent&quot; property" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-percent"/>
+ <keyword type="signal" name="The &quot;end-of-stream&quot; signal" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-end-of-stream"/>
+ <keyword type="signal" name="The &quot;enough-data&quot; signal" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-enough-data"/>
+ <keyword type="signal" name="The &quot;need-data&quot; signal" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-need-data"/>
+ <keyword type="signal" name="The &quot;push-buffer&quot; signal" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-push-buffer"/>
+ <keyword type="signal" name="The &quot;seek-data&quot; signal" link="gst-plugins-base-plugins-appsrc.html#GstAppSrc-seek-data"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-appsink.html#id513544"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-appsink.html#id513605"/>
+ <keyword type="struct" name="struct GstAppSink" link="gst-plugins-base-plugins-appsink.html#GstAppSink-struct"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gst-plugins-base-plugins-appsink.html#GstAppSink--caps"/>
+ <keyword type="property" name="The &quot;drop&quot; property" link="gst-plugins-base-plugins-appsink.html#GstAppSink--drop"/>
+ <keyword type="property" name="The &quot;emit-signals&quot; property" link="gst-plugins-base-plugins-appsink.html#GstAppSink--emit-signals"/>
+ <keyword type="property" name="The &quot;eos&quot; property" link="gst-plugins-base-plugins-appsink.html#GstAppSink--eos"/>
+ <keyword type="property" name="The &quot;max-buffers&quot; property" link="gst-plugins-base-plugins-appsink.html#GstAppSink--max-buffers"/>
+ <keyword type="signal" name="The &quot;eos&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-eos"/>
+ <keyword type="signal" name="The &quot;new-buffer&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer"/>
+ <keyword type="signal" name="The &quot;new-preroll&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-new-preroll"/>
+ <keyword type="signal" name="The &quot;pull-buffer&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer"/>
+ <keyword type="signal" name="The &quot;pull-preroll&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-preroll"/>
+ <keyword type="signal" name="The &quot;new-buffer-list&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer-list"/>
+ <keyword type="signal" name="The &quot;pull-buffer-list&quot; signal" link="gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer-list"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-alsamixer.html#id475040"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-alsamixer.html#id475102"/>
+ <keyword type="struct" name="struct GstAlsaMixerElement" link="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement-struct"/>
+ <keyword type="property" name="The &quot;device&quot; property" link="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device"/>
+ <keyword type="property" name="The &quot;device-name&quot; property" link="gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device-name"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-alsasink.html#id500156"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-alsasink.html#id514777"/>
+ <keyword type="struct" name="struct GstAlsaSink" link="gst-plugins-base-plugins-alsasink.html#GstAlsaSink-struct"/>
+ <keyword type="property" name="The &quot;device&quot; property" link="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device"/>
+ <keyword type="property" name="The &quot;device-name&quot; property" link="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device-name"/>
+ <keyword type="property" name="The &quot;card-name&quot; property" link="gst-plugins-base-plugins-alsasink.html#GstAlsaSink--card-name"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-alsasrc.html#id486142"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-alsasrc.html#id515248"/>
+ <keyword type="struct" name="struct GstAlsaSrc" link="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc-struct"/>
+ <keyword type="property" name="The &quot;device&quot; property" link="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device"/>
+ <keyword type="property" name="The &quot;device-name&quot; property" link="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device-name"/>
+ <keyword type="property" name="The &quot;card-name&quot; property" link="gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--card-name"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-audioconvert.html#id516683"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-audioconvert.html#id514682"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-audioconvert.html#id492892"/>
+ <keyword type="struct" name="struct GstAudioConvert" link="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert-struct"/>
+ <keyword type="enum" name="enum GstAudioConvertDithering" link="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertDithering"/>
+ <keyword type="enum" name="enum GstAudioConvertNoiseShaping" link="gst-plugins-base-plugins-audioconvert.html#GstAudioConvertNoiseShaping"/>
+ <keyword type="property" name="The &quot;dithering&quot; property" link="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--dithering"/>
+ <keyword type="property" name="The &quot;noise-shaping&quot; property" link="gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--noise-shaping"/>
+ <keyword type="" name="Example pipelines" link="gst-plugins-base-plugins-audiorate.html#id517721"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-audiorate.html#id517744"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-audiorate.html#id517806"/>
+ <keyword type="struct" name="struct GstAudioRate" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate-struct"/>
+ <keyword type="property" name="The &quot;add&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--add"/>
+ <keyword type="property" name="The &quot;drop&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--drop"/>
+ <keyword type="property" name="The &quot;in&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--in"/>
+ <keyword type="property" name="The &quot;out&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--out"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--silent"/>
+ <keyword type="property" name="The &quot;tolerance&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--tolerance"/>
+ <keyword type="property" name="The &quot;skip-to-first&quot; property" link="gst-plugins-base-plugins-audiorate.html#GstAudioRate--skip-to-first"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-audioresample.html#id497912"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-audioresample.html#id497906"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-audioresample.html#id494031"/>
+ <keyword type="struct" name="struct GstAudioResample" link="gst-plugins-base-plugins-audioresample.html#GstAudioResample-struct"/>
+ <keyword type="property" name="The &quot;filter-length&quot; property" link="gst-plugins-base-plugins-audioresample.html#GstAudioResample--filter-length"/>
+ <keyword type="property" name="The &quot;quality&quot; property" link="gst-plugins-base-plugins-audioresample.html#GstAudioResample--quality"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-audiotestsrc.html#id519060"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-audiotestsrc.html#id519093"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-audiotestsrc.html#id519155"/>
+ <keyword type="struct" name="struct GstAudioTestSrc" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc-struct"/>
+ <keyword type="enum" name="enum GstAudioTestSrcWave" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrcWave"/>
+ <keyword type="property" name="The &quot;freq&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--freq"/>
+ <keyword type="property" name="The &quot;is-live&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--is-live"/>
+ <keyword type="property" name="The &quot;samplesperbuffer&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--samplesperbuffer"/>
+ <keyword type="property" name="The &quot;timestamp-offset&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--timestamp-offset"/>
+ <keyword type="property" name="The &quot;volume&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--volume"/>
+ <keyword type="property" name="The &quot;wave&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--wave"/>
+ <keyword type="property" name="The &quot;can-activate-pull&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-pull"/>
+ <keyword type="property" name="The &quot;can-activate-push&quot; property" link="gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-push"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-cdparanoiasrc.html#id520071"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-cdparanoiasrc.html#id520133"/>
+ <keyword type="struct" name="struct GstCdParanoiaSrc" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-struct"/>
+ <keyword type="property" name="The &quot;generic-device&quot; property" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--generic-device"/>
+ <keyword type="property" name="The &quot;paranoia-mode&quot; property" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--paranoia-mode"/>
+ <keyword type="property" name="The &quot;read-speed&quot; property" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--read-speed"/>
+ <keyword type="property" name="The &quot;search-overlap&quot; property" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--search-overlap"/>
+ <keyword type="property" name="The &quot;cache-size&quot; property" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--cache-size"/>
+ <keyword type="signal" name="The &quot;transport-error&quot; signal" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-transport-error"/>
+ <keyword type="signal" name="The &quot;uncorrected-error&quot; signal" link="gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-uncorrected-error"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-clockoverlay.html#id520875"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-clockoverlay.html#id520820"/>
+ <keyword type="struct" name="struct GstClockOverlay" link="gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay-struct"/>
+ <keyword type="property" name="The &quot;time-format&quot; property" link="gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay--time-format"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-decodebin.html#id522627"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-decodebin.html#id522690"/>
+ <keyword type="struct" name="struct GstDecodeBin" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-struct"/>
+ <keyword type="property" name="The &quot;threaded&quot; property" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin--threaded"/>
+ <keyword type="property" name="The &quot;sink-caps&quot; property" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin--sink-caps"/>
+ <keyword type="signal" name="The &quot;new-decoded-pad&quot; signal" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-new-decoded-pad"/>
+ <keyword type="signal" name="The &quot;removed-decoded-pad&quot; signal" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-removed-decoded-pad"/>
+ <keyword type="signal" name="The &quot;unknown-type&quot; signal" link="gst-plugins-base-plugins-decodebin.html#GstDecodeBin-unknown-type"/>
+ <keyword type="" name="Features" link="gst-plugins-base-plugins-encodebin.html#id511302"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-encodebin.html#id524019"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-encodebin.html#id524080"/>
+ <keyword type="struct" name="GstEncodeBin" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin-struct"/>
+ <keyword type="property" name="The &quot;audio-jitter-tolerance&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--audio-jitter-tolerance"/>
+ <keyword type="property" name="The &quot;avoid-reencoding&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--avoid-reencoding"/>
+ <keyword type="property" name="The &quot;profile&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--profile"/>
+ <keyword type="property" name="The &quot;queue-buffers-max&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-buffers-max"/>
+ <keyword type="property" name="The &quot;queue-bytes-max&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-bytes-max"/>
+ <keyword type="property" name="The &quot;queue-time-max&quot; property" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-time-max"/>
+ <keyword type="signal" name="The &quot;request-pad&quot; signal" link="gst-plugins-base-plugins-encodebin.html#GstEncodeBin-request-pad"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-videoconvert.html#id503871"/>
+ <keyword type="struct" name="struct GstVideoConvert" link="gst-plugins-base-plugins-videoconvert.html#GstVideoConvert"/>
+ <keyword type="" name="" link="gst-plugins-base-plugins-gdpdepay.html#id477795"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-gdpdepay.html#id505139"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-gdpdepay.html#id498695"/>
+ <keyword type="struct" name="struct GstGDPDepay" link="gst-plugins-base-plugins-gdpdepay.html#GstGDPDepay-struct"/>
+ <keyword type="" name="" link="gst-plugins-base-plugins-gdppay.html#id497584"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-gdppay.html#id504604"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-gdppay.html#id521730"/>
+ <keyword type="struct" name="struct GstGDPPay" link="gst-plugins-base-plugins-gdppay.html#GstGDPPay-struct"/>
+ <keyword type="property" name="The &quot;crc-header&quot; property" link="gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-header"/>
+ <keyword type="property" name="The &quot;crc-payload&quot; property" link="gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-payload"/>
+ <keyword type="property" name="The &quot;version&quot; property" link="gst-plugins-base-plugins-gdppay.html#GstGDPPay--version"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-giosink.html#id488791"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-giosink.html#id525824"/>
+ <keyword type="struct" name="struct GstGioSink" link="gst-plugins-base-plugins-giosink.html#GstGioSink-struct"/>
+ <keyword type="property" name="The &quot;location&quot; property" link="gst-plugins-base-plugins-giosink.html#GstGioSink--location"/>
+ <keyword type="property" name="The &quot;file&quot; property" link="gst-plugins-base-plugins-giosink.html#GstGioSink--file"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-giosrc.html#id488494"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-giosrc.html#id525447"/>
+ <keyword type="struct" name="struct GstGioSrc" link="gst-plugins-base-plugins-giosrc.html#GstGioSrc-struct"/>
+ <keyword type="property" name="The &quot;location&quot; property" link="gst-plugins-base-plugins-giosrc.html#GstGioSrc--location"/>
+ <keyword type="property" name="The &quot;file&quot; property" link="gst-plugins-base-plugins-giosrc.html#GstGioSrc--file"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-giostreamsink.html#id521076"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-giostreamsink.html#id525229"/>
+ <keyword type="struct" name="struct GstGioStreamSink" link="gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink-struct"/>
+ <keyword type="property" name="The &quot;stream&quot; property" link="gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink--stream"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-giostreamsrc.html#id527868"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-giostreamsrc.html#id480417"/>
+ <keyword type="struct" name="struct GstGioStreamSrc" link="gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc-struct"/>
+ <keyword type="property" name="The &quot;stream&quot; property" link="gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc--stream"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-multifdsink.html#id528543"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-multifdsink.html#id528604"/>
+ <keyword type="struct" name="struct GstMultiFdSink" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-struct"/>
+ <keyword type="enum" name="enum GstRecoverPolicy" link="gst-plugins-base-plugins-multifdsink.html#GstRecoverPolicy"/>
+ <keyword type="enum" name="enum GstSyncMethod" link="gst-plugins-base-plugins-multifdsink.html#GstSyncMethod"/>
+ <keyword type="enum" name="enum GstClientStatus" link="gst-plugins-base-plugins-multifdsink.html#GstClientStatus"/>
+ <keyword type="enum" name="enum GstTCPUnitType" link="gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType"/>
+ <keyword type="property" name="The &quot;buffers-max&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-max"/>
+ <keyword type="property" name="The &quot;buffers-queued&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-queued"/>
+ <keyword type="property" name="The &quot;buffers-soft-max&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-soft-max"/>
+ <keyword type="property" name="The &quot;bytes-served&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-served"/>
+ <keyword type="property" name="The &quot;bytes-to-serve&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-to-serve"/>
+ <keyword type="property" name="The &quot;mode&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--mode"/>
+ <keyword type="property" name="The &quot;protocol&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--protocol"/>
+ <keyword type="property" name="The &quot;recover-policy&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--recover-policy"/>
+ <keyword type="property" name="The &quot;sync-clients&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-clients"/>
+ <keyword type="property" name="The &quot;sync-method&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-method"/>
+ <keyword type="property" name="The &quot;timeout&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--timeout"/>
+ <keyword type="property" name="The &quot;buffers-min&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-min"/>
+ <keyword type="property" name="The &quot;burst-unit&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-unit"/>
+ <keyword type="property" name="The &quot;burst-value&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-value"/>
+ <keyword type="property" name="The &quot;bytes-min&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-min"/>
+ <keyword type="property" name="The &quot;time-min&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--time-min"/>
+ <keyword type="property" name="The &quot;unit-type&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--unit-type"/>
+ <keyword type="property" name="The &quot;units-max&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-max"/>
+ <keyword type="property" name="The &quot;units-soft-max&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-soft-max"/>
+ <keyword type="property" name="The &quot;qos-dscp&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--qos-dscp"/>
+ <keyword type="property" name="The &quot;handle-read&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--handle-read"/>
+ <keyword type="property" name="The &quot;resend-streamheader&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--resend-streamheader"/>
+ <keyword type="property" name="The &quot;num-fds&quot; property" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--num-fds"/>
+ <keyword type="signal" name="The &quot;add&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add"/>
+ <keyword type="signal" name="The &quot;clear&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-clear"/>
+ <keyword type="signal" name="The &quot;client-added&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-added"/>
+ <keyword type="signal" name="The &quot;client-removed&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed"/>
+ <keyword type="signal" name="The &quot;get-stats&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-get-stats"/>
+ <keyword type="signal" name="The &quot;remove&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove"/>
+ <keyword type="signal" name="The &quot;client-fd-removed&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-fd-removed"/>
+ <keyword type="signal" name="The &quot;add-full&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add-full"/>
+ <keyword type="signal" name="The &quot;remove-flush&quot; signal" link="gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove-flush"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-oggdemux.html#id489789"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-oggdemux.html#id484410"/>
+ <keyword type="struct" name="struct GstOggDemux" link="gst-plugins-base-plugins-oggdemux.html#GstOggDemux-struct"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-oggmux.html#id533167"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-oggmux.html#id512151"/>
+ <keyword type="struct" name="struct GstOggMux" link="gst-plugins-base-plugins-oggmux.html#GstOggMux-struct"/>
+ <keyword type="property" name="The &quot;max-delay&quot; property" link="gst-plugins-base-plugins-oggmux.html#GstOggMux--max-delay"/>
+ <keyword type="property" name="The &quot;max-page-delay&quot; property" link="gst-plugins-base-plugins-oggmux.html#GstOggMux--max-page-delay"/>
+ <keyword type="" name="Usage" link="gst-plugins-base-plugins-playbin.html#id535719"/>
+ <keyword type="" name="Advanced Usage: specifying the audio and video sink" link="gst-plugins-base-plugins-playbin.html#id531133"/>
+ <keyword type="" name="Retrieving Tags and Other Meta Data" link="gst-plugins-base-plugins-playbin.html#id531221"/>
+ <keyword type="" name="Buffering" link="gst-plugins-base-plugins-playbin.html#id531239"/>
+ <keyword type="" name="Embedding the video window in your application" link="gst-plugins-base-plugins-playbin.html#id531262"/>
+ <keyword type="" name="Specifying which CD/DVD device to use" link="gst-plugins-base-plugins-playbin.html#id531278"/>
+ <keyword type="" name="Handling redirects" link="gst-plugins-base-plugins-playbin.html#id531290"/>
+ <keyword type="" name="Examples" link="gst-plugins-base-plugins-playbin.html#id531304"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-playbin.html#id531345"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-playbin.html#id531407"/>
+ <keyword type="struct" name="struct GstPlayBin" link="gst-plugins-base-plugins-playbin.html#GstPlayBin-struct"/>
+ <keyword type="enum" name="enum GstPlayFlags" link="gst-plugins-base-plugins-playbin.html#GstPlayFlags"/>
+ <keyword type="property" name="The &quot;audio-sink&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--audio-sink"/>
+ <keyword type="property" name="The &quot;frame&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--frame"/>
+ <keyword type="property" name="The &quot;subtitle-font-desc&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--subtitle-font-desc"/>
+ <keyword type="property" name="The &quot;video-sink&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--video-sink"/>
+ <keyword type="property" name="The &quot;vis-plugin&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--vis-plugin"/>
+ <keyword type="property" name="The &quot;volume&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--volume"/>
+ <keyword type="property" name="The &quot;connection-speed&quot; property" link="gst-plugins-base-plugins-playbin.html#GstPlayBin--connection-speed"/>
+ <keyword type="" name="Examples" link="gst-plugins-base-plugins-subtitleoverlay.html#id479357"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-subtitleoverlay.html#id489687"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-subtitleoverlay.html#id534893"/>
+ <keyword type="struct" name="struct GstSubtitleOverlay" link="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay-struct"/>
+ <keyword type="property" name="The &quot;font-desc&quot; property" link="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--font-desc"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--silent"/>
+ <keyword type="property" name="The &quot;subtitle-encoding&quot; property" link="gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--subtitle-encoding"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-tcpclientsrc.html#id535377"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-tcpclientsrc.html#id535400"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-tcpclientsrc.html#id530891"/>
+ <keyword type="struct" name="struct GstTCPClientSrc" link="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc-struct"/>
+ <keyword type="property" name="The &quot;host&quot; property" link="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--host"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--port"/>
+ <keyword type="property" name="The &quot;protocol&quot; property" link="gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--protocol"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-tcpclientsink.html#id530053"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-tcpclientsink.html#id530076"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-tcpclientsink.html#id530319"/>
+ <keyword type="struct" name="struct GstTCPClientSink" link="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink-struct"/>
+ <keyword type="property" name="The &quot;host&quot; property" link="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--host"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--port"/>
+ <keyword type="property" name="The &quot;protocol&quot; property" link="gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--protocol"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-tcpserversrc.html#id532197"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-tcpserversrc.html#id532220"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-tcpserversrc.html#id535478"/>
+ <keyword type="struct" name="struct GstTCPServerSrc" link="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc-struct"/>
+ <keyword type="property" name="The &quot;host&quot; property" link="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--host"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--port"/>
+ <keyword type="property" name="The &quot;protocol&quot; property" link="gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--protocol"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-tcpserversink.html#id533005"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-tcpserversink.html#id533028"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-tcpserversink.html#id487079"/>
+ <keyword type="struct" name="struct GstTCPServerSink" link="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink-struct"/>
+ <keyword type="property" name="The &quot;host&quot; property" link="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--host"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--port"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-textoverlay.html#id492124"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-textoverlay.html#id494648"/>
+ <keyword type="struct" name="struct GstTextOverlay" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay-struct"/>
+ <keyword type="property" name="The &quot;deltax&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltax"/>
+ <keyword type="property" name="The &quot;deltay&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltay"/>
+ <keyword type="property" name="The &quot;font-desc&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--font-desc"/>
+ <keyword type="property" name="The &quot;halign&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halign"/>
+ <keyword type="property" name="The &quot;shaded-background&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--shaded-background"/>
+ <keyword type="property" name="The &quot;text&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--text"/>
+ <keyword type="property" name="The &quot;valign&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valign"/>
+ <keyword type="property" name="The &quot;wrap-mode&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wrap-mode"/>
+ <keyword type="property" name="The &quot;xpad&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpad"/>
+ <keyword type="property" name="The &quot;ypad&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypad"/>
+ <keyword type="property" name="The &quot;halignment&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halignment"/>
+ <keyword type="property" name="The &quot;valignment&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valignment"/>
+ <keyword type="property" name="The &quot;line-alignment&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--line-alignment"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--silent"/>
+ <keyword type="property" name="The &quot;wait-text&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wait-text"/>
+ <keyword type="property" name="The &quot;auto-resize&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--auto-resize"/>
+ <keyword type="property" name="The &quot;vertical-render&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--vertical-render"/>
+ <keyword type="property" name="The &quot;color&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--color"/>
+ <keyword type="property" name="The &quot;xpos&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpos"/>
+ <keyword type="property" name="The &quot;ypos&quot; property" link="gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypos"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-textrender.html#id475160"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-textrender.html#id538258"/>
+ <keyword type="struct" name="struct GstTextRender" link="gst-plugins-base-plugins-textrender.html#GstTextRender-struct"/>
+ <keyword type="property" name="The &quot;font-desc&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--font-desc"/>
+ <keyword type="property" name="The &quot;halignment&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--halignment"/>
+ <keyword type="property" name="The &quot;line-alignment&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--line-alignment"/>
+ <keyword type="property" name="The &quot;valignment&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--valignment"/>
+ <keyword type="property" name="The &quot;xpad&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--xpad"/>
+ <keyword type="property" name="The &quot;ypad&quot; property" link="gst-plugins-base-plugins-textrender.html#GstTextRender--ypad"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-theoradec.html#id487813"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-theoradec.html#id536181"/>
+ <keyword type="struct" name="struct GstTheoraDec" link="gst-plugins-base-plugins-theoradec.html#GstTheoraDec-struct"/>
+ <keyword type="property" name="The &quot;crop&quot; property" link="gst-plugins-base-plugins-theoradec.html#GstTheoraDec--crop"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-theoraenc.html#id542106"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-theoraenc.html#id542168"/>
+ <keyword type="struct" name="struct GstTheoraEnc" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc-struct"/>
+ <keyword type="enum" name="enum GstTheoraEncBorderMode" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEncBorderMode"/>
+ <keyword type="property" name="The &quot;bitrate&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--bitrate"/>
+ <keyword type="property" name="The &quot;border&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--border"/>
+ <keyword type="property" name="The &quot;center&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--center"/>
+ <keyword type="property" name="The &quot;keyframe-auto&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-auto"/>
+ <keyword type="property" name="The &quot;keyframe-force&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-force"/>
+ <keyword type="property" name="The &quot;keyframe-freq&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-freq"/>
+ <keyword type="property" name="The &quot;keyframe-mindistance&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-mindistance"/>
+ <keyword type="property" name="The &quot;keyframe-threshold&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-threshold"/>
+ <keyword type="property" name="The &quot;noise-sensitivity&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--noise-sensitivity"/>
+ <keyword type="property" name="The &quot;quality&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quality"/>
+ <keyword type="property" name="The &quot;quick&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quick"/>
+ <keyword type="property" name="The &quot;sharpness&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--sharpness"/>
+ <keyword type="property" name="The &quot;speed-level&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--speed-level"/>
+ <keyword type="property" name="The &quot;cap-overflow&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-overflow"/>
+ <keyword type="property" name="The &quot;cap-underflow&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-underflow"/>
+ <keyword type="property" name="The &quot;drop-frames&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--drop-frames"/>
+ <keyword type="property" name="The &quot;rate-buffer&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--rate-buffer"/>
+ <keyword type="property" name="The &quot;vp3-compatible&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--vp3-compatible"/>
+ <keyword type="property" name="The &quot;multipass-cache-file&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-cache-file"/>
+ <keyword type="property" name="The &quot;multipass-mode&quot; property" link="gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-mode"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-theoraparse.html#id489696"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-theoraparse.html#id536676"/>
+ <keyword type="struct" name="struct GstTheoraParse" link="gst-plugins-base-plugins-theoraparse.html#GstTheoraParse-struct"/>
+ <keyword type="property" name="The &quot;synchronization-points&quot; property" link="gst-plugins-base-plugins-theoraparse.html#GstTheoraParse--synchronization-points"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-timeoverlay.html#id530207"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-timeoverlay.html#id538141"/>
+ <keyword type="struct" name="struct GstTimeOverlay" link="gst-plugins-base-plugins-timeoverlay.html#GstTimeOverlay-struct"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-uridecodebin.html#id544408"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-uridecodebin.html#id544471"/>
+ <keyword type="struct" name="struct GstURIDecodeBin" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-struct"/>
+ <keyword type="enum" name="enum GstAutoplugSelectResult" link="gst-plugins-base-plugins-uridecodebin.html#GstAutoplugSelectResult"/>
+ <keyword type="property" name="The &quot;uri&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--uri"/>
+ <keyword type="property" name="The &quot;connection-speed&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--connection-speed"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--caps"/>
+ <keyword type="property" name="The &quot;subtitle-encoding&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--subtitle-encoding"/>
+ <keyword type="property" name="The &quot;source&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--source"/>
+ <keyword type="property" name="The &quot;buffer-duration&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-duration"/>
+ <keyword type="property" name="The &quot;buffer-size&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-size"/>
+ <keyword type="property" name="The &quot;download&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--download"/>
+ <keyword type="property" name="The &quot;use-buffering&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--use-buffering"/>
+ <keyword type="property" name="The &quot;expose-all-streams&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--expose-all-streams"/>
+ <keyword type="property" name="The &quot;ring-buffer-max-size&quot; property" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--ring-buffer-max-size"/>
+ <keyword type="signal" name="The &quot;autoplug-continue&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-continue"/>
+ <keyword type="signal" name="The &quot;autoplug-factories&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-factories"/>
+ <keyword type="signal" name="The &quot;autoplug-select&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-select"/>
+ <keyword type="signal" name="The &quot;unknown-type&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-unknown-type"/>
+ <keyword type="signal" name="The &quot;drained&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-drained"/>
+ <keyword type="signal" name="The &quot;autoplug-sort&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-sort"/>
+ <keyword type="signal" name="The &quot;source-setup&quot; signal" link="gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-source-setup"/>
+ <keyword type="" name="Example pipelines" link="gst-plugins-base-plugins-videorate.html#id512718"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-videorate.html#id547163"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-videorate.html#id547225"/>
+ <keyword type="struct" name="struct GstVideoRate" link="gst-plugins-base-plugins-videorate.html#GstVideoRate-struct"/>
+ <keyword type="property" name="The &quot;drop&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop"/>
+ <keyword type="property" name="The &quot;duplicate&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--duplicate"/>
+ <keyword type="property" name="The &quot;in&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--in"/>
+ <keyword type="property" name="The &quot;new-pref&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--new-pref"/>
+ <keyword type="property" name="The &quot;out&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--out"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--silent"/>
+ <keyword type="property" name="The &quot;skip-to-first&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--skip-to-first"/>
+ <keyword type="property" name="The &quot;average-period&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--average-period"/>
+ <keyword type="property" name="The &quot;drop-only&quot; property" link="gst-plugins-base-plugins-videorate.html#GstVideoRate--drop-only"/>
+ <keyword type="" name="Example pipelines" link="gst-plugins-base-plugins-videoscale.html#id543783"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-videoscale.html#id543753"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-videoscale.html#id543694"/>
+ <keyword type="struct" name="struct GstVideoScale" link="gst-plugins-base-plugins-videoscale.html#GstVideoScale-struct"/>
+ <keyword type="enum" name="enum GstVideoScaleMethod" link="gst-plugins-base-plugins-videoscale.html#GstVideoScaleMethod"/>
+ <keyword type="property" name="The &quot;method&quot; property" link="gst-plugins-base-plugins-videoscale.html#GstVideoScale--method"/>
+ <keyword type="property" name="The &quot;add-borders&quot; property" link="gst-plugins-base-plugins-videoscale.html#GstVideoScale--add-borders"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-videotestsrc.html#id550571"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-videotestsrc.html#id550552"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-videotestsrc.html#id550478"/>
+ <keyword type="struct" name="struct GstVideoTestSrc" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc-struct"/>
+ <keyword type="enum" name="enum GstVideoTestSrcPattern" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcPattern"/>
+ <keyword type="property" name="The &quot;pattern&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--pattern"/>
+ <keyword type="property" name="The &quot;timestamp-offset&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--timestamp-offset"/>
+ <keyword type="property" name="The &quot;is-live&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--is-live"/>
+ <keyword type="property" name="The &quot;peer-alloc&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--peer-alloc"/>
+ <keyword type="property" name="The &quot;colorspec&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--colorspec"/>
+ <keyword type="property" name="The &quot;k0&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--k0"/>
+ <keyword type="property" name="The &quot;kt&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt"/>
+ <keyword type="property" name="The &quot;kt2&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt2"/>
+ <keyword type="property" name="The &quot;kx&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx"/>
+ <keyword type="property" name="The &quot;kx2&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx2"/>
+ <keyword type="property" name="The &quot;kxt&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxt"/>
+ <keyword type="property" name="The &quot;kxy&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxy"/>
+ <keyword type="property" name="The &quot;ky&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky"/>
+ <keyword type="property" name="The &quot;ky2&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky2"/>
+ <keyword type="property" name="The &quot;kyt&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kyt"/>
+ <keyword type="property" name="The &quot;xoffset&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--xoffset"/>
+ <keyword type="property" name="The &quot;yoffset&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--yoffset"/>
+ <keyword type="property" name="The &quot;background-color&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--background-color"/>
+ <keyword type="property" name="The &quot;foreground-color&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--foreground-color"/>
+ <keyword type="property" name="The &quot;horizontal-speed&quot; property" link="gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--horizontal-speed"/>
+ <keyword type="" name="Example launch line" link="gst-plugins-base-plugins-volume.html#id523359"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-volume.html#id499668"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-volume.html#id496503"/>
+ <keyword type="struct" name="struct GstVolume" link="gst-plugins-base-plugins-volume.html#GstVolume-struct"/>
+ <keyword type="property" name="The &quot;mute&quot; property" link="gst-plugins-base-plugins-volume.html#GstVolume--mute"/>
+ <keyword type="property" name="The &quot;volume&quot; property" link="gst-plugins-base-plugins-volume.html#GstVolume--volume"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-vorbisdec.html#id487196"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-vorbisdec.html#id506258"/>
+ <keyword type="struct" name="struct GstVorbisDec" link="gst-plugins-base-plugins-vorbisdec.html#GstVorbisDec-struct"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-vorbisenc.html#id548991"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-vorbisenc.html#id552484"/>
+ <keyword type="struct" name="struct GstVorbisEnc" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc-struct"/>
+ <keyword type="property" name="The &quot;bitrate&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--bitrate"/>
+ <keyword type="property" name="The &quot;last-message&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--last-message"/>
+ <keyword type="property" name="The &quot;managed&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--managed"/>
+ <keyword type="property" name="The &quot;max-bitrate&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--max-bitrate"/>
+ <keyword type="property" name="The &quot;min-bitrate&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--min-bitrate"/>
+ <keyword type="property" name="The &quot;quality&quot; property" link="gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--quality"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-vorbisparse.html#id511403"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-vorbisparse.html#id473624"/>
+ <keyword type="struct" name="struct GstVorbisParse" link="gst-plugins-base-plugins-vorbisparse.html#GstVorbisParse-struct"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-vorbistag.html#id476646"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-vorbistag.html#id551251"/>
+ <keyword type="struct" name="struct GstVorbisTag" link="gst-plugins-base-plugins-vorbistag.html#GstVorbisTag-struct"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-ximagesink.html#id554711"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-ximagesink.html#id554773"/>
+ <keyword type="struct" name="struct GstXImageSink" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink-struct"/>
+ <keyword type="property" name="The &quot;display&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--display"/>
+ <keyword type="property" name="The &quot;pixel-aspect-ratio&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--pixel-aspect-ratio"/>
+ <keyword type="property" name="The &quot;synchronous&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--synchronous"/>
+ <keyword type="property" name="The &quot;force-aspect-ratio&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--force-aspect-ratio"/>
+ <keyword type="property" name="The &quot;handle-events&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-events"/>
+ <keyword type="property" name="The &quot;handle-expose&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-expose"/>
+ <keyword type="property" name="The &quot;window-height&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-height"/>
+ <keyword type="property" name="The &quot;window-width&quot; property" link="gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-width"/>
+ <keyword type="" name="Element Information" link="gst-plugins-base-plugins-xvimagesink.html#id557132"/>
+ <keyword type="" name="Element Pads" link="gst-plugins-base-plugins-xvimagesink.html#id557194"/>
+ <keyword type="struct" name="struct GstXvImageSink" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink-struct"/>
+ <keyword type="property" name="The &quot;brightness&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--brightness"/>
+ <keyword type="property" name="The &quot;contrast&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--contrast"/>
+ <keyword type="property" name="The &quot;display&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--display"/>
+ <keyword type="property" name="The &quot;hue&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--hue"/>
+ <keyword type="property" name="The &quot;pixel-aspect-ratio&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--pixel-aspect-ratio"/>
+ <keyword type="property" name="The &quot;saturation&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--saturation"/>
+ <keyword type="property" name="The &quot;synchronous&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--synchronous"/>
+ <keyword type="property" name="The &quot;force-aspect-ratio&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--force-aspect-ratio"/>
+ <keyword type="property" name="The &quot;device&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device"/>
+ <keyword type="property" name="The &quot;device-name&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device-name"/>
+ <keyword type="property" name="The &quot;handle-events&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-events"/>
+ <keyword type="property" name="The &quot;double-buffer&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--double-buffer"/>
+ <keyword type="property" name="The &quot;handle-expose&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-expose"/>
+ <keyword type="property" name="The &quot;autopaint-colorkey&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--autopaint-colorkey"/>
+ <keyword type="property" name="The &quot;colorkey&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--colorkey"/>
+ <keyword type="property" name="The &quot;draw-borders&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--draw-borders"/>
+ <keyword type="property" name="The &quot;window-height&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-height"/>
+ <keyword type="property" name="The &quot;window-width&quot; property" link="gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-width"/>
+ <keyword type="constant" name="DITHER_NONE" link="gst-plugins-base-plugins-audioconvert.html#DITHER-NONE:CAPS"/>
+ <keyword type="constant" name="DITHER_RPDF" link="gst-plugins-base-plugins-audioconvert.html#DITHER-RPDF:CAPS"/>
+ <keyword type="constant" name="DITHER_TPDF" link="gst-plugins-base-plugins-audioconvert.html#DITHER-TPDF:CAPS"/>
+ <keyword type="constant" name="DITHER_TPDF_HF" link="gst-plugins-base-plugins-audioconvert.html#DITHER-TPDF-HF:CAPS"/>
+ <keyword type="constant" name="NOISE_SHAPING_NONE" link="gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-NONE:CAPS"/>
+ <keyword type="constant" name="NOISE_SHAPING_ERROR_FEEDBACK" link="gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-ERROR-FEEDBACK:CAPS"/>
+ <keyword type="constant" name="NOISE_SHAPING_SIMPLE" link="gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-SIMPLE:CAPS"/>
+ <keyword type="constant" name="NOISE_SHAPING_MEDIUM" link="gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-MEDIUM:CAPS"/>
+ <keyword type="constant" name="NOISE_SHAPING_HIGH" link="gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-HIGH:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_SINE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SINE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_SQUARE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SQUARE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_SAW" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SAW:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_TRIANGLE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-TRIANGLE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_SILENCE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SILENCE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-WHITE-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-PINK-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_SINE_TAB" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SINE-TAB:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_TICKS" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-TICKS:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-GAUSSIAN-WHITE-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_RED_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-RED-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-BLUE-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE" link="gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-VIOLET-NOISE:CAPS"/>
+ <keyword type="constant" name="GST_RECOVER_POLICY_NONE" link="gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-NONE:CAPS"/>
+ <keyword type="constant" name="GST_RECOVER_POLICY_RESYNC_LATEST" link="gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-LATEST:CAPS"/>
+ <keyword type="constant" name="GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT" link="gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-SOFT-LIMIT:CAPS"/>
+ <keyword type="constant" name="GST_RECOVER_POLICY_RESYNC_KEYFRAME" link="gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-KEYFRAME:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_LATEST" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-LATEST:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_NEXT_KEYFRAME" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-NEXT-KEYFRAME:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_LATEST_KEYFRAME" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-LATEST-KEYFRAME:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_BURST" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_BURST_KEYFRAME" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST-KEYFRAME:CAPS"/>
+ <keyword type="constant" name="GST_SYNC_METHOD_BURST_WITH_KEYFRAME" link="gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST-WITH-KEYFRAME:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_OK" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-OK:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_CLOSED" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-CLOSED:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_REMOVED" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-REMOVED:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_SLOW" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-SLOW:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_ERROR" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_DUPLICATE" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-DUPLICATE:CAPS"/>
+ <keyword type="constant" name="GST_CLIENT_STATUS_FLUSHING" link="gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-FLUSHING:CAPS"/>
+ <keyword type="constant" name="GST_TCP_UNIT_TYPE_UNDEFINED" link="gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-UNDEFINED:CAPS"/>
+ <keyword type="constant" name="GST_TCP_UNIT_TYPE_BUFFERS" link="gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-BUFFERS:CAPS"/>
+ <keyword type="constant" name="GST_TCP_UNIT_TYPE_TIME" link="gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-TIME:CAPS"/>
+ <keyword type="constant" name="GST_TCP_UNIT_TYPE_BYTES" link="gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-BYTES:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_VIDEO" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-VIDEO:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_AUDIO" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-AUDIO:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_TEXT" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-TEXT:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_VIS" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-VIS:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_SOFT_VOLUME" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-SOFT-VOLUME:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_NATIVE_AUDIO" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-NATIVE-AUDIO:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_NATIVE_VIDEO" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-NATIVE-VIDEO:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_DOWNLOAD" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-DOWNLOAD:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_BUFFERING" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-BUFFERING:CAPS"/>
+ <keyword type="constant" name="GST_PLAY_FLAG_DEINTERLACE" link="gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-DEINTERLACE:CAPS"/>
+ <keyword type="constant" name="GST_AUTOPLUG_SELECT_TRY" link="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-TRY:CAPS"/>
+ <keyword type="constant" name="GST_AUTOPLUG_SELECT_EXPOSE" link="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-EXPOSE:CAPS"/>
+ <keyword type="constant" name="GST_AUTOPLUG_SELECT_SKIP" link="gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-SKIP:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_SCALE_NEAREST" link="gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-NEAREST:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_SCALE_BILINEAR" link="gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-BILINEAR:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_SCALE_4TAP" link="gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-4TAP:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_SCALE_LANCZOS" link="gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-LANCZOS:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_SMPTE" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_SNOW" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SNOW:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_BLACK" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLACK:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_WHITE" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-WHITE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_RED" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-RED:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_GREEN" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-GREEN:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_BLUE" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLUE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CHECKERS1" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS1:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CHECKERS2" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS2:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CHECKERS4" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS4:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CHECKERS8" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS8:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CIRCULAR" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CIRCULAR:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_BLINK" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLINK:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_SMPTE75" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE75:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_ZONE_PLATE" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-ZONE-PLATE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_GAMUT" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-GAMUT:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHROMA-ZONE-PLATE:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_SOLID" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SOLID:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_BALL" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BALL:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_SMPTE100" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE100:CAPS"/>
+ <keyword type="constant" name="GST_VIDEO_TEST_SRC_BAR" link="gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BAR:CAPS"/>
+ </functions>
+</book>
diff --git a/docs/plugins/html/home.png b/docs/plugins/html/home.png
new file mode 100644
index 0000000..1700361
--- /dev/null
+++ b/docs/plugins/html/home.png
Binary files differ
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
new file mode 100644
index 0000000..2acc032
--- /dev/null
+++ b/docs/plugins/html/index.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GStreamer Base Plugins 0.11 Plugins Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Base Plugins 0.11 Plugins Reference Manual">
+<link rel="next" href="ch01.html" title="gst-plugins-base Elements">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Base Plugins 0.11 Plugins Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+ for GStreamer Base Plugins 0.11 (0.11.1)
+ The latest version of this documentation can be found on-line at
+ <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/</a>.
+ </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="ch01.html">gst-plugins-base Elements</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-adder.html">adder</a></span><span class="refpurpose"> — Add N audio channels together</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-appsrc.html">appsrc</a></span><span class="refpurpose"> — Allow the application to feed buffers to a pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-appsink.html">appsink</a></span><span class="refpurpose"> — Allow the application to get access to raw buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsamixer.html">alsamixer</a></span><span class="refpurpose"> — Control sound input and output levels with ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsasink.html">alsasink</a></span><span class="refpurpose"> — Output to a sound card via ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-alsasrc.html">alsasrc</a></span><span class="refpurpose"> — Read from a sound card via ALSA</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audioconvert.html">audioconvert</a></span><span class="refpurpose"> — Convert audio to different formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audiorate.html">audiorate</a></span><span class="refpurpose"> — Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audioresample.html">audioresample</a></span><span class="refpurpose"> — Resamples audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-audiotestsrc.html">audiotestsrc</a></span><span class="refpurpose"> — Creates audio test signals of given frequency and volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-cdparanoiasrc.html">cdparanoiasrc</a></span><span class="refpurpose"> — Read audio from CD in paranoid mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-clockoverlay.html">clockoverlay</a></span><span class="refpurpose"> — Overlays the current clock time on a video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-decodebin.html">decodebin</a></span><span class="refpurpose"> — Autoplug and decode to raw media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-encodebin.html">encodebin</a></span><span class="refpurpose"> — Convenience encoding/muxing element</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videoconvert.html">videoconvert</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-gdpdepay.html">gdpdepay</a></span><span class="refpurpose"> — Depayloads GStreamer Data Protocol buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-gdppay.html">gdppay</a></span><span class="refpurpose"> — Payloads GStreamer Data Protocol buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giosink.html">giosink</a></span><span class="refpurpose"> — Write to any GIO-supported location</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giosrc.html">giosrc</a></span><span class="refpurpose"> — Read from any GIO-supported location</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giostreamsink.html">giostreamsink</a></span><span class="refpurpose"> — Write to any GIO stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-giostreamsrc.html">giostreamsrc</a></span><span class="refpurpose"> — Read from any GIO stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-multifdsink.html">multifdsink</a></span><span class="refpurpose"> — Send data to multiple filedescriptors</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-oggdemux.html">oggdemux</a></span><span class="refpurpose"> — demux ogg streams (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-oggmux.html">oggmux</a></span><span class="refpurpose"> — mux ogg streams (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-playbin.html">playbin</a></span><span class="refpurpose"> — Autoplug and play media from an uri</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-subtitleoverlay.html">subtitleoverlay</a></span><span class="refpurpose"> — Overlays a video stream with subtitles</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpclientsrc.html">tcpclientsrc</a></span><span class="refpurpose"> — Receive data as a client over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpclientsink.html">tcpclientsink</a></span><span class="refpurpose"> — Send data as a client over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpserversrc.html">tcpserversrc</a></span><span class="refpurpose"> — Receive data as a server over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-tcpserversink.html">tcpserversink</a></span><span class="refpurpose"> — Send data as a server over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-textoverlay.html">textoverlay</a></span><span class="refpurpose"> — Adds text strings on top of a video buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-textrender.html">textrender</a></span><span class="refpurpose"> — Renders a text string to an image bitmap</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoradec.html">theoradec</a></span><span class="refpurpose"> — decode raw theora streams to raw YUV video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoraenc.html">theoraenc</a></span><span class="refpurpose"> — encode raw YUV video to a theora stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-theoraparse.html">theoraparse</a></span><span class="refpurpose"> — parse raw theora streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-timeoverlay.html">timeoverlay</a></span><span class="refpurpose"> — Overlays buffer time stamps on a video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-uridecodebin.html">uridecodebin</a></span><span class="refpurpose"> — Autoplug and decode an URI to raw media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videorate.html">videorate</a></span><span class="refpurpose"> — Drops/duplicates/adjusts timestamps on video frames to make a perfect stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videoscale.html">videoscale</a></span><span class="refpurpose"> — Resizes video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-videotestsrc.html">videotestsrc</a></span><span class="refpurpose"> — Creates a test video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-volume.html">volume</a></span><span class="refpurpose"> — Set volume on audio/raw streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisdec.html">vorbisdec</a></span><span class="refpurpose"> — decode raw vorbis streams to float audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisenc.html">vorbisenc</a></span><span class="refpurpose"> — Encodes audio in Vorbis format</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbisparse.html">vorbisparse</a></span><span class="refpurpose"> — parse raw vorbis streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-vorbistag.html">vorbistag</a></span><span class="refpurpose"> — Retags vorbis streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-ximagesink.html">ximagesink</a></span><span class="refpurpose"> — A standard X based videosink</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-xvimagesink.html">xvimagesink</a></span><span class="refpurpose"> — A Xv based videosink</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch02.html">gst-plugins-base Plugins</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-adder.html">adder</a></span><span class="refpurpose"> — <a name="plugin-adder"></a>Adds multiple streams</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-alsa.html">alsa</a></span><span class="refpurpose"> — <a name="plugin-alsa"></a>ALSA plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-app.html">app</a></span><span class="refpurpose"> — <a name="plugin-app"></a>Elements used to communicate with applications</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audioconvert.html">audioconvert</a></span><span class="refpurpose"> — <a name="plugin-audioconvert"></a>Convert audio to different formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audiorate.html">audiorate</a></span><span class="refpurpose"> — <a name="plugin-audiorate"></a>Adjusts audio frames</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audioresample.html">audioresample</a></span><span class="refpurpose"> — <a name="plugin-audioresample"></a>Resamples audio</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-audiotestsrc.html">audiotestsrc</a></span><span class="refpurpose"> — <a name="plugin-audiotestsrc"></a>Creates audio test signals of given frequency and volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-cdparanoia.html">cdparanoia</a></span><span class="refpurpose"> — <a name="plugin-cdparanoia"></a>Read audio from CD in paranoid mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-decodebin.html">decodebin</a></span><span class="refpurpose"> — <a name="plugin-decodebin"></a>decoder bin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-encoding.html">encoding</a></span><span class="refpurpose"> — <a name="plugin-encoding"></a>various encoding-related elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-gdp.html">gdp</a></span><span class="refpurpose"> — <a name="plugin-gdp"></a>Payload/depayload GDP packets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-gio.html">gio</a></span><span class="refpurpose"> — <a name="plugin-gio"></a>GIO elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-libvisual.html">libvisual</a></span><span class="refpurpose"> — <a name="plugin-libvisual"></a>libvisual visualization plugins</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-ogg.html">ogg</a></span><span class="refpurpose"> — <a name="plugin-ogg"></a>ogg stream manipulation (info about ogg: http://xiph.org)</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-pango.html">pango</a></span><span class="refpurpose"> — <a name="plugin-pango"></a>Pango-based text rendering and overlay</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-playback.html">playback</a></span><span class="refpurpose"> — <a name="plugin-playback"></a>various playback elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-subparse.html">subparse</a></span><span class="refpurpose"> — <a name="plugin-subparse"></a>Subtitle parsing</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-tcp.html">tcp</a></span><span class="refpurpose"> — <a name="plugin-tcp"></a>transfer data over the network via TCP</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-theora.html">theora</a></span><span class="refpurpose"> — <a name="plugin-theora"></a>Theora plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-typefindfunctions.html">typefindfunctions</a></span><span class="refpurpose"> — <a name="plugin-typefindfunctions"></a>default typefind functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-uridecodebin.html">uridecodebin</a></span><span class="refpurpose"> — <a name="plugin-uridecodebin"></a>URI Decoder bin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videorate.html">videorate</a></span><span class="refpurpose"> — <a name="plugin-videorate"></a>Adjusts video frames</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videoscale.html">videoscale</a></span><span class="refpurpose"> — <a name="plugin-videoscale"></a>Resizes video</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-videotestsrc.html">videotestsrc</a></span><span class="refpurpose"> — <a name="plugin-videotestsrc"></a>Creates a test video stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-volume.html">volume</a></span><span class="refpurpose"> — <a name="plugin-volume"></a>plugin for controlling audio volume</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-vorbis.html">vorbis</a></span><span class="refpurpose"> — <a name="plugin-vorbis"></a>Vorbis plugin library</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-ximagesink.html">ximagesink</a></span><span class="refpurpose"> — <a name="plugin-ximagesink"></a>X11 video output element based on standard Xlib calls</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-base-plugins-plugin-xvimagesink.html">xvimagesink</a></span><span class="refpurpose"> — <a name="plugin-xvimagesink"></a>XFree86 video output plugin using Xv extension</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch03.html">gst-plugins-base Classes</a></span></dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ 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..133c406
--- /dev/null
+++ b/docs/plugins/html/index.sgml
@@ -0,0 +1,871 @@
+<ONLINE href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base/html/">
+<ANCHOR id="gst-plugins-base-plugins-adder" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html">
+<ANCHOR id="gst-plugins-base-plugins-adder.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.synopsis">
+<ANCHOR id="GstAdder" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#GstAdder">
+<ANCHOR id="gst-plugins-base-plugins-adder.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-adder.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.properties">
+<ANCHOR id="gst-plugins-base-plugins-adder.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.description">
+<ANCHOR id="gst-plugins-base-plugins-adder.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.details">
+<ANCHOR id="GstAdder-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#GstAdder-struct">
+<ANCHOR id="gst-plugins-base-plugins-adder.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#gst-plugins-base-plugins-adder.property-details">
+<ANCHOR id="GstAdder--caps" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-adder.html#GstAdder--caps">
+<ANCHOR id="gst-plugins-base-plugins-appsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.synopsis">
+<ANCHOR id="GstAppSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.signals">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.description">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.details">
+<ANCHOR id="GstAppSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.property-details">
+<ANCHOR id="GstAppSrc--block" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--block">
+<ANCHOR id="GstAppSrc--caps" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--caps">
+<ANCHOR id="GstAppSrc--format" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--format">
+<ANCHOR id="GstAppSrc--is-live" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--is-live">
+<ANCHOR id="GstAppSrc--max-bytes" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-bytes">
+<ANCHOR id="GstAppSrc--max-latency" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--max-latency">
+<ANCHOR id="GstAppSrc--min-latency" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-latency">
+<ANCHOR id="GstAppSrc--size" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--size">
+<ANCHOR id="GstAppSrc--stream-type" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--stream-type">
+<ANCHOR id="GstAppSrc--emit-signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--emit-signals">
+<ANCHOR id="GstAppSrc--min-percent" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc--min-percent">
+<ANCHOR id="gst-plugins-base-plugins-appsrc.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#gst-plugins-base-plugins-appsrc.signal-details">
+<ANCHOR id="GstAppSrc-end-of-stream" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-end-of-stream">
+<ANCHOR id="GstAppSrc-enough-data" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-enough-data">
+<ANCHOR id="GstAppSrc-need-data" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-need-data">
+<ANCHOR id="GstAppSrc-push-buffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-push-buffer">
+<ANCHOR id="GstAppSrc-seek-data" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsrc.html#GstAppSrc-seek-data">
+<ANCHOR id="gst-plugins-base-plugins-appsink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html">
+<ANCHOR id="gst-plugins-base-plugins-appsink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.synopsis">
+<ANCHOR id="GstAppSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink">
+<ANCHOR id="gst-plugins-base-plugins-appsink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-appsink.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-appsink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.properties">
+<ANCHOR id="gst-plugins-base-plugins-appsink.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.signals">
+<ANCHOR id="gst-plugins-base-plugins-appsink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.description">
+<ANCHOR id="gst-plugins-base-plugins-appsink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.details">
+<ANCHOR id="GstAppSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-appsink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.property-details">
+<ANCHOR id="GstAppSink--caps" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink--caps">
+<ANCHOR id="GstAppSink--drop" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink--drop">
+<ANCHOR id="GstAppSink--emit-signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink--emit-signals">
+<ANCHOR id="GstAppSink--eos" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink--eos">
+<ANCHOR id="GstAppSink--max-buffers" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink--max-buffers">
+<ANCHOR id="gst-plugins-base-plugins-appsink.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#gst-plugins-base-plugins-appsink.signal-details">
+<ANCHOR id="GstAppSink-eos" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-eos">
+<ANCHOR id="GstAppSink-new-buffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer">
+<ANCHOR id="GstAppSink-new-preroll" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-new-preroll">
+<ANCHOR id="GstAppSink-pull-buffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer">
+<ANCHOR id="GstAppSink-pull-preroll" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-pull-preroll">
+<ANCHOR id="GstAppSink-new-buffer-list" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-new-buffer-list">
+<ANCHOR id="GstAppSink-pull-buffer-list" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-appsink.html#GstAppSink-pull-buffer-list">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.synopsis">
+<ANCHOR id="GstAlsaMixerElement" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.properties">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.description">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.details">
+<ANCHOR id="GstAlsaMixerElement-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement-struct">
+<ANCHOR id="gst-plugins-base-plugins-alsamixer.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#gst-plugins-base-plugins-alsamixer.property-details">
+<ANCHOR id="GstAlsaMixerElement--device" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device">
+<ANCHOR id="GstAlsaMixerElement--device-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsamixer.html#GstAlsaMixerElement--device-name">
+<ANCHOR id="gst-plugins-base-plugins-alsasink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.synopsis">
+<ANCHOR id="GstAlsaSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#GstAlsaSink">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.properties">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.description">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.details">
+<ANCHOR id="GstAlsaSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#GstAlsaSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-alsasink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#gst-plugins-base-plugins-alsasink.property-details">
+<ANCHOR id="GstAlsaSink--device" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device">
+<ANCHOR id="GstAlsaSink--device-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#GstAlsaSink--device-name">
+<ANCHOR id="GstAlsaSink--card-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasink.html#GstAlsaSink--card-name">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.synopsis">
+<ANCHOR id="GstAlsaSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.description">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.details">
+<ANCHOR id="GstAlsaSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-alsasrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#gst-plugins-base-plugins-alsasrc.property-details">
+<ANCHOR id="GstAlsaSrc--device" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device">
+<ANCHOR id="GstAlsaSrc--device-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--device-name">
+<ANCHOR id="GstAlsaSrc--card-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-alsasrc.html#GstAlsaSrc--card-name">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.synopsis">
+<ANCHOR id="GstAudioConvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvert">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.properties">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.description">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.details">
+<ANCHOR id="GstAudioConvert-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvert-struct">
+<ANCHOR id="GstAudioConvertDithering" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvertDithering">
+<ANCHOR id="DITHER-NONE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#DITHER-NONE:CAPS">
+<ANCHOR id="DITHER-RPDF:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#DITHER-RPDF:CAPS">
+<ANCHOR id="DITHER-TPDF:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#DITHER-TPDF:CAPS">
+<ANCHOR id="DITHER-TPDF-HF:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#DITHER-TPDF-HF:CAPS">
+<ANCHOR id="GstAudioConvertNoiseShaping" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvertNoiseShaping">
+<ANCHOR id="NOISE-SHAPING-NONE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-NONE:CAPS">
+<ANCHOR id="NOISE-SHAPING-ERROR-FEEDBACK:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-ERROR-FEEDBACK:CAPS">
+<ANCHOR id="NOISE-SHAPING-SIMPLE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-SIMPLE:CAPS">
+<ANCHOR id="NOISE-SHAPING-MEDIUM:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-MEDIUM:CAPS">
+<ANCHOR id="NOISE-SHAPING-HIGH:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#NOISE-SHAPING-HIGH:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-audioconvert.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#gst-plugins-base-plugins-audioconvert.property-details">
+<ANCHOR id="GstAudioConvert--dithering" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--dithering">
+<ANCHOR id="GstAudioConvert--noise-shaping" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioconvert.html#GstAudioConvert--noise-shaping">
+<ANCHOR id="gst-plugins-base-plugins-audiorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.synopsis">
+<ANCHOR id="GstAudioRate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.properties">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.description">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.details">
+<ANCHOR id="GstAudioRate-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate-struct">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.property-details">
+<ANCHOR id="GstAudioRate--add" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--add">
+<ANCHOR id="GstAudioRate--drop" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--drop">
+<ANCHOR id="GstAudioRate--in" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--in">
+<ANCHOR id="GstAudioRate--out" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--out">
+<ANCHOR id="GstAudioRate--silent" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--silent">
+<ANCHOR id="GstAudioRate--tolerance" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--tolerance">
+<ANCHOR id="GstAudioRate--skip-to-first" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#GstAudioRate--skip-to-first">
+<ANCHOR id="gst-plugins-base-plugins-audiorate.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiorate.html#gst-plugins-base-plugins-audiorate.see-also">
+<ANCHOR id="gst-plugins-base-plugins-audioresample" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.synopsis">
+<ANCHOR id="GstAudioResample" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#GstAudioResample">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.properties">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.description">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.details">
+<ANCHOR id="GstAudioResample-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#GstAudioResample-struct">
+<ANCHOR id="gst-plugins-base-plugins-audioresample.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#gst-plugins-base-plugins-audioresample.property-details">
+<ANCHOR id="GstAudioResample--filter-length" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#GstAudioResample--filter-length">
+<ANCHOR id="GstAudioResample--quality" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audioresample.html#GstAudioResample--quality">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.synopsis">
+<ANCHOR id="GstAudioTestSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.description">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.details">
+<ANCHOR id="GstAudioTestSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc-struct">
+<ANCHOR id="GstAudioTestSrcWave" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrcWave">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-SINE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SINE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-SQUARE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SQUARE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-SAW:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SAW:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-TRIANGLE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-TRIANGLE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-SILENCE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SILENCE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-WHITE-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-WHITE-NOISE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-PINK-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-PINK-NOISE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-SINE-TAB:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-SINE-TAB:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-TICKS:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-TICKS:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-GAUSSIAN-WHITE-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-GAUSSIAN-WHITE-NOISE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-RED-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-RED-NOISE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-BLUE-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-BLUE-NOISE:CAPS">
+<ANCHOR id="GST-AUDIO-TEST-SRC-WAVE-VIOLET-NOISE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GST-AUDIO-TEST-SRC-WAVE-VIOLET-NOISE:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-audiotestsrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#gst-plugins-base-plugins-audiotestsrc.property-details">
+<ANCHOR id="GstAudioTestSrc--freq" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--freq">
+<ANCHOR id="GstAudioTestSrc--is-live" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--is-live">
+<ANCHOR id="GstAudioTestSrc--samplesperbuffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--samplesperbuffer">
+<ANCHOR id="GstAudioTestSrc--timestamp-offset" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--timestamp-offset">
+<ANCHOR id="GstAudioTestSrc--volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--volume">
+<ANCHOR id="GstAudioTestSrc--wave" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--wave">
+<ANCHOR id="GstAudioTestSrc--can-activate-pull" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-pull">
+<ANCHOR id="GstAudioTestSrc--can-activate-push" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-audiotestsrc.html#GstAudioTestSrc--can-activate-push">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.synopsis">
+<ANCHOR id="GstCdParanoiaSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.signals">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.description">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.details">
+<ANCHOR id="GstCdParanoiaSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.property-details">
+<ANCHOR id="GstCdParanoiaSrc--generic-device" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--generic-device">
+<ANCHOR id="GstCdParanoiaSrc--paranoia-mode" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--paranoia-mode">
+<ANCHOR id="GstCdParanoiaSrc--read-speed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--read-speed">
+<ANCHOR id="GstCdParanoiaSrc--search-overlap" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--search-overlap">
+<ANCHOR id="GstCdParanoiaSrc--cache-size" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc--cache-size">
+<ANCHOR id="gst-plugins-base-plugins-cdparanoiasrc.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#gst-plugins-base-plugins-cdparanoiasrc.signal-details">
+<ANCHOR id="GstCdParanoiaSrc-transport-error" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-transport-error">
+<ANCHOR id="GstCdParanoiaSrc-uncorrected-error" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-cdparanoiasrc.html#GstCdParanoiaSrc-uncorrected-error">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.synopsis">
+<ANCHOR id="GstClockOverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.properties">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.description">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.details">
+<ANCHOR id="GstClockOverlay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay-struct">
+<ANCHOR id="gst-plugins-base-plugins-clockoverlay.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#gst-plugins-base-plugins-clockoverlay.property-details">
+<ANCHOR id="GstClockOverlay--time-format" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-clockoverlay.html#GstClockOverlay--time-format">
+<ANCHOR id="gst-plugins-base-plugins-decodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.synopsis">
+<ANCHOR id="GstDecodeBin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.properties">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.signals">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.description">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.details">
+<ANCHOR id="GstDecodeBin-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin-struct">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.property-details">
+<ANCHOR id="GstDecodeBin--threaded" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin--threaded">
+<ANCHOR id="GstDecodeBin--sink-caps" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin--sink-caps">
+<ANCHOR id="gst-plugins-base-plugins-decodebin.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#gst-plugins-base-plugins-decodebin.signal-details">
+<ANCHOR id="GstDecodeBin-new-decoded-pad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin-new-decoded-pad">
+<ANCHOR id="GstDecodeBin-removed-decoded-pad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin-removed-decoded-pad">
+<ANCHOR id="GstDecodeBin-unknown-type" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-decodebin.html#GstDecodeBin-unknown-type">
+<ANCHOR id="gst-plugins-base-plugins-encodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.synopsis">
+<ANCHOR id="GstEncodeBin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.properties">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.signals">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.description">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.details">
+<ANCHOR id="GstEncodeBin-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin-struct">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.property-details">
+<ANCHOR id="GstEncodeBin--audio-jitter-tolerance" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--audio-jitter-tolerance">
+<ANCHOR id="GstEncodeBin--avoid-reencoding" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--avoid-reencoding">
+<ANCHOR id="GstEncodeBin--profile" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--profile">
+<ANCHOR id="GstEncodeBin--queue-buffers-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-buffers-max">
+<ANCHOR id="GstEncodeBin--queue-bytes-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-bytes-max">
+<ANCHOR id="GstEncodeBin--queue-time-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin--queue-time-max">
+<ANCHOR id="gst-plugins-base-plugins-encodebin.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#gst-plugins-base-plugins-encodebin.signal-details">
+<ANCHOR id="GstEncodeBin-request-pad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-encodebin.html#GstEncodeBin-request-pad">
+<ANCHOR id="gst-plugins-base-plugins-videoconvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoconvert.html">
+<ANCHOR id="gst-plugins-base-plugins-videoconvert.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoconvert.html#gst-plugins-base-plugins-videoconvert.synopsis">
+<ANCHOR id="gst-plugins-base-plugins-videoconvert.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoconvert.html#gst-plugins-base-plugins-videoconvert.description">
+<ANCHOR id="gst-plugins-base-plugins-videoconvert.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoconvert.html#gst-plugins-base-plugins-videoconvert.details">
+<ANCHOR id="GstVideoConvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoconvert.html#GstVideoConvert">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#gst-plugins-base-plugins-gdpdepay.synopsis">
+<ANCHOR id="GstGDPDepay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#GstGDPDepay">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#gst-plugins-base-plugins-gdpdepay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#gst-plugins-base-plugins-gdpdepay.description">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#gst-plugins-base-plugins-gdpdepay.details">
+<ANCHOR id="GstGDPDepay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#GstGDPDepay-struct">
+<ANCHOR id="gst-plugins-base-plugins-gdpdepay.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdpdepay.html#gst-plugins-base-plugins-gdpdepay.see-also">
+<ANCHOR id="gst-plugins-base-plugins-gdppay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.synopsis">
+<ANCHOR id="GstGDPPay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#GstGDPPay">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.properties">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.description">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.details">
+<ANCHOR id="GstGDPPay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#GstGDPPay-struct">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.property-details">
+<ANCHOR id="GstGDPPay--crc-header" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-header">
+<ANCHOR id="GstGDPPay--crc-payload" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#GstGDPPay--crc-payload">
+<ANCHOR id="GstGDPPay--version" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#GstGDPPay--version">
+<ANCHOR id="gst-plugins-base-plugins-gdppay.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-gdppay.html#gst-plugins-base-plugins-gdppay.see-also">
+<ANCHOR id="gst-plugins-base-plugins-giosink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html">
+<ANCHOR id="gst-plugins-base-plugins-giosink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.synopsis">
+<ANCHOR id="GstGioSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#GstGioSink">
+<ANCHOR id="gst-plugins-base-plugins-giosink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-giosink.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-giosink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.properties">
+<ANCHOR id="gst-plugins-base-plugins-giosink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.description">
+<ANCHOR id="gst-plugins-base-plugins-giosink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.details">
+<ANCHOR id="GstGioSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#GstGioSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-giosink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#gst-plugins-base-plugins-giosink.property-details">
+<ANCHOR id="GstGioSink--location" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#GstGioSink--location">
+<ANCHOR id="GstGioSink--file" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosink.html#GstGioSink--file">
+<ANCHOR id="gst-plugins-base-plugins-giosrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.synopsis">
+<ANCHOR id="GstGioSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#GstGioSrc">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.description">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.details">
+<ANCHOR id="GstGioSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#GstGioSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-giosrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#gst-plugins-base-plugins-giosrc.property-details">
+<ANCHOR id="GstGioSrc--location" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#GstGioSrc--location">
+<ANCHOR id="GstGioSrc--file" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giosrc.html#GstGioSrc--file">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.synopsis">
+<ANCHOR id="GstGioStreamSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.properties">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.description">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.details">
+<ANCHOR id="GstGioStreamSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#gst-plugins-base-plugins-giostreamsink.property-details">
+<ANCHOR id="GstGioStreamSink--stream" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsink.html#GstGioStreamSink--stream">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.synopsis">
+<ANCHOR id="GstGioStreamSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.description">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.details">
+<ANCHOR id="GstGioStreamSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-giostreamsrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#gst-plugins-base-plugins-giostreamsrc.property-details">
+<ANCHOR id="GstGioStreamSrc--stream" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-giostreamsrc.html#GstGioStreamSrc--stream">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.synopsis">
+<ANCHOR id="GstMultiFdSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.properties">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.signals">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.description">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.details">
+<ANCHOR id="GstMultiFdSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-struct">
+<ANCHOR id="GstRecoverPolicy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstRecoverPolicy">
+<ANCHOR id="GST-RECOVER-POLICY-NONE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-NONE:CAPS">
+<ANCHOR id="GST-RECOVER-POLICY-RESYNC-LATEST:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-LATEST:CAPS">
+<ANCHOR id="GST-RECOVER-POLICY-RESYNC-SOFT-LIMIT:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-SOFT-LIMIT:CAPS">
+<ANCHOR id="GST-RECOVER-POLICY-RESYNC-KEYFRAME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-RECOVER-POLICY-RESYNC-KEYFRAME:CAPS">
+<ANCHOR id="GstSyncMethod" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstSyncMethod">
+<ANCHOR id="GST-SYNC-METHOD-LATEST:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-LATEST:CAPS">
+<ANCHOR id="GST-SYNC-METHOD-NEXT-KEYFRAME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-NEXT-KEYFRAME:CAPS">
+<ANCHOR id="GST-SYNC-METHOD-LATEST-KEYFRAME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-LATEST-KEYFRAME:CAPS">
+<ANCHOR id="GST-SYNC-METHOD-BURST:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST:CAPS">
+<ANCHOR id="GST-SYNC-METHOD-BURST-KEYFRAME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST-KEYFRAME:CAPS">
+<ANCHOR id="GST-SYNC-METHOD-BURST-WITH-KEYFRAME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-SYNC-METHOD-BURST-WITH-KEYFRAME:CAPS">
+<ANCHOR id="GstClientStatus" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstClientStatus">
+<ANCHOR id="GST-CLIENT-STATUS-OK:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-OK:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-CLOSED:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-CLOSED:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-REMOVED:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-REMOVED:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-SLOW:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-SLOW:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-ERROR:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-ERROR:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-DUPLICATE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-DUPLICATE:CAPS">
+<ANCHOR id="GST-CLIENT-STATUS-FLUSHING:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-CLIENT-STATUS-FLUSHING:CAPS">
+<ANCHOR id="GstTCPUnitType" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstTCPUnitType">
+<ANCHOR id="GST-TCP-UNIT-TYPE-UNDEFINED:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-UNDEFINED:CAPS">
+<ANCHOR id="GST-TCP-UNIT-TYPE-BUFFERS:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-BUFFERS:CAPS">
+<ANCHOR id="GST-TCP-UNIT-TYPE-TIME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-TIME:CAPS">
+<ANCHOR id="GST-TCP-UNIT-TYPE-BYTES:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GST-TCP-UNIT-TYPE-BYTES:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.property-details">
+<ANCHOR id="GstMultiFdSink--buffers-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-max">
+<ANCHOR id="GstMultiFdSink--buffers-queued" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-queued">
+<ANCHOR id="GstMultiFdSink--buffers-soft-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-soft-max">
+<ANCHOR id="GstMultiFdSink--bytes-served" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-served">
+<ANCHOR id="GstMultiFdSink--bytes-to-serve" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-to-serve">
+<ANCHOR id="GstMultiFdSink--mode" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--mode">
+<ANCHOR id="GstMultiFdSink--protocol" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--protocol">
+<ANCHOR id="GstMultiFdSink--recover-policy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--recover-policy">
+<ANCHOR id="GstMultiFdSink--sync-clients" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-clients">
+<ANCHOR id="GstMultiFdSink--sync-method" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--sync-method">
+<ANCHOR id="GstMultiFdSink--timeout" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--timeout">
+<ANCHOR id="GstMultiFdSink--buffers-min" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--buffers-min">
+<ANCHOR id="GstMultiFdSink--burst-unit" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-unit">
+<ANCHOR id="GstMultiFdSink--burst-value" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--burst-value">
+<ANCHOR id="GstMultiFdSink--bytes-min" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--bytes-min">
+<ANCHOR id="GstMultiFdSink--time-min" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--time-min">
+<ANCHOR id="GstMultiFdSink--unit-type" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--unit-type">
+<ANCHOR id="GstMultiFdSink--units-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-max">
+<ANCHOR id="GstMultiFdSink--units-soft-max" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--units-soft-max">
+<ANCHOR id="GstMultiFdSink--qos-dscp" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--qos-dscp">
+<ANCHOR id="GstMultiFdSink--handle-read" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--handle-read">
+<ANCHOR id="GstMultiFdSink--resend-streamheader" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--resend-streamheader">
+<ANCHOR id="GstMultiFdSink--num-fds" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink--num-fds">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.signal-details">
+<ANCHOR id="GstMultiFdSink-add" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add">
+<ANCHOR id="GstMultiFdSink-clear" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-clear">
+<ANCHOR id="GstMultiFdSink-client-added" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-added">
+<ANCHOR id="GstMultiFdSink-client-removed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-removed">
+<ANCHOR id="GstMultiFdSink-get-stats" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-get-stats">
+<ANCHOR id="GstMultiFdSink-remove" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove">
+<ANCHOR id="GstMultiFdSink-client-fd-removed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-client-fd-removed">
+<ANCHOR id="GstMultiFdSink-add-full" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-add-full">
+<ANCHOR id="GstMultiFdSink-remove-flush" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#GstMultiFdSink-remove-flush">
+<ANCHOR id="gst-plugins-base-plugins-multifdsink.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-multifdsink.html#gst-plugins-base-plugins-multifdsink.see-also">
+<ANCHOR id="gst-plugins-base-plugins-oggdemux" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html">
+<ANCHOR id="gst-plugins-base-plugins-oggdemux.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#gst-plugins-base-plugins-oggdemux.synopsis">
+<ANCHOR id="GstOggDemux" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#GstOggDemux">
+<ANCHOR id="gst-plugins-base-plugins-oggdemux.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#gst-plugins-base-plugins-oggdemux.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-oggdemux.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#gst-plugins-base-plugins-oggdemux.description">
+<ANCHOR id="gst-plugins-base-plugins-oggdemux.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#gst-plugins-base-plugins-oggdemux.details">
+<ANCHOR id="GstOggDemux-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggdemux.html#GstOggDemux-struct">
+<ANCHOR id="gst-plugins-base-plugins-oggmux" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.synopsis">
+<ANCHOR id="GstOggMux" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#GstOggMux">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.properties">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.description">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.details">
+<ANCHOR id="GstOggMux-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#GstOggMux-struct">
+<ANCHOR id="gst-plugins-base-plugins-oggmux.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#gst-plugins-base-plugins-oggmux.property-details">
+<ANCHOR id="GstOggMux--max-delay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#GstOggMux--max-delay">
+<ANCHOR id="GstOggMux--max-page-delay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-oggmux.html#GstOggMux--max-page-delay">
+<ANCHOR id="gst-plugins-base-plugins-playbin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html">
+<ANCHOR id="gst-plugins-base-plugins-playbin.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.synopsis">
+<ANCHOR id="GstPlayBin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin">
+<ANCHOR id="gst-plugins-base-plugins-playbin.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-playbin.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-playbin.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.properties">
+<ANCHOR id="gst-plugins-base-plugins-playbin.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.description">
+<ANCHOR id="gst-plugins-base-plugins-playbin.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.details">
+<ANCHOR id="GstPlayBin-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin-struct">
+<ANCHOR id="GstPlayFlags" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayFlags">
+<ANCHOR id="GST-PLAY-FLAG-VIDEO:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-VIDEO:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-AUDIO:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-AUDIO:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-TEXT:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-TEXT:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-VIS:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-VIS:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-SOFT-VOLUME:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-SOFT-VOLUME:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-NATIVE-AUDIO:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-NATIVE-AUDIO:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-NATIVE-VIDEO:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-NATIVE-VIDEO:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-DOWNLOAD:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-DOWNLOAD:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-BUFFERING:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-BUFFERING:CAPS">
+<ANCHOR id="GST-PLAY-FLAG-DEINTERLACE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GST-PLAY-FLAG-DEINTERLACE:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-playbin.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#gst-plugins-base-plugins-playbin.property-details">
+<ANCHOR id="GstPlayBin--audio-sink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--audio-sink">
+<ANCHOR id="GstPlayBin--frame" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--frame">
+<ANCHOR id="GstPlayBin--subtitle-font-desc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--subtitle-font-desc">
+<ANCHOR id="GstPlayBin--video-sink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--video-sink">
+<ANCHOR id="GstPlayBin--vis-plugin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--vis-plugin">
+<ANCHOR id="GstPlayBin--volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--volume">
+<ANCHOR id="GstPlayBin--connection-speed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-playbin.html#GstPlayBin--connection-speed">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.synopsis">
+<ANCHOR id="GstSubtitleOverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.properties">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.description">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.details">
+<ANCHOR id="GstSubtitleOverlay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay-struct">
+<ANCHOR id="gst-plugins-base-plugins-subtitleoverlay.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#gst-plugins-base-plugins-subtitleoverlay.property-details">
+<ANCHOR id="GstSubtitleOverlay--font-desc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--font-desc">
+<ANCHOR id="GstSubtitleOverlay--silent" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--silent">
+<ANCHOR id="GstSubtitleOverlay--subtitle-encoding" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-subtitleoverlay.html#GstSubtitleOverlay--subtitle-encoding">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.synopsis">
+<ANCHOR id="GstTCPClientSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.description">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.details">
+<ANCHOR id="GstTCPClientSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.property-details">
+<ANCHOR id="GstTCPClientSrc--host" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--host">
+<ANCHOR id="GstTCPClientSrc--port" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--port">
+<ANCHOR id="GstTCPClientSrc--protocol" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#GstTCPClientSrc--protocol">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsrc.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsrc.html#gst-plugins-base-plugins-tcpclientsrc.see-also">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.synopsis">
+<ANCHOR id="GstTCPClientSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.properties">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.description">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.details">
+<ANCHOR id="GstTCPClientSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.property-details">
+<ANCHOR id="GstTCPClientSink--host" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--host">
+<ANCHOR id="GstTCPClientSink--port" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--port">
+<ANCHOR id="GstTCPClientSink--protocol" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#GstTCPClientSink--protocol">
+<ANCHOR id="gst-plugins-base-plugins-tcpclientsink.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpclientsink.html#gst-plugins-base-plugins-tcpclientsink.see-also">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.synopsis">
+<ANCHOR id="GstTCPServerSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.description">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.details">
+<ANCHOR id="GstTCPServerSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc-struct">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.property-details">
+<ANCHOR id="GstTCPServerSrc--host" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--host">
+<ANCHOR id="GstTCPServerSrc--port" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--port">
+<ANCHOR id="GstTCPServerSrc--protocol" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#GstTCPServerSrc--protocol">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversrc.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversrc.html#gst-plugins-base-plugins-tcpserversrc.see-also">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.synopsis">
+<ANCHOR id="GstTCPServerSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.properties">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.description">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.details">
+<ANCHOR id="GstTCPServerSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.property-details">
+<ANCHOR id="GstTCPServerSink--host" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--host">
+<ANCHOR id="GstTCPServerSink--port" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#GstTCPServerSink--port">
+<ANCHOR id="gst-plugins-base-plugins-tcpserversink.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-tcpserversink.html#gst-plugins-base-plugins-tcpserversink.see-also">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.synopsis">
+<ANCHOR id="GstTextOverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.properties">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.description">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.details">
+<ANCHOR id="GstTextOverlay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay-struct">
+<ANCHOR id="gst-plugins-base-plugins-textoverlay.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#gst-plugins-base-plugins-textoverlay.property-details">
+<ANCHOR id="GstTextOverlay--deltax" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltax">
+<ANCHOR id="GstTextOverlay--deltay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--deltay">
+<ANCHOR id="GstTextOverlay--font-desc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--font-desc">
+<ANCHOR id="GstTextOverlay--halign" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halign">
+<ANCHOR id="GstTextOverlay--shaded-background" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--shaded-background">
+<ANCHOR id="GstTextOverlay--text" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--text">
+<ANCHOR id="GstTextOverlay--valign" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valign">
+<ANCHOR id="GstTextOverlay--wrap-mode" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wrap-mode">
+<ANCHOR id="GstTextOverlay--xpad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpad">
+<ANCHOR id="GstTextOverlay--ypad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypad">
+<ANCHOR id="GstTextOverlay--halignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--halignment">
+<ANCHOR id="GstTextOverlay--valignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--valignment">
+<ANCHOR id="GstTextOverlay--line-alignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--line-alignment">
+<ANCHOR id="GstTextOverlay--silent" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--silent">
+<ANCHOR id="GstTextOverlay--wait-text" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--wait-text">
+<ANCHOR id="GstTextOverlay--auto-resize" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--auto-resize">
+<ANCHOR id="GstTextOverlay--vertical-render" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--vertical-render">
+<ANCHOR id="GstTextOverlay--color" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--color">
+<ANCHOR id="GstTextOverlay--xpos" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--xpos">
+<ANCHOR id="GstTextOverlay--ypos" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textoverlay.html#GstTextOverlay--ypos">
+<ANCHOR id="gst-plugins-base-plugins-textrender" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html">
+<ANCHOR id="gst-plugins-base-plugins-textrender.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.synopsis">
+<ANCHOR id="GstTextRender" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender">
+<ANCHOR id="gst-plugins-base-plugins-textrender.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-textrender.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.properties">
+<ANCHOR id="gst-plugins-base-plugins-textrender.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.description">
+<ANCHOR id="gst-plugins-base-plugins-textrender.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.details">
+<ANCHOR id="GstTextRender-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender-struct">
+<ANCHOR id="gst-plugins-base-plugins-textrender.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#gst-plugins-base-plugins-textrender.property-details">
+<ANCHOR id="GstTextRender--font-desc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--font-desc">
+<ANCHOR id="GstTextRender--halignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--halignment">
+<ANCHOR id="GstTextRender--line-alignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--line-alignment">
+<ANCHOR id="GstTextRender--valignment" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--valignment">
+<ANCHOR id="GstTextRender--xpad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--xpad">
+<ANCHOR id="GstTextRender--ypad" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-textrender.html#GstTextRender--ypad">
+<ANCHOR id="gst-plugins-base-plugins-theoradec" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.synopsis">
+<ANCHOR id="GstTheoraDec" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#GstTheoraDec">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.properties">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.description">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.details">
+<ANCHOR id="GstTheoraDec-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#GstTheoraDec-struct">
+<ANCHOR id="gst-plugins-base-plugins-theoradec.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#gst-plugins-base-plugins-theoradec.property-details">
+<ANCHOR id="GstTheoraDec--crop" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoradec.html#GstTheoraDec--crop">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.synopsis">
+<ANCHOR id="GstTheoraEnc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.properties">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.description">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.details">
+<ANCHOR id="GstTheoraEnc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc-struct">
+<ANCHOR id="GstTheoraEncBorderMode" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEncBorderMode">
+<ANCHOR id="gst-plugins-base-plugins-theoraenc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#gst-plugins-base-plugins-theoraenc.property-details">
+<ANCHOR id="GstTheoraEnc--bitrate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--bitrate">
+<ANCHOR id="GstTheoraEnc--border" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--border">
+<ANCHOR id="GstTheoraEnc--center" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--center">
+<ANCHOR id="GstTheoraEnc--keyframe-auto" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-auto">
+<ANCHOR id="GstTheoraEnc--keyframe-force" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-force">
+<ANCHOR id="GstTheoraEnc--keyframe-freq" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-freq">
+<ANCHOR id="GstTheoraEnc--keyframe-mindistance" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-mindistance">
+<ANCHOR id="GstTheoraEnc--keyframe-threshold" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--keyframe-threshold">
+<ANCHOR id="GstTheoraEnc--noise-sensitivity" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--noise-sensitivity">
+<ANCHOR id="GstTheoraEnc--quality" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quality">
+<ANCHOR id="GstTheoraEnc--quick" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--quick">
+<ANCHOR id="GstTheoraEnc--sharpness" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--sharpness">
+<ANCHOR id="GstTheoraEnc--speed-level" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--speed-level">
+<ANCHOR id="GstTheoraEnc--cap-overflow" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-overflow">
+<ANCHOR id="GstTheoraEnc--cap-underflow" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--cap-underflow">
+<ANCHOR id="GstTheoraEnc--drop-frames" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--drop-frames">
+<ANCHOR id="GstTheoraEnc--rate-buffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--rate-buffer">
+<ANCHOR id="GstTheoraEnc--vp3-compatible" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--vp3-compatible">
+<ANCHOR id="GstTheoraEnc--multipass-cache-file" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-cache-file">
+<ANCHOR id="GstTheoraEnc--multipass-mode" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraenc.html#GstTheoraEnc--multipass-mode">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.synopsis">
+<ANCHOR id="GstTheoraParse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#GstTheoraParse">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.properties">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.description">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.details">
+<ANCHOR id="GstTheoraParse-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#GstTheoraParse-struct">
+<ANCHOR id="gst-plugins-base-plugins-theoraparse.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#gst-plugins-base-plugins-theoraparse.property-details">
+<ANCHOR id="GstTheoraParse--synchronization-points" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-theoraparse.html#GstTheoraParse--synchronization-points">
+<ANCHOR id="gst-plugins-base-plugins-timeoverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html">
+<ANCHOR id="gst-plugins-base-plugins-timeoverlay.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#gst-plugins-base-plugins-timeoverlay.synopsis">
+<ANCHOR id="GstTimeOverlay" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#GstTimeOverlay">
+<ANCHOR id="gst-plugins-base-plugins-timeoverlay.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#gst-plugins-base-plugins-timeoverlay.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-timeoverlay.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#gst-plugins-base-plugins-timeoverlay.description">
+<ANCHOR id="gst-plugins-base-plugins-timeoverlay.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#gst-plugins-base-plugins-timeoverlay.details">
+<ANCHOR id="GstTimeOverlay-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-timeoverlay.html#GstTimeOverlay-struct">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.synopsis">
+<ANCHOR id="GstURIDecodeBin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.properties">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.signals" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.signals">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.description">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.details">
+<ANCHOR id="GstURIDecodeBin-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-struct">
+<ANCHOR id="GstAutoplugSelectResult" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstAutoplugSelectResult">
+<ANCHOR id="GST-AUTOPLUG-SELECT-TRY:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-TRY:CAPS">
+<ANCHOR id="GST-AUTOPLUG-SELECT-EXPOSE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-EXPOSE:CAPS">
+<ANCHOR id="GST-AUTOPLUG-SELECT-SKIP:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GST-AUTOPLUG-SELECT-SKIP:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.property-details">
+<ANCHOR id="GstURIDecodeBin--uri" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--uri">
+<ANCHOR id="GstURIDecodeBin--connection-speed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--connection-speed">
+<ANCHOR id="GstURIDecodeBin--caps" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--caps">
+<ANCHOR id="GstURIDecodeBin--subtitle-encoding" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--subtitle-encoding">
+<ANCHOR id="GstURIDecodeBin--source" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--source">
+<ANCHOR id="GstURIDecodeBin--buffer-duration" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-duration">
+<ANCHOR id="GstURIDecodeBin--buffer-size" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--buffer-size">
+<ANCHOR id="GstURIDecodeBin--download" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--download">
+<ANCHOR id="GstURIDecodeBin--use-buffering" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--use-buffering">
+<ANCHOR id="GstURIDecodeBin--expose-all-streams" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--expose-all-streams">
+<ANCHOR id="GstURIDecodeBin--ring-buffer-max-size" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin--ring-buffer-max-size">
+<ANCHOR id="gst-plugins-base-plugins-uridecodebin.signal-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#gst-plugins-base-plugins-uridecodebin.signal-details">
+<ANCHOR id="GstURIDecodeBin-autoplug-continue" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-continue">
+<ANCHOR id="GstURIDecodeBin-autoplug-factories" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-factories">
+<ANCHOR id="GstURIDecodeBin-autoplug-select" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-select">
+<ANCHOR id="GstURIDecodeBin-unknown-type" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-unknown-type">
+<ANCHOR id="GstURIDecodeBin-drained" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-drained">
+<ANCHOR id="GstURIDecodeBin-autoplug-sort" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-autoplug-sort">
+<ANCHOR id="GstURIDecodeBin-source-setup" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-uridecodebin.html#GstURIDecodeBin-source-setup">
+<ANCHOR id="gst-plugins-base-plugins-videorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html">
+<ANCHOR id="gst-plugins-base-plugins-videorate.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.synopsis">
+<ANCHOR id="GstVideoRate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate">
+<ANCHOR id="gst-plugins-base-plugins-videorate.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-videorate.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.properties">
+<ANCHOR id="gst-plugins-base-plugins-videorate.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.description">
+<ANCHOR id="gst-plugins-base-plugins-videorate.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.details">
+<ANCHOR id="GstVideoRate-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate-struct">
+<ANCHOR id="gst-plugins-base-plugins-videorate.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#gst-plugins-base-plugins-videorate.property-details">
+<ANCHOR id="GstVideoRate--drop" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--drop">
+<ANCHOR id="GstVideoRate--duplicate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--duplicate">
+<ANCHOR id="GstVideoRate--in" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--in">
+<ANCHOR id="GstVideoRate--new-pref" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--new-pref">
+<ANCHOR id="GstVideoRate--out" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--out">
+<ANCHOR id="GstVideoRate--silent" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--silent">
+<ANCHOR id="GstVideoRate--skip-to-first" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--skip-to-first">
+<ANCHOR id="GstVideoRate--average-period" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--average-period">
+<ANCHOR id="GstVideoRate--drop-only" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videorate.html#GstVideoRate--drop-only">
+<ANCHOR id="gst-plugins-base-plugins-videoscale" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.synopsis">
+<ANCHOR id="GstVideoScale" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GstVideoScale">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.properties">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.description">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.details">
+<ANCHOR id="GstVideoScale-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GstVideoScale-struct">
+<ANCHOR id="GstVideoScaleMethod" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GstVideoScaleMethod">
+<ANCHOR id="GST-VIDEO-SCALE-NEAREST:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-NEAREST:CAPS">
+<ANCHOR id="GST-VIDEO-SCALE-BILINEAR:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-BILINEAR:CAPS">
+<ANCHOR id="GST-VIDEO-SCALE-4TAP:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-4TAP:CAPS">
+<ANCHOR id="GST-VIDEO-SCALE-LANCZOS:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GST-VIDEO-SCALE-LANCZOS:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.property-details">
+<ANCHOR id="GstVideoScale--method" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GstVideoScale--method">
+<ANCHOR id="GstVideoScale--add-borders" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#GstVideoScale--add-borders">
+<ANCHOR id="gst-plugins-base-plugins-videoscale.see-also" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videoscale.html#gst-plugins-base-plugins-videoscale.see-also">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.synopsis">
+<ANCHOR id="GstVideoTestSrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.properties">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.description">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.details">
+<ANCHOR id="GstVideoTestSrc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc-struct">
+<ANCHOR id="GstVideoTestSrcPattern" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrcPattern">
+<ANCHOR id="GST-VIDEO-TEST-SRC-SMPTE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-SNOW:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SNOW:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-BLACK:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLACK:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-WHITE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-WHITE:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-RED:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-RED:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-GREEN:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-GREEN:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-BLUE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLUE:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CHECKERS1:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS1:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CHECKERS2:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS2:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CHECKERS4:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS4:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CHECKERS8:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHECKERS8:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CIRCULAR:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CIRCULAR:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-BLINK:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BLINK:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-SMPTE75:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE75:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-ZONE-PLATE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-ZONE-PLATE:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-GAMUT:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-GAMUT:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-CHROMA-ZONE-PLATE:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-CHROMA-ZONE-PLATE:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-SOLID:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SOLID:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-BALL:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BALL:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-SMPTE100:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-SMPTE100:CAPS">
+<ANCHOR id="GST-VIDEO-TEST-SRC-BAR:CAPS" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GST-VIDEO-TEST-SRC-BAR:CAPS">
+<ANCHOR id="gst-plugins-base-plugins-videotestsrc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#gst-plugins-base-plugins-videotestsrc.property-details">
+<ANCHOR id="GstVideoTestSrc--pattern" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--pattern">
+<ANCHOR id="GstVideoTestSrc--timestamp-offset" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--timestamp-offset">
+<ANCHOR id="GstVideoTestSrc--is-live" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--is-live">
+<ANCHOR id="GstVideoTestSrc--peer-alloc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--peer-alloc">
+<ANCHOR id="GstVideoTestSrc--colorspec" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--colorspec">
+<ANCHOR id="GstVideoTestSrc--k0" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--k0">
+<ANCHOR id="GstVideoTestSrc--kt" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt">
+<ANCHOR id="GstVideoTestSrc--kt2" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kt2">
+<ANCHOR id="GstVideoTestSrc--kx" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx">
+<ANCHOR id="GstVideoTestSrc--kx2" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kx2">
+<ANCHOR id="GstVideoTestSrc--kxt" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxt">
+<ANCHOR id="GstVideoTestSrc--kxy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kxy">
+<ANCHOR id="GstVideoTestSrc--ky" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky">
+<ANCHOR id="GstVideoTestSrc--ky2" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--ky2">
+<ANCHOR id="GstVideoTestSrc--kyt" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--kyt">
+<ANCHOR id="GstVideoTestSrc--xoffset" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--xoffset">
+<ANCHOR id="GstVideoTestSrc--yoffset" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--yoffset">
+<ANCHOR id="GstVideoTestSrc--background-color" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--background-color">
+<ANCHOR id="GstVideoTestSrc--foreground-color" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--foreground-color">
+<ANCHOR id="GstVideoTestSrc--horizontal-speed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-videotestsrc.html#GstVideoTestSrc--horizontal-speed">
+<ANCHOR id="gst-plugins-base-plugins-volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html">
+<ANCHOR id="gst-plugins-base-plugins-volume.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.synopsis">
+<ANCHOR id="GstVolume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#GstVolume">
+<ANCHOR id="gst-plugins-base-plugins-volume.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-volume.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-volume.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.properties">
+<ANCHOR id="gst-plugins-base-plugins-volume.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.description">
+<ANCHOR id="gst-plugins-base-plugins-volume.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.details">
+<ANCHOR id="GstVolume-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#GstVolume-struct">
+<ANCHOR id="gst-plugins-base-plugins-volume.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#gst-plugins-base-plugins-volume.property-details">
+<ANCHOR id="GstVolume--mute" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#GstVolume--mute">
+<ANCHOR id="GstVolume--volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-volume.html#GstVolume--volume">
+<ANCHOR id="gst-plugins-base-plugins-vorbisdec" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html">
+<ANCHOR id="gst-plugins-base-plugins-vorbisdec.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#gst-plugins-base-plugins-vorbisdec.synopsis">
+<ANCHOR id="GstVorbisDec" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#GstVorbisDec">
+<ANCHOR id="gst-plugins-base-plugins-vorbisdec.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#gst-plugins-base-plugins-vorbisdec.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-vorbisdec.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#gst-plugins-base-plugins-vorbisdec.description">
+<ANCHOR id="gst-plugins-base-plugins-vorbisdec.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#gst-plugins-base-plugins-vorbisdec.details">
+<ANCHOR id="GstVorbisDec-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisdec.html#GstVorbisDec-struct">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.synopsis">
+<ANCHOR id="GstVorbisEnc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.properties">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.description">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.details">
+<ANCHOR id="GstVorbisEnc-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc-struct">
+<ANCHOR id="gst-plugins-base-plugins-vorbisenc.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#gst-plugins-base-plugins-vorbisenc.property-details">
+<ANCHOR id="GstVorbisEnc--bitrate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--bitrate">
+<ANCHOR id="GstVorbisEnc--last-message" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--last-message">
+<ANCHOR id="GstVorbisEnc--managed" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--managed">
+<ANCHOR id="GstVorbisEnc--max-bitrate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--max-bitrate">
+<ANCHOR id="GstVorbisEnc--min-bitrate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--min-bitrate">
+<ANCHOR id="GstVorbisEnc--quality" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisenc.html#GstVorbisEnc--quality">
+<ANCHOR id="gst-plugins-base-plugins-vorbisparse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html">
+<ANCHOR id="gst-plugins-base-plugins-vorbisparse.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#gst-plugins-base-plugins-vorbisparse.synopsis">
+<ANCHOR id="GstVorbisParse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#GstVorbisParse">
+<ANCHOR id="gst-plugins-base-plugins-vorbisparse.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#gst-plugins-base-plugins-vorbisparse.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-vorbisparse.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#gst-plugins-base-plugins-vorbisparse.description">
+<ANCHOR id="gst-plugins-base-plugins-vorbisparse.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#gst-plugins-base-plugins-vorbisparse.details">
+<ANCHOR id="GstVorbisParse-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbisparse.html#GstVorbisParse-struct">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#gst-plugins-base-plugins-vorbistag.synopsis">
+<ANCHOR id="GstVorbisTag" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#GstVorbisTag">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#gst-plugins-base-plugins-vorbistag.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#gst-plugins-base-plugins-vorbistag.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#gst-plugins-base-plugins-vorbistag.description">
+<ANCHOR id="gst-plugins-base-plugins-vorbistag.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#gst-plugins-base-plugins-vorbistag.details">
+<ANCHOR id="GstVorbisTag-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-vorbistag.html#GstVorbisTag-struct">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.synopsis">
+<ANCHOR id="GstXImageSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.properties">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.description">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.details">
+<ANCHOR id="GstXImageSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-ximagesink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#gst-plugins-base-plugins-ximagesink.property-details">
+<ANCHOR id="GstXImageSink--display" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--display">
+<ANCHOR id="GstXImageSink--pixel-aspect-ratio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--pixel-aspect-ratio">
+<ANCHOR id="GstXImageSink--synchronous" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--synchronous">
+<ANCHOR id="GstXImageSink--force-aspect-ratio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--force-aspect-ratio">
+<ANCHOR id="GstXImageSink--handle-events" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-events">
+<ANCHOR id="GstXImageSink--handle-expose" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--handle-expose">
+<ANCHOR id="GstXImageSink--window-height" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-height">
+<ANCHOR id="GstXImageSink--window-width" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-ximagesink.html#GstXImageSink--window-width">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.synopsis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.synopsis">
+<ANCHOR id="GstXvImageSink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.object-hierarchy" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.object-hierarchy">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.implemented-interfaces" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.implemented-interfaces">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.properties" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.properties">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.description" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.description">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.details">
+<ANCHOR id="GstXvImageSink-struct" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink-struct">
+<ANCHOR id="gst-plugins-base-plugins-xvimagesink.property-details" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#gst-plugins-base-plugins-xvimagesink.property-details">
+<ANCHOR id="GstXvImageSink--brightness" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--brightness">
+<ANCHOR id="GstXvImageSink--contrast" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--contrast">
+<ANCHOR id="GstXvImageSink--display" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--display">
+<ANCHOR id="GstXvImageSink--hue" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--hue">
+<ANCHOR id="GstXvImageSink--pixel-aspect-ratio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--pixel-aspect-ratio">
+<ANCHOR id="GstXvImageSink--saturation" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--saturation">
+<ANCHOR id="GstXvImageSink--synchronous" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--synchronous">
+<ANCHOR id="GstXvImageSink--force-aspect-ratio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--force-aspect-ratio">
+<ANCHOR id="GstXvImageSink--device" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device">
+<ANCHOR id="GstXvImageSink--device-name" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--device-name">
+<ANCHOR id="GstXvImageSink--handle-events" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-events">
+<ANCHOR id="GstXvImageSink--double-buffer" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--double-buffer">
+<ANCHOR id="GstXvImageSink--handle-expose" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--handle-expose">
+<ANCHOR id="GstXvImageSink--autopaint-colorkey" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--autopaint-colorkey">
+<ANCHOR id="GstXvImageSink--colorkey" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--colorkey">
+<ANCHOR id="GstXvImageSink--draw-borders" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--draw-borders">
+<ANCHOR id="GstXvImageSink--window-height" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-height">
+<ANCHOR id="GstXvImageSink--window-width" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-xvimagesink.html#GstXvImageSink--window-width">
+<ANCHOR id="gst-plugins-base-plugins-plugin-adder" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-adder.html">
+<ANCHOR id="plugin-adder" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-adder.html#plugin-adder">
+<ANCHOR id="gst-plugins-base-plugins-plugin-alsa" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-alsa.html">
+<ANCHOR id="plugin-alsa" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-alsa.html#plugin-alsa">
+<ANCHOR id="gst-plugins-base-plugins-plugin-app" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-app.html">
+<ANCHOR id="plugin-app" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-app.html#plugin-app">
+<ANCHOR id="gst-plugins-base-plugins-plugin-audioconvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audioconvert.html">
+<ANCHOR id="plugin-audioconvert" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audioconvert.html#plugin-audioconvert">
+<ANCHOR id="gst-plugins-base-plugins-plugin-audiorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audiorate.html">
+<ANCHOR id="plugin-audiorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audiorate.html#plugin-audiorate">
+<ANCHOR id="gst-plugins-base-plugins-plugin-audioresample" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audioresample.html">
+<ANCHOR id="plugin-audioresample" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audioresample.html#plugin-audioresample">
+<ANCHOR id="gst-plugins-base-plugins-plugin-audiotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audiotestsrc.html">
+<ANCHOR id="plugin-audiotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-audiotestsrc.html#plugin-audiotestsrc">
+<ANCHOR id="gst-plugins-base-plugins-plugin-cdparanoia" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-cdparanoia.html">
+<ANCHOR id="plugin-cdparanoia" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-cdparanoia.html#plugin-cdparanoia">
+<ANCHOR id="gst-plugins-base-plugins-plugin-decodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-decodebin.html">
+<ANCHOR id="plugin-decodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-decodebin.html#plugin-decodebin">
+<ANCHOR id="gst-plugins-base-plugins-plugin-encoding" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-encoding.html">
+<ANCHOR id="plugin-encoding" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-encoding.html#plugin-encoding">
+<ANCHOR id="gst-plugins-base-plugins-plugin-gdp" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-gdp.html">
+<ANCHOR id="plugin-gdp" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-gdp.html#plugin-gdp">
+<ANCHOR id="gst-plugins-base-plugins-plugin-gio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-gio.html">
+<ANCHOR id="plugin-gio" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-gio.html#plugin-gio">
+<ANCHOR id="gst-plugins-base-plugins-plugin-libvisual" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-libvisual.html">
+<ANCHOR id="plugin-libvisual" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-libvisual.html#plugin-libvisual">
+<ANCHOR id="gst-plugins-base-plugins-plugin-ogg" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-ogg.html">
+<ANCHOR id="plugin-ogg" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-ogg.html#plugin-ogg">
+<ANCHOR id="gst-plugins-base-plugins-plugin-pango" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-pango.html">
+<ANCHOR id="plugin-pango" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-pango.html#plugin-pango">
+<ANCHOR id="gst-plugins-base-plugins-plugin-playback" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-playback.html">
+<ANCHOR id="plugin-playback" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-playback.html#plugin-playback">
+<ANCHOR id="gst-plugins-base-plugins-plugin-subparse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-subparse.html">
+<ANCHOR id="plugin-subparse" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-subparse.html#plugin-subparse">
+<ANCHOR id="gst-plugins-base-plugins-plugin-tcp" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-tcp.html">
+<ANCHOR id="plugin-tcp" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-tcp.html#plugin-tcp">
+<ANCHOR id="gst-plugins-base-plugins-plugin-theora" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-theora.html">
+<ANCHOR id="plugin-theora" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-theora.html#plugin-theora">
+<ANCHOR id="gst-plugins-base-plugins-plugin-typefindfunctions" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-typefindfunctions.html">
+<ANCHOR id="plugin-typefindfunctions" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-typefindfunctions.html#plugin-typefindfunctions">
+<ANCHOR id="gst-plugins-base-plugins-plugin-uridecodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-uridecodebin.html">
+<ANCHOR id="plugin-uridecodebin" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-uridecodebin.html#plugin-uridecodebin">
+<ANCHOR id="gst-plugins-base-plugins-plugin-videorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videorate.html">
+<ANCHOR id="plugin-videorate" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videorate.html#plugin-videorate">
+<ANCHOR id="gst-plugins-base-plugins-plugin-videoscale" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videoscale.html">
+<ANCHOR id="plugin-videoscale" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videoscale.html#plugin-videoscale">
+<ANCHOR id="gst-plugins-base-plugins-plugin-videotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videotestsrc.html">
+<ANCHOR id="plugin-videotestsrc" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-videotestsrc.html#plugin-videotestsrc">
+<ANCHOR id="gst-plugins-base-plugins-plugin-volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-volume.html">
+<ANCHOR id="plugin-volume" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-volume.html#plugin-volume">
+<ANCHOR id="gst-plugins-base-plugins-plugin-vorbis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-vorbis.html">
+<ANCHOR id="plugin-vorbis" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-vorbis.html#plugin-vorbis">
+<ANCHOR id="gst-plugins-base-plugins-plugin-ximagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-ximagesink.html">
+<ANCHOR id="plugin-ximagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-ximagesink.html#plugin-ximagesink">
+<ANCHOR id="gst-plugins-base-plugins-plugin-xvimagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-xvimagesink.html">
+<ANCHOR id="plugin-xvimagesink" href="gst-plugins-base-plugins-0.11/gst-plugins-base-plugins-plugin-xvimagesink.html#plugin-xvimagesink">
diff --git a/docs/plugins/html/left.png b/docs/plugins/html/left.png
new file mode 100644
index 0000000..2d05b3d
--- /dev/null
+++ b/docs/plugins/html/left.png
Binary files differ
diff --git a/docs/plugins/html/right.png b/docs/plugins/html/right.png
new file mode 100644
index 0000000..92832e3
--- /dev/null
+++ b/docs/plugins/html/right.png
Binary files differ
diff --git a/docs/plugins/html/style.css b/docs/plugins/html/style.css
new file mode 100644
index 0000000..d6f6c26
--- /dev/null
+++ b/docs/plugins/html/style.css
@@ -0,0 +1,266 @@
+.synopsis, .classsynopsis
+{
+ /* tango:aluminium 1/2 */
+ background: #eeeeec;
+ border: solid 1px #d3d7cf;
+ padding: 0.5em;
+}
+.programlisting
+{
+ /* tango:sky blue 0/1 */
+ background: #e6f3ff;
+ border: solid 1px #729fcf;
+ padding: 0.5em;
+}
+.variablelist
+{
+ padding: 4px;
+ margin-left: 3em;
+}
+.variablelist td:first-child
+{
+ vertical-align: top;
+}
+
+@media screen {
+ sup a.footnote
+ {
+ position: relative;
+ top: 0em ! important;
+
+ }
+ /* this is needed so that the local anchors are displayed below the naviagtion */
+ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+ {
+ display: inline-block;
+ position: relative;
+ top:-5em;
+ }
+ /* this seems to be a bug in the xsl style sheets when generating indexes */
+ div.index div.index
+ {
+ top: 0em;
+ }
+ /* make space for the fixed navigation bar and add space at the bottom so that
+ * link targets appear somewhat close to top
+ */
+ body
+ {
+ padding-top: 3.2em;
+ padding-bottom: 20em;
+ }
+ /* style and size the navigation bar */
+ table.navigation#top
+ {
+ position: fixed;
+ /* tango:scarlet red 0/1 */
+ background: #ffe6e6;
+ border: solid 1px #ef2929;
+ margin-top: 0;
+ margin-bottom: 0;
+ top: 0;
+ left: 0;
+ height: 3em;
+ z-index: 10;
+ }
+ .navigation a, .navigation a:visited
+ {
+ /* tango:scarlet red 3 */
+ color: #a40000;
+ }
+ .navigation a:hover
+ {
+ /* tango:scarlet red 1 */
+ color: #ef2929;
+ }
+ td.shortcuts
+ {
+ /* tango:scarlet red 1 */
+ color: #ef2929;
+ font-size: 80%;
+ white-space: nowrap;
+ }
+}
+@media print {
+ table.navigation {
+ visibility: collapse;
+ display: none;
+ }
+ div.titlepage table.navigation {
+ visibility: visible;
+ display: table;
+ /* tango:scarlet red 0/1 */
+ background: #ffe6e6;
+ border: solid 1px #ef2929;
+ margin-top: 0;
+ margin-bottom: 0;
+ top: 0;
+ left: 0;
+ height: 3em;
+ }
+}
+
+.navigation .title
+{
+ font-size: 200%;
+}
+
+div.gallery-float
+{
+ float: left;
+ padding: 10px;
+}
+div.gallery-float img
+{
+ border-style: none;
+}
+div.gallery-spacer
+{
+ clear: both;
+}
+
+a, a:visited
+{
+ text-decoration: none;
+ /* tango:sky blue 2 */
+ color: #3465a4;
+}
+a:hover
+{
+ text-decoration: underline;
+ /* tango:sky blue 1 */
+ color: #729fcf;
+}
+
+div.table table
+{
+ border-collapse: collapse;
+ border-spacing: 0px;
+ /* tango:aluminium 3 */
+ border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+ /* tango:aluminium 3 */
+ border: solid 1px #babdb6;
+ padding: 3px;
+ vertical-align: top;
+}
+
+div.table table th
+{
+ /* tango:aluminium 2 */
+ background-color: #d3d7cf;
+}
+
+hr
+{
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ background: #babdb6;
+ border: none 0px;
+ height: 1px;
+ clear: both;
+}
+
+.footer
+{
+ padding-top: 3.5em;
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ text-align: center;
+ font-size: 80%;
+}
+
+.warning
+{
+ /* tango:orange 0/1 */
+ background: #ffeed9;
+ border-color: #ffb04f;
+}
+.note
+{
+ /* tango:chameleon 0/0.5 */
+ background: #d8ffb2;
+ border-color: #abf562;
+}
+.note, .warning
+{
+ padding: 0.5em;
+ border-width: 1px;
+ border-style: solid;
+}
+.note h3, .warning h3
+{
+ margin-top: 0.0em
+}
+.note p, .warning p
+{
+ margin-bottom: 0.0em
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+ float: right;
+ /* tango:aluminium 3 */
+ color: #babdb6;
+ font-size: 80%;
+ font-weight: normal;
+}
+
+.annotation
+{
+ /* tango:aluminium 5 */
+ color: #555753;
+ font-size: 80%;
+ font-weight: normal;
+}
+
+/* code listings */
+
+.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */
+.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */
+.listing_code .programlisting .function { color: #000000; font-weight: bold; }
+.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */
+.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */
+.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .normal { color: #000000; }
+.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */
+.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */
+.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */
+.listing_code .programlisting .type { color: #000000; }
+.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */
+.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */
+
+.listing_frame {
+ /* tango:sky blue 1 */
+ border: solid 1px #729fcf;
+ padding: 0px;
+}
+
+.listing_lines, .listing_code {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0.5em;
+}
+.listing_lines {
+ /* tango:sky blue 0.5 */
+ background: #a6c5e3;
+ /* tango:aluminium 6 */
+ color: #2e3436;
+}
+.listing_code {
+ /* tango:sky blue 0 */
+ background: #e6f3ff;
+}
+.listing_code .programlisting {
+ /* override from previous */
+ border: none 0px;
+ padding: 0px;
+}
+.listing_lines pre, .listing_code pre {
+ margin: 0px;
+}
+
diff --git a/docs/plugins/html/up.png b/docs/plugins/html/up.png
new file mode 100644
index 0000000..85b3e2a
--- /dev/null
+++ b/docs/plugins/html/up.png
Binary files differ
diff --git a/docs/plugins/inspect/plugin-adder.xml b/docs/plugins/inspect/plugin-adder.xml
new file mode 100644
index 0000000..526d9c0
--- /dev/null
+++ b/docs/plugins/inspect/plugin-adder.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>adder</name>
+ <description>Adds multiple streams</description>
+ <filename>../../gst/adder/.libs/libgstadder.so</filename>
+ <basename>libgstadder.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>adder</name>
+ <longname>Adder</longname>
+ <class>Generic/Audio</class>
+ <description>Add N audio channels together</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-alsa.xml b/docs/plugins/inspect/plugin-alsa.xml
new file mode 100644
index 0000000..d1623e8
--- /dev/null
+++ b/docs/plugins/inspect/plugin-alsa.xml
@@ -0,0 +1,52 @@
+<plugin>
+ <name>alsa</name>
+ <description>ALSA plugin library</description>
+ <filename>../../ext/alsa/.libs/libgstalsa.so</filename>
+ <basename>libgstalsa.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>alsamixer</name>
+ <longname>Alsa mixer</longname>
+ <class>Generic/Audio</class>
+ <description>Control sound input and output levels with ALSA</description>
+ <author>Leif Johnson &lt;leif@ambient.2y.net&gt;</author>
+ <pads>
+ </pads>
+ </element>
+ <element>
+ <name>alsasink</name>
+ <longname>Audio sink (ALSA)</longname>
+ <class>Sink/Audio</class>
+ <description>Output to a sound card via ALSA</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-iec958</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>alsasrc</name>
+ <longname>Audio source (ALSA)</longname>
+ <class>Source/Audio</class>
+ <description>Read from a sound card via ALSA</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-app.xml b/docs/plugins/inspect/plugin-app.xml
new file mode 100644
index 0000000..2648f4a
--- /dev/null
+++ b/docs/plugins/inspect/plugin-app.xml
@@ -0,0 +1,43 @@
+<plugin>
+ <name>app</name>
+ <description>Elements used to communicate with applications</description>
+ <filename>../../gst/app/.libs/libgstapp.so</filename>
+ <basename>libgstapp.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>appsink</name>
+ <longname>AppSink</longname>
+ <class>Generic/Sink</class>
+ <description>Allow the application to get access to raw buffer</description>
+ <author>David Schleef &lt;ds@schleef.org&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>appsrc</name>
+ <longname>AppSrc</longname>
+ <class>Generic/Source</class>
+ <description>Allow the application to feed buffers to a pipeline</description>
+ <author>David Schleef &lt;ds@schleef.org&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-audioconvert.xml b/docs/plugins/inspect/plugin-audioconvert.xml
new file mode 100644
index 0000000..1bdd233
--- /dev/null
+++ b/docs/plugins/inspect/plugin-audioconvert.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>audioconvert</name>
+ <description>Convert audio to different formats</description>
+ <filename>../../gst/audioconvert/.libs/libgstaudioconvert.so</filename>
+ <basename>libgstaudioconvert.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>audioconvert</name>
+ <longname>Audio converter</longname>
+ <class>Filter/Converter/Audio</class>
+ <description>Convert audio to different formats</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)64; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)8, depth=(int)[ 1, 8 ], signed=(boolean){ true, false }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)64; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean){ true, false }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)8, depth=(int)[ 1, 8 ], signed=(boolean){ true, false }</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-audiorate.xml b/docs/plugins/inspect/plugin-audiorate.xml
new file mode 100644
index 0000000..4c32e10
--- /dev/null
+++ b/docs/plugins/inspect/plugin-audiorate.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>audiorate</name>
+ <description>Adjusts audio frames</description>
+ <filename>../../gst/audiorate/.libs/libgstaudiorate.so</filename>
+ <basename>libgstaudiorate.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>audiorate</name>
+ <longname>Audio rate adjuster</longname>
+ <class>Filter/Effect/Audio</class>
+ <description>Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 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 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <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 }</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-audioresample.xml b/docs/plugins/inspect/plugin-audioresample.xml
new file mode 100644
index 0000000..062caf3
--- /dev/null
+++ b/docs/plugins/inspect/plugin-audioresample.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>audioresample</name>
+ <description>Resamples audio</description>
+ <filename>../../gst/audioresample/.libs/libgstaudioresample.so</filename>
+ <basename>libgstaudioresample.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>audioresample</name>
+ <longname>Audio resampler</longname>
+ <class>Filter/Converter/Audio</class>
+ <description>Resamples audio</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-audiotestsrc.xml b/docs/plugins/inspect/plugin-audiotestsrc.xml
new file mode 100644
index 0000000..5190389
--- /dev/null
+++ b/docs/plugins/inspect/plugin-audiotestsrc.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>audiotestsrc</name>
+ <description>Creates audio test signals of given frequency and volume</description>
+ <filename>../../gst/audiotestsrc/.libs/libgstaudiotestsrc.so</filename>
+ <basename>libgstaudiotestsrc.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>audiotestsrc</name>
+ <longname>Audio test source</longname>
+ <class>Source/Audio</class>
+ <description>Creates audio test signals of given frequency and volume</description>
+ <author>Stefan Kost &lt;ensonic@users.sf.net&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <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, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-cdparanoia.xml b/docs/plugins/inspect/plugin-cdparanoia.xml
new file mode 100644
index 0000000..2dae88d
--- /dev/null
+++ b/docs/plugins/inspect/plugin-cdparanoia.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>cdparanoia</name>
+ <description>Read audio from CD in paranoid mode</description>
+ <filename>../../ext/cdparanoia/.libs/libgstcdparanoia.so</filename>
+ <basename>libgstcdparanoia.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>cdparanoiasrc</name>
+ <longname>CD Audio (cdda) Source, Paranoia IV</longname>
+ <class>Source/File</class>
+ <description>Read audio from CD in paranoid mode</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-decodebin.xml b/docs/plugins/inspect/plugin-decodebin.xml
new file mode 100644
index 0000000..e8f7814
--- /dev/null
+++ b/docs/plugins/inspect/plugin-decodebin.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>decodebin</name>
+ <description>decoder bin</description>
+ <filename>../../gst/playback/.libs/libgstdecodebin.so</filename>
+ <basename>libgstdecodebin.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>decodebin</name>
+ <longname>Decoder Bin</longname>
+ <class>Generic/Bin/Decoder</class>
+ <description>Autoplug and decode to raw media</description>
+ <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src%d</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-encoding.xml b/docs/plugins/inspect/plugin-encoding.xml
new file mode 100644
index 0000000..0a97277
--- /dev/null
+++ b/docs/plugins/inspect/plugin-encoding.xml
@@ -0,0 +1,46 @@
+<plugin>
+ <name>encoding</name>
+ <description>various encoding-related elements</description>
+ <filename>../../gst/encoding/.libs/libgstencodebin.so</filename>
+ <basename>libgstencodebin.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>encodebin</name>
+ <longname>Encoder Bin</longname>
+ <class>Generic/Bin/Encoder</class>
+ <description>Convenience encoding/muxing element</description>
+ <author>Edward Hervey &lt;edward.hervey@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>audio_%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>private_%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>video_%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-gdp.xml b/docs/plugins/inspect/plugin-gdp.xml
new file mode 100644
index 0000000..72b08b8
--- /dev/null
+++ b/docs/plugins/inspect/plugin-gdp.xml
@@ -0,0 +1,55 @@
+<plugin>
+ <name>gdp</name>
+ <description>Payload/depayload GDP packets</description>
+ <filename>../../gst/gdp/.libs/libgstgdp.so</filename>
+ <basename>libgstgdp.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>gdpdepay</name>
+ <longname>GDP Depayloader</longname>
+ <class>GDP/Depayloader</class>
+ <description>Depayloads GStreamer Data Protocol buffers</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-gdp</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>gdppay</name>
+ <longname>GDP Payloader</longname>
+ <class>GDP/Payloader</class>
+ <description>Payloads GStreamer Data Protocol buffers</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>application/x-gdp</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-gio.xml b/docs/plugins/inspect/plugin-gio.xml
new file mode 100644
index 0000000..d531e9f
--- /dev/null
+++ b/docs/plugins/inspect/plugin-gio.xml
@@ -0,0 +1,73 @@
+<plugin>
+ <name>gio</name>
+ <description>GIO elements</description>
+ <filename>../../ext/gio/.libs/libgstgio.so</filename>
+ <basename>libgstgio.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>giosink</name>
+ <longname>GIO sink</longname>
+ <class>Sink/File</class>
+ <description>Write to any GIO-supported location</description>
+ <author>René Stadler &lt;mail@renestadler.de&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>giosrc</name>
+ <longname>GIO source</longname>
+ <class>Source/File</class>
+ <description>Read from any GIO-supported location</description>
+ <author>René Stadler &lt;mail@renestadler.de&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>giostreamsink</name>
+ <longname>GIO stream sink</longname>
+ <class>Sink</class>
+ <description>Write to any GIO stream</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>giostreamsrc</name>
+ <longname>GIO stream source</longname>
+ <class>Source</class>
+ <description>Read from any GIO stream</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-libvisual.xml b/docs/plugins/inspect/plugin-libvisual.xml
new file mode 100644
index 0000000..0c477f0
--- /dev/null
+++ b/docs/plugins/inspect/plugin-libvisual.xml
@@ -0,0 +1,181 @@
+<plugin>
+ <name>libvisual</name>
+ <description>libvisual visualization plugins</description>
+ <filename>../../ext/libvisual/.libs/libgstlibvisual.so</filename>
+ <basename>libgstlibvisual.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>libvisual_bumpscope</name>
+ <longname>libvisual Bumpscope plugin plugin v.0.0.1</longname>
+ <class>Visualization</class>
+ <description>Bumpscope visual plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_corona</name>
+ <longname>libvisual libvisual corona plugin plugin v.0.1</longname>
+ <class>Visualization</class>
+ <description>Libvisual corona plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_infinite</name>
+ <longname>libvisual infinite plugin plugin v.0.1</longname>
+ <class>Visualization</class>
+ <description>Infinite visual plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_jakdaw</name>
+ <longname>libvisual Jakdaw plugin plugin v.0.0.1</longname>
+ <class>Visualization</class>
+ <description>jakdaw visual plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_jess</name>
+ <longname>libvisual jess plugin plugin v.0.1</longname>
+ <class>Visualization</class>
+ <description>Jess visual plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_lv_analyzer</name>
+ <longname>libvisual libvisual analyzer plugin v.1.0</longname>
+ <class>Visualization</class>
+ <description>Libvisual analyzer plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_lv_scope</name>
+ <longname>libvisual libvisual scope plugin v.0.1</longname>
+ <class>Visualization</class>
+ <description>Libvisual scope plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>libvisual_oinksie</name>
+ <longname>libvisual oinksie plugin plugin v.0.1</longname>
+ <class>Visualization</class>
+ <description>Libvisual Oinksie visual plugin</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, channels=(int){ 1, 2 }, rate=(int){ 8000, 11250, 22500, 32000, 44100, 48000, 96000 }</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-ogg.xml b/docs/plugins/inspect/plugin-ogg.xml
new file mode 100644
index 0000000..80ac5d2
--- /dev/null
+++ b/docs/plugins/inspect/plugin-ogg.xml
@@ -0,0 +1,160 @@
+<plugin>
+ <name>ogg</name>
+ <description>ogg stream manipulation (info about ogg: http://xiph.org)</description>
+ <filename>../../ext/ogg/.libs/libgstogg.so</filename>
+ <basename>libgstogg.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>oggaviparse</name>
+ <longname>Ogg AVI parser</longname>
+ <class>Codec/Parser</class>
+ <description>parse an ogg avi stream into pages (info about ogg: http://xiph.org)</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-ogg-avi</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>oggdemux</name>
+ <longname>Ogg demuxer</longname>
+ <class>Codec/Demuxer</class>
+ <description>demux ogg streams (info about ogg: http://xiph.org)</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/ogg; application/x-annodex</details>
+ </caps>
+ <caps>
+ <name>src_%d</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>oggmux</name>
+ <longname>Ogg muxer</longname>
+ <class>Codec/Muxer</class>
+ <description>mux ogg streams (info about ogg: http://xiph.org)</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink_%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>video/x-theora; audio/x-vorbis; audio/x-flac; audio/x-speex; audio/x-celt; application/x-ogm-video; application/x-ogm-audio; video/x-dirac; video/x-smoke; video/x-vp8; text/x-cmml, encoded=(boolean)true; subtitle/x-kate; application/x-kate</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>application/ogg</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>oggparse</name>
+ <longname>Ogg parser</longname>
+ <class>Codec/Parser</class>
+ <description>parse ogg streams into pages (info about ogg: http://xiph.org)</description>
+ <author>Michael Smith &lt;msmith@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/ogg</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>application/ogg</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ogmaudioparse</name>
+ <longname>OGM audio stream parser</longname>
+ <class>Codec/Decoder/Audio</class>
+ <description>parse an OGM audio header and stream</description>
+ <author>GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-ogm-audio</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <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>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ogmtextparse</name>
+ <longname>OGM text stream parser</longname>
+ <class>Codec/Decoder/Subtitle</class>
+ <description>parse an OGM text header and stream</description>
+ <author>GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-ogm-text</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>text/plain</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>ogmvideoparse</name>
+ <longname>OGM video stream parser</longname>
+ <class>Codec/Decoder/Video</class>
+ <description>parse an OGM video header and stream</description>
+ <author>GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-ogm-video</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <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 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-pango.xml b/docs/plugins/inspect/plugin-pango.xml
new file mode 100644
index 0000000..16834c7
--- /dev/null
+++ b/docs/plugins/inspect/plugin-pango.xml
@@ -0,0 +1,103 @@
+<plugin>
+ <name>pango</name>
+ <description>Pango-based text rendering and overlay</description>
+ <filename>../../ext/pango/.libs/libgstpango.so</filename>
+ <basename>libgstpango.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>clockoverlay</name>
+ <longname>Clock overlay</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Overlays the current clock time on a video stream</description>
+ <author>Tim-Philipp Müller &lt;tim@centricular.net&gt;</author>
+ <pads>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, 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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>textoverlay</name>
+ <longname>Text overlay</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Adds text strings on top of a video buffer</description>
+ <author>David Schleef &lt;ds@schleef.org&gt;, Zeeshan Ali &lt;zeeshan.ali@nokia.com&gt;</author>
+ <pads>
+ <caps>
+ <name>text_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>text/x-pango-markup; text/plain</details>
+ </caps>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>textrender</name>
+ <longname>Text renderer</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Renders a text string to an image bitmap</description>
+ <author>David Schleef &lt;ds@schleef.org&gt;, GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>text/x-pango-markup; text/plain</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>timeoverlay</name>
+ <longname>Time overlay</longname>
+ <class>Filter/Editor/Video</class>
+ <description>Overlays buffer time stamps on a video stream</description>
+ <author>Tim-Philipp Müller &lt;tim@centricular.net&gt;</author>
+ <pads>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, 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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)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)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)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, I420, UYVY, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-playback.xml b/docs/plugins/inspect/plugin-playback.xml
new file mode 100644
index 0000000..cbd683c
--- /dev/null
+++ b/docs/plugins/inspect/plugin-playback.xml
@@ -0,0 +1,97 @@
+<plugin>
+ <name>playback</name>
+ <description>various playback elements</description>
+ <filename>../../gst/playback/.libs/libgstplaybin.so</filename>
+ <basename>libgstplaybin.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>playbin</name>
+ <longname>Player Bin</longname>
+ <class>Generic/Bin/Player</class>
+ <description>Autoplug and play media from an uri</description>
+ <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ </pads>
+ </element>
+ <element>
+ <name>playbin2</name>
+ <longname>Player Bin 2</longname>
+ <class>Generic/Bin/Player</class>
+ <description>Autoplug and play media from an uri</description>
+ <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ </pads>
+ </element>
+ <element>
+ <name>playsink</name>
+ <longname>Player Sink</longname>
+ <class>Generic/Bin/Sink</class>
+ <description>Convenience sink for multiple streams</description>
+ <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>audio_raw_sink</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>audio_sink</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>text_sink</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>video_raw_sink</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>subtitleoverlay</name>
+ <longname>Subtitle Overlay</longname>
+ <class>Video/Overlay/Subtitle</class>
+ <description>Overlays a video stream with subtitles</description>
+ <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>subtitle_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>video_sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-subparse.xml b/docs/plugins/inspect/plugin-subparse.xml
new file mode 100644
index 0000000..f219927
--- /dev/null
+++ b/docs/plugins/inspect/plugin-subparse.xml
@@ -0,0 +1,55 @@
+<plugin>
+ <name>subparse</name>
+ <description>Subtitle parsing</description>
+ <filename>../../gst/subparse/.libs/libgstsubparse.so</filename>
+ <basename>libgstsubparse.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>ssaparse</name>
+ <longname>SSA Subtitle Parser</longname>
+ <class>Codec/Parser/Subtitle</class>
+ <description>Parses SSA subtitle streams</description>
+ <author>Tim-Philipp Müller &lt;tim centricular net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-ssa; application/x-ass</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>text/x-pango-markup</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>subparse</name>
+ <longname>Subtitle parser</longname>
+ <class>Codec/Parser/Subtitle</class>
+ <description>Parses subtitle (.sub) files into text streams</description>
+ <author>Gustavo J. A. M. Carneiro &lt;gjc@inescporto.pt&gt;, GStreamer maintainers &lt;gstreamer-devel@lists.sourceforge.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>application/x-subtitle; application/x-subtitle-sami; application/x-subtitle-tmplayer; application/x-subtitle-mpl2; application/x-subtitle-dks; application/x-subtitle-qttext</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>text/plain; text/x-pango-markup</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-tcp.xml b/docs/plugins/inspect/plugin-tcp.xml
new file mode 100644
index 0000000..8cb63ca
--- /dev/null
+++ b/docs/plugins/inspect/plugin-tcp.xml
@@ -0,0 +1,88 @@
+<plugin>
+ <name>tcp</name>
+ <description>transfer data over the network via TCP</description>
+ <filename>../../gst/tcp/.libs/libgsttcp.so</filename>
+ <basename>libgsttcp.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>multifdsink</name>
+ <longname>Multi filedescriptor sink</longname>
+ <class>Sink/Network</class>
+ <description>Send data to multiple filedescriptors</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tcpclientsink</name>
+ <longname>TCP client sink</longname>
+ <class>Sink/Network</class>
+ <description>Send data as a client over the network via TCP</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tcpclientsrc</name>
+ <longname>TCP client source</longname>
+ <class>Source/Network</class>
+ <description>Receive data as a client over the network via TCP</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tcpserversink</name>
+ <longname>TCP server sink</longname>
+ <class>Sink/Network</class>
+ <description>Send data as a server over the network via TCP</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tcpserversrc</name>
+ <longname>TCP server source</longname>
+ <class>Source/Network</class>
+ <description>Receive data as a server over the network via TCP</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-theora.xml b/docs/plugins/inspect/plugin-theora.xml
new file mode 100644
index 0000000..4563c60
--- /dev/null
+++ b/docs/plugins/inspect/plugin-theora.xml
@@ -0,0 +1,76 @@
+<plugin>
+ <name>theora</name>
+ <description>Theora plugin library</description>
+ <filename>../../ext/theora/.libs/libgsttheora.so</filename>
+ <basename>libgsttheora.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>theoradec</name>
+ <longname>Theora video decoder</longname>
+ <class>Codec/Decoder/Video</class>
+ <description>decode raw theora streams to raw YUV video</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-theora</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv, format=(fourcc){ I420, Y42B, Y444 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>theoraenc</name>
+ <longname>Theora video encoder</longname>
+ <class>Codec/Encoder/Video</class>
+ <description>encode raw YUV video to a theora stream</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv, format=(fourcc){ I420, Y42B, Y444 }, framerate=(fraction)[ 1/2147483647, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-theora</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>theoraparse</name>
+ <longname>Theora video parser</longname>
+ <class>Codec/Parser/Video</class>
+ <description>parse raw theora streams</description>
+ <author>Andy Wingo &lt;wingo@pobox.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-theora</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-theora</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-typefindfunctions.xml b/docs/plugins/inspect/plugin-typefindfunctions.xml
new file mode 100644
index 0000000..f2d430d
--- /dev/null
+++ b/docs/plugins/inspect/plugin-typefindfunctions.xml
@@ -0,0 +1,13 @@
+<plugin>
+ <name>typefindfunctions</name>
+ <description>default typefind functions</description>
+ <filename>../../gst/typefind/.libs/libgsttypefindfunctions.so</filename>
+ <basename>libgsttypefindfunctions.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-uridecodebin.xml b/docs/plugins/inspect/plugin-uridecodebin.xml
new file mode 100644
index 0000000..87ec73d
--- /dev/null
+++ b/docs/plugins/inspect/plugin-uridecodebin.xml
@@ -0,0 +1,49 @@
+<plugin>
+ <name>uridecodebin</name>
+ <description>URI Decoder bin</description>
+ <filename>../../gst/playback/.libs/libgstdecodebin2.so</filename>
+ <basename>libgstdecodebin2.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>decodebin2</name>
+ <longname>Decoder Bin</longname>
+ <class>Generic/Bin/Decoder</class>
+ <description>Autoplug and decode to raw media</description>
+ <author>Edward Hervey &lt;edward.hervey@collabora.co.uk&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src%d</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>uridecodebin</name>
+ <longname>URI Decoder</longname>
+ <class>Generic/Bin/Decoder</class>
+ <description>Autoplug and decode an URI to raw media</description>
+ <author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>src%d</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-videorate.xml b/docs/plugins/inspect/plugin-videorate.xml
new file mode 100644
index 0000000..df79cae
--- /dev/null
+++ b/docs/plugins/inspect/plugin-videorate.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>videorate</name>
+ <description>Adjusts video frames</description>
+ <filename>../../gst/videorate/.libs/libgstvideorate.so</filename>
+ <basename>libgstvideorate.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>videorate</name>
+ <longname>Video rate adjuster</longname>
+ <class>Filter/Effect/Video</class>
+ <description>Drops/duplicates/adjusts timestamps on video frames to make a perfect stream</description>
+ <author>Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray; image/jpeg; image/png</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray; image/jpeg; image/png</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-videoscale.xml b/docs/plugins/inspect/plugin-videoscale.xml
new file mode 100644
index 0000000..af87c24
--- /dev/null
+++ b/docs/plugins/inspect/plugin-videoscale.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>videoscale</name>
+ <description>Resizes video</description>
+ <filename>../../gst/videoscale/.libs/libgstvideoscale.so</filename>
+ <basename>libgstvideoscale.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>videoscale</name>
+ <longname>Video scaler</longname>
+ <class>Filter/Converter/Video/Scaler</class>
+ <description>Resizes video</description>
+ <author>Wim Taymans &lt;wim.taymans@chello.be&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-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 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)v308, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y16 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y8 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)GREY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AY64, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)v308, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y16 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y8 , width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)GREY, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AY64, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ], 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, 32767 ], height=(int)[ 1, 32767 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-videotestsrc.xml b/docs/plugins/inspect/plugin-videotestsrc.xml
new file mode 100644
index 0000000..73a26d0
--- /dev/null
+++ b/docs/plugins/inspect/plugin-videotestsrc.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>videotestsrc</name>
+ <description>Creates a test video stream</description>
+ <filename>../../gst/videotestsrc/.libs/libgstvideotestsrc.so</filename>
+ <basename>libgstvideotestsrc.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>videotestsrc</name>
+ <longname>Video test source</longname>
+ <class>Source/Video</class>
+ <description>Creates a test video stream</description>
+ <author>David A. Schleef &lt;ds@schleef.org&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>video/x-raw-yuv, format=(fourcc)YUY2, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)v308, color-matrix=(string){ sdtv, hdtv }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, color-matrix=(string){ sdtv, hdtv }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)v210, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)v216, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVP, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AY64, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVU9, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUV9, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV12, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV21, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, color-matrix=(string){ sdtv, hdtv }, chroma-site=(string){ mpeg2, jpeg }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, color-matrix=(string){ sdtv, hdtv }, 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 ]; 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 ]; video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, 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, endianness=(int)4321, depth=(int)24, 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, endianness=(int)4321, depth=(int)24, 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, endianness=(int)4321, depth=(int)24, 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, endianness=(int)4321, depth=(int)32, 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, endianness=(int)4321, depth=(int)32, 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, endianness=(int)4321, depth=(int)32, 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, endianness=(int)4321, depth=(int)32, 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)24, endianness=(int)4321, depth=(int)24, 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, endianness=(int)4321, depth=(int)24, 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)16, endianness=(int)1234, depth=(int)16, 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, endianness=(int)1234, depth=(int)15, 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-rgb, bpp=(int)64, endianness=(int)4321, depth=(int)64, 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-bayer, format=(string)bggr, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-bayer, format=(string)rggb, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-bayer, format=(string)grbg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-bayer, format=(string)gbrg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-volume.xml b/docs/plugins/inspect/plugin-volume.xml
new file mode 100644
index 0000000..02d15ee
--- /dev/null
+++ b/docs/plugins/inspect/plugin-volume.xml
@@ -0,0 +1,34 @@
+<plugin>
+ <name>volume</name>
+ <description>plugin for controlling audio volume</description>
+ <filename>../../gst/volume/.libs/libgstvolume.so</filename>
+ <basename>libgstvolume.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>volume</name>
+ <longname>Volume</longname>
+ <class>Filter/Effect/Audio</class>
+ <description>Set volume on audio/raw streams</description>
+ <author>Andy Wingo &lt;wingo@pobox.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)8, depth=(int)8, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-vorbis.xml b/docs/plugins/inspect/plugin-vorbis.xml
new file mode 100644
index 0000000..3f4f3e4
--- /dev/null
+++ b/docs/plugins/inspect/plugin-vorbis.xml
@@ -0,0 +1,97 @@
+<plugin>
+ <name>vorbis</name>
+ <description>Vorbis plugin library</description>
+ <filename>../../ext/vorbis/.libs/libgstvorbis.so</filename>
+ <basename>libgstvorbis.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>vorbisdec</name>
+ <longname>Vorbis audio decoder</longname>
+ <class>Codec/Decoder/Audio</class>
+ <description>decode raw vorbis streams to float audio</description>
+ <author>Benjamin Otte &lt;otte@gnome.org&gt;, Chris Lord &lt;chris@openedhand.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 256 ], endianness=(int)1234, width=(int)32</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>vorbisenc</name>
+ <longname>Vorbis audio encoder</longname>
+ <class>Codec/Encoder/Audio</class>
+ <description>Encodes audio in Vorbis format</description>
+ <author>Monty &lt;monty@xiph.org&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-raw-float, rate=(int)[ 1, 200000 ], channels=(int)[ 1, 256 ], endianness=(int)1234, width=(int)32</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>vorbisparse</name>
+ <longname>VorbisParse</longname>
+ <class>Codec/Parser/Audio</class>
+ <description>parse raw vorbis streams</description>
+ <author>Thomas Vander Stichele &lt;thomas at apestaart dot org&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>vorbistag</name>
+ <longname>VorbisTag</longname>
+ <class>Formatter/Metadata</class>
+ <description>Retags vorbis streams</description>
+ <author>James Livingston &lt;doclivingston@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>audio/x-vorbis</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-ximagesink.xml b/docs/plugins/inspect/plugin-ximagesink.xml
new file mode 100644
index 0000000..58dbc00
--- /dev/null
+++ b/docs/plugins/inspect/plugin-ximagesink.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>ximagesink</name>
+ <description>X11 video output element based on standard Xlib calls</description>
+ <filename>../../sys/ximage/.libs/libgstximagesink.so</filename>
+ <basename>libgstximagesink.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>ximagesink</name>
+ <longname>Video sink</longname>
+ <class>Sink/Video</class>
+ <description>A standard X based videosink</description>
+ <author>Julien Moutte &lt;julien@moutte.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-xvimagesink.xml b/docs/plugins/inspect/plugin-xvimagesink.xml
new file mode 100644
index 0000000..a72b6a9
--- /dev/null
+++ b/docs/plugins/inspect/plugin-xvimagesink.xml
@@ -0,0 +1,28 @@
+<plugin>
+ <name>xvimagesink</name>
+ <description>XFree86 video output plugin using Xv extension</description>
+ <filename>../../sys/xvimage/.libs/libgstxvimagesink.so</filename>
+ <basename>libgstxvimagesink.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gst-plugins-base</source>
+ <package>GStreamer Base Plug-ins git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>xvimagesink</name>
+ <longname>Video sink</longname>
+ <class>Sink/Video</class>
+ <description>A Xv based videosink</description>
+ <author>Julien Moutte &lt;julien@moutte.net&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/scanobj-build.stamp b/docs/plugins/scanobj-build.stamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/plugins/scanobj-build.stamp
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 @@
+<!ENTITY GST_MAJORMINOR "@GST_MAJORMINOR@">
+<!ENTITY GST_VERSION "@VERSION@">
diff --git a/ext/Makefile.am b/ext/Makefile.am
new file mode 100644
index 0000000..f793d4b
--- /dev/null
+++ b/ext/Makefile.am
@@ -0,0 +1,77 @@
+if USE_ALSA
+ALSA_DIR=alsa
+else
+ALSA_DIR=
+endif
+
+if USE_CDPARANOIA
+CDPARANOIA_DIR=cdparanoia
+else
+CDPARANOIA_DIR=
+endif
+
+if USE_GIO
+GIO_DIR=gio
+else
+GIO_DIR=
+endif
+
+if USE_LIBVISUAL
+LIBVISUAL_DIR=libvisual
+else
+LIBVISUAL_DIR=
+endif
+
+if USE_OGG
+OGG_DIR=ogg
+else
+OGG_DIR=
+endif
+
+if USE_PANGO
+PANGO_DIR = pango
+else
+PANGO_DIR =
+endif
+
+if USE_VORBIS
+VORBIS_DIR=vorbis
+endif
+
+if USE_IVORBIS
+VORBIS_DIR=vorbis
+endif
+
+if !USE_VORBIS
+if !USE_IVORBIS
+VORBIS_DIR=
+endif
+endif
+
+if USE_THEORA
+THEORA_DIR=theora
+else
+THEORA_DIR=
+endif
+
+SUBDIRS = \
+ $(ALSA_DIR) \
+ $(CDPARANOIA_DIR) \
+ $(GIO_DIR) \
+ $(LIBVISUAL_DIR) \
+ $(OGG_DIR) \
+ $(PANGO_DIR) \
+ $(THEORA_DIR) \
+ $(VORBIS_DIR)
+
+DIST_SUBDIRS = \
+ alsa \
+ cdparanoia \
+ gio \
+ libvisual \
+ ogg \
+ pango \
+ theora \
+ vorbis
+
+include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/ext/Makefile.in b/ext/Makefile.in
new file mode 100644
index 0000000..bc731d5
--- /dev/null
+++ b/ext/Makefile.in
@@ -0,0 +1,809 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_ALSA_FALSE@ALSA_DIR =
+@USE_ALSA_TRUE@ALSA_DIR = alsa
+@USE_CDPARANOIA_FALSE@CDPARANOIA_DIR =
+@USE_CDPARANOIA_TRUE@CDPARANOIA_DIR = cdparanoia
+@USE_GIO_FALSE@GIO_DIR =
+@USE_GIO_TRUE@GIO_DIR = gio
+@USE_LIBVISUAL_FALSE@LIBVISUAL_DIR =
+@USE_LIBVISUAL_TRUE@LIBVISUAL_DIR = libvisual
+@USE_OGG_FALSE@OGG_DIR =
+@USE_OGG_TRUE@OGG_DIR = ogg
+@USE_PANGO_FALSE@PANGO_DIR =
+@USE_PANGO_TRUE@PANGO_DIR = pango
+@USE_IVORBIS_FALSE@@USE_VORBIS_FALSE@VORBIS_DIR =
+@USE_IVORBIS_TRUE@VORBIS_DIR = vorbis
+@USE_VORBIS_TRUE@VORBIS_DIR = vorbis
+@USE_THEORA_FALSE@THEORA_DIR =
+@USE_THEORA_TRUE@THEORA_DIR = theora
+SUBDIRS = \
+ $(ALSA_DIR) \
+ $(CDPARANOIA_DIR) \
+ $(GIO_DIR) \
+ $(LIBVISUAL_DIR) \
+ $(OGG_DIR) \
+ $(PANGO_DIR) \
+ $(THEORA_DIR) \
+ $(VORBIS_DIR)
+
+DIST_SUBDIRS = \
+ alsa \
+ cdparanoia \
+ gio \
+ libvisual \
+ ogg \
+ pango \
+ theora \
+ vorbis
+
+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_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/alsa/Makefile.am b/ext/alsa/Makefile.am
new file mode 100644
index 0000000..38cde48
--- /dev/null
+++ b/ext/alsa/Makefile.am
@@ -0,0 +1,36 @@
+plugin_LTLIBRARIES = libgstalsa.la
+
+libgstalsa_la_SOURCES = \
+ gstalsadeviceprobe.c \
+ gstalsamixer.c \
+ gstalsamixerelement.c \
+ gstalsamixertrack.c \
+ gstalsamixeroptions.c \
+ gstalsaplugin.c \
+ gstalsasink.c \
+ gstalsasrc.c \
+ gstalsa.c
+
+libgstalsa_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ALSA_CFLAGS)
+libgstalsa_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(ALSA_LIBS)
+
+libgstalsa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstalsa_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstalsa.h \
+ gstalsadeviceprobe.h \
+ gstalsamixer.h \
+ gstalsamixerelement.h \
+ gstalsamixertrack.h \
+ gstalsamixeroptions.h \
+ gstalsasrc.h \
+ gstalsasink.h
diff --git a/ext/alsa/Makefile.in b/ext/alsa/Makefile.in
new file mode 100644
index 0000000..794c763
--- /dev/null
+++ b/ext/alsa/Makefile.in
@@ -0,0 +1,863 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/alsa
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstalsa_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstalsa_la_OBJECTS = libgstalsa_la-gstalsadeviceprobe.lo \
+ libgstalsa_la-gstalsamixer.lo \
+ libgstalsa_la-gstalsamixerelement.lo \
+ libgstalsa_la-gstalsamixertrack.lo \
+ libgstalsa_la-gstalsamixeroptions.lo \
+ libgstalsa_la-gstalsaplugin.lo libgstalsa_la-gstalsasink.lo \
+ libgstalsa_la-gstalsasrc.lo libgstalsa_la-gstalsa.lo
+libgstalsa_la_OBJECTS = $(am_libgstalsa_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstalsa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstalsa_la_CFLAGS) $(CFLAGS) \
+ $(libgstalsa_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstalsa_la_SOURCES)
+DIST_SOURCES = $(libgstalsa_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstalsa.la
+libgstalsa_la_SOURCES = \
+ gstalsadeviceprobe.c \
+ gstalsamixer.c \
+ gstalsamixerelement.c \
+ gstalsamixertrack.c \
+ gstalsamixeroptions.c \
+ gstalsaplugin.c \
+ gstalsasink.c \
+ gstalsasrc.c \
+ gstalsa.c
+
+libgstalsa_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ALSA_CFLAGS)
+
+libgstalsa_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(ALSA_LIBS)
+
+libgstalsa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstalsa_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstalsa.h \
+ gstalsadeviceprobe.h \
+ gstalsamixer.h \
+ gstalsamixerelement.h \
+ gstalsamixertrack.h \
+ gstalsamixeroptions.h \
+ gstalsasrc.h \
+ gstalsasink.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/alsa/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/alsa/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
+libgstalsa.la: $(libgstalsa_la_OBJECTS) $(libgstalsa_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstalsa_la_LINK) -rpath $(plugindir) $(libgstalsa_la_OBJECTS) $(libgstalsa_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsa.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsadeviceprobe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsamixer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsamixerelement.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsamixeroptions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsamixertrack.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsaplugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsasink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalsa_la-gstalsasrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstalsa_la-gstalsadeviceprobe.lo: gstalsadeviceprobe.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsadeviceprobe.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsadeviceprobe.Tpo -c -o libgstalsa_la-gstalsadeviceprobe.lo `test -f 'gstalsadeviceprobe.c' || echo '$(srcdir)/'`gstalsadeviceprobe.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsadeviceprobe.Tpo $(DEPDIR)/libgstalsa_la-gstalsadeviceprobe.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsadeviceprobe.c' object='libgstalsa_la-gstalsadeviceprobe.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsadeviceprobe.lo `test -f 'gstalsadeviceprobe.c' || echo '$(srcdir)/'`gstalsadeviceprobe.c
+
+libgstalsa_la-gstalsamixer.lo: gstalsamixer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsamixer.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsamixer.Tpo -c -o libgstalsa_la-gstalsamixer.lo `test -f 'gstalsamixer.c' || echo '$(srcdir)/'`gstalsamixer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsamixer.Tpo $(DEPDIR)/libgstalsa_la-gstalsamixer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsamixer.c' object='libgstalsa_la-gstalsamixer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsamixer.lo `test -f 'gstalsamixer.c' || echo '$(srcdir)/'`gstalsamixer.c
+
+libgstalsa_la-gstalsamixerelement.lo: gstalsamixerelement.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsamixerelement.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsamixerelement.Tpo -c -o libgstalsa_la-gstalsamixerelement.lo `test -f 'gstalsamixerelement.c' || echo '$(srcdir)/'`gstalsamixerelement.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsamixerelement.Tpo $(DEPDIR)/libgstalsa_la-gstalsamixerelement.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsamixerelement.c' object='libgstalsa_la-gstalsamixerelement.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsamixerelement.lo `test -f 'gstalsamixerelement.c' || echo '$(srcdir)/'`gstalsamixerelement.c
+
+libgstalsa_la-gstalsamixertrack.lo: gstalsamixertrack.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsamixertrack.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsamixertrack.Tpo -c -o libgstalsa_la-gstalsamixertrack.lo `test -f 'gstalsamixertrack.c' || echo '$(srcdir)/'`gstalsamixertrack.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsamixertrack.Tpo $(DEPDIR)/libgstalsa_la-gstalsamixertrack.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsamixertrack.c' object='libgstalsa_la-gstalsamixertrack.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsamixertrack.lo `test -f 'gstalsamixertrack.c' || echo '$(srcdir)/'`gstalsamixertrack.c
+
+libgstalsa_la-gstalsamixeroptions.lo: gstalsamixeroptions.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsamixeroptions.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsamixeroptions.Tpo -c -o libgstalsa_la-gstalsamixeroptions.lo `test -f 'gstalsamixeroptions.c' || echo '$(srcdir)/'`gstalsamixeroptions.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsamixeroptions.Tpo $(DEPDIR)/libgstalsa_la-gstalsamixeroptions.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsamixeroptions.c' object='libgstalsa_la-gstalsamixeroptions.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsamixeroptions.lo `test -f 'gstalsamixeroptions.c' || echo '$(srcdir)/'`gstalsamixeroptions.c
+
+libgstalsa_la-gstalsaplugin.lo: gstalsaplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsaplugin.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsaplugin.Tpo -c -o libgstalsa_la-gstalsaplugin.lo `test -f 'gstalsaplugin.c' || echo '$(srcdir)/'`gstalsaplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsaplugin.Tpo $(DEPDIR)/libgstalsa_la-gstalsaplugin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsaplugin.c' object='libgstalsa_la-gstalsaplugin.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsaplugin.lo `test -f 'gstalsaplugin.c' || echo '$(srcdir)/'`gstalsaplugin.c
+
+libgstalsa_la-gstalsasink.lo: gstalsasink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsasink.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsasink.Tpo -c -o libgstalsa_la-gstalsasink.lo `test -f 'gstalsasink.c' || echo '$(srcdir)/'`gstalsasink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsasink.Tpo $(DEPDIR)/libgstalsa_la-gstalsasink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsasink.c' object='libgstalsa_la-gstalsasink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsasink.lo `test -f 'gstalsasink.c' || echo '$(srcdir)/'`gstalsasink.c
+
+libgstalsa_la-gstalsasrc.lo: gstalsasrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsasrc.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsasrc.Tpo -c -o libgstalsa_la-gstalsasrc.lo `test -f 'gstalsasrc.c' || echo '$(srcdir)/'`gstalsasrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsasrc.Tpo $(DEPDIR)/libgstalsa_la-gstalsasrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsasrc.c' object='libgstalsa_la-gstalsasrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsasrc.lo `test -f 'gstalsasrc.c' || echo '$(srcdir)/'`gstalsasrc.c
+
+libgstalsa_la-gstalsa.lo: gstalsa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -MT libgstalsa_la-gstalsa.lo -MD -MP -MF $(DEPDIR)/libgstalsa_la-gstalsa.Tpo -c -o libgstalsa_la-gstalsa.lo `test -f 'gstalsa.c' || echo '$(srcdir)/'`gstalsa.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalsa_la-gstalsa.Tpo $(DEPDIR)/libgstalsa_la-gstalsa.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstalsa.c' object='libgstalsa_la-gstalsa.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalsa_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalsa_la_CFLAGS) $(CFLAGS) -c -o libgstalsa_la-gstalsa.lo `test -f 'gstalsa.c' || echo '$(srcdir)/'`gstalsa.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/alsa/gstalsa.c b/ext/alsa/gstalsa.c
new file mode 100644
index 0000000..60f3f3e
--- /dev/null
+++ b/ext/alsa/gstalsa.c
@@ -0,0 +1,578 @@
+/* Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "gstalsa.h"
+
+#include <gst/audio/audio.h>
+
+static GstCaps *
+gst_alsa_detect_rates (GstObject * obj, snd_pcm_hw_params_t * hw_params,
+ GstCaps * in_caps)
+{
+ GstCaps *caps;
+ guint min, max;
+ gint err, dir, min_rate, max_rate, i;
+
+ GST_LOG_OBJECT (obj, "probing sample rates ...");
+
+ if ((err = snd_pcm_hw_params_get_rate_min (hw_params, &min, &dir)) < 0)
+ goto min_rate_err;
+
+ if ((err = snd_pcm_hw_params_get_rate_max (hw_params, &max, &dir)) < 0)
+ goto max_rate_err;
+
+ min_rate = min;
+ max_rate = max;
+
+ if (min_rate < 4000)
+ min_rate = 4000; /* random 'sensible minimum' */
+
+ if (max_rate <= 0)
+ max_rate = G_MAXINT; /* or maybe just use 192400 or so? */
+ else if (max_rate > 0 && max_rate < 4000)
+ max_rate = MAX (4000, min_rate);
+
+ GST_DEBUG_OBJECT (obj, "Min. rate = %u (%d)", min_rate, min);
+ GST_DEBUG_OBJECT (obj, "Max. rate = %u (%d)", max_rate, max);
+
+ caps = gst_caps_make_writable (in_caps);
+
+ for (i = 0; i < gst_caps_get_size (caps); ++i) {
+ GstStructure *s;
+
+ s = gst_caps_get_structure (caps, i);
+ if (min_rate == max_rate) {
+ gst_structure_set (s, "rate", G_TYPE_INT, min_rate, NULL);
+ } else {
+ gst_structure_set (s, "rate", GST_TYPE_INT_RANGE,
+ min_rate, max_rate, NULL);
+ }
+ }
+
+ return caps;
+
+ /* ERRORS */
+min_rate_err:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query minimum sample rate: %s",
+ snd_strerror (err));
+ gst_caps_unref (in_caps);
+ return NULL;
+ }
+max_rate_err:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query maximum sample rate: %s",
+ snd_strerror (err));
+ gst_caps_unref (in_caps);
+ return NULL;
+ }
+}
+
+static const struct
+{
+ const int width;
+ const int depth;
+ const int sformat;
+ const int uformat;
+} pcmformats[] = {
+ {
+ 8, 8, SND_PCM_FORMAT_S8, SND_PCM_FORMAT_U8}, {
+ 16, 16, SND_PCM_FORMAT_S16, SND_PCM_FORMAT_U16}, {
+ 32, 24, SND_PCM_FORMAT_S24, SND_PCM_FORMAT_U24}, {
+#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) /* no endian-unspecific enum available */
+ 24, 24, SND_PCM_FORMAT_S24_3LE, SND_PCM_FORMAT_U24_3LE}, {
+#else
+ 24, 24, SND_PCM_FORMAT_S24_3BE, SND_PCM_FORMAT_U24_3BE}, {
+#endif
+ 32, 32, SND_PCM_FORMAT_S32, SND_PCM_FORMAT_U32}
+};
+
+static GstCaps *
+gst_alsa_detect_formats (GstObject * obj, snd_pcm_hw_params_t * hw_params,
+ GstCaps * in_caps)
+{
+ snd_pcm_format_mask_t *mask;
+ GstStructure *s;
+ GstCaps *caps;
+ gint i;
+
+ snd_pcm_format_mask_malloc (&mask);
+ snd_pcm_hw_params_get_format_mask (hw_params, mask);
+
+ caps = gst_caps_new_empty ();
+
+ for (i = 0; i < gst_caps_get_size (in_caps); ++i) {
+ GstStructure *scopy;
+ const gchar *str;
+ GstAudioFormat format;
+ const GstAudioFormatInfo *finfo;
+ gint w, width = 0, depth = 0;
+
+ s = gst_caps_get_structure (in_caps, i);
+ if (!gst_structure_has_name (s, "audio/x-raw")) {
+ GST_WARNING_OBJECT (obj, "skipping non-raw format");
+ continue;
+ }
+
+ str = gst_structure_get_string (s, "format");
+ if (str == NULL)
+ continue;
+
+ format = gst_audio_format_from_string (str);
+ if (format == GST_AUDIO_FORMAT_UNKNOWN)
+ continue;
+
+ finfo = gst_audio_format_get_info (format);
+
+ width = GST_AUDIO_FORMAT_INFO_WIDTH (finfo);
+ depth = GST_AUDIO_FORMAT_INFO_DEPTH (finfo);
+
+ for (w = 0; w < G_N_ELEMENTS (pcmformats); w++)
+ if (pcmformats[w].width == width && pcmformats[w].depth == depth)
+ break;
+ if (w == G_N_ELEMENTS (pcmformats))
+ continue; /* Unknown format */
+
+ if (snd_pcm_format_mask_test (mask, pcmformats[w].sformat) &&
+ snd_pcm_format_mask_test (mask, pcmformats[w].uformat)) {
+ scopy = gst_structure_copy (s);
+ } else if (snd_pcm_format_mask_test (mask, pcmformats[w].sformat)) {
+ scopy = gst_structure_copy (s);
+ /* FIXME, remove unsigned version */
+ } else if (snd_pcm_format_mask_test (mask, pcmformats[w].uformat)) {
+ scopy = gst_structure_copy (s);
+ /* FIXME, remove signed version */
+ } else {
+ scopy = NULL;
+ }
+ if (scopy) {
+ gst_caps_append_structure (caps, scopy);
+ }
+ }
+
+ snd_pcm_format_mask_free (mask);
+ gst_caps_unref (in_caps);
+ return caps;
+}
+
+/* we don't have channel mappings for more than this many channels */
+#define GST_ALSA_MAX_CHANNELS 8
+
+static GstStructure *
+get_channel_free_structure (const GstStructure * in_structure)
+{
+ GstStructure *s = gst_structure_copy (in_structure);
+
+ gst_structure_remove_field (s, "channels");
+ return s;
+}
+
+static void
+caps_add_channel_configuration (GstCaps * caps,
+ const GstStructure * in_structure, gint min_chans, gint max_chans)
+{
+ GstAudioChannelPosition pos[8] = {
+ 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
+ };
+ GstStructure *s = NULL;
+ gint c;
+
+ if (min_chans == max_chans && max_chans <= 2) {
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", G_TYPE_INT, max_chans, NULL);
+ gst_caps_append_structure (caps, s);
+ return;
+ }
+
+ g_assert (min_chans >= 1);
+
+ /* mono and stereo don't need channel configurations */
+ if (min_chans == 2) {
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", G_TYPE_INT, 2, NULL);
+ gst_caps_append_structure (caps, s);
+ } else if (min_chans == 1 && max_chans >= 2) {
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL);
+ gst_caps_append_structure (caps, s);
+ }
+
+ /* don't know whether to use 2.1 or 3.0 here - but I suspect
+ * alsa might work around that/fix it somehow. Can we tell alsa
+ * what our channel layout is like? */
+ if (max_chans >= 3 && min_chans <= 3) {
+ GstAudioChannelPosition pos_21[3] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE
+ };
+
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", G_TYPE_INT, 3, NULL);
+ gst_audio_set_channel_positions (s, pos_21);
+ gst_caps_append_structure (caps, s);
+ }
+
+ /* everything else (4, 6, 8 channels) needs a channel layout */
+ for (c = MAX (4, min_chans); c <= 8; c += 2) {
+ if (max_chans >= c) {
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", G_TYPE_INT, c, NULL);
+ gst_audio_set_channel_positions (s, pos);
+ gst_caps_append_structure (caps, s);
+ }
+ }
+
+ for (c = MAX (9, min_chans); c <= max_chans; ++c) {
+ GstAudioChannelPosition *ch_layout;
+ guint i;
+
+ ch_layout = g_new (GstAudioChannelPosition, c);
+ for (i = 0; i < c; ++i) {
+ ch_layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
+ }
+ s = get_channel_free_structure (in_structure);
+ gst_structure_set (s, "channels", G_TYPE_INT, c, NULL);
+ gst_audio_set_channel_positions (s, ch_layout);
+ gst_caps_append_structure (caps, s);
+ g_free (ch_layout);
+ }
+}
+
+static GstCaps *
+gst_alsa_detect_channels (GstObject * obj, snd_pcm_hw_params_t * hw_params,
+ GstCaps * in_caps)
+{
+ GstCaps *caps;
+ guint min, max;
+ gint min_chans, max_chans;
+ gint err, i;
+
+ GST_LOG_OBJECT (obj, "probing channels ...");
+
+ if ((err = snd_pcm_hw_params_get_channels_min (hw_params, &min)) < 0)
+ goto min_chan_error;
+
+ if ((err = snd_pcm_hw_params_get_channels_max (hw_params, &max)) < 0)
+ goto max_chan_error;
+
+ /* note: the above functions may return (guint) -1 */
+ min_chans = min;
+ max_chans = max;
+
+ if (min_chans < 0) {
+ min_chans = 1;
+ max_chans = GST_ALSA_MAX_CHANNELS;
+ } else if (max_chans < 0) {
+ max_chans = GST_ALSA_MAX_CHANNELS;
+ }
+
+ if (min_chans > max_chans) {
+ gint temp;
+
+ GST_WARNING_OBJECT (obj, "minimum channels > maximum channels (%d > %d), "
+ "please fix your soundcard drivers", min, max);
+ temp = min_chans;
+ min_chans = max_chans;
+ max_chans = temp;
+ }
+
+ /* pro cards seem to return large numbers for min_channels */
+ if (min_chans > GST_ALSA_MAX_CHANNELS) {
+ GST_DEBUG_OBJECT (obj, "min_chans = %u, looks like a pro card", min_chans);
+ if (max_chans < min_chans) {
+ max_chans = min_chans;
+ } else {
+ /* only support [max_chans; max_chans] for these cards for now
+ * to avoid inflating the source caps with loads of structures ... */
+ min_chans = max_chans;
+ }
+ } else {
+ min_chans = MAX (min_chans, 1);
+ max_chans = MIN (GST_ALSA_MAX_CHANNELS, max_chans);
+ }
+
+ GST_DEBUG_OBJECT (obj, "Min. channels = %d (%d)", min_chans, min);
+ GST_DEBUG_OBJECT (obj, "Max. channels = %d (%d)", max_chans, max);
+
+ caps = gst_caps_new_empty ();
+
+ for (i = 0; i < gst_caps_get_size (in_caps); ++i) {
+ GstStructure *s;
+ GType field_type;
+ gint c_min = min_chans;
+ gint c_max = max_chans;
+
+ s = gst_caps_get_structure (in_caps, i);
+ /* the template caps might limit the number of channels (like alsasrc),
+ * in which case we don't want to return a superset, so hack around this
+ * for the two common cases where the channels are either a fixed number
+ * or a min/max range). Example: alsasrc template has channels = [1,2] and
+ * the detection will claim to support 8 channels for device 'plughw:0' */
+ field_type = gst_structure_get_field_type (s, "channels");
+ if (field_type == G_TYPE_INT) {
+ gst_structure_get_int (s, "channels", &c_min);
+ gst_structure_get_int (s, "channels", &c_max);
+ } else if (field_type == GST_TYPE_INT_RANGE) {
+ const GValue *val;
+
+ val = gst_structure_get_value (s, "channels");
+ c_min = CLAMP (gst_value_get_int_range_min (val), min_chans, max_chans);
+ c_max = CLAMP (gst_value_get_int_range_max (val), min_chans, max_chans);
+ } else {
+ c_min = min_chans;
+ c_max = max_chans;
+ }
+
+ caps_add_channel_configuration (caps, s, c_min, c_max);
+ }
+
+ gst_caps_unref (in_caps);
+
+ return caps;
+
+ /* ERRORS */
+min_chan_error:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query minimum channel count: %s",
+ snd_strerror (err));
+ return NULL;
+ }
+max_chan_error:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query maximum channel count: %s",
+ snd_strerror (err));
+ return NULL;
+ }
+}
+
+snd_pcm_t *
+gst_alsa_open_iec958_pcm (GstObject * obj)
+{
+ char *iec958_pcm_name = NULL;
+ snd_pcm_t *pcm = NULL;
+ int res;
+ char devstr[256]; /* Storage for local 'default' device string */
+
+ /*
+ * Try and open our default iec958 device. Fall back to searching on card x
+ * if this fails, which should only happen on older alsa setups
+ */
+
+ /* The string will be one of these:
+ * SPDIF_CON: Non-audio flag not set:
+ * spdif:{AES0 0x0 AES1 0x82 AES2 0x0 AES3 0x2}
+ * SPDIF_CON: Non-audio flag set:
+ * spdif:{AES0 0x2 AES1 0x82 AES2 0x0 AES3 0x2}
+ */
+ sprintf (devstr,
+ "iec958:{AES0 0x%02x AES1 0x%02x AES2 0x%02x AES3 0x%02x}",
+ IEC958_AES0_CON_EMPHASIS_NONE | IEC958_AES0_NONAUDIO,
+ IEC958_AES1_CON_ORIGINAL | IEC958_AES1_CON_PCM_CODER,
+ 0, IEC958_AES3_CON_FS_48000);
+
+ GST_DEBUG_OBJECT (obj, "Generated device string \"%s\"", devstr);
+ iec958_pcm_name = devstr;
+
+ res = snd_pcm_open (&pcm, iec958_pcm_name, SND_PCM_STREAM_PLAYBACK, 0);
+ if (G_UNLIKELY (res < 0)) {
+ GST_DEBUG_OBJECT (obj, "failed opening IEC958 device: %s",
+ snd_strerror (res));
+ pcm = NULL;
+ }
+
+ return pcm;
+}
+
+
+/*
+ * gst_alsa_probe_supported_formats:
+ *
+ * Takes the template caps and returns the subset which is actually
+ * supported by this device.
+ *
+ */
+
+GstCaps *
+gst_alsa_probe_supported_formats (GstObject * obj, snd_pcm_t * handle,
+ const GstCaps * template_caps)
+{
+ snd_pcm_hw_params_t *hw_params;
+ snd_pcm_stream_t stream_type;
+ GstCaps *caps;
+ gint err;
+
+ snd_pcm_hw_params_malloc (&hw_params);
+ if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0)
+ goto error;
+
+ stream_type = snd_pcm_stream (handle);
+
+ caps = gst_caps_copy (template_caps);
+
+ if (!(caps = gst_alsa_detect_formats (obj, hw_params, caps)))
+ goto subroutine_error;
+
+ if (!(caps = gst_alsa_detect_rates (obj, hw_params, caps)))
+ goto subroutine_error;
+
+ if (!(caps = gst_alsa_detect_channels (obj, hw_params, caps)))
+ goto subroutine_error;
+
+ /* Try opening IEC958 device to see if we can support that format (playback
+ * only for now but we could add SPDIF capture later) */
+ if (stream_type == SND_PCM_STREAM_PLAYBACK) {
+ snd_pcm_t *pcm = gst_alsa_open_iec958_pcm (obj);
+
+ if (G_LIKELY (pcm)) {
+ gst_caps_append (caps, gst_caps_new_simple ("audio/x-iec958", NULL));
+ snd_pcm_close (pcm);
+ }
+ }
+
+ snd_pcm_hw_params_free (hw_params);
+ return caps;
+
+ /* ERRORS */
+error:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query formats: %s", snd_strerror (err));
+ snd_pcm_hw_params_free (hw_params);
+ return NULL;
+ }
+subroutine_error:
+ {
+ GST_ERROR_OBJECT (obj, "failed to query formats");
+ snd_pcm_hw_params_free (hw_params);
+ return NULL;
+ }
+}
+
+/* returns the card name when the device number is unknown or -1 */
+static gchar *
+gst_alsa_find_device_name_no_handle (GstObject * obj, const gchar * devcard,
+ gint device_num, snd_pcm_stream_t stream)
+{
+ snd_ctl_card_info_t *info = NULL;
+ snd_ctl_t *ctl = NULL;
+ gchar *ret = NULL;
+ gint dev = -1;
+
+ GST_LOG_OBJECT (obj, "[%s] device=%d", devcard, device_num);
+
+ if (snd_ctl_open (&ctl, devcard, 0) < 0)
+ return NULL;
+
+ snd_ctl_card_info_malloc (&info);
+ if (snd_ctl_card_info (ctl, info) < 0)
+ goto done;
+
+ if (device_num != -1) {
+ while (snd_ctl_pcm_next_device (ctl, &dev) == 0 && dev >= 0) {
+ if (dev == device_num) {
+ snd_pcm_info_t *pcminfo;
+
+ snd_pcm_info_malloc (&pcminfo);
+ snd_pcm_info_set_device (pcminfo, dev);
+ snd_pcm_info_set_subdevice (pcminfo, 0);
+ snd_pcm_info_set_stream (pcminfo, stream);
+ if (snd_ctl_pcm_info (ctl, pcminfo) < 0) {
+ snd_pcm_info_free (pcminfo);
+ break;
+ }
+
+ ret = (gchar *) snd_pcm_info_get_name (pcminfo);
+ if (ret) {
+ ret = g_strdup (ret);
+ GST_LOG_OBJECT (obj, "name from pcminfo: %s", ret);
+ }
+ snd_pcm_info_free (pcminfo);
+ if (ret)
+ break;
+ }
+ }
+ }
+
+ if (ret == NULL) {
+ char *name = NULL;
+ gint card;
+
+ GST_LOG_OBJECT (obj, "trying card name");
+ card = snd_ctl_card_info_get_card (info);
+ snd_card_get_name (card, &name);
+ ret = g_strdup (name);
+ free (name);
+ }
+
+done:
+ snd_ctl_card_info_free (info);
+ snd_ctl_close (ctl);
+
+ return ret;
+}
+
+gchar *
+gst_alsa_find_card_name (GstObject * obj, const gchar * devcard,
+ snd_pcm_stream_t stream)
+{
+ return gst_alsa_find_device_name_no_handle (obj, devcard, -1, stream);
+}
+
+gchar *
+gst_alsa_find_device_name (GstObject * obj, const gchar * device,
+ snd_pcm_t * handle, snd_pcm_stream_t stream)
+{
+ gchar *ret = NULL;
+
+ if (device != NULL) {
+ gchar *dev, *comma;
+ gint devnum;
+
+ GST_LOG_OBJECT (obj, "Trying to get device name from string '%s'", device);
+
+ /* only want name:card bit, but not devices and subdevices */
+ dev = g_strdup (device);
+ if ((comma = strchr (dev, ','))) {
+ *comma = '\0';
+ devnum = atoi (comma + 1);
+ ret = gst_alsa_find_device_name_no_handle (obj, dev, devnum, stream);
+ }
+ g_free (dev);
+ }
+
+ if (ret == NULL && handle != NULL) {
+ snd_pcm_info_t *info;
+
+ GST_LOG_OBJECT (obj, "Trying to get device name from open handle");
+ snd_pcm_info_malloc (&info);
+ snd_pcm_info (handle, info);
+ ret = g_strdup (snd_pcm_info_get_name (info));
+ snd_pcm_info_free (info);
+ }
+
+ GST_LOG_OBJECT (obj, "Device name for device '%s': %s",
+ GST_STR_NULL (device), GST_STR_NULL (ret));
+
+ return ret;
+}
diff --git a/ext/alsa/gstalsa.h b/ext/alsa/gstalsa.h
new file mode 100644
index 0000000..92466d2
--- /dev/null
+++ b/ext/alsa/gstalsa.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2001 CodeFactory AB
+ * Copyright (C) 2001 Thomas Nyberg <thomas@codefactory.se>
+ * Copyright (C) 2001-2002 Andy Wingo <apwingo@eos.ncsu.edu>
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GST_ALSA_H__
+#define __GST_ALSA_H__
+
+
+#define ALSA_PCM_NEW_HW_PARAMS_API
+#define ALSA_PCM_NEW_SW_PARAMS_API
+
+#include <alsa/asoundlib.h>
+#include <alsa/control.h>
+#include <alsa/error.h>
+#include <gst/gst.h>
+
+#define GST_CHECK_ALSA_VERSION(major,minor,micro) \
+ (SND_LIB_MAJOR > (major) || \
+ (SND_LIB_MAJOR == (major) && SND_LIB_MINOR > (minor)) || \
+ (SND_LIB_MAJOR == (major) && SND_LIB_MINOR == (minor) && \
+ SND_LIB_SUBMINOR >= (micro)))
+
+GST_DEBUG_CATEGORY_EXTERN (alsa_debug);
+#define GST_CAT_DEFAULT alsa_debug
+
+snd_pcm_t * gst_alsa_open_iec958_pcm (GstObject * obj);
+
+GstCaps * gst_alsa_probe_supported_formats (GstObject * obj,
+ snd_pcm_t * handle,
+ const GstCaps * template_caps);
+
+gchar * gst_alsa_find_device_name (GstObject * obj,
+ const gchar * device,
+ snd_pcm_t * handle,
+ snd_pcm_stream_t stream);
+
+gchar * gst_alsa_find_card_name (GstObject * obj,
+ const gchar * devcard,
+ snd_pcm_stream_t stream);
+
+
+#endif /* __GST_ALSA_H__ */
diff --git a/ext/alsa/gstalsadeviceprobe.c b/ext/alsa/gstalsadeviceprobe.c
new file mode 100644
index 0000000..97d5f5e
--- /dev/null
+++ b/ext/alsa/gstalsadeviceprobe.c
@@ -0,0 +1,210 @@
+/* Copyright (C) 2001 CodeFactory AB
+ * Copyright (C) 2001 Thomas Nyberg <thomas@codefactory.se>
+ * Copyright (C) 2001-2002 Andy Wingo <apwingo@eos.ncsu.edu>
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * Copyright (C) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstalsadeviceprobe.h"
+#include "gst/interfaces/propertyprobe.h"
+
+G_LOCK_DEFINE_STATIC (probe_lock);
+
+static const GList *
+gst_alsa_device_property_probe_get_properties (GstPropertyProbe * probe)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
+ static GList *list = NULL;
+
+ G_LOCK (probe_lock);
+
+ if (!list) {
+ GParamSpec *pspec;
+
+ pspec = g_object_class_find_property (klass, "device");
+ list = g_list_append (NULL, pspec);
+ }
+
+ G_UNLOCK (probe_lock);
+
+ return list;
+}
+
+static GList *
+gst_alsa_get_device_list (snd_pcm_stream_t stream)
+{
+ snd_ctl_t *handle;
+ int card, dev;
+ snd_ctl_card_info_t *info;
+ snd_pcm_info_t *pcminfo;
+ gboolean mixer = (stream == -1);
+ GList *list = NULL;
+
+ if (stream == -1)
+ stream = 0;
+
+ snd_ctl_card_info_malloc (&info);
+ snd_pcm_info_malloc (&pcminfo);
+ card = -1;
+
+ if (snd_card_next (&card) < 0 || card < 0) {
+ /* no soundcard found */
+ GST_WARNING ("No soundcard found");
+ goto beach;
+ }
+
+ while (card >= 0) {
+ gchar name[32];
+
+ g_snprintf (name, sizeof (name), "hw:%d", card);
+ if (snd_ctl_open (&handle, name, 0) < 0) {
+ goto next_card;
+ }
+ if (snd_ctl_card_info (handle, info) < 0) {
+ snd_ctl_close (handle);
+ goto next_card;
+ }
+
+ if (mixer) {
+ list = g_list_append (list, g_strdup (name));
+ } else {
+ dev = -1;
+ while (1) {
+ gchar *gst_device;
+
+ snd_ctl_pcm_next_device (handle, &dev);
+
+ if (dev < 0)
+ break;
+ snd_pcm_info_set_device (pcminfo, dev);
+ snd_pcm_info_set_subdevice (pcminfo, 0);
+ snd_pcm_info_set_stream (pcminfo, stream);
+ if (snd_ctl_pcm_info (handle, pcminfo) < 0) {
+ continue;
+ }
+
+ gst_device = g_strdup_printf ("hw:%d,%d", card, dev);
+ list = g_list_append (list, gst_device);
+ }
+ }
+ snd_ctl_close (handle);
+ next_card:
+ if (snd_card_next (&card) < 0) {
+ break;
+ }
+ }
+
+beach:
+ snd_ctl_card_info_free (info);
+ snd_pcm_info_free (pcminfo);
+
+ return list;
+}
+
+static void
+gst_alsa_device_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_alsa_device_property_probe_needs_probe (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ /* don't cache probed data */
+ return TRUE;
+}
+
+static GValueArray *
+gst_alsa_device_property_probe_get_values (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstElementClass *klass;
+ const GList *templates;
+ snd_pcm_stream_t mode = -1;
+ GValueArray *array;
+ GValue value = { 0, };
+ GList *l, *list;
+
+ if (!g_str_equal (pspec->name, "device")) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ return NULL;
+ }
+
+ klass = GST_ELEMENT_GET_CLASS (GST_ELEMENT (probe));
+
+ /* I'm pretty sure ALSA has a good way to do this. However, their cool
+ * auto-generated documentation is pretty much useless if you try to
+ * do function-wise look-ups. */
+ /* we assume one pad template at max [zero=mixer] */
+ templates = gst_element_class_get_pad_template_list (klass);
+ if (templates) {
+ if (GST_PAD_TEMPLATE_DIRECTION (templates->data) == GST_PAD_SRC)
+ mode = SND_PCM_STREAM_CAPTURE;
+ else
+ mode = SND_PCM_STREAM_PLAYBACK;
+ }
+
+ list = gst_alsa_get_device_list (mode);
+
+ if (list == NULL) {
+ GST_LOG_OBJECT (probe, "No devices found");
+ return NULL;
+ }
+
+ array = g_value_array_new (g_list_length (list));
+ g_value_init (&value, G_TYPE_STRING);
+ for (l = list; l != NULL; l = l->next) {
+ GST_LOG_OBJECT (probe, "Found device: %s", (gchar *) l->data);
+ g_value_take_string (&value, (gchar *) l->data);
+ l->data = NULL;
+ g_value_array_append (array, &value);
+ }
+ g_value_unset (&value);
+ g_list_free (list);
+
+ return array;
+}
+
+static void
+gst_alsa_property_probe_interface_init (GstPropertyProbeInterface * iface)
+{
+ iface->get_properties = gst_alsa_device_property_probe_get_properties;
+ iface->probe_property = gst_alsa_device_property_probe_probe_property;
+ iface->needs_probe = gst_alsa_device_property_probe_needs_probe;
+ iface->get_values = gst_alsa_device_property_probe_get_values;
+}
+
+void
+gst_alsa_type_add_device_property_probe_interface (GType type)
+{
+ static const GInterfaceInfo probe_iface_info = {
+ (GInterfaceInitFunc) gst_alsa_property_probe_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE,
+ &probe_iface_info);
+}
diff --git a/ext/alsa/gstalsadeviceprobe.h b/ext/alsa/gstalsadeviceprobe.h
new file mode 100644
index 0000000..b60b0fe
--- /dev/null
+++ b/ext/alsa/gstalsadeviceprobe.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2001 CodeFactory AB
+ * Copyright (C) 2001 Thomas Nyberg <thomas@codefactory.se>
+ * Copyright (C) 2001-2002 Andy Wingo <apwingo@eos.ncsu.edu>
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __GST_ALSA_DEVICE_PROBE_H__
+#define __GST_ALSA_DEVICE_PROBE_H__
+
+#include "gstalsa.h"
+
+G_BEGIN_DECLS
+
+void gst_alsa_type_add_device_property_probe_interface (GType type);
+
+G_END_DECLS
+
+#endif /* __GST_ALSA_DEVICE_PROBE_H__ */
+
diff --git a/ext/alsa/gstalsamixer.c b/ext/alsa/gstalsamixer.c
new file mode 100644
index 0000000..b30a7bb
--- /dev/null
+++ b/ext/alsa/gstalsamixer.c
@@ -0,0 +1,957 @@
+/* ALSA mixer implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-alsamixer
+ * @see_also: alsasink, alsasrc
+ *
+ * This element controls various aspects such as the volume and balance
+ * of an audio device using the ALSA api.
+ *
+ * The application should query and use the interfaces provided by this
+ * element to control the device.
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstalsamixer.h"
+#include <errno.h>
+
+static void gst_alsa_mixer_update_option (GstAlsaMixer * mixer,
+ GstAlsaMixerOptions * alsa_opts);
+static void gst_alsa_mixer_update_track (GstAlsaMixer * mixer,
+ GstAlsaMixerTrack * alsa_track);
+static int gst_alsa_mixer_handle_callback (snd_mixer_t * handle,
+ unsigned int mask, snd_mixer_elem_t * elem);
+
+/* First some utils, then the mixer implementation */
+static gboolean
+gst_alsa_mixer_open (GstAlsaMixer * mixer)
+{
+ gint err;
+ snd_ctl_t *ctl;
+ snd_ctl_card_info_t *card_info;
+
+ g_return_val_if_fail (mixer->handle == NULL, FALSE);
+
+ /* open and initialize the mixer device */
+ err = snd_mixer_open (&mixer->handle, 0);
+ if (err < 0 || mixer->handle == NULL)
+ goto open_failed;
+
+ if ((err = snd_mixer_attach (mixer->handle, mixer->device)) < 0) {
+ GST_WARNING ("Cannot open mixer for sound device '%s': %s", mixer->device,
+ snd_strerror (err));
+ goto error;
+ }
+
+ if ((err = snd_mixer_selem_register (mixer->handle, NULL, NULL)) < 0) {
+ GST_WARNING ("Cannot register mixer elements: %s", snd_strerror (err));
+ goto error;
+ }
+
+ if ((err = snd_mixer_load (mixer->handle)) < 0) {
+ GST_WARNING ("Cannot load mixer settings: %s", snd_strerror (err));
+ goto error;
+ }
+
+ snd_mixer_set_callback_private (mixer->handle, mixer);
+ snd_mixer_set_callback (mixer->handle, gst_alsa_mixer_handle_callback);
+
+ /* now get the device name, any of this is not fatal */
+ g_free (mixer->cardname);
+ if ((err = snd_ctl_open (&ctl, mixer->device, 0)) < 0) {
+ GST_WARNING ("Cannot open CTL: %s", snd_strerror (err));
+ goto no_card_name;
+ }
+
+ snd_ctl_card_info_malloc (&card_info);
+ if ((err = snd_ctl_card_info (ctl, card_info)) < 0) {
+ GST_WARNING ("Cannot get card info: %s", snd_strerror (err));
+ snd_ctl_close (ctl);
+ goto no_card_name;
+ }
+
+ mixer->cardname = g_strdup (snd_ctl_card_info_get_name (card_info));
+ GST_DEBUG ("Card name = %s", GST_STR_NULL (mixer->cardname));
+ snd_ctl_card_info_free (card_info);
+ snd_ctl_close (ctl);
+
+no_card_name:
+ if (mixer->cardname == NULL) {
+ mixer->cardname = g_strdup ("Unknown");
+ GST_DEBUG ("Cannot find card name");
+ }
+
+ GST_INFO ("Successfully opened mixer for device '%s'.", mixer->device);
+
+ return TRUE;
+
+ /* ERROR */
+open_failed:
+ {
+ GST_WARNING ("Cannot open mixer: %s", snd_strerror (err));
+ mixer->handle = NULL;
+ return FALSE;
+ }
+error:
+ {
+ snd_mixer_close (mixer->handle);
+ mixer->handle = NULL;
+ return FALSE;
+ }
+}
+
+static snd_mixer_elem_t *
+gst_alsa_mixer_find_master_mixer (GstAlsaMixer * mixer, snd_mixer_t * handle)
+{
+ snd_mixer_elem_t *element;
+ gint i, count;
+
+ count = snd_mixer_get_count (handle);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ /* Check if we have a playback mixer labelled as 'Master' */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ strcmp (snd_mixer_selem_get_name (element), "Master") == 0) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, check if we have a playback mixer labelled as 'Front' */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ strcmp (snd_mixer_selem_get_name (element), "Front") == 0) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, check if we have a playback mixer labelled as 'PCM' */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ strcmp (snd_mixer_selem_get_name (element), "PCM") == 0) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, check if we have a playback mixer labelled as 'Speaker' */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ strcmp (snd_mixer_selem_get_name (element), "Speaker") == 0) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, check if we have a playback mixer with both volume and switch that
+ * is not mono */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ snd_mixer_selem_has_playback_switch (element) &&
+ !snd_mixer_selem_is_playback_mono (element)) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, check if we have any playback mixer with both volume and switch */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element) &&
+ snd_mixer_selem_has_playback_switch (element)) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ /* If not, take any playback mixer with a volume control */
+ element = snd_mixer_first_elem (handle);
+ for (i = 0; i < count; i++) {
+ if (snd_mixer_selem_has_playback_volume (element)) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return element;
+ }
+ element = snd_mixer_elem_next (element);
+ }
+
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ /* Looks like we're out of luck ... */
+ return NULL;
+}
+
+static void
+gst_alsa_mixer_update (GstAlsaMixer * mixer, snd_mixer_elem_t * elem)
+{
+ GList *item;
+
+ g_return_if_fail (mixer != NULL);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ for (item = mixer->tracklist; item != NULL; item = item->next) {
+ if (GST_IS_ALSA_MIXER_TRACK (item->data)) {
+ if (elem && (GST_ALSA_MIXER_TRACK (item->data)->element != elem))
+ continue;
+
+ gst_alsa_mixer_update_track (mixer, GST_ALSA_MIXER_TRACK (item->data));
+ } else if (GST_IS_ALSA_MIXER_OPTIONS (item->data)) {
+ if (elem && (GST_ALSA_MIXER_OPTIONS (item->data)->element != elem))
+ continue;
+
+ gst_alsa_mixer_update_option (mixer, GST_ALSA_MIXER_OPTIONS (item->data));
+ }
+ }
+
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+static int
+gst_alsa_mixer_elem_handle_callback (snd_mixer_elem_t * elem, unsigned int mask)
+{
+ GstAlsaMixer *mixer =
+ (GstAlsaMixer *) snd_mixer_elem_get_callback_private (elem);
+
+ GST_LOG ("ALSA elem cb");
+
+ g_return_val_if_fail (mixer != NULL, 1);
+
+ gst_alsa_mixer_update (mixer, elem);
+
+ return 0;
+}
+
+static int
+gst_alsa_mixer_handle_callback (snd_mixer_t * handle, unsigned int mask,
+ snd_mixer_elem_t * elem)
+{
+ GstAlsaMixer *mixer =
+ (GstAlsaMixer *) snd_mixer_get_callback_private (handle);
+
+ GST_LOG ("ALSA cb");
+
+ g_return_val_if_fail (mixer != NULL, 1);
+
+ /* Hopefully won't be call recursively and will handle pending elem events */
+ snd_mixer_handle_events (mixer->handle);
+
+ gst_alsa_mixer_update (mixer, elem);
+
+ return 0;
+}
+
+static void
+gst_alsa_mixer_ensure_track_list (GstAlsaMixer * mixer)
+{
+ gint i, count;
+ snd_mixer_elem_t *element, *master;
+ GList *item;
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ if (mixer->tracklist)
+ return;
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ master = gst_alsa_mixer_find_master_mixer (mixer, mixer->handle);
+
+ count = snd_mixer_get_count (mixer->handle);
+ element = snd_mixer_first_elem (mixer->handle);
+
+ /* build track list
+ *
+ * Some ALSA tracks may have playback and capture capabilities.
+ * Here we model them as two separate GStreamer tracks.
+ */
+
+ for (i = 0; i < count; i++) {
+ GstMixerTrack *play_track = NULL;
+ GstMixerTrack *cap_track = NULL;
+ const gchar *name;
+ GList *item;
+ gint samename = 0;
+
+ name = snd_mixer_selem_get_name (element);
+
+ /* prevent dup names */
+ for (item = mixer->tracklist; item != NULL; item = item->next) {
+ snd_mixer_elem_t *temp;
+
+ if (GST_IS_ALSA_MIXER_OPTIONS (item->data))
+ temp = GST_ALSA_MIXER_OPTIONS (item->data)->element;
+ else
+ temp = GST_ALSA_MIXER_TRACK (item->data)->element;
+
+ if (strcmp (name, snd_mixer_selem_get_name (temp)) == 0)
+ samename++;
+ }
+
+ GST_LOG ("[%s] probing element #%u, mixer->dir=%u", name, i, mixer->dir);
+
+ if (mixer->dir & GST_ALSA_MIXER_PLAYBACK) {
+ gboolean has_playback_switch, has_playback_volume;
+
+ has_playback_switch = snd_mixer_selem_has_playback_switch (element);
+ has_playback_volume = snd_mixer_selem_has_playback_volume (element);
+
+ GST_LOG ("[%s] PLAYBACK: has_playback_volume=%d, has_playback_switch=%d"
+ "%s", name, has_playback_volume, has_playback_switch,
+ (element == master) ? " MASTER" : "");
+
+ if (has_playback_volume) {
+ gint flags = GST_MIXER_TRACK_OUTPUT;
+
+ if (element == master)
+ flags |= GST_MIXER_TRACK_MASTER;
+
+ play_track = gst_alsa_mixer_track_new (element, samename, i,
+ flags, FALSE, NULL, FALSE);
+
+ } else if (has_playback_switch) {
+ /* simple mute switch */
+ play_track = gst_alsa_mixer_track_new (element, samename, i,
+ GST_MIXER_TRACK_OUTPUT, TRUE, NULL, FALSE);
+ }
+
+ if (snd_mixer_selem_is_enumerated (element)) {
+ GstMixerOptions *opts = gst_alsa_mixer_options_new (element, i);
+
+ GST_LOG ("[%s] is enumerated (%d)", name, i);
+ mixer->tracklist = g_list_append (mixer->tracklist, opts);
+ }
+ }
+
+ if (mixer->dir & GST_ALSA_MIXER_CAPTURE) {
+ gboolean has_capture_switch, has_common_switch;
+ gboolean has_capture_volume, has_common_volume;
+
+ has_capture_switch = snd_mixer_selem_has_capture_switch (element);
+ has_common_switch = snd_mixer_selem_has_common_switch (element);
+ has_capture_volume = snd_mixer_selem_has_capture_volume (element);
+ has_common_volume = snd_mixer_selem_has_common_volume (element);
+
+ GST_LOG ("[%s] CAPTURE: has_capture_volume=%d, has_common_volume=%d, "
+ "has_capture_switch=%d, has_common_switch=%d, play_track=%p", name,
+ has_capture_volume, has_common_volume, has_capture_switch,
+ has_common_switch, play_track);
+
+ if (has_capture_volume && !(play_track && has_common_volume)) {
+ cap_track = gst_alsa_mixer_track_new (element, samename, i,
+ GST_MIXER_TRACK_INPUT, FALSE, NULL, play_track != NULL);
+ } else if (has_capture_switch && !(play_track && has_common_switch)) {
+ cap_track = gst_alsa_mixer_track_new (element, samename, i,
+ GST_MIXER_TRACK_INPUT, TRUE, NULL, play_track != NULL);
+ }
+ }
+
+
+ if (play_track && cap_track) {
+ GST_ALSA_MIXER_TRACK (play_track)->shared_mute =
+ GST_ALSA_MIXER_TRACK (cap_track);
+ GST_ALSA_MIXER_TRACK (cap_track)->shared_mute =
+ GST_ALSA_MIXER_TRACK (play_track);
+ }
+
+ if (play_track)
+ mixer->tracklist = g_list_append (mixer->tracklist, play_track);
+
+ if (cap_track)
+ mixer->tracklist = g_list_append (mixer->tracklist, cap_track);
+
+ element = snd_mixer_elem_next (element);
+ }
+
+ for (item = mixer->tracklist; item != NULL; item = item->next) {
+ snd_mixer_elem_t *temp;
+
+ if (GST_IS_ALSA_MIXER_OPTIONS (item->data))
+ temp = GST_ALSA_MIXER_OPTIONS (item->data)->element;
+ else
+ temp = GST_ALSA_MIXER_TRACK (item->data)->element;
+
+ snd_mixer_elem_set_callback (temp, gst_alsa_mixer_elem_handle_callback);
+ snd_mixer_elem_set_callback_private (temp, mixer);
+ }
+
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+static void
+task_monitor_alsa (gpointer data)
+{
+ struct pollfd *pfds;
+ int nfds, rnfds;
+ unsigned short revents;
+ GstAlsaMixer *mixer = (GstAlsaMixer *) data;
+ gint ret;
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ nfds = snd_mixer_poll_descriptors_count (mixer->handle);
+ if (nfds <= 0) {
+ GST_ERROR ("snd_mixer_poll_descriptors_count <= 0: %d", nfds);
+ /* FIXME: sleep ? stop monitoring ? */
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return;
+ }
+
+ pfds = g_newa (struct pollfd, nfds + 1);
+ rnfds = snd_mixer_poll_descriptors (mixer->handle, pfds, nfds);
+ g_assert (rnfds <= nfds);
+
+ if (rnfds < 0) {
+ GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), ("alsa error: %s",
+ snd_strerror (rnfds)));
+ gst_task_pause (mixer->task);
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return;
+ }
+
+ pfds[rnfds].fd = mixer->pfd[0];
+ pfds[rnfds].events = POLLIN | POLLPRI | POLLHUP | POLLERR;
+ pfds[rnfds].revents = 0;
+
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+
+ GST_LOG ("task loop");
+ ret = poll (pfds, rnfds + 1, -1);
+
+ if (ret < 0) {
+ GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+ gst_task_pause (mixer->task);
+ return;
+ }
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ ret =
+ snd_mixer_poll_descriptors_revents (mixer->handle, pfds, nfds, &revents);
+ if (ret < 0) {
+ GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), ("alsa error: %s",
+ snd_strerror (ret)));
+ gst_task_pause (mixer->task);
+ } else if (revents & (POLLIN | POLLPRI)) {
+ GST_DEBUG ("Handling events");
+ snd_mixer_handle_events (mixer->handle);
+ } else if (revents & (POLLERR | POLLNVAL | POLLHUP)) {
+ GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), (NULL));
+ gst_task_pause (mixer->task);
+ }
+
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+/* API */
+
+GstAlsaMixer *
+gst_alsa_mixer_new (const char *device, GstAlsaMixerDirection dir)
+{
+ GstAlsaMixer *ret = NULL;
+
+ g_return_val_if_fail (device != NULL, NULL);
+
+ ret = g_new0 (GstAlsaMixer, 1);
+
+ if (pipe (ret->pfd) == -1)
+ goto error;
+
+ ret->rec_mutex = g_new (GStaticRecMutex, 1);
+ g_static_rec_mutex_init (ret->rec_mutex);
+
+ ret->task_mutex = g_new (GStaticRecMutex, 1);
+ g_static_rec_mutex_init (ret->task_mutex);
+
+ ret->task = gst_task_create (task_monitor_alsa, ret);
+ gst_task_set_lock (ret->task, ret->task_mutex);
+
+ ret->device = g_strdup (device);
+ ret->dir = dir;
+
+ if (!gst_alsa_mixer_open (ret))
+ goto error;
+
+ if (gst_task_start (ret->task) == FALSE) {
+ GST_WARNING ("Could not start alsamixer task");
+ }
+
+ return ret;
+
+ /* ERRORS */
+error:
+ {
+ gst_alsa_mixer_free (ret);
+ return NULL;
+ }
+}
+
+void
+gst_alsa_mixer_free (GstAlsaMixer * mixer)
+{
+ g_return_if_fail (mixer != NULL);
+
+ if (mixer->task) {
+ if (write (mixer->pfd[1], "stop", 5) <= 0) {
+ GST_ERROR ("Cannot send " "stop" " to alsamixer task");
+ close (mixer->pfd[1]);
+ mixer->pfd[1] = -1;
+ }
+
+ if (gst_task_join (mixer->task) == FALSE) {
+ GST_ERROR ("Cannot join alsamixer task");
+ }
+
+ gst_object_unref (mixer->task);
+ mixer->task = NULL;
+ }
+
+ g_static_rec_mutex_free (mixer->task_mutex);
+ g_free (mixer->task_mutex);
+ mixer->task_mutex = NULL;
+
+ if (mixer->pfd[0] > 0) {
+ close (mixer->pfd[0]);
+ mixer->pfd[0] = -1;
+ }
+
+ if (mixer->pfd[1] > 0) {
+ close (mixer->pfd[1]);
+ mixer->pfd[1] = -1;
+ }
+
+ if (mixer->interface) {
+ g_object_unref (G_OBJECT (mixer->interface));
+ mixer->interface = 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->handle) {
+ snd_mixer_close (mixer->handle);
+ mixer->handle = NULL;
+ }
+
+ g_static_rec_mutex_free (mixer->rec_mutex);
+ g_free (mixer->rec_mutex);
+ mixer->rec_mutex = NULL;
+
+ g_free (mixer);
+}
+
+const GList *
+gst_alsa_mixer_list_tracks (GstAlsaMixer * mixer)
+{
+ g_return_val_if_fail (mixer->handle != NULL, NULL);
+
+ gst_alsa_mixer_ensure_track_list (mixer);
+
+ return (const GList *) mixer->tracklist;
+}
+
+void
+gst_alsa_mixer_get_volume (GstAlsaMixer * mixer, GstMixerTrack * track,
+ gint * volumes)
+{
+ gint i;
+ GstAlsaMixerTrack *alsa_track = GST_ALSA_MIXER_TRACK (track);
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ if (track->flags & GST_MIXER_TRACK_OUTPUT) { /* return playback volume */
+
+ /* Is emulated mute flag activated? */
+ if (track->flags & GST_MIXER_TRACK_MUTE &&
+ !(alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_PSWITCH)) {
+ for (i = 0; i < track->num_channels; i++)
+ volumes[i] = alsa_track->volumes[i];
+ } else {
+ for (i = 0; i < track->num_channels; i++) {
+ long tmp = 0;
+
+ snd_mixer_selem_get_playback_volume (alsa_track->element, i, &tmp);
+ alsa_track->volumes[i] = volumes[i] = (gint) tmp;
+ }
+ }
+
+ } else if (track->flags & GST_MIXER_TRACK_INPUT) { /* return capture volume */
+
+ /* Is emulated record flag activated? */
+ if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH ||
+ track->flags & GST_MIXER_TRACK_RECORD) {
+ for (i = 0; i < track->num_channels; i++) {
+ long tmp = 0;
+
+ snd_mixer_selem_get_capture_volume (alsa_track->element, i, &tmp);
+ alsa_track->volumes[i] = volumes[i] = (gint) tmp;
+ }
+ } else {
+ for (i = 0; i < track->num_channels; i++)
+ volumes[i] = alsa_track->volumes[i];
+ }
+ }
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+static gboolean
+check_if_volumes_are_the_same (guint num_channels, gint * volumes)
+{
+ guint i;
+
+ if (num_channels <= 1)
+ return TRUE;
+
+ for (i = 1; i < num_channels; i++) {
+ if (volumes[i] != volumes[0])
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void
+gst_alsa_mixer_set_volume (GstAlsaMixer * mixer, GstMixerTrack * track,
+ gint * volumes)
+{
+ GstAlsaMixerTrack *alsa_track = GST_ALSA_MIXER_TRACK (track);
+ gint i;
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ if (track->flags & GST_MIXER_TRACK_OUTPUT) {
+
+ /* Is emulated mute flag activated? */
+ if (track->flags & GST_MIXER_TRACK_MUTE &&
+ !(alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_PSWITCH)) {
+ for (i = 0; i < track->num_channels; i++)
+ alsa_track->volumes[i] = volumes[i];
+ } else {
+ if (check_if_volumes_are_the_same (track->num_channels, volumes)) {
+ snd_mixer_selem_set_playback_volume_all (alsa_track->element,
+ volumes[0]);
+ for (i = 0; i < track->num_channels; i++)
+ alsa_track->volumes[i] = volumes[0];
+ } else {
+ for (i = 0; i < track->num_channels; i++) {
+ alsa_track->volumes[i] = volumes[i];
+ snd_mixer_selem_set_playback_volume (alsa_track->element, i,
+ volumes[i]);
+ }
+ }
+ }
+
+ } else if (track->flags & GST_MIXER_TRACK_INPUT) {
+
+ /* Is emulated record flag activated? */
+ if (track->flags & GST_MIXER_TRACK_RECORD ||
+ alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH) {
+ if (check_if_volumes_are_the_same (track->num_channels, volumes)) {
+ snd_mixer_selem_set_capture_volume_all (alsa_track->element,
+ volumes[0]);
+ for (i = 0; i < track->num_channels; i++)
+ alsa_track->volumes[i] = volumes[0];
+ } else {
+ for (i = 0; i < track->num_channels; i++) {
+ alsa_track->volumes[i] = volumes[i];
+ snd_mixer_selem_set_capture_volume (alsa_track->element, i,
+ volumes[i]);
+ }
+ }
+ } else {
+ for (i = 0; i < track->num_channels; i++)
+ alsa_track->volumes[i] = volumes[i];
+ }
+ }
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+void
+gst_alsa_mixer_set_mute (GstAlsaMixer * mixer, GstMixerTrack * track,
+ gboolean mute)
+{
+ GstAlsaMixerTrack *alsa_track = GST_ALSA_MIXER_TRACK (track);
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ if (! !(mute) == ! !(track->flags & GST_MIXER_TRACK_MUTE)) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return;
+ }
+ if (mute) {
+ track->flags |= GST_MIXER_TRACK_MUTE;
+
+ if (alsa_track->shared_mute)
+ ((GstMixerTrack *) (alsa_track->shared_mute))->flags |=
+ GST_MIXER_TRACK_MUTE;
+ } else {
+ track->flags &= ~GST_MIXER_TRACK_MUTE;
+
+ if (alsa_track->shared_mute)
+ ((GstMixerTrack *) (alsa_track->shared_mute))->flags &=
+ ~GST_MIXER_TRACK_MUTE;
+ }
+
+ if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_PSWITCH) {
+ snd_mixer_selem_set_playback_switch_all (alsa_track->element, mute ? 0 : 1);
+ } else {
+ gint i;
+ GstAlsaMixerTrack *ctrl_track;
+
+ if ((track->flags & GST_MIXER_TRACK_INPUT)
+ && alsa_track->shared_mute != NULL)
+ ctrl_track = alsa_track->shared_mute;
+ else
+ ctrl_track = alsa_track;
+
+ for (i = 0; i < ((GstMixerTrack *) ctrl_track)->num_channels; i++) {
+ long vol =
+ mute ? ((GstMixerTrack *) ctrl_track)->
+ min_volume : ctrl_track->volumes[i];
+ snd_mixer_selem_set_playback_volume (ctrl_track->element, i, vol);
+ }
+ }
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+void
+gst_alsa_mixer_set_record (GstAlsaMixer * mixer,
+ GstMixerTrack * track, gboolean record)
+{
+ GstAlsaMixerTrack *alsa_track = GST_ALSA_MIXER_TRACK (track);
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ if (! !(record) == ! !(track->flags & GST_MIXER_TRACK_RECORD)) {
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ return;
+ }
+
+ if (record) {
+ track->flags |= GST_MIXER_TRACK_RECORD;
+ } else {
+ track->flags &= ~GST_MIXER_TRACK_RECORD;
+ }
+
+ if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH) {
+ snd_mixer_selem_set_capture_switch_all (alsa_track->element,
+ record ? 1 : 0);
+
+ /* update all tracks in same exlusive cswitch group */
+ if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH_EXCL) {
+ GList *item;
+
+ for (item = mixer->tracklist; item != NULL; item = item->next) {
+
+ if (GST_IS_ALSA_MIXER_TRACK (item->data)) {
+ GstAlsaMixerTrack *item_alsa_track =
+ GST_ALSA_MIXER_TRACK (item->data);
+
+ if (item_alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH_EXCL &&
+ item_alsa_track->capture_group == alsa_track->capture_group) {
+ gst_alsa_mixer_track_update (item_alsa_track);
+ }
+ }
+ }
+ }
+ } else {
+ gint i;
+
+ for (i = 0; i < track->num_channels; i++) {
+ long vol = record ? alsa_track->volumes[i] : track->min_volume;
+
+ snd_mixer_selem_set_capture_volume (alsa_track->element, i, vol);
+ }
+ }
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+void
+gst_alsa_mixer_set_option (GstAlsaMixer * mixer,
+ GstMixerOptions * opts, gchar * value)
+{
+ gint idx = -1, n = 0;
+ GList *item;
+ GstAlsaMixerOptions *alsa_opts = GST_ALSA_MIXER_OPTIONS (opts);
+
+ g_return_if_fail (mixer->handle != NULL);
+
+ for (item = opts->values; item != NULL; item = item->next, n++) {
+ if (!strcmp (item->data, value)) {
+ idx = n;
+ break;
+ }
+ }
+ if (idx == -1)
+ return;
+
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+ snd_mixer_selem_set_enum_item (alsa_opts->element, 0, idx);
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+}
+
+const gchar *
+gst_alsa_mixer_get_option (GstAlsaMixer * mixer, GstMixerOptions * opts)
+{
+ gint ret;
+ guint idx;
+ GstAlsaMixerOptions *alsa_opts = GST_ALSA_MIXER_OPTIONS (opts);
+
+ g_return_val_if_fail (mixer->handle != NULL, NULL);
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+ ret = snd_mixer_selem_get_enum_item (alsa_opts->element, 0, &idx);
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ if (ret == 0)
+ return g_list_nth_data (opts->values, idx);
+ else
+ return snd_strerror (ret); /* feeble attempt at error handling */
+}
+
+GstMixerFlags
+gst_alsa_mixer_get_mixer_flags (GstAlsaMixer * mixer)
+{
+ g_return_val_if_fail (mixer != NULL, GST_MIXER_FLAG_NONE);
+
+ return GST_MIXER_FLAG_AUTO_NOTIFICATIONS;
+}
+
+static void
+gst_alsa_mixer_update_option (GstAlsaMixer * mixer,
+ GstAlsaMixerOptions * alsa_opts)
+{
+ gint ret;
+ guint idx;
+ /* const */ gchar *option;
+
+ if (mixer->interface == NULL) {
+ GST_WARNING ("Cannot send update notifications, no GstMixer * given");
+ return;
+ }
+ g_static_rec_mutex_lock (mixer->rec_mutex);
+ ret = snd_mixer_selem_get_enum_item (alsa_opts->element, 0, &idx);
+ g_static_rec_mutex_unlock (mixer->rec_mutex);
+ if (ret == 0) {
+ option = g_list_nth_data (GST_MIXER_OPTIONS (alsa_opts)->values, idx);
+ gst_mixer_option_changed (mixer->interface, GST_MIXER_OPTIONS (alsa_opts),
+ option);
+ }
+}
+
+static void
+gst_alsa_mixer_update_track (GstAlsaMixer * mixer,
+ GstAlsaMixerTrack * alsa_track)
+{
+ GstMixerTrack *track = (GstMixerTrack *) alsa_track;
+ gboolean old_mute;
+ gboolean old_record;
+ gint i, n_channels;
+ gint *old_volumes;
+
+ GST_DEBUG ("Updating track %" GST_PTR_FORMAT, alsa_track);
+
+ if (mixer->interface == NULL) {
+ GST_WARNING ("Cannot send update notifications, no GstMixer * given");
+ return;
+ }
+
+ old_mute = ! !(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE));
+ old_record = ! !(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD));
+ old_volumes = g_new (gint, track->num_channels);
+ n_channels = track->num_channels;
+ memcpy (old_volumes, alsa_track->volumes,
+ sizeof (gint) * track->num_channels);
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ if (old_record !=
+ ! !(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD))) {
+ gst_mixer_record_toggled (mixer->interface, track,
+ ! !GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD));
+ }
+ if (old_mute != ! !(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE))) {
+ gst_mixer_mute_toggled (mixer->interface, track,
+ ! !GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE));
+ }
+
+ n_channels = MIN (n_channels, track->num_channels);
+ for (i = 0; i < n_channels; i++) {
+ if (old_volumes[i] != alsa_track->volumes[i]) {
+ gst_mixer_volume_changed (mixer->interface, track, alsa_track->volumes);
+ break;
+ }
+ }
+ g_free (old_volumes);
+}
+
+/* utility function for gstalsamixerelement to set the interface */
+void
+_gst_alsa_mixer_set_interface (GstAlsaMixer * mixer, GstMixer * interface)
+{
+ g_return_if_fail (mixer != NULL && mixer->interface == NULL);
+ g_return_if_fail (interface != NULL);
+
+ mixer->interface = g_object_ref (G_OBJECT (interface));
+}
diff --git a/ext/alsa/gstalsamixer.h b/ext/alsa/gstalsamixer.h
new file mode 100644
index 0000000..3165ff5
--- /dev/null
+++ b/ext/alsa/gstalsamixer.h
@@ -0,0 +1,209 @@
+/* ALSA mixer interface implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GST_ALSA_MIXER_H__
+#define __GST_ALSA_MIXER_H__
+
+
+#include "gstalsa.h"
+
+#include <gst/interfaces/mixer.h>
+#include "gstalsamixeroptions.h"
+#include "gstalsamixertrack.h"
+
+
+G_BEGIN_DECLS
+
+/* This does not get you what you think it does, use obj->mixer */
+/* #define GST_ALSA_MIXER(obj) ((GstAlsaMixer*)(obj)) */
+
+typedef struct _GstAlsaMixer GstAlsaMixer;
+
+typedef enum {
+ GST_ALSA_MIXER_CAPTURE = 1<<0,
+ GST_ALSA_MIXER_PLAYBACK = 1<<1,
+ GST_ALSA_MIXER_ALL = GST_ALSA_MIXER_CAPTURE | GST_ALSA_MIXER_PLAYBACK
+} GstAlsaMixerDirection;
+
+/**
+ * GstAlsaMixer:
+ *
+ * Opaque data structure
+ */
+struct _GstAlsaMixer
+{
+ GList * tracklist; /* list of available tracks */
+
+ snd_mixer_t * handle;
+
+ GstTask * task;
+ GStaticRecMutex * task_mutex;
+ GStaticRecMutex * rec_mutex;
+
+ int pfd[2];
+
+ GstMixer * interface;
+ gchar * device;
+ gchar * cardname;
+
+ GstAlsaMixerDirection dir;
+};
+
+
+GstAlsaMixer* gst_alsa_mixer_new (const gchar *device,
+ GstAlsaMixerDirection dir);
+void gst_alsa_mixer_free (GstAlsaMixer *mixer);
+
+const GList* gst_alsa_mixer_list_tracks (GstAlsaMixer * mixer);
+void gst_alsa_mixer_set_volume (GstAlsaMixer * mixer,
+ GstMixerTrack * track,
+ gint * volumes);
+void gst_alsa_mixer_get_volume (GstAlsaMixer * mixer,
+ GstMixerTrack * track,
+ gint * volumes);
+void gst_alsa_mixer_set_record (GstAlsaMixer * mixer,
+ GstMixerTrack * track,
+ gboolean record);
+void gst_alsa_mixer_set_mute (GstAlsaMixer * mixer,
+ GstMixerTrack * track,
+ gboolean mute);
+void gst_alsa_mixer_set_option (GstAlsaMixer * mixer,
+ GstMixerOptions * opts,
+ gchar * value);
+const gchar* gst_alsa_mixer_get_option (GstAlsaMixer * mixer,
+ GstMixerOptions * opts);
+void _gst_alsa_mixer_set_interface (GstAlsaMixer * mixer,
+ GstMixer * interface);
+GstMixerFlags gst_alsa_mixer_get_mixer_flags (GstAlsaMixer *mixer);
+
+#define GST_IMPLEMENT_ALSA_MIXER_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_alsa_mixer_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_alsa_mixer_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_alsa_mixer_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_alsa_mixer_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_alsa_mixer_set_mute (this->mixer, track, mute); \
+} \
+ \
+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_alsa_mixer_set_option (this->mixer, opts, value); \
+} \
+ \
+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_alsa_mixer_get_option (this->mixer, opts); \
+} \
+ \
+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_alsa_mixer_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->set_option = interface_as_function ## _set_option; \
+ klass->get_option = interface_as_function ## _get_option; \
+ klass->get_mixer_flags = interface_as_function ## _get_mixer_flags; \
+}
+
+
+G_END_DECLS
+
+
+#endif /* __GST_ALSA_MIXER_H__ */
diff --git a/ext/alsa/gstalsamixerelement.c b/ext/alsa/gstalsamixerelement.c
new file mode 100644
index 0000000..1993cc4
--- /dev/null
+++ b/ext/alsa/gstalsamixerelement.c
@@ -0,0 +1,216 @@
+/* ALSA mixer implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstalsamixerelement.h"
+#include "gstalsadeviceprobe.h"
+
+#define DEFAULT_PROP_DEVICE "default"
+#define DEFAULT_PROP_DEVICE_NAME ""
+
+enum
+{
+ PROP_0,
+ PROP_DEVICE,
+ PROP_DEVICE_NAME
+};
+
+static void gst_alsa_mixer_element_init_interfaces (GType type);
+#define gst_alsa_mixer_element_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAlsaMixerElement, gst_alsa_mixer_element,
+ GST_TYPE_ELEMENT,
+ gst_alsa_mixer_element_init_interfaces (g_define_type_id));
+
+/* massive macro that takes care of all the GstMixer stuff */
+GST_IMPLEMENT_ALSA_MIXER_METHODS (GstAlsaMixerElement, gst_alsa_mixer_element);
+
+static void gst_alsa_mixer_element_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static void gst_alsa_mixer_element_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_alsa_mixer_element_finalize (GObject * object);
+
+static GstStateChangeReturn gst_alsa_mixer_element_change_state (GstElement
+ * element, GstStateChange transition);
+
+static void
+gst_alsa_mixer_element_init_interfaces (GType type)
+{
+ static const GInterfaceInfo mixer_iface_info = {
+ (GInterfaceInitFunc) gst_alsa_mixer_element_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info);
+
+ gst_alsa_type_add_device_property_probe_interface (type);
+}
+
+static void
+gst_alsa_mixer_element_class_init (GstAlsaMixerElementClass * klass)
+{
+ GstElementClass *element_class;
+ GObjectClass *gobject_class;
+
+ element_class = (GstElementClass *) klass;
+ gobject_class = (GObjectClass *) klass;
+
+ gobject_class->finalize = gst_alsa_mixer_element_finalize;
+ gobject_class->get_property = gst_alsa_mixer_element_get_property;
+ gobject_class->set_property = gst_alsa_mixer_element_set_property;
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device",
+ "ALSA device, as defined in an asound configuration file",
+ DEFAULT_PROP_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_PROP_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (element_class,
+ "Alsa mixer", "Generic/Audio",
+ "Control sound input and output levels with ALSA",
+ "Leif Johnson <leif@ambient.2y.net>");
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_alsa_mixer_element_change_state);
+}
+
+static void
+gst_alsa_mixer_element_finalize (GObject * obj)
+{
+ GstAlsaMixerElement *this = GST_ALSA_MIXER_ELEMENT (obj);
+
+ g_free (this->device);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_alsa_mixer_element_init (GstAlsaMixerElement * this)
+{
+ this->mixer = NULL;
+ this->device = g_strdup (DEFAULT_PROP_DEVICE);
+}
+
+static void
+gst_alsa_mixer_element_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAlsaMixerElement *this = GST_ALSA_MIXER_ELEMENT (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:{
+ GST_OBJECT_LOCK (this);
+ g_free (this->device);
+ this->device = g_value_dup_string (value);
+ /* make sure we never set NULL, this is nice when we want to open the
+ * device. */
+ if (this->device == NULL)
+ this->device = g_strdup (DEFAULT_PROP_DEVICE);
+ GST_OBJECT_UNLOCK (this);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_alsa_mixer_element_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAlsaMixerElement *this = GST_ALSA_MIXER_ELEMENT (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:{
+ GST_OBJECT_LOCK (this);
+ g_value_set_string (value, this->device);
+ GST_OBJECT_UNLOCK (this);
+ break;
+ }
+ case PROP_DEVICE_NAME:{
+ GST_OBJECT_LOCK (this);
+ if (this->mixer) {
+ g_value_set_string (value, this->mixer->cardname);
+ } else {
+ g_value_set_string (value, NULL);
+ }
+ GST_OBJECT_UNLOCK (this);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_alsa_mixer_element_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstAlsaMixerElement *this = GST_ALSA_MIXER_ELEMENT (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!this->mixer) {
+ this->mixer = gst_alsa_mixer_new (this->device, GST_ALSA_MIXER_ALL);
+ if (!this->mixer)
+ goto open_failed;
+ _gst_alsa_mixer_set_interface (this->mixer, GST_MIXER (element));
+ }
+ 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_alsa_mixer_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 alsa mixer device '%s'", this->device));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
diff --git a/ext/alsa/gstalsamixerelement.h b/ext/alsa/gstalsamixerelement.h
new file mode 100644
index 0000000..16cb245
--- /dev/null
+++ b/ext/alsa/gstalsamixerelement.h
@@ -0,0 +1,61 @@
+/* ALSA mixer interface implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GST_ALSA_MIXER_ELEMENT_H__
+#define __GST_ALSA_MIXER_ELEMENT_H__
+
+
+#include "gstalsa.h"
+#include "gstalsamixer.h"
+
+G_BEGIN_DECLS
+
+#define GST_ALSA_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALSA_MIXER_ELEMENT,GstAlsaMixerElement))
+#define GST_ALSA_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALSA_MIXER_ELEMENT,GstAlsaMixerElementClass))
+#define GST_IS_ALSA_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALSA_MIXER_ELEMENT))
+#define GST_IS_ALSA_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALSA_MIXER_ELEMENT))
+#define GST_TYPE_ALSA_MIXER_ELEMENT (gst_alsa_mixer_element_get_type())
+
+typedef struct _GstAlsaMixerElement GstAlsaMixerElement;
+typedef struct _GstAlsaMixerElementClass GstAlsaMixerElementClass;
+
+/**
+ * GstAlsaMixerElement
+ *
+ * Opaque datastructure.
+ */
+struct _GstAlsaMixerElement {
+ GstElement parent;
+
+ GstAlsaMixer *mixer;
+ gchar *device;
+};
+
+struct _GstAlsaMixerElementClass {
+ GstElementClass parent;
+};
+
+
+GType gst_alsa_mixer_element_get_type (void);
+
+
+G_END_DECLS
+
+
+#endif /* __GST_ALSA_MIXER_ELEMENT_H__ */
diff --git a/ext/alsa/gstalsamixeroptions.c b/ext/alsa/gstalsamixeroptions.c
new file mode 100644
index 0000000..20bb89d
--- /dev/null
+++ b/ext/alsa/gstalsamixeroptions.c
@@ -0,0 +1,109 @@
+/* ALSA mixer object implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstalsamixeroptions.h"
+
+static void gst_alsa_mixer_options_init (GstAlsaMixerOptions * alsa_opts);
+static void gst_alsa_mixer_options_class_init (gpointer g_class,
+ gpointer class_data);
+
+static GstMixerOptionsClass *parent_class = NULL;
+
+GType
+gst_alsa_mixer_options_get_type (void)
+{
+ static GType opts_type = 0;
+
+ if (!opts_type) {
+ static const GTypeInfo opts_info = {
+ sizeof (GstAlsaMixerOptionsClass),
+ NULL,
+ NULL,
+ gst_alsa_mixer_options_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAlsaMixerOptions),
+ 0,
+ (GInstanceInitFunc) gst_alsa_mixer_options_init,
+ };
+
+ opts_type =
+ g_type_register_static (GST_TYPE_MIXER_OPTIONS, "GstAlsaMixerOptions",
+ &opts_info, 0);
+ }
+
+ return opts_type;
+}
+
+static void
+gst_alsa_mixer_options_class_init (gpointer g_class, gpointer class_data)
+{
+ parent_class = g_type_class_peek_parent (g_class);
+}
+
+static void
+gst_alsa_mixer_options_init (GstAlsaMixerOptions * alsa_opts)
+{
+}
+
+GstMixerOptions *
+gst_alsa_mixer_options_new (snd_mixer_elem_t * element, gint track_num)
+{
+ GstMixerOptions *opts;
+ GstAlsaMixerOptions *alsa_opts;
+ GstMixerTrack *track;
+ const gchar *label;
+ guint index;
+ gint num, i;
+ gchar str[256];
+
+ label = snd_mixer_selem_get_name (element);
+ index = snd_mixer_selem_get_index (element);
+
+ GST_LOG ("[%s,%u]", label, index);
+
+ opts = g_object_new (GST_ALSA_MIXER_OPTIONS_TYPE,
+ "untranslated-label", label, "index", index, NULL);
+ alsa_opts = (GstAlsaMixerOptions *) opts;
+ track = (GstMixerTrack *) opts;
+
+ /* set basic information */
+ track->label = g_strdup (label); /* FIXME: translate this? */
+ track->num_channels = 0;
+ track->flags = 0;
+ alsa_opts->element = element;
+ alsa_opts->track_num = track_num;
+
+ /* get enumerations for switch/options object */
+ num = snd_mixer_selem_get_enum_items (element);
+ for (i = 0; i < num; i++) {
+ if (snd_mixer_selem_get_enum_item_name (element, i, 255, str) < 0) {
+ g_object_unref (G_OBJECT (alsa_opts));
+ return NULL;
+ }
+
+ opts->values = g_list_append (opts->values, g_strdup (str));
+ }
+
+ return opts;
+}
diff --git a/ext/alsa/gstalsamixeroptions.h b/ext/alsa/gstalsamixeroptions.h
new file mode 100644
index 0000000..b3c36c0
--- /dev/null
+++ b/ext/alsa/gstalsamixeroptions.h
@@ -0,0 +1,62 @@
+/* ALSA mixer options object.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GST_ALSA_MIXER_OPTIONS_H__
+#define __GST_ALSA_MIXER_OPTIONS_H__
+
+
+#include "gstalsa.h"
+#include <gst/interfaces/mixeroptions.h>
+
+
+G_BEGIN_DECLS
+
+
+#define GST_ALSA_MIXER_OPTIONS_TYPE (gst_alsa_mixer_options_get_type ())
+#define GST_ALSA_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALSA_MIXER_OPTIONS,GstAlsaMixerOptions))
+#define GST_ALSA_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALSA_MIXER_OPTIONS,GstAlsaMixerOptionsClass))
+#define GST_IS_ALSA_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALSA_MIXER_OPTIONS))
+#define GST_IS_ALSA_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALSA_MIXER_OPTIONS))
+#define GST_TYPE_ALSA_MIXER_OPTIONS (gst_alsa_mixer_options_get_type())
+
+
+typedef struct _GstAlsaMixerOptions GstAlsaMixerOptions;
+typedef struct _GstAlsaMixerOptionsClass GstAlsaMixerOptionsClass;
+
+
+struct _GstAlsaMixerOptions {
+ GstMixerOptions parent;
+ snd_mixer_elem_t *element; /* the ALSA mixer element for this track */
+ gint track_num;
+};
+
+struct _GstAlsaMixerOptionsClass {
+ GstMixerOptionsClass parent;
+};
+
+
+GType gst_alsa_mixer_options_get_type (void);
+GstMixerOptions *gst_alsa_mixer_options_new (snd_mixer_elem_t * element,
+ gint track_num);
+
+
+G_END_DECLS
+
+
+#endif /* __GST_ALSA_MIXER_OPTIONS_H__ */
diff --git a/ext/alsa/gstalsamixertrack.c b/ext/alsa/gstalsamixertrack.c
new file mode 100644
index 0000000..dea8ef0
--- /dev/null
+++ b/ext/alsa/gstalsamixertrack.c
@@ -0,0 +1,356 @@
+/* ALSA mixer track implementation.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst-i18n-plugin.h>
+
+#include "gstalsamixertrack.h"
+
+static void gst_alsa_mixer_track_init (GstAlsaMixerTrack * alsa_track);
+static void gst_alsa_mixer_track_class_init (gpointer g_class,
+ gpointer class_data);
+
+static GstMixerTrackClass *parent_class = NULL;
+
+GType
+gst_alsa_mixer_track_get_type (void)
+{
+ static GType track_type = 0;
+
+ if (!track_type) {
+ static const GTypeInfo track_info = {
+ sizeof (GstAlsaMixerTrackClass),
+ NULL,
+ NULL,
+ gst_alsa_mixer_track_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAlsaMixerTrack),
+ 0,
+ (GInstanceInitFunc) gst_alsa_mixer_track_init,
+ NULL
+ };
+
+ track_type =
+ g_type_register_static (GST_TYPE_MIXER_TRACK, "GstAlsaMixerTrack",
+ &track_info, 0);
+ }
+
+ return track_type;
+}
+
+static void
+gst_alsa_mixer_track_class_init (gpointer g_class, gpointer class_data)
+{
+ parent_class = g_type_class_peek_parent (g_class);
+}
+
+static void
+gst_alsa_mixer_track_init (GstAlsaMixerTrack * alsa_track)
+{
+}
+
+static void
+gst_alsa_mixer_track_update_alsa_capabilities (GstAlsaMixerTrack * alsa_track)
+{
+ alsa_track->alsa_flags = 0;
+ alsa_track->capture_group = -1;
+
+ /* common flags */
+ if (snd_mixer_selem_has_common_volume (alsa_track->element))
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_VOLUME;
+
+ if (snd_mixer_selem_has_common_switch (alsa_track->element))
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_SWITCH;
+
+ /* Since we create two separate mixer track objects for alsa elements that
+ * support both playback and capture, we're going to 'hide' the alsa flags
+ * that don't pertain to this mixer track from alsa_flags, otherwise
+ * gst_alsa_mixer_track_update() is going to do things we don't want */
+
+ /* playback flags */
+ if ((GST_MIXER_TRACK (alsa_track)->flags & GST_MIXER_TRACK_OUTPUT)) {
+ if (snd_mixer_selem_has_playback_volume (alsa_track->element))
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PVOLUME;
+
+ if (snd_mixer_selem_has_playback_switch (alsa_track->element))
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PSWITCH;
+ }
+
+ /* capture flags */
+ if ((GST_MIXER_TRACK (alsa_track)->flags & GST_MIXER_TRACK_INPUT)) {
+ if (snd_mixer_selem_has_capture_volume (alsa_track->element))
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CVOLUME;
+
+ if (snd_mixer_selem_has_capture_switch (alsa_track->element)) {
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH;
+
+ if (snd_mixer_selem_has_capture_switch_exclusive (alsa_track->element)) {
+ alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH_EXCL;
+ alsa_track->capture_group =
+ snd_mixer_selem_get_capture_group (alsa_track->element);
+ }
+ }
+ }
+
+ GST_LOG ("[%s] alsa_flags=0x%08x, capture_group=%d",
+ snd_mixer_selem_get_name (alsa_track->element),
+ alsa_track->alsa_flags, alsa_track->capture_group);
+}
+
+inline static gboolean
+alsa_track_has_cap (GstAlsaMixerTrack * alsa_track, guint32 flag)
+{
+ return ((alsa_track->alsa_flags & flag) != 0);
+}
+
+GstMixerTrack *
+gst_alsa_mixer_track_new (snd_mixer_elem_t * element,
+ gint num, gint track_num, gint flags, gboolean sw,
+ GstAlsaMixerTrack * shared_mute_track, gboolean append_capture)
+{
+ GstAlsaMixerTrack *alsa_track;
+ GstMixerTrack *track;
+ const gchar *name;
+ guint index;
+ const gchar *label;
+ gint i;
+ long min = 0, max = 0;
+ const struct
+ {
+ const gchar orig[12];
+ const gchar trans[12];
+ } alsa_track_labels[] = {
+ {
+ "Master", N_("Master")}, {
+ "Bass", N_("Bass")}, {
+ "Treble", N_("Treble")}, {
+ "PCM", N_("PCM")}, {
+ "Synth", N_("Synth")}, {
+ "Line", N_("Line-in")}, {
+ "CD", N_("CD")}, {
+ "Mic", N_("Microphone")}, {
+ "PC Speaker", N_("PC Speaker")}, {
+ "Playback", N_("Playback")}, {
+ "Capture", N_("Capture")}
+ };
+
+ name = snd_mixer_selem_get_name (element);
+ index = snd_mixer_selem_get_index (element);
+
+ GST_LOG
+ ("[%s,%u] num=%d,track_num=%d,flags=0x%08x,sw=%s,shared_mute_track=%p",
+ name, index, num, track_num, flags, (sw) ? "true" : "false",
+ shared_mute_track);
+
+ track = (GstMixerTrack *) g_object_new (GST_ALSA_MIXER_TRACK_TYPE,
+ "untranslated-label", name, "index", index, NULL);
+
+ alsa_track = (GstAlsaMixerTrack *) track;
+
+ GST_LOG ("[%s] created new mixer track %p", name, track);
+
+ /* This reflects the assumptions used for GstAlsaMixerTrack */
+ if (!(! !(flags & GST_MIXER_TRACK_OUTPUT) ^ ! !(flags &
+ GST_MIXER_TRACK_INPUT))) {
+ GST_ERROR ("Mixer track must be either output or input!");
+ g_return_val_if_reached (NULL);
+ }
+
+ track->flags = flags;
+ alsa_track->element = element;
+ alsa_track->shared_mute = shared_mute_track;
+ alsa_track->track_num = track_num;
+ alsa_track->alsa_channels = 0;
+
+ gst_alsa_mixer_track_update_alsa_capabilities (alsa_track);
+
+ if (flags & GST_MIXER_TRACK_OUTPUT) {
+ while (alsa_track->alsa_channels < GST_ALSA_MAX_CHANNELS &&
+ snd_mixer_selem_has_playback_channel (element,
+ alsa_track->alsa_channels)) {
+ alsa_track->alsa_channels++;
+ }
+ GST_LOG ("[%s] %d output channels", name, alsa_track->alsa_channels);
+ } else if (flags & GST_MIXER_TRACK_INPUT) {
+ while (alsa_track->alsa_channels < GST_ALSA_MAX_CHANNELS &&
+ snd_mixer_selem_has_capture_channel (element,
+ alsa_track->alsa_channels)) {
+ alsa_track->alsa_channels++;
+ }
+ GST_LOG ("[%s] %d input channels", name, alsa_track->alsa_channels);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ if (sw)
+ track->num_channels = 0;
+ else
+ track->num_channels = alsa_track->alsa_channels;
+
+ /* translate the name if we can */
+ label = name;
+ for (i = 0; i < G_N_ELEMENTS (alsa_track_labels); ++i) {
+ if (g_utf8_collate (label, alsa_track_labels[i].orig) == 0) {
+ label = _(alsa_track_labels[i].trans);
+ break;
+ }
+ }
+
+ if (num == 0) {
+ track->label = g_strdup_printf ("%s%s%s", label,
+ append_capture ? " " : "", append_capture ? _("Capture") : "");
+ } else {
+ track->label = g_strdup_printf ("%s%s%s %d", label,
+ append_capture ? " " : "", append_capture ? _("Capture") : "", num);
+ }
+
+ /* set volume information */
+ if (track->num_channels > 0) {
+ if ((flags & GST_MIXER_TRACK_OUTPUT))
+ snd_mixer_selem_get_playback_volume_range (element, &min, &max);
+ else
+ snd_mixer_selem_get_capture_volume_range (element, &min, &max);
+ }
+ track->min_volume = (gint) min;
+ track->max_volume = (gint) max;
+
+ for (i = 0; i < track->num_channels; i++) {
+ long tmp = 0;
+
+ if (flags & GST_MIXER_TRACK_OUTPUT)
+ snd_mixer_selem_get_playback_volume (element, i, &tmp);
+ else
+ snd_mixer_selem_get_capture_volume (element, i, &tmp);
+
+ alsa_track->volumes[i] = (gint) tmp;
+ }
+
+ gst_alsa_mixer_track_update (alsa_track);
+
+ return track;
+}
+
+void
+gst_alsa_mixer_track_update (GstAlsaMixerTrack * alsa_track)
+{
+ GstMixerTrack *track = (GstMixerTrack *) alsa_track;
+ gint i;
+ gint audible = !(track->flags & GST_MIXER_TRACK_MUTE);
+
+ if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_PVOLUME)) {
+ /* update playback volume */
+ for (i = 0; i < track->num_channels; i++) {
+ long vol = 0;
+
+ snd_mixer_selem_get_playback_volume (alsa_track->element, i, &vol);
+ alsa_track->volumes[i] = (gint) vol;
+ }
+ }
+
+ if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_CVOLUME)) {
+ /* update capture volume */
+ for (i = 0; i < track->num_channels; i++) {
+ long vol = 0;
+
+ snd_mixer_selem_get_capture_volume (alsa_track->element, i, &vol);
+ alsa_track->volumes[i] = (gint) vol;
+ }
+ }
+
+ /* Any updates in flags? */
+ if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_PSWITCH)) {
+ int v = 0;
+
+ audible = 0;
+ for (i = 0; i < alsa_track->alsa_channels; ++i) {
+ snd_mixer_selem_get_playback_switch (alsa_track->element, i, &v);
+ audible += v;
+ }
+
+ } else if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_PVOLUME) &&
+ track->flags & GST_MIXER_TRACK_MUTE) {
+ /* check if user has raised volume with a parallel running application */
+
+ for (i = 0; i < track->num_channels; i++) {
+ long vol = 0;
+
+ snd_mixer_selem_get_playback_volume (alsa_track->element, i, &vol);
+
+ if (vol > track->min_volume) {
+ audible = 1;
+ break;
+ }
+ }
+ }
+
+ if (! !(audible) != !(track->flags & GST_MIXER_TRACK_MUTE)) {
+ if (audible) {
+ track->flags &= ~GST_MIXER_TRACK_MUTE;
+
+ if (alsa_track->shared_mute)
+ ((GstMixerTrack *) (alsa_track->shared_mute))->flags &=
+ ~GST_MIXER_TRACK_MUTE;
+ } else {
+ track->flags |= GST_MIXER_TRACK_MUTE;
+
+ if (alsa_track->shared_mute)
+ ((GstMixerTrack *) (alsa_track->shared_mute))->flags |=
+ GST_MIXER_TRACK_MUTE;
+ }
+ }
+
+ if (track->flags & GST_MIXER_TRACK_INPUT) {
+ gint recording = track->flags & GST_MIXER_TRACK_RECORD;
+
+ if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_CSWITCH)) {
+ int v = 0;
+
+ recording = 0;
+ for (i = 0; i < alsa_track->alsa_channels; ++i) {
+ snd_mixer_selem_get_capture_switch (alsa_track->element, i, &v);
+ recording += v;
+ }
+
+ } else if (alsa_track_has_cap (alsa_track, GST_ALSA_MIXER_TRACK_CVOLUME) &&
+ !(track->flags & GST_MIXER_TRACK_RECORD)) {
+ /* check if user has raised volume with a parallel running application */
+
+ for (i = 0; i < track->num_channels; i++) {
+ long vol = 0;
+
+ snd_mixer_selem_get_capture_volume (alsa_track->element, i, &vol);
+
+ if (vol > track->min_volume) {
+ recording = 1;
+ break;
+ }
+ }
+ }
+
+ if (recording)
+ track->flags |= GST_MIXER_TRACK_RECORD;
+ else
+ track->flags &= ~GST_MIXER_TRACK_RECORD;
+ }
+
+}
diff --git a/ext/alsa/gstalsamixertrack.h b/ext/alsa/gstalsamixertrack.h
new file mode 100644
index 0000000..acc64cb
--- /dev/null
+++ b/ext/alsa/gstalsamixertrack.h
@@ -0,0 +1,79 @@
+/* ALSA mixer track object.
+ * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GST_ALSA_MIXER_TRACK_H__
+#define __GST_ALSA_MIXER_TRACK_H__
+
+
+#include "gstalsa.h"
+#include <gst/interfaces/mixertrack.h>
+
+
+G_BEGIN_DECLS
+
+
+#define GST_ALSA_MIXER_TRACK_TYPE (gst_alsa_mixer_track_get_type ())
+#define GST_ALSA_MIXER_TRACK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALSA_MIXER_TRACK,GstAlsaMixerTrack))
+#define GST_ALSA_MIXER_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALSA_MIXER_TRACK,GstAlsaMixerTrackClass))
+#define GST_IS_ALSA_MIXER_TRACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALSA_MIXER_TRACK))
+#define GST_IS_ALSA_MIXER_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALSA_MIXER_TRACK))
+#define GST_TYPE_ALSA_MIXER_TRACK (gst_alsa_mixer_track_get_type())
+
+typedef struct _GstAlsaMixerTrack GstAlsaMixerTrack;
+typedef struct _GstAlsaMixerTrackClass GstAlsaMixerTrackClass;
+
+#define GST_ALSA_MIXER_TRACK_VOLUME (1<<0) /* common volume */
+#define GST_ALSA_MIXER_TRACK_PVOLUME (1<<1)
+#define GST_ALSA_MIXER_TRACK_CVOLUME (1<<2)
+#define GST_ALSA_MIXER_TRACK_SWITCH (1<<3) /* common switch */
+#define GST_ALSA_MIXER_TRACK_PSWITCH (1<<4)
+#define GST_ALSA_MIXER_TRACK_CSWITCH (1<<5)
+#define GST_ALSA_MIXER_TRACK_CSWITCH_EXCL (1<<6)
+
+#define GST_ALSA_MAX_CHANNELS (SND_MIXER_SCHN_LAST+1)
+
+struct _GstAlsaMixerTrack {
+ GstMixerTrack parent;
+ snd_mixer_elem_t *element; /* the ALSA mixer element for this track */
+ GstAlsaMixerTrack *shared_mute;
+ gint track_num;
+ guint32 alsa_flags; /* alsa track capabilities */
+ gint alsa_channels;
+ gint capture_group;
+ gint volumes[GST_ALSA_MAX_CHANNELS];
+};
+
+struct _GstAlsaMixerTrackClass {
+ GstMixerTrackClass parent;
+};
+
+GType gst_alsa_mixer_track_get_type (void);
+GstMixerTrack * gst_alsa_mixer_track_new (snd_mixer_elem_t * element,
+ gint num,
+ gint track_num,
+ gint flags,
+ gboolean sw, /* is simple switch? */
+ GstAlsaMixerTrack * shared_mute_track,
+ gboolean label_append_capture);
+void gst_alsa_mixer_track_update (GstAlsaMixerTrack * alsa_track);
+
+G_END_DECLS
+
+
+#endif /* __GST_ALSA_MIXER_TRACK_H__ */
diff --git a/ext/alsa/gstalsaplugin.c b/ext/alsa/gstalsaplugin.c
new file mode 100644
index 0000000..69f539d
--- /dev/null
+++ b/ext/alsa/gstalsaplugin.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2001 CodeFactory AB
+ * Copyright (C) 2001 Thomas Nyberg <thomas@codefactory.se>
+ * Copyright (C) 2001-2002 Andy Wingo <apwingo@eos.ncsu.edu>
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstalsasink.h"
+#include "gstalsasrc.h"
+#include "gstalsamixerelement.h"
+
+#include <gst/gst-i18n-plugin.h>
+
+GST_DEBUG_CATEGORY (alsa_debug);
+
+/* ALSA debugging wrapper */
+static void
+gst_alsa_error_wrapper (const char *file, int line, const char *function,
+ int err, const char *fmt, ...)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ va_list args;
+ gchar *str;
+
+ va_start (args, fmt);
+ str = g_strdup_vprintf (fmt, args);
+ va_end (args);
+ /* FIXME: use GST_LEVEL_ERROR here? Currently warning is used because we're
+ * able to catch enough of the errors that would be printed otherwise
+ */
+ gst_debug_log (alsa_debug, GST_LEVEL_WARNING, file, function, line, NULL,
+ "alsalib error: %s%s%s", str, err ? ": " : "",
+ err ? snd_strerror (err) : "");
+ g_free (str);
+#endif
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ int err;
+
+ if (!gst_element_register (plugin, "alsamixer", GST_RANK_NONE,
+ GST_TYPE_ALSA_MIXER_ELEMENT))
+ return FALSE;
+ if (!gst_element_register (plugin, "alsasrc", GST_RANK_PRIMARY,
+ GST_TYPE_ALSA_SRC))
+ return FALSE;
+ if (!gst_element_register (plugin, "alsasink", GST_RANK_PRIMARY,
+ GST_TYPE_ALSA_SINK))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (alsa_debug, "alsa", 0, "alsa plugins");
+
+#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
+
+ err = snd_lib_error_set_handler (gst_alsa_error_wrapper);
+ if (err != 0)
+ GST_WARNING ("failed to set alsa error handler");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "alsa",
+ "ALSA plugin library",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/alsa/gstalsasink.c b/ext/alsa/gstalsasink.c
new file mode 100644
index 0000000..8b1e627
--- /dev/null
+++ b/ext/alsa/gstalsasink.c
@@ -0,0 +1,1002 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * gstalsasink.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-alsasink
+ * @see_also: alsasrc, alsamixer
+ *
+ * This element renders raw audio samples using the ALSA api.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! alsasink
+ * ]| Play an Ogg/Vorbis file.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <getopt.h>
+#include <alsa/asoundlib.h>
+
+#include "gstalsa.h"
+#include "gstalsasink.h"
+#include "gstalsadeviceprobe.h"
+
+#include <gst/gst-i18n-plugin.h>
+
+#define DEFAULT_DEVICE "default"
+#define DEFAULT_DEVICE_NAME ""
+#define DEFAULT_CARD_NAME ""
+#define SPDIF_PERIOD_SIZE 1536
+#define SPDIF_BUFFER_SIZE 15360
+
+enum
+{
+ PROP_0,
+ PROP_DEVICE,
+ PROP_DEVICE_NAME,
+ PROP_CARD_NAME,
+ PROP_LAST
+};
+
+static void gst_alsasink_init_interfaces (GType type);
+#define gst_alsasink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAlsaSink, gst_alsasink,
+ GST_TYPE_AUDIO_SINK, gst_alsasink_init_interfaces (g_define_type_id));
+
+static void gst_alsasink_finalise (GObject * object);
+static void gst_alsasink_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_alsasink_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstCaps *gst_alsasink_getcaps (GstBaseSink * bsink, GstCaps * filter);
+
+static gboolean gst_alsasink_open (GstAudioSink * asink);
+static gboolean gst_alsasink_prepare (GstAudioSink * asink,
+ GstRingBufferSpec * spec);
+static gboolean gst_alsasink_unprepare (GstAudioSink * asink);
+static gboolean gst_alsasink_close (GstAudioSink * asink);
+static gint gst_alsasink_write (GstAudioSink * asink, gpointer data,
+ guint length);
+static guint gst_alsasink_delay (GstAudioSink * asink);
+static void gst_alsasink_reset (GstAudioSink * asink);
+
+static gint output_ref; /* 0 */
+static snd_output_t *output; /* NULL */
+static GStaticMutex output_mutex = G_STATIC_MUTEX_INIT;
+
+static GstStaticPadTemplate alsasink_sink_factory =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "formats = (string) " GST_AUDIO_FORMATS_ALL ", "
+ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]; "
+ "audio/x-iec958")
+ );
+
+static void
+gst_alsasink_finalise (GObject * object)
+{
+ GstAlsaSink *sink = GST_ALSA_SINK (object);
+
+ g_free (sink->device);
+ g_mutex_free (sink->alsa_lock);
+
+ g_static_mutex_lock (&output_mutex);
+ --output_ref;
+ if (output_ref == 0) {
+ snd_output_close (output);
+ output = NULL;
+ }
+ g_static_mutex_unlock (&output_mutex);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_alsasink_init_interfaces (GType type)
+{
+ gst_alsa_type_add_device_property_probe_interface (type);
+}
+
+static void
+gst_alsasink_class_init (GstAlsaSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+ GstAudioSinkClass *gstaudiosink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+ gstaudiosink_class = (GstAudioSinkClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_alsasink_finalise;
+ gobject_class->get_property = gst_alsasink_get_property;
+ gobject_class->set_property = gst_alsasink_set_property;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Audio sink (ALSA)", "Sink/Audio",
+ "Output to a sound card via ALSA", "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&alsasink_sink_factory));
+
+ gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_alsasink_getcaps);
+
+ gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_alsasink_open);
+ gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_alsasink_prepare);
+ gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_alsasink_unprepare);
+ gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_alsasink_close);
+ gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_alsasink_write);
+ gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_alsasink_delay);
+ gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_alsasink_reset);
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device",
+ "ALSA device, as defined in an asound configuration file",
+ 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_CARD_NAME,
+ g_param_spec_string ("card-name", "Card name",
+ "Human-readable name of the sound card", DEFAULT_CARD_NAME,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_alsasink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAlsaSink *sink;
+
+ sink = GST_ALSA_SINK (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_free (sink->device);
+ sink->device = g_value_dup_string (value);
+ /* setting NULL restores the default device */
+ if (sink->device == NULL) {
+ sink->device = g_strdup (DEFAULT_DEVICE);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_alsasink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAlsaSink *sink;
+
+ sink = GST_ALSA_SINK (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_value_set_string (value, sink->device);
+ break;
+ case PROP_DEVICE_NAME:
+ g_value_take_string (value,
+ gst_alsa_find_device_name (GST_OBJECT_CAST (sink),
+ sink->device, sink->handle, SND_PCM_STREAM_PLAYBACK));
+ break;
+ case PROP_CARD_NAME:
+ g_value_take_string (value,
+ gst_alsa_find_card_name (GST_OBJECT_CAST (sink),
+ sink->device, SND_PCM_STREAM_PLAYBACK));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_alsasink_init (GstAlsaSink * alsasink)
+{
+ GST_DEBUG_OBJECT (alsasink, "initializing alsasink");
+
+ alsasink->device = g_strdup (DEFAULT_DEVICE);
+ alsasink->handle = NULL;
+ alsasink->cached_caps = NULL;
+ alsasink->alsa_lock = g_mutex_new ();
+
+ g_static_mutex_lock (&output_mutex);
+ if (output_ref == 0) {
+ snd_output_stdio_attach (&output, stdout, 0);
+ ++output_ref;
+ }
+ g_static_mutex_unlock (&output_mutex);
+}
+
+#define CHECK(call, error) \
+G_STMT_START { \
+if ((err = call) < 0) \
+ goto error; \
+} G_STMT_END;
+
+static GstCaps *
+gst_alsasink_getcaps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstElementClass *element_class;
+ GstPadTemplate *pad_template;
+ GstAlsaSink *sink = GST_ALSA_SINK (bsink);
+ GstCaps *caps, *templ_caps;
+
+ if (sink->handle == NULL) {
+ GST_DEBUG_OBJECT (sink, "device not open, using template caps");
+ return NULL; /* base class will get template caps for us */
+ }
+
+ if (sink->cached_caps) {
+ GST_LOG_OBJECT (sink, "Returning cached caps");
+ if (filter)
+ return gst_caps_intersect_full (filter, sink->cached_caps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ return gst_caps_ref (sink->cached_caps);
+ }
+
+ element_class = GST_ELEMENT_GET_CLASS (sink);
+ pad_template = gst_element_class_get_pad_template (element_class, "sink");
+ g_return_val_if_fail (pad_template != NULL, NULL);
+
+ templ_caps = gst_pad_template_get_caps (pad_template);
+ caps = gst_alsa_probe_supported_formats (GST_OBJECT (sink), sink->handle,
+ templ_caps);
+ gst_caps_unref (templ_caps);
+
+ if (caps) {
+ sink->cached_caps = gst_caps_ref (caps);
+ }
+
+ GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, caps);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ return intersection;
+ } else {
+ return caps;
+ }
+}
+
+static int
+set_hwparams (GstAlsaSink * alsa)
+{
+ guint rrate;
+ gint err;
+ snd_pcm_hw_params_t *params;
+ guint period_time, buffer_time;
+
+ snd_pcm_hw_params_malloc (&params);
+
+ GST_DEBUG_OBJECT (alsa, "Negotiating to %d channels @ %d Hz (format = %s) "
+ "SPDIF (%d)", alsa->channels, alsa->rate,
+ snd_pcm_format_name (alsa->format), alsa->iec958);
+
+ /* start with requested values, if we cannot configure alsa for those values,
+ * we set these values to -1, which will leave the default alsa values */
+ buffer_time = alsa->buffer_time;
+ period_time = alsa->period_time;
+
+retry:
+ /* choose all parameters */
+ CHECK (snd_pcm_hw_params_any (alsa->handle, params), no_config);
+ /* set the interleaved read/write format */
+ CHECK (snd_pcm_hw_params_set_access (alsa->handle, params, alsa->access),
+ wrong_access);
+ /* set the sample format */
+ if (alsa->iec958) {
+ /* Try to use big endian first else fallback to le and swap bytes */
+ if (snd_pcm_hw_params_set_format (alsa->handle, params, alsa->format) < 0) {
+ alsa->format = SND_PCM_FORMAT_S16_LE;
+ alsa->need_swap = TRUE;
+ GST_DEBUG_OBJECT (alsa, "falling back to little endian with swapping");
+ } else {
+ alsa->need_swap = FALSE;
+ }
+ }
+ CHECK (snd_pcm_hw_params_set_format (alsa->handle, params, alsa->format),
+ no_sample_format);
+ /* set the count of channels */
+ CHECK (snd_pcm_hw_params_set_channels (alsa->handle, params, alsa->channels),
+ no_channels);
+ /* set the stream rate */
+ rrate = alsa->rate;
+ CHECK (snd_pcm_hw_params_set_rate_near (alsa->handle, params, &rrate, NULL),
+ no_rate);
+ if (rrate != alsa->rate)
+ goto rate_match;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ /* get and dump some limits */
+ {
+ guint min, max;
+
+ snd_pcm_hw_params_get_buffer_time_min (params, &min, NULL);
+ snd_pcm_hw_params_get_buffer_time_max (params, &max, NULL);
+
+ GST_DEBUG_OBJECT (alsa, "buffer time %u, min %u, max %u",
+ alsa->buffer_time, min, max);
+
+ snd_pcm_hw_params_get_period_time_min (params, &min, NULL);
+ snd_pcm_hw_params_get_period_time_max (params, &max, NULL);
+
+ GST_DEBUG_OBJECT (alsa, "period time %u, min %u, max %u",
+ alsa->period_time, min, max);
+
+ snd_pcm_hw_params_get_periods_min (params, &min, NULL);
+ snd_pcm_hw_params_get_periods_max (params, &max, NULL);
+
+ GST_DEBUG_OBJECT (alsa, "periods min %u, max %u", min, max);
+ }
+#endif
+
+ /* now try to configure the buffer time and period time, if one
+ * of those fail, we fall back to the defaults and emit a warning. */
+ if (buffer_time != -1 && !alsa->iec958) {
+ /* set the buffer time */
+ if ((err = snd_pcm_hw_params_set_buffer_time_near (alsa->handle, params,
+ &buffer_time, NULL)) < 0) {
+ GST_ELEMENT_WARNING (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set buffer time %i for playback: %s",
+ buffer_time, snd_strerror (err)));
+ /* disable buffer_time the next round */
+ buffer_time = -1;
+ goto retry;
+ }
+ GST_DEBUG_OBJECT (alsa, "buffer time %u", buffer_time);
+ }
+ if (period_time != -1 && !alsa->iec958) {
+ /* set the period time */
+ if ((err = snd_pcm_hw_params_set_period_time_near (alsa->handle, params,
+ &period_time, NULL)) < 0) {
+ GST_ELEMENT_WARNING (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set period time %i for playback: %s",
+ period_time, snd_strerror (err)));
+ /* disable period_time the next round */
+ period_time = -1;
+ goto retry;
+ }
+ GST_DEBUG_OBJECT (alsa, "period time %u", period_time);
+ }
+
+ /* Set buffer size and period size manually for SPDIF */
+ if (G_UNLIKELY (alsa->iec958)) {
+ snd_pcm_uframes_t buffer_size = SPDIF_BUFFER_SIZE;
+ snd_pcm_uframes_t period_size = SPDIF_PERIOD_SIZE;
+
+ CHECK (snd_pcm_hw_params_set_buffer_size_near (alsa->handle, params,
+ &buffer_size), buffer_size);
+ CHECK (snd_pcm_hw_params_set_period_size_near (alsa->handle, params,
+ &period_size, NULL), period_size);
+ }
+
+ /* write the parameters to device */
+ CHECK (snd_pcm_hw_params (alsa->handle, params), set_hw_params);
+
+ /* now get the configured values */
+ CHECK (snd_pcm_hw_params_get_buffer_size (params, &alsa->buffer_size),
+ buffer_size);
+ CHECK (snd_pcm_hw_params_get_period_size (params, &alsa->period_size, NULL),
+ period_size);
+
+ GST_DEBUG_OBJECT (alsa, "buffer size %lu, period size %lu", alsa->buffer_size,
+ alsa->period_size);
+
+ snd_pcm_hw_params_free (params);
+ return 0;
+
+ /* ERRORS */
+no_config:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Broken configuration for playback: no configurations available: %s",
+ snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+wrong_access:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Access type not available for playback: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_sample_format:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Sample format not available for playback: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_channels:
+ {
+ gchar *msg = NULL;
+
+ if ((alsa->channels) == 1)
+ msg = g_strdup (_("Could not open device for playback in mono mode."));
+ if ((alsa->channels) == 2)
+ msg = g_strdup (_("Could not open device for playback in stereo mode."));
+ if ((alsa->channels) > 2)
+ msg =
+ g_strdup_printf (_
+ ("Could not open device for playback in %d-channel mode."),
+ alsa->channels);
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, ("%s", msg),
+ ("%s", snd_strerror (err)));
+ g_free (msg);
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_rate:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Rate %iHz not available for playback: %s",
+ alsa->rate, snd_strerror (err)));
+ return err;
+ }
+rate_match:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Rate doesn't match (requested %iHz, get %iHz)", alsa->rate, err));
+ snd_pcm_hw_params_free (params);
+ return -EINVAL;
+ }
+buffer_size:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to get buffer size for playback: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+period_size:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to get period size for playback: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+set_hw_params:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set hw params for playback: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+}
+
+static int
+set_swparams (GstAlsaSink * alsa)
+{
+ int err;
+ snd_pcm_sw_params_t *params;
+
+ snd_pcm_sw_params_malloc (&params);
+
+ /* get the current swparams */
+ CHECK (snd_pcm_sw_params_current (alsa->handle, params), no_config);
+ /* start the transfer when the buffer is almost full: */
+ /* (buffer_size / avail_min) * avail_min */
+ CHECK (snd_pcm_sw_params_set_start_threshold (alsa->handle, params,
+ (alsa->buffer_size / alsa->period_size) * alsa->period_size),
+ start_threshold);
+
+ /* allow the transfer when at least period_size samples can be processed */
+ CHECK (snd_pcm_sw_params_set_avail_min (alsa->handle, params,
+ alsa->period_size), set_avail);
+
+#if GST_CHECK_ALSA_VERSION(1,0,16)
+ /* snd_pcm_sw_params_set_xfer_align() is deprecated, alignment is always 1 */
+#else
+ /* align all transfers to 1 sample */
+ CHECK (snd_pcm_sw_params_set_xfer_align (alsa->handle, params, 1), set_align);
+#endif
+
+ /* write the parameters to the playback device */
+ CHECK (snd_pcm_sw_params (alsa->handle, params), set_sw_params);
+
+ snd_pcm_sw_params_free (params);
+ return 0;
+
+ /* ERRORS */
+no_config:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to determine current swparams for playback: %s",
+ snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+start_threshold:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set start threshold mode for playback: %s",
+ snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+set_avail:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set avail min for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+#if !GST_CHECK_ALSA_VERSION(1,0,16)
+set_align:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set transfer align for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+#endif
+set_sw_params:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set sw params for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+}
+
+static gboolean
+alsasink_parse_spec (GstAlsaSink * alsa, GstRingBufferSpec * spec)
+{
+ /* Initialize our boolean */
+ alsa->iec958 = FALSE;
+
+ switch (spec->type) {
+ case GST_BUFTYPE_RAW:
+ switch (GST_AUDIO_INFO_FORMAT (&spec->info)) {
+ case GST_AUDIO_FORMAT_U8:
+ alsa->format = SND_PCM_FORMAT_U8;
+ break;
+ case GST_AUDIO_FORMAT_S8:
+ alsa->format = SND_PCM_FORMAT_S8;
+ break;
+ case GST_AUDIO_FORMAT_S16LE:
+ alsa->format = SND_PCM_FORMAT_S16_LE;
+ break;
+ case GST_AUDIO_FORMAT_S16BE:
+ alsa->format = SND_PCM_FORMAT_S16_BE;
+ break;
+ case GST_AUDIO_FORMAT_U16LE:
+ alsa->format = SND_PCM_FORMAT_U16_LE;
+ break;
+ case GST_AUDIO_FORMAT_U16BE:
+ alsa->format = SND_PCM_FORMAT_U16_BE;
+ break;
+ case GST_AUDIO_FORMAT_S24_32LE:
+ alsa->format = SND_PCM_FORMAT_S24_LE;
+ break;
+ case GST_AUDIO_FORMAT_S24_32BE:
+ alsa->format = SND_PCM_FORMAT_S24_BE;
+ break;
+ case GST_AUDIO_FORMAT_U24_32LE:
+ alsa->format = SND_PCM_FORMAT_U24_LE;
+ break;
+ case GST_AUDIO_FORMAT_U24_32BE:
+ alsa->format = SND_PCM_FORMAT_U24_BE;
+ break;
+ case GST_AUDIO_FORMAT_S32LE:
+ alsa->format = SND_PCM_FORMAT_S32_LE;
+ break;
+ case GST_AUDIO_FORMAT_S32BE:
+ alsa->format = SND_PCM_FORMAT_S32_BE;
+ break;
+ case GST_AUDIO_FORMAT_U32LE:
+ alsa->format = SND_PCM_FORMAT_U32_LE;
+ break;
+ case GST_AUDIO_FORMAT_U32BE:
+ alsa->format = SND_PCM_FORMAT_U32_BE;
+ break;
+ case GST_AUDIO_FORMAT_S24LE:
+ alsa->format = SND_PCM_FORMAT_S24_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S24BE:
+ alsa->format = SND_PCM_FORMAT_S24_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U24LE:
+ alsa->format = SND_PCM_FORMAT_U24_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U24BE:
+ alsa->format = SND_PCM_FORMAT_U24_3BE;
+ break;
+ case GST_AUDIO_FORMAT_S20LE:
+ alsa->format = SND_PCM_FORMAT_S20_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S20BE:
+ alsa->format = SND_PCM_FORMAT_S20_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U20LE:
+ alsa->format = SND_PCM_FORMAT_U20_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U20BE:
+ alsa->format = SND_PCM_FORMAT_U20_3BE;
+ break;
+ case GST_AUDIO_FORMAT_S18LE:
+ alsa->format = SND_PCM_FORMAT_S18_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S18BE:
+ alsa->format = SND_PCM_FORMAT_S18_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U18LE:
+ alsa->format = SND_PCM_FORMAT_U18_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U18BE:
+ alsa->format = SND_PCM_FORMAT_U18_3BE;
+ break;
+ case GST_AUDIO_FORMAT_F32LE:
+ alsa->format = SND_PCM_FORMAT_FLOAT_LE;
+ break;
+ case GST_AUDIO_FORMAT_F32BE:
+ alsa->format = SND_PCM_FORMAT_FLOAT_BE;
+ break;
+ case GST_AUDIO_FORMAT_F64LE:
+ alsa->format = SND_PCM_FORMAT_FLOAT64_LE;
+ break;
+ case GST_AUDIO_FORMAT_F64BE:
+ alsa->format = SND_PCM_FORMAT_FLOAT64_BE;
+ break;
+ default:
+ goto error;
+ }
+ break;
+ case GST_BUFTYPE_A_LAW:
+ alsa->format = SND_PCM_FORMAT_A_LAW;
+ break;
+ case GST_BUFTYPE_MU_LAW:
+ alsa->format = SND_PCM_FORMAT_MU_LAW;
+ break;
+ case GST_BUFTYPE_IEC958:
+ alsa->format = SND_PCM_FORMAT_S16_BE;
+ alsa->iec958 = TRUE;
+ break;
+ default:
+ goto error;
+
+ }
+ alsa->rate = GST_AUDIO_INFO_RATE (&spec->info);
+ alsa->channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
+ alsa->buffer_time = spec->buffer_time;
+ alsa->period_time = spec->latency_time;
+ alsa->access = SND_PCM_ACCESS_RW_INTERLEAVED;
+
+ return TRUE;
+
+ /* ERRORS */
+error:
+ {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasink_open (GstAudioSink * asink)
+{
+ GstAlsaSink *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ /* open in non-blocking mode, we'll use snd_pcm_wait() for space to become
+ * available. */
+ CHECK (snd_pcm_open (&alsa->handle, alsa->device, SND_PCM_STREAM_PLAYBACK,
+ SND_PCM_NONBLOCK), open_error);
+ GST_LOG_OBJECT (alsa, "Opened device %s", alsa->device);
+
+ return TRUE;
+
+ /* ERRORS */
+open_error:
+ {
+ if (err == -EBUSY) {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, BUSY,
+ (_("Could not open audio device for playback. "
+ "Device is being used by another application.")),
+ ("Device '%s' is busy", alsa->device));
+ } else {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, OPEN_WRITE,
+ (_("Could not open audio device for playback.")),
+ ("Playback open error on device '%s': %s", alsa->device,
+ snd_strerror (err)));
+ }
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
+{
+ GstAlsaSink *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ if (spec->type == GST_BUFTYPE_IEC958) {
+ snd_pcm_close (alsa->handle);
+ alsa->handle = gst_alsa_open_iec958_pcm (GST_OBJECT (alsa));
+ if (G_UNLIKELY (!alsa->handle)) {
+ goto no_iec958;
+ }
+ }
+
+ if (!alsasink_parse_spec (alsa, spec))
+ goto spec_parse;
+
+ CHECK (set_hwparams (alsa), hw_params_failed);
+ CHECK (set_swparams (alsa), sw_params_failed);
+
+ alsa->bpf = GST_AUDIO_INFO_BPF (&spec->info);
+ spec->segsize = alsa->period_size * alsa->bpf;
+ spec->segtotal = alsa->buffer_size / alsa->period_size;
+
+ {
+ snd_output_t *out_buf = NULL;
+ char *msg = NULL;
+
+ snd_output_buffer_open (&out_buf);
+ snd_pcm_dump_hw_setup (alsa->handle, out_buf);
+ snd_output_buffer_string (out_buf, &msg);
+ GST_DEBUG_OBJECT (alsa, "Hardware setup: \n%s", msg);
+ snd_output_close (out_buf);
+ snd_output_buffer_open (&out_buf);
+ snd_pcm_dump_sw_setup (alsa->handle, out_buf);
+ snd_output_buffer_string (out_buf, &msg);
+ GST_DEBUG_OBJECT (alsa, "Software setup: \n%s", msg);
+ snd_output_close (out_buf);
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+no_iec958:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, OPEN_WRITE, (NULL),
+ ("Could not open IEC958 (SPDIF) device for playback"));
+ return FALSE;
+ }
+spec_parse:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Error parsing spec"));
+ return FALSE;
+ }
+hw_params_failed:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Setting of hwparams failed: %s", snd_strerror (err)));
+ return FALSE;
+ }
+sw_params_failed:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Setting of swparams failed: %s", snd_strerror (err)));
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasink_unprepare (GstAudioSink * asink)
+{
+ GstAlsaSink *alsa;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ snd_pcm_drop (alsa->handle);
+ snd_pcm_hw_free (alsa->handle);
+
+ return TRUE;
+}
+
+static gboolean
+gst_alsasink_close (GstAudioSink * asink)
+{
+ GstAlsaSink *alsa = GST_ALSA_SINK (asink);
+
+ if (alsa->handle) {
+ snd_pcm_close (alsa->handle);
+ alsa->handle = NULL;
+ }
+ gst_caps_replace (&alsa->cached_caps, NULL);
+
+ return TRUE;
+}
+
+
+/*
+ * Underrun and suspend recovery
+ */
+static gint
+xrun_recovery (GstAlsaSink * alsa, snd_pcm_t * handle, gint err)
+{
+ GST_DEBUG_OBJECT (alsa, "xrun recovery %d", err);
+
+ if (err == -EPIPE) { /* under-run */
+ err = snd_pcm_prepare (handle);
+ if (err < 0)
+ GST_WARNING_OBJECT (alsa,
+ "Can't recovery from underrun, prepare failed: %s",
+ snd_strerror (err));
+ return 0;
+ } else if (err == -ESTRPIPE) {
+ while ((err = snd_pcm_resume (handle)) == -EAGAIN)
+ g_usleep (100); /* wait until the suspend flag is released */
+
+ if (err < 0) {
+ err = snd_pcm_prepare (handle);
+ if (err < 0)
+ GST_WARNING_OBJECT (alsa,
+ "Can't recovery from suspend, prepare failed: %s",
+ snd_strerror (err));
+ }
+ return 0;
+ }
+ return err;
+}
+
+static gint
+gst_alsasink_write (GstAudioSink * asink, gpointer data, guint length)
+{
+ GstAlsaSink *alsa;
+ gint err;
+ gint cptr;
+ gint16 *ptr = data;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ if (alsa->iec958 && alsa->need_swap) {
+ guint i;
+
+ GST_DEBUG_OBJECT (asink, "swapping bytes");
+ for (i = 0; i < length / 2; i++) {
+ ptr[i] = GUINT16_SWAP_LE_BE (ptr[i]);
+ }
+ }
+
+ GST_LOG_OBJECT (asink, "received audio samples buffer of %u bytes", length);
+
+ cptr = length / alsa->bpf;
+
+ GST_ALSA_SINK_LOCK (asink);
+ while (cptr > 0) {
+ /* start by doing a blocking wait for free space. Set the timeout
+ * to 4 times the period time */
+ err = snd_pcm_wait (alsa->handle, (4 * alsa->period_time / 1000));
+ if (err < 0) {
+ GST_DEBUG_OBJECT (asink, "wait error, %d", err);
+ } else {
+ err = snd_pcm_writei (alsa->handle, ptr, cptr);
+ }
+
+ GST_DEBUG_OBJECT (asink, "written %d frames out of %d", err, cptr);
+ if (err < 0) {
+ GST_DEBUG_OBJECT (asink, "Write error: %s", snd_strerror (err));
+ if (err == -EAGAIN) {
+ continue;
+ } else if (xrun_recovery (alsa, alsa->handle, err) < 0) {
+ goto write_error;
+ }
+ continue;
+ }
+
+ ptr += snd_pcm_frames_to_bytes (alsa->handle, err);
+ cptr -= err;
+ }
+ GST_ALSA_SINK_UNLOCK (asink);
+
+ return length - (cptr * alsa->bpf);
+
+write_error:
+ {
+ GST_ALSA_SINK_UNLOCK (asink);
+ return length; /* skip one period */
+ }
+}
+
+static guint
+gst_alsasink_delay (GstAudioSink * asink)
+{
+ GstAlsaSink *alsa;
+ snd_pcm_sframes_t delay;
+ int res;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ res = snd_pcm_delay (alsa->handle, &delay);
+ if (G_UNLIKELY (res < 0)) {
+ /* on errors, report 0 delay */
+ GST_DEBUG_OBJECT (alsa, "snd_pcm_delay returned %d", res);
+ delay = 0;
+ }
+ if (G_UNLIKELY (delay < 0)) {
+ /* make sure we never return a negative delay */
+ GST_WARNING_OBJECT (alsa, "snd_pcm_delay returned negative delay");
+ delay = 0;
+ }
+
+ return delay;
+}
+
+static void
+gst_alsasink_reset (GstAudioSink * asink)
+{
+ GstAlsaSink *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SINK (asink);
+
+ GST_ALSA_SINK_LOCK (asink);
+ GST_DEBUG_OBJECT (alsa, "drop");
+ CHECK (snd_pcm_drop (alsa->handle), drop_error);
+ GST_DEBUG_OBJECT (alsa, "prepare");
+ CHECK (snd_pcm_prepare (alsa->handle), prepare_error);
+ GST_DEBUG_OBJECT (alsa, "reset done");
+ GST_ALSA_SINK_UNLOCK (asink);
+
+ return;
+
+ /* ERRORS */
+drop_error:
+ {
+ GST_ERROR_OBJECT (alsa, "alsa-reset: pcm drop error: %s",
+ snd_strerror (err));
+ GST_ALSA_SINK_UNLOCK (asink);
+ return;
+ }
+prepare_error:
+ {
+ GST_ERROR_OBJECT (alsa, "alsa-reset: pcm prepare error: %s",
+ snd_strerror (err));
+ GST_ALSA_SINK_UNLOCK (asink);
+ return;
+ }
+}
diff --git a/ext/alsa/gstalsasink.h b/ext/alsa/gstalsasink.h
new file mode 100644
index 0000000..a4bcdbe
--- /dev/null
+++ b/ext/alsa/gstalsasink.h
@@ -0,0 +1,86 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstalsasink.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_ALSASINK_H__
+#define __GST_ALSASINK_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudiosink.h>
+#include <alsa/asoundlib.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ALSA_SINK (gst_alsasink_get_type())
+#define GST_ALSA_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALSA_SINK,GstAlsaSink))
+#define GST_ALSA_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALSA_SINK,GstAlsaSinkClass))
+#define GST_IS_ALSA_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALSA_SINK))
+#define GST_IS_ALSA_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALSA_SINK))
+#define GST_ALSA_SINK_CAST(obj) ((GstAlsaSink *) (obj))
+
+typedef struct _GstAlsaSink GstAlsaSink;
+typedef struct _GstAlsaSinkClass GstAlsaSinkClass;
+
+#define GST_ALSA_SINK_GET_LOCK(obj) (GST_ALSA_SINK_CAST (obj)->alsa_lock)
+#define GST_ALSA_SINK_LOCK(obj) (g_mutex_lock (GST_ALSA_SINK_GET_LOCK (obj)))
+#define GST_ALSA_SINK_UNLOCK(obj) (g_mutex_unlock (GST_ALSA_SINK_GET_LOCK (obj)))
+
+/**
+ * GstAlsaSink:
+ *
+ * Opaque data structure
+ */
+struct _GstAlsaSink {
+ GstAudioSink sink;
+
+ gchar *device;
+
+ snd_pcm_t *handle;
+ snd_pcm_hw_params_t *hwparams;
+ snd_pcm_sw_params_t *swparams;
+
+ snd_pcm_access_t access;
+ snd_pcm_format_t format;
+ guint rate;
+ guint channels;
+ gint bpf;
+ gboolean iec958;
+ gboolean need_swap;
+
+ guint buffer_time;
+ guint period_time;
+ snd_pcm_uframes_t buffer_size;
+ snd_pcm_uframes_t period_size;
+
+ GstCaps *cached_caps;
+
+ GMutex *alsa_lock;
+};
+
+struct _GstAlsaSinkClass {
+ GstAudioSinkClass parent_class;
+};
+
+GType gst_alsasink_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_ALSASINK_H__ */
diff --git a/ext/alsa/gstalsasrc.c b/ext/alsa/gstalsasrc.c
new file mode 100644
index 0000000..cba9504
--- /dev/null
+++ b/ext/alsa/gstalsasrc.c
@@ -0,0 +1,996 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstalsasrc.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-alsasrc
+ * @see_also: alsasink, alsamixer
+ *
+ * This element reads data from an audio card using the ALSA API.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v alsasrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg
+ * ]| Record from a sound card using ALSA and encode to Ogg/Vorbis.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <getopt.h>
+#include <alsa/asoundlib.h>
+
+#include "gstalsasrc.h"
+#include "gstalsadeviceprobe.h"
+
+#include <gst/gst-i18n-plugin.h>
+
+#define DEFAULT_PROP_DEVICE "default"
+#define DEFAULT_PROP_DEVICE_NAME ""
+#define DEFAULT_PROP_CARD_NAME ""
+
+enum
+{
+ PROP_0,
+ PROP_DEVICE,
+ PROP_DEVICE_NAME,
+ PROP_CARD_NAME,
+ PROP_LAST
+};
+
+static void gst_alsasrc_init_interfaces (GType type);
+#define gst_alsasrc_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAlsaSrc, gst_alsasrc,
+ GST_TYPE_AUDIO_SRC, gst_alsasrc_init_interfaces (g_define_type_id));
+
+GST_IMPLEMENT_ALSA_MIXER_METHODS (GstAlsaSrc, gst_alsasrc_mixer);
+
+static void gst_alsasrc_finalize (GObject * object);
+static void gst_alsasrc_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_alsasrc_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstCaps *gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter);
+
+static gboolean gst_alsasrc_open (GstAudioSrc * asrc);
+static gboolean gst_alsasrc_prepare (GstAudioSrc * asrc,
+ GstRingBufferSpec * spec);
+static gboolean gst_alsasrc_unprepare (GstAudioSrc * asrc);
+static gboolean gst_alsasrc_close (GstAudioSrc * asrc);
+static guint gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length);
+static guint gst_alsasrc_delay (GstAudioSrc * asrc);
+static void gst_alsasrc_reset (GstAudioSrc * asrc);
+static GstStateChangeReturn gst_alsasrc_change_state (GstElement * element,
+ GstStateChange transition);
+static GstFlowReturn gst_alsasrc_create (GstBaseSrc * bsrc, guint64 offset,
+ guint length, GstBuffer ** outbuf);
+static GstClockTime gst_alsasrc_get_timestamp (GstAlsaSrc * src);
+
+
+/* AlsaSrc signals and args */
+enum
+{
+ LAST_SIGNAL
+};
+
+#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
+# define ALSA_SRC_FACTORY_ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN"
+#else
+# define ALSA_SRC_FACTORY_ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN"
+#endif
+
+static GstStaticPadTemplate alsasrc_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_FORMATS_ALL ", "
+ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
+ );
+
+static void
+gst_alsasrc_finalize (GObject * object)
+{
+ GstAlsaSrc *src = GST_ALSA_SRC (object);
+
+ g_free (src->device);
+ g_mutex_free (src->alsa_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_alsasrc_init_interfaces (GType type)
+{
+ static const GInterfaceInfo mixer_iface_info = {
+ (GInterfaceInitFunc) gst_alsasrc_mixer_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info);
+
+ gst_alsa_type_add_device_property_probe_interface (type);
+}
+
+static void
+gst_alsasrc_class_init (GstAlsaSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+ GstAudioSrcClass *gstaudiosrc_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+ gstaudiosrc_class = (GstAudioSrcClass *) klass;
+
+ gobject_class->finalize = gst_alsasrc_finalize;
+ gobject_class->get_property = gst_alsasrc_get_property;
+ gobject_class->set_property = gst_alsasrc_set_property;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Audio source (ALSA)", "Source/Audio",
+ "Read from a sound card via ALSA", "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&alsasrc_src_factory));
+
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_alsasrc_change_state);
+
+ gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_alsasrc_getcaps);
+ gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_alsasrc_create);
+
+ gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_alsasrc_open);
+ gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_alsasrc_prepare);
+ gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_alsasrc_unprepare);
+ gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_alsasrc_close);
+ gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_alsasrc_read);
+ gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_alsasrc_delay);
+ gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_alsasrc_reset);
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device",
+ "ALSA device, as defined in an asound configuration file",
+ DEFAULT_PROP_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_PROP_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_CARD_NAME,
+ g_param_spec_string ("card-name", "Card name",
+ "Human-readable name of the sound card",
+ DEFAULT_PROP_CARD_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+}
+
+static GstClockTime
+gst_alsasrc_get_timestamp (GstAlsaSrc * src)
+{
+ snd_pcm_status_t *status;
+ snd_htimestamp_t tstamp;
+ GstClockTime timestamp;
+ snd_pcm_uframes_t availmax;
+
+ GST_DEBUG_OBJECT (src, "Getting alsa timestamp!");
+
+ if (!src) {
+ GST_ERROR_OBJECT (src, "No alsa handle created yet !");
+ return 0;
+ }
+
+ if (snd_pcm_status_malloc (&status) != 0) {
+ GST_ERROR_OBJECT (src, "snd_pcm_status_malloc failed");
+ }
+
+ if (snd_pcm_status (src->handle, status) != 0) {
+ GST_ERROR_OBJECT (src, "snd_pcm_status failed");
+ }
+
+ /* get high resolution time stamp from driver */
+ snd_pcm_status_get_htstamp (status, &tstamp);
+ timestamp = GST_TIMESPEC_TO_TIME (tstamp);
+
+ /* Max available frames sets the depth of the buffer */
+ availmax = snd_pcm_status_get_avail_max (status);
+
+ /* Compensate the fact that the timestamp references the last sample */
+ timestamp -= gst_util_uint64_scale_int (availmax * 2, GST_SECOND, src->rate);
+ /* Compensate for the delay until the package is available */
+ timestamp += gst_util_uint64_scale_int (snd_pcm_status_get_delay (status),
+ GST_SECOND, src->rate);
+
+ snd_pcm_status_free (status);
+
+ GST_DEBUG_OBJECT (src, "ALSA timestamp : %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+ return timestamp;
+}
+
+static void
+gst_alsasrc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAlsaSrc *src;
+
+ src = GST_ALSA_SRC (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_free (src->device);
+ src->device = g_value_dup_string (value);
+ if (src->device == NULL) {
+ src->device = g_strdup (DEFAULT_PROP_DEVICE);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_alsasrc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAlsaSrc *src;
+
+ src = GST_ALSA_SRC (object);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_value_set_string (value, src->device);
+ break;
+ case PROP_DEVICE_NAME:
+ g_value_take_string (value,
+ gst_alsa_find_device_name (GST_OBJECT_CAST (src),
+ src->device, src->handle, SND_PCM_STREAM_CAPTURE));
+ break;
+ case PROP_CARD_NAME:
+ g_value_take_string (value,
+ gst_alsa_find_card_name (GST_OBJECT_CAST (src),
+ src->device, SND_PCM_STREAM_CAPTURE));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_alsasrc_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (element);
+ GstAlsaSrc *asrc = GST_ALSA_SRC (element);
+ GstClock *clk;
+
+ switch (transition) {
+ /* Show the compiler that we care */
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ clk = src->clock;
+ asrc->driver_timestamps = FALSE;
+ if (GST_IS_SYSTEM_CLOCK (clk)) {
+ gint clocktype;
+ g_object_get (clk, "clock-type", &clocktype, NULL);
+ if (clocktype == GST_CLOCK_TYPE_MONOTONIC) {
+ asrc->driver_timestamps = TRUE;
+ }
+ }
+ break;
+ }
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_alsasrc_create (GstBaseSrc * bsrc, guint64 offset, guint length,
+ GstBuffer ** outbuf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstAlsaSrc *asrc = GST_ALSA_SRC (bsrc);
+
+ ret =
+ GST_BASE_SRC_CLASS (parent_class)->create (bsrc, offset, length, outbuf);
+ if (asrc->driver_timestamps == TRUE && *outbuf) {
+ GST_BUFFER_TIMESTAMP (*outbuf) =
+ gst_alsasrc_get_timestamp ((GstAlsaSrc *) bsrc);
+ }
+
+ return ret;
+}
+
+static void
+gst_alsasrc_init (GstAlsaSrc * alsasrc)
+{
+ GST_DEBUG_OBJECT (alsasrc, "initializing");
+
+ alsasrc->device = g_strdup (DEFAULT_PROP_DEVICE);
+ alsasrc->cached_caps = NULL;
+ alsasrc->driver_timestamps = FALSE;
+
+ alsasrc->alsa_lock = g_mutex_new ();
+}
+
+#define CHECK(call, error) \
+G_STMT_START { \
+if ((err = call) < 0) \
+ goto error; \
+} G_STMT_END;
+
+
+static GstCaps *
+gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
+{
+ GstElementClass *element_class;
+ GstPadTemplate *pad_template;
+ GstAlsaSrc *src;
+ GstCaps *caps, *templ_caps;
+
+ src = GST_ALSA_SRC (bsrc);
+
+ if (src->handle == NULL) {
+ GST_DEBUG_OBJECT (src, "device not open, using template caps");
+ return NULL; /* base class will get template caps for us */
+ }
+
+ if (src->cached_caps) {
+ GST_LOG_OBJECT (src, "Returning cached caps");
+ if (filter)
+ return gst_caps_intersect_full (filter, src->cached_caps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ return gst_caps_ref (src->cached_caps);
+ }
+
+ element_class = GST_ELEMENT_GET_CLASS (src);
+ pad_template = gst_element_class_get_pad_template (element_class, "src");
+ g_return_val_if_fail (pad_template != NULL, NULL);
+
+ templ_caps = gst_pad_template_get_caps (pad_template);
+ caps = gst_alsa_probe_supported_formats (GST_OBJECT (src), src->handle,
+ templ_caps);
+ gst_caps_unref (templ_caps);
+
+ if (caps) {
+ src->cached_caps = gst_caps_ref (caps);
+ }
+
+ GST_INFO_OBJECT (src, "returning caps %" GST_PTR_FORMAT, caps);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ return intersection;
+ } else {
+ return caps;
+ }
+}
+
+static int
+set_hwparams (GstAlsaSrc * alsa)
+{
+ guint rrate;
+ gint err;
+ snd_pcm_hw_params_t *params;
+
+ snd_pcm_hw_params_malloc (&params);
+
+ /* choose all parameters */
+ CHECK (snd_pcm_hw_params_any (alsa->handle, params), no_config);
+ /* set the interleaved read/write format */
+ CHECK (snd_pcm_hw_params_set_access (alsa->handle, params, alsa->access),
+ wrong_access);
+ /* set the sample format */
+ CHECK (snd_pcm_hw_params_set_format (alsa->handle, params, alsa->format),
+ no_sample_format);
+ /* set the count of channels */
+ CHECK (snd_pcm_hw_params_set_channels (alsa->handle, params, alsa->channels),
+ no_channels);
+ /* set the stream rate */
+ rrate = alsa->rate;
+ CHECK (snd_pcm_hw_params_set_rate_near (alsa->handle, params, &rrate, NULL),
+ no_rate);
+ if (rrate != alsa->rate)
+ goto rate_match;
+
+ if (alsa->buffer_time != -1) {
+ /* set the buffer time */
+ CHECK (snd_pcm_hw_params_set_buffer_time_near (alsa->handle, params,
+ &alsa->buffer_time, NULL), buffer_time);
+ }
+ if (alsa->period_time != -1) {
+ /* set the period time */
+ CHECK (snd_pcm_hw_params_set_period_time_near (alsa->handle, params,
+ &alsa->period_time, NULL), period_time);
+ }
+
+ /* write the parameters to device */
+ CHECK (snd_pcm_hw_params (alsa->handle, params), set_hw_params);
+
+ CHECK (snd_pcm_hw_params_get_buffer_size (params, &alsa->buffer_size),
+ buffer_size);
+
+ CHECK (snd_pcm_hw_params_get_period_size (params, &alsa->period_size, NULL),
+ period_size);
+
+ snd_pcm_hw_params_free (params);
+ return 0;
+
+ /* ERRORS */
+no_config:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Broken configuration for recording: no configurations available: %s",
+ snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+wrong_access:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Access type not available for recording: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_sample_format:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Sample format not available for recording: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_channels:
+ {
+ gchar *msg = NULL;
+
+ if ((alsa->channels) == 1)
+ msg = g_strdup (_("Could not open device for recording in mono mode."));
+ if ((alsa->channels) == 2)
+ msg = g_strdup (_("Could not open device for recording in stereo mode."));
+ if ((alsa->channels) > 2)
+ msg =
+ g_strdup_printf (_
+ ("Could not open device for recording in %d-channel mode"),
+ alsa->channels);
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, ("%s", msg),
+ ("%s", snd_strerror (err)));
+ g_free (msg);
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+no_rate:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Rate %iHz not available for recording: %s",
+ alsa->rate, snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+rate_match:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Rate doesn't match (requested %iHz, get %iHz)", alsa->rate, err));
+ snd_pcm_hw_params_free (params);
+ return -EINVAL;
+ }
+buffer_time:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set buffer time %i for recording: %s",
+ alsa->buffer_time, snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+buffer_size:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to get buffer size for recording: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+period_time:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set period time %i for recording: %s", alsa->period_time,
+ snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+period_size:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to get period size for recording: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+set_hw_params:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set hw params for recording: %s", snd_strerror (err)));
+ snd_pcm_hw_params_free (params);
+ return err;
+ }
+}
+
+static int
+set_swparams (GstAlsaSrc * alsa)
+{
+ int err;
+ snd_pcm_sw_params_t *params;
+
+ snd_pcm_sw_params_malloc (&params);
+
+ /* get the current swparams */
+ CHECK (snd_pcm_sw_params_current (alsa->handle, params), no_config);
+ /* allow the transfer when at least period_size samples can be processed */
+ CHECK (snd_pcm_sw_params_set_avail_min (alsa->handle, params,
+ alsa->period_size), set_avail);
+ /* start the transfer on first read */
+ CHECK (snd_pcm_sw_params_set_start_threshold (alsa->handle, params,
+ 0), start_threshold);
+
+#if GST_CHECK_ALSA_VERSION(1,0,16)
+ /* snd_pcm_sw_params_set_xfer_align() is deprecated, alignment is always 1 */
+#else
+ /* align all transfers to 1 sample */
+ CHECK (snd_pcm_sw_params_set_xfer_align (alsa->handle, params, 1), set_align);
+#endif
+
+ /* write the parameters to the recording device */
+ CHECK (snd_pcm_sw_params (alsa->handle, params), set_sw_params);
+
+ snd_pcm_sw_params_free (params);
+ return 0;
+
+ /* ERRORS */
+no_config:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to determine current swparams for playback: %s",
+ snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+start_threshold:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set start threshold mode for playback: %s",
+ snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+set_avail:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set avail min for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+#if !GST_CHECK_ALSA_VERSION(1,0,16)
+set_align:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set transfer align for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+#endif
+set_sw_params:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Unable to set sw params for playback: %s", snd_strerror (err)));
+ snd_pcm_sw_params_free (params);
+ return err;
+ }
+}
+
+static gboolean
+alsasrc_parse_spec (GstAlsaSrc * alsa, GstRingBufferSpec * spec)
+{
+ switch (spec->type) {
+ case GST_BUFTYPE_RAW:
+ switch (GST_AUDIO_INFO_FORMAT (&spec->info)) {
+ case GST_AUDIO_FORMAT_U8:
+ alsa->format = SND_PCM_FORMAT_U8;
+ break;
+ case GST_AUDIO_FORMAT_S8:
+ alsa->format = SND_PCM_FORMAT_S8;
+ break;
+ case GST_AUDIO_FORMAT_S16LE:
+ alsa->format = SND_PCM_FORMAT_S16_LE;
+ break;
+ case GST_AUDIO_FORMAT_S16BE:
+ alsa->format = SND_PCM_FORMAT_S16_BE;
+ break;
+ case GST_AUDIO_FORMAT_U16LE:
+ alsa->format = SND_PCM_FORMAT_U16_LE;
+ break;
+ case GST_AUDIO_FORMAT_U16BE:
+ alsa->format = SND_PCM_FORMAT_U16_BE;
+ break;
+ case GST_AUDIO_FORMAT_S24_32LE:
+ alsa->format = SND_PCM_FORMAT_S24_LE;
+ break;
+ case GST_AUDIO_FORMAT_S24_32BE:
+ alsa->format = SND_PCM_FORMAT_S24_BE;
+ break;
+ case GST_AUDIO_FORMAT_U24_32LE:
+ alsa->format = SND_PCM_FORMAT_U24_LE;
+ break;
+ case GST_AUDIO_FORMAT_U24_32BE:
+ alsa->format = SND_PCM_FORMAT_U24_BE;
+ break;
+ case GST_AUDIO_FORMAT_S32LE:
+ alsa->format = SND_PCM_FORMAT_S32_LE;
+ break;
+ case GST_AUDIO_FORMAT_S32BE:
+ alsa->format = SND_PCM_FORMAT_S32_BE;
+ break;
+ case GST_AUDIO_FORMAT_U32LE:
+ alsa->format = SND_PCM_FORMAT_U32_LE;
+ break;
+ case GST_AUDIO_FORMAT_U32BE:
+ alsa->format = SND_PCM_FORMAT_U32_BE;
+ break;
+ case GST_AUDIO_FORMAT_S24LE:
+ alsa->format = SND_PCM_FORMAT_S24_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S24BE:
+ alsa->format = SND_PCM_FORMAT_S24_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U24LE:
+ alsa->format = SND_PCM_FORMAT_U24_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U24BE:
+ alsa->format = SND_PCM_FORMAT_U24_3BE;
+ break;
+ case GST_AUDIO_FORMAT_S20LE:
+ alsa->format = SND_PCM_FORMAT_S20_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S20BE:
+ alsa->format = SND_PCM_FORMAT_S20_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U20LE:
+ alsa->format = SND_PCM_FORMAT_U20_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U20BE:
+ alsa->format = SND_PCM_FORMAT_U20_3BE;
+ break;
+ case GST_AUDIO_FORMAT_S18LE:
+ alsa->format = SND_PCM_FORMAT_S18_3LE;
+ break;
+ case GST_AUDIO_FORMAT_S18BE:
+ alsa->format = SND_PCM_FORMAT_S18_3BE;
+ break;
+ case GST_AUDIO_FORMAT_U18LE:
+ alsa->format = SND_PCM_FORMAT_U18_3LE;
+ break;
+ case GST_AUDIO_FORMAT_U18BE:
+ alsa->format = SND_PCM_FORMAT_U18_3BE;
+ break;
+ case GST_AUDIO_FORMAT_F32LE:
+ alsa->format = SND_PCM_FORMAT_FLOAT_LE;
+ break;
+ case GST_AUDIO_FORMAT_F32BE:
+ alsa->format = SND_PCM_FORMAT_FLOAT_BE;
+ break;
+ case GST_AUDIO_FORMAT_F64LE:
+ alsa->format = SND_PCM_FORMAT_FLOAT64_LE;
+ break;
+ case GST_AUDIO_FORMAT_F64BE:
+ alsa->format = SND_PCM_FORMAT_FLOAT64_BE;
+ break;
+ default:
+ goto error;
+ }
+ break;
+ case GST_BUFTYPE_A_LAW:
+ alsa->format = SND_PCM_FORMAT_A_LAW;
+ break;
+ case GST_BUFTYPE_MU_LAW:
+ alsa->format = SND_PCM_FORMAT_MU_LAW;
+ break;
+ default:
+ goto error;
+
+ }
+ alsa->rate = GST_AUDIO_INFO_RATE (&spec->info);
+ alsa->channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
+ alsa->buffer_time = spec->buffer_time;
+ alsa->period_time = spec->latency_time;
+ alsa->access = SND_PCM_ACCESS_RW_INTERLEAVED;
+
+ return TRUE;
+
+ /* ERRORS */
+error:
+ {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasrc_open (GstAudioSrc * asrc)
+{
+ GstAlsaSrc *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ CHECK (snd_pcm_open (&alsa->handle, alsa->device, SND_PCM_STREAM_CAPTURE,
+ SND_PCM_NONBLOCK), open_error);
+
+ if (!alsa->mixer)
+ alsa->mixer = gst_alsa_mixer_new (alsa->device, GST_ALSA_MIXER_CAPTURE);
+
+ return TRUE;
+
+ /* ERRORS */
+open_error:
+ {
+ if (err == -EBUSY) {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, BUSY,
+ (_("Could not open audio device for recording. "
+ "Device is being used by another application.")),
+ ("Device '%s' is busy", alsa->device));
+ } else {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, OPEN_READ,
+ (_("Could not open audio device for recording.")),
+ ("Recording open error on device '%s': %s", alsa->device,
+ snd_strerror (err)));
+ }
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
+{
+ GstAlsaSrc *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ if (!alsasrc_parse_spec (alsa, spec))
+ goto spec_parse;
+
+ CHECK (snd_pcm_nonblock (alsa->handle, 0), non_block);
+
+ CHECK (set_hwparams (alsa), hw_params_failed);
+ CHECK (set_swparams (alsa), sw_params_failed);
+ CHECK (snd_pcm_prepare (alsa->handle), prepare_failed);
+
+ alsa->bpf = GST_AUDIO_INFO_BPF (&spec->info);
+ spec->segsize = alsa->period_size * alsa->bpf;
+ spec->segtotal = alsa->buffer_size / alsa->period_size;
+
+ return TRUE;
+
+ /* ERRORS */
+spec_parse:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Error parsing spec"));
+ return FALSE;
+ }
+non_block:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Could not set device to blocking: %s", snd_strerror (err)));
+ return FALSE;
+ }
+hw_params_failed:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Setting of hwparams failed: %s", snd_strerror (err)));
+ return FALSE;
+ }
+sw_params_failed:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Setting of swparams failed: %s", snd_strerror (err)));
+ return FALSE;
+ }
+prepare_failed:
+ {
+ GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
+ ("Prepare failed: %s", snd_strerror (err)));
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_alsasrc_unprepare (GstAudioSrc * asrc)
+{
+ GstAlsaSrc *alsa;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ snd_pcm_drop (alsa->handle);
+ snd_pcm_hw_free (alsa->handle);
+ snd_pcm_nonblock (alsa->handle, 1);
+
+ return TRUE;
+}
+
+static gboolean
+gst_alsasrc_close (GstAudioSrc * asrc)
+{
+ GstAlsaSrc *alsa = GST_ALSA_SRC (asrc);
+
+ snd_pcm_close (alsa->handle);
+ alsa->handle = NULL;
+
+ if (alsa->mixer) {
+ gst_alsa_mixer_free (alsa->mixer);
+ alsa->mixer = NULL;
+ }
+
+ gst_caps_replace (&alsa->cached_caps, NULL);
+
+ return TRUE;
+}
+
+/*
+ * Underrun and suspend recovery
+ */
+static gint
+xrun_recovery (GstAlsaSrc * alsa, snd_pcm_t * handle, gint err)
+{
+ GST_DEBUG_OBJECT (alsa, "xrun recovery %d", err);
+
+ if (err == -EPIPE) { /* under-run */
+ err = snd_pcm_prepare (handle);
+ if (err < 0)
+ GST_WARNING_OBJECT (alsa,
+ "Can't recovery from underrun, prepare failed: %s",
+ snd_strerror (err));
+ return 0;
+ } else if (err == -ESTRPIPE) {
+ while ((err = snd_pcm_resume (handle)) == -EAGAIN)
+ g_usleep (100); /* wait until the suspend flag is released */
+
+ if (err < 0) {
+ err = snd_pcm_prepare (handle);
+ if (err < 0)
+ GST_WARNING_OBJECT (alsa,
+ "Can't recovery from suspend, prepare failed: %s",
+ snd_strerror (err));
+ }
+ return 0;
+ }
+ return err;
+}
+
+static guint
+gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length)
+{
+ GstAlsaSrc *alsa;
+ gint err;
+ gint cptr;
+ gint16 *ptr;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ cptr = length / alsa->bpf;
+ ptr = data;
+
+ GST_ALSA_SRC_LOCK (asrc);
+ while (cptr > 0) {
+ if ((err = snd_pcm_readi (alsa->handle, ptr, cptr)) < 0) {
+ if (err == -EAGAIN) {
+ GST_DEBUG_OBJECT (asrc, "Read error: %s", snd_strerror (err));
+ continue;
+ } else if (xrun_recovery (alsa, alsa->handle, err) < 0) {
+ goto read_error;
+ }
+ continue;
+ }
+
+ ptr += err * alsa->channels;
+ cptr -= err;
+ }
+ GST_ALSA_SRC_UNLOCK (asrc);
+
+ return length - (cptr * alsa->bpf);
+
+read_error:
+ {
+ GST_ALSA_SRC_UNLOCK (asrc);
+ return length; /* skip one period */
+ }
+}
+
+static guint
+gst_alsasrc_delay (GstAudioSrc * asrc)
+{
+ GstAlsaSrc *alsa;
+ snd_pcm_sframes_t delay;
+ int res;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ res = snd_pcm_delay (alsa->handle, &delay);
+ if (G_UNLIKELY (res < 0)) {
+ GST_DEBUG_OBJECT (alsa, "snd_pcm_delay returned %d", res);
+ delay = 0;
+ }
+
+ return CLAMP (delay, 0, alsa->buffer_size);
+}
+
+static void
+gst_alsasrc_reset (GstAudioSrc * asrc)
+{
+ GstAlsaSrc *alsa;
+ gint err;
+
+ alsa = GST_ALSA_SRC (asrc);
+
+ GST_ALSA_SRC_LOCK (asrc);
+ GST_DEBUG_OBJECT (alsa, "drop");
+ CHECK (snd_pcm_drop (alsa->handle), drop_error);
+ GST_DEBUG_OBJECT (alsa, "prepare");
+ CHECK (snd_pcm_prepare (alsa->handle), prepare_error);
+ GST_DEBUG_OBJECT (alsa, "reset done");
+ GST_ALSA_SRC_UNLOCK (asrc);
+
+ return;
+
+ /* ERRORS */
+drop_error:
+ {
+ GST_ERROR_OBJECT (alsa, "alsa-reset: pcm drop error: %s",
+ snd_strerror (err));
+ GST_ALSA_SRC_UNLOCK (asrc);
+ return;
+ }
+prepare_error:
+ {
+ GST_ERROR_OBJECT (alsa, "alsa-reset: pcm prepare error: %s",
+ snd_strerror (err));
+ GST_ALSA_SRC_UNLOCK (asrc);
+ return;
+ }
+}
diff --git a/ext/alsa/gstalsasrc.h b/ext/alsa/gstalsasrc.h
new file mode 100644
index 0000000..de33833
--- /dev/null
+++ b/ext/alsa/gstalsasrc.h
@@ -0,0 +1,87 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstalsasrc.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_ALSASRC_H__
+#define __GST_ALSASRC_H__
+
+#include <gst/audio/gstaudiosrc.h>
+#include "gstalsa.h"
+#include "gstalsamixer.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ALSA_SRC (gst_alsasrc_get_type())
+#define GST_ALSA_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALSA_SRC,GstAlsaSrc))
+#define GST_ALSA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALSA_SRC,GstAlsaSrcClass))
+#define GST_IS_ALSA_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALSA_SRC))
+#define GST_IS_ALSA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALSA_SRC))
+#define GST_ALSA_SRC_CAST(obj) ((GstAlsaSrc *)(obj))
+
+#define GST_ALSA_SRC_GET_LOCK(obj) (GST_ALSA_SRC_CAST (obj)->alsa_lock)
+#define GST_ALSA_SRC_LOCK(obj) (g_mutex_lock (GST_ALSA_SRC_GET_LOCK (obj)))
+#define GST_ALSA_SRC_UNLOCK(obj) (g_mutex_unlock (GST_ALSA_SRC_GET_LOCK (obj)))
+
+typedef struct _GstAlsaSrc GstAlsaSrc;
+typedef struct _GstAlsaSrcClass GstAlsaSrcClass;
+
+/**
+ * GstAlsaSrc:
+ *
+ * Opaque data structure
+ */
+struct _GstAlsaSrc {
+ GstAudioSrc src;
+
+ gchar *device;
+
+ snd_pcm_t *handle;
+ snd_pcm_hw_params_t *hwparams;
+ snd_pcm_sw_params_t *swparams;
+
+ GstCaps *cached_caps;
+
+ snd_pcm_access_t access;
+ snd_pcm_format_t format;
+ guint rate;
+ guint channels;
+ gint bpf;
+ gboolean driver_timestamps;
+
+ guint buffer_time;
+ guint period_time;
+ snd_pcm_uframes_t buffer_size;
+ snd_pcm_uframes_t period_size;
+
+ GstAlsaMixer *mixer;
+
+ GMutex *alsa_lock;
+};
+
+struct _GstAlsaSrcClass {
+ GstAudioSrcClass parent_class;
+};
+
+GType gst_alsasrc_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_ALSASRC_H__ */
diff --git a/ext/cdparanoia/Makefile.am b/ext/cdparanoia/Makefile.am
new file mode 100644
index 0000000..e2a2238
--- /dev/null
+++ b/ext/cdparanoia/Makefile.am
@@ -0,0 +1,17 @@
+plugin_LTLIBRARIES = libgstcdparanoia.la
+
+libgstcdparanoia_la_SOURCES = gstcdparanoiasrc.c
+libgstcdparanoia_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(CDPARANOIA_CFLAGS)
+libgstcdparanoia_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(CDPARANOIA_LIBS)
+libgstcdparanoia_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcdparanoia_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstcdparanoiasrc.h
diff --git a/ext/cdparanoia/Makefile.in b/ext/cdparanoia/Makefile.in
new file mode 100644
index 0000000..30a4cd6
--- /dev/null
+++ b/ext/cdparanoia/Makefile.in
@@ -0,0 +1,767 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/cdparanoia
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstcdparanoia_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/cdda/libgstcdda-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstcdparanoia_la_OBJECTS = \
+ libgstcdparanoia_la-gstcdparanoiasrc.lo
+libgstcdparanoia_la_OBJECTS = $(am_libgstcdparanoia_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstcdparanoia_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstcdparanoia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstcdparanoia_la_CFLAGS) $(CFLAGS) \
+ $(libgstcdparanoia_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstcdparanoia_la_SOURCES)
+DIST_SOURCES = $(libgstcdparanoia_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstcdparanoia.la
+libgstcdparanoia_la_SOURCES = gstcdparanoiasrc.c
+libgstcdparanoia_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(CDPARANOIA_CFLAGS)
+
+libgstcdparanoia_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(CDPARANOIA_LIBS)
+
+libgstcdparanoia_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcdparanoia_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstcdparanoiasrc.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/cdparanoia/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/cdparanoia/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
+libgstcdparanoia.la: $(libgstcdparanoia_la_OBJECTS) $(libgstcdparanoia_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcdparanoia_la_LINK) -rpath $(plugindir) $(libgstcdparanoia_la_OBJECTS) $(libgstcdparanoia_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcdparanoia_la-gstcdparanoiasrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstcdparanoia_la-gstcdparanoiasrc.lo: gstcdparanoiasrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcdparanoia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcdparanoia_la_CFLAGS) $(CFLAGS) -MT libgstcdparanoia_la-gstcdparanoiasrc.lo -MD -MP -MF $(DEPDIR)/libgstcdparanoia_la-gstcdparanoiasrc.Tpo -c -o libgstcdparanoia_la-gstcdparanoiasrc.lo `test -f 'gstcdparanoiasrc.c' || echo '$(srcdir)/'`gstcdparanoiasrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcdparanoia_la-gstcdparanoiasrc.Tpo $(DEPDIR)/libgstcdparanoia_la-gstcdparanoiasrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcdparanoiasrc.c' object='libgstcdparanoia_la-gstcdparanoiasrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcdparanoia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcdparanoia_la_CFLAGS) $(CFLAGS) -c -o libgstcdparanoia_la-gstcdparanoiasrc.lo `test -f 'gstcdparanoiasrc.c' || echo '$(srcdir)/'`gstcdparanoiasrc.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/cdparanoia/gstcdparanoiasrc.c b/ext/cdparanoia/gstcdparanoiasrc.c
new file mode 100644
index 0000000..200f589
--- /dev/null
+++ b/ext/cdparanoia/gstcdparanoiasrc.c
@@ -0,0 +1,535 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * <2005> Wim Taymans <wim@fluendo.com>
+ * <2005> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include "gstcdparanoiasrc.h"
+#include "gst/gst-i18n-plugin.h"
+
+enum
+{
+ TRANSPORT_ERROR,
+ UNCORRECTED_ERROR,
+ NUM_SIGNALS
+};
+
+enum
+{
+ PROP_0,
+ PROP_READ_SPEED,
+ PROP_PARANOIA_MODE,
+ PROP_SEARCH_OVERLAP,
+ PROP_GENERIC_DEVICE,
+ PROP_CACHE_SIZE
+};
+
+#define DEFAULT_READ_SPEED -1
+#define DEFAULT_SEARCH_OVERLAP -1
+#define DEFAULT_PARANOIA_MODE PARANOIA_MODE_FRAGMENT
+#define DEFAULT_GENERIC_DEVICE NULL
+#define DEFAULT_CACHE_SIZE -1
+
+GST_DEBUG_CATEGORY_STATIC (gst_cd_paranoia_src_debug);
+#define GST_CAT_DEFAULT gst_cd_paranoia_src_debug
+
+#define gst_cd_paranoia_src_parent_class parent_class
+G_DEFINE_TYPE (GstCdParanoiaSrc, gst_cd_paranoia_src, GST_TYPE_CDDA_BASE_SRC);
+
+static void gst_cd_paranoia_src_finalize (GObject * obj);
+static void gst_cd_paranoia_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_cd_paranoia_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static GstBuffer *gst_cd_paranoia_src_read_sector (GstCddaBaseSrc * src,
+ gint sector);
+static gboolean gst_cd_paranoia_src_open (GstCddaBaseSrc * src,
+ const gchar * device);
+static void gst_cd_paranoia_src_close (GstCddaBaseSrc * src);
+
+/* We use these to serialize calls to paranoia_read() among several
+ * cdparanoiasrc instances. We do this because it's the only reasonably
+ * easy way to find out the calling object from within the paranoia
+ * callback, and we need the object instance in there to emit our signals */
+static GstCdParanoiaSrc *cur_cb_source;
+static GStaticMutex cur_cb_mutex = G_STATIC_MUTEX_INIT;
+
+static gint cdpsrc_signals[NUM_SIGNALS]; /* all 0 */
+
+#define GST_TYPE_CD_PARANOIA_MODE (gst_cd_paranoia_mode_get_type())
+static GType
+gst_cd_paranoia_mode_get_type (void)
+{
+ static const GFlagsValue paranoia_modes[] = {
+ {PARANOIA_MODE_DISABLE, "PARANOIA_MODE_DISABLE", "disable"},
+ {PARANOIA_MODE_FRAGMENT, "PARANOIA_MODE_FRAGMENT", "fragment"},
+ {PARANOIA_MODE_OVERLAP, "PARANOIA_MODE_OVERLAP", "overlap"},
+ {PARANOIA_MODE_SCRATCH, "PARANOIA_MODE_SCRATCH", "scratch"},
+ {PARANOIA_MODE_REPAIR, "PARANOIA_MODE_REPAIR", "repair"},
+ {PARANOIA_MODE_FULL, "PARANOIA_MODE_FULL", "full"},
+ {0, NULL, NULL},
+ };
+
+ static GType type; /* 0 */
+
+ if (!type) {
+ type = g_flags_register_static ("GstCdParanoiaMode", paranoia_modes);
+ }
+
+ return type;
+}
+
+static void
+gst_cd_paranoia_src_init (GstCdParanoiaSrc * src)
+{
+ src->d = NULL;
+ src->p = NULL;
+ src->next_sector = -1;
+
+ src->search_overlap = DEFAULT_SEARCH_OVERLAP;
+ src->paranoia_mode = DEFAULT_PARANOIA_MODE;
+ src->read_speed = DEFAULT_READ_SPEED;
+ src->generic_device = g_strdup (DEFAULT_GENERIC_DEVICE);
+ src->cache_size = DEFAULT_CACHE_SIZE;
+}
+
+static void
+gst_cd_paranoia_src_class_init (GstCdParanoiaSrcClass * klass)
+{
+ GstCddaBaseSrcClass *cddabasesrc_class = GST_CDDA_BASE_SRC_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = gst_cd_paranoia_src_set_property;
+ gobject_class->get_property = gst_cd_paranoia_src_get_property;
+ gobject_class->finalize = gst_cd_paranoia_src_finalize;
+
+ gst_element_class_set_details_simple (element_class,
+ "CD Audio (cdda) Source, Paranoia IV", "Source/File",
+ "Read audio from CD in paranoid mode",
+ "Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>");
+
+ cddabasesrc_class->open = gst_cd_paranoia_src_open;
+ cddabasesrc_class->close = gst_cd_paranoia_src_close;
+ cddabasesrc_class->read_sector = gst_cd_paranoia_src_read_sector;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GENERIC_DEVICE,
+ g_param_spec_string ("generic-device", "Generic device",
+ "Use specified generic scsi device", DEFAULT_GENERIC_DEVICE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_READ_SPEED,
+ g_param_spec_int ("read-speed", "Read speed",
+ "Read from device at specified speed", -1, G_MAXINT,
+ DEFAULT_READ_SPEED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PARANOIA_MODE,
+ g_param_spec_flags ("paranoia-mode", "Paranoia mode",
+ "Type of checking to perform", GST_TYPE_CD_PARANOIA_MODE,
+ DEFAULT_PARANOIA_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEARCH_OVERLAP,
+ g_param_spec_int ("search-overlap", "Search overlap",
+ "Force minimum overlap search during verification to n sectors", -1,
+ 75, DEFAULT_SEARCH_OVERLAP,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstCdParanoiaSrc:cache-size
+ *
+ * Set CD cache size to n sectors (-1 = auto)
+ *
+ * Since: 0.10.24
+ */
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CACHE_SIZE,
+ g_param_spec_int ("cache-size", "Cache size",
+ "Set CD cache size to n sectors (-1 = auto)", -1,
+ G_MAXINT, DEFAULT_CACHE_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /* FIXME: we don't really want signals for this, but messages on the bus,
+ * but then we can't check any longer whether anyone is interested in them */
+ /**
+ * GstCdParanoiaSrc::transport-error
+ * @cdparanoia: The CdParanoia instance
+ * @sector: The sector number at which the error was encountered.
+ *
+ * This signal is emitted whenever an error occurs while reading.
+ * CdParanoia will attempt to recover the data.
+ */
+ cdpsrc_signals[TRANSPORT_ERROR] =
+ g_signal_new ("transport-error", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstCdParanoiaSrcClass, transport_error),
+ NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+ /**
+ * GstCdParanoiaSrc::uncorrected-error
+ * @cdparanoia: The CdParanoia instance
+ * @sector: The sector number at which the error was encountered.
+ *
+ * This signal is emitted whenever an uncorrectable error occurs while
+ * reading. The data could not be read.
+ */
+ cdpsrc_signals[UNCORRECTED_ERROR] =
+ g_signal_new ("uncorrected-error", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstCdParanoiaSrcClass, uncorrected_error),
+ NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+}
+
+static gboolean
+gst_cd_paranoia_src_open (GstCddaBaseSrc * cddabasesrc, const gchar * device)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (cddabasesrc);
+ gint i, cache_size;
+
+ GST_DEBUG_OBJECT (src, "trying to open device %s (generic-device=%s) ...",
+ device, GST_STR_NULL (src->generic_device));
+
+ /* find the device */
+ if (src->generic_device != NULL) {
+ src->d = cdda_identify_scsi (src->generic_device, device, FALSE, NULL);
+ } else {
+ if (device != NULL) {
+ src->d = cdda_identify (device, FALSE, NULL);
+ } else {
+ src->d = cdda_identify ("/dev/cdrom", FALSE, NULL);
+ }
+ }
+
+ /* fail if the device couldn't be found */
+ if (src->d == NULL)
+ goto no_device;
+
+ /* set verbosity mode */
+ cdda_verbose_set (src->d, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT);
+
+ /* open the disc */
+ if (cdda_open (src->d))
+ goto open_failed;
+
+ if (src->read_speed != -1) {
+ cdda_speed_set (src->d, src->read_speed);
+ }
+
+ for (i = 1; i < src->d->tracks + 1; i++) {
+ GstCddaBaseSrcTrack track = { 0, };
+
+ track.num = i;
+ track.is_audio = IS_AUDIO (src->d, i - 1);
+ track.start = cdda_track_firstsector (src->d, i);
+ track.end = cdda_track_lastsector (src->d, i);
+ track.tags = NULL;
+
+ gst_cdda_base_src_add_track (GST_CDDA_BASE_SRC (src), &track);
+ }
+
+ /* create the paranoia struct and set it up */
+ src->p = paranoia_init (src->d);
+ if (src->p == NULL)
+ goto init_failed;
+
+ paranoia_modeset (src->p, src->paranoia_mode);
+ GST_INFO_OBJECT (src, "set paranoia mode to 0x%02x", src->paranoia_mode);
+
+ if (src->search_overlap != -1) {
+ paranoia_overlapset (src->p, src->search_overlap);
+ GST_INFO_OBJECT (src, "search overlap set to %u", src->search_overlap);
+ }
+
+ cache_size = src->cache_size;
+ if (cache_size == -1) {
+ /* if paranoia mode is low (the default), assume we're doing playback */
+ if (src->paranoia_mode <= PARANOIA_MODE_FRAGMENT)
+ cache_size = 150;
+ else
+ cache_size = paranoia_cachemodel_size (src->p, -1);
+ }
+ paranoia_cachemodel_size (src->p, cache_size);
+ GST_INFO_OBJECT (src, "set cachemodel size to %u", cache_size);
+
+ src->next_sector = -1;
+
+ return TRUE;
+
+ /* ERRORS */
+no_device:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("Could not open CD device for reading.")), ("cdda_identify failed"));
+ return FALSE;
+ }
+open_failed:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("Could not open CD device for reading.")), ("cdda_open failed"));
+ cdda_close (src->d);
+ src->d = NULL;
+ return FALSE;
+ }
+init_failed:
+ {
+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
+ ("failed to initialize paranoia"), ("failed to initialize paranoia"));
+ return FALSE;
+ }
+}
+
+static void
+gst_cd_paranoia_src_close (GstCddaBaseSrc * cddabasesrc)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (cddabasesrc);
+
+ if (src->p) {
+ paranoia_free (src->p);
+ src->p = NULL;
+ }
+
+ if (src->d) {
+ cdda_close (src->d);
+ src->d = NULL;
+ }
+
+ src->next_sector = -1;
+}
+
+static void
+gst_cd_paranoia_dummy_callback (long inpos, int function)
+{
+ /* Used by instanced where no one is interested what's happening here */
+}
+
+static void
+gst_cd_paranoia_paranoia_callback (long inpos, int function)
+{
+ GstCdParanoiaSrc *src = cur_cb_source;
+ gint sector = (gint) (inpos / CD_FRAMEWORDS);
+
+ switch (function) {
+ case PARANOIA_CB_SKIP:
+ GST_INFO_OBJECT (src, "Skip at sector %d", sector);
+ g_signal_emit (src, cdpsrc_signals[UNCORRECTED_ERROR], 0, sector);
+ break;
+ case PARANOIA_CB_READERR:
+ GST_INFO_OBJECT (src, "Transport error at sector %d", sector);
+ g_signal_emit (src, cdpsrc_signals[TRANSPORT_ERROR], 0, sector);
+ break;
+ default:
+ break;
+ }
+}
+
+static gboolean
+gst_cd_paranoia_src_signal_is_being_watched (GstCdParanoiaSrc * src, gint sig)
+{
+ return g_signal_has_handler_pending (src, cdpsrc_signals[sig], 0, FALSE);
+}
+
+static GstBuffer *
+gst_cd_paranoia_src_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (cddabasesrc);
+ GstBuffer *buf;
+ gboolean do_serialize;
+ gint16 *cdda_buf;
+
+#if 0
+ /* Do we really need to output this? (tpm) */
+ /* Due to possible autocorrections of start sectors of audio tracks on
+ * multisession cds, we can maybe not compute the correct discid.
+ * So issue a warning.
+ * See cdparanoia/interface/common-interface.c:FixupTOC */
+ if (src->d && src->d->cd_extra) {
+ g_message
+ ("DiscID on multisession discs might be broken. Use at own risk.");
+ }
+#endif
+
+ if (src->next_sector == -1 || src->next_sector != sector) {
+ if (paranoia_seek (src->p, sector, SEEK_SET) == -1)
+ goto seek_failed;
+
+ GST_DEBUG_OBJECT (src, "successfully seeked to sector %d", sector);
+ src->next_sector = sector;
+ }
+
+ do_serialize =
+ gst_cd_paranoia_src_signal_is_being_watched (src, TRANSPORT_ERROR) ||
+ gst_cd_paranoia_src_signal_is_being_watched (src, UNCORRECTED_ERROR);
+
+ if (do_serialize) {
+ GST_LOG_OBJECT (src, "Signal handlers connected, serialising access");
+ g_static_mutex_lock (&cur_cb_mutex);
+ GST_LOG_OBJECT (src, "Got lock");
+ cur_cb_source = src;
+
+ cdda_buf = paranoia_read (src->p, gst_cd_paranoia_paranoia_callback);
+
+ cur_cb_source = NULL;
+ GST_LOG_OBJECT (src, "Releasing lock");
+ g_static_mutex_unlock (&cur_cb_mutex);
+ } else {
+ cdda_buf = paranoia_read (src->p, gst_cd_paranoia_dummy_callback);
+ }
+
+ if (cdda_buf == NULL)
+ goto read_failed;
+
+ buf = gst_buffer_new_and_alloc (CD_FRAMESIZE_RAW);
+ gst_buffer_fill (buf, 0, cdda_buf, CD_FRAMESIZE_RAW);
+
+ /* cdda base class will take care of timestamping etc. */
+ ++src->next_sector;
+
+ return buf;
+
+ /* ERRORS */
+seek_failed:
+ {
+ GST_WARNING_OBJECT (src, "seek to sector %d failed!", sector);
+ GST_ELEMENT_ERROR (src, RESOURCE, SEEK,
+ (_("Could not seek CD.")),
+ ("paranoia_seek to %d failed: %s", sector, g_strerror (errno)));
+ return NULL;
+ }
+read_failed:
+ {
+ GST_WARNING_OBJECT (src, "read at sector %d failed!", sector);
+ GST_ELEMENT_ERROR (src, RESOURCE, READ,
+ (_("Could not read CD.")),
+ ("paranoia_read at %d failed: %s", sector, g_strerror (errno)));
+ return NULL;
+ }
+}
+
+static void
+gst_cd_paranoia_src_finalize (GObject * obj)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (obj);
+
+ g_free (src->generic_device);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_cd_paranoia_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (object);
+
+ GST_OBJECT_LOCK (src);
+
+ switch (prop_id) {
+ case PROP_GENERIC_DEVICE:{
+ g_free (src->generic_device);
+ src->generic_device = g_value_dup_string (value);
+ if (src->generic_device && src->generic_device[0] == '\0') {
+ g_free (src->generic_device);
+ src->generic_device = NULL;
+ }
+ break;
+ }
+ case PROP_READ_SPEED:{
+ src->read_speed = g_value_get_int (value);
+ if (src->read_speed == 0)
+ src->read_speed = -1;
+ break;
+ }
+ case PROP_PARANOIA_MODE:{
+ src->paranoia_mode = g_value_get_flags (value) & PARANOIA_MODE_FULL;
+ break;
+ }
+ case PROP_SEARCH_OVERLAP:{
+ src->search_overlap = g_value_get_int (value);
+ break;
+ }
+ case PROP_CACHE_SIZE:{
+ src->cache_size = g_value_get_int (value);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_OBJECT_UNLOCK (src);
+}
+
+static void
+gst_cd_paranoia_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstCdParanoiaSrc *src = GST_CD_PARANOIA_SRC (object);
+
+ GST_OBJECT_LOCK (src);
+
+ switch (prop_id) {
+ case PROP_READ_SPEED:
+ g_value_set_int (value, src->read_speed);
+ break;
+ case PROP_PARANOIA_MODE:
+ g_value_set_flags (value, src->paranoia_mode);
+ break;
+ case PROP_GENERIC_DEVICE:
+ g_value_set_string (value, src->generic_device);
+ break;
+ case PROP_SEARCH_OVERLAP:
+ g_value_set_int (value, src->search_overlap);
+ break;
+ case PROP_CACHE_SIZE:
+ g_value_set_int (value, src->cache_size);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_OBJECT_UNLOCK (src);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_cd_paranoia_src_debug, "cdparanoiasrc", 0,
+ "CD Paranoia Source");
+
+ if (!gst_element_register (plugin, "cdparanoiasrc", GST_RANK_SECONDARY,
+ GST_TYPE_CD_PARANOIA_SRC))
+ return FALSE;
+
+#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 TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "cdparanoia",
+ "Read audio from CD in paranoid mode",
+ plugin_init, GST_PLUGINS_BASE_VERSION, "LGPL", GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN)
diff --git a/ext/cdparanoia/gstcdparanoiasrc.h b/ext/cdparanoia/gstcdparanoiasrc.h
new file mode 100644
index 0000000..e61dff8
--- /dev/null
+++ b/ext/cdparanoia/gstcdparanoiasrc.h
@@ -0,0 +1,106 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CD_PARANOIA_SRC_H__
+#define __GST_CD_PARANOIA_SRC_H__
+
+#include "gst/cdda/gstcddabasesrc.h"
+
+G_BEGIN_DECLS
+
+#define size16 gint16
+#define size32 gint32
+
+/* on OSX the cdparanoia headers include IOKit framework headers (in particular
+ * SCSICmds_INQUIRY_Definitions.h) which define a structure that has a member
+ * named VERSION, so we must #undef VERSION here for things to compile on OSX */
+static char GST_PLUGINS_BASE_VERSION[] = VERSION;
+#undef VERSION
+
+#ifdef CDPARANOIA_HEADERS_IN_DIR
+ #include <cdda/cdda_interface.h>
+ #include <cdda/cdda_paranoia.h>
+#else
+ #include <cdda_interface.h>
+ #include <cdda_paranoia.h>
+#endif
+
+#define GST_TYPE_CD_PARANOIA_SRC (gst_cd_paranoia_src_get_type())
+#define GST_CD_PARANOIA_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CD_PARANOIA_SRC,GstCdParanoiaSrc))
+#define GST_CD_PARANOIA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CD_PARANOIA_SRC,GstCdParanoiaSrcClass))
+#define GST_IS_CD_PARANOIA_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CD_PARANOIA_SRC))
+#define GST_IS_CD_PARANOIA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CD_PARANOIA_SRC))
+#define GST_CD_PARANOIA_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CDDA_BASAE_SRC, GstCdParanoiaSrcClass))
+
+typedef struct _GstCdParanoiaSrc GstCdParanoiaSrc;
+typedef struct _GstCdParanoiaSrcClass GstCdParanoiaSrcClass;
+
+/**
+ * GstCdParanoiaSrc:
+ *
+ * The cdparanoia object structure.
+ */
+struct _GstCdParanoiaSrc {
+ GstCddaBaseSrc cddabasesrc;
+
+ /*< private >*/
+ cdrom_drive *d;
+ cdrom_paranoia *p;
+
+ gint next_sector; /* -1 or next sector we expect to
+ * read, so we know when to do a seek */
+
+ gint paranoia_mode;
+ gint read_speed;
+ gint search_overlap;
+ gint cache_size;
+
+ gchar *generic_device;
+};
+
+struct _GstCdParanoiaSrcClass {
+ GstCddaBaseSrcClass parent_class;
+
+ /* signal callbacks */
+ /**
+ * GstCdParanoiaSrcClass::transport-error:
+ * @src: the GstCddaBaseSrc source element object
+ * @sector: the sector at which the error happened
+ *
+ * This signal is emitted when a sector could not be read
+ * because of a transport error.
+ */
+ void (*transport_error) (GstCdParanoiaSrc * src, gint sector);
+ /**
+ * GstCdParanoiaSrcClass::uncorrected-error:
+ * @src: the GstCddaBaseSrc source element object
+ * @sector: the sector at which the error happened
+ *
+ * This signal is emitted when a sector could not be read
+ * because of a transport error.
+ */
+ void (*uncorrected_error) (GstCdParanoiaSrc * src, gint sector);
+};
+
+GType gst_cd_paranoia_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_CD_PARANOIA_SRC_H__ */
+
diff --git a/ext/gio/Makefile.am b/ext/gio/Makefile.am
new file mode 100644
index 0000000..f4b1611
--- /dev/null
+++ b/ext/gio/Makefile.am
@@ -0,0 +1,29 @@
+# plugindir is set in configure
+
+plugin_LTLIBRARIES = libgstgio.la
+
+# sources used to compile this plug-in
+libgstgio_la_SOURCES = \
+ gstgio.c \
+ gstgiobasesink.c \
+ gstgiobasesrc.c \
+ gstgiosink.c \
+ gstgiosrc.c \
+ gstgiostreamsink.c \
+ gstgiostreamsrc.c
+
+libgstgio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS)
+libgstgio_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS)
+libgstgio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GIO_LDFLAGS)
+libgstgio_la_LIBTOOLFLAGS = --tag=disable-static
+
+# headers we need but don't want installed
+noinst_HEADERS = \
+ gstgio.h \
+ gstgiobasesink.h \
+ gstgiobasesrc.h \
+ gstgiosink.h \
+ gstgiosrc.h \
+ gstgiostreamsink.h \
+ gstgiostreamsrc.h
+
diff --git a/ext/gio/Makefile.in b/ext/gio/Makefile.in
new file mode 100644
index 0000000..b34d805
--- /dev/null
+++ b/ext/gio/Makefile.in
@@ -0,0 +1,835 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = ext/gio
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstgio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstgio_la_OBJECTS = libgstgio_la-gstgio.lo \
+ libgstgio_la-gstgiobasesink.lo libgstgio_la-gstgiobasesrc.lo \
+ libgstgio_la-gstgiosink.lo libgstgio_la-gstgiosrc.lo \
+ libgstgio_la-gstgiostreamsink.lo \
+ libgstgio_la-gstgiostreamsrc.lo
+libgstgio_la_OBJECTS = $(am_libgstgio_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstgio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstgio_la_CFLAGS) $(CFLAGS) \
+ $(libgstgio_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstgio_la_SOURCES)
+DIST_SOURCES = $(libgstgio_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstgio.la
+
+# sources used to compile this plug-in
+libgstgio_la_SOURCES = \
+ gstgio.c \
+ gstgiobasesink.c \
+ gstgiobasesrc.c \
+ gstgiosink.c \
+ gstgiosrc.c \
+ gstgiostreamsink.c \
+ gstgiostreamsrc.c
+
+libgstgio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS)
+libgstgio_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS)
+libgstgio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GIO_LDFLAGS)
+libgstgio_la_LIBTOOLFLAGS = --tag=disable-static
+
+# headers we need but don't want installed
+noinst_HEADERS = \
+ gstgio.h \
+ gstgiobasesink.h \
+ gstgiobasesrc.h \
+ gstgiosink.h \
+ gstgiosrc.h \
+ gstgiostreamsink.h \
+ gstgiostreamsrc.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/gio/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/gio/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
+libgstgio.la: $(libgstgio_la_OBJECTS) $(libgstgio_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstgio_la_LINK) -rpath $(plugindir) $(libgstgio_la_OBJECTS) $(libgstgio_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgio.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiobasesink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiobasesrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiosink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiosrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiostreamsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgio_la-gstgiostreamsrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstgio_la-gstgio.lo: gstgio.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgio.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgio.Tpo -c -o libgstgio_la-gstgio.lo `test -f 'gstgio.c' || echo '$(srcdir)/'`gstgio.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgio.Tpo $(DEPDIR)/libgstgio_la-gstgio.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgio.c' object='libgstgio_la-gstgio.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgio.lo `test -f 'gstgio.c' || echo '$(srcdir)/'`gstgio.c
+
+libgstgio_la-gstgiobasesink.lo: gstgiobasesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiobasesink.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiobasesink.Tpo -c -o libgstgio_la-gstgiobasesink.lo `test -f 'gstgiobasesink.c' || echo '$(srcdir)/'`gstgiobasesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiobasesink.Tpo $(DEPDIR)/libgstgio_la-gstgiobasesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiobasesink.c' object='libgstgio_la-gstgiobasesink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiobasesink.lo `test -f 'gstgiobasesink.c' || echo '$(srcdir)/'`gstgiobasesink.c
+
+libgstgio_la-gstgiobasesrc.lo: gstgiobasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiobasesrc.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiobasesrc.Tpo -c -o libgstgio_la-gstgiobasesrc.lo `test -f 'gstgiobasesrc.c' || echo '$(srcdir)/'`gstgiobasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiobasesrc.Tpo $(DEPDIR)/libgstgio_la-gstgiobasesrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiobasesrc.c' object='libgstgio_la-gstgiobasesrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiobasesrc.lo `test -f 'gstgiobasesrc.c' || echo '$(srcdir)/'`gstgiobasesrc.c
+
+libgstgio_la-gstgiosink.lo: gstgiosink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiosink.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiosink.Tpo -c -o libgstgio_la-gstgiosink.lo `test -f 'gstgiosink.c' || echo '$(srcdir)/'`gstgiosink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiosink.Tpo $(DEPDIR)/libgstgio_la-gstgiosink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiosink.c' object='libgstgio_la-gstgiosink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiosink.lo `test -f 'gstgiosink.c' || echo '$(srcdir)/'`gstgiosink.c
+
+libgstgio_la-gstgiosrc.lo: gstgiosrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiosrc.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiosrc.Tpo -c -o libgstgio_la-gstgiosrc.lo `test -f 'gstgiosrc.c' || echo '$(srcdir)/'`gstgiosrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiosrc.Tpo $(DEPDIR)/libgstgio_la-gstgiosrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiosrc.c' object='libgstgio_la-gstgiosrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiosrc.lo `test -f 'gstgiosrc.c' || echo '$(srcdir)/'`gstgiosrc.c
+
+libgstgio_la-gstgiostreamsink.lo: gstgiostreamsink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiostreamsink.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiostreamsink.Tpo -c -o libgstgio_la-gstgiostreamsink.lo `test -f 'gstgiostreamsink.c' || echo '$(srcdir)/'`gstgiostreamsink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiostreamsink.Tpo $(DEPDIR)/libgstgio_la-gstgiostreamsink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiostreamsink.c' object='libgstgio_la-gstgiostreamsink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiostreamsink.lo `test -f 'gstgiostreamsink.c' || echo '$(srcdir)/'`gstgiostreamsink.c
+
+libgstgio_la-gstgiostreamsrc.lo: gstgiostreamsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -MT libgstgio_la-gstgiostreamsrc.lo -MD -MP -MF $(DEPDIR)/libgstgio_la-gstgiostreamsrc.Tpo -c -o libgstgio_la-gstgiostreamsrc.lo `test -f 'gstgiostreamsrc.c' || echo '$(srcdir)/'`gstgiostreamsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgio_la-gstgiostreamsrc.Tpo $(DEPDIR)/libgstgio_la-gstgiostreamsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgiostreamsrc.c' object='libgstgio_la-gstgiostreamsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgio_la_CFLAGS) $(CFLAGS) -c -o libgstgio_la-gstgiostreamsrc.lo `test -f 'gstgiostreamsrc.c' || echo '$(srcdir)/'`gstgiostreamsrc.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/gio/gstgio.c b/ext/gio/gstgio.c
new file mode 100644
index 0000000..35c8b85
--- /dev/null
+++ b/ext/gio/gstgio.c
@@ -0,0 +1,259 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstgio.h"
+#include "gstgiosink.h"
+#include "gstgiosrc.h"
+#include "gstgiostreamsink.h"
+#include "gstgiostreamsrc.h"
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_debug);
+#define GST_CAT_DEFAULT gst_gio_debug
+
+/* @func_name: Name of the GIO function, for debugging messages.
+ * @err: Error location. *err may be NULL, but err must be non-NULL.
+ * @ret: Flow return location. May be NULL. Is set to either #GST_FLOW_ERROR
+ * or #GST_FLOW_WRONG_STATE.
+ *
+ * Returns: TRUE to indicate a handled error. Error at given location err will
+ * be freed and *err will be set to NULL. A FALSE return indicates an unhandled
+ * error: The err location is unchanged and guaranteed to be != NULL. ret, if
+ * given, is set to GST_FLOW_ERROR.
+ */
+gboolean
+gst_gio_error (gpointer element, const gchar * func_name, GError ** err,
+ GstFlowReturn * ret)
+{
+ gboolean handled = TRUE;
+
+ if (ret)
+ *ret = GST_FLOW_ERROR;
+
+ if (GST_GIO_ERROR_MATCHES (*err, CANCELLED)) {
+ GST_DEBUG_OBJECT (element, "blocking I/O call cancelled (%s)", func_name);
+ if (ret)
+ *ret = GST_FLOW_WRONG_STATE;
+ } else if (*err != NULL) {
+ handled = FALSE;
+ } else {
+ GST_ELEMENT_ERROR (element, LIBRARY, FAILED, (NULL),
+ ("%s call failed without error set", func_name));
+ }
+
+ if (handled)
+ g_clear_error (err);
+
+ return handled;
+}
+
+GstFlowReturn
+gst_gio_seek (gpointer element, GSeekable * stream, guint64 offset,
+ GCancellable * cancel)
+{
+ gboolean success;
+ GstFlowReturn ret;
+ GError *err = NULL;
+
+ GST_LOG_OBJECT (element, "seeking to offset %" G_GINT64_FORMAT, offset);
+
+ success = g_seekable_seek (stream, offset, G_SEEK_SET, cancel, &err);
+
+ if (success)
+ ret = GST_FLOW_OK;
+ else if (!gst_gio_error (element, "g_seekable_seek", &err, &ret)) {
+ GST_ELEMENT_ERROR (element, RESOURCE, SEEK, (NULL),
+ ("Could not seek: %s", err->message));
+ g_clear_error (&err);
+ }
+
+ return ret;
+}
+
+static gpointer
+_internal_get_supported_protocols (gpointer data)
+{
+ const gchar *const *schemes;
+ gchar **our_schemes;
+ guint num;
+ gint i, j;
+
+ schemes = g_vfs_get_supported_uri_schemes (g_vfs_get_default ());
+ num = g_strv_length ((gchar **) schemes);
+
+ if (num == 0) {
+ GST_WARNING ("No GIO supported URI schemes found");
+ return NULL;
+ }
+
+ our_schemes = g_new0 (gchar *, num + 1);
+
+ /* - Filter http/https as we can't support the icy stuff with GIO.
+ * Use souphttpsrc if you need that.
+ * - Filter cdda as it doesn't support musicbrainz stuff and everything
+ * else one expects from a cdda source. Use cdparanoiasrc or cdiosrc
+ * for cdda.
+ */
+ for (i = 0, j = 0; i < num; i++) {
+ if (strcmp (schemes[i], "http") == 0 || strcmp (schemes[i], "https") == 0
+ || strcmp (schemes[i], "cdda") == 0)
+ continue;
+
+ our_schemes[j] = g_strdup (schemes[i]);
+ j++;
+ }
+
+ return our_schemes;
+}
+
+static gchar **
+gst_gio_get_supported_protocols (void)
+{
+ static GOnce once = G_ONCE_INIT;
+
+ g_once (&once, _internal_get_supported_protocols, NULL);
+ return (gchar **) once.retval;
+}
+
+static GstURIType
+gst_gio_uri_handler_get_type_sink (GType type)
+{
+ return GST_URI_SINK;
+}
+
+static GstURIType
+gst_gio_uri_handler_get_type_src (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static gchar **
+gst_gio_uri_handler_get_protocols (GType type)
+{
+ static gchar **protocols = NULL;
+
+ if (!protocols)
+ protocols = gst_gio_get_supported_protocols ();
+
+ return protocols;
+}
+
+static const gchar *
+gst_gio_uri_handler_get_uri (GstURIHandler * handler)
+{
+ GstElement *element = GST_ELEMENT (handler);
+ const gchar *uri;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ g_object_get (G_OBJECT (element), "location", &uri, NULL);
+
+ return uri;
+}
+
+static gboolean
+gst_gio_uri_handler_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ GstElement *element = GST_ELEMENT (handler);
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ if (GST_STATE (element) == GST_STATE_PLAYING ||
+ GST_STATE (element) == GST_STATE_PAUSED)
+ return FALSE;
+
+ g_object_set (G_OBJECT (element), "location", uri, NULL);
+
+ return TRUE;
+}
+
+static void
+gst_gio_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+ gboolean sink = GPOINTER_TO_INT (iface_data); /* See in do_init below. */
+
+ if (sink)
+ iface->get_type = gst_gio_uri_handler_get_type_sink;
+ else
+ iface->get_type = gst_gio_uri_handler_get_type_src;
+ iface->get_protocols = gst_gio_uri_handler_get_protocols;
+ iface->get_uri = gst_gio_uri_handler_get_uri;
+ iface->set_uri = gst_gio_uri_handler_set_uri;
+}
+
+void
+gst_gio_uri_handler_do_init (GType type)
+{
+ GInterfaceInfo uri_handler_info = {
+ gst_gio_uri_handler_init,
+ NULL,
+ NULL
+ };
+
+ /* Store information for uri_handler_init to use for distinguishing the
+ * element types. This lets us use a single interface implementation for both
+ * classes. */
+ uri_handler_info.interface_data = GINT_TO_POINTER (g_type_is_a (type,
+ GST_TYPE_BASE_SINK));
+
+ g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &uri_handler_info);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gboolean ret = TRUE;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_debug, "gio", 0, "GIO elements");
+
+ gst_plugin_add_dependency_simple (plugin, NULL, GIO_MODULE_DIR, NULL,
+ GST_PLUGIN_DEPENDENCY_FLAG_NONE);
+ gst_plugin_add_dependency_simple (plugin, "LD_LIBRARY_PATH", GIO_LIBDIR,
+ "gvfsd", GST_PLUGIN_DEPENDENCY_FLAG_NONE);
+
+ /* FIXME: Rank is MARGINAL for now, should be at least SECONDARY+1 in the future
+ * to replace gnomevfssink/src. For testing purposes PRIMARY+1 one makes sense
+ * so it gets autoplugged and preferred over filesrc/sink. */
+
+ ret &= gst_element_register (plugin, "giosink", GST_RANK_SECONDARY,
+ GST_TYPE_GIO_SINK);
+
+ ret &= gst_element_register (plugin, "giosrc", GST_RANK_SECONDARY,
+ GST_TYPE_GIO_SRC);
+
+ ret &= gst_element_register (plugin, "giostreamsink", GST_RANK_NONE,
+ GST_TYPE_GIO_STREAM_SINK);
+
+ ret &= gst_element_register (plugin, "giostreamsrc", GST_RANK_NONE,
+ GST_TYPE_GIO_STREAM_SRC);
+
+ return ret;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gio",
+ "GIO elements", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN)
diff --git a/ext/gio/gstgio.h b/ext/gio/gstgio.h
new file mode 100644
index 0000000..01183e1
--- /dev/null
+++ b/ext/gio/gstgio.h
@@ -0,0 +1,42 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_H__
+#define __GST_GIO_H__
+
+#include <gio/gio.h>
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_GIO_ERROR_MATCHES(err, code) g_error_matches (err, G_IO_ERROR, G_IO_ERROR_##code)
+
+#define GST_GIO_STREAM_IS_SEEKABLE(stream) (G_IS_SEEKABLE (stream) && g_seekable_can_seek (G_SEEKABLE (stream)))
+
+gboolean gst_gio_error (gpointer element, const gchar *func_name,
+ GError **err, GstFlowReturn *ret);
+GstFlowReturn gst_gio_seek (gpointer element, GSeekable *stream, guint64 offset,
+ GCancellable *cancel);
+void gst_gio_uri_handler_do_init (GType type);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_H__ */
diff --git a/ext/gio/gstgiobasesink.c b/ext/gio/gstgiobasesink.c
new file mode 100644
index 0000000..110f84a
--- /dev/null
+++ b/ext/gio/gstgiobasesink.c
@@ -0,0 +1,344 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiobasesink.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_base_sink_debug);
+#define GST_CAT_DEFAULT gst_gio_base_sink_debug
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+#define gst_gio_base_sink_parent_class parent_class
+G_DEFINE_TYPE (GstGioBaseSink, gst_gio_base_sink, GST_TYPE_BASE_SINK);
+
+static void gst_gio_base_sink_finalize (GObject * object);
+static gboolean gst_gio_base_sink_start (GstBaseSink * base_sink);
+static gboolean gst_gio_base_sink_stop (GstBaseSink * base_sink);
+static gboolean gst_gio_base_sink_unlock (GstBaseSink * base_sink);
+static gboolean gst_gio_base_sink_unlock_stop (GstBaseSink * base_sink);
+static gboolean gst_gio_base_sink_event (GstBaseSink * base_sink,
+ GstEvent * event);
+static GstFlowReturn gst_gio_base_sink_render (GstBaseSink * base_sink,
+ GstBuffer * buffer);
+static gboolean gst_gio_base_sink_query (GstBaseSink * bsink, GstQuery * query);
+
+static void
+gst_gio_base_sink_class_init (GstGioBaseSinkClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_base_sink_debug, "gio_base_sink", 0,
+ "GIO base sink");
+
+ gobject_class->finalize = gst_gio_base_sink_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sink_factory));
+
+ gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_gio_base_sink_start);
+ gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_gio_base_sink_stop);
+ gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_gio_base_sink_unlock);
+ gstbasesink_class->unlock_stop =
+ GST_DEBUG_FUNCPTR (gst_gio_base_sink_unlock_stop);
+ gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_gio_base_sink_query);
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_gio_base_sink_event);
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_gio_base_sink_render);
+}
+
+static void
+gst_gio_base_sink_init (GstGioBaseSink * sink)
+{
+ gst_base_sink_set_sync (GST_BASE_SINK (sink), FALSE);
+
+ sink->cancel = g_cancellable_new ();
+}
+
+static void
+gst_gio_base_sink_finalize (GObject * object)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (object);
+
+ if (sink->cancel) {
+ g_object_unref (sink->cancel);
+ sink->cancel = NULL;
+ }
+
+ if (sink->stream) {
+ g_object_unref (sink->stream);
+ sink->stream = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static gboolean
+gst_gio_base_sink_start (GstBaseSink * base_sink)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+ GstGioBaseSinkClass *gbsink_class = GST_GIO_BASE_SINK_GET_CLASS (sink);
+
+ sink->position = 0;
+
+ /* FIXME: This will likely block */
+ sink->stream = gbsink_class->get_stream (sink);
+ if (G_UNLIKELY (!G_IS_OUTPUT_STREAM (sink->stream))) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("No output stream provided by subclass"));
+ return FALSE;
+ } else if (G_UNLIKELY (g_output_stream_is_closed (sink->stream))) {
+ GST_ELEMENT_ERROR (sink, LIBRARY, FAILED, (NULL),
+ ("Output stream is already closed"));
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (sink, "started sink");
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_sink_stop (GstBaseSink * base_sink)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+ GstGioBaseSinkClass *klass = GST_GIO_BASE_SINK_GET_CLASS (sink);
+ gboolean success;
+ GError *err = NULL;
+
+ if (klass->close_on_stop && G_IS_OUTPUT_STREAM (sink->stream)) {
+ GST_DEBUG_OBJECT (sink, "closing stream");
+
+ /* FIXME: can block but unfortunately we can't use async operations
+ * here because they require a running main loop */
+ success = g_output_stream_close (sink->stream, sink->cancel, &err);
+
+ if (!success && !gst_gio_error (sink, "g_output_stream_close", &err, NULL)) {
+ GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+ ("gio_output_stream_close failed: %s", err->message));
+ g_clear_error (&err);
+ } else if (!success) {
+ GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+ ("g_output_stream_close failed"));
+ } else {
+ GST_DEBUG_OBJECT (sink, "g_outut_stream_close succeeded");
+ }
+
+ g_object_unref (sink->stream);
+ sink->stream = NULL;
+ } else {
+ success = g_output_stream_flush (sink->stream, sink->cancel, &err);
+
+ if (!success && !gst_gio_error (sink, "g_output_stream_flush", &err, NULL)) {
+ GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+ ("gio_output_stream_flush failed: %s", err->message));
+ g_clear_error (&err);
+ } else if (!success) {
+ GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+ ("g_output_stream_flush failed"));
+ } else {
+ GST_DEBUG_OBJECT (sink, "g_outut_stream_flush succeeded");
+ }
+
+ g_object_unref (sink->stream);
+ sink->stream = NULL;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_sink_unlock (GstBaseSink * base_sink)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+
+ GST_LOG_OBJECT (sink, "triggering cancellation");
+
+ g_cancellable_cancel (sink->cancel);
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_sink_unlock_stop (GstBaseSink * base_sink)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+
+ GST_LOG_OBJECT (sink, "resetting cancellable");
+
+ g_cancellable_reset (sink->cancel);
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_sink_event (GstBaseSink * base_sink, GstEvent * event)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ if (sink->stream == NULL)
+ return TRUE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ if (G_IS_OUTPUT_STREAM (sink->stream)) {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format != GST_FORMAT_BYTES) {
+ GST_WARNING_OBJECT (sink, "ignored SEGMENT event in %s format",
+ gst_format_get_name (segment->format));
+ break;
+ }
+
+ if (GST_GIO_STREAM_IS_SEEKABLE (sink->stream)) {
+ ret = gst_gio_seek (sink, G_SEEKABLE (sink->stream), segment->start,
+ sink->cancel);
+ if (ret == GST_FLOW_OK)
+ sink->position = segment->start;
+ } else {
+ ret = GST_FLOW_NOT_SUPPORTED;
+ }
+ }
+ break;
+
+ case GST_EVENT_EOS:
+ case GST_EVENT_FLUSH_START:
+ if (G_IS_OUTPUT_STREAM (sink->stream)) {
+ gboolean success;
+ GError *err = NULL;
+
+ success = g_output_stream_flush (sink->stream, sink->cancel, &err);
+
+ if (!success && !gst_gio_error (sink, "g_output_stream_flush", &err,
+ &ret)) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL),
+ ("flush failed: %s", err->message));
+ g_clear_error (&err);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return (ret == GST_FLOW_OK);
+}
+
+static GstFlowReturn
+gst_gio_base_sink_render (GstBaseSink * base_sink, GstBuffer * buffer)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (base_sink);
+ gssize written;
+ guint8 *data;
+ gsize size;
+ gboolean success;
+ GError *err = NULL;
+
+ g_return_val_if_fail (G_IS_OUTPUT_STREAM (sink->stream), GST_FLOW_ERROR);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ GST_LOG_OBJECT (sink,
+ "writing %" G_GSIZE_FORMAT " bytes to offset %" G_GUINT64_FORMAT, size,
+ sink->position);
+
+ written =
+ g_output_stream_write (sink->stream, data, size, sink->cancel, &err);
+ gst_buffer_unmap (buffer, data, size);
+
+ success = (written >= 0);
+
+ if (G_UNLIKELY (success && written < size)) {
+ /* FIXME: Can this happen? Should we handle it gracefully? gnomevfssink
+ * doesn't... */
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL),
+ ("Could not write to stream: (short write, only %"
+ G_GSSIZE_FORMAT " bytes of %" G_GSIZE_FORMAT " bytes written)",
+ written, size));
+ return GST_FLOW_ERROR;
+ }
+
+ if (success) {
+ sink->position += written;
+ return GST_FLOW_OK;
+
+ } else {
+ GstFlowReturn ret;
+
+ if (!gst_gio_error (sink, "g_output_stream_write", &err, &ret)) {
+ if (GST_GIO_ERROR_MATCHES (err, NO_SPACE)) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, NO_SPACE_LEFT, (NULL),
+ ("Could not write to stream: %s", err->message));
+ } else {
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL),
+ ("Could not write to stream: %s", err->message));
+ }
+ g_clear_error (&err);
+ }
+
+ return ret;
+ }
+}
+
+static gboolean
+gst_gio_base_sink_query (GstBaseSink * bsink, GstQuery * query)
+{
+ GstGioBaseSink *sink = GST_GIO_BASE_SINK (bsink);
+ GstFormat format;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ gst_query_parse_position (query, &format, NULL);
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ case GST_FORMAT_DEFAULT:
+ gst_query_set_position (query, GST_FORMAT_BYTES, sink->position);
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ case GST_QUERY_FORMATS:
+ gst_query_set_formats (query, 2, GST_FORMAT_DEFAULT, GST_FORMAT_BYTES);
+ return TRUE;
+ case GST_QUERY_URI:
+ if (GST_IS_URI_HANDLER (sink)) {
+ const gchar *uri;
+
+ uri = gst_uri_handler_get_uri (GST_URI_HANDLER (sink));
+ gst_query_set_uri (query, uri);
+ return TRUE;
+ }
+ return FALSE;
+ default:
+ return GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
+ }
+}
diff --git a/ext/gio/gstgiobasesink.h b/ext/gio/gstgiobasesink.h
new file mode 100644
index 0000000..7f13a85
--- /dev/null
+++ b/ext/gio/gstgiobasesink.h
@@ -0,0 +1,71 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_BASE_SINK_H__
+#define __GST_GIO_BASE_SINK_H__
+
+#include "gstgio.h"
+
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_BASE_SINK \
+ (gst_gio_base_sink_get_type())
+#define GST_GIO_BASE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_BASE_SINK,GstGioBaseSink))
+#define GST_GIO_BASE_SINK_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GIO_BASE_SINK, GstGioBaseSinkClass))
+#define GST_GIO_BASE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_BASE_SINK,GstGioBaseSinkClass))
+#define GST_IS_GIO_BASE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_BASE_SINK))
+#define GST_IS_GIO_BASE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_BASE_SINK))
+
+typedef struct _GstGioBaseSink GstGioBaseSink;
+typedef struct _GstGioBaseSinkClass GstGioBaseSinkClass;
+
+struct _GstGioBaseSink
+{
+ GstBaseSink sink;
+
+ /* < protected > */
+ GCancellable *cancel;
+ guint64 position;
+
+ /* < private > */
+ GOutputStream *stream;
+};
+
+struct _GstGioBaseSinkClass
+{
+ GstBaseSinkClass parent_class;
+
+ GOutputStream * (*get_stream) (GstGioBaseSink *bsink);
+ gboolean close_on_stop;
+};
+
+GType gst_gio_base_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_BASE_SINK_H__ */
diff --git a/ext/gio/gstgiobasesrc.c b/ext/gio/gstgiobasesrc.c
new file mode 100644
index 0000000..7987d99
--- /dev/null
+++ b/ext/gio/gstgiobasesrc.c
@@ -0,0 +1,433 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiobasesrc.h"
+
+#include <gst/base/gsttypefindhelper.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_base_src_debug);
+#define GST_CAT_DEFAULT gst_gio_base_src_debug
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+#define gst_gio_base_src_parent_class parent_class
+G_DEFINE_TYPE (GstGioBaseSrc, gst_gio_base_src, GST_TYPE_BASE_SRC);
+
+static void gst_gio_base_src_finalize (GObject * object);
+
+static gboolean gst_gio_base_src_start (GstBaseSrc * base_src);
+static gboolean gst_gio_base_src_stop (GstBaseSrc * base_src);
+static gboolean gst_gio_base_src_get_size (GstBaseSrc * base_src,
+ guint64 * size);
+static gboolean gst_gio_base_src_is_seekable (GstBaseSrc * base_src);
+static gboolean gst_gio_base_src_unlock (GstBaseSrc * base_src);
+static gboolean gst_gio_base_src_unlock_stop (GstBaseSrc * base_src);
+static GstFlowReturn gst_gio_base_src_create (GstBaseSrc * base_src,
+ guint64 offset, guint size, GstBuffer ** buf);
+static gboolean gst_gio_base_src_query (GstBaseSrc * base_src,
+ GstQuery * query);
+
+static void
+gst_gio_base_src_class_init (GstGioBaseSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_base_src_debug, "gio_base_src", 0,
+ "GIO base source");
+
+ gobject_class->finalize = gst_gio_base_src_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_factory));
+
+ gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_gio_base_src_start);
+ gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_gio_base_src_stop);
+ gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_gio_base_src_get_size);
+ gstbasesrc_class->is_seekable =
+ GST_DEBUG_FUNCPTR (gst_gio_base_src_is_seekable);
+ gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_gio_base_src_unlock);
+ gstbasesrc_class->unlock_stop =
+ GST_DEBUG_FUNCPTR (gst_gio_base_src_unlock_stop);
+ gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_gio_base_src_create);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_gio_base_src_query);
+}
+
+static void
+gst_gio_base_src_init (GstGioBaseSrc * src)
+{
+ src->cancel = g_cancellable_new ();
+}
+
+static void
+gst_gio_base_src_finalize (GObject * object)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (object);
+
+ if (src->cancel) {
+ g_object_unref (src->cancel);
+ src->cancel = NULL;
+ }
+
+ if (src->stream) {
+ g_object_unref (src->stream);
+ src->stream = NULL;
+ }
+
+ if (src->cache) {
+ gst_buffer_unref (src->cache);
+ src->cache = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static gboolean
+gst_gio_base_src_start (GstBaseSrc * base_src)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+ GstGioBaseSrcClass *gbsrc_class = GST_GIO_BASE_SRC_GET_CLASS (src);
+
+ src->position = 0;
+
+ /* FIXME: This will likely block */
+ src->stream = gbsrc_class->get_stream (src);
+ if (G_UNLIKELY (!G_IS_INPUT_STREAM (src->stream))) {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("No input stream provided by subclass"));
+ return FALSE;
+ } else if (G_UNLIKELY (g_input_stream_is_closed (src->stream))) {
+ GST_ELEMENT_ERROR (src, LIBRARY, FAILED, (NULL),
+ ("Input stream is already closed"));
+ return FALSE;
+ }
+
+ if (G_IS_SEEKABLE (src->stream))
+ src->position = g_seekable_tell (G_SEEKABLE (src->stream));
+
+ GST_DEBUG_OBJECT (src, "started source");
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_src_stop (GstBaseSrc * base_src)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+ GstGioBaseSrcClass *klass = GST_GIO_BASE_SRC_GET_CLASS (src);
+ gboolean success;
+ GError *err = NULL;
+
+ if (klass->close_on_stop && G_IS_INPUT_STREAM (src->stream)) {
+ GST_DEBUG_OBJECT (src, "closing stream");
+
+ /* FIXME: can block but unfortunately we can't use async operations
+ * here because they require a running main loop */
+ success = g_input_stream_close (src->stream, src->cancel, &err);
+
+ if (!success && !gst_gio_error (src, "g_input_stream_close", &err, NULL)) {
+ GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
+ ("g_input_stream_close failed: %s", err->message));
+ g_clear_error (&err);
+ } else if (!success) {
+ GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
+ ("g_input_stream_close failed"));
+ } else {
+ GST_DEBUG_OBJECT (src, "g_input_stream_close succeeded");
+ }
+
+ g_object_unref (src->stream);
+ src->stream = NULL;
+ } else {
+ g_object_unref (src->stream);
+ src->stream = NULL;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_src_get_size (GstBaseSrc * base_src, guint64 * size)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+
+ if (G_IS_FILE_INPUT_STREAM (src->stream)) {
+ GFileInfo *info;
+ GError *err = NULL;
+
+ info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (src->stream),
+ G_FILE_ATTRIBUTE_STANDARD_SIZE, src->cancel, &err);
+
+ if (info != NULL) {
+ *size = g_file_info_get_size (info);
+ g_object_unref (info);
+ GST_DEBUG_OBJECT (src, "found size: %" G_GUINT64_FORMAT, *size);
+ return TRUE;
+ }
+
+ if (!gst_gio_error (src, "g_file_input_stream_query_info", &err, NULL)) {
+
+ if (GST_GIO_ERROR_MATCHES (err, NOT_SUPPORTED))
+ GST_DEBUG_OBJECT (src, "size information not available");
+ else
+ GST_WARNING_OBJECT (src, "size information retrieval failed: %s",
+ err->message);
+
+ g_clear_error (&err);
+ }
+ }
+
+ if (GST_GIO_STREAM_IS_SEEKABLE (src->stream)) {
+ goffset old;
+ goffset stream_size;
+ gboolean ret;
+ GSeekable *seekable = G_SEEKABLE (src->stream);
+ GError *err = NULL;
+
+ old = g_seekable_tell (seekable);
+
+ ret = g_seekable_seek (seekable, 0, G_SEEK_END, src->cancel, &err);
+ if (!ret) {
+ if (!gst_gio_error (src, "g_seekable_seek", &err, NULL)) {
+ if (GST_GIO_ERROR_MATCHES (err, NOT_SUPPORTED))
+ GST_DEBUG_OBJECT (src,
+ "Seeking to the end of stream is not supported");
+ else
+ GST_WARNING_OBJECT (src, "Seeking to end of stream failed: %s",
+ err->message);
+ g_clear_error (&err);
+ } else {
+ GST_WARNING_OBJECT (src, "Seeking to end of stream failed");
+ }
+ return FALSE;
+ }
+
+ stream_size = g_seekable_tell (seekable);
+
+ ret = g_seekable_seek (seekable, old, G_SEEK_SET, src->cancel, &err);
+ if (!ret) {
+ if (!gst_gio_error (src, "g_seekable_seek", &err, NULL)) {
+ if (GST_GIO_ERROR_MATCHES (err, NOT_SUPPORTED))
+ GST_ERROR_OBJECT (src, "Seeking to the old position not supported");
+ else
+ GST_ERROR_OBJECT (src, "Seeking to the old position failed: %s",
+ err->message);
+ g_clear_error (&err);
+ } else {
+ GST_ERROR_OBJECT (src, "Seeking to the old position faile");
+ }
+ return FALSE;
+ }
+
+ if (stream_size >= 0) {
+ *size = stream_size;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_gio_base_src_is_seekable (GstBaseSrc * base_src)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+ gboolean seekable;
+
+ seekable = GST_GIO_STREAM_IS_SEEKABLE (src->stream);
+
+ GST_DEBUG_OBJECT (src, "can seek: %d", seekable);
+
+ return seekable;
+}
+
+static gboolean
+gst_gio_base_src_unlock (GstBaseSrc * base_src)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+
+ GST_LOG_OBJECT (src, "triggering cancellation");
+
+ g_cancellable_cancel (src->cancel);
+
+ return TRUE;
+}
+
+static gboolean
+gst_gio_base_src_unlock_stop (GstBaseSrc * base_src)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+
+ GST_LOG_OBJECT (src, "resetting cancellable");
+
+ g_cancellable_reset (src->cancel);
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_gio_base_src_create (GstBaseSrc * base_src, guint64 offset, guint size,
+ GstBuffer ** buf_return)
+{
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+ GstBuffer *buf;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ g_return_val_if_fail (G_IS_INPUT_STREAM (src->stream), GST_FLOW_ERROR);
+
+ /* If we have the requested part in our cache take a subbuffer of that,
+ * otherwise fill the cache again with at least 4096 bytes from the
+ * requested offset and return a subbuffer of that.
+ *
+ * We need caching because every read/seek operation will need to go
+ * over DBus if our backend is GVfs and this is painfully slow. */
+ if (src->cache && offset >= GST_BUFFER_OFFSET (src->cache) &&
+ offset + size <= GST_BUFFER_OFFSET_END (src->cache)) {
+ GST_DEBUG_OBJECT (src, "Creating subbuffer from cached buffer: offset %"
+ G_GUINT64_FORMAT " length %u", offset, size);
+
+ buf = gst_buffer_copy_region (src->cache, GST_BUFFER_COPY_ALL,
+ offset - GST_BUFFER_OFFSET (src->cache), size);
+
+ GST_BUFFER_OFFSET (buf) = offset;
+ GST_BUFFER_OFFSET_END (buf) = offset + size;
+ } else {
+ guint cachesize = MAX (4096, size);
+ guint8 *bdata;
+ gssize read, res;
+ gboolean success, eos;
+ GError *err = NULL;
+
+ if (src->cache) {
+ gst_buffer_unref (src->cache);
+ src->cache = NULL;
+ }
+
+ if (G_UNLIKELY (offset != src->position)) {
+ if (!GST_GIO_STREAM_IS_SEEKABLE (src->stream))
+ return GST_FLOW_NOT_SUPPORTED;
+
+ GST_DEBUG_OBJECT (src, "Seeking to position %" G_GUINT64_FORMAT, offset);
+ ret = gst_gio_seek (src, G_SEEKABLE (src->stream), offset, src->cancel);
+
+ if (ret == GST_FLOW_OK)
+ src->position = offset;
+ else
+ return ret;
+ }
+
+ src->cache = gst_buffer_new_and_alloc (cachesize);
+ if (G_UNLIKELY (src->cache == NULL)) {
+ GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", cachesize);
+ return GST_FLOW_ERROR;
+ }
+
+ GST_LOG_OBJECT (src, "Reading %u bytes from offset %" G_GUINT64_FORMAT,
+ cachesize, offset);
+
+ /* GIO sometimes gives less bytes than requested although
+ * it's not at the end of file. SMB for example only
+ * supports reads up to 64k. So we loop here until we get at
+ * at least the requested amount of bytes or a read returns
+ * nothing. */
+ bdata = gst_buffer_map (src->cache, NULL, NULL, GST_MAP_WRITE);
+ read = 0;
+ while (size - read > 0 && (res =
+ g_input_stream_read (G_INPUT_STREAM (src->stream),
+ bdata + read, cachesize - read, src->cancel, &err)) > 0) {
+ read += res;
+ }
+ gst_buffer_unmap (src->cache, bdata, read);
+
+ success = (read >= 0);
+ eos = (cachesize > 0 && read == 0);
+
+ if (!success && !gst_gio_error (src, "g_input_stream_read", &err, &ret)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("Could not read from stream: %s", err->message));
+ g_clear_error (&err);
+ }
+
+ if (success && !eos) {
+ src->position += read;
+
+ GST_BUFFER_OFFSET (src->cache) = offset;
+ GST_BUFFER_OFFSET_END (src->cache) = offset + read;
+
+ GST_DEBUG_OBJECT (src, "Read successful");
+ GST_DEBUG_OBJECT (src, "Creating subbuffer from new "
+ "cached buffer: offset %" G_GUINT64_FORMAT " length %u", offset,
+ size);
+
+ buf =
+ gst_buffer_copy_region (src->cache, GST_BUFFER_COPY_ALL, 0, MIN (size,
+ read));
+
+ GST_BUFFER_OFFSET (buf) = offset;
+ GST_BUFFER_OFFSET_END (buf) = offset + MIN (size, read);
+ } else {
+ GST_DEBUG_OBJECT (src, "Read not successful");
+ gst_buffer_unref (src->cache);
+ src->cache = NULL;
+ buf = NULL;
+ }
+
+ if (eos)
+ ret = GST_FLOW_UNEXPECTED;
+ }
+
+ *buf_return = buf;
+
+ return ret;
+}
+
+static gboolean
+gst_gio_base_src_query (GstBaseSrc * base_src, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstGioBaseSrc *src = GST_GIO_BASE_SRC (base_src);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_URI:
+ if (GST_IS_URI_HANDLER (src)) {
+ const gchar *uri = gst_uri_handler_get_uri (GST_URI_HANDLER (src));
+ gst_query_set_uri (query, uri);
+ ret = TRUE;
+ }
+ break;
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ if (!ret)
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (base_src, query);
+
+ return ret;
+}
diff --git a/ext/gio/gstgiobasesrc.h b/ext/gio/gstgiobasesrc.h
new file mode 100644
index 0000000..7a14859
--- /dev/null
+++ b/ext/gio/gstgiobasesrc.h
@@ -0,0 +1,72 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_BASE_SRC_H__
+#define __GST_GIO_BASE_SRC_H__
+
+#include "gstgio.h"
+
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_BASE_SRC \
+ (gst_gio_base_src_get_type())
+#define GST_GIO_BASE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_BASE_SRC,GstGioBaseSrc))
+#define GST_GIO_BASE_SRC_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GIO_BASE_SRC, GstGioBaseSrcClass))
+#define GST_GIO_BASE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_BASE_SRC,GstGioBaseSrcClass))
+#define GST_IS_GIO_BASE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_BASE_SRC))
+#define GST_IS_GIO_BASE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_BASE_SRC))
+
+typedef struct _GstGioBaseSrc GstGioBaseSrc;
+typedef struct _GstGioBaseSrcClass GstGioBaseSrcClass;
+
+struct _GstGioBaseSrc
+{
+ GstBaseSrc src;
+
+ /* < protected > */
+ GCancellable *cancel;
+ guint64 position;
+
+ /* < private > */
+ GInputStream *stream;
+ GstBuffer *cache;
+};
+
+struct _GstGioBaseSrcClass
+{
+ GstBaseSrcClass parent_class;
+
+ GInputStream * (*get_stream) (GstGioBaseSrc *bsrc);
+ gboolean close_on_stop;
+};
+
+GType gst_gio_base_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_BASE_SRC_H__ */
diff --git a/ext/gio/gstgiosink.c b/ext/gio/gstgiosink.c
new file mode 100644
index 0000000..fe7a23f
--- /dev/null
+++ b/ext/gio/gstgiosink.c
@@ -0,0 +1,315 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-giosink
+ * @see_also: #GstFileSink, #GstGnomeVFSSink, #GstGioSrc
+ *
+ * This plugin writes incoming data to a local or remote location specified
+ * by an URI. This location can be specified using any protocol supported by
+ * the GIO library or it's VFS backends. Common protocols are 'file', 'ftp',
+ * or 'smb'.
+ *
+ * If the URI or #GFile already exists giosink will post a message of
+ * type %GST_MESSAGE_ELEMENT with name "file-exists" on the bus. The message
+ * also contains the #GFile and the corresponding URI.
+ * Applications can use the "file-exists" message to notify the user about
+ * the problem and to set a different target location or to remove the
+ * existing file. Note that right after the "file-exists" message a normal
+ * error message is posted on the bus which should be ignored if "file-exists"
+ * is handled by the application, for example by calling
+ * gst_bus_set_flushing(bus, TRUE) after the "file-exists" message was
+ * received and gst_bus_set_flushing(bus, FALSE) after the problem is
+ * resolved.
+ *
+ * Similar to the "file-exist" message a "not-mounted" message is posted
+ * on the bus if the target location is not mounted yet and needs to be
+ * mounted. This message can be used by application to mount the location
+ * and retry after the location was mounted successfully.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=input.xyz ! giosink location=file:///home/joe/out.xyz
+ * ]| The above pipeline will simply copy a local file. Instead of giosink,
+ * we could just as well have used the filesink element here.
+ * |[
+ * gst-launch -v filesrc location=foo.mp3 ! mad ! flacenc ! giosink location=smb://othercomputer/foo.flac
+ * ]| The above pipeline will re-encode an mp3 file into FLAC format and store
+ * it on a remote host using the Samba protocol.
+ * |[
+ * gst-launch -v audiotestsrc num-buffers=100 ! vorbisenc ! oggmux ! giosink location=file:///home/foo/bar.ogg
+ * ]| The above pipeline will encode a 440Hz sine wave to Ogg Vorbis and stores
+ * it in the home directory of user foo.
+ * </refsect2>
+ */
+
+/* FIXME: We would like to mount the enclosing volume of an URL
+ * if it isn't mounted yet but this is possible async-only.
+ * Unfortunately this requires a running main loop from the
+ * default context and we can't guarantuee this!
+ *
+ * We would also like to do authentication while mounting.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiosink.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_sink_debug);
+#define GST_CAT_DEFAULT gst_gio_sink_debug
+
+/* Filter signals and args */
+enum
+{
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_LOCATION,
+ PROP_FILE
+};
+
+#define gst_gio_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGioSink, gst_gio_sink, GST_TYPE_GIO_BASE_SINK,
+ gst_gio_uri_handler_do_init (g_define_type_id));
+
+static void gst_gio_sink_finalize (GObject * object);
+static void gst_gio_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_gio_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static GOutputStream *gst_gio_sink_get_stream (GstGioBaseSink * base_sink);
+
+static void
+gst_gio_sink_class_init (GstGioSinkClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstGioBaseSinkClass *gstgiobasesink_class = (GstGioBaseSinkClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_sink_debug, "gio_sink", 0, "GIO sink");
+
+ gobject_class->finalize = gst_gio_sink_finalize;
+ gobject_class->set_property = gst_gio_sink_set_property;
+ gobject_class->get_property = gst_gio_sink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_LOCATION,
+ g_param_spec_string ("location", "Location", "URI location to write to",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstGioSink:file
+ *
+ * %GFile to write to.
+ *
+ * Since: 0.10.20
+ **/
+ g_object_class_install_property (gobject_class, PROP_FILE,
+ g_param_spec_object ("file", "File", "GFile to write to",
+ G_TYPE_FILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class, "GIO sink",
+ "Sink/File",
+ "Write to any GIO-supported location",
+ "Ren\xc3\xa9 Stadler <mail@renestadler.de>, "
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstgiobasesink_class->get_stream =
+ GST_DEBUG_FUNCPTR (gst_gio_sink_get_stream);
+ gstgiobasesink_class->close_on_stop = TRUE;
+}
+
+static void
+gst_gio_sink_init (GstGioSink * sink)
+{
+}
+
+static void
+gst_gio_sink_finalize (GObject * object)
+{
+ GstGioSink *sink = GST_GIO_SINK (object);
+
+ if (sink->file) {
+ g_object_unref (sink->file);
+ sink->file = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_gio_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstGioSink *sink = GST_GIO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:{
+ const gchar *uri = NULL;
+
+ if (GST_STATE (sink) == GST_STATE_PLAYING ||
+ GST_STATE (sink) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ GST_OBJECT_LOCK (GST_OBJECT (sink));
+ if (sink->file)
+ g_object_unref (sink->file);
+
+ uri = g_value_get_string (value);
+
+ if (uri) {
+ sink->file = g_file_new_for_uri (uri);
+
+ if (!sink->file) {
+ GST_ERROR ("Could not create GFile for URI '%s'", uri);
+ }
+ } else {
+ sink->file = NULL;
+ }
+ GST_OBJECT_UNLOCK (GST_OBJECT (sink));
+ break;
+ }
+ case PROP_FILE:
+ if (GST_STATE (sink) == GST_STATE_PLAYING ||
+ GST_STATE (sink) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ GST_OBJECT_LOCK (GST_OBJECT (sink));
+ if (sink->file)
+ g_object_unref (sink->file);
+
+ sink->file = g_value_dup_object (value);
+
+ GST_OBJECT_UNLOCK (GST_OBJECT (sink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_gio_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstGioSink *sink = GST_GIO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:{
+ gchar *uri;
+
+ GST_OBJECT_LOCK (GST_OBJECT (sink));
+ if (sink->file) {
+ uri = g_file_get_uri (sink->file);
+ g_value_set_string (value, uri);
+ g_free (uri);
+ } else {
+ g_value_set_string (value, NULL);
+ }
+ GST_OBJECT_UNLOCK (GST_OBJECT (sink));
+ break;
+ }
+ case PROP_FILE:
+ GST_OBJECT_LOCK (GST_OBJECT (sink));
+ g_value_set_object (value, sink->file);
+ GST_OBJECT_UNLOCK (GST_OBJECT (sink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GOutputStream *
+gst_gio_sink_get_stream (GstGioBaseSink * bsink)
+{
+ GstGioSink *sink = GST_GIO_SINK (bsink);
+ GOutputStream *stream;
+ GCancellable *cancel = GST_GIO_BASE_SINK (sink)->cancel;
+ GError *err = NULL;
+ gchar *uri;
+
+ if (sink->file == NULL) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("No location or GFile given"));
+ return NULL;
+ }
+
+ uri = g_file_get_uri (sink->file);
+ if (!uri)
+ uri = g_strdup ("(null)");
+
+ stream =
+ G_OUTPUT_STREAM (g_file_create (sink->file, G_FILE_CREATE_NONE, cancel,
+ &err));
+
+ if (!stream) {
+ if (!gst_gio_error (sink, "g_file_create", &err, NULL)) {
+ /*if (GST_GIO_ERROR_MATCHES (err, EXISTS)) */
+ /* FIXME: Retry with replace if overwrite == TRUE! */
+
+ if (GST_GIO_ERROR_MATCHES (err, NOT_FOUND)) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, (NULL),
+ ("Could not open location %s for writing: %s", uri, err->message));
+ } else if (GST_GIO_ERROR_MATCHES (err, EXISTS)) {
+ gst_element_post_message (GST_ELEMENT_CAST (sink),
+ gst_message_new_element (GST_OBJECT_CAST (sink),
+ gst_structure_new ("file-exists", "file", G_TYPE_FILE,
+ sink->file, "uri", G_TYPE_STRING, uri, NULL)));
+
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("Location %s already exists: %s", uri, err->message));
+ } else if (GST_GIO_ERROR_MATCHES (err, NOT_MOUNTED)) {
+ gst_element_post_message (GST_ELEMENT_CAST (sink),
+ gst_message_new_element (GST_OBJECT_CAST (sink),
+ gst_structure_new ("not-mounted", "file", G_TYPE_FILE,
+ sink->file, "uri", G_TYPE_STRING, uri, NULL)));
+
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("Location %s not mounted: %s", uri, err->message));
+ } else {
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("Could not open location %s for writing: %s", uri, err->message));
+ }
+
+ g_clear_error (&err);
+ }
+ g_free (uri);
+ return NULL;
+ }
+
+ GST_DEBUG_OBJECT (sink, "opened location %s", uri);
+
+ g_free (uri);
+
+ return stream;
+}
diff --git a/ext/gio/gstgiosink.h b/ext/gio/gstgiosink.h
new file mode 100644
index 0000000..494d5db
--- /dev/null
+++ b/ext/gio/gstgiosink.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_SINK_H__
+#define __GST_GIO_SINK_H__
+
+#include "gstgio.h"
+#include "gstgiobasesink.h"
+
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_SINK \
+ (gst_gio_sink_get_type())
+#define GST_GIO_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_SINK,GstGioSink))
+#define GST_GIO_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_SINK,GstGioSinkClass))
+#define GST_IS_GIO_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_SINK))
+#define GST_IS_GIO_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_SINK))
+
+typedef struct _GstGioSink GstGioSink;
+typedef struct _GstGioSinkClass GstGioSinkClass;
+
+/**
+ * GstGioSink:
+ *
+ * Opaque data structure.
+ */
+struct _GstGioSink
+{
+ GstGioBaseSink sink;
+
+ /*< private >*/
+ GFile *file;
+};
+
+struct _GstGioSinkClass
+{
+ GstGioBaseSinkClass parent_class;
+};
+
+GType gst_gio_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_SINK_H__ */
diff --git a/ext/gio/gstgiosrc.c b/ext/gio/gstgiosrc.c
new file mode 100644
index 0000000..5e077ad
--- /dev/null
+++ b/ext/gio/gstgiosrc.c
@@ -0,0 +1,345 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-giosrc
+ * @see_also: #GstFileSrc, #GstGnomeVFSSrc, #GstGioSink
+ *
+ * This plugin reads data from a local or remote location specified
+ * by an URI. This location can be specified using any protocol supported by
+ * the GIO library or it's VFS backends. Common protocols are 'file', 'http',
+ * 'ftp', or 'smb'.
+ *
+ * If an URI or #GFile is not mounted giosrc will post a message of type
+ * %GST_MESSAGE_ELEMENT with name "not-mounted" on the bus. The message
+ * also contains the #GFile and the corresponding URI.
+ * Applications can use the "not-mounted" message to mount the #GFile
+ * by calling g_file_mount_enclosing_volume() and then restart the
+ * pipeline after the mounting has succeeded. Note that right after the
+ * "not-mounted" message a normal error message is posted on the bus which
+ * should be ignored if "not-mounted" is handled by the application, for
+ * example by calling gst_bus_set_flushing(bus, TRUE) after the "not-mounted"
+ * message was received and gst_bus_set_flushing(bus, FALSE) after the
+ * mounting was successful.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v giosrc location=file:///home/joe/foo.xyz ! fakesink
+ * ]| The above pipeline will simply read a local file and do nothing with the
+ * data read. Instead of giosrc, we could just as well have used the
+ * filesrc element here.
+ * |[
+ * gst-launch -v giosrc location=smb://othercomputer/foo.xyz ! filesink location=/home/joe/foo.xyz
+ * ]| The above pipeline will copy a file from a remote host to the local file
+ * system using the Samba protocol.
+ * |[
+ * gst-launch -v giosrc 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.
+ * </refsect2>
+ */
+
+/* FIXME: We would like to mount the enclosing volume of an URL
+ * if it isn't mounted yet but this is possible async-only.
+ * Unfortunately this requires a running main loop from the
+ * default context and we can't guarantuee this!
+ *
+ * We would also like to do authentication while mounting.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiosrc.h"
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_src_debug);
+#define GST_CAT_DEFAULT gst_gio_src_debug
+
+enum
+{
+ PROP_0,
+ PROP_LOCATION,
+ PROP_FILE
+};
+
+#define gst_gio_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGioSrc, gst_gio_src,
+ GST_TYPE_GIO_BASE_SRC, gst_gio_uri_handler_do_init (g_define_type_id));
+
+static void gst_gio_src_finalize (GObject * object);
+
+static void gst_gio_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_gio_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GInputStream *gst_gio_src_get_stream (GstGioBaseSrc * bsrc);
+
+static gboolean gst_gio_src_query (GstBaseSrc * base_src, GstQuery * query);
+
+static void
+gst_gio_src_class_init (GstGioSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
+ GstGioBaseSrcClass *gstgiobasesrc_class = (GstGioBaseSrcClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_src_debug, "gio_src", 0, "GIO source");
+
+ gobject_class->finalize = gst_gio_src_finalize;
+ gobject_class->set_property = gst_gio_src_set_property;
+ gobject_class->get_property = gst_gio_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_LOCATION,
+ g_param_spec_string ("location", "Location", "URI location to read from",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstGioSrc:file
+ *
+ * %GFile to read from.
+ *
+ * Since: 0.10.20
+ **/
+ g_object_class_install_property (gobject_class, PROP_FILE,
+ g_param_spec_object ("file", "File", "GFile to read from",
+ G_TYPE_FILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class, "GIO source",
+ "Source/File",
+ "Read from any GIO-supported location",
+ "Ren\xc3\xa9 Stadler <mail@renestadler.de>, "
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_gio_src_query);
+
+ gstgiobasesrc_class->get_stream = GST_DEBUG_FUNCPTR (gst_gio_src_get_stream);
+ gstgiobasesrc_class->close_on_stop = TRUE;
+}
+
+static void
+gst_gio_src_init (GstGioSrc * src)
+{
+}
+
+static void
+gst_gio_src_finalize (GObject * object)
+{
+ GstGioSrc *src = GST_GIO_SRC (object);
+
+ if (src->file) {
+ g_object_unref (src->file);
+ src->file = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_gio_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstGioSrc *src = GST_GIO_SRC (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:{
+ const gchar *uri = NULL;
+
+ if (GST_STATE (src) == GST_STATE_PLAYING ||
+ GST_STATE (src) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ GST_OBJECT_LOCK (GST_OBJECT (src));
+ if (src->file)
+ g_object_unref (src->file);
+
+ uri = g_value_get_string (value);
+
+ if (uri) {
+ src->file = g_file_new_for_uri (uri);
+
+ if (!src->file) {
+ GST_ERROR ("Could not create GFile for URI '%s'", uri);
+ }
+ } else {
+ src->file = NULL;
+ }
+ GST_OBJECT_UNLOCK (GST_OBJECT (src));
+ break;
+ }
+ case PROP_FILE:
+ if (GST_STATE (src) == GST_STATE_PLAYING ||
+ GST_STATE (src) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ GST_OBJECT_LOCK (GST_OBJECT (src));
+ if (src->file)
+ g_object_unref (src->file);
+
+ src->file = g_value_dup_object (value);
+
+ GST_OBJECT_UNLOCK (GST_OBJECT (src));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_gio_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstGioSrc *src = GST_GIO_SRC (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:{
+ gchar *uri;
+
+ GST_OBJECT_LOCK (GST_OBJECT (src));
+ if (src->file) {
+ uri = g_file_get_uri (src->file);
+ g_value_set_string (value, uri);
+ g_free (uri);
+ } else {
+ g_value_set_string (value, NULL);
+ }
+ GST_OBJECT_UNLOCK (GST_OBJECT (src));
+ break;
+ }
+ case PROP_FILE:
+ GST_OBJECT_LOCK (GST_OBJECT (src));
+ g_value_set_object (value, src->file);
+ GST_OBJECT_UNLOCK (GST_OBJECT (src));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_gio_src_query (GstBaseSrc * base_src, GstQuery * query)
+{
+ gboolean res;
+ GstGioSrc *src = GST_GIO_SRC (base_src);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_SCHEDULING:
+ {
+ gchar *scheme;
+ gboolean pull_mode;
+
+ pull_mode = FALSE;
+ if (src->file == NULL)
+ goto forward_parent;
+
+ scheme = g_file_get_uri_scheme (src->file);
+ if (scheme == NULL)
+ goto forward_parent;
+
+ if (strcmp (scheme, "file") == 0) {
+ GST_LOG_OBJECT (src, "local URI, assuming random access is possible");
+ pull_mode = TRUE;
+ } else if (strcmp (scheme, "http") == 0 || strcmp (scheme, "https") == 0) {
+ GST_LOG_OBJECT (src, "blacklisted protocol '%s', "
+ "no random access possible", scheme);
+ } else {
+ GST_LOG_OBJECT (src, "unhandled protocol '%s', asking parent", scheme);
+ goto forward_parent;
+ }
+ g_free (scheme);
+
+ gst_query_set_scheduling (query, pull_mode, pull_mode, FALSE, 1, -1, 1);
+ res = TRUE;
+ break;
+ }
+ default:
+ forward_parent:
+ res = GST_CALL_PARENT_WITH_DEFAULT (GST_BASE_SRC_CLASS,
+ query, (base_src, query), FALSE);
+ break;
+ }
+
+ return res;
+}
+
+static GInputStream *
+gst_gio_src_get_stream (GstGioBaseSrc * bsrc)
+{
+ GstGioSrc *src = GST_GIO_SRC (bsrc);
+ GError *err = NULL;
+ GInputStream *stream;
+ GCancellable *cancel = bsrc->cancel;
+ gchar *uri = NULL;
+
+ if (src->file == NULL) {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("No location or GFile given"));
+ return NULL;
+ }
+
+ uri = g_file_get_uri (src->file);
+ if (!uri)
+ uri = g_strdup ("(null)");
+
+ stream = G_INPUT_STREAM (g_file_read (src->file, cancel, &err));
+
+ if (stream == NULL && !gst_gio_error (src, "g_file_read", &err, NULL)) {
+ if (GST_GIO_ERROR_MATCHES (err, NOT_FOUND)) {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),
+ ("Could not open location %s for reading: %s", uri, err->message));
+ } else if (GST_GIO_ERROR_MATCHES (err, NOT_MOUNTED)) {
+ gst_element_post_message (GST_ELEMENT_CAST (src),
+ gst_message_new_element (GST_OBJECT_CAST (src),
+ gst_structure_new ("not-mounted", "file", G_TYPE_FILE, src->file,
+ "uri", G_TYPE_STRING, uri, NULL)));
+
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("Location %s not mounted: %s", uri, err->message));
+ } else {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("Could not open location %s for reading: %s", uri, err->message));
+ }
+
+ g_free (uri);
+ g_clear_error (&err);
+ return NULL;
+ } else if (stream == NULL) {
+ g_free (uri);
+ return NULL;
+ }
+
+ GST_DEBUG_OBJECT (src, "opened location %s", uri);
+ g_free (uri);
+
+ return stream;
+}
diff --git a/ext/gio/gstgiosrc.h b/ext/gio/gstgiosrc.h
new file mode 100644
index 0000000..080d3d8
--- /dev/null
+++ b/ext/gio/gstgiosrc.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_SRC_H__
+#define __GST_GIO_SRC_H__
+
+#include "gstgio.h"
+#include "gstgiobasesrc.h"
+
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_SRC \
+ (gst_gio_src_get_type())
+#define GST_GIO_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_SRC,GstGioSrc))
+#define GST_GIO_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_SRC,GstGioSrcClass))
+#define GST_IS_GIO_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_SRC))
+#define GST_IS_GIO_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_SRC))
+
+typedef struct _GstGioSrc GstGioSrc;
+typedef struct _GstGioSrcClass GstGioSrcClass;
+
+/**
+ * GstGioSrc:
+ *
+ * Opaque data structure.
+ */
+struct _GstGioSrc
+{
+ GstGioBaseSrc src;
+
+ /*< private >*/
+ GFile *file;
+};
+
+struct _GstGioSrcClass
+{
+ GstGioBaseSrcClass parent_class;
+};
+
+GType gst_gio_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_SRC_H__ */
diff --git a/ext/gio/gstgiostreamsink.c b/ext/gio/gstgiostreamsink.c
new file mode 100644
index 0000000..a76a1e2
--- /dev/null
+++ b/ext/gio/gstgiostreamsink.c
@@ -0,0 +1,192 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-giostreamsink
+ *
+ * This plugin writes incoming data to a custom GIO #GOutputStream.
+ *
+ * It can, for example, be used to write a stream to memory with a
+ * #GMemoryOuputStream or to write to a file with a #GFileOuputStream.
+ *
+ * <refsect2>
+ * <title>Example code</title>
+ * <para>
+ * The following example writes the received data to a #GMemoryOutputStream.
+ * |[
+
+#include &lt;gst/gst.h&gt;
+#include &lt;gio/gio.h&gt;
+
+...
+
+GstElement *sink;
+GMemoryOuputStream *stream;
+// out_data will contain the received data
+guint8 *out_data;
+
+...
+
+stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (NULL, 0,
+ (GReallocFunc) g_realloc, (GDestroyNotify) g_free));
+sink = gst_element_factory_make ("giostreamsink", "sink");
+g_object_set (G_OBJECT (sink), "stream", stream, NULL);
+
+...
+
+// after processing get the written data
+out_data = g_memory_ouput_stream_get_data (G_MEMORY_OUTPUT_STREAM (stream));
+
+...
+
+ * ]|
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiostreamsink.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_stream_sink_debug);
+#define GST_CAT_DEFAULT gst_gio_stream_sink_debug
+
+/* Filter signals and args */
+enum
+{
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_STREAM
+};
+
+#define gst_gio_stream_sink_parent_class parent_class
+G_DEFINE_TYPE (GstGioStreamSink, gst_gio_stream_sink, GST_TYPE_GIO_BASE_SINK);
+
+static void gst_gio_stream_sink_finalize (GObject * object);
+static void gst_gio_stream_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_gio_stream_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static GOutputStream *gst_gio_stream_sink_get_stream (GstGioBaseSink * bsink);
+
+static void
+gst_gio_stream_sink_class_init (GstGioStreamSinkClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstGioBaseSinkClass *ggbsink_class = (GstGioBaseSinkClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_stream_sink_debug, "gio_stream_sink", 0,
+ "GIO stream sink");
+
+ gobject_class->finalize = gst_gio_stream_sink_finalize;
+ gobject_class->set_property = gst_gio_stream_sink_set_property;
+ gobject_class->get_property = gst_gio_stream_sink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_STREAM,
+ g_param_spec_object ("stream", "Stream", "Stream to write to",
+ G_TYPE_OUTPUT_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class, "GIO stream sink",
+ "Sink",
+ "Write to any GIO stream",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ ggbsink_class->get_stream =
+ GST_DEBUG_FUNCPTR (gst_gio_stream_sink_get_stream);
+}
+
+static void
+gst_gio_stream_sink_init (GstGioStreamSink * sink)
+{
+}
+
+static void
+gst_gio_stream_sink_finalize (GObject * object)
+{
+ GstGioStreamSink *sink = GST_GIO_STREAM_SINK (object);
+
+ if (sink->stream) {
+ g_object_unref (sink->stream);
+ sink->stream = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_gio_stream_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstGioStreamSink *sink = GST_GIO_STREAM_SINK (object);
+
+ switch (prop_id) {
+ case PROP_STREAM:{
+ GObject *stream;
+
+ if (GST_STATE (sink) == GST_STATE_PLAYING ||
+ GST_STATE (sink) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new stream not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ stream = g_value_dup_object (value);
+ if (sink->stream)
+ g_object_unref (sink->stream);
+ sink->stream = G_OUTPUT_STREAM (stream);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_gio_stream_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstGioStreamSink *sink = GST_GIO_STREAM_SINK (object);
+
+ switch (prop_id) {
+ case PROP_STREAM:
+ g_value_set_object (value, GST_GIO_BASE_SINK (sink)->stream);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GOutputStream *
+gst_gio_stream_sink_get_stream (GstGioBaseSink * bsink)
+{
+ GstGioStreamSink *sink = GST_GIO_STREAM_SINK (bsink);
+
+ return (sink->stream) ? g_object_ref (sink->stream) : NULL;
+}
diff --git a/ext/gio/gstgiostreamsink.h b/ext/gio/gstgiostreamsink.h
new file mode 100644
index 0000000..5e6206b
--- /dev/null
+++ b/ext/gio/gstgiostreamsink.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_STREAM_SINK_H__
+#define __GST_GIO_STREAM_SINK_H__
+
+#include "gstgio.h"
+#include "gstgiobasesink.h"
+
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_STREAM_SINK \
+ (gst_gio_stream_sink_get_type())
+#define GST_GIO_STREAM_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_STREAM_SINK,GstGioStreamSink))
+#define GST_GIO_STREAM_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_STREAM_SINK,GstGioStreamSinkClass))
+#define GST_IS_GIO_STREAM_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_STREAM_SINK))
+#define GST_IS_GIO_STREAM_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_STREAM_SINK))
+
+typedef struct _GstGioStreamSink GstGioStreamSink;
+typedef struct _GstGioStreamSinkClass GstGioStreamSinkClass;
+
+/**
+ * GstGioStreamSink:
+ *
+ * Opaque data structure.
+ */
+struct _GstGioStreamSink
+{
+ GstGioBaseSink sink;
+
+ /* < private > */
+ GOutputStream *stream;
+};
+
+struct _GstGioStreamSinkClass
+{
+ GstGioBaseSinkClass parent_class;
+};
+
+GType gst_gio_stream_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_STREAM_SINK_H__ */
diff --git a/ext/gio/gstgiostreamsrc.c b/ext/gio/gstgiostreamsrc.c
new file mode 100644
index 0000000..600f347
--- /dev/null
+++ b/ext/gio/gstgiostreamsrc.c
@@ -0,0 +1,186 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-giostreamsrc
+ *
+ * This plugin reads data from a custom GIO #GInputStream.
+ *
+ * It can, for example, be used to read data from memory with a
+ * #GMemoryInputStream or to read from a file with a
+ * #GFileInputStream.
+ *
+ * <refsect2>
+ * <title>Example code</title>
+ * <para>
+ * The following example reads data from a #GMemoryInputStream.
+ * |[
+
+#include &lt;gst/gst.h&gt;
+#include &lt;gio/gio.h&gt;
+
+...
+
+GstElement *src;
+GMemoryInputStream *stream;
+// in_data will contain the data to send
+guint8 *in_data;
+gint i;
+
+...
+in_data = g_new (guint8, 512);
+for (i = 0; i < 512; i++)
+ in_data[i] = i % 256;
+
+stream = G_MEMORY_INPUT_STREAM (g_memory_input_stream_new_from_data (in_data, 512,
+ (GDestroyNotify) g_free));
+src = gst_element_factory_make ("giostreamsrc", "src");
+g_object_set (G_OBJECT (src), "stream", stream, NULL);
+
+...
+
+ * ]|
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstgiostreamsrc.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_gio_stream_src_debug);
+#define GST_CAT_DEFAULT gst_gio_stream_src_debug
+
+enum
+{
+ PROP_0,
+ PROP_STREAM
+};
+
+#define gst_gio_stream_src_parent_class parent_class
+G_DEFINE_TYPE (GstGioStreamSrc, gst_gio_stream_src, GST_TYPE_GIO_BASE_SRC);
+
+static void gst_gio_stream_src_finalize (GObject * object);
+static void gst_gio_stream_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_gio_stream_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static GInputStream *gst_gio_stream_src_get_stream (GstGioBaseSrc * bsrc);
+
+static void
+gst_gio_stream_src_class_init (GstGioStreamSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstGioBaseSrcClass *gstgiobasesrc_class = (GstGioBaseSrcClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_gio_stream_src_debug, "gio_stream_src", 0,
+ "GIO source");
+
+ gobject_class->finalize = gst_gio_stream_src_finalize;
+ gobject_class->set_property = gst_gio_stream_src_set_property;
+ gobject_class->get_property = gst_gio_stream_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_STREAM,
+ g_param_spec_object ("stream", "Stream", "Stream to read from",
+ G_TYPE_INPUT_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class, "GIO stream source",
+ "Source",
+ "Read from any GIO stream",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstgiobasesrc_class->get_stream =
+ GST_DEBUG_FUNCPTR (gst_gio_stream_src_get_stream);
+}
+
+static void
+gst_gio_stream_src_init (GstGioStreamSrc * src)
+{
+}
+
+static void
+gst_gio_stream_src_finalize (GObject * object)
+{
+ GstGioStreamSrc *src = GST_GIO_STREAM_SRC (object);
+
+ if (src->stream) {
+ g_object_unref (src->stream);
+ src->stream = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_gio_stream_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstGioStreamSrc *src = GST_GIO_STREAM_SRC (object);
+
+ switch (prop_id) {
+ case PROP_STREAM:{
+ GObject *stream;
+
+ if (GST_STATE (src) == GST_STATE_PLAYING ||
+ GST_STATE (src) == GST_STATE_PAUSED) {
+ GST_WARNING
+ ("Setting a new stream not supported in PLAYING or PAUSED state");
+ break;
+ }
+
+ stream = g_value_dup_object (value);
+ if (src->stream)
+ g_object_unref (src->stream);
+ src->stream = G_INPUT_STREAM (stream);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_gio_stream_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstGioStreamSrc *src = GST_GIO_STREAM_SRC (object);
+
+ switch (prop_id) {
+ case PROP_STREAM:
+ g_value_set_object (value, src->stream);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GInputStream *
+gst_gio_stream_src_get_stream (GstGioBaseSrc * bsrc)
+{
+ GstGioStreamSrc *src = GST_GIO_STREAM_SRC (bsrc);
+
+ return (src->stream) ? g_object_ref (src->stream) : NULL;
+}
diff --git a/ext/gio/gstgiostreamsrc.h b/ext/gio/gstgiostreamsrc.h
new file mode 100644
index 0000000..975a277
--- /dev/null
+++ b/ext/gio/gstgiostreamsrc.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
+ * Copyright (C) 2007-2009 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_GIO_STREAM_SRC_H__
+#define __GST_GIO_STREAM_SRC_H__
+
+#include "gstgio.h"
+#include "gstgiobasesrc.h"
+
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GIO_STREAM_SRC \
+ (gst_gio_stream_src_get_type())
+#define GST_GIO_STREAM_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GIO_STREAM_SRC,GstGioStreamSrc))
+#define GST_GIO_STREAM_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GIO_STREAM_SRC,GstGioStreamSrcClass))
+#define GST_IS_GIO_STREAM_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GIO_STREAM_SRC))
+#define GST_IS_GIO_STREAM_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GIO_STREAM_SRC))
+
+typedef struct _GstGioStreamSrc GstGioStreamSrc;
+typedef struct _GstGioStreamSrcClass GstGioStreamSrcClass;
+
+/**
+ * GstGioStreamSrc:
+ *
+ * Opaque data structure.
+ */
+struct _GstGioStreamSrc
+{
+ GstGioBaseSrc src;
+
+ /* < private > */
+ GInputStream *stream;
+};
+
+struct _GstGioStreamSrcClass
+{
+ GstGioBaseSrcClass parent_class;
+};
+
+GType gst_gio_stream_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GIO_STREAM_SRC_H__ */
diff --git a/ext/libvisual/Makefile.am b/ext/libvisual/Makefile.am
new file mode 100644
index 0000000..27431e5
--- /dev/null
+++ b/ext/libvisual/Makefile.am
@@ -0,0 +1,10 @@
+plugin_LTLIBRARIES = libgstlibvisual.la
+
+libgstlibvisual_la_SOURCES = visual.c
+libgstlibvisual_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBVISUAL_CFLAGS)
+libgstlibvisual_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(LIBVISUAL_LIBS)
+libgstlibvisual_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstlibvisual_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/ext/libvisual/Makefile.in b/ext/libvisual/Makefile.in
new file mode 100644
index 0000000..13b96b8
--- /dev/null
+++ b/ext/libvisual/Makefile.in
@@ -0,0 +1,754 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/libvisual
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstlibvisual_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstlibvisual_la_OBJECTS = libgstlibvisual_la-visual.lo
+libgstlibvisual_la_OBJECTS = $(am_libgstlibvisual_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstlibvisual_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstlibvisual_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstlibvisual_la_CFLAGS) $(CFLAGS) \
+ $(libgstlibvisual_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstlibvisual_la_SOURCES)
+DIST_SOURCES = $(libgstlibvisual_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstlibvisual.la
+libgstlibvisual_la_SOURCES = visual.c
+libgstlibvisual_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBVISUAL_CFLAGS)
+libgstlibvisual_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(LIBVISUAL_LIBS)
+
+libgstlibvisual_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstlibvisual_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 ext/libvisual/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/libvisual/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
+libgstlibvisual.la: $(libgstlibvisual_la_OBJECTS) $(libgstlibvisual_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstlibvisual_la_LINK) -rpath $(plugindir) $(libgstlibvisual_la_OBJECTS) $(libgstlibvisual_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlibvisual_la-visual.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstlibvisual_la-visual.lo: visual.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlibvisual_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlibvisual_la_CFLAGS) $(CFLAGS) -MT libgstlibvisual_la-visual.lo -MD -MP -MF $(DEPDIR)/libgstlibvisual_la-visual.Tpo -c -o libgstlibvisual_la-visual.lo `test -f 'visual.c' || echo '$(srcdir)/'`visual.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlibvisual_la-visual.Tpo $(DEPDIR)/libgstlibvisual_la-visual.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='visual.c' object='libgstlibvisual_la-visual.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlibvisual_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlibvisual_la_CFLAGS) $(CFLAGS) -c -o libgstlibvisual_la-visual.lo `test -f 'visual.c' || echo '$(srcdir)/'`visual.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/libvisual/visual.c b/ext/libvisual/visual.c
new file mode 100644
index 0000000..14c0e96
--- /dev/null
+++ b/ext/libvisual/visual.c
@@ -0,0 +1,1104 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+#include <gst/video/video.h>
+#include <gst/audio/audio.h>
+#include <libvisual/libvisual.h>
+
+#define GST_TYPE_VISUAL (gst_visual_get_type())
+#define GST_IS_VISUAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VISUAL))
+#define GST_VISUAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VISUAL,GstVisual))
+#define GST_IS_VISUAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VISUAL))
+#define GST_VISUAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VISUAL,GstVisualClass))
+#define GST_VISUAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VISUAL, GstVisualClass))
+
+typedef struct _GstVisual GstVisual;
+typedef struct _GstVisualClass GstVisualClass;
+
+GST_DEBUG_CATEGORY_STATIC (libvisual_debug);
+#define GST_CAT_DEFAULT (libvisual_debug)
+
+/* amounf of samples before we can feed libvisual */
+#define VISUAL_SAMPLES 512
+
+#define DEFAULT_WIDTH 320
+#define DEFAULT_HEIGHT 240
+#define DEFAULT_FPS_N 25
+#define DEFAULT_FPS_D 1
+
+struct _GstVisual
+{
+ GstElement element;
+
+ /* pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+ GstSegment segment;
+
+ /* libvisual stuff */
+ VisAudio *audio;
+ VisVideo *video;
+ VisActor *actor;
+
+ /* audio/video state */
+ GstAudioInfo info;
+
+ /* framerate numerator & denominator */
+ gint fps_n;
+ gint fps_d;
+ gint width;
+ gint height;
+ GstClockTime duration;
+ guint outsize;
+ GstBufferPool *pool;
+
+ /* samples per frame based on caps */
+ guint spf;
+
+ /* state stuff */
+ GstAdapter *adapter;
+ guint count;
+
+ /* QoS stuff *//* with LOCK */
+ gdouble proportion;
+ GstClockTime earliest_time;
+};
+
+struct _GstVisualClass
+{
+ GstElementClass parent_class;
+
+ VisPluginRef *plugin;
+};
+
+GType gst_visual_get_type (void);
+
+
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (" { "
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ "\"xRGB\", " "\"RGB\", "
+#else
+ "\"BGRx\", " "\"BGR\", "
+#endif
+ "\"RGB16\" } "))
+ );
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_NE (S16) ", "
+ "channels = (int) { 1, 2 }, "
+#if defined(VISUAL_API_VERSION) && VISUAL_API_VERSION >= 4000 && VISUAL_API_VERSION < 5000
+ "rate = (int) { 8000, 11250, 22500, 32000, 44100, 48000, 96000 }"
+#else
+ "rate = (int) [ 1000, MAX ]"
+#endif
+ )
+ );
+
+
+static void gst_visual_class_init (gpointer g_class, gpointer class_data);
+static void gst_visual_init (GstVisual * visual);
+static void gst_visual_finalize (GObject * object);
+
+static GstStateChangeReturn gst_visual_change_state (GstElement * element,
+ GstStateChange transition);
+static GstFlowReturn gst_visual_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_visual_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_visual_src_event (GstPad * pad, GstEvent * event);
+
+static gboolean gst_visual_src_query (GstPad * pad, GstQuery * query);
+
+static gboolean gst_visual_sink_setcaps (GstPad * pad, GstCaps * caps);
+static GstCaps *gst_visual_getcaps (GstPad * pad, GstCaps * filter);
+static void libvisual_log_handler (const char *message, const char *funcname,
+ void *priv);
+
+static GstElementClass *parent_class = NULL;
+
+GType
+gst_visual_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo info = {
+ sizeof (GstVisualClass),
+ NULL,
+ NULL,
+ gst_visual_class_init,
+ NULL,
+ NULL,
+ sizeof (GstVisual),
+ 0,
+ (GInstanceInitFunc) gst_visual_init,
+ };
+
+ type = g_type_register_static (GST_TYPE_ELEMENT, "GstVisual", &info, 0);
+ }
+ return type;
+}
+
+static void
+libvisual_log_handler (const char *message, const char *funcname, void *priv)
+{
+ GST_CAT_LEVEL_LOG (libvisual_debug, (GstDebugLevel) (priv), NULL, "%s - %s",
+ funcname, message);
+}
+
+static void
+gst_visual_class_init (gpointer g_class, gpointer class_data)
+{
+ GstVisualClass *klass = GST_VISUAL_CLASS (g_class);
+ GstElementClass *element = GST_ELEMENT_CLASS (g_class);
+ GObjectClass *object = G_OBJECT_CLASS (g_class);
+
+ klass->plugin = class_data;
+
+ element->change_state = gst_visual_change_state;
+
+ if (class_data == NULL) {
+ parent_class = g_type_class_peek_parent (g_class);
+ } else {
+ char *longname = g_strdup_printf ("libvisual %s plugin v.%s",
+ klass->plugin->info->name, klass->plugin->info->version);
+
+ /* FIXME: improve to only register what plugin supports? */
+ gst_element_class_add_pad_template (element,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (element,
+ gst_static_pad_template_get (&sink_template));
+
+ gst_element_class_set_details_simple (element,
+ longname, "Visualization",
+ klass->plugin->info->about, "Benjamin Otte <otte@gnome.org>");
+
+ g_free (longname);
+ }
+
+ object->finalize = gst_visual_finalize;
+}
+
+static void
+gst_visual_init (GstVisual * visual)
+{
+ /* create the sink and src pads */
+ visual->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
+ gst_pad_set_chain_function (visual->sinkpad, gst_visual_chain);
+ gst_pad_set_event_function (visual->sinkpad, gst_visual_sink_event);
+ gst_element_add_pad (GST_ELEMENT (visual), visual->sinkpad);
+
+ visual->srcpad = gst_pad_new_from_static_template (&src_template, "src");
+ gst_pad_set_getcaps_function (visual->srcpad, gst_visual_getcaps);
+ gst_pad_set_event_function (visual->srcpad, gst_visual_src_event);
+ gst_pad_set_query_function (visual->srcpad, gst_visual_src_query);
+ gst_element_add_pad (GST_ELEMENT (visual), visual->srcpad);
+
+ visual->adapter = gst_adapter_new ();
+}
+
+static void
+gst_visual_clear_actors (GstVisual * visual)
+{
+ if (visual->actor) {
+ visual_object_unref (VISUAL_OBJECT (visual->actor));
+ visual->actor = NULL;
+ }
+ if (visual->video) {
+ visual_object_unref (VISUAL_OBJECT (visual->video));
+ visual->video = NULL;
+ }
+ if (visual->audio) {
+ visual_object_unref (VISUAL_OBJECT (visual->audio));
+ visual->audio = NULL;
+ }
+}
+
+static void
+gst_visual_finalize (GObject * object)
+{
+ GstVisual *visual = GST_VISUAL (object);
+
+ g_object_unref (visual->adapter);
+ if (visual->pool)
+ gst_object_unref (visual->pool);
+ gst_visual_clear_actors (visual);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_visual_reset (GstVisual * visual)
+{
+ gst_adapter_clear (visual->adapter);
+ gst_segment_init (&visual->segment, GST_FORMAT_UNDEFINED);
+
+ GST_OBJECT_LOCK (visual);
+ visual->proportion = 1.0;
+ visual->earliest_time = -1;
+ GST_OBJECT_UNLOCK (visual);
+}
+
+static GstCaps *
+gst_visual_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstCaps *ret;
+ GstVisual *visual = GST_VISUAL (gst_pad_get_parent (pad));
+ int depths;
+
+ if (!visual->actor) {
+ ret = gst_pad_get_pad_template_caps (visual->srcpad);
+ goto beach;
+ }
+
+ ret = gst_caps_new_empty ();
+ depths = visual_actor_get_supported_depth (visual->actor);
+ if (depths < 0) {
+ /* FIXME: set an error */
+ goto beach;
+ }
+ if (depths == VISUAL_VIDEO_DEPTH_GL) {
+ /* We can't handle GL only plugins */
+ goto beach;
+ }
+
+ GST_DEBUG_OBJECT (visual, "libvisual plugin supports depths %u (0x%04x)",
+ depths, depths);
+ /* if (depths & VISUAL_VIDEO_DEPTH_32BIT) Always supports 32bit output */
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("xRGB")));
+#else
+ gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx")));
+#endif
+
+ if (depths & VISUAL_VIDEO_DEPTH_24BIT) {
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGB")));
+#else
+ gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR")));
+#endif
+ }
+ if (depths & VISUAL_VIDEO_DEPTH_16BIT) {
+ gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGB16")));
+ }
+
+beach:
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (ret);
+ ret = intersection;
+ }
+
+ GST_DEBUG_OBJECT (visual, "returning caps %" GST_PTR_FORMAT, ret);
+ gst_object_unref (visual);
+ return ret;
+}
+
+static gboolean
+gst_visual_src_setcaps (GstVisual * visual, GstCaps * caps)
+{
+ gboolean res;
+ GstStructure *structure;
+ gint depth, pitch, rate;
+ const gchar *fmt;
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ GST_DEBUG_OBJECT (visual, "src pad got caps %" GST_PTR_FORMAT, caps);
+
+ if (!gst_structure_get_int (structure, "width", &visual->width))
+ goto error;
+ if (!gst_structure_get_int (structure, "height", &visual->height))
+ goto error;
+ if (!(fmt = gst_structure_get_string (structure, "format")))
+ goto error;
+ if (!gst_structure_get_fraction (structure, "framerate", &visual->fps_n,
+ &visual->fps_d))
+ goto error;
+
+ if (!strcmp (fmt, "BGR") || !strcmp (fmt, "RGB"))
+ depth = 24;
+ else if (!strcmp (fmt, "BGRx") || !strcmp (fmt, "xRGB"))
+ depth = 32;
+ else
+ depth = 16;
+
+ visual_video_set_depth (visual->video,
+ visual_video_depth_enum_from_value (depth));
+ visual_video_set_dimension (visual->video, visual->width, visual->height);
+ pitch = GST_ROUND_UP_4 (visual->width * visual->video->bpp);
+ visual_video_set_pitch (visual->video, pitch);
+ visual_actor_video_negotiate (visual->actor, 0, FALSE, FALSE);
+
+ rate = GST_AUDIO_INFO_RATE (&visual->info);
+
+ /* precalc some values */
+ visual->outsize = visual->video->height * pitch;
+ visual->spf = gst_util_uint64_scale_int (rate, visual->fps_d, visual->fps_n);
+ visual->duration =
+ gst_util_uint64_scale_int (GST_SECOND, visual->fps_d, visual->fps_n);
+
+ res = gst_pad_push_event (visual->srcpad, gst_event_new_caps (caps));
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (visual, "error parsing caps");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_visual_sink_setcaps (GstPad * pad, GstCaps * caps)
+{
+ GstVisual *visual = GST_VISUAL (gst_pad_get_parent (pad));
+ GstAudioInfo info;
+ gint rate;
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ visual->info = info;
+
+ rate = GST_AUDIO_INFO_RATE (&info);
+
+ /* this is how many samples we need to fill one frame at the requested
+ * framerate. */
+ if (visual->fps_n != 0) {
+ visual->spf =
+ gst_util_uint64_scale_int (rate, visual->fps_d, visual->fps_n);
+ }
+
+ gst_object_unref (visual);
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_caps:
+ {
+ GST_ERROR_OBJECT (visual, "invalid caps received");
+ gst_object_unref (visual);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_vis_src_negotiate (GstVisual * visual)
+{
+ GstCaps *othercaps, *target;
+ GstStructure *structure;
+ GstCaps *caps;
+ GstQuery *query;
+ GstBufferPool *pool = NULL;
+ guint size, min, max, prefix, alignment;
+
+ caps = gst_pad_get_caps (visual->srcpad, NULL);
+
+ /* see what the peer can do */
+ othercaps = gst_pad_peer_get_caps (visual->srcpad, caps);
+ if (othercaps) {
+ target = othercaps;
+ gst_caps_unref (caps);
+
+ if (gst_caps_is_empty (target))
+ goto no_format;
+
+ target = gst_caps_make_writable (target);
+ gst_caps_truncate (target);
+ } else {
+ /* need a copy, we'll be modifying it when fixating */
+ target = gst_caps_copy (caps);
+ gst_caps_unref (caps);
+ }
+ GST_DEBUG_OBJECT (visual, "before fixate caps %" GST_PTR_FORMAT, target);
+
+ /* fixate in case something is not fixed. This does nothing if the value is
+ * already fixed. For video we always try to fixate to something like
+ * 320x240x25 by convention. */
+ 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_fixate_caps (visual->srcpad, target);
+
+ GST_DEBUG_OBJECT (visual, "after fixate caps %" GST_PTR_FORMAT, target);
+
+ gst_visual_src_setcaps (visual, target);
+
+ /* try to get a bufferpool now */
+ /* find a pool for the negotiated caps now */
+ query = gst_query_new_allocation (target, TRUE);
+
+ if (gst_pad_peer_query (visual->srcpad, query)) {
+ /* we got configuration from our peer, parse them */
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+ } else {
+ size = visual->outsize;
+ min = max = 0;
+ prefix = 0;
+ alignment = 0;
+ }
+
+ if (pool == NULL) {
+ GstStructure *config;
+
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_buffer_pool_new ();
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, target, size, min, max, prefix,
+ alignment);
+ gst_buffer_pool_set_config (pool, config);
+ }
+
+ if (visual->pool)
+ gst_object_unref (visual->pool);
+ visual->pool = pool;
+
+ /* and activate */
+ gst_buffer_pool_set_active (pool, TRUE);
+
+ gst_caps_unref (target);
+
+ return TRUE;
+
+ /* ERRORS */
+no_format:
+ {
+ GST_ELEMENT_ERROR (visual, STREAM, FORMAT, (NULL),
+ ("could not negotiate output format"));
+ gst_caps_unref (target);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_visual_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstVisual *visual;
+ gboolean res;
+
+ visual = GST_VISUAL (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ res = gst_pad_push_event (visual->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ /* reset QoS and adapter. */
+ gst_visual_reset (visual);
+ res = gst_pad_push_event (visual->srcpad, event);
+ break;
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = gst_visual_sink_setcaps (pad, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ /* 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_copy_segment (event, &visual->segment);
+
+ /* and forward */
+ res = gst_pad_push_event (visual->srcpad, event);
+ break;
+ }
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (visual);
+ return res;
+}
+
+static gboolean
+gst_visual_src_event (GstPad * pad, GstEvent * event)
+{
+ GstVisual *visual;
+ gboolean res;
+
+ visual = GST_VISUAL (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, NULL, &proportion, &diff, &timestamp);
+
+ /* save stuff for the _chain function */
+ GST_OBJECT_LOCK (visual);
+ visual->proportion = proportion;
+ if (diff >= 0)
+ /* we're late, this is a good estimate for next displayable
+ * frame (see part-qos.txt) */
+ visual->earliest_time = timestamp + 2 * diff + visual->duration;
+ else
+ visual->earliest_time = timestamp + diff;
+
+ GST_OBJECT_UNLOCK (visual);
+
+ res = gst_pad_push_event (visual->sinkpad, event);
+ break;
+ }
+ case GST_EVENT_RECONFIGURE:
+ /* dont't forward */
+ gst_event_unref (event);
+ res = TRUE;
+ break;
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (visual);
+ return res;
+}
+
+static gboolean
+gst_visual_src_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res;
+ GstVisual *visual;
+
+ visual = GST_VISUAL (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 (visual->sinkpad, query))) {
+ gst_query_parse_latency (query, &us_live, &min_latency, &max_latency);
+
+ GST_DEBUG_OBJECT (visual, "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 (VISUAL_SAMPLES, visual->spf);
+ our_latency =
+ gst_util_uint64_scale_int (max_samples, GST_SECOND,
+ GST_AUDIO_INFO_RATE (&visual->info));
+
+ GST_DEBUG_OBJECT (visual, "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 (visual, "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 (visual->sinkpad, query);
+ break;
+ }
+
+ gst_object_unref (visual);
+
+ return res;
+}
+
+/* Make sure we are negotiated */
+static GstFlowReturn
+ensure_negotiated (GstVisual * visual)
+{
+ gboolean reconfigure;
+
+ GST_OBJECT_LOCK (visual->srcpad);
+ reconfigure = GST_PAD_NEEDS_RECONFIGURE (visual->srcpad);
+ GST_OBJECT_FLAG_UNSET (visual->srcpad, GST_PAD_NEED_RECONFIGURE);
+ GST_OBJECT_UNLOCK (visual->srcpad);
+
+ /* we don't know an output format yet, pick one */
+ if (reconfigure || !gst_pad_has_current_caps (visual->srcpad)) {
+ if (!gst_vis_src_negotiate (visual))
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_visual_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstBuffer *outbuf = NULL;
+ guint i;
+ GstVisual *visual = GST_VISUAL (gst_pad_get_parent (pad));
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint avail;
+ gint bpf, rate, channels;
+
+ GST_DEBUG_OBJECT (visual, "chain function called");
+
+ /* Make sure have an output format */
+ ret = ensure_negotiated (visual);
+ if (ret != GST_FLOW_OK) {
+ gst_buffer_unref (buffer);
+ goto beach;
+ }
+
+ /* resync on DISCONT */
+ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
+ gst_adapter_clear (visual->adapter);
+ }
+
+ rate = GST_AUDIO_INFO_RATE (&visual->info);
+ bpf = GST_AUDIO_INFO_BPF (&visual->info);
+ channels = GST_AUDIO_INFO_CHANNELS (&visual->info);
+
+ GST_DEBUG_OBJECT (visual,
+ "Input buffer has %d samples, time=%" G_GUINT64_FORMAT,
+ gst_buffer_get_size (buffer) / bpf, GST_BUFFER_TIMESTAMP (buffer));
+
+ gst_adapter_push (visual->adapter, buffer);
+
+ while (TRUE) {
+ gboolean need_skip;
+ const guint16 *data;
+ guint64 dist, timestamp;
+ guint8 *outdata;
+ gsize outsize;
+
+ GST_DEBUG_OBJECT (visual, "processing buffer");
+
+ avail = gst_adapter_available (visual->adapter);
+ GST_DEBUG_OBJECT (visual, "avail now %u", avail);
+
+ /* we need at least VISUAL_SAMPLES samples */
+ if (avail < VISUAL_SAMPLES * bpf)
+ break;
+
+ /* we need at least enough samples to make one frame */
+ if (avail < visual->spf * bpf)
+ break;
+
+ /* get timestamp of the current adapter byte */
+ timestamp = gst_adapter_prev_timestamp (visual->adapter, &dist);
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ /* convert bytes to time */
+ dist /= bpf;
+ timestamp += gst_util_uint64_scale_int (dist, GST_SECOND, rate);
+ }
+
+ if (timestamp != -1) {
+ gint64 qostime;
+
+ /* QoS is done on running time */
+ qostime = gst_segment_to_running_time (&visual->segment, GST_FORMAT_TIME,
+ timestamp);
+ qostime += visual->duration;
+
+ GST_OBJECT_LOCK (visual);
+ /* check for QoS, don't compute buffers that are known to be late */
+ need_skip = visual->earliest_time != -1 &&
+ qostime <= visual->earliest_time;
+ GST_OBJECT_UNLOCK (visual);
+
+ if (need_skip) {
+ GST_WARNING_OBJECT (visual,
+ "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (qostime), GST_TIME_ARGS (visual->earliest_time));
+ goto skip;
+ }
+ }
+
+ /* Read VISUAL_SAMPLES samples per channel */
+ data =
+ (const guint16 *) gst_adapter_map (visual->adapter,
+ VISUAL_SAMPLES * bpf);
+
+#if defined(VISUAL_API_VERSION) && VISUAL_API_VERSION >= 4000 && VISUAL_API_VERSION < 5000
+ {
+ VisBuffer *lbuf, *rbuf;
+ guint16 ldata[VISUAL_SAMPLES], rdata[VISUAL_SAMPLES];
+ VisAudioSampleRateType vrate;
+
+ lbuf = visual_buffer_new_with_buffer (ldata, sizeof (ldata), NULL);
+ rbuf = visual_buffer_new_with_buffer (rdata, sizeof (rdata), NULL);
+
+ if (channels == 2) {
+ for (i = 0; i < VISUAL_SAMPLES; i++) {
+ ldata[i] = *data++;
+ rdata[i] = *data++;
+ }
+ } else {
+ for (i = 0; i < VISUAL_SAMPLES; i++) {
+ ldata[i] = *data;
+ rdata[i] = *data++;
+ }
+ }
+
+ switch (rate) {
+ case 8000:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_8000;
+ break;
+ case 11250:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_11250;
+ break;
+ case 22500:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_22500;
+ break;
+ case 32000:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_32000;
+ break;
+ case 44100:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_44100;
+ break;
+ case 48000:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_48000;
+ break;
+ case 96000:
+ vrate = VISUAL_AUDIO_SAMPLE_RATE_96000;
+ break;
+ default:
+ visual_object_unref (VISUAL_OBJECT (lbuf));
+ visual_object_unref (VISUAL_OBJECT (rbuf));
+ GST_ERROR_OBJECT (visual, "unsupported rate %d", rate);
+ ret = GST_FLOW_ERROR;
+ goto beach;
+ break;
+ }
+
+ visual_audio_samplepool_input_channel (visual->audio->samplepool,
+ lbuf,
+ vrate, VISUAL_AUDIO_SAMPLE_FORMAT_S16,
+ (char *) VISUAL_AUDIO_CHANNEL_LEFT);
+ visual_audio_samplepool_input_channel (visual->audio->samplepool, rbuf,
+ vrate, VISUAL_AUDIO_SAMPLE_FORMAT_S16,
+ (char *) VISUAL_AUDIO_CHANNEL_RIGHT);
+
+ visual_object_unref (VISUAL_OBJECT (lbuf));
+ visual_object_unref (VISUAL_OBJECT (rbuf));
+
+ }
+#else
+ if (visual->channels == 2) {
+ for (i = 0; i < VISUAL_SAMPLES; i++) {
+ visual->audio->plugpcm[0][i] = *data++;
+ visual->audio->plugpcm[1][i] = *data++;
+ }
+ } else {
+ for (i = 0; i < VISUAL_SAMPLES; i++) {
+ visual->audio->plugpcm[0][i] = *data;
+ visual->audio->plugpcm[1][i] = *data++;
+ }
+ }
+#endif
+
+ /* 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) {
+ GST_DEBUG_OBJECT (visual, "allocating output buffer");
+ ret = gst_buffer_pool_acquire_buffer (visual->pool, &outbuf, NULL);
+ if (ret != GST_FLOW_OK) {
+ gst_adapter_unmap (visual->adapter, 0);
+ goto beach;
+ }
+ }
+ outdata = gst_buffer_map (outbuf, &outsize, NULL, GST_MAP_WRITE);
+ visual_video_set_buffer (visual->video, outdata);
+ visual_audio_analyze (visual->audio);
+ visual_actor_run (visual->actor, visual->audio);
+ visual_video_set_buffer (visual->video, NULL);
+ gst_buffer_unmap (outbuf, outdata, outsize);
+ GST_DEBUG_OBJECT (visual, "rendered one frame");
+
+ gst_adapter_unmap (visual->adapter, 0);
+
+ GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
+ GST_BUFFER_DURATION (outbuf) = visual->duration;
+
+ ret = gst_pad_push (visual->srcpad, outbuf);
+ outbuf = NULL;
+
+ skip:
+ GST_DEBUG_OBJECT (visual, "finished frame, flushing %u samples from input",
+ visual->spf);
+
+ /* Flush out the number of samples per frame */
+ gst_adapter_flush (visual->adapter, visual->spf * bpf);
+
+ /* quit the loop if something was wrong */
+ if (ret != GST_FLOW_OK)
+ break;
+ }
+
+beach:
+
+ if (outbuf != NULL)
+ gst_buffer_unref (outbuf);
+
+ gst_object_unref (visual);
+
+ return ret;
+}
+
+static GstStateChangeReturn
+gst_visual_change_state (GstElement * element, GstStateChange transition)
+{
+ GstVisual *visual = GST_VISUAL (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ visual->actor =
+ visual_actor_new (GST_VISUAL_GET_CLASS (visual)->plugin->info->
+ plugname);
+ visual->video = visual_video_new ();
+ visual->audio = visual_audio_new ();
+ /* can't have a play without actors */
+ if (!visual->actor || !visual->video)
+ goto no_actors;
+
+ if (visual_actor_realize (visual->actor) != 0)
+ goto no_realize;
+
+ visual_actor_set_video (visual->actor, visual->video);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ gst_visual_reset (visual);
+ 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 (visual->pool) {
+ gst_buffer_pool_set_active (visual->pool, FALSE);
+ gst_object_unref (visual->pool);
+ visual->pool = NULL;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_visual_clear_actors (visual);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERRORS */
+no_actors:
+ {
+ GST_ELEMENT_ERROR (visual, LIBRARY, INIT, (NULL),
+ ("could not create actors"));
+ gst_visual_clear_actors (visual);
+ return GST_STATE_CHANGE_FAILURE;
+ }
+no_realize:
+ {
+ GST_ELEMENT_ERROR (visual, LIBRARY, INIT, (NULL),
+ ("could not realize actor"));
+ gst_visual_clear_actors (visual);
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+static void
+make_valid_name (char *name)
+{
+ /*
+ * Replace invalid chars with _ in the type name
+ */
+ static const gchar extra_chars[] = "-_+";
+ gchar *p = name;
+
+ for (; *p; p++) {
+ int valid = ((p[0] >= 'A' && p[0] <= 'Z') ||
+ (p[0] >= 'a' && p[0] <= 'z') ||
+ (p[0] >= '0' && p[0] <= '9') || strchr (extra_chars, p[0]));
+ if (!valid)
+ *p = '_';
+ }
+}
+
+static gboolean
+gst_visual_actor_plugin_is_gl (VisObject * plugin, const gchar * name)
+{
+ gboolean is_gl;
+ gint depth;
+
+#if !defined(VISUAL_API_VERSION)
+
+ depth = VISUAL_PLUGIN_ACTOR (plugin)->depth;
+ is_gl = (depth == VISUAL_VIDEO_DEPTH_GL);
+
+#elif VISUAL_API_VERSION >= 4000 && VISUAL_API_VERSION < 5000
+
+ depth = VISUAL_ACTOR_PLUGIN (plugin)->vidoptions.depth;
+ /* FIXME: how to figure this out correctly in 0.4? */
+ is_gl = (depth & VISUAL_VIDEO_DEPTH_GL) == VISUAL_VIDEO_DEPTH_GL;
+
+#else
+# error what libvisual version is this?
+#endif
+
+ if (!is_gl) {
+ GST_DEBUG ("plugin %s is not a GL plugin (%d), registering", name, depth);
+ } else {
+ GST_DEBUG ("plugin %s is a GL plugin (%d), ignoring", name, depth);
+ }
+
+ return is_gl;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ guint i, count;
+ VisList *list;
+
+ GST_DEBUG_CATEGORY_INIT (libvisual_debug, "libvisual", 0,
+ "libvisual audio visualisations");
+
+#ifdef LIBVISUAL_PLUGINSBASEDIR
+ gst_plugin_add_dependency_simple (plugin, "HOME/.libvisual/actor",
+ LIBVISUAL_PLUGINSBASEDIR "/actor", NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE);
+#endif
+
+ visual_log_set_verboseness (VISUAL_LOG_VERBOSENESS_LOW);
+ visual_log_set_info_handler (libvisual_log_handler, (void *) GST_LEVEL_INFO);
+ visual_log_set_warning_handler (libvisual_log_handler,
+ (void *) GST_LEVEL_WARNING);
+ visual_log_set_critical_handler (libvisual_log_handler,
+ (void *) GST_LEVEL_ERROR);
+ visual_log_set_error_handler (libvisual_log_handler,
+ (void *) GST_LEVEL_ERROR);
+
+ if (!visual_is_initialized ())
+ if (visual_init (NULL, NULL) != 0)
+ return FALSE;
+
+ list = visual_actor_get_list ();
+
+#if !defined(VISUAL_API_VERSION)
+ count = visual_list_count (list);
+#elif VISUAL_API_VERSION >= 4000 && VISUAL_API_VERSION < 5000
+ count = visual_collection_size (VISUAL_COLLECTION (list));
+#endif
+
+ for (i = 0; i < count; i++) {
+ VisPluginRef *ref = visual_list_get (list, i);
+ VisPluginData *visplugin = NULL;
+ gboolean skip = FALSE;
+ GType type;
+ gchar *name;
+ GTypeInfo info = {
+ sizeof (GstVisualClass),
+ NULL,
+ NULL,
+ gst_visual_class_init,
+ NULL,
+ ref,
+ sizeof (GstVisual),
+ 0,
+ NULL
+ };
+
+ visplugin = visual_plugin_load (ref);
+
+ if (ref->info->plugname == NULL)
+ continue;
+
+ /* Blacklist some plugins */
+ if (strcmp (ref->info->plugname, "gstreamer") == 0 ||
+ strcmp (ref->info->plugname, "gdkpixbuf") == 0) {
+ skip = TRUE;
+ } else {
+ /* Ignore plugins that only support GL output for now */
+ skip = gst_visual_actor_plugin_is_gl (visplugin->info->plugin,
+ visplugin->info->plugname);
+ }
+
+ visual_plugin_unload (visplugin);
+
+ if (!skip) {
+ name = g_strdup_printf ("GstVisual%s", ref->info->plugname);
+ make_valid_name (name);
+ type = g_type_register_static (GST_TYPE_VISUAL, name, &info, 0);
+ g_free (name);
+
+ name = g_strdup_printf ("libvisual_%s", ref->info->plugname);
+ make_valid_name (name);
+ if (!gst_element_register (plugin, name, GST_RANK_NONE, type)) {
+ g_free (name);
+ return FALSE;
+ }
+ g_free (name);
+ }
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "libvisual",
+ "libvisual visualization plugins",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/ogg/Makefile.am b/ext/ogg/Makefile.am
new file mode 100644
index 0000000..3d23821
--- /dev/null
+++ b/ext/ogg/Makefile.am
@@ -0,0 +1,45 @@
+plugin_LTLIBRARIES = libgstogg.la
+
+libgstogg_la_SOURCES = \
+ gstogg.c \
+ gstoggdemux.c \
+ gstoggmux.c \
+ gstogmparse.c \
+ gstoggaviparse.c \
+ gstoggparse.c \
+ gstoggstream.c \
+ dirac_parse.c \
+ vorbis_parse.c
+
+noinst_HEADERS = \
+ gstogg.h \
+ gstoggdemux.h \
+ gstoggmux.h \
+ gstoggstream.h \
+ dirac_parse.h \
+ vorbis_parse.h
+
+libgstogg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(OGG_CFLAGS)
+libgstogg_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/riff/libgstriff-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(OGG_LIBS)
+libgstogg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstogg_la_LIBTOOLFLAGS = --tag=disable-static
+
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstogg -:SHARED libgstogg \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstogg_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstogg_la_CFLAGS) \
+ -:LDFLAGS $(libgstogg_la_LDFLAGS) \
+ $(libgstogg_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/ext/ogg/Makefile.in b/ext/ogg/Makefile.in
new file mode 100644
index 0000000..5a4904a
--- /dev/null
+++ b/ext/ogg/Makefile.in
@@ -0,0 +1,870 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/ogg
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstogg_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/riff/libgstriff-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstogg_la_OBJECTS = libgstogg_la-gstogg.lo \
+ libgstogg_la-gstoggdemux.lo libgstogg_la-gstoggmux.lo \
+ libgstogg_la-gstogmparse.lo libgstogg_la-gstoggaviparse.lo \
+ libgstogg_la-gstoggparse.lo libgstogg_la-gstoggstream.lo \
+ libgstogg_la-dirac_parse.lo libgstogg_la-vorbis_parse.lo
+libgstogg_la_OBJECTS = $(am_libgstogg_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstogg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstogg_la_CFLAGS) $(CFLAGS) \
+ $(libgstogg_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstogg_la_SOURCES)
+DIST_SOURCES = $(libgstogg_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstogg.la
+libgstogg_la_SOURCES = \
+ gstogg.c \
+ gstoggdemux.c \
+ gstoggmux.c \
+ gstogmparse.c \
+ gstoggaviparse.c \
+ gstoggparse.c \
+ gstoggstream.c \
+ dirac_parse.c \
+ vorbis_parse.c
+
+noinst_HEADERS = \
+ gstogg.h \
+ gstoggdemux.h \
+ gstoggmux.h \
+ gstoggstream.h \
+ dirac_parse.h \
+ vorbis_parse.h
+
+libgstogg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(OGG_CFLAGS)
+libgstogg_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/riff/libgstriff-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(OGG_LIBS)
+
+libgstogg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstogg_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 ext/ogg/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/ogg/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
+libgstogg.la: $(libgstogg_la_OBJECTS) $(libgstogg_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstogg_la_LINK) -rpath $(plugindir) $(libgstogg_la_OBJECTS) $(libgstogg_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-dirac_parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstogg.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstoggaviparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstoggdemux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstoggmux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstoggparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstoggstream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-gstogmparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstogg_la-vorbis_parse.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstogg_la-gstogg.lo: gstogg.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstogg.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstogg.Tpo -c -o libgstogg_la-gstogg.lo `test -f 'gstogg.c' || echo '$(srcdir)/'`gstogg.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstogg.Tpo $(DEPDIR)/libgstogg_la-gstogg.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstogg.c' object='libgstogg_la-gstogg.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstogg.lo `test -f 'gstogg.c' || echo '$(srcdir)/'`gstogg.c
+
+libgstogg_la-gstoggdemux.lo: gstoggdemux.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstoggdemux.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstoggdemux.Tpo -c -o libgstogg_la-gstoggdemux.lo `test -f 'gstoggdemux.c' || echo '$(srcdir)/'`gstoggdemux.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstoggdemux.Tpo $(DEPDIR)/libgstogg_la-gstoggdemux.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoggdemux.c' object='libgstogg_la-gstoggdemux.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstoggdemux.lo `test -f 'gstoggdemux.c' || echo '$(srcdir)/'`gstoggdemux.c
+
+libgstogg_la-gstoggmux.lo: gstoggmux.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstoggmux.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstoggmux.Tpo -c -o libgstogg_la-gstoggmux.lo `test -f 'gstoggmux.c' || echo '$(srcdir)/'`gstoggmux.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstoggmux.Tpo $(DEPDIR)/libgstogg_la-gstoggmux.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoggmux.c' object='libgstogg_la-gstoggmux.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstoggmux.lo `test -f 'gstoggmux.c' || echo '$(srcdir)/'`gstoggmux.c
+
+libgstogg_la-gstogmparse.lo: gstogmparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstogmparse.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstogmparse.Tpo -c -o libgstogg_la-gstogmparse.lo `test -f 'gstogmparse.c' || echo '$(srcdir)/'`gstogmparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstogmparse.Tpo $(DEPDIR)/libgstogg_la-gstogmparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstogmparse.c' object='libgstogg_la-gstogmparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstogmparse.lo `test -f 'gstogmparse.c' || echo '$(srcdir)/'`gstogmparse.c
+
+libgstogg_la-gstoggaviparse.lo: gstoggaviparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstoggaviparse.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstoggaviparse.Tpo -c -o libgstogg_la-gstoggaviparse.lo `test -f 'gstoggaviparse.c' || echo '$(srcdir)/'`gstoggaviparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstoggaviparse.Tpo $(DEPDIR)/libgstogg_la-gstoggaviparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoggaviparse.c' object='libgstogg_la-gstoggaviparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstoggaviparse.lo `test -f 'gstoggaviparse.c' || echo '$(srcdir)/'`gstoggaviparse.c
+
+libgstogg_la-gstoggparse.lo: gstoggparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstoggparse.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstoggparse.Tpo -c -o libgstogg_la-gstoggparse.lo `test -f 'gstoggparse.c' || echo '$(srcdir)/'`gstoggparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstoggparse.Tpo $(DEPDIR)/libgstogg_la-gstoggparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoggparse.c' object='libgstogg_la-gstoggparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstoggparse.lo `test -f 'gstoggparse.c' || echo '$(srcdir)/'`gstoggparse.c
+
+libgstogg_la-gstoggstream.lo: gstoggstream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-gstoggstream.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-gstoggstream.Tpo -c -o libgstogg_la-gstoggstream.lo `test -f 'gstoggstream.c' || echo '$(srcdir)/'`gstoggstream.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-gstoggstream.Tpo $(DEPDIR)/libgstogg_la-gstoggstream.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoggstream.c' object='libgstogg_la-gstoggstream.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-gstoggstream.lo `test -f 'gstoggstream.c' || echo '$(srcdir)/'`gstoggstream.c
+
+libgstogg_la-dirac_parse.lo: dirac_parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-dirac_parse.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-dirac_parse.Tpo -c -o libgstogg_la-dirac_parse.lo `test -f 'dirac_parse.c' || echo '$(srcdir)/'`dirac_parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-dirac_parse.Tpo $(DEPDIR)/libgstogg_la-dirac_parse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dirac_parse.c' object='libgstogg_la-dirac_parse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-dirac_parse.lo `test -f 'dirac_parse.c' || echo '$(srcdir)/'`dirac_parse.c
+
+libgstogg_la-vorbis_parse.lo: vorbis_parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -MT libgstogg_la-vorbis_parse.lo -MD -MP -MF $(DEPDIR)/libgstogg_la-vorbis_parse.Tpo -c -o libgstogg_la-vorbis_parse.lo `test -f 'vorbis_parse.c' || echo '$(srcdir)/'`vorbis_parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstogg_la-vorbis_parse.Tpo $(DEPDIR)/libgstogg_la-vorbis_parse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vorbis_parse.c' object='libgstogg_la-vorbis_parse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstogg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstogg_la_CFLAGS) $(CFLAGS) -c -o libgstogg_la-vorbis_parse.lo `test -f 'vorbis_parse.c' || echo '$(srcdir)/'`vorbis_parse.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstogg -:SHARED libgstogg \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstogg_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstogg_la_CFLAGS) \
+ -:LDFLAGS $(libgstogg_la_LDFLAGS) \
+ $(libgstogg_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/ext/ogg/README b/ext/ogg/README
new file mode 100644
index 0000000..da449e1
--- /dev/null
+++ b/ext/ogg/README
@@ -0,0 +1,366 @@
+This document describes some things to know about the Ogg format, as well
+as implementation details in GStreamer.
+
+INTRODUCTION
+============
+
+ogg and the granulepos
+----------------------
+
+An ogg stream contains pages with a serial number and a granulepos.
+The granulepos is a 64 bit signed integer. It is a value that in some way
+represents a time since the start of the stream.
+The interpretation as such is however both codec-specific and
+stream-specific.
+
+ogg has no notion of time: it only knows about bytes and granulepos values
+on pages.
+
+The granule position is just a number; the only guarantee for a valid ogg
+stream is that within a logical stream, this number never decreases.
+
+While logically a granulepos value can be constructed for every ogg packet,
+the page is marked with only one granulepos value: the granulepos of the
+last packet to end on that page.
+
+theora and the granulepos
+-------------------------
+
+The granulepos in theora is an encoding of the frame number of the last
+key frame ("i frame"), and the number of frames since the last key frame
+("p frame"). The granulepos is constructed as the sum of the first number,
+shifted to the left for granuleshift bits, and the second number:
+granulepos = (pframe << granuleshift) + iframe
+
+(This means that given a framenumber or a timestamp, one cannot generate
+ the one and only granulepos for that page; several granulepos possibilities
+ correspond to this frame number. You also need the last keyframe, as well
+ as the granuleshift.
+ However, given a granulepos, the theora codec can still map that to a
+ unique timestamp and frame number for that theora stream)
+
+ Note: currently theora stores the "presentation time" as the granulepos;
+ ie. a first data page with one packet contains one video frame and
+ will be marked with 0/0. Changing that to be 1/0 (so that it
+ represents the number of decodable frames up to that point, like
+ for Vorbis) is being discussed.
+
+vorbis and granulepos
+---------------------
+
+In Vorbis, the granulepos represents the number of samples that can be
+decoded from all packets up to that point.
+
+In GStreamer, the vorbisenc elements produces a stream where:
+- OFFSET is the time corresponding to the granulepos
+ number of bytes produced before
+- OFFSET_END is the granulepos of the produced vorbis buffer
+- TIMESTAMP is the timestamp matching the begin of the buffer
+- DURATION is set to the length in time of the buffer
+
+Ogg media mapping
+-----------------
+
+Ogg defines a mapping for each media type that it embeds.
+
+For Vorbis:
+
+ - 3 header pages, with granulepos 0.
+ - 1 page with 1 packet header identification
+ - N pages with 2 packets comments and codebooks
+ - granulepos is samplenumber of next page
+ - one packet can contain a variable number of samples but one frame
+ that should be handed to the vorbis decoder.
+
+For Theora
+
+ - 3 header pages, with granulepos 0.
+ - 1 page with 1 packet header identification
+ - N pages with 2 packets comments and codebooks
+ - granulepos is framenumber of last packet in page, where framenumber
+ is a combination of keyframe number and p frames since keyframe.
+ - one packet contains 1 frame
+
+
+
+
+DEMUXING
+========
+
+ogg demuxer
+-----------
+
+This ogg demuxer has two modes of operation, which both share a significant
+amount of code. The first mode is the streaming mode which is automatically
+selected when the demuxer is connected to a non-getrange based element. When
+connected to a getrange based element the ogg demuxer can do full seeking
+with great efficiency.
+
+1) the streaming mode.
+
+In this mode, the ogg demuxer receives buffers in the _chain() function which
+are then simply submited to the ogg sync layer. Pages are then processed when
+the sync layer detects them, pads are created for new chains and packets are
+sent to the peer elements of the pads.
+
+In this mode, no seeking is possible. This is the typical case when the
+stream is read from a network source.
+
+In this mode, no setup is done at startup, the pages are just read and decoded.
+A new logical chain is detected when one of the pages has the BOS flag set. At
+this point the existing pads are removed and new pads are created for all the
+logical streams in this new chain.
+
+
+2) the random access mode.
+
+ In this mode, the ogg file is first scanned to detect the position and length
+of all chains. This scanning is performed using a recursive binary search
+algorithm that is explained below.
+
+ find_chains(start, end)
+ {
+ ret1 = read_next_pages (start);
+ ret2 = read_prev_page (end);
+
+ if (WAS_HEADER (ret1)) {
+ }
+ else {
+ }
+
+ }
+
+ a) read first and last pages
+
+ start end
+ V V
+ +-----------------------+-------------+--------------------+
+ | 111 | 222 | 333 |
+ BOS BOS BOS EOS
+
+
+ after reading start, serial 111, BOS, chain[0] = 111
+ after reading end, serial 333, EOS
+
+ start serialno != end serialno, binary search start, (end-start)/2
+
+ start bisect end
+ V V V
+ +-----------------------+-------------+--------------------+
+ | 111 | 222 | 333 |
+
+
+ after reading start, serial 111, BOS, chain[0] = 111
+ after reading end, serial 222, EOS
+
+ while (
+
+
+
+testcases
+---------
+
+ a) stream without BOS
+
+ +----------------------------------------------------------+
+ 111 |
+ EOS
+
+ b) chained stream, first chain without BOS
+
+ +-------------------+--------------------------------------+
+ 111 | 222 |
+ BOS EOS
+
+
+ c) chained stream
+
+ +-------------------+--------------------------------------+
+ | 111 | 222 |
+ BOS BOS EOS
+
+
+ d) chained stream, second without BOS
+
+ +-------------------+--------------------------------------+
+ | 111 | 222 |
+ BOS EOS
+
+What can an ogg demuxer do?
+---------------------------
+
+An ogg demuxer can read pages and get the granulepos from them.
+It can ask the decoder elements to convert a granulepos to time.
+
+An ogg demuxer can also get the granulepos of the first and the last page of a
+stream to get the start and end timestamp of that stream.
+It can also get the length in bytes of the stream
+(when the peer is seekable, that is).
+
+An ogg demuxer is therefore basically able to seek to any byte position and
+timestamp.
+
+When asked to seek to a given granulepos, the ogg demuxer should always convert
+the value to a timestamp using the peer decoder element conversion function. It
+can then binary search the file to eventually end up on the page with the given
+granule pos or a granulepos with the same timestamp.
+
+Seeking in ogg currently
+------------------------
+
+When seeking in an ogg, the decoders can choose to forward the seek event as a
+granulepos or a timestamp to the ogg demuxer.
+
+In the case of a granulepos, the ogg demuxer will seek back to the beginning of
+the stream and skip pages until it finds one with the requested timestamp.
+
+In the case of a timestamp, the ogg demuxer also seeks back to the beginning of
+the stream. For each page it reads, it asks the decoder element to convert the
+granulepos back to a timestamp. The ogg demuxer keeps on skipping pages until
+the page has a timestamp bigger or equal to the requested one.
+
+It is therefore important that the decoder elements in vorbis can convert a
+granulepos into a timestamp or never seek on timestamp on the oggdemuxer.
+
+The default format on the oggdemuxer source pads is currently defined as a the
+granulepos of the packets, it is also the value of the OFFSET field in the
+GstBuffer.
+
+MUXING
+======
+
+Oggmux
+------
+
+The ogg muxer's job is to output complete Ogg pages such that the absolute
+time represented by the valid (ie, not -1) granulepos values on those pages
+never decreases. This has to be true for all logical streams in the group at
+the same time.
+
+To achieve this, encoders are required to pass along the exact time that the
+granulepos represents for each ogg packet that it pushes to the ogg muxer.
+This is ESSENTIAL: without this exact time representation of the granulepos,
+the muxer can not produce valid streams.
+
+The ogg muxer has a packet queue per sink pad. From this queue a page can
+be flushed when:
+ - total byte size of queued packets exceeds a given value
+ - total time duration of queued packets exceeds a given value
+ - total byte size of queued packets exceeds maximum Ogg page size
+ - eos of the pad
+ - encoder sent a command to flush out an ogg page after this new packet
+ (in 0.8, through a flush event; in 0.10, with a GstOggBuffer)
+ - muxer wants a flush to happen (so it can output pages)
+
+The ogg muxer also has a page queue per sink pad. This queue collects
+Ogg pages from the corresponding packet queue. Each page is also marked
+with the timestamp that the granulepos in the header represents.
+
+A page can be flushed from this collection of page queues when:
+- ideally, every page queue has at least one page with a valid granulepos
+ -> choose the page, from all queues, with the lowest timestamp value
+- if not, muxer can wait if the following limits aren't reached:
+ - total byte size of any page queue exceeds a limit
+ - total time duration of any page queue exceeds a limit
+- if this limit is reached, then:
+ - request a page flush from packet queue to page queue for each queue
+ that does not have pages
+ - now take the page from all queues with the lowest timestamp value
+ - make sure all later-coming data is marked as old, either to be still
+ output (but producing an invalid stream, though it can be fixed later)
+ or dropped (which means it's gone forever)
+
+The oggmuxer uses the offset fields to fill in the granulepos in the pages.
+
+GStreamer implementation details
+--------------------------------
+As said before, the basic rule is that the ogg muxer needs an exact time
+representation for each granulepos. This needs to be provided by the encoder.
+
+Potential problems are:
+ - initial offsets for a raw stream need to be preserved somehow. Example:
+ if the first audio sample has time 0.5, the granulepos in the vorbis encoder
+ needs to be adjusted to take this into account.
+ - initial offsets may need be on rate boundaries. Example:
+ if the framerate is 5 fps, and the first video frame has time 0.1 s, the
+ granulepos cannot correctly represent this timestamp.
+ This can be handled out-of-band (initial offset in another muxing format,
+ skeleton track with initial offsets, ...)
+
+Given that the basic rule for muxing is that the muxer needs an exact timestamp
+matching the granulepos, we need some way of communicating this time value
+from encoders to the Ogg muxer. So we need a mechanism to communicate
+a granulepos and its time representation for each GstBuffer.
+
+(This is an instance of a more generic problem - having a way to attach
+ more fields to a GstBuffer)
+
+Possible ways:
+- setting TIMESTAMP to this value: bad - this value represents the end time
+ of the buffer, and thus conflicts with GStreamer's idea of what TIMESTAMP
+ is. This would cause problems muxing the encoded stream in other muxing
+ formats, or for streaming. Note that this is what was done in GStreamer 0.8
+- setting DURATION to GP_TIME - TIMESTAMP: bad - this breaks the concept of
+ duration for this frame. Take the video example above; each buffer would
+ have a correct timestamp, but always a 0.1 s duration as opposed to the
+ correct 0.2 s duration
+- subclassing GstBuffer: clean, but requires a common header used between
+ ogg muxer and all encoders that can be muxed into ogg. Also, what if
+ a format can be muxed into more than one container, and they each have
+ their own "extra" info to communicate ?
+- adding key/value pairs to GstBuffer: clean, but requires changes to
+ core. Also, the overhead of allocating e.g. a GstStructure for *each* buffer
+ may be expensive.
+- "cheating":
+ - abuse OFFSET to store the timestamp matching this granulepos
+ - abuse OFFSET_END to store the granulepos value
+ The drawback here is that before, it made sense to use OFFSET and OFFSET_END
+ to store a byte count. Given that this is not used for anything critical
+ (you can't store a raw theora or vorbis stream in a file anyway),
+ this is what's being done for now.
+
+In practice
+-----------
+- all encoders of formats that can be muxed into Ogg produce a stream where:
+ - OFFSET is abused to be the timestamp corresponding exactly to the
+ granulepos
+ - OFFSET_END is abused to be the granulepos of the encoded theora buffer
+ - TIMESTAMP is the timestamp matching the begin of the buffer
+ - DURATION is the length in time of the buffer
+
+- initial delays should be handled in the GStreamer encoders by mangling
+ the granulepos of the encoded packet to take the delay into account as
+ best as possible and store that in OFFSET;
+ this then brings TIMESTAMP + DURATION to within less
+ than a frame period of the granulepos's time representation
+ The ogg muxer will then create new ogg packets with this OFFSET as
+ the granulepos. So in effect, the granulepos produced by the encoders
+ does not get used directly.
+
+TODO
+----
+- decide on a proper mechanism for communicating extra per-buffer fields
+- the ogg muxer sets timestamp and duration on outgoing ogg pages based on
+ timestamp/duration of incoming ogg packets.
+ Note that:
+ - since the ogg muxer *has* to output pages sorted by gp time, representing
+ end time of the page, this means that the buffer's timestamps are not
+ necessarily monotonically increasing
+ - timestamp + duration of buffers don't match up; the duration represents
+ the length of the ogg page *for that stream*. Hence, for a normal
+ two-stream file, the sum of all durations is twice the length of the
+ muxed file.
+
+TESTING
+-------
+Proper muxing can be tested by generating test files with command lines like:
+- video and audio start from 0:
+gst-launch -v videotestsrc ! theoraenc ! oggmux audiotestsrc ! audioconvert ! vorbisenc ! identity ! oggmux0. oggmux0. ! filesink location=test.ogg
+
+- video starts after audio:
+gst-launch -v videotestsrc timestamp-offset=500000000 ! theoraenc ! oggmux audiotestsrc ! audioconvert ! vorbisenc ! identity ! oggmux0. oggmux0. ! filesink location=test.ogg
+
+- audio starts after video:
+gst-launch -v videotestsrc ! theoraenc ! oggmux audiotestsrc timestamp-offset=500000000 ! audioconvert ! vorbisenc ! identity ! oggmux0. oggmux0. ! filesink location=test.ogg
+
+The resulting files can be verified with oggz-validate for correctness.
diff --git a/ext/ogg/dirac_parse.c b/ext/ogg/dirac_parse.c
new file mode 100644
index 0000000..3a3193d
--- /dev/null
+++ b/ext/ogg/dirac_parse.c
@@ -0,0 +1,498 @@
+
+#include "dirac_parse.h"
+#include <string.h>
+
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+
+typedef struct _Unpack Unpack;
+
+struct _Unpack
+{
+ unsigned char *data;
+ int n_bits_left;
+ int index;
+ int guard_bit;
+};
+
+static void schro_unpack_init_with_data (Unpack * unpack, unsigned char *data,
+ int n_bytes, unsigned int guard_bit);
+
+static unsigned int schro_unpack_decode_bit (Unpack * unpack);
+static unsigned int schro_unpack_decode_uint (Unpack * unpack);
+
+
+void schro_video_format_set_std_video_format (DiracSequenceHeader * format,
+ int index);
+void schro_video_format_set_std_frame_rate (DiracSequenceHeader * format,
+ int index);
+void schro_video_format_set_std_aspect_ratio (DiracSequenceHeader * format,
+ int index);
+void schro_video_format_set_std_signal_range (DiracSequenceHeader * format,
+ int index);
+void schro_video_format_set_std_colour_spec (DiracSequenceHeader * format,
+ int index);
+
+
+
+
+int
+dirac_sequence_header_parse (DiracSequenceHeader * header,
+ unsigned char *data, int n_bytes)
+{
+ int bit;
+ int index;
+ Unpack _unpack;
+ Unpack *unpack = &_unpack;
+ int major_version;
+ int minor_version;
+ int profile;
+ int level;
+
+ memset (header, 0, sizeof (*header));
+
+ schro_unpack_init_with_data (unpack, data, n_bytes, 1);
+
+ /* parse parameters */
+ major_version = schro_unpack_decode_uint (unpack);
+ minor_version = schro_unpack_decode_uint (unpack);
+ profile = schro_unpack_decode_uint (unpack);
+ level = schro_unpack_decode_uint (unpack);
+
+ /* base video header */
+ index = schro_unpack_decode_uint (unpack);
+ schro_video_format_set_std_video_format (header, index);
+
+ header->major_version = major_version;
+ header->minor_version = minor_version;
+ header->profile = profile;
+ header->level = level;
+
+ /* source parameters */
+ /* frame dimensions */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->width = schro_unpack_decode_uint (unpack);
+ header->height = schro_unpack_decode_uint (unpack);
+ }
+
+ /* chroma header */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->chroma_format = schro_unpack_decode_uint (unpack);
+ }
+
+ /* scan header */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->interlaced = schro_unpack_decode_uint (unpack);
+ }
+
+ /* frame rate */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ index = schro_unpack_decode_uint (unpack);
+ if (index == 0) {
+ header->frame_rate_numerator = schro_unpack_decode_uint (unpack);
+ header->frame_rate_denominator = schro_unpack_decode_uint (unpack);
+ } else {
+ schro_video_format_set_std_frame_rate (header, index);
+ }
+ }
+
+ /* aspect ratio */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ index = schro_unpack_decode_uint (unpack);
+ if (index == 0) {
+ header->aspect_ratio_numerator = schro_unpack_decode_uint (unpack);
+ header->aspect_ratio_denominator = schro_unpack_decode_uint (unpack);
+ } else {
+ schro_video_format_set_std_aspect_ratio (header, index);
+ }
+ }
+
+ /* clean area */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->clean_width = schro_unpack_decode_uint (unpack);
+ header->clean_height = schro_unpack_decode_uint (unpack);
+ header->left_offset = schro_unpack_decode_uint (unpack);
+ header->top_offset = schro_unpack_decode_uint (unpack);
+ }
+
+ /* signal range */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ index = schro_unpack_decode_uint (unpack);
+ if (index == 0) {
+ header->luma_offset = schro_unpack_decode_uint (unpack);
+ header->luma_excursion = schro_unpack_decode_uint (unpack);
+ header->chroma_offset = schro_unpack_decode_uint (unpack);
+ header->chroma_excursion = schro_unpack_decode_uint (unpack);
+ } else {
+ schro_video_format_set_std_signal_range (header, index);
+ }
+ }
+
+ /* colour spec */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ index = schro_unpack_decode_uint (unpack);
+ schro_video_format_set_std_colour_spec (header, index);
+ if (index == 0) {
+ /* colour primaries */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->colour_primaries = schro_unpack_decode_uint (unpack);
+ }
+ /* colour matrix */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->colour_matrix = schro_unpack_decode_uint (unpack);
+ }
+ /* transfer function */
+ bit = schro_unpack_decode_bit (unpack);
+ if (bit) {
+ header->transfer_function = schro_unpack_decode_uint (unpack);
+ }
+ }
+ }
+
+ header->interlaced_coding = schro_unpack_decode_uint (unpack);
+
+ return 1;
+}
+
+/* standard stuff */
+
+static DiracSequenceHeader schro_video_formats[] = {
+ {0, 0, 0, 0,
+ 0, /* custom */
+ 640, 480, SCHRO_CHROMA_420,
+ FALSE, FALSE,
+ 24000, 1001, 1, 1,
+ 640, 480, 0, 0,
+ 0, 255, 128, 255,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 1, /* QSIF525 */
+ 176, 120, SCHRO_CHROMA_420,
+ FALSE, FALSE,
+ 15000, 1001, 10, 11,
+ 176, 120, 0, 0,
+ 0, 255, 128, 255,
+ 1, 1, 0},
+ {0, 0, 0, 0,
+ 2, /* QCIF */
+ 176, 144, SCHRO_CHROMA_420,
+ FALSE, TRUE,
+ 25, 2, 12, 11,
+ 176, 144, 0, 0,
+ 0, 255, 128, 255,
+ 2, 1, 0},
+ {0, 0, 0, 0,
+ 3, /* SIF525 */
+ 352, 240, SCHRO_CHROMA_420,
+ FALSE, FALSE,
+ 15000, 1001, 10, 11,
+ 352, 240, 0, 0,
+ 0, 255, 128, 255,
+ 1, 1, 0},
+ {0, 0, 0, 0,
+ 4, /* CIF */
+ 352, 288, SCHRO_CHROMA_420,
+ FALSE, TRUE,
+ 25, 2, 12, 11,
+ 352, 288, 0, 0,
+ 0, 255, 128, 255,
+ 2, 1, 0},
+ {0, 0, 0, 0,
+ 5, /* 4SIF525 */
+ 704, 480, SCHRO_CHROMA_420,
+ FALSE, FALSE,
+ 15000, 1001, 10, 11,
+ 704, 480, 0, 0,
+ 0, 255, 128, 255,
+ 1, 1, 0},
+ {0, 0, 0, 0,
+ 6, /* 4CIF */
+ 704, 576, SCHRO_CHROMA_420,
+ FALSE, TRUE,
+ 25, 2, 12, 11,
+ 704, 576, 0, 0,
+ 0, 255, 128, 255,
+ 2, 1, 0},
+ {0, 0, 0, 0,
+ 7, /* SD480I-60 */
+ 720, 480, SCHRO_CHROMA_422,
+ TRUE, FALSE,
+ 30000, 1001, 10, 11,
+ 704, 480, 8, 0,
+ 64, 876, 512, 896,
+ 1, 1, 0},
+ {0, 0, 0, 0,
+ 8, /* SD576I-50 */
+ 720, 576, SCHRO_CHROMA_422,
+ TRUE, TRUE,
+ 25, 1, 12, 11,
+ 704, 576, 8, 0,
+ 64, 876, 512, 896,
+ 2, 1, 0},
+ {0, 0, 0, 0,
+ 9, /* HD720P-60 */
+ 1280, 720, SCHRO_CHROMA_422,
+ FALSE, TRUE,
+ 60000, 1001, 1, 1,
+ 1280, 720, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 10, /* HD720P-50 */
+ 1280, 720, SCHRO_CHROMA_422,
+ FALSE, TRUE,
+ 50, 1, 1, 1,
+ 1280, 720, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 11, /* HD1080I-60 */
+ 1920, 1080, SCHRO_CHROMA_422,
+ TRUE, TRUE,
+ 30000, 1001, 1, 1,
+ 1920, 1080, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 12, /* HD1080I-50 */
+ 1920, 1080, SCHRO_CHROMA_422,
+ TRUE, TRUE,
+ 25, 1, 1, 1,
+ 1920, 1080, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 13, /* HD1080P-60 */
+ 1920, 1080, SCHRO_CHROMA_422,
+ FALSE, TRUE,
+ 60000, 1001, 1, 1,
+ 1920, 1080, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 14, /* HD1080P-50 */
+ 1920, 1080, SCHRO_CHROMA_422,
+ FALSE, TRUE,
+ 50, 1, 1, 1,
+ 1920, 1080, 0, 0,
+ 64, 876, 512, 896,
+ 0, 0, 0},
+ {0, 0, 0, 0,
+ 15, /* DC2K */
+ 2048, 1080, SCHRO_CHROMA_444,
+ FALSE, TRUE,
+ 24, 1, 1, 1,
+ 2048, 1080, 0, 0,
+ 256, 3504, 2048, 3584,
+ 3, 0, 0},
+ {0, 0, 0, 0,
+ 16, /* DC4K */
+ 4096, 2160, SCHRO_CHROMA_444,
+ FALSE, TRUE,
+ 24, 1, 1, 1,
+ 2048, 1536, 0, 0,
+ 256, 3504, 2048, 3584,
+ 3, 0, 0},
+};
+
+void
+schro_video_format_set_std_video_format (DiracSequenceHeader * format,
+ int index)
+{
+
+ if (index < 0 || index >= ARRAY_SIZE (schro_video_formats)) {
+ return;
+ }
+
+ memcpy (format, schro_video_formats + index, sizeof (DiracSequenceHeader));
+}
+
+typedef struct _SchroFrameRate SchroFrameRate;
+struct _SchroFrameRate
+{
+ int numerator;
+ int denominator;
+};
+
+static SchroFrameRate schro_frame_rates[] = {
+ {0, 0},
+ {24000, 1001},
+ {24, 1},
+ {25, 1},
+ {30000, 1001},
+ {30, 1},
+ {50, 1},
+ {60000, 1001},
+ {60, 1},
+ {15000, 1001},
+ {25, 2}
+};
+
+void
+schro_video_format_set_std_frame_rate (DiracSequenceHeader * format, int index)
+{
+ if (index < 1 || index >= ARRAY_SIZE (schro_frame_rates)) {
+ return;
+ }
+
+ format->frame_rate_numerator = schro_frame_rates[index].numerator;
+ format->frame_rate_denominator = schro_frame_rates[index].denominator;
+}
+
+typedef struct _SchroPixelAspectRatio SchroPixelAspectRatio;
+struct _SchroPixelAspectRatio
+{
+ int numerator;
+ int denominator;
+};
+
+static const SchroPixelAspectRatio schro_aspect_ratios[] = {
+ {0, 0},
+ {1, 1},
+ {10, 11},
+ {12, 11},
+ {40, 33},
+ {16, 11},
+ {4, 3}
+};
+
+void
+schro_video_format_set_std_aspect_ratio (DiracSequenceHeader * format,
+ int index)
+{
+ if (index < 1 || index >= ARRAY_SIZE (schro_aspect_ratios)) {
+ return;
+ }
+
+ format->aspect_ratio_numerator = schro_aspect_ratios[index].numerator;
+ format->aspect_ratio_denominator = schro_aspect_ratios[index].denominator;
+
+}
+
+typedef struct _SchroSignalRangeStruct SchroSignalRangeStruct;
+struct _SchroSignalRangeStruct
+{
+ int luma_offset;
+ int luma_excursion;
+ int chroma_offset;
+ int chroma_excursion;
+};
+
+static const SchroSignalRangeStruct schro_signal_ranges[] = {
+ {0, 0, 0, 0},
+ {0, 255, 128, 255},
+ {16, 219, 128, 224},
+ {64, 876, 512, 896},
+ {256, 3504, 2048, 3584}
+};
+
+void
+schro_video_format_set_std_signal_range (DiracSequenceHeader * format, int i)
+{
+ if (i < 1 || i >= ARRAY_SIZE (schro_signal_ranges)) {
+ return;
+ }
+
+ format->luma_offset = schro_signal_ranges[i].luma_offset;
+ format->luma_excursion = schro_signal_ranges[i].luma_excursion;
+ format->chroma_offset = schro_signal_ranges[i].chroma_offset;
+ format->chroma_excursion = schro_signal_ranges[i].chroma_excursion;
+}
+
+typedef struct _SchroColourSpecStruct SchroColourSpecStruct;
+struct _SchroColourSpecStruct
+{
+ int colour_primaries;
+ int colour_matrix;
+ int transfer_function;
+};
+
+static const SchroColourSpecStruct schro_colour_specs[] = {
+ { /* Custom */
+ SCHRO_COLOUR_PRIMARY_HDTV,
+ SCHRO_COLOUR_MATRIX_HDTV,
+ SCHRO_TRANSFER_CHAR_TV_GAMMA},
+ { /* SDTV 525 */
+ SCHRO_COLOUR_PRIMARY_SDTV_525,
+ SCHRO_COLOUR_MATRIX_SDTV,
+ SCHRO_TRANSFER_CHAR_TV_GAMMA},
+ { /* SDTV 625 */
+ SCHRO_COLOUR_PRIMARY_SDTV_625,
+ SCHRO_COLOUR_MATRIX_SDTV,
+ SCHRO_TRANSFER_CHAR_TV_GAMMA},
+ { /* HDTV */
+ SCHRO_COLOUR_PRIMARY_HDTV,
+ SCHRO_COLOUR_MATRIX_HDTV,
+ SCHRO_TRANSFER_CHAR_TV_GAMMA},
+ { /* Cinema */
+ SCHRO_COLOUR_PRIMARY_CINEMA,
+ SCHRO_COLOUR_MATRIX_HDTV,
+ SCHRO_TRANSFER_CHAR_TV_GAMMA}
+};
+
+void
+schro_video_format_set_std_colour_spec (DiracSequenceHeader * format, int i)
+{
+ if (i < 0 || i >= ARRAY_SIZE (schro_colour_specs)) {
+ return;
+ }
+
+ format->colour_primaries = schro_colour_specs[i].colour_primaries;
+ format->colour_matrix = schro_colour_specs[i].colour_matrix;
+ format->transfer_function = schro_colour_specs[i].transfer_function;
+}
+
+
+/* unpack */
+
+static void
+schro_unpack_init_with_data (Unpack * unpack, unsigned char *data,
+ int n_bytes, unsigned int guard_bit)
+{
+ memset (unpack, 0, sizeof (Unpack));
+
+ unpack->data = data;
+ unpack->n_bits_left = 8 * n_bytes;
+ unpack->guard_bit = guard_bit;
+}
+
+static unsigned int
+schro_unpack_decode_bit (Unpack * unpack)
+{
+ int bit;
+
+ if (unpack->n_bits_left < 1) {
+ return unpack->guard_bit;
+ }
+ bit = (unpack->data[unpack->index >> 3] >> (7 - (unpack->index & 7))) & 1;
+ unpack->index++;
+ unpack->n_bits_left--;
+
+ return bit;
+}
+
+static unsigned int
+schro_unpack_decode_uint (Unpack * unpack)
+{
+ int count;
+ int value;
+
+ count = 0;
+ value = 0;
+ while (!schro_unpack_decode_bit (unpack)) {
+ count++;
+ value <<= 1;
+ value |= schro_unpack_decode_bit (unpack);
+ }
+
+ return (1 << count) - 1 + value;
+}
diff --git a/ext/ogg/dirac_parse.h b/ext/ogg/dirac_parse.h
new file mode 100644
index 0000000..9dc4ffe
--- /dev/null
+++ b/ext/ogg/dirac_parse.h
@@ -0,0 +1,178 @@
+
+#ifndef __DIRAC_PARSE_H__
+#define __DIRAC_PARSE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+typedef enum _SchroParseCode {
+ SCHRO_PARSE_CODE_SEQUENCE_HEADER = 0x00,
+ SCHRO_PARSE_CODE_END_OF_SEQUENCE = 0x10,
+ SCHRO_PARSE_CODE_AUXILIARY_DATA = 0x20,
+ SCHRO_PARSE_CODE_PADDING = 0x30,
+
+ SCHRO_PARSE_CODE_INTRA_REF = 0x0c,
+ SCHRO_PARSE_CODE_INTRA_NON_REF = 0x08,
+ SCHRO_PARSE_CODE_INTRA_REF_NOARITH = 0x4c,
+ SCHRO_PARSE_CODE_INTRA_NON_REF_NOARITH = 0x48,
+
+ SCHRO_PARSE_CODE_INTER_REF_1 = 0x0d,
+ SCHRO_PARSE_CODE_INTER_REF_1_NOARITH = 0x4d,
+ SCHRO_PARSE_CODE_INTER_REF_2 = 0x0e,
+ SCHRO_PARSE_CODE_INTER_REF_2_NOARITH = 0x4e,
+
+ SCHRO_PARSE_CODE_INTER_NON_REF_1 = 0x09,
+ SCHRO_PARSE_CODE_INTER_NON_REF_1_NOARITH = 0x49,
+ SCHRO_PARSE_CODE_INTER_NON_REF_2 = 0x0a,
+ SCHRO_PARSE_CODE_INTER_NON_REF_2_NOARITH = 0x4a,
+
+ SCHRO_PARSE_CODE_LD_INTRA_REF = 0xcc,
+ SCHRO_PARSE_CODE_LD_INTRA_NON_REF = 0xc8
+} SchroParseCode;
+
+#define SCHRO_PARSE_CODE_PICTURE(is_ref,n_refs,is_lowdelay,is_noarith) \
+ (8 | ((is_ref)<<2) | (n_refs) | ((is_lowdelay)<<7) | ((is_noarith)<<6))
+
+#define SCHRO_PARSE_CODE_IS_SEQ_HEADER(x) ((x) == SCHRO_PARSE_CODE_SEQUENCE_HEADER)
+#define SCHRO_PARSE_CODE_IS_END_OF_SEQUENCE(x) ((x) == SCHRO_PARSE_CODE_END_OF_SEQUENCE)
+#define SCHRO_PARSE_CODE_IS_AUXILIARY_DATA(x) ((x) == SCHRO_PARSE_CODE_AUXILIARY_DATA)
+#define SCHRO_PARSE_CODE_IS_PADDING(x) ((x) == SCHRO_PARSE_CODE_PADDING)
+#define SCHRO_PARSE_CODE_IS_PICTURE(x) ((x) & 0x8)
+#define SCHRO_PARSE_CODE_IS_LOW_DELAY(x) (((x) & 0x88) == 0x88)
+#define SCHRO_PARSE_CODE_IS_CORE_SYNTAX(x) (((x) & 0x88) == 0x08)
+#define SCHRO_PARSE_CODE_USING_AC(x) (((x) & 0x48) == 0x08)
+#define SCHRO_PARSE_CODE_IS_REFERENCE(x) (((x) & 0xc) == 0x0c)
+#define SCHRO_PARSE_CODE_IS_NON_REFERENCE(x) (((x) & 0xc) == 0x08)
+#define SCHRO_PARSE_CODE_NUM_REFS(x) ((x) & 0x3)
+#define SCHRO_PARSE_CODE_IS_INTRA(x) (SCHRO_PARSE_CODE_IS_PICTURE(x) && SCHRO_PARSE_CODE_NUM_REFS(x) == 0)
+#define SCHRO_PARSE_CODE_IS_INTER(x) (SCHRO_PARSE_CODE_IS_PICTURE(x) && SCHRO_PARSE_CODE_NUM_REFS(x) > 0)
+
+#define SCHRO_PARSE_HEADER_SIZE (4+1+4+4)
+
+typedef enum _SchroVideoFormatEnum {
+ SCHRO_VIDEO_FORMAT_CUSTOM = 0,
+ SCHRO_VIDEO_FORMAT_QSIF,
+ SCHRO_VIDEO_FORMAT_QCIF,
+ SCHRO_VIDEO_FORMAT_SIF,
+ SCHRO_VIDEO_FORMAT_CIF,
+ SCHRO_VIDEO_FORMAT_4SIF,
+ SCHRO_VIDEO_FORMAT_4CIF,
+ SCHRO_VIDEO_FORMAT_SD480I_60,
+ SCHRO_VIDEO_FORMAT_SD576I_50,
+ SCHRO_VIDEO_FORMAT_HD720P_60,
+ SCHRO_VIDEO_FORMAT_HD720P_50,
+ SCHRO_VIDEO_FORMAT_HD1080I_60,
+ SCHRO_VIDEO_FORMAT_HD1080I_50,
+ SCHRO_VIDEO_FORMAT_HD1080P_60,
+ SCHRO_VIDEO_FORMAT_HD1080P_50,
+ SCHRO_VIDEO_FORMAT_DC2K_24,
+ SCHRO_VIDEO_FORMAT_DC4K_24
+} SchroVideoFormatEnum;
+
+typedef enum _SchroChromaFormat {
+ SCHRO_CHROMA_444 = 0,
+ SCHRO_CHROMA_422,
+ SCHRO_CHROMA_420
+} SchroChromaFormat;
+
+#define SCHRO_CHROMA_FORMAT_H_SHIFT(format) (((format) == SCHRO_CHROMA_444)?0:1)
+#define SCHRO_CHROMA_FORMAT_V_SHIFT(format) (((format) == SCHRO_CHROMA_420)?1:0)
+
+typedef enum _SchroSignalRange {
+ SCHRO_SIGNAL_RANGE_CUSTOM = 0,
+ SCHRO_SIGNAL_RANGE_8BIT_FULL = 1,
+ SCHRO_SIGNAL_RANGE_8BIT_VIDEO = 2,
+ SCHRO_SIGNAL_RANGE_10BIT_VIDEO = 3,
+ SCHRO_SIGNAL_RANGE_12BIT_VIDEO = 4
+} SchroSignalRange;
+
+typedef enum _SchroColourSpec {
+ SCHRO_COLOUR_SPEC_CUSTOM = 0,
+ SCHRO_COLOUR_SPEC_SDTV_525 = 1,
+ SCHRO_COLOUR_SPEC_SDTV_625 = 2,
+ SCHRO_COLOUR_SPEC_HDTV = 3,
+ SCHRO_COLOUR_SPEC_CINEMA = 4
+} SchroColourSpec;
+
+typedef enum _SchroColourPrimaries {
+ SCHRO_COLOUR_PRIMARY_HDTV = 0,
+ SCHRO_COLOUR_PRIMARY_SDTV_525 = 1,
+ SCHRO_COLOUR_PRIMARY_SDTV_625 = 2,
+ SCHRO_COLOUR_PRIMARY_CINEMA = 3
+} SchroColourPrimaries;
+
+typedef enum _SchroColourMatrix {
+ SCHRO_COLOUR_MATRIX_HDTV = 0,
+ SCHRO_COLOUR_MATRIX_SDTV = 1,
+ SCHRO_COLOUR_MATRIX_REVERSIBLE = 2
+}SchroColourMatrix;
+
+typedef enum _SchroTransferFunction {
+ SCHRO_TRANSFER_CHAR_TV_GAMMA = 0,
+ SCHRO_TRANSFER_CHAR_EXTENDED_GAMUT = 1,
+ SCHRO_TRANSFER_CHAR_LINEAR = 2,
+ SCHRO_TRANSFER_CHAR_DCI_GAMMA = 3
+} SchroTransferFunction;
+
+
+
+typedef struct _DiracSequenceHeader DiracSequenceHeader;
+
+struct _DiracSequenceHeader {
+ int major_version;
+ int minor_version;
+ int profile;
+ int level;
+
+ int index;
+ int width;
+ int height;
+ int chroma_format;
+
+ int interlaced;
+ int top_field_first;
+
+ int frame_rate_numerator;
+ int frame_rate_denominator;
+ int aspect_ratio_numerator;
+ int aspect_ratio_denominator;
+
+ int clean_width;
+ int clean_height;
+ int left_offset;
+ int top_offset;
+
+ int luma_offset;
+ int luma_excursion;
+ int chroma_offset;
+ int chroma_excursion;
+
+ int colour_primaries;
+ int colour_matrix;
+ int transfer_function;
+
+ int interlaced_coding;
+
+ int unused0;
+ int unused1;
+ int unused2;
+};
+
+
+int dirac_sequence_header_parse (DiracSequenceHeader *header,
+ unsigned char *data, int length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/ext/ogg/gstogg.c b/ext/ogg/gstogg.c
new file mode 100644
index 0000000..d1f16b8
--- /dev/null
+++ b/ext/ogg/gstogg.c
@@ -0,0 +1,46 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include "gstogg.h"
+#include "gstoggdemux.h"
+#include "gstoggmux.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_ogg_demux_plugin_init (plugin);
+ gst_ogg_mux_plugin_init (plugin);
+ gst_ogm_parse_plugin_init (plugin);
+ gst_ogg_parse_plugin_init (plugin);
+ gst_ogg_avi_parse_plugin_init (plugin);
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "ogg",
+ "ogg stream manipulation (info about ogg: http://xiph.org)",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/ogg/gstogg.h b/ext/ogg/gstogg.h
new file mode 100644
index 0000000..6f1393c
--- /dev/null
+++ b/ext/ogg/gstogg.h
@@ -0,0 +1,31 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstoggdemux.c: ogg 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_OGG_H__
+#define __GST_OGG_H__
+
+#include <gst/gst.h>
+
+gboolean gst_ogm_parse_plugin_init (GstPlugin * plugin);
+gboolean gst_ogg_parse_plugin_init (GstPlugin * plugin);
+gboolean gst_ogg_avi_parse_plugin_init (GstPlugin * plugin);
+
+#endif /* __GST_OGG_H__ */
diff --git a/ext/ogg/gstoggaviparse.c b/ext/ogg/gstoggaviparse.c
new file mode 100644
index 0000000..3a2b892
--- /dev/null
+++ b/ext/ogg/gstoggaviparse.c
@@ -0,0 +1,485 @@
+/* GStreamer
+ * Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
+ *
+ * gstoggaviparse.c: ogg avi 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.
+ */
+
+/*
+ * Ogg in AVI is mostly done for vorbis audio. In the codec_data we receive the
+ * first 3 packets of the raw vorbis data. On the sinkpad we receive full-blown Ogg
+ * pages.
+ * Before extracting the packets out of the ogg pages, we push the raw vorbis
+ * header packets to the decoder.
+ * We don't use the incomming timestamps but use the ganulepos on the ogg pages
+ * directly.
+ * This parser only does ogg/vorbis for now.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst.h>
+#include <ogg/ogg.h>
+#include <string.h>
+
+#include "gstogg.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_ogg_avi_parse_debug);
+#define GST_CAT_DEFAULT gst_ogg_avi_parse_debug
+
+#define GST_TYPE_OGG_AVI_PARSE (gst_ogg_avi_parse_get_type())
+#define GST_OGG_AVI_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_AVI_PARSE, GstOggAviParse))
+#define GST_OGG_AVI_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_AVI_PARSE, GstOggAviParse))
+#define GST_IS_OGG_AVI_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_AVI_PARSE))
+#define GST_IS_OGG_AVI_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_AVI_PARSE))
+
+static GType gst_ogg_avi_parse_get_type (void);
+
+typedef struct _GstOggAviParse GstOggAviParse;
+typedef struct _GstOggAviParseClass GstOggAviParseClass;
+
+struct _GstOggAviParse
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ gboolean discont;
+ gint serial;
+
+ ogg_sync_state sync;
+ ogg_stream_state stream;
+};
+
+struct _GstOggAviParseClass
+{
+ GstElementClass parent_class;
+};
+
+static void gst_ogg_avi_parse_base_init (gpointer g_class);
+static void gst_ogg_avi_parse_class_init (GstOggAviParseClass * klass);
+static void gst_ogg_avi_parse_init (GstOggAviParse * ogg);
+static GstElementClass *parent_class = NULL;
+
+static GType
+gst_ogg_avi_parse_get_type (void)
+{
+ static GType ogg_avi_parse_type = 0;
+
+ if (!ogg_avi_parse_type) {
+ static const GTypeInfo ogg_avi_parse_info = {
+ sizeof (GstOggAviParseClass),
+ gst_ogg_avi_parse_base_init,
+ NULL,
+ (GClassInitFunc) gst_ogg_avi_parse_class_init,
+ NULL,
+ NULL,
+ sizeof (GstOggAviParse),
+ 0,
+ (GInstanceInitFunc) gst_ogg_avi_parse_init,
+ };
+
+ ogg_avi_parse_type =
+ g_type_register_static (GST_TYPE_ELEMENT, "GstOggAviParse",
+ &ogg_avi_parse_info, 0);
+ }
+ return ogg_avi_parse_type;
+}
+
+enum
+{
+ PROP_0
+};
+
+static GstStaticPadTemplate ogg_avi_parse_src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-vorbis")
+ );
+
+static GstStaticPadTemplate ogg_avi_parse_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-ogg-avi")
+ );
+
+static void gst_ogg_avi_parse_finalize (GObject * object);
+static GstStateChangeReturn gst_ogg_avi_parse_change_state (GstElement *
+ element, GstStateChange transition);
+static gboolean gst_ogg_avi_parse_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_ogg_avi_parse_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_ogg_avi_parse_setcaps (GstPad * pad, GstCaps * caps);
+
+static void
+gst_ogg_avi_parse_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details_simple (element_class,
+ "Ogg AVI parser", "Codec/Parser",
+ "parse an ogg avi stream into pages (info about ogg: http://xiph.org)",
+ "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&ogg_avi_parse_sink_template_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&ogg_avi_parse_src_template_factory));
+}
+
+static void
+gst_ogg_avi_parse_class_init (GstOggAviParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gstelement_class->change_state = gst_ogg_avi_parse_change_state;
+
+ gobject_class->finalize = gst_ogg_avi_parse_finalize;
+}
+
+static void
+gst_ogg_avi_parse_init (GstOggAviParse * ogg)
+{
+ /* create the sink and source pads */
+ ogg->sinkpad =
+ gst_pad_new_from_static_template (&ogg_avi_parse_sink_template_factory,
+ "sink");
+ gst_pad_set_event_function (ogg->sinkpad, gst_ogg_avi_parse_event);
+ gst_pad_set_chain_function (ogg->sinkpad, gst_ogg_avi_parse_chain);
+ gst_element_add_pad (GST_ELEMENT (ogg), ogg->sinkpad);
+
+ ogg->srcpad =
+ gst_pad_new_from_static_template (&ogg_avi_parse_src_template_factory,
+ "src");
+ gst_pad_use_fixed_caps (ogg->srcpad);
+ gst_element_add_pad (GST_ELEMENT (ogg), ogg->srcpad);
+}
+
+static void
+gst_ogg_avi_parse_finalize (GObject * object)
+{
+ GstOggAviParse *ogg = GST_OGG_AVI_PARSE (object);
+
+ GST_LOG_OBJECT (ogg, "Disposing of object %p", ogg);
+
+ ogg_sync_clear (&ogg->sync);
+ ogg_stream_clear (&ogg->stream);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_ogg_avi_parse_setcaps (GstPad * pad, GstCaps * caps)
+{
+ GstOggAviParse *ogg;
+ GstStructure *structure;
+ const GValue *codec_data;
+ GstBuffer *buffer;
+ guint8 *data, *ptr;
+ gsize size, left;
+ guint32 sizes[3];
+ GstCaps *outcaps;
+ gint i, offs;
+
+ ogg = GST_OGG_AVI_PARSE (GST_OBJECT_PARENT (pad));
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* take codec data */
+ codec_data = gst_structure_get_value (structure, "codec_data");
+ if (codec_data == NULL)
+ goto no_data;
+
+ /* only buffers are valid */
+ if (G_VALUE_TYPE (codec_data) != GST_TYPE_BUFFER)
+ goto wrong_format;
+
+ /* Now parse the data */
+ buffer = gst_value_get_buffer (codec_data);
+
+ /* first 22 bytes are bits_per_sample, channel_mask, GUID
+ * Then we get 3 LE guint32 with the 3 header sizes
+ * then we get the bytes of the 3 headers. */
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ ptr = data;
+ left = size;
+
+ GST_LOG_OBJECT (ogg, "configuring codec_data of size %" G_GSIZE_FORMAT, left);
+
+ /* skip headers */
+ ptr += 22;
+ left -= 22;
+
+ /* we need at least 12 bytes for the packet sizes of the 3 headers */
+ if (left < 12)
+ goto buffer_too_small;
+
+ /* read sizes of the 3 headers */
+ sizes[0] = GST_READ_UINT32_LE (ptr);
+ sizes[1] = GST_READ_UINT32_LE (ptr + 4);
+ sizes[2] = GST_READ_UINT32_LE (ptr + 8);
+
+ GST_DEBUG_OBJECT (ogg, "header sizes: %u %u %u", sizes[0], sizes[1],
+ sizes[2]);
+
+ left -= 12;
+
+ /* and we need at least enough data for all the headers */
+ if (left < sizes[0] + sizes[1] + sizes[2])
+ goto buffer_too_small;
+
+ /* set caps */
+ outcaps = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ gst_pad_push_event (ogg->srcpad, gst_event_new_caps (outcaps));
+ gst_caps_unref (outcaps);
+
+ /* copy header data */
+ offs = 34;
+ for (i = 0; i < 3; i++) {
+ GstBuffer *out;
+
+ /* now output the raw vorbis header packets */
+ out = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, offs, sizes[i]);
+ gst_pad_push (ogg->srcpad, out);
+
+ offs += sizes[i];
+ }
+ gst_buffer_unmap (buffer, data, size);
+
+ return TRUE;
+
+ /* ERRORS */
+no_data:
+ {
+ GST_DEBUG_OBJECT (ogg, "no codec_data found in caps");
+ return FALSE;
+ }
+wrong_format:
+ {
+ GST_DEBUG_OBJECT (ogg, "codec_data is not a buffer");
+ return FALSE;
+ }
+buffer_too_small:
+ {
+ GST_DEBUG_OBJECT (ogg, "codec_data is too small");
+ gst_buffer_unmap (buffer, data, size);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_ogg_avi_parse_event (GstPad * pad, GstEvent * event)
+{
+ GstOggAviParse *ogg;
+ gboolean ret;
+
+ ogg = GST_OGG_AVI_PARSE (GST_OBJECT_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_ogg_avi_parse_setcaps (pad, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_push_event (ogg->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ ogg_sync_reset (&ogg->sync);
+ ogg_stream_reset (&ogg->stream);
+ ogg->discont = TRUE;
+ ret = gst_pad_push_event (ogg->srcpad, event);
+ break;
+ default:
+ ret = gst_pad_push_event (ogg->srcpad, event);
+ break;
+ }
+ return ret;
+}
+
+static GstFlowReturn
+gst_ogg_avi_parse_push_packet (GstOggAviParse * ogg, ogg_packet * packet)
+{
+ GstBuffer *buffer;
+ GstFlowReturn result;
+
+ /* allocate space for header and body */
+ buffer = gst_buffer_new_and_alloc (packet->bytes);
+ gst_buffer_fill (buffer, 0, packet->packet, packet->bytes);
+
+ GST_LOG_OBJECT (ogg, "created buffer %p from page", buffer);
+
+ GST_BUFFER_OFFSET_END (buffer) = packet->granulepos;
+
+ if (ogg->discont) {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ ogg->discont = FALSE;
+ }
+
+ result = gst_pad_push (ogg->srcpad, buffer);
+
+ return result;
+}
+
+static GstFlowReturn
+gst_ogg_avi_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ GstOggAviParse *ogg;
+ guint size;
+ gchar *oggbuf;
+ gint ret = -1;
+
+ ogg = GST_OGG_AVI_PARSE (GST_OBJECT_PARENT (pad));
+
+ size = gst_buffer_get_size (buffer);
+
+ GST_LOG_OBJECT (ogg, "Chain function received buffer of size %d", size);
+
+ if (GST_BUFFER_IS_DISCONT (buffer)) {
+ ogg_sync_reset (&ogg->sync);
+ ogg->discont = TRUE;
+ }
+
+ /* write data to sync layer */
+ oggbuf = ogg_sync_buffer (&ogg->sync, size);
+ gst_buffer_extract (buffer, 0, oggbuf, size);
+ ogg_sync_wrote (&ogg->sync, size);
+ gst_buffer_unref (buffer);
+
+ /* try to get as many packets out of the stream as possible */
+ do {
+ ogg_page page;
+
+ /* try to swap out a page */
+ ret = ogg_sync_pageout (&ogg->sync, &page);
+ if (ret == 0) {
+ GST_DEBUG_OBJECT (ogg, "need more data");
+ break;
+ } else if (ret == -1) {
+ GST_DEBUG_OBJECT (ogg, "discont in pages");
+ ogg->discont = TRUE;
+ } else {
+ /* new unknown stream, init the ogg stream with the serial number of the
+ * page. */
+ if (ogg->serial == -1) {
+ ogg->serial = ogg_page_serialno (&page);
+ ogg_stream_init (&ogg->stream, ogg->serial);
+ }
+
+ /* submit page */
+ if (ogg_stream_pagein (&ogg->stream, &page) != 0) {
+ GST_WARNING_OBJECT (ogg, "ogg stream choked on page resetting stream");
+ ogg_sync_reset (&ogg->sync);
+ ogg->discont = TRUE;
+ continue;
+ }
+
+ /* try to get as many packets as possible out of the page */
+ do {
+ ogg_packet packet;
+
+ ret = ogg_stream_packetout (&ogg->stream, &packet);
+ GST_LOG_OBJECT (ogg, "packetout gave %d", ret);
+ switch (ret) {
+ case 0:
+ break;
+ case -1:
+ /* out of sync, We mark a DISCONT. */
+ ogg->discont = TRUE;
+ break;
+ case 1:
+ result = gst_ogg_avi_parse_push_packet (ogg, &packet);
+ if (result != GST_FLOW_OK)
+ goto done;
+ break;
+ default:
+ GST_WARNING_OBJECT (ogg,
+ "invalid return value %d for ogg_stream_packetout, resetting stream",
+ ret);
+ break;
+ }
+ }
+ while (ret != 0);
+ }
+ }
+ while (ret != 0);
+
+done:
+ return result;
+}
+
+static GstStateChangeReturn
+gst_ogg_avi_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstOggAviParse *ogg;
+ GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
+
+ ogg = GST_OGG_AVI_PARSE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ ogg_sync_init (&ogg->sync);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ ogg_sync_reset (&ogg->sync);
+ ogg_stream_reset (&ogg->stream);
+ ogg->serial = -1;
+ ogg->discont = TRUE;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ result = 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:
+ ogg_sync_clear (&ogg->sync);
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+gboolean
+gst_ogg_avi_parse_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_ogg_avi_parse_debug, "oggaviparse", 0,
+ "ogg avi parser");
+
+ return gst_element_register (plugin, "oggaviparse", GST_RANK_PRIMARY,
+ GST_TYPE_OGG_AVI_PARSE);
+}
diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c
new file mode 100644
index 0000000..31d4255
--- /dev/null
+++ b/ext/ogg/gstoggdemux.c
@@ -0,0 +1,4505 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstoggdemux.c: ogg 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-oggdemux
+ * @see_also: <link linkend="gst-plugins-base-plugins-oggmux">oggmux</link>
+ *
+ * This element demuxes ogg files into their encoded audio and video components.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=test.ogg ! oggdemux ! vorbisdec ! audioconvert ! alsasink
+ * ]| Decodes the vorbis audio stored inside an ogg container.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-12-30 (0.10.5)
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <string.h>
+#include <gst/gst-i18n-plugin.h>
+#include <gst/tag/tag.h>
+
+#include "gstoggdemux.h"
+
+#define CHUNKSIZE (8500) /* this is out of vorbisfile */
+
+/* we hope we get a granpos within this many bytes off the end */
+#define DURATION_CHUNK_OFFSET (64*1024)
+
+/* stop duration checks within this much of EOS */
+#define EOS_AVOIDANCE_THRESHOLD 8192
+
+#define GST_FLOW_LIMIT GST_FLOW_CUSTOM_ERROR
+#define GST_FLOW_SKIP_PUSH GST_FLOW_CUSTOM_SUCCESS_1
+
+#define GST_CHAIN_LOCK(ogg) g_mutex_lock((ogg)->chain_lock)
+#define GST_CHAIN_UNLOCK(ogg) g_mutex_unlock((ogg)->chain_lock)
+
+#define GST_PUSH_LOCK(ogg) \
+ do { \
+ GST_TRACE_OBJECT(ogg, "Push lock"); \
+ g_mutex_lock((ogg)->push_lock); \
+ } while(0)
+
+#define GST_PUSH_UNLOCK(ogg) \
+ do { \
+ GST_TRACE_OBJECT(ogg, "Push unlock"); \
+ g_mutex_unlock((ogg)->push_lock); \
+ } while(0)
+
+GST_DEBUG_CATEGORY (gst_ogg_demux_debug);
+GST_DEBUG_CATEGORY (gst_ogg_demux_setup_debug);
+#define GST_CAT_DEFAULT gst_ogg_demux_debug
+
+
+static ogg_packet *
+_ogg_packet_copy (const ogg_packet * packet)
+{
+ ogg_packet *ret = g_slice_new (ogg_packet);
+
+ *ret = *packet;
+ ret->packet = g_memdup (packet->packet, packet->bytes);
+
+ return ret;
+}
+
+static void
+_ogg_packet_free (ogg_packet * packet)
+{
+ g_free (packet->packet);
+ g_slice_free (ogg_packet, packet);
+}
+
+static ogg_page *
+gst_ogg_page_copy (ogg_page * page)
+{
+ ogg_page *p = g_slice_new (ogg_page);
+
+ /* make a copy of the page */
+ p->header = g_memdup (page->header, page->header_len);
+ p->header_len = page->header_len;
+ p->body = g_memdup (page->body, page->body_len);
+ p->body_len = page->body_len;
+
+ return p;
+}
+
+static void
+gst_ogg_page_free (ogg_page * page)
+{
+ g_free (page->header);
+ g_free (page->body);
+ g_slice_free (ogg_page, page);
+}
+
+static gboolean gst_ogg_demux_collect_chain_info (GstOggDemux * ogg,
+ GstOggChain * chain);
+static gboolean gst_ogg_demux_activate_chain (GstOggDemux * ogg,
+ GstOggChain * chain, GstEvent * event);
+static void gst_ogg_pad_mark_discont (GstOggPad * pad);
+static void gst_ogg_chain_mark_discont (GstOggChain * chain);
+
+static gboolean gst_ogg_demux_perform_seek (GstOggDemux * ogg,
+ GstEvent * event);
+static gboolean gst_ogg_demux_receive_event (GstElement * element,
+ GstEvent * event);
+
+static void gst_ogg_pad_dispose (GObject * object);
+static void gst_ogg_pad_finalize (GObject * object);
+
+static const GstQueryType *gst_ogg_pad_query_types (GstPad * pad);
+static gboolean gst_ogg_pad_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_ogg_pad_event (GstPad * pad, GstEvent * event);
+static GstOggPad *gst_ogg_chain_get_stream (GstOggChain * chain,
+ guint32 serialno);
+
+static GstFlowReturn gst_ogg_demux_combine_flows (GstOggDemux * ogg,
+ GstOggPad * pad, GstFlowReturn ret);
+static void gst_ogg_demux_sync_streams (GstOggDemux * ogg);
+
+GstCaps *gst_ogg_demux_set_header_on_caps (GstOggDemux * ogg,
+ GstCaps * caps, GList * headers);
+static gboolean gst_ogg_demux_send_event (GstOggDemux * ogg, GstEvent * event);
+static gboolean gst_ogg_demux_perform_seek_push (GstOggDemux * ogg,
+ GstEvent * event);
+static gboolean gst_ogg_demux_check_duration_push (GstOggDemux * ogg,
+ GstSeekFlags flags, GstEvent * event);
+
+GType gst_ogg_pad_get_type (void);
+G_DEFINE_TYPE (GstOggPad, gst_ogg_pad, GST_TYPE_PAD);
+
+static void
+gst_ogg_pad_class_init (GstOggPadClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ gobject_class->dispose = gst_ogg_pad_dispose;
+ gobject_class->finalize = gst_ogg_pad_finalize;
+}
+
+static void
+gst_ogg_pad_init (GstOggPad * pad)
+{
+ gst_pad_set_event_function (GST_PAD (pad),
+ GST_DEBUG_FUNCPTR (gst_ogg_pad_event));
+ gst_pad_set_query_type_function (GST_PAD (pad),
+ GST_DEBUG_FUNCPTR (gst_ogg_pad_query_types));
+ gst_pad_set_query_function (GST_PAD (pad),
+ GST_DEBUG_FUNCPTR (gst_ogg_pad_src_query));
+ gst_pad_use_fixed_caps (GST_PAD (pad));
+
+ pad->mode = GST_OGG_PAD_MODE_INIT;
+
+ pad->current_granule = -1;
+ pad->keyframe_granule = -1;
+
+ pad->start_time = GST_CLOCK_TIME_NONE;
+
+ pad->position = GST_CLOCK_TIME_NONE;
+
+ pad->have_type = FALSE;
+ pad->continued = NULL;
+ pad->map.headers = NULL;
+ pad->map.queued = NULL;
+
+ pad->map.granulerate_n = 0;
+ pad->map.granulerate_d = 0;
+ pad->map.granuleshift = -1;
+}
+
+static void
+gst_ogg_pad_dispose (GObject * object)
+{
+ GstOggPad *pad = GST_OGG_PAD (object);
+
+ pad->chain = NULL;
+ pad->ogg = NULL;
+
+ g_list_foreach (pad->map.headers, (GFunc) _ogg_packet_free, NULL);
+ g_list_free (pad->map.headers);
+ pad->map.headers = NULL;
+ g_list_foreach (pad->map.queued, (GFunc) _ogg_packet_free, NULL);
+ g_list_free (pad->map.queued);
+ pad->map.queued = NULL;
+
+ g_free (pad->map.index);
+ pad->map.index = NULL;
+
+ /* clear continued pages */
+ g_list_foreach (pad->continued, (GFunc) gst_ogg_page_free, NULL);
+ g_list_free (pad->continued);
+ pad->continued = NULL;
+
+ if (pad->map.caps) {
+ gst_caps_unref (pad->map.caps);
+ pad->map.caps = NULL;
+ }
+
+ if (pad->map.taglist) {
+ gst_tag_list_free (pad->map.taglist);
+ pad->map.taglist = NULL;
+ }
+
+ ogg_stream_reset (&pad->map.stream);
+
+ G_OBJECT_CLASS (gst_ogg_pad_parent_class)->dispose (object);
+}
+
+static void
+gst_ogg_pad_finalize (GObject * object)
+{
+ GstOggPad *pad = GST_OGG_PAD (object);
+
+ ogg_stream_clear (&pad->map.stream);
+
+ G_OBJECT_CLASS (gst_ogg_pad_parent_class)->finalize (object);
+}
+
+static const GstQueryType *
+gst_ogg_pad_query_types (GstPad * pad)
+{
+ static const GstQueryType query_types[] = {
+ GST_QUERY_DURATION,
+ GST_QUERY_SEEKING,
+ 0
+ };
+
+ return query_types;
+}
+
+static gboolean
+gst_ogg_pad_src_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:
+ {
+ GstFormat format;
+ gint64 total_time = -1;
+
+ gst_query_parse_duration (query, &format, NULL);
+ /* can only get position in time */
+ if (format != GST_FORMAT_TIME)
+ goto wrong_format;
+
+ if (ogg->total_time != -1) {
+ /* we can return the total length */
+ total_time = ogg->total_time;
+ } else {
+ gint bitrate = ogg->bitrate;
+
+ /* try with length and bitrate */
+ if (bitrate > 0) {
+ GstQuery *uquery;
+
+ /* ask upstream for total length in bytes */
+ uquery = gst_query_new_duration (GST_FORMAT_BYTES);
+ if (gst_pad_peer_query (ogg->sinkpad, uquery)) {
+ gint64 length;
+
+ gst_query_parse_duration (uquery, NULL, &length);
+
+ /* estimate using the bitrate */
+ total_time =
+ gst_util_uint64_scale (length, 8 * GST_SECOND, bitrate);
+
+ GST_LOG_OBJECT (ogg,
+ "length: %" G_GINT64_FORMAT ", bitrate %d, total_time %"
+ GST_TIME_FORMAT, length, bitrate, GST_TIME_ARGS (total_time));
+ }
+ gst_query_unref (uquery);
+ }
+ }
+
+ gst_query_set_duration (query, GST_FORMAT_TIME, total_time);
+ break;
+ }
+ case GST_QUERY_SEEKING:
+ {
+ GstFormat format;
+
+ gst_query_parse_seeking (query, &format, NULL, NULL, NULL);
+ if (format == GST_FORMAT_TIME) {
+ gboolean seekable = FALSE;
+ gint64 stop = -1;
+
+ if (ogg->pullmode) {
+ seekable = TRUE;
+ stop = ogg->total_time;
+ } else if (ogg->current_chain->streams->len) {
+ gint i;
+
+ seekable = FALSE;
+ for (i = 0; i < ogg->current_chain->streams->len; i++) {
+ GstOggPad *pad =
+ g_array_index (ogg->current_chain->streams, GstOggPad *, i);
+
+ seekable = TRUE;
+ if (pad->map.index != NULL && pad->map.n_index != 0) {
+ GstOggIndex *idx;
+ GstClockTime idx_time;
+
+ idx = &pad->map.index[pad->map.n_index - 1];
+ idx_time =
+ gst_util_uint64_scale (idx->timestamp, GST_SECOND,
+ pad->map.kp_denom);
+ if (stop == -1)
+ stop = idx_time;
+ else
+ stop = MAX (idx_time, stop);
+ } else {
+ stop = -1; /* we've no clue, sadly, without seeking */
+ }
+ }
+ }
+
+ gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, stop);
+ } else {
+ res = FALSE;
+ }
+ break;
+ }
+
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+done:
+ gst_object_unref (ogg);
+
+ return res;
+
+ /* ERRORS */
+wrong_format:
+ {
+ GST_DEBUG_OBJECT (ogg, "only query duration on TIME is supported");
+ res = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_ogg_demux_receive_event (GstElement * element, GstEvent * event)
+{
+ gboolean res;
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (element);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ /* now do the seek */
+ res = gst_ogg_demux_perform_seek (ogg, event);
+ gst_event_unref (event);
+ break;
+ default:
+ GST_DEBUG_OBJECT (ogg, "We only handle seek events here");
+ goto error;
+ }
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (ogg, "error handling event");
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_ogg_pad_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ /* now do the seek */
+ res = gst_ogg_demux_perform_seek (ogg, event);
+ gst_event_unref (event);
+ break;
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+ gst_object_unref (ogg);
+
+ return res;
+}
+
+static void
+gst_ogg_pad_reset (GstOggPad * pad)
+{
+ ogg_stream_reset (&pad->map.stream);
+
+ GST_DEBUG_OBJECT (pad, "doing reset");
+
+ /* clear continued pages */
+ g_list_foreach (pad->continued, (GFunc) gst_ogg_page_free, NULL);
+ g_list_free (pad->continued);
+ pad->continued = NULL;
+
+ pad->last_ret = GST_FLOW_OK;
+ pad->position = GST_CLOCK_TIME_NONE;
+ pad->current_granule = -1;
+ pad->keyframe_granule = -1;
+ pad->is_eos = FALSE;
+}
+
+/* queue data, basically takes the packet, puts it in a buffer and store the
+ * buffer in the queued list. */
+static GstFlowReturn
+gst_ogg_demux_queue_data (GstOggPad * pad, ogg_packet * packet)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ GstOggDemux *ogg = pad->ogg;
+#endif
+
+ GST_DEBUG_OBJECT (ogg, "%p queueing data serial %08x",
+ pad, pad->map.serialno);
+
+ pad->map.queued = g_list_append (pad->map.queued, _ogg_packet_copy (packet));
+
+ /* we are ok now */
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet,
+ gboolean push_headers)
+{
+ GstBuffer *buf = NULL;
+ GstFlowReturn ret, cret;
+ GstOggDemux *ogg = pad->ogg;
+ gint64 current_time;
+ GstOggChain *chain;
+ gint64 duration;
+ gint offset;
+ gint trim;
+ GstClockTime out_timestamp, out_duration;
+ guint64 out_offset, out_offset_end;
+ gboolean delta_unit = FALSE;
+
+ cret = GST_FLOW_OK;
+
+ GST_PUSH_LOCK (ogg);
+ if (!ogg->pullmode && ogg->push_state == PUSH_PLAYING
+ && ogg->push_time_length == GST_CLOCK_TIME_NONE
+ && !ogg->push_disable_seeking) {
+ if (!ogg->building_chain) {
+ /* we got all headers, now try to get duration */
+ if (!gst_ogg_demux_check_duration_push (ogg, GST_SEEK_FLAG_FLUSH, NULL)) {
+ GST_PUSH_UNLOCK (ogg);
+ return GST_FLOW_OK;
+ }
+ }
+ GST_PUSH_UNLOCK (ogg);
+ return GST_FLOW_OK;
+ }
+ GST_PUSH_UNLOCK (ogg);
+
+ GST_DEBUG_OBJECT (ogg,
+ "%p streaming to peer serial %08x", pad, pad->map.serialno);
+
+ if (pad->map.is_ogm) {
+ const guint8 *data;
+ long bytes;
+
+ data = packet->packet;
+ bytes = packet->bytes;
+
+ if (bytes < 1)
+ goto empty_packet;
+
+ if ((data[0] & 1) || (data[0] & 3 && pad->map.is_ogm_text)) {
+ /* We don't push header packets for OGM */
+ goto done;
+ }
+
+ offset = 1 + (((data[0] & 0xc0) >> 6) | ((data[0] & 0x02) << 1));
+ delta_unit = (((data[0] & 0x08) >> 3) == 0);
+
+ trim = 0;
+
+ /* Strip trailing \0 for subtitles */
+ if (pad->map.is_ogm_text) {
+ while (bytes && data[bytes - 1] == 0) {
+ trim++;
+ bytes--;
+ }
+ }
+ } else if (pad->map.is_vp8) {
+ if ((packet->bytes >= 7 && memcmp (packet->packet, "OVP80\2 ", 7) == 0) ||
+ packet->b_o_s ||
+ (packet->bytes >= 5 && memcmp (packet->packet, "OVP80", 5) == 0)) {
+ /* We don't push header packets for VP8 */
+ goto done;
+ }
+ offset = 0;
+ trim = 0;
+ } else {
+ offset = 0;
+ trim = 0;
+ }
+
+ /* get timing info for the packet */
+ if (gst_ogg_stream_packet_is_header (&pad->map, packet)) {
+ duration = 0;
+ GST_DEBUG_OBJECT (ogg, "packet is header");
+ } else {
+ duration = gst_ogg_stream_get_packet_duration (&pad->map, packet);
+ GST_DEBUG_OBJECT (ogg, "packet duration %" G_GUINT64_FORMAT, duration);
+ }
+
+ if (packet->b_o_s) {
+ out_timestamp = GST_CLOCK_TIME_NONE;
+ out_duration = GST_CLOCK_TIME_NONE;
+ out_offset = 0;
+ out_offset_end = -1;
+ } else {
+ if (packet->granulepos != -1) {
+ pad->current_granule = gst_ogg_stream_granulepos_to_granule (&pad->map,
+ packet->granulepos);
+ pad->keyframe_granule =
+ gst_ogg_stream_granulepos_to_key_granule (&pad->map,
+ packet->granulepos);
+ GST_DEBUG_OBJECT (ogg, "new granule %" G_GUINT64_FORMAT,
+ pad->current_granule);
+ } else if (ogg->segment.rate > 0.0 && pad->current_granule != -1) {
+ pad->current_granule += duration;
+ GST_DEBUG_OBJECT (ogg, "interpollating granule %" G_GUINT64_FORMAT,
+ pad->current_granule);
+ }
+ if (ogg->segment.rate < 0.0 && packet->granulepos == -1) {
+ /* negative rates, only set timestamp on the packets with a granulepos */
+ out_timestamp = -1;
+ out_duration = -1;
+ out_offset = -1;
+ out_offset_end = -1;
+ } else {
+ /* we only push buffers after we have a valid granule. This is done so that
+ * we nicely skip packets without a timestamp after a seek. This is ok
+ * because we base or seek on the packet after the page with the smaller
+ * timestamp. */
+ if (pad->current_granule == -1)
+ goto no_timestamp;
+
+ if (pad->map.is_ogm) {
+ out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
+ pad->current_granule);
+ out_duration = gst_util_uint64_scale (duration,
+ GST_SECOND * pad->map.granulerate_d, pad->map.granulerate_n);
+ } else if (pad->map.is_sparse) {
+ out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
+ pad->current_granule);
+ if (duration == GST_CLOCK_TIME_NONE) {
+ out_duration = GST_CLOCK_TIME_NONE;
+ } else {
+ out_duration = gst_util_uint64_scale (duration,
+ GST_SECOND * pad->map.granulerate_d, pad->map.granulerate_n);
+ }
+ } else {
+ out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
+ pad->current_granule - duration);
+ out_duration =
+ gst_ogg_stream_granule_to_time (&pad->map,
+ pad->current_granule) - out_timestamp;
+ }
+ out_offset_end =
+ gst_ogg_stream_granule_to_granulepos (&pad->map,
+ pad->current_granule, pad->keyframe_granule);
+ out_offset =
+ gst_ogg_stream_granule_to_time (&pad->map, pad->current_granule);
+ }
+ }
+
+ if (pad->map.is_ogm_text) {
+ /* check for invalid buffer sizes */
+ if (G_UNLIKELY (offset + trim >= packet->bytes))
+ goto empty_packet;
+ }
+
+ if (!pad->added)
+ goto not_added;
+
+ buf = gst_buffer_new_and_alloc (packet->bytes - offset - trim);
+
+ /* set delta flag for OGM content */
+ if (delta_unit)
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ /* copy packet in buffer */
+ gst_buffer_fill (buf, 0, packet->packet + offset,
+ packet->bytes - offset - trim);
+
+ GST_BUFFER_TIMESTAMP (buf) = out_timestamp;
+ GST_BUFFER_DURATION (buf) = out_duration;
+ GST_BUFFER_OFFSET (buf) = out_offset;
+ GST_BUFFER_OFFSET_END (buf) = out_offset_end;
+
+ /* Mark discont on the buffer */
+ if (pad->discont) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ pad->discont = FALSE;
+ }
+
+ pad->position = ogg->segment.position;
+
+ /* don't push the header packets when we are asked to skip them */
+ if (!packet->b_o_s || push_headers) {
+ ret = gst_pad_push (GST_PAD_CAST (pad), buf);
+ buf = NULL;
+
+ /* combine flows */
+ cret = gst_ogg_demux_combine_flows (ogg, pad, ret);
+ }
+
+ /* we're done with skeleton stuff */
+ if (pad->map.is_skeleton)
+ goto done;
+
+ /* check if valid granulepos, then we can calculate the current
+ * position. We know the granule for each packet but we only want to update
+ * the position when we have a valid granulepos on the packet because else
+ * our time jumps around for the different streams. */
+ if (packet->granulepos < 0)
+ goto done;
+
+ /* convert to time */
+ current_time = gst_ogg_stream_get_end_time_for_granulepos (&pad->map,
+ packet->granulepos);
+
+ /* convert to stream time */
+ if ((chain = pad->chain)) {
+ gint64 chain_start = 0;
+
+ if (chain->segment_start != GST_CLOCK_TIME_NONE)
+ chain_start = chain->segment_start;
+
+ current_time = current_time - chain_start + chain->begin_time;
+ }
+
+ /* and store as the current position */
+ ogg->segment.position = current_time;
+
+ GST_DEBUG_OBJECT (ogg, "ogg current time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (current_time));
+
+ /* check stream eos */
+ if ((ogg->segment.rate > 0.0 && ogg->segment.stop != GST_CLOCK_TIME_NONE &&
+ current_time > ogg->segment.stop) ||
+ (ogg->segment.rate < 0.0 && ogg->segment.start != GST_CLOCK_TIME_NONE &&
+ current_time < ogg->segment.start)) {
+ GST_DEBUG_OBJECT (ogg, "marking pad %p EOS", pad);
+ pad->is_eos = TRUE;
+ }
+
+done:
+ if (buf)
+ gst_buffer_unref (buf);
+ /* return combined flow result */
+ return cret;
+
+ /* special cases */
+empty_packet:
+ {
+ GST_DEBUG_OBJECT (ogg, "Skipping empty packet");
+ goto done;
+ }
+
+no_timestamp:
+ {
+ GST_DEBUG_OBJECT (ogg, "skipping packet: no valid granule found yet");
+ goto done;
+ }
+not_added:
+ {
+ GST_DEBUG_OBJECT (ogg, "pad not added yet");
+ goto done;
+ }
+}
+
+static guint64
+gst_ogg_demux_collect_start_time (GstOggDemux * ogg, GstOggChain * chain)
+{
+ gint i;
+ guint64 start_time = G_MAXUINT64;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.is_skeleton)
+ continue;
+
+ /* can do this if the pad start time is not defined */
+ GST_DEBUG_OBJECT (ogg, "Pad %08x (%s) start time is %" GST_TIME_FORMAT,
+ pad->map.serialno, gst_ogg_stream_get_media_type (&pad->map),
+ GST_TIME_ARGS (pad->start_time));
+ if (pad->start_time == GST_CLOCK_TIME_NONE) {
+ if (!pad->map.is_sparse) {
+ start_time = G_MAXUINT64;
+ break;
+ }
+ } else {
+ start_time = MIN (start_time, pad->start_time);
+ }
+ }
+ return start_time;
+}
+
+static GstClockTime
+gst_ogg_demux_collect_sync_time (GstOggDemux * ogg, GstOggChain * chain)
+{
+ gint i;
+ GstClockTime sync_time = GST_CLOCK_TIME_NONE;
+
+ if (!chain) {
+ GST_WARNING_OBJECT (ogg, "No chain!");
+ return GST_CLOCK_TIME_NONE;
+ }
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.is_sparse)
+ continue;
+
+ if (pad->push_sync_time == GST_CLOCK_TIME_NONE) {
+ sync_time = GST_CLOCK_TIME_NONE;
+ break;
+ } else {
+ if (sync_time == GST_CLOCK_TIME_NONE)
+ sync_time = pad->push_sync_time;
+ else
+ sync_time = MAX (sync_time, pad->push_sync_time);
+ }
+ }
+ return sync_time;
+}
+
+/* submit a packet to the oggpad, this function will run the
+ * typefind code for the pad if this is the first packet for this
+ * stream
+ */
+static GstFlowReturn
+gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet)
+{
+ gint64 granule;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ GstOggDemux *ogg = pad->ogg;
+
+ GST_DEBUG_OBJECT (ogg, "%p submit packet serial %08x",
+ pad, pad->map.serialno);
+
+ if (!pad->have_type) {
+ pad->have_type = gst_ogg_stream_setup_map (&pad->map, packet);
+ if (!pad->have_type) {
+ pad->map.caps = gst_caps_new_simple ("application/x-unknown", NULL);
+ }
+ if (pad->map.is_skeleton) {
+ GST_DEBUG_OBJECT (ogg, "we have a fishead");
+ /* copy values over to global ogg level */
+ ogg->basetime = pad->map.basetime;
+ ogg->prestime = pad->map.prestime;
+
+ /* use total time to update the total ogg time */
+ if (ogg->total_time == -1) {
+ ogg->total_time = pad->map.total_time;
+ } else if (pad->map.total_time > 0) {
+ ogg->total_time = MAX (ogg->total_time, pad->map.total_time);
+ }
+ }
+ if (pad->map.caps) {
+ gst_pad_set_caps (GST_PAD (pad), pad->map.caps);
+ } else {
+ GST_WARNING_OBJECT (ogg, "stream parser didn't create src pad caps");
+ }
+ }
+
+ if (pad->map.is_skeleton) {
+ guint32 serialno;
+ GstOggPad *skel_pad;
+ GstOggSkeleton type;
+
+ /* try to parse the serialno first */
+ if (gst_ogg_map_parse_fisbone (&pad->map, packet->packet, packet->bytes,
+ &serialno, &type)) {
+
+ GST_DEBUG_OBJECT (pad->ogg,
+ "got skeleton packet for stream 0x%08x", serialno);
+
+ skel_pad = gst_ogg_chain_get_stream (pad->chain, serialno);
+ if (skel_pad) {
+ switch (type) {
+ case GST_OGG_SKELETON_FISBONE:
+ /* parse the remainder of the fisbone in the pad with the serialno,
+ * note that we ignore the start_time as this is usually wrong for
+ * live streams */
+ gst_ogg_map_add_fisbone (&skel_pad->map, &pad->map, packet->packet,
+ packet->bytes, NULL);
+ break;
+ case GST_OGG_SKELETON_INDEX:
+ gst_ogg_map_add_index (&skel_pad->map, &pad->map, packet->packet,
+ packet->bytes);
+
+ /* use total time to update the total ogg time */
+ if (ogg->total_time == -1) {
+ ogg->total_time = skel_pad->map.total_time;
+ } else if (skel_pad->map.total_time > 0) {
+ ogg->total_time = MAX (ogg->total_time, skel_pad->map.total_time);
+ }
+ break;
+ default:
+ break;
+ }
+
+ } else {
+ GST_WARNING_OBJECT (pad->ogg,
+ "found skeleton fisbone for an unknown stream 0x%08x", serialno);
+ }
+ }
+ }
+
+ granule = gst_ogg_stream_granulepos_to_granule (&pad->map,
+ packet->granulepos);
+ if (granule != -1) {
+ GST_DEBUG_OBJECT (ogg, "%p has granulepos %" G_GINT64_FORMAT, pad, granule);
+ pad->current_granule = granule;
+ }
+
+ /* restart header packet count when seeing a b_o_s page;
+ * particularly useful following a seek or even following chain finding */
+ if (packet->b_o_s) {
+ GST_DEBUG_OBJECT (ogg, "b_o_s packet, resetting header packet count");
+ pad->map.n_header_packets_seen = 0;
+ if (!pad->map.have_headers) {
+ GST_DEBUG_OBJECT (ogg, "clearing header packets");
+ g_list_foreach (pad->map.headers, (GFunc) _ogg_packet_free, NULL);
+ g_list_free (pad->map.headers);
+ pad->map.headers = NULL;
+ }
+ }
+
+ /* Overload the value of b_o_s in ogg_packet with a flag whether or
+ * not this is a header packet. Maybe some day this could be cleaned
+ * up. */
+ packet->b_o_s = gst_ogg_stream_packet_is_header (&pad->map, packet);
+ if (!packet->b_o_s) {
+ GST_DEBUG ("found non-header packet");
+ pad->map.have_headers = TRUE;
+ if (pad->start_time == GST_CLOCK_TIME_NONE) {
+ gint64 duration = gst_ogg_stream_get_packet_duration (&pad->map, packet);
+ GST_DEBUG ("duration %" G_GINT64_FORMAT, duration);
+ if (duration != -1) {
+ pad->map.accumulated_granule += duration;
+ GST_DEBUG ("accumulated granule %" G_GINT64_FORMAT,
+ pad->map.accumulated_granule);
+ }
+
+ if (packet->granulepos != -1) {
+ ogg_int64_t start_granule;
+ gint64 granule;
+
+ granule = gst_ogg_stream_granulepos_to_granule (&pad->map,
+ packet->granulepos);
+
+ if (granule > pad->map.accumulated_granule)
+ start_granule = granule - pad->map.accumulated_granule;
+ else
+ start_granule = 0;
+
+ pad->start_time = gst_ogg_stream_granule_to_time (&pad->map,
+ start_granule);
+ GST_DEBUG_OBJECT (ogg,
+ "start time %" GST_TIME_FORMAT " (%" GST_TIME_FORMAT ") for %s",
+ GST_TIME_ARGS (pad->start_time), GST_TIME_ARGS (pad->start_time),
+ gst_ogg_stream_get_media_type (&pad->map));
+ } else {
+ packet->granulepos = gst_ogg_stream_granule_to_granulepos (&pad->map,
+ pad->map.accumulated_granule, pad->keyframe_granule);
+ }
+ }
+ } else {
+ /* look for tags in header packet (before inc header count) */
+ gst_ogg_stream_extract_tags (&pad->map, packet);
+ pad->map.n_header_packets_seen++;
+ if (!pad->map.have_headers) {
+ pad->map.headers =
+ g_list_append (pad->map.headers, _ogg_packet_copy (packet));
+ GST_DEBUG ("keeping header packet %d", pad->map.n_header_packets_seen);
+ }
+ }
+
+ /* we know the start_time of the pad data, see if we
+ * can activate the complete chain if this is a dynamic
+ * chain. We need all the headers too for this. */
+ if (pad->start_time != GST_CLOCK_TIME_NONE && pad->map.have_headers) {
+ GstOggChain *chain = pad->chain;
+
+ /* check if complete chain has start time */
+ if (chain == ogg->building_chain) {
+ GstEvent *event = NULL;
+
+ if (ogg->resync) {
+ guint64 start_time;
+
+ GST_DEBUG_OBJECT (ogg, "need to resync");
+
+ /* when we need to resync after a seek, we wait until we have received
+ * timestamps on all streams */
+ start_time = gst_ogg_demux_collect_start_time (ogg, chain);
+
+ if (start_time != G_MAXUINT64) {
+ gint64 segment_time;
+ GstSegment segment;
+
+ GST_DEBUG_OBJECT (ogg, "start_time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start_time));
+
+ if (chain->segment_start < start_time)
+ segment_time =
+ (start_time - chain->segment_start) + chain->begin_time;
+ else
+ segment_time = chain->begin_time;
+
+ /* create the newsegment event we are going to send out */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ GST_PUSH_LOCK (ogg);
+ if (!ogg->pullmode && ogg->push_state == PUSH_LINEAR2) {
+ /* if we are fast forwarding to the actual seek target,
+ ensure previous frames are clipped */
+ GST_DEBUG_OBJECT (ogg,
+ "Resynced, starting segment at %" GST_TIME_FORMAT
+ ", start_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->push_seek_time_original_target),
+ GST_TIME_ARGS (start_time));
+ segment.rate = ogg->push_seek_rate;
+ segment.start = ogg->push_seek_time_original_target;
+ segment.stop = -1;
+ segment.time = ogg->push_seek_time_original_target;
+ event = gst_event_new_segment (&segment);
+ ogg->push_state = PUSH_PLAYING;
+ } else {
+ segment.rate = ogg->segment.rate;
+ segment.applied_rate = ogg->segment.applied_rate;
+ segment.start = start_time;
+ segment.stop = chain->segment_stop;
+ segment.time = segment_time;
+ event = gst_event_new_segment (&segment);
+ }
+ GST_PUSH_UNLOCK (ogg);
+
+ ogg->resync = FALSE;
+ }
+ } else {
+ /* see if we have enough info to activate the chain, we have enough info
+ * when all streams have a valid start time. */
+ if (gst_ogg_demux_collect_chain_info (ogg, chain)) {
+ GstSegment segment;
+
+ GST_DEBUG_OBJECT (ogg, "segment_start: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->segment_start));
+ GST_DEBUG_OBJECT (ogg, "segment_stop: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->segment_stop));
+ GST_DEBUG_OBJECT (ogg, "segment_time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->begin_time));
+
+ /* create the newsegment event we are going to send out */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.rate = ogg->segment.rate;
+ segment.applied_rate = ogg->segment.applied_rate;
+ segment.start = chain->segment_start;
+ segment.stop = chain->segment_stop;
+ segment.time = chain->begin_time;
+ event = gst_event_new_segment (&segment);
+ }
+ }
+
+ if (event) {
+ gst_event_set_seqnum (event, ogg->seqnum);
+
+ gst_ogg_demux_activate_chain (ogg, chain, event);
+
+ ogg->building_chain = NULL;
+ }
+ }
+ }
+
+ /* if we are building a chain, store buffer for when we activate
+ * it. This path is taken if we operate in streaming mode. */
+ if (ogg->building_chain) {
+ /* bos packets where stored in the header list so we can discard
+ * them here*/
+ if (!packet->b_o_s)
+ ret = gst_ogg_demux_queue_data (pad, packet);
+ }
+ /* else we are completely streaming to the peer */
+ else {
+ ret = gst_ogg_demux_chain_peer (pad, packet, !ogg->pullmode);
+ }
+ return ret;
+}
+
+/* flush at most @npackets from the stream layer. All packets if
+ * @npackets is 0;
+ */
+static GstFlowReturn
+gst_ogg_pad_stream_out (GstOggPad * pad, gint npackets)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ gboolean done = FALSE;
+ GstOggDemux *ogg;
+
+ ogg = pad->ogg;
+
+ while (!done) {
+ int ret;
+ ogg_packet packet;
+
+ ret = ogg_stream_packetout (&pad->map.stream, &packet);
+ switch (ret) {
+ case 0:
+ GST_LOG_OBJECT (ogg, "packetout done");
+ done = TRUE;
+ break;
+ case -1:
+ GST_LOG_OBJECT (ogg, "packetout discont");
+ if (!pad->map.is_sparse) {
+ gst_ogg_chain_mark_discont (pad->chain);
+ } else {
+ gst_ogg_pad_mark_discont (pad);
+ }
+ break;
+ case 1:
+ GST_LOG_OBJECT (ogg, "packetout gave packet of size %ld", packet.bytes);
+ result = gst_ogg_pad_submit_packet (pad, &packet);
+ /* not linked is not a problem, it's possible that we are still
+ * collecting headers and that we don't have exposed the pads yet */
+ if (result == GST_FLOW_NOT_LINKED)
+ break;
+ else if (result <= GST_FLOW_UNEXPECTED)
+ goto could_not_submit;
+ break;
+ default:
+ GST_WARNING_OBJECT (ogg,
+ "invalid return value %d for ogg_stream_packetout, resetting stream",
+ ret);
+ gst_ogg_pad_reset (pad);
+ break;
+ }
+ if (npackets > 0) {
+ npackets--;
+ done = (npackets == 0);
+ }
+ }
+ return result;
+
+ /* ERRORS */
+could_not_submit:
+ {
+ GST_WARNING_OBJECT (ogg,
+ "could not submit packet for stream %08x, "
+ "error: %d", pad->map.serialno, result);
+ gst_ogg_pad_reset (pad);
+ return result;
+ }
+}
+
+static void
+gst_ogg_demux_setup_bisection_bounds (GstOggDemux * ogg)
+{
+ if (ogg->push_last_seek_time >= ogg->push_seek_time_target) {
+ GST_DEBUG_OBJECT (ogg, "We overshot by %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->push_last_seek_time - ogg->push_seek_time_target));
+ ogg->push_offset1 = ogg->push_last_seek_offset;
+ ogg->push_time1 = ogg->push_last_seek_time;
+ } else {
+ GST_DEBUG_OBJECT (ogg, "We undershot by %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->push_seek_time_target - ogg->push_last_seek_time));
+ ogg->push_offset0 = ogg->push_last_seek_offset;
+ ogg->push_time0 = ogg->push_last_seek_time;
+ }
+}
+
+static gint64
+gst_ogg_demux_estimate_bisection_target (GstOggDemux * ogg)
+{
+ gint64 best;
+ gint64 segment_bitrate;
+
+ /* we might not know the length of the stream in time,
+ so push_time1 might not be set */
+ GST_DEBUG_OBJECT (ogg,
+ "push time 1: %" GST_TIME_FORMAT ", dbytes %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (ogg->push_time1), ogg->push_offset1 - ogg->push_offset0);
+ if (ogg->push_time1 == GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (ogg,
+ "New segment to consider: bytes %" G_GINT64_FORMAT " %" G_GINT64_FORMAT
+ ", time %" GST_TIME_FORMAT " (open ended)", ogg->push_offset0,
+ ogg->push_offset1, GST_TIME_ARGS (ogg->push_time0));
+ if (ogg->push_last_seek_time == ogg->push_start_time) {
+ /* if we're at start and don't know the end time, we can't estimate
+ bitrate, so get the nominal declared bitrate as a failsafe, or some
+ random constant which will be discarded after we made a (probably
+ dire) first guess */
+ segment_bitrate = (ogg->bitrate > 0 ? ogg->bitrate : 1000);
+ } else {
+ segment_bitrate =
+ gst_util_uint64_scale (ogg->push_last_seek_offset - 0,
+ 8 * GST_SECOND, ogg->push_last_seek_time - ogg->push_start_time);
+ }
+ best =
+ ogg->push_offset0 +
+ gst_util_uint64_scale (ogg->push_seek_time_target - ogg->push_time0,
+ segment_bitrate, 8 * GST_SECOND);
+ } else {
+ GST_DEBUG_OBJECT (ogg,
+ "New segment to consider: bytes %" G_GINT64_FORMAT " %" G_GINT64_FORMAT
+ ", time %" GST_TIME_FORMAT " %" GST_TIME_FORMAT, ogg->push_offset0,
+ ogg->push_offset1, GST_TIME_ARGS (ogg->push_time0),
+ GST_TIME_ARGS (ogg->push_time1));
+ if (ogg->push_time0 == ogg->push_time1) {
+ best = ogg->push_offset0;
+ } else {
+ segment_bitrate =
+ gst_util_uint64_scale (ogg->push_offset1 - ogg->push_offset0,
+ 8 * GST_SECOND, ogg->push_time1 - ogg->push_time0);
+ GST_DEBUG_OBJECT (ogg,
+ "Local bitrate on the %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT
+ " segment: %" G_GINT64_FORMAT, GST_TIME_ARGS (ogg->push_time0),
+ GST_TIME_ARGS (ogg->push_time1), segment_bitrate);
+ best =
+ ogg->push_offset0 +
+ gst_util_uint64_scale (ogg->push_seek_time_target - ogg->push_time0,
+ segment_bitrate, 8 * GST_SECOND);
+ }
+ }
+
+ /* offset by typical page size */
+ best -= CHUNKSIZE;
+ if (best < ogg->push_offset0)
+ best = ogg->push_offset0;
+ if (best < 0)
+ best = 0;
+
+ return best;
+}
+
+static void
+gst_ogg_demux_record_keyframe_time (GstOggDemux * ogg, GstOggPad * pad,
+ ogg_int64_t granpos)
+{
+ gint64 kf_granule;
+ GstClockTime kf_time;
+
+ kf_granule = gst_ogg_stream_granulepos_to_key_granule (&pad->map, granpos);
+ kf_time = gst_ogg_stream_granule_to_time (&pad->map, kf_granule);
+
+ pad->push_kf_time = kf_time;
+}
+
+/* returns the earliest keyframe time for all non sparse pads in the chain,
+ * if known, and GST_CLOCK_TIME_NONE if not */
+static GstClockTime
+gst_ogg_demux_get_earliest_keyframe_time (GstOggDemux * ogg)
+{
+ GstClockTime t = GST_CLOCK_TIME_NONE;
+ GstOggChain *chain = ogg->building_chain;
+ int i;
+
+ if (!chain) {
+ GST_WARNING_OBJECT (ogg, "No chain!");
+ return GST_CLOCK_TIME_NONE;
+ }
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.is_sparse)
+ continue;
+ if (pad->push_kf_time == GST_CLOCK_TIME_NONE)
+ return GST_CLOCK_TIME_NONE;
+ if (t == GST_CLOCK_TIME_NONE || pad->push_kf_time < t)
+ t = pad->push_kf_time;
+ }
+
+ return t;
+}
+
+/* MUST be called with the push lock locked, and will unlock it
+ regardless of return value. */
+static GstFlowReturn
+gst_ogg_demux_seek_back_after_push_duration_check_unlock (GstOggDemux * ogg)
+{
+ GstEvent *event;
+
+ /* Get the delayed event, if any */
+ event = ogg->push_mode_seek_delayed_event;
+ ogg->push_mode_seek_delayed_event = NULL;
+
+ ogg->push_state = PUSH_PLAYING;
+
+ GST_PUSH_UNLOCK (ogg);
+
+ if (event) {
+ /* If there is one, perform it */
+ gst_ogg_demux_perform_seek_push (ogg, event);
+ } else {
+ /* If there wasn't, seek back at start to start normal playback */
+ GST_INFO_OBJECT (ogg, "Seeking back to 0 after duration check");
+ event = gst_event_new_seek (1.0, GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, 1, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ if (!gst_pad_push_event (ogg->sinkpad, event)) {
+ GST_WARNING_OBJECT (ogg, "Failed seeking back to start");
+ return GST_FLOW_ERROR;
+ }
+ }
+
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_ogg_pad_handle_push_mode_state (GstOggPad * pad, ogg_page * page)
+{
+ GstOggDemux *ogg = pad->ogg;
+ ogg_int64_t granpos = ogg_page_granulepos (page);
+
+ GST_PUSH_LOCK (ogg);
+ if (granpos >= 0) {
+ if (ogg->push_start_time == GST_CLOCK_TIME_NONE) {
+ ogg->push_start_time =
+ gst_ogg_stream_get_start_time_for_granulepos (&pad->map, granpos);
+ GST_DEBUG_OBJECT (ogg, "Stream start time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->push_start_time));
+ }
+ ogg->push_time_offset =
+ gst_ogg_stream_get_end_time_for_granulepos (&pad->map, granpos);
+ if (ogg->push_time_offset > 0) {
+ GST_DEBUG_OBJECT (ogg, "Bitrate since start: %" G_GUINT64_FORMAT,
+ gst_util_uint64_scale (ogg->push_byte_offset, 8 * GST_SECOND,
+ ogg->push_time_offset));
+ }
+
+ if (ogg->push_state == PUSH_DURATION) {
+ GstClockTime t =
+ gst_ogg_stream_get_end_time_for_granulepos (&pad->map, granpos);
+
+ if (ogg->total_time == GST_CLOCK_TIME_NONE || t > ogg->total_time) {
+ GST_DEBUG_OBJECT (ogg, "New total time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (t));
+ ogg->total_time = t;
+ ogg->push_time_length = t;
+ }
+
+ /* If we were determining the duration of the stream, we're now done,
+ and can get back to sending the original event we delayed.
+ We stop a bit before the end of the stream, as if we get a EOS
+ event and there is a queue2 upstream (such as when using playbin2),
+ it will pause the task *after* we come back from the EOS handler,
+ so we cannot prevent the pausing by issuing a seek. */
+ if (ogg->push_byte_offset + EOS_AVOIDANCE_THRESHOLD >=
+ ogg->push_byte_length) {
+ GstMessage *message;
+ GstFlowReturn res;
+
+ /* tell the pipeline we've just found out the duration */
+ GST_INFO_OBJECT (ogg, "New duration found: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->total_time));
+ message =
+ gst_message_new_duration (GST_OBJECT (ogg), GST_FORMAT_TIME,
+ ogg->total_time);
+ gst_element_post_message (GST_ELEMENT (ogg), message);
+
+ GST_DEBUG_OBJECT (ogg,
+ "We're close enough to the end, and we're scared "
+ "to get too close, seeking back to start");
+
+ res = gst_ogg_demux_seek_back_after_push_duration_check_unlock (ogg);
+ if (res != GST_FLOW_OK)
+ return res;
+ return GST_FLOW_SKIP_PUSH;
+ } else {
+ GST_PUSH_UNLOCK (ogg);
+ }
+ return GST_FLOW_SKIP_PUSH;
+ }
+ }
+
+ /* if we're seeking, look at time, and decide what to do */
+ if (ogg->push_state != PUSH_PLAYING && ogg->push_state != PUSH_LINEAR2) {
+ GstClockTime t;
+ gint64 best = -1;
+ GstEvent *sevent;
+ int res;
+ gboolean close_enough;
+
+ /* ignore -1 granpos when seeking, we want to sync on a real granpos */
+ if (granpos < 0) {
+ GST_PUSH_UNLOCK (ogg);
+ if (ogg_stream_pagein (&pad->map.stream, page) != 0)
+ goto choked;
+ return GST_FLOW_SKIP_PUSH;
+ }
+
+ t = gst_ogg_stream_get_end_time_for_granulepos (&pad->map, granpos);
+
+ if (ogg->push_state == PUSH_BISECT1 || ogg->push_state == PUSH_BISECT2) {
+ GstClockTime sync_time;
+
+ if (pad->push_sync_time == GST_CLOCK_TIME_NONE)
+ pad->push_sync_time = t;
+ GST_DEBUG_OBJECT (ogg, "Got timestamp %" GST_TIME_FORMAT " for %s",
+ GST_TIME_ARGS (t), gst_ogg_stream_get_media_type (&pad->map));
+ sync_time = gst_ogg_demux_collect_sync_time (ogg, ogg->building_chain);
+ if (sync_time == GST_CLOCK_TIME_NONE) {
+ GST_PUSH_UNLOCK (ogg);
+ GST_DEBUG_OBJECT (ogg,
+ "Not enough timing info collected for sync, waiting for more");
+ if (ogg_stream_pagein (&pad->map.stream, page) != 0)
+ goto choked;
+ return GST_FLOW_SKIP_PUSH;
+ }
+ ogg->push_last_seek_time = sync_time;
+
+ GST_DEBUG_OBJECT (ogg,
+ "Bisection just seeked at %" G_GINT64_FORMAT ", time %"
+ GST_TIME_FORMAT ", target was %" GST_TIME_FORMAT,
+ ogg->push_last_seek_offset,
+ GST_TIME_ARGS (ogg->push_last_seek_time),
+ GST_TIME_ARGS (ogg->push_seek_time_target));
+
+ if (ogg->push_time1 != GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (ogg,
+ "Interval was %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT " (%"
+ G_GINT64_FORMAT "), time %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT
+ " (%" GST_TIME_FORMAT ")", ogg->push_offset0, ogg->push_offset1,
+ ogg->push_offset1 - ogg->push_offset0,
+ GST_TIME_ARGS (ogg->push_time0), GST_TIME_ARGS (ogg->push_time1),
+ GST_TIME_ARGS (ogg->push_time1 - ogg->push_time0));
+ } else {
+ GST_DEBUG_OBJECT (ogg,
+ "Interval was %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT " (%"
+ G_GINT64_FORMAT "), time %" GST_TIME_FORMAT " - unknown",
+ ogg->push_offset0, ogg->push_offset1,
+ ogg->push_offset1 - ogg->push_offset0,
+ GST_TIME_ARGS (ogg->push_time0));
+ }
+
+ gst_ogg_demux_setup_bisection_bounds (ogg);
+
+ best = gst_ogg_demux_estimate_bisection_target (ogg);
+
+ if (ogg->push_seek_time_target == 0) {
+ GST_DEBUG_OBJECT (ogg, "Seeking to 0, deemed close enough");
+ close_enough = (ogg->push_last_seek_time == 0);
+ } else {
+ /* TODO: make this dependent on framerate ? */
+ GstClockTime threshold = GST_SECOND / 2;
+
+ /* We want to be within half a second before the target */
+ if (threshold > ogg->push_seek_time_target)
+ threshold = ogg->push_seek_time_target;
+ close_enough = ogg->push_last_seek_time < ogg->push_seek_time_target
+ && ogg->push_last_seek_time >=
+ ogg->push_seek_time_target - threshold;
+ GST_DEBUG_OBJECT (ogg,
+ "testing if we're close enough: %" GST_TIME_FORMAT " <= %"
+ GST_TIME_FORMAT " < %" GST_TIME_FORMAT " ? %s",
+ GST_TIME_ARGS (ogg->push_seek_time_target - threshold),
+ GST_TIME_ARGS (ogg->push_last_seek_time),
+ GST_TIME_ARGS (ogg->push_seek_time_target),
+ close_enough ? "Yes" : "No");
+ }
+
+ if (close_enough || best == ogg->push_last_seek_offset) {
+ if (ogg->push_state == PUSH_BISECT1) {
+ /* we now know the time segment we'll have to search for
+ the second bisection */
+ ogg->push_time0 = ogg->push_start_time;
+ ogg->push_offset0 = 0;
+
+ GST_DEBUG_OBJECT (ogg,
+ "Seek to %" GST_TIME_FORMAT
+ " (%lx) done, now gathering pages for all non-sparse streams",
+ GST_TIME_ARGS (ogg->push_seek_time_target), (long) granpos);
+ ogg->push_state = PUSH_LINEAR1;
+ } else {
+ /* If we're asked for an accurate seek, we'll go forward till
+ we get to the original seek target time, else we'll just drop
+ here at the keyframe */
+ if (ogg->push_seek_flags & GST_SEEK_FLAG_ACCURATE) {
+ GST_INFO_OBJECT (ogg,
+ "Seek to keyframe at %" GST_TIME_FORMAT " done (we're at %"
+ GST_TIME_FORMAT "), skipping to original target (%"
+ GST_TIME_FORMAT ")",
+ GST_TIME_ARGS (ogg->push_seek_time_target),
+ GST_TIME_ARGS (sync_time),
+ GST_TIME_ARGS (ogg->push_seek_time_original_target));
+ ogg->push_state = PUSH_LINEAR2;
+ } else {
+ GST_DEBUG_OBJECT (ogg, "Seek to keyframe done, playing");
+
+ /* we're synced to the seek target, so flush stream and stuff
+ any queued pages into the stream so we start decoding there */
+ ogg->push_state = PUSH_PLAYING;
+ }
+ GST_INFO_OBJECT (ogg, "Bisection needed %d + %d steps",
+ ogg->push_bisection_steps[0], ogg->push_bisection_steps[1]);
+ }
+ }
+ } else if (ogg->push_state == PUSH_LINEAR1) {
+ if (pad->push_kf_time == GST_CLOCK_TIME_NONE) {
+ GstClockTime earliest_keyframe_time;
+
+ gst_ogg_demux_record_keyframe_time (ogg, pad, granpos);
+ GST_DEBUG_OBJECT (ogg,
+ "Previous keyframe for %s stream at %" GST_TIME_FORMAT,
+ gst_ogg_stream_get_media_type (&pad->map),
+ GST_TIME_ARGS (pad->push_kf_time));
+ earliest_keyframe_time = gst_ogg_demux_get_earliest_keyframe_time (ogg);
+ if (earliest_keyframe_time != GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (ogg,
+ "All non sparse streams now have a previous keyframe time,"
+ "bisecting again to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (earliest_keyframe_time));
+ ogg->push_seek_time_target = earliest_keyframe_time;
+
+ ogg->push_state = PUSH_BISECT2;
+ best = gst_ogg_demux_estimate_bisection_target (ogg);
+ }
+ }
+ }
+
+ if (ogg->push_state == PUSH_BISECT1 || ogg->push_state == PUSH_BISECT2) {
+ gint i;
+
+ ogg_sync_reset (&ogg->sync);
+ for (i = 0; i < ogg->building_chain->streams->len; i++) {
+ GstOggPad *pad =
+ g_array_index (ogg->building_chain->streams, GstOggPad *, i);
+
+ pad->push_sync_time = GST_CLOCK_TIME_NONE;
+ ogg_stream_reset (&pad->map.stream);
+ }
+
+ GST_DEBUG_OBJECT (ogg,
+ "seeking to %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT, best,
+ (gint64) - 1);
+ /* do seek */
+ g_assert (best != -1);
+ ogg->push_bisection_steps[ogg->push_state == PUSH_BISECT2 ? 1 : 0]++;
+ sevent =
+ gst_event_new_seek (ogg->push_seek_rate, GST_FORMAT_BYTES,
+ ogg->push_seek_flags, GST_SEEK_TYPE_SET, best,
+ GST_SEEK_TYPE_NONE, -1);
+
+ GST_PUSH_UNLOCK (ogg);
+ res = gst_pad_push_event (ogg->sinkpad, sevent);
+ if (!res) {
+ /* We failed to send the seek event, notify the pipeline */
+ GST_ELEMENT_ERROR (ogg, RESOURCE, SEEK, (NULL), ("Failed to seek"));
+ return GST_FLOW_ERROR;
+ }
+ return GST_FLOW_SKIP_PUSH;
+ }
+
+ if (ogg->push_state != PUSH_PLAYING) {
+ GST_PUSH_UNLOCK (ogg);
+ return GST_FLOW_SKIP_PUSH;
+ }
+ }
+ GST_PUSH_UNLOCK (ogg);
+
+ return GST_FLOW_OK;
+
+choked:
+ {
+ GST_WARNING_OBJECT (ogg,
+ "ogg stream choked on page (serial %08x), "
+ "resetting stream", pad->map.serialno);
+ gst_ogg_pad_reset (pad);
+ /* we continue to recover */
+ return GST_FLOW_SKIP_PUSH;
+ }
+}
+
+/* submit a page to an oggpad, this function will then submit all
+ * the packets in the page.
+ */
+static GstFlowReturn
+gst_ogg_pad_submit_page (GstOggPad * pad, ogg_page * page)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ GstOggDemux *ogg;
+ gboolean continued = FALSE;
+
+ ogg = pad->ogg;
+
+ /* for negative rates we read pages backwards and must therefore be careful
+ * with continued pages */
+ if (ogg->segment.rate < 0.0) {
+ gint npackets;
+
+ continued = ogg_page_continued (page);
+
+ /* number of completed packets in the page */
+ npackets = ogg_page_packets (page);
+ if (!continued) {
+ /* page is not continued so it contains at least one packet start. It's
+ * possible that no packet ends on this page (npackets == 0). In that
+ * case, the next (continued) page(s) we kept contain the remainder of the
+ * packets. We mark npackets=1 to make us start decoding the pages in the
+ * remainder of the algorithm. */
+ if (npackets == 0)
+ npackets = 1;
+ }
+ GST_LOG_OBJECT (ogg, "continued: %d, %d packets", continued, npackets);
+
+ if (npackets == 0) {
+ GST_LOG_OBJECT (ogg, "no decodable packets, we need a previous page");
+ goto done;
+ }
+ }
+
+ /* keep track of time in push mode */
+ if (!ogg->pullmode) {
+ result = gst_ogg_pad_handle_push_mode_state (pad, page);
+ if (result == GST_FLOW_SKIP_PUSH)
+ return GST_FLOW_OK;
+ if (result != GST_FLOW_OK)
+ return result;
+ }
+
+ if (ogg_stream_pagein (&pad->map.stream, page) != 0)
+ goto choked;
+
+ /* flush all packets in the stream layer, this might not give a packet if
+ * the page had no packets finishing on the page (npackets == 0). */
+ result = gst_ogg_pad_stream_out (pad, 0);
+
+ if (pad->continued) {
+ ogg_packet packet;
+
+ /* now send the continued pages to the stream layer */
+ while (pad->continued) {
+ ogg_page *p = (ogg_page *) pad->continued->data;
+
+ GST_LOG_OBJECT (ogg, "submitting continued page %p", p);
+ if (ogg_stream_pagein (&pad->map.stream, p) != 0)
+ goto choked;
+
+ pad->continued = g_list_delete_link (pad->continued, pad->continued);
+
+ /* free the page */
+ gst_ogg_page_free (p);
+ }
+
+ GST_LOG_OBJECT (ogg, "flushing last continued packet");
+ /* flush 1 continued packet in the stream layer */
+ result = gst_ogg_pad_stream_out (pad, 1);
+
+ /* flush all remaining packets, we pushed them in the previous round.
+ * We don't use _reset() because we still want to get the discont when
+ * we submit a next page. */
+ while (ogg_stream_packetout (&pad->map.stream, &packet) != 0);
+ }
+
+done:
+ /* keep continued pages (only in reverse mode) */
+ if (continued) {
+ ogg_page *p = gst_ogg_page_copy (page);
+
+ GST_LOG_OBJECT (ogg, "keeping continued page %p", p);
+ pad->continued = g_list_prepend (pad->continued, p);
+ }
+
+ return result;
+
+choked:
+ {
+ GST_WARNING_OBJECT (ogg,
+ "ogg stream choked on page (serial %08x), "
+ "resetting stream", pad->map.serialno);
+ gst_ogg_pad_reset (pad);
+ /* we continue to recover */
+ return GST_FLOW_OK;
+ }
+}
+
+
+static GstOggChain *
+gst_ogg_chain_new (GstOggDemux * ogg)
+{
+ GstOggChain *chain = g_slice_new0 (GstOggChain);
+
+ GST_DEBUG_OBJECT (ogg, "creating new chain %p", chain);
+ chain->ogg = ogg;
+ chain->offset = -1;
+ chain->bytes = -1;
+ chain->have_bos = FALSE;
+ chain->streams = g_array_new (FALSE, TRUE, sizeof (GstOggPad *));
+ chain->begin_time = GST_CLOCK_TIME_NONE;
+ chain->segment_start = GST_CLOCK_TIME_NONE;
+ chain->segment_stop = GST_CLOCK_TIME_NONE;
+ chain->total_time = GST_CLOCK_TIME_NONE;
+
+ return chain;
+}
+
+static void
+gst_ogg_chain_free (GstOggChain * chain)
+{
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ gst_object_unref (pad);
+ }
+ g_array_free (chain->streams, TRUE);
+ g_slice_free (GstOggChain, chain);
+}
+
+static void
+gst_ogg_pad_mark_discont (GstOggPad * pad)
+{
+ pad->discont = TRUE;
+ pad->map.last_size = 0;
+}
+
+static void
+gst_ogg_chain_mark_discont (GstOggChain * chain)
+{
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ gst_ogg_pad_mark_discont (pad);
+ }
+}
+
+static void
+gst_ogg_chain_reset (GstOggChain * chain)
+{
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ gst_ogg_pad_reset (pad);
+ }
+}
+
+static GstOggPad *
+gst_ogg_chain_new_stream (GstOggChain * chain, guint32 serialno)
+{
+ GstOggPad *ret;
+ GstTagList *list;
+ gchar *name;
+
+ GST_DEBUG_OBJECT (chain->ogg,
+ "creating new stream %08x in chain %p", serialno, chain);
+
+ ret = g_object_new (GST_TYPE_OGG_PAD, NULL);
+ /* we own this one */
+ gst_object_ref_sink (ret);
+
+ GST_PAD_DIRECTION (ret) = GST_PAD_SRC;
+ gst_ogg_pad_mark_discont (ret);
+
+ ret->chain = chain;
+ ret->ogg = chain->ogg;
+
+ ret->map.serialno = serialno;
+ if (ogg_stream_init (&ret->map.stream, serialno) != 0)
+ goto init_failed;
+
+ name = g_strdup_printf ("serial_%08x", serialno);
+ gst_object_set_name (GST_OBJECT (ret), name);
+ g_free (name);
+
+ /* FIXME: either do something with it or remove it */
+ list = gst_tag_list_new ();
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_SERIAL, serialno,
+ NULL);
+ gst_tag_list_free (list);
+
+ GST_DEBUG_OBJECT (chain->ogg,
+ "created new ogg src %p for stream with serial %08x", ret, serialno);
+
+ g_array_append_val (chain->streams, ret);
+ gst_pad_set_active (GST_PAD_CAST (ret), TRUE);
+
+ return ret;
+
+ /* ERRORS */
+init_failed:
+ {
+ GST_ERROR ("Could not initialize ogg_stream struct for serial %08x",
+ serialno);
+ gst_object_unref (ret);
+ return NULL;
+ }
+}
+
+static GstOggPad *
+gst_ogg_chain_get_stream (GstOggChain * chain, guint32 serialno)
+{
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.serialno == serialno)
+ return pad;
+ }
+ return NULL;
+}
+
+static gboolean
+gst_ogg_chain_has_stream (GstOggChain * chain, guint32 serialno)
+{
+ return gst_ogg_chain_get_stream (chain, serialno) != NULL;
+}
+
+/* signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0
+ /* FILL ME */
+};
+
+static GstStaticPadTemplate ogg_demux_src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src_%d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate ogg_demux_sink_template_factory =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/ogg; application/x-annodex")
+ );
+
+static void gst_ogg_demux_finalize (GObject * object);
+
+static GstFlowReturn gst_ogg_demux_read_chain (GstOggDemux * ogg,
+ GstOggChain ** chain);
+static GstFlowReturn gst_ogg_demux_read_end_chain (GstOggDemux * ogg,
+ GstOggChain * chain);
+
+static gboolean gst_ogg_demux_sink_event (GstPad * pad, GstEvent * event);
+static void gst_ogg_demux_loop (GstOggPad * pad);
+static GstFlowReturn gst_ogg_demux_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_ogg_demux_sink_activate (GstPad * sinkpad);
+static gboolean gst_ogg_demux_sink_activate_pull (GstPad * sinkpad,
+ gboolean active);
+static gboolean gst_ogg_demux_sink_activate_push (GstPad * sinkpad,
+ gboolean active);
+static GstStateChangeReturn gst_ogg_demux_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void gst_ogg_print (GstOggDemux * demux);
+
+#define gst_ogg_demux_parent_class parent_class
+G_DEFINE_TYPE (GstOggDemux, gst_ogg_demux, GST_TYPE_ELEMENT);
+
+static void
+gst_ogg_demux_class_init (GstOggDemuxClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Ogg demuxer", "Codec/Demuxer",
+ "demux ogg streams (info about ogg: http://xiph.org)",
+ "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&ogg_demux_sink_template_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&ogg_demux_src_template_factory));
+
+ gstelement_class->change_state = gst_ogg_demux_change_state;
+ gstelement_class->send_event = gst_ogg_demux_receive_event;
+
+ gobject_class->finalize = gst_ogg_demux_finalize;
+}
+
+static void
+gst_ogg_demux_init (GstOggDemux * ogg)
+{
+ /* create the sink pad */
+ ogg->sinkpad =
+ gst_pad_new_from_static_template (&ogg_demux_sink_template_factory,
+ "sink");
+
+ gst_pad_set_event_function (ogg->sinkpad, gst_ogg_demux_sink_event);
+ gst_pad_set_chain_function (ogg->sinkpad, gst_ogg_demux_chain);
+ gst_pad_set_activate_function (ogg->sinkpad, gst_ogg_demux_sink_activate);
+ gst_pad_set_activatepull_function (ogg->sinkpad,
+ gst_ogg_demux_sink_activate_pull);
+ gst_pad_set_activatepush_function (ogg->sinkpad,
+ gst_ogg_demux_sink_activate_push);
+ gst_element_add_pad (GST_ELEMENT (ogg), ogg->sinkpad);
+
+ ogg->chain_lock = g_mutex_new ();
+ ogg->push_lock = g_mutex_new ();
+ ogg->chains = g_array_new (FALSE, TRUE, sizeof (GstOggChain *));
+
+ ogg->newsegment = NULL;
+}
+
+static void
+gst_ogg_demux_finalize (GObject * object)
+{
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (object);
+
+ g_array_free (ogg->chains, TRUE);
+ g_mutex_free (ogg->chain_lock);
+ g_mutex_free (ogg->push_lock);
+ ogg_sync_clear (&ogg->sync);
+
+ if (ogg->newsegment)
+ gst_event_unref (ogg->newsegment);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_ogg_demux_reset_streams (GstOggDemux * ogg)
+{
+ GstOggChain *chain;
+ guint i;
+
+ chain = ogg->current_chain;
+ if (chain == NULL)
+ return;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *stream = g_array_index (chain->streams, GstOggPad *, i);
+
+ stream->start_time = -1;
+ stream->map.accumulated_granule = 0;
+ }
+ ogg->building_chain = chain;
+ GST_DEBUG_OBJECT (ogg, "Resetting current chain");
+ ogg->current_chain = NULL;
+ ogg->resync = TRUE;
+}
+
+static gboolean
+gst_ogg_demux_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ res = gst_ogg_demux_send_event (ogg, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (ogg, "got a flush stop event");
+ ogg_sync_reset (&ogg->sync);
+ res = gst_ogg_demux_send_event (ogg, event);
+ if (ogg->pullmode || ogg->push_state != PUSH_DURATION) {
+ /* it's starting to feel reaaaally dirty :(
+ if we're on a spliced seek to get duration, don't reset streams,
+ we'll need them for the delayed seek */
+ gst_ogg_demux_reset_streams (ogg);
+ }
+ break;
+ case GST_EVENT_SEGMENT:
+ GST_DEBUG_OBJECT (ogg, "got a new segment event");
+ {
+ GstSegment segment;
+
+ gst_event_copy_segment (event, &segment);
+
+ if (segment.format == GST_FORMAT_BYTES) {
+ GST_PUSH_LOCK (ogg);
+ ogg->push_byte_offset = segment.start;
+ ogg->push_last_seek_offset = segment.start;
+ GST_PUSH_UNLOCK (ogg);
+ } else {
+ GST_WARNING_OBJECT (ogg, "unexpected segment format: %s",
+ gst_format_get_name (segment.format));
+ }
+ }
+ gst_event_unref (event);
+ res = TRUE;
+ break;
+ case GST_EVENT_EOS:
+ {
+ GST_DEBUG_OBJECT (ogg, "got an EOS event");
+#if 0
+ /* This would be what is needed (recover from EOS by going on to
+ the next step (issue the delayed seek)), but it does not work
+ if there is a queue2 upstream - see more details comment in
+ gst_ogg_pad_submit_page.
+ If I could find a way to bypass queue2 behavior, this should
+ be enabled. */
+ GST_PUSH_LOCK (ogg);
+ if (ogg->push_state == PUSH_DURATION) {
+ GST_DEBUG_OBJECT (ogg, "Got EOS while determining length");
+ res = gst_ogg_demux_seek_back_after_push_duration_check_unlock (ogg);
+ if (res != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (ogg, "Error seeking back after duration check: %d",
+ res);
+ }
+ break;
+ }
+ GST_PUSH_UNLOCK (ogg);
+#endif
+ res = gst_ogg_demux_send_event (ogg, event);
+ if (ogg->current_chain == NULL) {
+ GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL),
+ ("can't get first chain"));
+ }
+ break;
+ }
+ default:
+ res = gst_ogg_demux_send_event (ogg, event);
+ break;
+ }
+ gst_object_unref (ogg);
+
+ return res;
+}
+
+/* submit the given buffer to the ogg sync */
+static GstFlowReturn
+gst_ogg_demux_submit_buffer (GstOggDemux * ogg, GstBuffer * buffer)
+{
+ gsize size;
+ gchar *oggbuffer;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ size = gst_buffer_get_size (buffer);
+ GST_DEBUG_OBJECT (ogg, "submitting %" G_GSIZE_FORMAT " bytes", size);
+ if (G_UNLIKELY (size == 0))
+ goto done;
+
+ oggbuffer = ogg_sync_buffer (&ogg->sync, size);
+ if (G_UNLIKELY (oggbuffer == NULL))
+ goto no_buffer;
+
+ gst_buffer_extract (buffer, 0, oggbuffer, size);
+
+ if (G_UNLIKELY (ogg_sync_wrote (&ogg->sync, size) < 0))
+ goto write_failed;
+
+ if (!ogg->pullmode) {
+ GST_PUSH_LOCK (ogg);
+ ogg->push_byte_offset += size;
+ GST_PUSH_UNLOCK (ogg);
+ }
+
+done:
+ gst_buffer_unref (buffer);
+
+ return ret;
+
+ /* ERRORS */
+no_buffer:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DECODE,
+ (NULL), ("failed to get ogg sync buffer"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+write_failed:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DECODE, (NULL),
+ ("failed to write %" G_GSIZE_FORMAT " bytes to the sync buffer", size));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+/* in random access mode this code updates the current read position
+ * and resets the ogg sync buffer so that the next read will happen
+ * from this new location.
+ */
+static void
+gst_ogg_demux_seek (GstOggDemux * ogg, gint64 offset)
+{
+ GST_LOG_OBJECT (ogg, "seeking to %" G_GINT64_FORMAT, offset);
+
+ ogg->offset = offset;
+ ogg->read_offset = offset;
+ ogg_sync_reset (&ogg->sync);
+}
+
+/* read more data from the current offset and submit to
+ * the ogg sync layer.
+ */
+static GstFlowReturn
+gst_ogg_demux_get_data (GstOggDemux * ogg, gint64 end_offset)
+{
+ GstFlowReturn ret;
+ GstBuffer *buffer;
+
+ GST_LOG_OBJECT (ogg,
+ "get data %" G_GINT64_FORMAT " %" G_GINT64_FORMAT " %" G_GINT64_FORMAT,
+ ogg->read_offset, ogg->length, end_offset);
+
+ if (end_offset > 0 && ogg->read_offset >= end_offset)
+ goto boundary_reached;
+
+ if (ogg->read_offset == ogg->length)
+ goto eos;
+
+ ret = gst_pad_pull_range (ogg->sinkpad, ogg->read_offset, CHUNKSIZE, &buffer);
+ if (ret != GST_FLOW_OK)
+ goto error;
+
+ ogg->read_offset += gst_buffer_get_size (buffer);
+
+ ret = gst_ogg_demux_submit_buffer (ogg, buffer);
+
+ return ret;
+
+ /* ERROR */
+boundary_reached:
+ {
+ GST_LOG_OBJECT (ogg, "reached boundary");
+ return GST_FLOW_LIMIT;
+ }
+eos:
+ {
+ GST_LOG_OBJECT (ogg, "reached EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+error:
+ {
+ GST_WARNING_OBJECT (ogg, "got %d (%s) from pull range", ret,
+ gst_flow_get_name (ret));
+ return ret;
+ }
+}
+
+/* Read the next page from the current offset.
+ * boundary: number of bytes ahead we allow looking for;
+ * -1 if no boundary
+ *
+ * @offset will contain the offset the next page starts at when this function
+ * returns GST_FLOW_OK.
+ *
+ * GST_FLOW_UNEXPECTED is returned on EOS.
+ *
+ * GST_FLOW_LIMIT is returned when we did not find a page before the
+ * boundary. If @boundary is -1, this is never returned.
+ *
+ * Any other error returned while retrieving data from the peer is returned as
+ * is.
+ */
+static GstFlowReturn
+gst_ogg_demux_get_next_page (GstOggDemux * ogg, ogg_page * og,
+ gint64 boundary, gint64 * offset)
+{
+ gint64 end_offset = -1;
+ GstFlowReturn ret;
+
+ GST_LOG_OBJECT (ogg,
+ "get next page, current offset %" G_GINT64_FORMAT ", bytes boundary %"
+ G_GINT64_FORMAT, ogg->offset, boundary);
+
+ if (boundary >= 0)
+ end_offset = ogg->offset + boundary;
+
+ while (TRUE) {
+ glong more;
+
+ if (end_offset > 0 && ogg->offset >= end_offset)
+ goto boundary_reached;
+
+ more = ogg_sync_pageseek (&ogg->sync, og);
+
+ GST_LOG_OBJECT (ogg, "pageseek gave %ld", more);
+
+ if (more < 0) {
+ /* skipped n bytes */
+ ogg->offset -= more;
+ GST_LOG_OBJECT (ogg, "skipped %ld bytes, offset %" G_GINT64_FORMAT,
+ more, ogg->offset);
+ } else if (more == 0) {
+ /* we need more data */
+ if (boundary == 0)
+ goto boundary_reached;
+
+ GST_LOG_OBJECT (ogg, "need more data");
+ ret = gst_ogg_demux_get_data (ogg, end_offset);
+ if (ret != GST_FLOW_OK)
+ break;
+ } else {
+ gint64 res_offset = ogg->offset;
+
+ /* got a page. Return the offset at the page beginning,
+ advance the internal offset past the page end */
+ if (offset)
+ *offset = res_offset;
+ ret = GST_FLOW_OK;
+
+ ogg->offset += more;
+
+ GST_LOG_OBJECT (ogg,
+ "got page at %" G_GINT64_FORMAT ", serial %08x, end at %"
+ G_GINT64_FORMAT ", granule %" G_GINT64_FORMAT, res_offset,
+ ogg_page_serialno (og), ogg->offset,
+ (gint64) ogg_page_granulepos (og));
+ break;
+ }
+ }
+ GST_LOG_OBJECT (ogg, "returning %d", ret);
+
+ return ret;
+
+ /* ERRORS */
+boundary_reached:
+ {
+ GST_LOG_OBJECT (ogg,
+ "offset %" G_GINT64_FORMAT " >= end_offset %" G_GINT64_FORMAT,
+ ogg->offset, end_offset);
+ return GST_FLOW_LIMIT;
+ }
+}
+
+/* from the current offset, find the previous page, seeking backwards
+ * until we find the page.
+ */
+static GstFlowReturn
+gst_ogg_demux_get_prev_page (GstOggDemux * ogg, ogg_page * og, gint64 * offset)
+{
+ GstFlowReturn ret;
+ gint64 begin = ogg->offset;
+ gint64 end = begin;
+ gint64 cur_offset = -1;
+
+ GST_LOG_OBJECT (ogg, "getting page before %" G_GINT64_FORMAT, begin);
+
+ while (cur_offset == -1) {
+ begin -= CHUNKSIZE;
+ if (begin < 0)
+ begin = 0;
+
+ /* seek CHUNKSIZE back */
+ gst_ogg_demux_seek (ogg, begin);
+
+ /* now continue reading until we run out of data, if we find a page
+ * start, we save it. It might not be the final page as there could be
+ * another page after this one. */
+ while (ogg->offset < end) {
+ gint64 new_offset;
+
+ ret =
+ gst_ogg_demux_get_next_page (ogg, og, end - ogg->offset, &new_offset);
+ /* we hit the upper limit, offset contains the last page start */
+ if (ret == GST_FLOW_LIMIT) {
+ GST_LOG_OBJECT (ogg, "hit limit");
+ break;
+ }
+ /* something went wrong */
+ if (ret == GST_FLOW_UNEXPECTED) {
+ new_offset = 0;
+ GST_LOG_OBJECT (ogg, "got unexpected");
+ } else if (ret != GST_FLOW_OK) {
+ GST_LOG_OBJECT (ogg, "got error %d", ret);
+ return ret;
+ }
+
+ GST_LOG_OBJECT (ogg, "found page at %" G_GINT64_FORMAT, new_offset);
+
+ /* offset is next page start */
+ cur_offset = new_offset;
+ }
+ }
+
+ GST_LOG_OBJECT (ogg, "found previous page at %" G_GINT64_FORMAT, cur_offset);
+
+ /* we have the offset. Actually snork and hold the page now */
+ gst_ogg_demux_seek (ogg, cur_offset);
+ ret = gst_ogg_demux_get_next_page (ogg, og, -1, NULL);
+ if (ret != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (ogg, "can't get last page at %" G_GINT64_FORMAT,
+ cur_offset);
+ /* this shouldn't be possible */
+ return ret;
+ }
+
+ if (offset)
+ *offset = cur_offset;
+
+ return ret;
+}
+
+static gboolean
+gst_ogg_demux_deactivate_current_chain (GstOggDemux * ogg)
+{
+ gint i;
+ GstOggChain *chain = ogg->current_chain;
+
+ if (chain == NULL)
+ return TRUE;
+
+ GST_DEBUG_OBJECT (ogg, "deactivating chain %p", chain);
+
+ /* send EOS on all the pads */
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+ GstEvent *event;
+
+ if (!pad->added)
+ continue;
+
+ event = gst_event_new_eos ();
+ gst_event_set_seqnum (event, ogg->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (pad), event);
+
+ GST_DEBUG_OBJECT (ogg, "removing pad %" GST_PTR_FORMAT, pad);
+
+ /* deactivate first */
+ gst_pad_set_active (GST_PAD_CAST (pad), FALSE);
+
+ gst_element_remove_pad (GST_ELEMENT (ogg), GST_PAD_CAST (pad));
+
+ pad->added = FALSE;
+ }
+ /* With push mode seeking implemented, we can now seek back to the chain,
+ so we do not destroy it */
+ GST_DEBUG_OBJECT (ogg, "Resetting current chain");
+ ogg->current_chain = NULL;
+
+ return TRUE;
+}
+
+GstCaps *
+gst_ogg_demux_set_header_on_caps (GstOggDemux * ogg, GstCaps * caps,
+ GList * headers)
+{
+ GstStructure *structure;
+ GValue array = { 0 };
+
+ GST_LOG_OBJECT (ogg, "caps: %" GST_PTR_FORMAT, caps);
+
+ if (G_UNLIKELY (!caps))
+ return NULL;
+ if (G_UNLIKELY (!headers))
+ return NULL;
+
+ caps = gst_caps_make_writable (caps);
+ structure = gst_caps_get_structure (caps, 0);
+
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ while (headers) {
+ GValue value = { 0 };
+ GstBuffer *buffer;
+ ogg_packet *op = headers->data;
+ g_assert (op);
+ buffer = gst_buffer_new_and_alloc (op->bytes);
+ gst_buffer_fill (buffer, 0, op->packet, op->bytes);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_take_buffer (&value, buffer);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ headers = headers->next;
+ }
+
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+ GST_LOG_OBJECT (ogg, "here are the newly set caps: %" GST_PTR_FORMAT, caps);
+
+ return caps;
+}
+
+static void
+gst_ogg_demux_push_queued_buffers (GstOggDemux * ogg, GstOggPad * pad)
+{
+ GList *walk;
+
+ /* push queued packets */
+ for (walk = pad->map.queued; walk; walk = g_list_next (walk)) {
+ ogg_packet *p = walk->data;
+
+ gst_ogg_demux_chain_peer (pad, p, TRUE);
+ _ogg_packet_free (p);
+ }
+ /* and free the queued buffers */
+ g_list_free (pad->map.queued);
+ pad->map.queued = NULL;
+}
+
+static gboolean
+gst_ogg_demux_activate_chain (GstOggDemux * ogg, GstOggChain * chain,
+ GstEvent * event)
+{
+ gint i;
+ gint bitrate, idx_bitrate;
+
+ g_return_val_if_fail (chain != NULL, FALSE);
+
+ if (chain == ogg->current_chain) {
+ if (event)
+ gst_event_unref (event);
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+ gst_ogg_demux_push_queued_buffers (ogg, pad);
+ }
+ return TRUE;
+ }
+
+
+ GST_DEBUG_OBJECT (ogg, "activating chain %p", chain);
+
+ bitrate = idx_bitrate = 0;
+
+ /* first add the pads */
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad;
+
+ pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.idx_bitrate)
+ idx_bitrate = MAX (idx_bitrate, pad->map.idx_bitrate);
+
+ bitrate += pad->map.bitrate;
+
+ /* mark discont */
+ gst_ogg_pad_mark_discont (pad);
+ pad->last_ret = GST_FLOW_OK;
+
+ if (pad->map.is_skeleton || pad->added
+ || !gst_pad_has_current_caps (GST_PAD_CAST (pad)))
+ continue;
+
+ GST_DEBUG_OBJECT (ogg, "adding pad %" GST_PTR_FORMAT, pad);
+
+ /* activate first */
+ gst_pad_set_active (GST_PAD_CAST (pad), TRUE);
+
+ gst_element_add_pad (GST_ELEMENT (ogg), GST_PAD_CAST (pad));
+ pad->added = TRUE;
+ }
+ /* prefer the index bitrate over the ones encoded in the streams */
+ ogg->bitrate = (idx_bitrate ? idx_bitrate : bitrate);
+
+ /* after adding the new pads, remove the old pads */
+ gst_ogg_demux_deactivate_current_chain (ogg);
+
+ GST_DEBUG_OBJECT (ogg, "Setting current chain to %p", chain);
+ ogg->current_chain = chain;
+
+ /* we are finished now */
+ gst_element_no_more_pads (GST_ELEMENT (ogg));
+
+ /* FIXME, must be sent from the streaming thread */
+ if (event) {
+ gst_ogg_demux_send_event (ogg, event);
+
+ gst_element_found_tags (GST_ELEMENT_CAST (ogg),
+ gst_tag_list_new_full (GST_TAG_CONTAINER_FORMAT, "Ogg", NULL));
+ }
+
+ GST_DEBUG_OBJECT (ogg, "starting chain");
+
+ /* then send out any headers and queued packets */
+ for (i = 0; i < chain->streams->len; i++) {
+ GList *walk;
+ GstOggPad *pad;
+
+ pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ /* FIXME also streaming thread */
+ if (pad->map.taglist) {
+ GST_DEBUG_OBJECT (ogg, "pushing tags");
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (ogg),
+ GST_PAD_CAST (pad), pad->map.taglist);
+ pad->map.taglist = NULL;
+ }
+
+ /* Set headers on caps */
+ pad->map.caps =
+ gst_ogg_demux_set_header_on_caps (ogg, pad->map.caps, pad->map.headers);
+ gst_pad_set_caps (GST_PAD_CAST (pad), pad->map.caps);
+
+ GST_DEBUG_OBJECT (ogg, "pushing headers");
+ /* push headers */
+ for (walk = pad->map.headers; walk; walk = g_list_next (walk)) {
+ ogg_packet *p = walk->data;
+
+ gst_ogg_demux_chain_peer (pad, p, TRUE);
+ }
+
+ GST_DEBUG_OBJECT (ogg, "pushing queued buffers");
+ gst_ogg_demux_push_queued_buffers (ogg, pad);
+ }
+ return TRUE;
+}
+
+static gboolean
+do_binary_search (GstOggDemux * ogg, GstOggChain * chain, gint64 begin,
+ gint64 end, gint64 begintime, gint64 endtime, gint64 target,
+ gint64 * offset)
+{
+ gint64 best;
+ GstFlowReturn ret;
+ gint64 result = 0;
+
+ best = begin;
+
+ GST_DEBUG_OBJECT (ogg,
+ "chain offset %" G_GINT64_FORMAT ", end offset %" G_GINT64_FORMAT,
+ begin, end);
+ GST_DEBUG_OBJECT (ogg,
+ "chain begin time %" GST_TIME_FORMAT ", end time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (begintime), GST_TIME_ARGS (endtime));
+ GST_DEBUG_OBJECT (ogg, "target %" GST_TIME_FORMAT, GST_TIME_ARGS (target));
+
+ /* perform the seek */
+ while (begin < end) {
+ gint64 bisect;
+
+ if ((end - begin < CHUNKSIZE) || (endtime == begintime)) {
+ bisect = begin;
+ } else {
+ /* take a (pretty decent) guess, avoiding overflow */
+ gint64 rate = (end - begin) * GST_MSECOND / (endtime - begintime);
+
+ bisect = (target - begintime) / GST_MSECOND * rate + begin - CHUNKSIZE;
+
+ if (bisect <= begin)
+ bisect = begin;
+ GST_DEBUG_OBJECT (ogg, "Initial guess: %" G_GINT64_FORMAT, bisect);
+ }
+ gst_ogg_demux_seek (ogg, bisect);
+
+ while (begin < end) {
+ ogg_page og;
+
+ GST_DEBUG_OBJECT (ogg,
+ "after seek, bisect %" G_GINT64_FORMAT ", begin %" G_GINT64_FORMAT
+ ", end %" G_GINT64_FORMAT, bisect, begin, end);
+
+ ret = gst_ogg_demux_get_next_page (ogg, &og, end - ogg->offset, &result);
+ GST_LOG_OBJECT (ogg, "looking for next page returned %" G_GINT64_FORMAT,
+ result);
+
+ if (ret == GST_FLOW_LIMIT) {
+ /* we hit the upper limit, go back a bit */
+ if (bisect <= begin + 1) {
+ end = begin; /* found it */
+ } else {
+ if (bisect == 0)
+ goto seek_error;
+
+ bisect -= CHUNKSIZE;
+ if (bisect <= begin)
+ bisect = begin + 1;
+
+ gst_ogg_demux_seek (ogg, bisect);
+ }
+ } else if (ret == GST_FLOW_OK) {
+ /* found offset of next ogg page */
+ gint64 granulepos;
+ GstClockTime granuletime;
+ GstOggPad *pad;
+
+ /* get the granulepos */
+ GST_LOG_OBJECT (ogg, "found next ogg page at %" G_GINT64_FORMAT,
+ result);
+ granulepos = ogg_page_granulepos (&og);
+ if (granulepos == -1) {
+ GST_LOG_OBJECT (ogg, "granulepos of next page is -1");
+ continue;
+ }
+
+ /* get the stream */
+ pad = gst_ogg_chain_get_stream (chain, ogg_page_serialno (&og));
+ if (pad == NULL || pad->map.is_skeleton)
+ continue;
+
+ /* convert granulepos to time */
+ granuletime = gst_ogg_stream_get_end_time_for_granulepos (&pad->map,
+ granulepos);
+ if (granuletime < pad->start_time)
+ continue;
+
+ GST_LOG_OBJECT (ogg, "granulepos %" G_GINT64_FORMAT " maps to time %"
+ GST_TIME_FORMAT, granulepos, GST_TIME_ARGS (granuletime));
+
+ granuletime -= pad->start_time;
+ granuletime += chain->begin_time;
+
+ GST_DEBUG_OBJECT (ogg,
+ "found page with granule %" G_GINT64_FORMAT " and time %"
+ GST_TIME_FORMAT, granulepos, GST_TIME_ARGS (granuletime));
+
+ if (granuletime < target) {
+ best = result; /* raw offset of packet with granulepos */
+ begin = ogg->offset; /* raw offset of next page */
+ begintime = granuletime;
+
+ bisect = begin; /* *not* begin + 1 */
+ } else {
+ if (bisect <= begin + 1) {
+ end = begin; /* found it */
+ } else {
+ if (end == ogg->offset) { /* we're pretty close - we'd be stuck in */
+ end = result;
+ bisect -= CHUNKSIZE; /* an endless loop otherwise. */
+ if (bisect <= begin)
+ bisect = begin + 1;
+ gst_ogg_demux_seek (ogg, bisect);
+ } else {
+ end = result;
+ endtime = granuletime;
+ break;
+ }
+ }
+ }
+ } else
+ goto seek_error;
+ }
+ }
+ GST_DEBUG_OBJECT (ogg, "seeking to %" G_GINT64_FORMAT, best);
+ gst_ogg_demux_seek (ogg, best);
+ *offset = best;
+
+ return TRUE;
+
+ /* ERRORS */
+seek_error:
+ {
+ GST_DEBUG_OBJECT (ogg, "got a seek error");
+ return FALSE;
+ }
+}
+
+static gboolean
+do_index_search (GstOggDemux * ogg, GstOggChain * chain, gint64 begin,
+ gint64 end, gint64 begintime, gint64 endtime, gint64 target,
+ gint64 * p_offset, gint64 * p_timestamp)
+{
+ guint i;
+ guint64 timestamp, offset;
+ guint64 r_timestamp, r_offset;
+ gboolean result = FALSE;
+
+ target -= begintime;
+
+ r_offset = -1;
+ r_timestamp = -1;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ timestamp = target;
+ if (gst_ogg_map_search_index (&pad->map, TRUE, &timestamp, &offset)) {
+ GST_INFO ("found %" G_GUINT64_FORMAT " at offset %" G_GUINT64_FORMAT,
+ timestamp, offset);
+
+ if (r_offset == -1 || offset < r_offset) {
+ r_offset = offset;
+ r_timestamp = timestamp;
+ }
+ result |= TRUE;
+ }
+ }
+
+ if (p_timestamp)
+ *p_timestamp = r_timestamp;
+ if (p_offset)
+ *p_offset = r_offset;
+
+ return result;
+}
+
+/*
+ * do seek to time @position, return FALSE or chain and TRUE
+ */
+static gboolean
+gst_ogg_demux_do_seek (GstOggDemux * ogg, GstSegment * segment,
+ gboolean accurate, gboolean keyframe, GstOggChain ** rchain)
+{
+ guint64 position;
+ GstOggChain *chain = NULL;
+ gint64 begin, end;
+ gint64 begintime, endtime;
+ gint64 target, keytarget;
+ gint64 best;
+ gint64 total;
+ gint64 result = 0;
+ GstFlowReturn ret;
+ gint i, pending, len;
+ gboolean first_parsed_page = TRUE;
+
+ position = segment->position;
+
+ /* first find the chain to search in */
+ total = ogg->total_time;
+ if (ogg->chains->len == 0)
+ goto no_chains;
+
+ for (i = ogg->chains->len - 1; i >= 0; i--) {
+ chain = g_array_index (ogg->chains, GstOggChain *, i);
+ total -= chain->total_time;
+ if (position >= total)
+ break;
+ }
+
+ /* first step, locate page containing the required data */
+ begin = chain->offset;
+ end = chain->end_offset;
+ begintime = chain->begin_time;
+ endtime = begintime + chain->total_time;
+ target = position - total + begintime;
+
+ if (!do_binary_search (ogg, chain, begin, end, begintime, endtime, target,
+ &best))
+ goto seek_error;
+
+ /* second step: find pages for all streams, we use the keyframe_granule to keep
+ * track of which ones we saw. If we have seen a page for each stream we can
+ * calculate the positions of each keyframe. */
+ GST_DEBUG_OBJECT (ogg, "find keyframes");
+ len = pending = chain->streams->len;
+
+ /* figure out where the keyframes are */
+ keytarget = target;
+
+ while (TRUE) {
+ ogg_page og;
+ gint64 granulepos;
+ GstOggPad *pad;
+ GstClockTime keyframe_time, granule_time;
+
+ ret = gst_ogg_demux_get_next_page (ogg, &og, end - ogg->offset, &result);
+ GST_LOG_OBJECT (ogg, "looking for next page returned %" G_GINT64_FORMAT,
+ result);
+ if (ret == GST_FLOW_LIMIT) {
+ GST_LOG_OBJECT (ogg, "reached limit");
+ break;
+ } else if (ret != GST_FLOW_OK)
+ goto seek_error;
+
+ /* get the stream */
+ pad = gst_ogg_chain_get_stream (chain, ogg_page_serialno (&og));
+ if (pad == NULL)
+ continue;
+
+ if (pad->map.is_skeleton)
+ goto next;
+
+ granulepos = ogg_page_granulepos (&og);
+ if (granulepos == -1 || granulepos == 0) {
+ GST_LOG_OBJECT (ogg, "granulepos of next page is -1");
+ continue;
+ }
+
+ /* we only do this the first time we pass here */
+ if (first_parsed_page) {
+ /* Now that we have a time reference from the page, we can check
+ * whether all streams still have pages from here on.
+ *
+ * This would be more elegant before the loop, but getting the page from
+ * there without breaking anything would be more costly */
+ granule_time = gst_ogg_stream_get_end_time_for_granulepos (&pad->map,
+ granulepos);
+ for (i = 0; i < len; i++) {
+ GstOggPad *stream = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (stream == pad)
+ /* we already know we have at least one page (the current one)
+ * for this stream */
+ continue;
+
+ if (granule_time > stream->map.total_time)
+ /* we won't encounter any more pages of this stream, so we don't
+ * try finding a key frame for it */
+ pending--;
+ }
+ first_parsed_page = FALSE;
+ }
+
+
+ /* in reverse we want to go past the page with the lower timestamp */
+ if (segment->rate < 0.0) {
+ /* get time for this pad */
+ granule_time = gst_ogg_stream_get_end_time_for_granulepos (&pad->map,
+ granulepos);
+
+ GST_LOG_OBJECT (ogg,
+ "looking at page with ts %" GST_TIME_FORMAT ", target %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (granule_time),
+ GST_TIME_ARGS (target));
+ if (granule_time < target)
+ continue;
+ }
+
+ /* we've seen this pad before */
+ if (pad->keyframe_granule != -1)
+ continue;
+
+ /* convert granule of this pad to the granule of the keyframe */
+ pad->keyframe_granule =
+ gst_ogg_stream_granulepos_to_key_granule (&pad->map, granulepos);
+ GST_LOG_OBJECT (ogg, "marking stream granule %" G_GINT64_FORMAT,
+ pad->keyframe_granule);
+
+ /* get time of the keyframe */
+ keyframe_time =
+ gst_ogg_stream_granule_to_time (&pad->map, pad->keyframe_granule);
+ GST_LOG_OBJECT (ogg,
+ "stream %08x granule time %" GST_TIME_FORMAT,
+ pad->map.serialno, GST_TIME_ARGS (keyframe_time));
+
+ /* collect smallest value */
+ if (keyframe_time != -1) {
+ keyframe_time += begintime;
+ if (keyframe_time < keytarget)
+ keytarget = keyframe_time;
+ }
+
+ next:
+ pending--;
+ if (pending == 0)
+ break;
+ }
+
+ /* for negative rates we will get to the keyframe backwards */
+ if (segment->rate < 0.0)
+ goto done;
+
+ if (keytarget != target) {
+ GST_LOG_OBJECT (ogg, "final seek to target %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (keytarget));
+
+ /* last step, seek to the location of the keyframe */
+ if (!do_binary_search (ogg, chain, begin, end, begintime, endtime,
+ keytarget, &best))
+ goto seek_error;
+ } else {
+ /* seek back to previous position */
+ GST_LOG_OBJECT (ogg, "keyframe on target");
+ gst_ogg_demux_seek (ogg, best);
+ }
+
+done:
+ if (keyframe) {
+ if (segment->rate > 0.0)
+ segment->time = keytarget;
+ segment->position = keytarget - begintime;
+ }
+
+ *rchain = chain;
+
+ return TRUE;
+
+no_chains:
+ {
+ GST_DEBUG_OBJECT (ogg, "no chains");
+ return FALSE;
+ }
+seek_error:
+ {
+ GST_DEBUG_OBJECT (ogg, "got a seek error");
+ return FALSE;
+ }
+}
+
+/* does not take ownership of the event */
+static gboolean
+gst_ogg_demux_perform_seek_pull (GstOggDemux * ogg, GstEvent * event)
+{
+ GstOggChain *chain = NULL;
+ gboolean res;
+ gboolean flush, accurate, keyframe;
+ GstFormat format;
+ gdouble rate;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ gboolean update;
+ guint32 seqnum;
+ GstEvent *tevent;
+
+ if (event) {
+ GST_DEBUG_OBJECT (ogg, "seek with event");
+
+ 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 (ogg, "can only seek on TIME");
+ goto error;
+ }
+ seqnum = gst_event_get_seqnum (event);
+ } else {
+ GST_DEBUG_OBJECT (ogg, "seek without event");
+
+ flags = 0;
+ rate = 1.0;
+ seqnum = gst_util_seqnum_next ();
+ }
+
+ GST_DEBUG_OBJECT (ogg, "seek, rate %g", rate);
+
+ flush = flags & GST_SEEK_FLAG_FLUSH;
+ accurate = flags & GST_SEEK_FLAG_ACCURATE;
+ keyframe = flags & GST_SEEK_FLAG_KEY_UNIT;
+
+ /* first step is to unlock the streaming thread if it is
+ * blocked in a chain call, we do this by starting the flush. because
+ * we cannot yet hold any streaming lock, we have to protect the chains
+ * with their own lock. */
+ if (flush) {
+ gint i;
+
+ tevent = gst_event_new_flush_start ();
+ gst_event_set_seqnum (tevent, seqnum);
+
+ gst_event_ref (tevent);
+ gst_pad_push_event (ogg->sinkpad, tevent);
+
+ GST_CHAIN_LOCK (ogg);
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+ gint j;
+
+ for (j = 0; j < chain->streams->len; j++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, j);
+
+ gst_event_ref (tevent);
+ gst_pad_push_event (GST_PAD (pad), tevent);
+ }
+ }
+ GST_CHAIN_UNLOCK (ogg);
+
+ gst_event_unref (tevent);
+ } else {
+ gst_pad_pause_task (ogg->sinkpad);
+ }
+
+ /* 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_PAD_STREAM_LOCK (ogg->sinkpad);
+
+ if (event) {
+ gst_segment_do_seek (&ogg->segment, rate, format, flags,
+ cur_type, cur, stop_type, stop, &update);
+ }
+
+ GST_DEBUG_OBJECT (ogg, "segment positions set to %" GST_TIME_FORMAT "-%"
+ GST_TIME_FORMAT, GST_TIME_ARGS (ogg->segment.start),
+ GST_TIME_ARGS (ogg->segment.stop));
+
+ /* we need to stop flushing on the srcpad as we're going to use it
+ * next. We can do this as we have the STREAM lock now. */
+ if (flush) {
+ tevent = gst_event_new_flush_stop (TRUE);
+ gst_event_set_seqnum (tevent, seqnum);
+ gst_pad_push_event (ogg->sinkpad, tevent);
+ }
+
+ {
+ gint i;
+
+ /* reset all ogg streams now, need to do this from within the lock to
+ * make sure the streaming thread is not messing with the stream */
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+
+ gst_ogg_chain_reset (chain);
+ }
+ }
+
+ /* for reverse we will already seek accurately */
+ res = gst_ogg_demux_do_seek (ogg, &ogg->segment, accurate, keyframe, &chain);
+
+ /* seek failed, make sure we continue the current chain */
+ if (!res) {
+ GST_DEBUG_OBJECT (ogg, "seek failed");
+ chain = ogg->current_chain;
+ } else {
+ GST_DEBUG_OBJECT (ogg, "seek success");
+ }
+
+ if (!chain)
+ goto no_chain;
+
+ /* now we have a new position, prepare for streaming again */
+ {
+ GstEvent *event;
+ gint64 stop;
+ gint64 start;
+ gint64 position, begin_time;
+ GstSegment segment;
+
+ /* we have to send the flush to the old chain, not the new one */
+ if (flush) {
+ tevent = gst_event_new_flush_stop (TRUE);
+ gst_event_set_seqnum (tevent, seqnum);
+ gst_ogg_demux_send_event (ogg, tevent);
+ }
+
+ /* we need this to see how far inside the chain we need to start */
+ if (chain->begin_time != GST_CLOCK_TIME_NONE)
+ begin_time = chain->begin_time;
+ else
+ begin_time = 0;
+
+ /* segment.start gives the start over all chains, we calculate the amount
+ * of time into this chain we need to start */
+ start = ogg->segment.start - begin_time;
+ if (chain->segment_start != GST_CLOCK_TIME_NONE)
+ start += chain->segment_start;
+
+ if ((stop = ogg->segment.stop) == -1)
+ stop = ogg->segment.duration;
+
+ /* segment.stop gives the stop time over all chains, calculate the amount of
+ * time we need to stop in this chain */
+ if (stop != -1) {
+ if (stop > begin_time)
+ stop -= begin_time;
+ else
+ stop = 0;
+ stop += chain->segment_start;
+ /* we must stop when this chain ends and switch to the next chain to play
+ * the remainder of the segment. */
+ stop = MIN (stop, chain->segment_stop);
+ }
+
+ position = ogg->segment.position;
+ if (chain->segment_start != GST_CLOCK_TIME_NONE)
+ position += chain->segment_start;
+
+ gst_segment_copy_into (&ogg->segment, &segment);
+
+ /* create the segment event we are going to send out */
+ if (ogg->segment.rate >= 0.0) {
+ segment.start = position;
+ segment.stop = stop;
+ } else {
+ segment.start = start;
+ segment.stop = position;
+ }
+ event = gst_event_new_segment (&segment);
+ gst_event_set_seqnum (event, seqnum);
+
+ if (chain != ogg->current_chain) {
+ /* switch to different chain, send segment on new chain */
+ gst_ogg_demux_activate_chain (ogg, chain, event);
+ } else {
+ /* mark discont and send segment on current chain */
+ gst_ogg_chain_mark_discont (chain);
+ /* This event should be sent from the streaming thread (sink pad task) */
+ if (ogg->newsegment)
+ gst_event_unref (ogg->newsegment);
+ ogg->newsegment = event;
+ }
+
+ /* notify start of new segment */
+ if (ogg->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+ GstMessage *message;
+
+ message = gst_message_new_segment_start (GST_OBJECT (ogg),
+ GST_FORMAT_TIME, ogg->segment.position);
+ gst_message_set_seqnum (message, seqnum);
+
+ gst_element_post_message (GST_ELEMENT (ogg), message);
+ }
+
+ ogg->seqnum = seqnum;
+ /* restart our task since it might have been stopped when we did the
+ * flush. */
+ gst_pad_start_task (ogg->sinkpad, (GstTaskFunction) gst_ogg_demux_loop,
+ ogg->sinkpad);
+ }
+
+ /* streaming can continue now */
+ GST_PAD_STREAM_UNLOCK (ogg->sinkpad);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (ogg, "seek failed");
+ return FALSE;
+ }
+no_chain:
+ {
+ GST_DEBUG_OBJECT (ogg, "no chain to seek in");
+ GST_PAD_STREAM_UNLOCK (ogg->sinkpad);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_ogg_demux_get_duration_push (GstOggDemux * ogg, int flags)
+{
+ /* In push mode, we get to the end of the stream to get the duration */
+ gint64 position;
+ GstEvent *sevent;
+ gboolean res;
+
+ /* A full Ogg page can be almost 64 KB. There's no guarantee that there'll be a
+ granpos there, but it's fairly likely */
+ position =
+ ogg->push_byte_length - DURATION_CHUNK_OFFSET - EOS_AVOIDANCE_THRESHOLD;
+ if (position < 0)
+ position = 0;
+
+ GST_DEBUG_OBJECT (ogg,
+ "Getting duration, seeking near the end, to %" G_GINT64_FORMAT, position);
+ ogg->push_state = PUSH_DURATION;
+ /* do not read the last byte */
+ sevent = gst_event_new_seek (1.0, GST_FORMAT_BYTES, flags, GST_SEEK_TYPE_SET,
+ position, GST_SEEK_TYPE_SET, ogg->push_byte_length - 1);
+ res = gst_pad_push_event (ogg->sinkpad, sevent);
+ if (res) {
+ GST_DEBUG_OBJECT (ogg, "Seek succesful");
+ return TRUE;
+ } else {
+ GST_INFO_OBJECT (ogg, "Seek failed, duration will stay unknown");
+ ogg->push_state = PUSH_PLAYING;
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_ogg_demux_check_duration_push (GstOggDemux * ogg, GstSeekFlags flags,
+ GstEvent * event)
+{
+ if (ogg->push_byte_length < 0) {
+ GstPad *peer;
+
+ GST_DEBUG_OBJECT (ogg, "Trying to find byte/time length");
+ if ((peer = gst_pad_get_peer (ogg->sinkpad)) != NULL) {
+ gint64 length;
+ int res;
+
+ res = gst_pad_query_duration (peer, GST_FORMAT_BYTES, &length);
+ if (res && length > 0) {
+ ogg->push_byte_length = length;
+ GST_DEBUG_OBJECT (ogg,
+ "File byte length %" G_GINT64_FORMAT, ogg->push_byte_length);
+ }
+ res = gst_pad_query_duration (peer, GST_FORMAT_TIME, &length);
+ gst_object_unref (peer);
+ if (res && length >= 0) {
+ ogg->push_time_length = length;
+ GST_DEBUG_OBJECT (ogg, "File time length %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->push_time_length));
+ } else if (!ogg->push_disable_seeking) {
+ gboolean res;
+
+ res = gst_ogg_demux_get_duration_push (ogg, flags);
+ if (res) {
+ GST_DEBUG_OBJECT (ogg,
+ "File time length unknown, trying to determine");
+ ogg->push_mode_seek_delayed_event = NULL;
+ if (event) {
+ GST_DEBUG_OBJECT (ogg,
+ "Let me intercept this innocent looking seek request");
+ ogg->push_mode_seek_delayed_event = gst_event_copy (event);
+ }
+ return FALSE;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_ogg_demux_perform_seek_push (GstOggDemux * ogg, GstEvent * event)
+{
+ gint bitrate;
+ gboolean res = TRUE;
+ GstFormat format;
+ gdouble rate;
+ GstSeekFlags flags;
+ GstSeekType start_type, stop_type;
+ gint64 start, stop;
+ GstEvent *sevent;
+ GstOggChain *chain;
+ gint64 best, best_time;
+ gint i;
+
+ GST_DEBUG_OBJECT (ogg, "Push mode seek request received");
+
+ gst_event_parse_seek (event, &rate, &format, &flags,
+ &start_type, &start, &stop_type, &stop);
+
+ if (format != GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (ogg, "can only seek on TIME");
+ goto error;
+ }
+
+ if (start_type != GST_SEEK_TYPE_SET) {
+ GST_DEBUG_OBJECT (ogg, "can only seek to a SET target");
+ goto error;
+ }
+
+ if (!(flags & GST_SEEK_FLAG_FLUSH)) {
+ GST_DEBUG_OBJECT (ogg, "can only do flushing seeks");
+ goto error;
+ }
+
+ GST_DEBUG_OBJECT (ogg, "Push mode seek request: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start));
+
+ chain = ogg->current_chain;
+ if (!chain) {
+ GST_WARNING_OBJECT (ogg, "No chain to seek on");
+ goto error;
+ }
+
+ /* start accessing push_* members */
+ GST_PUSH_LOCK (ogg);
+
+ /* not if we disabled seeking (chained streams) */
+ if (ogg->push_disable_seeking) {
+ GST_DEBUG_OBJECT (ogg, "Seeking disabled");
+ goto error_locked;
+ }
+
+ /* not when we're trying to work out duration */
+ if (ogg->push_state == PUSH_DURATION) {
+ GST_DEBUG_OBJECT (ogg, "Busy working out duration, try again later");
+ goto error_locked;
+ }
+
+ /* actually, not if we're doing any seeking already */
+ if (ogg->push_state != PUSH_PLAYING) {
+ GST_DEBUG_OBJECT (ogg, "Already doing some seeking, try again later");
+ goto error_locked;
+ }
+
+ /* on the first seek, get length if we can */
+ if (!gst_ogg_demux_check_duration_push (ogg, flags, event)) {
+ GST_PUSH_UNLOCK (ogg);
+ return FALSE;
+ }
+
+ if (do_index_search (ogg, chain, 0, -1, 0, -1, start, &best, &best_time)) {
+ /* the index gave some result */
+ GST_DEBUG_OBJECT (ogg,
+ "found offset %" G_GINT64_FORMAT " with time %" G_GUINT64_FORMAT,
+ best, best_time);
+ } else {
+ if (ogg->push_time_length > 0) {
+ /* if we know the time length, we know the full segment bitrate */
+ GST_DEBUG_OBJECT (ogg, "Using real file bitrate");
+ bitrate =
+ gst_util_uint64_scale (ogg->push_byte_length, 8 * GST_SECOND,
+ ogg->push_time_length);
+ } else if (ogg->push_time_offset > 0) {
+ /* get a first approximation using known bitrate to the current position */
+ GST_DEBUG_OBJECT (ogg, "Using file bitrate so far");
+ bitrate =
+ gst_util_uint64_scale (ogg->push_byte_offset, 8 * GST_SECOND,
+ ogg->push_time_offset);
+ } else if (ogg->bitrate > 0) {
+ /* nominal bitrate is better than nothing, even if it lies often */
+ GST_DEBUG_OBJECT (ogg, "Using nominal bitrate");
+ bitrate = ogg->bitrate;
+ } else {
+ /* meh */
+ GST_DEBUG_OBJECT (ogg,
+ "At stream start, and no nominal bitrate, using some random magic "
+ "number to seed");
+ /* the bisection, once started, should give us a better approximation */
+ bitrate = 1000;
+ }
+ best = gst_util_uint64_scale (start, bitrate, 8 * GST_SECOND);
+ }
+
+ /* offset by typical page length, and ensure our best guess is within
+ reasonable bounds */
+ best -= CHUNKSIZE;
+ if (best < 0)
+ best = 0;
+ if (ogg->push_byte_length > 0 && best >= ogg->push_byte_length)
+ best = ogg->push_byte_length - 1;
+
+ /* set up bisection search */
+ ogg->push_offset0 = 0;
+ ogg->push_offset1 = ogg->push_byte_length - 1;
+ ogg->push_time0 = ogg->push_start_time;
+ ogg->push_time1 = ogg->push_time_length;
+ ogg->push_seek_time_target = start;
+ ogg->push_seek_time_original_target = start;
+ ogg->push_state = PUSH_BISECT1;
+
+ /* reset pad push mode seeking state */
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+ pad->push_kf_time = GST_CLOCK_TIME_NONE;
+ pad->push_sync_time = GST_CLOCK_TIME_NONE;
+ }
+
+ GST_DEBUG_OBJECT (ogg,
+ "Setting up bisection search for %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT
+ " (time %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", ogg->push_offset0,
+ ogg->push_offset1, GST_TIME_ARGS (ogg->push_time0),
+ GST_TIME_ARGS (ogg->push_time1));
+ GST_DEBUG_OBJECT (ogg,
+ "Target time is %" GST_TIME_FORMAT ", best first guess is %"
+ G_GINT64_FORMAT, GST_TIME_ARGS (ogg->push_seek_time_target), best);
+
+ ogg->push_seek_rate = rate;
+ ogg->push_seek_flags = flags;
+ ogg->push_mode_seek_delayed_event = NULL;
+ ogg->push_bisection_steps[0] = 1;
+ ogg->push_bisection_steps[1] = 0;
+ sevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
+ start_type, best, GST_SEEK_TYPE_NONE, -1);
+
+ GST_PUSH_UNLOCK (ogg);
+ res = gst_pad_push_event (ogg->sinkpad, sevent);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (ogg, "seek failed");
+ return FALSE;
+ }
+
+error_locked:
+ GST_PUSH_UNLOCK (ogg);
+ goto error;
+}
+
+static gboolean
+gst_ogg_demux_perform_seek (GstOggDemux * ogg, GstEvent * event)
+{
+ gboolean res;
+
+ if (ogg->pullmode) {
+ res = gst_ogg_demux_perform_seek_pull (ogg, event);
+ } else {
+ res = gst_ogg_demux_perform_seek_push (ogg, event);
+ }
+ return res;
+}
+
+
+/* finds each bitstream link one at a time using a bisection search
+ * (has to begin by knowing the offset of the lb's initial page).
+ * Recurses for each link so it can alloc the link storage after
+ * finding them all, then unroll and fill the cache at the same time
+ */
+static GstFlowReturn
+gst_ogg_demux_bisect_forward_serialno (GstOggDemux * ogg,
+ gint64 begin, gint64 searched, gint64 end, GstOggChain * chain, glong m)
+{
+ gint64 endsearched = end;
+ gint64 next = end;
+ ogg_page og;
+ GstFlowReturn ret;
+ gint64 offset;
+ GstOggChain *nextchain;
+
+ GST_LOG_OBJECT (ogg,
+ "bisect begin: %" G_GINT64_FORMAT ", searched: %" G_GINT64_FORMAT
+ ", end %" G_GINT64_FORMAT ", chain: %p", begin, searched, end, chain);
+
+ /* the below guards against garbage seperating the last and
+ * first pages of two links. */
+ while (searched < endsearched) {
+ gint64 bisect;
+
+ if (endsearched - searched < CHUNKSIZE) {
+ bisect = searched;
+ } else {
+ bisect = (searched + endsearched) / 2;
+ }
+
+ gst_ogg_demux_seek (ogg, bisect);
+ ret = gst_ogg_demux_get_next_page (ogg, &og, -1, &offset);
+
+ if (ret == GST_FLOW_UNEXPECTED) {
+ endsearched = bisect;
+ } else if (ret == GST_FLOW_OK) {
+ guint32 serial = ogg_page_serialno (&og);
+
+ if (!gst_ogg_chain_has_stream (chain, serial)) {
+ endsearched = bisect;
+ next = offset;
+ } else {
+ searched = offset + og.header_len + og.body_len;
+ }
+ } else
+ return ret;
+ }
+
+ GST_LOG_OBJECT (ogg, "current chain ends at %" G_GINT64_FORMAT, searched);
+
+ chain->end_offset = searched;
+ ret = gst_ogg_demux_read_end_chain (ogg, chain);
+ if (ret != GST_FLOW_OK)
+ return ret;
+
+ GST_LOG_OBJECT (ogg, "found begin at %" G_GINT64_FORMAT, next);
+
+ gst_ogg_demux_seek (ogg, next);
+ ret = gst_ogg_demux_read_chain (ogg, &nextchain);
+ if (ret == GST_FLOW_UNEXPECTED) {
+ nextchain = NULL;
+ ret = GST_FLOW_OK;
+ GST_LOG_OBJECT (ogg, "no next chain");
+ } else if (ret != GST_FLOW_OK)
+ goto done;
+
+ if (searched < end && nextchain != NULL) {
+ ret = gst_ogg_demux_bisect_forward_serialno (ogg, next, ogg->offset,
+ end, nextchain, m + 1);
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+ GST_LOG_OBJECT (ogg, "adding chain %p", chain);
+
+ g_array_insert_val (ogg->chains, 0, chain);
+
+done:
+ return ret;
+}
+
+/* read a chain from the ogg file. This code will
+ * read all BOS pages and will create and return a GstOggChain
+ * structure with the results.
+ *
+ * This function will also read N pages from each stream in the
+ * chain and submit them to the decoders. When the decoder has
+ * decoded the first buffer, we know the timestamp of the first
+ * page in the chain.
+ */
+static GstFlowReturn
+gst_ogg_demux_read_chain (GstOggDemux * ogg, GstOggChain ** res_chain)
+{
+ GstFlowReturn ret;
+ GstOggChain *chain = NULL;
+ gint64 offset = ogg->offset;
+ ogg_page og;
+ gboolean done;
+ gint i;
+
+ GST_LOG_OBJECT (ogg, "reading chain at %" G_GINT64_FORMAT, offset);
+
+ /* first read the BOS pages, do typefind on them, create
+ * the decoders, send data to the decoders. */
+ while (TRUE) {
+ GstOggPad *pad;
+ guint32 serial;
+
+ ret = gst_ogg_demux_get_next_page (ogg, &og, -1, NULL);
+ if (ret != GST_FLOW_OK) {
+ if (ret == GST_FLOW_UNEXPECTED) {
+ GST_DEBUG_OBJECT (ogg, "Reached EOS, done reading end chain");
+ } else {
+ GST_WARNING_OBJECT (ogg, "problem reading BOS page: ret=%d", ret);
+ }
+ break;
+ }
+ if (!ogg_page_bos (&og)) {
+ GST_INFO_OBJECT (ogg, "page is not BOS page, all streams identified");
+ /* if we did not find a chain yet, assume this is a bogus stream and
+ * ignore it */
+ if (!chain) {
+ GST_WARNING_OBJECT (ogg, "No chain found, no Ogg data in stream ?");
+ ret = GST_FLOW_UNEXPECTED;
+ }
+ break;
+ }
+
+ if (chain == NULL) {
+ chain = gst_ogg_chain_new (ogg);
+ chain->offset = offset;
+ }
+
+ serial = ogg_page_serialno (&og);
+ if (gst_ogg_chain_get_stream (chain, serial) != NULL) {
+ GST_WARNING_OBJECT (ogg,
+ "found serial %08x BOS page twice, ignoring", serial);
+ continue;
+ }
+
+ pad = gst_ogg_chain_new_stream (chain, serial);
+ gst_ogg_pad_submit_page (pad, &og);
+ }
+
+ if (ret != GST_FLOW_OK || chain == NULL) {
+ if (ret == GST_FLOW_OK) {
+ GST_WARNING_OBJECT (ogg, "no chain was found");
+ ret = GST_FLOW_ERROR;
+ } else if (ret != GST_FLOW_UNEXPECTED) {
+ GST_WARNING_OBJECT (ogg, "failed to read chain");
+ } else {
+ GST_DEBUG_OBJECT (ogg, "done reading chains");
+ }
+ if (chain) {
+ gst_ogg_chain_free (chain);
+ }
+ if (res_chain)
+ *res_chain = NULL;
+ return ret;
+ }
+
+ chain->have_bos = TRUE;
+ GST_LOG_OBJECT (ogg, "read bos pages, init decoder now");
+
+ /* now read pages until we receive a buffer from each of the
+ * stream decoders, this will tell us the timestamp of the
+ * first packet in the chain then */
+
+ /* save the offset to the first non bos page in the chain: if searching for
+ * pad->first_time we read past the end of the chain, we'll seek back to this
+ * position
+ */
+ offset = ogg->offset;
+
+ done = FALSE;
+ while (!done) {
+ guint32 serial;
+ gboolean known_serial = FALSE;
+ GstFlowReturn ret;
+
+ serial = ogg_page_serialno (&og);
+ done = TRUE;
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ GST_LOG_OBJECT (ogg,
+ "serial %08x time %" GST_TIME_FORMAT,
+ pad->map.serialno, GST_TIME_ARGS (pad->start_time));
+
+ if (pad->map.serialno == serial) {
+ known_serial = TRUE;
+
+ /* submit the page now, this will fill in the start_time when the
+ * internal decoder finds it */
+ gst_ogg_pad_submit_page (pad, &og);
+
+ if (!pad->map.is_skeleton && pad->start_time == -1
+ && ogg_page_eos (&og)) {
+ /* got EOS on a pad before we could find its start_time.
+ * We have no chance of finding a start_time for every pad so
+ * stop searching for the other start_time(s).
+ */
+ done = TRUE;
+ break;
+ }
+ }
+ /* the timestamp will be filled in when we submit the pages */
+ if (!pad->map.is_sparse)
+ done &= (pad->start_time != GST_CLOCK_TIME_NONE);
+
+ GST_LOG_OBJECT (ogg, "done %08x now %d", pad->map.serialno, done);
+ }
+
+ /* we read a page not belonging to the current chain: seek back to the
+ * beginning of the chain
+ */
+ if (!known_serial) {
+ GST_LOG_OBJECT (ogg, "unknown serial %08x", serial);
+ gst_ogg_demux_seek (ogg, offset);
+ break;
+ }
+
+ if (!done) {
+ ret = gst_ogg_demux_get_next_page (ogg, &og, -1, NULL);
+ if (ret != GST_FLOW_OK)
+ break;
+ }
+ }
+ GST_LOG_OBJECT (ogg, "done reading chain");
+ /* now we can fill in the missing info using queries */
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.is_skeleton)
+ continue;
+
+ pad->mode = GST_OGG_PAD_MODE_STREAMING;
+ }
+
+ if (res_chain)
+ *res_chain = chain;
+
+ return GST_FLOW_OK;
+}
+
+/* read the last pages from the ogg stream to get the final
+ * page end_offsets.
+ */
+static GstFlowReturn
+gst_ogg_demux_read_end_chain (GstOggDemux * ogg, GstOggChain * chain)
+{
+ gint64 begin = chain->end_offset;
+ gint64 end = begin;
+ gint64 last_granule = -1;
+ GstOggPad *last_pad = NULL;
+ GstFlowReturn ret;
+ gboolean done = FALSE;
+ ogg_page og;
+ gint i;
+
+ while (!done) {
+ begin -= CHUNKSIZE;
+ if (begin < 0)
+ begin = 0;
+
+ gst_ogg_demux_seek (ogg, begin);
+
+ /* now continue reading until we run out of data, if we find a page
+ * start, we save it. It might not be the final page as there could be
+ * another page after this one. */
+ while (ogg->offset < end) {
+ ret = gst_ogg_demux_get_next_page (ogg, &og, end - ogg->offset, NULL);
+
+ if (ret == GST_FLOW_LIMIT)
+ break;
+ if (ret != GST_FLOW_OK)
+ return ret;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ if (pad->map.is_skeleton)
+ continue;
+
+ if (pad->map.serialno == ogg_page_serialno (&og)) {
+ gint64 granulepos = ogg_page_granulepos (&og);
+
+ if (granulepos != -1) {
+ last_granule = granulepos;
+ last_pad = pad;
+ done = TRUE;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if (last_pad) {
+ chain->segment_stop =
+ gst_ogg_stream_get_end_time_for_granulepos (&last_pad->map,
+ last_granule);
+ } else {
+ chain->segment_stop = GST_CLOCK_TIME_NONE;
+ }
+
+ GST_INFO ("segment stop %" G_GUINT64_FORMAT, chain->segment_stop);
+
+ return GST_FLOW_OK;
+}
+
+/* find a pad with a given serial number
+ */
+static GstOggPad *
+gst_ogg_demux_find_pad (GstOggDemux * ogg, guint32 serialno)
+{
+ GstOggPad *pad;
+ gint i;
+
+ /* first look in building chain if any */
+ if (ogg->building_chain) {
+ pad = gst_ogg_chain_get_stream (ogg->building_chain, serialno);
+ if (pad)
+ return pad;
+ }
+
+ /* then look in current chain if any */
+ if (ogg->current_chain) {
+ pad = gst_ogg_chain_get_stream (ogg->current_chain, serialno);
+ if (pad)
+ return pad;
+ }
+
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+
+ pad = gst_ogg_chain_get_stream (chain, serialno);
+ if (pad)
+ return pad;
+ }
+ return NULL;
+}
+
+/* find a chain with a given serial number
+ */
+static GstOggChain *
+gst_ogg_demux_find_chain (GstOggDemux * ogg, guint32 serialno)
+{
+ GstOggPad *pad;
+
+ pad = gst_ogg_demux_find_pad (ogg, serialno);
+ if (pad) {
+ return pad->chain;
+ }
+ return NULL;
+}
+
+/* returns TRUE if all streams have valid start time */
+static gboolean
+gst_ogg_demux_collect_chain_info (GstOggDemux * ogg, GstOggChain * chain)
+{
+ gboolean res = TRUE;
+
+ chain->total_time = GST_CLOCK_TIME_NONE;
+ GST_DEBUG_OBJECT (ogg, "trying to collect chain info");
+
+ /* see if we have a start time on all streams */
+ chain->segment_start = gst_ogg_demux_collect_start_time (ogg, chain);
+
+ if (chain->segment_start == G_MAXUINT64) {
+ /* not yet, stream some more data */
+ res = FALSE;
+ } else if (chain->segment_stop != GST_CLOCK_TIME_NONE) {
+ /* we can calculate a total time */
+ chain->total_time = chain->segment_stop - chain->segment_start;
+ }
+
+ GST_DEBUG ("total time %" G_GUINT64_FORMAT, chain->total_time);
+
+ GST_DEBUG_OBJECT (ogg, "return %d", res);
+
+ return res;
+}
+
+static void
+gst_ogg_demux_collect_info (GstOggDemux * ogg)
+{
+ gint i;
+
+ /* collect all info */
+ ogg->total_time = 0;
+
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+
+ chain->begin_time = ogg->total_time;
+
+ gst_ogg_demux_collect_chain_info (ogg, chain);
+
+ ogg->total_time += chain->total_time;
+ }
+ ogg->segment.duration = ogg->total_time;
+}
+
+/* find all the chains in the ogg file, this reads the first and
+ * last page of the ogg stream, if they match then the ogg file has
+ * just one chain, else we do a binary search for all chains.
+ */
+static GstFlowReturn
+gst_ogg_demux_find_chains (GstOggDemux * ogg)
+{
+ ogg_page og;
+ GstPad *peer;
+ gboolean res;
+ guint32 serialno;
+ GstOggChain *chain;
+ GstFlowReturn ret;
+
+ /* get peer to figure out length */
+ if ((peer = gst_pad_get_peer (ogg->sinkpad)) == NULL)
+ goto no_peer;
+
+ /* find length to read last page, we store this for later use. */
+ res = gst_pad_query_duration (peer, GST_FORMAT_BYTES, &ogg->length);
+ gst_object_unref (peer);
+ if (!res || ogg->length <= 0)
+ goto no_length;
+
+ GST_DEBUG_OBJECT (ogg, "file length %" G_GINT64_FORMAT, ogg->length);
+
+ /* read chain from offset 0, this is the first chain of the
+ * ogg file. */
+ gst_ogg_demux_seek (ogg, 0);
+ ret = gst_ogg_demux_read_chain (ogg, &chain);
+ if (ret != GST_FLOW_OK)
+ goto no_first_chain;
+
+ /* read page from end offset, we use this page to check if its serial
+ * number is contained in the first chain. If this is the case then
+ * this ogg is not a chained ogg and we can skip the scanning. */
+ gst_ogg_demux_seek (ogg, ogg->length);
+ ret = gst_ogg_demux_get_prev_page (ogg, &og, NULL);
+ if (ret != GST_FLOW_OK)
+ goto no_last_page;
+
+ serialno = ogg_page_serialno (&og);
+
+ if (!gst_ogg_chain_has_stream (chain, serialno)) {
+ /* the last page is not in the first stream, this means we should
+ * find all the chains in this chained ogg. */
+ ret =
+ gst_ogg_demux_bisect_forward_serialno (ogg, 0, 0, ogg->length, chain,
+ 0);
+ } else {
+ /* we still call this function here but with an empty range so that
+ * we can reuse the setup code in this routine. */
+ ret =
+ gst_ogg_demux_bisect_forward_serialno (ogg, 0, ogg->length,
+ ogg->length, chain, 0);
+ }
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ /* all fine, collect and print */
+ gst_ogg_demux_collect_info (ogg);
+
+ /* dump our chains and streams */
+ gst_ogg_print (ogg);
+
+done:
+ return ret;
+
+ /*** error cases ***/
+no_peer:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL), ("we don't have a peer"));
+ return GST_FLOW_NOT_LINKED;
+ }
+no_length:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL), ("can't get file length"));
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+no_first_chain:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL), ("can't get first chain"));
+ return GST_FLOW_ERROR;
+ }
+no_last_page:
+ {
+ GST_DEBUG_OBJECT (ogg, "can't get last page");
+ if (chain)
+ gst_ogg_chain_free (chain);
+ return ret;
+ }
+}
+
+static GstFlowReturn
+gst_ogg_demux_handle_page (GstOggDemux * ogg, ogg_page * page)
+{
+ GstOggPad *pad;
+ gint64 granule;
+ guint32 serialno;
+ GstFlowReturn result = GST_FLOW_OK;
+
+ serialno = ogg_page_serialno (page);
+ granule = ogg_page_granulepos (page);
+
+ GST_LOG_OBJECT (ogg,
+ "processing ogg page (serial %08x, "
+ "pageno %ld, granulepos %" G_GINT64_FORMAT ", bos %d)", serialno,
+ ogg_page_pageno (page), granule, ogg_page_bos (page));
+
+ if (ogg_page_bos (page)) {
+ GstOggChain *chain;
+
+ /* first page */
+ /* see if we know about the chain already */
+ chain = gst_ogg_demux_find_chain (ogg, serialno);
+ if (chain) {
+ GstEvent *event;
+ gint64 start = 0;
+ GstSegment segment;
+
+ if (chain->segment_start != GST_CLOCK_TIME_NONE)
+ start = chain->segment_start;
+
+ /* create the newsegment event we are going to send out */
+ gst_segment_copy_into (&ogg->segment, &segment);
+ segment.start = start;
+ segment.stop = chain->segment_stop;
+ segment.time = chain->begin_time;
+ event = gst_event_new_segment (&segment);
+ gst_event_set_seqnum (event, ogg->seqnum);
+
+ GST_DEBUG_OBJECT (ogg,
+ "segment: start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT
+ ", time %" GST_TIME_FORMAT, GST_TIME_ARGS (start),
+ GST_TIME_ARGS (chain->segment_stop),
+ GST_TIME_ARGS (chain->begin_time));
+
+ /* activate it as it means we have a non-header, this will also deactivate
+ * the currently running chain. */
+ gst_ogg_demux_activate_chain (ogg, chain, event);
+ pad = gst_ogg_demux_find_pad (ogg, serialno);
+ } else {
+ GstClockTime chain_time;
+ gint64 current_time;
+
+ /* this can only happen in push mode */
+ if (ogg->pullmode)
+ goto unknown_chain;
+
+ current_time = ogg->segment.position;
+
+ /* time of new chain is current time */
+ chain_time = current_time;
+
+ if (ogg->building_chain == NULL) {
+ GstOggChain *newchain;
+
+ newchain = gst_ogg_chain_new (ogg);
+ newchain->offset = 0;
+ /* set new chain begin time aligned with end time of old chain */
+ newchain->begin_time = chain_time;
+ GST_DEBUG_OBJECT (ogg, "new chain, begin time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain_time));
+
+ /* and this is the one we are building now */
+ ogg->building_chain = newchain;
+ }
+ pad = gst_ogg_chain_new_stream (ogg->building_chain, serialno);
+ }
+ } else {
+ pad = gst_ogg_demux_find_pad (ogg, serialno);
+ }
+ if (pad) {
+ result = gst_ogg_pad_submit_page (pad, page);
+ } else {
+ GST_PUSH_LOCK (ogg);
+ if (!ogg->pullmode && !ogg->push_disable_seeking) {
+ /* no pad while probing for duration, we must have a chained stream,
+ and we don't support them, so back off */
+ GST_INFO_OBJECT (ogg, "We seem to have a chained stream, we won't seek");
+ if (ogg->push_state == PUSH_DURATION) {
+ GstFlowReturn res;
+
+ res = gst_ogg_demux_seek_back_after_push_duration_check_unlock (ogg);
+ if (res != GST_FLOW_OK)
+ return res;
+ }
+
+ /* only once we seeked back */
+ GST_PUSH_LOCK (ogg);
+ ogg->push_disable_seeking = TRUE;
+ } else {
+ GST_PUSH_UNLOCK (ogg);
+ /* no pad. This means an ogg page without bos has been seen for this
+ * serialno. we just ignore it but post a warning... */
+ GST_ELEMENT_WARNING (ogg, STREAM, DECODE,
+ (NULL), ("unknown ogg pad for serial %08x detected", serialno));
+ return GST_FLOW_OK;
+ }
+ GST_PUSH_UNLOCK (ogg);
+ }
+ return result;
+
+ /* ERRORS */
+unknown_chain:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DECODE,
+ (NULL), ("unknown ogg chain for serial %08x detected", serialno));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* streaming mode, receive a buffer, parse it, create pads for
+ * the serialno, submit pages and packets to the oggpads
+ */
+static GstFlowReturn
+gst_ogg_demux_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstOggDemux *ogg;
+ gint ret = 0;
+ GstFlowReturn result = GST_FLOW_OK;
+
+ ogg = GST_OGG_DEMUX (GST_OBJECT_PARENT (pad));
+
+ GST_DEBUG_OBJECT (ogg, "enter");
+ result = gst_ogg_demux_submit_buffer (ogg, buffer);
+ if (result < 0) {
+ GST_DEBUG_OBJECT (ogg, "gst_ogg_demux_submit_buffer returned %d", result);
+ }
+
+ while (result == GST_FLOW_OK) {
+ ogg_page page;
+
+ ret = ogg_sync_pageout (&ogg->sync, &page);
+ if (ret == 0)
+ /* need more data */
+ break;
+ if (ret == -1) {
+ /* discontinuity in the pages */
+ GST_DEBUG_OBJECT (ogg, "discont in page found, continuing");
+ } else {
+ result = gst_ogg_demux_handle_page (ogg, &page);
+ if (result < 0) {
+ GST_DEBUG_OBJECT (ogg, "gst_ogg_demux_handle_page returned %d", result);
+ }
+ }
+ }
+ if (ret == 0 || result == GST_FLOW_OK) {
+ gst_ogg_demux_sync_streams (ogg);
+ }
+ GST_DEBUG_OBJECT (ogg, "leave with %d", result);
+ return result;
+}
+
+static gboolean
+gst_ogg_demux_send_event (GstOggDemux * ogg, GstEvent * event)
+{
+ GstOggChain *chain = ogg->current_chain;
+ gboolean res = TRUE;
+
+ if (!chain)
+ chain = ogg->building_chain;
+
+ if (chain) {
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i);
+
+ gst_event_ref (event);
+ GST_DEBUG_OBJECT (pad, "Pushing event %" GST_PTR_FORMAT, event);
+ res &= gst_pad_push_event (GST_PAD (pad), event);
+ }
+ } else {
+ GST_WARNING_OBJECT (ogg, "No chain to forward event to");
+ }
+ gst_event_unref (event);
+
+ return res;
+}
+
+static GstFlowReturn
+gst_ogg_demux_combine_flows (GstOggDemux * ogg, GstOggPad * pad,
+ GstFlowReturn ret)
+{
+ GstOggChain *chain;
+
+ /* 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 */
+ chain = ogg->current_chain;
+ if (chain) {
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *opad = g_array_index (chain->streams, GstOggPad *, i);
+
+ 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;
+}
+
+/* returns TRUE if all streams in current chain reached EOS, FALSE otherwise */
+static gboolean
+gst_ogg_demux_check_eos (GstOggDemux * ogg)
+{
+ GstOggChain *chain;
+ gboolean eos = TRUE;
+
+ chain = ogg->current_chain;
+ if (G_LIKELY (chain)) {
+ gint i;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *opad = g_array_index (chain->streams, GstOggPad *, i);
+
+ eos = eos && opad->is_eos;
+ }
+ } else {
+ eos = FALSE;
+ }
+
+ return eos;
+}
+
+static GstFlowReturn
+gst_ogg_demux_loop_forward (GstOggDemux * ogg)
+{
+ GstFlowReturn ret;
+ GstBuffer *buffer;
+
+ if (ogg->offset == ogg->length) {
+ GST_LOG_OBJECT (ogg, "no more data to pull %" G_GINT64_FORMAT
+ " == %" G_GINT64_FORMAT, ogg->offset, ogg->length);
+ ret = GST_FLOW_UNEXPECTED;
+ goto done;
+ }
+
+ GST_LOG_OBJECT (ogg, "pull data %" G_GINT64_FORMAT, ogg->offset);
+ ret = gst_pad_pull_range (ogg->sinkpad, ogg->offset, CHUNKSIZE, &buffer);
+ if (ret != GST_FLOW_OK) {
+ GST_LOG_OBJECT (ogg, "Failed pull_range");
+ goto done;
+ }
+
+ ogg->offset += gst_buffer_get_size (buffer);
+
+ if (G_UNLIKELY (ogg->newsegment)) {
+ gst_ogg_demux_send_event (ogg, ogg->newsegment);
+ ogg->newsegment = NULL;
+ }
+
+ ret = gst_ogg_demux_chain (ogg->sinkpad, buffer);
+ if (ret != GST_FLOW_OK) {
+ GST_LOG_OBJECT (ogg, "Failed demux_chain");
+ goto done;
+ }
+
+ /* check for the end of the segment */
+ if (gst_ogg_demux_check_eos (ogg)) {
+ GST_LOG_OBJECT (ogg, "got EOS");
+ ret = GST_FLOW_UNEXPECTED;
+ goto done;
+ }
+done:
+ return ret;
+}
+
+/* reverse mode.
+ *
+ * We read the pages backwards and send the packets forwards. The first packet
+ * in the page will be pushed with the DISCONT flag set.
+ *
+ * Special care has to be taken for continued pages, which we can only decode
+ * when we have the previous page(s).
+ */
+static GstFlowReturn
+gst_ogg_demux_loop_reverse (GstOggDemux * ogg)
+{
+ GstFlowReturn ret;
+ ogg_page page;
+ gint64 offset;
+
+ if (ogg->offset == 0) {
+ GST_LOG_OBJECT (ogg, "no more data to pull %" G_GINT64_FORMAT
+ " == 0", ogg->offset);
+ ret = GST_FLOW_UNEXPECTED;
+ goto done;
+ }
+
+ GST_LOG_OBJECT (ogg, "read page from %" G_GINT64_FORMAT, ogg->offset);
+ ret = gst_ogg_demux_get_prev_page (ogg, &page, &offset);
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ ogg->offset = offset;
+
+ if (G_UNLIKELY (ogg->newsegment)) {
+ gst_ogg_demux_send_event (ogg, ogg->newsegment);
+ ogg->newsegment = NULL;
+ }
+
+ ret = gst_ogg_demux_handle_page (ogg, &page);
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ /* check for the end of the segment */
+ if (gst_ogg_demux_check_eos (ogg)) {
+ GST_LOG_OBJECT (ogg, "got EOS");
+ ret = GST_FLOW_UNEXPECTED;
+ goto done;
+ }
+done:
+ return ret;
+}
+
+static void
+gst_ogg_demux_sync_streams (GstOggDemux * ogg)
+{
+ GstClockTime cur;
+ GstOggChain *chain;
+ guint i;
+
+ chain = ogg->current_chain;
+ cur = ogg->segment.position;
+ if (chain == NULL || cur == -1)
+ return;
+
+ for (i = 0; i < chain->streams->len; i++) {
+ GstOggPad *stream = g_array_index (chain->streams, GstOggPad *, i);
+
+ /* Theoretically, we should be doing this for all streams, but we're only
+ * doing it for known-to-be-sparse streams at the moment in order not to
+ * break things for wrongly-muxed streams (like we used to produce once) */
+ if (stream->map.is_sparse && stream->position != GST_CLOCK_TIME_NONE) {
+
+ /* Does this stream lag? Random threshold of 2 seconds */
+ if (GST_CLOCK_DIFF (stream->position, cur) > (2 * GST_SECOND)) {
+ GST_DEBUG_OBJECT (stream, "synchronizing stream with others by "
+ "advancing time from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->position), GST_TIME_ARGS (cur));
+
+ stream->position = cur;
+
+#if 0
+ ogg->segment.base += cur - stream->position;
+ /* advance stream time (FIXME: is this right, esp. time_pos?) */
+ gst_pad_push_event (GST_PAD_CAST (stream),
+ gst_event_new_new_segment (TRUE, ogg->segment.rate,
+ ogg->segment.applied_rate,
+ GST_FORMAT_TIME, stream->position, -1, stream->position));
+#endif
+ }
+ }
+ }
+}
+
+/* random access code
+ *
+ * - first find all the chains and streams by scanning the file.
+ * - then get and chain buffers, just like the streaming case.
+ * - when seeking, we can use the chain info to perform the seek.
+ */
+static void
+gst_ogg_demux_loop (GstOggPad * pad)
+{
+ GstOggDemux *ogg;
+ GstFlowReturn ret;
+ GstEvent *event;
+
+ ogg = GST_OGG_DEMUX (GST_OBJECT_PARENT (pad));
+
+ if (ogg->need_chains) {
+ gboolean res;
+
+ /* this is the only place where we write chains and thus need to lock. */
+ GST_CHAIN_LOCK (ogg);
+ ret = gst_ogg_demux_find_chains (ogg);
+ GST_CHAIN_UNLOCK (ogg);
+ if (ret != GST_FLOW_OK)
+ goto chain_read_failed;
+
+ ogg->need_chains = FALSE;
+
+ GST_OBJECT_LOCK (ogg);
+ ogg->running = TRUE;
+ event = ogg->event;
+ ogg->event = NULL;
+ GST_OBJECT_UNLOCK (ogg);
+
+ /* and seek to configured positions without FLUSH */
+ res = gst_ogg_demux_perform_seek_pull (ogg, event);
+ if (event)
+ gst_event_unref (event);
+
+ if (!res)
+ goto seek_failed;
+ }
+
+ if (ogg->segment.rate >= 0.0)
+ ret = gst_ogg_demux_loop_forward (ogg);
+ else
+ ret = gst_ogg_demux_loop_reverse (ogg);
+
+ if (ret != GST_FLOW_OK)
+ goto pause;
+
+ gst_ogg_demux_sync_streams (ogg);
+ return;
+
+ /* ERRORS */
+chain_read_failed:
+ {
+ /* error was posted */
+ goto pause;
+ }
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL),
+ ("failed to start demuxing ogg"));
+ ret = GST_FLOW_ERROR;
+ goto pause;
+ }
+pause:
+ {
+ const gchar *reason = gst_flow_get_name (ret);
+ GstEvent *event = NULL;
+
+ GST_LOG_OBJECT (ogg, "pausing task, reason %s", reason);
+ gst_pad_pause_task (ogg->sinkpad);
+
+ if (ret == GST_FLOW_UNEXPECTED) {
+ /* perform EOS logic */
+ if (ogg->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+ gint64 stop;
+ GstMessage *message;
+
+ /* for segment playback we need to post when (in stream time)
+ * we stopped, this is either stop (when set) or the duration. */
+ if ((stop = ogg->segment.stop) == -1)
+ stop = ogg->segment.duration;
+
+ GST_LOG_OBJECT (ogg, "Sending segment done, at end of segment");
+ message =
+ gst_message_new_segment_done (GST_OBJECT (ogg), GST_FORMAT_TIME,
+ stop);
+ gst_message_set_seqnum (message, ogg->seqnum);
+
+ gst_element_post_message (GST_ELEMENT (ogg), message);
+ } else {
+ /* normal playback, send EOS to all linked pads */
+ GST_LOG_OBJECT (ogg, "Sending EOS, at end of stream");
+ event = gst_event_new_eos ();
+ }
+ } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) {
+ GST_ELEMENT_ERROR (ogg, STREAM, FAILED,
+ (_("Internal data stream error.")),
+ ("stream stopped, reason %s", reason));
+ event = gst_event_new_eos ();
+ }
+
+ /* For wrong-state we still want to pause the task and stop
+ * but no error message or other things are necessary.
+ * wrong-state is no real error and will be caused by flushing,
+ * e.g. because of a flushing seek.
+ */
+ if (event) {
+ gst_event_set_seqnum (event, ogg->seqnum);
+ gst_ogg_demux_send_event (ogg, event);
+ }
+ return;
+ }
+}
+
+static void
+gst_ogg_demux_clear_chains (GstOggDemux * ogg)
+{
+ gint i;
+
+ gst_ogg_demux_deactivate_current_chain (ogg);
+
+ GST_CHAIN_LOCK (ogg);
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+
+ gst_ogg_chain_free (chain);
+ }
+ ogg->chains = g_array_set_size (ogg->chains, 0);
+ GST_CHAIN_UNLOCK (ogg);
+}
+
+/* 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_ogg_demux_sink_activate (GstPad * sinkpad)
+{
+ GstQuery *query;
+ gboolean pull_mode;
+
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (sinkpad, query)) {
+ gst_query_unref (query);
+ goto activate_push;
+ }
+
+ gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+
+ if (!pull_mode)
+ goto activate_push;
+
+ GST_DEBUG_OBJECT (sinkpad, "activating pull");
+ return gst_pad_activate_pull (sinkpad, TRUE);
+
+activate_push:
+ {
+ GST_DEBUG_OBJECT (sinkpad, "activating push");
+ 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_ogg_demux_sink_activate_push (GstPad * sinkpad, gboolean active)
+{
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (GST_OBJECT_PARENT (sinkpad));
+
+ ogg->pullmode = FALSE;
+ ogg->resync = FALSE;
+
+ 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_ogg_demux_sink_activate_pull (GstPad * sinkpad, gboolean active)
+{
+ GstOggDemux *ogg;
+
+ ogg = GST_OGG_DEMUX (GST_OBJECT_PARENT (sinkpad));
+
+ if (active) {
+ ogg->need_chains = TRUE;
+ ogg->pullmode = TRUE;
+
+ return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_ogg_demux_loop,
+ sinkpad);
+ } else {
+ return gst_pad_stop_task (sinkpad);
+ }
+}
+
+static GstStateChangeReturn
+gst_ogg_demux_change_state (GstElement * element, GstStateChange transition)
+{
+ GstOggDemux *ogg;
+ GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
+
+ ogg = GST_OGG_DEMUX (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ ogg->basetime = 0;
+ ogg_sync_init (&ogg->sync);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ ogg_sync_reset (&ogg->sync);
+ ogg->running = FALSE;
+ ogg->bitrate = 0;
+ ogg->total_time = -1;
+ GST_PUSH_LOCK (ogg);
+ ogg->push_byte_offset = 0;
+ ogg->push_byte_length = -1;
+ ogg->push_time_length = GST_CLOCK_TIME_NONE;
+ ogg->push_time_offset = GST_CLOCK_TIME_NONE;
+ ogg->push_disable_seeking = FALSE;
+ ogg->push_state = PUSH_PLAYING;
+ GST_PUSH_UNLOCK (ogg);
+ gst_segment_init (&ogg->segment, GST_FORMAT_TIME);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ result = 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_ogg_demux_clear_chains (ogg);
+ GST_OBJECT_LOCK (ogg);
+ ogg->running = FALSE;
+ GST_OBJECT_UNLOCK (ogg);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ ogg_sync_clear (&ogg->sync);
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+gboolean
+gst_ogg_demux_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_ogg_demux_debug, "oggdemux", 0, "ogg demuxer");
+ GST_DEBUG_CATEGORY_INIT (gst_ogg_demux_setup_debug, "oggdemux_setup", 0,
+ "ogg demuxer setup stage when parsing pipeline");
+
+#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_element_register (plugin, "oggdemux", GST_RANK_PRIMARY,
+ GST_TYPE_OGG_DEMUX);
+}
+
+/* prints all info about the element */
+#undef GST_CAT_DEFAULT
+#define GST_CAT_DEFAULT gst_ogg_demux_setup_debug
+
+#ifdef GST_DISABLE_GST_DEBUG
+
+static void
+gst_ogg_print (GstOggDemux * ogg)
+{
+ /* NOP */
+}
+
+#else /* !GST_DISABLE_GST_DEBUG */
+
+static void
+gst_ogg_print (GstOggDemux * ogg)
+{
+ guint j, i;
+
+ GST_INFO_OBJECT (ogg, "%u chains", ogg->chains->len);
+ GST_INFO_OBJECT (ogg, " total time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ogg->total_time));
+
+ for (i = 0; i < ogg->chains->len; i++) {
+ GstOggChain *chain = g_array_index (ogg->chains, GstOggChain *, i);
+
+ GST_INFO_OBJECT (ogg, " chain %d (%u streams):", i, chain->streams->len);
+ GST_INFO_OBJECT (ogg,
+ " offset: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT, chain->offset,
+ chain->end_offset);
+ GST_INFO_OBJECT (ogg, " begin time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->begin_time));
+ GST_INFO_OBJECT (ogg, " total time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->total_time));
+ GST_INFO_OBJECT (ogg, " segment start: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->segment_start));
+ GST_INFO_OBJECT (ogg, " segment stop: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (chain->segment_stop));
+
+ for (j = 0; j < chain->streams->len; j++) {
+ GstOggPad *stream = g_array_index (chain->streams, GstOggPad *, j);
+
+ GST_INFO_OBJECT (ogg, " stream %08x: %s", stream->map.serialno,
+ gst_ogg_stream_get_media_type (&stream->map));
+ GST_INFO_OBJECT (ogg, " start time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->start_time));
+ }
+ }
+}
+#endif /* GST_DISABLE_GST_DEBUG */
diff --git a/ext/ogg/gstoggdemux.h b/ext/ogg/gstoggdemux.h
new file mode 100644
index 0000000..050caf2
--- /dev/null
+++ b/ext/ogg/gstoggdemux.h
@@ -0,0 +1,204 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstoggdemux.c: ogg 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_OGG_DEMUX_H__
+#define __GST_OGG_DEMUX_H__
+
+#include <ogg/ogg.h>
+
+#include <gst/gst.h>
+
+#include "gstoggstream.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_OGG_PAD (gst_ogg_pad_get_type())
+#define GST_OGG_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_PAD, GstOggPad))
+#define GST_OGG_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_PAD, GstOggPad))
+#define GST_IS_OGG_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_PAD))
+#define GST_IS_OGG_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_PAD))
+
+typedef struct _GstOggPad GstOggPad;
+typedef struct _GstOggPadClass GstOggPadClass;
+
+#define GST_TYPE_OGG_DEMUX (gst_ogg_demux_get_type())
+#define GST_OGG_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_DEMUX, GstOggDemux))
+#define GST_OGG_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_DEMUX, GstOggDemux))
+#define GST_IS_OGG_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_DEMUX))
+#define GST_IS_OGG_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_DEMUX))
+
+GType gst_ogg_demux_get_type (void);
+
+typedef struct _GstOggDemux GstOggDemux;
+typedef struct _GstOggDemuxClass GstOggDemuxClass;
+typedef struct _GstOggChain GstOggChain;
+
+/* all information needed for one ogg chain (relevant for chained bitstreams) */
+struct _GstOggChain
+{
+ GstOggDemux *ogg;
+
+ gint64 offset; /* starting offset of chain */
+ gint64 end_offset; /* end offset of chain */
+ gint64 bytes; /* number of bytes */
+
+ gboolean have_bos;
+
+ GArray *streams;
+
+ GstClockTime total_time; /* the total time of this chain, this is the MAX of
+ the totals of all streams */
+ GstClockTime begin_time; /* when this chain starts in the stream */
+
+ GstClockTime segment_start; /* the timestamp of the first sample, this is the MIN of
+ the start times of all streams. */
+ GstClockTime segment_stop; /* the timestamp of the last page, this is the MAX of the
+ streams. */
+};
+
+/* different modes for the pad */
+typedef enum
+{
+ GST_OGG_PAD_MODE_INIT, /* we are feeding our internal decoder to get info */
+ GST_OGG_PAD_MODE_STREAMING, /* we are streaming buffers to the outside */
+} GstOggPadMode;
+
+/* all information needed for one ogg stream */
+struct _GstOggPad
+{
+ GstPad pad; /* subclass GstPad */
+
+ gboolean have_type;
+ GstOggPadMode mode;
+
+ GstOggChain *chain; /* the chain we are part of */
+ GstOggDemux *ogg; /* the ogg demuxer we are part of */
+
+ GstOggStream map;
+
+ gint64 packetno;
+ gint64 current_granule;
+ gint64 keyframe_granule;
+
+ GstClockTime start_time; /* the timestamp of the first sample */
+
+ gint64 first_granule; /* the granulepos of first page == first sample in next page */
+ GstClockTime first_time; /* the timestamp of the second page or granuletime of first page */
+
+ GstClockTime position; /* position when last push occured; used to detect when we
+ * need to send a newsegment update event for sparse streams */
+
+ GList *continued;
+
+ gboolean discont;
+ GstFlowReturn last_ret; /* last return of _pad_push() */
+ gboolean is_eos;
+
+ gboolean added;
+
+ /* push mode seeking */
+ GstClockTime push_kf_time;
+ GstClockTime push_sync_time;
+};
+
+struct _GstOggPadClass
+{
+ GstPadClass parent_class;
+};
+
+/**
+ * GstOggDemux:
+ *
+ * The ogg demuxer object structure.
+ */
+struct _GstOggDemux
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+
+ gint64 length;
+ gint64 read_offset;
+ gint64 offset;
+
+ gboolean pullmode;
+ gboolean running;
+
+ gboolean need_chains;
+ gboolean resync;
+
+ /* state */
+ GMutex *chain_lock; /* we need the lock to protect the chains */
+ GArray *chains; /* list of chains we know */
+ GstClockTime total_time;
+ gint bitrate; /* bitrate of the current chain */
+
+ GstOggChain *current_chain;
+ GstOggChain *building_chain;
+
+ /* playback start/stop positions */
+ GstSegment segment;
+ guint32 seqnum;
+
+ GstEvent *event;
+ GstEvent *newsegment; /* pending newsegment to be sent from _loop */
+
+ /* annodex stuff */
+ gint64 basetime;
+ gint64 prestime;
+
+ /* push mode seeking support */
+ GMutex *push_lock; /* we need the lock to protect the push mode variables */
+ gint64 push_byte_offset; /* where were are at in the stream, in bytes */
+ gint64 push_byte_length; /* length in bytes of the stream, -1 if unknown */
+ GstClockTime push_time_length; /* length in time of the stream */
+ GstClockTime push_start_time; /* start time of the stream */
+ GstClockTime push_time_offset; /* where were are at in the stream, in time */
+ enum { PUSH_PLAYING, PUSH_DURATION, PUSH_BISECT1, PUSH_LINEAR1, PUSH_BISECT2, PUSH_LINEAR2 } push_state;
+
+ GstClockTime push_seek_time_original_target;
+ GstClockTime push_seek_time_target;
+ gint64 push_last_seek_offset;
+ GstClockTime push_last_seek_time;
+ gint64 push_offset0, push_offset1; /* bisection search offset bounds */
+ GstClockTime push_time0, push_time1; /* bisection search time bounds */
+
+ double push_seek_rate;
+ GstSeekFlags push_seek_flags;
+ GstEvent *push_mode_seek_delayed_event;
+ gboolean push_disable_seeking;
+
+ gint push_bisection_steps[2];
+
+ /* ogg stuff */
+ ogg_sync_state sync;
+};
+
+struct _GstOggDemuxClass
+{
+ GstElementClass parent_class;
+};
+
+gboolean gst_ogg_demux_plugin_init (GstPlugin * plugin);
+
+G_END_DECLS
+
+#endif /* __GST_OGG_DEMUX_H__ */
diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c
new file mode 100644
index 0000000..a0ac3cb
--- /dev/null
+++ b/ext/ogg/gstoggmux.c
@@ -0,0 +1,2057 @@
+/* OGG muxer plugin for GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2006 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.
+ */
+
+/**
+ * SECTION:element-oggmux
+ * @see_also: <link linkend="gst-plugins-base-plugins-oggdemux">oggdemux</link>
+ *
+ * This element merges streams (audio and video) into ogg files.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch v4l2src num-buffers=500 ! video/x-raw,width=320,height=240 ! videoconvert ! theoraenc ! oggmux ! filesink location=video.ogg
+ * ]| Encodes a video stream captured from a v4l2-compatible camera to Ogg/Theora
+ * (the encoding will stop automatically after 500 frames)
+ * </refsect2>
+ *
+ * Last reviewed on 2008-02-06 (0.10.17)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstcollectpads.h>
+#include <gst/base/gstbytewriter.h>
+#include <gst/tag/tag.h>
+
+#include "gstoggmux.h"
+
+/* memcpy - if someone knows a way to get rid of it, please speak up
+ * note: the ogg docs even say you need this... */
+#include <string.h>
+#include <time.h>
+#include <stdlib.h> /* rand, srand, atoi */
+
+GST_DEBUG_CATEGORY_STATIC (gst_ogg_mux_debug);
+#define GST_CAT_DEFAULT gst_ogg_mux_debug
+
+/* This isn't generally what you'd want with an end-time macro, because
+ technically the end time of a buffer with invalid duration is invalid. But
+ for sorting ogg pages this is what we want. */
+#define GST_BUFFER_END_TIME(buf) \
+ (GST_BUFFER_DURATION_IS_VALID (buf) \
+ ? GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf) \
+ : GST_BUFFER_TIMESTAMP (buf))
+
+#define GST_GP_FORMAT "[gp %8" G_GINT64_FORMAT "]"
+#define GST_GP_CAST(_gp) ((gint64) _gp)
+
+typedef enum
+{
+ GST_OGG_FLAG_BOS = GST_ELEMENT_FLAG_LAST,
+ GST_OGG_FLAG_EOS
+}
+GstOggFlag;
+
+/* OggMux signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+/* set to 0.5 seconds by default */
+#define DEFAULT_MAX_DELAY G_GINT64_CONSTANT(500000000)
+#define DEFAULT_MAX_PAGE_DELAY G_GINT64_CONSTANT(500000000)
+#define DEFAULT_MAX_TOLERANCE G_GINT64_CONSTANT(40000000)
+#define DEFAULT_SKELETON FALSE
+
+enum
+{
+ ARG_0,
+ ARG_MAX_DELAY,
+ ARG_MAX_PAGE_DELAY,
+ ARG_MAX_TOLERANCE,
+ ARG_SKELETON
+};
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/ogg")
+ );
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS ("video/x-theora; "
+ "audio/x-vorbis; audio/x-flac; audio/x-speex; audio/x-celt; "
+ "application/x-ogm-video; application/x-ogm-audio; video/x-dirac; "
+ "video/x-smoke; video/x-vp8; text/x-cmml, encoded = (boolean) TRUE; "
+ "subtitle/x-kate; application/x-kate")
+ );
+
+static void gst_ogg_mux_finalize (GObject * object);
+
+static GstFlowReturn
+gst_ogg_mux_collected (GstCollectPads * pads, GstOggMux * ogg_mux);
+static gboolean gst_ogg_mux_handle_src_event (GstPad * pad, GstEvent * event);
+static GstPad *gst_ogg_mux_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_ogg_mux_release_pad (GstElement * element, GstPad * pad);
+
+static void gst_ogg_mux_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_ogg_mux_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static GstStateChangeReturn gst_ogg_mux_change_state (GstElement * element,
+ GstStateChange transition);
+
+/*static guint gst_ogg_mux_signals[LAST_SIGNAL] = { 0 }; */
+#define gst_ogg_mux_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstOggMux, gst_ogg_mux, GST_TYPE_ELEMENT,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, NULL));
+
+static void
+gst_ogg_mux_class_init (GstOggMuxClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->finalize = gst_ogg_mux_finalize;
+ gobject_class->get_property = gst_ogg_mux_get_property;
+ gobject_class->set_property = gst_ogg_mux_set_property;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sink_factory));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Ogg muxer", "Codec/Muxer",
+ "mux ogg streams (info about ogg: http://xiph.org)",
+ "Wim Taymans <wim@fluendo.com>");
+
+ gstelement_class->request_new_pad = gst_ogg_mux_request_new_pad;
+ gstelement_class->release_pad = gst_ogg_mux_release_pad;
+
+ g_object_class_install_property (gobject_class, ARG_MAX_DELAY,
+ g_param_spec_uint64 ("max-delay", "Max delay",
+ "Maximum delay in multiplexing streams", 0, G_MAXUINT64,
+ DEFAULT_MAX_DELAY,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_MAX_PAGE_DELAY,
+ g_param_spec_uint64 ("max-page-delay", "Max page delay",
+ "Maximum delay for sending out a page", 0, G_MAXUINT64,
+ DEFAULT_MAX_PAGE_DELAY,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_MAX_TOLERANCE,
+ g_param_spec_uint64 ("max-tolerance", "Max time tolerance",
+ "Maximum timestamp difference for maintaining perfect granules",
+ 0, G_MAXUINT64, DEFAULT_MAX_TOLERANCE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_SKELETON,
+ g_param_spec_boolean ("skeleton", "Skeleton",
+ "Whether to include a Skeleton track",
+ DEFAULT_SKELETON,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state = gst_ogg_mux_change_state;
+
+}
+
+#if 0
+static const GstEventMask *
+gst_ogg_mux_get_sink_event_masks (GstPad * pad)
+{
+ static const GstEventMask gst_ogg_mux_sink_event_masks[] = {
+ {GST_EVENT_EOS, 0},
+ {GST_EVENT_DISCONTINUOUS, 0},
+ {0,}
+ };
+
+ return gst_ogg_mux_sink_event_masks;
+}
+#endif
+
+static void
+gst_ogg_mux_clear (GstOggMux * ogg_mux)
+{
+ ogg_mux->pulling = NULL;
+ ogg_mux->need_headers = TRUE;
+ ogg_mux->delta_pad = NULL;
+ ogg_mux->offset = 0;
+ ogg_mux->next_ts = 0;
+ ogg_mux->last_ts = GST_CLOCK_TIME_NONE;
+}
+
+static void
+gst_ogg_mux_init (GstOggMux * ogg_mux)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (ogg_mux);
+
+ ogg_mux->srcpad =
+ gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
+ "src"), "src");
+ gst_pad_set_event_function (ogg_mux->srcpad, gst_ogg_mux_handle_src_event);
+ gst_element_add_pad (GST_ELEMENT (ogg_mux), ogg_mux->srcpad);
+
+ GST_OBJECT_FLAG_SET (GST_ELEMENT (ogg_mux), GST_OGG_FLAG_BOS);
+
+ /* seed random number generator for creation of serial numbers */
+ srand (time (NULL));
+
+ ogg_mux->collect = gst_collect_pads_new ();
+ gst_collect_pads_set_function (ogg_mux->collect,
+ (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_ogg_mux_collected),
+ ogg_mux);
+
+ ogg_mux->max_delay = DEFAULT_MAX_DELAY;
+ ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY;
+ ogg_mux->max_tolerance = DEFAULT_MAX_TOLERANCE;
+
+ gst_ogg_mux_clear (ogg_mux);
+}
+
+static void
+gst_ogg_mux_finalize (GObject * object)
+{
+ GstOggMux *ogg_mux;
+
+ ogg_mux = GST_OGG_MUX (object);
+
+ if (ogg_mux->collect) {
+ gst_object_unref (ogg_mux->collect);
+ ogg_mux->collect = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_ogg_mux_ogg_pad_destroy_notify (GstCollectData * data)
+{
+ GstOggPadData *oggpad = (GstOggPadData *) data;
+ GstBuffer *buf;
+
+ ogg_stream_clear (&oggpad->map.stream);
+ gst_caps_replace (&oggpad->map.caps, NULL);
+
+ if (oggpad->pagebuffers) {
+ while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
+ gst_buffer_unref (buf);
+ }
+ g_queue_free (oggpad->pagebuffers);
+ oggpad->pagebuffers = NULL;
+ }
+}
+
+static GstPadLinkReturn
+gst_ogg_mux_sinkconnect (GstPad * pad, GstPad * peer)
+{
+ GstOggMux *ogg_mux;
+
+ ogg_mux = GST_OGG_MUX (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (ogg_mux, "sinkconnect triggered on %s", GST_PAD_NAME (pad));
+
+ gst_object_unref (ogg_mux);
+
+ return GST_PAD_LINK_OK;
+}
+
+static gboolean
+gst_ogg_mux_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstOggMux *ogg_mux = GST_OGG_MUX (gst_pad_get_parent (pad));
+ GstOggPadData *ogg_pad = (GstOggPadData *) gst_pad_get_element_private (pad);
+ gboolean ret = FALSE;
+
+ GST_DEBUG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ /* We don't support non time NEWSEGMENT events */
+ if (segment->format != GST_FORMAT_TIME) {
+ gst_event_unref (event);
+ event = NULL;
+ break;
+ }
+
+ gst_segment_copy_into (segment, &ogg_pad->segment);
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:{
+ gst_segment_init (&ogg_pad->segment, GST_FORMAT_TIME);
+ break;
+ }
+ case GST_EVENT_TAG:{
+ GstTagList *tags;
+
+ gst_event_parse_tag (event, &tags);
+ tags = gst_tag_list_merge (ogg_pad->tags, tags, GST_TAG_MERGE_APPEND);
+ if (ogg_pad->tags)
+ gst_tag_list_free (ogg_pad->tags);
+ ogg_pad->tags = tags;
+
+ GST_DEBUG_OBJECT (ogg_mux, "Got tags %" GST_PTR_FORMAT, ogg_pad->tags);
+ break;
+ }
+ default:
+ break;
+ }
+
+ /* now GstCollectPads can take care of the rest, e.g. EOS */
+ if (event != NULL)
+ ret = ogg_pad->collect_event (pad, event);
+
+ gst_object_unref (ogg_mux);
+ return ret;
+}
+
+static gboolean
+gst_ogg_mux_is_serialno_present (GstOggMux * ogg_mux, guint32 serialno)
+{
+ GSList *walk;
+
+ walk = ogg_mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad = (GstOggPadData *) walk->data;
+ if (pad->map.serialno == serialno)
+ return TRUE;
+ walk = walk->next;
+ }
+
+ return FALSE;
+}
+
+static guint32
+gst_ogg_mux_generate_serialno (GstOggMux * ogg_mux)
+{
+ guint32 serialno;
+
+ do {
+ serialno = g_random_int_range (0, G_MAXINT32);
+ } while (gst_ogg_mux_is_serialno_present (ogg_mux, serialno));
+
+ return serialno;
+}
+
+static GstPad *
+gst_ogg_mux_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
+{
+ GstOggMux *ogg_mux;
+ GstPad *newpad;
+ GstElementClass *klass;
+
+ g_return_val_if_fail (templ != NULL, NULL);
+
+ if (templ->direction != GST_PAD_SINK)
+ goto wrong_direction;
+
+ g_return_val_if_fail (GST_IS_OGG_MUX (element), NULL);
+ ogg_mux = GST_OGG_MUX (element);
+
+ klass = GST_ELEMENT_GET_CLASS (element);
+
+ if (templ != gst_element_class_get_pad_template (klass, "sink_%d"))
+ goto wrong_template;
+
+ {
+ guint32 serial;
+ gchar *name;
+
+ if (req_name == NULL || strlen (req_name) < 6) {
+ /* no name given when requesting the pad, use random serial number */
+ serial = gst_ogg_mux_generate_serialno (ogg_mux);
+ } else {
+ /* parse serial number from requested padname */
+ unsigned long long_serial;
+ char *endptr = NULL;
+ long_serial = strtoul (&req_name[5], &endptr, 10);
+ if ((endptr && *endptr) || (long_serial & ~0xffffffff)) {
+ GST_WARNING_OBJECT (ogg_mux, "Invalid serial number specification: %s",
+ req_name + 5);
+ return NULL;
+ }
+ serial = (guint32) long_serial;
+ }
+ /* create new pad with the name */
+ GST_DEBUG_OBJECT (ogg_mux, "Creating new pad for serial %d", serial);
+ name = g_strdup_printf ("sink_%d", serial);
+ 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 */
+ {
+ GstOggPadData *oggpad;
+
+ oggpad = (GstOggPadData *)
+ gst_collect_pads_add_pad_full (ogg_mux->collect, newpad,
+ sizeof (GstOggPadData), gst_ogg_mux_ogg_pad_destroy_notify);
+ ogg_mux->active_pads++;
+
+ oggpad->map.serialno = serial;
+ ogg_stream_init (&oggpad->map.stream, oggpad->map.serialno);
+ oggpad->packetno = 0;
+ oggpad->pageno = 0;
+ oggpad->eos = FALSE;
+ /* we assume there will be some control data first for this pad */
+ oggpad->state = GST_OGG_PAD_STATE_CONTROL;
+ oggpad->new_page = TRUE;
+ oggpad->first_delta = FALSE;
+ oggpad->prev_delta = FALSE;
+ oggpad->data_pushed = FALSE;
+ oggpad->pagebuffers = g_queue_new ();
+ oggpad->map.headers = NULL;
+ oggpad->map.queued = NULL;
+ oggpad->next_granule = 0;
+ oggpad->keyframe_granule = -1;
+
+ gst_segment_init (&oggpad->segment, GST_FORMAT_TIME);
+
+ oggpad->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad);
+ gst_pad_set_event_function (newpad,
+ GST_DEBUG_FUNCPTR (gst_ogg_mux_sink_event));
+ }
+ }
+
+ /* setup some pad functions */
+ gst_pad_set_link_function (newpad, gst_ogg_mux_sinkconnect);
+
+ /* dd the pad to the element */
+ gst_element_add_pad (element, newpad);
+
+ return newpad;
+
+ /* ERRORS */
+wrong_direction:
+ {
+ g_warning ("ogg_mux: request pad that is not a SINK pad\n");
+ return NULL;
+ }
+wrong_template:
+ {
+ g_warning ("ogg_mux: this is not our template!\n");
+ return NULL;
+ }
+}
+
+static void
+gst_ogg_mux_release_pad (GstElement * element, GstPad * pad)
+{
+ GstOggMux *ogg_mux;
+
+ ogg_mux = GST_OGG_MUX (gst_pad_get_parent (pad));
+
+ gst_collect_pads_remove_pad (ogg_mux->collect, pad);
+ gst_element_remove_pad (element, pad);
+
+ gst_object_unref (ogg_mux);
+}
+
+/* handle events */
+static gboolean
+gst_ogg_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 GstBuffer *
+gst_ogg_mux_buffer_from_page (GstOggMux * mux, ogg_page * page, gboolean delta)
+{
+ GstBuffer *buffer;
+
+ /* allocate space for header and body */
+ buffer = gst_buffer_new_and_alloc (page->header_len + page->body_len);
+ gst_buffer_fill (buffer, 0, page->header, page->header_len);
+ gst_buffer_fill (buffer, page->header_len, page->body, page->body_len);
+
+ /* Here we set granulepos as our OFFSET_END to give easy direct access to
+ * this value later. Before we push it, we reset this to OFFSET + SIZE
+ * (see gst_ogg_mux_push_buffer). */
+ GST_BUFFER_OFFSET_END (buffer) = ogg_page_granulepos (page);
+ if (delta)
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ GST_LOG_OBJECT (mux, GST_GP_FORMAT
+ " created buffer %p from ogg page",
+ GST_GP_CAST (ogg_page_granulepos (page)), buffer);
+
+ return buffer;
+}
+
+static GstFlowReturn
+gst_ogg_mux_push_buffer (GstOggMux * mux, GstBuffer * buffer,
+ GstOggPadData * oggpad)
+{
+ /* fix up OFFSET and OFFSET_END again */
+ GST_BUFFER_OFFSET (buffer) = mux->offset;
+ mux->offset += gst_buffer_get_size (buffer);
+ GST_BUFFER_OFFSET_END (buffer) = mux->offset;
+
+ /* Ensure we have monotonically increasing timestamps in the output. */
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) {
+ gint64 run_time = GST_BUFFER_TIMESTAMP (buffer);
+ if (mux->last_ts != GST_CLOCK_TIME_NONE && run_time < mux->last_ts)
+ GST_BUFFER_TIMESTAMP (buffer) = mux->last_ts;
+ else
+ mux->last_ts = run_time;
+ }
+
+ return gst_pad_push (mux->srcpad, buffer);
+}
+
+/* if all queues have at least one page, dequeue the page with the lowest
+ * timestamp */
+static gboolean
+gst_ogg_mux_dequeue_page (GstOggMux * mux, GstFlowReturn * flowret)
+{
+ GSList *walk;
+ GstOggPadData *opad = NULL; /* "oldest" pad */
+ GstClockTime oldest = GST_CLOCK_TIME_NONE;
+ GstBuffer *buf = NULL;
+ gboolean ret = FALSE;
+
+ *flowret = GST_FLOW_OK;
+
+ walk = mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad = (GstOggPadData *) walk->data;
+
+ /* We need each queue to either be at EOS, or have one or more pages
+ * available with a set granulepos (i.e. not -1), otherwise we don't have
+ * enough data yet to determine which stream needs to go next for correct
+ * time ordering. */
+ if (pad->pagebuffers->length == 0) {
+ if (pad->eos) {
+ GST_LOG_OBJECT (pad->collect.pad,
+ "pad is EOS, skipping for dequeue decision");
+ } else {
+ GST_LOG_OBJECT (pad->collect.pad,
+ "no pages in this queue, can't dequeue");
+ return FALSE;
+ }
+ } else {
+ /* We then need to check for a non-negative granulepos */
+ int i;
+ gboolean valid = FALSE;
+
+ for (i = 0; i < pad->pagebuffers->length; i++) {
+ buf = g_queue_peek_nth (pad->pagebuffers, i);
+ /* Here we check the OFFSET_END, which is actually temporarily the
+ * granulepos value for this buffer */
+ if (GST_BUFFER_OFFSET_END (buf) != -1) {
+ valid = TRUE;
+ break;
+ }
+ }
+ if (!valid) {
+ GST_LOG_OBJECT (pad->collect.pad,
+ "No page timestamps in queue, can't dequeue");
+ return FALSE;
+ }
+ }
+
+ walk = g_slist_next (walk);
+ }
+
+ walk = mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad = (GstOggPadData *) walk->data;
+
+ /* any page with a granulepos of -1 can be pushed immediately.
+ * TODO: it CAN be, but it seems silly to do so? */
+ buf = g_queue_peek_head (pad->pagebuffers);
+ while (buf && GST_BUFFER_OFFSET_END (buf) == -1) {
+ GST_LOG_OBJECT (pad->collect.pad, "[gp -1] pushing page");
+ g_queue_pop_head (pad->pagebuffers);
+ *flowret = gst_ogg_mux_push_buffer (mux, buf, pad);
+ buf = g_queue_peek_head (pad->pagebuffers);
+ ret = TRUE;
+ }
+
+ if (buf) {
+ /* if no oldest buffer yet, take this one */
+ if (oldest == GST_CLOCK_TIME_NONE) {
+ GST_LOG_OBJECT (mux, "no oldest yet, taking buffer %p from pad %"
+ GST_PTR_FORMAT " with gp time %" GST_TIME_FORMAT,
+ buf, pad->collect.pad, GST_TIME_ARGS (GST_BUFFER_OFFSET (buf)));
+ oldest = GST_BUFFER_OFFSET (buf);
+ opad = pad;
+ } else {
+ /* if we have an oldest, compare with this one */
+ if (GST_BUFFER_OFFSET (buf) < oldest) {
+ GST_LOG_OBJECT (mux, "older buffer %p, taking from pad %"
+ GST_PTR_FORMAT " with gp time %" GST_TIME_FORMAT,
+ buf, pad->collect.pad, GST_TIME_ARGS (GST_BUFFER_OFFSET (buf)));
+ oldest = GST_BUFFER_OFFSET (buf);
+ opad = pad;
+ }
+ }
+ }
+ walk = g_slist_next (walk);
+ }
+
+ if (oldest != GST_CLOCK_TIME_NONE) {
+ g_assert (opad);
+ buf = g_queue_pop_head (opad->pagebuffers);
+ GST_LOG_OBJECT (opad->collect.pad,
+ GST_GP_FORMAT " pushing oldest page buffer %p (granulepos time %"
+ GST_TIME_FORMAT ")", GST_BUFFER_OFFSET_END (buf), buf,
+ GST_TIME_ARGS (GST_BUFFER_OFFSET (buf)));
+ *flowret = gst_ogg_mux_push_buffer (mux, buf, opad);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+/* put the given ogg page on a per-pad queue, timestamping it correctly.
+ * after that, dequeue and push as many pages as possible.
+ * Caller should make sure:
+ * pad->timestamp was set with the timestamp of the first packet put
+ * on the page
+ * pad->timestamp_end was set with the timestamp + duration of the last packet
+ * put on the page
+ * pad->gp_time was set with the time matching the gp of the last
+ * packet put on the page
+ *
+ * will also reset timestamp and timestamp_end, so caller func can restart
+ * counting.
+ */
+static GstFlowReturn
+gst_ogg_mux_pad_queue_page (GstOggMux * mux, GstOggPadData * pad,
+ ogg_page * page, gboolean delta)
+{
+ GstFlowReturn ret;
+ GstBuffer *buffer = gst_ogg_mux_buffer_from_page (mux, page, delta);
+
+ /* take the timestamp of the first packet on this page */
+ GST_BUFFER_TIMESTAMP (buffer) = pad->timestamp;
+ GST_BUFFER_DURATION (buffer) = pad->timestamp_end - pad->timestamp;
+ /* take the gp time of the last completed packet on this page */
+ GST_BUFFER_OFFSET (buffer) = pad->gp_time;
+
+ /* the next page will start where the current page's end time leaves off */
+ pad->timestamp = pad->timestamp_end;
+
+ g_queue_push_tail (pad->pagebuffers, buffer);
+ GST_LOG_OBJECT (pad->collect.pad, GST_GP_FORMAT
+ " queued buffer page %p (gp time %"
+ GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT
+ "), %d page buffers queued", GST_GP_CAST (ogg_page_granulepos (page)),
+ buffer, GST_TIME_ARGS (GST_BUFFER_OFFSET (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ g_queue_get_length (pad->pagebuffers));
+
+ while (gst_ogg_mux_dequeue_page (mux, &ret)) {
+ if (ret != GST_FLOW_OK)
+ break;
+ }
+
+ return ret;
+}
+
+/*
+ * Given two pads, compare the buffers queued on it.
+ * Returns:
+ * 0 if they have an equal priority
+ * -1 if the first is better
+ * 1 if the second is better
+ * Priority decided by: a) validity, b) older timestamp, c) smaller number
+ * of muxed pages
+ */
+static gint
+gst_ogg_mux_compare_pads (GstOggMux * ogg_mux, GstOggPadData * first,
+ GstOggPadData * second)
+{
+ guint64 firsttime, secondtime;
+
+ /* if the first pad doesn't contain anything or is even NULL, return
+ * the second pad as best candidate and vice versa */
+ if (first == NULL)
+ return 1;
+ if (second == NULL)
+ return -1;
+
+ /* no timestamp on first buffer, it must go first */
+ firsttime = GST_BUFFER_TIMESTAMP (first->buffer);
+ if (firsttime == GST_CLOCK_TIME_NONE)
+ return -1;
+
+ /* no timestamp on second buffer, it must go first */
+ secondtime = GST_BUFFER_TIMESTAMP (second->buffer);
+ if (secondtime == GST_CLOCK_TIME_NONE)
+ return 1;
+
+ /* first buffer has higher timestamp, second one should go first */
+ if (secondtime < firsttime)
+ return 1;
+ /* second buffer has higher timestamp, first one should go first */
+ else if (secondtime > firsttime)
+ return -1;
+ else {
+ /* buffers with equal timestamps, prefer the pad that has the
+ * least number of pages muxed */
+ if (second->pageno < first->pageno)
+ return 1;
+ else if (second->pageno > first->pageno)
+ return -1;
+ }
+
+ /* same priority if all of the above failed */
+ return 0;
+}
+
+static GstBuffer *
+gst_ogg_mux_decorate_buffer (GstOggMux * ogg_mux, GstOggPadData * pad,
+ GstBuffer * buf)
+{
+ GstClockTime time;
+ gint64 duration, granule, limit;
+ GstClockTime next_time;
+ GstClockTimeDiff diff;
+ ogg_packet packet;
+ gsize size;
+
+ /* ensure messing with metadata is ok */
+ buf = gst_buffer_make_writable (buf);
+
+ /* convert time to running time, so we need no longer bother about that */
+ time = GST_BUFFER_TIMESTAMP (buf);
+ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) {
+ time = gst_segment_to_running_time (&pad->segment, GST_FORMAT_TIME, time);
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) {
+ gst_buffer_unref (buf);
+ return NULL;
+ } else {
+ GST_BUFFER_TIMESTAMP (buf) = time;
+ }
+ }
+
+ /* now come up with granulepos stuff corresponding to time */
+ if (!pad->have_type ||
+ pad->map.granulerate_n <= 0 || pad->map.granulerate_d <= 0)
+ goto no_granule;
+
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ duration = gst_ogg_stream_get_packet_duration (&pad->map, &packet);
+ gst_buffer_unmap (buf, packet.packet, size);
+
+ /* give up if no duration can be determined, relying on upstream */
+ if (G_UNLIKELY (duration < 0)) {
+ /* well, if some day we really could handle sparse input ... */
+ if (pad->map.is_sparse) {
+ limit = 1;
+ diff = 2;
+ goto resync;
+ }
+ GST_WARNING_OBJECT (pad->collect.pad,
+ "failed to determine packet duration");
+ goto no_granule;
+ }
+
+ GST_LOG_OBJECT (pad->collect.pad, "buffer ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT ", granule duration %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (time), GST_TIME_ARGS (GST_BUFFER_DURATION (buf)),
+ duration);
+
+ /* determine granule corresponding to time,
+ * using the inverse of oggdemux' granule -> time */
+
+ /* see if interpolated granule matches good enough */
+ granule = pad->next_granule;
+ next_time = gst_ogg_stream_granule_to_time (&pad->map, pad->next_granule);
+ diff = GST_CLOCK_DIFF (next_time, time);
+
+ /* we tolerate deviation up to configured or within granule granularity */
+ limit = gst_ogg_stream_granule_to_time (&pad->map, 1) / 2;
+ limit = MAX (limit, ogg_mux->max_tolerance);
+
+ GST_LOG_OBJECT (pad->collect.pad, "expected granule %" G_GINT64_FORMAT " == "
+ "time %" GST_TIME_FORMAT " --> ts diff %" GST_TIME_FORMAT
+ " < tolerance %" GST_TIME_FORMAT " (?)",
+ granule, GST_TIME_ARGS (next_time), GST_TIME_ARGS (ABS (diff)),
+ GST_TIME_ARGS (limit));
+
+resync:
+ /* if not good enough, determine granule based on time */
+ if (diff > limit || diff < -limit) {
+ granule = gst_util_uint64_scale_round (time, pad->map.granulerate_n,
+ GST_SECOND * pad->map.granulerate_d);
+ GST_DEBUG_OBJECT (pad->collect.pad,
+ "resyncing to determined granule %" G_GINT64_FORMAT, granule);
+ }
+
+ if (pad->map.is_ogm || pad->map.is_sparse) {
+ pad->next_granule = granule;
+ } else {
+ granule += duration;
+ pad->next_granule = granule;
+ }
+
+ /* track previous keyframe */
+ if (!GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT))
+ pad->keyframe_granule = granule;
+
+ /* determine corresponding time and granulepos */
+ GST_BUFFER_OFFSET (buf) = gst_ogg_stream_granule_to_time (&pad->map, granule);
+ GST_BUFFER_OFFSET_END (buf) =
+ gst_ogg_stream_granule_to_granulepos (&pad->map, granule,
+ pad->keyframe_granule);
+
+ return buf;
+
+ /* ERRORS */
+no_granule:
+ {
+ GST_DEBUG_OBJECT (pad->collect.pad, "could not determine granulepos, "
+ "falling back to upstream provided metadata");
+ return buf;
+ }
+}
+
+
+/* make sure at least one buffer is queued on all pads, two if possible
+ *
+ * if pad->buffer == NULL, pad->next_buffer != NULL, then
+ * we do not know if the buffer is the last or not
+ * if pad->buffer != NULL, pad->next_buffer != NULL, then
+ * pad->buffer is not the last buffer for the pad
+ * if pad->buffer != NULL, pad->next_buffer == NULL, then
+ * pad->buffer if the last buffer for the pad
+ *
+ * returns a pointer to an oggpad that holds the best buffer, or
+ * NULL when no pad was usable. "best" means the buffer marked
+ * with the lowest timestamp. If best->buffer == NULL then either
+ * we're at EOS (popped = FALSE), or a buffer got dropped, so retry. */
+static GstOggPadData *
+gst_ogg_mux_queue_pads (GstOggMux * ogg_mux, gboolean * popped)
+{
+ GstOggPadData *bestpad = NULL;
+ GSList *walk;
+
+ *popped = FALSE;
+
+ /* try to make sure we have a buffer from each usable pad first */
+ walk = ogg_mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad;
+ GstCollectData *data;
+
+ data = (GstCollectData *) walk->data;
+ pad = (GstOggPadData *) data;
+
+ walk = g_slist_next (walk);
+
+ GST_LOG_OBJECT (data->pad, "looking at pad for buffer");
+
+ /* try to get a new buffer for this pad if needed and possible */
+ if (pad->buffer == NULL) {
+ GstBuffer *buf;
+
+ buf = gst_collect_pads_pop (ogg_mux->collect, data);
+ GST_LOG_OBJECT (data->pad, "popped buffer %" GST_PTR_FORMAT, buf);
+
+ /* On EOS we get a NULL buffer */
+ if (buf != NULL) {
+ *popped = TRUE;
+
+ if (ogg_mux->delta_pad == NULL &&
+ GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT))
+ ogg_mux->delta_pad = pad;
+
+ /* if we need headers */
+ if (pad->state == GST_OGG_PAD_STATE_CONTROL) {
+ /* and we have one */
+ ogg_packet packet;
+ gboolean is_header;
+ gsize size;
+
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+
+ /* if we're not yet in data mode, ensure we're setup on the first packet */
+ if (!pad->have_type) {
+ GstCaps *caps;
+
+ /* Use headers in caps, if any; this will allow us to be resilient
+ * to starting streams on the fly, and some streams (like VP8
+ * at least) do not send headers packets, as other muxers don't
+ * expect/need them. */
+ caps = gst_pad_get_current_caps (GST_PAD_CAST (data->pad));
+ pad->have_type =
+ gst_ogg_stream_setup_map_from_caps_headers (&pad->map, caps);
+
+ if (!pad->have_type) {
+ /* fallback on the packet */
+ pad->have_type = gst_ogg_stream_setup_map (&pad->map, &packet);
+ }
+ if (!pad->have_type) {
+ GST_ERROR_OBJECT (pad, "mapper didn't recognise input stream "
+ "(pad caps: %" GST_PTR_FORMAT ")", caps);
+ } else {
+ GST_DEBUG_OBJECT (pad, "caps detected: %" GST_PTR_FORMAT,
+ pad->map.caps);
+ }
+ if (caps)
+ gst_caps_unref (caps);
+ }
+
+ if (pad->have_type)
+ is_header = gst_ogg_stream_packet_is_header (&pad->map, &packet);
+ else /* fallback (FIXME 0.11: remove IN_CAPS hack) */
+ is_header = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+
+ gst_buffer_unmap (buf, packet.packet, size);
+
+ if (is_header) {
+ GST_DEBUG_OBJECT (ogg_mux,
+ "got header buffer in control state, ignoring");
+ /* just ignore */
+ pad->map.n_header_packets_seen++;
+ gst_buffer_unref (buf);
+ buf = NULL;
+ } else {
+ GST_DEBUG_OBJECT (ogg_mux,
+ "got data buffer in control state, switching to data mode");
+ /* this is a data buffer so switch to data state */
+ pad->state = GST_OGG_PAD_STATE_DATA;
+
+ /* check if this type of stream allows generating granulepos
+ * metadata here, if not, upstream will have to provide */
+ if (gst_ogg_stream_granule_to_granulepos (&pad->map, 1, 1) < 0) {
+ GST_WARNING_OBJECT (data->pad, "can not generate metadata; "
+ "relying on upstream");
+ /* disable metadata code path, otherwise not used anyway */
+ pad->map.granulerate_n = 0;
+ }
+ }
+ }
+
+ /* so now we should have a real data packet;
+ * see that it is properly decorated */
+ if (G_LIKELY (buf)) {
+ buf = gst_ogg_mux_decorate_buffer (ogg_mux, pad, buf);
+ if (G_UNLIKELY (!buf))
+ GST_DEBUG_OBJECT (data->pad, "buffer clipped");
+ }
+ }
+
+ pad->buffer = buf;
+ }
+
+ /* we should have a buffer now, see if it is the best pad to
+ * pull on */
+ if (pad->buffer) {
+ if (gst_ogg_mux_compare_pads (ogg_mux, bestpad, pad) > 0) {
+ GST_LOG_OBJECT (data->pad,
+ "new best pad, with buffer %" GST_PTR_FORMAT, pad->buffer);
+
+ bestpad = pad;
+ }
+ }
+ }
+
+ return bestpad;
+}
+
+static GList *
+gst_ogg_mux_get_headers (GstOggPadData * pad)
+{
+ GList *res = NULL;
+ GstStructure *structure;
+ GstCaps *caps;
+ GstPad *thepad;
+
+ thepad = pad->collect.pad;
+
+ GST_LOG_OBJECT (thepad, "getting headers");
+
+ caps = gst_pad_get_current_caps (thepad);
+ if (caps != NULL) {
+ const GValue *streamheader;
+
+ structure = gst_caps_get_structure (caps, 0);
+ streamheader = gst_structure_get_value (structure, "streamheader");
+ if (streamheader != NULL) {
+ GST_LOG_OBJECT (thepad, "got header");
+ if (G_VALUE_TYPE (streamheader) == GST_TYPE_ARRAY) {
+ GArray *bufarr = g_value_peek_pointer (streamheader);
+ gint i;
+
+ GST_LOG_OBJECT (thepad, "got fixed list");
+
+ for (i = 0; i < bufarr->len; i++) {
+ GValue *bufval = &g_array_index (bufarr, GValue, i);
+
+ GST_LOG_OBJECT (thepad, "item %d", i);
+ if (G_VALUE_TYPE (bufval) == GST_TYPE_BUFFER) {
+ GstBuffer *buf = g_value_peek_pointer (bufval);
+
+ GST_LOG_OBJECT (thepad, "adding item %d to header list", i);
+
+ gst_buffer_ref (buf);
+ res = g_list_append (res, buf);
+ }
+ }
+ } else {
+ GST_LOG_OBJECT (thepad, "streamheader is not fixed list");
+ }
+
+ } else if (gst_structure_has_name (structure, "video/x-dirac")) {
+ res = g_list_append (res, pad->buffer);
+ pad->buffer = NULL;
+ } else {
+ GST_LOG_OBJECT (thepad, "caps don't have streamheader");
+ }
+ gst_caps_unref (caps);
+ } else {
+ GST_LOG_OBJECT (thepad, "got empty caps as negotiated format");
+ }
+ return res;
+}
+
+static GstCaps *
+gst_ogg_mux_set_header_on_caps (GstCaps * caps, GList * buffers)
+{
+ GstStructure *structure;
+ GValue array = { 0 };
+ GList *walk = buffers;
+
+ caps = gst_caps_make_writable (caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* put buffers in a fixed list */
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ while (walk) {
+ GstBuffer *buf = GST_BUFFER (walk->data);
+ GstBuffer *copy;
+ GValue value = { 0 };
+
+ walk = walk->next;
+
+ /* mark buffer */
+ GST_LOG ("Setting IN_CAPS on buffer of length %" G_GSIZE_FORMAT,
+ gst_buffer_get_size (buf));
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ copy = gst_buffer_copy (buf);
+ gst_value_set_buffer (&value, copy);
+ gst_buffer_unref (copy);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ }
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+
+ return caps;
+}
+
+static void
+gst_ogg_mux_create_header_packet_with_flags (ogg_packet * packet,
+ gboolean bos, gboolean eos)
+{
+ packet->granulepos = 0;
+ /* mark BOS and packet number */
+ packet->b_o_s = bos;
+ /* mark EOS */
+ packet->e_o_s = eos;
+}
+
+static void
+gst_ogg_mux_create_header_packet (ogg_packet * packet, GstOggPadData * pad)
+{
+ gst_ogg_mux_create_header_packet_with_flags (packet, pad->packetno == 0, 0);
+ packet->packetno = pad->packetno++;
+}
+
+static void
+gst_ogg_mux_submit_skeleton_header_packet (GstOggMux * mux,
+ ogg_stream_state * os, GstBuffer * buf, gboolean bos, gboolean eos)
+{
+ ogg_packet packet;
+ gsize size;
+
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ gst_ogg_mux_create_header_packet_with_flags (&packet, bos, eos);
+ ogg_stream_packetin (os, &packet);
+ gst_buffer_unref (buf);
+}
+
+static void
+gst_ogg_mux_make_fishead (GstOggMux * mux, ogg_stream_state * os)
+{
+ GstByteWriter bw;
+ GstBuffer *fishead;
+
+ GST_DEBUG_OBJECT (mux, "Creating fishead");
+
+ gst_byte_writer_init_with_size (&bw, 64, TRUE);
+ gst_byte_writer_put_string_utf8 (&bw, "fishead");
+ gst_byte_writer_put_int16_le (&bw, 3); /* version major */
+ gst_byte_writer_put_int16_le (&bw, 0); /* version minor */
+ gst_byte_writer_put_int64_le (&bw, 0); /* presentation time numerator */
+ gst_byte_writer_put_int64_le (&bw, 1000); /* ...and denominator */
+ gst_byte_writer_put_int64_le (&bw, 0); /* base time numerator */
+ gst_byte_writer_put_int64_le (&bw, 1000); /* ...and denominator */
+ gst_byte_writer_fill (&bw, ' ', 20); /* UTC time */
+ g_assert (gst_byte_writer_get_pos (&bw) == 64);
+ fishead = gst_byte_writer_reset_and_get_buffer (&bw);
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os, fishead, 1, 0);
+}
+
+static void
+gst_ogg_mux_byte_writer_put_string_utf8 (GstByteWriter * bw, const char *s)
+{
+ gst_byte_writer_put_data (bw, (const guint8 *) s, strlen (s));
+}
+
+static void
+gst_ogg_mux_add_fisbone_message_header (GstOggMux * mux, GstByteWriter * bw,
+ const char *tag, const char *value)
+{
+ /* It is valid to pass NULL as the value to omit the tag */
+ if (!value)
+ return;
+ GST_DEBUG_OBJECT (mux, "Adding fisbone message header %s: %s", tag, value);
+ gst_ogg_mux_byte_writer_put_string_utf8 (bw, tag);
+ gst_ogg_mux_byte_writer_put_string_utf8 (bw, ": ");
+ gst_ogg_mux_byte_writer_put_string_utf8 (bw, value);
+ gst_ogg_mux_byte_writer_put_string_utf8 (bw, "\r\n");
+}
+
+static void
+gst_ogg_mux_add_fisbone_message_header_from_tags (GstOggMux * mux,
+ GstByteWriter * bw, const char *header, const char *tag,
+ const GstTagList * tags)
+{
+ GString *s;
+ guint size = gst_tag_list_get_tag_size (tags, tag), n;
+ GST_DEBUG_OBJECT (mux, "Found %u tags for name %s", size, tag);
+ if (size == 0)
+ return;
+ s = g_string_new ("");
+ for (n = 0; n < size; ++n) {
+ gchar *tmp;
+ if (n)
+ g_string_append (s, ", ");
+ gst_tag_list_get_string_index (tags, tag, n, &tmp);
+ g_string_append (s, tmp);
+ g_free (tmp);
+ }
+ gst_ogg_mux_add_fisbone_message_header (mux, bw, header, s->str);
+ g_string_free (s, TRUE);
+}
+
+/* This is a basic placeholder to generate roles for the tracks.
+ For tracks with more than one video, both video tracks will get
+ tagged with a "video/main" role, but we have no way of knowing
+ which one is the main one, if any. We could just pick one. For
+ audio, it's more complicated as we don't know which is music,
+ which is dubbing, etc. For kate, we could take a pretty good
+ guess based on the category, as role essentially is category.
+ For now, leave this as is. */
+static const char *
+gst_ogg_mux_get_default_role (GstOggPadData * pad)
+{
+ const char *type = gst_ogg_stream_get_media_type (&pad->map);
+ if (type) {
+ if (!strncmp (type, "video/", strlen ("video/")))
+ return "video/main";
+ if (!strncmp (type, "audio/", strlen ("audio/")))
+ return "audio/main";
+ if (!strcmp (type + strlen (type) - strlen ("kate"), "kate"))
+ return "text/caption";
+ }
+ return NULL;
+}
+
+static void
+gst_ogg_mux_make_fisbone (GstOggMux * mux, ogg_stream_state * os,
+ GstOggPadData * pad)
+{
+ GstByteWriter bw;
+
+ GST_DEBUG_OBJECT (mux,
+ "Creating %s fisbone for serial %08x",
+ gst_ogg_stream_get_media_type (&pad->map), pad->map.serialno);
+
+ gst_byte_writer_init (&bw);
+ gst_byte_writer_put_string_utf8 (&bw, "fisbone");
+ gst_byte_writer_put_int32_le (&bw, 44); /* offset to message headers */
+ gst_byte_writer_put_uint32_le (&bw, pad->map.serialno);
+ gst_byte_writer_put_uint32_le (&bw, pad->map.n_header_packets);
+ gst_byte_writer_put_uint64_le (&bw, pad->map.granulerate_n);
+ gst_byte_writer_put_uint64_le (&bw, pad->map.granulerate_d);
+ gst_byte_writer_put_uint64_le (&bw, 0); /* base granule */
+ gst_byte_writer_put_uint32_le (&bw, pad->map.preroll);
+ gst_byte_writer_put_uint8 (&bw, pad->map.granuleshift);
+ gst_byte_writer_fill (&bw, 0, 3); /* padding */
+ /* message header fields - MIME type for now */
+ gst_ogg_mux_add_fisbone_message_header (mux, &bw, "Content-Type",
+ gst_ogg_stream_get_media_type (&pad->map));
+ gst_ogg_mux_add_fisbone_message_header (mux, &bw, "Role",
+ gst_ogg_mux_get_default_role (pad));
+ gst_ogg_mux_add_fisbone_message_header_from_tags (mux, &bw, "Language",
+ GST_TAG_LANGUAGE_CODE, pad->tags);
+ gst_ogg_mux_add_fisbone_message_header_from_tags (mux, &bw, "Title",
+ GST_TAG_TITLE, pad->tags);
+
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os,
+ gst_byte_writer_reset_and_get_buffer (&bw), 0, 0);
+}
+
+static void
+gst_ogg_mux_make_fistail (GstOggMux * mux, ogg_stream_state * os)
+{
+ GST_DEBUG_OBJECT (mux, "Creating fistail");
+
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os,
+ gst_buffer_new_and_alloc (0), 0, 1);
+}
+
+/*
+ * For each pad we need to write out one (small) header in one
+ * page that allows decoders to identify the type of the stream.
+ * After that we need to write out all extra info for the decoders.
+ * In the case of a codec that also needs data as configuration, we can
+ * find that info in the streamcaps.
+ * After writing the headers we must start a new page for the data.
+ */
+static GstFlowReturn
+gst_ogg_mux_send_headers (GstOggMux * mux)
+{
+ GSList *walk;
+ GList *hbufs, *hwalk;
+ GstCaps *caps;
+ GstFlowReturn ret;
+ ogg_page page;
+ ogg_stream_state skeleton_stream;
+
+ hbufs = NULL;
+ ret = GST_FLOW_OK;
+
+ GST_LOG_OBJECT (mux, "collecting headers");
+
+ walk = mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad;
+ GstPad *thepad;
+
+ pad = (GstOggPadData *) walk->data;
+ thepad = pad->collect.pad;
+
+ walk = g_slist_next (walk);
+
+ GST_LOG_OBJECT (mux, "looking at pad %s:%s", GST_DEBUG_PAD_NAME (thepad));
+
+ /* if the pad has no buffer, we don't care */
+ if (pad->buffer == NULL)
+ continue;
+
+ /* now figure out the headers */
+ pad->map.headers = gst_ogg_mux_get_headers (pad);
+ }
+
+ GST_LOG_OBJECT (mux, "creating BOS pages");
+ walk = mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad;
+ GstBuffer *buf;
+ ogg_packet packet;
+ GstPad *thepad;
+ GstCaps *caps;
+ GstStructure *structure;
+ GstBuffer *hbuf;
+ gsize size;
+
+ pad = (GstOggPadData *) walk->data;
+ thepad = pad->collect.pad;
+ caps = gst_pad_get_current_caps (thepad);
+ structure = gst_caps_get_structure (caps, 0);
+
+ walk = walk->next;
+
+ pad->packetno = 0;
+
+ GST_LOG_OBJECT (thepad, "looping over headers");
+
+ if (pad->map.headers) {
+ buf = GST_BUFFER (pad->map.headers->data);
+ pad->map.headers = g_list_remove (pad->map.headers, buf);
+ } else if (pad->buffer) {
+ buf = pad->buffer;
+ gst_buffer_ref (buf);
+ } else {
+ /* fixme -- should be caught in the previous list traversal. */
+ GST_OBJECT_LOCK (thepad);
+ g_critical ("No headers or buffers on pad %s:%s",
+ GST_DEBUG_PAD_NAME (thepad));
+ GST_OBJECT_UNLOCK (thepad);
+ continue;
+ }
+
+ /* create a packet from the buffer */
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+
+ gst_ogg_mux_create_header_packet (&packet, pad);
+
+ /* swap the packet in */
+ ogg_stream_packetin (&pad->map.stream, &packet);
+
+ gst_buffer_unmap (buf, packet.packet, size);
+ gst_buffer_unref (buf);
+
+ GST_LOG_OBJECT (thepad, "flushing out BOS page");
+ if (!ogg_stream_flush (&pad->map.stream, &page))
+ g_critical ("Could not flush BOS page");
+
+ hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+
+ GST_LOG_OBJECT (mux, "swapped out page with mime type %s",
+ gst_structure_get_name (structure));
+
+ /* quick hack: put video pages at the front.
+ * Ideally, we would have a settable enum for which Ogg
+ * profile we work with, and order based on that.
+ * (FIXME: if there is more than one video stream, shouldn't we only put
+ * one's BOS into the first page, followed by an audio stream's BOS, and
+ * only then followed by the remaining video and audio streams?) */
+ if (pad->map.is_video) {
+ GST_DEBUG_OBJECT (thepad, "putting %s page at the front",
+ gst_structure_get_name (structure));
+ hbufs = g_list_prepend (hbufs, hbuf);
+ } else {
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+
+ gst_caps_unref (caps);
+ }
+
+ /* The Skeleton BOS goes first - even before the video that went first before */
+ if (mux->use_skeleton) {
+ ogg_stream_init (&skeleton_stream, gst_ogg_mux_generate_serialno (mux));
+ gst_ogg_mux_make_fishead (mux, &skeleton_stream);
+ while (ogg_stream_flush (&skeleton_stream, &page) > 0) {
+ GstBuffer *hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+ }
+
+ GST_LOG_OBJECT (mux, "creating next headers");
+ walk = mux->collect->data;
+ while (walk) {
+ GstOggPadData *pad;
+ GstPad *thepad;
+
+ pad = (GstOggPadData *) walk->data;
+ thepad = pad->collect.pad;
+
+ walk = walk->next;
+
+ if (mux->use_skeleton)
+ gst_ogg_mux_make_fisbone (mux, &skeleton_stream, pad);
+
+ GST_LOG_OBJECT (mux, "looping over headers for pad %s:%s",
+ GST_DEBUG_PAD_NAME (thepad));
+
+ hwalk = pad->map.headers;
+ while (hwalk) {
+ GstBuffer *buf = GST_BUFFER (hwalk->data);
+ ogg_packet packet;
+ ogg_page page;
+ gsize size;
+
+ hwalk = hwalk->next;
+
+ /* create a packet from the buffer */
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+
+ gst_ogg_mux_create_header_packet (&packet, pad);
+
+ /* swap the packet in */
+ ogg_stream_packetin (&pad->map.stream, &packet);
+ gst_buffer_unmap (buf, packet.packet, size);
+ gst_buffer_unref (buf);
+
+ /* if last header, flush page */
+ if (hwalk == NULL) {
+ GST_LOG_OBJECT (mux,
+ "flushing page as packet %" G_GUINT64_FORMAT " is first or "
+ "last packet", (guint64) packet.packetno);
+ while (ogg_stream_flush (&pad->map.stream, &page)) {
+ GstBuffer *hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+
+ GST_LOG_OBJECT (mux, "swapped out page");
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+ } else {
+ GST_LOG_OBJECT (mux, "try to swap out page");
+ /* just try to swap out a page then */
+ while (ogg_stream_pageout (&pad->map.stream, &page) > 0) {
+ GstBuffer *hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+
+ GST_LOG_OBJECT (mux, "swapped out page");
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+ }
+ }
+ g_list_free (pad->map.headers);
+ pad->map.headers = NULL;
+ }
+
+ if (mux->use_skeleton) {
+ /* flush accumulated fisbones, the fistail must be on a separate page */
+ while (ogg_stream_flush (&skeleton_stream, &page) > 0) {
+ GstBuffer *hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+ gst_ogg_mux_make_fistail (mux, &skeleton_stream);
+ while (ogg_stream_flush (&skeleton_stream, &page) > 0) {
+ GstBuffer *hbuf = gst_ogg_mux_buffer_from_page (mux, &page, FALSE);
+ hbufs = g_list_append (hbufs, hbuf);
+ }
+ ogg_stream_clear (&skeleton_stream);
+ }
+
+ /* hbufs holds all buffers for the headers now */
+
+ /* create caps with the buffers */
+ caps = gst_pad_get_caps (mux->srcpad, NULL);
+ if (caps) {
+ caps = gst_ogg_mux_set_header_on_caps (caps, hbufs);
+ gst_pad_set_caps (mux->srcpad, caps);
+ gst_caps_unref (caps);
+ }
+ /* and send the buffers */
+ while (hbufs != NULL) {
+ GstBuffer *buf = GST_BUFFER (hbufs->data);
+
+ hbufs = g_list_delete_link (hbufs, hbufs);
+
+ if ((ret = gst_ogg_mux_push_buffer (mux, buf, NULL)) != GST_FLOW_OK)
+ break;
+ }
+ /* free any remaining nodes/buffers in case we couldn't push them */
+ g_list_foreach (hbufs, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (hbufs);
+
+ return ret;
+}
+
+/* this function is called to process data on the best pending pad.
+ *
+ * basic idea:
+ *
+ * 1) store the selected pad and keep on pulling until we fill a
+ * complete ogg page or the ogg page is filled above the max-delay
+ * threshold. This is needed because the ogg spec says that
+ * you should fill a complete page with data from the same logical
+ * stream. When the page is filled, go back to 1).
+ * 2) before filling a page, read ahead one more buffer to see if this
+ * packet is the last of the stream. We need to do this because the ogg
+ * spec mandates that the last packet should have the EOS flag set before
+ * sending it to ogg. if pad->buffer is NULL we need to wait to find out
+ * whether there are any more buffers.
+ * 3) pages get queued on a per-pad queue. Every time a page is queued, a
+ * dequeue is called, which will dequeue the oldest page on any pad, provided
+ * that ALL pads have at least one marked page in the queue (or remaining
+ * pads are at EOS)
+ */
+static GstFlowReturn
+gst_ogg_mux_process_best_pad (GstOggMux * ogg_mux, GstOggPadData * best)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean delta_unit;
+ gint64 granulepos = 0;
+ GstClockTime timestamp, gp_time;
+ GstBuffer *next_buf;
+
+ GST_LOG_OBJECT (ogg_mux, "best pad %" GST_PTR_FORMAT
+ ", currently pulling from %" GST_PTR_FORMAT, best->collect.pad,
+ ogg_mux->pulling ? ogg_mux->pulling->collect.pad : NULL);
+
+ if (ogg_mux->pulling) {
+ next_buf = gst_collect_pads_peek (ogg_mux->collect,
+ &ogg_mux->pulling->collect);
+ if (next_buf) {
+ ogg_mux->pulling->eos = FALSE;
+ gst_buffer_unref (next_buf);
+ } else {
+ GST_DEBUG_OBJECT (ogg_mux->pulling->collect.pad, "setting eos to true");
+ ogg_mux->pulling->eos = TRUE;
+ }
+ }
+
+ /* We could end up pushing from the best pad instead, so check that
+ * as well */
+ if (best && best != ogg_mux->pulling) {
+ next_buf = gst_collect_pads_peek (ogg_mux->collect, &best->collect);
+ if (next_buf) {
+ best->eos = FALSE;
+ gst_buffer_unref (next_buf);
+ } else {
+ GST_DEBUG_OBJECT (best->collect.pad, "setting eos to true");
+ best->eos = TRUE;
+ }
+ }
+
+ /* if we were already pulling from one pad, but the new "best" buffer is
+ * from another pad, we need to check if we have reason to flush a page
+ * for the pad we were pulling from before */
+ if (ogg_mux->pulling && best &&
+ ogg_mux->pulling != best && ogg_mux->pulling->buffer) {
+ GstOggPadData *pad = ogg_mux->pulling;
+ GstClockTime last_ts = GST_BUFFER_END_TIME (pad->buffer);
+
+ /* if the next packet in the current page is going to make the page
+ * too long, we need to flush */
+ if (last_ts > ogg_mux->next_ts + ogg_mux->max_delay) {
+ ogg_page page;
+
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT " stored packet %" G_GINT64_FORMAT
+ " will make page too long, flushing",
+ GST_BUFFER_OFFSET_END (pad->buffer),
+ (gint64) pad->map.stream.packetno);
+
+ while (ogg_stream_flush (&pad->map.stream, &page)) {
+ /* end time of this page is the timestamp of the next buffer */
+ ogg_mux->pulling->timestamp_end = GST_BUFFER_TIMESTAMP (pad->buffer);
+ /* Place page into the per-pad queue */
+ ret = gst_ogg_mux_pad_queue_page (ogg_mux, pad, &page,
+ pad->first_delta);
+ /* increment the page number counter */
+ pad->pageno++;
+ /* mark other pages as delta */
+ pad->first_delta = TRUE;
+ }
+ pad->new_page = TRUE;
+ ogg_mux->pulling = NULL;
+ }
+ }
+
+ /* if we don't know which pad to pull on, use the best one */
+ if (ogg_mux->pulling == NULL) {
+ ogg_mux->pulling = best;
+ GST_LOG_OBJECT (ogg_mux->pulling->collect.pad, "pulling from best pad");
+
+ /* remember timestamp and gp time of first buffer for this new pad */
+ if (ogg_mux->pulling != NULL) {
+ ogg_mux->next_ts = GST_BUFFER_TIMESTAMP (ogg_mux->pulling->buffer);
+ GST_LOG_OBJECT (ogg_mux->pulling->collect.pad, "updated times, next ts %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (ogg_mux->next_ts));
+ } else {
+ /* no pad to pull on, send EOS */
+ gst_pad_push_event (ogg_mux->srcpad, gst_event_new_eos ());
+ return GST_FLOW_WRONG_STATE;
+ }
+ }
+
+ if (ogg_mux->need_headers) {
+ ret = gst_ogg_mux_send_headers (ogg_mux);
+ ogg_mux->need_headers = FALSE;
+ }
+
+ /* we are pulling from a pad, continue to do so until a page
+ * has been filled and queued */
+ if (ogg_mux->pulling != NULL) {
+ ogg_packet packet;
+ ogg_page page;
+ GstBuffer *buf, *tmpbuf;
+ GstOggPadData *pad = ogg_mux->pulling;
+ gint64 duration;
+ gboolean force_flush;
+ gsize size;
+
+ GST_LOG_OBJECT (ogg_mux->pulling->collect.pad, "pulling from pad");
+
+ /* now see if we have a buffer */
+ buf = pad->buffer;
+ if (buf == NULL) {
+ GST_DEBUG_OBJECT (ogg_mux, "pad was EOS");
+ ogg_mux->pulling = NULL;
+ return GST_FLOW_OK;
+ }
+
+ delta_unit = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ duration = GST_BUFFER_DURATION (buf);
+
+ /* if the current "next timestamp" on the pad is unset, then this is the
+ * first packet on the new page. Update our pad's page timestamp */
+ if (ogg_mux->pulling->timestamp == GST_CLOCK_TIME_NONE) {
+ ogg_mux->pulling->timestamp = GST_BUFFER_TIMESTAMP (buf);
+ GST_LOG_OBJECT (ogg_mux->pulling->collect.pad,
+ "updated pad timestamp to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ }
+ /* create a packet from the buffer */
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (buf);
+ if (packet.granulepos == -1)
+ packet.granulepos = 0;
+ /* mark BOS and packet number */
+ packet.b_o_s = (pad->packetno == 0);
+ packet.packetno = pad->packetno++;
+ GST_LOG_OBJECT (pad->collect.pad, GST_GP_FORMAT
+ " packet %" G_GINT64_FORMAT " (%ld bytes) created from buffer",
+ GST_GP_CAST (packet.granulepos), (gint64) packet.packetno,
+ packet.bytes);
+
+ packet.e_o_s = ogg_mux->pulling->eos ? 1 : 0;
+ tmpbuf = NULL;
+
+ /* we flush when we see a new keyframe */
+ force_flush = (pad->prev_delta && !delta_unit)
+ || pad->map.always_flush_page;
+ if (duration != -1) {
+ pad->duration += duration;
+ /* if page duration exceeds max, flush page */
+ if (pad->duration > ogg_mux->max_page_delay) {
+ force_flush = TRUE;
+ pad->duration = 0;
+ }
+ }
+
+ if (GST_BUFFER_IS_DISCONT (buf)) {
+ if (pad->data_pushed) {
+ GST_LOG_OBJECT (pad->collect.pad, "got discont");
+ packet.packetno++;
+ /* No public API for this; hack things in */
+ pad->map.stream.pageno++;
+ force_flush = TRUE;
+ } else {
+ GST_LOG_OBJECT (pad->collect.pad, "discont at stream start");
+ }
+ }
+
+ /* flush the currently built page if necessary */
+ if (force_flush) {
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT " forced flush of page before this packet",
+ GST_BUFFER_OFFSET_END (pad->buffer));
+ while (ogg_stream_flush (&pad->map.stream, &page)) {
+ /* end time of this page is the timestamp of the next buffer */
+ ogg_mux->pulling->timestamp_end = GST_BUFFER_TIMESTAMP (pad->buffer);
+ ret = gst_ogg_mux_pad_queue_page (ogg_mux, pad, &page,
+ pad->first_delta);
+
+ /* increment the page number counter */
+ pad->pageno++;
+ /* mark other pages as delta */
+ pad->first_delta = TRUE;
+ }
+ pad->new_page = TRUE;
+ }
+
+ /* if this is the first packet of a new page figure out the delta flag */
+ if (pad->new_page) {
+ if (delta_unit) {
+ /* mark the page as delta */
+ pad->first_delta = TRUE;
+ } else {
+ /* got a keyframe */
+ if (ogg_mux->delta_pad == pad) {
+ /* if we get it on the pad with deltaunits,
+ * we mark the page as non delta */
+ pad->first_delta = FALSE;
+ } else if (ogg_mux->delta_pad != NULL) {
+ /* if there are pads with delta frames, we
+ * must mark this one as delta */
+ pad->first_delta = TRUE;
+ } else {
+ pad->first_delta = FALSE;
+ }
+ }
+ pad->new_page = FALSE;
+ }
+
+ /* save key unit to track delta->key unit transitions */
+ pad->prev_delta = delta_unit;
+
+ /* swap the packet in */
+ if (packet.e_o_s == 1)
+ GST_DEBUG_OBJECT (pad->collect.pad, "swapping in EOS packet");
+ if (packet.b_o_s == 1)
+ GST_DEBUG_OBJECT (pad->collect.pad, "swapping in BOS packet");
+
+ ogg_stream_packetin (&pad->map.stream, &packet);
+ gst_buffer_unmap (buf, packet.packet, size);
+ pad->data_pushed = TRUE;
+
+ gp_time = GST_BUFFER_OFFSET (pad->buffer);
+ granulepos = GST_BUFFER_OFFSET_END (pad->buffer);
+ timestamp = GST_BUFFER_TIMESTAMP (pad->buffer);
+
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT " packet %" G_GINT64_FORMAT ", gp time %"
+ GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT " packetin'd",
+ granulepos, (gint64) packet.packetno, GST_TIME_ARGS (gp_time),
+ GST_TIME_ARGS (timestamp));
+ /* don't need the old buffer anymore */
+ gst_buffer_unref (pad->buffer);
+ /* store new readahead buffer */
+ pad->buffer = tmpbuf;
+
+ /* let ogg write out the pages now. The packet we got could end
+ * up in more than one page so we need to write them all */
+ if (ogg_stream_pageout (&pad->map.stream, &page) > 0) {
+ /* we have a new page, so we need to timestamp it correctly.
+ * if this fresh packet ends on this page, then the page's granulepos
+ * comes from that packet, and we should set this buffer's timestamp */
+
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT " packet %" G_GINT64_FORMAT ", time %"
+ GST_TIME_FORMAT ") caused new page",
+ granulepos, (gint64) packet.packetno, GST_TIME_ARGS (timestamp));
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT " new page %ld",
+ GST_GP_CAST (ogg_page_granulepos (&page)), pad->map.stream.pageno);
+
+ if (ogg_page_granulepos (&page) == granulepos) {
+ /* the packet we streamed in finishes on the current page,
+ * because the page's granulepos is the granulepos of the last
+ * packet completed on that page,
+ * so update the timestamp that we will give to the page */
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT
+ " packet finishes on current page, updating gp time to %"
+ GST_TIME_FORMAT, granulepos, GST_TIME_ARGS (gp_time));
+ pad->gp_time = gp_time;
+ } else {
+ GST_LOG_OBJECT (pad->collect.pad,
+ GST_GP_FORMAT
+ " packet spans beyond current page, keeping old gp time %"
+ GST_TIME_FORMAT, granulepos, GST_TIME_ARGS (pad->gp_time));
+ }
+
+ /* push the page */
+ /* end time of this page is the timestamp of the next buffer */
+ pad->timestamp_end = timestamp;
+ ret = gst_ogg_mux_pad_queue_page (ogg_mux, pad, &page, pad->first_delta);
+ pad->pageno++;
+ /* mark next pages as delta */
+ pad->first_delta = TRUE;
+
+ /* use an inner loop here to flush the remaining pages and
+ * mark them as delta frames as well */
+ while (ogg_stream_pageout (&pad->map.stream, &page) > 0) {
+ if (ogg_page_granulepos (&page) == granulepos) {
+ /* the page has taken up the new packet completely, which means
+ * the packet ends the page and we can update the gp time
+ * before pushing out */
+ pad->gp_time = gp_time;
+ }
+
+ /* we have a complete page now, we can push the page
+ * and make sure to pull on a new pad the next time around */
+ ret = gst_ogg_mux_pad_queue_page (ogg_mux, pad, &page,
+ pad->first_delta);
+ /* increment the page number counter */
+ pad->pageno++;
+ }
+ /* need a new page as well */
+ pad->new_page = TRUE;
+ pad->duration = 0;
+ /* we're done pulling on this pad, make sure to choose a new
+ * pad for pulling in the next iteration */
+ ogg_mux->pulling = NULL;
+ }
+
+ /* Update the gp time, if necessary, since any future page will have at
+ * least this gp time.
+ */
+ if (pad->gp_time < gp_time) {
+ pad->gp_time = gp_time;
+ GST_LOG_OBJECT (pad->collect.pad,
+ "Updated running gp time of pad %" GST_PTR_FORMAT
+ " to %" GST_TIME_FORMAT, pad->collect.pad, GST_TIME_ARGS (gp_time));
+ }
+ }
+
+ return ret;
+}
+
+/* all_pads_eos:
+ *
+ * Checks if all pads are EOS'd by peeking.
+ *
+ * Returns TRUE if all pads are EOS.
+ */
+static gboolean
+all_pads_eos (GstCollectPads * pads)
+{
+ GSList *walk;
+
+ walk = pads->data;
+ while (walk) {
+ GstOggPadData *oggpad = (GstOggPadData *) walk->data;
+
+ GST_DEBUG_OBJECT (oggpad->collect.pad,
+ "oggpad %p eos %d", oggpad, oggpad->eos);
+
+ if (oggpad->eos == FALSE)
+ return FALSE;
+
+ walk = g_slist_next (walk);
+ }
+
+ return TRUE;
+}
+
+/* This function is called when there is data on all pads.
+ *
+ * It finds a pad to pull on, this is done by looking at the buffers
+ * to decide which one to use, and using the 'oldest' one first. It then calls
+ * gst_ogg_mux_process_best_pad() to process as much data as possible.
+ *
+ * If all the pads have received EOS, it flushes out all data by continually
+ * getting the best pad and calling gst_ogg_mux_process_best_pad() until they
+ * are all empty, and then sends EOS.
+ */
+static GstFlowReturn
+gst_ogg_mux_collected (GstCollectPads * pads, GstOggMux * ogg_mux)
+{
+ GstOggPadData *best;
+ GstFlowReturn ret;
+ gboolean popped;
+
+ GST_LOG_OBJECT (ogg_mux, "collected");
+
+ /* queue buffers on all pads; find a buffer with the lowest timestamp */
+ best = gst_ogg_mux_queue_pads (ogg_mux, &popped);
+
+ if (popped)
+ return GST_FLOW_OK;
+
+ if (best == NULL || best->buffer == NULL) {
+ /* This is not supposed to happen */
+ return GST_FLOW_ERROR;
+ }
+
+ ret = gst_ogg_mux_process_best_pad (ogg_mux, best);
+
+ if (best->eos && all_pads_eos (pads)) {
+ gst_pad_push_event (ogg_mux->srcpad, gst_event_new_eos ());
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ return ret;
+}
+
+static void
+gst_ogg_mux_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstOggMux *ogg_mux;
+
+ ogg_mux = GST_OGG_MUX (object);
+
+ switch (prop_id) {
+ case ARG_MAX_DELAY:
+ g_value_set_uint64 (value, ogg_mux->max_delay);
+ break;
+ case ARG_MAX_PAGE_DELAY:
+ g_value_set_uint64 (value, ogg_mux->max_page_delay);
+ break;
+ case ARG_MAX_TOLERANCE:
+ g_value_set_uint64 (value, ogg_mux->max_tolerance);
+ break;
+ case ARG_SKELETON:
+ g_value_set_boolean (value, ogg_mux->use_skeleton);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_ogg_mux_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstOggMux *ogg_mux;
+
+ ogg_mux = GST_OGG_MUX (object);
+
+ switch (prop_id) {
+ case ARG_MAX_DELAY:
+ ogg_mux->max_delay = g_value_get_uint64 (value);
+ break;
+ case ARG_MAX_PAGE_DELAY:
+ ogg_mux->max_page_delay = g_value_get_uint64 (value);
+ break;
+ case ARG_MAX_TOLERANCE:
+ ogg_mux->max_tolerance = g_value_get_uint64 (value);
+ break;
+ case ARG_SKELETON:
+ ogg_mux->use_skeleton = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* reset all variables in the ogg pads. */
+static void
+gst_ogg_mux_init_collectpads (GstCollectPads * collect)
+{
+ GSList *walk;
+
+ walk = collect->data;
+ while (walk) {
+ GstOggPadData *oggpad = (GstOggPadData *) walk->data;
+
+ ogg_stream_init (&oggpad->map.stream, oggpad->map.serialno);
+ oggpad->packetno = 0;
+ oggpad->pageno = 0;
+ oggpad->eos = FALSE;
+ /* we assume there will be some control data first for this pad */
+ oggpad->state = GST_OGG_PAD_STATE_CONTROL;
+ oggpad->new_page = TRUE;
+ oggpad->first_delta = FALSE;
+ oggpad->prev_delta = FALSE;
+ oggpad->data_pushed = FALSE;
+ oggpad->pagebuffers = g_queue_new ();
+
+ gst_segment_init (&oggpad->segment, GST_FORMAT_TIME);
+
+ walk = g_slist_next (walk);
+ }
+}
+
+/* Clear all buffers from the collectpads object */
+static void
+gst_ogg_mux_clear_collectpads (GstCollectPads * collect)
+{
+ GSList *walk;
+
+ for (walk = collect->data; walk; walk = g_slist_next (walk)) {
+ GstOggPadData *oggpad = (GstOggPadData *) walk->data;
+ GstBuffer *buf;
+
+ ogg_stream_clear (&oggpad->map.stream);
+
+ while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
+ gst_buffer_unref (buf);
+ }
+ g_queue_free (oggpad->pagebuffers);
+ oggpad->pagebuffers = NULL;
+
+ if (oggpad->buffer) {
+ gst_buffer_unref (oggpad->buffer);
+ oggpad->buffer = NULL;
+ }
+
+ if (oggpad->tags) {
+ gst_tag_list_free (oggpad->tags);
+ oggpad->tags = NULL;
+ }
+
+ gst_segment_init (&oggpad->segment, GST_FORMAT_TIME);
+ }
+}
+
+static GstStateChangeReturn
+gst_ogg_mux_change_state (GstElement * element, GstStateChange transition)
+{
+ GstOggMux *ogg_mux;
+ GstStateChangeReturn ret;
+
+ ogg_mux = GST_OGG_MUX (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ gst_ogg_mux_clear (ogg_mux);
+ gst_ogg_mux_init_collectpads (ogg_mux->collect);
+ gst_collect_pads_start (ogg_mux->collect);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_collect_pads_stop (ogg_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_ogg_mux_clear_collectpads (ogg_mux->collect);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+gboolean
+gst_ogg_mux_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_ogg_mux_debug, "oggmux", 0, "ogg muxer");
+
+ return gst_element_register (plugin, "oggmux", GST_RANK_PRIMARY,
+ GST_TYPE_OGG_MUX);
+}
diff --git a/ext/ogg/gstoggmux.h b/ext/ogg/gstoggmux.h
new file mode 100644
index 0000000..1e2e8a9
--- /dev/null
+++ b/ext/ogg/gstoggmux.h
@@ -0,0 +1,148 @@
+/* OGG muxer plugin for GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2006 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.
+ */
+
+#ifndef __GST_OGG_MUX_H__
+#define __GST_OGGEMUX_H__
+
+#include <ogg/ogg.h>
+
+#include <gst/gst.h>
+#include <gst/base/gstcollectpads.h>
+#include "gstoggstream.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_OGG_MUX (gst_ogg_mux_get_type())
+#define GST_OGG_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_MUX, GstOggMux))
+#define GST_OGG_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_MUX, GstOggMux))
+#define GST_IS_OGG_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_MUX))
+#define GST_IS_OGG_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_MUX))
+
+typedef struct _GstOggMux GstOggMux;
+typedef struct _GstOggMuxClass GstOggMuxClass;
+
+typedef enum
+{
+ GST_OGG_PAD_STATE_CONTROL = 0,
+ GST_OGG_PAD_STATE_DATA = 1
+}
+GstOggPadState;
+
+/* all information needed for one ogg stream */
+typedef struct
+{
+ GstCollectData collect; /* we extend the CollectData */
+
+ GstOggStream map;
+ gboolean have_type;
+
+ GstSegment segment;
+
+ GstBuffer *buffer; /* the first waiting buffer for the pad */
+
+ gint64 packetno; /* number of next packet */
+ gint64 pageno; /* number of next page */
+ guint64 duration; /* duration of current page */
+ gboolean eos;
+ gint64 offset;
+ GstClockTime timestamp; /* timestamp of the first packet on the next
+ * page to be dequeued */
+ GstClockTime timestamp_end; /* end timestamp of last complete packet on
+ the next page to be dequeued */
+ GstClockTime gp_time; /* time corresponding to the gp value of the
+ last complete packet on the next page to be
+ dequeued */
+
+ GstOggPadState state; /* state of the pad */
+
+ GQueue *pagebuffers; /* List of pages in buffers ready for pushing */
+
+ gboolean new_page; /* starting a new page */
+ gboolean first_delta; /* was the first packet in the page a delta */
+ gboolean prev_delta; /* was the previous buffer a delta frame */
+ gboolean data_pushed; /* whether we pushed data already */
+
+ gint64 next_granule; /* expected granule of next buffer ts */
+ gint64 keyframe_granule; /* granule of last preceding keyframe */
+
+ GstPadEventFunction collect_event;
+
+ GstTagList *tags;
+}
+GstOggPadData;
+
+/**
+ * GstOggMux:
+ *
+ * The ogg muxer object structure.
+ */
+struct _GstOggMux
+{
+ GstElement element;
+
+ /* source pad */
+ GstPad *srcpad;
+
+ /* sinkpads */
+ GstCollectPads *collect;
+
+ /* number of pads which have not received EOS */
+ gint active_pads;
+
+ /* the pad we are currently using to fill a page */
+ GstOggPadData *pulling;
+
+ /* next timestamp for the page */
+ GstClockTime next_ts;
+
+ /* Last timestamp actually output on src pad */
+ GstClockTime last_ts;
+
+ /* offset in stream */
+ guint64 offset;
+
+ /* need_headers */
+ gboolean need_headers;
+
+ guint64 max_delay;
+ guint64 max_page_delay;
+ guint64 max_tolerance;
+
+ GstOggPadData *delta_pad; /* when a delta frame is detected on a stream, we mark
+ pages as delta frames up to the page that has the
+ keyframe */
+
+
+ /* whether to create a skeleton track */
+ gboolean use_skeleton;
+};
+
+struct _GstOggMuxClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_ogg_mux_get_type (void);
+
+gboolean gst_ogg_mux_plugin_init (GstPlugin * plugin);
+
+G_END_DECLS
+
+#endif /* __GST_OGG_MUX_H__ */
diff --git a/ext/ogg/gstoggparse.c b/ext/ogg/gstoggparse.c
new file mode 100644
index 0000000..1c12bdf
--- /dev/null
+++ b/ext/ogg/gstoggparse.c
@@ -0,0 +1,750 @@
+/* GStreamer
+ * Copyright (C) 2005 Michael Smith <msmith@fluendo.com>
+ *
+ * gstoggparse.c: ogg 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.
+ */
+
+/* This ogg parser is essentially a subset of the ogg demuxer - rather than
+ * fully demuxing into packets, we only parse out the pages, create one
+ * GstBuffer per page, set all the appropriate flags on those pages, set caps
+ * appropriately (particularly the 'streamheader' which gives all the header
+ * pages required for initialing decode).
+ *
+ * It's dramatically simpler than the full demuxer as it does not support
+ * seeking.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst.h>
+#include <ogg/ogg.h>
+#include <string.h>
+
+#include "gstogg.h"
+#include "gstoggstream.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_ogg_parse_debug);
+#define GST_CAT_DEFAULT gst_ogg_parse_debug
+
+#define GST_TYPE_OGG_PARSE (gst_ogg_parse_get_type())
+#define GST_OGG_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_PARSE, GstOggParse))
+#define GST_OGG_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_PARSE, GstOggParse))
+#define GST_IS_OGG_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_PARSE))
+#define GST_IS_OGG_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_PARSE))
+
+static GType gst_ogg_parse_get_type (void);
+
+typedef struct _GstOggParse GstOggParse;
+typedef struct _GstOggParseClass GstOggParseClass;
+
+struct _GstOggParse
+{
+ GstElement element;
+
+ GstPad *sinkpad; /* Sink pad we're reading data from */
+
+ GstPad *srcpad; /* Source pad we're writing to */
+
+ GSList *oggstreams; /* list of GstOggStreams for known streams */
+
+ gint64 offset; /* Current stream offset */
+
+ gboolean in_headers; /* Set if we're reading headers for streams */
+
+ gboolean last_page_not_bos; /* Set if we've seen a non-BOS page */
+
+ ogg_sync_state sync; /* Ogg page synchronisation */
+
+ GstCaps *caps; /* Our src caps */
+
+ GstOggStream *video_stream; /* Stream used to construct delta_unit flags */
+};
+
+struct _GstOggParseClass
+{
+ GstElementClass parent_class;
+};
+
+static void gst_ogg_parse_base_init (gpointer g_class);
+static void gst_ogg_parse_class_init (GstOggParseClass * klass);
+static void gst_ogg_parse_init (GstOggParse * ogg);
+static GstElementClass *parent_class = NULL;
+
+static GType
+gst_ogg_parse_get_type (void)
+{
+ static GType ogg_parse_type = 0;
+
+ if (!ogg_parse_type) {
+ static const GTypeInfo ogg_parse_info = {
+ sizeof (GstOggParseClass),
+ gst_ogg_parse_base_init,
+ NULL,
+ (GClassInitFunc) gst_ogg_parse_class_init,
+ NULL,
+ NULL,
+ sizeof (GstOggParse),
+ 0,
+ (GInstanceInitFunc) gst_ogg_parse_init,
+ };
+
+ ogg_parse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstOggParse",
+ &ogg_parse_info, 0);
+ }
+ return ogg_parse_type;
+}
+
+static void
+free_stream (GstOggStream * stream)
+{
+ g_list_foreach (stream->headers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_foreach (stream->unknown_pages, (GFunc) gst_mini_object_unref, NULL);
+ g_list_foreach (stream->stored_buffers, (GFunc) gst_mini_object_unref, NULL);
+
+ g_slice_free (GstOggStream, stream);
+}
+
+static void
+gst_ogg_parse_delete_all_streams (GstOggParse * ogg)
+{
+ g_slist_foreach (ogg->oggstreams, (GFunc) free_stream, NULL);
+ g_slist_free (ogg->oggstreams);
+ ogg->oggstreams = NULL;
+}
+
+static GstOggStream *
+gst_ogg_parse_new_stream (GstOggParse * parser, ogg_page * page)
+{
+ GstOggStream *stream;
+ ogg_packet packet;
+ int ret;
+ guint32 serialno;
+
+ serialno = ogg_page_serialno (page);
+
+ GST_DEBUG_OBJECT (parser, "creating new stream %08x", serialno);
+
+ stream = g_slice_new0 (GstOggStream);
+
+ stream->serialno = serialno;
+ stream->in_headers = 1;
+
+ if (ogg_stream_init (&stream->stream, serialno) != 0) {
+ GST_ERROR ("Could not initialize ogg_stream struct for serial %08x.",
+ serialno);
+ return NULL;
+ }
+
+ /* FIXME check return */
+ ogg_stream_pagein (&stream->stream, page);
+
+ /* FIXME check return */
+ ret = ogg_stream_packetout (&stream->stream, &packet);
+ if (ret == 1) {
+ gst_ogg_stream_setup_map (stream, &packet);
+ if (stream->is_video) {
+ parser->video_stream = stream;
+ }
+ }
+
+ parser->oggstreams = g_slist_append (parser->oggstreams, stream);
+
+ return stream;
+}
+
+static GstOggStream *
+gst_ogg_parse_find_stream (GstOggParse * parser, guint32 serialno)
+{
+ GSList *l;
+
+ for (l = parser->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+
+ if (stream->serialno == serialno)
+ return stream;
+ }
+ return NULL;
+}
+
+/* signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0
+ /* FILL ME */
+};
+
+static GstStaticPadTemplate ogg_parse_src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/ogg")
+ );
+
+static GstStaticPadTemplate ogg_parse_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/ogg")
+ );
+
+static void gst_ogg_parse_dispose (GObject * object);
+static GstStateChangeReturn gst_ogg_parse_change_state (GstElement * element,
+ GstStateChange transition);
+static GstFlowReturn gst_ogg_parse_chain (GstPad * pad, GstBuffer * buffer);
+
+static void
+gst_ogg_parse_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details_simple (element_class,
+ "Ogg parser", "Codec/Parser",
+ "parse ogg streams into pages (info about ogg: http://xiph.org)",
+ "Michael Smith <msmith@fluendo.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&ogg_parse_sink_template_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&ogg_parse_src_template_factory));
+}
+
+static void
+gst_ogg_parse_class_init (GstOggParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gstelement_class->change_state = gst_ogg_parse_change_state;
+
+ gobject_class->dispose = gst_ogg_parse_dispose;
+}
+
+static void
+gst_ogg_parse_init (GstOggParse * ogg)
+{
+ /* create the sink and source pads */
+ ogg->sinkpad =
+ gst_pad_new_from_static_template (&ogg_parse_sink_template_factory,
+ "sink");
+ ogg->srcpad =
+ gst_pad_new_from_static_template (&ogg_parse_src_template_factory, "src");
+
+ /* TODO: Are there any events we must handle? */
+ /* gst_pad_set_event_function (ogg->sinkpad, gst_ogg_parse_handle_event); */
+ gst_pad_set_chain_function (ogg->sinkpad, gst_ogg_parse_chain);
+
+ gst_element_add_pad (GST_ELEMENT (ogg), ogg->sinkpad);
+ gst_element_add_pad (GST_ELEMENT (ogg), ogg->srcpad);
+
+ ogg->oggstreams = NULL;
+}
+
+static void
+gst_ogg_parse_dispose (GObject * object)
+{
+ GstOggParse *ogg = GST_OGG_PARSE (object);
+
+ GST_LOG_OBJECT (ogg, "Disposing of object %p", ogg);
+
+ ogg_sync_clear (&ogg->sync);
+ gst_ogg_parse_delete_all_streams (ogg);
+
+ if (ogg->caps) {
+ gst_caps_unref (ogg->caps);
+ ogg->caps = NULL;
+ }
+
+ if (G_OBJECT_CLASS (parent_class)->dispose)
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/* submit the given buffer to the ogg sync */
+static GstFlowReturn
+gst_ogg_parse_submit_buffer (GstOggParse * ogg, GstBuffer * buffer)
+{
+ gsize size;
+ guint8 *data;
+ gchar *oggbuffer;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ GST_DEBUG_OBJECT (ogg, "submitting %" G_GSIZE_FORMAT " bytes", size);
+ if (G_UNLIKELY (size == 0))
+ goto done;
+
+ oggbuffer = ogg_sync_buffer (&ogg->sync, size);
+ if (G_UNLIKELY (oggbuffer == NULL)) {
+ GST_ELEMENT_ERROR (ogg, STREAM, DECODE,
+ (NULL), ("failed to get ogg sync buffer"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ memcpy (oggbuffer, data, size);
+ if (G_UNLIKELY (ogg_sync_wrote (&ogg->sync, size) < 0)) {
+ GST_ELEMENT_ERROR (ogg, STREAM, DECODE, (NULL),
+ ("failed to write %" G_GSIZE_FORMAT " bytes to the sync buffer", size));
+ ret = GST_FLOW_ERROR;
+ }
+
+done:
+ gst_buffer_unmap (buffer, data, size);
+ gst_buffer_unref (buffer);
+
+ return ret;
+}
+
+static void
+gst_ogg_parse_append_header (GValue * array, GstBuffer * buf)
+{
+ GValue value = { 0 };
+ /* We require a copy to avoid circular refcounts */
+ GstBuffer *buffer = gst_buffer_copy (buf);
+
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, buffer);
+ gst_value_array_append_value (array, &value);
+ g_value_unset (&value);
+
+}
+
+typedef enum
+{
+ PAGE_HEADER, /* Header page */
+ PAGE_DATA, /* Data page */
+ PAGE_PENDING, /* We don't know yet, we'll have to see some future pages */
+} page_type;
+
+static page_type
+gst_ogg_parse_is_header (GstOggParse * ogg, GstOggStream * stream,
+ ogg_page * page)
+{
+ ogg_int64_t gpos = ogg_page_granulepos (page);
+
+ if (gpos < 0)
+ return PAGE_PENDING;
+
+ /* This is good enough for now, but technically requires codec-specific
+ * behaviour to be perfect. This is where we need the mooted library for
+ * this stuff, which nobody has written.
+ */
+ if (gpos > 0)
+ return PAGE_DATA;
+ else
+ return PAGE_HEADER;
+}
+
+static GstBuffer *
+gst_ogg_parse_buffer_from_page (ogg_page * page,
+ guint64 offset, GstClockTime timestamp)
+{
+ int size = page->header_len + page->body_len;
+ GstBuffer *buf = gst_buffer_new_and_alloc (size);
+
+ gst_buffer_fill (buf, 0, page->header, page->header_len);
+ gst_buffer_fill (buf, page->header_len, page->body, page->body_len);
+
+ GST_BUFFER_TIMESTAMP (buf) = timestamp;
+ GST_BUFFER_OFFSET (buf) = offset;
+ GST_BUFFER_OFFSET_END (buf) = offset + size;
+
+ return buf;
+}
+
+
+/* Reads in buffers, parses them, reframes into one-buffer-per-ogg-page, submits
+ * pages to output pad.
+ */
+static GstFlowReturn
+gst_ogg_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstOggParse *ogg;
+ GstFlowReturn result = GST_FLOW_OK;
+ gint ret = -1;
+ guint32 serialno;
+ GstBuffer *pagebuffer;
+ GstClockTime buffertimestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ ogg = GST_OGG_PARSE (GST_OBJECT_PARENT (pad));
+
+ GST_LOG_OBJECT (ogg,
+ "Chain function received buffer of size %" G_GSIZE_FORMAT,
+ gst_buffer_get_size (buffer));
+
+ gst_ogg_parse_submit_buffer (ogg, buffer);
+
+ while (ret != 0 && result == GST_FLOW_OK) {
+ ogg_page page;
+
+ /* We use ogg_sync_pageseek() rather than ogg_sync_pageout() so that we can
+ * track how many bytes the ogg layer discarded (in the case of sync errors,
+ * etc.); this allows us to accurately track the current stream offset
+ */
+ ret = ogg_sync_pageseek (&ogg->sync, &page);
+ if (ret == 0) {
+ /* need more data, that's fine... */
+ break;
+ } else if (ret < 0) {
+ /* discontinuity; track how many bytes we skipped (-ret) */
+ ogg->offset -= ret;
+ } else {
+ gint64 granule = ogg_page_granulepos (&page);
+#ifndef GST_DISABLE_GST_DEBUG
+ int bos = ogg_page_bos (&page);
+#endif
+ guint64 startoffset = ogg->offset;
+ GstOggStream *stream;
+ gboolean keyframe;
+
+ serialno = ogg_page_serialno (&page);
+ stream = gst_ogg_parse_find_stream (ogg, serialno);
+
+ GST_LOG_OBJECT (ogg, "Timestamping outgoing buffer as %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (buffertimestamp));
+
+ if (stream) {
+ buffertimestamp = gst_ogg_stream_get_end_time_for_granulepos (stream,
+ granule);
+ if (ogg->video_stream) {
+ if (stream == ogg->video_stream) {
+ keyframe = gst_ogg_stream_granulepos_is_key_frame (stream, granule);
+ } else {
+ keyframe = FALSE;
+ }
+ } else {
+ keyframe = TRUE;
+ }
+ } else {
+ buffertimestamp = GST_CLOCK_TIME_NONE;
+ keyframe = TRUE;
+ }
+ pagebuffer = gst_ogg_parse_buffer_from_page (&page, startoffset,
+ buffertimestamp);
+
+ /* We read out 'ret' bytes, so we set the next offset appropriately */
+ ogg->offset += ret;
+
+ GST_LOG_OBJECT (ogg,
+ "processing ogg page (serial %08x, pageno %ld, "
+ "granule pos %" G_GUINT64_FORMAT ", bos %d, offset %"
+ G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT ") keyframe=%d",
+ serialno, ogg_page_pageno (&page),
+ granule, bos, startoffset, ogg->offset, keyframe);
+
+ if (ogg_page_bos (&page)) {
+ /* If we've seen this serialno before, this is technically an error,
+ * we log this case but accept it - this one replaces the previous
+ * stream with this serialno. We can do this since we're streaming, and
+ * not supporting seeking...
+ */
+ GstOggStream *stream = gst_ogg_parse_find_stream (ogg, serialno);
+
+ if (stream != NULL) {
+ GST_LOG_OBJECT (ogg, "Incorrect stream; repeats serial number %08x "
+ "at offset %" G_GINT64_FORMAT, serialno, ogg->offset);
+ }
+
+ if (ogg->last_page_not_bos) {
+ GST_LOG_OBJECT (ogg, "Deleting all referenced streams, found a new "
+ "chain starting with serial %u", serialno);
+ gst_ogg_parse_delete_all_streams (ogg);
+ }
+
+ stream = gst_ogg_parse_new_stream (ogg, &page);
+
+ ogg->last_page_not_bos = FALSE;
+
+ gst_buffer_ref (pagebuffer);
+ stream->headers = g_list_append (stream->headers, pagebuffer);
+
+ if (!ogg->in_headers) {
+ GST_LOG_OBJECT (ogg,
+ "Found start of new chain at offset %" G_GUINT64_FORMAT,
+ startoffset);
+ ogg->in_headers = 1;
+ }
+
+ /* For now, we just keep the header buffer in the stream->headers list;
+ * it actually gets output once we've collected the entire set
+ */
+ } else {
+ /* Non-BOS page. Either: we're outside headers, and this isn't a
+ * header (normal data), outside headers and this is (error!), inside
+ * headers, this is (append header), or inside headers and this isn't
+ * (we've found the end of headers; flush the lot!)
+ *
+ * Before that, we flag that the last page seen (this one) was not a
+ * BOS page; that way we know that when we next see a BOS page it's a
+ * new chain, and we can flush all existing streams.
+ */
+ page_type type;
+ GstOggStream *stream = gst_ogg_parse_find_stream (ogg, serialno);
+
+ if (!stream) {
+ GST_LOG_OBJECT (ogg,
+ "Non-BOS page unexpectedly found at %" G_GINT64_FORMAT,
+ ogg->offset);
+ goto failure;
+ }
+
+ ogg->last_page_not_bos = TRUE;
+
+ type = gst_ogg_parse_is_header (ogg, stream, &page);
+
+ if (type == PAGE_PENDING && ogg->in_headers) {
+ gst_buffer_ref (pagebuffer);
+
+ stream->unknown_pages = g_list_append (stream->unknown_pages,
+ pagebuffer);
+ } else if (type == PAGE_HEADER) {
+ if (!ogg->in_headers) {
+ GST_LOG_OBJECT (ogg, "Header page unexpectedly found outside "
+ "headers at offset %" G_GINT64_FORMAT, ogg->offset);
+ goto failure;
+ } else {
+ /* Append the header to the buffer list, after any unknown previous
+ * pages
+ */
+ stream->headers = g_list_concat (stream->headers,
+ stream->unknown_pages);
+ g_list_free (stream->unknown_pages);
+ gst_buffer_ref (pagebuffer);
+ stream->headers = g_list_append (stream->headers, pagebuffer);
+ }
+ } else { /* PAGE_DATA, or PAGE_PENDING but outside headers */
+ if (ogg->in_headers) {
+ /* First non-header page... set caps, flush headers.
+ *
+ * First up, we build a single GValue list of all the pagebuffers
+ * we're using for the headers, in order.
+ * Then we set this on the caps structure. Then we can start pushing
+ * buffers for the headers, and finally we send this non-header
+ * page.
+ */
+ GstCaps *caps;
+ GstStructure *structure;
+ GValue array = { 0 };
+ gint count = 0;
+ gboolean found_pending_headers = FALSE;
+ GSList *l;
+
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ for (l = ogg->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+
+ if (g_list_length (stream->headers) == 0) {
+ GST_LOG_OBJECT (ogg, "No primary header found for stream %08x",
+ stream->serialno);
+ goto failure;
+ }
+
+ gst_ogg_parse_append_header (&array,
+ GST_BUFFER (stream->headers->data));
+ count++;
+ }
+
+ for (l = ogg->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+ GList *j;
+
+ /* already appended the first header, now do headers 2-N */
+ for (j = stream->headers->next; j != NULL; j = j->next) {
+ gst_ogg_parse_append_header (&array, GST_BUFFER (j->data));
+ count++;
+ }
+ }
+
+ caps = gst_pad_get_caps (ogg->srcpad, NULL);
+ caps = gst_caps_make_writable (caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_set_value (structure, "streamheader", &array);
+
+ gst_pad_set_caps (ogg->srcpad, caps);
+
+ g_value_unset (&array);
+
+ if (ogg->caps)
+ gst_caps_unref (ogg->caps);
+ ogg->caps = caps;
+
+ GST_LOG_OBJECT (ogg, "Set \"streamheader\" caps with %d buffers "
+ "(one per page)", count);
+
+ /* Now, we do the same thing, but push buffers... */
+ for (l = ogg->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+ GstBuffer *buf = GST_BUFFER (stream->headers->data);
+
+ result = gst_pad_push (ogg->srcpad, buf);
+ if (result != GST_FLOW_OK)
+ return result;
+ }
+ for (l = ogg->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+ GList *j;
+
+ /* pushed the first one for each stream already, now do 2-N */
+ for (j = stream->headers->next; j != NULL; j = j->next) {
+ GstBuffer *buf = GST_BUFFER (j->data);
+
+ result = gst_pad_push (ogg->srcpad, buf);
+ if (result != GST_FLOW_OK)
+ return result;
+ }
+ }
+
+ ogg->in_headers = 0;
+
+ /* And finally the pending data pages */
+ for (l = ogg->oggstreams; l != NULL; l = l->next) {
+ GstOggStream *stream = (GstOggStream *) l->data;
+ GList *k;
+
+ if (stream->unknown_pages == NULL)
+ continue;
+
+ if (found_pending_headers) {
+ GST_WARNING_OBJECT (ogg, "Incorrectly muxed headers found at "
+ "approximate offset %" G_GINT64_FORMAT, ogg->offset);
+ }
+ found_pending_headers = TRUE;
+
+ GST_LOG_OBJECT (ogg, "Pushing %d pending pages after headers",
+ g_list_length (stream->unknown_pages) + 1);
+
+ for (k = stream->unknown_pages; k != NULL; k = k->next) {
+ GstBuffer *buf = GST_BUFFER (k->data);
+
+ result = gst_pad_push (ogg->srcpad, buf);
+ if (result != GST_FLOW_OK)
+ return result;
+ }
+ g_list_foreach (stream->unknown_pages,
+ (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (stream->unknown_pages);
+ stream->unknown_pages = NULL;
+ }
+ }
+
+ if (granule == -1) {
+ stream->stored_buffers = g_list_append (stream->stored_buffers,
+ pagebuffer);
+ } else {
+ while (stream->stored_buffers) {
+ GstBuffer *buf = stream->stored_buffers->data;
+
+ buf = gst_buffer_make_writable (buf);
+
+ GST_BUFFER_TIMESTAMP (buf) = buffertimestamp;
+ if (!keyframe) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ } else {
+ keyframe = FALSE;
+ }
+
+ result = gst_pad_push (ogg->srcpad, buf);
+ if (result != GST_FLOW_OK)
+ return result;
+
+ stream->stored_buffers =
+ g_list_delete_link (stream->stored_buffers,
+ stream->stored_buffers);
+ }
+
+ pagebuffer = gst_buffer_make_writable (pagebuffer);
+ if (!keyframe) {
+ GST_BUFFER_FLAG_SET (pagebuffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ } else {
+ keyframe = FALSE;
+ }
+
+ result = gst_pad_push (ogg->srcpad, pagebuffer);
+ if (result != GST_FLOW_OK)
+ return result;
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+
+failure:
+ gst_pad_push_event (GST_PAD (ogg->srcpad), gst_event_new_eos ());
+ return GST_FLOW_ERROR;
+}
+
+static GstStateChangeReturn
+gst_ogg_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstOggParse *ogg;
+ GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
+
+ ogg = GST_OGG_PARSE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ ogg_sync_init (&ogg->sync);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ ogg_sync_reset (&ogg->sync);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ result = 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:
+ ogg_sync_clear (&ogg->sync);
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+gboolean
+gst_ogg_parse_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_ogg_parse_debug, "oggparse", 0, "ogg parser");
+
+ return gst_element_register (plugin, "oggparse", GST_RANK_NONE,
+ GST_TYPE_OGG_PARSE);
+}
diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c
new file mode 100644
index 0000000..e20c568
--- /dev/null
+++ b/ext/ogg/gstoggstream.c
@@ -0,0 +1,2131 @@
+/* GStreamer Ogg Granulepos Mapping Utility Functions
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 David Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstoggstream.h"
+#include "dirac_parse.h"
+#include "vorbis_parse.h"
+
+#include <gst/riff/riff-media.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_ogg_demux_debug);
+GST_DEBUG_CATEGORY_EXTERN (gst_ogg_demux_setup_debug);
+#define GST_CAT_DEFAULT gst_ogg_demux_debug
+
+typedef struct _GstOggMap GstOggMap;
+
+typedef gboolean (*GstOggMapSetupFunc) (GstOggStream * pad,
+ ogg_packet * packet);
+typedef GstClockTime (*GstOggMapToTimeFunc) (GstOggStream * pad,
+ gint64 granulepos);
+typedef gint64 (*GstOggMapToGranuleFunc) (GstOggStream * pad,
+ gint64 granulepos);
+typedef gint64 (*GstOggMapToGranuleposFunc) (GstOggStream * pad,
+ gint64 granule, gint64 keyframe_granule);
+
+/* returns TRUE if the granulepos denotes a key frame */
+typedef gboolean (*GstOggMapIsKeyFrameFunc) (GstOggStream * pad,
+ gint64 granulepos);
+
+/* returns TRUE if the given packet is a stream header packet */
+typedef gboolean (*GstOggMapIsHeaderPacketFunc) (GstOggStream * pad,
+ ogg_packet * packet);
+typedef gint64 (*GstOggMapPacketDurationFunc) (GstOggStream * pad,
+ ogg_packet * packet);
+typedef void (*GstOggMapExtractTagsFunc) (GstOggStream * pad,
+ ogg_packet * packet);
+
+typedef gint64 (*GstOggMapGranuleposToKeyGranuleFunc) (GstOggStream * pad,
+ gint64 granulepos);
+
+#define SKELETON_FISBONE_MIN_SIZE 52
+#define SKELETON_FISHEAD_3_3_MIN_SIZE 112
+#define SKELETON_FISHEAD_4_0_MIN_SIZE 80
+
+struct _GstOggMap
+{
+ const gchar *id;
+ int id_length;
+ int min_packet_size;
+ const gchar *media_type;
+ GstOggMapSetupFunc setup_func;
+ GstOggMapToGranuleFunc granulepos_to_granule_func;
+ GstOggMapToGranuleposFunc granule_to_granulepos_func;
+ GstOggMapIsKeyFrameFunc is_key_frame_func;
+ GstOggMapIsHeaderPacketFunc is_header_func;
+ GstOggMapPacketDurationFunc packet_duration_func;
+ GstOggMapGranuleposToKeyGranuleFunc granulepos_to_key_granule_func;
+ GstOggMapExtractTagsFunc extract_tags_func;
+};
+
+extern const GstOggMap mappers[];
+
+GstClockTime
+gst_ogg_stream_get_packet_start_time (GstOggStream * pad, ogg_packet * packet)
+{
+ int duration;
+
+ if (packet->granulepos == -1) {
+ return GST_CLOCK_TIME_NONE;
+ }
+
+ duration = gst_ogg_stream_get_packet_duration (pad, packet);
+ if (duration == -1) {
+ return GST_CLOCK_TIME_NONE;
+ }
+
+ return gst_ogg_stream_granule_to_time (pad,
+ gst_ogg_stream_granulepos_to_granule (pad,
+ packet->granulepos) - duration);
+}
+
+GstClockTime
+gst_ogg_stream_get_start_time_for_granulepos (GstOggStream * pad,
+ gint64 granulepos)
+{
+ if (pad->frame_size == 0)
+ return GST_CLOCK_TIME_NONE;
+
+ return gst_ogg_stream_granule_to_time (pad,
+ gst_ogg_stream_granulepos_to_granule (pad, granulepos));
+}
+
+GstClockTime
+gst_ogg_stream_get_end_time_for_granulepos (GstOggStream * pad,
+ gint64 granulepos)
+{
+ return gst_ogg_stream_granule_to_time (pad,
+ gst_ogg_stream_granulepos_to_granule (pad, granulepos));
+}
+
+GstClockTime
+gst_ogg_stream_granule_to_time (GstOggStream * pad, gint64 granule)
+{
+ if (granule == 0 || pad->granulerate_n == 0 || pad->granulerate_d == 0)
+ return 0;
+
+ return gst_util_uint64_scale (granule, GST_SECOND * pad->granulerate_d,
+ pad->granulerate_n);
+}
+
+gint64
+gst_ogg_stream_granulepos_to_granule (GstOggStream * pad, gint64 granulepos)
+{
+ if (granulepos == -1 || granulepos == 0) {
+ return granulepos;
+ }
+
+ if (mappers[pad->map].granulepos_to_granule_func == NULL) {
+ GST_WARNING ("Failed to convert %s granulepos to granule",
+ gst_ogg_stream_get_media_type (pad));
+ return -1;
+ }
+
+ return mappers[pad->map].granulepos_to_granule_func (pad, granulepos);
+}
+
+gint64
+gst_ogg_stream_granulepos_to_key_granule (GstOggStream * pad, gint64 granulepos)
+{
+ if (mappers[pad->map].granulepos_to_key_granule_func)
+ return mappers[pad->map].granulepos_to_key_granule_func (pad, granulepos);
+
+ if (granulepos == -1 || granulepos == 0) {
+ return granulepos;
+ }
+
+ return granulepos >> pad->granuleshift;
+}
+
+gint64
+gst_ogg_stream_granule_to_granulepos (GstOggStream * pad, gint64 granule,
+ gint64 keyframe_granule)
+{
+ if (granule == -1 || granule == 0) {
+ return granule;
+ }
+
+ if (mappers[pad->map].granule_to_granulepos_func == NULL) {
+ GST_WARNING ("Failed to convert %s granule to granulepos",
+ gst_ogg_stream_get_media_type (pad));
+ return -1;
+ }
+
+ return mappers[pad->map].granule_to_granulepos_func (pad, granule,
+ keyframe_granule);
+}
+
+gboolean
+gst_ogg_stream_granulepos_is_key_frame (GstOggStream * pad, gint64 granulepos)
+{
+ if (granulepos == -1) {
+ return FALSE;
+ }
+
+ if (mappers[pad->map].is_key_frame_func == NULL) {
+ GST_WARNING ("Failed to determine keyframeness for %s granulepos",
+ gst_ogg_stream_get_media_type (pad));
+ return FALSE;
+ }
+
+ return mappers[pad->map].is_key_frame_func (pad, granulepos);
+}
+
+gboolean
+gst_ogg_stream_packet_is_header (GstOggStream * pad, ogg_packet * packet)
+{
+ if (mappers[pad->map].is_header_func == NULL) {
+ GST_WARNING ("Failed to determine headerness of %s packet",
+ gst_ogg_stream_get_media_type (pad));
+ return FALSE;
+ }
+
+ return mappers[pad->map].is_header_func (pad, packet);
+}
+
+gint64
+gst_ogg_stream_get_packet_duration (GstOggStream * pad, ogg_packet * packet)
+{
+ if (mappers[pad->map].packet_duration_func == NULL) {
+ GST_WARNING ("Failed to determine %s packet duration",
+ gst_ogg_stream_get_media_type (pad));
+ return -1;
+ }
+
+ return mappers[pad->map].packet_duration_func (pad, packet);
+}
+
+
+void
+gst_ogg_stream_extract_tags (GstOggStream * pad, ogg_packet * packet)
+{
+ if (mappers[pad->map].extract_tags_func == NULL) {
+ GST_DEBUG ("No tag extraction");
+ return;
+ }
+
+ mappers[pad->map].extract_tags_func (pad, packet);
+}
+
+const char *
+gst_ogg_stream_get_media_type (GstOggStream * pad)
+{
+ const GstCaps *caps = pad->caps;
+ const GstStructure *structure;
+ if (!caps)
+ return NULL;
+ structure = gst_caps_get_structure (caps, 0);
+ if (!structure)
+ return NULL;
+ return gst_structure_get_name (structure);
+}
+
+/* some generic functions */
+
+static gboolean
+is_keyframe_true (GstOggStream * pad, gint64 granulepos)
+{
+ return TRUE;
+}
+
+static gint64
+granulepos_to_granule_default (GstOggStream * pad, gint64 granulepos)
+{
+ gint64 keyindex, keyoffset;
+
+ if (pad->granuleshift != 0) {
+ keyindex = granulepos >> pad->granuleshift;
+ keyoffset = granulepos - (keyindex << pad->granuleshift);
+ return keyindex + keyoffset;
+ } else {
+ return granulepos;
+ }
+}
+
+
+static gint64
+granule_to_granulepos_default (GstOggStream * pad, gint64 granule,
+ gint64 keyframe_granule)
+{
+ gint64 keyoffset;
+
+ if (pad->granuleshift != 0) {
+ /* If we don't know where the previous keyframe is yet, assume it is
+ at 0 or 1, depending on bitstream version. If nothing else, this
+ avoids getting negative granpos back. */
+ if (keyframe_granule < 0)
+ keyframe_granule = pad->theora_has_zero_keyoffset ? 0 : 1;
+ keyoffset = granule - keyframe_granule;
+ return (keyframe_granule << pad->granuleshift) | keyoffset;
+ } else {
+ return granule;
+ }
+}
+
+#ifdef unused
+static gboolean
+is_header_unknown (GstOggStream * pad, ogg_packet * packet)
+{
+ GST_WARNING ("don't know how to detect header");
+ return FALSE;
+}
+#endif
+
+static gboolean
+is_header_true (GstOggStream * pad, ogg_packet * packet)
+{
+ return TRUE;
+}
+
+static gboolean
+is_header_count (GstOggStream * pad, ogg_packet * packet)
+{
+ if (pad->n_header_packets_seen < pad->n_header_packets) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gint64
+packet_duration_constant (GstOggStream * pad, ogg_packet * packet)
+{
+ return pad->frame_size;
+}
+
+/* helper: extracts tags from vorbis comment ogg packet.
+ * Returns result in *tags after free'ing existing *tags (if any) */
+static gboolean
+tag_list_from_vorbiscomment_packet (ogg_packet * packet,
+ const guint8 * id_data, const guint id_data_length, GstTagList ** tags)
+{
+ gchar *encoder = NULL;
+ GstTagList *list;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (tags != NULL, FALSE);
+
+ list = gst_tag_list_from_vorbiscomment (packet->packet, packet->bytes,
+ id_data, id_data_length, &encoder);
+
+ if (!list) {
+ GST_WARNING ("failed to decode vorbis comments");
+ ret = FALSE;
+ goto exit;
+ }
+
+ if (encoder) {
+ if (encoder[0])
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, encoder,
+ NULL);
+ g_free (encoder);
+ }
+
+exit:
+ if (*tags)
+ gst_tag_list_free (*tags);
+ *tags = list;
+
+ return ret;
+}
+
+/* theora */
+
+static gboolean
+setup_theora_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint w, h, par_d, par_n;
+ guint8 vmaj, vmin, vrev;
+
+ vmaj = data[7];
+ vmin = data[8];
+ vrev = data[9];
+
+ w = GST_READ_UINT24_BE (data + 14) & 0xFFFFFF;
+ h = GST_READ_UINT24_BE (data + 17) & 0xFFFFFF;
+
+ pad->granulerate_n = GST_READ_UINT32_BE (data + 22);
+ pad->granulerate_d = GST_READ_UINT32_BE (data + 26);
+
+ par_n = GST_READ_UINT24_BE (data + 30);
+ par_d = GST_READ_UINT24_BE (data + 33);
+
+ GST_LOG ("fps = %d/%d, PAR = %u/%u, width = %u, height = %u",
+ pad->granulerate_n, pad->granulerate_d, par_n, par_d, w, h);
+
+ /* 2 bits + 3 bits = 5 bits KFGSHIFT */
+ pad->granuleshift = ((GST_READ_UINT8 (data + 40) & 0x03) << 3) +
+ (GST_READ_UINT8 (data + 41) >> 5);
+
+ pad->is_video = TRUE;
+ pad->n_header_packets = 3;
+ pad->frame_size = 1;
+
+ pad->bitrate = GST_READ_UINT24_BE (data + 37);
+ GST_LOG ("bit rate: %d", pad->bitrate);
+
+ if (pad->granulerate_n == 0 || pad->granulerate_d == 0) {
+ GST_WARNING ("frame rate %d/%d", pad->granulerate_n, pad->granulerate_d);
+ return FALSE;
+ }
+
+ /* The interpretation of the granule position has changed with 3.2.1.
+ The granule is now made from the number of frames encoded, rather than
+ the index of the frame being encoded - so there is a difference of 1. */
+ pad->theora_has_zero_keyoffset =
+ ((vmaj << 16) | (vmin << 8) | vrev) < 0x030201;
+
+ pad->caps = gst_caps_new_simple ("video/x-theora", NULL);
+
+ if (w > 0 && h > 0) {
+ gst_caps_set_simple (pad->caps, "width", G_TYPE_INT, w, "height",
+ G_TYPE_INT, h, NULL);
+ }
+
+ /* PAR of 0:N, N:0 and 0:0 is allowed and maps to 1:1 */
+ if (par_n == 0 || par_d == 0)
+ par_n = par_d = 1;
+
+ /* only add framerate now so caps look prettier, with width/height first */
+ gst_caps_set_simple (pad->caps, "framerate", GST_TYPE_FRACTION,
+ pad->granulerate_n, pad->granulerate_d, "pixel-aspect-ratio",
+ GST_TYPE_FRACTION, par_n, par_d, NULL);
+
+ return TRUE;
+}
+
+static gint64
+granulepos_to_granule_theora (GstOggStream * pad, gint64 granulepos)
+{
+ gint64 keyindex, keyoffset;
+
+ if (pad->granuleshift != 0) {
+ keyindex = granulepos >> pad->granuleshift;
+ keyoffset = granulepos - (keyindex << pad->granuleshift);
+ if (pad->theora_has_zero_keyoffset) {
+ keyoffset++;
+ }
+ return keyindex + keyoffset;
+ } else {
+ return granulepos;
+ }
+}
+
+static gboolean
+is_keyframe_theora (GstOggStream * pad, gint64 granulepos)
+{
+ gint64 frame_mask;
+
+ if (granulepos == (gint64) - 1)
+ return FALSE;
+
+ frame_mask = (1 << pad->granuleshift) - 1;
+
+ return ((granulepos & frame_mask) == 0);
+}
+
+static gboolean
+is_header_theora (GstOggStream * pad, ogg_packet * packet)
+{
+ return (packet->bytes > 0 && (packet->packet[0] & 0x80) == 0x80);
+}
+
+static void
+extract_tags_theora (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes > 0 && packet->packet[0] == 0x81) {
+ tag_list_from_vorbiscomment_packet (packet,
+ (const guint8 *) "\201theora", 7, &pad->taglist);
+
+ if (!pad->taglist)
+ pad->taglist = gst_tag_list_new ();
+
+ if (pad->bitrate)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, (guint) pad->bitrate, NULL);
+ }
+}
+
+/* dirac */
+
+static gboolean
+setup_dirac_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ int ret;
+ DiracSequenceHeader header;
+
+ ret = dirac_sequence_header_parse (&header, packet->packet + 13,
+ packet->bytes - 13);
+ if (ret == 0) {
+ GST_DEBUG ("Failed to parse Dirac sequence header");
+ return FALSE;
+ }
+
+ pad->is_video = TRUE;
+ pad->always_flush_page = TRUE;
+ pad->granulerate_n = header.frame_rate_numerator * 2;
+ pad->granulerate_d = header.frame_rate_denominator;
+ pad->granuleshift = 22;
+ pad->n_header_packets = 1;
+ pad->frame_size = 2;
+
+ if (header.interlaced_coding != 0) {
+ GST_DEBUG ("non-progressive Dirac coding not implemented");
+ return FALSE;
+ }
+
+ pad->caps = gst_caps_new_simple ("video/x-dirac",
+ "width", G_TYPE_INT, header.width,
+ "height", G_TYPE_INT, header.height,
+ "interlaced", G_TYPE_BOOLEAN, header.interlaced,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ header.aspect_ratio_numerator, header.aspect_ratio_denominator,
+ "framerate", GST_TYPE_FRACTION, header.frame_rate_numerator,
+ header.frame_rate_denominator, NULL);
+
+ return TRUE;
+}
+
+#define OGG_DIRAC_GRANULE_LOW_MASK ((1<<22) - 1)
+static gboolean
+is_keyframe_dirac (GstOggStream * pad, gint64 granulepos)
+{
+ int dist_h;
+ int dist_l;
+ int dist;
+
+ if (granulepos == -1)
+ return -1;
+
+ dist_h = (granulepos >> 22) & 0xff;
+ dist_l = granulepos & 0xff;
+ dist = (dist_h << 8) | dist_l;
+
+ return (dist == 0);
+}
+
+static gint64
+granulepos_to_granule_dirac (GstOggStream * pad, gint64 gp)
+{
+ gint64 pt;
+ int delay;
+ gint64 dt;
+
+ pt = ((gp >> 22) + (gp & OGG_DIRAC_GRANULE_LOW_MASK)) >> 9;
+ delay = (gp >> 9) & 0x1fff;
+ dt = pt - delay;
+
+ GST_DEBUG ("pt %" G_GINT64_FORMAT " delay %d", pt, delay);
+
+ return dt + 4;
+}
+
+static gint64
+granule_to_granulepos_dirac (GstOggStream * pad, gint64 granule,
+ gint64 keyframe_granule)
+{
+ /* This conversion requires knowing more details about the Dirac
+ * stream. */
+ return -1;
+}
+
+static gint64
+granulepos_to_key_granule_dirac (GstOggStream * pad, gint64 gp)
+{
+ gint64 pt;
+ int dist_h;
+ int dist_l;
+ int dist;
+ int delay;
+ gint64 dt;
+
+ if (gp == -1 || gp == 0)
+ return gp;
+
+ pt = ((gp >> 22) + (gp & OGG_DIRAC_GRANULE_LOW_MASK)) >> 9;
+ dist_h = (gp >> 22) & 0xff;
+ dist_l = gp & 0xff;
+ dist = (dist_h << 8) | dist_l;
+ delay = (gp >> 9) & 0x1fff;
+ dt = pt - delay;
+
+ return dt - 2 * dist + 4;
+}
+
+/* VP8 */
+
+static gboolean
+setup_vp8_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ gint width, height, par_n, par_d, fps_n, fps_d;
+
+ if (packet->bytes < 26) {
+ GST_DEBUG ("Failed to parse VP8 BOS page");
+ return FALSE;
+ }
+
+ width = GST_READ_UINT16_BE (packet->packet + 8);
+ height = GST_READ_UINT16_BE (packet->packet + 10);
+ par_n = GST_READ_UINT24_BE (packet->packet + 12);
+ par_d = GST_READ_UINT24_BE (packet->packet + 15);
+ fps_n = GST_READ_UINT32_BE (packet->packet + 18);
+ fps_d = GST_READ_UINT32_BE (packet->packet + 22);
+
+ pad->is_video = TRUE;
+ pad->is_vp8 = TRUE;
+ pad->granulerate_n = fps_n;
+ pad->granulerate_d = fps_d;
+ pad->n_header_packets = 2;
+ pad->frame_size = 1;
+
+ pad->caps = gst_caps_new_simple ("video/x-vp8",
+ "width", G_TYPE_INT, width,
+ "height", G_TYPE_INT, height,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ par_n, par_d, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL);
+
+ return TRUE;
+}
+
+static gboolean
+is_keyframe_vp8 (GstOggStream * pad, gint64 granulepos)
+{
+ guint64 gpos = granulepos;
+
+ if (granulepos == -1)
+ return FALSE;
+
+ /* Get rid of flags */
+ gpos >>= 3;
+
+ return ((gpos & 0x07ffffff) == 0);
+}
+
+static gint64
+granulepos_to_granule_vp8 (GstOggStream * pad, gint64 gpos)
+{
+ guint64 gp = (guint64) gpos;
+ guint32 pt;
+ guint32 dist;
+
+ pt = (gp >> 32);
+ dist = (gp >> 3) & 0x07ffffff;
+
+ GST_DEBUG ("pt %u, dist %u", pt, dist);
+
+ return pt;
+}
+
+static gint64
+granule_to_granulepos_vp8 (GstOggStream * pad, gint64 granule,
+ gint64 keyframe_granule)
+{
+ /* FIXME: This requires to look into the content of the packets
+ * because the simple granule counter doesn't know about invisible
+ * frames...
+ */
+ return -1;
+}
+
+/* Check if this packet contains an invisible frame or not */
+static gint64
+packet_duration_vp8 (GstOggStream * pad, ogg_packet * packet)
+{
+ guint32 hdr;
+
+ if (packet->bytes < 3)
+ return 0;
+
+ hdr = GST_READ_UINT24_LE (packet->packet);
+
+ return (((hdr >> 4) & 1) != 0) ? 1 : 0;
+}
+
+static gint64
+granulepos_to_key_granule_vp8 (GstOggStream * pad, gint64 granulepos)
+{
+ guint64 gp = granulepos;
+ guint64 pts = (gp >> 32);
+ guint32 dist = (gp >> 3) & 0x07ffffff;
+
+ if (granulepos == -1 || granulepos == 0)
+ return granulepos;
+
+ if (dist > pts)
+ return 0;
+
+ return pts - dist;
+}
+
+static gboolean
+is_header_vp8 (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes >= 5 && packet->packet[0] == 0x4F &&
+ packet->packet[1] == 0x56 && packet->packet[2] == 0x50 &&
+ packet->packet[3] == 0x38 && packet->packet[4] == 0x30)
+ return TRUE;
+ return FALSE;
+}
+
+static void
+extract_tags_vp8 (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes >= 7 && memcmp (packet->packet, "OVP80\2 ", 7) == 0) {
+ tag_list_from_vorbiscomment_packet (packet,
+ (const guint8 *) "OVP80\2 ", 7, &pad->taglist);
+ }
+}
+
+/* vorbis */
+
+static gboolean
+setup_vorbis_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint chans;
+
+ data += 1 + 6;
+ pad->version = GST_READ_UINT32_LE (data);
+ data += 4;
+ chans = GST_READ_UINT8 (data);
+ data += 1;
+ pad->granulerate_n = GST_READ_UINT32_LE (data);
+ pad->granulerate_d = 1;
+ pad->granuleshift = 0;
+ pad->preroll = 2;
+ pad->last_size = 0;
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+
+ data += 4;
+ pad->bitrate_upper = GST_READ_UINT32_LE (data);
+ data += 4;
+ pad->bitrate_nominal = GST_READ_UINT32_LE (data);
+ data += 4;
+ pad->bitrate_lower = GST_READ_UINT32_LE (data);
+
+ if (pad->bitrate_nominal > 0)
+ pad->bitrate = pad->bitrate_nominal;
+
+ if (pad->bitrate_upper > 0 && !pad->bitrate)
+ pad->bitrate = pad->bitrate_upper;
+
+ if (pad->bitrate_lower > 0 && !pad->bitrate)
+ pad->bitrate = pad->bitrate_lower;
+
+ GST_LOG ("bit rate: %d", pad->bitrate);
+
+ pad->n_header_packets = 3;
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ parse_vorbis_header_packet (pad, packet);
+
+ pad->caps = gst_caps_new_simple ("audio/x-vorbis",
+ "rate", G_TYPE_INT, pad->granulerate_n, "channels", G_TYPE_INT, chans,
+ NULL);
+
+ return TRUE;
+}
+
+static gboolean
+is_header_vorbis (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes > 0 && (packet->packet[0] & 0x01) == 0)
+ return FALSE;
+
+ if (packet->packet[0] == 5) {
+ parse_vorbis_setup_packet (pad, packet);
+ }
+
+ return TRUE;
+}
+
+static void
+extract_tags_vorbis (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes == 0 || (packet->packet[0] & 0x01) == 0)
+ return;
+
+ if (((guint8 *) (packet->packet))[0] == 0x03) {
+ tag_list_from_vorbiscomment_packet (packet,
+ (const guint8 *) "\003vorbis", 7, &pad->taglist);
+
+ if (!pad->taglist)
+ pad->taglist = gst_tag_list_new ();
+
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER_VERSION, pad->version, NULL);
+
+ if (pad->bitrate_nominal > 0)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_NOMINAL_BITRATE, (guint) pad->bitrate_nominal, NULL);
+
+ if (pad->bitrate_upper > 0)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MAXIMUM_BITRATE, (guint) pad->bitrate_upper, NULL);
+
+ if (pad->bitrate_lower > 0)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MINIMUM_BITRATE, (guint) pad->bitrate_lower, NULL);
+
+ if (pad->bitrate)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, (guint) pad->bitrate, NULL);
+ }
+}
+
+static gint64
+packet_duration_vorbis (GstOggStream * pad, ogg_packet * packet)
+{
+ int mode;
+ int size;
+ int duration;
+
+ if (packet->bytes == 0 || packet->packet[0] & 1)
+ return 0;
+
+ mode = (packet->packet[0] >> 1) & ((1 << pad->vorbis_log2_num_modes) - 1);
+ size = pad->vorbis_mode_sizes[mode] ? pad->long_size : pad->short_size;
+
+ if (pad->last_size == 0) {
+ duration = 0;
+ } else {
+ duration = pad->last_size / 4 + size / 4;
+ }
+ pad->last_size = size;
+
+ GST_DEBUG ("duration %d", (int) duration);
+
+ return duration;
+}
+
+/* speex */
+
+
+static gboolean
+setup_speex_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint chans;
+
+ data += 8 + 20 + 4 + 4;
+ pad->granulerate_n = GST_READ_UINT32_LE (data);
+ pad->granulerate_d = 1;
+ pad->granuleshift = 0;
+
+ data += 4 + 4 + 4;
+ chans = GST_READ_UINT32_LE (data);
+ data += 4;
+ pad->bitrate = GST_READ_UINT32_LE (data);
+
+ GST_LOG ("sample rate: %d, channels: %u", pad->granulerate_n, chans);
+ GST_LOG ("bit rate: %d", pad->bitrate);
+
+ pad->n_header_packets = GST_READ_UINT32_LE (packet->packet + 68) + 2;
+ pad->frame_size = GST_READ_UINT32_LE (packet->packet + 64) *
+ GST_READ_UINT32_LE (packet->packet + 56);
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ pad->caps = gst_caps_new_simple ("audio/x-speex", "rate", G_TYPE_INT,
+ pad->granulerate_n, "channels", G_TYPE_INT, chans, NULL);
+
+ return TRUE;
+}
+
+static void
+extract_tags_count (GstOggStream * pad, ogg_packet * packet)
+{
+ /* packet 2 must be comment packet */
+ if (packet->bytes > 0 && pad->n_header_packets_seen == 1) {
+ tag_list_from_vorbiscomment_packet (packet, NULL, 0, &pad->taglist);
+
+ if (!pad->taglist)
+ pad->taglist = gst_tag_list_new ();
+
+ if (pad->bitrate)
+ gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, (guint) pad->bitrate, NULL);
+ }
+}
+
+
+/* flac */
+
+static gboolean
+setup_fLaC_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ pad->granulerate_n = 0;
+ pad->granulerate_d = 1;
+ pad->granuleshift = 0;
+
+ pad->n_header_packets = 3;
+
+ pad->caps = gst_caps_new_simple ("audio/x-flac", NULL);
+
+ return TRUE;
+}
+
+static gboolean
+is_header_fLaC (GstOggStream * pad, ogg_packet * packet)
+{
+ if (pad->n_header_packets_seen == 1) {
+ pad->granulerate_n = (packet->packet[14] << 12) |
+ (packet->packet[15] << 4) | ((packet->packet[16] >> 4) & 0xf);
+ }
+
+ if (pad->n_header_packets_seen < pad->n_header_packets) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+setup_flac_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint chans;
+
+ /* see http://flac.sourceforge.net/ogg_mapping.html */
+
+ pad->granulerate_n = (GST_READ_UINT32_BE (data + 27) & 0xFFFFF000) >> 12;
+ pad->granulerate_d = 1;
+ pad->granuleshift = 0;
+ chans = ((GST_READ_UINT32_BE (data + 27) & 0x00000E00) >> 9) + 1;
+
+ GST_DEBUG ("sample rate: %d, channels: %u", pad->granulerate_n, chans);
+
+ pad->n_header_packets = GST_READ_UINT16_BE (packet->packet + 7);
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ pad->caps = gst_caps_new_simple ("audio/x-flac", "rate", G_TYPE_INT,
+ pad->granulerate_n, "channels", G_TYPE_INT, chans, NULL);
+
+ return TRUE;
+}
+
+static gboolean
+is_header_flac (GstOggStream * pad, ogg_packet * packet)
+{
+ return (packet->bytes > 0 && (packet->packet[0] != 0xff));
+}
+
+static gint64
+packet_duration_flac (GstOggStream * pad, ogg_packet * packet)
+{
+ int block_size_index;
+
+ if (packet->bytes < 4)
+ return -1;
+
+ block_size_index = packet->packet[2] >> 4;
+ if (block_size_index == 1)
+ return 192;
+ if (block_size_index >= 2 && block_size_index <= 5) {
+ return 576 << (block_size_index - 2);
+ }
+ if (block_size_index >= 8) {
+ return 256 << (block_size_index - 8);
+ }
+ if (block_size_index == 6 || block_size_index == 7) {
+ guint len, bytes = (block_size_index - 6) + 1;
+ guint8 tmp;
+
+ if (packet->bytes < 4 + 1 + bytes)
+ return -1;
+ tmp = packet->packet[4];
+ /* utf-8 prefix */
+ len = 0;
+ while (tmp & 0x80) {
+ len++;
+ tmp <<= 1;
+ }
+ if (len == 2)
+ return -1;
+ if (len == 0)
+ len++;
+ if (packet->bytes < 4 + len + bytes)
+ return -1;
+ if (bytes == 1) {
+ return packet->packet[4 + len] + 1;
+ } else {
+ return GST_READ_UINT16_BE (packet->packet + 4 + len) + 1;
+ }
+ }
+ return -1;
+}
+
+static void
+extract_tags_flac (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes > 4 && ((packet->packet[0] & 0x7F) == 0x4)) {
+ tag_list_from_vorbiscomment_packet (packet,
+ packet->packet, 4, &pad->taglist);
+ }
+}
+
+/* fishead */
+
+static gboolean
+setup_fishead_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data;
+ gint64 prestime_n, prestime_d;
+ gint64 basetime_n, basetime_d;
+
+ data = packet->packet;
+
+ data += 8; /* header */
+
+ pad->skeleton_major = GST_READ_UINT16_LE (data);
+ data += 2;
+ pad->skeleton_minor = GST_READ_UINT16_LE (data);
+ data += 2;
+
+ prestime_n = (gint64) GST_READ_UINT64_LE (data);
+ data += 8;
+ prestime_d = (gint64) GST_READ_UINT64_LE (data);
+ data += 8;
+ basetime_n = (gint64) GST_READ_UINT64_LE (data);
+ data += 8;
+ basetime_d = (gint64) GST_READ_UINT64_LE (data);
+ data += 8;
+
+ /* FIXME: we don't use basetime anywhere in the demuxer! */
+ if (basetime_d != 0)
+ pad->basetime = gst_util_uint64_scale (GST_SECOND, basetime_n, basetime_d);
+ else
+ pad->basetime = -1;
+
+ if (prestime_d != 0)
+ pad->prestime = gst_util_uint64_scale (GST_SECOND, prestime_n, prestime_d);
+ else
+ pad->prestime = -1;
+
+ /* Ogg Skeleton 3.3+ streams provide additional information in the header */
+ if (packet->bytes >= SKELETON_FISHEAD_3_3_MIN_SIZE && pad->skeleton_major == 3
+ && pad->skeleton_minor > 0) {
+ gint64 firstsampletime_n, firstsampletime_d;
+ gint64 lastsampletime_n, lastsampletime_d;
+ gint64 firstsampletime, lastsampletime;
+ guint64 segment_length, content_offset;
+
+ firstsampletime_n = GST_READ_UINT64_LE (data + 64);
+ firstsampletime_d = GST_READ_UINT64_LE (data + 72);
+ lastsampletime_n = GST_READ_UINT64_LE (data + 80);
+ lastsampletime_d = GST_READ_UINT64_LE (data + 88);
+ segment_length = GST_READ_UINT64_LE (data + 96);
+ content_offset = GST_READ_UINT64_LE (data + 104);
+
+ GST_INFO ("firstsampletime %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ firstsampletime_n, firstsampletime_d);
+ GST_INFO ("lastsampletime %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ lastsampletime_n, lastsampletime_d);
+ GST_INFO ("segment length %" G_GUINT64_FORMAT, segment_length);
+ GST_INFO ("content offset %" G_GUINT64_FORMAT, content_offset);
+
+ if (firstsampletime_d > 0)
+ firstsampletime = gst_util_uint64_scale (GST_SECOND,
+ firstsampletime_n, firstsampletime_d);
+ else
+ firstsampletime = 0;
+
+ if (lastsampletime_d > 0)
+ lastsampletime = gst_util_uint64_scale (GST_SECOND,
+ lastsampletime_n, lastsampletime_d);
+ else
+ lastsampletime = 0;
+
+ if (lastsampletime > firstsampletime)
+ pad->total_time = lastsampletime - firstsampletime;
+ else
+ pad->total_time = -1;
+
+ GST_INFO ("skeleton fishead parsed total: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (pad->total_time));
+ } else if (packet->bytes >= SKELETON_FISHEAD_4_0_MIN_SIZE
+ && pad->skeleton_major == 4) {
+ guint64 segment_length, content_offset;
+
+ segment_length = GST_READ_UINT64_LE (data + 64);
+ content_offset = GST_READ_UINT64_LE (data + 72);
+
+ GST_INFO ("segment length %" G_GUINT64_FORMAT, segment_length);
+ GST_INFO ("content offset %" G_GUINT64_FORMAT, content_offset);
+ } else {
+ pad->total_time = -1;
+ }
+
+ GST_INFO ("skeleton fishead %u.%u parsed (basetime: %" GST_TIME_FORMAT
+ ", prestime: %" GST_TIME_FORMAT ")", pad->skeleton_major,
+ pad->skeleton_minor, GST_TIME_ARGS (pad->basetime),
+ GST_TIME_ARGS (pad->prestime));
+
+ pad->is_skeleton = TRUE;
+ pad->is_sparse = TRUE;
+
+ pad->caps = gst_caps_new_simple ("application/x-ogg-skeleton", NULL);
+
+ return TRUE;
+}
+
+gboolean
+gst_ogg_map_parse_fisbone (GstOggStream * pad, const guint8 * data, guint size,
+ guint32 * serialno, GstOggSkeleton * type)
+{
+ GstOggSkeleton stype;
+ guint serial_offset;
+
+ if (size != 0 && size < SKELETON_FISBONE_MIN_SIZE) {
+ GST_WARNING ("small fisbone packet of size %d, ignoring", size);
+ return FALSE;
+ }
+
+ if (size == 0) {
+ /* Skeleton EOS packet is zero bytes */
+ return FALSE;
+ } else if (memcmp (data, "fisbone\0", 8) == 0) {
+ GST_INFO ("got fisbone packet");
+ stype = GST_OGG_SKELETON_FISBONE;
+ serial_offset = 12;
+ } else if (memcmp (data, "index\0", 6) == 0) {
+ GST_INFO ("got index packet");
+ stype = GST_OGG_SKELETON_INDEX;
+ serial_offset = 6;
+ } else if (memcmp (data, "fishead\0", 8) == 0) {
+ return FALSE;
+ } else {
+ GST_WARNING ("unknown skeleton packet \"%10.10s\"", data);
+ return FALSE;
+ }
+
+ if (serialno)
+ *serialno = GST_READ_UINT32_LE (data + serial_offset);
+
+ if (type)
+ *type = stype;
+
+ return TRUE;
+}
+
+gboolean
+gst_ogg_map_add_fisbone (GstOggStream * pad, GstOggStream * skel_pad,
+ const guint8 * data, guint size, GstClockTime * p_start_time)
+{
+ GstClockTime start_time;
+ gint64 start_granule;
+
+ if (pad->have_fisbone) {
+ GST_DEBUG ("already have fisbone, ignoring second one");
+ return FALSE;
+ }
+
+ /* skip "fisbone\0" + headers offset + serialno + num headers */
+ data += 8 + 4 + 4 + 4;
+
+ pad->have_fisbone = TRUE;
+
+ /* We don't overwrite whatever was set before by the format-specific
+ setup: skeleton contains wrong information sometimes, and the codec
+ headers are authoritative.
+ So we only gather information that was not already filled out by
+ the mapper setup. This should hopefully allow handling unknown
+ streams a bit better, while not trashing correct setup from bad
+ skeleton data. */
+ if (pad->granulerate_n == 0 || pad->granulerate_d == 0) {
+ pad->granulerate_n = GST_READ_UINT64_LE (data);
+ pad->granulerate_d = GST_READ_UINT64_LE (data + 8);
+ }
+ if (pad->granuleshift < 0) {
+ pad->granuleshift = GST_READ_UINT8 (data + 28);
+ }
+
+ start_granule = GST_READ_UINT64_LE (data + 16);
+ pad->preroll = GST_READ_UINT32_LE (data + 24);
+
+ start_time = granulepos_to_granule_default (pad, start_granule);
+
+ GST_INFO ("skeleton fisbone parsed "
+ "(start time: %" GST_TIME_FORMAT
+ " granulerate_n: %d granulerate_d: %d "
+ " preroll: %" G_GUINT32_FORMAT " granuleshift: %d)",
+ GST_TIME_ARGS (start_time),
+ pad->granulerate_n, pad->granulerate_d, pad->preroll, pad->granuleshift);
+
+ if (p_start_time)
+ *p_start_time = start_time;
+
+ return TRUE;
+}
+
+static gboolean
+read_vlc (const guint8 ** data, guint * size, guint64 * result)
+{
+ gint shift = 0;
+ guint8 byte;
+
+ *result = 0;
+
+ do {
+ if (G_UNLIKELY (*size < 1))
+ return FALSE;
+
+ byte = **data;
+ *result |= ((byte & 0x7f) << shift);
+ shift += 7;
+
+ (*data)++;
+ (*size)--;
+ } while ((byte & 0x80) != 0x80);
+
+ return TRUE;
+}
+
+gboolean
+gst_ogg_map_add_index (GstOggStream * pad, GstOggStream * skel_pad,
+ const guint8 * data, guint size)
+{
+ guint64 i, n_keypoints, isize;
+ guint64 offset, timestamp;
+ guint64 offset_d, timestamp_d;
+
+ if (pad->index) {
+ GST_DEBUG ("already have index, ignoring second one");
+ return TRUE;
+ }
+
+ if ((skel_pad->skeleton_major == 3 && size < 26) ||
+ (skel_pad->skeleton_major == 4 && size < 62)) {
+ GST_WARNING ("small index packet of size %u, ignoring", size);
+ return FALSE;
+ }
+
+ /* skip "index\0" + serialno */
+ data += 6 + 4;
+ size -= 6 + 4;
+
+ n_keypoints = GST_READ_UINT64_LE (data);
+
+ data += 8;
+ size -= 8;
+
+ pad->kp_denom = GST_READ_UINT64_LE (data);
+ if (pad->kp_denom == 0)
+ pad->kp_denom = 1;
+
+ data += 8;
+ size -= 8;
+
+ if (skel_pad->skeleton_major == 4) {
+ gint64 firstsampletime_n;
+ gint64 lastsampletime_n;
+ gint64 firstsampletime, lastsampletime;
+
+ firstsampletime_n = GST_READ_UINT64_LE (data + 0);
+ lastsampletime_n = GST_READ_UINT64_LE (data + 8);
+
+ GST_INFO ("firstsampletime %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ firstsampletime_n, pad->kp_denom);
+ GST_INFO ("lastsampletime %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ lastsampletime_n, pad->kp_denom);
+
+ firstsampletime = gst_util_uint64_scale (GST_SECOND,
+ firstsampletime_n, pad->kp_denom);
+ lastsampletime = gst_util_uint64_scale (GST_SECOND,
+ lastsampletime_n, pad->kp_denom);
+
+ if (lastsampletime > firstsampletime)
+ pad->total_time = lastsampletime - firstsampletime;
+ else
+ pad->total_time = -1;
+
+ GST_INFO ("skeleton index parsed total: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (pad->total_time));
+
+ data += 16;
+ size -= 16;
+ }
+
+ GST_INFO ("skeleton index has %" G_GUINT64_FORMAT " keypoints, denom: %"
+ G_GINT64_FORMAT, n_keypoints, pad->kp_denom);
+
+ pad->index = g_try_new (GstOggIndex, n_keypoints);
+ if (!pad->index)
+ return FALSE;
+
+ isize = 0;
+ offset = 0;
+ timestamp = 0;
+
+ for (i = 0; i < n_keypoints; i++) {
+ /* read deltas */
+ if (!read_vlc (&data, &size, &offset_d))
+ break;
+ if (!read_vlc (&data, &size, &timestamp_d))
+ break;
+
+ offset += offset_d;
+ timestamp += timestamp_d;
+
+ pad->index[i].offset = offset;
+ pad->index[i].timestamp = timestamp;
+ isize++;
+
+ GST_INFO ("offset %" G_GUINT64_FORMAT " time %" G_GUINT64_FORMAT, offset,
+ timestamp);
+ }
+ if (isize != n_keypoints) {
+ GST_WARNING ("truncated index, expected %" G_GUINT64_FORMAT ", found %"
+ G_GUINT64_FORMAT, n_keypoints, isize);
+ }
+ pad->n_index = isize;
+ /* try to use the index to estimate the bitrate */
+ if (isize > 2) {
+ guint64 so, eo, st, et, b, t;
+
+ /* get start and end offset and timestamps */
+ so = pad->index[0].offset;
+ st = pad->index[0].timestamp;
+ eo = pad->index[isize - 1].offset;
+ et = pad->index[isize - 1].timestamp;
+
+ b = eo - so;
+ t = et - st;
+
+ GST_DEBUG ("bytes/time %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, b, t);
+
+ /* this is the total stream bitrate according to this index */
+ pad->idx_bitrate = gst_util_uint64_scale (8 * b, pad->kp_denom, t);
+
+ GST_DEBUG ("bitrate %" G_GUINT64_FORMAT, pad->idx_bitrate);
+ }
+
+ return TRUE;
+}
+
+static gint
+gst_ogg_index_compare (const GstOggIndex * index, const guint64 * ts,
+ gpointer user_data)
+{
+ if (index->timestamp < *ts)
+ return -1;
+ else if (index->timestamp > *ts)
+ return 1;
+ else
+ return 0;
+}
+
+gboolean
+gst_ogg_map_search_index (GstOggStream * pad, gboolean before,
+ guint64 * timestamp, guint64 * offset)
+{
+ guint64 n_index;
+ guint64 ts;
+ GstOggIndex *best;
+
+ n_index = pad->n_index;
+ if (n_index == 0 || pad->index == NULL)
+ return FALSE;
+
+ ts = gst_util_uint64_scale (*timestamp, pad->kp_denom, GST_SECOND);
+ GST_INFO ("timestamp %" G_GUINT64_FORMAT, ts);
+
+ best =
+ gst_util_array_binary_search (pad->index, n_index, sizeof (GstOggIndex),
+ (GCompareDataFunc) gst_ogg_index_compare, GST_SEARCH_MODE_BEFORE, &ts,
+ NULL);
+
+ if (best == NULL)
+ return FALSE;
+
+ GST_INFO ("found at index %u", (guint) (best - pad->index));
+
+ if (offset)
+ *offset = best->offset;
+ if (timestamp)
+ *timestamp =
+ gst_util_uint64_scale (best->timestamp, GST_SECOND, pad->kp_denom);
+
+ return TRUE;
+}
+
+/* Do we need these for something?
+ * ogm->hdr.size = GST_READ_UINT32_LE (&data[13]);
+ * ogm->hdr.time_unit = GST_READ_UINT64_LE (&data[17]);
+ * ogm->hdr.samples_per_unit = GST_READ_UINT64_LE (&data[25]);
+ * ogm->hdr.default_len = GST_READ_UINT32_LE (&data[33]);
+ * ogm->hdr.buffersize = GST_READ_UINT32_LE (&data[37]);
+ * ogm->hdr.bits_per_sample = GST_READ_UINT32_LE (&data[41]);
+ */
+
+static gboolean
+is_header_ogm (GstOggStream * pad, ogg_packet * packet)
+{
+ if (packet->bytes >= 1 && (packet->packet[0] & 0x01))
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+extract_tags_ogm (GstOggStream * pad, ogg_packet * packet)
+{
+ if (!(packet->packet[0] & 1) && (packet->packet[0] & 3 && pad->is_ogm_text)) {
+ tag_list_from_vorbiscomment_packet (packet,
+ (const guint8 *) "\003vorbis", 7, &pad->taglist);
+ }
+}
+
+static gint64
+packet_duration_ogm (GstOggStream * pad, ogg_packet * packet)
+{
+ const guint8 *data;
+ int samples;
+ int offset;
+ int n;
+
+ data = packet->packet;
+ offset = 1 + (((data[0] & 0xc0) >> 6) | ((data[0] & 0x02) << 1));
+
+ if (offset > packet->bytes) {
+ GST_ERROR ("buffer too small");
+ return -1;
+ }
+
+ samples = 0;
+ for (n = offset - 1; n > 0; n--) {
+ samples = (samples << 8) | data[n];
+ }
+
+ return samples;
+}
+
+static gboolean
+setup_ogmaudio_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint32 fourcc;
+ gchar *fstr;
+
+ pad->granulerate_n = GST_READ_UINT64_LE (data + 25);
+ pad->granulerate_d = 1;
+
+ fourcc = GST_READ_UINT32_LE (data + 9);
+ fstr = g_strdup_printf ("%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+ GST_DEBUG ("fourcc: %s", fstr);
+
+ pad->caps = gst_riff_create_audio_caps (fourcc, NULL, NULL, NULL, NULL, NULL);
+
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ if (pad->caps) {
+ gst_caps_set_simple (pad->caps,
+ "rate", G_TYPE_INT, pad->granulerate_n, NULL);
+ } else {
+ pad->caps = gst_caps_new_simple ("audio/x-ogm-unknown",
+ "fourcc", G_TYPE_STRING, fstr,
+ "rate", G_TYPE_INT, pad->granulerate_n, NULL);
+ }
+ g_free (fstr);
+
+ pad->n_header_packets = 1;
+ pad->is_ogm = TRUE;
+
+ return TRUE;
+}
+
+static gboolean
+setup_ogmvideo_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ guint32 fourcc;
+ int width, height;
+ gint64 time_unit;
+ gchar *fstr;
+
+ GST_DEBUG ("time unit %d", GST_READ_UINT32_LE (data + 16));
+ GST_DEBUG ("samples per unit %d", GST_READ_UINT32_LE (data + 24));
+
+ pad->is_video = TRUE;
+ pad->granulerate_n = 10000000;
+ time_unit = GST_READ_UINT64_LE (data + 17);
+ if (time_unit > G_MAXINT || time_unit < G_MININT) {
+ GST_WARNING ("timeunit is out of range");
+ }
+ pad->granulerate_d = (gint) CLAMP (time_unit, G_MININT, G_MAXINT);
+
+ GST_LOG ("fps = %d/%d = %.3f",
+ pad->granulerate_n, pad->granulerate_d,
+ (double) pad->granulerate_n / pad->granulerate_d);
+
+ fourcc = GST_READ_UINT32_LE (data + 9);
+ width = GST_READ_UINT32_LE (data + 45);
+ height = GST_READ_UINT32_LE (data + 49);
+ fstr = g_strdup_printf ("%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+ GST_DEBUG ("fourcc: %s", fstr);
+
+ pad->caps = gst_riff_create_video_caps (fourcc, NULL, NULL, NULL, NULL, NULL);
+
+ if (pad->caps == NULL) {
+ pad->caps = gst_caps_new_simple ("video/x-ogm-unknown",
+ "fourcc", G_TYPE_STRING, fstr,
+ "framerate", GST_TYPE_FRACTION, pad->granulerate_n,
+ pad->granulerate_d, NULL);
+ } else {
+ gst_caps_set_simple (pad->caps,
+ "framerate", GST_TYPE_FRACTION, pad->granulerate_n,
+ pad->granulerate_d,
+ "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
+ }
+ GST_DEBUG ("caps: %" GST_PTR_FORMAT, pad->caps);
+ g_free (fstr);
+
+ pad->n_header_packets = 1;
+ pad->frame_size = 1;
+ pad->is_ogm = TRUE;
+
+ return TRUE;
+}
+
+static gboolean
+setup_ogmtext_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ gint64 time_unit;
+
+ pad->granulerate_n = 10000000;
+ time_unit = GST_READ_UINT64_LE (data + 17);
+ if (time_unit > G_MAXINT || time_unit < G_MININT) {
+ GST_WARNING ("timeunit is out of range");
+ }
+ pad->granulerate_d = (gint) CLAMP (time_unit, G_MININT, G_MAXINT);
+
+ GST_LOG ("fps = %d/%d = %.3f",
+ pad->granulerate_n, pad->granulerate_d,
+ (double) pad->granulerate_n / pad->granulerate_d);
+
+ if (pad->granulerate_d <= 0)
+ return FALSE;
+
+ pad->caps = gst_caps_new_simple ("text/plain", NULL);
+
+ pad->n_header_packets = 1;
+ pad->is_ogm = TRUE;
+ pad->is_ogm_text = TRUE;
+ pad->is_sparse = TRUE;
+
+ return TRUE;
+}
+
+/* PCM */
+
+#define OGGPCM_FMT_S8 0x00000000 /* Signed integer 8 bit */
+#define OGGPCM_FMT_U8 0x00000001 /* Unsigned integer 8 bit */
+#define OGGPCM_FMT_S16_LE 0x00000002 /* Signed integer 16 bit little endian */
+#define OGGPCM_FMT_S16_BE 0x00000003 /* Signed integer 16 bit big endian */
+#define OGGPCM_FMT_S24_LE 0x00000004 /* Signed integer 24 bit little endian */
+#define OGGPCM_FMT_S24_BE 0x00000005 /* Signed integer 24 bit big endian */
+#define OGGPCM_FMT_S32_LE 0x00000006 /* Signed integer 32 bit little endian */
+#define OGGPCM_FMT_S32_BE 0x00000007 /* Signed integer 32 bit big endian */
+
+#define OGGPCM_FMT_ULAW 0x00000010 /* G.711 u-law encoding (8 bit) */
+#define OGGPCM_FMT_ALAW 0x00000011 /* G.711 A-law encoding (8 bit) */
+
+#define OGGPCM_FMT_FLT32_LE 0x00000020 /* IEEE Float [-1,1] 32 bit little endian */
+#define OGGPCM_FMT_FLT32_BE 0x00000021 /* IEEE Float [-1,1] 32 bit big endian */
+#define OGGPCM_FMT_FLT64_LE 0x00000022 /* IEEE Float [-1,1] 64 bit little endian */
+#define OGGPCM_FMT_FLT64_BE 0x00000023 /* IEEE Float [-1,1] 64 bit big endian */
+
+
+static gboolean
+setup_pcm_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ int format;
+ int channels;
+ GstCaps *caps;
+
+ pad->granulerate_n = GST_READ_UINT32_LE (data + 16);
+ pad->granulerate_d = 1;
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+
+ format = GST_READ_UINT32_LE (data + 12);
+ channels = GST_READ_UINT8 (data + 21);
+
+ pad->n_header_packets = 2 + GST_READ_UINT32_LE (data + 24);
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ switch (format) {
+ case OGGPCM_FMT_S8:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S8", NULL);
+ break;
+ case OGGPCM_FMT_U8:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "U8", NULL);
+ break;
+ case OGGPCM_FMT_S16_LE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S16LE", NULL);
+ break;
+ case OGGPCM_FMT_S16_BE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S16BE", NULL);
+ break;
+ case OGGPCM_FMT_S24_LE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S24LE", NULL);
+ break;
+ case OGGPCM_FMT_S24_BE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S24BE", NULL);
+ break;
+ case OGGPCM_FMT_S32_LE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S32LE", NULL);
+ break;
+ case OGGPCM_FMT_S32_BE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "S32BE", NULL);
+ break;
+ case OGGPCM_FMT_ULAW:
+ caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+ break;
+ case OGGPCM_FMT_ALAW:
+ caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+ break;
+ case OGGPCM_FMT_FLT32_LE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "F32LE", NULL);
+ break;
+ case OGGPCM_FMT_FLT32_BE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "F32BE", NULL);
+ break;
+ case OGGPCM_FMT_FLT64_LE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "F64LE", NULL);
+ break;
+ case OGGPCM_FMT_FLT64_BE:
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, "F64BE", NULL);
+ break;
+ default:
+ return FALSE;
+ }
+
+ gst_caps_set_simple (caps,
+ "rate", G_TYPE_INT, pad->granulerate_n,
+ "channels", G_TYPE_INT, channels, NULL);
+ pad->caps = caps;
+
+ return TRUE;
+}
+
+/* cmml */
+
+static gboolean
+setup_cmml_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+
+ pad->granulerate_n = GST_READ_UINT64_LE (data + 12);
+ pad->granulerate_d = GST_READ_UINT64_LE (data + 20);
+ pad->granuleshift = data[28];
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+
+ pad->n_header_packets = 3;
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ data += 4 + (4 + 4 + 4);
+ GST_DEBUG ("blocksize0: %u", 1 << (data[0] >> 4));
+ GST_DEBUG ("blocksize1: %u", 1 << (data[0] & 0x0F));
+
+ pad->caps = gst_caps_new_simple ("text/x-cmml", NULL);
+ pad->always_flush_page = TRUE;
+ pad->is_sparse = TRUE;
+
+ return TRUE;
+}
+
+/* celt */
+
+static gboolean
+setup_celt_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+
+ pad->granulerate_n = GST_READ_UINT32_LE (data + 36);
+ pad->granulerate_d = 1;
+ pad->granuleshift = 0;
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+
+ pad->frame_size = GST_READ_UINT32_LE (packet->packet + 44);
+ pad->n_header_packets = GST_READ_UINT32_LE (packet->packet + 56) + 2;
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ pad->caps = gst_caps_new_simple ("audio/x-celt",
+ "rate", G_TYPE_INT, pad->granulerate_n, NULL);
+
+ return TRUE;
+}
+
+/* kate */
+
+static gboolean
+setup_kate_mapper (GstOggStream * pad, ogg_packet * packet)
+{
+ guint8 *data = packet->packet;
+ const char *category;
+
+ if (packet->bytes < 64)
+ return FALSE;
+
+ pad->granulerate_n = GST_READ_UINT32_LE (data + 24);
+ pad->granulerate_d = GST_READ_UINT32_LE (data + 28);
+ pad->granuleshift = GST_READ_UINT8 (data + 15);
+ GST_LOG ("sample rate: %d", pad->granulerate_n);
+
+ pad->n_header_packets = GST_READ_UINT8 (data + 11);
+ GST_LOG ("kate header packets: %d", pad->n_header_packets);
+
+ if (pad->granulerate_n == 0)
+ return FALSE;
+
+ category = (const char *) data + 48;
+ if (strcmp (category, "subtitles") == 0 || strcmp (category, "SUB") == 0 ||
+ strcmp (category, "spu-subtitles") == 0 ||
+ strcmp (category, "K-SPU") == 0) {
+ pad->caps = gst_caps_new_simple ("subtitle/x-kate", NULL);
+ } else {
+ pad->caps = gst_caps_new_simple ("application/x-kate", NULL);
+ }
+
+ pad->is_sparse = TRUE;
+ pad->always_flush_page = TRUE;
+
+ return TRUE;
+}
+
+static gint64
+packet_duration_kate (GstOggStream * pad, ogg_packet * packet)
+{
+ gint64 duration;
+
+ if (packet->bytes < 1)
+ return 0;
+
+ switch (packet->packet[0]) {
+ case 0x00: /* text data */
+ if (packet->bytes < 1 + 8 * 2) {
+ duration = 0;
+ } else {
+ duration = GST_READ_UINT64_LE (packet->packet + 1 + 8);
+ if (duration < 0)
+ duration = 0;
+ }
+ break;
+ default:
+ duration = GST_CLOCK_TIME_NONE;
+ break;
+ }
+
+ return duration;
+}
+
+static void
+extract_tags_kate (GstOggStream * pad, ogg_packet * packet)
+{
+ GstTagList *list = NULL;
+
+ if (packet->bytes <= 0)
+ return;
+
+ switch (packet->packet[0]) {
+ case 0x80:{
+ const gchar *canonical;
+ char language[16];
+
+ if (packet->bytes < 64) {
+ GST_WARNING ("Kate ID header packet is less than 64 bytes, ignored");
+ break;
+ }
+
+ /* the language tag is 16 bytes at offset 32, ensure NUL terminator */
+ memcpy (language, packet->packet + 32, 16);
+ language[15] = 0;
+
+ /* language is an ISO 639-1 code or RFC 3066 language code, we
+ * truncate to ISO 639-1 */
+ g_strdelimit (language, NULL, '\0');
+ canonical = gst_tag_get_language_code_iso_639_1 (language);
+ if (canonical) {
+ list = gst_tag_list_new_full (GST_TAG_LANGUAGE_CODE, canonical, NULL);
+ } else {
+ GST_WARNING ("Unknown or invalid language code %s, ignored", language);
+ }
+ break;
+ }
+ case 0x81:
+ tag_list_from_vorbiscomment_packet (packet,
+ (const guint8 *) "\201kate\0\0\0\0", 9, &list);
+ break;
+ default:
+ break;
+ }
+
+ if (list) {
+ if (pad->taglist) {
+ /* ensure the comment packet cannot override the category/language
+ from the identification header */
+ gst_tag_list_insert (pad->taglist, list, GST_TAG_MERGE_KEEP_ALL);
+ } else
+ pad->taglist = list;
+ }
+}
+
+
+/* *INDENT-OFF* */
+/* indent hates our freedoms */
+const GstOggMap mappers[] = {
+ {
+ "\200theora", 7, 42,
+ "video/x-theora",
+ setup_theora_mapper,
+ granulepos_to_granule_theora,
+ granule_to_granulepos_default,
+ is_keyframe_theora,
+ is_header_theora,
+ packet_duration_constant,
+ NULL,
+ extract_tags_theora
+ },
+ {
+ "\001vorbis", 7, 22,
+ "audio/x-vorbis",
+ setup_vorbis_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_vorbis,
+ packet_duration_vorbis,
+ NULL,
+ extract_tags_vorbis
+ },
+ {
+ "Speex", 5, 80,
+ "audio/x-speex",
+ setup_speex_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_count,
+ packet_duration_constant,
+ NULL,
+ extract_tags_count
+ },
+ {
+ "PCM ", 8, 0,
+ "audio/x-raw",
+ setup_pcm_mapper,
+ NULL,
+ NULL,
+ NULL,
+ is_header_count,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ "CMML\0\0\0\0", 8, 0,
+ "text/x-cmml",
+ setup_cmml_mapper,
+ NULL,
+ NULL,
+ NULL,
+ is_header_count,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ "Annodex", 7, 0,
+ "application/x-annodex",
+ setup_fishead_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ NULL,
+ is_header_count,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ "fishead", 7, 64,
+ "application/octet-stream",
+ setup_fishead_mapper,
+ NULL,
+ NULL,
+ NULL,
+ is_header_true,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ "fLaC", 4, 0,
+ "audio/x-flac",
+ setup_fLaC_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_fLaC,
+ packet_duration_flac,
+ NULL,
+ NULL
+ },
+ {
+ "\177FLAC", 5, 36,
+ "audio/x-flac",
+ setup_flac_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_flac,
+ packet_duration_flac,
+ NULL,
+ extract_tags_flac
+ },
+ {
+ "AnxData", 7, 0,
+ "application/octet-stream",
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ "CELT ", 8, 0,
+ "audio/x-celt",
+ setup_celt_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ NULL,
+ is_header_count,
+ packet_duration_constant,
+ NULL,
+ extract_tags_count
+ },
+ {
+ "\200kate\0\0\0", 8, 0,
+ "text/x-kate",
+ setup_kate_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ NULL,
+ is_header_count,
+ packet_duration_kate,
+ NULL,
+ extract_tags_kate
+ },
+ {
+ "BBCD\0", 5, 13,
+ "video/x-dirac",
+ setup_dirac_mapper,
+ granulepos_to_granule_dirac,
+ granule_to_granulepos_dirac,
+ is_keyframe_dirac,
+ is_header_count,
+ packet_duration_constant,
+ granulepos_to_key_granule_dirac,
+ NULL
+ },
+ {
+ "OVP80\1\1", 7, 4,
+ "video/x-vp8",
+ setup_vp8_mapper,
+ granulepos_to_granule_vp8,
+ granule_to_granulepos_vp8,
+ is_keyframe_vp8,
+ is_header_vp8,
+ packet_duration_vp8,
+ granulepos_to_key_granule_vp8,
+ extract_tags_vp8
+ },
+ {
+ "\001audio\0\0\0", 9, 53,
+ "application/x-ogm-audio",
+ setup_ogmaudio_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_ogm,
+ packet_duration_ogm,
+ NULL,
+ NULL
+ },
+ {
+ "\001video\0\0\0", 9, 53,
+ "application/x-ogm-video",
+ setup_ogmvideo_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ NULL,
+ is_header_ogm,
+ packet_duration_constant,
+ NULL,
+ NULL
+ },
+ {
+ "\001text\0\0\0", 9, 9,
+ "application/x-ogm-text",
+ setup_ogmtext_mapper,
+ granulepos_to_granule_default,
+ granule_to_granulepos_default,
+ is_keyframe_true,
+ is_header_ogm,
+ packet_duration_ogm,
+ NULL,
+ extract_tags_ogm
+ }
+};
+/* *INDENT-ON* */
+
+gboolean
+gst_ogg_stream_setup_map (GstOggStream * pad, ogg_packet * packet)
+{
+ int i;
+ gboolean ret;
+
+ for (i = 0; i < G_N_ELEMENTS (mappers); i++) {
+ if (packet->bytes >= mappers[i].min_packet_size &&
+ packet->bytes >= mappers[i].id_length &&
+ memcmp (packet->packet, mappers[i].id, mappers[i].id_length) == 0) {
+
+ GST_DEBUG ("found mapper for '%s'", mappers[i].id);
+
+ if (mappers[i].setup_func)
+ ret = mappers[i].setup_func (pad, packet);
+ else
+ continue;
+
+ if (ret) {
+ GST_DEBUG ("got stream type %" GST_PTR_FORMAT, pad->caps);
+ pad->map = i;
+ return TRUE;
+ } else {
+ GST_WARNING ("mapper '%s' did not accept setup header",
+ mappers[i].media_type);
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad,
+ const GstCaps * caps)
+{
+ GstBuffer *buf;
+ const GstStructure *structure;
+ const GValue *streamheader;
+ const GValue *first_element;
+ ogg_packet packet;
+ guint8 *data;
+ gsize size;
+ gboolean ret;
+
+ GST_INFO ("Checking streamheader on caps %" GST_PTR_FORMAT, caps);
+
+ if (caps == NULL)
+ return FALSE;
+
+ structure = gst_caps_get_structure (caps, 0);
+ streamheader = gst_structure_get_value (structure, "streamheader");
+
+ if (streamheader == NULL) {
+ GST_LOG ("no streamheader field in caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ if (!GST_VALUE_HOLDS_ARRAY (streamheader)) {
+ GST_ERROR ("streamheader field not an array, caps: %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ if (gst_value_array_get_size (streamheader) == 0) {
+ GST_ERROR ("empty streamheader field in caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ first_element = gst_value_array_get_value (streamheader, 0);
+
+ if (!GST_VALUE_HOLDS_BUFFER (first_element)) {
+ GST_ERROR ("first streamheader not a buffer, caps: %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ buf = gst_value_get_buffer (first_element);
+ if (buf == NULL) {
+ GST_ERROR ("no first streamheader buffer");
+ return FALSE;
+ }
+
+ data = gst_buffer_map (buf, &size, 0, GST_MAP_READ);
+ if (data == NULL || size == 0) {
+ GST_ERROR ("invalid first streamheader buffer");
+ return FALSE;
+ }
+
+ GST_MEMDUMP ("streamheader", data, size);
+
+ packet.packet = data;
+ packet.bytes = size;
+
+ GST_INFO ("Found headers on caps, using those to determine type");
+ ret = gst_ogg_stream_setup_map (pad, &packet);
+
+ gst_buffer_unmap (buf, data, size);
+
+ return ret;
+}
diff --git a/ext/ogg/gstoggstream.h b/ext/ogg/gstoggstream.h
new file mode 100644
index 0000000..d6c4de6
--- /dev/null
+++ b/ext/ogg/gstoggstream.h
@@ -0,0 +1,142 @@
+/* GStreamer
+ * Copyright (C) 2009 David Schleef <ds@schleef.org>
+ *
+ * gstoggstream.h: header for GstOggStream
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_OGG_STREAM_H__
+#define __GST_OGG_STREAM_H__
+
+#include <ogg/ogg.h>
+
+#include <gst/gst.h>
+#include <gst/tag/tag.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+ GST_OGG_SKELETON_FISBONE,
+ GST_OGG_SKELETON_INDEX,
+} GstOggSkeleton;
+
+typedef struct {
+ guint64 offset;
+ guint64 timestamp;
+} GstOggIndex;
+
+typedef struct _GstOggStream GstOggStream;
+
+struct _GstOggStream
+{
+ ogg_stream_state stream;
+
+ guint32 serialno;
+ GList *headers;
+ gboolean have_headers;
+ GList *queued;
+
+ /* for oggparse */
+ gboolean in_headers;
+ GList *unknown_pages;
+ GList *stored_buffers;
+
+ gint map;
+ gboolean is_skeleton;
+ gboolean have_fisbone;
+ gint granulerate_n;
+ gint granulerate_d;
+ guint32 preroll;
+ guint granuleshift;
+ gint n_header_packets;
+ gint n_header_packets_seen;
+ gint64 accumulated_granule;
+ gint frame_size;
+ gint bitrate;
+ guint64 total_time;
+ gboolean is_sparse;
+
+ GstCaps *caps;
+
+ gboolean is_video;
+ gboolean always_flush_page;
+
+ /* vorbis stuff */
+ int nln_increments[4];
+ int nsn_increment;
+ int short_size;
+ int long_size;
+ int vorbis_log2_num_modes;
+ int vorbis_mode_sizes[256];
+ int last_size;
+ int version;
+ gint bitrate_upper;
+ gint bitrate_nominal;
+ gint bitrate_lower;
+ GstTagList *taglist;
+ /* theora stuff */
+ gboolean theora_has_zero_keyoffset;
+ /* VP8 stuff */
+ gboolean is_vp8;
+ /* OGM stuff */
+ gboolean is_ogm;
+ gboolean is_ogm_text;
+ /* fishead stuff */
+ guint16 skeleton_major, skeleton_minor;
+ gint64 prestime;
+ gint64 basetime;
+ /* index */
+ guint n_index;
+ GstOggIndex *index;
+ guint64 kp_denom;
+ guint64 idx_bitrate;
+};
+
+
+gboolean gst_ogg_stream_setup_map (GstOggStream * pad, ogg_packet *packet);
+gboolean gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad,
+ const GstCaps * caps);
+GstClockTime gst_ogg_stream_get_end_time_for_granulepos (GstOggStream *pad,
+ gint64 granulepos);
+GstClockTime gst_ogg_stream_get_start_time_for_granulepos (GstOggStream *pad,
+ gint64 granulepos);
+GstClockTime gst_ogg_stream_granule_to_time (GstOggStream *pad, gint64 granule);
+gint64 gst_ogg_stream_granulepos_to_granule (GstOggStream * pad, gint64 granulepos);
+gint64 gst_ogg_stream_granulepos_to_key_granule (GstOggStream * pad, gint64 granulepos);
+gint64 gst_ogg_stream_granule_to_granulepos (GstOggStream * pad, gint64 granule, gint64 keyframe_granule);
+GstClockTime gst_ogg_stream_get_packet_start_time (GstOggStream *pad,
+ ogg_packet *packet);
+gboolean gst_ogg_stream_granulepos_is_key_frame (GstOggStream *pad,
+ gint64 granulepos);
+gboolean gst_ogg_stream_packet_is_header (GstOggStream *pad, ogg_packet *packet);
+gint64 gst_ogg_stream_get_packet_duration (GstOggStream * pad, ogg_packet *packet);
+void gst_ogg_stream_extract_tags (GstOggStream * pad, ogg_packet * packet);
+const char *gst_ogg_stream_get_media_type (GstOggStream * pad);
+
+gboolean gst_ogg_map_parse_fisbone (GstOggStream * pad, const guint8 * data, guint size,
+ guint32 * serialno, GstOggSkeleton *type);
+gboolean gst_ogg_map_add_fisbone (GstOggStream * pad, GstOggStream * skel_pad, const guint8 * data, guint size,
+ GstClockTime * p_start_time);
+gboolean gst_ogg_map_add_index (GstOggStream * pad, GstOggStream * skel_pad, const guint8 * data, guint size);
+gboolean gst_ogg_map_search_index (GstOggStream * pad, gboolean before, guint64 *timestamp, guint64 *offset);
+
+
+
+
+G_END_DECLS
+
+#endif /* __GST_OGG_STREAM_H__ */
diff --git a/ext/ogg/gstogmparse.c b/ext/ogg/gstogmparse.c
new file mode 100644
index 0000000..b81856a
--- /dev/null
+++ b/ext/ogg/gstogmparse.c
@@ -0,0 +1,968 @@
+/* GStreamer OGM parsing
+ * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include <gst/gst.h>
+#include <gst/tag/tag.h>
+#include <gst/riff/riff-media.h>
+#include <gst/riff/riff-read.h>
+
+#include "gstogg.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_ogm_parse_debug);
+#define GST_CAT_DEFAULT gst_ogm_parse_debug
+
+#define GST_TYPE_OGM_VIDEO_PARSE (gst_ogm_video_parse_get_type())
+#define GST_IS_OGM_VIDEO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OGM_VIDEO_PARSE))
+
+#define GST_TYPE_OGM_AUDIO_PARSE (gst_ogm_audio_parse_get_type())
+#define GST_IS_OGM_AUDIO_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OGM_AUDIO_PARSE))
+
+#define GST_TYPE_OGM_TEXT_PARSE (gst_ogm_text_parse_get_type())
+#define GST_IS_OGM_TEXT_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OGM_TEXT_PARSE))
+
+#define GST_TYPE_OGM_PARSE (gst_ogm_parse_get_type())
+#define GST_OGM_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_OGM_PARSE, GstOgmParse))
+#define GST_OGM_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_OGM_PARSE, GstOgmParse))
+#define GST_IS_OGM_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OGM_PARSE))
+#define GST_IS_OGM_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_OGM_PARSE))
+#define GST_OGM_PARSE_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OGM_PARSE, GstOgmParseClass))
+
+typedef struct _stream_header_video
+{
+ gint32 width;
+ gint32 height;
+} stream_header_video;
+
+typedef struct _stream_header_audio
+{
+ gint16 channels;
+ gint16 blockalign;
+ gint32 avgbytespersec;
+} stream_header_audio;
+
+/* sizeof(stream_header) might differ due to structure packing and
+ * alignment differences on some architectures, so not using that */
+#define OGM_STREAM_HEADER_SIZE (8+4+4+8+8+4+4+4+8)
+
+typedef struct _stream_header
+{
+ gchar streamtype[8];
+ gchar subtype[4 + 1];
+
+ /* size of the structure */
+ gint32 size;
+
+ /* in reference time */
+ gint64 time_unit;
+
+ gint64 samples_per_unit;
+
+ /* in media time */
+ gint32 default_len;
+
+ gint32 buffersize;
+ gint32 bits_per_sample;
+
+ union
+ {
+ stream_header_video video;
+ stream_header_audio audio;
+ /* text has no additional data */
+ } s;
+} stream_header;
+
+typedef struct _GstOgmParse
+{
+ GstElement element;
+
+ /* pads */
+ GstPad *srcpad, *sinkpad;
+ GstPadTemplate *srcpadtempl;
+
+ /* we need to cache events that we receive before creating the source pad */
+ GList *cached_events;
+
+ /* audio or video */
+ stream_header hdr;
+
+ /* expected next granulepos (used for timestamp guessing) */
+ guint64 next_granulepos;
+} GstOgmParse;
+
+typedef struct _GstOgmParseClass
+{
+ GstElementClass parent_class;
+} GstOgmParseClass;
+
+static GstStaticPadTemplate sink_factory_video =
+GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-ogm-video"));
+static GstStaticPadTemplate sink_factory_audio =
+GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-ogm-audio"));
+static GstStaticPadTemplate sink_factory_text =
+GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-ogm-text"));
+static GstPadTemplate *video_src_templ, *audio_src_templ, *text_src_templ;
+
+static GType gst_ogm_audio_parse_get_type (void);
+static GType gst_ogm_video_parse_get_type (void);
+static GType gst_ogm_text_parse_get_type (void);
+static GType gst_ogm_parse_get_type (void);
+
+static void gst_ogm_audio_parse_base_init (GstOgmParseClass * klass);
+static void gst_ogm_video_parse_base_init (GstOgmParseClass * klass);
+static void gst_ogm_text_parse_base_init (GstOgmParseClass * klass);
+static void gst_ogm_parse_class_init (GstOgmParseClass * klass);
+static void gst_ogm_parse_init (GstOgmParse * ogm);
+static void gst_ogm_video_parse_init (GstOgmParse * ogm);
+static void gst_ogm_audio_parse_init (GstOgmParse * ogm);
+static void gst_ogm_text_parse_init (GstOgmParse * ogm);
+
+static const GstQueryType *gst_ogm_parse_get_sink_querytypes (GstPad * pad);
+static gboolean gst_ogm_parse_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query);
+static gboolean gst_ogm_parse_sink_convert (GstPad * pad, GstFormat src_format,
+ gint64 src_value, GstFormat * dest_format, gint64 * dest_value);
+
+static GstFlowReturn gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer);
+
+static GstStateChangeReturn gst_ogm_parse_change_state (GstElement * element,
+ GstStateChange transition);
+
+static GstElementClass *parent_class = NULL;
+
+static GType
+gst_ogm_parse_get_type (void)
+{
+ static GType ogm_parse_type = 0;
+
+ if (!ogm_parse_type) {
+ static const GTypeInfo ogm_parse_info = {
+ sizeof (GstOgmParseClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_ogm_parse_class_init,
+ NULL,
+ NULL,
+ sizeof (GstOgmParse),
+ 0,
+ (GInstanceInitFunc) gst_ogm_parse_init,
+ };
+
+ ogm_parse_type =
+ g_type_register_static (GST_TYPE_ELEMENT,
+ "GstOgmParse", &ogm_parse_info, 0);
+ }
+
+ return ogm_parse_type;
+}
+
+static GType
+gst_ogm_audio_parse_get_type (void)
+{
+ static GType ogm_audio_parse_type = 0;
+
+ if (!ogm_audio_parse_type) {
+ static const GTypeInfo ogm_audio_parse_info = {
+ sizeof (GstOgmParseClass),
+ (GBaseInitFunc) gst_ogm_audio_parse_base_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ sizeof (GstOgmParse),
+ 0,
+ (GInstanceInitFunc) gst_ogm_audio_parse_init,
+ };
+
+ ogm_audio_parse_type =
+ g_type_register_static (GST_TYPE_OGM_PARSE,
+ "GstOgmAudioParse", &ogm_audio_parse_info, 0);
+ }
+
+ return ogm_audio_parse_type;
+}
+
+static GType
+gst_ogm_video_parse_get_type (void)
+{
+ static GType ogm_video_parse_type = 0;
+
+ if (!ogm_video_parse_type) {
+ static const GTypeInfo ogm_video_parse_info = {
+ sizeof (GstOgmParseClass),
+ (GBaseInitFunc) gst_ogm_video_parse_base_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ sizeof (GstOgmParse),
+ 0,
+ (GInstanceInitFunc) gst_ogm_video_parse_init,
+ };
+
+ ogm_video_parse_type =
+ g_type_register_static (GST_TYPE_OGM_PARSE,
+ "GstOgmVideoParse", &ogm_video_parse_info, 0);
+ }
+
+ return ogm_video_parse_type;
+}
+
+static GType
+gst_ogm_text_parse_get_type (void)
+{
+ static GType ogm_text_parse_type = 0;
+
+ if (!ogm_text_parse_type) {
+ static const GTypeInfo ogm_text_parse_info = {
+ sizeof (GstOgmParseClass),
+ (GBaseInitFunc) gst_ogm_text_parse_base_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ sizeof (GstOgmParse),
+ 0,
+ (GInstanceInitFunc) gst_ogm_text_parse_init,
+ };
+
+ ogm_text_parse_type =
+ g_type_register_static (GST_TYPE_OGM_PARSE,
+ "GstOgmTextParse", &ogm_text_parse_info, 0);
+ }
+
+ return ogm_text_parse_type;
+}
+
+static void
+gst_ogm_audio_parse_base_init (GstOgmParseClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstCaps *caps = gst_riff_create_audio_template_caps ();
+
+ gst_element_class_set_details_simple (element_class,
+ "OGM audio stream parser", "Codec/Decoder/Audio",
+ "parse an OGM audio header and stream",
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory_audio));
+ audio_src_templ = gst_pad_template_new ("src",
+ GST_PAD_SRC, GST_PAD_SOMETIMES, caps);
+ gst_element_class_add_pad_template (element_class, audio_src_templ);
+ gst_caps_unref (caps);
+}
+
+static void
+gst_ogm_video_parse_base_init (GstOgmParseClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstCaps *caps = gst_riff_create_video_template_caps ();
+
+ gst_element_class_set_details_simple (element_class,
+ "OGM video stream parser", "Codec/Decoder/Video",
+ "parse an OGM video header and stream",
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory_video));
+ video_src_templ = gst_pad_template_new ("src",
+ GST_PAD_SRC, GST_PAD_SOMETIMES, caps);
+ gst_element_class_add_pad_template (element_class, video_src_templ);
+ gst_caps_unref (caps);
+}
+
+static void
+gst_ogm_text_parse_base_init (GstOgmParseClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstCaps *caps = gst_caps_new_simple ("text/plain", NULL, NULL);
+
+ gst_element_class_set_details_simple (element_class,
+ "OGM text stream parser", "Codec/Decoder/Subtitle",
+ "parse an OGM text header and stream",
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory_text));
+ text_src_templ = gst_pad_template_new ("src",
+ GST_PAD_SRC, GST_PAD_SOMETIMES, caps);
+ gst_element_class_add_pad_template (element_class, text_src_templ);
+ gst_caps_unref (caps);
+}
+
+static void
+gst_ogm_parse_class_init (GstOgmParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_change_state);
+}
+
+static void
+gst_ogm_parse_init (GstOgmParse * ogm)
+{
+ memset (&ogm->hdr, 0, sizeof (ogm->hdr));
+ ogm->next_granulepos = 0;
+ ogm->srcpad = NULL;
+ ogm->cached_events = NULL;
+}
+
+static void
+gst_ogm_audio_parse_init (GstOgmParse * ogm)
+{
+ ogm->sinkpad = gst_pad_new_from_static_template (&sink_factory_audio, "sink");
+ gst_pad_set_query_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+ gst_pad_set_chain_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
+ gst_pad_set_event_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
+
+ ogm->srcpad = NULL;
+ ogm->srcpadtempl = audio_src_templ;
+}
+
+static void
+gst_ogm_video_parse_init (GstOgmParse * ogm)
+{
+ ogm->sinkpad = gst_pad_new_from_static_template (&sink_factory_video, "sink");
+ gst_pad_set_query_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+ gst_pad_set_chain_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
+ gst_pad_set_event_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
+
+ ogm->srcpad = NULL;
+ ogm->srcpadtempl = video_src_templ;
+}
+
+static void
+gst_ogm_text_parse_init (GstOgmParse * ogm)
+{
+ ogm->sinkpad = gst_pad_new_from_static_template (&sink_factory_text, "sink");
+ gst_pad_set_query_type_function (ogm->sinkpad,
+ gst_ogm_parse_get_sink_querytypes);
+ gst_pad_set_query_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+ gst_pad_set_chain_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
+ gst_pad_set_event_function (ogm->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
+
+ ogm->srcpad = NULL;
+ ogm->srcpadtempl = text_src_templ;
+}
+
+static const GstQueryType *
+gst_ogm_parse_get_sink_querytypes (GstPad * pad)
+{
+ static const GstQueryType types[] = {
+ GST_QUERY_POSITION,
+ 0
+ };
+
+ return types;
+}
+
+static gboolean
+gst_ogm_parse_sink_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = FALSE;
+ GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad));
+
+ switch (src_format) {
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ switch (ogm->hdr.streamtype[0]) {
+ case 'a':
+ *dest_value = GST_SECOND * src_value / ogm->hdr.samples_per_unit;
+ res = TRUE;
+ break;
+ case 'v':
+ case 't':
+ *dest_value = (GST_SECOND / 10000000) *
+ ogm->hdr.time_unit * src_value;
+ res = TRUE;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ switch (ogm->hdr.streamtype[0]) {
+ case 'a':
+ *dest_value = ogm->hdr.samples_per_unit * src_value / GST_SECOND;
+ res = TRUE;
+ break;
+ case 'v':
+ case 't':
+ *dest_value = src_value /
+ ((GST_SECOND / 10000000) * ogm->hdr.time_unit);
+ res = TRUE;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ gst_object_unref (ogm);
+ return res;
+}
+
+static gboolean
+gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad));
+ GstFormat format;
+ gboolean res = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 val;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ if (format != GST_FORMAT_DEFAULT && format != GST_FORMAT_TIME)
+ break;
+
+ if ((res = gst_ogm_parse_sink_convert (pad,
+ GST_FORMAT_DEFAULT, ogm->next_granulepos, &format, &val))) {
+ /* don't know the total length here.. */
+ gst_query_set_position (query, format, val);
+ }
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ /* peel off input */
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if ((res = gst_ogm_parse_sink_convert (pad, src_fmt, src_val,
+ &dest_fmt, &dest_val))) {
+ 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 (ogm);
+ return res;
+}
+
+static GstFlowReturn
+gst_ogm_parse_stream_header (GstOgmParse * ogm, const guint8 * data, guint size)
+{
+ GstCaps *caps = NULL;
+
+ /* stream header */
+ if (size < OGM_STREAM_HEADER_SIZE)
+ goto buffer_too_small;
+
+ if (!memcmp (data, "video\000\000\000", 8)) {
+ ogm->hdr.s.video.width = GST_READ_UINT32_LE (&data[44]);
+ ogm->hdr.s.video.height = GST_READ_UINT32_LE (&data[48]);
+ } else if (!memcmp (data, "audio\000\000\000", 8)) {
+ ogm->hdr.s.audio.channels = GST_READ_UINT32_LE (&data[44]);
+ ogm->hdr.s.audio.blockalign = GST_READ_UINT32_LE (&data[46]);
+ ogm->hdr.s.audio.avgbytespersec = GST_READ_UINT32_LE (&data[48]);
+ } else if (!memcmp (data, "text\000\000\000\000", 8)) {
+ /* nothing here */
+ } else {
+ goto cannot_decode;
+ }
+ memcpy (ogm->hdr.streamtype, &data[0], 8);
+ memcpy (ogm->hdr.subtype, &data[8], 4);
+ ogm->hdr.subtype[4] = '\0';
+ ogm->hdr.size = GST_READ_UINT32_LE (&data[12]);
+ ogm->hdr.time_unit = GST_READ_UINT64_LE (&data[16]);
+ ogm->hdr.samples_per_unit = GST_READ_UINT64_LE (&data[24]);
+ ogm->hdr.default_len = GST_READ_UINT32_LE (&data[32]);
+ ogm->hdr.buffersize = GST_READ_UINT32_LE (&data[36]);
+ ogm->hdr.bits_per_sample = GST_READ_UINT32_LE (&data[40]);
+
+ switch (ogm->hdr.streamtype[0]) {
+ case 'a':{
+ guint codec_id = 0;
+
+ if (sscanf (ogm->hdr.subtype, "%04x", &codec_id) != 1) {
+ GST_WARNING_OBJECT (ogm, "cannot parse subtype %s", ogm->hdr.subtype);
+ }
+
+ caps =
+ gst_riff_create_audio_caps (codec_id, NULL, NULL, NULL, NULL, NULL);
+
+ if (caps == NULL) {
+ GST_WARNING_OBJECT (ogm, "no audio caps for codec %u found", codec_id);
+ caps = gst_caps_new_simple ("audio/x-ogm-unknown", "codec_id",
+ G_TYPE_INT, (gint) codec_id, NULL);
+ }
+
+ gst_caps_set_simple (caps,
+ "channels", G_TYPE_INT, ogm->hdr.s.audio.channels,
+ "rate", G_TYPE_INT, ogm->hdr.samples_per_unit, NULL);
+
+ GST_LOG_OBJECT (ogm, "Type: %s, subtype: 0x%04x, channels: %d, "
+ "samplerate: %d, blockalign: %d, bps: %d, caps = %" GST_PTR_FORMAT,
+ ogm->hdr.streamtype, codec_id, ogm->hdr.s.audio.channels,
+ (gint) ogm->hdr.samples_per_unit, ogm->hdr.s.audio.blockalign,
+ ogm->hdr.s.audio.avgbytespersec, caps);
+ break;
+ }
+ case 'v':{
+ guint32 fourcc;
+ gint time_unit;
+
+ fourcc = GST_MAKE_FOURCC (ogm->hdr.subtype[0],
+ ogm->hdr.subtype[1], ogm->hdr.subtype[2], ogm->hdr.subtype[3]);
+
+ caps = gst_riff_create_video_caps (fourcc, NULL, NULL, NULL, NULL, NULL);
+
+ if (caps == NULL) {
+ GST_WARNING_OBJECT (ogm, "could not find video caps for fourcc %"
+ GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+ caps = gst_caps_new_simple ("video/x-ogm-unknown", "fourcc",
+ G_TYPE_STRING, ogm->hdr.subtype, NULL);
+ break;
+ }
+
+ GST_LOG_OBJECT (ogm, "Type: %s, subtype: %" GST_FOURCC_FORMAT
+ ", size: %dx%d, timeunit: %" G_GINT64_FORMAT
+ " (fps: %lf), s/u: %" G_GINT64_FORMAT ", "
+ "def.len: %d, bufsize: %d, bps: %d, caps = %" GST_PTR_FORMAT,
+ ogm->hdr.streamtype, GST_FOURCC_ARGS (fourcc),
+ ogm->hdr.s.video.width, ogm->hdr.s.video.height,
+ ogm->hdr.time_unit, 10000000. / ogm->hdr.time_unit,
+ ogm->hdr.samples_per_unit, ogm->hdr.default_len,
+ ogm->hdr.buffersize, ogm->hdr.bits_per_sample, caps);
+
+ /* GST_TYPE_FRACTION contains gint */
+ if (ogm->hdr.time_unit > G_MAXINT || ogm->hdr.time_unit < G_MININT)
+ GST_WARNING_OBJECT (ogm, "timeunit is out of range");
+
+ time_unit = (gint) CLAMP (ogm->hdr.time_unit, G_MININT, G_MAXINT);
+ gst_caps_set_simple (caps,
+ "width", G_TYPE_INT, ogm->hdr.s.video.width,
+ "height", G_TYPE_INT, ogm->hdr.s.video.height,
+ "framerate", GST_TYPE_FRACTION, 10000000, time_unit, NULL);
+ break;
+ }
+ case 't':{
+ GST_LOG_OBJECT (ogm, "Type: %s, s/u: %" G_GINT64_FORMAT
+ ", timeunit=%" G_GINT64_FORMAT,
+ ogm->hdr.streamtype, ogm->hdr.samples_per_unit, ogm->hdr.time_unit);
+ caps = gst_caps_new_simple ("text/plain", NULL);
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ }
+
+ if (caps == NULL)
+ goto cannot_decode;
+
+ if (ogm->srcpad) {
+ GstCaps *current_caps = gst_pad_get_current_caps (ogm->srcpad);
+
+ if (current_caps) {
+ if (caps && !gst_caps_is_equal (current_caps, caps)) {
+ GST_WARNING_OBJECT (ogm, "Already an existing pad %s:%s",
+ GST_DEBUG_PAD_NAME (ogm->srcpad));
+ gst_pad_set_active (ogm->srcpad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT (ogm), ogm->srcpad);
+ ogm->srcpad = NULL;
+ } else {
+ GST_DEBUG_OBJECT (ogm, "Existing pad has the same caps, do nothing");
+ }
+ gst_caps_unref (current_caps);
+ }
+ }
+
+ if (ogm->srcpad == NULL) {
+ GList *l, *cached_events;
+
+ ogm->srcpad = gst_pad_new_from_template (ogm->srcpadtempl, "src");
+ gst_pad_use_fixed_caps (ogm->srcpad);
+ gst_pad_set_active (ogm->srcpad, TRUE);
+ gst_pad_set_caps (ogm->srcpad, caps);
+ gst_element_add_pad (GST_ELEMENT (ogm), ogm->srcpad);
+ GST_INFO_OBJECT (ogm, "Added pad %s:%s with caps %" GST_PTR_FORMAT,
+ GST_DEBUG_PAD_NAME (ogm->srcpad), caps);
+
+ GST_OBJECT_LOCK (ogm);
+ cached_events = ogm->cached_events;
+ ogm->cached_events = NULL;
+ GST_OBJECT_UNLOCK (ogm);
+
+ for (l = cached_events; l; l = l->next) {
+ GstEvent *event = GST_EVENT_CAST (l->data);
+
+ GST_DEBUG_OBJECT (ogm, "Pushing cached event %" GST_PTR_FORMAT, event);
+ gst_pad_push_event (ogm->srcpad, event);
+ }
+ g_list_free (cached_events);
+
+ {
+ GstTagList *tags;
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_SUBTITLE_CODEC,
+ "Ogm", NULL);
+ gst_element_found_tags_for_pad (GST_ELEMENT (ogm), ogm->srcpad, tags);
+ }
+ }
+
+ gst_caps_unref (caps);
+
+ return GST_FLOW_OK;
+
+/* ERRORS */
+buffer_too_small:
+ {
+ GST_ELEMENT_ERROR (ogm, STREAM, WRONG_TYPE, ("Buffer too small"), (NULL));
+ return GST_FLOW_ERROR;
+ }
+cannot_decode:
+ {
+ GST_ELEMENT_ERROR (ogm, STREAM, DECODE, (NULL), ("unknown ogm format"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_ogm_parse_comment_packet (GstOgmParse * ogm, GstBuffer * buf)
+{
+ GstFlowReturn ret;
+
+ if (ogm->srcpad == NULL) {
+ GST_DEBUG ("no source pad");
+ return GST_FLOW_WRONG_STATE;
+ }
+
+ /* if this is not a subtitle stream, push the vorbiscomment packet
+ * on downstream, the respective decoder will handle it; if it is
+ * a subtitle stream, we will have to handle the comment ourself */
+ if (ogm->hdr.streamtype[0] == 't') {
+ GstTagList *tags;
+
+ tags = gst_tag_list_from_vorbiscomment_buffer (buf,
+ (guint8 *) "\003vorbis", 7, NULL);
+
+ if (tags) {
+ GST_DEBUG_OBJECT (ogm, "tags = %" GST_PTR_FORMAT, tags);
+ gst_element_found_tags_for_pad (GST_ELEMENT (ogm), ogm->srcpad, tags);
+ } else {
+ GST_DEBUG_OBJECT (ogm, "failed to extract tags from vorbis comment");
+ }
+ /* do not push packet downstream, just let parent unref it */
+ ret = GST_FLOW_OK;
+ } else {
+ ret = gst_pad_push (ogm->srcpad, buf);
+ }
+
+ return ret;
+}
+
+static void
+gst_ogm_text_parse_strip_trailing_zeroes (GstOgmParse * ogm, GstBuffer * buf)
+{
+ guint8 *data;
+ gsize size;
+
+ g_assert (gst_buffer_is_writable (buf));
+
+ /* zeroes are not valid UTF-8 characters, so strip them from output */
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_WRITE);
+ while (size > 0 && data[size - 1] == '\0') {
+ --size;
+ }
+ gst_buffer_unmap (buf, data, size);
+}
+
+static GstFlowReturn
+gst_ogm_parse_data_packet (GstOgmParse * ogm, GstBuffer * buf,
+ const guint8 * data, gsize size)
+{
+ GstFlowReturn ret;
+ GstBuffer *sbuf;
+ gboolean keyframe;
+ guint len, n, xsize = 0;
+
+ if ((data[0] & 0x01) != 0)
+ goto invalid_startcode;
+
+ /* data - push on */
+ len = ((data[0] & 0xc0) >> 6) | ((data[0] & 0x02) << 1);
+ keyframe = (((data[0] & 0x08) >> 3) != 0);
+
+ if ((1 + len) > size)
+ goto buffer_too_small;
+
+ for (n = len; n > 0; n--) {
+ xsize = (xsize << 8) | data[n];
+ }
+
+ GST_LOG_OBJECT (ogm, "[0x%02x] samples: %d, hdrbytes: %d, datasize: %"
+ G_GSIZE_FORMAT, data[0], xsize, len, size - len - 1);
+
+ sbuf =
+ gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, len + 1,
+ size - len - 1);
+
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buf))
+ ogm->next_granulepos = GST_BUFFER_OFFSET_END (buf);
+
+ switch (ogm->hdr.streamtype[0]) {
+ case 't':
+ case 'v':{
+ GstClockTime ts, next_ts;
+ guint samples;
+
+ samples = (ogm->hdr.streamtype[0] == 'v') ? 1 : xsize;
+
+ if (!keyframe) {
+ GST_BUFFER_FLAG_SET (sbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+ }
+
+ /* shouldn't this be granulepos - samples? (tpm) */
+ ts = gst_util_uint64_scale (ogm->next_granulepos,
+ ogm->hdr.time_unit * GST_SECOND, 10000000);
+ next_ts = gst_util_uint64_scale (ogm->next_granulepos + samples,
+ ogm->hdr.time_unit * GST_SECOND, 10000000);
+
+ GST_BUFFER_TIMESTAMP (sbuf) = ts;
+ GST_BUFFER_DURATION (sbuf) = next_ts - ts;
+
+ ogm->next_granulepos += samples;
+
+ if (ogm->hdr.streamtype[0] == 't') {
+ gst_ogm_text_parse_strip_trailing_zeroes (ogm, sbuf);
+ }
+ break;
+ }
+ case 'a':{
+ GstClockTime ts, next_ts;
+
+ /* shouldn't this be granulepos - samples? (tpm) */
+ ts = gst_util_uint64_scale_int (ogm->next_granulepos,
+ GST_SECOND, ogm->hdr.samples_per_unit);
+ next_ts = gst_util_uint64_scale_int (ogm->next_granulepos + xsize,
+ GST_SECOND, ogm->hdr.samples_per_unit);
+
+ GST_BUFFER_TIMESTAMP (sbuf) = ts;
+ GST_BUFFER_DURATION (sbuf) = next_ts - ts;
+
+ ogm->next_granulepos += xsize;
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ if (ogm->srcpad) {
+ GST_LOG_OBJECT (ogm, "Pushing buffer with ts=%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sbuf)));
+ ret = gst_pad_push (ogm->srcpad, sbuf);
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (ogm, "Flow on %s:%s = %s",
+ GST_DEBUG_PAD_NAME (ogm->srcpad), gst_flow_get_name (ret));
+ }
+ } else {
+ ret = GST_FLOW_WRONG_STATE;
+ }
+
+ return ret;
+
+/* ERRORS */
+invalid_startcode:
+ {
+ GST_ELEMENT_ERROR (ogm, STREAM, DECODE, (NULL),
+ ("unexpected packet startcode 0x%02x", data[0]));
+ return GST_FLOW_ERROR;
+ }
+buffer_too_small:
+ {
+ GST_ELEMENT_ERROR (ogm, STREAM, DECODE, (NULL),
+ ("buffer too small, len+1=%u, size=%" G_GSIZE_FORMAT, len + 1, size));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_ogm_parse_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstOgmParse *ogm = GST_OGM_PARSE (GST_PAD_PARENT (pad));
+ guint8 *data;
+ gsize size;
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ if (size < 1)
+ goto buffer_too_small;
+
+ GST_LOG_OBJECT (ogm, "Packet with start code 0x%02x", data[0]);
+
+ switch (data[0]) {
+ case 0x01:{
+ ret = gst_ogm_parse_stream_header (ogm, data + 1, size - 1);
+ break;
+ }
+ case 0x03:{
+ ret = gst_ogm_parse_comment_packet (ogm, buf);
+ break;
+ }
+ default:{
+ ret = gst_ogm_parse_data_packet (ogm, buf, data, size);
+ break;
+ }
+ }
+
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (ogm, "Flow: %s", gst_flow_get_name (ret));
+ }
+
+ return ret;
+
+/* ERRORS */
+buffer_too_small:
+ {
+ GST_ELEMENT_ERROR (ogm, STREAM, DECODE, (NULL), ("buffer too small"));
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+gst_ogm_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad));
+ gboolean res;
+
+ GST_LOG_OBJECT (ogm, "processing %s event", GST_EVENT_TYPE_NAME (event));
+
+ GST_OBJECT_LOCK (ogm);
+ if (ogm->srcpad == NULL) {
+ ogm->cached_events = g_list_append (ogm->cached_events, event);
+ GST_OBJECT_UNLOCK (ogm);
+ res = TRUE;
+ } else {
+ GST_OBJECT_UNLOCK (ogm);
+ res = gst_pad_event_default (pad, event);
+ }
+
+ gst_object_unref (ogm);
+ return res;
+}
+
+static GstStateChangeReturn
+gst_ogm_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstOgmParse *ogm = GST_OGM_PARSE (element);
+
+ 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 (ogm->srcpad) {
+ gst_pad_set_active (ogm->srcpad, FALSE);
+ gst_element_remove_pad (element, ogm->srcpad);
+ ogm->srcpad = NULL;
+ }
+ memset (&ogm->hdr, 0, sizeof (ogm->hdr));
+ ogm->next_granulepos = 0;
+ g_list_foreach (ogm->cached_events, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (ogm->cached_events);
+ ogm->cached_events = NULL;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+gboolean
+gst_ogm_parse_plugin_init (GstPlugin * plugin)
+{
+ gst_riff_init ();
+
+ GST_DEBUG_CATEGORY_INIT (gst_ogm_parse_debug, "ogmparse", 0, "ogm parser");
+
+ return gst_element_register (plugin, "ogmaudioparse", GST_RANK_PRIMARY,
+ GST_TYPE_OGM_AUDIO_PARSE) &&
+ gst_element_register (plugin, "ogmvideoparse", GST_RANK_PRIMARY,
+ GST_TYPE_OGM_VIDEO_PARSE) &&
+ gst_element_register (plugin, "ogmtextparse", GST_RANK_PRIMARY,
+ GST_TYPE_OGM_TEXT_PARSE);
+}
diff --git a/ext/ogg/vorbis_parse.c b/ext/ogg/vorbis_parse.c
new file mode 100644
index 0000000..844f18b
--- /dev/null
+++ b/ext/ogg/vorbis_parse.c
@@ -0,0 +1,240 @@
+/*
+ This file borrowed from liboggz
+ */
+/*
+ Copyright (C) 2003 Commonwealth Scientific and Industrial Research
+ Organisation (CSIRO) Australia
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of CSIRO Australia nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 ORGANISATION OR
+ CONTRIBUTORS 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.
+*/
+
+/*
+ * oggz_auto.c
+ *
+ * Conrad Parker <conrad@annodex.net>
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gstoggstream.h"
+#include "vorbis_parse.h"
+
+/*
+ * Vorbis packets can be short or long, and each packet overlaps the previous
+ * and next packets. The granulepos of a packet is always the last sample
+ * that is completely decoded at the end of decoding that packet - i.e. the
+ * last packet before the first overlapping packet. If the sizes of packets
+ * are 's' and 'l', then the increment will depend on the previous and next
+ * packet types:
+ * v prev<<1 | next
+ * lll: l/2 3
+ * lls: 3l/4 - s/4 2
+ * lsl: s/2
+ * lss: s/2
+ * sll: l/4 + s/4 1
+ * sls: l/2 0
+ * ssl: s/2
+ * sss: s/2
+ *
+ * The previous and next packet types can be inferred from the current packet
+ * (additional information is not required)
+ *
+ * The two blocksizes can be determined from the first header packet, by reading
+ * byte 28. 1 << (packet[28] >> 4) == long_size.
+ * 1 << (packet[28] & 0xF) == short_size.
+ *
+ * (see http://xiph.org/vorbis/doc/Vorbis_I_spec.html for specification)
+ */
+
+
+void
+parse_vorbis_header_packet (GstOggStream * pad, ogg_packet * packet)
+{
+ /*
+ * on the first (b_o_s) packet, determine the long and short sizes,
+ * and then calculate l/2, l/4 - s/4, 3 * l/4 - s/4, l/2 - s/2 and s/2
+ */
+ int short_size;
+ int long_size;
+
+ long_size = 1 << (packet->packet[28] >> 4);
+ short_size = 1 << (packet->packet[28] & 0xF);
+
+ pad->nln_increments[3] = long_size >> 1;
+ pad->nln_increments[2] = 3 * (long_size >> 2) - (short_size >> 2);
+ pad->nln_increments[1] = (long_size >> 2) + (short_size >> 2);
+ pad->nln_increments[0] = pad->nln_increments[3];
+ pad->short_size = short_size;
+ pad->long_size = long_size;
+ pad->nsn_increment = short_size >> 1;
+}
+
+void
+parse_vorbis_setup_packet (GstOggStream * pad, ogg_packet * op)
+{
+ /*
+ * the code pages, a whole bunch of other fairly useless stuff, AND,
+ * RIGHT AT THE END (of a bunch of variable-length compressed rubbish that
+ * basically has only one actual set of values that everyone uses BUT YOU
+ * CAN'T BE SURE OF THAT, OH NO YOU CAN'T) is the only piece of data that's
+ * actually useful to us - the packet modes (because it's inconceivable to
+ * think people might want _just that_ and nothing else, you know, for
+ * seeking and stuff).
+ *
+ * Fortunately, because of the mandate that non-used bits must be zero
+ * at the end of the packet, we might be able to sneakily work backwards
+ * and find out the information we need (namely a mapping of modes to
+ * packet sizes)
+ */
+ unsigned char *current_pos = &op->packet[op->bytes - 1];
+ int offset;
+ int size;
+ int size_check;
+ int *mode_size_ptr;
+ int i;
+ int ii;
+
+ /*
+ * This is the format of the mode data at the end of the packet for all
+ * Vorbis Version 1 :
+ *
+ * [ 6:number_of_modes ]
+ * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
+ * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
+ * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
+ * [ 1:framing(1) ]
+ *
+ * e.g.:
+ *
+ * <-
+ * 0 0 0 0 0 1 0 0
+ * 0 0 1 0 0 0 0 0
+ * 0 0 1 0 0 0 0 0
+ * 0 0 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 0|0 0 0 0
+ * 0 0 0 0 0 0 0 0
+ * 0 0 0 0|0 0 0 0
+ * 0 0 0|1|0 0 0 0 |
+ * 0 0 0 0 0 0 0 0 V
+ * 0 0 0|0 0 0 0 0
+ * 0 0 0 0 0 0 0 0
+ * 0 0 1|0 0 0 0 0
+ * 0 0|1|0 0 0 0 0
+ *
+ *
+ * i.e. each entry is an important bit, 32 bits of 0, 8 bits of blah, a
+ * bit of 1.
+ * Let's find our last 1 bit first.
+ *
+ */
+
+ size = 0;
+
+ offset = 8;
+ while (!((1 << --offset) & *current_pos)) {
+ if (offset == 0) {
+ offset = 8;
+ current_pos -= 1;
+ }
+ }
+
+ while (1) {
+
+ /*
+ * from current_pos-5:(offset+1) to current_pos-1:(offset+1) should
+ * be zero
+ */
+ offset = (offset + 7) % 8;
+ if (offset == 7)
+ current_pos -= 1;
+
+ if (((current_pos[-5] & ~((1 << (offset + 1)) - 1)) != 0)
+ ||
+ current_pos[-4] != 0
+ ||
+ current_pos[-3] != 0
+ ||
+ current_pos[-2] != 0
+ || ((current_pos[-1] & ((1 << (offset + 1)) - 1)) != 0)
+ ) {
+ break;
+ }
+
+ size += 1;
+
+ current_pos -= 5;
+
+ }
+
+ /* Give ourselves a chance to recover if we went back too far by using
+ * the size check. */
+ for (ii = 0; ii < 2; ii++) {
+ if (offset > 4) {
+ size_check = (current_pos[0] >> (offset - 5)) & 0x3F;
+ } else {
+ /* mask part of byte from current_pos */
+ size_check = (current_pos[0] & ((1 << (offset + 1)) - 1));
+ /* shift to appropriate position */
+ size_check <<= (5 - offset);
+ /* or in part of byte from current_pos - 1 */
+ size_check |= (current_pos[-1] & ~((1 << (offset + 3)) - 1)) >>
+ (offset + 3);
+ }
+
+ size_check += 1;
+ if (size_check == size) {
+ break;
+ }
+ offset = (offset + 1) % 8;
+ if (offset == 0)
+ current_pos += 1;
+ current_pos += 5;
+ size -= 1;
+ }
+
+ /* Store mode size information in our info struct */
+ i = -1;
+ while ((1 << (++i)) < size);
+ pad->vorbis_log2_num_modes = i;
+
+ mode_size_ptr = pad->vorbis_mode_sizes;
+
+ for (i = 0; i < size; i++) {
+ offset = (offset + 1) % 8;
+ if (offset == 0)
+ current_pos += 1;
+ *mode_size_ptr++ = (current_pos[0] >> offset) & 0x1;
+ current_pos += 5;
+ }
+
+}
diff --git a/ext/ogg/vorbis_parse.h b/ext/ogg/vorbis_parse.h
new file mode 100644
index 0000000..9a8781b
--- /dev/null
+++ b/ext/ogg/vorbis_parse.h
@@ -0,0 +1,30 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstoggdemux.c: ogg 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_VORBIS_PARSE_H__
+#define __GST_VORBIS_PARSE_H__
+
+#include <gst/gst.h>
+
+void parse_vorbis_header_packet (GstOggStream * pad, ogg_packet * packet);
+void parse_vorbis_setup_packet (GstOggStream * pad, ogg_packet * op);
+
+#endif /* __GST_VORBIS_PARSE_H__ */
diff --git a/ext/pango/Makefile.am b/ext/pango/Makefile.am
new file mode 100644
index 0000000..86c8612
--- /dev/null
+++ b/ext/pango/Makefile.am
@@ -0,0 +1,31 @@
+plugin_LTLIBRARIES = libgstpango.la
+
+noinst_HEADERS = \
+ gstbasetextoverlay.h \
+ gstclockoverlay.h \
+ gsttextoverlay.h \
+ gsttextrender.h \
+ gsttimeoverlay.h
+
+libgstpango_la_SOURCES = \
+ gstbasetextoverlay.c \
+ gstclockoverlay.c \
+ gsttextoverlay.c \
+ gsttextrender.c \
+ gsttimeoverlay.c
+
+libgstpango_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CONTROLLER_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(PANGO_CFLAGS)
+libgstpango_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_LIBS) \
+ $(PANGO_LIBS)
+libgstpango_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstpango_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/ext/pango/Makefile.in b/ext/pango/Makefile.in
new file mode 100644
index 0000000..dc936d2
--- /dev/null
+++ b/ext/pango/Makefile.in
@@ -0,0 +1,820 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/pango
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstpango_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstpango_la_OBJECTS = libgstpango_la-gstbasetextoverlay.lo \
+ libgstpango_la-gstclockoverlay.lo \
+ libgstpango_la-gsttextoverlay.lo \
+ libgstpango_la-gsttextrender.lo \
+ libgstpango_la-gsttimeoverlay.lo
+libgstpango_la_OBJECTS = $(am_libgstpango_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstpango_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstpango_la_CFLAGS) $(CFLAGS) \
+ $(libgstpango_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstpango_la_SOURCES)
+DIST_SOURCES = $(libgstpango_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstpango.la
+noinst_HEADERS = \
+ gstbasetextoverlay.h \
+ gstclockoverlay.h \
+ gsttextoverlay.h \
+ gsttextrender.h \
+ gsttimeoverlay.h
+
+libgstpango_la_SOURCES = \
+ gstbasetextoverlay.c \
+ gstclockoverlay.c \
+ gsttextoverlay.c \
+ gsttextrender.c \
+ gsttimeoverlay.c
+
+libgstpango_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CONTROLLER_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(PANGO_CFLAGS)
+
+libgstpango_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_LIBS) \
+ $(PANGO_LIBS)
+
+libgstpango_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstpango_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 ext/pango/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/pango/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
+libgstpango.la: $(libgstpango_la_OBJECTS) $(libgstpango_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstpango_la_LINK) -rpath $(plugindir) $(libgstpango_la_OBJECTS) $(libgstpango_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpango_la-gstbasetextoverlay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpango_la-gstclockoverlay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpango_la-gsttextoverlay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpango_la-gsttextrender.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpango_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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstpango_la-gstbasetextoverlay.lo: gstbasetextoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -MT libgstpango_la-gstbasetextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstpango_la-gstbasetextoverlay.Tpo -c -o libgstpango_la-gstbasetextoverlay.lo `test -f 'gstbasetextoverlay.c' || echo '$(srcdir)/'`gstbasetextoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpango_la-gstbasetextoverlay.Tpo $(DEPDIR)/libgstpango_la-gstbasetextoverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasetextoverlay.c' object='libgstpango_la-gstbasetextoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -c -o libgstpango_la-gstbasetextoverlay.lo `test -f 'gstbasetextoverlay.c' || echo '$(srcdir)/'`gstbasetextoverlay.c
+
+libgstpango_la-gstclockoverlay.lo: gstclockoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -MT libgstpango_la-gstclockoverlay.lo -MD -MP -MF $(DEPDIR)/libgstpango_la-gstclockoverlay.Tpo -c -o libgstpango_la-gstclockoverlay.lo `test -f 'gstclockoverlay.c' || echo '$(srcdir)/'`gstclockoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpango_la-gstclockoverlay.Tpo $(DEPDIR)/libgstpango_la-gstclockoverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstclockoverlay.c' object='libgstpango_la-gstclockoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -c -o libgstpango_la-gstclockoverlay.lo `test -f 'gstclockoverlay.c' || echo '$(srcdir)/'`gstclockoverlay.c
+
+libgstpango_la-gsttextoverlay.lo: gsttextoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -MT libgstpango_la-gsttextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstpango_la-gsttextoverlay.Tpo -c -o libgstpango_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpango_la-gsttextoverlay.Tpo $(DEPDIR)/libgstpango_la-gsttextoverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttextoverlay.c' object='libgstpango_la-gsttextoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -c -o libgstpango_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c
+
+libgstpango_la-gsttextrender.lo: gsttextrender.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -MT libgstpango_la-gsttextrender.lo -MD -MP -MF $(DEPDIR)/libgstpango_la-gsttextrender.Tpo -c -o libgstpango_la-gsttextrender.lo `test -f 'gsttextrender.c' || echo '$(srcdir)/'`gsttextrender.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpango_la-gsttextrender.Tpo $(DEPDIR)/libgstpango_la-gsttextrender.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttextrender.c' object='libgstpango_la-gsttextrender.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -c -o libgstpango_la-gsttextrender.lo `test -f 'gsttextrender.c' || echo '$(srcdir)/'`gsttextrender.c
+
+libgstpango_la-gsttimeoverlay.lo: gsttimeoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -MT libgstpango_la-gsttimeoverlay.lo -MD -MP -MF $(DEPDIR)/libgstpango_la-gsttimeoverlay.Tpo -c -o libgstpango_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpango_la-gsttimeoverlay.Tpo $(DEPDIR)/libgstpango_la-gsttimeoverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttimeoverlay.c' object='libgstpango_la-gsttimeoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpango_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpango_la_CFLAGS) $(CFLAGS) -c -o libgstpango_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/pango/gstbasetextoverlay.c b/ext/pango/gstbasetextoverlay.c
new file mode 100644
index 0000000..936da8d
--- /dev/null
+++ b/ext/pango/gstbasetextoverlay.c
@@ -0,0 +1,2799 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2003> David Schleef <ds@schleef.org>
+ * Copyright (C) <2006> Julien Moutte <julien@moutte.net>
+ * Copyright (C) <2006> Zeeshan Ali <zeeshan.ali@nokia.com>
+ * Copyright (C) <2006-2008> Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) <2009> Young-Ho Cha <ganadist@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.
+ */
+
+/**
+ * SECTION:element-textoverlay
+ * @see_also: #GstTextRender, #GstClockOverlay, #GstTimeOverlay, #GstSubParse
+ *
+ * This plugin renders text on top of a video stream. This can be either
+ * static text or text from buffers received on the text sink pad, e.g.
+ * as produced by the subparse element. If the text sink pad is not linked,
+ * the text set via the "text" property will be rendered. If the text sink
+ * pad is linked, text will be rendered as it is received on that pad,
+ * honouring and matching the buffer timestamps of both input streams.
+ *
+ * The text can contain newline characters and text wrapping is enabled by
+ * default.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v videotestsrc ! textoverlay text="Room A" valign=top halign=left ! xvimagesink
+ * ]| Here is a simple pipeline that displays a static text in the top left
+ * corner of the video picture
+ * |[
+ * gst-launch -v filesrc location=subtitles.srt ! subparse ! txt. videotestsrc ! timeoverlay ! textoverlay name=txt shaded-background=yes ! xvimagesink
+ * ]| Here is another pipeline that displays subtitles from an .srt subtitle
+ * file, centered at the bottom of the picture and with a rectangular shading
+ * around the text in the background:
+ * <para>
+ * If you do not have such a subtitle file, create one looking like this
+ * in a text editor:
+ * |[
+ * 1
+ * 00:00:03,000 --> 00:00:05,000
+ * Hello? (3-5s)
+ *
+ * 2
+ * 00:00:08,000 --> 00:00:13,000
+ * Yes, this is a subtitle. Don&apos;t
+ * you like it? (8-13s)
+ *
+ * 3
+ * 00:00:18,826 --> 00:01:02,886
+ * Uh? What are you talking about?
+ * I don&apos;t understand (18-62s)
+ * ]|
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME: alloc segment as part of instance struct */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gst/video/video.h>
+
+#include "gstbasetextoverlay.h"
+#include "gsttextoverlay.h"
+#include "gsttimeoverlay.h"
+#include "gstclockoverlay.h"
+#include "gsttextrender.h"
+#include <string.h>
+
+/* FIXME:
+ * - use proper strides and offset for I420
+ * - if text is wider than the video picture, it does not get
+ * clipped properly during blitting (if wrapping is disabled)
+ * - make 'shading_value' a property (or enum: light/normal/dark/verydark)?
+ */
+
+GST_DEBUG_CATEGORY (pango_debug);
+#define GST_CAT_DEFAULT pango_debug
+
+#define DEFAULT_PROP_TEXT ""
+#define DEFAULT_PROP_SHADING FALSE
+#define DEFAULT_PROP_VALIGNMENT GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE
+#define DEFAULT_PROP_HALIGNMENT GST_BASE_TEXT_OVERLAY_HALIGN_CENTER
+#define DEFAULT_PROP_VALIGN "baseline"
+#define DEFAULT_PROP_HALIGN "center"
+#define DEFAULT_PROP_XPAD 25
+#define DEFAULT_PROP_YPAD 25
+#define DEFAULT_PROP_DELTAX 0
+#define DEFAULT_PROP_DELTAY 0
+#define DEFAULT_PROP_XPOS 0.5
+#define DEFAULT_PROP_YPOS 0.5
+#define DEFAULT_PROP_WRAP_MODE GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR
+#define DEFAULT_PROP_FONT_DESC ""
+#define DEFAULT_PROP_SILENT FALSE
+#define DEFAULT_PROP_LINE_ALIGNMENT GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER
+#define DEFAULT_PROP_WAIT_TEXT TRUE
+#define DEFAULT_PROP_AUTO_ADJUST_SIZE TRUE
+#define DEFAULT_PROP_VERTICAL_RENDER FALSE
+#define DEFAULT_PROP_COLOR 0xffffffff
+#define DEFAULT_PROP_OUTLINE_COLOR 0xff000000
+
+/* make a property of me */
+#define DEFAULT_SHADING_VALUE -80
+
+#define MINIMUM_OUTLINE_OFFSET 1.0
+#define DEFAULT_SCALE_BASIS 640
+
+#define COMP_Y(ret, r, g, b) \
+{ \
+ ret = (int) (((19595 * r) >> 16) + ((38470 * g) >> 16) + ((7471 * b) >> 16)); \
+ ret = CLAMP (ret, 0, 255); \
+}
+
+#define COMP_U(ret, r, g, b) \
+{ \
+ ret = (int) (-((11059 * r) >> 16) - ((21709 * g) >> 16) + ((32768 * b) >> 16) + 128); \
+ ret = CLAMP (ret, 0, 255); \
+}
+
+#define COMP_V(ret, r, g, b) \
+{ \
+ ret = (int) (((32768 * r) >> 16) - ((27439 * g) >> 16) - ((5329 * b) >> 16) + 128); \
+ ret = CLAMP (ret, 0, 255); \
+}
+
+#define BLEND(ret, alpha, v0, v1) \
+{ \
+ ret = (v0 * alpha + v1 * (255 - alpha)) / 255; \
+}
+
+#define OVER(ret, alphaA, Ca, alphaB, Cb, alphaNew) \
+{ \
+ gint _tmp; \
+ _tmp = (Ca * alphaA + Cb * alphaB * (255 - alphaA) / 255) / alphaNew; \
+ ret = CLAMP (_tmp, 0, 255); \
+}
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define CAIRO_ARGB_A 3
+# define CAIRO_ARGB_R 2
+# define CAIRO_ARGB_G 1
+# define CAIRO_ARGB_B 0
+#else
+# define CAIRO_ARGB_A 0
+# define CAIRO_ARGB_R 1
+# define CAIRO_ARGB_G 2
+# define CAIRO_ARGB_B 3
+#endif
+
+enum
+{
+ PROP_0,
+ PROP_TEXT,
+ PROP_SHADING,
+ PROP_VALIGN, /* deprecated */
+ PROP_HALIGN, /* deprecated */
+ PROP_HALIGNMENT,
+ PROP_VALIGNMENT,
+ PROP_XPAD,
+ PROP_YPAD,
+ PROP_DELTAX,
+ PROP_DELTAY,
+ PROP_XPOS,
+ PROP_YPOS,
+ PROP_WRAP_MODE,
+ PROP_FONT_DESC,
+ PROP_SILENT,
+ PROP_LINE_ALIGNMENT,
+ PROP_WAIT_TEXT,
+ PROP_AUTO_ADJUST_SIZE,
+ PROP_VERTICAL_RENDER,
+ PROP_COLOR,
+ PROP_SHADOW,
+ PROP_OUTLINE_COLOR,
+ PROP_LAST
+};
+
+#define VIDEO_FORMATS "{ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, AYUV, I420, UYVY, NV12, NV21 } "
+
+static GstStaticPadTemplate src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (VIDEO_FORMATS))
+ );
+
+static GstStaticPadTemplate video_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("video_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (VIDEO_FORMATS))
+ );
+
+#define GST_TYPE_BASE_TEXT_OVERLAY_VALIGN (gst_base_text_overlay_valign_get_type())
+static GType
+gst_base_text_overlay_valign_get_type (void)
+{
+ static GType base_text_overlay_valign_type = 0;
+ static const GEnumValue base_text_overlay_valign[] = {
+ {GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE, "baseline", "baseline"},
+ {GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM, "bottom", "bottom"},
+ {GST_BASE_TEXT_OVERLAY_VALIGN_TOP, "top", "top"},
+ {GST_BASE_TEXT_OVERLAY_VALIGN_POS, "position", "position"},
+ {GST_BASE_TEXT_OVERLAY_VALIGN_CENTER, "center", "center"},
+ {0, NULL, NULL},
+ };
+
+ if (!base_text_overlay_valign_type) {
+ base_text_overlay_valign_type =
+ g_enum_register_static ("GstBaseTextOverlayVAlign",
+ base_text_overlay_valign);
+ }
+ return base_text_overlay_valign_type;
+}
+
+#define GST_TYPE_BASE_TEXT_OVERLAY_HALIGN (gst_base_text_overlay_halign_get_type())
+static GType
+gst_base_text_overlay_halign_get_type (void)
+{
+ static GType base_text_overlay_halign_type = 0;
+ static const GEnumValue base_text_overlay_halign[] = {
+ {GST_BASE_TEXT_OVERLAY_HALIGN_LEFT, "left", "left"},
+ {GST_BASE_TEXT_OVERLAY_HALIGN_CENTER, "center", "center"},
+ {GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT, "right", "right"},
+ {GST_BASE_TEXT_OVERLAY_HALIGN_POS, "position", "position"},
+ {0, NULL, NULL},
+ };
+
+ if (!base_text_overlay_halign_type) {
+ base_text_overlay_halign_type =
+ g_enum_register_static ("GstBaseTextOverlayHAlign",
+ base_text_overlay_halign);
+ }
+ return base_text_overlay_halign_type;
+}
+
+
+#define GST_TYPE_BASE_TEXT_OVERLAY_WRAP_MODE (gst_base_text_overlay_wrap_mode_get_type())
+static GType
+gst_base_text_overlay_wrap_mode_get_type (void)
+{
+ static GType base_text_overlay_wrap_mode_type = 0;
+ static const GEnumValue base_text_overlay_wrap_mode[] = {
+ {GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE, "none", "none"},
+ {GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD, "word", "word"},
+ {GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR, "char", "char"},
+ {GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR, "wordchar", "wordchar"},
+ {0, NULL, NULL},
+ };
+
+ if (!base_text_overlay_wrap_mode_type) {
+ base_text_overlay_wrap_mode_type =
+ g_enum_register_static ("GstBaseTextOverlayWrapMode",
+ base_text_overlay_wrap_mode);
+ }
+ return base_text_overlay_wrap_mode_type;
+}
+
+#define GST_TYPE_BASE_TEXT_OVERLAY_LINE_ALIGN (gst_base_text_overlay_line_align_get_type())
+static GType
+gst_base_text_overlay_line_align_get_type (void)
+{
+ static GType base_text_overlay_line_align_type = 0;
+ static const GEnumValue base_text_overlay_line_align[] = {
+ {GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT, "left", "left"},
+ {GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER, "center", "center"},
+ {GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT, "right", "right"},
+ {0, NULL, NULL}
+ };
+
+ if (!base_text_overlay_line_align_type) {
+ base_text_overlay_line_align_type =
+ g_enum_register_static ("GstBaseTextOverlayLineAlign",
+ base_text_overlay_line_align);
+ }
+ return base_text_overlay_line_align_type;
+}
+
+#define GST_BASE_TEXT_OVERLAY_GET_COND(ov) (((GstBaseTextOverlay *)ov)->cond)
+#define GST_BASE_TEXT_OVERLAY_WAIT(ov) (g_cond_wait (GST_BASE_TEXT_OVERLAY_GET_COND (ov), GST_OBJECT_GET_LOCK (ov)))
+#define GST_BASE_TEXT_OVERLAY_SIGNAL(ov) (g_cond_signal (GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
+#define GST_BASE_TEXT_OVERLAY_BROADCAST(ov)(g_cond_broadcast (GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
+
+static GstElementClass *parent_class = NULL;
+static void gst_base_text_overlay_base_init (gpointer g_class);
+static void gst_base_text_overlay_class_init (GstBaseTextOverlayClass * klass);
+static void gst_base_text_overlay_init (GstBaseTextOverlay * overlay,
+ GstBaseTextOverlayClass * klass);
+
+static GstStateChangeReturn gst_base_text_overlay_change_state (GstElement *
+ element, GstStateChange transition);
+
+static GstCaps *gst_base_text_overlay_getcaps (GstPad * pad, GstCaps * filter);
+static gboolean gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay,
+ GstCaps * caps);
+static gboolean gst_base_text_overlay_setcaps_txt (GstBaseTextOverlay * overlay,
+ GstCaps * caps);
+static gboolean gst_base_text_overlay_src_event (GstPad * pad,
+ GstEvent * event);
+static gboolean gst_base_text_overlay_src_query (GstPad * pad,
+ GstQuery * query);
+
+static gboolean gst_base_text_overlay_video_event (GstPad * pad,
+ GstEvent * event);
+static GstFlowReturn gst_base_text_overlay_video_chain (GstPad * pad,
+ GstBuffer * buffer);
+
+static gboolean gst_base_text_overlay_text_event (GstPad * pad,
+ GstEvent * event);
+static GstFlowReturn gst_base_text_overlay_text_chain (GstPad * pad,
+ GstBuffer * buffer);
+static GstPadLinkReturn gst_base_text_overlay_text_pad_link (GstPad * pad,
+ GstPad * peer);
+static void gst_base_text_overlay_text_pad_unlink (GstPad * pad);
+static void gst_base_text_overlay_pop_text (GstBaseTextOverlay * overlay);
+static void gst_base_text_overlay_update_render_mode (GstBaseTextOverlay *
+ overlay);
+
+static void gst_base_text_overlay_finalize (GObject * object);
+static void gst_base_text_overlay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_text_overlay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void
+gst_base_text_overlay_adjust_values_with_fontdesc (GstBaseTextOverlay * overlay,
+ PangoFontDescription * desc);
+
+GType
+gst_base_text_overlay_get_type (void)
+{
+ static GType type = 0;
+
+ if (g_once_init_enter ((gsize *) & type)) {
+ static const GTypeInfo info = {
+ sizeof (GstBaseTextOverlayClass),
+ (GBaseInitFunc) gst_base_text_overlay_base_init,
+ NULL,
+ (GClassInitFunc) gst_base_text_overlay_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseTextOverlay),
+ 0,
+ (GInstanceInitFunc) gst_base_text_overlay_init,
+ };
+
+ g_once_init_leave ((gsize *) & type,
+ g_type_register_static (GST_TYPE_ELEMENT, "GstBaseTextOverlay", &info,
+ 0));
+ }
+
+ return type;
+}
+
+static gchar *
+gst_base_text_overlay_get_text (GstBaseTextOverlay * overlay,
+ GstBuffer * video_frame)
+{
+ return g_strdup (overlay->default_text);
+}
+
+static void
+gst_base_text_overlay_base_init (gpointer g_class)
+{
+ GstBaseTextOverlayClass *klass = GST_BASE_TEXT_OVERLAY_CLASS (g_class);
+ PangoFontMap *fontmap;
+
+ /* Only lock for the subclasses here, the base class
+ * doesn't have this mutex yet and it's not necessary
+ * here */
+ if (klass->pango_lock)
+ g_mutex_lock (klass->pango_lock);
+ fontmap = pango_cairo_font_map_get_default ();
+ klass->pango_context =
+ pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
+ if (klass->pango_lock)
+ g_mutex_unlock (klass->pango_lock);
+}
+
+static void
+gst_base_text_overlay_class_init (GstBaseTextOverlayClass * 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_base_text_overlay_finalize;
+ gobject_class->set_property = gst_base_text_overlay_set_property;
+ gobject_class->get_property = gst_base_text_overlay_get_property;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&video_sink_template_factory));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_change_state);
+
+ klass->pango_lock = g_mutex_new ();
+
+ klass->get_text = gst_base_text_overlay_get_text;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TEXT,
+ g_param_spec_string ("text", "text",
+ "Text to be display.", DEFAULT_PROP_TEXT,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SHADING,
+ g_param_spec_boolean ("shaded-background", "shaded background",
+ "Whether to shade the background under the text area",
+ DEFAULT_PROP_SHADING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGNMENT,
+ g_param_spec_enum ("valignment", "vertical alignment",
+ "Vertical alignment of the text", GST_TYPE_BASE_TEXT_OVERLAY_VALIGN,
+ DEFAULT_PROP_VALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGNMENT,
+ g_param_spec_enum ("halignment", "horizontal alignment",
+ "Horizontal alignment of the text", GST_TYPE_BASE_TEXT_OVERLAY_HALIGN,
+ DEFAULT_PROP_HALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGN,
+ g_param_spec_string ("valign", "vertical alignment",
+ "Vertical alignment of the text (deprecated; use valignment)",
+ DEFAULT_PROP_VALIGN, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGN,
+ g_param_spec_string ("halign", "horizontal alignment",
+ "Horizontal alignment of the text (deprecated; use halignment)",
+ DEFAULT_PROP_HALIGN, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_XPAD,
+ g_param_spec_int ("xpad", "horizontal paddding",
+ "Horizontal paddding when using left/right alignment", 0, G_MAXINT,
+ DEFAULT_PROP_XPAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_YPAD,
+ g_param_spec_int ("ypad", "vertical padding",
+ "Vertical padding when using top/bottom alignment", 0, G_MAXINT,
+ DEFAULT_PROP_YPAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_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, DEFAULT_PROP_DELTAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELTAY,
+ g_param_spec_int ("deltay", "Y position modifier",
+ "Shift Y position up or down. Unit is pixels.", G_MININT, G_MAXINT,
+ DEFAULT_PROP_DELTAY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseTextOverlay:xpos
+ *
+ * Horizontal position of the rendered text when using positioned alignment.
+ *
+ * Since: 0.10.31
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_XPOS,
+ g_param_spec_double ("xpos", "horizontal position",
+ "Horizontal position when using position alignment", 0, 1.0,
+ DEFAULT_PROP_XPOS,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseTextOverlay:ypos
+ *
+ * Vertical position of the rendered text when using positioned alignment.
+ *
+ * Since: 0.10.31
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_YPOS,
+ g_param_spec_double ("ypos", "vertical position",
+ "Vertical position when using position alignment", 0, 1.0,
+ DEFAULT_PROP_YPOS,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_WRAP_MODE,
+ g_param_spec_enum ("wrap-mode", "wrap mode",
+ "Whether to wrap the text and if so how.",
+ GST_TYPE_BASE_TEXT_OVERLAY_WRAP_MODE, DEFAULT_PROP_WRAP_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_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.", DEFAULT_PROP_FONT_DESC,
+ G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseTextOverlay:color
+ *
+ * Color of the rendered text.
+ *
+ * Since: 0.10.31
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_COLOR,
+ g_param_spec_uint ("color", "Color",
+ "Color to use for text (big-endian ARGB).", 0, G_MAXUINT32,
+ DEFAULT_PROP_COLOR,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstTextOverlay:outline-color
+ *
+ * Color of the outline of the rendered text.
+ *
+ * Since: 0.10.35
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_OUTLINE_COLOR,
+ g_param_spec_uint ("outline-color", "Text Outline Color",
+ "Color to use for outline the text (big-endian ARGB).", 0,
+ G_MAXUINT32, DEFAULT_PROP_OUTLINE_COLOR,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseTextOverlay:line-alignment
+ *
+ * Alignment of text lines relative to each other (for multi-line text)
+ *
+ * Since: 0.10.15
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LINE_ALIGNMENT,
+ g_param_spec_enum ("line-alignment", "line alignment",
+ "Alignment of text lines relative to each other.",
+ GST_TYPE_BASE_TEXT_OVERLAY_LINE_ALIGN, DEFAULT_PROP_LINE_ALIGNMENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseTextOverlay:silent
+ *
+ * If set, no text is rendered. Useful to switch off text rendering
+ * temporarily without removing the textoverlay element from the pipeline.
+ *
+ * Since: 0.10.15
+ **/
+ /* FIXME 0.11: rename to "visible" or "text-visible" or "render-text" */
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SILENT,
+ g_param_spec_boolean ("silent", "silent",
+ "Whether to render the text string",
+ DEFAULT_PROP_SILENT,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseTextOverlay:wait-text
+ *
+ * If set, the video will block until a subtitle is received on the text pad.
+ * If video and subtitles are sent in sync, like from the same demuxer, this
+ * property should be set.
+ *
+ * Since: 0.10.20
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_WAIT_TEXT,
+ g_param_spec_boolean ("wait-text", "Wait Text",
+ "Whether to wait for subtitles",
+ DEFAULT_PROP_WAIT_TEXT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass),
+ PROP_AUTO_ADJUST_SIZE, g_param_spec_boolean ("auto-resize", "auto resize",
+ "Automatically adjust font size to screen-size.",
+ DEFAULT_PROP_AUTO_ADJUST_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VERTICAL_RENDER,
+ g_param_spec_boolean ("vertical-render", "vertical render",
+ "Vertical Render.", DEFAULT_PROP_VERTICAL_RENDER,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_base_text_overlay_finalize (GObject * object)
+{
+ GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
+
+ g_free (overlay->default_text);
+
+ if (overlay->text_image) {
+ g_free (overlay->text_image);
+ overlay->text_image = NULL;
+ }
+
+ if (overlay->layout) {
+ g_object_unref (overlay->layout);
+ overlay->layout = NULL;
+ }
+
+ if (overlay->text_buffer) {
+ gst_buffer_unref (overlay->text_buffer);
+ overlay->text_buffer = NULL;
+ }
+
+ if (overlay->cond) {
+ g_cond_free (overlay->cond);
+ overlay->cond = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_base_text_overlay_init (GstBaseTextOverlay * overlay,
+ GstBaseTextOverlayClass * klass)
+{
+ GstPadTemplate *template;
+ PangoFontDescription *desc;
+
+ /* video sink */
+ template = gst_static_pad_template_get (&video_sink_template_factory);
+ overlay->video_sinkpad = gst_pad_new_from_template (template, "video_sink");
+ gst_object_unref (template);
+ gst_pad_set_getcaps_function (overlay->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_getcaps));
+ gst_pad_set_event_function (overlay->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_video_event));
+ gst_pad_set_chain_function (overlay->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_video_chain));
+ gst_element_add_pad (GST_ELEMENT (overlay), overlay->video_sinkpad);
+
+ template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass),
+ "text_sink");
+ if (template) {
+ /* text sink */
+ overlay->text_sinkpad = gst_pad_new_from_template (template, "text_sink");
+ gst_object_unref (template);
+
+ gst_pad_set_event_function (overlay->text_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_text_event));
+ gst_pad_set_chain_function (overlay->text_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_text_chain));
+ gst_pad_set_link_function (overlay->text_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_text_pad_link));
+ gst_pad_set_unlink_function (overlay->text_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_text_pad_unlink));
+ gst_element_add_pad (GST_ELEMENT (overlay), overlay->text_sinkpad);
+ }
+
+ /* (video) source */
+ template = gst_static_pad_template_get (&src_template_factory);
+ overlay->srcpad = gst_pad_new_from_template (template, "src");
+ gst_object_unref (template);
+ gst_pad_set_getcaps_function (overlay->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_getcaps));
+ gst_pad_set_event_function (overlay->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_src_event));
+ gst_pad_set_query_function (overlay->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_text_overlay_src_query));
+ gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad);
+
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ overlay->line_align = DEFAULT_PROP_LINE_ALIGNMENT;
+ overlay->layout =
+ pango_layout_new (GST_BASE_TEXT_OVERLAY_GET_CLASS
+ (overlay)->pango_context);
+ desc =
+ pango_context_get_font_description (GST_BASE_TEXT_OVERLAY_GET_CLASS
+ (overlay)->pango_context);
+ gst_base_text_overlay_adjust_values_with_fontdesc (overlay, desc);
+
+ overlay->color = DEFAULT_PROP_COLOR;
+ overlay->outline_color = DEFAULT_PROP_OUTLINE_COLOR;
+ overlay->halign = DEFAULT_PROP_HALIGNMENT;
+ overlay->valign = DEFAULT_PROP_VALIGNMENT;
+ overlay->xpad = DEFAULT_PROP_XPAD;
+ overlay->ypad = DEFAULT_PROP_YPAD;
+ overlay->deltax = DEFAULT_PROP_DELTAX;
+ overlay->deltay = DEFAULT_PROP_DELTAY;
+ overlay->xpos = DEFAULT_PROP_XPOS;
+ overlay->ypos = DEFAULT_PROP_YPOS;
+
+ overlay->wrap_mode = DEFAULT_PROP_WRAP_MODE;
+
+ overlay->want_shading = DEFAULT_PROP_SHADING;
+ overlay->shading_value = DEFAULT_SHADING_VALUE;
+ overlay->silent = DEFAULT_PROP_SILENT;
+ overlay->wait_text = DEFAULT_PROP_WAIT_TEXT;
+ overlay->auto_adjust_size = DEFAULT_PROP_AUTO_ADJUST_SIZE;
+
+ overlay->default_text = g_strdup (DEFAULT_PROP_TEXT);
+ overlay->need_render = TRUE;
+ overlay->text_image = NULL;
+ overlay->use_vertical_render = DEFAULT_PROP_VERTICAL_RENDER;
+ gst_base_text_overlay_update_render_mode (overlay);
+
+ overlay->text_buffer = NULL;
+ overlay->text_linked = FALSE;
+ overlay->cond = g_cond_new ();
+ gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+}
+
+static void
+gst_base_text_overlay_update_wrap_mode (GstBaseTextOverlay * overlay)
+{
+ if (overlay->wrap_mode == GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE) {
+ GST_DEBUG_OBJECT (overlay, "Set wrap mode NONE");
+ pango_layout_set_width (overlay->layout, -1);
+ } else {
+ int width;
+
+ if (overlay->auto_adjust_size) {
+ width = DEFAULT_SCALE_BASIS * PANGO_SCALE;
+ if (overlay->use_vertical_render) {
+ width = width * (overlay->height - overlay->ypad * 2) / overlay->width;
+ }
+ } else {
+ width =
+ (overlay->use_vertical_render ? overlay->height : overlay->width) *
+ PANGO_SCALE;
+ }
+
+ GST_DEBUG_OBJECT (overlay, "Set layout width %d", overlay->width);
+ GST_DEBUG_OBJECT (overlay, "Set wrap mode %d", overlay->wrap_mode);
+ pango_layout_set_width (overlay->layout, width);
+ pango_layout_set_wrap (overlay->layout, (PangoWrapMode) overlay->wrap_mode);
+ }
+}
+
+static void
+gst_base_text_overlay_update_render_mode (GstBaseTextOverlay * overlay)
+{
+ PangoMatrix matrix = PANGO_MATRIX_INIT;
+ PangoContext *context = pango_layout_get_context (overlay->layout);
+
+ if (overlay->use_vertical_render) {
+ pango_matrix_rotate (&matrix, -90);
+ pango_context_set_base_gravity (context, PANGO_GRAVITY_AUTO);
+ pango_context_set_matrix (context, &matrix);
+ pango_layout_set_alignment (overlay->layout, PANGO_ALIGN_LEFT);
+ } else {
+ pango_context_set_base_gravity (context, PANGO_GRAVITY_SOUTH);
+ pango_context_set_matrix (context, &matrix);
+ pango_layout_set_alignment (overlay->layout, overlay->line_align);
+ }
+}
+
+static gboolean
+gst_base_text_overlay_setcaps_txt (GstBaseTextOverlay * overlay, GstCaps * caps)
+{
+ GstStructure *structure;
+
+ structure = gst_caps_get_structure (caps, 0);
+ overlay->have_pango_markup =
+ gst_structure_has_name (structure, "text/x-pango-markup");
+
+ return TRUE;
+}
+
+/* FIXME: upstream nego (e.g. when the video window is resized) */
+
+static gboolean
+gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay, GstCaps * caps)
+{
+ GstVideoInfo info;
+ gboolean ret = FALSE;
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ overlay->info = info;
+ overlay->format = GST_VIDEO_INFO_FORMAT (&info);
+ overlay->width = GST_VIDEO_INFO_WIDTH (&info);
+ overlay->height = GST_VIDEO_INFO_HEIGHT (&info);
+
+ ret = gst_pad_push_event (overlay->srcpad, gst_event_new_caps (caps));
+
+ if (ret) {
+ GST_OBJECT_LOCK (overlay);
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ gst_base_text_overlay_update_wrap_mode (overlay);
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ GST_OBJECT_UNLOCK (overlay);
+ }
+
+ return ret;
+
+ /* ERRORS */
+invalid_caps:
+ {
+ GST_DEBUG_OBJECT (overlay, "could not parse caps");
+ return FALSE;
+ }
+}
+
+static void
+gst_base_text_overlay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
+
+ GST_OBJECT_LOCK (overlay);
+ switch (prop_id) {
+ case PROP_TEXT:
+ g_free (overlay->default_text);
+ overlay->default_text = g_value_dup_string (value);
+ overlay->need_render = TRUE;
+ break;
+ case PROP_SHADING:
+ overlay->want_shading = g_value_get_boolean (value);
+ break;
+ case PROP_XPAD:
+ overlay->xpad = g_value_get_int (value);
+ break;
+ case PROP_YPAD:
+ overlay->ypad = g_value_get_int (value);
+ break;
+ case PROP_DELTAX:
+ overlay->deltax = g_value_get_int (value);
+ break;
+ case PROP_DELTAY:
+ overlay->deltay = g_value_get_int (value);
+ break;
+ case PROP_XPOS:
+ overlay->xpos = g_value_get_double (value);
+ break;
+ case PROP_YPOS:
+ overlay->ypos = g_value_get_double (value);
+ break;
+ case PROP_HALIGN:{
+ const gchar *s = g_value_get_string (value);
+
+ if (s && g_ascii_strcasecmp (s, "left") == 0)
+ overlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_LEFT;
+ else if (s && g_ascii_strcasecmp (s, "center") == 0)
+ overlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_CENTER;
+ else if (s && g_ascii_strcasecmp (s, "right") == 0)
+ overlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT;
+ else
+ g_warning ("Invalid value '%s' for textoverlay property 'halign'",
+ GST_STR_NULL (s));
+ break;
+ }
+ case PROP_VALIGN:{
+ const gchar *s = g_value_get_string (value);
+
+ if (s && g_ascii_strcasecmp (s, "baseline") == 0)
+ overlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE;
+ else if (s && g_ascii_strcasecmp (s, "bottom") == 0)
+ overlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM;
+ else if (s && g_ascii_strcasecmp (s, "top") == 0)
+ overlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_TOP;
+ else
+ g_warning ("Invalid value '%s' for textoverlay property 'valign'",
+ GST_STR_NULL (s));
+ break;
+ }
+ case PROP_VALIGNMENT:
+ overlay->valign = g_value_get_enum (value);
+ break;
+ case PROP_HALIGNMENT:
+ overlay->halign = g_value_get_enum (value);
+ break;
+ case PROP_WRAP_MODE:
+ overlay->wrap_mode = g_value_get_enum (value);
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ gst_base_text_overlay_update_wrap_mode (overlay);
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ break;
+ case PROP_FONT_DESC:
+ {
+ PangoFontDescription *desc;
+ const gchar *fontdesc_str;
+
+ fontdesc_str = g_value_get_string (value);
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ desc = pango_font_description_from_string (fontdesc_str);
+ if (desc) {
+ GST_LOG_OBJECT (overlay, "font description set: %s", fontdesc_str);
+ pango_layout_set_font_description (overlay->layout, desc);
+ gst_base_text_overlay_adjust_values_with_fontdesc (overlay, desc);
+ pango_font_description_free (desc);
+ } else {
+ GST_WARNING_OBJECT (overlay, "font description parse failed: %s",
+ fontdesc_str);
+ }
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ break;
+ }
+ case PROP_COLOR:
+ overlay->color = g_value_get_uint (value);
+ break;
+ case PROP_OUTLINE_COLOR:
+ overlay->outline_color = g_value_get_uint (value);
+ break;
+ case PROP_SILENT:
+ overlay->silent = g_value_get_boolean (value);
+ break;
+ case PROP_LINE_ALIGNMENT:
+ overlay->line_align = g_value_get_enum (value);
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ pango_layout_set_alignment (overlay->layout,
+ (PangoAlignment) overlay->line_align);
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ break;
+ case PROP_WAIT_TEXT:
+ overlay->wait_text = g_value_get_boolean (value);
+ break;
+ case PROP_AUTO_ADJUST_SIZE:
+ overlay->auto_adjust_size = g_value_get_boolean (value);
+ overlay->need_render = TRUE;
+ break;
+ case PROP_VERTICAL_RENDER:
+ overlay->use_vertical_render = g_value_get_boolean (value);
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ gst_base_text_overlay_update_render_mode (overlay);
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+ overlay->need_render = TRUE;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ overlay->need_render = TRUE;
+ GST_OBJECT_UNLOCK (overlay);
+}
+
+static void
+gst_base_text_overlay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
+
+ GST_OBJECT_LOCK (overlay);
+ switch (prop_id) {
+ case PROP_TEXT:
+ g_value_set_string (value, overlay->default_text);
+ break;
+ case PROP_SHADING:
+ g_value_set_boolean (value, overlay->want_shading);
+ break;
+ case PROP_XPAD:
+ g_value_set_int (value, overlay->xpad);
+ break;
+ case PROP_YPAD:
+ g_value_set_int (value, overlay->ypad);
+ break;
+ case PROP_DELTAX:
+ g_value_set_int (value, overlay->deltax);
+ break;
+ case PROP_DELTAY:
+ g_value_set_int (value, overlay->deltay);
+ break;
+ case PROP_XPOS:
+ g_value_set_double (value, overlay->xpos);
+ break;
+ case PROP_YPOS:
+ g_value_set_double (value, overlay->ypos);
+ break;
+ case PROP_VALIGNMENT:
+ g_value_set_enum (value, overlay->valign);
+ break;
+ case PROP_HALIGNMENT:
+ g_value_set_enum (value, overlay->halign);
+ break;
+ case PROP_WRAP_MODE:
+ g_value_set_enum (value, overlay->wrap_mode);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, overlay->silent);
+ break;
+ case PROP_LINE_ALIGNMENT:
+ g_value_set_enum (value, overlay->line_align);
+ break;
+ case PROP_WAIT_TEXT:
+ g_value_set_boolean (value, overlay->wait_text);
+ break;
+ case PROP_AUTO_ADJUST_SIZE:
+ g_value_set_boolean (value, overlay->auto_adjust_size);
+ break;
+ case PROP_VERTICAL_RENDER:
+ g_value_set_boolean (value, overlay->use_vertical_render);
+ break;
+ case PROP_COLOR:
+ g_value_set_uint (value, overlay->color);
+ break;
+ case PROP_OUTLINE_COLOR:
+ g_value_set_uint (value, overlay->outline_color);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ overlay->need_render = TRUE;
+ GST_OBJECT_UNLOCK (overlay);
+}
+
+static gboolean
+gst_base_text_overlay_src_query (GstPad * pad, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstBaseTextOverlay *overlay = NULL;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay))
+ return FALSE;
+
+ ret = gst_pad_peer_query (overlay->video_sinkpad, query);
+
+ gst_object_unref (overlay);
+
+ return ret;
+}
+
+static gboolean
+gst_base_text_overlay_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstBaseTextOverlay *overlay = NULL;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:{
+ GstSeekFlags flags;
+
+ /* We don't handle seek if we have not text pad */
+ if (!overlay->text_linked) {
+ GST_DEBUG_OBJECT (overlay, "seek received, pushing upstream");
+ ret = gst_pad_push_event (overlay->video_sinkpad, event);
+ goto beach;
+ }
+
+ GST_DEBUG_OBJECT (overlay, "seek received, driving from here");
+
+ gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL);
+
+ /* Flush downstream, only for flushing seek */
+ if (flags & GST_SEEK_FLAG_FLUSH)
+ gst_pad_push_event (overlay->srcpad, gst_event_new_flush_start ());
+
+ /* Mark ourself as flushing, unblock chains */
+ GST_OBJECT_LOCK (overlay);
+ overlay->video_flushing = TRUE;
+ overlay->text_flushing = TRUE;
+ gst_base_text_overlay_pop_text (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+
+ /* Seek on each sink pad */
+ gst_event_ref (event);
+ ret = gst_pad_push_event (overlay->video_sinkpad, event);
+ if (ret) {
+ ret = gst_pad_push_event (overlay->text_sinkpad, event);
+ } else {
+ gst_event_unref (event);
+ }
+ break;
+ }
+ default:
+ if (overlay->text_linked) {
+ gst_event_ref (event);
+ ret = gst_pad_push_event (overlay->video_sinkpad, event);
+ gst_pad_push_event (overlay->text_sinkpad, event);
+ } else {
+ ret = gst_pad_push_event (overlay->video_sinkpad, event);
+ }
+ break;
+ }
+
+beach:
+ gst_object_unref (overlay);
+
+ return ret;
+}
+
+static GstCaps *
+gst_base_text_overlay_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstBaseTextOverlay *overlay;
+ GstPad *otherpad;
+ GstCaps *caps;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay))
+ return gst_caps_copy (gst_pad_get_pad_template_caps (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, filter);
+ if (caps) {
+ GstCaps *temp, *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_full (caps, templ, GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp);
+ gst_caps_unref (caps);
+ gst_caps_unref (templ);
+ /* this is what we can do */
+ caps = temp;
+ } else {
+ /* no peer, our padtemplate is enough then */
+ caps = gst_pad_get_pad_template_caps (pad);
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+ }
+
+ GST_DEBUG_OBJECT (overlay, "returning %" GST_PTR_FORMAT, caps);
+
+ gst_object_unref (overlay);
+
+ return caps;
+}
+
+static void
+gst_base_text_overlay_adjust_values_with_fontdesc (GstBaseTextOverlay * overlay,
+ PangoFontDescription * desc)
+{
+ gint font_size = pango_font_description_get_size (desc) / PANGO_SCALE;
+ overlay->shadow_offset = (double) (font_size) / 13.0;
+ overlay->outline_offset = (double) (font_size) / 15.0;
+ if (overlay->outline_offset < MINIMUM_OUTLINE_OFFSET)
+ overlay->outline_offset = MINIMUM_OUTLINE_OFFSET;
+}
+
+#define CAIRO_UNPREMULTIPLY(a,r,g,b) G_STMT_START { \
+ b = (a > 0) ? MIN ((b * 255 + a / 2) / a, 255) : 0; \
+ g = (a > 0) ? MIN ((g * 255 + a / 2) / a, 255) : 0; \
+ r = (a > 0) ? MIN ((r * 255 + a / 2) / a, 255) : 0; \
+} G_STMT_END
+
+static inline void
+gst_base_text_overlay_blit_1 (GstBaseTextOverlay * overlay, guchar * dest,
+ gint xpos, gint ypos, guchar * text_image, guint dest_stride)
+{
+ gint i, j = 0;
+ gint x, y;
+ guchar r, g, b, a;
+ guchar *pimage;
+ guchar *py;
+ gint width = overlay->image_width;
+ gint height = overlay->image_height;
+
+ if (xpos < 0) {
+ xpos = 0;
+ }
+
+ if (xpos + width > overlay->width) {
+ width = overlay->width - xpos;
+ }
+
+ if (ypos + height > overlay->height) {
+ height = overlay->height - ypos;
+ }
+
+ dest += (ypos / 1) * dest_stride;
+
+ for (i = 0; i < height; i++) {
+ pimage = text_image + 4 * (i * overlay->image_width);
+ py = dest + i * dest_stride + xpos;
+ for (j = 0; j < width; j++) {
+ b = pimage[CAIRO_ARGB_B];
+ g = pimage[CAIRO_ARGB_G];
+ r = pimage[CAIRO_ARGB_R];
+ a = pimage[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a, r, g, b);
+
+ pimage += 4;
+ if (a == 0) {
+ py++;
+ continue;
+ }
+ COMP_Y (y, r, g, b);
+ x = *py;
+ BLEND (*py++, a, y, x);
+ }
+ }
+}
+
+static inline void
+gst_base_text_overlay_blit_sub2x2cbcr (GstBaseTextOverlay * overlay,
+ guchar * destcb, guchar * destcr, gint xpos, gint ypos, guchar * text_image,
+ guint destcb_stride, guint destcr_stride, guint pix_stride)
+{
+ gint i, j;
+ gint x, cb, cr;
+ gushort r, g, b, a;
+ gushort r1, g1, b1, a1;
+ guchar *pimage1, *pimage2;
+ guchar *pcb, *pcr;
+ gint width = overlay->image_width - 2;
+ gint height = overlay->image_height - 2;
+
+ xpos *= pix_stride;
+
+ if (xpos < 0) {
+ xpos = 0;
+ }
+
+ if (xpos + width > overlay->width) {
+ width = overlay->width - xpos;
+ }
+
+ if (ypos + height > overlay->height) {
+ height = overlay->height - ypos;
+ }
+
+ destcb += (ypos / 2) * destcb_stride;
+ destcr += (ypos / 2) * destcr_stride;
+
+ for (i = 0; i < height; i += 2) {
+ pimage1 = text_image + 4 * (i * overlay->image_width);
+ pimage2 = pimage1 + 4 * overlay->image_width;
+ pcb = destcb + (i / 2) * destcb_stride + xpos / 2;
+ pcr = destcr + (i / 2) * destcr_stride + xpos / 2;
+ for (j = 0; j < width; j += 2) {
+ b = pimage1[CAIRO_ARGB_B];
+ g = pimage1[CAIRO_ARGB_G];
+ r = pimage1[CAIRO_ARGB_R];
+ a = pimage1[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a, r, g, b);
+ pimage1 += 4;
+
+ b1 = pimage1[CAIRO_ARGB_B];
+ g1 = pimage1[CAIRO_ARGB_G];
+ r1 = pimage1[CAIRO_ARGB_R];
+ a1 = pimage1[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
+ b += b1;
+ g += g1;
+ r += r1;
+ a += a1;
+ pimage1 += 4;
+
+ b1 = pimage2[CAIRO_ARGB_B];
+ g1 = pimage2[CAIRO_ARGB_G];
+ r1 = pimage2[CAIRO_ARGB_R];
+ a1 = pimage2[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
+ b += b1;
+ g += g1;
+ r += r1;
+ a += a1;
+ pimage2 += 4;
+
+ /* + 2 for rounding */
+ b1 = pimage2[CAIRO_ARGB_B];
+ g1 = pimage2[CAIRO_ARGB_G];
+ r1 = pimage2[CAIRO_ARGB_R];
+ a1 = pimage2[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
+ b += b1 + 2;
+ g += g1 + 2;
+ r += r1 + 2;
+ a += a1 + 2;
+ pimage2 += 4;
+
+ b /= 4;
+ g /= 4;
+ r /= 4;
+ a /= 4;
+
+ if (a == 0) {
+ pcb += pix_stride;
+ pcr += pix_stride;
+ continue;
+ }
+ COMP_U (cb, r, g, b);
+ COMP_V (cr, r, g, b);
+
+ x = *pcb;
+ BLEND (*pcb, a, cb, x);
+ x = *pcr;
+ BLEND (*pcr, a, cr, x);
+
+ pcb += pix_stride;
+ pcr += pix_stride;
+ }
+ }
+}
+
+static void
+gst_base_text_overlay_render_pangocairo (GstBaseTextOverlay * overlay,
+ const gchar * string, gint textlen)
+{
+ cairo_t *cr;
+ cairo_surface_t *surface;
+ PangoRectangle ink_rect, logical_rect;
+ cairo_matrix_t cairo_matrix;
+ int width, height;
+ double scalef = 1.0;
+ double a, r, g, b;
+
+ g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+
+ if (overlay->auto_adjust_size) {
+ /* 640 pixel is default */
+ scalef = (double) (overlay->width) / DEFAULT_SCALE_BASIS;
+ }
+ pango_layout_set_width (overlay->layout, -1);
+ /* set text on pango layout */
+ pango_layout_set_markup (overlay->layout, string, textlen);
+
+ /* get subtitle image size */
+ pango_layout_get_pixel_extents (overlay->layout, &ink_rect, &logical_rect);
+
+ width = (logical_rect.width + overlay->shadow_offset) * scalef;
+
+ if (width + overlay->deltax >
+ (overlay->use_vertical_render ? overlay->height : overlay->width)) {
+ /*
+ * subtitle image width is larger then overlay width
+ * so rearrange overlay wrap mode.
+ */
+ gst_base_text_overlay_update_wrap_mode (overlay);
+ pango_layout_get_pixel_extents (overlay->layout, &ink_rect, &logical_rect);
+ width = overlay->width;
+ }
+
+ height =
+ (logical_rect.height + logical_rect.y + overlay->shadow_offset) * scalef;
+ if (height > overlay->height) {
+ height = overlay->height;
+ }
+ if (overlay->use_vertical_render) {
+ PangoRectangle rect;
+ PangoContext *context;
+ PangoMatrix matrix = PANGO_MATRIX_INIT;
+ int tmp;
+
+ context = pango_layout_get_context (overlay->layout);
+
+ pango_matrix_rotate (&matrix, -90);
+
+ rect.x = rect.y = 0;
+ rect.width = width;
+ rect.height = height;
+ pango_matrix_transform_pixel_rectangle (&matrix, &rect);
+ matrix.x0 = -rect.x;
+ matrix.y0 = -rect.y;
+
+ pango_context_set_matrix (context, &matrix);
+
+ cairo_matrix.xx = matrix.xx;
+ cairo_matrix.yx = matrix.yx;
+ cairo_matrix.xy = matrix.xy;
+ cairo_matrix.yy = matrix.yy;
+ cairo_matrix.x0 = matrix.x0;
+ cairo_matrix.y0 = matrix.y0;
+ cairo_matrix_scale (&cairo_matrix, scalef, scalef);
+
+ tmp = height;
+ height = width;
+ width = tmp;
+ } else {
+ cairo_matrix_init_scale (&cairo_matrix, scalef, scalef);
+ }
+
+ /* reallocate surface */
+ overlay->text_image = g_realloc (overlay->text_image, 4 * width * height);
+
+ surface = cairo_image_surface_create_for_data (overlay->text_image,
+ CAIRO_FORMAT_ARGB32, width, height, width * 4);
+ cr = cairo_create (surface);
+
+ /* clear surface */
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_paint (cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+
+ if (overlay->want_shading)
+ cairo_paint_with_alpha (cr, overlay->shading_value);
+
+ /* apply transformations */
+ cairo_set_matrix (cr, &cairo_matrix);
+
+ /* FIXME: We use show_layout everywhere except for the surface
+ * because it's really faster and internally does all kinds of
+ * caching. Unfortunately we have to paint to a cairo path for
+ * the outline and this is slow. Once Pango supports user fonts
+ * we should use them, see
+ * https://bugzilla.gnome.org/show_bug.cgi?id=598695
+ *
+ * Idea would the be, to create a cairo user font that
+ * does shadow, outline, text painting in the
+ * render_glyph function.
+ */
+
+ /* draw shadow text */
+ cairo_save (cr);
+ cairo_translate (cr, overlay->shadow_offset, overlay->shadow_offset);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
+ pango_cairo_show_layout (cr, overlay->layout);
+ cairo_restore (cr);
+
+ a = (overlay->outline_color >> 24) & 0xff;
+ r = (overlay->outline_color >> 16) & 0xff;
+ g = (overlay->outline_color >> 8) & 0xff;
+ b = (overlay->outline_color >> 0) & 0xff;
+
+ /* draw outline text */
+ cairo_save (cr);
+ cairo_set_source_rgba (cr, r / 255.0, g / 255.0, b / 255.0, a / 255.0);
+ cairo_set_line_width (cr, overlay->outline_offset);
+ pango_cairo_layout_path (cr, overlay->layout);
+ cairo_stroke (cr);
+ cairo_restore (cr);
+
+ a = (overlay->color >> 24) & 0xff;
+ r = (overlay->color >> 16) & 0xff;
+ g = (overlay->color >> 8) & 0xff;
+ b = (overlay->color >> 0) & 0xff;
+
+ /* draw text */
+ cairo_save (cr);
+ cairo_set_source_rgba (cr, r / 255.0, g / 255.0, b / 255.0, a / 255.0);
+ pango_cairo_show_layout (cr, overlay->layout);
+ cairo_restore (cr);
+
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface);
+ overlay->image_width = width;
+ overlay->image_height = height;
+ overlay->baseline_y = ink_rect.y;
+ g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
+}
+
+#define BOX_XPAD 6
+#define BOX_YPAD 6
+
+static inline void
+gst_base_text_overlay_shade_planar_Y (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint x0, gint x1, gint y0, gint y1)
+{
+ gint i, j, dest_stride;
+ guint8 *dest_ptr;
+
+ dest_stride = dest->info.stride[0];
+ dest_ptr = dest->data[0];
+
+ x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width);
+ x1 = CLAMP (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_ptr[(i * dest_stride) + j] + overlay->shading_value;
+
+ dest_ptr[(i * dest_stride) + j] = CLAMP (y, 0, 255);
+ }
+ }
+}
+
+static inline void
+gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint x0, gint x1, gint y0, gint y1)
+{
+ gint i, j;
+ guint dest_stride, pixel_stride;
+ guint8 *dest_ptr;
+
+ dest_stride = GST_VIDEO_FRAME_COMP_STRIDE (dest, 0);
+ dest_ptr = GST_VIDEO_FRAME_COMP_DATA (dest, 0);
+ pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (dest, 0);
+
+ x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width);
+ x1 = CLAMP (x1 + BOX_XPAD, 0, overlay->width);
+
+ y0 = CLAMP (y0 - BOX_YPAD, 0, overlay->height);
+ y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height);
+
+ if (x0 != 0)
+ x0 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x0);
+ if (x1 != 0)
+ x1 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x1);
+
+ if (y0 != 0)
+ y0 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y0);
+ if (y1 != 0)
+ y1 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y1);
+
+ for (i = y0; i < y1; i++) {
+ for (j = x0; j < x1; j++) {
+ gint y;
+ gint y_pos;
+
+ y_pos = (i * dest_stride) + j * pixel_stride;
+ y = dest_ptr[y_pos] + overlay->shading_value;
+
+ dest_ptr[y_pos] = CLAMP (y, 0, 255);
+ }
+ }
+}
+
+#define gst_base_text_overlay_shade_BGRx gst_base_text_overlay_shade_xRGB
+#define gst_base_text_overlay_shade_RGBx gst_base_text_overlay_shade_xRGB
+#define gst_base_text_overlay_shade_xBGR gst_base_text_overlay_shade_xRGB
+static inline void
+gst_base_text_overlay_shade_xRGB (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint x0, gint x1, gint y0, gint y1)
+{
+ gint i, j;
+ guint8 *dest_ptr;
+
+ dest_ptr = dest->data[0];
+
+ x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width);
+ x1 = CLAMP (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, y_pos, k;
+
+ y_pos = (i * 4 * overlay->width) + j * 4;
+ for (k = 0; k < 4; k++) {
+ y = dest_ptr[y_pos + k] + overlay->shading_value;
+ dest_ptr[y_pos + k] = CLAMP (y, 0, 255);
+ }
+ }
+ }
+}
+
+#define ARGB_SHADE_FUNCTION(name, OFFSET) \
+static inline void \
+gst_base_text_overlay_shade_##name (GstBaseTextOverlay * overlay, GstVideoFrame * dest, \
+gint x0, gint x1, gint y0, gint y1) \
+{ \
+ gint i, j;\
+ guint8 *dest_ptr;\
+ \
+ dest_ptr = dest->data[0];\
+ \
+ x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width);\
+ x1 = CLAMP (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, y_pos, k;\
+ y_pos = (i * 4 * overlay->width) + j * 4;\
+ for (k = OFFSET; k < 3+OFFSET; k++) {\
+ y = dest_ptr[y_pos + k] + overlay->shading_value;\
+ dest_ptr[y_pos + k] = CLAMP (y, 0, 255);\
+ }\
+ }\
+ }\
+}
+ARGB_SHADE_FUNCTION (ARGB, 1);
+ARGB_SHADE_FUNCTION (ABGR, 1);
+ARGB_SHADE_FUNCTION (RGBA, 0);
+ARGB_SHADE_FUNCTION (BGRA, 0);
+
+
+/* FIXME:
+ * - use proper strides and offset for I420
+ * - don't draw over the edge of the picture (try a longer
+ * text with a huge font size)
+ */
+
+static inline void
+gst_base_text_overlay_blit_NV12_NV21 (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint xpos, gint ypos)
+{
+ int y_stride, u_stride, v_stride;
+ guint8 *y_pixels, *u_pixels, *v_pixels;
+
+ /* because U/V is 2x2 subsampled, we need to round, either up or down,
+ * to a boundary of integer number of U/V pixels:
+ */
+ xpos = GST_ROUND_UP_2 (xpos);
+ ypos = GST_ROUND_UP_2 (ypos);
+
+ y_pixels = dest->data[0];
+ u_pixels = dest->data[1];
+ v_pixels = dest->data[2];
+ y_stride = dest->info.stride[0];
+ u_stride = dest->info.stride[1];
+ v_stride = dest->info.stride[2];
+
+ gst_base_text_overlay_blit_1 (overlay, y_pixels, xpos, ypos,
+ overlay->text_image, y_stride);
+ gst_base_text_overlay_blit_sub2x2cbcr (overlay, u_pixels,
+ v_pixels, xpos, ypos, overlay->text_image, u_stride, v_stride, 2);
+}
+
+static inline void
+gst_base_text_overlay_blit_I420 (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint xpos, gint ypos)
+{
+ int y_stride, u_stride, v_stride;
+ guint8 *y_pixels, *u_pixels, *v_pixels;
+
+ /* because U/V is 2x2 subsampled, we need to round, either up or down,
+ * to a boundary of integer number of U/V pixels:
+ */
+ xpos = GST_ROUND_UP_2 (xpos);
+ ypos = GST_ROUND_UP_2 (ypos);
+
+ y_pixels = dest->data[0];
+ u_pixels = dest->data[1];
+ v_pixels = dest->data[2];
+ y_stride = dest->info.stride[0];
+ u_stride = dest->info.stride[1];
+ v_stride = dest->info.stride[2];
+
+ gst_base_text_overlay_blit_1 (overlay, y_pixels, xpos, ypos,
+ overlay->text_image, y_stride);
+ gst_base_text_overlay_blit_sub2x2cbcr (overlay, u_pixels,
+ v_pixels, xpos, ypos, overlay->text_image, u_stride, v_stride, 1);
+}
+
+static inline void
+gst_base_text_overlay_blit_UYVY (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint xpos, gint ypos)
+{
+ int a0, r0, g0, b0;
+ int a1, r1, g1, b1;
+ int y0, y1, u, v;
+ int i, j;
+ int h, w;
+ guchar *pimage, *dest_ptr;
+ guint8 *yuv_pixels;
+
+ yuv_pixels = dest->data[0];
+
+ /* because U/V is 2x horizontally subsampled, we need to round to a
+ * boundary of integer number of U/V pixels in x dimension:
+ */
+ xpos = GST_ROUND_UP_2 (xpos);
+
+ w = overlay->image_width - 2;
+ h = overlay->image_height - 2;
+
+ if (xpos < 0) {
+ xpos = 0;
+ }
+
+ if (xpos + w > overlay->width) {
+ w = overlay->width - xpos;
+ }
+
+ if (ypos + h > overlay->height) {
+ h = overlay->height - ypos;
+ }
+
+ for (i = 0; i < h; i++) {
+ pimage = overlay->text_image + i * overlay->image_width * 4;
+ dest_ptr = yuv_pixels + (i + ypos) * overlay->width * 2 + xpos * 2;
+ for (j = 0; j < w; j += 2) {
+ b0 = pimage[CAIRO_ARGB_B];
+ g0 = pimage[CAIRO_ARGB_G];
+ r0 = pimage[CAIRO_ARGB_R];
+ a0 = pimage[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a0, r0, g0, b0);
+ pimage += 4;
+
+ b1 = pimage[CAIRO_ARGB_B];
+ g1 = pimage[CAIRO_ARGB_G];
+ r1 = pimage[CAIRO_ARGB_R];
+ a1 = pimage[CAIRO_ARGB_A];
+ CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
+ pimage += 4;
+
+ a0 += a1 + 2;
+ a0 /= 2;
+ if (a0 == 0) {
+ dest_ptr += 4;
+ continue;
+ }
+
+ COMP_Y (y0, r0, g0, b0);
+ COMP_Y (y1, r1, g1, b1);
+
+ b0 += b1 + 2;
+ g0 += g1 + 2;
+ r0 += r1 + 2;
+
+ b0 /= 2;
+ g0 /= 2;
+ r0 /= 2;
+
+ COMP_U (u, r0, g0, b0);
+ COMP_V (v, r0, g0, b0);
+
+ BLEND (*dest_ptr, a0, u, *dest_ptr);
+ dest_ptr++;
+ BLEND (*dest_ptr, a0, y0, *dest_ptr);
+ dest_ptr++;
+ BLEND (*dest_ptr, a0, v, *dest_ptr);
+ dest_ptr++;
+ BLEND (*dest_ptr, a0, y1, *dest_ptr);
+ dest_ptr++;
+ }
+ }
+}
+
+static inline void
+gst_base_text_overlay_blit_AYUV (GstBaseTextOverlay * overlay,
+ GstVideoFrame * dest, gint xpos, gint ypos)
+{
+ int a, r, g, b, a1;
+ int y, u, v;
+ int i, j;
+ int h, w;
+ guchar *pimage, *dest_ptr;
+ guint8 *rgb_pixels;
+
+ rgb_pixels = dest->data[0];
+
+ w = overlay->image_width;
+ h = overlay->image_height;
+
+ if (xpos < 0) {
+ xpos = 0;
+ }
+
+ if (xpos + w > overlay->width) {
+ w = overlay->width - xpos;
+ }
+
+ if (ypos + h > overlay->height) {
+ h = overlay->height - ypos;
+ }
+
+ for (i = 0; i < h; i++) {
+ pimage = overlay->text_image + i * overlay->image_width * 4;
+ dest_ptr = rgb_pixels + (i + ypos) * 4 * overlay->width + xpos * 4;
+ for (j = 0; j < w; j++) {
+ a = pimage[CAIRO_ARGB_A];
+ b = pimage[CAIRO_ARGB_B];
+ g = pimage[CAIRO_ARGB_G];
+ r = pimage[CAIRO_ARGB_R];
+
+ CAIRO_UNPREMULTIPLY (a, r, g, b);
+
+ // convert background to yuv
+ COMP_Y (y, r, g, b);
+ COMP_U (u, r, g, b);
+ COMP_V (v, r, g, b);
+
+ // preform text "OVER" background alpha compositing
+ a1 = a + (dest_ptr[0] * (255 - a)) / 255 + 1; // add 1 to prevent divide by 0
+ OVER (dest_ptr[1], a, y, dest_ptr[0], dest_ptr[1], a1);
+ OVER (dest_ptr[2], a, u, dest_ptr[0], dest_ptr[2], a1);
+ OVER (dest_ptr[3], a, v, dest_ptr[0], dest_ptr[3], a1);
+ dest_ptr[0] = a1 - 1; // remove the temporary 1 we added
+
+ pimage += 4;
+ dest_ptr += 4;
+ }
+ }
+}
+
+#define xRGB_BLIT_FUNCTION(name, R, G, B) \
+static inline void \
+gst_base_text_overlay_blit_##name (GstBaseTextOverlay * overlay, \
+ GstVideoFrame * dest, gint xpos, gint ypos) \
+{ \
+ int a, r, g, b; \
+ int i, j; \
+ int h, w; \
+ guchar *pimage, *dest_ptr; \
+ guint8 *rgb_pixels;\
+ \
+ rgb_pixels = dest->data[0];\
+ \
+ w = overlay->image_width; \
+ h = overlay->image_height; \
+ \
+ if (xpos < 0) { \
+ xpos = 0; \
+ } \
+ \
+ if (xpos + w > overlay->width) { \
+ w = overlay->width - xpos; \
+ } \
+ \
+ if (ypos + h > overlay->height) { \
+ h = overlay->height - ypos; \
+ } \
+ \
+ for (i = 0; i < h; i++) { \
+ pimage = overlay->text_image + i * overlay->image_width * 4; \
+ dest_ptr = rgb_pixels + (i + ypos) * 4 * overlay->width + xpos * 4; \
+ for (j = 0; j < w; j++) { \
+ a = pimage[CAIRO_ARGB_A]; \
+ b = pimage[CAIRO_ARGB_B]; \
+ g = pimage[CAIRO_ARGB_G]; \
+ r = pimage[CAIRO_ARGB_R]; \
+ CAIRO_UNPREMULTIPLY (a, r, g, b); \
+ b = (b*a + dest_ptr[B] * (255-a)) / 255; \
+ g = (g*a + dest_ptr[G] * (255-a)) / 255; \
+ r = (r*a + dest_ptr[R] * (255-a)) / 255; \
+ \
+ dest_ptr[B] = b; \
+ dest_ptr[G] = g; \
+ dest_ptr[R] = r; \
+ pimage += 4; \
+ dest_ptr += 4; \
+ } \
+ } \
+}
+xRGB_BLIT_FUNCTION (xRGB, 1, 2, 3);
+xRGB_BLIT_FUNCTION (BGRx, 2, 1, 0);
+xRGB_BLIT_FUNCTION (xBGR, 3, 2, 1);
+xRGB_BLIT_FUNCTION (RGBx, 0, 1, 2);
+
+#define ARGB_BLIT_FUNCTION(name, A, R, G, B) \
+static inline void \
+gst_base_text_overlay_blit_##name (GstBaseTextOverlay * overlay, \
+ GstVideoFrame * dest, gint xpos, gint ypos) \
+{ \
+ int a, r, g, b, a1; \
+ int i, j; \
+ int h, w; \
+ guchar *pimage, *dest_ptr; \
+ guint8 *rgb_pixels;\
+ \
+ rgb_pixels = dest->data[0];\
+ \
+ w = overlay->image_width; \
+ h = overlay->image_height; \
+ \
+ if (xpos < 0) { \
+ xpos = 0; \
+ } \
+ \
+ if (xpos + w > overlay->width) { \
+ w = overlay->width - xpos; \
+ } \
+ \
+ if (ypos + h > overlay->height) { \
+ h = overlay->height - ypos; \
+ } \
+ \
+ for (i = 0; i < h; i++) { \
+ pimage = overlay->text_image + i * overlay->image_width * 4; \
+ dest_ptr = rgb_pixels + (i + ypos) * 4 * overlay->width + xpos * 4; \
+ for (j = 0; j < w; j++) { \
+ a = pimage[CAIRO_ARGB_A]; \
+ b = pimage[CAIRO_ARGB_B]; \
+ g = pimage[CAIRO_ARGB_G]; \
+ r = pimage[CAIRO_ARGB_R]; \
+ CAIRO_UNPREMULTIPLY (a, r, g, b); \
+ a1 = a + (dest_ptr[A] * (255 - a)) / 255 + 1; \
+ OVER (dest_ptr[R], a, r, dest_ptr[0], dest_ptr[R], a1); \
+ OVER (dest_ptr[G], a, g, dest_ptr[0], dest_ptr[G], a1); \
+ OVER (dest_ptr[B], a, b, dest_ptr[0], dest_ptr[B], a1); \
+ dest_ptr[A] = a1 - 1; \
+ pimage += 4; \
+ dest_ptr += 4; \
+ } \
+ } \
+}
+ARGB_BLIT_FUNCTION (RGBA, 3, 0, 1, 2);
+ARGB_BLIT_FUNCTION (BGRA, 3, 2, 1, 0);
+ARGB_BLIT_FUNCTION (ARGB, 0, 1, 2, 3);
+ARGB_BLIT_FUNCTION (ABGR, 0, 3, 2, 1);
+
+static void
+gst_base_text_overlay_render_text (GstBaseTextOverlay * overlay,
+ const gchar * text, gint textlen)
+{
+ gchar *string;
+
+ if (!overlay->need_render) {
+ GST_DEBUG ("Using previously rendered text.");
+ return;
+ }
+
+ /* -1 is the whole string */
+ if (text != NULL && textlen < 0) {
+ textlen = strlen (text);
+ }
+
+ if (text != NULL) {
+ string = g_strndup (text, textlen);
+ } else { /* empty string */
+ string = g_strdup (" ");
+ }
+ g_strdelimit (string, "\r\t", ' ');
+ textlen = strlen (string);
+
+ /* FIXME: should we check for UTF-8 here? */
+
+ GST_DEBUG ("Rendering '%s'", string);
+ gst_base_text_overlay_render_pangocairo (overlay, string, textlen);
+
+ g_free (string);
+
+ overlay->need_render = FALSE;
+}
+
+static GstFlowReturn
+gst_base_text_overlay_push_frame (GstBaseTextOverlay * overlay,
+ GstBuffer * video_frame)
+{
+ gint xpos, ypos;
+ gint width, height;
+ GstBaseTextOverlayVAlign valign;
+ GstBaseTextOverlayHAlign halign;
+ GstVideoFrame frame;
+
+ width = overlay->image_width;
+ height = overlay->image_height;
+
+ video_frame = gst_buffer_make_writable (video_frame);
+
+ if (!gst_video_frame_map (&frame, &overlay->info, video_frame, GST_MAP_WRITE))
+ goto invalid_frame;
+
+ if (overlay->use_vertical_render)
+ halign = GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT;
+ else
+ halign = overlay->halign;
+
+ switch (halign) {
+ case GST_BASE_TEXT_OVERLAY_HALIGN_LEFT:
+ xpos = overlay->xpad;
+ break;
+ case GST_BASE_TEXT_OVERLAY_HALIGN_CENTER:
+ xpos = (overlay->width - width) / 2;
+ break;
+ case GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT:
+ xpos = overlay->width - width - overlay->xpad;
+ break;
+ case GST_BASE_TEXT_OVERLAY_HALIGN_POS:
+ xpos = (gint) (overlay->width * overlay->xpos) - width / 2;
+ xpos = CLAMP (xpos, 0, overlay->width - width);
+ if (xpos < 0)
+ xpos = 0;
+ break;
+ default:
+ xpos = 0;
+ }
+ xpos += overlay->deltax;
+
+ if (overlay->use_vertical_render)
+ valign = GST_BASE_TEXT_OVERLAY_VALIGN_TOP;
+ else
+ valign = overlay->valign;
+
+ switch (valign) {
+ case GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM:
+ ypos = overlay->height - height - overlay->ypad;
+ break;
+ case GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE:
+ ypos = overlay->height - (height + overlay->ypad);
+ break;
+ case GST_BASE_TEXT_OVERLAY_VALIGN_TOP:
+ ypos = overlay->ypad;
+ break;
+ case GST_BASE_TEXT_OVERLAY_VALIGN_POS:
+ ypos = (gint) (overlay->height * overlay->ypos) - height / 2;
+ ypos = CLAMP (ypos, 0, overlay->height - height);
+ break;
+ case GST_BASE_TEXT_OVERLAY_VALIGN_CENTER:
+ ypos = (overlay->height - height) / 2;
+ break;
+ default:
+ ypos = overlay->ypad;
+ break;
+ }
+ ypos += overlay->deltay;
+
+ /* shaded background box */
+ if (overlay->want_shading) {
+ switch (overlay->format) {
+ case GST_VIDEO_FORMAT_I420:
+ case GST_VIDEO_FORMAT_NV12:
+ case GST_VIDEO_FORMAT_NV21:
+ gst_base_text_overlay_shade_planar_Y (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_UYVY:
+ gst_base_text_overlay_shade_packed_Y (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_xRGB:
+ gst_base_text_overlay_shade_xRGB (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_xBGR:
+ gst_base_text_overlay_shade_xBGR (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_BGRx:
+ gst_base_text_overlay_shade_BGRx (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_RGBx:
+ gst_base_text_overlay_shade_RGBx (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_ARGB:
+ gst_base_text_overlay_shade_ARGB (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_ABGR:
+ gst_base_text_overlay_shade_ABGR (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_RGBA:
+ gst_base_text_overlay_shade_RGBA (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ case GST_VIDEO_FORMAT_BGRA:
+ gst_base_text_overlay_shade_BGRA (overlay, &frame,
+ xpos, xpos + overlay->image_width,
+ ypos, ypos + overlay->image_height);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+
+ if (ypos < 0)
+ ypos = 0;
+
+ if (overlay->text_image) {
+ switch (overlay->format) {
+ case GST_VIDEO_FORMAT_I420:
+ gst_base_text_overlay_blit_I420 (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_NV12:
+ case GST_VIDEO_FORMAT_NV21:
+ gst_base_text_overlay_blit_NV12_NV21 (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_UYVY:
+ gst_base_text_overlay_blit_UYVY (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_AYUV:
+ gst_base_text_overlay_blit_AYUV (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_BGRx:
+ gst_base_text_overlay_blit_BGRx (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_xRGB:
+ gst_base_text_overlay_blit_xRGB (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_RGBx:
+ gst_base_text_overlay_blit_RGBx (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_xBGR:
+ gst_base_text_overlay_blit_xBGR (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_ARGB:
+ gst_base_text_overlay_blit_ARGB (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_ABGR:
+ gst_base_text_overlay_blit_ABGR (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_RGBA:
+ gst_base_text_overlay_blit_RGBA (overlay, &frame, xpos, ypos);
+ break;
+ case GST_VIDEO_FORMAT_BGRA:
+ gst_base_text_overlay_blit_BGRA (overlay, &frame, xpos, ypos);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+ gst_video_frame_unmap (&frame);
+
+ return gst_pad_push (overlay->srcpad, video_frame);
+
+ /* ERRORS */
+invalid_frame:
+ {
+ GST_DEBUG_OBJECT (overlay, "received invalid buffer");
+ return GST_FLOW_OK;
+ }
+}
+
+static GstPadLinkReturn
+gst_base_text_overlay_text_pad_link (GstPad * pad, GstPad * peer)
+{
+ GstBaseTextOverlay *overlay;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay))
+ return GST_PAD_LINK_REFUSED;
+
+ GST_DEBUG_OBJECT (overlay, "Text pad linked");
+
+ overlay->text_linked = TRUE;
+
+ gst_object_unref (overlay);
+
+ return GST_PAD_LINK_OK;
+}
+
+static void
+gst_base_text_overlay_text_pad_unlink (GstPad * pad)
+{
+ GstBaseTextOverlay *overlay;
+
+ /* don't use gst_pad_get_parent() here, will deadlock */
+ overlay = GST_BASE_TEXT_OVERLAY (GST_PAD_PARENT (pad));
+
+ GST_DEBUG_OBJECT (overlay, "Text pad unlinked");
+
+ overlay->text_linked = FALSE;
+
+ gst_segment_init (&overlay->text_segment, GST_FORMAT_UNDEFINED);
+}
+
+static gboolean
+gst_base_text_overlay_text_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstBaseTextOverlay *overlay = NULL;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ GST_LOG_OBJECT (pad, "received event %s", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_base_text_overlay_setcaps_txt (overlay, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ overlay->text_eos = FALSE;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format == GST_FORMAT_TIME) {
+ GST_OBJECT_LOCK (overlay);
+ gst_segment_copy_into (segment, &overlay->text_segment);
+ GST_DEBUG_OBJECT (overlay, "TEXT SEGMENT now: %" GST_SEGMENT_FORMAT,
+ &overlay->text_segment);
+ GST_OBJECT_UNLOCK (overlay);
+ } else {
+ GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
+ ("received non-TIME newsegment event on text input"));
+ }
+
+ gst_event_unref (event);
+ ret = TRUE;
+
+ /* wake up the video chain, it might be waiting for a text buffer or
+ * a text segment update */
+ GST_OBJECT_LOCK (overlay);
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ GST_OBJECT_LOCK (overlay);
+ GST_INFO_OBJECT (overlay, "text flush stop");
+ overlay->text_flushing = FALSE;
+ overlay->text_eos = FALSE;
+ gst_base_text_overlay_pop_text (overlay);
+ gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
+ GST_OBJECT_UNLOCK (overlay);
+ gst_event_unref (event);
+ ret = TRUE;
+ break;
+ case GST_EVENT_FLUSH_START:
+ GST_OBJECT_LOCK (overlay);
+ GST_INFO_OBJECT (overlay, "text flush start");
+ overlay->text_flushing = TRUE;
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ gst_event_unref (event);
+ ret = TRUE;
+ break;
+ case GST_EVENT_EOS:
+ GST_OBJECT_LOCK (overlay);
+ overlay->text_eos = TRUE;
+ GST_INFO_OBJECT (overlay, "text EOS");
+ /* wake up the video chain, it might be waiting for a text buffer or
+ * a text segment update */
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ gst_event_unref (event);
+ ret = TRUE;
+ break;
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (overlay);
+
+ return ret;
+}
+
+static gboolean
+gst_base_text_overlay_video_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstBaseTextOverlay *overlay = NULL;
+
+ overlay = GST_BASE_TEXT_OVERLAY (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (!overlay)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (pad, "received event %s", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_base_text_overlay_setcaps (overlay, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ GST_DEBUG_OBJECT (overlay, "received new segment");
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format == GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (overlay, "VIDEO SEGMENT now: %" GST_SEGMENT_FORMAT,
+ &overlay->segment);
+
+ gst_segment_copy_into (segment, &overlay->segment);
+ } else {
+ GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
+ ("received non-TIME newsegment event on video input"));
+ }
+
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+ case GST_EVENT_EOS:
+ GST_OBJECT_LOCK (overlay);
+ GST_INFO_OBJECT (overlay, "video EOS");
+ overlay->video_eos = TRUE;
+ GST_OBJECT_UNLOCK (overlay);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_FLUSH_START:
+ GST_OBJECT_LOCK (overlay);
+ GST_INFO_OBJECT (overlay, "video flush start");
+ overlay->video_flushing = TRUE;
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_OBJECT_LOCK (overlay);
+ GST_INFO_OBJECT (overlay, "video flush stop");
+ overlay->video_flushing = FALSE;
+ overlay->video_eos = FALSE;
+ gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
+ GST_OBJECT_UNLOCK (overlay);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (overlay);
+
+ return ret;
+}
+
+/* Called with lock held */
+static void
+gst_base_text_overlay_pop_text (GstBaseTextOverlay * overlay)
+{
+ g_return_if_fail (GST_IS_BASE_TEXT_OVERLAY (overlay));
+
+ if (overlay->text_buffer) {
+ GST_DEBUG_OBJECT (overlay, "releasing text buffer %p",
+ overlay->text_buffer);
+ gst_buffer_unref (overlay->text_buffer);
+ overlay->text_buffer = NULL;
+ }
+
+ /* Let the text task know we used that buffer */
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+}
+
+/* We receive text buffers here. If they are out of segment we just ignore them.
+ If the buffer is in our segment we keep it internally except if another one
+ is already waiting here, in that case we wait that it gets kicked out */
+static GstFlowReturn
+gst_base_text_overlay_text_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBaseTextOverlay *overlay = NULL;
+ gboolean in_seg = FALSE;
+ guint64 clip_start = 0, clip_stop = 0;
+
+ overlay = GST_BASE_TEXT_OVERLAY (GST_PAD_PARENT (pad));
+
+ GST_OBJECT_LOCK (overlay);
+
+ if (overlay->text_flushing) {
+ GST_OBJECT_UNLOCK (overlay);
+ ret = GST_FLOW_WRONG_STATE;
+ GST_LOG_OBJECT (overlay, "text flushing");
+ goto beach;
+ }
+
+ if (overlay->text_eos) {
+ GST_OBJECT_UNLOCK (overlay);
+ ret = GST_FLOW_UNEXPECTED;
+ GST_LOG_OBJECT (overlay, "text EOS");
+ goto beach;
+ }
+
+ GST_LOG_OBJECT (overlay, "%" GST_SEGMENT_FORMAT " BUFFER: ts=%"
+ GST_TIME_FORMAT ", end=%" GST_TIME_FORMAT, &overlay->segment,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer) +
+ GST_BUFFER_DURATION (buffer)));
+
+ if (G_LIKELY (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))) {
+ GstClockTime stop;
+
+ if (G_LIKELY (GST_BUFFER_DURATION_IS_VALID (buffer)))
+ stop = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer);
+ else
+ stop = GST_CLOCK_TIME_NONE;
+
+ in_seg = gst_segment_clip (&overlay->text_segment, GST_FORMAT_TIME,
+ GST_BUFFER_TIMESTAMP (buffer), stop, &clip_start, &clip_stop);
+ } else {
+ in_seg = TRUE;
+ }
+
+ if (in_seg) {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ GST_BUFFER_TIMESTAMP (buffer) = clip_start;
+ else if (GST_BUFFER_DURATION_IS_VALID (buffer))
+ GST_BUFFER_DURATION (buffer) = clip_stop - clip_start;
+
+ /* Wait for the previous buffer to go away */
+ while (overlay->text_buffer != NULL) {
+ GST_DEBUG ("Pad %s:%s has a buffer queued, waiting",
+ GST_DEBUG_PAD_NAME (pad));
+ GST_BASE_TEXT_OVERLAY_WAIT (overlay);
+ GST_DEBUG ("Pad %s:%s resuming", GST_DEBUG_PAD_NAME (pad));
+ if (overlay->text_flushing) {
+ GST_OBJECT_UNLOCK (overlay);
+ ret = GST_FLOW_WRONG_STATE;
+ goto beach;
+ }
+ }
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ overlay->text_segment.position = clip_start;
+
+ overlay->text_buffer = buffer;
+ /* That's a new text buffer we need to render */
+ overlay->need_render = TRUE;
+
+ /* in case the video chain is waiting for a text buffer, wake it up */
+ GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
+ }
+
+ GST_OBJECT_UNLOCK (overlay);
+
+beach:
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_base_text_overlay_video_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstBaseTextOverlayClass *klass;
+ GstBaseTextOverlay *overlay;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean in_seg = FALSE;
+ guint64 start, stop, clip_start = 0, clip_stop = 0;
+ gchar *text = NULL;
+
+ overlay = GST_BASE_TEXT_OVERLAY (GST_PAD_PARENT (pad));
+ klass = GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay);
+
+ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ goto missing_timestamp;
+
+ /* ignore buffers that are outside of the current segment */
+ start = GST_BUFFER_TIMESTAMP (buffer);
+
+ if (!GST_BUFFER_DURATION_IS_VALID (buffer)) {
+ stop = GST_CLOCK_TIME_NONE;
+ } else {
+ stop = start + GST_BUFFER_DURATION (buffer);
+ }
+
+ GST_LOG_OBJECT (overlay, "%" GST_SEGMENT_FORMAT " BUFFER: ts=%"
+ GST_TIME_FORMAT ", end=%" GST_TIME_FORMAT, &overlay->segment,
+ GST_TIME_ARGS (start), GST_TIME_ARGS (stop));
+
+ /* segment_clip() will adjust start unconditionally to segment_start if
+ * no stop time is provided, so handle this ourselves */
+ if (stop == GST_CLOCK_TIME_NONE && start < overlay->segment.start)
+ goto out_of_segment;
+
+ in_seg = gst_segment_clip (&overlay->segment, GST_FORMAT_TIME, start, stop,
+ &clip_start, &clip_stop);
+
+ if (!in_seg)
+ goto out_of_segment;
+
+ /* if the buffer is only partially in the segment, fix up stamps */
+ if (clip_start != start || (stop != -1 && clip_stop != stop)) {
+ GST_DEBUG_OBJECT (overlay, "clipping buffer timestamp/duration to segment");
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_TIMESTAMP (buffer) = clip_start;
+ if (stop != -1)
+ GST_BUFFER_DURATION (buffer) = clip_stop - clip_start;
+ }
+
+ /* now, after we've done the clipping, fix up end time if there's no
+ * duration (we only use those estimated values internally though, we
+ * don't want to set bogus values on the buffer itself) */
+ if (stop == -1) {
+ GstCaps *caps;
+ GstStructure *s;
+ gint fps_num, fps_denom;
+
+ /* FIXME, store this in setcaps */
+ caps = gst_pad_get_current_caps (pad);
+ s = gst_caps_get_structure (caps, 0);
+ if (gst_structure_get_fraction (s, "framerate", &fps_num, &fps_denom) &&
+ fps_num && fps_denom) {
+ GST_DEBUG_OBJECT (overlay, "estimating duration based on framerate");
+ stop = start + gst_util_uint64_scale_int (GST_SECOND, fps_denom, fps_num);
+ } else {
+ GST_WARNING_OBJECT (overlay, "no duration, assuming minimal duration");
+ stop = start + 1; /* we need to assume some interval */
+ }
+ gst_caps_unref (caps);
+ }
+
+ gst_object_sync_values (G_OBJECT (overlay), GST_BUFFER_TIMESTAMP (buffer));
+
+wait_for_text_buf:
+
+ GST_OBJECT_LOCK (overlay);
+
+ if (overlay->video_flushing)
+ goto flushing;
+
+ if (overlay->video_eos)
+ goto have_eos;
+
+ if (overlay->silent) {
+ GST_OBJECT_UNLOCK (overlay);
+ ret = gst_pad_push (overlay->srcpad, buffer);
+
+ /* Update position */
+ overlay->segment.position = clip_start;
+
+ return ret;
+ }
+
+ /* Text pad not linked, rendering internal text */
+ if (!overlay->text_linked) {
+ if (klass->get_text) {
+ text = klass->get_text (overlay, buffer);
+ } else {
+ text = g_strdup (overlay->default_text);
+ }
+
+ GST_LOG_OBJECT (overlay, "Text pad not linked, rendering default "
+ "text: '%s'", GST_STR_NULL (text));
+
+ GST_OBJECT_UNLOCK (overlay);
+
+ if (text != NULL && *text != '\0') {
+ /* Render and push */
+ gst_base_text_overlay_render_text (overlay, text, -1);
+ ret = gst_base_text_overlay_push_frame (overlay, buffer);
+ } else {
+ /* Invalid or empty string */
+ ret = gst_pad_push (overlay->srcpad, buffer);
+ }
+ } else {
+ /* Text pad linked, check if we have a text buffer queued */
+ if (overlay->text_buffer) {
+ gboolean pop_text = FALSE, valid_text_time = TRUE;
+ GstClockTime text_start = GST_CLOCK_TIME_NONE;
+ GstClockTime text_end = GST_CLOCK_TIME_NONE;
+ GstClockTime text_running_time = GST_CLOCK_TIME_NONE;
+ GstClockTime text_running_time_end = GST_CLOCK_TIME_NONE;
+ GstClockTime vid_running_time, vid_running_time_end;
+
+ /* 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_IS_VALID (overlay->text_buffer) ||
+ !GST_BUFFER_DURATION_IS_VALID (overlay->text_buffer)) {
+ GST_WARNING_OBJECT (overlay,
+ "Got text buffer with invalid timestamp or duration");
+ pop_text = TRUE;
+ valid_text_time = FALSE;
+ } else {
+ text_start = GST_BUFFER_TIMESTAMP (overlay->text_buffer);
+ text_end = text_start + GST_BUFFER_DURATION (overlay->text_buffer);
+ }
+
+ vid_running_time =
+ gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME,
+ start);
+ vid_running_time_end =
+ gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME,
+ stop);
+
+ /* If timestamp and duration are valid */
+ if (valid_text_time) {
+ text_running_time =
+ gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME,
+ text_start);
+ text_running_time_end =
+ gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME,
+ text_end);
+ }
+
+ GST_LOG_OBJECT (overlay, "T: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (text_running_time),
+ GST_TIME_ARGS (text_running_time_end));
+ GST_LOG_OBJECT (overlay, "V: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (vid_running_time),
+ GST_TIME_ARGS (vid_running_time_end));
+
+ /* Text too old or in the future */
+ if (valid_text_time && text_running_time_end <= vid_running_time) {
+ /* text buffer too old, get rid of it and do nothing */
+ GST_LOG_OBJECT (overlay, "text buffer too old, popping");
+ pop_text = FALSE;
+ gst_base_text_overlay_pop_text (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ goto wait_for_text_buf;
+ } else if (valid_text_time && vid_running_time_end <= text_running_time) {
+ GST_LOG_OBJECT (overlay, "text in future, pushing video buf");
+ GST_OBJECT_UNLOCK (overlay);
+ /* Push the video frame */
+ ret = gst_pad_push (overlay->srcpad, buffer);
+ } else {
+ gchar *in_text, *otext;
+ gsize in_size, osize;
+
+ otext =
+ gst_buffer_map (overlay->text_buffer, &osize, NULL, GST_MAP_READ);
+ in_text = otext;
+ in_size = osize;
+
+ /* g_markup_escape_text() absolutely requires valid UTF8 input, it
+ * might crash otherwise. We don't fall back on GST_SUBTITLE_ENCODING
+ * here on purpose, this is something that needs fixing upstream */
+ if (!g_utf8_validate (in_text, in_size, NULL)) {
+ const gchar *end = NULL;
+
+ GST_WARNING_OBJECT (overlay, "received invalid UTF-8");
+ in_text = g_strndup (in_text, in_size);
+ while (!g_utf8_validate (in_text, in_size, &end) && end)
+ *((gchar *) end) = '*';
+ }
+
+ /* Get the string */
+ if (overlay->have_pango_markup) {
+ text = g_strndup (in_text, in_size);
+ } else {
+ text = g_markup_escape_text (in_text, in_size);
+ }
+
+ if (text != NULL && *text != '\0') {
+ gint text_len = strlen (text);
+
+ while (text_len > 0 && (text[text_len - 1] == '\n' ||
+ text[text_len - 1] == '\r')) {
+ --text_len;
+ }
+ GST_DEBUG_OBJECT (overlay, "Rendering text '%*s'", text_len, text);
+ gst_base_text_overlay_render_text (overlay, text, text_len);
+ } else {
+ GST_DEBUG_OBJECT (overlay, "No text to render (empty buffer)");
+ gst_base_text_overlay_render_text (overlay, " ", 1);
+ }
+ gst_buffer_unmap (overlay->text_buffer, otext, osize);
+
+ if (in_text != otext)
+ g_free (in_text);
+
+ GST_OBJECT_UNLOCK (overlay);
+ ret = gst_base_text_overlay_push_frame (overlay, buffer);
+
+ if (valid_text_time && text_running_time_end <= vid_running_time_end) {
+ GST_LOG_OBJECT (overlay, "text buffer not needed any longer");
+ pop_text = TRUE;
+ }
+ }
+ if (pop_text) {
+ GST_OBJECT_LOCK (overlay);
+ gst_base_text_overlay_pop_text (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ }
+ } else {
+ gboolean wait_for_text_buf = TRUE;
+
+ if (overlay->text_eos)
+ wait_for_text_buf = FALSE;
+
+ if (!overlay->wait_text)
+ wait_for_text_buf = FALSE;
+
+ /* Text pad linked, but no text buffer available - what now? */
+ if (overlay->text_segment.format == GST_FORMAT_TIME) {
+ GstClockTime text_start_running_time, text_position_running_time;
+ GstClockTime vid_running_time;
+
+ vid_running_time =
+ gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME,
+ GST_BUFFER_TIMESTAMP (buffer));
+ text_start_running_time =
+ gst_segment_to_running_time (&overlay->text_segment,
+ GST_FORMAT_TIME, overlay->text_segment.start);
+ text_position_running_time =
+ gst_segment_to_running_time (&overlay->text_segment,
+ GST_FORMAT_TIME, overlay->text_segment.position);
+
+ if ((GST_CLOCK_TIME_IS_VALID (text_start_running_time) &&
+ vid_running_time < text_start_running_time) ||
+ (GST_CLOCK_TIME_IS_VALID (text_position_running_time) &&
+ vid_running_time < text_position_running_time)) {
+ wait_for_text_buf = FALSE;
+ }
+ }
+
+ if (wait_for_text_buf) {
+ GST_DEBUG_OBJECT (overlay, "no text buffer, need to wait for one");
+ GST_BASE_TEXT_OVERLAY_WAIT (overlay);
+ GST_DEBUG_OBJECT (overlay, "resuming");
+ GST_OBJECT_UNLOCK (overlay);
+ goto wait_for_text_buf;
+ } else {
+ GST_OBJECT_UNLOCK (overlay);
+ GST_LOG_OBJECT (overlay, "no need to wait for a text buffer");
+ ret = gst_pad_push (overlay->srcpad, buffer);
+ }
+ }
+ }
+
+ g_free (text);
+
+ /* Update position */
+ overlay->segment.position = clip_start;
+
+ return ret;
+
+missing_timestamp:
+ {
+ GST_WARNING_OBJECT (overlay, "buffer without timestamp, discarding");
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+
+flushing:
+ {
+ GST_OBJECT_UNLOCK (overlay);
+ GST_DEBUG_OBJECT (overlay, "flushing, discarding buffer");
+ gst_buffer_unref (buffer);
+ return GST_FLOW_WRONG_STATE;
+ }
+have_eos:
+ {
+ GST_OBJECT_UNLOCK (overlay);
+ GST_DEBUG_OBJECT (overlay, "eos, discarding buffer");
+ gst_buffer_unref (buffer);
+ return GST_FLOW_UNEXPECTED;
+ }
+out_of_segment:
+ {
+ GST_DEBUG_OBJECT (overlay, "buffer out of segment, discarding");
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+}
+
+static GstStateChangeReturn
+gst_base_text_overlay_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_OBJECT_LOCK (overlay);
+ overlay->text_flushing = TRUE;
+ overlay->video_flushing = TRUE;
+ /* pop_text will broadcast on the GCond and thus also make the video
+ * chain exit if it's waiting for a text buffer */
+ gst_base_text_overlay_pop_text (overlay);
+ GST_OBJECT_UNLOCK (overlay);
+ break;
+ default:
+ break;
+ }
+
+ ret = parent_class->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_OBJECT_LOCK (overlay);
+ overlay->text_flushing = FALSE;
+ overlay->video_flushing = FALSE;
+ overlay->video_eos = FALSE;
+ overlay->text_eos = FALSE;
+ gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
+ gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
+ GST_OBJECT_UNLOCK (overlay);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_controller_init (NULL, NULL);
+
+ if (!gst_element_register (plugin, "textoverlay", GST_RANK_NONE,
+ GST_TYPE_TEXT_OVERLAY) ||
+ !gst_element_register (plugin, "timeoverlay", GST_RANK_NONE,
+ GST_TYPE_TIME_OVERLAY) ||
+ !gst_element_register (plugin, "clockoverlay", GST_RANK_NONE,
+ GST_TYPE_CLOCK_OVERLAY) ||
+ !gst_element_register (plugin, "textrender", GST_RANK_NONE,
+ GST_TYPE_TEXT_RENDER)) {
+ return FALSE;
+ }
+
+ /*texttestsrc_plugin_init(module, plugin); */
+
+ GST_DEBUG_CATEGORY_INIT (pango_debug, "pango", 0, "Pango elements");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,
+ "pango", "Pango-based text rendering and overlay", plugin_init,
+ VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/pango/gstbasetextoverlay.h b/ext/pango/gstbasetextoverlay.h
new file mode 100644
index 0000000..b7db8de
--- /dev/null
+++ b/ext/pango/gstbasetextoverlay.h
@@ -0,0 +1,170 @@
+#ifndef __GST_BASE_TEXT_OVERLAY_H__
+#define __GST_BASE_TEXT_OVERLAY_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/controller/gstcontroller.h>
+#include <pango/pangocairo.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_TEXT_OVERLAY (gst_base_text_overlay_get_type())
+#define GST_BASE_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
+ GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlay))
+#define GST_BASE_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\
+ GST_TYPE_BASE_TEXT_OVERLAY,GstBaseTextOverlayClass))
+#define GST_BASE_TEXT_OVERLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
+ GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlayClass))
+#define GST_IS_BASE_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\
+ GST_TYPE_BASE_TEXT_OVERLAY))
+#define GST_IS_BASE_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\
+ GST_TYPE_BASE_TEXT_OVERLAY))
+
+typedef struct _GstBaseTextOverlay GstBaseTextOverlay;
+typedef struct _GstBaseTextOverlayClass GstBaseTextOverlayClass;
+
+/**
+ * GstBaseTextOverlayVAlign:
+ * @GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE: draw text on the baseline
+ * @GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM: draw text on the bottom
+ * @GST_BASE_TEXT_OVERLAY_VALIGN_TOP: draw text on top
+ * @GST_BASE_TEXT_OVERLAY_VALIGN_POS: draw text according to the #GstBaseTextOverlay:ypos property
+ * @GST_BASE_TEXT_OVERLAY_VALIGN_CENTER: draw text vertically centered
+ *
+ * Vertical alignment of the text.
+ */
+typedef enum {
+ GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE,
+ GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM,
+ GST_BASE_TEXT_OVERLAY_VALIGN_TOP,
+ GST_BASE_TEXT_OVERLAY_VALIGN_POS,
+ GST_BASE_TEXT_OVERLAY_VALIGN_CENTER
+} GstBaseTextOverlayVAlign;
+
+/**
+ * GstBaseTextOverlayHAlign:
+ * @GST_BASE_TEXT_OVERLAY_HALIGN_LEFT: align text left
+ * @GST_BASE_TEXT_OVERLAY_HALIGN_CENTER: align text center
+ * @GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT: align text right
+ * @GST_BASE_TEXT_OVERLAY_HALIGN_POS: position text according to the #GstBaseTextOverlay:xpos property
+ *
+ * Horizontal alignment of the text.
+ */
+/* FIXME 0.11: remove GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED */
+typedef enum {
+ GST_BASE_TEXT_OVERLAY_HALIGN_LEFT,
+ GST_BASE_TEXT_OVERLAY_HALIGN_CENTER,
+ GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT,
+ GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED,
+ GST_BASE_TEXT_OVERLAY_HALIGN_POS
+} GstBaseTextOverlayHAlign;
+
+/**
+ * GstBaseTextOverlayWrapMode:
+ * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE: no wrapping
+ * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD: do word wrapping
+ * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR: do char wrapping
+ * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR: do word and char wrapping
+ *
+ * Whether to wrap the text and if so how.
+ */
+typedef enum {
+ GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE = -1,
+ GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD = PANGO_WRAP_WORD,
+ GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR = PANGO_WRAP_CHAR,
+ GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR = PANGO_WRAP_WORD_CHAR
+} GstBaseTextOverlayWrapMode;
+
+/**
+ * GstBaseTextOverlayLineAlign:
+ * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT: lines are left-aligned
+ * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER: lines are center-aligned
+ * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT: lines are right-aligned
+ *
+ * Alignment of text lines relative to each other
+ */
+typedef enum {
+ GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT = PANGO_ALIGN_LEFT,
+ GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER = PANGO_ALIGN_CENTER,
+ GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT = PANGO_ALIGN_RIGHT
+} GstBaseTextOverlayLineAlign;
+
+/**
+ * GstBaseTextOverlay:
+ *
+ * Opaque textoverlay object structure
+ */
+struct _GstBaseTextOverlay {
+ GstElement element;
+
+ GstPad *video_sinkpad;
+ GstPad *text_sinkpad;
+ GstPad *srcpad;
+
+ GstSegment segment;
+ GstSegment text_segment;
+ GstBuffer *text_buffer;
+ gboolean text_linked;
+ gboolean video_flushing;
+ gboolean video_eos;
+ gboolean text_flushing;
+ gboolean text_eos;
+
+ GCond *cond; /* to signal removal of a queued text
+ * buffer, arrival of a text buffer,
+ * a text segment update, or a change
+ * in status (e.g. shutdown, flushing) */
+
+ GstVideoInfo info;
+ GstVideoFormat format;
+ gint width;
+ gint height;
+
+ GstBaseTextOverlayVAlign valign;
+ GstBaseTextOverlayHAlign halign;
+ GstBaseTextOverlayWrapMode wrap_mode;
+ GstBaseTextOverlayLineAlign line_align;
+
+ gint xpad;
+ gint ypad;
+ gint deltax;
+ gint deltay;
+ gdouble xpos;
+ gdouble ypos;
+ gchar *default_text;
+ gboolean want_shading;
+ gboolean silent;
+ gboolean wait_text;
+ guint color, outline_color;
+
+ PangoLayout *layout;
+ gdouble shadow_offset;
+ gdouble outline_offset;
+ guchar *text_image;
+ gint image_width;
+ gint image_height;
+ gint baseline_y;
+
+ gboolean auto_adjust_size;
+ gboolean need_render;
+
+ gint shading_value; /* for timeoverlay subclass */
+
+ gboolean have_pango_markup;
+ gboolean use_vertical_render;
+};
+
+struct _GstBaseTextOverlayClass {
+ GstElementClass parent_class;
+
+ PangoContext *pango_context;
+ GMutex *pango_lock;
+
+ gchar * (*get_text) (GstBaseTextOverlay *overlay, GstBuffer *video_frame);
+};
+
+GType gst_base_text_overlay_get_type(void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GST_BASE_TEXT_OVERLAY_H */
diff --git a/ext/pango/gstclockoverlay.c b/ext/pango/gstclockoverlay.c
new file mode 100644
index 0000000..4841274
--- /dev/null
+++ b/ext/pango/gstclockoverlay.c
@@ -0,0 +1,244 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2005> Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-clockoverlay
+ * @see_also: #GstBaseTextOverlay, #GstTimeOverlay
+ *
+ * This element overlays the current clock time on top of a video
+ * stream. You can position the text and configure the font details
+ * using the properties of the #GstBaseTextOverlay class. By default, the
+ * time is displayed in the top left corner of the picture, with some
+ * padding to the left and to the top.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v videotestsrc ! clockoverlay ! xvimagesink
+ * ]| Display the current time in the top left corner of the video picture
+ * |[
+ * gst-launch -v videotestsrc ! clockoverlay halign=right valign=bottom text="Edge City" shaded-background=true ! videoconvert ! ximagesink
+ * ]| Another pipeline that displays the current time with some leading
+ * text in the bottom right corner of the video picture, with the background
+ * of the text being shaded in order to make it more legible on top of a
+ * bright video background.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gstclockoverlay.h>
+#include <gst/video/video.h>
+#include <time.h>
+
+
+#define DEFAULT_PROP_TIMEFORMAT "%H:%M:%S"
+
+enum
+{
+ PROP_0,
+ PROP_TIMEFORMAT,
+ PROP_LAST
+};
+
+#define gst_clock_overlay_parent_class parent_class
+G_DEFINE_TYPE (GstClockOverlay, gst_clock_overlay, GST_TYPE_BASE_TEXT_OVERLAY);
+
+static void gst_clock_overlay_finalize (GObject * object);
+static void gst_clock_overlay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_clock_overlay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gchar *
+gst_clock_overlay_render_time (GstClockOverlay * overlay)
+{
+ struct tm *t;
+ time_t now;
+ gchar buf[256];
+
+#ifdef HAVE_LOCALTIME_R
+ struct tm dummy;
+#endif
+
+ now = time (NULL);
+
+#ifdef HAVE_LOCALTIME_R
+ /* Need to call tzset explicitly when calling localtime_r for changes
+ to the timezone between calls to be visible. */
+ tzset ();
+ t = localtime_r (&now, &dummy);
+#else
+ /* on win32 this apparently returns a per-thread struct which would be fine */
+ t = localtime (&now);
+#endif
+
+ if (t == NULL)
+ return g_strdup ("--:--:--");
+
+ if (strftime (buf, sizeof (buf), overlay->format, t) == 0)
+ return g_strdup ("");
+ return g_strdup (buf);
+}
+
+/* Called with lock held */
+static gchar *
+gst_clock_overlay_get_text (GstBaseTextOverlay * overlay,
+ GstBuffer * video_frame)
+{
+ gchar *time_str, *txt, *ret;
+ GstClockOverlay *clock_overlay = GST_CLOCK_OVERLAY (overlay);
+
+ txt = g_strdup (overlay->default_text);
+
+ time_str = gst_clock_overlay_render_time (clock_overlay);
+ if (txt != NULL && *txt != '\0') {
+ ret = g_strdup_printf ("%s %s", txt, time_str);
+ } else {
+ ret = time_str;
+ time_str = NULL;
+ }
+
+ if (g_strcmp0 (ret, clock_overlay->text)) {
+ overlay->need_render = TRUE;
+ g_free (clock_overlay->text);
+ clock_overlay->text = g_strdup (ret);
+ }
+
+ g_free (txt);
+ g_free (time_str);
+
+ return ret;
+}
+
+static void
+gst_clock_overlay_class_init (GstClockOverlayClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseTextOverlayClass *gsttextoverlay_class;
+ PangoContext *context;
+ PangoFontDescription *font_description;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gsttextoverlay_class = (GstBaseTextOverlayClass *) klass;
+
+ gobject_class->finalize = gst_clock_overlay_finalize;
+ gobject_class->set_property = gst_clock_overlay_set_property;
+ gobject_class->get_property = gst_clock_overlay_get_property;
+
+ gst_element_class_set_details_simple (gstelement_class, "Clock overlay",
+ "Filter/Editor/Video",
+ "Overlays the current clock time on a video stream",
+ "Tim-Philipp Müller <tim@centricular.net>");
+
+ gsttextoverlay_class->get_text = gst_clock_overlay_get_text;
+
+ g_object_class_install_property (gobject_class, PROP_TIMEFORMAT,
+ g_param_spec_string ("time-format", "Date/Time Format",
+ "Format to use for time and date value, as in strftime.",
+ DEFAULT_PROP_TIMEFORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_mutex_lock (gsttextoverlay_class->pango_lock);
+ context = gsttextoverlay_class->pango_context;
+
+ pango_context_set_language (context, pango_language_from_string ("en_US"));
+ pango_context_set_base_dir (context, PANGO_DIRECTION_LTR);
+
+ font_description = pango_font_description_new ();
+ pango_font_description_set_family_static (font_description, "Monospace");
+ pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL);
+ pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL);
+ pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL);
+ pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL);
+ pango_font_description_set_size (font_description, 18 * PANGO_SCALE);
+ pango_context_set_font_description (context, font_description);
+ pango_font_description_free (font_description);
+ g_mutex_unlock (gsttextoverlay_class->pango_lock);
+}
+
+
+static void
+gst_clock_overlay_finalize (GObject * object)
+{
+ GstClockOverlay *overlay = GST_CLOCK_OVERLAY (object);
+
+ g_free (overlay->format);
+ g_free (overlay->text);
+ overlay->format = NULL;
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static void
+gst_clock_overlay_init (GstClockOverlay * overlay)
+{
+ GstBaseTextOverlay *textoverlay;
+
+ textoverlay = GST_BASE_TEXT_OVERLAY (overlay);
+
+ textoverlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_TOP;
+ textoverlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_LEFT;
+
+ overlay->format = g_strdup (DEFAULT_PROP_TIMEFORMAT);
+}
+
+
+static void
+gst_clock_overlay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstClockOverlay *overlay = GST_CLOCK_OVERLAY (object);
+
+ GST_OBJECT_LOCK (overlay);
+ switch (prop_id) {
+ case PROP_TIMEFORMAT:
+ g_free (overlay->format);
+ overlay->format = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (overlay);
+}
+
+
+static void
+gst_clock_overlay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstClockOverlay *overlay = GST_CLOCK_OVERLAY (object);
+
+ GST_OBJECT_LOCK (overlay);
+ switch (prop_id) {
+ case PROP_TIMEFORMAT:
+ g_value_set_string (value, overlay->format);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (overlay);
+}
diff --git a/ext/pango/gstclockoverlay.h b/ext/pango/gstclockoverlay.h
new file mode 100644
index 0000000..09ca2d3
--- /dev/null
+++ b/ext/pango/gstclockoverlay.h
@@ -0,0 +1,81 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2005> Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_CLOCK_OVERLAY_H__
+#define __GST_CLOCK_OVERLAY_H__
+
+#include "gstbasetextoverlay.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_CLOCK_OVERLAY \
+ (gst_clock_overlay_get_type())
+#define GST_CLOCK_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CLOCK_OVERLAY,GstClockOverlay))
+#define GST_CLOCK_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CLOCK_OVERLAY,GstClockOverlayClass))
+#define GST_IS_CLOCK_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CLOCK_OVERLAY))
+#define GST_IS_CLOCK_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CLOCK_OVERLAY))
+
+typedef struct _GstClockOverlay GstClockOverlay;
+typedef struct _GstClockOverlayClass GstClockOverlayClass;
+
+/**
+ * GstClockOverlay:
+ *
+ * Opaque clockoverlay data structure.
+ */
+struct _GstClockOverlay {
+ GstBaseTextOverlay textoverlay;
+ gchar *format; /* as in strftime () */
+ gchar *text;
+};
+
+struct _GstClockOverlayClass {
+ GstBaseTextOverlayClass parent_class;
+};
+
+GType gst_clock_overlay_get_type (void);
+
+
+/* This is a hack hat allows us to use nonliterals for strftime without
+ * triggering a warning from -Wformat-nonliteral. We need to allow this
+ * because we export the format string as a property of the element.
+ * For the inspiration of this and a discussion of why this is necessary,
+ * see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39438
+ */
+#ifdef __GNUC__
+#pragma GCC system_header
+static size_t my_strftime(char *s, size_t max, const char *format,
+ const struct tm *tm)
+{
+ return strftime (s, max, format, tm);
+}
+#define strftime my_strftime
+#endif
+
+
+G_END_DECLS
+
+#endif /* __GST_CLOCK_OVERLAY_H__ */
+
diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c
new file mode 100644
index 0000000..9f8c7bf
--- /dev/null
+++ b/ext/pango/gsttextoverlay.c
@@ -0,0 +1,114 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2003> David Schleef <ds@schleef.org>
+ * Copyright (C) <2006> Julien Moutte <julien@moutte.net>
+ * Copyright (C) <2006> Zeeshan Ali <zeeshan.ali@nokia.com>
+ * Copyright (C) <2006-2008> Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) <2009> Young-Ho Cha <ganadist@gmail.com>
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-textoverlay
+ * @see_also: #GstTextRender, #GstTextOverlay, #GstTimeOverlay, #GstSubParse
+ *
+ * This plugin renders text on top of a video stream. This can be either
+ * static text or text from buffers received on the text sink pad, e.g.
+ * as produced by the subparse element. If the text sink pad is not linked,
+ * the text set via the "text" property will be rendered. If the text sink
+ * pad is linked, text will be rendered as it is received on that pad,
+ * honouring and matching the buffer timestamps of both input streams.
+ *
+ * The text can contain newline characters and text wrapping is enabled by
+ * default.
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v videotestsrc ! textoverlay text="Room A" valign=top halign=left ! xvimagesink
+ * ]| Here is a simple pipeline that displays a static text in the top left
+ * corner of the video picture
+ * |[
+ * gst-launch -v filesrc location=subtitles.srt ! subparse ! txt. videotestsrc ! timeoverlay ! textoverlay name=txt shaded-background=yes ! xvimagesink
+ * ]| Here is another pipeline that displays subtitles from an .srt subtitle
+ * file, centered at the bottom of the picture and with a rectangular shading
+ * around the text in the background:
+ * <para>
+ * If you do not have such a subtitle file, create one looking like this
+ * in a text editor:
+ * |[
+ * 1
+ * 00:00:03,000 --> 00:00:05,000
+ * Hello? (3-5s)
+ *
+ * 2
+ * 00:00:08,000 --> 00:00:13,000
+ * Yes, this is a subtitle. Don&apos;t
+ * you like it? (8-13s)
+ *
+ * 3
+ * 00:00:18,826 --> 00:01:02,886
+ * Uh? What are you talking about?
+ * I don&apos;t understand (18-62s)
+ * ]|
+ * One can also feed arbitrary live text into the element:
+ * |[
+ * gst-launch fdsrc fd=0 ! text/plain ! txt. videotestsrc ! \
+ * textoverlay name=txt shaded-background=yes font-desc="Serif 40" wait-text=false ! \
+ * xvimagesink
+ * ]| This shows new text as entered on the terminal (stdin). This is not suited
+ * for subtitles as the test overlay is not timed. Subtitles should use
+ * timestamped formats. For the above use case one can also read the text from
+ * the application as set the #GstTextOverlay:text property.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gsttextoverlay.h>
+
+static GstStaticPadTemplate text_sink_template_factory =
+ GST_STATIC_PAD_TEMPLATE ("text_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/x-pango-markup; text/plain")
+ );
+
+G_DEFINE_TYPE (GstTextOverlay, gst_text_overlay, GST_TYPE_BASE_TEXT_OVERLAY);
+
+static void
+gst_text_overlay_class_init (GstTextOverlayClass * klass)
+{
+ GstElementClass *element_class = (GstElementClass *) klass;
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&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 <ds@schleef.org>, " "Zeeshan Ali <zeeshan.ali@nokia.com>");
+}
+
+static void
+gst_text_overlay_init (GstTextOverlay * overlay)
+{
+}
diff --git a/ext/pango/gsttextoverlay.h b/ext/pango/gsttextoverlay.h
new file mode 100644
index 0000000..c1dab86
--- /dev/null
+++ b/ext/pango/gsttextoverlay.h
@@ -0,0 +1,60 @@
+/* GStreamer
+ * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TEXT_OVERLAY_H__
+#define __GST_TEXT_OVERLAY_H__
+
+#include "gstbasetextoverlay.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TEXT_OVERLAY \
+ (gst_text_overlay_get_type())
+#define GST_TEXT_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEXT_OVERLAY,GstTextOverlay))
+#define GST_TEXT_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEXT_OVERLAY,GstTextOverlayClass))
+#define GST_IS_TEXT_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEXT_OVERLAY))
+#define GST_IS_TEXT_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEXT_OVERLAY))
+
+typedef struct _GstTextOverlay GstTextOverlay;
+typedef struct _GstTextOverlayClass GstTextOverlayClass;
+
+/**
+ * GstTextOverlay:
+ *
+ * Opaque textoverlay data structure.
+ */
+struct _GstTextOverlay {
+ GstBaseTextOverlay parent;
+};
+
+struct _GstTextOverlayClass {
+ GstBaseTextOverlayClass parent_class;
+};
+
+GType gst_text_overlay_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TEXT_OVERLAY_H__ */
+
diff --git a/ext/pango/gsttextrender.c b/ext/pango/gsttextrender.c
new file mode 100644
index 0000000..a029acb
--- /dev/null
+++ b/ext/pango/gsttextrender.c
@@ -0,0 +1,709 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2003> David Schleef <ds@schleef.org>
+ * Copyright (C) <2009> Young-Ho Cha <ganadist@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.
+ */
+
+
+/**
+ * SECTION:element-textrender
+ * @see_also: #GstTextOverlay
+ *
+ * This plugin renders text received on the text sink pad to a video
+ * buffer (retaining the alpha channel), so it can later be overlayed
+ * on top of video streams using other elements.
+ *
+ * The text can contain newline characters. (FIXME: What about text
+ * wrapping? It does not make sense in this context)
+ *
+ * <refsect2>
+ * <title>Example launch lines</title>
+ * |[
+ * gst-launch -v filesrc location=subtitles.srt ! subparse ! textrender ! xvimagesink
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#include "gsttextrender.h"
+#include <string.h>
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define CAIRO_ARGB_A 3
+# define CAIRO_ARGB_R 2
+# define CAIRO_ARGB_G 1
+# define CAIRO_ARGB_B 0
+#else
+# define CAIRO_ARGB_A 0
+# define CAIRO_ARGB_R 1
+# define CAIRO_ARGB_G 2
+# define CAIRO_ARGB_B 3
+#endif
+
+GST_DEBUG_CATEGORY_EXTERN (pango_debug);
+#define GST_CAT_DEFAULT pango_debug
+
+#define MINIMUM_OUTLINE_OFFSET 1.0
+
+#define DEFAULT_PROP_VALIGNMENT GST_TEXT_RENDER_VALIGN_BASELINE
+#define DEFAULT_PROP_HALIGNMENT GST_TEXT_RENDER_HALIGN_CENTER
+#define DEFAULT_PROP_LINE_ALIGNMENT GST_TEXT_RENDER_LINE_ALIGN_CENTER
+#define DEFAULT_PROP_XPAD 25
+#define DEFAULT_PROP_YPAD 25
+
+#define DEFAULT_RENDER_WIDTH 720
+#define DEFAULT_RENDER_HEIGHT 576
+
+enum
+{
+ PROP_0,
+ PROP_HALIGNMENT,
+ PROP_VALIGNMENT,
+ PROP_LINE_ALIGNMENT,
+ PROP_XPAD,
+ PROP_YPAD,
+ PROP_FONT_DESC
+};
+
+#define VIDEO_FORMATS "{ AYUV, ARGB } "
+
+static GstStaticPadTemplate src_template_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (VIDEO_FORMATS))
+ );
+
+static GstStaticPadTemplate sink_template_factory =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/x-pango-markup; text/plain")
+ );
+
+#define GST_TYPE_TEXT_RENDER_VALIGN (gst_text_render_valign_get_type())
+static GType
+gst_text_render_valign_get_type (void)
+{
+ static GType text_render_valign_type = 0;
+ static const GEnumValue text_render_valign[] = {
+ {GST_TEXT_RENDER_VALIGN_BASELINE, "baseline", "baseline"},
+ {GST_TEXT_RENDER_VALIGN_BOTTOM, "bottom", "bottom"},
+ {GST_TEXT_RENDER_VALIGN_TOP, "top", "top"},
+ {0, NULL, NULL},
+ };
+
+ if (!text_render_valign_type) {
+ text_render_valign_type =
+ g_enum_register_static ("GstTextRenderVAlign", text_render_valign);
+ }
+ return text_render_valign_type;
+}
+
+#define GST_TYPE_TEXT_RENDER_HALIGN (gst_text_render_halign_get_type())
+static GType
+gst_text_render_halign_get_type (void)
+{
+ static GType text_render_halign_type = 0;
+ static const GEnumValue text_render_halign[] = {
+ {GST_TEXT_RENDER_HALIGN_LEFT, "left", "left"},
+ {GST_TEXT_RENDER_HALIGN_CENTER, "center", "center"},
+ {GST_TEXT_RENDER_HALIGN_RIGHT, "right", "right"},
+ {0, NULL, NULL},
+ };
+
+ if (!text_render_halign_type) {
+ text_render_halign_type =
+ g_enum_register_static ("GstTextRenderHAlign", text_render_halign);
+ }
+ return text_render_halign_type;
+}
+
+#define GST_TYPE_TEXT_RENDER_LINE_ALIGN (gst_text_render_line_align_get_type())
+static GType
+gst_text_render_line_align_get_type (void)
+{
+ static GType text_render_line_align_type = 0;
+ static const GEnumValue text_render_line_align[] = {
+ {GST_TEXT_RENDER_LINE_ALIGN_LEFT, "left", "left"},
+ {GST_TEXT_RENDER_LINE_ALIGN_CENTER, "center", "center"},
+ {GST_TEXT_RENDER_LINE_ALIGN_RIGHT, "right", "right"},
+ {0, NULL, NULL}
+ };
+
+ if (!text_render_line_align_type) {
+ text_render_line_align_type =
+ g_enum_register_static ("GstTextRenderLineAlign",
+ text_render_line_align);
+ }
+ return text_render_line_align_type;
+}
+
+static void gst_text_render_adjust_values_with_fontdesc (GstTextRender *
+ render, PangoFontDescription * desc);
+
+#define gst_text_render_parent_class parent_class
+G_DEFINE_TYPE (GstTextRender, gst_text_render, GST_TYPE_ELEMENT);
+
+static void gst_text_render_finalize (GObject * object);
+static void gst_text_render_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_text_render_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static void
+gst_text_render_class_init (GstTextRenderClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ PangoFontMap *fontmap;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_text_render_finalize;
+ gobject_class->set_property = gst_text_render_set_property;
+ gobject_class->get_property = gst_text_render_get_property;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_template_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sink_template_factory));
+
+ gst_element_class_set_details_simple (gstelement_class, "Text renderer",
+ "Filter/Editor/Video",
+ "Renders a text string to an image bitmap",
+ "David Schleef <ds@schleef.org>, "
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ fontmap = pango_cairo_font_map_get_default ();
+ klass->pango_context =
+ pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_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));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGNMENT,
+ g_param_spec_enum ("valignment", "vertical alignment",
+ "Vertical alignment of the text", GST_TYPE_TEXT_RENDER_VALIGN,
+ DEFAULT_PROP_VALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGNMENT,
+ g_param_spec_enum ("halignment", "horizontal alignment",
+ "Horizontal alignment of the text", GST_TYPE_TEXT_RENDER_HALIGN,
+ DEFAULT_PROP_HALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_XPAD,
+ g_param_spec_int ("xpad", "horizontal paddding",
+ "Horizontal paddding when using left/right alignment", 0, G_MAXINT,
+ DEFAULT_PROP_XPAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_YPAD,
+ g_param_spec_int ("ypad", "vertical padding",
+ "Vertical padding when using top/bottom alignment", 0, G_MAXINT,
+ DEFAULT_PROP_YPAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LINE_ALIGNMENT,
+ g_param_spec_enum ("line-alignment", "line alignment",
+ "Alignment of text lines relative to each other.",
+ GST_TYPE_TEXT_RENDER_LINE_ALIGN, DEFAULT_PROP_LINE_ALIGNMENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_text_render_adjust_values_with_fontdesc (GstTextRender * render,
+ PangoFontDescription * desc)
+{
+ gint font_size = pango_font_description_get_size (desc) / PANGO_SCALE;
+
+ render->shadow_offset = (double) (font_size) / 13.0;
+ render->outline_offset = (double) (font_size) / 15.0;
+ if (render->outline_offset < MINIMUM_OUTLINE_OFFSET)
+ render->outline_offset = MINIMUM_OUTLINE_OFFSET;
+}
+
+static void
+gst_text_render_render_pangocairo (GstTextRender * render)
+{
+ cairo_t *cr;
+ cairo_surface_t *surface;
+ cairo_t *cr_shadow;
+ cairo_surface_t *surface_shadow;
+ PangoRectangle ink_rect, logical_rect;
+ gint width, height;
+
+ pango_layout_get_pixel_extents (render->layout, &ink_rect, &logical_rect);
+
+ width = logical_rect.width + render->shadow_offset;
+ height = logical_rect.height + logical_rect.y + render->shadow_offset;
+
+ surface_shadow = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
+ cr_shadow = cairo_create (surface_shadow);
+
+ /* clear shadow surface */
+ cairo_set_operator (cr_shadow, CAIRO_OPERATOR_CLEAR);
+ cairo_paint (cr_shadow);
+ cairo_set_operator (cr_shadow, CAIRO_OPERATOR_OVER);
+
+ /* draw shadow text */
+ cairo_save (cr_shadow);
+ cairo_set_source_rgba (cr_shadow, 0.0, 0.0, 0.0, 0.5);
+ cairo_translate (cr_shadow, render->shadow_offset, render->shadow_offset);
+ pango_cairo_show_layout (cr_shadow, render->layout);
+ cairo_restore (cr_shadow);
+
+ /* draw outline text */
+ cairo_save (cr_shadow);
+ cairo_set_source_rgb (cr_shadow, 0.0, 0.0, 0.0);
+ cairo_set_line_width (cr_shadow, render->outline_offset);
+ pango_cairo_layout_path (cr_shadow, render->layout);
+ cairo_stroke (cr_shadow);
+ cairo_restore (cr_shadow);
+
+ cairo_destroy (cr_shadow);
+
+ render->text_image = g_realloc (render->text_image, 4 * width * height);
+
+ surface = cairo_image_surface_create_for_data (render->text_image,
+ CAIRO_FORMAT_ARGB32, width, height, width * 4);
+ cr = cairo_create (surface);
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_paint (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+
+ /* set default color */
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+
+ cairo_save (cr);
+ /* draw text */
+ pango_cairo_show_layout (cr, render->layout);
+ cairo_restore (cr);
+
+ /* composite shadow with offset */
+ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
+ cairo_set_source_surface (cr, surface_shadow, 0.0, 0.0);
+ cairo_paint (cr);
+
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface_shadow);
+ cairo_surface_destroy (surface);
+ render->image_width = width;
+ render->image_height = height;
+}
+
+static void
+gst_text_render_check_argb (GstTextRender * render)
+{
+ GstCaps *peer_caps;
+ peer_caps = gst_pad_get_allowed_caps (render->srcpad);
+ if (G_LIKELY (peer_caps)) {
+ guint i = 0, n = 0;
+
+ n = gst_caps_get_size (peer_caps);
+ GST_DEBUG_OBJECT (render, "peer allowed caps (%u structure(s)) are %"
+ GST_PTR_FORMAT, n, peer_caps);
+
+ /* Check if AYUV or ARGB is first */
+ for (i = 0; i < n; i++) {
+ GstStructure *s;
+ GstVideoFormat vformat;
+ const GstVideoFormatInfo *info;
+ const gchar *fmt;
+
+ s = gst_caps_get_structure (peer_caps, i);
+ if (!gst_structure_has_name (s, "video/x-raw"))
+ continue;
+
+ fmt = gst_structure_get_string (s, "format");
+ if (fmt == NULL)
+ continue;
+
+ vformat = gst_video_format_from_string (fmt);
+ info = gst_video_format_get_info (vformat);
+ if (info == NULL)
+ continue;
+
+ render->use_ARGB = GST_VIDEO_FORMAT_INFO_HAS_ALPHA (info);
+ }
+ gst_caps_unref (peer_caps);
+ }
+}
+
+static gboolean
+gst_text_render_src_setcaps (GstTextRender * render, GstCaps * caps)
+{
+ GstStructure *structure;
+ gboolean ret;
+ gint width = 0, height = 0;
+
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (structure, "width", &width);
+ gst_structure_get_int (structure, "height", &height);
+
+ GST_DEBUG_OBJECT (render, "Got caps %" GST_PTR_FORMAT, caps);
+
+ if (width >= render->image_width && height >= render->image_height) {
+ render->width = width;
+ render->height = height;
+ }
+
+ gst_text_render_check_argb (render);
+
+ ret = gst_pad_push_event (render->srcpad, gst_event_new_caps (caps));
+
+ return ret;
+}
+
+static void
+gst_text_render_fixate_caps (GstPad * pad, GstCaps * caps)
+{
+ GstTextRender *render = GST_TEXT_RENDER (gst_pad_get_parent (pad));
+ GstStructure *s = gst_caps_get_structure (caps, 0);
+
+ GST_DEBUG ("Fixating caps %" GST_PTR_FORMAT, caps);
+ gst_structure_fixate_field_nearest_int (s, "width", MAX (render->image_width,
+ DEFAULT_RENDER_WIDTH));
+ gst_structure_fixate_field_nearest_int (s, "height",
+ MAX (render->image_height + render->ypad, DEFAULT_RENDER_HEIGHT));
+ GST_DEBUG ("Fixated to %" GST_PTR_FORMAT, caps);
+
+ gst_object_unref (render);
+}
+
+#define CAIRO_UNPREMULTIPLY(a,r,g,b) G_STMT_START { \
+ b = (a > 0) ? MIN ((b * 255 + a / 2) / a, 255) : 0; \
+ g = (a > 0) ? MIN ((g * 255 + a / 2) / a, 255) : 0; \
+ r = (a > 0) ? MIN ((r * 255 + a / 2) / a, 255) : 0; \
+} G_STMT_END
+
+static void
+gst_text_renderer_image_to_ayuv (GstTextRender * render, guchar * pixbuf,
+ int xpos, int ypos, int stride)
+{
+ int y; /* text bitmap coordinates */
+ guchar *p, *bitp;
+ guchar a, r, g, b;
+ int width, height;
+
+ width = render->image_width;
+ height = render->image_height;
+
+ for (y = 0; y < height && ypos + y < render->height; y++) {
+ int n;
+ p = pixbuf + (ypos + y) * stride + xpos * 4;
+ bitp = render->text_image + y * width * 4;
+ for (n = 0; n < width && n < render->width; n++) {
+ b = bitp[CAIRO_ARGB_B];
+ g = bitp[CAIRO_ARGB_G];
+ r = bitp[CAIRO_ARGB_R];
+ a = bitp[CAIRO_ARGB_A];
+ bitp += 4;
+
+ /* Cairo uses pre-multiplied ARGB, unpremultiply it */
+ CAIRO_UNPREMULTIPLY (a, r, g, b);
+
+ *p++ = a;
+ *p++ = CLAMP ((int) (((19595 * r) >> 16) + ((38470 * g) >> 16) +
+ ((7471 * b) >> 16)), 0, 255);
+ *p++ = CLAMP ((int) (-((11059 * r) >> 16) - ((21709 * g) >> 16) +
+ ((32768 * b) >> 16) + 128), 0, 255);
+ *p++ = CLAMP ((int) (((32768 * r) >> 16) - ((27439 * g) >> 16) -
+ ((5329 * b) >> 16) + 128), 0, 255);
+ }
+ }
+}
+
+static void
+gst_text_renderer_image_to_argb (GstTextRender * render, guchar * pixbuf,
+ int xpos, int ypos, int stride)
+{
+ int i, j;
+ guchar *p, *bitp;
+ int width, height;
+
+ width = render->image_width;
+ height = render->image_height;
+
+ for (i = 0; i < height && ypos + i < render->height; i++) {
+ p = pixbuf + (ypos + i) * stride + xpos * 4;
+ bitp = render->text_image + i * width * 4;
+ for (j = 0; j < width && j < render->width; j++) {
+ p[0] = bitp[CAIRO_ARGB_A];
+ p[1] = bitp[CAIRO_ARGB_R];
+ p[2] = bitp[CAIRO_ARGB_G];
+ p[3] = bitp[CAIRO_ARGB_B];
+
+ /* Cairo uses pre-multiplied ARGB, unpremultiply it */
+ CAIRO_UNPREMULTIPLY (p[0], p[1], p[2], p[3]);
+
+ bitp += 4;
+ p += 4;
+ }
+ }
+}
+
+static GstFlowReturn
+gst_text_render_chain (GstPad * pad, GstBuffer * inbuf)
+{
+ GstTextRender *render;
+ GstFlowReturn ret;
+ GstBuffer *outbuf;
+ GstCaps *caps = NULL, *padcaps;
+ guint8 *data;
+ gsize size;
+ gint n;
+ gint xpos, ypos;
+
+ render = GST_TEXT_RENDER (gst_pad_get_parent (pad));
+
+ data = gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
+
+ /* somehow pango barfs over "\0" buffers... */
+ while (size > 0 &&
+ (data[size - 1] == '\r' ||
+ data[size - 1] == '\n' || data[size - 1] == '\0')) {
+ size--;
+ }
+
+ /* render text */
+ GST_DEBUG ("rendering '%*s'", (gint) size, data);
+ pango_layout_set_markup (render->layout, (gchar *) data, size);
+ gst_text_render_render_pangocairo (render);
+ gst_buffer_unmap (inbuf, data, size);
+
+ gst_text_render_check_argb (render);
+
+ padcaps = gst_pad_get_caps (render->srcpad, NULL);
+ caps = gst_pad_peer_get_caps (render->srcpad, padcaps);
+ gst_caps_unref (padcaps);
+
+ if (!caps || gst_caps_is_empty (caps)) {
+ GST_ELEMENT_ERROR (render, CORE, NEGOTIATION, (NULL), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ gst_caps_truncate (caps);
+ gst_pad_fixate_caps (render->srcpad, caps);
+
+ if (!gst_text_render_src_setcaps (render, caps)) {
+ GST_ELEMENT_ERROR (render, CORE, NEGOTIATION, (NULL), (NULL));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ GST_DEBUG ("Allocating buffer WxH = %dx%d", render->width, render->height);
+ outbuf = gst_buffer_new_and_alloc (render->width * render->height * 4);
+
+ gst_buffer_copy_into (outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+ data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_WRITE);
+
+ if (render->use_ARGB) {
+ memset (data, 0, render->width * render->height * 4);
+ } else {
+ for (n = 0; n < render->width * render->height; n++) {
+ data[n * 4] = data[n * 4 + 1] = 0;
+ data[n * 4 + 2] = data[n * 4 + 3] = 128;
+ }
+ }
+
+ switch (render->halign) {
+ case GST_TEXT_RENDER_HALIGN_LEFT:
+ xpos = render->xpad;
+ break;
+ case GST_TEXT_RENDER_HALIGN_CENTER:
+ xpos = (render->width - render->image_width) / 2;
+ break;
+ case GST_TEXT_RENDER_HALIGN_RIGHT:
+ xpos = render->width - render->image_width - render->xpad;
+ break;
+ default:
+ xpos = 0;
+ }
+
+ switch (render->valign) {
+ case GST_TEXT_RENDER_VALIGN_BOTTOM:
+ ypos = render->height - render->image_height - render->ypad;
+ break;
+ case GST_TEXT_RENDER_VALIGN_BASELINE:
+ ypos = render->height - (render->image_height + render->ypad);
+ break;
+ case GST_TEXT_RENDER_VALIGN_TOP:
+ ypos = render->ypad;
+ break;
+ default:
+ ypos = render->ypad;
+ break;
+ }
+
+ if (render->text_image) {
+ if (render->use_ARGB) {
+ gst_text_renderer_image_to_argb (render, data, xpos, ypos,
+ render->width * 4);
+ } else {
+ gst_text_renderer_image_to_ayuv (render, data, xpos, ypos,
+ render->width * 4);
+ }
+ }
+ gst_buffer_unmap (outbuf, data, size);
+
+ ret = gst_pad_push (render->srcpad, outbuf);
+
+done:
+ if (caps)
+ gst_caps_unref (caps);
+ gst_buffer_unref (inbuf);
+ gst_object_unref (render);
+ return ret;
+}
+
+static void
+gst_text_render_finalize (GObject * object)
+{
+ GstTextRender *render = GST_TEXT_RENDER (object);
+
+ g_free (render->text_image);
+
+ if (render->layout)
+ g_object_unref (render->layout);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_text_render_init (GstTextRender * render)
+{
+ GstPadTemplate *template;
+
+ /* sink */
+ template = gst_static_pad_template_get (&sink_template_factory);
+ render->sinkpad = gst_pad_new_from_template (template, "sink");
+ gst_object_unref (template);
+ gst_pad_set_chain_function (render->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_text_render_chain));
+ gst_element_add_pad (GST_ELEMENT (render), render->sinkpad);
+
+ /* source */
+ template = gst_static_pad_template_get (&src_template_factory);
+ render->srcpad = gst_pad_new_from_template (template, "src");
+ gst_object_unref (template);
+ gst_pad_set_fixatecaps_function (render->srcpad,
+ GST_DEBUG_FUNCPTR (gst_text_render_fixate_caps));
+
+ gst_element_add_pad (GST_ELEMENT (render), render->srcpad);
+
+ render->line_align = DEFAULT_PROP_LINE_ALIGNMENT;
+ render->layout =
+ pango_layout_new (GST_TEXT_RENDER_GET_CLASS (render)->pango_context);
+ pango_layout_set_alignment (render->layout,
+ (PangoAlignment) render->line_align);
+
+ render->halign = DEFAULT_PROP_HALIGNMENT;
+ render->valign = DEFAULT_PROP_VALIGNMENT;
+ render->xpad = DEFAULT_PROP_XPAD;
+ render->ypad = DEFAULT_PROP_YPAD;
+
+ render->width = DEFAULT_RENDER_WIDTH;
+ render->height = DEFAULT_RENDER_HEIGHT;
+
+ render->use_ARGB = FALSE;
+}
+
+static void
+gst_text_render_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTextRender *render = GST_TEXT_RENDER (object);
+
+ switch (prop_id) {
+ case PROP_VALIGNMENT:
+ render->valign = g_value_get_enum (value);
+ break;
+ case PROP_HALIGNMENT:
+ render->halign = g_value_get_enum (value);
+ break;
+ case PROP_LINE_ALIGNMENT:
+ render->line_align = g_value_get_enum (value);
+ pango_layout_set_alignment (render->layout,
+ (PangoAlignment) render->line_align);
+ break;
+ case PROP_XPAD:
+ render->xpad = g_value_get_int (value);
+ break;
+ case PROP_YPAD:
+ render->ypad = g_value_get_int (value);
+ break;
+ case PROP_FONT_DESC:
+ {
+ PangoFontDescription *desc;
+
+ desc = pango_font_description_from_string (g_value_get_string (value));
+ if (desc) {
+ GST_LOG ("font description set: %s", g_value_get_string (value));
+ GST_OBJECT_LOCK (render);
+ pango_layout_set_font_description (render->layout, desc);
+ gst_text_render_adjust_values_with_fontdesc (render, desc);
+ pango_font_description_free (desc);
+ gst_text_render_render_pangocairo (render);
+ GST_OBJECT_UNLOCK (render);
+ } else {
+ GST_WARNING ("font description parse failed: %s",
+ g_value_get_string (value));
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+static void
+gst_text_render_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTextRender *render = GST_TEXT_RENDER (object);
+
+ switch (prop_id) {
+ case PROP_VALIGNMENT:
+ g_value_set_enum (value, render->valign);
+ break;
+ case PROP_HALIGNMENT:
+ g_value_set_enum (value, render->halign);
+ break;
+ case PROP_LINE_ALIGNMENT:
+ g_value_set_enum (value, render->line_align);
+ break;
+ case PROP_XPAD:
+ g_value_set_int (value, render->xpad);
+ break;
+ case PROP_YPAD:
+ g_value_set_int (value, render->ypad);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/ext/pango/gsttextrender.h b/ext/pango/gsttextrender.h
new file mode 100644
index 0000000..66d37db
--- /dev/null
+++ b/ext/pango/gsttextrender.h
@@ -0,0 +1,104 @@
+#ifndef __GST_TEXT_RENDER_H__
+#define __GST_TEXT_RENDER_H__
+
+#include <gst/gst.h>
+#include <pango/pangocairo.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TEXT_RENDER (gst_text_render_get_type())
+#define GST_TEXT_RENDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
+ GST_TYPE_TEXT_RENDER, GstTextRender))
+#define GST_TEXT_RENDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\
+ GST_TYPE_TEXT_RENDER, GstTextRenderClass))
+#define GST_TEXT_RENDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
+ GST_TYPE_TEXT_RENDER, GstTextRenderClass))
+#define GST_IS_TEXT_RENDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\
+ GST_TYPE_TEXT_RENDER))
+#define GST_IS_TEXT_RENDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\
+ GST_TYPE_TEXT_RENDER))
+
+typedef struct _GstTextRender GstTextRender;
+typedef struct _GstTextRenderClass GstTextRenderClass;
+
+/**
+ * GstTextRenderVAlign:
+ * @GST_TEXT_RENDER_VALIGN_BASELINE: draw text on the baseline
+ * @GST_TEXT_RENDER_VALIGN_BOTTOM: draw text on the bottom
+ * @GST_TEXT_RENDER_VALIGN_TOP: draw test on top
+ *
+ * Vertical alignment of the text.
+ */
+typedef enum {
+ GST_TEXT_RENDER_VALIGN_BASELINE,
+ GST_TEXT_RENDER_VALIGN_BOTTOM,
+ GST_TEXT_RENDER_VALIGN_TOP
+} GstTextRenderVAlign;
+
+/**
+ * GstTextRenderHAlign:
+ * @GST_TEXT_RENDER_HALIGN_LEFT: align text left
+ * @GST_TEXT_RENDER_HALIGN_CENTER: align text center
+ * @GST_TEXT_RENDER_HALIGN_RIGHT: align text right
+ *
+ * Horizontal alignment of the text.
+ */
+typedef enum {
+ GST_TEXT_RENDER_HALIGN_LEFT,
+ GST_TEXT_RENDER_HALIGN_CENTER,
+ GST_TEXT_RENDER_HALIGN_RIGHT
+} GstTextRenderHAlign;
+
+/**
+ * GstTextRenderLineAlign:
+ * @GST_TEXT_RENDER_LINE_ALIGN_LEFT: lines are left-aligned
+ * @GST_TEXT_RENDER_LINE_ALIGN_CENTER: lines are center-aligned
+ * @GST_TEXT_RENDER_LINE_ALIGN_RIGHT: lines are right-aligned
+ *
+ * Alignment of text lines relative to each other
+ */
+typedef enum {
+ GST_TEXT_RENDER_LINE_ALIGN_LEFT = PANGO_ALIGN_LEFT,
+ GST_TEXT_RENDER_LINE_ALIGN_CENTER = PANGO_ALIGN_CENTER,
+ GST_TEXT_RENDER_LINE_ALIGN_RIGHT = PANGO_ALIGN_RIGHT
+} GstTextRenderLineAlign;
+
+/**
+ * GstTextRender:
+ *
+ * Opaque textrender data structure.
+ */
+struct _GstTextRender {
+ GstElement element;
+
+ GstPad *sinkpad, *srcpad;
+ gint width;
+ gint height;
+ PangoLayout *layout;
+ gdouble shadow_offset;
+ gdouble outline_offset;
+ guchar *text_image;
+ gint image_width;
+ gint image_height;
+ gint baseline_y;
+ gboolean use_ARGB;
+
+ GstTextRenderVAlign valign;
+ GstTextRenderHAlign halign;
+ GstTextRenderLineAlign line_align;
+
+ gint xpad;
+ gint ypad;
+};
+
+struct _GstTextRenderClass {
+ GstElementClass parent_class;
+
+ PangoContext *pango_context;
+};
+
+GType gst_text_render_get_type(void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GST_TEXT_RENDER_H */
diff --git a/ext/pango/gsttimeoverlay.c b/ext/pango/gsttimeoverlay.c
new file mode 100644
index 0000000..3617361
--- /dev/null
+++ b/ext/pango/gsttimeoverlay.c
@@ -0,0 +1,150 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2005> Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-timeoverlay
+ * @see_also: #GstBaseTextOverlay, #GstClockOverlay
+ *
+ * This element overlays the buffer time stamps of a video stream on
+ * top of itself. You can position the text and configure the font details
+ * using the properties of the #GstBaseTextOverlay class. By default, the
+ * time stamp is displayed in the top left corner of the picture, with some
+ * padding to the left and to the top.
+ *
+ * <refsect2>
+ * |[
+ * gst-launch -v videotestsrc ! timeoverlay ! xvimagesink
+ * ]| Display the time stamps in the top left
+ * corner of the video picture.
+ * |[
+ * gst-launch -v videotestsrc ! timeoverlay halign=right valign=bottom text="Stream time:" shaded-background=true ! xvimagesink
+ * ]| Another pipeline that displays the time stamps with some leading
+ * text in the bottom right corner of the video picture, with the background
+ * of the text being shaded in order to make it more legible on top of a
+ * bright video background.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/video/video.h>
+
+#include <gsttimeoverlay.h>
+
+#define gst_time_overlay_parent_class parent_class
+G_DEFINE_TYPE (GstTimeOverlay, gst_time_overlay, GST_TYPE_BASE_TEXT_OVERLAY);
+
+static gchar *
+gst_time_overlay_render_time (GstTimeOverlay * overlay, GstClockTime time)
+{
+ guint hours, mins, secs, msecs;
+
+ if (!GST_CLOCK_TIME_IS_VALID (time))
+ return g_strdup ("");
+
+ hours = (guint) (time / (GST_SECOND * 60 * 60));
+ mins = (guint) ((time / (GST_SECOND * 60)) % 60);
+ secs = (guint) ((time / GST_SECOND) % 60);
+ msecs = (guint) ((time % GST_SECOND) / (1000 * 1000));
+
+ return g_strdup_printf ("%u:%02u:%02u.%03u", hours, mins, secs, msecs);
+}
+
+/* Called with lock held */
+static gchar *
+gst_time_overlay_get_text (GstBaseTextOverlay * overlay,
+ GstBuffer * video_frame)
+{
+ GstClockTime time = GST_BUFFER_TIMESTAMP (video_frame);
+ gchar *time_str, *txt, *ret;
+
+ overlay->need_render = TRUE;
+
+ if (!GST_CLOCK_TIME_IS_VALID (time)) {
+ GST_DEBUG ("buffer without valid timestamp");
+ return g_strdup ("");
+ }
+
+ GST_DEBUG ("buffer with timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (time));
+
+ txt = g_strdup (overlay->default_text);
+
+ time_str = gst_time_overlay_render_time (GST_TIME_OVERLAY (overlay), time);
+ if (txt != NULL && *txt != '\0') {
+ ret = g_strdup_printf ("%s %s", txt, time_str);
+ } else {
+ ret = time_str;
+ time_str = NULL;
+ }
+
+ g_free (txt);
+ g_free (time_str);
+
+ return ret;
+}
+
+static void
+gst_time_overlay_class_init (GstTimeOverlayClass * klass)
+{
+ GstElementClass *gstelement_class;
+ GstBaseTextOverlayClass *gsttextoverlay_class;
+ PangoContext *context;
+ PangoFontDescription *font_description;
+
+ gsttextoverlay_class = (GstBaseTextOverlayClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gst_element_class_set_details_simple (gstelement_class, "Time overlay",
+ "Filter/Editor/Video",
+ "Overlays buffer time stamps on a video stream",
+ "Tim-Philipp Müller <tim@centricular.net>");
+
+ gsttextoverlay_class->get_text = gst_time_overlay_get_text;
+
+ g_mutex_lock (gsttextoverlay_class->pango_lock);
+ context = gsttextoverlay_class->pango_context;
+
+ pango_context_set_language (context, pango_language_from_string ("en_US"));
+ pango_context_set_base_dir (context, PANGO_DIRECTION_LTR);
+
+ font_description = pango_font_description_new ();
+ pango_font_description_set_family_static (font_description, "Monospace");
+ pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL);
+ pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL);
+ pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL);
+ pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL);
+ pango_font_description_set_size (font_description, 18 * PANGO_SCALE);
+ pango_context_set_font_description (context, font_description);
+ pango_font_description_free (font_description);
+ g_mutex_unlock (gsttextoverlay_class->pango_lock);
+}
+
+static void
+gst_time_overlay_init (GstTimeOverlay * overlay)
+{
+ GstBaseTextOverlay *textoverlay;
+
+ textoverlay = GST_BASE_TEXT_OVERLAY (overlay);
+
+ textoverlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_TOP;
+ textoverlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_LEFT;
+}
diff --git a/ext/pango/gsttimeoverlay.h b/ext/pango/gsttimeoverlay.h
new file mode 100644
index 0000000..dbce8ff
--- /dev/null
+++ b/ext/pango/gsttimeoverlay.h
@@ -0,0 +1,61 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2005> Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TIME_OVERLAY_H__
+#define __GST_TIME_OVERLAY_H__
+
+#include "gstbasetextoverlay.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TIME_OVERLAY \
+ (gst_time_overlay_get_type())
+#define GST_TIME_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TIME_OVERLAY,GstTimeOverlay))
+#define GST_TIME_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TIME_OVERLAY,GstTimeOverlayClass))
+#define GST_IS_TIME_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TIME_OVERLAY))
+#define GST_IS_TIME_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TIME_OVERLAY))
+
+typedef struct _GstTimeOverlay GstTimeOverlay;
+typedef struct _GstTimeOverlayClass GstTimeOverlayClass;
+
+/**
+ * GstTimeOverlay:
+ *
+ * Opaque timeoverlay data structure.
+ */
+struct _GstTimeOverlay {
+ GstBaseTextOverlay textoverlay;
+};
+
+struct _GstTimeOverlayClass {
+ GstBaseTextOverlayClass parent_class;
+};
+
+GType gst_time_overlay_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TIME_OVERLAY_H__ */
+
diff --git a/ext/theora/Makefile.am b/ext/theora/Makefile.am
new file mode 100644
index 0000000..c4a5eec
--- /dev/null
+++ b/ext/theora/Makefile.am
@@ -0,0 +1,21 @@
+plugin_LTLIBRARIES = libgsttheora.la
+
+noinst_HEADERS = gsttheoraenc.h \
+ gsttheoradec.h \
+ gsttheoraparse.h
+
+libgsttheora_la_SOURCES = gsttheora.c \
+ gsttheoraenc.c \
+ gsttheoradec.c \
+ gsttheoraparse.c
+
+libgsttheora_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(THEORA_CFLAGS)
+libgsttheora_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(THEORA_LIBS)
+libgsttheora_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttheora_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/ext/theora/Makefile.in b/ext/theora/Makefile.in
new file mode 100644
index 0000000..dc2e47d
--- /dev/null
+++ b/ext/theora/Makefile.in
@@ -0,0 +1,800 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/theora
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgsttheora_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgsttheora_la_OBJECTS = libgsttheora_la-gsttheora.lo \
+ libgsttheora_la-gsttheoraenc.lo \
+ libgsttheora_la-gsttheoradec.lo \
+ libgsttheora_la-gsttheoraparse.lo
+libgsttheora_la_OBJECTS = $(am_libgsttheora_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgsttheora_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgsttheora_la_CFLAGS) $(CFLAGS) \
+ $(libgsttheora_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgsttheora_la_SOURCES)
+DIST_SOURCES = $(libgsttheora_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgsttheora.la
+noinst_HEADERS = gsttheoraenc.h \
+ gsttheoradec.h \
+ gsttheoraparse.h
+
+libgsttheora_la_SOURCES = gsttheora.c \
+ gsttheoraenc.c \
+ gsttheoradec.c \
+ gsttheoraparse.c
+
+libgsttheora_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(THEORA_CFLAGS)
+libgsttheora_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(THEORA_LIBS)
+
+libgsttheora_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttheora_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 ext/theora/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/theora/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
+libgsttheora.la: $(libgsttheora_la_OBJECTS) $(libgsttheora_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgsttheora_la_LINK) -rpath $(plugindir) $(libgsttheora_la_OBJECTS) $(libgsttheora_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttheora_la-gsttheora.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttheora_la-gsttheoradec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttheora_la-gsttheoraenc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttheora_la-gsttheoraparse.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgsttheora_la-gsttheora.lo: gsttheora.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -MT libgsttheora_la-gsttheora.lo -MD -MP -MF $(DEPDIR)/libgsttheora_la-gsttheora.Tpo -c -o libgsttheora_la-gsttheora.lo `test -f 'gsttheora.c' || echo '$(srcdir)/'`gsttheora.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttheora_la-gsttheora.Tpo $(DEPDIR)/libgsttheora_la-gsttheora.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttheora.c' object='libgsttheora_la-gsttheora.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -c -o libgsttheora_la-gsttheora.lo `test -f 'gsttheora.c' || echo '$(srcdir)/'`gsttheora.c
+
+libgsttheora_la-gsttheoraenc.lo: gsttheoraenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -MT libgsttheora_la-gsttheoraenc.lo -MD -MP -MF $(DEPDIR)/libgsttheora_la-gsttheoraenc.Tpo -c -o libgsttheora_la-gsttheoraenc.lo `test -f 'gsttheoraenc.c' || echo '$(srcdir)/'`gsttheoraenc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttheora_la-gsttheoraenc.Tpo $(DEPDIR)/libgsttheora_la-gsttheoraenc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttheoraenc.c' object='libgsttheora_la-gsttheoraenc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -c -o libgsttheora_la-gsttheoraenc.lo `test -f 'gsttheoraenc.c' || echo '$(srcdir)/'`gsttheoraenc.c
+
+libgsttheora_la-gsttheoradec.lo: gsttheoradec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -MT libgsttheora_la-gsttheoradec.lo -MD -MP -MF $(DEPDIR)/libgsttheora_la-gsttheoradec.Tpo -c -o libgsttheora_la-gsttheoradec.lo `test -f 'gsttheoradec.c' || echo '$(srcdir)/'`gsttheoradec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttheora_la-gsttheoradec.Tpo $(DEPDIR)/libgsttheora_la-gsttheoradec.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttheoradec.c' object='libgsttheora_la-gsttheoradec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -c -o libgsttheora_la-gsttheoradec.lo `test -f 'gsttheoradec.c' || echo '$(srcdir)/'`gsttheoradec.c
+
+libgsttheora_la-gsttheoraparse.lo: gsttheoraparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -MT libgsttheora_la-gsttheoraparse.lo -MD -MP -MF $(DEPDIR)/libgsttheora_la-gsttheoraparse.Tpo -c -o libgsttheora_la-gsttheoraparse.lo `test -f 'gsttheoraparse.c' || echo '$(srcdir)/'`gsttheoraparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttheora_la-gsttheoraparse.Tpo $(DEPDIR)/libgsttheora_la-gsttheoraparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttheoraparse.c' object='libgsttheora_la-gsttheoraparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttheora_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttheora_la_CFLAGS) $(CFLAGS) -c -o libgsttheora_la-gsttheoraparse.lo `test -f 'gsttheoraparse.c' || echo '$(srcdir)/'`gsttheoraparse.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/theora/gsttheora.c b/ext/theora/gsttheora.c
new file mode 100644
index 0000000..37f3211
--- /dev/null
+++ b/ext/theora/gsttheora.c
@@ -0,0 +1,52 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+extern GType gst_theora_dec_get_type (void);
+extern GType gst_theora_enc_get_type (void);
+extern GType gst_theora_parse_get_type (void);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "theoradec", GST_RANK_PRIMARY,
+ gst_theora_dec_get_type ()))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "theoraenc", GST_RANK_PRIMARY,
+ gst_theora_enc_get_type ()))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "theoraparse", GST_RANK_NONE,
+ gst_theora_parse_get_type ()))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "theora",
+ "Theora plugin library",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/theora/gsttheoradec.c b/ext/theora/gsttheoradec.c
new file mode 100644
index 0000000..a7418b8
--- /dev/null
+++ b/ext/theora/gsttheoradec.c
@@ -0,0 +1,1723 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.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.
+ */
+
+/**
+ * SECTION:element-theoradec
+ * @see_also: theoraenc, oggdemux
+ *
+ * This element decodes theora streams into raw video
+ * <ulink url="http://www.theora.org/">Theora</ulink> is a royalty-free
+ * video codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
+ * Foundation</ulink>, based on the VP3 codec.
+ *
+ * <refsect2>
+ * <title>Example pipeline</title>
+ * |[
+ * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! xvimagesink
+ * ]| This example pipeline will decode an ogg stream and decodes the theora video. Refer to
+ * the theoraenc example to create the ogg file.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gsttheoradec.h"
+#include <gst/tag/tag.h>
+#include <gst/video/video.h>
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+#define GST_CAT_DEFAULT theoradec_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+#define THEORA_DEF_CROP TRUE
+#define THEORA_DEF_TELEMETRY_MV 0
+#define THEORA_DEF_TELEMETRY_MBMODE 0
+#define THEORA_DEF_TELEMETRY_QI 0
+#define THEORA_DEF_TELEMETRY_BITS 0
+
+enum
+{
+ PROP_0,
+ PROP_CROP,
+ PROP_TELEMETRY_MV,
+ PROP_TELEMETRY_MBMODE,
+ PROP_TELEMETRY_QI,
+ PROP_TELEMETRY_BITS
+};
+
+static GstStaticPadTemplate theora_dec_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw, "
+ "format = (string) { I420, Y42B, Y444 }, "
+ "framerate = (fraction) [0/1, MAX], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")
+ );
+
+static GstStaticPadTemplate theora_dec_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-theora")
+ );
+
+#define gst_theora_dec_parent_class parent_class
+G_DEFINE_TYPE (GstTheoraDec, gst_theora_dec, GST_TYPE_ELEMENT);
+
+static void theora_dec_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void theora_dec_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+
+static gboolean theora_dec_setcaps (GstTheoraDec * dec, GstCaps * caps);
+static gboolean theora_dec_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn theora_dec_chain (GstPad * pad, GstBuffer * buffer);
+static GstStateChangeReturn theora_dec_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean theora_dec_src_event (GstPad * pad, GstEvent * event);
+static gboolean theora_dec_src_query (GstPad * pad, GstQuery * query);
+static gboolean theora_dec_src_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value);
+
+#if 0
+static const GstFormat *theora_get_formats (GstPad * pad);
+#endif
+#if 0
+static const GstEventMask *theora_get_event_masks (GstPad * pad);
+#endif
+static const GstQueryType *theora_get_query_types (GstPad * pad);
+
+static gboolean
+gst_theora_dec_ctl_is_supported (int req)
+{
+ /* should return TH_EFAULT or TH_EINVAL if supported, and TH_EIMPL if not */
+ return (th_decode_ctl (NULL, req, NULL, 0) != TH_EIMPL);
+}
+
+static void
+gst_theora_dec_class_init (GstTheoraDecClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->set_property = theora_dec_set_property;
+ gobject_class->get_property = theora_dec_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_CROP,
+ g_param_spec_boolean ("crop", "Crop",
+ "Crop the image to the visible region", THEORA_DEF_CROP,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_MV)) {
+ g_object_class_install_property (gobject_class, PROP_TELEMETRY_MV,
+ g_param_spec_int ("visualize-motion-vectors",
+ "Visualize motion vectors",
+ "Show motion vector selection overlaid on image. "
+ "Value gives a mask for motion vector (MV) modes to show",
+ 0, 0xffff, THEORA_DEF_TELEMETRY_MV,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ }
+
+ if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_MBMODE)) {
+ g_object_class_install_property (gobject_class, PROP_TELEMETRY_MBMODE,
+ g_param_spec_int ("visualize-macroblock-modes",
+ "Visualize macroblock modes",
+ "Show macroblock mode selection overlaid on image. "
+ "Value gives a mask for macroblock (MB) modes to show",
+ 0, 0xffff, THEORA_DEF_TELEMETRY_MBMODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ }
+
+ if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_QI)) {
+ g_object_class_install_property (gobject_class, PROP_TELEMETRY_QI,
+ g_param_spec_int ("visualize-quantization-modes",
+ "Visualize adaptive quantization modes",
+ "Show adaptive quantization mode selection overlaid on image. "
+ "Value gives a mask for quantization (QI) modes to show",
+ 0, 0xffff, THEORA_DEF_TELEMETRY_QI,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ }
+
+ if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_BITS)) {
+ /* FIXME: make this a boolean instead? The value scales the bars so
+ * they're less wide. Default is to use full width, and anything else
+ * doesn't seem particularly useful, since the smaller bars just disappear
+ * then (they almost disappear for a value of 2 already). */
+ g_object_class_install_property (gobject_class, PROP_TELEMETRY_BITS,
+ g_param_spec_int ("visualize-bit-usage",
+ "Visualize bitstream usage breakdown",
+ "Sets the bitstream breakdown visualization mode. "
+ "Values influence the width of the bit usage bars to show",
+ 0, 0xff, THEORA_DEF_TELEMETRY_BITS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ }
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_dec_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_dec_sink_factory));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Theora video decoder", "Codec/Decoder/Video",
+ "decode raw theora streams to raw YUV video",
+ "Benjamin Otte <otte@gnome.org>, Wim Taymans <wim@fluendo.com>");
+
+ gstelement_class->change_state = theora_dec_change_state;
+
+ GST_DEBUG_CATEGORY_INIT (theoradec_debug, "theoradec", 0, "Theora decoder");
+}
+
+static void
+gst_theora_dec_init (GstTheoraDec * dec)
+{
+ dec->sinkpad =
+ gst_pad_new_from_static_template (&theora_dec_sink_factory, "sink");
+ gst_pad_set_event_function (dec->sinkpad, theora_dec_sink_event);
+ gst_pad_set_chain_function (dec->sinkpad, theora_dec_chain);
+ gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
+
+ dec->srcpad =
+ gst_pad_new_from_static_template (&theora_dec_src_factory, "src");
+ gst_pad_set_event_function (dec->srcpad, theora_dec_src_event);
+ gst_pad_set_query_type_function (dec->srcpad, theora_get_query_types);
+ gst_pad_set_query_function (dec->srcpad, theora_dec_src_query);
+ gst_pad_use_fixed_caps (dec->srcpad);
+
+ gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+
+ dec->crop = THEORA_DEF_CROP;
+ dec->telemetry_mv = THEORA_DEF_TELEMETRY_MV;
+ dec->telemetry_mbmode = THEORA_DEF_TELEMETRY_MBMODE;
+ dec->telemetry_qi = THEORA_DEF_TELEMETRY_QI;
+ dec->telemetry_bits = THEORA_DEF_TELEMETRY_BITS;
+ dec->gather = NULL;
+ dec->decode = NULL;
+ dec->queued = NULL;
+ dec->pendingevents = NULL;
+}
+
+static void
+gst_theora_dec_reset (GstTheoraDec * dec)
+{
+ dec->need_keyframe = TRUE;
+ dec->last_timestamp = -1;
+ dec->discont = TRUE;
+ dec->frame_nr = -1;
+ dec->seqnum = gst_util_seqnum_next ();
+ dec->dropped = 0;
+ dec->processed = 0;
+ gst_segment_init (&dec->segment, GST_FORMAT_TIME);
+
+ GST_OBJECT_LOCK (dec);
+ dec->proportion = 1.0;
+ dec->earliest_time = -1;
+ GST_OBJECT_UNLOCK (dec);
+
+ g_list_foreach (dec->queued, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->queued);
+ dec->queued = NULL;
+ g_list_foreach (dec->gather, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->gather);
+ dec->gather = NULL;
+ g_list_foreach (dec->decode, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->decode);
+ dec->decode = NULL;
+ g_list_foreach (dec->pendingevents, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->pendingevents);
+ dec->pendingevents = NULL;
+
+ if (dec->tags) {
+ gst_tag_list_free (dec->tags);
+ dec->tags = NULL;
+ }
+}
+
+#if 0
+static const GstFormat *
+theora_get_formats (GstPad * pad)
+{
+ static GstFormat src_formats[] = {
+ GST_FORMAT_DEFAULT, /* frames in this case */
+ GST_FORMAT_TIME,
+ GST_FORMAT_BYTES,
+ 0
+ };
+ static GstFormat sink_formats[] = {
+ GST_FORMAT_DEFAULT,
+ GST_FORMAT_TIME,
+ 0
+ };
+
+ return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats);
+}
+#endif
+
+#if 0
+static const GstEventMask *
+theora_get_event_masks (GstPad * pad)
+{
+ static const GstEventMask theora_src_event_masks[] = {
+ {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH},
+ {0,}
+ };
+
+ return theora_src_event_masks;
+}
+#endif
+
+static const GstQueryType *
+theora_get_query_types (GstPad * pad)
+{
+ static const GstQueryType theora_src_query_types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return theora_src_query_types;
+}
+
+
+static gboolean
+theora_dec_src_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstTheoraDec *dec;
+ guint64 scale = 1;
+
+ if (src_format == *dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ /* we need the info part before we can done something */
+ if (!dec->have_header)
+ goto no_header;
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ *dest_value = gst_util_uint64_scale_int (src_value, 8,
+ dec->info.pic_height * dec->info.pic_width * dec->output_bpp);
+ break;
+ case GST_FORMAT_TIME:
+ /* seems like a rather silly conversion, implement me if you like */
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ scale =
+ dec->output_bpp * (dec->info.pic_width * dec->info.pic_height) /
+ 8;
+ case GST_FORMAT_DEFAULT:
+ *dest_value = scale * gst_util_uint64_scale (src_value,
+ dec->info.fps_numerator, dec->info.fps_denominator * GST_SECOND);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * dec->info.fps_denominator, dec->info.fps_numerator);
+ break;
+ case GST_FORMAT_BYTES:
+ *dest_value = gst_util_uint64_scale_int (src_value,
+ dec->output_bpp * dec->info.pic_width * dec->info.pic_height, 8);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+done:
+ gst_object_unref (dec);
+ return res;
+
+ /* ERRORS */
+no_header:
+ {
+ GST_DEBUG_OBJECT (dec, "no header yet, cannot convert");
+ res = FALSE;
+ goto done;
+ }
+}
+
+#if 0
+static gboolean
+theora_dec_sink_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstTheoraDec *dec;
+
+ if (src_format == *dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ /* we need the info part before we can done something */
+ if (!dec->have_header)
+ goto no_header;
+
+ switch (src_format) {
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = _theora_granule_start_time (dec, src_value);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ {
+ guint rest;
+
+ /* framecount */
+ *dest_value = gst_util_uint64_scale (src_value,
+ dec->info.fps_numerator, GST_SECOND * dec->info.fps_denominator);
+
+ /* funny way of calculating granulepos in theora */
+ rest = *dest_value / dec->info.keyframe_granule_shift;
+ *dest_value -= rest;
+ *dest_value <<= dec->granule_shift;
+ *dest_value += rest;
+ break;
+ }
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+done:
+ gst_object_unref (dec);
+ return res;
+
+ /* ERRORS */
+no_header:
+ {
+ GST_DEBUG_OBJECT (dec, "no header yet, cannot convert");
+ res = FALSE;
+ goto done;
+ }
+}
+#endif
+
+static gboolean
+theora_dec_src_query (GstPad * pad, GstQuery * query)
+{
+ GstTheoraDec *dec;
+
+ gboolean res = FALSE;
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 value;
+ GstFormat format;
+ gint64 time;
+
+ /* parse format */
+ gst_query_parse_position (query, &format, NULL);
+
+ time = dec->last_timestamp;
+ time = gst_segment_to_stream_time (&dec->segment, GST_FORMAT_TIME, time);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: our time: %" GST_TIME_FORMAT, query, GST_TIME_ARGS (time));
+
+ if (!(res =
+ theora_dec_src_convert (pad, GST_FORMAT_TIME, time, &format,
+ &value)))
+ goto error;
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: we return %" G_GINT64_FORMAT " (format %u)", query, value,
+ format);
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ /* forward to peer for total */
+ res = gst_pad_peer_query (dec->sinkpad, query);
+ if (!res)
+ goto error;
+
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!(res =
+ theora_dec_src_convert (pad, src_fmt, src_val, &dest_fmt,
+ &dest_val)))
+ goto error;
+
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (dec, "query failed");
+ goto done;
+ }
+}
+
+static gboolean
+theora_dec_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstTheoraDec *dec;
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ GstFormat format, tformat;
+ gdouble rate;
+ GstEvent *real_seek;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ gint64 tcur, tstop;
+ guint32 seqnum;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+ &stop_type, &stop);
+ seqnum = gst_event_get_seqnum (event);
+ gst_event_unref (event);
+
+ /* we have to ask our peer to seek to time here as we know
+ * nothing about how to generate a granulepos from the src
+ * formats or anything.
+ *
+ * First bring the requested format to time
+ */
+ tformat = GST_FORMAT_TIME;
+ if (!(res = theora_dec_src_convert (pad, format, cur, &tformat, &tcur)))
+ goto convert_error;
+ if (!(res = theora_dec_src_convert (pad, format, stop, &tformat, &tstop)))
+ goto convert_error;
+
+ /* then seek with time on the peer */
+ real_seek = gst_event_new_seek (rate, GST_FORMAT_TIME,
+ flags, cur_type, tcur, stop_type, tstop);
+ gst_event_set_seqnum (real_seek, seqnum);
+
+ res = gst_pad_push_event (dec->sinkpad, real_seek);
+ break;
+ }
+ case GST_EVENT_QOS:
+ {
+ gdouble proportion;
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, NULL, &proportion, &diff, &timestamp);
+
+ /* we cannot randomly skip frame decoding since we don't have
+ * B frames. we can however use the timestamp and diff to not
+ * push late frames. This would at least save us the time to
+ * crop/memcpy the data. */
+ GST_OBJECT_LOCK (dec);
+ dec->proportion = proportion;
+ dec->earliest_time = timestamp + diff;
+ GST_OBJECT_UNLOCK (dec);
+
+ GST_DEBUG_OBJECT (dec, "got QoS %" GST_TIME_FORMAT ", %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (timestamp), diff);
+
+ res = gst_pad_push_event (dec->sinkpad, event);
+ break;
+ }
+ default:
+ res = gst_pad_push_event (dec->sinkpad, event);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+convert_error:
+ {
+ GST_DEBUG_OBJECT (dec, "could not convert format");
+ goto done;
+ }
+}
+
+static gboolean
+theora_dec_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstTheoraDec *dec;
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ GST_LOG_OBJECT (dec, "handling event");
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ gst_theora_dec_reset (dec);
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_EOS:
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ /* we need TIME format */
+ if (segment->format != GST_FORMAT_TIME)
+ goto newseg_wrong_format;
+
+ GST_DEBUG_OBJECT (dec, "segment: %" GST_SEGMENT_FORMAT, segment);
+
+ /* now configure the values */
+ gst_segment_copy_into (segment, &dec->segment);
+ dec->seqnum = gst_event_get_seqnum (event);
+
+ /* We don't forward this unless/until the decoder is initialised */
+ if (dec->have_header) {
+ ret = gst_pad_push_event (dec->srcpad, event);
+ } else {
+ dec->pendingevents = g_list_append (dec->pendingevents, event);
+ ret = TRUE;
+ }
+ break;
+ }
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = theora_dec_setcaps (dec, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_TAG:
+ {
+ if (dec->have_header)
+ /* and forward */
+ ret = gst_pad_push_event (dec->srcpad, event);
+ else {
+ /* store it to send once we're initialized */
+ dec->pendingevents = g_list_append (dec->pendingevents, event);
+ ret = TRUE;
+ }
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return ret;
+
+ /* ERRORS */
+newseg_wrong_format:
+ {
+ GST_DEBUG_OBJECT (dec, "received non TIME newsegment");
+ gst_event_unref (event);
+ goto done;
+ }
+}
+
+static gboolean
+theora_dec_setcaps (GstTheoraDec * dec, GstCaps * caps)
+{
+ GstStructure *s;
+ const GValue *codec_data;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ /* parse the par, this overrides the encoded par */
+ dec->have_par = gst_structure_get_fraction (s, "pixel-aspect-ratio",
+ &dec->par_num, &dec->par_den);
+
+ if ((codec_data = gst_structure_get_value (s, "codec_data"))) {
+ if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) {
+ GstBuffer *buffer;
+ guint8 *data, *ptr;
+ gsize size, left;
+ guint offset;
+
+ buffer = gst_value_get_buffer (codec_data);
+
+ offset = 0;
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ ptr = data;
+ left = size;
+
+ while (left > 2) {
+ guint psize;
+ GstBuffer *buf;
+
+ psize = (ptr[0] << 8) | ptr[1];
+ /* skip header */
+ ptr += 2;
+ left -= 2;
+ offset += 2;
+
+ /* make sure we don't read too much */
+ psize = MIN (psize, left);
+
+ buf =
+ gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, offset, psize);
+
+ /* first buffer is a discont buffer */
+ if (offset == 2)
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+
+ /* now feed it to the decoder we can ignore the error */
+ theora_dec_chain (dec->sinkpad, buf);
+
+ /* skip the data */
+ left -= psize;
+ ptr += psize;
+ offset += psize;
+ }
+ gst_buffer_unmap (buffer, data, size);
+ }
+ }
+
+ return TRUE;
+}
+
+static GstFlowReturn
+theora_handle_comment_packet (GstTheoraDec * dec, ogg_packet * packet)
+{
+ gchar *encoder = NULL;
+ GstTagList *list;
+
+ GST_DEBUG_OBJECT (dec, "parsing comment packet");
+
+ list =
+ gst_tag_list_from_vorbiscomment (packet->packet, packet->bytes,
+ (guint8 *) "\201theora", 7, &encoder);
+
+ if (!list) {
+ GST_ERROR_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);
+ g_free (encoder);
+ }
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER_VERSION, dec->info.version_major,
+ GST_TAG_VIDEO_CODEC, "Theora", NULL);
+
+ if (dec->info.target_bitrate > 0) {
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, dec->info.target_bitrate,
+ GST_TAG_NOMINAL_BITRATE, dec->info.target_bitrate, NULL);
+ }
+
+ dec->tags = list;
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+theora_negotiate_pool (GstTheoraDec * dec, GstCaps * caps, GstVideoInfo * info)
+{
+ GstQuery *query;
+ GstBufferPool *pool = NULL;
+ guint size, min, max, prefix, alignment;
+ GstStructure *config;
+
+ /* find a pool for the negotiated caps now */
+ query = gst_query_new_allocation (caps, TRUE);
+
+ if (gst_pad_peer_query (dec->srcpad, query)) {
+ GST_DEBUG_OBJECT (dec, "got downstream ALLOCATION hints");
+ /* we got configuration from our peer, parse them */
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+ size = MAX (size, info->size);
+ } else {
+ GST_DEBUG_OBJECT (dec, "didn't get downstream ALLOCATION hints");
+ size = info->size;
+ min = max = 0;
+ prefix = 0;
+ alignment = 0;
+ }
+
+ if (pool == NULL) {
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_buffer_pool_new ();
+ }
+
+ if (dec->pool)
+ gst_object_unref (dec->pool);
+ dec->pool = pool;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, caps, size, min, max, prefix, alignment);
+ /* just set the option, if the pool can support it we will transparently use
+ * it through the video info API. We could also see if the pool support this
+ * option and only activate it then. */
+ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_META_VIDEO);
+
+ /* check if downstream supports cropping */
+ dec->use_cropping =
+ gst_query_has_allocation_meta (query, GST_META_API_VIDEO_CROP);
+
+ gst_buffer_pool_set_config (pool, config);
+ /* and activate */
+ gst_buffer_pool_set_active (pool, TRUE);
+
+ gst_query_unref (query);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+theora_handle_type_packet (GstTheoraDec * dec, ogg_packet * packet)
+{
+ GstCaps *caps;
+ GstVideoFormat format;
+ gint width, height;
+ gint par_num, par_den;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GList *walk;
+
+ GST_DEBUG_OBJECT (dec, "fps %d/%d, PAR %d/%d",
+ dec->info.fps_numerator, dec->info.fps_denominator,
+ dec->info.aspect_numerator, dec->info.aspect_denominator);
+
+ /* calculate par
+ * the info.aspect_* values reflect PAR;
+ * 0:x and x:0 are allowed and can be interpreted as 1:1.
+ */
+ if (dec->have_par) {
+ /* we had a par on the sink caps, override the encoded par */
+ GST_DEBUG_OBJECT (dec, "overriding with input PAR");
+ par_num = dec->par_num;
+ par_den = dec->par_den;
+ } else {
+ /* take encoded par */
+ par_num = dec->info.aspect_numerator;
+ par_den = dec->info.aspect_denominator;
+ }
+ if (par_num == 0 || par_den == 0) {
+ par_num = par_den = 1;
+ }
+ /* theora has:
+ *
+ * width/height : dimension of the encoded frame
+ * pic_width/pic_height : dimension of the visible part
+ * pic_x/pic_y : offset in encoded frame where visible part starts
+ */
+ GST_DEBUG_OBJECT (dec, "dimension %dx%d, PAR %d/%d", dec->info.pic_width,
+ dec->info.pic_height, par_num, par_den);
+ GST_DEBUG_OBJECT (dec, "frame dimension %dx%d, offset %d:%d",
+ dec->info.pic_width, dec->info.pic_height,
+ dec->info.pic_x, dec->info.pic_y);
+
+ switch (dec->info.pixel_fmt) {
+ case TH_PF_444:
+ dec->output_bpp = 24;
+ format = GST_VIDEO_FORMAT_Y444;
+ break;
+ case TH_PF_420:
+ dec->output_bpp = 12; /* Average bits per pixel. */
+ format = GST_VIDEO_FORMAT_I420;
+ break;
+ case TH_PF_422:
+ dec->output_bpp = 16;
+ format = GST_VIDEO_FORMAT_Y42B;
+ break;
+ default:
+ goto invalid_format;
+ }
+
+ if (dec->crop) {
+ width = dec->info.pic_width;
+ height = dec->info.pic_height;
+ dec->offset_x = dec->info.pic_x;
+ dec->offset_y = dec->info.pic_y;
+ /* Ensure correct offsets in chroma for formats that need it
+ * by rounding the offset. libtheora will add proper pixels,
+ * so no need to handle them ourselves. */
+ if (dec->offset_x & 1 && dec->info.pixel_fmt != TH_PF_444) {
+ dec->offset_x--;
+ }
+ if (dec->offset_y & 1 && dec->info.pixel_fmt == TH_PF_420) {
+ dec->offset_y--;
+ }
+ } else {
+ /* no cropping, use the encoded dimensions */
+ width = dec->info.frame_width;
+ height = dec->info.frame_height;
+ dec->offset_x = 0;
+ dec->offset_y = 0;
+ }
+
+ GST_DEBUG_OBJECT (dec, "after fixup frame dimension %dx%d, offset %d:%d",
+ width, height, dec->offset_x, dec->offset_y);
+
+ /* done */
+ dec->decoder = th_decode_alloc (&dec->info, dec->setup);
+
+ if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_MV,
+ &dec->telemetry_mv, sizeof (dec->telemetry_mv)) != TH_EIMPL) {
+ GST_WARNING_OBJECT (dec, "Could not enable MV visualisation");
+ }
+ if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_MBMODE,
+ &dec->telemetry_mbmode, sizeof (dec->telemetry_mbmode)) != TH_EIMPL) {
+ GST_WARNING_OBJECT (dec, "Could not enable MB mode visualisation");
+ }
+ if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_QI,
+ &dec->telemetry_qi, sizeof (dec->telemetry_qi)) != TH_EIMPL) {
+ GST_WARNING_OBJECT (dec, "Could not enable QI mode visualisation");
+ }
+ if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_BITS,
+ &dec->telemetry_bits, sizeof (dec->telemetry_bits)) != TH_EIMPL) {
+ GST_WARNING_OBJECT (dec, "Could not enable BITS mode visualisation");
+ }
+
+ gst_video_info_set_format (&dec->vinfo, format, width, height);
+ dec->vinfo.fps_n = dec->info.fps_numerator;
+ dec->vinfo.fps_d = dec->info.fps_denominator;
+ dec->vinfo.par_n = par_num;
+ dec->vinfo.par_d = par_den;
+
+ /* these values are for all versions of the colorspace specified in the
+ * theora info */
+ dec->vinfo.chroma_site = GST_VIDEO_CHROMA_SITE_JPEG;
+ dec->vinfo.colorimetry.range = GST_VIDEO_COLOR_RANGE_16_235;
+ dec->vinfo.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+ dec->vinfo.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709;
+ switch (dec->info.colorspace) {
+ case TH_CS_ITU_REC_470M:
+ dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470M;
+ break;
+ case TH_CS_ITU_REC_470BG:
+ dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470BG;
+ break;
+ default:
+ dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN;
+ break;
+ }
+
+ caps = gst_video_info_to_caps (&dec->vinfo);
+ gst_pad_set_caps (dec->srcpad, caps);
+ gst_caps_unref (caps);
+
+ /* negotiate a bufferpool */
+ if ((ret = theora_negotiate_pool (dec, caps, &dec->vinfo)) != GST_FLOW_OK)
+ goto no_bufferpool;
+
+ dec->have_header = TRUE;
+
+ if (dec->pendingevents) {
+ for (walk = dec->pendingevents; walk; walk = g_list_next (walk))
+ gst_pad_push_event (dec->srcpad, GST_EVENT_CAST (walk->data));
+ g_list_free (dec->pendingevents);
+ dec->pendingevents = NULL;
+ }
+
+ if (dec->tags) {
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (dec), dec->srcpad,
+ dec->tags);
+ dec->tags = NULL;
+ }
+
+ return ret;
+
+ /* ERRORS */
+invalid_format:
+ {
+ GST_ERROR_OBJECT (dec, "Invalid pixel format %d", dec->info.pixel_fmt);
+ return GST_FLOW_ERROR;
+ }
+no_bufferpool:
+ {
+ return ret;
+ }
+}
+
+static GstFlowReturn
+theora_handle_header_packet (GstTheoraDec * dec, ogg_packet * packet)
+{
+ GstFlowReturn res;
+ int ret;
+
+ GST_DEBUG_OBJECT (dec, "parsing header packet");
+
+ ret = th_decode_headerin (&dec->info, &dec->comment, &dec->setup, packet);
+ if (ret < 0)
+ goto header_read_error;
+
+ switch (packet->packet[0]) {
+ case 0x81:
+ res = theora_handle_comment_packet (dec, packet);
+ break;
+ case 0x82:
+ res = theora_handle_type_packet (dec, packet);
+ break;
+ default:
+ /* ignore */
+ g_warning ("unknown theora header packet found");
+ case 0x80:
+ /* nothing special, this is the identification header */
+ res = GST_FLOW_OK;
+ break;
+ }
+ return res;
+
+ /* ERRORS */
+header_read_error:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE,
+ (NULL), ("couldn't read header packet"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* returns TRUE if buffer is within segment, else FALSE.
+ * if Buffer is on segment border, it's timestamp and duration will be clipped */
+static gboolean
+clip_buffer (GstTheoraDec * dec, GstBuffer * buf)
+{
+ gboolean res = TRUE;
+ GstClockTime in_ts, in_dur, stop;
+ guint64 cstart, cstop;
+
+ in_ts = GST_BUFFER_TIMESTAMP (buf);
+ in_dur = GST_BUFFER_DURATION (buf);
+
+ GST_LOG_OBJECT (dec,
+ "timestamp:%" GST_TIME_FORMAT " , duration:%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (in_ts), GST_TIME_ARGS (in_dur));
+
+ /* can't clip without TIME segment */
+ if (dec->segment.format != GST_FORMAT_TIME)
+ goto beach;
+
+ /* we need a start time */
+ if (!GST_CLOCK_TIME_IS_VALID (in_ts))
+ goto beach;
+
+ /* generate valid stop, if duration unknown, we have unknown stop */
+ stop =
+ GST_CLOCK_TIME_IS_VALID (in_dur) ? (in_ts + in_dur) : GST_CLOCK_TIME_NONE;
+
+ /* now clip */
+ if (!(res = gst_segment_clip (&dec->segment, GST_FORMAT_TIME,
+ in_ts, stop, &cstart, &cstop)))
+ goto beach;
+
+ /* update timestamp and possibly duration if the clipped stop time is
+ * valid */
+ GST_BUFFER_TIMESTAMP (buf) = cstart;
+ if (GST_CLOCK_TIME_IS_VALID (cstop))
+ GST_BUFFER_DURATION (buf) = cstop - cstart;
+
+beach:
+ GST_LOG_OBJECT (dec, "%sdropping", (res ? "not " : ""));
+ return res;
+}
+
+static GstFlowReturn
+theora_dec_push_forward (GstTheoraDec * dec, GstBuffer * buf)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+
+ if (clip_buffer (dec, buf)) {
+ if (dec->discont) {
+ GST_LOG_OBJECT (dec, "setting DISCONT");
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ dec->discont = FALSE;
+ }
+ result = gst_pad_push (dec->srcpad, buf);
+ } else {
+ gst_buffer_unref (buf);
+ }
+
+ return result;
+}
+
+static GstFlowReturn
+theora_dec_push_reverse (GstTheoraDec * dec, GstBuffer * buf)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+
+ dec->queued = g_list_prepend (dec->queued, buf);
+
+ return result;
+}
+
+/* Allocate buffer and copy image data into Y444 format */
+static GstFlowReturn
+theora_handle_image (GstTheoraDec * dec, th_ycbcr_buffer buf, GstBuffer ** out)
+{
+ gint width, height, stride;
+ gint pic_width, pic_height;
+ GstFlowReturn result;
+ int i, comp;
+ guint8 *dest, *src;
+ GstVideoFrame frame;
+ GstMetaVideoCrop *crop;
+ gint offset_x, offset_y;
+
+ if (gst_pad_check_reconfigure (dec->srcpad)) {
+ GstCaps *caps;
+
+ caps = gst_pad_get_current_caps (dec->srcpad);
+ theora_negotiate_pool (dec, caps, &dec->vinfo);
+ gst_caps_unref (caps);
+ }
+
+ result = gst_buffer_pool_acquire_buffer (dec->pool, out, NULL);
+ if (G_UNLIKELY (result != GST_FLOW_OK))
+ goto no_buffer;
+
+ if (!gst_video_frame_map (&frame, &dec->vinfo, *out, GST_MAP_WRITE))
+ goto invalid_frame;
+
+ if (dec->crop && !dec->use_cropping) {
+ /* we need to crop the hard way */
+ offset_x = dec->info.pic_x;
+ offset_y = dec->info.pic_y;
+ pic_width = dec->info.pic_width;
+ pic_height = dec->info.pic_height;
+ /* Ensure correct offsets in chroma for formats that need it
+ * by rounding the offset. libtheora will add proper pixels,
+ * so no need to handle them ourselves. */
+ if (offset_x & 1 && dec->info.pixel_fmt != TH_PF_444)
+ offset_x--;
+ if (offset_y & 1 && dec->info.pixel_fmt == TH_PF_420)
+ offset_y--;
+ } else {
+ /* copy the whole frame */
+ offset_x = 0;
+ offset_y = 0;
+ pic_width = dec->info.frame_width;
+ pic_height = dec->info.frame_height;
+
+ if (dec->use_cropping) {
+ crop = gst_buffer_add_meta_video_crop (*out);
+ /* we can do things slightly more efficient when we know that
+ * downstream understands clipping */
+ crop->x = dec->info.pic_x;
+ crop->y = dec->info.pic_y;
+ crop->width = dec->info.pic_width;
+ crop->height = dec->info.pic_height;
+ }
+ }
+
+ for (comp = 0; comp < 3; comp++) {
+ width =
+ GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame.info.finfo, comp, pic_width);
+ height =
+ GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame.info.finfo, comp, pic_height);
+ stride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, comp);
+ dest = GST_VIDEO_FRAME_COMP_DATA (&frame, comp);
+
+ src = buf[comp].data;
+ src += ((height == pic_height) ? offset_y : offset_y / 2)
+ * buf[comp].stride;
+ src += (width == pic_width) ? offset_x : offset_x / 2;
+
+ for (i = 0; i < height; i++) {
+ memcpy (dest, src, width);
+
+ dest += stride;
+ src += buf[comp].stride;
+ }
+ }
+ gst_video_frame_unmap (&frame);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+no_buffer:
+ {
+ GST_DEBUG_OBJECT (dec, "could not get buffer, reason: %s",
+ gst_flow_get_name (result));
+ return result;
+ }
+invalid_frame:
+ {
+ GST_DEBUG_OBJECT (dec, "could not map video frame");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+theora_handle_data_packet (GstTheoraDec * dec, ogg_packet * packet,
+ GstClockTime outtime, GstClockTime outdur)
+{
+ /* normal data packet */
+ th_ycbcr_buffer buf;
+ GstBuffer *out;
+ gboolean keyframe;
+ GstFlowReturn result;
+ ogg_int64_t gp;
+
+ if (G_UNLIKELY (!dec->have_header))
+ goto not_initialized;
+
+ /* get timestamp and durations */
+ if (outtime == -1)
+ outtime = dec->last_timestamp;
+ if (outdur == -1)
+ outdur = gst_util_uint64_scale_int (GST_SECOND, dec->info.fps_denominator,
+ dec->info.fps_numerator);
+
+ /* calculate expected next timestamp */
+ if (outtime != -1 && outdur != -1)
+ dec->last_timestamp = outtime + outdur;
+
+ /* the second most significant bit of the first data byte is cleared
+ * for keyframes. We can only check it if it's not a zero-length packet. */
+ keyframe = packet->bytes && ((packet->packet[0] & 0x40) == 0);
+ if (G_UNLIKELY (keyframe)) {
+ GST_DEBUG_OBJECT (dec, "we have a keyframe");
+ dec->need_keyframe = FALSE;
+ } else if (G_UNLIKELY (dec->need_keyframe)) {
+ goto dropping;
+ }
+
+ GST_DEBUG_OBJECT (dec, "parsing data packet");
+
+ /* this does the decoding */
+ if (G_UNLIKELY (th_decode_packetin (dec->decoder, packet, &gp) < 0))
+ goto decode_error;
+
+ if (outtime != -1) {
+ gboolean need_skip;
+ GstClockTime running_time;
+ GstClockTime earliest_time;
+ gdouble proportion;
+
+ /* qos needs to be done on running time */
+ running_time = gst_segment_to_running_time (&dec->segment, GST_FORMAT_TIME,
+ outtime);
+
+ GST_OBJECT_LOCK (dec);
+ proportion = dec->proportion;
+ earliest_time = dec->earliest_time;
+ /* check for QoS, don't perform the last steps of getting and
+ * pushing the buffers that are known to be late. */
+ need_skip = earliest_time != -1 && running_time <= earliest_time;
+ GST_OBJECT_UNLOCK (dec);
+
+ if (need_skip) {
+ GstMessage *qos_msg;
+ guint64 stream_time;
+ gint64 jitter;
+
+ GST_DEBUG_OBJECT (dec, "skipping decoding: qostime %"
+ GST_TIME_FORMAT " <= %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (running_time), GST_TIME_ARGS (earliest_time));
+
+ dec->dropped++;
+
+ stream_time =
+ gst_segment_to_stream_time (&dec->segment, GST_FORMAT_TIME, outtime);
+ jitter = GST_CLOCK_DIFF (running_time, earliest_time);
+
+ qos_msg =
+ gst_message_new_qos (GST_OBJECT_CAST (dec), FALSE, running_time,
+ stream_time, outtime, outdur);
+ gst_message_set_qos_values (qos_msg, jitter, proportion, 1000000);
+ gst_message_set_qos_stats (qos_msg, GST_FORMAT_BUFFERS,
+ dec->processed, dec->dropped);
+ gst_element_post_message (GST_ELEMENT_CAST (dec), qos_msg);
+
+ goto dropping_qos;
+ }
+ }
+
+ /* this does postprocessing and set up the decoded frame
+ * pointers in our yuv variable */
+ if (G_UNLIKELY (th_decode_ycbcr_out (dec->decoder, buf) < 0))
+ goto no_yuv;
+
+ if (G_UNLIKELY ((buf[0].width != dec->info.frame_width)
+ || (buf[0].height != dec->info.frame_height)))
+ goto wrong_dimensions;
+
+ result = theora_handle_image (dec, buf, &out);
+ if (result != GST_FLOW_OK)
+ return result;
+
+ GST_BUFFER_OFFSET (out) = dec->frame_nr;
+ if (dec->frame_nr != -1)
+ dec->frame_nr++;
+ GST_BUFFER_OFFSET_END (out) = dec->frame_nr;
+
+ GST_BUFFER_TIMESTAMP (out) = outtime;
+ GST_BUFFER_DURATION (out) = outdur;
+
+ dec->processed++;
+
+ if (dec->segment.rate >= 0.0)
+ result = theora_dec_push_forward (dec, out);
+ else
+ result = theora_dec_push_reverse (dec, out);
+
+ return result;
+
+ /* ERRORS */
+not_initialized:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE,
+ (NULL), ("no header sent yet"));
+ return GST_FLOW_ERROR;
+ }
+dropping:
+ {
+ GST_WARNING_OBJECT (dec, "dropping frame because we need a keyframe");
+ dec->discont = TRUE;
+ return GST_FLOW_OK;
+ }
+dropping_qos:
+ {
+ if (dec->frame_nr != -1)
+ dec->frame_nr++;
+ dec->discont = TRUE;
+ GST_WARNING_OBJECT (dec, "dropping frame because of QoS");
+ return GST_FLOW_OK;
+ }
+decode_error:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE,
+ (NULL), ("theora decoder did not decode data packet"));
+ return GST_FLOW_ERROR;
+ }
+no_yuv:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE,
+ (NULL), ("couldn't read out YUV image"));
+ return GST_FLOW_ERROR;
+ }
+wrong_dimensions:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, FORMAT,
+ (NULL), ("dimensions of image do not match header"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+theora_dec_decode_buffer (GstTheoraDec * dec, GstBuffer * buf)
+{
+ ogg_packet packet;
+ GstFlowReturn result = GST_FLOW_OK;
+ GstClockTime timestamp, duration;
+ gsize size;
+
+ /* make ogg_packet out of the buffer */
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = -1;
+ packet.packetno = 0; /* we don't really care */
+ packet.b_o_s = dec->have_header ? 0 : 1;
+ /* EOS does not matter for the decoder */
+ packet.e_o_s = 0;
+
+ GST_LOG_OBJECT (dec, "decode buffer of size %ld", packet.bytes);
+
+ /* save last seem timestamp for interpolating the next timestamps using the
+ * framerate when we need to */
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ duration = GST_BUFFER_DURATION (buf);
+
+ GST_DEBUG_OBJECT (dec, "header=%02x, outtime=%" GST_TIME_FORMAT,
+ packet.bytes ? packet.packet[0] : -1, GST_TIME_ARGS (timestamp));
+
+ /* switch depending on packet type. A zero byte packet is always a data
+ * packet; we don't dereference it in that case. */
+ if (packet.bytes && packet.packet[0] & 0x80) {
+ if (dec->have_header) {
+ GST_WARNING_OBJECT (GST_OBJECT (dec), "Ignoring header");
+ goto done;
+ }
+ result = theora_handle_header_packet (dec, &packet);
+ } else {
+ result = theora_handle_data_packet (dec, &packet, timestamp, duration);
+ }
+done:
+ gst_buffer_unmap (buf, packet.packet, size);
+
+ return result;
+}
+
+/* For reverse playback we use a technique that can be used for
+ * any keyframe based video codec.
+ *
+ * Input:
+ * Buffer decoding order: 7 8 9 4 5 6 1 2 3 EOS
+ * Keyframe flag: K K
+ * Discont flag: D D D
+ *
+ * - Each Discont marks a discont in the decoding order.
+ * - The keyframes mark where we can start decoding.
+ *
+ * First we prepend incomming buffers to the gather queue, whenever we receive
+ * a discont, we flush out the gather queue.
+ *
+ * The above data will be accumulated in the gather queue like this:
+ *
+ * gather queue: 9 8 7
+ * D
+ *
+ * Whe buffer 4 is received (with a DISCONT), we flush the gather queue like
+ * this:
+ *
+ * while (gather)
+ * take head of queue and prepend to decode queue.
+ * if we copied a keyframe, decode the decode queue.
+ *
+ * After we flushed the gather queue, we add 4 to the (now empty) gather queue.
+ * We get the following situation:
+ *
+ * gather queue: 4
+ * decode queue: 7 8 9
+ *
+ * After we received 5 (Keyframe) and 6:
+ *
+ * gather queue: 6 5 4
+ * decode queue: 7 8 9
+ *
+ * When we receive 1 (DISCONT) which triggers a flush of the gather queue:
+ *
+ * Copy head of the gather queue (6) to decode queue:
+ *
+ * gather queue: 5 4
+ * decode queue: 6 7 8 9
+ *
+ * Copy head of the gather queue (5) to decode queue. This is a keyframe so we
+ * can start decoding.
+ *
+ * gather queue: 4
+ * decode queue: 5 6 7 8 9
+ *
+ * Decode frames in decode queue, store raw decoded data in output queue, we
+ * can take the head of the decode queue and prepend the decoded result in the
+ * output queue:
+ *
+ * gather queue: 4
+ * decode queue:
+ * output queue: 9 8 7 6 5
+ *
+ * Now output all the frames in the output queue, picking a frame from the
+ * head of the queue.
+ *
+ * Copy head of the gather queue (4) to decode queue, we flushed the gather
+ * queue and can now store input buffer in the gather queue:
+ *
+ * gather queue: 1
+ * decode queue: 4
+ *
+ * When we receive EOS, the queue looks like:
+ *
+ * gather queue: 3 2 1
+ * decode queue: 4
+ *
+ * Fill decode queue, first keyframe we copy is 2:
+ *
+ * gather queue: 1
+ * decode queue: 2 3 4
+ *
+ * Decoded output:
+ *
+ * gather queue: 1
+ * decode queue:
+ * output queue: 4 3 2
+ *
+ * Leftover buffer 1 cannot be decoded and must be discarded.
+ */
+static GstFlowReturn
+theora_dec_flush_decode (GstTheoraDec * dec)
+{
+ GstFlowReturn res = GST_FLOW_OK;
+
+ while (dec->decode) {
+ GstBuffer *buf = GST_BUFFER_CAST (dec->decode->data);
+
+ GST_DEBUG_OBJECT (dec, "decoding buffer %p, ts %" GST_TIME_FORMAT,
+ buf, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ /* decode buffer, prepend to output queue */
+ res = theora_dec_decode_buffer (dec, buf);
+
+ /* don't need it anymore now */
+ gst_buffer_unref (buf);
+
+ dec->decode = g_list_delete_link (dec->decode, dec->decode);
+ }
+ while (dec->queued) {
+ GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data);
+
+ /* iterate ouput queue an push downstream */
+ res = gst_pad_push (dec->srcpad, buf);
+
+ dec->queued = g_list_delete_link (dec->queued, dec->queued);
+ }
+
+ return res;
+}
+
+static GstFlowReturn
+theora_dec_chain_reverse (GstTheoraDec * dec, gboolean discont, GstBuffer * buf)
+{
+ GstFlowReturn res = GST_FLOW_OK;
+
+ /* if we have a discont, move buffers to the decode list */
+ if (G_UNLIKELY (discont)) {
+ GST_DEBUG_OBJECT (dec, "received discont,gathering buffers");
+ while (dec->gather) {
+ GstBuffer *gbuf;
+ guint8 data[1];
+
+ gbuf = GST_BUFFER_CAST (dec->gather->data);
+ /* remove from the gather list */
+ dec->gather = g_list_delete_link (dec->gather, dec->gather);
+ /* copy to decode queue */
+ dec->decode = g_list_prepend (dec->decode, gbuf);
+
+ /* if we copied a keyframe, flush and decode the decode queue */
+ if (gst_buffer_extract (gbuf, 0, data, 1) == 1) {
+ if ((data[0] & 0x40) == 0) {
+ GST_DEBUG_OBJECT (dec, "copied keyframe");
+ res = theora_dec_flush_decode (dec);
+ }
+ }
+ }
+ }
+
+ /* add buffer to gather queue */
+ GST_DEBUG_OBJECT (dec, "gathering buffer %p, size %" G_GSIZE_FORMAT, buf,
+ gst_buffer_get_size (buf));
+ dec->gather = g_list_prepend (dec->gather, buf);
+
+ return res;
+}
+
+static GstFlowReturn
+theora_dec_chain_forward (GstTheoraDec * dec, gboolean discont,
+ GstBuffer * buffer)
+{
+ GstFlowReturn result;
+
+ result = theora_dec_decode_buffer (dec, buffer);
+
+ gst_buffer_unref (buffer);
+
+ return result;
+}
+
+static GstFlowReturn
+theora_dec_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstTheoraDec *dec;
+ GstFlowReturn res;
+ gboolean discont;
+
+ dec = GST_THEORA_DEC (gst_pad_get_parent (pad));
+
+ /* peel of DISCONT flag */
+ discont = GST_BUFFER_IS_DISCONT (buf);
+
+ /* resync on DISCONT */
+ if (G_UNLIKELY (discont)) {
+ GST_DEBUG_OBJECT (dec, "received DISCONT buffer");
+ dec->need_keyframe = TRUE;
+ dec->last_timestamp = -1;
+ dec->discont = TRUE;
+ }
+
+ if (dec->segment.rate > 0.0)
+ res = theora_dec_chain_forward (dec, discont, buf);
+ else
+ res = theora_dec_chain_reverse (dec, discont, buf);
+
+ gst_object_unref (dec);
+
+ return res;
+}
+
+static GstStateChangeReturn
+theora_dec_change_state (GstElement * element, GstStateChange transition)
+{
+ GstTheoraDec *dec = GST_THEORA_DEC (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ th_info_clear (&dec->info);
+ th_comment_clear (&dec->comment);
+ GST_DEBUG_OBJECT (dec, "Setting have_header to FALSE in READY->PAUSED");
+ dec->have_header = FALSE;
+ dec->have_par = FALSE;
+ gst_theora_dec_reset (dec);
+ 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:
+ th_info_clear (&dec->info);
+ th_comment_clear (&dec->comment);
+ th_setup_free (dec->setup);
+ dec->setup = NULL;
+ th_decode_free (dec->decoder);
+ dec->decoder = NULL;
+ gst_theora_dec_reset (dec);
+ if (dec->pool) {
+ gst_buffer_pool_set_active (dec->pool, FALSE);
+ gst_object_unref (dec->pool);
+ dec->pool = NULL;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+theora_dec_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTheoraDec *dec = GST_THEORA_DEC (object);
+
+ switch (prop_id) {
+ case PROP_CROP:
+ dec->crop = g_value_get_boolean (value);
+ break;
+ case PROP_TELEMETRY_MV:
+ dec->telemetry_mv = g_value_get_int (value);
+ break;
+ case PROP_TELEMETRY_MBMODE:
+ dec->telemetry_mbmode = g_value_get_int (value);
+ break;
+ case PROP_TELEMETRY_QI:
+ dec->telemetry_qi = g_value_get_int (value);
+ break;
+ case PROP_TELEMETRY_BITS:
+ dec->telemetry_bits = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+theora_dec_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTheoraDec *dec = GST_THEORA_DEC (object);
+
+ switch (prop_id) {
+ case PROP_CROP:
+ g_value_set_boolean (value, dec->crop);
+ break;
+ case PROP_TELEMETRY_MV:
+ g_value_set_int (value, dec->telemetry_mv);
+ break;
+ case PROP_TELEMETRY_MBMODE:
+ g_value_set_int (value, dec->telemetry_mbmode);
+ break;
+ case PROP_TELEMETRY_QI:
+ g_value_set_int (value, dec->telemetry_qi);
+ break;
+ case PROP_TELEMETRY_BITS:
+ g_value_set_int (value, dec->telemetry_bits);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/ext/theora/gsttheoradec.h b/ext/theora/gsttheoradec.h
new file mode 100644
index 0000000..720eb49
--- /dev/null
+++ b/ext/theora/gsttheoradec.h
@@ -0,0 +1,123 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.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.
+ */
+
+#ifndef __GST_THEORADEC_H__
+#define __GST_THEORADEC_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <theora/theoradec.h>
+#include <string.h>
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_THEORA_DEC \
+ (gst_theora_dec_get_type())
+#define GST_THEORA_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_THEORA_DEC,GstTheoraDec))
+#define GST_THEORA_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_THEORA_DEC,GstTheoraDecClass))
+#define GST_IS_THEORA_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_THEORA_DEC))
+#define GST_IS_THEORA_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_THEORA_DEC))
+
+typedef struct _GstTheoraDec GstTheoraDec;
+typedef struct _GstTheoraDecClass GstTheoraDecClass;
+
+/**
+ * GstTheoraDec:
+ *
+ * Opaque object data structure.
+ */
+struct _GstTheoraDec
+{
+ GstElement element;
+
+ /* Pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* theora decoder state */
+ th_dec_ctx *decoder;
+ th_setup_info *setup;
+ th_info info;
+ th_comment comment;
+
+ gboolean have_header;
+
+ GstClockTime last_timestamp;
+ guint64 frame_nr;
+ gboolean need_keyframe;
+ GstVideoInfo vinfo;
+
+ gint offset_x, offset_y;
+ gint output_bpp;
+ GstBufferPool *pool;
+ gboolean use_cropping;
+
+ /* telemetry debuging options */
+ gint telemetry_mv;
+ gint telemetry_mbmode;
+ gint telemetry_qi;
+ gint telemetry_bits;
+
+ gboolean crop;
+
+ /* list of buffers that need timestamps */
+ GList *queued;
+ /* list of raw output buffers */
+ GList *output;
+ /* gather/decode queues for reverse playback */
+ GList *gather;
+ GList *decode;
+ GList *pendingevents;
+
+ GstTagList *tags;
+
+ /* segment info */ /* with STREAM_LOCK */
+ GstSegment segment;
+ gboolean discont;
+ guint32 seqnum;
+
+ /* QoS stuff */ /* with LOCK*/
+ gdouble proportion;
+ GstClockTime earliest_time;
+ guint64 processed;
+ guint64 dropped;
+
+ gboolean have_par;
+ gint par_num;
+ gint par_den;
+};
+
+struct _GstTheoraDecClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_theora_dec_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_THEORADEC_H__ */
diff --git a/ext/theora/gsttheoraenc.c b/ext/theora/gsttheoraenc.c
new file mode 100644
index 0000000..40cba12
--- /dev/null
+++ b/ext/theora/gsttheoraenc.c
@@ -0,0 +1,1609 @@
+/* GStreamer
+ * Copyright (C) 2004 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.
+ */
+
+/**
+ * SECTION:element-theoraenc
+ * @see_also: theoradec, oggmux
+ *
+ * This element encodes raw video into a Theora stream.
+ * <ulink url="http://www.theora.org/">Theora</ulink> is a royalty-free
+ * video codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
+ * Foundation</ulink>, based on the VP3 codec.
+ *
+ * The theora codec internally only supports encoding of images that are a
+ * multiple of 16 pixels in both X and Y direction. It is however perfectly
+ * possible to encode images with other dimensions because an arbitrary
+ * rectangular cropping region can be set up. This element will automatically
+ * set up a correct cropping region if the dimensions are not multiples of 16
+ * pixels.
+ *
+ * To control the quality of the encoding, the #GstTheoraEnc::bitrate and
+ * #GstTheoraEnc::quality properties can be used. These two properties are
+ * mutualy exclusive. Setting the bitrate property will produce a constant
+ * bitrate (CBR) stream while setting the quality property will produce a
+ * variable bitrate (VBR) stream.
+ *
+ * <refsect2>
+ * <title>Example pipeline</title>
+ * |[
+ * gst-launch -v videotestsrc num-buffers=1000 ! theoraenc ! oggmux ! filesink location=videotestsrc.ogg
+ * ]| This example pipeline will encode a test video source to theora muxed in an
+ * ogg container. Refer to the theoradec documentation to decode the create
+ * stream.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gsttheoraenc.h"
+
+#include <string.h>
+#include <stdlib.h> /* free */
+
+#include <gst/tag/tag.h>
+
+#define GST_CAT_DEFAULT theoraenc_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+#define GST_TYPE_BORDER_MODE (gst_border_mode_get_type())
+static GType
+gst_border_mode_get_type (void)
+{
+ static GType border_mode_type = 0;
+ static const GEnumValue border_mode[] = {
+ {BORDER_NONE, "No Border", "none"},
+ {BORDER_BLACK, "Black Border", "black"},
+ {BORDER_MIRROR, "Mirror image in borders", "mirror"},
+ {0, NULL, NULL},
+ };
+
+ if (!border_mode_type) {
+ border_mode_type =
+ g_enum_register_static ("GstTheoraEncBorderMode", border_mode);
+ }
+ return border_mode_type;
+}
+
+#define GST_TYPE_MULTIPASS_MODE (gst_multipass_mode_get_type())
+static GType
+gst_multipass_mode_get_type (void)
+{
+ static GType multipass_mode_type = 0;
+ static const GEnumValue multipass_mode[] = {
+ {MULTIPASS_MODE_SINGLE_PASS, "Single pass", "single-pass"},
+ {MULTIPASS_MODE_FIRST_PASS, "First pass", "first-pass"},
+ {MULTIPASS_MODE_SECOND_PASS, "Second pass", "second-pass"},
+ {0, NULL, NULL},
+ };
+
+ if (!multipass_mode_type) {
+ multipass_mode_type =
+ g_enum_register_static ("GstTheoraEncMultipassMode", multipass_mode);
+ }
+ return multipass_mode_type;
+}
+
+/* taken from theora/lib/toplevel.c */
+static int
+_ilog (unsigned int v)
+{
+ int ret = 0;
+
+ while (v) {
+ ret++;
+ v >>= 1;
+ }
+ return (ret);
+}
+
+#define THEORA_DEF_BITRATE 0
+#define THEORA_DEF_QUALITY 48
+#define THEORA_DEF_KEYFRAME_AUTO TRUE
+#define THEORA_DEF_KEYFRAME_FREQ 64
+#define THEORA_DEF_KEYFRAME_FREQ_FORCE 64
+#define THEORA_DEF_SPEEDLEVEL 1
+#define THEORA_DEF_VP3_COMPATIBLE FALSE
+#define THEORA_DEF_DROP_FRAMES TRUE
+#define THEORA_DEF_CAP_OVERFLOW TRUE
+#define THEORA_DEF_CAP_UNDERFLOW FALSE
+#define THEORA_DEF_RATE_BUFFER 0
+#define THEORA_DEF_MULTIPASS_CACHE_FILE NULL
+#define THEORA_DEF_MULTIPASS_MODE MULTIPASS_MODE_SINGLE_PASS
+enum
+{
+ PROP_0,
+ PROP_CENTER,
+ PROP_BORDER,
+ PROP_BITRATE,
+ PROP_QUALITY,
+ PROP_QUICK,
+ PROP_KEYFRAME_AUTO,
+ PROP_KEYFRAME_FREQ,
+ PROP_KEYFRAME_FREQ_FORCE,
+ PROP_KEYFRAME_THRESHOLD,
+ PROP_KEYFRAME_MINDISTANCE,
+ PROP_NOISE_SENSITIVITY,
+ PROP_SHARPNESS,
+ PROP_SPEEDLEVEL,
+ PROP_VP3_COMPATIBLE,
+ PROP_DROP_FRAMES,
+ PROP_CAP_OVERFLOW,
+ PROP_CAP_UNDERFLOW,
+ PROP_RATE_BUFFER,
+ PROP_MULTIPASS_CACHE_FILE,
+ PROP_MULTIPASS_MODE
+ /* FILL ME */
+};
+
+/* this function does a straight granulepos -> timestamp conversion */
+static GstClockTime
+granulepos_to_timestamp (GstTheoraEnc * theoraenc, ogg_int64_t granulepos)
+{
+ guint64 iframe, pframe;
+ int shift = theoraenc->info.keyframe_granule_shift;
+
+ if (granulepos < 0)
+ return GST_CLOCK_TIME_NONE;
+
+ iframe = granulepos >> shift;
+ pframe = granulepos - (iframe << shift);
+
+ /* num and den are 32 bit, so we can safely multiply with GST_SECOND */
+ return gst_util_uint64_scale ((guint64) (iframe + pframe),
+ GST_SECOND * theoraenc->info.fps_denominator,
+ theoraenc->info.fps_numerator);
+}
+
+/* Generate a dummy encoder context for use in th_encode_ctl queries
+ Release with th_encode_free()
+ This and the next routine from theora/examples/libtheora_info.c */
+static th_enc_ctx *
+dummy_encode_ctx (void)
+{
+ th_enc_ctx *ctx;
+ th_info info;
+
+ /* set the minimal video parameters */
+ th_info_init (&info);
+ info.frame_width = 320;
+ info.frame_height = 240;
+ info.fps_numerator = 1;
+ info.fps_denominator = 1;
+
+ /* allocate and initialize a context object */
+ ctx = th_encode_alloc (&info);
+ if (!ctx)
+ GST_WARNING ("Failed to allocate dummy encoder context.");
+
+ /* clear the info struct */
+ th_info_clear (&info);
+
+ return ctx;
+}
+
+/* Query the current and maximum values for the 'speed level' setting.
+ This can be used to ask the encoder to trade off encoding quality
+ vs. performance cost, for example to adapt to realtime constraints. */
+static int
+check_speed_level (th_enc_ctx * ctx, int *current, int *max)
+{
+ int ret;
+
+ /* query the current speed level */
+ ret = th_encode_ctl (ctx, TH_ENCCTL_GET_SPLEVEL, current, sizeof (int));
+ if (ret) {
+ GST_WARNING ("Error %d getting current speed level.", ret);
+ return ret;
+ }
+ /* query the maximum speed level, which varies by encoder version */
+ ret = th_encode_ctl (ctx, TH_ENCCTL_GET_SPLEVEL_MAX, max, sizeof (int));
+ if (ret) {
+ GST_WARNING ("Error %d getting maximum speed level.", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static GstStaticPadTemplate theora_enc_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw, "
+ "format = (string) { I420, Y42B, Y444 }, "
+ "framerate = (fraction) [1/MAX, MAX], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")
+ );
+
+static GstStaticPadTemplate theora_enc_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-theora")
+ );
+
+#define gst_theora_enc_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTheoraEnc, gst_theora_enc,
+ GST_TYPE_ELEMENT, G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, NULL));
+
+static GstCaps *theora_enc_src_caps;
+
+static gboolean theora_enc_sink_event (GstPad * pad, GstEvent * event);
+static gboolean theora_enc_src_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn theora_enc_chain (GstPad * pad, GstBuffer * buffer);
+static GstStateChangeReturn theora_enc_change_state (GstElement * element,
+ GstStateChange transition);
+static GstCaps *theora_enc_sink_getcaps (GstPad * pad, GstCaps * filter);
+static gboolean theora_enc_sink_setcaps (GstTheoraEnc * enc, GstCaps * caps);
+static void theora_enc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void theora_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void theora_enc_finalize (GObject * object);
+
+static gboolean theora_enc_write_multipass_cache (GstTheoraEnc * enc,
+ gboolean begin, gboolean eos);
+
+static char *theora_enc_get_supported_formats (void);
+
+static void
+gst_theora_enc_class_init (GstTheoraEncClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ char *caps_string;
+
+ /* query runtime encoder properties */
+ th_enc_ctx *th_ctx;
+ int default_speed_level = THEORA_DEF_SPEEDLEVEL;
+ int max_speed_level = default_speed_level;
+
+ GST_DEBUG_CATEGORY_INIT (theoraenc_debug, "theoraenc", 0, "Theora encoder");
+
+ th_ctx = dummy_encode_ctx ();
+ if (th_ctx) {
+ if (!check_speed_level (th_ctx, &default_speed_level, &max_speed_level))
+ GST_WARNING
+ ("Failed to determine settings for the speed-level property.");
+ th_encode_free (th_ctx);
+ }
+
+ gobject_class->set_property = theora_enc_set_property;
+ gobject_class->get_property = theora_enc_get_property;
+ gobject_class->finalize = theora_enc_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_CENTER,
+ g_param_spec_boolean ("center", "Center",
+ "ignored and kept for API compat only", TRUE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BORDER,
+ g_param_spec_enum ("border", "Border",
+ "ignored and kept for API compat only",
+ GST_TYPE_BORDER_MODE, BORDER_BLACK,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /* general encoding stream options */
+ g_object_class_install_property (gobject_class, PROP_BITRATE,
+ g_param_spec_int ("bitrate", "Bitrate", "Compressed video bitrate (kbps)",
+ 0, (1 << 24) - 1, THEORA_DEF_BITRATE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ GST_PARAM_MUTABLE_PLAYING));
+ g_object_class_install_property (gobject_class, PROP_QUALITY,
+ g_param_spec_int ("quality", "Quality", "Video quality", 0, 63,
+ THEORA_DEF_QUALITY,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ GST_PARAM_MUTABLE_PLAYING));
+ g_object_class_install_property (gobject_class, PROP_QUICK,
+ g_param_spec_boolean ("quick", "Quick",
+ "ignored and kept for API compat only", TRUE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KEYFRAME_AUTO,
+ g_param_spec_boolean ("keyframe-auto", "Keyframe Auto",
+ "Automatic keyframe detection", THEORA_DEF_KEYFRAME_AUTO,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KEYFRAME_FREQ,
+ g_param_spec_int ("keyframe-freq", "Keyframe frequency",
+ "Keyframe frequency", 1, 32768, THEORA_DEF_KEYFRAME_FREQ,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KEYFRAME_FREQ_FORCE,
+ g_param_spec_int ("keyframe-force", "Keyframe force",
+ "Force keyframe every N frames", 1, 32768,
+ THEORA_DEF_KEYFRAME_FREQ_FORCE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KEYFRAME_THRESHOLD,
+ g_param_spec_int ("keyframe-threshold", "Keyframe threshold",
+ "ignored and kept for API compat only", 0, 32768, 80,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KEYFRAME_MINDISTANCE,
+ g_param_spec_int ("keyframe-mindistance", "Keyframe mindistance",
+ "ignored and kept for API compat only", 1, 32768, 8,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_NOISE_SENSITIVITY,
+ g_param_spec_int ("noise-sensitivity", "Noise sensitivity",
+ "ignored and kept for API compat only", 0, 32768, 1,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SHARPNESS,
+ g_param_spec_int ("sharpness", "Sharpness",
+ "ignored and kept for API compat only", 0, 2, 0,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SPEEDLEVEL,
+ g_param_spec_int ("speed-level", "Speed level",
+ "Controls the amount of analysis performed when encoding."
+ " Higher values trade compression quality for speed."
+ " This property requires libtheora version >= 1.0"
+ ", and the maximum value may vary based on encoder version.",
+ 0, max_speed_level, default_speed_level,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_VP3_COMPATIBLE,
+ g_param_spec_boolean ("vp3-compatible", "VP3 Compatible",
+ "Disables non-VP3 compatible features",
+ THEORA_DEF_VP3_COMPATIBLE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DROP_FRAMES,
+ g_param_spec_boolean ("drop-frames", "Drop Frames",
+ "Allow or disallow frame dropping",
+ THEORA_DEF_DROP_FRAMES,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CAP_OVERFLOW,
+ g_param_spec_boolean ("cap-overflow", "Cap Overflow",
+ "Enable capping of bit reservoir overflows",
+ THEORA_DEF_CAP_OVERFLOW,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CAP_UNDERFLOW,
+ g_param_spec_boolean ("cap-underflow", "Cap Underflow",
+ "Enable capping of bit reservoir underflows",
+ THEORA_DEF_CAP_UNDERFLOW,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_RATE_BUFFER,
+ g_param_spec_int ("rate-buffer", "Rate Control Buffer",
+ "Sets the size of the rate control buffer, in units of frames. "
+ "The default value of 0 instructs the encoder to automatically "
+ "select an appropriate value",
+ 0, 1000, THEORA_DEF_RATE_BUFFER,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MULTIPASS_CACHE_FILE,
+ g_param_spec_string ("multipass-cache-file", "Multipass Cache File",
+ "Multipass cache file", THEORA_DEF_MULTIPASS_CACHE_FILE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MULTIPASS_MODE,
+ g_param_spec_enum ("multipass-mode", "Multipass mode",
+ "Single pass or first/second pass", GST_TYPE_MULTIPASS_MODE,
+ THEORA_DEF_MULTIPASS_MODE,
+ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_enc_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_enc_sink_factory));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Theora video encoder", "Codec/Encoder/Video",
+ "encode raw YUV video to a theora stream",
+ "Wim Taymans <wim@fluendo.com>");
+
+ caps_string = g_strdup_printf ("video/x-raw, "
+ "format = (string) { %s }, "
+ "framerate = (fraction) [1/MAX, MAX], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]",
+ theora_enc_get_supported_formats ());
+ theora_enc_src_caps = gst_caps_from_string (caps_string);
+ g_free (caps_string);
+
+ gstelement_class->change_state = theora_enc_change_state;
+}
+
+static void
+gst_theora_enc_init (GstTheoraEnc * enc)
+{
+ enc->sinkpad =
+ gst_pad_new_from_static_template (&theora_enc_sink_factory, "sink");
+ gst_pad_set_chain_function (enc->sinkpad, theora_enc_chain);
+ gst_pad_set_event_function (enc->sinkpad, theora_enc_sink_event);
+ gst_pad_set_getcaps_function (enc->sinkpad, theora_enc_sink_getcaps);
+ gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad);
+
+ enc->srcpad =
+ gst_pad_new_from_static_template (&theora_enc_src_factory, "src");
+ gst_pad_set_event_function (enc->srcpad, theora_enc_src_event);
+ gst_pad_use_fixed_caps (enc->srcpad);
+ gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad);
+
+ gst_segment_init (&enc->segment, GST_FORMAT_UNDEFINED);
+
+ enc->video_bitrate = THEORA_DEF_BITRATE;
+ enc->video_quality = THEORA_DEF_QUALITY;
+ enc->keyframe_auto = THEORA_DEF_KEYFRAME_AUTO;
+ enc->keyframe_freq = THEORA_DEF_KEYFRAME_FREQ;
+ enc->keyframe_force = THEORA_DEF_KEYFRAME_FREQ_FORCE;
+
+ enc->expected_ts = GST_CLOCK_TIME_NONE;
+
+ /* enc->speed_level is set to the libtheora default by the constructor */
+ enc->vp3_compatible = THEORA_DEF_VP3_COMPATIBLE;
+ enc->drop_frames = THEORA_DEF_DROP_FRAMES;
+ enc->cap_overflow = THEORA_DEF_CAP_OVERFLOW;
+ enc->cap_underflow = THEORA_DEF_CAP_UNDERFLOW;
+ enc->rate_buffer = THEORA_DEF_RATE_BUFFER;
+
+ enc->multipass_mode = THEORA_DEF_MULTIPASS_MODE;
+ enc->multipass_cache_file = THEORA_DEF_MULTIPASS_CACHE_FILE;
+}
+
+static void
+theora_enc_clear_multipass_cache (GstTheoraEnc * enc)
+{
+ if (enc->multipass_cache_fd) {
+ g_io_channel_shutdown (enc->multipass_cache_fd, TRUE, NULL);
+ g_io_channel_unref (enc->multipass_cache_fd);
+ enc->multipass_cache_fd = NULL;
+ }
+
+ if (enc->multipass_cache_adapter) {
+ gst_object_unref (enc->multipass_cache_adapter);
+ enc->multipass_cache_adapter = NULL;
+ }
+}
+
+static void
+theora_enc_finalize (GObject * object)
+{
+ GstTheoraEnc *enc = GST_THEORA_ENC (object);
+
+ GST_DEBUG_OBJECT (enc, "Finalizing");
+ if (enc->encoder)
+ th_encode_free (enc->encoder);
+ th_comment_clear (&enc->comment);
+ th_info_clear (&enc->info);
+ g_free (enc->multipass_cache_file);
+
+ theora_enc_clear_multipass_cache (enc);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+theora_enc_reset (GstTheoraEnc * enc)
+{
+ ogg_uint32_t keyframe_force;
+ int rate_flags;
+
+ GST_OBJECT_LOCK (enc);
+ enc->info.target_bitrate = enc->video_bitrate;
+ if (enc->quality_changed) {
+ enc->info.quality = enc->video_quality;
+ } else {
+ if (enc->video_bitrate == 0) {
+ enc->info.quality = enc->video_quality;
+ }
+ }
+ enc->bitrate_changed = FALSE;
+ enc->quality_changed = FALSE;
+ GST_OBJECT_UNLOCK (enc);
+
+ if (enc->encoder)
+ th_encode_free (enc->encoder);
+ enc->encoder = th_encode_alloc (&enc->info);
+ /* We ensure this function cannot fail. */
+ g_assert (enc->encoder != NULL);
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_SPLEVEL, &enc->speed_level,
+ sizeof (enc->speed_level));
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_VP3_COMPATIBLE,
+ &enc->vp3_compatible, sizeof (enc->vp3_compatible));
+
+ rate_flags = 0;
+ if (enc->drop_frames)
+ rate_flags |= TH_RATECTL_DROP_FRAMES;
+ if (enc->drop_frames)
+ rate_flags |= TH_RATECTL_CAP_OVERFLOW;
+ if (enc->drop_frames)
+ rate_flags |= TH_RATECTL_CAP_UNDERFLOW;
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_RATE_FLAGS,
+ &rate_flags, sizeof (rate_flags));
+
+ if (enc->rate_buffer) {
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_RATE_BUFFER,
+ &enc->rate_buffer, sizeof (enc->rate_buffer));
+ } else {
+ /* FIXME */
+ }
+
+ keyframe_force = enc->keyframe_auto ?
+ enc->keyframe_force : enc->keyframe_freq;
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE,
+ &keyframe_force, sizeof (keyframe_force));
+
+ /* Get placeholder data */
+ if (enc->multipass_cache_fd
+ && enc->multipass_mode == MULTIPASS_MODE_FIRST_PASS)
+ theora_enc_write_multipass_cache (enc, TRUE, FALSE);
+}
+
+static void
+theora_enc_clear (GstTheoraEnc * enc)
+{
+ enc->packetno = 0;
+ enc->bytes_out = 0;
+ enc->granulepos_offset = 0;
+ enc->timestamp_offset = 0;
+
+ enc->next_ts = GST_CLOCK_TIME_NONE;
+ enc->next_discont = FALSE;
+ enc->expected_ts = GST_CLOCK_TIME_NONE;
+}
+
+static char *
+theora_enc_get_supported_formats (void)
+{
+ th_enc_ctx *encoder;
+ th_info info;
+ struct
+ {
+ th_pixel_fmt pixelformat;
+ const char *fourcc;
+ } formats[] = {
+ {
+ TH_PF_420, "I420"}, {
+ TH_PF_422, "Y42B"}, {
+ TH_PF_444, "Y444"}
+ };
+ GString *string = NULL;
+ guint i;
+
+ th_info_init (&info);
+ info.frame_width = 16;
+ info.frame_height = 16;
+ info.fps_numerator = 25;
+ info.fps_denominator = 1;
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ info.pixel_fmt = formats[i].pixelformat;
+
+ encoder = th_encode_alloc (&info);
+ if (encoder == NULL)
+ continue;
+
+ GST_LOG ("format %s is supported", formats[i].fourcc);
+ th_encode_free (encoder);
+
+ if (string == NULL) {
+ string = g_string_new (formats[i].fourcc);
+ } else {
+ g_string_append (string, ", ");
+ g_string_append (string, formats[i].fourcc);
+ }
+ }
+ th_info_clear (&info);
+
+ return string == NULL ? NULL : g_string_free (string, FALSE);
+}
+
+static GstCaps *
+theora_enc_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstTheoraEnc *encoder;
+ GstPad *peer;
+ GstCaps *caps;
+
+ /* If we already have caps return them */
+ if ((caps = gst_pad_get_current_caps (pad)) != NULL)
+ return caps;
+
+ encoder = GST_THEORA_ENC (gst_pad_get_parent (pad));
+ if (!encoder)
+ return gst_caps_new_empty ();
+
+ peer = gst_pad_get_peer (encoder->srcpad);
+ if (peer) {
+ const GstCaps *templ_caps;
+ GstCaps *peer_caps, *tmp_caps;
+ GstStructure *s;
+ guint i, n;
+
+ peer_caps = gst_pad_get_caps (peer, NULL);
+
+ /* Translate peercaps to YUV */
+ 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, "video/x-raw");
+ gst_structure_remove_field (s, "streamheader");
+ }
+
+ templ_caps = gst_pad_get_pad_template_caps (pad);
+
+ tmp_caps = gst_caps_intersect (peer_caps, templ_caps);
+ caps = gst_caps_intersect (tmp_caps, theora_enc_src_caps);
+ gst_caps_unref (tmp_caps);
+ gst_caps_unref (peer_caps);
+ gst_object_unref (peer);
+ peer = NULL;
+ } else {
+ caps = gst_caps_ref (theora_enc_src_caps);
+ }
+
+ gst_object_unref (encoder);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+
+ return caps;
+}
+
+static gboolean
+theora_enc_sink_setcaps (GstTheoraEnc * enc, GstCaps * caps)
+{
+ GstVideoInfo info;
+
+ th_info_clear (&enc->info);
+ th_info_init (&enc->info);
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ enc->vinfo = info;
+
+ /* Theora has a divisible-by-sixteen restriction for the encoded video size but
+ * we can define a picture area using pic_width/pic_height */
+ enc->info.frame_width = GST_ROUND_UP_16 (info.width);
+ enc->info.frame_height = GST_ROUND_UP_16 (info.height);
+ enc->info.pic_width = info.width;
+ enc->info.pic_height = info.height;
+
+ switch (GST_VIDEO_INFO_FORMAT (&info)) {
+ case GST_VIDEO_FORMAT_I420:
+ enc->info.pixel_fmt = TH_PF_420;
+ break;
+ case GST_VIDEO_FORMAT_Y42B:
+ enc->info.pixel_fmt = TH_PF_422;
+ break;
+ case GST_VIDEO_FORMAT_Y444:
+ enc->info.pixel_fmt = TH_PF_444;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ enc->info.fps_numerator = info.fps_n;
+ enc->info.fps_denominator = info.fps_d;
+
+ enc->info.aspect_numerator = info.par_n;
+ enc->info.aspect_denominator = info.par_d;
+#if 0
+ /* setting them to 0 indicates that the decoder can chose a good aspect
+ * ratio, defaulting to 1/1 */
+ enc->info.aspect_numerator = 0;
+ enc->par_n = 1;
+ enc->info.aspect_denominator = 0;
+ enc->par_d = 1;
+#endif
+
+ enc->info.colorspace = TH_CS_UNSPECIFIED;
+
+ /* as done in theora */
+ enc->info.keyframe_granule_shift = _ilog (enc->keyframe_force - 1);
+ GST_DEBUG_OBJECT (enc,
+ "keyframe_frequency_force is %d, granule shift is %d",
+ enc->keyframe_force, enc->info.keyframe_granule_shift);
+
+ theora_enc_reset (enc);
+ enc->initialised = TRUE;
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_caps:
+ {
+ GST_DEBUG_OBJECT (enc, "could not parse caps");
+ return FALSE;
+ }
+}
+
+static guint64
+granulepos_add (guint64 granulepos, guint64 addend, gint shift)
+{
+ guint64 iframe, pframe;
+
+ iframe = granulepos >> shift;
+ pframe = granulepos - (iframe << shift);
+ iframe += addend;
+
+ return (iframe << shift) + pframe;
+}
+
+/* prepare a buffer for transmission by passing data through libtheora */
+static GstFlowReturn
+theora_buffer_from_packet (GstTheoraEnc * enc, ogg_packet * packet,
+ GstClockTime timestamp, GstClockTime running_time,
+ GstClockTime duration, GstBuffer ** buffer)
+{
+ GstBuffer *buf;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ buf = gst_buffer_new_and_alloc (packet->bytes);
+ if (!buf) {
+ GST_WARNING_OBJECT (enc, "Could not allocate buffer");
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+
+ gst_buffer_fill (buf, 0, packet->packet, packet->bytes);
+ /* see ext/ogg/README; OFFSET_END takes "our" granulepos, OFFSET its
+ * time representation */
+ GST_BUFFER_OFFSET_END (buf) =
+ granulepos_add (packet->granulepos, enc->granulepos_offset,
+ enc->info.keyframe_granule_shift);
+ GST_BUFFER_OFFSET (buf) = granulepos_to_timestamp (enc,
+ GST_BUFFER_OFFSET_END (buf));
+
+ GST_BUFFER_TIMESTAMP (buf) = timestamp;
+ GST_BUFFER_DURATION (buf) = duration;
+
+ if (enc->next_discont) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ enc->next_discont = FALSE;
+ }
+
+ /* the second most significant bit of the first data byte is cleared
+ * for keyframes */
+ if (packet->bytes > 0 && (packet->packet[0] & 0x40) == 0) {
+ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ } else {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ }
+ enc->packetno++;
+
+done:
+ *buffer = buf;
+ return ret;
+}
+
+/* push out the buffer and do internal bookkeeping */
+static GstFlowReturn
+theora_push_buffer (GstTheoraEnc * enc, GstBuffer * buffer)
+{
+ GstFlowReturn ret;
+
+ enc->bytes_out += gst_buffer_get_size (buffer);
+
+ ret = gst_pad_push (enc->srcpad, buffer);
+
+ return ret;
+}
+
+static GstFlowReturn
+theora_push_packet (GstTheoraEnc * enc, ogg_packet * packet,
+ GstClockTime timestamp, GstClockTime running_time, GstClockTime duration)
+{
+ GstBuffer *buf;
+ GstFlowReturn ret;
+
+ ret =
+ theora_buffer_from_packet (enc, packet, timestamp, running_time, duration,
+ &buf);
+ if (ret == GST_FLOW_OK)
+ ret = theora_push_buffer (enc, buf);
+
+ return ret;
+}
+
+static GstCaps *
+theora_set_header_on_caps (GstCaps * caps, GSList * buffers)
+{
+ GstStructure *structure;
+ GValue array = { 0 };
+ GValue value = { 0 };
+ GstBuffer *buffer;
+ GSList *walk;
+
+ caps = gst_caps_make_writable (caps);
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* put copies of the buffers in a fixed list */
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ for (walk = buffers; walk; walk = walk->next) {
+ buffer = walk->data;
+
+ /* mark buffer */
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS);
+
+ /* Copy buffer, because we can't use the original -
+ * it creates a circular refcount with the caps<->buffers */
+ buffer = gst_buffer_copy (buffer);
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, buffer);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+
+ /* Unref our copy */
+ gst_buffer_unref (buffer);
+ }
+
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+
+ return caps;
+}
+
+static void
+theora_enc_force_keyframe (GstTheoraEnc * enc)
+{
+ GstClockTime next_ts;
+
+ /* make sure timestamps increment after resetting the decoder */
+ next_ts = enc->next_ts + enc->timestamp_offset;
+
+ theora_enc_reset (enc);
+ enc->granulepos_offset =
+ gst_util_uint64_scale (next_ts, enc->vinfo.fps_n,
+ GST_SECOND * enc->vinfo.fps_d);
+ enc->timestamp_offset = next_ts;
+ enc->next_ts = 0;
+}
+
+static gboolean
+theora_enc_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstTheoraEnc *enc;
+ ogg_packet op;
+ gboolean res;
+
+ enc = GST_THEORA_ENC (GST_PAD_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = theora_enc_sink_setcaps (enc, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &enc->segment);
+
+ res = gst_pad_push_event (enc->srcpad, event);
+ break;
+ }
+ case GST_EVENT_EOS:
+ if (enc->initialised) {
+ /* push last packet with eos flag, should not be called */
+ while (th_encode_packetout (enc->encoder, 1, &op)) {
+ GstClockTime next_time =
+ th_granule_time (enc->encoder, op.granulepos) * GST_SECOND;
+
+ theora_push_packet (enc, &op, GST_CLOCK_TIME_NONE, enc->next_ts,
+ next_time - enc->next_ts);
+ enc->next_ts = next_time;
+ }
+ }
+ if (enc->initialised && enc->multipass_cache_fd
+ && enc->multipass_mode == MULTIPASS_MODE_FIRST_PASS)
+ theora_enc_write_multipass_cache (enc, TRUE, TRUE);
+
+ theora_enc_clear_multipass_cache (enc);
+
+ res = gst_pad_push_event (enc->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ gst_segment_init (&enc->segment, GST_FORMAT_UNDEFINED);
+ res = gst_pad_push_event (enc->srcpad, event);
+ break;
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ {
+ const GstStructure *s;
+
+ s = gst_event_get_structure (event);
+
+ if (gst_structure_has_name (s, "GstForceKeyUnit"))
+ theora_enc_force_keyframe (enc);
+ res = gst_pad_push_event (enc->srcpad, event);
+ break;
+ }
+ default:
+ res = gst_pad_push_event (enc->srcpad, event);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+theora_enc_src_event (GstPad * pad, GstEvent * event)
+{
+ GstTheoraEnc *enc;
+ gboolean res = TRUE;
+
+ enc = GST_THEORA_ENC (GST_PAD_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CUSTOM_UPSTREAM:
+ {
+ const GstStructure *s;
+
+ s = gst_event_get_structure (event);
+
+ if (gst_structure_has_name (s, "GstForceKeyUnit")) {
+ GST_OBJECT_LOCK (enc);
+ enc->force_keyframe = TRUE;
+ GST_OBJECT_UNLOCK (enc);
+ /* consume the event */
+ res = TRUE;
+ gst_event_unref (event);
+ } else {
+ res = gst_pad_push_event (enc->sinkpad, event);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_push_event (enc->sinkpad, event);
+ break;
+ }
+
+ return res;
+}
+
+static gboolean
+theora_enc_is_discontinuous (GstTheoraEnc * enc, GstClockTime timestamp,
+ GstClockTime duration)
+{
+ GstClockTimeDiff max_diff;
+ gboolean ret = FALSE;
+
+ /* Allow 3/4 a frame off */
+ max_diff = (enc->info.fps_denominator * GST_SECOND * 3) /
+ (enc->info.fps_numerator * 4);
+
+ if (timestamp != GST_CLOCK_TIME_NONE
+ && enc->expected_ts != GST_CLOCK_TIME_NONE) {
+ if ((GstClockTimeDiff) (timestamp - enc->expected_ts) > max_diff) {
+ GST_DEBUG_OBJECT (enc, "Incoming TS %" GST_TIME_FORMAT
+ " exceeds expected value %" GST_TIME_FORMAT
+ " by too much, marking discontinuity",
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (enc->expected_ts));
+ ret = TRUE;
+ }
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (duration))
+ enc->expected_ts = timestamp + duration;
+ else
+ enc->expected_ts = GST_CLOCK_TIME_NONE;
+
+ return ret;
+}
+
+static void
+theora_enc_init_buffer (th_ycbcr_buffer buf, GstVideoFrame * frame)
+{
+ guint i;
+
+ /* According to Theora developer Timothy Terriberry, the Theora
+ * encoder will not use memory outside of pic_width/height, even when
+ * the frame size is bigger. The values outside this region will be encoded
+ * to default values.
+ * Due to this, setting the frame's width/height as the buffer width/height
+ * is perfectly ok, even though it does not strictly look ok.
+ */
+ for (i = 0; i < 3; i++) {
+ buf[i].width = GST_VIDEO_FRAME_COMP_WIDTH (frame, i);
+ buf[i].height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, i);
+ buf[i].data = GST_VIDEO_FRAME_COMP_DATA (frame, i);
+ buf[i].stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, i);
+ }
+}
+
+static gboolean
+theora_enc_read_multipass_cache (GstTheoraEnc * enc)
+{
+ GstBuffer *cache_buf;
+ const guint8 *cache_data;
+ gsize bytes_read = 0;
+ gint bytes_consumed = 0;
+ GIOStatus stat = G_IO_STATUS_NORMAL;
+ gboolean done = FALSE;
+
+ while (!done) {
+ if (gst_adapter_available (enc->multipass_cache_adapter) == 0) {
+ guint8 *data;
+ gsize size;
+
+ cache_buf = gst_buffer_new_and_alloc (512);
+
+ data = gst_buffer_map (cache_buf, &size, NULL, GST_MAP_READ);
+ stat = g_io_channel_read_chars (enc->multipass_cache_fd,
+ (gchar *) data, size, &bytes_read, NULL);
+
+ if (bytes_read <= 0) {
+ gst_buffer_unmap (cache_buf, data, 0);
+ gst_buffer_unref (cache_buf);
+ break;
+ } else {
+ gst_buffer_unmap (cache_buf, data, bytes_read);
+ gst_adapter_push (enc->multipass_cache_adapter, cache_buf);
+ }
+ }
+ if (gst_adapter_available (enc->multipass_cache_adapter) == 0)
+ break;
+
+ bytes_read =
+ MIN (gst_adapter_available (enc->multipass_cache_adapter), 512);
+
+ cache_data = gst_adapter_map (enc->multipass_cache_adapter, bytes_read);
+
+ bytes_consumed =
+ th_encode_ctl (enc->encoder, TH_ENCCTL_2PASS_IN, (guint8 *) cache_data,
+ bytes_read);
+ gst_adapter_unmap (enc->multipass_cache_adapter, 0);
+
+ done = bytes_consumed <= 0;
+ if (bytes_consumed > 0)
+ gst_adapter_flush (enc->multipass_cache_adapter, bytes_consumed);
+ }
+
+ if (stat == G_IO_STATUS_ERROR || (stat == G_IO_STATUS_EOF && bytes_read == 0)
+ || bytes_consumed < 0) {
+ GST_ELEMENT_ERROR (enc, RESOURCE, READ, (NULL),
+ ("Failed to read multipass cache file"));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+theora_enc_write_multipass_cache (GstTheoraEnc * enc, gboolean begin,
+ gboolean eos)
+{
+ GError *err = NULL;
+ GIOStatus stat = G_IO_STATUS_NORMAL;
+ gint bytes_read = 0;
+ gsize bytes_written = 0;
+ gchar *buf;
+
+ if (begin)
+ stat = g_io_channel_seek_position (enc->multipass_cache_fd, 0, G_SEEK_SET,
+ &err);
+ if (stat != G_IO_STATUS_ERROR) {
+ do {
+ bytes_read =
+ th_encode_ctl (enc->encoder, TH_ENCCTL_2PASS_OUT, &buf, sizeof (buf));
+ if (bytes_read > 0)
+ g_io_channel_write_chars (enc->multipass_cache_fd, buf, bytes_read,
+ &bytes_written, NULL);
+ } while (bytes_read > 0 && bytes_written > 0);
+
+ }
+
+ if (stat == G_IO_STATUS_ERROR || bytes_read < 0) {
+ if (begin) {
+ if (eos)
+ GST_ELEMENT_WARNING (enc, RESOURCE, WRITE, (NULL),
+ ("Failed to seek to beginning of multipass cache file: %s",
+ err->message));
+ else
+ GST_ELEMENT_ERROR (enc, RESOURCE, WRITE, (NULL),
+ ("Failed to seek to beginning of multipass cache file: %s",
+ err->message));
+ } else {
+ GST_ELEMENT_ERROR (enc, RESOURCE, WRITE, (NULL),
+ ("Failed to write multipass cache file"));
+ }
+ if (err)
+ g_error_free (err);
+
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static GstFlowReturn
+theora_enc_encode_and_push (GstTheoraEnc * enc, ogg_packet op,
+ GstClockTime timestamp, GstClockTime running_time,
+ GstClockTime duration, GstBuffer * buffer)
+{
+ GstFlowReturn ret;
+ th_ycbcr_buffer ycbcr;
+ gint res;
+ GstVideoFrame frame;
+
+ gst_video_frame_map (&frame, &enc->vinfo, buffer, GST_MAP_READ);
+ theora_enc_init_buffer (ycbcr, &frame);
+
+ if (theora_enc_is_discontinuous (enc, running_time, duration)) {
+ theora_enc_reset (enc);
+ enc->granulepos_offset =
+ gst_util_uint64_scale (running_time, enc->vinfo.fps_n,
+ GST_SECOND * enc->vinfo.fps_d);
+ enc->timestamp_offset = running_time;
+ enc->next_ts = 0;
+ enc->next_discont = TRUE;
+ }
+
+ if (enc->multipass_cache_fd
+ && enc->multipass_mode == MULTIPASS_MODE_SECOND_PASS) {
+ if (!theora_enc_read_multipass_cache (enc)) {
+ ret = GST_FLOW_ERROR;
+ goto multipass_read_failed;
+ }
+ }
+
+ res = th_encode_ycbcr_in (enc->encoder, ycbcr);
+ /* none of the failure cases can happen here */
+ g_assert (res == 0);
+
+ if (enc->multipass_cache_fd
+ && enc->multipass_mode == MULTIPASS_MODE_FIRST_PASS) {
+ if (!theora_enc_write_multipass_cache (enc, FALSE, FALSE)) {
+ ret = GST_FLOW_ERROR;
+ goto multipass_write_failed;
+ }
+ }
+
+ ret = GST_FLOW_OK;
+ while (th_encode_packetout (enc->encoder, 0, &op)) {
+ GstClockTime next_time;
+
+ next_time = th_granule_time (enc->encoder, op.granulepos) * GST_SECOND;
+
+ ret =
+ theora_push_packet (enc, &op, timestamp, enc->next_ts,
+ next_time - enc->next_ts);
+
+ enc->next_ts = next_time;
+ if (ret != GST_FLOW_OK)
+ goto data_push;
+ }
+
+done:
+ gst_video_frame_unmap (&frame);
+ gst_buffer_unref (buffer);
+
+ return ret;
+
+ /* ERRORS */
+multipass_read_failed:
+ {
+ GST_DEBUG_OBJECT (enc, "multipass read failed");
+ goto done;
+ }
+multipass_write_failed:
+ {
+ GST_DEBUG_OBJECT (enc, "multipass write failed");
+ goto done;
+ }
+data_push:
+ {
+ GST_DEBUG_OBJECT (enc, "error pushing buffer: %s", gst_flow_get_name (ret));
+ goto done;
+ }
+}
+
+static GstFlowReturn
+theora_enc_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstTheoraEnc *enc;
+ ogg_packet op;
+ GstClockTime timestamp, duration, running_time;
+ GstFlowReturn ret;
+ gboolean force_keyframe;
+
+ enc = GST_THEORA_ENC (GST_PAD_PARENT (pad));
+
+ /* we keep track of two timelines.
+ * - The timestamps from the incomming buffers, which we copy to the outgoing
+ * encoded buffers as-is. We need to do this as we simply forward the
+ * newsegment events.
+ * - The running_time of the buffers, which we use to construct the granulepos
+ * in the packets.
+ */
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ running_time =
+ gst_segment_to_running_time (&enc->segment, GST_FORMAT_TIME, timestamp);
+ if ((gint64) running_time < 0) {
+ GST_DEBUG_OBJECT (enc, "Dropping buffer, timestamp: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+
+ GST_OBJECT_LOCK (enc);
+ if (enc->bitrate_changed) {
+ long int bitrate = enc->video_bitrate;
+
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_BITRATE, &bitrate,
+ sizeof (long int));
+ enc->bitrate_changed = FALSE;
+ }
+
+ if (enc->quality_changed) {
+ long int quality = enc->video_quality;
+
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_QUALITY, &quality,
+ sizeof (long int));
+ enc->quality_changed = FALSE;
+ }
+
+ /* see if we need to schedule a keyframe */
+ force_keyframe = enc->force_keyframe;
+ enc->force_keyframe = FALSE;
+ GST_OBJECT_UNLOCK (enc);
+
+ if (force_keyframe) {
+ GstClockTime stream_time;
+ GstStructure *s;
+
+ stream_time = gst_segment_to_stream_time (&enc->segment,
+ GST_FORMAT_TIME, timestamp);
+
+ s = gst_structure_new ("GstForceKeyUnit",
+ "timestamp", G_TYPE_UINT64, timestamp,
+ "stream-time", G_TYPE_UINT64, stream_time,
+ "running-time", G_TYPE_UINT64, running_time, NULL);
+
+ theora_enc_force_keyframe (enc);
+
+ gst_pad_push_event (enc->srcpad,
+ gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s));
+ }
+
+ /* make sure we copy the discont flag to the next outgoing buffer when it's
+ * set on the incomming buffer */
+ if (GST_BUFFER_IS_DISCONT (buffer)) {
+ enc->next_discont = TRUE;
+ }
+
+ if (enc->packetno == 0) {
+ /* no packets written yet, setup headers */
+ GstCaps *caps;
+ GstBuffer *buf;
+ GSList *buffers = NULL;
+ int result;
+
+ enc->granulepos_offset = 0;
+ enc->timestamp_offset = 0;
+
+ GST_DEBUG_OBJECT (enc, "output headers");
+ /* Theora streams begin with three 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. The
+ third header holds the bitstream codebook. We merely need to
+ make the headers, then pass them to libtheora one at a time;
+ libtheora handles the additional Ogg bitstream constraints */
+
+ /* create the remaining theora headers */
+ th_comment_clear (&enc->comment);
+ th_comment_init (&enc->comment);
+
+ while ((result =
+ th_encode_flushheader (enc->encoder, &enc->comment, &op)) > 0) {
+ ret =
+ theora_buffer_from_packet (enc, &op, GST_CLOCK_TIME_NONE,
+ GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE, &buf);
+ if (ret != GST_FLOW_OK) {
+ goto header_buffer_alloc;
+ }
+ buffers = g_slist_prepend (buffers, buf);
+ }
+ if (result < 0) {
+ g_slist_foreach (buffers, (GFunc) gst_buffer_unref, NULL);
+ g_slist_free (buffers);
+ goto encoder_disabled;
+ }
+
+ buffers = g_slist_reverse (buffers);
+
+ /* mark buffers and put on caps */
+ caps = gst_caps_new_simple ("video/x-theora",
+ "width", G_TYPE_INT, enc->vinfo.width,
+ "height", G_TYPE_INT, enc->vinfo.height,
+ "framerate", GST_TYPE_FRACTION, enc->vinfo.fps_n, enc->vinfo.fps_d,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, enc->vinfo.par_n,
+ enc->vinfo.par_d, NULL);
+ caps = theora_set_header_on_caps (caps, buffers);
+ GST_DEBUG ("here are the caps: %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (enc->srcpad, caps);
+ gst_caps_unref (caps);
+
+ /* push out the header buffers */
+ while (buffers) {
+ buf = buffers->data;
+ buffers = g_slist_delete_link (buffers, buffers);
+ if ((ret = theora_push_buffer (enc, buf)) != GST_FLOW_OK) {
+ g_slist_foreach (buffers, (GFunc) gst_buffer_unref, NULL);
+ g_slist_free (buffers);
+ goto header_push;
+ }
+ }
+
+ enc->granulepos_offset =
+ gst_util_uint64_scale (running_time, enc->vinfo.fps_n,
+ GST_SECOND * enc->vinfo.fps_d);
+ enc->timestamp_offset = running_time;
+ enc->next_ts = 0;
+ }
+
+ ret = theora_enc_encode_and_push (enc, op, timestamp, running_time, duration,
+ buffer);
+
+ return ret;
+
+ /* ERRORS */
+header_buffer_alloc:
+ {
+ gst_buffer_unref (buffer);
+ return ret;
+ }
+header_push:
+ {
+ gst_buffer_unref (buffer);
+ return ret;
+ }
+encoder_disabled:
+ {
+ GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL),
+ ("libtheora has been compiled with the encoder disabled"));
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstStateChangeReturn
+theora_enc_change_state (GstElement * element, GstStateChange transition)
+{
+ GstTheoraEnc *enc;
+ GstStateChangeReturn ret;
+
+ enc = GST_THEORA_ENC (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (enc, "READY->PAUSED Initing theora state");
+ th_info_init (&enc->info);
+ th_comment_init (&enc->comment);
+ enc->packetno = 0;
+ enc->force_keyframe = FALSE;
+
+ if (enc->multipass_mode >= MULTIPASS_MODE_FIRST_PASS) {
+ GError *err = NULL;
+
+ if (!enc->multipass_cache_file) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), (NULL));
+ return ret;
+ }
+ enc->multipass_cache_fd =
+ g_io_channel_new_file (enc->multipass_cache_file,
+ (enc->multipass_mode == MULTIPASS_MODE_FIRST_PASS ? "w" : "r"),
+ &err);
+
+ if (enc->multipass_mode == MULTIPASS_MODE_SECOND_PASS)
+ enc->multipass_cache_adapter = gst_adapter_new ();
+
+ if (!enc->multipass_cache_fd) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ GST_ELEMENT_ERROR (enc, RESOURCE, OPEN_READ, (NULL),
+ ("Failed to open multipass cache file: %s", err->message));
+ g_error_free (err);
+ return ret;
+ }
+
+ g_io_channel_set_encoding (enc->multipass_cache_fd, NULL, NULL);
+ }
+ 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_DEBUG_OBJECT (enc, "PAUSED->READY Clearing theora state");
+ if (enc->encoder) {
+ th_encode_free (enc->encoder);
+ enc->encoder = NULL;
+ }
+ th_comment_clear (&enc->comment);
+ th_info_clear (&enc->info);
+
+ theora_enc_clear (enc);
+ enc->initialised = FALSE;
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+theora_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTheoraEnc *enc = GST_THEORA_ENC (object);
+
+ switch (prop_id) {
+ case PROP_CENTER:
+ case PROP_BORDER:
+ case PROP_QUICK:
+ case PROP_KEYFRAME_THRESHOLD:
+ case PROP_KEYFRAME_MINDISTANCE:
+ case PROP_NOISE_SENSITIVITY:
+ case PROP_SHARPNESS:
+ /* kept for API compat, but ignored */
+ break;
+ case PROP_BITRATE:
+ GST_OBJECT_LOCK (enc);
+ enc->video_bitrate = g_value_get_int (value) * 1000;
+ enc->bitrate_changed = TRUE;
+ GST_OBJECT_UNLOCK (enc);
+ break;
+ case PROP_QUALITY:
+ GST_OBJECT_LOCK (enc);
+ if (GST_STATE (enc) >= GST_STATE_PAUSED && enc->video_bitrate > 0) {
+ GST_WARNING_OBJECT (object, "Can't change from bitrate to quality mode"
+ " while playing");
+ } else {
+ enc->video_quality = g_value_get_int (value);
+ enc->video_bitrate = 0;
+ enc->quality_changed = TRUE;
+ }
+ GST_OBJECT_UNLOCK (enc);
+ break;
+ case PROP_KEYFRAME_AUTO:
+ enc->keyframe_auto = g_value_get_boolean (value);
+ break;
+ case PROP_KEYFRAME_FREQ:
+ enc->keyframe_freq = g_value_get_int (value);
+ break;
+ case PROP_KEYFRAME_FREQ_FORCE:
+ enc->keyframe_force = g_value_get_int (value);
+ break;
+ case PROP_SPEEDLEVEL:
+ enc->speed_level = g_value_get_int (value);
+ if (enc->encoder) {
+ th_encode_ctl (enc->encoder, TH_ENCCTL_SET_SPLEVEL, &enc->speed_level,
+ sizeof (enc->speed_level));
+ }
+ break;
+ case PROP_VP3_COMPATIBLE:
+ enc->vp3_compatible = g_value_get_boolean (value);
+ break;
+ case PROP_DROP_FRAMES:
+ enc->drop_frames = g_value_get_boolean (value);
+ break;
+ case PROP_CAP_OVERFLOW:
+ enc->cap_overflow = g_value_get_boolean (value);
+ break;
+ case PROP_CAP_UNDERFLOW:
+ enc->cap_underflow = g_value_get_boolean (value);
+ break;
+ case PROP_RATE_BUFFER:
+ enc->rate_buffer = g_value_get_int (value);
+ break;
+ case PROP_MULTIPASS_CACHE_FILE:
+ enc->multipass_cache_file = g_value_dup_string (value);
+ break;
+ case PROP_MULTIPASS_MODE:
+ enc->multipass_mode = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+theora_enc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTheoraEnc *enc = GST_THEORA_ENC (object);
+
+ switch (prop_id) {
+ case PROP_CENTER:
+ g_value_set_boolean (value, TRUE);
+ break;
+ case PROP_BORDER:
+ g_value_set_enum (value, BORDER_BLACK);
+ break;
+ case PROP_BITRATE:
+ GST_OBJECT_LOCK (enc);
+ g_value_set_int (value, enc->video_bitrate / 1000);
+ GST_OBJECT_UNLOCK (enc);
+ break;
+ case PROP_QUALITY:
+ GST_OBJECT_LOCK (enc);
+ g_value_set_int (value, enc->video_quality);
+ GST_OBJECT_UNLOCK (enc);
+ break;
+ case PROP_QUICK:
+ g_value_set_boolean (value, TRUE);
+ break;
+ case PROP_KEYFRAME_AUTO:
+ g_value_set_boolean (value, enc->keyframe_auto);
+ break;
+ case PROP_KEYFRAME_FREQ:
+ g_value_set_int (value, enc->keyframe_freq);
+ break;
+ case PROP_KEYFRAME_FREQ_FORCE:
+ g_value_set_int (value, enc->keyframe_force);
+ break;
+ case PROP_KEYFRAME_THRESHOLD:
+ g_value_set_int (value, 80);
+ break;
+ case PROP_KEYFRAME_MINDISTANCE:
+ g_value_set_int (value, 8);
+ break;
+ case PROP_NOISE_SENSITIVITY:
+ g_value_set_int (value, 1);
+ break;
+ case PROP_SHARPNESS:
+ g_value_set_int (value, 0);
+ break;
+ case PROP_SPEEDLEVEL:
+ g_value_set_int (value, enc->speed_level);
+ break;
+ case PROP_VP3_COMPATIBLE:
+ g_value_set_boolean (value, enc->vp3_compatible);
+ break;
+ case PROP_DROP_FRAMES:
+ g_value_set_boolean (value, enc->drop_frames);
+ break;
+ case PROP_CAP_OVERFLOW:
+ g_value_set_boolean (value, enc->cap_overflow);
+ break;
+ case PROP_CAP_UNDERFLOW:
+ g_value_set_boolean (value, enc->cap_underflow);
+ break;
+ case PROP_RATE_BUFFER:
+ g_value_set_int (value, enc->rate_buffer);
+ break;
+ case PROP_MULTIPASS_CACHE_FILE:
+ g_value_set_string (value, enc->multipass_cache_file);
+ break;
+ case PROP_MULTIPASS_MODE:
+ g_value_set_enum (value, enc->multipass_mode);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/ext/theora/gsttheoraenc.h b/ext/theora/gsttheoraenc.h
new file mode 100644
index 0000000..8df35de
--- /dev/null
+++ b/ext/theora/gsttheoraenc.h
@@ -0,0 +1,141 @@
+/* GStreamer
+ * Copyright (C) 2004 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.
+ */
+
+#ifndef __GST_THEORAENC_H__
+#define __GST_THEORAENC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+#include <theora/theoraenc.h>
+
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_THEORA_ENC \
+ (gst_theora_enc_get_type())
+#define GST_THEORA_ENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_THEORA_ENC,GstTheoraEnc))
+#define GST_THEORA_ENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_THEORA_ENC,GstTheoraEncClass))
+#define GST_IS_THEORA_ENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_THEORA_ENC))
+#define GST_IS_THEORA_ENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_THEORA_ENC))
+
+typedef struct _GstTheoraEnc GstTheoraEnc;
+typedef struct _GstTheoraEncClass GstTheoraEncClass;
+
+/**
+ * GstTheoraEncBorderMode:
+ * @BORDER_NONE: no border
+ * @BORDER_BLACK: black border
+ * @BORDER_MIRROR: Mirror image in border
+ *
+ * Border color to add when sizes not multiple of 16.
+ */
+typedef enum
+{
+ BORDER_NONE,
+ BORDER_BLACK,
+ BORDER_MIRROR
+}
+GstTheoraEncBorderMode;
+
+/**
+ * GstTheoraEncMultipassMode:
+ * @MULTIPASS_MODE_SINGLE_PASS: Single pass encoding
+ * @MULTIPASS_MODE_FIRST_PASS: First pass of two pass encoding
+ * @MULTIPASS_MODE_SECOND_PASS: Second pass of two pass encoding
+ *
+ */
+typedef enum
+{
+ MULTIPASS_MODE_SINGLE_PASS,
+ MULTIPASS_MODE_FIRST_PASS,
+ MULTIPASS_MODE_SECOND_PASS
+} GstTheoraEncMultipassMode;
+
+/**
+ * GstTheoraEnc:
+ *
+ * Opaque data structure.
+ */
+struct _GstTheoraEnc
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstSegment segment;
+
+ ogg_stream_state to;
+
+ th_enc_ctx *encoder;
+ th_info info;
+ th_comment comment;
+ gboolean initialised;
+
+ gint video_bitrate; /* bitrate target for Theora video */
+ gboolean bitrate_changed;
+ gint video_quality; /* Theora quality selector 0 = low, 63 = high */
+ gboolean quality_changed;
+ gboolean keyframe_auto;
+ gint keyframe_freq;
+ gint keyframe_force;
+
+ GstVideoInfo vinfo;
+ gint info_width, info_height;
+ GstClockTime next_ts;
+
+ GstClockTime expected_ts;
+ gboolean next_discont;
+
+ gboolean force_keyframe;
+
+ guint packetno;
+ guint64 bytes_out;
+ guint64 granulepos_offset;
+ guint64 timestamp_offset;
+
+ gint speed_level;
+ gboolean vp3_compatible;
+ gboolean drop_frames;
+ gboolean cap_overflow;
+ gboolean cap_underflow;
+ int rate_buffer;
+
+ GstTheoraEncMultipassMode multipass_mode;
+ GIOChannel *multipass_cache_fd;
+ GstAdapter *multipass_cache_adapter;
+ gchar *multipass_cache_file;
+};
+
+struct _GstTheoraEncClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_theora_enc_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_THEORAENC_H__ */
+
diff --git a/ext/theora/gsttheoraparse.c b/ext/theora/gsttheoraparse.c
new file mode 100644
index 0000000..25b046f
--- /dev/null
+++ b/ext/theora/gsttheoraparse.c
@@ -0,0 +1,936 @@
+/* GStreamer
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2006 Andy Wingo <wingo@pobox.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-theoraparse
+ * @see_also: theoradec, oggdemux, vorbisparse
+ *
+ * The theoraparse element will parse the header packets of the Theora
+ * stream and put them as the streamheader in the caps. This is used in the
+ * multifdsink case where you want to stream live theora streams to multiple
+ * clients, each client has to receive the streamheaders first before they can
+ * consume the theora 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
+ * theoraparse outputs have all of the metadata that oggmux expects to receive,
+ * which allows you to (for example) remux an ogg/theora file.
+ *
+ * In addition, this element allows you to fix badly synchronized streams. You
+ * pass in an array of (granule time, buffer time) synchronization points via
+ * the synchronization-points GValueArray property, and this element will adjust
+ * the granulepos values that it outputs. The adjustment will be made by
+ * offsetting all buffers that it outputs by a specified amount, and updating
+ * that offset from the value array whenever a keyframe is processed.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=video.ogg ! oggdemux ! theoraparse ! fakesink
+ * ]| This pipeline shows that the streamheader is set in the caps, and that each
+ * buffer has the timestamp, duration, offset, and offset_end set.
+ * |[
+ * gst-launch filesrc location=video.ogg ! oggdemux ! theoraparse \
+ * ! oggmux ! filesink location=video-remuxed.ogg
+ * ]| This pipeline shows remuxing. video-remuxed.ogg might not be exactly the same
+ * as video.ogg, but they should produce exactly the same decoded data.
+ * </refsect2>
+ *
+ * Last reviewed on 2008-05-28 (0.10.20)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gsttheoraparse.h"
+
+#define GST_CAT_DEFAULT theoraparse_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+static GstStaticPadTemplate theora_parse_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-theora")
+ );
+
+static GstStaticPadTemplate theora_parse_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-theora")
+ );
+
+enum
+{
+ PROP_0,
+ PROP_SYNCHRONIZATION_POINTS
+};
+
+#define gst_theora_parse_parent_class parent_class
+G_DEFINE_TYPE (GstTheoraParse, gst_theora_parse, GST_TYPE_ELEMENT);
+
+static void theora_parse_dispose (GObject * object);
+static void theora_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void theora_parse_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn theora_parse_chain (GstPad * pad, GstBuffer * buffer);
+static GstStateChangeReturn theora_parse_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean theora_parse_sink_event (GstPad * pad, GstEvent * event);
+static gboolean theora_parse_src_query (GstPad * pad, GstQuery * query);
+
+static void
+gst_theora_parse_class_init (GstTheoraParseClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->dispose = theora_parse_dispose;
+ gobject_class->get_property = theora_parse_get_property;
+ gobject_class->set_property = theora_parse_set_property;
+
+ /**
+ * GstTheoraParse:sychronization-points
+ *
+ * An array of (granuletime, buffertime) pairs
+ *
+ * Since: 0.10.10
+ */
+ g_object_class_install_property (gobject_class, PROP_SYNCHRONIZATION_POINTS,
+ g_param_spec_value_array ("synchronization-points",
+ "Synchronization points",
+ "An array of (granuletime, buffertime) pairs",
+ g_param_spec_uint64 ("time", "Time",
+ "Time (either granuletime or buffertime)", 0, G_MAXUINT64, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS),
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_parse_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&theora_parse_sink_factory));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Theora video parser", "Codec/Parser/Video",
+ "parse raw theora streams", "Andy Wingo <wingo@pobox.com>");
+
+ gstelement_class->change_state = theora_parse_change_state;
+
+ GST_DEBUG_CATEGORY_INIT (theoraparse_debug, "theoraparse", 0,
+ "Theora parser");
+}
+
+static void
+gst_theora_parse_init (GstTheoraParse * parse)
+{
+ parse->sinkpad =
+ gst_pad_new_from_static_template (&theora_parse_sink_factory, "sink");
+ gst_pad_set_chain_function (parse->sinkpad, theora_parse_chain);
+ gst_pad_set_event_function (parse->sinkpad, theora_parse_sink_event);
+ gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
+
+ parse->srcpad =
+ gst_pad_new_from_static_template (&theora_parse_src_factory, "src");
+ gst_pad_set_query_function (parse->srcpad, theora_parse_src_query);
+ gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad);
+}
+
+static void
+theora_parse_dispose (GObject * object)
+{
+ GstTheoraParse *parse = GST_THEORA_PARSE (object);
+
+ g_free (parse->times);
+ parse->times = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+theora_parse_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTheoraParse *parse = GST_THEORA_PARSE (object);
+
+ switch (prop_id) {
+ case PROP_SYNCHRONIZATION_POINTS:
+ {
+ GValueArray *array;
+ guint i;
+
+ array = g_value_get_boxed (value);
+
+ if (array) {
+ if (array->n_values % 2)
+ goto odd_values;
+
+ g_free (parse->times);
+ parse->times = g_new (GstClockTime, array->n_values);
+ parse->npairs = array->n_values / 2;
+ for (i = 0; i < array->n_values; i++)
+ parse->times[i] = g_value_get_uint64 (&array->values[i]);
+ } else {
+ g_free (parse->times);
+ parse->npairs = 0;
+ }
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ return;
+
+odd_values:
+ {
+ g_critical ("expected an even number of time values for "
+ "synchronization-points");
+ return;
+ }
+}
+
+static void
+theora_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTheoraParse *parse = GST_THEORA_PARSE (object);
+
+ switch (prop_id) {
+ case PROP_SYNCHRONIZATION_POINTS:
+ {
+ GValueArray *array = NULL;
+ guint i;
+
+ array = g_value_array_new (parse->npairs * 2);
+
+ for (i = 0; i < parse->npairs; i++) {
+ GValue v = { 0, };
+
+ g_value_init (&v, G_TYPE_UINT64);
+ g_value_set_uint64 (&v, parse->times[i * 2]);
+ g_value_array_append (array, &v);
+ g_value_set_uint64 (&v, parse->times[i * 2 + 1]);
+ g_value_array_append (array, &v);
+ g_value_unset (&v);
+ }
+
+ g_value_set_boxed (value, array);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+theora_parse_set_header_on_caps (GstTheoraParse * parse, GstCaps * caps)
+{
+ GstBuffer **bufs;
+ GstStructure *structure;
+ gint i;
+ GValue array = { 0 };
+ GValue value = { 0 };
+
+ bufs = parse->streamheader;
+ structure = gst_caps_get_structure (caps, 0);
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ for (i = 0; i < 3; i++) {
+ if (bufs[i] == NULL)
+ continue;
+
+ bufs[i] = gst_buffer_make_writable (bufs[i]);
+ GST_BUFFER_FLAG_SET (bufs[i], GST_BUFFER_FLAG_IN_CAPS);
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, bufs[i]);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ }
+
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+}
+
+/* two tasks to do here: set the streamheader on the caps, and use libtheora to
+ parse the headers */
+static void
+theora_parse_set_streamheader (GstTheoraParse * parse)
+{
+ GstCaps *caps;
+ gint i;
+ guint32 bitstream_version;
+ th_setup_info *setup = NULL;
+
+ g_assert (!parse->streamheader_received);
+
+ caps = gst_caps_make_writable (gst_pad_get_caps (parse->srcpad, NULL));
+ theora_parse_set_header_on_caps (parse, caps);
+ GST_DEBUG_OBJECT (parse, "here are the caps: %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (parse->srcpad, caps);
+ gst_caps_unref (caps);
+
+ for (i = 0; i < 3; i++) {
+ ogg_packet packet;
+ GstBuffer *buf;
+ int ret;
+ gsize size;
+
+ buf = parse->streamheader[i];
+ if (buf == NULL)
+ continue;
+
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (buf);
+ packet.packetno = i + 1;
+ packet.e_o_s = 0;
+ packet.b_o_s = (i == 0);
+ ret = th_decode_headerin (&parse->info, &parse->comment, &setup, &packet);
+ gst_buffer_unmap (buf, packet.packet, size);
+ if (ret < 0) {
+ GST_WARNING_OBJECT (parse, "Failed to decode Theora header %d: %d\n",
+ i + 1, ret);
+ }
+ }
+ if (setup) {
+ th_setup_free (setup);
+ }
+
+ parse->fps_n = parse->info.fps_numerator;
+ parse->fps_d = parse->info.fps_denominator;
+ parse->shift = parse->info.keyframe_granule_shift;
+
+ /* With libtheora-1.0beta1 the granulepos scheme was changed:
+ * where earlier the granulepos refered to the index/beginning
+ * of a frame, it now refers to the end, which matches the use
+ * in vorbis/speex. We check the bitstream version from the header so
+ * we know which way to interpret the incoming granuepos
+ */
+ bitstream_version = (parse->info.version_major << 16) |
+ (parse->info.version_minor << 8) | parse->info.version_subminor;
+ parse->is_old_bitstream = (bitstream_version <= 0x00030200);
+
+ parse->streamheader_received = TRUE;
+}
+
+static void
+theora_parse_drain_event_queue (GstTheoraParse * parse)
+{
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_pad_event_default (parse->sinkpad, event);
+ }
+}
+
+static void
+theora_parse_push_headers (GstTheoraParse * parse)
+{
+ gint i;
+
+ theora_parse_drain_event_queue (parse);
+
+ if (!parse->streamheader_received)
+ theora_parse_set_streamheader (parse);
+
+ /* ignore return values, we pass along the result of pushing data packets only
+ */
+ for (i = 0; i < 3; i++) {
+ GstBuffer *buf;
+
+ if ((buf = parse->streamheader[i])) {
+ gst_pad_push (parse->srcpad, buf);
+ parse->streamheader[i] = NULL;
+ }
+ }
+}
+
+static void
+theora_parse_clear_queue (GstTheoraParse * parse)
+{
+ while (parse->buffer_queue->length) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+ gst_buffer_unref (buf);
+ }
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_event_unref (event);
+ }
+}
+
+static gint64
+make_granulepos (GstTheoraParse * parse, gint64 keyframe, gint64 frame)
+{
+ gint64 iframe;
+
+ if (keyframe == -1)
+ keyframe = 0;
+ /* If using newer theora, offset the granulepos by +1, see comment in
+ * theora_parse_set_streamheader.
+ *
+ * We don't increment keyframe directly, as internally we always index frames
+ * starting from 0 and we do some sanity checking below. */
+ if (!parse->is_old_bitstream)
+ iframe = keyframe + 1;
+ else
+ iframe = keyframe;
+
+ g_return_val_if_fail (frame >= keyframe, -1);
+ g_return_val_if_fail (frame - keyframe < 1 << parse->shift, -1);
+
+ return (iframe << parse->shift) + (frame - keyframe);
+}
+
+static void
+parse_granulepos (GstTheoraParse * parse, gint64 granulepos,
+ gint64 * keyframe, gint64 * frame)
+{
+ gint64 kf;
+
+ kf = granulepos >> parse->shift;
+ /* If using newer theora, offset the granulepos by -1, see comment
+ * in theora_parse_set_streamheader */
+ if (!parse->is_old_bitstream)
+ kf -= 1;
+ if (keyframe)
+ *keyframe = kf;
+ if (frame)
+ *frame = kf + (granulepos & ((1 << parse->shift) - 1));
+}
+
+static gboolean
+is_keyframe (GstBuffer * buf)
+{
+ gsize size;
+ guint8 data[1];
+
+ size = gst_buffer_get_size (buf);
+ if (size == 0)
+ return FALSE;
+
+ gst_buffer_extract (buf, 0, data, 1);
+
+ return ((data[0] & 0x40) == 0);
+}
+
+static void
+theora_parse_munge_granulepos (GstTheoraParse * parse, GstBuffer * buf,
+ gint64 keyframe, gint64 frame)
+{
+ gint64 frames_diff;
+ GstClockTimeDiff time_diff;
+
+ if (keyframe == frame) {
+ gint i;
+
+ /* update granule_offset */
+ for (i = 0; i < parse->npairs; i++) {
+ if (parse->times[i * 2] >= GST_BUFFER_OFFSET (buf))
+ break;
+ }
+ if (i > 0) {
+ /* time_diff gets reset below */
+ time_diff = parse->times[i * 2 - 1] - parse->times[i * 2 - 2];
+ parse->granule_offset = gst_util_uint64_scale (time_diff,
+ parse->fps_n, parse->fps_d * GST_SECOND);
+ parse->granule_offset <<= parse->shift;
+ }
+ }
+
+ frames_diff = parse->granule_offset >> parse->shift;
+ time_diff = gst_util_uint64_scale_int (GST_SECOND * frames_diff,
+ parse->fps_d, parse->fps_n);
+
+ GST_DEBUG_OBJECT (parse, "offsetting theora stream by %" G_GINT64_FORMAT
+ " frames (%" GST_TIME_FORMAT ")", frames_diff, GST_TIME_ARGS (time_diff));
+
+ GST_BUFFER_OFFSET_END (buf) += parse->granule_offset;
+ GST_BUFFER_OFFSET (buf) += time_diff;
+ GST_BUFFER_TIMESTAMP (buf) += time_diff;
+}
+
+static GstFlowReturn
+theora_parse_push_buffer (GstTheoraParse * parse, GstBuffer * buf,
+ gint64 keyframe, gint64 frame)
+{
+
+ GstClockTime this_time, next_time;
+
+ this_time = gst_util_uint64_scale_int (GST_SECOND * frame,
+ parse->fps_d, parse->fps_n);
+
+ next_time = gst_util_uint64_scale_int (GST_SECOND * (frame + 1),
+ parse->fps_d, parse->fps_n);
+
+ GST_BUFFER_OFFSET_END (buf) = make_granulepos (parse, keyframe, frame);
+ GST_BUFFER_OFFSET (buf) = this_time;
+ GST_BUFFER_TIMESTAMP (buf) = this_time;
+ GST_BUFFER_DURATION (buf) = next_time - this_time;
+
+ if (parse->times)
+ theora_parse_munge_granulepos (parse, buf, keyframe, frame);
+
+ GST_DEBUG_OBJECT (parse, "pushing buffer with granulepos %" G_GINT64_FORMAT
+ "|%" G_GINT64_FORMAT, keyframe, frame - keyframe);
+
+ return gst_pad_push (parse->srcpad, buf);
+}
+
+static GstFlowReturn
+theora_parse_drain_queue_prematurely (GstTheoraParse * parse)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ /* got an EOS event, make sure to push out any buffers that were in the queue
+ * -- won't normally be the case, but this catches the
+ * didn't-get-a-granulepos-on-the-last-packet case. Assuming a continuous
+ * stream. */
+
+ GST_DEBUG_OBJECT (parse, "got EOS, draining queue");
+
+ /* if we get an eos before pushing the streamheaders, drain our events before
+ * eos */
+ theora_parse_drain_event_queue (parse);
+
+ while (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+
+ parse->prev_frame++;
+
+ if (is_keyframe (buf))
+ /* we have a keyframe */
+ parse->prev_keyframe = parse->prev_frame;
+ else
+ GST_BUFFER_FLAGS (buf) |= GST_BUFFER_FLAG_DELTA_UNIT;
+
+ if (parse->prev_keyframe < 0) {
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buf)) {
+ parse_granulepos (parse, GST_BUFFER_OFFSET_END (buf),
+ &parse->prev_keyframe, NULL);
+ } else {
+ /* No previous keyframe known; can't extract one from this frame. That
+ * means we can't do any valid output for this frame, just continue to
+ * the next frame.
+ */
+ gst_buffer_unref (buf);
+ continue;
+ }
+ }
+
+ ret = theora_parse_push_buffer (parse, buf, parse->prev_keyframe,
+ parse->prev_frame);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+theora_parse_drain_queue (GstTheoraParse * parse, gint64 granulepos)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint64 keyframe, prev_frame, frame;
+
+ parse_granulepos (parse, granulepos, &keyframe, &frame);
+
+ GST_DEBUG ("draining queue of length %d",
+ g_queue_get_length (parse->buffer_queue));
+
+ GST_LOG_OBJECT (parse, "gp %" G_GINT64_FORMAT ", kf %" G_GINT64_FORMAT
+ ", frame %" G_GINT64_FORMAT, granulepos, keyframe, frame);
+
+ prev_frame = frame - g_queue_get_length (parse->buffer_queue);
+
+ GST_LOG_OBJECT (parse,
+ "new prev %" G_GINT64_FORMAT ", prev %" G_GINT64_FORMAT, prev_frame,
+ parse->prev_frame);
+
+ if (prev_frame < parse->prev_frame) {
+ GST_WARNING ("jumped %" G_GINT64_FORMAT
+ " frames backwards! not sure what to do here",
+ parse->prev_frame - prev_frame);
+ parse->prev_frame = prev_frame;
+ } else if (prev_frame > parse->prev_frame) {
+ GST_INFO ("discontinuity detected (%" G_GINT64_FORMAT
+ " frames)", prev_frame - parse->prev_frame);
+ if (keyframe <= prev_frame && keyframe > parse->prev_keyframe)
+ parse->prev_keyframe = keyframe;
+ parse->prev_frame = prev_frame;
+ }
+
+ while (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+
+ parse->prev_frame++;
+ g_assert (parse->prev_frame >= 0);
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+
+ if (is_keyframe (buf))
+ /* we have a keyframe */
+ parse->prev_keyframe = parse->prev_frame;
+ else
+ GST_BUFFER_FLAGS (buf) |= GST_BUFFER_FLAG_DELTA_UNIT;
+
+ ret = theora_parse_push_buffer (parse, buf, parse->prev_keyframe,
+ parse->prev_frame);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+theora_parse_queue_buffer (GstTheoraParse * parse, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ buf = gst_buffer_make_writable (buf);
+
+ g_queue_push_tail (parse->buffer_queue, buf);
+
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buf)) {
+ if (parse->prev_keyframe < 0) {
+ parse_granulepos (parse, GST_BUFFER_OFFSET_END (buf),
+ &parse->prev_keyframe, NULL);
+ }
+ ret = theora_parse_drain_queue (parse, GST_BUFFER_OFFSET_END (buf));
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+theora_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn ret;
+ GstTheoraParse *parse;
+ guint8 *data, header;
+ gsize size;
+ gboolean have_header;
+
+ parse = GST_THEORA_PARSE (gst_pad_get_parent (pad));
+
+ have_header = FALSE;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ header = data[0];
+ gst_buffer_unmap (buffer, data, size);
+
+ if (size >= 1) {
+ if (header & 0x80)
+ have_header = TRUE;
+ }
+
+ if (have_header) {
+ if (parse->send_streamheader) {
+ /* we need to collect the headers still */
+ /* so put it on the streamheader list and return */
+ if (header >= 0x80 && header <= 0x82)
+ parse->streamheader[header - 0x80] = buffer;
+ }
+ ret = GST_FLOW_OK;
+ } else {
+ /* data packet, push the headers we collected before */
+ if (parse->send_streamheader) {
+ theora_parse_push_headers (parse);
+ parse->send_streamheader = FALSE;
+ }
+
+ ret = theora_parse_queue_buffer (parse, buffer);
+ }
+
+ gst_object_unref (parse);
+
+ return ret;
+}
+
+static gboolean
+theora_parse_queue_event (GstTheoraParse * parse, GstEvent * event)
+{
+ g_queue_push_tail (parse->event_queue, event);
+ return TRUE;
+}
+
+static gboolean
+theora_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret;
+ GstTheoraParse *parse;
+
+ parse = GST_THEORA_PARSE (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ theora_parse_clear_queue (parse);
+ parse->prev_keyframe = -1;
+ parse->prev_frame = -1;
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_EOS:
+ theora_parse_drain_queue_prematurely (parse);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ default:
+ if (parse->send_streamheader && GST_EVENT_IS_SERIALIZED (event))
+ ret = theora_parse_queue_event (parse, event);
+ else
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (parse);
+
+ return ret;
+}
+
+static gboolean
+theora_parse_src_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstTheoraParse *parse;
+ guint64 scale = 1;
+
+ if (src_format == *dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ parse = GST_THEORA_PARSE (gst_pad_get_parent (pad));
+
+ /* we need the info part before we can done something */
+ if (!parse->streamheader_received)
+ goto no_header;
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ *dest_value = gst_util_uint64_scale_int (src_value, 2,
+ parse->info.pic_height * parse->info.pic_width * 3);
+ break;
+ case GST_FORMAT_TIME:
+ /* seems like a rather silly conversion, implement me if you like */
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ scale = 3 * (parse->info.pic_width * parse->info.pic_height) / 2;
+ case GST_FORMAT_DEFAULT:
+ *dest_value = scale * gst_util_uint64_scale (src_value,
+ parse->info.fps_numerator,
+ parse->info.fps_denominator * GST_SECOND);
+ break;
+ default:
+ GST_DEBUG_OBJECT (parse, "cannot convert to format %s",
+ gst_format_get_name (*dest_format));
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * parse->info.fps_denominator,
+ parse->info.fps_numerator);
+ break;
+ case GST_FORMAT_BYTES:
+ *dest_value = gst_util_uint64_scale_int (src_value,
+ 3 * parse->info.pic_width * parse->info.pic_height, 2);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+done:
+ gst_object_unref (parse);
+ return res;
+
+ /* ERRORS */
+no_header:
+ {
+ GST_DEBUG_OBJECT (parse, "no header yet, cannot convert");
+ res = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+theora_parse_src_query (GstPad * pad, GstQuery * query)
+{
+ GstTheoraParse *parse;
+
+ gboolean res = FALSE;
+
+ parse = GST_THEORA_PARSE (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 frame, value;
+ GstFormat my_format, format;
+ gint64 time;
+
+ frame = parse->prev_frame;
+
+ GST_LOG_OBJECT (parse,
+ "query %p: we have current frame: %" G_GINT64_FORMAT, query, frame);
+
+ /* parse format */
+ gst_query_parse_position (query, &format, NULL);
+
+ /* and convert to the final format in two steps with time as the
+ * intermediate step */
+ my_format = GST_FORMAT_TIME;
+ if (!(res =
+ theora_parse_src_convert (parse->sinkpad, GST_FORMAT_DEFAULT,
+ frame, &my_format, &time)))
+ goto error;
+
+ /* fixme: handle segments
+ time = (time - parse->segment.start) + parse->segment.time;
+ */
+
+ GST_LOG_OBJECT (parse,
+ "query %p: our time: %" GST_TIME_FORMAT " (conv to %s)",
+ query, GST_TIME_ARGS (time), gst_format_get_name (format));
+
+ if (!(res =
+ theora_parse_src_convert (pad, my_format, time, &format, &value)))
+ goto error;
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (parse,
+ "query %p: we return %" G_GINT64_FORMAT " (format %u)", query, value,
+ format);
+
+ break;
+ }
+ case GST_QUERY_DURATION:
+ /* forward to peer for total */
+ if (!(res = gst_pad_query (GST_PAD_PEER (parse->sinkpad), query)))
+ goto error;
+ break;
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!(res =
+ theora_parse_src_convert (pad, src_fmt, src_val, &dest_fmt,
+ &dest_val)))
+ goto error;
+
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+done:
+ gst_object_unref (parse);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (parse, "query failed");
+ goto done;
+ }
+}
+
+static GstStateChangeReturn
+theora_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstTheoraParse *parse = GST_THEORA_PARSE (element);
+ GstStateChangeReturn ret;
+ gint i;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ th_info_init (&parse->info);
+ th_comment_init (&parse->comment);
+ parse->send_streamheader = TRUE;
+ parse->buffer_queue = g_queue_new ();
+ parse->event_queue = g_queue_new ();
+ parse->prev_keyframe = -1;
+ parse->prev_frame = -1;
+ parse->granule_offset = 0;
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ th_info_clear (&parse->info);
+ th_comment_clear (&parse->comment);
+ theora_parse_clear_queue (parse);
+ g_queue_free (parse->buffer_queue);
+ g_queue_free (parse->event_queue);
+ parse->buffer_queue = NULL;
+ for (i = 0; i < 3; i++) {
+ if (parse->streamheader[i]) {
+ gst_buffer_unref (parse->streamheader[i]);
+ parse->streamheader[i] = NULL;
+ }
+ }
+ parse->streamheader_received = FALSE;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/ext/theora/gsttheoraparse.h b/ext/theora/gsttheoraparse.h
new file mode 100644
index 0000000..8314287
--- /dev/null
+++ b/ext/theora/gsttheoraparse.h
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2006 Andy Wingo <wingo@pobox.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_THEORA_PARSE_H__
+#define __GST_THEORA_PARSE_H__
+
+
+#include <gst/gst.h>
+#include <theora/theoradec.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_THEORA_PARSE \
+ (gst_theora_parse_get_type())
+#define GST_THEORA_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_THEORA_PARSE,GstTheoraParse))
+#define GST_THEORA_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_THEORA_PARSE,GstTheoraParseClass))
+#define GST_IS_THEORA_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_THEORA_PARSE))
+#define GST_IS_THEORA_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_THEORA_PARSE))
+
+typedef struct _GstTheoraParse GstTheoraParse;
+typedef struct _GstTheoraParseClass GstTheoraParseClass;
+
+/**
+ * GstTheoraParse:
+ *
+ * Opaque data structure.
+ */
+struct _GstTheoraParse {
+ GstElement element;
+
+ GstPad * sinkpad;
+ GstPad * srcpad;
+
+ gboolean send_streamheader;
+ gboolean streamheader_received;
+ gboolean is_old_bitstream;
+ GstBuffer * streamheader[3];
+
+ GQueue * event_queue;
+ GQueue * buffer_queue;
+
+ th_info info;
+ th_comment comment;
+
+ gint64 prev_frame;
+ gint64 prev_keyframe;
+ guint32 fps_n;
+ guint32 fps_d;
+ gint shift;
+ gint64 granule_offset;
+
+ GstClockTime *times;
+ gint npairs;
+};
+
+struct _GstTheoraParseClass {
+ GstElementClass parent_class;
+};
+
+GType gst_theora_parse_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_THEORA_PARSE_H__ */
diff --git a/ext/vorbis/Makefile.am b/ext/vorbis/Makefile.am
new file mode 100644
index 0000000..7c18ff1
--- /dev/null
+++ b/ext/vorbis/Makefile.am
@@ -0,0 +1,60 @@
+plugin_LTLIBRARIES =
+
+if USE_VORBIS
+plugin_LTLIBRARIES += libgstvorbis.la
+
+libgstvorbis_la_SOURCES = gstvorbis.c \
+ gstvorbisdec.c \
+ gstvorbisdeclib.c \
+ gstvorbisenc.c \
+ gstvorbisparse.c \
+ gstvorbistag.c \
+ gstvorbiscommon.c
+
+libgstvorbis_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(VORBIS_CFLAGS)
+## AM_PATH_VORBIS also sets VORBISENC_LIBS
+libgstvorbis_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) \
+ $(VORBIS_LIBS) $(VORBISENC_LIBS)
+libgstvorbis_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvorbis_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+if USE_IVORBIS
+plugin_LTLIBRARIES += libgstivorbisdec.la
+
+libgstivorbisdec_la_SOURCES = gstivorbisdec.c \
+ gstvorbisdec.c gstvorbisdeclib.c gstvorbiscommon.c
+libgstivorbisdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \
+ -DTREMOR $(IVORBIS_CFLAGS)
+libgstivorbisdec_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) $(IVORBIS_LIBS)
+libgstivorbisdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstivorbisdec_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+noinst_HEADERS = gstvorbisenc.h \
+ gstvorbisdec.h \
+ gstvorbisdeclib.h \
+ gstvorbisparse.h \
+ gstvorbistag.h \
+ gstvorbiscommon.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstivorbisdec -:SHARED libgstivorbisdec \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstivorbisdec_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstivorbisdec_la_CFLAGS) \
+ -:LDFLAGS $(libgstivorbisdec_la_LDFLAGS) \
+ $(libgstivorbisdec_la_LIBADD) \
+ -lvorbisidec \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/ext/vorbis/Makefile.in b/ext/vorbis/Makefile.in
new file mode 100644
index 0000000..d0c1d7d
--- /dev/null
+++ b/ext/vorbis/Makefile.in
@@ -0,0 +1,925 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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_VORBIS_TRUE@am__append_1 = libgstvorbis.la
+@USE_IVORBIS_TRUE@am__append_2 = libgstivorbisdec.la
+subdir = ext/vorbis
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+@USE_IVORBIS_TRUE@ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+@USE_IVORBIS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__libgstivorbisdec_la_SOURCES_DIST = gstivorbisdec.c gstvorbisdec.c \
+ gstvorbisdeclib.c gstvorbiscommon.c
+@USE_IVORBIS_TRUE@am_libgstivorbisdec_la_OBJECTS = \
+@USE_IVORBIS_TRUE@ libgstivorbisdec_la-gstivorbisdec.lo \
+@USE_IVORBIS_TRUE@ libgstivorbisdec_la-gstvorbisdec.lo \
+@USE_IVORBIS_TRUE@ libgstivorbisdec_la-gstvorbisdeclib.lo \
+@USE_IVORBIS_TRUE@ libgstivorbisdec_la-gstvorbiscommon.lo
+libgstivorbisdec_la_OBJECTS = $(am_libgstivorbisdec_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstivorbisdec_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) \
+ $(libgstivorbisdec_la_LDFLAGS) $(LDFLAGS) -o $@
+@USE_IVORBIS_TRUE@am_libgstivorbisdec_la_rpath = -rpath $(plugindir)
+@USE_VORBIS_TRUE@libgstvorbis_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+@USE_VORBIS_TRUE@ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+@USE_VORBIS_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@USE_VORBIS_TRUE@ $(am__DEPENDENCIES_1)
+am__libgstvorbis_la_SOURCES_DIST = gstvorbis.c gstvorbisdec.c \
+ gstvorbisdeclib.c gstvorbisenc.c gstvorbisparse.c \
+ gstvorbistag.c gstvorbiscommon.c
+@USE_VORBIS_TRUE@am_libgstvorbis_la_OBJECTS = \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbis.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbisdec.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbisdeclib.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbisenc.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbisparse.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbistag.lo \
+@USE_VORBIS_TRUE@ libgstvorbis_la-gstvorbiscommon.lo
+libgstvorbis_la_OBJECTS = $(am_libgstvorbis_la_OBJECTS)
+libgstvorbis_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstvorbis_la_CFLAGS) $(CFLAGS) \
+ $(libgstvorbis_la_LDFLAGS) $(LDFLAGS) -o $@
+@USE_VORBIS_TRUE@am_libgstvorbis_la_rpath = -rpath $(plugindir)
+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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstivorbisdec_la_SOURCES) $(libgstvorbis_la_SOURCES)
+DIST_SOURCES = $(am__libgstivorbisdec_la_SOURCES_DIST) \
+ $(am__libgstvorbis_la_SOURCES_DIST)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = $(am__append_1) $(am__append_2)
+@USE_VORBIS_TRUE@libgstvorbis_la_SOURCES = gstvorbis.c \
+@USE_VORBIS_TRUE@ gstvorbisdec.c \
+@USE_VORBIS_TRUE@ gstvorbisdeclib.c \
+@USE_VORBIS_TRUE@ gstvorbisenc.c \
+@USE_VORBIS_TRUE@ gstvorbisparse.c \
+@USE_VORBIS_TRUE@ gstvorbistag.c \
+@USE_VORBIS_TRUE@ gstvorbiscommon.c
+
+@USE_VORBIS_TRUE@libgstvorbis_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(VORBIS_CFLAGS)
+@USE_VORBIS_TRUE@libgstvorbis_la_LIBADD = \
+@USE_VORBIS_TRUE@ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+@USE_VORBIS_TRUE@ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+@USE_VORBIS_TRUE@ $(GST_LIBS) \
+@USE_VORBIS_TRUE@ $(VORBIS_LIBS) $(VORBISENC_LIBS)
+
+@USE_VORBIS_TRUE@libgstvorbis_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+@USE_VORBIS_TRUE@libgstvorbis_la_LIBTOOLFLAGS = --tag=disable-static
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_SOURCES = gstivorbisdec.c \
+@USE_IVORBIS_TRUE@ gstvorbisdec.c gstvorbisdeclib.c gstvorbiscommon.c
+
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \
+@USE_IVORBIS_TRUE@ -DTREMOR $(IVORBIS_CFLAGS)
+
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_LIBADD = \
+@USE_IVORBIS_TRUE@ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+@USE_IVORBIS_TRUE@ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+@USE_IVORBIS_TRUE@ $(GST_LIBS) $(IVORBIS_LIBS)
+
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+@USE_IVORBIS_TRUE@libgstivorbisdec_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstvorbisenc.h \
+ gstvorbisdec.h \
+ gstvorbisdeclib.h \
+ gstvorbisparse.h \
+ gstvorbistag.h \
+ gstvorbiscommon.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/vorbis/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu ext/vorbis/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
+libgstivorbisdec.la: $(libgstivorbisdec_la_OBJECTS) $(libgstivorbisdec_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstivorbisdec_la_LINK) $(am_libgstivorbisdec_la_rpath) $(libgstivorbisdec_la_OBJECTS) $(libgstivorbisdec_la_LIBADD) $(LIBS)
+libgstvorbis.la: $(libgstvorbis_la_OBJECTS) $(libgstvorbis_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvorbis_la_LINK) $(am_libgstvorbis_la_rpath) $(libgstvorbis_la_OBJECTS) $(libgstvorbis_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstivorbisdec_la-gstivorbisdec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstivorbisdec_la-gstvorbiscommon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstivorbisdec_la-gstvorbisdec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstivorbisdec_la-gstvorbisdeclib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbis.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbiscommon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbisdec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbisdeclib.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbisenc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbisparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvorbis_la-gstvorbistag.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstivorbisdec_la-gstivorbisdec.lo: gstivorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -MT libgstivorbisdec_la-gstivorbisdec.lo -MD -MP -MF $(DEPDIR)/libgstivorbisdec_la-gstivorbisdec.Tpo -c -o libgstivorbisdec_la-gstivorbisdec.lo `test -f 'gstivorbisdec.c' || echo '$(srcdir)/'`gstivorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstivorbisdec_la-gstivorbisdec.Tpo $(DEPDIR)/libgstivorbisdec_la-gstivorbisdec.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstivorbisdec.c' object='libgstivorbisdec_la-gstivorbisdec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -c -o libgstivorbisdec_la-gstivorbisdec.lo `test -f 'gstivorbisdec.c' || echo '$(srcdir)/'`gstivorbisdec.c
+
+libgstivorbisdec_la-gstvorbisdec.lo: gstvorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -MT libgstivorbisdec_la-gstvorbisdec.lo -MD -MP -MF $(DEPDIR)/libgstivorbisdec_la-gstvorbisdec.Tpo -c -o libgstivorbisdec_la-gstvorbisdec.lo `test -f 'gstvorbisdec.c' || echo '$(srcdir)/'`gstvorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstivorbisdec_la-gstvorbisdec.Tpo $(DEPDIR)/libgstivorbisdec_la-gstvorbisdec.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisdec.c' object='libgstivorbisdec_la-gstvorbisdec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -c -o libgstivorbisdec_la-gstvorbisdec.lo `test -f 'gstvorbisdec.c' || echo '$(srcdir)/'`gstvorbisdec.c
+
+libgstivorbisdec_la-gstvorbisdeclib.lo: gstvorbisdeclib.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -MT libgstivorbisdec_la-gstvorbisdeclib.lo -MD -MP -MF $(DEPDIR)/libgstivorbisdec_la-gstvorbisdeclib.Tpo -c -o libgstivorbisdec_la-gstvorbisdeclib.lo `test -f 'gstvorbisdeclib.c' || echo '$(srcdir)/'`gstvorbisdeclib.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstivorbisdec_la-gstvorbisdeclib.Tpo $(DEPDIR)/libgstivorbisdec_la-gstvorbisdeclib.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisdeclib.c' object='libgstivorbisdec_la-gstvorbisdeclib.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -c -o libgstivorbisdec_la-gstvorbisdeclib.lo `test -f 'gstvorbisdeclib.c' || echo '$(srcdir)/'`gstvorbisdeclib.c
+
+libgstivorbisdec_la-gstvorbiscommon.lo: gstvorbiscommon.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -MT libgstivorbisdec_la-gstvorbiscommon.lo -MD -MP -MF $(DEPDIR)/libgstivorbisdec_la-gstvorbiscommon.Tpo -c -o libgstivorbisdec_la-gstvorbiscommon.lo `test -f 'gstvorbiscommon.c' || echo '$(srcdir)/'`gstvorbiscommon.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstivorbisdec_la-gstvorbiscommon.Tpo $(DEPDIR)/libgstivorbisdec_la-gstvorbiscommon.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbiscommon.c' object='libgstivorbisdec_la-gstvorbiscommon.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstivorbisdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstivorbisdec_la_CFLAGS) $(CFLAGS) -c -o libgstivorbisdec_la-gstvorbiscommon.lo `test -f 'gstvorbiscommon.c' || echo '$(srcdir)/'`gstvorbiscommon.c
+
+libgstvorbis_la-gstvorbis.lo: gstvorbis.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbis.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbis.Tpo -c -o libgstvorbis_la-gstvorbis.lo `test -f 'gstvorbis.c' || echo '$(srcdir)/'`gstvorbis.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbis.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbis.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbis.c' object='libgstvorbis_la-gstvorbis.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbis.lo `test -f 'gstvorbis.c' || echo '$(srcdir)/'`gstvorbis.c
+
+libgstvorbis_la-gstvorbisdec.lo: gstvorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbisdec.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbisdec.Tpo -c -o libgstvorbis_la-gstvorbisdec.lo `test -f 'gstvorbisdec.c' || echo '$(srcdir)/'`gstvorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbisdec.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbisdec.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisdec.c' object='libgstvorbis_la-gstvorbisdec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbisdec.lo `test -f 'gstvorbisdec.c' || echo '$(srcdir)/'`gstvorbisdec.c
+
+libgstvorbis_la-gstvorbisdeclib.lo: gstvorbisdeclib.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbisdeclib.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbisdeclib.Tpo -c -o libgstvorbis_la-gstvorbisdeclib.lo `test -f 'gstvorbisdeclib.c' || echo '$(srcdir)/'`gstvorbisdeclib.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbisdeclib.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbisdeclib.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisdeclib.c' object='libgstvorbis_la-gstvorbisdeclib.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbisdeclib.lo `test -f 'gstvorbisdeclib.c' || echo '$(srcdir)/'`gstvorbisdeclib.c
+
+libgstvorbis_la-gstvorbisenc.lo: gstvorbisenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbisenc.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbisenc.Tpo -c -o libgstvorbis_la-gstvorbisenc.lo `test -f 'gstvorbisenc.c' || echo '$(srcdir)/'`gstvorbisenc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbisenc.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbisenc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisenc.c' object='libgstvorbis_la-gstvorbisenc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbisenc.lo `test -f 'gstvorbisenc.c' || echo '$(srcdir)/'`gstvorbisenc.c
+
+libgstvorbis_la-gstvorbisparse.lo: gstvorbisparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbisparse.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbisparse.Tpo -c -o libgstvorbis_la-gstvorbisparse.lo `test -f 'gstvorbisparse.c' || echo '$(srcdir)/'`gstvorbisparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbisparse.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbisparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbisparse.c' object='libgstvorbis_la-gstvorbisparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbisparse.lo `test -f 'gstvorbisparse.c' || echo '$(srcdir)/'`gstvorbisparse.c
+
+libgstvorbis_la-gstvorbistag.lo: gstvorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbistag.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbistag.Tpo -c -o libgstvorbis_la-gstvorbistag.lo `test -f 'gstvorbistag.c' || echo '$(srcdir)/'`gstvorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbistag.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbistag.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbistag.c' object='libgstvorbis_la-gstvorbistag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbistag.lo `test -f 'gstvorbistag.c' || echo '$(srcdir)/'`gstvorbistag.c
+
+libgstvorbis_la-gstvorbiscommon.lo: gstvorbiscommon.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -MT libgstvorbis_la-gstvorbiscommon.lo -MD -MP -MF $(DEPDIR)/libgstvorbis_la-gstvorbiscommon.Tpo -c -o libgstvorbis_la-gstvorbiscommon.lo `test -f 'gstvorbiscommon.c' || echo '$(srcdir)/'`gstvorbiscommon.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvorbis_la-gstvorbiscommon.Tpo $(DEPDIR)/libgstvorbis_la-gstvorbiscommon.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbiscommon.c' object='libgstvorbis_la-gstvorbiscommon.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvorbis_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvorbis_la_CFLAGS) $(CFLAGS) -c -o libgstvorbis_la-gstvorbiscommon.lo `test -f 'gstvorbiscommon.c' || echo '$(srcdir)/'`gstvorbiscommon.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstivorbisdec -:SHARED libgstivorbisdec \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstivorbisdec_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstivorbisdec_la_CFLAGS) \
+ -:LDFLAGS $(libgstivorbisdec_la_LDFLAGS) \
+ $(libgstivorbisdec_la_LIBADD) \
+ -lvorbisidec \
+ -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/ext/vorbis/README b/ext/vorbis/README
new file mode 100644
index 0000000..6b31510
--- /dev/null
+++ b/ext/vorbis/README
@@ -0,0 +1,16 @@
+oggvorbisenc : encodes to vorbis inside an ogg stream. This is not the
+ GStreamer way of doing things and should be removed for
+ 0.9. It is still called "vorbisenc" for backward compatibility
+ reasons. It also takes integer audio as input.
+vorbisenc : Encodes to a raw vorbis stream and should be used together
+ with an ogg muxer such as "oggmux" it is called "rawvorbisenc".
+ It also takes raw float samples as input.
+
+TODO for 0.9:
+
+- remove oggvorbisenc.c and oggvorbisenc.h
+- remove references to oggvorbisenc.[ch] in the Makefile and in vorbis.c
+- remove the element vorbisenc.
+- rename the element rawvorbisenc to vorbisenc.
+
+
diff --git a/ext/vorbis/gstivorbisdec.c b/ext/vorbis/gstivorbisdec.c
new file mode 100644
index 0000000..d938238
--- /dev/null
+++ b/ext/vorbis/gstivorbisdec.c
@@ -0,0 +1,47 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvorbisdec.h"
+
+GST_DEBUG_CATEGORY (vorbisdec_debug);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+
+ /* if tremor is around, there is probably good reason for it, so preferred */
+ if (!gst_element_register (plugin, "ivorbisdec", GST_RANK_SECONDARY,
+ gst_vorbis_dec_get_type ()))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (vorbisdec_debug, "ivorbisdec", 0,
+ "vorbis decoding element (integer decoder)");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "ivorbisdec",
+ "Vorbis Tremor decoder",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/vorbis/gstvorbis.c b/ext/vorbis/gstvorbis.c
new file mode 100644
index 0000000..f710aaa
--- /dev/null
+++ b/ext/vorbis/gstvorbis.c
@@ -0,0 +1,73 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst/tag/tag.h"
+
+#include "gstvorbisenc.h"
+#include "gstvorbisdec.h"
+#include "gstvorbisparse.h"
+#include "gstvorbistag.h"
+
+GST_DEBUG_CATEGORY (vorbisenc_debug);
+GST_DEBUG_CATEGORY (vorbisdec_debug);
+GST_DEBUG_CATEGORY (vorbisparse_debug);
+GST_DEBUG_CATEGORY (vorbistag_debug);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "vorbisenc", GST_RANK_PRIMARY,
+ GST_TYPE_VORBISENC))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "vorbisdec", GST_RANK_PRIMARY,
+ gst_vorbis_dec_get_type ()))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "vorbisparse", GST_RANK_NONE,
+ gst_vorbis_parse_get_type ()))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "vorbistag", GST_RANK_NONE,
+ gst_vorbis_tag_get_type ()))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (vorbisenc_debug, "vorbisenc", 0,
+ "vorbis encoding element");
+ GST_DEBUG_CATEGORY_INIT (vorbisdec_debug, "vorbisdec", 0,
+ "vorbis decoding element");
+ GST_DEBUG_CATEGORY_INIT (vorbisparse_debug, "vorbisparse", 0,
+ "vorbis parsing element");
+ GST_DEBUG_CATEGORY_INIT (vorbistag_debug, "vorbistag", 0,
+ "vorbis tagging element");
+
+ gst_tag_register_musicbrainz_tags ();
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "vorbis",
+ "Vorbis plugin library",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/vorbis/gstvorbiscommon.c b/ext/vorbis/gstvorbiscommon.c
new file mode 100644
index 0000000..c4dd408
--- /dev/null
+++ b/ext/vorbis/gstvorbiscommon.c
@@ -0,0 +1,75 @@
+/* GStreamer
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvorbiscommon.h"
+
+/* http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9 */
+const GstAudioChannelPosition gst_vorbis_channel_positions[][8] = {
+ { /* Mono */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO},
+ { /* Stereo */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
+ { /* Stereo + Centre */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
+ { /* Quadraphonic */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ },
+ { /* Stereo + Centre + rear stereo */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ },
+ { /* Full 5.1 Surround */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+ },
+ { /* 6.1 Surround, in Vorbis spec since 2010-01-13 */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_LFE},
+ { /* 7.1 Surround, in Vorbis spec since 2010-01-13 */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE},
+};
diff --git a/ext/vorbis/gstvorbiscommon.h b/ext/vorbis/gstvorbiscommon.h
new file mode 100644
index 0000000..563b8f7
--- /dev/null
+++ b/ext/vorbis/gstvorbiscommon.h
@@ -0,0 +1,28 @@
+/* GStreamer
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VORBIS_COMMON_H__
+#define __GST_VORBIS_COMMON_H__
+
+#include <gst/gst.h>
+#include <gst/audio/multichannel.h>
+
+extern const GstAudioChannelPosition gst_vorbis_channel_positions[][8];
+
+#endif /* __GST_VORBIS_COMMON_H__ */
diff --git a/ext/vorbis/gstvorbisdec.c b/ext/vorbis/gstvorbisdec.c
new file mode 100644
index 0000000..d4225e8
--- /dev/null
+++ b/ext/vorbis/gstvorbisdec.c
@@ -0,0 +1,1317 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.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.
+ */
+
+/**
+ * SECTION:element-vorbisdec
+ * @see_also: vorbisenc, oggdemux
+ *
+ * This element decodes a Vorbis stream to raw float audio.
+ * <ulink url="http://www.vorbis.com/">Vorbis</ulink> is a royalty-free
+ * audio codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
+ * Foundation</ulink>.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! alsasink
+ * ]| Decode an Ogg/Vorbis. To create an Ogg/Vorbis file refer to the documentation of vorbisenc.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstvorbisdec.h"
+#include <string.h>
+#include <gst/audio/audio.h>
+#include <gst/tag/tag.h>
+#include <gst/audio/multichannel.h>
+
+#include "gstvorbiscommon.h"
+
+GST_DEBUG_CATEGORY_EXTERN (vorbisdec_debug);
+#define GST_CAT_DEFAULT vorbisdec_debug
+
+static GstStaticPadTemplate vorbis_dec_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_VORBIS_DEC_SRC_CAPS);
+
+static GstStaticPadTemplate vorbis_dec_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-vorbis")
+ );
+
+#define gst_vorbis_dec_parent_class parent_class
+G_DEFINE_TYPE (GST_VORBIS_DEC_GLIB_TYPE_NAME, gst_vorbis_dec, GST_TYPE_ELEMENT);
+
+static void vorbis_dec_finalize (GObject * object);
+static gboolean vorbis_dec_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn vorbis_dec_chain (GstPad * pad, GstBuffer * buffer);
+static GstFlowReturn vorbis_dec_chain_forward (GstVorbisDec * vd,
+ gboolean discont, GstBuffer * buffer);
+static GstFlowReturn vorbis_dec_chain_reverse (GstVorbisDec * vd,
+ gboolean discont, GstBuffer * buf);
+static GstStateChangeReturn vorbis_dec_change_state (GstElement * element,
+ GstStateChange transition);
+
+static gboolean vorbis_dec_src_event (GstPad * pad, GstEvent * event);
+static gboolean vorbis_dec_src_query (GstPad * pad, GstQuery * query);
+static gboolean vorbis_dec_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat dest_format, gint64 * dest_value);
+
+static gboolean vorbis_dec_sink_query (GstPad * pad, GstQuery * query);
+
+static void
+gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->finalize = vorbis_dec_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_dec_src_factory));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_dec_sink_factory));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Vorbis audio decoder", "Codec/Decoder/Audio",
+ GST_VORBIS_DEC_DESCRIPTION,
+ "Benjamin Otte <otte@gnome.org>, Chris Lord <chris@openedhand.com>");
+
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (vorbis_dec_change_state);
+}
+
+static const GstQueryType *
+vorbis_get_query_types (GstPad * pad)
+{
+ static const GstQueryType vorbis_dec_src_query_types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return vorbis_dec_src_query_types;
+}
+
+static void
+gst_vorbis_dec_init (GstVorbisDec * dec)
+{
+ dec->sinkpad = gst_pad_new_from_static_template (&vorbis_dec_sink_factory,
+ "sink");
+
+ gst_pad_set_event_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (vorbis_dec_sink_event));
+ gst_pad_set_chain_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (vorbis_dec_chain));
+ gst_pad_set_query_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (vorbis_dec_sink_query));
+ gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
+
+ dec->srcpad = gst_pad_new_from_static_template (&vorbis_dec_src_factory,
+ "src");
+
+ gst_pad_set_event_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (vorbis_dec_src_event));
+ gst_pad_set_query_type_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (vorbis_get_query_types));
+ gst_pad_set_query_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (vorbis_dec_src_query));
+ gst_pad_use_fixed_caps (dec->srcpad);
+ gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+
+ dec->queued = NULL;
+ dec->pendingevents = NULL;
+ dec->taglist = NULL;
+}
+
+static void
+vorbis_dec_finalize (GObject * object)
+{
+ /* Release any possibly allocated libvorbis data.
+ * _clear functions can safely be called multiple times
+ */
+ GstVorbisDec *vd = GST_VORBIS_DEC (object);
+
+#ifndef USE_TREMOLO
+ vorbis_block_clear (&vd->vb);
+#endif
+
+ vorbis_dsp_clear (&vd->vd);
+ vorbis_comment_clear (&vd->vc);
+ vorbis_info_clear (&vd->vi);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_vorbis_dec_reset (GstVorbisDec * dec)
+{
+ dec->last_timestamp = GST_CLOCK_TIME_NONE;
+ dec->discont = TRUE;
+ dec->seqnum = gst_util_seqnum_next ();
+ gst_segment_init (&dec->segment, GST_FORMAT_TIME);
+
+ g_list_foreach (dec->queued, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->queued);
+ dec->queued = NULL;
+ g_list_foreach (dec->gather, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->gather);
+ dec->gather = NULL;
+ g_list_foreach (dec->decode, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->decode);
+ dec->decode = NULL;
+ g_list_foreach (dec->pendingevents, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (dec->pendingevents);
+ dec->pendingevents = NULL;
+
+ if (dec->taglist)
+ gst_tag_list_free (dec->taglist);
+ dec->taglist = NULL;
+}
+
+
+static gboolean
+vorbis_dec_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstVorbisDec *dec;
+
+ if (src_format == dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
+
+ if (!dec->initialized)
+ goto no_header;
+
+ if (dec->sinkpad == pad &&
+ (src_format == GST_FORMAT_BYTES || dest_format == GST_FORMAT_BYTES))
+ goto no_format;
+
+ res = gst_audio_info_convert (&dec->info, src_format, src_value, dest_format,
+ dest_value);
+
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+no_header:
+ {
+ GST_DEBUG_OBJECT (dec, "no header packets received");
+ res = FALSE;
+ goto done;
+ }
+no_format:
+ {
+ GST_DEBUG_OBJECT (dec, "formats unsupported");
+ res = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+vorbis_dec_src_query (GstPad * pad, GstQuery * query)
+{
+ GstVorbisDec *dec;
+ gboolean res = FALSE;
+
+ dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (dec == NULL))
+ return FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 value;
+ GstFormat format;
+ gint64 time;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ /* we start from the last seen time */
+ time = dec->last_timestamp;
+ /* correct for the segment values */
+ time = gst_segment_to_stream_time (&dec->segment, GST_FORMAT_TIME, time);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: our time: %" GST_TIME_FORMAT, query, GST_TIME_ARGS (time));
+
+ /* and convert to the final format */
+ if (!(res =
+ vorbis_dec_convert (pad, GST_FORMAT_TIME, time, format, &value)))
+ goto error;
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: we return %" G_GINT64_FORMAT " (format %u)", query, value,
+ format);
+
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ res = gst_pad_peer_query (dec->sinkpad, query);
+ if (!res)
+ goto error;
+
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!(res =
+ vorbis_dec_convert (pad, src_fmt, src_val, dest_fmt, &dest_val)))
+ goto error;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_WARNING_OBJECT (dec, "error handling query");
+ goto done;
+ }
+}
+
+static gboolean
+vorbis_dec_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstVorbisDec *dec;
+ gboolean res;
+
+ dec = GST_VORBIS_DEC (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 =
+ vorbis_dec_convert (pad, src_fmt, src_val, dest_fmt, &dest_val)))
+ goto error;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+error:
+ {
+ GST_DEBUG_OBJECT (dec, "error converting value");
+ goto done;
+ }
+}
+
+static gboolean
+vorbis_dec_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstVorbisDec *dec;
+
+ dec = GST_VORBIS_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_SEEK:
+ {
+ GstFormat format, tformat;
+ gdouble rate;
+ GstEvent *real_seek;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ gint64 tcur, tstop;
+ guint32 seqnum;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+ &stop_type, &stop);
+ seqnum = gst_event_get_seqnum (event);
+ gst_event_unref (event);
+
+ /* First bring the requested format to time */
+ tformat = GST_FORMAT_TIME;
+ if (!(res = vorbis_dec_convert (pad, format, cur, tformat, &tcur)))
+ goto convert_error;
+ if (!(res = vorbis_dec_convert (pad, format, stop, tformat, &tstop)))
+ goto convert_error;
+
+ /* then seek with time on the peer */
+ real_seek = gst_event_new_seek (rate, GST_FORMAT_TIME,
+ flags, cur_type, tcur, stop_type, tstop);
+ gst_event_set_seqnum (real_seek, seqnum);
+
+ res = gst_pad_push_event (dec->sinkpad, real_seek);
+ break;
+ }
+ default:
+ res = gst_pad_push_event (dec->sinkpad, event);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+convert_error:
+ {
+ GST_DEBUG_OBJECT (dec, "cannot convert start/stop for seek");
+ goto done;
+ }
+}
+
+static gboolean
+vorbis_dec_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret = FALSE;
+ GstVorbisDec *dec;
+
+ dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
+
+ GST_LOG_OBJECT (dec, "handling event");
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ if (dec->segment.rate < 0.0)
+ vorbis_dec_chain_reverse (dec, TRUE, NULL);
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ /* here we must clean any state in the decoder */
+#ifdef HAVE_VORBIS_SYNTHESIS_RESTART
+ vorbis_synthesis_restart (&dec->vd);
+#endif
+ gst_vorbis_dec_reset (dec);
+ ret = gst_pad_push_event (dec->srcpad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ /* we need time for now */
+ if (segment->format != GST_FORMAT_TIME)
+ goto newseg_wrong_format;
+
+ GST_DEBUG_OBJECT (dec, "segment: %" GST_SEGMENT_FORMAT, segment);
+
+ /* now configure the values */
+ gst_segment_copy_into (segment, &dec->segment);
+ dec->seqnum = gst_event_get_seqnum (event);
+
+ if (dec->initialized)
+ /* and forward */
+ ret = gst_pad_push_event (dec->srcpad, event);
+ else {
+ /* store it to send once we're initialized */
+ dec->pendingevents = g_list_append (dec->pendingevents, event);
+ ret = TRUE;
+ }
+ break;
+ }
+ case GST_EVENT_TAG:
+ {
+ if (dec->initialized)
+ /* and forward */
+ ret = gst_pad_push_event (dec->srcpad, event);
+ else {
+ /* store it to send once we're initialized */
+ dec->pendingevents = g_list_append (dec->pendingevents, event);
+ ret = TRUE;
+ }
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return ret;
+
+ /* ERRORS */
+newseg_wrong_format:
+ {
+ GST_DEBUG_OBJECT (dec, "received non TIME newsegment");
+ goto done;
+ }
+}
+
+static GstFlowReturn
+vorbis_handle_identification_packet (GstVorbisDec * vd)
+{
+ GstCaps *caps;
+ GstAudioInfo info;
+ const GstAudioChannelPosition *pos = NULL;
+
+ gst_audio_info_set_format (&info, GST_VORBIS_AUDIO_FORMAT, vd->vi.rate,
+ vd->vi.channels);
+
+ switch (info.channels) {
+ case 1:
+ case 2:
+ /* nothing */
+ break;
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ pos = gst_vorbis_channel_positions[info.channels - 1];
+ break;
+ default:
+ {
+ gint i, max_pos = MAX (info.channels, 64);
+
+ GST_ELEMENT_WARNING (vd, STREAM, DECODE,
+ (NULL), ("Using NONE channel layout for more than 8 channels"));
+ for (i = 0; i < max_pos; i++)
+ info.position[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
+ }
+ }
+
+ caps = gst_audio_info_to_caps (&info);
+ gst_pad_set_caps (vd->srcpad, caps);
+ gst_caps_unref (caps);
+
+ vd->info = info;
+ /* select a copy_samples function, this way we can have specialized versions
+ * for mono/stereo and avoid the depth switch in tremor case */
+ vd->copy_samples = get_copy_sample_func (info.channels);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
+{
+ guint bitrate = 0;
+ gchar *encoder = NULL;
+ GstTagList *list, *old_list;
+ guint8 *data;
+ gsize size;
+
+ GST_DEBUG_OBJECT (vd, "parsing comment packet");
+
+ data = gst_ogg_packet_data (packet);
+ size = gst_ogg_packet_size (packet);
+
+ list =
+ gst_tag_list_from_vorbiscomment (data, size, (guint8 *) "\003vorbis", 7,
+ &encoder);
+
+ old_list = vd->taglist;
+ vd->taglist = gst_tag_list_merge (vd->taglist, list, GST_TAG_MERGE_REPLACE);
+
+ if (old_list)
+ gst_tag_list_free (old_list);
+ gst_tag_list_free (list);
+
+ if (!vd->taglist) {
+ GST_ERROR_OBJECT (vd, "couldn't decode comments");
+ vd->taglist = gst_tag_list_new ();
+ }
+ if (encoder) {
+ if (encoder[0])
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER, encoder, NULL);
+ g_free (encoder);
+ }
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_ENCODER_VERSION, vd->vi.version,
+ GST_TAG_AUDIO_CODEC, "Vorbis", NULL);
+ if (vd->vi.bitrate_nominal > 0 && vd->vi.bitrate_nominal <= 0x7FFFFFFF) {
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_NOMINAL_BITRATE, (guint) vd->vi.bitrate_nominal, NULL);
+ bitrate = vd->vi.bitrate_nominal;
+ }
+ if (vd->vi.bitrate_upper > 0 && vd->vi.bitrate_upper <= 0x7FFFFFFF) {
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MAXIMUM_BITRATE, (guint) vd->vi.bitrate_upper, NULL);
+ if (!bitrate)
+ bitrate = vd->vi.bitrate_upper;
+ }
+ if (vd->vi.bitrate_lower > 0 && vd->vi.bitrate_lower <= 0x7FFFFFFF) {
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MINIMUM_BITRATE, (guint) vd->vi.bitrate_lower, NULL);
+ if (!bitrate)
+ bitrate = vd->vi.bitrate_lower;
+ }
+ if (bitrate) {
+ gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_BITRATE, (guint) bitrate, NULL);
+ }
+
+ if (vd->initialized) {
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (vd), vd->srcpad,
+ vd->taglist);
+ vd->taglist = NULL;
+ } else {
+ /* Only post them as messages for the time being. *
+ * They will be pushed on the pad once the decoder is initialized */
+ gst_element_post_message (GST_ELEMENT_CAST (vd),
+ gst_message_new_tag (GST_OBJECT (vd), gst_tag_list_copy (vd->taglist)));
+ }
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+vorbis_handle_type_packet (GstVorbisDec * vd)
+{
+ GList *walk;
+ gint res;
+
+ g_assert (vd->initialized == FALSE);
+
+#ifdef USE_TREMOLO
+ if (G_UNLIKELY ((res = vorbis_dsp_init (&vd->vd, &vd->vi))))
+ goto synthesis_init_error;
+#else
+ if (G_UNLIKELY ((res = vorbis_synthesis_init (&vd->vd, &vd->vi))))
+ goto synthesis_init_error;
+
+ if (G_UNLIKELY ((res = vorbis_block_init (&vd->vd, &vd->vb))))
+ goto block_init_error;
+#endif
+
+ vd->initialized = TRUE;
+
+ if (vd->pendingevents) {
+ for (walk = vd->pendingevents; walk; walk = g_list_next (walk))
+ gst_pad_push_event (vd->srcpad, GST_EVENT_CAST (walk->data));
+ g_list_free (vd->pendingevents);
+ vd->pendingevents = NULL;
+ }
+
+ if (vd->taglist) {
+ /* The tags have already been sent on the bus as messages. */
+ gst_pad_push_event (vd->srcpad, gst_event_new_tag (vd->taglist));
+ vd->taglist = NULL;
+ }
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+synthesis_init_error:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("couldn't initialize synthesis (%d)", res));
+ return GST_FLOW_ERROR;
+ }
+block_init_error:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("couldn't initialize block (%d)", res));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+vorbis_handle_header_packet (GstVorbisDec * vd, ogg_packet * packet)
+{
+ GstFlowReturn res;
+ gint ret;
+
+ GST_DEBUG_OBJECT (vd, "parsing header packet");
+
+ /* Packetno = 0 if the first byte is exactly 0x01 */
+ packet->b_o_s = ((gst_ogg_packet_data (packet))[0] == 0x1) ? 1 : 0;
+
+#ifdef USE_TREMOLO
+ if ((ret = vorbis_dsp_headerin (&vd->vi, &vd->vc, packet)))
+#else
+ if ((ret = vorbis_synthesis_headerin (&vd->vi, &vd->vc, packet)))
+#endif
+ goto header_read_error;
+
+ switch ((gst_ogg_packet_data (packet))[0]) {
+ case 0x01:
+ res = vorbis_handle_identification_packet (vd);
+ break;
+ case 0x03:
+ res = vorbis_handle_comment_packet (vd, packet);
+ break;
+ case 0x05:
+ res = vorbis_handle_type_packet (vd);
+ break;
+ default:
+ /* ignore */
+ g_warning ("unknown vorbis header packet found");
+ res = GST_FLOW_OK;
+ break;
+ }
+ return res;
+
+ /* ERRORS */
+header_read_error:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("couldn't read header packet (%d)", ret));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
+{
+ GstFlowReturn result;
+
+ /* clip */
+ if (!(buf = gst_audio_buffer_clip (buf, &dec->segment, dec->vi.rate,
+ dec->info.bpf))) {
+ GST_LOG_OBJECT (dec, "clipped buffer");
+ return GST_FLOW_OK;
+ }
+
+ if (dec->discont) {
+ GST_LOG_OBJECT (dec, "setting DISCONT");
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ dec->discont = FALSE;
+ }
+
+ GST_DEBUG_OBJECT (dec,
+ "pushing time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ result = gst_pad_push (dec->srcpad, buf);
+
+ return result;
+}
+
+static GstFlowReturn
+vorbis_dec_push_reverse (GstVorbisDec * dec, GstBuffer * buf)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+
+ dec->queued = g_list_prepend (dec->queued, buf);
+
+ return result;
+}
+
+static void
+vorbis_do_timestamps (GstVorbisDec * vd, GstBuffer * buf, gboolean reverse,
+ GstClockTime timestamp, GstClockTime duration)
+{
+ /* interpolate reverse */
+ if (vd->last_timestamp != -1 && duration != -1 && reverse)
+ vd->last_timestamp -= duration;
+
+ /* take buffer timestamp, use interpolated timestamp otherwise */
+ if (timestamp != -1)
+ vd->last_timestamp = timestamp;
+ else
+ timestamp = vd->last_timestamp;
+
+ /* interpolate forwards */
+ if (vd->last_timestamp != -1 && duration != -1 && !reverse)
+ vd->last_timestamp += duration;
+
+ GST_LOG_OBJECT (vd,
+ "keeping timestamp %" GST_TIME_FORMAT " ts %" GST_TIME_FORMAT " dur %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (vd->last_timestamp),
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration));
+
+ if (buf) {
+ GST_BUFFER_TIMESTAMP (buf) = timestamp;
+ GST_BUFFER_DURATION (buf) = duration;
+ }
+}
+
+static GstFlowReturn
+vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
+ GstClockTime timestamp, GstClockTime duration)
+{
+#ifndef USE_TREMOLO
+ vorbis_sample_t **pcm;
+#endif
+ guint sample_count;
+ GstBuffer *out = NULL;
+ GstFlowReturn result;
+ guint8 *data;
+ gsize size;
+
+ if (G_UNLIKELY (!vd->initialized))
+ goto not_initialized;
+
+ /* normal data packet */
+ /* FIXME, we can skip decoding if the packet is outside of the
+ * segment, this is however not very trivial as we need a previous
+ * packet to decode the current one so we must be carefull not to
+ * throw away too much. For now we decode everything and clip right
+ * before pushing data. */
+
+#ifdef USE_TREMOLO
+ if (G_UNLIKELY (vorbis_dsp_synthesis (&vd->vd, packet, 1)))
+ goto could_not_read;
+#else
+ if (G_UNLIKELY (vorbis_synthesis (&vd->vb, packet)))
+ goto could_not_read;
+
+ if (G_UNLIKELY (vorbis_synthesis_blockin (&vd->vd, &vd->vb) < 0))
+ goto not_accepted;
+#endif
+
+ /* assume all goes well here */
+ result = GST_FLOW_OK;
+
+ /* count samples ready for reading */
+#ifdef USE_TREMOLO
+ if ((sample_count = vorbis_dsp_pcmout (&vd->vd, NULL, 0)) == 0)
+#else
+ if ((sample_count = vorbis_synthesis_pcmout (&vd->vd, NULL)) == 0)
+#endif
+ goto done;
+
+ size = sample_count * vd->info.bpf;
+ GST_LOG_OBJECT (vd, "%d samples ready for reading, size %" G_GSIZE_FORMAT,
+ sample_count, size);
+
+ /* alloc buffer for it */
+ out = gst_buffer_new_and_alloc (size);
+
+ data = gst_buffer_map (out, NULL, NULL, GST_MAP_WRITE);
+ /* get samples ready for reading now, should be sample_count */
+#ifdef USE_TREMOLO
+ if (G_UNLIKELY ((vorbis_dsp_pcmout (&vd->vd, data,
+ sample_count)) != sample_count))
+#else
+ if (G_UNLIKELY ((vorbis_synthesis_pcmout (&vd->vd, &pcm)) != sample_count))
+#endif
+ goto wrong_samples;
+
+#ifndef USE_TREMOLO
+ /* copy samples in buffer */
+ vd->copy_samples ((vorbis_sample_t *) data, pcm,
+ sample_count, vd->info.channels);
+#endif
+
+ GST_LOG_OBJECT (vd, "setting output size to %" G_GSIZE_FORMAT, size);
+ gst_buffer_unmap (out, data, size);
+
+ /* this should not overflow */
+ if (duration == -1)
+ duration = sample_count * GST_SECOND / vd->vi.rate;
+
+ vorbis_do_timestamps (vd, out, FALSE, timestamp, duration);
+
+ if (vd->segment.rate >= 0.0)
+ result = vorbis_dec_push_forward (vd, out);
+ else
+ result = vorbis_dec_push_reverse (vd, out);
+
+done:
+ if (out == NULL) {
+ /* no output, still keep track of timestamps */
+ vorbis_do_timestamps (vd, NULL, FALSE, timestamp, duration);
+ }
+#ifdef USE_TREMOLO
+ vorbis_dsp_read (&vd->vd, sample_count);
+#else
+ vorbis_synthesis_read (&vd->vd, sample_count);
+#endif
+
+ return result;
+
+ /* ERRORS */
+not_initialized:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("no header sent yet"));
+ return GST_FLOW_ERROR;
+ }
+could_not_read:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("couldn't read data packet"));
+ return GST_FLOW_ERROR;
+ }
+not_accepted:
+ {
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("vorbis decoder did not accept data packet"));
+ return GST_FLOW_ERROR;
+ }
+wrong_samples:
+ {
+ gst_buffer_unref (out);
+ GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
+ (NULL), ("vorbis decoder reported wrong number of samples"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+vorbis_dec_handle_header_buffer (GstVorbisDec * vd, GstBuffer * buffer)
+{
+ ogg_packet *packet;
+ ogg_packet_wrapper packet_wrapper;
+ GstFlowReturn ret;
+
+ gst_ogg_packet_wrapper_map (&packet_wrapper, buffer);
+ packet = gst_ogg_packet_from_wrapper (&packet_wrapper);
+
+ ret = vorbis_handle_header_packet (vd, packet);
+
+ gst_ogg_packet_wrapper_unmap (&packet_wrapper, buffer);
+
+ return ret;
+}
+
+
+#define MIN_NUM_HEADERS 3
+static GstFlowReturn
+vorbis_dec_handle_header_caps (GstVorbisDec * vd, GstBuffer * buffer)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ GstCaps *caps;
+ GstStructure *s;
+ const GValue *array;
+ const GValue *value = NULL;
+ GstBuffer *buf = NULL;
+
+ if ((caps = gst_pad_get_current_caps (vd->sinkpad)) == NULL)
+ goto no_caps;
+
+ if ((s = gst_caps_get_structure (caps, 0)) == NULL)
+ goto no_caps;
+
+ array = gst_structure_get_value (s, "streamheader");
+
+ if (array == NULL || (gst_value_array_get_size (array) < MIN_NUM_HEADERS))
+ goto array_error;
+
+ /* initial header */
+ value = gst_value_array_get_value (array, 0);
+ buf = gst_value_get_buffer (value);
+ if (!buf)
+ goto null_buffer;
+ result = vorbis_dec_handle_header_buffer (vd, buf);
+ if (result != GST_FLOW_OK)
+ goto buffer_error;
+
+ /* comment header */
+ value = gst_value_array_get_value (array, 1);
+ buf = gst_value_get_buffer (value);
+ if (!buf)
+ goto null_buffer;
+ result = vorbis_dec_handle_header_buffer (vd, buf);
+ if (result != GST_FLOW_OK)
+ goto buffer_error;
+
+ /* bitstream codebook header */
+ value = gst_value_array_get_value (array, 2);
+ buf = gst_value_get_buffer (value);
+ if (!buf)
+ goto null_buffer;
+ result = vorbis_dec_handle_header_buffer (vd, buf);
+ if (result != GST_FLOW_OK)
+ goto buffer_error;
+
+ return result;
+
+no_caps:
+ {
+ GST_WARNING_OBJECT (vd, "no caps negotiated");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+array_error:
+ {
+ GST_WARNING_OBJECT (vd, "streamheader array not found");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+null_buffer:
+ {
+ GST_WARNING_OBJECT (vd, "streamheader with null buffer received");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+buffer_error:
+ {
+ GST_WARNING_OBJECT (vd, "error handling buffer");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+}
+
+static GstFlowReturn
+vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
+{
+ ogg_packet *packet;
+ ogg_packet_wrapper packet_wrapper;
+ GstFlowReturn result = GST_FLOW_OK;
+
+ /* make ogg_packet out of the buffer */
+ gst_ogg_packet_wrapper_map (&packet_wrapper, buffer);
+ packet = gst_ogg_packet_from_wrapper (&packet_wrapper);
+ /* set some more stuff */
+ packet->granulepos = -1;
+ packet->packetno = 0; /* we don't care */
+ /* EOS does not matter, it is used in vorbis to implement clipping the last
+ * block of samples based on the granulepos. We clip based on segments. */
+ packet->e_o_s = 0;
+
+ GST_LOG_OBJECT (vd, "decode buffer of size %ld", packet->bytes);
+
+ /* error out on empty header packets, but just skip empty data packets */
+ if (G_UNLIKELY (packet->bytes == 0)) {
+ if (vd->initialized)
+ goto empty_buffer;
+ else
+ goto empty_header;
+ }
+
+ /* switch depending on packet type */
+ if ((gst_ogg_packet_data (packet))[0] & 1) {
+ if (vd->initialized) {
+ GST_WARNING_OBJECT (vd, "Already initialized, so ignoring header packet");
+ goto done;
+ }
+ result = vorbis_handle_header_packet (vd, packet);
+ } else {
+ GstClockTime timestamp, duration;
+
+ /* try to find header in caps so we can initialize the decoder */
+ if (!vd->initialized) {
+ result = vorbis_dec_handle_header_caps (vd, buffer);
+ if (result != GST_FLOW_OK)
+ goto invalid_caps_header;
+ }
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ result = vorbis_handle_data_packet (vd, packet, timestamp, duration);
+ }
+
+done:
+ gst_ogg_packet_wrapper_unmap (&packet_wrapper, buffer);
+
+ return result;
+
+empty_buffer:
+ {
+ /* don't error out here, just ignore the buffer, it's invalid for vorbis
+ * but not fatal. */
+ GST_WARNING_OBJECT (vd, "empty buffer received, ignoring");
+ result = GST_FLOW_OK;
+ goto done;
+ }
+
+/* ERRORS */
+empty_header:
+ {
+ GST_ELEMENT_ERROR (vd, STREAM, DECODE, (NULL), ("empty header received"));
+ result = GST_FLOW_ERROR;
+ vd->discont = TRUE;
+ goto done;
+ }
+
+invalid_caps_header:
+ {
+ GST_ELEMENT_ERROR (vd, STREAM, DECODE, (NULL),
+ ("invalid streamheader in caps"));
+ goto done;
+ }
+}
+
+/*
+ * Input:
+ * Buffer decoding order: 7 8 9 4 5 6 3 1 2 EOS
+ * Discont flag: D D D D
+ *
+ * - Each Discont marks a discont in the decoding order.
+ *
+ * for vorbis, each buffer is a keyframe when we have the previous
+ * buffer. This means that to decode buffer 7, we need buffer 6, which
+ * arrives out of order.
+ *
+ * we first gather buffers in the gather queue until we get a DISCONT. We
+ * prepend each incomming buffer so that they are in reversed order.
+ *
+ * gather queue: 9 8 7
+ * decode queue:
+ * output queue:
+ *
+ * When a DISCONT is received (buffer 4), we move the gather queue to the
+ * decode queue. This is simply done be taking the head of the gather queue
+ * and prepending it to the decode queue. This yields:
+ *
+ * gather queue:
+ * decode queue: 7 8 9
+ * output queue:
+ *
+ * Then we decode each buffer in the decode queue in order and put the output
+ * buffer in the output queue. The first buffer (7) will not produce any output
+ * because it needs the previous buffer (6) which did not arrive yet. This
+ * yields:
+ *
+ * gather queue:
+ * decode queue: 7 8 9
+ * output queue: 9 8
+ *
+ * Then we remove the consumed buffers from the decode queue. Buffer 7 is not
+ * completely consumed, we need to keep it around for when we receive buffer
+ * 6. This yields:
+ *
+ * gather queue:
+ * decode queue: 7
+ * output queue: 9 8
+ *
+ * Then we accumulate more buffers:
+ *
+ * gather queue: 6 5 4
+ * decode queue: 7
+ * output queue:
+ *
+ * prepending to the decode queue on DISCONT yields:
+ *
+ * gather queue:
+ * decode queue: 4 5 6 7
+ * output queue:
+ *
+ * after decoding and keeping buffer 4:
+ *
+ * gather queue:
+ * decode queue: 4
+ * output queue: 7 6 5
+ *
+ * Etc..
+ */
+static GstFlowReturn
+vorbis_dec_flush_decode (GstVorbisDec * dec)
+{
+ GstFlowReturn res = GST_FLOW_OK;
+ GList *walk;
+
+ walk = dec->decode;
+
+ GST_DEBUG_OBJECT (dec, "flushing buffers to decoder");
+
+ while (walk) {
+ GList *next;
+ GstBuffer *buf = GST_BUFFER_CAST (walk->data);
+
+ GST_DEBUG_OBJECT (dec, "decoding buffer %p, ts %" GST_TIME_FORMAT,
+ buf, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ next = g_list_next (walk);
+
+ /* decode buffer, prepend to output queue */
+ res = vorbis_dec_decode_buffer (dec, buf);
+
+ /* if we generated output, we can discard the buffer, else we
+ * keep it in the queue */
+ if (dec->queued) {
+ GST_DEBUG_OBJECT (dec, "decoded buffer to %p", dec->queued->data);
+ dec->decode = g_list_delete_link (dec->decode, walk);
+ gst_buffer_unref (buf);
+ } else {
+ GST_DEBUG_OBJECT (dec, "buffer did not decode, keeping");
+ }
+ walk = next;
+ }
+ while (dec->queued) {
+ GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data);
+ GstClockTime timestamp, duration;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ duration = GST_BUFFER_DURATION (buf);
+
+ vorbis_do_timestamps (dec, buf, TRUE, timestamp, duration);
+ res = vorbis_dec_push_forward (dec, buf);
+
+ dec->queued = g_list_delete_link (dec->queued, dec->queued);
+ }
+ return res;
+}
+
+static GstFlowReturn
+vorbis_dec_chain_reverse (GstVorbisDec * vd, gboolean discont, GstBuffer * buf)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+
+ /* if we have a discont, move buffers to the decode list */
+ if (G_UNLIKELY (discont)) {
+ GST_DEBUG_OBJECT (vd, "received discont");
+ while (vd->gather) {
+ GstBuffer *gbuf;
+
+ gbuf = GST_BUFFER_CAST (vd->gather->data);
+ /* remove from the gather list */
+ vd->gather = g_list_delete_link (vd->gather, vd->gather);
+ /* copy to decode queue */
+ vd->decode = g_list_prepend (vd->decode, gbuf);
+ }
+ /* flush and decode the decode queue */
+ result = vorbis_dec_flush_decode (vd);
+ }
+
+ if (G_LIKELY (buf)) {
+ GST_DEBUG_OBJECT (vd,
+ "gathering buffer %p of size %" G_GSIZE_FORMAT
+ ", time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT,
+ buf, gst_buffer_get_size (buf),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ /* add buffer to gather queue */
+ vd->gather = g_list_prepend (vd->gather, buf);
+ }
+
+ return result;
+}
+
+static GstFlowReturn
+vorbis_dec_chain_forward (GstVorbisDec * vd, gboolean discont,
+ GstBuffer * buffer)
+{
+ GstFlowReturn result;
+
+ result = vorbis_dec_decode_buffer (vd, buffer);
+
+ gst_buffer_unref (buffer);
+
+ return result;
+}
+
+static GstFlowReturn
+vorbis_dec_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstVorbisDec *vd;
+ GstFlowReturn result = GST_FLOW_OK;
+ gboolean discont;
+
+ vd = GST_VORBIS_DEC (gst_pad_get_parent (pad));
+
+ discont = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+
+ /* resync on DISCONT */
+ if (G_UNLIKELY (discont)) {
+ GST_DEBUG_OBJECT (vd, "received DISCONT buffer");
+ vd->last_timestamp = GST_CLOCK_TIME_NONE;
+#ifdef HAVE_VORBIS_SYNTHESIS_RESTART
+ vorbis_synthesis_restart (&vd->vd);
+#endif
+ vd->discont = TRUE;
+ }
+
+ if (vd->segment.rate >= 0.0)
+ result = vorbis_dec_chain_forward (vd, discont, buffer);
+ else
+ result = vorbis_dec_chain_reverse (vd, discont, buffer);
+
+ gst_object_unref (vd);
+
+ return result;
+}
+
+static GstStateChangeReturn
+vorbis_dec_change_state (GstElement * element, GstStateChange transition)
+{
+ GstVorbisDec *vd = GST_VORBIS_DEC (element);
+ GstStateChangeReturn res;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ vorbis_info_init (&vd->vi);
+ vorbis_comment_init (&vd->vc);
+ vd->initialized = FALSE;
+ gst_vorbis_dec_reset (vd);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ 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:
+ GST_DEBUG_OBJECT (vd, "PAUSED -> READY, clearing vorbis structures");
+ vd->initialized = FALSE;
+
+#ifndef USE_TREMOLO
+ vorbis_block_clear (&vd->vb);
+#endif
+
+ vorbis_dsp_clear (&vd->vd);
+ vorbis_comment_clear (&vd->vc);
+ vorbis_info_clear (&vd->vi);
+ gst_vorbis_dec_reset (vd);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return res;
+}
diff --git a/ext/vorbis/gstvorbisdec.h b/ext/vorbis/gstvorbisdec.h
new file mode 100644
index 0000000..d122a0e
--- /dev/null
+++ b/ext/vorbis/gstvorbisdec.h
@@ -0,0 +1,96 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_VORBIS_DEC_H__
+#define __GST_VORBIS_DEC_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include "gstvorbisdeclib.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VORBIS_DEC \
+ (gst_vorbis_dec_get_type())
+#define GST_VORBIS_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VORBIS_DEC,GstVorbisDec))
+#define GST_VORBIS_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VORBIS_DEC,GstVorbisDecClass))
+#define GST_IS_VORBIS_DEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VORBIS_DEC))
+#define GST_IS_VORBIS_DEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VORBIS_DEC))
+
+typedef struct _GstVorbisDec GstVorbisDec;
+typedef struct _GstVorbisDecClass GstVorbisDecClass;
+
+/**
+ * GstVorbisDec:
+ *
+ * Opaque data structure.
+ */
+struct _GstVorbisDec {
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ vorbis_dsp_state vd;
+ vorbis_info vi;
+ vorbis_comment vc;
+
+#ifndef USE_TREMOLO
+ vorbis_block vb;
+#endif
+
+ gboolean initialized;
+ GstAudioInfo info;
+
+ /* list of buffers that need timestamps */
+ GList *queued;
+ /* gather/decode queues for reverse playback */
+ GList *gather;
+ GList *decode;
+
+ GstSegment segment;
+ gboolean discont;
+ guint32 seqnum;
+
+ GstClockTime last_timestamp;
+
+ GList *pendingevents;
+ GstTagList *taglist;
+
+ CopySampleFunc copy_samples;
+};
+
+struct _GstVorbisDecClass {
+ GstElementClass parent_class;
+};
+
+GType gst_vorbis_dec_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_VORBIS_DEC_H__ */
diff --git a/ext/vorbis/gstvorbisdeclib.c b/ext/vorbis/gstvorbisdeclib.c
new file mode 100644
index 0000000..66a2ee3
--- /dev/null
+++ b/ext/vorbis/gstvorbisdeclib.c
@@ -0,0 +1,192 @@
+/* GStreamer
+ * Copyright (C) 2010 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+ * Copyright (C) 2010 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * Tremor modifications <2006>:
+ * Chris Lord, OpenedHand Ltd. <chris@openedhand.com>, http://www.o-hand.com/
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include "gstvorbisdeclib.h"
+
+#ifndef TREMOR
+/* These samples can be outside of the float -1.0 -- 1.0 range, this
+ * is allowed, downstream elements are supposed to clip */
+static void
+copy_samples_m (vorbis_sample_t * out, vorbis_sample_t ** in, guint samples,
+ gint channels)
+{
+ memcpy (out, in[0], samples * sizeof (float));
+}
+
+static void
+copy_samples_s (vorbis_sample_t * out, vorbis_sample_t ** in, guint samples,
+ gint channels)
+{
+#ifdef GST_VORBIS_DEC_SEQUENTIAL
+ memcpy (out, in[0], samples * sizeof (float));
+ out += samples;
+ memcpy (out, in[1], samples * sizeof (float));
+#else
+ gint j;
+
+ for (j = 0; j < samples; j++) {
+ *out++ = in[0][j];
+ *out++ = in[1][j];
+ }
+#endif
+}
+
+static void
+copy_samples (vorbis_sample_t * out, vorbis_sample_t ** in, guint samples,
+ gint channels)
+{
+#ifdef GST_VORBIS_DEC_SEQUENTIAL
+ gint i;
+
+ for (i = 0; i < channels; i++) {
+ memcpy (out, in[i], samples * sizeof (float));
+ out += samples;
+ }
+#else
+ gint i, j;
+
+ for (j = 0; j < samples; j++) {
+ for (i = 0; i < channels; i++) {
+ *out++ = in[i][j];
+ }
+ }
+#endif
+}
+
+CopySampleFunc
+get_copy_sample_func (gint channels)
+{
+ CopySampleFunc f = NULL;
+
+ switch (channels) {
+ case 1:
+ f = copy_samples_m;
+ break;
+ case 2:
+ f = copy_samples_s;
+ break;
+ default:
+ f = copy_samples;
+ break;
+ }
+
+ return f;
+}
+
+#else
+
+/* Taken from Tremor, misc.h */
+#ifdef _ARM_ASSEM_
+static inline ogg_int32_t
+CLIP_TO_15 (ogg_int32_t x)
+{
+ int tmp;
+ asm volatile ("subs %1, %0, #32768\n\t"
+ "movpl %0, #0x7f00\n\t"
+ "orrpl %0, %0, #0xff\n"
+ "adds %1, %0, #32768\n\t"
+ "movmi %0, #0x8000":"+r" (x), "=r" (tmp)
+ ::"cc");
+
+ return (x);
+}
+#else
+static inline ogg_int32_t
+CLIP_TO_15 (ogg_int32_t x)
+{
+ int ret = x;
+
+ ret -= ((x <= 32767) - 1) & (x - 32767);
+ ret -= ((x >= -32768) - 1) & (x + 32768);
+ return (ret);
+}
+#endif
+
+static void
+copy_samples_16_m (vorbis_sample_t * _out, vorbis_sample_t ** _in,
+ guint samples, gint channels)
+{
+ gint16 *out = (gint16 *) _out;
+ ogg_int32_t **in = (ogg_int32_t **) _in;
+ gint j;
+
+ for (j = 0; j < samples; j++) {
+ *out++ = CLIP_TO_15 (in[0][j] >> 9);
+ }
+}
+
+static void
+copy_samples_16_s (vorbis_sample_t * _out, vorbis_sample_t ** _in,
+ guint samples, gint channels)
+{
+ gint16 *out = (gint16 *) _out;
+ ogg_int32_t **in = (ogg_int32_t **) _in;
+ gint j;
+
+ for (j = 0; j < samples; j++) {
+ *out++ = CLIP_TO_15 (in[0][j] >> 9);
+ *out++ = CLIP_TO_15 (in[1][j] >> 9);
+ }
+}
+
+static void
+copy_samples_16 (vorbis_sample_t * _out, vorbis_sample_t ** _in, guint samples,
+ gint channels)
+{
+ gint16 *out = (gint16 *) _out;
+ ogg_int32_t **in = (ogg_int32_t **) _in;
+ gint i, j;
+
+ for (j = 0; j < samples; j++) {
+ for (i = 0; i < channels; i++) {
+ *out++ = CLIP_TO_15 (in[i][j] >> 9);
+ }
+ }
+}
+
+CopySampleFunc
+get_copy_sample_func (gint channels)
+{
+ CopySampleFunc f = NULL;
+
+ switch (channels) {
+ case 1:
+ f = copy_samples_16_m;
+ break;
+ case 2:
+ f = copy_samples_16_s;
+ break;
+ default:
+ f = copy_samples_16;
+ break;
+ }
+ return f;
+}
+
+#endif
diff --git a/ext/vorbis/gstvorbisdeclib.h b/ext/vorbis/gstvorbisdeclib.h
new file mode 100644
index 0000000..564ffce
--- /dev/null
+++ b/ext/vorbis/gstvorbisdeclib.h
@@ -0,0 +1,184 @@
+/* GStreamer
+ * Copyright (C) 2010 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+ * Copyright (C) 2010 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * Tremor modifications <2006>:
+ * Chris Lord, OpenedHand Ltd. <chris@openedhand.com>, http://www.o-hand.com/
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VORBIS_DEC_LIB_H__
+#define __GST_VORBIS_DEC_LIB_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+#ifndef TREMOR
+
+#include <vorbis/codec.h>
+
+typedef float vorbis_sample_t;
+typedef ogg_packet ogg_packet_wrapper;
+
+#define GST_VORBIS_DEC_DESCRIPTION "decode raw vorbis streams to float audio"
+
+#define GST_VORBIS_AUDIO_FORMAT GST_AUDIO_FORMAT_F32
+#define GST_VORBIS_AUDIO_FORMAT_STR GST_AUDIO_NE (F32)
+
+#define GST_VORBIS_DEC_SRC_CAPS \
+ GST_STATIC_CAPS ("audio/x-raw, " \
+ "format = (string)" GST_VORBIS_AUDIO_FORMAT_STR ", " \
+ "rate = (int) [ 1, MAX ], " \
+ "channels = (int) [ 1, 256 ]")
+
+#define GST_VORBIS_DEC_DEFAULT_SAMPLE_WIDTH (32)
+
+#define GST_VORBIS_DEC_GLIB_TYPE_NAME GstVorbisDec
+
+static inline guint8 *
+gst_ogg_packet_data (ogg_packet * p)
+{
+ return (guint8 *) p->packet;
+}
+
+static inline gint
+gst_ogg_packet_size (ogg_packet * p)
+{
+ return p->bytes;
+}
+
+static inline void
+gst_ogg_packet_wrapper_map (ogg_packet * packet, GstBuffer * buffer)
+{
+ gsize size;
+
+ packet->packet = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ packet->bytes = size;
+}
+
+static inline void
+gst_ogg_packet_wrapper_unmap (ogg_packet * packet, GstBuffer * buffer)
+{
+ gst_buffer_unmap (buffer, packet->packet, packet->bytes);
+}
+
+static inline ogg_packet *
+gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
+{
+ return packet;
+}
+
+#else
+
+#ifdef USE_TREMOLO
+ #include <Tremolo/ivorbiscodec.h>
+ #include <Tremolo/codec_internal.h>
+ typedef ogg_int16_t vorbis_sample_t;
+#else
+ #include <tremor/ivorbiscodec.h>
+ typedef ogg_int32_t vorbis_sample_t;
+#endif
+
+typedef struct _ogg_packet_wrapper ogg_packet_wrapper;
+
+struct _ogg_packet_wrapper {
+ ogg_packet packet;
+ ogg_reference ref;
+ ogg_buffer buf;
+};
+
+#define GST_VORBIS_DEC_DESCRIPTION "decode raw vorbis streams to integer audio"
+
+#define GST_VORBIS_AUDIO_FORMAT GST_AUDIO_FORMAT_S16
+#define GST_VORBIS_AUDIO_FORMAT_STR GST_AUDIO_NE (S16)
+
+#define GST_VORBIS_DEC_SRC_CAPS \
+ GST_STATIC_CAPS ("audio/x-raw, " \
+ "format = (string) " GST_VORBIS_AUDIO_FORMAT_STR ", " \
+ "rate = (int) [ 1, MAX ], " \
+ "channels = (int) [ 1, 6 ]")
+
+/* we need a different type name here */
+#define GST_VORBIS_DEC_GLIB_TYPE_NAME GstIVorbisDec
+
+/* and still have it compile */
+typedef struct _GstVorbisDec GstIVorbisDec;
+typedef struct _GstVorbisDecClass GstIVorbisDecClass;
+
+/* compensate minor variation */
+#define vorbis_synthesis(a, b) vorbis_synthesis (a, b, 1)
+
+static inline guint8 *
+gst_ogg_packet_data (ogg_packet * p)
+{
+ return (guint8 *) p->packet->buffer->data;
+}
+
+static inline gint
+gst_ogg_packet_size (ogg_packet * p)
+{
+ return p->packet->buffer->size;
+}
+
+static inline void
+gst_ogg_packet_wrapper_map (ogg_packet_wrapper * packet,
+ GstBuffer * buffer)
+{
+ ogg_reference *ref = &packet->ref;
+ ogg_buffer *buf = &packet->buf;
+ gsize size;
+
+ buf->data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ buf->size = size;
+ buf->refcount = 1;
+ buf->ptr.owner = NULL;
+ buf->ptr.next = NULL;
+
+ ref->buffer = buf;
+ ref->begin = 0;
+ ref->length = buf->size;
+ ref->next = NULL;
+
+ packet->packet.packet = ref;
+ packet->packet.bytes = ref->length;
+}
+
+static inline void
+gst_ogg_packet_wrapper_unmap (ogg_packet_wrapper * packet,
+ GstBuffer * buffer)
+{
+ ogg_reference *ref = &packet->ref;
+ ogg_buffer *buf = &packet->buf;
+
+ gst_buffer_unmap (buffer, buf->data, buf->size);
+}
+
+static inline ogg_packet *
+gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
+{
+ return &(packet->packet);
+}
+
+#endif
+
+typedef void (*CopySampleFunc)(vorbis_sample_t *out, vorbis_sample_t **in,
+ guint samples, gint channels);
+
+CopySampleFunc get_copy_sample_func (gint channels);
+
+#endif /* __GST_VORBIS_DEC_LIB_H__ */
diff --git a/ext/vorbis/gstvorbisenc.c b/ext/vorbis/gstvorbisenc.c
new file mode 100644
index 0000000..54800bb
--- /dev/null
+++ b/ext/vorbis/gstvorbisenc.c
@@ -0,0 +1,1424 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-vorbisenc
+ * @see_also: vorbisdec, oggmux
+ *
+ * This element encodes raw float audio into a Vorbis stream.
+ * <ulink url="http://www.vorbis.com/">Vorbis</ulink> is a royalty-free
+ * audio codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
+ * Foundation</ulink>.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v audiotestsrc wave=sine num-buffers=100 ! audioconvert ! vorbisenc ! oggmux ! filesink location=sine.ogg
+ * ]| Encode a test sine signal to Ogg/Vorbis. Note that the resulting file
+ * will be really small because a sine signal compresses very well.
+ * |[
+ * gst-launch -v alsasrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg
+ * ]| Record from a sound card using ALSA and encode to Ogg/Vorbis.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <vorbis/vorbisenc.h>
+
+#include <gst/gsttagsetter.h>
+#include <gst/tag/tag.h>
+#include <gst/audio/multichannel.h>
+#include <gst/audio/audio.h>
+#include "gstvorbisenc.h"
+
+#include "gstvorbiscommon.h"
+
+GST_DEBUG_CATEGORY_EXTERN (vorbisenc_debug);
+#define GST_CAT_DEFAULT vorbisenc_debug
+
+static GstStaticPadTemplate vorbis_enc_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " GST_AUDIO_NE (F32) ", "
+ "rate = (int) [ 1, 200000 ], " "channels = (int) [ 1, 256 ]")
+ );
+
+static GstStaticPadTemplate vorbis_enc_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-vorbis")
+ );
+
+enum
+{
+ ARG_0,
+ ARG_MAX_BITRATE,
+ ARG_BITRATE,
+ ARG_MIN_BITRATE,
+ ARG_QUALITY,
+ ARG_MANAGED,
+ ARG_LAST_MESSAGE
+};
+
+static GstFlowReturn gst_vorbis_enc_output_buffers (GstVorbisEnc * vorbisenc);
+
+/* this function takes into account the granulepos_offset and the subgranule
+ * time offset */
+static GstClockTime
+granulepos_to_timestamp_offset (GstVorbisEnc * vorbisenc,
+ ogg_int64_t granulepos)
+{
+ if (granulepos >= 0)
+ return gst_util_uint64_scale ((guint64) granulepos
+ + vorbisenc->granulepos_offset, GST_SECOND, vorbisenc->frequency)
+ + vorbisenc->subgranule_offset;
+ return GST_CLOCK_TIME_NONE;
+}
+
+/* this function does a straight granulepos -> timestamp conversion */
+static GstClockTime
+granulepos_to_timestamp (GstVorbisEnc * vorbisenc, ogg_int64_t granulepos)
+{
+ if (granulepos >= 0)
+ return gst_util_uint64_scale ((guint64) granulepos,
+ GST_SECOND, vorbisenc->frequency);
+ return GST_CLOCK_TIME_NONE;
+}
+
+#define MAX_BITRATE_DEFAULT -1
+#define BITRATE_DEFAULT -1
+#define MIN_BITRATE_DEFAULT -1
+#define QUALITY_DEFAULT 0.3
+#define LOWEST_BITRATE 6000 /* lowest allowed for a 8 kHz stream */
+#define HIGHEST_BITRATE 250001 /* highest allowed for a 44 kHz stream */
+
+static gboolean gst_vorbis_enc_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_vorbis_enc_setup (GstVorbisEnc * vorbisenc);
+
+static void gst_vorbis_enc_dispose (GObject * object);
+static void gst_vorbis_enc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_vorbis_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static GstStateChangeReturn gst_vorbis_enc_change_state (GstElement * element,
+ GstStateChange transition);
+static void gst_vorbis_enc_add_interfaces (GType vorbisenc_type);
+
+#define gst_vorbis_enc_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstVorbisEnc, gst_vorbis_enc,
+ GST_TYPE_ELEMENT, gst_vorbis_enc_add_interfaces (g_define_type_id));
+
+static void
+gst_vorbis_enc_add_interfaces (GType vorbisenc_type)
+{
+ static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL };
+ static const GInterfaceInfo preset_info = { NULL, NULL, NULL };
+
+ g_type_add_interface_static (vorbisenc_type, GST_TYPE_TAG_SETTER,
+ &tag_setter_info);
+ g_type_add_interface_static (vorbisenc_type, GST_TYPE_PRESET, &preset_info);
+}
+
+static void
+gst_vorbis_enc_class_init (GstVorbisEncClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->set_property = gst_vorbis_enc_set_property;
+ gobject_class->get_property = gst_vorbis_enc_get_property;
+ gobject_class->dispose = gst_vorbis_enc_dispose;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MAX_BITRATE,
+ g_param_spec_int ("max-bitrate", "Maximum Bitrate",
+ "Specify a maximum bitrate (in bps). Useful for streaming "
+ "applications. (-1 == disabled)",
+ -1, HIGHEST_BITRATE, MAX_BITRATE_DEFAULT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE,
+ g_param_spec_int ("bitrate", "Target Bitrate",
+ "Attempt to encode at a bitrate averaging this (in bps). "
+ "This uses the bitrate management engine, and is not recommended for most users. "
+ "Quality is a better alternative. (-1 == disabled)", -1,
+ HIGHEST_BITRATE, BITRATE_DEFAULT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MIN_BITRATE,
+ g_param_spec_int ("min-bitrate", "Minimum Bitrate",
+ "Specify a minimum bitrate (in bps). Useful for encoding for a "
+ "fixed-size channel. (-1 == disabled)", -1, HIGHEST_BITRATE,
+ MIN_BITRATE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY,
+ g_param_spec_float ("quality", "Quality",
+ "Specify quality instead of specifying a particular bitrate.", -0.1,
+ 1.0, QUALITY_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MANAGED,
+ g_param_spec_boolean ("managed", "Managed",
+ "Enable bitrate management engine", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
+ g_param_spec_string ("last-message", "last-message",
+ "The last status message", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_enc_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_enc_sink_factory));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Vorbis audio encoder", "Codec/Encoder/Audio",
+ "Encodes audio in Vorbis format",
+ "Monty <monty@xiph.org>, " "Wim Taymans <wim@fluendo.com>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_change_state);
+}
+
+static void
+gst_vorbis_enc_dispose (GObject * object)
+{
+ GstVorbisEnc *vorbisenc = GST_VORBISENC (object);
+
+ if (vorbisenc->sinkcaps) {
+ gst_caps_unref (vorbisenc->sinkcaps);
+ vorbisenc->sinkcaps = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static GstCaps *
+gst_vorbis_enc_generate_sink_caps (void)
+{
+ GstCaps *caps = gst_caps_new_empty ();
+ int i, c;
+
+ gst_caps_append_structure (caps, gst_structure_new ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "rate", GST_TYPE_INT_RANGE, 1, 200000,
+ "channels", G_TYPE_INT, 1, NULL));
+
+ gst_caps_append_structure (caps, gst_structure_new ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "rate", GST_TYPE_INT_RANGE, 1, 200000,
+ "channels", G_TYPE_INT, 2, NULL));
+
+ for (i = 3; i <= 8; i++) {
+ GValue chanpos = { 0 };
+ GValue pos = { 0 };
+ GstStructure *structure;
+
+ g_value_init (&chanpos, GST_TYPE_ARRAY);
+ g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);
+
+ for (c = 0; c < i; c++) {
+ g_value_set_enum (&pos, gst_vorbis_channel_positions[i - 1][c]);
+ gst_value_array_append_value (&chanpos, &pos);
+ }
+ g_value_unset (&pos);
+
+ structure = gst_structure_new ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "rate", GST_TYPE_INT_RANGE, 1, 200000, "channels", G_TYPE_INT, i, NULL);
+ gst_structure_set_value (structure, "channel-positions", &chanpos);
+ g_value_unset (&chanpos);
+
+ gst_caps_append_structure (caps, structure);
+ }
+
+ gst_caps_append_structure (caps, gst_structure_new ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
+ "rate", GST_TYPE_INT_RANGE, 1, 200000,
+ "channels", GST_TYPE_INT_RANGE, 9, 256, NULL));
+
+ return caps;
+}
+
+static GstCaps *
+gst_vorbis_enc_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstVorbisEnc *vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
+
+ if (vorbisenc->sinkcaps == NULL)
+ vorbisenc->sinkcaps = gst_vorbis_enc_generate_sink_caps ();
+
+ if (filter)
+ return gst_caps_intersect_full (filter, vorbisenc->sinkcaps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ return gst_caps_ref (vorbisenc->sinkcaps);
+}
+
+static gboolean
+gst_vorbis_enc_sink_setcaps (GstVorbisEnc * vorbisenc, GstCaps * caps)
+{
+ GstStructure *structure;
+
+ vorbisenc->setup = FALSE;
+
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (structure, "channels", &vorbisenc->channels);
+ gst_structure_get_int (structure, "rate", &vorbisenc->frequency);
+
+ gst_vorbis_enc_setup (vorbisenc);
+
+ if (vorbisenc->setup)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+gst_vorbis_enc_convert_src (GstPad * pad, GstFormat src_format,
+ gint64 src_value, GstFormat dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstVorbisEnc *vorbisenc;
+ gint64 avg;
+
+ vorbisenc = GST_VORBISENC (gst_pad_get_parent (pad));
+
+ if (vorbisenc->samples_in == 0 ||
+ vorbisenc->bytes_out == 0 || vorbisenc->frequency == 0) {
+ gst_object_unref (vorbisenc);
+ return FALSE;
+ }
+
+ avg = (vorbisenc->bytes_out * vorbisenc->frequency) / (vorbisenc->samples_in);
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, avg);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (dest_format) {
+ case GST_FORMAT_BYTES:
+ *dest_value = gst_util_uint64_scale_int (src_value, avg, GST_SECOND);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+ gst_object_unref (vorbisenc);
+ return res;
+}
+
+static gboolean
+gst_vorbis_enc_convert_sink (GstPad * pad, GstFormat src_format,
+ gint64 src_value, GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ guint scale = 1;
+ gint bytes_per_sample;
+ GstVorbisEnc *vorbisenc;
+
+ vorbisenc = GST_VORBISENC (gst_pad_get_parent (pad));
+
+ bytes_per_sample = vorbisenc->channels * 2;
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ if (bytes_per_sample == 0)
+ return FALSE;
+ *dest_value = src_value / bytes_per_sample;
+ break;
+ case GST_FORMAT_TIME:
+ {
+ gint byterate = bytes_per_sample * vorbisenc->frequency;
+
+ if (byterate == 0)
+ return FALSE;
+ *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:
+ if (vorbisenc->frequency == 0)
+ return FALSE;
+ *dest_value =
+ gst_util_uint64_scale_int (src_value, GST_SECOND,
+ vorbisenc->frequency);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ scale = bytes_per_sample;
+ /* fallthrough */
+ case GST_FORMAT_DEFAULT:
+ *dest_value =
+ gst_util_uint64_scale_int (src_value,
+ scale * vorbisenc->frequency, GST_SECOND);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+ gst_object_unref (vorbisenc);
+ return res;
+}
+
+static gint64
+gst_vorbis_enc_get_latency (GstVorbisEnc * vorbisenc)
+{
+ /* FIXME, this probably depends on the bitrate and other setting but for now
+ * we return this value, which was obtained by totally unscientific
+ * measurements */
+ return 58 * GST_MSECOND;
+}
+
+static const GstQueryType *
+gst_vorbis_enc_get_query_types (GstPad * pad)
+{
+ static const GstQueryType gst_vorbis_enc_src_query_types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return gst_vorbis_enc_src_query_types;
+}
+
+static gboolean
+gst_vorbis_enc_src_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+ GstVorbisEnc *vorbisenc;
+ GstPad *peerpad;
+
+ vorbisenc = GST_VORBISENC (gst_pad_get_parent (pad));
+ peerpad = gst_pad_get_peer (vorbisenc->sinkpad);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat req_fmt;
+ gint64 pos, val;
+
+ gst_query_parse_position (query, &req_fmt, NULL);
+ if ((res = gst_pad_query_position (peerpad, req_fmt, &val))) {
+ gst_query_set_position (query, req_fmt, val);
+ break;
+ }
+
+ if (!(res = gst_pad_query_position (peerpad, GST_FORMAT_TIME, &pos)))
+ break;
+
+ if ((res =
+ gst_pad_query_convert (peerpad, GST_FORMAT_TIME, pos, req_fmt,
+ &val))) {
+ gst_query_set_position (query, req_fmt, val);
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ GstFormat req_fmt;
+ gint64 dur, val;
+
+ gst_query_parse_duration (query, &req_fmt, NULL);
+ if ((res = gst_pad_query_duration (peerpad, req_fmt, &val))) {
+ gst_query_set_duration (query, req_fmt, val);
+ break;
+ }
+
+ if (!(res = gst_pad_query_duration (peerpad, GST_FORMAT_TIME, &dur)))
+ break;
+
+ if ((res =
+ gst_pad_query_convert (peerpad, GST_FORMAT_TIME, dur, req_fmt,
+ &val))) {
+ gst_query_set_duration (query, req_fmt, val);
+ }
+ 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_vorbis_enc_convert_src (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;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ gboolean live;
+ GstClockTime min_latency, max_latency;
+ gint64 latency;
+
+ if ((res = gst_pad_query (peerpad, query))) {
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+
+ latency = gst_vorbis_enc_get_latency (vorbisenc);
+
+ /* add our latency */
+ min_latency += latency;
+ if (max_latency != -1)
+ max_latency += latency;
+
+ gst_query_set_latency (query, live, min_latency, max_latency);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_query (peerpad, query);
+ break;
+ }
+
+error:
+ gst_object_unref (peerpad);
+ gst_object_unref (vorbisenc);
+ return res;
+}
+
+static gboolean
+gst_vorbis_enc_sink_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+
+ 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_vorbis_enc_convert_sink (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;
+ }
+
+error:
+ return res;
+}
+
+static void
+gst_vorbis_enc_init (GstVorbisEnc * vorbisenc)
+{
+ vorbisenc->sinkpad =
+ gst_pad_new_from_static_template (&vorbis_enc_sink_factory, "sink");
+ gst_pad_set_event_function (vorbisenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_sink_event));
+ gst_pad_set_chain_function (vorbisenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_chain));
+ gst_pad_set_getcaps_function (vorbisenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_sink_getcaps));
+ gst_pad_set_query_function (vorbisenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_sink_query));
+ gst_element_add_pad (GST_ELEMENT (vorbisenc), vorbisenc->sinkpad);
+
+ vorbisenc->srcpad =
+ gst_pad_new_from_static_template (&vorbis_enc_src_factory, "src");
+ gst_pad_set_query_function (vorbisenc->srcpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_src_query));
+ gst_pad_set_query_type_function (vorbisenc->srcpad,
+ GST_DEBUG_FUNCPTR (gst_vorbis_enc_get_query_types));
+ gst_element_add_pad (GST_ELEMENT (vorbisenc), vorbisenc->srcpad);
+
+ vorbisenc->channels = -1;
+ vorbisenc->frequency = -1;
+
+ vorbisenc->managed = FALSE;
+ vorbisenc->max_bitrate = MAX_BITRATE_DEFAULT;
+ vorbisenc->bitrate = BITRATE_DEFAULT;
+ vorbisenc->min_bitrate = MIN_BITRATE_DEFAULT;
+ vorbisenc->quality = QUALITY_DEFAULT;
+ vorbisenc->quality_set = FALSE;
+ vorbisenc->last_message = NULL;
+}
+
+static void
+gst_vorbis_enc_metadata_set1 (const GstTagList * list, const gchar * tag,
+ gpointer vorbisenc)
+{
+ GstVorbisEnc *enc = GST_VORBISENC (vorbisenc);
+ GList *vc_list, *l;
+
+ vc_list = gst_tag_to_vorbis_comments (list, tag);
+
+ for (l = vc_list; l != NULL; l = l->next) {
+ const gchar *vc_string = (const gchar *) l->data;
+ gchar *key = NULL, *val = NULL;
+
+ GST_LOG_OBJECT (vorbisenc, "vorbis comment: %s", vc_string);
+ if (gst_tag_parse_extended_comment (vc_string, &key, NULL, &val, TRUE)) {
+ vorbis_comment_add_tag (&enc->vc, key, val);
+ g_free (key);
+ g_free (val);
+ }
+ }
+
+ g_list_foreach (vc_list, (GFunc) g_free, NULL);
+ g_list_free (vc_list);
+}
+
+static void
+gst_vorbis_enc_set_metadata (GstVorbisEnc * enc)
+{
+ GstTagList *merged_tags;
+ const GstTagList *user_tags;
+
+ vorbis_comment_init (&enc->vc);
+
+ 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) {
+ GST_DEBUG_OBJECT (enc, "merged tags = %" GST_PTR_FORMAT, merged_tags);
+ gst_tag_list_foreach (merged_tags, gst_vorbis_enc_metadata_set1, enc);
+ gst_tag_list_free (merged_tags);
+ }
+}
+
+static gchar *
+get_constraints_string (GstVorbisEnc * vorbisenc)
+{
+ gint min = vorbisenc->min_bitrate;
+ gint max = vorbisenc->max_bitrate;
+ gchar *result;
+
+ if (min > 0 && max > 0)
+ result = g_strdup_printf ("(min %d bps, max %d bps)", min, max);
+ else if (min > 0)
+ result = g_strdup_printf ("(min %d bps, no max)", min);
+ else if (max > 0)
+ result = g_strdup_printf ("(no min, max %d bps)", max);
+ else
+ result = g_strdup_printf ("(no min or max)");
+
+ return result;
+}
+
+static void
+update_start_message (GstVorbisEnc * vorbisenc)
+{
+ gchar *constraints;
+
+ g_free (vorbisenc->last_message);
+
+ if (vorbisenc->bitrate > 0) {
+ if (vorbisenc->managed) {
+ constraints = get_constraints_string (vorbisenc);
+ vorbisenc->last_message =
+ g_strdup_printf ("encoding at average bitrate %d bps %s",
+ vorbisenc->bitrate, constraints);
+ g_free (constraints);
+ } else {
+ vorbisenc->last_message =
+ g_strdup_printf
+ ("encoding at approximate bitrate %d bps (VBR encoding enabled)",
+ vorbisenc->bitrate);
+ }
+ } else {
+ if (vorbisenc->quality_set) {
+ if (vorbisenc->managed) {
+ constraints = get_constraints_string (vorbisenc);
+ vorbisenc->last_message =
+ g_strdup_printf
+ ("encoding at quality level %2.2f using constrained VBR %s",
+ vorbisenc->quality, constraints);
+ g_free (constraints);
+ } else {
+ vorbisenc->last_message =
+ g_strdup_printf ("encoding at quality level %2.2f",
+ vorbisenc->quality);
+ }
+ } else {
+ constraints = get_constraints_string (vorbisenc);
+ vorbisenc->last_message =
+ g_strdup_printf ("encoding using bitrate management %s", constraints);
+ g_free (constraints);
+ }
+ }
+
+ g_object_notify (G_OBJECT (vorbisenc), "last_message");
+}
+
+static gboolean
+gst_vorbis_enc_setup (GstVorbisEnc * vorbisenc)
+{
+ vorbisenc->setup = FALSE;
+
+ if (vorbisenc->bitrate < 0 && vorbisenc->min_bitrate < 0
+ && vorbisenc->max_bitrate < 0) {
+ vorbisenc->quality_set = TRUE;
+ }
+
+ update_start_message (vorbisenc);
+
+ /* choose an encoding mode */
+ /* (mode 0: 44kHz stereo uncoupled, roughly 128kbps VBR) */
+ vorbis_info_init (&vorbisenc->vi);
+
+ if (vorbisenc->quality_set) {
+ if (vorbis_encode_setup_vbr (&vorbisenc->vi,
+ vorbisenc->channels, vorbisenc->frequency,
+ vorbisenc->quality) != 0) {
+ GST_ERROR_OBJECT (vorbisenc,
+ "vorbisenc: initialisation failed: invalid parameters for quality");
+ vorbis_info_clear (&vorbisenc->vi);
+ return FALSE;
+ }
+
+ /* do we have optional hard quality restrictions? */
+ if (vorbisenc->max_bitrate > 0 || vorbisenc->min_bitrate > 0) {
+ struct ovectl_ratemanage_arg ai;
+
+ vorbis_encode_ctl (&vorbisenc->vi, OV_ECTL_RATEMANAGE_GET, &ai);
+
+ ai.bitrate_hard_min = vorbisenc->min_bitrate;
+ ai.bitrate_hard_max = vorbisenc->max_bitrate;
+ ai.management_active = 1;
+
+ vorbis_encode_ctl (&vorbisenc->vi, OV_ECTL_RATEMANAGE_SET, &ai);
+ }
+ } else {
+ long min_bitrate, max_bitrate;
+
+ min_bitrate = vorbisenc->min_bitrate > 0 ? vorbisenc->min_bitrate : -1;
+ max_bitrate = vorbisenc->max_bitrate > 0 ? vorbisenc->max_bitrate : -1;
+
+ if (vorbis_encode_setup_managed (&vorbisenc->vi,
+ vorbisenc->channels,
+ vorbisenc->frequency,
+ max_bitrate, vorbisenc->bitrate, min_bitrate) != 0) {
+ GST_ERROR_OBJECT (vorbisenc,
+ "vorbis_encode_setup_managed "
+ "(c %d, rate %d, max br %ld, br %d, min br %ld) failed",
+ vorbisenc->channels, vorbisenc->frequency, max_bitrate,
+ vorbisenc->bitrate, min_bitrate);
+ vorbis_info_clear (&vorbisenc->vi);
+ return FALSE;
+ }
+ }
+
+ if (vorbisenc->managed && vorbisenc->bitrate < 0) {
+ vorbis_encode_ctl (&vorbisenc->vi, OV_ECTL_RATEMANAGE_AVG, NULL);
+ } else if (!vorbisenc->managed) {
+ /* Turn off management entirely (if it was turned on). */
+ vorbis_encode_ctl (&vorbisenc->vi, OV_ECTL_RATEMANAGE_SET, NULL);
+ }
+ vorbis_encode_setup_init (&vorbisenc->vi);
+
+ /* set up the analysis state and auxiliary encoding storage */
+ vorbis_analysis_init (&vorbisenc->vd, &vorbisenc->vi);
+ vorbis_block_init (&vorbisenc->vd, &vorbisenc->vb);
+
+ vorbisenc->next_ts = 0;
+
+ vorbisenc->setup = TRUE;
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_vorbis_enc_clear (GstVorbisEnc * vorbisenc)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ if (vorbisenc->setup) {
+ vorbis_analysis_wrote (&vorbisenc->vd, 0);
+ ret = gst_vorbis_enc_output_buffers (vorbisenc);
+
+ vorbisenc->setup = FALSE;
+ }
+
+ /* clean up and exit. vorbis_info_clear() must be called last */
+ vorbis_block_clear (&vorbisenc->vb);
+ vorbis_dsp_clear (&vorbisenc->vd);
+ vorbis_info_clear (&vorbisenc->vi);
+
+ vorbisenc->header_sent = FALSE;
+
+ return ret;
+}
+
+/* prepare a buffer for transmission by passing data through libvorbis */
+static GstBuffer *
+gst_vorbis_enc_buffer_from_packet (GstVorbisEnc * vorbisenc,
+ ogg_packet * packet)
+{
+ GstBuffer *outbuf;
+
+ outbuf = gst_buffer_new_and_alloc (packet->bytes);
+ gst_buffer_fill (outbuf, 0, packet->packet, packet->bytes);
+ /* see ext/ogg/README; OFFSET_END takes "our" granulepos, OFFSET its
+ * time representation */
+ GST_BUFFER_OFFSET_END (outbuf) = packet->granulepos +
+ vorbisenc->granulepos_offset;
+ GST_BUFFER_OFFSET (outbuf) = granulepos_to_timestamp (vorbisenc,
+ GST_BUFFER_OFFSET_END (outbuf));
+ GST_BUFFER_TIMESTAMP (outbuf) = vorbisenc->next_ts;
+
+ /* update the next timestamp, taking granulepos_offset and subgranule offset
+ * into account */
+ vorbisenc->next_ts =
+ granulepos_to_timestamp_offset (vorbisenc, packet->granulepos);
+ GST_BUFFER_DURATION (outbuf) =
+ vorbisenc->next_ts - GST_BUFFER_TIMESTAMP (outbuf);
+
+ if (vorbisenc->next_discont) {
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ vorbisenc->next_discont = FALSE;
+ }
+
+ GST_LOG_OBJECT (vorbisenc, "encoded buffer of %" G_GSIZE_FORMAT " bytes",
+ gst_buffer_get_size (outbuf));
+ return outbuf;
+}
+
+/* the same as above, but different logic for setting timestamp and granulepos
+ * */
+static GstBuffer *
+gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
+ ogg_packet * packet)
+{
+ GstBuffer *outbuf;
+
+ outbuf = gst_buffer_new_and_alloc (packet->bytes);
+ gst_buffer_fill (outbuf, 0, packet->packet, packet->bytes);
+ GST_BUFFER_OFFSET (outbuf) = vorbisenc->bytes_out;
+ GST_BUFFER_OFFSET_END (outbuf) = 0;
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG ("created header packet buffer, %" G_GSIZE_FORMAT " bytes",
+ gst_buffer_get_size (outbuf));
+ return outbuf;
+}
+
+/* push out the buffer and do internal bookkeeping */
+static GstFlowReturn
+gst_vorbis_enc_push_buffer (GstVorbisEnc * vorbisenc, GstBuffer * buffer)
+{
+ vorbisenc->bytes_out += gst_buffer_get_size (buffer);
+
+ GST_DEBUG_OBJECT (vorbisenc,
+ "Pushing buffer with GP %" G_GINT64_FORMAT ", ts %" GST_TIME_FORMAT,
+ GST_BUFFER_OFFSET_END (buffer),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+ return gst_pad_push (vorbisenc->srcpad, buffer);
+}
+
+static GstFlowReturn
+gst_vorbis_enc_push_packet (GstVorbisEnc * vorbisenc, ogg_packet * packet)
+{
+ GstBuffer *outbuf;
+
+ outbuf = gst_vorbis_enc_buffer_from_packet (vorbisenc, packet);
+ return gst_vorbis_enc_push_buffer (vorbisenc, outbuf);
+}
+
+/* Set a copy of these buffers as 'streamheader' on the caps.
+ * We need a copy to avoid these buffers ending up with (indirect) refs on
+ * themselves
+ */
+static GstCaps *
+gst_vorbis_enc_set_header_on_caps (GstCaps * caps, GstBuffer * buf1,
+ GstBuffer * buf2, GstBuffer * buf3)
+{
+ GstBuffer *buf;
+ GstStructure *structure;
+ GValue array = { 0 };
+ GValue value = { 0 };
+
+ caps = gst_caps_make_writable (caps);
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* mark buffers */
+ GST_BUFFER_FLAG_SET (buf1, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_FLAG_SET (buf2, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_FLAG_SET (buf3, GST_BUFFER_FLAG_IN_CAPS);
+
+ /* put buffers in a fixed list */
+ g_value_init (&array, GST_TYPE_ARRAY);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ buf = gst_buffer_copy (buf1);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ buf = gst_buffer_copy (buf2);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ buf = gst_buffer_copy (buf3);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
+ gst_value_array_append_value (&array, &value);
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&value);
+ g_value_unset (&array);
+
+ return caps;
+}
+
+static gboolean
+gst_vorbis_enc_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstVorbisEnc *vorbisenc;
+
+ vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = gst_vorbis_enc_sink_setcaps (vorbisenc, caps);
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_EOS:
+ /* Tell the library we're at end of stream so that it can handle
+ * the last frame and mark end of stream in the output properly */
+ GST_DEBUG_OBJECT (vorbisenc, "EOS, clearing state and sending event on");
+ gst_vorbis_enc_clear (vorbisenc);
+
+ res = gst_pad_push_event (vorbisenc->srcpad, event);
+ break;
+ case GST_EVENT_TAG:
+ if (vorbisenc->tags) {
+ GstTagList *list;
+
+ gst_event_parse_tag (event, &list);
+ gst_tag_list_insert (vorbisenc->tags, list,
+ gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (vorbisenc)));
+ } else {
+ g_assert_not_reached ();
+ }
+ res = gst_pad_push_event (vorbisenc->srcpad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format == GST_FORMAT_TIME) {
+ gst_segment_copy_into (segment, &vorbisenc->segment);
+ }
+ }
+ /* fall through */
+ default:
+ res = gst_pad_push_event (vorbisenc->srcpad, event);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_vorbis_enc_buffer_check_discontinuous (GstVorbisEnc * vorbisenc,
+ GstClockTime timestamp, GstClockTime duration)
+{
+ gboolean ret = FALSE;
+
+ GST_DEBUG_OBJECT (vorbisenc, "exp %" GST_TIME_FORMAT " time %" GST_TIME_FORMAT
+ "dur %" GST_TIME_FORMAT, GST_TIME_ARGS (vorbisenc->expected_ts),
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration));
+
+ if (timestamp != GST_CLOCK_TIME_NONE &&
+ vorbisenc->expected_ts != GST_CLOCK_TIME_NONE &&
+ timestamp + duration != vorbisenc->expected_ts) {
+ /* It turns out that a lot of elements don't generate perfect streams due
+ * to rounding errors. So, we permit small errors (< 3 samples) without
+ * causing a discont.
+ */
+ int threesample = GST_SECOND / vorbisenc->frequency * 3;
+
+ if ((GstClockTimeDiff) (timestamp - vorbisenc->expected_ts) > threesample) {
+ GST_DEBUG_OBJECT (vorbisenc, "Expected TS %" GST_TIME_FORMAT
+ ", buffer TS %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (vorbisenc->expected_ts), GST_TIME_ARGS (timestamp));
+ ret = TRUE;
+ }
+ }
+
+ if (timestamp != GST_CLOCK_TIME_NONE && duration != GST_CLOCK_TIME_NONE) {
+ vorbisenc->expected_ts = timestamp + duration;
+ } else
+ vorbisenc->expected_ts = GST_CLOCK_TIME_NONE;
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstVorbisEnc *vorbisenc;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gfloat *data, *ptr;
+ gulong size;
+ gulong i, j;
+ float **vorbis_buffer;
+ GstBuffer *buf1, *buf2, *buf3;
+ gboolean first = FALSE;
+ GstClockTime timestamp = GST_CLOCK_TIME_NONE;
+ GstClockTime running_time = GST_CLOCK_TIME_NONE;
+ gsize bsize;
+
+ vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
+
+ if (!vorbisenc->setup)
+ goto not_setup;
+
+ buffer = gst_audio_buffer_clip (buffer, &vorbisenc->segment,
+ vorbisenc->frequency, 4 * vorbisenc->channels);
+ if (buffer == NULL) {
+ GST_DEBUG_OBJECT (vorbisenc, "Dropping buffer, out of segment");
+ return GST_FLOW_OK;
+ }
+ running_time =
+ gst_segment_to_running_time (&vorbisenc->segment, GST_FORMAT_TIME,
+ GST_BUFFER_TIMESTAMP (buffer));
+ timestamp = running_time;
+ GST_DEBUG_OBJECT (vorbisenc, " timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+ if (!vorbisenc->header_sent) {
+ /* Vorbis streams begin with three 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. The
+ third header holds the bitstream codebook. We merely need to
+ make the headers, then pass them to libvorbis one at a time;
+ libvorbis handles the additional Ogg bitstream constraints */
+ ogg_packet header;
+ ogg_packet header_comm;
+ ogg_packet header_code;
+ GstCaps *caps;
+
+ /* first, make sure header buffers get timestamp == 0 */
+ vorbisenc->next_ts = 0;
+ vorbisenc->granulepos_offset = 0;
+ vorbisenc->subgranule_offset = 0;
+
+ GST_DEBUG_OBJECT (vorbisenc, "creating and sending header packets");
+ gst_vorbis_enc_set_metadata (vorbisenc);
+ vorbis_analysis_headerout (&vorbisenc->vd, &vorbisenc->vc, &header,
+ &header_comm, &header_code);
+ vorbis_comment_clear (&vorbisenc->vc);
+
+ /* create header buffers */
+ buf1 = gst_vorbis_enc_buffer_from_header_packet (vorbisenc, &header);
+ buf2 = gst_vorbis_enc_buffer_from_header_packet (vorbisenc, &header_comm);
+ buf3 = gst_vorbis_enc_buffer_from_header_packet (vorbisenc, &header_code);
+
+ /* mark and put on caps */
+ vorbisenc->srccaps = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ caps = vorbisenc->srccaps;
+ caps = gst_vorbis_enc_set_header_on_caps (caps, buf1, buf2, buf3);
+
+ /* negotiate with these caps */
+ GST_DEBUG ("here are the caps: %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (vorbisenc->srcpad, caps);
+
+ /* push out buffers */
+ /* push_buffer takes the reference even for failure */
+ if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf1)) != GST_FLOW_OK)
+ goto failed_header_push;
+ if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf2)) != GST_FLOW_OK) {
+ buf2 = NULL;
+ goto failed_header_push;
+ }
+ if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf3)) != GST_FLOW_OK) {
+ buf3 = NULL;
+ goto failed_header_push;
+ }
+
+ /* now adjust starting granulepos accordingly if the buffer's timestamp is
+ nonzero */
+ vorbisenc->next_ts = timestamp;
+ vorbisenc->expected_ts = timestamp;
+ vorbisenc->granulepos_offset = gst_util_uint64_scale
+ (running_time, vorbisenc->frequency, GST_SECOND);
+ vorbisenc->subgranule_offset = 0;
+ vorbisenc->subgranule_offset =
+ vorbisenc->next_ts - granulepos_to_timestamp_offset (vorbisenc, 0);
+
+ vorbisenc->header_sent = TRUE;
+ first = TRUE;
+ }
+
+ if (vorbisenc->expected_ts != GST_CLOCK_TIME_NONE &&
+ timestamp < vorbisenc->expected_ts) {
+ int threesample = GST_SECOND / vorbisenc->frequency * 3;
+ guint64 diff = vorbisenc->expected_ts - timestamp;
+ guint64 diff_bytes;
+ gsize size;
+
+ /* Don't freak out on tiny jitters; use the same < 3 sample
+ tolerance as in the discontinuous detection */
+ if ((GstClockTimeDiff) (vorbisenc->expected_ts - timestamp) > threesample) {
+
+ GST_WARNING_OBJECT (vorbisenc, "Buffer is older than previous "
+ "timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT
+ "), cannot handle. Clipping buffer.",
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (vorbisenc->expected_ts));
+
+ size = gst_buffer_get_size (buffer);
+
+ diff_bytes =
+ GST_CLOCK_TIME_TO_FRAMES (diff,
+ vorbisenc->frequency) * vorbisenc->channels * sizeof (gfloat);
+ if (diff_bytes >= size) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+ buffer = gst_buffer_make_writable (buffer);
+ gst_buffer_resize (buffer, diff_bytes, size - diff_bytes);
+
+ if (GST_BUFFER_DURATION_IS_VALID (buffer))
+ GST_BUFFER_DURATION (buffer) -= diff;
+ }
+
+ /* adjust the input timestamp in either case */
+ GST_BUFFER_TIMESTAMP (buffer) += diff;
+ }
+
+ if (gst_vorbis_enc_buffer_check_discontinuous (vorbisenc, timestamp,
+ GST_BUFFER_DURATION (buffer)) && !first) {
+ GST_WARNING_OBJECT (vorbisenc,
+ "Buffer is discontinuous, flushing encoder "
+ "and restarting (Discont from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT
+ ")", GST_TIME_ARGS (vorbisenc->next_ts), GST_TIME_ARGS (timestamp));
+ /* Re-initialise encoder (there's unfortunately no API to flush it) */
+ if ((ret = gst_vorbis_enc_clear (vorbisenc)) != GST_FLOW_OK)
+ return ret;
+ if (!gst_vorbis_enc_setup (vorbisenc))
+ return GST_FLOW_ERROR; /* Should be impossible, we can only get here if
+ we successfully initialised earlier */
+
+ /* Now, set our granulepos offset appropriately. */
+ vorbisenc->next_ts = timestamp;
+ /* We need to round to the nearest whole number of samples, not just do
+ * a truncating division here */
+ vorbisenc->granulepos_offset = gst_util_uint64_scale
+ (running_time + GST_SECOND / vorbisenc->frequency / 2
+ - vorbisenc->subgranule_offset, vorbisenc->frequency, GST_SECOND);
+
+ vorbisenc->header_sent = TRUE;
+
+ /* And our next output buffer must have DISCONT set on it */
+ vorbisenc->next_discont = TRUE;
+ }
+
+ /* Sending zero samples to libvorbis marks EOS, so we mustn't do that */
+ data = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_WRITE);
+ if (bsize == 0) {
+ gst_buffer_unmap (buffer, data, bsize);
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ }
+
+ /* data to encode */
+ size = bsize / (vorbisenc->channels * sizeof (float));
+
+ ptr = data;
+
+ /* expose the buffer to submit data */
+ vorbis_buffer = vorbis_analysis_buffer (&vorbisenc->vd, size);
+
+ /* deinterleave samples, write the buffer data */
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < vorbisenc->channels; j++) {
+ vorbis_buffer[j][i] = *ptr++;
+ }
+ }
+
+ /* tell the library how much we actually submitted */
+ vorbis_analysis_wrote (&vorbisenc->vd, size);
+ gst_buffer_unmap (buffer, data, bsize);
+
+ GST_LOG_OBJECT (vorbisenc, "wrote %lu samples to vorbis", size);
+
+ vorbisenc->samples_in += size;
+
+ gst_buffer_unref (buffer);
+
+ ret = gst_vorbis_enc_output_buffers (vorbisenc);
+
+ return ret;
+
+ /* error cases */
+not_setup:
+ {
+ gst_buffer_unref (buffer);
+ GST_ELEMENT_ERROR (vorbisenc, CORE, NEGOTIATION, (NULL),
+ ("encoder not initialized (input is not audio?)"));
+ return GST_FLOW_UNEXPECTED;
+ }
+failed_header_push:
+ {
+ GST_WARNING_OBJECT (vorbisenc, "Failed to push headers");
+ /* buf1 is always already unreffed */
+ if (buf2)
+ gst_buffer_unref (buf2);
+ if (buf3)
+ gst_buffer_unref (buf3);
+ gst_buffer_unref (buffer);
+ return ret;
+ }
+}
+
+static GstFlowReturn
+gst_vorbis_enc_output_buffers (GstVorbisEnc * vorbisenc)
+{
+ GstFlowReturn ret;
+
+ /* vorbis does some data preanalysis, then divides up blocks for
+ more involved (potentially parallel) processing. Get a single
+ block for encoding now */
+ while (vorbis_analysis_blockout (&vorbisenc->vd, &vorbisenc->vb) == 1) {
+ ogg_packet op;
+
+ GST_LOG_OBJECT (vorbisenc, "analysed to a block");
+
+ /* analysis */
+ vorbis_analysis (&vorbisenc->vb, NULL);
+ vorbis_bitrate_addblock (&vorbisenc->vb);
+
+ while (vorbis_bitrate_flushpacket (&vorbisenc->vd, &op)) {
+ GST_LOG_OBJECT (vorbisenc, "pushing out a data packet");
+ ret = gst_vorbis_enc_push_packet (vorbisenc, &op);
+
+ if (ret != GST_FLOW_OK)
+ return ret;
+ }
+ }
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_vorbis_enc_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstVorbisEnc *vorbisenc;
+
+ g_return_if_fail (GST_IS_VORBISENC (object));
+
+ vorbisenc = GST_VORBISENC (object);
+
+ switch (prop_id) {
+ case ARG_MAX_BITRATE:
+ g_value_set_int (value, vorbisenc->max_bitrate);
+ break;
+ case ARG_BITRATE:
+ g_value_set_int (value, vorbisenc->bitrate);
+ break;
+ case ARG_MIN_BITRATE:
+ g_value_set_int (value, vorbisenc->min_bitrate);
+ break;
+ case ARG_QUALITY:
+ g_value_set_float (value, vorbisenc->quality);
+ break;
+ case ARG_MANAGED:
+ g_value_set_boolean (value, vorbisenc->managed);
+ break;
+ case ARG_LAST_MESSAGE:
+ g_value_set_string (value, vorbisenc->last_message);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_vorbis_enc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstVorbisEnc *vorbisenc;
+
+ g_return_if_fail (GST_IS_VORBISENC (object));
+
+ vorbisenc = GST_VORBISENC (object);
+
+ switch (prop_id) {
+ case ARG_MAX_BITRATE:
+ {
+ gboolean old_value = vorbisenc->managed;
+
+ vorbisenc->max_bitrate = g_value_get_int (value);
+ if (vorbisenc->max_bitrate >= 0
+ && vorbisenc->max_bitrate < LOWEST_BITRATE) {
+ g_warning ("Lowest allowed bitrate is %d", LOWEST_BITRATE);
+ vorbisenc->max_bitrate = LOWEST_BITRATE;
+ }
+ if (vorbisenc->min_bitrate > 0 && vorbisenc->max_bitrate > 0)
+ vorbisenc->managed = TRUE;
+ else
+ vorbisenc->managed = FALSE;
+
+ if (old_value != vorbisenc->managed)
+ g_object_notify (object, "managed");
+ break;
+ }
+ case ARG_BITRATE:
+ vorbisenc->bitrate = g_value_get_int (value);
+ if (vorbisenc->bitrate >= 0 && vorbisenc->bitrate < LOWEST_BITRATE) {
+ g_warning ("Lowest allowed bitrate is %d", LOWEST_BITRATE);
+ vorbisenc->bitrate = LOWEST_BITRATE;
+ }
+ break;
+ case ARG_MIN_BITRATE:
+ {
+ gboolean old_value = vorbisenc->managed;
+
+ vorbisenc->min_bitrate = g_value_get_int (value);
+ if (vorbisenc->min_bitrate >= 0
+ && vorbisenc->min_bitrate < LOWEST_BITRATE) {
+ g_warning ("Lowest allowed bitrate is %d", LOWEST_BITRATE);
+ vorbisenc->min_bitrate = LOWEST_BITRATE;
+ }
+ if (vorbisenc->min_bitrate > 0 && vorbisenc->max_bitrate > 0)
+ vorbisenc->managed = TRUE;
+ else
+ vorbisenc->managed = FALSE;
+
+ if (old_value != vorbisenc->managed)
+ g_object_notify (object, "managed");
+ break;
+ }
+ case ARG_QUALITY:
+ vorbisenc->quality = g_value_get_float (value);
+ if (vorbisenc->quality >= 0.0)
+ vorbisenc->quality_set = TRUE;
+ else
+ vorbisenc->quality_set = FALSE;
+ break;
+ case ARG_MANAGED:
+ vorbisenc->managed = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_vorbis_enc_change_state (GstElement * element, GstStateChange transition)
+{
+ GstVorbisEnc *vorbisenc = GST_VORBISENC (element);
+ GstStateChangeReturn res;
+
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ vorbisenc->tags = gst_tag_list_new ();
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ vorbisenc->setup = FALSE;
+ vorbisenc->next_discont = FALSE;
+ vorbisenc->header_sent = FALSE;
+ gst_segment_init (&vorbisenc->segment, GST_FORMAT_TIME);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ 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:
+ vorbis_block_clear (&vorbisenc->vb);
+ vorbis_dsp_clear (&vorbisenc->vd);
+ vorbis_info_clear (&vorbisenc->vi);
+ g_free (vorbisenc->last_message);
+ vorbisenc->last_message = NULL;
+ if (vorbisenc->srccaps) {
+ gst_caps_unref (vorbisenc->srccaps);
+ vorbisenc->srccaps = NULL;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_tag_list_free (vorbisenc->tags);
+ vorbisenc->tags = NULL;
+ default:
+ break;
+ }
+
+ return res;
+}
diff --git a/ext/vorbis/gstvorbisenc.h b/ext/vorbis/gstvorbisenc.h
new file mode 100644
index 0000000..840f2bd
--- /dev/null
+++ b/ext/vorbis/gstvorbisenc.h
@@ -0,0 +1,100 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_VORBIS_ENC_H__
+#define __GST_VORBIS_ENC_H__
+
+
+#include <gst/gst.h>
+
+#include <vorbis/codec.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VORBISENC \
+ (gst_vorbis_enc_get_type())
+#define GST_VORBISENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VORBISENC,GstVorbisEnc))
+#define GST_VORBISENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VORBISENC,GstVorbisEncClass))
+#define GST_IS_VORBISENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VORBISENC))
+#define GST_IS_VORBISENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VORBISENC))
+
+typedef struct _GstVorbisEnc GstVorbisEnc;
+typedef struct _GstVorbisEncClass GstVorbisEncClass;
+
+/**
+ * GstVorbisEnc:
+ *
+ * Opaque data structure.
+ */
+struct _GstVorbisEnc {
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstCaps *srccaps;
+ GstCaps *sinkcaps;
+
+ vorbis_info vi; /* struct that stores all the static vorbis bitstream
+ settings */
+ vorbis_comment vc; /* struct that stores all the user comments */
+
+ vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
+ vorbis_block vb; /* local working space for packet->PCM decode */
+
+ gboolean managed;
+ gint bitrate;
+ gint min_bitrate;
+ gint max_bitrate;
+ gfloat quality;
+ gboolean quality_set;
+
+ gint channels;
+ gint frequency;
+
+ guint64 samples_in;
+ guint64 bytes_out;
+ GstClockTime next_ts;
+ GstClockTime expected_ts;
+ gboolean next_discont;
+ guint64 granulepos_offset;
+ gint64 subgranule_offset;
+ GstSegment segment;
+
+ GstTagList * tags;
+
+ gboolean setup;
+ gboolean header_sent;
+ gchar *last_message;
+};
+
+struct _GstVorbisEncClass {
+ GstElementClass parent_class;
+};
+
+GType gst_vorbis_enc_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_VORBIS_ENC_H__ */
diff --git a/ext/vorbis/gstvorbisparse.c b/ext/vorbis/gstvorbisparse.c
new file mode 100644
index 0000000..f3fccfd
--- /dev/null
+++ b/ext/vorbis/gstvorbisparse.c
@@ -0,0 +1,661 @@
+/* GStreamer
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2006 Andy Wingo <wingo@pobox.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-vorbisparse
+ * @see_also: vorbisdec, oggdemux, theoraparse
+ *
+ * The vorbisparse element will parse the header packets of the Vorbis
+ * stream and put them as the streamheader in the caps. This is used in the
+ * multifdsink case where you want to stream live vorbis streams to multiple
+ * clients, each client has to receive the streamheaders first before they can
+ * consume the vorbis 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
+ * vorbisparse outputs have all of the metadata that oggmux expects to receive,
+ * which allows you to (for example) remux an ogg/vorbis file.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisparse ! fakesink
+ * ]| This pipeline shows that the streamheader is set in the caps, and that each
+ * buffer has the timestamp, duration, offset, and offset_end set.
+ * |[
+ * gst-launch filesrc location=sine.ogg ! oggdemux ! vorbisparse \
+ * ! oggmux ! filesink location=sine-remuxed.ogg
+ * ]| This pipeline shows remuxing. sine-remuxed.ogg might not be exactly the same
+ * as sine.ogg, but they should produce exactly the same decoded data.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-04-01 (0.10.4.1)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstvorbisparse.h"
+
+GST_DEBUG_CATEGORY_EXTERN (vorbisparse_debug);
+#define GST_CAT_DEFAULT vorbisparse_debug
+
+static GstStaticPadTemplate vorbis_parse_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-vorbis")
+ );
+
+static GstStaticPadTemplate vorbis_parse_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-vorbis")
+ );
+
+#define gst_vorbis_parse_parent_class parent_class
+G_DEFINE_TYPE (GstVorbisParse, gst_vorbis_parse, GST_TYPE_ELEMENT);
+
+static GstFlowReturn vorbis_parse_chain (GstPad * pad, GstBuffer * buffer);
+static GstStateChangeReturn vorbis_parse_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean vorbis_parse_sink_event (GstPad * pad, GstEvent * event);
+static gboolean vorbis_parse_src_query (GstPad * pad, GstQuery * query);
+static gboolean vorbis_parse_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value);
+static GstFlowReturn vorbis_parse_parse_packet (GstVorbisParse * parse,
+ GstBuffer * buf);
+
+static void
+gst_vorbis_parse_class_init (GstVorbisParseClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gstelement_class->change_state = vorbis_parse_change_state;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_parse_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_parse_sink_factory));
+ gst_element_class_set_details_simple (gstelement_class,
+ "VorbisParse", "Codec/Parser/Audio",
+ "parse raw vorbis streams",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ klass->parse_packet = GST_DEBUG_FUNCPTR (vorbis_parse_parse_packet);
+}
+
+static void
+gst_vorbis_parse_init (GstVorbisParse * parse)
+{
+ parse->sinkpad =
+ gst_pad_new_from_static_template (&vorbis_parse_sink_factory, "sink");
+ gst_pad_set_chain_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (vorbis_parse_chain));
+ gst_pad_set_event_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (vorbis_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
+
+ parse->srcpad =
+ gst_pad_new_from_static_template (&vorbis_parse_src_factory, "src");
+ gst_pad_set_query_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (vorbis_parse_src_query));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad);
+}
+
+static void
+vorbis_parse_set_header_on_caps (GstVorbisParse * parse, GstCaps * caps)
+{
+ GstBuffer *buf1, *buf2, *buf3;
+ GstStructure *structure;
+ GValue array = { 0 };
+ GValue value = { 0 };
+
+ g_assert (parse);
+ g_assert (parse->streamheader);
+ g_assert (parse->streamheader->next);
+ g_assert (parse->streamheader->next->next);
+ buf1 = parse->streamheader->data;
+ g_assert (buf1);
+ buf2 = parse->streamheader->next->data;
+ g_assert (buf2);
+ buf3 = parse->streamheader->next->next->data;
+ g_assert (buf3);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ /* mark buffers */
+ GST_BUFFER_FLAG_SET (buf1, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_FLAG_SET (buf2, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_FLAG_SET (buf3, GST_BUFFER_FLAG_IN_CAPS);
+
+ /* put buffers in a fixed list */
+ g_value_init (&array, GST_TYPE_ARRAY);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, buf1);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, buf2);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, buf3);
+ gst_value_array_append_value (&array, &value);
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&value);
+ g_value_unset (&array);
+}
+
+static void
+vorbis_parse_drain_event_queue (GstVorbisParse * parse)
+{
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_pad_event_default (parse->sinkpad, event);
+ }
+}
+
+static void
+vorbis_parse_push_headers (GstVorbisParse * parse)
+{
+ /* mark and put on caps */
+ GstCaps *caps;
+ GstBuffer *outbuf, *outbuf1, *outbuf2, *outbuf3;
+ ogg_packet packet;
+ gsize size;
+
+ /* get the headers into the caps, passing them to vorbis as we go */
+ caps = gst_caps_make_writable (gst_pad_get_caps (parse->srcpad, NULL));
+ vorbis_parse_set_header_on_caps (parse, caps);
+ GST_DEBUG_OBJECT (parse, "here are the caps: %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (parse->srcpad, caps);
+ gst_caps_unref (caps);
+
+ outbuf = GST_BUFFER_CAST (parse->streamheader->data);
+ packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
+ packet.packetno = 1;
+ packet.e_o_s = 0;
+ packet.b_o_s = 1;
+ vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+ gst_buffer_unmap (outbuf, packet.packet, size);
+ parse->sample_rate = parse->vi.rate;
+ outbuf1 = outbuf;
+
+ outbuf = GST_BUFFER_CAST (parse->streamheader->next->data);
+ packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
+ packet.packetno = 2;
+ packet.e_o_s = 0;
+ packet.b_o_s = 0;
+ vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+ gst_buffer_unmap (outbuf, packet.packet, size);
+ outbuf2 = outbuf;
+
+ outbuf = GST_BUFFER_CAST (parse->streamheader->next->next->data);
+ packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
+ packet.packetno = 3;
+ packet.e_o_s = 0;
+ packet.b_o_s = 0;
+ vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+ gst_buffer_unmap (outbuf, packet.packet, size);
+ outbuf3 = outbuf;
+
+ /* first process queued events */
+ vorbis_parse_drain_event_queue (parse);
+
+ /* push out buffers, ignoring return value... */
+ gst_pad_push (parse->srcpad, outbuf1);
+ gst_pad_push (parse->srcpad, outbuf2);
+ gst_pad_push (parse->srcpad, outbuf3);
+
+ g_list_free (parse->streamheader);
+ parse->streamheader = NULL;
+}
+
+static void
+vorbis_parse_clear_queue (GstVorbisParse * parse)
+{
+ while (parse->buffer_queue->length) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+ gst_buffer_unref (buf);
+ }
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_event_unref (event);
+ }
+}
+
+static GstFlowReturn
+vorbis_parse_push_buffer (GstVorbisParse * parse, GstBuffer * buf,
+ gint64 granulepos)
+{
+ guint64 samples;
+
+ /* our hack as noted below */
+ samples = GST_BUFFER_OFFSET (buf);
+
+ GST_BUFFER_OFFSET_END (buf) = granulepos;
+ GST_BUFFER_DURATION (buf) = samples * GST_SECOND / parse->sample_rate;
+ GST_BUFFER_OFFSET (buf) = granulepos * GST_SECOND / parse->sample_rate;
+ GST_BUFFER_TIMESTAMP (buf) =
+ GST_BUFFER_OFFSET (buf) - GST_BUFFER_DURATION (buf);
+
+ return gst_pad_push (parse->srcpad, buf);
+}
+
+static GstFlowReturn
+vorbis_parse_drain_queue_prematurely (GstVorbisParse * parse)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint64 granulepos = MAX (parse->prev_granulepos, 0);
+
+ /* got an EOS event, make sure to push out any buffers that were in the queue
+ * -- won't normally be the case, but this catches the
+ * didn't-get-a-granulepos-on-the-last-packet case. Assuming a continuous
+ * stream. */
+
+ /* if we got EOS before any buffers came, go ahead and push the other events
+ * first */
+ vorbis_parse_drain_event_queue (parse);
+
+ while (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+
+ granulepos += GST_BUFFER_OFFSET (buf);
+ ret = vorbis_parse_push_buffer (parse, buf, granulepos);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+ parse->prev_granulepos = granulepos;
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+vorbis_parse_drain_queue (GstVorbisParse * parse, gint64 granulepos)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GList *walk;
+ gint64 cur = granulepos;
+ gint64 gp;
+
+ for (walk = parse->buffer_queue->head; walk; walk = walk->next)
+ cur -= GST_BUFFER_OFFSET (walk->data);
+
+ if (parse->prev_granulepos != -1)
+ cur = MAX (cur, parse->prev_granulepos);
+
+ while (!g_queue_is_empty (parse->buffer_queue)) {
+ GstBuffer *buf;
+
+ buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
+
+ cur += GST_BUFFER_OFFSET (buf);
+ gp = CLAMP (cur, 0, granulepos);
+
+ ret = vorbis_parse_push_buffer (parse, buf, gp);
+
+ if (ret != GST_FLOW_OK)
+ goto done;
+ }
+
+ parse->prev_granulepos = granulepos;
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+vorbis_parse_queue_buffer (GstVorbisParse * parse, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ long blocksize;
+ ogg_packet packet;
+ gsize size;
+
+ buf = gst_buffer_make_writable (buf);
+
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+ packet.granulepos = GST_BUFFER_OFFSET_END (buf);
+ packet.packetno = parse->packetno + parse->buffer_queue->length;
+ packet.e_o_s = 0;
+
+ blocksize = vorbis_packet_blocksize (&parse->vi, &packet);
+ gst_buffer_unmap (buf, packet.packet, size);
+
+ /* temporarily store the sample count in OFFSET -- we overwrite this later */
+
+ if (parse->prev_blocksize < 0)
+ GST_BUFFER_OFFSET (buf) = 0;
+ else
+ GST_BUFFER_OFFSET (buf) = (blocksize + parse->prev_blocksize) / 4;
+
+ parse->prev_blocksize = blocksize;
+
+ g_queue_push_tail (parse->buffer_queue, buf);
+
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buf))
+ ret = vorbis_parse_drain_queue (parse, GST_BUFFER_OFFSET_END (buf));
+
+ return ret;
+}
+
+static GstFlowReturn
+vorbis_parse_parse_packet (GstVorbisParse * parse, GstBuffer * buf)
+{
+ GstFlowReturn ret;
+ guint8 *data;
+ gsize size;
+ gboolean have_header;
+
+ parse->packetno++;
+
+ have_header = FALSE;
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ if (size >= 1) {
+ if (data[0] >= 0x01 && data[0] <= 0x05)
+ have_header = TRUE;
+ }
+ gst_buffer_unmap (buf, data, size);
+
+ if (have_header) {
+ if (!parse->streamheader_sent) {
+ /* we need to collect the headers still */
+ /* so put it on the streamheader list and return */
+ parse->streamheader = g_list_append (parse->streamheader, buf);
+ }
+ ret = GST_FLOW_OK;
+ } else {
+ /* data packet, push the headers we collected before */
+ if (!parse->streamheader_sent) {
+ vorbis_parse_push_headers (parse);
+ parse->streamheader_sent = TRUE;
+ }
+ ret = vorbis_parse_queue_buffer (parse, buf);
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+vorbis_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstVorbisParseClass *klass;
+ GstVorbisParse *parse;
+
+ parse = GST_VORBIS_PARSE (GST_PAD_PARENT (pad));
+ klass = GST_VORBIS_PARSE_CLASS (G_OBJECT_GET_CLASS (parse));
+
+ g_assert (klass->parse_packet != NULL);
+
+ return klass->parse_packet (parse, buffer);
+}
+
+static gboolean
+vorbis_parse_queue_event (GstVorbisParse * parse, GstEvent * event)
+{
+ GstFlowReturn ret = TRUE;
+
+ g_queue_push_tail (parse->event_queue, event);
+
+ return ret;
+}
+
+static gboolean
+vorbis_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean ret;
+ GstVorbisParse *parse;
+
+ parse = GST_VORBIS_PARSE (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ vorbis_parse_clear_queue (parse);
+ parse->prev_granulepos = -1;
+ parse->prev_blocksize = -1;
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_EOS:
+ vorbis_parse_drain_queue_prematurely (parse);
+ ret = gst_pad_event_default (pad, event);
+ break;
+ default:
+ if (!parse->streamheader_sent && GST_EVENT_IS_SERIALIZED (event))
+ ret = vorbis_parse_queue_event (parse, event);
+ else
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (parse);
+
+ return ret;
+}
+
+static gboolean
+vorbis_parse_convert (GstPad * pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = TRUE;
+ GstVorbisParse *parse;
+ guint64 scale = 1;
+
+ parse = GST_VORBIS_PARSE (GST_PAD_PARENT (pad));
+
+ /* fixme: assumes atomic access to lots of instance variables modified from
+ * the streaming thread, including 64-bit variables */
+
+ if (parse->packetno < 4)
+ return FALSE;
+
+ if (src_format == *dest_format) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ if (parse->sinkpad == pad &&
+ (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES))
+ return FALSE;
+
+ switch (src_format) {
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ scale = sizeof (float) * parse->vi.channels;
+ case GST_FORMAT_DEFAULT:
+ *dest_value =
+ scale * gst_util_uint64_scale_int (src_value, parse->vi.rate,
+ GST_SECOND);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ *dest_value = src_value * sizeof (float) * parse->vi.channels;
+ break;
+ case GST_FORMAT_TIME:
+ *dest_value =
+ gst_util_uint64_scale_int (src_value, GST_SECOND, parse->vi.rate);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_DEFAULT:
+ *dest_value = src_value / (sizeof (float) * parse->vi.channels);
+ break;
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND,
+ parse->vi.rate * sizeof (float) * parse->vi.channels);
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+
+ return res;
+}
+
+static gboolean
+vorbis_parse_src_query (GstPad * pad, GstQuery * query)
+{
+ gint64 granulepos;
+ GstVorbisParse *parse;
+ gboolean res = FALSE;
+
+ parse = GST_VORBIS_PARSE (GST_PAD_PARENT (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+ gint64 value;
+
+ granulepos = parse->prev_granulepos;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ /* and convert to the final format */
+ if (!(res =
+ vorbis_parse_convert (pad, GST_FORMAT_DEFAULT, granulepos,
+ &format, &value)))
+ goto error;
+
+ /* fixme: support segments
+ value = (value - parse->segment_start) + parse->segment_time;
+ */
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (parse, "query %p: peer returned granulepos: %"
+ G_GUINT64_FORMAT " - we return %" G_GUINT64_FORMAT " (format %u)",
+ query, granulepos, value, format);
+
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ /* fixme: not threadsafe */
+ /* query peer for total length */
+ if (!gst_pad_is_linked (parse->sinkpad)) {
+ GST_WARNING_OBJECT (parse, "sink pad %" GST_PTR_FORMAT " is not linked",
+ parse->sinkpad);
+ goto error;
+ }
+ if (!(res = gst_pad_query (GST_PAD_PEER (parse->sinkpad), query)))
+ goto error;
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
+ if (!(res =
+ vorbis_parse_convert (pad, src_fmt, src_val, &dest_fmt,
+ &dest_val)))
+ goto error;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+ return res;
+
+error:
+ {
+ GST_WARNING_OBJECT (parse, "error handling query");
+ return res;
+ }
+}
+
+static GstStateChangeReturn
+vorbis_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstVorbisParse *parse = GST_VORBIS_PARSE (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ vorbis_info_init (&parse->vi);
+ vorbis_comment_init (&parse->vc);
+ parse->prev_granulepos = -1;
+ parse->prev_blocksize = -1;
+ parse->packetno = 0;
+ parse->streamheader_sent = FALSE;
+ parse->buffer_queue = g_queue_new ();
+ parse->event_queue = g_queue_new ();
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ vorbis_info_clear (&parse->vi);
+ vorbis_comment_clear (&parse->vc);
+ vorbis_parse_clear_queue (parse);
+ g_queue_free (parse->buffer_queue);
+ parse->buffer_queue = NULL;
+ g_queue_free (parse->event_queue);
+ parse->event_queue = NULL;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/ext/vorbis/gstvorbisparse.h b/ext/vorbis/gstvorbisparse.h
new file mode 100644
index 0000000..6538949
--- /dev/null
+++ b/ext/vorbis/gstvorbisparse.h
@@ -0,0 +1,82 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2004> 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.
+ */
+
+
+#ifndef __GST_VORBIS_PARSE_H__
+#define __GST_VORBIS_PARSE_H__
+
+
+#include <gst/gst.h>
+#include <vorbis/codec.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VORBIS_PARSE \
+ (gst_vorbis_parse_get_type())
+#define GST_VORBIS_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VORBIS_PARSE,GstVorbisParse))
+#define GST_VORBIS_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VORBIS_PARSE,GstVorbisParseClass))
+#define GST_IS_VORBIS_PARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VORBIS_PARSE))
+#define GST_IS_VORBIS_PARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VORBIS_PARSE))
+
+typedef struct _GstVorbisParse GstVorbisParse;
+typedef struct _GstVorbisParseClass GstVorbisParseClass;
+
+/**
+ * GstVorbisParse:
+ *
+ * Opaque data structure.
+ */
+struct _GstVorbisParse {
+ GstElement element;
+
+ GstPad * sinkpad;
+ GstPad * srcpad;
+
+ guint packetno;
+ gboolean streamheader_sent;
+ GList * streamheader;
+
+ GQueue * event_queue;
+ GQueue * buffer_queue;
+
+ vorbis_info vi;
+ vorbis_comment vc;
+
+ gint64 prev_granulepos;
+ gint32 prev_blocksize;
+ guint32 sample_rate;
+};
+
+struct _GstVorbisParseClass {
+ GstElementClass parent_class;
+
+ /* virtual functions */
+ GstFlowReturn (*parse_packet) (GstVorbisParse * parse, GstBuffer * buf);
+};
+
+GType gst_vorbis_parse_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_VORBIS_PARSE_H__ */
diff --git a/ext/vorbis/gstvorbistag.c b/ext/vorbis/gstvorbistag.c
new file mode 100644
index 0000000..60dc485
--- /dev/null
+++ b/ext/vorbis/gstvorbistag.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2006 James Livingston <doclivingston@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.
+ */
+
+/**
+ * SECTION:element-vorbistag
+ * @see_also: #oggdemux, #oggmux, #vorbisparse, #GstTagSetter
+ *
+ * The vorbistags element can change the tag contained within a raw
+ * vorbis stream. Specifically, it modifies the comments header packet
+ * of the vorbis stream.
+ *
+ * The element will also process the stream as the #vorbisparse element does
+ * so it can be used when remuxing an Ogg Vorbis stream, without additional
+ * elements.
+ *
+ * Applications can set the tags to write using the #GstTagSetter interface.
+ * Tags contained withing the vorbis bitstream will be picked up
+ * automatically (and merged according to the merge mode set via the tag
+ * setter interface).
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=foo.ogg ! oggdemux ! vorbistag ! oggmux ! filesink location=bar.ogg
+ * ]| 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.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <gst/tag/tag.h>
+#include <gst/gsttagsetter.h>
+
+#include <vorbis/codec.h>
+
+#include "gstvorbistag.h"
+
+
+GST_DEBUG_CATEGORY_EXTERN (vorbisparse_debug);
+#define GST_CAT_DEFAULT vorbisparse_debug
+
+static GstFlowReturn gst_vorbis_tag_parse_packet (GstVorbisParse * parse,
+ GstBuffer * buffer);
+
+#define gst_vorbis_tag_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstVorbisTag, gst_vorbis_tag,
+ GST_TYPE_VORBIS_PARSE, G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL));
+
+static void
+gst_vorbis_tag_class_init (GstVorbisTagClass * klass)
+{
+ GstVorbisParseClass *vorbisparse_class = GST_VORBIS_PARSE_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_details_simple (element_class,
+ "VorbisTag", "Formatter/Metadata",
+ "Retags vorbis streams", "James Livingston <doclivingston@gmail.com>");
+
+ vorbisparse_class->parse_packet = gst_vorbis_tag_parse_packet;
+}
+
+static void
+gst_vorbis_tag_init (GstVorbisTag * tagger)
+{
+ /* nothing to do */
+}
+
+
+static GstFlowReturn
+gst_vorbis_tag_parse_packet (GstVorbisParse * parse, GstBuffer * buffer)
+{
+ GstTagList *old_tags, *new_tags;
+ const GstTagList *user_tags;
+ GstVorbisTag *tagger;
+ gchar *encoder = NULL;
+ GstBuffer *new_buf;
+ guint8 *data;
+ gsize size;
+ gboolean do_parse = FALSE;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ /* just pass everything except the comments packet */
+ if (size >= 1 && data[0] != 0x03)
+ do_parse = TRUE;
+ gst_buffer_unmap (buffer, data, size);
+
+ if (do_parse) {
+ return GST_VORBIS_PARSE_CLASS (parent_class)->parse_packet (parse, buffer);
+ }
+
+ tagger = GST_VORBIS_TAG (parse);
+
+ old_tags =
+ gst_tag_list_from_vorbiscomment_buffer (buffer, (guint8 *) "\003vorbis",
+ 7, &encoder);
+ user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (tagger));
+
+ /* build new tag list */
+ new_tags = gst_tag_list_merge (user_tags, old_tags,
+ gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (tagger)));
+ gst_tag_list_free (old_tags);
+
+ new_buf =
+ gst_tag_list_to_vorbiscomment_buffer (new_tags, (guint8 *) "\003vorbis",
+ 7, encoder);
+ gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+
+ gst_tag_list_free (new_tags);
+ g_free (encoder);
+ gst_buffer_unref (buffer);
+
+ return GST_VORBIS_PARSE_CLASS (parent_class)->parse_packet (parse, new_buf);
+}
diff --git a/ext/vorbis/gstvorbistag.h b/ext/vorbis/gstvorbistag.h
new file mode 100644
index 0000000..9a44300
--- /dev/null
+++ b/ext/vorbis/gstvorbistag.h
@@ -0,0 +1,63 @@
+/* -*- c-basic-offset: 2 -*-
+ * GStreamer
+ * Copyright (C) <2006> James Livingston <doclivingston@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 __GST_VORBIS_TAG_H__
+#define __GST_VORBIS_TAG_H__
+
+#include "gstvorbisparse.h"
+
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_VORBIS_TAG \
+ (gst_vorbis_tag_get_type())
+#define GST_VORBIS_TAG(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VORBIS_TAG,GstVorbisTag))
+#define GST_VORBIS_TAG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VORBIS_TAG,GstVorbisTagClass))
+#define GST_IS_VORBIS_TAG(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VORBIS_TAG))
+#define GST_IS_VORBIS_TAG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VORBIS_TAG))
+
+
+typedef struct _GstVorbisTag GstVorbisTag;
+typedef struct _GstVorbisTagClass GstVorbisTagClass;
+
+/**
+ * GstVorbisTag:
+ *
+ * Opaque data structure.
+ */
+struct _GstVorbisTag {
+ GstVorbisParse parse;
+};
+
+struct _GstVorbisTagClass {
+ GstVorbisParseClass parent_class;
+};
+
+GType gst_vorbis_tag_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_VORBIS_TAG_H__ */
diff --git a/gst-libs/Makefile.am b/gst-libs/Makefile.am
new file mode 100644
index 0000000..062cb55
--- /dev/null
+++ b/gst-libs/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = gst
diff --git a/gst-libs/Makefile.in b/gst-libs/Makefile.in
new file mode 100644
index 0000000..a1f06a3
--- /dev/null
+++ b/gst-libs/Makefile.in
@@ -0,0 +1,759 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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
+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 gst-libs/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
new file mode 100644
index 0000000..a3f13f1
--- /dev/null
+++ b/gst-libs/gst/Makefile.am
@@ -0,0 +1,43 @@
+# The interfaces directory has to be built before the others,
+# otherwise some generated header files will be missing for the
+# plugins in the other directories.
+# Also, the tag directory has to be built before the cdda directory.
+SUBDIRS = \
+ interfaces \
+ tag \
+ cdda \
+ fft \
+ netbuffer \
+ rtp \
+ sdp \
+ rtsp \
+ video \
+ audio \
+ pbutils \
+ riff \
+ app
+
+noinst_HEADERS = gettext.h gst-i18n-plugin.h
+
+# dependencies:
+audio: interfaces
+
+cdda: tag
+
+riff: tag audio
+
+rtsp: sdp
+
+pbutils: video audio
+
+INDEPENDENT_SUBDIRS = \
+ interfaces tag audio fft netbuffer rtp sdp video app
+
+.PHONY: independent-subdirs $(INDEPENDENT_SUBDIRS)
+
+independent-subdirs: $(INDEPENDENT_SUBDIRS)
+
+$(INDEPENDENT_SUBDIRS):
+ $(MAKE) -C $@
+
+all-recursive: independent-subdirs
diff --git a/gst-libs/gst/Makefile.in b/gst-libs/gst/Makefile.in
new file mode 100644
index 0000000..0df2772
--- /dev/null
+++ b/gst-libs/gst/Makefile.in
@@ -0,0 +1,805 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# The interfaces directory has to be built before the others,
+# otherwise some generated header files will be missing for the
+# plugins in the other directories.
+# Also, the tag directory has to be built before the cdda directory.
+SUBDIRS = \
+ interfaces \
+ tag \
+ cdda \
+ fft \
+ netbuffer \
+ rtp \
+ sdp \
+ rtsp \
+ video \
+ audio \
+ pbutils \
+ riff \
+ app
+
+noinst_HEADERS = gettext.h gst-i18n-plugin.h
+INDEPENDENT_SUBDIRS = \
+ interfaces tag audio fft netbuffer rtp sdp video app
+
+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 gst-libs/gst/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/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_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 $(HEADERS)
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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
+
+
+# dependencies:
+audio: interfaces
+
+cdda: tag
+
+riff: tag audio
+
+rtsp: sdp
+
+pbutils: video audio
+
+.PHONY: independent-subdirs $(INDEPENDENT_SUBDIRS)
+
+independent-subdirs: $(INDEPENDENT_SUBDIRS)
+
+$(INDEPENDENT_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-libs/gst/app/Makefile.am b/gst-libs/gst/app/Makefile.am
new file mode 100644
index 0000000..85c72fb
--- /dev/null
+++ b/gst-libs/gst/app/Makefile.am
@@ -0,0 +1,99 @@
+lib_LTLIBRARIES = libgstapp-@GST_MAJORMINOR@.la
+
+glib_enum_define = GST_APP
+glib_gen_prefix = __gst_app
+glib_gen_basename = gstapp
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+built_sources = gstapp-marshal.c
+built_headers = gstapp-marshal.h
+
+BUILT_SOURCES = $(built_sources) $(built_headers)
+
+nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES = \
+ $(built_sources)
+
+libgstapp_@GST_MAJORMINOR@_la_SOURCES = gstappsrc.c gstappsink.c
+libgstapp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstapp_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS)
+libgstapp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS = --tag=disable-static
+
+libgstapp_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/app
+libgstapp_@GST_MAJORMINOR@include_HEADERS = \
+ gstappsrc.h \
+ gstappsink.h
+
+CLEANFILES = $(BUILT_SOURCES)
+
+EXTRA_DIST = gstapp-marshal.list
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstApp-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstapp_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstapp_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/app/%',$(libgstapp_@GST_MAJORMINOR@include_HEADERS))
+
+GstApp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstapp-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstApp \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_builddir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstapp-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-app-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstapp -:SHARED libgstapp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstapp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstapp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstapp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/app \
+ -:HEADERS $(libgstapp_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/app/Makefile.in b/gst-libs/gst/app/Makefile.in
new file mode 100644
index 0000000..293b3bf
--- /dev/null
+++ b/gst-libs/gst/app/Makefile.in
@@ -0,0 +1,984 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstapp_@GST_MAJORMINOR@include_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/gst-glib-gen.mak
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/app
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstapp_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libgstapp_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo \
+ libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo
+am__objects_1 = libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo
+nodist_libgstapp_@GST_MAJORMINOR@_la_OBJECTS = $(am__objects_1)
+libgstapp_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstapp_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstapp_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstapp_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) \
+ $(CFLAGS) $(libgstapp_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstapp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstapp_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstapp_@GST_MAJORMINOR@include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstapp-@GST_MAJORMINOR@.la
+glib_enum_define = GST_APP
+glib_gen_prefix = __gst_app
+glib_gen_basename = gstapp
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+built_sources = gstapp-marshal.c
+built_headers = gstapp-marshal.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES = \
+ $(built_sources)
+
+libgstapp_@GST_MAJORMINOR@_la_SOURCES = gstappsrc.c gstappsink.c
+libgstapp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+
+libgstapp_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS)
+libgstapp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS = --tag=disable-static
+libgstapp_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/app
+libgstapp_@GST_MAJORMINOR@include_HEADERS = \
+ gstappsrc.h \
+ gstappsink.h
+
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+EXTRA_DIST = gstapp-marshal.list
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstApp-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstapp_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstapp_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/app/%',$(libgstapp_@GST_MAJORMINOR@include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/app/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/app/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstapp-@GST_MAJORMINOR@.la: $(libgstapp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstapp_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstapp_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstapp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstapp_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo: gstappsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo -MD -MP -MF $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsrc.Tpo -c -o libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo `test -f 'gstappsrc.c' || echo '$(srcdir)/'`gstappsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsrc.Tpo $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstappsrc.c' object='libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstapp_@GST_MAJORMINOR@_la-gstappsrc.lo `test -f 'gstappsrc.c' || echo '$(srcdir)/'`gstappsrc.c
+
+libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo: gstappsink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo -MD -MP -MF $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsink.Tpo -c -o libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo `test -f 'gstappsink.c' || echo '$(srcdir)/'`gstappsink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsink.Tpo $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstappsink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstappsink.c' object='libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstapp_@GST_MAJORMINOR@_la-gstappsink.lo `test -f 'gstappsink.c' || echo '$(srcdir)/'`gstappsink.c
+
+libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo: gstapp-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo -MD -MP -MF $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.Tpo -c -o libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo `test -f 'gstapp-marshal.c' || echo '$(srcdir)/'`gstapp-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.Tpo $(DEPDIR)/libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstapp-marshal.c' object='libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_@GST_MAJORMINOR@_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstapp_@GST_MAJORMINOR@_la-gstapp-marshal.lo `test -f 'gstapp-marshal.c' || echo '$(srcdir)/'`gstapp-marshal.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstapp_@GST_MAJORMINOR@includeHEADERS: $(libgstapp_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstapp_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstapp_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstapp_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstapp_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstapp_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstapp_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstapp_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstapp_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstapp_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstapp_@GST_MAJORMINOR@includeHEADERS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstapp_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstApp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstapp-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstApp \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstapp-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstBase-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-app-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstapp -:SHARED libgstapp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstapp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstapp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstapp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstapp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/app \
+ -:HEADERS $(libgstapp_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/app/gstapp-marshal.list b/gst-libs/gst/app/gstapp-marshal.list
new file mode 100644
index 0000000..ad35948
--- /dev/null
+++ b/gst-libs/gst/app/gstapp-marshal.list
@@ -0,0 +1,5 @@
+BOOLEAN:UINT64
+ENUM:OBJECT
+ENUM:VOID
+VOID:UINT
+
diff --git a/gst-libs/gst/app/gstappsink.c b/gst-libs/gst/app/gstappsink.c
new file mode 100644
index 0000000..4f1ee68
--- /dev/null
+++ b/gst-libs/gst/app/gstappsink.c
@@ -0,0 +1,1403 @@
+/* GStreamer
+ * Copyright (C) 2007 David Schleef <ds@schleef.org>
+ * (C) 2008 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.
+ */
+/**
+ * SECTION:gstappsink
+ * @short_description: Easy way for applications to extract buffers from a
+ * pipeline
+ * @see_also: #GstBaseSink, appsrc
+ *
+ * Appsink is a sink plugin that supports many different methods for making
+ * the application get a handle on the GStreamer data in a pipeline. Unlike
+ * most GStreamer elements, Appsink provides external API functions.
+ *
+ * appsink can be used by linking to the gstappsink.h header file to access the
+ * methods or by using the appsink action signals and properties.
+ *
+ * The normal way of retrieving buffers from appsink is by using the
+ * gst_app_sink_pull_buffer() and gst_app_sink_pull_preroll() methods.
+ * These methods block until a buffer becomes available in the sink or when the
+ * sink is shut down or reaches EOS.
+ *
+ * Appsink will internally use a queue to collect buffers from the streaming
+ * thread. If the application is not pulling buffers fast enough, this queue
+ * will consume a lot of memory over time. The "max-buffers" property can be
+ * used to limit the queue size. The "drop" property controls whether the
+ * streaming thread blocks or if older buffers are dropped when the maximum
+ * queue size is reached. Note that blocking the streaming thread can negatively
+ * affect real-time performance and should be avoided.
+ *
+ * If a blocking behaviour is not desirable, setting the "emit-signals" property
+ * to %TRUE will make appsink emit the "new-buffer" and "new-preroll" signals
+ * when a buffer can be pulled without blocking.
+ *
+ * The "caps" property on appsink can be used to control the formats that
+ * appsink can receive. This property can contain non-fixed caps, the format of
+ * the pulled buffers can be obtained by getting the buffer caps.
+ *
+ * If one of the pull-preroll or pull-buffer methods return %NULL, the appsink
+ * is stopped or in the EOS state. You can check for the EOS state with the
+ * "eos" property or with the gst_app_sink_is_eos() method.
+ *
+ * The eos signal can also be used to be informed when the EOS state is reached
+ * to avoid polling.
+ *
+ * Last reviewed on 2008-12-17 (0.10.22)
+ *
+ * Since: 0.10.22
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+#include <gst/gstbuffer.h>
+#include <gst/gstbufferlist.h>
+
+#include <string.h>
+
+#include "gstappsink.h"
+
+struct _GstAppSinkPrivate
+{
+ GstCaps *caps;
+ gboolean emit_signals;
+ guint max_buffers;
+ gboolean drop;
+
+ GCond *cond;
+ GMutex *mutex;
+ GQueue *queue;
+ GstBuffer *preroll;
+ gboolean flushing;
+ gboolean unlock;
+ gboolean started;
+ gboolean is_eos;
+
+ GstAppSinkCallbacks callbacks;
+ gpointer user_data;
+ GDestroyNotify notify;
+
+ gboolean buffer_lists_supported;
+};
+
+GST_DEBUG_CATEGORY_STATIC (app_sink_debug);
+#define GST_CAT_DEFAULT app_sink_debug
+
+enum
+{
+ /* signals */
+ SIGNAL_EOS,
+ SIGNAL_NEW_PREROLL,
+ SIGNAL_NEW_BUFFER,
+ SIGNAL_NEW_BUFFER_LIST,
+
+ /* actions */
+ SIGNAL_PULL_PREROLL,
+ SIGNAL_PULL_BUFFER,
+ SIGNAL_PULL_BUFFER_LIST,
+
+ LAST_SIGNAL
+};
+
+#define DEFAULT_PROP_EOS TRUE
+#define DEFAULT_PROP_EMIT_SIGNALS FALSE
+#define DEFAULT_PROP_MAX_BUFFERS 0
+#define DEFAULT_PROP_DROP FALSE
+
+enum
+{
+ PROP_0,
+ PROP_CAPS,
+ PROP_EOS,
+ PROP_EMIT_SIGNALS,
+ PROP_MAX_BUFFERS,
+ PROP_DROP,
+ PROP_LAST
+};
+
+static GstStaticPadTemplate gst_app_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static void gst_app_sink_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+
+static void gst_app_sink_dispose (GObject * object);
+static void gst_app_sink_finalize (GObject * object);
+
+static void gst_app_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_app_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_app_sink_unlock_start (GstBaseSink * bsink);
+static gboolean gst_app_sink_unlock_stop (GstBaseSink * bsink);
+static gboolean gst_app_sink_start (GstBaseSink * psink);
+static gboolean gst_app_sink_stop (GstBaseSink * psink);
+static gboolean gst_app_sink_event (GstBaseSink * sink, GstEvent * event);
+static GstFlowReturn gst_app_sink_preroll (GstBaseSink * psink,
+ GstBuffer * buffer);
+static GstFlowReturn gst_app_sink_render_common (GstBaseSink * psink,
+ GstMiniObject * data, gboolean is_list);
+static GstFlowReturn gst_app_sink_render (GstBaseSink * psink,
+ GstBuffer * buffer);
+static GstFlowReturn gst_app_sink_render_list (GstBaseSink * psink,
+ GstBufferList * list);
+static GstCaps *gst_app_sink_getcaps (GstBaseSink * psink, GstCaps * filter);
+static GstMiniObject *gst_app_sink_pull_object (GstAppSink * appsink);
+
+static guint gst_app_sink_signals[LAST_SIGNAL] = { 0 };
+
+#define gst_app_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAppSink, gst_app_sink, GST_TYPE_BASE_SINK,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER,
+ gst_app_sink_uri_handler_init));
+
+/* Can't use glib-genmarshal for this, as it doesn't know how to handle
+ * GstMiniObject-based types, which are a new fundamental type */
+static void
+gst_app_marshal_BUFFER__VOID (GClosure * closure,
+ GValue * return_value,
+ guint n_param_values,
+ const GValue * param_values,
+ gpointer invocation_hint, gpointer marshal_data)
+{
+ typedef GstBuffer *(*GMarshalFunc_BUFFER__VOID) (gpointer data1,
+ gpointer data2);
+ register GMarshalFunc_BUFFER__VOID callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+ GstBuffer *v_return;
+
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 1);
+
+ 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_BUFFER__VOID) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (data1, data2);
+
+ gst_value_take_buffer (return_value, v_return);
+}
+
+static void
+gst_app_sink_class_init (GstAppSinkClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+ GstBaseSinkClass *basesink_class = (GstBaseSinkClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (app_sink_debug, "appsink", 0, "appsink element");
+
+ gobject_class->dispose = gst_app_sink_dispose;
+ gobject_class->finalize = gst_app_sink_finalize;
+
+ gobject_class->set_property = gst_app_sink_set_property;
+ gobject_class->get_property = gst_app_sink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_CAPS,
+ g_param_spec_boxed ("caps", "Caps",
+ "The allowed caps for the sink pad", GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_EOS,
+ g_param_spec_boolean ("eos", "EOS",
+ "Check if the sink is EOS or not started", DEFAULT_PROP_EOS,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_EMIT_SIGNALS,
+ g_param_spec_boolean ("emit-signals", "Emit signals",
+ "Emit new-preroll, new-buffer and new-buffer-list signals",
+ DEFAULT_PROP_EMIT_SIGNALS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_BUFFERS,
+ g_param_spec_uint ("max-buffers", "Max Buffers",
+ "The maximum number of buffers to queue internally (0 = unlimited)",
+ 0, G_MAXUINT, DEFAULT_PROP_MAX_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_DROP,
+ g_param_spec_boolean ("drop", "Drop",
+ "Drop old buffers when the buffer queue is filled", DEFAULT_PROP_DROP,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAppSink::eos:
+ * @appsink: the appsink element that emited the signal
+ *
+ * Signal that the end-of-stream has been reached. This signal is emited from
+ * the steaming thread.
+ */
+ gst_app_sink_signals[SIGNAL_EOS] =
+ g_signal_new ("eos", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSinkClass, eos),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ * GstAppSink::new-preroll:
+ * @appsink: the appsink element that emited the signal
+ *
+ * Signal that a new preroll buffer is available.
+ *
+ * This signal is emited from the steaming thread and only when the
+ * "emit-signals" property is %TRUE.
+ *
+ * The new preroll buffer can be retrieved with the "pull-preroll" action
+ * signal or gst_app_sink_pull_preroll() either from this signal callback
+ * or from any other thread.
+ *
+ * Note that this signal is only emited when the "emit-signals" property is
+ * set to %TRUE, which it is not by default for performance reasons.
+ */
+ gst_app_sink_signals[SIGNAL_NEW_PREROLL] =
+ g_signal_new ("new-preroll", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSinkClass, new_preroll),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ * GstAppSink::new-buffer:
+ * @appsink: the appsink element that emited the signal
+ *
+ * Signal that a new buffer is available.
+ *
+ * This signal is emited from the steaming thread and only when the
+ * "emit-signals" property is %TRUE.
+ *
+ * The new buffer can be retrieved with the "pull-buffer" action
+ * signal or gst_app_sink_pull_buffer() either from this signal callback
+ * or from any other thread.
+ *
+ * Note that this signal is only emited when the "emit-signals" property is
+ * set to %TRUE, which it is not by default for performance reasons.
+ */
+ gst_app_sink_signals[SIGNAL_NEW_BUFFER] =
+ g_signal_new ("new-buffer", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSinkClass, new_buffer),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ * GstAppSink::new-buffer-list:
+ * @appsink: the appsink element that emited the signal
+ *
+ * Signal that a new bufferlist is available.
+ *
+ * This signal is emited from the steaming thread and only when the
+ * "emit-signals" property is %TRUE.
+ *
+ * The new buffer can be retrieved with the "pull-buffer-list" action
+ * signal or gst_app_sink_pull_buffer_list() either from this signal callback
+ * or from any other thread.
+ *
+ * Note that this signal is only emited when the "emit-signals" property is
+ * set to %TRUE, which it is not by default for performance reasons.
+ */
+ gst_app_sink_signals[SIGNAL_NEW_BUFFER_LIST] =
+ g_signal_new ("new-buffer-list", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAppSinkClass, new_buffer_list),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstAppSink::pull-preroll:
+ * @appsink: the appsink element to emit this signal on
+ *
+ * Get the last preroll buffer in @appsink. This was the buffer that caused the
+ * appsink to preroll in the PAUSED state. This buffer can be pulled many times
+ * and remains available to the application even after EOS.
+ *
+ * This function is typically used when dealing with a pipeline in the PAUSED
+ * state. Calling this function after doing a seek will give the buffer right
+ * after the seek position.
+ *
+ * Note that the preroll buffer will also be returned as the first buffer
+ * when calling gst_app_sink_pull_buffer() or the "pull-buffer" action signal.
+ *
+ * If an EOS event was received before any buffers, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * This function blocks until a preroll buffer or EOS is received or the appsink
+ * element is set to the READY/NULL state.
+ *
+ * Returns: a #GstBuffer or NULL when the appsink is stopped or EOS.
+ */
+ gst_app_sink_signals[SIGNAL_PULL_PREROLL] =
+ g_signal_new ("pull-preroll", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstAppSinkClass,
+ pull_preroll), NULL, NULL, gst_app_marshal_BUFFER__VOID,
+ GST_TYPE_BUFFER, 0, G_TYPE_NONE);
+ /**
+ * GstAppSink::pull-buffer:
+ * @appsink: the appsink element to emit this signal on
+ *
+ * This function blocks until a buffer or EOS becomes available or the appsink
+ * element is set to the READY/NULL state.
+ *
+ * This function will only return buffers when the appsink is in the PLAYING
+ * state. All rendered buffers will be put in a queue so that the application
+ * can pull buffers at its own rate.
+ *
+ * Note that when the application does not pull buffers fast enough, the
+ * queued buffers could consume a lot of memory, especially when dealing with
+ * raw video frames. It's possible to control the behaviour of the queue with
+ * the "drop" and "max-buffers" properties.
+ *
+ * If an EOS event was received before any buffers, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * Returns: a #GstBuffer or NULL when the appsink is stopped or EOS.
+ */
+ gst_app_sink_signals[SIGNAL_PULL_BUFFER] =
+ g_signal_new ("pull-buffer", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstAppSinkClass,
+ pull_buffer), NULL, NULL, gst_app_marshal_BUFFER__VOID,
+ GST_TYPE_BUFFER, 0, G_TYPE_NONE);
+ /**
+ * GstAppSink::pull-buffer-list:
+ * @appsink: the appsink element to emit this signal on
+ *
+ * This function blocks until a buffer list or EOS becomes available or the appsink
+ * element is set to the READY/NULL state.
+ *
+ * This function will only return bufferlists when the appsink is in the PLAYING
+ * state. All rendered bufferlists will be put in a queue so that the application
+ * can pull bufferlists at its own rate.
+ *
+ * Note that when the application does not pull bufferlists fast enough, the
+ * queued bufferlists could consume a lot of memory, especially when dealing with
+ * raw video frames. It's possible to control the behaviour of the queue with
+ * the "drop" and "max-buffers" properties.
+ *
+ * If an EOS event was received before any buffers, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * Returns: a #GstBufferList or NULL when the appsink is stopped or EOS.
+ */
+ gst_app_sink_signals[SIGNAL_PULL_BUFFER_LIST] =
+ g_signal_new ("pull-buffer-list", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstAppSinkClass,
+ pull_buffer_list), NULL, NULL, gst_app_marshal_BUFFER__VOID,
+ GST_TYPE_BUFFER_LIST, 0, G_TYPE_NONE);
+
+ gst_element_class_set_details_simple (element_class, "AppSink",
+ "Generic/Sink", "Allow the application to get access to raw buffer",
+ "David Schleef <ds@schleef.org>, Wim Taymans <wim.taymans@gmail.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_app_sink_template));
+
+ basesink_class->unlock = gst_app_sink_unlock_start;
+ basesink_class->unlock_stop = gst_app_sink_unlock_stop;
+ basesink_class->start = gst_app_sink_start;
+ basesink_class->stop = gst_app_sink_stop;
+ basesink_class->event = gst_app_sink_event;
+ basesink_class->preroll = gst_app_sink_preroll;
+ basesink_class->render = gst_app_sink_render;
+ basesink_class->render_list = gst_app_sink_render_list;
+ basesink_class->get_caps = gst_app_sink_getcaps;
+
+ klass->pull_preroll = gst_app_sink_pull_preroll;
+ klass->pull_buffer = gst_app_sink_pull_buffer;
+ klass->pull_buffer_list = gst_app_sink_pull_buffer_list;
+
+ g_type_class_add_private (klass, sizeof (GstAppSinkPrivate));
+}
+
+static void
+gst_app_sink_init (GstAppSink * appsink)
+{
+ GstAppSinkPrivate *priv;
+
+ priv = appsink->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (appsink, GST_TYPE_APP_SINK,
+ GstAppSinkPrivate);
+
+ priv->mutex = g_mutex_new ();
+ priv->cond = g_cond_new ();
+ priv->queue = g_queue_new ();
+
+ priv->emit_signals = DEFAULT_PROP_EMIT_SIGNALS;
+ priv->max_buffers = DEFAULT_PROP_MAX_BUFFERS;
+ priv->drop = DEFAULT_PROP_DROP;
+}
+
+static void
+gst_app_sink_dispose (GObject * obj)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (obj);
+ GstAppSinkPrivate *priv = appsink->priv;
+ GstMiniObject *queue_obj;
+
+ GST_OBJECT_LOCK (appsink);
+ if (priv->caps) {
+ gst_caps_unref (priv->caps);
+ priv->caps = NULL;
+ }
+ if (priv->notify) {
+ priv->notify (priv->user_data);
+ }
+ priv->user_data = NULL;
+ priv->notify = NULL;
+
+ GST_OBJECT_UNLOCK (appsink);
+
+ g_mutex_lock (priv->mutex);
+ if (priv->preroll) {
+ gst_buffer_unref (priv->preroll);
+ priv->preroll = NULL;
+ }
+ while ((queue_obj = g_queue_pop_head (priv->queue)))
+ gst_mini_object_unref (queue_obj);
+ g_mutex_unlock (priv->mutex);
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_app_sink_finalize (GObject * obj)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (obj);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ g_mutex_free (priv->mutex);
+ g_cond_free (priv->cond);
+ g_queue_free (priv->queue);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_app_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (object);
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ gst_app_sink_set_caps (appsink, gst_value_get_caps (value));
+ break;
+ case PROP_EMIT_SIGNALS:
+ gst_app_sink_set_emit_signals (appsink, g_value_get_boolean (value));
+ break;
+ case PROP_MAX_BUFFERS:
+ gst_app_sink_set_max_buffers (appsink, g_value_get_uint (value));
+ break;
+ case PROP_DROP:
+ gst_app_sink_set_drop (appsink, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_app_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (object);
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ {
+ GstCaps *caps;
+
+ caps = gst_app_sink_get_caps (appsink);
+ gst_value_set_caps (value, caps);
+ if (caps)
+ gst_caps_unref (caps);
+ break;
+ }
+ case PROP_EOS:
+ g_value_set_boolean (value, gst_app_sink_is_eos (appsink));
+ break;
+ case PROP_EMIT_SIGNALS:
+ g_value_set_boolean (value, gst_app_sink_get_emit_signals (appsink));
+ break;
+ case PROP_MAX_BUFFERS:
+ g_value_set_uint (value, gst_app_sink_get_max_buffers (appsink));
+ break;
+ case PROP_DROP:
+ g_value_set_boolean (value, gst_app_sink_get_drop (appsink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_app_sink_unlock_start (GstBaseSink * bsink)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (bsink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "unlock start");
+ priv->unlock = TRUE;
+ g_cond_signal (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_sink_unlock_stop (GstBaseSink * bsink)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (bsink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "unlock stop");
+ priv->unlock = FALSE;
+ g_cond_signal (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static void
+gst_app_sink_flush_unlocked (GstAppSink * appsink)
+{
+ GstMiniObject *obj;
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ GST_DEBUG_OBJECT (appsink, "flush stop appsink");
+ priv->is_eos = FALSE;
+ gst_buffer_replace (&priv->preroll, NULL);
+ while ((obj = g_queue_pop_head (priv->queue)))
+ gst_mini_object_unref (obj);
+ g_cond_signal (priv->cond);
+}
+
+#define NEW_BUFFER_LIST_SIGID \
+ gst_app_sink_signals[SIGNAL_NEW_BUFFER_LIST]
+
+static gboolean
+gst_app_sink_check_buffer_lists_support (GstAppSink * appsink)
+{
+ gboolean ret;
+
+ ret = (appsink->priv->callbacks.new_buffer_list != NULL) ||
+ g_signal_has_handler_pending (appsink, NEW_BUFFER_LIST_SIGID, 0, FALSE);
+
+ GST_INFO_OBJECT (appsink, "application supports buffer lists: %d", ret);
+ return ret;
+}
+
+static gboolean
+gst_app_sink_start (GstBaseSink * psink)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (psink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "starting");
+ priv->flushing = FALSE;
+ priv->started = TRUE;
+ priv->buffer_lists_supported =
+ gst_app_sink_check_buffer_lists_support (appsink);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_sink_stop (GstBaseSink * psink)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (psink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "stopping");
+ priv->flushing = TRUE;
+ priv->started = FALSE;
+ gst_app_sink_flush_unlocked (appsink);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_sink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstAppSink *appsink = GST_APP_SINK_CAST (sink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ switch (event->type) {
+ case GST_EVENT_EOS:
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "receiving EOS");
+ priv->is_eos = TRUE;
+ g_cond_signal (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ /* emit EOS now */
+ if (priv->callbacks.eos)
+ priv->callbacks.eos (appsink, priv->user_data);
+ else
+ g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_EOS], 0);
+
+ break;
+ case GST_EVENT_FLUSH_START:
+ /* we don't have to do anything here, the base class will call unlock
+ * which will make sure we exit the _render method */
+ GST_DEBUG_OBJECT (appsink, "received FLUSH_START");
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsink, "received FLUSH_STOP");
+ gst_app_sink_flush_unlocked (appsink);
+ g_mutex_unlock (priv->mutex);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer)
+{
+ GstFlowReturn res = GST_FLOW_OK;
+ GstAppSink *appsink = GST_APP_SINK_CAST (psink);
+ GstAppSinkPrivate *priv = appsink->priv;
+ gboolean emit;
+
+ g_mutex_lock (priv->mutex);
+ if (priv->flushing)
+ goto flushing;
+
+ GST_DEBUG_OBJECT (appsink, "setting preroll buffer %p", buffer);
+ gst_buffer_replace (&priv->preroll, buffer);
+
+ g_cond_signal (priv->cond);
+ emit = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ if (priv->callbacks.new_preroll)
+ res = priv->callbacks.new_preroll (appsink, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_PREROLL], 0);
+
+ return res;
+
+flushing:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are flushing");
+ g_mutex_unlock (priv->mutex);
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+static GstFlowReturn
+gst_app_sink_render_common (GstBaseSink * psink, GstMiniObject * data,
+ gboolean is_list)
+{
+ GstFlowReturn ret;
+ GstAppSink *appsink = GST_APP_SINK_CAST (psink);
+ GstAppSinkPrivate *priv = appsink->priv;
+ gboolean emit;
+
+restart:
+ g_mutex_lock (priv->mutex);
+ if (priv->flushing)
+ goto flushing;
+
+ GST_DEBUG_OBJECT (appsink, "pushing render buffer%s %p on queue (%d)",
+ is_list ? " list" : "", data, priv->queue->length);
+
+ while (priv->max_buffers > 0 && priv->queue->length >= priv->max_buffers) {
+ if (priv->drop) {
+ GstMiniObject *obj;
+
+ /* we need to drop the oldest buffer/list and try again */
+ obj = g_queue_pop_head (priv->queue);
+ GST_DEBUG_OBJECT (appsink, "dropping old buffer/list %p", obj);
+ gst_mini_object_unref (obj);
+ } else {
+ GST_DEBUG_OBJECT (appsink, "waiting for free space, length %d >= %d",
+ priv->queue->length, priv->max_buffers);
+
+ if (priv->unlock) {
+ /* we are asked to unlock, call the wait_preroll method */
+ g_mutex_unlock (priv->mutex);
+ if ((ret = gst_base_sink_wait_preroll (psink)) != GST_FLOW_OK)
+ goto stopping;
+
+ /* we are allowed to continue now */
+ goto restart;
+ }
+
+ /* wait for a buffer to be removed or flush */
+ g_cond_wait (priv->cond, priv->mutex);
+ if (priv->flushing)
+ goto flushing;
+ }
+ }
+ /* we need to ref the buffer when pushing it in the queue */
+ g_queue_push_tail (priv->queue, gst_mini_object_ref (data));
+ g_cond_signal (priv->cond);
+ emit = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ if (is_list) {
+ if (priv->callbacks.new_buffer_list)
+ priv->callbacks.new_buffer_list (appsink, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER_LIST], 0);
+ } else {
+ if (priv->callbacks.new_buffer)
+ priv->callbacks.new_buffer (appsink, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER], 0);
+ }
+ return GST_FLOW_OK;
+
+flushing:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are flushing");
+ g_mutex_unlock (priv->mutex);
+ return GST_FLOW_WRONG_STATE;
+ }
+stopping:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are stopping");
+ return ret;
+ }
+}
+
+static GstFlowReturn
+gst_app_sink_render (GstBaseSink * psink, GstBuffer * buffer)
+{
+ return gst_app_sink_render_common (psink, GST_MINI_OBJECT_CAST (buffer),
+ FALSE);
+}
+
+static GstFlowReturn
+gst_app_sink_render_list (GstBaseSink * sink, GstBufferList * list)
+{
+ GstFlowReturn flow;
+ GstAppSink *appsink;
+ GstBuffer *buffer;
+ guint i, len;
+
+ appsink = GST_APP_SINK_CAST (sink);
+
+ if (appsink->priv->buffer_lists_supported)
+ return gst_app_sink_render_common (sink, GST_MINI_OBJECT_CAST (list), TRUE);
+
+ /* The application doesn't support buffer lists, extract individual buffers
+ * then and push them one-by-one */
+ GST_INFO_OBJECT (sink, "chaining each group in list as a merged buffer");
+
+ len = gst_buffer_list_len (list);
+
+ flow = GST_FLOW_OK;
+ for (i = 0; i < len; i++) {
+ buffer = gst_buffer_list_get (list, i);
+ flow = gst_app_sink_render (sink, buffer);
+ if (flow != GST_FLOW_OK)
+ break;
+ }
+
+ return flow;
+}
+
+static GstCaps *
+gst_app_sink_getcaps (GstBaseSink * psink, GstCaps * filter)
+{
+ GstCaps *caps;
+ GstAppSink *appsink = GST_APP_SINK_CAST (psink);
+ GstAppSinkPrivate *priv = appsink->priv;
+
+ GST_OBJECT_LOCK (appsink);
+ if ((caps = priv->caps)) {
+ if (filter)
+ caps = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ else
+ gst_caps_ref (caps);
+ }
+ GST_DEBUG_OBJECT (appsink, "got caps %" GST_PTR_FORMAT, caps);
+ GST_OBJECT_UNLOCK (appsink);
+
+ return caps;
+}
+
+static GstMiniObject *
+gst_app_sink_pull_object (GstAppSink * appsink)
+{
+ GstMiniObject *obj = NULL;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+
+ while (TRUE) {
+ GST_DEBUG_OBJECT (appsink, "trying to grab a buffer/list");
+ if (!priv->started)
+ goto not_started;
+
+ if (!g_queue_is_empty (priv->queue))
+ break;
+
+ if (priv->is_eos)
+ goto eos;
+
+ /* nothing to return, wait */
+ GST_DEBUG_OBJECT (appsink, "waiting for a buffer/list");
+ g_cond_wait (priv->cond, priv->mutex);
+ }
+ obj = g_queue_pop_head (priv->queue);
+ GST_DEBUG_OBJECT (appsink, "we have a buffer/list %p", obj);
+ g_cond_signal (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return obj;
+
+ /* special conditions */
+eos:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL");
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+not_started:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL");
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+}
+
+/* external API */
+
+/**
+ * gst_app_sink_set_caps:
+ * @appsink: a #GstAppSink
+ * @caps: caps to set
+ *
+ * Set the capabilities on the appsink element. This function takes
+ * a copy of the caps structure. After calling this method, the sink will only
+ * accept caps that match @caps. If @caps is non-fixed, you must check the caps
+ * on the buffers to get the actual used caps.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_sink_set_caps (GstAppSink * appsink, const GstCaps * caps)
+{
+ GstCaps *old;
+ GstAppSinkPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SINK (appsink));
+
+ priv = appsink->priv;
+
+ GST_OBJECT_LOCK (appsink);
+ GST_DEBUG_OBJECT (appsink, "setting caps to %" GST_PTR_FORMAT, caps);
+ if ((old = priv->caps) != caps) {
+ if (caps)
+ priv->caps = gst_caps_copy (caps);
+ else
+ priv->caps = NULL;
+ if (old)
+ gst_caps_unref (old);
+ }
+ GST_OBJECT_UNLOCK (appsink);
+}
+
+/**
+ * gst_app_sink_get_caps:
+ * @appsink: a #GstAppSink
+ *
+ * Get the configured caps on @appsink.
+ *
+ * Returns: the #GstCaps accepted by the sink. gst_caps_unref() after usage.
+ *
+ * Since: 0.10.22
+ */
+GstCaps *
+gst_app_sink_get_caps (GstAppSink * appsink)
+{
+ GstCaps *caps;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
+
+ priv = appsink->priv;
+
+ GST_OBJECT_LOCK (appsink);
+ if ((caps = priv->caps))
+ gst_caps_ref (caps);
+ GST_DEBUG_OBJECT (appsink, "getting caps of %" GST_PTR_FORMAT, caps);
+ GST_OBJECT_UNLOCK (appsink);
+
+ return caps;
+}
+
+/**
+ * gst_app_sink_is_eos:
+ * @appsink: a #GstAppSink
+ *
+ * Check if @appsink is EOS, which is when no more buffers can be pulled because
+ * an EOS event was received.
+ *
+ * This function also returns %TRUE when the appsink is not in the PAUSED or
+ * PLAYING state.
+ *
+ * Returns: %TRUE if no more buffers can be pulled and the appsink is EOS.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_app_sink_is_eos (GstAppSink * appsink)
+{
+ gboolean ret;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ if (!priv->started)
+ goto not_started;
+
+ if (priv->is_eos && g_queue_is_empty (priv->queue)) {
+ GST_DEBUG_OBJECT (appsink, "we are EOS and the queue is empty");
+ ret = TRUE;
+ } else {
+ GST_DEBUG_OBJECT (appsink, "we are not yet EOS");
+ ret = FALSE;
+ }
+ g_mutex_unlock (priv->mutex);
+
+ return ret;
+
+not_started:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are stopped, return TRUE");
+ g_mutex_unlock (priv->mutex);
+ return TRUE;
+ }
+}
+
+/**
+ * gst_app_sink_set_emit_signals:
+ * @appsink: a #GstAppSink
+ * @emit: the new state
+ *
+ * Make appsink emit the "new-preroll" and "new-buffer" signals. This option is
+ * by default disabled because signal emission is expensive and unneeded when
+ * the application prefers to operate in pull mode.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_sink_set_emit_signals (GstAppSink * appsink, gboolean emit)
+{
+ GstAppSinkPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SINK (appsink));
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ priv->emit_signals = emit;
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_sink_get_emit_signals:
+ * @appsink: a #GstAppSink
+ *
+ * Check if appsink will emit the "new-preroll" and "new-buffer" signals.
+ *
+ * Returns: %TRUE if @appsink is emiting the "new-preroll" and "new-buffer"
+ * signals.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_app_sink_get_emit_signals (GstAppSink * appsink)
+{
+ gboolean result;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ result = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ return result;
+}
+
+/**
+ * gst_app_sink_set_max_buffers:
+ * @appsink: a #GstAppSink
+ * @max: the maximum number of buffers to queue
+ *
+ * Set the maximum amount of buffers that can be queued in @appsink. After this
+ * amount of buffers are queued in appsink, any more buffers will block upstream
+ * elements until a buffer is pulled from @appsink.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_sink_set_max_buffers (GstAppSink * appsink, guint max)
+{
+ GstAppSinkPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SINK (appsink));
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ if (max != priv->max_buffers) {
+ priv->max_buffers = max;
+ /* signal the change */
+ g_cond_signal (priv->cond);
+ }
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_sink_get_max_buffers:
+ * @appsink: a #GstAppSink
+ *
+ * Get the maximum amount of buffers that can be queued in @appsink.
+ *
+ * Returns: The maximum amount of buffers that can be queued.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_app_sink_get_max_buffers (GstAppSink * appsink)
+{
+ guint result;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), 0);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ result = priv->max_buffers;
+ g_mutex_unlock (priv->mutex);
+
+ return result;
+}
+
+/**
+ * gst_app_sink_set_drop:
+ * @appsink: a #GstAppSink
+ * @drop: the new state
+ *
+ * Instruct @appsink to drop old buffers when the maximum amount of queued
+ * buffers is reached.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_sink_set_drop (GstAppSink * appsink, gboolean drop)
+{
+ GstAppSinkPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SINK (appsink));
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ if (priv->drop != drop) {
+ priv->drop = drop;
+ /* signal the change */
+ g_cond_signal (priv->cond);
+ }
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_sink_get_drop:
+ * @appsink: a #GstAppSink
+ *
+ * Check if @appsink will drop old buffers when the maximum amount of queued
+ * buffers is reached.
+ *
+ * Returns: %TRUE if @appsink is dropping old buffers when the queue is
+ * filled.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_app_sink_get_drop (GstAppSink * appsink)
+{
+ gboolean result;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+ result = priv->drop;
+ g_mutex_unlock (priv->mutex);
+
+ return result;
+}
+
+/**
+ * gst_app_sink_pull_preroll:
+ * @appsink: a #GstAppSink
+ *
+ * Get the last preroll buffer in @appsink. This was the buffer that caused the
+ * appsink to preroll in the PAUSED state. This buffer can be pulled many times
+ * and remains available to the application even after EOS.
+ *
+ * This function is typically used when dealing with a pipeline in the PAUSED
+ * state. Calling this function after doing a seek will give the buffer right
+ * after the seek position.
+ *
+ * Note that the preroll buffer will also be returned as the first buffer
+ * when calling gst_app_sink_pull_buffer().
+ *
+ * If an EOS event was received before any buffers, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * This function blocks until a preroll buffer or EOS is received or the appsink
+ * element is set to the READY/NULL state.
+ *
+ * Returns: a #GstBuffer or NULL when the appsink is stopped or EOS.
+ *
+ * Since: 0.10.22
+ */
+GstBuffer *
+gst_app_sink_pull_preroll (GstAppSink * appsink)
+{
+ GstBuffer *buf = NULL;
+ GstAppSinkPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
+
+ priv = appsink->priv;
+
+ g_mutex_lock (priv->mutex);
+
+ while (TRUE) {
+ GST_DEBUG_OBJECT (appsink, "trying to grab a buffer");
+ if (!priv->started)
+ goto not_started;
+
+ if (priv->preroll != NULL)
+ break;
+
+ if (priv->is_eos)
+ goto eos;
+
+ /* nothing to return, wait */
+ GST_DEBUG_OBJECT (appsink, "waiting for the preroll buffer");
+ g_cond_wait (priv->cond, priv->mutex);
+ }
+ buf = gst_buffer_ref (priv->preroll);
+ GST_DEBUG_OBJECT (appsink, "we have the preroll buffer %p", buf);
+ g_mutex_unlock (priv->mutex);
+
+ return buf;
+
+ /* special conditions */
+eos:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL");
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+not_started:
+ {
+ GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL");
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+}
+
+/**
+ * gst_app_sink_pull_buffer:
+ * @appsink: a #GstAppSink
+ *
+ * This function blocks until a buffer or EOS becomes available or the appsink
+ * element is set to the READY/NULL state.
+ *
+ * This function will only return buffers when the appsink is in the PLAYING
+ * state. All rendered buffers will be put in a queue so that the application
+ * can pull buffers at its own rate. Note that when the application does not
+ * pull buffers fast enough, the queued buffers could consume a lot of memory,
+ * especially when dealing with raw video frames.
+ *
+ * If an EOS event was received before any buffers, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * Returns: a #GstBuffer or NULL when the appsink is stopped or EOS.
+ *
+ * Since: 0.10.22
+ */
+
+GstBuffer *
+gst_app_sink_pull_buffer (GstAppSink * appsink)
+{
+ GST_DEBUG_OBJECT (appsink, "pull a buffer");
+ return GST_BUFFER_CAST (gst_app_sink_pull_object (appsink));
+}
+
+/**
+ * gst_app_sink_pull_buffer_list:
+ * @appsink: a #GstAppSink
+ *
+ * This function blocks until a buffer list or EOS becomes available or the
+ * appsink element is set to the READY/NULL state.
+ *
+ * This function will only return buffer lists when the appsink is in the
+ * PLAYING state. All rendered buffer lists will be put in a queue so that
+ * the application can pull buffer lists at its own rate. Note that when
+ * the application does not pull buffer lists fast enough, the queued buffer
+ * lists could consume a lot of memory, especially when dealing with raw
+ * video frames.
+ *
+ * If an EOS event was received before any buffer lists, this function returns
+ * %NULL. Use gst_app_sink_is_eos () to check for the EOS condition.
+ *
+ * Returns: a #GstBufferList or NULL when the appsink is stopped or EOS.
+ */
+GstBufferList *
+gst_app_sink_pull_buffer_list (GstAppSink * appsink)
+{
+ GST_DEBUG_OBJECT (appsink, "pull a buffer list");
+ return GST_BUFFER_LIST_CAST (gst_app_sink_pull_object (appsink));
+}
+
+/**
+ * gst_app_sink_set_callbacks:
+ * @appsink: a #GstAppSink
+ * @callbacks: the callbacks
+ * @user_data: a user_data argument for the callbacks
+ * @notify: a destroy notify function
+ *
+ * Set callbacks which will be executed for each new preroll, new buffer and eos.
+ * This is an alternative to using the signals, it has lower overhead and is thus
+ * less expensive, but also less flexible.
+ *
+ * If callbacks are installed, no signals will be emited for performance
+ * reasons.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_app_sink_set_callbacks (GstAppSink * appsink,
+ GstAppSinkCallbacks * callbacks, gpointer user_data, GDestroyNotify notify)
+{
+ GDestroyNotify old_notify;
+ GstAppSinkPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SINK (appsink));
+ g_return_if_fail (callbacks != NULL);
+
+ priv = appsink->priv;
+
+ GST_OBJECT_LOCK (appsink);
+ old_notify = priv->notify;
+
+ if (old_notify) {
+ gpointer old_data;
+
+ old_data = priv->user_data;
+
+ priv->user_data = NULL;
+ priv->notify = NULL;
+ GST_OBJECT_UNLOCK (appsink);
+
+ old_notify (old_data);
+
+ GST_OBJECT_LOCK (appsink);
+ }
+ priv->callbacks = *callbacks;
+ priv->user_data = user_data;
+ priv->notify = notify;
+ priv->buffer_lists_supported =
+ gst_app_sink_check_buffer_lists_support (appsink);
+ GST_OBJECT_UNLOCK (appsink);
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_app_sink_uri_get_type (GType type)
+{
+ return GST_URI_SINK;
+}
+
+static gchar **
+gst_app_sink_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "appsink", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_app_sink_uri_get_uri (GstURIHandler * handler)
+{
+ return "appsink";
+}
+
+static gboolean
+gst_app_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *protocol;
+ gboolean ret;
+
+ protocol = gst_uri_get_protocol (uri);
+ ret = !strcmp (protocol, "appsink");
+ g_free (protocol);
+
+ return ret;
+}
+
+static void
+gst_app_sink_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_app_sink_uri_get_type;
+ iface->get_protocols = gst_app_sink_uri_get_protocols;
+ iface->get_uri = gst_app_sink_uri_get_uri;
+ iface->set_uri = gst_app_sink_uri_set_uri;
+}
diff --git a/gst-libs/gst/app/gstappsink.h b/gst-libs/gst/app/gstappsink.h
new file mode 100644
index 0000000..3e0bc41
--- /dev/null
+++ b/gst-libs/gst/app/gstappsink.h
@@ -0,0 +1,141 @@
+/* GStreamer
+ * Copyright (C) 2007 David Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _GST_APP_SINK_H_
+#define _GST_APP_SINK_H_
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_APP_SINK \
+ (gst_app_sink_get_type())
+#define GST_APP_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APP_SINK,GstAppSink))
+#define GST_APP_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APP_SINK,GstAppSinkClass))
+#define GST_IS_APP_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APP_SINK))
+#define GST_IS_APP_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APP_SINK))
+/* Since 0.10.23 */
+#define GST_APP_SINK_CAST(obj) \
+ ((GstAppSink*)(obj))
+
+typedef struct _GstAppSink GstAppSink;
+typedef struct _GstAppSinkClass GstAppSinkClass;
+typedef struct _GstAppSinkPrivate GstAppSinkPrivate;
+
+/**
+ * GstAppSinkCallbacks:
+ * @eos: Called when the end-of-stream has been reached. This callback
+ * is called from the steaming thread.
+ * @new_preroll: Called when a new preroll buffer is available.
+ * This callback is called from the steaming thread.
+ * The new preroll buffer can be retrieved with
+ * gst_app_sink_pull_preroll() either from this callback
+ * or from any other thread.
+ * @new_buffer: Called when a new buffer is available.
+ * This callback is called from the steaming thread.
+ * The new buffer can be retrieved with
+ * gst_app_sink_pull_buffer() either from this callback
+ * or from any other thread.
+ * @new_buffer_list: Called when a new bufferlist is available.
+ * This callback is called from the steaming thread.
+ * The new bufferlist can be retrieved with
+ * gst_app_sink_pull_buffer_list() either from this callback
+ * or from any other thread.
+ *
+ * A set of callbacks that can be installed on the appsink with
+ * gst_app_sink_set_callbacks().
+ *
+ * Since: 0.10.23
+ */
+typedef struct {
+ void (*eos) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_preroll) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_buffer) (GstAppSink *sink, gpointer user_data);
+ GstFlowReturn (*new_buffer_list) (GstAppSink *sink, gpointer user_data);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 1];
+} GstAppSinkCallbacks;
+
+struct _GstAppSink
+{
+ GstBaseSink basesink;
+
+ /*< private >*/
+ GstAppSinkPrivate *priv;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstAppSinkClass
+{
+ GstBaseSinkClass basesink_class;
+
+ /* signals */
+ void (*eos) (GstAppSink *sink);
+ void (*new_preroll) (GstAppSink *sink);
+ void (*new_buffer) (GstAppSink *sink);
+
+ /* actions */
+ GstBuffer * (*pull_preroll) (GstAppSink *sink);
+ GstBuffer * (*pull_buffer) (GstAppSink *sink);
+
+ /* ABI added */
+ GstBufferList * (*new_buffer_list) (GstAppSink *sink);
+ GstBufferList * (*pull_buffer_list) (GstAppSink *sink);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 2];
+};
+
+GType gst_app_sink_get_type(void);
+
+void gst_app_sink_set_caps (GstAppSink *appsink, const GstCaps *caps);
+GstCaps * gst_app_sink_get_caps (GstAppSink *appsink);
+
+gboolean gst_app_sink_is_eos (GstAppSink *appsink);
+
+void gst_app_sink_set_emit_signals (GstAppSink *appsink, gboolean emit);
+gboolean gst_app_sink_get_emit_signals (GstAppSink *appsink);
+
+void gst_app_sink_set_max_buffers (GstAppSink *appsink, guint max);
+guint gst_app_sink_get_max_buffers (GstAppSink *appsink);
+
+void gst_app_sink_set_drop (GstAppSink *appsink, gboolean drop);
+gboolean gst_app_sink_get_drop (GstAppSink *appsink);
+
+GstBuffer * gst_app_sink_pull_preroll (GstAppSink *appsink);
+GstBuffer * gst_app_sink_pull_buffer (GstAppSink *appsink);
+GstBufferList * gst_app_sink_pull_buffer_list (GstAppSink *appsink);
+
+void gst_app_sink_set_callbacks (GstAppSink * appsink,
+ GstAppSinkCallbacks *callbacks,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+G_END_DECLS
+
+#endif
+
diff --git a/gst-libs/gst/app/gstappsrc.c b/gst-libs/gst/app/gstappsrc.c
new file mode 100644
index 0000000..1a6a0cd
--- /dev/null
+++ b/gst-libs/gst/app/gstappsrc.c
@@ -0,0 +1,1650 @@
+/* GStreamer
+ * Copyright (C) 2007 David Schleef <ds@schleef.org>
+ * (C) 2008 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.
+ */
+/**
+ * SECTION:gstappsrc
+ * @short_description: Easy way for applications to inject buffers into a
+ * pipeline
+ * @see_also: #GstBaseSrc, appsink
+ *
+ * The appsrc element can be used by applications to insert data into a
+ * GStreamer pipeline. Unlike most GStreamer elements, Appsrc provides
+ * external API functions.
+ *
+ * appsrc can be used by linking with the libgstapp library to access the
+ * methods directly or by using the appsrc action signals.
+ *
+ * Before operating appsrc, the caps property must be set to a fixed caps
+ * describing the format of the data that will be pushed with appsrc. An
+ * exception to this is when pushing buffers with unknown caps, in which case no
+ * caps should be set. This is typically true of file-like sources that push raw
+ * byte buffers.
+ *
+ * The main way of handing data to the appsrc element is by calling the
+ * gst_app_src_push_buffer() method or by emiting the push-buffer action signal.
+ * This will put the buffer onto a queue from which appsrc will read from in its
+ * streaming thread. It is important to note that data transport will not happen
+ * from the thread that performed the push-buffer call.
+ *
+ * The "max-bytes" property controls how much data can be queued in appsrc
+ * before appsrc considers the queue full. A filled internal queue will always
+ * signal the "enough-data" signal, which signals the application that it should
+ * stop pushing data into appsrc. The "block" property will cause appsrc to
+ * block the push-buffer method until free data becomes available again.
+ *
+ * When the internal queue is running out of data, the "need-data" signal is
+ * emited, which signals the application that it should start pushing more data
+ * into appsrc.
+ *
+ * In addition to the "need-data" and "enough-data" signals, appsrc can emit the
+ * "seek-data" signal when the "stream-mode" property is set to "seekable" or
+ * "random-access". The signal argument will contain the new desired position in
+ * the stream expressed in the unit set with the "format" property. After
+ * receiving the seek-data signal, the application should push-buffers from the
+ * new position.
+ *
+ * These signals allow the application to operate the appsrc in two different
+ * ways:
+ *
+ * The push model, in which the application repeadedly calls the push-buffer method
+ * with a new buffer. Optionally, the queue size in the appsrc can be controlled
+ * with the enough-data and need-data signals by respectively stopping/starting
+ * the push-buffer calls. This is a typical mode of operation for the
+ * stream-type "stream" and "seekable". Use this model when implementing various
+ * network protocols or hardware devices.
+ *
+ * The pull model where the need-data signal triggers the next push-buffer call.
+ * This mode is typically used in the "random-access" stream-type. Use this
+ * model for file access or other randomly accessable sources. In this mode, a
+ * buffer of exactly the amount of bytes given by the need-data signal should be
+ * pushed into appsrc.
+ *
+ * In all modes, the size property on appsrc should contain the total stream
+ * size in bytes. Setting this property is mandatory in the random-access mode.
+ * For the stream and seekable modes, setting this property is optional but
+ * recommended.
+ *
+ * When the application is finished pushing data into appsrc, it should call
+ * gst_app_src_end_of_stream() or emit the end-of-stream action signal. After
+ * this call, no more buffers can be pushed into appsrc until a flushing seek
+ * happened or the state of the appsrc has gone through READY.
+ *
+ * Last reviewed on 2008-12-17 (0.10.10)
+ *
+ * Since: 0.10.22
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesrc.h>
+
+#include <string.h>
+
+#include "gstapp-marshal.h"
+#include "gstappsrc.h"
+
+struct _GstAppSrcPrivate
+{
+ GCond *cond;
+ GMutex *mutex;
+ GQueue *queue;
+
+ GstCaps *caps;
+ gint64 size;
+ GstAppStreamType stream_type;
+ guint64 max_bytes;
+ GstFormat format;
+ gboolean block;
+
+ gboolean flushing;
+ gboolean started;
+ gboolean is_eos;
+ guint64 queued_bytes;
+ guint64 offset;
+ GstAppStreamType current_type;
+
+ guint64 min_latency;
+ guint64 max_latency;
+ gboolean emit_signals;
+ guint min_percent;
+
+ GstAppSrcCallbacks callbacks;
+ gpointer user_data;
+ GDestroyNotify notify;
+};
+
+GST_DEBUG_CATEGORY_STATIC (app_src_debug);
+#define GST_CAT_DEFAULT app_src_debug
+
+enum
+{
+ /* signals */
+ SIGNAL_NEED_DATA,
+ SIGNAL_ENOUGH_DATA,
+ SIGNAL_SEEK_DATA,
+
+ /* actions */
+ SIGNAL_PUSH_BUFFER,
+ SIGNAL_END_OF_STREAM,
+
+ LAST_SIGNAL
+};
+
+#define DEFAULT_PROP_SIZE -1
+#define DEFAULT_PROP_STREAM_TYPE GST_APP_STREAM_TYPE_STREAM
+#define DEFAULT_PROP_MAX_BYTES 200000
+#define DEFAULT_PROP_FORMAT GST_FORMAT_BYTES
+#define DEFAULT_PROP_BLOCK FALSE
+#define DEFAULT_PROP_IS_LIVE FALSE
+#define DEFAULT_PROP_MIN_LATENCY -1
+#define DEFAULT_PROP_MAX_LATENCY -1
+#define DEFAULT_PROP_EMIT_SIGNALS TRUE
+#define DEFAULT_PROP_MIN_PERCENT 0
+
+enum
+{
+ PROP_0,
+ PROP_CAPS,
+ PROP_SIZE,
+ PROP_STREAM_TYPE,
+ PROP_MAX_BYTES,
+ PROP_FORMAT,
+ PROP_BLOCK,
+ PROP_IS_LIVE,
+ PROP_MIN_LATENCY,
+ PROP_MAX_LATENCY,
+ PROP_EMIT_SIGNALS,
+ PROP_MIN_PERCENT,
+ PROP_LAST
+};
+
+static GstStaticPadTemplate gst_app_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GType
+gst_app_stream_type_get_type (void)
+{
+ static volatile gsize stream_type_type = 0;
+ static const GEnumValue stream_type[] = {
+ {GST_APP_STREAM_TYPE_STREAM, "GST_APP_STREAM_TYPE_STREAM", "stream"},
+ {GST_APP_STREAM_TYPE_SEEKABLE, "GST_APP_STREAM_TYPE_SEEKABLE", "seekable"},
+ {GST_APP_STREAM_TYPE_RANDOM_ACCESS, "GST_APP_STREAM_TYPE_RANDOM_ACCESS",
+ "random-access"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&stream_type_type)) {
+ GType tmp = g_enum_register_static ("GstAppStreamType", stream_type);
+ g_once_init_leave (&stream_type_type, tmp);
+ }
+
+ return (GType) stream_type_type;
+}
+
+static void gst_app_src_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+
+static void gst_app_src_dispose (GObject * object);
+static void gst_app_src_finalize (GObject * object);
+
+static void gst_app_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_app_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void gst_app_src_set_latencies (GstAppSrc * appsrc,
+ gboolean do_min, guint64 min, gboolean do_max, guint64 max);
+
+static GstFlowReturn gst_app_src_create (GstBaseSrc * bsrc,
+ guint64 offset, guint size, GstBuffer ** buf);
+static gboolean gst_app_src_start (GstBaseSrc * bsrc);
+static gboolean gst_app_src_stop (GstBaseSrc * bsrc);
+static gboolean gst_app_src_unlock (GstBaseSrc * bsrc);
+static gboolean gst_app_src_unlock_stop (GstBaseSrc * bsrc);
+static gboolean gst_app_src_do_seek (GstBaseSrc * src, GstSegment * segment);
+static gboolean gst_app_src_is_seekable (GstBaseSrc * src);
+static gboolean gst_app_src_do_get_size (GstBaseSrc * src, guint64 * size);
+static gboolean gst_app_src_query (GstBaseSrc * src, GstQuery * query);
+
+static GstFlowReturn gst_app_src_push_buffer_action (GstAppSrc * appsrc,
+ GstBuffer * buffer);
+
+static guint gst_app_src_signals[LAST_SIGNAL] = { 0 };
+
+#define gst_app_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAppSrc, gst_app_src, GST_TYPE_BASE_SRC,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_app_src_uri_handler_init));
+
+static void
+gst_app_src_class_init (GstAppSrcClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+ GstBaseSrcClass *basesrc_class = (GstBaseSrcClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (app_src_debug, "appsrc", 0, "appsrc element");
+
+ gobject_class->dispose = gst_app_src_dispose;
+ gobject_class->finalize = gst_app_src_finalize;
+
+ gobject_class->set_property = gst_app_src_set_property;
+ gobject_class->get_property = gst_app_src_get_property;
+
+ /**
+ * GstAppSrc::caps
+ *
+ * The GstCaps that will negotiated downstream and will be put
+ * on outgoing buffers.
+ */
+ g_object_class_install_property (gobject_class, PROP_CAPS,
+ g_param_spec_boxed ("caps", "Caps",
+ "The allowed caps for the src pad", GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::format
+ *
+ * The format to use for segment events. When the source is producing
+ * timestamped buffers this property should be set to GST_FORMAT_TIME.
+ */
+ g_object_class_install_property (gobject_class, PROP_FORMAT,
+ g_param_spec_enum ("format", "Format",
+ "The format of the segment events and seek", GST_TYPE_FORMAT,
+ DEFAULT_PROP_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::size
+ *
+ * The total size in bytes of the data stream. If the total size is known, it
+ * is recommended to configure it with this property.
+ */
+ g_object_class_install_property (gobject_class, PROP_SIZE,
+ g_param_spec_int64 ("size", "Size",
+ "The size of the data stream in bytes (-1 if unknown)",
+ -1, G_MAXINT64, DEFAULT_PROP_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::stream-type
+ *
+ * The type of stream that this source is producing. For seekable streams the
+ * application should connect to the seek-data signal.
+ */
+ g_object_class_install_property (gobject_class, PROP_STREAM_TYPE,
+ g_param_spec_enum ("stream-type", "Stream Type",
+ "the type of the stream", GST_TYPE_APP_STREAM_TYPE,
+ DEFAULT_PROP_STREAM_TYPE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::max-bytes
+ *
+ * The maximum amount of bytes that can be queued internally.
+ * After the maximum amount of bytes are queued, appsrc will emit the
+ * "enough-data" signal.
+ */
+ g_object_class_install_property (gobject_class, PROP_MAX_BYTES,
+ g_param_spec_uint64 ("max-bytes", "Max bytes",
+ "The maximum number of bytes to queue internally (0 = unlimited)",
+ 0, G_MAXUINT64, DEFAULT_PROP_MAX_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::block
+ *
+ * When max-bytes are queued and after the enough-data signal has been emited,
+ * block any further push-buffer calls until the amount of queued bytes drops
+ * below the max-bytes limit.
+ */
+ g_object_class_install_property (gobject_class, PROP_BLOCK,
+ g_param_spec_boolean ("block", "Block",
+ "Block push-buffer when max-bytes are queued",
+ DEFAULT_PROP_BLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAppSrc::is-live
+ *
+ * Instruct the source to behave like a live source. This includes that it
+ * will only push out buffers in the PLAYING state.
+ */
+ g_object_class_install_property (gobject_class, PROP_IS_LIVE,
+ g_param_spec_boolean ("is-live", "Is Live",
+ "Whether to act as a live source",
+ DEFAULT_PROP_IS_LIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::min-latency
+ *
+ * The minimum latency of the source. A value of -1 will use the default
+ * latency calculations of #GstBaseSrc.
+ */
+ g_object_class_install_property (gobject_class, PROP_MIN_LATENCY,
+ g_param_spec_int64 ("min-latency", "Min Latency",
+ "The minimum latency (-1 = default)",
+ -1, G_MAXINT64, DEFAULT_PROP_MIN_LATENCY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAppSrc::max-latency
+ *
+ * The maximum latency of the source. A value of -1 means an unlimited amout
+ * of latency.
+ */
+ g_object_class_install_property (gobject_class, PROP_MAX_LATENCY,
+ g_param_spec_int64 ("max-latency", "Max Latency",
+ "The maximum latency (-1 = unlimited)",
+ -1, G_MAXINT64, DEFAULT_PROP_MAX_LATENCY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAppSrc::emit-signals
+ *
+ * Make appsrc emit the "need-data", "enough-data" and "seek-data" signals.
+ * This option is by default enabled for backwards compatibility reasons but
+ * can disabled when needed because signal emission is expensive.
+ *
+ * Since: 0.10.23
+ */
+ g_object_class_install_property (gobject_class, PROP_EMIT_SIGNALS,
+ g_param_spec_boolean ("emit-signals", "Emit signals",
+ "Emit need-data, enough-data and seek-data signals",
+ DEFAULT_PROP_EMIT_SIGNALS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAppSrc::empty-percent
+ *
+ * Make appsrc emit the "need-data" signal when the amount of bytes in the
+ * queue drops below this percentage of max-bytes.
+ *
+ * Since: 0.10.27
+ */
+ g_object_class_install_property (gobject_class, PROP_MIN_PERCENT,
+ g_param_spec_uint ("min-percent", "Min Percent",
+ "Emit need-data when queued bytes drops below this percent of max-bytes",
+ 0, 100, DEFAULT_PROP_MIN_PERCENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAppSrc::need-data:
+ * @appsrc: the appsrc element that emited the signal
+ * @length: the amount of bytes needed.
+ *
+ * Signal that the source needs more data. In the callback or from another
+ * thread you should call push-buffer or end-of-stream.
+ *
+ * @length is just a hint and when it is set to -1, any number of bytes can be
+ * pushed into @appsrc.
+ *
+ * You can call push-buffer multiple times until the enough-data signal is
+ * fired.
+ */
+ gst_app_src_signals[SIGNAL_NEED_DATA] =
+ g_signal_new ("need-data", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSrcClass, need_data),
+ NULL, NULL, __gst_app_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
+
+ /**
+ * GstAppSrc::enough-data:
+ * @appsrc: the appsrc element that emited the signal
+ *
+ * Signal that the source has enough data. It is recommended that the
+ * application stops calling push-buffer until the need-data signal is
+ * emited again to avoid excessive buffer queueing.
+ */
+ gst_app_src_signals[SIGNAL_ENOUGH_DATA] =
+ g_signal_new ("enough-data", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSrcClass, enough_data),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstAppSrc::seek-data:
+ * @appsrc: the appsrc element that emited the signal
+ * @offset: the offset to seek to
+ *
+ * Seek to the given offset. The next push-buffer should produce buffers from
+ * the new @offset.
+ * This callback is only called for seekable stream types.
+ *
+ * Returns: %TRUE if the seek succeeded.
+ */
+ gst_app_src_signals[SIGNAL_SEEK_DATA] =
+ g_signal_new ("seek-data", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstAppSrcClass, seek_data),
+ NULL, NULL, __gst_app_marshal_BOOLEAN__UINT64, G_TYPE_BOOLEAN, 1,
+ G_TYPE_UINT64);
+
+ /**
+ * GstAppSrc::push-buffer:
+ * @appsrc: the appsrc
+ * @buffer: a buffer to push
+ *
+ * Adds a buffer to the queue of buffers that the appsrc element will
+ * push to its source pad. This function does not take ownership of the
+ * buffer so the buffer needs to be unreffed after calling this function.
+ *
+ * When the block property is TRUE, this function can block until free space
+ * becomes available in the queue.
+ */
+ gst_app_src_signals[SIGNAL_PUSH_BUFFER] =
+ g_signal_new ("push-buffer", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstAppSrcClass,
+ push_buffer), NULL, NULL, __gst_app_marshal_ENUM__OBJECT,
+ GST_TYPE_FLOW_RETURN, 1, GST_TYPE_BUFFER);
+
+ /**
+ * GstAppSrc::end-of-stream:
+ * @appsrc: the appsrc
+ *
+ * Notify @appsrc that no more buffer are available.
+ */
+ gst_app_src_signals[SIGNAL_END_OF_STREAM] =
+ g_signal_new ("end-of-stream", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstAppSrcClass,
+ end_of_stream), NULL, NULL, __gst_app_marshal_ENUM__VOID,
+ GST_TYPE_FLOW_RETURN, 0, G_TYPE_NONE);
+
+ gst_element_class_set_details_simple (element_class, "AppSrc",
+ "Generic/Source", "Allow the application to feed buffers to a pipeline",
+ "David Schleef <ds@schleef.org>, Wim Taymans <wim.taymans@gmail.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_app_src_template));
+
+ basesrc_class->create = gst_app_src_create;
+ basesrc_class->start = gst_app_src_start;
+ basesrc_class->stop = gst_app_src_stop;
+ basesrc_class->unlock = gst_app_src_unlock;
+ basesrc_class->unlock_stop = gst_app_src_unlock_stop;
+ basesrc_class->do_seek = gst_app_src_do_seek;
+ basesrc_class->is_seekable = gst_app_src_is_seekable;
+ basesrc_class->get_size = gst_app_src_do_get_size;
+ basesrc_class->get_size = gst_app_src_do_get_size;
+ basesrc_class->query = gst_app_src_query;
+
+ klass->push_buffer = gst_app_src_push_buffer_action;
+ klass->end_of_stream = gst_app_src_end_of_stream;
+
+ g_type_class_add_private (klass, sizeof (GstAppSrcPrivate));
+}
+
+static void
+gst_app_src_init (GstAppSrc * appsrc)
+{
+ GstAppSrcPrivate *priv;
+
+ priv = appsrc->priv = G_TYPE_INSTANCE_GET_PRIVATE (appsrc, GST_TYPE_APP_SRC,
+ GstAppSrcPrivate);
+
+ priv->mutex = g_mutex_new ();
+ priv->cond = g_cond_new ();
+ priv->queue = g_queue_new ();
+
+ priv->size = DEFAULT_PROP_SIZE;
+ priv->stream_type = DEFAULT_PROP_STREAM_TYPE;
+ priv->max_bytes = DEFAULT_PROP_MAX_BYTES;
+ priv->format = DEFAULT_PROP_FORMAT;
+ priv->block = DEFAULT_PROP_BLOCK;
+ priv->min_latency = DEFAULT_PROP_MIN_LATENCY;
+ priv->max_latency = DEFAULT_PROP_MAX_LATENCY;
+ priv->emit_signals = DEFAULT_PROP_EMIT_SIGNALS;
+ priv->min_percent = DEFAULT_PROP_MIN_PERCENT;
+
+ gst_base_src_set_live (GST_BASE_SRC (appsrc), DEFAULT_PROP_IS_LIVE);
+}
+
+static void
+gst_app_src_flush_queued (GstAppSrc * src)
+{
+ GstBuffer *buf;
+ GstAppSrcPrivate *priv = src->priv;
+
+ while ((buf = g_queue_pop_head (priv->queue)))
+ gst_buffer_unref (buf);
+ priv->queued_bytes = 0;
+}
+
+static void
+gst_app_src_dispose (GObject * obj)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (obj);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ if (priv->caps) {
+ gst_caps_unref (priv->caps);
+ priv->caps = NULL;
+ }
+ gst_app_src_flush_queued (appsrc);
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_app_src_finalize (GObject * obj)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (obj);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ g_mutex_free (priv->mutex);
+ g_cond_free (priv->cond);
+ g_queue_free (priv->queue);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_app_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (object);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ gst_app_src_set_caps (appsrc, gst_value_get_caps (value));
+ break;
+ case PROP_SIZE:
+ gst_app_src_set_size (appsrc, g_value_get_int64 (value));
+ break;
+ case PROP_STREAM_TYPE:
+ gst_app_src_set_stream_type (appsrc, g_value_get_enum (value));
+ break;
+ case PROP_MAX_BYTES:
+ gst_app_src_set_max_bytes (appsrc, g_value_get_uint64 (value));
+ break;
+ case PROP_FORMAT:
+ priv->format = g_value_get_enum (value);
+ break;
+ case PROP_BLOCK:
+ priv->block = g_value_get_boolean (value);
+ break;
+ case PROP_IS_LIVE:
+ gst_base_src_set_live (GST_BASE_SRC (appsrc),
+ g_value_get_boolean (value));
+ break;
+ case PROP_MIN_LATENCY:
+ gst_app_src_set_latencies (appsrc, TRUE, g_value_get_int64 (value),
+ FALSE, -1);
+ break;
+ case PROP_MAX_LATENCY:
+ gst_app_src_set_latencies (appsrc, FALSE, -1, TRUE,
+ g_value_get_int64 (value));
+ break;
+ case PROP_EMIT_SIGNALS:
+ gst_app_src_set_emit_signals (appsrc, g_value_get_boolean (value));
+ break;
+ case PROP_MIN_PERCENT:
+ priv->min_percent = g_value_get_uint (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_app_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (object);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ {
+ GstCaps *caps;
+
+ /* we're missing a _take_caps() function to transfer ownership */
+ caps = gst_app_src_get_caps (appsrc);
+ gst_value_set_caps (value, caps);
+ if (caps)
+ gst_caps_unref (caps);
+ break;
+ }
+ case PROP_SIZE:
+ g_value_set_int64 (value, gst_app_src_get_size (appsrc));
+ break;
+ case PROP_STREAM_TYPE:
+ g_value_set_enum (value, gst_app_src_get_stream_type (appsrc));
+ break;
+ case PROP_MAX_BYTES:
+ g_value_set_uint64 (value, gst_app_src_get_max_bytes (appsrc));
+ break;
+ case PROP_FORMAT:
+ g_value_set_enum (value, priv->format);
+ break;
+ case PROP_BLOCK:
+ g_value_set_boolean (value, priv->block);
+ break;
+ case PROP_IS_LIVE:
+ g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (appsrc)));
+ break;
+ case PROP_MIN_LATENCY:
+ {
+ guint64 min;
+
+ gst_app_src_get_latency (appsrc, &min, NULL);
+ g_value_set_int64 (value, min);
+ break;
+ }
+ case PROP_MAX_LATENCY:
+ {
+ guint64 max;
+
+ gst_app_src_get_latency (appsrc, &max, NULL);
+ g_value_set_int64 (value, max);
+ break;
+ }
+ case PROP_EMIT_SIGNALS:
+ g_value_set_boolean (value, gst_app_src_get_emit_signals (appsrc));
+ break;
+ case PROP_MIN_PERCENT:
+ g_value_set_uint (value, priv->min_percent);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_app_src_unlock (GstBaseSrc * bsrc)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (bsrc);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsrc, "unlock start");
+ priv->flushing = TRUE;
+ g_cond_broadcast (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_src_unlock_stop (GstBaseSrc * bsrc)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (bsrc);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsrc, "unlock stop");
+ priv->flushing = FALSE;
+ g_cond_broadcast (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_src_start (GstBaseSrc * bsrc)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (bsrc);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsrc, "starting");
+ priv->started = TRUE;
+ /* set the offset to -1 so that we always do a first seek. This is only used
+ * in random-access mode. */
+ priv->offset = -1;
+ priv->flushing = FALSE;
+ g_mutex_unlock (priv->mutex);
+
+ gst_base_src_set_format (bsrc, priv->format);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_src_stop (GstBaseSrc * bsrc)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (bsrc);
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ GST_DEBUG_OBJECT (appsrc, "stopping");
+ priv->is_eos = FALSE;
+ priv->flushing = TRUE;
+ priv->started = FALSE;
+ gst_app_src_flush_queued (appsrc);
+ g_mutex_unlock (priv->mutex);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_src_is_seekable (GstBaseSrc * src)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (src);
+ GstAppSrcPrivate *priv = appsrc->priv;
+ gboolean res = FALSE;
+
+ switch (priv->stream_type) {
+ case GST_APP_STREAM_TYPE_STREAM:
+ break;
+ case GST_APP_STREAM_TYPE_SEEKABLE:
+ case GST_APP_STREAM_TYPE_RANDOM_ACCESS:
+ res = TRUE;
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_app_src_do_get_size (GstBaseSrc * src, guint64 * size)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (src);
+
+ *size = gst_app_src_get_size (appsrc);
+
+ return TRUE;
+}
+
+static gboolean
+gst_app_src_query (GstBaseSrc * src, GstQuery * query)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (src);
+ GstAppSrcPrivate *priv = appsrc->priv;
+ gboolean res;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ GstClockTime min, max;
+ gboolean live;
+
+ /* Query the parent class for the defaults */
+ res = gst_base_src_query_latency (src, &live, &min, &max);
+
+ /* overwrite with our values when we need to */
+ g_mutex_lock (priv->mutex);
+ if (priv->min_latency != -1)
+ min = priv->min_latency;
+ if (priv->max_latency != -1)
+ max = priv->max_latency;
+ g_mutex_unlock (priv->mutex);
+
+ gst_query_set_latency (query, live, min, max);
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ gboolean pull_mode = FALSE;
+
+ switch (priv->stream_type) {
+ case GST_APP_STREAM_TYPE_STREAM:
+ case GST_APP_STREAM_TYPE_SEEKABLE:
+ break;
+ case GST_APP_STREAM_TYPE_RANDOM_ACCESS:
+ pull_mode = TRUE;
+ break;
+ }
+ gst_query_set_scheduling (query, pull_mode, TRUE, FALSE, 1, -1, 1);
+ res = TRUE;
+ break;
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ break;
+ }
+
+ return res;
+}
+
+/* will be called in push mode */
+static gboolean
+gst_app_src_do_seek (GstBaseSrc * src, GstSegment * segment)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (src);
+ GstAppSrcPrivate *priv = appsrc->priv;
+ gint64 desired_position;
+ gboolean res = FALSE;
+
+ desired_position = segment->position;
+
+ GST_DEBUG_OBJECT (appsrc, "seeking to %" G_GINT64_FORMAT ", format %s",
+ desired_position, gst_format_get_name (segment->format));
+
+ /* no need to try to seek in streaming mode */
+ if (priv->stream_type == GST_APP_STREAM_TYPE_STREAM)
+ return TRUE;
+
+ if (priv->callbacks.seek_data)
+ res = priv->callbacks.seek_data (appsrc, desired_position, priv->user_data);
+ else {
+ gboolean emit;
+
+ g_mutex_lock (priv->mutex);
+ emit = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ if (emit)
+ g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_SEEK_DATA], 0,
+ desired_position, &res);
+ }
+
+ if (res) {
+ GST_DEBUG_OBJECT (appsrc, "flushing queue");
+ gst_app_src_flush_queued (appsrc);
+ priv->is_eos = FALSE;
+ } else {
+ GST_WARNING_OBJECT (appsrc, "seek failed");
+ }
+
+ return res;
+}
+
+/* must be called with the appsrc mutex */
+static gboolean
+gst_app_src_emit_seek (GstAppSrc * appsrc, guint64 offset)
+{
+ gboolean res = FALSE;
+ gboolean emit;
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ emit = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ GST_DEBUG_OBJECT (appsrc,
+ "we are at %" G_GINT64_FORMAT ", seek to %" G_GINT64_FORMAT,
+ priv->offset, offset);
+
+ if (priv->callbacks.seek_data)
+ res = priv->callbacks.seek_data (appsrc, offset, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_SEEK_DATA], 0,
+ offset, &res);
+
+ g_mutex_lock (priv->mutex);
+
+ return res;
+}
+
+/* must be called with the appsrc mutex. After this call things can be
+ * flushing */
+static void
+gst_app_src_emit_need_data (GstAppSrc * appsrc, guint size)
+{
+ gboolean emit;
+ GstAppSrcPrivate *priv = appsrc->priv;
+
+ emit = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ /* we have no data, we need some. We fire the signal with the size hint. */
+ if (priv->callbacks.need_data)
+ priv->callbacks.need_data (appsrc, size, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_NEED_DATA], 0, size,
+ NULL);
+
+ g_mutex_lock (priv->mutex);
+ /* we can be flushing now because we released the lock */
+}
+
+static GstFlowReturn
+gst_app_src_create (GstBaseSrc * bsrc, guint64 offset, guint size,
+ GstBuffer ** buf)
+{
+ GstAppSrc *appsrc = GST_APP_SRC_CAST (bsrc);
+ GstAppSrcPrivate *priv = appsrc->priv;
+ GstFlowReturn ret;
+ GstCaps *caps;
+
+ GST_OBJECT_LOCK (appsrc);
+ caps = priv->caps ? gst_caps_ref (priv->caps) : NULL;
+ if (G_UNLIKELY (priv->size != bsrc->segment.duration &&
+ bsrc->segment.format == GST_FORMAT_BYTES)) {
+ GST_DEBUG_OBJECT (appsrc,
+ "Size changed from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT,
+ bsrc->segment.duration, priv->size);
+ bsrc->segment.duration = priv->size;
+ GST_OBJECT_UNLOCK (appsrc);
+
+ gst_element_post_message (GST_ELEMENT (appsrc),
+ gst_message_new_duration (GST_OBJECT (appsrc), GST_FORMAT_BYTES,
+ priv->size));
+ } else {
+ GST_OBJECT_UNLOCK (appsrc);
+ }
+
+ g_mutex_lock (priv->mutex);
+ /* check flushing first */
+ if (G_UNLIKELY (priv->flushing))
+ goto flushing;
+
+ if (priv->stream_type == GST_APP_STREAM_TYPE_RANDOM_ACCESS) {
+ /* if we are dealing with a random-access stream, issue a seek if the offset
+ * changed. */
+ if (G_UNLIKELY (priv->offset != offset)) {
+ gboolean res;
+
+ /* do the seek */
+ res = gst_app_src_emit_seek (appsrc, offset);
+
+ if (G_UNLIKELY (!res))
+ /* failing to seek is fatal */
+ goto seek_error;
+
+ priv->offset = offset;
+ }
+ }
+
+ while (TRUE) {
+ /* return data as long as we have some */
+ if (!g_queue_is_empty (priv->queue)) {
+ guint buf_size;
+
+ *buf = g_queue_pop_head (priv->queue);
+ buf_size = gst_buffer_get_size (*buf);
+
+ GST_DEBUG_OBJECT (appsrc, "we have buffer %p of size %u", *buf, buf_size);
+
+ priv->queued_bytes -= buf_size;
+
+ /* only update the offset when in random_access mode */
+ if (priv->stream_type == GST_APP_STREAM_TYPE_RANDOM_ACCESS)
+ priv->offset += buf_size;
+
+ /* signal that we removed an item */
+ g_cond_broadcast (priv->cond);
+
+ /* see if we go lower than the empty-percent */
+ if (priv->min_percent && priv->max_bytes) {
+ if (priv->queued_bytes * 100 / priv->max_bytes <= priv->min_percent)
+ /* ignore flushing state, we got a buffer and we will return it now.
+ * Errors will be handled in the next round */
+ gst_app_src_emit_need_data (appsrc, size);
+ }
+ ret = GST_FLOW_OK;
+ break;
+ } else {
+ gst_app_src_emit_need_data (appsrc, size);
+
+ /* we can be flushing now because we released the lock above */
+ if (G_UNLIKELY (priv->flushing))
+ goto flushing;
+
+ /* if we have a buffer now, continue the loop and try to return it. In
+ * random-access mode (where a buffer is normally pushed in the above
+ * signal) we can still be empty because the pushed buffer got flushed or
+ * when the application pushes the requested buffer later, we support both
+ * possiblities. */
+ if (!g_queue_is_empty (priv->queue))
+ continue;
+
+ /* no buffer yet, maybe we are EOS, if not, block for more data. */
+ }
+
+ /* check EOS */
+ if (G_UNLIKELY (priv->is_eos))
+ goto eos;
+
+ /* nothing to return, wait a while for new data or flushing. */
+ g_cond_wait (priv->cond, priv->mutex);
+ }
+ g_mutex_unlock (priv->mutex);
+ if (caps)
+ gst_caps_unref (caps);
+ return ret;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (appsrc, "we are flushing");
+ g_mutex_unlock (priv->mutex);
+ if (caps)
+ gst_caps_unref (caps);
+ return GST_FLOW_WRONG_STATE;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (appsrc, "we are EOS");
+ g_mutex_unlock (priv->mutex);
+ if (caps)
+ gst_caps_unref (caps);
+ return GST_FLOW_UNEXPECTED;
+ }
+seek_error:
+ {
+ g_mutex_unlock (priv->mutex);
+ if (caps)
+ gst_caps_unref (caps);
+ GST_ELEMENT_ERROR (appsrc, RESOURCE, READ, ("failed to seek"),
+ GST_ERROR_SYSTEM);
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* external API */
+
+/**
+ * gst_app_src_set_caps:
+ * @appsrc: a #GstAppSrc
+ * @caps: caps to set
+ *
+ * Set the capabilities on the appsrc element. This function takes
+ * a copy of the caps structure. After calling this method, the source will
+ * only produce caps that match @caps. @caps must be fixed and the caps on the
+ * buffers must match the caps or left NULL.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_set_caps (GstAppSrc * appsrc, const GstCaps * caps)
+{
+ GstCaps *old;
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ GST_DEBUG_OBJECT (appsrc, "setting caps to %" GST_PTR_FORMAT, caps);
+ if ((old = priv->caps) != caps) {
+ if (caps)
+ priv->caps = gst_caps_copy (caps);
+ else
+ priv->caps = NULL;
+ if (old)
+ gst_caps_unref (old);
+ }
+ GST_OBJECT_UNLOCK (appsrc);
+}
+
+/**
+ * gst_app_src_get_caps:
+ * @appsrc: a #GstAppSrc
+ *
+ * Get the configured caps on @appsrc.
+ *
+ * Returns: the #GstCaps produced by the source. gst_caps_unref() after usage.
+ *
+ * Since: 0.10.22
+ */
+GstCaps *
+gst_app_src_get_caps (GstAppSrc * appsrc)
+{
+ GstCaps *caps;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), NULL);
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ if ((caps = priv->caps))
+ gst_caps_ref (caps);
+ GST_DEBUG_OBJECT (appsrc, "getting caps of %" GST_PTR_FORMAT, caps);
+ GST_OBJECT_UNLOCK (appsrc);
+
+ return caps;
+}
+
+/**
+ * gst_app_src_set_size:
+ * @appsrc: a #GstAppSrc
+ * @size: the size to set
+ *
+ * Set the size of the stream in bytes. A value of -1 means that the size is
+ * not known.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_set_size (GstAppSrc * appsrc, gint64 size)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ GST_DEBUG_OBJECT (appsrc, "setting size of %" G_GINT64_FORMAT, size);
+ priv->size = size;
+ GST_OBJECT_UNLOCK (appsrc);
+}
+
+/**
+ * gst_app_src_get_size:
+ * @appsrc: a #GstAppSrc
+ *
+ * Get the size of the stream in bytes. A value of -1 means that the size is
+ * not known.
+ *
+ * Returns: the size of the stream previously set with gst_app_src_set_size();
+ *
+ * Since: 0.10.22
+ */
+gint64
+gst_app_src_get_size (GstAppSrc * appsrc)
+{
+ gint64 size;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), -1);
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ size = priv->size;
+ GST_DEBUG_OBJECT (appsrc, "getting size of %" G_GINT64_FORMAT, size);
+ GST_OBJECT_UNLOCK (appsrc);
+
+ return size;
+}
+
+/**
+ * gst_app_src_set_stream_type:
+ * @appsrc: a #GstAppSrc
+ * @type: the new state
+ *
+ * Set the stream type on @appsrc. For seekable streams, the "seek" signal must
+ * be connected to.
+ *
+ * A stream_type stream
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_set_stream_type (GstAppSrc * appsrc, GstAppStreamType type)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ GST_DEBUG_OBJECT (appsrc, "setting stream_type of %d", type);
+ priv->stream_type = type;
+ GST_OBJECT_UNLOCK (appsrc);
+}
+
+/**
+ * gst_app_src_get_stream_type:
+ * @appsrc: a #GstAppSrc
+ *
+ * Get the stream type. Control the stream type of @appsrc
+ * with gst_app_src_set_stream_type().
+ *
+ * Returns: the stream type.
+ *
+ * Since: 0.10.22
+ */
+GstAppStreamType
+gst_app_src_get_stream_type (GstAppSrc * appsrc)
+{
+ gboolean stream_type;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), FALSE);
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ stream_type = priv->stream_type;
+ GST_DEBUG_OBJECT (appsrc, "getting stream_type of %d", stream_type);
+ GST_OBJECT_UNLOCK (appsrc);
+
+ return stream_type;
+}
+
+/**
+ * gst_app_src_set_max_bytes:
+ * @appsrc: a #GstAppSrc
+ * @max: the maximum number of bytes to queue
+ *
+ * Set the maximum amount of bytes that can be queued in @appsrc.
+ * After the maximum amount of bytes are queued, @appsrc will emit the
+ * "enough-data" signal.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_set_max_bytes (GstAppSrc * appsrc, guint64 max)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ if (max != priv->max_bytes) {
+ GST_DEBUG_OBJECT (appsrc, "setting max-bytes to %" G_GUINT64_FORMAT, max);
+ priv->max_bytes = max;
+ /* signal the change */
+ g_cond_broadcast (priv->cond);
+ }
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_src_get_max_bytes:
+ * @appsrc: a #GstAppSrc
+ *
+ * Get the maximum amount of bytes that can be queued in @appsrc.
+ *
+ * Returns: The maximum amount of bytes that can be queued.
+ *
+ * Since: 0.10.22
+ */
+guint64
+gst_app_src_get_max_bytes (GstAppSrc * appsrc)
+{
+ guint64 result;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), 0);
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ result = priv->max_bytes;
+ GST_DEBUG_OBJECT (appsrc, "getting max-bytes of %" G_GUINT64_FORMAT, result);
+ g_mutex_unlock (priv->mutex);
+
+ return result;
+}
+
+static void
+gst_app_src_set_latencies (GstAppSrc * appsrc, gboolean do_min, guint64 min,
+ gboolean do_max, guint64 max)
+{
+ GstAppSrcPrivate *priv = appsrc->priv;
+ gboolean changed = FALSE;
+
+ g_mutex_lock (priv->mutex);
+ if (do_min && priv->min_latency != min) {
+ priv->min_latency = min;
+ changed = TRUE;
+ }
+ if (do_max && priv->max_latency != max) {
+ priv->max_latency = max;
+ changed = TRUE;
+ }
+ g_mutex_unlock (priv->mutex);
+
+ if (changed) {
+ GST_DEBUG_OBJECT (appsrc, "posting latency changed");
+ gst_element_post_message (GST_ELEMENT_CAST (appsrc),
+ gst_message_new_latency (GST_OBJECT_CAST (appsrc)));
+ }
+}
+
+/**
+ * gst_app_src_set_latency:
+ * @appsrc: a #GstAppSrc
+ * @min: the min latency
+ * @max: the min latency
+ *
+ * Configure the @min and @max latency in @src. If @min is set to -1, the
+ * default latency calculations for pseudo-live sources will be used.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_set_latency (GstAppSrc * appsrc, guint64 min, guint64 max)
+{
+ gst_app_src_set_latencies (appsrc, TRUE, min, TRUE, max);
+}
+
+/**
+ * gst_app_src_get_latency:
+ * @appsrc: a #GstAppSrc
+ * @min: the min latency
+ * @max: the min latency
+ *
+ * Retrieve the min and max latencies in @min and @max respectively.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_app_src_get_latency (GstAppSrc * appsrc, guint64 * min, guint64 * max)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ if (min)
+ *min = priv->min_latency;
+ if (max)
+ *max = priv->max_latency;
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_src_set_emit_signals:
+ * @appsrc: a #GstAppSrc
+ * @emit: the new state
+ *
+ * Make appsrc emit the "new-preroll" and "new-buffer" signals. This option is
+ * by default disabled because signal emission is expensive and unneeded when
+ * the application prefers to operate in pull mode.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_app_src_set_emit_signals (GstAppSrc * appsrc, gboolean emit)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ priv->emit_signals = emit;
+ g_mutex_unlock (priv->mutex);
+}
+
+/**
+ * gst_app_src_get_emit_signals:
+ * @appsrc: a #GstAppSrc
+ *
+ * Check if appsrc will emit the "new-preroll" and "new-buffer" signals.
+ *
+ * Returns: %TRUE if @appsrc is emiting the "new-preroll" and "new-buffer"
+ * signals.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_app_src_get_emit_signals (GstAppSrc * appsrc)
+{
+ gboolean result;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), FALSE);
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ result = priv->emit_signals;
+ g_mutex_unlock (priv->mutex);
+
+ return result;
+}
+
+static GstFlowReturn
+gst_app_src_push_buffer_full (GstAppSrc * appsrc, GstBuffer * buffer,
+ gboolean steal_ref)
+{
+ gboolean first = TRUE;
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+
+ while (TRUE) {
+ /* can't accept buffers when we are flushing or EOS */
+ if (priv->flushing)
+ goto flushing;
+
+ if (priv->is_eos)
+ goto eos;
+
+ if (priv->max_bytes && priv->queued_bytes >= priv->max_bytes) {
+ GST_DEBUG_OBJECT (appsrc,
+ "queue filled (%" G_GUINT64_FORMAT " >= %" G_GUINT64_FORMAT ")",
+ priv->queued_bytes, priv->max_bytes);
+
+ if (first) {
+ gboolean emit;
+
+ emit = priv->emit_signals;
+ /* only signal on the first push */
+ g_mutex_unlock (priv->mutex);
+
+ if (priv->callbacks.enough_data)
+ priv->callbacks.enough_data (appsrc, priv->user_data);
+ else if (emit)
+ g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_ENOUGH_DATA], 0,
+ NULL);
+
+ g_mutex_lock (priv->mutex);
+ /* continue to check for flushing/eos after releasing the lock */
+ first = FALSE;
+ continue;
+ }
+ if (priv->block) {
+ GST_DEBUG_OBJECT (appsrc, "waiting for free space");
+ /* we are filled, wait until a buffer gets popped or when we
+ * flush. */
+ g_cond_wait (priv->cond, priv->mutex);
+ } else {
+ /* no need to wait for free space, we just pump more data into the
+ * queue hoping that the caller reacts to the enough-data signal and
+ * stops pushing buffers. */
+ break;
+ }
+ } else
+ break;
+ }
+
+ GST_DEBUG_OBJECT (appsrc, "queueing buffer %p", buffer);
+ if (!steal_ref)
+ gst_buffer_ref (buffer);
+ g_queue_push_tail (priv->queue, buffer);
+ priv->queued_bytes += gst_buffer_get_size (buffer);
+ g_cond_broadcast (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (appsrc, "refuse buffer %p, we are flushing", buffer);
+ if (steal_ref)
+ gst_buffer_unref (buffer);
+ g_mutex_unlock (priv->mutex);
+ return GST_FLOW_WRONG_STATE;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (appsrc, "refuse buffer %p, we are EOS", buffer);
+ if (steal_ref)
+ gst_buffer_unref (buffer);
+ g_mutex_unlock (priv->mutex);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+/**
+ * gst_app_src_push_buffer:
+ * @appsrc: a #GstAppSrc
+ * @buffer: a #GstBuffer to push
+ *
+ * Adds a buffer to the queue of buffers that the appsrc element will
+ * push to its source pad. This function takes ownership of the buffer.
+ *
+ * When the block property is TRUE, this function can block until free
+ * space becomes available in the queue.
+ *
+ * Returns: #GST_FLOW_OK when the buffer was successfuly queued.
+ * #GST_FLOW_WRONG_STATE when @appsrc is not PAUSED or PLAYING.
+ * #GST_FLOW_UNEXPECTED when EOS occured.
+ *
+ * Since: 0.10.22
+ */
+GstFlowReturn
+gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer)
+{
+ return gst_app_src_push_buffer_full (appsrc, buffer, TRUE);
+}
+
+/* push a buffer without stealing the ref of the buffer. This is used for the
+ * action signal. */
+static GstFlowReturn
+gst_app_src_push_buffer_action (GstAppSrc * appsrc, GstBuffer * buffer)
+{
+ return gst_app_src_push_buffer_full (appsrc, buffer, FALSE);
+}
+
+/**
+ * gst_app_src_end_of_stream:
+ * @appsrc: a #GstAppSrc
+ *
+ * Indicates to the appsrc element that the last buffer queued in the
+ * element is the last buffer of the stream.
+ *
+ * Returns: #GST_FLOW_OK when the EOS was successfuly queued.
+ * #GST_FLOW_WRONG_STATE when @appsrc is not PAUSED or PLAYING.
+ *
+ * Since: 0.10.22
+ */
+GstFlowReturn
+gst_app_src_end_of_stream (GstAppSrc * appsrc)
+{
+ GstAppSrcPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_APP_SRC (appsrc), GST_FLOW_ERROR);
+
+ priv = appsrc->priv;
+
+ g_mutex_lock (priv->mutex);
+ /* can't accept buffers when we are flushing. We can accept them when we are
+ * EOS although it will not do anything. */
+ if (priv->flushing)
+ goto flushing;
+
+ GST_DEBUG_OBJECT (appsrc, "sending EOS");
+ priv->is_eos = TRUE;
+ g_cond_broadcast (priv->cond);
+ g_mutex_unlock (priv->mutex);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+flushing:
+ {
+ g_mutex_unlock (priv->mutex);
+ GST_DEBUG_OBJECT (appsrc, "refuse EOS, we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/**
+ * gst_app_src_set_callbacks:
+ * @appsrc: a #GstAppSrc
+ * @callbacks: the callbacks
+ * @user_data: a user_data argument for the callbacks
+ * @notify: a destroy notify function
+ *
+ * Set callbacks which will be executed when data is needed, enough data has
+ * been collected or when a seek should be performed.
+ * This is an alternative to using the signals, it has lower overhead and is thus
+ * less expensive, but also less flexible.
+ *
+ * If callbacks are installed, no signals will be emited for performance
+ * reasons.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_app_src_set_callbacks (GstAppSrc * appsrc,
+ GstAppSrcCallbacks * callbacks, gpointer user_data, GDestroyNotify notify)
+{
+ GDestroyNotify old_notify;
+ GstAppSrcPrivate *priv;
+
+ g_return_if_fail (GST_IS_APP_SRC (appsrc));
+ g_return_if_fail (callbacks != NULL);
+
+ priv = appsrc->priv;
+
+ GST_OBJECT_LOCK (appsrc);
+ old_notify = priv->notify;
+
+ if (old_notify) {
+ gpointer old_data;
+
+ old_data = priv->user_data;
+
+ priv->user_data = NULL;
+ priv->notify = NULL;
+ GST_OBJECT_UNLOCK (appsrc);
+
+ old_notify (old_data);
+
+ GST_OBJECT_LOCK (appsrc);
+ }
+ priv->callbacks = *callbacks;
+ priv->user_data = user_data;
+ priv->notify = notify;
+ GST_OBJECT_UNLOCK (appsrc);
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_app_src_uri_get_type (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static gchar **
+gst_app_src_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "appsrc", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_app_src_uri_get_uri (GstURIHandler * handler)
+{
+ return "appsrc";
+}
+
+static gboolean
+gst_app_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *protocol;
+ gboolean ret;
+
+ protocol = gst_uri_get_protocol (uri);
+ ret = !strcmp (protocol, "appsrc");
+ g_free (protocol);
+
+ return ret;
+}
+
+static void
+gst_app_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_app_src_uri_get_type;
+ iface->get_protocols = gst_app_src_uri_get_protocols;
+ iface->get_uri = gst_app_src_uri_get_uri;
+ iface->set_uri = gst_app_src_uri_set_uri;
+}
diff --git a/gst-libs/gst/app/gstappsrc.h b/gst-libs/gst/app/gstappsrc.h
new file mode 100644
index 0000000..041cb68
--- /dev/null
+++ b/gst-libs/gst/app/gstappsrc.h
@@ -0,0 +1,153 @@
+/* GStreamer
+ * Copyright (C) 2007 David Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _GST_APP_SRC_H_
+#define _GST_APP_SRC_H_
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_APP_SRC \
+ (gst_app_src_get_type())
+#define GST_APP_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APP_SRC,GstAppSrc))
+#define GST_APP_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APP_SRC,GstAppSrcClass))
+#define GST_IS_APP_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APP_SRC))
+#define GST_IS_APP_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APP_SRC))
+/* Since 0.10.23 */
+#define GST_APP_SRC_CAST(obj) \
+ ((GstAppSrc*)(obj))
+
+typedef struct _GstAppSrc GstAppSrc;
+typedef struct _GstAppSrcClass GstAppSrcClass;
+typedef struct _GstAppSrcPrivate GstAppSrcPrivate;
+
+/**
+ * GstAppSrcCallbacks:
+ * @need_data: Called when the appsrc needs more data. A buffer or EOS should be
+ * pushed to appsrc from this thread or another thread. @length is just a hint
+ * and when it is set to -1, any number of bytes can be pushed into @appsrc.
+ * @enough_data: Called when appsrc has enough data. It is recommended that the
+ * application stops calling push-buffer until the need_data callback is
+ * emited again to avoid excessive buffer queueing.
+ * @seek_data: Called when a seek should be performed to the offset.
+ * The next push-buffer should produce buffers from the new @offset.
+ * This callback is only called for seekable stream types.
+ *
+ * A set of callbacks that can be installed on the appsrc with
+ * gst_app_src_set_callbacks().
+ *
+ * Since: 0.10.23
+ */
+typedef struct {
+ void (*need_data) (GstAppSrc *src, guint length, gpointer user_data);
+ void (*enough_data) (GstAppSrc *src, gpointer user_data);
+ gboolean (*seek_data) (GstAppSrc *src, guint64 offset, gpointer user_data);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+} GstAppSrcCallbacks;
+
+/**
+ * GstAppStreamType:
+ * @GST_APP_STREAM_TYPE_STREAM: No seeking is supported in the stream, such as a
+ * live stream.
+ * @GST_APP_STREAM_TYPE_SEEKABLE: The stream is seekable but seeking might not
+ * be very fast, such as data from a webserver.
+ * @GST_APP_STREAM_TYPE_RANDOM_ACCESS: The stream is seekable and seeking is fast,
+ * such as in a local file.
+ *
+ * The stream type.
+ */
+typedef enum
+{
+ GST_APP_STREAM_TYPE_STREAM,
+ GST_APP_STREAM_TYPE_SEEKABLE,
+ GST_APP_STREAM_TYPE_RANDOM_ACCESS
+} GstAppStreamType;
+
+struct _GstAppSrc
+{
+ GstBaseSrc basesrc;
+
+ /*< private >*/
+ GstAppSrcPrivate *priv;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstAppSrcClass
+{
+ GstBaseSrcClass basesrc_class;
+
+ /* signals */
+ void (*need_data) (GstAppSrc *src, guint length);
+ void (*enough_data) (GstAppSrc *src);
+ gboolean (*seek_data) (GstAppSrc *src, guint64 offset);
+
+ /* actions */
+ GstFlowReturn (*push_buffer) (GstAppSrc *src, GstBuffer *buffer);
+ GstFlowReturn (*end_of_stream) (GstAppSrc *src);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_app_src_get_type(void);
+
+/* GType getter for GstAppStreamType, since 0.10.32 */
+#define GST_TYPE_APP_STREAM_TYPE (gst_app_stream_type_get_type ())
+GType gst_app_stream_type_get_type (void);
+
+void gst_app_src_set_caps (GstAppSrc *appsrc, const GstCaps *caps);
+GstCaps* gst_app_src_get_caps (GstAppSrc *appsrc);
+
+void gst_app_src_set_size (GstAppSrc *appsrc, gint64 size);
+gint64 gst_app_src_get_size (GstAppSrc *appsrc);
+
+void gst_app_src_set_stream_type (GstAppSrc *appsrc, GstAppStreamType type);
+GstAppStreamType gst_app_src_get_stream_type (GstAppSrc *appsrc);
+
+void gst_app_src_set_max_bytes (GstAppSrc *appsrc, guint64 max);
+guint64 gst_app_src_get_max_bytes (GstAppSrc *appsrc);
+
+void gst_app_src_set_latency (GstAppSrc *appsrc, guint64 min, guint64 max);
+void gst_app_src_get_latency (GstAppSrc *appsrc, guint64 *min, guint64 *max);
+
+void gst_app_src_set_emit_signals (GstAppSrc *appsrc, gboolean emit);
+gboolean gst_app_src_get_emit_signals (GstAppSrc *appsrc);
+
+GstFlowReturn gst_app_src_push_buffer (GstAppSrc *appsrc, GstBuffer *buffer);
+GstFlowReturn gst_app_src_end_of_stream (GstAppSrc *appsrc);
+
+void gst_app_src_set_callbacks (GstAppSrc * appsrc,
+ GstAppSrcCallbacks *callbacks,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+G_END_DECLS
+
+#endif
+
diff --git a/gst-libs/gst/audio/Makefile.am b/gst-libs/gst/audio/Makefile.am
new file mode 100644
index 0000000..8732064
--- /dev/null
+++ b/gst-libs/gst/audio/Makefile.am
@@ -0,0 +1,136 @@
+# variables used for enum/marshal generation
+glib_enum_headers= \
+ multichannel.h \
+ gstringbuffer.h
+
+glib_enum_define = GST_AUDIO
+glib_gen_prefix = gst_audio
+glib_gen_basename = audio
+
+built_sources = audio-enumtypes.c
+built_headers = audio-enumtypes.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+
+lib_LTLIBRARIES = \
+ libgstaudio-@GST_MAJORMINOR@.la
+
+CLEANFILES = $(BUILT_SOURCES)
+
+# FIXME 0.11: rename GstBaseAudioSink to GstAudioBaseSink or merge with GstAudioSink
+libgstaudio_@GST_MAJORMINOR@_la_SOURCES = \
+ audio.c \
+ gstringbuffer.c \
+ gstaudioclock.c \
+ mixerutils.c \
+ multichannel.c \
+ gstaudiodecoder.c \
+ gstaudioencoder.c \
+ gstbaseaudiosink.c \
+ gstbaseaudiosrc.c \
+ gstaudiofilter.c \
+ gstaudiosink.c \
+ gstaudiosrc.c \
+ gstaudioiec61937.c
+nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES = $(built_sources) $(built_headers)
+
+libgstaudio_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/audio
+libgstaudio_@GST_MAJORMINOR@include_HEADERS = \
+ audio.h \
+ gstringbuffer.h \
+ gstaudioclock.h \
+ gstaudiofilter.h \
+ gstaudiodecoder.h \
+ gstaudioencoder.h \
+ gstbaseaudiosink.h \
+ gstbaseaudiosrc.h \
+ gstaudiosink.h \
+ gstaudiosrc.h \
+ mixerutils.h \
+ multichannel.h \
+ gstaudioiec61937.h
+
+nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS = \
+ audio-enumtypes.h
+
+libgstaudio_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstaudio_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la
+libgstaudio_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstAudio-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+gir_headers+=$(patsubst %,$(builddir)/%, $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/audio/%',$(libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+gir_cincludes+=$(patsubst %,--c-include='gst/audio/%',$(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+
+GstAudio-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstaudio-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstAudio \
+ --nsversion=@GST_MAJORMINOR@ \
+ --warn-all \
+ --strip-prefix=Gst \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_builddir)/gst-libs \
+ $(gir_cincludes) \
+ --add-include-path=$(builddir)/../interfaces \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstaudio-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --include=GstInterfaces-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg gstreamer-interfaces-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-audio-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=$(builddir)/../interfaces \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstaudio -:SHARED libgstaudio-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudio_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstaudio_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/audio/Makefile.in b/gst-libs/gst/audio/Makefile.in
new file mode 100644
index 0000000..6acb19a
--- /dev/null
+++ b/gst-libs/gst/audio/Makefile.in
@@ -0,0 +1,1169 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/gst-glib-gen.mak TODO
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/audio
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" \
+ "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstaudio_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la
+am_libgstaudio_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstaudio_@GST_MAJORMINOR@_la-audio.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo \
+ libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo
+am__objects_1 = libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo
+am__objects_2 =
+nodist_libgstaudio_@GST_MAJORMINOR@_la_OBJECTS = $(am__objects_1) \
+ $(am__objects_2)
+libgstaudio_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstaudio_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstaudio_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstaudio_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# variables used for enum/marshal generation
+glib_enum_headers = \
+ multichannel.h \
+ gstringbuffer.h
+
+glib_enum_define = GST_AUDIO
+glib_gen_prefix = gst_audio
+glib_gen_basename = audio
+built_sources = audio-enumtypes.c
+built_headers = audio-enumtypes.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+lib_LTLIBRARIES = \
+ libgstaudio-@GST_MAJORMINOR@.la
+
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+
+# FIXME 0.11: rename GstBaseAudioSink to GstAudioBaseSink or merge with GstAudioSink
+libgstaudio_@GST_MAJORMINOR@_la_SOURCES = \
+ audio.c \
+ gstringbuffer.c \
+ gstaudioclock.c \
+ mixerutils.c \
+ multichannel.c \
+ gstaudiodecoder.c \
+ gstaudioencoder.c \
+ gstbaseaudiosink.c \
+ gstbaseaudiosrc.c \
+ gstaudiofilter.c \
+ gstaudiosink.c \
+ gstaudiosrc.c \
+ gstaudioiec61937.c
+
+nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES = $(built_sources) $(built_headers)
+libgstaudio_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/audio
+libgstaudio_@GST_MAJORMINOR@include_HEADERS = \
+ audio.h \
+ gstringbuffer.h \
+ gstaudioclock.h \
+ gstaudiofilter.h \
+ gstaudiodecoder.h \
+ gstaudioencoder.h \
+ gstbaseaudiosink.h \
+ gstbaseaudiosrc.h \
+ gstaudiosink.h \
+ gstaudiosrc.h \
+ mixerutils.h \
+ multichannel.h \
+ gstaudioiec61937.h
+
+nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS = \
+ audio-enumtypes.h
+
+libgstaudio_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstaudio_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la
+
+libgstaudio_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstAudio-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstaudio_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/audio/%',$(libgstaudio_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/audio/%',$(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/audio/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/audio/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstaudio-@GST_MAJORMINOR@.la: $(libgstaudio_@GST_MAJORMINOR@_la_OBJECTS) $(libgstaudio_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstaudio_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstaudio_@GST_MAJORMINOR@_la_OBJECTS) $(libgstaudio_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-mixerutils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-multichannel.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstaudio_@GST_MAJORMINOR@_la-audio.lo: audio.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-audio.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-audio.lo `test -f 'audio.c' || echo '$(srcdir)/'`audio.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio.c' object='libgstaudio_@GST_MAJORMINOR@_la-audio.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-audio.lo `test -f 'audio.c' || echo '$(srcdir)/'`audio.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo: gstringbuffer.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo `test -f 'gstringbuffer.c' || echo '$(srcdir)/'`gstringbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstringbuffer.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstringbuffer.lo `test -f 'gstringbuffer.c' || echo '$(srcdir)/'`gstringbuffer.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo: gstaudioclock.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo `test -f 'gstaudioclock.c' || echo '$(srcdir)/'`gstaudioclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioclock.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioclock.lo `test -f 'gstaudioclock.c' || echo '$(srcdir)/'`gstaudioclock.c
+
+libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo: mixerutils.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-mixerutils.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo `test -f 'mixerutils.c' || echo '$(srcdir)/'`mixerutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-mixerutils.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-mixerutils.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mixerutils.c' object='libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-mixerutils.lo `test -f 'mixerutils.c' || echo '$(srcdir)/'`mixerutils.c
+
+libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo: multichannel.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-multichannel.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo `test -f 'multichannel.c' || echo '$(srcdir)/'`multichannel.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-multichannel.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-multichannel.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='multichannel.c' object='libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-multichannel.lo `test -f 'multichannel.c' || echo '$(srcdir)/'`multichannel.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo: gstaudiodecoder.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo `test -f 'gstaudiodecoder.c' || echo '$(srcdir)/'`gstaudiodecoder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiodecoder.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiodecoder.lo `test -f 'gstaudiodecoder.c' || echo '$(srcdir)/'`gstaudiodecoder.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo: gstaudioencoder.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo `test -f 'gstaudioencoder.c' || echo '$(srcdir)/'`gstaudioencoder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioencoder.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioencoder.lo `test -f 'gstaudioencoder.c' || echo '$(srcdir)/'`gstaudioencoder.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo: gstbaseaudiosink.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo `test -f 'gstbaseaudiosink.c' || echo '$(srcdir)/'`gstbaseaudiosink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbaseaudiosink.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosink.lo `test -f 'gstbaseaudiosink.c' || echo '$(srcdir)/'`gstbaseaudiosink.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo: gstbaseaudiosrc.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo `test -f 'gstbaseaudiosrc.c' || echo '$(srcdir)/'`gstbaseaudiosrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbaseaudiosrc.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstbaseaudiosrc.lo `test -f 'gstbaseaudiosrc.c' || echo '$(srcdir)/'`gstbaseaudiosrc.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo: gstaudiofilter.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo `test -f 'gstaudiofilter.c' || echo '$(srcdir)/'`gstaudiofilter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiofilter.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiofilter.lo `test -f 'gstaudiofilter.c' || echo '$(srcdir)/'`gstaudiofilter.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo: gstaudiosink.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo `test -f 'gstaudiosink.c' || echo '$(srcdir)/'`gstaudiosink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiosink.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiosink.lo `test -f 'gstaudiosink.c' || echo '$(srcdir)/'`gstaudiosink.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo: gstaudiosrc.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo `test -f 'gstaudiosrc.c' || echo '$(srcdir)/'`gstaudiosrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiosrc.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudiosrc.lo `test -f 'gstaudiosrc.c' || echo '$(srcdir)/'`gstaudiosrc.c
+
+libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo: gstaudioiec61937.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo `test -f 'gstaudioiec61937.c' || echo '$(srcdir)/'`gstaudioiec61937.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioiec61937.c' object='libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-gstaudioiec61937.lo `test -f 'gstaudioiec61937.c' || echo '$(srcdir)/'`gstaudioiec61937.c
+
+libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo: audio-enumtypes.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) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.Tpo -c -o libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo `test -f 'audio-enumtypes.c' || echo '$(srcdir)/'`audio-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.Tpo $(DEPDIR)/libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio-enumtypes.c' object='libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstaudio_@GST_MAJORMINOR@_la-audio-enumtypes.lo `test -f 'audio-enumtypes.c' || echo '$(srcdir)/'`audio-enumtypes.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstaudio_@GST_MAJORMINOR@includeHEADERS: $(libgstaudio_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstaudio_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstaudio_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstaudio_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstaudio_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstaudio_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstaudio_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" && rm -f $$files
+install-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS: $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstaudio_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)"
+ @list='$(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstaudio_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstaudio_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)" "$(DESTDIR)$(libgstaudio_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ install-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstaudio_@GST_MAJORMINOR@includeHEADERS install-man \
+ install-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstaudio_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstAudio-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstaudio-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstAudio \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --warn-all \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(builddir)/../interfaces \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstaudio-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstBase-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstInterfaces-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-interfaces-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-audio-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/../interfaces \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstaudio -:SHARED libgstaudio-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudio_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudio_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudio_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstaudio_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstaudio_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/audio/TODO b/gst-libs/gst/audio/TODO
new file mode 100644
index 0000000..887f340
--- /dev/null
+++ b/gst-libs/gst/audio/TODO
@@ -0,0 +1,15 @@
+TODO
+----
+
+- audio base classes:
+ - GstBaseAudioSink
+ - parse caps into rinbuffer spec, also make sure surround sound
+ is parsed correctly.
+ - implement seek/query/convert
+ - implement getrange scheduling
+ - simple resampling
+ - more accurate master/slave calibration handling
+ - faster audio cutoff when going to PAUSED
+ - resubmit samples from ringbuffer when doing PAUSED->PLAYING again
+ - the ringbuffer should have a state where it is filling up the
+ buffer before going to playing.
diff --git a/gst-libs/gst/audio/audio.c b/gst-libs/gst/audio/audio.c
new file mode 100644
index 0000000..49a4878
--- /dev/null
+++ b/gst-libs/gst/audio/audio.c
@@ -0,0 +1,700 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:gstaudio
+ * @short_description: Support library for audio elements
+ *
+ * This library contains some helper functions for audio elements.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include "audio.h"
+#include "audio-enumtypes.h"
+
+#include <gst/gststructure.h>
+
+#define SINT (GST_AUDIO_FORMAT_FLAG_INTEGER | GST_AUDIO_FORMAT_FLAG_SIGNED)
+#define UINT (GST_AUDIO_FORMAT_FLAG_INTEGER)
+
+#define MAKE_FORMAT(str,desc,flags,end,width,depth,silent) \
+ { GST_AUDIO_FORMAT_ ##str, G_STRINGIFY(str), desc, flags, end, width, depth, silent }
+
+#define SILENT_0 { 0, 0, 0, 0, 0, 0, 0, 0 }
+#define SILENT_U8 { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }
+#define SILENT_U16LE { 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80 }
+#define SILENT_U16BE { 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 }
+#define SILENT_U24_32LE { 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00 }
+#define SILENT_U24_32BE { 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 }
+#define SILENT_U32LE { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80 }
+#define SILENT_U32BE { 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 }
+#define SILENT_U24LE { 0x00, 0x00, 0x80, 0x00, 0x00, 0x80 }
+#define SILENT_U24BE { 0x80, 0x00, 0x00, 0x80, 0x00, 0x00 }
+#define SILENT_U20LE { 0x00, 0x00, 0x08, 0x00, 0x00, 0x08 }
+#define SILENT_U20BE { 0x08, 0x00, 0x00, 0x08, 0x00, 0x00 }
+#define SILENT_U18LE { 0x00, 0x00, 0x02, 0x00, 0x00, 0x02 }
+#define SILENT_U18BE { 0x02, 0x00, 0x00, 0x02, 0x00, 0x00 }
+
+static GstAudioFormatInfo formats[] = {
+ {GST_AUDIO_FORMAT_UNKNOWN, "UNKNOWN", 0, 0, 0, 0},
+ /* 8 bit */
+ MAKE_FORMAT (S8, "8-bit signed PCM audio", SINT, 0, 8, 8, SILENT_0),
+ MAKE_FORMAT (U8, "8-bit unsigned PCM audio", UINT, 0, 8, 8, SILENT_U8),
+ /* 16 bit */
+ MAKE_FORMAT (S16LE, "16-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 16, 16,
+ SILENT_0),
+ MAKE_FORMAT (S16BE, "16-bit signed PCM audio", SINT, G_BIG_ENDIAN, 16, 16,
+ SILENT_0),
+ MAKE_FORMAT (U16LE, "16-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 16,
+ 16, SILENT_U16LE),
+ MAKE_FORMAT (U16BE, "16-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 16, 16,
+ SILENT_U16BE),
+ /* 24 bit in low 3 bytes of 32 bits */
+ MAKE_FORMAT (S24_32LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 32,
+ 24, SILENT_0),
+ MAKE_FORMAT (S24_32BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32, 24,
+ SILENT_0),
+ MAKE_FORMAT (U24_32LE, "24-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 32,
+ 24, SILENT_U24_32LE),
+ MAKE_FORMAT (U24_32BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 32,
+ 24, SILENT_U24_32BE),
+ /* 32 bit */
+ MAKE_FORMAT (S32LE, "32-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 32, 32,
+ SILENT_0),
+ MAKE_FORMAT (S32BE, "32-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32, 32,
+ SILENT_0),
+ MAKE_FORMAT (U32LE, "32-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 32,
+ 32, SILENT_U32LE),
+ MAKE_FORMAT (U32BE, "32-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 32, 32,
+ SILENT_U32BE),
+ /* 24 bit in 3 bytes */
+ MAKE_FORMAT (S24LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 24,
+ SILENT_0),
+ MAKE_FORMAT (S24BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 24,
+ SILENT_0),
+ MAKE_FORMAT (U24LE, "24-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
+ 24, SILENT_U24LE),
+ MAKE_FORMAT (U24BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 24,
+ SILENT_U24BE),
+ /* 20 bit in 3 bytes */
+ MAKE_FORMAT (S20LE, "20-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 20,
+ SILENT_0),
+ MAKE_FORMAT (S20BE, "20-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 20,
+ SILENT_0),
+ MAKE_FORMAT (U20LE, "20-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
+ 20, SILENT_U20LE),
+ MAKE_FORMAT (U20BE, "20-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 20,
+ SILENT_U20BE),
+ /* 18 bit in 3 bytes */
+ MAKE_FORMAT (S18LE, "18-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 18,
+ SILENT_0),
+ MAKE_FORMAT (S18BE, "18-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 18,
+ SILENT_0),
+ MAKE_FORMAT (U18LE, "18-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
+ 18, SILENT_U18LE),
+ MAKE_FORMAT (U18BE, "18-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 18,
+ SILENT_U18BE),
+ /* float */
+ MAKE_FORMAT (F32LE, "32-bit floating-point audio",
+ GST_AUDIO_FORMAT_FLAG_FLOAT, G_LITTLE_ENDIAN, 32, 32,
+ SILENT_0),
+ MAKE_FORMAT (F32BE, "32-bit floating-point audio",
+ GST_AUDIO_FORMAT_FLAG_FLOAT, G_BIG_ENDIAN, 32, 32,
+ SILENT_0),
+ MAKE_FORMAT (F64LE, "64-bit floating-point audio",
+ GST_AUDIO_FORMAT_FLAG_FLOAT, G_LITTLE_ENDIAN, 64, 64,
+ SILENT_0),
+ MAKE_FORMAT (F64BE, "64-bit floating-point audio",
+ GST_AUDIO_FORMAT_FLAG_FLOAT, G_BIG_ENDIAN, 64, 64,
+ SILENT_0)
+};
+
+/**
+ * gst_audio_format_build_int:
+ * @sign: signed or unsigned format
+ * @endianness: G_LITTLE_ENDIAN or G_BIG_ENDIAN
+ * @width: amount of bits used per sample
+ * @depth: amount of used bits in @width
+ *
+ * Construct a #GstAudioFormat with given parameters.
+ *
+ * Returns: a #GstAudioFormat or GST_AUDIO_FORMAT_UNKNOWN when no audio format
+ * exists with the given parameters.
+ */
+GstAudioFormat
+gst_audio_format_build_integer (gboolean sign, gint endianness,
+ gint width, gint depth)
+{
+ gint i, e;
+
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ GstAudioFormatInfo *finfo = &formats[i];
+
+ /* must be int */
+ if (!GST_AUDIO_FORMAT_INFO_IS_INTEGER (finfo))
+ continue;
+ /* width and depth must match */
+ if (width != GST_AUDIO_FORMAT_INFO_WIDTH (finfo))
+ continue;
+ if (depth != GST_AUDIO_FORMAT_INFO_DEPTH (finfo))
+ continue;
+ /* if there is endianness, it must match */
+ e = GST_AUDIO_FORMAT_INFO_ENDIANNESS (finfo);
+ if (e && e != endianness)
+ continue;
+ /* check sign */
+ if (sign && !GST_AUDIO_FORMAT_INFO_IS_SIGNED (finfo))
+ continue;
+
+ return GST_AUDIO_FORMAT_INFO_FORMAT (finfo);
+ }
+ return GST_AUDIO_FORMAT_UNKNOWN;
+}
+
+/**
+ * gst_audio_format_from_string:
+ * @format: a format string
+ *
+ * Convert the @format string to its #GstAudioFormat.
+ *
+ * Returns: the #GstAudioFormat for @format or GST_AUDIO_FORMAT_UNKNOWN when the
+ * string is not a known format.
+ */
+GstAudioFormat
+gst_audio_format_from_string (const gchar * format)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ if (strcmp (GST_AUDIO_FORMAT_INFO_NAME (&formats[i]), format) == 0)
+ return GST_AUDIO_FORMAT_INFO_FORMAT (&formats[i]);
+ }
+ return GST_AUDIO_FORMAT_UNKNOWN;
+}
+
+const gchar *
+gst_audio_format_to_string (GstAudioFormat format)
+{
+ g_return_val_if_fail (format != GST_AUDIO_FORMAT_UNKNOWN, NULL);
+
+ if (format >= G_N_ELEMENTS (formats))
+ return NULL;
+
+ return GST_AUDIO_FORMAT_INFO_NAME (&formats[format]);
+}
+
+/**
+ * gst_audio_format_get_info:
+ * @format: a #GstAudioFormat
+ *
+ * Get the #GstAudioFormatInfo for @format
+ *
+ * Returns: The #GstAudioFormatInfo for @format.
+ */
+const GstAudioFormatInfo *
+gst_audio_format_get_info (GstAudioFormat format)
+{
+ g_return_val_if_fail (format != GST_AUDIO_FORMAT_UNKNOWN, NULL);
+ g_return_val_if_fail (format < G_N_ELEMENTS (formats), NULL);
+
+ return &formats[format];
+}
+
+/**
+ * gst_audio_format_fill_silence:
+ * @info: a #GstAudioFormatInfo
+ * @dest: a destination to fill
+ * @length: the length to fill
+ *
+ * Fill @length bytes in @dest with silence samples for @info.
+ */
+void
+gst_audio_format_fill_silence (const GstAudioFormatInfo * info,
+ gpointer dest, gsize length)
+{
+ guint8 *dptr = dest;
+
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (dest != NULL);
+
+ if (info->flags & GST_AUDIO_FORMAT_FLAG_FLOAT ||
+ info->flags & GST_AUDIO_FORMAT_FLAG_SIGNED) {
+ /* float or signed always 0 */
+ memset (dest, 0, length);
+ } else {
+ gint i, j, bps = info->width >> 3;
+
+ switch (bps) {
+ case 1:
+ memset (dest, info->silence[0], length);
+ break;
+ default:
+ for (i = 0; i < length; i += bps) {
+ for (j = 0; j < bps; j++)
+ *dptr++ = info->silence[j];
+ }
+ break;
+ }
+ }
+}
+
+
+/**
+ * gst_audio_info_init:
+ * @info: a #GstAudioInfo
+ *
+ * Initialize @info with default values.
+ */
+void
+gst_audio_info_init (GstAudioInfo * info)
+{
+ g_return_if_fail (info != NULL);
+
+ memset (info, 0, sizeof (GstAudioInfo));
+}
+
+/**
+ * gst_audio_info_set_format:
+ * @info: a #GstAudioInfo
+ * @format: the format
+ * @rate: the samplerate
+ * @channels: the number of channels
+ *
+ * Set the default info for the audio info of @format and @rate and @channels.
+ */
+void
+gst_audio_info_set_format (GstAudioInfo * info, GstAudioFormat format,
+ gint rate, gint channels)
+{
+ const GstAudioFormatInfo *finfo;
+
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (format != GST_AUDIO_FORMAT_UNKNOWN);
+
+ finfo = &formats[format];
+
+ info->flags = 0;
+ info->finfo = finfo;
+ info->rate = rate;
+ info->channels = channels;
+ info->bpf = (finfo->width * channels) / 8;
+}
+
+/**
+ * gst_audio_info_from_caps:
+ * @info: a #GstAudioInfo
+ * @caps: a #GstCaps
+ *
+ * Parse @caps and update @info.
+ *
+ * Returns: TRUE if @caps could be parsed
+ */
+gboolean
+gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps)
+{
+ GstStructure *str;
+ const gchar *s;
+ GstAudioFormat format;
+ gint rate, channels;
+ const GValue *pos_val_arr, *pos_val_entry;
+ gint i;
+
+ g_return_val_if_fail (info != NULL, FALSE);
+ g_return_val_if_fail (caps != NULL, FALSE);
+ g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE);
+
+ GST_DEBUG ("parsing caps %" GST_PTR_FORMAT, caps);
+
+ str = gst_caps_get_structure (caps, 0);
+
+ if (!gst_structure_has_name (str, "audio/x-raw"))
+ goto wrong_name;
+
+ if (!(s = gst_structure_get_string (str, "format")))
+ goto no_format;
+
+ format = gst_audio_format_from_string (s);
+ if (format == GST_AUDIO_FORMAT_UNKNOWN)
+ goto unknown_format;
+
+ if (!gst_structure_get_int (str, "rate", &rate))
+ goto no_rate;
+ if (!gst_structure_get_int (str, "channels", &channels))
+ goto no_channels;
+
+ gst_audio_info_set_format (info, format, rate, channels);
+
+ pos_val_arr = gst_structure_get_value (str, "channel-positions");
+ if (pos_val_arr) {
+ guint max_pos = MAX (channels, 64);
+ for (i = 0; i < max_pos; i++) {
+ pos_val_entry = gst_value_array_get_value (pos_val_arr, i);
+ info->position[i] = g_value_get_enum (pos_val_entry);
+ }
+ } else {
+ info->flags |= GST_AUDIO_FLAG_DEFAULT_POSITIONS;
+ /* FIXME, set default positions */
+ }
+
+ return TRUE;
+
+ /* ERROR */
+wrong_name:
+ {
+ GST_ERROR ("wrong name, expected audio/x-raw");
+ return FALSE;
+ }
+no_format:
+ {
+ GST_ERROR ("no format given");
+ return FALSE;
+ }
+unknown_format:
+ {
+ GST_ERROR ("unknown format given");
+ return FALSE;
+ }
+no_rate:
+ {
+ GST_ERROR ("no rate property given");
+ return FALSE;
+ }
+no_channels:
+ {
+ GST_ERROR ("no channels property given");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_audio_info_to_caps:
+ * @info: a #GstAudioInfo
+ *
+ * Convert the values of @info into a #GstCaps.
+ *
+ * Returns: (transfer full): the new #GstCaps containing the
+ * info of @info.
+ */
+GstCaps *
+gst_audio_info_to_caps (GstAudioInfo * info)
+{
+ GstCaps *caps;
+ const gchar *format;
+
+ g_return_val_if_fail (info != NULL, NULL);
+ g_return_val_if_fail (info->finfo != NULL, NULL);
+ g_return_val_if_fail (info->finfo->format != GST_AUDIO_FORMAT_UNKNOWN, NULL);
+
+ format = gst_audio_format_to_string (info->finfo->format);
+ g_return_val_if_fail (format != NULL, NULL);
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, format,
+ "rate", G_TYPE_INT, info->rate,
+ "channels", G_TYPE_INT, info->channels, NULL);
+
+ if (info->channels > 2) {
+ GValue pos_val_arr = { 0 }
+ , pos_val_entry = {
+ 0};
+ gint i, max_pos;
+ GstStructure *str;
+
+ /* build gvaluearray from positions */
+ g_value_init (&pos_val_arr, GST_TYPE_ARRAY);
+ g_value_init (&pos_val_entry, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ max_pos = MAX (info->channels, 64);
+ for (i = 0; i < max_pos; i++) {
+ g_value_set_enum (&pos_val_entry, info->position[i]);
+ gst_value_array_append_value (&pos_val_arr, &pos_val_entry);
+ }
+ g_value_unset (&pos_val_entry);
+
+ /* add to structure */
+ str = gst_caps_get_structure (caps, 0);
+ gst_structure_set_value (str, "channel-positions", &pos_val_arr);
+ g_value_unset (&pos_val_arr);
+ }
+
+ return caps;
+}
+
+/**
+ * gst_audio_format_convert:
+ * @info: a #GstAudioInfo
+ * @src_format: #GstFormat of the @src_value
+ * @src_value: value to convert
+ * @dest_format: #GstFormat of the @dest_value
+ * @dest_value: pointer to destination value
+ *
+ * Converts among various #GstFormat types. This function handles
+ * GST_FORMAT_BYTES, GST_FORMAT_TIME, and GST_FORMAT_DEFAULT. For
+ * raw audio, GST_FORMAT_DEFAULT corresponds to audio frames. This
+ * function can be used to handle pad queries of the type GST_QUERY_CONVERT.
+ *
+ * Returns: TRUE if the conversion was successful.
+ */
+gboolean
+gst_audio_info_convert (GstAudioInfo * info,
+ GstFormat src_fmt, gint64 src_val, GstFormat dest_fmt, gint64 * dest_val)
+{
+ gboolean res = TRUE;
+ gint bpf, rate;
+
+ GST_DEBUG ("converting value %" G_GINT64_FORMAT " from %s (%d) to %s (%d)",
+ src_val, gst_format_get_name (src_fmt), src_fmt,
+ gst_format_get_name (dest_fmt), dest_fmt);
+
+ if (src_fmt == dest_fmt || src_val == -1) {
+ *dest_val = src_val;
+ goto done;
+ }
+
+ /* get important info */
+ bpf = GST_AUDIO_INFO_BPF (info);
+ rate = GST_AUDIO_INFO_RATE (info);
+
+ if (bpf == 0 || rate == 0) {
+ GST_DEBUG ("no rate or bpf configured");
+ res = FALSE;
+ goto done;
+ }
+
+ switch (src_fmt) {
+ case GST_FORMAT_BYTES:
+ switch (dest_fmt) {
+ case GST_FORMAT_TIME:
+ *dest_val = GST_FRAMES_TO_CLOCK_TIME (src_val / bpf, rate);
+ break;
+ case GST_FORMAT_DEFAULT:
+ *dest_val = src_val / bpf;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ switch (dest_fmt) {
+ case GST_FORMAT_TIME:
+ *dest_val = GST_FRAMES_TO_CLOCK_TIME (src_val, rate);
+ break;
+ case GST_FORMAT_BYTES:
+ *dest_val = src_val * bpf;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (dest_fmt) {
+ case GST_FORMAT_DEFAULT:
+ *dest_val = GST_CLOCK_TIME_TO_FRAMES (src_val, rate);
+ break;
+ case GST_FORMAT_BYTES:
+ *dest_val = GST_CLOCK_TIME_TO_FRAMES (src_val, rate);
+ *dest_val *= bpf;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+done:
+ GST_DEBUG ("ret=%d result %" G_GINT64_FORMAT, res, *dest_val);
+
+ return res;
+}
+
+/**
+ * gst_audio_buffer_clip:
+ * @buffer: The buffer to clip.
+ * @segment: Segment in %GST_FORMAT_TIME or %GST_FORMAT_DEFAULT to which
+ * the buffer should be clipped.
+ * @rate: sample rate.
+ * @bpf: size of one audio frame in bytes. This is the size of one sample
+ * * channels.
+ *
+ * Clip the the buffer to the given %GstSegment.
+ *
+ * After calling this function the caller does not own a reference to
+ * @buffer anymore.
+ *
+ * Returns: %NULL if the buffer is completely outside the configured segment,
+ * otherwise the clipped buffer is returned.
+ *
+ * If the buffer has no timestamp, it is assumed to be inside the segment and
+ * is not clipped
+ *
+ * Since: 0.10.14
+ */
+GstBuffer *
+gst_audio_buffer_clip (GstBuffer * buffer, GstSegment * segment, gint rate,
+ gint bpf)
+{
+ GstBuffer *ret;
+ GstClockTime timestamp = GST_CLOCK_TIME_NONE, duration = GST_CLOCK_TIME_NONE;
+ guint64 offset = GST_BUFFER_OFFSET_NONE, offset_end = GST_BUFFER_OFFSET_NONE;
+ gsize trim, size;
+ gboolean change_duration = TRUE, change_offset = TRUE, change_offset_end =
+ TRUE;
+
+ g_return_val_if_fail (segment->format == GST_FORMAT_TIME ||
+ segment->format == GST_FORMAT_DEFAULT, buffer);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+
+ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ /* No timestamp - assume the buffer is completely in the segment */
+ return buffer;
+
+ /* Get copies of the buffer metadata to change later.
+ * Calculate the missing values for the calculations,
+ * they won't be changed later though. */
+
+ trim = 0;
+ size = gst_buffer_get_size (buffer);
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ GST_DEBUG ("timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp));
+ if (GST_BUFFER_DURATION_IS_VALID (buffer)) {
+ duration = GST_BUFFER_DURATION (buffer);
+ } else {
+ change_duration = FALSE;
+ duration = gst_util_uint64_scale (size / bpf, GST_SECOND, rate);
+ }
+
+ if (GST_BUFFER_OFFSET_IS_VALID (buffer)) {
+ offset = GST_BUFFER_OFFSET (buffer);
+ } else {
+ change_offset = FALSE;
+ offset = 0;
+ }
+
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buffer)) {
+ offset_end = GST_BUFFER_OFFSET_END (buffer);
+ } else {
+ change_offset_end = FALSE;
+ offset_end = offset + size / bpf;
+ }
+
+ if (segment->format == GST_FORMAT_TIME) {
+ /* Handle clipping for GST_FORMAT_TIME */
+
+ guint64 start, stop, cstart, cstop, diff;
+
+ start = timestamp;
+ stop = timestamp + duration;
+
+ if (gst_segment_clip (segment, GST_FORMAT_TIME,
+ start, stop, &cstart, &cstop)) {
+
+ diff = cstart - start;
+ if (diff > 0) {
+ timestamp = cstart;
+
+ if (change_duration)
+ duration -= diff;
+
+ diff = gst_util_uint64_scale (diff, rate, GST_SECOND);
+ if (change_offset)
+ offset += diff;
+ trim += diff * bpf;
+ size -= diff * bpf;
+ }
+
+ diff = stop - cstop;
+ if (diff > 0) {
+ /* duration is always valid if stop is valid */
+ duration -= diff;
+
+ diff = gst_util_uint64_scale (diff, rate, GST_SECOND);
+ if (change_offset_end)
+ offset_end -= diff;
+ size -= diff * bpf;
+ }
+ } else {
+ gst_buffer_unref (buffer);
+ return NULL;
+ }
+ } else {
+ /* Handle clipping for GST_FORMAT_DEFAULT */
+ guint64 start, stop, cstart, cstop, diff;
+
+ g_return_val_if_fail (GST_BUFFER_OFFSET_IS_VALID (buffer), buffer);
+
+ start = offset;
+ stop = offset_end;
+
+ if (gst_segment_clip (segment, GST_FORMAT_DEFAULT,
+ start, stop, &cstart, &cstop)) {
+
+ diff = cstart - start;
+ if (diff > 0) {
+ offset = cstart;
+
+ timestamp = gst_util_uint64_scale (cstart, GST_SECOND, rate);
+
+ if (change_duration)
+ duration -= gst_util_uint64_scale (diff, GST_SECOND, rate);
+
+ trim += diff * bpf;
+ size -= diff * bpf;
+ }
+
+ diff = stop - cstop;
+ if (diff > 0) {
+ offset_end = cstop;
+
+ if (change_duration)
+ duration -= gst_util_uint64_scale (diff, GST_SECOND, rate);
+
+ size -= diff * bpf;
+ }
+ } else {
+ gst_buffer_unref (buffer);
+ return NULL;
+ }
+ }
+
+ /* Get a writable buffer and apply all changes */
+ GST_DEBUG ("trim %" G_GSIZE_FORMAT " size %" G_GSIZE_FORMAT, trim, size);
+ ret = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, trim, size);
+ gst_buffer_unref (buffer);
+
+ GST_DEBUG ("timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp));
+ GST_BUFFER_TIMESTAMP (ret) = timestamp;
+
+ if (change_duration)
+ GST_BUFFER_DURATION (ret) = duration;
+ if (change_offset)
+ GST_BUFFER_OFFSET (ret) = offset;
+ if (change_offset_end)
+ GST_BUFFER_OFFSET_END (ret) = offset_end;
+
+ return ret;
+}
diff --git a/gst-libs/gst/audio/audio.h b/gst-libs/gst/audio/audio.h
new file mode 100644
index 0000000..1c8287b
--- /dev/null
+++ b/gst-libs/gst/audio/audio.h
@@ -0,0 +1,405 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Library <2001> Thomas Vander Stichele <thomas@apestaart.org>
+ * <2011> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+
+#ifndef __GST_AUDIO_AUDIO_H__
+#define __GST_AUDIO_AUDIO_H__
+
+#include <gst/audio/multichannel.h>
+
+G_BEGIN_DECLS
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+#define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## BE
+#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## LE
+#endif
+
+/**
+ * GstAudioFormat:
+ * @GST_AUDIO_FORMAT_UNKNOWN: unknown audio format
+ * @GST_AUDIO_FORMAT_S8: 8 bits in 8 bits, signed
+ * @GST_AUDIO_FORMAT_U8: 8 bits in 8 bits, unsigned
+ * @GST_AUDIO_FORMAT_S16LE: 16 bits in 16 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S16BE: 16 bits in 16 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U16LE: 16 bits in 16 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U16BE: 16 bits in 16 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_S24_32LE: 24 bits in 32 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S24_32BE: 24 bits in 32 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U24_32LE: 24 bits in 32 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U24_32BE: 24 bits in 32 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_S32LE: 32 bits in 32 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S32BE: 32 bits in 32 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U32LE: 32 bits in 32 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U32BE: 32 bits in 32 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_S24LE: 24 bits in 24 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S24BE: 24 bits in 24 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U24LE: 24 bits in 24 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U24BE: 24 bits in 24 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_S20LE: 20 bits in 24 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S20BE: 20 bits in 24 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U20LE: 20 bits in 24 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U20BE: 20 bits in 24 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_S18LE: 18 bits in 24 bits, signed, little endian
+ * @GST_AUDIO_FORMAT_S18BE: 18 bits in 24 bits, signed, big endian
+ * @GST_AUDIO_FORMAT_U18LE: 18 bits in 24 bits, unsigned, little endian
+ * @GST_AUDIO_FORMAT_U18BE: 18 bits in 24 bits, unsigned, big endian
+ * @GST_AUDIO_FORMAT_F32LE: 32-bit floating point samples, little endian
+ * @GST_AUDIO_FORMAT_F32BE: 32-bit floating point samples, big endian
+ * @GST_AUDIO_FORMAT_F64LE: 64-bit floating point samples, little endian
+ * @GST_AUDIO_FORMAT_F64BE: 64-bit floating point samples, big endian
+ * @GST_AUDIO_FORMAT_S16: 16 bits in 16 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U16: 16 bits in 16 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_S24_32: 24 bits in 32 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U24_32: 24 bits in 32 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_S32: 32 bits in 32 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U32: 32 bits in 32 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_S24: 24 bits in 24 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U24: 24 bits in 24 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_S20: 20 bits in 24 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U20: 20 bits in 24 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_S18: 18 bits in 24 bits, signed, native endianness
+ * @GST_AUDIO_FORMAT_U18: 18 bits in 24 bits, unsigned, native endianness
+ * @GST_AUDIO_FORMAT_F32: 32-bit floating point samples, native endianness
+ * @GST_AUDIO_FORMAT_F64: 64-bit floating point samples, native endianness
+ *
+ * Enum value describing the most common audio formats.
+ */
+typedef enum {
+ GST_AUDIO_FORMAT_UNKNOWN,
+ /* 8 bit */
+ GST_AUDIO_FORMAT_S8,
+ GST_AUDIO_FORMAT_U8,
+ /* 16 bit */
+ GST_AUDIO_FORMAT_S16LE,
+ GST_AUDIO_FORMAT_S16BE,
+ GST_AUDIO_FORMAT_U16LE,
+ GST_AUDIO_FORMAT_U16BE,
+ /* 24 bit in low 3 bytes of 32 bits*/
+ GST_AUDIO_FORMAT_S24_32LE,
+ GST_AUDIO_FORMAT_S24_32BE,
+ GST_AUDIO_FORMAT_U24_32LE,
+ GST_AUDIO_FORMAT_U24_32BE,
+ /* 32 bit */
+ GST_AUDIO_FORMAT_S32LE,
+ GST_AUDIO_FORMAT_S32BE,
+ GST_AUDIO_FORMAT_U32LE,
+ GST_AUDIO_FORMAT_U32BE,
+ /* 24 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S24LE,
+ GST_AUDIO_FORMAT_S24BE,
+ GST_AUDIO_FORMAT_U24LE,
+ GST_AUDIO_FORMAT_U24BE,
+ /* 20 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S20LE,
+ GST_AUDIO_FORMAT_S20BE,
+ GST_AUDIO_FORMAT_U20LE,
+ GST_AUDIO_FORMAT_U20BE,
+ /* 18 bit in 3 bytes*/
+ GST_AUDIO_FORMAT_S18LE,
+ GST_AUDIO_FORMAT_S18BE,
+ GST_AUDIO_FORMAT_U18LE,
+ GST_AUDIO_FORMAT_U18BE,
+ /* float */
+ GST_AUDIO_FORMAT_F32LE,
+ GST_AUDIO_FORMAT_F32BE,
+ GST_AUDIO_FORMAT_F64LE,
+ GST_AUDIO_FORMAT_F64BE,
+ /* native endianness equivalents */
+ GST_AUDIO_FORMAT_S16 = _GST_AUDIO_FORMAT_NE(S16),
+ GST_AUDIO_FORMAT_U16 = _GST_AUDIO_FORMAT_NE(U16),
+ GST_AUDIO_FORMAT_S24_32 = _GST_AUDIO_FORMAT_NE(S24_32),
+ GST_AUDIO_FORMAT_U24_32 = _GST_AUDIO_FORMAT_NE(U24_32),
+ GST_AUDIO_FORMAT_S32 = _GST_AUDIO_FORMAT_NE(S32),
+ GST_AUDIO_FORMAT_U32 = _GST_AUDIO_FORMAT_NE(U32),
+ GST_AUDIO_FORMAT_S24 = _GST_AUDIO_FORMAT_NE(S24),
+ GST_AUDIO_FORMAT_U24 = _GST_AUDIO_FORMAT_NE(U24),
+ GST_AUDIO_FORMAT_S20 = _GST_AUDIO_FORMAT_NE(S20),
+ GST_AUDIO_FORMAT_U20 = _GST_AUDIO_FORMAT_NE(U20),
+ GST_AUDIO_FORMAT_S18 = _GST_AUDIO_FORMAT_NE(S18),
+ GST_AUDIO_FORMAT_U18 = _GST_AUDIO_FORMAT_NE(U18),
+ GST_AUDIO_FORMAT_F32 = _GST_AUDIO_FORMAT_NE(F32),
+ GST_AUDIO_FORMAT_F64 = _GST_AUDIO_FORMAT_NE(F64)
+} GstAudioFormat;
+
+/* FIXME: need GTypes */
+typedef struct _GstAudioFormatInfo GstAudioFormatInfo;
+typedef struct _GstAudioInfo GstAudioInfo;
+
+/**
+ * GstAudioFormatFlags:
+ * @GST_AUDIO_FORMAT_FLAG_INTEGER: integer samples
+ * @GST_AUDIO_FORMAT_FLAG_FLOAT: float samples
+ * @GST_AUDIO_FORMAT_FLAG_SIGNED: signed samples
+ * @GST_AUDIO_FORMAT_FLAG_COMPLEX: complex layout
+ *
+ * The different audio flags that a format info can have.
+ */
+typedef enum
+{
+ GST_AUDIO_FORMAT_FLAG_INTEGER = (1 << 0),
+ GST_AUDIO_FORMAT_FLAG_FLOAT = (1 << 1),
+ GST_AUDIO_FORMAT_FLAG_SIGNED = (1 << 2),
+ GST_AUDIO_FORMAT_FLAG_COMPLEX = (1 << 4)
+} GstAudioFormatFlags;
+
+/**
+ * GstAudioFormatUnpack:
+ * @info: a #GstAudioFormatInfo
+ * @dest: a destination array
+ * @data: pointer to the audio data
+ * @length: the amount of samples to unpack.
+ *
+ * Unpacks @length samples from the given data of format @info.
+ * The samples will be unpacked into @dest which each channel
+ * interleaved. @dest should at least be big enough to hold @length *
+ * channels * size(unpack_format) bytes.
+ */
+typedef void (*GstAudioFormatUnpack) (GstAudioFormatInfo *info, gpointer dest,
+ const gpointer data, gint length);
+/**
+ * GstAudioFormatPack:
+ * @info: a #GstAudioFormatInfo
+ * @src: a source array
+ * @data: pointer to the destination data
+ * @length: the amount of samples to pack.
+ *
+ * Packs @length samples from @src to the data array in format @info.
+ * The samples from source have each channel interleaved
+ * and will be packed into @data.
+ */
+typedef void (*GstAudioFormatPack) (GstAudioFormatInfo *info, const gpointer src,
+ gpointer data, gint length);
+
+/**
+ * GstAudioFormatInfo:
+ * @format: #GstAudioFormat
+ * @name: string representation of the format
+ * @description: user readable description of the format
+ * @flags: #GstAudioFormatFlags
+ * @endianness: the endianness
+ * @width: amount of bits used for one sample
+ * @depth: amount of valid bits in @width
+ * @silence: @width/8 bytes with 1 silent sample
+ * @unpack_format: the format of the unpacked samples
+ * @unpack_func: function to unpack samples
+ * @pack_func: function to pack samples
+ *
+ * Information for an audio format.
+ */
+struct _GstAudioFormatInfo {
+ GstAudioFormat format;
+ const gchar *name;
+ const gchar *description;
+ GstAudioFormatFlags flags;
+ gint endianness;
+ gint width;
+ gint depth;
+ guint8 silence[8];
+
+ GstAudioFormat unpack_format;
+ GstAudioFormatUnpack unpack_func;
+ GstAudioFormatPack pack_func;
+};
+
+#define GST_AUDIO_FORMAT_INFO_FORMAT(info) ((info)->format)
+#define GST_AUDIO_FORMAT_INFO_NAME(info) ((info)->name)
+#define GST_AUDIO_FORMAT_INFO_FLAGS(info) ((info)->flags)
+
+#define GST_AUDIO_FORMAT_INFO_IS_INTEGER(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_INTEGER)
+#define GST_AUDIO_FORMAT_INFO_IS_FLOAT(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_FLOAT)
+#define GST_AUDIO_FORMAT_INFO_IS_SIGNED(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_SIGNED)
+
+#define GST_AUDIO_FORMAT_INFO_ENDIANNESS(info) ((info)->endianness)
+#define GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN(info) ((info)->endianness == G_LITTLE_ENDIAN)
+#define GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN(info) ((info)->endianness == G_BIG_ENDIAN)
+#define GST_AUDIO_FORMAT_INFO_WIDTH(info) ((info)->width)
+#define GST_AUDIO_FORMAT_INFO_DEPTH(info) ((info)->depth)
+
+
+GstAudioFormat gst_audio_format_build_integer (gboolean sign, gint endianness,
+ gint width, gint depth) G_GNUC_CONST;
+
+GstAudioFormat gst_audio_format_from_string (const gchar *format) G_GNUC_CONST;
+const gchar * gst_audio_format_to_string (GstAudioFormat format) G_GNUC_CONST;
+
+const GstAudioFormatInfo *
+ gst_audio_format_get_info (GstAudioFormat format) G_GNUC_CONST;
+
+void gst_audio_format_fill_silence (const GstAudioFormatInfo *info,
+ gpointer dest, gsize length);
+/**
+ * GstAudioFlags:
+ * @GST_AUDIO_FLAG_NONE: no valid flag
+ * @GST_AUDIO_FLAG_DEFAULT_POSITIONS: position array
+ * contains the default layout for the number of channels.
+ *
+ * Extra audio flags
+ */
+typedef enum {
+ GST_AUDIO_FLAG_NONE = 0,
+ GST_AUDIO_FLAG_DEFAULT_POSITIONS = (1 << 0)
+} GstAudioFlags;
+
+/**
+ * GstAudioInfo:
+ * @finfo: the format info of the audio
+ * @flags: additional audio flags
+ * @rate: the audio sample rate
+ * @channels: the number of channels
+ * @bpf: the number of bytes for one frame, this is the size of one
+ * sample * @channels
+ * @position: the positions for each channel
+ *
+ * Information describing audio properties. This information can be filled
+ * in from GstCaps with gst_audio_info_from_caps().
+ *
+ * Use the provided macros to access the info in this structure.
+ */
+struct _GstAudioInfo {
+ const GstAudioFormatInfo *finfo;
+ GstAudioFlags flags;
+ gint rate;
+ gint channels;
+ gint bpf;
+ GstAudioChannelPosition position[64];
+};
+
+#define GST_AUDIO_INFO_FORMAT(i) (GST_AUDIO_FORMAT_INFO_FORMAT((i)->finfo))
+#define GST_AUDIO_INFO_NAME(i) (GST_AUDIO_FORMAT_INFO_NAME((i)->finfo))
+#define GST_AUDIO_INFO_WIDTH(i) (GST_AUDIO_FORMAT_INFO_WIDTH((i)->finfo))
+#define GST_AUDIO_INFO_DEPTH(i) (GST_AUDIO_FORMAT_INFO_DEPTH((i)->finfo))
+#define GST_AUDIO_INFO_BPS(info) (GST_AUDIO_INFO_DEPTH(info) >> 3)
+
+#define GST_AUDIO_INFO_IS_INTEGER(i) (GST_AUDIO_FORMAT_INFO_IS_INTEGER((i)->finfo))
+#define GST_AUDIO_INFO_IS_FLOAT(i) (GST_AUDIO_FORMAT_INFO_IS_FLOAT((i)->finfo))
+#define GST_AUDIO_INFO_IS_SIGNED(i) (GST_AUDIO_FORMAT_INFO_IS_SIGNED((i)->finfo))
+
+#define GST_AUDIO_INFO_ENDIANNESS(i) (GST_AUDIO_FORMAT_INFO_ENDIANNES((i)->finfo))
+#define GST_AUDIO_INFO_IS_LITTLE_ENDIAN(i) (GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN((i)->finfo))
+#define GST_AUDIO_INFO_IS_BIG_ENDIAN(i) (GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN((i)->finfo))
+
+#define GST_AUDIO_INFO_FLAGS(info) ((info)->flags)
+#define GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS(info) ((info)->flags & GST_AUDIO_FLAG_DEFAULT_POSITIONS)
+
+#define GST_AUDIO_INFO_RATE(info) ((info)->rate)
+#define GST_AUDIO_INFO_CHANNELS(info) ((info)->channels)
+#define GST_AUDIO_INFO_BPF(info) ((info)->bpf)
+#define GST_AUDIO_INFO_POSITION(info,c) ((info)->position[c])
+
+void gst_audio_info_init (GstAudioInfo *info);
+void gst_audio_info_set_format (GstAudioInfo *info, GstAudioFormat format,
+ gint rate, gint channels);
+
+gboolean gst_audio_info_from_caps (GstAudioInfo *info, const GstCaps *caps);
+GstCaps * gst_audio_info_to_caps (GstAudioInfo *info);
+
+gboolean gst_audio_info_convert (GstAudioInfo * info,
+ GstFormat src_fmt, gint64 src_val,
+ GstFormat dest_fmt, gint64 * dest_val);
+
+
+
+#define GST_AUDIO_RATE_RANGE "(int) [ 1, max ]"
+#define GST_AUDIO_CHANNELS_RANGE "(int) [ 1, max ]"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define GST_AUDIO_NE(s) G_STRINGIFY(s)"LE"
+# define GST_AUDIO_OE(s) G_STRINGIFY(s)"BE"
+#else
+# define GST_AUDIO_NE(s) G_STRINGIFY(s)"BE"
+# define GST_AUDIO_OE(s) G_STRINGIFY(s)"LE"
+#endif
+
+#define GST_AUDIO_FORMATS_ALL " { S8, U8, " \
+ "S16LE, S16BE, U16LE, U16BE, " \
+ "S24_32LE, S24_32BE, U24_32LE, U24_32BE, " \
+ "S32LE, S32BE, U32LE, U32BE, " \
+ "S24LE, S24BE, U24LE, U24BE, " \
+ "S20LE, S20BE, U20LE, U20BE, " \
+ "S18LE, S18BE, U18LE, U18BE, " \
+ "F32LE, F32BE, F64LE, F64BE }"
+
+/**
+ * GST_AUDIO_CAPS_MAKE:
+ * @format: string format that describes the pixel layout, as string
+ * (e.g. "S16LE", "S8", etc.)
+ *
+ * Generic caps string for audio, for use in pad templates.
+ */
+#define GST_AUDIO_CAPS_MAKE(format) \
+ "audio/x-raw, " \
+ "format = (string) " format ", " \
+ "rate = " GST_AUDIO_RATE_RANGE ", " \
+ "channels = " GST_AUDIO_CHANNELS_RANGE
+
+/**
+ * GST_AUDIO_DEF_RATE:
+ *
+ * Standard sampling rate used in consumer audio.
+ */
+#define GST_AUDIO_DEF_RATE 44100
+/**
+ * GST_AUDIO_DEF_CHANNELS:
+ *
+ * Standard number of channels used in consumer audio.
+ */
+#define GST_AUDIO_DEF_CHANNELS 2
+/**
+ * GST_AUDIO_DEF_FORMAT:
+ *
+ * Standard format used in consumer audio.
+ */
+#define GST_AUDIO_DEF_FORMAT "S16LE"
+
+/* conversion macros */
+/**
+ * GST_FRAMES_TO_CLOCK_TIME:
+ * @frames: sample frames
+ * @rate: sampling rate
+ *
+ * Calculate clocktime from sample @frames and @rate.
+ */
+#define GST_FRAMES_TO_CLOCK_TIME(frames, rate) \
+ ((GstClockTime) gst_util_uint64_scale_round (frames, GST_SECOND, rate))
+
+/**
+ * GST_CLOCK_TIME_TO_FRAMES:
+ * @clocktime: clock time
+ * @rate: sampling rate
+ *
+ * Calculate frames from @clocktime and sample @rate.
+ */
+#define GST_CLOCK_TIME_TO_FRAMES(clocktime, rate) \
+ gst_util_uint64_scale_round (clocktime, rate, GST_SECOND)
+
+/*
+ * this library defines and implements some helper functions for audio
+ * handling
+ */
+
+GstBuffer * gst_audio_buffer_clip (GstBuffer *buffer, GstSegment *segment,
+ gint rate, gint bpf);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_AUDIO_H__ */
diff --git a/gst-libs/gst/audio/gstaudioclock.c b/gst-libs/gst/audio/gstaudioclock.c
new file mode 100644
index 0000000..44879e3
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioclock.c
@@ -0,0 +1,314 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * audioclock.c: Clock for use by audio 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.
+ */
+
+/**
+ * SECTION:gstaudioclock
+ * @short_description: Helper object for implementing audio clocks
+ * @see_also: #GstBaseAudioSink, #GstSystemClock
+ *
+ * #GstAudioClock makes it easy for elements to implement a #GstClock, they
+ * simply need to provide a function that returns the current clock time.
+ *
+ * This object is internally used to implement the clock in #GstBaseAudioSink.
+ *
+ * Last reviewed on 2006-09-27 (0.10.12)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstaudioclock.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_audio_clock_debug);
+#define GST_CAT_DEFAULT gst_audio_clock_debug
+
+static void gst_audio_clock_class_init (GstAudioClockClass * klass);
+static void gst_audio_clock_init (GstAudioClock * clock);
+
+static void gst_audio_clock_dispose (GObject * object);
+
+static GstClockTime gst_audio_clock_get_internal_time (GstClock * clock);
+
+static GstSystemClockClass *parent_class = NULL;
+
+/* static guint gst_audio_clock_signals[LAST_SIGNAL] = { 0 }; */
+
+GType
+gst_audio_clock_get_type (void)
+{
+ static volatile gsize clock_type = 0;
+ static const GTypeInfo clock_info = {
+ sizeof (GstAudioClockClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_audio_clock_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAudioClock),
+ 4,
+ (GInstanceInitFunc) gst_audio_clock_init,
+ NULL
+ };
+
+ if (g_once_init_enter (&clock_type)) {
+ GType tmp = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "GstAudioClock",
+ &clock_info, 0);
+ g_once_init_leave (&clock_type, tmp);
+ }
+
+ return (GType) clock_type;
+}
+
+static void
+gst_audio_clock_class_init (GstAudioClockClass * klass)
+{
+ GstClockClass *gstclock_class;
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstclock_class = (GstClockClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = gst_audio_clock_dispose;
+ gstclock_class->get_internal_time = gst_audio_clock_get_internal_time;
+
+ GST_DEBUG_CATEGORY_INIT (gst_audio_clock_debug, "audioclock", 0,
+ "audioclock");
+}
+
+static void
+gst_audio_clock_init (GstAudioClock * clock)
+{
+ GST_DEBUG_OBJECT (clock, "init");
+ clock->last_time = 0;
+ clock->time_offset = 0;
+ GST_OBJECT_FLAG_SET (clock, GST_CLOCK_FLAG_CAN_SET_MASTER);
+}
+
+static void
+gst_audio_clock_dispose (GObject * object)
+{
+ GstAudioClock *clock = GST_AUDIO_CLOCK (object);
+
+ if (clock->destroy_notify && clock->user_data)
+ clock->destroy_notify (clock->user_data);
+ clock->destroy_notify = NULL;
+ clock->user_data = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/**
+ * gst_audio_clock_new:
+ * @name: the name of the clock
+ * @func: a function
+ * @user_data: user data
+ *
+ * Create a new #GstAudioClock instance. Whenever the clock time should be
+ * calculated it will call @func with @user_data. When @func returns
+ * #GST_CLOCK_TIME_NONE, the clock will return the last reported time.
+ *
+ * Returns: a new #GstAudioClock casted to a #GstClock.
+ */
+GstClock *
+gst_audio_clock_new (const gchar * name, GstAudioClockGetTimeFunc func,
+ gpointer user_data)
+{
+ GstAudioClock *aclock =
+ GST_AUDIO_CLOCK (g_object_new (GST_TYPE_AUDIO_CLOCK, "name", name, NULL));
+
+ aclock->func = func;
+ aclock->user_data = user_data;
+
+ return (GstClock *) aclock;
+}
+
+/**
+ * gst_audio_clock_new_full:
+ * @name: the name of the clock
+ * @func: a function
+ * @user_data: user data
+ * @destroy_notify: #GDestroyNotify for @user_data
+ *
+ * Create a new #GstAudioClock instance. Whenever the clock time should be
+ * calculated it will call @func with @user_data. When @func returns
+ * #GST_CLOCK_TIME_NONE, the clock will return the last reported time.
+ *
+ * Returns: a new #GstAudioClock casted to a #GstClock.
+ *
+ * Since: 0.10.31
+ */
+GstClock *
+gst_audio_clock_new_full (const gchar * name, GstAudioClockGetTimeFunc func,
+ gpointer user_data, GDestroyNotify destroy_notify)
+{
+ GstAudioClock *aclock =
+ GST_AUDIO_CLOCK (g_object_new (GST_TYPE_AUDIO_CLOCK, "name", name, NULL));
+
+ aclock->func = func;
+ aclock->user_data = user_data;
+ aclock->destroy_notify = destroy_notify;
+
+ return (GstClock *) aclock;
+}
+
+/**
+ * gst_audio_clock_reset:
+ * @clock: a #GstAudioClock
+ * @time: a #GstClockTime
+ *
+ * Inform @clock that future calls to #GstAudioClockGetTimeFunc will return values
+ * starting from @time. The clock will update an internal offset to make sure that
+ * future calls to internal_time will return an increasing result as required by
+ * the #GstClock object.
+ */
+void
+gst_audio_clock_reset (GstAudioClock * clock, GstClockTime time)
+{
+ GstClockTimeDiff time_offset;
+
+ if (clock->last_time >= time)
+ time_offset = clock->last_time - time;
+ else
+ time_offset = -(time - clock->last_time);
+
+ clock->time_offset = time_offset;
+
+ GST_DEBUG_OBJECT (clock,
+ "reset clock to %" GST_TIME_FORMAT ", last %" GST_TIME_FORMAT ", offset %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (time), GST_TIME_ARGS (clock->last_time),
+ GST_TIME_ARGS (time_offset));
+}
+
+static GstClockTime
+gst_audio_clock_func_invalid (GstClock * clock, gpointer user_data)
+{
+ return GST_CLOCK_TIME_NONE;
+}
+
+static GstClockTime
+gst_audio_clock_get_internal_time (GstClock * clock)
+{
+ GstAudioClock *aclock;
+ GstClockTime result;
+
+ aclock = GST_AUDIO_CLOCK_CAST (clock);
+
+ result = aclock->func (clock, aclock->user_data);
+ if (result == GST_CLOCK_TIME_NONE) {
+ result = aclock->last_time;
+ } else {
+ result += aclock->time_offset;
+ /* clock must be increasing */
+ if (aclock->last_time < result)
+ aclock->last_time = result;
+ else
+ result = aclock->last_time;
+ }
+
+ GST_DEBUG_OBJECT (clock,
+ "result %" GST_TIME_FORMAT ", last_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (result), GST_TIME_ARGS (aclock->last_time));
+
+ return result;
+}
+
+/**
+ * gst_audio_clock_get_time:
+ * @clock: a #GstAudioClock
+ *
+ * Report the time as returned by the #GstAudioClockGetTimeFunc without applying
+ * any offsets.
+ *
+ * Returns: the time as reported by the time function of the audio clock
+ *
+ * Since: 0.10.23
+ */
+GstClockTime
+gst_audio_clock_get_time (GstClock * clock)
+{
+ GstAudioClock *aclock;
+ GstClockTime result;
+
+ aclock = GST_AUDIO_CLOCK_CAST (clock);
+
+ result = aclock->func (clock, aclock->user_data);
+ if (result == GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (clock, "no time, reuse last");
+ result = aclock->last_time - aclock->time_offset;
+ }
+
+ GST_DEBUG_OBJECT (clock,
+ "result %" GST_TIME_FORMAT ", last_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (result), GST_TIME_ARGS (aclock->last_time));
+
+ return result;
+}
+
+/**
+ * gst_audio_clock_adjust:
+ * @clock: a #GstAudioClock
+ * @time: a #GstClockTime
+ *
+ * Adjust @time with the internal offset of the audio clock.
+ *
+ * Returns: @time adjusted with the internal offset.
+ *
+ * Since: 0.10.23
+ */
+GstClockTime
+gst_audio_clock_adjust (GstClock * clock, GstClockTime time)
+{
+ GstAudioClock *aclock;
+ GstClockTime result;
+
+ aclock = GST_AUDIO_CLOCK_CAST (clock);
+
+ result = time + aclock->time_offset;
+
+ return result;
+}
+
+/**
+ * gst_audio_clock_invalidate:
+ * @clock: a #GstAudioClock
+ *
+ * Invalidate the clock function. Call this function when the provided
+ * #GstAudioClockGetTimeFunc cannot be called anymore, for example, when the
+ * user_data becomes invalid.
+ *
+ * After calling this function, @clock will return the last returned time for
+ * the rest of its lifetime.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_audio_clock_invalidate (GstClock * clock)
+{
+ GstAudioClock *aclock;
+
+ aclock = GST_AUDIO_CLOCK_CAST (clock);
+
+ aclock->func = gst_audio_clock_func_invalid;
+}
diff --git a/gst-libs/gst/audio/gstaudioclock.h b/gst-libs/gst/audio/gstaudioclock.h
new file mode 100644
index 0000000..cd96dc0
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioclock.h
@@ -0,0 +1,102 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstaudioclock.h: Clock for use by audio 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_AUDIO_CLOCK_H__
+#define __GST_AUDIO_CLOCK_H__
+
+#include <gst/gst.h>
+#include <gst/gstsystemclock.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_CLOCK \
+ (gst_audio_clock_get_type())
+#define GST_AUDIO_CLOCK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CLOCK,GstAudioClock))
+#define GST_AUDIO_CLOCK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_CLOCK,GstAudioClockClass))
+#define GST_IS_AUDIO_CLOCK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CLOCK))
+#define GST_IS_AUDIO_CLOCK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_CLOCK))
+#define GST_AUDIO_CLOCK_CAST(obj) \
+ ((GstAudioClock*)(obj))
+
+typedef struct _GstAudioClock GstAudioClock;
+typedef struct _GstAudioClockClass GstAudioClockClass;
+
+/**
+ * GstAudioClockGetTimeFunc:
+ * @clock: the #GstAudioClock
+ * @user_data: user data
+ *
+ * This function will be called whenever the current clock time needs to be
+ * calculated. If this function returns #GST_CLOCK_TIME_NONE, the last reported
+ * time will be returned by the clock.
+ *
+ * Returns: the current time or #GST_CLOCK_TIME_NONE if the previous time should
+ * be used.
+ */
+typedef GstClockTime (*GstAudioClockGetTimeFunc) (GstClock *clock, gpointer user_data);
+
+/**
+ * GstAudioClock:
+ *
+ * Opaque #GstAudioClock.
+ */
+struct _GstAudioClock {
+ GstSystemClock clock;
+
+ /*< protected >*/
+ GstAudioClockGetTimeFunc func;
+ gpointer user_data;
+ GDestroyNotify destroy_notify;
+
+ /*< private >*/
+ GstClockTime last_time;
+ GstClockTimeDiff time_offset;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstAudioClockClass {
+ GstSystemClockClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_audio_clock_get_type (void);
+GstClock* gst_audio_clock_new (const gchar *name, GstAudioClockGetTimeFunc func,
+ gpointer user_data);
+GstClock* gst_audio_clock_new_full (const gchar *name, GstAudioClockGetTimeFunc func,
+ gpointer user_data, GDestroyNotify destroy_notify);
+void gst_audio_clock_reset (GstAudioClock *clock, GstClockTime time);
+
+GstClockTime gst_audio_clock_get_time (GstClock * clock);
+GstClockTime gst_audio_clock_adjust (GstClock * clock, GstClockTime time);
+
+void gst_audio_clock_invalidate (GstClock * clock);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_CLOCK_H__ */
diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c
new file mode 100644
index 0000000..cd051a3
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiodecoder.c
@@ -0,0 +1,2402 @@
+/* GStreamer
+ * Copyright (C) 2009 Igalia S.L.
+ * Author: Iago Toral Quiroga <itoral@igalia.com>
+ * Copyright (C) 2011 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>.
+ * Copyright (C) 2011 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstaudiodecoder
+ * @short_description: Base class for audio decoders
+ * @see_also: #GstBaseTransform
+ * @since: 0.10.36
+ *
+ * This base class is for audio decoders turning encoded data into
+ * raw audio samples.
+ *
+ * GstAudioDecoder and subclass should cooperate as follows.
+ * <orderedlist>
+ * <listitem>
+ * <itemizedlist><title>Configuration</title>
+ * <listitem><para>
+ * Initially, GstAudioDecoder calls @start when the decoder element
+ * is activated, which allows subclass to perform any global setup.
+ * Base class (context) parameters can already be set according to subclass
+ * capabilities (or possibly upon receive more information in subsequent
+ * @set_format).
+ * </para></listitem>
+ * <listitem><para>
+ * GstAudioDecoder calls @set_format to inform subclass of the format
+ * of input audio data that it is about to receive.
+ * While unlikely, it might be called more than once, if changing input
+ * parameters require reconfiguration.
+ * </para></listitem>
+ * <listitem><para>
+ * GstAudioDecoder calls @stop at end of all processing.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * As of configuration stage, and throughout processing, GstAudioDecoder
+ * provides various (context) parameters, e.g. describing the format of
+ * output audio data (valid when output caps have been set) or current parsing state.
+ * Conversely, subclass can and should configure context to inform
+ * base class of its expectation w.r.t. buffer handling.
+ * <listitem>
+ * <itemizedlist>
+ * <title>Data processing</title>
+ * <listitem><para>
+ * Base class gathers input data, and optionally allows subclass
+ * to parse this into subsequently manageable (as defined by subclass)
+ * chunks. Such chunks are subsequently referred to as 'frames',
+ * though they may or may not correspond to 1 (or more) audio format frame.
+ * </para></listitem>
+ * <listitem><para>
+ * Input frame is provided to subclass' @handle_frame.
+ * </para></listitem>
+ * <listitem><para>
+ * If codec processing results in decoded data, subclass should call
+ * @gst_audio_decoder_finish_frame to have decoded data pushed
+ * downstream.
+ * </para></listitem>
+ * <listitem><para>
+ * Just prior to actually pushing a buffer downstream,
+ * it is passed to @pre_push. Subclass should either use this callback
+ * to arrange for additional downstream pushing or otherwise ensure such
+ * custom pushing occurs after at least a method call has finished since
+ * setting src pad caps.
+ * </para></listitem>
+ * <listitem><para>
+ * During the parsing process GstAudioDecoderClass will handle both
+ * srcpad and sinkpad events. Sink events will be passed to subclass
+ * if @event callback has been provided.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Shutdown phase</title>
+ * <listitem><para>
+ * GstAudioDecoder class calls @stop to inform the subclass that data
+ * parsing will be stopped.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * </orderedlist>
+ *
+ * Subclass is responsible for providing pad template caps for
+ * source and sink pads. The pads need to be named "sink" and "src". It also
+ * needs to set the fixed caps on srcpad, when the format is ensured. This
+ * is typically when base class calls subclass' @set_format function, though
+ * it might be delayed until calling @gst_audio_decoder_finish_frame.
+ *
+ * In summary, above process should have subclass concentrating on
+ * codec data processing while leaving other matters to base class,
+ * such as most notably timestamp handling. While it may exert more control
+ * in this area (see e.g. @pre_push), it is very much not recommended.
+ *
+ * In particular, base class will try to arrange for perfect output timestamps
+ * as much as possible while tracking upstream timestamps.
+ * To this end, if deviation between the next ideal expected perfect timestamp
+ * and upstream exceeds #GstAudioDecoder:tolerance, then resync to upstream
+ * occurs (which would happen always if the tolerance mechanism is disabled).
+ *
+ * In non-live pipelines, baseclass can also (configurably) arrange for
+ * output buffer aggregation which may help to redue large(r) numbers of
+ * small(er) buffers being pushed and processed downstream.
+ *
+ * On the other hand, it should be noted that baseclass only provides limited
+ * seeking support (upon explicit subclass request), as full-fledged support
+ * should rather be left to upstream demuxer, parser or alike. This simple
+ * approach caters for seeking and duration reporting using estimated input
+ * bitrates.
+ *
+ * Things that subclass need to take care of:
+ * <itemizedlist>
+ * <listitem><para>Provide pad templates</para></listitem>
+ * <listitem><para>
+ * Set source pad caps when appropriate
+ * </para></listitem>
+ * <listitem><para>
+ * Set user-configurable properties to sane defaults for format and
+ * implementing codec at hand, and convey some subclass capabilities and
+ * expectations in context.
+ * </para></listitem>
+ * <listitem><para>
+ * Accept data in @handle_frame and provide encoded results to
+ * @gst_audio_decoder_finish_frame. If it is prepared to perform
+ * PLC, it should also accept NULL data in @handle_frame and provide for
+ * data for indicated duration.
+ * </para></listitem>
+ * </itemizedlist>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstaudiodecoder.h"
+#include <gst/pbutils/descriptions.h>
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY (audiodecoder_debug);
+#define GST_CAT_DEFAULT audiodecoder_debug
+
+#define GST_AUDIO_DECODER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_AUDIO_DECODER, \
+ GstAudioDecoderPrivate))
+
+enum
+{
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_LATENCY,
+ PROP_TOLERANCE,
+ PROP_PLC
+};
+
+#define DEFAULT_LATENCY 0
+#define DEFAULT_TOLERANCE 0
+#define DEFAULT_PLC FALSE
+
+typedef struct _GstAudioDecoderContext
+{
+ /* input */
+ /* (output) audio format */
+ GstAudioInfo info;
+
+ /* parsing state */
+ gboolean eos;
+ gboolean sync;
+
+ /* misc */
+ gint delay;
+
+ /* output */
+ gboolean do_plc;
+ gboolean do_byte_time;
+ gint max_errors;
+ /* MT-protected (with LOCK) */
+ GstClockTime min_latency;
+ GstClockTime max_latency;
+} GstAudioDecoderContext;
+
+struct _GstAudioDecoderPrivate
+{
+ /* activation status */
+ gboolean active;
+
+ /* input base/first ts as basis for output ts */
+ GstClockTime base_ts;
+ /* input samples processed and sent downstream so far (w.r.t. base_ts) */
+ guint64 samples;
+
+ /* collected input data */
+ GstAdapter *adapter;
+ /* tracking input ts for changes */
+ GstClockTime prev_ts;
+ /* frames obtained from input */
+ GQueue frames;
+ /* collected output data */
+ GstAdapter *adapter_out;
+ /* ts and duration for output data collected above */
+ GstClockTime out_ts, out_dur;
+ /* mark outgoing discont */
+ gboolean discont;
+
+ /* subclass gave all it could already */
+ gboolean drained;
+ /* subclass currently being forcibly drained */
+ gboolean force;
+
+ /* input bps estimatation */
+ /* global in bytes seen */
+ guint64 bytes_in;
+ /* global samples sent out */
+ guint64 samples_out;
+ /* bytes flushed during parsing */
+ guint sync_flush;
+ /* error count */
+ gint error_count;
+ /* codec id tag */
+ GstTagList *taglist;
+
+ /* whether circumstances allow output aggregation */
+ gint agg;
+
+ /* reverse playback queues */
+ /* collect input */
+ GList *gather;
+ /* to-be-decoded */
+ GList *decode;
+ /* reversed output */
+ GList *queued;
+
+ /* context storage */
+ GstAudioDecoderContext ctx;
+
+ /* properties */
+ GstClockTime latency;
+ GstClockTime tolerance;
+ gboolean plc;
+
+ /* pending serialized sink events, will be sent from finish_frame() */
+ GList *pending_events;
+};
+
+
+static void gst_audio_decoder_finalize (GObject * object);
+static void gst_audio_decoder_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_audio_decoder_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static void gst_audio_decoder_clear_queues (GstAudioDecoder * dec);
+static GstFlowReturn gst_audio_decoder_chain_reverse (GstAudioDecoder *
+ dec, GstBuffer * buf);
+
+static GstStateChangeReturn gst_audio_decoder_change_state (GstElement *
+ element, GstStateChange transition);
+static gboolean gst_audio_decoder_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_audio_decoder_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_audio_decoder_sink_setcaps (GstAudioDecoder * dec,
+ GstCaps * caps);
+gboolean gst_audio_decoder_src_setcaps (GstAudioDecoder * dec, GstCaps * caps);
+static GstFlowReturn gst_audio_decoder_chain (GstPad * pad, GstBuffer * buf);
+static gboolean gst_audio_decoder_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_audio_decoder_sink_query (GstPad * pad, GstQuery * query);
+static const GstQueryType *gst_audio_decoder_get_query_types (GstPad * pad);
+static void gst_audio_decoder_reset (GstAudioDecoder * dec, gboolean full);
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_audio_decoder_class_init (GstAudioDecoderClass * klass);
+static void gst_audio_decoder_init (GstAudioDecoder * dec,
+ GstAudioDecoderClass * klass);
+
+GType
+gst_audio_decoder_get_type (void)
+{
+ static volatile gsize audio_decoder_type = 0;
+
+ if (g_once_init_enter (&audio_decoder_type)) {
+ GType _type;
+ static const GTypeInfo audio_decoder_info = {
+ sizeof (GstAudioDecoderClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_audio_decoder_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAudioDecoder),
+ 0,
+ (GInstanceInitFunc) gst_audio_decoder_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstAudioDecoder", &audio_decoder_info, G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&audio_decoder_type, _type);
+ }
+ return audio_decoder_type;
+}
+
+
+static void
+gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *element_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ element_class = GST_ELEMENT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ g_type_class_add_private (klass, sizeof (GstAudioDecoderPrivate));
+
+ GST_DEBUG_CATEGORY_INIT (audiodecoder_debug, "audiodecoder", 0,
+ "audio decoder base class");
+
+ gobject_class->set_property = gst_audio_decoder_set_property;
+ gobject_class->get_property = gst_audio_decoder_get_property;
+ gobject_class->finalize = gst_audio_decoder_finalize;
+
+ element_class->change_state = gst_audio_decoder_change_state;
+
+ /* Properties */
+ g_object_class_install_property (gobject_class, PROP_LATENCY,
+ g_param_spec_int64 ("min-latency", "Minimum Latency",
+ "Aggregate output data to a minimum of latency time (ns)",
+ 0, G_MAXINT64, DEFAULT_LATENCY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_TOLERANCE,
+ g_param_spec_int64 ("tolerance", "Tolerance",
+ "Perfect ts while timestamp jitter/imperfection within tolerance (ns)",
+ 0, G_MAXINT64, DEFAULT_TOLERANCE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_PLC,
+ g_param_spec_boolean ("plc", "Packet Loss Concealment",
+ "Perform packet loss concealment (if supported)",
+ DEFAULT_PLC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_audio_decoder_init (GstAudioDecoder * dec, GstAudioDecoderClass * klass)
+{
+ GstPadTemplate *pad_template;
+
+ GST_DEBUG_OBJECT (dec, "gst_audio_decoder_init");
+
+ dec->priv = GST_AUDIO_DECODER_GET_PRIVATE (dec);
+
+ /* Setup sink pad */
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "sink");
+ g_return_if_fail (pad_template != NULL);
+
+ dec->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+ gst_pad_set_event_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_sink_event));
+ gst_pad_set_chain_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_chain));
+ gst_pad_set_query_function (dec->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_sink_query));
+ gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
+ GST_DEBUG_OBJECT (dec, "sinkpad created");
+
+ /* Setup source pad */
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "src");
+ g_return_if_fail (pad_template != NULL);
+
+ dec->srcpad = gst_pad_new_from_template (pad_template, "src");
+ gst_pad_set_event_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_src_event));
+ gst_pad_set_query_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_src_query));
+ gst_pad_set_query_type_function (dec->srcpad,
+ GST_DEBUG_FUNCPTR (gst_audio_decoder_get_query_types));
+ gst_pad_use_fixed_caps (dec->srcpad);
+ gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
+ GST_DEBUG_OBJECT (dec, "srcpad created");
+
+ dec->priv->adapter = gst_adapter_new ();
+ dec->priv->adapter_out = gst_adapter_new ();
+ g_queue_init (&dec->priv->frames);
+
+ g_static_rec_mutex_init (&dec->stream_lock);
+
+ /* property default */
+ dec->priv->latency = DEFAULT_LATENCY;
+ dec->priv->tolerance = DEFAULT_TOLERANCE;
+ dec->priv->plc = DEFAULT_PLC;
+
+ /* init state */
+ gst_audio_decoder_reset (dec, TRUE);
+ GST_DEBUG_OBJECT (dec, "init ok");
+}
+
+static void
+gst_audio_decoder_reset (GstAudioDecoder * dec, gboolean full)
+{
+ GST_DEBUG_OBJECT (dec, "gst_audio_decoder_reset");
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+
+ if (full) {
+ dec->priv->active = FALSE;
+ dec->priv->bytes_in = 0;
+ dec->priv->samples_out = 0;
+ dec->priv->agg = -1;
+ dec->priv->error_count = 0;
+ gst_audio_decoder_clear_queues (dec);
+
+ gst_audio_info_init (&dec->priv->ctx.info);
+ memset (&dec->priv->ctx, 0, sizeof (dec->priv->ctx));
+
+ if (dec->priv->taglist) {
+ gst_tag_list_free (dec->priv->taglist);
+ dec->priv->taglist = NULL;
+ }
+
+ gst_segment_init (&dec->segment, GST_FORMAT_TIME);
+
+ g_list_foreach (dec->priv->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (dec->priv->pending_events);
+ dec->priv->pending_events = NULL;
+ }
+
+ g_queue_foreach (&dec->priv->frames, (GFunc) gst_buffer_unref, NULL);
+ g_queue_clear (&dec->priv->frames);
+ gst_adapter_clear (dec->priv->adapter);
+ gst_adapter_clear (dec->priv->adapter_out);
+ dec->priv->out_ts = GST_CLOCK_TIME_NONE;
+ dec->priv->out_dur = 0;
+ dec->priv->prev_ts = GST_CLOCK_TIME_NONE;
+ dec->priv->drained = TRUE;
+ dec->priv->base_ts = GST_CLOCK_TIME_NONE;
+ dec->priv->samples = 0;
+ dec->priv->discont = TRUE;
+ dec->priv->sync_flush = FALSE;
+
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+}
+
+static void
+gst_audio_decoder_finalize (GObject * object)
+{
+ GstAudioDecoder *dec;
+
+ g_return_if_fail (GST_IS_AUDIO_DECODER (object));
+ dec = GST_AUDIO_DECODER (object);
+
+ if (dec->priv->adapter) {
+ g_object_unref (dec->priv->adapter);
+ }
+ if (dec->priv->adapter_out) {
+ g_object_unref (dec->priv->adapter_out);
+ }
+
+ g_static_rec_mutex_free (&dec->stream_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_audio_decoder_set_outcaps:
+ * @dec: a #GstAudioDecoder
+ * @caps: #GstCaps
+ *
+ * Configure output @caps on the srcpad of @dec. Also perform
+ * sanity checking of @caps and extracts output data format
+ *
+ * Returns: %TRUE on success.
+ * */
+gboolean
+gst_audio_decoder_set_outcaps (GstAudioDecoder * dec, GstCaps * caps)
+{
+ gboolean res = TRUE;
+ guint old_rate;
+
+ GST_DEBUG_OBJECT (dec, "setting src caps %" GST_PTR_FORMAT, caps);
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+
+ /* parse caps here to check subclass;
+ * also makes us aware of output format */
+ if (!gst_caps_is_fixed (caps))
+ goto refuse_caps;
+
+ /* adjust ts tracking to new sample rate */
+ old_rate = GST_AUDIO_INFO_RATE (&dec->priv->ctx.info);
+ if (GST_CLOCK_TIME_IS_VALID (dec->priv->base_ts) && old_rate) {
+ dec->priv->base_ts +=
+ GST_FRAMES_TO_CLOCK_TIME (dec->priv->samples, old_rate);
+ dec->priv->samples = 0;
+ }
+
+ if (!gst_audio_info_from_caps (&dec->priv->ctx.info, caps))
+ goto refuse_caps;
+
+done:
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+
+ res = gst_pad_set_caps (dec->srcpad, caps);
+
+ return res;
+
+ /* ERRORS */
+refuse_caps:
+ {
+ GST_WARNING_OBJECT (dec, "rejected caps %" GST_PTR_FORMAT, caps);
+ res = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_audio_decoder_sink_setcaps (GstAudioDecoder * dec, GstCaps * caps)
+{
+ GstAudioDecoderClass *klass;
+ gboolean res = TRUE;
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ GST_DEBUG_OBJECT (dec, "caps: %" GST_PTR_FORMAT, caps);
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+ /* NOTE pbutils only needed here */
+ /* TODO maybe (only) upstream demuxer/parser etc should handle this ? */
+#if 0
+ if (dec->priv->taglist)
+ gst_tag_list_free (dec->priv->taglist);
+ dec->priv->taglist = gst_tag_list_new ();
+ gst_pb_utils_add_codec_description_to_tag_list (dec->priv->taglist,
+ GST_TAG_AUDIO_CODEC, caps);
+#endif
+
+ if (klass->set_format)
+ res = klass->set_format (dec, caps);
+
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+
+ return res;
+}
+
+static void
+gst_audio_decoder_setup (GstAudioDecoder * dec)
+{
+ GstQuery *query;
+ gboolean res;
+
+ /* check if in live pipeline, then latency messing is no-no */
+ query = gst_query_new_latency ();
+ res = gst_pad_peer_query (dec->sinkpad, query);
+ if (res) {
+ gst_query_parse_latency (query, &res, NULL, NULL);
+ res = !res;
+ }
+ gst_query_unref (query);
+
+ /* normalize to bool */
+ dec->priv->agg = !!res;
+}
+
+/* mini aggregator combining output buffers into fewer larger ones,
+ * if so allowed/configured */
+static GstFlowReturn
+gst_audio_decoder_output (GstAudioDecoder * dec, GstBuffer * buf)
+{
+ GstAudioDecoderClass *klass;
+ GstAudioDecoderPrivate *priv;
+ GstAudioDecoderContext *ctx;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *inbuf = NULL;
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+ priv = dec->priv;
+ ctx = &dec->priv->ctx;
+
+ if (G_UNLIKELY (priv->agg < 0))
+ gst_audio_decoder_setup (dec);
+
+ if (G_LIKELY (buf)) {
+ g_return_val_if_fail (ctx->info.bpf != 0, GST_FLOW_ERROR);
+
+ GST_LOG_OBJECT (dec,
+ "output buffer of size %" G_GSIZE_FORMAT " with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, gst_buffer_get_size (buf),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ /* clip buffer */
+ buf = gst_audio_buffer_clip (buf, &dec->segment, ctx->info.rate,
+ ctx->info.bpf);
+ if (G_UNLIKELY (!buf)) {
+ GST_DEBUG_OBJECT (dec, "no data after clipping to segment");
+ } else {
+ GST_LOG_OBJECT (dec,
+ "buffer after segment clipping has size %" G_GSIZE_FORMAT " with ts %"
+ GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT,
+ gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ }
+ } else {
+ GST_DEBUG_OBJECT (dec, "no output buffer");
+ }
+
+again:
+ inbuf = NULL;
+ if (priv->agg && dec->priv->latency > 0) {
+ gint av;
+ gboolean assemble = FALSE;
+ const GstClockTimeDiff tol = 10 * GST_MSECOND;
+ GstClockTimeDiff diff = -100 * GST_MSECOND;
+
+ av = gst_adapter_available (priv->adapter_out);
+ if (G_UNLIKELY (!buf)) {
+ /* forcibly send current */
+ assemble = TRUE;
+ GST_LOG_OBJECT (dec, "forcing fragment flush");
+ } else if (av && (!GST_BUFFER_TIMESTAMP_IS_VALID (buf) ||
+ !GST_CLOCK_TIME_IS_VALID (priv->out_ts) ||
+ ((diff = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP (buf),
+ priv->out_ts + priv->out_dur)) > tol) || diff < -tol)) {
+ assemble = TRUE;
+ GST_LOG_OBJECT (dec, "buffer %d ms apart from current fragment",
+ (gint) (diff / GST_MSECOND));
+ } else {
+ /* add or start collecting */
+ if (!av) {
+ GST_LOG_OBJECT (dec, "starting new fragment");
+ priv->out_ts = GST_BUFFER_TIMESTAMP (buf);
+ } else {
+ GST_LOG_OBJECT (dec, "adding to fragment");
+ }
+ gst_adapter_push (priv->adapter_out, buf);
+ priv->out_dur += GST_BUFFER_DURATION (buf);
+ av += gst_buffer_get_size (buf);
+ buf = NULL;
+ }
+ if (priv->out_dur > dec->priv->latency)
+ assemble = TRUE;
+ if (av && assemble) {
+ GST_LOG_OBJECT (dec, "assembling fragment");
+ inbuf = buf;
+ buf = gst_adapter_take_buffer (priv->adapter_out, av);
+ GST_BUFFER_TIMESTAMP (buf) = priv->out_ts;
+ GST_BUFFER_DURATION (buf) = priv->out_dur;
+ priv->out_ts = GST_CLOCK_TIME_NONE;
+ priv->out_dur = 0;
+ }
+ }
+
+ if (G_LIKELY (buf)) {
+
+ if (G_UNLIKELY (priv->discont)) {
+ GST_LOG_OBJECT (dec, "marking discont");
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ priv->discont = FALSE;
+ }
+
+ if (G_LIKELY (GST_BUFFER_TIMESTAMP_IS_VALID (buf))) {
+ /* duration should always be valid for raw audio */
+ g_assert (GST_BUFFER_DURATION_IS_VALID (buf));
+ dec->segment.position =
+ GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf);
+ }
+
+ if (klass->pre_push) {
+ /* last chance for subclass to do some dirty stuff */
+ ret = klass->pre_push (dec, &buf);
+ if (ret != GST_FLOW_OK || !buf) {
+ GST_DEBUG_OBJECT (dec, "subclass returned %s, buf %p",
+ gst_flow_get_name (ret), buf);
+ if (buf)
+ gst_buffer_unref (buf);
+ goto exit;
+ }
+ }
+
+ GST_LOG_OBJECT (dec, "pushing buffer of size %d with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, gst_buffer_get_size (buf),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ if (dec->segment.rate > 0.0) {
+ ret = gst_pad_push (dec->srcpad, buf);
+ GST_LOG_OBJECT (dec, "buffer pushed: %s", gst_flow_get_name (ret));
+ } else {
+ ret = GST_FLOW_OK;
+ priv->queued = g_list_prepend (priv->queued, buf);
+ GST_LOG_OBJECT (dec, "buffer queued");
+ }
+
+ exit:
+ if (inbuf) {
+ buf = inbuf;
+ goto again;
+ }
+ }
+
+ return ret;
+}
+
+GstFlowReturn
+gst_audio_decoder_finish_frame (GstAudioDecoder * dec, GstBuffer * buf,
+ gint frames)
+{
+ GstAudioDecoderPrivate *priv;
+ GstAudioDecoderContext *ctx;
+ gint samples = 0;
+ GstClockTime ts, next_ts;
+ gsize size;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ /* subclass should know what it is producing by now */
+ g_return_val_if_fail (buf == NULL || gst_pad_has_current_caps (dec->srcpad),
+ GST_FLOW_ERROR);
+ /* subclass should not hand us no data */
+ g_return_val_if_fail (buf == NULL || gst_buffer_get_size (buf) > 0,
+ GST_FLOW_ERROR);
+ /* no dummy calls please */
+ g_return_val_if_fail (frames != 0, GST_FLOW_ERROR);
+
+ priv = dec->priv;
+ ctx = &dec->priv->ctx;
+ size = buf ? gst_buffer_get_size (buf) : 0;
+
+ GST_LOG_OBJECT (dec, "accepting %d bytes == %d samples for %d frames",
+ buf ? size : -1, buf ? size / ctx->info.bpf : -1, frames);
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+
+ if (priv->pending_events) {
+ GList *pending_events, *l;
+
+ pending_events = priv->pending_events;
+ priv->pending_events = NULL;
+
+ GST_DEBUG_OBJECT (dec, "Pushing pending events");
+ for (l = pending_events; l; l = l->next)
+ gst_pad_push_event (dec->srcpad, l->data);
+ g_list_free (pending_events);
+ }
+
+ /* output shoud be whole number of sample frames */
+ if (G_LIKELY (buf && ctx->info.bpf)) {
+ if (size % ctx->info.bpf)
+ goto wrong_buffer;
+ /* per channel least */
+ samples = size / ctx->info.bpf;
+ }
+
+ /* frame and ts book-keeping */
+ if (G_UNLIKELY (frames < 0)) {
+ if (G_UNLIKELY (-frames - 1 > priv->frames.length))
+ goto overflow;
+ frames = priv->frames.length + frames + 1;
+ } else if (G_UNLIKELY (frames > priv->frames.length)) {
+ if (G_LIKELY (!priv->force)) {
+ /* no way we can let this pass */
+ g_assert_not_reached ();
+ /* really no way */
+ goto overflow;
+ }
+ }
+
+ if (G_LIKELY (priv->frames.length))
+ ts = GST_BUFFER_TIMESTAMP (priv->frames.head->data);
+ else
+ ts = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG_OBJECT (dec, "leading frame ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ts));
+
+ while (priv->frames.length && frames) {
+ gst_buffer_unref (g_queue_pop_head (&priv->frames));
+ dec->priv->ctx.delay = dec->priv->frames.length;
+ frames--;
+ }
+
+ /* lock on */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (priv->base_ts))) {
+ priv->base_ts = ts;
+ GST_DEBUG_OBJECT (dec, "base_ts now %" GST_TIME_FORMAT, GST_TIME_ARGS (ts));
+ }
+
+ if (G_UNLIKELY (!buf))
+ goto exit;
+
+ /* slightly convoluted approach caters for perfect ts if subclass desires */
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ if (dec->priv->tolerance > 0) {
+ GstClockTimeDiff diff;
+
+ g_assert (GST_CLOCK_TIME_IS_VALID (priv->base_ts));
+ next_ts = priv->base_ts +
+ gst_util_uint64_scale (samples, GST_SECOND, ctx->info.rate);
+ GST_LOG_OBJECT (dec, "buffer is %d samples past base_ts %" GST_TIME_FORMAT
+ ", expected ts %" GST_TIME_FORMAT, samples,
+ GST_TIME_ARGS (priv->base_ts), GST_TIME_ARGS (next_ts));
+ diff = GST_CLOCK_DIFF (next_ts, ts);
+ GST_LOG_OBJECT (dec, "ts diff %d ms", (gint) (diff / GST_MSECOND));
+ /* if within tolerance,
+ * discard buffer ts and carry on producing perfect stream,
+ * otherwise resync to ts */
+ if (G_UNLIKELY (diff < -dec->priv->tolerance ||
+ diff > dec->priv->tolerance)) {
+ GST_DEBUG_OBJECT (dec, "base_ts resync");
+ priv->base_ts = ts;
+ priv->samples = 0;
+ }
+ } else {
+ GST_DEBUG_OBJECT (dec, "base_ts resync");
+ priv->base_ts = ts;
+ priv->samples = 0;
+ }
+ }
+
+ /* delayed one-shot stuff until confirmed data */
+ if (priv->taglist) {
+ GST_DEBUG_OBJECT (dec, "codec tag %" GST_PTR_FORMAT, priv->taglist);
+ if (gst_tag_list_is_empty (priv->taglist)) {
+ gst_tag_list_free (priv->taglist);
+ } else {
+ gst_element_found_tags (GST_ELEMENT (dec), priv->taglist);
+ }
+ priv->taglist = NULL;
+ }
+
+ buf = gst_buffer_make_writable (buf);
+ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (priv->base_ts))) {
+ GST_BUFFER_TIMESTAMP (buf) =
+ priv->base_ts +
+ GST_FRAMES_TO_CLOCK_TIME (priv->samples, ctx->info.rate);
+ GST_BUFFER_DURATION (buf) = priv->base_ts +
+ GST_FRAMES_TO_CLOCK_TIME (priv->samples + samples, ctx->info.rate) -
+ GST_BUFFER_TIMESTAMP (buf);
+ } else {
+ GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (buf) =
+ GST_FRAMES_TO_CLOCK_TIME (samples, ctx->info.rate);
+ }
+ priv->samples += samples;
+ priv->samples_out += samples;
+
+ /* we got data, so note things are looking up */
+ if (G_UNLIKELY (dec->priv->error_count))
+ dec->priv->error_count--;
+
+exit:
+ ret = gst_audio_decoder_output (dec, buf);
+
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+
+ return ret;
+
+ /* ERRORS */
+wrong_buffer:
+ {
+ GST_ELEMENT_ERROR (dec, STREAM, ENCODE, (NULL),
+ ("buffer size %d not a multiple of %d", size, ctx->info.bpf));
+ gst_buffer_unref (buf);
+ ret = GST_FLOW_ERROR;
+ goto exit;
+ }
+overflow:
+ {
+ GST_ELEMENT_ERROR (dec, STREAM, ENCODE,
+ ("received more decoded frames %d than provided %d", frames,
+ priv->frames.length), (NULL));
+ if (buf)
+ gst_buffer_unref (buf);
+ ret = GST_FLOW_ERROR;
+ goto exit;
+ }
+}
+
+static GstFlowReturn
+gst_audio_decoder_handle_frame (GstAudioDecoder * dec,
+ GstAudioDecoderClass * klass, GstBuffer * buffer)
+{
+ if (G_LIKELY (buffer)) {
+ gsize size = gst_buffer_get_size (buffer);
+ /* keep around for admin */
+ GST_LOG_OBJECT (dec, "tracking frame size %d, ts %" GST_TIME_FORMAT,
+ size, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+ g_queue_push_tail (&dec->priv->frames, buffer);
+ dec->priv->ctx.delay = dec->priv->frames.length;
+ dec->priv->bytes_in += size;
+ } else {
+ GST_LOG_OBJECT (dec, "providing subclass with NULL frame");
+ }
+
+ return klass->handle_frame (dec, buffer);
+}
+
+/* maybe subclass configurable instead, but this allows for a whole lot of
+ * raw samples, so at least quite some encoded ... */
+#define GST_AUDIO_DECODER_MAX_SYNC 10 * 8 * 2 * 1024
+
+static GstFlowReturn
+gst_audio_decoder_push_buffers (GstAudioDecoder * dec, gboolean force)
+{
+ GstAudioDecoderClass *klass;
+ GstAudioDecoderPrivate *priv;
+ GstAudioDecoderContext *ctx;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *buffer;
+ gint av, flush;
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+ priv = dec->priv;
+ ctx = &dec->priv->ctx;
+
+ g_return_val_if_fail (klass->handle_frame != NULL, GST_FLOW_ERROR);
+
+ av = gst_adapter_available (priv->adapter);
+ GST_DEBUG_OBJECT (dec, "available: %d", av);
+
+ while (ret == GST_FLOW_OK) {
+
+ flush = 0;
+ ctx->eos = force;
+
+ if (G_LIKELY (av)) {
+ gint len;
+ GstClockTime ts;
+
+ /* parse if needed */
+ if (klass->parse) {
+ gint offset = 0;
+
+ /* limited (legacy) parsing; avoid whole of baseparse */
+ GST_DEBUG_OBJECT (dec, "parsing available: %d", av);
+ /* piggyback sync state on discont */
+ ctx->sync = !priv->discont;
+ ret = klass->parse (dec, priv->adapter, &offset, &len);
+
+ g_assert (offset <= av);
+ if (offset) {
+ /* jumped a bit */
+ GST_DEBUG_OBJECT (dec, "setting DISCONT");
+ gst_adapter_flush (priv->adapter, offset);
+ flush = offset;
+ /* avoid parsing indefinitely */
+ priv->sync_flush += offset;
+ if (priv->sync_flush > GST_AUDIO_DECODER_MAX_SYNC)
+ goto parse_failed;
+ }
+
+ if (ret == GST_FLOW_UNEXPECTED) {
+ GST_LOG_OBJECT (dec, "no frame yet");
+ ret = GST_FLOW_OK;
+ break;
+ } else if (ret == GST_FLOW_OK) {
+ GST_LOG_OBJECT (dec, "frame at offset %d of length %d", offset, len);
+ g_assert (offset + len <= av);
+ priv->sync_flush = 0;
+ } else {
+ break;
+ }
+ } else {
+ len = av;
+ }
+ /* track upstream ts, but do not get stuck if nothing new upstream */
+ ts = gst_adapter_prev_timestamp (priv->adapter, NULL);
+ if (ts == priv->prev_ts) {
+ GST_LOG_OBJECT (dec, "ts == prev_ts; discarding");
+ ts = GST_CLOCK_TIME_NONE;
+ } else {
+ priv->prev_ts = ts;
+ }
+ buffer = gst_adapter_take_buffer (priv->adapter, len);
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_TIMESTAMP (buffer) = ts;
+ flush += len;
+ } else {
+ if (!force)
+ break;
+ buffer = NULL;
+ }
+
+ ret = gst_audio_decoder_handle_frame (dec, klass, buffer);
+
+ /* do not keep pushing it ... */
+ if (G_UNLIKELY (!av)) {
+ priv->drained = TRUE;
+ break;
+ }
+
+ av -= flush;
+ g_assert (av >= 0);
+ }
+
+ GST_LOG_OBJECT (dec, "done pushing to subclass");
+ return ret;
+
+ /* ERRORS */
+parse_failed:
+ {
+ GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("failed to parse stream"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_audio_decoder_drain (GstAudioDecoder * dec)
+{
+ GstFlowReturn ret;
+
+ if (dec->priv->drained)
+ return GST_FLOW_OK;
+ else {
+ /* dispatch reverse pending buffers */
+ /* chain eventually calls upon drain as well, but by that time
+ * gather list should be clear, so ok ... */
+ if (dec->segment.rate < 0.0 && dec->priv->gather)
+ gst_audio_decoder_chain_reverse (dec, NULL);
+ /* have subclass give all it can */
+ ret = gst_audio_decoder_push_buffers (dec, TRUE);
+ /* ensure all output sent */
+ ret = gst_audio_decoder_output (dec, NULL);
+ /* everything should be away now */
+ if (dec->priv->frames.length) {
+ /* not fatal/impossible though if subclass/codec eats stuff */
+ GST_WARNING_OBJECT (dec, "still %d frames left after draining",
+ dec->priv->frames.length);
+ g_queue_foreach (&dec->priv->frames, (GFunc) gst_buffer_unref, NULL);
+ g_queue_clear (&dec->priv->frames);
+ }
+ /* discard (unparsed) leftover */
+ gst_adapter_clear (dec->priv->adapter);
+
+ return ret;
+ }
+}
+
+/* hard == FLUSH, otherwise discont */
+static GstFlowReturn
+gst_audio_decoder_flush (GstAudioDecoder * dec, gboolean hard)
+{
+ GstAudioDecoderClass *klass;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ GST_LOG_OBJECT (dec, "flush hard %d", hard);
+
+ if (!hard) {
+ ret = gst_audio_decoder_drain (dec);
+ } else {
+ gst_audio_decoder_clear_queues (dec);
+ gst_segment_init (&dec->segment, GST_FORMAT_TIME);
+ dec->priv->error_count = 0;
+ }
+ /* only bother subclass with flushing if known it is already alive
+ * and kicking out stuff */
+ if (klass->flush && dec->priv->samples_out > 0)
+ klass->flush (dec, hard);
+ /* and get (re)set for the sequel */
+ gst_audio_decoder_reset (dec, FALSE);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_audio_decoder_chain_forward (GstAudioDecoder * dec, GstBuffer * buffer)
+{
+ GstFlowReturn ret;
+
+ /* grab buffer */
+ gst_adapter_push (dec->priv->adapter, buffer);
+ buffer = NULL;
+ /* new stuff, so we can push subclass again */
+ dec->priv->drained = FALSE;
+
+ /* hand to subclass */
+ ret = gst_audio_decoder_push_buffers (dec, FALSE);
+
+ GST_LOG_OBJECT (dec, "chain-done");
+ return ret;
+}
+
+static void
+gst_audio_decoder_clear_queues (GstAudioDecoder * dec)
+{
+ GstAudioDecoderPrivate *priv = dec->priv;
+
+ g_list_foreach (priv->queued, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (priv->queued);
+ priv->queued = NULL;
+ g_list_foreach (priv->gather, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (priv->gather);
+ priv->gather = NULL;
+ g_list_foreach (priv->decode, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (priv->decode);
+ priv->decode = NULL;
+}
+
+/*
+ * Input:
+ * Buffer decoding order: 7 8 9 4 5 6 3 1 2 EOS
+ * Discont flag: D D D D
+ *
+ * - Each Discont marks a discont in the decoding order.
+ *
+ * for vorbis, each buffer is a keyframe when we have the previous
+ * buffer. This means that to decode buffer 7, we need buffer 6, which
+ * arrives out of order.
+ *
+ * we first gather buffers in the gather queue until we get a DISCONT. We
+ * prepend each incomming buffer so that they are in reversed order.
+ *
+ * gather queue: 9 8 7
+ * decode queue:
+ * output queue:
+ *
+ * When a DISCONT is received (buffer 4), we move the gather queue to the
+ * decode queue. This is simply done be taking the head of the gather queue
+ * and prepending it to the decode queue. This yields:
+ *
+ * gather queue:
+ * decode queue: 7 8 9
+ * output queue:
+ *
+ * Then we decode each buffer in the decode queue in order and put the output
+ * buffer in the output queue. The first buffer (7) will not produce any output
+ * because it needs the previous buffer (6) which did not arrive yet. This
+ * yields:
+ *
+ * gather queue:
+ * decode queue: 7 8 9
+ * output queue: 9 8
+ *
+ * Then we remove the consumed buffers from the decode queue. Buffer 7 is not
+ * completely consumed, we need to keep it around for when we receive buffer
+ * 6. This yields:
+ *
+ * gather queue:
+ * decode queue: 7
+ * output queue: 9 8
+ *
+ * Then we accumulate more buffers:
+ *
+ * gather queue: 6 5 4
+ * decode queue: 7
+ * output queue:
+ *
+ * prepending to the decode queue on DISCONT yields:
+ *
+ * gather queue:
+ * decode queue: 4 5 6 7
+ * output queue:
+ *
+ * after decoding and keeping buffer 4:
+ *
+ * gather queue:
+ * decode queue: 4
+ * output queue: 7 6 5
+ *
+ * Etc..
+ */
+static GstFlowReturn
+gst_audio_decoder_flush_decode (GstAudioDecoder * dec)
+{
+ GstAudioDecoderPrivate *priv = dec->priv;
+ GstFlowReturn res = GST_FLOW_OK;
+ GList *walk;
+
+ walk = priv->decode;
+
+ GST_DEBUG_OBJECT (dec, "flushing buffers to decoder");
+
+ /* clear buffer and decoder state */
+ gst_audio_decoder_flush (dec, FALSE);
+
+ while (walk) {
+ GList *next;
+ GstBuffer *buf = GST_BUFFER_CAST (walk->data);
+
+ GST_DEBUG_OBJECT (dec, "decoding buffer %p, ts %" GST_TIME_FORMAT,
+ buf, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ next = g_list_next (walk);
+ /* decode buffer, resulting data prepended to output queue */
+ gst_buffer_ref (buf);
+ res = gst_audio_decoder_chain_forward (dec, buf);
+
+ /* if we generated output, we can discard the buffer, else we
+ * keep it in the queue */
+ if (priv->queued) {
+ GST_DEBUG_OBJECT (dec, "decoded buffer to %p", priv->queued->data);
+ priv->decode = g_list_delete_link (priv->decode, walk);
+ gst_buffer_unref (buf);
+ } else {
+ GST_DEBUG_OBJECT (dec, "buffer did not decode, keeping");
+ }
+ walk = next;
+ }
+
+ /* drain any aggregation (or otherwise) leftover */
+ gst_audio_decoder_drain (dec);
+
+ /* now send queued data downstream */
+ while (priv->queued) {
+ GstBuffer *buf = GST_BUFFER_CAST (priv->queued->data);
+
+ if (G_LIKELY (res == GST_FLOW_OK)) {
+ GST_DEBUG_OBJECT (dec, "pushing buffer %p of size %u, "
+ "time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, buf,
+ gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ /* should be already, but let's be sure */
+ buf = gst_buffer_make_writable (buf);
+ /* avoid stray DISCONT from forward processing,
+ * which have no meaning in reverse pushing */
+ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
+ res = gst_pad_push (dec->srcpad, buf);
+ } else {
+ gst_buffer_unref (buf);
+ }
+
+ priv->queued = g_list_delete_link (priv->queued, priv->queued);
+ }
+
+ return res;
+}
+
+static GstFlowReturn
+gst_audio_decoder_chain_reverse (GstAudioDecoder * dec, GstBuffer * buf)
+{
+ GstAudioDecoderPrivate *priv = dec->priv;
+ GstFlowReturn result = GST_FLOW_OK;
+
+ /* if we have a discont, move buffers to the decode list */
+ if (!buf || GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) {
+ GST_DEBUG_OBJECT (dec, "received discont");
+ while (priv->gather) {
+ GstBuffer *gbuf;
+
+ gbuf = GST_BUFFER_CAST (priv->gather->data);
+ /* remove from the gather list */
+ priv->gather = g_list_delete_link (priv->gather, priv->gather);
+ /* copy to decode queue */
+ priv->decode = g_list_prepend (priv->decode, gbuf);
+ }
+ /* decode stuff in the decode queue */
+ gst_audio_decoder_flush_decode (dec);
+ }
+
+ if (G_LIKELY (buf)) {
+ GST_DEBUG_OBJECT (dec, "gathering buffer %p of size %u, "
+ "time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, buf,
+ gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ /* add buffer to gather queue */
+ priv->gather = g_list_prepend (priv->gather, buf);
+ }
+
+ return result;
+}
+
+static GstFlowReturn
+gst_audio_decoder_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstAudioDecoder *dec;
+ GstFlowReturn ret;
+
+ dec = GST_AUDIO_DECODER (GST_PAD_PARENT (pad));
+
+ GST_LOG_OBJECT (dec,
+ "received buffer of size %d with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, gst_buffer_get_size (buffer),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+
+ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
+ gint64 samples, ts;
+
+ /* track present position */
+ ts = dec->priv->base_ts;
+ samples = dec->priv->samples;
+
+ GST_DEBUG_OBJECT (dec, "handling discont");
+ gst_audio_decoder_flush (dec, FALSE);
+ dec->priv->discont = TRUE;
+
+ /* buffer may claim DISCONT loudly, if it can't tell us where we are now,
+ * we'll stick to where we were ...
+ * Particularly useful/needed for upstream BYTE based */
+ if (dec->segment.rate > 0.0 && !GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) {
+ GST_DEBUG_OBJECT (dec, "... but restoring previous ts tracking");
+ dec->priv->base_ts = ts;
+ dec->priv->samples = samples;
+ }
+ }
+
+ if (dec->segment.rate > 0.0)
+ ret = gst_audio_decoder_chain_forward (dec, buffer);
+ else
+ ret = gst_audio_decoder_chain_reverse (dec, buffer);
+
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+
+ return ret;
+}
+
+/* perform upstream byte <-> time conversion (duration, seeking)
+ * if subclass allows and if enough data for moderately decent conversion */
+static inline gboolean
+gst_audio_decoder_do_byte (GstAudioDecoder * dec)
+{
+ return dec->priv->ctx.do_byte_time && dec->priv->ctx.info.bpf &&
+ dec->priv->ctx.info.rate <= dec->priv->samples_out;
+}
+
+static gboolean
+gst_audio_decoder_sink_eventfunc (GstAudioDecoder * dec, GstEvent * event)
+{
+ gboolean handled = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment seg;
+
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+ gst_event_copy_segment (event, &seg);
+
+ if (seg.format == GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (dec, "received TIME SEGMENT %" GST_PTR_FORMAT, &seg);
+ } else {
+ gint64 nstart;
+ GST_DEBUG_OBJECT (dec, "received SEGMENT %" GST_PTR_FORMAT, &seg);
+ /* handle newsegment resulting from legacy simple seeking */
+ /* note that we need to convert this whether or not enough data
+ * to handle initial newsegment */
+ if (dec->priv->ctx.do_byte_time &&
+ gst_pad_query_convert (dec->sinkpad, GST_FORMAT_BYTES, seg.start,
+ GST_FORMAT_TIME, &nstart)) {
+ /* best attempt convert */
+ /* as these are only estimates, stop is kept open-ended to avoid
+ * premature cutting */
+ GST_DEBUG_OBJECT (dec, "converted to TIME start %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (nstart));
+ seg.format = GST_FORMAT_TIME;
+ seg.start = nstart;
+ seg.time = nstart;
+ seg.stop = GST_CLOCK_TIME_NONE;
+ /* replace event */
+ gst_event_unref (event);
+ event = gst_event_new_segment (&seg);
+ } else {
+ GST_DEBUG_OBJECT (dec, "unsupported format; ignoring");
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+ break;
+ }
+ }
+
+ /* finish current segment */
+ gst_audio_decoder_drain (dec);
+
+#if 0
+ if (update) {
+ /* time progressed without data, see if we can fill the gap with
+ * some concealment data */
+ GST_DEBUG_OBJECT (dec,
+ "segment update: plc %d, do_plc %d, position %" GST_TIME_FORMAT,
+ dec->priv->plc, dec->priv->ctx.do_plc,
+ GST_TIME_ARGS (dec->segment.position));
+ if (dec->priv->plc && dec->priv->ctx.do_plc &&
+ dec->segment.rate > 0.0 && dec->segment.position < start) {
+ GstAudioDecoderClass *klass;
+ GstBuffer *buf;
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+ /* hand subclass empty frame with duration that needs covering */
+ buf = gst_buffer_new ();
+ GST_BUFFER_DURATION (buf) = start - dec->segment.position;
+ /* best effort, not much error handling */
+ gst_audio_decoder_handle_frame (dec, klass, buf);
+ }
+ } else
+#endif
+ {
+ /* prepare for next one */
+ gst_audio_decoder_flush (dec, FALSE);
+ /* and that's where we time from,
+ * in case upstream does not come up with anything better
+ * (e.g. upstream BYTE) */
+ if (seg.format != GST_FORMAT_TIME) {
+ dec->priv->base_ts = seg.start;
+ dec->priv->samples = 0;
+ }
+ }
+
+ /* and follow along with segment */
+ dec->segment = seg;
+ dec->priv->pending_events =
+ g_list_append (dec->priv->pending_events, event);
+ handled = TRUE;
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+ break;
+ }
+
+ case GST_EVENT_FLUSH_START:
+ break;
+
+ case GST_EVENT_FLUSH_STOP:
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+ /* prepare for fresh start */
+ gst_audio_decoder_flush (dec, TRUE);
+
+ g_list_foreach (dec->priv->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (dec->priv->pending_events);
+ dec->priv->pending_events = NULL;
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+ break;
+
+ case GST_EVENT_EOS:
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+ gst_audio_decoder_drain (dec);
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+ break;
+
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ gst_audio_decoder_sink_setcaps (dec, caps);
+ gst_event_unref (event);
+ handled = TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+static gboolean
+gst_audio_decoder_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstAudioDecoder *dec;
+ GstAudioDecoderClass *klass;
+ gboolean handled = FALSE;
+ gboolean ret = TRUE;
+
+ dec = GST_AUDIO_DECODER (gst_pad_get_parent (pad));
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ GST_DEBUG_OBJECT (dec, "received event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ if (klass->event)
+ handled = klass->event (dec, event);
+
+ if (!handled)
+ handled = gst_audio_decoder_sink_eventfunc (dec, event);
+
+ if (!handled) {
+ /* Forward non-serialized events and EOS/FLUSH_STOP immediately.
+ * For EOS this is required because no buffer or serialized event
+ * will come after EOS and nothing could trigger another
+ * _finish_frame() call.
+ *
+ * For FLUSH_STOP this is required because it is expected
+ * to be forwarded immediately and no buffers are queued anyway.
+ */
+ if (!GST_EVENT_IS_SERIALIZED (event)
+ || GST_EVENT_TYPE (event) == GST_EVENT_EOS
+ || GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
+ ret = gst_pad_event_default (pad, event);
+ } else {
+ GST_AUDIO_DECODER_STREAM_LOCK (dec);
+ dec->priv->pending_events =
+ g_list_append (dec->priv->pending_events, event);
+ GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
+ ret = TRUE;
+ }
+ }
+
+ GST_DEBUG_OBJECT (dec, "event handled");
+
+ gst_object_unref (dec);
+ return ret;
+}
+
+static gboolean
+gst_audio_decoder_do_seek (GstAudioDecoder * dec, GstEvent * event)
+{
+ GstSeekFlags flags;
+ GstSeekType start_type, end_type;
+ GstFormat format;
+ gdouble rate;
+ gint64 start, start_time, end_time;
+ GstSegment seek_segment;
+ guint32 seqnum;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &start_type,
+ &start_time, &end_type, &end_time);
+
+ /* we'll handle plain open-ended flushing seeks with the simple approach */
+ if (rate != 1.0) {
+ GST_DEBUG_OBJECT (dec, "unsupported seek: rate");
+ return FALSE;
+ }
+
+ if (start_type != GST_SEEK_TYPE_SET) {
+ GST_DEBUG_OBJECT (dec, "unsupported seek: start time");
+ return FALSE;
+ }
+
+ if (end_type != GST_SEEK_TYPE_NONE ||
+ (end_type == GST_SEEK_TYPE_SET && end_time != GST_CLOCK_TIME_NONE)) {
+ GST_DEBUG_OBJECT (dec, "unsupported seek: end time");
+ return FALSE;
+ }
+
+ if (!(flags & GST_SEEK_FLAG_FLUSH)) {
+ GST_DEBUG_OBJECT (dec, "unsupported seek: not flushing");
+ return FALSE;
+ }
+
+ memcpy (&seek_segment, &dec->segment, sizeof (seek_segment));
+ gst_segment_do_seek (&seek_segment, rate, format, flags, start_type,
+ start_time, end_type, end_time, NULL);
+ start_time = seek_segment.position;
+
+ if (!gst_pad_query_convert (dec->sinkpad, GST_FORMAT_TIME, start_time,
+ GST_FORMAT_BYTES, &start)) {
+ GST_DEBUG_OBJECT (dec, "conversion failed");
+ return FALSE;
+ }
+
+ seqnum = gst_event_get_seqnum (event);
+ event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, flags,
+ GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_NONE, -1);
+ gst_event_set_seqnum (event, seqnum);
+
+ GST_DEBUG_OBJECT (dec, "seeking to %" GST_TIME_FORMAT " at byte offset %"
+ G_GINT64_FORMAT, GST_TIME_ARGS (start_time), start);
+
+ return gst_pad_push_event (dec->sinkpad, event);
+}
+
+static gboolean
+gst_audio_decoder_src_event (GstPad * pad, GstEvent * event)
+{
+ GstAudioDecoder *dec;
+ gboolean res = FALSE;
+
+ dec = GST_AUDIO_DECODER (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (dec, "received event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ GstFormat format;
+ gdouble rate;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ gint64 tcur, tstop;
+ guint32 seqnum;
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+ &stop_type, &stop);
+ seqnum = gst_event_get_seqnum (event);
+
+ /* upstream gets a chance first */
+ if ((res = gst_pad_push_event (dec->sinkpad, event)))
+ break;
+
+ /* if upstream fails for a time seek, maybe we can help if allowed */
+ if (format == GST_FORMAT_TIME) {
+ if (gst_audio_decoder_do_byte (dec))
+ res = gst_audio_decoder_do_seek (dec, event);
+ break;
+ }
+
+ /* ... though a non-time seek can be aided as well */
+ /* First bring the requested format to time */
+ if (!(res =
+ gst_pad_query_convert (pad, format, cur, GST_FORMAT_TIME, &tcur)))
+ goto convert_error;
+ if (!(res =
+ gst_pad_query_convert (pad, format, stop, GST_FORMAT_TIME,
+ &tstop)))
+ goto convert_error;
+
+ /* then seek with time on the peer */
+ event = gst_event_new_seek (rate, GST_FORMAT_TIME,
+ flags, cur_type, tcur, stop_type, tstop);
+ gst_event_set_seqnum (event, seqnum);
+
+ res = gst_pad_push_event (dec->sinkpad, event);
+ break;
+ }
+ default:
+ res = gst_pad_push_event (dec->sinkpad, event);
+ break;
+ }
+done:
+ gst_object_unref (dec);
+
+ return res;
+
+ /* ERRORS */
+convert_error:
+ {
+ GST_DEBUG_OBJECT (dec, "cannot convert start/stop for seek");
+ goto done;
+ }
+}
+
+/*
+ * gst_audio_encoded_audio_convert:
+ * @fmt: audio format of the encoded audio
+ * @bytes: number of encoded bytes
+ * @samples: number of encoded samples
+ * @src_format: source format
+ * @src_value: source value
+ * @dest_format: destination format
+ * @dest_value: destination format
+ *
+ * Helper function to convert @src_value in @src_format to @dest_value in
+ * @dest_format for encoded audio data. Conversion is possible between
+ * BYTE and TIME format by using estimated bitrate based on
+ * @samples and @bytes (and @fmt).
+ */
+/* FIXME: make gst_audio_encoded_audio_convert() public? */
+static gboolean
+gst_audio_encoded_audio_convert (GstAudioInfo * fmt,
+ gint64 bytes, gint64 samples, GstFormat src_format,
+ gint64 src_value, GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (dest_format != NULL, FALSE);
+ g_return_val_if_fail (dest_value != NULL, FALSE);
+
+ if (G_UNLIKELY (src_format == *dest_format || src_value == 0 ||
+ src_value == -1)) {
+ if (dest_value)
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ if (samples == 0 || bytes == 0 || fmt->rate == 0) {
+ GST_DEBUG ("not enough metadata yet to convert");
+ goto exit;
+ }
+
+ bytes *= fmt->rate;
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * samples, bytes);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ *dest_value = gst_util_uint64_scale (src_value, bytes,
+ samples * GST_SECOND);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+
+exit:
+ return res;
+}
+
+static gboolean
+gst_audio_decoder_sink_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+ GstAudioDecoder *dec;
+
+ dec = GST_AUDIO_DECODER (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_FORMATS:
+ {
+ gst_query_set_formats (query, 2, GST_FORMAT_TIME, GST_FORMAT_BYTES);
+ 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_audio_encoded_audio_convert (&dec->priv->ctx.info,
+ dec->priv->bytes_in, dec->priv->samples_out,
+ 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;
+ }
+
+error:
+ gst_object_unref (dec);
+ return res;
+}
+
+static const GstQueryType *
+gst_audio_decoder_get_query_types (GstPad * pad)
+{
+ static const GstQueryType gst_audio_decoder_src_query_types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_CONVERT,
+ GST_QUERY_LATENCY,
+ 0
+ };
+
+ return gst_audio_decoder_src_query_types;
+}
+
+/* FIXME ? are any of these queries (other than latency) a decoder's business ??
+ * also, the conversion stuff might seem to make sense, but seems to not mind
+ * segment stuff etc at all
+ * Supposedly that's backward compatibility ... */
+static gboolean
+gst_audio_decoder_src_query (GstPad * pad, GstQuery * query)
+{
+ GstAudioDecoder *dec;
+ GstPad *peerpad;
+ gboolean res = FALSE;
+
+ dec = GST_AUDIO_DECODER (GST_PAD_PARENT (pad));
+ peerpad = gst_pad_get_peer (GST_PAD (dec->sinkpad));
+
+ GST_LOG_OBJECT (dec, "handling query: %" GST_PTR_FORMAT, query);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:
+ {
+ GstFormat format;
+
+ /* upstream in any case */
+ if ((res = gst_pad_query_default (pad, query)))
+ break;
+
+ gst_query_parse_duration (query, &format, NULL);
+ /* try answering TIME by converting from BYTE if subclass allows */
+ if (format == GST_FORMAT_TIME && gst_audio_decoder_do_byte (dec)) {
+ gint64 value;
+
+ if (gst_pad_query_peer_duration (dec->sinkpad, GST_FORMAT_BYTES,
+ &value)) {
+ GST_LOG_OBJECT (dec, "upstream size %" G_GINT64_FORMAT, value);
+ if (gst_pad_query_convert (dec->sinkpad, GST_FORMAT_BYTES, value,
+ GST_FORMAT_TIME, &value)) {
+ gst_query_set_duration (query, GST_FORMAT_TIME, value);
+ res = TRUE;
+ }
+ }
+ }
+ break;
+ }
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+ gint64 time, value;
+
+ if ((res = gst_pad_peer_query (dec->sinkpad, query))) {
+ GST_LOG_OBJECT (dec, "returning peer response");
+ break;
+ }
+
+ /* we start from the last seen time */
+ time = dec->segment.position;
+ /* correct for the segment values */
+ time = gst_segment_to_stream_time (&dec->segment, GST_FORMAT_TIME, time);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: our time: %" GST_TIME_FORMAT, query, GST_TIME_ARGS (time));
+
+ /* and convert to the final format */
+ gst_query_parse_position (query, &format, NULL);
+ if (!(res = gst_pad_query_convert (pad, GST_FORMAT_TIME, time,
+ format, &value)))
+ break;
+
+ gst_query_set_position (query, format, value);
+
+ GST_LOG_OBJECT (dec,
+ "query %p: we return %" G_GINT64_FORMAT " (format %u)", query, value,
+ format);
+ break;
+ }
+ case GST_QUERY_FORMATS:
+ {
+ gst_query_set_formats (query, 3,
+ GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_DEFAULT);
+ 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_audio_info_convert (&dec->priv->ctx.info,
+ src_fmt, src_val, dest_fmt, &dest_val)))
+ break;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ if ((res = gst_pad_peer_query (dec->sinkpad, query))) {
+ gboolean live;
+ GstClockTime min_latency, max_latency;
+
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+ GST_DEBUG_OBJECT (dec, "Peer latency: live %d, min %"
+ GST_TIME_FORMAT " max %" GST_TIME_FORMAT, live,
+ GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
+
+ GST_OBJECT_LOCK (dec);
+ /* add our latency */
+ if (min_latency != -1)
+ min_latency += dec->priv->ctx.min_latency;
+ if (max_latency != -1)
+ max_latency += dec->priv->ctx.max_latency;
+ GST_OBJECT_UNLOCK (dec);
+
+ gst_query_set_latency (query, live, min_latency, max_latency);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+
+ gst_object_unref (peerpad);
+ return res;
+}
+
+static gboolean
+gst_audio_decoder_stop (GstAudioDecoder * dec)
+{
+ GstAudioDecoderClass *klass;
+ gboolean ret = TRUE;
+
+ GST_DEBUG_OBJECT (dec, "gst_audio_decoder_stop");
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ if (klass->stop) {
+ ret = klass->stop (dec);
+ }
+
+ /* clean up */
+ gst_audio_decoder_reset (dec, TRUE);
+
+ if (ret)
+ dec->priv->active = FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_audio_decoder_start (GstAudioDecoder * dec)
+{
+ GstAudioDecoderClass *klass;
+ gboolean ret = TRUE;
+
+ GST_DEBUG_OBJECT (dec, "gst_audio_decoder_start");
+
+ klass = GST_AUDIO_DECODER_GET_CLASS (dec);
+
+ /* arrange clean state */
+ gst_audio_decoder_reset (dec, TRUE);
+
+ if (klass->start) {
+ ret = klass->start (dec);
+ }
+
+ if (ret)
+ dec->priv->active = TRUE;
+
+ return TRUE;
+}
+
+static void
+gst_audio_decoder_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAudioDecoder *dec;
+
+ dec = GST_AUDIO_DECODER (object);
+
+ switch (prop_id) {
+ case PROP_LATENCY:
+ g_value_set_int64 (value, dec->priv->latency);
+ break;
+ case PROP_TOLERANCE:
+ g_value_set_int64 (value, dec->priv->tolerance);
+ break;
+ case PROP_PLC:
+ g_value_set_boolean (value, dec->priv->plc);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_decoder_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAudioDecoder *dec;
+
+ dec = GST_AUDIO_DECODER (object);
+
+ switch (prop_id) {
+ case PROP_LATENCY:
+ dec->priv->latency = g_value_get_int64 (value);
+ break;
+ case PROP_TOLERANCE:
+ dec->priv->tolerance = g_value_get_int64 (value);
+ break;
+ case PROP_PLC:
+ dec->priv->plc = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_audio_decoder_change_state (GstElement * element, GstStateChange transition)
+{
+ GstAudioDecoder *codec;
+ GstStateChangeReturn ret;
+
+ codec = GST_AUDIO_DECODER (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (!gst_audio_decoder_start (codec)) {
+ goto start_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:
+ if (!gst_audio_decoder_stop (codec)) {
+ goto stop_failed;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+start_failed:
+ {
+ GST_ELEMENT_ERROR (codec, LIBRARY, INIT, (NULL), ("Failed to start codec"));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+stop_failed:
+ {
+ GST_ELEMENT_ERROR (codec, LIBRARY, INIT, (NULL), ("Failed to stop codec"));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+GstFlowReturn
+_gst_audio_decoder_error (GstAudioDecoder * dec, gint weight,
+ GQuark domain, gint code, gchar * txt, gchar * dbg, const gchar * file,
+ const gchar * function, gint line)
+{
+ if (txt)
+ GST_WARNING_OBJECT (dec, "error: %s", txt);
+ if (dbg)
+ GST_WARNING_OBJECT (dec, "error: %s", dbg);
+ dec->priv->error_count += weight;
+ dec->priv->discont = TRUE;
+ if (dec->priv->ctx.max_errors < dec->priv->error_count) {
+ gst_element_message_full (GST_ELEMENT (dec), GST_MESSAGE_ERROR,
+ domain, code, txt, dbg, file, function, line);
+ return GST_FLOW_ERROR;
+ } else {
+ return GST_FLOW_OK;
+ }
+}
+
+/**
+ * gst_audio_decoder_get_audio_info:
+ * @dec: a #GstAudioDecoder
+ *
+ * Returns: a #GstAudioInfo describing the input audio format
+ *
+ * Since: 0.10.36
+ */
+GstAudioInfo *
+gst_audio_decoder_get_audio_info (GstAudioDecoder * dec)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), NULL);
+
+ return &dec->priv->ctx.info;
+}
+
+/**
+ * gst_audio_decoder_set_plc_aware:
+ * @dec: a #GstAudioDecoder
+ * @plc: new plc state
+ *
+ * Indicates whether or not subclass handles packet loss concealment (plc).
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_plc_aware (GstAudioDecoder * dec, gboolean plc)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ dec->priv->ctx.do_plc = plc;
+}
+
+/**
+ * gst_audio_decoder_get_plc_aware:
+ * @dec: a #GstAudioDecoder
+ *
+ * Returns: currently configured plc handling
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_decoder_get_plc_aware (GstAudioDecoder * dec)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), 0);
+
+ return dec->priv->ctx.do_plc;
+}
+
+/**
+ * gst_audio_decoder_set_byte_time:
+ * @dec: a #GstAudioDecoder
+ * @enabled: whether to enable byte to time conversion
+ *
+ * Allows baseclass to perform byte to time estimated conversion.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_byte_time (GstAudioDecoder * dec, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ dec->priv->ctx.do_byte_time = enabled;
+}
+
+/**
+ * gst_audio_decoder_get_byte_time:
+ * @dec: a #GstAudioDecoder
+ *
+ * Returns: currently configured byte to time conversion setting
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_decoder_get_byte_time (GstAudioDecoder * dec)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), 0);
+
+ return dec->priv->ctx.do_byte_time;
+}
+
+/**
+ * gst_audio_decoder_get_delay:
+ * @dec: a #GstAudioDecoder
+ *
+ * Returns: currently configured decoder delay
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_decoder_get_delay (GstAudioDecoder * dec)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), 0);
+
+ return dec->priv->ctx.delay;
+}
+
+/**
+ * gst_audio_decoder_set_max_errors:
+ * @dec: a #GstAudioDecoder
+ * @num: max tolerated errors
+ *
+ * Sets numbers of tolerated decoder errors, where a tolerated one is then only
+ * warned about, but more than tolerated will lead to fatal error.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_max_errors (GstAudioDecoder * dec, gint num)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ dec->priv->ctx.max_errors = num;
+}
+
+/**
+ * gst_audio_decoder_get_max_errors:
+ * @dec: a #GstAudioDecoder
+ *
+ * Returns: currently configured decoder tolerated error count.
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_decoder_get_max_errors (GstAudioDecoder * dec)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), 0);
+
+ return dec->priv->ctx.max_errors;
+}
+
+/**
+ * gst_audio_decoder_set_latency:
+ * @dec: a #GstAudioDecoder
+ * @min: minimum latency
+ * @max: maximum latency
+ *
+ * Sets decoder latency.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_latency (GstAudioDecoder * dec,
+ GstClockTime min, GstClockTime max)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ GST_OBJECT_LOCK (dec);
+ dec->priv->ctx.min_latency = min;
+ dec->priv->ctx.max_latency = max;
+ GST_OBJECT_UNLOCK (dec);
+}
+
+/**
+ * gst_audio_decoder_get_latency:
+ * @dec: a #GstAudioDecoder
+ * @min: (out) (allow-none): a pointer to storage to hold minimum latency
+ * @max: (out) (allow-none): a pointer to storage to hold maximum latency
+ *
+ * Sets the variables pointed to by @min and @max to the currently configured
+ * latency.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_get_latency (GstAudioDecoder * dec,
+ GstClockTime * min, GstClockTime * max)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ GST_OBJECT_LOCK (dec);
+ if (min)
+ *min = dec->priv->ctx.min_latency;
+ if (max)
+ *max = dec->priv->ctx.max_latency;
+ GST_OBJECT_UNLOCK (dec);
+}
+
+/**
+ * gst_audio_decoder_get_parse_state:
+ * @dec: a #GstAudioDecoder
+ * @sync: a pointer to a variable to hold the current sync state
+ * @eos: a pointer to a variable to hold the current eos state
+ *
+ * Return current parsing (sync and eos) state.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_get_parse_state (GstAudioDecoder * dec,
+ gboolean * sync, gboolean * eos)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ if (sync)
+ *sync = dec->priv->ctx.sync;
+ if (eos)
+ *eos = dec->priv->ctx.eos;
+}
+
+/**
+ * gst_audio_decoder_set_plc:
+ * @dec: a #GstAudioDecoder
+ * @enabled: new state
+ *
+ * Enable or disable decoder packet loss concealment, provided subclass
+ * and codec are capable and allow handling plc.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_plc (GstAudioDecoder * dec, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ GST_LOG_OBJECT (dec, "enabled: %d", enabled);
+
+ GST_OBJECT_LOCK (dec);
+ dec->priv->plc = enabled;
+ GST_OBJECT_UNLOCK (dec);
+}
+
+/**
+ * gst_audio_decoder_get_plc:
+ * @dec: a #GstAudioDecoder
+ *
+ * Queries decoder packet loss concealment handling.
+ *
+ * Returns: TRUE if packet loss concealment is enabled.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gboolean
+gst_audio_decoder_get_plc (GstAudioDecoder * dec)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), FALSE);
+
+ GST_OBJECT_LOCK (dec);
+ result = dec->priv->plc;
+ GST_OBJECT_UNLOCK (dec);
+
+ return result;
+}
+
+/**
+ * gst_audio_decoder_set_min_latency:
+ * @dec: a #GstAudioDecoder
+ * @num: new minimum latency
+ *
+ * Sets decoder minimum aggregation latency.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_min_latency (GstAudioDecoder * dec, gint64 num)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ GST_OBJECT_LOCK (dec);
+ dec->priv->latency = num;
+ GST_OBJECT_UNLOCK (dec);
+}
+
+/**
+ * gst_audio_decoder_get_min_latency:
+ * @dec: a #GstAudioDecoder
+ *
+ * Queries decoder's latency aggregation.
+ *
+ * Returns: aggregation latency.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gint64
+gst_audio_decoder_get_min_latency (GstAudioDecoder * dec)
+{
+ gint64 result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), FALSE);
+
+ GST_OBJECT_LOCK (dec);
+ result = dec->priv->latency;
+ GST_OBJECT_UNLOCK (dec);
+
+ return result;
+}
+
+/**
+ * gst_audio_decoder_set_tolerance:
+ * @dec: a #GstAudioDecoder
+ * @tolerance: new tolerance
+ *
+ * Configures decoder audio jitter tolerance threshold.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_decoder_set_tolerance (GstAudioDecoder * dec, gint64 tolerance)
+{
+ g_return_if_fail (GST_IS_AUDIO_DECODER (dec));
+
+ GST_OBJECT_LOCK (dec);
+ dec->priv->tolerance = tolerance;
+ GST_OBJECT_UNLOCK (dec);
+}
+
+/**
+ * gst_audio_decoder_get_tolerance:
+ * @dec: a #GstAudioDecoder
+ *
+ * Queries current audio jitter tolerance threshold.
+ *
+ * Returns: decoder audio jitter tolerance threshold.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gint64
+gst_audio_decoder_get_tolerance (GstAudioDecoder * dec)
+{
+ gint64 result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_DECODER (dec), 0);
+
+ GST_OBJECT_LOCK (dec);
+ result = dec->priv->tolerance;
+ GST_OBJECT_UNLOCK (dec);
+
+ return result;
+}
diff --git a/gst-libs/gst/audio/gstaudiodecoder.h b/gst-libs/gst/audio/gstaudiodecoder.h
new file mode 100644
index 0000000..25e6132
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiodecoder.h
@@ -0,0 +1,294 @@
+/* GStreamer
+ * Copyright (C) 2009 Igalia S.L.
+ * Author: Iago Toral Quiroga <itoral@igalia.com>
+ * Copyright (C) 2011 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>.
+ * Copyright (C) 2011 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef _GST_AUDIO_DECODER_H_
+#define _GST_AUDIO_DECODER_H_
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "GstAudioDecoder is unstable API and may change in future."
+#warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <gst/base/gstadapter.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_DECODER \
+ (gst_audio_decoder_get_type())
+#define GST_AUDIO_DECODER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_DECODER,GstAudioDecoder))
+#define GST_AUDIO_DECODER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_DECODER,GstAudioDecoderClass))
+#define GST_AUDIO_DECODER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_AUDIO_DECODER,GstAudioDecoderClass))
+#define GST_IS_AUDIO_DECODER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_DECODER))
+#define GST_IS_AUDIO_DECODER_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_DECODER))
+
+/**
+ * GST_AUDIO_DECODER_SINK_NAME:
+ *
+ * The name of the templates for the sink pad.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_DECODER_SINK_NAME "sink"
+/**
+ * GST_AUDIO_DECODER_SRC_NAME:
+ *
+ * The name of the templates for the source pad.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_DECODER_SRC_NAME "src"
+
+/**
+ * GST_AUDIO_DECODER_SRC_PAD:
+ * @obj: base audio codec instance
+ *
+ * Gives the pointer to the source #GstPad object of the element.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_DECODER_SRC_PAD(obj) (((GstAudioDecoder *) (obj))->srcpad)
+
+/**
+ * GST_AUDIO_DECODER_SINK_PAD:
+ * @obj: base audio codec instance
+ *
+ * Gives the pointer to the sink #GstPad object of the element.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_DECODER_SINK_PAD(obj) (((GstAudioDecoder *) (obj))->sinkpad)
+
+#define GST_AUDIO_DECODER_STREAM_LOCK(dec) g_static_rec_mutex_lock (&GST_AUDIO_DECODER (dec)->stream_lock)
+#define GST_AUDIO_DECODER_STREAM_UNLOCK(dec) g_static_rec_mutex_unlock (&GST_AUDIO_DECODER (dec)->stream_lock)
+
+typedef struct _GstAudioDecoder GstAudioDecoder;
+typedef struct _GstAudioDecoderClass GstAudioDecoderClass;
+
+typedef struct _GstAudioDecoderPrivate GstAudioDecoderPrivate;
+
+/* do not use this one, use macro below */
+GstFlowReturn _gst_audio_decoder_error (GstAudioDecoder *dec, gint weight,
+ GQuark domain, gint code,
+ gchar *txt, gchar *debug,
+ const gchar *file, const gchar *function,
+ gint line);
+
+/**
+ * GST_AUDIO_DECODER_ERROR:
+ * @el: the base audio decoder element that generates the error
+ * @weight: element defined weight of the error, added to error count
+ * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
+ * @code: error code defined for that domain (see #gstreamer-GstGError)
+ * @text: the message to display (format string and args enclosed in
+ * parentheses)
+ * @debug: debugging information for the message (format string and args
+ * enclosed in parentheses)
+ * @ret: variable to receive return value
+ *
+ * Utility function that audio decoder elements can use in case they encountered
+ * a data processing error that may be fatal for the current "data unit" but
+ * need not prevent subsequent decoding. Such errors are counted and if there
+ * are too many, as configured in the context's max_errors, the pipeline will
+ * post an error message and the application will be requested to stop further
+ * media processing. Otherwise, it is considered a "glitch" and only a warning
+ * is logged. In either case, @ret is set to the proper value to
+ * return to upstream/caller (indicating either GST_FLOW_ERROR or GST_FLOW_OK).
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_DECODER_ERROR(el, weight, domain, code, text, debug, ret) \
+G_STMT_START { \
+ gchar *__txt = _gst_element_error_printf text; \
+ gchar *__dbg = _gst_element_error_printf debug; \
+ GstAudioDecoder *dec = GST_AUDIO_DECODER (el); \
+ ret = _gst_audio_decoder_error (dec, weight, GST_ ## domain ## _ERROR, \
+ GST_ ## domain ## _ERROR_ ## code, __txt, __dbg, __FILE__, \
+ GST_FUNCTION, __LINE__); \
+} G_STMT_END
+
+/**
+ * GstAudioDecoder:
+ *
+ * The opaque #GstAudioDecoder data structure.
+ *
+ * Since: 0.10.36
+ */
+struct _GstAudioDecoder
+{
+ GstElement element;
+
+ /*< protected >*/
+ /* source and sink pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* protects all data processing, i.e. is locked
+ * in the chain function, finish_frame and when
+ * processing serialized events */
+ GStaticRecMutex stream_lock;
+
+ /* MT-protected (with STREAM_LOCK) */
+ GstSegment segment;
+
+ /*< private >*/
+ GstAudioDecoderPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+/**
+ * GstAudioDecoderClass:
+ * @element_class: The parent class structure
+ * @start: Optional.
+ * Called when the element starts processing.
+ * Allows opening external resources.
+ * @stop: Optional.
+ * Called when the element stops processing.
+ * Allows closing external resources.
+ * @set_format: Notifies subclass of incoming data format (caps).
+ * @parse: Optional.
+ * Allows chopping incoming data into manageable units (frames)
+ * for subsequent decoding. This division is at subclass
+ * discretion and may or may not correspond to 1 (or more)
+ * frames as defined by audio format.
+ * @handle_frame: Provides input data (or NULL to clear any remaining data)
+ * to subclass. Input data ref management is performed by
+ * base class, subclass should not care or intervene.
+ * @flush: Optional.
+ * Instructs subclass to clear any codec caches and discard
+ * any pending samples and not yet returned encoded data.
+ * @hard indicates whether a FLUSH is being processed,
+ * or otherwise a DISCONT (or conceptually similar).
+ * @event: Optional.
+ * Event handler on the sink pad. This function should return
+ * TRUE if the event was handled and should be discarded
+ * (i.e. not unref'ed).
+ * @pre_push: Optional.
+ * Called just prior to pushing (encoded data) buffer downstream.
+ * Subclass has full discretionary access to buffer,
+ * and a not OK flow return will abort downstream pushing.
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At minimum @handle_frame (and likely @set_format) needs to be
+ * overridden.
+ *
+ * Since: 0.10.36
+ */
+struct _GstAudioDecoderClass
+{
+ GstElementClass element_class;
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstAudioDecoder *dec);
+
+ gboolean (*stop) (GstAudioDecoder *dec);
+
+ gboolean (*set_format) (GstAudioDecoder *dec,
+ GstCaps *caps);
+
+ GstFlowReturn (*parse) (GstAudioDecoder *dec,
+ GstAdapter *adapter,
+ gint *offset, gint *length);
+
+ GstFlowReturn (*handle_frame) (GstAudioDecoder *dec,
+ GstBuffer *buffer);
+
+ void (*flush) (GstAudioDecoder *dec, gboolean hard);
+
+ GstFlowReturn (*pre_push) (GstAudioDecoder *dec,
+ GstBuffer **buffer);
+
+ gboolean (*event) (GstAudioDecoder *dec,
+ GstEvent *event);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_audio_decoder_get_type (void);
+
+gboolean gst_audio_decoder_set_outcaps (GstAudioDecoder * dec,
+ GstCaps * caps);
+
+GstFlowReturn gst_audio_decoder_finish_frame (GstAudioDecoder * dec,
+ GstBuffer * buf, gint frames);
+
+/* context parameters */
+GstAudioInfo * gst_audio_decoder_get_audio_info (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_plc_aware (GstAudioDecoder * dec,
+ gboolean plc);
+
+gint gst_audio_decoder_get_plc_aware (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_byte_time (GstAudioDecoder * dec,
+ gboolean enabled);
+
+gint gst_audio_decoder_get_byte_time (GstAudioDecoder * dec);
+
+gint gst_audio_decoder_get_delay (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_max_errors (GstAudioDecoder * dec,
+ gint num);
+
+gint gst_audio_decoder_get_max_errors (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_latency (GstAudioDecoder * dec,
+ GstClockTime min,
+ GstClockTime max);
+
+void gst_audio_decoder_get_latency (GstAudioDecoder * dec,
+ GstClockTime * min,
+ GstClockTime * max);
+
+void gst_audio_decoder_get_parse_state (GstAudioDecoder * dec,
+ gboolean * sync,
+ gboolean * eos);
+
+
+/* object properties */
+void gst_audio_decoder_set_plc (GstAudioDecoder * dec,
+ gboolean enabled);
+
+gboolean gst_audio_decoder_get_plc (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_min_latency (GstAudioDecoder * dec,
+ gint64 num);
+
+gint64 gst_audio_decoder_get_min_latency (GstAudioDecoder * dec);
+
+void gst_audio_decoder_set_tolerance (GstAudioDecoder * dec,
+ gint64 tolerance);
+
+gint64 gst_audio_decoder_get_tolerance (GstAudioDecoder * dec);
+
+G_END_DECLS
+
+#endif /* _GST_AUDIO_DECODER_H_ */
diff --git a/gst-libs/gst/audio/gstaudioencoder.c b/gst-libs/gst/audio/gstaudioencoder.c
new file mode 100644
index 0000000..ad0fb8e
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioencoder.c
@@ -0,0 +1,2157 @@
+/* GStreamer
+ * Copyright (C) 2011 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>.
+ * Copyright (C) 2011 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstaudioencoder
+ * @short_description: Base class for audio encoders
+ * @see_also: #GstBaseTransform
+ * @since: 0.10.36
+ *
+ * This base class is for audio encoders turning raw audio samples into
+ * encoded audio data.
+ *
+ * GstAudioEncoder and subclass should cooperate as follows.
+ * <orderedlist>
+ * <listitem>
+ * <itemizedlist><title>Configuration</title>
+ * <listitem><para>
+ * Initially, GstAudioEncoder calls @start when the encoder element
+ * is activated, which allows subclass to perform any global setup.
+ * </para></listitem>
+ * <listitem><para>
+ * GstAudioEncoder calls @set_format to inform subclass of the format
+ * of input audio data that it is about to receive. Subclass should
+ * setup for encoding and configure various base class parameters
+ * appropriately, notably those directing desired input data handling.
+ * While unlikely, it might be called more than once, if changing input
+ * parameters require reconfiguration.
+ * </para></listitem>
+ * <listitem><para>
+ * GstAudioEncoder calls @stop at end of all processing.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * As of configuration stage, and throughout processing, GstAudioEncoder
+ * maintains various parameters that provide required context,
+ * e.g. describing the format of input audio data.
+ * Conversely, subclass can and should configure these context parameters
+ * to inform base class of its expectation w.r.t. buffer handling.
+ * <listitem>
+ * <itemizedlist>
+ * <title>Data processing</title>
+ * <listitem><para>
+ * Base class gathers input sample data (as directed by the context's
+ * frame_samples and frame_max) and provides this to subclass' @handle_frame.
+ * </para></listitem>
+ * <listitem><para>
+ * If codec processing results in encoded data, subclass should call
+ * @gst_audio_encoder_finish_frame to have encoded data pushed
+ * downstream. Alternatively, it might also call to indicate dropped
+ * (non-encoded) samples.
+ * </para></listitem>
+ * <listitem><para>
+ * Just prior to actually pushing a buffer downstream,
+ * it is passed to @pre_push.
+ * </para></listitem>
+ * <listitem><para>
+ * During the parsing process GstAudioEncoderClass will handle both
+ * srcpad and sinkpad events. Sink events will be passed to subclass
+ * if @event callback has been provided.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Shutdown phase</title>
+ * <listitem><para>
+ * GstAudioEncoder class calls @stop to inform the subclass that data
+ * parsing will be stopped.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * </orderedlist>
+ *
+ * Subclass is responsible for providing pad template caps for
+ * source and sink pads. The pads need to be named "sink" and "src". It also
+ * needs to set the fixed caps on srcpad, when the format is ensured. This
+ * is typically when base class calls subclass' @set_format function, though
+ * it might be delayed until calling @gst_audio_encoder_finish_frame.
+ *
+ * In summary, above process should have subclass concentrating on
+ * codec data processing while leaving other matters to base class,
+ * such as most notably timestamp handling. While it may exert more control
+ * in this area (see e.g. @pre_push), it is very much not recommended.
+ *
+ * In particular, base class will either favor tracking upstream timestamps
+ * (at the possible expense of jitter) or aim to arrange for a perfect stream of
+ * output timestamps, depending on #GstAudioEncoder:perfect-timestamp.
+ * However, in the latter case, the input may not be so perfect or ideal, which
+ * is handled as follows. An input timestamp is compared with the expected
+ * timestamp as dictated by input sample stream and if the deviation is less
+ * than #GstAudioEncoder:tolerance, the deviation is discarded.
+ * Otherwise, it is considered a discontuinity and subsequent output timestamp
+ * is resynced to the new position after performing configured discontinuity
+ * processing. In the non-perfect-timestamp case, an upstream variation
+ * exceeding tolerance only leads to marking DISCONT on subsequent outgoing
+ * (while timestamps are adjusted to upstream regardless of variation).
+ * While DISCONT is also marked in the perfect-timestamp case, this one
+ * optionally (see #GstAudioEncoder:hard-resync)
+ * performs some additional steps, such as clipping of (early) input samples
+ * or draining all currently remaining input data, depending on the direction
+ * of the discontuinity.
+ *
+ * If perfect timestamps are arranged, it is also possible to request baseclass
+ * (usually set by subclass) to provide additional buffer metadata (in OFFSET
+ * and OFFSET_END) fields according to granule defined semantics currently
+ * needed by oggmux. Specifically, OFFSET is set to granulepos (= sample count
+ * including buffer) and OFFSET_END to corresponding timestamp (as determined
+ * by same sample count and sample rate).
+ *
+ * Things that subclass need to take care of:
+ * <itemizedlist>
+ * <listitem><para>Provide pad templates</para></listitem>
+ * <listitem><para>
+ * Set source pad caps when appropriate
+ * </para></listitem>
+ * <listitem><para>
+ * Inform base class of buffer processing needs using context's
+ * frame_samples and frame_bytes.
+ * </para></listitem>
+ * <listitem><para>
+ * Set user-configurable properties to sane defaults for format and
+ * implementing codec at hand, e.g. those controlling timestamp behaviour
+ * and discontinuity processing.
+ * </para></listitem>
+ * <listitem><para>
+ * Accept data in @handle_frame and provide encoded results to
+ * @gst_audio_encoder_finish_frame.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstaudioencoder.h"
+#include <gst/base/gstadapter.h>
+#include <gst/audio/audio.h>
+#include <gst/pbutils/descriptions.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+GST_DEBUG_CATEGORY_STATIC (gst_audio_encoder_debug);
+#define GST_CAT_DEFAULT gst_audio_encoder_debug
+
+#define GST_AUDIO_ENCODER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_AUDIO_ENCODER, \
+ GstAudioEncoderPrivate))
+
+enum
+{
+ PROP_0,
+ PROP_PERFECT_TS,
+ PROP_GRANULE,
+ PROP_HARD_RESYNC,
+ PROP_TOLERANCE
+};
+
+#define DEFAULT_PERFECT_TS FALSE
+#define DEFAULT_GRANULE FALSE
+#define DEFAULT_HARD_RESYNC FALSE
+#define DEFAULT_TOLERANCE 40000000
+
+typedef struct _GstAudioEncoderContext
+{
+ /* input */
+ GstAudioInfo info;
+
+ /* output */
+ gint frame_samples_min, frame_samples_max;
+ gint frame_max;
+ gint lookahead;
+ /* MT-protected (with LOCK) */
+ GstClockTime min_latency;
+ GstClockTime max_latency;
+} GstAudioEncoderContext;
+
+struct _GstAudioEncoderPrivate
+{
+ /* activation status */
+ gboolean active;
+
+ /* input base/first ts as basis for output ts;
+ * kept nearly constant for perfect_ts,
+ * otherwise resyncs to upstream ts */
+ GstClockTime base_ts;
+ /* corresponding base granulepos */
+ gint64 base_gp;
+ /* input samples processed and sent downstream so far (w.r.t. base_ts) */
+ guint64 samples;
+
+ /* currently collected sample data */
+ GstAdapter *adapter;
+ /* offset in adapter up to which already supplied to encoder */
+ gint offset;
+ /* mark outgoing discont */
+ gboolean discont;
+ /* to guess duration of drained data */
+ GstClockTime last_duration;
+
+ /* subclass provided data in processing round */
+ gboolean got_data;
+ /* subclass gave all it could already */
+ gboolean drained;
+ /* subclass currently being forcibly drained */
+ gboolean force;
+
+ /* output bps estimatation */
+ /* global in samples seen */
+ guint64 samples_in;
+ /* global bytes sent out */
+ guint64 bytes_out;
+
+ /* context storage */
+ GstAudioEncoderContext ctx;
+
+ /* properties */
+ gint64 tolerance;
+ gboolean perfect_ts;
+ gboolean hard_resync;
+ gboolean granule;
+
+ /* pending tags */
+ GstTagList *tags;
+ /* pending serialized sink events, will be sent from finish_frame() */
+ GList *pending_events;
+};
+
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_audio_encoder_class_init (GstAudioEncoderClass * klass);
+static void gst_audio_encoder_init (GstAudioEncoder * parse,
+ GstAudioEncoderClass * klass);
+
+GType
+gst_audio_encoder_get_type (void)
+{
+ static GType audio_encoder_type = 0;
+
+ if (!audio_encoder_type) {
+ static const GTypeInfo audio_encoder_info = {
+ sizeof (GstAudioEncoderClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gst_audio_encoder_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAudioEncoder),
+ 0,
+ (GInstanceInitFunc) gst_audio_encoder_init,
+ };
+ const GInterfaceInfo preset_interface_info = {
+ NULL, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+
+ audio_encoder_type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstAudioEncoder", &audio_encoder_info, G_TYPE_FLAG_ABSTRACT);
+
+ g_type_add_interface_static (audio_encoder_type, GST_TYPE_PRESET,
+ &preset_interface_info);
+ }
+ return audio_encoder_type;
+}
+
+static void gst_audio_encoder_finalize (GObject * object);
+static void gst_audio_encoder_reset (GstAudioEncoder * enc, gboolean full);
+
+static void gst_audio_encoder_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_audio_encoder_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static gboolean gst_audio_encoder_sink_activate_push (GstPad * pad,
+ gboolean active);
+
+static gboolean gst_audio_encoder_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_audio_encoder_sink_setcaps (GstAudioEncoder * enc,
+ GstCaps * caps);
+static GstFlowReturn gst_audio_encoder_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_audio_encoder_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_audio_encoder_sink_query (GstPad * pad, GstQuery * query);
+static const GstQueryType *gst_audio_encoder_get_query_types (GstPad * pad);
+static GstCaps *gst_audio_encoder_sink_getcaps (GstPad * pad, GstCaps * filter);
+
+static void
+gst_audio_encoder_class_init (GstAudioEncoderClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ parent_class = g_type_class_peek_parent (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_audio_encoder_debug, "audioencoder", 0,
+ "audio encoder base class");
+
+ g_type_class_add_private (klass, sizeof (GstAudioEncoderPrivate));
+
+ gobject_class->set_property = gst_audio_encoder_set_property;
+ gobject_class->get_property = gst_audio_encoder_get_property;
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_audio_encoder_finalize);
+
+ /* properties */
+ g_object_class_install_property (gobject_class, PROP_PERFECT_TS,
+ g_param_spec_boolean ("perfect-timestamp", "Perfect Timestamps",
+ "Favour perfect timestamps over tracking upstream timestamps",
+ DEFAULT_PERFECT_TS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_GRANULE,
+ g_param_spec_boolean ("mark-granule", "Granule Marking",
+ "Apply granule semantics to buffer metadata (implies perfect-timestamp)",
+ DEFAULT_GRANULE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HARD_RESYNC,
+ g_param_spec_boolean ("hard-resync", "Hard Resync",
+ "Perform clipping and sample flushing upon discontinuity",
+ DEFAULT_HARD_RESYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TOLERANCE,
+ g_param_spec_int64 ("tolerance", "Tolerance",
+ "Consider discontinuity if timestamp jitter/imperfection exceeds tolerance (ns)",
+ 0, G_MAXINT64, DEFAULT_TOLERANCE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_audio_encoder_init (GstAudioEncoder * enc, GstAudioEncoderClass * bclass)
+{
+ GstPadTemplate *pad_template;
+
+ GST_DEBUG_OBJECT (enc, "gst_audio_encoder_init");
+
+ enc->priv = GST_AUDIO_ENCODER_GET_PRIVATE (enc);
+
+ /* only push mode supported */
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "sink");
+ g_return_if_fail (pad_template != NULL);
+ enc->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+ gst_pad_set_event_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_sink_event));
+ gst_pad_set_getcaps_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_sink_getcaps));
+ gst_pad_set_query_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_sink_query));
+ gst_pad_set_chain_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_chain));
+ gst_pad_set_activatepush_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_sink_activate_push));
+ gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad);
+
+ GST_DEBUG_OBJECT (enc, "sinkpad created");
+
+ /* and we don't mind upstream traveling stuff that much ... */
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
+ g_return_if_fail (pad_template != NULL);
+ enc->srcpad = gst_pad_new_from_template (pad_template, "src");
+ gst_pad_set_query_function (enc->srcpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_src_query));
+ gst_pad_set_query_type_function (enc->srcpad,
+ GST_DEBUG_FUNCPTR (gst_audio_encoder_get_query_types));
+ gst_pad_use_fixed_caps (enc->srcpad);
+ gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad);
+ GST_DEBUG_OBJECT (enc, "src created");
+
+ enc->priv->adapter = gst_adapter_new ();
+
+ g_static_rec_mutex_init (&enc->stream_lock);
+
+ /* property default */
+ enc->priv->granule = DEFAULT_GRANULE;
+ enc->priv->perfect_ts = DEFAULT_PERFECT_TS;
+ enc->priv->hard_resync = DEFAULT_HARD_RESYNC;
+ enc->priv->tolerance = DEFAULT_TOLERANCE;
+
+ /* init state */
+ gst_audio_encoder_reset (enc, TRUE);
+ GST_DEBUG_OBJECT (enc, "init ok");
+}
+
+static void
+gst_audio_encoder_reset (GstAudioEncoder * enc, gboolean full)
+{
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+
+ GST_LOG_OBJECT (enc, "reset full %d", full);
+
+ if (full) {
+ enc->priv->active = FALSE;
+ enc->priv->samples_in = 0;
+ enc->priv->bytes_out = 0;
+ gst_audio_info_init (&enc->priv->ctx.info);
+ memset (&enc->priv->ctx, 0, sizeof (enc->priv->ctx));
+
+ if (enc->priv->tags)
+ gst_tag_list_free (enc->priv->tags);
+ enc->priv->tags = NULL;
+
+ g_list_foreach (enc->priv->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (enc->priv->pending_events);
+ enc->priv->pending_events = NULL;
+ }
+
+ gst_segment_init (&enc->segment, GST_FORMAT_TIME);
+
+ gst_adapter_clear (enc->priv->adapter);
+ enc->priv->got_data = FALSE;
+ enc->priv->drained = TRUE;
+ enc->priv->offset = 0;
+ enc->priv->base_ts = GST_CLOCK_TIME_NONE;
+ enc->priv->base_gp = -1;
+ enc->priv->samples = 0;
+ enc->priv->discont = FALSE;
+
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+}
+
+static void
+gst_audio_encoder_finalize (GObject * object)
+{
+ GstAudioEncoder *enc = GST_AUDIO_ENCODER (object);
+
+ g_object_unref (enc->priv->adapter);
+
+ g_static_rec_mutex_free (&enc->stream_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_audio_encoder_finish_frame:
+ * @enc: a #GstAudioEncoder
+ * @buffer: encoded data
+ * @samples: number of samples (per channel) represented by encoded data
+ *
+ * Collects encoded data and pushes encoded data downstream.
+ * Source pad caps must be set when this is called.
+ *
+ * If @samples < 0, then best estimate is all samples provided to encoder
+ * (subclass) so far. @buf may be NULL, in which case next number of @samples
+ * are considered discarded, e.g. as a result of discontinuous transmission,
+ * and a discontinuity is marked.
+ *
+ * Returns: a #GstFlowReturn that should be escalated to caller (of caller)
+ *
+ * Since: 0.10.36
+ */
+GstFlowReturn
+gst_audio_encoder_finish_frame (GstAudioEncoder * enc, GstBuffer * buf,
+ gint samples)
+{
+ GstAudioEncoderClass *klass;
+ GstAudioEncoderPrivate *priv;
+ GstAudioEncoderContext *ctx;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+ priv = enc->priv;
+ ctx = &enc->priv->ctx;
+
+ /* subclass should know what it is producing by now */
+ g_return_val_if_fail (gst_pad_has_current_caps (enc->srcpad), GST_FLOW_ERROR);
+ /* subclass should not hand us no data */
+ g_return_val_if_fail (buf == NULL || gst_buffer_get_size (buf) > 0,
+ GST_FLOW_ERROR);
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+
+ GST_LOG_OBJECT (enc, "accepting %d bytes encoded data as %d samples",
+ buf ? gst_buffer_get_size (buf) : -1, samples);
+
+ /* mark subclass still alive and providing */
+ if (G_LIKELY (buf))
+ priv->got_data = TRUE;
+
+ if (priv->pending_events) {
+ GList *pending_events, *l;
+
+ pending_events = priv->pending_events;
+ priv->pending_events = NULL;
+
+ GST_DEBUG_OBJECT (enc, "Pushing pending events");
+ for (l = pending_events; l; l = l->next)
+ gst_pad_push_event (enc->srcpad, l->data);
+ g_list_free (pending_events);
+ }
+
+ /* send after pending events, which likely includes newsegment event */
+ if (G_UNLIKELY (enc->priv->tags)) {
+ GstTagList *tags;
+#if 0
+ GstCaps *caps;
+#endif
+
+ /* add codec info to pending tags */
+ tags = enc->priv->tags;
+ /* no more pending */
+ enc->priv->tags = NULL;
+#if 0
+ caps = gst_pad_get_current_caps (enc->srcpad);
+ gst_pb_utils_add_codec_description_to_tag_list (tags, GST_TAG_CODEC, caps);
+ gst_pb_utils_add_codec_description_to_tag_list (tags, GST_TAG_AUDIO_CODEC,
+ caps);
+#endif
+ GST_DEBUG_OBJECT (enc, "sending tags %" GST_PTR_FORMAT, tags);
+ gst_element_found_tags_for_pad (GST_ELEMENT (enc), enc->srcpad, tags);
+ }
+
+ /* remove corresponding samples from input */
+ if (samples < 0)
+ samples = (enc->priv->offset / ctx->info.bpf);
+
+ if (G_LIKELY (samples)) {
+ /* track upstream ts if so configured */
+ if (!enc->priv->perfect_ts) {
+ guint64 ts, distance;
+
+ ts = gst_adapter_prev_timestamp (priv->adapter, &distance);
+ g_assert (distance % ctx->info.bpf == 0);
+ distance /= ctx->info.bpf;
+ GST_LOG_OBJECT (enc, "%" G_GUINT64_FORMAT " samples past prev_ts %"
+ GST_TIME_FORMAT, distance, GST_TIME_ARGS (ts));
+ GST_LOG_OBJECT (enc, "%" G_GUINT64_FORMAT " samples past base_ts %"
+ GST_TIME_FORMAT, priv->samples, GST_TIME_ARGS (priv->base_ts));
+ /* when draining adapter might be empty and no ts to offer */
+ if (GST_CLOCK_TIME_IS_VALID (ts) && ts != priv->base_ts) {
+ GstClockTimeDiff diff;
+ GstClockTime old_ts, next_ts;
+
+ /* passed into another buffer;
+ * mild check for discontinuity and only mark if so */
+ next_ts = ts +
+ gst_util_uint64_scale (distance, GST_SECOND, ctx->info.rate);
+ old_ts = priv->base_ts +
+ gst_util_uint64_scale (priv->samples, GST_SECOND, ctx->info.rate);
+ diff = GST_CLOCK_DIFF (next_ts, old_ts);
+ GST_LOG_OBJECT (enc, "ts diff %d ms", (gint) (diff / GST_MSECOND));
+ /* only mark discontinuity if beyond tolerance */
+ if (G_UNLIKELY (diff < -enc->priv->tolerance ||
+ diff > enc->priv->tolerance)) {
+ GST_DEBUG_OBJECT (enc, "marked discont");
+ priv->discont = TRUE;
+ }
+ if (diff > GST_SECOND / ctx->info.rate / 2 ||
+ diff < -GST_SECOND / ctx->info.rate / 2) {
+ GST_LOG_OBJECT (enc, "new upstream ts %" GST_TIME_FORMAT
+ " at distance %" G_GUINT64_FORMAT, GST_TIME_ARGS (ts), distance);
+ /* re-sync to upstream ts */
+ priv->base_ts = ts;
+ priv->samples = distance;
+ } else {
+ GST_LOG_OBJECT (enc, "new upstream ts only introduces jitter");
+ }
+ }
+ }
+ /* advance sample view */
+ if (G_UNLIKELY (samples * ctx->info.bpf > priv->offset)) {
+ if (G_LIKELY (!priv->force)) {
+ /* no way we can let this pass */
+ g_assert_not_reached ();
+ /* really no way */
+ goto overflow;
+ } else {
+ priv->offset = 0;
+ if (samples * ctx->info.bpf >= gst_adapter_available (priv->adapter))
+ gst_adapter_clear (priv->adapter);
+ else
+ gst_adapter_flush (priv->adapter, samples * ctx->info.bpf);
+ }
+ } else {
+ gst_adapter_flush (priv->adapter, samples * ctx->info.bpf);
+ priv->offset -= samples * ctx->info.bpf;
+ /* avoid subsequent stray prev_ts */
+ if (G_UNLIKELY (gst_adapter_available (priv->adapter) == 0))
+ gst_adapter_clear (priv->adapter);
+ }
+ /* sample count advanced below after buffer handling */
+ }
+
+ /* collect output */
+ if (G_LIKELY (buf)) {
+ gsize size;
+
+ size = gst_buffer_get_size (buf);
+
+ GST_LOG_OBJECT (enc, "taking %d bytes for output", size);
+ buf = gst_buffer_make_writable (buf);
+
+ /* decorate */
+ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (priv->base_ts))) {
+ /* FIXME ? lookahead could lead to weird ts and duration ?
+ * (particularly if not in perfect mode) */
+ /* mind sample rounding and produce perfect output */
+ GST_BUFFER_TIMESTAMP (buf) = priv->base_ts +
+ gst_util_uint64_scale (priv->samples - ctx->lookahead, GST_SECOND,
+ ctx->info.rate);
+ GST_DEBUG_OBJECT (enc, "out samples %d", samples);
+ if (G_LIKELY (samples > 0)) {
+ priv->samples += samples;
+ GST_BUFFER_DURATION (buf) = priv->base_ts +
+ gst_util_uint64_scale (priv->samples - ctx->lookahead, GST_SECOND,
+ ctx->info.rate) - GST_BUFFER_TIMESTAMP (buf);
+ priv->last_duration = GST_BUFFER_DURATION (buf);
+ } else {
+ /* duration forecast in case of handling remainder;
+ * the last one is probably like the previous one ... */
+ GST_BUFFER_DURATION (buf) = priv->last_duration;
+ }
+ if (priv->base_gp >= 0) {
+ /* pamper oggmux */
+ /* FIXME: in longer run, muxer should take care of this ... */
+ /* offset_end = granulepos for ogg muxer */
+ GST_BUFFER_OFFSET_END (buf) = priv->base_gp + priv->samples -
+ enc->priv->ctx.lookahead;
+ /* offset = timestamp corresponding to granulepos for ogg muxer */
+ GST_BUFFER_OFFSET (buf) =
+ GST_FRAMES_TO_CLOCK_TIME (GST_BUFFER_OFFSET_END (buf),
+ ctx->info.rate);
+ } else {
+ GST_BUFFER_OFFSET (buf) = priv->bytes_out;
+ GST_BUFFER_OFFSET_END (buf) = priv->bytes_out + size;
+ }
+ }
+
+ priv->bytes_out += size;
+
+ if (G_UNLIKELY (priv->discont)) {
+ GST_LOG_OBJECT (enc, "marking discont");
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ priv->discont = FALSE;
+ }
+
+ if (klass->pre_push) {
+ /* last chance for subclass to do some dirty stuff */
+ ret = klass->pre_push (enc, &buf);
+ if (ret != GST_FLOW_OK || !buf) {
+ GST_DEBUG_OBJECT (enc, "subclass returned %s, buf %p",
+ gst_flow_get_name (ret), buf);
+ if (buf)
+ gst_buffer_unref (buf);
+ goto exit;
+ }
+ }
+
+ GST_LOG_OBJECT (enc, "pushing buffer of size %d with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, size,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ ret = gst_pad_push (enc->srcpad, buf);
+ GST_LOG_OBJECT (enc, "buffer pushed: %s", gst_flow_get_name (ret));
+ } else {
+ /* merely advance samples, most work for that already done above */
+ priv->samples += samples;
+ }
+
+exit:
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+ return ret;
+
+ /* ERRORS */
+overflow:
+ {
+ GST_ELEMENT_ERROR (enc, STREAM, ENCODE,
+ ("received more encoded samples %d than provided %d",
+ samples, priv->offset / ctx->info.bpf), (NULL));
+ if (buf)
+ gst_buffer_unref (buf);
+ ret = GST_FLOW_ERROR;
+ goto exit;
+ }
+}
+
+ /* adapter tracking idea:
+ * - start of adapter corresponds with what has already been encoded
+ * (i.e. really returned by encoder subclass)
+ * - start + offset is what needs to be fed to subclass next */
+static GstFlowReturn
+gst_audio_encoder_push_buffers (GstAudioEncoder * enc, gboolean force)
+{
+ GstAudioEncoderClass *klass;
+ GstAudioEncoderPrivate *priv;
+ GstAudioEncoderContext *ctx;
+ gint av, need;
+ GstBuffer *buf;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+ g_return_val_if_fail (klass->handle_frame != NULL, GST_FLOW_ERROR);
+
+ priv = enc->priv;
+ ctx = &enc->priv->ctx;
+
+ while (ret == GST_FLOW_OK) {
+
+ buf = NULL;
+ av = gst_adapter_available (priv->adapter);
+
+ g_assert (priv->offset <= av);
+ av -= priv->offset;
+
+ need =
+ ctx->frame_samples_min >
+ 0 ? ctx->frame_samples_min * ctx->info.bpf : av;
+ GST_LOG_OBJECT (enc, "available: %d, needed: %d, force: %d", av, need,
+ force);
+
+ if ((need > av) || !av) {
+ if (G_UNLIKELY (force)) {
+ priv->force = TRUE;
+ need = av;
+ } else {
+ break;
+ }
+ } else {
+ priv->force = FALSE;
+ }
+
+ if (ctx->frame_samples_max > 0)
+ need = MIN (av, ctx->frame_samples_max * ctx->info.bpf);
+
+ if (ctx->frame_samples_min == ctx->frame_samples_max) {
+ /* if we have some extra metadata,
+ * provide for integer multiple of frames to allow for better granularity
+ * of processing */
+ if (ctx->frame_samples_min > 0 && need) {
+ if (ctx->frame_max > 1)
+ need = need * MIN ((av / need), ctx->frame_max);
+ else if (ctx->frame_max == 0)
+ need = need * (av / need);
+ }
+ }
+
+ if (need) {
+ const guint8 *data;
+
+ data = gst_adapter_map (priv->adapter, priv->offset + need);
+ buf =
+ gst_buffer_new_wrapped_full ((gpointer) data, NULL, priv->offset,
+ need);
+ }
+
+ GST_LOG_OBJECT (enc, "providing subclass with %d bytes at offset %d",
+ need, priv->offset);
+
+ /* mark this already as consumed,
+ * which it should be when subclass gives us data in exchange for samples */
+ priv->offset += need;
+ priv->samples_in += need / ctx->info.bpf;
+
+ priv->got_data = FALSE;
+ ret = klass->handle_frame (enc, buf);
+
+ if (G_LIKELY (buf)) {
+ gst_buffer_unref (buf);
+ gst_adapter_unmap (priv->adapter, 0);
+ }
+
+ /* no data to feed, no leftover provided, then bail out */
+ if (G_UNLIKELY (!buf && !priv->got_data)) {
+ priv->drained = TRUE;
+ GST_LOG_OBJECT (enc, "no more data drained from subclass");
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_audio_encoder_drain (GstAudioEncoder * enc)
+{
+ if (enc->priv->drained)
+ return GST_FLOW_OK;
+ else
+ return gst_audio_encoder_push_buffers (enc, TRUE);
+}
+
+static void
+gst_audio_encoder_set_base_gp (GstAudioEncoder * enc)
+{
+ GstClockTime ts;
+
+ if (!enc->priv->granule)
+ return;
+
+ /* use running time for granule */
+ /* incoming data is clipped, so a valid input should yield a valid output */
+ ts = gst_segment_to_running_time (&enc->segment, GST_FORMAT_TIME,
+ enc->priv->base_ts);
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ enc->priv->base_gp =
+ GST_CLOCK_TIME_TO_FRAMES (enc->priv->base_ts, enc->priv->ctx.info.rate);
+ GST_DEBUG_OBJECT (enc, "new base gp %" G_GINT64_FORMAT, enc->priv->base_gp);
+ } else {
+ /* should reasonably have a valid base,
+ * otherwise start at 0 if we did not already start there earlier */
+ if (enc->priv->base_gp < 0) {
+ enc->priv->base_gp = 0;
+ GST_DEBUG_OBJECT (enc, "new base gp %" G_GINT64_FORMAT,
+ enc->priv->base_gp);
+ }
+ }
+}
+
+static GstFlowReturn
+gst_audio_encoder_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstAudioEncoder *enc;
+ GstAudioEncoderPrivate *priv;
+ GstAudioEncoderContext *ctx;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean discont;
+ gsize size;
+
+ enc = GST_AUDIO_ENCODER (GST_OBJECT_PARENT (pad));
+
+ priv = enc->priv;
+ ctx = &enc->priv->ctx;
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+
+ /* should know what is coming by now */
+ if (!ctx->info.bpf)
+ goto not_negotiated;
+
+ size = gst_buffer_get_size (buffer);
+
+ GST_LOG_OBJECT (enc,
+ "received buffer of size %d with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, size,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
+
+ /* input shoud be whole number of sample frames */
+ if (size % ctx->info.bpf)
+ goto wrong_buffer;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ GstClockTime duration;
+ GstClockTimeDiff diff;
+
+ /* verify buffer duration */
+ duration = gst_util_uint64_scale (size, GST_SECOND,
+ ctx->info.rate * ctx->info.bpf);
+ diff = GST_CLOCK_DIFF (duration, GST_BUFFER_DURATION (buffer));
+ if (GST_BUFFER_DURATION (buffer) != GST_CLOCK_TIME_NONE &&
+ (diff > GST_SECOND / ctx->info.rate / 2 ||
+ diff < -GST_SECOND / ctx->info.rate / 2)) {
+ GST_DEBUG_OBJECT (enc, "incoming buffer had incorrect duration %"
+ GST_TIME_FORMAT ", expected duration %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)),
+ GST_TIME_ARGS (duration));
+ }
+ }
+#endif
+
+ discont = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ if (G_UNLIKELY (discont)) {
+ GST_LOG_OBJECT (buffer, "marked discont");
+ enc->priv->discont = discont;
+ }
+
+ /* clip to segment */
+ /* NOTE: slightly painful linking -laudio only for this one ... */
+ buffer = gst_audio_buffer_clip (buffer, &enc->segment, ctx->info.rate,
+ ctx->info.bpf);
+ if (G_UNLIKELY (!buffer)) {
+ GST_DEBUG_OBJECT (buffer, "no data after clipping to segment");
+ goto done;
+ }
+
+ size = gst_buffer_get_size (buffer);
+
+ GST_LOG_OBJECT (enc,
+ "buffer after segment clipping has size %d with ts %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT, size,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
+
+ if (!GST_CLOCK_TIME_IS_VALID (priv->base_ts)) {
+ priv->base_ts = GST_BUFFER_TIMESTAMP (buffer);
+ GST_DEBUG_OBJECT (enc, "new base ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (priv->base_ts));
+ gst_audio_encoder_set_base_gp (enc);
+ }
+
+ /* check for continuity;
+ * checked elsewhere in non-perfect case */
+ if (enc->priv->perfect_ts) {
+ GstClockTimeDiff diff = 0;
+ GstClockTime next_ts = 0;
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (priv->base_ts)) {
+ guint64 samples;
+
+ samples = priv->samples +
+ gst_adapter_available (priv->adapter) / ctx->info.bpf;
+ next_ts = priv->base_ts +
+ gst_util_uint64_scale (samples, GST_SECOND, ctx->info.rate);
+ GST_LOG_OBJECT (enc, "buffer is %" G_GUINT64_FORMAT
+ " samples past base_ts %" GST_TIME_FORMAT
+ ", expected ts %" GST_TIME_FORMAT, samples,
+ GST_TIME_ARGS (priv->base_ts), GST_TIME_ARGS (next_ts));
+ diff = GST_CLOCK_DIFF (next_ts, GST_BUFFER_TIMESTAMP (buffer));
+ GST_LOG_OBJECT (enc, "ts diff %d ms", (gint) (diff / GST_MSECOND));
+ /* if within tolerance,
+ * discard buffer ts and carry on producing perfect stream,
+ * otherwise clip or resync to ts */
+ if (G_UNLIKELY (diff < -enc->priv->tolerance ||
+ diff > enc->priv->tolerance)) {
+ GST_DEBUG_OBJECT (enc, "marked discont");
+ discont = TRUE;
+ }
+ }
+
+ /* do some fancy tweaking in hard resync case */
+ if (discont && enc->priv->hard_resync) {
+ if (diff < 0) {
+ guint64 diff_bytes;
+
+ GST_WARNING_OBJECT (enc, "Buffer is older than expected ts %"
+ GST_TIME_FORMAT ". Clipping buffer", GST_TIME_ARGS (next_ts));
+
+ diff_bytes =
+ GST_CLOCK_TIME_TO_FRAMES (-diff, ctx->info.rate) * ctx->info.bpf;
+ if (diff_bytes >= size) {
+ gst_buffer_unref (buffer);
+ goto done;
+ }
+ buffer = gst_buffer_make_writable (buffer);
+ gst_buffer_resize (buffer, diff_bytes, size - diff_bytes);
+
+ GST_BUFFER_TIMESTAMP (buffer) += diff;
+ /* care even less about duration after this */
+ } else {
+ /* drain stuff prior to resync */
+ gst_audio_encoder_drain (enc);
+ }
+ }
+ /* now re-sync ts */
+ priv->base_ts += diff;
+ gst_audio_encoder_set_base_gp (enc);
+ priv->discont |= discont;
+ }
+
+ gst_adapter_push (enc->priv->adapter, buffer);
+ /* new stuff, so we can push subclass again */
+ enc->priv->drained = FALSE;
+
+ ret = gst_audio_encoder_push_buffers (enc, FALSE);
+
+done:
+ GST_LOG_OBJECT (enc, "chain leaving");
+
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+ return ret;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ GST_ELEMENT_ERROR (enc, CORE, NEGOTIATION, (NULL),
+ ("encoder not initialized"));
+ gst_buffer_unref (buffer);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
+ }
+wrong_buffer:
+ {
+ GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL),
+ ("buffer size %d not a multiple of %d", gst_buffer_get_size (buffer),
+ ctx->info.bpf));
+ gst_buffer_unref (buffer);
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static gboolean
+audio_info_is_equal (GstAudioInfo * from, GstAudioInfo * to)
+{
+ if (from == to)
+ return TRUE;
+ if (from->finfo == NULL || to->finfo == NULL)
+ return FALSE;
+ if (GST_AUDIO_INFO_FORMAT (from) != GST_AUDIO_INFO_FORMAT (to))
+ return FALSE;
+ if (GST_AUDIO_INFO_RATE (from) != GST_AUDIO_INFO_RATE (to))
+ return FALSE;
+ if (GST_AUDIO_INFO_CHANNELS (from) != GST_AUDIO_INFO_CHANNELS (to))
+ return FALSE;
+ if (GST_AUDIO_INFO_CHANNELS (from) > 64)
+ return TRUE;
+ return memcmp (from->position, to->position,
+ GST_AUDIO_INFO_CHANNELS (from) * sizeof (to->position[0]));
+}
+
+static gboolean
+gst_audio_encoder_sink_setcaps (GstAudioEncoder * enc, GstCaps * caps)
+{
+ GstAudioEncoderClass *klass;
+ GstAudioEncoderContext *ctx;
+ GstAudioInfo state;
+ gboolean res = TRUE, changed = FALSE;
+ guint old_rate;
+
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+ /* subclass must do something here ... */
+ g_return_val_if_fail (klass->set_format != NULL, FALSE);
+
+ ctx = &enc->priv->ctx;
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+
+ GST_DEBUG_OBJECT (enc, "caps: %" GST_PTR_FORMAT, caps);
+
+ if (!gst_caps_is_fixed (caps))
+ goto refuse_caps;
+
+ /* adjust ts tracking to new sample rate */
+ old_rate = GST_AUDIO_INFO_RATE (&ctx->info);
+ if (GST_CLOCK_TIME_IS_VALID (enc->priv->base_ts) && old_rate) {
+ enc->priv->base_ts +=
+ GST_FRAMES_TO_CLOCK_TIME (enc->priv->samples, old_rate);
+ enc->priv->samples = 0;
+ }
+
+ if (!gst_audio_info_from_caps (&state, caps))
+ goto refuse_caps;
+
+ changed = !audio_info_is_equal (&state, &ctx->info);
+
+ if (changed) {
+ GstClockTime old_min_latency;
+ GstClockTime old_max_latency;
+
+ /* drain any pending old data stuff */
+ gst_audio_encoder_drain (enc);
+
+ /* context defaults */
+ enc->priv->ctx.frame_samples_min = 0;
+ enc->priv->ctx.frame_samples_max = 0;
+ enc->priv->ctx.frame_max = 0;
+ enc->priv->ctx.lookahead = 0;
+
+ /* element might report latency */
+ GST_OBJECT_LOCK (enc);
+ old_min_latency = ctx->min_latency;
+ old_max_latency = ctx->max_latency;
+ GST_OBJECT_UNLOCK (enc);
+
+ if (klass->set_format)
+ res = klass->set_format (enc, &state);
+
+ /* notify if new latency */
+ GST_OBJECT_LOCK (enc);
+ if ((ctx->min_latency > 0 && ctx->min_latency != old_min_latency) ||
+ (ctx->max_latency > 0 && ctx->max_latency != old_max_latency)) {
+ GST_OBJECT_UNLOCK (enc);
+ /* post latency message on the bus */
+ gst_element_post_message (GST_ELEMENT (enc),
+ gst_message_new_latency (GST_OBJECT (enc)));
+ GST_OBJECT_LOCK (enc);
+ }
+ GST_OBJECT_UNLOCK (enc);
+ } else {
+ GST_DEBUG_OBJECT (enc, "new audio format identical to configured format");
+ }
+
+exit:
+
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+ return res;
+
+ /* ERRORS */
+refuse_caps:
+ {
+ GST_WARNING_OBJECT (enc, "rejected caps %" GST_PTR_FORMAT, caps);
+ goto exit;
+ }
+}
+
+
+/**
+ * gst_audio_encoder_proxy_getcaps:
+ * @enc: a #GstAudioEncoder
+ * @caps: initial caps
+ *
+ * Returns caps that express @caps (or sink template caps if @caps == NULL)
+ * restricted to channel/rate combinations supported by downstream elements
+ * (e.g. muxers).
+ *
+ * Returns: a #GstCaps owned by caller
+ *
+ * Since: 0.10.36
+ */
+GstCaps *
+gst_audio_encoder_proxy_getcaps (GstAudioEncoder * enc, GstCaps * caps)
+{
+ const GstCaps *templ_caps;
+ GstCaps *allowed = NULL;
+ GstCaps *fcaps, *filter_caps;
+ gint i, j;
+
+ /* we want to be able to communicate to upstream elements like audioconvert
+ * and audioresample any rate/channel restrictions downstream (e.g. muxer
+ * only accepting certain sample rates) */
+ templ_caps = caps ? caps : gst_pad_get_pad_template_caps (enc->sinkpad);
+ allowed = gst_pad_get_allowed_caps (enc->srcpad);
+ if (!allowed || gst_caps_is_empty (allowed) || gst_caps_is_any (allowed)) {
+ fcaps = gst_caps_copy (templ_caps);
+ goto done;
+ }
+
+ GST_LOG_OBJECT (enc, "template caps %" GST_PTR_FORMAT, templ_caps);
+ GST_LOG_OBJECT (enc, "allowed caps %" GST_PTR_FORMAT, allowed);
+
+ filter_caps = gst_caps_new_empty ();
+
+ for (i = 0; i < gst_caps_get_size (templ_caps); i++) {
+ GQuark q_name;
+
+ q_name = gst_structure_get_name_id (gst_caps_get_structure (templ_caps, i));
+
+ /* pick rate + channel fields from allowed caps */
+ for (j = 0; j < gst_caps_get_size (allowed); j++) {
+ const GstStructure *allowed_s = gst_caps_get_structure (allowed, j);
+ const GValue *val;
+ GstStructure *s;
+
+ s = gst_structure_id_empty_new (q_name);
+ if ((val = gst_structure_get_value (allowed_s, "rate")))
+ gst_structure_set_value (s, "rate", val);
+ if ((val = gst_structure_get_value (allowed_s, "channels")))
+ gst_structure_set_value (s, "channels", val);
+ /* following might also make sense for some encoded formats,
+ * e.g. wavpack */
+ if ((val = gst_structure_get_value (allowed_s, "width")))
+ gst_structure_set_value (s, "width", val);
+ if ((val = gst_structure_get_value (allowed_s, "depth")))
+ gst_structure_set_value (s, "depth", val);
+ if ((val = gst_structure_get_value (allowed_s, "endianness")))
+ gst_structure_set_value (s, "endianness", val);
+ if ((val = gst_structure_get_value (allowed_s, "signed")))
+ gst_structure_set_value (s, "signed", val);
+ if ((val = gst_structure_get_value (allowed_s, "channel-positions")))
+ gst_structure_set_value (s, "channel-positions", val);
+
+ gst_caps_merge_structure (filter_caps, s);
+ }
+ }
+
+ fcaps = gst_caps_intersect (filter_caps, templ_caps);
+ gst_caps_unref (filter_caps);
+
+done:
+ gst_caps_replace (&allowed, NULL);
+
+ GST_LOG_OBJECT (enc, "proxy caps %" GST_PTR_FORMAT, fcaps);
+
+ return fcaps;
+}
+
+static GstCaps *
+gst_audio_encoder_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstAudioEncoder *enc;
+ GstAudioEncoderClass *klass;
+ GstCaps *caps;
+
+ enc = GST_AUDIO_ENCODER (gst_pad_get_parent (pad));
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+ g_assert (pad == enc->sinkpad);
+
+ if (klass->getcaps)
+ caps = klass->getcaps (enc, filter);
+ else
+ caps = gst_audio_encoder_proxy_getcaps (enc, NULL);
+ gst_object_unref (enc);
+
+ GST_LOG_OBJECT (enc, "returning caps %" GST_PTR_FORMAT, caps);
+
+ return caps;
+}
+
+static gboolean
+gst_audio_encoder_sink_eventfunc (GstAudioEncoder * enc, GstEvent * event)
+{
+ GstAudioEncoderClass *klass;
+ gboolean handled = FALSE;
+
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment seg;
+
+ gst_event_copy_segment (event, &seg);
+
+ if (seg.format == GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (enc, "received TIME SEGMENT %" GST_PTR_FORMAT, &seg);
+ } else {
+ GST_DEBUG_OBJECT (enc, "received SEGMENT %" GST_PTR_FORMAT, &seg);
+ GST_DEBUG_OBJECT (enc, "unsupported format; ignoring");
+ break;
+ }
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ /* finish current segment */
+ gst_audio_encoder_drain (enc);
+ /* reset partially for new segment */
+ gst_audio_encoder_reset (enc, FALSE);
+ /* and follow along with segment */
+ enc->segment = seg;
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+ break;
+ }
+
+ case GST_EVENT_FLUSH_START:
+ break;
+
+ case GST_EVENT_FLUSH_STOP:
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ /* discard any pending stuff */
+ /* TODO route through drain ?? */
+ if (!enc->priv->drained && klass->flush)
+ klass->flush (enc);
+ /* and get (re)set for the sequel */
+ gst_audio_encoder_reset (enc, FALSE);
+
+ g_list_foreach (enc->priv->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (enc->priv->pending_events);
+ enc->priv->pending_events = NULL;
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+ break;
+
+ case GST_EVENT_EOS:
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ gst_audio_encoder_drain (enc);
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+ break;
+
+ case GST_EVENT_TAG:
+ {
+ GstTagList *tags;
+
+ gst_event_parse_tag (event, &tags);
+ tags = gst_tag_list_copy (tags);
+ gst_event_unref (event);
+
+ /* FIXME: make generic based on GST_TAG_FLAG_ENCODED */
+ gst_tag_list_remove_tag (tags, GST_TAG_CODEC);
+ gst_tag_list_remove_tag (tags, GST_TAG_AUDIO_CODEC);
+ gst_tag_list_remove_tag (tags, GST_TAG_VIDEO_CODEC);
+ gst_tag_list_remove_tag (tags, GST_TAG_SUBTITLE_CODEC);
+ gst_tag_list_remove_tag (tags, GST_TAG_CONTAINER_FORMAT);
+ gst_tag_list_remove_tag (tags, GST_TAG_BITRATE);
+ gst_tag_list_remove_tag (tags, GST_TAG_NOMINAL_BITRATE);
+ gst_tag_list_remove_tag (tags, GST_TAG_MAXIMUM_BITRATE);
+ gst_tag_list_remove_tag (tags, GST_TAG_MINIMUM_BITRATE);
+ gst_tag_list_remove_tag (tags, GST_TAG_ENCODER);
+ gst_tag_list_remove_tag (tags, GST_TAG_ENCODER_VERSION);
+ event = gst_event_new_tag (tags);
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ enc->priv->pending_events =
+ g_list_append (enc->priv->pending_events, event);
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+ handled = TRUE;
+ break;
+ }
+
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ gst_audio_encoder_sink_setcaps (enc, caps);
+ gst_event_unref (event);
+ handled = TRUE;
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+static gboolean
+gst_audio_encoder_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstAudioEncoder *enc;
+ GstAudioEncoderClass *klass;
+ gboolean handled = FALSE;
+ gboolean ret = TRUE;
+
+ enc = GST_AUDIO_ENCODER (gst_pad_get_parent (pad));
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+ GST_DEBUG_OBJECT (enc, "received event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ if (klass->event)
+ handled = klass->event (enc, event);
+
+ if (!handled)
+ handled = gst_audio_encoder_sink_eventfunc (enc, event);
+
+ if (!handled) {
+ /* Forward non-serialized events and EOS/FLUSH_STOP immediately.
+ * For EOS this is required because no buffer or serialized event
+ * will come after EOS and nothing could trigger another
+ * _finish_frame() call.
+ *
+ * For FLUSH_STOP this is required because it is expected
+ * to be forwarded immediately and no buffers are queued anyway.
+ */
+ if (!GST_EVENT_IS_SERIALIZED (event)
+ || GST_EVENT_TYPE (event) == GST_EVENT_EOS
+ || GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
+ ret = gst_pad_event_default (pad, event);
+ } else {
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ enc->priv->pending_events =
+ g_list_append (enc->priv->pending_events, event);
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+ ret = TRUE;
+ }
+ }
+
+ GST_DEBUG_OBJECT (enc, "event handled");
+
+ gst_object_unref (enc);
+ return ret;
+}
+
+static gboolean
+gst_audio_encoder_sink_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+ GstAudioEncoder *enc;
+
+ enc = GST_AUDIO_ENCODER (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_FORMATS:
+ {
+ gst_query_set_formats (query, 3,
+ GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_DEFAULT);
+ 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_audio_info_convert (&enc->priv->ctx.info,
+ 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;
+ }
+
+error:
+ gst_object_unref (enc);
+ return res;
+}
+
+static const GstQueryType *
+gst_audio_encoder_get_query_types (GstPad * pad)
+{
+ static const GstQueryType gst_audio_encoder_src_query_types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_CONVERT,
+ GST_QUERY_LATENCY,
+ 0
+ };
+
+ return gst_audio_encoder_src_query_types;
+}
+
+/*
+ * gst_audio_encoded_audio_convert:
+ * @fmt: audio format of the encoded audio
+ * @bytes: number of encoded bytes
+ * @samples: number of encoded samples
+ * @src_format: source format
+ * @src_value: source value
+ * @dest_format: destination format
+ * @dest_value: destination format
+ *
+ * Helper function to convert @src_value in @src_format to @dest_value in
+ * @dest_format for encoded audio data. Conversion is possible between
+ * BYTE and TIME format by using estimated bitrate based on
+ * @samples and @bytes (and @fmt).
+ *
+ * Since: 0.10.36
+ */
+/* FIXME: make gst_audio_encoded_audio_convert() public? */
+static gboolean
+gst_audio_encoded_audio_convert (GstAudioInfo * fmt,
+ gint64 bytes, gint64 samples, GstFormat src_format,
+ gint64 src_value, GstFormat * dest_format, gint64 * dest_value)
+{
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (dest_format != NULL, FALSE);
+ g_return_val_if_fail (dest_value != NULL, FALSE);
+
+ if (G_UNLIKELY (src_format == *dest_format || src_value == 0 ||
+ src_value == -1)) {
+ if (dest_value)
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ if (samples == 0 || bytes == 0 || fmt->rate == 0) {
+ GST_DEBUG ("not enough metadata yet to convert");
+ goto exit;
+ }
+
+ bytes *= fmt->rate;
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * samples, bytes);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ *dest_value = gst_util_uint64_scale (src_value, bytes,
+ samples * GST_SECOND);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+
+exit:
+ return res;
+}
+
+/* FIXME ? are any of these queries (other than latency) an encoder's business
+ * also, the conversion stuff might seem to make sense, but seems to not mind
+ * segment stuff etc at all
+ * Supposedly that's backward compatibility ... */
+static gboolean
+gst_audio_encoder_src_query (GstPad * pad, GstQuery * query)
+{
+ GstAudioEncoder *enc;
+ GstPad *peerpad;
+ gboolean res = FALSE;
+
+ enc = GST_AUDIO_ENCODER (GST_PAD_PARENT (pad));
+ peerpad = gst_pad_get_peer (GST_PAD (enc->sinkpad));
+
+ GST_LOG_OBJECT (enc, "handling query: %" GST_PTR_FORMAT, query);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat fmt, req_fmt;
+ gint64 pos, val;
+
+ if ((res = gst_pad_peer_query (enc->sinkpad, query))) {
+ GST_LOG_OBJECT (enc, "returning peer response");
+ break;
+ }
+
+ if (!peerpad) {
+ GST_LOG_OBJECT (enc, "no peer");
+ break;
+ }
+
+ gst_query_parse_position (query, &req_fmt, NULL);
+ fmt = GST_FORMAT_TIME;
+ if (!(res = gst_pad_query_position (peerpad, fmt, &pos)))
+ break;
+
+ if ((res = gst_pad_query_convert (peerpad, fmt, pos, req_fmt, &val))) {
+ gst_query_set_position (query, req_fmt, val);
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ GstFormat fmt, req_fmt;
+ gint64 dur, val;
+
+ if ((res = gst_pad_peer_query (enc->sinkpad, query))) {
+ GST_LOG_OBJECT (enc, "returning peer response");
+ break;
+ }
+
+ if (!peerpad) {
+ GST_LOG_OBJECT (enc, "no peer");
+ break;
+ }
+
+ gst_query_parse_duration (query, &req_fmt, NULL);
+ fmt = GST_FORMAT_TIME;
+ if (!(res = gst_pad_query_duration (peerpad, fmt, &dur)))
+ break;
+
+ if ((res = gst_pad_query_convert (peerpad, fmt, dur, req_fmt, &val))) {
+ gst_query_set_duration (query, req_fmt, val);
+ }
+ break;
+ }
+ case GST_QUERY_FORMATS:
+ {
+ gst_query_set_formats (query, 2, GST_FORMAT_TIME, GST_FORMAT_BYTES);
+ 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_audio_encoded_audio_convert (&enc->priv->ctx.info,
+ enc->priv->bytes_out, enc->priv->samples_in, src_fmt, src_val,
+ &dest_fmt, &dest_val)))
+ break;
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ if ((res = gst_pad_peer_query (enc->sinkpad, query))) {
+ gboolean live;
+ GstClockTime min_latency, max_latency;
+
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+ GST_DEBUG_OBJECT (enc, "Peer latency: live %d, min %"
+ GST_TIME_FORMAT " max %" GST_TIME_FORMAT, live,
+ GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
+
+ GST_OBJECT_LOCK (enc);
+ /* add our latency */
+ if (min_latency != -1)
+ min_latency += enc->priv->ctx.min_latency;
+ if (max_latency != -1)
+ max_latency += enc->priv->ctx.max_latency;
+ GST_OBJECT_UNLOCK (enc);
+
+ gst_query_set_latency (query, live, min_latency, max_latency);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+
+ gst_object_unref (peerpad);
+ return res;
+}
+
+static void
+gst_audio_encoder_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAudioEncoder *enc;
+
+ enc = GST_AUDIO_ENCODER (object);
+
+ switch (prop_id) {
+ case PROP_PERFECT_TS:
+ if (enc->priv->granule && !g_value_get_boolean (value))
+ GST_WARNING_OBJECT (enc, "perfect-timestamp can not be set FALSE "
+ "while granule handling is enabled");
+ else
+ enc->priv->perfect_ts = g_value_get_boolean (value);
+ break;
+ case PROP_HARD_RESYNC:
+ enc->priv->hard_resync = g_value_get_boolean (value);
+ break;
+ case PROP_TOLERANCE:
+ enc->priv->tolerance = g_value_get_int64 (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_encoder_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAudioEncoder *enc;
+
+ enc = GST_AUDIO_ENCODER (object);
+
+ switch (prop_id) {
+ case PROP_PERFECT_TS:
+ g_value_set_boolean (value, enc->priv->perfect_ts);
+ break;
+ case PROP_GRANULE:
+ g_value_set_boolean (value, enc->priv->granule);
+ break;
+ case PROP_HARD_RESYNC:
+ g_value_set_boolean (value, enc->priv->hard_resync);
+ break;
+ case PROP_TOLERANCE:
+ g_value_set_int64 (value, enc->priv->tolerance);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_audio_encoder_activate (GstAudioEncoder * enc, gboolean active)
+{
+ GstAudioEncoderClass *klass;
+ gboolean result = FALSE;
+
+ klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+ g_return_val_if_fail (!enc->priv->granule || enc->priv->perfect_ts, FALSE);
+
+ GST_DEBUG_OBJECT (enc, "activate %d", active);
+
+ if (active) {
+
+ if (enc->priv->tags)
+ gst_tag_list_free (enc->priv->tags);
+ enc->priv->tags = gst_tag_list_new ();
+
+ if (!enc->priv->active && klass->start)
+ result = klass->start (enc);
+ } else {
+ /* We must make sure streaming has finished before resetting things
+ * and calling the ::stop vfunc */
+ GST_PAD_STREAM_LOCK (enc->sinkpad);
+ GST_PAD_STREAM_UNLOCK (enc->sinkpad);
+
+ if (enc->priv->active && klass->stop)
+ result = klass->stop (enc);
+
+ /* clean up */
+ gst_audio_encoder_reset (enc, TRUE);
+ }
+ GST_DEBUG_OBJECT (enc, "activate return: %d", result);
+ return result;
+}
+
+
+static gboolean
+gst_audio_encoder_sink_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = TRUE;
+ GstAudioEncoder *enc;
+
+ enc = GST_AUDIO_ENCODER (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (enc, "sink activate push %d", active);
+
+ result = gst_audio_encoder_activate (enc, active);
+
+ if (result)
+ enc->priv->active = active;
+
+ GST_DEBUG_OBJECT (enc, "sink activate push return: %d", result);
+
+ gst_object_unref (enc);
+ return result;
+}
+
+/**
+ * gst_audio_encoder_get_audio_info:
+ * @enc: a #GstAudioEncoder
+ *
+ * Returns: a #GstAudioInfo describing the input audio format
+ *
+ * Since: 0.10.36
+ */
+GstAudioInfo *
+gst_audio_encoder_get_audio_info (GstAudioEncoder * enc)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), NULL);
+
+ return &enc->priv->ctx.info;
+}
+
+/**
+ * gst_audio_encoder_set_frame_samples_min:
+ * @enc: a #GstAudioEncoder
+ * @num: number of samples per frame
+ *
+ * Sets number of samples (per channel) subclass needs to be handed,
+ * at least or will be handed all available if 0.
+ *
+ * If an exact number of samples is required, gst_audio_encoder_set_frame_samples_max()
+ * must be called with the same number.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_frame_samples_min (GstAudioEncoder * enc, gint num)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ enc->priv->ctx.frame_samples_min = num;
+}
+
+/**
+ * gst_audio_encoder_get_frame_samples_min:
+ * @enc: a #GstAudioEncoder
+ *
+ * Returns: currently minimum requested samples per frame
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_encoder_get_frame_samples_min (GstAudioEncoder * enc)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), 0);
+
+ return enc->priv->ctx.frame_samples_min;
+}
+
+/**
+ * gst_audio_encoder_set_frame_samples_max:
+ * @enc: a #GstAudioEncoder
+ * @num: number of samples per frame
+ *
+ * Sets number of samples (per channel) subclass needs to be handed,
+ * at most or will be handed all available if 0.
+ *
+ * If an exact number of samples is required, gst_audio_encoder_set_frame_samples_min()
+ * must be called with the same number.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_frame_samples_max (GstAudioEncoder * enc, gint num)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ enc->priv->ctx.frame_samples_max = num;
+}
+
+/**
+ * gst_audio_encoder_get_frame_samples_min:
+ * @enc: a #GstAudioEncoder
+ *
+ * Returns: currently maximum requested samples per frame
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_encoder_get_frame_samples_max (GstAudioEncoder * enc)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), 0);
+
+ return enc->priv->ctx.frame_samples_max;
+}
+
+/**
+ * gst_audio_encoder_set_frame_max:
+ * @enc: a #GstAudioEncoder
+ * @num: number of frames
+ *
+ * Sets max number of frames accepted at once (assumed minimally 1).
+ * Requires @frame_samples_min and @frame_samples_max to be the equal.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_frame_max (GstAudioEncoder * enc, gint num)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ enc->priv->ctx.frame_max = num;
+}
+
+/**
+ * gst_audio_encoder_get_frame_max:
+ * @enc: a #GstAudioEncoder
+ *
+ * Returns: currently configured maximum handled frames
+ *
+ * Since: 0.10.36
+ */
+gint
+gst_audio_encoder_get_frame_max (GstAudioEncoder * enc)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), 0);
+
+ return enc->priv->ctx.frame_max;
+}
+
+/**
+ * gst_audio_encoder_set_lookahead:
+ * @enc: a #GstAudioEncoder
+ * @num: lookahead
+ *
+ * Sets encoder lookahead (in units of input rate samples)
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_lookahead (GstAudioEncoder * enc, gint num)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ enc->priv->ctx.lookahead = num;
+}
+
+/**
+ * gst_audio_encoder_get_lookahead:
+ * @enc: a #GstAudioEncoder
+ *
+ * Returns: currently configured encoder lookahead
+ */
+gint
+gst_audio_encoder_get_lookahead (GstAudioEncoder * enc)
+{
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), 0);
+
+ return enc->priv->ctx.lookahead;
+}
+
+/**
+ * gst_audio_encoder_set_latency:
+ * @enc: a #GstAudioEncoder
+ * @min: minimum latency
+ * @max: maximum latency
+ *
+ * Sets encoder latency.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_latency (GstAudioEncoder * enc,
+ GstClockTime min, GstClockTime max)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_OBJECT_LOCK (enc);
+ enc->priv->ctx.min_latency = min;
+ enc->priv->ctx.max_latency = max;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_get_latency:
+ * @enc: a #GstAudioEncoder
+ * @min: (out) (allow-none): a pointer to storage to hold minimum latency
+ * @max: (out) (allow-none): a pointer to storage to hold maximum latency
+ *
+ * Sets the variables pointed to by @min and @max to the currently configured
+ * latency.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_get_latency (GstAudioEncoder * enc,
+ GstClockTime * min, GstClockTime * max)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_OBJECT_LOCK (enc);
+ if (min)
+ *min = enc->priv->ctx.min_latency;
+ if (max)
+ *max = enc->priv->ctx.max_latency;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_set_mark_granule:
+ * @enc: a #GstAudioEncoder
+ * @enabled: new state
+ *
+ * Enable or disable encoder granule handling.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_mark_granule (GstAudioEncoder * enc, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_LOG_OBJECT (enc, "enabled: %d", enabled);
+
+ GST_OBJECT_LOCK (enc);
+ enc->priv->granule = enabled;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_get_mark_granule:
+ * @enc: a #GstAudioEncoder
+ *
+ * Queries if the encoder will handle granule marking.
+ *
+ * Returns: TRUE if granule marking is enabled.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gboolean
+gst_audio_encoder_get_mark_granule (GstAudioEncoder * enc)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE);
+
+ GST_OBJECT_LOCK (enc);
+ result = enc->priv->granule;
+ GST_OBJECT_UNLOCK (enc);
+
+ return result;
+}
+
+/**
+ * gst_audio_encoder_set_perfect_timestamp:
+ * @enc: a #GstAudioEncoder
+ * @enabled: new state
+ *
+ * Enable or disable encoder perfect output timestamp preference.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_perfect_timestamp (GstAudioEncoder * enc,
+ gboolean enabled)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_LOG_OBJECT (enc, "enabled: %d", enabled);
+
+ GST_OBJECT_LOCK (enc);
+ enc->priv->perfect_ts = enabled;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_get_perfect_timestamp:
+ * @enc: a #GstAudioEncoder
+ *
+ * Queries encoder perfect timestamp behaviour.
+ *
+ * Returns: TRUE if pefect timestamp setting enabled.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gboolean
+gst_audio_encoder_get_perfect_timestamp (GstAudioEncoder * enc)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE);
+
+ GST_OBJECT_LOCK (enc);
+ result = enc->priv->perfect_ts;
+ GST_OBJECT_UNLOCK (enc);
+
+ return result;
+}
+
+/**
+ * gst_audio_encoder_set_hard_sync:
+ * @enc: a #GstAudioEncoder
+ * @enabled: new state
+ *
+ * Sets encoder hard resync handling.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_hard_resync (GstAudioEncoder * enc, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_LOG_OBJECT (enc, "enabled: %d", enabled);
+
+ GST_OBJECT_LOCK (enc);
+ enc->priv->hard_resync = enabled;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_get_hard_sync:
+ * @enc: a #GstAudioEncoder
+ *
+ * Queries encoder's hard resync setting.
+ *
+ * Returns: TRUE if hard resync is enabled.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gboolean
+gst_audio_encoder_get_hard_resync (GstAudioEncoder * enc)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE);
+
+ GST_OBJECT_LOCK (enc);
+ result = enc->priv->hard_resync;
+ GST_OBJECT_UNLOCK (enc);
+
+ return result;
+}
+
+/**
+ * gst_audio_encoder_set_tolerance:
+ * @enc: a #GstAudioEncoder
+ * @tolerance: new tolerance
+ *
+ * Configures encoder audio jitter tolerance threshold.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_set_tolerance (GstAudioEncoder * enc, gint64 tolerance)
+{
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+
+ GST_OBJECT_LOCK (enc);
+ enc->priv->tolerance = tolerance;
+ GST_OBJECT_UNLOCK (enc);
+}
+
+/**
+ * gst_audio_encoder_get_tolerance:
+ * @enc: a #GstAudioEncoder
+ *
+ * Queries current audio jitter tolerance threshold.
+ *
+ * Returns: encoder audio jitter tolerance threshold.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+gint64
+gst_audio_encoder_get_tolerance (GstAudioEncoder * enc)
+{
+ gint64 result;
+
+ g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), 0);
+
+ GST_OBJECT_LOCK (enc);
+ result = enc->priv->tolerance;
+ GST_OBJECT_UNLOCK (enc);
+
+ return result;
+}
+
+/**
+ * gst_audio_encoder_merge_tags:
+ * @enc: a #GstAudioEncoder
+ * @tags: a #GstTagList to merge
+ * @mode: the #GstTagMergeMode to use
+ *
+ * Adds tags to so-called pending tags, which will be processed
+ * before pushing out data downstream.
+ *
+ * Note that this is provided for convenience, and the subclass is
+ * not required to use this and can still do tag handling on its own,
+ * although it should be aware that baseclass already takes care
+ * of the usual CODEC/AUDIO_CODEC tags.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.36
+ */
+void
+gst_audio_encoder_merge_tags (GstAudioEncoder * enc,
+ const GstTagList * tags, GstTagMergeMode mode)
+{
+ GstTagList *otags;
+
+ g_return_if_fail (GST_IS_AUDIO_ENCODER (enc));
+ g_return_if_fail (tags == NULL || GST_IS_TAG_LIST (tags));
+
+ GST_OBJECT_LOCK (enc);
+ if (tags)
+ GST_DEBUG_OBJECT (enc, "merging tags %" GST_PTR_FORMAT, tags);
+ otags = enc->priv->tags;
+ enc->priv->tags = gst_tag_list_merge (enc->priv->tags, tags, mode);
+ if (otags)
+ gst_tag_list_free (otags);
+ GST_OBJECT_UNLOCK (enc);
+}
diff --git a/gst-libs/gst/audio/gstaudioencoder.h b/gst-libs/gst/audio/gstaudioencoder.h
new file mode 100644
index 0000000..7685b18
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioencoder.h
@@ -0,0 +1,257 @@
+/* GStreamer
+ * Copyright (C) 2011 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>.
+ * Copyright (C) 2011 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_AUDIO_ENCODER_H__
+#define __GST_AUDIO_ENCODER_H__
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "GstAudioEncoder is unstable API and may change in future."
+#warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_ENCODER (gst_audio_encoder_get_type())
+#define GST_AUDIO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_ENCODER,GstAudioEncoder))
+#define GST_AUDIO_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_ENCODER,GstAudioEncoderClass))
+#define GST_AUDIO_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_AUDIO_ENCODER,GstAudioEncoderClass))
+#define GST_IS_AUDIO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_ENCODER))
+#define GST_IS_AUDIO_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_ENCODER))
+#define GST_AUDIO_ENCODER_CAST(obj) ((GstAudioEncoder *)(obj))
+
+/**
+ * GST_AUDIO_ENCODER_SINK_NAME:
+ *
+ * the name of the templates for the sink pad
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_ENCODER_SINK_NAME "sink"
+/**
+ * GST_AUDIO_ENCODER_SRC_NAME:
+ *
+ * the name of the templates for the source pad
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_ENCODER_SRC_NAME "src"
+
+/**
+ * GST_AUDIO_ENCODER_SRC_PAD:
+ * @obj: base parse instance
+ *
+ * Gives the pointer to the source #GstPad object of the element.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_ENCODER_SRC_PAD(obj) (GST_AUDIO_ENCODER_CAST (obj)->srcpad)
+
+/**
+ * GST_AUDIO_ENCODER_SINK_PAD:
+ * @obj: base parse instance
+ *
+ * Gives the pointer to the sink #GstPad object of the element.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_ENCODER_SINK_PAD(obj) (GST_AUDIO_ENCODER_CAST (obj)->sinkpad)
+
+/**
+ * GST_AUDIO_ENCODER_SEGMENT:
+ * @obj: base parse instance
+ *
+ * Gives the segment of the element.
+ *
+ * Since: 0.10.36
+ */
+#define GST_AUDIO_ENCODER_SEGMENT(obj) (GST_AUDIO_ENCODER_CAST (obj)->segment)
+
+#define GST_AUDIO_ENCODER_STREAM_LOCK(enc) g_static_rec_mutex_lock (&GST_AUDIO_ENCODER (enc)->stream_lock)
+#define GST_AUDIO_ENCODER_STREAM_UNLOCK(enc) g_static_rec_mutex_unlock (&GST_AUDIO_ENCODER (enc)->stream_lock)
+
+typedef struct _GstAudioEncoder GstAudioEncoder;
+typedef struct _GstAudioEncoderClass GstAudioEncoderClass;
+
+typedef struct _GstAudioEncoderPrivate GstAudioEncoderPrivate;
+
+/**
+ * GstAudioEncoder:
+ *
+ * The opaque #GstAudioEncoder data structure.
+ *
+ * Since: 0.10.36
+ */
+struct _GstAudioEncoder {
+ GstElement element;
+
+ /*< protected >*/
+ /* source and sink pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* protects all data processing, i.e. is locked
+ * in the chain function, finish_frame and when
+ * processing serialized events */
+ GStaticRecMutex stream_lock;
+
+ /* MT-protected (with STREAM_LOCK) */
+ GstSegment segment;
+
+ /*< private >*/
+ GstAudioEncoderPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+/**
+ * GstAudioEncoderClass:
+ * @element_class: The parent class structure
+ * @start: Optional.
+ * Called when the element starts processing.
+ * Allows opening external resources.
+ * @stop: Optional.
+ * Called when the element stops processing.
+ * Allows closing external resources.
+ * @set_format: Notifies subclass of incoming data format.
+ * GstAudioInfo contains the format according to provided caps.
+ * @handle_frame: Provides input samples (or NULL to clear any remaining data)
+ * according to directions as configured by the subclass
+ * using the API. Input data ref management is performed
+ * by base class, subclass should not care or intervene.
+ * @flush: Optional.
+ * Instructs subclass to clear any codec caches and discard
+ * any pending samples and not yet returned encoded data.
+ * @event: Optional.
+ * Event handler on the sink pad. This function should return
+ * TRUE if the event was handled and should be discarded
+ * (i.e. not unref'ed).
+ * @pre_push: Optional.
+ * Called just prior to pushing (encoded data) buffer downstream.
+ * Subclass has full discretionary access to buffer,
+ * and a not OK flow return will abort downstream pushing.
+ * @getcaps: Optional.
+ * Allows for a custom sink getcaps implementation (e.g.
+ * for multichannel input specification). If not implemented,
+ * default returns gst_audio_encoder_proxy_getcaps
+ * applied to sink template caps.
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At minimum @set_format and @handle_frame needs to be overridden.
+ *
+ * Since: 0.10.36
+ */
+struct _GstAudioEncoderClass {
+ GstElementClass element_class;
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstAudioEncoder *enc);
+
+ gboolean (*stop) (GstAudioEncoder *enc);
+
+ gboolean (*set_format) (GstAudioEncoder *enc,
+ GstAudioInfo *info);
+
+ GstFlowReturn (*handle_frame) (GstAudioEncoder *enc,
+ GstBuffer *buffer);
+
+ void (*flush) (GstAudioEncoder *enc);
+
+ GstFlowReturn (*pre_push) (GstAudioEncoder *enc,
+ GstBuffer **buffer);
+
+ gboolean (*event) (GstAudioEncoder *enc,
+ GstEvent *event);
+
+ GstCaps * (*getcaps) (GstAudioEncoder *enc, GstCaps *filter);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_audio_encoder_get_type (void);
+
+GstFlowReturn gst_audio_encoder_finish_frame (GstAudioEncoder * enc,
+ GstBuffer * buffer,
+ gint samples);
+
+GstCaps * gst_audio_encoder_proxy_getcaps (GstAudioEncoder * enc,
+ GstCaps * caps);
+
+
+/* context parameters */
+GstAudioInfo * gst_audio_encoder_get_audio_info (GstAudioEncoder * enc);
+
+gint gst_audio_encoder_get_frame_samples_min (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_frame_samples_min (GstAudioEncoder * enc, gint num);
+
+gint gst_audio_encoder_get_frame_samples_max (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_frame_samples_max (GstAudioEncoder * enc, gint num);
+
+gint gst_audio_encoder_get_frame_max (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_frame_max (GstAudioEncoder * enc, gint num);
+
+gint gst_audio_encoder_get_lookahead (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_lookahead (GstAudioEncoder * enc, gint num);
+
+void gst_audio_encoder_get_latency (GstAudioEncoder * enc,
+ GstClockTime * min,
+ GstClockTime * max);
+
+void gst_audio_encoder_set_latency (GstAudioEncoder * enc,
+ GstClockTime min,
+ GstClockTime max);
+
+/* object properties */
+
+void gst_audio_encoder_set_mark_granule (GstAudioEncoder * enc,
+ gboolean enabled);
+
+gboolean gst_audio_encoder_get_mark_granule (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_perfect_timestamp (GstAudioEncoder * enc,
+ gboolean enabled);
+
+gboolean gst_audio_encoder_get_perfect_timestamp (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_hard_resync (GstAudioEncoder * enc,
+ gboolean enabled);
+
+gboolean gst_audio_encoder_get_hard_resync (GstAudioEncoder * enc);
+
+void gst_audio_encoder_set_tolerance (GstAudioEncoder * enc,
+ gint64 tolerance);
+
+gint64 gst_audio_encoder_get_tolerance (GstAudioEncoder * enc);
+
+void gst_audio_encoder_merge_tags (GstAudioEncoder * enc,
+ const GstTagList * tags, GstTagMergeMode mode);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_ENCODER_H__ */
diff --git a/gst-libs/gst/audio/gstaudiofilter.c b/gst-libs/gst/audio/gstaudiofilter.c
new file mode 100644
index 0000000..6ef6de9
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiofilter.c
@@ -0,0 +1,200 @@
+/* GStreamer audio filter base class
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2003> David Schleef <ds@schleef.org>
+ * Copyright (C) <2007> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstaudiofilter
+ * @short_description: Base class for simple audio filters
+ *
+ * #GstAudioFilter is a #GstBaseTransform<!-- -->-derived base class for simple audio
+ * filters, ie. those that output the same format that they get as input.
+ *
+ * #GstAudioFilter will parse the input format for you (with error checking)
+ * before calling your setup function. Also, elements deriving from
+ * #GstAudioFilter may use gst_audio_filter_class_add_pad_templates() from
+ * their class_init function to easily configure the set of caps/formats that
+ * the element is able to handle.
+ *
+ * Derived classes should override the #GstAudioFilterClass.setup() and
+ * #GstBaseTransformClass.transform_ip() and/or
+ * #GstBaseTransformClass.transform()
+ * virtual functions in their class_init function.
+ *
+ * Last reviewed on 2007-02-03 (0.10.11.1)
+ *
+ * Since: 0.10.12
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstaudiofilter.h"
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (audiofilter_dbg);
+#define GST_CAT_DEFAULT audiofilter_dbg
+
+static GstStateChangeReturn gst_audio_filter_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_audio_filter_set_caps (GstBaseTransform * btrans,
+ GstCaps * incaps, GstCaps * outcaps);
+static gboolean gst_audio_filter_get_unit_size (GstBaseTransform * btrans,
+ GstCaps * caps, gsize * size);
+
+#define do_init G_STMT_START { \
+ GST_DEBUG_CATEGORY_INIT (audiofilter_dbg, "audiofilter", 0, "audiofilter"); \
+} G_STMT_END
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstAudioFilter, gst_audio_filter,
+ GST_TYPE_BASE_TRANSFORM, do_init);
+
+static void
+gst_audio_filter_class_init (GstAudioFilterClass * klass)
+{
+ GstBaseTransformClass *basetrans_class = (GstBaseTransformClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_audio_filter_change_state);
+ basetrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_audio_filter_set_caps);
+ basetrans_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_audio_filter_get_unit_size);
+}
+
+static void
+gst_audio_filter_init (GstAudioFilter * self)
+{
+ /* nothing to do here */
+}
+
+/* we override the state change vfunc here instead of GstBaseTransform's stop
+ * vfunc, so GstAudioFilter-derived elements can override ::stop() for their
+ * own purposes without having to worry about chaining up */
+static GstStateChangeReturn
+gst_audio_filter_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstAudioFilter *filter = GST_AUDIO_FILTER (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ gst_audio_info_init (&filter->info);
+ break;
+ default:
+ break;
+ }
+
+ ret =
+ GST_ELEMENT_CLASS (gst_audio_filter_parent_class)->change_state (element,
+ transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_audio_info_init (&filter->info);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_audio_filter_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstAudioFilterClass *klass;
+ GstAudioFilter *filter = GST_AUDIO_FILTER (btrans);
+ gboolean ret = TRUE;
+
+ GST_LOG_OBJECT (filter, "caps: %" GST_PTR_FORMAT, incaps);
+
+ if (!gst_audio_info_from_caps (&filter->info, incaps))
+ goto invalid_format;
+
+ klass = GST_AUDIO_FILTER_CLASS_CAST (G_OBJECT_GET_CLASS (filter));
+
+ if (klass->setup)
+ ret = klass->setup (filter, &filter->info);
+
+ return ret;
+
+ /* ERROR */
+invalid_format:
+ {
+ GST_WARNING_OBJECT (filter, "couldn't parse %" GST_PTR_FORMAT, incaps);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audio_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ gsize * size)
+{
+ GstStructure *structure;
+ gboolean ret = TRUE;
+ gint width, channels;
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ ret &= gst_structure_get_int (structure, "width", &width);
+ ret &= gst_structure_get_int (structure, "channels", &channels);
+
+ if (ret)
+ *size = (width / 8) * channels;
+
+ return ret;
+}
+
+/**
+ * gst_audio_filter_class_add_pad_templates:
+ * @klass: an #GstAudioFilterClass
+ * @allowed_caps: what formats the filter can handle, as #GstCaps
+ *
+ * Convenience function to add pad templates to this element class, with
+ * @allowed_caps as the caps that can be handled.
+ *
+ * This function is usually used from within a GObject class_init function.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_audio_filter_class_add_pad_templates (GstAudioFilterClass * klass,
+ GstCaps * allowed_caps)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstPadTemplate *pad_template;
+
+ g_return_if_fail (GST_IS_AUDIO_FILTER_CLASS (klass));
+ g_return_if_fail (GST_IS_CAPS (allowed_caps));
+
+ pad_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ allowed_caps);
+ gst_element_class_add_pad_template (element_class, pad_template);
+
+ pad_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ allowed_caps);
+ gst_element_class_add_pad_template (element_class, pad_template);
+}
diff --git a/gst-libs/gst/audio/gstaudiofilter.h b/gst-libs/gst/audio/gstaudiofilter.h
new file mode 100644
index 0000000..dfa75e1
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiofilter.h
@@ -0,0 +1,103 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_AUDIO_FILTER_H__
+#define __GST_AUDIO_FILTER_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstAudioFilter GstAudioFilter;
+typedef struct _GstAudioFilterClass GstAudioFilterClass;
+
+#define GST_TYPE_AUDIO_FILTER \
+ (gst_audio_filter_get_type())
+#define GST_AUDIO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FILTER,GstAudioFilter))
+#define GST_AUDIO_FILTER_CAST(obj) \
+ ((GstAudioFilter *) (obj))
+#define GST_AUDIO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_FILTER,GstAudioFilterClass))
+#define GST_AUDIO_FILTER_CLASS_CAST(klass) \
+ ((GstAudioFilterClass *) (klass))
+#define GST_IS_AUDIO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FILTER))
+#define GST_IS_AUDIO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_FILTER))
+
+/**
+ * GstAudioFilter:
+ *
+ * Base class for audio filters with the same format for input and output.
+ *
+ * Since: 0.10.12
+ */
+struct _GstAudioFilter {
+ GstBaseTransform basetransform;
+
+ /*< protected >*/
+ GstAudioInfo info; /* currently configured format */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+#define GST_AUDIO_FILTER_INFO(filter) (&GST_AUDIO_FILTER_CAST(filter)->info)
+
+#define GST_AUDIO_FILTER_FORMAT(filter) (GST_AUDIO_INFO_FORMAT(GST_AUDIO_FILTER_INFO(filter)))
+#define GST_AUDIO_FILTER_RATE(filter) (GST_AUDIO_INFO_RATE(GST_AUDIO_FILTER_INFO(filter)))
+#define GST_AUDIO_FILTER_CHANNELS(filter) (GST_AUDIO_INFO_CHANNELS(GST_AUDIO_FILTER_INFO(filter)))
+#define GST_AUDIO_FILTER_BPF(filter) (GST_AUDIO_INFO_BPF(GST_AUDIO_FILTER_INFO(filter)))
+#define GST_AUDIO_FILTER_BPS(filter) (GST_AUDIO_INFO_BPS(GST_AUDIO_FILTER_INFO(filter)))
+
+/**
+ * GstAudioFilterClass:
+ * @basetransformclass: parent class
+ * @setup: virtual function called whenever the format changes
+ *
+ * In addition to the @setup virtual function, you should also override the
+ * GstBaseTransform::transform and/or GstBaseTransform::transform_ip virtual
+ * function.
+ *
+ * Since: 0.10.12
+ */
+
+struct _GstAudioFilterClass {
+ GstBaseTransformClass basetransformclass;
+
+ /* virtual function, called whenever the format changes */
+ gboolean (*setup) (GstAudioFilter * filter, const GstAudioInfo * info);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_audio_filter_get_type (void);
+
+void gst_audio_filter_class_add_pad_templates (GstAudioFilterClass * klass,
+ GstCaps * allowed_caps);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_FILTER_H__ */
+
diff --git a/gst-libs/gst/audio/gstaudioiec61937.c b/gst-libs/gst/audio/gstaudioiec61937.c
new file mode 100644
index 0000000..5742d28
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioiec61937.c
@@ -0,0 +1,321 @@
+/* GStreamer audio helper functions for IEC 61937 payloading
+ * (c) 2011 Intel Corporation
+ * 2011 Collabora Multimedia
+ * 2011 Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstaudioiec61937
+ * @short_description: Utility functions for IEC 61937 payloading
+ * @since: 0.10.35
+ *
+ * This module contains some helper functions for encapsulating various
+ * audio formats in IEC 61937 headers and padding.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include "gstaudioiec61937.h"
+
+#define IEC61937_HEADER_SIZE 8
+#define IEC61937_PAYLOAD_SIZE_AC3 (1536 * 4)
+#define IEC61937_PAYLOAD_SIZE_EAC3 (6144 * 4)
+
+static gint
+caps_get_int_field (const GstCaps * caps, const gchar * field)
+{
+ const GstStructure *st;
+ gint ret = 0;
+
+ st = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (st, field, &ret);
+
+ return ret;
+}
+
+static const gchar *
+caps_get_string_field (const GstCaps * caps, const gchar * field)
+{
+ const GstStructure *st = gst_caps_get_structure (caps, 0);
+ return gst_structure_get_string (st, field);
+}
+
+/**
+ * gst_audio_iec61937_frame_size:
+ * @spec: the ringbufer spec
+ *
+ * Calculated the size of the buffer expected by gst_audio_iec61937_payload() for
+ * payloading type from @spec.
+ *
+ * Returns: the size or 0 if the given @type is not supported or cannot be
+ * payloaded.
+ *
+ * Since: 0.10.35
+ */
+guint
+gst_audio_iec61937_frame_size (const GstRingBufferSpec * spec)
+{
+ switch (spec->type) {
+ case GST_BUFTYPE_AC3:
+ return IEC61937_PAYLOAD_SIZE_AC3;
+
+ case GST_BUFTYPE_EAC3:
+ /* Check that the parser supports /some/ alignment. Need to be less
+ * strict about this at checking time since the alignment is dynamically
+ * set at the moment. */
+ if (caps_get_string_field (spec->caps, "alignment"))
+ return IEC61937_PAYLOAD_SIZE_EAC3;
+ else
+ return 0;
+
+ case GST_BUFTYPE_DTS:
+ {
+ gint dts_frame_size = caps_get_int_field (spec->caps, "frame-size");
+ gint iec_frame_size = caps_get_int_field (spec->caps, "block-size") * 4;
+
+ /* Note: this will also (correctly) fail if either field is missing */
+ if (iec_frame_size >= (dts_frame_size + IEC61937_HEADER_SIZE))
+ return iec_frame_size;
+ else
+ return 0;
+ }
+
+ case GST_BUFTYPE_MPEG:
+ {
+ int version, layer, channels, frames;
+
+ version = caps_get_int_field (spec->caps, "mpegaudioversion");
+ layer = caps_get_int_field (spec->caps, "layer");
+ channels = caps_get_int_field (spec->caps, "channels");
+
+ /* Bail out if we can't figure out either, if it's MPEG 2.5, or if it's
+ * MP3 with multichannel audio */
+ if (!version || !layer || version == 3 || channels > 2)
+ return 0;
+
+ if (version == 1 && layer == 1)
+ frames = 384;
+ else if (version == 2 && layer == 1 && spec->info.rate < 32000)
+ frames = 768;
+ else if (version == 2 && layer == 1 && spec->info.rate < 32000)
+ frames = 2304;
+ else
+ frames = 1152;
+
+ return frames * 4;
+ }
+
+ default:
+ return 0;
+ }
+}
+
+/**
+ * gst_audio_iec61937_payload:
+ * @src: a buffer containing the data to payload
+ * @src_n: size of @src in bytes
+ * @dst: the destination buffer to store the payloaded contents in. Should not
+ * overlap with @src
+ * @dst_n: size of @dst in bytes
+ * @spec: the ringbufer spec for @src
+ *
+ * Payloads @src in the form specified by IEC 61937 for the type from @spec and
+ * stores the result in @dst. @src must contain exactly one frame of data and
+ * the frame is not checked for errors.
+ *
+ * Returns: transfer-full: %TRUE if the payloading was successful, %FALSE
+ * otherwise.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_audio_iec61937_payload (const guint8 * src, guint src_n, guint8 * dst,
+ guint dst_n, const GstRingBufferSpec * spec)
+{
+ guint i, tmp;
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ guint8 zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, six = 6,
+ seven = 7;
+#else
+ /* We need to send the data byte-swapped */
+ guint8 zero = 1, one = 0, two = 3, three = 2, four = 5, five = 4, six = 7,
+ seven = 6;
+#endif
+
+ g_return_val_if_fail (src != NULL, FALSE);
+ g_return_val_if_fail (dst != NULL, FALSE);
+ g_return_val_if_fail (src != dst, FALSE);
+ g_return_val_if_fail (dst_n >= gst_audio_iec61937_frame_size (spec), FALSE);
+
+ if (dst_n < src_n + IEC61937_HEADER_SIZE)
+ return FALSE;
+
+ /* Pa, Pb */
+ dst[zero] = 0xF8;
+ dst[one] = 0x72;
+ dst[two] = 0x4E;
+ dst[three] = 0x1F;
+
+ switch (spec->type) {
+ case GST_BUFTYPE_AC3:
+ {
+ g_return_val_if_fail (src_n >= 6, FALSE);
+
+ /* Pc: bit 13-15 - stream number (0)
+ * bit 11-12 - reserved (0)
+ * bit 8-10 - bsmod from AC3 frame */
+ dst[four] = src[5] & 0x7;
+ /* Pc: bit 7 - error bit (0)
+ * bit 5-6 - subdata type (0)
+ * bit 0-4 - data type (1) */
+ dst[five] = 1;
+ /* Pd: bit 15-0 - frame size in bits */
+ tmp = src_n * 8;
+ dst[six] = (guint8) (tmp >> 8);
+ dst[seven] = (guint8) (tmp & 0xff);
+
+ break;
+ }
+
+ case GST_BUFTYPE_EAC3:
+ {
+ if (g_str_equal (caps_get_string_field (spec->caps, "alignment"),
+ "iec61937"))
+ return FALSE;
+
+ /* Pc: bit 13-15 - stream number (0)
+ * bit 11-12 - reserved (0)
+ * bit 8-10 - bsmod from E-AC3 frame if present */
+ /* FIXME: this works, but nicer if we can put in the actual bsmod */
+ dst[four] = 0;
+ /* Pc: bit 7 - error bit (0)
+ * bit 5-6 - subdata type (0)
+ * bit 0-4 - data type (21) */
+ dst[five] = 21;
+ /* Pd: bit 15-0 - frame size in bytes */
+ dst[six] = ((guint16) src_n) >> 8;
+ dst[seven] = ((guint16) src_n) & 0xff;
+
+ break;
+ }
+
+ case GST_BUFTYPE_DTS:
+ {
+ int blocksize = caps_get_int_field (spec->caps, "block-size");
+
+ g_return_val_if_fail (src_n != 0, FALSE);
+
+ if (blocksize == 0)
+ return FALSE;
+
+ /* Pc: bit 13-15 - stream number (0)
+ * bit 11-12 - reserved (0)
+ * bit 8-10 - for DTS type I-III (0) */
+ dst[four] = 0;
+ /* Pc: bit 7 - error bit (0)
+ * bit 5-6 - reserved (0)
+ * bit 0-4 - data type (11 = type I, 12 = type II,
+ * 13 = type III) */
+ dst[five] = 11 + (blocksize / 1024);
+ /* Pd: bit 15-0 - frame size in bytes */
+ dst[six] = ((guint16) src_n) >> 8;
+ dst[seven] = ((guint16) src_n) & 0xff;
+ break;
+ }
+
+ case GST_BUFTYPE_MPEG:
+ {
+ int version, layer;
+
+ version = caps_get_int_field (spec->caps, "mpegaudioversion");
+ layer = caps_get_int_field (spec->caps, "layer");
+
+ g_return_val_if_fail (version > 0 && layer > 0, FALSE);
+
+ /* NOTE: multichannel audio (MPEG-2) is not supported */
+
+ /* Pc: bit 13-15 - stream number (0)
+ * bit 11-12 - reserved (0)
+ * bit 9-10 - 0 - no dynamic range control
+ * - 2 - dynamic range control exists
+ * - 1,3 - reserved
+ * bit 8 - Normal (0) or Karaoke (1) mode */
+ dst[four] = 0;
+ /* Pc: bit 7 - error bit (0)
+ * bit 5-6 - reserved (0)
+ * bit 0-4 - data type (04 = MPEG 1, Layer 1
+ * 05 = MPEG 1, Layer 2, 3 / MPEG 2, w/o ext.
+ * 06 = MPEG 2, with extension
+ * 08 - MPEG 2 LSF, Layer 1
+ * 09 - MPEG 2 LSF, Layer 2
+ * 10 - MPEG 2 LSF, Layer 3 */
+ if (version == 1 && layer == 1)
+ dst[five] = 0x04;
+ else if ((version == 1 && (layer == 2 || layer == 3)) ||
+ (version == 2 && spec->info.rate >= 32000))
+ dst[five] = 0x05;
+ else if (version == 2 && layer == 1 && spec->info.rate < 32000)
+ dst[five] = 0x08;
+ else if (version == 2 && layer == 2 && spec->info.rate < 32000)
+ dst[five] = 0x09;
+ else if (version == 2 && layer == 3 && spec->info.rate < 32000)
+ dst[five] = 0x0A;
+ else
+ g_return_val_if_reached (FALSE);
+ /* Pd: bit 15-0 - frame size in bits */
+ dst[six] = ((guint16) src_n * 8) >> 8;
+ dst[seven] = ((guint16) src_n * 8) & 0xff;
+
+ break;
+ }
+
+ default:
+ return FALSE;
+ }
+
+ /* Copy the payload */
+ i = 8;
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ memcpy (dst + i, src, src_n);
+#else
+ /* Byte-swapped again */
+ /* FIXME: orc-ify this */
+ for (tmp = 1; tmp < src_n; tmp += 2) {
+ dst[i + tmp - 1] = src[tmp];
+ dst[i + tmp] = src[tmp - 1];
+ }
+ /* Do we have 1 byte remaining? */
+ if (src_n % 2) {
+ dst[i + src_n - 1] = 0;
+ dst[i + src_n] = src[src_n - 1];
+ i++;
+ }
+#endif
+
+ i += src_n;
+
+ /* Zero the rest */
+ memset (dst + i, 0, dst_n - i);
+
+ return TRUE;
+}
diff --git a/gst-libs/gst/audio/gstaudioiec61937.h b/gst-libs/gst/audio/gstaudioiec61937.h
new file mode 100644
index 0000000..b33297a
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudioiec61937.h
@@ -0,0 +1,31 @@
+/* GStreamer audio helper functions for IEC 61937 payloading
+ * (c) 2011 Intel Corporation
+ * 2011 Collabora Multimedia
+ * 2011 Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_AUDIO_IEC61937_H__
+#define __GST_AUDIO_IEC61937_H__
+
+#include <gst/audio/gstringbuffer.h>
+
+guint gst_audio_iec61937_frame_size (const GstRingBufferSpec * spec);
+gboolean gst_audio_iec61937_payload (const guint8 * src, guint src_n,
+ guint8 * dst, guint dst_n, const GstRingBufferSpec * spec);
+
+#endif /* __GST_AUDIO_IEC61937_H__ */
diff --git a/gst-libs/gst/audio/gstaudiosink.c b/gst-libs/gst/audio/gstaudiosink.c
new file mode 100644
index 0000000..68e7c99
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiosink.c
@@ -0,0 +1,614 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstaudiosink.c: simple audio sink base 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.
+ */
+
+/**
+ * SECTION:gstaudiosink
+ * @short_description: Simple base class for audio sinks
+ * @see_also: #GstBaseAudioSink, #GstRingBuffer, #GstAudioSink.
+ *
+ * This is the most simple base class for audio sinks that only requires
+ * subclasses to implement a set of simple functions:
+ *
+ * <variablelist>
+ * <varlistentry>
+ * <term>open()</term>
+ * <listitem><para>Open the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>prepare()</term>
+ * <listitem><para>Configure the device with the specified format.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>write()</term>
+ * <listitem><para>Write samples to the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>reset()</term>
+ * <listitem><para>Unblock writes and flush the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>delay()</term>
+ * <listitem><para>Get the number of samples written but not yet played
+ * by the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>unprepare()</term>
+ * <listitem><para>Undo operations done by prepare.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>close()</term>
+ * <listitem><para>Close the device.</para></listitem>
+ * </varlistentry>
+ * </variablelist>
+ *
+ * All scheduling of samples and timestamps is done in this base class
+ * together with #GstBaseAudioSink using a default implementation of a
+ * #GstRingBuffer that uses threads.
+ *
+ * Last reviewed on 2006-09-27 (0.10.12)
+ */
+
+#include <string.h>
+
+#include "gstaudiosink.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_audio_sink_debug);
+#define GST_CAT_DEFAULT gst_audio_sink_debug
+
+#define GST_TYPE_AUDIORING_BUFFER \
+ (gst_audioringbuffer_get_type())
+#define GST_AUDIORING_BUFFER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBuffer))
+#define GST_AUDIORING_BUFFER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBufferClass))
+#define GST_AUDIORING_BUFFER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIORING_BUFFER, GstAudioRingBufferClass))
+#define GST_AUDIORING_BUFFER_CAST(obj) \
+ ((GstAudioRingBuffer *)obj)
+#define GST_IS_AUDIORING_BUFFER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIORING_BUFFER))
+#define GST_IS_AUDIORING_BUFFER_CLASS(klass)\
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIORING_BUFFER))
+
+typedef struct _GstAudioRingBuffer GstAudioRingBuffer;
+typedef struct _GstAudioRingBufferClass GstAudioRingBufferClass;
+
+#define GST_AUDIORING_BUFFER_GET_COND(buf) (((GstAudioRingBuffer *)buf)->cond)
+#define GST_AUDIORING_BUFFER_WAIT(buf) (g_cond_wait (GST_AUDIORING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
+#define GST_AUDIORING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_AUDIORING_BUFFER_GET_COND (buf)))
+#define GST_AUDIORING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIORING_BUFFER_GET_COND (buf)))
+
+struct _GstAudioRingBuffer
+{
+ GstRingBuffer object;
+
+ gboolean running;
+ gint queuedseg;
+
+ GCond *cond;
+};
+
+struct _GstAudioRingBufferClass
+{
+ GstRingBufferClass parent_class;
+};
+
+static void gst_audioringbuffer_class_init (GstAudioRingBufferClass * klass);
+static void gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
+ GstAudioRingBufferClass * klass);
+static void gst_audioringbuffer_dispose (GObject * object);
+static void gst_audioringbuffer_finalize (GObject * object);
+
+static GstRingBufferClass *ring_parent_class = NULL;
+
+static gboolean gst_audioringbuffer_open_device (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_close_device (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_acquire (GstRingBuffer * buf,
+ GstRingBufferSpec * spec);
+static gboolean gst_audioringbuffer_release (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_start (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_pause (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf);
+static guint gst_audioringbuffer_delay (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_activate (GstRingBuffer * buf,
+ gboolean active);
+
+/* ringbuffer abstract base class */
+static GType
+gst_audioringbuffer_get_type (void)
+{
+ static GType ringbuffer_type = 0;
+
+ if (!ringbuffer_type) {
+ static const GTypeInfo ringbuffer_info = {
+ sizeof (GstAudioRingBufferClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_audioringbuffer_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAudioRingBuffer),
+ 0,
+ (GInstanceInitFunc) gst_audioringbuffer_init,
+ NULL
+ };
+
+ ringbuffer_type =
+ g_type_register_static (GST_TYPE_RING_BUFFER, "GstAudioSinkRingBuffer",
+ &ringbuffer_info, 0);
+ }
+ return ringbuffer_type;
+}
+
+static void
+gst_audioringbuffer_class_init (GstAudioRingBufferClass * 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->dispose = gst_audioringbuffer_dispose;
+ gobject_class->finalize = gst_audioringbuffer_finalize;
+
+ gstringbuffer_class->open_device =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_open_device);
+ gstringbuffer_class->close_device =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_close_device);
+ gstringbuffer_class->acquire =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_acquire);
+ gstringbuffer_class->release =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_release);
+ gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
+ gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_audioringbuffer_pause);
+ gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
+ gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_audioringbuffer_stop);
+
+ gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_audioringbuffer_delay);
+ gstringbuffer_class->activate =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_activate);
+}
+
+typedef gint (*WriteFunc) (GstAudioSink * sink, gpointer data, guint length);
+
+/* this internal thread does nothing else but write samples to the audio device.
+ * It will write each segment in the ringbuffer and will update the play
+ * pointer.
+ * The start/stop methods control the thread.
+ */
+static void
+audioringbuffer_thread_func (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER_CAST (buf);
+ WriteFunc writefunc;
+ GstMessage *message;
+ GValue val = { 0 };
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ GST_DEBUG_OBJECT (sink, "enter thread");
+
+ GST_OBJECT_LOCK (abuf);
+ GST_DEBUG_OBJECT (sink, "signal wait");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+ GST_OBJECT_UNLOCK (abuf);
+
+ writefunc = csink->write;
+ if (writefunc == NULL)
+ goto no_function;
+
+ g_value_init (&val, G_TYPE_POINTER);
+ g_value_set_pointer (&val, sink->thread);
+ message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
+ GST_STREAM_STATUS_TYPE_ENTER, GST_ELEMENT_CAST (sink));
+ gst_message_set_stream_status_object (message, &val);
+ GST_DEBUG_OBJECT (sink, "posting ENTER stream status");
+ gst_element_post_message (GST_ELEMENT_CAST (sink), message);
+
+ while (TRUE) {
+ gint left, len;
+ guint8 *readptr;
+ gint readseg;
+
+ /* buffer must be started */
+ if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
+ gint written;
+
+ left = len;
+ do {
+ written = writefunc (sink, readptr, left);
+ GST_LOG_OBJECT (sink, "transfered %d bytes of %d from segment %d",
+ written, left, readseg);
+ if (written < 0 || written > left) {
+ /* might not be critical, it e.g. happens when aborting playback */
+ GST_WARNING_OBJECT (sink,
+ "error writing data in %s (reason: %s), skipping segment (left: %d, written: %d)",
+ GST_DEBUG_FUNCPTR_NAME (writefunc),
+ (errno > 1 ? g_strerror (errno) : "unknown"), left, written);
+ break;
+ }
+ left -= written;
+ readptr += written;
+ } while (left > 0);
+
+ /* clear written samples */
+ gst_ring_buffer_clear (buf, readseg);
+
+ /* we wrote one segment */
+ gst_ring_buffer_advance (buf, 1);
+ } else {
+ GST_OBJECT_LOCK (abuf);
+ if (!abuf->running)
+ goto stop_running;
+ GST_DEBUG_OBJECT (sink, "signal wait");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+ GST_DEBUG_OBJECT (sink, "wait for action");
+ GST_AUDIORING_BUFFER_WAIT (buf);
+ GST_DEBUG_OBJECT (sink, "got signal");
+ if (!abuf->running)
+ goto stop_running;
+ GST_DEBUG_OBJECT (sink, "continue running");
+ GST_OBJECT_UNLOCK (abuf);
+ }
+ }
+
+ /* Will never be reached */
+ g_assert_not_reached ();
+ return;
+
+ /* ERROR */
+no_function:
+ {
+ GST_DEBUG_OBJECT (sink, "no write function, exit thread");
+ return;
+ }
+stop_running:
+ {
+ GST_OBJECT_UNLOCK (abuf);
+ GST_DEBUG_OBJECT (sink, "stop running, exit thread");
+ message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
+ GST_STREAM_STATUS_TYPE_LEAVE, GST_ELEMENT_CAST (sink));
+ gst_message_set_stream_status_object (message, &val);
+ GST_DEBUG_OBJECT (sink, "posting LEAVE stream status");
+ gst_element_post_message (GST_ELEMENT_CAST (sink), message);
+ return;
+ }
+}
+
+static void
+gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
+ GstAudioRingBufferClass * g_class)
+{
+ ringbuffer->running = FALSE;
+ ringbuffer->queuedseg = 0;
+
+ ringbuffer->cond = g_cond_new ();
+}
+
+static void
+gst_audioringbuffer_dispose (GObject * object)
+{
+ G_OBJECT_CLASS (ring_parent_class)->dispose (object);
+}
+
+static void
+gst_audioringbuffer_finalize (GObject * object)
+{
+ GstAudioRingBuffer *ringbuffer = GST_AUDIORING_BUFFER_CAST (object);
+
+ g_cond_free (ringbuffer->cond);
+
+ G_OBJECT_CLASS (ring_parent_class)->finalize (object);
+}
+
+static gboolean
+gst_audioringbuffer_open_device (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ gboolean result = TRUE;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ if (csink->open)
+ result = csink->open (sink);
+
+ if (!result)
+ goto could_not_open;
+
+ return result;
+
+could_not_open:
+ {
+ GST_DEBUG_OBJECT (sink, "could not open device");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_close_device (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ gboolean result = TRUE;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ if (csink->close)
+ result = csink->close (sink);
+
+ if (!result)
+ goto could_not_close;
+
+ return result;
+
+could_not_close:
+ {
+ GST_DEBUG_OBJECT (sink, "could not close device");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ gboolean result = FALSE;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ if (csink->prepare)
+ result = csink->prepare (sink, spec);
+ if (!result)
+ goto could_not_prepare;
+
+ /* set latency to one more segment as we need some headroom */
+ spec->seglatency = spec->segtotal + 1;
+
+ buf->size = spec->segtotal * spec->segsize;
+ buf->memory = g_malloc0 (buf->size);
+
+ return TRUE;
+
+ /* ERRORS */
+could_not_prepare:
+ {
+ GST_DEBUG_OBJECT (sink, "could not prepare device");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_activate (GstRingBuffer * buf, gboolean active)
+{
+ GstAudioSink *sink;
+ GstAudioRingBuffer *abuf;
+ GError *error = NULL;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ abuf = GST_AUDIORING_BUFFER_CAST (buf);
+
+ if (active) {
+ abuf->running = TRUE;
+
+ GST_DEBUG_OBJECT (sink, "starting thread");
+ sink->thread =
+ g_thread_create ((GThreadFunc) audioringbuffer_thread_func, buf, TRUE,
+ &error);
+ if (!sink->thread || error != NULL)
+ goto thread_failed;
+
+ GST_DEBUG_OBJECT (sink, "waiting for thread");
+ /* the object lock is taken */
+ GST_AUDIORING_BUFFER_WAIT (buf);
+ GST_DEBUG_OBJECT (sink, "thread is started");
+ } else {
+ abuf->running = FALSE;
+ GST_DEBUG_OBJECT (sink, "signal wait");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+
+ GST_OBJECT_UNLOCK (buf);
+
+ /* join the thread */
+ g_thread_join (sink->thread);
+
+ GST_OBJECT_LOCK (buf);
+ }
+ return TRUE;
+
+ /* ERRORS */
+thread_failed:
+ {
+ if (error)
+ GST_ERROR_OBJECT (sink, "could not create thread %s", error->message);
+ else
+ GST_ERROR_OBJECT (sink, "could not create thread for unknown reason");
+ return FALSE;
+ }
+}
+
+/* function is called with LOCK */
+static gboolean
+gst_audioringbuffer_release (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ gboolean result = FALSE;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ /* free the buffer */
+ g_free (buf->memory);
+ buf->memory = NULL;
+
+ if (csink->unprepare)
+ result = csink->unprepare (sink);
+
+ if (!result)
+ goto could_not_unprepare;
+
+ GST_DEBUG_OBJECT (sink, "unprepared");
+
+ return result;
+
+could_not_unprepare:
+ {
+ GST_DEBUG_OBJECT (sink, "could not unprepare device");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_start (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+
+ GST_DEBUG_OBJECT (sink, "start, sending signal");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+
+ return TRUE;
+}
+
+static gboolean
+gst_audioringbuffer_pause (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ /* unblock any pending writes to the audio device */
+ if (csink->reset) {
+ GST_DEBUG_OBJECT (sink, "reset...");
+ csink->reset (sink);
+ GST_DEBUG_OBJECT (sink, "reset done");
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_audioringbuffer_stop (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ /* unblock any pending writes to the audio device */
+ if (csink->reset) {
+ GST_DEBUG_OBJECT (sink, "reset...");
+ csink->reset (sink);
+ GST_DEBUG_OBJECT (sink, "reset done");
+ }
+#if 0
+ if (abuf->running) {
+ GST_DEBUG_OBJECT (sink, "stop, waiting...");
+ GST_AUDIORING_BUFFER_WAIT (buf);
+ GST_DEBUG_OBJECT (sink, "stopped");
+ }
+#endif
+
+ return TRUE;
+}
+
+static guint
+gst_audioringbuffer_delay (GstRingBuffer * buf)
+{
+ GstAudioSink *sink;
+ GstAudioSinkClass *csink;
+ guint res = 0;
+
+ sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
+ csink = GST_AUDIO_SINK_GET_CLASS (sink);
+
+ if (csink->delay)
+ res = csink->delay (sink);
+
+ return res;
+}
+
+/* AudioSink signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+};
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_audio_sink_debug, "audiosink", 0, "audiosink element");
+#define gst_audio_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAudioSink, gst_audio_sink,
+ GST_TYPE_BASE_AUDIO_SINK, _do_init);
+
+static GstRingBuffer *gst_audio_sink_create_ringbuffer (GstBaseAudioSink *
+ sink);
+
+static void
+gst_audio_sink_class_init (GstAudioSinkClass * klass)
+{
+ GstBaseAudioSinkClass *gstbaseaudiosink_class;
+
+ gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass;
+
+ gstbaseaudiosink_class->create_ringbuffer =
+ GST_DEBUG_FUNCPTR (gst_audio_sink_create_ringbuffer);
+
+ g_type_class_ref (GST_TYPE_AUDIORING_BUFFER);
+}
+
+static void
+gst_audio_sink_init (GstAudioSink * audiosink)
+{
+}
+
+static GstRingBuffer *
+gst_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
+{
+ GstRingBuffer *buffer;
+
+ GST_DEBUG_OBJECT (sink, "creating ringbuffer");
+ buffer = g_object_new (GST_TYPE_AUDIORING_BUFFER, NULL);
+ GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer);
+
+ return buffer;
+}
diff --git a/gst-libs/gst/audio/gstaudiosink.h b/gst-libs/gst/audio/gstaudiosink.h
new file mode 100644
index 0000000..71fe5e4
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiosink.h
@@ -0,0 +1,100 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstaudiosink.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_AUDIO_SINK_H__
+#define __GST_AUDIO_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstbaseaudiosink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_SINK (gst_audio_sink_get_type())
+#define GST_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_SINK,GstAudioSink))
+#define GST_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_SINK,GstAudioSinkClass))
+#define GST_AUDIO_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_AUDIO_SINK,GstAudioSinkClass))
+#define GST_IS_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_SINK))
+#define GST_IS_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_SINK))
+
+typedef struct _GstAudioSink GstAudioSink;
+typedef struct _GstAudioSinkClass GstAudioSinkClass;
+
+/**
+ * GstAudioSink:
+ *
+ * Opaque #GstAudioSink.
+ */
+struct _GstAudioSink {
+ GstBaseAudioSink element;
+
+ /*< private >*/ /* with LOCK */
+ GThread *thread;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstAudioSinkClass:
+ * @parent_class: the parent class structure.
+ * @open: Open the device. No configuration needs to be done at this point.
+ * This function is also used to check if the device is available.
+ * @prepare: Prepare the device to operate with the specified parameters.
+ * @unprepare: Undo operations done in prepare.
+ * @close: Close the device.
+ * @write: Write data to the device.
+ * @delay: Return how many samples are still in the device. This is used to
+ * drive the synchronisation.
+ * @reset: Returns as quickly as possible from a write and flush any pending
+ * samples from the device.
+ *
+ * #GstAudioSink class. Override the vmethods to implement functionality.
+ */
+struct _GstAudioSinkClass {
+ GstBaseAudioSinkClass parent_class;
+
+ /* vtable */
+
+ /* open the device with given specs */
+ gboolean (*open) (GstAudioSink *sink);
+ /* prepare resources and state to operate with the given specs */
+ gboolean (*prepare) (GstAudioSink *sink, GstRingBufferSpec *spec);
+ /* undo anything that was done in prepare() */
+ gboolean (*unprepare) (GstAudioSink *sink);
+ /* close the device */
+ gboolean (*close) (GstAudioSink *sink);
+ /* write samples to the device */
+ gint (*write) (GstAudioSink *sink, gpointer data, guint length);
+ /* get number of samples queued in the device */
+ guint (*delay) (GstAudioSink *sink);
+ /* reset the audio device, unblock from a write */
+ void (*reset) (GstAudioSink *sink);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_audio_sink_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_SINK_H__ */
diff --git a/gst-libs/gst/audio/gstaudiosrc.c b/gst-libs/gst/audio/gstaudiosrc.c
new file mode 100644
index 0000000..57864d1
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiosrc.c
@@ -0,0 +1,527 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstaudiosrc.c: simple audio src base 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.
+ */
+
+/**
+ * SECTION:gstaudiosrc
+ * @short_description: Simple base class for audio sources
+ * @see_also: #GstBaseAudioSrc, #GstRingBuffer, #GstAudioSrc.
+ *
+ * This is the most simple base class for audio sources that only requires
+ * subclasses to implement a set of simple functions:
+ *
+ * <variablelist>
+ * <varlistentry>
+ * <term>open()</term>
+ * <listitem><para>Open the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>prepare()</term>
+ * <listitem><para>Configure the device with the specified format.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>read()</term>
+ * <listitem><para>Read samples from the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>reset()</term>
+ * <listitem><para>Unblock reads and flush the device.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>delay()</term>
+ * <listitem><para>Get the number of samples in the device but not yet read.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>unprepare()</term>
+ * <listitem><para>Undo operations done by prepare.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>close()</term>
+ * <listitem><para>Close the device.</para></listitem>
+ * </varlistentry>
+ * </variablelist>
+ *
+ * All scheduling of samples and timestamps is done in this base class
+ * together with #GstBaseAudioSrc using a default implementation of a
+ * #GstRingBuffer that uses threads.
+ *
+ * Last reviewed on 2006-09-27 (0.10.12)
+ */
+
+#include <string.h>
+
+#include "gstaudiosrc.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_audio_src_debug);
+#define GST_CAT_DEFAULT gst_audio_src_debug
+
+#define GST_TYPE_AUDIORING_BUFFER \
+ (gst_audioringbuffer_get_type())
+#define GST_AUDIORING_BUFFER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBuffer))
+#define GST_AUDIORING_BUFFER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIORING_BUFFER,GstAudioRingBufferClass))
+#define GST_AUDIORING_BUFFER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIORING_BUFFER, GstAudioRingBufferClass))
+#define GST_IS_AUDIORING_BUFFER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIORING_BUFFER))
+#define GST_IS_AUDIORING_BUFFER_CLASS(klass)\
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIORING_BUFFER))
+
+typedef struct _GstAudioRingBuffer GstAudioRingBuffer;
+typedef struct _GstAudioRingBufferClass GstAudioRingBufferClass;
+
+#define GST_AUDIORING_BUFFER_GET_COND(buf) (((GstAudioRingBuffer *)buf)->cond)
+#define GST_AUDIORING_BUFFER_WAIT(buf) (g_cond_wait (GST_AUDIORING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
+#define GST_AUDIORING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_AUDIORING_BUFFER_GET_COND (buf)))
+#define GST_AUDIORING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIORING_BUFFER_GET_COND (buf)))
+
+struct _GstAudioRingBuffer
+{
+ GstRingBuffer object;
+
+ gboolean running;
+ gint queuedseg;
+
+ GCond *cond;
+};
+
+struct _GstAudioRingBufferClass
+{
+ GstRingBufferClass parent_class;
+};
+
+static void gst_audioringbuffer_class_init (GstAudioRingBufferClass * klass);
+static void gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
+ GstAudioRingBufferClass * klass);
+static void gst_audioringbuffer_dispose (GObject * object);
+static void gst_audioringbuffer_finalize (GObject * object);
+
+static GstRingBufferClass *ring_parent_class = NULL;
+
+static gboolean gst_audioringbuffer_open_device (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_close_device (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_acquire (GstRingBuffer * buf,
+ GstRingBufferSpec * spec);
+static gboolean gst_audioringbuffer_release (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_start (GstRingBuffer * buf);
+static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf);
+static guint gst_audioringbuffer_delay (GstRingBuffer * buf);
+
+/* ringbuffer abstract base class */
+static GType
+gst_audioringbuffer_get_type (void)
+{
+ static GType ringbuffer_type = 0;
+
+ if (!ringbuffer_type) {
+ static const GTypeInfo ringbuffer_info = {
+ sizeof (GstAudioRingBufferClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_audioringbuffer_class_init,
+ NULL,
+ NULL,
+ sizeof (GstAudioRingBuffer),
+ 0,
+ (GInstanceInitFunc) gst_audioringbuffer_init,
+ NULL
+ };
+
+ ringbuffer_type =
+ g_type_register_static (GST_TYPE_RING_BUFFER, "GstAudioSrcRingBuffer",
+ &ringbuffer_info, 0);
+ }
+ return ringbuffer_type;
+}
+
+static void
+gst_audioringbuffer_class_init (GstAudioRingBufferClass * 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->dispose = gst_audioringbuffer_dispose;
+ gobject_class->finalize = gst_audioringbuffer_finalize;
+
+ gstringbuffer_class->open_device =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_open_device);
+ gstringbuffer_class->close_device =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_close_device);
+ gstringbuffer_class->acquire =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_acquire);
+ gstringbuffer_class->release =
+ GST_DEBUG_FUNCPTR (gst_audioringbuffer_release);
+ gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
+ gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start);
+ gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_audioringbuffer_stop);
+
+ gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_audioringbuffer_delay);
+}
+
+typedef guint (*ReadFunc) (GstAudioSrc * src, gpointer data, guint length);
+
+/* this internal thread does nothing else but read samples from the audio device.
+ * It will read each segment in the ringbuffer and will update the play
+ * pointer.
+ * The start/stop methods control the thread.
+ */
+static void
+audioringbuffer_thread_func (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER (buf);
+ ReadFunc readfunc;
+ GstMessage *message;
+ GValue val = { 0 };
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ GST_DEBUG_OBJECT (src, "enter thread");
+
+ readfunc = csrc->read;
+ if (readfunc == NULL)
+ goto no_function;
+
+ /* FIXME: maybe we should at least use a custom pointer type here? */
+ g_value_init (&val, G_TYPE_POINTER);
+ g_value_set_pointer (&val, src->thread);
+ message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
+ GST_STREAM_STATUS_TYPE_ENTER, GST_ELEMENT_CAST (src));
+ gst_message_set_stream_status_object (message, &val);
+ GST_DEBUG_OBJECT (src, "posting ENTER stream status");
+ gst_element_post_message (GST_ELEMENT_CAST (src), message);
+
+ while (TRUE) {
+ gint left, len;
+ guint8 *readptr;
+ gint readseg;
+
+ if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
+ gint read;
+
+ left = len;
+ do {
+ read = readfunc (src, readptr, left);
+ GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
+ left, readseg);
+ if (read < 0 || read > left) {
+ GST_WARNING_OBJECT (src,
+ "error reading data %d (reason: %s), skipping segment", read,
+ g_strerror (errno));
+ break;
+ }
+ left -= read;
+ readptr += read;
+ } while (left > 0);
+
+ /* we read one segment */
+ gst_ring_buffer_advance (buf, 1);
+ } else {
+ GST_OBJECT_LOCK (abuf);
+ if (!abuf->running)
+ goto stop_running;
+ GST_DEBUG_OBJECT (src, "signal wait");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+ GST_DEBUG_OBJECT (src, "wait for action");
+ GST_AUDIORING_BUFFER_WAIT (buf);
+ GST_DEBUG_OBJECT (src, "got signal");
+ if (!abuf->running)
+ goto stop_running;
+ GST_DEBUG_OBJECT (src, "continue running");
+ GST_OBJECT_UNLOCK (abuf);
+ }
+ }
+
+ /* Will never be reached */
+ g_assert_not_reached ();
+ return;
+
+ /* ERROR */
+no_function:
+ {
+ GST_DEBUG ("no write function, exit thread");
+ return;
+ }
+stop_running:
+ {
+ GST_OBJECT_UNLOCK (abuf);
+ GST_DEBUG ("stop running, exit thread");
+ message = gst_message_new_stream_status (GST_OBJECT_CAST (buf),
+ GST_STREAM_STATUS_TYPE_LEAVE, GST_ELEMENT_CAST (src));
+ gst_message_set_stream_status_object (message, &val);
+ GST_DEBUG_OBJECT (src, "posting LEAVE stream status");
+ gst_element_post_message (GST_ELEMENT_CAST (src), message);
+ return;
+ }
+}
+
+static void
+gst_audioringbuffer_init (GstAudioRingBuffer * ringbuffer,
+ GstAudioRingBufferClass * g_class)
+{
+ ringbuffer->running = FALSE;
+ ringbuffer->queuedseg = 0;
+
+ ringbuffer->cond = g_cond_new ();
+}
+
+static void
+gst_audioringbuffer_dispose (GObject * object)
+{
+ GstAudioRingBuffer *ringbuffer = GST_AUDIORING_BUFFER (object);
+
+ if (ringbuffer->cond) {
+ g_cond_free (ringbuffer->cond);
+ ringbuffer->cond = NULL;
+ }
+
+ G_OBJECT_CLASS (ring_parent_class)->dispose (object);
+}
+
+static void
+gst_audioringbuffer_finalize (GObject * object)
+{
+ G_OBJECT_CLASS (ring_parent_class)->finalize (object);
+}
+
+static gboolean
+gst_audioringbuffer_open_device (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ gboolean result = TRUE;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ if (csrc->open)
+ result = csrc->open (src);
+
+ if (!result)
+ goto could_not_open;
+
+ return result;
+
+could_not_open:
+ {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_close_device (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ gboolean result = TRUE;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ if (csrc->close)
+ result = csrc->close (src);
+
+ if (!result)
+ goto could_not_open;
+
+ return result;
+
+could_not_open:
+ {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audioringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ GstAudioRingBuffer *abuf;
+ gboolean result = FALSE;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ if (csrc->prepare)
+ result = csrc->prepare (src, spec);
+
+ if (!result)
+ goto could_not_open;
+
+ buf->size = spec->segtotal * spec->segsize;
+ buf->memory = g_malloc0 (buf->size);
+
+ abuf = GST_AUDIORING_BUFFER (buf);
+ abuf->running = TRUE;
+
+ src->thread =
+ g_thread_create ((GThreadFunc) audioringbuffer_thread_func, buf, TRUE,
+ NULL);
+ GST_AUDIORING_BUFFER_WAIT (buf);
+
+ return result;
+
+could_not_open:
+ {
+ return FALSE;
+ }
+}
+
+/* function is called with LOCK */
+static gboolean
+gst_audioringbuffer_release (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ GstAudioRingBuffer *abuf;
+ gboolean result = FALSE;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+ abuf = GST_AUDIORING_BUFFER (buf);
+
+ abuf->running = FALSE;
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+ GST_OBJECT_UNLOCK (buf);
+
+ /* join the thread */
+ g_thread_join (src->thread);
+
+ GST_OBJECT_LOCK (buf);
+
+ /* free the buffer */
+ g_free (buf->memory);
+ buf->memory = NULL;
+
+ if (csrc->unprepare)
+ result = csrc->unprepare (src);
+
+ return result;
+}
+
+static gboolean
+gst_audioringbuffer_start (GstRingBuffer * buf)
+{
+ GST_DEBUG ("start, sending signal");
+ GST_AUDIORING_BUFFER_SIGNAL (buf);
+
+ return TRUE;
+}
+
+static gboolean
+gst_audioringbuffer_stop (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ /* unblock any pending writes to the audio device */
+ if (csrc->reset) {
+ GST_DEBUG ("reset...");
+ csrc->reset (src);
+ GST_DEBUG ("reset done");
+ }
+#if 0
+ GST_DEBUG ("stop, waiting...");
+ GST_AUDIORING_BUFFER_WAIT (buf);
+ GST_DEBUG ("stoped");
+#endif
+
+ return TRUE;
+}
+
+static guint
+gst_audioringbuffer_delay (GstRingBuffer * buf)
+{
+ GstAudioSrc *src;
+ GstAudioSrcClass *csrc;
+ guint res = 0;
+
+ src = GST_AUDIO_SRC (GST_OBJECT_PARENT (buf));
+ csrc = GST_AUDIO_SRC_GET_CLASS (src);
+
+ if (csrc->delay)
+ res = csrc->delay (src);
+
+ return res;
+}
+
+/* AudioSrc signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+};
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_audio_src_debug, "audiosrc", 0, "audiosrc element");
+#define gst_audio_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAudioSrc, gst_audio_src,
+ GST_TYPE_BASE_AUDIO_SRC, _do_init);
+
+static GstRingBuffer *gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src);
+
+static void
+gst_audio_src_class_init (GstAudioSrcClass * klass)
+{
+ GstBaseAudioSrcClass *gstbaseaudiosrc_class;
+
+ gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
+
+ gstbaseaudiosrc_class->create_ringbuffer =
+ GST_DEBUG_FUNCPTR (gst_audio_src_create_ringbuffer);
+
+ g_type_class_ref (GST_TYPE_AUDIORING_BUFFER);
+}
+
+static void
+gst_audio_src_init (GstAudioSrc * audiosrc)
+{
+}
+
+static GstRingBuffer *
+gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
+{
+ GstRingBuffer *buffer;
+
+ GST_DEBUG ("creating ringbuffer");
+ buffer = g_object_new (GST_TYPE_AUDIORING_BUFFER, NULL);
+ GST_DEBUG ("created ringbuffer @%p", buffer);
+
+ return buffer;
+}
diff --git a/gst-libs/gst/audio/gstaudiosrc.h b/gst-libs/gst/audio/gstaudiosrc.h
new file mode 100644
index 0000000..3caa98e
--- /dev/null
+++ b/gst-libs/gst/audio/gstaudiosrc.h
@@ -0,0 +1,98 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstaudiosrc.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_AUDIO_SRC_H__
+#define __GST_AUDIO_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstbaseaudiosrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_SRC (gst_audio_src_get_type())
+#define GST_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_SRC,GstAudioSrc))
+#define GST_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_SRC,GstAudioSrcClass))
+#define GST_AUDIO_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_AUDIO_SRC,GstAudioSrcClass))
+#define GST_IS_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_SRC))
+#define GST_IS_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_SRC))
+
+typedef struct _GstAudioSrc GstAudioSrc;
+typedef struct _GstAudioSrcClass GstAudioSrcClass;
+
+/**
+ * GstAudioSrc:
+ *
+ * Base class for simple audio sources.
+ */
+struct _GstAudioSrc {
+ GstBaseAudioSrc element;
+
+ /*< private >*/ /* with LOCK */
+ GThread *thread;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstAudioSrcClass:
+ * @parent_class: the parent class.
+ * @open: open the device with the specified caps
+ * @prepare: configure device with format
+ * @unprepare: undo the configuration
+ * @close: close the device
+ * @read: read samples to the audio device
+ * @delay: the number of samples queued in the device
+ * @reset: unblock a read to the device and reset.
+ *
+ * #GstAudioSrc class. Override the vmethod to implement
+ * functionality.
+ */
+struct _GstAudioSrcClass {
+ GstBaseAudioSrcClass parent_class;
+
+ /* vtable */
+
+ /* open the device with given specs */
+ gboolean (*open) (GstAudioSrc *src);
+ /* prepare resources and state to operate with the given specs */
+ gboolean (*prepare) (GstAudioSrc *src, GstRingBufferSpec *spec);
+ /* undo anything that was done in prepare() */
+ gboolean (*unprepare) (GstAudioSrc *src);
+ /* close the device */
+ gboolean (*close) (GstAudioSrc *src);
+ /* read samples from the device */
+ guint (*read) (GstAudioSrc *src, gpointer data, guint length);
+ /* get number of samples queued in the device */
+ guint (*delay) (GstAudioSrc *src);
+ /* reset the audio device, unblock from a write */
+ void (*reset) (GstAudioSrc *src);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_audio_src_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_SRC_H__ */
diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c
new file mode 100644
index 0000000..45b66a6
--- /dev/null
+++ b/gst-libs/gst/audio/gstbaseaudiosink.c
@@ -0,0 +1,2039 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbaseaudiosink.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:gstbaseaudiosink
+ * @short_description: Base class for audio sinks
+ * @see_also: #GstAudioSink, #GstRingBuffer.
+ *
+ * This is the base class for audio sinks. Subclasses need to implement the
+ * ::create_ringbuffer vmethod. This base class will then take care of
+ * writing samples to the ringbuffer, synchronisation, clipping and flushing.
+ *
+ * Last reviewed on 2006-09-27 (0.10.12)
+ */
+
+#include <string.h>
+
+#include "gstbaseaudiosink.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_audio_sink_debug);
+#define GST_CAT_DEFAULT gst_base_audio_sink_debug
+
+#define GST_BASE_AUDIO_SINK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_AUDIO_SINK, GstBaseAudioSinkPrivate))
+
+struct _GstBaseAudioSinkPrivate
+{
+ /* upstream latency */
+ GstClockTime us_latency;
+ /* the clock slaving algorithm in use */
+ GstBaseAudioSinkSlaveMethod slave_method;
+ /* running average of clock skew */
+ GstClockTimeDiff avg_skew;
+ /* the number of samples we aligned last time */
+ gint64 last_align;
+
+ gboolean sync_latency;
+
+ GstClockTime eos_time;
+
+ /* number of microseconds we alow timestamps or clock slaving to drift
+ * before resyncing */
+ guint64 drift_tolerance;
+};
+
+/* BaseAudioSink signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+/* FIXME: 0.11, store the buffer_time and latency_time in nanoseconds */
+#define DEFAULT_BUFFER_TIME ((200 * GST_MSECOND) / GST_USECOND)
+#define DEFAULT_LATENCY_TIME ((10 * GST_MSECOND) / GST_USECOND)
+#define DEFAULT_PROVIDE_CLOCK TRUE
+#define DEFAULT_SLAVE_METHOD GST_BASE_AUDIO_SINK_SLAVE_SKEW
+
+/* FIXME, enable pull mode when clock slaving and trick modes are figured out */
+#define DEFAULT_CAN_ACTIVATE_PULL FALSE
+
+/* when timestamps or clock slaving drift for more than 40ms we resync. This is
+ * a reasonable default */
+#define DEFAULT_DRIFT_TOLERANCE ((40 * GST_MSECOND) / GST_USECOND)
+
+enum
+{
+ PROP_0,
+
+ PROP_BUFFER_TIME,
+ PROP_LATENCY_TIME,
+ PROP_PROVIDE_CLOCK,
+ PROP_SLAVE_METHOD,
+ PROP_CAN_ACTIVATE_PULL,
+ PROP_DRIFT_TOLERANCE,
+
+ PROP_LAST
+};
+
+GType
+gst_base_audio_sink_slave_method_get_type (void)
+{
+ static volatile gsize slave_method_type = 0;
+ static const GEnumValue slave_method[] = {
+ {GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, "GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE",
+ "resample"},
+ {GST_BASE_AUDIO_SINK_SLAVE_SKEW, "GST_BASE_AUDIO_SINK_SLAVE_SKEW", "skew"},
+ {GST_BASE_AUDIO_SINK_SLAVE_NONE, "GST_BASE_AUDIO_SINK_SLAVE_NONE", "none"},
+ {0, NULL, NULL},
+ };
+
+ if (g_once_init_enter (&slave_method_type)) {
+ GType tmp =
+ g_enum_register_static ("GstBaseAudioSinkSlaveMethod", slave_method);
+ g_once_init_leave (&slave_method_type, tmp);
+ }
+
+ return (GType) slave_method_type;
+}
+
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_base_audio_sink_debug, "baseaudiosink", 0, "baseaudiosink element");
+#define gst_base_audio_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstBaseAudioSink, gst_base_audio_sink,
+ GST_TYPE_BASE_SINK, _do_init);
+
+static void gst_base_audio_sink_dispose (GObject * object);
+
+static void gst_base_audio_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_audio_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+#if 0
+static GstStateChangeReturn gst_base_audio_sink_async_play (GstBaseSink *
+ basesink);
+#endif
+static GstStateChangeReturn gst_base_audio_sink_change_state (GstElement *
+ element, GstStateChange transition);
+static gboolean gst_base_audio_sink_activate_pull (GstBaseSink * basesink,
+ gboolean active);
+static gboolean gst_base_audio_sink_query (GstElement * element, GstQuery *
+ query);
+
+static GstClock *gst_base_audio_sink_provide_clock (GstElement * elem);
+static GstClockTime gst_base_audio_sink_get_time (GstClock * clock,
+ GstBaseAudioSink * sink);
+static void gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data,
+ guint len, gpointer user_data);
+
+static GstFlowReturn gst_base_audio_sink_preroll (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static GstFlowReturn gst_base_audio_sink_render (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static gboolean gst_base_audio_sink_event (GstBaseSink * bsink,
+ GstEvent * event);
+static void gst_base_audio_sink_get_times (GstBaseSink * bsink,
+ GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
+static gboolean gst_base_audio_sink_setcaps (GstBaseSink * bsink,
+ GstCaps * caps);
+static void gst_base_audio_sink_fixate (GstBaseSink * bsink, GstCaps * caps);
+
+static gboolean gst_base_audio_sink_query_pad (GstBaseSink * bsink,
+ GstQuery * query);
+
+
+/* static guint gst_base_audio_sink_signals[LAST_SIGNAL] = { 0 }; */
+
+static void
+gst_base_audio_sink_class_init (GstBaseAudioSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstBaseAudioSinkPrivate));
+
+ gobject_class->set_property = gst_base_audio_sink_set_property;
+ gobject_class->get_property = gst_base_audio_sink_get_property;
+ gobject_class->dispose = gst_base_audio_sink_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_BUFFER_TIME,
+ g_param_spec_int64 ("buffer-time", "Buffer Time",
+ "Size of audio buffer in microseconds", 1,
+ G_MAXINT64, DEFAULT_BUFFER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_LATENCY_TIME,
+ g_param_spec_int64 ("latency-time", "Latency Time",
+ "Audio latency in microseconds", 1,
+ G_MAXINT64, DEFAULT_LATENCY_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_PROVIDE_CLOCK,
+ g_param_spec_boolean ("provide-clock", "Provide Clock",
+ "Provide a clock to be used as the global pipeline clock",
+ DEFAULT_PROVIDE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SLAVE_METHOD,
+ g_param_spec_enum ("slave-method", "Slave Method",
+ "Algorithm to use to match the rate of the masterclock",
+ GST_TYPE_BASE_AUDIO_SINK_SLAVE_METHOD, DEFAULT_SLAVE_METHOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_CAN_ACTIVATE_PULL,
+ g_param_spec_boolean ("can-activate-pull", "Allow Pull Scheduling",
+ "Allow pull-based scheduling", DEFAULT_CAN_ACTIVATE_PULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseAudioSink:drift-tolerance
+ *
+ * Controls the amount of time in milliseconds that timestamps or clocks are allowed
+ * to drift before resynchronisation happens.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, PROP_DRIFT_TOLERANCE,
+ g_param_spec_int64 ("drift-tolerance", "Drift Tolerance",
+ "Tolerance for timestamp and clock drift in microseconds", 1,
+ G_MAXINT64, DEFAULT_DRIFT_TOLERANCE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_audio_sink_change_state);
+ gstelement_class->provide_clock =
+ GST_DEBUG_FUNCPTR (gst_base_audio_sink_provide_clock);
+ gstelement_class->query = GST_DEBUG_FUNCPTR (gst_base_audio_sink_query);
+
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_base_audio_sink_event);
+ gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_base_audio_sink_preroll);
+ gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_base_audio_sink_query_pad);
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_base_audio_sink_render);
+ gstbasesink_class->get_times =
+ GST_DEBUG_FUNCPTR (gst_base_audio_sink_get_times);
+ gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_base_audio_sink_setcaps);
+ gstbasesink_class->fixate = GST_DEBUG_FUNCPTR (gst_base_audio_sink_fixate);
+#if 0
+ gstbasesink_class->async_play =
+ GST_DEBUG_FUNCPTR (gst_base_audio_sink_async_play);
+#endif
+ gstbasesink_class->activate_pull =
+ GST_DEBUG_FUNCPTR (gst_base_audio_sink_activate_pull);
+
+ /* ref class from a thread-safe context to work around missing bit of
+ * thread-safety in GObject */
+ g_type_class_ref (GST_TYPE_AUDIO_CLOCK);
+ g_type_class_ref (GST_TYPE_RING_BUFFER);
+
+}
+
+static void
+gst_base_audio_sink_init (GstBaseAudioSink * baseaudiosink)
+{
+ GstBaseSink *basesink;
+
+ baseaudiosink->priv = GST_BASE_AUDIO_SINK_GET_PRIVATE (baseaudiosink);
+
+ baseaudiosink->buffer_time = DEFAULT_BUFFER_TIME;
+ baseaudiosink->latency_time = DEFAULT_LATENCY_TIME;
+ baseaudiosink->provide_clock = DEFAULT_PROVIDE_CLOCK;
+ baseaudiosink->priv->slave_method = DEFAULT_SLAVE_METHOD;
+ baseaudiosink->priv->drift_tolerance = DEFAULT_DRIFT_TOLERANCE;
+
+ baseaudiosink->provided_clock = gst_audio_clock_new ("GstAudioSinkClock",
+ (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time, baseaudiosink);
+
+ basesink = GST_BASE_SINK_CAST (baseaudiosink);
+ basesink->can_activate_push = TRUE;
+ basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
+
+ gst_base_sink_set_last_buffer_enabled (basesink, FALSE);
+}
+
+static void
+gst_base_audio_sink_dispose (GObject * object)
+{
+ GstBaseAudioSink *sink;
+
+ sink = GST_BASE_AUDIO_SINK (object);
+
+ if (sink->provided_clock) {
+ gst_audio_clock_invalidate (sink->provided_clock);
+ gst_object_unref (sink->provided_clock);
+ sink->provided_clock = NULL;
+ }
+
+ if (sink->ringbuffer) {
+ gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
+ sink->ringbuffer = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+
+static GstClock *
+gst_base_audio_sink_provide_clock (GstElement * elem)
+{
+ GstBaseAudioSink *sink;
+ GstClock *clock;
+
+ sink = GST_BASE_AUDIO_SINK (elem);
+
+ /* we have no ringbuffer (must be NULL state) */
+ if (sink->ringbuffer == NULL)
+ goto wrong_state;
+
+ if (!gst_ring_buffer_is_acquired (sink->ringbuffer))
+ goto wrong_state;
+
+ GST_OBJECT_LOCK (sink);
+ if (!sink->provide_clock)
+ goto clock_disabled;
+
+ clock = GST_CLOCK_CAST (gst_object_ref (sink->provided_clock));
+ GST_OBJECT_UNLOCK (sink);
+
+ return clock;
+
+ /* ERRORS */
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (sink, "ringbuffer not acquired");
+ return NULL;
+ }
+clock_disabled:
+ {
+ GST_DEBUG_OBJECT (sink, "clock provide disabled");
+ GST_OBJECT_UNLOCK (sink);
+ return NULL;
+ }
+}
+
+static gboolean
+gst_base_audio_sink_query_pad (GstBaseSink * bsink, GstQuery * query)
+{
+ gboolean res = FALSE;
+ GstBaseAudioSink *basesink;
+
+ basesink = GST_BASE_AUDIO_SINK (bsink);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ GST_LOG_OBJECT (basesink, "query convert");
+
+ if (basesink->ringbuffer) {
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL);
+ res = gst_ring_buffer_convert (basesink->ringbuffer, 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:
+ res = GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_base_audio_sink_query (GstElement * element, GstQuery * query)
+{
+ gboolean res = FALSE;
+ GstBaseAudioSink *basesink;
+
+ basesink = GST_BASE_AUDIO_SINK (element);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ gboolean live, us_live;
+ GstClockTime min_l, max_l;
+
+ GST_DEBUG_OBJECT (basesink, "latency query");
+
+ /* ask parent first, it will do an upstream query for us. */
+ if ((res =
+ gst_base_sink_query_latency (GST_BASE_SINK_CAST (basesink), &live,
+ &us_live, &min_l, &max_l))) {
+ GstClockTime base_latency, min_latency, max_latency;
+
+ /* we and upstream are both live, adjust the min_latency */
+ if (live && us_live) {
+ GstRingBufferSpec *spec;
+
+ GST_OBJECT_LOCK (basesink);
+ if (!basesink->ringbuffer || !basesink->ringbuffer->spec.info.rate) {
+ GST_OBJECT_UNLOCK (basesink);
+
+ GST_DEBUG_OBJECT (basesink,
+ "we are not yet negotiated, can't report latency yet");
+ res = FALSE;
+ goto done;
+ }
+ spec = &basesink->ringbuffer->spec;
+
+ basesink->priv->us_latency = min_l;
+
+ base_latency =
+ gst_util_uint64_scale_int (spec->seglatency * spec->segsize,
+ GST_SECOND, spec->info.rate * spec->info.bpf);
+ GST_OBJECT_UNLOCK (basesink);
+
+ /* we cannot go lower than the buffer size and the min peer latency */
+ min_latency = base_latency + min_l;
+ /* the max latency is the max of the peer, we can delay an infinite
+ * amount of time. */
+ max_latency = (max_l == -1) ? -1 : (base_latency + max_l);
+
+ GST_DEBUG_OBJECT (basesink,
+ "peer min %" GST_TIME_FORMAT ", our min latency: %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (min_l),
+ GST_TIME_ARGS (min_latency));
+ GST_DEBUG_OBJECT (basesink,
+ "peer max %" GST_TIME_FORMAT ", our max latency: %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (max_l),
+ GST_TIME_ARGS (max_latency));
+ } else {
+ GST_DEBUG_OBJECT (basesink,
+ "peer or we are not live, don't care about latency");
+ min_latency = min_l;
+ max_latency = max_l;
+ }
+ gst_query_set_latency (query, live, min_latency, max_latency);
+ }
+ break;
+ }
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_fmt, dest_fmt;
+ gint64 src_val, dest_val;
+
+ GST_LOG_OBJECT (basesink, "query convert");
+
+ if (basesink->ringbuffer) {
+ gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL);
+ res = gst_ring_buffer_convert (basesink->ringbuffer, 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:
+ res = GST_ELEMENT_CLASS (parent_class)->query (element, query);
+ break;
+ }
+
+done:
+ return res;
+}
+
+
+static GstClockTime
+gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink)
+{
+ guint64 raw, samples;
+ guint delay;
+ GstClockTime result;
+
+ if (sink->ringbuffer == NULL || sink->ringbuffer->spec.info.rate == 0)
+ return GST_CLOCK_TIME_NONE;
+
+ /* our processed samples are always increasing */
+ raw = samples = gst_ring_buffer_samples_done (sink->ringbuffer);
+
+ /* the number of samples not yet processed, this is still queued in the
+ * device (not played for playback). */
+ delay = gst_ring_buffer_delay (sink->ringbuffer);
+
+ if (G_LIKELY (samples >= delay))
+ samples -= delay;
+ else
+ samples = 0;
+
+ result = gst_util_uint64_scale_int (samples, GST_SECOND,
+ sink->ringbuffer->spec.info.rate);
+
+ GST_DEBUG_OBJECT (sink,
+ "processed samples: raw %" G_GUINT64_FORMAT ", delay %u, real %"
+ G_GUINT64_FORMAT ", time %" GST_TIME_FORMAT,
+ raw, delay, samples, GST_TIME_ARGS (result));
+
+ return result;
+}
+
+/**
+ * gst_base_audio_sink_set_provide_clock:
+ * @sink: a #GstBaseAudioSink
+ * @provide: new state
+ *
+ * Controls whether @sink will provide a clock or not. If @provide is %TRUE,
+ * gst_element_provide_clock() will return a clock that reflects the datarate
+ * of @sink. If @provide is %FALSE, gst_element_provide_clock() will return NULL.
+ *
+ * Since: 0.10.16
+ */
+void
+gst_base_audio_sink_set_provide_clock (GstBaseAudioSink * sink,
+ gboolean provide)
+{
+ g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->provide_clock = provide;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_audio_sink_get_provide_clock:
+ * @sink: a #GstBaseAudioSink
+ *
+ * Queries whether @sink will provide a clock or not. See also
+ * gst_base_audio_sink_set_provide_clock.
+ *
+ * Returns: %TRUE if @sink will provide a clock.
+ *
+ * Since: 0.10.16
+ */
+gboolean
+gst_base_audio_sink_get_provide_clock (GstBaseAudioSink * sink)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), FALSE);
+
+ GST_OBJECT_LOCK (sink);
+ result = sink->provide_clock;
+ GST_OBJECT_UNLOCK (sink);
+
+ return result;
+}
+
+/**
+ * gst_base_audio_sink_set_slave_method:
+ * @sink: a #GstBaseAudioSink
+ * @method: the new slave method
+ *
+ * Controls how clock slaving will be performed in @sink.
+ *
+ * Since: 0.10.16
+ */
+void
+gst_base_audio_sink_set_slave_method (GstBaseAudioSink * sink,
+ GstBaseAudioSinkSlaveMethod method)
+{
+ g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->slave_method = method;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_audio_sink_get_slave_method:
+ * @sink: a #GstBaseAudioSink
+ *
+ * Get the current slave method used by @sink.
+ *
+ * Returns: The current slave method used by @sink.
+ *
+ * Since: 0.10.16
+ */
+GstBaseAudioSinkSlaveMethod
+gst_base_audio_sink_get_slave_method (GstBaseAudioSink * sink)
+{
+ GstBaseAudioSinkSlaveMethod result;
+
+ g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), -1);
+
+ GST_OBJECT_LOCK (sink);
+ result = sink->priv->slave_method;
+ GST_OBJECT_UNLOCK (sink);
+
+ return result;
+}
+
+
+/**
+ * gst_base_audio_sink_set_drift_tolerance:
+ * @sink: a #GstBaseAudioSink
+ * @drift_tolerance: the new drift tolerance in microseconds
+ *
+ * Controls the sink's drift tolerance.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_base_audio_sink_set_drift_tolerance (GstBaseAudioSink * sink,
+ gint64 drift_tolerance)
+{
+ g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->drift_tolerance = drift_tolerance;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_audio_sink_get_drift_tolerance
+ * @sink: a #GstBaseAudioSink
+ *
+ * Get the current drift tolerance, in microseconds, used by @sink.
+ *
+ * Returns: The current drift tolerance used by @sink.
+ *
+ * Since: 0.10.31
+ */
+gint64
+gst_base_audio_sink_get_drift_tolerance (GstBaseAudioSink * sink)
+{
+ gint64 result;
+
+ g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), -1);
+
+ GST_OBJECT_LOCK (sink);
+ result = sink->priv->drift_tolerance;
+ GST_OBJECT_UNLOCK (sink);
+
+ return result;
+}
+
+static void
+gst_base_audio_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseAudioSink *sink;
+
+ sink = GST_BASE_AUDIO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_TIME:
+ sink->buffer_time = g_value_get_int64 (value);
+ break;
+ case PROP_LATENCY_TIME:
+ sink->latency_time = g_value_get_int64 (value);
+ break;
+ case PROP_PROVIDE_CLOCK:
+ gst_base_audio_sink_set_provide_clock (sink, g_value_get_boolean (value));
+ break;
+ case PROP_SLAVE_METHOD:
+ gst_base_audio_sink_set_slave_method (sink, g_value_get_enum (value));
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ GST_BASE_SINK (sink)->can_activate_pull = g_value_get_boolean (value);
+ break;
+ case PROP_DRIFT_TOLERANCE:
+ gst_base_audio_sink_set_drift_tolerance (sink, g_value_get_int64 (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_audio_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBaseAudioSink *sink;
+
+ sink = GST_BASE_AUDIO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_TIME:
+ g_value_set_int64 (value, sink->buffer_time);
+ break;
+ case PROP_LATENCY_TIME:
+ g_value_set_int64 (value, sink->latency_time);
+ break;
+ case PROP_PROVIDE_CLOCK:
+ g_value_set_boolean (value, gst_base_audio_sink_get_provide_clock (sink));
+ break;
+ case PROP_SLAVE_METHOD:
+ g_value_set_enum (value, gst_base_audio_sink_get_slave_method (sink));
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ g_value_set_boolean (value, GST_BASE_SINK (sink)->can_activate_pull);
+ break;
+ case PROP_DRIFT_TOLERANCE:
+ g_value_set_int64 (value, gst_base_audio_sink_get_drift_tolerance (sink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
+ GstRingBufferSpec *spec;
+ GstClockTime now;
+ GstClockTime crate_num, crate_denom;
+
+ if (!sink->ringbuffer)
+ return FALSE;
+
+ spec = &sink->ringbuffer->spec;
+
+ GST_DEBUG_OBJECT (sink, "release old ringbuffer");
+
+ /* get current time, updates the last_time. When the subclass has a clock that
+ * restarts from 0 when a new format is negotiated, it will call
+ * gst_audio_clock_reset() which will use this last_time to create an offset
+ * so that time from the clock keeps on increasing monotonically. */
+ now = gst_clock_get_time (sink->provided_clock);
+
+ GST_DEBUG_OBJECT (sink, "time was %" GST_TIME_FORMAT, GST_TIME_ARGS (now));
+
+ /* release old ringbuffer */
+ gst_ring_buffer_pause (sink->ringbuffer);
+ gst_ring_buffer_activate (sink->ringbuffer, FALSE);
+ gst_ring_buffer_release (sink->ringbuffer);
+
+ GST_DEBUG_OBJECT (sink, "parse caps");
+
+ spec->buffer_time = sink->buffer_time;
+ spec->latency_time = sink->latency_time;
+
+ /* parse new caps */
+ if (!gst_ring_buffer_parse_caps (spec, caps))
+ goto parse_error;
+
+ gst_ring_buffer_debug_spec_buff (spec);
+
+ GST_DEBUG_OBJECT (sink, "acquire ringbuffer");
+ if (!gst_ring_buffer_acquire (sink->ringbuffer, spec))
+ goto acquire_error;
+
+ if (bsink->pad_mode == GST_ACTIVATE_PUSH) {
+ GST_DEBUG_OBJECT (sink, "activate ringbuffer");
+ gst_ring_buffer_activate (sink->ringbuffer, TRUE);
+ }
+
+ /* due to possible changes in the spec file we should recalibrate the clock */
+ gst_clock_get_calibration (sink->provided_clock, NULL, NULL,
+ &crate_num, &crate_denom);
+ gst_clock_set_calibration (sink->provided_clock,
+ gst_clock_get_internal_time (sink->provided_clock), now, crate_num,
+ crate_denom);
+
+ /* calculate actual latency and buffer times.
+ * FIXME: In 0.11, store the latency_time internally in ns */
+ spec->latency_time = gst_util_uint64_scale (spec->segsize,
+ (GST_SECOND / GST_USECOND), spec->info.rate * spec->info.bpf);
+
+ spec->buffer_time = spec->segtotal * spec->latency_time;
+
+ gst_ring_buffer_debug_spec_buff (spec);
+
+ return TRUE;
+
+ /* ERRORS */
+parse_error:
+ {
+ GST_DEBUG_OBJECT (sink, "could not parse caps");
+ GST_ELEMENT_ERROR (sink, STREAM, FORMAT,
+ (NULL), ("cannot parse audio format."));
+ return FALSE;
+ }
+acquire_error:
+ {
+ GST_DEBUG_OBJECT (sink, "could not acquire ringbuffer");
+ return FALSE;
+ }
+}
+
+static void
+gst_base_audio_sink_fixate (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstStructure *s;
+ gint width, depth;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ /* fields for all formats */
+ gst_structure_fixate_field_nearest_int (s, "rate", 44100);
+ gst_structure_fixate_field_nearest_int (s, "channels", 2);
+ gst_structure_fixate_field_nearest_int (s, "width", 16);
+
+ /* fields for int */
+ if (gst_structure_has_field (s, "depth")) {
+ gst_structure_get_int (s, "width", &width);
+ /* round width to nearest multiple of 8 for the depth */
+ depth = GST_ROUND_UP_8 (width);
+ gst_structure_fixate_field_nearest_int (s, "depth", depth);
+ }
+ if (gst_structure_has_field (s, "signed"))
+ gst_structure_fixate_field_boolean (s, "signed", TRUE);
+ if (gst_structure_has_field (s, "endianness"))
+ gst_structure_fixate_field_nearest_int (s, "endianness", G_BYTE_ORDER);
+}
+
+static void
+gst_base_audio_sink_get_times (GstBaseSink * bsink, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ /* our clock sync is a bit too much for the base class to handle so
+ * we implement it ourselves. */
+ *start = GST_CLOCK_TIME_NONE;
+ *end = GST_CLOCK_TIME_NONE;
+}
+
+/* This waits for the drain to happen and can be canceled */
+static gboolean
+gst_base_audio_sink_drain (GstBaseAudioSink * sink)
+{
+ if (!sink->ringbuffer)
+ return TRUE;
+ if (!sink->ringbuffer->spec.info.rate)
+ return TRUE;
+
+ /* if PLAYING is interrupted,
+ * arrange to have clock running when going to PLAYING again */
+ g_atomic_int_set (&sink->eos_rendering, 1);
+
+ /* need to start playback before we can drain, but only when
+ * we have successfully negotiated a format and thus acquired the
+ * ringbuffer. */
+ if (gst_ring_buffer_is_acquired (sink->ringbuffer))
+ gst_ring_buffer_start (sink->ringbuffer);
+
+ if (sink->priv->eos_time != -1) {
+ GST_DEBUG_OBJECT (sink,
+ "last sample time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (sink->priv->eos_time));
+
+ /* wait for the EOS time to be reached, this is the time when the last
+ * sample is played. */
+ gst_base_sink_wait_eos (GST_BASE_SINK (sink), sink->priv->eos_time, NULL);
+
+ GST_DEBUG_OBJECT (sink, "drained audio");
+ }
+ g_atomic_int_set (&sink->eos_rendering, 0);
+ return TRUE;
+}
+
+static gboolean
+gst_base_audio_sink_event (GstBaseSink * bsink, GstEvent * event)
+{
+ GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ if (sink->ringbuffer)
+ gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ /* always resync on sample after a flush */
+ sink->priv->avg_skew = -1;
+ sink->next_sample = -1;
+ sink->priv->eos_time = -1;
+ if (sink->ringbuffer)
+ gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
+ break;
+ case GST_EVENT_EOS:
+ /* now wait till we played everything */
+ gst_base_audio_sink_drain (sink);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_base_audio_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer)
+{
+ GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
+
+ if (!gst_ring_buffer_is_acquired (sink->ringbuffer))
+ goto wrong_state;
+
+ /* we don't really do anything when prerolling. We could make a
+ * property to play this buffer to have some sort of scrubbing
+ * support. */
+ return GST_FLOW_OK;
+
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (sink, "ringbuffer in wrong state");
+ GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), ("sink not negotiated."));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+}
+
+static guint64
+gst_base_audio_sink_get_offset (GstBaseAudioSink * sink)
+{
+ guint64 sample;
+ gint writeseg, segdone, sps;
+ gint diff;
+
+ /* assume we can append to the previous sample */
+ sample = sink->next_sample;
+ /* no previous sample, try to insert at position 0 */
+ if (sample == -1)
+ sample = 0;
+
+ sps = sink->ringbuffer->samples_per_seg;
+
+ /* figure out the segment and the offset inside the segment where
+ * the sample should be written. */
+ writeseg = sample / sps;
+
+ /* get the currently processed segment */
+ segdone = g_atomic_int_get (&sink->ringbuffer->segdone)
+ - sink->ringbuffer->segbase;
+
+ /* see how far away it is from the write segment */
+ diff = writeseg - segdone;
+ if (diff < 0) {
+ /* sample would be dropped, position to next playable position */
+ sample = (segdone + 1) * sps;
+ }
+
+ return sample;
+}
+
+static GstClockTime
+clock_convert_external (GstClockTime external, GstClockTime cinternal,
+ GstClockTime cexternal, GstClockTime crate_num, GstClockTime crate_denom)
+{
+ /* adjust for rate and speed */
+ if (external >= cexternal) {
+ external =
+ gst_util_uint64_scale (external - cexternal, crate_denom, crate_num);
+ external += cinternal;
+ } else {
+ external =
+ gst_util_uint64_scale (cexternal - external, crate_denom, crate_num);
+ if (cinternal > external)
+ external = cinternal - external;
+ else
+ external = 0;
+ }
+ return external;
+}
+
+/* algorithm to calculate sample positions that will result in resampling to
+ * match the clock rate of the master */
+static void
+gst_base_audio_sink_resample_slaving (GstBaseAudioSink * sink,
+ GstClockTime render_start, GstClockTime render_stop,
+ GstClockTime * srender_start, GstClockTime * srender_stop)
+{
+ GstClockTime cinternal, cexternal;
+ GstClockTime crate_num, crate_denom;
+
+ /* FIXME, we can sample and add observations here or use the timeouts on the
+ * clock. No idea which one is better or more stable. The timeout seems more
+ * arbitrary but this one seems more demanding and does not work when there is
+ * no data comming in to the sink. */
+#if 0
+ GstClockTime etime, itime;
+ gdouble r_squared;
+
+ /* sample clocks and figure out clock skew */
+ etime = gst_clock_get_time (GST_ELEMENT_CLOCK (sink));
+ itime = gst_audio_clock_get_time (sink->provided_clock);
+
+ /* add new observation */
+ gst_clock_add_observation (sink->provided_clock, itime, etime, &r_squared);
+#endif
+
+ /* get calibration parameters to compensate for speed and offset differences
+ * when we are slaved */
+ gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal,
+ &crate_num, &crate_denom);
+
+ GST_DEBUG_OBJECT (sink, "internal %" GST_TIME_FORMAT " external %"
+ GST_TIME_FORMAT " %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT " = %f",
+ GST_TIME_ARGS (cinternal), GST_TIME_ARGS (cexternal), crate_num,
+ crate_denom, gst_guint64_to_gdouble (crate_num) /
+ gst_guint64_to_gdouble (crate_denom));
+
+ if (crate_num == 0)
+ crate_denom = crate_num = 1;
+
+ /* bring external time to internal time */
+ render_start = clock_convert_external (render_start, cinternal, cexternal,
+ crate_num, crate_denom);
+ render_stop = clock_convert_external (render_stop, cinternal, cexternal,
+ crate_num, crate_denom);
+
+ GST_DEBUG_OBJECT (sink,
+ "after slaving: start %" GST_TIME_FORMAT " - stop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (render_start), GST_TIME_ARGS (render_stop));
+
+ *srender_start = render_start;
+ *srender_stop = render_stop;
+}
+
+/* algorithm to calculate sample positions that will result in changing the
+ * playout pointer to match the clock rate of the master */
+static void
+gst_base_audio_sink_skew_slaving (GstBaseAudioSink * sink,
+ GstClockTime render_start, GstClockTime render_stop,
+ GstClockTime * srender_start, GstClockTime * srender_stop)
+{
+ GstClockTime cinternal, cexternal, crate_num, crate_denom;
+ GstClockTime etime, itime;
+ GstClockTimeDiff skew, mdrift, mdrift2;
+ gint driftsamples;
+ gint64 last_align;
+
+ /* get calibration parameters to compensate for offsets */
+ gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal,
+ &crate_num, &crate_denom);
+
+ /* sample clocks and figure out clock skew */
+ etime = gst_clock_get_time (GST_ELEMENT_CLOCK (sink));
+ itime = gst_audio_clock_get_time (sink->provided_clock);
+ itime = gst_audio_clock_adjust (sink->provided_clock, itime);
+
+ GST_DEBUG_OBJECT (sink,
+ "internal %" GST_TIME_FORMAT " external %" GST_TIME_FORMAT
+ " cinternal %" GST_TIME_FORMAT " cexternal %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (itime), GST_TIME_ARGS (etime),
+ GST_TIME_ARGS (cinternal), GST_TIME_ARGS (cexternal));
+
+ /* make sure we never go below 0 */
+ etime = etime > cexternal ? etime - cexternal : 0;
+ itime = itime > cinternal ? itime - cinternal : 0;
+
+ /* do itime - etime.
+ * positive value means external clock goes slower
+ * negative value means external clock goes faster */
+ skew = GST_CLOCK_DIFF (etime, itime);
+ if (sink->priv->avg_skew == -1) {
+ /* first observation */
+ sink->priv->avg_skew = skew;
+ } else {
+ /* next observations use a moving average */
+ sink->priv->avg_skew = (31 * sink->priv->avg_skew + skew) / 32;
+ }
+
+ GST_DEBUG_OBJECT (sink, "internal %" GST_TIME_FORMAT " external %"
+ GST_TIME_FORMAT " skew %" G_GINT64_FORMAT " avg %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (itime), GST_TIME_ARGS (etime), skew, sink->priv->avg_skew);
+
+ /* the max drift we allow */
+ mdrift = sink->priv->drift_tolerance * 1000;
+ mdrift2 = mdrift / 2;
+
+ /* adjust playout pointer based on skew */
+ if (sink->priv->avg_skew > mdrift2) {
+ /* master is running slower, move internal time forward */
+ GST_WARNING_OBJECT (sink,
+ "correct clock skew %" G_GINT64_FORMAT " > %" G_GINT64_FORMAT,
+ sink->priv->avg_skew, mdrift2);
+ cexternal = cexternal > mdrift ? cexternal - mdrift : 0;
+ sink->priv->avg_skew -= mdrift;
+
+ driftsamples = (sink->ringbuffer->spec.info.rate * mdrift) / GST_SECOND;
+ last_align = sink->priv->last_align;
+
+ /* if we were aligning in the wrong direction or we aligned more than what we
+ * will correct, resync */
+ if (last_align < 0 || last_align > driftsamples)
+ sink->next_sample = -1;
+
+ GST_DEBUG_OBJECT (sink,
+ "last_align %" G_GINT64_FORMAT " driftsamples %u, next %"
+ G_GUINT64_FORMAT, last_align, driftsamples, sink->next_sample);
+
+ gst_clock_set_calibration (sink->provided_clock, cinternal, cexternal,
+ crate_num, crate_denom);
+ } else if (sink->priv->avg_skew < -mdrift2) {
+ /* master is running faster, move external time forwards */
+ GST_WARNING_OBJECT (sink,
+ "correct clock skew %" G_GINT64_FORMAT " < %" G_GINT64_FORMAT,
+ sink->priv->avg_skew, -mdrift2);
+ cexternal += mdrift;
+ sink->priv->avg_skew += mdrift;
+
+ driftsamples = (sink->ringbuffer->spec.info.rate * mdrift) / GST_SECOND;
+ last_align = sink->priv->last_align;
+
+ /* if we were aligning in the wrong direction or we aligned more than what we
+ * will correct, resync */
+ if (last_align > 0 || -last_align > driftsamples)
+ sink->next_sample = -1;
+
+ GST_DEBUG_OBJECT (sink,
+ "last_align %" G_GINT64_FORMAT " driftsamples %u, next %"
+ G_GUINT64_FORMAT, last_align, driftsamples, sink->next_sample);
+
+ gst_clock_set_calibration (sink->provided_clock, cinternal, cexternal,
+ crate_num, crate_denom);
+ }
+
+ /* convert, ignoring speed */
+ render_start = clock_convert_external (render_start, cinternal, cexternal,
+ crate_num, crate_denom);
+ render_stop = clock_convert_external (render_stop, cinternal, cexternal,
+ crate_num, crate_denom);
+
+ *srender_start = render_start;
+ *srender_stop = render_stop;
+}
+
+/* apply the clock offset but do no slaving otherwise */
+static void
+gst_base_audio_sink_none_slaving (GstBaseAudioSink * sink,
+ GstClockTime render_start, GstClockTime render_stop,
+ GstClockTime * srender_start, GstClockTime * srender_stop)
+{
+ GstClockTime cinternal, cexternal, crate_num, crate_denom;
+
+ /* get calibration parameters to compensate for offsets */
+ gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal,
+ &crate_num, &crate_denom);
+
+ /* convert, ignoring speed */
+ render_start = clock_convert_external (render_start, cinternal, cexternal,
+ crate_num, crate_denom);
+ render_stop = clock_convert_external (render_stop, cinternal, cexternal,
+ crate_num, crate_denom);
+
+ *srender_start = render_start;
+ *srender_stop = render_stop;
+}
+
+/* converts render_start and render_stop to their slaved values */
+static void
+gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink,
+ GstClockTime render_start, GstClockTime render_stop,
+ GstClockTime * srender_start, GstClockTime * srender_stop)
+{
+ switch (sink->priv->slave_method) {
+ case GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE:
+ gst_base_audio_sink_resample_slaving (sink, render_start, render_stop,
+ srender_start, srender_stop);
+ break;
+ case GST_BASE_AUDIO_SINK_SLAVE_SKEW:
+ gst_base_audio_sink_skew_slaving (sink, render_start, render_stop,
+ srender_start, srender_stop);
+ break;
+ case GST_BASE_AUDIO_SINK_SLAVE_NONE:
+ gst_base_audio_sink_none_slaving (sink, render_start, render_stop,
+ srender_start, srender_stop);
+ break;
+ default:
+ g_warning ("unknown slaving method %d", sink->priv->slave_method);
+ break;
+ }
+}
+
+/* must be called with LOCK */
+static GstFlowReturn
+gst_base_audio_sink_sync_latency (GstBaseSink * bsink, GstMiniObject * obj)
+{
+ GstClock *clock;
+ GstClockReturn status;
+ GstClockTime time, render_delay;
+ GstFlowReturn ret;
+ GstBaseAudioSink *sink;
+ GstClockTime itime, etime;
+ GstClockTime rate_num, rate_denom;
+ GstClockTimeDiff jitter;
+
+ sink = GST_BASE_AUDIO_SINK (bsink);
+
+ clock = GST_ELEMENT_CLOCK (sink);
+ if (G_UNLIKELY (clock == NULL))
+ goto no_clock;
+
+ /* we provided the global clock, don't need to do anything special */
+ if (clock == sink->provided_clock)
+ goto no_slaving;
+
+ GST_OBJECT_UNLOCK (sink);
+
+ do {
+ GST_DEBUG_OBJECT (sink, "checking preroll");
+
+ ret = gst_base_sink_do_preroll (bsink, obj);
+ if (ret != GST_FLOW_OK)
+ goto flushing;
+
+ GST_OBJECT_LOCK (sink);
+ time = sink->priv->us_latency;
+ GST_OBJECT_UNLOCK (sink);
+
+ /* Renderdelay is added onto our own latency, and needs
+ * to be subtracted as well */
+ render_delay = gst_base_sink_get_render_delay (bsink);
+
+ if (G_LIKELY (time > render_delay))
+ time -= render_delay;
+ else
+ time = 0;
+
+ /* preroll done, we can sync since we are in PLAYING now. */
+ GST_DEBUG_OBJECT (sink, "possibly waiting for clock to reach %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (time));
+
+ /* wait for the clock, this can be interrupted because we got shut down or
+ * we PAUSED. */
+ status = gst_base_sink_wait_clock (bsink, time, &jitter);
+
+ GST_DEBUG_OBJECT (sink, "clock returned %d %" GST_TIME_FORMAT, status,
+ GST_TIME_ARGS (jitter));
+
+ /* invalid time, no clock or sync disabled, just continue then */
+ if (status == GST_CLOCK_BADTIME)
+ break;
+
+ /* waiting could have been interrupted and we can be flushing now */
+ if (G_UNLIKELY (bsink->flushing))
+ goto flushing;
+
+ /* retry if we got unscheduled, which means we did not reach the timeout
+ * yet. if some other error occures, we continue. */
+ } while (status == GST_CLOCK_UNSCHEDULED);
+
+ GST_OBJECT_LOCK (sink);
+ GST_DEBUG_OBJECT (sink, "latency synced");
+
+ /* when we prerolled in time, we can accurately set the calibration,
+ * our internal clock should exactly have been the latency (== the running
+ * time of the external clock) */
+ etime = GST_ELEMENT_CAST (sink)->base_time + time;
+ itime = gst_audio_clock_get_time (sink->provided_clock);
+ itime = gst_audio_clock_adjust (sink->provided_clock, itime);
+
+ if (status == GST_CLOCK_EARLY) {
+ /* when we prerolled late, we have to take into account the lateness */
+ GST_DEBUG_OBJECT (sink, "late preroll, adding jitter");
+ etime += jitter;
+ }
+
+ /* start ringbuffer so we can start slaving right away when we need to */
+ gst_ring_buffer_start (sink->ringbuffer);
+
+ GST_DEBUG_OBJECT (sink,
+ "internal time: %" GST_TIME_FORMAT " external time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (itime), GST_TIME_ARGS (etime));
+
+ /* copy the original calibrated rate but update the internal and external
+ * times. */
+ gst_clock_get_calibration (sink->provided_clock, NULL, NULL, &rate_num,
+ &rate_denom);
+ gst_clock_set_calibration (sink->provided_clock, itime, etime,
+ rate_num, rate_denom);
+
+ switch (sink->priv->slave_method) {
+ case GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE:
+ /* only set as master when we are resampling */
+ GST_DEBUG_OBJECT (sink, "Setting clock as master");
+ gst_clock_set_master (sink->provided_clock, clock);
+ break;
+ case GST_BASE_AUDIO_SINK_SLAVE_SKEW:
+ case GST_BASE_AUDIO_SINK_SLAVE_NONE:
+ default:
+ break;
+ }
+
+ sink->priv->avg_skew = -1;
+ sink->next_sample = -1;
+ sink->priv->eos_time = -1;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+no_clock:
+ {
+ GST_DEBUG_OBJECT (sink, "we have no clock");
+ return GST_FLOW_OK;
+ }
+no_slaving:
+ {
+ GST_DEBUG_OBJECT (sink, "we are not slaved");
+ return GST_FLOW_OK;
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (sink, "we are flushing");
+ GST_OBJECT_LOCK (sink);
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+static gint64
+gst_base_audio_sink_get_alignment (GstBaseAudioSink * sink,
+ GstClockTime sample_offset)
+{
+ GstRingBuffer *ringbuf = sink->ringbuffer;
+ gint64 align;
+ gint64 diff;
+ gint64 maxdrift;
+ gint segdone = g_atomic_int_get (&ringbuf->segdone) - ringbuf->segbase;
+ gint64 samples_done = segdone * ringbuf->samples_per_seg;
+ gint64 headroom = sample_offset - samples_done;
+ gboolean allow_align = TRUE;
+ gint rate;
+
+ /* now try to align the sample to the previous one, first see how big the
+ * difference is. */
+ if (sample_offset >= sink->next_sample)
+ diff = sample_offset - sink->next_sample;
+ else
+ diff = sink->next_sample - sample_offset;
+
+ rate = GST_AUDIO_INFO_RATE (&ringbuf->spec.info);
+
+ /* calculate the max allowed drift in units of samples. By default this is
+ * 20ms and should be anough to compensate for timestamp rounding errors. */
+ maxdrift = (rate * sink->priv->drift_tolerance) / GST_MSECOND;
+
+ /* calc align with previous sample */
+ align = sink->next_sample - sample_offset;
+
+ /* don't align if it means writing behind the read-segment */
+ if (diff > headroom && align < 0)
+ allow_align = FALSE;
+
+ if (G_LIKELY (diff < maxdrift && allow_align)) {
+ GST_DEBUG_OBJECT (sink,
+ "align with prev sample, ABS (%" G_GINT64_FORMAT ") < %"
+ G_GINT64_FORMAT, align, maxdrift);
+ } else {
+ /* calculate sample diff in seconds for error message */
+ gint64 diff_s = gst_util_uint64_scale_int (diff, GST_SECOND, rate);
+ /* timestamps drifted apart from previous samples too much, we need to
+ * resync. We log this as an element warning. */
+ GST_WARNING_OBJECT (sink,
+ "Unexpected discontinuity in audio timestamps of "
+ "%s%" GST_TIME_FORMAT ", resyncing",
+ sample_offset > sink->next_sample ? "+" : "-", GST_TIME_ARGS (diff_s));
+ align = 0;
+ }
+
+ return align;
+}
+
+static GstFlowReturn
+gst_base_audio_sink_render (GstBaseSink * bsink, GstBuffer * buf)
+{
+ guint64 in_offset;
+ GstClockTime time, stop, render_start, render_stop, sample_offset;
+ GstClockTimeDiff sync_offset, ts_offset;
+ GstBaseAudioSinkClass *bclass;
+ GstBaseAudioSink *sink;
+ GstRingBuffer *ringbuf;
+ gint64 diff, align;
+ guint64 ctime, cstop;
+ gsize offset;
+ guint8 *data;
+ gsize size;
+ guint samples, written;
+ gint bpf, rate;
+ gint accum;
+ gint out_samples;
+ GstClockTime base_time, render_delay, latency;
+ GstClock *clock;
+ gboolean sync, slaved, align_next;
+ GstFlowReturn ret;
+ GstSegment clip_seg;
+ gint64 time_offset;
+ GstBuffer *out = NULL;
+
+ sink = GST_BASE_AUDIO_SINK (bsink);
+ bclass = GST_BASE_AUDIO_SINK_GET_CLASS (sink);
+
+ ringbuf = sink->ringbuffer;
+
+ /* can't do anything when we don't have the device */
+ if (G_UNLIKELY (!gst_ring_buffer_is_acquired (ringbuf)))
+ goto wrong_state;
+
+ /* Wait for upstream latency before starting the ringbuffer, we do this so
+ * that we can align the first sample of the ringbuffer to the base_time +
+ * latency. */
+ GST_OBJECT_LOCK (sink);
+ base_time = GST_ELEMENT_CAST (sink)->base_time;
+ if (G_UNLIKELY (sink->priv->sync_latency)) {
+ ret = gst_base_audio_sink_sync_latency (bsink, GST_MINI_OBJECT_CAST (buf));
+ GST_OBJECT_UNLOCK (sink);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto sync_latency_failed;
+ /* only do this once until we are set back to PLAYING */
+ sink->priv->sync_latency = FALSE;
+ } else {
+ GST_OBJECT_UNLOCK (sink);
+ }
+
+ /* Before we go on, let's see if we need to payload the data. If yes, we also
+ * need to unref the output buffer before leaving. */
+ if (bclass->payload) {
+ out = bclass->payload (sink, buf);
+
+ if (!out)
+ goto payload_failed;
+
+ buf = out;
+ }
+
+ bpf = GST_AUDIO_INFO_BPF (&ringbuf->spec.info);
+ rate = GST_AUDIO_INFO_RATE (&ringbuf->spec.info);
+
+ size = gst_buffer_get_size (buf);
+ if (G_UNLIKELY (size % bpf) != 0)
+ goto wrong_size;
+
+ samples = size / bpf;
+ out_samples = samples;
+
+ in_offset = GST_BUFFER_OFFSET (buf);
+ time = GST_BUFFER_TIMESTAMP (buf);
+
+ GST_DEBUG_OBJECT (sink,
+ "time %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT ", start %"
+ GST_TIME_FORMAT ", samples %u", GST_TIME_ARGS (time), in_offset,
+ GST_TIME_ARGS (bsink->segment.start), samples);
+
+ offset = 0;
+
+ /* if not valid timestamp or we can't clip or sync, try to play
+ * sample ASAP */
+ if (!GST_CLOCK_TIME_IS_VALID (time)) {
+ render_start = gst_base_audio_sink_get_offset (sink);
+ render_stop = render_start + samples;
+ GST_DEBUG_OBJECT (sink, "Buffer of size %" G_GSIZE_FORMAT " has no time."
+ " Using render_start=%" G_GUINT64_FORMAT, size, render_start);
+ /* we don't have a start so we don't know stop either */
+ stop = -1;
+ goto no_sync;
+ }
+
+ /* let's calc stop based on the number of samples in the buffer instead
+ * of trusting the DURATION */
+ stop = time + gst_util_uint64_scale_int (samples, GST_SECOND, rate);
+
+ /* prepare the clipping segment. Since we will be subtracting ts-offset and
+ * device-delay later we scale the start and stop with those values so that we
+ * can correctly clip them */
+ clip_seg.format = GST_FORMAT_TIME;
+ clip_seg.start = bsink->segment.start;
+ clip_seg.stop = bsink->segment.stop;
+ clip_seg.duration = -1;
+
+ /* the sync offset is the combination of ts-offset and device-delay */
+ latency = gst_base_sink_get_latency (bsink);
+ ts_offset = gst_base_sink_get_ts_offset (bsink);
+ render_delay = gst_base_sink_get_render_delay (bsink);
+ sync_offset = ts_offset - render_delay + latency;
+
+ GST_DEBUG_OBJECT (sink,
+ "sync-offset %" G_GINT64_FORMAT ", render-delay %" GST_TIME_FORMAT
+ ", ts-offset %" G_GINT64_FORMAT, sync_offset,
+ GST_TIME_ARGS (render_delay), ts_offset);
+
+ /* compensate for ts-offset and device-delay when negative we need to
+ * clip. */
+ if (sync_offset < 0) {
+ clip_seg.start += -sync_offset;
+ if (clip_seg.stop != -1)
+ clip_seg.stop += -sync_offset;
+ }
+
+ /* samples should be rendered based on their timestamp. All samples
+ * arriving before the segment.start or after segment.stop are to be
+ * thrown away. All samples should also be clipped to the segment
+ * boundaries */
+ if (!gst_segment_clip (&clip_seg, GST_FORMAT_TIME, time, stop, &ctime,
+ &cstop))
+ goto out_of_segment;
+
+ /* see if some clipping happened */
+ diff = ctime - time;
+ if (diff > 0) {
+ /* bring clipped time to samples */
+ diff = gst_util_uint64_scale_int (diff, rate, GST_SECOND);
+ GST_DEBUG_OBJECT (sink, "clipping start to %" GST_TIME_FORMAT " %"
+ G_GUINT64_FORMAT " samples", GST_TIME_ARGS (ctime), diff);
+ samples -= diff;
+ offset += diff * bpf;
+ time = ctime;
+ }
+ diff = stop - cstop;
+ if (diff > 0) {
+ /* bring clipped time to samples */
+ diff = gst_util_uint64_scale_int (diff, rate, GST_SECOND);
+ GST_DEBUG_OBJECT (sink, "clipping stop to %" GST_TIME_FORMAT " %"
+ G_GUINT64_FORMAT " samples", GST_TIME_ARGS (cstop), diff);
+ samples -= diff;
+ stop = cstop;
+ }
+
+ /* figure out how to sync */
+ if ((clock = GST_ELEMENT_CLOCK (bsink)))
+ sync = bsink->sync;
+ else
+ sync = FALSE;
+
+ if (!sync) {
+ /* no sync needed, play sample ASAP */
+ render_start = gst_base_audio_sink_get_offset (sink);
+ render_stop = render_start + samples;
+ GST_DEBUG_OBJECT (sink,
+ "no sync needed. Using render_start=%" G_GUINT64_FORMAT, render_start);
+ goto no_sync;
+ }
+
+ /* bring buffer start and stop times to running time */
+ render_start =
+ gst_segment_to_running_time (&bsink->segment, GST_FORMAT_TIME, time);
+ render_stop =
+ gst_segment_to_running_time (&bsink->segment, GST_FORMAT_TIME, stop);
+
+ GST_DEBUG_OBJECT (sink,
+ "running: start %" GST_TIME_FORMAT " - stop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (render_start), GST_TIME_ARGS (render_stop));
+
+ /* store the time of the last sample, we'll use this to perform sync on the
+ * last sample when draining the buffer */
+ if (bsink->segment.rate >= 0.0) {
+ sink->priv->eos_time = render_stop;
+ } else {
+ sink->priv->eos_time = render_start;
+ }
+
+ /* compensate for ts-offset and delay we know this will not underflow because we
+ * clipped above. */
+ GST_DEBUG_OBJECT (sink,
+ "compensating for sync-offset %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (sync_offset));
+ render_start += sync_offset;
+ render_stop += sync_offset;
+
+ GST_DEBUG_OBJECT (sink, "adding base_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (base_time));
+
+ /* add base time to sync against the clock */
+ render_start += base_time;
+ render_stop += base_time;
+
+ GST_DEBUG_OBJECT (sink,
+ "after compensation: start %" GST_TIME_FORMAT " - stop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (render_start), GST_TIME_ARGS (render_stop));
+
+ if ((slaved = clock != sink->provided_clock)) {
+ /* handle clock slaving */
+ gst_base_audio_sink_handle_slaving (sink, render_start, render_stop,
+ &render_start, &render_stop);
+ } else {
+ /* no slaving needed but we need to adapt to the clock calibration
+ * parameters */
+ gst_base_audio_sink_none_slaving (sink, render_start, render_stop,
+ &render_start, &render_stop);
+ }
+
+ GST_DEBUG_OBJECT (sink,
+ "final timestamps: start %" GST_TIME_FORMAT " - stop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (render_start), GST_TIME_ARGS (render_stop));
+
+ /* bring to position in the ringbuffer */
+ time_offset = GST_AUDIO_CLOCK_CAST (sink->provided_clock)->time_offset;
+ GST_DEBUG_OBJECT (sink,
+ "time offset %" GST_TIME_FORMAT, GST_TIME_ARGS (time_offset));
+ if (render_start > time_offset)
+ render_start -= time_offset;
+ else
+ render_start = 0;
+ if (render_stop > time_offset)
+ render_stop -= time_offset;
+ else
+ render_stop = 0;
+
+ /* in some clock slaving cases, all late samples end up at 0 first,
+ * and subsequent ones align with that until threshold exceeded,
+ * and then sync back to 0 and so on, so avoid that altogether */
+ if (G_UNLIKELY (render_start == 0 && render_stop == 0))
+ goto too_late;
+
+ /* and bring the time to the rate corrected offset in the buffer */
+ render_start = gst_util_uint64_scale_int (render_start, rate, GST_SECOND);
+ render_stop = gst_util_uint64_scale_int (render_stop, rate, GST_SECOND);
+
+ /* positive playback rate, first sample is render_start, negative rate, first
+ * sample is render_stop. When no rate conversion is active, render exactly
+ * the amount of input samples to avoid aligning to rounding errors. */
+ if (bsink->segment.rate >= 0.0) {
+ sample_offset = render_start;
+ if (bsink->segment.rate == 1.0)
+ render_stop = sample_offset + samples;
+ } else {
+ sample_offset = render_stop;
+ if (bsink->segment.rate == -1.0)
+ render_start = sample_offset + samples;
+ }
+
+ /* always resync after a discont */
+ if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT))) {
+ GST_DEBUG_OBJECT (sink, "resync after discont");
+ goto no_align;
+ }
+
+ /* resync when we don't know what to align the sample with */
+ if (G_UNLIKELY (sink->next_sample == -1)) {
+ GST_DEBUG_OBJECT (sink,
+ "no align possible: no previous sample position known");
+ goto no_align;
+ }
+
+ align = gst_base_audio_sink_get_alignment (sink, sample_offset);
+ sink->priv->last_align = align;
+
+ /* apply alignment */
+ render_start += align;
+
+ /* only align stop if we are not slaved to resample */
+ if (slaved && sink->priv->slave_method == GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE) {
+ GST_DEBUG_OBJECT (sink, "no stop time align needed: we are slaved");
+ goto no_align;
+ }
+ render_stop += align;
+
+no_align:
+ /* number of target samples is difference between start and stop */
+ out_samples = render_stop - render_start;
+
+no_sync:
+ /* we render the first or last sample first, depending on the rate */
+ if (bsink->segment.rate >= 0.0)
+ sample_offset = render_start;
+ else
+ sample_offset = render_stop;
+
+ GST_DEBUG_OBJECT (sink, "rendering at %" G_GUINT64_FORMAT " %d/%d",
+ sample_offset, samples, out_samples);
+
+ /* we need to accumulate over different runs for when we get interrupted */
+ accum = 0;
+ align_next = TRUE;
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ do {
+ written =
+ gst_ring_buffer_commit_full (ringbuf, &sample_offset, data + offset,
+ samples, out_samples, &accum);
+
+ GST_DEBUG_OBJECT (sink, "wrote %u of %u", written, samples);
+ /* if we wrote all, we're done */
+ if (written == samples)
+ break;
+
+ /* else something interrupted us and we wait for preroll. */
+ if ((ret = gst_base_sink_wait_preroll (bsink)) != GST_FLOW_OK)
+ goto stopping;
+
+ /* if we got interrupted, we cannot assume that the next sample should
+ * be aligned to this one */
+ align_next = FALSE;
+
+ /* update the output samples. FIXME, this will just skip them when pausing
+ * during trick mode */
+ if (out_samples > written) {
+ out_samples -= written;
+ accum = 0;
+ } else
+ break;
+
+ samples -= written;
+ offset += written * bpf;
+ } while (TRUE);
+ gst_buffer_unmap (buf, data, size);
+
+ if (align_next)
+ sink->next_sample = sample_offset;
+ else
+ sink->next_sample = -1;
+
+ GST_DEBUG_OBJECT (sink, "next sample expected at %" G_GUINT64_FORMAT,
+ sink->next_sample);
+
+ if (GST_CLOCK_TIME_IS_VALID (stop) && stop >= bsink->segment.stop) {
+ GST_DEBUG_OBJECT (sink,
+ "start playback because we are at the end of segment");
+ gst_ring_buffer_start (ringbuf);
+ }
+
+ ret = GST_FLOW_OK;
+
+done:
+ if (out)
+ gst_buffer_unref (out);
+
+ return ret;
+
+ /* SPECIAL cases */
+out_of_segment:
+ {
+ GST_DEBUG_OBJECT (sink,
+ "dropping sample out of segment time %" GST_TIME_FORMAT ", start %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (time),
+ GST_TIME_ARGS (bsink->segment.start));
+ ret = GST_FLOW_OK;
+ goto done;
+ }
+too_late:
+ {
+ GST_DEBUG_OBJECT (sink, "dropping late sample");
+ return GST_FLOW_OK;
+ }
+ /* ERRORS */
+payload_failed:
+ {
+ GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), ("failed to payload."));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (sink, "ringbuffer not negotiated");
+ GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), ("sink not negotiated."));
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
+ }
+wrong_size:
+ {
+ GST_DEBUG_OBJECT (sink, "wrong size");
+ GST_ELEMENT_ERROR (sink, STREAM, WRONG_TYPE,
+ (NULL), ("sink received buffer of wrong size."));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+stopping:
+ {
+ GST_DEBUG_OBJECT (sink, "preroll got interrupted: %d (%s)", ret,
+ gst_flow_get_name (ret));
+ gst_buffer_unmap (buf, data, size);
+ goto done;
+ }
+sync_latency_failed:
+ {
+ GST_DEBUG_OBJECT (sink, "failed waiting for latency");
+ goto done;
+ }
+}
+
+/**
+ * gst_base_audio_sink_create_ringbuffer:
+ * @sink: a #GstBaseAudioSink.
+ *
+ * Create and return the #GstRingBuffer for @sink. This function will call the
+ * ::create_ringbuffer vmethod and will set @sink as the parent of the returned
+ * buffer (see gst_object_set_parent()).
+ *
+ * Returns: The new ringbuffer of @sink.
+ */
+GstRingBuffer *
+gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
+{
+ GstBaseAudioSinkClass *bclass;
+ GstRingBuffer *buffer = NULL;
+
+ bclass = GST_BASE_AUDIO_SINK_GET_CLASS (sink);
+ if (bclass->create_ringbuffer)
+ buffer = bclass->create_ringbuffer (sink);
+
+ if (buffer)
+ gst_object_set_parent (GST_OBJECT (buffer), GST_OBJECT (sink));
+
+ return buffer;
+}
+
+static void
+gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data, guint len,
+ gpointer user_data)
+{
+ GstBaseSink *basesink;
+ GstBaseAudioSink *sink;
+ GstBuffer *buf;
+ GstFlowReturn ret;
+ gsize size;
+
+ basesink = GST_BASE_SINK (user_data);
+ sink = GST_BASE_AUDIO_SINK (user_data);
+
+ GST_PAD_STREAM_LOCK (basesink->sinkpad);
+
+ /* would be nice to arrange for pad_alloc_buffer to return data -- as it is we
+ will copy twice, once into data, once into DMA */
+ GST_LOG_OBJECT (basesink, "pulling %u bytes offset %" G_GUINT64_FORMAT
+ " to fill audio buffer", len, basesink->offset);
+ ret =
+ gst_pad_pull_range (basesink->sinkpad, basesink->segment.position, len,
+ &buf);
+
+ if (ret != GST_FLOW_OK) {
+ if (ret == GST_FLOW_UNEXPECTED)
+ goto eos;
+ else
+ goto error;
+ }
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ if (basesink->flushing)
+ goto flushing;
+
+ /* complete preroll and wait for PLAYING */
+ ret = gst_base_sink_do_preroll (basesink, GST_MINI_OBJECT_CAST (buf));
+ if (ret != GST_FLOW_OK)
+ goto preroll_error;
+
+ size = gst_buffer_get_size (buf);
+
+ if (len != size) {
+ GST_INFO_OBJECT (basesink,
+ "got different size than requested from sink pad: %u"
+ " != %" G_GSIZE_FORMAT, len, size);
+ len = MIN (size, len);
+ }
+
+ basesink->segment.position += len;
+
+ gst_buffer_extract (buf, 0, data, len);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+
+ GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
+
+ return;
+
+error:
+ {
+ GST_WARNING_OBJECT (basesink, "Got flow '%s' but can't return it: %d",
+ gst_flow_get_name (ret), ret);
+ gst_ring_buffer_pause (rbuf);
+ GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
+ return;
+ }
+eos:
+ {
+ /* FIXME: this is not quite correct; we'll be called endlessly until
+ * the sink gets shut down; maybe we should set a flag somewhere, or
+ * set segment.stop and segment.duration to the last sample or so */
+ GST_DEBUG_OBJECT (sink, "EOS");
+ gst_base_audio_sink_drain (sink);
+ gst_ring_buffer_pause (rbuf);
+ gst_element_post_message (GST_ELEMENT_CAST (sink),
+ gst_message_new_eos (GST_OBJECT_CAST (sink)));
+ GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (sink, "we are flushing");
+ gst_ring_buffer_pause (rbuf);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
+ return;
+ }
+preroll_error:
+ {
+ GST_DEBUG_OBJECT (sink, "error %s", gst_flow_get_name (ret));
+ gst_ring_buffer_pause (rbuf);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
+ return;
+ }
+}
+
+static gboolean
+gst_base_audio_sink_activate_pull (GstBaseSink * basesink, gboolean active)
+{
+ gboolean ret;
+ GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (basesink);
+
+ if (active) {
+ GST_DEBUG_OBJECT (basesink, "activating pull");
+
+ gst_ring_buffer_set_callback (sink->ringbuffer,
+ gst_base_audio_sink_callback, sink);
+
+ ret = gst_ring_buffer_activate (sink->ringbuffer, TRUE);
+ } else {
+ GST_DEBUG_OBJECT (basesink, "deactivating pull");
+ gst_ring_buffer_set_callback (sink->ringbuffer, NULL, NULL);
+ ret = gst_ring_buffer_activate (sink->ringbuffer, FALSE);
+ }
+
+ return ret;
+}
+
+#if 0
+/* should be called with the LOCK */
+static GstStateChangeReturn
+gst_base_audio_sink_async_play (GstBaseSink * basesink)
+{
+ GstBaseAudioSink *sink;
+
+ sink = GST_BASE_AUDIO_SINK (basesink);
+
+ GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
+ sink->priv->sync_latency = TRUE;
+ gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
+ if (basesink->pad_mode == GST_ACTIVATE_PULL) {
+ /* we always start the ringbuffer in pull mode immediatly */
+ gst_ring_buffer_start (sink->ringbuffer);
+ }
+
+ return GST_STATE_CHANGE_SUCCESS;
+}
+#endif
+
+static GstStateChangeReturn
+gst_base_audio_sink_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (sink->ringbuffer == NULL) {
+ gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
+ sink->ringbuffer = gst_base_audio_sink_create_ringbuffer (sink);
+ }
+ if (!gst_ring_buffer_open_device (sink->ringbuffer))
+ goto open_failed;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ sink->next_sample = -1;
+ sink->priv->last_align = -1;
+ sink->priv->eos_time = -1;
+ gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
+ gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
+
+ /* Only post clock-provide messages if this is the clock that
+ * we've created. If the subclass has overriden it the subclass
+ * should post this messages whenever necessary */
+ if (sink->provided_clock && GST_IS_AUDIO_CLOCK (sink->provided_clock) &&
+ GST_AUDIO_CLOCK_CAST (sink->provided_clock)->func ==
+ (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time)
+ gst_element_post_message (element,
+ gst_message_new_clock_provide (GST_OBJECT_CAST (element),
+ sink->provided_clock, TRUE));
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ {
+ gboolean eos;
+
+ GST_OBJECT_LOCK (sink);
+ GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
+ sink->priv->sync_latency = TRUE;
+ eos = GST_BASE_SINK (sink)->eos;
+ GST_OBJECT_UNLOCK (sink);
+
+ gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
+ if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL ||
+ g_atomic_int_get (&sink->eos_rendering) || eos) {
+ /* we always start the ringbuffer in pull mode immediatly */
+ /* sync rendering on eos needs running clock,
+ * and others need running clock when finished rendering eos */
+ gst_ring_buffer_start (sink->ringbuffer);
+ }
+ break;
+ }
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ /* ringbuffer cannot start anymore */
+ gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
+ gst_ring_buffer_pause (sink->ringbuffer);
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->sync_latency = FALSE;
+ GST_OBJECT_UNLOCK (sink);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ /* Only post clock-lost messages if this is the clock that
+ * we've created. If the subclass has overriden it the subclass
+ * should post this messages whenever necessary */
+ if (sink->provided_clock && GST_IS_AUDIO_CLOCK (sink->provided_clock) &&
+ GST_AUDIO_CLOCK_CAST (sink->provided_clock)->func ==
+ (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time)
+ gst_element_post_message (element,
+ gst_message_new_clock_lost (GST_OBJECT_CAST (element),
+ sink->provided_clock));
+
+ /* make sure we unblock before calling the parent state change
+ * so it can grab the STREAM_LOCK */
+ gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ /* stop slaving ourselves to the master, if any */
+ gst_clock_set_master (sink->provided_clock, NULL);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_ring_buffer_activate (sink->ringbuffer, FALSE);
+ gst_ring_buffer_release (sink->ringbuffer);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ /* we release again here because the aqcuire happens when setting the
+ * caps, which happens before we commit the state to PAUSED and thus the
+ * PAUSED->READY state change (see above, where we release the ringbuffer)
+ * might not be called when we get here. */
+ gst_ring_buffer_activate (sink->ringbuffer, FALSE);
+ gst_ring_buffer_release (sink->ringbuffer);
+ gst_ring_buffer_close_device (sink->ringbuffer);
+ GST_OBJECT_LOCK (sink);
+ gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
+ sink->ringbuffer = NULL;
+ GST_OBJECT_UNLOCK (sink);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERRORS */
+open_failed:
+ {
+ /* subclass must post a meaningfull error message */
+ GST_DEBUG_OBJECT (sink, "open failed");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
diff --git a/gst-libs/gst/audio/gstbaseaudiosink.h b/gst-libs/gst/audio/gstbaseaudiosink.h
new file mode 100644
index 0000000..0511a0f
--- /dev/null
+++ b/gst-libs/gst/audio/gstbaseaudiosink.h
@@ -0,0 +1,180 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbaseaudiosink.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.
+ */
+
+/* a base class for audio sinks.
+ *
+ * It uses a ringbuffer to schedule playback of samples. This makes
+ * it very easy to drop or insert samples to align incoming
+ * buffers to the exact playback timestamp.
+ *
+ * Subclasses must provide a ringbuffer pointing to either DMA
+ * memory or regular memory. A subclass should also call a callback
+ * function when it has played N segments in the buffer. The subclass
+ * is free to use a thread to signal this callback, use EIO or any
+ * other mechanism.
+ *
+ * The base class is able to operate in push or pull mode. The chain
+ * mode will queue the samples in the ringbuffer as much as possible.
+ * The available space is calculated in the callback function.
+ *
+ * The pull mode will pull_range() a new buffer of N samples with a
+ * configurable latency. This allows for high-end real time
+ * audio processing pipelines driven by the audiosink. The callback
+ * function will be used to perform a pull_range() on the sinkpad.
+ * The thread scheduling the callback can be a real-time thread.
+ *
+ * Subclasses must implement a GstRingBuffer in addition to overriding
+ * the methods in GstBaseSink and this class.
+ */
+
+#ifndef __GST_BASE_AUDIO_SINK_H__
+#define __GST_BASE_AUDIO_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+#include "gstringbuffer.h"
+#include "gstaudioclock.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_AUDIO_SINK (gst_base_audio_sink_get_type())
+#define GST_BASE_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_AUDIO_SINK,GstBaseAudioSink))
+#define GST_BASE_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_AUDIO_SINK,GstBaseAudioSinkClass))
+#define GST_BASE_AUDIO_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BASE_AUDIO_SINK, GstBaseAudioSinkClass))
+#define GST_IS_BASE_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_AUDIO_SINK))
+#define GST_IS_BASE_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_AUDIO_SINK))
+
+/**
+ * GST_BASE_AUDIO_SINK_CLOCK:
+ * @obj: a #GstBaseAudioSink
+ *
+ * Get the #GstClock of @obj.
+ */
+#define GST_BASE_AUDIO_SINK_CLOCK(obj) (GST_BASE_AUDIO_SINK (obj)->clock)
+/**
+ * GST_BASE_AUDIO_SINK_PAD:
+ * @obj: a #GstBaseAudioSink
+ *
+ * Get the sink #GstPad of @obj.
+ */
+#define GST_BASE_AUDIO_SINK_PAD(obj) (GST_BASE_SINK (obj)->sinkpad)
+
+/**
+ * GstBaseAudioSinkSlaveMethod:
+ * @GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE: Resample to match the master clock
+ * @GST_BASE_AUDIO_SINK_SLAVE_SKEW: Adjust playout pointer when master clock
+ * drifts too much.
+ * @GST_BASE_AUDIO_SINK_SLAVE_NONE: No adjustment is done.
+ *
+ * Different possible clock slaving algorithms used when the internal audio
+ * clock is not selected as the pipeline master clock.
+ */
+typedef enum
+{
+ GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE,
+ GST_BASE_AUDIO_SINK_SLAVE_SKEW,
+ GST_BASE_AUDIO_SINK_SLAVE_NONE
+} GstBaseAudioSinkSlaveMethod;
+
+#define GST_TYPE_BASE_AUDIO_SINK_SLAVE_METHOD (gst_base_audio_sink_slave_method_get_type ())
+
+typedef struct _GstBaseAudioSink GstBaseAudioSink;
+typedef struct _GstBaseAudioSinkClass GstBaseAudioSinkClass;
+typedef struct _GstBaseAudioSinkPrivate GstBaseAudioSinkPrivate;
+
+/**
+ * GstBaseAudioSink:
+ *
+ * Opaque #GstBaseAudioSink.
+ */
+struct _GstBaseAudioSink {
+ GstBaseSink element;
+
+ /*< protected >*/ /* with LOCK */
+ /* our ringbuffer */
+ GstRingBuffer *ringbuffer;
+
+ /* required buffer and latency in microseconds */
+ guint64 buffer_time;
+ guint64 latency_time;
+
+ /* the next sample to write */
+ guint64 next_sample;
+
+ /* clock */
+ gboolean provide_clock;
+ GstClock *provided_clock;
+
+ /* with g_atomic_; currently rendering eos */
+ gboolean eos_rendering;
+
+ /*< private >*/
+ GstBaseAudioSinkPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstBaseAudioSinkClass:
+ * @parent_class: the parent class.
+ * @create_ringbuffer: create and return a #GstRingBuffer to write to.
+ * @payload: payload data in a format suitable to write to the sink. If no
+ * payloading is required, returns a reffed copy of the original
+ * buffer, else returns the payloaded buffer with all other metadata
+ * copied. (Since: 0.10.35)
+ *
+ * #GstBaseAudioSink class. Override the vmethod to implement
+ * functionality.
+ */
+struct _GstBaseAudioSinkClass {
+ GstBaseSinkClass parent_class;
+
+ /* subclass ringbuffer allocation */
+ GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSink *sink);
+
+ /* subclass payloader */
+ GstBuffer* (*payload) (GstBaseAudioSink *sink,
+ GstBuffer *buffer);
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_base_audio_sink_get_type(void);
+GType gst_base_audio_sink_slave_method_get_type (void);
+
+GstRingBuffer *gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink);
+
+void gst_base_audio_sink_set_provide_clock (GstBaseAudioSink *sink, gboolean provide);
+gboolean gst_base_audio_sink_get_provide_clock (GstBaseAudioSink *sink);
+
+void gst_base_audio_sink_set_slave_method (GstBaseAudioSink *sink,
+ GstBaseAudioSinkSlaveMethod method);
+GstBaseAudioSinkSlaveMethod
+ gst_base_audio_sink_get_slave_method (GstBaseAudioSink *sink);
+
+void gst_base_audio_sink_set_drift_tolerance (GstBaseAudioSink *sink,
+ gint64 drift_tolerance);
+gint64 gst_base_audio_sink_get_drift_tolerance (GstBaseAudioSink *sink);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_AUDIO_SINK_H__ */
diff --git a/gst-libs/gst/audio/gstbaseaudiosrc.c b/gst-libs/gst/audio/gstbaseaudiosrc.c
new file mode 100644
index 0000000..23c8987
--- /dev/null
+++ b/gst-libs/gst/audio/gstbaseaudiosrc.c
@@ -0,0 +1,1153 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbaseaudiosrc.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:gstbaseaudiosrc
+ * @short_description: Base class for audio sources
+ * @see_also: #GstAudioSrc, #GstRingBuffer.
+ *
+ * This is the base class for audio sources. Subclasses need to implement the
+ * ::create_ringbuffer vmethod. This base class will then take care of
+ * reading samples from the ringbuffer, synchronisation and flushing.
+ *
+ * Last reviewed on 2006-09-27 (0.10.12)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gstbaseaudiosrc.h"
+
+#include "gst/gst-i18n-plugin.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_audio_src_debug);
+#define GST_CAT_DEFAULT gst_base_audio_src_debug
+
+GType
+gst_base_audio_src_slave_method_get_type (void)
+{
+ static volatile gsize slave_method_type = 0;
+ /* FIXME 0.11: nick should be "retimestamp" not "re-timestamp" */
+ static const GEnumValue slave_method[] = {
+ {GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE,
+ "GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE", "resample"},
+ {GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP,
+ "GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP", "re-timestamp"},
+ {GST_BASE_AUDIO_SRC_SLAVE_SKEW, "GST_BASE_AUDIO_SRC_SLAVE_SKEW", "skew"},
+ {GST_BASE_AUDIO_SRC_SLAVE_NONE, "GST_BASE_AUDIO_SRC_SLAVE_NONE", "none"},
+ {0, NULL, NULL},
+ };
+
+ if (g_once_init_enter (&slave_method_type)) {
+ GType tmp =
+ g_enum_register_static ("GstBaseAudioSrcSlaveMethod", slave_method);
+ g_once_init_leave (&slave_method_type, tmp);
+ }
+ return (GType) slave_method_type;
+}
+
+#define GST_BASE_AUDIO_SRC_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_AUDIO_SRC, GstBaseAudioSrcPrivate))
+
+struct _GstBaseAudioSrcPrivate
+{
+ gboolean provide_clock;
+
+ /* the clock slaving algorithm in use */
+ GstBaseAudioSrcSlaveMethod slave_method;
+};
+
+/* BaseAudioSrc signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_BUFFER_TIME ((200 * GST_MSECOND) / GST_USECOND)
+#define DEFAULT_LATENCY_TIME ((10 * GST_MSECOND) / GST_USECOND)
+#define DEFAULT_ACTUAL_BUFFER_TIME -1
+#define DEFAULT_ACTUAL_LATENCY_TIME -1
+#define DEFAULT_PROVIDE_CLOCK TRUE
+#define DEFAULT_SLAVE_METHOD GST_BASE_AUDIO_SRC_SLAVE_SKEW
+
+enum
+{
+ PROP_0,
+ PROP_BUFFER_TIME,
+ PROP_LATENCY_TIME,
+ PROP_ACTUAL_BUFFER_TIME,
+ PROP_ACTUAL_LATENCY_TIME,
+ PROP_PROVIDE_CLOCK,
+ PROP_SLAVE_METHOD,
+ PROP_LAST
+};
+
+static void
+_do_init (GType type)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_base_audio_src_debug, "baseaudiosrc", 0,
+ "baseaudiosrc element");
+
+#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 */
+}
+
+#define gst_base_audio_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstBaseAudioSrc, gst_base_audio_src, GST_TYPE_PUSH_SRC,
+ _do_init (g_define_type_id));
+
+static void gst_base_audio_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_audio_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_base_audio_src_dispose (GObject * object);
+
+static GstStateChangeReturn gst_base_audio_src_change_state (GstElement *
+ element, GstStateChange transition);
+
+static GstClock *gst_base_audio_src_provide_clock (GstElement * elem);
+static GstClockTime gst_base_audio_src_get_time (GstClock * clock,
+ GstBaseAudioSrc * src);
+
+static GstFlowReturn gst_base_audio_src_create (GstBaseSrc * bsrc,
+ guint64 offset, guint length, GstBuffer ** buf);
+
+static gboolean gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event);
+static void gst_base_audio_src_get_times (GstBaseSrc * bsrc,
+ GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
+static gboolean gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
+static gboolean gst_base_audio_src_query (GstBaseSrc * bsrc, GstQuery * query);
+static void gst_base_audio_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
+
+/* static guint gst_base_audio_src_signals[LAST_SIGNAL] = { 0 }; */
+
+static void
+gst_base_audio_src_class_init (GstBaseAudioSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstBaseAudioSrcPrivate));
+
+ gobject_class->set_property = gst_base_audio_src_set_property;
+ gobject_class->get_property = gst_base_audio_src_get_property;
+ gobject_class->dispose = gst_base_audio_src_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_BUFFER_TIME,
+ g_param_spec_int64 ("buffer-time", "Buffer Time",
+ "Size of audio buffer in microseconds", 1,
+ G_MAXINT64, DEFAULT_BUFFER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_LATENCY_TIME,
+ g_param_spec_int64 ("latency-time", "Latency Time",
+ "Audio latency in microseconds", 1,
+ G_MAXINT64, DEFAULT_LATENCY_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseAudioSrc:actual-buffer-time:
+ *
+ * Actual configured size of audio buffer in microseconds.
+ *
+ * Since: 0.10.20
+ **/
+ g_object_class_install_property (gobject_class, PROP_ACTUAL_BUFFER_TIME,
+ g_param_spec_int64 ("actual-buffer-time", "Actual Buffer Time",
+ "Actual configured size of audio buffer in microseconds",
+ DEFAULT_ACTUAL_BUFFER_TIME, G_MAXINT64, DEFAULT_ACTUAL_BUFFER_TIME,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseAudioSrc:actual-latency-time:
+ *
+ * Actual configured audio latency in microseconds.
+ *
+ * Since: 0.10.20
+ **/
+ g_object_class_install_property (gobject_class, PROP_ACTUAL_LATENCY_TIME,
+ g_param_spec_int64 ("actual-latency-time", "Actual Latency Time",
+ "Actual configured audio latency in microseconds",
+ DEFAULT_ACTUAL_LATENCY_TIME, G_MAXINT64, DEFAULT_ACTUAL_LATENCY_TIME,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_PROVIDE_CLOCK,
+ g_param_spec_boolean ("provide-clock", "Provide Clock",
+ "Provide a clock to be used as the global pipeline clock",
+ DEFAULT_PROVIDE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SLAVE_METHOD,
+ g_param_spec_enum ("slave-method", "Slave Method",
+ "Algorithm to use to match the rate of the masterclock",
+ GST_TYPE_BASE_AUDIO_SRC_SLAVE_METHOD, DEFAULT_SLAVE_METHOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_audio_src_change_state);
+ gstelement_class->provide_clock =
+ GST_DEBUG_FUNCPTR (gst_base_audio_src_provide_clock);
+
+ gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_base_audio_src_setcaps);
+ gstbasesrc_class->event = GST_DEBUG_FUNCPTR (gst_base_audio_src_event);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_base_audio_src_query);
+ gstbasesrc_class->get_times =
+ GST_DEBUG_FUNCPTR (gst_base_audio_src_get_times);
+ gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_base_audio_src_create);
+ gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_base_audio_src_fixate);
+
+ /* ref class from a thread-safe context to work around missing bit of
+ * thread-safety in GObject */
+ g_type_class_ref (GST_TYPE_AUDIO_CLOCK);
+ g_type_class_ref (GST_TYPE_RING_BUFFER);
+}
+
+static void
+gst_base_audio_src_init (GstBaseAudioSrc * baseaudiosrc)
+{
+ baseaudiosrc->priv = GST_BASE_AUDIO_SRC_GET_PRIVATE (baseaudiosrc);
+
+ baseaudiosrc->buffer_time = DEFAULT_BUFFER_TIME;
+ baseaudiosrc->latency_time = DEFAULT_LATENCY_TIME;
+ baseaudiosrc->priv->provide_clock = DEFAULT_PROVIDE_CLOCK;
+ baseaudiosrc->priv->slave_method = DEFAULT_SLAVE_METHOD;
+ /* reset blocksize we use latency time to calculate a more useful
+ * value based on negotiated format. */
+ GST_BASE_SRC (baseaudiosrc)->blocksize = 0;
+
+ baseaudiosrc->clock = gst_audio_clock_new ("GstAudioSrcClock",
+ (GstAudioClockGetTimeFunc) gst_base_audio_src_get_time, baseaudiosrc);
+
+ /* we are always a live source */
+ gst_base_src_set_live (GST_BASE_SRC (baseaudiosrc), TRUE);
+ /* we operate in time */
+ gst_base_src_set_format (GST_BASE_SRC (baseaudiosrc), GST_FORMAT_TIME);
+}
+
+static void
+gst_base_audio_src_dispose (GObject * object)
+{
+ GstBaseAudioSrc *src;
+
+ src = GST_BASE_AUDIO_SRC (object);
+
+ GST_OBJECT_LOCK (src);
+ if (src->clock) {
+ gst_audio_clock_invalidate (src->clock);
+ gst_object_unref (src->clock);
+ src->clock = NULL;
+ }
+
+ if (src->ringbuffer) {
+ gst_object_unparent (GST_OBJECT_CAST (src->ringbuffer));
+ src->ringbuffer = NULL;
+ }
+ GST_OBJECT_UNLOCK (src);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static GstClock *
+gst_base_audio_src_provide_clock (GstElement * elem)
+{
+ GstBaseAudioSrc *src;
+ GstClock *clock;
+
+ src = GST_BASE_AUDIO_SRC (elem);
+
+ /* we have no ringbuffer (must be NULL state) */
+ if (src->ringbuffer == NULL)
+ goto wrong_state;
+
+ if (!gst_ring_buffer_is_acquired (src->ringbuffer))
+ goto wrong_state;
+
+ GST_OBJECT_LOCK (src);
+ if (!src->priv->provide_clock)
+ goto clock_disabled;
+
+ clock = GST_CLOCK_CAST (gst_object_ref (src->clock));
+ GST_OBJECT_UNLOCK (src);
+
+ return clock;
+
+ /* ERRORS */
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (src, "ringbuffer not acquired");
+ return NULL;
+ }
+clock_disabled:
+ {
+ GST_DEBUG_OBJECT (src, "clock provide disabled");
+ GST_OBJECT_UNLOCK (src);
+ return NULL;
+ }
+}
+
+static GstClockTime
+gst_base_audio_src_get_time (GstClock * clock, GstBaseAudioSrc * src)
+{
+ guint64 raw, samples;
+ guint delay;
+ GstClockTime result;
+
+ if (G_UNLIKELY (src->ringbuffer == NULL
+ || src->ringbuffer->spec.info.rate == 0))
+ return GST_CLOCK_TIME_NONE;
+
+ raw = samples = gst_ring_buffer_samples_done (src->ringbuffer);
+
+ /* the number of samples not yet processed, this is still queued in the
+ * device (not yet read for capture). */
+ delay = gst_ring_buffer_delay (src->ringbuffer);
+
+ samples += delay;
+
+ result = gst_util_uint64_scale_int (samples, GST_SECOND,
+ src->ringbuffer->spec.info.rate);
+
+ GST_DEBUG_OBJECT (src,
+ "processed samples: raw %" G_GUINT64_FORMAT ", delay %u, real %"
+ G_GUINT64_FORMAT ", time %" GST_TIME_FORMAT, raw, delay, samples,
+ GST_TIME_ARGS (result));
+
+ return result;
+}
+
+/**
+ * gst_base_audio_src_set_provide_clock:
+ * @src: a #GstBaseAudioSrc
+ * @provide: new state
+ *
+ * Controls whether @src will provide a clock or not. If @provide is %TRUE,
+ * gst_element_provide_clock() will return a clock that reflects the datarate
+ * of @src. If @provide is %FALSE, gst_element_provide_clock() will return NULL.
+ *
+ * Since: 0.10.16
+ */
+void
+gst_base_audio_src_set_provide_clock (GstBaseAudioSrc * src, gboolean provide)
+{
+ g_return_if_fail (GST_IS_BASE_AUDIO_SRC (src));
+
+ GST_OBJECT_LOCK (src);
+ src->priv->provide_clock = provide;
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_audio_src_get_provide_clock:
+ * @src: a #GstBaseAudioSrc
+ *
+ * Queries whether @src will provide a clock or not. See also
+ * gst_base_audio_src_set_provide_clock.
+ *
+ * Returns: %TRUE if @src will provide a clock.
+ *
+ * Since: 0.10.16
+ */
+gboolean
+gst_base_audio_src_get_provide_clock (GstBaseAudioSrc * src)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_AUDIO_SRC (src), FALSE);
+
+ GST_OBJECT_LOCK (src);
+ result = src->priv->provide_clock;
+ GST_OBJECT_UNLOCK (src);
+
+ return result;
+}
+
+/**
+ * gst_base_audio_src_set_slave_method:
+ * @src: a #GstBaseAudioSrc
+ * @method: the new slave method
+ *
+ * Controls how clock slaving will be performed in @src.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_base_audio_src_set_slave_method (GstBaseAudioSrc * src,
+ GstBaseAudioSrcSlaveMethod method)
+{
+ g_return_if_fail (GST_IS_BASE_AUDIO_SRC (src));
+
+ GST_OBJECT_LOCK (src);
+ src->priv->slave_method = method;
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_audio_src_get_slave_method:
+ * @src: a #GstBaseAudioSrc
+ *
+ * Get the current slave method used by @src.
+ *
+ * Returns: The current slave method used by @src.
+ *
+ * Since: 0.10.20
+ */
+GstBaseAudioSrcSlaveMethod
+gst_base_audio_src_get_slave_method (GstBaseAudioSrc * src)
+{
+ GstBaseAudioSrcSlaveMethod result;
+
+ g_return_val_if_fail (GST_IS_BASE_AUDIO_SRC (src), -1);
+
+ GST_OBJECT_LOCK (src);
+ result = src->priv->slave_method;
+ GST_OBJECT_UNLOCK (src);
+
+ return result;
+}
+
+static void
+gst_base_audio_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseAudioSrc *src;
+
+ src = GST_BASE_AUDIO_SRC (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_TIME:
+ src->buffer_time = g_value_get_int64 (value);
+ break;
+ case PROP_LATENCY_TIME:
+ src->latency_time = g_value_get_int64 (value);
+ break;
+ case PROP_PROVIDE_CLOCK:
+ gst_base_audio_src_set_provide_clock (src, g_value_get_boolean (value));
+ break;
+ case PROP_SLAVE_METHOD:
+ gst_base_audio_src_set_slave_method (src, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_audio_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBaseAudioSrc *src;
+
+ src = GST_BASE_AUDIO_SRC (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_TIME:
+ g_value_set_int64 (value, src->buffer_time);
+ break;
+ case PROP_LATENCY_TIME:
+ g_value_set_int64 (value, src->latency_time);
+ break;
+ case PROP_ACTUAL_BUFFER_TIME:
+ GST_OBJECT_LOCK (src);
+ if (src->ringbuffer && src->ringbuffer->acquired)
+ g_value_set_int64 (value, src->ringbuffer->spec.buffer_time);
+ else
+ g_value_set_int64 (value, DEFAULT_ACTUAL_BUFFER_TIME);
+ GST_OBJECT_UNLOCK (src);
+ break;
+ case PROP_ACTUAL_LATENCY_TIME:
+ GST_OBJECT_LOCK (src);
+ if (src->ringbuffer && src->ringbuffer->acquired)
+ g_value_set_int64 (value, src->ringbuffer->spec.latency_time);
+ else
+ g_value_set_int64 (value, DEFAULT_ACTUAL_LATENCY_TIME);
+ GST_OBJECT_UNLOCK (src);
+ break;
+ case PROP_PROVIDE_CLOCK:
+ g_value_set_boolean (value, gst_base_audio_src_get_provide_clock (src));
+ break;
+ case PROP_SLAVE_METHOD:
+ g_value_set_enum (value, gst_base_audio_src_get_slave_method (src));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_audio_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ GstStructure *s;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ /* fields for all formats */
+ gst_structure_fixate_field_nearest_int (s, "rate", GST_AUDIO_DEF_RATE);
+ gst_structure_fixate_field_nearest_int (s, "channels",
+ GST_AUDIO_DEF_CHANNELS);
+ gst_structure_fixate_field_string (s, "format", GST_AUDIO_DEF_FORMAT);
+
+ GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps);
+}
+
+static gboolean
+gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
+ GstRingBufferSpec *spec;
+ gint bpf, rate;
+
+ spec = &src->ringbuffer->spec;
+
+ spec->buffer_time = src->buffer_time;
+ spec->latency_time = src->latency_time;
+
+ GST_OBJECT_LOCK (src);
+ if (!gst_ring_buffer_parse_caps (spec, caps)) {
+ GST_OBJECT_UNLOCK (src);
+ goto parse_error;
+ }
+
+ bpf = GST_AUDIO_INFO_BPF (&spec->info);
+ rate = GST_AUDIO_INFO_RATE (&spec->info);
+
+ /* calculate suggested segsize and segtotal */
+ spec->segsize = rate * bpf * spec->latency_time / GST_MSECOND;
+ spec->segtotal = spec->buffer_time / spec->latency_time;
+
+ GST_OBJECT_UNLOCK (src);
+
+ GST_DEBUG ("release old ringbuffer");
+
+ gst_ring_buffer_release (src->ringbuffer);
+
+ gst_ring_buffer_debug_spec_buff (spec);
+
+ GST_DEBUG ("acquire new ringbuffer");
+
+ if (!gst_ring_buffer_acquire (src->ringbuffer, spec))
+ goto acquire_error;
+
+ /* calculate actual latency and buffer times */
+ spec->latency_time = spec->segsize * GST_MSECOND / (rate * bpf);
+ spec->buffer_time =
+ spec->segtotal * spec->segsize * GST_MSECOND / (rate * bpf);
+
+ gst_ring_buffer_debug_spec_buff (spec);
+
+ g_object_notify (G_OBJECT (src), "actual-buffer-time");
+ g_object_notify (G_OBJECT (src), "actual-latency-time");
+
+ return TRUE;
+
+ /* ERRORS */
+parse_error:
+ {
+ GST_DEBUG ("could not parse caps");
+ return FALSE;
+ }
+acquire_error:
+ {
+ GST_DEBUG ("could not acquire ringbuffer");
+ return FALSE;
+ }
+}
+
+static void
+gst_base_audio_src_get_times (GstBaseSrc * bsrc, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ /* no need to sync to a clock here, we schedule the samples based
+ * on our own clock for the moment. */
+ *start = GST_CLOCK_TIME_NONE;
+ *end = GST_CLOCK_TIME_NONE;
+}
+
+static gboolean
+gst_base_audio_src_query (GstBaseSrc * bsrc, GstQuery * query)
+{
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
+ gboolean res = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ GstClockTime min_latency, max_latency;
+ GstRingBufferSpec *spec;
+ gint bpf, rate;
+
+ GST_OBJECT_LOCK (src);
+ if (G_UNLIKELY (src->ringbuffer == NULL
+ || src->ringbuffer->spec.info.rate == 0)) {
+ GST_OBJECT_UNLOCK (src);
+ goto done;
+ }
+
+ spec = &src->ringbuffer->spec;
+ rate = GST_AUDIO_INFO_RATE (&spec->info);
+ bpf = GST_AUDIO_INFO_BPF (&spec->info);
+
+ /* we have at least 1 segment of latency */
+ min_latency =
+ gst_util_uint64_scale_int (spec->segsize, GST_SECOND, rate * bpf);
+ /* we cannot delay more than the buffersize else we lose data */
+ max_latency =
+ gst_util_uint64_scale_int (spec->segtotal * spec->segsize, GST_SECOND,
+ rate * bpf);
+ GST_OBJECT_UNLOCK (src);
+
+ GST_DEBUG_OBJECT (src,
+ "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 segment and the max latency is
+ * the complete buffer of segments. */
+ gst_query_set_latency (query, TRUE, min_latency, max_latency);
+
+ res = TRUE;
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ /* we allow limited pull base operation of which the details
+ * will eventually exposed in an as of yet non-existing query.
+ * Basically pulling can be done on any number of bytes as long
+ * as the offset is -1 or sequentially increasing. */
+ gst_query_set_scheduling (query, TRUE, FALSE, TRUE, 1, -1, 1);
+
+ res = TRUE;
+ break;
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
+ break;
+ }
+done:
+ return res;
+}
+
+static gboolean
+gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event)
+{
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
+ gboolean res;
+
+ res = TRUE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ GST_DEBUG_OBJECT (bsrc, "flush-start");
+ gst_ring_buffer_pause (src->ringbuffer);
+ gst_ring_buffer_clear_all (src->ringbuffer);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (bsrc, "flush-stop");
+ /* always resync on sample after a flush */
+ src->next_sample = -1;
+ gst_ring_buffer_clear_all (src->ringbuffer);
+ break;
+ case GST_EVENT_SEEK:
+ GST_DEBUG_OBJECT (bsrc, "refuse to seek");
+ res = FALSE;
+ break;
+ default:
+ GST_DEBUG_OBJECT (bsrc, "dropping event %p", event);
+ break;
+ }
+ return res;
+}
+
+/* get the next offset in the ringbuffer for reading samples.
+ * If the next sample is too far away, this function will position itself to the
+ * next most recent sample, creating discontinuity */
+static guint64
+gst_base_audio_src_get_offset (GstBaseAudioSrc * src)
+{
+ guint64 sample;
+ gint readseg, segdone, segtotal, sps;
+ gint diff;
+
+ /* assume we can append to the previous sample */
+ sample = src->next_sample;
+
+ sps = src->ringbuffer->samples_per_seg;
+ segtotal = src->ringbuffer->spec.segtotal;
+
+ /* get the currently processed segment */
+ segdone = g_atomic_int_get (&src->ringbuffer->segdone)
+ - src->ringbuffer->segbase;
+
+ if (sample != -1) {
+ GST_DEBUG_OBJECT (src, "at segment %d and sample %" G_GUINT64_FORMAT,
+ segdone, sample);
+ /* figure out the segment and the offset inside the segment where
+ * the sample should be read from. */
+ readseg = sample / sps;
+
+ /* see how far away it is from the read segment, normally segdone (where new
+ * data is written in the ringbuffer) is bigger than readseg (where we are
+ * reading). */
+ diff = segdone - readseg;
+ if (diff >= segtotal) {
+ GST_DEBUG_OBJECT (src, "dropped, align to segment %d", segdone);
+ /* sample would be dropped, position to next playable position */
+ sample = ((guint64) (segdone)) * sps;
+ }
+ } else {
+ /* no previous sample, go to the current position */
+ GST_DEBUG_OBJECT (src, "first sample, align to current %d", segdone);
+ sample = ((guint64) (segdone)) * sps;
+ readseg = segdone;
+ }
+
+ GST_DEBUG_OBJECT (src,
+ "reading from %d, we are at %d, sample %" G_GUINT64_FORMAT, readseg,
+ segdone, sample);
+
+ return sample;
+}
+
+static GstFlowReturn
+gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
+ GstBuffer ** outbuf)
+{
+ GstFlowReturn ret;
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
+ GstBuffer *buf;
+ guchar *data, *ptr;
+ guint samples, total_samples;
+ guint64 sample;
+ gint bpf, rate;
+ GstRingBuffer *ringbuffer;
+ GstRingBufferSpec *spec;
+ guint read;
+ GstClockTime timestamp, duration;
+ GstClock *clock;
+
+ ringbuffer = src->ringbuffer;
+ spec = &ringbuffer->spec;
+
+ if (G_UNLIKELY (!gst_ring_buffer_is_acquired (ringbuffer)))
+ goto wrong_state;
+
+ bpf = GST_AUDIO_INFO_BPF (&spec->info);
+ rate = GST_AUDIO_INFO_RATE (&spec->info);
+
+ if ((length == 0 && bsrc->blocksize == 0) || length == -1)
+ /* no length given, use the default segment size */
+ length = spec->segsize;
+ else
+ /* make sure we round down to an integral number of samples */
+ length -= length % bpf;
+
+ /* figure out the offset in the ringbuffer */
+ if (G_UNLIKELY (offset != -1)) {
+ sample = offset / bpf;
+ /* if a specific offset was given it must be the next sequential
+ * offset we expect or we fail for now. */
+ if (src->next_sample != -1 && sample != src->next_sample)
+ goto wrong_offset;
+ } else {
+ /* calculate the sequentially next sample we need to read. This can jump and
+ * create a DISCONT. */
+ sample = gst_base_audio_src_get_offset (src);
+ }
+
+ GST_DEBUG_OBJECT (src, "reading from sample %" G_GUINT64_FORMAT " length %u",
+ sample, length);
+
+ /* get the number of samples to read */
+ total_samples = samples = length / bpf;
+
+ /* use the basesrc allocation code to use bufferpools or custom allocators */
+ ret = GST_BASE_SRC_CLASS (parent_class)->alloc (bsrc, offset, length, &buf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto alloc_failed;
+
+ data = ptr = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ do {
+ read = gst_ring_buffer_read (ringbuffer, sample, ptr, samples);
+ GST_DEBUG_OBJECT (src, "read %u of %u", read, samples);
+ /* if we read all, we're done */
+ if (read == samples)
+ break;
+
+ /* else something interrupted us and we wait for playing again. */
+ GST_DEBUG_OBJECT (src, "wait playing");
+ if (gst_base_src_wait_playing (bsrc) != GST_FLOW_OK)
+ goto stopped;
+
+ GST_DEBUG_OBJECT (src, "continue playing");
+
+ /* read next samples */
+ sample += read;
+ samples -= read;
+ ptr += read * bpf;
+ } while (TRUE);
+ gst_buffer_unmap (buf, data, length);
+
+ /* mark discontinuity if needed */
+ if (G_UNLIKELY (sample != src->next_sample) && src->next_sample != -1) {
+ GST_WARNING_OBJECT (src,
+ "create DISCONT of %" G_GUINT64_FORMAT " samples at sample %"
+ G_GUINT64_FORMAT, sample - src->next_sample, sample);
+ GST_ELEMENT_WARNING (src, CORE, CLOCK,
+ (_("Can't record audio fast enough")),
+ ("Dropped %" G_GUINT64_FORMAT " samples. This is most likely because "
+ "downstream can't keep up and is consuming samples too slowly.",
+ sample - src->next_sample));
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ }
+
+ src->next_sample = sample + samples;
+
+ /* get the normal timestamp to get the duration. */
+ timestamp = gst_util_uint64_scale_int (sample, GST_SECOND, rate);
+ duration = gst_util_uint64_scale_int (src->next_sample, GST_SECOND,
+ rate) - timestamp;
+
+ GST_OBJECT_LOCK (src);
+ if (!(clock = GST_ELEMENT_CLOCK (src)))
+ goto no_sync;
+
+ if (clock != src->clock) {
+ /* we are slaved, check how to handle this */
+ switch (src->priv->slave_method) {
+ case GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE:
+ /* not implemented, use skew algorithm. This algorithm should
+ * work on the readout pointer and produces more or less samples based
+ * on the clock drift */
+ case GST_BASE_AUDIO_SRC_SLAVE_SKEW:
+ {
+ GstClockTime running_time;
+ GstClockTime base_time;
+ GstClockTime current_time;
+ guint64 running_time_sample;
+ gint running_time_segment;
+ gint last_read_segment;
+ gint segment_skew;
+ gint sps;
+ gint segments_written;
+ gint last_written_segment;
+
+ /* get the amount of segments written from the device by now */
+ segments_written = g_atomic_int_get (&ringbuffer->segdone);
+
+ /* subtract the base to segments_written to get the number of the
+ last written segment in the ringbuffer (one segment written = segment 0) */
+ last_written_segment = segments_written - ringbuffer->segbase - 1;
+
+ /* samples per segment */
+ sps = ringbuffer->samples_per_seg;
+
+ /* get the current time */
+ current_time = gst_clock_get_time (clock);
+
+ /* get the basetime */
+ base_time = GST_ELEMENT_CAST (src)->base_time;
+
+ /* get the running_time */
+ running_time = current_time - base_time;
+
+ /* the running_time converted to a sample (relative to the ringbuffer) */
+ running_time_sample =
+ gst_util_uint64_scale_int (running_time, rate, GST_SECOND);
+
+ /* the segmentnr corrensponding to running_time, round down */
+ running_time_segment = running_time_sample / sps;
+
+ /* the segment currently read from the ringbuffer */
+ last_read_segment = sample / sps;
+
+ /* the skew we have between running_time and the ringbuffertime (last written to) */
+ segment_skew = running_time_segment - last_written_segment;
+
+ GST_DEBUG_OBJECT (bsrc,
+ "\n running_time = %"
+ GST_TIME_FORMAT
+ "\n timestamp = %"
+ GST_TIME_FORMAT
+ "\n running_time_segment = %d"
+ "\n last_written_segment = %d"
+ "\n segment_skew (running time segment - last_written_segment) = %d"
+ "\n last_read_segment = %d",
+ GST_TIME_ARGS (running_time), GST_TIME_ARGS (timestamp),
+ running_time_segment, last_written_segment, segment_skew,
+ last_read_segment);
+
+ /* Resync the ringbuffer if:
+ *
+ * 1. We are more than the length of the ringbuffer behind.
+ * The length of the ringbuffer then gets to dictate
+ * the threshold for what is concidered "too late"
+ *
+ * 2. If this is our first buffer.
+ * We know that we should catch up to running_time
+ * the first time we are ran.
+ */
+ if ((segment_skew >= ringbuffer->spec.segtotal) ||
+ (last_read_segment == 0)) {
+ gint new_read_segment;
+ gint segment_diff;
+ guint64 new_sample;
+
+ /* the difference between running_time and the last written segment */
+ segment_diff = running_time_segment - last_written_segment;
+
+ /* advance the ringbuffer */
+ gst_ring_buffer_advance (ringbuffer, segment_diff);
+
+ /* we move the new read segment to the last known written segment */
+ new_read_segment =
+ g_atomic_int_get (&ringbuffer->segdone) - ringbuffer->segbase;
+
+ /* we calculate the new sample value */
+ new_sample = ((guint64) new_read_segment) * sps;
+
+ /* and get the relative time to this -> our new timestamp */
+ timestamp = gst_util_uint64_scale_int (new_sample, GST_SECOND, rate);
+
+ /* we update the next sample accordingly */
+ src->next_sample = new_sample + samples;
+
+ GST_DEBUG_OBJECT (bsrc,
+ "Timeshifted the ringbuffer with %d segments: "
+ "Updating the timestamp to %" GST_TIME_FORMAT ", "
+ "and src->next_sample to %" G_GUINT64_FORMAT, segment_diff,
+ GST_TIME_ARGS (timestamp), src->next_sample);
+ }
+ break;
+ }
+ case GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP:
+ {
+ GstClockTime base_time, latency;
+
+ /* We are slaved to another clock, take running time of the pipeline clock and
+ * timestamp against it. Somebody else in the pipeline should figure out the
+ * clock drift. We keep the duration we calculated above. */
+ timestamp = gst_clock_get_time (clock);
+ base_time = GST_ELEMENT_CAST (src)->base_time;
+
+ if (GST_CLOCK_DIFF (timestamp, base_time) < 0)
+ timestamp -= base_time;
+ else
+ timestamp = 0;
+
+ /* subtract latency */
+ latency = gst_util_uint64_scale_int (total_samples, GST_SECOND, rate);
+ if (timestamp > latency)
+ timestamp -= latency;
+ else
+ timestamp = 0;
+ }
+ case GST_BASE_AUDIO_SRC_SLAVE_NONE:
+ break;
+ }
+ } else {
+ GstClockTime base_time;
+
+ /* to get the timestamp against the clock we also need to add our offset */
+ timestamp = gst_audio_clock_adjust (clock, timestamp);
+
+ /* we are not slaved, subtract base_time */
+ base_time = GST_ELEMENT_CAST (src)->base_time;
+
+ if (GST_CLOCK_DIFF (timestamp, base_time) < 0) {
+ timestamp -= base_time;
+ GST_LOG_OBJECT (src,
+ "buffer timestamp %" GST_TIME_FORMAT " (base_time %" GST_TIME_FORMAT
+ ")", GST_TIME_ARGS (timestamp), GST_TIME_ARGS (base_time));
+ } else {
+ GST_LOG_OBJECT (src,
+ "buffer timestamp 0, ts %" GST_TIME_FORMAT " <= base_time %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (timestamp),
+ GST_TIME_ARGS (base_time));
+ timestamp = 0;
+ }
+ }
+
+no_sync:
+ GST_OBJECT_UNLOCK (src);
+
+ GST_BUFFER_TIMESTAMP (buf) = timestamp;
+ GST_BUFFER_DURATION (buf) = duration;
+ GST_BUFFER_OFFSET (buf) = sample;
+ GST_BUFFER_OFFSET_END (buf) = sample + samples;
+
+ *outbuf = buf;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (src, "ringbuffer in wrong state");
+ return GST_FLOW_WRONG_STATE;
+ }
+wrong_offset:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, SEEK,
+ (NULL), ("resource can only be operated on sequentially but offset %"
+ G_GUINT64_FORMAT " was given", offset));
+ return GST_FLOW_ERROR;
+ }
+alloc_failed:
+ {
+ GST_DEBUG_OBJECT (src, "alloc failed: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+stopped:
+ {
+ gst_buffer_unref (buf);
+ GST_DEBUG_OBJECT (src, "ringbuffer stopped");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/**
+ * gst_base_audio_src_create_ringbuffer:
+ * @src: a #GstBaseAudioSrc.
+ *
+ * Create and return the #GstRingBuffer for @src. This function will call the
+ * ::create_ringbuffer vmethod and will set @src as the parent of the returned
+ * buffer (see gst_object_set_parent()).
+ *
+ * Returns: The new ringbuffer of @src.
+ */
+GstRingBuffer *
+gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
+{
+ GstBaseAudioSrcClass *bclass;
+ GstRingBuffer *buffer = NULL;
+
+ bclass = GST_BASE_AUDIO_SRC_GET_CLASS (src);
+ if (bclass->create_ringbuffer)
+ buffer = bclass->create_ringbuffer (src);
+
+ if (G_LIKELY (buffer))
+ gst_object_set_parent (GST_OBJECT_CAST (buffer), GST_OBJECT_CAST (src));
+
+ return buffer;
+}
+
+static GstStateChangeReturn
+gst_base_audio_src_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_DEBUG_OBJECT (src, "NULL->READY");
+ GST_OBJECT_LOCK (src);
+ if (src->ringbuffer == NULL) {
+ gst_audio_clock_reset (GST_AUDIO_CLOCK (src->clock), 0);
+ src->ringbuffer = gst_base_audio_src_create_ringbuffer (src);
+ }
+ GST_OBJECT_UNLOCK (src);
+ if (!gst_ring_buffer_open_device (src->ringbuffer))
+ goto open_failed;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (src, "READY->PAUSED");
+ src->next_sample = -1;
+ gst_ring_buffer_set_flushing (src->ringbuffer, FALSE);
+ gst_ring_buffer_may_start (src->ringbuffer, FALSE);
+ /* Only post clock-provide messages if this is the clock that
+ * we've created. If the subclass has overriden it the subclass
+ * should post this messages whenever necessary */
+ if (src->clock && GST_IS_AUDIO_CLOCK (src->clock) &&
+ GST_AUDIO_CLOCK_CAST (src->clock)->func ==
+ (GstAudioClockGetTimeFunc) gst_base_audio_src_get_time)
+ gst_element_post_message (element,
+ gst_message_new_clock_provide (GST_OBJECT_CAST (element),
+ src->clock, TRUE));
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_DEBUG_OBJECT (src, "PAUSED->PLAYING");
+ gst_ring_buffer_may_start (src->ringbuffer, TRUE);
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_DEBUG_OBJECT (src, "PLAYING->PAUSED");
+ gst_ring_buffer_may_start (src->ringbuffer, FALSE);
+ gst_ring_buffer_pause (src->ringbuffer);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (src, "PAUSED->READY");
+ /* Only post clock-lost messages if this is the clock that
+ * we've created. If the subclass has overriden it the subclass
+ * should post this messages whenever necessary */
+ if (src->clock && GST_IS_AUDIO_CLOCK (src->clock) &&
+ GST_AUDIO_CLOCK_CAST (src->clock)->func ==
+ (GstAudioClockGetTimeFunc) gst_base_audio_src_get_time)
+ gst_element_post_message (element,
+ gst_message_new_clock_lost (GST_OBJECT_CAST (element), src->clock));
+ gst_ring_buffer_set_flushing (src->ringbuffer, TRUE);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (src, "PAUSED->READY");
+ gst_ring_buffer_release (src->ringbuffer);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_DEBUG_OBJECT (src, "READY->NULL");
+ gst_ring_buffer_close_device (src->ringbuffer);
+ GST_OBJECT_LOCK (src);
+ gst_object_unparent (GST_OBJECT_CAST (src->ringbuffer));
+ src->ringbuffer = NULL;
+ GST_OBJECT_UNLOCK (src);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERRORS */
+open_failed:
+ {
+ /* subclass must post a meaningfull error message */
+ GST_DEBUG_OBJECT (src, "open failed");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+
+}
diff --git a/gst-libs/gst/audio/gstbaseaudiosrc.h b/gst-libs/gst/audio/gstbaseaudiosrc.h
new file mode 100644
index 0000000..b55ac1e
--- /dev/null
+++ b/gst-libs/gst/audio/gstbaseaudiosrc.h
@@ -0,0 +1,146 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbaseaudiosrc.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.
+ */
+
+/* a base class for audio sources.
+ */
+
+#ifndef __GST_BASE_AUDIO_SRC_H__
+#define __GST_BASE_AUDIO_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+#include "gstringbuffer.h"
+#include "gstaudioclock.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_AUDIO_SRC (gst_base_audio_src_get_type())
+#define GST_BASE_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_AUDIO_SRC,GstBaseAudioSrc))
+#define GST_BASE_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_AUDIO_SRC,GstBaseAudioSrcClass))
+#define GST_BASE_AUDIO_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BASE_AUDIO_SRC, GstBaseAudioSrcClass))
+#define GST_IS_BASE_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_AUDIO_SRC))
+#define GST_IS_BASE_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_AUDIO_SRC))
+
+/**
+ * GST_BASE_AUDIO_SRC_CLOCK:
+ * @obj: a #GstBaseAudioSrc
+ *
+ * Get the #GstClock of @obj.
+ */
+#define GST_BASE_AUDIO_SRC_CLOCK(obj) (GST_BASE_AUDIO_SRC (obj)->clock)
+/**
+ * GST_BASE_AUDIO_SRC_PAD:
+ * @obj: a #GstBaseAudioSrc
+ *
+ * Get the source #GstPad of @obj.
+ */
+#define GST_BASE_AUDIO_SRC_PAD(obj) (GST_BASE_SRC (obj)->srcpad)
+
+typedef struct _GstBaseAudioSrc GstBaseAudioSrc;
+typedef struct _GstBaseAudioSrcClass GstBaseAudioSrcClass;
+typedef struct _GstBaseAudioSrcPrivate GstBaseAudioSrcPrivate;
+
+/**
+ * GstBaseAudioSrcSlaveMethod:
+ * @GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE: Resample to match the master clock.
+ * @GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP: Retimestamp output buffers with master
+ * clock time.
+ * @GST_BASE_AUDIO_SRC_SLAVE_SKEW: Adjust capture pointer when master clock
+ * drifts too much.
+ * @GST_BASE_AUDIO_SRC_SLAVE_NONE: No adjustment is done.
+ *
+ * Different possible clock slaving algorithms when the internal audio clock was
+ * not selected as the pipeline clock.
+ */
+typedef enum
+{
+ GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE,
+ GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP,
+ GST_BASE_AUDIO_SRC_SLAVE_SKEW,
+ GST_BASE_AUDIO_SRC_SLAVE_NONE
+} GstBaseAudioSrcSlaveMethod;
+
+#define GST_TYPE_BASE_AUDIO_SRC_SLAVE_METHOD (gst_base_audio_src_slave_method_get_type ())
+
+/**
+ * GstBaseAudioSrc:
+ *
+ * Opaque #GstBaseAudioSrc.
+ */
+struct _GstBaseAudioSrc {
+ GstPushSrc element;
+
+ /*< protected >*/ /* with LOCK */
+ /* our ringbuffer */
+ GstRingBuffer *ringbuffer;
+
+ /* required buffer and latency */
+ GstClockTime buffer_time;
+ GstClockTime latency_time;
+
+ /* the next sample to write */
+ guint64 next_sample;
+
+ /* clock */
+ GstClock *clock;
+
+ /*< private >*/
+ GstBaseAudioSrcPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+/**
+ * GstBaseAudioSrcClass:
+ * @parent_class: the parent class.
+ * @create_ringbuffer: create and return a #GstRingBuffer to read from.
+ *
+ * #GstBaseAudioSrc class. Override the vmethod to implement
+ * functionality.
+ */
+struct _GstBaseAudioSrcClass {
+ GstPushSrcClass parent_class;
+
+ /* subclass ringbuffer allocation */
+ GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSrc *src);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_base_audio_src_get_type(void);
+GType gst_base_audio_src_slave_method_get_type (void);
+
+GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src);
+
+void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide);
+gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src);
+
+void gst_base_audio_src_set_slave_method (GstBaseAudioSrc *src,
+ GstBaseAudioSrcSlaveMethod method);
+GstBaseAudioSrcSlaveMethod
+ gst_base_audio_src_get_slave_method (GstBaseAudioSrc *src);
+
+
+G_END_DECLS
+
+#endif /* __GST_BASE_AUDIO_SRC_H__ */
diff --git a/gst-libs/gst/audio/gstringbuffer.c b/gst-libs/gst/audio/gstringbuffer.c
new file mode 100644
index 0000000..ebbaf64
--- /dev/null
+++ b/gst-libs/gst/audio/gstringbuffer.c
@@ -0,0 +1,1819 @@
+/* GStreamer
+ * Copyright (C) 2005 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.
+ */
+
+/**
+ * SECTION:gstringbuffer
+ * @short_description: Base class for audio ringbuffer implementations
+ * @see_also: #GstBaseAudioSink, #GstAudioSink
+ *
+ * <refsect2>
+ * <para>
+ * This object is the base class for audio ringbuffers used by the base
+ * audio source and sink classes.
+ * </para>
+ * <para>
+ * The ringbuffer abstracts a circular buffer of data. One reader and
+ * one writer can operate on the data from different threads in a lockfree
+ * manner. The base class is sufficiently flexible to be used as an
+ * abstraction for DMA based ringbuffers as well as a pure software
+ * implementations.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2006-02-02 (0.10.4)
+ */
+
+#include <string.h>
+
+#include "gstringbuffer.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_ring_buffer_debug);
+#define GST_CAT_DEFAULT gst_ring_buffer_debug
+
+static void gst_ring_buffer_dispose (GObject * object);
+static void gst_ring_buffer_finalize (GObject * object);
+
+static gboolean gst_ring_buffer_pause_unlocked (GstRingBuffer * buf);
+static void default_clear_all (GstRingBuffer * buf);
+static guint default_commit (GstRingBuffer * buf, guint64 * sample,
+ guchar * data, gint in_samples, gint out_samples, gint * accum);
+
+/* ringbuffer abstract base class */
+G_DEFINE_ABSTRACT_TYPE (GstRingBuffer, gst_ring_buffer, GST_TYPE_OBJECT);
+
+static void
+gst_ring_buffer_class_init (GstRingBufferClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstRingBufferClass *gstringbuffer_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstringbuffer_class = (GstRingBufferClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_ring_buffer_debug, "ringbuffer", 0,
+ "ringbuffer class");
+
+ gobject_class->dispose = gst_ring_buffer_dispose;
+ gobject_class->finalize = gst_ring_buffer_finalize;
+
+ gstringbuffer_class->clear_all = GST_DEBUG_FUNCPTR (default_clear_all);
+ gstringbuffer_class->commit = GST_DEBUG_FUNCPTR (default_commit);
+}
+
+static void
+gst_ring_buffer_init (GstRingBuffer * ringbuffer)
+{
+ ringbuffer->open = FALSE;
+ ringbuffer->acquired = FALSE;
+ ringbuffer->state = GST_RING_BUFFER_STATE_STOPPED;
+ ringbuffer->cond = g_cond_new ();
+ ringbuffer->waiting = 0;
+ ringbuffer->empty_seg = NULL;
+ ringbuffer->flushing = TRUE;
+}
+
+static void
+gst_ring_buffer_dispose (GObject * object)
+{
+ GstRingBuffer *ringbuffer = GST_RING_BUFFER (object);
+
+ gst_caps_replace (&ringbuffer->spec.caps, NULL);
+
+ G_OBJECT_CLASS (gst_ring_buffer_parent_class)->dispose (G_OBJECT
+ (ringbuffer));
+}
+
+static void
+gst_ring_buffer_finalize (GObject * object)
+{
+ GstRingBuffer *ringbuffer = GST_RING_BUFFER (object);
+
+ g_cond_free (ringbuffer->cond);
+ g_free (ringbuffer->empty_seg);
+
+ G_OBJECT_CLASS (gst_ring_buffer_parent_class)->finalize (G_OBJECT
+ (ringbuffer));
+}
+
+#ifndef GST_DISABLE_GST_DEBUG
+static const gchar *format_type_names[] = {
+ "raw",
+ "mu law",
+ "a law",
+ "ima adpcm",
+ "mpeg",
+ "gsm",
+ "iec958",
+ "ac3",
+ "eac3",
+ "dts"
+};
+#endif
+
+/**
+ * gst_ring_buffer_debug_spec_caps:
+ * @spec: the spec to debug
+ *
+ * Print debug info about the parsed caps in @spec to the debug log.
+ */
+void
+gst_ring_buffer_debug_spec_caps (GstRingBufferSpec * spec)
+{
+#if 0
+ gint i, bytes;
+#endif
+
+ GST_DEBUG ("spec caps: %p %" GST_PTR_FORMAT, spec->caps, spec->caps);
+ GST_DEBUG ("parsed caps: type: %d, '%s'", spec->type,
+ format_type_names[spec->type]);
+#if 0
+ GST_DEBUG ("parsed caps: width: %d", spec->width);
+ GST_DEBUG ("parsed caps: sign: %d", spec->sign);
+ GST_DEBUG ("parsed caps: bigend: %d", spec->bigend);
+ GST_DEBUG ("parsed caps: rate: %d", spec->rate);
+ GST_DEBUG ("parsed caps: channels: %d", spec->channels);
+ GST_DEBUG ("parsed caps: sample bytes: %d", spec->bytes_per_sample);
+ bytes = (spec->width >> 3) * spec->channels;
+ for (i = 0; i < bytes; i++) {
+ GST_DEBUG ("silence byte %d: %02x", i, spec->silence_sample[i]);
+ }
+#endif
+}
+
+/**
+ * gst_ring_buffer_debug_spec_buff:
+ * @spec: the spec to debug
+ *
+ * Print debug info about the buffer sized in @spec to the debug log.
+ */
+void
+gst_ring_buffer_debug_spec_buff (GstRingBufferSpec * spec)
+{
+ gint bpf = GST_AUDIO_INFO_BPF (&spec->info);
+
+ GST_DEBUG ("acquire ringbuffer: buffer time: %" G_GINT64_FORMAT " usec",
+ spec->buffer_time);
+ GST_DEBUG ("acquire ringbuffer: latency time: %" G_GINT64_FORMAT " usec",
+ spec->latency_time);
+ GST_DEBUG ("acquire ringbuffer: total segments: %d", spec->segtotal);
+ GST_DEBUG ("acquire ringbuffer: latency segments: %d", spec->seglatency);
+ GST_DEBUG ("acquire ringbuffer: segment size: %d bytes = %d samples",
+ spec->segsize, spec->segsize / bpf);
+ GST_DEBUG ("acquire ringbuffer: buffer size: %d bytes = %d samples",
+ spec->segsize * spec->segtotal, spec->segsize * spec->segtotal / bpf);
+}
+
+/**
+ * gst_ring_buffer_parse_caps:
+ * @spec: a spec
+ * @caps: a #GstCaps
+ *
+ * Parse @caps into @spec.
+ *
+ * Returns: TRUE if the caps could be parsed.
+ */
+gboolean
+gst_ring_buffer_parse_caps (GstRingBufferSpec * spec, GstCaps * caps)
+{
+ const gchar *mimetype;
+ GstStructure *structure;
+ gint i;
+ GstAudioInfo info;
+
+ structure = gst_caps_get_structure (caps, 0);
+ gst_audio_info_init (&info);
+
+ /* we have to differentiate between int and float formats */
+ mimetype = gst_structure_get_name (structure);
+
+ if (g_str_equal (mimetype, "audio/x-raw")) {
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_RAW;
+ } else if (g_str_equal (mimetype, "audio/x-alaw")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate) &&
+ gst_structure_get_int (structure, "channels", &info.channels)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_A_LAW;
+ spec->info.bpf = info.channels;
+ } else if (g_str_equal (mimetype, "audio/x-mulaw")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate) &&
+ gst_structure_get_int (structure, "channels", &info.channels)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_MU_LAW;
+ spec->info.bpf = info.channels;
+ } else if (g_str_equal (mimetype, "audio/x-iec958")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_IEC958;
+ spec->info.bpf = 4;
+ } else if (g_str_equal (mimetype, "audio/x-ac3")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_AC3;
+ spec->info.bpf = 4;
+ } else if (g_str_equal (mimetype, "audio/x-eac3")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_EAC3;
+ spec->info.bpf = 16;
+ } else if (g_str_equal (mimetype, "audio/x-dts")) {
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_DTS;
+ spec->info.bpf = 4;
+ } else if (g_str_equal (mimetype, "audio/mpeg") &&
+ gst_structure_get_int (structure, "mpegaudioversion", &i) &&
+ (i == 1 || i == 2)) {
+ /* Now we know this is MPEG-1 or MPEG-2 (non AAC) */
+ /* extract the needed information from the cap */
+ if (!(gst_structure_get_int (structure, "rate", &info.rate)))
+ goto parse_error;
+
+ spec->type = GST_BUFTYPE_MPEG;
+ spec->info.bpf = 4;
+ } else {
+ goto parse_error;
+ }
+
+ gst_caps_replace (&spec->caps, caps);
+
+ g_return_val_if_fail (spec->latency_time != 0, FALSE);
+
+ /* calculate suggested segsize and segtotal. segsize should be one unit
+ * of 'latency_time' samples, scaling for the fact that latency_time is
+ * currently stored in microseconds (FIXME: in 0.11) */
+ spec->segsize = gst_util_uint64_scale (info.rate * info.bpf,
+ spec->latency_time, GST_SECOND / GST_USECOND);
+ /* Round to an integer number of samples */
+ spec->segsize -= spec->segsize % info.bpf;
+
+ spec->segtotal = spec->buffer_time / spec->latency_time;
+ /* leave the latency undefined now, implementations can change it but if it's
+ * not changed, we assume the same value as segtotal */
+ spec->seglatency = -1;
+
+ spec->info = info;
+
+ gst_ring_buffer_debug_spec_caps (spec);
+ gst_ring_buffer_debug_spec_buff (spec);
+
+ return TRUE;
+
+ /* ERRORS */
+parse_error:
+ {
+ GST_DEBUG ("could not parse caps");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_ring_buffer_convert:
+ * @buf: the #GstRingBuffer
+ * @src_fmt: the source format
+ * @src_val: the source value
+ * @dest_fmt: the destination format
+ * @dest_val: a location to store the converted value
+ *
+ * Convert @src_val in @src_fmt to the equivalent value in @dest_fmt. The result
+ * will be put in @dest_val.
+ *
+ * Returns: TRUE if the conversion succeeded.
+ *
+ * Since: 0.10.22.
+ */
+gboolean
+gst_ring_buffer_convert (GstRingBuffer * buf,
+ GstFormat src_fmt, gint64 src_val, GstFormat dest_fmt, gint64 * dest_val)
+{
+ gboolean res;
+
+ GST_OBJECT_LOCK (buf);
+ res =
+ gst_audio_info_convert (&buf->spec.info, src_fmt, src_val, dest_fmt,
+ dest_val);
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_set_callback:
+ * @buf: the #GstRingBuffer to set the callback on
+ * @cb: the callback to set
+ * @user_data: user data passed to the callback
+ *
+ * Sets the given callback function on the buffer. This function
+ * will be called every time a segment has been written to a device.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_set_callback (GstRingBuffer * buf, GstRingBufferCallback cb,
+ gpointer user_data)
+{
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ GST_OBJECT_LOCK (buf);
+ buf->callback = cb;
+ buf->cb_data = user_data;
+ GST_OBJECT_UNLOCK (buf);
+}
+
+
+/**
+ * gst_ring_buffer_open_device:
+ * @buf: the #GstRingBuffer
+ *
+ * Open the audio device associated with the ring buffer. Does not perform any
+ * setup on the device. You must open the device before acquiring the ring
+ * buffer.
+ *
+ * Returns: TRUE if the device could be opened, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_open_device (GstRingBuffer * buf)
+{
+ gboolean res = TRUE;
+ GstRingBufferClass *rclass;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "opening device");
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (buf->open))
+ goto was_opened;
+
+ buf->open = TRUE;
+
+ /* if this fails, something is wrong in this file */
+ g_assert (!buf->acquired);
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->open_device))
+ res = rclass->open_device (buf);
+
+ if (G_UNLIKELY (!res))
+ goto open_failed;
+
+ GST_DEBUG_OBJECT (buf, "opened device");
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+was_opened:
+ {
+ GST_DEBUG_OBJECT (buf, "Device for ring buffer already open");
+ g_warning ("Device for ring buffer %p already open, fix your code", buf);
+ res = TRUE;
+ goto done;
+ }
+open_failed:
+ {
+ buf->open = FALSE;
+ GST_DEBUG_OBJECT (buf, "failed opening device");
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_close_device:
+ * @buf: the #GstRingBuffer
+ *
+ * Close the audio device associated with the ring buffer. The ring buffer
+ * should already have been released via gst_ring_buffer_release().
+ *
+ * Returns: TRUE if the device could be closed, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_close_device (GstRingBuffer * buf)
+{
+ gboolean res = TRUE;
+ GstRingBufferClass *rclass;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "closing device");
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (!buf->open))
+ goto was_closed;
+
+ if (G_UNLIKELY (buf->acquired))
+ goto was_acquired;
+
+ buf->open = FALSE;
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->close_device))
+ res = rclass->close_device (buf);
+
+ if (G_UNLIKELY (!res))
+ goto close_error;
+
+ GST_DEBUG_OBJECT (buf, "closed device");
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+was_closed:
+ {
+ GST_DEBUG_OBJECT (buf, "Device for ring buffer already closed");
+ g_warning ("Device for ring buffer %p already closed, fix your code", buf);
+ res = TRUE;
+ goto done;
+ }
+was_acquired:
+ {
+ GST_DEBUG_OBJECT (buf, "Resources for ring buffer still acquired");
+ g_critical ("Resources for ring buffer %p still acquired", buf);
+ res = FALSE;
+ goto done;
+ }
+close_error:
+ {
+ buf->open = TRUE;
+ GST_DEBUG_OBJECT (buf, "error closing device");
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_device_is_open:
+ * @buf: the #GstRingBuffer
+ *
+ * Checks the status of the device associated with the ring buffer.
+ *
+ * Returns: TRUE if the device was open, FALSE if it was closed.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_device_is_open (GstRingBuffer * buf)
+{
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_OBJECT_LOCK (buf);
+ res = buf->open;
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_acquire:
+ * @buf: the #GstRingBuffer to acquire
+ * @spec: the specs of the buffer
+ *
+ * Allocate the resources for the ringbuffer. This function fills
+ * in the data pointer of the ring buffer with a valid #GstBuffer
+ * to which samples can be written.
+ *
+ * Returns: TRUE if the device could be acquired, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+ gint segsize, bpf;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "acquiring device %p", buf);
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (!buf->open))
+ goto not_opened;
+
+ if (G_UNLIKELY (buf->acquired))
+ goto was_acquired;
+
+ buf->acquired = TRUE;
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->acquire))
+ res = rclass->acquire (buf, spec);
+
+ if (G_UNLIKELY (!res))
+ goto acquire_failed;
+
+ if (G_UNLIKELY ((bpf = buf->spec.info.bpf) == 0))
+ goto invalid_bpf;
+
+ /* if the seglatency was overwritten with something else than -1, use it, else
+ * assume segtotal as the latency */
+ if (buf->spec.seglatency == -1)
+ buf->spec.seglatency = buf->spec.segtotal;
+
+ segsize = buf->spec.segsize;
+
+ buf->samples_per_seg = segsize / bpf;
+
+ /* create an empty segment */
+ g_free (buf->empty_seg);
+ buf->empty_seg = g_malloc (segsize);
+
+ if (buf->spec.type == GST_BUFTYPE_RAW) {
+ gst_audio_format_fill_silence (buf->spec.info.finfo, buf->empty_seg,
+ segsize);
+ } else {
+ /* FIXME, non-raw formats get 0 as the empty sample */
+ memset (buf->empty_seg, 0, segsize);
+ }
+ GST_DEBUG_OBJECT (buf, "acquired device");
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+not_opened:
+ {
+ GST_DEBUG_OBJECT (buf, "device not opened");
+ g_critical ("Device for %p not opened", buf);
+ res = FALSE;
+ goto done;
+ }
+was_acquired:
+ {
+ res = TRUE;
+ GST_DEBUG_OBJECT (buf, "device was acquired");
+ goto done;
+ }
+acquire_failed:
+ {
+ buf->acquired = FALSE;
+ GST_DEBUG_OBJECT (buf, "failed to acquire device");
+ goto done;
+ }
+invalid_bpf:
+ {
+ g_warning
+ ("invalid bytes_per_frame from acquire ringbuffer %p, fix the element",
+ buf);
+ buf->acquired = FALSE;
+ res = FALSE;
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_release:
+ * @buf: the #GstRingBuffer to release
+ *
+ * Free the resources of the ringbuffer.
+ *
+ * Returns: TRUE if the device could be released, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_release (GstRingBuffer * buf)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "releasing device");
+
+ gst_ring_buffer_stop (buf);
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (!buf->acquired))
+ goto was_released;
+
+ buf->acquired = FALSE;
+
+ /* if this fails, something is wrong in this file */
+ g_assert (buf->open == TRUE);
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->release))
+ res = rclass->release (buf);
+
+ /* signal any waiters */
+ GST_DEBUG_OBJECT (buf, "signal waiter");
+ GST_RING_BUFFER_SIGNAL (buf);
+
+ if (G_UNLIKELY (!res))
+ goto release_failed;
+
+ g_free (buf->empty_seg);
+ buf->empty_seg = NULL;
+ GST_DEBUG_OBJECT (buf, "released device");
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+was_released:
+ {
+ res = TRUE;
+ GST_DEBUG_OBJECT (buf, "device was released");
+ goto done;
+ }
+release_failed:
+ {
+ buf->acquired = TRUE;
+ GST_DEBUG_OBJECT (buf, "failed to release device");
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_is_acquired:
+ * @buf: the #GstRingBuffer to check
+ *
+ * Check if the ringbuffer is acquired and ready to use.
+ *
+ * Returns: TRUE if the ringbuffer is acquired, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_is_acquired (GstRingBuffer * buf)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_OBJECT_LOCK (buf);
+ res = buf->acquired;
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_activate:
+ * @buf: the #GstRingBuffer to activate
+ * @active: the new mode
+ *
+ * Activate @buf to start or stop pulling data.
+ *
+ * MT safe.
+ *
+ * Returns: TRUE if the device could be activated in the requested mode,
+ * FALSE on error.
+ *
+ * Since: 0.10.22.
+ */
+gboolean
+gst_ring_buffer_activate (GstRingBuffer * buf, gboolean active)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "activate device");
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (active && !buf->acquired))
+ goto not_acquired;
+
+ if (G_UNLIKELY (buf->active == active))
+ goto was_active;
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ /* if there is no activate function we assume it was started/released
+ * in the acquire method */
+ if (G_LIKELY (rclass->activate))
+ res = rclass->activate (buf, active);
+ else
+ res = TRUE;
+
+ if (G_UNLIKELY (!res))
+ goto activate_failed;
+
+ buf->active = active;
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+not_acquired:
+ {
+ GST_DEBUG_OBJECT (buf, "device not acquired");
+ g_critical ("Device for %p not acquired", buf);
+ res = FALSE;
+ goto done;
+ }
+was_active:
+ {
+ res = TRUE;
+ GST_DEBUG_OBJECT (buf, "device was active in mode %d", active);
+ goto done;
+ }
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (buf, "failed to activate device");
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_is_active:
+ * @buf: the #GstRingBuffer
+ *
+ * Check if @buf is activated.
+ *
+ * MT safe.
+ *
+ * Returns: TRUE if the device is active.
+ *
+ * Since: 0.10.22.
+ */
+gboolean
+gst_ring_buffer_is_active (GstRingBuffer * buf)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_OBJECT_LOCK (buf);
+ res = buf->active;
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+}
+
+
+/**
+ * gst_ring_buffer_set_flushing:
+ * @buf: the #GstRingBuffer to flush
+ * @flushing: the new mode
+ *
+ * Set the ringbuffer to flushing mode or normal mode.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_set_flushing (GstRingBuffer * buf, gboolean flushing)
+{
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ GST_OBJECT_LOCK (buf);
+ buf->flushing = flushing;
+
+ if (flushing) {
+ gst_ring_buffer_pause_unlocked (buf);
+ } else {
+ gst_ring_buffer_clear_all (buf);
+ }
+ GST_OBJECT_UNLOCK (buf);
+}
+
+/**
+ * gst_ring_buffer_start:
+ * @buf: the #GstRingBuffer to start
+ *
+ * Start processing samples from the ringbuffer.
+ *
+ * Returns: TRUE if the device could be started, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_start (GstRingBuffer * buf)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+ gboolean resume = FALSE;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "starting ringbuffer");
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (buf->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (!buf->acquired))
+ goto not_acquired;
+
+ if (G_UNLIKELY (g_atomic_int_get (&buf->may_start) == FALSE))
+ goto may_not_start;
+
+ /* if stopped, set to started */
+ res = g_atomic_int_compare_and_exchange (&buf->state,
+ GST_RING_BUFFER_STATE_STOPPED, GST_RING_BUFFER_STATE_STARTED);
+
+ if (!res) {
+ GST_DEBUG_OBJECT (buf, "was not stopped, try paused");
+ /* was not stopped, try from paused */
+ res = g_atomic_int_compare_and_exchange (&buf->state,
+ GST_RING_BUFFER_STATE_PAUSED, GST_RING_BUFFER_STATE_STARTED);
+ if (!res) {
+ /* was not paused either, must be started then */
+ res = TRUE;
+ GST_DEBUG_OBJECT (buf, "was not paused, must have been started");
+ goto done;
+ }
+ resume = TRUE;
+ GST_DEBUG_OBJECT (buf, "resuming");
+ }
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (resume) {
+ if (G_LIKELY (rclass->resume))
+ res = rclass->resume (buf);
+ } else {
+ if (G_LIKELY (rclass->start))
+ res = rclass->start (buf);
+ }
+
+ if (G_UNLIKELY (!res)) {
+ buf->state = GST_RING_BUFFER_STATE_PAUSED;
+ GST_DEBUG_OBJECT (buf, "failed to start");
+ } else {
+ GST_DEBUG_OBJECT (buf, "started");
+ }
+
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+flushing:
+ {
+ GST_DEBUG_OBJECT (buf, "we are flushing");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+not_acquired:
+ {
+ GST_DEBUG_OBJECT (buf, "we are not acquired");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+may_not_start:
+ {
+ GST_DEBUG_OBJECT (buf, "we may not start");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_ring_buffer_pause_unlocked (GstRingBuffer * buf)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+
+ GST_DEBUG_OBJECT (buf, "pausing ringbuffer");
+
+ /* if started, set to paused */
+ res = g_atomic_int_compare_and_exchange (&buf->state,
+ GST_RING_BUFFER_STATE_STARTED, GST_RING_BUFFER_STATE_PAUSED);
+
+ if (!res)
+ goto not_started;
+
+ /* signal any waiters */
+ GST_DEBUG_OBJECT (buf, "signal waiter");
+ GST_RING_BUFFER_SIGNAL (buf);
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->pause))
+ res = rclass->pause (buf);
+
+ if (G_UNLIKELY (!res)) {
+ buf->state = GST_RING_BUFFER_STATE_STARTED;
+ GST_DEBUG_OBJECT (buf, "failed to pause");
+ } else {
+ GST_DEBUG_OBJECT (buf, "paused");
+ }
+
+ return res;
+
+not_started:
+ {
+ /* was not started */
+ GST_DEBUG_OBJECT (buf, "was not started");
+ return TRUE;
+ }
+}
+
+/**
+ * gst_ring_buffer_pause:
+ * @buf: the #GstRingBuffer to pause
+ *
+ * Pause processing samples from the ringbuffer.
+ *
+ * Returns: TRUE if the device could be paused, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_pause (GstRingBuffer * buf)
+{
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (buf->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (!buf->acquired))
+ goto not_acquired;
+
+ res = gst_ring_buffer_pause_unlocked (buf);
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (buf, "we are flushing");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+not_acquired:
+ {
+ GST_DEBUG_OBJECT (buf, "not acquired");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_ring_buffer_stop:
+ * @buf: the #GstRingBuffer to stop
+ *
+ * Stop processing samples from the ringbuffer.
+ *
+ * Returns: TRUE if the device could be stopped, FALSE on error.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_stop (GstRingBuffer * buf)
+{
+ gboolean res = FALSE;
+ GstRingBufferClass *rclass;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ GST_DEBUG_OBJECT (buf, "stopping");
+
+ GST_OBJECT_LOCK (buf);
+
+ /* if started, set to stopped */
+ res = g_atomic_int_compare_and_exchange (&buf->state,
+ GST_RING_BUFFER_STATE_STARTED, GST_RING_BUFFER_STATE_STOPPED);
+
+ if (!res) {
+ GST_DEBUG_OBJECT (buf, "was not started, try paused");
+ /* was not started, try from paused */
+ res = g_atomic_int_compare_and_exchange (&buf->state,
+ GST_RING_BUFFER_STATE_PAUSED, GST_RING_BUFFER_STATE_STOPPED);
+ if (!res) {
+ /* was not paused either, must have been stopped then */
+ res = TRUE;
+ GST_DEBUG_OBJECT (buf, "was not paused, must have been stopped");
+ goto done;
+ }
+ }
+
+ /* signal any waiters */
+ GST_DEBUG_OBJECT (buf, "signal waiter");
+ GST_RING_BUFFER_SIGNAL (buf);
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->stop))
+ res = rclass->stop (buf);
+
+ if (G_UNLIKELY (!res)) {
+ buf->state = GST_RING_BUFFER_STATE_STARTED;
+ GST_DEBUG_OBJECT (buf, "failed to stop");
+ } else {
+ GST_DEBUG_OBJECT (buf, "stopped");
+ }
+done:
+ GST_OBJECT_UNLOCK (buf);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_delay:
+ * @buf: the #GstRingBuffer to query
+ *
+ * Get the number of samples queued in the audio device. This is
+ * usually less than the segment size but can be bigger when the
+ * implementation uses another internal buffer between the audio
+ * device.
+ *
+ * For playback ringbuffers this is the amount of samples transfered from the
+ * ringbuffer to the device but still not played.
+ *
+ * For capture ringbuffers this is the amount of samples in the device that are
+ * not yet transfered to the ringbuffer.
+ *
+ * Returns: The number of samples queued in the audio device.
+ *
+ * MT safe.
+ */
+guint
+gst_ring_buffer_delay (GstRingBuffer * buf)
+{
+ GstRingBufferClass *rclass;
+ guint res;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), 0);
+
+ /* buffer must be acquired */
+ if (G_UNLIKELY (!gst_ring_buffer_is_acquired (buf)))
+ goto not_acquired;
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+ if (G_LIKELY (rclass->delay))
+ res = rclass->delay (buf);
+ else
+ res = 0;
+
+ return res;
+
+not_acquired:
+ {
+ GST_DEBUG_OBJECT (buf, "not acquired");
+ return 0;
+ }
+}
+
+/**
+ * gst_ring_buffer_samples_done:
+ * @buf: the #GstRingBuffer to query
+ *
+ * Get the number of samples that were processed by the ringbuffer
+ * since it was last started. This does not include the number of samples not
+ * yet processed (see gst_ring_buffer_delay()).
+ *
+ * Returns: The number of samples processed by the ringbuffer.
+ *
+ * MT safe.
+ */
+guint64
+gst_ring_buffer_samples_done (GstRingBuffer * buf)
+{
+ gint segdone;
+ guint64 samples;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), 0);
+
+ /* get the amount of segments we processed */
+ segdone = g_atomic_int_get (&buf->segdone);
+
+ /* convert to samples */
+ samples = ((guint64) segdone) * buf->samples_per_seg;
+
+ return samples;
+}
+
+/**
+ * gst_ring_buffer_set_sample:
+ * @buf: the #GstRingBuffer to use
+ * @sample: the sample number to set
+ *
+ * Make sure that the next sample written to the device is
+ * accounted for as being the @sample sample written to the
+ * device. This value will be used in reporting the current
+ * sample position of the ringbuffer.
+ *
+ * This function will also clear the buffer with silence.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_set_sample (GstRingBuffer * buf, guint64 sample)
+{
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ if (sample == -1)
+ sample = 0;
+
+ if (G_UNLIKELY (buf->samples_per_seg == 0))
+ return;
+
+ /* FIXME, we assume the ringbuffer can restart at a random
+ * position, round down to the beginning and keep track of
+ * offset when calculating the processed samples. */
+ buf->segbase = buf->segdone - sample / buf->samples_per_seg;
+
+ gst_ring_buffer_clear_all (buf);
+
+ GST_DEBUG_OBJECT (buf, "set sample to %" G_GUINT64_FORMAT ", segbase %d",
+ sample, buf->segbase);
+}
+
+static void
+default_clear_all (GstRingBuffer * buf)
+{
+ gint i;
+
+ /* not fatal, we just are not negotiated yet */
+ if (G_UNLIKELY (buf->spec.segtotal <= 0))
+ return;
+
+ GST_DEBUG_OBJECT (buf, "clear all segments");
+
+ for (i = 0; i < buf->spec.segtotal; i++) {
+ gst_ring_buffer_clear (buf, i);
+ }
+}
+
+/**
+ * gst_ring_buffer_clear_all:
+ * @buf: the #GstRingBuffer to clear
+ *
+ * Fill the ringbuffer with silence.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_clear_all (GstRingBuffer * buf)
+{
+ GstRingBufferClass *rclass;
+
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+
+ if (G_LIKELY (rclass->clear_all))
+ rclass->clear_all (buf);
+}
+
+
+static gboolean
+wait_segment (GstRingBuffer * buf)
+{
+ gint segments;
+ gboolean wait = TRUE;
+
+ /* buffer must be started now or we deadlock since nobody is reading */
+ 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->may_start) == FALSE))
+ goto no_start;
+
+ GST_DEBUG_OBJECT (buf, "start!");
+ segments = g_atomic_int_get (&buf->segdone);
+ gst_ring_buffer_start (buf);
+
+ /* After starting, the writer may have wrote segments already and then we
+ * don't need to wait anymore */
+ if (G_LIKELY (g_atomic_int_get (&buf->segdone) != segments))
+ wait = FALSE;
+ }
+
+ /* take lock first, then update our waiting flag */
+ GST_OBJECT_LOCK (buf);
+ if (G_UNLIKELY (buf->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
+ GST_RING_BUFFER_STATE_STARTED))
+ goto not_started;
+
+ if (G_LIKELY (wait)) {
+ if (g_atomic_int_compare_and_exchange (&buf->waiting, 0, 1)) {
+ GST_DEBUG_OBJECT (buf, "waiting..");
+ GST_RING_BUFFER_WAIT (buf);
+
+ if (G_UNLIKELY (buf->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
+ GST_RING_BUFFER_STATE_STARTED))
+ goto not_started;
+ }
+ }
+ GST_OBJECT_UNLOCK (buf);
+
+ return TRUE;
+
+ /* ERROR */
+not_started:
+ {
+ g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0);
+ GST_DEBUG_OBJECT (buf, "stopped processing");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+flushing:
+ {
+ g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0);
+ GST_DEBUG_OBJECT (buf, "flushing");
+ GST_OBJECT_UNLOCK (buf);
+ return FALSE;
+ }
+no_start:
+ {
+ GST_DEBUG_OBJECT (buf, "not allowed to start");
+ return FALSE;
+ }
+}
+
+#define FWD_SAMPLES(s,se,d,de) \
+G_STMT_START { \
+ /* no rate conversion */ \
+ guint towrite = MIN (se + bpf - s, de - d); \
+ /* simple copy */ \
+ if (!skip) \
+ memcpy (d, s, towrite); \
+ in_samples -= towrite / bpf; \
+ out_samples -= towrite / bpf; \
+ s += towrite; \
+ GST_DEBUG ("copy %u bytes", towrite); \
+} G_STMT_END
+
+/* 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) { \
+ if (!skip) \
+ memcpy (d, s, bpf); \
+ s += bpf; \
+ *accum += outr; \
+ if ((*accum << 1) >= inr) { \
+ *accum -= inr; \
+ d += bpf; \
+ } \
+ } \
+ in_samples -= (s - sb)/bpf; \
+ out_samples -= (d - db)/bpf; \
+ 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) { \
+ if (!skip) \
+ memcpy (d, s, bpf); \
+ d += bpf; \
+ *accum += inr; \
+ if ((*accum << 1) >= outr) { \
+ *accum -= outr; \
+ s += bpf; \
+ } \
+ } \
+ in_samples -= (s - sb)/bpf; \
+ out_samples -= (d - db)/bpf; \
+ 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) { \
+ if (!skip) \
+ memcpy (d, se, bpf); \
+ se -= bpf; \
+ *accum += outr; \
+ while (d < de && (*accum << 1) >= inr) { \
+ *accum -= inr; \
+ d += bpf; \
+ } \
+ } \
+ in_samples -= (sb - se)/bpf; \
+ out_samples -= (d - db)/bpf; \
+ 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) { \
+ if (!skip) \
+ memcpy (d, se, bpf); \
+ d += bpf; \
+ *accum += inr; \
+ while (s <= se && (*accum << 1) >= outr) { \
+ *accum -= outr; \
+ se -= bpf; \
+ } \
+ } \
+ in_samples -= (sb - se)/bpf; \
+ out_samples -= (d - db)/bpf; \
+ GST_DEBUG ("rev_down end %d/%d",*accum,*toprocess); \
+} G_STMT_END
+
+static guint
+default_commit (GstRingBuffer * buf, guint64 * sample,
+ guchar * data, gint in_samples, gint out_samples, gint * accum)
+{
+ gint segdone;
+ gint segsize, segtotal, bpf, sps;
+ guint8 *dest, *data_end;
+ gint writeseg, sampleoff;
+ gint *toprocess;
+ gint inr, outr;
+ gboolean reverse;
+
+ g_return_val_if_fail (buf->memory != NULL, -1);
+ g_return_val_if_fail (data != NULL, -1);
+
+ dest = buf->memory;
+ segsize = buf->spec.segsize;
+ segtotal = buf->spec.segtotal;
+ bpf = buf->spec.info.bpf;
+ sps = buf->samples_per_seg;
+
+ 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;
+
+ /* 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 + (bpf * inr);
+
+ /* figure out the segment and the offset inside the segment where
+ * the first sample should be written. */
+ writeseg = *sample / sps;
+ sampleoff = (*sample % sps) * bpf;
+
+ /* write out all samples */
+ while (*toprocess > 0) {
+ gint avail;
+ guint8 *d, *d_end;
+ gint ws;
+ gboolean skip;
+
+ while (TRUE) {
+ gint diff;
+
+ /* get the currently processed segment */
+ segdone = g_atomic_int_get (&buf->segdone) - buf->segbase;
+
+ /* see how far away it is from the write segment */
+ diff = writeseg - segdone;
+
+ GST_DEBUG
+ ("pointer at %d, write to %d-%d, diff %d, segtotal %d, segsize %d, base %d",
+ segdone, writeseg, sampleoff, diff, segtotal, segsize, buf->segbase);
+
+ /* segment too far ahead, writer too slow, we need to drop, hopefully UNLIKELY */
+ if (G_UNLIKELY (diff < 0)) {
+ /* we need to drop one segment at a time, pretend we wrote a
+ * segment. */
+ skip = TRUE;
+ break;
+ }
+
+ /* write segment is within writable range, we can break the loop and
+ * start writing the data. */
+ if (diff < segtotal) {
+ skip = FALSE;
+ break;
+ }
+
+ /* else we need to wait for the segment to become writable. */
+ if (!wait_segment (buf))
+ goto not_started;
+ }
+
+ /* we can write now */
+ ws = writeseg % segtotal;
+ avail = MIN (segsize - sampleoff, bpf * out_samples);
+
+ d = dest + (ws * segsize) + sampleoff;
+ d_end = d + avail;
+ *sample += avail / bpf;
+
+ GST_DEBUG_OBJECT (buf, "write @%p seg %d, sps %d, off %d, avail %d",
+ dest + ws * segsize, ws, sps, sampleoff, avail);
+
+ if (G_LIKELY (inr == outr && !reverse)) {
+ /* no rate conversion, simply copy samples */
+ FWD_SAMPLES (data, data_end, d, d_end);
+ } else 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);
+ }
+
+ /* for the next iteration we write to the next segment at the beginning. */
+ writeseg++;
+ sampleoff = 0;
+ }
+ /* we consumed all samples here */
+ data = data_end + bpf;
+
+done:
+ return inr - ((data_end - data) / bpf);
+
+ /* ERRORS */
+not_started:
+ {
+ GST_DEBUG_OBJECT (buf, "stopped processing");
+ goto done;
+ }
+}
+
+/**
+ * gst_ring_buffer_commit_full:
+ * @buf: the #GstRingBuffer to commit
+ * @sample: the sample position of the data
+ * @data: the data to commit
+ * @in_samples: the number of samples in the data to commit
+ * @out_samples: the number of samples to write to the ringbuffer
+ * @accum: accumulator for rate conversion.
+ *
+ * Commit @in_samples samples pointed to by @data to the ringbuffer @buf.
+ *
+ * @in_samples and @out_samples define the rate conversion to perform on the the
+ * samples in @data. For negative rates, @out_samples must be negative and
+ * @in_samples positive.
+ *
+ * When @out_samples is positive, the first sample will be written at position @sample
+ * in the ringbuffer. When @out_samples is negative, the last sample will be written to
+ * @sample in reverse order.
+ *
+ * @out_samples does not need to be a multiple of the segment size of the ringbuffer
+ * although it is recommended for optimal performance.
+ *
+ * @accum will hold a temporary accumulator used in rate conversion and should be
+ * set to 0 when this function is first called. In case the commit operation is
+ * interrupted, one can resume the processing by passing the previously returned
+ * @accum value back to this function.
+ *
+ * MT safe.
+ *
+ * Returns: The number of samples written to the ringbuffer or -1 on error. The
+ * number of samples written can be less than @out_samples when @buf was interrupted
+ * with a flush or stop.
+ *
+ * Since: 0.10.11.
+ */
+guint
+gst_ring_buffer_commit_full (GstRingBuffer * buf, guint64 * sample,
+ guchar * data, gint in_samples, gint out_samples, gint * accum)
+{
+ GstRingBufferClass *rclass;
+ guint res = -1;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), -1);
+
+ if (G_UNLIKELY (in_samples == 0 || out_samples == 0))
+ return in_samples;
+
+ rclass = GST_RING_BUFFER_GET_CLASS (buf);
+
+ if (G_LIKELY (rclass->commit))
+ res = rclass->commit (buf, sample, data, in_samples, out_samples, accum);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_commit:
+ * @buf: the #GstRingBuffer to commit
+ * @sample: the sample position of the data
+ * @data: the data to commit
+ * @len: the number of samples in the data to commit
+ *
+ * Same as gst_ring_buffer_commit_full() but with a in_samples and out_samples
+ * equal to @len, ignoring accum.
+ *
+ * Returns: The number of samples written to the ringbuffer or -1 on
+ * error.
+ *
+ * MT safe.
+ */
+guint
+gst_ring_buffer_commit (GstRingBuffer * buf, guint64 sample, guchar * data,
+ guint len)
+{
+ guint res;
+ guint64 samplep = sample;
+
+ res = gst_ring_buffer_commit_full (buf, &samplep, data, len, len, NULL);
+
+ return res;
+}
+
+/**
+ * gst_ring_buffer_read:
+ * @buf: the #GstRingBuffer to read from
+ * @sample: the sample position of the data
+ * @data: where the data should be read
+ * @len: the number of samples in data to read
+ *
+ * Read @len samples from the ringbuffer into the memory pointed
+ * to by @data.
+ * The first sample should be read from position @sample in
+ * the ringbuffer.
+ *
+ * @len should not be a multiple of the segment size of the ringbuffer
+ * although it is recommended.
+ *
+ * Returns: The number of samples read from the ringbuffer or -1 on
+ * error.
+ *
+ * MT safe.
+ */
+guint
+gst_ring_buffer_read (GstRingBuffer * buf, guint64 sample, guchar * data,
+ guint len)
+{
+ gint segdone;
+ gint segsize, segtotal, bpf, sps;
+ guint8 *dest;
+ guint to_read;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), -1);
+ g_return_val_if_fail (buf->memory != NULL, -1);
+ g_return_val_if_fail (data != NULL, -1);
+
+ dest = buf->memory;
+ segsize = buf->spec.segsize;
+ segtotal = buf->spec.segtotal;
+ bpf = buf->spec.info.bpf;
+ sps = buf->samples_per_seg;
+
+ to_read = len;
+ /* read enough samples */
+ while (to_read > 0) {
+ gint sampleslen;
+ gint readseg, sampleoff;
+
+ /* figure out the segment and the offset inside the segment where
+ * the sample should be read from. */
+ readseg = sample / sps;
+ sampleoff = (sample % sps);
+
+ while (TRUE) {
+ gint diff;
+
+ /* get the currently processed segment */
+ segdone = g_atomic_int_get (&buf->segdone) - buf->segbase;
+
+ /* see how far away it is from the read segment, normally segdone (where
+ * the hardware is writing) is bigger than readseg (where software is
+ * reading) */
+ diff = segdone - readseg;
+
+ GST_DEBUG
+ ("pointer at %d, sample %" G_GUINT64_FORMAT
+ ", read from %d-%d, to_read %d, diff %d, segtotal %d, segsize %d",
+ segdone, sample, readseg, sampleoff, to_read, diff, segtotal,
+ segsize);
+
+ /* segment too far ahead, reader too slow */
+ if (G_UNLIKELY (diff >= segtotal)) {
+ /* pretend we read an empty segment. */
+ sampleslen = MIN (sps, to_read);
+ memcpy (data, buf->empty_seg, sampleslen * bpf);
+ goto next;
+ }
+
+ /* read segment is within readable range, we can break the loop and
+ * start reading the data. */
+ if (diff > 0)
+ break;
+
+ /* else we need to wait for the segment to become readable. */
+ if (!wait_segment (buf))
+ goto not_started;
+ }
+
+ /* we can read now */
+ readseg = readseg % segtotal;
+ sampleslen = MIN (sps - sampleoff, to_read);
+
+ GST_DEBUG_OBJECT (buf, "read @%p seg %d, off %d, sampleslen %d",
+ dest + readseg * segsize, readseg, sampleoff, sampleslen);
+
+ memcpy (data, dest + (readseg * segsize) + (sampleoff * bpf),
+ (sampleslen * bpf));
+
+ next:
+ to_read -= sampleslen;
+ sample += sampleslen;
+ data += sampleslen * bpf;
+ }
+
+ return len - to_read;
+
+ /* ERRORS */
+not_started:
+ {
+ GST_DEBUG_OBJECT (buf, "stopped processing");
+ return len - to_read;
+ }
+}
+
+/**
+ * gst_ring_buffer_prepare_read:
+ * @buf: the #GstRingBuffer to read from
+ * @segment: the segment to read
+ * @readptr: the pointer to the memory where samples can be read
+ * @len: the number of bytes to read
+ *
+ * Returns a pointer to memory where the data from segment @segment
+ * can be found. This function is mostly used by subclasses.
+ *
+ * Returns: FALSE if the buffer is not started.
+ *
+ * MT safe.
+ */
+gboolean
+gst_ring_buffer_prepare_read (GstRingBuffer * buf, gint * segment,
+ guint8 ** readptr, gint * len)
+{
+ guint8 *data;
+ gint segdone;
+
+ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE);
+
+ if (buf->callback == NULL) {
+ /* push mode, fail when nothing is started */
+ if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED)
+ return FALSE;
+ }
+
+ g_return_val_if_fail (buf->memory != NULL, FALSE);
+ g_return_val_if_fail (segment != NULL, FALSE);
+ g_return_val_if_fail (readptr != NULL, FALSE);
+ g_return_val_if_fail (len != NULL, FALSE);
+
+ data = buf->memory;
+
+ /* get the position of the pointer */
+ segdone = g_atomic_int_get (&buf->segdone);
+
+ *segment = segdone % buf->spec.segtotal;
+ *len = buf->spec.segsize;
+ *readptr = data + *segment * *len;
+
+ GST_LOG ("prepare read from segment %d (real %d) @%p",
+ *segment, segdone, *readptr);
+
+ /* callback to fill the memory with data, for pull based
+ * scheduling. */
+ if (buf->callback)
+ buf->callback (buf, *readptr, *len, buf->cb_data);
+
+ return TRUE;
+}
+
+/**
+ * gst_ring_buffer_advance:
+ * @buf: the #GstRingBuffer to advance
+ * @advance: the number of segments written
+ *
+ * Subclasses should call this function to notify the fact that
+ * @advance segments are now processed by the device.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_advance (GstRingBuffer * buf, guint advance)
+{
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ /* update counter */
+ g_atomic_int_add (&buf->segdone, advance);
+
+ /* the lock is already taken when the waiting flag is set,
+ * we grab the lock as well to make sure the waiter is actually
+ * waiting for the signal */
+ if (g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0)) {
+ GST_OBJECT_LOCK (buf);
+ GST_DEBUG_OBJECT (buf, "signal waiter");
+ GST_RING_BUFFER_SIGNAL (buf);
+ GST_OBJECT_UNLOCK (buf);
+ }
+}
+
+/**
+ * gst_ring_buffer_clear:
+ * @buf: the #GstRingBuffer to clear
+ * @segment: the segment to clear
+ *
+ * Clear the given segment of the buffer with silence samples.
+ * This function is used by subclasses.
+ *
+ * MT safe.
+ */
+void
+gst_ring_buffer_clear (GstRingBuffer * buf, gint segment)
+{
+ guint8 *data;
+
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ /* no data means it's already cleared */
+ if (G_UNLIKELY (buf->memory == NULL))
+ return;
+
+ /* no empty_seg means it's not opened */
+ if (G_UNLIKELY (buf->empty_seg == NULL))
+ return;
+
+ segment %= buf->spec.segtotal;
+
+ data = buf->memory;
+ data += segment * buf->spec.segsize;
+
+ GST_LOG ("clear segment %d @%p", segment, data);
+
+ memcpy (data, buf->empty_seg, buf->spec.segsize);
+}
+
+/**
+ * gst_ring_buffer_may_start:
+ * @buf: the #GstRingBuffer
+ * @allowed: the new value
+ *
+ * Tell the ringbuffer that it is allowed to start playback when
+ * the ringbuffer is filled with samples.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.6
+ */
+void
+gst_ring_buffer_may_start (GstRingBuffer * buf, gboolean allowed)
+{
+ g_return_if_fail (GST_IS_RING_BUFFER (buf));
+
+ GST_LOG_OBJECT (buf, "may start: %d", allowed);
+ g_atomic_int_set (&buf->may_start, allowed);
+}
diff --git a/gst-libs/gst/audio/gstringbuffer.h b/gst-libs/gst/audio/gstringbuffer.h
new file mode 100644
index 0000000..ddd2c68
--- /dev/null
+++ b/gst-libs/gst/audio/gstringbuffer.h
@@ -0,0 +1,338 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstringbuffer.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_RING_BUFFER_H__
+#define __GST_RING_BUFFER_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RING_BUFFER (gst_ring_buffer_get_type())
+#define GST_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RING_BUFFER,GstRingBuffer))
+#define GST_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RING_BUFFER,GstRingBufferClass))
+#define GST_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_RING_BUFFER, GstRingBufferClass))
+#define GST_RING_BUFFER_CAST(obj) ((GstRingBuffer *)obj)
+#define GST_IS_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RING_BUFFER))
+#define GST_IS_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RING_BUFFER))
+
+typedef struct _GstRingBuffer GstRingBuffer;
+typedef struct _GstRingBufferClass GstRingBufferClass;
+typedef struct _GstRingBufferSpec GstRingBufferSpec;
+
+/**
+ * GstRingBufferCallback:
+ * @rbuf: a #GstRingBuffer
+ * @data: target to fill
+ * @len: amount to fill
+ * @user_data: user data
+ *
+ * This function is set with gst_ring_buffer_set_callback() and is
+ * called to fill the memory at @data with @len bytes of samples.
+ */
+typedef void (*GstRingBufferCallback) (GstRingBuffer *rbuf, guint8* data, guint len, gpointer user_data);
+
+/**
+ * GstRingBufferState:
+ * @GST_RING_BUFFER_STATE_STOPPED: The ringbuffer is stopped
+ * @GST_RING_BUFFER_STATE_PAUSED: The ringbuffer is paused
+ * @GST_RING_BUFFER_STATE_STARTED: The ringbuffer is started
+ *
+ * The state of the ringbuffer.
+ */
+typedef enum {
+ GST_RING_BUFFER_STATE_STOPPED,
+ GST_RING_BUFFER_STATE_PAUSED,
+ GST_RING_BUFFER_STATE_STARTED
+} GstRingBufferState;
+
+/**
+ * GstRingBufferSegState:
+ * @GST_SEGSTATE_INVALID: The content of the segment is invalid
+ * @GST_SEGSTATE_EMPTY: The segment is empty
+ * @GST_SEGSTATE_FILLED: The segment contains valid data
+ * @GST_SEGSTATE_PARTIAL: The segment partially contains valid data
+ *
+ * The state of a segment in the ringbuffer.
+ */
+typedef enum {
+ GST_SEGSTATE_INVALID,
+ GST_SEGSTATE_EMPTY,
+ GST_SEGSTATE_FILLED,
+ GST_SEGSTATE_PARTIAL
+} GstRingBufferSegState;
+
+/**
+ * GstBufferFormatType:
+ * @GST_BUFTYPE_RAW: samples in linear or float
+ * @GST_BUFTYPE_MU_LAW: samples in mulaw
+ * @GST_BUFTYPE_A_LAW: samples in alaw
+ * @GST_BUFTYPE_IMA_ADPCM: samples in ima adpcm
+ * @GST_BUFTYPE_MPEG: samples in mpeg audio (but not AAC) format
+ * @GST_BUFTYPE_GSM: samples in gsm format
+ * @GST_BUFTYPE_IEC958: samples in IEC958 frames (e.g. AC3)
+ * @GST_BUFTYPE_AC3: samples in AC3 format
+ * @GST_BUFTYPE_EAC3: samples in EAC3 format
+ * @GST_BUFTYPE_DTS: samples in DTS format
+ * @GST_BUFTYPE_MPEG2_AAC: samples in MPEG-2 AAC format
+ * @GST_BUFTYPE_MPEG4_AAC: samples in MPEG-4 AAC format
+ *
+ * The format of the samples in the ringbuffer.
+ */
+typedef enum
+{
+ GST_BUFTYPE_RAW,
+ GST_BUFTYPE_MU_LAW,
+ GST_BUFTYPE_A_LAW,
+ GST_BUFTYPE_IMA_ADPCM,
+ GST_BUFTYPE_MPEG,
+ GST_BUFTYPE_GSM,
+ GST_BUFTYPE_IEC958,
+ GST_BUFTYPE_AC3,
+ GST_BUFTYPE_EAC3,
+ GST_BUFTYPE_DTS,
+ GST_BUFTYPE_MPEG2_AAC,
+ GST_BUFTYPE_MPEG4_AAC,
+} GstBufferFormatType;
+
+/**
+ * GstRingBufferSpec:
+ * @caps: The caps that generated the Spec.
+ * @type: the sample type
+ * @info: the #GstAudioInfo
+ * @latency_time: the latency in microseconds
+ * @buffer_time: the total buffer size in microseconds
+ * @segsize: the size of one segment in bytes
+ * @segtotal: the total number of segments
+ * @seglatency: number of segments queued in the lower level device,
+ * defaults to segtotal
+ *
+ * The structure containing the format specification of the ringbuffer.
+ */
+struct _GstRingBufferSpec
+{
+ /*< public >*/
+ /* in */
+ GstCaps *caps; /* the caps of the buffer */
+
+ /* in/out */
+ GstBufferFormatType type;
+ GstAudioInfo info;
+
+ guint64 latency_time; /* the required/actual latency time, this is the
+ * actual the size of one segment and the
+ * minimum possible latency we can achieve. */
+ guint64 buffer_time; /* the required/actual time of the buffer, this is
+ * the total size of the buffer and maximum
+ * latency we can compensate for. */
+ gint segsize; /* size of one buffer segment in bytes, this value
+ * should be chosen to match latency_time as
+ * well as possible. */
+ gint segtotal; /* total number of segments, this value is the
+ * number of segments of @segsize and should be
+ * chosen so that it matches buffer_time as
+ * close as possible. */
+ /* ABI added 0.10.20 */
+ gint seglatency; /* number of segments queued in the lower
+ * level device, defaults to segtotal. */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+#define GST_RING_BUFFER_GET_COND(buf) (((GstRingBuffer *)buf)->cond)
+#define GST_RING_BUFFER_WAIT(buf) (g_cond_wait (GST_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
+#define GST_RING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_RING_BUFFER_GET_COND (buf)))
+#define GST_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_RING_BUFFER_GET_COND (buf)))
+
+/**
+ * GstRingBuffer:
+ * @cond: used to signal start/stop/pause/resume actions
+ * @open: boolean indicating that the ringbuffer is open
+ * @acquired: boolean indicating that the ringbuffer is acquired
+ * @memory: data in the ringbuffer
+ * @size: size of data in the ringbuffer
+ * @spec: format and layout of the ringbuffer data
+ * @segstate: status of each segment in the ringbuffer (unused)
+ * @samples_per_seg: number of samples in one segment
+ * @empty_seg: pointer to memory holding one segment of silence samples
+ * @state: state of the buffer
+ * @segdone: readpointer in the ringbuffer
+ * @segbase: segment corresponding to segment 0 (unused)
+ * @waiting: is a reader or writer waiting for a free segment
+ *
+ * The ringbuffer base class structure.
+ */
+struct _GstRingBuffer {
+ GstObject object;
+
+ /*< public >*/ /* with LOCK */
+ GCond *cond;
+ gboolean open;
+ gboolean acquired;
+ guint8 *memory;
+ gsize size;
+ GstRingBufferSpec spec;
+ GstRingBufferSegState *segstate;
+ gint samples_per_seg;
+ guint8 *empty_seg;
+
+ /*< public >*/ /* ATOMIC */
+ gint state;
+ gint segdone;
+ gint segbase;
+ gint waiting;
+
+ /*< private >*/
+ GstRingBufferCallback callback;
+ gpointer cb_data;
+
+ gboolean flushing;
+ /* ATOMIC */
+ gint may_start;
+ gboolean active;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING + 0];
+};
+
+/**
+ * GstRingBufferClass:
+ * @parent_class: parent class
+ * @open_device: open the device, don't set any params or allocate anything
+ * @acquire: allocate the resources for the ringbuffer using the given spec
+ * @release: free resources of the ringbuffer
+ * @close_device: close the device
+ * @start: start processing of samples
+ * @pause: pause processing of samples
+ * @resume: resume processing of samples after pause
+ * @stop: stop processing of samples
+ * @delay: get number of samples queued in device
+ * @activate: activate the thread that starts pulling and monitoring the
+ * consumed segments in the device. Since 0.10.22
+ * @commit: write samples into the ringbuffer
+ * @clear_all: clear the entire ringbuffer Since 0.10.24
+ *
+ * The vmethods that subclasses can override to implement the ringbuffer.
+ */
+struct _GstRingBufferClass {
+ GstObjectClass parent_class;
+
+ /*< public >*/
+ gboolean (*open_device) (GstRingBuffer *buf);
+ gboolean (*acquire) (GstRingBuffer *buf, GstRingBufferSpec *spec);
+ gboolean (*release) (GstRingBuffer *buf);
+ gboolean (*close_device) (GstRingBuffer *buf);
+
+ gboolean (*start) (GstRingBuffer *buf);
+ gboolean (*pause) (GstRingBuffer *buf);
+ gboolean (*resume) (GstRingBuffer *buf);
+ gboolean (*stop) (GstRingBuffer *buf);
+
+ guint (*delay) (GstRingBuffer *buf);
+
+ /* ABI added */
+ gboolean (*activate) (GstRingBuffer *buf, gboolean active);
+
+ guint (*commit) (GstRingBuffer * buf, guint64 *sample,
+ guchar * data, gint in_samples,
+ gint out_samples, gint * accum);
+
+ void (*clear_all) (GstRingBuffer * buf);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 3];
+};
+
+GType gst_ring_buffer_get_type(void);
+
+/* callback stuff */
+void gst_ring_buffer_set_callback (GstRingBuffer *buf, GstRingBufferCallback cb,
+ gpointer user_data);
+
+gboolean gst_ring_buffer_parse_caps (GstRingBufferSpec *spec, GstCaps *caps);
+void gst_ring_buffer_debug_spec_caps (GstRingBufferSpec *spec);
+void gst_ring_buffer_debug_spec_buff (GstRingBufferSpec *spec);
+
+gboolean gst_ring_buffer_convert (GstRingBuffer * buf, GstFormat src_fmt,
+ gint64 src_val, GstFormat dest_fmt,
+ gint64 * dest_val);
+
+/* device state */
+gboolean gst_ring_buffer_open_device (GstRingBuffer *buf);
+gboolean gst_ring_buffer_close_device (GstRingBuffer *buf);
+
+gboolean gst_ring_buffer_device_is_open (GstRingBuffer *buf);
+
+/* allocate resources */
+gboolean gst_ring_buffer_acquire (GstRingBuffer *buf, GstRingBufferSpec *spec);
+gboolean gst_ring_buffer_release (GstRingBuffer *buf);
+
+gboolean gst_ring_buffer_is_acquired (GstRingBuffer *buf);
+
+/* activating */
+gboolean gst_ring_buffer_activate (GstRingBuffer *buf, gboolean active);
+gboolean gst_ring_buffer_is_active (GstRingBuffer *buf);
+
+/* flushing */
+void gst_ring_buffer_set_flushing (GstRingBuffer *buf, gboolean flushing);
+
+/* playback/pause */
+gboolean gst_ring_buffer_start (GstRingBuffer *buf);
+gboolean gst_ring_buffer_pause (GstRingBuffer *buf);
+gboolean gst_ring_buffer_stop (GstRingBuffer *buf);
+
+/* get status */
+guint gst_ring_buffer_delay (GstRingBuffer *buf);
+guint64 gst_ring_buffer_samples_done (GstRingBuffer *buf);
+
+void gst_ring_buffer_set_sample (GstRingBuffer *buf, guint64 sample);
+
+/* clear all segments */
+void gst_ring_buffer_clear_all (GstRingBuffer *buf);
+
+/* commit samples */
+guint gst_ring_buffer_commit (GstRingBuffer *buf, guint64 sample,
+ guchar *data, guint len);
+guint gst_ring_buffer_commit_full (GstRingBuffer * buf, guint64 *sample,
+ guchar * data, gint in_samples,
+ gint out_samples, gint * accum);
+
+/* read samples */
+guint gst_ring_buffer_read (GstRingBuffer *buf, guint64 sample,
+ guchar *data, guint len);
+
+/* mostly protected */
+/* not yet implemented
+gboolean gst_ring_buffer_prepare_write (GstRingBuffer *buf, gint *segment, guint8 **writeptr, gint *len);
+*/
+gboolean gst_ring_buffer_prepare_read (GstRingBuffer *buf, gint *segment, guint8 **readptr, gint *len);
+void gst_ring_buffer_clear (GstRingBuffer *buf, gint segment);
+void gst_ring_buffer_advance (GstRingBuffer *buf, guint advance);
+
+void gst_ring_buffer_may_start (GstRingBuffer *buf, gboolean allowed);
+
+
+G_END_DECLS
+
+#endif /* __GST_RING_BUFFER_H__ */
diff --git a/gst-libs/gst/audio/mixerutils.c b/gst-libs/gst/audio/mixerutils.c
new file mode 100644
index 0000000..ba912d9
--- /dev/null
+++ b/gst-libs/gst/audio/mixerutils.c
@@ -0,0 +1,246 @@
+/* GStreamer
+ * Copyright (C) 2003-2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2005-2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstaudiomixerutils
+ * @short_description: utility functions to find available audio mixers
+ * from the plugin registry
+ *
+ * <refsect2>
+ * <para>
+ * Provides some utility functions to detect available audio mixers
+ * on the system.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "mixerutils.h"
+
+#include <gst/interfaces/propertyprobe.h>
+
+#include <string.h>
+
+static void
+gst_audio_mixer_filter_do_filter (GstAudioMixerFilterFunc filter_func,
+ GstElementFactory * factory,
+ GstElement ** p_element, GList ** p_collection, gpointer user_data)
+{
+ /* so, the element is a mixer, let's see if the caller wants it */
+ if (filter_func != NULL) {
+ if (filter_func (GST_MIXER (*p_element), user_data) == TRUE) {
+ *p_collection = g_list_prepend (*p_collection, *p_element);
+ /* do not set state back to NULL here on purpose, caller
+ * might want to keep the mixer open */
+ *p_element = NULL;
+ }
+ } else {
+ gst_element_set_state (*p_element, GST_STATE_NULL);
+ *p_collection = g_list_prepend (*p_collection, *p_element);
+ *p_element = NULL;
+ }
+
+ /* create new element for further probing if the old one was cleared */
+ if (*p_element == NULL) {
+ *p_element = gst_element_factory_create (factory, NULL);
+ }
+}
+
+static gboolean
+gst_audio_mixer_filter_check_element (GstElement * element)
+{
+ GstStateChangeReturn ret;
+
+ /* open device (only then we can know for sure whether it is a mixer) */
+ gst_element_set_state (element, GST_STATE_READY);
+ ret = gst_element_get_state (element, NULL, NULL, 1 * GST_SECOND);
+ if (ret != GST_STATE_CHANGE_SUCCESS) {
+ GST_DEBUG ("could not open device / set element to READY");
+ gst_element_set_state (element, GST_STATE_NULL);
+ return FALSE;
+ }
+
+ /* is this device a mixer? */
+ if (!GST_IS_MIXER (element)) {
+ GST_DEBUG ("element is not a mixer");
+ gst_element_set_state (element, GST_STATE_NULL);
+ return FALSE;
+ }
+
+ /* any tracks? */
+ if (!gst_mixer_list_tracks (GST_MIXER (element))) {
+ GST_DEBUG ("element is a mixer, but has no tracks");
+ gst_element_set_state (element, GST_STATE_NULL);
+ return FALSE;
+ }
+
+ GST_DEBUG ("element is a mixer with mixer tracks");
+ return TRUE;
+}
+
+static void
+gst_audio_mixer_filter_probe_feature (GstAudioMixerFilterFunc filter_func,
+ GstElementFactory * factory,
+ GList ** p_collection, gboolean first, gpointer user_data)
+{
+ GstElement *element;
+
+ GST_DEBUG ("probing %s ...", gst_element_factory_get_longname (factory));
+
+ /* create element */
+ element = gst_element_factory_create (factory, NULL);
+
+ if (element == NULL) {
+ GST_DEBUG ("could not create element from factory");
+ return;
+ }
+
+ GST_DEBUG ("created element %s (%p)", GST_ELEMENT_NAME (element), element);
+
+ if (GST_IS_PROPERTY_PROBE (element)) {
+ GstPropertyProbe *probe;
+ const GParamSpec *devspec;
+
+ probe = GST_PROPERTY_PROBE (element);
+
+ GST_DEBUG ("probing available devices ...");
+ if ((devspec = gst_property_probe_get_property (probe, "device"))) {
+ GValueArray *array;
+
+ if ((array = gst_property_probe_probe_and_get_values (probe, devspec))) {
+ guint n;
+
+ GST_DEBUG ("there are %d available devices", array->n_values);
+
+ /* set all devices and test for mixer */
+ for (n = 0; n < array->n_values; n++) {
+ GValue *device;
+
+ /* set this device */
+ device = g_value_array_get_nth (array, n);
+ g_object_set_property (G_OBJECT (element), "device", device);
+
+ GST_DEBUG ("trying device %s ..", g_value_get_string (device));
+
+ if (gst_audio_mixer_filter_check_element (element)) {
+ gst_audio_mixer_filter_do_filter (filter_func, factory, &element,
+ p_collection, user_data);
+
+ if (first && *p_collection != NULL) {
+ GST_DEBUG ("Stopping after first found mixer, as requested");
+ break;
+ }
+ }
+ }
+ g_value_array_free (array);
+ }
+ }
+ } else {
+ GST_DEBUG ("element does not support the property probe interface");
+
+ if (gst_audio_mixer_filter_check_element (element)) {
+ gst_audio_mixer_filter_do_filter (filter_func, factory, &element,
+ p_collection, user_data);
+ }
+ }
+
+ if (element) {
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+ }
+}
+
+static gint
+element_factory_rank_compare_func (gconstpointer a, gconstpointer b)
+{
+ gint rank_a = gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (a));
+ gint rank_b = gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (b));
+
+ /* make order chosen in the end more determinable */
+ if (rank_a == rank_b) {
+ const gchar *name_a = GST_OBJECT_NAME (GST_PLUGIN_FEATURE (a));
+ const gchar *name_b = GST_OBJECT_NAME (GST_PLUGIN_FEATURE (b));
+
+ return g_ascii_strcasecmp (name_a, name_b);
+ }
+
+ return rank_b - rank_a;
+}
+
+/**
+ * gst_audio_default_registry_mixer_filter:
+ * @filter_func: filter function, or #NULL
+ * @first: set to #TRUE if you only want the first suitable mixer element
+ * @user_data: user data to pass to the filter function
+ *
+ * Utility function to find audio mixer elements.
+ *
+ * Will traverse the default plugin registry in order of plugin rank and
+ * find usable audio mixer elements. The caller may optionally fine-tune
+ * the selection by specifying a filter function.
+ *
+ * Returns: a #GList of audio mixer #GstElement<!-- -->s. You must free each
+ * element in the list by setting it to NULL state and calling
+ * gst_object_unref(). After that the list itself should be freed
+ * using g_list_free().
+ *
+ * Since: 0.10.2
+ */
+GList *
+gst_audio_default_registry_mixer_filter (GstAudioMixerFilterFunc filter_func,
+ gboolean first, gpointer data)
+{
+ GList *mixer_list = NULL;
+ GList *feature_list;
+ GList *walk;
+
+ /* go through all elements of a certain class and check whether
+ * they implement a mixer. If so, add it to the list. */
+ feature_list = gst_registry_get_feature_list (gst_registry_get_default (),
+ GST_TYPE_ELEMENT_FACTORY);
+
+ feature_list = g_list_sort (feature_list, element_factory_rank_compare_func);
+
+ for (walk = feature_list; walk != NULL; walk = walk->next) {
+ GstElementFactory *factory;
+ const gchar *klass;
+
+ factory = GST_ELEMENT_FACTORY (walk->data);
+
+ /* check category */
+ klass = gst_element_factory_get_klass (factory);
+ if (strcmp (klass, "Generic/Audio") == 0) {
+ gst_audio_mixer_filter_probe_feature (filter_func, factory,
+ &mixer_list, first, data);
+ }
+
+ if (first && mixer_list != NULL) {
+ GST_DEBUG ("Stopping after first found mixer, as requested");
+ break;
+ }
+ }
+
+ gst_plugin_feature_list_free (feature_list);
+
+ return g_list_reverse (mixer_list);
+}
diff --git a/gst-libs/gst/audio/mixerutils.h b/gst-libs/gst/audio/mixerutils.h
new file mode 100644
index 0000000..cfda7ab
--- /dev/null
+++ b/gst-libs/gst/audio/mixerutils.h
@@ -0,0 +1,50 @@
+/* GStreamer
+ * Copyright (C) 2005-2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_AUDIO_MIXERUTILS_H__
+#define __GST_AUDIO_MIXERUTILS_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/mixer.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstAudioMixerFilterFunc:
+ * @mixer: a #GstElement implementing the #GstMixer interface
+ * @user_data: user data
+ *
+ * Function that will be called by gst_audio_default_registry_mixer_filter()
+ * so the caller can decide which mixer elements should be kept and returned.
+ * When the mixer element is passed to the callback function, it is opened
+ * and in READY state. If you decide to keep the element, you need to set it
+ * back to NULL state yourself (unless you want to keep it opened of course).
+ *
+ * Returns: TRUE if the element should be kept, FALSE otherwise.
+ */
+typedef gboolean (*GstAudioMixerFilterFunc) (GstMixer * mixer, gpointer user_data);
+
+
+GList * gst_audio_default_registry_mixer_filter (GstAudioMixerFilterFunc filter_func,
+ gboolean first,
+ gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_MIXERUTILS_H__ */
diff --git a/gst-libs/gst/audio/multichannel.c b/gst-libs/gst/audio/multichannel.c
new file mode 100644
index 0000000..885e277
--- /dev/null
+++ b/gst-libs/gst/audio/multichannel.c
@@ -0,0 +1,764 @@
+/* GStreamer Multichannel-Audio helper functions
+ * (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:gstmultichannel
+ * @short_description: Support for multichannel audio elements
+ *
+ * This module contains some helper functions and a enum to work with
+ * multichannel audio.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "multichannel.h"
+
+#define GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME "channel-positions"
+
+/**
+ * gst_audio_check_channel_positions:
+ * @pos: An array of #GstAudioChannelPosition.
+ * @channels: The number of elements in @pos.
+ *
+ * This functions checks if the given channel positions are valid. Channel
+ * positions are valid if:
+ * <itemizedlist>
+ * <listitem><para>No channel positions appears twice or all positions are %GST_AUDIO_CHANNEL_POSITION_NONE.
+ * </para></listitem>
+ * <listitem><para>Either all or none of the channel positions are %GST_AUDIO_CHANNEL_POSITION_NONE.
+ * </para></listitem>
+ * <listitem><para>%GST_AUDIO_CHANNEL_POSITION_FRONT_MONO and %GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT or %GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT don't appear together in the given positions.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * Since: 0.10.20
+ *
+ * Returns: %TRUE if the given channel positions are valid
+ * and %FALSE otherwise.
+ */
+gboolean
+gst_audio_check_channel_positions (const GstAudioChannelPosition * pos,
+ guint channels)
+{
+ gint i, n;
+
+ const struct
+ {
+ const GstAudioChannelPosition pos1[2];
+ const GstAudioChannelPosition pos2[1];
+ } conf[] = {
+ /* front: mono <-> stereo */
+ { {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}
+ };
+
+ g_return_val_if_fail (pos != NULL, FALSE);
+ g_return_val_if_fail (channels > 0, FALSE);
+
+ /* check for invalid channel positions */
+ for (n = 0; n < channels; n++) {
+ if (pos[n] <= GST_AUDIO_CHANNEL_POSITION_INVALID ||
+ pos[n] >= GST_AUDIO_CHANNEL_POSITION_NUM) {
+ GST_WARNING ("Channel position %d for channel %d is invalid", pos[n], n);
+ return FALSE;
+ }
+ }
+
+ /* either all channel positions are NONE or all are defined,
+ * but having only some channel positions NONE and others not
+ * is not allowed */
+ if (pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE) {
+ for (n = 1; n < channels; ++n) {
+ if (pos[n] != GST_AUDIO_CHANNEL_POSITION_NONE) {
+ GST_WARNING ("Either all channel positions must be defined, or all "
+ "be set to NONE, having only some defined is not allowed");
+ return FALSE;
+ }
+ }
+ /* all positions are NONE, we are done here */
+ return TRUE;
+ }
+
+ /* check for multiple position occurrences */
+ for (i = GST_AUDIO_CHANNEL_POSITION_INVALID + 1;
+ i < GST_AUDIO_CHANNEL_POSITION_NUM; i++) {
+ gint count = 0;
+
+ for (n = 0; n < channels; n++) {
+ if (pos[n] == i)
+ count++;
+ }
+
+ /* NONE may not occur mixed with other channel positions */
+ if (i == GST_AUDIO_CHANNEL_POSITION_NONE && count > 0) {
+ GST_WARNING ("Either all channel positions must be defined, or all "
+ "be set to NONE, having only some defined is not allowed");
+ return FALSE;
+ }
+
+ if (count > 1) {
+ GST_WARNING ("Channel position %d occurred %d times, not allowed",
+ i, count);
+ return FALSE;
+ }
+ }
+
+ /* check for position conflicts */
+ for (i = 0; conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID; i++) {
+ gboolean found1 = FALSE, found2 = FALSE;
+
+ for (n = 0; n < channels; n++) {
+ if (pos[n] == conf[i].pos1[0] || pos[n] == conf[i].pos1[1])
+ found1 = TRUE;
+ else if (pos[n] == conf[i].pos2[0])
+ found2 = TRUE;
+ }
+
+ if (found1 && found2) {
+ GST_WARNING ("Found conflicting channel positions %d/%d and %d",
+ conf[i].pos1[0], conf[i].pos1[1], conf[i].pos2[0]);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/* FIXME: these default positions may or may not be correct. In any
+ * case, they are mostly just a fallback for buggy plugins, so it
+ * should not really matter too much */
+#define NUM_DEF_CHANS 8
+static const GstAudioChannelPosition
+ default_positions[NUM_DEF_CHANS][NUM_DEF_CHANS] = {
+ /* 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,
+ }
+};
+
+/**
+ * gst_audio_get_channel_positions:
+ * @str: A #GstStructure to retrieve channel positions from.
+ *
+ * Retrieves a number of (fixed!) audio channel positions from
+ * the provided #GstStructure and returns it as a newly allocated
+ * array. The caller should g_free () this array. The caller
+ * should also check that the members in this #GstStructure are
+ * indeed "fixed" before calling this function.
+ *
+ * Returns: a newly allocated array containing the channel
+ * positions as provided in the given #GstStructure. Returns
+ * NULL on error.
+ */
+
+GstAudioChannelPosition *
+gst_audio_get_channel_positions (GstStructure * str)
+{
+ GstAudioChannelPosition *pos;
+ gint channels, n;
+ const GValue *pos_val_arr, *pos_val_entry;
+ gboolean res;
+ GType t;
+
+ /* get number of channels, general type checkups */
+ g_return_val_if_fail (str != NULL, NULL);
+ res = gst_structure_get_int (str, "channels", &channels);
+ g_return_val_if_fail (res, NULL);
+ g_return_val_if_fail (channels > 0, NULL);
+ pos_val_arr = gst_structure_get_value (str,
+ GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME);
+
+ /* The following checks are here to retain compatibility for plugins not
+ * implementing this field. They expect that channels=1 implies mono
+ * and channels=2 implies stereo, so we follow that. */
+ if (pos_val_arr == NULL) {
+ /* channel layouts for 1 and 2 channels are implicit, don't warn */
+ if (channels > 2) {
+ g_warning ("Failed to retrieve channel layout from caps. This usually "
+ "means there is a GStreamer element that does not implement "
+ "multichannel audio correctly. Please file a bug.");
+ }
+
+ /* just return some default channel layout if we have one */
+ if (channels >= 1 && channels <= NUM_DEF_CHANS) {
+ const GstAudioChannelPosition *p;
+
+ p = default_positions[channels - 1];
+ return g_memdup (p, channels * sizeof (GstAudioChannelPosition));
+ }
+
+ return NULL;
+ }
+
+ g_return_val_if_fail (gst_value_array_get_size (pos_val_arr) == channels,
+ NULL);
+ for (n = 0; n < channels; n++) {
+ t = G_VALUE_TYPE (gst_value_array_get_value (pos_val_arr, n));
+ g_return_val_if_fail (t == GST_TYPE_AUDIO_CHANNEL_POSITION, NULL);
+ }
+
+ /* ... and fill array */
+ pos = g_new (GstAudioChannelPosition, channels);
+ for (n = 0; n < channels; n++) {
+ pos_val_entry = gst_value_array_get_value (pos_val_arr, n);
+ pos[n] = g_value_get_enum (pos_val_entry);
+ }
+
+ if (!gst_audio_check_channel_positions (pos, channels)) {
+ g_free (pos);
+ return NULL;
+ }
+
+ return pos;
+}
+
+void priv_gst_audio_info_fill_default_channel_positions (GstAudioInfo * info);
+
+void
+priv_gst_audio_info_fill_default_channel_positions (GstAudioInfo * info)
+{
+ guint channels, i;
+
+ g_assert (info != NULL);
+
+ channels = GST_AUDIO_INFO_CHANNELS (info);
+
+ g_assert (channels > 0);
+
+ if (channels <= NUM_DEF_CHANS) {
+ /* just return some default channel layout if we have one */
+ for (i = 0; i < channels; ++i)
+ info->position[i] = default_positions[channels - 1][i];
+ } else {
+ /* for many many channels, the positions are always NONE */
+ for (i = 0; i < G_N_ELEMENTS (info->position); i++)
+ info->position[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
+ }
+
+ info->flags |= GST_AUDIO_FLAG_DEFAULT_POSITIONS;
+}
+
+/**
+ * gst_audio_set_channel_positions:
+ * @str: A #GstStructure to set channel positions on.
+ * @pos: an array of channel positions. The number of members
+ * in this array should be equal to the (fixed!) number
+ * of the "channels" field in the given #GstStructure.
+ *
+ * Adds a "channel-positions" field to the given #GstStructure,
+ * which will represent the channel positions as given in the
+ * provided #GstAudioChannelPosition array.
+ */
+
+void
+gst_audio_set_channel_positions (GstStructure * str,
+ const GstAudioChannelPosition * pos)
+{
+ GValue pos_val_arr = { 0 }, pos_val_entry = {
+ 0};
+ gint channels, n;
+
+ gboolean res;
+
+ /* get number of channels, checkups */
+ g_return_if_fail (str != NULL);
+ g_return_if_fail (pos != NULL);
+ res = gst_structure_get_int (str, "channels", &channels);
+ g_return_if_fail (res);
+ g_return_if_fail (channels > 0);
+ if (!gst_audio_check_channel_positions (pos, channels))
+ return;
+
+ /* build gvaluearray from positions */
+ g_value_init (&pos_val_entry, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ g_value_init (&pos_val_arr, GST_TYPE_ARRAY);
+ for (n = 0; n < channels; n++) {
+ g_value_set_enum (&pos_val_entry, pos[n]);
+ gst_value_array_append_value (&pos_val_arr, &pos_val_entry);
+ }
+ g_value_unset (&pos_val_entry);
+
+ /* add to structure */
+ gst_structure_set_value (str,
+ GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME, &pos_val_arr);
+ g_value_unset (&pos_val_arr);
+}
+
+/**
+ * gst_audio_set_structure_channel_positions_list:
+ * @str: #GstStructure to set the list of channel positions
+ * on.
+ * @pos: the array containing one or more possible audio
+ * channel positions that we should add in each value
+ * of the array in the given structure.
+ * @num_positions: the number of values in pos.
+ *
+ * Sets a (possibly non-fixed) list of possible audio channel
+ * positions (given in pos) on the given structure. The
+ * structure, after this function has been called, will contain
+ * a "channel-positions" field with an array of the size of
+ * the "channels" field value in the given structure (note
+ * that this means that the channels field in the provided
+ * structure should be fixed!). Each value in the array will
+ * contain each of the values given in the pos array.
+ */
+
+void
+gst_audio_set_structure_channel_positions_list (GstStructure * str,
+ const GstAudioChannelPosition * pos, gint num_positions)
+{
+ gint channels, n, c;
+ GValue pos_val_arr = { 0 }, pos_val_list = {
+ 0}, pos_val_entry = {
+ 0};
+ gboolean res;
+
+ /* get number of channels, general type checkups */
+ g_return_if_fail (str != NULL);
+ g_return_if_fail (num_positions > 0);
+ g_return_if_fail (pos != NULL);
+ res = gst_structure_get_int (str, "channels", &channels);
+ g_return_if_fail (res);
+ g_return_if_fail (channels > 0);
+
+ /* create the array of lists */
+ g_value_init (&pos_val_arr, GST_TYPE_ARRAY);
+ g_value_init (&pos_val_entry, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ for (n = 0; n < channels; n++) {
+ g_value_init (&pos_val_list, GST_TYPE_LIST);
+ for (c = 0; c < num_positions; c++) {
+ g_value_set_enum (&pos_val_entry, pos[c]);
+ gst_value_list_append_value (&pos_val_list, &pos_val_entry);
+ }
+ gst_value_array_append_value (&pos_val_arr, &pos_val_list);
+ g_value_unset (&pos_val_list);
+ }
+ g_value_unset (&pos_val_entry);
+ gst_structure_set_value (str, GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME,
+ &pos_val_arr);
+ g_value_unset (&pos_val_arr);
+}
+
+/*
+ * Helper function for below. The structure will be conserved,
+ * but might be cut down. Any additional structures that were
+ * created will be stored in the returned caps.
+ */
+
+static GstCaps *
+add_list_to_struct (GstStructure * str,
+ const GstAudioChannelPosition * pos, gint num_positions)
+{
+ GstCaps *caps = gst_caps_new_empty ();
+
+ const GValue *chan_val;
+
+ chan_val = gst_structure_get_value (str, "channels");
+ if (G_VALUE_TYPE (chan_val) == G_TYPE_INT) {
+ gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
+ } else if (G_VALUE_TYPE (chan_val) == GST_TYPE_LIST) {
+ gint size;
+
+ const GValue *sub_val;
+
+ size = gst_value_list_get_size (chan_val);
+ sub_val = gst_value_list_get_value (chan_val, 0);
+ gst_structure_set_value (str, "channels", sub_val);
+ gst_caps_append (caps, add_list_to_struct (str, pos, num_positions));
+ while (--size > 0) {
+ str = gst_structure_copy (str);
+ sub_val = gst_value_list_get_value (chan_val, size);
+ gst_structure_set_value (str, "channels", sub_val);
+ gst_caps_append (caps, add_list_to_struct (str, pos, num_positions));
+ gst_caps_append_structure (caps, str);
+ }
+ } else if (G_VALUE_TYPE (chan_val) == GST_TYPE_INT_RANGE) {
+ gint min, max;
+
+ min = gst_value_get_int_range_min (chan_val);
+ max = gst_value_get_int_range_max (chan_val);
+
+ gst_structure_set (str, "channels", G_TYPE_INT, min, NULL);
+ gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
+ for (++min; min < max; min++) {
+ str = gst_structure_copy (str);
+ gst_structure_set (str, "channels", G_TYPE_INT, min, NULL);
+ gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
+ gst_caps_append_structure (caps, str);
+ }
+ } else {
+ g_warning ("Unexpected value type '%s' for channels field",
+ GST_STR_NULL (g_type_name (G_VALUE_TYPE (chan_val))));
+ }
+
+ return caps;
+}
+
+/**
+ * gst_audio_set_caps_channel_positions_list:
+ * @caps: #GstCaps to set the list of channel positions on.
+ * @pos: the array containing one or more possible audio
+ * channel positions that we should add in each value
+ * of the array in the given structure.
+ * @num_positions: the number of values in pos.
+ *
+ * Sets a (possibly non-fixed) list of possible audio channel
+ * positions (given in pos) on the given caps. Each of the
+ * structures of the caps, after this function has been called,
+ * will contain a "channel-positions" field with an array.
+ * Each value in the array will contain each of the values given
+ * in the pos array. Note that the size of the caps might be
+ * increased by this, since each structure with a "channel-
+ * positions" field needs to have a fixed "channels" field.
+ * The input caps is not required to have this.
+ */
+
+void
+gst_audio_set_caps_channel_positions_list (GstCaps * caps,
+ const GstAudioChannelPosition * pos, gint num_positions)
+{
+ gint size, n;
+
+ /* get number of channels, general type checkups */
+ g_return_if_fail (caps != NULL);
+ g_return_if_fail (num_positions > 0);
+ g_return_if_fail (pos != NULL);
+
+ size = gst_caps_get_size (caps);
+ for (n = 0; n < size; n++) {
+ gst_caps_append (caps, add_list_to_struct (gst_caps_get_structure (caps,
+ n), pos, num_positions));
+ }
+}
+
+/**
+ * gst_audio_fixate_channel_positions:
+ * @str: a #GstStructure containing a (possibly unfixed)
+ * "channel-positions" field.
+ *
+ * Custom fixate function. Elements that implement some sort of
+ * channel conversion algorithm should use this function for
+ * fixating on GstAudioChannelPosition properties. It will take
+ * care of equal channel positioning (left/right). Caller g_free()s
+ * the return value. The input properties may be (and are supposed
+ * to be) unfixed.
+ * Note that this function is mostly a hack because we currently
+ * have no way to add default fixation functions for new GTypes.
+ *
+ * Returns: fixed values that the caller could use as a fixed
+ * set of #GstAudioChannelPosition values.
+ */
+
+GstAudioChannelPosition *
+gst_audio_fixate_channel_positions (GstStructure * str)
+{
+ GstAudioChannelPosition *pos;
+
+ gint channels, n, num_unfixed = 0, i, c;
+
+ const GValue *pos_val_arr, *pos_val_entry, *pos_val;
+
+ gboolean res, is_stereo = TRUE;
+
+ GType t;
+
+ /*
+ * We're going to do this cluelessly. We'll make an array of values that
+ * conflict with each other and, for each iteration in this array, pick
+ * either one until all unknown values are filled. This might not work in
+ * corner cases but should work OK for the general case.
+ */
+ const struct
+ {
+ const GstAudioChannelPosition pos1[2];
+ const GstAudioChannelPosition pos2[1];
+ } conf[] = {
+ /* front: mono <-> stereo */
+ {
+ {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}}, { {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}}, { {
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
+ GST_AUDIO_CHANNEL_POSITION_LFE}}, { {
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}
+ };
+ struct
+ {
+ gint num_opt[3];
+ guint num_opts[3];
+ gboolean is_fixed[3];
+ gint choice; /* -1 is none, 0 is the two, 1 is the one */
+ } opt;
+
+ /* get number of channels, general type checkups */
+ g_return_val_if_fail (str != NULL, NULL);
+ res = gst_structure_get_int (str, "channels", &channels);
+ g_return_val_if_fail (res, NULL);
+ g_return_val_if_fail (channels > 0, NULL);
+
+ /* 0.8.x mono/stereo checks */
+ pos_val_arr = gst_structure_get_value (str,
+ GST_AUDIO_CHANNEL_POSITIONS_FIELD_NAME);
+ if (!pos_val_arr && (channels == 1 || channels == 2)) {
+ pos = g_new (GstAudioChannelPosition, channels);
+ if (channels == 1) {
+ pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
+ } else {
+ pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ }
+ return pos;
+ }
+ g_return_val_if_fail (pos_val_arr != NULL, NULL);
+ g_return_val_if_fail (gst_value_array_get_size (pos_val_arr) == channels,
+ NULL);
+ for (n = 0; n < channels; n++) {
+ t = G_VALUE_TYPE (gst_value_array_get_value (pos_val_arr, n));
+ g_return_val_if_fail (t == GST_TYPE_LIST ||
+ t == GST_TYPE_AUDIO_CHANNEL_POSITION, NULL);
+ }
+
+ /* all unknown, to start with */
+ pos = g_new (GstAudioChannelPosition, channels);
+ for (n = 0; n < channels; n++)
+ pos[n] = GST_AUDIO_CHANNEL_POSITION_INVALID;
+ num_unfixed = channels;
+
+ /* Iterate the array of conflicting values */
+ for (i = 0; conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID ||
+ conf[i].pos2[0] != GST_AUDIO_CHANNEL_POSITION_INVALID; i++) {
+ /* front/center only important if not mono (obviously) */
+ if (conf[i].pos1[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER &&
+ !is_stereo)
+ continue;
+
+ /* init values */
+ for (n = 0; n < 3; n++) {
+ opt.num_opt[n] = -1;
+ opt.num_opts[n] = -1;
+ opt.is_fixed[n] = FALSE;
+ }
+
+ /* Now, we'll see for each channel if it allows for any of the values in
+ * the set of conflicting audio channel positions and keep scores. */
+ for (n = 0; n < channels; n++) {
+ /* if the channel is already taken, don't bother */
+ if (pos[n] != GST_AUDIO_CHANNEL_POSITION_INVALID)
+ continue;
+
+ pos_val_entry = gst_value_array_get_value (pos_val_arr, n);
+ t = G_VALUE_TYPE (pos_val_entry);
+ if (t == GST_TYPE_LIST) {
+ /* This algorhythm is suboptimal. */
+ for (c = 0; c < gst_value_list_get_size (pos_val_entry); c++) {
+ pos_val = gst_value_list_get_value (pos_val_entry, c);
+ if (g_value_get_enum (pos_val) == conf[i].pos1[0] &&
+ opt.num_opts[0] > gst_value_list_get_size (pos_val_entry) &&
+ !opt.is_fixed[0]) {
+ /* Now test if the old position of num_opt[0] also allows for
+ * the other channel (which was skipped previously). If so,
+ * keep score. */
+ if (opt.num_opt[0] != -1) {
+ gint c1;
+
+ pos_val_entry = gst_value_array_get_value (pos_val_arr,
+ opt.num_opt[0]);
+ if (G_VALUE_TYPE (pos_val_entry) == GST_TYPE_LIST) {
+ for (c1 = 0; c1 < gst_value_list_get_size (pos_val_entry); c1++) {
+ pos_val = gst_value_list_get_value (pos_val_entry, c1);
+ if (g_value_get_enum (pos_val) == conf[i].pos1[1] &&
+ opt.num_opts[1] > opt.num_opts[0] && !opt.is_fixed[1]) {
+ opt.num_opts[1] = opt.num_opts[0];
+ opt.num_opt[1] = opt.num_opt[0];
+ }
+ }
+ pos_val = gst_value_list_get_value (pos_val_entry, c);
+ }
+ pos_val_entry = gst_value_array_get_value (pos_val_arr, n);
+ }
+
+ /* and save values */
+ opt.num_opts[0] = gst_value_list_get_size (pos_val_entry);
+ opt.num_opt[0] = n;
+ } else if (g_value_get_enum (pos_val) == conf[i].pos1[1] &&
+ opt.num_opts[1] > gst_value_list_get_size (pos_val_entry) &&
+ !opt.is_fixed[1] && n != opt.num_opt[0]) {
+ opt.num_opts[1] = gst_value_list_get_size (pos_val_entry);
+ opt.num_opt[1] = n;
+ }
+
+ /* 2 goes separately, because 0/1 vs. 2 are separate */
+ if (g_value_get_enum (pos_val) == conf[i].pos2[0] &&
+ opt.num_opts[2] > gst_value_list_get_size (pos_val_entry) &&
+ !opt.is_fixed[2]) {
+ opt.num_opts[2] = gst_value_list_get_size (pos_val_entry);
+ opt.num_opt[2] = n;
+ }
+ }
+ } else {
+ if (g_value_get_enum (pos_val_entry) == conf[i].pos1[0]) {
+ opt.num_opt[0] = n;
+ opt.is_fixed[0] = TRUE;
+ } else if (g_value_get_enum (pos_val_entry) == conf[i].pos1[1]) {
+ opt.num_opt[1] = n;
+ opt.is_fixed[1] = TRUE;
+ } else if (g_value_get_enum (pos_val_entry) == conf[i].pos2[0]) {
+ opt.num_opt[2] = n;
+ opt.is_fixed[2] = TRUE;
+ }
+ }
+ }
+
+ /* check our results and choose either one */
+ if ((opt.is_fixed[0] || opt.is_fixed[1]) && opt.is_fixed[2]) {
+ g_warning ("Pre-fixated on both %d/%d and %d - conflict!",
+ conf[i].pos1[0], conf[i].pos1[1], conf[i].pos2[0]);
+ g_free (pos);
+ return NULL;
+ } else if ((opt.is_fixed[0] && opt.num_opt[1] == -1) ||
+ (opt.is_fixed[1] && opt.num_opt[0] == -1)) {
+ g_warning ("Pre-fixated one side, but other side n/a of %d/%d",
+ conf[i].pos1[0], conf[i].pos1[1]);
+ g_free (pos);
+ return NULL;
+ } else if (opt.is_fixed[0] || opt.is_fixed[1]) {
+ opt.choice = 0;
+ } else if (opt.is_fixed[2]) {
+ opt.choice = 1;
+ } else if (opt.num_opt[0] != -1 && opt.num_opt[1] != -1) {
+ opt.choice = 0;
+ } else if (opt.num_opt[2] != -1) {
+ opt.choice = 1;
+ } else {
+ opt.choice = -1;
+ }
+
+ /* stereo? Note that we keep is_stereo to TRUE if we didn't decide on
+ * any arrangement. The mono/stereo channels might be handled elsewhere
+ * which is clearly outside the scope of this element, so we cannot
+ * know and expect the application to handle that then. */
+ if (conf[i].pos2[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO &&
+ opt.choice == 1) {
+ is_stereo = FALSE;
+ }
+
+ /* now actually decide what we'll do and fixate on that */
+ if (opt.choice == 0) {
+ g_assert (conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID &&
+ conf[i].pos1[1] != GST_AUDIO_CHANNEL_POSITION_INVALID);
+ pos[opt.num_opt[0]] = conf[i].pos1[0];
+ pos[opt.num_opt[1]] = conf[i].pos1[1];
+ num_unfixed -= 2;
+ } else if (opt.choice == 1) {
+ g_assert (conf[i].pos2[0] != GST_AUDIO_CHANNEL_POSITION_INVALID);
+ pos[opt.num_opt[2]] = conf[i].pos2[0];
+ num_unfixed--;
+ }
+ }
+
+ /* safety check */
+ if (num_unfixed > 0) {
+ g_warning ("%d unfixed channel positions left after fixation!",
+ num_unfixed);
+ g_free (pos);
+ return NULL;
+ }
+
+ if (!gst_audio_check_channel_positions (pos, channels)) {
+ g_free (pos);
+ return NULL;
+ }
+
+ return pos;
+}
diff --git a/gst-libs/gst/audio/multichannel.h b/gst-libs/gst/audio/multichannel.h
new file mode 100644
index 0000000..186ba3c
--- /dev/null
+++ b/gst-libs/gst/audio/multichannel.h
@@ -0,0 +1,134 @@
+/* GStreamer Multichannel-Audio helper functions
+ * (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/audio/audio.h>
+#include <gst/audio/audio-enumtypes.h>
+
+#ifndef __GST_AUDIO_MULTICHANNEL_H__
+#define __GST_AUDIO_MULTICHANNEL_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GstAudioChannelPosition:
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_MONO: front mono
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT: front left
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT: front right
+ * @GST_AUDIO_CHANNEL_POSITION_REAR_CENTER: rear center
+ * @GST_AUDIO_CHANNEL_POSITION_REAR_LEFT: rear left
+ * @GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT: rear right
+ * @GST_AUDIO_CHANNEL_POSITION_LFE: subwoofer
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER: front center
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: front left of center
+ * @GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: front right of center
+ * @GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT: side left
+ * @GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT: side right
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_CENTER: top center
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT: top front left
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT: top front right
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER: top front center
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT: top rear left
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT: top rear right
+ * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER: top rear center
+ * @GST_AUDIO_CHANNEL_POSITION_NONE: used for position-less channels, e.g.
+ * from a sound card that records 1024 channels; mutually exclusive with
+ * any other channel position
+ * @GST_AUDIO_CHANNEL_POSITION_INVALID: invalid position
+ *
+ * Audio channel positions.
+ */
+typedef enum {
+ GST_AUDIO_CHANNEL_POSITION_INVALID = -1,
+
+ /* Main front speakers. Mono and left/right are mututally exclusive! */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+
+ /* rear. Left/right and center are mututally exclusive! */
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+
+ /* subwoofer/low-frequency */
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+
+ /* Center front speakers. Center and left/right_of_center cannot be
+ * used together! */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+
+ /* sides */
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+
+ GST_AUDIO_CHANNEL_POSITION_TOP_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER,
+
+ /* for multi-channel input and output with more than 8 channels,
+ * incompatible with all other positions, either all positions
+ * are defined or all positions are undefined, but can't mix'n'match */
+ GST_AUDIO_CHANNEL_POSITION_NONE,
+
+ /*< private >*/
+ /* don't use - counter */
+ GST_AUDIO_CHANNEL_POSITION_NUM
+} GstAudioChannelPosition;
+
+/* Retrieves or sets the positions from/to a GstStructure. Only
+ * works with fixed caps, caller should check for that! Caller
+ * g_free()s result of the getter. */
+GstAudioChannelPosition *
+ gst_audio_get_channel_positions (GstStructure *str);
+void gst_audio_set_channel_positions (GstStructure *str,
+ const GstAudioChannelPosition *pos);
+
+/* Sets a (non-fixed) list of possible audio channel positions
+ * on a structure (this requires the "channels" property to
+ * be fixed!) or on a caps (here, the "channels" property may be
+ * unfixed and the caps may even contain multiple structures). */
+void gst_audio_set_structure_channel_positions_list
+ (GstStructure *str,
+ const GstAudioChannelPosition *pos,
+ gint num_positions);
+void gst_audio_set_caps_channel_positions_list
+ (GstCaps *caps,
+ const GstAudioChannelPosition *pos,
+ gint num_positions);
+
+/* Custom fixate function. Elements that implement some sort of
+ * channel conversion algorhithm should use this function for
+ * fixating on GstAudioChannelPosition properties. It will take
+ * care of equal channel positioning (left/right). Caller g_free()s
+ * the return value. The input properties may be (and are supposed
+ * to be) unfixed. */
+GstAudioChannelPosition *
+ gst_audio_fixate_channel_positions (GstStructure *str);
+
+gboolean gst_audio_check_channel_positions (const GstAudioChannelPosition * pos, guint channels);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_MULTICHANNEL_H__ */
diff --git a/gst-libs/gst/cdda/Makefile.am b/gst-libs/gst/cdda/Makefile.am
new file mode 100644
index 0000000..c72a62c
--- /dev/null
+++ b/gst-libs/gst/cdda/Makefile.am
@@ -0,0 +1,71 @@
+lib_LTLIBRARIES = libgstcdda-@GST_MAJORMINOR@.la
+
+libgstcdda_@GST_MAJORMINOR@_la_SOURCES = \
+ gstcddabasesrc.c
+
+libgstcdda_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/cdda
+libgstcdda_@GST_MAJORMINOR@include_HEADERS = \
+ gstcddabasesrc.h
+
+libgstcdda_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la
+libgstcdda_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstcdda_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+# Disabled until this is fixed:
+# http://bugzilla.gnome.org/show_bug.cgi?id=594209
+if FALSE
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstCdda-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstcdda_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstcdda_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/cdda/%',$(libgstcdda_@GST_MAJORMINOR@include_HEADERS))
+
+GstCdda-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcdda-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstCdda \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ --add-include-path=$(builddir)/../tag \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstcdda-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --include=GstTag-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg gstreamer-tag-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-cdda-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=$(builddir)/../tag \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+endif
diff --git a/gst-libs/gst/cdda/Makefile.in b/gst-libs/gst/cdda/Makefile.in
new file mode 100644
index 0000000..010a10d
--- /dev/null
+++ b/gst-libs/gst/cdda/Makefile.in
@@ -0,0 +1,824 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/cdda
+DIST_COMMON = $(libgstcdda_@GST_MAJORMINOR@include_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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" \
+ "$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstcdda_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la
+am_libgstcdda_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo
+libgstcdda_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstcdda_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstcdda_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstcdda_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstcdda_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstcdda_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstcdda_@GST_MAJORMINOR@_la_SOURCES)
+HEADERS = $(libgstcdda_@GST_MAJORMINOR@include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstcdda-@GST_MAJORMINOR@.la
+libgstcdda_@GST_MAJORMINOR@_la_SOURCES = \
+ gstcddabasesrc.c
+
+libgstcdda_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/cdda
+libgstcdda_@GST_MAJORMINOR@include_HEADERS = \
+ gstcddabasesrc.h
+
+libgstcdda_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la
+
+libgstcdda_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstcdda_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+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-libs/gst/cdda/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/cdda/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstcdda-@GST_MAJORMINOR@.la: $(libgstcdda_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcdda_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcdda_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstcdda_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcdda_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo: gstcddabasesrc.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) $(libgstcdda_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo -MD -MP -MF $(DEPDIR)/libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.Tpo -c -o libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo `test -f 'gstcddabasesrc.c' || echo '$(srcdir)/'`gstcddabasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.Tpo $(DEPDIR)/libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcddabasesrc.c' object='libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcdda_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcdda_@GST_MAJORMINOR@_la-gstcddabasesrc.lo `test -f 'gstcddabasesrc.c' || echo '$(srcdir)/'`gstcddabasesrc.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-libgstcdda_@GST_MAJORMINOR@includeHEADERS: $(libgstcdda_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstcdda_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstcdda_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcdda_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstcdda_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstcdda_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcdda_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(libgstcdda_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-libgstcdda_@GST_MAJORMINOR@includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-libLTLIBRARIES \
+ uninstall-libgstcdda_@GST_MAJORMINOR@includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-libLTLIBRARIES \
+ install-libgstcdda_@GST_MAJORMINOR@includeHEADERS 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 \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstcdda_@GST_MAJORMINOR@includeHEADERS
+
+
+#GstCdda-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcdda-@GST_MAJORMINOR@.la
+# $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+# GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+# $(INTROSPECTION_SCANNER) -v --namespace GstCdda \
+# --nsversion=@GST_MAJORMINOR@ \
+# --strip-prefix=Gst \
+# $(gir_cincludes) \
+# -DGST_USE_UNSTABLE_API \
+# --add-include-path=$(builddir)/../tag \
+# --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+# --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+# --library=libgstcdda-@GST_MAJORMINOR@.la \
+# --include=Gst-@GST_MAJORMINOR@ \
+# --include=GstBase-@GST_MAJORMINOR@ \
+# --include=GstTag-@GST_MAJORMINOR@ \
+# --libtool="$(top_builddir)/libtool" \
+# --pkg gstreamer-@GST_MAJORMINOR@ \
+# --pkg gstreamer-base-@GST_MAJORMINOR@ \
+# --pkg gstreamer-tag-@GST_MAJORMINOR@ \
+# --pkg-export gstreamer-cdda-@GST_MAJORMINOR@ \
+# --add-init-section="gst_init(NULL,NULL);" \
+# --output $@ \
+# $(gir_headers) \
+# $(gir_sources)
+
+#%.typelib: %.gir $(INTROSPECTION_COMPILER)
+# $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+# $(INTROSPECTION_COMPILER) \
+# --includedir=$(srcdir) \
+# --includedir=$(builddir) \
+# --includedir=$(builddir)/../tag \
+# --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+# --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+# $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+# 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-libs/gst/cdda/gstcddabasesrc.c b/gst-libs/gst/cdda/gstcddabasesrc.c
new file mode 100644
index 0000000..e308bbe
--- /dev/null
+++ b/gst-libs/gst/cdda/gstcddabasesrc.c
@@ -0,0 +1,1640 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* TODO:
+ *
+ * - in ::start(), we want to post a tags message with an array or a list
+ * of tagslists of all tracks, so that applications know at least the
+ * number of tracks and all track durations immediately without having
+ * to do any querying. We have to decide what type and name to use for
+ * this array of track taglists.
+ *
+ * - FIX cddb discid calculation algorithm for mixed mode CDs - do we use
+ * offsets and duration of ALL tracks (data + audio) for the CDDB ID
+ * calculation, or only audio tracks?
+ *
+ * - Do we really need properties for the TOC bias/offset stuff? Wouldn't
+ * environment variables make much more sense? Do we need this at all
+ * (does it only affect ancient hardware?)
+ */
+
+/**
+ * SECTION:gstcddabasesrc
+ * @short_description: Base class for CD digital audio (CDDA) sources
+ *
+ * <refsect2>
+ * <para>
+ * Provides a base class for CDDA sources, which handles things like seeking,
+ * querying, discid calculation, tags, and buffer timestamping.
+ * </para>
+ * <title>Using GstCddaBaseSrc-based elements in applications</title>
+ * <para>
+ * GstCddaBaseSrc registers two #GstFormat<!-- -->s of its own, namely
+ * the "track" format and the "sector" format. Applications will usually
+ * only find the "track" format interesting. You can retrieve that #GstFormat
+ * for use in seek events or queries with gst_format_get_by_nick("track").
+ * </para>
+ * <para>
+ * In order to query the number of tracks, for example, an application would
+ * set the CDDA source element to READY or PAUSED state and then query the
+ * the number of tracks via gst_element_query_duration() using the track
+ * format acquired above. Applications can query the currently playing track
+ * in the same way.
+ * </para>
+ * <para>
+ * Alternatively, applications may retrieve the currently playing track and
+ * the total number of tracks from the taglist that will posted on the bus
+ * whenever the CD is opened or the currently playing track changes. The
+ * taglist will contain GST_TAG_TRACK_NUMBER and GST_TAG_TRACK_COUNT tags.
+ * </para>
+ * <para>
+ * Applications playing back CD audio using playbin and cdda://n URIs should
+ * issue a seek command in track format to change between tracks, rather than
+ * setting a new cdda://n+1 URI on playbin (as setting a new URI on playbin
+ * involves closing and re-opening the CD device, which is much much slower).
+ * </para>
+ * <title>Tags and meta-information</title>
+ * <para>
+ * CDDA sources will automatically emit a number of tags, details about which
+ * can be found in the libgsttag documentation. Those tags are:
+ * #GST_TAG_CDDA_CDDB_DISCID, #GST_TAG_CDDA_CDDB_DISCID_FULL,
+ * #GST_TAG_CDDA_MUSICBRAINZ_DISCID, #GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL,
+ * among others.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h> /* for strtol */
+
+#include <gst/audio/audio.h>
+#include "gstcddabasesrc.h"
+#include "gst/gst-i18n-plugin.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_cdda_base_src_debug);
+#define GST_CAT_DEFAULT gst_cdda_base_src_debug
+
+#define DEFAULT_DEVICE "/dev/cdrom"
+
+#define CD_FRAMESIZE_RAW (2352)
+
+#define SECTORS_PER_SECOND (75)
+#define SECTORS_PER_MINUTE (75*60)
+#define SAMPLES_PER_SECTOR (CD_FRAMESIZE_RAW >> 2)
+#define TIME_INTERVAL_FROM_SECTORS(sectors) ((SAMPLES_PER_SECTOR * sectors * GST_SECOND) / 44100)
+#define SECTORS_FROM_TIME_INTERVAL(dtime) (dtime * 44100 / (SAMPLES_PER_SECTOR * GST_SECOND))
+
+enum
+{
+ ARG_0,
+ ARG_MODE,
+ ARG_DEVICE,
+ ARG_TRACK,
+ ARG_TOC_OFFSET,
+ ARG_TOC_BIAS
+};
+
+static void gst_cdda_base_src_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+static void gst_cdda_base_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_cdda_base_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_cdda_base_src_finalize (GObject * obj);
+static const GstQueryType *gst_cdda_base_src_get_query_types (GstPad * pad);
+static gboolean gst_cdda_base_src_query (GstBaseSrc * src, GstQuery * query);
+static gboolean gst_cdda_base_src_handle_event (GstBaseSrc * basesrc,
+ GstEvent * event);
+static gboolean gst_cdda_base_src_do_seek (GstBaseSrc * basesrc,
+ GstSegment * segment);
+static gboolean gst_cdda_base_src_start (GstBaseSrc * basesrc);
+static gboolean gst_cdda_base_src_stop (GstBaseSrc * basesrc);
+static GstFlowReturn gst_cdda_base_src_create (GstPushSrc * pushsrc,
+ GstBuffer ** buf);
+static gboolean gst_cdda_base_src_is_seekable (GstBaseSrc * basesrc);
+static void gst_cdda_base_src_update_duration (GstCddaBaseSrc * src);
+static void gst_cdda_base_src_set_index (GstElement * src, GstIndex * index);
+static GstIndex *gst_cdda_base_src_get_index (GstElement * src);
+
+#define gst_cdda_base_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstCddaBaseSrc, gst_cdda_base_src, GST_TYPE_PUSH_SRC,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER,
+ gst_cdda_base_src_uri_handler_init));
+
+#define SRC_CAPS \
+ "audio/x-raw, " \
+ "format = (string) " GST_AUDIO_NE(S16) ", " \
+ "rate = (int) 44100, " \
+ "channels = (int) 2" \
+
+static GstStaticPadTemplate gst_cdda_base_src_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (SRC_CAPS)
+ );
+
+/* our two formats */
+static GstFormat track_format;
+static GstFormat sector_format;
+
+GType
+gst_cdda_base_src_mode_get_type (void)
+{
+ static GType mode_type; /* 0 */
+ static const GEnumValue modes[] = {
+ {GST_CDDA_BASE_SRC_MODE_NORMAL, "Stream consists of a single track",
+ "normal"},
+ {GST_CDDA_BASE_SRC_MODE_CONTINUOUS, "Stream consists of the whole disc",
+ "continuous"},
+ {0, NULL, NULL}
+ };
+
+ if (mode_type == 0)
+ mode_type = g_enum_register_static ("GstCddaBaseSrcMode", modes);
+
+ return mode_type;
+}
+
+static void
+gst_cdda_base_src_class_init (GstCddaBaseSrcClass * klass)
+{
+ GstElementClass *element_class;
+ GstPushSrcClass *pushsrc_class;
+ GstBaseSrcClass *basesrc_class;
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+ element_class = (GstElementClass *) klass;
+ basesrc_class = (GstBaseSrcClass *) klass;
+ pushsrc_class = (GstPushSrcClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_cdda_base_src_debug, "cddabasesrc", 0,
+ "CDDA Base Source");
+
+ /* our very own formats */
+ track_format = gst_format_register ("track", "CD track");
+ sector_format = gst_format_register ("sector", "CD sector");
+
+ /* register CDDA tags */
+ gst_tag_register_musicbrainz_tags ();
+
+#if 0
+ ///// FIXME: what type to use here? ///////
+ gst_tag_register (GST_TAG_CDDA_TRACK_TAGS, GST_TAG_FLAG_META, GST_TYPE_TAG_LIST, "track-tags", "CDDA taglist for one track", gst_tag_merge_use_first); ///////////// FIXME: right function??? ///////
+#endif
+
+ gobject_class->set_property = gst_cdda_base_src_set_property;
+ gobject_class->get_property = gst_cdda_base_src_get_property;
+ gobject_class->finalize = gst_cdda_base_src_finalize;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE,
+ g_param_spec_string ("device", "Device", "CD device location",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODE,
+ g_param_spec_enum ("mode", "Mode", "Mode", GST_TYPE_CDDA_BASE_SRC_MODE,
+ GST_CDDA_BASE_SRC_MODE_NORMAL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TRACK,
+ g_param_spec_uint ("track", "Track", "Track", 1, 99, 1,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+#if 0
+ /* Do we really need this toc adjustment stuff as properties? does the user
+ * have a chance to set it in practice, e.g. when using sound-juicer, rb,
+ * totem, whatever? Shouldn't we rather use environment variables
+ * for this? (tpm) */
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOC_OFFSET,
+ g_param_spec_int ("toc-offset", "Table of contents offset",
+ "Add <n> sectors to the values reported", G_MININT, G_MAXINT, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOC_BIAS,
+ g_param_spec_boolean ("toc-bias", "Table of contents bias",
+ "Assume that the beginning offset of track 1 as reported in the TOC "
+ "will be addressed as LBA 0. Necessary for some Toshiba drives to "
+ "get track boundaries", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+#endif
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_cdda_base_src_src_template));
+
+ element_class->set_index = GST_DEBUG_FUNCPTR (gst_cdda_base_src_set_index);
+ element_class->get_index = GST_DEBUG_FUNCPTR (gst_cdda_base_src_get_index);
+
+ basesrc_class->start = GST_DEBUG_FUNCPTR (gst_cdda_base_src_start);
+ basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_cdda_base_src_stop);
+ basesrc_class->query = GST_DEBUG_FUNCPTR (gst_cdda_base_src_query);
+ basesrc_class->event = GST_DEBUG_FUNCPTR (gst_cdda_base_src_handle_event);
+ basesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_cdda_base_src_do_seek);
+ basesrc_class->is_seekable =
+ GST_DEBUG_FUNCPTR (gst_cdda_base_src_is_seekable);
+
+ pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_cdda_base_src_create);
+}
+
+static void
+gst_cdda_base_src_init (GstCddaBaseSrc * src)
+{
+ gst_pad_set_query_type_function (GST_BASE_SRC_PAD (src),
+ GST_DEBUG_FUNCPTR (gst_cdda_base_src_get_query_types));
+
+ /* we're not live and we operate in time */
+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
+ gst_base_src_set_live (GST_BASE_SRC (src), FALSE);
+
+ src->device = NULL;
+ src->mode = GST_CDDA_BASE_SRC_MODE_NORMAL;
+ src->uri_track = -1;
+}
+
+static void
+gst_cdda_base_src_finalize (GObject * obj)
+{
+ GstCddaBaseSrc *cddasrc = GST_CDDA_BASE_SRC (obj);
+
+ g_free (cddasrc->uri);
+ g_free (cddasrc->device);
+
+ if (cddasrc->index)
+ gst_object_unref (cddasrc->index);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_cdda_base_src_set_device (GstCddaBaseSrc * src, const gchar * device)
+{
+ if (src->device)
+ g_free (src->device);
+ src->device = NULL;
+
+ if (!device)
+ return;
+
+ /* skip multiple slashes */
+ while (*device == '/' && *(device + 1) == '/')
+ device++;
+
+#ifdef __sun
+ /*
+ * On Solaris, /dev/rdsk is used for accessing the CD device, but some
+ * applications pass in /dev/dsk, so correct.
+ */
+ if (strncmp (device, "/dev/dsk", 8) == 0) {
+ gchar *rdsk_value;
+ rdsk_value = g_strdup_printf ("/dev/rdsk%s", device + 8);
+ src->device = g_strdup (rdsk_value);
+ g_free (rdsk_value);
+ } else {
+#endif
+ src->device = g_strdup (device);
+#ifdef __sun
+ }
+#endif
+}
+
+static void
+gst_cdda_base_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (object);
+
+ GST_OBJECT_LOCK (src);
+
+ switch (prop_id) {
+ case ARG_MODE:{
+ src->mode = g_value_get_enum (value);
+ break;
+ }
+ case ARG_DEVICE:{
+ const gchar *dev = g_value_get_string (value);
+
+ gst_cdda_base_src_set_device (src, dev);
+ break;
+ }
+ case ARG_TRACK:{
+ guint track = g_value_get_uint (value);
+
+ if (src->num_tracks > 0 && track > src->num_tracks) {
+ g_warning ("Invalid track %u", track);
+ } else if (track > 0 && src->tracks != NULL) {
+ src->cur_sector = src->tracks[track - 1].start;
+ src->uri_track = track;
+ } else {
+ src->uri_track = track; /* seek will be done in start() */
+ }
+ break;
+ }
+ case ARG_TOC_OFFSET:{
+ src->toc_offset = g_value_get_int (value);
+ break;
+ }
+ case ARG_TOC_BIAS:{
+ src->toc_bias = g_value_get_boolean (value);
+ break;
+ }
+ default:{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ GST_OBJECT_UNLOCK (src);
+}
+
+static void
+gst_cdda_base_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstCddaBaseSrcClass *klass = GST_CDDA_BASE_SRC_GET_CLASS (object);
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (object);
+
+ GST_OBJECT_LOCK (src);
+
+ switch (prop_id) {
+ case ARG_MODE:
+ g_value_set_enum (value, src->mode);
+ break;
+ case ARG_DEVICE:{
+ if (src->device == NULL && klass->get_default_device != NULL) {
+ gchar *d = klass->get_default_device (src);
+
+ if (d != NULL) {
+ g_value_set_string (value, DEFAULT_DEVICE);
+ g_free (d);
+ break;
+ }
+ }
+ if (src->device == NULL)
+ g_value_set_string (value, DEFAULT_DEVICE);
+ else
+ g_value_set_string (value, src->device);
+ break;
+ }
+ case ARG_TRACK:{
+ if (src->num_tracks <= 0 && src->uri_track > 0) {
+ g_value_set_uint (value, src->uri_track);
+ } else {
+ g_value_set_uint (value, src->cur_track + 1);
+ }
+ break;
+ }
+ case ARG_TOC_OFFSET:
+ g_value_set_int (value, src->toc_offset);
+ break;
+ case ARG_TOC_BIAS:
+ g_value_set_boolean (value, src->toc_bias);
+ break;
+ default:{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ GST_OBJECT_UNLOCK (src);
+}
+
+static gint
+gst_cdda_base_src_get_track_from_sector (GstCddaBaseSrc * src, gint sector)
+{
+ gint i;
+
+ for (i = 0; i < src->num_tracks; ++i) {
+ if (sector >= src->tracks[i].start && sector <= src->tracks[i].end)
+ return i;
+ }
+ return -1;
+}
+
+static const GstQueryType *
+gst_cdda_base_src_get_query_types (GstPad * pad)
+{
+ static const GstQueryType src_query_types[] = {
+ GST_QUERY_DURATION,
+ GST_QUERY_POSITION,
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return src_query_types;
+}
+
+static gboolean
+gst_cdda_base_src_convert (GstCddaBaseSrc * src, GstFormat src_format,
+ gint64 src_val, GstFormat dest_format, gint64 * dest_val)
+{
+ gboolean started;
+
+ GST_LOG_OBJECT (src, "converting value %" G_GINT64_FORMAT " from %s into %s",
+ src_val, gst_format_get_name (src_format),
+ gst_format_get_name (dest_format));
+
+ if (src_format == dest_format) {
+ *dest_val = src_val;
+ return TRUE;
+ }
+
+ started = GST_OBJECT_FLAG_IS_SET (GST_BASE_SRC (src), GST_BASE_SRC_STARTED);
+
+ if (src_format == track_format) {
+ if (!started)
+ goto not_started;
+ if (src_val < 0 || src_val >= src->num_tracks) {
+ GST_DEBUG_OBJECT (src, "track number %d out of bounds", (gint) src_val);
+ goto wrong_value;
+ }
+ src_format = GST_FORMAT_DEFAULT;
+ src_val = src->tracks[src_val].start * SAMPLES_PER_SECTOR;
+ } else if (src_format == sector_format) {
+ src_format = GST_FORMAT_DEFAULT;
+ src_val = src_val * SAMPLES_PER_SECTOR;
+ }
+
+ if (src_format == dest_format) {
+ *dest_val = src_val;
+ goto done;
+ }
+
+ switch (src_format) {
+ case GST_FORMAT_BYTES:
+ /* convert to samples (4 bytes per sample) */
+ src_val = src_val >> 2;
+ /* fallthrough */
+ case GST_FORMAT_DEFAULT:{
+ switch (dest_format) {
+ case GST_FORMAT_BYTES:{
+ if (src_val < 0) {
+ GST_DEBUG_OBJECT (src, "sample source value negative");
+ goto wrong_value;
+ }
+ *dest_val = src_val << 2; /* 4 bytes per sample */
+ break;
+ }
+ case GST_FORMAT_TIME:{
+ *dest_val = gst_util_uint64_scale_int (src_val, GST_SECOND, 44100);
+ break;
+ }
+ default:{
+ gint64 sector = src_val / SAMPLES_PER_SECTOR;
+
+ if (dest_format == sector_format) {
+ *dest_val = sector;
+ } else if (dest_format == track_format) {
+ if (!started)
+ goto not_started;
+ *dest_val = gst_cdda_base_src_get_track_from_sector (src, sector);
+ } else {
+ goto unknown_format;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ case GST_FORMAT_TIME:{
+ gint64 sample_offset;
+
+ if (src_val == GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (src, "source time value invalid");
+ goto wrong_value;
+ }
+
+ sample_offset = gst_util_uint64_scale_int (src_val, 44100, GST_SECOND);
+ switch (dest_format) {
+ case GST_FORMAT_BYTES:{
+ *dest_val = sample_offset << 2; /* 4 bytes per sample */
+ break;
+ }
+ case GST_FORMAT_DEFAULT:{
+ *dest_val = sample_offset;
+ break;
+ }
+ default:{
+ gint64 sector = sample_offset / SAMPLES_PER_SECTOR;
+
+ if (dest_format == sector_format) {
+ *dest_val = sector;
+ } else if (dest_format == track_format) {
+ if (!started)
+ goto not_started;
+ *dest_val = gst_cdda_base_src_get_track_from_sector (src, sector);
+ } else {
+ goto unknown_format;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ default:{
+ goto unknown_format;
+ }
+ }
+
+done:
+ {
+ GST_LOG_OBJECT (src, "returning %" G_GINT64_FORMAT, *dest_val);
+ return TRUE;
+ }
+
+unknown_format:
+ {
+ GST_DEBUG_OBJECT (src, "conversion failed: %s", "unsupported format");
+ return FALSE;
+ }
+
+wrong_value:
+ {
+ GST_DEBUG_OBJECT (src, "conversion failed: %s",
+ "source value not within allowed range");
+ return FALSE;
+ }
+
+not_started:
+ {
+ GST_DEBUG_OBJECT (src, "conversion failed: %s",
+ "cannot do this conversion, device not open");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_cdda_base_src_query (GstBaseSrc * basesrc, GstQuery * query)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (basesrc);
+ gboolean started;
+
+ started = GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED);
+
+ GST_LOG_OBJECT (src, "handling %s query",
+ gst_query_type_get_name (GST_QUERY_TYPE (query)));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:{
+ GstFormat dest_format;
+ gint64 dest_val;
+ guint sectors;
+
+ gst_query_parse_duration (query, &dest_format, NULL);
+
+ if (!started)
+ return FALSE;
+
+ g_assert (src->tracks != NULL);
+
+ if (dest_format == track_format) {
+ GST_LOG_OBJECT (src, "duration: %d tracks", src->num_tracks);
+ gst_query_set_duration (query, track_format, src->num_tracks);
+ return TRUE;
+ }
+
+ if (src->cur_track < 0 || src->cur_track >= src->num_tracks)
+ return FALSE;
+
+ if (src->mode == GST_CDDA_BASE_SRC_MODE_NORMAL) {
+ sectors = src->tracks[src->cur_track].end -
+ src->tracks[src->cur_track].start + 1;
+ } else {
+ sectors = src->tracks[src->num_tracks - 1].end -
+ src->tracks[0].start + 1;
+ }
+
+ /* ... and convert into final format */
+ if (!gst_cdda_base_src_convert (src, sector_format, sectors,
+ dest_format, &dest_val)) {
+ return FALSE;
+ }
+
+ gst_query_set_duration (query, dest_format, dest_val);
+
+ GST_LOG ("duration: %u sectors, %" G_GINT64_FORMAT " in format %s",
+ sectors, dest_val, gst_format_get_name (dest_format));
+ break;
+ }
+ case GST_QUERY_POSITION:{
+ GstFormat dest_format;
+ gint64 pos_sector;
+ gint64 dest_val;
+
+ gst_query_parse_position (query, &dest_format, NULL);
+
+ if (!started)
+ return FALSE;
+
+ g_assert (src->tracks != NULL);
+
+ if (dest_format == track_format) {
+ GST_LOG_OBJECT (src, "position: track %d", src->cur_track);
+ gst_query_set_position (query, track_format, src->cur_track);
+ return TRUE;
+ }
+
+ if (src->cur_track < 0 || src->cur_track >= src->num_tracks)
+ return FALSE;
+
+ if (src->mode == GST_CDDA_BASE_SRC_MODE_NORMAL) {
+ pos_sector = src->cur_sector - src->tracks[src->cur_track].start;
+ } else {
+ pos_sector = src->cur_sector - src->tracks[0].start;
+ }
+
+ if (!gst_cdda_base_src_convert (src, sector_format, pos_sector,
+ dest_format, &dest_val)) {
+ return FALSE;
+ }
+
+ gst_query_set_position (query, dest_format, dest_val);
+
+ GST_LOG ("position: sector %u, %" G_GINT64_FORMAT " in format %s",
+ (guint) pos_sector, dest_val, gst_format_get_name (dest_format));
+ break;
+ }
+ case GST_QUERY_CONVERT:{
+ GstFormat src_format, dest_format;
+ gint64 src_val, dest_val;
+
+ gst_query_parse_convert (query, &src_format, &src_val, &dest_format,
+ NULL);
+
+ if (!gst_cdda_base_src_convert (src, src_format, src_val, dest_format,
+ &dest_val)) {
+ return FALSE;
+ }
+
+ gst_query_set_convert (query, src_format, src_val, dest_format, dest_val);
+ break;
+ }
+ default:{
+ GST_DEBUG_OBJECT (src, "unhandled query, chaining up to parent class");
+ return GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_cdda_base_src_is_seekable (GstBaseSrc * basesrc)
+{
+ return TRUE;
+}
+
+static gboolean
+gst_cdda_base_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (basesrc);
+ gint64 seek_sector;
+
+ GST_DEBUG_OBJECT (src, "segment %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop));
+
+ if (!gst_cdda_base_src_convert (src, GST_FORMAT_TIME, segment->start,
+ sector_format, &seek_sector)) {
+ GST_WARNING_OBJECT (src, "conversion failed");
+ return FALSE;
+ }
+
+ /* we should only really be called when open */
+ g_assert (src->cur_track >= 0 && src->cur_track < src->num_tracks);
+
+ switch (src->mode) {
+ case GST_CDDA_BASE_SRC_MODE_NORMAL:
+ seek_sector += src->tracks[src->cur_track].start;
+ break;
+ case GST_CDDA_BASE_SRC_MODE_CONTINUOUS:
+ seek_sector += src->tracks[0].start;
+ break;
+ default:
+ g_return_val_if_reached (FALSE);
+ }
+
+ src->cur_sector = (gint) seek_sector;
+
+ GST_DEBUG_OBJECT (src, "seek'd to sector %d", src->cur_sector);
+
+ return TRUE;
+}
+
+static gboolean
+gst_cdda_base_src_handle_track_seek (GstCddaBaseSrc * src, gdouble rate,
+ GstSeekFlags flags, GstSeekType start_type, gint64 start,
+ GstSeekType stop_type, gint64 stop)
+{
+ GstBaseSrc *basesrc = GST_BASE_SRC (src);
+ GstEvent *event;
+
+ if ((flags & GST_SEEK_FLAG_SEGMENT) == GST_SEEK_FLAG_SEGMENT) {
+ gint64 start_time = -1;
+ gint64 stop_time = -1;
+
+ if (src->mode != GST_CDDA_BASE_SRC_MODE_CONTINUOUS) {
+ GST_DEBUG_OBJECT (src, "segment seek in track format is only "
+ "supported in CONTINUOUS mode, not in mode %d", src->mode);
+ return FALSE;
+ }
+
+ switch (start_type) {
+ case GST_SEEK_TYPE_SET:
+ if (!gst_cdda_base_src_convert (src, track_format, start,
+ GST_FORMAT_TIME, &start_time)) {
+ GST_DEBUG_OBJECT (src, "cannot convert track %d to time",
+ (gint) start);
+ return FALSE;
+ }
+ break;
+ case GST_SEEK_TYPE_END:
+ if (!gst_cdda_base_src_convert (src, track_format,
+ src->num_tracks - start - 1, GST_FORMAT_TIME, &start_time)) {
+ GST_DEBUG_OBJECT (src, "cannot convert track %d to time",
+ (gint) start);
+ return FALSE;
+ }
+ start_type = GST_SEEK_TYPE_SET;
+ break;
+ case GST_SEEK_TYPE_NONE:
+ start_time = -1;
+ break;
+ default:
+ g_return_val_if_reached (FALSE);
+ }
+
+ switch (stop_type) {
+ case GST_SEEK_TYPE_SET:
+ if (!gst_cdda_base_src_convert (src, track_format, stop,
+ GST_FORMAT_TIME, &stop_time)) {
+ GST_DEBUG_OBJECT (src, "cannot convert track %d to time",
+ (gint) stop);
+ return FALSE;
+ }
+ break;
+ case GST_SEEK_TYPE_END:
+ if (!gst_cdda_base_src_convert (src, track_format,
+ src->num_tracks - stop - 1, GST_FORMAT_TIME, &stop_time)) {
+ GST_DEBUG_OBJECT (src, "cannot convert track %d to time",
+ (gint) stop);
+ return FALSE;
+ }
+ stop_type = GST_SEEK_TYPE_SET;
+ break;
+ case GST_SEEK_TYPE_NONE:
+ stop_time = -1;
+ break;
+ default:
+ g_return_val_if_reached (FALSE);
+ }
+
+ GST_LOG_OBJECT (src, "seek segment %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start_time), GST_TIME_ARGS (stop_time));
+
+ /* send fake segment seek event in TIME format to
+ * base class, which will hopefully handle the rest */
+
+ event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags, start_type,
+ start_time, stop_type, stop_time);
+
+ return GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event);
+ }
+
+ /* not a segment seek */
+
+ if (start_type == GST_SEEK_TYPE_NONE) {
+ GST_LOG_OBJECT (src, "start seek type is NONE, nothing to do");
+ return TRUE;
+ }
+
+ if (stop_type != GST_SEEK_TYPE_NONE) {
+ GST_WARNING_OBJECT (src, "ignoring stop seek type (expected NONE)");
+ }
+
+ if (start < 0 || start >= src->num_tracks) {
+ GST_DEBUG_OBJECT (src, "invalid track %" G_GINT64_FORMAT, start);
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (src, "seeking to track %" G_GINT64_FORMAT, start + 1);
+
+ src->cur_sector = src->tracks[start].start;
+ GST_DEBUG_OBJECT (src, "starting at sector %d", src->cur_sector);
+
+ if (src->cur_track != start) {
+ src->cur_track = (gint) start;
+ src->uri_track = -1;
+ src->prev_track = -1;
+
+ gst_cdda_base_src_update_duration (src);
+ } else {
+ GST_DEBUG_OBJECT (src, "is current track, just seeking back to start");
+ }
+
+ /* send fake segment seek event in TIME format to
+ * base class (so we get a newsegment etc.) */
+ event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, -1);
+
+ return GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event);
+}
+
+static gboolean
+gst_cdda_base_src_handle_event (GstBaseSrc * basesrc, GstEvent * event)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (basesrc);
+ gboolean ret = FALSE;
+
+ GST_LOG_OBJECT (src, "handling %s event", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:{
+ GstSeekType start_type, stop_type;
+ GstSeekFlags flags;
+ GstFormat format;
+ gdouble rate;
+ gint64 start, stop;
+
+ if (!GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED)) {
+ GST_DEBUG_OBJECT (src, "seek failed: device not open");
+ break;
+ }
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
+ &stop_type, &stop);
+
+ if (format == sector_format) {
+ GST_DEBUG_OBJECT (src, "seek in sector format not supported");
+ break;
+ }
+
+ if (format == track_format) {
+ ret = gst_cdda_base_src_handle_track_seek (src, rate, flags,
+ start_type, start, stop_type, stop);
+ } else {
+ GST_LOG_OBJECT (src, "let base class handle seek in %s format",
+ gst_format_get_name (format));
+ event = gst_event_ref (event);
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event);
+ }
+ break;
+ }
+ default:{
+ GST_LOG_OBJECT (src, "let base class handle event");
+ ret = GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event);
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static GstURIType
+gst_cdda_base_src_uri_get_type (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static gchar **
+gst_cdda_base_src_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "cdda", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_cdda_base_src_uri_get_uri (GstURIHandler * handler)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (handler);
+
+ GST_OBJECT_LOCK (src);
+
+ g_free (src->uri);
+
+ if (GST_OBJECT_FLAG_IS_SET (GST_BASE_SRC (src), GST_BASE_SRC_STARTED)) {
+ src->uri =
+ g_strdup_printf ("cdda://%s#%d", src->device,
+ (src->uri_track > 0) ? src->uri_track : 1);
+ } else {
+ src->uri = g_strdup ("cdda://1");
+ }
+
+ GST_OBJECT_UNLOCK (src);
+
+ return src->uri;
+}
+
+/* Note: gst_element_make_from_uri() might call us with just 'cdda://' as
+ * URI and expects us to return TRUE then (and this might be in any state) */
+
+/* We accept URIs of the format cdda://(device#track)|(track) */
+
+static gboolean
+gst_cdda_base_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (handler);
+ gchar *protocol;
+ const gchar *location;
+ gchar *track_number;
+
+ GST_OBJECT_LOCK (src);
+
+ protocol = gst_uri_get_protocol (uri);
+ if (!protocol || g_ascii_strcasecmp (protocol, "cdda") != 0) {
+ g_free (protocol);
+ goto failed;
+ }
+ g_free (protocol);
+
+ location = uri + 7;
+ track_number = g_strrstr (location, "#");
+ src->uri_track = 0;
+ /* FIXME 0.11: ignore URI fragments that look like device paths for
+ * the benefit of rhythmbox and possibly other applications.
+ */
+ if (track_number && track_number[1] != '/') {
+ gchar *device, *nuri = g_strdup (uri);
+
+ track_number = nuri + (track_number - uri);
+ *track_number = '\0';
+ device = gst_uri_get_location (nuri);
+ gst_cdda_base_src_set_device (src, device);
+ g_free (device);
+ src->uri_track = strtol (track_number + 1, NULL, 10);
+ g_free (nuri);
+ } else {
+ if (*location == '\0')
+ src->uri_track = 1;
+ else
+ src->uri_track = strtol (location, NULL, 10);
+ }
+
+ if (src->uri_track < 1)
+ goto failed;
+
+ if (src->num_tracks > 0
+ && src->tracks != NULL && src->uri_track > src->num_tracks)
+ goto failed;
+
+ if (src->uri_track > 0 && src->tracks != NULL) {
+ GST_OBJECT_UNLOCK (src);
+
+ gst_pad_send_event (GST_BASE_SRC_PAD (src),
+ gst_event_new_seek (1.0, track_format, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, src->uri_track - 1, GST_SEEK_TYPE_NONE, -1));
+ } else {
+ /* seek will be done in start() */
+ GST_OBJECT_UNLOCK (src);
+ }
+
+ GST_LOG_OBJECT (handler, "successfully handled uri '%s'", uri);
+
+ return TRUE;
+
+failed:
+ {
+ GST_OBJECT_UNLOCK (src);
+ GST_DEBUG_OBJECT (src, "cannot handle URI '%s'", uri);
+ return FALSE;
+ }
+}
+
+static void
+gst_cdda_base_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_cdda_base_src_uri_get_type;
+ iface->get_uri = gst_cdda_base_src_uri_get_uri;
+ iface->set_uri = gst_cdda_base_src_uri_set_uri;
+ iface->get_protocols = gst_cdda_base_src_uri_get_protocols;
+}
+
+/**
+ * gst_cdda_base_src_add_track:
+ * @src: a #GstCddaBaseSrc
+ * @track: address of #GstCddaBaseSrcTrack to add
+ *
+ * CDDA sources use this function from their start vfunc to announce the
+ * available data and audio tracks to the base source class. The caller
+ * should allocate @track on the stack, the base source will do a shallow
+ * copy of the structure (and take ownership of the taglist if there is one).
+ *
+ * Returns: FALSE on error, otherwise TRUE.
+ */
+
+gboolean
+gst_cdda_base_src_add_track (GstCddaBaseSrc * src, GstCddaBaseSrcTrack * track)
+{
+ g_return_val_if_fail (GST_IS_CDDA_BASE_SRC (src), FALSE);
+ g_return_val_if_fail (track != NULL, FALSE);
+ g_return_val_if_fail (track->num > 0, FALSE);
+
+ GST_DEBUG_OBJECT (src, "adding track %2u (%2u) [%6u-%6u] [%5s], tags: %"
+ GST_PTR_FORMAT, src->num_tracks + 1, track->num, track->start,
+ track->end, (track->is_audio) ? "AUDIO" : "DATA ", track->tags);
+
+ if (src->num_tracks > 0) {
+ guint end_of_previous_track = src->tracks[src->num_tracks - 1].end;
+
+ if (track->start <= end_of_previous_track) {
+ GST_WARNING ("track %2u overlaps with previous tracks", track->num);
+ return FALSE;
+ }
+ }
+
+ GST_OBJECT_LOCK (src);
+
+ ++src->num_tracks;
+ src->tracks = g_renew (GstCddaBaseSrcTrack, src->tracks, src->num_tracks);
+ src->tracks[src->num_tracks - 1] = *track;
+
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+static void
+gst_cdda_base_src_update_duration (GstCddaBaseSrc * src)
+{
+ GstBaseSrc *basesrc;
+ gint64 dur;
+
+ basesrc = GST_BASE_SRC (src);
+
+ if (!gst_pad_query_duration (GST_BASE_SRC_PAD (src), GST_FORMAT_TIME, &dur)) {
+ dur = GST_CLOCK_TIME_NONE;
+ }
+ basesrc->segment.duration = dur;
+
+ gst_element_post_message (GST_ELEMENT (src),
+ gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_TIME, -1));
+
+ GST_LOG_OBJECT (src, "duration updated to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (dur));
+}
+
+#define CD_MSF_OFFSET 150
+
+/* the cddb hash function */
+static guint
+cddb_sum (gint n)
+{
+ guint ret;
+
+ ret = 0;
+ while (n > 0) {
+ ret += (n % 10);
+ n /= 10;
+ }
+ return ret;
+}
+
+static void
+gst_cddabasesrc_calculate_musicbrainz_discid (GstCddaBaseSrc * src)
+{
+ GString *s;
+ GChecksum *sha;
+ guchar digest[20];
+ gchar *ptr;
+ gchar tmp[9];
+ gulong i;
+ guint leadout_sector;
+ gsize digest_len;
+
+ s = g_string_new (NULL);
+
+ leadout_sector = src->tracks[src->num_tracks - 1].end + 1 + CD_MSF_OFFSET;
+
+ /* generate SHA digest */
+ sha = g_checksum_new (G_CHECKSUM_SHA1);
+ g_snprintf (tmp, sizeof (tmp), "%02X", src->tracks[0].num);
+ g_string_append_printf (s, "%02X", src->tracks[0].num);
+ g_checksum_update (sha, (guchar *) tmp, 2);
+
+ g_snprintf (tmp, sizeof (tmp), "%02X", src->tracks[src->num_tracks - 1].num);
+ g_string_append_printf (s, " %02X", src->tracks[src->num_tracks - 1].num);
+ g_checksum_update (sha, (guchar *) tmp, 2);
+
+ g_snprintf (tmp, sizeof (tmp), "%08X", leadout_sector);
+ g_string_append_printf (s, " %08X", leadout_sector);
+ g_checksum_update (sha, (guchar *) tmp, 8);
+
+ for (i = 0; i < 99; i++) {
+ if (i < src->num_tracks) {
+ guint frame_offset = src->tracks[i].start + CD_MSF_OFFSET;
+
+ g_snprintf (tmp, sizeof (tmp), "%08X", frame_offset);
+ g_string_append_printf (s, " %08X", frame_offset);
+ g_checksum_update (sha, (guchar *) tmp, 8);
+ } else {
+ g_checksum_update (sha, (guchar *) "00000000", 8);
+ }
+ }
+ digest_len = 20;
+ g_checksum_get_digest (sha, (guint8 *) & digest, &digest_len);
+
+ /* re-encode to base64 */
+ ptr = g_base64_encode (digest, digest_len);
+ g_checksum_free (sha);
+ i = strlen (ptr);
+
+ g_assert (i < sizeof (src->mb_discid) + 1);
+ memcpy (src->mb_discid, ptr, i);
+ src->mb_discid[i] = '\0';
+ free (ptr);
+
+ /* Replace '/', '+' and '=' by '_', '.' and '-' as specified on
+ * http://musicbrainz.org/doc/DiscIDCalculation
+ */
+ for (ptr = src->mb_discid; *ptr != '\0'; ptr++) {
+ if (*ptr == '/')
+ *ptr = '_';
+ else if (*ptr == '+')
+ *ptr = '.';
+ else if (*ptr == '=')
+ *ptr = '-';
+ }
+
+ GST_DEBUG_OBJECT (src, "musicbrainz-discid = %s", src->mb_discid);
+ GST_DEBUG_OBJECT (src, "musicbrainz-discid-full = %s", s->str);
+
+ gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CDDA_MUSICBRAINZ_DISCID, src->mb_discid,
+ GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL, s->str, NULL);
+
+ g_string_free (s, TRUE);
+}
+
+static void
+lba_to_msf (guint sector, guint * p_m, guint * p_s, guint * p_f, guint * p_secs)
+{
+ guint m, s, f;
+
+ m = sector / SECTORS_PER_MINUTE;
+ sector = sector % SECTORS_PER_MINUTE;
+ s = sector / SECTORS_PER_SECOND;
+ f = sector % SECTORS_PER_SECOND;
+
+ if (p_m)
+ *p_m = m;
+ if (p_s)
+ *p_s = s;
+ if (p_f)
+ *p_f = f;
+ if (p_secs)
+ *p_secs = s + (m * 60);
+}
+
+static void
+gst_cdda_base_src_calculate_cddb_id (GstCddaBaseSrc * src)
+{
+ GString *s;
+ guint first_sector = 0, last_sector = 0;
+ guint start_secs, end_secs, secs, len_secs;
+ guint total_secs, num_audio_tracks;
+ guint id, t, i;
+
+ id = 0;
+ total_secs = 0;
+ num_audio_tracks = 0;
+
+ /* FIXME: do we use offsets and duration of ALL tracks (data + audio)
+ * for the CDDB ID calculation, or only audio tracks? */
+ for (i = 0; i < src->num_tracks; ++i) {
+ if (1) { /* src->tracks[i].is_audio) { */
+ if (num_audio_tracks == 0) {
+ first_sector = src->tracks[i].start + CD_MSF_OFFSET;
+ }
+ last_sector = src->tracks[i].end + CD_MSF_OFFSET + 1;
+ ++num_audio_tracks;
+
+ lba_to_msf (src->tracks[i].start + CD_MSF_OFFSET, NULL, NULL, NULL,
+ &secs);
+
+ len_secs = (src->tracks[i].end - src->tracks[i].start + 1) / 75;
+
+ GST_DEBUG_OBJECT (src, "track %02u: lsn %6u (%02u:%02u), "
+ "length: %u seconds (%02u:%02u)",
+ num_audio_tracks, src->tracks[i].start + CD_MSF_OFFSET,
+ secs / 60, secs % 60, len_secs, len_secs / 60, len_secs % 60);
+
+ id += cddb_sum (secs);
+ total_secs += len_secs;
+ }
+ }
+
+ /* first_sector = src->tracks[0].start + CD_MSF_OFFSET; */
+ lba_to_msf (first_sector, NULL, NULL, NULL, &start_secs);
+
+ /* last_sector = src->tracks[src->num_tracks-1].end + CD_MSF_OFFSET; */
+ lba_to_msf (last_sector, NULL, NULL, NULL, &end_secs);
+
+ GST_DEBUG_OBJECT (src, "first_sector = %u = %u secs (%02u:%02u)",
+ first_sector, start_secs, start_secs / 60, start_secs % 60);
+ GST_DEBUG_OBJECT (src, "last_sector = %u = %u secs (%02u:%02u)",
+ last_sector, end_secs, end_secs / 60, end_secs % 60);
+
+ t = end_secs - start_secs;
+
+ GST_DEBUG_OBJECT (src, "total length = %u secs (%02u:%02u), added title "
+ "lengths = %u seconds (%02u:%02u)", t, t / 60, t % 60, total_secs,
+ total_secs / 60, total_secs % 60);
+
+ src->discid = ((id % 0xff) << 24 | t << 8 | num_audio_tracks);
+
+ s = g_string_new (NULL);
+ g_string_append_printf (s, "%08x", src->discid);
+
+ gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CDDA_CDDB_DISCID, s->str, NULL);
+
+ g_string_append_printf (s, " %u", src->num_tracks);
+ for (i = 0; i < src->num_tracks; ++i) {
+ g_string_append_printf (s, " %u", src->tracks[i].start + CD_MSF_OFFSET);
+ }
+ g_string_append_printf (s, " %u", t);
+
+ gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CDDA_CDDB_DISCID_FULL, s->str, NULL);
+
+ GST_DEBUG_OBJECT (src, "cddb discid = %s", s->str);
+
+ g_string_free (s, TRUE);
+}
+
+static void
+gst_cdda_base_src_add_tags (GstCddaBaseSrc * src)
+{
+ gint i;
+
+ /* fill in details for each track */
+ for (i = 0; i < src->num_tracks; ++i) {
+ gint64 duration;
+ guint num_sectors;
+
+ if (src->tracks[i].tags == NULL)
+ src->tracks[i].tags = gst_tag_list_new ();
+
+ num_sectors = src->tracks[i].end - src->tracks[i].start + 1;
+ gst_cdda_base_src_convert (src, sector_format, num_sectors,
+ GST_FORMAT_TIME, &duration);
+
+ gst_tag_list_add (src->tracks[i].tags,
+ GST_TAG_MERGE_REPLACE,
+ GST_TAG_TRACK_NUMBER, i + 1,
+ GST_TAG_TRACK_COUNT, src->num_tracks, GST_TAG_DURATION, duration, NULL);
+ }
+
+ /* now fill in per-album tags and include each track's tags
+ * in the album tags, so that interested parties can retrieve
+ * the relevant details for each track in one go */
+
+ /* /////////////////////////////// FIXME should we rather insert num_tracks
+ * tags by the name of 'track-tags' and have the caller use
+ * gst_tag_list_get_value_index() rather than use tag names incl.
+ * the track number ?? *////////////////////////////////////////
+
+ gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE,
+ GST_TAG_TRACK_COUNT, src->num_tracks, NULL);
+#if 0
+ for (i = 0; i < src->num_tracks; ++i) {
+ gst_tag_list_add (src->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_CDDA_TRACK_TAGS, src->tracks[i].tags, NULL);
+ }
+#endif
+
+ GST_DEBUG ("src->tags = %" GST_PTR_FORMAT, src->tags);
+}
+
+static void
+gst_cdda_base_src_add_index_associations (GstCddaBaseSrc * src)
+{
+ gint i;
+
+ for (i = 0; i < src->num_tracks; i++) {
+ gint64 sector;
+
+ sector = src->tracks[i].start;
+ gst_index_add_association (src->index, src->index_id, GST_ASSOCIATION_FLAG_KEY_UNIT, track_format, i, /* here we count from 0 */
+ sector_format, sector,
+ GST_FORMAT_TIME,
+ (gint64) (((CD_FRAMESIZE_RAW >> 2) * sector * GST_SECOND) / 44100),
+ GST_FORMAT_BYTES, (gint64) (sector << 2), GST_FORMAT_DEFAULT,
+ (gint64) ((CD_FRAMESIZE_RAW >> 2) * sector), NULL);
+ }
+}
+
+static void
+gst_cdda_base_src_set_index (GstElement * element, GstIndex * index)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (element);
+ GstIndex *old;
+
+ GST_OBJECT_LOCK (element);
+ old = src->index;
+ if (old == index) {
+ GST_OBJECT_UNLOCK (element);
+ return;
+ }
+ if (index)
+ gst_object_ref (index);
+ src->index = index;
+ GST_OBJECT_UNLOCK (element);
+ if (old)
+ gst_object_unref (old);
+
+ if (index) {
+ gst_index_get_writer_id (index, GST_OBJECT (src), &src->index_id);
+ gst_index_add_format (index, src->index_id, track_format);
+ gst_index_add_format (index, src->index_id, sector_format);
+ }
+}
+
+
+static GstIndex *
+gst_cdda_base_src_get_index (GstElement * element)
+{
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (element);
+ GstIndex *index;
+
+ GST_OBJECT_LOCK (element);
+ if ((index = src->index))
+ gst_object_ref (index);
+ GST_OBJECT_UNLOCK (element);
+
+ return index;
+}
+
+static gint
+gst_cdda_base_src_track_sort_func (gconstpointer a, gconstpointer b,
+ gpointer foo)
+{
+ GstCddaBaseSrcTrack *track_a = ((GstCddaBaseSrcTrack *) a);
+ GstCddaBaseSrcTrack *track_b = ((GstCddaBaseSrcTrack *) b);
+
+ /* sort data tracks to the end, and audio tracks by track number */
+ if (track_a->is_audio == track_b->is_audio)
+ return (gint) track_a->num - (gint) track_b->num;
+
+ if (track_a->is_audio) {
+ return -1;
+ } else {
+ return 1;
+ }
+}
+
+static gboolean
+gst_cdda_base_src_start (GstBaseSrc * basesrc)
+{
+ GstCddaBaseSrcClass *klass = GST_CDDA_BASE_SRC_GET_CLASS (basesrc);
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (basesrc);
+ gboolean ret;
+ gchar *device = NULL;
+
+ src->discid = 0;
+ src->mb_discid[0] = '\0';
+
+ g_assert (klass->open != NULL);
+
+ if (src->device != NULL) {
+ device = g_strdup (src->device);
+ } else if (klass->get_default_device != NULL) {
+ device = klass->get_default_device (src);
+ }
+
+ if (device == NULL)
+ device = g_strdup (DEFAULT_DEVICE);
+
+ GST_LOG_OBJECT (basesrc, "opening device %s", device);
+
+ src->tags = gst_tag_list_new ();
+
+ ret = klass->open (src, device);
+ g_free (device);
+ device = NULL;
+
+ if (!ret) {
+ GST_DEBUG_OBJECT (basesrc, "failed to open device");
+ /* subclass (should have) posted an error message with the details */
+ gst_cdda_base_src_stop (basesrc);
+ return FALSE;
+ }
+
+ if (src->num_tracks == 0 || src->tracks == NULL) {
+ GST_DEBUG_OBJECT (src, "no tracks");
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("This CD has no audio tracks")), (NULL));
+ gst_cdda_base_src_stop (basesrc);
+ return FALSE;
+ }
+
+ /* need to calculate disc IDs before we ditch the data tracks */
+ gst_cdda_base_src_calculate_cddb_id (src);
+ gst_cddabasesrc_calculate_musicbrainz_discid (src);
+
+#if 0
+ /* adjust sector offsets if necessary */
+ if (src->toc_bias) {
+ src->toc_offset -= src->tracks[0].start;
+ }
+ for (i = 0; i < src->num_tracks; ++i) {
+ src->tracks[i].start += src->toc_offset;
+ src->tracks[i].end += src->toc_offset;
+ }
+#endif
+
+ /* now that we calculated the various disc IDs,
+ * sort the data tracks to end and ignore them */
+ src->num_all_tracks = src->num_tracks;
+
+ g_qsort_with_data (src->tracks, src->num_tracks,
+ sizeof (GstCddaBaseSrcTrack), gst_cdda_base_src_track_sort_func, NULL);
+
+ while (src->num_tracks > 0 && !src->tracks[src->num_tracks - 1].is_audio)
+ --src->num_tracks;
+
+ if (src->num_tracks == 0) {
+ GST_DEBUG_OBJECT (src, "no audio tracks");
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("This CD has no audio tracks")), (NULL));
+ gst_cdda_base_src_stop (basesrc);
+ return FALSE;
+ }
+
+ gst_cdda_base_src_add_tags (src);
+
+ if (src->index && GST_INDEX_IS_WRITABLE (src->index))
+ gst_cdda_base_src_add_index_associations (src);
+
+ src->cur_track = 0;
+ src->prev_track = -1;
+
+ if (src->uri_track > 0 && src->uri_track <= src->num_tracks) {
+ GST_LOG_OBJECT (src, "seek to track %d", src->uri_track);
+ src->cur_track = src->uri_track - 1;
+ src->uri_track = -1;
+ src->mode = GST_CDDA_BASE_SRC_MODE_NORMAL;
+ }
+
+ src->cur_sector = src->tracks[src->cur_track].start;
+ GST_LOG_OBJECT (src, "starting at sector %d", src->cur_sector);
+
+ gst_cdda_base_src_update_duration (src);
+
+ return TRUE;
+}
+
+static void
+gst_cdda_base_src_clear_tracks (GstCddaBaseSrc * src)
+{
+ if (src->tracks != NULL) {
+ gint i;
+
+ for (i = 0; i < src->num_all_tracks; ++i) {
+ if (src->tracks[i].tags)
+ gst_tag_list_free (src->tracks[i].tags);
+ }
+
+ g_free (src->tracks);
+ src->tracks = NULL;
+ }
+ src->num_tracks = 0;
+ src->num_all_tracks = 0;
+}
+
+static gboolean
+gst_cdda_base_src_stop (GstBaseSrc * basesrc)
+{
+ GstCddaBaseSrcClass *klass = GST_CDDA_BASE_SRC_GET_CLASS (basesrc);
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (basesrc);
+
+ g_assert (klass->close != NULL);
+
+ klass->close (src);
+
+ gst_cdda_base_src_clear_tracks (src);
+
+ if (src->tags) {
+ gst_tag_list_free (src->tags);
+ src->tags = NULL;
+ }
+
+ src->prev_track = -1;
+ src->cur_track = -1;
+
+ return TRUE;
+}
+
+
+static GstFlowReturn
+gst_cdda_base_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
+{
+ GstCddaBaseSrcClass *klass = GST_CDDA_BASE_SRC_GET_CLASS (pushsrc);
+ GstCddaBaseSrc *src = GST_CDDA_BASE_SRC (pushsrc);
+ GstBuffer *buf;
+ gboolean eos;
+
+ GstClockTime position = GST_CLOCK_TIME_NONE;
+ GstClockTime duration = GST_CLOCK_TIME_NONE;
+ gint64 qry_position;
+
+ g_assert (klass->read_sector != NULL);
+
+ switch (src->mode) {
+ case GST_CDDA_BASE_SRC_MODE_NORMAL:
+ eos = (src->cur_sector > src->tracks[src->cur_track].end);
+ break;
+ case GST_CDDA_BASE_SRC_MODE_CONTINUOUS:
+ eos = (src->cur_sector > src->tracks[src->num_tracks - 1].end);
+ src->cur_track = gst_cdda_base_src_get_track_from_sector (src,
+ src->cur_sector);
+ break;
+ default:
+ g_return_val_if_reached (GST_FLOW_ERROR);
+ }
+
+ if (eos) {
+ src->prev_track = -1;
+ GST_DEBUG_OBJECT (src, "EOS at sector %d, cur_track=%d, mode=%d",
+ src->cur_sector, src->cur_track, src->mode);
+ /* base class will send EOS for us */
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ if (src->prev_track != src->cur_track) {
+ GstTagList *tags;
+
+ tags = gst_tag_list_merge (src->tags, src->tracks[src->cur_track].tags,
+ GST_TAG_MERGE_REPLACE);
+ GST_LOG_OBJECT (src, "announcing tags: %" GST_PTR_FORMAT, tags);
+ gst_element_found_tags_for_pad (GST_ELEMENT (src),
+ GST_BASE_SRC_PAD (src), tags);
+ src->prev_track = src->cur_track;
+
+ gst_cdda_base_src_update_duration (src);
+
+ g_object_notify (G_OBJECT (src), "track");
+ }
+
+ GST_LOG_OBJECT (src, "asking for sector %u", src->cur_sector);
+
+ buf = klass->read_sector (src, src->cur_sector);
+
+ if (buf == NULL) {
+ GST_WARNING_OBJECT (src, "failed to read sector %u", src->cur_sector);
+ return GST_FLOW_ERROR;
+ }
+
+ if (gst_pad_query_position (GST_BASE_SRC_PAD (src), GST_FORMAT_TIME,
+ &qry_position)) {
+ gint64 next_ts = 0;
+
+ position = (GstClockTime) qry_position;
+
+ ++src->cur_sector;
+ if (gst_pad_query_position (GST_BASE_SRC_PAD (src), GST_FORMAT_TIME,
+ &next_ts)) {
+ duration = (GstClockTime) (next_ts - qry_position);
+ }
+ --src->cur_sector;
+ }
+
+ /* fallback duration: 4 bytes per sample, 44100 samples per second */
+ if (duration == GST_CLOCK_TIME_NONE) {
+ duration = gst_util_uint64_scale_int (gst_buffer_get_size (buf) >> 2,
+ GST_SECOND, 44100);
+ }
+
+ GST_BUFFER_TIMESTAMP (buf) = position;
+ GST_BUFFER_DURATION (buf) = duration;
+
+ GST_LOG_OBJECT (src, "pushing sector %d with timestamp %" GST_TIME_FORMAT,
+ src->cur_sector, GST_TIME_ARGS (position));
+
+ ++src->cur_sector;
+
+ *buffer = buf;
+
+ return GST_FLOW_OK;
+}
diff --git a/gst-libs/gst/cdda/gstcddabasesrc.h b/gst-libs/gst/cdda/gstcddabasesrc.h
new file mode 100644
index 0000000..b754e43
--- /dev/null
+++ b/gst-libs/gst/cdda/gstcddabasesrc.h
@@ -0,0 +1,168 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CDDA_BASE_SRC_H__
+#define __GST_CDDA_BASE_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+/* must include this for backwards-compatibility so the
+ * GST_TAG_CDDA_* defines are included. Remove in 0.11 */
+#include <gst/tag/tag.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_CDDA_BASE_SRC (gst_cdda_base_src_get_type())
+#define GST_CDDA_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CDDA_BASE_SRC, GstCddaBaseSrc))
+#define GST_CDDA_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CDDA_BASE_SRC, GstCddaBaseSrcClass))
+#define GST_IS_CDDA_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CDDA_BASE_SRC))
+#define GST_IS_CDDA_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CDDA_BASE_SRC))
+#define GST_CDDA_BASE_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CDDA_BASE_SRC, GstCddaBaseSrcClass))
+
+typedef struct _GstCddaBaseSrc GstCddaBaseSrc;
+typedef struct _GstCddaBaseSrcClass GstCddaBaseSrcClass;
+typedef struct _GstCddaBaseSrcTrack GstCddaBaseSrcTrack;
+
+/**
+ * GstCddaBaseSrcMode:
+ * @GST_CDDA_BASE_SRC_MODE_NORMAL : each single track is a stream
+ * @GST_CDDA_BASE_SRC_MODE_CONTINUOUS : the entire disc is a single stream
+ *
+ * Mode in which the CD audio source operates. Influences timestamping,
+ * EOS handling and seeking.
+ */
+typedef enum {
+ GST_CDDA_BASE_SRC_MODE_NORMAL, /* stream = one track */
+ GST_CDDA_BASE_SRC_MODE_CONTINUOUS /* stream = whole disc */
+} GstCddaBaseSrcMode;
+
+#define GST_TYPE_CDDA_BASE_SRC_MODE (gst_cdda_base_src_mode_get_type ())
+
+/**
+ * GstCddaBaseSrcTrack:
+ * @is_audio: Whether this is an audio track
+ * @num: Track number in TOC (usually starts from 1, but not always)
+ * @start: The first sector of this track (LBA)
+ * @end: The last sector of this track (LBA)
+ * @tags: Track-specific tags (e.g. from cd-text information), or NULL
+ *
+ * CD track abstraction to communicate TOC entries to the base class.
+ */
+struct _GstCddaBaseSrcTrack {
+ gboolean is_audio; /* TRUE if this is an audio track */
+ guint num; /* real track number (usually starts from 1) */
+ guint start; /* first sector of track (LBA, not LSN!) */
+ guint end; /* last sector of track (LBA, not LSN!) */
+ GstTagList *tags; /* NULL or tags for track (e.g. from cd-text) */
+
+ /*< private >*/
+ guint _gst_reserved1[GST_PADDING/2];
+ gpointer _gst_reserved2[GST_PADDING/2];
+};
+
+struct _GstCddaBaseSrc {
+ GstPushSrc pushsrc;
+
+ /*< protected >*/ /* for use by sub-classes only */
+ GstTagList *tags; /* tags that apply to all tracks */
+
+ /*< private >*/
+ GstCddaBaseSrcMode mode;
+
+ gchar *device;
+
+ guint num_tracks;
+ guint num_all_tracks;
+ GstCddaBaseSrcTrack *tracks;
+
+ gint cur_track; /* current track (starting from 0) */
+ gint prev_track; /* current track last time */
+ gint cur_sector; /* current sector */
+ gint seek_sector; /* -1 or sector to seek to */
+
+ gint uri_track;
+ gchar *uri;
+
+ guint32 discid; /* cddb disc id (for unit test) */
+ gchar mb_discid[32]; /* musicbrainz discid */
+
+ GstIndex *index;
+ gint index_id;
+
+ gint toc_offset;
+ gboolean toc_bias;
+
+ /*< private >*/
+ guint _gst_reserved1[GST_PADDING/2];
+ gpointer _gst_reserved2[GST_PADDING/2];
+};
+
+/**
+ * GstCddaBaseSrcClass:
+ * @pushsrc_class: the parent class
+ * @open: opening the device
+ * @close: closing the device
+ * @read_sector: reading a sector
+ * @get_default_device: getting the default device
+ * @probe_devices: probing possible devices
+ *
+ * Cdda source base class.
+ */
+struct _GstCddaBaseSrcClass {
+ GstPushSrcClass pushsrc_class;
+
+ /* open/close the CD device */
+ gboolean (*open) (GstCddaBaseSrc *src, const gchar *device);
+ void (*close) (GstCddaBaseSrc *src);
+
+ /* read one sector (LBA) */
+ GstBuffer * (*read_sector) (GstCddaBaseSrc *src, gint sector);
+
+ /* return default device or NULL (optional) */
+ gchar * (*get_default_device) (GstCddaBaseSrc *src);
+
+ /* return NULL-terminated string array of CD devices, or NULL (optional) */
+ gchar ** (*probe_devices) (GstCddaBaseSrc *src);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_cdda_base_src_get_type (void);
+GType gst_cdda_base_src_mode_get_type (void);
+
+gboolean gst_cdda_base_src_add_track (GstCddaBaseSrc * src,
+ GstCddaBaseSrcTrack * track);
+
+#if 0
+/*
+ * GST_TAG_CDDA_TRACK_TAGS:
+ *
+ * Tag details for all available tracks
+ * FiXME: find out which type we want for this!
+ */
+#define GST_TAG_CDDA_TRACK_TAGS "track-tags"
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_CDDA_BASE_SRC_H__ */
+
diff --git a/gst-libs/gst/fft/Makefile.am b/gst-libs/gst/fft/Makefile.am
new file mode 100644
index 0000000..27cdaec
--- /dev/null
+++ b/gst-libs/gst/fft/Makefile.am
@@ -0,0 +1,104 @@
+lib_LTLIBRARIES = libgstfft-@GST_MAJORMINOR@.la
+
+libgstfft_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/fft
+
+libgstfft_@GST_MAJORMINOR@_include_HEADERS = \
+ gstfft.h \
+ gstffts16.h \
+ gstffts32.h \
+ gstfftf32.h \
+ gstfftf64.h
+
+noinst_HEADERS = \
+ kiss_fft_s16.h \
+ kiss_fft_s32.h \
+ kiss_fft_f32.h \
+ kiss_fft_f64.h \
+ kiss_fftr_s16.h \
+ kiss_fftr_s32.h \
+ kiss_fftr_f32.h \
+ kiss_fftr_f64.h \
+ _kiss_fft_guts_s16.h \
+ _kiss_fft_guts_s32.h \
+ _kiss_fft_guts_f32.h \
+ _kiss_fft_guts_f64.h
+
+libgstfft_@GST_MAJORMINOR@_la_SOURCES = \
+ gstfft.c \
+ gstffts16.c \
+ gstffts32.c \
+ gstfftf32.c \
+ gstfftf64.c \
+ kiss_fft_s16.c \
+ kiss_fft_s32.c \
+ kiss_fft_f32.c \
+ kiss_fft_f64.c \
+ kiss_fftr_s16.c \
+ kiss_fftr_s32.c \
+ kiss_fftr_f32.c \
+ kiss_fftr_f64.c
+
+libgstfft_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(LIBM)
+libgstfft_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS)
+libgstfft_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+EXTRA_DIST = kiss_version
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstFft-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstfft_@GST_MAJORMINOR@_include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstfft_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/fft/%',$(libgstfft_@GST_MAJORMINOR@_include_HEADERS))
+
+GstFft-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstfft-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstFft \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstfft-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-fft-@GST_MAJORMINOR@ \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgstfft -:SHARED libgstfft-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstfft_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstfft_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstfft_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/fft \
+ -:HEADERS $(libgstfftinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/fft/Makefile.in b/gst-libs/gst/fft/Makefile.in
new file mode 100644
index 0000000..05673ec
--- /dev/null
+++ b/gst-libs/gst/fft/Makefile.in
@@ -0,0 +1,1039 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/fft
+DIST_COMMON = $(libgstfft_@GST_MAJORMINOR@_include_HEADERS) \
+ $(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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstfft_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstfft_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstfft_@GST_MAJORMINOR@_la-gstfft.lo \
+ libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo \
+ libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo \
+ libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo
+libgstfft_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstfft_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstfft_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstfft_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstfft_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstfft_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstfft_@GST_MAJORMINOR@_include_HEADERS) \
+ $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstfft-@GST_MAJORMINOR@.la
+libgstfft_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/fft
+libgstfft_@GST_MAJORMINOR@_include_HEADERS = \
+ gstfft.h \
+ gstffts16.h \
+ gstffts32.h \
+ gstfftf32.h \
+ gstfftf64.h
+
+noinst_HEADERS = \
+ kiss_fft_s16.h \
+ kiss_fft_s32.h \
+ kiss_fft_f32.h \
+ kiss_fft_f64.h \
+ kiss_fftr_s16.h \
+ kiss_fftr_s32.h \
+ kiss_fftr_f32.h \
+ kiss_fftr_f64.h \
+ _kiss_fft_guts_s16.h \
+ _kiss_fft_guts_s32.h \
+ _kiss_fft_guts_f32.h \
+ _kiss_fft_guts_f64.h
+
+libgstfft_@GST_MAJORMINOR@_la_SOURCES = \
+ gstfft.c \
+ gstffts16.c \
+ gstffts32.c \
+ gstfftf32.c \
+ gstfftf64.c \
+ kiss_fft_s16.c \
+ kiss_fft_s32.c \
+ kiss_fft_f32.c \
+ kiss_fft_f64.c \
+ kiss_fftr_s16.c \
+ kiss_fftr_s32.c \
+ kiss_fftr_f32.c \
+ kiss_fftr_f64.c
+
+libgstfft_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(LIBM)
+libgstfft_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS)
+libgstfft_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+EXTRA_DIST = kiss_version
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstFft-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstfft_@GST_MAJORMINOR@_include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstfft_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/fft/%',$(libgstfft_@GST_MAJORMINOR@_include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_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-libs/gst/fft/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/fft/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstfft-@GST_MAJORMINOR@.la: $(libgstfft_@GST_MAJORMINOR@_la_OBJECTS) $(libgstfft_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstfft_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstfft_@GST_MAJORMINOR@_la_OBJECTS) $(libgstfft_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfft.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstfft_@GST_MAJORMINOR@_la-gstfft.lo: gstfft.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-gstfft.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfft.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-gstfft.lo `test -f 'gstfft.c' || echo '$(srcdir)/'`gstfft.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfft.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfft.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfft.c' object='libgstfft_@GST_MAJORMINOR@_la-gstfft.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-gstfft.lo `test -f 'gstfft.c' || echo '$(srcdir)/'`gstfft.c
+
+libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo: gstffts16.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts16.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo `test -f 'gstffts16.c' || echo '$(srcdir)/'`gstffts16.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts16.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts16.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstffts16.c' object='libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-gstffts16.lo `test -f 'gstffts16.c' || echo '$(srcdir)/'`gstffts16.c
+
+libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo: gstffts32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo `test -f 'gstffts32.c' || echo '$(srcdir)/'`gstffts32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstffts32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstffts32.c' object='libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-gstffts32.lo `test -f 'gstffts32.c' || echo '$(srcdir)/'`gstffts32.c
+
+libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo: gstfftf32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo `test -f 'gstfftf32.c' || echo '$(srcdir)/'`gstfftf32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfftf32.c' object='libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-gstfftf32.lo `test -f 'gstfftf32.c' || echo '$(srcdir)/'`gstfftf32.c
+
+libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo: gstfftf64.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf64.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo `test -f 'gstfftf64.c' || echo '$(srcdir)/'`gstfftf64.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf64.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-gstfftf64.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfftf64.c' object='libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-gstfftf64.lo `test -f 'gstfftf64.c' || echo '$(srcdir)/'`gstfftf64.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo: kiss_fft_s16.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo `test -f 'kiss_fft_s16.c' || echo '$(srcdir)/'`kiss_fft_s16.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fft_s16.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s16.lo `test -f 'kiss_fft_s16.c' || echo '$(srcdir)/'`kiss_fft_s16.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo: kiss_fft_s32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo `test -f 'kiss_fft_s32.c' || echo '$(srcdir)/'`kiss_fft_s32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fft_s32.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_s32.lo `test -f 'kiss_fft_s32.c' || echo '$(srcdir)/'`kiss_fft_s32.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo: kiss_fft_f32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo `test -f 'kiss_fft_f32.c' || echo '$(srcdir)/'`kiss_fft_f32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fft_f32.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f32.lo `test -f 'kiss_fft_f32.c' || echo '$(srcdir)/'`kiss_fft_f32.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo: kiss_fft_f64.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo `test -f 'kiss_fft_f64.c' || echo '$(srcdir)/'`kiss_fft_f64.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fft_f64.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fft_f64.lo `test -f 'kiss_fft_f64.c' || echo '$(srcdir)/'`kiss_fft_f64.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo: kiss_fftr_s16.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo `test -f 'kiss_fftr_s16.c' || echo '$(srcdir)/'`kiss_fftr_s16.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fftr_s16.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s16.lo `test -f 'kiss_fftr_s16.c' || echo '$(srcdir)/'`kiss_fftr_s16.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo: kiss_fftr_s32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo `test -f 'kiss_fftr_s32.c' || echo '$(srcdir)/'`kiss_fftr_s32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fftr_s32.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_s32.lo `test -f 'kiss_fftr_s32.c' || echo '$(srcdir)/'`kiss_fftr_s32.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo: kiss_fftr_f32.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo `test -f 'kiss_fftr_f32.c' || echo '$(srcdir)/'`kiss_fftr_f32.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fftr_f32.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f32.lo `test -f 'kiss_fftr_f32.c' || echo '$(srcdir)/'`kiss_fftr_f32.c
+
+libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo: kiss_fftr_f64.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) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo -MD -MP -MF $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.Tpo -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo `test -f 'kiss_fftr_f64.c' || echo '$(srcdir)/'`kiss_fftr_f64.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.Tpo $(DEPDIR)/libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kiss_fftr_f64.c' object='libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstfft_@GST_MAJORMINOR@_la-kiss_fftr_f64.lo `test -f 'kiss_fftr_f64.c' || echo '$(srcdir)/'`kiss_fftr_f64.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstfft_@GST_MAJORMINOR@_includeHEADERS: $(libgstfft_@GST_MAJORMINOR@_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstfft_@GST_MAJORMINOR@_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)"
+ @list='$(libgstfft_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstfft_@GST_MAJORMINOR@_includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)" || exit $$?; \
+ done
+
+uninstall-libgstfft_@GST_MAJORMINOR@_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstfft_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstfft_@GST_MAJORMINOR@_includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstfft_@GST_MAJORMINOR@_includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstfft_@GST_MAJORMINOR@_includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstfft_@GST_MAJORMINOR@_includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstfft_@GST_MAJORMINOR@_includeHEADERS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstfft_@GST_MAJORMINOR@_includeHEADERS \
+ uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstFft-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstfft-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstFft \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstfft-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-fft-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgstfft -:SHARED libgstfft-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstfft_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstfft_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstfft_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstfft_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/fft \
+ -:HEADERS $(libgstfftinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/fft/_kiss_fft_guts_f32.h b/gst-libs/gst/fft/_kiss_fft_guts_f32.h
new file mode 100644
index 0000000..78d2e2e
--- /dev/null
+++ b/gst-libs/gst/fft/_kiss_fft_guts_f32.h
@@ -0,0 +1,112 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+/* kiss_fft.h
+ defines kiss_fft_f32_scalar as either short or a float type
+ and defines
+ typedef struct { kiss_fft_f32_scalar r; kiss_fft_f32_scalar i; }kiss_fft_f32_cpx; */
+#include "kiss_fft_f32.h"
+#include <limits.h>
+
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+#define MAXFACTORS 32
+/* e.g. an fft of length 128 has 4 factors
+ as far as kissfft is concerned
+ 4*4*4*2
+ */
+
+struct kiss_fft_f32_state{
+ int nfft;
+ int inverse;
+ int factors[2*MAXFACTORS];
+ kiss_fft_f32_cpx twiddles[1];
+};
+
+/*
+ Explanation of macros dealing with complex math:
+
+ C_MUL(m,a,b) : m = a*b
+ C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
+ C_SUB( res, a,b) : res = a - b
+ C_SUBFROM( res , a) : res -= a
+ C_ADDTO( res , a) : res += a
+ * */
+
+#define S_MUL(a,b) ( (a)*(b) )
+#define C_MUL(m,a,b) \
+ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
+ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
+#define C_FIXDIV(c,div) /* NOOP */
+#define C_MULBYSCALAR( c, s ) \
+ do{ (c).r *= (s);\
+ (c).i *= (s); }while(0)
+
+#ifndef CHECK_OVERFLOW_OP
+# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
+#endif
+
+#define C_ADD( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,+,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,+,(b).i)\
+ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
+ }while(0)
+#define C_SUB( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,-,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,-,(b).i)\
+ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
+ }while(0)
+#define C_ADDTO( res , a)\
+ do { \
+ CHECK_OVERFLOW_OP((res).r,+,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,+,(a).i)\
+ (res).r += (a).r; (res).i += (a).i;\
+ }while(0)
+
+#define C_SUBFROM( res , a)\
+ do {\
+ CHECK_OVERFLOW_OP((res).r,-,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,-,(a).i)\
+ (res).r -= (a).r; (res).i -= (a).i; \
+ }while(0)
+
+
+#define KISS_FFT_F32_COS(phase) (kiss_fft_f32_scalar) cos(phase)
+#define KISS_FFT_F32_SIN(phase) (kiss_fft_f32_scalar) sin(phase)
+#define HALF_OF(x) ((x)*.5)
+
+#define kf_cexp(x,phase) \
+ do{ \
+ (x)->r = KISS_FFT_F32_COS(phase);\
+ (x)->i = KISS_FFT_F32_SIN(phase);\
+ }while(0)
+
+
+/* a debugging function */
+#define pcpx(c)\
+ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) )
diff --git a/gst-libs/gst/fft/_kiss_fft_guts_f64.h b/gst-libs/gst/fft/_kiss_fft_guts_f64.h
new file mode 100644
index 0000000..4202716
--- /dev/null
+++ b/gst-libs/gst/fft/_kiss_fft_guts_f64.h
@@ -0,0 +1,112 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+/* kiss_fft.h
+ defines kiss_fft_f64_scalar as either short or a float type
+ and defines
+ typedef struct { kiss_fft_f64_scalar r; kiss_fft_f64_scalar i; }kiss_fft_f64_cpx; */
+#include "kiss_fft_f64.h"
+#include <limits.h>
+
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+#define MAXFACTORS 32
+/* e.g. an fft of length 128 has 4 factors
+ as far as kissfft is concerned
+ 4*4*4*2
+ */
+
+struct kiss_fft_f64_state{
+ int nfft;
+ int inverse;
+ int factors[2*MAXFACTORS];
+ kiss_fft_f64_cpx twiddles[1];
+};
+
+/*
+ Explanation of macros dealing with complex math:
+
+ C_MUL(m,a,b) : m = a*b
+ C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
+ C_SUB( res, a,b) : res = a - b
+ C_SUBFROM( res , a) : res -= a
+ C_ADDTO( res , a) : res += a
+ * */
+
+#define S_MUL(a,b) ( (a)*(b) )
+#define C_MUL(m,a,b) \
+ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
+ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
+#define C_FIXDIV(c,div) /* NOOP */
+#define C_MULBYSCALAR( c, s ) \
+ do{ (c).r *= (s);\
+ (c).i *= (s); }while(0)
+
+#ifndef CHECK_OVERFLOW_OP
+# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
+#endif
+
+#define C_ADD( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,+,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,+,(b).i)\
+ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
+ }while(0)
+#define C_SUB( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,-,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,-,(b).i)\
+ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
+ }while(0)
+#define C_ADDTO( res , a)\
+ do { \
+ CHECK_OVERFLOW_OP((res).r,+,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,+,(a).i)\
+ (res).r += (a).r; (res).i += (a).i;\
+ }while(0)
+
+#define C_SUBFROM( res , a)\
+ do {\
+ CHECK_OVERFLOW_OP((res).r,-,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,-,(a).i)\
+ (res).r -= (a).r; (res).i -= (a).i; \
+ }while(0)
+
+
+#define KISS_FFT_F64_COS(phase) (kiss_fft_f64_scalar) cos(phase)
+#define KISS_FFT_F64_SIN(phase) (kiss_fft_f64_scalar) sin(phase)
+#define HALF_OF(x) ((x)*.5)
+
+#define kf_cexp(x,phase) \
+ do{ \
+ (x)->r = KISS_FFT_F64_COS(phase);\
+ (x)->i = KISS_FFT_F64_SIN(phase);\
+ }while(0)
+
+
+/* a debugging function */
+#define pcpx(c)\
+ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) )
diff --git a/gst-libs/gst/fft/_kiss_fft_guts_s16.h b/gst-libs/gst/fft/_kiss_fft_guts_s16.h
new file mode 100644
index 0000000..2d8256e
--- /dev/null
+++ b/gst-libs/gst/fft/_kiss_fft_guts_s16.h
@@ -0,0 +1,135 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+/* kiss_fft.h
+ defines kiss_fft_s16_scalar as either short or a float type
+ and defines
+ typedef struct { kiss_fft_s16_scalar r; kiss_fft_s16_scalar i; }kiss_fft_s16_cpx; */
+#include "kiss_fft_s16.h"
+#include <limits.h>
+
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+#define MAXFACTORS 32
+/* e.g. an fft of length 128 has 4 factors
+ as far as kissfft is concerned
+ 4*4*4*2
+ */
+
+struct kiss_fft_s16_state{
+ int nfft;
+ int inverse;
+ int factors[2*MAXFACTORS];
+ kiss_fft_s16_cpx twiddles[1];
+};
+
+/*
+ Explanation of macros dealing with complex math:
+
+ C_MUL(m,a,b) : m = a*b
+ C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
+ C_SUB( res, a,b) : res = a - b
+ C_SUBFROM( res , a) : res -= a
+ C_ADDTO( res , a) : res += a
+ * */
+#define FRACBITS 15
+#define SAMPPROD int32_t
+#define SAMP_MAX 32767
+
+#define SAMP_MIN -SAMP_MAX
+
+#if defined(CHECK_OVERFLOW)
+# define CHECK_OVERFLOW_OP(a,op,b) \
+ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \
+ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); }
+#endif
+
+
+# define smul(a,b) ( (SAMPPROD)(a)*(b) )
+# define sround( x ) (kiss_fft_s16_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS )
+
+# define S_MUL(a,b) sround( smul(a,b) )
+
+# define C_MUL(m,a,b) \
+ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \
+ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0)
+
+# define DIVSCALAR(x,k) \
+ (x) = sround( smul( x, SAMP_MAX/k ) )
+
+# define C_FIXDIV(c,div) \
+ do { DIVSCALAR( (c).r , div); \
+ DIVSCALAR( (c).i , div); }while (0)
+
+# define C_MULBYSCALAR( c, s ) \
+ do{ (c).r = sround( smul( (c).r , s ) ) ;\
+ (c).i = sround( smul( (c).i , s ) ) ; }while(0)
+
+#ifndef CHECK_OVERFLOW_OP
+# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
+#endif
+
+#define C_ADD( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,+,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,+,(b).i)\
+ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
+ }while(0)
+#define C_SUB( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,-,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,-,(b).i)\
+ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
+ }while(0)
+#define C_ADDTO( res , a)\
+ do { \
+ CHECK_OVERFLOW_OP((res).r,+,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,+,(a).i)\
+ (res).r += (a).r; (res).i += (a).i;\
+ }while(0)
+
+#define C_SUBFROM( res , a)\
+ do {\
+ CHECK_OVERFLOW_OP((res).r,-,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,-,(a).i)\
+ (res).r -= (a).r; (res).i -= (a).i; \
+ }while(0)
+
+
+# define KISS_FFT_S16_COS(phase) floor(.5+SAMP_MAX * cos (phase))
+# define KISS_FFT_S16_SIN(phase) floor(.5+SAMP_MAX * sin (phase))
+# define HALF_OF(x) ((x)>>1)
+
+#define kf_cexp(x,phase) \
+ do{ \
+ (x)->r = KISS_FFT_S16_COS(phase);\
+ (x)->i = KISS_FFT_S16_SIN(phase);\
+ }while(0)
+
+
+/* a debugging function */
+#define pcpx(c)\
+ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) )
diff --git a/gst-libs/gst/fft/_kiss_fft_guts_s32.h b/gst-libs/gst/fft/_kiss_fft_guts_s32.h
new file mode 100644
index 0000000..f0ec9c0
--- /dev/null
+++ b/gst-libs/gst/fft/_kiss_fft_guts_s32.h
@@ -0,0 +1,136 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+/* kiss_fft.h
+ defines kiss_fft_s32_scalar as either short or a float type
+ and defines
+ typedef struct { kiss_fft_s32_scalar r; kiss_fft_s32_scalar i; }kiss_fft_s32_cpx; */
+#include "kiss_fft_s32.h"
+#include <limits.h>
+
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+#define MAXFACTORS 32
+/* e.g. an fft of length 128 has 4 factors
+ as far as kissfft is concerned
+ 4*4*4*2
+ */
+
+struct kiss_fft_s32_state{
+ int nfft;
+ int inverse;
+ int factors[2*MAXFACTORS];
+ kiss_fft_s32_cpx twiddles[1];
+};
+
+/*
+ Explanation of macros dealing with complex math:
+
+ C_MUL(m,a,b) : m = a*b
+ C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
+ C_SUB( res, a,b) : res = a - b
+ C_SUBFROM( res , a) : res -= a
+ C_ADDTO( res , a) : res += a
+ * */
+
+#define FRACBITS 31
+#define SAMPPROD int64_t
+#define SAMP_MAX 2147483647
+
+#define SAMP_MIN -SAMP_MAX
+
+#if defined(CHECK_OVERFLOW)
+# define CHECK_OVERFLOW_OP(a,op,b) \
+ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \
+ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); }
+#endif
+
+
+# define smul(a,b) ( (SAMPPROD)(a)*(b) )
+# define sround( x ) (kiss_fft_s32_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS )
+
+# define S_MUL(a,b) sround( smul(a,b) )
+
+# define C_MUL(m,a,b) \
+ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \
+ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0)
+
+# define DIVSCALAR(x,k) \
+ (x) = sround( smul( x, SAMP_MAX/k ) )
+
+# define C_FIXDIV(c,div) \
+ do { DIVSCALAR( (c).r , div); \
+ DIVSCALAR( (c).i , div); }while (0)
+
+# define C_MULBYSCALAR( c, s ) \
+ do{ (c).r = sround( smul( (c).r , s ) ) ;\
+ (c).i = sround( smul( (c).i , s ) ) ; }while(0)
+
+#ifndef CHECK_OVERFLOW_OP
+# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
+#endif
+
+#define C_ADD( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,+,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,+,(b).i)\
+ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
+ }while(0)
+#define C_SUB( res, a,b)\
+ do { \
+ CHECK_OVERFLOW_OP((a).r,-,(b).r)\
+ CHECK_OVERFLOW_OP((a).i,-,(b).i)\
+ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
+ }while(0)
+#define C_ADDTO( res , a)\
+ do { \
+ CHECK_OVERFLOW_OP((res).r,+,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,+,(a).i)\
+ (res).r += (a).r; (res).i += (a).i;\
+ }while(0)
+
+#define C_SUBFROM( res , a)\
+ do {\
+ CHECK_OVERFLOW_OP((res).r,-,(a).r)\
+ CHECK_OVERFLOW_OP((res).i,-,(a).i)\
+ (res).r -= (a).r; (res).i -= (a).i; \
+ }while(0)
+
+
+# define KISS_FFT_S32_COS(phase) floor(.5+SAMP_MAX * cos (phase))
+# define KISS_FFT_S32_SIN(phase) floor(.5+SAMP_MAX * sin (phase))
+# define HALF_OF(x) ((x)>>1)
+
+#define kf_cexp(x,phase) \
+ do{ \
+ (x)->r = KISS_FFT_S32_COS(phase);\
+ (x)->i = KISS_FFT_S32_SIN(phase);\
+ }while(0)
+
+
+/* a debugging function */
+#define pcpx(c)\
+ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) )
diff --git a/gst-libs/gst/fft/gstfft.c b/gst-libs/gst/fft/gstfft.c
new file mode 100644
index 0000000..b1708c7
--- /dev/null
+++ b/gst-libs/gst/fft/gstfft.c
@@ -0,0 +1,54 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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.
+ */
+
+/**
+ * SECTION:gstfft
+ * @short_description: General FFT functions and declarations
+ *
+ * This library includes general definitions and functions, useful for
+ * all typed FFT classes.
+ */
+
+#include <glib.h>
+
+#include "gstfft.h"
+#include "kiss_fft_s16.h"
+
+/**
+ * gst_fft_next_fast_length:
+ * @n: Number for which the next fast length should be returned
+ *
+ * Returns the next number to @n that is entirely a product
+ * of 2, 3 and 5. Using this as the @len parameter for
+ * the different GstFFT types will provide the best performance.
+ *
+ * Returns: the next fast FFT length.
+ *
+ */
+gint
+gst_fft_next_fast_length (gint n)
+{
+ gint half = (n + 1) / 2;
+
+ /* It's the same for all data types so call the s16
+ * version */
+
+ /* The real FFT needs an even length so calculate that */
+ return 2 * kiss_fft_s16_next_fast_size (half);
+}
diff --git a/gst-libs/gst/fft/gstfft.h b/gst-libs/gst/fft/gstfft.h
new file mode 100644
index 0000000..fa5defe
--- /dev/null
+++ b/gst-libs/gst/fft/gstfft.h
@@ -0,0 +1,49 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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 <glib.h>
+#include <math.h>
+
+#ifndef __GST_FFT_H__
+#define __GST_FFT_H__
+
+/**
+ * GstFFTWindow:
+ * @GST_FFT_WINDOW_RECTANGULAR: Rectangular window
+ * @GST_FFT_WINDOW_HAMMING: Hamming window
+ * @GST_FFT_WINDOW_HANN: Hann (sometimes also called Hanning) window
+ * @GST_FFT_WINDOW_BARTLETT: Bartlett window
+ * @GST_FFT_WINDOW_BLACKMAN: Blackman window
+ *
+ * The various window functions available.
+ */
+typedef enum
+{
+ GST_FFT_WINDOW_RECTANGULAR,
+ GST_FFT_WINDOW_HAMMING,
+ GST_FFT_WINDOW_HANN,
+ GST_FFT_WINDOW_BARTLETT,
+ GST_FFT_WINDOW_BLACKMAN
+} GstFFTWindow;
+
+/* Functions */
+
+gint gst_fft_next_fast_length (gint n) G_GNUC_CONST;
+
+#endif /* __GST_FFT_H__ */
diff --git a/gst-libs/gst/fft/gstfftf32.c b/gst-libs/gst/fft/gstfftf32.c
new file mode 100644
index 0000000..fd574e0
--- /dev/null
+++ b/gst-libs/gst/fft/gstfftf32.c
@@ -0,0 +1,208 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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 <glib.h>
+#include <math.h>
+
+#include "_kiss_fft_guts_f32.h"
+#include "kiss_fftr_f32.h"
+#include "gstfft.h"
+#include "gstfftf32.h"
+
+/**
+ * SECTION:gstfftf32
+ * @short_description: FFT functions for 32 bit float samples
+ *
+ * #GstFFTF32 provides a FFT implementation and related functions for
+ * 32 bit float samples. To use this call gst_fft_f32_new() for
+ * allocating a #GstFFTF32 instance with the appropiate parameters and
+ * then call gst_fft_f32_fft() or gst_fft_f32_inverse_fft() to perform the
+ * FFT or inverse FFT on a buffer of samples.
+ *
+ * After use free the #GstFFTF32 instance with gst_fft_f32_free().
+ *
+ * For the best performance use gst_fft_next_fast_length() to get a
+ * number that is entirely a product of 2, 3 and 5 and use this as the
+ * @len parameter for gst_fft_f32_new().
+ *
+ * The @len parameter specifies the number of samples in the time domain that
+ * will be processed or generated. The number of samples in the frequency domain
+ * is @len/2 + 1. To get n samples in the frequency domain use 2*n - 2 as @len.
+ *
+ * Before performing the FFT on time domain data it usually makes sense
+ * to apply a window function to it. For this gst_fft_f32_window() can comfortably
+ * be used.
+ *
+ * Be aware, that you can't simply run gst_fft_f32_inverse_fft() on the
+ * resulting frequency data of gst_fft_f32_fft() to get the original data back.
+ * The relation between them is iFFT (FFT (x)) = x * nfft where nfft is the
+ * length of the FFT. This also has to be taken into account when calculation
+ * the magnitude of the frequency data.
+ *
+ */
+
+/**
+ * gst_fft_f32_new:
+ * @len: Length of the FFT in the time domain
+ * @inverse: %TRUE if the #GstFFTF32 instance should be used for the inverse FFT
+ *
+ * This returns a new #GstFFTF32 instance with the given parameters. It makes
+ * sense to keep one instance for several calls for speed reasons.
+ *
+ * @len must be even and to get the best performance a product of
+ * 2, 3 and 5. To get the next number with this characteristics use
+ * gst_fft_next_fast_length().
+ *
+ * Returns: a new #GstFFTF32 instance.
+ */
+GstFFTF32 *
+gst_fft_f32_new (gint len, gboolean inverse)
+{
+ GstFFTF32 *self;
+ gsize subsize = 0, memneeded;
+
+ g_return_val_if_fail (len > 0, NULL);
+ g_return_val_if_fail (len % 2 == 0, NULL);
+
+ kiss_fftr_f32_alloc (len, (inverse) ? 1 : 0, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (GstFFTF32)) + subsize;
+
+ self = (GstFFTF32 *) g_malloc0 (memneeded);
+
+ self->cfg = (((guint8 *) self) + ALIGN_STRUCT (sizeof (GstFFTF32)));
+ self->cfg = kiss_fftr_f32_alloc (len, (inverse) ? 1 : 0, self->cfg, &subsize);
+ g_assert (self->cfg);
+
+ self->inverse = inverse;
+ self->len = len;
+
+ return self;
+}
+
+/**
+ * gst_fft_f32_fft:
+ * @self: #GstFFTF32 instance for this call
+ * @timedata: Buffer of the samples in the time domain
+ * @freqdata: Target buffer for the samples in the frequency domain
+ *
+ * This performs the FFT on @timedata and puts the result in @freqdata.
+ *
+ * @timedata must have as many samples as specified with the @len parameter while
+ * allocating the #GstFFTF32 instance with gst_fft_f32_new().
+ *
+ * @freqdata must be large enough to hold @len/2 + 1 #GstFFTF32Complex frequency
+ * domain samples.
+ *
+ */
+void
+gst_fft_f32_fft (GstFFTF32 * self, const gfloat * timedata,
+ GstFFTF32Complex * freqdata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (!self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftr_f32 (self->cfg, timedata, (kiss_fft_f32_cpx *) freqdata);
+}
+
+/**
+ * gst_fft_f32_inverse_fft:
+ * @self: #GstFFTF32 instance for this call
+ * @freqdata: Buffer of the samples in the frequency domain
+ * @timedata: Target buffer for the samples in the time domain
+ *
+ * This performs the inverse FFT on @freqdata and puts the result in @timedata.
+ *
+ * @freqdata must have @len/2 + 1 samples, where @len is the parameter specified
+ * while allocating the #GstFFTF32 instance with gst_fft_f32_new().
+ *
+ * @timedata must be large enough to hold @len time domain samples.
+ *
+ */
+void
+gst_fft_f32_inverse_fft (GstFFTF32 * self, const GstFFTF32Complex * freqdata,
+ gfloat * timedata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftri_f32 (self->cfg, (kiss_fft_f32_cpx *) freqdata, timedata);
+}
+
+/**
+ * gst_fft_f32_free:
+ * @self: #GstFFTF32 instance for this call
+ *
+ * This frees the memory allocated for @self.
+ *
+ */
+void
+gst_fft_f32_free (GstFFTF32 * self)
+{
+ g_free (self);
+}
+
+/**
+ * gst_fft_f32_window:
+ * @self: #GstFFTF32 instance for this call
+ * @timedata: Time domain samples
+ * @window: Window function to apply
+ *
+ * This calls the window function @window on the @timedata sample buffer.
+ *
+ */
+void
+gst_fft_f32_window (GstFFTF32 * self, gfloat * timedata, GstFFTWindow window)
+{
+ gint i, len;
+
+ g_return_if_fail (self);
+ g_return_if_fail (timedata);
+
+ len = self->len;
+
+ switch (window) {
+ case GST_FFT_WINDOW_RECTANGULAR:
+ /* do nothing */
+ break;
+ case GST_FFT_WINDOW_HAMMING:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.53836 - 0.46164 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_HANN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.5 - 0.5 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_BARTLETT:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (1.0 - fabs ((2.0 * i - len) / len));
+ break;
+ case GST_FFT_WINDOW_BLACKMAN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.42 - 0.5 * cos ((2.0 * i) / len) +
+ 0.08 * cos ((4.0 * i) / len));
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
diff --git a/gst-libs/gst/fft/gstfftf32.h b/gst-libs/gst/fft/gstfftf32.h
new file mode 100644
index 0000000..3b56b48
--- /dev/null
+++ b/gst-libs/gst/fft/gstfftf32.h
@@ -0,0 +1,75 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_FFT_F32_H__
+#define __GST_FFT_F32_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "gstfft.h"
+
+typedef struct _GstFFTF32 GstFFTF32;
+typedef struct _GstFFTF32Complex GstFFTF32Complex;
+
+/* FIXME 0.11: Move the struct definition to the sources,
+ * there's no reason to have it public.
+ */
+/**
+ * GstFFTF32:
+ *
+ * Instance structure for #GstFFTF32.
+ *
+ */
+struct _GstFFTF32 {
+ /* <private> */
+ void * cfg;
+ gboolean inverse;
+ gint len;
+ gpointer _padding[GST_PADDING];
+};
+
+/* Copy of kiss_fft_f32_cpx for documentation reasons,
+ * do NOT change! */
+
+/**
+ * GstFFTF32Complex:
+ * @r: Real part
+ * @i: Imaginary part
+ *
+ * Data type for complex numbers composed of
+ * 32 bit float.
+ *
+ */
+struct _GstFFTF32Complex
+{
+ gfloat r;
+ gfloat i;
+};
+
+/* Functions */
+
+GstFFTF32 * gst_fft_f32_new (gint len, gboolean inverse);
+void gst_fft_f32_fft (GstFFTF32 *self, const gfloat *timedata, GstFFTF32Complex *freqdata);
+void gst_fft_f32_inverse_fft (GstFFTF32 *self, const GstFFTF32Complex *freqdata, gfloat *timedata);
+void gst_fft_f32_free (GstFFTF32 *self);
+
+void gst_fft_f32_window (GstFFTF32 *self, gfloat *timedata, GstFFTWindow window);
+
+#endif /* __GST_FFT_F32_H__ */
diff --git a/gst-libs/gst/fft/gstfftf64.c b/gst-libs/gst/fft/gstfftf64.c
new file mode 100644
index 0000000..e737854
--- /dev/null
+++ b/gst-libs/gst/fft/gstfftf64.c
@@ -0,0 +1,208 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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 <glib.h>
+#include <math.h>
+
+#include "_kiss_fft_guts_f64.h"
+#include "kiss_fftr_f64.h"
+#include "gstfft.h"
+#include "gstfftf64.h"
+
+/**
+ * SECTION:gstfftf64
+ * @short_description: FFT functions for 64 bit float samples
+ *
+ * #GstFFTF64 provides a FFT implementation and related functions for
+ * 64 bit float samples. To use this call gst_fft_f64_new() for
+ * allocating a #GstFFTF64 instance with the appropiate parameters and
+ * then call gst_fft_f64_fft() or gst_fft_f64_inverse_fft() to perform the
+ * FFT or inverse FFT on a buffer of samples.
+ *
+ * After use free the #GstFFTF64 instance with gst_fft_f64_free().
+ *
+ * For the best performance use gst_fft_next_fast_length() to get a
+ * number that is entirely a product of 2, 3 and 5 and use this as the
+ * @len parameter for gst_fft_f64_new().
+ *
+ * The @len parameter specifies the number of samples in the time domain that
+ * will be processed or generated. The number of samples in the frequency domain
+ * is @len/2 + 1. To get n samples in the frequency domain use 2*n - 2 as @len.
+ *
+ * Before performing the FFT on time domain data it usually makes sense
+ * to apply a window function to it. For this gst_fft_f64_window() can comfortably
+ * be used.
+ *
+ * Be aware, that you can't simply run gst_fft_f32_inverse_fft() on the
+ * resulting frequency data of gst_fft_f32_fft() to get the original data back.
+ * The relation between them is iFFT (FFT (x)) = x * nfft where nfft is the
+ * length of the FFT. This also has to be taken into account when calculation
+ * the magnitude of the frequency data.
+ *
+ */
+
+/**
+ * gst_fft_f64_new:
+ * @len: Length of the FFT in the time domain
+ * @inverse: %TRUE if the #GstFFTF64 instance should be used for the inverse FFT
+ *
+ * This returns a new #GstFFTF64 instance with the given parameters. It makes
+ * sense to keep one instance for several calls for speed reasons.
+ *
+ * @len must be even and to get the best performance a product of
+ * 2, 3 and 5. To get the next number with this characteristics use
+ * gst_fft_next_fast_length().
+ *
+ * Returns: a new #GstFFTF64 instance.
+ */
+GstFFTF64 *
+gst_fft_f64_new (gint len, gboolean inverse)
+{
+ GstFFTF64 *self;
+ gsize subsize = 0, memneeded;
+
+ g_return_val_if_fail (len > 0, NULL);
+ g_return_val_if_fail (len % 2 == 0, NULL);
+
+ kiss_fftr_f64_alloc (len, (inverse) ? 1 : 0, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (GstFFTF64)) + subsize;
+
+ self = (GstFFTF64 *) g_malloc0 (memneeded);
+
+ self->cfg = (((guint8 *) self) + ALIGN_STRUCT (sizeof (GstFFTF64)));
+ self->cfg = kiss_fftr_f64_alloc (len, (inverse) ? 1 : 0, self->cfg, &subsize);
+ g_assert (self->cfg);
+
+ self->inverse = inverse;
+ self->len = len;
+
+ return self;
+}
+
+/**
+ * gst_fft_f64_fft:
+ * @self: #GstFFTF64 instance for this call
+ * @timedata: Buffer of the samples in the time domain
+ * @freqdata: Target buffer for the samples in the frequency domain
+ *
+ * This performs the FFT on @timedata and puts the result in @freqdata.
+ *
+ * @timedata must have as many samples as specified with the @len parameter while
+ * allocating the #GstFFTF64 instance with gst_fft_f64_new().
+ *
+ * @freqdata must be large enough to hold @len/2 + 1 #GstFFTF64Complex frequency
+ * domain samples.
+ *
+ */
+void
+gst_fft_f64_fft (GstFFTF64 * self, const gdouble * timedata,
+ GstFFTF64Complex * freqdata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (!self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftr_f64 (self->cfg, timedata, (kiss_fft_f64_cpx *) freqdata);
+}
+
+/**
+ * gst_fft_f64_inverse_fft:
+ * @self: #GstFFTF64 instance for this call
+ * @freqdata: Buffer of the samples in the frequency domain
+ * @timedata: Target buffer for the samples in the time domain
+ *
+ * This performs the inverse FFT on @freqdata and puts the result in @timedata.
+ *
+ * @freqdata must have @len/2 + 1 samples, where @len is the parameter specified
+ * while allocating the #GstFFTF64 instance with gst_fft_f64_new().
+ *
+ * @timedata must be large enough to hold @len time domain samples.
+ *
+ */
+void
+gst_fft_f64_inverse_fft (GstFFTF64 * self, const GstFFTF64Complex * freqdata,
+ gdouble * timedata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftri_f64 (self->cfg, (kiss_fft_f64_cpx *) freqdata, timedata);
+}
+
+/**
+ * gst_fft_f64_free:
+ * @self: #GstFFTF64 instance for this call
+ *
+ * This frees the memory allocated for @self.
+ *
+ */
+void
+gst_fft_f64_free (GstFFTF64 * self)
+{
+ g_free (self);
+}
+
+/**
+ * gst_fft_f64_window:
+ * @self: #GstFFTF64 instance for this call
+ * @timedata: Time domain samples
+ * @window: Window function to apply
+ *
+ * This calls the window function @window on the @timedata sample buffer.
+ *
+ */
+void
+gst_fft_f64_window (GstFFTF64 * self, gdouble * timedata, GstFFTWindow window)
+{
+ gint i, len;
+
+ g_return_if_fail (self);
+ g_return_if_fail (timedata);
+
+ len = self->len;
+
+ switch (window) {
+ case GST_FFT_WINDOW_RECTANGULAR:
+ /* do nothing */
+ break;
+ case GST_FFT_WINDOW_HAMMING:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.53836 - 0.46164 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_HANN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.5 - 0.5 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_BARTLETT:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (1.0 - fabs ((2.0 * i - len) / len));
+ break;
+ case GST_FFT_WINDOW_BLACKMAN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.42 - 0.5 * cos ((2.0 * i) / len) +
+ 0.08 * cos ((4.0 * i) / len));
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
diff --git a/gst-libs/gst/fft/gstfftf64.h b/gst-libs/gst/fft/gstfftf64.h
new file mode 100644
index 0000000..8ebbee4
--- /dev/null
+++ b/gst-libs/gst/fft/gstfftf64.h
@@ -0,0 +1,75 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_FFT_F64_H__
+#define __GST_FFT_F64_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "gstfft.h"
+
+typedef struct _GstFFTF64 GstFFTF64;
+typedef struct _GstFFTF64Complex GstFFTF64Complex;
+
+/* FIXME 0.11: Move the struct definition to the sources,
+ * there's no reason to have it public.
+ */
+/**
+ * GstFFTF64:
+ *
+ * Instance structure for #GstFFTF64.
+ *
+ */
+struct _GstFFTF64 {
+ /* <private> */
+ void * cfg;
+ gboolean inverse;
+ gint len;
+ gpointer _padding[GST_PADDING];
+};
+
+/* Copy of kiss_fft_f64_cpx for documentation reasons,
+ * do NOT change! */
+
+/**
+ * GstFFTF64Complex:
+ * @r: Real part
+ * @i: Imaginary part
+ *
+ * Data type for complex numbers composed of
+ * 64 bit float.
+ *
+ */
+struct _GstFFTF64Complex
+{
+ gdouble r;
+ gdouble i;
+};
+
+/* Functions */
+
+GstFFTF64 * gst_fft_f64_new (gint len, gboolean inverse);
+void gst_fft_f64_fft (GstFFTF64 *self, const gdouble *timedata, GstFFTF64Complex *freqdata);
+void gst_fft_f64_inverse_fft (GstFFTF64 *self, const GstFFTF64Complex *freqdata, gdouble *timedata);
+void gst_fft_f64_free (GstFFTF64 *self);
+
+void gst_fft_f64_window (GstFFTF64 *self, gdouble *timedata, GstFFTWindow window);
+
+#endif /* __GST_FFT_F64_H__ */
diff --git a/gst-libs/gst/fft/gstffts16.c b/gst-libs/gst/fft/gstffts16.c
new file mode 100644
index 0000000..212e93f
--- /dev/null
+++ b/gst-libs/gst/fft/gstffts16.c
@@ -0,0 +1,208 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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 <glib.h>
+#include <math.h>
+
+#include "_kiss_fft_guts_s16.h"
+#include "kiss_fftr_s16.h"
+#include "gstfft.h"
+#include "gstffts16.h"
+
+/**
+ * SECTION:gstffts16
+ * @short_description: FFT functions for signed 16 bit integer samples
+ *
+ * #GstFFTS16 provides a FFT implementation and related functions for
+ * signed 16 bit integer samples. To use this call gst_fft_s16_new() for
+ * allocating a #GstFFTS16 instance with the appropiate parameters and
+ * then call gst_fft_s16_fft() or gst_fft_s16_inverse_fft() to perform the
+ * FFT or inverse FFT on a buffer of samples.
+ *
+ * After use free the #GstFFTS16 instance with gst_fft_s16_free().
+ *
+ * For the best performance use gst_fft_next_fast_length() to get a
+ * number that is entirely a product of 2, 3 and 5 and use this as the
+ * @len parameter for gst_fft_s16_new().
+ *
+ * The @len parameter specifies the number of samples in the time domain that
+ * will be processed or generated. The number of samples in the frequency domain
+ * is @len/2 + 1. To get n samples in the frequency domain use 2*n - 2 as @len.
+ *
+ * Before performing the FFT on time domain data it usually makes sense
+ * to apply a window function to it. For this gst_fft_s16_window() can comfortably
+ * be used.
+ *
+ * Be aware, that you can't simply run gst_fft_s16_inverse_fft() on the
+ * resulting frequency data of gst_fft_s16_fft() to get the original data back.
+ * The relation between them is iFFT (FFT (x)) = x / nfft where nfft is the
+ * length of the FFT. This also has to be taken into account when calculation
+ * the magnitude of the frequency data.
+ *
+ */
+
+/**
+ * gst_fft_s16_new:
+ * @len: Length of the FFT in the time domain
+ * @inverse: %TRUE if the #GstFFTS16 instance should be used for the inverse FFT
+ *
+ * This returns a new #GstFFTS16 instance with the given parameters. It makes
+ * sense to keep one instance for several calls for speed reasons.
+ *
+ * @len must be even and to get the best performance a product of
+ * 2, 3 and 5. To get the next number with this characteristics use
+ * gst_fft_next_fast_length().
+ *
+ * Returns: a new #GstFFTS16 instance.
+ */
+GstFFTS16 *
+gst_fft_s16_new (gint len, gboolean inverse)
+{
+ GstFFTS16 *self;
+ gsize subsize = 0, memneeded;
+
+ g_return_val_if_fail (len > 0, NULL);
+ g_return_val_if_fail (len % 2 == 0, NULL);
+
+ kiss_fftr_s16_alloc (len, (inverse) ? 1 : 0, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (GstFFTS16)) + subsize;
+
+ self = (GstFFTS16 *) g_malloc0 (memneeded);
+
+ self->cfg = (((guint8 *) self) + ALIGN_STRUCT (sizeof (GstFFTS16)));
+ self->cfg = kiss_fftr_s16_alloc (len, (inverse) ? 1 : 0, self->cfg, &subsize);
+ g_assert (self->cfg);
+
+ self->inverse = inverse;
+ self->len = len;
+
+ return self;
+}
+
+/**
+ * gst_fft_s16_fft:
+ * @self: #GstFFTS16 instance for this call
+ * @timedata: Buffer of the samples in the time domain
+ * @freqdata: Target buffer for the samples in the frequency domain
+ *
+ * This performs the FFT on @timedata and puts the result in @freqdata.
+ *
+ * @timedata must have as many samples as specified with the @len parameter while
+ * allocating the #GstFFTS16 instance with gst_fft_s16_new().
+ *
+ * @freqdata must be large enough to hold @len/2 + 1 #GstFFTS16Complex frequency
+ * domain samples.
+ *
+ */
+void
+gst_fft_s16_fft (GstFFTS16 * self, const gint16 * timedata,
+ GstFFTS16Complex * freqdata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (!self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftr_s16 (self->cfg, timedata, (kiss_fft_s16_cpx *) freqdata);
+}
+
+/**
+ * gst_fft_s16_inverse_fft:
+ * @self: #GstFFTS16 instance for this call
+ * @freqdata: Buffer of the samples in the frequency domain
+ * @timedata: Target buffer for the samples in the time domain
+ *
+ * This performs the inverse FFT on @freqdata and puts the result in @timedata.
+ *
+ * @freqdata must have @len/2 + 1 samples, where @len is the parameter specified
+ * while allocating the #GstFFTS16 instance with gst_fft_s16_new().
+ *
+ * @timedata must be large enough to hold @len time domain samples.
+ *
+ */
+void
+gst_fft_s16_inverse_fft (GstFFTS16 * self, const GstFFTS16Complex * freqdata,
+ gint16 * timedata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftri_s16 (self->cfg, (kiss_fft_s16_cpx *) freqdata, timedata);
+}
+
+/**
+ * gst_fft_s16_free:
+ * @self: #GstFFTS16 instance for this call
+ *
+ * This frees the memory allocated for @self.
+ *
+ */
+void
+gst_fft_s16_free (GstFFTS16 * self)
+{
+ g_free (self);
+}
+
+/**
+ * gst_fft_s16_window:
+ * @self: #GstFFTS16 instance for this call
+ * @timedata: Time domain samples
+ * @window: Window function to apply
+ *
+ * This calls the window function @window on the @timedata sample buffer.
+ *
+ */
+void
+gst_fft_s16_window (GstFFTS16 * self, gint16 * timedata, GstFFTWindow window)
+{
+ gint i, len;
+
+ g_return_if_fail (self);
+ g_return_if_fail (timedata);
+
+ len = self->len;
+
+ switch (window) {
+ case GST_FFT_WINDOW_RECTANGULAR:
+ /* do nothing */
+ break;
+ case GST_FFT_WINDOW_HAMMING:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.53836 - 0.46164 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_HANN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.5 - 0.5 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_BARTLETT:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (1.0 - fabs ((2.0 * i - len) / len));
+ break;
+ case GST_FFT_WINDOW_BLACKMAN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.42 - 0.5 * cos ((2.0 * i) / len) +
+ 0.08 * cos ((4.0 * i) / len));
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
diff --git a/gst-libs/gst/fft/gstffts16.h b/gst-libs/gst/fft/gstffts16.h
new file mode 100644
index 0000000..9a752f1
--- /dev/null
+++ b/gst-libs/gst/fft/gstffts16.h
@@ -0,0 +1,74 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_FFT_S16_H__
+#define __GST_FFT_S16_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "gstfft.h"
+
+typedef struct _GstFFTS16 GstFFTS16;
+typedef struct _GstFFTS16Complex GstFFTS16Complex;
+
+/* FIXME 0.11: Move the struct definition to the sources,
+ * there's no reason to have it public.
+ */
+/**
+ * GstFFTS16:
+ *
+ * Instance structure for #GstFFTS16.
+ *
+ */
+struct _GstFFTS16 {
+ /* <private> */
+ void *cfg;
+ gboolean inverse;
+ gint len;
+ gpointer _padding[GST_PADDING];
+};
+
+/* Copy of kiss_fft_s16_cpx for documentation reasons,
+ * do NOT change! */
+
+/**
+ * GstFFTS16Complex:
+ * @r: Real part
+ * @i: Imaginary part
+ *
+ * Data type for complex numbers composed of
+ * signed 16 bit integers.
+ *
+ */
+struct _GstFFTS16Complex
+{
+ gint16 r;
+ gint16 i;
+};
+
+/* Functions */
+
+GstFFTS16 * gst_fft_s16_new (gint len, gboolean inverse);
+void gst_fft_s16_fft (GstFFTS16 *self, const gint16 *timedata, GstFFTS16Complex *freqdata);
+void gst_fft_s16_inverse_fft (GstFFTS16 *self, const GstFFTS16Complex *freqdata, gint16 *timedata);
+void gst_fft_s16_free (GstFFTS16 *self);
+
+void gst_fft_s16_window (GstFFTS16 *self, gint16 *timedata, GstFFTWindow window);
+#endif /* __GST_FFT_S16_H__ */
diff --git a/gst-libs/gst/fft/gstffts32.c b/gst-libs/gst/fft/gstffts32.c
new file mode 100644
index 0000000..56ea543
--- /dev/null
+++ b/gst-libs/gst/fft/gstffts32.c
@@ -0,0 +1,207 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.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 <glib.h>
+#include <math.h>
+
+#include "_kiss_fft_guts_s32.h"
+#include "kiss_fftr_s32.h"
+#include "gstfft.h"
+#include "gstffts32.h"
+
+/**
+ * SECTION:gstffts32
+ * @short_description: FFT functions for signed 32 bit integer samples
+ *
+ * #GstFFTS32 provides a FFT implementation and related functions for
+ * signed 32 bit integer samples. To use this call gst_fft_s32_new() for
+ * allocating a #GstFFTS32 instance with the appropiate parameters and
+ * then call gst_fft_s32_fft() or gst_fft_s32_inverse_fft() to perform the
+ * FFT or inverse FFT on a buffer of samples.
+ *
+ * After use free the #GstFFTS32 instance with gst_fft_s32_free().
+ *
+ * For the best performance use gst_fft_next_fast_length() to get a
+ * number that is entirely a product of 2, 3 and 5 and use this as the
+ * @len parameter for gst_fft_s32_new().
+ *
+ * The @len parameter specifies the number of samples in the time domain that
+ * will be processed or generated. The number of samples in the frequency domain
+ * is @len/2 + 1. To get n samples in the frequency domain use 2*n - 2 as @len.
+ *
+ * Before performing the FFT on time domain data it usually makes sense
+ * to apply a window function to it. For this gst_fft_s32_window() can comfortably
+ * be used.
+ *
+ * Be aware, that you can't simply run gst_fft_s32_inverse_fft() on the
+ * resulting frequency data of gst_fft_s32_fft() to get the original data back.
+ * The relation between them is iFFT (FFT (x)) = x / nfft where nfft is the
+ * length of the FFT. This also has to be taken into account when calculation
+ * the magnitude of the frequency data.
+ */
+
+/**
+ * gst_fft_s32_new:
+ * @len: Length of the FFT in the time domain
+ * @inverse: %TRUE if the #GstFFTS32 instance should be used for the inverse FFT
+ *
+ * This returns a new #GstFFTS32 instance with the given parameters. It makes
+ * sense to keep one instance for several calls for speed reasons.
+ *
+ * @len must be even and to get the best performance a product of
+ * 2, 3 and 5. To get the next number with this characteristics use
+ * gst_fft_next_fast_length().
+ *
+ * Returns: a new #GstFFTS32 instance.
+ */
+GstFFTS32 *
+gst_fft_s32_new (gint len, gboolean inverse)
+{
+ GstFFTS32 *self;
+ gsize subsize = 0, memneeded;
+
+ g_return_val_if_fail (len > 0, NULL);
+ g_return_val_if_fail (len % 2 == 0, NULL);
+
+ kiss_fftr_s32_alloc (len, (inverse) ? 1 : 0, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (GstFFTS32)) + subsize;
+
+ self = (GstFFTS32 *) g_malloc0 (memneeded);
+
+ self->cfg = (((guint8 *) self) + ALIGN_STRUCT (sizeof (GstFFTS32)));
+ self->cfg = kiss_fftr_s32_alloc (len, (inverse) ? 1 : 0, self->cfg, &subsize);
+ g_assert (self->cfg);
+
+ self->inverse = inverse;
+ self->len = len;
+
+ return self;
+}
+
+/**
+ * gst_fft_s32_fft:
+ * @self: #GstFFTS32 instance for this call
+ * @timedata: Buffer of the samples in the time domain
+ * @freqdata: Target buffer for the samples in the frequency domain
+ *
+ * This performs the FFT on @timedata and puts the result in @freqdata.
+ *
+ * @timedata must have as many samples as specified with the @len parameter while
+ * allocating the #GstFFTS32 instance with gst_fft_s32_new().
+ *
+ * @freqdata must be large enough to hold @len/2 + 1 #GstFFTS32Complex frequency
+ * domain samples.
+ *
+ */
+void
+gst_fft_s32_fft (GstFFTS32 * self, const gint32 * timedata,
+ GstFFTS32Complex * freqdata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (!self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftr_s32 (self->cfg, timedata, (kiss_fft_s32_cpx *) freqdata);
+}
+
+/**
+ * gst_fft_s32_inverse_fft:
+ * @self: #GstFFTS32 instance for this call
+ * @freqdata: Buffer of the samples in the frequency domain
+ * @timedata: Target buffer for the samples in the time domain
+ *
+ * This performs the inverse FFT on @freqdata and puts the result in @timedata.
+ *
+ * @freqdata must have @len/2 + 1 samples, where @len is the parameter specified
+ * while allocating the #GstFFTS32 instance with gst_fft_s32_new().
+ *
+ * @timedata must be large enough to hold @len time domain samples.
+ *
+ */
+void
+gst_fft_s32_inverse_fft (GstFFTS32 * self, const GstFFTS32Complex * freqdata,
+ gint32 * timedata)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (self->inverse);
+ g_return_if_fail (timedata);
+ g_return_if_fail (freqdata);
+
+ kiss_fftri_s32 (self->cfg, (kiss_fft_s32_cpx *) freqdata, timedata);
+}
+
+/**
+ * gst_fft_s32_free:
+ * @self: #GstFFTS32 instance for this call
+ *
+ * This frees the memory allocated for @self.
+ *
+ */
+void
+gst_fft_s32_free (GstFFTS32 * self)
+{
+ g_free (self);
+}
+
+/**
+ * gst_fft_s32_window:
+ * @self: #GstFFTS32 instance for this call
+ * @timedata: Time domain samples
+ * @window: Window function to apply
+ *
+ * This calls the window function @window on the @timedata sample buffer.
+ *
+ */
+void
+gst_fft_s32_window (GstFFTS32 * self, gint32 * timedata, GstFFTWindow window)
+{
+ gint i, len;
+
+ g_return_if_fail (self);
+ g_return_if_fail (timedata);
+
+ len = self->len;
+
+ switch (window) {
+ case GST_FFT_WINDOW_RECTANGULAR:
+ /* do nothing */
+ break;
+ case GST_FFT_WINDOW_HAMMING:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.53836 - 0.46164 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_HANN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.5 - 0.5 * cos (2.0 * G_PI * i / len));
+ break;
+ case GST_FFT_WINDOW_BARTLETT:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (1.0 - fabs ((2.0 * i - len) / len));
+ break;
+ case GST_FFT_WINDOW_BLACKMAN:
+ for (i = 0; i < len; i++)
+ timedata[i] *= (0.42 - 0.5 * cos ((2.0 * i) / len) +
+ 0.08 * cos ((4.0 * i) / len));
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
diff --git a/gst-libs/gst/fft/gstffts32.h b/gst-libs/gst/fft/gstffts32.h
new file mode 100644
index 0000000..fd3b279
--- /dev/null
+++ b/gst-libs/gst/fft/gstffts32.h
@@ -0,0 +1,75 @@
+/* GStreamer
+ * Copyright (C) <2007> Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_FFT_S32_H__
+#define __GST_FFT_S32_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "gstfft.h"
+
+typedef struct _GstFFTS32 GstFFTS32;
+typedef struct _GstFFTS32Complex GstFFTS32Complex;
+
+/* FIXME 0.11: Move the struct definition to the sources,
+ * there's no reason to have it public.
+ */
+/**
+ * GstFFTS32:
+ *
+ * Instance structure for #GstFFTS32.
+ *
+ */
+struct _GstFFTS32 {
+ /* <private> */
+ void * cfg;
+ gboolean inverse;
+ gint len;
+ gpointer _padding[GST_PADDING];
+};
+
+/* Copy of kiss_fft_s32_cpx for documentation reasons,
+ * do NOT change! */
+
+/**
+ * GstFFTS32Complex:
+ * @r: Real part
+ * @i: Imaginary part
+ *
+ * Data type for complex numbers composed of
+ * signed 32 bit integers.
+ *
+ */
+struct _GstFFTS32Complex
+{
+ gint32 r;
+ gint32 i;
+};
+
+/* Functions */
+
+GstFFTS32 * gst_fft_s32_new (gint len, gboolean inverse);
+void gst_fft_s32_fft (GstFFTS32 *self, const gint32 *timedata, GstFFTS32Complex *freqdata);
+void gst_fft_s32_inverse_fft (GstFFTS32 *self, const GstFFTS32Complex *freqdata, gint32 *timedata);
+void gst_fft_s32_free (GstFFTS32 *self);
+
+void gst_fft_s32_window (GstFFTS32 *self, gint32 *timedata, GstFFTWindow window);
+
+#endif /* __GST_FFT_S32_H__ */
diff --git a/gst-libs/gst/fft/kiss_fft_f32.c b/gst-libs/gst/fft/kiss_fft_f32.c
new file mode 100644
index 0000000..693a899
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_f32.c
@@ -0,0 +1,472 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+
+#include "_kiss_fft_guts_f32.h"
+/* The guts header contains all the multiplication and addition macros that are defined for
+ fixed or floating point complex numbers. It also delares the kf_ internal functions.
+ */
+
+static kiss_fft_f32_cpx *scratchbuf = NULL;
+static size_t nscratchbuf = 0;
+static kiss_fft_f32_cpx *tmpbuf = NULL;
+static size_t ntmpbuf = 0;
+
+#define CHECKBUF(buf,nbuf,n) \
+ do { \
+ if ( nbuf < (size_t)(n) ) {\
+ free(buf); \
+ buf = (kiss_fft_f32_cpx*)KISS_FFT_F32_MALLOC(sizeof(kiss_fft_f32_cpx)*(n)); \
+ nbuf = (size_t)(n); \
+ } \
+ }while(0)
+
+
+static void
+kf_bfly2 (kiss_fft_f32_cpx * Fout,
+ const size_t fstride, const kiss_fft_f32_cfg st, int m)
+{
+ kiss_fft_f32_cpx *Fout2;
+ kiss_fft_f32_cpx *tw1 = st->twiddles;
+ kiss_fft_f32_cpx t;
+
+ Fout2 = Fout + m;
+ do {
+ C_FIXDIV (*Fout, 2);
+ C_FIXDIV (*Fout2, 2);
+
+ C_MUL (t, *Fout2, *tw1);
+ tw1 += fstride;
+ C_SUB (*Fout2, *Fout, t);
+ C_ADDTO (*Fout, t);
+ ++Fout2;
+ ++Fout;
+ } while (--m);
+}
+
+static void
+kf_bfly4 (kiss_fft_f32_cpx * Fout,
+ const size_t fstride, const kiss_fft_f32_cfg st, const size_t m)
+{
+ kiss_fft_f32_cpx *tw1, *tw2, *tw3;
+ kiss_fft_f32_cpx scratch[6];
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ const size_t m3 = 3 * m;
+
+ tw3 = tw2 = tw1 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 4);
+ C_FIXDIV (Fout[m], 4);
+ C_FIXDIV (Fout[m2], 4);
+ C_FIXDIV (Fout[m3], 4);
+
+ C_MUL (scratch[0], Fout[m], *tw1);
+ C_MUL (scratch[1], Fout[m2], *tw2);
+ C_MUL (scratch[2], Fout[m3], *tw3);
+
+ C_SUB (scratch[5], *Fout, scratch[1]);
+ C_ADDTO (*Fout, scratch[1]);
+ C_ADD (scratch[3], scratch[0], scratch[2]);
+ C_SUB (scratch[4], scratch[0], scratch[2]);
+ C_SUB (Fout[m2], *Fout, scratch[3]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+ tw3 += fstride * 3;
+ C_ADDTO (*Fout, scratch[3]);
+
+ if (st->inverse) {
+ Fout[m].r = scratch[5].r - scratch[4].i;
+ Fout[m].i = scratch[5].i + scratch[4].r;
+ Fout[m3].r = scratch[5].r + scratch[4].i;
+ Fout[m3].i = scratch[5].i - scratch[4].r;
+ } else {
+ Fout[m].r = scratch[5].r + scratch[4].i;
+ Fout[m].i = scratch[5].i - scratch[4].r;
+ Fout[m3].r = scratch[5].r - scratch[4].i;
+ Fout[m3].i = scratch[5].i + scratch[4].r;
+ }
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly3 (kiss_fft_f32_cpx * Fout,
+ const size_t fstride, const kiss_fft_f32_cfg st, size_t m)
+{
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ kiss_fft_f32_cpx *tw1, *tw2;
+ kiss_fft_f32_cpx scratch[5];
+ kiss_fft_f32_cpx epi3;
+
+ epi3 = st->twiddles[fstride * m];
+
+ tw1 = tw2 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 3);
+ C_FIXDIV (Fout[m], 3);
+ C_FIXDIV (Fout[m2], 3);
+
+ C_MUL (scratch[1], Fout[m], *tw1);
+ C_MUL (scratch[2], Fout[m2], *tw2);
+
+ C_ADD (scratch[3], scratch[1], scratch[2]);
+ C_SUB (scratch[0], scratch[1], scratch[2]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+
+ Fout[m].r = Fout->r - HALF_OF (scratch[3].r);
+ Fout[m].i = Fout->i - HALF_OF (scratch[3].i);
+
+ C_MULBYSCALAR (scratch[0], epi3.i);
+
+ C_ADDTO (*Fout, scratch[3]);
+
+ Fout[m2].r = Fout[m].r + scratch[0].i;
+ Fout[m2].i = Fout[m].i - scratch[0].r;
+
+ Fout[m].r -= scratch[0].i;
+ Fout[m].i += scratch[0].r;
+
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly5 (kiss_fft_f32_cpx * Fout,
+ const size_t fstride, const kiss_fft_f32_cfg st, int m)
+{
+ kiss_fft_f32_cpx *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
+ int u;
+ kiss_fft_f32_cpx scratch[13];
+ kiss_fft_f32_cpx *twiddles = st->twiddles;
+ kiss_fft_f32_cpx *tw;
+ kiss_fft_f32_cpx ya, yb;
+
+ ya = twiddles[fstride * m];
+ yb = twiddles[fstride * 2 * m];
+
+ Fout0 = Fout;
+ Fout1 = Fout0 + m;
+ Fout2 = Fout0 + 2 * m;
+ Fout3 = Fout0 + 3 * m;
+ Fout4 = Fout0 + 4 * m;
+
+ tw = st->twiddles;
+ for (u = 0; u < m; ++u) {
+ C_FIXDIV (*Fout0, 5);
+ C_FIXDIV (*Fout1, 5);
+ C_FIXDIV (*Fout2, 5);
+ C_FIXDIV (*Fout3, 5);
+ C_FIXDIV (*Fout4, 5);
+ scratch[0] = *Fout0;
+
+ C_MUL (scratch[1], *Fout1, tw[u * fstride]);
+ C_MUL (scratch[2], *Fout2, tw[2 * u * fstride]);
+ C_MUL (scratch[3], *Fout3, tw[3 * u * fstride]);
+ C_MUL (scratch[4], *Fout4, tw[4 * u * fstride]);
+
+ C_ADD (scratch[7], scratch[1], scratch[4]);
+ C_SUB (scratch[10], scratch[1], scratch[4]);
+ C_ADD (scratch[8], scratch[2], scratch[3]);
+ C_SUB (scratch[9], scratch[2], scratch[3]);
+
+ Fout0->r += scratch[7].r + scratch[8].r;
+ Fout0->i += scratch[7].i + scratch[8].i;
+
+ scratch[5].r =
+ scratch[0].r + S_MUL (scratch[7].r, ya.r) + S_MUL (scratch[8].r, yb.r);
+ scratch[5].i =
+ scratch[0].i + S_MUL (scratch[7].i, ya.r) + S_MUL (scratch[8].i, yb.r);
+
+ scratch[6].r = S_MUL (scratch[10].i, ya.i) + S_MUL (scratch[9].i, yb.i);
+ scratch[6].i = -S_MUL (scratch[10].r, ya.i) - S_MUL (scratch[9].r, yb.i);
+
+ C_SUB (*Fout1, scratch[5], scratch[6]);
+ C_ADD (*Fout4, scratch[5], scratch[6]);
+
+ scratch[11].r =
+ scratch[0].r + S_MUL (scratch[7].r, yb.r) + S_MUL (scratch[8].r, ya.r);
+ scratch[11].i =
+ scratch[0].i + S_MUL (scratch[7].i, yb.r) + S_MUL (scratch[8].i, ya.r);
+ scratch[12].r = -S_MUL (scratch[10].i, yb.i) + S_MUL (scratch[9].i, ya.i);
+ scratch[12].i = S_MUL (scratch[10].r, yb.i) - S_MUL (scratch[9].r, ya.i);
+
+ C_ADD (*Fout2, scratch[11], scratch[12]);
+ C_SUB (*Fout3, scratch[11], scratch[12]);
+
+ ++Fout0;
+ ++Fout1;
+ ++Fout2;
+ ++Fout3;
+ ++Fout4;
+ }
+}
+
+/* perform the butterfly for one stage of a mixed radix FFT */
+static void
+kf_bfly_generic (kiss_fft_f32_cpx * Fout,
+ const size_t fstride, const kiss_fft_f32_cfg st, int m, int p)
+{
+ int u, k, q1, q;
+ kiss_fft_f32_cpx *twiddles = st->twiddles;
+ kiss_fft_f32_cpx t;
+ int Norig = st->nfft;
+
+ CHECKBUF (scratchbuf, nscratchbuf, p);
+
+ for (u = 0; u < m; ++u) {
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ scratchbuf[q1] = Fout[k];
+ C_FIXDIV (scratchbuf[q1], p);
+ k += m;
+ }
+
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ int twidx = 0;
+
+ Fout[k] = scratchbuf[0];
+ for (q = 1; q < p; ++q) {
+ twidx += fstride * k;
+ if (twidx >= Norig)
+ twidx -= Norig;
+ C_MUL (t, scratchbuf[q], twiddles[twidx]);
+ C_ADDTO (Fout[k], t);
+ }
+ k += m;
+ }
+ }
+}
+
+static void
+kf_work (kiss_fft_f32_cpx * Fout,
+ const kiss_fft_f32_cpx * f,
+ const size_t fstride,
+ int in_stride, int *factors, const kiss_fft_f32_cfg st)
+{
+ kiss_fft_f32_cpx *Fout_beg = Fout;
+ const int p = *factors++; /* the radix */
+ const int m = *factors++; /* stage's fft length/p */
+ const kiss_fft_f32_cpx *Fout_end = Fout + p * m;
+
+#ifdef _OPENMP
+ // use openmp extensions at the
+ // top-level (not recursive)
+ if (fstride == 1) {
+ int k;
+
+ // execute the p different work units in different threads
+# pragma omp parallel for
+ for (k = 0; k < p; ++k)
+ kf_work (Fout + k * m, f + fstride * in_stride * k, fstride * p,
+ in_stride, factors, st);
+ // all threads have joined by this point
+
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+ return;
+ }
+#endif
+
+ if (m == 1) {
+ do {
+ *Fout = *f;
+ f += fstride * in_stride;
+ } while (++Fout != Fout_end);
+ } else {
+ do {
+ // recursive call:
+ // DFT of size m*p performed by doing
+ // p instances of smaller DFTs of size m,
+ // each one takes a decimated version of the input
+ kf_work (Fout, f, fstride * p, in_stride, factors, st);
+ f += fstride * in_stride;
+ } while ((Fout += m) != Fout_end);
+ }
+
+ Fout = Fout_beg;
+
+ // recombine the p smaller DFTs
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+}
+
+/* facbuf is populated by p1,m1,p2,m2, ...
+ where
+ p[i] * m[i] = m[i-1]
+ m0 = n */
+static void
+kf_factor (int n, int *facbuf)
+{
+ int p = 4;
+ double floor_sqrt;
+
+ floor_sqrt = floor (sqrt ((double) n));
+
+ /*factor out powers of 4, powers of 2, then any remaining primes */
+ do {
+ while (n % p) {
+ switch (p) {
+ case 4:
+ p = 2;
+ break;
+ case 2:
+ p = 3;
+ break;
+ default:
+ p += 2;
+ break;
+ }
+ if (p > floor_sqrt)
+ p = n; /* no more factors, skip to end */
+ }
+ n /= p;
+ *facbuf++ = p;
+ *facbuf++ = n;
+ } while (n > 1);
+}
+
+/*
+ *
+ * User-callable function to allocate all necessary storage space for the fft.
+ *
+ * The return value is a contiguous block of memory, allocated with malloc. As such,
+ * It can be freed with free(), rather than a kiss_fft-specific function.
+ * */
+kiss_fft_f32_cfg
+kiss_fft_f32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ kiss_fft_f32_cfg st = NULL;
+ size_t memneeded = sizeof (struct kiss_fft_f32_state)
+ + sizeof (kiss_fft_f32_cpx) * (nfft - 1); /* twiddle factors */
+
+ if (lenmem == NULL) {
+ st = (kiss_fft_f32_cfg) KISS_FFT_F32_MALLOC (memneeded);
+ } else {
+ if (mem != NULL && *lenmem >= memneeded)
+ st = (kiss_fft_f32_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (st) {
+ int i;
+
+ st->nfft = nfft;
+ st->inverse = inverse_fft;
+
+ for (i = 0; i < nfft; ++i) {
+ const double pi =
+ 3.141592653589793238462643383279502884197169399375105820974944;
+ double phase = -2 * pi * i / nfft;
+
+ if (st->inverse)
+ phase *= -1;
+ kf_cexp (st->twiddles + i, phase);
+ }
+
+ kf_factor (nfft, st->factors);
+ }
+ return st;
+}
+
+
+
+
+void
+kiss_fft_f32_stride (kiss_fft_f32_cfg st, const kiss_fft_f32_cpx * fin,
+ kiss_fft_f32_cpx * fout, int in_stride)
+{
+ if (fin == fout) {
+ CHECKBUF (tmpbuf, ntmpbuf, st->nfft);
+ kf_work (tmpbuf, fin, 1, in_stride, st->factors, st);
+ memcpy (fout, tmpbuf, sizeof (kiss_fft_f32_cpx) * st->nfft);
+ } else {
+ kf_work (fout, fin, 1, in_stride, st->factors, st);
+ }
+}
+
+void
+kiss_fft_f32 (kiss_fft_f32_cfg cfg, const kiss_fft_f32_cpx * fin,
+ kiss_fft_f32_cpx * fout)
+{
+ kiss_fft_f32_stride (cfg, fin, fout, 1);
+}
+
+
+/* not really necessary to call, but if someone is doing in-place ffts, they may want to free the
+ buffers from CHECKBUF
+ */
+void
+kiss_fft_f32_cleanup (void)
+{
+ free (scratchbuf);
+ scratchbuf = NULL;
+ nscratchbuf = 0;
+ free (tmpbuf);
+ tmpbuf = NULL;
+ ntmpbuf = 0;
+}
+
+int
+kiss_fft_f32_next_fast_size (int n)
+{
+ while (1) {
+ int m = n;
+
+ while ((m % 2) == 0)
+ m /= 2;
+ while ((m % 3) == 0)
+ m /= 3;
+ while ((m % 5) == 0)
+ m /= 5;
+ if (m <= 1)
+ break; /* n is completely factorable by twos, threes, and fives */
+ n++;
+ }
+ return n;
+}
diff --git a/gst-libs/gst/fft/kiss_fft_f32.h b/gst-libs/gst/fft/kiss_fft_f32.h
new file mode 100644
index 0000000..098b89d
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_f32.h
@@ -0,0 +1,103 @@
+#ifndef KISS_FFT_F32_H
+#define KISS_FFT_F32_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ ATTENTION!
+ If you would like a :
+ -- a utility that will handle the caching of fft objects
+ -- real-only (no imaginary time component ) FFT
+ -- a multi-dimensional FFT
+ -- a command-line utility to perform ffts
+ -- a command-line utility to perform fast-convolution filtering
+
+ Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c
+ in the tools/ directory.
+*/
+
+#define KISS_FFT_F32_MALLOC g_malloc
+#define kiss_fft_f32_scalar float
+
+typedef struct {
+ kiss_fft_f32_scalar r;
+ kiss_fft_f32_scalar i;
+}kiss_fft_f32_cpx;
+
+typedef struct kiss_fft_f32_state* kiss_fft_f32_cfg;
+
+/*
+ * kiss_fft_f32_alloc
+ *
+ * Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
+ *
+ * typical usage: kiss_fft_f32_cfg mycfg=kiss_fft_f32_alloc(1024,0,NULL,NULL);
+ *
+ * The return value from fft_alloc is a cfg buffer used internally
+ * by the fft routine or NULL.
+ *
+ * If lenmem is NULL, then kiss_fft_f32_alloc will allocate a cfg buffer using malloc.
+ * The returned value should be free()d when done to avoid memory leaks.
+ *
+ * The state can be placed in a user supplied buffer 'mem':
+ * If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
+ * then the function places the cfg in mem and the size used in *lenmem
+ * and returns mem.
+ *
+ * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
+ * then the function returns NULL and places the minimum cfg
+ * buffer size in *lenmem.
+ * */
+
+kiss_fft_f32_cfg kiss_fft_f32_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem);
+
+/*
+ * kiss_fft(cfg,in_out_buf)
+ *
+ * Perform an FFT on a complex input buffer.
+ * for a forward FFT,
+ * fin should be f[0] , f[1] , ... ,f[nfft-1]
+ * fout will be F[0] , F[1] , ... ,F[nfft-1]
+ * Note that each element is complex and can be accessed like
+ f[k].r and f[k].i
+ * */
+void kiss_fft_f32(kiss_fft_f32_cfg cfg,const kiss_fft_f32_cpx *fin,kiss_fft_f32_cpx *fout);
+
+/*
+ A more generic version of the above function. It reads its input from every Nth sample.
+ * */
+void kiss_fft_f32_stride(kiss_fft_f32_cfg cfg,const kiss_fft_f32_cpx *fin,kiss_fft_f32_cpx *fout,int fin_stride);
+
+/* If kiss_fft_f32_alloc allocated a buffer, it is one contiguous
+ buffer and can be simply free()d when no longer needed*/
+#define kiss_fft_f32_free g_free
+
+/*
+ Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up
+ your compiler output to call this before you exit.
+*/
+void kiss_fft_f32_cleanup(void);
+
+
+/*
+ * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5)
+ */
+int kiss_fft_f32_next_fast_size(int n);
+
+/* for real ffts, we need an even size */
+#define kiss_fftr_next_fast_size_real(n) \
+ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gst-libs/gst/fft/kiss_fft_f64.c b/gst-libs/gst/fft/kiss_fft_f64.c
new file mode 100644
index 0000000..b311711
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_f64.c
@@ -0,0 +1,472 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+
+#include "_kiss_fft_guts_f64.h"
+/* The guts header contains all the multiplication and addition macros that are defined for
+ fixed or floating point complex numbers. It also delares the kf_ internal functions.
+ */
+
+static kiss_fft_f64_cpx *scratchbuf = NULL;
+static size_t nscratchbuf = 0;
+static kiss_fft_f64_cpx *tmpbuf = NULL;
+static size_t ntmpbuf = 0;
+
+#define CHECKBUF(buf,nbuf,n) \
+ do { \
+ if ( nbuf < (size_t)(n) ) {\
+ free(buf); \
+ buf = (kiss_fft_f64_cpx*)KISS_FFT_F64_MALLOC(sizeof(kiss_fft_f64_cpx)*(n)); \
+ nbuf = (size_t)(n); \
+ } \
+ }while(0)
+
+
+static void
+kf_bfly2 (kiss_fft_f64_cpx * Fout,
+ const size_t fstride, const kiss_fft_f64_cfg st, int m)
+{
+ kiss_fft_f64_cpx *Fout2;
+ kiss_fft_f64_cpx *tw1 = st->twiddles;
+ kiss_fft_f64_cpx t;
+
+ Fout2 = Fout + m;
+ do {
+ C_FIXDIV (*Fout, 2);
+ C_FIXDIV (*Fout2, 2);
+
+ C_MUL (t, *Fout2, *tw1);
+ tw1 += fstride;
+ C_SUB (*Fout2, *Fout, t);
+ C_ADDTO (*Fout, t);
+ ++Fout2;
+ ++Fout;
+ } while (--m);
+}
+
+static void
+kf_bfly4 (kiss_fft_f64_cpx * Fout,
+ const size_t fstride, const kiss_fft_f64_cfg st, const size_t m)
+{
+ kiss_fft_f64_cpx *tw1, *tw2, *tw3;
+ kiss_fft_f64_cpx scratch[6];
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ const size_t m3 = 3 * m;
+
+ tw3 = tw2 = tw1 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 4);
+ C_FIXDIV (Fout[m], 4);
+ C_FIXDIV (Fout[m2], 4);
+ C_FIXDIV (Fout[m3], 4);
+
+ C_MUL (scratch[0], Fout[m], *tw1);
+ C_MUL (scratch[1], Fout[m2], *tw2);
+ C_MUL (scratch[2], Fout[m3], *tw3);
+
+ C_SUB (scratch[5], *Fout, scratch[1]);
+ C_ADDTO (*Fout, scratch[1]);
+ C_ADD (scratch[3], scratch[0], scratch[2]);
+ C_SUB (scratch[4], scratch[0], scratch[2]);
+ C_SUB (Fout[m2], *Fout, scratch[3]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+ tw3 += fstride * 3;
+ C_ADDTO (*Fout, scratch[3]);
+
+ if (st->inverse) {
+ Fout[m].r = scratch[5].r - scratch[4].i;
+ Fout[m].i = scratch[5].i + scratch[4].r;
+ Fout[m3].r = scratch[5].r + scratch[4].i;
+ Fout[m3].i = scratch[5].i - scratch[4].r;
+ } else {
+ Fout[m].r = scratch[5].r + scratch[4].i;
+ Fout[m].i = scratch[5].i - scratch[4].r;
+ Fout[m3].r = scratch[5].r - scratch[4].i;
+ Fout[m3].i = scratch[5].i + scratch[4].r;
+ }
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly3 (kiss_fft_f64_cpx * Fout,
+ const size_t fstride, const kiss_fft_f64_cfg st, size_t m)
+{
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ kiss_fft_f64_cpx *tw1, *tw2;
+ kiss_fft_f64_cpx scratch[5];
+ kiss_fft_f64_cpx epi3;
+
+ epi3 = st->twiddles[fstride * m];
+
+ tw1 = tw2 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 3);
+ C_FIXDIV (Fout[m], 3);
+ C_FIXDIV (Fout[m2], 3);
+
+ C_MUL (scratch[1], Fout[m], *tw1);
+ C_MUL (scratch[2], Fout[m2], *tw2);
+
+ C_ADD (scratch[3], scratch[1], scratch[2]);
+ C_SUB (scratch[0], scratch[1], scratch[2]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+
+ Fout[m].r = Fout->r - HALF_OF (scratch[3].r);
+ Fout[m].i = Fout->i - HALF_OF (scratch[3].i);
+
+ C_MULBYSCALAR (scratch[0], epi3.i);
+
+ C_ADDTO (*Fout, scratch[3]);
+
+ Fout[m2].r = Fout[m].r + scratch[0].i;
+ Fout[m2].i = Fout[m].i - scratch[0].r;
+
+ Fout[m].r -= scratch[0].i;
+ Fout[m].i += scratch[0].r;
+
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly5 (kiss_fft_f64_cpx * Fout,
+ const size_t fstride, const kiss_fft_f64_cfg st, int m)
+{
+ kiss_fft_f64_cpx *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
+ int u;
+ kiss_fft_f64_cpx scratch[13];
+ kiss_fft_f64_cpx *twiddles = st->twiddles;
+ kiss_fft_f64_cpx *tw;
+ kiss_fft_f64_cpx ya, yb;
+
+ ya = twiddles[fstride * m];
+ yb = twiddles[fstride * 2 * m];
+
+ Fout0 = Fout;
+ Fout1 = Fout0 + m;
+ Fout2 = Fout0 + 2 * m;
+ Fout3 = Fout0 + 3 * m;
+ Fout4 = Fout0 + 4 * m;
+
+ tw = st->twiddles;
+ for (u = 0; u < m; ++u) {
+ C_FIXDIV (*Fout0, 5);
+ C_FIXDIV (*Fout1, 5);
+ C_FIXDIV (*Fout2, 5);
+ C_FIXDIV (*Fout3, 5);
+ C_FIXDIV (*Fout4, 5);
+ scratch[0] = *Fout0;
+
+ C_MUL (scratch[1], *Fout1, tw[u * fstride]);
+ C_MUL (scratch[2], *Fout2, tw[2 * u * fstride]);
+ C_MUL (scratch[3], *Fout3, tw[3 * u * fstride]);
+ C_MUL (scratch[4], *Fout4, tw[4 * u * fstride]);
+
+ C_ADD (scratch[7], scratch[1], scratch[4]);
+ C_SUB (scratch[10], scratch[1], scratch[4]);
+ C_ADD (scratch[8], scratch[2], scratch[3]);
+ C_SUB (scratch[9], scratch[2], scratch[3]);
+
+ Fout0->r += scratch[7].r + scratch[8].r;
+ Fout0->i += scratch[7].i + scratch[8].i;
+
+ scratch[5].r =
+ scratch[0].r + S_MUL (scratch[7].r, ya.r) + S_MUL (scratch[8].r, yb.r);
+ scratch[5].i =
+ scratch[0].i + S_MUL (scratch[7].i, ya.r) + S_MUL (scratch[8].i, yb.r);
+
+ scratch[6].r = S_MUL (scratch[10].i, ya.i) + S_MUL (scratch[9].i, yb.i);
+ scratch[6].i = -S_MUL (scratch[10].r, ya.i) - S_MUL (scratch[9].r, yb.i);
+
+ C_SUB (*Fout1, scratch[5], scratch[6]);
+ C_ADD (*Fout4, scratch[5], scratch[6]);
+
+ scratch[11].r =
+ scratch[0].r + S_MUL (scratch[7].r, yb.r) + S_MUL (scratch[8].r, ya.r);
+ scratch[11].i =
+ scratch[0].i + S_MUL (scratch[7].i, yb.r) + S_MUL (scratch[8].i, ya.r);
+ scratch[12].r = -S_MUL (scratch[10].i, yb.i) + S_MUL (scratch[9].i, ya.i);
+ scratch[12].i = S_MUL (scratch[10].r, yb.i) - S_MUL (scratch[9].r, ya.i);
+
+ C_ADD (*Fout2, scratch[11], scratch[12]);
+ C_SUB (*Fout3, scratch[11], scratch[12]);
+
+ ++Fout0;
+ ++Fout1;
+ ++Fout2;
+ ++Fout3;
+ ++Fout4;
+ }
+}
+
+/* perform the butterfly for one stage of a mixed radix FFT */
+static void
+kf_bfly_generic (kiss_fft_f64_cpx * Fout,
+ const size_t fstride, const kiss_fft_f64_cfg st, int m, int p)
+{
+ int u, k, q1, q;
+ kiss_fft_f64_cpx *twiddles = st->twiddles;
+ kiss_fft_f64_cpx t;
+ int Norig = st->nfft;
+
+ CHECKBUF (scratchbuf, nscratchbuf, p);
+
+ for (u = 0; u < m; ++u) {
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ scratchbuf[q1] = Fout[k];
+ C_FIXDIV (scratchbuf[q1], p);
+ k += m;
+ }
+
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ int twidx = 0;
+
+ Fout[k] = scratchbuf[0];
+ for (q = 1; q < p; ++q) {
+ twidx += fstride * k;
+ if (twidx >= Norig)
+ twidx -= Norig;
+ C_MUL (t, scratchbuf[q], twiddles[twidx]);
+ C_ADDTO (Fout[k], t);
+ }
+ k += m;
+ }
+ }
+}
+
+static void
+kf_work (kiss_fft_f64_cpx * Fout,
+ const kiss_fft_f64_cpx * f,
+ const size_t fstride,
+ int in_stride, int *factors, const kiss_fft_f64_cfg st)
+{
+ kiss_fft_f64_cpx *Fout_beg = Fout;
+ const int p = *factors++; /* the radix */
+ const int m = *factors++; /* stage's fft length/p */
+ const kiss_fft_f64_cpx *Fout_end = Fout + p * m;
+
+#ifdef _OPENMP
+ // use openmp extensions at the
+ // top-level (not recursive)
+ if (fstride == 1) {
+ int k;
+
+ // execute the p different work units in different threads
+# pragma omp parallel for
+ for (k = 0; k < p; ++k)
+ kf_work (Fout + k * m, f + fstride * in_stride * k, fstride * p,
+ in_stride, factors, st);
+ // all threads have joined by this point
+
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+ return;
+ }
+#endif
+
+ if (m == 1) {
+ do {
+ *Fout = *f;
+ f += fstride * in_stride;
+ } while (++Fout != Fout_end);
+ } else {
+ do {
+ // recursive call:
+ // DFT of size m*p performed by doing
+ // p instances of smaller DFTs of size m,
+ // each one takes a decimated version of the input
+ kf_work (Fout, f, fstride * p, in_stride, factors, st);
+ f += fstride * in_stride;
+ } while ((Fout += m) != Fout_end);
+ }
+
+ Fout = Fout_beg;
+
+ // recombine the p smaller DFTs
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+}
+
+/* facbuf is populated by p1,m1,p2,m2, ...
+ where
+ p[i] * m[i] = m[i-1]
+ m0 = n */
+static void
+kf_factor (int n, int *facbuf)
+{
+ int p = 4;
+ double floor_sqrt;
+
+ floor_sqrt = floor (sqrt ((double) n));
+
+ /*factor out powers of 4, powers of 2, then any remaining primes */
+ do {
+ while (n % p) {
+ switch (p) {
+ case 4:
+ p = 2;
+ break;
+ case 2:
+ p = 3;
+ break;
+ default:
+ p += 2;
+ break;
+ }
+ if (p > floor_sqrt)
+ p = n; /* no more factors, skip to end */
+ }
+ n /= p;
+ *facbuf++ = p;
+ *facbuf++ = n;
+ } while (n > 1);
+}
+
+/*
+ *
+ * User-callable function to allocate all necessary storage space for the fft.
+ *
+ * The return value is a contiguous block of memory, allocated with malloc. As such,
+ * It can be freed with free(), rather than a kiss_fft-specific function.
+ * */
+kiss_fft_f64_cfg
+kiss_fft_f64_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ kiss_fft_f64_cfg st = NULL;
+ const double pi =
+ 3.141592653589793238462643383279502884197169399375105820974944;
+ size_t memneeded = sizeof (struct kiss_fft_f64_state)
+ + sizeof (kiss_fft_f64_cpx) * (nfft - 1); /* twiddle factors */
+
+ if (lenmem == NULL) {
+ st = (kiss_fft_f64_cfg) KISS_FFT_F64_MALLOC (memneeded);
+ } else {
+ if (mem != NULL && *lenmem >= memneeded)
+ st = (kiss_fft_f64_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (st) {
+ int i;
+
+ st->nfft = nfft;
+ st->inverse = inverse_fft;
+
+ for (i = 0; i < nfft; ++i) {
+ double phase = -2 * pi * i / nfft;
+
+ if (st->inverse)
+ phase *= -1;
+ kf_cexp (st->twiddles + i, phase);
+ }
+
+ kf_factor (nfft, st->factors);
+ }
+ return st;
+}
+
+
+
+
+void
+kiss_fft_f64_stride (kiss_fft_f64_cfg st, const kiss_fft_f64_cpx * fin,
+ kiss_fft_f64_cpx * fout, int in_stride)
+{
+ if (fin == fout) {
+ CHECKBUF (tmpbuf, ntmpbuf, st->nfft);
+ kf_work (tmpbuf, fin, 1, in_stride, st->factors, st);
+ memcpy (fout, tmpbuf, sizeof (kiss_fft_f64_cpx) * st->nfft);
+ } else {
+ kf_work (fout, fin, 1, in_stride, st->factors, st);
+ }
+}
+
+void
+kiss_fft_f64 (kiss_fft_f64_cfg cfg, const kiss_fft_f64_cpx * fin,
+ kiss_fft_f64_cpx * fout)
+{
+ kiss_fft_f64_stride (cfg, fin, fout, 1);
+}
+
+
+/* not really necessary to call, but if someone is doing in-place ffts, they may want to free the
+ buffers from CHECKBUF
+ */
+void
+kiss_fft_f64_cleanup (void)
+{
+ free (scratchbuf);
+ scratchbuf = NULL;
+ nscratchbuf = 0;
+ free (tmpbuf);
+ tmpbuf = NULL;
+ ntmpbuf = 0;
+}
+
+int
+kiss_fft_f64_next_fast_size (int n)
+{
+ while (1) {
+ int m = n;
+
+ while ((m % 2) == 0)
+ m /= 2;
+ while ((m % 3) == 0)
+ m /= 3;
+ while ((m % 5) == 0)
+ m /= 5;
+ if (m <= 1)
+ break; /* n is completely factorable by twos, threes, and fives */
+ n++;
+ }
+ return n;
+}
diff --git a/gst-libs/gst/fft/kiss_fft_f64.h b/gst-libs/gst/fft/kiss_fft_f64.h
new file mode 100644
index 0000000..90792bb
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_f64.h
@@ -0,0 +1,103 @@
+#ifndef KISS_FFT_F64_H
+#define KISS_FFT_F64_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ ATTENTION!
+ If you would like a :
+ -- a utility that will handle the caching of fft objects
+ -- real-only (no imaginary time component ) FFT
+ -- a multi-dimensional FFT
+ -- a command-line utility to perform ffts
+ -- a command-line utility to perform fast-convolution filtering
+
+ Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c
+ in the tools/ directory.
+*/
+
+#define KISS_FFT_F64_MALLOC g_malloc
+#define kiss_fft_f64_scalar double
+
+typedef struct {
+ kiss_fft_f64_scalar r;
+ kiss_fft_f64_scalar i;
+}kiss_fft_f64_cpx;
+
+typedef struct kiss_fft_f64_state* kiss_fft_f64_cfg;
+
+/*
+ * kiss_fft_f64_alloc
+ *
+ * Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
+ *
+ * typical usage: kiss_fft_f64_cfg mycfg=kiss_fft_f64_alloc(1024,0,NULL,NULL);
+ *
+ * The return value from fft_alloc is a cfg buffer used internally
+ * by the fft routine or NULL.
+ *
+ * If lenmem is NULL, then kiss_fft_f64_alloc will allocate a cfg buffer using malloc.
+ * The returned value should be free()d when done to avoid memory leaks.
+ *
+ * The state can be placed in a user supplied buffer 'mem':
+ * If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
+ * then the function places the cfg in mem and the size used in *lenmem
+ * and returns mem.
+ *
+ * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
+ * then the function returns NULL and places the minimum cfg
+ * buffer size in *lenmem.
+ * */
+
+kiss_fft_f64_cfg kiss_fft_f64_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem);
+
+/*
+ * kiss_fft(cfg,in_out_buf)
+ *
+ * Perform an FFT on a complex input buffer.
+ * for a forward FFT,
+ * fin should be f[0] , f[1] , ... ,f[nfft-1]
+ * fout will be F[0] , F[1] , ... ,F[nfft-1]
+ * Note that each element is complex and can be accessed like
+ f[k].r and f[k].i
+ * */
+void kiss_fft_f64(kiss_fft_f64_cfg cfg,const kiss_fft_f64_cpx *fin,kiss_fft_f64_cpx *fout);
+
+/*
+ A more generic version of the above function. It reads its input from every Nth sample.
+ * */
+void kiss_fft_f64_stride(kiss_fft_f64_cfg cfg,const kiss_fft_f64_cpx *fin,kiss_fft_f64_cpx *fout,int fin_stride);
+
+/* If kiss_fft_f64_alloc allocated a buffer, it is one contiguous
+ buffer and can be simply free()d when no longer needed*/
+#define kiss_fft_f64_free g_free
+
+/*
+ Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up
+ your compiler output to call this before you exit.
+*/
+void kiss_fft_f64_cleanup(void);
+
+
+/*
+ * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5)
+ */
+int kiss_fft_f64_next_fast_size(int n);
+
+/* for real ffts, we need an even size */
+#define kiss_fftr_next_fast_size_real(n) \
+ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gst-libs/gst/fft/kiss_fft_s16.c b/gst-libs/gst/fft/kiss_fft_s16.c
new file mode 100644
index 0000000..ee2de4e
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_s16.c
@@ -0,0 +1,472 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+
+#include "_kiss_fft_guts_s16.h"
+/* The guts header contains all the multiplication and addition macros that are defined for
+ fixed or floating point complex numbers. It also delares the kf_ internal functions.
+ */
+
+static kiss_fft_s16_cpx *scratchbuf = NULL;
+static size_t nscratchbuf = 0;
+static kiss_fft_s16_cpx *tmpbuf = NULL;
+static size_t ntmpbuf = 0;
+
+#define CHECKBUF(buf,nbuf,n) \
+ do { \
+ if ( nbuf < (size_t)(n) ) {\
+ free(buf); \
+ buf = (kiss_fft_s16_cpx*)KISS_FFT_S16_MALLOC(sizeof(kiss_fft_s16_cpx)*(n)); \
+ nbuf = (size_t)(n); \
+ } \
+ }while(0)
+
+
+static void
+kf_bfly2 (kiss_fft_s16_cpx * Fout,
+ const size_t fstride, const kiss_fft_s16_cfg st, int m)
+{
+ kiss_fft_s16_cpx *Fout2;
+ kiss_fft_s16_cpx *tw1 = st->twiddles;
+ kiss_fft_s16_cpx t;
+
+ Fout2 = Fout + m;
+ do {
+ C_FIXDIV (*Fout, 2);
+ C_FIXDIV (*Fout2, 2);
+
+ C_MUL (t, *Fout2, *tw1);
+ tw1 += fstride;
+ C_SUB (*Fout2, *Fout, t);
+ C_ADDTO (*Fout, t);
+ ++Fout2;
+ ++Fout;
+ } while (--m);
+}
+
+static void
+kf_bfly4 (kiss_fft_s16_cpx * Fout,
+ const size_t fstride, const kiss_fft_s16_cfg st, const size_t m)
+{
+ kiss_fft_s16_cpx *tw1, *tw2, *tw3;
+ kiss_fft_s16_cpx scratch[6];
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ const size_t m3 = 3 * m;
+
+ tw3 = tw2 = tw1 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 4);
+ C_FIXDIV (Fout[m], 4);
+ C_FIXDIV (Fout[m2], 4);
+ C_FIXDIV (Fout[m3], 4);
+
+ C_MUL (scratch[0], Fout[m], *tw1);
+ C_MUL (scratch[1], Fout[m2], *tw2);
+ C_MUL (scratch[2], Fout[m3], *tw3);
+
+ C_SUB (scratch[5], *Fout, scratch[1]);
+ C_ADDTO (*Fout, scratch[1]);
+ C_ADD (scratch[3], scratch[0], scratch[2]);
+ C_SUB (scratch[4], scratch[0], scratch[2]);
+ C_SUB (Fout[m2], *Fout, scratch[3]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+ tw3 += fstride * 3;
+ C_ADDTO (*Fout, scratch[3]);
+
+ if (st->inverse) {
+ Fout[m].r = scratch[5].r - scratch[4].i;
+ Fout[m].i = scratch[5].i + scratch[4].r;
+ Fout[m3].r = scratch[5].r + scratch[4].i;
+ Fout[m3].i = scratch[5].i - scratch[4].r;
+ } else {
+ Fout[m].r = scratch[5].r + scratch[4].i;
+ Fout[m].i = scratch[5].i - scratch[4].r;
+ Fout[m3].r = scratch[5].r - scratch[4].i;
+ Fout[m3].i = scratch[5].i + scratch[4].r;
+ }
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly3 (kiss_fft_s16_cpx * Fout,
+ const size_t fstride, const kiss_fft_s16_cfg st, size_t m)
+{
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ kiss_fft_s16_cpx *tw1, *tw2;
+ kiss_fft_s16_cpx scratch[5];
+ kiss_fft_s16_cpx epi3;
+
+ epi3 = st->twiddles[fstride * m];
+
+ tw1 = tw2 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 3);
+ C_FIXDIV (Fout[m], 3);
+ C_FIXDIV (Fout[m2], 3);
+
+ C_MUL (scratch[1], Fout[m], *tw1);
+ C_MUL (scratch[2], Fout[m2], *tw2);
+
+ C_ADD (scratch[3], scratch[1], scratch[2]);
+ C_SUB (scratch[0], scratch[1], scratch[2]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+
+ Fout[m].r = Fout->r - HALF_OF (scratch[3].r);
+ Fout[m].i = Fout->i - HALF_OF (scratch[3].i);
+
+ C_MULBYSCALAR (scratch[0], epi3.i);
+
+ C_ADDTO (*Fout, scratch[3]);
+
+ Fout[m2].r = Fout[m].r + scratch[0].i;
+ Fout[m2].i = Fout[m].i - scratch[0].r;
+
+ Fout[m].r -= scratch[0].i;
+ Fout[m].i += scratch[0].r;
+
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly5 (kiss_fft_s16_cpx * Fout,
+ const size_t fstride, const kiss_fft_s16_cfg st, int m)
+{
+ kiss_fft_s16_cpx *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
+ int u;
+ kiss_fft_s16_cpx scratch[13];
+ kiss_fft_s16_cpx *twiddles = st->twiddles;
+ kiss_fft_s16_cpx *tw;
+ kiss_fft_s16_cpx ya, yb;
+
+ ya = twiddles[fstride * m];
+ yb = twiddles[fstride * 2 * m];
+
+ Fout0 = Fout;
+ Fout1 = Fout0 + m;
+ Fout2 = Fout0 + 2 * m;
+ Fout3 = Fout0 + 3 * m;
+ Fout4 = Fout0 + 4 * m;
+
+ tw = st->twiddles;
+ for (u = 0; u < m; ++u) {
+ C_FIXDIV (*Fout0, 5);
+ C_FIXDIV (*Fout1, 5);
+ C_FIXDIV (*Fout2, 5);
+ C_FIXDIV (*Fout3, 5);
+ C_FIXDIV (*Fout4, 5);
+ scratch[0] = *Fout0;
+
+ C_MUL (scratch[1], *Fout1, tw[u * fstride]);
+ C_MUL (scratch[2], *Fout2, tw[2 * u * fstride]);
+ C_MUL (scratch[3], *Fout3, tw[3 * u * fstride]);
+ C_MUL (scratch[4], *Fout4, tw[4 * u * fstride]);
+
+ C_ADD (scratch[7], scratch[1], scratch[4]);
+ C_SUB (scratch[10], scratch[1], scratch[4]);
+ C_ADD (scratch[8], scratch[2], scratch[3]);
+ C_SUB (scratch[9], scratch[2], scratch[3]);
+
+ Fout0->r += scratch[7].r + scratch[8].r;
+ Fout0->i += scratch[7].i + scratch[8].i;
+
+ scratch[5].r =
+ scratch[0].r + S_MUL (scratch[7].r, ya.r) + S_MUL (scratch[8].r, yb.r);
+ scratch[5].i =
+ scratch[0].i + S_MUL (scratch[7].i, ya.r) + S_MUL (scratch[8].i, yb.r);
+
+ scratch[6].r = S_MUL (scratch[10].i, ya.i) + S_MUL (scratch[9].i, yb.i);
+ scratch[6].i = -S_MUL (scratch[10].r, ya.i) - S_MUL (scratch[9].r, yb.i);
+
+ C_SUB (*Fout1, scratch[5], scratch[6]);
+ C_ADD (*Fout4, scratch[5], scratch[6]);
+
+ scratch[11].r =
+ scratch[0].r + S_MUL (scratch[7].r, yb.r) + S_MUL (scratch[8].r, ya.r);
+ scratch[11].i =
+ scratch[0].i + S_MUL (scratch[7].i, yb.r) + S_MUL (scratch[8].i, ya.r);
+ scratch[12].r = -S_MUL (scratch[10].i, yb.i) + S_MUL (scratch[9].i, ya.i);
+ scratch[12].i = S_MUL (scratch[10].r, yb.i) - S_MUL (scratch[9].r, ya.i);
+
+ C_ADD (*Fout2, scratch[11], scratch[12]);
+ C_SUB (*Fout3, scratch[11], scratch[12]);
+
+ ++Fout0;
+ ++Fout1;
+ ++Fout2;
+ ++Fout3;
+ ++Fout4;
+ }
+}
+
+/* perform the butterfly for one stage of a mixed radix FFT */
+static void
+kf_bfly_generic (kiss_fft_s16_cpx * Fout,
+ const size_t fstride, const kiss_fft_s16_cfg st, int m, int p)
+{
+ int u, k, q1, q;
+ kiss_fft_s16_cpx *twiddles = st->twiddles;
+ kiss_fft_s16_cpx t;
+ int Norig = st->nfft;
+
+ CHECKBUF (scratchbuf, nscratchbuf, p);
+
+ for (u = 0; u < m; ++u) {
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ scratchbuf[q1] = Fout[k];
+ C_FIXDIV (scratchbuf[q1], p);
+ k += m;
+ }
+
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ int twidx = 0;
+
+ Fout[k] = scratchbuf[0];
+ for (q = 1; q < p; ++q) {
+ twidx += fstride * k;
+ if (twidx >= Norig)
+ twidx -= Norig;
+ C_MUL (t, scratchbuf[q], twiddles[twidx]);
+ C_ADDTO (Fout[k], t);
+ }
+ k += m;
+ }
+ }
+}
+
+static void
+kf_work (kiss_fft_s16_cpx * Fout,
+ const kiss_fft_s16_cpx * f,
+ const size_t fstride,
+ int in_stride, int *factors, const kiss_fft_s16_cfg st)
+{
+ kiss_fft_s16_cpx *Fout_beg = Fout;
+ const int p = *factors++; /* the radix */
+ const int m = *factors++; /* stage's fft length/p */
+ const kiss_fft_s16_cpx *Fout_end = Fout + p * m;
+
+#ifdef _OPENMP
+ // use openmp extensions at the
+ // top-level (not recursive)
+ if (fstride == 1) {
+ int k;
+
+ // execute the p different work units in different threads
+# pragma omp parallel for
+ for (k = 0; k < p; ++k)
+ kf_work (Fout + k * m, f + fstride * in_stride * k, fstride * p,
+ in_stride, factors, st);
+ // all threads have joined by this point
+
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+ return;
+ }
+#endif
+
+ if (m == 1) {
+ do {
+ *Fout = *f;
+ f += fstride * in_stride;
+ } while (++Fout != Fout_end);
+ } else {
+ do {
+ // recursive call:
+ // DFT of size m*p performed by doing
+ // p instances of smaller DFTs of size m,
+ // each one takes a decimated version of the input
+ kf_work (Fout, f, fstride * p, in_stride, factors, st);
+ f += fstride * in_stride;
+ } while ((Fout += m) != Fout_end);
+ }
+
+ Fout = Fout_beg;
+
+ // recombine the p smaller DFTs
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+}
+
+/* facbuf is populated by p1,m1,p2,m2, ...
+ where
+ p[i] * m[i] = m[i-1]
+ m0 = n */
+static void
+kf_factor (int n, int *facbuf)
+{
+ int p = 4;
+ double floor_sqrt;
+
+ floor_sqrt = floor (sqrt ((double) n));
+
+ /*factor out powers of 4, powers of 2, then any remaining primes */
+ do {
+ while (n % p) {
+ switch (p) {
+ case 4:
+ p = 2;
+ break;
+ case 2:
+ p = 3;
+ break;
+ default:
+ p += 2;
+ break;
+ }
+ if (p > floor_sqrt)
+ p = n; /* no more factors, skip to end */
+ }
+ n /= p;
+ *facbuf++ = p;
+ *facbuf++ = n;
+ } while (n > 1);
+}
+
+/*
+ *
+ * User-callable function to allocate all necessary storage space for the fft.
+ *
+ * The return value is a contiguous block of memory, allocated with malloc. As such,
+ * It can be freed with free(), rather than a kiss_fft-specific function.
+ * */
+kiss_fft_s16_cfg
+kiss_fft_s16_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ kiss_fft_s16_cfg st = NULL;
+ size_t memneeded = sizeof (struct kiss_fft_s16_state)
+ + sizeof (kiss_fft_s16_cpx) * (nfft - 1); /* twiddle factors */
+
+ if (lenmem == NULL) {
+ st = (kiss_fft_s16_cfg) KISS_FFT_S16_MALLOC (memneeded);
+ } else {
+ if (mem != NULL && *lenmem >= memneeded)
+ st = (kiss_fft_s16_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (st) {
+ int i;
+
+ st->nfft = nfft;
+ st->inverse = inverse_fft;
+
+ for (i = 0; i < nfft; ++i) {
+ const double pi =
+ 3.141592653589793238462643383279502884197169399375105820974944;
+ double phase = -2 * pi * i / nfft;
+
+ if (st->inverse)
+ phase *= -1;
+ kf_cexp (st->twiddles + i, phase);
+ }
+
+ kf_factor (nfft, st->factors);
+ }
+ return st;
+}
+
+
+
+
+void
+kiss_fft_s16_stride (kiss_fft_s16_cfg st, const kiss_fft_s16_cpx * fin,
+ kiss_fft_s16_cpx * fout, int in_stride)
+{
+ if (fin == fout) {
+ CHECKBUF (tmpbuf, ntmpbuf, st->nfft);
+ kf_work (tmpbuf, fin, 1, in_stride, st->factors, st);
+ memcpy (fout, tmpbuf, sizeof (kiss_fft_s16_cpx) * st->nfft);
+ } else {
+ kf_work (fout, fin, 1, in_stride, st->factors, st);
+ }
+}
+
+void
+kiss_fft_s16 (kiss_fft_s16_cfg cfg, const kiss_fft_s16_cpx * fin,
+ kiss_fft_s16_cpx * fout)
+{
+ kiss_fft_s16_stride (cfg, fin, fout, 1);
+}
+
+
+/* not really necessary to call, but if someone is doing in-place ffts, they may want to free the
+ buffers from CHECKBUF
+ */
+void
+kiss_fft_s16_cleanup (void)
+{
+ free (scratchbuf);
+ scratchbuf = NULL;
+ nscratchbuf = 0;
+ free (tmpbuf);
+ tmpbuf = NULL;
+ ntmpbuf = 0;
+}
+
+int
+kiss_fft_s16_next_fast_size (int n)
+{
+ while (1) {
+ int m = n;
+
+ while ((m % 2) == 0)
+ m /= 2;
+ while ((m % 3) == 0)
+ m /= 3;
+ while ((m % 5) == 0)
+ m /= 5;
+ if (m <= 1)
+ break; /* n is completely factorable by twos, threes, and fives */
+ n++;
+ }
+ return n;
+}
diff --git a/gst-libs/gst/fft/kiss_fft_s16.h b/gst-libs/gst/fft/kiss_fft_s16.h
new file mode 100644
index 0000000..4303127
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_s16.h
@@ -0,0 +1,106 @@
+#ifndef KISS_FFT_S16_H
+#define KISS_FFT_S16_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ ATTENTION!
+ If you would like a :
+ -- a utility that will handle the caching of fft objects
+ -- real-only (no imaginary time component ) FFT
+ -- a multi-dimensional FFT
+ -- a command-line utility to perform ffts
+ -- a command-line utility to perform fast-convolution filtering
+
+ Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c
+ in the tools/ directory.
+*/
+
+#define KISS_FFT_S16_MALLOC g_malloc
+
+#include "_stdint.h"
+
+#define kiss_fft_s16_scalar int16_t
+
+typedef struct {
+ kiss_fft_s16_scalar r;
+ kiss_fft_s16_scalar i;
+}kiss_fft_s16_cpx;
+
+typedef struct kiss_fft_s16_state* kiss_fft_s16_cfg;
+
+/*
+ * kiss_fft_s16_alloc
+ *
+ * Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
+ *
+ * typical usage: kiss_fft_s16_cfg mycfg=kiss_fft_s16_alloc(1024,0,NULL,NULL);
+ *
+ * The return value from fft_alloc is a cfg buffer used internally
+ * by the fft routine or NULL.
+ *
+ * If lenmem is NULL, then kiss_fft_s16_alloc will allocate a cfg buffer using malloc.
+ * The returned value should be free()d when done to avoid memory leaks.
+ *
+ * The state can be placed in a user supplied buffer 'mem':
+ * If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
+ * then the function places the cfg in mem and the size used in *lenmem
+ * and returns mem.
+ *
+ * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
+ * then the function returns NULL and places the minimum cfg
+ * buffer size in *lenmem.
+ * */
+
+kiss_fft_s16_cfg kiss_fft_s16_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem);
+
+/*
+ * kiss_fft(cfg,in_out_buf)
+ *
+ * Perform an FFT on a complex input buffer.
+ * for a forward FFT,
+ * fin should be f[0] , f[1] , ... ,f[nfft-1]
+ * fout will be F[0] , F[1] , ... ,F[nfft-1]
+ * Note that each element is complex and can be accessed like
+ f[k].r and f[k].i
+ * */
+void kiss_fft_s16(kiss_fft_s16_cfg cfg,const kiss_fft_s16_cpx *fin,kiss_fft_s16_cpx *fout);
+
+/*
+ A more generic version of the above function. It reads its input from every Nth sample.
+ * */
+void kiss_fft_s16_stride(kiss_fft_s16_cfg cfg,const kiss_fft_s16_cpx *fin,kiss_fft_s16_cpx *fout,int fin_stride);
+
+/* If kiss_fft_s16_alloc allocated a buffer, it is one contiguous
+ buffer and can be simply free()d when no longer needed*/
+#define kiss_fft_s16_free g_free
+
+/*
+ Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up
+ your compiler output to call this before you exit.
+*/
+void kiss_fft_s16_cleanup(void);
+
+
+/*
+ * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5)
+ */
+int kiss_fft_s16_next_fast_size(int n);
+
+/* for real ffts, we need an even size */
+#define kiss_fftr_next_fast_size_real(n) \
+ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gst-libs/gst/fft/kiss_fft_s32.c b/gst-libs/gst/fft/kiss_fft_s32.c
new file mode 100644
index 0000000..5acb2ed
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_s32.c
@@ -0,0 +1,472 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+
+#include "_kiss_fft_guts_s32.h"
+/* The guts header contains all the multiplication and addition macros that are defined for
+ fixed or floating point complex numbers. It also delares the kf_ internal functions.
+ */
+
+static kiss_fft_s32_cpx *scratchbuf = NULL;
+static size_t nscratchbuf = 0;
+static kiss_fft_s32_cpx *tmpbuf = NULL;
+static size_t ntmpbuf = 0;
+
+#define CHECKBUF(buf,nbuf,n) \
+ do { \
+ if ( nbuf < (size_t)(n) ) {\
+ free(buf); \
+ buf = (kiss_fft_s32_cpx*)KISS_FFT_S32_MALLOC(sizeof(kiss_fft_s32_cpx)*(n)); \
+ nbuf = (size_t)(n); \
+ } \
+ }while(0)
+
+
+static void
+kf_bfly2 (kiss_fft_s32_cpx * Fout,
+ const size_t fstride, const kiss_fft_s32_cfg st, int m)
+{
+ kiss_fft_s32_cpx *Fout2;
+ kiss_fft_s32_cpx *tw1 = st->twiddles;
+ kiss_fft_s32_cpx t;
+
+ Fout2 = Fout + m;
+ do {
+ C_FIXDIV (*Fout, 2);
+ C_FIXDIV (*Fout2, 2);
+
+ C_MUL (t, *Fout2, *tw1);
+ tw1 += fstride;
+ C_SUB (*Fout2, *Fout, t);
+ C_ADDTO (*Fout, t);
+ ++Fout2;
+ ++Fout;
+ } while (--m);
+}
+
+static void
+kf_bfly4 (kiss_fft_s32_cpx * Fout,
+ const size_t fstride, const kiss_fft_s32_cfg st, const size_t m)
+{
+ kiss_fft_s32_cpx *tw1, *tw2, *tw3;
+ kiss_fft_s32_cpx scratch[6];
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ const size_t m3 = 3 * m;
+
+ tw3 = tw2 = tw1 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 4);
+ C_FIXDIV (Fout[m], 4);
+ C_FIXDIV (Fout[m2], 4);
+ C_FIXDIV (Fout[m3], 4);
+
+ C_MUL (scratch[0], Fout[m], *tw1);
+ C_MUL (scratch[1], Fout[m2], *tw2);
+ C_MUL (scratch[2], Fout[m3], *tw3);
+
+ C_SUB (scratch[5], *Fout, scratch[1]);
+ C_ADDTO (*Fout, scratch[1]);
+ C_ADD (scratch[3], scratch[0], scratch[2]);
+ C_SUB (scratch[4], scratch[0], scratch[2]);
+ C_SUB (Fout[m2], *Fout, scratch[3]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+ tw3 += fstride * 3;
+ C_ADDTO (*Fout, scratch[3]);
+
+ if (st->inverse) {
+ Fout[m].r = scratch[5].r - scratch[4].i;
+ Fout[m].i = scratch[5].i + scratch[4].r;
+ Fout[m3].r = scratch[5].r + scratch[4].i;
+ Fout[m3].i = scratch[5].i - scratch[4].r;
+ } else {
+ Fout[m].r = scratch[5].r + scratch[4].i;
+ Fout[m].i = scratch[5].i - scratch[4].r;
+ Fout[m3].r = scratch[5].r - scratch[4].i;
+ Fout[m3].i = scratch[5].i + scratch[4].r;
+ }
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly3 (kiss_fft_s32_cpx * Fout,
+ const size_t fstride, const kiss_fft_s32_cfg st, size_t m)
+{
+ size_t k = m;
+ const size_t m2 = 2 * m;
+ kiss_fft_s32_cpx *tw1, *tw2;
+ kiss_fft_s32_cpx scratch[5];
+ kiss_fft_s32_cpx epi3;
+
+ epi3 = st->twiddles[fstride * m];
+
+ tw1 = tw2 = st->twiddles;
+
+ do {
+ C_FIXDIV (*Fout, 3);
+ C_FIXDIV (Fout[m], 3);
+ C_FIXDIV (Fout[m2], 3);
+
+ C_MUL (scratch[1], Fout[m], *tw1);
+ C_MUL (scratch[2], Fout[m2], *tw2);
+
+ C_ADD (scratch[3], scratch[1], scratch[2]);
+ C_SUB (scratch[0], scratch[1], scratch[2]);
+ tw1 += fstride;
+ tw2 += fstride * 2;
+
+ Fout[m].r = Fout->r - HALF_OF (scratch[3].r);
+ Fout[m].i = Fout->i - HALF_OF (scratch[3].i);
+
+ C_MULBYSCALAR (scratch[0], epi3.i);
+
+ C_ADDTO (*Fout, scratch[3]);
+
+ Fout[m2].r = Fout[m].r + scratch[0].i;
+ Fout[m2].i = Fout[m].i - scratch[0].r;
+
+ Fout[m].r -= scratch[0].i;
+ Fout[m].i += scratch[0].r;
+
+ ++Fout;
+ } while (--k);
+}
+
+static void
+kf_bfly5 (kiss_fft_s32_cpx * Fout,
+ const size_t fstride, const kiss_fft_s32_cfg st, int m)
+{
+ kiss_fft_s32_cpx *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
+ int u;
+ kiss_fft_s32_cpx scratch[13];
+ kiss_fft_s32_cpx *twiddles = st->twiddles;
+ kiss_fft_s32_cpx *tw;
+ kiss_fft_s32_cpx ya, yb;
+
+ ya = twiddles[fstride * m];
+ yb = twiddles[fstride * 2 * m];
+
+ Fout0 = Fout;
+ Fout1 = Fout0 + m;
+ Fout2 = Fout0 + 2 * m;
+ Fout3 = Fout0 + 3 * m;
+ Fout4 = Fout0 + 4 * m;
+
+ tw = st->twiddles;
+ for (u = 0; u < m; ++u) {
+ C_FIXDIV (*Fout0, 5);
+ C_FIXDIV (*Fout1, 5);
+ C_FIXDIV (*Fout2, 5);
+ C_FIXDIV (*Fout3, 5);
+ C_FIXDIV (*Fout4, 5);
+ scratch[0] = *Fout0;
+
+ C_MUL (scratch[1], *Fout1, tw[u * fstride]);
+ C_MUL (scratch[2], *Fout2, tw[2 * u * fstride]);
+ C_MUL (scratch[3], *Fout3, tw[3 * u * fstride]);
+ C_MUL (scratch[4], *Fout4, tw[4 * u * fstride]);
+
+ C_ADD (scratch[7], scratch[1], scratch[4]);
+ C_SUB (scratch[10], scratch[1], scratch[4]);
+ C_ADD (scratch[8], scratch[2], scratch[3]);
+ C_SUB (scratch[9], scratch[2], scratch[3]);
+
+ Fout0->r += scratch[7].r + scratch[8].r;
+ Fout0->i += scratch[7].i + scratch[8].i;
+
+ scratch[5].r =
+ scratch[0].r + S_MUL (scratch[7].r, ya.r) + S_MUL (scratch[8].r, yb.r);
+ scratch[5].i =
+ scratch[0].i + S_MUL (scratch[7].i, ya.r) + S_MUL (scratch[8].i, yb.r);
+
+ scratch[6].r = S_MUL (scratch[10].i, ya.i) + S_MUL (scratch[9].i, yb.i);
+ scratch[6].i = -S_MUL (scratch[10].r, ya.i) - S_MUL (scratch[9].r, yb.i);
+
+ C_SUB (*Fout1, scratch[5], scratch[6]);
+ C_ADD (*Fout4, scratch[5], scratch[6]);
+
+ scratch[11].r =
+ scratch[0].r + S_MUL (scratch[7].r, yb.r) + S_MUL (scratch[8].r, ya.r);
+ scratch[11].i =
+ scratch[0].i + S_MUL (scratch[7].i, yb.r) + S_MUL (scratch[8].i, ya.r);
+ scratch[12].r = -S_MUL (scratch[10].i, yb.i) + S_MUL (scratch[9].i, ya.i);
+ scratch[12].i = S_MUL (scratch[10].r, yb.i) - S_MUL (scratch[9].r, ya.i);
+
+ C_ADD (*Fout2, scratch[11], scratch[12]);
+ C_SUB (*Fout3, scratch[11], scratch[12]);
+
+ ++Fout0;
+ ++Fout1;
+ ++Fout2;
+ ++Fout3;
+ ++Fout4;
+ }
+}
+
+/* perform the butterfly for one stage of a mixed radix FFT */
+static void
+kf_bfly_generic (kiss_fft_s32_cpx * Fout,
+ const size_t fstride, const kiss_fft_s32_cfg st, int m, int p)
+{
+ int u, k, q1, q;
+ kiss_fft_s32_cpx *twiddles = st->twiddles;
+ kiss_fft_s32_cpx t;
+ int Norig = st->nfft;
+
+ CHECKBUF (scratchbuf, nscratchbuf, p);
+
+ for (u = 0; u < m; ++u) {
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ scratchbuf[q1] = Fout[k];
+ C_FIXDIV (scratchbuf[q1], p);
+ k += m;
+ }
+
+ k = u;
+ for (q1 = 0; q1 < p; ++q1) {
+ int twidx = 0;
+
+ Fout[k] = scratchbuf[0];
+ for (q = 1; q < p; ++q) {
+ twidx += fstride * k;
+ if (twidx >= Norig)
+ twidx -= Norig;
+ C_MUL (t, scratchbuf[q], twiddles[twidx]);
+ C_ADDTO (Fout[k], t);
+ }
+ k += m;
+ }
+ }
+}
+
+static void
+kf_work (kiss_fft_s32_cpx * Fout,
+ const kiss_fft_s32_cpx * f,
+ const size_t fstride,
+ int in_stride, int *factors, const kiss_fft_s32_cfg st)
+{
+ kiss_fft_s32_cpx *Fout_beg = Fout;
+ const int p = *factors++; /* the radix */
+ const int m = *factors++; /* stage's fft length/p */
+ const kiss_fft_s32_cpx *Fout_end = Fout + p * m;
+
+#ifdef _OPENMP
+ // use openmp extensions at the
+ // top-level (not recursive)
+ if (fstride == 1) {
+ int k;
+
+ // execute the p different work units in different threads
+# pragma omp parallel for
+ for (k = 0; k < p; ++k)
+ kf_work (Fout + k * m, f + fstride * in_stride * k, fstride * p,
+ in_stride, factors, st);
+ // all threads have joined by this point
+
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+ return;
+ }
+#endif
+
+ if (m == 1) {
+ do {
+ *Fout = *f;
+ f += fstride * in_stride;
+ } while (++Fout != Fout_end);
+ } else {
+ do {
+ // recursive call:
+ // DFT of size m*p performed by doing
+ // p instances of smaller DFTs of size m,
+ // each one takes a decimated version of the input
+ kf_work (Fout, f, fstride * p, in_stride, factors, st);
+ f += fstride * in_stride;
+ } while ((Fout += m) != Fout_end);
+ }
+
+ Fout = Fout_beg;
+
+ // recombine the p smaller DFTs
+ switch (p) {
+ case 2:
+ kf_bfly2 (Fout, fstride, st, m);
+ break;
+ case 3:
+ kf_bfly3 (Fout, fstride, st, m);
+ break;
+ case 4:
+ kf_bfly4 (Fout, fstride, st, m);
+ break;
+ case 5:
+ kf_bfly5 (Fout, fstride, st, m);
+ break;
+ default:
+ kf_bfly_generic (Fout, fstride, st, m, p);
+ break;
+ }
+}
+
+/* facbuf is populated by p1,m1,p2,m2, ...
+ where
+ p[i] * m[i] = m[i-1]
+ m0 = n */
+static void
+kf_factor (int n, int *facbuf)
+{
+ int p = 4;
+ double floor_sqrt;
+
+ floor_sqrt = floor (sqrt ((double) n));
+
+ /*factor out powers of 4, powers of 2, then any remaining primes */
+ do {
+ while (n % p) {
+ switch (p) {
+ case 4:
+ p = 2;
+ break;
+ case 2:
+ p = 3;
+ break;
+ default:
+ p += 2;
+ break;
+ }
+ if (p > floor_sqrt)
+ p = n; /* no more factors, skip to end */
+ }
+ n /= p;
+ *facbuf++ = p;
+ *facbuf++ = n;
+ } while (n > 1);
+}
+
+/*
+ *
+ * User-callable function to allocate all necessary storage space for the fft.
+ *
+ * The return value is a contiguous block of memory, allocated with malloc. As such,
+ * It can be freed with free(), rather than a kiss_fft-specific function.
+ * */
+kiss_fft_s32_cfg
+kiss_fft_s32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ kiss_fft_s32_cfg st = NULL;
+ size_t memneeded = sizeof (struct kiss_fft_s32_state)
+ + sizeof (kiss_fft_s32_cpx) * (nfft - 1); /* twiddle factors */
+
+ if (lenmem == NULL) {
+ st = (kiss_fft_s32_cfg) KISS_FFT_S32_MALLOC (memneeded);
+ } else {
+ if (mem != NULL && *lenmem >= memneeded)
+ st = (kiss_fft_s32_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (st) {
+ int i;
+
+ st->nfft = nfft;
+ st->inverse = inverse_fft;
+
+ for (i = 0; i < nfft; ++i) {
+ const double pi =
+ 3.141592653589793238462643383279502884197169399375105820974944;
+ double phase = -2 * pi * i / nfft;
+
+ if (st->inverse)
+ phase *= -1;
+ kf_cexp (st->twiddles + i, phase);
+ }
+
+ kf_factor (nfft, st->factors);
+ }
+ return st;
+}
+
+
+
+
+void
+kiss_fft_s32_stride (kiss_fft_s32_cfg st, const kiss_fft_s32_cpx * fin,
+ kiss_fft_s32_cpx * fout, int in_stride)
+{
+ if (fin == fout) {
+ CHECKBUF (tmpbuf, ntmpbuf, st->nfft);
+ kf_work (tmpbuf, fin, 1, in_stride, st->factors, st);
+ memcpy (fout, tmpbuf, sizeof (kiss_fft_s32_cpx) * st->nfft);
+ } else {
+ kf_work (fout, fin, 1, in_stride, st->factors, st);
+ }
+}
+
+void
+kiss_fft_s32 (kiss_fft_s32_cfg cfg, const kiss_fft_s32_cpx * fin,
+ kiss_fft_s32_cpx * fout)
+{
+ kiss_fft_s32_stride (cfg, fin, fout, 1);
+}
+
+
+/* not really necessary to call, but if someone is doing in-place ffts, they may want to free the
+ buffers from CHECKBUF
+ */
+void
+kiss_fft_s32_cleanup (void)
+{
+ free (scratchbuf);
+ scratchbuf = NULL;
+ nscratchbuf = 0;
+ free (tmpbuf);
+ tmpbuf = NULL;
+ ntmpbuf = 0;
+}
+
+int
+kiss_fft_s32_next_fast_size (int n)
+{
+ while (1) {
+ int m = n;
+
+ while ((m % 2) == 0)
+ m /= 2;
+ while ((m % 3) == 0)
+ m /= 3;
+ while ((m % 5) == 0)
+ m /= 5;
+ if (m <= 1)
+ break; /* n is completely factorable by twos, threes, and fives */
+ n++;
+ }
+ return n;
+}
diff --git a/gst-libs/gst/fft/kiss_fft_s32.h b/gst-libs/gst/fft/kiss_fft_s32.h
new file mode 100644
index 0000000..8edd664
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fft_s32.h
@@ -0,0 +1,107 @@
+#ifndef KISS_FFT_S32_H
+#define KISS_FFT_S32_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ ATTENTION!
+ If you would like a :
+ -- a utility that will handle the caching of fft objects
+ -- real-only (no imaginary time component ) FFT
+ -- a multi-dimensional FFT
+ -- a command-line utility to perform ffts
+ -- a command-line utility to perform fast-convolution filtering
+
+ Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c
+ in the tools/ directory.
+*/
+
+#define KISS_FFT_S32_MALLOC g_malloc
+
+
+#include "_stdint.h"
+
+#define kiss_fft_s32_scalar int32_t
+
+typedef struct {
+ kiss_fft_s32_scalar r;
+ kiss_fft_s32_scalar i;
+}kiss_fft_s32_cpx;
+
+typedef struct kiss_fft_s32_state* kiss_fft_s32_cfg;
+
+/*
+ * kiss_fft_s32_alloc
+ *
+ * Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
+ *
+ * typical usage: kiss_fft_s32_cfg mycfg=kiss_fft_s32_alloc(1024,0,NULL,NULL);
+ *
+ * The return value from fft_alloc is a cfg buffer used internally
+ * by the fft routine or NULL.
+ *
+ * If lenmem is NULL, then kiss_fft_s32_alloc will allocate a cfg buffer using malloc.
+ * The returned value should be free()d when done to avoid memory leaks.
+ *
+ * The state can be placed in a user supplied buffer 'mem':
+ * If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
+ * then the function places the cfg in mem and the size used in *lenmem
+ * and returns mem.
+ *
+ * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
+ * then the function returns NULL and places the minimum cfg
+ * buffer size in *lenmem.
+ * */
+
+kiss_fft_s32_cfg kiss_fft_s32_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem);
+
+/*
+ * kiss_fft(cfg,in_out_buf)
+ *
+ * Perform an FFT on a complex input buffer.
+ * for a forward FFT,
+ * fin should be f[0] , f[1] , ... ,f[nfft-1]
+ * fout will be F[0] , F[1] , ... ,F[nfft-1]
+ * Note that each element is complex and can be accessed like
+ f[k].r and f[k].i
+ * */
+void kiss_fft_s32(kiss_fft_s32_cfg cfg,const kiss_fft_s32_cpx *fin,kiss_fft_s32_cpx *fout);
+
+/*
+ A more generic version of the above function. It reads its input from every Nth sample.
+ * */
+void kiss_fft_s32_stride(kiss_fft_s32_cfg cfg,const kiss_fft_s32_cpx *fin,kiss_fft_s32_cpx *fout,int fin_stride);
+
+/* If kiss_fft_s32_alloc allocated a buffer, it is one contiguous
+ buffer and can be simply free()d when no longer needed*/
+#define kiss_fft_s32_free g_free
+
+/*
+ Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up
+ your compiler output to call this before you exit.
+*/
+void kiss_fft_s32_cleanup(void);
+
+
+/*
+ * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5)
+ */
+int kiss_fft_s32_next_fast_size(int n);
+
+/* for real ffts, we need an even size */
+#define kiss_fftr_next_fast_size_real(n) \
+ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gst-libs/gst/fft/kiss_fftr_f32.c b/gst-libs/gst/fft/kiss_fftr_f32.c
new file mode 100644
index 0000000..ab11c04
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_f32.c
@@ -0,0 +1,169 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+#include "kiss_fftr_f32.h"
+#include "_kiss_fft_guts_f32.h"
+
+struct kiss_fftr_f32_state
+{
+ kiss_fft_f32_cfg substate;
+ kiss_fft_f32_cpx *tmpbuf;
+ kiss_fft_f32_cpx *super_twiddles;
+#ifdef USE_SIMD
+ long pad;
+#endif
+};
+
+kiss_fftr_f32_cfg
+kiss_fftr_f32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ int i;
+ kiss_fftr_f32_cfg st = NULL;
+ size_t subsize, memneeded;
+
+ if (nfft & 1) {
+ fprintf (stderr, "Real FFT optimization must be even.\n");
+ return NULL;
+ }
+ nfft >>= 1;
+
+ kiss_fft_f32_alloc (nfft, inverse_fft, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state))
+ + ALIGN_STRUCT (subsize) + sizeof (kiss_fft_f32_cpx) * (nfft * 3 / 2);
+
+ if (lenmem == NULL) {
+ st = (kiss_fftr_f32_cfg) KISS_FFT_F32_MALLOC (memneeded);
+ } else {
+ if (*lenmem >= memneeded)
+ st = (kiss_fftr_f32_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (!st)
+ return NULL;
+
+ st->substate = (kiss_fft_f32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state))); /*just beyond kiss_fftr_f32_state struct */
+ st->tmpbuf =
+ (kiss_fft_f32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
+ st->super_twiddles = st->tmpbuf + nfft;
+ kiss_fft_f32_alloc (nfft, inverse_fft, st->substate, &subsize);
+
+ for (i = 0; i < nfft / 2; ++i) {
+ double phase =
+ -3.14159265358979323846264338327 * ((double) (i + 1) / nfft + .5);
+
+ if (inverse_fft)
+ phase *= -1;
+ kf_cexp (st->super_twiddles + i, phase);
+ }
+ return st;
+}
+
+void
+kiss_fftr_f32 (kiss_fftr_f32_cfg st, const kiss_fft_f32_scalar * timedata,
+ kiss_fft_f32_cpx * freqdata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+ kiss_fft_f32_cpx fpnk, fpk, f1k, f2k, tw, tdc;
+
+ if (st->substate->inverse) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ /*perform the parallel fft of two real signals packed in real,imag */
+ kiss_fft_f32 (st->substate, (const kiss_fft_f32_cpx *) timedata, st->tmpbuf);
+ /* The real part of the DC element of the frequency spectrum in st->tmpbuf
+ * contains the sum of the even-numbered elements of the input time sequence
+ * The imag part is the sum of the odd-numbered elements
+ *
+ * The sum of tdc.r and tdc.i is the sum of the input time sequence.
+ * yielding DC of input time sequence
+ * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1...
+ * yielding Nyquist bin of input time sequence
+ */
+
+ tdc.r = st->tmpbuf[0].r;
+ tdc.i = st->tmpbuf[0].i;
+ C_FIXDIV (tdc, 2);
+ CHECK_OVERFLOW_OP (tdc.r, +, tdc.i);
+ CHECK_OVERFLOW_OP (tdc.r, -, tdc.i);
+ freqdata[0].r = tdc.r + tdc.i;
+ freqdata[ncfft].r = tdc.r - tdc.i;
+#ifdef USE_SIMD
+ freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps (0);
+#else
+ freqdata[ncfft].i = freqdata[0].i = 0;
+#endif
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ fpk = st->tmpbuf[k];
+ fpnk.r = st->tmpbuf[ncfft - k].r;
+ fpnk.i = -st->tmpbuf[ncfft - k].i;
+ C_FIXDIV (fpk, 2);
+ C_FIXDIV (fpnk, 2);
+
+ C_ADD (f1k, fpk, fpnk);
+ C_SUB (f2k, fpk, fpnk);
+ C_MUL (tw, f2k, st->super_twiddles[k - 1]);
+
+ freqdata[k].r = HALF_OF (f1k.r + tw.r);
+ freqdata[k].i = HALF_OF (f1k.i + tw.i);
+ freqdata[ncfft - k].r = HALF_OF (f1k.r - tw.r);
+ freqdata[ncfft - k].i = HALF_OF (tw.i - f1k.i);
+ }
+}
+
+void
+kiss_fftri_f32 (kiss_fftr_f32_cfg st, const kiss_fft_f32_cpx * freqdata,
+ kiss_fft_f32_scalar * timedata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+
+ if (st->substate->inverse == 0) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r;
+ st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r;
+ C_FIXDIV (st->tmpbuf[0], 2);
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ kiss_fft_f32_cpx fk, fnkc, fek, fok, tmp;
+
+ fk = freqdata[k];
+ fnkc.r = freqdata[ncfft - k].r;
+ fnkc.i = -freqdata[ncfft - k].i;
+ C_FIXDIV (fk, 2);
+ C_FIXDIV (fnkc, 2);
+
+ C_ADD (fek, fk, fnkc);
+ C_SUB (tmp, fk, fnkc);
+ C_MUL (fok, tmp, st->super_twiddles[k - 1]);
+ C_ADD (st->tmpbuf[k], fek, fok);
+ C_SUB (st->tmpbuf[ncfft - k], fek, fok);
+#ifdef USE_SIMD
+ st->tmpbuf[ncfft - k].i *= _mm_set1_ps (-1.0);
+#else
+ st->tmpbuf[ncfft - k].i *= -1;
+#endif
+ }
+ kiss_fft_f32 (st->substate, st->tmpbuf, (kiss_fft_f32_cpx *) timedata);
+}
diff --git a/gst-libs/gst/fft/kiss_fftr_f32.h b/gst-libs/gst/fft/kiss_fftr_f32.h
new file mode 100644
index 0000000..91f2085
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_f32.h
@@ -0,0 +1,46 @@
+#ifndef KISS_FTR_F32_H
+#define KISS_FTR_F32_H
+
+#include "kiss_fft_f32.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+
+ Real optimized version can save about 45% cpu time vs. complex fft of a real seq.
+
+
+
+ */
+
+typedef struct kiss_fftr_f32_state *kiss_fftr_f32_cfg;
+
+
+kiss_fftr_f32_cfg kiss_fftr_f32_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem);
+/*
+ nfft must be even
+
+ If you don't care to allocate space, use mem = lenmem = NULL
+*/
+
+
+void kiss_fftr_f32(kiss_fftr_f32_cfg cfg,const kiss_fft_f32_scalar *timedata,kiss_fft_f32_cpx *freqdata);
+/*
+ input timedata has nfft scalar points
+ output freqdata has nfft/2+1 complex points
+*/
+
+void kiss_fftri_f32(kiss_fftr_f32_cfg cfg,const kiss_fft_f32_cpx *freqdata,kiss_fft_f32_scalar *timedata);
+/*
+ input freqdata has nfft/2+1 complex points
+ output timedata has nfft scalar points
+*/
+
+#define kiss_fftr_f32_free free
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gst-libs/gst/fft/kiss_fftr_f64.c b/gst-libs/gst/fft/kiss_fftr_f64.c
new file mode 100644
index 0000000..740be27
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_f64.c
@@ -0,0 +1,170 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+#include "kiss_fftr_f64.h"
+#include "_kiss_fft_guts_f64.h"
+
+struct kiss_fftr_f64_state
+{
+ kiss_fft_f64_cfg substate;
+ kiss_fft_f64_cpx *tmpbuf;
+ kiss_fft_f64_cpx *super_twiddles;
+#ifdef USE_SIMD
+ long pad;
+#endif
+};
+
+kiss_fftr_f64_cfg
+kiss_fftr_f64_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ int i;
+ kiss_fftr_f64_cfg st = NULL;
+ size_t subsize, memneeded;
+
+ if (nfft & 1) {
+ fprintf (stderr, "Real FFT optimization must be even.\n");
+ return NULL;
+ }
+ nfft >>= 1;
+
+ kiss_fft_f64_alloc (nfft, inverse_fft, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state))
+ + ALIGN_STRUCT (subsize)
+ + sizeof (kiss_fft_f64_cpx) * (nfft * 3 / 2);
+
+ if (lenmem == NULL) {
+ st = (kiss_fftr_f64_cfg) KISS_FFT_F64_MALLOC (memneeded);
+ } else {
+ if (*lenmem >= memneeded)
+ st = (kiss_fftr_f64_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (!st)
+ return NULL;
+
+ st->substate = (kiss_fft_f64_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state))); /*just beyond kiss_fftr_f64_state struct */
+ st->tmpbuf =
+ (kiss_fft_f64_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
+ st->super_twiddles = st->tmpbuf + nfft;
+ kiss_fft_f64_alloc (nfft, inverse_fft, st->substate, &subsize);
+
+ for (i = 0; i < nfft / 2; ++i) {
+ double phase =
+ -3.14159265358979323846264338327 * ((double) (i + 1) / nfft + .5);
+
+ if (inverse_fft)
+ phase *= -1;
+ kf_cexp (st->super_twiddles + i, phase);
+ }
+ return st;
+}
+
+void
+kiss_fftr_f64 (kiss_fftr_f64_cfg st, const kiss_fft_f64_scalar * timedata,
+ kiss_fft_f64_cpx * freqdata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+ kiss_fft_f64_cpx fpnk, fpk, f1k, f2k, tw, tdc;
+
+ if (st->substate->inverse) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ /*perform the parallel fft of two real signals packed in real,imag */
+ kiss_fft_f64 (st->substate, (const kiss_fft_f64_cpx *) timedata, st->tmpbuf);
+ /* The real part of the DC element of the frequency spectrum in st->tmpbuf
+ * contains the sum of the even-numbered elements of the input time sequence
+ * The imag part is the sum of the odd-numbered elements
+ *
+ * The sum of tdc.r and tdc.i is the sum of the input time sequence.
+ * yielding DC of input time sequence
+ * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1...
+ * yielding Nyquist bin of input time sequence
+ */
+
+ tdc.r = st->tmpbuf[0].r;
+ tdc.i = st->tmpbuf[0].i;
+ C_FIXDIV (tdc, 2);
+ CHECK_OVERFLOW_OP (tdc.r, +, tdc.i);
+ CHECK_OVERFLOW_OP (tdc.r, -, tdc.i);
+ freqdata[0].r = tdc.r + tdc.i;
+ freqdata[ncfft].r = tdc.r - tdc.i;
+#ifdef USE_SIMD
+ freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps (0);
+#else
+ freqdata[ncfft].i = freqdata[0].i = 0;
+#endif
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ fpk = st->tmpbuf[k];
+ fpnk.r = st->tmpbuf[ncfft - k].r;
+ fpnk.i = -st->tmpbuf[ncfft - k].i;
+ C_FIXDIV (fpk, 2);
+ C_FIXDIV (fpnk, 2);
+
+ C_ADD (f1k, fpk, fpnk);
+ C_SUB (f2k, fpk, fpnk);
+ C_MUL (tw, f2k, st->super_twiddles[k - 1]);
+
+ freqdata[k].r = HALF_OF (f1k.r + tw.r);
+ freqdata[k].i = HALF_OF (f1k.i + tw.i);
+ freqdata[ncfft - k].r = HALF_OF (f1k.r - tw.r);
+ freqdata[ncfft - k].i = HALF_OF (tw.i - f1k.i);
+ }
+}
+
+void
+kiss_fftri_f64 (kiss_fftr_f64_cfg st, const kiss_fft_f64_cpx * freqdata,
+ kiss_fft_f64_scalar * timedata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+
+ if (st->substate->inverse == 0) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r;
+ st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r;
+ C_FIXDIV (st->tmpbuf[0], 2);
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ kiss_fft_f64_cpx fk, fnkc, fek, fok, tmp;
+
+ fk = freqdata[k];
+ fnkc.r = freqdata[ncfft - k].r;
+ fnkc.i = -freqdata[ncfft - k].i;
+ C_FIXDIV (fk, 2);
+ C_FIXDIV (fnkc, 2);
+
+ C_ADD (fek, fk, fnkc);
+ C_SUB (tmp, fk, fnkc);
+ C_MUL (fok, tmp, st->super_twiddles[k - 1]);
+ C_ADD (st->tmpbuf[k], fek, fok);
+ C_SUB (st->tmpbuf[ncfft - k], fek, fok);
+#ifdef USE_SIMD
+ st->tmpbuf[ncfft - k].i *= _mm_set1_ps (-1.0);
+#else
+ st->tmpbuf[ncfft - k].i *= -1;
+#endif
+ }
+ kiss_fft_f64 (st->substate, st->tmpbuf, (kiss_fft_f64_cpx *) timedata);
+}
diff --git a/gst-libs/gst/fft/kiss_fftr_f64.h b/gst-libs/gst/fft/kiss_fftr_f64.h
new file mode 100644
index 0000000..0b35cb6
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_f64.h
@@ -0,0 +1,46 @@
+#ifndef KISS_FTR_F64_H
+#define KISS_FTR_F64_H
+
+#include "kiss_fft_f64.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+
+ Real optimized version can save about 45% cpu time vs. complex fft of a real seq.
+
+
+
+ */
+
+typedef struct kiss_fftr_f64_state *kiss_fftr_f64_cfg;
+
+
+kiss_fftr_f64_cfg kiss_fftr_f64_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem);
+/*
+ nfft must be even
+
+ If you don't care to allocate space, use mem = lenmem = NULL
+*/
+
+
+void kiss_fftr_f64(kiss_fftr_f64_cfg cfg,const kiss_fft_f64_scalar *timedata,kiss_fft_f64_cpx *freqdata);
+/*
+ input timedata has nfft scalar points
+ output freqdata has nfft/2+1 complex points
+*/
+
+void kiss_fftri_f64(kiss_fftr_f64_cfg cfg,const kiss_fft_f64_cpx *freqdata,kiss_fft_f64_scalar *timedata);
+/*
+ input freqdata has nfft/2+1 complex points
+ output timedata has nfft scalar points
+*/
+
+#define kiss_fftr_f64_free free
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gst-libs/gst/fft/kiss_fftr_s16.c b/gst-libs/gst/fft/kiss_fftr_s16.c
new file mode 100644
index 0000000..f1ec990
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_s16.c
@@ -0,0 +1,170 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+#include "kiss_fftr_s16.h"
+#include "_kiss_fft_guts_s16.h"
+
+struct kiss_fftr_s16_state
+{
+ kiss_fft_s16_cfg substate;
+ kiss_fft_s16_cpx *tmpbuf;
+ kiss_fft_s16_cpx *super_twiddles;
+#ifdef USE_SIMD
+ long pad;
+#endif
+};
+
+kiss_fftr_s16_cfg
+kiss_fftr_s16_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ int i;
+ kiss_fftr_s16_cfg st = NULL;
+ size_t subsize, memneeded;
+
+ if (nfft & 1) {
+ fprintf (stderr, "Real FFT optimization must be even.\n");
+ return NULL;
+ }
+ nfft >>= 1;
+
+ kiss_fft_s16_alloc (nfft, inverse_fft, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state))
+ + ALIGN_STRUCT (subsize)
+ + sizeof (kiss_fft_s16_cpx) * (nfft * 3 / 2);
+
+ if (lenmem == NULL) {
+ st = (kiss_fftr_s16_cfg) KISS_FFT_S16_MALLOC (memneeded);
+ } else {
+ if (*lenmem >= memneeded)
+ st = (kiss_fftr_s16_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (!st)
+ return NULL;
+
+ st->substate = (kiss_fft_s16_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state))); /*just beyond kiss_fftr_s16_state struct */
+ st->tmpbuf =
+ (kiss_fft_s16_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
+ st->super_twiddles = st->tmpbuf + nfft;
+ kiss_fft_s16_alloc (nfft, inverse_fft, st->substate, &subsize);
+
+ for (i = 0; i < nfft / 2; ++i) {
+ double phase =
+ -3.14159265358979323846264338327 * ((double) (i + 1) / nfft + .5);
+
+ if (inverse_fft)
+ phase *= -1;
+ kf_cexp (st->super_twiddles + i, phase);
+ }
+ return st;
+}
+
+void
+kiss_fftr_s16 (kiss_fftr_s16_cfg st, const kiss_fft_s16_scalar * timedata,
+ kiss_fft_s16_cpx * freqdata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+ kiss_fft_s16_cpx fpnk, fpk, f1k, f2k, tw, tdc;
+
+ if (st->substate->inverse) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ /*perform the parallel fft of two real signals packed in real,imag */
+ kiss_fft_s16 (st->substate, (const kiss_fft_s16_cpx *) timedata, st->tmpbuf);
+ /* The real part of the DC element of the frequency spectrum in st->tmpbuf
+ * contains the sum of the even-numbered elements of the input time sequence
+ * The imag part is the sum of the odd-numbered elements
+ *
+ * The sum of tdc.r and tdc.i is the sum of the input time sequence.
+ * yielding DC of input time sequence
+ * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1...
+ * yielding Nyquist bin of input time sequence
+ */
+
+ tdc.r = st->tmpbuf[0].r;
+ tdc.i = st->tmpbuf[0].i;
+ C_FIXDIV (tdc, 2);
+ CHECK_OVERFLOW_OP (tdc.r, +, tdc.i);
+ CHECK_OVERFLOW_OP (tdc.r, -, tdc.i);
+ freqdata[0].r = tdc.r + tdc.i;
+ freqdata[ncfft].r = tdc.r - tdc.i;
+#ifdef USE_SIMD
+ freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps (0);
+#else
+ freqdata[ncfft].i = freqdata[0].i = 0;
+#endif
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ fpk = st->tmpbuf[k];
+ fpnk.r = st->tmpbuf[ncfft - k].r;
+ fpnk.i = -st->tmpbuf[ncfft - k].i;
+ C_FIXDIV (fpk, 2);
+ C_FIXDIV (fpnk, 2);
+
+ C_ADD (f1k, fpk, fpnk);
+ C_SUB (f2k, fpk, fpnk);
+ C_MUL (tw, f2k, st->super_twiddles[k - 1]);
+
+ freqdata[k].r = HALF_OF (f1k.r + tw.r);
+ freqdata[k].i = HALF_OF (f1k.i + tw.i);
+ freqdata[ncfft - k].r = HALF_OF (f1k.r - tw.r);
+ freqdata[ncfft - k].i = HALF_OF (tw.i - f1k.i);
+ }
+}
+
+void
+kiss_fftri_s16 (kiss_fftr_s16_cfg st, const kiss_fft_s16_cpx * freqdata,
+ kiss_fft_s16_scalar * timedata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+
+ if (st->substate->inverse == 0) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r;
+ st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r;
+ C_FIXDIV (st->tmpbuf[0], 2);
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ kiss_fft_s16_cpx fk, fnkc, fek, fok, tmp;
+
+ fk = freqdata[k];
+ fnkc.r = freqdata[ncfft - k].r;
+ fnkc.i = -freqdata[ncfft - k].i;
+ C_FIXDIV (fk, 2);
+ C_FIXDIV (fnkc, 2);
+
+ C_ADD (fek, fk, fnkc);
+ C_SUB (tmp, fk, fnkc);
+ C_MUL (fok, tmp, st->super_twiddles[k - 1]);
+ C_ADD (st->tmpbuf[k], fek, fok);
+ C_SUB (st->tmpbuf[ncfft - k], fek, fok);
+#ifdef USE_SIMD
+ st->tmpbuf[ncfft - k].i *= _mm_set1_ps (-1.0);
+#else
+ st->tmpbuf[ncfft - k].i *= -1;
+#endif
+ }
+ kiss_fft_s16 (st->substate, st->tmpbuf, (kiss_fft_s16_cpx *) timedata);
+}
diff --git a/gst-libs/gst/fft/kiss_fftr_s16.h b/gst-libs/gst/fft/kiss_fftr_s16.h
new file mode 100644
index 0000000..20bc9ef
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_s16.h
@@ -0,0 +1,46 @@
+#ifndef KISS_FTR_S16_H
+#define KISS_FTR_S16_H
+
+#include "kiss_fft_s16.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+
+ Real optimized version can save about 45% cpu time vs. complex fft of a real seq.
+
+
+
+ */
+
+typedef struct kiss_fftr_s16_state *kiss_fftr_s16_cfg;
+
+
+kiss_fftr_s16_cfg kiss_fftr_s16_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem);
+/*
+ nfft must be even
+
+ If you don't care to allocate space, use mem = lenmem = NULL
+*/
+
+
+void kiss_fftr_s16(kiss_fftr_s16_cfg cfg,const kiss_fft_s16_scalar *timedata,kiss_fft_s16_cpx *freqdata);
+/*
+ input timedata has nfft scalar points
+ output freqdata has nfft/2+1 complex points
+*/
+
+void kiss_fftri_s16(kiss_fftr_s16_cfg cfg,const kiss_fft_s16_cpx *freqdata,kiss_fft_s16_scalar *timedata);
+/*
+ input freqdata has nfft/2+1 complex points
+ output timedata has nfft scalar points
+*/
+
+#define kiss_fftr_s16_free free
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gst-libs/gst/fft/kiss_fftr_s32.c b/gst-libs/gst/fft/kiss_fftr_s32.c
new file mode 100644
index 0000000..260da29
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_s32.c
@@ -0,0 +1,170 @@
+/*
+Copyright (c) 2003-2004, Mark Borgerding
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+*/
+
+#include "kiss_fftr_s32.h"
+#include "_kiss_fft_guts_s32.h"
+
+struct kiss_fftr_s32_state
+{
+ kiss_fft_s32_cfg substate;
+ kiss_fft_s32_cpx *tmpbuf;
+ kiss_fft_s32_cpx *super_twiddles;
+#ifdef USE_SIMD
+ long pad;
+#endif
+};
+
+kiss_fftr_s32_cfg
+kiss_fftr_s32_alloc (int nfft, int inverse_fft, void *mem, size_t * lenmem)
+{
+ int i;
+ kiss_fftr_s32_cfg st = NULL;
+ size_t subsize, memneeded;
+
+ if (nfft & 1) {
+ fprintf (stderr, "Real FFT optimization must be even.\n");
+ return NULL;
+ }
+ nfft >>= 1;
+
+ kiss_fft_s32_alloc (nfft, inverse_fft, NULL, &subsize);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state))
+ + ALIGN_STRUCT (subsize)
+ + sizeof (kiss_fft_s32_cpx) * (nfft * 3 / 2);
+
+ if (lenmem == NULL) {
+ st = (kiss_fftr_s32_cfg) KISS_FFT_S32_MALLOC (memneeded);
+ } else {
+ if (*lenmem >= memneeded)
+ st = (kiss_fftr_s32_cfg) mem;
+ *lenmem = memneeded;
+ }
+ if (!st)
+ return NULL;
+
+ st->substate = (kiss_fft_s32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state))); /*just beyond kiss_fftr_s32_state struct */
+ st->tmpbuf =
+ (kiss_fft_s32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
+ st->super_twiddles = st->tmpbuf + nfft;
+ kiss_fft_s32_alloc (nfft, inverse_fft, st->substate, &subsize);
+
+ for (i = 0; i < nfft / 2; ++i) {
+ double phase =
+ -3.14159265358979323846264338327 * ((double) (i + 1) / nfft + .5);
+
+ if (inverse_fft)
+ phase *= -1;
+ kf_cexp (st->super_twiddles + i, phase);
+ }
+ return st;
+}
+
+void
+kiss_fftr_s32 (kiss_fftr_s32_cfg st, const kiss_fft_s32_scalar * timedata,
+ kiss_fft_s32_cpx * freqdata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+ kiss_fft_s32_cpx fpnk, fpk, f1k, f2k, tw, tdc;
+
+ if (st->substate->inverse) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ /*perform the parallel fft of two real signals packed in real,imag */
+ kiss_fft_s32 (st->substate, (const kiss_fft_s32_cpx *) timedata, st->tmpbuf);
+ /* The real part of the DC element of the frequency spectrum in st->tmpbuf
+ * contains the sum of the even-numbered elements of the input time sequence
+ * The imag part is the sum of the odd-numbered elements
+ *
+ * The sum of tdc.r and tdc.i is the sum of the input time sequence.
+ * yielding DC of input time sequence
+ * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1...
+ * yielding Nyquist bin of input time sequence
+ */
+
+ tdc.r = st->tmpbuf[0].r;
+ tdc.i = st->tmpbuf[0].i;
+ C_FIXDIV (tdc, 2);
+ CHECK_OVERFLOW_OP (tdc.r, +, tdc.i);
+ CHECK_OVERFLOW_OP (tdc.r, -, tdc.i);
+ freqdata[0].r = tdc.r + tdc.i;
+ freqdata[ncfft].r = tdc.r - tdc.i;
+#ifdef USE_SIMD
+ freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps (0);
+#else
+ freqdata[ncfft].i = freqdata[0].i = 0;
+#endif
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ fpk = st->tmpbuf[k];
+ fpnk.r = st->tmpbuf[ncfft - k].r;
+ fpnk.i = -st->tmpbuf[ncfft - k].i;
+ C_FIXDIV (fpk, 2);
+ C_FIXDIV (fpnk, 2);
+
+ C_ADD (f1k, fpk, fpnk);
+ C_SUB (f2k, fpk, fpnk);
+ C_MUL (tw, f2k, st->super_twiddles[k - 1]);
+
+ freqdata[k].r = HALF_OF (f1k.r + tw.r);
+ freqdata[k].i = HALF_OF (f1k.i + tw.i);
+ freqdata[ncfft - k].r = HALF_OF (f1k.r - tw.r);
+ freqdata[ncfft - k].i = HALF_OF (tw.i - f1k.i);
+ }
+}
+
+void
+kiss_fftri_s32 (kiss_fftr_s32_cfg st, const kiss_fft_s32_cpx * freqdata,
+ kiss_fft_s32_scalar * timedata)
+{
+ /* input buffer timedata is stored row-wise */
+ int k, ncfft;
+
+ if (st->substate->inverse == 0) {
+ fprintf (stderr, "kiss fft usage error: improper alloc\n");
+ exit (1);
+ }
+
+ ncfft = st->substate->nfft;
+
+ st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r;
+ st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r;
+ C_FIXDIV (st->tmpbuf[0], 2);
+
+ for (k = 1; k <= ncfft / 2; ++k) {
+ kiss_fft_s32_cpx fk, fnkc, fek, fok, tmp;
+
+ fk = freqdata[k];
+ fnkc.r = freqdata[ncfft - k].r;
+ fnkc.i = -freqdata[ncfft - k].i;
+ C_FIXDIV (fk, 2);
+ C_FIXDIV (fnkc, 2);
+
+ C_ADD (fek, fk, fnkc);
+ C_SUB (tmp, fk, fnkc);
+ C_MUL (fok, tmp, st->super_twiddles[k - 1]);
+ C_ADD (st->tmpbuf[k], fek, fok);
+ C_SUB (st->tmpbuf[ncfft - k], fek, fok);
+#ifdef USE_SIMD
+ st->tmpbuf[ncfft - k].i *= _mm_set1_ps (-1.0);
+#else
+ st->tmpbuf[ncfft - k].i *= -1;
+#endif
+ }
+ kiss_fft_s32 (st->substate, st->tmpbuf, (kiss_fft_s32_cpx *) timedata);
+}
diff --git a/gst-libs/gst/fft/kiss_fftr_s32.h b/gst-libs/gst/fft/kiss_fftr_s32.h
new file mode 100644
index 0000000..8e8fecb
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_fftr_s32.h
@@ -0,0 +1,46 @@
+#ifndef KISS_FTR_S32_H
+#define KISS_FTR_S32_H
+
+#include "kiss_fft_s32.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+
+ Real optimized version can save about 45% cpu time vs. complex fft of a real seq.
+
+
+
+ */
+
+typedef struct kiss_fftr_s32_state *kiss_fftr_s32_cfg;
+
+
+kiss_fftr_s32_cfg kiss_fftr_s32_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem);
+/*
+ nfft must be even
+
+ If you don't care to allocate space, use mem = lenmem = NULL
+*/
+
+
+void kiss_fftr_s32(kiss_fftr_s32_cfg cfg,const kiss_fft_s32_scalar *timedata,kiss_fft_s32_cpx *freqdata);
+/*
+ input timedata has nfft scalar points
+ output freqdata has nfft/2+1 complex points
+*/
+
+void kiss_fftri_s32(kiss_fftr_s32_cfg cfg,const kiss_fft_s32_cpx *freqdata,kiss_fft_s32_scalar *timedata);
+/*
+ input freqdata has nfft/2+1 complex points
+ output timedata has nfft scalar points
+*/
+
+#define kiss_fftr_s32_free free
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gst-libs/gst/fft/kiss_version b/gst-libs/gst/fft/kiss_version
new file mode 100644
index 0000000..c55188b
--- /dev/null
+++ b/gst-libs/gst/fft/kiss_version
@@ -0,0 +1,4 @@
+Based on Kiss FFT version 1.2.6. http://kissfft.sourceforge.net
+
+Only changes are limitation to one data type for each version in
+kiss_fft.h and _kiss_fft_guts.h.
diff --git a/gst-libs/gst/gettext.h b/gst-libs/gst/gettext.h
new file mode 100644
index 0000000..727bdb0
--- /dev/null
+++ b/gst-libs/gst/gettext.h
@@ -0,0 +1,69 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ 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. */
+#if defined (ENABLE_NLS) && ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+#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 <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#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/gst-i18n-plugin.h b/gst-libs/gst/gst-i18n-plugin.h
new file mode 100644
index 0000000..2c37a61
--- /dev/null
+++ b/gst-libs/gst/gst-i18n-plugin.h
@@ -0,0 +1,37 @@
+/* GStreamer
+ * Copyright (C) 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * 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__
+
+#include <locale.h> /* some people need it and some people don't */
+#include "gettext.h" /* included with gettext distribution and copied */
+
+#ifndef GETTEXT_PACKAGE
+#error You must define GETTEXT_PACKAGE before including this header.
+#endif
+
+/* 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 */
+
+#endif /* __GST_I18N_PLUGIN_H__ */
diff --git a/gst-libs/gst/interfaces/Makefile.am b/gst-libs/gst/interfaces/Makefile.am
new file mode 100644
index 0000000..a661a03
--- /dev/null
+++ b/gst-libs/gst/interfaces/Makefile.am
@@ -0,0 +1,138 @@
+lib_LTLIBRARIES = libgstinterfaces-@GST_MAJORMINOR@.la
+libgstinterfacesincludedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/interfaces
+
+headers_interfaces = \
+ colorbalance.h \
+ colorbalancechannel.h \
+ mixer.h \
+ mixeroptions.h \
+ mixertrack.h \
+ navigation.h \
+ propertyprobe.h \
+ streamvolume.h \
+ tuner.h \
+ tunernorm.h \
+ tunerchannel.h \
+ videoorientation.h \
+ videooverlay.h
+
+# variables used for enum/marshal generation
+glib_enum_headers = $(headers_interfaces)
+glib_enum_define = GST_INTERFACES
+glib_gen_prefix = gst_interfaces
+glib_gen_basename = interfaces
+
+built_sources = \
+ interfaces-marshal.c \
+ interfaces-enumtypes.c
+
+built_headers = \
+ interfaces-marshal.h \
+ interfaces-enumtypes.h
+
+libgstinterfacesinclude_HEADERS = \
+ $(headers_interfaces)
+
+nodist_libgstinterfacesinclude_HEADERS = \
+ interfaces-enumtypes.h
+
+libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \
+ colorbalance.c \
+ colorbalancechannel.c \
+ mixer.c \
+ mixeroptions.c \
+ mixertrack.c \
+ navigation.c \
+ propertyprobe.c \
+ streamvolume.c \
+ tuner.c \
+ tunernorm.c \
+ tunerchannel.c \
+ videoorientation.c \
+ videooverlay.c
+
+nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \
+ $(built_sources) \
+ interfaces-marshal.h
+
+libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstinterfaces_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(LIBM)
+libgstinterfaces_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+BUILT_SOURCES = \
+ $(built_sources) \
+ $(built_headers)
+
+EXTRA_DIST = interfaces-marshal.list
+
+CLEANFILES = $(BUILT_SOURCES)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstInterfaces-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstinterfacesinclude_HEADERS))
+gir_headers+=$(patsubst %,$(builddir)/%, $(nodist_libgstinterfacesinclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/interfaces/%',$(libgstinterfacesinclude_HEADERS))
+gir_cincludes+=$(patsubst %,--c-include='gst/interfaces/%',$(nodist_libgstinterfacesinclude_HEADERS))
+
+GstInterfaces-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstinterfaces-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstInterfaces \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_builddir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstinterfaces-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-interfaces-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstinterfaces -:SHARED libgstinterfaces-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstinterfaces_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstinterfaces_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/interfaces \
+ -:HEADERS $(libgstinterfacesinclude_HEADERS) \
+ $(nodist_libgstinterfacesinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/interfaces/Makefile.in b/gst-libs/gst/interfaces/Makefile.in
new file mode 100644
index 0000000..a6f96b7
--- /dev/null
+++ b/gst-libs/gst/interfaces/Makefile.in
@@ -0,0 +1,1177 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstinterfacesinclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/interfaces
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstinterfacesincludedir)" \
+ "$(DESTDIR)$(libgstinterfacesincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstinterfaces_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo
+am__objects_1 = \
+ libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo \
+ libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo
+nodist_libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am__objects_1)
+libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstinterfaces_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) \
+ $(CFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstinterfacesinclude_HEADERS) \
+ $(nodist_libgstinterfacesinclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstinterfaces-@GST_MAJORMINOR@.la
+libgstinterfacesincludedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/interfaces
+
+headers_interfaces = \
+ colorbalance.h \
+ colorbalancechannel.h \
+ mixer.h \
+ mixeroptions.h \
+ mixertrack.h \
+ navigation.h \
+ propertyprobe.h \
+ streamvolume.h \
+ tuner.h \
+ tunernorm.h \
+ tunerchannel.h \
+ videoorientation.h \
+ videooverlay.h
+
+
+# variables used for enum/marshal generation
+glib_enum_headers = $(headers_interfaces)
+glib_enum_define = GST_INTERFACES
+glib_gen_prefix = gst_interfaces
+glib_gen_basename = interfaces
+built_sources = \
+ interfaces-marshal.c \
+ interfaces-enumtypes.c
+
+built_headers = \
+ interfaces-marshal.h \
+ interfaces-enumtypes.h
+
+libgstinterfacesinclude_HEADERS = \
+ $(headers_interfaces)
+
+nodist_libgstinterfacesinclude_HEADERS = \
+ interfaces-enumtypes.h
+
+libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \
+ colorbalance.c \
+ colorbalancechannel.c \
+ mixer.c \
+ mixeroptions.c \
+ mixertrack.c \
+ navigation.c \
+ propertyprobe.c \
+ streamvolume.c \
+ tuner.c \
+ tunernorm.c \
+ tunerchannel.c \
+ videoorientation.c \
+ videooverlay.c
+
+nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \
+ $(built_sources) \
+ interfaces-marshal.h
+
+libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstinterfaces_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(LIBM)
+libgstinterfaces_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+BUILT_SOURCES = \
+ $(built_sources) \
+ $(built_headers)
+
+EXTRA_DIST = interfaces-marshal.list
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstInterfaces-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstinterfacesinclude_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstinterfacesinclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/interfaces/%',$(libgstinterfacesinclude_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/interfaces/%',$(nodist_libgstinterfacesinclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/interfaces/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/interfaces/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstinterfaces-@GST_MAJORMINOR@.la: $(libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS) $(libgstinterfaces_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstinterfaces_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstinterfaces_@GST_MAJORMINOR@_la_OBJECTS) $(libgstinterfaces_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-navigation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tuner.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo: colorbalance.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo `test -f 'colorbalance.c' || echo '$(srcdir)/'`colorbalance.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='colorbalance.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-colorbalance.lo `test -f 'colorbalance.c' || echo '$(srcdir)/'`colorbalance.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo: colorbalancechannel.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo `test -f 'colorbalancechannel.c' || echo '$(srcdir)/'`colorbalancechannel.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='colorbalancechannel.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-colorbalancechannel.lo `test -f 'colorbalancechannel.c' || echo '$(srcdir)/'`colorbalancechannel.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo: mixer.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixer.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo `test -f 'mixer.c' || echo '$(srcdir)/'`mixer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixer.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mixer.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixer.lo `test -f 'mixer.c' || echo '$(srcdir)/'`mixer.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo: mixeroptions.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo `test -f 'mixeroptions.c' || echo '$(srcdir)/'`mixeroptions.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mixeroptions.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixeroptions.lo `test -f 'mixeroptions.c' || echo '$(srcdir)/'`mixeroptions.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo: mixertrack.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo `test -f 'mixertrack.c' || echo '$(srcdir)/'`mixertrack.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mixertrack.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-mixertrack.lo `test -f 'mixertrack.c' || echo '$(srcdir)/'`mixertrack.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo: navigation.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-navigation.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo `test -f 'navigation.c' || echo '$(srcdir)/'`navigation.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-navigation.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-navigation.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='navigation.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-navigation.lo `test -f 'navigation.c' || echo '$(srcdir)/'`navigation.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo: propertyprobe.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo `test -f 'propertyprobe.c' || echo '$(srcdir)/'`propertyprobe.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='propertyprobe.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-propertyprobe.lo `test -f 'propertyprobe.c' || echo '$(srcdir)/'`propertyprobe.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo: streamvolume.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo `test -f 'streamvolume.c' || echo '$(srcdir)/'`streamvolume.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='streamvolume.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-streamvolume.lo `test -f 'streamvolume.c' || echo '$(srcdir)/'`streamvolume.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo: tuner.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tuner.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo `test -f 'tuner.c' || echo '$(srcdir)/'`tuner.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tuner.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tuner.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tuner.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tuner.lo `test -f 'tuner.c' || echo '$(srcdir)/'`tuner.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo: tunernorm.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo `test -f 'tunernorm.c' || echo '$(srcdir)/'`tunernorm.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tunernorm.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tunernorm.lo `test -f 'tunernorm.c' || echo '$(srcdir)/'`tunernorm.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo: tunerchannel.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo `test -f 'tunerchannel.c' || echo '$(srcdir)/'`tunerchannel.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tunerchannel.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-tunerchannel.lo `test -f 'tunerchannel.c' || echo '$(srcdir)/'`tunerchannel.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo: videoorientation.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo `test -f 'videoorientation.c' || echo '$(srcdir)/'`videoorientation.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='videoorientation.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-videoorientation.lo `test -f 'videoorientation.c' || echo '$(srcdir)/'`videoorientation.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo: videooverlay.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo `test -f 'videooverlay.c' || echo '$(srcdir)/'`videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='videooverlay.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-videooverlay.lo `test -f 'videooverlay.c' || echo '$(srcdir)/'`videooverlay.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo: interfaces-marshal.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo `test -f 'interfaces-marshal.c' || echo '$(srcdir)/'`interfaces-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='interfaces-marshal.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-marshal.lo `test -f 'interfaces-marshal.c' || echo '$(srcdir)/'`interfaces-marshal.c
+
+libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo: interfaces-enumtypes.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) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.Tpo -c -o libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo `test -f 'interfaces-enumtypes.c' || echo '$(srcdir)/'`interfaces-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.Tpo $(DEPDIR)/libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='interfaces-enumtypes.c' object='libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstinterfaces_@GST_MAJORMINOR@_la-interfaces-enumtypes.lo `test -f 'interfaces-enumtypes.c' || echo '$(srcdir)/'`interfaces-enumtypes.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstinterfacesincludeHEADERS: $(libgstinterfacesinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstinterfacesincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstinterfacesincludedir)"
+ @list='$(libgstinterfacesinclude_HEADERS)'; test -n "$(libgstinterfacesincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstinterfacesincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstinterfacesincludedir)" || exit $$?; \
+ done
+
+uninstall-libgstinterfacesincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstinterfacesinclude_HEADERS)'; test -n "$(libgstinterfacesincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstinterfacesincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstinterfacesincludedir)" && rm -f $$files
+install-nodist_libgstinterfacesincludeHEADERS: $(nodist_libgstinterfacesinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstinterfacesincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstinterfacesincludedir)"
+ @list='$(nodist_libgstinterfacesinclude_HEADERS)'; test -n "$(libgstinterfacesincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstinterfacesincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstinterfacesincludedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstinterfacesincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstinterfacesinclude_HEADERS)'; test -n "$(libgstinterfacesincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstinterfacesincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstinterfacesincludedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstinterfacesincludedir)" "$(DESTDIR)$(libgstinterfacesincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstinterfacesincludeHEADERS \
+ install-nodist_libgstinterfacesincludeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstinterfacesincludeHEADERS \
+ uninstall-nodist_libgstinterfacesincludeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgstinterfacesincludeHEADERS \
+ install-man install-nodist_libgstinterfacesincludeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstinterfacesincludeHEADERS \
+ uninstall-nodist_libgstinterfacesincludeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstInterfaces-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstinterfaces-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstInterfaces \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstinterfaces-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-interfaces-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstinterfaces -:SHARED libgstinterfaces-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstinterfaces_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstinterfaces_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstinterfaces_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/interfaces \
+ -:HEADERS $(libgstinterfacesinclude_HEADERS) \
+ $(nodist_libgstinterfacesinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/interfaces/colorbalance.c b/gst-libs/gst/interfaces/colorbalance.c
new file mode 100644
index 0000000..89fbfb3
--- /dev/null
+++ b/gst-libs/gst/interfaces/colorbalance.c
@@ -0,0 +1,243 @@
+/* GStreamer Color Balance
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * colorbalance.c: image color balance interface design
+ * virtual class function wrappers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "colorbalance.h"
+#include "interfaces-marshal.h"
+
+/**
+ * SECTION:gstcolorbalance
+ * @short_description: Interface for adjusting color balance settings
+ *
+ * <refsect2><para>
+ * This interface is implemented by elements which can perform some color
+ * balance operation on video frames they process. For example, modifying
+ * the brightness, contrast, hue or saturation.
+ * </para><para>
+ * Example elements are 'xvimagesink' and 'colorbalance'
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME 0.11: check if we need to add API for sometimes-supportedness
+ * (aka making up for GstImplementsInterface removal) */
+
+/* FIXME 0.11: replace signals with messages (+ make API thread-safe) */
+
+enum
+{
+ VALUE_CHANGED,
+ LAST_SIGNAL
+};
+
+static void gst_color_balance_class_init (GstColorBalanceClass * klass);
+
+static guint gst_color_balance_signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_color_balance_get_type (void)
+{
+ static GType gst_color_balance_type = 0;
+
+ if (!gst_color_balance_type) {
+ static const GTypeInfo gst_color_balance_info = {
+ sizeof (GstColorBalanceClass),
+ (GBaseInitFunc) gst_color_balance_class_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_color_balance_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstColorBalance", &gst_color_balance_info, 0);
+ }
+
+ return gst_color_balance_type;
+}
+
+static void
+gst_color_balance_class_init (GstColorBalanceClass * klass)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /**
+ * GstColorBalance::value-changed:
+ * @colorbalance: The GstColorBalance instance
+ * @channel: The #GstColorBalanceChannel
+ * @value: The new value
+ *
+ * Fired when the value of the indicated channel has changed.
+ */
+ gst_color_balance_signals[VALUE_CHANGED] =
+ g_signal_new ("value-changed",
+ GST_TYPE_COLOR_BALANCE, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstColorBalanceClass, value_changed),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_INT,
+ G_TYPE_NONE, 2, GST_TYPE_COLOR_BALANCE_CHANNEL, G_TYPE_INT);
+
+ initialized = TRUE;
+ }
+
+ klass->balance_type = GST_COLOR_BALANCE_SOFTWARE;
+
+ /* default virtual functions */
+ klass->list_channels = NULL;
+ klass->set_value = NULL;
+ klass->get_value = NULL;
+}
+
+/**
+ * gst_color_balance_list_channels:
+ * @balance: A #GstColorBalance instance
+ *
+ * Retrieve a list of the available channels.
+ *
+ * Returns: A GList containing pointers to #GstColorBalanceChannel objects.
+ * The list is owned by the #GstColorBalance instance and must not
+ * be freed.
+ */
+const GList *
+gst_color_balance_list_channels (GstColorBalance * balance)
+{
+ GstColorBalanceClass *klass;
+
+ g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance), NULL);
+
+ klass = GST_COLOR_BALANCE_GET_CLASS (balance);
+
+ if (klass->list_channels) {
+ return klass->list_channels (balance);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_color_balance_set_value:
+ * @balance: A #GstColorBalance instance
+ * @channel: A #GstColorBalanceChannel instance
+ * @value: The new value for the channel.
+ *
+ * Sets the current value of the channel to the passed value, which must
+ * be between min_value and max_value.
+ *
+ * See Also: The #GstColorBalanceChannel.min_value and
+ * #GstColorBalanceChannel.max_value members of the
+ * #GstColorBalanceChannel object.
+ */
+void
+gst_color_balance_set_value (GstColorBalance * balance,
+ GstColorBalanceChannel * channel, gint value)
+{
+ GstColorBalanceClass *klass = GST_COLOR_BALANCE_GET_CLASS (balance);
+
+ if (klass->set_value) {
+ klass->set_value (balance, channel, value);
+ }
+}
+
+/**
+ * gst_color_balance_get_value:
+ * @balance: A #GstColorBalance instance
+ * @channel: A #GstColorBalanceChannel instance
+ *
+ * Retrieve the current value of the indicated channel, between min_value
+ * and max_value.
+ *
+ * See Also: The #GstColorBalanceChannel.min_value and
+ * #GstColorBalanceChannel.max_value members of the
+ * #GstColorBalanceChannel object.
+ *
+ * Returns: The current value of the channel.
+ */
+gint
+gst_color_balance_get_value (GstColorBalance * balance,
+ GstColorBalanceChannel * channel)
+{
+ GstColorBalanceClass *klass;
+
+ g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance), 0);
+
+ klass = GST_COLOR_BALANCE_GET_CLASS (balance);
+
+ if (klass->get_value) {
+ return klass->get_value (balance, channel);
+ }
+
+ return channel->min_value;
+}
+
+/**
+ * gst_color_balance_get_balance_type:
+ * @balance: The #GstColorBalance implementation
+ *
+ * Get the #GstColorBalanceType of this implementation.
+ *
+ * Returns: A the #GstColorBalanceType.
+ *
+ * Since: 0.10.24
+ */
+GstColorBalanceType
+gst_color_balance_get_balance_type (GstColorBalance * balance)
+{
+ GstColorBalanceClass *klass;
+
+ g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance),
+ GST_COLOR_BALANCE_SOFTWARE);
+
+ klass = GST_COLOR_BALANCE_GET_CLASS (balance);
+
+ return klass->balance_type;
+}
+
+/**
+ * gst_color_balance_value_changed:
+ * @balance: A #GstColorBalance instance
+ * @channel: A #GstColorBalanceChannel whose value has changed
+ * @value: The new value of the channel
+ *
+ * A helper function called by implementations of the GstColorBalance
+ * interface. It fires the #GstColorBalance::value-changed signal on the
+ * instance, and the #GstColorBalanceChannel::value-changed signal on the
+ * channel object.
+ */
+void
+gst_color_balance_value_changed (GstColorBalance * balance,
+ GstColorBalanceChannel * channel, gint value)
+{
+
+ g_return_if_fail (GST_IS_COLOR_BALANCE (balance));
+
+ g_signal_emit (G_OBJECT (balance),
+ gst_color_balance_signals[VALUE_CHANGED], 0, channel, value);
+
+ g_signal_emit_by_name (G_OBJECT (channel), "value_changed", value);
+}
diff --git a/gst-libs/gst/interfaces/colorbalance.h b/gst-libs/gst/interfaces/colorbalance.h
new file mode 100644
index 0000000..896b6b6
--- /dev/null
+++ b/gst-libs/gst/interfaces/colorbalance.h
@@ -0,0 +1,124 @@
+/* GStreamer Color Balance
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * color-balance.h: image color balance interface design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_COLOR_BALANCE_H__
+#define __GST_COLOR_BALANCE_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/colorbalancechannel.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+
+G_BEGIN_DECLS
+
+/* FIXME 0.11: remove all CLASS bits, this is an interface */
+#define GST_TYPE_COLOR_BALANCE \
+ (gst_color_balance_get_type ())
+#define GST_COLOR_BALANCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_COLOR_BALANCE, GstColorBalance))
+#define GST_COLOR_BALANCE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_COLOR_BALANCE, \
+ GstColorBalanceClass))
+#define GST_IS_COLOR_BALANCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_COLOR_BALANCE))
+#define GST_IS_COLOR_BALANCE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_COLOR_BALANCE))
+#define GST_COLOR_BALANCE_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_COLOR_BALANCE, GstColorBalanceClass))
+
+#define GST_COLOR_BALANCE_TYPE(klass) (klass->balance_type)
+
+typedef struct _GstColorBalance GstColorBalance;
+typedef struct _GstColorBalanceClass GstColorBalanceClass;
+
+/**
+ * GstColorBalanceType:
+ * @GST_COLOR_BALANCE_HARDWARE: Color balance is implemented with dedicated
+ * hardware.
+ * @GST_COLOR_BALANCE_SOFTWARE: Color balance is implemented via software
+ * processing.
+ *
+ * An enumeration indicating whether an element implements color balancing
+ * operations in software or in dedicated hardware. In general, dedicated
+ * hardware implementations (such as those provided by xvimagesink) are
+ * preferred.
+ */
+typedef enum
+{
+ GST_COLOR_BALANCE_HARDWARE,
+ GST_COLOR_BALANCE_SOFTWARE
+} GstColorBalanceType;
+
+/**
+ * GstColorBalanceClass:
+ * @klass: the parent interface
+ * @balance_type: implementation type
+ * @list_channels: list handled channels
+ * @set_value: set a channel value
+ * @get_value: get a channel value
+ * @value_changed: default handler for value changed notification
+ *
+ * Color-balance interface.
+ */
+struct _GstColorBalanceClass {
+ GTypeInterface klass;
+
+ GstColorBalanceType balance_type;
+
+ /* virtual functions */
+ const GList * (* list_channels) (GstColorBalance *balance);
+
+ void (* set_value) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+ gint (* get_value) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel);
+
+ /* signals */
+ void (* value_changed) (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_color_balance_get_type (void);
+
+/* virtual class function wrappers */
+const GList *
+ gst_color_balance_list_channels (GstColorBalance *balance);
+void gst_color_balance_set_value (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+gint gst_color_balance_get_value (GstColorBalance *balance,
+ GstColorBalanceChannel *channel);
+
+GstColorBalanceType
+ gst_color_balance_get_balance_type (GstColorBalance *balance);
+
+/* trigger signal */
+void gst_color_balance_value_changed (GstColorBalance *balance,
+ GstColorBalanceChannel *channel,
+ gint value);
+
+G_END_DECLS
+
+#endif /* __GST_COLOR_BALANCE_H__ */
diff --git a/gst-libs/gst/interfaces/colorbalancechannel.c b/gst-libs/gst/interfaces/colorbalancechannel.c
new file mode 100644
index 0000000..ae22fba
--- /dev/null
+++ b/gst-libs/gst/interfaces/colorbalancechannel.c
@@ -0,0 +1,124 @@
+/* GStreamer Color Balance
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * colorbalancechannel.c: colorbalance channel object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "colorbalancechannel.h"
+
+/**
+ * SECTION:gstcolorbalancechannel
+ * @short_description: Object representing a channel from the #GstColorBalance
+ * interface.
+ *
+ * <refsect2><para>The #GstColorBalanceChannel object represents a parameter
+ * for modifying the color balance implemented by an element providing the
+ * #GstColorBalance interface. For example, Hue or Saturation.
+ * </para></refsect2>
+ */
+
+enum
+{
+ /* FILL ME */
+ SIGNAL_VALUE_CHANGED,
+ LAST_SIGNAL
+};
+
+static void gst_color_balance_channel_class_init (GstColorBalanceChannelClass *
+ klass);
+static void gst_color_balance_channel_init (GstColorBalanceChannel * balance);
+static void gst_color_balance_channel_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_color_balance_channel_get_type (void)
+{
+ static GType gst_color_balance_channel_type = 0;
+
+ if (!gst_color_balance_channel_type) {
+ static const GTypeInfo color_balance_channel_info = {
+ sizeof (GstColorBalanceChannelClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_color_balance_channel_class_init,
+ NULL,
+ NULL,
+ sizeof (GstColorBalanceChannel),
+ 0,
+ (GInstanceInitFunc) gst_color_balance_channel_init,
+ NULL
+ };
+
+ gst_color_balance_channel_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "GstColorBalanceChannel", &color_balance_channel_info, 0);
+ }
+
+ return gst_color_balance_channel_type;
+}
+
+static void
+gst_color_balance_channel_class_init (GstColorBalanceChannelClass * klass)
+{
+ GObjectClass *object_klass = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GstColorBalanceChannel::value-changed:
+ * @channel: The #GstColorBalanceChannel
+ * @value: The new value
+ *
+ * Fired when the value of the indicated channel has changed.
+ */
+ signals[SIGNAL_VALUE_CHANGED] =
+ g_signal_new ("value-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstColorBalanceChannelClass,
+ value_changed),
+ NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ object_klass->dispose = gst_color_balance_channel_dispose;
+}
+
+static void
+gst_color_balance_channel_init (GstColorBalanceChannel * channel)
+{
+ channel->label = NULL;
+ channel->min_value = channel->max_value = 0;
+}
+
+static void
+gst_color_balance_channel_dispose (GObject * object)
+{
+ GstColorBalanceChannel *channel = GST_COLOR_BALANCE_CHANNEL (object);
+
+ if (channel->label)
+ g_free (channel->label);
+
+ channel->label = NULL;
+
+ if (parent_class->dispose)
+ parent_class->dispose (object);
+}
diff --git a/gst-libs/gst/interfaces/colorbalancechannel.h b/gst-libs/gst/interfaces/colorbalancechannel.h
new file mode 100644
index 0000000..22a2a7f
--- /dev/null
+++ b/gst-libs/gst/interfaces/colorbalancechannel.h
@@ -0,0 +1,82 @@
+/* GStreamer Color Balance
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * colorbalancechannel.h: individual channel 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.
+ */
+
+#ifndef __GST_COLOR_BALANCE_CHANNEL_H__
+#define __GST_COLOR_BALANCE_CHANNEL_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_COLOR_BALANCE_CHANNEL \
+ (gst_color_balance_channel_get_type ())
+#define GST_COLOR_BALANCE_CHANNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_COLOR_BALANCE_CHANNEL, \
+ GstColorBalanceChannel))
+#define GST_COLOR_BALANCE_CHANNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_COLOR_BALANCE_CHANNEL, \
+ GstColorBalanceChannelClass))
+#define GST_IS_COLOR_BALANCE_CHANNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_COLOR_BALANCE_CHANNEL))
+#define GST_IS_COLOR_BALANCE_CHANNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_COLOR_BALANCE_CHANNEL))
+
+typedef struct _GstColorBalanceChannel GstColorBalanceChannel;
+typedef struct _GstColorBalanceChannelClass GstColorBalanceChannelClass;
+
+/**
+ * GstColorBalanceChannel:
+ * @label: A string containing a descriptive name for this channel
+ * @min_value: The minimum valid value for this channel.
+ * @max_value: The maximum valid value for this channel.
+ */
+struct _GstColorBalanceChannel {
+ GObject parent;
+
+ /*< public >*/
+ gchar *label;
+ gint min_value;
+ gint max_value;
+};
+
+/**
+ * GstColorBalanceChannelClass:
+ * @parent: the parent interface
+ * @value_changed: default handler for value changed notification
+ *
+ * Color-balance channel class.
+ */
+struct _GstColorBalanceChannelClass {
+ GObjectClass parent;
+
+ /* signals */
+ void (* value_changed) (GstColorBalanceChannel *channel,
+ gint value);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_color_balance_channel_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_COLOR_BALANCE_CHANNEL_H__ */
diff --git a/gst-libs/gst/interfaces/interfaces-marshal.list b/gst-libs/gst/interfaces/interfaces-marshal.list
new file mode 100644
index 0000000..cb7469c
--- /dev/null
+++ b/gst-libs/gst/interfaces/interfaces-marshal.list
@@ -0,0 +1,5 @@
+VOID:OBJECT,BOOLEAN
+VOID:OBJECT,POINTER
+VOID:OBJECT,STRING
+VOID:OBJECT,ULONG
+VOID:OBJECT,INT
diff --git a/gst-libs/gst/interfaces/mixer.c b/gst-libs/gst/interfaces/mixer.c
new file mode 100644
index 0000000..23b707e
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixer.c
@@ -0,0 +1,873 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixer.c: mixer design virtual class function wrappers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "mixer.h"
+#include "interfaces-marshal.h"
+
+#define GST_MIXER_MESSAGE_NAME "gst-mixer-message"
+
+/**
+ * SECTION:gstmixer
+ * @short_description: Interface for elements that provide mixer operations
+ * @see_also: alsamixer, oss4mixer, sunaudiomixer
+ *
+ * Basic interface for hardware mixer controls.
+ *
+ * Applications rarely need to use this interface, it is provided mainly
+ * for system-level mixer applets and the like. Volume control in playback
+ * applications should be done using a <classname>volume</classname>
+ * element or, if available, using the <quote>volume</quote> property of
+ * the audio sink element used (as provided by <classname>pulsesink</classname>
+ * for example), or even better: just use the <classname>playbin2</classname>
+ * element's <quote>volume</quote> property.
+ *
+ * Usage: In order to use the <classname>GstMixer</classname> interface, the
+ * element needs to be at least in READY state (so that the element has opened
+ * the mixer device). Once the element has been set to READY state or higher,
+ * it can be cast to a <classname>GstMixer</classname> using the GST_MIXER
+ * macro (in C) and the mixer API can be used.
+ */
+
+/* FIXME 0.11: check if we need to add API for sometimes-supportedness
+ * (aka making up for GstImplementsInterface removal) */
+
+#ifndef GST_DISABLE_DEPRECATED
+enum
+{
+ SIGNAL_MUTE_TOGGLED,
+ SIGNAL_RECORD_TOGGLED,
+ SIGNAL_VOLUME_CHANGED,
+ SIGNAL_OPTION_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint gst_mixer_signals[LAST_SIGNAL] = { 0 };
+
+#endif
+
+static void gst_mixer_class_init (GstMixerClass * klass);
+
+GType
+gst_mixer_get_type (void)
+{
+ static GType gst_mixer_type = 0;
+
+ if (!gst_mixer_type) {
+ static const GTypeInfo gst_mixer_info = {
+ sizeof (GstMixerClass),
+ (GBaseInitFunc) gst_mixer_class_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_mixer_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstMixer", &gst_mixer_info, 0);
+ }
+
+ return gst_mixer_type;
+}
+
+static void
+gst_mixer_class_init (GstMixerClass * klass)
+{
+#ifndef GST_DISABLE_DEPRECATED
+ static gboolean initialized = FALSE;
+
+ /* signals (deprecated) */
+ if (!initialized) {
+ gst_mixer_signals[SIGNAL_RECORD_TOGGLED] =
+ g_signal_new ("record-toggled",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, record_toggled),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2,
+ GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
+ gst_mixer_signals[SIGNAL_MUTE_TOGGLED] =
+ g_signal_new ("mute-toggled",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, mute_toggled),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2,
+ GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
+ gst_mixer_signals[SIGNAL_VOLUME_CHANGED] =
+ g_signal_new ("volume-changed",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, volume_changed),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_POINTER, G_TYPE_NONE, 2,
+ GST_TYPE_MIXER_TRACK, G_TYPE_POINTER);
+ gst_mixer_signals[SIGNAL_OPTION_CHANGED] =
+ g_signal_new ("option-changed",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, option_changed),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, 2,
+ GST_TYPE_MIXER_OPTIONS, G_TYPE_STRING);
+
+ initialized = TRUE;
+ }
+#endif
+
+ klass->mixer_type = GST_MIXER_SOFTWARE;
+
+ /* default virtual functions */
+ klass->list_tracks = NULL;
+ klass->set_volume = NULL;
+ klass->get_volume = NULL;
+ klass->set_mute = NULL;
+ klass->set_record = NULL;
+ klass->set_option = NULL;
+ klass->get_option = NULL;
+}
+
+/**
+ * gst_mixer_list_tracks:
+ * @mixer: the #GstMixer (a #GstElement) to get the tracks from.
+ *
+ * Returns a list of available tracks for this mixer/element. Note
+ * that it is allowed for sink (output) elements to only provide
+ * the output tracks in this list. Likewise, for sources (inputs),
+ * it is allowed to only provide input elements in this list.
+ *
+ * Returns: A #GList consisting of zero or more #GstMixerTracks.
+ * The list is owned by the #GstMixer instance and must not be freed
+ * or modified.
+ */
+
+const GList *
+gst_mixer_list_tracks (GstMixer * mixer)
+{
+ GstMixerClass *klass;
+
+ g_return_val_if_fail (mixer != NULL, NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->list_tracks) {
+ return klass->list_tracks (mixer);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_mixer_set_volume:
+ * @mixer: The #GstMixer (a #GstElement) that owns the track.
+ * @track: The #GstMixerTrack to set the volume on.
+ * @volumes: an array of integers (of size track->num_channels)
+ * that gives the wanted volume for each channel in
+ * this track.
+ *
+ * Sets the volume on each channel in a track. Short note about
+ * naming: a track is defined as one separate stream owned by
+ * the mixer/element, such as 'Line-in' or 'Microphone'. A
+ * channel is said to be a mono-stream inside this track. A
+ * stereo track thus contains two channels.
+ */
+
+void
+gst_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
+{
+ GstMixerClass *klass;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (track != NULL);
+ g_return_if_fail (volumes != NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->set_volume) {
+ klass->set_volume (mixer, track, volumes);
+ }
+}
+
+/**
+ * gst_mixer_get_volume:
+ * @mixer: the #GstMixer (a #GstElement) that owns the track
+ * @track: the GstMixerTrack to get the volume from.
+ * @volumes: a pre-allocated array of integers (of size
+ * track->num_channels) to store the current volume
+ * of each channel in the given track in.
+ *
+ * Get the current volume(s) on the given track.
+ */
+
+void
+gst_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
+{
+ GstMixerClass *klass;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (track != NULL);
+ g_return_if_fail (volumes != NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->get_volume) {
+ klass->get_volume (mixer, track, volumes);
+ } else {
+ gint i;
+
+ for (i = 0; i < track->num_channels; i++) {
+ volumes[i] = 0;
+ }
+ }
+}
+
+/**
+ * gst_mixer_set_mute:
+ * @mixer: the #GstMixer (a #GstElement) that owns the track.
+ * @track: the #GstMixerTrack to operate on.
+ * @mute: a boolean value indicating whether to turn on or off
+ * muting.
+ *
+ * Mutes or unmutes the given channel. To find out whether a
+ * track is currently muted, use GST_MIXER_TRACK_HAS_FLAG ().
+ */
+
+void
+gst_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
+{
+ GstMixerClass *klass;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (track != NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->set_mute) {
+ klass->set_mute (mixer, track, mute);
+ }
+}
+
+/**
+ * gst_mixer_set_record:
+ * @mixer: The #GstMixer (a #GstElement) that owns the track.
+ * @track: the #GstMixerTrack to operate on.
+ * @record: a boolean value that indicates whether to turn on
+ * or off recording.
+ *
+ * Enables or disables recording on the given track. Note that
+ * this is only possible on input tracks, not on output tracks
+ * (see GST_MIXER_TRACK_HAS_FLAG () and the GST_MIXER_TRACK_INPUT
+ * flag).
+ */
+
+void
+gst_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, gboolean record)
+{
+ GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->set_record) {
+ klass->set_record (mixer, track, record);
+ }
+}
+
+/**
+ * gst_mixer_set_option:
+ * @mixer: The #GstMixer (a #GstElement) that owns the optionlist.
+ * @opts: The #GstMixerOptions that we operate on.
+ * @value: The requested new option value.
+ *
+ * Sets a name/value option in the mixer to the requested value.
+ */
+
+void
+gst_mixer_set_option (GstMixer * mixer, GstMixerOptions * opts, gchar * value)
+{
+ GstMixerClass *klass;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (opts != NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->set_option) {
+ klass->set_option (mixer, opts, value);
+ }
+}
+
+/**
+ * gst_mixer_get_option:
+ * @mixer: The #GstMixer (a #GstElement) that owns the optionlist.
+ * @opts: The #GstMixerOptions that we operate on.
+ *
+ * Get the current value of a name/value option in the mixer.
+ *
+ * Returns: current value of the name/value option.
+ */
+
+const gchar *
+gst_mixer_get_option (GstMixer * mixer, GstMixerOptions * opts)
+{
+ GstMixerClass *klass;
+
+ g_return_val_if_fail (mixer != NULL, NULL);
+ g_return_val_if_fail (opts != NULL, NULL);
+
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->get_option) {
+ return klass->get_option (mixer, opts);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_mixer_get_mixer_type:
+ * @mixer: The #GstMixer implementation
+ *
+ * Get the #GstMixerType of this mixer implementation.
+ *
+ * Returns: A the #GstMixerType.
+ *
+ * Since: 0.10.24
+ */
+GstMixerType
+gst_mixer_get_mixer_type (GstMixer * mixer)
+{
+ GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+ return klass->mixer_type;
+}
+
+/**
+ * gst_mixer_get_mixer_flags:
+ * @mixer: The #GstMixer implementation
+ *
+ * Get the set of supported flags for this mixer implementation.
+ *
+ * Returns: A set of or-ed GstMixerFlags for supported features.
+ */
+GstMixerFlags
+gst_mixer_get_mixer_flags (GstMixer * mixer)
+{
+ GstMixerClass *klass;
+
+ g_return_val_if_fail (mixer != NULL, FALSE);
+ klass = GST_MIXER_GET_CLASS (mixer);
+
+ if (klass->get_mixer_flags) {
+ return klass->get_mixer_flags (mixer);
+ }
+ return GST_MIXER_FLAG_NONE;
+}
+
+/**
+ * gst_mixer_mute_toggled:
+ * @mixer: the #GstMixer (a #GstElement) that owns the track
+ * @track: the GstMixerTrack that has change mute state.
+ * @mute: the new state of the mute flag on the track
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the given track
+ * has changed mute state.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus.
+ */
+void
+gst_mixer_mute_toggled (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+ g_return_if_fail (track != NULL);
+
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "mute-toggled",
+ "track", GST_TYPE_MIXER_TRACK, track, "mute", G_TYPE_BOOLEAN, mute, NULL);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+/**
+ * gst_mixer_record_toggled:
+ * @mixer: the #GstMixer (a #GstElement) that owns the track
+ * @track: the GstMixerTrack that has changed recording state.
+ * @record: the new state of the record flag on the track
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the given track
+ * has changed recording state.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus.
+ */
+void
+gst_mixer_record_toggled (GstMixer * mixer,
+ GstMixerTrack * track, gboolean record)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+ g_return_if_fail (track != NULL);
+
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "record-toggled",
+ "track", GST_TYPE_MIXER_TRACK, track,
+ "record", G_TYPE_BOOLEAN, record, NULL);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+/**
+ * gst_mixer_volume_changed:
+ * @mixer: the #GstMixer (a #GstElement) that owns the track
+ * @track: the GstMixerTrack that has changed.
+ * @volumes: Array of volume values, one per channel on the mixer track.
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the volume(s) for the
+ * given track have changed.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus.
+ */
+void
+gst_mixer_volume_changed (GstMixer * mixer,
+ GstMixerTrack * track, gint * volumes)
+{
+ GstStructure *s;
+ GstMessage *m;
+ GValue l = { 0, };
+ GValue v = { 0, };
+ gint i;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+ g_return_if_fail (track != NULL);
+
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "volume-changed",
+ "track", GST_TYPE_MIXER_TRACK, track, NULL);
+
+ g_value_init (&l, GST_TYPE_ARRAY);
+
+ g_value_init (&v, G_TYPE_INT);
+
+ /* FIXME 0.11: pass track->num_channels to the function */
+ for (i = 0; i < track->num_channels; ++i) {
+ g_value_set_int (&v, volumes[i]);
+ gst_value_array_append_value (&l, &v);
+ }
+ g_value_unset (&v);
+
+ gst_structure_set_value (s, "volumes", &l);
+ g_value_unset (&l);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+/**
+ * gst_mixer_option_changed:
+ * @mixer: the #GstMixer (a #GstElement) that owns the options
+ * @opts: the GstMixerOptions that has changed value.
+ * @value: the new value of the GstMixerOptions.
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the given options
+ * object has changed state.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus.
+ */
+void
+gst_mixer_option_changed (GstMixer * mixer,
+ GstMixerOptions * opts, const gchar * value)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+ g_return_if_fail (opts != NULL);
+
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "option-changed",
+ "options", GST_TYPE_MIXER_OPTIONS, opts,
+ "value", G_TYPE_STRING, value, NULL);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+/**
+ * gst_mixer_options_list_changed:
+ * @mixer: the #GstMixer (a #GstElement) that owns the options
+ * @opts: the GstMixerOptions whose list of values has changed
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the list of possible
+ * options of a given options object has changed.
+ *
+ * The new options are not contained in the message on purpose. Applications
+ * should call gst_mixer_options_get_values() on @opts to make @opts update
+ * its internal state and obtain the new list of values.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus
+ * for this to work.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_mixer_options_list_changed (GstMixer * mixer, GstMixerOptions * opts)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+ g_return_if_fail (opts != NULL);
+ g_return_if_fail (GST_IS_MIXER_OPTIONS (opts));
+
+ /* we do not include the new list here on purpose, so that the application
+ * has to use gst_mixer_options_get_values() to get the new list, which then
+ * allows the mixer options object to update the internal GList in a somewhat
+ * thread-safe way at least */
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "options-list-changed",
+ "options", GST_TYPE_MIXER_OPTIONS, opts, NULL);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+/**
+ * gst_mixer_mixer_changed:
+ * @mixer: the #GstMixer (a #GstElement) which has changed
+ *
+ * This function is called by the mixer implementation to produce
+ * a notification message on the bus indicating that the list of available
+ * mixer tracks for a given mixer object has changed. Applications should
+ * rebuild their interface when they receive this message.
+ *
+ * This function only works for GstElements that are implementing the
+ * GstMixer interface, and the element needs to have been provided a bus.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_mixer_mixer_changed (GstMixer * mixer)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ g_return_if_fail (mixer != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (mixer));
+
+ s = gst_structure_new (GST_MIXER_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "mixer-changed", NULL);
+
+ m = gst_message_new_element (GST_OBJECT (mixer), s);
+ if (gst_element_post_message (GST_ELEMENT (mixer), m) == FALSE) {
+ GST_WARNING ("This element has no bus, therefore no message sent!");
+ }
+}
+
+static gboolean
+gst_mixer_message_is_mixer_message (GstMessage * message)
+{
+ const GstStructure *s;
+
+ if (message == NULL)
+ return FALSE;
+ if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
+ return FALSE;
+
+ s = gst_message_get_structure (message);
+ return gst_structure_has_name (s, GST_MIXER_MESSAGE_NAME);
+}
+
+/**
+ * gst_mixer_message_get_type:
+ * @message: A GstMessage to inspect.
+ *
+ * Check a bus message to see if it is a GstMixer notification
+ * message and return the GstMixerMessageType identifying which
+ * type of notification it is.
+ *
+ * Returns: The type of the GstMixerMessage, or GST_MIXER_MESSAGE_INVALID
+ * if the message is not a GstMixer notification.
+ *
+ * Since: 0.10.14
+ */
+GstMixerMessageType
+gst_mixer_message_get_type (GstMessage * message)
+{
+ const GstStructure *s;
+ const gchar *m_type;
+
+ if (!gst_mixer_message_is_mixer_message (message))
+ return GST_MIXER_MESSAGE_INVALID;
+
+ s = gst_message_get_structure (message);
+ m_type = gst_structure_get_string (s, "type");
+ g_return_val_if_fail (m_type != NULL, GST_MIXER_MESSAGE_INVALID);
+
+ if (g_str_equal (m_type, "mute-toggled"))
+ return GST_MIXER_MESSAGE_MUTE_TOGGLED;
+ else if (g_str_equal (m_type, "record-toggled"))
+ return GST_MIXER_MESSAGE_RECORD_TOGGLED;
+ else if (g_str_equal (m_type, "volume-changed"))
+ return GST_MIXER_MESSAGE_VOLUME_CHANGED;
+ else if (g_str_equal (m_type, "option-changed"))
+ return GST_MIXER_MESSAGE_OPTION_CHANGED;
+ else if (g_str_equal (m_type, "options-list-changed"))
+ return GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED;
+ else if (g_str_equal (m_type, "mixer-changed"))
+ return GST_MIXER_MESSAGE_MIXER_CHANGED;
+
+ return GST_MIXER_MESSAGE_INVALID;
+}
+
+#define GST_MIXER_MESSAGE_HAS_TYPE(msg,msg_type) \
+(gst_mixer_message_get_type (msg) == GST_MIXER_MESSAGE_ ## msg_type)
+
+/**
+ * gst_mixer_message_parse_mute_toggled:
+ * @message: A mute-toggled change notification message.
+ * @track: Pointer to hold a GstMixerTrack object, or NULL.
+ * @mute: A pointer to a gboolean variable, or NULL.
+ *
+ * Extracts the contents of a mute-toggled bus message. Reads
+ * the GstMixerTrack that has changed, and the new value of the mute
+ * flag.
+ *
+ * The GstMixerTrack remains valid until the message is freed.
+ *
+ * Since: 0.10.14
+ */
+void
+gst_mixer_message_parse_mute_toggled (GstMessage * message,
+ GstMixerTrack ** track, gboolean * mute)
+{
+ const GstStructure *s;
+
+ g_return_if_fail (gst_mixer_message_is_mixer_message (message));
+ g_return_if_fail (GST_MIXER_MESSAGE_HAS_TYPE (message, MUTE_TOGGLED));
+
+ s = gst_message_get_structure (message);
+
+ if (track) {
+ const GValue *v = gst_structure_get_value (s, "track");
+
+ g_return_if_fail (v != NULL);
+ *track = (GstMixerTrack *) g_value_get_object (v);
+ g_return_if_fail (GST_IS_MIXER_TRACK (*track));
+ }
+
+ if (mute)
+ g_return_if_fail (gst_structure_get_boolean (s, "mute", mute));
+}
+
+/**
+ * gst_mixer_message_parse_record_toggled:
+ * @message: A record-toggled change notification message.
+ * @track: Pointer to hold a GstMixerTrack object, or NULL.
+ * @record: A pointer to a gboolean variable, or NULL.
+ *
+ * Extracts the contents of a record-toggled bus message. Reads
+ * the GstMixerTrack that has changed, and the new value of the
+ * recording flag.
+ *
+ * The GstMixerTrack remains valid until the message is freed.
+ *
+ * Since: 0.10.14
+ */
+void
+gst_mixer_message_parse_record_toggled (GstMessage * message,
+ GstMixerTrack ** track, gboolean * record)
+{
+ const GstStructure *s;
+
+ g_return_if_fail (gst_mixer_message_is_mixer_message (message));
+ g_return_if_fail (GST_MIXER_MESSAGE_HAS_TYPE (message, RECORD_TOGGLED));
+
+ s = gst_message_get_structure (message);
+
+ if (track) {
+ const GValue *v = gst_structure_get_value (s, "track");
+
+ g_return_if_fail (v != NULL);
+ *track = (GstMixerTrack *) g_value_get_object (v);
+ g_return_if_fail (GST_IS_MIXER_TRACK (*track));
+ }
+
+ if (record)
+ g_return_if_fail (gst_structure_get_boolean (s, "record", record));
+}
+
+/**
+ * gst_mixer_message_parse_volume_changed:
+ * @message: A volume-changed change notification message.
+ * @track: Pointer to hold a GstMixerTrack object, or NULL.
+ * @volumes: A pointer to receive an array of gint values, or NULL.
+ * @num_channels: Result location to receive the number of channels, or NULL.
+ *
+ * Parses a volume-changed notification message and extracts the track object
+ * it refers to, as well as an array of volumes and the size of the volumes array.
+ *
+ * The track object remains valid until the message is freed.
+ *
+ * The caller must free the array returned in the volumes parameter using g_free
+ * when they are done with it.
+ *
+ * Since: 0.10.14
+ */
+void
+gst_mixer_message_parse_volume_changed (GstMessage * message,
+ GstMixerTrack ** track, gint ** volumes, gint * num_channels)
+{
+ const GstStructure *s;
+
+ g_return_if_fail (gst_mixer_message_is_mixer_message (message));
+ g_return_if_fail (GST_MIXER_MESSAGE_HAS_TYPE (message, VOLUME_CHANGED));
+
+ s = gst_message_get_structure (message);
+
+ if (track) {
+ const GValue *v = gst_structure_get_value (s, "track");
+
+ g_return_if_fail (v != NULL);
+ *track = (GstMixerTrack *) g_value_get_object (v);
+ g_return_if_fail (GST_IS_MIXER_TRACK (*track));
+ }
+
+ if (volumes || num_channels) {
+ gint n_chans, i;
+ const GValue *v = gst_structure_get_value (s, "volumes");
+
+ g_return_if_fail (v != NULL);
+ g_return_if_fail (GST_VALUE_HOLDS_ARRAY (v));
+
+ n_chans = gst_value_array_get_size (v);
+ if (num_channels)
+ *num_channels = n_chans;
+
+ if (volumes) {
+ *volumes = g_new (gint, n_chans);
+ for (i = 0; i < n_chans; i++) {
+ const GValue *e = gst_value_array_get_value (v, i);
+
+ g_return_if_fail (e != NULL && G_VALUE_HOLDS_INT (e));
+ (*volumes)[i] = g_value_get_int (e);
+ }
+ }
+ }
+}
+
+/**
+ * gst_mixer_message_parse_option_changed:
+ * @message: A volume-changed change notification message.
+ * @options: Pointer to hold a GstMixerOptions object, or NULL.
+ * @value: Result location to receive the new options value, or NULL.
+ *
+ * Extracts the GstMixerOptions and new value from a option-changed bus notification
+ * message.
+ *
+ * The options and value returned remain valid until the message is freed.
+ *
+ * Since: 0.10.14
+ */
+void
+gst_mixer_message_parse_option_changed (GstMessage * message,
+ GstMixerOptions ** options, const gchar ** value)
+{
+ const GstStructure *s;
+
+ g_return_if_fail (gst_mixer_message_is_mixer_message (message));
+ g_return_if_fail (GST_MIXER_MESSAGE_HAS_TYPE (message, OPTION_CHANGED));
+
+ s = gst_message_get_structure (message);
+
+ if (options) {
+ const GValue *v = gst_structure_get_value (s, "options");
+
+ g_return_if_fail (v != NULL);
+ *options = (GstMixerOptions *) g_value_get_object (v);
+ g_return_if_fail (GST_IS_MIXER_OPTIONS (*options));
+ }
+
+ if (value)
+ *value = gst_structure_get_string (s, "value");
+}
+
+/**
+ * gst_mixer_message_parse_options_list_changed:
+ * @message: A volume-changed change notification message.
+ * @options: Pointer to hold a GstMixerOptions object, or NULL.
+ *
+ * Extracts the GstMixerOptions whose value list has changed from an
+ * options-list-changed bus notification message.
+ *
+ * The options object returned remains valid until the message is freed. You
+ * do not need to unref it.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_mixer_message_parse_options_list_changed (GstMessage * message,
+ GstMixerOptions ** options)
+{
+ const GstStructure *s;
+
+ g_return_if_fail (gst_mixer_message_is_mixer_message (message));
+ g_return_if_fail (GST_MIXER_MESSAGE_HAS_TYPE (message, OPTIONS_LIST_CHANGED));
+
+ s = gst_message_get_structure (message);
+
+ if (options) {
+ const GValue *v = gst_structure_get_value (s, "options");
+
+ g_return_if_fail (v != NULL);
+ *options = (GstMixerOptions *) g_value_get_object (v);
+ g_return_if_fail (GST_IS_MIXER_OPTIONS (*options));
+ }
+}
diff --git a/gst-libs/gst/interfaces/mixer.h b/gst-libs/gst/interfaces/mixer.h
new file mode 100644
index 0000000..ca7f301
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixer.h
@@ -0,0 +1,240 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixer.h: mixer interface design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_MIXER_H__
+#define __GST_MIXER_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/mixeroptions.h>
+#include <gst/interfaces/mixertrack.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+
+G_BEGIN_DECLS
+
+/* FIXME 0.11: remove all CLASS bits, this is an interface */
+
+#define GST_TYPE_MIXER \
+ (gst_mixer_get_type ())
+#define GST_MIXER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER, GstMixer))
+#define GST_MIXER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER, GstMixerClass))
+#define GST_IS_MIXER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER))
+#define GST_IS_MIXER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER))
+#define GST_MIXER_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_MIXER, GstMixerClass))
+
+#define GST_MIXER_TYPE(klass) (klass->mixer_type)
+
+typedef struct _GstMixer GstMixer;
+typedef struct _GstMixerClass GstMixerClass;
+
+/**
+ * GstMixerType:
+ * @GST_MIXER_HARDWARE: mixing is implemented with dedicated hardware.
+ * @GST_MIXER_SOFTWARE: mixing is implemented via software processing.
+ *
+ * Mixer classification.
+ */
+typedef enum
+{
+ GST_MIXER_HARDWARE,
+ GST_MIXER_SOFTWARE
+} GstMixerType;
+
+/**
+ * GstMixerMessageType:
+ * @GST_MIXER_MESSAGE_INVALID: Not a GstMixer message
+ * @GST_MIXER_MESSAGE_MUTE_TOGGLED: A mute-toggled GstMixer message
+ * @GST_MIXER_MESSAGE_RECORD_TOGGLED: A record-toggled GstMixer message
+ * @GST_MIXER_MESSAGE_VOLUME_CHANGED: A volume-changed GstMixer message
+ * @GST_MIXER_MESSAGE_OPTION_CHANGED: An option-changed GstMixer message
+ * @GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED: An options-list-changed
+ * GstMixer message, posted when the list of available options for a
+ * GstMixerOptions object has changed (Since: 0.10.18)
+ * @GST_MIXER_MESSAGE_MIXER_CHANGED: A mixer-changed GstMixer message, posted
+ * when the list of available mixer tracks has changed. The application
+ * should re-build its interface in this case (Since: 0.10.18)
+ *
+ * An enumeration for the type of a GstMixer message received on the bus
+ *
+ * Since: 0.10.14
+ */
+typedef enum
+{
+ GST_MIXER_MESSAGE_INVALID,
+ GST_MIXER_MESSAGE_MUTE_TOGGLED,
+ GST_MIXER_MESSAGE_RECORD_TOGGLED,
+ GST_MIXER_MESSAGE_VOLUME_CHANGED,
+ GST_MIXER_MESSAGE_OPTION_CHANGED,
+ GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED,
+ GST_MIXER_MESSAGE_MIXER_CHANGED
+} GstMixerMessageType;
+
+/**
+ * GstMixerFlags:
+ * @GST_MIXER_FLAG_NONE: No flags
+ * @GST_MIXER_FLAG_AUTO_NOTIFICATIONS: The mixer implementation automatically
+ * sends notification messages.
+ * @GST_MIXER_FLAG_HAS_WHITELIST: The mixer implementation flags tracks that
+ * should be displayed by default (whitelisted). Since: 0.10.23
+ * @GST_MIXER_FLAG_GROUPING: The mixer implementation will leave some controls
+ * marked without either input or output. Controls marked as input or
+ * output should be grouped with input & output sliders, even if they
+ * are options or bare switches. Since: 0.10.23
+ *
+ * Flags indicating which optional features are supported by a mixer
+ * implementation.
+ *
+ * Since: 0.10.14
+ */
+typedef enum
+{
+ GST_MIXER_FLAG_NONE = 0,
+ GST_MIXER_FLAG_AUTO_NOTIFICATIONS = (1<<0),
+ GST_MIXER_FLAG_HAS_WHITELIST = (1<<1),
+ GST_MIXER_FLAG_GROUPING = (1<<2),
+} GstMixerFlags;
+
+struct _GstMixerClass {
+ GTypeInterface klass;
+
+ GstMixerType mixer_type;
+
+ /* virtual functions */
+ const GList * (* list_tracks) (GstMixer *mixer);
+
+ void (* set_volume) (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+ void (* get_volume) (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+
+ void (* set_mute) (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute);
+ void (* set_record) (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record);
+#ifndef GST_DISABLE_DEPRECATED
+ /* signals (deprecated) */
+ void (* mute_toggled) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gboolean mute);
+ void (* record_toggled) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gboolean record);
+ void (* volume_changed) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gint *volumes);
+#else
+ gpointer padding1[3];
+#endif /* not GST_DISABLE_DEPRECATED */
+
+ void (* set_option) (GstMixer *mixer,
+ GstMixerOptions *opts,
+ gchar *value);
+ const gchar * (* get_option) (GstMixer *mixer,
+ GstMixerOptions *opts);
+
+#ifndef GST_DISABLE_DEPRECATED
+ void (* option_changed) (GstMixer *mixer,
+ GstMixerOptions *opts,
+ gchar *option);
+#else
+ gpointer padding2;
+#endif /* not GST_DISABLE_DEPRECATED */
+
+ GstMixerFlags (* get_mixer_flags) (GstMixer *mixer);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING-1];
+};
+
+GType gst_mixer_get_type (void);
+
+/* virtual class function wrappers */
+const GList * gst_mixer_list_tracks (GstMixer *mixer);
+void gst_mixer_set_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+void gst_mixer_get_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+void gst_mixer_set_mute (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute);
+void gst_mixer_set_record (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record);
+void gst_mixer_set_option (GstMixer *mixer,
+ GstMixerOptions *opts,
+ gchar *value);
+const gchar * gst_mixer_get_option (GstMixer *mixer,
+ GstMixerOptions *opts);
+
+/* trigger bus messages */
+void gst_mixer_mute_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute);
+void gst_mixer_record_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record);
+void gst_mixer_volume_changed (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+void gst_mixer_option_changed (GstMixer *mixer,
+ GstMixerOptions *opts,
+ const gchar *value);
+
+void gst_mixer_mixer_changed (GstMixer *mixer);
+
+void gst_mixer_options_list_changed (GstMixer *mixer,
+ GstMixerOptions *opts);
+
+GstMixerType gst_mixer_get_mixer_type (GstMixer *mixer);
+
+GstMixerFlags gst_mixer_get_mixer_flags (GstMixer *mixer);
+
+/* Functions for recognising and parsing GstMixerMessages on the bus */
+GstMixerMessageType gst_mixer_message_get_type (GstMessage *message);
+void gst_mixer_message_parse_mute_toggled (GstMessage *message,
+ GstMixerTrack **track,
+ gboolean *mute);
+void gst_mixer_message_parse_record_toggled (GstMessage *message,
+ GstMixerTrack **track,
+ gboolean *record);
+void gst_mixer_message_parse_volume_changed (GstMessage *message,
+ GstMixerTrack **track,
+ gint **volumes,
+ gint *num_channels);
+void gst_mixer_message_parse_option_changed (GstMessage *message,
+ GstMixerOptions **options,
+ const gchar **value);
+void gst_mixer_message_parse_options_list_changed (GstMessage *message,
+ GstMixerOptions **options);
+
+G_END_DECLS
+
+#endif /* __GST_MIXER_H__ */
diff --git a/gst-libs/gst/interfaces/mixeroptions.c b/gst-libs/gst/interfaces/mixeroptions.c
new file mode 100644
index 0000000..01b75b4
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixeroptions.c
@@ -0,0 +1,146 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixeroptions.c: mixer track options object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstmixeroptions
+ * @short_description: Multi-option mixer control
+ * @see_also: GstMixer, GstMixerTrack
+ *
+ * Mixer control object that allows switching between multiple options.
+ * Note that <classname>GstMixerOptions</classname> is a subclass of
+ * <classname>GstMixerTrack</classname>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "mixeroptions.h"
+
+#if 0
+enum
+{
+ /* FILL ME */
+ SIGNAL_OPTION_CHANGED,
+ LAST_SIGNAL
+};
+static guint signals[LAST_SIGNAL] = { 0 };
+#endif
+
+static void gst_mixer_options_class_init (GstMixerOptionsClass * klass);
+static void gst_mixer_options_init (GstMixerOptions * mixer);
+static void gst_mixer_options_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+
+GType
+gst_mixer_options_get_type (void)
+{
+ static GType gst_mixer_options_type = 0;
+
+ if (!gst_mixer_options_type) {
+ static const GTypeInfo mixer_options_info = {
+ sizeof (GstMixerOptionsClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_mixer_options_class_init,
+ NULL,
+ NULL,
+ sizeof (GstMixerOptions),
+ 0,
+ (GInstanceInitFunc) gst_mixer_options_init,
+ NULL
+ };
+
+ gst_mixer_options_type =
+ g_type_register_static (GST_TYPE_MIXER_TRACK,
+ "GstMixerOptions", &mixer_options_info, 0);
+ }
+
+ return gst_mixer_options_type;
+}
+
+static void
+gst_mixer_options_class_init (GstMixerOptionsClass * klass)
+{
+ GObjectClass *object_klass = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+#if 0
+ signals[SIGNAL_OPTION_CHANGED] =
+ g_signal_new ("option_changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerOptionsClass, option_changed),
+ NULL, NULL, g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
+#endif
+
+ object_klass->dispose = gst_mixer_options_dispose;
+}
+
+static void
+gst_mixer_options_init (GstMixerOptions * mixer_options)
+{
+ mixer_options->values = NULL;
+}
+
+/**
+ * gst_mixer_options_get_values:
+ * @mixer_options: The #GstMixerOptions item that owns the values.
+ *
+ * Get the values for the mixer option.
+ *
+ * Returns: A list of strings with all the possible values for the mixer
+ * option. You must not free or modify the list or its contents, it belongs
+ * to the @mixer_options object.
+ */
+GList *
+gst_mixer_options_get_values (GstMixerOptions * mixer_options)
+{
+ GstMixerOptionsClass *klass;
+ GList *ret = NULL;
+
+ g_return_val_if_fail (GST_IS_MIXER_OPTIONS (mixer_options), NULL);
+
+ klass = GST_MIXER_OPTIONS_GET_CLASS (mixer_options);
+
+ if (klass->get_values != NULL) {
+ ret = klass->get_values (mixer_options);
+ } else {
+ ret = mixer_options->values;
+ }
+
+ return ret;
+}
+
+
+static void
+gst_mixer_options_dispose (GObject * object)
+{
+ GstMixerOptions *opts = GST_MIXER_OPTIONS (object);
+
+ g_list_foreach (opts->values, (GFunc) g_free, NULL);
+ g_list_free (opts->values);
+ opts->values = NULL;
+
+ if (parent_class->dispose)
+ parent_class->dispose (object);
+}
diff --git a/gst-libs/gst/interfaces/mixeroptions.h b/gst-libs/gst/interfaces/mixeroptions.h
new file mode 100644
index 0000000..9b65bb1
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixeroptions.h
@@ -0,0 +1,94 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixeroptions.h: mixer track options object
+ * This should be a subclass of MixerItem, along with MixerOptions,
+ * but that's not possible because of API/ABI in 0.8.x. 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_MIXER_OPTIONS_H__
+#define __GST_MIXER_OPTIONS_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/mixertrack.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_MIXER_OPTIONS \
+ (gst_mixer_options_get_type ())
+#define GST_MIXER_OPTIONS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER_OPTIONS, \
+ GstMixerOptions))
+#define GST_MIXER_OPTIONS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MIXER_OPTIONS, GstMixerOptionsClass))
+#define GST_MIXER_OPTIONS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER_OPTIONS, \
+ GstMixerOptionsClass))
+#define GST_IS_MIXER_OPTIONS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER_OPTIONS))
+#define GST_IS_MIXER_OPTIONS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER_OPTIONS))
+
+typedef struct _GstMixerOptions GstMixerOptions;
+typedef struct _GstMixerOptionsClass GstMixerOptionsClass;
+
+/**
+ * GstMixerOptions:
+ * @values: List of option strings. Do not access this member directly,
+ * always use gst_mixer_options_get_values() instead.
+ *
+ * Mixer control object.
+ */
+struct _GstMixerOptions {
+ GstMixerTrack parent;
+
+ /*< public >*/
+ /* list of strings (do not access directly) (FIXME 0.11: make private) */
+ GList *values;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstMixerOptionsClass:
+ * @parent: the parent interface
+ * @get_values: Optional implementation of gst_mixer_options_get_values().
+ * (Since: 0.10.18)
+ */
+struct _GstMixerOptionsClass {
+ GstMixerTrackClass parent;
+
+#ifdef GST_MIXER_NEED_DEPRECATED
+ /* signals */
+ void (* option_changed) (GstMixerOptions *opts,
+ gchar *value);
+#endif /* GST_MIXER_NEED_DEPRECATED */
+
+ GList * (* get_values) (GstMixerOptions *opts);
+
+ gpointer _gst_reserved[GST_PADDING-1];
+};
+
+GType gst_mixer_options_get_type (void);
+
+GList * gst_mixer_options_get_values (GstMixerOptions *mixer_options);
+
+G_END_DECLS
+
+#endif /* __GST_MIXER_OPTIONS_H__ */
diff --git a/gst-libs/gst/interfaces/mixertrack.c b/gst-libs/gst/interfaces/mixertrack.c
new file mode 100644
index 0000000..c4bef1c
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixertrack.c
@@ -0,0 +1,288 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixertrack.c: mixer track object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstmixertrack
+ * @short_description: Basic mixer control object (volume slider, switch)
+ * @see_also: GstMixer, GstMixerOptions
+ *
+ * Basic mixer control object (note that it is a GObject and not a GstObject).
+ *
+ * A mixer track represents a single slider control of none, one or more
+ * channels. A mixer track with no channels is usually interpreted as a
+ * on/off switch control.
+ *
+ * Note the presence of both min_volume and max_volume fields. Applications
+ * must not assume that min_volume is 0 or max_volume is any particular
+ * value.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "mixertrack.h"
+#if 0
+enum
+{
+ /* FILL ME */
+ SIGNAL_VOLUME_CHANGED,
+ SIGNAL_RECORD_TOGGLED,
+ SIGNAL_MUTE_TOGGLED,
+ LAST_SIGNAL
+};
+static guint signals[LAST_SIGNAL] = { 0 };
+#endif
+
+enum
+{
+ ARG_0,
+ ARG_LABEL,
+ ARG_UNTRANSLATED_LABEL,
+ ARG_INDEX,
+ ARG_MIN_VOLUME,
+ ARG_MAX_VOLUME,
+ ARG_FLAGS,
+ ARG_NUM_CHANNELS
+};
+
+static void gst_mixer_track_class_init (GstMixerTrackClass * klass);
+static void gst_mixer_track_init (GstMixerTrack * mixer);
+static void gst_mixer_track_dispose (GObject * object);
+
+static void gst_mixer_track_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_mixer_track_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+
+static GObjectClass *parent_class = NULL;
+
+GType
+gst_mixer_track_get_type (void)
+{
+ static GType gst_mixer_track_type = 0;
+
+ if (!gst_mixer_track_type) {
+ static const GTypeInfo mixer_track_info = {
+ sizeof (GstMixerTrackClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_mixer_track_class_init,
+ NULL,
+ NULL,
+ sizeof (GstMixerTrack),
+ 0,
+ (GInstanceInitFunc) gst_mixer_track_init,
+ NULL
+ };
+
+ gst_mixer_track_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "GstMixerTrack", &mixer_track_info, 0);
+ }
+
+ return gst_mixer_track_type;
+}
+
+static void
+gst_mixer_track_class_init (GstMixerTrackClass * klass)
+{
+ GObjectClass *object_klass = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_klass->get_property = gst_mixer_track_get_property;
+ object_klass->set_property = gst_mixer_track_set_property;
+
+ g_object_class_install_property (object_klass, ARG_LABEL,
+ g_param_spec_string ("label", "Track label",
+ "The label assigned to the track (may be translated)", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstMixerTrack:untranslated-label
+ *
+ * The untranslated label of the mixer track, if available. Mixer track
+ * implementations must set this at construct time. Applications may find
+ * this useful to determine icons for various kind of tracks. However,
+ * applications mustn't make any assumptions about the naming of tracks,
+ * the untranslated labels are purely informational and may change.
+ *
+ * Since: 0.10.13
+ **/
+ g_object_class_install_property (object_klass, ARG_UNTRANSLATED_LABEL,
+ g_param_spec_string ("untranslated-label", "Untranslated track label",
+ "The untranslated label assigned to the track (since 0.10.13)",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstMixerTrack:index
+ *
+ * Index of the mixer track, if available. Mixer track implementations
+ * must set this at construct time. This can be used to discern between
+ * multiple tracks with identical labels.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (object_klass, ARG_INDEX,
+ g_param_spec_uint ("index", "Index",
+ "Track index", 0, G_MAXUINT,
+ 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (object_klass, ARG_MIN_VOLUME,
+ g_param_spec_int ("min-volume", "Minimum volume level",
+ "The minimum possible volume level", G_MININT, G_MAXINT,
+ 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_klass, ARG_MAX_VOLUME,
+ g_param_spec_int ("max-volume", "Maximum volume level",
+ "The maximum possible volume level", G_MININT, G_MAXINT,
+ 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_klass, ARG_FLAGS,
+ g_param_spec_uint ("flags", "Flags",
+ "Flags indicating the type of mixer track",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_klass, ARG_NUM_CHANNELS,
+ g_param_spec_int ("num-channels", "Number of channels",
+ "The number of channels contained within the track",
+ 0, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+#if 0
+ signals[SIGNAL_RECORD_TOGGLED] =
+ g_signal_new ("record_toggled", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerTrackClass,
+ record_toggled),
+ NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+ signals[SIGNAL_MUTE_TOGGLED] =
+ g_signal_new ("mute_toggled", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerTrackClass,
+ mute_toggled),
+ NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+ signals[SIGNAL_VOLUME_CHANGED] =
+ g_signal_new ("volume_changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerTrackClass,
+ volume_changed),
+ NULL, NULL, g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1, G_TYPE_POINTER);
+#endif
+
+ object_klass->dispose = gst_mixer_track_dispose;
+}
+
+static void
+gst_mixer_track_init (GstMixerTrack * mixer_track)
+{
+ mixer_track->label = NULL;
+ mixer_track->min_volume = mixer_track->max_volume = 0;
+ mixer_track->flags = 0;
+ mixer_track->num_channels = 0;
+}
+
+/* FIXME 0.11: move these as members into the mixer track structure */
+#define MIXER_TRACK_OBJECT_DATA_KEY_UNTRANSLATED_LABEL "gst-mixer-track-ulabel"
+#define MIXER_TRACK_OBJECT_DATA_KEY_INDEX "index"
+
+static void
+gst_mixer_track_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstMixerTrack *mixer_track;
+
+ mixer_track = GST_MIXER_TRACK (object);
+
+ switch (prop_id) {
+ case ARG_LABEL:
+ g_value_set_string (value, mixer_track->label);
+ break;
+ case ARG_UNTRANSLATED_LABEL:
+ g_value_set_string (value,
+ (const gchar *) g_object_get_data (G_OBJECT (mixer_track),
+ MIXER_TRACK_OBJECT_DATA_KEY_UNTRANSLATED_LABEL));
+ break;
+ case ARG_INDEX:
+ g_value_set_uint (value,
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (mixer_track),
+ MIXER_TRACK_OBJECT_DATA_KEY_INDEX)));
+ break;
+ case ARG_MIN_VOLUME:
+ g_value_set_int (value, mixer_track->min_volume);
+ break;
+ case ARG_MAX_VOLUME:
+ g_value_set_int (value, mixer_track->max_volume);
+ break;
+ case ARG_FLAGS:
+ g_value_set_uint (value, (guint32) mixer_track->flags);
+ break;
+ case ARG_NUM_CHANNELS:
+ g_value_set_int (value, mixer_track->num_channels);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_mixer_track_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstMixerTrack *mixer_track;
+
+ mixer_track = GST_MIXER_TRACK (object);
+
+ switch (prop_id) {
+ case ARG_UNTRANSLATED_LABEL:
+ g_object_set_data_full (G_OBJECT (mixer_track),
+ MIXER_TRACK_OBJECT_DATA_KEY_UNTRANSLATED_LABEL,
+ g_value_dup_string (value), (GDestroyNotify) g_free);
+ break;
+ case ARG_INDEX:
+ g_object_set_data (G_OBJECT (mixer_track),
+ MIXER_TRACK_OBJECT_DATA_KEY_INDEX,
+ GINT_TO_POINTER (g_value_get_uint (value)));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_mixer_track_dispose (GObject * object)
+{
+ GstMixerTrack *channel = GST_MIXER_TRACK (object);
+
+ if (channel->label) {
+ g_free (channel->label);
+ channel->label = NULL;
+ }
+
+ if (parent_class->dispose)
+ parent_class->dispose (object);
+}
diff --git a/gst-libs/gst/interfaces/mixertrack.h b/gst-libs/gst/interfaces/mixertrack.h
new file mode 100644
index 0000000..33296b9
--- /dev/null
+++ b/gst-libs/gst/interfaces/mixertrack.h
@@ -0,0 +1,134 @@
+/* GStreamer Mixer
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * mixertrack.h: mixer track 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.
+ */
+
+#ifndef __GST_MIXER_TRACK_H__
+#define __GST_MIXER_TRACK_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_MIXER_TRACK \
+ (gst_mixer_track_get_type ())
+#define GST_MIXER_TRACK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER_TRACK, \
+ GstMixerTrack))
+#define GST_MIXER_TRACK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER_TRACK, \
+ GstMixerTrackClass))
+#define GST_IS_MIXER_TRACK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER_TRACK))
+#define GST_IS_MIXER_TRACK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER_TRACK))
+
+/*
+ * Naming:
+ *
+ * A track is a single input/output stream (e.g. line-in,
+ * microphone, etc.). Channels are then single streams
+ * within a track. A mono stream has one channel, a stereo
+ * stream has two, etc.
+ *
+ * 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. A track
+ * flagged as master is the master volume track on this
+ * mixer, which means that setting this track will change
+ * the hearable volume on any output.
+ */
+/**
+ * GstMixerTrackFlags:
+ * @GST_MIXER_TRACK_INPUT: mixer track is for input
+ * @GST_MIXER_TRACK_OUTPUT: mixer track is for output
+ * @GST_MIXER_TRACK_MUTE: input or output is muted
+ * @GST_MIXER_TRACK_RECORD: input is audible in speakers attached to output
+ * (for #GST_MIXER_TRACK_INPUT mixer tracks only)
+ * @GST_MIXER_TRACK_MASTER: this mixer track is likely to be the master control
+ * @GST_MIXER_TRACK_SOFTWARE: mixer track's' volume control is implemented
+ * in software (as opposed to a hardware control)
+ * @GST_MIXER_TRACK_NO_RECORD: input track lacks support for recordable.
+ * Since: 0.10.23
+ * @GST_MIXER_TRACK_NO_MUTE: play track doesn't support mute. Since: 0.10.23
+ * @GST_MIXER_TRACK_WHITELIST: track should be displayed "by default" in apps.
+ * Since: 0.10.23
+ * @GST_MIXER_TRACK_READONLY: track is read-only. Since: 0.10.25
+ * @GST_MIXER_TRACK_WRITEONLY: track is write-only. Since: 0.10.25
+ *
+ * Mixer track flags.
+ */
+typedef enum {
+ GST_MIXER_TRACK_INPUT = (1<<0),
+ GST_MIXER_TRACK_OUTPUT = (1<<1),
+ GST_MIXER_TRACK_MUTE = (1<<2),
+ GST_MIXER_TRACK_RECORD = (1<<3),
+ GST_MIXER_TRACK_MASTER = (1<<4),
+ GST_MIXER_TRACK_SOFTWARE = (1<<5),
+ GST_MIXER_TRACK_NO_RECORD = (1<<6),
+ GST_MIXER_TRACK_NO_MUTE = (1<<7),
+ GST_MIXER_TRACK_WHITELIST = (1<<8),
+ GST_MIXER_TRACK_READONLY = (1<<9),
+ GST_MIXER_TRACK_WRITEONLY = (1<<10)
+} GstMixerTrackFlags;
+
+/* FIXME 0.11: READONLY/WRITEONLY -> READABLE/WRITABLE etc. */
+
+#define GST_MIXER_TRACK_HAS_FLAG(channel, flag) \
+ ((channel)->flags & flag)
+
+typedef struct _GstMixerTrack GstMixerTrack;
+typedef struct _GstMixerTrackClass GstMixerTrackClass;
+
+struct _GstMixerTrack {
+ GObject parent;
+
+ gchar *label;
+
+ /* FIXME 0.11: flags should be guint32 */
+ GstMixerTrackFlags flags;
+
+ gint num_channels;
+ gint min_volume;
+ gint max_volume;
+
+ /* FIXME 0.11: add padding */
+};
+
+struct _GstMixerTrackClass {
+ GObjectClass parent;
+
+#ifdef GST_MIXER_NEED_DEPRECATED
+ /* signals (deprecated) */
+ void (* mute_toggled) (GstMixerTrack *channel,
+ gboolean mute);
+ void (* record_toggled) (GstMixerTrack *channel,
+ gboolean record);
+ void (* volume_changed) (GstMixerTrack *channel,
+ gint *volumes);
+#endif /* GST_MIXER_NEED_DEPRECATED */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_mixer_track_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_MIXER_TRACK_H__ */
diff --git a/gst-libs/gst/interfaces/navigation.c b/gst-libs/gst/interfaces/navigation.c
new file mode 100644
index 0000000..207bc07
--- /dev/null
+++ b/gst-libs/gst/interfaces/navigation.c
@@ -0,0 +1,848 @@
+/* GStreamer Navigation
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2007-2009 Jan Schmidt <thaytan@noraisin.net>
+ *
+ * navigation.c: navigation event virtual class function wrappers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstnavigation
+ * @short_description: Interface for creating, sending and parsing navigation
+ * events.
+ *
+ * The Navigation interface is used for creating and injecting navigation related
+ * events such as mouse button presses, cursor motion and key presses. The associated
+ * library also provides methods for parsing received events, and for sending and
+ * receiving navigation related bus events. One main usecase is DVD menu navigation.
+ *
+ * The main parts of the API are:
+ * <itemizedlist>
+ * <listitem>
+ * <para>
+ * The GstNavigation interface, implemented by elements which provide an application
+ * with the ability to create and inject navigation events into the pipeline.
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * GstNavigation event handling API. GstNavigation events are created in response to
+ * calls on a GstNavigation interface implementation, and sent in the pipeline. Upstream
+ * elements can use the navigation event API functions to parse the contents of received
+ * messages.
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * GstNavigation message handling API. GstNavigation messages may be sent on the message
+ * bus to inform applications of navigation related changes in the pipeline, such as the
+ * mouse moving over a clickable region, or the set of available angles changing.
+ * </para><para>
+ * The GstNavigation message functions provide functions for creating and parsing
+ * custom bus messages for signalling GstNavigation changes.
+ * </para>
+ * </listitem>
+ * </itemizedlist>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/interfaces/navigation.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+
+static void gst_navigation_class_init (GstNavigationInterface * iface);
+
+#define GST_NAVIGATION_MESSAGE_NAME "GstNavigationMessage"
+#define GST_NAVIGATION_QUERY_NAME "GstNavigationQuery"
+#define GST_NAVIGATION_EVENT_NAME "application/x-gst-navigation"
+
+#define WARN_IF_FAIL(exp,msg) if(G_UNLIKELY(!(exp))){g_warning("%s",(msg));}
+
+GType
+gst_navigation_get_type (void)
+{
+ static GType gst_navigation_type = 0;
+
+ if (!gst_navigation_type) {
+ static const GTypeInfo gst_navigation_info = {
+ sizeof (GstNavigationInterface),
+ (GBaseInitFunc) gst_navigation_class_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_navigation_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstNavigation", &gst_navigation_info, 0);
+ }
+
+ return gst_navigation_type;
+}
+
+static void
+gst_navigation_class_init (GstNavigationInterface * iface)
+{
+ /* default virtual functions */
+ iface->send_event = NULL;
+}
+
+/* The interface implementer should make sure that the object can handle
+ * the event. */
+void
+gst_navigation_send_event (GstNavigation * navigation, GstStructure * structure)
+{
+ GstNavigationInterface *iface = GST_NAVIGATION_GET_IFACE (navigation);
+
+ if (iface->send_event) {
+ iface->send_event (navigation, structure);
+ }
+}
+
+/**
+ * gst_navigation_send_key_event:
+ * @navigation: The navigation interface instance
+ * @event: The type of the key event. Recognised values are "key-press" and
+ * "key-release"
+ * @key: Character representation of the key. This is typically as produced
+ * by XKeysymToString.
+ */
+void
+gst_navigation_send_key_event (GstNavigation * navigation, const char *event,
+ const char *key)
+{
+ gst_navigation_send_event (navigation,
+ gst_structure_new (GST_NAVIGATION_EVENT_NAME, "event", G_TYPE_STRING,
+ event, "key", G_TYPE_STRING, key, NULL));
+}
+
+/**
+ * gst_navigation_send_mouse_event:
+ * @navigation: The navigation interface instance
+ * @event: The type of mouse event, as a text string. Recognised values are
+ * "mouse-button-press", "mouse-button-release" and "mouse-move".
+ * @button: The button number of the button being pressed or released. Pass 0
+ * for mouse-move events.
+ * @x: The x coordinate of the mouse event.
+ * @y: The y coordinate of the mouse event.
+ *
+ * Sends a mouse event to the navigation interface. Mouse event coordinates
+ * are sent relative to the display space of the related output area. This is
+ * usually the size in pixels of the window associated with the element
+ * implementing the #GstNavigation interface.
+ *
+ */
+void
+gst_navigation_send_mouse_event (GstNavigation * navigation, const char *event,
+ int button, double x, double y)
+{
+ gst_navigation_send_event (navigation,
+ gst_structure_new (GST_NAVIGATION_EVENT_NAME, "event", G_TYPE_STRING,
+ event, "button", G_TYPE_INT, button, "pointer_x", G_TYPE_DOUBLE, x,
+ "pointer_y", G_TYPE_DOUBLE, y, NULL));
+}
+
+/**
+ * gst_navigation_send_command:
+ * @navigation: The navigation interface instance
+ * @command: The command to issue
+ *
+ * Sends the indicated command to the navigation interface.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_navigation_send_command (GstNavigation * navigation,
+ GstNavigationCommand command)
+{
+ gst_navigation_send_event (navigation,
+ gst_structure_new (GST_NAVIGATION_EVENT_NAME, "event", G_TYPE_STRING,
+ "command", "command-code", G_TYPE_UINT, (guint) command, NULL));
+}
+
+/* Navigation Queries */
+
+#define GST_NAVIGATION_QUERY_HAS_TYPE(query,query_type) \
+(gst_navigation_query_get_type (query) == GST_NAVIGATION_QUERY_ ## query_type)
+
+/**
+ * gst_navigation_query_get_type:
+ * @query: The query to inspect
+ *
+ * Inspect a #GstQuery and return the #GstNavigationQueryType associated with
+ * it if it is a #GstNavigation query.
+ *
+ * Returns: The #GstNavigationQueryType of the query, or
+ * #GST_NAVIGATION_QUERY_INVALID
+ * Since: 0.10.23
+ */
+GstNavigationQueryType
+gst_navigation_query_get_type (GstQuery * query)
+{
+ const GstStructure *s;
+ const gchar *q_type;
+
+ if (query == NULL || GST_QUERY_TYPE (query) != GST_QUERY_CUSTOM)
+ return GST_NAVIGATION_QUERY_INVALID;
+
+ s = gst_query_get_structure (query);
+ if (s == NULL || !gst_structure_has_name (s, GST_NAVIGATION_QUERY_NAME))
+ return GST_NAVIGATION_QUERY_INVALID;
+
+ q_type = gst_structure_get_string (s, "type");
+ if (q_type == NULL)
+ return GST_NAVIGATION_QUERY_INVALID;
+
+ if (g_str_equal (q_type, "commands"))
+ return GST_NAVIGATION_QUERY_COMMANDS;
+ else if (g_str_equal (q_type, "angles"))
+ return GST_NAVIGATION_QUERY_ANGLES;
+
+ return GST_NAVIGATION_QUERY_INVALID;
+}
+
+/**
+ * gst_navigation_query_new_commands:
+ *
+ * Create a new #GstNavigation commands query. When executed, it will
+ * query the pipeline for the set of currently available commands.
+ *
+ * Returns: The new query.
+ * Since: 0.10.23
+ */
+GstQuery *
+gst_navigation_query_new_commands (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_new (GST_NAVIGATION_QUERY_NAME,
+ "type", G_TYPE_STRING, "commands", NULL);
+ query = gst_query_new_custom (GST_QUERY_CUSTOM, structure);
+
+ return query;
+}
+
+static void
+gst_query_list_add_command (GValue * list, GstNavigationCommand val)
+{
+ GValue item = { 0, };
+
+ g_value_init (&item, GST_TYPE_NAVIGATION_COMMAND);
+ g_value_set_enum (&item, val);
+ gst_value_list_append_value (list, &item);
+ g_value_unset (&item);
+}
+
+/**
+ * gst_navigation_query_set_commands:
+ * @query: a #GstQuery
+ * @n_cmds: the number of commands to set.
+ * @...: A list of @GstNavigationCommand values, @n_cmds entries long.
+ *
+ * Set the #GstNavigation command query result fields in @query. The number
+ * of commands passed must be equal to @n_commands.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_navigation_query_set_commands (GstQuery * query, gint n_cmds, ...)
+{
+ va_list ap;
+ GValue list = { 0, };
+ GstStructure *structure;
+ gint i;
+
+ g_return_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, COMMANDS));
+
+ g_value_init (&list, GST_TYPE_LIST);
+
+ va_start (ap, n_cmds);
+ for (i = 0; i < n_cmds; i++) {
+ GstNavigationCommand val = va_arg (ap, GstNavigationCommand);
+ gst_query_list_add_command (&list, val);
+ }
+ va_end (ap);
+
+ structure = gst_query_writable_structure (query);
+ gst_structure_set_value (structure, "commands", &list);
+
+ g_value_unset (&list);
+}
+
+/**
+ * gst_navigation_query_set_commandsv:
+ * @query: a #GstQuery
+ * @n_cmds: the number of commands to set.
+ * @cmds: An array containing @n_cmds @GstNavigationCommand values.
+ *
+ * Set the #GstNavigation command query result fields in @query. The number
+ * of commands passed must be equal to @n_commands.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_navigation_query_set_commandsv (GstQuery * query, gint n_cmds,
+ GstNavigationCommand * cmds)
+{
+ GValue list = { 0, };
+ GstStructure *structure;
+ gint i;
+
+ g_return_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, COMMANDS));
+
+ g_value_init (&list, GST_TYPE_LIST);
+ for (i = 0; i < n_cmds; i++) {
+ gst_query_list_add_command (&list, cmds[i]);
+ }
+ structure = gst_query_writable_structure (query);
+ gst_structure_set_value (structure, "commands", &list);
+
+ g_value_unset (&list);
+}
+
+/**
+ * gst_navigation_query_parse_commands_length:
+ * @query: a #GstQuery
+ * @n_cmds: the number of commands in this query.
+ *
+ * Parse the number of commands in the #GstNavigation commands @query.
+ *
+ * Returns: %TRUE if the query could be successfully parsed. %FALSE if not.
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_query_parse_commands_length (GstQuery * query, guint * n_cmds)
+{
+ const GstStructure *structure;
+ const GValue *list;
+
+ g_return_val_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, COMMANDS), FALSE);
+
+ if (n_cmds == NULL)
+ return TRUE;
+
+ structure = gst_query_get_structure (query);
+ list = gst_structure_get_value (structure, "commands");
+ if (list == NULL)
+ *n_cmds = 0;
+ else
+ *n_cmds = gst_value_list_get_size (list);
+
+ return TRUE;
+}
+
+/**
+ * gst_navigation_query_parse_commands_nth:
+ * @query: a #GstQuery
+ * @nth: the nth command to retrieve.
+ * @cmd: a pointer to store the nth command into.
+ *
+ * Parse the #GstNavigation command query and retrieve the @nth command from
+ * it into @cmd. If the list contains less elements than @nth, @cmd will be
+ * set to #GST_NAVIGATION_COMMAND_INVALID.
+ *
+ * Returns: %TRUE if the query could be successfully parsed. %FALSE if not.
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_query_parse_commands_nth (GstQuery * query, guint nth,
+ GstNavigationCommand * cmd)
+{
+ const GstStructure *structure;
+ const GValue *list;
+
+ g_return_val_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, COMMANDS), FALSE);
+
+ if (cmd == NULL)
+ return TRUE;
+
+ structure = gst_query_get_structure (query);
+ list = gst_structure_get_value (structure, "commands");
+ if (list == NULL) {
+ *cmd = GST_NAVIGATION_COMMAND_INVALID;
+ } else {
+ if (nth < gst_value_list_get_size (list)) {
+ *cmd = (GstNavigationCommand)
+ g_value_get_enum (gst_value_list_get_value (list, nth));
+ } else
+ *cmd = GST_NAVIGATION_COMMAND_INVALID;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_navigation_query_new_angles:
+ *
+ * Create a new #GstNavigation angles query. When executed, it will
+ * query the pipeline for the set of currently available angles, which may be
+ * greater than one in a multiangle video.
+ *
+ * Returns: The new query.
+ * Since: 0.10.23
+ */
+GstQuery *
+gst_navigation_query_new_angles (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_new (GST_NAVIGATION_QUERY_NAME,
+ "type", G_TYPE_STRING, "angles", NULL);
+ query = gst_query_new_custom (GST_QUERY_CUSTOM, structure);
+
+ return query;
+}
+
+/**
+ * gst_navigation_query_set_angles:
+ * @query: a #GstQuery
+ * @cur_angle: the current viewing angle to set.
+ * @n_angles: the number of viewing angles to set.
+ *
+ * Set the #GstNavigation angles query result field in @query.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_navigation_query_set_angles (GstQuery * query, guint cur_angle,
+ guint n_angles)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, ANGLES));
+
+ structure = gst_query_writable_structure (query);
+ gst_structure_set (structure,
+ "angle", G_TYPE_UINT, cur_angle, "angles", G_TYPE_UINT, n_angles, NULL);
+}
+
+/**
+ * gst_navigation_query_parse_angles:
+ * @query: a #GstQuery
+ * @cur_angle: Pointer to a #guint into which to store the currently selected
+ * angle value from the query, or NULL
+ * @n_angles: Pointer to a #guint into which to store the number of angles
+ * value from the query, or NULL
+ *
+ * Parse the current angle number in the #GstNavigation angles @query into the
+ * #guint pointed to by the @cur_angle variable, and the number of available
+ * angles into the #guint pointed to by the @n_angles variable.
+ *
+ * Returns: %TRUE if the query could be successfully parsed. %FALSE if not.
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_query_parse_angles (GstQuery * query, guint * cur_angle,
+ guint * n_angles)
+{
+ const GstStructure *structure;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (GST_NAVIGATION_QUERY_HAS_TYPE (query, ANGLES), FALSE);
+
+ structure = gst_query_get_structure (query);
+
+ if (cur_angle)
+ ret &= gst_structure_get_uint (structure, "angle", cur_angle);
+
+ if (n_angles)
+ ret &= gst_structure_get_uint (structure, "angles", n_angles);
+
+ WARN_IF_FAIL (ret, "Couldn't extract details from angles query");
+
+ return ret;
+}
+
+/* Navigation Messages */
+
+#define GST_NAVIGATION_MESSAGE_HAS_TYPE(msg,msg_type) \
+(gst_navigation_message_get_type (msg) == GST_NAVIGATION_MESSAGE_ ## msg_type)
+
+/**
+ * gst_navigation_message_get_type:
+ * @message: A #GstMessage to inspect.
+ *
+ * Check a bus message to see if it is a #GstNavigation event, and return
+ * the #GstNavigationMessageType identifying the type of the message if so.
+ *
+ * Returns: The type of the #GstMessage, or
+ * #GST_NAVIGATION_MESSAGE_INVALID if the message is not a #GstNavigation
+ * notification.
+ *
+ * Since: 0.10.23
+ */
+GstNavigationMessageType
+gst_navigation_message_get_type (GstMessage * message)
+{
+ const GstStructure *s;
+ const gchar *m_type;
+
+ if (message == NULL || GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
+ return GST_NAVIGATION_MESSAGE_INVALID;
+
+ s = gst_message_get_structure (message);
+ if (s == NULL || !gst_structure_has_name (s, GST_NAVIGATION_MESSAGE_NAME))
+ return GST_NAVIGATION_MESSAGE_INVALID;
+
+ m_type = gst_structure_get_string (s, "type");
+ if (m_type == NULL)
+ return GST_NAVIGATION_MESSAGE_INVALID;
+
+ if (g_str_equal (m_type, "mouse-over"))
+ return GST_NAVIGATION_MESSAGE_MOUSE_OVER;
+ else if (g_str_equal (m_type, "commands-changed"))
+ return GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED;
+ else if (g_str_equal (m_type, "angles-changed"))
+ return GST_NAVIGATION_MESSAGE_ANGLES_CHANGED;
+
+ return GST_NAVIGATION_MESSAGE_INVALID;
+}
+
+/**
+ * gst_navigation_message_new_mouse_over:
+ * @src: A #GstObject to set as source of the new message.
+ * @active: %TRUE if the mouse has entered a clickable area of the display.
+ * %FALSE if it over a non-clickable area.
+ *
+ * Creates a new #GstNavigation message with type
+ * #GST_NAVIGATION_MESSAGE_MOUSE_OVER.
+ *
+ * Returns: The new #GstMessage.
+ * Since: 0.10.23
+ */
+GstMessage *
+gst_navigation_message_new_mouse_over (GstObject * src, gboolean active)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ s = gst_structure_new (GST_NAVIGATION_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "mouse-over", "active", G_TYPE_BOOLEAN, active,
+ NULL);
+
+ m = gst_message_new_custom (GST_MESSAGE_ELEMENT, src, s);
+
+ return m;
+}
+
+/**
+ * gst_navigation_message_parse_mouse_over:
+ * @message: A #GstMessage to inspect.
+ * @active: A pointer to a gboolean to receive the active/inactive state,
+ * or NULL.
+ *
+ * Parse a #GstNavigation message of type #GST_NAVIGATION_MESSAGE_MOUSE_OVER
+ * and extract the active/inactive flag. If the mouse over event is marked
+ * active, it indicates that the mouse is over a clickable area.
+ *
+ * Returns: %TRUE if the message could be successfully parsed. %FALSE if not.
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_message_parse_mouse_over (GstMessage * message,
+ gboolean * active)
+{
+ if (!GST_NAVIGATION_MESSAGE_HAS_TYPE (message, MOUSE_OVER))
+ return FALSE;
+
+ if (active) {
+ const GstStructure *s = gst_message_get_structure (message);
+ if (gst_structure_get_boolean (s, "active", active) == FALSE)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_navigation_message_new_commands_changed:
+ * @src: A #GstObject to set as source of the new message.
+ *
+ * Creates a new #GstNavigation message with type
+ * #GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED
+ *
+ * Returns: The new #GstMessage.
+ * Since: 0.10.23
+ */
+GstMessage *
+gst_navigation_message_new_commands_changed (GstObject * src)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ s = gst_structure_new (GST_NAVIGATION_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "commands-changed", NULL);
+
+ m = gst_message_new_custom (GST_MESSAGE_ELEMENT, src, s);
+
+ return m;
+}
+
+/**
+ * gst_navigation_message_new_angles_changed:
+ * @src: A #GstObject to set as source of the new message.
+ * @cur_angle: The currently selected angle.
+ * @n_angles: The number of viewing angles now available.
+ *
+ * Creates a new #GstNavigation message with type
+ * #GST_NAVIGATION_MESSAGE_ANGLES_CHANGED for notifying an application
+ * that the current angle, or current number of angles available in a
+ * multiangle video has changed.
+ *
+ * Returns: The new #GstMessage.
+ * Since: 0.10.23
+ */
+GstMessage *
+gst_navigation_message_new_angles_changed (GstObject * src, guint cur_angle,
+ guint n_angles)
+{
+ GstStructure *s;
+ GstMessage *m;
+
+ s = gst_structure_new (GST_NAVIGATION_MESSAGE_NAME,
+ "type", G_TYPE_STRING, "angles-changed",
+ "angle", G_TYPE_UINT, cur_angle, "angles", G_TYPE_UINT, n_angles, NULL);
+
+ m = gst_message_new_custom (GST_MESSAGE_ELEMENT, src, s);
+
+ return m;
+}
+
+/**
+ * gst_navigation_message_parse_angles_changed:
+ * @message: A #GstMessage to inspect.
+ * @cur_angle: A pointer to a #guint to receive the new current angle number,
+ * or NULL
+ * @n_angles: A pointer to a #guint to receive the new angle count, or NULL.
+ *
+ * Parse a #GstNavigation message of type GST_NAVIGATION_MESSAGE_ANGLES_CHANGED
+ * and extract the @cur_angle and @n_angles parameters.
+ *
+ * Returns: %TRUE if the message could be successfully parsed. %FALSE if not.
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_message_parse_angles_changed (GstMessage * message,
+ guint * cur_angle, guint * n_angles)
+{
+ const GstStructure *s;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (GST_NAVIGATION_MESSAGE_HAS_TYPE (message,
+ ANGLES_CHANGED), FALSE);
+
+ s = gst_message_get_structure (message);
+ if (cur_angle)
+ ret &= gst_structure_get_uint (s, "angle", cur_angle);
+
+ if (n_angles)
+ ret &= gst_structure_get_uint (s, "angles", n_angles);
+
+ WARN_IF_FAIL (ret, "Couldn't extract details from angles-changed event");
+
+ return ret;
+}
+
+#define GST_NAVIGATION_EVENT_HAS_TYPE(event,event_type) \
+(gst_navigation_event_get_type (event) == GST_NAVIGATION_EVENT_ ## event_type)
+
+/**
+ * gst_navigation_event_get_type:
+ * @event: A #GstEvent to inspect.
+ *
+ * Inspect a #GstEvent and return the #GstNavigationEventType of the event, or
+ * #GST_NAVIGATION_EVENT_INVALID if the event is not a #GstNavigation event.
+ *
+ * Since: 0.10.23
+ */
+GstNavigationEventType
+gst_navigation_event_get_type (GstEvent * event)
+{
+ const GstStructure *s;
+ const gchar *e_type;
+
+ if (event == NULL || GST_EVENT_TYPE (event) != GST_EVENT_NAVIGATION)
+ return GST_NAVIGATION_EVENT_INVALID;
+
+ s = gst_event_get_structure (event);
+ if (s == NULL || !gst_structure_has_name (s, GST_NAVIGATION_EVENT_NAME))
+ return GST_NAVIGATION_EVENT_INVALID;
+
+ e_type = gst_structure_get_string (s, "event");
+ if (e_type == NULL)
+ return GST_NAVIGATION_EVENT_INVALID;
+
+ if (g_str_equal (e_type, "mouse-button-press"))
+ return GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS;
+ else if (g_str_equal (e_type, "mouse-button-release"))
+ return GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE;
+ else if (g_str_equal (e_type, "mouse-move"))
+ return GST_NAVIGATION_EVENT_MOUSE_MOVE;
+ else if (g_str_equal (e_type, "key-press"))
+ return GST_NAVIGATION_EVENT_KEY_PRESS;
+ else if (g_str_equal (e_type, "key-release"))
+ return GST_NAVIGATION_EVENT_KEY_RELEASE;
+ else if (g_str_equal (e_type, "command"))
+ return GST_NAVIGATION_EVENT_COMMAND;
+
+ return GST_NAVIGATION_EVENT_INVALID;
+}
+
+/**
+ * gst_navigation_event_parse_key_event:
+ * @event: A #GstEvent to inspect.
+ * @key: A pointer to a location to receive the string identifying the key
+ * press. The returned string is owned by the event, and valid only until the
+ * event is unreffed.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_event_parse_key_event (GstEvent * event, const gchar ** key)
+{
+ GstNavigationEventType e_type;
+ const GstStructure *s;
+
+ e_type = gst_navigation_event_get_type (event);
+ g_return_val_if_fail (e_type == GST_NAVIGATION_EVENT_KEY_PRESS ||
+ e_type == GST_NAVIGATION_EVENT_KEY_RELEASE, FALSE);
+
+ if (key) {
+ s = gst_event_get_structure (event);
+ *key = gst_structure_get_string (s, "key");
+ if (*key == NULL)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_navigation_event_parse_mouse_button_event:
+ * @event: A #GstEvent to inspect.
+ * @button: Pointer to a gint that will receive the button number associated
+ * with the event.
+ * @x: Pointer to a gdouble to receive the x coordinate of the mouse button
+ * event.
+ * @y: Pointer to a gdouble to receive the y coordinate of the mouse button
+ * event.
+ *
+ * Retrieve the details of either a #GstNavigation mouse button press event or
+ * a mouse button release event. Determine which type the event is using
+ * gst_navigation_event_get_type() to retrieve the #GstNavigationEventType.
+ *
+ * Returns: TRUE if the button number and both coordinates could be extracted,
+ * otherwise FALSE.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_event_parse_mouse_button_event (GstEvent * event, gint * button,
+ gdouble * x, gdouble * y)
+{
+ GstNavigationEventType e_type;
+ const GstStructure *s;
+ gboolean ret = TRUE;
+
+ e_type = gst_navigation_event_get_type (event);
+ g_return_val_if_fail (e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS ||
+ e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE, FALSE);
+
+ s = gst_event_get_structure (event);
+ if (x)
+ ret &= gst_structure_get_double (s, "pointer_x", x);
+ if (y)
+ ret &= gst_structure_get_double (s, "pointer_y", y);
+ if (button)
+ ret &= gst_structure_get_int (s, "button", button);
+
+ WARN_IF_FAIL (ret, "Couldn't extract details from mouse button event");
+
+ return ret;
+}
+
+/**
+ * gst_navigation_event_parse_mouse_move_event:
+ * @event: A #GstEvent to inspect.
+ * @x: Pointer to a gdouble to receive the x coordinate of the mouse movement.
+ * @y: Pointer to a gdouble to receive the y coordinate of the mouse movement.
+ *
+ * Inspect a #GstNavigation mouse movement event and extract the coordinates
+ * of the event.
+ *
+ * Returns: TRUE if both coordinates could be extracted, otherwise FALSE.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_event_parse_mouse_move_event (GstEvent * event, gdouble * x,
+ gdouble * y)
+{
+ const GstStructure *s;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (GST_NAVIGATION_EVENT_HAS_TYPE (event, MOUSE_MOVE),
+ FALSE);
+
+ s = gst_event_get_structure (event);
+ if (x)
+ ret &= gst_structure_get_double (s, "pointer_x", x);
+ if (y)
+ ret &= gst_structure_get_double (s, "pointer_y", y);
+
+ WARN_IF_FAIL (ret, "Couldn't extract positions from mouse move event");
+
+ return ret;
+}
+
+/**
+ * gst_navigation_event_parse_command:
+ * @event: A #GstEvent to inspect.
+ * @command: Pointer to GstNavigationCommand to receive the type of the
+ * navigation event.
+ *
+ * Inspect a #GstNavigation command event and retrieve the enum value of the
+ * associated command.
+ *
+ * Returns: TRUE if the navigation command could be extracted, otherwise FALSE.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_navigation_event_parse_command (GstEvent * event,
+ GstNavigationCommand * command)
+{
+ const GstStructure *s;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (GST_NAVIGATION_EVENT_HAS_TYPE (event, COMMAND), FALSE);
+
+ if (command) {
+ s = gst_event_get_structure (event);
+ ret = gst_structure_get_uint (s, "command-code", (guint *) command);
+ WARN_IF_FAIL (ret, "Couldn't extract command code from command event");
+ }
+
+ return ret;
+}
diff --git a/gst-libs/gst/interfaces/navigation.h b/gst-libs/gst/interfaces/navigation.h
new file mode 100644
index 0000000..b4eaca5
--- /dev/null
+++ b/gst-libs/gst/interfaces/navigation.h
@@ -0,0 +1,273 @@
+/* GStreamer Navigation
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2003 David A. Schleef <ds@schleef.org>
+ *
+ * navigation.h: navigation interface design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_NAVIGATION_H__
+#define __GST_NAVIGATION_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_NAVIGATION \
+ (gst_navigation_get_type ())
+#define GST_NAVIGATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NAVIGATION, GstNavigation))
+#define GST_IS_NAVIGATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NAVIGATION))
+#define GST_NAVIGATION_GET_IFACE(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_NAVIGATION, GstNavigationInterface))
+
+typedef struct _GstNavigation GstNavigation;
+typedef struct _GstNavigationInterface GstNavigationInterface;
+
+/**
+ * GstNavigationInterface:
+ * @g_iface: the parent interface
+ * @send_event: sending a navigation event
+ *
+ * Color-balance interface.
+ */
+struct _GstNavigationInterface {
+ GTypeInterface g_iface;
+
+ /* virtual functions */
+ void (*send_event) (GstNavigation *navigation, GstStructure *structure);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_navigation_get_type (void);
+
+/* Navigation commands */
+
+/**
+ * GstNavigationCommand:
+ * @GST_NAVIGATION_COMMAND_INVALID: An invalid command entry
+ * @GST_NAVIGATION_COMMAND_MENU1: Execute navigation menu command 1. For DVD,
+ * this enters the DVD root menu, or exits back to the title from the menu.
+ * @GST_NAVIGATION_COMMAND_MENU2: Execute navigation menu command 2. For DVD,
+ * this jumps to the DVD title menu.
+ * @GST_NAVIGATION_COMMAND_MENU3: Execute navigation menu command 3. For DVD,
+ * this jumps into the DVD root menu.
+ * @GST_NAVIGATION_COMMAND_MENU4: Execute navigation menu command 4. For DVD,
+ * this jumps to the Subpicture menu.
+ * @GST_NAVIGATION_COMMAND_MENU5: Execute navigation menu command 5. For DVD,
+ * the jumps to the audio menu.
+ * @GST_NAVIGATION_COMMAND_MENU6: Execute navigation menu command 6. For DVD,
+ * this jumps to the angles menu.
+ * @GST_NAVIGATION_COMMAND_MENU7: Execute navigation menu command 7. For DVD,
+ * this jumps to the chapter menu.
+ * @GST_NAVIGATION_COMMAND_LEFT: Select the next button to the left in a menu,
+ * if such a button exists.
+ * @GST_NAVIGATION_COMMAND_RIGHT: Select the next button to the right in a menu,
+ * if such a button exists.
+ * @GST_NAVIGATION_COMMAND_UP: Select the button above the current one in a
+ * menu, if such a button exists.
+ * @GST_NAVIGATION_COMMAND_DOWN: Select the button below the current one in a
+ * menu, if such a button exists.
+ * @GST_NAVIGATION_COMMAND_ACTIVATE: Activate (click) the currently selected
+ * button in a menu, if such a button exists.
+ * @GST_NAVIGATION_COMMAND_PREV_ANGLE: Switch to the previous angle in a
+ * multiangle feature.
+ * @GST_NAVIGATION_COMMAND_NEXT_ANGLE: Switch to the next angle in a multiangle
+ * feature.
+ *
+ * A set of commands that may be issued to an element providing the
+ * #GstNavigation interface. The available commands can be queried via
+ * the gst_navigation_query_new_commands() query.
+ *
+ * For convenience in handling DVD navigation, the MENU commands are aliased as:
+ * GST_NAVIGATION_COMMAND_DVD_MENU = @GST_NAVIGATION_COMMAND_MENU1
+ * GST_NAVIGATION_COMMAND_DVD_TITLE_MENU = @GST_NAVIGATION_COMMAND_MENU2
+ * GST_NAVIGATION_COMMAND_DVD_ROOT_MENU = @GST_NAVIGATION_COMMAND_MENU3
+ * GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU = @GST_NAVIGATION_COMMAND_MENU4
+ * GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU = @GST_NAVIGATION_COMMAND_MENU5
+ * GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU = @GST_NAVIGATION_COMMAND_MENU6
+ * GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU = @GST_NAVIGATION_COMMAND_MENU7
+ *
+ * Since: 0.10.23
+ */
+typedef enum {
+ GST_NAVIGATION_COMMAND_INVALID = 0,
+
+ GST_NAVIGATION_COMMAND_MENU1 = 1,
+ GST_NAVIGATION_COMMAND_MENU2 = 2,
+ GST_NAVIGATION_COMMAND_MENU3 = 3,
+ GST_NAVIGATION_COMMAND_MENU4 = 4,
+ GST_NAVIGATION_COMMAND_MENU5 = 5,
+ GST_NAVIGATION_COMMAND_MENU6 = 6,
+ GST_NAVIGATION_COMMAND_MENU7 = 7,
+
+ GST_NAVIGATION_COMMAND_LEFT = 20,
+ GST_NAVIGATION_COMMAND_RIGHT = 21,
+ GST_NAVIGATION_COMMAND_UP = 22,
+ GST_NAVIGATION_COMMAND_DOWN = 23,
+ GST_NAVIGATION_COMMAND_ACTIVATE = 24,
+
+ GST_NAVIGATION_COMMAND_PREV_ANGLE = 30,
+ GST_NAVIGATION_COMMAND_NEXT_ANGLE = 31
+} GstNavigationCommand;
+
+/* Some aliases for the menu command types */
+#define GST_NAVIGATION_COMMAND_DVD_MENU GST_NAVIGATION_COMMAND_MENU1
+#define GST_NAVIGATION_COMMAND_DVD_TITLE_MENU GST_NAVIGATION_COMMAND_MENU2
+#define GST_NAVIGATION_COMMAND_DVD_ROOT_MENU GST_NAVIGATION_COMMAND_MENU3
+#define GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU GST_NAVIGATION_COMMAND_MENU4
+#define GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU GST_NAVIGATION_COMMAND_MENU5
+#define GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU GST_NAVIGATION_COMMAND_MENU6
+#define GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU GST_NAVIGATION_COMMAND_MENU7
+
+/* Queries */
+/**
+ * GstNavigationQueryType:
+ * @GST_NAVIGATION_QUERY_INVALID: invalid query
+ * @GST_NAVIGATION_QUERY_COMMANDS: command query
+ * @GST_NAVIGATION_QUERY_ANGLES: viewing angle query
+ *
+ * Tyoes of navigation interface queries.
+ */
+typedef enum
+{
+ GST_NAVIGATION_QUERY_INVALID = 0,
+ GST_NAVIGATION_QUERY_COMMANDS = 1,
+ GST_NAVIGATION_QUERY_ANGLES = 2
+} GstNavigationQueryType;
+
+GstNavigationQueryType gst_navigation_query_get_type (GstQuery *query);
+
+GstQuery *gst_navigation_query_new_commands (void);
+void gst_navigation_query_set_commands (GstQuery *query, gint n_cmds, ...);
+void gst_navigation_query_set_commandsv (GstQuery *query, gint n_cmds,
+ GstNavigationCommand *cmds);
+gboolean gst_navigation_query_parse_commands_length (GstQuery *query,
+ guint *n_cmds);
+gboolean gst_navigation_query_parse_commands_nth (GstQuery *query, guint nth,
+ GstNavigationCommand *cmd);
+
+GstQuery *gst_navigation_query_new_angles (void);
+void gst_navigation_query_set_angles (GstQuery *query, guint cur_angle,
+ guint n_angles);
+gboolean gst_navigation_query_parse_angles (GstQuery *query, guint *cur_angle,
+ guint *n_angles);
+
+/* Element messages */
+/**
+ * GstNavigationMessageType:
+ * @GST_NAVIGATION_MESSAGE_INVALID: Returned from
+ * gst_navigation_message_get_type() when the passed message is not a
+ * navigation message.
+ * @GST_NAVIGATION_MESSAGE_MOUSE_OVER: Sent when the mouse moves over or leaves a
+ * clickable region of the output, such as a DVD menu button.
+ * @GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED: Sent when the set of available commands
+ * changes and should re-queried by interested applications.
+ * @GST_NAVIGATION_MESSAGE_ANGLES_CHANGED: Sent when display angles in a multi-angle
+ * feature (such as a multiangle DVD) change - either angles have appeared or
+ * disappeared.
+ *
+ * A set of notifications that may be received on the bus when navigation
+ * related status changes.
+ *
+ * Since: 0.10.23
+ */
+typedef enum {
+ GST_NAVIGATION_MESSAGE_INVALID,
+ GST_NAVIGATION_MESSAGE_MOUSE_OVER,
+ GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED,
+ GST_NAVIGATION_MESSAGE_ANGLES_CHANGED
+} GstNavigationMessageType;
+
+GstNavigationMessageType gst_navigation_message_get_type (GstMessage *message);
+
+GstMessage *gst_navigation_message_new_mouse_over (GstObject *src,
+ gboolean active);
+gboolean gst_navigation_message_parse_mouse_over (GstMessage *message,
+ gboolean *active);
+
+GstMessage *gst_navigation_message_new_commands_changed (GstObject *src);
+
+GstMessage *gst_navigation_message_new_angles_changed (GstObject *src,
+ guint cur_angle,
+ guint n_angles);
+gboolean gst_navigation_message_parse_angles_changed (GstMessage *message,
+ guint *cur_angle,
+ guint *n_angles);
+
+/* event parsing functions */
+/**
+ * GstNavigationEventType:
+ * @GST_NAVIGATION_EVENT_INVALID: Returned from
+ * gst_navigation_event_get_type() when the passed event is not a navigation event.
+ * @GST_NAVIGATION_EVENT_KEY_PRESS: A key press event. Use
+ * gst_navigation_event_parse_key_event() to extract the details from the event.
+ * @GST_NAVIGATION_EVENT_KEY_RELEASE: A key release event. Use
+ * gst_navigation_event_parse_key_event() to extract the details from the event.
+ * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: A mouse button press event. Use
+ * gst_navigation_event_parse_mouse_button_event() to extract the details from the
+ * event.
+ * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE: A mouse button release event. Use
+ * gst_navigation_event_parse_mouse_button_event() to extract the details from the
+ * event.
+ * @GST_NAVIGATION_EVENT_MOUSE_MOVE: A mouse movement event. Use
+ * gst_navigation_event_parse_mouse_move_event() to extract the details from the
+ * event.
+ * @GST_NAVIGATION_EVENT_COMMAND: A navigation command event. Use
+ * gst_navigation_event_parse_command() to extract the details from the event.
+ *
+ * Enum values for the various events that an element implementing the
+ * GstNavigation interface might send up the pipeline.
+ *
+ * Since: 0.10.23
+ */
+typedef enum {
+ GST_NAVIGATION_EVENT_INVALID = 0,
+ GST_NAVIGATION_EVENT_KEY_PRESS = 1,
+ GST_NAVIGATION_EVENT_KEY_RELEASE = 2,
+ GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS = 3,
+ GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE = 4,
+ GST_NAVIGATION_EVENT_MOUSE_MOVE = 5,
+ GST_NAVIGATION_EVENT_COMMAND = 6
+} GstNavigationEventType;
+
+GstNavigationEventType gst_navigation_event_get_type (GstEvent *event);
+gboolean gst_navigation_event_parse_key_event (GstEvent *event,
+ const gchar **key);
+gboolean gst_navigation_event_parse_mouse_button_event (GstEvent *event,
+ gint *button, gdouble *x, gdouble *y);
+gboolean gst_navigation_event_parse_mouse_move_event (GstEvent *event,
+ gdouble *x, gdouble *y);
+gboolean gst_navigation_event_parse_command (GstEvent *event,
+ GstNavigationCommand *command);
+
+/* interface virtual function wrappers */
+void gst_navigation_send_event (GstNavigation *navigation,
+ GstStructure *structure);
+void gst_navigation_send_key_event (GstNavigation *navigation,
+ const char *event, const char *key);
+void gst_navigation_send_mouse_event (GstNavigation *navigation,
+ const char *event, int button, double x, double y);
+void gst_navigation_send_command (GstNavigation *navigation,
+ GstNavigationCommand command);
+
+G_END_DECLS
+
+#endif /* __GST_NAVIGATION_H__ */
diff --git a/gst-libs/gst/interfaces/propertyprobe.c b/gst-libs/gst/interfaces/propertyprobe.c
new file mode 100644
index 0000000..64d0d39
--- /dev/null
+++ b/gst-libs/gst/interfaces/propertyprobe.c
@@ -0,0 +1,378 @@
+/* GStreamer PropertyProbe
+ * Copyright (C) 2003 David Schleef <ds@schleef.org>
+ *
+ * property_probe.c: property_probe design virtual class function wrappers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpropertyprobe
+ * @short_description: Interface for probing possible property values
+ *
+ * The property probe is a way to autodetect allowed values for a GObject
+ * property. It's primary use is to autodetect device-names in several elements.
+ *
+ * The interface is implemented by many hardware sources and sinks.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "propertyprobe.h"
+
+enum
+{
+ SIGNAL_PROBE_NEEDED,
+ LAST_SIGNAL
+};
+
+static void gst_property_probe_iface_init (GstPropertyProbeInterface * iface);
+
+static guint gst_property_probe_signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_property_probe_get_type (void)
+{
+ static GType gst_property_probe_type = 0;
+
+ if (!gst_property_probe_type) {
+ static const GTypeInfo gst_property_probe_info = {
+ sizeof (GstPropertyProbeInterface),
+ (GBaseInitFunc) gst_property_probe_iface_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_property_probe_type =
+ g_type_register_static (G_TYPE_INTERFACE,
+ "GstPropertyProbe", &gst_property_probe_info, 0);
+ }
+
+ return gst_property_probe_type;
+}
+
+static void
+gst_property_probe_iface_init (GstPropertyProbeInterface * iface)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /**
+ * GstPropertyProbe::probe-needed
+ * @pspec: #GParamSpec that needs a probe
+ *
+ */
+ /* FIXME:
+ * what is the purpose of this signal, I can't find any usage of it
+ * according to proto n *.h, it should be g_cclosure_marshal_VOID__PARAM
+ */
+ gst_property_probe_signals[SIGNAL_PROBE_NEEDED] =
+ g_signal_new ("probe-needed", G_TYPE_FROM_CLASS (iface),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstPropertyProbeInterface,
+ probe_needed), NULL, NULL, g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1, G_TYPE_POINTER);
+ initialized = TRUE;
+ }
+
+ /* default virtual functions */
+ iface->get_properties = NULL;
+ iface->get_values = NULL;
+}
+
+/**
+ * gst_property_probe_get_properties:
+ * @probe: the #GstPropertyProbe to get the properties for.
+ *
+ * Get a list of properties for which probing is supported.
+ *
+ * Returns: the list of properties for which probing is supported
+ * by this element.
+ */
+const GList *
+gst_property_probe_get_properties (GstPropertyProbe * probe)
+{
+ GstPropertyProbeInterface *iface;
+
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+
+ iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
+
+ if (iface->get_properties)
+ return iface->get_properties (probe);
+
+ return NULL;
+}
+
+/**
+ * gst_property_probe_get_property:
+ * @probe: the #GstPropertyProbe to get the properties for.
+ * @name: name of the property.
+ *
+ * Get #GParamSpec for a property for which probing is supported.
+ *
+ * Returns: the #GParamSpec of %NULL.
+ */
+const GParamSpec *
+gst_property_probe_get_property (GstPropertyProbe * probe, const gchar * name)
+{
+ const GList *pspecs;
+
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ pspecs = gst_property_probe_get_properties (probe);
+
+ while (pspecs) {
+ const GParamSpec *pspec = pspecs->data;
+
+ if (pspec) {
+ if (!strcmp (pspec->name, name))
+ return pspec;
+ } else {
+ GST_WARNING_OBJECT (probe, "NULL paramspec in property probe list");
+ }
+
+ pspecs = pspecs->next;
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_property_probe_probe_property:
+ * @probe: the #GstPropertyProbe to check.
+ * @pspec: #GParamSpec of the property.
+ *
+ * Runs a probe on the property specified by @pspec
+ */
+void
+gst_property_probe_probe_property (GstPropertyProbe * probe,
+ const GParamSpec * pspec)
+{
+ GstPropertyProbeInterface *iface;
+
+ g_return_if_fail (probe != NULL);
+ g_return_if_fail (GST_IS_PROPERTY_PROBE (probe));
+ g_return_if_fail (pspec != NULL);
+
+ iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
+
+ if (iface->probe_property)
+ iface->probe_property (probe, pspec->param_id, pspec);
+}
+
+/**
+ * gst_property_probe_probe_property_name:
+ * @probe: the #GstPropertyProbe to check.
+ * @name: name of the property.
+ *
+ * Runs a probe on the property specified by @name.
+ */
+void
+gst_property_probe_probe_property_name (GstPropertyProbe * probe,
+ const gchar * name)
+{
+ const GParamSpec *pspec;
+
+ g_return_if_fail (probe != NULL);
+ g_return_if_fail (GST_IS_PROPERTY_PROBE (probe));
+ g_return_if_fail (name != NULL);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (probe), name);
+ if (!pspec) {
+ g_warning ("No such property %s", name);
+ return;
+ }
+
+ gst_property_probe_probe_property (probe, pspec);
+}
+
+/**
+ * gst_property_probe_needs_probe:
+ * @probe: the #GstPropertyProbe object to which the given property belongs.
+ * @pspec: a #GParamSpec that identifies the property to check.
+ *
+ * Checks whether a property needs a probe. This might be because
+ * the property wasn't initialized before, or because host setup
+ * changed. This might be, for example, because a new device was
+ * added, and thus device probing needs to be refreshed to display
+ * the new device.
+ *
+ * Returns: TRUE if the property needs a new probe, FALSE if not.
+ */
+gboolean
+gst_property_probe_needs_probe (GstPropertyProbe * probe,
+ const GParamSpec * pspec)
+{
+ GstPropertyProbeInterface *iface;
+
+ g_return_val_if_fail (probe != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), FALSE);
+ g_return_val_if_fail (pspec != NULL, FALSE);
+
+ iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
+
+ if (iface->needs_probe)
+ return iface->needs_probe (probe, pspec->param_id, pspec);
+
+ return FALSE;
+}
+
+/**
+ * gst_property_probe_needs_probe_name:
+ * @probe: the #GstPropertyProbe object to which the given property belongs.
+ * @name: the name of the property to check.
+ *
+ * Same as gst_property_probe_needs_probe ().
+ *
+ * Returns: TRUE if the property needs a new probe, FALSE if not.
+ */
+gboolean
+gst_property_probe_needs_probe_name (GstPropertyProbe * probe,
+ const gchar * name)
+{
+ const GParamSpec *pspec;
+
+ g_return_val_if_fail (probe != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (probe), name);
+ if (!pspec) {
+ g_warning ("No such property %s", name);
+ return FALSE;
+ }
+
+ return gst_property_probe_needs_probe (probe, pspec);
+}
+
+/**
+ * gst_property_probe_get_values:
+ * @probe: the #GstPropertyProbe object.
+ * @pspec: the #GParamSpec property identifier.
+ *
+ * Gets the possible (probed) values for the given property,
+ * requires the property to have been probed before.
+ *
+ * Returns: A list of valid values for the given property.
+ */
+GValueArray *
+gst_property_probe_get_values (GstPropertyProbe * probe,
+ const GParamSpec * pspec)
+{
+ GstPropertyProbeInterface *iface;
+
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+ g_return_val_if_fail (pspec != NULL, NULL);
+
+ iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
+
+ if (iface->get_values)
+ return iface->get_values (probe, pspec->param_id, pspec);
+
+ return NULL;
+}
+
+/**
+ * gst_property_probe_get_values_name:
+ * @probe: the #GstPropertyProbe object.
+ * @name: the name of the property to get values for.
+ *
+ * Same as gst_property_probe_get_values ().
+ *
+ * Returns: A list of valid values for the given property.
+ */
+GValueArray *
+gst_property_probe_get_values_name (GstPropertyProbe * probe,
+ const gchar * name)
+{
+ const GParamSpec *pspec;
+
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (probe), name);
+ if (!pspec) {
+ g_warning ("No such property %s", name);
+ return NULL;
+ }
+
+ return gst_property_probe_get_values (probe, pspec);
+}
+
+/**
+ * gst_property_probe_probe_and_get_values:
+ * @probe: the #GstPropertyProbe object.
+ * @pspec: The #GParamSpec property identifier.
+ *
+ * Check whether the given property requires a new probe. If so,
+ * fo the probe. After that, retrieve a value list. Meant as a
+ * utility function that wraps the above functions.
+ *
+ * Returns: the list of valid values for this property.
+ */
+GValueArray *
+gst_property_probe_probe_and_get_values (GstPropertyProbe * probe,
+ const GParamSpec * pspec)
+{
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+ g_return_val_if_fail (pspec != NULL, NULL);
+
+ if (gst_property_probe_needs_probe (probe, pspec))
+ gst_property_probe_probe_property (probe, pspec);
+
+ return gst_property_probe_get_values (probe, pspec);
+}
+
+/**
+ * gst_property_probe_probe_and_get_values_name:
+ * @probe: the #GstPropertyProbe object.
+ * @name: the name of the property to get values for.
+ *
+ * Same as gst_property_probe_probe_and_get_values ().
+ *
+ * Returns: the list of valid values for this property.
+ */
+GValueArray *
+gst_property_probe_probe_and_get_values_name (GstPropertyProbe * probe,
+ const gchar * name)
+{
+ const GParamSpec *pspec;
+
+ g_return_val_if_fail (probe != NULL, NULL);
+ g_return_val_if_fail (GST_IS_PROPERTY_PROBE (probe), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (probe), name);
+ if (!pspec) {
+ g_warning ("No such property %s", name);
+ return NULL;
+ }
+
+ return gst_property_probe_probe_and_get_values (probe, pspec);
+}
diff --git a/gst-libs/gst/interfaces/propertyprobe.h b/gst-libs/gst/interfaces/propertyprobe.h
new file mode 100644
index 0000000..5b67af2
--- /dev/null
+++ b/gst-libs/gst/interfaces/propertyprobe.h
@@ -0,0 +1,115 @@
+/* GStreamer PropertyProbe
+ * Copyright (C) 2003 David A. Schleef <ds@schleef.org>
+ *
+ * property_probe.h: property_probe interface design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PROPERTY_PROBE_H__
+#define __GST_PROPERTY_PROBE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PROPERTY_PROBE \
+ (gst_property_probe_get_type ())
+#define GST_PROPERTY_PROBE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PROPERTY_PROBE, GstPropertyProbe))
+#define GST_IS_PROPERTY_PROBE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PROPERTY_PROBE))
+#define GST_PROPERTY_PROBE_GET_IFACE(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_PROPERTY_PROBE, GstPropertyProbeInterface))
+
+/**
+ * GstPropertyProbe:
+ *
+ * Opaque #GstPropertyProbe data structure.
+ */
+typedef struct _GstPropertyProbe GstPropertyProbe; /* dummy typedef */
+typedef struct _GstPropertyProbeInterface GstPropertyProbeInterface;
+
+/**
+ * GstPropertyProbeInterface:
+ * @klass: parent interface type.
+ * @probe_needed: default signal handler
+ * @get_properties: virtual method to get list of probable properties
+ * @needs_probe: virtual method to tell if probe need update
+ * @probe_property: virtual method to probe a property
+ * @get_values: virtual method to get probe results for a property
+ *
+ * #GstPropertyProbe interface.
+ */
+struct _GstPropertyProbeInterface {
+ GTypeInterface klass;
+
+ /* signals */
+ void (*probe_needed) (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+
+ /* virtual functions */
+ const GList * (*get_properties) (GstPropertyProbe *probe);
+ gboolean (*needs_probe) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+ void (*probe_property) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+ GValueArray * (*get_values) (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_property_probe_get_type (void);
+
+/* virtual class function wrappers */
+
+/* returns list of GParamSpecs */
+const GList * gst_property_probe_get_properties (GstPropertyProbe *probe);
+const GParamSpec *gst_property_probe_get_property (GstPropertyProbe *probe,
+ const gchar *name);
+
+/* probe one property */
+void gst_property_probe_probe_property (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+void gst_property_probe_probe_property_name (GstPropertyProbe *probe,
+ const gchar *name);
+
+/* do we need a probe? */
+gboolean gst_property_probe_needs_probe (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+gboolean gst_property_probe_needs_probe_name (GstPropertyProbe *probe,
+ const gchar *name);
+
+/* returns list of GValues */
+GValueArray * gst_property_probe_get_values (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+GValueArray * gst_property_probe_get_values_name (GstPropertyProbe *probe,
+ const gchar *name);
+
+/* sugar */
+GValueArray * gst_property_probe_probe_and_get_values (GstPropertyProbe *probe,
+ const GParamSpec *pspec);
+GValueArray * gst_property_probe_probe_and_get_values_name (GstPropertyProbe *probe,
+ const gchar *name);
+
+G_END_DECLS
+
+#endif /* __GST_PROPERTY_PROBE_H__ */
diff --git a/gst-libs/gst/interfaces/streamvolume.c b/gst-libs/gst/interfaces/streamvolume.c
new file mode 100644
index 0000000..509d295
--- /dev/null
+++ b/gst-libs/gst/interfaces/streamvolume.c
@@ -0,0 +1,225 @@
+/* GStreamer Mixer
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gststreamvolume
+ * @short_description: Interface for elements that provide a stream volume
+ *
+ * <refsect2>
+ * <para>
+ * This interface is implemented by elements that provide a stream volume. Examples for
+ * such elements are #volume and #playbin2.
+ * </para>
+ * <para>
+ * Applications can use this interface to get or set the current stream volume. For this
+ * the "volume" #GObject property can be used or the helper functions gst_stream_volume_set_volume()
+ * and gst_stream_volume_get_volume(). This volume is always a linear factor, i.e. 0.0 is muted
+ * 1.0 is 100%. For showing the volume in a GUI it might make sense to convert it to
+ * a different format by using gst_stream_volume_convert_volume(). Volume sliders should usually
+ * use a cubic volume.
+ *
+ * Separate from the volume the stream can also be muted by the "mute" #GObject property or
+ * gst_stream_volume_set_mute() and gst_stream_volume_get_mute().
+ * </para>
+ * <para>
+ * Elements that provide some kind of stream volume should implement the "volume" and
+ * "mute" #GObject properties and handle setting and getting of them properly.
+ * The volume property is defined to be a linear volume factor.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "streamvolume.h"
+#include <math.h>
+
+static void
+gst_stream_volume_class_init (GstStreamVolumeInterface * iface)
+{
+ g_object_interface_install_property (iface,
+ g_param_spec_double ("volume",
+ "Volume",
+ "Linear volume factor, 1.0=100%",
+ 0.0, G_MAXDOUBLE, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_interface_install_property (iface,
+ g_param_spec_boolean ("mute",
+ "Mute",
+ "Mute the audio channel without changing the volume",
+ FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+GType
+gst_stream_volume_get_type (void)
+{
+ static volatile gsize type = 0;
+ if (g_once_init_enter (&type)) {
+ GType tmp;
+ static const GTypeInfo info = {
+ sizeof (GstStreamVolumeInterface),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gst_stream_volume_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ tmp = g_type_register_static (G_TYPE_INTERFACE,
+ "GstStreamVolume", &info, 0);
+ g_type_interface_add_prerequisite (tmp, G_TYPE_OBJECT);
+
+ g_once_init_leave (&type, tmp);
+ }
+ return type;
+}
+
+/**
+ * gst_stream_volume_get_volume:
+ * @volume: #GstStreamVolume that should be used
+ * @format: #GstStreamVolumeFormat which should be returned
+ *
+ * Returns: The current stream volume as linear factor
+ *
+ * Since: 0.10.25
+ */
+gdouble
+gst_stream_volume_get_volume (GstStreamVolume * volume,
+ GstStreamVolumeFormat format)
+{
+ gdouble val;
+
+ g_return_val_if_fail (GST_IS_STREAM_VOLUME (volume), 1.0);
+
+ g_object_get (volume, "volume", &val, NULL);
+ if (format != GST_STREAM_VOLUME_FORMAT_LINEAR)
+ val =
+ gst_stream_volume_convert_volume (GST_STREAM_VOLUME_FORMAT_LINEAR,
+ format, val);
+ return val;
+}
+
+/**
+ * gst_stream_volume_set_volume:
+ * @volume: #GstStreamVolume that should be used
+ * @format: #GstStreamVolumeFormat of @val
+ * @val: Linear volume factor that should be set
+ *
+ * Since: 0.10.25
+ */
+void
+gst_stream_volume_set_volume (GstStreamVolume * volume,
+ GstStreamVolumeFormat format, gdouble val)
+{
+ g_return_if_fail (GST_IS_STREAM_VOLUME (volume));
+
+ if (format != GST_STREAM_VOLUME_FORMAT_LINEAR)
+ val =
+ gst_stream_volume_convert_volume (format,
+ GST_STREAM_VOLUME_FORMAT_LINEAR, val);
+ g_object_set (volume, "volume", val, NULL);
+}
+
+/**
+ * gst_stream_volume_get_mute:
+ * @volume: #GstStreamVolume that should be used
+ *
+ * Returns: Returns %TRUE if the stream is muted
+ *
+ * Since: 0.10.25
+ */
+gboolean
+gst_stream_volume_get_mute (GstStreamVolume * volume)
+{
+ gboolean val;
+
+ g_return_val_if_fail (GST_IS_STREAM_VOLUME (volume), FALSE);
+
+ g_object_get (volume, "mute", &val, NULL);
+ return val;
+}
+
+/**
+ * gst_stream_volume_set_mute:
+ * @volume: #GstStreamVolume that should be used
+ * @mute: Mute state that should be set
+ *
+ * Since: 0.10.25
+ */
+void
+gst_stream_volume_set_mute (GstStreamVolume * volume, gboolean mute)
+{
+ g_return_if_fail (GST_IS_STREAM_VOLUME (volume));
+
+ g_object_set (volume, "mute", mute, NULL);
+}
+
+/**
+ * gst_stream_volume_convert_volume:
+ * @from: #GstStreamVolumeFormat to convert from
+ * @to: #GstStreamVolumeFormat to convert to
+ * @val: Volume in @from format that should be converted
+ *
+ * Returns: the converted volume
+ *
+ * Since: 0.10.25
+ */
+gdouble
+gst_stream_volume_convert_volume (GstStreamVolumeFormat from,
+ GstStreamVolumeFormat to, gdouble val)
+{
+ switch (from) {
+ case GST_STREAM_VOLUME_FORMAT_LINEAR:
+ g_return_val_if_fail (val >= 0.0, 0.0);
+ switch (to) {
+ case GST_STREAM_VOLUME_FORMAT_LINEAR:
+ return val;
+ case GST_STREAM_VOLUME_FORMAT_CUBIC:
+ return pow (val, 1 / 3.0);
+ case GST_STREAM_VOLUME_FORMAT_DB:
+ return 20.0 * log10 (val);
+ }
+ break;
+ case GST_STREAM_VOLUME_FORMAT_CUBIC:
+ g_return_val_if_fail (val >= 0.0, 0.0);
+ switch (to) {
+ case GST_STREAM_VOLUME_FORMAT_LINEAR:
+ return val * val * val;
+ case GST_STREAM_VOLUME_FORMAT_CUBIC:
+ return val;
+ case GST_STREAM_VOLUME_FORMAT_DB:
+ return 3.0 * 20.0 * log10 (val);
+ }
+ break;
+ case GST_STREAM_VOLUME_FORMAT_DB:
+ switch (to) {
+ case GST_STREAM_VOLUME_FORMAT_LINEAR:
+ return pow (10.0, val / 20.0);
+ case GST_STREAM_VOLUME_FORMAT_CUBIC:
+ return pow (10.0, val / (3.0 * 20.0));
+ case GST_STREAM_VOLUME_FORMAT_DB:
+ return val;
+ }
+ break;
+ }
+ g_return_val_if_reached (0.0);
+}
diff --git a/gst-libs/gst/interfaces/streamvolume.h b/gst-libs/gst/interfaces/streamvolume.h
new file mode 100644
index 0000000..3a082ed
--- /dev/null
+++ b/gst-libs/gst/interfaces/streamvolume.h
@@ -0,0 +1,87 @@
+/* GStreamer StreamVolume
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_STREAM_VOLUME_H__
+#define __GST_STREAM_VOLUME_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STREAM_VOLUME \
+ (gst_stream_volume_get_type ())
+#define GST_STREAM_VOLUME(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_STREAM_VOLUME, GstStreamVolume))
+#define GST_STREAM_VOLUME_INTERFACE(iface) \
+ (G_TYPE_CHECK_INTERFACE_CAST ((iface), GST_TYPE_STREAM_VOLUME, GstStreamVolumeInterface))
+#define GST_IS_STREAM_VOLUME(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_STREAM_VOLUME))
+#define GST_IS_STREAM_VOLUME_INTERFACE(iface) \
+ (G_TYPE_CHECK_INTERFACE_TYPE ((iface), GST_TYPE_STREAM_VOLUME))
+#define GST_STREAM_VOLUME_GET_INTERFACE(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_STREAM_VOLUME, GstStreamVolumeInterface))
+
+typedef struct _GstStreamVolume GstStreamVolume;
+typedef struct _GstStreamVolumeInterface GstStreamVolumeInterface;
+
+struct _GstStreamVolumeInterface {
+ GTypeInterface parent;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstStreamVolumeFormat:
+ * @GST_STREAM_VOLUME_FORMAT_LINEAR: Linear scale factor, 1.0 = 100%
+ * @GST_STREAM_VOLUME_FORMAT_CUBIC: Cubic volume scale
+ * @GST_STREAM_VOLUME_FORMAT_DB: Logarithmic volume scale (dB, amplitude not power)
+ *
+ * Different representations of a stream volume. gst_stream_volume_convert_volume()
+ * allows to convert between the different representations.
+ *
+ * Formulas to convert from a linear to a cubic or dB volume are
+ * cbrt(val) and 20 * log10 (val).
+ *
+ * Since: 0.10.25
+ */
+typedef enum {
+ GST_STREAM_VOLUME_FORMAT_LINEAR = 0,
+ GST_STREAM_VOLUME_FORMAT_CUBIC,
+ GST_STREAM_VOLUME_FORMAT_DB
+} GstStreamVolumeFormat;
+
+GType gst_stream_volume_get_type (void);
+void gst_stream_volume_set_volume (GstStreamVolume *volume,
+ GstStreamVolumeFormat format,
+ gdouble val);
+gdouble gst_stream_volume_get_volume (GstStreamVolume *volume,
+ GstStreamVolumeFormat format);
+
+void gst_stream_volume_set_mute (GstStreamVolume *volume,
+ gboolean mute);
+gboolean gst_stream_volume_get_mute (GstStreamVolume *volume);
+
+gdouble gst_stream_volume_convert_volume (GstStreamVolumeFormat from,
+ GstStreamVolumeFormat to,
+ gdouble val) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GST_STREAM_VOLUME_H__ */
diff --git a/gst-libs/gst/interfaces/tuner.c b/gst-libs/gst/interfaces/tuner.c
new file mode 100644
index 0000000..4e35dac
--- /dev/null
+++ b/gst-libs/gst/interfaces/tuner.c
@@ -0,0 +1,577 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tuner.c: tuner design virtual class function wrappers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "tuner.h"
+#include "interfaces-marshal.h"
+
+#include <string.h>
+
+/**
+ * SECTION:gsttuner
+ * @short_description: Interface for elements providing tuner operations
+ *
+ * <refsect2>
+ * <para>
+ * The GstTuner interface is provided by elements that have the ability to
+ * tune into multiple input signals, for example TV or radio capture cards.
+ * </para><para>
+ * The interpretation of 'tuning into' an input stream depends on the element
+ * implementing the interface. For v4lsrc, it might imply selection of an
+ * input source and/or frequency to be configured on a TV card. Another
+ * GstTuner implementation might be to allow selection of an active input pad
+ * from multiple input pads.
+ * </para><para>
+ * That said, the GstTuner interface functions are biased toward the
+ * TV capture scenario.
+ * </para><para>
+ * The general parameters provided are for configuration are:
+ * <itemizedlist>
+ * <listitem>Selection of a current #GstTunerChannel. The current channel
+ * represents the input source (e.g. Composite, S-Video etc for TV capture).
+ * </listitem>
+ * <listitem>The #GstTunerNorm for the channel. The norm chooses the
+ * interpretation of the incoming signal for the current channel. For example,
+ * PAL or NTSC, or more specific variants there-of.
+ * </listitem>
+ * <listitem>Channel frequency. If the current channel has the ability to tune
+ * between multiple frequencies (if it has the GST_TUNER_CHANNEL_FREQUENCY flag)
+ * then the frequency can be changed/retrieved via the
+ * gst_tuner_set_frequency() and gst_tuner_get_frequency() methods.
+ * </listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * Where applicable, the signal strength can be retrieved and/or monitored
+ * via a signal.
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME 0.11: check if we need to add API for sometimes-supportedness
+ * (aka making up for GstImplementsInterface removal) */
+
+/* FIXME 0.11: replace signals with messages (+ make API thread-safe) */
+
+enum
+{
+ NORM_CHANGED,
+ CHANNEL_CHANGED,
+ FREQUENCY_CHANGED,
+ SIGNAL_CHANGED,
+ LAST_SIGNAL
+};
+
+static void gst_tuner_class_init (GstTunerClass * klass);
+
+static guint gst_tuner_signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_tuner_get_type (void)
+{
+ static GType gst_tuner_type = 0;
+
+ if (!gst_tuner_type) {
+ static const GTypeInfo gst_tuner_info = {
+ sizeof (GstTunerClass),
+ (GBaseInitFunc) gst_tuner_class_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_tuner_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstTuner", &gst_tuner_info, 0);
+ }
+
+ return gst_tuner_type;
+}
+
+static void
+gst_tuner_class_init (GstTunerClass * klass)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /**
+ * GstTuner::norm-changed:
+ * @tuner: The element providing the GstTuner interface
+ * @norm: The new configured norm.
+ *
+ * Reports that the current #GstTunerNorm has changed.
+ */
+ gst_tuner_signals[NORM_CHANGED] =
+ g_signal_new ("norm-changed",
+ GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerClass, norm_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_TUNER_NORM);
+ /**
+ * GstTuner::channel-changed:
+ * @tuner: The element providing the GstTuner interface
+ * @channel: The new configured channel.
+ *
+ * Reports that the current #GstTunerChannel has changed.
+ */
+ gst_tuner_signals[CHANNEL_CHANGED] =
+ g_signal_new ("channel-changed",
+ GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerClass, channel_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1,
+ GST_TYPE_TUNER_CHANNEL);
+ /**
+ * GstTuner::frequency-changed:
+ * @tuner: The element providing the GstTuner interface
+ * @frequency: The new frequency (an unsigned long)
+ *
+ * Reports that the current frequency has changed.
+ */
+ gst_tuner_signals[FREQUENCY_CHANGED] =
+ g_signal_new ("frequency-changed",
+ GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerClass, frequency_changed),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_ULONG, G_TYPE_NONE, 2,
+ GST_TYPE_TUNER_CHANNEL, G_TYPE_ULONG);
+ /**
+ * GstTuner::signal-changed:
+ * @tuner: The element providing the GstTuner interface
+ * @channel: The current #GstTunerChannel
+ * @signal: The new signal strength (an integer)
+ *
+ * Reports that the signal strength has changed.
+ *
+ * See Also: gst_tuner_signal_strength()
+ */
+ gst_tuner_signals[SIGNAL_CHANGED] =
+ g_signal_new ("signal-changed",
+ GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerClass, signal_changed),
+ NULL, NULL,
+ gst_interfaces_marshal_VOID__OBJECT_INT, G_TYPE_NONE, 2,
+ GST_TYPE_TUNER_CHANNEL, G_TYPE_INT);
+
+ initialized = TRUE;
+ }
+
+ /* default virtual functions */
+ klass->list_channels = NULL;
+ klass->set_channel = NULL;
+ klass->get_channel = NULL;
+
+ klass->list_norms = NULL;
+ klass->set_norm = NULL;
+ klass->get_norm = NULL;
+
+ klass->set_frequency = NULL;
+ klass->get_frequency = NULL;
+ klass->signal_strength = NULL;
+}
+
+/**
+ * gst_tuner_list_channels:
+ * @tuner: the #GstTuner (a #GstElement) to get the channels from.
+ *
+ * Retrieve a #GList of #GstTunerChannels available
+ * (e.g. 'composite', 's-video', ...) from the given tuner object.
+ *
+ * Returns: A list of channels available on this tuner. The list is
+ * owned by the GstTuner and must not be freed.
+ */
+const GList *
+gst_tuner_list_channels (GstTuner * tuner)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->list_channels) {
+ return klass->list_channels (tuner);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_tuner_set_channel:
+ * @tuner: the #GstTuner (a #GstElement) that owns the channel.
+ * @channel: the channel to tune to.
+ *
+ * Tunes the object to the given channel, which should be one of the
+ * channels returned by gst_tuner_list_channels().
+ */
+
+void
+gst_tuner_set_channel (GstTuner * tuner, GstTunerChannel * channel)
+{
+ GstTunerClass *klass;
+
+ g_return_if_fail (GST_IS_TUNER (tuner));
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->set_channel) {
+ klass->set_channel (tuner, channel);
+ }
+}
+
+/**
+ * gst_tuner_get_channel:
+ * @tuner: the #GstTuner (a #GstElement) to get the current channel from.
+ *
+ * Retrieve the current channel from the tuner.
+ *
+ * Returns: the current channel of the tuner object.
+ */
+
+GstTunerChannel *
+gst_tuner_get_channel (GstTuner * tuner)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->get_channel) {
+ return klass->get_channel (tuner);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_tuner_list_norms:
+ * @tuner: the #GstTuner (*a #GstElement) to get the list of norms from.
+ *
+ * Retrieve a GList of available #GstTunerNorm settings for the currently
+ * tuned channel on the given tuner object.
+ *
+ * Returns: A list of norms available on the current channel for this
+ * tuner object. The list is owned by the GstTuner and must not
+ * be freed.
+ */
+
+const GList *
+gst_tuner_list_norms (GstTuner * tuner)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->list_norms) {
+ return klass->list_norms (tuner);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_tuner_set_norm:
+ * @tuner: the #GstTuner (a #GstElement) to set the norm on.
+ * @norm: the norm to use for the current channel.
+ *
+ * Changes the video norm on this tuner to the given norm, which should be
+ * one of the norms returned by gst_tuner_list_norms().
+ */
+
+void
+gst_tuner_set_norm (GstTuner * tuner, GstTunerNorm * norm)
+{
+ GstTunerClass *klass;
+
+ g_return_if_fail (GST_IS_TUNER (tuner));
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->set_norm) {
+ klass->set_norm (tuner, norm);
+ }
+}
+
+/**
+ * gst_tuner_get_norm:
+ * @tuner: the #GstTuner (a #GstElement) to get the current norm from.
+ *
+ * Get the current video norm from the given tuner object for the
+ * currently selected channel.
+ *
+ * Returns: the current norm.
+ */
+
+GstTunerNorm *
+gst_tuner_get_norm (GstTuner * tuner)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->get_norm) {
+ return klass->get_norm (tuner);
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_tuner_set_frequency:
+ * @tuner: The #GstTuner (a #GstElement) that owns the given channel.
+ * @channel: The #GstTunerChannel to set the frequency on.
+ * @frequency: The frequency to tune in to.
+ *
+ * Sets a tuning frequency on the given tuner/channel. Note that this
+ * requires the given channel to be a "tuning" channel, which can be
+ * checked using GST_TUNER_CHANNEL_HAS_FLAG (), with the proper flag
+ * being GST_TUNER_CHANNEL_FREQUENCY.
+ *
+ * The frequency is in Hz, with minimum steps indicated by the
+ * frequency_multiplicator provided in the #GstTunerChannel. The
+ * valid range is provided in the min_frequency and max_frequency properties
+ * of the #GstTunerChannel.
+ */
+
+void
+gst_tuner_set_frequency (GstTuner * tuner,
+ GstTunerChannel * channel, gulong frequency)
+{
+ GstTunerClass *klass;
+
+ g_return_if_fail (GST_IS_TUNER (tuner));
+ g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
+ g_return_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
+ GST_TUNER_CHANNEL_FREQUENCY));
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->set_frequency) {
+ klass->set_frequency (tuner, channel, frequency);
+ }
+}
+
+/**
+ * gst_tuner_get_frequency:
+ * @tuner: The #GstTuner (a #GstElement) that owns the given channel.
+ * @channel: The #GstTunerChannel to retrieve the frequency from.
+ *
+ * Retrieve the current frequency from the given channel. As for
+ * gst_tuner_set_frequency(), the #GstTunerChannel must support frequency
+ * operations, as indicated by the GST_TUNER_CHANNEL_FREQUENCY flag.
+ *
+ * Returns: The current frequency, or 0 on error.
+ */
+
+gulong
+gst_tuner_get_frequency (GstTuner * tuner, GstTunerChannel * channel)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), 0);
+ g_return_val_if_fail (GST_IS_TUNER_CHANNEL (channel), 0);
+ g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
+ GST_TUNER_CHANNEL_FREQUENCY), 0);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+
+ if (klass->get_frequency) {
+ return klass->get_frequency (tuner, channel);
+ }
+
+ return 0;
+}
+
+/**
+ * gst_tuner_signal_strength:
+ * @tuner: the #GstTuner (a #GstElement) that owns the given channel.
+ * @channel: the #GstTunerChannel to get the signal strength from.
+ *
+ * Get the strength of the signal on this channel. Note that this
+ * requires the current channel to be a "tuning" channel, i.e. a
+ * channel on which frequency can be set. This can be checked using
+ * GST_TUNER_CHANNEL_HAS_FLAG (), and the appropriate flag to check
+ * for is GST_TUNER_CHANNEL_FREQUENCY.
+ *
+ * The valid range of the signal strength is indicated in the
+ * min_signal and max_signal properties of the #GstTunerChannel.
+ *
+ * Returns: Signal strength, or 0 on error.
+ */
+gint
+gst_tuner_signal_strength (GstTuner * tuner, GstTunerChannel * channel)
+{
+ GstTunerClass *klass;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), 0);
+ g_return_val_if_fail (GST_IS_TUNER_CHANNEL (channel), 0);
+ g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
+ GST_TUNER_CHANNEL_FREQUENCY), 0);
+
+ klass = GST_TUNER_GET_CLASS (tuner);
+ if (klass->signal_strength) {
+ return klass->signal_strength (tuner, channel);
+ }
+
+ return 0;
+}
+
+/**
+ * gst_tuner_find_norm_by_name:
+ * @tuner: A #GstTuner instance
+ * @norm: A string containing the name of a #GstTunerNorm
+ *
+ * Look up a #GstTunerNorm by name.
+ *
+ * Returns: A #GstTunerNorm, or NULL if no norm with the provided name
+ * is available.
+ */
+GstTunerNorm *
+gst_tuner_find_norm_by_name (GstTuner * tuner, gchar * norm)
+{
+ GList *walk;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+ g_return_val_if_fail (norm != NULL, NULL);
+
+ walk = (GList *) gst_tuner_list_norms (tuner);
+ while (walk) {
+ if (strcmp (GST_TUNER_NORM (walk->data)->label, norm) == 0)
+ return GST_TUNER_NORM (walk->data);
+ walk = g_list_next (walk);
+ }
+ return NULL;
+}
+
+/**
+ * gst_tuner_find_channel_by_name:
+ * @tuner: A #GstTuner instance
+ * @channel: A string containing the name of a #GstTunerChannel
+ *
+ * Look up a #GstTunerChannel by name.
+ *
+ * Returns: A #GstTunerChannel, or NULL if no channel with the provided name
+ * is available.
+ */
+GstTunerChannel *
+gst_tuner_find_channel_by_name (GstTuner * tuner, gchar * channel)
+{
+ GList *walk;
+
+ g_return_val_if_fail (GST_IS_TUNER (tuner), NULL);
+ g_return_val_if_fail (channel != NULL, NULL);
+
+ walk = (GList *) gst_tuner_list_channels (tuner);
+ while (walk) {
+ if (strcmp (GST_TUNER_CHANNEL (walk->data)->label, channel) == 0)
+ return GST_TUNER_CHANNEL (walk->data);
+ walk = g_list_next (walk);
+ }
+ return NULL;
+}
+
+/**
+ * gst_tuner_channel_changed:
+ * @tuner: A #GstTuner instance
+ * @channel: A #GstTunerChannel instance
+ *
+ * Called by elements implementing the #GstTuner interface when the
+ * current channel changes. Fires the #GstTuner::channel-changed signal.
+ */
+void
+gst_tuner_channel_changed (GstTuner * tuner, GstTunerChannel * channel)
+{
+ g_return_if_fail (GST_IS_TUNER (tuner));
+ g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
+
+ g_signal_emit (G_OBJECT (tuner),
+ gst_tuner_signals[CHANNEL_CHANGED], 0, channel);
+}
+
+/**
+ * gst_tuner_norm_changed:
+ * @tuner: A #GstTuner instance
+ * @norm: A #GstTunerNorm instance
+ *
+ * Called by elements implementing the #GstTuner interface when the
+ * current norm changes. Fires the #GstTuner::norm-changed signal.
+ *
+ */
+void
+gst_tuner_norm_changed (GstTuner * tuner, GstTunerNorm * norm)
+{
+ g_return_if_fail (GST_IS_TUNER (tuner));
+ g_return_if_fail (GST_IS_TUNER_NORM (norm));
+
+ g_signal_emit (G_OBJECT (tuner), gst_tuner_signals[NORM_CHANGED], 0, norm);
+}
+
+/**
+ * gst_tuner_frequency_changed:
+ * @tuner: A #GstTuner instance
+ * @channel: The current #GstTunerChannel
+ * @frequency: The new frequency setting
+ *
+ * Called by elements implementing the #GstTuner interface when the
+ * configured frequency changes. Fires the #GstTuner::frequency-changed
+ * signal on the tuner, and the #GstTunerChannel::frequency-changed signal
+ * on the channel.
+ */
+void
+gst_tuner_frequency_changed (GstTuner * tuner,
+ GstTunerChannel * channel, gulong frequency)
+{
+ g_return_if_fail (GST_IS_TUNER (tuner));
+ g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
+
+ g_signal_emit (G_OBJECT (tuner),
+ gst_tuner_signals[FREQUENCY_CHANGED], 0, channel, frequency);
+
+ g_signal_emit_by_name (G_OBJECT (channel), "frequency_changed", frequency);
+}
+
+/**
+ * gst_tuner_signal_changed:
+ * @tuner: A #GstTuner instance
+ * @channel: The current #GstTunerChannel
+ * @signal: The new signal strength
+ *
+ * Called by elements implementing the #GstTuner interface when the
+ * incoming signal strength changes. Fires the #GstTuner::signal-changed
+ * signal on the tuner and the #GstTunerChannel::signal-changed signal on
+ * the channel.
+ */
+void
+gst_tuner_signal_changed (GstTuner * tuner,
+ GstTunerChannel * channel, gint signal)
+{
+ g_return_if_fail (GST_IS_TUNER (tuner));
+ g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
+
+ g_signal_emit (G_OBJECT (tuner),
+ gst_tuner_signals[SIGNAL_CHANGED], 0, channel, signal);
+
+ g_signal_emit_by_name (G_OBJECT (channel), "signal_changed", signal);
+}
diff --git a/gst-libs/gst/interfaces/tuner.h b/gst-libs/gst/interfaces/tuner.h
new file mode 100644
index 0000000..09158d4
--- /dev/null
+++ b/gst-libs/gst/interfaces/tuner.h
@@ -0,0 +1,150 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tuner.h: tuner interface design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TUNER_H__
+#define __GST_TUNER_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/tunernorm.h>
+#include <gst/interfaces/tunerchannel.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+
+G_BEGIN_DECLS
+
+/* FIXME 0.11: remove all CLASS bits, this is an interface */
+
+#define GST_TYPE_TUNER \
+ (gst_tuner_get_type ())
+#define GST_TUNER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER, GstTuner))
+#define GST_TUNER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER, GstTunerClass))
+#define GST_IS_TUNER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER))
+#define GST_IS_TUNER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER))
+#define GST_TUNER_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_TUNER, GstTunerClass))
+
+typedef struct _GstTuner GstTuner;
+typedef struct _GstTunerClass GstTunerClass;
+
+/**
+ * GstTunerClass:
+ * @klass: the parent interface
+ * @list_channels: list available channels
+ * @set_channel: set to a channel
+ * @get_channel: return the current channel
+ * @list_norms: list available norms
+ * @set_norm: set a norm
+ * @get_norm: return the current norm
+ * @set_frequency: set the frequency
+ * @get_frequency: return the current frequency
+ * @signal_strength: get the signal strength
+ * @channel_changed: default handler for channel changed notification
+ * @norm_changed: default handler for norm changed notification
+ * @frequency_changed: default handler for frequency changed notification
+ * @signal_changed: default handler for signal-strength changed notification
+ *
+ * Tuner interface.
+ */
+struct _GstTunerClass {
+ GTypeInterface klass;
+
+ /* virtual functions */
+ const GList * (* list_channels) (GstTuner *tuner);
+ void (* set_channel) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ GstTunerChannel *
+ (* get_channel) (GstTuner *tuner);
+
+ const GList * (* list_norms) (GstTuner *tuner);
+ void (* set_norm) (GstTuner *tuner,
+ GstTunerNorm *norm);
+ GstTunerNorm *(* get_norm) (GstTuner *tuner);
+
+ void (* set_frequency) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+ gulong (* get_frequency) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ gint (* signal_strength) (GstTuner *tuner,
+ GstTunerChannel *channel);
+
+ /* signals */
+ void (*channel_changed) (GstTuner *tuner,
+ GstTunerChannel *channel);
+ void (*norm_changed) (GstTuner *tuner,
+ GstTunerNorm *norm);
+ void (*frequency_changed) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+ void (*signal_changed) (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gint signal);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tuner_get_type (void);
+
+/* virtual class function wrappers */
+const GList * gst_tuner_list_channels (GstTuner *tuner);
+void gst_tuner_set_channel (GstTuner *tuner,
+ GstTunerChannel *channel);
+GstTunerChannel *
+ gst_tuner_get_channel (GstTuner *tuner);
+
+const GList * gst_tuner_list_norms (GstTuner *tuner);
+void gst_tuner_set_norm (GstTuner *tuner,
+ GstTunerNorm *norm);
+GstTunerNorm * gst_tuner_get_norm (GstTuner *tuner);
+
+void gst_tuner_set_frequency (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+gulong gst_tuner_get_frequency (GstTuner *tuner,
+ GstTunerChannel *channel);
+gint gst_tuner_signal_strength (GstTuner *tuner,
+ GstTunerChannel *channel);
+
+/* helper functions */
+GstTunerNorm * gst_tuner_find_norm_by_name (GstTuner *tuner,
+ gchar *norm);
+GstTunerChannel *gst_tuner_find_channel_by_name (GstTuner *tuner,
+ gchar *channel);
+
+/* trigger signals */
+void gst_tuner_channel_changed (GstTuner *tuner,
+ GstTunerChannel *channel);
+void gst_tuner_norm_changed (GstTuner *tuner,
+ GstTunerNorm *norm);
+void gst_tuner_frequency_changed (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gulong frequency);
+void gst_tuner_signal_changed (GstTuner *tuner,
+ GstTunerChannel *channel,
+ gint signal);
+
+G_END_DECLS
+
+#endif /* __GST_TUNER_H__ */
diff --git a/gst-libs/gst/interfaces/tunerchannel.c b/gst-libs/gst/interfaces/tunerchannel.c
new file mode 100644
index 0000000..ac2b74e
--- /dev/null
+++ b/gst-libs/gst/interfaces/tunerchannel.c
@@ -0,0 +1,148 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tunerchannel.c: tuner channel object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "tunerchannel.h"
+
+/**
+ * SECTION:gsttunerchannel
+ * @short_description: A channel from an element implementing the #GstTuner
+ * interface.
+ *
+ * <refsect2>
+ * <para>The #GstTunerChannel object is provided by an element implementing
+ * the #GstTuner interface.
+ * </para>
+ * <para>
+ * GstTunerChannel provides a name and flags to determine the type and
+ * capabilities of the channel. If the GST_TUNER_CHANNEL_FREQUENCY flag is
+ * set, then the channel also information about the minimum and maximum
+ * frequency, and range of the reported signal strength.
+ * </para>
+ * </refsect2>
+ */
+
+enum
+{
+ /* FILL ME */
+ SIGNAL_FREQUENCY_CHANGED,
+ SIGNAL_SIGNAL_CHANGED,
+ LAST_SIGNAL
+};
+
+static void gst_tuner_channel_class_init (GstTunerChannelClass * klass);
+static void gst_tuner_channel_init (GstTunerChannel * channel);
+static void gst_tuner_channel_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_tuner_channel_get_type (void)
+{
+ static GType gst_tuner_channel_type = 0;
+
+ if (!gst_tuner_channel_type) {
+ static const GTypeInfo tuner_channel_info = {
+ sizeof (GstTunerChannelClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_tuner_channel_class_init,
+ NULL,
+ NULL,
+ sizeof (GstTunerChannel),
+ 0,
+ (GInstanceInitFunc) gst_tuner_channel_init,
+ NULL
+ };
+
+ gst_tuner_channel_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "GstTunerChannel", &tuner_channel_info, 0);
+ }
+
+ return gst_tuner_channel_type;
+}
+
+static void
+gst_tuner_channel_class_init (GstTunerChannelClass * klass)
+{
+ GObjectClass *object_klass = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GstTunerChannel::frequency-changed:
+ * @tunerchannel: The #GstTunerChannel
+ * @frequency: The new frequency (an unsigned long)
+ *
+ * Reports that the current frequency has changed.
+ */
+ signals[SIGNAL_FREQUENCY_CHANGED] =
+ g_signal_new ("frequency-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerChannelClass,
+ frequency_changed),
+ NULL, NULL, g_cclosure_marshal_VOID__ULONG, G_TYPE_NONE, 1, G_TYPE_ULONG);
+ /**
+ * GstTunerChannel::signal-changed:
+ * @tunerchannel: The #GstTunerChannel
+ * @signal: The new signal strength (an integer)
+ *
+ * Reports that the signal strength has changed.
+ *
+ * See Also: gst_tuner_signal_strength()
+ */
+ signals[SIGNAL_SIGNAL_CHANGED] =
+ g_signal_new ("signal-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstTunerChannelClass,
+ signal_changed),
+ NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ object_klass->dispose = gst_tuner_channel_dispose;
+}
+
+static void
+gst_tuner_channel_init (GstTunerChannel * channel)
+{
+ channel->label = NULL;
+ channel->flags = 0;
+ channel->min_frequency = channel->max_frequency = 0;
+ channel->min_signal = channel->max_signal = 0;
+}
+
+static void
+gst_tuner_channel_dispose (GObject * object)
+{
+ GstTunerChannel *channel = GST_TUNER_CHANNEL (object);
+
+ if (channel->label) {
+ g_free (channel->label);
+ channel->label = NULL;
+ }
+
+ if (parent_class->dispose)
+ parent_class->dispose (object);
+}
diff --git a/gst-libs/gst/interfaces/tunerchannel.h b/gst-libs/gst/interfaces/tunerchannel.h
new file mode 100644
index 0000000..45c9c3f
--- /dev/null
+++ b/gst-libs/gst/interfaces/tunerchannel.h
@@ -0,0 +1,113 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tunerchannel.h: tuner channel object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TUNER_CHANNEL_H__
+#define __GST_TUNER_CHANNEL_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TUNER_CHANNEL \
+ (gst_tuner_channel_get_type ())
+#define GST_TUNER_CHANNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER_CHANNEL, \
+ GstTunerChannel))
+#define GST_TUNER_CHANNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER_CHANNEL, \
+ GstTunerChannelClass))
+#define GST_IS_TUNER_CHANNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER_CHANNEL))
+#define GST_IS_TUNER_CHANNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER_CHANNEL))
+
+typedef struct _GstTunerChannel GstTunerChannel;
+typedef struct _GstTunerChannelClass GstTunerChannelClass;
+
+/**
+ * GstTunerChannelFlags:
+ * @GST_TUNER_CHANNEL_INPUT: The channel is for input
+ * @GST_TUNER_CHANNEL_OUTPUT: The channel is for output
+ * @GST_TUNER_CHANNEL_FREQUENCY: The channel has a frequency setting
+ * and signal strength.
+ * @GST_TUNER_CHANNEL_AUDIO: The channel carries audio.
+ *
+ * An enumeration for flags indicating the available capabilities
+ * of a #GstTunerChannel.
+ */
+typedef enum {
+ GST_TUNER_CHANNEL_INPUT = (1<<0),
+ GST_TUNER_CHANNEL_OUTPUT = (1<<1),
+ GST_TUNER_CHANNEL_FREQUENCY = (1<<2),
+ GST_TUNER_CHANNEL_AUDIO = (1<<3)
+} GstTunerChannelFlags;
+
+/**
+ * GST_TUNER_CHANNEL_HAS_FLAG:
+ * @channel: A #GstTunerChannel
+ * @flag: The flag to check for
+ *
+ * Macro to check if the given flag is set on a channel
+ */
+#define GST_TUNER_CHANNEL_HAS_FLAG(channel, flag) \
+ ((channel)->flags & flag)
+
+/**
+ * GstTunerChannel:
+ * @label: A string containing a descriptive name for this channel
+ * @flags: A set of #GstTunerChannelFlags for this channel
+ * @freq_multiplicator: The step size (in Hz) for the frequency setting.
+ * @min_frequency: Minimum valid frequency setting (in Hz).
+ * @max_frequency: Maximum valid frequency setting (in Hz).
+ * @min_signal: Minimum reported signal strength value.
+ * @max_signal: Maximum reported signal strength value.
+ */
+struct _GstTunerChannel {
+ GObject parent;
+
+ /*< public >*/
+ gchar *label;
+ GstTunerChannelFlags flags;
+ gfloat freq_multiplicator;
+ gulong min_frequency;
+ gulong max_frequency;
+ gint min_signal;
+ gint max_signal;
+};
+
+struct _GstTunerChannelClass {
+ GObjectClass parent;
+
+ /*< private >*/
+ /* signals */
+ void (*frequency_changed) (GstTunerChannel *channel,
+ gulong frequency);
+ void (*signal_changed) (GstTunerChannel *channel,
+ gint signal);
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tuner_channel_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TUNER_CHANNEL_H__ */
diff --git a/gst-libs/gst/interfaces/tunernorm.c b/gst-libs/gst/interfaces/tunernorm.c
new file mode 100644
index 0000000..47260b0
--- /dev/null
+++ b/gst-libs/gst/interfaces/tunernorm.c
@@ -0,0 +1,111 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tunernorm.c: tuner norm object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "tunernorm.h"
+
+/**
+ * SECTION:gsttunernorm
+ * @short_description: Encapsulates information about the data format(s)
+ * for a #GstTunerChannel.
+ *
+ * <refsect2>
+ * <para>The #GstTunerNorm object is created by an element implementing the
+ * #GstTuner interface and encapsulates the selection of a capture/output format
+ * for a selected #GstTunerChannel.
+ * </para>
+ * </refsect2>
+ */
+
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+static void gst_tuner_norm_class_init (GstTunerNormClass * klass);
+static void gst_tuner_norm_init (GstTunerNorm * norm);
+static void gst_tuner_norm_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+
+/*static guint signals[LAST_SIGNAL] = { 0 };*/
+
+GType
+gst_tuner_norm_get_type (void)
+{
+ static GType gst_tuner_norm_type = 0;
+
+ if (!gst_tuner_norm_type) {
+ static const GTypeInfo tuner_norm_info = {
+ sizeof (GstTunerNormClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_tuner_norm_class_init,
+ NULL,
+ NULL,
+ sizeof (GstTunerNorm),
+ 0,
+ (GInstanceInitFunc) gst_tuner_norm_init,
+ NULL
+ };
+
+ gst_tuner_norm_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "GstTunerNorm", &tuner_norm_info, 0);
+ }
+
+ return gst_tuner_norm_type;
+}
+
+static void
+gst_tuner_norm_class_init (GstTunerNormClass * klass)
+{
+ GObjectClass *object_klass = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_klass->dispose = gst_tuner_norm_dispose;
+}
+
+static void
+gst_tuner_norm_init (GstTunerNorm * norm)
+{
+ norm->label = NULL;
+ g_value_init (&norm->framerate, GST_TYPE_FRACTION);
+}
+
+static void
+gst_tuner_norm_dispose (GObject * object)
+{
+ GstTunerNorm *norm = GST_TUNER_NORM (object);
+
+ if (norm->label) {
+ g_free (norm->label);
+ norm->label = NULL;
+ }
+
+ if (parent_class->dispose)
+ parent_class->dispose (object);
+}
diff --git a/gst-libs/gst/interfaces/tunernorm.h b/gst-libs/gst/interfaces/tunernorm.h
new file mode 100644
index 0000000..d93cb13
--- /dev/null
+++ b/gst-libs/gst/interfaces/tunernorm.h
@@ -0,0 +1,67 @@
+/* GStreamer Tuner
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * tunernorm.h: tuner norm object design
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TUNER_NORM_H__
+#define __GST_TUNER_NORM_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TUNER_NORM \
+ (gst_tuner_norm_get_type ())
+#define GST_TUNER_NORM(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER_NORM, GstTunerNorm))
+#define GST_TUNER_NORM_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER_NORM, GstTunerNormClass))
+#define GST_IS_TUNER_NORM(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER_NORM))
+#define GST_IS_TUNER_NORM_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER_NORM))
+
+typedef struct _GstTunerNorm GstTunerNorm;
+typedef struct _GstTunerNormClass GstTunerNormClass;
+
+/**
+ * GstTunerNorm:
+ * @label: A string containing a descriptive name for the norm
+ * @framerate: A GValue containing the framerate associated with this norm,
+ * if any. (May be unset).
+ */
+struct _GstTunerNorm {
+ GObject parent;
+
+ /*< public >*/
+ gchar *label;
+ GValue framerate;
+};
+
+struct _GstTunerNormClass {
+ GObjectClass parent;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tuner_norm_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TUNER_NORM_H__ */
diff --git a/gst-libs/gst/interfaces/videoorientation.c b/gst-libs/gst/interfaces/videoorientation.c
new file mode 100644
index 0000000..4918862
--- /dev/null
+++ b/gst-libs/gst/interfaces/videoorientation.c
@@ -0,0 +1,271 @@
+/* GStreamer
+ * Copyright (C) 2006 Nokia <stefan.kost@nokia.com>
+ *
+ * videoorientation.c: video flipping and centering interface
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "videoorientation.h"
+#include "interfaces-marshal.h"
+
+#include <string.h>
+
+/**
+ * SECTION:gstvideoorientation
+ * @short_description: Interface for elements providing video orientation
+ * controls
+ *
+ * The interface allows unified access to control flipping and autocenter
+ * operation of video-sources or operators.
+ *
+ * Since: 0.10.11
+ */
+
+/* FIXME 0.11: check if we need to add API for sometimes-supportedness
+ * (aka making up for GstImplementsInterface removal) (probably yes) */
+
+static void gst_video_orientation_iface_init (GstVideoOrientationInterface *
+ iface);
+
+GType
+gst_video_orientation_get_type (void)
+{
+ static GType gst_video_orientation_type = 0;
+
+ if (!gst_video_orientation_type) {
+ static const GTypeInfo gst_video_orientation_info = {
+ sizeof (GstVideoOrientationInterface),
+ (GBaseInitFunc) gst_video_orientation_iface_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_video_orientation_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstVideoOrientation", &gst_video_orientation_info, 0);
+ }
+
+ return gst_video_orientation_type;
+}
+
+static void
+gst_video_orientation_iface_init (GstVideoOrientationInterface * iface)
+{
+ /* default virtual functions */
+
+ iface->get_hflip = NULL;
+ iface->get_vflip = NULL;
+ iface->get_hcenter = NULL;
+ iface->get_vcenter = NULL;
+
+ iface->set_hflip = NULL;
+ iface->set_vflip = NULL;
+ iface->set_hcenter = NULL;
+ iface->set_vcenter = NULL;
+}
+
+/**
+ * gst_video_orientation_get_hflip:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @flip: return location for the result
+ *
+ * Get the horizontal flipping state (%TRUE for flipped) from the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports flipping
+ */
+gboolean
+gst_video_orientation_get_hflip (GstVideoOrientation * video_orientation,
+ gboolean * flip)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->get_hflip) {
+ return iface->get_hflip (video_orientation, flip);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_get_vflip:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @flip: return location for the result
+ *
+ * Get the vertical flipping state (%TRUE for flipped) from the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports flipping
+ */
+gboolean
+gst_video_orientation_get_vflip (GstVideoOrientation * video_orientation,
+ gboolean * flip)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->get_vflip) {
+ return iface->get_vflip (video_orientation, flip);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_get_hcenter:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @center: return location for the result
+ *
+ * Get the horizontal centering offset from the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports centering
+ */
+gboolean
+gst_video_orientation_get_hcenter (GstVideoOrientation * video_orientation,
+ gint * center)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->get_hcenter) {
+ return iface->get_hcenter (video_orientation, center);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_get_vcenter:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @center: return location for the result
+ *
+ * Get the vertical centering offset from the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports centering
+ */
+gboolean
+gst_video_orientation_get_vcenter (GstVideoOrientation * video_orientation,
+ gint * center)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->get_vcenter) {
+ return iface->get_vcenter (video_orientation, center);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_set_hflip:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @flip: use flipping
+ *
+ * Set the horizontal flipping state (%TRUE for flipped) for the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports flipping
+ */
+gboolean
+gst_video_orientation_set_hflip (GstVideoOrientation * video_orientation,
+ gboolean flip)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->set_hflip) {
+ return iface->set_hflip (video_orientation, flip);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_set_vflip:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @flip: use flipping
+ *
+ * Set the vertical flipping state (%TRUE for flipped) for the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports flipping
+ */
+gboolean
+gst_video_orientation_set_vflip (GstVideoOrientation * video_orientation,
+ gboolean flip)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->set_vflip) {
+ return iface->set_vflip (video_orientation, flip);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_set_hcenter:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @center: centering offset
+ *
+ * Set the horizontal centering offset for the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports centering
+ */
+gboolean
+gst_video_orientation_set_hcenter (GstVideoOrientation * video_orientation,
+ gint center)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->set_hcenter) {
+ return iface->set_hcenter (video_orientation, center);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_video_orientation_set_vcenter:
+ * @video_orientation: #GstVideoOrientation interface of a #GstElement
+ * @center: centering offset
+ *
+ * Set the vertical centering offset for the given object.
+ *
+ * Since: 0.10.11
+ * Returns: %TRUE in case the element supports centering
+ */
+gboolean
+gst_video_orientation_set_vcenter (GstVideoOrientation * video_orientation,
+ gint center)
+{
+ GstVideoOrientationInterface *iface =
+ GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation);
+
+ if (iface->set_vcenter) {
+ return iface->set_vcenter (video_orientation, center);
+ }
+ return FALSE;
+}
diff --git a/gst-libs/gst/interfaces/videoorientation.h b/gst-libs/gst/interfaces/videoorientation.h
new file mode 100644
index 0000000..0ace827
--- /dev/null
+++ b/gst-libs/gst/interfaces/videoorientation.h
@@ -0,0 +1,98 @@
+/* GStreamer
+ * Copyright (C) 2006 Nokia <stefan.kost@nokia.com
+ *
+ * videoorientation.h: video flipping and centering interface
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_ORIENTATION_H__
+#define __GST_VIDEO_ORIENTATION_H__
+
+#include <gst/gst.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_ORIENTATION \
+ (gst_video_orientation_get_type ())
+#define GST_VIDEO_ORIENTATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_ORIENTATION, GstVideoOrientation))
+#define GST_IS_VIDEO_ORIENTATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_ORIENTATION))
+#define GST_VIDEO_ORIENTATION_GET_IFACE(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VIDEO_ORIENTATION, GstVideoOrientationInterface))
+
+/**
+ * GstVideoOrientation:
+ *
+ * Opaque #GstVideoOrientation data structure.
+ */
+typedef struct _GstVideoOrientation GstVideoOrientation;
+typedef struct _GstVideoOrientationInterface GstVideoOrientationInterface;
+
+/**
+ * GstVideoOrientationInterface:
+ * @parent: parent interface type.
+ * @get_hflip: virtual method to get horizontal flipping state
+ * @get_vflip: virtual method to get vertical flipping state
+ * @get_hcenter: virtual method to get horizontal centering state
+ * @get_vcenter: virtual method to get vertical centering state
+ * @set_hflip: virtual method to set horizontal flipping state
+ * @set_vflip: virtual method to set vertical flipping state
+ * @set_hcenter: virtual method to set horizontal centering state
+ * @set_vcenter: virtual method to set vertical centering state
+ *
+ * #GstVideoOrientationInterface interface.
+ */
+struct _GstVideoOrientationInterface {
+ GTypeInterface parent;
+
+ /* FIXME 0.11: fix awkward API? add some kind of get_supported flags thing
+ * and then just return booleans/int from all vfuncs requiring the caller
+ * to check the flags first */
+
+ /* virtual functions */
+ gboolean (* get_hflip) (GstVideoOrientation *video_orientation, gboolean *flip);
+ gboolean (* get_vflip) (GstVideoOrientation *video_orientation, gboolean *flip);
+ gboolean (* get_hcenter) (GstVideoOrientation *video_orientation, gint *center);
+ gboolean (* get_vcenter) (GstVideoOrientation *video_orientation, gint *center);
+
+ gboolean (* set_hflip) (GstVideoOrientation *video_orientation, gboolean flip);
+ gboolean (* set_vflip) (GstVideoOrientation *video_orientation, gboolean flip);
+ gboolean (* set_hcenter) (GstVideoOrientation *video_orientation, gint center);
+ gboolean (* set_vcenter) (GstVideoOrientation *video_orientation, gint center);
+
+ /*< private > */
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_video_orientation_get_type (void);
+
+/* virtual class function wrappers */
+gboolean gst_video_orientation_get_hflip (GstVideoOrientation *video_orientation, gboolean *flip);
+gboolean gst_video_orientation_get_vflip (GstVideoOrientation *video_orientation, gboolean *flip);
+gboolean gst_video_orientation_get_hcenter (GstVideoOrientation *video_orientation, gint *center);
+gboolean gst_video_orientation_get_vcenter (GstVideoOrientation *video_orientation, gint *center);
+
+gboolean gst_video_orientation_set_hflip (GstVideoOrientation *video_orientation, gboolean flip);
+gboolean gst_video_orientation_set_vflip (GstVideoOrientation *video_orientation, gboolean flip);
+gboolean gst_video_orientation_set_hcenter (GstVideoOrientation *video_orientation, gint center);
+gboolean gst_video_orientation_set_vcenter (GstVideoOrientation *video_orientation, gint center);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_ORIENTATION_H__ */
diff --git a/gst-libs/gst/interfaces/videooverlay.c b/gst-libs/gst/interfaces/videooverlay.c
new file mode 100644
index 0000000..8901ccb
--- /dev/null
+++ b/gst-libs/gst/interfaces/videooverlay.c
@@ -0,0 +1,512 @@
+/* GStreamer Video Overlay interface
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2011 Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:gstvideooverlay
+ * @short_description: Interface for setting/getting a window system resource
+ * on elements supporting it to configure a window into which to render a
+ * video.
+ *
+ * <refsect2>
+ * <para>
+ * The #GstVideoOverlay interface is used for 2 main purposes :
+ * <itemizedlist>
+ * <listitem>
+ * <para>
+ * To get a grab on the Window where the video sink element is going to render.
+ * This is achieved by either being informed about the Window identifier that
+ * the video sink element generated, or by forcing the video sink element to use
+ * a specific Window identifier for rendering.
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * To force a redrawing of the latest video frame the video sink element
+ * displayed on the Window. Indeed if the #GstPipeline is in #GST_STATE_PAUSED
+ * state, moving the Window around will damage its content. Application
+ * developers will want to handle the Expose events themselves and force the
+ * video sink element to refresh the Window's content.
+ * </para>
+ * </listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * Using the Window created by the video sink is probably the simplest scenario,
+ * in some cases, though, it might not be flexible enough for application
+ * developers if they need to catch events such as mouse moves and button
+ * clicks.
+ * </para>
+ * <para>
+ * Setting a specific Window identifier on the video sink element is the most
+ * flexible solution but it has some issues. Indeed the application needs to set
+ * its Window identifier at the right time to avoid internal Window creation
+ * from the video sink element. To solve this issue a #GstMessage is posted on
+ * the bus to inform the application that it should set the Window identifier
+ * immediately. Here is an example on how to do that correctly:
+ * |[
+ * static GstBusSyncReply
+ * create_window (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+ * {
+ * // ignore anything but 'prepare-window-handle' element messages
+ * if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ * return GST_BUS_PASS;
+ *
+ * win = XCreateSimpleWindow (disp, root, 0, 0, 320, 240, 0, 0, 0);
+ *
+ * XSetWindowBackgroundPixmap (disp, win, None);
+ *
+ * XMapRaised (disp, win);
+ *
+ * XSync (disp, FALSE);
+ *
+ * gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)),
+ * win);
+ *
+ * gst_message_unref (message);
+ *
+ * return GST_BUS_DROP;
+ * }
+ * ...
+ * int
+ * main (int argc, char **argv)
+ * {
+ * ...
+ * bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ * gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, pipeline);
+ * ...
+ * }
+ * ]|
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Two basic usage scenarios</title>
+ * <para>
+ * There are two basic usage scenarios: in the simplest case, the application
+ * knows exactly what particular element is used for video output, which is
+ * usually the case when the application creates the videosink to use
+ * (e.g. #xvimagesink, #ximagesink, etc.) itself; in this case, the application
+ * can just create the videosink element, create and realize the window to
+ * render the video on and then call gst_video_overlay_set_window_handle() directly
+ * with the XID or native window handle, before starting up the pipeline.
+ * </para>
+ * <para>
+ * In the other and more common case, the application does not know in advance
+ * what GStreamer video sink element will be used for video output. This is
+ * usually the case when an element such as #autovideosink or #gconfvideosink
+ * is used. In this case, the video sink element itself is created
+ * asynchronously from a GStreamer streaming thread some time after the
+ * pipeline has been started up. When that happens, however, the video sink
+ * will need to know right then whether to render onto an already existing
+ * application window or whether to create its own window. This is when it
+ * posts a prepare-window-handle message, and that is also why this message needs
+ * to be handled in a sync bus handler which will be called from the streaming
+ * thread directly (because the video sink will need an answer right then).
+ * </para>
+ * <para>
+ * As response to the prepare-window-handle element message in the bus sync
+ * handler, the application may use gst_video_overlay_set_window_handle() to tell
+ * the video sink to render onto an existing window surface. At this point the
+ * application should already have obtained the window handle / XID, so it
+ * just needs to set it. It is generally not advisable to call any GUI toolkit
+ * functions or window system functions from the streaming thread in which the
+ * prepare-window-handle message is handled, because most GUI toolkits and
+ * windowing systems are not thread-safe at all and a lot of care would be
+ * required to co-ordinate the toolkit and window system calls of the
+ * different threads (Gtk+ users please note: prior to Gtk+ 2.18
+ * GDK_WINDOW_XID() was just a simple structure access, so generally fine to do
+ * within the bus sync handler; this macro was changed to a function call in
+ * Gtk+ 2.18 and later, which is likely to cause problems when called from a
+ * sync handler; see below for a better approach without GDK_WINDOW_XID()
+ * used in the callback).
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>GstVideoOverlay and Gtk+</title>
+ * <para>
+ * |[
+ * #include &lt;gtk/gtk.h&gt;
+ * #ifdef GDK_WINDOWING_X11
+ * #include &lt;gdk/gdkx.h&gt; // for GDK_WINDOW_XID
+ * #endif
+ * ...
+ * static gulong video_window_xid = 0;
+ * ...
+ * static GstBusSyncReply
+ * bus_sync_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+ * {
+ * // ignore anything but 'prepare-window-handle' element messages
+ * if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ * return GST_BUS_PASS;
+ *
+ * if (video_window_xid != 0) {
+ * GstVideoOverlay *xoverlay;
+ *
+ * // GST_MESSAGE_SRC (message) will be the video sink element
+ * xoverlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
+ * gst_video_overlay_set_window_handle (xoverlay, video_window_xid);
+ * } else {
+ * g_warning ("Should have obtained video_window_xid by now!");
+ * }
+ *
+ * gst_message_unref (message);
+ * return GST_BUS_DROP;
+ * }
+ * ...
+ * static void
+ * video_widget_realize_cb (GtkWidget * widget, gpointer data)
+ * {
+ * #if GTK_CHECK_VERSION(2,18,0)
+ * // This is here just for pedagogical purposes, GDK_WINDOW_XID will call
+ * // it as well in newer Gtk versions
+ * if (!gdk_window_ensure_native (widget->window))
+ * g_error ("Couldn't create native window needed for GstVideoOverlay!");
+ * #endif
+ *
+ * #ifdef GDK_WINDOWING_X11
+ * video_window_xid = GDK_WINDOW_XID (video_window->window);
+ * #endif
+ * }
+ * ...
+ * int
+ * main (int argc, char **argv)
+ * {
+ * GtkWidget *video_window;
+ * GtkWidget *app_window;
+ * ...
+ * app_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ * ...
+ * video_window = gtk_drawing_area_new ();
+ * g_signal_connect (video_window, "realize",
+ * G_CALLBACK (video_widget_realize_cb), NULL);
+ * gtk_widget_set_double_buffered (video_window, FALSE);
+ * ...
+ * // usually the video_window will not be directly embedded into the
+ * // application window like this, but there will be many other widgets
+ * // and the video window will be embedded in one of them instead
+ * gtk_container_add (GTK_CONTAINER (ap_window), video_window);
+ * ...
+ * // show the GUI
+ * gtk_widget_show_all (app_window);
+ *
+ * // realize window now so that the video window gets created and we can
+ * // obtain its XID before the pipeline is started up and the videosink
+ * // asks for the XID of the window to render onto
+ * gtk_widget_realize (window);
+ *
+ * // we should have the XID now
+ * g_assert (video_window_xid != 0);
+ * ...
+ * // set up sync handler for setting the xid once the pipeline is started
+ * bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ * gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, NULL);
+ * gst_object_unref (bus);
+ * ...
+ * gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ * ...
+ * }
+ * ]|
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>GstVideoOverlay and Qt</title>
+ * <para>
+ * |[
+ * #include &lt;glib.h&gt;
+ * #include &lt;gst/gst.h&gt;
+ * #include &lt;gst/interfaces/videooverlay.h&gt;
+ *
+ * #include &lt;QApplication&gt;
+ * #include &lt;QTimer&gt;
+ * #include &lt;QWidget&gt;
+ *
+ * int main(int argc, char *argv[])
+ * {
+ * if (!g_thread_supported ())
+ * g_thread_init (NULL);
+ *
+ * gst_init (&argc, &argv);
+ * QApplication app(argc, argv);
+ * app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
+ *
+ * // prepare the pipeline
+ *
+ * GstElement *pipeline = gst_pipeline_new ("xvoverlay");
+ * GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
+ * GstElement *sink = gst_element_factory_make ("xvimagesink", NULL);
+ * gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ * gst_element_link (src, sink);
+ *
+ * // prepare the ui
+ *
+ * QWidget window;
+ * window.resize(320, 240);
+ * window.show();
+ *
+ * WId xwinid = window.winId();
+ * gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
+ *
+ * // run the pipeline
+ *
+ * GstStateChangeReturn sret = gst_element_set_state (pipeline,
+ * GST_STATE_PLAYING);
+ * if (sret == GST_STATE_CHANGE_FAILURE) {
+ * gst_element_set_state (pipeline, GST_STATE_NULL);
+ * gst_object_unref (pipeline);
+ * // Exit application
+ * QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
+ * }
+ *
+ * int ret = app.exec();
+ *
+ * window.hide();
+ * gst_element_set_state (pipeline, GST_STATE_NULL);
+ * gst_object_unref (pipeline);
+ *
+ * return ret;
+ * }
+ * ]|
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "videooverlay.h"
+
+GType
+gst_video_overlay_get_type (void)
+{
+ static GType gst_video_overlay_type = 0;
+
+ if (!gst_video_overlay_type) {
+ static const GTypeInfo gst_video_overlay_info = {
+ sizeof (GstVideoOverlayIface),
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ gst_video_overlay_type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstVideoOverlay", &gst_video_overlay_info, 0);
+ }
+
+ return gst_video_overlay_type;
+}
+
+/**
+ * gst_video_overlay_set_window_handle:
+ * @overlay: a #GstVideoOverlay to set the window on.
+ * @handle: a handle referencing the window.
+ *
+ * This will call the video overlay's set_window_handle method. You
+ * should use this method to tell to a XOverlay to display video output to a
+ * specific window (e.g. an XWindow on X11). Passing 0 as the @handle will
+ * tell the overlay to stop using that window and create an internal one.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_video_overlay_set_window_handle (GstVideoOverlay * overlay, guintptr handle)
+{
+ GstVideoOverlayIface *iface;
+
+ g_return_if_fail (overlay != NULL);
+ g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+
+ iface = GST_VIDEO_OVERLAY_GET_IFACE (overlay);
+
+ if (iface->set_window_handle) {
+ iface->set_window_handle (overlay, handle);
+ }
+}
+
+/**
+ * gst_video_overlay_got_window_handle:
+ * @overlay: a #GstVideoOverlay which got a window
+ * @handle: a platform-specific handle referencing the window
+ *
+ * This will post a "have-window-handle" element message on the bus.
+ *
+ * This function should only be used by video overlay plugin developers.
+ */
+void
+gst_video_overlay_got_window_handle (GstVideoOverlay * overlay, guintptr handle)
+{
+ GstStructure *s;
+ GstMessage *msg;
+
+ g_return_if_fail (overlay != NULL);
+ g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+
+ GST_LOG_OBJECT (GST_OBJECT (overlay), "window_handle = %p", (gpointer)
+ handle);
+ s = gst_structure_new ("have-window-handle",
+ "window-handle", G_TYPE_UINT64, (guint64) handle, NULL);
+ msg = gst_message_new_element (GST_OBJECT (overlay), s);
+ gst_element_post_message (GST_ELEMENT (overlay), msg);
+}
+
+/**
+ * gst_video_overlay_prepare_window_handle:
+ * @overlay: a #GstVideoOverlay which does not yet have an Window handle set
+ *
+ * This will post a "prepare-window-handle" element message on the bus
+ * to give applications an opportunity to call
+ * gst_video_overlay_set_window_handle() before a plugin creates its own
+ * window.
+ *
+ * This function should only be used by video overlay plugin developers.
+ */
+void
+gst_video_overlay_prepare_window_handle (GstVideoOverlay * overlay)
+{
+ GstStructure *s;
+ GstMessage *msg;
+
+ g_return_if_fail (overlay != NULL);
+ g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+
+ GST_LOG_OBJECT (GST_OBJECT (overlay), "prepare window handle");
+ s = gst_structure_new ("prepare-window-handle", NULL);
+ msg = gst_message_new_element (GST_OBJECT (overlay), s);
+ gst_element_post_message (GST_ELEMENT (overlay), msg);
+}
+
+/**
+ * gst_video_overlay_expose:
+ * @overlay: a #GstVideoOverlay to expose.
+ *
+ * Tell an overlay that it has been exposed. This will redraw the current frame
+ * in the drawable even if the pipeline is PAUSED.
+ */
+void
+gst_video_overlay_expose (GstVideoOverlay * overlay)
+{
+ GstVideoOverlayIface *iface;
+
+ g_return_if_fail (overlay != NULL);
+ g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+
+ iface = GST_VIDEO_OVERLAY_GET_IFACE (overlay);
+
+ if (iface->expose) {
+ iface->expose (overlay);
+ }
+}
+
+/**
+ * gst_video_overlay_handle_events:
+ * @overlay: a #GstVideoOverlay to expose.
+ * @handle_events: a #gboolean indicating if events should be handled or not.
+ *
+ * Tell an overlay that it should handle events from the window system. These
+ * events are forwared upstream as navigation events. In some window system,
+ * events are not propagated in the window hierarchy if a client is listening
+ * for them. This method allows you to disable events handling completely
+ * from the XOverlay.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_video_overlay_handle_events (GstVideoOverlay * overlay,
+ gboolean handle_events)
+{
+ GstVideoOverlayIface *iface;
+
+ g_return_if_fail (overlay != NULL);
+ g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+
+ iface = GST_VIDEO_OVERLAY_GET_IFACE (overlay);
+
+ if (iface->handle_events) {
+ iface->handle_events (overlay, handle_events);
+ }
+}
+
+/**
+ * gst_video_overlay_set_render_rectangle:
+ * @overlay: a #GstVideoOverlay
+ * @x: the horizontal offset of the render area inside the window
+ * @y: the vertical offset of the render area inside the window
+ * @width: the width of the render area inside the window
+ * @height: the height of the render area inside the window
+ *
+ * Configure a subregion as a video target within the window set by
+ * gst_video_overlay_set_window_handle(). If this is not used or not supported
+ * the video will fill the area of the window set as the overlay to 100%.
+ * By specifying the rectangle, the video can be overlayed to a specific region
+ * of that window only. After setting the new rectangle one should call
+ * gst_video_overlay_expose() to force a redraw. To unset the region pass -1 for
+ * the @width and @height parameters.
+ *
+ * This method is needed for non fullscreen video overlay in UI toolkits that
+ * do not support subwindows.
+ *
+ * Returns: %FALSE if not supported by the sink.
+ *
+ * Since: 0.10.29
+ */
+gboolean
+gst_video_overlay_set_render_rectangle (GstVideoOverlay * overlay,
+ gint x, gint y, gint width, gint height)
+{
+ GstVideoOverlayIface *iface;
+
+ g_return_val_if_fail (overlay != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (overlay), FALSE);
+ g_return_val_if_fail ((width == -1 && height == -1) ||
+ (width > 0 && height > 0), FALSE);
+
+ iface = GST_VIDEO_OVERLAY_GET_IFACE (overlay);
+
+ if (iface->set_render_rectangle) {
+ iface->set_render_rectangle (overlay, x, y, width, height);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * gst_is_video_overlay_prepare_window_handle_message:
+ * @msg: a #GstMessage
+ *
+ * Convenience function to check if the given message is a
+ * "prepare-window-handle" message from a #GstVideoOverlay.
+ *
+ * Since: 0.11.2
+ *
+ * Returns: whether @msg is a "prepare-window-handle" message
+ */
+gboolean
+gst_is_video_overlay_prepare_window_handle_message (GstMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, FALSE);
+
+ if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ELEMENT)
+ return FALSE;
+
+ return gst_message_has_name (msg, "prepare-window-handle");
+}
diff --git a/gst-libs/gst/interfaces/videooverlay.h b/gst-libs/gst/interfaces/videooverlay.h
new file mode 100644
index 0000000..91806ec
--- /dev/null
+++ b/gst-libs/gst/interfaces/videooverlay.h
@@ -0,0 +1,99 @@
+/* GStreamer Video Overlay Interface
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
+ * Copyright (C) 2011 Tim-Philipp Müller <tim@centricular.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VIDEO_OVERLAY_H__
+#define __GST_VIDEO_OVERLAY_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_OVERLAY \
+ (gst_video_overlay_get_type ())
+#define GST_VIDEO_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_OVERLAY, GstVideoOverlay))
+#define GST_IS_VIDEO_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_OVERLAY))
+#define GST_VIDEO_OVERLAY_GET_IFACE(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VIDEO_OVERLAY, GstVideoOverlayIface))
+
+/**
+ * GstVideoOverlay:
+ *
+ * Opaque #GstVideoOverlay interface structure
+ */
+typedef struct _GstVideoOverlay GstVideoOverlay;
+typedef struct _GstVideoOverlayIface GstVideoOverlayIface;
+
+/**
+ * GstVideoOverlayIface:
+ * @interface: parent interface type.
+ * @expose: virtual method to handle expose events
+ * @handle_events: virtual method to handle events
+ * @set_render_rectangle: virtual method to set the render rectangle
+ * @set_window_handle: virtual method to configure the window handle
+ *
+ * #GstVideoOverlay interface
+ */
+struct _GstVideoOverlayIface {
+ GTypeInterface interface;
+
+ /* virtual functions */
+ void (* expose) (GstVideoOverlay *overlay);
+
+ void (* handle_events) (GstVideoOverlay *overlay, gboolean handle_events);
+
+ void (* set_render_rectangle) (GstVideoOverlay *overlay,
+ gint x, gint y,
+ gint width, gint height);
+
+ void (* set_window_handle) (GstVideoOverlay *overlay, guintptr handle);
+};
+
+GType gst_video_overlay_get_type (void);
+
+/* virtual function wrappers */
+
+gboolean gst_video_overlay_set_render_rectangle (GstVideoOverlay * overlay,
+ gint x,
+ gint y,
+ gint width,
+ gint height);
+
+void gst_video_overlay_expose (GstVideoOverlay * overlay);
+
+void gst_video_overlay_handle_events (GstVideoOverlay * overlay,
+ gboolean handle_events);
+
+void gst_video_overlay_set_window_handle (GstVideoOverlay * overlay,
+ guintptr handle);
+
+/* public methods to dispatch bus messages */
+void gst_video_overlay_got_window_handle (GstVideoOverlay * overlay,
+ guintptr handle);
+
+void gst_video_overlay_prepare_window_handle (GstVideoOverlay * overlay);
+
+gboolean gst_is_video_overlay_prepare_window_handle_message (GstMessage * msg);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_OVERLAY_H__ */
diff --git a/gst-libs/gst/netbuffer/Makefile.am b/gst-libs/gst/netbuffer/Makefile.am
new file mode 100644
index 0000000..386ba09
--- /dev/null
+++ b/gst-libs/gst/netbuffer/Makefile.am
@@ -0,0 +1,70 @@
+libgstnetbufferincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/netbuffer
+
+libgstnetbufferinclude_HEADERS = gstnetbuffer.h
+
+lib_LTLIBRARIES = libgstnetbuffer-@GST_MAJORMINOR@.la
+
+libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES = gstnetbuffer.c
+libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS)
+libgstnetbuffer_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS)
+libgstnetbuffer_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstNetbuffer-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstnetbufferinclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/netbuffer/%',$(libgstnetbufferinclude_HEADERS))
+
+GstNetbuffer-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstnetbuffer-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstNetbuffer \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstnetbuffer-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-netbuffer-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstnetbuffer -:SHARED libgstnetbuffer-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstnetbuffer_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstnetbuffer_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/netbuffer \
+ -:HEADERS $(libgstnetbuffer_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/netbuffer/Makefile.in b/gst-libs/gst/netbuffer/Makefile.in
new file mode 100644
index 0000000..c8af5af
--- /dev/null
+++ b/gst-libs/gst/netbuffer/Makefile.in
@@ -0,0 +1,881 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/netbuffer
+DIST_COMMON = README $(libgstnetbufferinclude_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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstnetbufferincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstnetbuffer_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1)
+am_libgstnetbuffer_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo
+libgstnetbuffer_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstnetbuffer_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstnetbuffer_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS) \
+ $(CFLAGS) $(libgstnetbuffer_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstnetbufferinclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+libgstnetbufferincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/netbuffer
+libgstnetbufferinclude_HEADERS = gstnetbuffer.h
+lib_LTLIBRARIES = libgstnetbuffer-@GST_MAJORMINOR@.la
+libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES = gstnetbuffer.c
+libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS)
+libgstnetbuffer_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS)
+libgstnetbuffer_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstNetbuffer-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstnetbufferinclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/netbuffer/%',$(libgstnetbufferinclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_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-libs/gst/netbuffer/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/netbuffer/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstnetbuffer-@GST_MAJORMINOR@.la: $(libgstnetbuffer_@GST_MAJORMINOR@_la_OBJECTS) $(libgstnetbuffer_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstnetbuffer_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstnetbuffer_@GST_MAJORMINOR@_la_OBJECTS) $(libgstnetbuffer_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo: gstnetbuffer.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) $(libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo -MD -MP -MF $(DEPDIR)/libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.Tpo -c -o libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo `test -f 'gstnetbuffer.c' || echo '$(srcdir)/'`gstnetbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.Tpo $(DEPDIR)/libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstnetbuffer.c' object='libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstnetbuffer_@GST_MAJORMINOR@_la-gstnetbuffer.lo `test -f 'gstnetbuffer.c' || echo '$(srcdir)/'`gstnetbuffer.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstnetbufferincludeHEADERS: $(libgstnetbufferinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstnetbufferincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstnetbufferincludedir)"
+ @list='$(libgstnetbufferinclude_HEADERS)'; test -n "$(libgstnetbufferincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstnetbufferincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstnetbufferincludedir)" || exit $$?; \
+ done
+
+uninstall-libgstnetbufferincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstnetbufferinclude_HEADERS)'; test -n "$(libgstnetbufferincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstnetbufferincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstnetbufferincludedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstnetbufferincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA install-libgstnetbufferincludeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstnetbufferincludeHEADERS uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgstnetbufferincludeHEADERS \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstnetbufferincludeHEADERS uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstNetbuffer-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstnetbuffer-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstNetbuffer \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstnetbuffer-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-netbuffer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstnetbuffer -:SHARED libgstnetbuffer-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstnetbuffer_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstnetbuffer_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstnetbuffer_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstnetbuffer_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/netbuffer \
+ -:HEADERS $(libgstnetbuffer_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/netbuffer/README b/gst-libs/gst/netbuffer/README
new file mode 100644
index 0000000..d55ceb1
--- /dev/null
+++ b/gst-libs/gst/netbuffer/README
@@ -0,0 +1,9 @@
+The network libraries
+---------------------
+
+GstNetBuffer:
+
+ A GstBuffer subclass that can be used by network sources or sinks to
+ store additional to and from addresses. This is required for plugins
+ that operate on this data like RTP.
+
diff --git a/gst-libs/gst/netbuffer/gstnetbuffer.c b/gst-libs/gst/netbuffer/gstnetbuffer.c
new file mode 100644
index 0000000..aaea75a
--- /dev/null
+++ b/gst-libs/gst/netbuffer/gstnetbuffer.c
@@ -0,0 +1,378 @@
+/* GStreamer
+ * Copyright (C) <2005> 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.
+ */
+
+/**
+ * SECTION:gstnetbuffer
+ * @short_description: Buffer for use in network sources and sinks
+ *
+ * #GstNetBuffer is a subclass of a normal #GstBuffer that contains two
+ * additional metadata fields of type #GstNetAddress named 'to' and 'from'. The
+ * buffer can be used to store additional information about the origin of the
+ * buffer data and is used in various network elements to track the to and from
+ * addresses.
+ *
+ * Last reviewed on 2006-08-21 (0.10.10)
+ */
+
+#include <string.h>
+
+#include "gstnetbuffer.h"
+
+static void
+meta_net_address_copy (GstBuffer * copybuf, GstMetaNetAddress * meta,
+ GstBuffer * buffer, gsize offset, gsize size)
+{
+ GstMetaNetAddress *naddr;
+
+ naddr = gst_buffer_add_meta_net_address (copybuf);
+ memcpy (&naddr->naddr, &meta->naddr, sizeof (meta->naddr));
+}
+
+const GstMetaInfo *
+gst_meta_net_address_get_info (void)
+{
+ static const GstMetaInfo *meta_info = NULL;
+
+ if (meta_info == NULL) {
+ meta_info = gst_meta_register ("GstMetaNetAddress", "GstMetaNetAddress",
+ sizeof (GstMetaNetAddress),
+ (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) NULL,
+ (GstMetaCopyFunction) meta_net_address_copy,
+ (GstMetaTransformFunction) NULL);
+ }
+ return meta_info;
+}
+
+/**
+ * gst_netaddress_set_ip4_address:
+ * @naddr: a network address
+ * @address: an IPv4 network address.
+ * @port: a port number to set.
+ *
+ * Set @naddr with the IPv4 @address and @port pair.
+ *
+ * Note that @port and @address must be expressed in network byte order,
+ * use g_htons() and g_htonl() to convert them to network byte order.
+ */
+void
+gst_netaddress_set_ip4_address (GstNetAddress * naddr, guint32 address,
+ guint16 port)
+{
+ g_return_if_fail (naddr != NULL);
+
+ naddr->type = GST_NET_TYPE_IP4;
+ naddr->address.ip4 = address;
+ naddr->port = port;
+}
+
+/**
+ * gst_netaddress_set_ip6_address:
+ * @naddr: a network address
+ * @address: an IPv6 network address.
+ * @port: a port number to set.
+ *
+ * Set @naddr with the IPv6 @address and @port pair.
+ *
+ * Note that @port must be expressed in network byte order, use g_htons() to convert
+ * it to network byte order.
+ */
+void
+gst_netaddress_set_ip6_address (GstNetAddress * naddr, guint8 address[16],
+ guint16 port)
+{
+ g_return_if_fail (naddr != NULL);
+
+ naddr->type = GST_NET_TYPE_IP6;
+ memcpy (&naddr->address.ip6, address, 16);
+ naddr->port = port;
+}
+
+/**
+ * gst_netaddress_get_net_type:
+ * @naddr: a network address
+ *
+ * Get the type of address stored in @naddr.
+ *
+ * Returns: the network type stored in @naddr.
+ */
+GstNetType
+gst_netaddress_get_net_type (const GstNetAddress * naddr)
+{
+ g_return_val_if_fail (naddr != NULL, GST_NET_TYPE_UNKNOWN);
+
+ return naddr->type;
+}
+
+/**
+ * gst_netaddress_get_ip4_address:
+ * @naddr: a network address
+ * @address: a location to store the address.
+ * @port: a location to store the port.
+ *
+ * Get the IPv4 address stored in @naddr into @address. This function requires
+ * that the address type of @naddr is of type #GST_NET_TYPE_IP4.
+ *
+ * Note that @port and @address are expressed in network byte order, use
+ * g_ntohs() and g_ntohl() to convert them to host order.
+ *
+ * Returns: TRUE if the address could be retrieved.
+ */
+gboolean
+gst_netaddress_get_ip4_address (const GstNetAddress * naddr, guint32 * address,
+ guint16 * port)
+{
+ g_return_val_if_fail (naddr != NULL, FALSE);
+
+ if (naddr->type == GST_NET_TYPE_UNKNOWN || naddr->type == GST_NET_TYPE_IP6)
+ return FALSE;
+
+ if (address)
+ *address = naddr->address.ip4;
+ if (port)
+ *port = naddr->port;
+
+ return TRUE;
+}
+
+/**
+ * gst_netaddress_get_ip6_address:
+ * @naddr: a network address
+ * @address: a location to store the result.
+ * @port: a location to store the port.
+ *
+ * Get the IPv6 address stored in @naddr into @address.
+ *
+ * If @naddr is of type GST_NET_TYPE_IP4, the transitional IP6 address is
+ * returned.
+ *
+ * Note that @port is expressed in network byte order, use g_ntohs() to convert
+ * it to host order.
+ *
+ * Returns: TRUE if the address could be retrieved.
+ */
+gboolean
+gst_netaddress_get_ip6_address (const GstNetAddress * naddr, guint8 address[16],
+ guint16 * port)
+{
+ static guint8 ip4_transition[16] =
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF };
+ g_return_val_if_fail (naddr != NULL, FALSE);
+
+ if (naddr->type == GST_NET_TYPE_UNKNOWN)
+ return FALSE;
+
+ if (address) {
+ if (naddr->type == GST_NET_TYPE_IP6) {
+ memcpy (address, naddr->address.ip6, 16);
+ } else { /* naddr->type == GST_NET_TYPE_IP4 */
+ memcpy (address, ip4_transition, 12);
+ memcpy (address + 12, (guint8 *) & (naddr->address.ip4), 4);
+ }
+ }
+ if (port)
+ *port = naddr->port;
+
+ return TRUE;
+}
+
+/**
+ * gst_netaddress_get_address_bytes:
+ * @naddr: a network address
+ * @address: a location to store the result.
+ * @port: a location to store the port.
+ *
+ * Get just the address bytes stored in @naddr into @address.
+ *
+ * Note that @port is expressed in network byte order, use g_ntohs() to convert
+ * it to host order. IP4 addresses are also stored in network byte order.
+ *
+ * Returns: number of bytes actually copied
+ *
+ * Since: 0.10.22
+ */
+gint
+gst_netaddress_get_address_bytes (const GstNetAddress * naddr,
+ guint8 address[16], guint16 * port)
+{
+ gint ret = 0;
+
+ g_return_val_if_fail (naddr != NULL, FALSE);
+
+ if (naddr->type == GST_NET_TYPE_UNKNOWN)
+ return 0;
+
+ if (address) {
+ if (naddr->type == GST_NET_TYPE_IP6) {
+ memcpy (address, naddr->address.ip6, 16);
+ ret = 16;
+ } else { /* naddr->type == GST_NET_TYPE_IP4 */
+ memcpy (address, (guint8 *) & (naddr->address.ip4), 4);
+ ret = 4;
+ }
+ }
+ if (port)
+ *port = naddr->port;
+
+ return ret;
+}
+
+/**
+ * gst_netaddress_set_address_bytes:
+ * @naddr: a network address
+ * @type: the address type (IPv4 or IPV6)
+ * @address: a location to store the result.
+ * @port: a location to store the port.
+ *
+ * Set just the address bytes stored in @naddr into @address.
+ *
+ * Note that @port must be expressed in network byte order, use g_htons() to
+ * convert it to network byte order order. IP4 address bytes must also be
+ * stored in network byte order.
+ *
+ * Returns: number of bytes actually copied
+ *
+ * Since: 0.10.22
+ */
+gint
+gst_netaddress_set_address_bytes (GstNetAddress * naddr, GstNetType type,
+ guint8 address[16], guint16 port)
+{
+ gint len = 0;
+
+ g_return_val_if_fail (naddr != NULL, 0);
+
+ naddr->type = type;
+ switch (naddr->type) {
+ case GST_NET_TYPE_UNKNOWN:
+ case GST_NET_TYPE_IP6:
+ len = 16;
+ memcpy (naddr->address.ip6, address, 16);
+ break;
+ case GST_NET_TYPE_IP4:
+ len = 4;
+ memcpy ((guint8 *) & (naddr->address.ip4), address, 4);
+ break;
+ }
+
+ if (port)
+ naddr->port = port;
+
+ return len;
+}
+
+/**
+ * gst_netaddress_equal:
+ * @naddr1: The first #GstNetAddress
+ * @naddr2: The second #GstNetAddress
+ *
+ * Compare two #GstNetAddress structures
+ *
+ * Returns: TRUE if they are identical, FALSE otherwise
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_netaddress_equal (const GstNetAddress * naddr1,
+ const GstNetAddress * naddr2)
+{
+ g_return_val_if_fail (naddr1 != NULL, FALSE);
+ g_return_val_if_fail (naddr2 != NULL, FALSE);
+
+ if (naddr1->type != naddr2->type)
+ return FALSE;
+
+ if (naddr1->port != naddr2->port)
+ return FALSE;
+
+ switch (naddr1->type) {
+ case GST_NET_TYPE_IP4:
+ if (naddr1->address.ip4 != naddr2->address.ip4)
+ return FALSE;
+ break;
+ case GST_NET_TYPE_IP6:
+ if (memcmp (naddr1->address.ip6, naddr2->address.ip6,
+ sizeof (naddr1->address.ip6)))
+ return FALSE;
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+/**
+ * gst_netaddress_to_string:
+ * @naddr: a #GstNetAddress
+ * @dest: destination
+ * @len: len of @dest
+ *
+ * Copies a string representation of @naddr into @dest. Up to @len bytes are
+ * copied.
+ *
+ * Returns: the number of bytes which would be produced if the buffer was large
+ * enough
+ *
+ * Since: 0.10.24
+ */
+gint
+gst_netaddress_to_string (const GstNetAddress * naddr, gchar * dest, gulong len)
+{
+ gint result;
+
+ g_return_val_if_fail (naddr != NULL, FALSE);
+ g_return_val_if_fail (dest != NULL, FALSE);
+
+ switch (naddr->type) {
+ case GST_NET_TYPE_IP4:
+ {
+ guint32 address;
+ guint16 port;
+
+ gst_netaddress_get_ip4_address (naddr, &address, &port);
+ address = g_ntohl (address);
+
+ result = g_snprintf (dest, len, "%d.%d.%d.%d:%d", (address >> 24) & 0xff,
+ (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff,
+ g_ntohs (port));
+ break;
+ }
+ case GST_NET_TYPE_IP6:
+ {
+ guint8 address[16];
+ guint16 port;
+
+ gst_netaddress_get_ip6_address (naddr, address, &port);
+
+ result =
+ g_snprintf (dest, len, "[%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]:%d",
+ (address[0] << 8) | address[1], (address[2] << 8) | address[3],
+ (address[4] << 8) | address[5], (address[6] << 8) | address[7],
+ (address[8] << 8) | address[9], (address[10] << 8) | address[11],
+ (address[12] << 8) | address[13], (address[14] << 8) | address[15],
+ g_ntohs (port));
+ break;
+ }
+ default:
+ dest[0] = 0;
+ result = 0;
+ break;
+ }
+ return result;
+}
diff --git a/gst-libs/gst/netbuffer/gstnetbuffer.h b/gst-libs/gst/netbuffer/gstnetbuffer.h
new file mode 100644
index 0000000..368490a
--- /dev/null
+++ b/gst-libs/gst/netbuffer/gstnetbuffer.h
@@ -0,0 +1,123 @@
+/* GStreamer
+ * Copyright (C) <2005> 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.
+ */
+
+#ifndef __GST_NETBUFFER_H__
+#define __GST_NETBUFFER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#if 0
+typedef struct _GstNetBuffer GstNetBuffer;
+typedef struct _GstNetBufferClass GstNetBufferClass;
+#endif
+typedef struct _GstNetAddress GstNetAddress;
+
+#if 0
+#define GST_TYPE_NETBUFFER (gst_netbuffer_get_type())
+#define GST_IS_NETBUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NETBUFFER))
+#define GST_IS_NETBUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_NETBUFFER))
+#define GST_NETBUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_NETBUFFER, GstNetBufferClass))
+#define GST_NETBUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NETBUFFER, GstNetBuffer))
+#define GST_NETBUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_NETBUFFER, GstNetBufferClass))
+#endif
+
+/**
+ * GstNetType:
+ * @GST_NET_TYPE_UNKNOWN: unknown address type
+ * @GST_NET_TYPE_IP4: an IPv4 address type
+ * @GST_NET_TYPE_IP6: and IPv6 address type
+ *
+ * The Address type used in #GstNetAddress.
+ */
+typedef enum {
+ GST_NET_TYPE_UNKNOWN,
+ GST_NET_TYPE_IP4,
+ GST_NET_TYPE_IP6,
+} GstNetType;
+
+/**
+ * GST_NETADDRESS_MAX_LEN:
+ *
+ * The maximum length of a string representation of a GstNetAddress as produced
+ * by gst_netaddress_to_string().
+ *
+ * Since: 0.10.24
+ */
+#define GST_NETADDRESS_MAX_LEN 64
+
+/**
+ * GstNetAddress:
+ *
+ * An opaque network address as used in #GstMetaNetAddress.
+ */
+struct _GstNetAddress {
+ /*< private >*/
+ GstNetType type;
+ union {
+ guint8 ip6[16];
+ guint32 ip4;
+ } address;
+ guint16 port;
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+typedef struct _GstMetaNetAddress GstMetaNetAddress;
+
+/**
+ * GstMetaNetAddress:
+ *
+ * Buffer metadata for network addresses.
+ */
+struct _GstMetaNetAddress {
+ GstMeta meta;
+
+ GstNetAddress naddr;
+};
+
+const GstMetaInfo *gst_meta_net_address_get_info (void);
+#define GST_META_NET_ADDRESS_INFO (gst_meta_net_address_get_info())
+
+#define gst_buffer_get_meta_net_address(b) \
+ ((GstMetaNetAddress*)gst_buffer_get_meta((b),GST_META_NET_ADDRESS_INFO))
+#define gst_buffer_add_meta_net_address(b) \
+ ((GstMetaNetAddress*)gst_buffer_add_meta((b),GST_META_NET_ADDRESS_INFO,NULL))
+
+/* address operations */
+void gst_netaddress_set_ip4_address (GstNetAddress *naddr, guint32 address, guint16 port);
+void gst_netaddress_set_ip6_address (GstNetAddress *naddr, guint8 address[16], guint16 port);
+gint gst_netaddress_set_address_bytes (GstNetAddress *naddr, GstNetType type,
+ guint8 address[16], guint16 port);
+
+GstNetType gst_netaddress_get_net_type (const GstNetAddress *naddr);
+gboolean gst_netaddress_get_ip4_address (const GstNetAddress *naddr, guint32 *address, guint16 *port);
+gboolean gst_netaddress_get_ip6_address (const GstNetAddress *naddr, guint8 address[16], guint16 *port);
+gint gst_netaddress_get_address_bytes (const GstNetAddress *naddr, guint8 address[16], guint16 *port);
+
+gboolean gst_netaddress_equal (const GstNetAddress *naddr1,
+ const GstNetAddress *naddr2);
+
+gint gst_netaddress_to_string (const GstNetAddress *naddr, gchar *dest, gulong len);
+
+G_END_DECLS
+
+#endif /* __GST_NETBUFFER_H__ */
+
diff --git a/gst-libs/gst/pbutils/Makefile.am b/gst-libs/gst/pbutils/Makefile.am
new file mode 100644
index 0000000..16ff053
--- /dev/null
+++ b/gst-libs/gst/pbutils/Makefile.am
@@ -0,0 +1,135 @@
+lib_LTLIBRARIES = libgstpbutils-@GST_MAJORMINOR@.la
+
+headers_pbutils = \
+ pbutils.h \
+ codec-utils.h \
+ descriptions.h \
+ encoding-profile.h \
+ encoding-target.h \
+ install-plugins.h \
+ missing-plugins.h \
+ gstdiscoverer.h
+
+# variables used for enum/marshal generation
+glib_enum_headers = $(headers_pbutils)
+glib_enum_define = PB_UTILS
+glib_gen_prefix = pbutils
+glib_gen_basename = pbutils
+
+built_headers_configure = \
+ gstpluginsbaseversion.h
+
+libgstpbutils_@GST_MAJORMINOR@_la_SOURCES = \
+ gstpluginsbaseversion.c \
+ pbutils.c \
+ codec-utils.c \
+ descriptions.c \
+ encoding-profile.c \
+ encoding-target.c \
+ install-plugins.c \
+ missing-plugins.c \
+ gstdiscoverer.c \
+ gstdiscoverer-types.c
+
+nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES = \
+ pbutils-enumtypes.c \
+ pbutils-marshal.c
+
+libgstpbutils_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/pbutils
+libgstpbutils_@GST_MAJORMINOR@include_HEADERS = \
+ $(headers_pbutils)
+nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS = \
+ $(built_headers_configure) \
+ pbutils-enumtypes.h
+noinst_HEADERS = \
+ pbutils-private.h
+EXTRA_DIST = pbutils-marshal.list
+
+libgstpbutils_@GST_MAJORMINOR@_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstpbutils_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+BUILT_SOURCES = \
+ pbutils-enumtypes.c \
+ pbutils-enumtypes.h \
+ pbutils-marshal.c \
+ pbutils-marshal.h
+
+CLEANFILES = $(BUILT_SOURCES)
+
+# DISTCLEANFILES is for files generated by configure
+DISTCLEANFILES = $(built_headers_configure)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstPbutils-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+gir_headers+=$(patsubst %,$(builddir)/%, $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/pbutils/%',$(libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+gir_cincludes+=$(patsubst %,--c-include='gst/pbutils/%',$(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+
+GstPbutils-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstpbutils-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstPbutils \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_builddir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstpbutils-@GST_MAJORMINOR@.la \
+ --library-path=`$(PKG_CONFIG) --variable=libdir gstreamer-@GST_MAJORMINOR@` \
+ --library=gstreamer-@GST_MAJORMINOR@ \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-pbutils-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstpbutils -:SHARED libgstpbutils-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstpbutils_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstpbutils_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/pbutils \
+ -:HEADERS $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/pbutils/Makefile.in b/gst-libs/gst/pbutils/Makefile.in
new file mode 100644
index 0000000..5a363f1
--- /dev/null
+++ b/gst-libs/gst/pbutils/Makefile.in
@@ -0,0 +1,1153 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/gstpluginsbaseversion.h.in \
+ $(top_srcdir)/common/gst-glib-gen.mak
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/pbutils
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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 = gstpluginsbaseversion.h
+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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" \
+ "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstpbutils_@GST_MAJORMINOR@_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+am_libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo
+nodist_libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo \
+ libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo
+libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstpbutils_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstpbutils_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstpbutils-@GST_MAJORMINOR@.la
+headers_pbutils = \
+ pbutils.h \
+ codec-utils.h \
+ descriptions.h \
+ encoding-profile.h \
+ encoding-target.h \
+ install-plugins.h \
+ missing-plugins.h \
+ gstdiscoverer.h
+
+
+# variables used for enum/marshal generation
+glib_enum_headers = $(headers_pbutils)
+glib_enum_define = PB_UTILS
+glib_gen_prefix = pbutils
+glib_gen_basename = pbutils
+built_headers_configure = \
+ gstpluginsbaseversion.h
+
+libgstpbutils_@GST_MAJORMINOR@_la_SOURCES = \
+ gstpluginsbaseversion.c \
+ pbutils.c \
+ codec-utils.c \
+ descriptions.c \
+ encoding-profile.c \
+ encoding-target.c \
+ install-plugins.c \
+ missing-plugins.c \
+ gstdiscoverer.c \
+ gstdiscoverer-types.c
+
+nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES = \
+ pbutils-enumtypes.c \
+ pbutils-marshal.c
+
+libgstpbutils_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/pbutils
+libgstpbutils_@GST_MAJORMINOR@include_HEADERS = \
+ $(headers_pbutils)
+
+nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS = \
+ $(built_headers_configure) \
+ pbutils-enumtypes.h
+
+noinst_HEADERS = \
+ pbutils-private.h
+
+EXTRA_DIST = pbutils-marshal.list
+libgstpbutils_@GST_MAJORMINOR@_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+
+libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstpbutils_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+BUILT_SOURCES = \
+ pbutils-enumtypes.c \
+ pbutils-enumtypes.h \
+ pbutils-marshal.c \
+ pbutils-marshal.h
+
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+
+# DISTCLEANFILES is for files generated by configure
+DISTCLEANFILES = $(built_headers_configure)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstPbutils-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/pbutils/%',$(libgstpbutils_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/pbutils/%',$(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/pbutils/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/pbutils/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):
+gstpluginsbaseversion.h: $(top_builddir)/config.status $(srcdir)/gstpluginsbaseversion.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstpbutils-@GST_MAJORMINOR@.la: $(libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS) $(libgstpbutils_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstpbutils_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstpbutils_@GST_MAJORMINOR@_la_OBJECTS) $(libgstpbutils_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-descriptions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo: gstpluginsbaseversion.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo `test -f 'gstpluginsbaseversion.c' || echo '$(srcdir)/'`gstpluginsbaseversion.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpluginsbaseversion.c' object='libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstpluginsbaseversion.lo `test -f 'gstpluginsbaseversion.c' || echo '$(srcdir)/'`gstpluginsbaseversion.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo: pbutils.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo `test -f 'pbutils.c' || echo '$(srcdir)/'`pbutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pbutils.c' object='libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils.lo `test -f 'pbutils.c' || echo '$(srcdir)/'`pbutils.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo: codec-utils.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo `test -f 'codec-utils.c' || echo '$(srcdir)/'`codec-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codec-utils.c' object='libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-codec-utils.lo `test -f 'codec-utils.c' || echo '$(srcdir)/'`codec-utils.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo: descriptions.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-descriptions.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo `test -f 'descriptions.c' || echo '$(srcdir)/'`descriptions.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-descriptions.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-descriptions.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='descriptions.c' object='libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-descriptions.lo `test -f 'descriptions.c' || echo '$(srcdir)/'`descriptions.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo: encoding-profile.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo `test -f 'encoding-profile.c' || echo '$(srcdir)/'`encoding-profile.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='encoding-profile.c' object='libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-encoding-profile.lo `test -f 'encoding-profile.c' || echo '$(srcdir)/'`encoding-profile.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo: encoding-target.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo `test -f 'encoding-target.c' || echo '$(srcdir)/'`encoding-target.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='encoding-target.c' object='libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-encoding-target.lo `test -f 'encoding-target.c' || echo '$(srcdir)/'`encoding-target.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo: install-plugins.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo `test -f 'install-plugins.c' || echo '$(srcdir)/'`install-plugins.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='install-plugins.c' object='libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-install-plugins.lo `test -f 'install-plugins.c' || echo '$(srcdir)/'`install-plugins.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo: missing-plugins.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo `test -f 'missing-plugins.c' || echo '$(srcdir)/'`missing-plugins.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='missing-plugins.c' object='libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-missing-plugins.lo `test -f 'missing-plugins.c' || echo '$(srcdir)/'`missing-plugins.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo: gstdiscoverer.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo `test -f 'gstdiscoverer.c' || echo '$(srcdir)/'`gstdiscoverer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdiscoverer.c' object='libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer.lo `test -f 'gstdiscoverer.c' || echo '$(srcdir)/'`gstdiscoverer.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo: gstdiscoverer-types.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo `test -f 'gstdiscoverer-types.c' || echo '$(srcdir)/'`gstdiscoverer-types.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdiscoverer-types.c' object='libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-gstdiscoverer-types.lo `test -f 'gstdiscoverer-types.c' || echo '$(srcdir)/'`gstdiscoverer-types.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo: pbutils-enumtypes.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo `test -f 'pbutils-enumtypes.c' || echo '$(srcdir)/'`pbutils-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pbutils-enumtypes.c' object='libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils-enumtypes.lo `test -f 'pbutils-enumtypes.c' || echo '$(srcdir)/'`pbutils-enumtypes.c
+
+libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo: pbutils-marshal.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) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo -MD -MP -MF $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.Tpo -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo `test -f 'pbutils-marshal.c' || echo '$(srcdir)/'`pbutils-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.Tpo $(DEPDIR)/libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pbutils-marshal.c' object='libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstpbutils_@GST_MAJORMINOR@_la-pbutils-marshal.lo `test -f 'pbutils-marshal.c' || echo '$(srcdir)/'`pbutils-marshal.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstpbutils_@GST_MAJORMINOR@includeHEADERS: $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstpbutils_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstpbutils_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstpbutils_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" && rm -f $$files
+install-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS: $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)"
+ @list='$(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstpbutils_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)" "$(DESTDIR)$(libgstpbutils_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ install-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ install-man \
+ install-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstpbutils_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstPbutils-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstpbutils-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstPbutils \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstpbutils-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --library-path=`$(PKG_CONFIG) --variable=libdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-pbutils-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstpbutils -:SHARED libgstpbutils-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstpbutils_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstpbutils_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstpbutils_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstpbutils_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/pbutils \
+ -:HEADERS $(libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstpbutils_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/pbutils/codec-utils.c b/gst-libs/gst/pbutils/codec-utils.c
new file mode 100644
index 0000000..282e03e
--- /dev/null
+++ b/gst-libs/gst/pbutils/codec-utils.c
@@ -0,0 +1,830 @@
+/* GStreamer base utils library codec-specific utility functions
+ * Copyright (C) 2010 Arun Raghavan <arun.raghavan@collabora.co.uk>
+ * 2010 Collabora Multimedia
+ * 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.
+ */
+
+/**
+ * SECTION:gstpbutilscodecutils
+ * @short_description: Miscellaneous codec-specific utility functions
+ *
+ * <refsect2>
+ * <para>
+ * Provides codec-specific ulility functions such as functions to provide the
+ * codec profile and level in human-readable string form from header data.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pbutils.h"
+
+#include <string.h>
+
+#define GST_SIMPLE_CAPS_HAS_NAME(caps,name) \
+ gst_structure_has_name(gst_caps_get_structure((caps),0),(name))
+
+#define GST_SIMPLE_CAPS_HAS_FIELD(caps,field) \
+ gst_structure_has_field(gst_caps_get_structure((caps),0),(field))
+
+static const gchar *
+digit_to_string (guint digit)
+{
+ static const char itoa[][2] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
+ };
+
+ if (G_LIKELY (digit < 10))
+ return itoa[digit];
+ else
+ return NULL;
+}
+
+/**
+ * gst_codec_utils_aac_get_sample_rate_from_index:
+ * @sr_idx: Sample rate index as from the AudioSpecificConfig (MPEG-4
+ * container) or ADTS frame header
+ *
+ * Translates the sample rate index found in AAC headers to the actual sample
+ * rate.
+ *
+ * Returns: The sample rate if @sr_idx is valid, 0 otherwise.
+ *
+ * Since: 0.10.31
+ */
+guint
+gst_codec_utils_aac_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, 7350
+ };
+
+ if (G_LIKELY (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_codec_utils_aac_get_profile:
+ * @audio_config: a pointer to the AudioSpecificConfig as specified in the
+ * Elementary Stream Descriptor (esds) in ISO/IEC 14496-1 (see
+ * gst_codec_utils_aac_get_level() for a more details).
+ * @len: Length of @audio_config in bytes
+ *
+ * Returns the profile of the given AAC stream as a string. The profile is
+ * determined using the AudioObjectType field which is in the first 5 bits of
+ * @audio_config.
+ *
+ * <note>
+ * HE-AAC support has not yet been implemented.
+ * </note>
+ *
+ * Returns: The profile as a const string and %NULL if the profile could not be
+ * determined.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_aac_get_profile (const guint8 * audio_config, guint len)
+{
+ guint profile;
+
+ if (len < 1)
+ return NULL;
+
+ GST_MEMDUMP ("audio config", audio_config, len);
+
+ profile = audio_config[0] >> 3;
+ switch (profile) {
+ case 1:
+ return "main";
+ case 2:
+ return "lc";
+ case 3:
+ return "ssr";
+ case 4:
+ return "ltp";
+ default:
+ break;
+ }
+
+ GST_DEBUG ("Invalid profile idx: %u", profile);
+ return NULL;
+}
+
+/**
+ * gst_codec_utils_aac_get_level:
+ * @audio_config: a pointer to the AudioSpecificConfig as specified in the
+ * Elementary Stream Descriptor (esds) in ISO/IEC 14496-1.
+ * @len: Length of @audio_config in bytes
+ *
+ * Determines the level of a stream as defined in ISO/IEC 14496-3. For AAC LC
+ * streams, the constraints from the AAC audio profile are applied. For AAC
+ * Main, LTP, SSR and others, the Main profile is used.
+ *
+ * The @audio_config parameter follows the following format, starting from the
+ * most significant bit of the first byte:
+ *
+ * <itemizedlist>
+ * <listitem><para>
+ * Bit 0:4 contains the AudioObjectType
+ * </para></listitem>
+ * <listitem><para>
+ * Bit 5:8 contains the sample frequency index (if this is 0xf, then the
+ * next 24 bits define the actual sample frequency, and subsequent
+ * fields are appropriately shifted).
+ * </para></listitem>
+ * <listitem><para>
+ * Bit 9:12 contains the channel configuration
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * <note>
+ * HE-AAC support has not yet been implemented.
+ * </note>
+ *
+ * Returns: The level as a const string and %NULL if the level could not be
+ * determined.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_aac_get_level (const guint8 * audio_config, guint len)
+{
+ int profile, sr_idx, channel_config, rate;
+ /* Number of single channel elements, channel pair elements, low frequency
+ * elements, independently switched coupling channel elements, and
+ * dependently switched coupling channel elements.
+ *
+ * Note: The 2 CCE types are ignored for now as they require us to actually
+ * parse the first frame, and they are rarely found in actual streams.
+ */
+ int num_sce = 0, num_cpe = 0, num_lfe = 0, num_cce_indep = 0, num_cce_dep = 0;
+ int num_channels;
+ /* Processor and RAM Complexity Units (calculated and "reference" for single
+ * channel) */
+ int pcu, rcu, pcu_ref, rcu_ref;
+ int ret = -1;
+
+ g_return_val_if_fail (audio_config != NULL, NULL);
+
+ if (len < 2)
+ return NULL;
+
+ GST_MEMDUMP ("audio config", audio_config, len);
+
+ profile = audio_config[0] >> 3;
+ /* FIXME: add support for sr_idx = 0xf */
+ sr_idx = ((audio_config[0] & 0x7) << 1) | ((audio_config[1] & 0x80) >> 7);
+ rate = gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
+ channel_config = (audio_config[1] & 0x7f) >> 3;
+
+ if (rate == 0)
+ return NULL;
+
+ switch (channel_config) {
+ case 0:
+ /* Channel config is defined in the AudioObjectType's SpecificConfig,
+ * which requires some amount of digging through the headers. I only see
+ * this done in the MPEG conformance streams - FIXME */
+ GST_WARNING ("Found a stream with channel configuration in the "
+ "AudioSpecificConfig. Please file a bug with a link to the media if "
+ "possible.");
+ return NULL;
+ case 1:
+ /* front center */
+ num_sce = 1;
+ break;
+ case 2:
+ /* front left and right */
+ num_cpe = 1;
+ break;
+ case 3:
+ /* front left, right, and center */
+ num_sce = 1;
+ num_cpe = 1;
+ break;
+ case 4:
+ /* front left, right, and center; rear surround */
+ num_sce = 2;
+ num_cpe = 1;
+ break;
+ case 5:
+ /* front left, right, and center; rear left and right surround */
+ num_sce = 1;
+ num_cpe = 2;
+ break;
+ case 6:
+ /* front left, right, center and LFE; rear left and right surround */
+ num_sce = 1;
+ num_cpe = 2;
+ break;
+ case 7:
+ /* front left, right, center and LFE; outside front left and right;
+ * rear left and right surround */
+ num_sce = 1;
+ num_cpe = 3;
+ num_lfe = 1;
+ break;
+ default:
+ GST_WARNING ("Unknown channel config in header: %d", channel_config);
+ return NULL;
+ }
+
+ switch (profile) {
+ case 0: /* NULL */
+ GST_WARNING ("profile 0 is not a valid profile");
+ return NULL;
+ case 2: /* LC */
+ pcu_ref = 3;
+ rcu_ref = 3;
+ break;
+ case 3: /* SSR */
+ pcu_ref = 4;
+ rcu_ref = 3;
+ break;
+ case 4: /* LTP */
+ pcu_ref = 4;
+ rcu_ref = 4;
+ break;
+ case 1: /* Main */
+ default:
+ /* Other than a couple of ER profiles, Main is the worst-case */
+ pcu_ref = 5;
+ rcu_ref = 5;
+ break;
+ }
+
+ /* "fs_ref" is 48000 Hz for AAC Main/LC/SSR/LTP. SBR's fs_ref is defined as
+ * 24000/48000 (in/out), for SBR streams. Actual support is a FIXME */
+
+ pcu = ((float) rate / 48000) * pcu_ref *
+ ((2 * num_cpe) + num_sce + num_lfe + num_cce_indep + (0.3 * num_cce_dep));
+
+ rcu = ((float) rcu_ref) * (num_sce + (0.5 * num_lfe) + (0.5 * num_cce_indep) +
+ (0.4 * num_cce_dep));
+
+ if (num_cpe < 2)
+ rcu += (rcu_ref + (rcu_ref - 1)) * num_cpe;
+ else
+ rcu += (rcu_ref + (rcu_ref - 1) * ((2 * num_cpe) - 1));
+
+ num_channels = num_sce + (2 * num_cpe) + num_lfe;
+
+ if (profile == 2) {
+ /* AAC LC => return the level as per the 'AAC Profile' */
+ if (num_channels <= 2 && rate <= 24000 && pcu <= 3 && rcu <= 5)
+ ret = 1;
+ else if (num_channels <= 2 && rate <= 48000 && pcu <= 6 && rcu <= 5)
+ ret = 2;
+ /* There is no level 3 for the AAC Profile */
+ else if (num_channels <= 5 && rate <= 48000 && pcu <= 19 && rcu <= 15)
+ ret = 4;
+ else if (num_channels <= 5 && rate <= 96000 && pcu <= 38 && rcu <= 15)
+ ret = 5;
+ } else {
+ /* Return the level as per the 'Main Profile' */
+ if (pcu < 40 && rcu < 20)
+ ret = 1;
+ else if (pcu < 80 && rcu < 64)
+ ret = 2;
+ else if (pcu < 160 && rcu < 128)
+ ret = 3;
+ else if (pcu < 320 && rcu < 256)
+ ret = 4;
+ }
+
+ if (ret == -1) {
+ GST_WARNING ("couldn't determine level: profile=%u, rate=%u, "
+ "channel_config=%u, pcu=%d,rcu=%d", profile, rate, channel_config, pcu,
+ rcu);
+ return NULL;
+ } else {
+ return digit_to_string (ret);
+ }
+}
+
+/**
+ * gst_codec_utils_aac_caps_set_level_and_profile:
+ * @caps: the #GstCaps to which level and profile fields are to be added
+ * @audio_config: a pointer to the AudioSpecificConfig as specified in the
+ * Elementary Stream Descriptor (esds) in ISO/IEC 14496-1 (see
+ * below for a more details).
+ * @len: Length of @audio_config in bytes
+ *
+ * Sets the level and profile on @caps if it can be determined from
+ * @audio_config. See gst_codec_utils_aac_get_level() and
+ * gst_codec_utils_aac_get_profile() for more details on the parameters.
+ * @caps must be audio/mpeg caps with an "mpegversion" field of either 2 or 4.
+ * If mpegversion is 4, the "base-profile" field is also set in @caps.
+ *
+ * Returns: %TRUE if the level and profile could be set, %FALSE otherwise.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_codec_utils_aac_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * audio_config, guint len)
+{
+ GstStructure *s;
+ const gchar *level, *profile;
+ int mpegversion = 0;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+ g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), FALSE);
+ g_return_val_if_fail (GST_SIMPLE_CAPS_HAS_NAME (caps, "audio/mpeg"), FALSE);
+ g_return_val_if_fail (GST_SIMPLE_CAPS_HAS_FIELD (caps, "mpegversion"), FALSE);
+ g_return_val_if_fail (audio_config != NULL, FALSE);
+
+ s = gst_caps_get_structure (caps, 0);
+
+ gst_structure_get_int (s, "mpegversion", &mpegversion);
+ g_return_val_if_fail (mpegversion == 2 || mpegversion == 4, FALSE);
+
+ level = gst_codec_utils_aac_get_level (audio_config, len);
+
+ if (level != NULL)
+ gst_structure_set (s, "level", G_TYPE_STRING, level, NULL);
+
+ profile = gst_codec_utils_aac_get_profile (audio_config, len);
+
+ if (profile != NULL) {
+ if (mpegversion == 4) {
+ gst_structure_set (s, "base-profile", G_TYPE_STRING, profile,
+ "profile", G_TYPE_STRING, profile, NULL);
+ } else {
+ gst_structure_set (s, "profile", G_TYPE_STRING, profile, NULL);
+ }
+ }
+
+ GST_LOG ("profile : %s", (profile) ? profile : "---");
+ GST_LOG ("level : %s", (level) ? level : "---");
+
+ return (level != NULL && profile != NULL);
+}
+
+/**
+ * gst_codec_utils_h264_get_profile:
+ * @sps: Pointer to the sequence parameter set for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Converts the profile indication (profile_idc) in the stream's
+ * sequence parameter set into a string. The SPS is expected to have the
+ * following format, as defined in the H.264 specification. The SPS is viewed
+ * as a bitstream here, with bit 0 being the most significant bit of the first
+ * byte.
+ *
+ * <itemizedlist>
+ * <listitem><para>Bit 0:7 - Profile indication</para></listitem>
+ * <listitem><para>Bit 8 - constraint_set0_flag</para></listitem>
+ * <listitem><para>Bit 9 - constraint_set1_flag</para></listitem>
+ * <listitem><para>Bit 10 - constraint_set2_flag</para></listitem>
+ * <listitem><para>Bit 11 - constraint_set3_flag</para></listitem>
+ * <listitem><para>Bit 12 - constraint_set3_flag</para></listitem>
+ * <listitem><para>Bit 13:15 - Reserved</para></listitem>
+ * <listitem><para>Bit 16:24 - Level indication</para></listitem>
+ * </itemizedlist>
+ *
+ * Returns: The profile as a const string, or %NULL if there is an error.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_h264_get_profile (const guint8 * sps, guint len)
+{
+ const gchar *profile = NULL;
+ gint csf1, csf3;
+
+ g_return_val_if_fail (sps != NULL, NULL);
+
+ if (len < 2)
+ return NULL;
+
+ GST_MEMDUMP ("SPS", sps, len);
+
+ csf1 = (sps[1] & 0x40) >> 6;
+ csf3 = (sps[1] & 0x10) >> 4;
+
+ switch (sps[0]) {
+ case 66:
+ if (csf1)
+ profile = "constrained-baseline";
+ else
+ profile = "baseline";
+ break;
+ case 77:
+ profile = "main";
+ break;
+ case 88:
+ profile = "extended";
+ break;
+ case 100:
+ profile = "high";
+ break;
+ case 110:
+ if (csf3)
+ profile = "high-10-intra";
+ else
+ profile = "high-10";
+ break;
+ case 122:
+ if (csf3)
+ profile = "high-4:2:2-intra";
+ else
+ profile = "high-4:2:2";
+ break;
+ case 244:
+ if (csf3)
+ profile = "high-4:4:4-intra";
+ else
+ profile = "high-4:4:4";
+ break;
+ case 44:
+ profile = "cavlc-4:4:4-intra";
+ break;
+ default:
+ return NULL;
+ }
+
+ return profile;
+}
+
+/**
+ * gst_codec_utils_h264_get_level:
+ * @sps: Pointer to the sequence parameter set for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Converts the level indication (level_idc) in the stream's
+ * sequence parameter set into a string. The SPS is expected to have the
+ * same format as for gst_codec_utils_h264_get_profile().
+ *
+ * Returns: The level as a const string, or %NULL if there is an error.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_h264_get_level (const guint8 * sps, guint len)
+{
+ gint csf3;
+
+ g_return_val_if_fail (sps != NULL, NULL);
+
+ if (len < 3)
+ return NULL;
+
+ GST_MEMDUMP ("SPS", sps, len);
+
+ csf3 = (sps[1] & 0x10) >> 4;
+
+ if (sps[2] == 11 && csf3)
+ return "1b";
+ else if (sps[2] % 10 == 0)
+ return digit_to_string (sps[2] / 10);
+ else {
+ switch (sps[2]) {
+ case 11:
+ return "1.1";
+ case 12:
+ return "1.2";
+ case 13:
+ return "1.3";
+ case 21:
+ return "2.1";
+ case 22:
+ return "2.2";
+ case 31:
+ return "3.1";
+ case 32:
+ return "3.2";
+ case 41:
+ return "4.1";
+ case 42:
+ return "4.2";
+ case 51:
+ return "5.1";
+ default:
+ return NULL;
+ }
+ }
+}
+
+/**
+ * gst_codec_utils_h264_get_level_idc:
+ * @level: A level string from caps
+ *
+ * Transform a level string from the caps into the level_idc
+ *
+ * Returns: the level_idc or 0 if the level is unknown
+ *
+ * Since: 0.10.36
+ */
+guint8
+gst_codec_utils_h264_get_level_idc (const gchar * level)
+{
+ g_return_val_if_fail (level != NULL, 0);
+
+ if (!strcmp (level, "1"))
+ return 10;
+ else if (!strcmp (level, "1b"))
+ return 9;
+ else if (!strcmp (level, "1.1"))
+ return 11;
+ else if (!strcmp (level, "1.2"))
+ return 12;
+ else if (!strcmp (level, "1.3"))
+ return 13;
+ else if (!strcmp (level, "2"))
+ return 20;
+ else if (!strcmp (level, "2.1"))
+ return 21;
+ else if (!strcmp (level, "2.2"))
+ return 22;
+ else if (!strcmp (level, "3"))
+ return 30;
+ else if (!strcmp (level, "3.1"))
+ return 31;
+ else if (!strcmp (level, "3.2"))
+ return 32;
+ else if (!strcmp (level, "4"))
+ return 40;
+ else if (!strcmp (level, "4.1"))
+ return 41;
+ else if (!strcmp (level, "4.2"))
+ return 42;
+ else if (!strcmp (level, "5"))
+ return 50;
+ else if (!strcmp (level, "5.1"))
+ return 51;
+
+ GST_WARNING ("Invalid level %s", level);
+ return 0;
+}
+
+/**
+ * gst_codec_utils_h264_caps_set_level_and_profile:
+ * @caps: the #GstCaps to which the level and profile are to be added
+ * @sps: Pointer to the sequence parameter set for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Sets the level and profile in @caps if it can be determined from @sps. See
+ * gst_codec_utils_h264_get_level() and gst_codec_utils_h264_get_profile()
+ * for more details on the parameters.
+ *
+ * Returns: %TRUE if the level and profile could be set, %FALSE otherwise.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_codec_utils_h264_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * sps, guint len)
+{
+ const gchar *level, *profile;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+ g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), FALSE);
+ g_return_val_if_fail (GST_SIMPLE_CAPS_HAS_NAME (caps, "video/x-h264"), FALSE);
+ g_return_val_if_fail (sps != NULL, FALSE);
+
+ level = gst_codec_utils_h264_get_level (sps, len);
+
+ if (level != NULL)
+ gst_caps_set_simple (caps, "level", G_TYPE_STRING, level, NULL);
+
+ profile = gst_codec_utils_h264_get_profile (sps, len);
+
+ if (profile != NULL)
+ gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile, NULL);
+
+ GST_LOG ("profile : %s", (profile) ? profile : "---");
+ GST_LOG ("level : %s", (level) ? level : "---");
+
+ return (level != NULL && profile != NULL);
+}
+
+/**
+ * gst_codec_utils_mpeg4video_get_profile:
+ * @vis_obj_seq: Pointer to the visual object sequence for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Converts the profile indication in the stream's visual object sequence into
+ * a string. @vis_obj_seq is expected to be the data following the visual
+ * object sequence start code. Only the first byte
+ * (profile_and_level_indication) is used.
+ *
+ * Returns: The profile as a const string, or NULL if there is an error.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_mpeg4video_get_profile (const guint8 * vis_obj_seq, guint len)
+{
+ /* The profile/level codes are from 14496-2, table G-1, and the Wireshark
+ * sources: epan/dissectors/packet-mp4ves.c */
+
+ /* These are a direct mapping from the integer profile id -> string. Profiles
+ * 0x6, 0xe and 0xf can correspond to more than one profile depending on the
+ * second 4 bits of vis_obj_seq[0], so they are handled separately. */
+ static const char *profiles[] = { "simple", "simple-scalable", "core",
+ "main", "n-bit", "scalable", NULL, "basic-animated-texture", "hybrid",
+ "advanced-real-time-simple", "core-scalable", "advanced-coding-efficiency",
+ "advanced-core", "advanced-scalable-texture",
+ };
+ int profile_id, level_id;
+
+ g_return_val_if_fail (vis_obj_seq != NULL, NULL);
+
+ if (len < 1)
+ return NULL;
+
+ GST_MEMDUMP ("VOS", vis_obj_seq, len);
+
+ profile_id = vis_obj_seq[0] >> 4;
+ level_id = vis_obj_seq[0] & 0xf;
+
+ GST_LOG ("profile_id = %d, level_id = %d", profile_id, level_id);
+
+ if (profile_id != 6 && profile_id < 0xe)
+ return profiles[profile_id];
+
+ if (profile_id != 0xf && level_id == 0)
+ return NULL;
+
+ switch (profile_id) {
+ case 0x6:
+ if (level_id < 3)
+ return "simple-face";
+ else if (level_id < 5)
+ return "simple-fba";
+ break;
+
+ case 0xe:
+ if (level_id < 5)
+ return "simple-studio";
+ else if (level_id < 9)
+ return "core-studio";
+ break;
+
+ case 0xf:
+ if (level_id < 6)
+ return "advanced-simple";
+ else if (level_id > 7 && level_id < 0xe)
+ return "fine-granularity-scalable";
+ break;
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_codec_utils_mpeg4video_get_level:
+ * @vis_obj_seq: Pointer to the visual object sequence for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Converts the level indication in the stream's visual object sequence into
+ * a string. @vis_obj_seq is expected to be the data following the visual
+ * object sequence start code. Only the first byte
+ * (profile_and_level_indication) is used.
+ *
+ * Returns: The level as a const string, or NULL if there is an error.
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_codec_utils_mpeg4video_get_level (const guint8 * vis_obj_seq, guint len)
+{
+ /* The profile/level codes are from 14496-2, table G-1, the Wireshark
+ * sources: epan/dissectors/packet-mp4ves.c and the Xvid Sources:
+ * src/xvid.h.
+ * Levels 4a and 5 for SP were added in Amendment 2, level 6 in Amendment 4
+ * (see Xvid sources vfw/config.c)
+ *
+ * Each profile has a different maximum level it defines. Some of them still
+ * need special case handling, because not all levels start from 1, and the
+ * Simple profile defines an intermediate level as well. */
+ static const int level_max[] = { 6, 2, 2, 4, 2, 1, 2, 2, 2, 4, 3, 4, 2, 3, 4,
+ 5
+ };
+ int profile_id, level_id;
+
+ g_return_val_if_fail (vis_obj_seq != NULL, NULL);
+
+ if (len < 1)
+ return NULL;
+
+ GST_MEMDUMP ("VOS", vis_obj_seq, len);
+
+ profile_id = vis_obj_seq[0] >> 4;
+ level_id = vis_obj_seq[0] & 0xf;
+
+ GST_LOG ("profile_id = %d, level_id = %d", profile_id, level_id);
+
+ if (profile_id != 0xf && level_id == 0)
+ return NULL;
+
+ /* Let's do some validation of the level */
+ switch (profile_id) {
+ case 0x3:
+ if (level_id == 1)
+ return NULL;
+ break;
+
+ case 0x4:
+ if (level_id != 2)
+ return NULL;
+ break;
+
+ case 0x6:
+ if (level_id > 5)
+ return NULL;
+ break;
+
+ case 0xe:
+ if (level_id > 9)
+ return NULL;
+ break;
+
+ case 0xf:
+ if (level_id == 6 || level_id == 7 || level_id > 0xd)
+ return NULL;
+ break;
+ }
+
+ if (profile_id == 0 && level_id == 8)
+ /* Simple Profile / Level 0 */
+ return "0";
+ else if (profile_id == 0 && level_id == 9)
+ /* Simple Profile / Level 0b */
+ return "0b";
+ else if (profile_id == 0 && level_id == 4)
+ /* Simple Profile / Level 4a */
+ return "4a";
+ else if (profile_id == 0xf && level_id > 7)
+ /* Fine Granularity Scalable Profile */
+ return digit_to_string (level_id - 8);
+ else if (level_id <= level_max[profile_id])
+ /* Levels for all other cases */
+ return digit_to_string (level_id);
+
+ return NULL;
+}
+
+/**
+ * gst_codec_utils_mpeg4video_caps_set_level_and_profile:
+ * @caps: the #GstCaps to which the level and profile are to be added
+ * @vis_obj_seq: Pointer to the visual object sequence for the stream.
+ * @len: Length of the data available in @sps.
+ *
+ * Sets the level and profile in @caps if it can be determined from
+ * @vis_obj_seq. See gst_codec_utils_mpeg4video_get_level() and
+ * gst_codec_utils_mpeg4video_get_profile() for more details on the
+ * parameters.
+ *
+ * Returns: %TRUE if the level and profile could be set, %FALSE otherwise.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_codec_utils_mpeg4video_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * vis_obj_seq, guint len)
+{
+ const gchar *profile, *level;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+ g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), FALSE);
+ g_return_val_if_fail (vis_obj_seq != NULL, FALSE);
+
+ profile = gst_codec_utils_mpeg4video_get_profile (vis_obj_seq, len);
+
+ if (profile != NULL)
+ gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile, NULL);
+
+ level = gst_codec_utils_mpeg4video_get_level (vis_obj_seq, len);
+
+ if (level != NULL)
+ gst_caps_set_simple (caps, "level", G_TYPE_STRING, level, NULL);
+
+ GST_LOG ("profile : %s", (profile) ? profile : "---");
+ GST_LOG ("level : %s", (level) ? level : "---");
+
+ return (profile != NULL && level != NULL);
+}
diff --git a/gst-libs/gst/pbutils/codec-utils.h b/gst-libs/gst/pbutils/codec-utils.h
new file mode 100644
index 0000000..7c2febf
--- /dev/null
+++ b/gst-libs/gst/pbutils/codec-utils.h
@@ -0,0 +1,65 @@
+/* GStreamer base utils library codec-specific utility functions
+ * Copyright (C) 2010 Arun Raghavan <arun.raghavan@collabora.co.uk>
+ * 2010 Collabora Multimedia
+ * 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_PB_UTILS_CODEC_UTILS_H__
+#define __GST_PB_UTILS_CODEC_UTILS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* AAC */
+
+guint gst_codec_utils_aac_get_sample_rate_from_index (guint sr_idx);
+
+const gchar * gst_codec_utils_aac_get_profile (const guint8 * audio_config, guint len);
+
+const gchar * gst_codec_utils_aac_get_level (const guint8 * audio_config, guint len);
+
+gboolean gst_codec_utils_aac_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * audio_config,
+ guint len);
+
+/* H.264 */
+
+const gchar * gst_codec_utils_h264_get_profile (const guint8 * sps, guint len);
+
+const gchar * gst_codec_utils_h264_get_level (const guint8 * sps, guint len);
+
+guint8 gst_codec_utils_h264_get_level_idc (const gchar * level);
+
+gboolean gst_codec_utils_h264_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * sps,
+ guint len);
+
+/* MPEG-4 part 2 */
+
+const gchar * gst_codec_utils_mpeg4video_get_profile (const guint8 * vis_obj_seq, guint len);
+
+const gchar * gst_codec_utils_mpeg4video_get_level (const guint8 * vis_obj_seq, guint len);
+
+gboolean gst_codec_utils_mpeg4video_caps_set_level_and_profile (GstCaps * caps,
+ const guint8 * vis_obj_seq,
+ guint len);
+
+G_END_DECLS
+
+#endif /* __GST_PB_UTILS_CODEC_UTILS_H__ */
diff --git a/gst-libs/gst/pbutils/descriptions.c b/gst-libs/gst/pbutils/descriptions.c
new file mode 100644
index 0000000..69cb742
--- /dev/null
+++ b/gst-libs/gst/pbutils/descriptions.c
@@ -0,0 +1,1011 @@
+/* GStreamer Plugins Base utils library source/sink/codec description support
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstpbutilsdescriptions
+ * @short_description: Provides human-readable descriptions for caps/codecs
+ * and encoder, decoder, URI source and URI sink elements
+ *
+ * <refsect2>
+ * <para>
+ * The above functions provide human-readable strings for media formats
+ * and decoder/demuxer/depayloader/encoder/muxer/payloader elements for use
+ * in error dialogs or other messages shown to users.
+ * </para>
+ * <para>
+ * gst_pb_utils_add_codec_description_to_tag_list() is a utility function
+ * for demuxer and decoder elements to add audio/video codec tags from a
+ * given (fixed) #GstCaps.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gst/gst-i18n-plugin.h"
+
+#include <gst/audio/audio.h>
+#include <gst/video/video.h>
+
+#include "pbutils.h"
+#include "pbutils-private.h"
+
+#include <string.h>
+
+typedef enum
+{
+ FLAG_CONTAINER = (1 << 0), /* format is a container format (muxed) */
+ FLAG_SYSTEMSTREAM = (1 << 1) /* match record only if caps have systemstream=true */
+} FormatFlags;
+
+typedef struct
+{
+ const gchar *type;
+ const gchar *desc;
+ FormatFlags flags;
+} FormatInfo;
+
+static const FormatInfo formats[] = {
+ /* container/tag formats with static descriptions */
+ {"application/gxf", "General Exchange Format (GXF)", FLAG_CONTAINER},
+ {"application/ogg", "Ogg", FLAG_CONTAINER},
+ {"application/mxf", "Material eXchange Format (MXF)", FLAG_CONTAINER},
+ {"application/vnd.rn-realmedia", "Realmedia", FLAG_CONTAINER},
+ {"application/x-annodex", "Ogg", FLAG_CONTAINER},
+ {"application/x-id3", N_("ID3 tag"), FLAG_CONTAINER},
+ {"application/x-ape", N_("APE tag"), FLAG_CONTAINER},
+ {"application/x-apetag", N_("APE tag"), FLAG_CONTAINER},
+ {"application/x-icy", N_("ICY internet radio"), FLAG_CONTAINER},
+ {"application/x-3gp", "3GP", FLAG_CONTAINER},
+ {"application/x-pn-realaudio", "RealAudio", FLAG_CONTAINER},
+ {"application/x-yuv4mpeg", "Y4M", FLAG_CONTAINER},
+ {"multipart/x-mixed-replace", "Multipart", FLAG_CONTAINER},
+ {"video/x-fli", "FLI/FLC/FLX Animation", FLAG_CONTAINER},
+ {"video/x-flv", "Flash", FLAG_CONTAINER},
+ {"video/x-matroska", "Matroska", FLAG_CONTAINER},
+ {"video/webm", "WebM", FLAG_CONTAINER},
+ {"video/x-ms-asf", "Advanced Streaming Format (ASF)", FLAG_CONTAINER},
+ {"video/x-msvideo", "Audio Video Interleave (AVI)", FLAG_CONTAINER},
+ {"video/x-quicktime", "Quicktime", FLAG_CONTAINER},
+ {"video/quicktime", "Quicktime", FLAG_CONTAINER},
+ {"video/mj2", "Motion JPEG 2000", FLAG_CONTAINER},
+
+ /* audio formats with static descriptions */
+ {"audio/x-ac3", "AC-3 (ATSC A/52)", 0},
+ {"audio/ac3", "AC-3 (ATSC A/52)", 0},
+ {"audio/x-private-ac3", "DVD AC-3 (ATSC A/52)", 0},
+ {"audio/x-private1-ac3", "DVD AC-3 (ATSC A/52)", 0},
+ {"audio/x-alaw", "A-Law", 0},
+ {"audio/amr", "Adaptive Multi Rate (AMR)", 0},
+ {"audio/AMR", "Adaptive Multi Rate (AMR)", 0},
+ {"audio/AMR-WB", "Adaptive Multi Rate WideBand (AMR-WB)", 0},
+ {"audio/iLBC-sh", "Internet Low Bitrate Codec (iLBC)", 0},
+ {"audio/ms-gsm", "MS GSM", 0},
+ {"audio/qcelp", "QCELP", 0},
+ {"audio/aiff", "Audio Interchange File Format (AIFF)", 0},
+ {"audio/x-aiff", "Audio Interchange File Format (AIFF)", 0},
+ {"audio/x-alac", N_("Apple Lossless Audio (ALAC)"), 0},
+ {"audio/x-amr-nb-sh", "Adaptive Multi Rate NarrowBand (AMR-NB)", 0},
+ {"audio/x-amr-wb-sh", "Adaptive Multi Rate WideBand (AMR-WB)", 0},
+ {"audio/x-au", "Sun .au", 0},
+ {"audio/x-celt", "Constrained Energy Lapped Transform (CELT)", 0},
+ {"audio/x-cinepak", "Cinepak Audio", 0},
+ {"audio/x-dpcm", "DPCM", 0},
+ {"audio/x-dts", "DTS", 0},
+ {"audio/x-private1-dts", "DTS", 0},
+ {"audio/x-dv", "DV Audio", 0},
+ {"audio/x-flac", N_("Free Lossless Audio Codec (FLAC)"), 0},
+ {"audio/x-gsm", "GSM", 0},
+ {"audio/x-iec958", "S/PDIF IEC958", 0}, /* TODO: check description */
+ {"audio/x-iLBC", "Internet Low Bitrate Codec (iLBC)", 0},
+ {"audio/x-ircam", "Berkeley/IRCAM/CARL", 0},
+ {"audio/x-lpcm", "LPCM", 0},
+ {"audio/x-private1-lpcm", "DVD LPCM", 0},
+ {"audio/x-m4a", "MPEG-4 AAC", FLAG_CONTAINER},
+ {"audio/x-mod", "Module Music Format (MOD)", 0},
+ {"audio/x-mulaw", "Mu-Law", 0},
+ {"audio/x-musepack", "Musepack (MPC)", 0},
+ {"audio/x-nellymoser", "Nellymoser Asao", 0},
+ {"audio/x-nist", "Sphere NIST", 0},
+ {"audio/x-nsf", "Nintendo NSF", 0},
+ {"audio/x-paris", "Ensoniq PARIS", 0},
+ {"audio/x-qdm", "QDesign Music (QDM)", 0},
+ {"audio/x-qdm2", "QDesign Music (QDM) 2", 0},
+ {"audio/x-ralf-mpeg4-generic", "Real Audio Lossless (RALF)", 0},
+ {"audio/x-sds", "SDS", 0},
+ {"audio/x-shorten", "Shorten Lossless", 0},
+ {"audio/x-sid", "Sid", 0},
+ {"audio/x-sipro", "Sipro/ACELP.NET Voice", 0},
+ {"audio/x-siren", "Siren", 0},
+ {"audio/x-spc", "SNES-SPC700 Sound File Data", 0},
+ {"audio/x-speex", "Speex", 0},
+ {"audio/x-svx", "Amiga IFF / SVX8 / SV16", 0},
+ {"audio/x-tta", N_("Lossless True Audio (TTA)"), 0},
+ {"audio/x-ttafile", N_("Lossless True Audio (TTA)"), 0},
+ {"audio/x-vnd.sony.atrac3", "Sony ATRAC3", 0},
+ {"audio/x-vorbis", "Vorbis", 0},
+ {"audio/x-voc", "SoundBlaster VOC", 0},
+ {"audio/x-w64", "Sonic Foundry Wave64", 0},
+ {"audio/x-wav", "WAV", 0},
+ {"audio/x-wavpack", "Wavpack", 0},
+ {"audio/x-wavpack-correction", "Wavpack", 0},
+ {"audio/x-wms", N_("Windows Media Speech"), 0},
+ {"audio/x-voxware", "Voxware", 0},
+
+
+ /* video formats with static descriptions */
+ {"video/sp5x", "Sunplus JPEG 5.x", 0},
+ {"video/vivo", "Vivo", 0},
+ {"video/x-3ivx", "3ivx", 0},
+ {"video/x-4xm", "4X Techologies Video", 0},
+ {"video/x-apple-video", "Apple video", 0},
+ {"video/x-aasc", "Autodesk Animator", 0},
+ {"video/x-camtasia", "TechSmith Camtasia", 0},
+ {"video/x-cdxa", "RIFF/CDXA (VCD)", 0},
+ {"video/x-cinepak", "Cinepak Video", 0},
+ {"video/x-cirrus-logic-accupak", "Cirrus Logipak AccuPak", 0},
+ {"video/x-compressed-yuv", N_("CYUV Lossless"), 0},
+ {"video/x-dirac", "Dirac", 0},
+ {"video/x-dnxhd", "Digital Nonlinear Extensible High Definition (DNxHD)", 0},
+ /* FIXME 0.11: rename to subpicture/x-dvd or so */
+ {"video/x-dvd-subpicture", "DVD subpicture", 0},
+ {"video/x-ffv", N_("FFMpeg v1"), 0},
+ {"video/x-flash-screen", "Flash Screen Video", 0},
+ {"video/x-flash-video", "Sorenson Spark Video", 0},
+ {"video/x-h261", "H.261", 0},
+ {"video/x-huffyuv", "Huffyuv", 0},
+ {"video/x-intel-h263", "Intel H.263", 0},
+ {"video/x-jpeg", "Motion JPEG", 0},
+ /* { "video/x-jpeg-b", "", 0 }, does this actually exist? */
+ {"video/x-loco", "LOCO Lossless", 0},
+ {"video/x-mimic", "MIMIC", 0},
+ {"video/x-mjpeg", "Motion-JPEG", 0},
+ {"video/x-mjpeg-b", "Motion-JPEG format B", 0},
+ {"video/mpegts", "MPEG-2 Transport Stream", FLAG_CONTAINER},
+ {"video/x-mng", "Multiple Image Network Graphics (MNG)", 0},
+ {"video/x-mszh", N_("Lossless MSZH"), 0},
+ {"video/x-msvideocodec", "Microsoft Video 1", 0},
+ {"video/x-mve", "Interplay MVE", FLAG_CONTAINER},
+ {"video/x-nut", "NUT", FLAG_CONTAINER},
+ {"video/x-nuv", "MythTV NuppelVideo (NUV)", FLAG_CONTAINER},
+ {"video/x-qdrw", "Apple QuickDraw", 0},
+ {"video/x-smc", "Apple SMC", 0},
+ {"video/x-smoke", "Smoke", 0},
+ {"video/x-tarkin", "Tarkin", 0},
+ {"video/x-theora", "Theora", 0},
+ {"video/x-rle", N_("Run-length encoding"), 0},
+ {"video/x-ultimotion", "IBM UltiMotion", 0},
+ {"video/x-vcd", "VideoCD (VCD)", 0},
+ {"video/x-vmnc", "VMWare NC", 0},
+ {"video/x-vp3", "On2 VP3", 0},
+ {"video/x-vp5", "On2 VP5", 0},
+ {"video/x-vp6", "On2 VP6", 0},
+ {"video/x-vp6-flash", "On2 VP6/Flash", 0},
+ {"video/x-vp6-alpha", "On2 VP6 with alpha", 0},
+ {"video/x-vp7", "On2 VP7", 0},
+ {"video/x-vp8", "VP8", 0},
+ {"video/x-xvid", "XVID MPEG-4", 0},
+ {"video/x-zlib", "Lossless zlib video", 0},
+ {"video/x-zmbv", "Zip Motion Block video", 0},
+
+ /* image formats with static descriptions */
+ {"image/bmp", "BMP", 0},
+ {"image/x-bmp", "BMP", 0},
+ {"image/x-MS-bmp", "BMP", 0},
+ {"image/gif", "GIF", 0},
+ {"image/jpeg", "JPEG", 0},
+ {"image/jng", "JPEG Network Graphics (JNG)", 0},
+ {"image/png", "PNG", 0},
+ {"image/pbm", "Portable BitMap (PBM)", 0},
+ {"image/ppm", "Portable PixMap (PPM)", 0},
+ {"image/svg+xml", "Scalable Vector Graphics (SVG)", 0},
+ {"image/tiff", "TIFF", 0},
+ {"image/x-cmu-raster", "CMU Raster Format", 0},
+ {"image/x-degas", "DEGAS", 0},
+ {"image/x-icon", "ICO", 0},
+ {"image/x-j2c", "JPEG 2000", 0},
+ {"image/x-jpc", "JPEG 2000", 0},
+ {"image/jp2", "JPEG 2000", 0},
+ {"image/x-pcx", "PCX", 0},
+ {"image/x-xcf", "XFC", 0},
+ {"image/x-pixmap", "XPM", 0},
+ {"image/x-portable-anymap", "Portable AnyMap (PAM)", 0},
+ {"image/x-portable-graymap", "Portable GrayMap (PGM)", 0},
+ {"image/x-xpixmap", "XPM", 0},
+ {"image/x-quicktime", "QuickTime Image Format (QTIF)", 0},
+ {"image/x-sun-raster", "Sun Raster Format (RAS)", 0},
+ {"image/x-tga", "TGA", 0},
+ {"image/vnd.wap.wbmp", "Wireless Bitmap", 0},
+
+ /* subtitle formats with static descriptions */
+ {"application/x-ass", "ASS", 0},
+ {"application/x-subtitle-sami", N_("Sami subtitle format"), 0},
+ {"application/x-subtitle-tmplayer", N_("TMPlayer subtitle format"), 0},
+ {"application/x-kate", "Kate", 0},
+ {"subtitle/x-kate", N_("Kate subtitle format"), 0},
+ {"subpicture/x-dvb", "DVB subtitles", 0},
+ /* add variant field to typefinder? { "application/x-subtitle", N_("subtitle"), 0}, */
+
+ /* non-audio/video/container formats */
+ {"hdv/aux-v", "HDV AUX-V", 0},
+ {"hdv/aux-a", "HDV AUX-A", 0},
+
+ /* formats with dynamic descriptions */
+ {"audio/mpeg", NULL, 0},
+ {"audio/x-adpcm", NULL, 0},
+ {"audio/x-mace", NULL, 0},
+ {"audio/x-pn-realaudio", NULL, 0},
+ {"audio/x-raw", NULL, 0},
+ {"audio/x-wma", NULL, 0},
+ {"video/mpeg", NULL, FLAG_CONTAINER | FLAG_SYSTEMSTREAM},
+ {"video/mpeg", NULL, 0},
+ {"video/x-asus", NULL, 0},
+ {"video/x-ati-vcr", NULL, 0},
+ {"video/x-divx", NULL, 0},
+ {"video/x-dv", "Digital Video (DV) System Stream",
+ FLAG_CONTAINER | FLAG_SYSTEMSTREAM},
+ {"video/x-dv", "Digital Video (DV)", 0},
+ {"video/x-h263", NULL, 0},
+ {"video/x-h264", NULL, 0},
+ {"video/x-indeo", NULL, 0},
+ {"video/x-msmpeg", NULL, 0},
+ {"video/x-pn-realvideo", NULL, 0},
+#if 0
+ /* do these exist? are they used anywhere? */
+ {"video/x-pn-multirate-realvideo", NULL, 0},
+ {"audio/x-pn-multirate-realaudio", NULL, 0},
+ {"audio/x-pn-multirate-realaudio-live", NULL, 0},
+#endif
+ {"video/x-truemotion", NULL, 0},
+ {"video/x-raw", NULL, 0},
+ {"video/x-svq", NULL, 0},
+ {"video/x-wmv", NULL, 0},
+ {"video/x-xan", NULL, 0}
+};
+
+/* returns static descriptions and dynamic ones (such as video/x-raw),
+ * or NULL if caps aren't known at all */
+static gchar *
+format_info_get_desc (const FormatInfo * info, const GstCaps * caps)
+{
+ const GstStructure *s;
+
+ g_assert (info != NULL);
+
+ if (info->desc != NULL)
+ return g_strdup (_(info->desc));
+
+ s = gst_caps_get_structure (caps, 0);
+
+ if (strcmp (info->type, "video/x-raw") == 0) {
+ gchar *ret = NULL;
+ const gchar *str = 0;
+ GstVideoFormat format;
+ const GstVideoFormatInfo *finfo;
+
+ str = gst_structure_get_string (s, "format");
+ format = gst_video_format_from_string (str);
+ if (format == GST_VIDEO_FORMAT_UNKNOWN)
+ return g_strdup (_("Uncompressed video"));
+
+ finfo = gst_video_format_get_info (format);
+
+ if (GST_VIDEO_FORMAT_INFO_IS_GRAY (finfo)) {
+ ret = g_strdup (_("Uncompressed gray"));
+ } else if (GST_VIDEO_FORMAT_INFO_IS_YUV (finfo)) {
+ const gchar *layout;
+ const gchar *subs;
+ gint w_sub, h_sub;
+
+ w_sub = GST_VIDEO_FORMAT_INFO_W_SUB (finfo, 1);
+ h_sub = GST_VIDEO_FORMAT_INFO_H_SUB (finfo, 1);
+
+ if (GST_VIDEO_FORMAT_INFO_N_PLANES (finfo) == 1) {
+ layout = "planar";
+ } else {
+ layout = "packed";
+ }
+
+ if (w_sub == 1 && h_sub == 1) {
+ subs = "4:4:4";
+ } else if (w_sub == 2 && h_sub == 1) {
+ subs = "4:2:2";
+ } else if (w_sub == 2 && h_sub == 2) {
+ subs = "4:2:0";
+ } else if (w_sub == 4 && h_sub == 1) {
+ subs = "4:1:1";
+ } else {
+ subs = "";
+ }
+ ret = g_strdup_printf (_("Uncompressed %s YUV %s"), layout, subs);
+ } else if (GST_VIDEO_FORMAT_INFO_IS_RGB (finfo)) {
+ gboolean alpha, palette;
+ gint bits;
+
+ alpha = GST_VIDEO_FORMAT_INFO_HAS_ALPHA (finfo);
+ palette = GST_VIDEO_FORMAT_INFO_HAS_PALETTE (finfo);
+ bits = GST_VIDEO_FORMAT_INFO_BITS (finfo);
+
+ ret = g_strdup_printf (_("Uncompressed %s%d-bit %s"),
+ palette ? "palettized " : "", bits, alpha ? "RGBA" : "RGB");
+ } else {
+ ret = g_strdup (_("Uncompressed video"));
+ }
+ return ret;
+ } else if (strcmp (info->type, "video/x-h263") == 0) {
+ const gchar *variant, *ret;
+
+ variant = gst_structure_get_string (s, "variant");
+ if (variant == NULL)
+ ret = "H.263";
+ else if (strcmp (variant, "itu") == 0)
+ ret = "ITU H.26n"; /* why not ITU H.263? (tpm) */
+ else if (strcmp (variant, "lead") == 0)
+ ret = "Lead H.263";
+ else if (strcmp (variant, "microsoft") == 0)
+ ret = "Microsoft H.263";
+ else if (strcmp (variant, "vdolive") == 0)
+ ret = "VDOLive";
+ else if (strcmp (variant, "vivo") == 0)
+ ret = "Vivo H.263";
+ else if (strcmp (variant, "xirlink") == 0)
+ ret = "Xirlink H.263";
+ else {
+ GST_WARNING ("Unknown H263 variant '%s'", variant);
+ ret = "H.263";
+ }
+ return g_strdup (ret);
+ } else if (strcmp (info->type, "video/x-h264") == 0) {
+ const gchar *variant, *ret;
+
+ variant = gst_structure_get_string (s, "variant");
+ if (variant == NULL)
+ ret = "H.264";
+ else if (strcmp (variant, "itu") == 0)
+ ret = "ITU H.264";
+ else if (strcmp (variant, "videosoft") == 0)
+ ret = "Videosoft H.264";
+ else if (strcmp (variant, "lead") == 0)
+ ret = "Lead H.264";
+ else {
+ GST_WARNING ("Unknown H264 variant '%s'", variant);
+ ret = "H.264";
+ }
+ return g_strdup (ret);
+ } else if (strcmp (info->type, "video/x-divx") == 0) {
+ gint ver = 0;
+
+ if (!gst_structure_get_int (s, "divxversion", &ver) || ver <= 2) {
+ GST_WARNING ("Unexpected DivX version in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("DivX MPEG-4");
+ }
+ return g_strdup_printf (_("DivX MPEG-4 Version %d"), ver);
+ } else if (strcmp (info->type, "video/x-msmpeg") == 0) {
+ gint ver = 0;
+
+ if (!gst_structure_get_int (s, "msmpegversion", &ver) ||
+ ver < 40 || ver > 49) {
+ GST_WARNING ("Unexpected msmpegversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Microsoft MPEG-4 4.x");
+ }
+ return g_strdup_printf ("Microsoft MPEG-4 4.%d", ver % 10);
+ } else if (strcmp (info->type, "video/x-truemotion") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "trueversion", &ver);
+ switch (ver) {
+ case 1:
+ return g_strdup_printf ("Duck TrueMotion 1");
+ case 2:
+ return g_strdup_printf ("TrueMotion 2.0");
+ default:
+ GST_WARNING ("Unexpected trueversion in %" GST_PTR_FORMAT, caps);
+ break;
+ }
+ return g_strdup_printf ("TrueMotion");
+ } else if (strcmp (info->type, "video/x-xan") == 0) {
+ gint ver = 0;
+
+ if (!gst_structure_get_int (s, "wcversion", &ver) || ver < 1) {
+ GST_WARNING ("Unexpected wcversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Xan Wing Commander");
+ }
+ return g_strdup_printf ("Xan Wing Commander %u", ver);
+ } else if (strcmp (info->type, "video/x-indeo") == 0) {
+ gint ver = 0;
+
+ if (!gst_structure_get_int (s, "indeoversion", &ver) || ver < 2) {
+ GST_WARNING ("Unexpected indeoversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Intel Indeo");
+ }
+ return g_strdup_printf ("Intel Indeo %u", ver);
+ } else if (strcmp (info->type, "audio/x-wma") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "wmaversion", &ver);
+ switch (ver) {
+ case 1:
+ case 2:
+ case 3:
+ return g_strdup_printf ("Windows Media Audio %d", ver + 6);
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected wmaversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Windows Media Audio");
+ } else if (strcmp (info->type, "video/x-wmv") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "wmvversion", &ver);
+ switch (ver) {
+ case 1:
+ case 2:
+ case 3:
+ return g_strdup_printf ("Windows Media Video %d", ver + 6);
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected wmvversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Windows Media Video");
+ } else if (strcmp (info->type, "audio/x-mace") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "maceversion", &ver);
+ if (ver == 3 || ver == 6) {
+ return g_strdup_printf ("MACE-%d", ver);
+ } else {
+ GST_WARNING ("Unexpected maceversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("MACE");
+ }
+ } else if (strcmp (info->type, "video/x-svq") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "svqversion", &ver);
+ if (ver == 1 || ver == 3) {
+ return g_strdup_printf ("Sorensen Video %d", ver);
+ } else {
+ GST_WARNING ("Unexpected svqversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Sorensen Video");
+ }
+ } else if (strcmp (info->type, "video/x-asus") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "asusversion", &ver);
+ if (ver == 1 || ver == 2) {
+ return g_strdup_printf ("Asus Video %d", ver);
+ } else {
+ GST_WARNING ("Unexpected asusversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("Asus Video");
+ }
+ } else if (strcmp (info->type, "video/x-ati-vcr") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "vcrversion", &ver);
+ if (ver == 1 || ver == 2) {
+ return g_strdup_printf ("ATI VCR %d", ver);
+ } else {
+ GST_WARNING ("Unexpected acrversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("ATI VCR");
+ }
+ } else if (strcmp (info->type, "audio/x-adpcm") == 0) {
+ const GValue *layout_val;
+
+ layout_val = gst_structure_get_value (s, "layout");
+ if (layout_val != NULL && G_VALUE_HOLDS_STRING (layout_val)) {
+ const gchar *layout;
+
+ if ((layout = g_value_get_string (layout_val))) {
+ gchar *layout_upper, *ret;
+
+ if (strcmp (layout, "swf") == 0)
+ return g_strdup ("Shockwave ADPCM");
+ if (strcmp (layout, "microsoft") == 0)
+ return g_strdup ("Microsoft ADPCM");
+ if (strcmp (layout, "quicktime") == 0)
+ return g_strdup ("Quicktime ADPCM");
+ if (strcmp (layout, "westwood") == 0)
+ return g_strdup ("Westwood ADPCM");
+ if (strcmp (layout, "yamaha") == 0)
+ return g_strdup ("Yamaha ADPCM");
+ /* FIXME: other layouts: sbpro2, sbpro3, sbpro4, ct, g726, ea,
+ * adx, xa, 4xm, smjpeg, dk4, dk3, dvi */
+ layout_upper = g_ascii_strup (layout, -1);
+ ret = g_strdup_printf ("%s ADPCM", layout_upper);
+ g_free (layout_upper);
+ return ret;
+ }
+ }
+ return g_strdup ("ADPCM");
+ } else if (strcmp (info->type, "audio/mpeg") == 0) {
+ gint ver = 0, layer = 0;
+
+ gst_structure_get_int (s, "mpegversion", &ver);
+
+ switch (ver) {
+ case 1:
+ gst_structure_get_int (s, "layer", &layer);
+ switch (layer) {
+ case 1:
+ case 2:
+ case 3:
+ return g_strdup_printf ("MPEG-1 Layer %d (MP%d)", layer, layer);
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected MPEG-1 layer in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("MPEG-1 Audio");
+ case 4:
+ return g_strdup ("MPEG-4 AAC");
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected audio mpegversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("MPEG Audio");
+ } else if (strcmp (info->type, "audio/x-pn-realaudio") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "raversion", &ver);
+ switch (ver) {
+ case 1:
+ return g_strdup ("RealAudio 14k4bps");
+ case 2:
+ return g_strdup ("RealAudio 28k8bps");
+ case 8:
+ return g_strdup ("RealAudio G2 (Cook)");
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected raversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("RealAudio");
+ } else if (strcmp (info->type, "video/x-pn-realvideo") == 0) {
+ gint ver = 0;
+
+ gst_structure_get_int (s, "rmversion", &ver);
+ switch (ver) {
+ case 1:
+ return g_strdup ("RealVideo 1.0");
+ case 2:
+ return g_strdup ("RealVideo 2.0");
+ case 3:
+ return g_strdup ("RealVideo 3.0");
+ case 4:
+ return g_strdup ("RealVideo 4.0");
+ default:
+ break;
+ }
+ GST_WARNING ("Unexpected rmversion in %" GST_PTR_FORMAT, caps);
+ return g_strdup ("RealVideo");
+ } else if (strcmp (info->type, "video/mpeg") == 0) {
+ gboolean sysstream;
+ gint ver = 0;
+
+ if (!gst_structure_get_boolean (s, "systemstream", &sysstream) ||
+ !gst_structure_get_int (s, "mpegversion", &ver) || ver < 1 || ver > 4) {
+ GST_WARNING ("Missing fields in mpeg video caps %" GST_PTR_FORMAT, caps);
+ } else {
+ if (sysstream) {
+ return g_strdup_printf ("MPEG-%d System Stream", ver);
+ } else {
+ return g_strdup_printf ("MPEG-%d Video", ver);
+ }
+ }
+ return g_strdup ("MPEG Video");
+ } else if (strcmp (info->type, "audio/x-raw") == 0) {
+ gint depth = 0;
+ gboolean is_float;
+ const gchar *str;
+ GstAudioFormat format;
+ const GstAudioFormatInfo *finfo;
+
+ str = gst_structure_get_string (s, "format");
+ format = gst_audio_format_from_string (str);
+ if (format == GST_AUDIO_FORMAT_UNKNOWN)
+ return g_strdup (_("Uncompressed audio"));
+
+ finfo = gst_audio_format_get_info (format);
+ depth = GST_AUDIO_FORMAT_INFO_DEPTH (finfo);
+ is_float = GST_AUDIO_FORMAT_INFO_IS_FLOAT (finfo);
+
+ return g_strdup_printf (_("Raw %d-bit %s audio"), depth,
+ is_float ? "floating-point" : "PCM");
+ }
+ return NULL;
+}
+
+/* returns format info structure, will return NULL for dynamic media types! */
+static const FormatInfo *
+find_format_info (const GstCaps * caps)
+{
+ const GstStructure *s;
+ const gchar *media_type;
+ guint i;
+
+ s = gst_caps_get_structure (caps, 0);
+ media_type = gst_structure_get_name (s);
+
+ for (i = 0; i < G_N_ELEMENTS (formats); ++i) {
+ if (strcmp (media_type, formats[i].type) == 0) {
+ gboolean is_sys = FALSE;
+
+ if ((formats[i].flags & FLAG_SYSTEMSTREAM) == 0)
+ return &formats[i];
+
+ /* this record should only be matched if the systemstream field is set */
+ if (gst_structure_get_boolean (s, "systemstream", &is_sys) && is_sys)
+ return &formats[i];
+ }
+ }
+
+ return NULL;
+}
+
+static gboolean
+caps_are_rtp_caps (const GstCaps * caps, const gchar * media, gchar ** format)
+{
+ const GstStructure *s;
+ const gchar *str;
+
+ g_assert (media != NULL && format != NULL);
+
+ s = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_has_name (s, "application/x-rtp"))
+ return FALSE;
+ if (!gst_structure_has_field_typed (s, "media", G_TYPE_STRING))
+ return FALSE;
+ str = gst_structure_get_string (s, "media");
+ if (str == NULL || !g_str_equal (str, media))
+ return FALSE;
+ str = gst_structure_get_string (s, "encoding-name");
+ if (str == NULL || *str == '\0')
+ return FALSE;
+
+ if (strcmp (str, "X-ASF-PF") == 0) {
+ *format = g_strdup ("Windows Media");
+ } else if (g_str_has_prefix (str, "X-")) {
+ *format = g_strdup (str + 2);
+ } else {
+ *format = g_strdup (str);
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_pb_utils_get_source_description:
+ * @protocol: the protocol the source element needs to handle, e.g. "http"
+ *
+ * Returns a localised string describing a source element handling the protocol
+ * specified in @protocol, for use in error dialogs or other messages to be
+ * seen by the user. Should never return NULL unless @protocol is invalid.
+ *
+ * This function is mainly for internal use, applications would typically
+ * use gst_missing_plugin_message_get_description() to get a description of
+ * a missing feature from a missing-plugin message.
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_source_description (const gchar * protocol)
+{
+ gchar *proto_uc, *ret;
+
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ if (strcmp (protocol, "cdda") == 0)
+ return g_strdup (_("Audio CD source"));
+
+ if (strcmp (protocol, "dvd") == 0)
+ return g_strdup (_("DVD source"));
+
+ if (strcmp (protocol, "rtsp") == 0)
+ return g_strdup (_("Real Time Streaming Protocol (RTSP) source"));
+
+ /* TODO: what about mmst, mmsu, mmsh? */
+ if (strcmp (protocol, "mms") == 0)
+ return g_strdup (_("Microsoft Media Server (MMS) protocol source"));
+
+ /* make protocol uppercase */
+ proto_uc = g_ascii_strup (protocol, -1);
+
+ /* TODO: find out how to add a comment for translators to the source code
+ * (and tell them to make the first letter uppercase below if they move
+ * the protocol to the middle or end of the string) */
+ ret = g_strdup_printf (_("%s protocol source"), proto_uc);
+
+ g_free (proto_uc);
+
+ return ret;
+}
+
+/**
+ * gst_pb_utils_get_sink_description:
+ * @protocol: the protocol the sink element needs to handle, e.g. "http"
+ *
+ * Returns a localised string describing a sink element handling the protocol
+ * specified in @protocol, for use in error dialogs or other messages to be
+ * seen by the user. Should never return NULL unless @protocol is invalid.
+ *
+ * This function is mainly for internal use, applications would typically
+ * use gst_missing_plugin_message_get_description() to get a description of
+ * a missing feature from a missing-plugin message.
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_sink_description (const gchar * protocol)
+{
+ gchar *proto_uc, *ret;
+
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ /* make protocol uppercase */
+ proto_uc = g_ascii_strup (protocol, -1);
+
+ /* TODO: find out how to add a comment for translators to the source code
+ * (and tell them to make the first letter uppercase below if they move
+ * the protocol to the middle or end of the string) */
+ ret = g_strdup_printf ("%s protocol sink", proto_uc);
+
+ g_free (proto_uc);
+
+ return ret;
+}
+
+/**
+ * gst_pb_utils_get_decoder_description:
+ * @caps: the (fixed) #GstCaps for which an decoder description is needed
+ *
+ * Returns a localised string describing an decoder for the format specified
+ * in @caps, for use in error dialogs or other messages to be seen by the user.
+ * Should never return NULL unless @factory_name or @caps are invalid.
+ *
+ * This function is mainly for internal use, applications would typically
+ * use gst_missing_plugin_message_get_description() to get a description of
+ * a missing feature from a missing-plugin message.
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_decoder_description (const GstCaps * caps)
+{
+ gchar *str, *ret;
+ GstCaps *tmp;
+
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+
+ tmp = copy_and_clean_caps (caps);
+
+ g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+
+ /* special-case RTP caps */
+ if (caps_are_rtp_caps (tmp, "video", &str)) {
+ ret = g_strdup_printf (_("%s video RTP depayloader"), str);
+ } else if (caps_are_rtp_caps (tmp, "audio", &str)) {
+ ret = g_strdup_printf (_("%s audio RTP depayloader"), str);
+ } else if (caps_are_rtp_caps (tmp, "application", &str)) {
+ ret = g_strdup_printf (_("%s RTP depayloader"), str);
+ } else {
+ const FormatInfo *info;
+
+ str = gst_pb_utils_get_codec_description (tmp);
+ info = find_format_info (tmp);
+ if (info != NULL && (info->flags & FLAG_CONTAINER) != 0) {
+ ret = g_strdup_printf (_("%s demuxer"), str);
+ } else {
+ ret = g_strdup_printf (_("%s decoder"), str);
+ }
+ }
+
+ g_free (str);
+ gst_caps_unref (tmp);
+
+ return ret;
+}
+
+/**
+ * gst_pb_utils_get_encoder_description:
+ * @caps: the (fixed) #GstCaps for which an encoder description is needed
+ *
+ * Returns a localised string describing an encoder for the format specified
+ * in @caps, for use in error dialogs or other messages to be seen by the user.
+ * Should never return NULL unless @factory_name or @caps are invalid.
+ *
+ * This function is mainly for internal use, applications would typically
+ * use gst_missing_plugin_message_get_description() to get a description of
+ * a missing feature from a missing-plugin message.
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_encoder_description (const GstCaps * caps)
+{
+ gchar *str, *ret;
+ GstCaps *tmp;
+
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+ tmp = copy_and_clean_caps (caps);
+ g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+
+ /* special-case RTP caps */
+ if (caps_are_rtp_caps (tmp, "video", &str)) {
+ ret = g_strdup_printf (_("%s video RTP payloader"), str);
+ } else if (caps_are_rtp_caps (tmp, "audio", &str)) {
+ ret = g_strdup_printf (_("%s audio RTP payloader"), str);
+ } else if (caps_are_rtp_caps (tmp, "application", &str)) {
+ ret = g_strdup_printf (_("%s RTP payloader"), str);
+ } else {
+ const FormatInfo *info;
+
+ str = gst_pb_utils_get_codec_description (tmp);
+ info = find_format_info (tmp);
+ if (info != NULL && (info->flags & FLAG_CONTAINER) != 0) {
+ ret = g_strdup_printf (_("%s muxer"), str);
+ } else {
+ ret = g_strdup_printf (_("%s encoder"), str);
+ }
+ }
+
+ g_free (str);
+ gst_caps_unref (tmp);
+
+ return ret;
+}
+
+/**
+ * gst_pb_utils_get_element_description:
+ * @factory_name: the name of the element, e.g. "giosrc"
+ *
+ * Returns a localised string describing the given element, for use in
+ * error dialogs or other messages to be seen by the user. Should never
+ * return NULL unless @factory_name is invalid.
+ *
+ * This function is mainly for internal use, applications would typically
+ * use gst_missing_plugin_message_get_description() to get a description of
+ * a missing feature from a missing-plugin message.
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_element_description (const gchar * factory_name)
+{
+ gchar *ret;
+
+ g_return_val_if_fail (factory_name != NULL, NULL);
+
+ ret = g_strdup_printf (_("GStreamer element %s"), factory_name);
+ if (ret && g_str_has_prefix (ret, factory_name))
+ *ret = g_ascii_toupper (*ret);
+
+ return ret;
+}
+
+/**
+ * gst_pb_utils_add_codec_description_to_tag_list:
+ * @taglist: a #GstTagList
+ * @codec_tag: a GStreamer codec tag such as #GST_TAG_AUDIO_CODEC,
+ * #GST_TAG_VIDEO_CODEC or #GST_TAG_CODEC
+ * @caps: the (fixed) #GstCaps for which a codec tag should be added.
+ *
+ * Adds a codec tag describing the format specified by @caps to @taglist.
+ *
+ * Returns: TRUE if a codec tag was added, FALSE otherwise.
+ */
+gboolean
+gst_pb_utils_add_codec_description_to_tag_list (GstTagList * taglist,
+ const gchar * codec_tag, const GstCaps * caps)
+{
+ const FormatInfo *info;
+ gchar *desc;
+
+ g_return_val_if_fail (taglist != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_TAG_LIST (taglist), FALSE);
+ g_return_val_if_fail (codec_tag != NULL, FALSE);
+ g_return_val_if_fail (gst_tag_exists (codec_tag), FALSE);
+ g_return_val_if_fail (gst_tag_get_type (codec_tag) == G_TYPE_STRING, FALSE);
+ g_return_val_if_fail (caps != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+
+ info = find_format_info (caps);
+ if (info == NULL)
+ return FALSE;
+
+ desc = format_info_get_desc (info, caps);
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, codec_tag, desc, NULL);
+ g_free (desc);
+
+ return TRUE;
+}
+
+/**
+ * gst_pb_utils_get_codec_description:
+ * @caps: the (fixed) #GstCaps for which an format description is needed
+ *
+ * Returns a localised (as far as this is possible) string describing the
+ * media format specified in @caps, for use in error dialogs or other messages
+ * to be seen by the user. Should never return NULL unless @caps is invalid.
+ *
+ * Also see the convenience function
+ * gst_pb_utils_add_codec_description_to_tag_list().
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_pb_utils_get_codec_description (const GstCaps * caps)
+{
+ const FormatInfo *info;
+ gchar *str, *comma;
+ GstCaps *tmp;
+
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+ tmp = copy_and_clean_caps (caps);
+ g_return_val_if_fail (gst_caps_is_fixed (tmp), NULL);
+
+ info = find_format_info (tmp);
+
+ if (info) {
+ str = format_info_get_desc (info, tmp);
+ } else {
+ str = gst_caps_to_string (tmp);
+
+ /* cut off everything after the media type, if there is anything */
+ if ((comma = strchr (str, ','))) {
+ *comma = '\0';
+ g_strchomp (str);
+ /* we could do something more elaborate here, like taking into account
+ * audio/, video/, image/ and application/ prefixes etc. */
+ }
+
+ GST_WARNING ("No description available for media type: %s", str);
+ }
+ gst_caps_unref (tmp);
+
+ return str;
+}
+
+#if 0
+void
+gst_pb_utils_list_all (void)
+{
+ gint i;
+
+ g_print ("static const gchar *caps_strings[] = { ");
+
+ for (i = 0; i < G_N_ELEMENTS (formats); ++i) {
+ if (formats[i].desc != NULL)
+ g_print (" \"%s\", ", formats[i].type);
+ }
+ g_print ("\n#if 0\n");
+ for (i = 0; i < G_N_ELEMENTS (formats); ++i) {
+ if (formats[i].desc == NULL)
+ g_print (" \"%s\", \n", formats[i].type);
+ }
+ g_print ("\n#endif\n");
+}
+#endif
diff --git a/gst-libs/gst/pbutils/descriptions.h b/gst-libs/gst/pbutils/descriptions.h
new file mode 100644
index 0000000..5b19ecc
--- /dev/null
+++ b/gst-libs/gst/pbutils/descriptions.h
@@ -0,0 +1,58 @@
+/* GStreamer base utils library source/sink/codec description support
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PB_UTILS_DESCRIPTIONS_H__
+#define __GST_PB_UTILS_DESCRIPTIONS_H__
+
+#include <gst/gsttaglist.h>
+#include <gst/gstcaps.h>
+
+G_BEGIN_DECLS
+
+/*
+ * functions for use by demuxers or decoders to add CODEC tags to tag lists
+ * from caps
+ */
+
+gboolean gst_pb_utils_add_codec_description_to_tag_list (GstTagList * taglist,
+ const gchar * codec_tag,
+ const GstCaps * caps);
+
+gchar * gst_pb_utils_get_codec_description (const GstCaps * caps);
+
+/*
+ * functions mainly used by the missing plugins message creation functions to
+ * find descriptions of what exactly is missing
+ */
+
+gchar * gst_pb_utils_get_source_description (const gchar * protocol);
+
+gchar * gst_pb_utils_get_sink_description (const gchar * protocol);
+
+gchar * gst_pb_utils_get_decoder_description (const GstCaps * caps);
+
+gchar * gst_pb_utils_get_encoder_description (const GstCaps * caps);
+
+gchar * gst_pb_utils_get_element_description (const gchar * factory_name);
+
+
+G_END_DECLS
+
+#endif /* __GST_PB_UTILS_DESCRIPTIONS_H__ */
+
diff --git a/gst-libs/gst/pbutils/encoding-profile.c b/gst-libs/gst/pbutils/encoding-profile.c
new file mode 100644
index 0000000..710e5bc
--- /dev/null
+++ b/gst-libs/gst/pbutils/encoding-profile.c
@@ -0,0 +1,967 @@
+/* GStreamer encoding profiles library
+ * Copyright (C) 2009-2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009-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.
+ */
+
+/**
+ * SECTION:encoding-profile
+ * @short_description: Encoding profile library
+ *
+ * <refsect2>
+ * <para>
+ * Functions to create and handle encoding profiles.
+ * </para>
+ * <para>
+ * Encoding profiles describe the media types and settings one wishes to use for
+ * an encoding process. The top-level profiles are commonly
+ * #GstEncodingContainerProfile(s) (which contains a user-readable name and
+ * description along with which container format to use). These, in turn,
+ * reference one or more #GstEncodingProfile(s) which indicate which encoding
+ * format should be used on each individual streams.
+ * </para>
+ * <para>
+ * #GstEncodingProfile(s) can be provided to the 'encodebin' element, which will take
+ * care of selecting and setting up the required elements to produce an output stream
+ * conforming to the specifications of the profile.
+ * </para>
+ * <para>
+ * Unlike other systems, the encoding profiles do not specify which #GstElement to use
+ * for the various encoding and muxing steps, but instead relies on specifying the format
+ * one wishes to use.
+ * </para>
+ * <para>
+ * Encoding profiles can be created at runtime by the application or loaded from (and saved
+ * to) file using the #GstEncodingTarget API.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Example: Creating a profile</title>
+ * <para>
+ * |[
+ * #include <gst/pbutils/encoding-profile.h>
+ * ...
+ * GstEncodingProfile *
+ * create_ogg_theora_profile(void)
+ *{
+ * GstEncodingContainerProfile *prof;
+ * GstCaps *caps;
+ *
+ * caps = gst_caps_from_string("application/ogg");
+ * prof = gst_encoding_container_profile_new("Ogg audio/video",
+ * "Standard OGG/THEORA/VORBIS",
+ * caps, NULL);
+ * gst_caps_unref (caps);
+ *
+ * caps = gst_caps_from_string("video/x-theora");
+ * gst_encoding_container_profile_add_profile(prof,
+ * (GstEncodingProfile*) gst_encoding_video_profile_new(caps, NULL, NULL, 0));
+ * gst_caps_unref (caps);
+ *
+ * caps = gst_caps_from_string("audio/x-vorbis");
+ * gst_encoding_container_profile_add_profile(prof,
+ * (GstEncodingProfile*) gst_encoding_audio_profile_new(caps, NULL, NULL, 0));
+ * gst_caps_unref (caps);
+ *
+ * return (GstEncodingProfile*) prof;
+ *}
+ *
+ *
+ * ]|
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Example: Listing categories, targets and profiles</title>
+ * <para>
+ * |[
+ * #include <gst/pbutils/encoding-profile.h>
+ * ...
+ * GstEncodingProfile *prof;
+ * GList *categories, *tmpc;
+ * GList *targets, *tmpt;
+ * ...
+ * categories = gst_encoding_target_list_available_categories();
+ *
+ * ... Show available categories to user ...
+ *
+ * for (tmpc = categories; tmpc; tmpc = tmpc->next) {
+ * gchar *category = (gchar *) tmpc->data;
+ *
+ * ... and we can list all targets within that category ...
+ *
+ * targets = gst_encoding_target_list_all (category);
+ *
+ * ... and show a list to our users ...
+ *
+ * g_list_foreach (targets, (GFunc) gst_encoding_target_unref, NULL);
+ * g_list_free (targets);
+ * }
+ *
+ * g_list_foreach (categories, (GFunc) g_free, NULL);
+ * g_list_free (categories);
+ *
+ * ...
+ * ]|
+ * </para>
+ * </refsect2>
+ *
+ * Since: 0.10.32
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "encoding-profile.h"
+#include "encoding-target.h"
+
+/* GstEncodingProfile API */
+
+struct _GstEncodingProfile
+{
+ GObject parent;
+
+ /*< public > */
+ gchar *name;
+ gchar *description;
+ GstCaps *format;
+ gchar *preset;
+ guint presence;
+ GstCaps *restriction;
+};
+
+static void string_to_profile_transform (const GValue * src_value,
+ GValue * dest_value);
+static gboolean gst_encoding_profile_deserialize_valfunc (GValue * value,
+ const gchar * s);
+
+static void gst_encoding_profile_class_init (GstEncodingProfileClass * klass);
+static gpointer gst_encoding_profile_parent_class = NULL;
+
+static void
+gst_encoding_profile_class_intern_init (gpointer klass)
+{
+ gst_encoding_profile_parent_class = g_type_class_peek_parent (klass);
+ gst_encoding_profile_class_init ((GstEncodingProfileClass *) klass);
+}
+
+GType
+gst_encoding_profile_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ GType g_define_type_id = g_type_register_static_simple (G_TYPE_OBJECT,
+ g_intern_static_string ("GstEncodingProfile"),
+ sizeof (GstEncodingProfileClass),
+ (GClassInitFunc) gst_encoding_profile_class_intern_init,
+ sizeof (GstEncodingProfile),
+ NULL,
+ (GTypeFlags) 0);
+ static GstValueTable gstvtable = {
+ G_TYPE_NONE,
+ (GstValueCompareFunc) NULL,
+ (GstValueSerializeFunc) NULL,
+ (GstValueDeserializeFunc) gst_encoding_profile_deserialize_valfunc
+ };
+
+ gstvtable.type = g_define_type_id;
+
+ /* Register a STRING=>PROFILE GValueTransformFunc */
+ g_value_register_transform_func (G_TYPE_STRING, g_define_type_id,
+ string_to_profile_transform);
+ /* Register gst-specific GValue functions */
+ gst_value_register (&gstvtable);
+
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+static void
+gst_encoding_profile_finalize (GObject * object)
+{
+ GstEncodingProfile *prof = (GstEncodingProfile *) object;
+ if (prof->name)
+ g_free (prof->name);
+ if (prof->format)
+ gst_caps_unref (prof->format);
+ if (prof->preset)
+ g_free (prof->preset);
+ if (prof->description)
+ g_free (prof->description);
+ if (prof->restriction)
+ gst_caps_unref (prof->restriction);
+}
+
+static void
+gst_encoding_profile_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_encoding_profile_finalize;
+}
+
+/**
+ * gst_encoding_profile_get_name:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the name of the profile, can be %NULL.
+ */
+const gchar *
+gst_encoding_profile_get_name (GstEncodingProfile * profile)
+{
+ return profile->name;
+}
+
+/**
+ * gst_encoding_profile_get_description:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the description of the profile, can be %NULL.
+ */
+const gchar *
+gst_encoding_profile_get_description (GstEncodingProfile * profile)
+{
+ return profile->description;
+}
+
+/**
+ * gst_encoding_profile_get_format:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the media format used
+ * in the profile. Unref after usage.
+ */
+GstCaps *
+gst_encoding_profile_get_format (GstEncodingProfile * profile)
+{
+ return (profile->format ? gst_caps_ref (profile->format) : NULL);
+}
+
+/**
+ * gst_encoding_profile_get_preset:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the name of the #GstPreset to be used in the profile.
+ */
+const gchar *
+gst_encoding_profile_get_preset (GstEncodingProfile * profile)
+{
+ return profile->preset;
+}
+
+/**
+ * gst_encoding_profile_get_presence:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: The number of times the profile is used in its parent
+ * container profile. If 0, it is not a mandatory stream.
+ */
+guint
+gst_encoding_profile_get_presence (GstEncodingProfile * profile)
+{
+ return profile->presence;
+}
+
+/**
+ * gst_encoding_profile_get_restriction:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The restriction #GstCaps to apply before the encoder
+ * that will be used in the profile. The fields present in restriction caps are
+ * properties of the raw stream (that is before encoding), such as height and
+ * width for video and depth and sampling rate for audio. Does not apply to
+ * #GstEncodingContainerProfile (since there is no corresponding raw stream).
+ * Can be %NULL. Unref after usage.
+ */
+GstCaps *
+gst_encoding_profile_get_restriction (GstEncodingProfile * profile)
+{
+ return (profile->restriction ? gst_caps_ref (profile->restriction) : NULL);
+}
+
+/**
+ * gst_encoding_profile_set_name:
+ * @profile: a #GstEncodingProfile
+ * @name: the name to set on the profile
+ *
+ * Set @name as the given name for the @profile. A copy of @name will be made
+ * internally.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_name (GstEncodingProfile * profile, const gchar * name)
+{
+ if (profile->name)
+ g_free (profile->name);
+ profile->name = g_strdup (name);
+}
+
+/**
+ * gst_encoding_profile_set_description:
+ * @profile: a #GstEncodingProfile
+ * @description: the description to set on the profile
+ *
+ * Set @description as the given description for the @profile. A copy of @description will be made
+ * internally.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_description (GstEncodingProfile * profile,
+ const gchar * description)
+{
+ if (profile->description)
+ g_free (profile->description);
+ profile->description = g_strdup (description);
+}
+
+/**
+ * gst_encoding_profile_set_format:
+ * @profile: a #GstEncodingProfile
+ * @format: the media format to use in the profile.
+ *
+ * Sets the media format used in the profile.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_format (GstEncodingProfile * profile, GstCaps * format)
+{
+ if (profile->format)
+ gst_caps_unref (profile->format);
+ profile->format = gst_caps_ref (format);
+}
+
+/**
+ * gst_encoding_profile_set_preset:
+ * @profile: a #GstEncodingProfile
+ * @preset: the element preset to use
+ *
+ * Sets the preset to use for the profile.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_preset (GstEncodingProfile * profile,
+ const gchar * preset)
+{
+ if (profile->preset)
+ g_free (profile->preset);
+ profile->preset = g_strdup (preset);
+}
+
+/**
+ * gst_encoding_profile_set_presence:
+ * @profile: a #GstEncodingProfile
+ * @presence: the number of time the profile can be used
+ *
+ * Set the number of time the profile is used in its parent
+ * container profile. If 0, it is not a mandatory stream
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_presence (GstEncodingProfile * profile, guint presence)
+{
+ profile->presence = presence;
+}
+
+/**
+ * gst_encoding_profile_set_restriction:
+ * @profile: a #GstEncodingProfile
+ * @restriction: the restriction to apply
+ *
+ * Set the restriction #GstCaps to apply before the encoder
+ * that will be used in the profile. See gst_encoding_profile_set_restriction()
+ * for more about restrictions. Does not apply to #GstEncodingContainerProfile.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_profile_set_restriction (GstEncodingProfile * profile,
+ GstCaps * restriction)
+{
+ if (profile->restriction)
+ gst_caps_unref (profile->restriction);
+ profile->restriction = restriction;
+}
+
+/* Container profiles */
+
+struct _GstEncodingContainerProfile
+{
+ GstEncodingProfile parent;
+
+ GList *encodingprofiles;
+};
+
+G_DEFINE_TYPE (GstEncodingContainerProfile, gst_encoding_container_profile,
+ GST_TYPE_ENCODING_PROFILE);
+
+static void
+gst_encoding_container_profile_init (GstEncodingContainerProfile * prof)
+{
+ /* Nothing to initialize */
+}
+
+static void
+gst_encoding_container_profile_finalize (GObject * object)
+{
+ GstEncodingContainerProfile *prof = (GstEncodingContainerProfile *) object;
+
+ g_list_foreach (prof->encodingprofiles, (GFunc) g_object_unref, NULL);
+ g_list_free (prof->encodingprofiles);
+
+ G_OBJECT_CLASS (gst_encoding_container_profile_parent_class)->finalize
+ ((GObject *) prof);
+}
+
+static void
+gst_encoding_container_profile_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_encoding_container_profile_finalize;
+}
+
+const GList *
+gst_encoding_container_profile_get_profiles (GstEncodingContainerProfile *
+ profile)
+{
+ return profile->encodingprofiles;
+}
+
+/* Video profiles */
+
+struct _GstEncodingVideoProfile
+{
+ GstEncodingProfile parent;
+
+ guint pass;
+ gboolean variableframerate;
+};
+
+G_DEFINE_TYPE (GstEncodingVideoProfile, gst_encoding_video_profile,
+ GST_TYPE_ENCODING_PROFILE);
+
+static void
+gst_encoding_video_profile_init (GstEncodingVideoProfile * prof)
+{
+ /* Nothing to initialize */
+}
+
+static void
+gst_encoding_video_profile_class_init (GObjectClass * klass)
+{
+}
+
+/**
+ * gst_encoding_video_profile_get_pass:
+ * @prof: a #GstEncodingVideoProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: The pass number if this is part of a multi-pass profile. Starts at
+ * 1 for multi-pass. 0 if this is not a multi-pass profile
+ **/
+guint
+gst_encoding_video_profile_get_pass (GstEncodingVideoProfile * prof)
+{
+ return prof->pass;
+}
+
+/**
+ * gst_encoding_video_profile_get_variableframerate:
+ * @prof: a #GstEncodingVideoProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: Whether non-constant video framerate is allowed for encoding.
+ */
+gboolean
+gst_encoding_video_profile_get_variableframerate (GstEncodingVideoProfile *
+ prof)
+{
+ return prof->variableframerate;
+}
+
+/**
+ * gst_encoding_video_profile_set_pass:
+ * @prof: a #GstEncodingVideoProfile
+ * @pass: the pass number for this profile
+ *
+ * Sets the pass number of this video profile. The first pass profile should have
+ * this value set to 1. If this video profile isn't part of a multi-pass profile,
+ * you may set it to 0 (the default value).
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_video_profile_set_pass (GstEncodingVideoProfile * prof, guint pass)
+{
+ prof->pass = pass;
+}
+
+/**
+ * gst_encoding_video_profile_set_variableframerate:
+ * @prof: a #GstEncodingVideoProfile
+ * @variableframerate: a boolean
+ *
+ * If set to %TRUE, then the incoming streamm will be allowed to have non-constant
+ * framerate. If set to %FALSE (default value), then the incoming stream will
+ * be normalized by dropping/duplicating frames in order to produce a
+ * constance framerate.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_encoding_video_profile_set_variableframerate (GstEncodingVideoProfile *
+ prof, gboolean variableframerate)
+{
+ prof->variableframerate = variableframerate;
+}
+
+/* Audio profiles */
+
+struct _GstEncodingAudioProfile
+{
+ GstEncodingProfile parent;
+};
+
+G_DEFINE_TYPE (GstEncodingAudioProfile, gst_encoding_audio_profile,
+ GST_TYPE_ENCODING_PROFILE);
+
+static void
+gst_encoding_audio_profile_init (GstEncodingAudioProfile * prof)
+{
+ /* Nothing to initialize */
+}
+
+static void
+gst_encoding_audio_profile_class_init (GObjectClass * klass)
+{
+}
+
+static inline gboolean
+_gst_caps_is_equal_safe (GstCaps * a, GstCaps * b)
+{
+ if (a == b)
+ return TRUE;
+ if ((a == NULL) || (b == NULL))
+ return FALSE;
+ return gst_caps_is_equal (a, b);
+}
+
+static gint
+_compare_container_encoding_profiles (GstEncodingContainerProfile * ca,
+ GstEncodingContainerProfile * cb)
+{
+ GList *tmp;
+
+ if (g_list_length (ca->encodingprofiles) !=
+ g_list_length (cb->encodingprofiles))
+ return -1;
+
+ for (tmp = ca->encodingprofiles; tmp; tmp = tmp->next) {
+ GstEncodingProfile *prof = (GstEncodingProfile *) tmp->data;
+ if (!gst_encoding_container_profile_contains_profile (ca, prof))
+ return -1;
+ }
+
+ return 0;
+}
+
+static gint
+_compare_encoding_profiles (const GstEncodingProfile * a,
+ const GstEncodingProfile * b)
+{
+ if ((G_TYPE_FROM_INSTANCE (a) != G_TYPE_FROM_INSTANCE (b)) ||
+ !_gst_caps_is_equal_safe (a->format, b->format) ||
+ (g_strcmp0 (a->preset, b->preset) != 0) ||
+ (g_strcmp0 (a->name, b->name) != 0) ||
+ (g_strcmp0 (a->description, b->description) != 0))
+ return -1;
+
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (a))
+ return
+ _compare_container_encoding_profiles (GST_ENCODING_CONTAINER_PROFILE
+ (a), GST_ENCODING_CONTAINER_PROFILE (b));
+
+ if (GST_IS_ENCODING_VIDEO_PROFILE (a)) {
+ GstEncodingVideoProfile *va = (GstEncodingVideoProfile *) a;
+ GstEncodingVideoProfile *vb = (GstEncodingVideoProfile *) b;
+
+ if ((va->pass != vb->pass)
+ || (va->variableframerate != vb->variableframerate))
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+ * gst_encoding_container_profile_contains_profile:
+ * @container: a #GstEncodingContainerProfile
+ * @profile: a #GstEncodingProfile
+ *
+ * Checks if @container contains a #GstEncodingProfile identical to
+ * @profile.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if @container contains a #GstEncodingProfile identical
+ * to @profile, else %FALSE.
+ */
+gboolean
+gst_encoding_container_profile_contains_profile (GstEncodingContainerProfile *
+ container, GstEncodingProfile * profile)
+{
+ g_return_val_if_fail (GST_IS_ENCODING_CONTAINER_PROFILE (container), FALSE);
+ g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE);
+
+ return (g_list_find_custom (container->encodingprofiles, profile,
+ (GCompareFunc) _compare_encoding_profiles) != NULL);
+}
+
+/**
+ * gst_encoding_container_profile_add_profile:
+ * @container: the #GstEncodingContainerProfile to use
+ * @profile: the #GstEncodingProfile to add.
+ *
+ * Add a #GstEncodingProfile to the list of profiles handled by @container.
+ *
+ * No copy of @profile will be made, if you wish to use it elsewhere after this
+ * method you should increment its reference count.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if the @stream was properly added, else %FALSE.
+ */
+gboolean
+gst_encoding_container_profile_add_profile (GstEncodingContainerProfile *
+ container, GstEncodingProfile * profile)
+{
+ g_return_val_if_fail (GST_IS_ENCODING_CONTAINER_PROFILE (container), FALSE);
+ g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE);
+
+ if (g_list_find_custom (container->encodingprofiles, profile,
+ (GCompareFunc) _compare_encoding_profiles)) {
+ GST_ERROR
+ ("Encoding profile already contains an identical GstEncodingProfile");
+ return FALSE;
+ }
+
+ container->encodingprofiles =
+ g_list_append (container->encodingprofiles, profile);
+
+ return TRUE;
+}
+
+static GstEncodingProfile *
+common_creation (GType objtype, GstCaps * format, const gchar * preset,
+ const gchar * name, const gchar * description, GstCaps * restriction,
+ guint presence)
+{
+ GstEncodingProfile *prof;
+
+ prof = (GstEncodingProfile *) g_object_new (objtype, NULL);
+
+ if (name)
+ prof->name = g_strdup (name);
+ if (description)
+ prof->description = g_strdup (description);
+ if (preset)
+ prof->preset = g_strdup (preset);
+ if (format)
+ prof->format = gst_caps_ref (format);
+ if (restriction)
+ prof->restriction = gst_caps_ref (restriction);
+ prof->presence = presence;
+
+ return prof;
+}
+
+/**
+ * gst_encoding_container_profile_new:
+ * @name: The name of the container profile, can be %NULL
+ * @description: The description of the container profile, can be %NULL
+ * @format: The format to use for this profile
+ * @preset: The preset to use for this profile
+ *
+ * Creates a new #GstEncodingContainerProfile.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: The newly created #GstEncodingContainerProfile.
+ */
+GstEncodingContainerProfile *
+gst_encoding_container_profile_new (const gchar * name,
+ const gchar * description, GstCaps * format, const gchar * preset)
+{
+ g_return_val_if_fail (GST_IS_CAPS (format), NULL);
+
+ return (GstEncodingContainerProfile *)
+ common_creation (GST_TYPE_ENCODING_CONTAINER_PROFILE, format, preset,
+ name, description, NULL, 0);
+}
+
+/**
+ * gst_encoding_video_profile_new:
+ * @format: the #GstCaps
+ * @preset: the preset(s) to use on the encoder, can be #NULL
+ * @restriction: the #GstCaps used to restrict the input to the encoder, can be
+ * NULL. See gst_encoding_profile_get_restriction() for more details.
+ * @presence: the number of time this stream must be used. 0 means any number of
+ * times (including never)
+ *
+ * Creates a new #GstEncodingVideoProfile
+ *
+ * All provided allocatable arguments will be internally copied, so can be
+ * safely freed/unreferenced after calling this method.
+ *
+ * If you wish to control the pass number (in case of multi-pass scenarios),
+ * please refer to the gst_encoding_video_profile_set_pass() documentation.
+ *
+ * If you wish to use/force a constant framerate please refer to the
+ * gst_encoding_video_profile_set_variableframerate() documentation.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the newly created #GstEncodingVideoProfile.
+ */
+GstEncodingVideoProfile *
+gst_encoding_video_profile_new (GstCaps * format, const gchar * preset,
+ GstCaps * restriction, guint presence)
+{
+ return (GstEncodingVideoProfile *)
+ common_creation (GST_TYPE_ENCODING_VIDEO_PROFILE, format, preset, NULL,
+ NULL, restriction, presence);
+}
+
+/**
+ * gst_encoding_audio_profile_new:
+ * @format: the #GstCaps
+ * @preset: the preset(s) to use on the encoder, can be #NULL
+ * @restriction: the #GstCaps used to restrict the input to the encoder, can be
+ * NULL. See gst_encoding_profile_get_restriction() for more details.
+ * @presence: the number of time this stream must be used. 0 means any number of
+ * times (including never)
+ *
+ * Creates a new #GstEncodingAudioProfile
+ *
+ * All provided allocatable arguments will be internally copied, so can be
+ * safely freed/unreferenced after calling this method.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the newly created #GstEncodingAudioProfile.
+ */
+GstEncodingAudioProfile *
+gst_encoding_audio_profile_new (GstCaps * format, const gchar * preset,
+ GstCaps * restriction, guint presence)
+{
+ return (GstEncodingAudioProfile *)
+ common_creation (GST_TYPE_ENCODING_AUDIO_PROFILE, format, preset, NULL,
+ NULL, restriction, presence);
+}
+
+
+/**
+ * gst_encoding_profile_is_equal:
+ * @a: a #GstEncodingProfile
+ * @b: a #GstEncodingProfile
+ *
+ * Checks whether the two #GstEncodingProfile are equal
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if @a and @b are equal, else %FALSE.
+ */
+gboolean
+gst_encoding_profile_is_equal (GstEncodingProfile * a, GstEncodingProfile * b)
+{
+ return (_compare_encoding_profiles (a, b) == 0);
+}
+
+
+/**
+ * gst_encoding_profile_get_input_caps:
+ * @profile: a #GstEncodingProfile
+ *
+ * Computes the full output caps that this @profile will be able to consume.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The full caps the given @profile can consume. Call
+ * gst_caps_unref() when you are done with the caps.
+ */
+GstCaps *
+gst_encoding_profile_get_input_caps (GstEncodingProfile * profile)
+{
+ GstCaps *out, *tmp;
+ GList *ltmp;
+ GstStructure *st, *outst;
+ GQuark out_name;
+ guint i, len;
+ GstCaps *fcaps;
+
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) {
+ GstCaps *res = gst_caps_new_empty ();
+
+ for (ltmp = GST_ENCODING_CONTAINER_PROFILE (profile)->encodingprofiles;
+ ltmp; ltmp = ltmp->next) {
+ GstEncodingProfile *sprof = (GstEncodingProfile *) ltmp->data;
+ gst_caps_merge (res, gst_encoding_profile_get_input_caps (sprof));
+ }
+ return res;
+ }
+
+ fcaps = profile->format;
+
+ /* fast-path */
+ if ((profile->restriction == NULL) || gst_caps_is_any (profile->restriction))
+ return gst_caps_ref (fcaps);
+
+ /* Combine the format with the restriction caps */
+ outst = gst_caps_get_structure (fcaps, 0);
+ out_name = gst_structure_get_name_id (outst);
+ tmp = gst_caps_new_empty ();
+ len = gst_caps_get_size (profile->restriction);
+
+ for (i = 0; i < len; i++) {
+ st = gst_structure_copy (gst_caps_get_structure (profile->restriction, i));
+ st->name = out_name;
+ gst_caps_append_structure (tmp, st);
+ }
+
+ out = gst_caps_intersect (tmp, fcaps);
+ gst_caps_unref (tmp);
+
+ return out;
+}
+
+/**
+ * gst_encoding_profile_get_type_nick:
+ * @profile: a #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ *
+ * Returns: the human-readable name of the type of @profile.
+ */
+const gchar *
+gst_encoding_profile_get_type_nick (GstEncodingProfile * profile)
+{
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (profile))
+ return "container";
+ if (GST_IS_ENCODING_VIDEO_PROFILE (profile))
+ return "video";
+ if (GST_IS_ENCODING_AUDIO_PROFILE (profile))
+ return "audio";
+ return NULL;
+}
+
+/**
+ * gst_encoding_profile_find:
+ * @targetname: (transfer none): The name of the target
+ * @profilename: (transfer none): The name of the profile
+ * @category: (transfer none) (allow-none): The target category. Can be %NULL
+ *
+ * Find the #GstEncodingProfile with the specified name and category.
+ *
+ * Returns: (transfer full): The matching #GstEncodingProfile or %NULL.
+ *
+ * Since: 0.10.32
+ */
+GstEncodingProfile *
+gst_encoding_profile_find (const gchar * targetname, const gchar * profilename,
+ const gchar * category)
+{
+ GstEncodingProfile *res = NULL;
+ GstEncodingTarget *target;
+
+ g_return_val_if_fail (targetname != NULL, NULL);
+ g_return_val_if_fail (profilename != NULL, NULL);
+
+ /* FIXME : how do we handle profiles named the same in several
+ * categories but of which only one has the required profile ? */
+ target = gst_encoding_target_load (targetname, category, NULL);
+ if (target) {
+ res = gst_encoding_target_get_profile (target, profilename);
+ gst_encoding_target_unref (target);
+ }
+
+ return res;
+}
+
+static GstEncodingProfile *
+combo_search (const gchar * pname)
+{
+ GstEncodingProfile *res;
+ gchar **split;
+
+ /* Splitup */
+ split = g_strsplit (pname, "/", 2);
+ if (g_strv_length (split) != 2)
+ return NULL;
+
+ res = gst_encoding_profile_find (split[0], split[1], NULL);
+
+ g_strfreev (split);
+
+ return res;
+}
+
+/* GValue transform function */
+static void
+string_to_profile_transform (const GValue * src_value, GValue * dest_value)
+{
+ const gchar *profilename;
+ GstEncodingProfile *profile;
+
+ profilename = g_value_get_string (src_value);
+
+ profile = combo_search (profilename);
+
+ if (profile)
+ g_value_take_object (dest_value, (GObject *) profile);
+}
+
+static gboolean
+gst_encoding_profile_deserialize_valfunc (GValue * value, const gchar * s)
+{
+ GstEncodingProfile *profile;
+
+ profile = combo_search (s);
+
+ if (profile) {
+ g_value_take_object (value, (GObject *) profile);
+ return TRUE;
+ }
+
+ return FALSE;
+}
diff --git a/gst-libs/gst/pbutils/encoding-profile.h b/gst-libs/gst/pbutils/encoding-profile.h
new file mode 100644
index 0000000..6645436
--- /dev/null
+++ b/gst-libs/gst/pbutils/encoding-profile.h
@@ -0,0 +1,187 @@
+/* GStreamer encoding profiles library
+ * Copyright (C) 2009-2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009-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_PROFILE_H__
+#define __GST_PROFILE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#include <gst/pbutils/pbutils-enumtypes.h>
+
+/**
+ * GstEncodingProfile:
+ *
+ * The opaque base class object for all encoding profiles. This contains generic
+ * information like name, description, format and preset.
+ *
+ * Since: 0.10.32
+ */
+
+#define GST_TYPE_ENCODING_PROFILE \
+ (gst_encoding_profile_get_type ())
+#define GST_ENCODING_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_PROFILE, GstEncodingProfile))
+#define GST_IS_ENCODING_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_PROFILE))
+typedef struct _GstEncodingProfile GstEncodingProfile;
+typedef GObjectClass GstEncodingProfileClass;
+GType gst_encoding_profile_get_type (void);
+
+
+
+/**
+ * GstEncodingContainerProfile:
+ *
+ * Encoding profiles for containers. Keeps track of a list of #GstEncodingProfile
+ *
+ * Since: 0.10.32
+ */
+#define GST_TYPE_ENCODING_CONTAINER_PROFILE \
+ (gst_encoding_container_profile_get_type ())
+#define GST_ENCODING_CONTAINER_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_CONTAINER_PROFILE, GstEncodingContainerProfile))
+#define GST_IS_ENCODING_CONTAINER_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_CONTAINER_PROFILE))
+typedef struct _GstEncodingContainerProfile GstEncodingContainerProfile;
+typedef GstEncodingProfileClass GstEncodingContainerProfileClass;
+GType gst_encoding_container_profile_get_type (void);
+
+
+
+/**
+ * GstEncodingVideoProfile:
+ *
+ * Variant of #GstEncodingProfile for video streams, allows specifying the @pass.
+ *
+ * Since: 0.10.32
+ */
+#define GST_TYPE_ENCODING_VIDEO_PROFILE \
+ (gst_encoding_video_profile_get_type ())
+#define GST_ENCODING_VIDEO_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_VIDEO_PROFILE, GstEncodingVideoProfile))
+#define GST_IS_ENCODING_VIDEO_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_VIDEO_PROFILE))
+typedef struct _GstEncodingVideoProfile GstEncodingVideoProfile;
+typedef GstEncodingProfileClass GstEncodingVideoProfileClass;
+GType gst_encoding_video_profile_get_type (void);
+
+
+
+/**
+ * GstEncodingAudioProfile:
+ *
+ * Variant of #GstEncodingProfile for audio streams.
+ *
+ * Since: 0.10.32
+ */
+#define GST_TYPE_ENCODING_AUDIO_PROFILE \
+ (gst_encoding_audio_profile_get_type ())
+#define GST_ENCODING_AUDIO_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_AUDIO_PROFILE, GstEncodingAudioProfile))
+#define GST_IS_ENCODING_AUDIO_PROFILE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_AUDIO_PROFILE))
+typedef struct _GstEncodingAudioProfile GstEncodingAudioProfile;
+typedef GstEncodingProfileClass GstEncodingAudioProfileClass;
+GType gst_encoding_audio_profile_get_type (void);
+
+
+
+/* GstEncodingProfile API */
+
+/**
+ * gst_encoding_profile_unref:
+ * @profile: a #GstEncodingProfile
+ *
+ * Decreases the reference count of the @profile, possibly freeing the @profile.
+ *
+ * Since: 0.10.32
+ */
+#define gst_encoding_profile_unref(profile) (g_object_unref ((GObject*) profile))
+
+/**
+ * gst_encoding_profile_ref:
+ * @profile: a #GstEncodingProfile
+ *
+ * Increases the reference count of the @profile.
+ *
+ * Since: 0.10.32
+ */
+#define gst_encoding_profile_ref(profile) (g_object_ref ((GObject*) profile))
+
+const gchar * gst_encoding_profile_get_name(GstEncodingProfile *profile);
+const gchar * gst_encoding_profile_get_description(GstEncodingProfile *profile);
+GstCaps * gst_encoding_profile_get_format(GstEncodingProfile *profile);
+const gchar * gst_encoding_profile_get_preset(GstEncodingProfile *profile);
+guint gst_encoding_profile_get_presence(GstEncodingProfile *profile);
+GstCaps * gst_encoding_profile_get_restriction(GstEncodingProfile *profile);
+
+void gst_encoding_profile_set_name(GstEncodingProfile *profile, const gchar *name);
+void gst_encoding_profile_set_description(GstEncodingProfile *profile, const gchar *description);
+void gst_encoding_profile_set_format(GstEncodingProfile *profile, GstCaps *format);
+void gst_encoding_profile_set_preset(GstEncodingProfile *profile, const gchar *preset);
+void gst_encoding_profile_set_restriction(GstEncodingProfile *profile, GstCaps *restriction);
+void gst_encoding_profile_set_presence(GstEncodingProfile *profile, guint presence);
+
+gboolean gst_encoding_profile_is_equal (GstEncodingProfile *a,
+ GstEncodingProfile *b);
+GstCaps * gst_encoding_profile_get_input_caps (GstEncodingProfile *profile);
+
+const gchar *gst_encoding_profile_get_type_nick (GstEncodingProfile *profile);
+
+GstEncodingProfile * gst_encoding_profile_find (const gchar *targetname,
+ const gchar *profilename,
+ const gchar *category);
+
+/* GstEncodingContainerProfile API */
+gboolean gst_encoding_container_profile_add_profile (GstEncodingContainerProfile *container,
+ GstEncodingProfile *profile);
+gboolean gst_encoding_container_profile_contains_profile (GstEncodingContainerProfile * container,
+ GstEncodingProfile *profile);
+const GList *gst_encoding_container_profile_get_profiles (GstEncodingContainerProfile *profile);
+
+
+GstEncodingContainerProfile * gst_encoding_container_profile_new (const gchar *name,
+ const gchar *description,
+ GstCaps *format,
+ const gchar *preset);
+
+
+/* Invidual stream encodingprofile API */
+GstEncodingVideoProfile * gst_encoding_video_profile_new (GstCaps *format,
+ const gchar *preset,
+ GstCaps *restriction,
+ guint presence);
+GstEncodingAudioProfile * gst_encoding_audio_profile_new (GstCaps *format,
+ const gchar *preset,
+ GstCaps *restriction,
+ guint presence);
+
+guint gst_encoding_video_profile_get_pass (GstEncodingVideoProfile *prof);
+gboolean gst_encoding_video_profile_get_variableframerate (GstEncodingVideoProfile *prof);
+
+void gst_encoding_video_profile_set_pass (GstEncodingVideoProfile *prof,
+ guint pass);
+void gst_encoding_video_profile_set_variableframerate (GstEncodingVideoProfile *prof,
+ gboolean variableframerate);
+G_END_DECLS
+
+#endif /* __GST_PROFILE_H__ */
diff --git a/gst-libs/gst/pbutils/encoding-target.c b/gst-libs/gst/pbutils/encoding-target.c
new file mode 100644
index 0000000..860b595
--- /dev/null
+++ b/gst-libs/gst/pbutils/encoding-target.c
@@ -0,0 +1,1208 @@
+/* GStreamer encoding profile registry
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (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 <locale.h>
+#include <string.h>
+#include "encoding-target.h"
+
+/*
+ * File format
+ *
+ * GKeyFile style.
+ *
+ * [GStreamer Encoding Target]
+ * name : <name>
+ * category : <category>
+ * description : <description> #translatable
+ *
+ * [profile-<profile1name>]
+ * name : <name>
+ * description : <description> #optional
+ * format : <format>
+ * preset : <preset>
+ *
+ * [streamprofile-<id>]
+ * parent : <encodingprofile.name>[,<encodingprofile.name>..]
+ * type : <type> # "audio", "video", "text"
+ * format : <format>
+ * preset : <preset>
+ * restriction : <restriction>
+ * presence : <presence>
+ * pass : <pass>
+ * variableframerate : <variableframerate>
+ * */
+
+/*
+ * Location of profile files
+ *
+ * $GST_DATADIR/gstreamer-GST_MAJORMINOR/encoding-profile
+ * $HOME/gstreamer-GST_MAJORMINOR/encoding-profile
+ *
+ * Naming convention
+ * $(target.category)/$(target.name).gep
+ *
+ * Naming restrictions:
+ * lowercase ASCII letter for the first character
+ * Same for all other characters + numerics + hyphens
+ */
+
+
+#define GST_ENCODING_TARGET_HEADER "GStreamer Encoding Target"
+#define GST_ENCODING_TARGET_DIRECTORY "encoding-profiles"
+#define GST_ENCODING_TARGET_SUFFIX ".gep"
+
+struct _GstEncodingTarget
+{
+ GObject parent;
+
+ gchar *name;
+ gchar *category;
+ gchar *description;
+ GList *profiles;
+
+ /*< private > */
+ gchar *keyfile;
+};
+
+G_DEFINE_TYPE (GstEncodingTarget, gst_encoding_target, G_TYPE_OBJECT);
+
+static void
+gst_encoding_target_init (GstEncodingTarget * target)
+{
+ /* Nothing to initialize */
+}
+
+static void
+gst_encoding_target_finalize (GObject * object)
+{
+ GstEncodingTarget *target = (GstEncodingTarget *) object;
+
+ GST_DEBUG ("Finalizing");
+
+ if (target->name)
+ g_free (target->name);
+ if (target->category)
+ g_free (target->category);
+ if (target->description)
+ g_free (target->description);
+
+ g_list_foreach (target->profiles, (GFunc) g_object_unref, NULL);
+ g_list_free (target->profiles);
+}
+
+static void
+gst_encoding_target_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_encoding_target_finalize;
+}
+
+/**
+ * gst_encoding_target_get_name:
+ * @target: a #GstEncodingTarget
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer none): The name of the @target.
+ */
+const gchar *
+gst_encoding_target_get_name (GstEncodingTarget * target)
+{
+ return target->name;
+}
+
+/**
+ * gst_encoding_target_get_category:
+ * @target: a #GstEncodingTarget
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer none): The category of the @target. For example:
+ * #GST_ENCODING_CATEGORY_DEVICE.
+ */
+const gchar *
+gst_encoding_target_get_category (GstEncodingTarget * target)
+{
+ return target->category;
+}
+
+/**
+ * gst_encoding_target_get_description:
+ * @target: a #GstEncodingTarget
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer none): The description of the @target.
+ */
+const gchar *
+gst_encoding_target_get_description (GstEncodingTarget * target)
+{
+ return target->description;
+}
+
+/**
+ * gst_encoding_target_get_profiles:
+ * @target: a #GstEncodingTarget
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer none) (element-type Gst.EncodingProfile): A list of
+ * #GstEncodingProfile(s) this @target handles.
+ */
+const GList *
+gst_encoding_target_get_profiles (GstEncodingTarget * target)
+{
+ return target->profiles;
+}
+
+/**
+ * gst_encoding_target_get_profile:
+ * @target: a #GstEncodingTarget
+ * @name: the name of the profile to retrieve
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The matching #GstEncodingProfile, or %NULL.
+ */
+GstEncodingProfile *
+gst_encoding_target_get_profile (GstEncodingTarget * target, const gchar * name)
+{
+ GList *tmp;
+
+ g_return_val_if_fail (GST_IS_ENCODING_TARGET (target), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ for (tmp = target->profiles; tmp; tmp = tmp->next) {
+ GstEncodingProfile *tprof = (GstEncodingProfile *) tmp->data;
+
+ if (!g_strcmp0 (gst_encoding_profile_get_name (tprof), name)) {
+ gst_encoding_profile_ref (tprof);
+ return tprof;
+ }
+ }
+
+ return NULL;
+}
+
+static inline gboolean
+validate_name (const gchar * name)
+{
+ guint i, len;
+
+ len = strlen (name);
+ if (len == 0)
+ return FALSE;
+
+ /* First character can only be a lower case ASCII character */
+ if (!g_ascii_isalpha (name[0]) || !g_ascii_islower (name[0]))
+ return FALSE;
+
+ /* All following characters can only by:
+ * either a lower case ASCII character
+ * or an hyphen
+ * or a numeric */
+ for (i = 1; i < len; i++) {
+ /* if uppercase ASCII letter, return */
+ if (g_ascii_isupper (name[i]))
+ return FALSE;
+ /* if a digit, continue */
+ if (g_ascii_isdigit (name[i]))
+ continue;
+ /* if an hyphen, continue */
+ if (name[i] == '-')
+ continue;
+ /* remaining should only be ascii letters */
+ if (!g_ascii_isalpha (name[i]))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_encoding_target_new:
+ * @name: The name of the target.
+ * @category: (transfer none): The name of the category to which this @target
+ * belongs. For example: #GST_ENCODING_CATEGORY_DEVICE.
+ * @description: (transfer none): A description of #GstEncodingTarget in the
+ * current locale.
+ * @profiles: (transfer none) (element-type Gst.EncodingProfile): A #GList of
+ * #GstEncodingProfile.
+ *
+ * Creates a new #GstEncodingTarget.
+ *
+ * The name and category can only consist of lowercase ASCII letters for the
+ * first character, followed by either lowercase ASCII letters, digits or
+ * hyphens ('-').
+ *
+ * The @category <emphasis>should</emphasis> be one of the existing
+ * well-defined categories, like #GST_ENCODING_CATEGORY_DEVICE, but it
+ * <emphasis>can</emphasis> be a application or user specific category if
+ * needed.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The newly created #GstEncodingTarget or %NULL if
+ * there was an error.
+ */
+
+GstEncodingTarget *
+gst_encoding_target_new (const gchar * name, const gchar * category,
+ const gchar * description, const GList * profiles)
+{
+ GstEncodingTarget *res;
+
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (category != NULL, NULL);
+ g_return_val_if_fail (description != NULL, NULL);
+
+ /* Validate name */
+ if (!validate_name (name))
+ goto invalid_name;
+ if (!validate_name (category))
+ goto invalid_category;
+
+ res = (GstEncodingTarget *) g_object_new (GST_TYPE_ENCODING_TARGET, NULL);
+ res->name = g_strdup (name);
+ res->category = g_strdup (category);
+ res->description = g_strdup (description);
+
+ while (profiles) {
+ GstEncodingProfile *prof = (GstEncodingProfile *) profiles->data;
+
+ res->profiles =
+ g_list_append (res->profiles, gst_encoding_profile_ref (prof));
+ profiles = profiles->next;
+ }
+
+ return res;
+
+invalid_name:
+ {
+ GST_ERROR ("Invalid name for encoding target : '%s'", name);
+ return NULL;
+ }
+
+invalid_category:
+ {
+ GST_ERROR ("Invalid name for encoding category : '%s'", category);
+ return NULL;
+ }
+}
+
+/**
+ * gst_encoding_target_add_profile:
+ * @target: the #GstEncodingTarget to add a profile to
+ * @profile: (transfer full): the #GstEncodingProfile to add
+ *
+ * Adds the given @profile to the @target. Each added profile must have
+ * a unique name within the profile.
+ *
+ * The @target will steal a reference to the @profile. If you wish to use
+ * the profile after calling this method, you should increase its reference
+ * count.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if the profile was added, else %FALSE.
+ **/
+
+gboolean
+gst_encoding_target_add_profile (GstEncodingTarget * target,
+ GstEncodingProfile * profile)
+{
+ GList *tmp;
+
+ g_return_val_if_fail (GST_IS_ENCODING_TARGET (target), FALSE);
+ g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE);
+
+ /* Make sure profile isn't already controlled by this target */
+ for (tmp = target->profiles; tmp; tmp = tmp->next) {
+ GstEncodingProfile *prof = (GstEncodingProfile *) tmp->data;
+
+ if (!g_strcmp0 (gst_encoding_profile_get_name (profile),
+ gst_encoding_profile_get_name (prof))) {
+ GST_WARNING ("Profile already present in target");
+ return FALSE;
+ }
+ }
+
+ target->profiles = g_list_append (target->profiles, profile);
+
+ return TRUE;
+}
+
+static gboolean
+serialize_stream_profiles (GKeyFile * out, GstEncodingProfile * sprof,
+ const gchar * profilename, guint id)
+{
+ gchar *sprofgroupname;
+ gchar *tmpc;
+ const GstCaps *format, *restriction;
+ const gchar *preset, *name, *description;
+
+ sprofgroupname = g_strdup_printf ("streamprofile-%s-%d", profilename, id);
+
+ /* Write the parent profile */
+ g_key_file_set_value (out, sprofgroupname, "parent", profilename);
+
+ g_key_file_set_value (out, sprofgroupname, "type",
+ gst_encoding_profile_get_type_nick (sprof));
+
+ format = gst_encoding_profile_get_format (sprof);
+ if (format) {
+ tmpc = gst_caps_to_string (format);
+ g_key_file_set_value (out, sprofgroupname, "format", tmpc);
+ g_free (tmpc);
+ }
+
+ name = gst_encoding_profile_get_name (sprof);
+ if (name)
+ g_key_file_set_string (out, sprofgroupname, "name", name);
+
+ description = gst_encoding_profile_get_description (sprof);
+ if (description)
+ g_key_file_set_string (out, sprofgroupname, "description", description);
+
+ preset = gst_encoding_profile_get_preset (sprof);
+ if (preset)
+ g_key_file_set_string (out, sprofgroupname, "preset", preset);
+
+ restriction = gst_encoding_profile_get_restriction (sprof);
+ if (restriction) {
+ tmpc = gst_caps_to_string (restriction);
+ g_key_file_set_value (out, sprofgroupname, "restriction", tmpc);
+ g_free (tmpc);
+ }
+ g_key_file_set_integer (out, sprofgroupname, "presence",
+ gst_encoding_profile_get_presence (sprof));
+
+ if (GST_IS_ENCODING_VIDEO_PROFILE (sprof)) {
+ GstEncodingVideoProfile *vp = (GstEncodingVideoProfile *) sprof;
+
+ g_key_file_set_integer (out, sprofgroupname, "pass",
+ gst_encoding_video_profile_get_pass (vp));
+ g_key_file_set_boolean (out, sprofgroupname, "variableframerate",
+ gst_encoding_video_profile_get_variableframerate (vp));
+ }
+
+ g_free (sprofgroupname);
+ return TRUE;
+}
+
+static gchar *
+get_locale (void)
+{
+ const char *loc = NULL;
+ gchar *ret;
+
+#ifdef ENABLE_NLS
+#if defined(LC_MESSAGES)
+ loc = setlocale (LC_MESSAGES, NULL);
+ GST_LOG ("LC_MESSAGES: %s", GST_STR_NULL (loc));
+#elif defined(LC_ALL)
+ loc = setlocale (LC_ALL, NULL);
+ GST_LOG ("LC_ALL: %s", GST_STR_NULL (loc));
+#else
+ GST_LOG ("Neither LC_ALL nor LC_MESSAGES defined");
+#endif
+#else /* !ENABLE_NLS */
+ GST_LOG ("i18n disabled");
+#endif
+
+ if (loc == NULL || g_ascii_strncasecmp (loc, "en", 2) == 0)
+ return NULL;
+
+ /* en_GB.UTF-8 => en */
+ ret = g_ascii_strdown (loc, -1);
+ ret = g_strcanon (ret, "abcdefghijklmnopqrstuvwxyz", '\0');
+ GST_LOG ("using locale: %s", ret);
+ return ret;
+}
+
+/* Serialize the top-level profiles
+ * Note: They don't have to be containerprofiles */
+static gboolean
+serialize_encoding_profile (GKeyFile * out, GstEncodingProfile * prof)
+{
+ gchar *profgroupname;
+ const GList *tmp;
+ guint i;
+ const gchar *profname, *profdesc, *profpreset, *proftype;
+ const GstCaps *profformat;
+
+ profname = gst_encoding_profile_get_name (prof);
+ profdesc = gst_encoding_profile_get_description (prof);
+ profformat = gst_encoding_profile_get_format (prof);
+ profpreset = gst_encoding_profile_get_preset (prof);
+ proftype = gst_encoding_profile_get_type_nick (prof);
+
+ profgroupname = g_strdup_printf ("profile-%s", profname);
+
+ g_key_file_set_string (out, profgroupname, "name", profname);
+
+ g_key_file_set_value (out, profgroupname, "type", proftype);
+
+ if (profdesc) {
+ gchar *locale;
+
+ locale = get_locale ();
+ if (locale != NULL) {
+ g_key_file_set_locale_string (out, profgroupname, "description",
+ locale, profdesc);
+ g_free (locale);
+ } else {
+ g_key_file_set_string (out, profgroupname, "description", profdesc);
+ }
+ }
+ if (profformat) {
+ gchar *tmpc = gst_caps_to_string (profformat);
+ g_key_file_set_string (out, profgroupname, "format", tmpc);
+ g_free (tmpc);
+ }
+ if (profpreset)
+ g_key_file_set_string (out, profgroupname, "preset", profpreset);
+
+ /* stream profiles */
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (prof)) {
+ for (tmp =
+ gst_encoding_container_profile_get_profiles
+ (GST_ENCODING_CONTAINER_PROFILE (prof)), i = 0; tmp;
+ tmp = tmp->next, i++) {
+ GstEncodingProfile *sprof = (GstEncodingProfile *) tmp->data;
+
+ if (!serialize_stream_profiles (out, sprof, profname, i))
+ return FALSE;
+ }
+ }
+ g_free (profgroupname);
+ return TRUE;
+}
+
+static gboolean
+serialize_target (GKeyFile * out, GstEncodingTarget * target)
+{
+ GList *tmp;
+
+ g_key_file_set_string (out, GST_ENCODING_TARGET_HEADER, "name", target->name);
+ g_key_file_set_string (out, GST_ENCODING_TARGET_HEADER, "category",
+ target->category);
+ g_key_file_set_string (out, GST_ENCODING_TARGET_HEADER, "description",
+ target->description);
+
+ for (tmp = target->profiles; tmp; tmp = tmp->next) {
+ GstEncodingProfile *prof = (GstEncodingProfile *) tmp->data;
+ if (!serialize_encoding_profile (out, prof))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * parse_encoding_profile:
+ * @in: a #GKeyFile
+ * @parentprofilename: the parent profile name (including 'profile-' or 'streamprofile-' header)
+ * @profilename: the profile name group to parse
+ * @nbgroups: the number of top-level groups
+ * @groups: the top-level groups
+ */
+static GstEncodingProfile *
+parse_encoding_profile (GKeyFile * in, gchar * parentprofilename,
+ gchar * profilename, gsize nbgroups, gchar ** groups)
+{
+ GstEncodingProfile *sprof = NULL;
+ gchar **parent;
+ gchar *proftype, *format, *preset, *restriction, *pname, *description;
+ GstCaps *formatcaps = NULL;
+ GstCaps *restrictioncaps = NULL;
+ gboolean variableframerate;
+ gint pass, presence;
+ gsize i, nbencprofiles;
+
+ GST_DEBUG ("parentprofilename : %s , profilename : %s",
+ parentprofilename, profilename);
+
+ if (parentprofilename) {
+ gboolean found = FALSE;
+
+ parent =
+ g_key_file_get_string_list (in, profilename, "parent",
+ &nbencprofiles, NULL);
+ if (!parent || !nbencprofiles) {
+ return NULL;
+ }
+
+ /* Check if this streamprofile is used in <profilename> */
+ for (i = 0; i < nbencprofiles; i++) {
+ if (!g_strcmp0 (parent[i], parentprofilename)) {
+ found = TRUE;
+ break;
+ }
+ }
+ g_strfreev (parent);
+
+ if (!found) {
+ GST_DEBUG ("Stream profile '%s' isn't used in profile '%s'",
+ profilename, parentprofilename);
+ return NULL;
+ }
+ }
+
+ pname = g_key_file_get_value (in, profilename, "name", NULL);
+
+ /* First try to get localized description */
+ {
+ gchar *locale;
+
+ locale = get_locale ();
+ if (locale != NULL) {
+ /* will try to fall back to untranslated string if no translation found */
+ description = g_key_file_get_locale_string (in, profilename,
+ "description", locale, NULL);
+ g_free (locale);
+ } else {
+ description =
+ g_key_file_get_string (in, profilename, "description", NULL);
+ }
+ }
+
+ /* Note: a missing description is normal for non-container profiles */
+ if (description == NULL) {
+ GST_LOG ("Missing 'description' field for streamprofile %s", profilename);
+ }
+
+ /* Parse the remaining fields */
+ proftype = g_key_file_get_value (in, profilename, "type", NULL);
+ if (!proftype) {
+ GST_WARNING ("Missing 'type' field for streamprofile %s", profilename);
+ return NULL;
+ }
+
+ format = g_key_file_get_value (in, profilename, "format", NULL);
+ if (format) {
+ formatcaps = gst_caps_from_string (format);
+ g_free (format);
+ }
+
+ preset = g_key_file_get_value (in, profilename, "preset", NULL);
+
+ restriction = g_key_file_get_value (in, profilename, "restriction", NULL);
+ if (restriction) {
+ restrictioncaps = gst_caps_from_string (restriction);
+ g_free (restriction);
+ }
+
+ presence = g_key_file_get_integer (in, profilename, "presence", NULL);
+ pass = g_key_file_get_integer (in, profilename, "pass", NULL);
+ variableframerate =
+ g_key_file_get_boolean (in, profilename, "variableframerate", NULL);
+
+ /* Build the streamprofile ! */
+ if (!g_strcmp0 (proftype, "container")) {
+ GstEncodingProfile *pprof;
+
+ sprof =
+ (GstEncodingProfile *) gst_encoding_container_profile_new (pname,
+ description, formatcaps, preset);
+ /* Now look for the stream profiles */
+ for (i = 0; i < nbgroups; i++) {
+ if (!g_ascii_strncasecmp (groups[i], "streamprofile-", 13)) {
+ pprof = parse_encoding_profile (in, pname, groups[i], nbgroups, groups);
+ if (pprof) {
+ gst_encoding_container_profile_add_profile (
+ (GstEncodingContainerProfile *) sprof, pprof);
+ }
+ }
+ }
+ } else if (!g_strcmp0 (proftype, "video")) {
+ sprof =
+ (GstEncodingProfile *) gst_encoding_video_profile_new (formatcaps,
+ preset, restrictioncaps, presence);
+ gst_encoding_video_profile_set_variableframerate ((GstEncodingVideoProfile
+ *) sprof, variableframerate);
+ gst_encoding_video_profile_set_pass ((GstEncodingVideoProfile *) sprof,
+ pass);
+ gst_encoding_profile_set_name (sprof, pname);
+ gst_encoding_profile_set_description (sprof, description);
+ } else if (!g_strcmp0 (proftype, "audio")) {
+ sprof =
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (formatcaps,
+ preset, restrictioncaps, presence);
+ gst_encoding_profile_set_name (sprof, pname);
+ gst_encoding_profile_set_description (sprof, description);
+ } else
+ GST_ERROR ("Unknown profile format '%s'", proftype);
+
+ if (restrictioncaps)
+ gst_caps_unref (restrictioncaps);
+ if (formatcaps)
+ gst_caps_unref (formatcaps);
+
+ if (pname)
+ g_free (pname);
+ if (description)
+ g_free (description);
+ if (preset)
+ g_free (preset);
+ if (proftype)
+ g_free (proftype);
+
+ return sprof;
+}
+
+static GstEncodingTarget *
+parse_keyfile (GKeyFile * in, gchar * targetname, gchar * categoryname,
+ gchar * description)
+{
+ GstEncodingTarget *res = NULL;
+ GstEncodingProfile *prof;
+ gchar **groups;
+ gsize i, nbgroups;
+
+ res = gst_encoding_target_new (targetname, categoryname, description, NULL);
+
+ /* Figure out the various profiles */
+ groups = g_key_file_get_groups (in, &nbgroups);
+ for (i = 0; i < nbgroups; i++) {
+ if (!g_ascii_strncasecmp (groups[i], "profile-", 8)) {
+ prof = parse_encoding_profile (in, NULL, groups[i], nbgroups, groups);
+ if (prof)
+ gst_encoding_target_add_profile (res, prof);
+ }
+ }
+
+ g_strfreev (groups);
+
+ if (targetname)
+ g_free (targetname);
+ if (categoryname)
+ g_free (categoryname);
+ if (description)
+ g_free (description);
+
+ return res;
+}
+
+static GKeyFile *
+load_file_and_read_header (const gchar * path, gchar ** targetname,
+ gchar ** categoryname, gchar ** description, GError ** error)
+{
+ GKeyFile *in;
+ gboolean res;
+ GError *key_error = NULL;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ in = g_key_file_new ();
+
+ GST_DEBUG ("path:%s", path);
+
+ res =
+ g_key_file_load_from_file (in, path,
+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &key_error);
+ if (!res || key_error != NULL)
+ goto load_error;
+
+ key_error = NULL;
+ *targetname =
+ g_key_file_get_value (in, GST_ENCODING_TARGET_HEADER, "name", &key_error);
+ if (!*targetname)
+ goto empty_name;
+
+ *categoryname =
+ g_key_file_get_value (in, GST_ENCODING_TARGET_HEADER, "category", NULL);
+ *description =
+ g_key_file_get_value (in, GST_ENCODING_TARGET_HEADER, "description",
+ NULL);
+
+ return in;
+
+load_error:
+ {
+ GST_WARNING ("Unable to read GstEncodingTarget file %s: %s",
+ path, key_error->message);
+ g_propagate_error (error, key_error);
+ g_key_file_free (in);
+ return NULL;
+ }
+
+empty_name:
+ {
+ GST_WARNING ("Wrong header in file %s: %s", path, key_error->message);
+ g_propagate_error (error, key_error);
+ g_key_file_free (in);
+ return NULL;
+ }
+}
+
+/**
+ * gst_encoding_target_load_from_file:
+ * @filepath: The file location to load the #GstEncodingTarget from
+ * @error: If an error occured, this field will be filled in.
+ *
+ * Opens the provided file and returns the contained #GstEncodingTarget.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The #GstEncodingTarget contained in the file, else
+ * %NULL
+ */
+
+GstEncodingTarget *
+gst_encoding_target_load_from_file (const gchar * filepath, GError ** error)
+{
+ GKeyFile *in;
+ gchar *targetname, *categoryname, *description;
+ GstEncodingTarget *res = NULL;
+
+ in = load_file_and_read_header (filepath, &targetname, &categoryname,
+ &description, error);
+ if (!in)
+ goto beach;
+
+ res = parse_keyfile (in, targetname, categoryname, description);
+
+ g_key_file_free (in);
+
+beach:
+ return res;
+}
+
+/*
+ * returned list contents must be freed
+ */
+static GList *
+get_matching_filenames (gchar * path, gchar * filename)
+{
+ GList *res = NULL;
+ GDir *topdir;
+ const gchar *subdirname;
+
+ topdir = g_dir_open (path, 0, NULL);
+ if (G_UNLIKELY (topdir == NULL))
+ return NULL;
+
+ while ((subdirname = g_dir_read_name (topdir))) {
+ gchar *ltmp = g_build_filename (path, subdirname, NULL);
+
+ if (g_file_test (ltmp, G_FILE_TEST_IS_DIR)) {
+ gchar *tmp = g_build_filename (path, subdirname, filename, NULL);
+ /* Test to see if we have a file named like that in that directory */
+ if (g_file_test (tmp, G_FILE_TEST_EXISTS))
+ res = g_list_append (res, tmp);
+ else
+ g_free (tmp);
+ }
+ g_free (ltmp);
+ }
+
+ g_dir_close (topdir);
+
+ return res;
+}
+
+static GstEncodingTarget *
+gst_encoding_target_subload (gchar * path, const gchar * category,
+ gchar * lfilename, GError ** error)
+{
+ GstEncodingTarget *target = NULL;
+
+ if (category) {
+ gchar *filename;
+
+ filename = g_build_filename (path, category, lfilename, NULL);
+ target = gst_encoding_target_load_from_file (filename, error);
+ g_free (filename);
+ } else {
+ GList *tmp, *tries = get_matching_filenames (path, lfilename);
+
+ /* Try to find a file named %s.gstprofile in any subdirectories */
+ for (tmp = tries; tmp; tmp = tmp->next) {
+ target = gst_encoding_target_load_from_file ((gchar *) tmp->data, NULL);
+ if (target)
+ break;
+ }
+ g_list_foreach (tries, (GFunc) g_free, NULL);
+ if (tries)
+ g_list_free (tries);
+ }
+
+ return target;
+}
+
+/**
+ * gst_encoding_target_load:
+ * @name: the name of the #GstEncodingTarget to load.
+ * @category: (allow-none): the name of the target category, like
+ * #GST_ENCODING_CATEGORY_DEVICE. Can be %NULL
+ * @error: If an error occured, this field will be filled in.
+ *
+ * Searches for the #GstEncodingTarget with the given name, loads it
+ * and returns it.
+ *
+ * If the category name is specified only targets from that category will be
+ * searched for.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: (transfer full): The #GstEncodingTarget if available, else %NULL.
+ */
+GstEncodingTarget *
+gst_encoding_target_load (const gchar * name, const gchar * category,
+ GError ** error)
+{
+ gchar *lfilename, *tldir;
+ GstEncodingTarget *target = NULL;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ if (!validate_name (name))
+ goto invalid_name;
+
+ if (category && !validate_name (category))
+ goto invalid_category;
+
+ lfilename = g_strdup_printf ("%s" GST_ENCODING_TARGET_SUFFIX, name);
+
+ /* Try from local profiles */
+ tldir =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ target = gst_encoding_target_subload (tldir, category, lfilename, error);
+ g_free (tldir);
+
+ if (target == NULL) {
+ /* Try from system-wide profiles */
+ tldir =
+ g_build_filename (GST_DATADIR, "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ target = gst_encoding_target_subload (tldir, category, lfilename, error);
+ g_free (tldir);
+ }
+
+ g_free (lfilename);
+
+ return target;
+
+invalid_name:
+ {
+ GST_ERROR ("Invalid name for encoding target : '%s'", name);
+ return NULL;
+ }
+invalid_category:
+ {
+ GST_ERROR ("Invalid name for encoding category : '%s'", category);
+ return NULL;
+ }
+}
+
+/**
+ * gst_encoding_target_save_to_file:
+ * @target: a #GstEncodingTarget
+ * @filepath: the location to store the @target at.
+ * @error: If an error occured, this field will be filled in.
+ *
+ * Saves the @target to the provided file location.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if the target was correctly saved, else %FALSE.
+ **/
+
+gboolean
+gst_encoding_target_save_to_file (GstEncodingTarget * target,
+ const gchar * filepath, GError ** error)
+{
+ GKeyFile *out;
+ gchar *data;
+ gsize data_size;
+
+ g_return_val_if_fail (GST_IS_ENCODING_TARGET (target), FALSE);
+ g_return_val_if_fail (filepath != NULL, FALSE);
+
+ /* FIXME : Check filepath is valid and writable
+ * FIXME : Strip out profiles already present in system target */
+
+ /* Get unique name... */
+
+ /* Create output GKeyFile */
+ out = g_key_file_new ();
+
+ if (!serialize_target (out, target))
+ goto serialize_failure;
+
+ if (!(data = g_key_file_to_data (out, &data_size, error)))
+ goto convert_failed;
+
+ if (!g_file_set_contents (filepath, data, data_size, error))
+ goto write_failed;
+
+ g_key_file_free (out);
+ g_free (data);
+
+ return TRUE;
+
+serialize_failure:
+ {
+ GST_ERROR ("Failure serializing target");
+ g_key_file_free (out);
+ return FALSE;
+ }
+
+convert_failed:
+ {
+ GST_ERROR ("Failure converting keyfile: %s", (*error)->message);
+ g_key_file_free (out);
+ g_free (data);
+ return FALSE;
+ }
+
+write_failed:
+ {
+ GST_ERROR ("Unable to write file %s: %s", filepath, (*error)->message);
+ g_key_file_free (out);
+ g_free (data);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_encoding_target_save:
+ * @target: a #GstEncodingTarget
+ * @error: If an error occured, this field will be filled in.
+ *
+ * Saves the @target to a default user-local directory.
+ *
+ * Since: 0.10.32
+ *
+ * Returns: %TRUE if the target was correctly saved, else %FALSE.
+ **/
+
+gboolean
+gst_encoding_target_save (GstEncodingTarget * target, GError ** error)
+{
+ gchar *filename;
+ gchar *lfilename;
+
+ g_return_val_if_fail (GST_IS_ENCODING_TARGET (target), FALSE);
+ g_return_val_if_fail (target->category != NULL, FALSE);
+
+ lfilename = g_strdup_printf ("%s" GST_ENCODING_TARGET_SUFFIX, target->name);
+ filename =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, target->category, lfilename, NULL);
+ g_free (lfilename);
+
+ gst_encoding_target_save_to_file (target, filename, error);
+ g_free (filename);
+
+ return TRUE;
+}
+
+static GList *
+get_categories (gchar * path)
+{
+ GList *res = NULL;
+ GDir *topdir;
+ const gchar *subdirname;
+
+ topdir = g_dir_open (path, 0, NULL);
+ if (G_UNLIKELY (topdir == NULL))
+ return NULL;
+
+ while ((subdirname = g_dir_read_name (topdir))) {
+ gchar *ltmp = g_build_filename (path, subdirname, NULL);
+
+ if (g_file_test (ltmp, G_FILE_TEST_IS_DIR)) {
+ res = g_list_append (res, (gpointer) g_strdup (subdirname));
+ }
+ g_free (ltmp);
+ }
+
+ g_dir_close (topdir);
+
+ return res;
+}
+
+/**
+ * gst_encoding_list_available_categories:
+ *
+ * Lists all #GstEncodingTarget categories present on disk.
+ *
+ * Returns: (transfer full) (element-type gchar*): A list
+ * of #GstEncodingTarget categories.
+ *
+ * Since: 0.10.32
+ */
+GList *
+gst_encoding_list_available_categories (void)
+{
+ GList *res = NULL;
+ GList *tmp1, *tmp2;
+ gchar *topdir;
+
+ /* First try user-local categories */
+ topdir =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ res = get_categories (topdir);
+ g_free (topdir);
+
+ /* Extend with system-wide categories */
+ topdir = g_build_filename (GST_DATADIR, "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ tmp1 = get_categories (topdir);
+ g_free (topdir);
+
+ for (tmp2 = tmp1; tmp2; tmp2 = tmp2->next) {
+ gchar *name = (gchar *) tmp2->data;
+ if (!g_list_find_custom (res, name, (GCompareFunc) g_strcmp0))
+ res = g_list_append (res, (gpointer) name);
+ else
+ g_free (name);
+ }
+ g_free (tmp1);
+
+ return res;
+}
+
+static inline GList *
+sub_get_all_targets (gchar * subdir)
+{
+ GList *res = NULL;
+ const gchar *filename;
+ GDir *dir;
+ GstEncodingTarget *target;
+
+ dir = g_dir_open (subdir, 0, NULL);
+ if (G_UNLIKELY (dir == NULL))
+ return NULL;
+
+ while ((filename = g_dir_read_name (dir))) {
+ gchar *fullname;
+
+ /* Only try files ending with .gstprofile */
+ if (!g_str_has_suffix (filename, GST_ENCODING_TARGET_SUFFIX))
+ continue;
+
+ fullname = g_build_filename (subdir, filename, NULL);
+ target = gst_encoding_target_load_from_file (fullname, NULL);
+ if (target) {
+ res = g_list_append (res, target);
+ } else
+ GST_WARNING ("Failed to get a target from %s", fullname);
+ g_free (fullname);
+ }
+ g_dir_close (dir);
+
+ return res;
+}
+
+static inline GList *
+get_all_targets (gchar * topdir, const gchar * categoryname)
+{
+ GList *res = NULL;
+
+ if (categoryname) {
+ gchar *subdir = g_build_filename (topdir, categoryname, NULL);
+ /* Try to open the directory */
+ res = sub_get_all_targets (subdir);
+ g_free (subdir);
+ } else {
+ const gchar *subdirname;
+ GDir *dir = g_dir_open (topdir, 0, NULL);
+
+ if (G_UNLIKELY (dir == NULL))
+ return NULL;
+
+ while ((subdirname = g_dir_read_name (dir))) {
+ gchar *ltmp = g_build_filename (topdir, subdirname, NULL);
+
+ if (g_file_test (ltmp, G_FILE_TEST_IS_DIR)) {
+ res = g_list_concat (res, sub_get_all_targets (ltmp));
+ }
+ g_free (ltmp);
+ }
+ g_dir_close (dir);
+ }
+
+ return res;
+}
+
+static guint
+compare_targets (const GstEncodingTarget * ta, const GstEncodingTarget * tb)
+{
+ if (!g_strcmp0 (ta->name, tb->name)
+ && !g_strcmp0 (ta->category, tb->category))
+ return -1;
+
+ return 0;
+}
+
+/**
+ * gst_encoding_list_all_targets:
+ * @categoryname: (allow-none): The category, for ex: #GST_ENCODING_CATEGORY_DEVICE.
+ * Can be %NULL.
+ *
+ * List all available #GstEncodingTarget for the specified category, or all categories
+ * if @categoryname is %NULL.
+ *
+ * Returns: (transfer full) (element-type GstEncodingTarget): The list of #GstEncodingTarget
+ *
+ * Since: 0.10.32
+ */
+GList *
+gst_encoding_list_all_targets (const gchar * categoryname)
+{
+ GList *res;
+ GList *tmp1, *tmp2;
+ gchar *topdir;
+
+ /* Get user-locals */
+ topdir =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ res = get_all_targets (topdir, categoryname);
+ g_free (topdir);
+
+ /* Get system-wide */
+ topdir = g_build_filename (GST_DATADIR, "gstreamer-" GST_MAJORMINOR,
+ GST_ENCODING_TARGET_DIRECTORY, NULL);
+ tmp1 = get_all_targets (topdir, categoryname);
+ g_free (topdir);
+
+ /* Merge system-wide targets */
+ /* FIXME : We should merge the system-wide profiles into the user-locals
+ * instead of stopping at identical target names */
+ for (tmp2 = tmp1; tmp2; tmp2 = tmp2->next) {
+ GstEncodingTarget *target = (GstEncodingTarget *) tmp2->data;
+ if (g_list_find_custom (res, target, (GCompareFunc) compare_targets))
+ gst_encoding_target_unref (target);
+ else
+ res = g_list_append (res, target);
+ }
+ g_list_free (tmp1);
+
+ return res;
+}
diff --git a/gst-libs/gst/pbutils/encoding-target.h b/gst-libs/gst/pbutils/encoding-target.h
new file mode 100644
index 0000000..4dcf598
--- /dev/null
+++ b/gst-libs/gst/pbutils/encoding-target.h
@@ -0,0 +1,147 @@
+/* GStreamer encoding profile registry
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (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_PROFILE_REGISTRY_H__
+#define __GST_PROFILE_REGISTRY_H__
+
+#include <gst/pbutils/encoding-profile.h>
+
+G_BEGIN_DECLS
+
+
+/* FIXME/UNKNOWNS
+ *
+ * Should encoding categories be well-known strings/quarks ?
+ *
+ */
+
+/**
+ * GST_ENCODING_CATEGORY_DEVICE:
+ *
+ * #GstEncodingTarget category for device-specific targets.
+ * The name of the target will usually be the contructor and model of the device,
+ * and that target will contain #GstEncodingProfiles suitable for that device.
+ */
+#define GST_ENCODING_CATEGORY_DEVICE "device"
+
+/**
+ * GST_ENCODING_CATEGORY_ONLINE_SERVICE:
+ *
+ * #GstEncodingTarget category for online-services.
+ * The name of the target will usually be the name of the online service
+ * and that target will contain #GstEncodingProfiles suitable for that online
+ * service.
+ */
+
+#define GST_ENCODING_CATEGORY_ONLINE_SERVICE "online-service"
+
+/**
+ * GST_ENCODING_CATEGORY_STORAGE_EDITING:
+ *
+ * #GstEncodingTarget category for storage, archiving and editing targets.
+ * Those targets can be lossless and/or provide very fast random access content.
+ * The name of the target will usually be the container type or editing target,
+ * and that target will contain #GstEncodingProfiles suitable for editing or
+ * storage.
+ */
+#define GST_ENCODING_CATEGORY_STORAGE_EDITING "storage-editing"
+
+/**
+ * GST_ENCODING_CATEGORY_CAPTURE:
+ *
+ * #GstEncodingTarget category for recording and capture.
+ * Targets within this category are optimized for low latency encoding.
+ */
+#define GST_ENCODING_CATEGORY_CAPTURE "capture"
+
+/**
+ * GstEncodingTarget:
+ *
+ * Collection of #GstEncodingProfile for a specific target or use-case.
+ *
+ * When being stored/loaded, targets come from a specific category, like
+ * #GST_ENCODING_CATEGORY_DEVICE.
+ *
+ * Since: 0.10.32
+ */
+#define GST_TYPE_ENCODING_TARGET \
+ (gst_encoding_target_get_type ())
+#define GST_ENCODING_TARGET(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_TARGET, GstEncodingTarget))
+#define GST_IS_ENCODING_TARGET(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_TARGET))
+
+typedef struct _GstEncodingTarget GstEncodingTarget;
+typedef GObjectClass GstEncodingTargetClass;
+
+GType gst_encoding_target_get_type (void);
+
+/**
+ * gst_encoding_target_unref:
+ * @target: a #GstEncodingTarget
+ *
+ * Decreases the reference count of the @target, possibly freeing it.
+ *
+ * Since: 0.10.32
+ */
+#define gst_encoding_target_unref(target) \
+ (g_object_unref ((GObject*) target))
+
+/**
+ * gst_encoding_target_ref:
+ * @target: a #GstEncodingTarget
+ *
+ * Increases the reference count of the @target.
+ *
+ * Since: 0.10.32
+ */
+#define gst_encoding_target_ref(target) \
+ (g_object_ref ((GObject*) target))
+
+GstEncodingTarget *
+gst_encoding_target_new (const gchar *name, const gchar *category,
+ const gchar *description, const GList *profiles);
+const gchar *gst_encoding_target_get_name (GstEncodingTarget *target);
+const gchar *gst_encoding_target_get_category (GstEncodingTarget *target);
+const gchar *gst_encoding_target_get_description (GstEncodingTarget *target);
+const GList *gst_encoding_target_get_profiles (GstEncodingTarget *target);
+GstEncodingProfile *gst_encoding_target_get_profile (GstEncodingTarget *target,
+ const gchar *name);
+
+gboolean
+gst_encoding_target_add_profile (GstEncodingTarget *target, GstEncodingProfile *profile);
+
+gboolean gst_encoding_target_save (GstEncodingTarget *target,
+ GError **error);
+gboolean gst_encoding_target_save_to_file (GstEncodingTarget *target,
+ const gchar *filepath,
+ GError **error);
+GstEncodingTarget *gst_encoding_target_load (const gchar *name,
+ const gchar *category,
+ GError **error);
+GstEncodingTarget *gst_encoding_target_load_from_file (const gchar *filepath,
+ GError **error);
+
+GList *gst_encoding_list_available_categories (void);
+GList *gst_encoding_list_all_targets (const gchar * categoryname);
+
+G_END_DECLS
+
+#endif /* __GST_PROFILE_REGISTRY_H__ */
diff --git a/gst-libs/gst/pbutils/gstdiscoverer-types.c b/gst-libs/gst/pbutils/gstdiscoverer-types.c
new file mode 100644
index 0000000..f96b633
--- /dev/null
+++ b/gst-libs/gst/pbutils/gstdiscoverer-types.c
@@ -0,0 +1,1090 @@
+/* GStreamer
+ * Copyright (C) 2010 Collabora Multimedia
+ * 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 "pbutils.h"
+#include "pbutils-private.h"
+
+static GstDiscovererStreamInfo
+ * gst_discoverer_info_copy_int (GstDiscovererStreamInfo * info,
+ GHashTable * stream_map);
+
+static GstDiscovererContainerInfo
+ * gst_stream_container_info_copy_int (GstDiscovererContainerInfo * ptr,
+ GHashTable * stream_map);
+
+static GstDiscovererAudioInfo
+ * gst_discoverer_audio_info_copy_int (GstDiscovererAudioInfo * ptr);
+
+static GstDiscovererVideoInfo
+ * gst_discoverer_video_info_copy_int (GstDiscovererVideoInfo * ptr);
+
+static GstDiscovererSubtitleInfo
+ * gst_discoverer_subtitle_info_copy_int (GstDiscovererSubtitleInfo * ptr);
+
+/* Per-stream information */
+
+G_DEFINE_TYPE (GstDiscovererStreamInfo, gst_discoverer_stream_info,
+ G_TYPE_OBJECT);
+
+static void
+gst_discoverer_stream_info_init (GstDiscovererStreamInfo * info)
+{
+ /* Nothing needs initialization */
+}
+
+static void
+gst_discoverer_stream_info_finalize (GObject * object)
+{
+ GstDiscovererStreamInfo *info = (GstDiscovererStreamInfo *) object;
+
+ if (info->next)
+ g_object_unref ((GObject *) info->next);
+
+ if (info->caps)
+ gst_caps_unref (info->caps);
+
+ if (info->tags)
+ gst_tag_list_free (info->tags);
+
+ if (info->misc)
+ gst_structure_free (info->misc);
+}
+
+static void
+gst_discoverer_stream_info_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_discoverer_stream_info_finalize;
+}
+
+static GstDiscovererStreamInfo *
+gst_discoverer_stream_info_new (void)
+{
+ return (GstDiscovererStreamInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_STREAM_INFO, NULL);
+}
+
+static GstDiscovererStreamInfo *
+gst_discoverer_info_copy_int (GstDiscovererStreamInfo * info,
+ GHashTable * stream_map)
+{
+ GstDiscovererStreamInfo *ret;
+ GType ltyp;
+
+ g_return_val_if_fail (info != NULL, NULL);
+
+ ltyp = G_TYPE_FROM_INSTANCE (info);
+
+ if (ltyp == GST_TYPE_DISCOVERER_CONTAINER_INFO) {
+ ret = (GstDiscovererStreamInfo *)
+ gst_stream_container_info_copy_int (
+ (GstDiscovererContainerInfo *) info, stream_map);
+ } else if (ltyp == GST_TYPE_DISCOVERER_AUDIO_INFO) {
+ ret = (GstDiscovererStreamInfo *)
+ gst_discoverer_audio_info_copy_int ((GstDiscovererAudioInfo *) info);
+
+ } else if (ltyp == GST_TYPE_DISCOVERER_VIDEO_INFO) {
+ ret = (GstDiscovererStreamInfo *)
+ gst_discoverer_video_info_copy_int ((GstDiscovererVideoInfo *) info);
+
+ } else if (ltyp == GST_TYPE_DISCOVERER_SUBTITLE_INFO) {
+ ret = (GstDiscovererStreamInfo *)
+ gst_discoverer_subtitle_info_copy_int ((GstDiscovererSubtitleInfo *)
+ info);
+
+ } else
+ ret = gst_discoverer_stream_info_new ();
+
+ if (info->next) {
+ ret->next = gst_discoverer_info_copy_int (info->next, stream_map);
+ ret->next->previous = ret;
+ }
+
+ if (info->caps)
+ ret->caps = gst_caps_copy (info->caps);
+
+ if (info->tags)
+ ret->tags = gst_tag_list_copy (info->tags);
+
+ if (info->misc)
+ ret->misc = gst_structure_copy (info->misc);
+
+ if (stream_map)
+ g_hash_table_insert (stream_map, info, ret);
+
+ return ret;
+}
+
+/* Container information */
+G_DEFINE_TYPE (GstDiscovererContainerInfo, gst_discoverer_container_info,
+ GST_TYPE_DISCOVERER_STREAM_INFO);
+
+static void
+gst_discoverer_container_info_init (GstDiscovererContainerInfo * info)
+{
+ /* Nothing to initialize */
+}
+
+static GstDiscovererContainerInfo *
+gst_discoverer_container_info_new (void)
+{
+ return (GstDiscovererContainerInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_CONTAINER_INFO, NULL);
+}
+
+static void
+gst_discoverer_container_info_finalize (GObject * object)
+{
+ GstDiscovererContainerInfo *info = (GstDiscovererContainerInfo *) object;
+ GList *tmp;
+
+ for (tmp = ((GstDiscovererContainerInfo *) info)->streams; tmp;
+ tmp = tmp->next)
+ g_object_unref ((GObject *) tmp->data);
+
+ gst_discoverer_stream_info_list_free (info->streams);
+
+ gst_discoverer_stream_info_finalize ((GObject *) info);
+}
+
+static void
+gst_discoverer_container_info_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_discoverer_container_info_finalize;
+}
+
+static GstDiscovererContainerInfo *
+gst_stream_container_info_copy_int (GstDiscovererContainerInfo * ptr,
+ GHashTable * stream_map)
+{
+ GstDiscovererContainerInfo *ret;
+ GList *tmp;
+
+ g_return_val_if_fail (ptr != NULL, NULL);
+
+ ret = gst_discoverer_container_info_new ();
+
+ for (tmp = ((GstDiscovererContainerInfo *) ptr)->streams; tmp;
+ tmp = tmp->next) {
+ GstDiscovererStreamInfo *subtop = gst_discoverer_info_copy_int (tmp->data,
+ stream_map);
+ ret->streams = g_list_append (ret->streams, subtop);
+ if (stream_map)
+ g_hash_table_insert (stream_map, tmp->data, subtop);
+ }
+
+ return ret;
+}
+
+/* Audio information */
+G_DEFINE_TYPE (GstDiscovererAudioInfo, gst_discoverer_audio_info,
+ GST_TYPE_DISCOVERER_STREAM_INFO);
+
+static void
+gst_discoverer_audio_info_finalize (GObject * object)
+{
+ GstDiscovererAudioInfo *info = (GstDiscovererAudioInfo *) object;
+
+ g_free (info->language);
+
+ G_OBJECT_CLASS (gst_discoverer_audio_info_parent_class)->finalize (object);
+}
+
+static void
+gst_discoverer_audio_info_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_discoverer_audio_info_finalize;
+}
+
+static void
+gst_discoverer_audio_info_init (GstDiscovererAudioInfo * info)
+{
+ info->language = NULL;
+}
+
+static GstDiscovererAudioInfo *
+gst_discoverer_audio_info_new (void)
+{
+ return (GstDiscovererAudioInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_AUDIO_INFO, NULL);
+}
+
+static GstDiscovererAudioInfo *
+gst_discoverer_audio_info_copy_int (GstDiscovererAudioInfo * ptr)
+{
+ GstDiscovererAudioInfo *ret;
+
+ ret = gst_discoverer_audio_info_new ();
+
+ ret->channels = ptr->channels;
+ ret->sample_rate = ptr->sample_rate;
+ ret->depth = ptr->depth;
+ ret->bitrate = ptr->bitrate;
+ ret->max_bitrate = ptr->max_bitrate;
+ ret->language = g_strdup (ptr->language);
+
+ return ret;
+}
+
+/* Subtitle information */
+G_DEFINE_TYPE (GstDiscovererSubtitleInfo, gst_discoverer_subtitle_info,
+ GST_TYPE_DISCOVERER_STREAM_INFO);
+
+static void
+gst_discoverer_subtitle_info_init (GstDiscovererSubtitleInfo * info)
+{
+ info->language = NULL;
+}
+
+static void
+gst_discoverer_subtitle_info_finalize (GObject * object)
+{
+ GstDiscovererSubtitleInfo *info = (GstDiscovererSubtitleInfo *) object;
+
+ g_free (info->language);
+
+ G_OBJECT_CLASS (gst_discoverer_subtitle_info_parent_class)->finalize (object);
+}
+
+static void
+gst_discoverer_subtitle_info_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_discoverer_subtitle_info_finalize;
+}
+
+static GstDiscovererSubtitleInfo *
+gst_discoverer_subtitle_info_new (void)
+{
+ return (GstDiscovererSubtitleInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_SUBTITLE_INFO, NULL);
+}
+
+static GstDiscovererSubtitleInfo *
+gst_discoverer_subtitle_info_copy_int (GstDiscovererSubtitleInfo * ptr)
+{
+ GstDiscovererSubtitleInfo *ret;
+
+ ret = gst_discoverer_subtitle_info_new ();
+
+ ret->language = g_strdup (ptr->language);
+
+ return ret;
+}
+
+/* Video information */
+G_DEFINE_TYPE (GstDiscovererVideoInfo, gst_discoverer_video_info,
+ GST_TYPE_DISCOVERER_STREAM_INFO);
+
+static void
+gst_discoverer_video_info_class_init (GObjectClass * klass)
+{
+ /* Nothing to initialize */
+}
+
+static void
+gst_discoverer_video_info_init (GstDiscovererVideoInfo * info)
+{
+ /* Nothing to initialize */
+}
+
+static GstDiscovererVideoInfo *
+gst_discoverer_video_info_new (void)
+{
+ return (GstDiscovererVideoInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_VIDEO_INFO, NULL);
+}
+
+static GstDiscovererVideoInfo *
+gst_discoverer_video_info_copy_int (GstDiscovererVideoInfo * ptr)
+{
+ GstDiscovererVideoInfo *ret;
+
+ ret = gst_discoverer_video_info_new ();
+
+ ret->width = ptr->width;
+ ret->height = ptr->height;
+ ret->depth = ptr->depth;
+ ret->framerate_num = ptr->framerate_num;
+ ret->framerate_denom = ptr->framerate_denom;
+ ret->par_num = ptr->par_num;
+ ret->par_denom = ptr->par_denom;
+ ret->interlaced = ptr->interlaced;
+ ret->bitrate = ptr->bitrate;
+ ret->max_bitrate = ptr->max_bitrate;
+ ret->is_image = ptr->is_image;
+
+ return ret;
+}
+
+/* Global stream information */
+G_DEFINE_TYPE (GstDiscovererInfo, gst_discoverer_info, G_TYPE_OBJECT);
+
+static void
+gst_discoverer_info_init (GstDiscovererInfo * info)
+{
+ /* Nothing needs initialization */
+}
+
+static void
+gst_discoverer_info_finalize (GObject * object)
+{
+ GstDiscovererInfo *info = (GstDiscovererInfo *) object;
+ g_free (info->uri);
+
+ if (info->stream_info)
+ g_object_unref ((GObject *) info->stream_info);
+
+ if (info->misc)
+ gst_structure_free (info->misc);
+
+ g_list_free (info->stream_list);
+
+ if (info->tags)
+ gst_tag_list_free (info->tags);
+}
+
+static GstDiscovererInfo *
+gst_discoverer_info_new (void)
+{
+ return (GstDiscovererInfo *) g_object_new (GST_TYPE_DISCOVERER_INFO, NULL);
+}
+
+GstDiscovererInfo *
+gst_discoverer_info_copy (GstDiscovererInfo * ptr)
+{
+ GstDiscovererInfo *ret;
+ GHashTable *stream_map = g_hash_table_new (g_direct_hash, NULL);
+ GList *tmp;
+
+ g_return_val_if_fail (ptr != NULL, NULL);
+
+ ret = gst_discoverer_info_new ();
+
+ ret->uri = g_strdup (ptr->uri);
+ if (ptr->stream_info) {
+ ret->stream_info = gst_discoverer_info_copy_int (ptr->stream_info,
+ stream_map);
+ }
+ ret->duration = ptr->duration;
+ if (ptr->misc)
+ ret->misc = gst_structure_copy (ptr->misc);
+
+ /* We need to set up the new list of streams to correspond to old one. The
+ * list just contains a set of pointers to streams in the stream_info tree,
+ * so we keep a map of old stream info objects to the corresponding new
+ * ones and use that to figure out correspondence in stream_list. */
+ for (tmp = ptr->stream_list; tmp; tmp = tmp->next) {
+ GstDiscovererStreamInfo *old_stream = (GstDiscovererStreamInfo *) tmp->data;
+ GstDiscovererStreamInfo *new_stream = g_hash_table_lookup (stream_map,
+ old_stream);
+ g_assert (new_stream != NULL);
+ ret->stream_list = g_list_append (ret->stream_list, new_stream);
+ }
+
+ if (ptr->tags)
+ ret->tags = gst_tag_list_copy (ptr->tags);
+
+ g_hash_table_destroy (stream_map);
+ return ret;
+}
+
+static void
+gst_discoverer_info_class_init (GObjectClass * klass)
+{
+ klass->finalize = gst_discoverer_info_finalize;
+}
+
+/**
+ * gst_discoverer_stream_info_list_free:
+ * @infos: a #GList of #GstDiscovererStreamInfo
+ *
+ * Decrements the reference count of all contained #GstDiscovererStreamInfo
+ * and fress the #GList.
+ */
+void
+gst_discoverer_stream_info_list_free (GList * infos)
+{
+ GList *tmp;
+
+ for (tmp = infos; tmp; tmp = tmp->next)
+ gst_discoverer_stream_info_unref ((GstDiscovererStreamInfo *) tmp->data);
+ g_list_free (infos);
+}
+
+/**
+ * gst_discoverer_info_get_streams:
+ * @info: a #GstDiscovererInfo
+ * @streamtype: a #GType derived from #GstDiscovererStreamInfo
+ *
+ * Finds the #GstDiscovererStreamInfo contained in @info that match the
+ * given @streamtype.
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): A #GList of
+ * matching #GstDiscovererStreamInfo. The caller should free it with
+ * gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_discoverer_info_get_streams (GstDiscovererInfo * info, GType streamtype)
+{
+ GList *tmp, *res = NULL;
+
+ for (tmp = info->stream_list; tmp; tmp = tmp->next) {
+ GstDiscovererStreamInfo *stmp = (GstDiscovererStreamInfo *) tmp->data;
+
+ if (G_TYPE_CHECK_INSTANCE_TYPE (stmp, streamtype))
+ res = g_list_append (res, gst_discoverer_stream_info_ref (stmp));
+ }
+
+ return res;
+}
+
+/**
+ * gst_discoverer_info_get_audio_streams:
+ * @info: a #GstDiscovererInfo
+ *
+ * Finds all the #GstDiscovererAudioInfo contained in @info
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): A #GList of
+ * matching #GstDiscovererStreamInfo. The caller should free it with
+ * gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_discoverer_info_get_audio_streams (GstDiscovererInfo * info)
+{
+ return gst_discoverer_info_get_streams (info, GST_TYPE_DISCOVERER_AUDIO_INFO);
+}
+
+/**
+ * gst_discoverer_info_get_video_streams:
+ * @info: a #GstDiscovererInfo
+ *
+ * Finds all the #GstDiscovererVideoInfo contained in @info
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): A #GList of
+ * matching #GstDiscovererStreamInfo. The caller should free it with
+ * gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_discoverer_info_get_video_streams (GstDiscovererInfo * info)
+{
+ return gst_discoverer_info_get_streams (info, GST_TYPE_DISCOVERER_VIDEO_INFO);
+}
+
+/**
+ * gst_discoverer_info_get_subtitle_streams:
+ * @info: a #GstDiscovererInfo
+ *
+ * Finds all the #GstDiscovererSubtitleInfo contained in @info
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): A #GList of
+ * matching #GstDiscovererStreamInfo. The caller should free it with
+ * gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.36
+ */
+GList *
+gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo * info)
+{
+ return gst_discoverer_info_get_streams (info,
+ GST_TYPE_DISCOVERER_SUBTITLE_INFO);
+}
+
+/**
+ * gst_discoverer_info_get_container_streams:
+ * @info: a #GstDiscovererInfo
+ *
+ * Finds all the #GstDiscovererContainerInfo contained in @info
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): A #GList of
+ * matching #GstDiscovererStreamInfo. The caller should free it with
+ * gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_discoverer_info_get_container_streams (GstDiscovererInfo * info)
+{
+ return gst_discoverer_info_get_streams (info,
+ GST_TYPE_DISCOVERER_CONTAINER_INFO);
+}
+
+/**
+ * gst_discoverer_stream_info_get_stream_type_nick:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: a human readable name for the stream type of the given @info (ex : "audio",
+ * "container",...).
+ *
+ * Since: 0.10.31
+ */
+const gchar *
+gst_discoverer_stream_info_get_stream_type_nick (GstDiscovererStreamInfo * info)
+{
+ if (GST_IS_DISCOVERER_CONTAINER_INFO (info))
+ return "container";
+ if (GST_IS_DISCOVERER_AUDIO_INFO (info))
+ return "audio";
+ if (GST_IS_DISCOVERER_VIDEO_INFO (info)) {
+ if (gst_discoverer_video_info_is_image ((GstDiscovererVideoInfo *)
+ info))
+ return "video(image)";
+ else
+ return "video";
+ }
+ if (GST_IS_DISCOVERER_SUBTITLE_INFO (info))
+ return "subtitles";
+ return "unknown";
+}
+
+/* ACCESSORS */
+
+
+#define GENERIC_ACCESSOR_CODE(parent, parenttype, parentgtype, fieldname, type, failval) \
+ type parent##_get_##fieldname(const parenttype info) { \
+ g_return_val_if_fail(G_TYPE_CHECK_INSTANCE_TYPE((info), parentgtype), failval); \
+ return (info)->fieldname; \
+ }
+
+/**
+ * gst_discoverer_stream_info_get_previous:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer full): the previous #GstDiscovererStreamInfo in a chain.
+ * %NULL for starting points. Unref with #gst_discoverer_stream_info_unref
+ * after usage.
+ *
+ * Since: 0.10.31
+ */
+GstDiscovererStreamInfo *
+gst_discoverer_stream_info_get_previous (GstDiscovererStreamInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_STREAM_INFO (info), NULL);
+
+ if (info->previous)
+ return gst_discoverer_stream_info_ref (info->previous);
+ return NULL;
+}
+
+/**
+ * gst_discoverer_stream_info_get_next:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer full): the next #GstDiscovererStreamInfo in a chain. %NULL
+ * for final streams.
+ * Unref with #gst_discoverer_stream_info_unref after usage.
+ *
+ * Since: 0.10.31
+ */
+GstDiscovererStreamInfo *
+gst_discoverer_stream_info_get_next (GstDiscovererStreamInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_STREAM_INFO (info), NULL);
+
+ if (info->next)
+ return gst_discoverer_stream_info_ref (info->next);
+ return NULL;
+}
+
+
+/**
+ * gst_discoverer_stream_info_get_caps:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer full): the #GstCaps of the stream. Unref with
+ * #gst_caps_unref after usage.
+ *
+ * Since: 0.10.31
+ */
+GstCaps *
+gst_discoverer_stream_info_get_caps (GstDiscovererStreamInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_STREAM_INFO (info), NULL);
+
+ if (info->caps)
+ return gst_caps_ref (info->caps);
+ return NULL;
+}
+
+/**
+ * gst_discoverer_stream_info_get_tags:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer none): the tags contained in this stream. If you wish to
+ * use the tags after the life-time of @info you will need to copy them.
+ *
+ * Since: 0.10.31
+ */
+
+const GstTagList *
+gst_discoverer_stream_info_get_tags (GstDiscovererStreamInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_STREAM_INFO (info), NULL);
+
+ return info->tags;
+}
+
+/**
+ * gst_discoverer_stream_info_get_misc:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer none): additional information regarding the stream (for
+ * example codec version, profile, etc..). If you wish to use the #GstStructure
+ * after the life-time of @info you will need to copy it.
+ *
+ * Since: 0.10.31
+ */
+const GstStructure *
+gst_discoverer_stream_info_get_misc (GstDiscovererStreamInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_STREAM_INFO (info), NULL);
+
+ return info->misc;
+}
+
+/* GstDiscovererContainerInfo */
+
+/**
+ * gst_discoverer_container_info_get_streams:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): the list of
+ * #GstDiscovererStreamInfo this container stream offers.
+ * Free with gst_discoverer_stream_info_list_free() after usage.
+ *
+ * Since: 0.10.31
+ */
+
+GList *
+gst_discoverer_container_info_get_streams (GstDiscovererContainerInfo * info)
+{
+ GList *res = NULL, *tmp;
+
+ g_return_val_if_fail (GST_IS_DISCOVERER_CONTAINER_INFO (info), NULL);
+
+ for (tmp = info->streams; tmp; tmp = tmp->next)
+ res =
+ g_list_append (res,
+ gst_discoverer_stream_info_ref ((GstDiscovererStreamInfo *) tmp->data));
+
+ return res;
+}
+
+/* GstDiscovererAudioInfo */
+
+#define AUDIO_INFO_ACCESSOR_CODE(fieldname, type, failval) \
+ GENERIC_ACCESSOR_CODE(gst_discoverer_audio_info, GstDiscovererAudioInfo*, \
+ GST_TYPE_DISCOVERER_AUDIO_INFO, \
+ fieldname, type, failval)
+
+/**
+ * gst_discoverer_audio_info_get_channels:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the number of channels in the stream.
+ *
+ * Since: 0.10.31
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (channels, guint, 0);
+
+/**
+ * gst_discoverer_audio_info_get_sample_rate:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the sample rate of the stream in Hertz.
+ *
+ * Since: 0.10.31
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (sample_rate, guint, 0);
+
+/**
+ * gst_discoverer_audio_info_get_depth:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the number of bits used per sample in each channel.
+ *
+ * Since: 0.10.31
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (depth, guint, 0);
+
+/**
+ * gst_discoverer_audio_info_get_bitrate:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the average or nominal bitrate of the stream in bits/second.
+ *
+ * Since: 0.10.31
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (bitrate, guint, 0);
+
+/**
+ * gst_discoverer_audio_info_get_max_bitrate:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the maximum bitrate of the stream in bits/second.
+ *
+ * Since: 0.10.31
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (max_bitrate, guint, 0);
+
+/**
+ * gst_discoverer_audio_info_get_language:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the language of the stream, or NULL if unknown.
+ *
+ * Since: 0.10.36
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (language, const gchar *, NULL);
+
+/* GstDiscovererVideoInfo */
+
+#define VIDEO_INFO_ACCESSOR_CODE(fieldname, type, failval) \
+ GENERIC_ACCESSOR_CODE(gst_discoverer_video_info, GstDiscovererVideoInfo*, \
+ GST_TYPE_DISCOVERER_VIDEO_INFO, \
+ fieldname, type, failval)
+
+/**
+ * gst_discoverer_video_info_get_width:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the width of the video stream in pixels.
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (width, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_height:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the height of the video stream in pixels.
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (height, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_depth:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the depth in bits of the video stream.
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (depth, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_framerate_num:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the framerate of the video stream (numerator).
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (framerate_num, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_framerate_denom:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the framerate of the video stream (denominator).
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (framerate_denom, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_par_num:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the Pixel Aspect Ratio (PAR) of the video stream (numerator).
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (par_num, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_par_denom:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the Pixel Aspect Ratio (PAR) of the video stream (denominator).
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (par_denom, guint, 0);
+
+/**
+ * gst_discoverer_video_info_is_interlaced:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: %TRUE if the stream is interlaced, else %FALSE.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_discoverer_video_info_is_interlaced (const GstDiscovererVideoInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_VIDEO_INFO (info), FALSE);
+
+ return info->interlaced;
+}
+
+/**
+ * gst_discoverer_video_info_get_bitrate:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the average or nominal bitrate of the video stream in bits/second.
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (bitrate, guint, 0);
+
+/**
+ * gst_discoverer_video_info_get_max_bitrate:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: the maximum bitrate of the video stream in bits/second.
+ *
+ * Since: 0.10.31
+ */
+
+VIDEO_INFO_ACCESSOR_CODE (max_bitrate, guint, 0);
+
+/**
+ * gst_discoverer_video_info_is_image:
+ * @info: a #GstDiscovererVideoInfo
+ *
+ * Returns: #TRUE if the video stream corresponds to an image (i.e. only contains
+ * one frame).
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_discoverer_video_info_is_image (const GstDiscovererVideoInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_VIDEO_INFO (info), FALSE);
+
+ return info->is_image;
+}
+
+/* GstDiscovererSubtitleInfo */
+
+#define SUBTITLE_INFO_ACCESSOR_CODE(fieldname, type, failval) \
+ GENERIC_ACCESSOR_CODE(gst_discoverer_subtitle_info, GstDiscovererSubtitleInfo*, \
+ GST_TYPE_DISCOVERER_SUBTITLE_INFO, \
+ fieldname, type, failval)
+
+/**
+ * gst_discoverer_subtitle_info_get_language:
+ * @info: a #GstDiscovererSubtitleInfo
+ *
+ * Returns: the language of the stream, or NULL if unknown.
+ *
+ * Since: 0.10.36
+ */
+
+SUBTITLE_INFO_ACCESSOR_CODE (language, const gchar *, NULL);
+
+/* GstDiscovererInfo */
+
+#define DISCOVERER_INFO_ACCESSOR_CODE(fieldname, type, failval) \
+ GENERIC_ACCESSOR_CODE(gst_discoverer_info, GstDiscovererInfo*, \
+ GST_TYPE_DISCOVERER_INFO, \
+ fieldname, type, failval)
+
+/**
+ * gst_discoverer_info_get_uri:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: (transfer none): the URI to which this information corresponds to.
+ * Copy it if you wish to use it after the life-time of @info.
+ *
+ * Since: 0.10.31
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (uri, const gchar *, NULL);
+
+/**
+ * gst_discoverer_info_get_result:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: the result of the discovery as a #GstDiscovererResult.
+ *
+ * Since: 0.10.31
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (result, GstDiscovererResult, GST_DISCOVERER_OK);
+
+/**
+ * gst_discoverer_info_get_stream_info:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: (transfer full): the structure (or topology) of the URI as a
+ * #GstDiscovererStreamInfo.
+ * This structure can be traversed to see the original hierarchy. Unref with
+ * gst_discoverer_stream_info_unref() after usage.
+ *
+ * Since: 0.10.31
+ */
+
+GstDiscovererStreamInfo *
+gst_discoverer_info_get_stream_info (GstDiscovererInfo * info)
+{
+ g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+ if (info->stream_info)
+ return gst_discoverer_stream_info_ref (info->stream_info);
+ return NULL;
+}
+
+/**
+ * gst_discoverer_info_get_stream_list:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: (transfer full) (element-type Gst.DiscovererStreamInfo): the list of
+ * all streams contained in the #info. Free after usage
+ * with gst_discoverer_stream_info_list_free().
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_discoverer_info_get_stream_list (GstDiscovererInfo * info)
+{
+ GList *res = NULL, *tmp;
+
+ g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+ for (tmp = info->stream_list; tmp; tmp = tmp->next)
+ res =
+ g_list_append (res,
+ gst_discoverer_stream_info_ref ((GstDiscovererStreamInfo *) tmp->data));
+
+ return res;
+}
+
+/**
+ * gst_discoverer_info_get_duration:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: the duration of the URI in #GstClockTime (nanoseconds).
+ *
+ * Since: 0.10.31
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (duration, GstClockTime, GST_CLOCK_TIME_NONE);
+
+/**
+ * gst_discoverer_info_get_seekable:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: the wheter the URI is seekable.
+ *
+ * Since: 0.10.32
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (seekable, gboolean, FALSE);
+
+/**
+ * gst_discoverer_info_get_misc:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: (transfer none): Miscellaneous information stored as a #GstStructure
+ * (for example: information about missing plugins). If you wish to use the
+ * #GstStructure after the life-time of @info, you will need to copy it.
+ *
+ * Since: 0.10.31
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (misc, const GstStructure *, NULL);
+
+/**
+ * gst_discoverer_info_get_tags:
+ * @info: a #GstDiscovererInfo
+ *
+ * Returns: (transfer none): all tags contained in the URI. If you wish to use
+ * the tags after the life-time of @info, you will need to copy them.
+ *
+ * Since: 0.10.31
+ */
+
+DISCOVERER_INFO_ACCESSOR_CODE (tags, const GstTagList *, NULL);
+
+/**
+ * gst_discoverer_info_ref:
+ * @info: a #GstDiscovererInfo
+ *
+ * Increments the reference count of @info.
+ *
+ * Returns: the same #GstDiscovererInfo object
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_discoverer_info_unref:
+ * @info: a #GstDiscovererInfo
+ *
+ * Decrements the reference count of @info.
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_discoverer_stream_info_ref:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Increments the reference count of @info.
+ *
+ * Returns: the same #GstDiscovererStreamInfo object
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_discoverer_stream_info_unref:
+ * @info: a #GstDiscovererStreamInfo
+ *
+ * Decrements the reference count of @info.
+ *
+ * Since: 0.10.31
+ */
diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c
new file mode 100644
index 0000000..6a1dbc8
--- /dev/null
+++ b/gst-libs/gst/pbutils/gstdiscoverer.c
@@ -0,0 +1,1581 @@
+/* GStreamer
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ * 2009 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:gstdiscoverer
+ * @short_description: Utility for discovering information on URIs.
+ *
+ * The #GstDiscoverer is a utility object which allows to get as much
+ * information as possible from one or many URIs.
+ *
+ * It provides two APIs, allowing usage in blocking or non-blocking mode.
+ *
+ * The blocking mode just requires calling gst_discoverer_discover_uri()
+ * with the URI one wishes to discover.
+ *
+ * The non-blocking mode requires a running #GMainLoop in the default
+ * #GMainContext, where one connects to the various signals, appends the
+ * URIs to be processed (through gst_discoverer_discover_uri_async()) and then
+ * asks for the discovery to begin (through gst_discoverer_start()).
+ *
+ * All the information is returned in a #GstDiscovererInfo structure.
+ *
+ * Since: 0.10.31
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/video/video.h>
+
+#include "pbutils.h"
+#include "pbutils-marshal.h"
+#include "pbutils-private.h"
+
+GST_DEBUG_CATEGORY_STATIC (discoverer_debug);
+#define GST_CAT_DEFAULT discoverer_debug
+
+static GQuark _CAPS_QUARK;
+static GQuark _TAGS_QUARK;
+static GQuark _MISSING_PLUGIN_QUARK;
+static GQuark _STREAM_TOPOLOGY_QUARK;
+static GQuark _TOPOLOGY_PAD_QUARK;
+
+
+typedef struct
+{
+ GstDiscoverer *dc;
+ GstPad *pad;
+ GstElement *queue;
+ GstElement *sink;
+ GstTagList *tags;
+} PrivateStream;
+
+struct _GstDiscovererPrivate
+{
+ gboolean async;
+
+ /* allowed time to discover each uri in nanoseconds */
+ GstClockTime timeout;
+
+ /* list of pending URI to process (current excluded) */
+ GList *pending_uris;
+
+ GMutex *lock;
+
+ /* TRUE if processing a URI */
+ gboolean processing;
+
+ /* TRUE if discoverer has been started */
+ gboolean running;
+
+ /* current items */
+ GstDiscovererInfo *current_info;
+ GError *current_error;
+ GstStructure *current_topology;
+
+ /* List of private streams */
+ GList *streams;
+
+ /* Global elements */
+ GstBin *pipeline;
+ GstElement *uridecodebin;
+ GstBus *bus;
+
+ GType decodebin_type;
+
+ /* Custom main context variables */
+ GMainContext *ctx;
+ guint sourceid;
+ guint timeoutid;
+
+ /* reusable queries */
+ GstQuery *seeking_query;
+
+ /* Handler ids for various callbacks */
+ gulong pad_added_id;
+ gulong pad_remove_id;
+ gulong element_added_id;
+ gulong bus_cb_id;
+};
+
+#define DISCO_LOCK(dc) g_mutex_lock (dc->priv->lock);
+#define DISCO_UNLOCK(dc) g_mutex_unlock (dc->priv->lock);
+
+static void
+_do_init (void)
+{
+ GST_DEBUG_CATEGORY_INIT (discoverer_debug, "discoverer", 0, "Discoverer");
+
+ _CAPS_QUARK = g_quark_from_static_string ("caps");
+ _TAGS_QUARK = g_quark_from_static_string ("tags");
+ _MISSING_PLUGIN_QUARK = g_quark_from_static_string ("missing-plugin");
+ _STREAM_TOPOLOGY_QUARK = g_quark_from_static_string ("stream-topology");
+ _TOPOLOGY_PAD_QUARK = g_quark_from_static_string ("pad");
+};
+
+G_DEFINE_TYPE_EXTENDED (GstDiscoverer, gst_discoverer, G_TYPE_OBJECT, 0,
+ _do_init ());
+
+enum
+{
+ SIGNAL_FINISHED,
+ SIGNAL_STARTING,
+ SIGNAL_DISCOVERED,
+ LAST_SIGNAL
+};
+
+#define DEFAULT_PROP_TIMEOUT 15 * GST_SECOND
+
+enum
+{
+ PROP_0,
+ PROP_TIMEOUT
+};
+
+static guint gst_discoverer_signals[LAST_SIGNAL] = { 0 };
+
+static void gst_discoverer_set_timeout (GstDiscoverer * dc,
+ GstClockTime timeout);
+static gboolean async_timeout_cb (GstDiscoverer * dc);
+
+static void discoverer_bus_cb (GstBus * bus, GstMessage * msg,
+ GstDiscoverer * dc);
+static void uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
+ GstDiscoverer * dc);
+static void uridecodebin_pad_removed_cb (GstElement * uridecodebin,
+ GstPad * pad, GstDiscoverer * dc);
+
+static void gst_discoverer_dispose (GObject * dc);
+static void gst_discoverer_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_discoverer_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_discoverer_class_init (GstDiscovererClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ gobject_class->dispose = gst_discoverer_dispose;
+
+ gobject_class->set_property = gst_discoverer_set_property;
+ gobject_class->get_property = gst_discoverer_get_property;
+
+ g_type_class_add_private (klass, sizeof (GstDiscovererPrivate));
+
+ /* properties */
+ /**
+ * GstDiscoverer:timeout
+ *
+ * The duration (in nanoseconds) after which the discovery of an individual
+ * URI will timeout.
+ *
+ * If the discovery of a URI times out, the %GST_DISCOVERER_TIMEOUT will be
+ * set on the result flags.
+ */
+ g_object_class_install_property (gobject_class, PROP_TIMEOUT,
+ g_param_spec_uint64 ("timeout", "timeout", "Timeout",
+ GST_SECOND, 3600 * GST_SECOND, DEFAULT_PROP_TIMEOUT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ /* signals */
+ /**
+ * GstDiscoverer::finished:
+ * @discoverer: the #GstDiscoverer
+ *
+ * Will be emitted when all pending URIs have been processed.
+ */
+ gst_discoverer_signals[SIGNAL_FINISHED] =
+ g_signal_new ("finished", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstDiscovererClass, finished),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstDiscoverer::starting:
+ * @discoverer: the #GstDiscoverer
+ *
+ * Will be emitted when the discover starts analyzing the pending URIs
+ */
+ gst_discoverer_signals[SIGNAL_STARTING] =
+ g_signal_new ("starting", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstDiscovererClass, starting),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstDiscoverer::discovered:
+ * @discoverer: the #GstDiscoverer
+ * @info: the results #GstDiscovererInfo
+ * @error: (type GLib.Error): #GError, which will be non-NULL if an error
+ * occurred during discovery
+ *
+ * Will be emitted when all information on a URI could be discovered.
+ */
+ gst_discoverer_signals[SIGNAL_DISCOVERED] =
+ g_signal_new ("discovered", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstDiscovererClass, discovered),
+ NULL, NULL, pbutils_marshal_VOID__POINTER_BOXED,
+ G_TYPE_NONE, 2, GST_TYPE_DISCOVERER_INFO, GST_TYPE_G_ERROR);
+}
+
+static void
+uridecodebin_element_added_cb (GstElement * uridecodebin,
+ GstElement * child, GstDiscoverer * dc)
+{
+ GST_DEBUG ("New element added to uridecodebin : %s",
+ GST_ELEMENT_NAME (child));
+
+ if (G_OBJECT_TYPE (child) == dc->priv->decodebin_type) {
+ g_object_set (child, "post-stream-topology", TRUE, NULL);
+ }
+}
+
+static void
+gst_discoverer_init (GstDiscoverer * dc)
+{
+ GstElement *tmp;
+ GstFormat format = GST_FORMAT_TIME;
+
+ dc->priv = G_TYPE_INSTANCE_GET_PRIVATE (dc, GST_TYPE_DISCOVERER,
+ GstDiscovererPrivate);
+
+ dc->priv->timeout = DEFAULT_PROP_TIMEOUT;
+ dc->priv->async = FALSE;
+
+ dc->priv->lock = g_mutex_new ();
+
+ GST_LOG ("Creating pipeline");
+ dc->priv->pipeline = (GstBin *) gst_pipeline_new ("Discoverer");
+ GST_LOG_OBJECT (dc, "Creating uridecodebin");
+ dc->priv->uridecodebin =
+ gst_element_factory_make ("uridecodebin", "discoverer-uri");
+ if (G_UNLIKELY (dc->priv->uridecodebin == NULL)) {
+ GST_ERROR ("Can't create uridecodebin");
+ return;
+ }
+ GST_LOG_OBJECT (dc, "Adding uridecodebin to pipeline");
+ gst_bin_add (dc->priv->pipeline, dc->priv->uridecodebin);
+
+ dc->priv->pad_added_id =
+ g_signal_connect_object (dc->priv->uridecodebin, "pad-added",
+ G_CALLBACK (uridecodebin_pad_added_cb), dc, 0);
+ dc->priv->pad_remove_id =
+ g_signal_connect_object (dc->priv->uridecodebin, "pad-removed",
+ G_CALLBACK (uridecodebin_pad_removed_cb), dc, 0);
+
+ GST_LOG_OBJECT (dc, "Getting pipeline bus");
+ dc->priv->bus = gst_pipeline_get_bus ((GstPipeline *) dc->priv->pipeline);
+
+ dc->priv->bus_cb_id =
+ g_signal_connect_object (dc->priv->bus, "message",
+ G_CALLBACK (discoverer_bus_cb), dc, 0);
+
+ GST_DEBUG_OBJECT (dc, "Done initializing Discoverer");
+
+ /* This is ugly. We get the GType of decodebin so we can quickly detect
+ * when a decodebin is added to uridecodebin so we can set the
+ * post-stream-topology setting to TRUE */
+ dc->priv->element_added_id =
+ g_signal_connect_object (dc->priv->uridecodebin, "element-added",
+ G_CALLBACK (uridecodebin_element_added_cb), dc, 0);
+ tmp = gst_element_factory_make ("decodebin", NULL);
+ dc->priv->decodebin_type = G_OBJECT_TYPE (tmp);
+ gst_object_unref (tmp);
+
+ /* create queries */
+ dc->priv->seeking_query = gst_query_new_seeking (format);
+}
+
+static void
+discoverer_reset (GstDiscoverer * dc)
+{
+ GST_DEBUG_OBJECT (dc, "Resetting");
+
+ if (dc->priv->pending_uris) {
+ g_list_foreach (dc->priv->pending_uris, (GFunc) g_free, NULL);
+ g_list_free (dc->priv->pending_uris);
+ dc->priv->pending_uris = NULL;
+ }
+
+ if (dc->priv->pipeline)
+ gst_element_set_state ((GstElement *) dc->priv->pipeline, GST_STATE_NULL);
+}
+
+#define DISCONNECT_SIGNAL(o,i) G_STMT_START{ \
+ if ((i) && g_signal_handler_is_connected ((o), (i))) \
+ g_signal_handler_disconnect ((o), (i)); \
+ (i) = 0; \
+}G_STMT_END
+
+static void
+gst_discoverer_dispose (GObject * obj)
+{
+ GstDiscoverer *dc = (GstDiscoverer *) obj;
+
+ GST_DEBUG_OBJECT (dc, "Disposing");
+
+ discoverer_reset (dc);
+
+ if (G_LIKELY (dc->priv->pipeline)) {
+ /* Workaround for bug #118536 */
+ DISCONNECT_SIGNAL (dc->priv->uridecodebin, dc->priv->pad_added_id);
+ DISCONNECT_SIGNAL (dc->priv->uridecodebin, dc->priv->pad_remove_id);
+ DISCONNECT_SIGNAL (dc->priv->uridecodebin, dc->priv->element_added_id);
+ DISCONNECT_SIGNAL (dc->priv->bus, dc->priv->bus_cb_id);
+
+ /* pipeline was set to NULL in _reset */
+ gst_object_unref (dc->priv->pipeline);
+ gst_object_unref (dc->priv->bus);
+
+ dc->priv->pipeline = NULL;
+ dc->priv->uridecodebin = NULL;
+ dc->priv->bus = NULL;
+ }
+
+ gst_discoverer_stop (dc);
+
+ if (dc->priv->lock) {
+ g_mutex_free (dc->priv->lock);
+ dc->priv->lock = NULL;
+ }
+
+ if (dc->priv->seeking_query) {
+ gst_query_unref (dc->priv->seeking_query);
+ dc->priv->seeking_query = NULL;
+ }
+
+ G_OBJECT_CLASS (gst_discoverer_parent_class)->dispose (obj);
+}
+
+static void
+gst_discoverer_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstDiscoverer *dc = (GstDiscoverer *) object;
+
+ switch (prop_id) {
+ case PROP_TIMEOUT:
+ gst_discoverer_set_timeout (dc, g_value_get_uint64 (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_discoverer_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstDiscoverer *dc = (GstDiscoverer *) object;
+
+ switch (prop_id) {
+ case PROP_TIMEOUT:
+ DISCO_LOCK (dc);
+ g_value_set_uint64 (value, dc->priv->timeout);
+ DISCO_UNLOCK (dc);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_discoverer_set_timeout (GstDiscoverer * dc, GstClockTime timeout)
+{
+ GST_DEBUG_OBJECT (dc, "timeout : %" GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
+
+ /* FIXME : update current pending timeout if we're running */
+ DISCO_LOCK (dc);
+ dc->priv->timeout = timeout;
+ DISCO_UNLOCK (dc);
+}
+
+static GstProbeReturn
+_event_probe (GstPad * pad, GstProbeType type, GstEvent * event,
+ PrivateStream * ps)
+{
+ if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) {
+ GstTagList *tl = NULL, *tmp;
+
+ gst_event_parse_tag (event, &tl);
+ GST_DEBUG_OBJECT (pad, "tags %" GST_PTR_FORMAT, tl);
+ DISCO_LOCK (ps->dc);
+ /* If preroll is complete, drop these tags - the collected information is
+ * possibly already being processed and adding more tags would be racy */
+ if (G_LIKELY (ps->dc->priv->processing)) {
+ GST_DEBUG_OBJECT (pad, "private stream %p old tags %" GST_PTR_FORMAT, ps,
+ ps->tags);
+ tmp = gst_tag_list_merge (ps->tags, tl, GST_TAG_MERGE_APPEND);
+ if (ps->tags)
+ gst_tag_list_free (ps->tags);
+ ps->tags = tmp;
+ GST_DEBUG_OBJECT (pad, "private stream %p new tags %" GST_PTR_FORMAT, ps,
+ tmp);
+ } else
+ GST_DEBUG_OBJECT (pad, "Dropping tags since preroll is done");
+ DISCO_UNLOCK (ps->dc);
+ }
+
+ return GST_PROBE_OK;
+}
+
+static gboolean
+is_subtitle_caps (const GstCaps * caps)
+{
+ static GstCaps *subs_caps = NULL;
+
+ if (!subs_caps) {
+ subs_caps = gst_caps_from_string ("text/plain; text/x-pango-markup; "
+ "subpicture/x-pgs; subpicture/x-dvb; application/x-subtitle-unknown; "
+ "application/x-ssa; application/x-ass; subtitle/x-kate; "
+ "application/x-kate; video/x-dvd-subpicture; ");
+ }
+
+ return gst_caps_can_intersect (caps, subs_caps);
+}
+
+static void
+uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
+ GstDiscoverer * dc)
+{
+ PrivateStream *ps;
+ GstPad *sinkpad = NULL;
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (dc, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ ps = g_slice_new0 (PrivateStream);
+
+ ps->dc = dc;
+ ps->pad = pad;
+ ps->queue = gst_element_factory_make ("queue", NULL);
+ ps->sink = gst_element_factory_make ("fakesink", NULL);
+
+ if (G_UNLIKELY (ps->queue == NULL || ps->sink == NULL))
+ goto error;
+
+ g_object_set (ps->sink, "silent", TRUE, NULL);
+ g_object_set (ps->queue, "max-size-buffers", 1, "silent", TRUE, NULL);
+
+ caps = gst_pad_get_caps (pad, NULL);
+
+ if (is_subtitle_caps (caps)) {
+ /* Subtitle streams are sparse and may not provide any information - don't
+ * wait for data to preroll */
+ g_object_set (ps->sink, "async", FALSE, NULL);
+ }
+
+ gst_caps_unref (caps);
+
+ gst_bin_add_many (dc->priv->pipeline, ps->queue, ps->sink, NULL);
+
+ if (!gst_element_link_pads_full (ps->queue, "src", ps->sink, "sink",
+ GST_PAD_LINK_CHECK_NOTHING))
+ goto error;
+ if (!gst_element_sync_state_with_parent (ps->sink))
+ goto error;
+ if (!gst_element_sync_state_with_parent (ps->queue))
+ goto error;
+
+ sinkpad = gst_element_get_static_pad (ps->queue, "sink");
+ if (sinkpad == NULL)
+ goto error;
+ if (gst_pad_link_full (pad, sinkpad,
+ GST_PAD_LINK_CHECK_NOTHING) != GST_PAD_LINK_OK)
+ goto error;
+ gst_object_unref (sinkpad);
+
+ /* Add an event probe */
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) _event_probe, ps, NULL);
+
+ DISCO_LOCK (dc);
+ dc->priv->streams = g_list_append (dc->priv->streams, ps);
+ DISCO_UNLOCK (dc);
+
+ GST_DEBUG_OBJECT (dc, "Done handling pad");
+
+ return;
+
+error:
+ GST_ERROR_OBJECT (dc, "Error while handling pad");
+ if (sinkpad)
+ gst_object_unref (sinkpad);
+ if (ps->queue)
+ gst_object_unref (ps->queue);
+ if (ps->sink)
+ gst_object_unref (ps->sink);
+ g_slice_free (PrivateStream, ps);
+ return;
+}
+
+static void
+uridecodebin_pad_removed_cb (GstElement * uridecodebin, GstPad * pad,
+ GstDiscoverer * dc)
+{
+ GList *tmp;
+ PrivateStream *ps;
+ GstPad *sinkpad;
+
+ GST_DEBUG_OBJECT (dc, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ /* Find the PrivateStream */
+ DISCO_LOCK (dc);
+ for (tmp = dc->priv->streams; tmp; tmp = tmp->next) {
+ ps = (PrivateStream *) tmp->data;
+ if (ps->pad == pad)
+ break;
+ }
+
+ if (tmp == NULL) {
+ DISCO_UNLOCK (dc);
+ GST_DEBUG ("The removed pad wasn't controlled by us !");
+ return;
+ }
+
+ dc->priv->streams = g_list_delete_link (dc->priv->streams, tmp);
+ DISCO_UNLOCK (dc);
+
+ gst_element_set_state (ps->sink, GST_STATE_NULL);
+ gst_element_set_state (ps->queue, GST_STATE_NULL);
+ gst_element_unlink (ps->queue, ps->sink);
+
+ sinkpad = gst_element_get_static_pad (ps->queue, "sink");
+ gst_pad_unlink (pad, sinkpad);
+ gst_object_unref (sinkpad);
+
+ /* references removed here */
+ gst_bin_remove_many (dc->priv->pipeline, ps->sink, ps->queue, NULL);
+
+ if (ps->tags) {
+ gst_tag_list_free (ps->tags);
+ }
+
+ g_slice_free (PrivateStream, ps);
+
+ GST_DEBUG ("Done handling pad");
+}
+
+static GstStructure *
+collect_stream_information (GstDiscoverer * dc, PrivateStream * ps, guint idx)
+{
+ GstCaps *caps;
+ GstStructure *st;
+ gchar *stname;
+
+ stname = g_strdup_printf ("stream-%02d", idx);
+ st = gst_structure_empty_new (stname);
+ g_free (stname);
+
+ /* Get caps */
+ caps = gst_pad_get_current_caps (ps->pad);
+ if (!caps) {
+ GST_WARNING ("Couldn't get negotiated caps from %s:%s",
+ GST_DEBUG_PAD_NAME (ps->pad));
+ caps = gst_pad_get_caps (ps->pad, NULL);
+ }
+ if (caps) {
+ GST_DEBUG ("Got caps %" GST_PTR_FORMAT, caps);
+ gst_structure_id_set (st, _CAPS_QUARK, GST_TYPE_CAPS, caps, NULL);
+
+ gst_caps_unref (caps);
+ }
+ if (ps->tags)
+ gst_structure_id_set (st, _TAGS_QUARK, GST_TYPE_STRUCTURE, ps->tags, NULL);
+
+ return st;
+}
+
+/* Parses a set of caps and tags in st and populates a GstDiscovererStreamInfo
+ * structure (parent, if !NULL, otherwise it allocates one)
+ */
+static GstDiscovererStreamInfo *
+collect_information (GstDiscoverer * dc, const GstStructure * st,
+ GstDiscovererStreamInfo * parent)
+{
+ GstCaps *caps;
+ GstStructure *caps_st, *tags_st;
+ const gchar *name;
+ int tmp;
+ guint utmp;
+
+ if (!st || !gst_structure_id_has_field (st, _CAPS_QUARK)) {
+ GST_WARNING ("Couldn't find caps !");
+ if (parent)
+ return parent;
+ else
+ return (GstDiscovererStreamInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_STREAM_INFO, NULL);
+ }
+
+ gst_structure_id_get (st, _CAPS_QUARK, GST_TYPE_CAPS, &caps, NULL);
+ caps_st = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (caps_st);
+
+ if (g_str_has_prefix (name, "audio/")) {
+ GstDiscovererAudioInfo *info;
+
+ if (parent)
+ info = (GstDiscovererAudioInfo *) parent;
+ else {
+ info = (GstDiscovererAudioInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_AUDIO_INFO, NULL);
+ info->parent.caps = caps;
+ }
+
+ if (gst_structure_get_int (caps_st, "rate", &tmp))
+ info->sample_rate = (guint) tmp;
+
+ if (gst_structure_get_int (caps_st, "channels", &tmp))
+ info->channels = (guint) tmp;
+
+ if (gst_structure_get_int (caps_st, "depth", &tmp))
+ info->depth = (guint) tmp;
+
+ if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
+ gst_structure_id_get (st, _TAGS_QUARK,
+ GST_TYPE_STRUCTURE, &tags_st, NULL);
+ if (gst_structure_get_uint (tags_st, GST_TAG_BITRATE, &utmp) ||
+ gst_structure_get_uint (tags_st, GST_TAG_NOMINAL_BITRATE, &utmp))
+ info->bitrate = utmp;
+
+ if (gst_structure_get_uint (tags_st, GST_TAG_MAXIMUM_BITRATE, &utmp))
+ info->max_bitrate = utmp;
+
+ /* FIXME: Is it worth it to remove the tags we've parsed? */
+ info->parent.tags = gst_tag_list_merge (info->parent.tags,
+ (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
+
+ gst_structure_free (tags_st);
+ }
+
+ if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
+ gchar *language;
+ if (gst_tag_list_get_string (((GstDiscovererStreamInfo *) info)->tags,
+ GST_TAG_LANGUAGE_CODE, &language)) {
+ info->language = language;
+ }
+ }
+
+ return (GstDiscovererStreamInfo *) info;
+
+ } else if (g_str_has_prefix (name, "video/") ||
+ g_str_has_prefix (name, "image/")) {
+ GstDiscovererVideoInfo *info;
+ GstVideoInfo vinfo;
+
+ if (parent)
+ info = (GstDiscovererVideoInfo *) parent;
+ else {
+ info = (GstDiscovererVideoInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_VIDEO_INFO, NULL);
+ info->parent.caps = caps;
+ }
+
+ if (gst_video_info_from_caps (&vinfo, caps)) {
+ info->width = (guint) vinfo.width;
+ info->height = (guint) vinfo.height;
+
+ info->depth = (guint) 0;
+
+ info->par_num = vinfo.par_n;
+ info->par_denom = vinfo.par_d;
+
+ info->framerate_num = vinfo.fps_n;
+ info->framerate_denom = vinfo.fps_d;
+
+ info->interlaced = (vinfo.flags & GST_VIDEO_FLAG_INTERLACED) != 0;
+ }
+
+ if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
+ gst_structure_id_get (st, _TAGS_QUARK,
+ GST_TYPE_STRUCTURE, &tags_st, NULL);
+ if (gst_structure_get_uint (tags_st, GST_TAG_BITRATE, &utmp) ||
+ gst_structure_get_uint (tags_st, GST_TAG_NOMINAL_BITRATE, &utmp))
+ info->bitrate = utmp;
+
+ if (gst_structure_get_uint (tags_st, GST_TAG_MAXIMUM_BITRATE, &utmp))
+ info->max_bitrate = utmp;
+
+ /* FIXME: Is it worth it to remove the tags we've parsed? */
+ info->parent.tags = gst_tag_list_merge (info->parent.tags,
+ (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
+ gst_structure_free (tags_st);
+ }
+
+ return (GstDiscovererStreamInfo *) info;
+
+ } else if (is_subtitle_caps (caps)) {
+ GstDiscovererSubtitleInfo *info;
+
+ if (parent)
+ info = (GstDiscovererSubtitleInfo *) parent;
+ else {
+ info = (GstDiscovererSubtitleInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_SUBTITLE_INFO, NULL);
+ info->parent.caps = caps;
+ }
+
+ if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
+ const gchar *language;
+
+ gst_structure_id_get (st, _TAGS_QUARK,
+ GST_TYPE_STRUCTURE, &tags_st, NULL);
+
+ language = gst_structure_get_string (caps_st, GST_TAG_LANGUAGE_CODE);
+ if (language)
+ info->language = g_strdup (language);
+
+ /* FIXME: Is it worth it to remove the tags we've parsed? */
+ info->parent.tags = gst_tag_list_merge (info->parent.tags,
+ (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
+ gst_structure_free (tags_st);
+
+ }
+
+ if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
+ gchar *language;
+ if (gst_tag_list_get_string (((GstDiscovererStreamInfo *) info)->tags,
+ GST_TAG_LANGUAGE_CODE, &language)) {
+ info->language = language;
+ }
+ }
+
+ return (GstDiscovererStreamInfo *) info;
+
+ } else {
+ /* None of the above - populate what information we can */
+ GstDiscovererStreamInfo *info;
+
+ if (parent)
+ info = parent;
+ else {
+ info = (GstDiscovererStreamInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_STREAM_INFO, NULL);
+ info->caps = caps;
+ }
+
+ if (gst_structure_id_get (st, _TAGS_QUARK,
+ GST_TYPE_STRUCTURE, &tags_st, NULL)) {
+ info->tags = gst_tag_list_merge (info->tags, (GstTagList *) tags_st,
+ GST_TAG_MERGE_REPLACE);
+ gst_structure_free (tags_st);
+ }
+
+ return info;
+ }
+
+}
+
+static GstStructure *
+find_stream_for_node (GstDiscoverer * dc, const GstStructure * topology)
+{
+ GstPad *pad;
+ GstPad *target_pad = NULL;
+ GstStructure *st = NULL;
+ PrivateStream *ps;
+ guint i;
+ GList *tmp;
+
+ if (!gst_structure_id_has_field (topology, _TOPOLOGY_PAD_QUARK)) {
+ GST_DEBUG ("Could not find pad for node %" GST_PTR_FORMAT "\n", topology);
+ return NULL;
+ }
+
+ gst_structure_id_get (topology, _TOPOLOGY_PAD_QUARK,
+ GST_TYPE_PAD, &pad, NULL);
+
+ if (!dc->priv->streams)
+ return NULL;
+
+ for (i = 0, tmp = dc->priv->streams; tmp; tmp = tmp->next, i++) {
+ ps = (PrivateStream *) tmp->data;
+
+ target_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (ps->pad));
+ gst_object_unref (target_pad);
+
+ if (target_pad == pad)
+ break;
+ }
+
+ if (tmp)
+ st = collect_stream_information (dc, ps, i);
+
+ gst_object_unref (pad);
+
+ return st;
+}
+
+static gboolean
+child_is_raw_stream (GstCaps * parent, GstCaps * child)
+{
+ GstStructure *st1, *st2;
+ const gchar *name1, *name2;
+
+ st1 = gst_caps_get_structure (parent, 0);
+ name1 = gst_structure_get_name (st1);
+ st2 = gst_caps_get_structure (child, 0);
+ name2 = gst_structure_get_name (st2);
+
+ if ((g_str_has_prefix (name1, "audio/") &&
+ g_str_has_prefix (name2, "audio/x-raw")) ||
+ ((g_str_has_prefix (name1, "video/") ||
+ g_str_has_prefix (name1, "image/")) &&
+ g_str_has_prefix (name2, "video/x-raw"))) {
+ /* child is the "raw" sub-stream corresponding to parent */
+ return TRUE;
+ }
+
+ if (is_subtitle_caps (parent))
+ return TRUE;
+
+ return FALSE;
+}
+
+/* If a parent is non-NULL, collected stream information will be appended to it
+ * (and where the information exists, it will be overriden)
+ */
+static GstDiscovererStreamInfo *
+parse_stream_topology (GstDiscoverer * dc, const GstStructure * topology,
+ GstDiscovererStreamInfo * parent)
+{
+ GstDiscovererStreamInfo *res = NULL;
+ GstCaps *caps = NULL;
+ const GValue *nval = NULL;
+
+ GST_DEBUG ("parsing: %" GST_PTR_FORMAT, topology);
+
+ nval = gst_structure_get_value (topology, "next");
+
+ if (nval == NULL || GST_VALUE_HOLDS_STRUCTURE (nval)) {
+ GstStructure *st = find_stream_for_node (dc, topology);
+ gboolean add_to_list = TRUE;
+
+ if (st) {
+ res = collect_information (dc, st, parent);
+ gst_structure_free (st);
+ } else {
+ /* Didn't find a stream structure, so let's just use the caps we have */
+ res = collect_information (dc, topology, parent);
+ }
+
+ if (nval == NULL) {
+ /* FIXME : aggregate with information from main streams */
+ GST_DEBUG ("Coudn't find 'next' ! might be the last entry");
+ } else {
+ GstCaps *caps;
+ const GstStructure *st;
+
+ st = gst_value_get_structure (nval);
+
+ GST_DEBUG ("next is a structure %" GST_PTR_FORMAT, st);
+
+ if (!parent)
+ parent = res;
+
+ if (gst_structure_id_get (st, _CAPS_QUARK, GST_TYPE_CAPS, &caps, NULL)) {
+ if (gst_caps_can_intersect (parent->caps, caps)) {
+ /* We sometimes get an extra sub-stream from the parser. If this is
+ * the case, we just replace the parent caps with this stream's caps
+ * since they might contain more information */
+ gst_caps_unref (parent->caps);
+ parent->caps = caps;
+
+ parse_stream_topology (dc, st, parent);
+ add_to_list = FALSE;
+
+ } else if (child_is_raw_stream (parent->caps, caps)) {
+ /* This is the "raw" stream corresponding to the parent. This
+ * contains more information than the parent, tags etc. */
+ parse_stream_topology (dc, st, parent);
+ add_to_list = FALSE;
+ gst_caps_unref (caps);
+
+ } else {
+ GstDiscovererStreamInfo *next = parse_stream_topology (dc, st, NULL);
+ res->next = next;
+ next->previous = res;
+ }
+ }
+ }
+
+ if (add_to_list) {
+ dc->priv->current_info->stream_list =
+ g_list_append (dc->priv->current_info->stream_list, res);
+ }
+
+ } else if (GST_VALUE_HOLDS_LIST (nval)) {
+ guint i, len;
+ GstDiscovererContainerInfo *cont;
+ GstTagList *tags;
+
+ if (!gst_structure_id_get (topology, _CAPS_QUARK,
+ GST_TYPE_CAPS, &caps, NULL))
+ GST_WARNING ("Couldn't find caps !");
+
+ len = gst_value_list_get_size (nval);
+ GST_DEBUG ("next is a list of %d entries", len);
+
+ cont = (GstDiscovererContainerInfo *)
+ g_object_new (GST_TYPE_DISCOVERER_CONTAINER_INFO, NULL);
+ cont->parent.caps = caps;
+ res = (GstDiscovererStreamInfo *) cont;
+
+ if (gst_structure_id_has_field (topology, _TAGS_QUARK)) {
+ GstTagList *tmp;
+
+ gst_structure_id_get (topology, _TAGS_QUARK,
+ GST_TYPE_STRUCTURE, &tags, NULL);
+
+ GST_DEBUG ("Merge tags %" GST_PTR_FORMAT, tags);
+
+ tmp =
+ gst_tag_list_merge (cont->parent.tags, (GstTagList *) tags,
+ GST_TAG_MERGE_APPEND);
+ gst_tag_list_free (tags);
+ if (cont->parent.tags)
+ gst_tag_list_free (cont->parent.tags);
+ cont->parent.tags = tmp;
+ GST_DEBUG ("Container info tags %" GST_PTR_FORMAT, tmp);
+ }
+
+ for (i = 0; i < len; i++) {
+ const GValue *subv = gst_value_list_get_value (nval, i);
+ const GstStructure *subst = gst_value_get_structure (subv);
+ GstDiscovererStreamInfo *substream;
+
+ GST_DEBUG ("%d %" GST_PTR_FORMAT, i, subst);
+
+ substream = parse_stream_topology (dc, subst, NULL);
+
+ substream->previous = res;
+ cont->streams =
+ g_list_append (cont->streams,
+ gst_discoverer_stream_info_ref (substream));
+ }
+ }
+
+ return res;
+}
+
+/* Called when pipeline is pre-rolled */
+static void
+discoverer_collect (GstDiscoverer * dc)
+{
+ GST_DEBUG ("Collecting information");
+
+ /* Stop the timeout handler if present */
+ if (dc->priv->timeoutid) {
+ g_source_remove (dc->priv->timeoutid);
+ dc->priv->timeoutid = 0;
+ }
+
+ if (dc->priv->streams) {
+ /* FIXME : Make this querying optional */
+ if (TRUE) {
+ GstElement *pipeline = (GstElement *) dc->priv->pipeline;
+ gint64 dur;
+
+ GST_DEBUG ("Attempting to query duration");
+
+ if (gst_element_query_duration (pipeline, GST_FORMAT_TIME, &dur)) {
+ GST_DEBUG ("Got duration %" GST_TIME_FORMAT, GST_TIME_ARGS (dur));
+ dc->priv->current_info->duration = (guint64) dur;
+ }
+
+ if (dc->priv->seeking_query) {
+ if (gst_element_query (pipeline, dc->priv->seeking_query)) {
+ GstFormat format;
+ gboolean seekable;
+
+ gst_query_parse_seeking (dc->priv->seeking_query, &format,
+ &seekable, NULL, NULL);
+ if (format == GST_FORMAT_TIME) {
+ GST_DEBUG ("Got seekable %d", seekable);
+ dc->priv->current_info->seekable = seekable;
+ }
+ }
+ }
+ }
+
+ if (dc->priv->current_topology)
+ dc->priv->current_info->stream_info = parse_stream_topology (dc,
+ dc->priv->current_topology, NULL);
+
+ /*
+ * Images need some special handling. They do not have a duration, have
+ * caps named image/<foo> (th exception being MJPEG video which is also
+ * type image/jpeg), and should consist of precisely one stream (actually
+ * initially there are 2, the image and raw stream, but we squash these
+ * while parsing the stream topology). At some point, if we find that these
+ * conditions are not sufficient, we can count the number of decoders and
+ * parsers in the chain, and if there's more than one decoder, or any
+ * parser at all, we should not mark this as an image.
+ */
+ if (dc->priv->current_info->duration == 0 &&
+ dc->priv->current_info->stream_info != NULL &&
+ dc->priv->current_info->stream_info->next == NULL) {
+ GstStructure *st =
+ gst_caps_get_structure (dc->priv->current_info->stream_info->caps, 0);
+
+ if (g_str_has_prefix (gst_structure_get_name (st), "image/"))
+ ((GstDiscovererVideoInfo *) dc->priv->current_info->stream_info)->
+ is_image = TRUE;
+ }
+ }
+
+ if (dc->priv->async) {
+ GST_DEBUG ("Emitting 'discoverered'");
+ g_signal_emit (dc, gst_discoverer_signals[SIGNAL_DISCOVERED], 0,
+ dc->priv->current_info, dc->priv->current_error);
+ /* Clients get a copy of current_info since it is a boxed type */
+ gst_discoverer_info_unref (dc->priv->current_info);
+ }
+}
+
+static void
+get_async_cb (gpointer cb_data, GSource * source, GSourceFunc * func,
+ gpointer * data)
+{
+ *func = (GSourceFunc) async_timeout_cb;
+ *data = cb_data;
+}
+
+/* Wrapper since GSourceCallbackFuncs don't expect a return value from ref() */
+static void
+_void_g_object_ref (gpointer object)
+{
+ g_object_ref (G_OBJECT (object));
+}
+
+static void
+handle_current_async (GstDiscoverer * dc)
+{
+ GSource *source;
+ static GSourceCallbackFuncs cb_funcs = {
+ _void_g_object_ref,
+ g_object_unref,
+ get_async_cb,
+ };
+
+ /* Attach a timeout to the main context */
+ source = g_timeout_source_new (dc->priv->timeout / GST_MSECOND);
+ g_source_set_callback_indirect (source, g_object_ref (dc), &cb_funcs);
+ dc->priv->timeoutid = g_source_attach (source, dc->priv->ctx);
+ g_source_unref (source);
+}
+
+
+/* Returns TRUE if processing should stop */
+static gboolean
+handle_message (GstDiscoverer * dc, GstMessage * msg)
+{
+ gboolean done = FALSE;
+
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg), "got a %s message",
+ GST_MESSAGE_TYPE_NAME (msg));
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:{
+ GError *gerr;
+ gchar *debug;
+
+ gst_message_parse_error (msg, &gerr, &debug);
+ GST_WARNING_OBJECT (GST_MESSAGE_SRC (msg),
+ "Got an error [debug:%s], [message:%s]", debug, gerr->message);
+ dc->priv->current_error = gerr;
+ g_free (debug);
+
+ /* We need to stop */
+ done = TRUE;
+
+ GST_DEBUG ("Setting result to ERROR");
+ dc->priv->current_info->result = GST_DISCOVERER_ERROR;
+ }
+ break;
+
+ case GST_MESSAGE_EOS:
+ GST_DEBUG ("Got EOS !");
+ done = TRUE;
+ break;
+
+ case GST_MESSAGE_ASYNC_DONE:
+ if (GST_MESSAGE_SRC (msg) == (GstObject *) dc->priv->pipeline) {
+ GST_DEBUG ("Finished changing state asynchronously");
+ done = TRUE;
+
+ }
+ break;
+
+ case GST_MESSAGE_ELEMENT:
+ {
+ GQuark sttype;
+ const GstStructure *structure;
+
+ structure = gst_message_get_structure (msg);
+ sttype = gst_structure_get_name_id (structure);
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg),
+ "structure %" GST_PTR_FORMAT, structure);
+ if (sttype == _MISSING_PLUGIN_QUARK) {
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg),
+ "Setting result to MISSING_PLUGINS");
+ dc->priv->current_info->result = GST_DISCOVERER_MISSING_PLUGINS;
+ dc->priv->current_info->misc = gst_structure_copy (structure);
+ } else if (sttype == _STREAM_TOPOLOGY_QUARK) {
+ dc->priv->current_topology = gst_structure_copy (structure);
+ }
+ }
+ break;
+
+ case GST_MESSAGE_TAG:
+ {
+ GstTagList *tl, *tmp;
+
+ gst_message_parse_tag (msg, &tl);
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg), "Got tags %" GST_PTR_FORMAT, tl);
+ /* Merge with current tags */
+ tmp =
+ gst_tag_list_merge (dc->priv->current_info->tags, tl,
+ GST_TAG_MERGE_APPEND);
+ gst_tag_list_free (tl);
+ if (dc->priv->current_info->tags)
+ gst_tag_list_free (dc->priv->current_info->tags);
+ dc->priv->current_info->tags = tmp;
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg), "Current info %p, tags %"
+ GST_PTR_FORMAT, dc->priv->current_info, tmp);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return done;
+}
+
+
+static void
+handle_current_sync (GstDiscoverer * dc)
+{
+ GTimer *timer;
+ gdouble deadline = ((gdouble) dc->priv->timeout) / GST_SECOND;
+ GstMessage *msg;
+ gboolean done = FALSE;
+
+ timer = g_timer_new ();
+ g_timer_start (timer);
+
+ do {
+ /* poll bus with timeout */
+ /* FIXME : make the timeout more fine-tuned */
+ if ((msg = gst_bus_timed_pop (dc->priv->bus, GST_SECOND / 2))) {
+ done = handle_message (dc, msg);
+ gst_message_unref (msg);
+ }
+
+ } while (!done && (g_timer_elapsed (timer, NULL) < deadline));
+
+ /* return result */
+ if (!done) {
+ GST_DEBUG ("we timed out! Setting result to TIMEOUT");
+ dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT;
+ }
+
+ GST_DEBUG ("Done");
+
+ g_timer_stop (timer);
+ g_timer_destroy (timer);
+}
+
+static void
+_setup_locked (GstDiscoverer * dc)
+{
+ GstStateChangeReturn ret;
+
+ GST_DEBUG ("Setting up");
+
+ /* Pop URI off the pending URI list */
+ dc->priv->current_info =
+ (GstDiscovererInfo *) g_object_new (GST_TYPE_DISCOVERER_INFO, NULL);
+ dc->priv->current_info->uri = (gchar *) dc->priv->pending_uris->data;
+ dc->priv->pending_uris =
+ g_list_delete_link (dc->priv->pending_uris, dc->priv->pending_uris);
+
+ /* set uri on uridecodebin */
+ g_object_set (dc->priv->uridecodebin, "uri", dc->priv->current_info->uri,
+ NULL);
+
+ GST_DEBUG ("Current is now %s", dc->priv->current_info->uri);
+
+ dc->priv->processing = TRUE;
+
+ /* set pipeline to PAUSED */
+ DISCO_UNLOCK (dc);
+ GST_DEBUG ("Setting pipeline to PAUSED");
+ ret =
+ gst_element_set_state ((GstElement *) dc->priv->pipeline,
+ GST_STATE_PAUSED);
+ DISCO_LOCK (dc);
+
+ GST_DEBUG_OBJECT (dc, "Pipeline going to PAUSED : %s",
+ gst_element_state_change_return_get_name (ret));
+}
+
+static void
+discoverer_cleanup (GstDiscoverer * dc)
+{
+ GST_DEBUG ("Cleaning up");
+
+ gst_bus_set_flushing (dc->priv->bus, TRUE);
+ gst_element_set_state ((GstElement *) dc->priv->pipeline, GST_STATE_READY);
+ gst_bus_set_flushing (dc->priv->bus, FALSE);
+
+ DISCO_LOCK (dc);
+ if (dc->priv->current_error)
+ g_error_free (dc->priv->current_error);
+ dc->priv->current_error = NULL;
+ if (dc->priv->current_topology) {
+ gst_structure_free (dc->priv->current_topology);
+ dc->priv->current_topology = NULL;
+ }
+
+ dc->priv->current_info = NULL;
+
+ /* Try popping the next uri */
+ if (dc->priv->async) {
+ if (dc->priv->pending_uris != NULL) {
+ _setup_locked (dc);
+ DISCO_UNLOCK (dc);
+ /* Start timeout */
+ handle_current_async (dc);
+ } else {
+ /* We're done ! */
+ DISCO_UNLOCK (dc);
+ g_signal_emit (dc, gst_discoverer_signals[SIGNAL_FINISHED], 0);
+ }
+ } else
+ DISCO_UNLOCK (dc);
+
+ GST_DEBUG ("out");
+}
+
+static void
+discoverer_bus_cb (GstBus * bus, GstMessage * msg, GstDiscoverer * dc)
+{
+ if (dc->priv->processing) {
+ if (handle_message (dc, msg)) {
+ GST_DEBUG ("Stopping asynchronously");
+ /* Serialise with _event_probe() */
+ DISCO_LOCK (dc);
+ dc->priv->processing = FALSE;
+ DISCO_UNLOCK (dc);
+ discoverer_collect (dc);
+ discoverer_cleanup (dc);
+ }
+ }
+}
+
+static gboolean
+async_timeout_cb (GstDiscoverer * dc)
+{
+ if (!g_source_is_destroyed (g_main_current_source ())) {
+ dc->priv->timeoutid = 0;
+ GST_DEBUG ("Setting result to TIMEOUT");
+ dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT;
+ dc->priv->processing = FALSE;
+ discoverer_collect (dc);
+ discoverer_cleanup (dc);
+ }
+ return FALSE;
+}
+
+/* If there is a pending URI, it will pop it from the list of pending
+ * URIs and start the discovery on it.
+ *
+ * Returns GST_DISCOVERER_OK if the next URI was popped and is processing,
+ * else a error flag.
+ */
+static GstDiscovererResult
+start_discovering (GstDiscoverer * dc)
+{
+ GstDiscovererResult res = GST_DISCOVERER_OK;
+
+ GST_DEBUG ("Starting");
+
+ DISCO_LOCK (dc);
+ if (dc->priv->pending_uris == NULL) {
+ GST_WARNING ("No URI to process");
+ res = GST_DISCOVERER_URI_INVALID;
+ DISCO_UNLOCK (dc);
+ goto beach;
+ }
+
+ if (dc->priv->current_info != NULL) {
+ GST_WARNING ("Already processing a file");
+ res = GST_DISCOVERER_BUSY;
+ DISCO_UNLOCK (dc);
+ goto beach;
+ }
+
+ g_signal_emit (dc, gst_discoverer_signals[SIGNAL_STARTING], 0);
+
+ _setup_locked (dc);
+
+ DISCO_UNLOCK (dc);
+
+ if (dc->priv->async)
+ handle_current_async (dc);
+ else
+ handle_current_sync (dc);
+
+beach:
+ return res;
+}
+
+
+/**
+ * gst_discoverer_start:
+ * @discoverer: A #GstDiscoverer
+ *
+ * Allow asynchronous discovering of URIs to take place.
+ * A #GMainLoop must be available for #GstDiscoverer to properly work in
+ * asynchronous mode.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_discoverer_start (GstDiscoverer * discoverer)
+{
+ GSource *source;
+ GMainContext *ctx = NULL;
+
+ GST_DEBUG_OBJECT (discoverer, "Starting...");
+
+ if (discoverer->priv->async) {
+ GST_DEBUG_OBJECT (discoverer, "We were already started");
+ return;
+ }
+
+ discoverer->priv->async = TRUE;
+ discoverer->priv->running = TRUE;
+
+ ctx = g_main_context_get_thread_default ();
+
+ /* Connect to bus signals */
+ if (ctx == NULL)
+ ctx = g_main_context_default ();
+
+ source = gst_bus_create_watch (discoverer->priv->bus);
+ g_source_set_callback (source, (GSourceFunc) gst_bus_async_signal_func,
+ NULL, NULL);
+ discoverer->priv->sourceid = g_source_attach (source, ctx);
+ g_source_unref (source);
+ discoverer->priv->ctx = g_main_context_ref (ctx);
+
+ start_discovering (discoverer);
+ GST_DEBUG_OBJECT (discoverer, "Started");
+}
+
+/**
+ * gst_discoverer_stop:
+ * @discoverer: A #GstDiscoverer
+ *
+ * Stop the discovery of any pending URIs and clears the list of
+ * pending URIS (if any).
+ *
+ * Since: 0.10.31
+ */
+void
+gst_discoverer_stop (GstDiscoverer * discoverer)
+{
+ GST_DEBUG_OBJECT (discoverer, "Stopping...");
+
+ if (!discoverer->priv->async) {
+ GST_DEBUG_OBJECT (discoverer,
+ "We were already stopped, or running synchronously");
+ return;
+ }
+
+ DISCO_LOCK (discoverer);
+ if (discoverer->priv->processing) {
+ /* We prevent any further processing by setting the bus to
+ * flushing and setting the pipeline to READY.
+ * _reset() will take care of the rest of the cleanup */
+ if (discoverer->priv->bus)
+ gst_bus_set_flushing (discoverer->priv->bus, TRUE);
+ if (discoverer->priv->pipeline)
+ gst_element_set_state ((GstElement *) discoverer->priv->pipeline,
+ GST_STATE_READY);
+ }
+ discoverer->priv->running = FALSE;
+ DISCO_UNLOCK (discoverer);
+
+ /* Remove timeout handler */
+ if (discoverer->priv->timeoutid) {
+ g_source_remove (discoverer->priv->timeoutid);
+ discoverer->priv->timeoutid = 0;
+ }
+ /* Remove signal watch */
+ if (discoverer->priv->sourceid) {
+ g_source_remove (discoverer->priv->sourceid);
+ discoverer->priv->sourceid = 0;
+ }
+ /* Unref main context */
+ if (discoverer->priv->ctx) {
+ g_main_context_unref (discoverer->priv->ctx);
+ discoverer->priv->ctx = NULL;
+ }
+ discoverer_reset (discoverer);
+
+ discoverer->priv->async = FALSE;
+
+ GST_DEBUG_OBJECT (discoverer, "Stopped");
+}
+
+/**
+ * gst_discoverer_discover_uri_async:
+ * @discoverer: A #GstDiscoverer
+ * @uri: the URI to add.
+ *
+ * Appends the given @uri to the list of URIs to discoverer. The actual
+ * discovery of the @uri will only take place if gst_discoverer_start() has
+ * been called.
+ *
+ * A copy of @uri will be made internally, so the caller can safely g_free()
+ * afterwards.
+ *
+ * Returns: %TRUE if the @uri was succesfully appended to the list of pending
+ * uris, else %FALSE
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_discoverer_discover_uri_async (GstDiscoverer * discoverer,
+ const gchar * uri)
+{
+ gboolean can_run;
+
+ GST_DEBUG_OBJECT (discoverer, "uri : %s", uri);
+
+ DISCO_LOCK (discoverer);
+ can_run = (discoverer->priv->pending_uris == NULL);
+ discoverer->priv->pending_uris =
+ g_list_append (discoverer->priv->pending_uris, g_strdup (uri));
+ DISCO_UNLOCK (discoverer);
+
+ if (can_run)
+ start_discovering (discoverer);
+
+ return TRUE;
+}
+
+
+/* Synchronous mode */
+/**
+ * gst_discoverer_discover_uri:
+ * @discoverer: A #GstDiscoverer
+ * @uri: The URI to run on.
+ * @err: (out) (allow-none): If an error occurred, this field will be filled in.
+ *
+ * Synchronously discovers the given @uri.
+ *
+ * A copy of @uri will be made internally, so the caller can safely g_free()
+ * afterwards.
+ *
+ * Returns: (transfer full): the result of the scanning. Can be %NULL if an
+ * error occurred.
+ *
+ * Since: 0.10.31
+ */
+GstDiscovererInfo *
+gst_discoverer_discover_uri (GstDiscoverer * discoverer, const gchar * uri,
+ GError ** err)
+{
+ GstDiscovererResult res = 0;
+ GstDiscovererInfo *info;
+
+ GST_DEBUG_OBJECT (discoverer, "uri:%s", uri);
+
+ DISCO_LOCK (discoverer);
+ if (G_UNLIKELY (discoverer->priv->current_info)) {
+ DISCO_UNLOCK (discoverer);
+ GST_WARNING_OBJECT (discoverer, "Already handling a uri");
+ return NULL;
+ }
+
+ discoverer->priv->pending_uris =
+ g_list_append (discoverer->priv->pending_uris, g_strdup (uri));
+ DISCO_UNLOCK (discoverer);
+
+ res = start_discovering (discoverer);
+ discoverer_collect (discoverer);
+
+ /* Get results */
+ if (err) {
+ if (discoverer->priv->current_error)
+ *err = g_error_copy (discoverer->priv->current_error);
+ else
+ *err = NULL;
+ }
+ if (res != GST_DISCOVERER_OK) {
+ GST_DEBUG ("Setting result to %d (was %d)", res,
+ discoverer->priv->current_info->result);
+ discoverer->priv->current_info->result = res;
+ }
+ info = discoverer->priv->current_info;
+
+ discoverer_cleanup (discoverer);
+
+ return info;
+}
+
+/**
+ * gst_discoverer_new:
+ * @timeout: timeout per file, in nanoseconds. Allowed are values between
+ * one second (#GST_SECOND) and one hour (3600 * #GST_SECOND)
+ * @err: a pointer to a #GError. can be %NULL
+ *
+ * Creates a new #GstDiscoverer with the provided timeout.
+ *
+ * Returns: (transfer full): The new #GstDiscoverer.
+ * If an error occurred when creating the discoverer, @err will be set
+ * accordingly and %NULL will be returned. If @err is set, the caller must
+ * free it when no longer needed using g_error_free().
+ *
+ * Since: 0.10.31
+ */
+GstDiscoverer *
+gst_discoverer_new (GstClockTime timeout, GError ** err)
+{
+ GstDiscoverer *res;
+
+ res = g_object_new (GST_TYPE_DISCOVERER, "timeout", timeout, NULL);
+ if (res->priv->uridecodebin == NULL) {
+ if (err)
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
+ "Couldn't create 'uridecodebin' element");
+ gst_object_unref (res);
+ res = NULL;
+ }
+ return res;
+}
diff --git a/gst-libs/gst/pbutils/gstdiscoverer.h b/gst-libs/gst/pbutils/gstdiscoverer.h
new file mode 100644
index 0000000..611bc89
--- /dev/null
+++ b/gst-libs/gst/pbutils/gstdiscoverer.h
@@ -0,0 +1,288 @@
+/* GStreamer
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ * 2009 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_DISCOVERER_H_
+#define _GST_DISCOVERER_H_
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DISCOVERER_STREAM_INFO \
+ (gst_discoverer_stream_info_get_type ())
+#define GST_DISCOVERER_STREAM_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_STREAM_INFO, GstDiscovererStreamInfo))
+#define GST_IS_DISCOVERER_STREAM_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_STREAM_INFO))
+typedef struct _GstDiscovererStreamInfo GstDiscovererStreamInfo;
+typedef GObjectClass GstDiscovererStreamInfoClass;
+GType gst_discoverer_stream_info_get_type (void);
+
+/**
+ * GstDiscovererStreamInfo:
+ *
+ * Base structure for information concerning a media stream. Depending on the
+ * stream type, one can find more media-specific information in
+ * #GstDiscovererAudioInfo, #GstDiscovererVideoInfo, and
+ * #GstDiscovererContainerInfo.
+ *
+ * The #GstDiscovererStreamInfo represents the topology of the stream. Siblings
+ * can be iterated over with gst_discoverer_stream_info_get_next() and
+ * gst_discoverer_stream_info_get_previous(). Children (sub-streams) of a
+ * stream can be accessed using the #GstDiscovererContainerInfo API.
+ *
+ * As a simple example, if you run #GstDiscoverer on an AVI file with one audio
+ * and one video stream, you will get a #GstDiscovererContainerInfo
+ * corresponding to the AVI container, which in turn will have a
+ * #GstDiscovererAudioInfo sub-stream and a #GstDiscovererVideoInfo sub-stream
+ * for the audio and video streams respectively.
+ *
+ * Since: 0.10.31
+ */
+#define gst_discoverer_stream_info_ref(info) ((GstDiscovererStreamInfo*) g_object_ref((GObject*) info))
+#define gst_discoverer_stream_info_unref(info) (g_object_unref((GObject*) info))
+
+GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);
+GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);
+GstCaps* gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);
+const GstTagList* gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);
+const GstStructure* gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);
+const gchar * gst_discoverer_stream_info_get_stream_type_nick(GstDiscovererStreamInfo* info);
+
+/**
+ * GstDiscovererContainerInfo:
+ *
+ * #GstDiscovererStreamInfo specific to container streams.
+ *
+ * Since: 0.10.31
+ */
+#define GST_TYPE_DISCOVERER_CONTAINER_INFO \
+ (gst_discoverer_container_info_get_type ())
+#define GST_DISCOVERER_CONTAINER_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO, GstDiscovererContainerInfo))
+#define GST_IS_DISCOVERER_CONTAINER_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO))
+typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;
+typedef GObjectClass GstDiscovererContainerInfoClass;
+
+GType gst_discoverer_container_info_get_type (void);
+
+GList *gst_discoverer_container_info_get_streams(GstDiscovererContainerInfo *info);
+
+
+/**
+ * GstDiscovererAudioInfo:
+ *
+ * #GstDiscovererStreamInfo specific to audio streams.
+ *
+ * Since: 0.10.31
+ */
+#define GST_TYPE_DISCOVERER_AUDIO_INFO \
+ (gst_discoverer_audio_info_get_type ())
+#define GST_DISCOVERER_AUDIO_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_AUDIO_INFO, GstDiscovererAudioInfo))
+#define GST_IS_DISCOVERER_AUDIO_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_AUDIO_INFO))
+typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;
+typedef GObjectClass GstDiscovererAudioInfoClass;
+
+GType gst_discoverer_audio_info_get_type (void);
+
+guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);
+guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);
+guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);
+guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);
+guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);
+const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);
+
+/**
+ * GstDiscovererVideoInfo:
+ *
+ * #GstDiscovererStreamInfo specific to video streams (this includes images).
+ *
+ * Since: 0.10.31
+ */
+#define GST_TYPE_DISCOVERER_VIDEO_INFO \
+ (gst_discoverer_video_info_get_type ())
+#define GST_DISCOVERER_VIDEO_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_VIDEO_INFO, GstDiscovererVideoInfo))
+#define GST_IS_DISCOVERER_VIDEO_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_VIDEO_INFO))
+typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;
+typedef GObjectClass GstDiscovererVideoInfoClass;
+GType gst_discoverer_video_info_get_type (void);
+
+guint gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);
+gboolean gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);
+guint gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);
+gboolean gst_discoverer_video_info_is_image(const GstDiscovererVideoInfo* info);
+
+/**
+ * GstDiscovererSubtitleInfo:
+ *
+ * #GstDiscovererStreamInfo specific to subtitle streams (this includes text and
+ * image based ones).
+ *
+ * Since: 0.10.36
+ */
+#define GST_TYPE_DISCOVERER_SUBTITLE_INFO \
+ (gst_discoverer_subtitle_info_get_type ())
+#define GST_DISCOVERER_SUBTITLE_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO, GstDiscovererSubtitleInfo))
+#define GST_IS_DISCOVERER_SUBTITLE_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO))
+typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;
+typedef GObjectClass GstDiscovererSubtitleInfoClass;
+GType gst_discoverer_subtitle_info_get_type (void);
+
+const gchar * gst_discoverer_subtitle_info_get_language(const GstDiscovererSubtitleInfo* info);
+
+/**
+ * GstDiscovererResult:
+ * @GST_DISCOVERER_OK: The discovery was successful
+ * @GST_DISCOVERER_URI_INVALID: the URI is invalid
+ * @GST_DISCOVERER_ERROR: an error happened and the GError is set
+ * @GST_DISCOVERER_TIMEOUT: the discovery timed-out
+ * @GST_DISCOVERER_BUSY: the discoverer was already discovering a file
+ * @GST_DISCOVERER_MISSING_PLUGINS: Some plugins are missing for full discovery
+ *
+ * Result values for the discovery process.
+ *
+ * Since: 0.10.31
+ */
+typedef enum {
+ GST_DISCOVERER_OK = 0,
+ GST_DISCOVERER_URI_INVALID = 1,
+ GST_DISCOVERER_ERROR = 2,
+ GST_DISCOVERER_TIMEOUT = 3,
+ GST_DISCOVERER_BUSY = 4,
+ GST_DISCOVERER_MISSING_PLUGINS = 5
+} GstDiscovererResult;
+
+
+/**
+ * GstDiscovererInfo:
+ *
+ * Structure containing the information of a URI analyzed by #GstDiscoverer.
+ *
+ * Since: 0.10.31
+ */
+typedef struct _GstDiscovererInfo GstDiscovererInfo;
+
+#define GST_TYPE_DISCOVERER_INFO \
+ (gst_discoverer_info_get_type ())
+#define GST_DISCOVERER_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_INFO, GstDiscovererInfo))
+#define GST_IS_DISCOVERER_INFO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_INFO))
+typedef GObjectClass GstDiscovererInfoClass;
+GType gst_discoverer_info_get_type (void);
+
+#define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
+#define gst_discoverer_info_ref(info) (g_object_ref((Gbject*)info))
+
+GstDiscovererInfo* gst_discoverer_info_copy (GstDiscovererInfo * ptr);
+
+const gchar* gst_discoverer_info_get_uri(const GstDiscovererInfo* info);
+GstDiscovererResult gst_discoverer_info_get_result(const GstDiscovererInfo* info);
+GstDiscovererStreamInfo* gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);
+GList* gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);
+GstClockTime gst_discoverer_info_get_duration(const GstDiscovererInfo* info);
+gboolean gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);
+const GstStructure* gst_discoverer_info_get_misc(const GstDiscovererInfo* info);
+const GstTagList* gst_discoverer_info_get_tags(const GstDiscovererInfo* info);
+
+GList * gst_discoverer_info_get_streams (GstDiscovererInfo *info,
+ GType streamtype);
+GList * gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);
+GList * gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);
+GList * gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);
+GList * gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);
+
+void gst_discoverer_stream_info_list_free (GList *infos);
+
+#define GST_TYPE_DISCOVERER \
+ (gst_discoverer_get_type())
+#define GST_DISCOVERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER,GstDiscoverer))
+#define GST_DISCOVERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOVERER,GstDiscovererClass))
+#define GST_IS_DISCOVERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER))
+#define GST_IS_DISCOVERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOVERER))
+
+typedef struct _GstDiscoverer GstDiscoverer;
+typedef struct _GstDiscovererClass GstDiscovererClass;
+typedef struct _GstDiscovererPrivate GstDiscovererPrivate;
+
+/**
+ * GstDiscoverer:
+ *
+ * The #GstDiscoverer structure.
+ *
+ * Since: 0.10.31
+ **/
+struct _GstDiscoverer {
+ GObject parent;
+
+ GstDiscovererPrivate *priv;
+
+ gpointer _reserved[GST_PADDING];
+};
+
+struct _GstDiscovererClass {
+ GObjectClass parentclass;
+
+ /* signals */
+ void (*finished) (GstDiscoverer *discoverer);
+ void (*starting) (GstDiscoverer *discoverer);
+ void (*discovered) (GstDiscoverer *discoverer,
+ GstDiscovererInfo *info,
+ const GError *err);
+
+ gpointer _reserved[GST_PADDING];
+};
+
+GType gst_discoverer_get_type (void);
+GstDiscoverer *gst_discoverer_new (GstClockTime timeout, GError **err);
+
+/* Asynchronous API */
+void gst_discoverer_start (GstDiscoverer *discoverer);
+void gst_discoverer_stop (GstDiscoverer *discoverer);
+gboolean gst_discoverer_discover_uri_async (GstDiscoverer *discoverer,
+ const gchar *uri);
+
+/* Synchronous API */
+GstDiscovererInfo *
+gst_discoverer_discover_uri (GstDiscoverer * discoverer,
+ const gchar * uri,
+ GError ** err);
+
+G_END_DECLS
+
+#endif /* _GST_DISCOVERER_H */
diff --git a/gst-libs/gst/pbutils/gstpluginsbaseversion.c b/gst-libs/gst/pbutils/gstpluginsbaseversion.c
new file mode 100644
index 0000000..82645c1
--- /dev/null
+++ b/gst-libs/gst/pbutils/gstpluginsbaseversion.c
@@ -0,0 +1,78 @@
+/* GStreamer base plugins libraries version information
+ * Copyright (C) 2010 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstpluginsbaseversion
+ * @short_description: GStreamer gst-plugins-base libraries version macros.
+ *
+ * Use the GST_PLUGINS_BASE_VERSION_* macros e.g. to check what version of
+ * gst-plugins-base you are building against, and gst_plugins_base_version()
+ * if you need to check at runtime what version of the gst-plugins-base
+ * libraries are being used / you are currently linked against.
+ *
+ * The version macros get defined by including &lt;gst/pbutils/pbutils.h&gt;.
+ */
+
+#include "gstpluginsbaseversion.h"
+
+/**
+ * gst_plugins_base_version:
+ * @major: (out): pointer to a guint to store the major version number, or %NULL
+ * @minor: (out): pointer to a guint to store the minor version number, or %NULL
+ * @micro: (out): pointer to a guint to store the micro version number, or %NULL
+ * @nano: (out): pointer to a guint to store the nano version number, or %NULL
+ *
+ * Gets the version number of the GStreamer Plugins Base libraries.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_plugins_base_version (guint * major, guint * minor, guint * micro,
+ guint * nano)
+{
+ if (major)
+ *major = GST_PLUGINS_BASE_VERSION_MAJOR;
+ if (minor)
+ *minor = GST_PLUGINS_BASE_VERSION_MINOR;
+ if (micro)
+ *micro = GST_PLUGINS_BASE_VERSION_MICRO;
+ if (nano)
+ *nano = GST_PLUGINS_BASE_VERSION_NANO;
+}
+
+/**
+ * gst_plugins_base_version_string:
+ *
+ * This function returns a string that is useful for describing this version
+ * of GStreamer's gst-plugins-base libraries to the outside world: user agent
+ * strings, logging, about dialogs ...
+ *
+ * Returns: a newly allocated string describing this version of gst-plugins-base
+ *
+ * Since: 0.10.31
+ */
+gchar *
+gst_plugins_base_version_string (void)
+{
+ return g_strdup_printf ("GStreamer Base Plugins %d.%d.%d%s",
+ GST_PLUGINS_BASE_VERSION_MAJOR, GST_PLUGINS_BASE_VERSION_MINOR,
+ GST_PLUGINS_BASE_VERSION_MICRO,
+ ((GST_PLUGINS_BASE_VERSION_NANO == 0) ? "" :
+ ((GST_PLUGINS_BASE_VERSION_NANO == 1) ? " (GIT)" : " (prerelease)")));
+}
diff --git a/gst-libs/gst/pbutils/gstpluginsbaseversion.h.in b/gst-libs/gst/pbutils/gstpluginsbaseversion.h.in
new file mode 100644
index 0000000..bd8adc9
--- /dev/null
+++ b/gst-libs/gst/pbutils/gstpluginsbaseversion.h.in
@@ -0,0 +1,86 @@
+/* GStreamer base plugins libraries version information
+ * Copyright (C) 2010 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PLUGINS_BASE_VERSION_H__
+#define __GST_PLUGINS_BASE_VERSION_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_PLUGINS_BASE_VERSION_MAJOR:
+ *
+ * The major version of GStreamer's gst-plugins-base libraries at compile time.
+ *
+ * Since: 0.10.31
+ */
+#define GST_PLUGINS_BASE_VERSION_MAJOR (@PACKAGE_VERSION_MAJOR@)
+/**
+ * GST_PLUGINS_BASE_VERSION_MINOR:
+ *
+ * The minor version of GStreamer's gst-plugins-base libraries at compile time.
+ *
+ * Since: 0.10.31
+ */
+#define GST_PLUGINS_BASE_VERSION_MINOR (@PACKAGE_VERSION_MINOR@)
+/**
+ * GST_PLUGINS_BASE_VERSION_MICRO:
+ *
+ * The micro version of GStreamer's gst-plugins-base libraries at compile time.
+ *
+ * Since: 0.10.31
+ */
+#define GST_PLUGINS_BASE_VERSION_MICRO (@PACKAGE_VERSION_MICRO@)
+/**
+ * GST_PLUGINS_BASE_VERSION_NANO:
+ *
+ * The nano version of GStreamer's gst-plugins-base libraries at compile time.
+ * Actual releases have 0, GIT versions have 1, prerelease versions have 2-...
+ *
+ * Since: 0.10.31
+ */
+#define GST_PLUGINS_BASE_VERSION_NANO (@PACKAGE_VERSION_NANO@)
+
+/**
+ * GST_CHECK_PLUGIN_BASE_VERSION:
+ * @major: a number indicating the major version
+ * @minor: a number indicating the minor version
+ * @micro: a number indicating the micro version
+ *
+ * Check whether a GStreamer's gst-plugins-base libraries' version equal to
+ * or greater than major.minor.micro is present.
+ *
+ * Since: 0.10.31
+ */
+#define GST_CHECK_PLUGINS_BASE_VERSION(major,minor,micro) \
+ (GST_PLUGINS_BASE_VERSION_MAJOR > (major) || \
+ (GST_PLUGINS_BASE_VERSION_MAJOR == (major) && GST_PLUGINS_BASE_VERSION_MINOR > (minor)) || \
+ (GST_PLUGINS_BASE_VERSION_MAJOR == (major) && GST_PLUGINS_BASE_VERSION_MINOR == (minor) && \
+ GST_PLUGINS_BASE_VERSION_MICRO >= (micro)) || \
+ (GST_PLUGINS_BASE_VERSION_MAJOR == (major) && GST_PLUGINS_BASE_VERSION_MINOR == (minor) && \
+ GST_PLUGINS_BASE_VERSION_MICRO + 1 == (micro) && GST_PLUGINS_BASE_VERSION_NANO > 0))
+
+void gst_plugins_base_version (guint *major, guint *minor, guint *micro, guint *nano);
+
+gchar * gst_plugins_base_version_string (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLUGINS_BASE_VERSION_H__ */
diff --git a/gst-libs/gst/pbutils/install-plugins.c b/gst-libs/gst/pbutils/install-plugins.c
new file mode 100644
index 0000000..5f52cbc
--- /dev/null
+++ b/gst-libs/gst/pbutils/install-plugins.c
@@ -0,0 +1,783 @@
+/* GStreamer base utils library plugin install support for applications
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2006 Ryan Lortie <desrt desrt ca>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpbutilsinstallplugins
+ * @short_description: Missing plugin installation support for applications
+ *
+ * <refsect2>
+ * <title>Overview</title>
+ * <para>
+ * Using this API, applications can request the installation of missing
+ * GStreamer plugins. These may be missing decoders/demuxers or encoders/muxers
+ * for a certain format, sources or sinks for a certain URI protocol
+ * (e.g. 'http'), or certain elements known by their element factory name
+ * ('audioresample').
+ * </para>
+ * <para>
+ * Whether plugin installation is supported or not depends on the operating
+ * system and/or distribution in question. The vendor of the operating system
+ * needs to make sure the necessary hooks and mechanisms are in place for
+ * plugin installation to work. See below for more detailed information.
+ * </para>
+ * <para>
+ * From the application perspective, plugin installation is usually triggered
+ * either
+ * <itemizedlist>
+ * <listitem><para>
+ * when the application itself has found that it wants or needs to install a
+ * certain element
+ * </para></listitem>
+ * <listitem><para>
+ * when the application has been notified by an element (such as playbin or
+ * decodebin) that one or more plugins are missing <emphasis>and</emphasis>
+ * the application has decided that it wants to install one or more of those
+ * missing plugins
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <title>Detail Strings</title>
+ * <para>
+ * The install functions in this section all take one or more 'detail strings'.
+ * These detail strings contain information about the type of plugin that
+ * needs to be installed (decoder, encoder, source, sink, or named element),
+ * and some additional information such GStreamer version used and a
+ * human-readable description of the component to install for user dialogs.
+ * </para>
+ * <para>
+ * Applications should not concern themselves with the composition of the
+ * string itself. They should regard the string as if it was a shared secret
+ * between GStreamer and the plugin installer application.
+ * </para>
+ * <para>
+ * Detail strings can be obtained using the function
+ * gst_missing_plugin_message_get_installer_detail() on a missing-plugin
+ * message. Such a message will either have been found by the application on
+ * a pipeline's #GstBus, or the application will have created it itself using
+ * gst_missing_element_message_new(), gst_missing_decoder_message_new(),
+ * gst_missing_encoder_message_new(), gst_missing_uri_sink_message_new(), or
+ * gst_missing_uri_source_message_new().
+ * </para>
+ * <title>Plugin Installation from the Application Perspective</title>
+ * <para>
+ * For each GStreamer element/plugin/component that should be installed, the
+ * application needs one of those 'installer detail' string mentioned in the
+ * previous section. This string can be obtained, as already mentioned above,
+ * from a missing-plugin message using the function
+ * gst_missing_plugin_message_get_installer_detail(). The missing-plugin
+ * message is either posted by another element and then found on the bus
+ * by the application, or the application has created it itself as described
+ * above.
+ * </para>
+ * <para>
+ * The application will then call gst_install_plugins_async(), passing a
+ * NULL-terminated array of installer detail strings, and a function that
+ * should be called when the installation of the plugins has finished
+ * (successfully or not). Optionally, a #GstInstallPluginsContext created
+ * with gst_install_plugins_context_new() may be passed as well. This way
+ * additional optional arguments like the application window's XID can be
+ * passed to the external installer application.
+ * </para>
+ * <para>
+ * gst_install_plugins_async() will return almost immediately, with the
+ * return code indicating whether plugin installation was started or not.
+ * If the necessary hooks for plugin installation are in place and an
+ * external installer application has in fact been called, the passed in
+ * function will be called with a result code as soon as the external installer
+ * has finished. If the result code indicates that new plugins have been
+ * installed, the application will want to call gst_update_registry() so the
+ * run-time plugin registry is updated and the new plugins are made available
+ * to the application.
+ * <note>
+ * A Gtk/GLib main loop must be running in order for the result function to
+ * be called when the external installer has finished. If this is not the case,
+ * make sure to regularly call
+ * <programlisting>
+ * g_main_context_iteration (NULL,FALSE);
+ * </programlisting>
+ * from your code.
+ * </note>
+ * </para>
+ * <title>Plugin Installation from the Vendor/Distribution Perspective</title>
+ * <para>
+ * <emphasis>1. Installer hook</emphasis>
+ * </para>
+ * <para>
+ * When GStreamer applications initiate plugin installation via
+ * gst_install_plugins_async() or gst_install_plugins_sync(), a pre-defined
+ * helper application will be called.
+ * </para>
+ * <para>
+ * The exact path of the helper application to be called is set at compile
+ * time, usually by the <literal>./configure</literal> script based on the
+ * install prefix. For a normal package build into the <literal>/usr</literal>
+ * prefix, this will usually default to
+ * <filename>/usr/libexec/gst-install-plugins-helper</filename> or
+ * <filename>/usr/lib/gst-install-plugins-helper</filename>.
+ * </para>
+ * <para>
+ * Vendors/distros who want to support GStreamer plugin installation should
+ * either provide such a helper script/application or use the
+ * <literal>./configure</literal> option
+ * <literal>--with-install-plugins-helper=/path/to/installer</literal> to
+ * make GStreamer call an installer of their own directly.
+ * </para>
+ * <para>
+ * It is strongly recommended that vendors provide a small helper application
+ * as interlocutor to the real installer though, even more so if command line
+ * argument munging is required to transform the command line arguments
+ * passed by GStreamer to the helper application into arguments that are
+ * understood by the real installer.
+ * </para>
+ * <para>
+ * The helper application path defined at compile time can be overriden at
+ * runtime by setting the <envar>GST_INSTALL_PLUGINS_HELPER</envar>
+ * environment variable. This can be useful for testing/debugging purposes.
+ * </para>
+ * <para>
+ * <emphasis>2. Arguments passed to the install helper</emphasis>
+ * </para>
+ * <para>
+ * GStreamer will pass the following arguments to the install helper (this is
+ * in addition to the path of the executable itself, which is by convention
+ * argv[0]):
+ * <itemizedlist>
+ * <listitem><para>
+ * none to many optional arguments in the form of
+ * <literal>--foo-bar=val</literal>. Example:
+ * <literal>--transient-for=XID</literal> where XID is the X Window ID of
+ * the main window of the calling application (so the installer can make
+ * itself transient to that window). Unknown optional arguments should
+ * be ignored by the installer.
+ * </para></listitem>
+ * <listitem><para>
+ * one 'installer detail string' argument for each plugin to be installed;
+ * these strings will have a <literal>gstreamer</literal> prefix; the
+ * exact format of the detail string is explained below
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * <emphasis>3. Detail string describing the missing plugin</emphasis>
+ * </para>
+ * <para>
+ * The string is in UTF-8 encoding and is made up of several fields, separated
+ * by '|' characters (but neither the first nor the last character is a '|').
+ * The fields are:
+ * <itemizedlist>
+ * <listitem><para>
+ * plugin system identifier, ie. "gstreamer"
+ * </para><para>
+ * This identifier determines the format of the rest of the detail string.
+ * Automatic plugin installers should not process detail strings with
+ * unknown identifiers. This allows other plugin-based libraries to use
+ * the same mechanism for their automatic plugin installation needs, or
+ * for the format to be changed should it turn out to be insufficient.
+ * </para></listitem>
+ * <listitem><para>
+ * plugin system version, e.g. "0.10"
+ * </para><para>
+ * This is required so that when there is a GStreamer-0.12 or GStreamer-1.0
+ * at some point in future, the different major versions can still co-exist
+ * and use the same plugin install mechanism in the same way.
+ * </para></listitem>
+ * <listitem><para>
+ * application identifier, e.g. "totem"
+ * </para><para>
+ * This may also be in the form of "pid/12345" if the program name can't
+ * be obtained for some reason.
+ * </para></listitem>
+ * <listitem><para>
+ * human-readable localised description of the required component,
+ * e.g. "Vorbis audio decoder"
+ * </para></listitem>
+ * <listitem><para>
+ * identifier string for the required component (see below for details about
+ * how to map this to the package/plugin that needs installing), e.g.
+ * <itemizedlist>
+ * <listitem><para>
+ * urisource-$(PROTOCOL_REQUIRED), e.g. urisource-http or urisource-mms
+ * </para></listitem>
+ * <listitem><para>
+ * element-$(ELEMENT_REQUIRED), e.g. element-videoconvert
+ * </para></listitem>
+ * <listitem><para>
+ * decoder-$(CAPS_REQUIRED), e.g. (do read below for more details!):
+ * <itemizedlist>
+ * <listitem><para>decoder-audio/x-vorbis</para></listitem>
+ * <listitem><para>decoder-application/ogg</para></listitem>
+ * <listitem><para>decoder-audio/mpeg, mpegversion=(int)4</para></listitem>
+ * <listitem><para>decoder-video/mpeg, systemstream=(boolean)true, mpegversion=(int)2</para></listitem>
+ </itemizedlist>
+ * </para></listitem>
+ * <listitem><para>
+ * encoder-$(CAPS_REQUIRED), e.g. encoder-audio/x-vorbis
+ * </para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * <listitem><para>
+ * optional further fields not yet specified
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * An entire ID string might then look like this, for example:
+ * <literal>
+ * gstreamer|0.10|totem|Vorbis audio decoder|decoder-audio/x-vorbis
+ * </literal>
+ * </para>
+ * <para>
+ * Plugin installers parsing this ID string should expect further fields also
+ * separated by '|' symbols and either ignore them, warn the user, or error
+ * out when encountering them.
+ * </para>
+ * <para>
+ * Those unfamiliar with the GStreamer 'caps' system should note a few things
+ * about the caps string used in the above decoder/encoder case:
+ * <itemizedlist>
+ * <listitem><para>
+ * the first part ("video/mpeg") of the caps string is a GStreamer media
+ * type and <emphasis>not</emphasis> a MIME type. Wherever possible, the
+ * GStreamer media type will be the same as the corresponding MIME type,
+ * but often it is not.
+ * </para></listitem>
+ * <listitem><para>
+ * a caps string may or may not have additional comma-separated fields
+ * of various types (as seen in the examples above)
+ * </para></listitem>
+ * <listitem><para>
+ * the caps string of a 'required' component (as above) will always have
+ * fields with fixed values, whereas an introspected string (see below)
+ * may have fields with non-fixed values. Compare for example:
+ * <itemizedlist>
+ * <listitem><para>
+ * <literal>audio/mpeg, mpegversion=(int)4</literal> vs.
+ * <literal>audio/mpeg, mpegversion=(int){2, 4}</literal>
+ * </para></listitem>
+ * <listitem><para>
+ * <literal>video/mpeg, mpegversion=(int)2</literal> vs.
+ * <literal>video/mpeg, systemstream=(boolean){ true, false}, mpegversion=(int)[1, 2]</literal>
+ * </para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * <emphasis>4. Exit codes the installer should return</emphasis>
+ * </para>
+ * <para>
+ * The installer should return one of the following exit codes when it exits:
+ * <itemizedlist>
+ * <listitem><para>
+ * 0 if all of the requested plugins could be installed
+ * (#GST_INSTALL_PLUGINS_SUCCESS)
+ * </para></listitem>
+ * <listitem><para>
+ * 1 if no appropriate installation candidate for any of the requested
+ * plugins could be found. Only return this if nothing has been installed
+ * (#GST_INSTALL_PLUGINS_NOT_FOUND)
+ * </para></listitem>
+ * <listitem><para>
+ * 2 if an error occured during the installation. The application will
+ * assume that the user will already have seen an error message by the
+ * installer in this case and will usually not show another one
+ * (#GST_INSTALL_PLUGINS_ERROR)
+ * </para></listitem>
+ * <listitem><para>
+ * 3 if some of the requested plugins could be installed, but not all
+ * (#GST_INSTALL_PLUGINS_PARTIAL_SUCCESS)
+ * </para></listitem>
+ * <listitem><para>
+ * 4 if the user aborted the installation (#GST_INSTALL_PLUGINS_USER_ABORT)
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * <emphasis>5. How to map the required detail string to packages</emphasis>
+ * </para>
+ * <para>
+ * It is up to the vendor to find mechanism to map required components from
+ * the detail string to the actual packages/plugins to install. This could
+ * be a hardcoded list of mappings, for example, or be part of the packaging
+ * system metadata.
+ * </para>
+ * <para>
+ * GStreamer plugin files can be introspected for this information. The
+ * <literal>gst-inspect</literal> utility has a special command line option
+ * that will output information similar to what is required. For example
+ * <command>
+ * $ gst-inspect-0.10 --print-plugin-auto-install-info /path/to/libgstvorbis.so
+ * </command>
+ * should output something along the lines of
+ * <computeroutput>
+ * decoder-audio/x-vorbis
+ * element-vorbisdec
+ * element-vorbisenc
+ * element-vorbisparse
+ * element-vorbistag
+ * encoder-audio/x-vorbis
+ * </computeroutput>
+ * Note that in the encoder and decoder case the introspected caps can be more
+ * complex with additional fields, e.g.
+ * <literal>audio/mpeg,mpegversion=(int){2,4}</literal>, so they will not
+ * always exactly match the caps wanted by the application. It is up to the
+ * installer to deal with this (either by doing proper caps intersection using
+ * the GStreamer #GstCaps API, or by only taking into account the media type).
+ * </para>
+ * <para>
+ * Another potential source of problems are plugins such as ladspa or
+ * libvisual where the list of elements depends on the installed
+ * ladspa/libvisual plugins at the time. This is also up to the distribution
+ * to handle (but usually not relevant for playback applications).
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "install-plugins.h"
+
+#include <gst/gstinfo.h>
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#include <string.h>
+
+/* best effort to make things compile and possibly even work on win32 */
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(status) ((((guint)(status)) & 0xff00) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(status) ((((guint)(status)) & 0x7f) == 0)
+#endif
+
+static gboolean install_in_progress; /* FALSE */
+
+/* private struct */
+struct _GstInstallPluginsContext
+{
+ guint xid;
+};
+
+/**
+ * gst_install_plugins_context_set_xid:
+ * @ctx: a #GstInstallPluginsContext
+ * @xid: the XWindow ID (XID) of the top-level application
+ *
+ * This function is for X11-based applications (such as most Gtk/Qt
+ * applications on linux/unix) only. You can use it to tell the external
+ * installer the XID of your main application window. That way the installer
+ * can make its own window transient to your application window during the
+ * installation.
+ *
+ * If set, the XID will be passed to the installer via a --transient-for=XID
+ * command line option.
+ *
+ * Gtk+/Gnome application should be able to obtain the XID of the top-level
+ * window like this:
+ * <programlisting>
+ * ##include &lt;gtk/gtk.h&gt;
+ * ##ifdef GDK_WINDOWING_X11
+ * ##include &lt;gdk/gdkx.h&gt;
+ * ##endif
+ * ...
+ * ##ifdef GDK_WINDOWING_X11
+ * xid = GDK_WINDOW_XWINDOW (GTK_WIDGET (application_window)-&gt;window);
+ * ##endif
+ * ...
+ * </programlisting>
+ *
+ * Since: 0.10.12
+ */
+void
+gst_install_plugins_context_set_xid (GstInstallPluginsContext * ctx, guint xid)
+{
+ g_return_if_fail (ctx != NULL);
+
+ ctx->xid = xid;
+}
+
+/**
+ * gst_install_plugins_context_new:
+ *
+ * Creates a new #GstInstallPluginsContext.
+ *
+ * Returns: a new #GstInstallPluginsContext. Free with
+ * gst_install_plugins_context_free() when no longer needed
+ *
+ * Since: 0.10.12
+ */
+GstInstallPluginsContext *
+gst_install_plugins_context_new (void)
+{
+ return g_new0 (GstInstallPluginsContext, 1);
+}
+
+/**
+ * gst_install_plugins_context_free:
+ * @ctx: a #GstInstallPluginsContext
+ *
+ * Frees a #GstInstallPluginsContext.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_install_plugins_context_free (GstInstallPluginsContext * ctx)
+{
+ g_return_if_fail (ctx != NULL);
+
+ g_free (ctx);
+}
+
+static GstInstallPluginsContext *
+gst_install_plugins_context_copy (GstInstallPluginsContext * ctx)
+{
+ GstInstallPluginsContext *ret;
+
+ ret = gst_install_plugins_context_new ();
+ ret->xid = ctx->xid;
+
+ return ret;
+}
+
+GType
+gst_install_plugins_context_get_type (void)
+{
+ static GType gst_ipc_type = 0;
+
+ if (G_UNLIKELY (gst_ipc_type == 0)) {
+ gst_ipc_type = g_boxed_type_register_static ("GstInstallPluginsContext",
+ (GBoxedCopyFunc) gst_install_plugins_context_copy,
+ (GBoxedFreeFunc) gst_install_plugins_context_free);
+ }
+ return gst_ipc_type;
+}
+
+static const gchar *
+gst_install_plugins_get_helper (void)
+{
+ const gchar *helper;
+
+ helper = g_getenv ("GST_INSTALL_PLUGINS_HELPER");
+ if (helper == NULL)
+ helper = GST_INSTALL_PLUGINS_HELPER;
+
+ GST_LOG ("Using plugin install helper '%s'", helper);
+ return helper;
+}
+
+static gboolean
+ptr_array_contains_string (GPtrArray * arr, const gchar * s)
+{
+ gint i;
+
+ for (i = 0; i < arr->len; ++i) {
+ if (strcmp ((const char *) g_ptr_array_index (arr, i), s) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_install_plugins_spawn_child (gchar ** details,
+ GstInstallPluginsContext * ctx, GPid * child_pid, gint * exit_status)
+{
+ GPtrArray *arr;
+ gboolean ret;
+ GError *err = NULL;
+ gchar **argv, xid_str[64] = { 0, };
+
+ arr = g_ptr_array_new ();
+
+ /* argv[0] = helper path */
+ g_ptr_array_add (arr, (gchar *) gst_install_plugins_get_helper ());
+
+ /* add any additional command line args from the context */
+ if (ctx != NULL && ctx->xid != 0) {
+ g_snprintf (xid_str, sizeof (xid_str), "--transient-for=%u", ctx->xid);
+ g_ptr_array_add (arr, xid_str);
+ }
+
+ /* finally, add the detail strings, but without duplicates */
+ while (details != NULL && details[0] != NULL) {
+ if (!ptr_array_contains_string (arr, details[0]))
+ g_ptr_array_add (arr, details[0]);
+ ++details;
+ }
+
+ /* and NULL-terminate */
+ g_ptr_array_add (arr, NULL);
+
+ argv = (gchar **) arr->pdata;
+
+ if (child_pid == NULL && exit_status != NULL) {
+ install_in_progress = TRUE;
+ ret = g_spawn_sync (NULL, argv, NULL, (GSpawnFlags) 0, NULL, NULL,
+ NULL, NULL, exit_status, &err);
+ install_in_progress = FALSE;
+ } else if (child_pid != NULL && exit_status == NULL) {
+ install_in_progress = TRUE;
+ ret = g_spawn_async (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
+ NULL, child_pid, &err);
+ } else {
+ g_return_val_if_reached (FALSE);
+ }
+
+ if (!ret) {
+ GST_ERROR ("Error spawning plugin install helper: %s", err->message);
+ g_error_free (err);
+ }
+
+ g_ptr_array_free (arr, TRUE);
+ return ret;
+}
+
+static GstInstallPluginsReturn
+gst_install_plugins_return_from_status (gint status)
+{
+ GstInstallPluginsReturn ret;
+
+ /* did we exit cleanly? */
+ if (!WIFEXITED (status)) {
+ ret = GST_INSTALL_PLUGINS_CRASHED;
+ } else {
+ ret = (GstInstallPluginsReturn) WEXITSTATUS (status);
+
+ /* did the helper return an invalid status code? */
+ if ((ret < 0 || ret >= GST_INSTALL_PLUGINS_STARTED_OK) &&
+ ret != GST_INSTALL_PLUGINS_INTERNAL_FAILURE) {
+ ret = GST_INSTALL_PLUGINS_INVALID;
+ }
+ }
+
+ GST_LOG ("plugin installer exited with status 0x%04x = %s", status,
+ gst_install_plugins_return_get_name (ret));
+
+ return ret;
+}
+
+typedef struct
+{
+ GstInstallPluginsResultFunc func;
+ gpointer user_data;
+} GstInstallPluginsAsyncHelper;
+
+static void
+gst_install_plugins_installer_exited (GPid pid, gint status, gpointer data)
+{
+ GstInstallPluginsAsyncHelper *helper;
+ GstInstallPluginsReturn ret;
+
+ install_in_progress = FALSE;
+
+ helper = (GstInstallPluginsAsyncHelper *) data;
+ ret = gst_install_plugins_return_from_status (status);
+
+ GST_LOG ("calling plugin install result function %p", helper->func);
+ helper->func (ret, helper->user_data);
+
+ g_free (helper);
+}
+
+/**
+ * gst_install_plugins_async:
+ * @details: NULL-terminated array of installer string details (see below)
+ * @ctx: a #GstInstallPluginsContext, or NULL
+ * @func: (scope async): the function to call when the installer program returns
+ * @user_data: (closure): the user data to pass to @func when called, or NULL
+ *
+ * Requests plugin installation without blocking. Once the plugins have been
+ * installed or installation has failed, @func will be called with the result
+ * of the installation and your provided @user_data pointer.
+ *
+ * This function requires a running GLib/Gtk main loop. If you are not
+ * running a GLib/Gtk main loop, make sure to regularly call
+ * g_main_context_iteration(NULL,FALSE).
+ *
+ * The installer strings that make up @detail are typically obtained by
+ * calling gst_missing_plugin_message_get_installer_detail() on missing-plugin
+ * messages that have been caught on a pipeline's bus or created by the
+ * application via the provided API, such as gst_missing_element_message_new().
+ *
+ * It is possible to request the installation of multiple missing plugins in
+ * one go (as might be required if there is a demuxer for a certain format
+ * installed but no suitable video decoder and no suitable audio decoder).
+ *
+ * Returns: result code whether an external installer could be started
+ *
+ * Since: 0.10.12
+ */
+
+GstInstallPluginsReturn
+gst_install_plugins_async (gchar ** details, GstInstallPluginsContext * ctx,
+ GstInstallPluginsResultFunc func, gpointer user_data)
+{
+ GstInstallPluginsAsyncHelper *helper;
+ GPid pid;
+
+ g_return_val_if_fail (details != NULL, GST_INSTALL_PLUGINS_INTERNAL_FAILURE);
+ g_return_val_if_fail (func != NULL, GST_INSTALL_PLUGINS_INTERNAL_FAILURE);
+
+ if (install_in_progress)
+ return GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS;
+
+ /* if we can't access our helper, don't bother */
+ if (!g_file_test (gst_install_plugins_get_helper (),
+ G_FILE_TEST_IS_EXECUTABLE))
+ return GST_INSTALL_PLUGINS_HELPER_MISSING;
+
+ if (!gst_install_plugins_spawn_child (details, ctx, &pid, NULL))
+ return GST_INSTALL_PLUGINS_INTERNAL_FAILURE;
+
+ helper = g_new (GstInstallPluginsAsyncHelper, 1);
+ helper->func = func;
+ helper->user_data = user_data;
+
+ g_child_watch_add (pid, gst_install_plugins_installer_exited, helper);
+
+ return GST_INSTALL_PLUGINS_STARTED_OK;
+}
+
+/**
+ * gst_install_plugins_sync:
+ * @details: NULL-terminated array of installer string details
+ * @ctx: a #GstInstallPluginsContext, or NULL
+ *
+ * Requests plugin installation and block until the plugins have been
+ * installed or installation has failed.
+ *
+ * This function should almost never be used, it only exists for cases where
+ * a non-GLib main loop is running and the user wants to run it in a separate
+ * thread and marshal the result back asynchronously into the main thread
+ * using the other non-GLib main loop. You should almost always use
+ * gst_install_plugins_async() instead of this function.
+ *
+ * Returns: the result of the installation.
+ *
+ * Since: 0.10.12
+ */
+GstInstallPluginsReturn
+gst_install_plugins_sync (gchar ** details, GstInstallPluginsContext * ctx)
+{
+ gint status;
+
+ g_return_val_if_fail (details != NULL, GST_INSTALL_PLUGINS_INTERNAL_FAILURE);
+
+ if (install_in_progress)
+ return GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS;
+
+ /* if we can't access our helper, don't bother */
+ if (!g_file_test (gst_install_plugins_get_helper (),
+ G_FILE_TEST_IS_EXECUTABLE))
+ return GST_INSTALL_PLUGINS_HELPER_MISSING;
+
+ if (!gst_install_plugins_spawn_child (details, ctx, NULL, &status))
+ return GST_INSTALL_PLUGINS_INTERNAL_FAILURE;
+
+ return gst_install_plugins_return_from_status (status);
+}
+
+/**
+ * gst_install_plugins_return_get_name:
+ * @ret: the return status code
+ *
+ * Convenience function to return the descriptive string associated
+ * with a status code. This function returns English strings and
+ * should not be used for user messages. It is here only to assist
+ * in debugging.
+ *
+ * Returns: a descriptive string for the status code in @ret
+ *
+ * Since: 0.10.12
+ */
+const gchar *
+gst_install_plugins_return_get_name (GstInstallPluginsReturn ret)
+{
+ switch (ret) {
+ case GST_INSTALL_PLUGINS_SUCCESS:
+ return "success";
+ case GST_INSTALL_PLUGINS_NOT_FOUND:
+ return "not-found";
+ case GST_INSTALL_PLUGINS_ERROR:
+ return "install-error";
+ case GST_INSTALL_PLUGINS_CRASHED:
+ return "installer-exit-unclean";
+ case GST_INSTALL_PLUGINS_PARTIAL_SUCCESS:
+ return "partial-success";
+ case GST_INSTALL_PLUGINS_USER_ABORT:
+ return "user-abort";
+ case GST_INSTALL_PLUGINS_STARTED_OK:
+ return "started-ok";
+ case GST_INSTALL_PLUGINS_INTERNAL_FAILURE:
+ return "internal-failure";
+ case GST_INSTALL_PLUGINS_HELPER_MISSING:
+ return "helper-missing";
+ case GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS:
+ return "install-in-progress";
+ case GST_INSTALL_PLUGINS_INVALID:
+ return "invalid";
+ default:
+ break;
+ }
+ return "(UNKNOWN)";
+}
+
+/**
+ * gst_install_plugins_installation_in_progress:
+ *
+ * Checks whether plugin installation (initiated by this application only)
+ * is currently in progress.
+ *
+ * Returns: TRUE if plugin installation is in progress, otherwise FALSE
+ *
+ * Since: 0.10.12
+ */
+gboolean
+gst_install_plugins_installation_in_progress (void)
+{
+ return install_in_progress;
+}
+
+/**
+ * gst_install_plugins_supported:
+ *
+ * Checks whether plugin installation is likely to be supported by the
+ * current environment. This currently only checks whether the helper script
+ * that is to be provided by the distribution or operating system vendor
+ * exists.
+ *
+ * Returns: TRUE if plugin installation is likely to be supported.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_install_plugins_supported (void)
+{
+ return g_file_test (gst_install_plugins_get_helper (),
+ G_FILE_TEST_IS_EXECUTABLE);
+}
diff --git a/gst-libs/gst/pbutils/install-plugins.h b/gst-libs/gst/pbutils/install-plugins.h
new file mode 100644
index 0000000..f3ec2c0
--- /dev/null
+++ b/gst-libs/gst/pbutils/install-plugins.h
@@ -0,0 +1,144 @@
+/* GStreamer base utils library plugin install support for applications
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2006 Ryan Lortie <desrt desrt ca>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PB_UTILS_INSTALL_PLUGINS_H__
+#define __GST_PB_UTILS_INSTALL_PLUGINS_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/*
+ * functions for use by applications to initiate installation of missing plugins
+ */
+
+/**
+ * GstInstallPluginsReturn:
+ * @GST_INSTALL_PLUGINS_SUCCESS: all of the requested plugins could be
+ * installed
+ * @GST_INSTALL_PLUGINS_NOT_FOUND: no appropriate installation candidate for
+ * any of the requested plugins could be found. Only return this if nothing
+ * has been installed. Return #GST_INSTALL_PLUGINS_PARTIAL_SUCCESS if
+ * some (but not all) of the requested plugins could be installed.
+ * @GST_INSTALL_PLUGINS_ERROR: an error occured during the installation. If
+ * this happens, the user has already seen an error message and another
+ * one should not be displayed
+ * @GST_INSTALL_PLUGINS_CRASHED: the installer had an unclean exit code
+ * (ie. death by signal)
+ * @GST_INSTALL_PLUGINS_PARTIAL_SUCCESS: some of the requested plugins could
+ * be installed, but not all
+ * @GST_INSTALL_PLUGINS_USER_ABORT: the user has aborted the installation
+ * @GST_INSTALL_PLUGINS_INVALID: the helper returned an invalid status code
+ * @GST_INSTALL_PLUGINS_STARTED_OK: returned by gst_install_plugins_async() to
+ * indicate that everything went fine so far and the provided callback
+ * will be called with the result of the installation later
+ * @GST_INSTALL_PLUGINS_INTERNAL_FAILURE: some internal failure has
+ * occured when trying to start the installer
+ * @GST_INSTALL_PLUGINS_HELPER_MISSING: the helper script to call the
+ * actual installer is not installed
+ * @GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS: a previously-started plugin
+ * installation is still in progress, try again later
+ *
+ * Result codes returned by gst_install_plugins_async() and
+ * gst_install_plugins_sync(), and also the result code passed to the
+ * #GstInstallPluginsResultFunc specified with gst_install_plugins_async().
+ *
+ * These codes indicate success or failure of starting an external installer
+ * program and to what extent the requested plugins could be installed.
+ *
+ * Since: 0.10.12
+ */
+typedef enum {
+ /* Return codes from the installer. Returned by gst_install_plugins_sync(),
+ * or passed as result code to your #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_SUCCESS = 0,
+ GST_INSTALL_PLUGINS_NOT_FOUND = 1,
+ GST_INSTALL_PLUGINS_ERROR = 2,
+ GST_INSTALL_PLUGINS_PARTIAL_SUCCESS = 3,
+ GST_INSTALL_PLUGINS_USER_ABORT = 4,
+
+ /* Returned by gst_install_plugins_sync(), or passed as result code to your
+ * #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_CRASHED = 100,
+ GST_INSTALL_PLUGINS_INVALID,
+
+ /* Return codes from starting the external helper, may be returned by both
+ * gst_install_plugins_sync() and gst_install_plugins_async(), but should
+ * never be seen by a #GstInstallPluginsResultFunc */
+ GST_INSTALL_PLUGINS_STARTED_OK = 200,
+ GST_INSTALL_PLUGINS_INTERNAL_FAILURE,
+ GST_INSTALL_PLUGINS_HELPER_MISSING,
+ GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS
+} GstInstallPluginsReturn;
+
+/**
+ * GstInstallPluginsContext:
+ *
+ * Opaque context structure for the plugin installation. Use the provided
+ * API to set details on it.
+ *
+ * Since: 0.10.12
+ */
+
+#define GST_TYPE_INSTALL_PLUGINS_CONTEXT (gst_install_plugins_context_get_type())
+
+typedef struct _GstInstallPluginsContext GstInstallPluginsContext;
+
+GstInstallPluginsContext * gst_install_plugins_context_new (void);
+
+void gst_install_plugins_context_free (GstInstallPluginsContext * ctx);
+
+void gst_install_plugins_context_set_xid (GstInstallPluginsContext * ctx,
+ guint xid);
+
+GType gst_install_plugins_context_get_type (void);
+
+/**
+ * GstInstallPluginsResultFunc:
+ * @result: whether the installation of the requested plugins succeeded or not
+ * @user_data: the user data passed to gst_install_plugins_async()
+ *
+ * The prototype of the callback function that will be called once the
+ * external plugin installer program has returned. You only need to provide
+ * a callback function if you are using the asynchronous interface.
+ *
+ * Since: 0.10.12
+ */
+typedef void (*GstInstallPluginsResultFunc) (GstInstallPluginsReturn result,
+ gpointer user_data);
+
+GstInstallPluginsReturn gst_install_plugins_async (gchar ** details,
+ GstInstallPluginsContext * ctx,
+ GstInstallPluginsResultFunc func,
+ gpointer user_data);
+
+GstInstallPluginsReturn gst_install_plugins_sync (gchar ** details,
+ GstInstallPluginsContext * ctx);
+
+const gchar * gst_install_plugins_return_get_name (GstInstallPluginsReturn ret);
+
+gboolean gst_install_plugins_installation_in_progress (void);
+
+gboolean gst_install_plugins_supported (void);
+
+G_END_DECLS
+
+#endif /* __GST_PB_UTILS_INSTALL_PLUGINS_H__ */
+
diff --git a/gst-libs/gst/pbutils/missing-plugins.c b/gst-libs/gst/pbutils/missing-plugins.c
new file mode 100644
index 0000000..896d28d
--- /dev/null
+++ b/gst-libs/gst/pbutils/missing-plugins.c
@@ -0,0 +1,809 @@
+/* GStreamer base utils library missing plugins support
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstpbutilsmissingplugins
+ * @short_description: Create, recognise and parse missing-plugins messages
+ *
+ * <refsect2>
+ * <para>
+ * Functions to create, recognise and parse missing-plugins messages for
+ * applications and elements.
+ * </para>
+ * <para>
+ * Missing-plugin messages are posted on the bus by elements like decodebin
+ * or playbin if they can't find an appropriate source element or decoder
+ * element. The application can use these messages for two things:
+ * <itemizedlist>
+ * <listitem><para>
+ * concise error/problem reporting to the user mentioning what exactly
+ * is missing, see gst_missing_plugin_message_get_description()
+ * </para></listitem>
+ * <listitem><para>
+ * initiate installation of missing plugins, see
+ * gst_missing_plugin_message_get_installer_detail() and
+ * gst_install_plugins_async()
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * <para>
+ * Applications may also create missing-plugin messages themselves to install
+ * required elements that are missing, using the install mechanism mentioned
+ * above.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> /* getpid on UNIX */
+#endif
+#ifdef HAVE_PROCESS_H
+# include <process.h> /* getpid on win32 */
+#endif
+
+#include "gst/gst-i18n-plugin.h"
+
+#include "pbutils.h"
+#include "pbutils-private.h"
+
+#include <string.h>
+
+#define GST_DETAIL_STRING_MARKER "gstreamer"
+
+typedef enum
+{
+ GST_MISSING_TYPE_UNKNOWN = 0,
+ GST_MISSING_TYPE_URISOURCE,
+ GST_MISSING_TYPE_URISINK,
+ GST_MISSING_TYPE_ELEMENT,
+ GST_MISSING_TYPE_DECODER,
+ GST_MISSING_TYPE_ENCODER
+} GstMissingType;
+
+static const struct
+{
+ GstMissingType type;
+ const gchar type_string[12];
+} missing_type_mapping[] = {
+ {
+ GST_MISSING_TYPE_URISOURCE, "urisource"}, {
+ GST_MISSING_TYPE_URISINK, "urisink"}, {
+ GST_MISSING_TYPE_ELEMENT, "element"}, {
+ GST_MISSING_TYPE_DECODER, "decoder"}, {
+ GST_MISSING_TYPE_ENCODER, "encoder"}
+};
+
+static GstMissingType
+missing_structure_get_type (const GstStructure * s)
+{
+ const gchar *type;
+ guint i;
+
+ type = gst_structure_get_string (s, "type");
+ g_return_val_if_fail (type != NULL, GST_MISSING_TYPE_UNKNOWN);
+
+ for (i = 0; i < G_N_ELEMENTS (missing_type_mapping); ++i) {
+ if (strcmp (missing_type_mapping[i].type_string, type) == 0)
+ return missing_type_mapping[i].type;
+ }
+
+ return GST_MISSING_TYPE_UNKNOWN;
+}
+
+GstCaps *
+copy_and_clean_caps (const GstCaps * caps)
+{
+ GstStructure *s;
+ GstCaps *ret;
+
+ ret = gst_caps_copy (caps);
+
+ /* make caps easier to interpret, remove common fields that are likely
+ * to be irrelevant for determining the right plugin (ie. mostly fields
+ * where template caps usually have the standard MIN - MAX range as value) */
+ s = gst_caps_get_structure (ret, 0);
+ gst_structure_remove_field (s, "codec_data");
+ gst_structure_remove_field (s, "palette_data");
+ gst_structure_remove_field (s, "pixel-aspect-ratio");
+ gst_structure_remove_field (s, "framerate");
+ gst_structure_remove_field (s, "leaf_size");
+ gst_structure_remove_field (s, "packet_size");
+ gst_structure_remove_field (s, "block_align");
+ gst_structure_remove_field (s, "metadata-interval"); /* icy caps */
+ /* decoders/encoders almost always handle the usual width/height/channel/rate
+ * range (and if we don't remove this then the app will have a much harder
+ * time blacklisting formats it has unsuccessfully tried to install before) */
+ gst_structure_remove_field (s, "width");
+ gst_structure_remove_field (s, "depth");
+ gst_structure_remove_field (s, "height");
+ gst_structure_remove_field (s, "channels");
+ gst_structure_remove_field (s, "rate");
+ /* rtp fields */
+ gst_structure_remove_field (s, "config");
+ gst_structure_remove_field (s, "clock-rate");
+ gst_structure_remove_field (s, "clock-base");
+ gst_structure_remove_field (s, "maxps");
+ gst_structure_remove_field (s, "seqnum-base");
+ gst_structure_remove_field (s, "npt-start");
+ gst_structure_remove_field (s, "npt-stop");
+ gst_structure_remove_field (s, "play-speed");
+ gst_structure_remove_field (s, "play-scale");
+ gst_structure_remove_field (s, "dynamic_range");
+
+ return ret;
+}
+
+/**
+ * gst_missing_uri_source_message_new:
+ * @element: the #GstElement posting the message
+ * @protocol: the URI protocol the missing source needs to implement,
+ * e.g. "http" or "mms"
+ *
+ * Creates a missing-plugin message for @element to notify the application
+ * that a source element for a particular URI protocol is missing. This
+ * function is mainly for use in plugins.
+ *
+ * Returns: (transfer full): a new #GstMessage, or NULL on error
+ */
+GstMessage *
+gst_missing_uri_source_message_new (GstElement * element,
+ const gchar * protocol)
+{
+ GstStructure *s;
+ gchar *description;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ description = gst_pb_utils_get_source_description (protocol);
+
+ s = gst_structure_new ("missing-plugin", "type", G_TYPE_STRING,
+ "urisource", "detail", G_TYPE_STRING, protocol, "name", G_TYPE_STRING,
+ description, NULL);
+
+ g_free (description);
+ return gst_message_new_element (GST_OBJECT_CAST (element), s);
+}
+
+/**
+ * gst_missing_uri_sink_message_new:
+ * @element: the #GstElement posting the message
+ * @protocol: the URI protocol the missing sink needs to implement,
+ * e.g. "http" or "smb"
+ *
+ * Creates a missing-plugin message for @element to notify the application
+ * that a sink element for a particular URI protocol is missing. This
+ * function is mainly for use in plugins.
+ *
+ * Returns: (transfer full): a new #GstMessage, or NULL on error
+ */
+GstMessage *
+gst_missing_uri_sink_message_new (GstElement * element, const gchar * protocol)
+{
+ GstStructure *s;
+ gchar *description;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ description = gst_pb_utils_get_sink_description (protocol);
+
+ s = gst_structure_new ("missing-plugin", "type", G_TYPE_STRING,
+ "urisink", "detail", G_TYPE_STRING, protocol, "name", G_TYPE_STRING,
+ description, NULL);
+
+ g_free (description);
+ return gst_message_new_element (GST_OBJECT_CAST (element), s);
+}
+
+/**
+ * gst_missing_element_message_new:
+ * @element: the #GstElement posting the message
+ * @factory_name: the name of the missing element (element factory),
+ * e.g. "videoscale" or "cdparanoiasrc"
+ *
+ * Creates a missing-plugin message for @element to notify the application
+ * that a certain required element is missing. This function is mainly for
+ * use in plugins.
+ *
+ * Returns: (transfer full): a new #GstMessage, or NULL on error
+ */
+GstMessage *
+gst_missing_element_message_new (GstElement * element,
+ const gchar * factory_name)
+{
+ GstStructure *s;
+ gchar *description;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (factory_name != NULL, NULL);
+
+ description = gst_pb_utils_get_element_description (factory_name);
+
+ s = gst_structure_new ("missing-plugin", "type", G_TYPE_STRING,
+ "element", "detail", G_TYPE_STRING, factory_name, "name", G_TYPE_STRING,
+ description, NULL);
+
+ g_free (description);
+ return gst_message_new_element (GST_OBJECT_CAST (element), s);
+}
+
+/**
+ * gst_missing_decoder_message_new:
+ * @element: the #GstElement posting the message
+ * @decode_caps: the (fixed) caps for which a decoder element is needed
+ *
+ * Creates a missing-plugin message for @element to notify the application
+ * that a decoder element for a particular set of (fixed) caps is missing.
+ * This function is mainly for use in plugins.
+ *
+ * Returns: (transfer full): a new #GstMessage, or NULL on error
+ */
+GstMessage *
+gst_missing_decoder_message_new (GstElement * element,
+ const GstCaps * decode_caps)
+{
+ GstStructure *s;
+ GstCaps *caps;
+ gchar *description;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (decode_caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (decode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_any (decode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_empty (decode_caps), NULL);
+ g_return_val_if_fail (gst_caps_is_fixed (decode_caps), NULL);
+
+ description = gst_pb_utils_get_decoder_description (decode_caps);
+ caps = copy_and_clean_caps (decode_caps);
+
+ s = gst_structure_new ("missing-plugin", "type", G_TYPE_STRING,
+ "decoder", "detail", GST_TYPE_CAPS, caps, "name", G_TYPE_STRING,
+ description, NULL);
+
+ gst_caps_unref (caps);
+ g_free (description);
+
+ return gst_message_new_element (GST_OBJECT_CAST (element), s);
+}
+
+/**
+ * gst_missing_encoder_message_new:
+ * @element: the #GstElement posting the message
+ * @encode_caps: the (fixed) caps for which an encoder element is needed
+ *
+ * Creates a missing-plugin message for @element to notify the application
+ * that an encoder element for a particular set of (fixed) caps is missing.
+ * This function is mainly for use in plugins.
+ *
+ * Returns: (transfer full): a new #GstMessage, or NULL on error
+ */
+GstMessage *
+gst_missing_encoder_message_new (GstElement * element,
+ const GstCaps * encode_caps)
+{
+ GstStructure *s;
+ GstCaps *caps;
+ gchar *description;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (encode_caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (encode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_any (encode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_empty (encode_caps), NULL);
+ g_return_val_if_fail (gst_caps_is_fixed (encode_caps), NULL);
+
+ description = gst_pb_utils_get_encoder_description (encode_caps);
+ caps = copy_and_clean_caps (encode_caps);
+
+ s = gst_structure_new ("missing-plugin", "type", G_TYPE_STRING,
+ "encoder", "detail", GST_TYPE_CAPS, caps, "name", G_TYPE_STRING,
+ description, NULL);
+
+ gst_caps_unref (caps);
+ g_free (description);
+
+ return gst_message_new_element (GST_OBJECT_CAST (element), s);
+}
+
+static gboolean
+missing_structure_get_string_detail (const GstStructure * s, gchar ** p_detail)
+{
+ const gchar *detail;
+ GType detail_type;
+
+ *p_detail = NULL;
+
+ detail_type = gst_structure_get_field_type (s, "detail");
+ if (!g_type_is_a (detail_type, G_TYPE_STRING)) {
+ GST_WARNING ("expected 'detail' field to be of G_TYPE_STRING");
+ return FALSE;
+ }
+
+ detail = gst_structure_get_string (s, "detail");
+ if (detail == NULL || *detail == '\0') {
+ GST_WARNING ("empty 'detail' field");
+ return FALSE;
+ }
+ *p_detail = g_strdup (detail);
+ return TRUE;
+}
+
+static gboolean
+missing_structure_get_caps_detail (const GstStructure * s, GstCaps ** p_caps)
+{
+ const GstCaps *caps;
+ const GValue *val;
+ GType detail_type;
+
+ *p_caps = NULL;
+
+ detail_type = gst_structure_get_field_type (s, "detail");
+ if (!g_type_is_a (detail_type, GST_TYPE_CAPS)) {
+ GST_WARNING ("expected 'detail' field to be of GST_TYPE_CAPS");
+ return FALSE;
+ }
+
+ val = gst_structure_get_value (s, "detail");
+ caps = gst_value_get_caps (val);
+ if (gst_caps_is_empty (caps) || gst_caps_is_any (caps)) {
+ GST_WARNING ("EMPTY or ANY caps not allowed");
+ return FALSE;
+ }
+
+ *p_caps = gst_caps_copy (caps);
+ return TRUE;
+}
+
+/**
+ * gst_missing_plugin_message_get_installer_detail:
+ * @msg: a missing-plugin #GstMessage of type #GST_MESSAGE_ELEMENT
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ */
+gchar *
+gst_missing_plugin_message_get_installer_detail (GstMessage * msg)
+{
+ GstMissingType missing_type;
+ const gchar *progname;
+ const gchar *type;
+ GString *str = NULL;
+ gchar *detail = NULL;
+ gchar *desc;
+ const GstStructure *structure;
+
+ g_return_val_if_fail (gst_is_missing_plugin_message (msg), NULL);
+
+ structure = gst_message_get_structure (msg);
+ GST_LOG ("Parsing missing-plugin message: %" GST_PTR_FORMAT, structure);
+
+ missing_type = missing_structure_get_type (structure);
+ if (missing_type == GST_MISSING_TYPE_UNKNOWN) {
+ GST_WARNING ("couldn't parse 'type' field");
+ goto error;
+ }
+
+ type = gst_structure_get_string (structure, "type");
+ g_assert (type != NULL); /* validity already checked above */
+
+ /* FIXME: use gst_installer_detail_new() here too */
+ str = g_string_new (GST_DETAIL_STRING_MARKER "|");
+ g_string_append_printf (str, "%u.%u|", GST_VERSION_MAJOR, GST_VERSION_MINOR);
+
+ progname = (const gchar *) g_get_prgname ();
+ if (progname) {
+ g_string_append_printf (str, "%s|", progname);
+ } else {
+ g_string_append_printf (str, "pid/%lu|", (gulong) getpid ());
+ }
+
+ desc = gst_missing_plugin_message_get_description (msg);
+ if (desc) {
+ g_strdelimit (desc, "|", '#');
+ g_string_append_printf (str, "%s|", desc);
+ g_free (desc);
+ } else {
+ g_string_append (str, "|");
+ }
+
+ switch (missing_type) {
+ case GST_MISSING_TYPE_URISOURCE:
+ case GST_MISSING_TYPE_URISINK:
+ case GST_MISSING_TYPE_ELEMENT:
+ if (!missing_structure_get_string_detail (structure, &detail))
+ goto error;
+ break;
+ case GST_MISSING_TYPE_DECODER:
+ case GST_MISSING_TYPE_ENCODER:{
+ GstCaps *caps = NULL;
+
+ if (!missing_structure_get_caps_detail (structure, &caps))
+ goto error;
+
+ detail = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ break;
+ }
+ default:
+ g_return_val_if_reached (NULL);
+ }
+
+ g_string_append_printf (str, "%s-%s", type, detail);
+ g_free (detail);
+
+ return g_string_free (str, FALSE);
+
+/* ERRORS */
+error:
+ {
+ GST_WARNING ("Failed to parse missing-plugin msg: %" GST_PTR_FORMAT, msg);
+ if (str)
+ g_string_free (str, TRUE);
+ return NULL;
+ }
+}
+
+/**
+ * gst_missing_plugin_message_get_description:
+ * @msg: a missing-plugin #GstMessage of type #GST_MESSAGE_ELEMENT
+ *
+ * Returns a localised string describing the missing feature, for use in
+ * error dialogs and the like. Should never return NULL unless @msg is not
+ * a valid missing-plugin message.
+ *
+ * This function is mainly for applications that need a human-readable string
+ * describing a missing plugin, given a previously collected missing-plugin
+ * message
+ *
+ * Returns: a newly-allocated description string, or NULL on error. Free
+ * string with g_free() when not needed any longer.
+ */
+gchar *
+gst_missing_plugin_message_get_description (GstMessage * msg)
+{
+ GstMissingType missing_type;
+ const gchar *desc;
+ gchar *ret = NULL;
+ const GstStructure *structure;
+
+ g_return_val_if_fail (gst_is_missing_plugin_message (msg), NULL);
+
+ structure = gst_message_get_structure (msg);
+ GST_LOG ("Parsing missing-plugin message: %" GST_PTR_FORMAT, structure);
+
+ desc = gst_structure_get_string (structure, "name");
+ if (desc != NULL && *desc != '\0') {
+ ret = g_strdup (desc);
+ goto done;
+ }
+
+ /* fallback #1 */
+ missing_type = missing_structure_get_type (structure);
+
+ switch (missing_type) {
+ case GST_MISSING_TYPE_URISOURCE:
+ case GST_MISSING_TYPE_URISINK:
+ case GST_MISSING_TYPE_ELEMENT:{
+ gchar *detail = NULL;
+
+ if (missing_structure_get_string_detail (structure, &detail)) {
+ if (missing_type == GST_MISSING_TYPE_URISOURCE)
+ ret = gst_pb_utils_get_source_description (detail);
+ else if (missing_type == GST_MISSING_TYPE_URISINK)
+ ret = gst_pb_utils_get_sink_description (detail);
+ else
+ ret = gst_pb_utils_get_sink_description (detail);
+ g_free (detail);
+ }
+ break;
+ }
+ case GST_MISSING_TYPE_DECODER:
+ case GST_MISSING_TYPE_ENCODER:{
+ GstCaps *caps = NULL;
+
+ if (missing_structure_get_caps_detail (structure, &caps)) {
+ if (missing_type == GST_MISSING_TYPE_DECODER)
+ ret = gst_pb_utils_get_decoder_description (caps);
+ else
+ ret = gst_pb_utils_get_encoder_description (caps);
+ gst_caps_unref (caps);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (ret)
+ goto done;
+
+ /* fallback #2 */
+ switch (missing_type) {
+ case GST_MISSING_TYPE_URISOURCE:
+ desc = _("Unknown source element");
+ break;
+ case GST_MISSING_TYPE_URISINK:
+ desc = _("Unknown sink element");
+ break;
+ case GST_MISSING_TYPE_ELEMENT:
+ desc = _("Unknown element");
+ break;
+ case GST_MISSING_TYPE_DECODER:
+ desc = _("Unknown decoder element");
+ break;
+ case GST_MISSING_TYPE_ENCODER:
+ desc = _("Unknown encoder element");
+ break;
+ default:
+ /* we should really never get here, but we better still return
+ * something if we do */
+ desc = _("Plugin or element of unknown type");
+ break;
+ }
+ ret = g_strdup (desc);
+
+done:
+
+ GST_LOG ("returning '%s'", ret);
+ return ret;
+}
+
+/**
+ * gst_is_missing_plugin_message:
+ * @msg: a #GstMessage
+ *
+ * Checks whether @msg is a missing plugins message.
+ *
+ * Returns: %TRUE if @msg is a missing-plugins message, otherwise %FALSE.
+ */
+gboolean
+gst_is_missing_plugin_message (GstMessage * msg)
+{
+ const GstStructure *structure;
+
+ g_return_val_if_fail (msg != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_MESSAGE (msg), FALSE);
+
+ structure = gst_message_get_structure (msg);
+ if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ELEMENT || structure == NULL)
+ return FALSE;
+
+ return gst_structure_has_name (structure, "missing-plugin");
+}
+
+/* takes ownership of the description */
+static gchar *
+gst_installer_detail_new (gchar * description, const gchar * type,
+ const gchar * detail)
+{
+ const gchar *progname;
+ GString *s;
+
+ s = g_string_new (GST_DETAIL_STRING_MARKER "|");
+ g_string_append_printf (s, "%u.%u|", GST_VERSION_MAJOR, GST_VERSION_MINOR);
+
+ progname = (const gchar *) g_get_prgname ();
+ if (progname) {
+ g_string_append_printf (s, "%s|", progname);
+ } else {
+ g_string_append_printf (s, "pid/%lu|", (gulong) getpid ());
+ }
+
+ if (description) {
+ g_strdelimit (description, "|", '#');
+ g_string_append_printf (s, "%s|", description);
+ g_free (description);
+ } else {
+ g_string_append (s, "|");
+ }
+
+ g_string_append_printf (s, "%s-%s", type, detail);
+
+ return g_string_free (s, FALSE);
+}
+
+/**
+ * gst_missing_uri_source_installer_detail_new:
+ * @protocol: the URI protocol the missing source needs to implement,
+ * e.g. "http" or "mms"
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions in
+ * the case where the application knows exactly what kind of plugin it is
+ * missing.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ *
+ * Since: 0.10.15
+ */
+gchar *
+gst_missing_uri_source_installer_detail_new (const gchar * protocol)
+{
+ gchar *desc;
+
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ desc = gst_pb_utils_get_source_description (protocol);
+ return gst_installer_detail_new (desc, "urisource", protocol);
+}
+
+/**
+ * gst_missing_uri_sink_installer_detail_new:
+ * @protocol: the URI protocol the missing source needs to implement,
+ * e.g. "http" or "mms"
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions in
+ * the case where the application knows exactly what kind of plugin it is
+ * missing.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ *
+ * Since: 0.10.15
+ */
+gchar *
+gst_missing_uri_sink_installer_detail_new (const gchar * protocol)
+{
+ gchar *desc;
+
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ desc = gst_pb_utils_get_sink_description (protocol);
+ return gst_installer_detail_new (desc, "urisink", protocol);
+}
+
+/**
+ * gst_missing_element_installer_detail_new:
+ * @factory_name: the name of the missing element (element factory),
+ * e.g. "videoscale" or "cdparanoiasrc"
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions in
+ * the case where the application knows exactly what kind of plugin it is
+ * missing.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ *
+ * Since: 0.10.15
+ */
+gchar *
+gst_missing_element_installer_detail_new (const gchar * factory_name)
+{
+ gchar *desc;
+
+ g_return_val_if_fail (factory_name != NULL, NULL);
+
+ desc = gst_pb_utils_get_element_description (factory_name);
+ return gst_installer_detail_new (desc, "element", factory_name);
+}
+
+/**
+ * gst_missing_decoder_installer_detail_new:
+ * @decode_caps: the (fixed) caps for which a decoder element is needed
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions in
+ * the case where the application knows exactly what kind of plugin it is
+ * missing.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ *
+ * Since: 0.10.15
+ */
+gchar *
+gst_missing_decoder_installer_detail_new (const GstCaps * decode_caps)
+{
+ GstCaps *caps;
+ gchar *detail_str, *caps_str, *desc;
+
+ g_return_val_if_fail (decode_caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (decode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_any (decode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_empty (decode_caps), NULL);
+ g_return_val_if_fail (gst_caps_is_fixed (decode_caps), NULL);
+
+ desc = gst_pb_utils_get_decoder_description (decode_caps);
+ caps = copy_and_clean_caps (decode_caps);
+ caps_str = gst_caps_to_string (caps);
+ detail_str = gst_installer_detail_new (desc, "decoder", caps_str);
+ g_free (caps_str);
+ gst_caps_unref (caps);
+
+ return detail_str;
+}
+
+/**
+ * gst_missing_encoder_installer_detail_new:
+ * @encode_caps: the (fixed) caps for which an encoder element is needed
+ *
+ * Returns an opaque string containing all the details about the missing
+ * element to be passed to an external installer called via
+ * gst_install_plugins_async() or gst_install_plugins_sync().
+ *
+ * This function is mainly for applications that call external plugin
+ * installation mechanisms using one of the two above-mentioned functions in
+ * the case where the application knows exactly what kind of plugin it is
+ * missing.
+ *
+ * Returns: a newly-allocated detail string, or NULL on error. Free string
+ * with g_free() when not needed any longer.
+ *
+ * Since: 0.10.15
+ */
+gchar *
+gst_missing_encoder_installer_detail_new (const GstCaps * encode_caps)
+{
+ GstCaps *caps;
+ gchar *detail_str, *caps_str, *desc;
+
+ g_return_val_if_fail (encode_caps != NULL, NULL);
+ g_return_val_if_fail (GST_IS_CAPS (encode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_any (encode_caps), NULL);
+ g_return_val_if_fail (!gst_caps_is_empty (encode_caps), NULL);
+ g_return_val_if_fail (gst_caps_is_fixed (encode_caps), NULL);
+
+ desc = gst_pb_utils_get_encoder_description (encode_caps);
+ caps = copy_and_clean_caps (encode_caps);
+ caps_str = gst_caps_to_string (caps);
+ detail_str = gst_installer_detail_new (desc, "encoder", caps_str);
+ g_free (caps_str);
+ gst_caps_unref (caps);
+
+ return detail_str;
+}
diff --git a/gst-libs/gst/pbutils/missing-plugins.h b/gst-libs/gst/pbutils/missing-plugins.h
new file mode 100644
index 0000000..508304e
--- /dev/null
+++ b/gst-libs/gst/pbutils/missing-plugins.h
@@ -0,0 +1,77 @@
+/* GStreamer base utils library missing plugins support
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PB_UTILS_MISSING_PLUGINS_H__
+#define __GST_PB_UTILS_MISSING_PLUGINS_H__
+
+#include <gst/gstmessage.h>
+#include <gst/gstcaps.h>
+
+G_BEGIN_DECLS
+
+/*
+ * functions to create missing-plugin messages, for use by plugins primarily
+ */
+
+GstMessage * gst_missing_uri_source_message_new (GstElement * element,
+ const gchar * protocol);
+
+GstMessage * gst_missing_uri_sink_message_new (GstElement * element,
+ const gchar * protocol);
+
+GstMessage * gst_missing_element_message_new (GstElement * element,
+ const gchar * factory_name);
+
+GstMessage * gst_missing_decoder_message_new (GstElement * element,
+ const GstCaps * decode_caps);
+
+GstMessage * gst_missing_encoder_message_new (GstElement * element,
+ const GstCaps * encode_caps);
+
+/*
+ * functions for use by applications when dealing with missing-plugin messages
+ */
+
+gchar * gst_missing_plugin_message_get_installer_detail (GstMessage * msg);
+
+gchar * gst_missing_plugin_message_get_description (GstMessage * msg);
+
+gboolean gst_is_missing_plugin_message (GstMessage * msg);
+
+
+/*
+ * functions for use by applications that know exactly what plugins they are
+ * missing and want to request them directly rather than just react to
+ * missing-plugin messages posted by elements such as playbin or decodebin
+ */
+
+gchar * gst_missing_uri_source_installer_detail_new (const gchar * protocol);
+
+gchar * gst_missing_uri_sink_installer_detail_new (const gchar * protocol);
+
+gchar * gst_missing_element_installer_detail_new (const gchar * factory_name);
+
+gchar * gst_missing_decoder_installer_detail_new (const GstCaps * decode_caps);
+
+gchar * gst_missing_encoder_installer_detail_new (const GstCaps * encode_caps);
+
+G_END_DECLS
+
+#endif /* __GST_PB_UTILS_MISSING_PLUGINS_H__ */
+
diff --git a/gst-libs/gst/pbutils/pbutils-marshal.list b/gst-libs/gst/pbutils/pbutils-marshal.list
new file mode 100644
index 0000000..f409996
--- /dev/null
+++ b/gst-libs/gst/pbutils/pbutils-marshal.list
@@ -0,0 +1,2 @@
+# pbutils marshallers
+VOID:POINTER,BOXED
diff --git a/gst-libs/gst/pbutils/pbutils-private.h b/gst-libs/gst/pbutils/pbutils-private.h
new file mode 100644
index 0000000..8ac6147
--- /dev/null
+++ b/gst-libs/gst/pbutils/pbutils-private.h
@@ -0,0 +1,94 @@
+/* GStreamer
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * 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.
+ */
+
+struct _GstDiscovererStreamInfo {
+ GObject parent;
+
+ GstDiscovererStreamInfo *previous; /* NULL for starting points */
+ GstDiscovererStreamInfo *next; /* NULL for containers */
+
+ GstCaps *caps;
+ GstTagList *tags;
+ GstStructure *misc;
+};
+
+struct _GstDiscovererContainerInfo {
+ GstDiscovererStreamInfo parent;
+
+ GList *streams;
+};
+
+struct _GstDiscovererAudioInfo {
+ GstDiscovererStreamInfo parent;
+
+ guint channels;
+ guint sample_rate;
+ guint depth;
+
+ guint bitrate;
+ guint max_bitrate;
+
+ gchar *language;
+};
+
+struct _GstDiscovererVideoInfo {
+ GstDiscovererStreamInfo parent;
+
+ guint width;
+ guint height;
+ guint depth;
+ guint framerate_num;
+ guint framerate_denom;
+ guint par_num;
+ guint par_denom;
+ gboolean interlaced;
+
+ guint bitrate;
+ guint max_bitrate;
+
+ gboolean is_image;
+};
+
+struct _GstDiscovererSubtitleInfo {
+ GstDiscovererStreamInfo parent;
+
+ gchar *language;
+};
+
+struct _GstDiscovererInfo {
+ GObject parent;
+
+ gchar *uri;
+ GstDiscovererResult result;
+
+ /* Sub-streams */
+ GstDiscovererStreamInfo *stream_info;
+ GList *stream_list;
+
+ /* Stream global information */
+ GstClockTime duration;
+ GstStructure *misc;
+ GstTagList *tags;
+ gboolean seekable;
+};
+
+/* missing-plugins.c */
+
+GstCaps *copy_and_clean_caps (const GstCaps * caps);
diff --git a/gst-libs/gst/pbutils/pbutils.c b/gst-libs/gst/pbutils/pbutils.c
new file mode 100644
index 0000000..8accb8d
--- /dev/null
+++ b/gst-libs/gst/pbutils/pbutils.c
@@ -0,0 +1,108 @@
+/* GStreamer base utils library
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstpbutils
+ * @short_description: General Application and Plugin Utility Library
+ *
+ * <refsect2>
+ * <para>
+ * libgstpbutils is a general utility library for plugins and applications,
+ * available since gst-plugins-base 0.10.12. It currently provides the
+ * following:
+ * </para>
+ * <itemizedlist>
+ * <listitem>
+ * <para>
+ * human-readable description strings of codecs, elements, sources, decoders,
+ * encoders, or sinks from decoder/encoder caps, element names, or protocol
+ * names.
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * support for applications to initiate installation of missing plugins (if
+ * this is supported by the distribution or operating system used)
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * API for GStreamer elements to create missing-plugin messages in order to
+ * communicate to the application that a certain type of plugin is missing
+ * (decoder, encoder, URI protocol source, URI protocol sink, named element)
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * API for applications to recognise and handle missing-plugin messages
+ * </para>
+ * </listitem>
+ * </itemizedlist>
+ * <title>Linking to this library</title>
+ * <para>
+ * You should obtain the required CFLAGS and LIBS using pkg-config on the
+ * gstreamer-plugins-base-0.10 module. You will then also need to add
+ * '-lgstpbutils-0.10' manually to your LIBS line.
+ * </para>
+ * <title>Library initialisation</title>
+ * <para>
+ * Before using any of its functions, applications and plugins must call
+ * gst_pb_utils_init() to initialise the library.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "pbutils.h"
+
+#include "gst/gst-i18n-plugin.h"
+
+/**
+ * gst_pb_utils_init:
+ *
+ * Initialises the base utils support library. This function is not
+ * thread-safe. Applications should call it after calling gst_init(),
+ * plugins should call it from their plugin_init function.
+ *
+ * This function may be called multiple times. It will do nothing if the
+ * library has already been initialised.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_pb_utils_init (void)
+{
+ static gboolean inited; /* FALSE */
+
+ if (inited) {
+ GST_LOG ("already initialised");
+ return;
+ }
+#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
+
+ inited = TRUE;
+}
diff --git a/gst-libs/gst/pbutils/pbutils.h b/gst-libs/gst/pbutils/pbutils.h
new file mode 100644
index 0000000..b9277b1
--- /dev/null
+++ b/gst-libs/gst/pbutils/pbutils.h
@@ -0,0 +1,42 @@
+/* GStreamer base utils library
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PB_UTILS_BASE_UTILS_H__
+#define __GST_PB_UTILS_BASE_UTILS_H__
+
+#include <gst/gst.h>
+
+#include <gst/pbutils/gstpluginsbaseversion.h>
+#include <gst/pbutils/descriptions.h>
+#include <gst/pbutils/missing-plugins.h>
+#include <gst/pbutils/install-plugins.h>
+#include <gst/pbutils/codec-utils.h>
+#include <gst/pbutils/pbutils-enumtypes.h>
+#include <gst/pbutils/gstdiscoverer.h>
+#include <gst/pbutils/encoding-profile.h>
+#include <gst/pbutils/encoding-target.h>
+
+G_BEGIN_DECLS
+
+void gst_pb_utils_init (void);
+
+G_END_DECLS
+
+#endif /* __GST_PB_UTILS_BASE_UTILS_H__ */
+
diff --git a/gst-libs/gst/riff/Makefile.am b/gst-libs/gst/riff/Makefile.am
new file mode 100644
index 0000000..f6e4226
--- /dev/null
+++ b/gst-libs/gst/riff/Makefile.am
@@ -0,0 +1,93 @@
+lib_LTLIBRARIES = libgstriff-@GST_MAJORMINOR@.la
+
+libgstriff_@GST_MAJORMINOR@_la_SOURCES = \
+ riff.c \
+ riff-media.c \
+ riff-read.c
+
+libgstriff_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/riff
+libgstriff_@GST_MAJORMINOR@include_HEADERS = \
+ riff-ids.h \
+ riff-media.h \
+ riff-read.h
+
+libgstriff_@GST_MAJORMINOR@_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+libgstriff_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstriff_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstRiff-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstriff_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstriff_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/riff/%',$(libgstriff_@GST_MAJORMINOR@include_HEADERS))
+
+GstRiff-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstriff-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstRiff \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ --add-include-path=$(builddir)/../tag \
+ --add-include-path=$(builddir)/../audio \
+ --add-include-path=$(builddir)/../interfaces \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstriff-@GST_MAJORMINOR@.la \
+ --include=GstAudio-@GST_MAJORMINOR@ \
+ --include=GstTag-@GST_MAJORMINOR@ \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-tag-@GST_MAJORMINOR@ \
+ --pkg gstreamer-audio-@GST_MAJORMINOR@ \
+ --pkg gstreamer-interfaces-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-riff-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=$(builddir)/../tag \
+ --includedir=$(builddir)/../audio \
+ --includedir=$(builddir)/../interfaces \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgstriff -:SHARED libgstriff-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstriff_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstriff_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstriff_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstriff_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/riff/Makefile.in b/gst-libs/gst/riff/Makefile.in
new file mode 100644
index 0000000..72dcb71
--- /dev/null
+++ b/gst-libs/gst/riff/Makefile.in
@@ -0,0 +1,930 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/riff
+DIST_COMMON = $(libgstriff_@GST_MAJORMINOR@include_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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstriff_@GST_MAJORMINOR@_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstriff_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstriff_@GST_MAJORMINOR@_la-riff.lo \
+ libgstriff_@GST_MAJORMINOR@_la-riff-media.lo \
+ libgstriff_@GST_MAJORMINOR@_la-riff-read.lo
+libgstriff_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstriff_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstriff_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstriff_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstriff_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstriff_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstriff_@GST_MAJORMINOR@include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+lib_LTLIBRARIES = libgstriff-@GST_MAJORMINOR@.la
+libgstriff_@GST_MAJORMINOR@_la_SOURCES = \
+ riff.c \
+ riff-media.c \
+ riff-read.c
+
+libgstriff_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/riff
+libgstriff_@GST_MAJORMINOR@include_HEADERS = \
+ riff-ids.h \
+ riff-media.h \
+ riff-read.h
+
+libgstriff_@GST_MAJORMINOR@_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+libgstriff_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstriff_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstRiff-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstriff_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstriff_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/riff/%',$(libgstriff_@GST_MAJORMINOR@include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_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-libs/gst/riff/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/riff/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstriff-@GST_MAJORMINOR@.la: $(libgstriff_@GST_MAJORMINOR@_la_OBJECTS) $(libgstriff_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstriff_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstriff_@GST_MAJORMINOR@_la_OBJECTS) $(libgstriff_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-media.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-read.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstriff_@GST_MAJORMINOR@_la-riff.lo: riff.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) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstriff_@GST_MAJORMINOR@_la-riff.lo -MD -MP -MF $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff.Tpo -c -o libgstriff_@GST_MAJORMINOR@_la-riff.lo `test -f 'riff.c' || echo '$(srcdir)/'`riff.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff.Tpo $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='riff.c' object='libgstriff_@GST_MAJORMINOR@_la-riff.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstriff_@GST_MAJORMINOR@_la-riff.lo `test -f 'riff.c' || echo '$(srcdir)/'`riff.c
+
+libgstriff_@GST_MAJORMINOR@_la-riff-media.lo: riff-media.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) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstriff_@GST_MAJORMINOR@_la-riff-media.lo -MD -MP -MF $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-media.Tpo -c -o libgstriff_@GST_MAJORMINOR@_la-riff-media.lo `test -f 'riff-media.c' || echo '$(srcdir)/'`riff-media.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-media.Tpo $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-media.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='riff-media.c' object='libgstriff_@GST_MAJORMINOR@_la-riff-media.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstriff_@GST_MAJORMINOR@_la-riff-media.lo `test -f 'riff-media.c' || echo '$(srcdir)/'`riff-media.c
+
+libgstriff_@GST_MAJORMINOR@_la-riff-read.lo: riff-read.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) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstriff_@GST_MAJORMINOR@_la-riff-read.lo -MD -MP -MF $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-read.Tpo -c -o libgstriff_@GST_MAJORMINOR@_la-riff-read.lo `test -f 'riff-read.c' || echo '$(srcdir)/'`riff-read.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-read.Tpo $(DEPDIR)/libgstriff_@GST_MAJORMINOR@_la-riff-read.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='riff-read.c' object='libgstriff_@GST_MAJORMINOR@_la-riff-read.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstriff_@GST_MAJORMINOR@_la-riff-read.lo `test -f 'riff-read.c' || echo '$(srcdir)/'`riff-read.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstriff_@GST_MAJORMINOR@includeHEADERS: $(libgstriff_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstriff_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstriff_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstriff_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstriff_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstriff_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstriff_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstriff_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstriff_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstriff_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstriff_@GST_MAJORMINOR@includeHEADERS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstriff_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstRiff-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstriff-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstRiff \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(builddir)/../tag \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(builddir)/../audio \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(builddir)/../interfaces \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstriff-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=GstAudio-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstTag-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-tag-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-audio-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-interfaces-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-riff-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/../tag \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/../audio \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/../interfaces \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgstriff -:SHARED libgstriff-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstriff_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstriff_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstriff_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstriff_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstriff_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/riff/riff-ids.h b/gst-libs/gst/riff/riff-ids.h
new file mode 100644
index 0000000..8771d2e
--- /dev/null
+++ b/gst-libs/gst/riff/riff-ids.h
@@ -0,0 +1,517 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff-ids.h: RIFF IDs and structs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RIFF_IDS_H__
+#define __GST_RIFF_IDS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* RIFF types */
+#define GST_RIFF_RIFF_WAVE GST_MAKE_FOURCC ('W','A','V','E')
+#define GST_RIFF_RIFF_AVI GST_MAKE_FOURCC ('A','V','I',' ')
+#define GST_RIFF_RIFF_CDXA GST_MAKE_FOURCC ('C','D','X','A')
+
+/* tags */
+#define GST_RIFF_TAG_RIFF GST_MAKE_FOURCC ('R','I','F','F')
+#define GST_RIFF_TAG_AVF0 GST_MAKE_FOURCC ('A','V','F','0')
+#define GST_RIFF_TAG_RIFX GST_MAKE_FOURCC ('R','I','F','X')
+#define GST_RIFF_TAG_LIST GST_MAKE_FOURCC ('L','I','S','T')
+#define GST_RIFF_TAG_avih GST_MAKE_FOURCC ('a','v','i','h')
+#define GST_RIFF_TAG_strd GST_MAKE_FOURCC ('s','t','r','d')
+#define GST_RIFF_TAG_strn GST_MAKE_FOURCC ('s','t','r','n')
+#define GST_RIFF_TAG_strh GST_MAKE_FOURCC ('s','t','r','h')
+#define GST_RIFF_TAG_strf GST_MAKE_FOURCC ('s','t','r','f')
+#define GST_RIFF_TAG_vedt GST_MAKE_FOURCC ('v','e','d','t')
+#define GST_RIFF_TAG_JUNK GST_MAKE_FOURCC ('J','U','N','K')
+#define GST_RIFF_TAG_JUNQ GST_MAKE_FOURCC ('J','U','N','Q')
+#define GST_RIFF_TAG_idx1 GST_MAKE_FOURCC ('i','d','x','1')
+#define GST_RIFF_TAG_dmlh GST_MAKE_FOURCC ('d','m','l','h')
+/* WAV stuff */
+#define GST_RIFF_TAG_fmt GST_MAKE_FOURCC ('f','m','t',' ')
+#define GST_RIFF_TAG_data GST_MAKE_FOURCC ('d','a','t','a')
+#define GST_RIFF_TAG_plst GST_MAKE_FOURCC ('p','l','s','t')
+#define GST_RIFF_TAG_cue GST_MAKE_FOURCC ('c','u','e',' ')
+#define GST_RIFF_TAG_bext GST_MAKE_FOURCC ('b','e','x','t')
+#define GST_RIFF_TAG_BEXT GST_MAKE_FOURCC ('B','E','X','T')
+#define GST_RIFF_TAG_fact GST_MAKE_FOURCC ('f','a','c','t')
+#define GST_RIFF_TAG_acid GST_MAKE_FOURCC ('a','c','i','d')
+
+/* LIST types */
+#define GST_RIFF_LIST_movi GST_MAKE_FOURCC ('m','o','v','i')
+#define GST_RIFF_LIST_hdrl GST_MAKE_FOURCC ('h','d','r','l')
+#define GST_RIFF_LIST_odml GST_MAKE_FOURCC ('o','d','m','l')
+#define GST_RIFF_LIST_strl GST_MAKE_FOURCC ('s','t','r','l')
+#define GST_RIFF_LIST_INFO GST_MAKE_FOURCC ('I','N','F','O')
+#define GST_RIFF_LIST_AVIX GST_MAKE_FOURCC ('A','V','I','X')
+#define GST_RIFF_LIST_adtl GST_MAKE_FOURCC ('a','d','t','l')
+
+/* fcc types */
+#define GST_RIFF_FCC_vids GST_MAKE_FOURCC ('v','i','d','s')
+#define GST_RIFF_FCC_auds GST_MAKE_FOURCC ('a','u','d','s')
+#define GST_RIFF_FCC_pads GST_MAKE_FOURCC ('p','a','d','s')
+#define GST_RIFF_FCC_txts GST_MAKE_FOURCC ('t','x','t','s')
+#define GST_RIFF_FCC_vidc GST_MAKE_FOURCC ('v','i','d','c')
+#define GST_RIFF_FCC_iavs GST_MAKE_FOURCC ('i','a','v','s')
+/* fcc handlers */
+#define GST_RIFF_FCCH_RLE GST_MAKE_FOURCC ('R','L','E',' ')
+#define GST_RIFF_FCCH_msvc GST_MAKE_FOURCC ('m','s','v','c')
+#define GST_RIFF_FCCH_MSVC GST_MAKE_FOURCC ('M','S','V','C')
+
+/* INFO types - see http://www.saettler.com/RIFFMCI/riffmci.html */
+#define GST_RIFF_INFO_IARL GST_MAKE_FOURCC ('I','A','R','L') /* location */
+#define GST_RIFF_INFO_IART GST_MAKE_FOURCC ('I','A','R','T') /* artist */
+#define GST_RIFF_INFO_ICMS GST_MAKE_FOURCC ('I','C','M','S') /* commissioned */
+#define GST_RIFF_INFO_ICMT GST_MAKE_FOURCC ('I','C','M','T') /* comment */
+#define GST_RIFF_INFO_ICOP GST_MAKE_FOURCC ('I','C','O','P') /* copyright */
+#define GST_RIFF_INFO_ICRD GST_MAKE_FOURCC ('I','C','R','D') /* creation date */
+#define GST_RIFF_INFO_ICRP GST_MAKE_FOURCC ('I','C','R','P') /* cropped */
+#define GST_RIFF_INFO_IDIM GST_MAKE_FOURCC ('I','D','I','M') /* dimensions */
+#define GST_RIFF_INFO_IDPI GST_MAKE_FOURCC ('I','D','P','I') /* dots-per-inch */
+#define GST_RIFF_INFO_IENG GST_MAKE_FOURCC ('I','E','N','G') /* engineer(s) */
+#define GST_RIFF_INFO_IGNR GST_MAKE_FOURCC ('I','G','N','R') /* genre */
+#define GST_RIFF_INFO_IKEY GST_MAKE_FOURCC ('I','K','E','Y') /* keywords */
+#define GST_RIFF_INFO_ILGT GST_MAKE_FOURCC ('I','L','G','T') /* lightness */
+#define GST_RIFF_INFO_IMED GST_MAKE_FOURCC ('I','M','E','D') /* medium */
+#define GST_RIFF_INFO_INAM GST_MAKE_FOURCC ('I','N','A','M') /* name */
+#define GST_RIFF_INFO_IPLT GST_MAKE_FOURCC ('I','P','L','T') /* palette setting */
+#define GST_RIFF_INFO_IPRD GST_MAKE_FOURCC ('I','P','R','D') /* product */
+#define GST_RIFF_INFO_ISBJ GST_MAKE_FOURCC ('I','S','B','J') /* subject */
+#define GST_RIFF_INFO_ISFT GST_MAKE_FOURCC ('I','S','F','T') /* software */
+#define GST_RIFF_INFO_ISHP GST_MAKE_FOURCC ('I','S','H','P') /* sharpness */
+#define GST_RIFF_INFO_ISRC GST_MAKE_FOURCC ('I','S','R','C') /* source */
+#define GST_RIFF_INFO_ISRF GST_MAKE_FOURCC ('I','S','R','F') /* source form */
+#define GST_RIFF_INFO_ITCH GST_MAKE_FOURCC ('I','T','C','H') /* technician(s) */
+
+/*********Chunk Names***************/
+#define GST_RIFF_FF00 GST_MAKE_FOURCC (0xFF,0xFF,0x00,0x00)
+#define GST_RIFF_00 GST_MAKE_FOURCC ('0', '0',0x00,0x00)
+#define GST_RIFF_01 GST_MAKE_FOURCC ('0', '1',0x00,0x00)
+#define GST_RIFF_02 GST_MAKE_FOURCC ('0', '2',0x00,0x00)
+#define GST_RIFF_03 GST_MAKE_FOURCC ('0', '3',0x00,0x00)
+#define GST_RIFF_04 GST_MAKE_FOURCC ('0', '4',0x00,0x00)
+#define GST_RIFF_05 GST_MAKE_FOURCC ('0', '5',0x00,0x00)
+#define GST_RIFF_06 GST_MAKE_FOURCC ('0', '6',0x00,0x00)
+#define GST_RIFF_07 GST_MAKE_FOURCC ('0', '7',0x00,0x00)
+#define GST_RIFF_00pc GST_MAKE_FOURCC ('0', '0', 'p', 'c')
+#define GST_RIFF_01pc GST_MAKE_FOURCC ('0', '1', 'p', 'c')
+#define GST_RIFF_00dc GST_MAKE_FOURCC ('0', '0', 'd', 'c')
+#define GST_RIFF_00dx GST_MAKE_FOURCC ('0', '0', 'd', 'x')
+#define GST_RIFF_00db GST_MAKE_FOURCC ('0', '0', 'd', 'b')
+#define GST_RIFF_00xx GST_MAKE_FOURCC ('0', '0', 'x', 'x')
+#define GST_RIFF_00id GST_MAKE_FOURCC ('0', '0', 'i', 'd')
+#define GST_RIFF_00rt GST_MAKE_FOURCC ('0', '0', 'r', 't')
+#define GST_RIFF_0021 GST_MAKE_FOURCC ('0', '0', '2', '1')
+#define GST_RIFF_00iv GST_MAKE_FOURCC ('0', '0', 'i', 'v')
+#define GST_RIFF_0031 GST_MAKE_FOURCC ('0', '0', '3', '1')
+#define GST_RIFF_0032 GST_MAKE_FOURCC ('0', '0', '3', '2')
+#define GST_RIFF_00vc GST_MAKE_FOURCC ('0', '0', 'v', 'c')
+#define GST_RIFF_00xm GST_MAKE_FOURCC ('0', '0', 'x', 'm')
+#define GST_RIFF_01wb GST_MAKE_FOURCC ('0', '1', 'w', 'b')
+#define GST_RIFF_01dc GST_MAKE_FOURCC ('0', '1', 'd', 'c')
+#define GST_RIFF_00__ GST_MAKE_FOURCC ('0', '0', '_', '_')
+
+/*********VIDEO CODECS**************/
+#define GST_RIFF_cram GST_MAKE_FOURCC ('c', 'r', 'a', 'm')
+#define GST_RIFF_CRAM GST_MAKE_FOURCC ('C', 'R', 'A', 'M')
+#define GST_RIFF_wham GST_MAKE_FOURCC ('w', 'h', 'a', 'm')
+#define GST_RIFF_WHAM GST_MAKE_FOURCC ('W', 'H', 'A', 'M')
+#define GST_RIFF_rgb GST_MAKE_FOURCC (0x00,0x00,0x00,0x00)
+#define GST_RIFF_RGB GST_MAKE_FOURCC ('R', 'G', 'B', ' ')
+#define GST_RIFF_RAW GST_MAKE_FOURCC ('R', 'A', 'W', ' ')
+#define GST_RIFF_DIB GST_MAKE_FOURCC ('D', 'I', 'B', ' ')
+#define GST_RIFF_rle8 GST_MAKE_FOURCC (0x01,0x00,0x00,0x00)
+#define GST_RIFF_RLE8 GST_MAKE_FOURCC ('R', 'L', 'E', '8')
+#define GST_RIFF_rle4 GST_MAKE_FOURCC (0x02,0x00,0x00,0x00)
+#define GST_RIFF_RLE4 GST_MAKE_FOURCC ('R', 'L', 'E', '4')
+#define GST_RIFF_none GST_MAKE_FOURCC (0x00,0x00,0xFF,0xFF)
+#define GST_RIFF_NONE GST_MAKE_FOURCC ('N', 'O', 'N', 'E')
+#define GST_RIFF_pack GST_MAKE_FOURCC (0x01,0x00,0xFF,0xFF)
+#define GST_RIFF_PACK GST_MAKE_FOURCC ('P', 'A', 'C', 'K')
+#define GST_RIFF_tran GST_MAKE_FOURCC (0x02,0x00,0xFF,0xFF)
+#define GST_RIFF_TRAN GST_MAKE_FOURCC ('T', 'R', 'A', 'N')
+#define GST_RIFF_ccc GST_MAKE_FOURCC (0x03,0x00,0xFF,0xFF)
+#define GST_RIFF_CCC GST_MAKE_FOURCC ('C', 'C', 'C', ' ')
+#define GST_RIFF_cyuv GST_MAKE_FOURCC ('c', 'y', 'u', 'v')
+#define GST_RIFF_CYUV GST_MAKE_FOURCC ('C', 'Y', 'U', 'V')
+#define GST_RIFF_jpeg GST_MAKE_FOURCC (0x04,0x00,0xFF,0xFF)
+#define GST_RIFF_JPEG GST_MAKE_FOURCC ('J', 'P', 'E', 'G')
+#define GST_RIFF_MJPG GST_MAKE_FOURCC ('M', 'J', 'P', 'G')
+#define GST_RIFF_mJPG GST_MAKE_FOURCC ('m', 'J', 'P', 'G')
+#define GST_RIFF_IJPG GST_MAKE_FOURCC ('I', 'J', 'P', 'G')
+#define GST_RIFF_rt21 GST_MAKE_FOURCC ('r', 't', '2', '1')
+#define GST_RIFF_RT21 GST_MAKE_FOURCC ('R', 'T', '2', '1')
+#define GST_RIFF_iv31 GST_MAKE_FOURCC ('i', 'v', '3', '1')
+#define GST_RIFF_IV31 GST_MAKE_FOURCC ('I', 'V', '3', '1')
+#define GST_RIFF_iv32 GST_MAKE_FOURCC ('i', 'v', '3', '2')
+#define GST_RIFF_IV32 GST_MAKE_FOURCC ('I', 'V', '3', '2')
+#define GST_RIFF_iv41 GST_MAKE_FOURCC ('i', 'v', '4', '1')
+#define GST_RIFF_IV41 GST_MAKE_FOURCC ('I', 'V', '4', '1')
+#define GST_RIFF_iv50 GST_MAKE_FOURCC ('i', 'v', '5', '0')
+#define GST_RIFF_IV50 GST_MAKE_FOURCC ('I', 'V', '5', '0')
+#define GST_RIFF_cvid GST_MAKE_FOURCC ('c', 'v', 'i', 'd')
+#define GST_RIFF_CVID GST_MAKE_FOURCC ('C', 'V', 'I', 'D')
+#define GST_RIFF_ULTI GST_MAKE_FOURCC ('U', 'L', 'T', 'I')
+#define GST_RIFF_ulti GST_MAKE_FOURCC ('u', 'l', 't', 'i')
+#define GST_RIFF_YUV9 GST_MAKE_FOURCC ('Y', 'V', 'U', '9')
+#define GST_RIFF_YVU9 GST_MAKE_FOURCC ('Y', 'U', 'V', '9')
+#define GST_RIFF_XMPG GST_MAKE_FOURCC ('X', 'M', 'P', 'G')
+#define GST_RIFF_xmpg GST_MAKE_FOURCC ('x', 'm', 'p', 'g')
+#define GST_RIFF_VDOW GST_MAKE_FOURCC ('V', 'D', 'O', 'W')
+#define GST_RIFF_MVI1 GST_MAKE_FOURCC ('M', 'V', 'I', '1')
+#define GST_RIFF_v422 GST_MAKE_FOURCC ('v', '4', '2', '2')
+#define GST_RIFF_V422 GST_MAKE_FOURCC ('V', '4', '2', '2')
+#define GST_RIFF_mvi1 GST_MAKE_FOURCC ('m', 'v', 'i', '1')
+#define GST_RIFF_MPIX GST_MAKE_FOURCC (0x04,0x00, 'i', '1') /* MotionPixels munged their id */
+#define GST_RIFF_AURA GST_MAKE_FOURCC ('A', 'U', 'R', 'A')
+#define GST_RIFF_DMB1 GST_MAKE_FOURCC ('D', 'M', 'B', '1')
+#define GST_RIFF_dmb1 GST_MAKE_FOURCC ('d', 'm', 'b', '1')
+
+#define GST_RIFF_BW10 GST_MAKE_FOURCC ('B', 'W', '1', '0')
+#define GST_RIFF_bw10 GST_MAKE_FOURCC ('b', 'w', '1', '0')
+
+#define GST_RIFF_yuy2 GST_MAKE_FOURCC ('y', 'u', 'y', '2')
+#define GST_RIFF_YUY2 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2')
+#define GST_RIFF_YUV8 GST_MAKE_FOURCC ('Y', 'U', 'V', '8')
+#define GST_RIFF_WINX GST_MAKE_FOURCC ('W', 'I', 'N', 'X')
+#define GST_RIFF_WPY2 GST_MAKE_FOURCC ('W', 'P', 'Y', '2')
+#define GST_RIFF_m263 GST_MAKE_FOURCC ('m', '2', '6', '3')
+#define GST_RIFF_M263 GST_MAKE_FOURCC ('M', '2', '6', '3')
+#define GST_RIFF_H263 GST_MAKE_FOURCC ('H', '2', '6', '3')
+#define GST_RIFF_h263 GST_MAKE_FOURCC ('h', '2', '6', '3')
+#define GST_RIFF_i263 GST_MAKE_FOURCC ('i', '2', '6', '3')
+#define GST_RIFF_L263 GST_MAKE_FOURCC ('L', '2', '6', '3')
+#define GST_RIFF_x263 GST_MAKE_FOURCC ('x', '2', '6', '3')
+#define GST_RIFF_VSSH GST_MAKE_FOURCC ( 'V', 'S', 'S', 'H') /* H2.64 */
+
+#define GST_RIFF_Q1_0 GST_MAKE_FOURCC ('Q', '1',0x2e, '0')
+#define GST_RIFF_SFMC GST_MAKE_FOURCC ('S', 'F', 'M', 'C')
+
+#define GST_RIFF_y41p GST_MAKE_FOURCC ('y', '4', '1', 'p')
+#define GST_RIFF_Y41P GST_MAKE_FOURCC ('Y', '4', '1', 'P')
+#define GST_RIFF_yv12 GST_MAKE_FOURCC ('y', 'v', '1', '2')
+#define GST_RIFF_YV12 GST_MAKE_FOURCC ('Y', 'V', '1', '2')
+#define GST_RIFF_vixl GST_MAKE_FOURCC ('v', 'i', 'x', 'l')
+#define GST_RIFF_VIXL GST_MAKE_FOURCC ('V', 'I', 'X', 'L')
+#define GST_RIFF_iyuv GST_MAKE_FOURCC ('i', 'y', 'u', 'v')
+#define GST_RIFF_IYUV GST_MAKE_FOURCC ('I', 'Y', 'U', 'V')
+#define GST_RIFF_i420 GST_MAKE_FOURCC ('i', '4', '2', '0')
+#define GST_RIFF_I420 GST_MAKE_FOURCC ('I', '4', '2', '0')
+#define GST_RIFF_vyuy GST_MAKE_FOURCC ('v', 'y', 'u', 'y')
+#define GST_RIFF_VYUY GST_MAKE_FOURCC ('V', 'Y', 'U', 'Y')
+
+#define GST_RIFF_DIV3 GST_MAKE_FOURCC ('D', 'I', 'V', '3')
+
+#define GST_RIFF_rpza GST_MAKE_FOURCC ('r', 'p', 'z', 'a')
+/* And this here's the mistakes that need to be supported */
+#define GST_RIFF_azpr GST_MAKE_FOURCC ('a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */
+
+/*********** FND in MJPG **********/
+#define GST_RIFF_ISFT GST_MAKE_FOURCC ('I', 'S', 'F', 'T')
+#define GST_RIFF_IDIT GST_MAKE_FOURCC ('I', 'D', 'I', 'T')
+
+#define GST_RIFF_00AM GST_MAKE_FOURCC ('0', '0', 'A', 'M')
+#define GST_RIFF_DISP GST_MAKE_FOURCC ('D', 'I', 'S', 'P')
+#define GST_RIFF_ISBJ GST_MAKE_FOURCC ('I', 'S', 'B', 'J')
+
+#define GST_RIFF_rec GST_MAKE_FOURCC ('r', 'e', 'c', ' ')
+
+/* common data structures */
+typedef struct _gst_riff_strh {
+ guint32 type; /* stream type */
+ guint32 fcc_handler; /* fcc_handler */
+ guint32 flags;
+/* flags values */
+#define GST_RIFF_STRH_DISABLED 0x000000001
+#define GST_RIFF_STRH_VIDEOPALCHANGES 0x000010000
+ guint32 priority;
+ guint32 init_frames; /* initial frames (???) */
+ guint32 scale;
+ guint32 rate;
+ guint32 start;
+ guint32 length;
+ guint32 bufsize; /* suggested buffer size */
+ guint32 quality;
+ guint32 samplesize;
+ /* rcFrame, RECT structure(struct of 4 shorts)
+ gint32 left;
+ gint32 top;
+ gint32 right;
+ gint32 bottom;
+ */
+} gst_riff_strh;
+
+typedef struct _gst_riff_strf_vids { /* == BitMapInfoHeader */
+ guint32 size;
+ guint32 width;
+ guint32 height;
+ guint16 planes;
+ guint16 bit_cnt;
+ guint32 compression;
+ guint32 image_size;
+ guint32 xpels_meter;
+ guint32 ypels_meter;
+ guint32 num_colors; /* used colors */
+ guint32 imp_colors; /* important colors */
+ /* may be more for some codecs */
+} gst_riff_strf_vids;
+
+
+typedef struct _gst_riff_strf_auds { /* == WaveHeader (?) */
+ guint16 format;
+/**** from public Microsoft RIFF docs ******/
+#define GST_RIFF_WAVE_FORMAT_UNKNOWN (0x0000)
+#define GST_RIFF_WAVE_FORMAT_PCM (0x0001)
+#define GST_RIFF_WAVE_FORMAT_ADPCM (0x0002)
+#define GST_RIFF_WAVE_FORMAT_IEEE_FLOAT (0x0003)
+#define GST_RIFF_WAVE_FORMAT_VSELP (0x0004)
+#define GST_RIFF_WAVE_FORMAT_IBM_CVSD (0x0005)
+#define GST_RIFF_WAVE_FORMAT_ALAW (0x0006)
+#define GST_RIFF_WAVE_FORMAT_MULAW (0x0007)
+#define GST_RIFF_WAVE_FORMAT_WMS (0x000a) /* WMS Windows Media Audio Speech */
+#define GST_RIFF_WAVE_FORMAT_OKI_ADPCM (0x0010)
+#define GST_RIFF_WAVE_FORMAT_DVI_ADPCM (0x0011)
+#define GST_RIFF_WAVE_FORMAT_MEDIASPACE_ADPCM (0x0012)
+#define GST_RIFF_WAVE_FORMAT_SIERRA_ADPCM (0x0013)
+#define GST_RIFF_WAVE_FORMAT_G723_ADPCM (0x0014)
+#define GST_RIFF_WAVE_FORMAT_DIGISTD (0x0015)
+#define GST_RIFF_WAVE_FORMAT_DIGIFIX (0x0016)
+#define GST_RIFF_WAVE_FORMAT_DIALOGIC_OKI_ADPCM (0x0017)
+#define GST_RIFF_WAVE_FORMAT_MEDIAVISION_ADPCM (0x0018)
+#define GST_RIFF_WAVE_FORMAT_CU_CODEC (0x0019)
+#define GST_RIFF_WAVE_FORMAT_YAMAHA_ADPCM (0x0020)
+#define GST_RIFF_WAVE_FORMAT_SONARC (0x0021)
+#define GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH (0x0022)
+#define GST_RIFF_WAVE_FORMAT_ECHOSC1 (0x0023)
+#define GST_RIFF_WAVE_FORMAT_AUDIOFILE_AF36 (0x0024)
+#define GST_RIFF_WAVE_FORMAT_APTX (0x0025)
+#define GST_RIFF_WAVE_FORMAT_AUDIOFILE_AF10 (0x0026)
+#define GST_RIFF_WAVE_FORMAT_PROSODY_1612 (0x0027)
+#define GST_RIFF_WAVE_FORMAT_LRC (0x0028)
+#define GST_RIFF_WAVE_FORMAT_DOLBY_AC2 (0x0030)
+#define GST_RIFF_WAVE_FORMAT_GSM610 (0x0031)
+#define GST_RIFF_WAVE_FORMAT_MSN (0x0032)
+#define GST_RIFF_WAVE_FORMAT_ANTEX_ADPCME (0x0033
+#define GST_RIFF_WAVE_FORMAT_CONTROL_RES_VQLPC (0x0034)
+#define GST_RIFF_WAVE_FORMAT_DIGIREAL (0x0035)
+#define GST_RIFF_WAVE_FORMAT_DIGIADPCM (0x0036)
+#define GST_RIFF_WAVE_FORMAT_CONTROL_RES_CR10 (0x0037)
+#define GST_RIFF_WAVE_FORMAT_NMS_VBXADPCM (0x0038)
+#define GST_RIFF_WAVE_FORMAT_CS_IMAADPCM (0x0039)
+#define GST_RIFF_WAVE_FORMAT_ECHOSC3 (0x003A)
+#define GST_RIFF_WAVE_FORMAT_ROCKWELL_ADPCM (0x003B)
+#define GST_RIFF_WAVE_FORMAT_ROCKWELL_DIGITALK (0x003C)
+#define GST_RIFF_WAVE_FORMAT_XEBEC (0x003D)
+#define GST_RIFF_WAVE_FORMAT_ITU_G721_ADPCM (0x0040)
+#define GST_RIFF_WAVE_FORMAT_G728_CELP (0x0041)
+#define GST_RIFF_WAVE_FORMAT_MSG723 (0x0042)
+#define GST_RIFF_WAVE_FORMAT_MPEGL12 (0x0050)
+#define GST_RIFF_WAVE_FORMAT_RT24 (0x0052)
+#define GST_RIFF_WAVE_FORMAT_PAC (0x0053)
+#define GST_RIFF_WAVE_FORMAT_MPEGL3 (0x0055)
+#define GST_RIFF_WAVE_FORMAT_AMR_NB (0x0057)
+#define GST_RIFF_WAVE_FORMAT_AMR_WB (0x0058)
+#define GST_RIFF_WAVE_FORMAT_LUCENT_G723 (0x0059)
+#define GST_RIFF_WAVE_FORMAT_CIRRUS (0x0060)
+#define GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4 (0x0061) /* not official */
+#define GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3 (0x0062) /* not official */
+/* FIXME: where are these from? are they used at all? */
+#if 0
+#define GST_RIFF_WAVE_FORMAT_ESPCM (0x0061)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE (0x0062)
+#endif
+#define GST_RIFF_WAVE_FORMAT_CANOPUS_ATRAC (0x0063)
+#define GST_RIFF_WAVE_FORMAT_G726_ADPCM (0x0064)
+#define GST_RIFF_WAVE_FORMAT_G722_ADPCM (0x0065)
+#define GST_RIFF_WAVE_FORMAT_DSAT_DISPLAY (0x0067)
+#define GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV (0x0069)
+/* FIXME: where are these from? are they used at all? */
+#if 0
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_BYTE_ALIGNED (0x0069)
+#endif
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_AC8 (0x0070)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_AC10 (0x0071)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_AC16 (0x0072)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_AC20 (0x0073)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_METAVOICE (0x0074)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND (0x0075)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_RT29HW (0x0076)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_VR12 (0x0077)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_VR18 (0x0078)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_TQ40 (0x0079)
+#define GST_RIFF_WAVE_FORMAT_SOFTSOUND (0x0080)
+#define GST_RIFF_WAVE_FORMAT_VOXWARE_TQ60 (0x0081)
+#define GST_RIFF_WAVE_FORMAT_MSRT24 (0x0082)
+#define GST_RIFF_WAVE_FORMAT_G729A (0x0083)
+#define GST_RIFF_WAVE_FORMAT_MVI_MVI2 (0x0084)
+#define GST_RIFF_WAVE_FORMAT_DF_G726 (0x0085)
+#define GST_RIFF_WAVE_FORMAT_DF_GSM610 (0x0086)
+#define GST_RIFF_WAVE_FORMAT_ISIAUDIO (0x0088)
+#define GST_RIFF_WAVE_FORMAT_ONLIVE (0x0089)
+#define GST_RIFF_WAVE_FORMAT_SBC24 (0x0091)
+#define GST_RIFF_WAVE_FORMAT_DOLBY_AC3_SPDIF (0x0092)
+#define GST_RIFF_WAVE_FORMAT_MEDIASONIC_G723 (0x0093)
+#define GST_RIFF_WAVE_FORMAT_PROSODY_8KBPS (0x0094)
+#define GST_RIFF_WAVE_FORMAT_ZYXEL_ADPCM (0x0097)
+#define GST_RIFF_WAVE_FORMAT_PHILIPS_LPCBB (0x0098)
+#define GST_RIFF_WAVE_FORMAT_PACKED (0x0099)
+#define GST_RIFF_WAVE_FORMAT_MALDEN_PHONYTALK (0x00A0)
+#define GST_RIFF_WAVE_FORMAT_AAC (0x00ff)
+#define GST_RIFF_WAVE_FORMAT_RHETOREX_ADPCM (0x0100)
+#define GST_RIFF_IBM_FORMAT_MULAW (0x0101)
+#define GST_RIFF_IBM_FORMAT_ALAW (0x0102)
+#define GST_RIFF_IBM_FORMAT_ADPCM (0x0103)
+#define GST_RIFF_WAVE_FORMAT_VIVO_G723 (0x0111)
+#define GST_RIFF_WAVE_FORMAT_VIVO_SIREN (0x0112)
+#define GST_RIFF_WAVE_FORMAT_DIGITAL_G723 (0x0123)
+#define GST_RIFF_WAVE_FORMAT_SANYO_LD_ADPCM (0x0125)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_ACEPLNET (0x0130)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_ACELP4800 (0x0131)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_ACELP8V3 (0x0132)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_G729 (0x0133)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_G729A (0x0134)
+#define GST_RIFF_WAVE_FORMAT_SIPROLAB_KELVIN (0x0135)
+#define GST_RIFF_WAVE_FORMAT_G726ADPCM (0x0140)
+#define GST_RIFF_WAVE_FORMAT_QUALCOMM_PUREVOICE (0x0150)
+#define GST_RIFF_WAVE_FORMAT_QUALCOMM_HALFRATE (0x0151)
+#define GST_RIFF_WAVE_FORMAT_TUBGSM (0x0155)
+#define GST_RIFF_WAVE_FORMAT_WMAV1 (0x0160)
+#define GST_RIFF_WAVE_FORMAT_WMAV2 (0x0161)
+#define GST_RIFF_WAVE_FORMAT_WMAV3 (0x0162)
+#define GST_RIFF_WAVE_FORMAT_WMAV3_L (0x0163)
+#define GST_RIFF_WAVE_FORMAT_CREATIVE_ADPCM (0x0200)
+#define GST_RIFF_WAVE_FORMAT_CREATIVE_FASTSPEECH8 (0x0202)
+#define GST_RIFF_WAVE_FORMAT_CREATIVE_FASTSPEECH10 (0x0203)
+#define GST_RIFF_WAVE_FORMAT_UHER_ADPCM (0x0210)
+#define GST_RIFF_WAVE_FORMAT_QUARTERDECK (0x0220)
+#define GST_RIFF_WAVE_FORMAT_ILINK_VC (0x0230)
+#define GST_RIFF_WAVE_FORMAT_RAW_SPORT (0x0240)
+#define GST_RIFF_WAVE_FORMAT_IPI_HSX (0x0250)
+#define GST_RIFF_WAVE_FORMAT_IPI_RPELP (0x0251)
+#define GST_RIFF_WAVE_FORMAT_CS2 (0x0260)
+#define GST_RIFF_WAVE_FORMAT_SONY_ATRAC3 (0x0270)
+#define GST_RIFF_WAVE_FORMAT_SIREN (0x028E)
+#define GST_RIFF_WAVE_FORMAT_FM_TOWNS_SND (0x0300)
+#define GST_RIFF_WAVE_FORMAT_BTV_DIGITAL (0x0400)
+#define GST_RIFF_WAVE_FORMAT_IMC (0x0401)
+#define GST_RIFF_WAVE_FORMAT_QDESIGN_MUSIC (0x0450)
+#define GST_RIFF_WAVE_FORMAT_VME_VMPCM (0x0680)
+#define GST_RIFF_WAVE_FORMAT_TPC (0x0681)
+#define GST_RIFF_WAVE_FORMAT_OLIGSM (0x1000)
+#define GST_RIFF_WAVE_FORMAT_OLIADPCM (0x1001)
+#define GST_RIFF_WAVE_FORMAT_OLICELP (0x1002)
+#define GST_RIFF_WAVE_FORMAT_OLISBC (0x1003)
+#define GST_RIFF_WAVE_FORMAT_OLIOPR (0x1004)
+#define GST_RIFF_WAVE_FORMAT_LH_CODEC (0x1100)
+#define GST_RIFF_WAVE_FORMAT_NORRIS (0x1400)
+#define GST_RIFF_WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS (0x1500)
+#define GST_RIFF_WAVE_FORMAT_A52 (0x2000)
+#define GST_RIFF_WAVE_FORMAT_DTS (0x2001)
+#define GST_RIFF_WAVE_FORMAT_SONIC (0x2048)
+#define GST_RIFF_WAVE_FORMAT_SONIC_LS (0x2048)
+#define GST_RIFF_WAVE_FORMAT_AAC_AC (0x4143)
+#define GST_RIFF_WAVE_FORMAT_VORBIS1 (0x674f)
+#define GST_RIFF_WAVE_FORMAT_VORBIS2 (0x6750)
+#define GST_RIFF_WAVE_FORMAT_VORBIS3 (0x6751)
+#define GST_RIFF_WAVE_FORMAT_VORBIS1PLUS (0x676f)
+#define GST_RIFF_WAVE_FORMAT_VORBIS2PLUS (0x6770)
+#define GST_RIFF_WAVE_FORMAT_VORBIS3PLUS (0x6771)
+#define GST_RIFF_WAVE_FORMAT_AAC_pm (0x706d)
+#define GST_RIFF_WAVE_FORMAT_GSM_AMR_CBR (0x7A21)
+#define GST_RIFF_WAVE_FORMAT_GSM_AMR_VBR (0x7A22)
+#define GST_RIFF_WAVE_FORMAT_FLAC (0xF1AC)
+#define GST_RIFF_WAVE_FORMAT_EXTENSIBLE (0xFFFE)
+ guint16 channels;
+ guint32 rate;
+ guint32 av_bps;
+ guint16 blockalign;
+#if 0
+ /* missing field: */
+ guint16 bits_per_sample;
+#endif
+ guint16 size;
+} gst_riff_strf_auds;
+
+typedef struct _gst_riff_strf_iavs {
+ guint32 DVAAuxSrc;
+ guint32 DVAAuxCtl;
+ guint32 DVAAuxSrc1;
+ guint32 DVAAuxCtl1;
+ guint32 DVVAuxSrc;
+ guint32 DVVAuxCtl;
+ guint32 DVReserved1;
+ guint32 DVReserved2;
+} gst_riff_strf_iavs;
+
+typedef struct _gst_riff_index_entry {
+ guint32 id;
+ guint32 flags;
+#define GST_RIFF_IF_LIST (0x00000001L)
+#define GST_RIFF_IF_KEYFRAME (0x00000010L)
+#define GST_RIFF_IF_NO_TIME (0x00000100L)
+#define GST_RIFF_IF_COMPUSE (0x0FFF0000L)
+ guint32 offset;
+ guint32 size;
+} gst_riff_index_entry;
+
+typedef struct _gst_riff_dmlh {
+ guint32 totalframes;
+} gst_riff_dmlh;
+
+/* taken from libsndfile/wav.c (LGPL) */
+typedef struct _gst_riff_acid {
+ /* 4 bytes (int) type of file:
+ * this appears to be a bit mask,however some combinations
+ * are probably impossible and/or qualified as "errors"
+ *
+ * 0x01 On: One Shot Off: Loop
+ * 0x02 On: Root note is Set Off: No root
+ * 0x04 On: Stretch is On, Off: Strech is OFF
+ * 0x08 On: Disk Based Off: Ram based
+ * 0x10 On: ?????????? Off: ????????? (Acidizer puts that ON)
+ */
+ guint32 loop_type;
+ /* 2 bytes (short) root note
+ * if type 0x10 is OFF : [C,C#,(...),B] -> [0x30 to 0x3B]
+ * if type 0x10 is ON : [C,C#,(...),B] -> [0x3C to 0x47]
+ * (both types fit on same MIDI pitch albeit different octaves, so who cares)
+ */
+ guint16 root_note;
+ /* 2 bytes (short) ??? always set to 0x8000
+ * 4 bytes (float) ??? seems to be always 0
+ */
+ guint16 unknown1;
+ gfloat unknown2;
+ /* 4 bytes (int) number of beats
+ * 2 bytes (short) meter denominator //always 4 in SF/ACID
+ * 2 bytes (short) meter numerator //always 4 in SF/ACID
+ * //are we sure about the order?? usually its num/denom
+ * 4 bytes (float) tempo
+ */
+ guint32 number_of_beats;
+ guint16 meter_d, meter_n;
+ gfloat tempo;
+} gst_riff_acid;
+
+G_END_DECLS
+
+#endif /* __GST_RIFF_IDS_H__ */
diff --git a/gst-libs/gst/riff/riff-media.c b/gst-libs/gst/riff/riff-media.c
new file mode 100644
index 0000000..90e7392
--- /dev/null
+++ b/gst-libs/gst/riff/riff-media.c
@@ -0,0 +1,1901 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff-media.h: RIFF-id to/from caps 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 "riff-ids.h"
+#include "riff-media.h"
+
+#include <gst/audio/audio.h>
+
+#include <string.h>
+#include <math.h>
+
+GST_DEBUG_CATEGORY_EXTERN (riff_debug);
+#define GST_CAT_DEFAULT riff_debug
+
+/**
+ * gst_riff_create_video_caps:
+ * @codec_fcc: fourCC codec for this codec.
+ * @strh: pointer to the strh stream header structure.
+ * @strf: pointer to the strf stream header structure, including any
+ * data that is within the range of strf.size, but excluding any
+ * additional data withint this chunk but outside strf.size.
+ * @strf_data: a #GstBuffer containing the additional data in the strf
+ * chunk outside reach of strf.size. Ususally a palette.
+ * @strd_data: a #GstBuffer containing the data in the strd stream header
+ * chunk. Usually codec initialization data.
+ * @codec_name: if given, will be filled with a human-readable codec name.
+ */
+
+GstCaps *
+gst_riff_create_video_caps (guint32 codec_fcc,
+ gst_riff_strh * strh, gst_riff_strf_vids * strf,
+ GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
+{
+ GstCaps *caps = NULL;
+ GstBuffer *palette = NULL;
+
+ GST_DEBUG ("video fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (codec_fcc));
+
+ switch (codec_fcc) {
+ case GST_MAKE_FOURCC ('D', 'I', 'B', ' '): /* uncompressed RGB */
+ case GST_MAKE_FOURCC (0x00, 0x00, 0x00, 0x00):
+ case GST_MAKE_FOURCC ('R', 'G', 'B', ' '):
+ case GST_MAKE_FOURCC ('R', 'A', 'W', ' '):
+ {
+ gint bpp = (strf && strf->bit_cnt != 0) ? strf->bit_cnt : 8;
+
+ if (strf) {
+ if (bpp == 8) {
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "RGB8_PALETTED", NULL);
+ } else if (bpp == 24) {
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "BGR", NULL);
+ } else if (bpp == 32) {
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "BGRx", NULL);
+ } else {
+ GST_WARNING ("Unhandled DIB RGB depth: %d", bpp);
+ return NULL;
+ }
+ } else {
+ /* for template */
+ caps =
+ gst_caps_from_string ("video/x-raw, format = (string) "
+ "{ RGB8_PALETTED, BGR, BGRx }");
+ }
+
+ palette = strf_data;
+ strf_data = NULL;
+ if (codec_name) {
+ if (bpp == 8)
+ *codec_name = g_strdup_printf ("Palettized %d-bit RGB", bpp);
+ else
+ *codec_name = g_strdup_printf ("%d-bit RGB", bpp);
+ }
+ break;
+ }
+ case GST_MAKE_FOURCC ('I', '4', '2', '0'):
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "I420", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Uncompressed planar YUV 4:2:0");
+ break;
+
+ case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
+ case GST_MAKE_FOURCC ('Y', 'U', 'N', 'V'):
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "YUY2", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
+ break;
+
+ case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'):
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "YVU9", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Uncompressed packed YVU 4:1:0");
+ break;
+
+ case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
+ case GST_MAKE_FOURCC ('2', 'v', 'u', 'y'):
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "UYVY", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
+ break;
+
+ case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "YV12", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Uncompressed packed YVU 4:2:2");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
+ case GST_MAKE_FOURCC ('A', 'V', 'R', 'n'):
+ case GST_MAKE_FOURCC ('I', 'J', 'P', 'G'):
+ case GST_MAKE_FOURCC ('i', 'j', 'p', 'g'):
+ case GST_MAKE_FOURCC ('d', 'm', 'b', '1'):
+ case GST_MAKE_FOURCC ('A', 'C', 'D', 'V'):
+ case GST_MAKE_FOURCC ('Q', 'I', 'V', 'G'):
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Motion JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('J', 'P', 'E', 'G'): /* generic (mostly RGB) MJPEG */
+ case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): /* generic (mostly RGB) MJPEG */
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("JPEG Still Image");
+ break;
+
+ case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
+ case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Miro/Pinnacle Motion JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('C', 'J', 'P', 'G'):
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Creative Webcam JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('S', 'L', 'M', 'J'):
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("SL Motion JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('J', 'P', 'G', 'L'):
+ caps = gst_caps_new_simple ("image/jpeg", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Pegasus Lossless JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('L', 'O', 'C', 'O'):
+ caps = gst_caps_new_simple ("video/x-loco", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("LOCO Lossless");
+ break;
+
+ case GST_MAKE_FOURCC ('S', 'P', '5', '3'):
+ case GST_MAKE_FOURCC ('S', 'P', '5', '4'):
+ case GST_MAKE_FOURCC ('S', 'P', '5', '5'):
+ case GST_MAKE_FOURCC ('S', 'P', '5', '6'):
+ case GST_MAKE_FOURCC ('S', 'P', '5', '7'):
+ case GST_MAKE_FOURCC ('S', 'P', '5', '8'):
+ caps = gst_caps_new_simple ("video/sp5x", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Sp5x-like JPEG");
+ break;
+
+ case GST_MAKE_FOURCC ('Z', 'M', 'B', 'V'):
+ caps = gst_caps_new_simple ("video/x-zmbv", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Zip Motion Block video");
+ break;
+
+ case GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'):
+ caps = gst_caps_new_simple ("video/x-huffyuv", NULL);
+ if (strf) {
+ gst_caps_set_simple (caps, "bpp",
+ G_TYPE_INT, (int) strf->bit_cnt, NULL);
+ }
+ if (codec_name)
+ *codec_name = g_strdup ("Huffman Lossless Codec");
+ break;
+
+ 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 (0x01, 0x00, 0x00, 0x10):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-1 video");
+ break;
+
+ 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', ' '):
+ case GST_MAKE_FOURCC (0x02, 0x00, 0x00, 0x10):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-2 video");
+ break;
+
+ case GST_MAKE_FOURCC ('L', 'M', 'P', '2'):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lead MPEG-2 video");
+ 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'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "itu", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("ITU H.26n");
+ break;
+
+ case GST_MAKE_FOURCC ('L', '2', '6', '3'):
+ /* http://www.leadcodecs.com/Codecs/LEAD-H263.htm */
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "lead", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lead H.263");
+ break;
+
+ case GST_MAKE_FOURCC ('M', '2', '6', '3'):
+ case GST_MAKE_FOURCC ('m', '2', '6', '3'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "microsoft", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft H.263");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'D', 'O', 'W'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "vdolive", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("VDOLive");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'I', 'V', 'O'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "vivo", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Vivo H.263");
+ break;
+
+ case GST_MAKE_FOURCC ('x', '2', '6', '3'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "xirlink", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Xirlink H.263");
+ break;
+
+ /* apparently not standard H.263...? */
+ case GST_MAKE_FOURCC ('I', '2', '6', '3'):
+ caps = gst_caps_new_simple ("video/x-intel-h263",
+ "variant", G_TYPE_STRING, "intel", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Intel H.263");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'X', '1', 'K'):
+ caps = gst_caps_new_simple ("video/x-h263",
+ "variant", G_TYPE_STRING, "lucent", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lucent VX1000S H.263");
+ 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'):
+ caps = gst_caps_new_simple ("video/x-h264",
+ "variant", G_TYPE_STRING, "itu", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("ITU H.264");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'S', 'S', 'H'):
+ caps = gst_caps_new_simple ("video/x-h264",
+ "variant", G_TYPE_STRING, "videosoft", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("VideoSoft H.264");
+ break;
+
+ case GST_MAKE_FOURCC ('L', '2', '6', '4'):
+ /* http://www.leadcodecs.com/Codecs/LEAD-H264.htm */
+ caps = gst_caps_new_simple ("video/x-h264",
+ "variant", G_TYPE_STRING, "lead", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lead H.264");
+ break;
+
+ case GST_MAKE_FOURCC ('S', 'E', 'D', 'G'):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "mpegversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Samsung MPEG-4");
+ break;
+
+ case GST_MAKE_FOURCC ('M', '4', 'C', 'C'):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "mpegversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Divio MPEG-4");
+ break;
+
+ case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
+ case GST_MAKE_FOURCC ('d', 'i', 'v', '3'):
+ case GST_MAKE_FOURCC ('D', 'V', 'X', '3'):
+ case GST_MAKE_FOURCC ('d', 'v', 'x', '3'):
+ case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
+ case GST_MAKE_FOURCC ('d', 'i', 'v', '4'):
+ case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
+ case GST_MAKE_FOURCC ('d', 'i', 'v', '5'):
+ case GST_MAKE_FOURCC ('D', 'I', 'V', '6'):
+ case GST_MAKE_FOURCC ('d', 'i', 'v', '6'):
+ case GST_MAKE_FOURCC ('M', 'P', 'G', '3'):
+ case GST_MAKE_FOURCC ('m', 'p', 'g', '3'):
+ case GST_MAKE_FOURCC ('c', 'o', 'l', '0'):
+ case GST_MAKE_FOURCC ('C', 'O', 'L', '0'):
+ case GST_MAKE_FOURCC ('c', 'o', 'l', '1'):
+ case GST_MAKE_FOURCC ('C', 'O', 'L', '1'):
+ case GST_MAKE_FOURCC ('A', 'P', '4', '1'):
+ caps = gst_caps_new_simple ("video/x-divx",
+ "divxversion", G_TYPE_INT, 3, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DivX MS-MPEG-4 Version 3");
+ break;
+
+ case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'):
+ case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
+ caps = gst_caps_new_simple ("video/x-divx",
+ "divxversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DivX MPEG-4 Version 4");
+ break;
+
+ case GST_MAKE_FOURCC ('B', 'L', 'Z', '0'):
+ caps = gst_caps_new_simple ("video/x-divx",
+ "divxversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Blizzard DivX");
+ break;
+
+ case GST_MAKE_FOURCC ('D', 'X', '5', '0'):
+ caps = gst_caps_new_simple ("video/x-divx",
+ "divxversion", G_TYPE_INT, 5, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DivX MPEG-4 Version 5");
+ break;
+
+ case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'):
+ case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'):
+ caps = gst_caps_new_simple ("video/x-xvid", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("XVID MPEG-4");
+ break;
+
+ case GST_MAKE_FOURCC ('R', 'M', 'P', '4'):
+ caps = gst_caps_new_simple ("video/x-xvid", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Sigma-Designs MPEG-4");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
+ case GST_MAKE_FOURCC ('M', 'P', '4', '1'):
+ case GST_MAKE_FOURCC ('m', 'p', '4', '1'):
+ caps = gst_caps_new_simple ("video/x-msmpeg",
+ "msmpegversion", G_TYPE_INT, 41, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft MPEG-4 4.1");
+ break;
+
+ case GST_MAKE_FOURCC ('m', 'p', '4', '2'):
+ case GST_MAKE_FOURCC ('M', 'P', '4', '2'):
+ caps = gst_caps_new_simple ("video/x-msmpeg",
+ "msmpegversion", G_TYPE_INT, 42, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft MPEG-4 4.2");
+ break;
+
+ case GST_MAKE_FOURCC ('m', 'p', '4', '3'):
+ case GST_MAKE_FOURCC ('M', 'P', '4', '3'):
+ caps = gst_caps_new_simple ("video/x-msmpeg",
+ "msmpegversion", G_TYPE_INT, 43, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft MPEG-4 4.3");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'P', '4', 'S'):
+ case GST_MAKE_FOURCC ('M', '4', 'S', '2'):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "mpegversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft ISO MPEG-4 1.1");
+ break;
+
+ case GST_MAKE_FOURCC ('F', 'M', 'P', '4'):
+ case GST_MAKE_FOURCC ('U', 'M', 'P', '4'):
+ case GST_MAKE_FOURCC ('F', 'F', 'D', 'S'):
+ 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 ('E', 'M', '4', 'A'):
+ case GST_MAKE_FOURCC ('E', 'P', 'V', 'H'):
+ case GST_MAKE_FOURCC ('F', 'V', 'F', 'W'):
+ case GST_MAKE_FOURCC ('I', 'N', 'M', 'C'):
+ case GST_MAKE_FOURCC ('D', 'I', 'G', 'I'):
+ case GST_MAKE_FOURCC ('D', 'M', '2', 'K'):
+ case GST_MAKE_FOURCC ('D', 'C', 'O', 'D'):
+ case GST_MAKE_FOURCC ('M', 'V', 'X', 'M'):
+ case GST_MAKE_FOURCC ('P', 'M', '4', 'V'):
+ case GST_MAKE_FOURCC ('S', 'M', 'P', '4'):
+ case GST_MAKE_FOURCC ('D', 'X', 'G', 'M'):
+ case GST_MAKE_FOURCC ('V', 'I', 'D', 'M'):
+ case GST_MAKE_FOURCC ('M', '4', 'T', '3'):
+ case GST_MAKE_FOURCC ('G', 'E', 'O', 'X'):
+ case GST_MAKE_FOURCC ('M', 'P', '4', 'V'):
+ case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
+ caps = gst_caps_new_simple ("video/mpeg",
+ "mpegversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-4");
+ break;
+
+ case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'):
+ case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'):
+ caps = gst_caps_new_simple ("video/x-msmpeg",
+ "msmpegversion", G_TYPE_INT, 43, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft MPEG-4 4.3"); /* FIXME? */
+ break;
+
+ case GST_MAKE_FOURCC ('3', 'I', 'V', '1'):
+ case GST_MAKE_FOURCC ('3', 'I', 'V', '2'):
+ caps = gst_caps_new_simple ("video/x-3ivx", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("3ivx");
+ break;
+
+ case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
+ case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
+ case GST_MAKE_FOURCC ('d', 'v', 'c', ' '):
+ case GST_MAKE_FOURCC ('d', 'v', '2', '5'):
+ caps = gst_caps_new_simple ("video/x-dv",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "dvversion", G_TYPE_INT, 25, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Generic DV");
+ break;
+
+ case GST_MAKE_FOURCC ('C', 'D', 'V', 'C'):
+ case GST_MAKE_FOURCC ('c', 'd', 'v', 'c'):
+ caps = gst_caps_new_simple ("video/x-dv",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "dvversion", G_TYPE_INT, 25, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Canopus DV");
+ break;
+
+ case GST_MAKE_FOURCC ('D', 'V', '5', '0'):
+ case GST_MAKE_FOURCC ('d', 'v', '5', '0'):
+ caps = gst_caps_new_simple ("video/x-dv",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "dvversion", G_TYPE_INT, 50, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DVCPro50 Video");
+ break;
+
+ case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
+ caps = gst_caps_new_simple ("video/x-wmv",
+ "wmvversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft Windows Media 7");
+ break;
+
+ case GST_MAKE_FOURCC ('W', 'M', 'V', '2'):
+ caps = gst_caps_new_simple ("video/x-wmv",
+ "wmvversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft Windows Media 8");
+ break;
+
+ case GST_MAKE_FOURCC ('W', 'M', 'V', '3'):
+ caps = gst_caps_new_simple ("video/x-wmv",
+ "wmvversion", G_TYPE_INT, 3, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft Windows Media 9");
+ break;
+
+ case GST_MAKE_FOURCC ('W', 'M', 'V', 'A'):
+ caps = gst_caps_new_simple ("video/x-wmv",
+ "wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WMVA", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft Windows Media Advanced Profile");
+ break;
+
+ case GST_MAKE_FOURCC ('W', 'V', 'C', '1'):
+ caps = gst_caps_new_simple ("video/x-wmv",
+ "wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft Windows Media VC-1");
+ break;
+
+ case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'):
+ caps = gst_caps_new_simple ("video/x-cinepak", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Cinepak video");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'S', 'V', 'C'):
+ case GST_MAKE_FOURCC ('m', 's', 'v', 'c'):
+ case GST_MAKE_FOURCC ('C', 'R', 'A', 'M'):
+ case GST_MAKE_FOURCC ('c', 'r', 'a', 'm'):
+ case GST_MAKE_FOURCC ('W', 'H', 'A', 'M'):
+ case GST_MAKE_FOURCC ('w', 'h', 'a', 'm'):
+ caps = gst_caps_new_simple ("video/x-msvideocodec",
+ "msvideoversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MS video v1");
+ palette = strf_data;
+ strf_data = NULL;
+ break;
+
+ case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
+ case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
+ case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
+ case GST_MAKE_FOURCC (0x2, 0x0, 0x0, 0x0): /* why, why, why? */
+ caps = gst_caps_new_simple ("video/x-rle",
+ "layout", G_TYPE_STRING, "microsoft", NULL);
+ palette = strf_data;
+ strf_data = NULL;
+ if (strf) {
+ gst_caps_set_simple (caps,
+ "depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
+ } else {
+ gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
+ }
+ if (codec_name)
+ *codec_name = g_strdup ("Microsoft RLE");
+ break;
+
+ case GST_MAKE_FOURCC ('A', 'A', 'S', 'C'):
+ caps = gst_caps_new_simple ("video/x-aasc", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Autodesk Animator");
+ break;
+
+ case GST_MAKE_FOURCC ('X', 'x', 'a', 'n'):
+ caps = gst_caps_new_simple ("video/x-xan",
+ "wcversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Xan Wing Commander 4");
+ break;
+
+ case GST_MAKE_FOURCC ('R', 'T', '2', '1'):
+ caps = gst_caps_new_simple ("video/x-indeo",
+ "indeoversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Intel Video 2");
+ break;
+
+ case GST_MAKE_FOURCC ('I', 'V', '3', '1'):
+ case GST_MAKE_FOURCC ('I', 'V', '3', '2'):
+ case GST_MAKE_FOURCC ('i', 'v', '3', '1'):
+ case GST_MAKE_FOURCC ('i', 'v', '3', '2'):
+ caps = gst_caps_new_simple ("video/x-indeo",
+ "indeoversion", G_TYPE_INT, 3, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Intel Video 3");
+ break;
+
+ case GST_MAKE_FOURCC ('I', 'V', '4', '1'):
+ case GST_MAKE_FOURCC ('i', 'v', '4', '1'):
+ caps = gst_caps_new_simple ("video/x-indeo",
+ "indeoversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Intel Video 4");
+ break;
+
+ case GST_MAKE_FOURCC ('I', 'V', '5', '0'):
+ caps = gst_caps_new_simple ("video/x-indeo",
+ "indeoversion", G_TYPE_INT, 5, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Intel Video 5");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'S', 'Z', 'H'):
+ caps = gst_caps_new_simple ("video/x-mszh", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lossless MSZH Video");
+ break;
+
+ case GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'):
+ caps = gst_caps_new_simple ("video/x-zlib", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Lossless zlib video");
+ break;
+
+ case GST_MAKE_FOURCC ('C', 'L', 'J', 'R'):
+ case GST_MAKE_FOURCC ('c', 'l', 'j', 'r'):
+ caps = gst_caps_new_simple ("video/x-cirrus-logic-accupak", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Cirrus Logipak AccuPak");
+ break;
+
+ case GST_MAKE_FOURCC ('C', 'Y', 'U', 'V'):
+ case GST_MAKE_FOURCC ('c', 'y', 'u', 'v'):
+ caps = gst_caps_new_simple ("video/x-compressed-yuv", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("CYUV Lossless");
+ break;
+
+ case GST_MAKE_FOURCC ('D', 'U', 'C', 'K'):
+ case GST_MAKE_FOURCC ('P', 'V', 'E', 'Z'):
+ caps = gst_caps_new_simple ("video/x-truemotion",
+ "trueversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Duck Truemotion1");
+ break;
+
+ case GST_MAKE_FOURCC ('T', 'M', '2', '0'):
+ caps = gst_caps_new_simple ("video/x-truemotion",
+ "trueversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("TrueMotion 2.0");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'P', '3', '0'):
+ case GST_MAKE_FOURCC ('v', 'p', '3', '0'):
+ case GST_MAKE_FOURCC ('V', 'P', '3', '1'):
+ case GST_MAKE_FOURCC ('v', 'p', '3', '1'):
+ case GST_MAKE_FOURCC ('V', 'P', '3', ' '):
+ caps = gst_caps_new_simple ("video/x-vp3", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("VP3");
+ break;
+
+ case GST_MAKE_FOURCC ('U', 'L', 'T', 'I'):
+ caps = gst_caps_new_simple ("video/x-ultimotion", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("IBM UltiMotion");
+ break;
+
+ case GST_MAKE_FOURCC ('T', 'S', 'C', 'C'):
+ case GST_MAKE_FOURCC ('t', 's', 'c', 'c'):{
+ if (strf) {
+ gint depth = (strf->bit_cnt != 0) ? (gint) strf->bit_cnt : 24;
+
+ caps = gst_caps_new_simple ("video/x-camtasia", "depth", G_TYPE_INT,
+ depth, NULL);
+ } else {
+ /* template caps */
+ caps = gst_caps_new_simple ("video/x-camtasia", NULL);
+ }
+ if (codec_name)
+ *codec_name = g_strdup ("TechSmith Camtasia");
+ break;
+ }
+
+ case GST_MAKE_FOURCC ('C', 'S', 'C', 'D'):
+ {
+ if (strf) {
+ gint depth = (strf->bit_cnt != 0) ? (gint) strf->bit_cnt : 24;
+
+ caps = gst_caps_new_simple ("video/x-camstudio", "depth", G_TYPE_INT,
+ depth, NULL);
+ } else {
+ /* template caps */
+ caps = gst_caps_new_simple ("video/x-camstudio", NULL);
+ }
+ if (codec_name)
+ *codec_name = g_strdup ("Camstudio");
+ break;
+ }
+
+ case GST_MAKE_FOURCC ('V', 'C', 'R', '1'):
+ caps = gst_caps_new_simple ("video/x-ati-vcr",
+ "vcrversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("ATI VCR 1");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'C', 'R', '2'):
+ caps = gst_caps_new_simple ("video/x-ati-vcr",
+ "vcrversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("ATI VCR 2");
+ break;
+
+ case GST_MAKE_FOURCC ('A', 'S', 'V', '1'):
+ caps = gst_caps_new_simple ("video/x-asus",
+ "asusversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Asus Video 1");
+ break;
+
+ case GST_MAKE_FOURCC ('A', 'S', 'V', '2'):
+ caps = gst_caps_new_simple ("video/x-asus",
+ "asusversion", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Asus Video 2");
+ break;
+
+ case GST_MAKE_FOURCC ('M', 'P', 'N', 'G'):
+ case GST_MAKE_FOURCC ('m', 'p', 'n', 'g'):
+ case GST_MAKE_FOURCC ('P', 'N', 'G', ' '):
+ caps = gst_caps_new_simple ("image/png", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("PNG image");
+ break;
+
+ case GST_MAKE_FOURCC ('F', 'L', 'V', '1'):
+ caps = gst_caps_new_simple ("video/x-flash-video",
+ "flvversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Flash Video 1");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'M', 'n', 'c'):
+ caps = gst_caps_new_simple ("video/x-vmnc",
+ "version", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("VMWare NC Video");
+ break;
+
+ case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'):
+ caps = gst_caps_new_simple ("video/x-dirac", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Dirac");
+ break;
+
+ case GST_RIFF_rpza:
+ case GST_RIFF_azpr:
+ case GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'):
+ caps = gst_caps_new_simple ("video/x-apple-video", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Apple Video (RPZA)");
+ break;
+
+
+ case GST_MAKE_FOURCC ('F', 'F', 'V', '1'):
+ caps = gst_caps_new_simple ("video/x-ffv",
+ "ffvversion", G_TYPE_INT, 1, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("FFmpeg lossless video codec");
+ break;
+
+ case GST_MAKE_FOURCC ('K', 'M', 'V', 'C'):
+ caps = gst_caps_new_simple ("video/x-kmvc", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Karl Morton's video codec");
+ break;
+
+ case GST_MAKE_FOURCC ('v', 'p', '5', '0'):
+ case GST_MAKE_FOURCC ('V', 'P', '5', '0'):
+ caps = gst_caps_new_simple ("video/x-vp5", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("On2 VP5");
+ break;
+
+ case GST_MAKE_FOURCC ('v', 'p', '6', '0'):
+ case GST_MAKE_FOURCC ('V', 'P', '6', '0'):
+ case GST_MAKE_FOURCC ('v', 'p', '6', '1'):
+ case GST_MAKE_FOURCC ('V', 'P', '6', '1'):
+ case GST_MAKE_FOURCC ('V', 'p', '6', '2'):
+ case GST_MAKE_FOURCC ('V', 'P', '6', '2'):
+ caps = gst_caps_new_simple ("video/x-vp6", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("On2 VP6");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'P', '6', 'F'):
+ case GST_MAKE_FOURCC ('v', 'p', '6', 'f'):
+ case GST_MAKE_FOURCC ('F', 'L', 'V', '4'):
+ caps = gst_caps_new_simple ("video/x-vp6-flash", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("On2 VP6");
+ break;
+
+ case GST_MAKE_FOURCC ('v', 'p', '7', '0'):
+ case GST_MAKE_FOURCC ('V', 'P', '7', '0'):
+ caps = gst_caps_new_simple ("video/x-vp7", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("On2 VP7");
+ break;
+
+ case GST_MAKE_FOURCC ('V', 'P', '8', '0'):
+ caps = gst_caps_new_simple ("video/x-vp8", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("On2 VP8");
+ break;
+
+ case GST_MAKE_FOURCC ('L', 'M', '2', '0'):
+ caps = gst_caps_new_simple ("video/x-mimic", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Mimic webcam");
+ break;
+
+ case GST_MAKE_FOURCC ('T', 'H', 'E', 'O'):
+ case GST_MAKE_FOURCC ('t', 'h', 'e', 'o'):
+ caps = gst_caps_new_simple ("video/x-theora", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Theora video codec");
+
+ break;
+
+ case GST_MAKE_FOURCC ('F', 'P', 'S', '1'):
+ caps = gst_caps_new_simple ("video/x-fraps", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Fraps video");
+
+ break;
+
+ default:
+ GST_WARNING ("Unknown video fourcc %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (codec_fcc));
+ return NULL;
+ }
+
+ if (strh != NULL) {
+ gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION,
+ strh->rate, strh->scale, NULL);
+ } else {
+ gst_caps_set_simple (caps,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ }
+
+ if (strf != NULL) {
+ gst_caps_set_simple (caps,
+ "width", G_TYPE_INT, strf->width,
+ "height", G_TYPE_INT, strf->height, NULL);
+ } else {
+ gst_caps_set_simple (caps,
+ "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
+ }
+
+ /* extradata */
+ if (strf_data || strd_data) {
+ GstBuffer *codec_data;
+
+ codec_data = strf_data ? strf_data : strd_data;
+
+ gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL);
+ }
+
+ /* palette */
+ if (palette) {
+ GstBuffer *copy;
+ guint num_colors;
+ gsize size;
+
+ if (strf != NULL)
+ num_colors = strf->num_colors;
+ else
+ num_colors = 256;
+
+ size = gst_buffer_get_size (palette);
+
+ if (size >= (num_colors * 4)) {
+ /* palette is always at least 256*4 bytes */
+ copy = gst_buffer_new_and_alloc (MAX (size, 256 * 4));
+ gst_buffer_copy_into (copy, palette, GST_BUFFER_COPY_MEMORY, 0, size);
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+ {
+ guint8 *data = GST_BUFFER_DATA (copy);
+ gint n;
+
+ /* own endianness */
+ for (n = 0; n < num_colors; n++) {
+ GST_WRITE_UINT32_BE (data, GST_READ_UINT32_LE (data));
+ data += sizeof (guint32);
+ }
+ }
+#endif
+ gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, copy, NULL);
+ gst_buffer_unref (copy);
+ } else {
+ GST_WARNING ("Palette smaller than expected: broken file");
+ }
+ }
+
+ return caps;
+}
+
+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_TOP_CENTER}, {
+ 0x01000, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT}, {
+ 0x02000, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER}, {
+ 0x04000, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}, {
+ 0x08000, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT}, {
+ 0x10000, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER}, {
+ 0x20000, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT}
+};
+
+#define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping)
+
+static gboolean
+gst_riff_wavext_add_channel_layout (GstCaps * caps, guint32 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);
+
+ /* In theory this should be done for 1 and 2 channels too but
+ * apparently breaks too many things currently.
+ */
+ if (num_channels <= 2 || num_channels > MAX_CHANNEL_POSITIONS) {
+ GST_DEBUG ("invalid number of channels: %d", num_channels);
+ return FALSE;
+ }
+
+ 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;
+}
+
+static gboolean
+gst_riff_wave_add_default_channel_layout (GstCaps * caps)
+{
+ GstAudioChannelPosition pos[8] = { GST_AUDIO_CHANNEL_POSITION_NONE, };
+ GstStructure *s;
+ gint nchannels;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ if (!gst_structure_get_int (s, "channels", &nchannels))
+ g_return_val_if_reached (FALSE);
+
+ if (nchannels > 8) {
+ GST_DEBUG ("invalid number of channels: %d", nchannels);
+ return FALSE;
+ }
+
+ /* This uses the default channel mapping from ALSA which
+ * is used in quite a few surround test files and seems to be
+ * the defacto standard. The channel mapping from
+ * WAVE_FORMAT_EXTENSIBLE doesn't seem to be used in normal
+ * wav files like chan-id.wav.
+ * http://bugzilla.gnome.org/show_bug.cgi?id=489010
+ */
+ switch (nchannels) {
+ case 1:
+ pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
+ break;
+ case 8:
+ pos[7] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT;
+ pos[6] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT;
+ /* fall through */
+ case 6:
+ pos[5] = GST_AUDIO_CHANNEL_POSITION_LFE;
+ /* fall through */
+ case 5:
+ pos[4] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
+ /* fall through */
+ case 4:
+ pos[3] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
+ pos[2] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
+ /* fall through */
+ case 2:
+ pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+ pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+ break;
+ default:
+ return FALSE;
+ }
+
+ gst_audio_set_channel_positions (s, pos);
+ return TRUE;
+}
+
+static guint32
+gst_riff_wavext_get_default_channel_mask (guint nchannels)
+{
+ guint32 channel_mask = 0;
+
+ /* Set the default channel mask for the given number of channels.
+ * 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;
+ }
+
+ return channel_mask;
+}
+
+GstCaps *
+gst_riff_create_audio_caps (guint16 codec_id,
+ gst_riff_strh * strh, gst_riff_strf_auds * strf,
+ GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
+{
+ gboolean block_align = FALSE, rate_chan = TRUE;
+ GstCaps *caps = NULL;
+ gint rate_min = 1000, rate_max = 96000;
+ gint channels_max = 2;
+
+ switch (codec_id) {
+ case GST_RIFF_WAVE_FORMAT_PCM: /* PCM */
+ rate_max = 192000;
+ channels_max = 8;
+
+ if (strf != NULL) {
+ gint ba = strf->blockalign;
+ gint ch = strf->channels;
+ gint wd, ws;
+ GstAudioFormat format;
+
+ /* If we have an empty blockalign, we take the width contained in
+ * strf->size */
+ if (ba != 0)
+ wd = ba * 8 / ch;
+ else
+ wd = strf->size;
+
+ if (strf->size > 32) {
+ GST_WARNING ("invalid depth (%d) of pcm audio, overwriting.",
+ strf->size);
+ strf->size = 8 * ((wd + 7) / 8);
+ }
+
+ /* in riff, the depth is stored in the size field but it just means that
+ * the _least_ significant bits are cleared. We can therefore just play
+ * the sample as if it had a depth == width */
+ /* For reference, the actual depth is in strf->size */
+ ws = wd;
+
+ format =
+ gst_audio_format_build_integer (wd != 8, G_LITTLE_ENDIAN, wd, ws);
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, gst_audio_format_to_string (format),
+ "channels", G_TYPE_INT, ch, NULL);
+
+ /* Add default channel layout. In theory this should be done
+ * for 1 and 2 channels too but apparently breaks too many
+ * things currently. Also we know no default layout for more than
+ * 8 channels. */
+ if (ch > 2) {
+ if (ch > 8)
+ GST_WARNING ("don't know default layout for %d channels", ch);
+ else if (gst_riff_wave_add_default_channel_layout (caps))
+ GST_DEBUG ("using default channel layout for %d channels", ch);
+ else
+ GST_WARNING ("failed to add channel layout");
+ }
+ } else {
+ /* FIXME: this is pretty useless - we need fixed caps */
+ caps = gst_caps_from_string ("audio/x-raw, "
+ "format = (string) { S8, U8, S16LE, U16LE, S24LE, "
+ "U24LE, S32LE, U32LE }");
+ }
+ if (codec_name && strf)
+ *codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio",
+ strf->size);
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_ADPCM:
+ caps = gst_caps_new_simple ("audio/x-adpcm",
+ "layout", G_TYPE_STRING, "microsoft", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("ADPCM audio");
+ block_align = TRUE;
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_IEEE_FLOAT:
+ rate_max = 192000;
+ channels_max = 8;
+
+ if (strf != NULL) {
+ gint ba = strf->blockalign;
+ gint ch = strf->channels;
+ gint wd = ba * 8 / ch;
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, wd == 64 ? "F64LE" : "F32LE",
+ "channels", G_TYPE_INT, ch, NULL);
+
+ /* Add default channel layout. In theory this should be done
+ * for 1 and 2 channels too but apparently breaks too many
+ * things currently. Also we know no default layout for more than
+ * 8 channels. */
+ if (ch > 2) {
+ if (ch > 8)
+ GST_WARNING ("don't know default layout for %d channels", ch);
+ else if (gst_riff_wave_add_default_channel_layout (caps))
+ GST_DEBUG ("using default channel layout for %d channels", ch);
+ else
+ GST_WARNING ("failed to add channel layout");
+ }
+ } else {
+ /* FIXME: this is pretty useless - we need fixed caps */
+ caps = gst_caps_from_string ("audio/x-raw, "
+ "format = (string) { F32LE, F64LE }");
+ }
+ if (codec_name && strf)
+ *codec_name = g_strdup_printf ("Uncompressed %d-bit IEEE float audio",
+ strf->size);
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_IBM_CVSD:
+ goto unknown;
+
+ case GST_RIFF_WAVE_FORMAT_ALAW:
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->blockalign = (strf->size * strf->channels) / 8;
+ strf->av_bps = strf->blockalign * strf->rate;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->blockalign = (strf->size * strf->channels) / 8;
+ strf->av_bps = strf->blockalign * strf->rate;
+ }
+ }
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("A-law audio");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_WMS:
+ caps = gst_caps_new_simple ("audio/x-wms", NULL);
+ if (strf != NULL) {
+ gst_caps_set_simple (caps,
+ "bitrate", G_TYPE_INT, strf->av_bps * 8,
+ "width", G_TYPE_INT, strf->size,
+ "depth", G_TYPE_INT, strf->size, NULL);
+ } else {
+ gst_caps_set_simple (caps,
+ "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
+ }
+ if (codec_name)
+ *codec_name = g_strdup ("Windows Media Audio Speech");
+ block_align = TRUE;
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_MULAW:
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->blockalign = (strf->size * strf->channels) / 8;
+ strf->av_bps = strf->blockalign * strf->rate;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->blockalign = (strf->size * strf->channels) / 8;
+ strf->av_bps = strf->blockalign * strf->rate;
+ }
+ }
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Mu-law audio");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_OKI_ADPCM:
+ goto unknown;
+
+ case GST_RIFF_WAVE_FORMAT_DVI_ADPCM:
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/x-adpcm",
+ "layout", G_TYPE_STRING, "dvi", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DVI ADPCM audio");
+ block_align = TRUE;
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH:
+ rate_min = 8000;
+ rate_max = 8000;
+ caps = gst_caps_new_simple ("audio/x-truespeech", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DSP Group TrueSpeech");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_GSM610:
+ case GST_RIFF_WAVE_FORMAT_MSN:
+ rate_min = 1;
+ caps = gst_caps_new_simple ("audio/ms-gsm", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MS GSM audio");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
+ rate_min = 16000;
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-1 layer 2");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
+ rate_min = 8000;
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-1 layer 3");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_AMR_NB: /* amr-nb */
+ rate_min = 8000;
+ rate_max = 8000;
+ channels_max = 1;
+ caps = gst_caps_new_simple ("audio/AMR", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("AMR Narrow Band (NB)");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_AMR_WB: /* amr-wb */
+ rate_min = 16000;
+ rate_max = 16000;
+ channels_max = 1;
+ caps = gst_caps_new_simple ("audio/AMR-WB", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("AMR Wide Band (WB)");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
+ case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
+ case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
+ case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS: /* ogg/vorbis mode 1+ */
+ case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS: /* ogg/vorbis mode 2+ */
+ case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS: /* ogg/vorbis mode 3+ */
+ rate_max = 192000;
+ caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Vorbis");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_A52:
+ channels_max = 6;
+ caps = gst_caps_new_simple ("audio/x-ac3", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("AC-3 audio");
+ break;
+ case GST_RIFF_WAVE_FORMAT_DTS:
+ channels_max = 6;
+ caps = gst_caps_new_simple ("audio/x-dts", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DTS audio");
+ /* wavparse is not always able to specify rate/channels for DTS-in-wav */
+ rate_chan = FALSE;
+ break;
+ case GST_RIFF_WAVE_FORMAT_AAC:
+ case GST_RIFF_WAVE_FORMAT_AAC_AC:
+ case GST_RIFF_WAVE_FORMAT_AAC_pm:
+ {
+ channels_max = 8;
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 4, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-4 AAC audio");
+ break;
+ }
+ case GST_RIFF_WAVE_FORMAT_WMAV1:
+ case GST_RIFF_WAVE_FORMAT_WMAV2:
+ case GST_RIFF_WAVE_FORMAT_WMAV3:
+ case GST_RIFF_WAVE_FORMAT_WMAV3_L:
+ {
+ gint version = (codec_id - GST_RIFF_WAVE_FORMAT_WMAV1) + 1;
+
+ channels_max = 6;
+ block_align = TRUE;
+
+ caps = gst_caps_new_simple ("audio/x-wma",
+ "wmaversion", G_TYPE_INT, version, NULL);
+
+ if (codec_name) {
+ if (codec_id == GST_RIFF_WAVE_FORMAT_WMAV3_L)
+ *codec_name = g_strdup ("WMA Lossless");
+ else
+ *codec_name = g_strdup_printf ("WMA Version %d", version + 6);
+ }
+
+ if (strf != NULL) {
+ gst_caps_set_simple (caps,
+ "bitrate", G_TYPE_INT, strf->av_bps * 8,
+ "depth", G_TYPE_INT, strf->size, NULL);
+ } else {
+ gst_caps_set_simple (caps,
+ "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
+ }
+ break;
+ }
+ case GST_RIFF_WAVE_FORMAT_SONY_ATRAC3:
+ caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Sony ATRAC3");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_SIREN:
+ caps = gst_caps_new_simple ("audio/x-siren", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Siren7");
+ rate_chan = FALSE;
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4:
+ rate_min = 8000;
+ rate_max = 96000;
+ channels_max = 2;
+ caps =
+ gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk4",
+ NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("IMA/DK4 ADPCM");
+ break;
+ case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3:
+ rate_min = 8000;
+ rate_max = 96000;
+ channels_max = 2;
+ caps =
+ gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk3",
+ NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("IMA/DK3 ADPCM");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV:
+ rate_min = 8000;
+ rate_max = 96000;
+ channels_max = 2;
+ caps =
+ gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dvi",
+ NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("IMA/WAV ADPCM");
+ break;
+ case GST_RIFF_WAVE_FORMAT_EXTENSIBLE:{
+ guint16 valid_bits_per_sample;
+ guint32 channel_mask;
+ guint32 subformat_guid[4];
+ guint8 *data;
+ gsize size;
+
+ channels_max = 8;
+
+ /* should be at least 22 bytes */
+ size = gst_buffer_get_size (strf_data);
+
+ if (strf_data == NULL || size < 22) {
+ GST_WARNING ("WAVE_FORMAT_EXTENSIBLE data size is %" G_GSIZE_FORMAT
+ " (expected: 22)", (strf_data) ? size : -1);
+ return NULL;
+ }
+
+ data = gst_buffer_map (strf_data, &size, NULL, GST_MAP_READ);
+ valid_bits_per_sample = GST_READ_UINT16_LE (data);
+ channel_mask = GST_READ_UINT32_LE (data + 2);
+ subformat_guid[0] = GST_READ_UINT32_LE (data + 6);
+ subformat_guid[1] = GST_READ_UINT32_LE (data + 10);
+ subformat_guid[2] = GST_READ_UINT32_LE (data + 14);
+ subformat_guid[3] = GST_READ_UINT32_LE (data + 18);
+ gst_buffer_unmap (strf_data, data, size);
+
+ GST_DEBUG ("valid bps = %u", valid_bits_per_sample);
+ GST_DEBUG ("channel mask = 0x%08x", channel_mask);
+ GST_DEBUG ("GUID = %08x-%08x-%08x-%08x", subformat_guid[0],
+ subformat_guid[1], subformat_guid[2], subformat_guid[3]);
+
+ if (subformat_guid[1] == 0x00100000 &&
+ subformat_guid[2] == 0xaa000080 && subformat_guid[3] == 0x719b3800) {
+ if (subformat_guid[0] == 0x00000001) {
+ GST_DEBUG ("PCM");
+ if (strf != NULL) {
+ gint ba = strf->blockalign;
+ gint wd = ba * 8 / strf->channels;
+ gint ws;
+ GstAudioFormat format;
+
+ /* in riff, the depth is stored in the size field but it just
+ * means that the _least_ significant bits are cleared. We can
+ * therefore just play the sample as if it had a depth == width */
+ ws = wd;
+
+ /* For reference, use this to get the actual depth:
+ * ws = strf->size;
+ * if (valid_bits_per_sample != 0)
+ * ws = valid_bits_per_sample; */
+
+ format =
+ gst_audio_format_build_integer (wd != 8, G_LITTLE_ENDIAN, wd,
+ ws);
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, gst_audio_format_to_string (format),
+ "channels", G_TYPE_INT, strf->channels,
+ "rate", G_TYPE_INT, strf->rate, NULL);
+
+ /* If channel_mask == 0 and channels > 2 let's
+ * assume default layout as some wav files don't have the
+ * channel mask set. Don't set the layout for 1 or 2
+ * channels as it apparently breaks too many things currently. */
+ if (channel_mask == 0 && strf->channels > 2)
+ channel_mask =
+ gst_riff_wavext_get_default_channel_mask (strf->channels);
+
+ if ((channel_mask != 0 || strf->channels > 2) &&
+ !gst_riff_wavext_add_channel_layout (caps, channel_mask)) {
+ GST_WARNING ("failed to add channel layout");
+ gst_caps_unref (caps);
+ caps = NULL;
+ }
+ rate_chan = FALSE;
+
+ if (codec_name) {
+ *codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio",
+ strf->size);
+ }
+ }
+ } else if (subformat_guid[0] == 0x00000003) {
+ GST_DEBUG ("FLOAT");
+ if (strf != NULL) {
+ gint ba = strf->blockalign;
+ gint wd = ba * 8 / strf->channels;
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, wd == 32 ? "F32LE" : "F64LE",
+ "channels", G_TYPE_INT, strf->channels,
+ "rate", G_TYPE_INT, strf->rate, NULL);
+
+ /* If channel_mask == 0 and channels > 2 let's
+ * assume default layout as some wav files don't have the
+ * channel mask set. Don't set the layout for 1 or 2
+ * channels as it apparently breaks too many things currently. */
+ if (channel_mask == 0 && strf->channels > 2)
+ channel_mask =
+ gst_riff_wavext_get_default_channel_mask (strf->channels);
+
+ if ((channel_mask != 0 || strf->channels > 2) &&
+ !gst_riff_wavext_add_channel_layout (caps, channel_mask)) {
+ GST_WARNING ("failed to add channel layout");
+ gst_caps_unref (caps);
+ caps = NULL;
+ }
+ rate_chan = FALSE;
+
+ if (codec_name) {
+ *codec_name =
+ g_strdup_printf ("Uncompressed %d-bit IEEE float audio",
+ strf->size);
+ }
+ }
+ } else if (subformat_guid[0] == 00000006) {
+ GST_DEBUG ("ALAW");
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->av_bps = 8;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING
+ ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->av_bps = strf->size;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ }
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+
+ if (codec_name)
+ *codec_name = g_strdup ("A-law audio");
+ } else if (subformat_guid[0] == 0x00000007) {
+ GST_DEBUG ("MULAW");
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->av_bps = 8;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING
+ ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->av_bps = strf->size;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ }
+ rate_max = 48000;
+ caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Mu-law audio");
+ } else if (subformat_guid[0] == 0x00000092) {
+ GST_DEBUG ("FIXME: handle DOLBY AC3 SPDIF format");
+ }
+ } else if (subformat_guid[0] == 0x6ba47966 &&
+ subformat_guid[1] == 0x41783f83 &&
+ subformat_guid[2] == 0xf0006596 && subformat_guid[3] == 0xe59262bf) {
+ caps = gst_caps_new_simple ("application/x-ogg-avi", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Ogg-AVI");
+ }
+
+ if (caps == NULL) {
+ GST_WARNING ("Unknown WAVE_FORMAT_EXTENSIBLE audio format");
+ return NULL;
+ }
+ break;
+ }
+ /* can anything decode these? pitfdll? */
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_AC8:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_AC10:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_AC16:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_AC20:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_METAVOICE:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_RT29HW:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_VR12:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_VR18:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_TQ40:
+ case GST_RIFF_WAVE_FORMAT_VOXWARE_TQ60:{
+ caps = gst_caps_new_simple ("audio/x-voxware",
+ "voxwaretype", G_TYPE_INT, (gint) codec_id, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Voxware");
+ break;
+ }
+ default:
+ unknown:
+ GST_WARNING ("Unknown audio tag 0x%04x", codec_id);
+ return NULL;
+ }
+
+ if (strf != NULL) {
+ if (rate_chan) {
+ if (strf->channels > channels_max)
+ goto too_many_channels;
+ if (strf->rate < rate_min || strf->rate > rate_max)
+ goto invalid_rate;
+
+ gst_caps_set_simple (caps,
+ "rate", G_TYPE_INT, strf->rate,
+ "channels", G_TYPE_INT, strf->channels, NULL);
+ }
+ if (block_align) {
+ gst_caps_set_simple (caps,
+ "block_align", G_TYPE_INT, strf->blockalign, NULL);
+ }
+ } else {
+ if (rate_chan) {
+ if (rate_min == rate_max)
+ gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate_min, NULL);
+ else
+ gst_caps_set_simple (caps,
+ "rate", GST_TYPE_INT_RANGE, rate_min, rate_max, NULL);
+ if (channels_max == 1)
+ gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL);
+ else
+ gst_caps_set_simple (caps,
+ "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
+ }
+ if (block_align) {
+ gst_caps_set_simple (caps,
+ "block_align", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
+ }
+ }
+
+ /* extradata */
+ if (strf_data || strd_data) {
+ gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
+ strf_data ? strf_data : strd_data, NULL);
+ }
+
+ return caps;
+
+ /* ERROR */
+too_many_channels:
+ GST_WARNING
+ ("Stream claims to contain %u channels, but format only supports %d",
+ strf->channels, channels_max);
+ gst_caps_unref (caps);
+ return NULL;
+invalid_rate:
+ GST_WARNING
+ ("Stream with sample_rate %u, but format only supports %d .. %d",
+ strf->rate, rate_min, rate_max);
+ gst_caps_unref (caps);
+ return NULL;
+}
+
+GstCaps *
+gst_riff_create_iavs_caps (guint32 codec_fcc,
+ gst_riff_strh * strh, gst_riff_strf_iavs * strf,
+ GstBuffer * init_data, GstBuffer * extra_data, char **codec_name)
+{
+ GstCaps *caps = NULL;
+
+ switch (codec_fcc) {
+ /* is this correct? */
+ case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
+ case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
+ caps = gst_caps_new_simple ("video/x-dv",
+ "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Generic DV");
+ break;
+
+ default:
+ GST_WARNING ("Unknown IAVS fourcc %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (codec_fcc));
+ return NULL;
+ }
+
+ return caps;
+}
+
+/*
+ * Functions below are for template caps. All is variable.
+ */
+
+GstCaps *
+gst_riff_create_video_template_caps (void)
+{
+ static const guint32 tags[] = {
+ GST_MAKE_FOURCC ('3', 'I', 'V', '1'),
+ GST_MAKE_FOURCC ('A', 'S', 'V', '1'),
+ GST_MAKE_FOURCC ('A', 'S', 'V', '2'),
+ GST_MAKE_FOURCC ('C', 'L', 'J', 'R'),
+ GST_MAKE_FOURCC ('C', 'S', 'C', 'D'),
+ GST_MAKE_FOURCC ('C', 'Y', 'U', 'V'),
+ GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
+ GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
+ GST_MAKE_FOURCC ('D', 'I', 'V', 'X'),
+ GST_MAKE_FOURCC ('D', 'U', 'C', 'K'),
+ GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
+ GST_MAKE_FOURCC ('D', 'V', '5', '0'),
+ GST_MAKE_FOURCC ('D', 'X', '5', '0'),
+ GST_MAKE_FOURCC ('M', '4', 'C', 'C'),
+ GST_MAKE_FOURCC ('F', 'L', 'V', '1'),
+ GST_MAKE_FOURCC ('F', 'L', 'V', '4'),
+ GST_MAKE_FOURCC ('H', '2', '6', '3'),
+ GST_MAKE_FOURCC ('V', 'X', '1', 'K'),
+ GST_MAKE_FOURCC ('H', '2', '6', '4'),
+ GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'),
+ GST_MAKE_FOURCC ('I', '2', '6', '3'),
+ GST_MAKE_FOURCC ('I', '4', '2', '0'),
+ GST_MAKE_FOURCC ('I', 'V', '3', '2'),
+ GST_MAKE_FOURCC ('I', 'V', '4', '1'),
+ GST_MAKE_FOURCC ('I', 'V', '5', '0'),
+ GST_MAKE_FOURCC ('L', '2', '6', '3'),
+ GST_MAKE_FOURCC ('L', '2', '6', '4'),
+ GST_MAKE_FOURCC ('M', '2', '6', '3'),
+ GST_MAKE_FOURCC ('M', '4', 'S', '2'),
+ GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
+ GST_MAKE_FOURCC ('M', 'P', '4', '2'),
+ GST_MAKE_FOURCC ('M', 'P', '4', '3'),
+ GST_MAKE_FOURCC ('M', 'P', 'E', 'G'),
+ GST_MAKE_FOURCC ('M', 'P', 'G', '2'),
+ GST_MAKE_FOURCC ('M', 'P', 'G', '4'),
+ GST_MAKE_FOURCC ('M', 'S', 'Z', 'H'),
+ GST_MAKE_FOURCC ('P', 'N', 'G', ' '),
+ GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
+ GST_MAKE_FOURCC ('R', 'T', '2', '1'),
+ GST_MAKE_FOURCC ('S', 'P', '5', '3'),
+ GST_MAKE_FOURCC ('T', 'M', '2', '0'),
+ GST_MAKE_FOURCC ('T', 'S', 'C', 'C'),
+ GST_MAKE_FOURCC ('U', 'L', 'T', 'I'),
+ GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
+ GST_MAKE_FOURCC ('V', 'C', 'R', '1'),
+ GST_MAKE_FOURCC ('V', 'C', 'R', '2'),
+ GST_MAKE_FOURCC ('V', 'D', 'O', 'W'),
+ GST_MAKE_FOURCC ('V', 'I', 'V', 'O'),
+ GST_MAKE_FOURCC ('V', 'M', 'n', 'c'),
+ GST_MAKE_FOURCC ('V', 'P', '3', ' '),
+ GST_MAKE_FOURCC ('V', 'S', 'S', 'H'),
+ GST_MAKE_FOURCC ('W', 'M', 'V', '1'),
+ GST_MAKE_FOURCC ('W', 'M', 'V', '2'),
+ GST_MAKE_FOURCC ('W', 'M', 'V', '3'),
+ GST_MAKE_FOURCC ('X', 'V', 'I', 'D'),
+ GST_MAKE_FOURCC ('X', 'x', 'a', 'n'),
+ GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
+ GST_MAKE_FOURCC ('Y', 'V', 'U', '9'),
+ GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'),
+ GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
+ GST_MAKE_FOURCC ('h', '2', '6', '4'),
+ GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
+ GST_MAKE_FOURCC ('x', '2', '6', '3'),
+ GST_MAKE_FOURCC ('d', 'r', 'a', 'c'),
+ GST_MAKE_FOURCC ('F', 'F', 'V', '1'),
+ GST_MAKE_FOURCC ('K', 'M', 'V', 'C'),
+ GST_MAKE_FOURCC ('V', 'P', '5', '0'),
+ GST_MAKE_FOURCC ('V', 'P', '6', '0'),
+ GST_MAKE_FOURCC ('V', 'P', '6', 'F'),
+ GST_MAKE_FOURCC ('V', 'P', '7', '0'),
+ GST_MAKE_FOURCC ('V', 'P', '8', '0'),
+ GST_MAKE_FOURCC ('L', 'M', '2', '0'),
+ GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'),
+ GST_MAKE_FOURCC ('T', 'H', 'E', 'O'),
+ GST_MAKE_FOURCC ('F', 'P', 'S', '1'),
+ GST_MAKE_FOURCC ('A', 'A', 'S', 'C'),
+ GST_MAKE_FOURCC ('Y', 'V', '1', '2'),
+ GST_MAKE_FOURCC ('L', 'O', 'C', 'O'),
+ GST_MAKE_FOURCC ('Z', 'M', 'B', 'V'),
+ /* FILL ME */
+ };
+ guint i;
+ GstCaps *caps, *one;
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < G_N_ELEMENTS (tags); i++) {
+ one = gst_riff_create_video_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
+ if (one)
+ gst_caps_append (caps, one);
+ }
+
+ return caps;
+}
+
+GstCaps *
+gst_riff_create_audio_template_caps (void)
+{
+ static const guint16 tags[] = {
+ GST_RIFF_WAVE_FORMAT_GSM610,
+ GST_RIFF_WAVE_FORMAT_MPEGL3,
+ GST_RIFF_WAVE_FORMAT_MPEGL12,
+ GST_RIFF_WAVE_FORMAT_PCM,
+ GST_RIFF_WAVE_FORMAT_VORBIS1,
+ GST_RIFF_WAVE_FORMAT_A52,
+ GST_RIFF_WAVE_FORMAT_DTS,
+ GST_RIFF_WAVE_FORMAT_AAC,
+ GST_RIFF_WAVE_FORMAT_ALAW,
+ GST_RIFF_WAVE_FORMAT_MULAW,
+ GST_RIFF_WAVE_FORMAT_WMS,
+ GST_RIFF_WAVE_FORMAT_ADPCM,
+ GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
+ GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH,
+ GST_RIFF_WAVE_FORMAT_WMAV1,
+ GST_RIFF_WAVE_FORMAT_WMAV2,
+ GST_RIFF_WAVE_FORMAT_WMAV3,
+ GST_RIFF_WAVE_FORMAT_SONY_ATRAC3,
+ GST_RIFF_WAVE_FORMAT_IEEE_FLOAT,
+ GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND,
+ GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4,
+ GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3,
+ GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV,
+ GST_RIFF_WAVE_FORMAT_AMR_NB,
+ GST_RIFF_WAVE_FORMAT_AMR_WB,
+ GST_RIFF_WAVE_FORMAT_SIREN,
+ /* FILL ME */
+ };
+ guint i;
+ GstCaps *caps, *one;
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < G_N_ELEMENTS (tags); i++) {
+ one = gst_riff_create_audio_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
+ if (one)
+ gst_caps_append (caps, one);
+ }
+ one = gst_caps_new_simple ("application/x-ogg-avi", NULL);
+ gst_caps_append (caps, one);
+
+ return caps;
+}
+
+GstCaps *
+gst_riff_create_iavs_template_caps (void)
+{
+ static const guint32 tags[] = {
+ GST_MAKE_FOURCC ('D', 'V', 'S', 'D')
+ /* FILL ME */
+ };
+ guint i;
+ GstCaps *caps, *one;
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < G_N_ELEMENTS (tags); i++) {
+ one = gst_riff_create_iavs_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
+ if (one)
+ gst_caps_append (caps, one);
+ }
+
+ return caps;
+}
diff --git a/gst-libs/gst/riff/riff-media.h b/gst-libs/gst/riff/riff-media.h
new file mode 100644
index 0000000..cc09fd8
--- /dev/null
+++ b/gst-libs/gst/riff/riff-media.h
@@ -0,0 +1,65 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff-media.h: RIFF-id to/from caps 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_RIFF_MEDIA_H__
+#define __GST_RIFF_MEDIA_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+#include "riff-ids.h"
+
+G_BEGIN_DECLS
+
+/*
+ * Create caos. strh/strf, strf/strd_data and codec_name can be NULL.
+ */
+
+GstCaps * gst_riff_create_video_caps (guint32 codec_fcc,
+ gst_riff_strh * strh,
+ gst_riff_strf_vids * strf,
+ GstBuffer * strf_data,
+ GstBuffer * strd_data,
+ char ** codec_name);
+
+GstCaps * gst_riff_create_audio_caps (guint16 codec_id,
+ gst_riff_strh * strh,
+ gst_riff_strf_auds * strf,
+ GstBuffer * strf_data,
+ GstBuffer * strd_data,
+ char ** codec_name);
+
+GstCaps * gst_riff_create_iavs_caps (guint32 codec_fcc,
+ gst_riff_strh * strh,
+ gst_riff_strf_iavs * strf,
+ GstBuffer * strf_data,
+ GstBuffer * strd_data,
+ char ** codec_name);
+/*
+ * Create template caps (includes all known types).
+ */
+
+GstCaps * gst_riff_create_video_template_caps (void);
+GstCaps * gst_riff_create_audio_template_caps (void);
+GstCaps * gst_riff_create_iavs_template_caps (void);
+
+G_END_DECLS
+
+#endif /* __GST_RIFF_READ_H__ */
diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c
new file mode 100644
index 0000000..ab37e39
--- /dev/null
+++ b/gst-libs/gst/riff/riff-read.c
@@ -0,0 +1,788 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff-read.c: RIFF input file parsing
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/gstutils.h>
+#include <gst/tag/tag.h>
+
+#include "riff-read.h"
+
+GST_DEBUG_CATEGORY_EXTERN (riff_debug);
+#define GST_CAT_DEFAULT riff_debug
+
+/**
+ * gst_riff_read_chunk:
+ * @element: caller element (used for debugging).
+ * @pad: pad to pull data from.
+ * @offset: offset to pull from, incremented by this function.
+ * @tag: fourcc of the chunk (returned by this function).
+ * @chunk_data: buffer (returned by this function).
+ *
+ * Reads a single chunk of data. Since 0.10.8 'JUNK' chunks
+ * are skipped automatically.
+ *
+ * Returns: flow status.
+ */
+
+GstFlowReturn
+gst_riff_read_chunk (GstElement * element,
+ GstPad * pad, guint64 * _offset, guint32 * tag, GstBuffer ** _chunk_data)
+{
+ GstBuffer *buf;
+ GstFlowReturn res;
+ guint8 *data;
+ guint size;
+ guint64 offset = *_offset;
+ gsize bsize;
+
+ g_return_val_if_fail (element != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (pad != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (_offset != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (tag != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (_chunk_data != NULL, GST_FLOW_ERROR);
+
+skip_junk:
+ size = 8;
+ if ((res = gst_pad_pull_range (pad, offset, size, &buf)) != GST_FLOW_OK)
+ return res;
+ else if (gst_buffer_get_size (buf) < size)
+ goto too_small;
+
+ data = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ *tag = GST_READ_UINT32_LE (data);
+ size = GST_READ_UINT32_LE (data + 4);
+ gst_buffer_unmap (buf, data, bsize);
+ gst_buffer_unref (buf);
+
+ GST_DEBUG_OBJECT (element, "fourcc=%" GST_FOURCC_FORMAT ", size=%u",
+ GST_FOURCC_ARGS (*tag), size);
+
+ /* skip 'JUNK' chunks */
+ if (*tag == GST_RIFF_TAG_JUNK || *tag == GST_RIFF_TAG_JUNQ) {
+ size = GST_ROUND_UP_2 (size);
+ *_offset += 8 + size;
+ offset += 8 + size;
+ GST_DEBUG_OBJECT (element, "skipping JUNK chunk");
+ goto skip_junk;
+ }
+
+ if ((res = gst_pad_pull_range (pad, offset + 8, size, &buf)) != GST_FLOW_OK)
+ return res;
+ else if (gst_buffer_get_size (buf) < size)
+ goto too_small;
+
+ *_chunk_data = buf;
+ *_offset += 8 + GST_ROUND_UP_2 (size);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+too_small:
+ {
+ /* short read, we return UNEXPECTED to mark the EOS case */
+ GST_DEBUG_OBJECT (element, "not enough data (available=%" G_GSIZE_FORMAT
+ ", needed=%u)", gst_buffer_get_size (buf), size);
+ gst_buffer_unref (buf);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+/**
+ * gst_riff_parse_chunk:
+ * @element: caller element (used for debugging).
+ * @buf: input buffer.
+ * @offset: offset in the buffer in the caller. Is incremented
+ * by the read size by this function.
+ * @fourcc: fourcc (returned by this function0 of the chunk.
+ * @chunk_data: buffer (returned by the function) containing the
+ * chunk data, which may be NULL if chunksize == 0
+ *
+ * Reads a single chunk.
+ *
+ * Returns: FALSE on error, TRUE otherwise
+ */
+gboolean
+gst_riff_parse_chunk (GstElement * element, GstBuffer * buf,
+ guint * _offset, guint32 * _fourcc, GstBuffer ** chunk_data)
+{
+ guint size, bufsize;
+ guint32 fourcc;
+ guint8 *data, *ptr;
+ gsize bsize;
+ guint offset = *_offset;
+
+ g_return_val_if_fail (element != NULL, FALSE);
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (_offset != NULL, FALSE);
+ g_return_val_if_fail (_fourcc != NULL, FALSE);
+ g_return_val_if_fail (chunk_data != NULL, FALSE);
+
+ *chunk_data = NULL;
+ *_fourcc = 0;
+
+ bufsize = gst_buffer_get_size (buf);
+
+ if (bufsize == offset)
+ goto end_offset;
+
+ if (bufsize < offset + 8)
+ goto too_small;
+
+ /* read header */
+ data = ptr = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ ptr += offset;
+ fourcc = GST_READ_UINT32_LE (ptr);
+ size = GST_READ_UINT32_LE (ptr + 4);
+ gst_buffer_unmap (buf, data, bsize);
+
+ GST_DEBUG_OBJECT (element, "fourcc=%" GST_FOURCC_FORMAT ", size=%u",
+ GST_FOURCC_ARGS (fourcc), size);
+
+ /* be paranoid: size may be nonsensical value here, such as (guint) -1 */
+ if (G_UNLIKELY (size > G_MAXINT))
+ goto bogus_size;
+
+ if (bufsize < size + 8 + offset) {
+ GST_DEBUG_OBJECT (element,
+ "Needed chunk data (%d) is more than available (%d), shortcutting",
+ size, bufsize - 8 - offset);
+ size = bufsize - 8 - offset;
+ }
+
+ if (size)
+ *chunk_data =
+ gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset + 8, size);
+ else
+ *chunk_data = NULL;
+
+ *_fourcc = fourcc;
+ *_offset += 8 + GST_ROUND_UP_2 (size);
+
+ return TRUE;
+
+ /* ERRORS */
+end_offset:
+ {
+ GST_DEBUG_OBJECT (element, "End of chunk (offset %d)", offset);
+ return FALSE;
+ }
+too_small:
+ {
+ GST_DEBUG_OBJECT (element,
+ "Failed to parse chunk header (offset %d, %d available, %d needed)",
+ offset, bufsize, 8);
+ return FALSE;
+ }
+bogus_size:
+ {
+ GST_ERROR_OBJECT (element, "Broken file: bogus chunk size %u", size);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_file_header:
+ * @element: caller element (used for debugging/error).
+ * @buf: input buffer from which the file header will be parsed,
+ * should be at least 12 bytes long.
+ * @doctype: a fourcc (returned by this function) to indicate the
+ * type of document (according to the header).
+ *
+ * Reads the first few bytes from the provided buffer, checks
+ * if this stream is a RIFF stream, and determines document type.
+ * This function takes ownership of @buf so it should not be used anymore
+ * after calling this function.
+ *
+ * Returns: FALSE if this is not a RIFF stream (in which case the
+ * caller should error out; we already throw an error), or TRUE
+ * if it is.
+ */
+gboolean
+gst_riff_parse_file_header (GstElement * element,
+ GstBuffer * buf, guint32 * doctype)
+{
+ guint8 *data;
+ guint32 tag;
+ gsize size;
+
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (doctype != NULL, FALSE);
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ if (size < 12)
+ goto too_small;
+
+ tag = GST_READ_UINT32_LE (data);
+ if (tag != GST_RIFF_TAG_RIFF && tag != GST_RIFF_TAG_AVF0)
+ goto not_riff;
+
+ *doctype = GST_READ_UINT32_LE (data + 8);
+ gst_buffer_unmap (buf, data, size);
+
+ gst_buffer_unref (buf);
+
+ return TRUE;
+
+ /* ERRORS */
+too_small:
+ {
+ GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL),
+ ("Not enough data to parse RIFF header (%" G_GSIZE_FORMAT " available,"
+ " %d needed)", size, 12));
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+not_riff:
+ {
+ GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL),
+ ("Stream is no RIFF stream: %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (tag)));
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_strh:
+ * @element: caller element (used for debugging/error).
+ * @buf: input data to be used for parsing, stripped from header.
+ * @strh: a pointer (returned by this function) to a filled-in
+ * strh structure. Caller should free it.
+ *
+ * Parses a strh structure from input data. Takes ownership of @buf.
+ *
+ * Returns: TRUE if parsing succeeded, otherwise FALSE. The stream
+ * should be skipped on error, but it is not fatal.
+ */
+
+gboolean
+gst_riff_parse_strh (GstElement * element,
+ GstBuffer * buf, gst_riff_strh ** _strh)
+{
+ gst_riff_strh *strh;
+ guint8 *data;
+ gsize size;
+
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (_strh != NULL, FALSE);
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ if (size < sizeof (gst_riff_strh))
+ goto too_small;
+
+ strh = g_memdup (data, size);
+ gst_buffer_unmap (buf, data, size);
+
+ gst_buffer_unref (buf);
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+ strh->type = GUINT32_FROM_LE (strh->type);
+ strh->fcc_handler = GUINT32_FROM_LE (strh->fcc_handler);
+ strh->flags = GUINT32_FROM_LE (strh->flags);
+ strh->priority = GUINT32_FROM_LE (strh->priority);
+ strh->init_frames = GUINT32_FROM_LE (strh->init_frames);
+ strh->scale = GUINT32_FROM_LE (strh->scale);
+ strh->rate = GUINT32_FROM_LE (strh->rate);
+ strh->start = GUINT32_FROM_LE (strh->start);
+ strh->length = GUINT32_FROM_LE (strh->length);
+ strh->bufsize = GUINT32_FROM_LE (strh->bufsize);
+ strh->quality = GUINT32_FROM_LE (strh->quality);
+ strh->samplesize = GUINT32_FROM_LE (strh->samplesize);
+#endif
+
+ /* avoid divisions by zero */
+ if (!strh->scale)
+ strh->scale = 1;
+ if (!strh->rate)
+ strh->rate = 1;
+
+ /* debug */
+ GST_INFO_OBJECT (element, "strh tag found:");
+ GST_INFO_OBJECT (element, " type %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (strh->type));
+ GST_INFO_OBJECT (element, " fcc_handler %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (strh->fcc_handler));
+ GST_INFO_OBJECT (element, " flags 0x%08x", strh->flags);
+ GST_INFO_OBJECT (element, " priority %d", strh->priority);
+ GST_INFO_OBJECT (element, " init_frames %d", strh->init_frames);
+ GST_INFO_OBJECT (element, " scale %d", strh->scale);
+ GST_INFO_OBJECT (element, " rate %d", strh->rate);
+ GST_INFO_OBJECT (element, " start %d", strh->start);
+ GST_INFO_OBJECT (element, " length %d", strh->length);
+ GST_INFO_OBJECT (element, " bufsize %d", strh->bufsize);
+ GST_INFO_OBJECT (element, " quality %d", strh->quality);
+ GST_INFO_OBJECT (element, " samplesize %d", strh->samplesize);
+
+ *_strh = strh;
+
+ return TRUE;
+
+ /* ERRORS */
+too_small:
+ {
+ GST_ERROR_OBJECT (element,
+ "Too small strh (%" G_GSIZE_FORMAT " available, %d needed)",
+ size, (int) sizeof (gst_riff_strh));
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_strf_vids:
+ * @element: caller element (used for debugging/error).
+ * @buf: input data to be used for parsing, stripped from header.
+ * @strf: a pointer (returned by this function) to a filled-in
+ * strf/vids structure. Caller should free it.
+ * @data: a pointer (returned by this function) to a buffer
+ * containing extradata for this particular stream (e.g.
+ * palette, codec initialization data).
+ *
+ * Parses a video stream´s strf structure plus optionally some
+ * extradata from input data. 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.
+ */
+
+gboolean
+gst_riff_parse_strf_vids (GstElement * element,
+ GstBuffer * buf, gst_riff_strf_vids ** _strf, GstBuffer ** data)
+{
+ gst_riff_strf_vids *strf;
+ guint8 *bdata;
+ gsize size;
+
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (_strf != NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ bdata = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ if (size < sizeof (gst_riff_strf_vids))
+ goto too_small;
+
+ strf = g_memdup (bdata, size);
+ gst_buffer_unmap (buf, bdata, size);
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+ strf->size = GUINT32_FROM_LE (strf->size);
+ strf->width = GUINT32_FROM_LE (strf->width);
+ strf->height = GUINT32_FROM_LE (strf->height);
+ strf->planes = GUINT16_FROM_LE (strf->planes);
+ strf->bit_cnt = GUINT16_FROM_LE (strf->bit_cnt);
+ strf->compression = GUINT32_FROM_LE (strf->compression);
+ strf->image_size = GUINT32_FROM_LE (strf->image_size);
+ strf->xpels_meter = GUINT32_FROM_LE (strf->xpels_meter);
+ strf->ypels_meter = GUINT32_FROM_LE (strf->ypels_meter);
+ strf->num_colors = GUINT32_FROM_LE (strf->num_colors);
+ strf->imp_colors = GUINT32_FROM_LE (strf->imp_colors);
+#endif
+
+ /* size checking */
+ *data = NULL;
+ if (strf->size > size) {
+ GST_WARNING_OBJECT (element,
+ "strf_vids header gave %d bytes data, only %" G_GSIZE_FORMAT
+ " available", strf->size, size);
+ strf->size = size;
+ }
+ if (sizeof (gst_riff_strf_vids) < size) {
+ *data =
+ gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL,
+ sizeof (gst_riff_strf_vids), size - sizeof (gst_riff_strf_vids));
+ }
+ gst_buffer_unref (buf);
+
+ /* debug */
+ GST_INFO_OBJECT (element, "strf tag found in context vids:");
+ GST_INFO_OBJECT (element, " size %d", strf->size);
+ GST_INFO_OBJECT (element, " width %d", strf->width);
+ GST_INFO_OBJECT (element, " height %d", strf->height);
+ GST_INFO_OBJECT (element, " planes %d", strf->planes);
+ GST_INFO_OBJECT (element, " bit_cnt %d", strf->bit_cnt);
+ GST_INFO_OBJECT (element, " compression %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (strf->compression));
+ GST_INFO_OBJECT (element, " image_size %d", strf->image_size);
+ GST_INFO_OBJECT (element, " xpels_meter %d", strf->xpels_meter);
+ GST_INFO_OBJECT (element, " ypels_meter %d", strf->ypels_meter);
+ GST_INFO_OBJECT (element, " num_colors %d", strf->num_colors);
+ GST_INFO_OBJECT (element, " imp_colors %d", strf->imp_colors);
+ if (*data)
+ GST_INFO_OBJECT (element, " %" G_GSIZE_FORMAT " bytes extradata",
+ gst_buffer_get_size (*data));
+
+ *_strf = strf;
+
+ return TRUE;
+
+ /* ERRORS */
+too_small:
+ {
+ GST_ERROR_OBJECT (element,
+ "Too small strf_vids (%" G_GSIZE_FORMAT " available, %d needed)",
+ size, (int) sizeof (gst_riff_strf_vids));
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_strf_auds:
+ * @element: caller element (used for debugging/error).
+ * @buf: input data to be used for parsing, stripped from header.
+ * @strf: a pointer (returned by this function) to a filled-in
+ * strf/auds structure. Caller should free it.
+ * @data: a pointer (returned by this function) to a buffer
+ * containing extradata for this particular stream (e.g.
+ * codec initialization data).
+ *
+ * Parses an audio stream´s strf structure plus optionally some
+ * extradata from input data. This function takes ownership of @buf.
+ * use.
+ *
+ * Returns: TRUE if parsing succeeded, otherwise FALSE. The stream
+ * should be skipped on error, but it is not fatal.
+ */
+gboolean
+gst_riff_parse_strf_auds (GstElement * element,
+ GstBuffer * buf, gst_riff_strf_auds ** _strf, GstBuffer ** data)
+{
+ gst_riff_strf_auds *strf;
+ gsize bsize;
+ guint8 *bdata;
+
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (_strf != NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ if (bsize < sizeof (gst_riff_strf_auds))
+ goto too_small;
+
+ strf = g_memdup (bdata, bsize);
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+ strf->format = GUINT16_FROM_LE (strf->format);
+ strf->channels = GUINT16_FROM_LE (strf->channels);
+ strf->rate = GUINT32_FROM_LE (strf->rate);
+ strf->av_bps = GUINT32_FROM_LE (strf->av_bps);
+ strf->blockalign = GUINT16_FROM_LE (strf->blockalign);
+ strf->size = GUINT16_FROM_LE (strf->size);
+#endif
+
+ /* size checking */
+ *data = NULL;
+ if (bsize > sizeof (gst_riff_strf_auds) + 2) {
+ gint len;
+
+ len = GST_READ_UINT16_LE (&data[16]);
+ if (len + 2 + sizeof (gst_riff_strf_auds) > bsize) {
+ GST_WARNING_OBJECT (element,
+ "Extradata indicated %d bytes, but only %" G_GSSIZE_FORMAT
+ " available", len, bsize - 2 - sizeof (gst_riff_strf_auds));
+ len = bsize - 2 - sizeof (gst_riff_strf_auds);
+ }
+ if (len)
+ *data = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL,
+ sizeof (gst_riff_strf_auds) + 2, len);
+ }
+
+ /* debug */
+ GST_INFO_OBJECT (element, "strf tag found in context auds:");
+ GST_INFO_OBJECT (element, " format %d", strf->format);
+ GST_INFO_OBJECT (element, " channels %d", strf->channels);
+ GST_INFO_OBJECT (element, " rate %d", strf->rate);
+ GST_INFO_OBJECT (element, " av_bps %d", strf->av_bps);
+ GST_INFO_OBJECT (element, " blockalign %d", strf->blockalign);
+ GST_INFO_OBJECT (element, " size %d", strf->size);
+ if (*data)
+ GST_INFO_OBJECT (element, " %" G_GSIZE_FORMAT " bytes extradata",
+ gst_buffer_get_size (*data));
+
+ gst_buffer_unmap (buf, bdata, bsize);
+ gst_buffer_unref (buf);
+
+ *_strf = strf;
+
+ return TRUE;
+
+ /* ERROR */
+too_small:
+ {
+ GST_ERROR_OBJECT (element,
+ "Too small strf_auds (%" G_GSIZE_FORMAT " available"
+ ", %" G_GSSIZE_FORMAT " needed)", bsize, sizeof (gst_riff_strf_auds));
+ gst_buffer_unmap (buf, bdata, bsize);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_strf_iavs:
+ * @element: caller element (used for debugging/error).
+ * @buf: input data to be used for parsing, stripped from header.
+ * @strf: a pointer (returned by this function) to a filled-in
+ * strf/iavs structure. Caller should free it.
+ * @data: a pointer (returned by this function) to a buffer
+ * containing extradata for this particular stream (e.g.
+ * codec initialization data).
+ *
+ * Parses a interleaved (also known as "complex") stream´s strf
+ * structure plus optionally some extradata from input data. This
+ * function takes ownership of @buf.
+ *
+ * Returns: TRUE if parsing succeeded, otherwise FALSE.
+ */
+
+gboolean
+gst_riff_parse_strf_iavs (GstElement * element,
+ GstBuffer * buf, gst_riff_strf_iavs ** _strf, GstBuffer ** data)
+{
+ gst_riff_strf_iavs *strf;
+ gsize bsize;
+ guint8 *bdata;
+
+ g_return_val_if_fail (buf != NULL, FALSE);
+ g_return_val_if_fail (_strf != NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ if (bsize < sizeof (gst_riff_strf_iavs))
+ goto too_small;
+
+ strf = g_memdup (bdata, bsize);
+ gst_buffer_unmap (buf, bdata, bsize);
+
+ gst_buffer_unref (buf);
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+ strf->DVAAuxSrc = GUINT32_FROM_LE (strf->DVAAuxSrc);
+ strf->DVAAuxCtl = GUINT32_FROM_LE (strf->DVAAuxCtl);
+ strf->DVAAuxSrc1 = GUINT32_FROM_LE (strf->DVAAuxSrc1);
+ strf->DVAAuxCtl1 = GUINT32_FROM_LE (strf->DVAAuxCtl1);
+ strf->DVVAuxSrc = GUINT32_FROM_LE (strf->DVVAuxSrc);
+ strf->DVVAuxCtl = GUINT32_FROM_LE (strf->DVVAuxCtl);
+ strf->DVReserved1 = GUINT32_FROM_LE (strf->DVReserved1);
+ strf->DVReserved2 = GUINT32_FROM_LE (strf->DVReserved2);
+#endif
+
+ /* debug */
+ GST_INFO_OBJECT (element, "strf tag found in context iavs:");
+ GST_INFO_OBJECT (element, " DVAAuxSrc %08x", strf->DVAAuxSrc);
+ GST_INFO_OBJECT (element, " DVAAuxCtl %08x", strf->DVAAuxCtl);
+ GST_INFO_OBJECT (element, " DVAAuxSrc1 %08x", strf->DVAAuxSrc1);
+ GST_INFO_OBJECT (element, " DVAAuxCtl1 %08x", strf->DVAAuxCtl1);
+ GST_INFO_OBJECT (element, " DVVAuxSrc %08x", strf->DVVAuxSrc);
+ GST_INFO_OBJECT (element, " DVVAuxCtl %08x", strf->DVVAuxCtl);
+ GST_INFO_OBJECT (element, " DVReserved1 %08x", strf->DVReserved1);
+ GST_INFO_OBJECT (element, " DVReserved2 %08x", strf->DVReserved2);
+
+ *_strf = strf;
+ *data = NULL;
+
+ return TRUE;
+
+ /* ERRORS */
+too_small:
+ {
+ GST_ERROR_OBJECT (element,
+ "Too small strf_iavs (%" G_GSIZE_FORMAT "available"
+ ", %" G_GSSIZE_FORMAT " needed)", bsize, sizeof (gst_riff_strf_iavs));
+ gst_buffer_unmap (buf, bdata, bsize);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_riff_parse_info:
+ * @element: caller element (used for debugging/error).
+ * @buf: input data to be used for parsing, stripped from header.
+ * @taglist: a pointer to a taglist (returned by this function)
+ * containing information about this stream. May be
+ * NULL if no supported tags were found.
+ *
+ * Parses stream metadata from input data.
+ */
+void
+gst_riff_parse_info (GstElement * element,
+ GstBuffer * buf, GstTagList ** _taglist)
+{
+ guint8 *data, *ptr;
+ gsize size, left;
+ guint tsize;
+ guint32 tag;
+ const gchar *type;
+ GstTagList *taglist;
+
+ g_return_if_fail (_taglist != NULL);
+
+ if (!buf) {
+ *_taglist = NULL;
+ return;
+ }
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+
+ taglist = gst_tag_list_new ();
+
+ ptr = data;
+ left = size;
+
+ while (left > 8) {
+ tag = GST_READ_UINT32_LE (ptr);
+ tsize = GST_READ_UINT32_LE (ptr + 4);
+ left -= 8;
+ ptr += 8;
+
+ GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u",
+ GST_FOURCC_ARGS (tag), tsize);
+
+ if (tsize > left) {
+ GST_WARNING_OBJECT (element,
+ "Tagsize %d is larger than available data %" G_GSIZE_FORMAT,
+ tsize, left);
+ tsize = left;
+ }
+
+ /* find out the type of metadata */
+ switch (tag) {
+ case GST_RIFF_INFO_IARL:
+ type = GST_TAG_LOCATION;
+ break;
+ case GST_RIFF_INFO_IART:
+ type = GST_TAG_ARTIST;
+ break;
+ case GST_RIFF_INFO_ICMS:
+ type = NULL; /*"Commissioner"; */
+ break;
+ case GST_RIFF_INFO_ICMT:
+ type = GST_TAG_COMMENT;
+ break;
+ case GST_RIFF_INFO_ICOP:
+ type = GST_TAG_COPYRIGHT;
+ break;
+ case GST_RIFF_INFO_ICRD:
+ type = GST_TAG_DATE;
+ break;
+ case GST_RIFF_INFO_ICRP:
+ type = NULL; /*"Cropped"; */
+ break;
+ case GST_RIFF_INFO_IDIM:
+ type = NULL; /*"Dimensions"; */
+ break;
+ case GST_RIFF_INFO_IDPI:
+ type = NULL; /*"Dots per Inch"; */
+ break;
+ case GST_RIFF_INFO_IENG:
+ type = NULL; /*"Engineer"; */
+ break;
+ case GST_RIFF_INFO_IGNR:
+ type = GST_TAG_GENRE;
+ break;
+ case GST_RIFF_INFO_IKEY:
+ type = GST_TAG_KEYWORDS;
+ break;
+ case GST_RIFF_INFO_ILGT:
+ type = NULL; /*"Lightness"; */
+ break;
+ case GST_RIFF_INFO_IMED:
+ type = NULL; /*"Medium"; */
+ break;
+ case GST_RIFF_INFO_INAM:
+ type = GST_TAG_TITLE;
+ break;
+ case GST_RIFF_INFO_IPLT:
+ type = NULL; /*"Palette"; */
+ break;
+ case GST_RIFF_INFO_IPRD:
+ type = NULL; /*"Product"; */
+ break;
+ case GST_RIFF_INFO_ISBJ:
+ type = NULL; /*"Subject"; */
+ break;
+ case GST_RIFF_INFO_ISFT:
+ type = GST_TAG_ENCODER;
+ break;
+ case GST_RIFF_INFO_ISHP:
+ type = NULL; /*"Sharpness"; */
+ break;
+ case GST_RIFF_INFO_ISRC:
+ type = GST_TAG_ISRC;
+ break;
+ case GST_RIFF_INFO_ISRF:
+ type = NULL; /*"Source Form"; */
+ break;
+ case GST_RIFF_INFO_ITCH:
+ type = NULL; /*"Technician"; */
+ break;
+ default:
+ type = NULL;
+ GST_WARNING_OBJECT (element,
+ "Unknown INFO (metadata) tag entry %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (tag));
+ break;
+ }
+
+ if (type != NULL && ptr[0] != '\0') {
+ static const gchar *env_vars[] = { "GST_AVI_TAG_ENCODING",
+ "GST_RIFF_TAG_ENCODING", "GST_TAG_ENCODING", NULL
+ };
+ gchar *val;
+
+ val = gst_tag_freeform_string_to_utf8 ((gchar *) ptr, tsize, env_vars);
+
+ if (val) {
+ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL);
+ g_free (val);
+ } else {
+ GST_WARNING_OBJECT (element, "could not extract %s tag", type);
+ }
+ }
+
+ if (tsize & 1) {
+ tsize++;
+ if (tsize > left)
+ tsize = left;
+ }
+
+ ptr += tsize;
+ left -= tsize;
+ }
+
+ if (!gst_tag_list_is_empty (taglist)) {
+ *_taglist = taglist;
+ } else {
+ *_taglist = NULL;
+ gst_tag_list_free (taglist);
+ }
+ gst_buffer_unmap (buf, data, size);
+
+ return;
+}
diff --git a/gst-libs/gst/riff/riff-read.h b/gst-libs/gst/riff/riff-read.h
new file mode 100644
index 0000000..cf07dda
--- /dev/null
+++ b/gst-libs/gst/riff/riff-read.h
@@ -0,0 +1,87 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff-read.h: function declarations for parsing a RIFF file
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RIFF_READ_H__
+#define __GST_RIFF_READ_H__
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "riff-ids.h"
+
+G_BEGIN_DECLS
+
+/*
+ * Operate using pull_range().
+ */
+
+GstFlowReturn gst_riff_read_chunk (GstElement * element,
+ GstPad * pad,
+ guint64 * offset,
+ guint32 * tag,
+ GstBuffer ** chunk_data);
+
+/*
+ * These functions operate on provided data (the caller is
+ * supposed to strip the chunk headers). The buffer is
+ * provided by the caller, the strf/strh/data are filled in
+ * by the function.
+ */
+
+gboolean gst_riff_parse_chunk (GstElement * element,
+ GstBuffer * buf,
+ guint * offset,
+ guint32 * fourcc,
+ GstBuffer ** chunk_data);
+
+gboolean gst_riff_parse_file_header (GstElement * element,
+ GstBuffer * buf,
+ guint32 * doctype);
+
+gboolean gst_riff_parse_strh (GstElement * element,
+ GstBuffer * buf,
+ gst_riff_strh ** strh);
+
+gboolean gst_riff_parse_strf_vids (GstElement * element,
+ GstBuffer * buf,
+ gst_riff_strf_vids ** strf,
+ GstBuffer ** data);
+gboolean gst_riff_parse_strf_auds (GstElement * element,
+ GstBuffer * buf,
+ gst_riff_strf_auds ** strf,
+ GstBuffer ** data);
+gboolean gst_riff_parse_strf_iavs (GstElement * element,
+ GstBuffer * buf,
+ gst_riff_strf_iavs ** strf,
+ GstBuffer ** data);
+
+void gst_riff_parse_info (GstElement * element,
+ GstBuffer * buf,
+ GstTagList ** taglist);
+
+/*
+ * Init.
+ */
+void gst_riff_init (void);
+
+G_END_DECLS
+
+#endif /* __GST_RIFF_READ_H__ */
diff --git a/gst-libs/gst/riff/riff.c b/gst-libs/gst/riff/riff.c
new file mode 100644
index 0000000..d14b32a
--- /dev/null
+++ b/gst-libs/gst/riff/riff.c
@@ -0,0 +1,48 @@
+/* GStreamer RIFF I/O
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * riff.c: library initialisation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstriff
+ * @short_description: Riff fileformat utillity functions.
+ *
+ * A collection of functions to handle riff base files, such as avi, wav and
+ * asf.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include "riff-read.h"
+
+GST_DEBUG_CATEGORY (riff_debug);
+
+/**
+ * gst_riff_init:
+ *
+ * Initialize riff library.
+ */
+void
+gst_riff_init (void)
+{
+ GST_DEBUG_CATEGORY_INIT (riff_debug, "riff", 0, "RIFF I/O");
+}
diff --git a/gst-libs/gst/rtp/Makefile.am b/gst-libs/gst/rtp/Makefile.am
new file mode 100644
index 0000000..79d8126
--- /dev/null
+++ b/gst-libs/gst/rtp/Makefile.am
@@ -0,0 +1,86 @@
+libgstrtpincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/rtp
+
+libgstrtpinclude_HEADERS = gstrtpbuffer.h \
+ gstrtcpbuffer.h \
+ gstrtppayloads.h \
+ gstbasertpaudiopayload.h \
+ gstbasertppayload.h \
+ gstbasertpdepayload.h
+
+lib_LTLIBRARIES = libgstrtp-@GST_MAJORMINOR@.la
+
+libgstrtp_@GST_MAJORMINOR@_la_SOURCES = gstrtpbuffer.c \
+ gstrtcpbuffer.c \
+ gstrtppayloads.c \
+ gstbasertpaudiopayload.c \
+ gstbasertppayload.c \
+ gstbasertpdepayload.c
+
+libgstrtp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstrtp_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
+libgstrtp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstRtp-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstrtpinclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/rtp/%',$(libgstrtpinclude_HEADERS))
+
+GstRtp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtp-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstRtp \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstrtp-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-rtp-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstrtp -:SHARED libgstrtp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstrtp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstrtp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/rtp \
+ -:HEADERS $(libgstrtp_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/rtp/Makefile.in b/gst-libs/gst/rtp/Makefile.in
new file mode 100644
index 0000000..8ac7881
--- /dev/null
+++ b/gst-libs/gst/rtp/Makefile.in
@@ -0,0 +1,946 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/rtp
+DIST_COMMON = README $(libgstrtpinclude_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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstrtpincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstrtp_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstrtp_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo \
+ libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo \
+ libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo \
+ libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo \
+ libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo \
+ libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo
+libgstrtp_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstrtp_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstrtp_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstrtp_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstrtpinclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+libgstrtpincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/rtp
+libgstrtpinclude_HEADERS = gstrtpbuffer.h \
+ gstrtcpbuffer.h \
+ gstrtppayloads.h \
+ gstbasertpaudiopayload.h \
+ gstbasertppayload.h \
+ gstbasertpdepayload.h
+
+lib_LTLIBRARIES = libgstrtp-@GST_MAJORMINOR@.la
+libgstrtp_@GST_MAJORMINOR@_la_SOURCES = gstrtpbuffer.c \
+ gstrtcpbuffer.c \
+ gstrtppayloads.c \
+ gstbasertpaudiopayload.c \
+ gstbasertppayload.c \
+ gstbasertpdepayload.c
+
+libgstrtp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstrtp_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
+libgstrtp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstRtp-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstrtpinclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/rtp/%',$(libgstrtpinclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_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-libs/gst/rtp/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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-@GST_MAJORMINOR@.la: $(libgstrtp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstrtp_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstrtp_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstrtp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstrtp_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo: gstrtpbuffer.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo `test -f 'gstrtpbuffer.c' || echo '$(srcdir)/'`gstrtpbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtpbuffer.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtpbuffer.lo `test -f 'gstrtpbuffer.c' || echo '$(srcdir)/'`gstrtpbuffer.c
+
+libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo: gstrtcpbuffer.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo `test -f 'gstrtcpbuffer.c' || echo '$(srcdir)/'`gstrtcpbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtcpbuffer.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtcpbuffer.lo `test -f 'gstrtcpbuffer.c' || echo '$(srcdir)/'`gstrtcpbuffer.c
+
+libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo: gstrtppayloads.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo `test -f 'gstrtppayloads.c' || echo '$(srcdir)/'`gstrtppayloads.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtppayloads.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstrtppayloads.lo `test -f 'gstrtppayloads.c' || echo '$(srcdir)/'`gstrtppayloads.c
+
+libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo: gstbasertpaudiopayload.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo `test -f 'gstbasertpaudiopayload.c' || echo '$(srcdir)/'`gstbasertpaudiopayload.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasertpaudiopayload.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertpaudiopayload.lo `test -f 'gstbasertpaudiopayload.c' || echo '$(srcdir)/'`gstbasertpaudiopayload.c
+
+libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo: gstbasertppayload.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo `test -f 'gstbasertppayload.c' || echo '$(srcdir)/'`gstbasertppayload.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasertppayload.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertppayload.lo `test -f 'gstbasertppayload.c' || echo '$(srcdir)/'`gstbasertppayload.c
+
+libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo: gstbasertpdepayload.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) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo -MD -MP -MF $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.Tpo -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo `test -f 'gstbasertpdepayload.c' || echo '$(srcdir)/'`gstbasertpdepayload.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.Tpo $(DEPDIR)/libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasertpdepayload.c' object='libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_@GST_MAJORMINOR@_la-gstbasertpdepayload.lo `test -f 'gstbasertpdepayload.c' || echo '$(srcdir)/'`gstbasertpdepayload.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstrtpincludeHEADERS: $(libgstrtpinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstrtpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstrtpincludedir)"
+ @list='$(libgstrtpinclude_HEADERS)'; test -n "$(libgstrtpincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstrtpincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstrtpincludedir)" || exit $$?; \
+ done
+
+uninstall-libgstrtpincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstrtpinclude_HEADERS)'; test -n "$(libgstrtpincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstrtpincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstrtpincludedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstrtpincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA install-libgstrtpincludeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstrtpincludeHEADERS uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgstrtpincludeHEADERS \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES uninstall-libgstrtpincludeHEADERS \
+ uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstRtp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtp-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstRtp \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstrtp-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstBase-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-rtp-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstrtp -:SHARED libgstrtp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstrtp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstrtp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstrtp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/rtp \
+ -:HEADERS $(libgstrtp_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/rtp/README b/gst-libs/gst/rtp/README
new file mode 100644
index 0000000..77253b7
--- /dev/null
+++ b/gst-libs/gst/rtp/README
@@ -0,0 +1,66 @@
+The RTP libraries
+---------------------
+
+ RTP Buffers
+ -----------
+ The real time protocol as described in RFC 3550 requires the use of special
+ packets containing an additional RTP header of at least 12 bytes. GStreamer
+ provides some helper functions for creating and parsing these RTP headers.
+ The result is a normal #GstBuffer with an additional RTP header.
+
+ RTP buffers are usually created with gst_rtp_buffer_new_allocate() or
+ gst_rtp_buffer_new_allocate_len(). These functions create buffers with a
+ preallocated space of memory. It will also ensure that enough memory
+ is allocated for the RTP header. The first function is used when the payload
+ size is known. gst_rtp_buffer_new_allocate_len() should be used when the size
+ of the whole RTP buffer (RTP header + payload) is known.
+
+ When receiving RTP buffers from a network, gst_rtp_buffer_new_take_data()
+ should be used when the user would like to parse that RTP packet. (TODO Ask
+ Wim what the real purpose of this function is as it seems to simply create a
+ duplicate GstBuffer with the same data as the previous one). The
+ function will create a new RTP buffer with the given data as the whole RTP
+ packet. Alternatively, gst_rtp_buffer_new_copy_data() can be used if the user
+ wishes to make a copy of the data before using it in the new RTP buffer. An
+ important function is gst_rtp_buffer_validate() that is used to verify that
+ the buffer a well formed RTP buffer.
+
+ It is now possible to use all the gst_rtp_buffer_get_*() or
+ gst_rtp_buffer_set_*() functions to read or write the different parts of the
+ RTP header such as the payload type, the sequence number or the RTP
+ timestamp. The use can also retreive a pointer to the actual RTP payload data
+ using the gst_rtp_buffer_get_payload() function.
+
+ RTP Base Payloader Class (GstBaseRTPPayload)
+ --------------------------------------------
+
+ All RTP payloader elements (audio or video) should derive from this class.
+
+ RTP Base Audio Payloader Class (GstBaseRTPAudioPayload)
+ -------------------------------------------------------
+
+ This base class can be tested through it's children classes. Here is an
+ example using the iLBC payloader (frame based).
+
+ For 20ms mode :
+
+ GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
+ sizemax=114 datarate=1900 ! audio/x-iLBC, mode=20 ! rtpilbcpay
+ max-ptime="40000000" ! fakesink
+
+ For 30ms mode :
+
+ GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
+ sizemax=150 datarate=1662 ! audio/x-iLBC, mode=30 ! rtpilbcpay
+ max-ptime="60000000" ! fakesink
+
+ Here is an example using the uLaw payloader (sample based).
+
+ GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
+ sizemax=150 datarate=8000 ! audio/x-mulaw ! rtppcmupay max-ptime="6000000" !
+ fakesink
+
+ RTP Base Depayloader Class (GstBaseRTPDepayload)
+ ------------------------------------------------
+
+ All RTP depayloader elements (audio or video) should derive from this class.
diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.c b/gst-libs/gst/rtp/gstbasertpaudiopayload.c
new file mode 100644
index 0000000..d9a7c5b
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.c
@@ -0,0 +1,1002 @@
+/* GStreamer
+ * Copyright (C) <2006> Philippe Khalaf <philippe.kalaf@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstbasertpaudiopayload
+ * @short_description: Base class for audio RTP payloader
+ *
+ * Provides a base class for audio RTP payloaders for frame or sample based
+ * audio codecs (constant bitrate)
+ *
+ * This class derives from GstBaseRTPPayload. It can be used for payloading
+ * audio codecs. It will only work with constant bitrate codecs. It supports
+ * both frame based and sample based codecs. It takes care of packing up the
+ * audio data into RTP packets and filling up the headers accordingly. The
+ * payloading is done based on the maximum MTU (mtu) and the maximum time per
+ * packet (max-ptime). The general idea is to divide large data buffers into
+ * smaller RTP packets. The RTP packet size is the minimum of either the MTU,
+ * max-ptime (if set) or available data. The RTP packet size is always larger or
+ * equal to min-ptime (if set). If min-ptime is not set, any residual data is
+ * sent in a last RTP packet. In the case of frame based codecs, the resulting
+ * RTP packets always contain full frames.
+ *
+ * <refsect2>
+ * <title>Usage</title>
+ * <para>
+ * To use this base class, your child element needs to call either
+ * gst_base_rtp_audio_payload_set_frame_based() or
+ * gst_base_rtp_audio_payload_set_sample_based(). This is usually done in the
+ * element's _init() function. Then, the child element must call either
+ * gst_base_rtp_audio_payload_set_frame_options(),
+ * gst_base_rtp_audio_payload_set_sample_options() or
+ * gst_base_rtp_audio_payload_set_samplebits_options. Since
+ * GstBaseRTPAudioPayload derives from GstBaseRTPPayload, the child element
+ * must set any variables or call/override any functions required by that base
+ * class. The child element does not need to override any other functions
+ * specific to GstBaseRTPAudioPayload.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <gst/rtp/gstrtpbuffer.h>
+#include <gst/base/gstadapter.h>
+
+#include "gstbasertpaudiopayload.h"
+
+GST_DEBUG_CATEGORY_STATIC (basertpaudiopayload_debug);
+#define GST_CAT_DEFAULT (basertpaudiopayload_debug)
+
+#define DEFAULT_BUFFER_LIST FALSE
+
+enum
+{
+ PROP_0,
+ PROP_BUFFER_LIST,
+ PROP_LAST
+};
+
+/* function to convert bytes to a time */
+typedef GstClockTime (*GetBytesToTimeFunc) (GstBaseRTPAudioPayload * payload,
+ guint64 bytes);
+/* function to convert bytes to a RTP time */
+typedef guint32 (*GetBytesToRTPTimeFunc) (GstBaseRTPAudioPayload * payload,
+ guint64 bytes);
+/* function to convert time to bytes */
+typedef guint64 (*GetTimeToBytesFunc) (GstBaseRTPAudioPayload * payload,
+ GstClockTime time);
+
+struct _GstBaseRTPAudioPayloadPrivate
+{
+ GetBytesToTimeFunc bytes_to_time;
+ GetBytesToRTPTimeFunc bytes_to_rtptime;
+ GetTimeToBytesFunc time_to_bytes;
+
+ GstAdapter *adapter;
+ guint fragment_size;
+ GstClockTime frame_duration_ns;
+ gboolean discont;
+ guint64 offset;
+ GstClockTime last_timestamp;
+ guint32 last_rtptime;
+ guint align;
+
+ guint cached_mtu;
+ guint cached_min_ptime;
+ guint cached_max_ptime;
+ guint cached_ptime;
+ guint cached_min_length;
+ guint cached_max_length;
+ guint cached_ptime_multiple;
+ guint cached_align;
+
+ gboolean buffer_list;
+};
+
+
+#define GST_BASE_RTP_AUDIO_PAYLOAD_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_BASE_RTP_AUDIO_PAYLOAD, \
+ GstBaseRTPAudioPayloadPrivate))
+
+static void gst_base_rtp_audio_payload_finalize (GObject * object);
+
+static void gst_base_rtp_audio_payload_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_base_rtp_audio_payload_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+/* bytes to time functions */
+static GstClockTime
+gst_base_rtp_audio_payload_frame_bytes_to_time (GstBaseRTPAudioPayload *
+ payload, guint64 bytes);
+static GstClockTime
+gst_base_rtp_audio_payload_sample_bytes_to_time (GstBaseRTPAudioPayload *
+ payload, guint64 bytes);
+
+/* bytes to RTP time functions */
+static guint32
+gst_base_rtp_audio_payload_frame_bytes_to_rtptime (GstBaseRTPAudioPayload *
+ payload, guint64 bytes);
+static guint32
+gst_base_rtp_audio_payload_sample_bytes_to_rtptime (GstBaseRTPAudioPayload *
+ payload, guint64 bytes);
+
+/* time to bytes functions */
+static guint64
+gst_base_rtp_audio_payload_frame_time_to_bytes (GstBaseRTPAudioPayload *
+ payload, GstClockTime time);
+static guint64
+gst_base_rtp_audio_payload_sample_time_to_bytes (GstBaseRTPAudioPayload *
+ payload, GstClockTime time);
+
+static GstFlowReturn gst_base_rtp_audio_payload_handle_buffer (GstBaseRTPPayload
+ * payload, GstBuffer * buffer);
+
+static GstStateChangeReturn gst_base_rtp_payload_audio_change_state (GstElement
+ * element, GstStateChange transition);
+
+static gboolean gst_base_rtp_payload_audio_handle_event (GstBaseRTPPayload
+ * payload, GstEvent * event);
+
+#define gst_base_rtp_audio_payload_parent_class parent_class
+G_DEFINE_TYPE (GstBaseRTPAudioPayload, gst_base_rtp_audio_payload,
+ GST_TYPE_BASE_RTP_PAYLOAD);
+
+static void
+gst_base_rtp_audio_payload_class_init (GstBaseRTPAudioPayloadClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseRTPPayloadClass *gstbasertppayload_class;
+
+ g_type_class_add_private (klass, sizeof (GstBaseRTPAudioPayloadPrivate));
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass;
+
+ gobject_class->finalize = gst_base_rtp_audio_payload_finalize;
+ gobject_class->set_property = gst_base_rtp_audio_payload_set_property;
+ gobject_class->get_property = gst_base_rtp_audio_payload_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_DEBUG_FUNCPTR (gst_base_rtp_payload_audio_change_state);
+
+ gstbasertppayload_class->handle_buffer =
+ GST_DEBUG_FUNCPTR (gst_base_rtp_audio_payload_handle_buffer);
+ gstbasertppayload_class->handle_event =
+ GST_DEBUG_FUNCPTR (gst_base_rtp_payload_audio_handle_event);
+
+ GST_DEBUG_CATEGORY_INIT (basertpaudiopayload_debug, "basertpaudiopayload", 0,
+ "base audio RTP payloader");
+}
+
+static void
+gst_base_rtp_audio_payload_init (GstBaseRTPAudioPayload * payload)
+{
+ payload->priv = GST_BASE_RTP_AUDIO_PAYLOAD_GET_PRIVATE (payload);
+
+ /* these need to be set by child object if frame based */
+ payload->frame_size = 0;
+ payload->frame_duration = 0;
+
+ /* these need to be set by child object if sample based */
+ payload->sample_size = 0;
+
+ payload->priv->adapter = gst_adapter_new ();
+
+ payload->priv->buffer_list = DEFAULT_BUFFER_LIST;
+}
+
+static void
+gst_base_rtp_audio_payload_finalize (GObject * object)
+{
+ GstBaseRTPAudioPayload *payload;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD (object);
+
+ g_object_unref (payload->priv->adapter);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static void
+gst_base_rtp_audio_payload_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstBaseRTPAudioPayload *payload;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_LIST:
+ payload->priv->buffer_list = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_rtp_audio_payload_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstBaseRTPAudioPayload *payload;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD (object);
+
+ switch (prop_id) {
+ case PROP_BUFFER_LIST:
+ g_value_set_boolean (value, payload->priv->buffer_list);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/**
+ * gst_base_rtp_audio_payload_set_frame_based:
+ * @basertpaudiopayload: a pointer to the element.
+ *
+ * Tells #GstBaseRTPAudioPayload that the child element is for a frame based
+ * audio codec
+ */
+void
+gst_base_rtp_audio_payload_set_frame_based (GstBaseRTPAudioPayload *
+ basertpaudiopayload)
+{
+ g_return_if_fail (basertpaudiopayload != NULL);
+ g_return_if_fail (basertpaudiopayload->priv->time_to_bytes == NULL);
+ g_return_if_fail (basertpaudiopayload->priv->bytes_to_time == NULL);
+ g_return_if_fail (basertpaudiopayload->priv->bytes_to_rtptime == NULL);
+
+ basertpaudiopayload->priv->bytes_to_time =
+ gst_base_rtp_audio_payload_frame_bytes_to_time;
+ basertpaudiopayload->priv->bytes_to_rtptime =
+ gst_base_rtp_audio_payload_frame_bytes_to_rtptime;
+ basertpaudiopayload->priv->time_to_bytes =
+ gst_base_rtp_audio_payload_frame_time_to_bytes;
+}
+
+/**
+ * gst_base_rtp_audio_payload_set_sample_based:
+ * @basertpaudiopayload: a pointer to the element.
+ *
+ * Tells #GstBaseRTPAudioPayload that the child element is for a sample based
+ * audio codec
+ */
+void
+gst_base_rtp_audio_payload_set_sample_based (GstBaseRTPAudioPayload *
+ basertpaudiopayload)
+{
+ g_return_if_fail (basertpaudiopayload != NULL);
+ g_return_if_fail (basertpaudiopayload->priv->time_to_bytes == NULL);
+ g_return_if_fail (basertpaudiopayload->priv->bytes_to_time == NULL);
+ g_return_if_fail (basertpaudiopayload->priv->bytes_to_rtptime == NULL);
+
+ basertpaudiopayload->priv->bytes_to_time =
+ gst_base_rtp_audio_payload_sample_bytes_to_time;
+ basertpaudiopayload->priv->bytes_to_rtptime =
+ gst_base_rtp_audio_payload_sample_bytes_to_rtptime;
+ basertpaudiopayload->priv->time_to_bytes =
+ gst_base_rtp_audio_payload_sample_time_to_bytes;
+}
+
+/**
+ * gst_base_rtp_audio_payload_set_frame_options:
+ * @basertpaudiopayload: a pointer to the element.
+ * @frame_duration: The duraction of an audio frame in milliseconds.
+ * @frame_size: The size of an audio frame in bytes.
+ *
+ * Sets the options for frame based audio codecs.
+ *
+ */
+void
+gst_base_rtp_audio_payload_set_frame_options (GstBaseRTPAudioPayload
+ * basertpaudiopayload, gint frame_duration, gint frame_size)
+{
+ GstBaseRTPAudioPayloadPrivate *priv;
+
+ g_return_if_fail (basertpaudiopayload != NULL);
+
+ priv = basertpaudiopayload->priv;
+
+ basertpaudiopayload->frame_duration = frame_duration;
+ priv->frame_duration_ns = frame_duration * GST_MSECOND;
+ basertpaudiopayload->frame_size = frame_size;
+ priv->align = frame_size;
+
+ gst_adapter_clear (priv->adapter);
+
+ GST_DEBUG_OBJECT (basertpaudiopayload, "frame set to %d ms and size %d",
+ frame_duration, frame_size);
+}
+
+/**
+ * gst_base_rtp_audio_payload_set_sample_options:
+ * @basertpaudiopayload: a pointer to the element.
+ * @sample_size: Size per sample in bytes.
+ *
+ * Sets the options for sample based audio codecs.
+ */
+void
+gst_base_rtp_audio_payload_set_sample_options (GstBaseRTPAudioPayload
+ * basertpaudiopayload, gint sample_size)
+{
+ g_return_if_fail (basertpaudiopayload != NULL);
+
+ /* sample_size is in bits internally */
+ gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload,
+ sample_size * 8);
+}
+
+/**
+ * gst_base_rtp_audio_payload_set_samplebits_options:
+ * @basertpaudiopayload: a pointer to the element.
+ * @sample_size: Size per sample in bits.
+ *
+ * Sets the options for sample based audio codecs.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_base_rtp_audio_payload_set_samplebits_options (GstBaseRTPAudioPayload
+ * basertpaudiopayload, gint sample_size)
+{
+ guint fragment_size;
+ GstBaseRTPAudioPayloadPrivate *priv;
+
+ g_return_if_fail (basertpaudiopayload != NULL);
+
+ priv = basertpaudiopayload->priv;
+
+ basertpaudiopayload->sample_size = sample_size;
+
+ /* sample_size is in bits and is converted into multiple bytes */
+ fragment_size = sample_size;
+ while ((fragment_size % 8) != 0)
+ fragment_size += fragment_size;
+ priv->fragment_size = fragment_size / 8;
+ priv->align = priv->fragment_size;
+
+ gst_adapter_clear (priv->adapter);
+
+ GST_DEBUG_OBJECT (basertpaudiopayload,
+ "Samplebits set to sample size %d bits", sample_size);
+}
+
+static void
+gst_base_rtp_audio_payload_set_meta (GstBaseRTPAudioPayload * payload,
+ GstBuffer * buffer, guint payload_len, GstClockTime timestamp)
+{
+ GstBaseRTPPayload *basepayload;
+ GstBaseRTPAudioPayloadPrivate *priv;
+ GstRTPBuffer rtp;
+
+ basepayload = GST_BASE_RTP_PAYLOAD_CAST (payload);
+ priv = payload->priv;
+
+ /* set payload type */
+ gst_rtp_buffer_map (buffer, GST_MAP_WRITE, &rtp);
+ gst_rtp_buffer_set_payload_type (&rtp, basepayload->pt);
+ /* set marker bit for disconts */
+ if (priv->discont) {
+ GST_DEBUG_OBJECT (payload, "Setting marker and DISCONT");
+ gst_rtp_buffer_set_marker (&rtp, TRUE);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ priv->discont = FALSE;
+ }
+ gst_rtp_buffer_unmap (&rtp);
+
+ GST_BUFFER_TIMESTAMP (buffer) = timestamp;
+
+ /* get the offset in RTP time */
+ GST_BUFFER_OFFSET (buffer) = priv->bytes_to_rtptime (payload, priv->offset);
+
+ priv->offset += payload_len;
+
+ /* Set the duration from the size */
+ GST_BUFFER_DURATION (buffer) = priv->bytes_to_time (payload, payload_len);
+
+ /* remember the last rtptime/timestamp pair. We will use this to realign our
+ * RTP timestamp after a buffer discont */
+ priv->last_rtptime = GST_BUFFER_OFFSET (buffer);
+ priv->last_timestamp = timestamp;
+}
+
+/**
+ * gst_base_rtp_audio_payload_push:
+ * @baseaudiopayload: a #GstBaseRTPPayload
+ * @data: data to set as payload
+ * @payload_len: length of payload
+ * @timestamp: a #GstClockTime
+ *
+ * Create an RTP buffer and store @payload_len bytes of @data as the
+ * payload. Set the timestamp on the new buffer to @timestamp before pushing
+ * the buffer downstream.
+ *
+ * Returns: a #GstFlowReturn
+ *
+ * Since: 0.10.13
+ */
+GstFlowReturn
+gst_base_rtp_audio_payload_push (GstBaseRTPAudioPayload * baseaudiopayload,
+ const guint8 * data, guint payload_len, GstClockTime timestamp)
+{
+ GstBaseRTPPayload *basepayload;
+ GstBuffer *outbuf;
+ guint8 *payload;
+ GstFlowReturn ret;
+ GstRTPBuffer rtp;
+
+ basepayload = GST_BASE_RTP_PAYLOAD (baseaudiopayload);
+
+ GST_DEBUG_OBJECT (baseaudiopayload, "Pushing %d bytes ts %" GST_TIME_FORMAT,
+ payload_len, GST_TIME_ARGS (timestamp));
+
+ /* create buffer to hold the payload */
+ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
+
+ /* copy payload */
+ gst_rtp_buffer_map (outbuf, GST_MAP_WRITE, &rtp);
+ payload = gst_rtp_buffer_get_payload (&rtp);
+ memcpy (payload, data, payload_len);
+ gst_rtp_buffer_unmap (&rtp);
+
+ /* set metadata */
+ gst_base_rtp_audio_payload_set_meta (baseaudiopayload, outbuf, payload_len,
+ timestamp);
+
+ ret = gst_basertppayload_push (basepayload, outbuf);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_base_rtp_audio_payload_push_buffer (GstBaseRTPAudioPayload *
+ baseaudiopayload, GstBuffer * buffer, GstClockTime timestamp)
+{
+ GstBaseRTPPayload *basepayload;
+ GstBaseRTPAudioPayloadPrivate *priv;
+ GstBuffer *outbuf;
+ guint8 *payload;
+ guint payload_len;
+ GstFlowReturn ret;
+
+ priv = baseaudiopayload->priv;
+ basepayload = GST_BASE_RTP_PAYLOAD (baseaudiopayload);
+
+ payload_len = gst_buffer_get_size (buffer);
+
+ GST_DEBUG_OBJECT (baseaudiopayload, "Pushing %d bytes ts %" GST_TIME_FORMAT,
+ payload_len, GST_TIME_ARGS (timestamp));
+
+ if (priv->buffer_list) {
+ /* create just the RTP header buffer */
+ outbuf = gst_rtp_buffer_new_allocate (0, 0, 0);
+ } else {
+ /* create buffer to hold the payload */
+ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
+ }
+
+ /* set metadata */
+ gst_base_rtp_audio_payload_set_meta (baseaudiopayload, outbuf, payload_len,
+ timestamp);
+
+ if (priv->buffer_list) {
+ GstBufferList *list;
+ guint i, len;
+
+ list = gst_buffer_list_new ();
+ len = gst_buffer_list_len (list);
+
+ for (i = 0; i < len; i++) {
+ /* FIXME */
+ g_warning ("bufferlist not implemented");
+ gst_buffer_list_add (list, outbuf);
+ gst_buffer_list_add (list, buffer);
+ }
+
+ GST_DEBUG_OBJECT (baseaudiopayload, "Pushing list %p", list);
+ ret = gst_basertppayload_push_list (basepayload, list);
+ } else {
+ GstRTPBuffer rtp;
+
+ /* copy payload */
+ gst_rtp_buffer_map (outbuf, GST_MAP_WRITE, &rtp);
+ payload = gst_rtp_buffer_get_payload (&rtp);
+ gst_buffer_extract (buffer, 0, payload, payload_len);
+ gst_rtp_buffer_unmap (&rtp);
+
+ gst_buffer_unref (buffer);
+
+ GST_DEBUG_OBJECT (baseaudiopayload, "Pushing buffer %p", outbuf);
+ ret = gst_basertppayload_push (basepayload, outbuf);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_base_rtp_audio_payload_flush:
+ * @baseaudiopayload: a #GstBaseRTPPayload
+ * @payload_len: length of payload
+ * @timestamp: a #GstClockTime
+ *
+ * Create an RTP buffer and store @payload_len bytes of the adapter as the
+ * payload. Set the timestamp on the new buffer to @timestamp before pushing
+ * the buffer downstream.
+ *
+ * If @payload_len is -1, all pending bytes will be flushed. If @timestamp is
+ * -1, the timestamp will be calculated automatically.
+ *
+ * Returns: a #GstFlowReturn
+ *
+ * Since: 0.10.25
+ */
+GstFlowReturn
+gst_base_rtp_audio_payload_flush (GstBaseRTPAudioPayload * baseaudiopayload,
+ guint payload_len, GstClockTime timestamp)
+{
+ GstBaseRTPPayload *basepayload;
+ GstBaseRTPAudioPayloadPrivate *priv;
+ GstBuffer *outbuf;
+ guint8 *payload;
+ GstFlowReturn ret;
+ GstAdapter *adapter;
+ guint64 distance;
+
+ priv = baseaudiopayload->priv;
+ adapter = priv->adapter;
+
+ basepayload = GST_BASE_RTP_PAYLOAD (baseaudiopayload);
+
+ if (payload_len == -1)
+ payload_len = gst_adapter_available (adapter);
+
+ /* nothing to do, just return */
+ if (payload_len == 0)
+ return GST_FLOW_OK;
+
+ if (timestamp == -1) {
+ /* calculate the timestamp */
+ timestamp = gst_adapter_prev_timestamp (adapter, &distance);
+
+ GST_LOG_OBJECT (baseaudiopayload,
+ "last timestamp %" GST_TIME_FORMAT ", distance %" G_GUINT64_FORMAT,
+ GST_TIME_ARGS (timestamp), distance);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp) && distance > 0) {
+ /* convert the number of bytes since the last timestamp to time and add to
+ * the last seen timestamp */
+ timestamp += priv->bytes_to_time (baseaudiopayload, distance);
+ }
+ }
+
+ GST_DEBUG_OBJECT (baseaudiopayload, "Pushing %d bytes ts %" GST_TIME_FORMAT,
+ payload_len, GST_TIME_ARGS (timestamp));
+
+ if (priv->buffer_list && gst_adapter_available_fast (adapter) >= payload_len) {
+ GstBuffer *buffer;
+ /* we can quickly take a buffer out of the adapter without having to copy
+ * anything. */
+ buffer = gst_adapter_take_buffer (adapter, payload_len);
+
+ ret =
+ gst_base_rtp_audio_payload_push_buffer (baseaudiopayload, buffer,
+ timestamp);
+ } else {
+ GstRTPBuffer rtp;
+
+ /* create buffer to hold the payload */
+ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
+
+ /* copy payload */
+ gst_rtp_buffer_map (outbuf, GST_MAP_WRITE, &rtp);
+ payload = gst_rtp_buffer_get_payload (&rtp);
+ gst_adapter_copy (adapter, payload, 0, payload_len);
+ gst_adapter_flush (adapter, payload_len);
+ gst_rtp_buffer_unmap (&rtp);
+
+ /* set metadata */
+ gst_base_rtp_audio_payload_set_meta (baseaudiopayload, outbuf, payload_len,
+ timestamp);
+
+ ret = gst_basertppayload_push (basepayload, outbuf);
+ }
+
+ return ret;
+}
+
+#define ALIGN_DOWN(val,len) ((val) - ((val) % (len)))
+
+/* calculate the min and max length of a packet. This depends on the configured
+ * mtu and min/max_ptime values. We cache those so that we don't have to redo
+ * all the calculations */
+static gboolean
+gst_base_rtp_audio_payload_get_lengths (GstBaseRTPPayload *
+ basepayload, guint * min_payload_len, guint * max_payload_len,
+ guint * align)
+{
+ GstBaseRTPAudioPayload *payload;
+ GstBaseRTPAudioPayloadPrivate *priv;
+ guint max_mtu, mtu;
+ guint maxptime_octets;
+ guint minptime_octets;
+ guint ptime_mult_octets;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD_CAST (basepayload);
+ priv = payload->priv;
+
+ if (priv->align == 0)
+ return FALSE;
+
+ mtu = GST_BASE_RTP_PAYLOAD_MTU (payload);
+
+ /* check cached values */
+ if (G_LIKELY (priv->cached_mtu == mtu
+ && priv->cached_ptime_multiple ==
+ basepayload->abidata.ABI.ptime_multiple
+ && priv->cached_ptime == basepayload->abidata.ABI.ptime
+ && priv->cached_max_ptime == basepayload->max_ptime
+ && priv->cached_min_ptime == basepayload->min_ptime)) {
+ /* if nothing changed, return cached values */
+ *min_payload_len = priv->cached_min_length;
+ *max_payload_len = priv->cached_max_length;
+ *align = priv->cached_align;
+ return TRUE;
+ }
+
+ ptime_mult_octets = priv->time_to_bytes (payload,
+ basepayload->abidata.ABI.ptime_multiple);
+ *align = ALIGN_DOWN (MAX (priv->align, ptime_mult_octets), priv->align);
+
+ /* ptime max */
+ if (basepayload->max_ptime != -1) {
+ maxptime_octets = priv->time_to_bytes (payload, basepayload->max_ptime);
+ } else {
+ maxptime_octets = G_MAXUINT;
+ }
+ /* MTU max */
+ max_mtu = gst_rtp_buffer_calc_payload_len (mtu, 0, 0);
+ /* round down to alignment */
+ max_mtu = ALIGN_DOWN (max_mtu, *align);
+
+ /* combine max ptime and max payload length */
+ *max_payload_len = MIN (max_mtu, maxptime_octets);
+
+ /* min number of bytes based on a given ptime */
+ minptime_octets = priv->time_to_bytes (payload, basepayload->min_ptime);
+ /* must be at least one frame size */
+ *min_payload_len = MAX (minptime_octets, *align);
+
+ 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 (basepayload->abidata.ABI.ptime) {
+ guint ptime_in_bytes = priv->time_to_bytes (payload,
+ basepayload->abidata.ABI.ptime);
+
+ /* 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;
+ }
+
+ /* cache values */
+ priv->cached_mtu = mtu;
+ priv->cached_ptime = basepayload->abidata.ABI.ptime;
+ priv->cached_min_ptime = basepayload->min_ptime;
+ priv->cached_max_ptime = basepayload->max_ptime;
+ priv->cached_ptime_multiple = basepayload->abidata.ABI.ptime_multiple;
+ priv->cached_min_length = *min_payload_len;
+ priv->cached_max_length = *max_payload_len;
+ priv->cached_align = *align;
+
+ return TRUE;
+}
+
+/* frame conversions functions */
+static GstClockTime
+gst_base_rtp_audio_payload_frame_bytes_to_time (GstBaseRTPAudioPayload *
+ payload, guint64 bytes)
+{
+ guint64 framecount;
+
+ framecount = bytes / payload->frame_size;
+ if (G_UNLIKELY (bytes % payload->frame_size))
+ framecount++;
+
+ return framecount * payload->priv->frame_duration_ns;
+}
+
+static guint32
+gst_base_rtp_audio_payload_frame_bytes_to_rtptime (GstBaseRTPAudioPayload *
+ payload, guint64 bytes)
+{
+ guint64 framecount;
+ guint64 time;
+
+ framecount = bytes / payload->frame_size;
+ if (G_UNLIKELY (bytes % payload->frame_size))
+ framecount++;
+
+ time = framecount * payload->priv->frame_duration_ns;
+
+ return gst_util_uint64_scale_int (time,
+ GST_BASE_RTP_PAYLOAD (payload)->clock_rate, GST_SECOND);
+}
+
+static guint64
+gst_base_rtp_audio_payload_frame_time_to_bytes (GstBaseRTPAudioPayload *
+ payload, GstClockTime time)
+{
+ return gst_util_uint64_scale (time, payload->frame_size,
+ payload->priv->frame_duration_ns);
+}
+
+/* sample conversion functions */
+static GstClockTime
+gst_base_rtp_audio_payload_sample_bytes_to_time (GstBaseRTPAudioPayload *
+ payload, guint64 bytes)
+{
+ guint64 rtptime;
+
+ /* avoid division when we can */
+ if (G_LIKELY (payload->sample_size != 8))
+ rtptime = gst_util_uint64_scale_int (bytes, 8, payload->sample_size);
+ else
+ rtptime = bytes;
+
+ return gst_util_uint64_scale_int (rtptime, GST_SECOND,
+ GST_BASE_RTP_PAYLOAD (payload)->clock_rate);
+}
+
+static guint32
+gst_base_rtp_audio_payload_sample_bytes_to_rtptime (GstBaseRTPAudioPayload *
+ payload, guint64 bytes)
+{
+ /* avoid division when we can */
+ if (G_LIKELY (payload->sample_size != 8))
+ return gst_util_uint64_scale_int (bytes, 8, payload->sample_size);
+ else
+ return bytes;
+}
+
+static guint64
+gst_base_rtp_audio_payload_sample_time_to_bytes (GstBaseRTPAudioPayload *
+ payload, guint64 time)
+{
+ guint64 samples;
+
+ samples = gst_util_uint64_scale_int (time,
+ GST_BASE_RTP_PAYLOAD (payload)->clock_rate, GST_SECOND);
+
+ /* avoid multiplication when we can */
+ if (G_LIKELY (payload->sample_size != 8))
+ return gst_util_uint64_scale_int (samples, payload->sample_size, 8);
+ else
+ return samples;
+}
+
+static GstFlowReturn
+gst_base_rtp_audio_payload_handle_buffer (GstBaseRTPPayload *
+ basepayload, GstBuffer * buffer)
+{
+ GstBaseRTPAudioPayload *payload;
+ GstBaseRTPAudioPayloadPrivate *priv;
+ guint payload_len;
+ GstFlowReturn ret;
+ guint available;
+ guint min_payload_len;
+ guint max_payload_len;
+ guint align;
+ guint size;
+ gboolean discont;
+ GstClockTime timestamp;
+
+ ret = GST_FLOW_OK;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD_CAST (basepayload);
+ priv = payload->priv;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ discont = GST_BUFFER_IS_DISCONT (buffer);
+ if (discont) {
+
+ GST_DEBUG_OBJECT (payload, "Got DISCONT");
+ /* flush everything out of the adapter, mark DISCONT */
+ ret = gst_base_rtp_audio_payload_flush (payload, -1, -1);
+ priv->discont = TRUE;
+
+ /* get the distance between the timestamp gap and produce the same gap in
+ * the RTP timestamps */
+ if (priv->last_timestamp != -1 && timestamp != -1) {
+ /* we had a last timestamp, compare it to the new timestamp and update the
+ * offset counter for RTP timestamps. The effect is that we will produce
+ * output buffers containing the same RTP timestamp gap as the gap
+ * between the GST timestamps. */
+ if (timestamp > priv->last_timestamp) {
+ GstClockTime diff;
+ guint64 bytes;
+ /* we're only going to apply a positive gap, otherwise we let the marker
+ * bit do its thing. simply convert to bytes and add the the current
+ * offset */
+ diff = timestamp - priv->last_timestamp;
+ bytes = priv->time_to_bytes (payload, diff);
+ priv->offset += bytes;
+
+ GST_DEBUG_OBJECT (payload,
+ "elapsed time %" GST_TIME_FORMAT ", bytes %" G_GUINT64_FORMAT
+ ", new offset %" G_GUINT64_FORMAT, GST_TIME_ARGS (diff), bytes,
+ priv->offset);
+ }
+ }
+ }
+
+ if (!gst_base_rtp_audio_payload_get_lengths (basepayload, &min_payload_len,
+ &max_payload_len, &align))
+ goto config_error;
+
+ GST_DEBUG_OBJECT (payload,
+ "Calculated min_payload_len %u and max_payload_len %u",
+ min_payload_len, max_payload_len);
+
+ size = gst_buffer_get_size (buffer);
+
+ /* shortcut, we don't need to use the adapter when the packet can be pushed
+ * through directly. */
+ available = gst_adapter_available (priv->adapter);
+
+ GST_DEBUG_OBJECT (payload, "got buffer size %u, available %u",
+ size, available);
+
+ if (available == 0 && (size >= min_payload_len && size <= max_payload_len) &&
+ (size % align == 0)) {
+ /* If buffer fits on an RTP packet, let's just push it through
+ * this will check against max_ptime and max_mtu */
+ GST_DEBUG_OBJECT (payload, "Fast packet push");
+ ret = gst_base_rtp_audio_payload_push_buffer (payload, buffer, timestamp);
+ } else {
+ /* push the buffer in the adapter */
+ gst_adapter_push (priv->adapter, buffer);
+ available += size;
+
+ GST_DEBUG_OBJECT (payload, "available now %u", available);
+
+ /* as long as we have full frames */
+ while (available >= min_payload_len) {
+ /* get multiple of alignment */
+ payload_len = MIN (max_payload_len, available);
+ payload_len = ALIGN_DOWN (payload_len, align);
+
+ /* and flush out the bytes from the adapter, automatically set the
+ * timestamp. */
+ ret = gst_base_rtp_audio_payload_flush (payload, payload_len, -1);
+
+ available -= payload_len;
+ GST_DEBUG_OBJECT (payload, "available after push %u", available);
+ }
+ }
+ return ret;
+
+ /* ERRORS */
+config_error:
+ {
+ GST_ELEMENT_ERROR (payload, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("subclass did not configure us properly"));
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstStateChangeReturn
+gst_base_rtp_payload_audio_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstBaseRTPAudioPayload *basertppayload;
+ GstStateChangeReturn ret;
+
+ basertppayload = GST_BASE_RTP_AUDIO_PAYLOAD (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ basertppayload->priv->cached_mtu = -1;
+ basertppayload->priv->last_rtptime = -1;
+ basertppayload->priv->last_timestamp = -1;
+ 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 (basertppayload->priv->adapter);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_base_rtp_payload_audio_handle_event (GstBaseRTPPayload * basep,
+ GstEvent * event)
+{
+ GstBaseRTPAudioPayload *payload;
+ gboolean res = FALSE;
+
+ payload = GST_BASE_RTP_AUDIO_PAYLOAD (basep);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* flush remaining bytes in the adapter */
+ gst_base_rtp_audio_payload_flush (payload, -1, -1);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ gst_adapter_clear (payload->priv->adapter);
+ break;
+ default:
+ break;
+ }
+
+ /* let parent handle the remainder of the event */
+ res = GST_BASE_RTP_PAYLOAD_CLASS (parent_class)->handle_event (basep, event);
+
+ return res;
+}
+
+/**
+ * gst_base_rtp_audio_payload_get_adapter:
+ * @basertpaudiopayload: a #GstBaseRTPAudioPayload
+ *
+ * Gets the internal adapter used by the depayloader.
+ *
+ * Returns: a #GstAdapter.
+ *
+ * Since: 0.10.13
+ */
+GstAdapter *
+gst_base_rtp_audio_payload_get_adapter (GstBaseRTPAudioPayload
+ * basertpaudiopayload)
+{
+ GstAdapter *adapter;
+
+ if ((adapter = basertpaudiopayload->priv->adapter))
+ g_object_ref (adapter);
+
+ return adapter;
+}
diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.h b/gst-libs/gst/rtp/gstbasertpaudiopayload.h
new file mode 100644
index 0000000..13b9366
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.h
@@ -0,0 +1,105 @@
+/* GStreamer
+ * Copyright (C) <2006> Philippe Khalaf <philippe.kalaf@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_BASE_RTP_AUDIO_PAYLOAD_H__
+#define __GST_BASE_RTP_AUDIO_PAYLOAD_H__
+
+#include <gst/gst.h>
+#include <gst/rtp/gstbasertppayload.h>
+#include <gst/base/gstadapter.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstBaseRTPAudioPayload GstBaseRTPAudioPayload;
+typedef struct _GstBaseRTPAudioPayloadClass GstBaseRTPAudioPayloadClass;
+
+typedef struct _GstBaseRTPAudioPayloadPrivate GstBaseRTPAudioPayloadPrivate;
+
+#define GST_TYPE_BASE_RTP_AUDIO_PAYLOAD \
+ (gst_base_rtp_audio_payload_get_type())
+#define GST_BASE_RTP_AUDIO_PAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ GST_TYPE_BASE_RTP_AUDIO_PAYLOAD,GstBaseRTPAudioPayload))
+#define GST_BASE_RTP_AUDIO_PAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), \
+ GST_TYPE_BASE_RTP_AUDIO_PAYLOAD,GstBaseRTPAudioPayloadClass))
+#define GST_IS_BASE_RTP_AUDIO_PAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_RTP_AUDIO_PAYLOAD))
+#define GST_IS_BASE_RTP_AUDIO_PAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_RTP_AUDIO_PAYLOAD))
+#define GST_BASE_RTP_AUDIO_PAYLOAD_CAST(obj) \
+ ((GstBaseRTPAudioPayload *) (obj))
+
+struct _GstBaseRTPAudioPayload
+{
+ GstBaseRTPPayload payload;
+
+ GstBaseRTPAudioPayloadPrivate *priv;
+
+ GstClockTime base_ts;
+ gint frame_size;
+ gint frame_duration;
+
+ gint sample_size;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstBaseRTPAudioPayloadClass:
+ * @parent_class: the parent class
+ *
+ * Base class for audio RTP payloader.
+ */
+struct _GstBaseRTPAudioPayloadClass
+{
+ GstBaseRTPPayloadClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_base_rtp_audio_payload_get_type (void);
+
+/* configure frame based */
+void gst_base_rtp_audio_payload_set_frame_based (GstBaseRTPAudioPayload *basertpaudiopayload);
+
+void gst_base_rtp_audio_payload_set_frame_options (GstBaseRTPAudioPayload *basertpaudiopayload,
+ gint frame_duration, gint frame_size);
+
+/* configure sample based */
+void gst_base_rtp_audio_payload_set_sample_based (GstBaseRTPAudioPayload *basertpaudiopayload);
+void gst_base_rtp_audio_payload_set_sample_options (GstBaseRTPAudioPayload *basertpaudiopayload,
+ gint sample_size);
+void gst_base_rtp_audio_payload_set_samplebits_options (GstBaseRTPAudioPayload *basertpaudiopayload,
+ gint sample_size);
+
+/* get the internal adapter */
+GstAdapter* gst_base_rtp_audio_payload_get_adapter (GstBaseRTPAudioPayload *basertpaudiopayload);
+
+/* push and flushing data */
+GstFlowReturn gst_base_rtp_audio_payload_push (GstBaseRTPAudioPayload * baseaudiopayload,
+ const guint8 * data, guint payload_len,
+ GstClockTime timestamp);
+GstFlowReturn gst_base_rtp_audio_payload_flush (GstBaseRTPAudioPayload * baseaudiopayload,
+ guint payload_len, GstClockTime timestamp);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_RTP_AUDIO_PAYLOAD_H__ */
diff --git a/gst-libs/gst/rtp/gstbasertpdepayload.c b/gst-libs/gst/rtp/gstbasertpdepayload.c
new file mode 100644
index 0000000..397e5c1
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertpdepayload.c
@@ -0,0 +1,769 @@
+/* GStreamer
+ * Copyright (C) <2005> Philippe Khalaf <burger@speedy.org>
+ * Copyright (C) <2005> Nokia Corporation <kai.vehmanen@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstbasertpdepayload
+ * @short_description: Base class for RTP depayloader
+ *
+ * Provides a base class for RTP depayloaders
+ */
+
+#include "gstbasertpdepayload.h"
+
+GST_DEBUG_CATEGORY_STATIC (basertpdepayload_debug);
+#define GST_CAT_DEFAULT (basertpdepayload_debug)
+
+#define GST_BASE_RTP_DEPAYLOAD_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_RTP_DEPAYLOAD, GstBaseRTPDepayloadPrivate))
+
+struct _GstBaseRTPDepayloadPrivate
+{
+ GstClockTime npt_start;
+ GstClockTime npt_stop;
+ gdouble play_speed;
+ gdouble play_scale;
+
+ gboolean discont;
+ GstClockTime timestamp;
+ GstClockTime duration;
+
+ guint32 next_seqnum;
+
+ gboolean negotiated;
+};
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_LAST
+};
+
+static void gst_base_rtp_depayload_finalize (GObject * object);
+static void gst_base_rtp_depayload_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_base_rtp_depayload_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_base_rtp_depayload_chain (GstPad * pad,
+ GstBuffer * in);
+static gboolean gst_base_rtp_depayload_handle_sink_event (GstPad * pad,
+ GstEvent * event);
+
+static GstStateChangeReturn gst_base_rtp_depayload_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_base_rtp_depayload_set_gst_timestamp
+ (GstBaseRTPDepayload * filter, guint32 rtptime, GstBuffer * buf);
+static gboolean gst_base_rtp_depayload_packet_lost (GstBaseRTPDepayload *
+ filter, GstEvent * event);
+static gboolean gst_base_rtp_depayload_handle_event (GstBaseRTPDepayload *
+ filter, GstEvent * event);
+
+static GstElementClass *parent_class = NULL;
+static void gst_base_rtp_depayload_class_init (GstBaseRTPDepayloadClass *
+ klass);
+static void gst_base_rtp_depayload_init (GstBaseRTPDepayload * basertppayload,
+ GstBaseRTPDepayloadClass * klass);
+
+GType
+gst_base_rtp_depayload_get_type (void)
+{
+ static GType base_rtp_depayload_type = 0;
+
+ if (g_once_init_enter ((gsize *) & base_rtp_depayload_type)) {
+ static const GTypeInfo base_rtp_depayload_info = {
+ sizeof (GstBaseRTPDepayloadClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_base_rtp_depayload_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseRTPDepayload),
+ 0,
+ (GInstanceInitFunc) gst_base_rtp_depayload_init,
+ };
+
+ g_once_init_leave ((gsize *) & base_rtp_depayload_type,
+ g_type_register_static (GST_TYPE_ELEMENT, "GstBaseRTPDepayload",
+ &base_rtp_depayload_info, G_TYPE_FLAG_ABSTRACT));
+ }
+ return base_rtp_depayload_type;
+}
+
+static void
+gst_base_rtp_depayload_class_init (GstBaseRTPDepayloadClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = (GstElementClass *) klass;
+ parent_class = g_type_class_peek_parent (klass);
+
+ g_type_class_add_private (klass, sizeof (GstBaseRTPDepayloadPrivate));
+
+ gobject_class->finalize = gst_base_rtp_depayload_finalize;
+ gobject_class->set_property = gst_base_rtp_depayload_set_property;
+ gobject_class->get_property = gst_base_rtp_depayload_get_property;
+
+ gstelement_class->change_state = gst_base_rtp_depayload_change_state;
+
+ klass->set_gst_timestamp = gst_base_rtp_depayload_set_gst_timestamp;
+ klass->packet_lost = gst_base_rtp_depayload_packet_lost;
+ klass->handle_event = gst_base_rtp_depayload_handle_event;
+
+ GST_DEBUG_CATEGORY_INIT (basertpdepayload_debug, "basertpdepayload", 0,
+ "Base class for RTP Depayloaders");
+}
+
+static void
+gst_base_rtp_depayload_init (GstBaseRTPDepayload * filter,
+ GstBaseRTPDepayloadClass * klass)
+{
+ GstPadTemplate *pad_template;
+ GstBaseRTPDepayloadPrivate *priv;
+
+ priv = GST_BASE_RTP_DEPAYLOAD_GET_PRIVATE (filter);
+ filter->priv = priv;
+
+ GST_DEBUG_OBJECT (filter, "init");
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "sink");
+ g_return_if_fail (pad_template != NULL);
+ filter->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+ gst_pad_set_chain_function (filter->sinkpad, gst_base_rtp_depayload_chain);
+ gst_pad_set_event_function (filter->sinkpad,
+ gst_base_rtp_depayload_handle_sink_event);
+ gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "src");
+ g_return_if_fail (pad_template != NULL);
+ filter->srcpad = gst_pad_new_from_template (pad_template, "src");
+ gst_pad_use_fixed_caps (filter->srcpad);
+ gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
+
+ gst_segment_init (&filter->segment, GST_FORMAT_UNDEFINED);
+}
+
+static void
+gst_base_rtp_depayload_finalize (GObject * object)
+{
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_base_rtp_depayload_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps)
+{
+ GstBaseRTPDepayloadClass *bclass;
+ GstBaseRTPDepayloadPrivate *priv;
+ gboolean res;
+ GstStructure *caps_struct;
+ const GValue *value;
+
+ priv = filter->priv;
+
+ bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
+
+ GST_DEBUG_OBJECT (filter, "Set caps");
+
+ caps_struct = gst_caps_get_structure (caps, 0);
+
+ /* get other values for newsegment */
+ value = gst_structure_get_value (caps_struct, "npt-start");
+ if (value && G_VALUE_HOLDS_UINT64 (value))
+ priv->npt_start = g_value_get_uint64 (value);
+ else
+ priv->npt_start = 0;
+ GST_DEBUG_OBJECT (filter, "NPT start %" G_GUINT64_FORMAT, priv->npt_start);
+
+ value = gst_structure_get_value (caps_struct, "npt-stop");
+ if (value && G_VALUE_HOLDS_UINT64 (value))
+ priv->npt_stop = g_value_get_uint64 (value);
+ else
+ priv->npt_stop = -1;
+
+ GST_DEBUG_OBJECT (filter, "NPT stop %" G_GUINT64_FORMAT, priv->npt_stop);
+
+ value = gst_structure_get_value (caps_struct, "play-speed");
+ if (value && G_VALUE_HOLDS_DOUBLE (value))
+ priv->play_speed = g_value_get_double (value);
+ else
+ priv->play_speed = 1.0;
+
+ value = gst_structure_get_value (caps_struct, "play-scale");
+ if (value && G_VALUE_HOLDS_DOUBLE (value))
+ priv->play_scale = g_value_get_double (value);
+ else
+ priv->play_scale = 1.0;
+
+ if (bclass->set_caps) {
+ res = bclass->set_caps (filter, caps);
+ if (!res) {
+ GST_WARNING_OBJECT (filter, "Subclass rejected caps %" GST_PTR_FORMAT,
+ caps);
+ }
+ } else {
+ res = TRUE;
+ }
+
+ priv->negotiated = res;
+
+ return res;
+}
+
+static GstFlowReturn
+gst_base_rtp_depayload_chain (GstPad * pad, GstBuffer * in)
+{
+ GstBaseRTPDepayload *filter;
+ GstBaseRTPDepayloadPrivate *priv;
+ GstBaseRTPDepayloadClass *bclass;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *out_buf;
+ GstClockTime timestamp;
+ guint16 seqnum;
+ guint32 rtptime;
+ gboolean discont;
+ gint gap;
+ GstRTPBuffer rtp;
+
+ filter = GST_BASE_RTP_DEPAYLOAD (GST_OBJECT_PARENT (pad));
+ priv = filter->priv;
+
+ /* we must have a setcaps first */
+ if (G_UNLIKELY (!priv->negotiated))
+ goto not_negotiated;
+
+ /* we must validate, it's possible that this element is plugged right after a
+ * network receiver and we don't want to operate on invalid data */
+ if (G_UNLIKELY (!gst_rtp_buffer_validate (in)))
+ goto invalid_buffer;
+
+ if (!priv->discont)
+ priv->discont = GST_BUFFER_IS_DISCONT (in);
+
+ timestamp = GST_BUFFER_TIMESTAMP (in);
+ /* convert to running_time and save the timestamp, this is the timestamp
+ * we put on outgoing buffers. */
+ timestamp = gst_segment_to_running_time (&filter->segment, GST_FORMAT_TIME,
+ timestamp);
+ priv->timestamp = timestamp;
+ priv->duration = GST_BUFFER_DURATION (in);
+
+ gst_rtp_buffer_map (in, GST_MAP_READ, &rtp);
+ seqnum = gst_rtp_buffer_get_seq (&rtp);
+ rtptime = gst_rtp_buffer_get_timestamp (&rtp);
+ gst_rtp_buffer_unmap (&rtp);
+
+ discont = FALSE;
+
+ GST_LOG_OBJECT (filter, "discont %d, seqnum %u, rtptime %u, timestamp %"
+ GST_TIME_FORMAT, priv->discont, seqnum, rtptime,
+ GST_TIME_ARGS (timestamp));
+
+ /* Check seqnum. This is a very simple check that makes sure that the seqnums
+ * are striclty increasing, dropping anything that is out of the ordinary. We
+ * can only do this when the next_seqnum is known. */
+ if (G_LIKELY (priv->next_seqnum != -1)) {
+ gap = gst_rtp_buffer_compare_seqnum (seqnum, priv->next_seqnum);
+
+ /* if we have no gap, all is fine */
+ if (G_UNLIKELY (gap != 0)) {
+ GST_LOG_OBJECT (filter, "got packet %u, expected %u, gap %d", seqnum,
+ priv->next_seqnum, gap);
+ if (gap < 0) {
+ /* seqnum > next_seqnum, we are missing some packets, this is always a
+ * DISCONT. */
+ GST_LOG_OBJECT (filter, "%d missing packets", gap);
+ discont = TRUE;
+ } else {
+ /* seqnum < next_seqnum, we have seen this packet before or the sender
+ * could be restarted. If the packet is not too old, we throw it away as
+ * a duplicate, otherwise we mark discont and continue. 100 misordered
+ * packets is a good threshold. See also RFC 4737. */
+ if (gap < 100)
+ goto dropping;
+
+ GST_LOG_OBJECT (filter,
+ "%d > 100, packet too old, sender likely restarted", gap);
+ discont = TRUE;
+ }
+ }
+ }
+ priv->next_seqnum = (seqnum + 1) & 0xffff;
+
+ if (G_UNLIKELY (discont && !priv->discont)) {
+ GST_LOG_OBJECT (filter, "mark DISCONT on input buffer");
+ /* we detected a seqnum discont but the buffer was not flagged with a discont,
+ * set the discont flag so that the subclass can throw away old data. */
+ priv->discont = TRUE;
+ in = gst_buffer_make_writable (in);
+ GST_BUFFER_FLAG_SET (in, GST_BUFFER_FLAG_DISCONT);
+ }
+
+ bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
+
+ if (G_UNLIKELY (bclass->process == NULL))
+ goto no_process;
+
+ /* let's send it out to processing */
+ out_buf = bclass->process (filter, in);
+ if (out_buf) {
+ /* we pass rtptime as backward compatibility, in reality, the incomming
+ * buffer timestamp is always applied to the outgoing packet. */
+ ret = gst_base_rtp_depayload_push_ts (filter, rtptime, out_buf);
+ }
+ gst_buffer_unref (in);
+
+ return ret;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ /* this is not fatal but should be filtered earlier */
+ GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION,
+ ("No RTP format was negotiated."),
+ ("Input buffers need to have RTP caps set on them. This is usually "
+ "achieved by setting the 'caps' property of the upstream source "
+ "element (often udpsrc or appsrc), or by putting a capsfilter "
+ "element before the depayloader and setting the 'caps' property "
+ "on that. Also see http://cgit.freedesktop.org/gstreamer/"
+ "gst-plugins-good/tree/gst/rtp/README"));
+ gst_buffer_unref (in);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+invalid_buffer:
+ {
+ /* this is not fatal but should be filtered earlier */
+ GST_ELEMENT_WARNING (filter, STREAM, DECODE, (NULL),
+ ("Received invalid RTP payload, dropping"));
+ gst_buffer_unref (in);
+ return GST_FLOW_OK;
+ }
+dropping:
+ {
+ GST_WARNING_OBJECT (filter, "%d <= 100, dropping old packet", gap);
+ gst_buffer_unref (in);
+ return GST_FLOW_OK;
+ }
+no_process:
+ {
+ /* this is not fatal but should be filtered earlier */
+ GST_ELEMENT_ERROR (filter, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("The subclass does not have a process method"));
+ gst_buffer_unref (in);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+gst_base_rtp_depayload_handle_event (GstBaseRTPDepayload * filter,
+ GstEvent * event)
+{
+ gboolean res = TRUE;
+ gboolean forward = TRUE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_segment_init (&filter->segment, GST_FORMAT_UNDEFINED);
+ filter->need_newsegment = TRUE;
+ filter->priv->next_seqnum = -1;
+ break;
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+
+ res = gst_base_rtp_depayload_setcaps (filter, caps);
+ forward = FALSE;
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &filter->segment);
+ /* don't pass the event downstream, we generate our own segment including
+ * the NTP time and other things we receive in caps */
+ forward = FALSE;
+ break;
+ }
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ {
+ GstBaseRTPDepayloadClass *bclass;
+
+ bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
+
+ if (gst_event_has_name (event, "GstRTPPacketLost")) {
+ /* we get this event from the jitterbuffer when it considers a packet as
+ * being lost. We send it to our packet_lost vmethod. The default
+ * implementation will make time progress by pushing out a NEWSEGMENT
+ * update event. Subclasses can override and to one of the following:
+ * - Adjust timestamp/duration to something more accurate before
+ * calling the parent (default) packet_lost method.
+ * - do some more advanced error concealing on the already received
+ * (fragmented) packets.
+ * - ignore the packet lost.
+ */
+ if (bclass->packet_lost)
+ res = bclass->packet_lost (filter, event);
+ forward = FALSE;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (forward)
+ res = gst_pad_push_event (filter->srcpad, event);
+ else
+ gst_event_unref (event);
+
+ return res;
+}
+
+static gboolean
+gst_base_rtp_depayload_handle_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = FALSE;
+ GstBaseRTPDepayload *filter;
+ GstBaseRTPDepayloadClass *bclass;
+
+ filter = GST_BASE_RTP_DEPAYLOAD (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (filter == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
+ if (bclass->handle_event)
+ res = bclass->handle_event (filter, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (filter);
+ return res;
+}
+
+static GstEvent *
+create_segment_event (GstBaseRTPDepayload * filter, gboolean update,
+ GstClockTime position)
+{
+ GstEvent *event;
+ GstClockTime stop;
+ GstBaseRTPDepayloadPrivate *priv;
+ GstSegment segment;
+
+ priv = filter->priv;
+
+ if (priv->npt_stop != -1)
+ stop = priv->npt_stop - priv->npt_start;
+ else
+ stop = -1;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.rate = priv->play_speed;
+ segment.applied_rate = priv->play_scale;
+ segment.start = 0;
+ segment.stop = stop;
+ segment.time = priv->npt_start;
+ segment.position = position;
+
+ event = gst_event_new_segment (&segment);
+
+ return event;
+}
+
+typedef struct
+{
+ GstBaseRTPDepayload *depayload;
+ GstBaseRTPDepayloadClass *bclass;
+ gboolean do_ts;
+ gboolean rtptime;
+} HeaderData;
+
+static gboolean
+set_headers (GstBuffer ** buffer, guint idx, HeaderData * data)
+{
+ GstBaseRTPDepayload *depayload = data->depayload;
+
+ *buffer = gst_buffer_make_writable (*buffer);
+
+ /* set the timestamp if we must and can */
+ if (data->bclass->set_gst_timestamp && data->do_ts)
+ data->bclass->set_gst_timestamp (depayload, data->rtptime, *buffer);
+
+ if (G_UNLIKELY (depayload->priv->discont)) {
+ GST_LOG_OBJECT (depayload, "Marking DISCONT on output buffer");
+ GST_BUFFER_FLAG_SET (*buffer, GST_BUFFER_FLAG_DISCONT);
+ depayload->priv->discont = FALSE;
+ }
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_base_rtp_depayload_prepare_push (GstBaseRTPDepayload * filter,
+ gboolean do_ts, guint32 rtptime, gboolean is_list, gpointer obj)
+{
+ HeaderData data;
+
+ data.depayload = filter;
+ data.rtptime = rtptime;
+ data.do_ts = do_ts;
+ data.bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
+
+ if (is_list) {
+ GstBufferList **blist = obj;
+ gst_buffer_list_foreach (*blist, (GstBufferListFunc) set_headers, &data);
+ } else {
+ GstBuffer **buf = obj;
+ set_headers (buf, 0, &data);
+ }
+
+ /* if this is the first buffer send a NEWSEGMENT */
+ if (G_UNLIKELY (filter->need_newsegment)) {
+ GstEvent *event;
+
+ event = create_segment_event (filter, FALSE, 0);
+
+ gst_pad_push_event (filter->srcpad, event);
+
+ filter->need_newsegment = FALSE;
+ GST_DEBUG_OBJECT (filter, "Pushed newsegment event on this first buffer");
+ }
+
+ return GST_FLOW_OK;
+}
+
+/**
+ * gst_base_rtp_depayload_push_ts:
+ * @filter: a #GstBaseRTPDepayload
+ * @timestamp: an RTP timestamp to apply
+ * @out_buf: a #GstBuffer
+ *
+ * Push @out_buf to the peer of @filter. This function takes ownership of
+ * @out_buf.
+ *
+ * Unlike gst_base_rtp_depayload_push(), this function will by default apply
+ * the last incomming timestamp on the outgoing buffer when it didn't have a
+ * timestamp already. The set_get_timestamp vmethod can be overwritten to change
+ * this behaviour (and take, for example, @timestamp into account).
+ *
+ * Returns: a #GstFlowReturn.
+ */
+GstFlowReturn
+gst_base_rtp_depayload_push_ts (GstBaseRTPDepayload * filter, guint32 timestamp,
+ GstBuffer * out_buf)
+{
+ GstFlowReturn res;
+
+ res =
+ gst_base_rtp_depayload_prepare_push (filter, TRUE, timestamp, FALSE,
+ &out_buf);
+
+ if (G_LIKELY (res == GST_FLOW_OK))
+ res = gst_pad_push (filter->srcpad, out_buf);
+ else
+ gst_buffer_unref (out_buf);
+
+ return res;
+}
+
+/**
+ * gst_base_rtp_depayload_push:
+ * @filter: a #GstBaseRTPDepayload
+ * @out_buf: a #GstBuffer
+ *
+ * Push @out_buf to the peer of @filter. This function takes ownership of
+ * @out_buf.
+ *
+ * Unlike gst_base_rtp_depayload_push_ts(), this function will not apply
+ * any timestamp on the outgoing buffer. Subclasses should therefore timestamp
+ * outgoing buffers themselves.
+ *
+ * Returns: a #GstFlowReturn.
+ */
+GstFlowReturn
+gst_base_rtp_depayload_push (GstBaseRTPDepayload * filter, GstBuffer * out_buf)
+{
+ GstFlowReturn res;
+
+ res = gst_base_rtp_depayload_prepare_push (filter, FALSE, 0, FALSE, &out_buf);
+
+ if (G_LIKELY (res == GST_FLOW_OK))
+ res = gst_pad_push (filter->srcpad, out_buf);
+ else
+ gst_buffer_unref (out_buf);
+
+ return res;
+}
+
+/**
+ * gst_base_rtp_depayload_push_list:
+ * @filter: a #GstBaseRTPDepayload
+ * @out_list: a #GstBufferList
+ *
+ * Push @out_list to the peer of @filter. This function takes ownership of
+ * @out_list.
+ *
+ * Returns: a #GstFlowReturn.
+ *
+ * Since: 0.10.32
+ */
+GstFlowReturn
+gst_base_rtp_depayload_push_list (GstBaseRTPDepayload * filter,
+ GstBufferList * out_list)
+{
+ GstFlowReturn res;
+
+ res = gst_base_rtp_depayload_prepare_push (filter, TRUE, 0, TRUE, &out_list);
+
+ if (G_LIKELY (res == GST_FLOW_OK))
+ res = gst_pad_push_list (filter->srcpad, out_list);
+ else
+ gst_buffer_list_unref (out_list);
+
+ return res;
+}
+
+/* convert the PacketLost event form a jitterbuffer to a segment update.
+ * subclasses can override this. */
+static gboolean
+gst_base_rtp_depayload_packet_lost (GstBaseRTPDepayload * filter,
+ GstEvent * event)
+{
+ GstClockTime timestamp, duration, position;
+ GstEvent *sevent;
+ const GstStructure *s;
+
+ s = gst_event_get_structure (event);
+
+ /* first start by parsing the timestamp and duration */
+ timestamp = -1;
+ duration = -1;
+
+ gst_structure_get_clock_time (s, "timestamp", &timestamp);
+ gst_structure_get_clock_time (s, "duration", &duration);
+
+ position = timestamp;
+ if (duration != -1)
+ position += duration;
+
+ /* update the current segment with the elapsed time */
+ sevent = create_segment_event (filter, TRUE, position);
+
+ return gst_pad_push_event (filter->srcpad, sevent);
+}
+
+static void
+gst_base_rtp_depayload_set_gst_timestamp (GstBaseRTPDepayload * filter,
+ guint32 rtptime, GstBuffer * buf)
+{
+ GstBaseRTPDepayloadPrivate *priv;
+ GstClockTime timestamp, duration;
+
+ priv = filter->priv;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ duration = GST_BUFFER_DURATION (buf);
+
+ /* apply last incomming timestamp and duration to outgoing buffer if
+ * not otherwise set. */
+ if (!GST_CLOCK_TIME_IS_VALID (timestamp))
+ GST_BUFFER_TIMESTAMP (buf) = priv->timestamp;
+ if (!GST_CLOCK_TIME_IS_VALID (duration))
+ GST_BUFFER_DURATION (buf) = priv->duration;
+}
+
+static GstStateChangeReturn
+gst_base_rtp_depayload_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstBaseRTPDepayload *filter;
+ GstBaseRTPDepayloadPrivate *priv;
+ GstStateChangeReturn ret;
+
+ filter = GST_BASE_RTP_DEPAYLOAD (element);
+ priv = filter->priv;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ filter->need_newsegment = TRUE;
+ priv->npt_start = 0;
+ priv->npt_stop = -1;
+ priv->play_speed = 1.0;
+ priv->play_scale = 1.0;
+ priv->next_seqnum = -1;
+ priv->negotiated = FALSE;
+ priv->discont = FALSE;
+ 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:
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+static void
+gst_base_rtp_depayload_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_rtp_depayload_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/gst-libs/gst/rtp/gstbasertpdepayload.h b/gst-libs/gst/rtp/gstbasertpdepayload.h
new file mode 100644
index 0000000..68f178d
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertpdepayload.h
@@ -0,0 +1,119 @@
+/* GStreamer
+ * Copyright (C) <2005> Philippe Khalaf <burger@speedy.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_BASE_RTP_DEPAYLOAD_H__
+#define __GST_BASE_RTP_DEPAYLOAD_H__
+
+#include <gst/gst.h>
+#include <gst/rtp/gstrtpbuffer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_RTP_DEPAYLOAD (gst_base_rtp_depayload_get_type())
+#define GST_BASE_RTP_DEPAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_RTP_DEPAYLOAD,GstBaseRTPDepayload))
+#define GST_BASE_RTP_DEPAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_RTP_DEPAYLOAD,GstBaseRTPDepayloadClass))
+#define GST_BASE_RTP_DEPAYLOAD_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_BASE_RTP_DEPAYLOAD,GstBaseRTPDepayloadClass))
+#define GST_IS_BASE_RTP_DEPAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_RTP_DEPAYLOAD))
+#define GST_IS_BASE_RTP_DEPAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_RTP_DEPAYLOAD))
+
+#define GST_BASE_RTP_DEPAYLOAD_SINKPAD(depayload) (GST_BASE_RTP_DEPAYLOAD (depayload)->sinkpad)
+#define GST_BASE_RTP_DEPAYLOAD_SRCPAD(depayload) (GST_BASE_RTP_DEPAYLOAD (depayload)->srcpad)
+
+typedef struct _GstBaseRTPDepayload GstBaseRTPDepayload;
+typedef struct _GstBaseRTPDepayloadClass GstBaseRTPDepayloadClass;
+typedef struct _GstBaseRTPDepayloadPrivate GstBaseRTPDepayloadPrivate;
+
+struct _GstBaseRTPDepayload
+{
+ GstElement parent;
+
+ GstPad *sinkpad, *srcpad;
+
+ /* this attribute must be set by the child */
+ guint clock_rate;
+
+ GstSegment segment;
+ gboolean need_newsegment;
+
+ /*< private >*/
+ GstBaseRTPDepayloadPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING-1];
+};
+
+/**
+ * GstBaseRTPDepayloadClass:
+ * @parent_class: the parent class
+ * @set_caps: configure the depayloader
+ * @add_to_queue: (deprecated)
+ * @process: process incoming rtp packets
+ * @set_gst_timestamp: convert from RTP timestamp to GST timestamp
+ * @packet_lost: signal the depayloader about packet loss
+ * @handle_event: custom event handling
+ *
+ * Base class for audio RTP payloader.
+ */
+struct _GstBaseRTPDepayloadClass
+{
+ GstElementClass parent_class;
+
+ /* virtuals, inform the subclass of the caps. */
+ gboolean (*set_caps) (GstBaseRTPDepayload *filter, GstCaps *caps);
+
+ /* pure virtual function, child must use this to process incoming
+ * rtp packets. If the child returns a buffer without a valid timestamp,
+ * the timestamp of @in will be applied to the result buffer and the
+ * buffer will be pushed. If this function returns %NULL, nothing is
+ * pushed. */
+ GstBuffer * (*process) (GstBaseRTPDepayload *base, GstBuffer *in);
+
+ /* non-pure function used to convert from RTP timestamp to GST timestamp
+ * this function is used by the child class before gst_pad_pushing */
+ void (*set_gst_timestamp) (GstBaseRTPDepayload *filter, guint32 timestamp, GstBuffer *buf);
+
+ /* non-pure function used to to signal the depayloader about packet loss. the
+ * timestamp and duration are the estimated values of the lost packet.
+ * The default implementation of this message pushes a segment update. */
+ gboolean (*packet_lost) (GstBaseRTPDepayload *filter, GstEvent *event);
+
+ /* the default implementation does the default actions for events but
+ * implementation can override.
+ * Since: 0.10.32 */
+ gboolean (*handle_event) (GstBaseRTPDepayload * filter, GstEvent * event);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING-2];
+};
+
+GType gst_base_rtp_depayload_get_type (void);
+
+GstFlowReturn gst_base_rtp_depayload_push (GstBaseRTPDepayload *filter, GstBuffer *out_buf);
+GstFlowReturn gst_base_rtp_depayload_push_ts (GstBaseRTPDepayload *filter,
+ guint32 timestamp, GstBuffer *out_buf);
+GstFlowReturn gst_base_rtp_depayload_push_list (GstBaseRTPDepayload *filter, GstBufferList *out_list);
+
+
+G_END_DECLS
+
+#endif /* __GST_BASE_RTP_DEPAYLOAD_H__ */
diff --git a/gst-libs/gst/rtp/gstbasertppayload.c b/gst-libs/gst/rtp/gstbasertppayload.c
new file mode 100644
index 0000000..3bca852
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertppayload.c
@@ -0,0 +1,1073 @@
+/* GStreamer
+ * Copyright (C) <2005> 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
+ */
+
+/**
+ * SECTION:gstbasertppayload
+ * @short_description: Base class for RTP payloader
+ *
+ * Provides a base class for RTP payloaders
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/rtp/gstrtpbuffer.h>
+
+#include "gstbasertppayload.h"
+
+GST_DEBUG_CATEGORY_STATIC (basertppayload_debug);
+#define GST_CAT_DEFAULT (basertppayload_debug)
+
+#define GST_BASE_RTP_PAYLOAD_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_RTP_PAYLOAD, GstBaseRTPPayloadPrivate))
+
+struct _GstBaseRTPPayloadPrivate
+{
+ gboolean ts_offset_random;
+ gboolean seqnum_offset_random;
+ gboolean ssrc_random;
+ guint16 next_seqnum;
+ gboolean perfect_rtptime;
+ gint notified_first_timestamp;
+
+ guint64 base_offset;
+ gint64 base_rtime;
+
+ gint64 prop_max_ptime;
+ gint64 caps_max_ptime;
+};
+
+/* BaseRTPPayload signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+/* FIXME 0.11, a better default is the Ethernet MTU of
+ * 1500 - sizeof(headers) as pointed out by marcelm in IRC:
+ * So an Ethernet MTU of 1500, minus 60 for the max IP, minus 8 for UDP, gives
+ * 1432 bytes or so. And that should be adjusted downward further for other
+ * encapsulations like PPPoE, so 1400 at most.
+ */
+#define DEFAULT_MTU 1400
+#define DEFAULT_PT 96
+#define DEFAULT_SSRC -1
+#define DEFAULT_TIMESTAMP_OFFSET -1
+#define DEFAULT_SEQNUM_OFFSET -1
+#define DEFAULT_MAX_PTIME -1
+#define DEFAULT_MIN_PTIME 0
+#define DEFAULT_PERFECT_RTPTIME TRUE
+#define DEFAULT_PTIME_MULTIPLE 0
+
+enum
+{
+ PROP_0,
+ PROP_MTU,
+ PROP_PT,
+ PROP_SSRC,
+ PROP_TIMESTAMP_OFFSET,
+ PROP_SEQNUM_OFFSET,
+ PROP_MAX_PTIME,
+ PROP_MIN_PTIME,
+ PROP_TIMESTAMP,
+ PROP_SEQNUM,
+ PROP_PERFECT_RTPTIME,
+ PROP_PTIME_MULTIPLE,
+ PROP_LAST
+};
+
+static void gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass);
+static void gst_basertppayload_base_init (GstBaseRTPPayloadClass * klass);
+static void gst_basertppayload_init (GstBaseRTPPayload * basertppayload,
+ gpointer g_class);
+static void gst_basertppayload_finalize (GObject * object);
+
+static GstCaps *gst_basertppayload_sink_getcaps (GstPad * pad,
+ GstCaps * filter);
+static gboolean gst_basertppayload_event_default (GstBaseRTPPayload *
+ basertppayload, GstEvent * event);
+static gboolean gst_basertppayload_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_basertppayload_chain (GstPad * pad,
+ GstBuffer * buffer);
+
+static void gst_basertppayload_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_basertppayload_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstStateChangeReturn gst_basertppayload_change_state (GstElement *
+ element, GstStateChange transition);
+
+static GstElementClass *parent_class = NULL;
+
+/* FIXME 0.11: API should be changed to gst_base_typ_payload_xyz */
+
+GType
+gst_basertppayload_get_type (void)
+{
+ static GType basertppayload_type = 0;
+
+ if (g_once_init_enter ((gsize *) & basertppayload_type)) {
+ static const GTypeInfo basertppayload_info = {
+ sizeof (GstBaseRTPPayloadClass),
+ (GBaseInitFunc) gst_basertppayload_base_init,
+ NULL,
+ (GClassInitFunc) gst_basertppayload_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseRTPPayload),
+ 0,
+ (GInstanceInitFunc) gst_basertppayload_init,
+ };
+
+ g_once_init_leave ((gsize *) & basertppayload_type,
+ g_type_register_static (GST_TYPE_ELEMENT, "GstBaseRTPPayload",
+ &basertppayload_info, G_TYPE_FLAG_ABSTRACT));
+ }
+ return basertppayload_type;
+}
+
+static void
+gst_basertppayload_base_init (GstBaseRTPPayloadClass * klass)
+{
+}
+
+static void
+gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstBaseRTPPayloadPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_basertppayload_finalize;
+
+ gobject_class->set_property = gst_basertppayload_set_property;
+ gobject_class->get_property = gst_basertppayload_get_property;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MTU,
+ g_param_spec_uint ("mtu", "MTU",
+ "Maximum size of one packet",
+ 28, G_MAXUINT, DEFAULT_MTU,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PT,
+ g_param_spec_uint ("pt", "payload type",
+ "The payload type of the packets", 0, 0x80, DEFAULT_PT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SSRC,
+ g_param_spec_uint ("ssrc", "SSRC",
+ "The SSRC of the packets (default == random)", 0, G_MAXUINT32,
+ DEFAULT_SSRC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass),
+ PROP_TIMESTAMP_OFFSET, g_param_spec_uint ("timestamp-offset",
+ "Timestamp Offset",
+ "Offset to add to all outgoing timestamps (default = random)", 0,
+ G_MAXUINT32, DEFAULT_TIMESTAMP_OFFSET,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM_OFFSET,
+ g_param_spec_int ("seqnum-offset", "Sequence number Offset",
+ "Offset to add to all outgoing seqnum (-1 = random)", -1, G_MAXUINT16,
+ DEFAULT_SEQNUM_OFFSET, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_PTIME,
+ g_param_spec_int64 ("max-ptime", "Max packet time",
+ "Maximum duration of the packet data in ns (-1 = unlimited up to MTU)",
+ -1, G_MAXINT64, DEFAULT_MAX_PTIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseRTPAudioPayload:min-ptime:
+ *
+ * Minimum duration of the packet data in ns (can't go above MTU)
+ *
+ * Since: 0.10.13
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MIN_PTIME,
+ g_param_spec_int64 ("min-ptime", "Min packet time",
+ "Minimum duration of the packet data in ns (can't go above MTU)",
+ 0, G_MAXINT64, DEFAULT_MIN_PTIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMESTAMP,
+ g_param_spec_uint ("timestamp", "Timestamp",
+ "The RTP timestamp of the last processed packet",
+ 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM,
+ g_param_spec_uint ("seqnum", "Sequence number",
+ "The RTP sequence number of the last processed packet",
+ 0, G_MAXUINT16, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseRTPAudioPayload:perfect-rtptime:
+ *
+ * Try to use the offset fields to generate perfect RTP timestamps. when this
+ * option is disabled, RTP timestamps are generated from the GStreamer
+ * timestamps, which could result in RTP timestamps that don't increment with
+ * the amount of data in the packet.
+ *
+ * Since: 0.10.25
+ */
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PERFECT_RTPTIME,
+ g_param_spec_boolean ("perfect-rtptime", "Perfect RTP Time",
+ "Generate perfect RTP timestamps when possible",
+ DEFAULT_PERFECT_RTPTIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseRTPAudioPayload:ptime-multiple:
+ *
+ * Force buffers to be multiples of this duration in ns (0 disables)
+ *
+ * Since: 0.10.29
+ **/
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PTIME_MULTIPLE,
+ g_param_spec_int64 ("ptime-multiple", "Packet time multiple",
+ "Force buffers to be multiples of this duration in ns (0 disables)",
+ 0, G_MAXINT64, DEFAULT_PTIME_MULTIPLE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state = gst_basertppayload_change_state;
+
+ klass->handle_event = gst_basertppayload_event_default;
+
+ GST_DEBUG_CATEGORY_INIT (basertppayload_debug, "basertppayload", 0,
+ "Base class for RTP Payloaders");
+}
+
+static void
+gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class)
+{
+ GstPadTemplate *templ;
+ GstBaseRTPPayloadPrivate *priv;
+
+ basertppayload->priv = priv =
+ GST_BASE_RTP_PAYLOAD_GET_PRIVATE (basertppayload);
+
+ templ =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
+ g_return_if_fail (templ != NULL);
+
+ basertppayload->srcpad = gst_pad_new_from_template (templ, "src");
+ gst_element_add_pad (GST_ELEMENT (basertppayload), basertppayload->srcpad);
+
+ templ =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
+ g_return_if_fail (templ != NULL);
+
+ basertppayload->sinkpad = gst_pad_new_from_template (templ, "sink");
+ gst_pad_set_getcaps_function (basertppayload->sinkpad,
+ gst_basertppayload_sink_getcaps);
+ gst_pad_set_event_function (basertppayload->sinkpad,
+ gst_basertppayload_event);
+ gst_pad_set_chain_function (basertppayload->sinkpad,
+ gst_basertppayload_chain);
+ gst_element_add_pad (GST_ELEMENT (basertppayload), basertppayload->sinkpad);
+
+ basertppayload->seq_rand = g_rand_new_with_seed (g_random_int ());
+ basertppayload->ssrc_rand = g_rand_new_with_seed (g_random_int ());
+ basertppayload->ts_rand = g_rand_new_with_seed (g_random_int ());
+
+ basertppayload->mtu = DEFAULT_MTU;
+ basertppayload->pt = DEFAULT_PT;
+ basertppayload->seqnum_offset = DEFAULT_SEQNUM_OFFSET;
+ basertppayload->ssrc = DEFAULT_SSRC;
+ basertppayload->ts_offset = DEFAULT_TIMESTAMP_OFFSET;
+ priv->seqnum_offset_random = (basertppayload->seqnum_offset == -1);
+ priv->ts_offset_random = (basertppayload->ts_offset == -1);
+ priv->ssrc_random = (basertppayload->ssrc == -1);
+
+ basertppayload->max_ptime = DEFAULT_MAX_PTIME;
+ basertppayload->min_ptime = DEFAULT_MIN_PTIME;
+ basertppayload->priv->perfect_rtptime = DEFAULT_PERFECT_RTPTIME;
+ basertppayload->abidata.ABI.ptime_multiple = DEFAULT_PTIME_MULTIPLE;
+ basertppayload->priv->base_offset = GST_BUFFER_OFFSET_NONE;
+ basertppayload->priv->base_rtime = GST_BUFFER_OFFSET_NONE;
+
+ basertppayload->media = NULL;
+ basertppayload->encoding_name = NULL;
+
+ basertppayload->clock_rate = 0;
+
+ basertppayload->priv->caps_max_ptime = DEFAULT_MAX_PTIME;
+ basertppayload->priv->prop_max_ptime = DEFAULT_MAX_PTIME;
+}
+
+static void
+gst_basertppayload_finalize (GObject * object)
+{
+ GstBaseRTPPayload *basertppayload;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (object);
+
+ g_rand_free (basertppayload->seq_rand);
+ basertppayload->seq_rand = NULL;
+ g_rand_free (basertppayload->ssrc_rand);
+ basertppayload->ssrc_rand = NULL;
+ g_rand_free (basertppayload->ts_rand);
+ basertppayload->ts_rand = NULL;
+
+ g_free (basertppayload->media);
+ basertppayload->media = NULL;
+ g_free (basertppayload->encoding_name);
+ basertppayload->encoding_name = NULL;
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static GstCaps *
+gst_basertppayload_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadClass *basertppayload_class;
+ GstCaps *caps = NULL;
+
+ GST_DEBUG_OBJECT (pad, "getting caps");
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad));
+ basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload);
+
+ if (basertppayload_class->get_caps)
+ caps = basertppayload_class->get_caps (basertppayload, pad, filter);
+
+ if (!caps) {
+ caps = GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
+ GST_DEBUG_OBJECT (pad,
+ "using pad template %p with caps %p %" GST_PTR_FORMAT,
+ GST_PAD_PAD_TEMPLATE (pad), caps, caps);
+
+ if (filter)
+ caps = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ else
+ caps = gst_caps_ref (caps);
+ }
+
+ gst_object_unref (basertppayload);
+
+ return caps;
+}
+
+static gboolean
+gst_basertppayload_event_default (GstBaseRTPPayload * basertppayload,
+ GstEvent * event)
+{
+ gboolean res = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ res = gst_pad_event_default (basertppayload->sinkpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ res = gst_pad_event_default (basertppayload->sinkpad, event);
+ gst_segment_init (&basertppayload->segment, GST_FORMAT_UNDEFINED);
+ break;
+ case GST_EVENT_CAPS:
+ {
+ GstBaseRTPPayloadClass *basertppayload_class;
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ GST_DEBUG_OBJECT (basertppayload, "setting caps %" GST_PTR_FORMAT, caps);
+
+ basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload);
+ if (basertppayload_class->set_caps)
+ res = basertppayload_class->set_caps (basertppayload, caps);
+
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment *segment;
+
+ segment = &basertppayload->segment;
+ gst_event_copy_segment (event, segment);
+
+ basertppayload->priv->base_offset = GST_BUFFER_OFFSET_NONE;
+
+ GST_DEBUG_OBJECT (basertppayload,
+ "configured SEGMENT %" GST_SEGMENT_FORMAT, segment);
+ res = gst_pad_event_default (basertppayload->sinkpad, event);
+ break;
+ }
+ default:
+ res = gst_pad_event_default (basertppayload->sinkpad, event);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_basertppayload_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadClass *basertppayload_class;
+ gboolean res = FALSE;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (basertppayload == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload);
+
+ if (basertppayload_class->handle_event)
+ res = basertppayload_class->handle_event (basertppayload, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (basertppayload);
+
+ return res;
+}
+
+
+static GstFlowReturn
+gst_basertppayload_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadClass *basertppayload_class;
+ GstFlowReturn ret;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad));
+ basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload);
+
+ if (!basertppayload_class->handle_buffer)
+ goto no_function;
+
+ ret = basertppayload_class->handle_buffer (basertppayload, buffer);
+
+ gst_object_unref (basertppayload);
+
+ return ret;
+
+ /* ERRORS */
+no_function:
+ {
+ GST_ELEMENT_ERROR (basertppayload, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("subclass did not implement handle_buffer function"));
+ gst_object_unref (basertppayload);
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+}
+
+/**
+ * gst_basertppayload_set_options:
+ * @payload: a #GstBaseRTPPayload
+ * @media: the media type (typically "audio" or "video")
+ * @dynamic: if the payload type is dynamic
+ * @encoding_name: the encoding name
+ * @clock_rate: the clock rate of the media
+ *
+ * Set the rtp options of the payloader. These options will be set in the caps
+ * of the payloader. Subclasses must call this method before calling
+ * gst_basertppayload_push() or gst_basertppayload_set_outcaps().
+ */
+void
+gst_basertppayload_set_options (GstBaseRTPPayload * payload,
+ const gchar * media, gboolean dynamic, const gchar * encoding_name,
+ guint32 clock_rate)
+{
+ g_return_if_fail (payload != NULL);
+ g_return_if_fail (clock_rate != 0);
+
+ g_free (payload->media);
+ payload->media = g_strdup (media);
+ payload->dynamic = dynamic;
+ g_free (payload->encoding_name);
+ payload->encoding_name = g_strdup (encoding_name);
+ payload->clock_rate = clock_rate;
+}
+
+static gboolean
+copy_fixed (GQuark field_id, const GValue * value, GstStructure * dest)
+{
+ if (gst_value_is_fixed (value)) {
+ gst_structure_id_set_value (dest, field_id, value);
+ }
+ return TRUE;
+}
+
+static void
+update_max_ptime (GstBaseRTPPayload * basertppayload)
+{
+ if (basertppayload->priv->caps_max_ptime != -1 &&
+ basertppayload->priv->prop_max_ptime != -1)
+ basertppayload->max_ptime = MIN (basertppayload->priv->caps_max_ptime,
+ basertppayload->priv->prop_max_ptime);
+ else if (basertppayload->priv->caps_max_ptime != -1)
+ basertppayload->max_ptime = basertppayload->priv->caps_max_ptime;
+ else if (basertppayload->priv->prop_max_ptime != -1)
+ basertppayload->max_ptime = basertppayload->priv->prop_max_ptime;
+ else
+ basertppayload->max_ptime = DEFAULT_MAX_PTIME;
+}
+
+/**
+ * gst_basertppayload_set_outcaps:
+ * @payload: a #GstBaseRTPPayload
+ * @fieldname: the first field name or %NULL
+ * @...: field values
+ *
+ * Configure the output caps with the optional parameters.
+ *
+ * Variable arguments should be in the form field name, field type
+ * (as a GType), value(s). The last variable argument should be NULL.
+ *
+ * Returns: %TRUE if the caps could be set.
+ */
+gboolean
+gst_basertppayload_set_outcaps (GstBaseRTPPayload * payload,
+ const gchar * fieldname, ...)
+{
+ GstCaps *srccaps, *peercaps;
+ gboolean res;
+
+ /* fill in the defaults, their properties cannot be negotiated. */
+ srccaps = gst_caps_new_simple ("application/x-rtp",
+ "media", G_TYPE_STRING, payload->media,
+ "clock-rate", G_TYPE_INT, payload->clock_rate,
+ "encoding-name", G_TYPE_STRING, payload->encoding_name, NULL);
+
+ GST_DEBUG_OBJECT (payload, "defaults: %" GST_PTR_FORMAT, srccaps);
+
+ if (fieldname) {
+ va_list varargs;
+
+ /* override with custom properties */
+ va_start (varargs, fieldname);
+ gst_caps_set_simple_valist (srccaps, fieldname, varargs);
+ va_end (varargs);
+
+ GST_DEBUG_OBJECT (payload, "custom added: %" GST_PTR_FORMAT, srccaps);
+ }
+
+ payload->priv->caps_max_ptime = DEFAULT_MAX_PTIME;
+ payload->abidata.ABI.ptime = 0;
+
+ /* the peer caps can override some of the defaults */
+ peercaps = gst_pad_peer_get_caps (payload->srcpad, srccaps);
+ if (peercaps == NULL) {
+ /* no peer caps, just add the other properties */
+ gst_caps_set_simple (srccaps,
+ "payload", G_TYPE_INT, GST_BASE_RTP_PAYLOAD_PT (payload),
+ "ssrc", G_TYPE_UINT, payload->current_ssrc,
+ "clock-base", G_TYPE_UINT, payload->ts_base,
+ "seqnum-base", G_TYPE_UINT, payload->seqnum_base, NULL);
+
+ GST_DEBUG_OBJECT (payload, "no peer caps: %" GST_PTR_FORMAT, srccaps);
+ } else {
+ GstCaps *temp;
+ GstStructure *s, *d;
+ const GValue *value;
+ gint pt;
+ guint max_ptime, ptime;
+
+ /* peer provides caps we can use to fixate. They are already intersected
+ * with our srccaps, just make them writable */
+ temp = gst_caps_make_writable (peercaps);
+ gst_caps_unref (srccaps);
+
+ if (gst_caps_is_empty (temp)) {
+ gst_caps_unref (temp);
+ return FALSE;
+ }
+
+ /* now fixate, start by taking the first caps */
+ gst_caps_truncate (temp);
+
+ /* get first structure */
+ s = gst_caps_get_structure (temp, 0);
+
+ if (gst_structure_get_uint (s, "maxptime", &max_ptime))
+ payload->priv->caps_max_ptime = max_ptime * GST_MSECOND;
+
+ if (gst_structure_get_uint (s, "ptime", &ptime))
+ payload->abidata.ABI.ptime = ptime * GST_MSECOND;
+
+ if (gst_structure_get_int (s, "payload", &pt)) {
+ /* use peer pt */
+ GST_BASE_RTP_PAYLOAD_PT (payload) = pt;
+ GST_LOG_OBJECT (payload, "using peer pt %d", pt);
+ } else {
+ if (gst_structure_has_field (s, "payload")) {
+ /* can only fixate if there is a field */
+ gst_structure_fixate_field_nearest_int (s, "payload",
+ GST_BASE_RTP_PAYLOAD_PT (payload));
+ gst_structure_get_int (s, "payload", &pt);
+ GST_LOG_OBJECT (payload, "using peer pt %d", pt);
+ } else {
+ /* no pt field, use the internal pt */
+ pt = GST_BASE_RTP_PAYLOAD_PT (payload);
+ gst_structure_set (s, "payload", G_TYPE_INT, pt, NULL);
+ GST_LOG_OBJECT (payload, "using internal pt %d", pt);
+ }
+ }
+
+ if (gst_structure_has_field_typed (s, "ssrc", G_TYPE_UINT)) {
+ value = gst_structure_get_value (s, "ssrc");
+ payload->current_ssrc = g_value_get_uint (value);
+ GST_LOG_OBJECT (payload, "using peer ssrc %08x", payload->current_ssrc);
+ } else {
+ /* FIXME, fixate_nearest_uint would be even better */
+ gst_structure_set (s, "ssrc", G_TYPE_UINT, payload->current_ssrc, NULL);
+ GST_LOG_OBJECT (payload, "using internal ssrc %08x",
+ payload->current_ssrc);
+ }
+
+ if (gst_structure_has_field_typed (s, "clock-base", G_TYPE_UINT)) {
+ value = gst_structure_get_value (s, "clock-base");
+ payload->ts_base = g_value_get_uint (value);
+ GST_LOG_OBJECT (payload, "using peer clock-base %u", payload->ts_base);
+ } else {
+ /* FIXME, fixate_nearest_uint would be even better */
+ gst_structure_set (s, "clock-base", G_TYPE_UINT, payload->ts_base, NULL);
+ GST_LOG_OBJECT (payload, "using internal clock-base %u",
+ payload->ts_base);
+ }
+ if (gst_structure_has_field_typed (s, "seqnum-base", G_TYPE_UINT)) {
+ value = gst_structure_get_value (s, "seqnum-base");
+ payload->seqnum_base = g_value_get_uint (value);
+ GST_LOG_OBJECT (payload, "using peer seqnum-base %u",
+ payload->seqnum_base);
+ } else {
+ /* FIXME, fixate_nearest_uint would be even better */
+ gst_structure_set (s, "seqnum-base", G_TYPE_UINT, payload->seqnum_base,
+ NULL);
+ GST_LOG_OBJECT (payload, "using internal seqnum-base %u",
+ payload->seqnum_base);
+ }
+
+ /* make the target caps by copying over all the fixed caps, removing the
+ * unfixed caps. */
+ srccaps = gst_caps_new_simple (gst_structure_get_name (s), NULL);
+ d = gst_caps_get_structure (srccaps, 0);
+
+ gst_structure_foreach (s, (GstStructureForeachFunc) copy_fixed, d);
+
+ gst_caps_unref (temp);
+
+ GST_DEBUG_OBJECT (payload, "with peer caps: %" GST_PTR_FORMAT, srccaps);
+ }
+
+ update_max_ptime (payload);
+
+ res = gst_pad_set_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload), srccaps);
+ gst_caps_unref (srccaps);
+
+ return res;
+}
+
+/**
+ * gst_basertppayload_is_filled:
+ * @payload: a #GstBaseRTPPayload
+ * @size: the size of the packet
+ * @duration: the duration of the packet
+ *
+ * Check if the packet with @size and @duration would exceed the configured
+ * maximum size.
+ *
+ * Returns: %TRUE if the packet of @size and @duration would exceed the
+ * configured MTU or max_ptime.
+ */
+gboolean
+gst_basertppayload_is_filled (GstBaseRTPPayload * payload,
+ guint size, GstClockTime duration)
+{
+ if (size > payload->mtu)
+ return TRUE;
+
+ if (payload->max_ptime != -1 && duration >= payload->max_ptime)
+ return TRUE;
+
+ return FALSE;
+}
+
+typedef struct
+{
+ GstBaseRTPPayload *payload;
+ guint32 ssrc;
+ guint16 seqnum;
+ guint8 pt;
+ GstClockTime timestamp;
+ guint64 offset;
+ guint32 rtptime;
+} HeaderData;
+
+static gboolean
+find_timestamp (GstBuffer ** buffer, guint idx, HeaderData * data)
+{
+ data->timestamp = GST_BUFFER_TIMESTAMP (*buffer);
+ data->offset = GST_BUFFER_OFFSET (*buffer);
+
+ /* stop when we find a timestamp. We take whatever offset is associated with
+ * the timestamp (if any) to do perfect timestamps when we need to. */
+ if (data->timestamp != -1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static gboolean
+set_headers (GstBuffer ** buffer, guint group, guint idx, HeaderData * data)
+{
+ GstRTPBuffer rtp;
+
+ gst_rtp_buffer_map (*buffer, GST_MAP_WRITE, &rtp);
+ gst_rtp_buffer_set_ssrc (&rtp, data->ssrc);
+ gst_rtp_buffer_set_payload_type (&rtp, data->pt);
+ gst_rtp_buffer_set_seq (&rtp, data->seqnum);
+ gst_rtp_buffer_set_timestamp (&rtp, data->rtptime);
+ gst_rtp_buffer_unmap (&rtp);
+
+ /* increment the seqnum for each buffer */
+ data->seqnum++;
+
+ return TRUE;
+}
+
+/* Updates the SSRC, payload type, seqnum and timestamp of the RTP buffer
+ * before the buffer is pushed. */
+static GstFlowReturn
+gst_basertppayload_prepare_push (GstBaseRTPPayload * payload,
+ gpointer obj, gboolean is_list)
+{
+ GstBaseRTPPayloadPrivate *priv;
+ HeaderData data;
+
+ if (payload->clock_rate == 0)
+ goto no_rate;
+
+ priv = payload->priv;
+
+ /* update first, so that the property is set to the last
+ * seqnum pushed */
+ payload->seqnum = priv->next_seqnum;
+
+ /* fill in the fields we want to set on all headers */
+ data.payload = payload;
+ data.seqnum = payload->seqnum;
+ data.ssrc = payload->current_ssrc;
+ data.pt = payload->pt;
+
+ /* find the first buffer with a timestamp */
+ if (is_list) {
+ data.timestamp = -1;
+ data.offset = GST_BUFFER_OFFSET_NONE;
+ gst_buffer_list_foreach (GST_BUFFER_LIST_CAST (obj),
+ (GstBufferListFunc) find_timestamp, &data);
+ } else {
+ data.timestamp = GST_BUFFER_TIMESTAMP (GST_BUFFER_CAST (obj));
+ data.offset = GST_BUFFER_OFFSET (GST_BUFFER_CAST (obj));
+ }
+
+ /* convert to RTP time */
+ if (priv->perfect_rtptime && data.offset != GST_BUFFER_OFFSET_NONE &&
+ priv->base_offset != GST_BUFFER_OFFSET_NONE) {
+ /* if we have an offset, use that for making an RTP timestamp */
+ data.rtptime = payload->ts_base + priv->base_rtime +
+ data.offset - priv->base_offset;
+ GST_LOG_OBJECT (payload,
+ "Using offset %" G_GUINT64_FORMAT " for RTP timestamp", data.offset);
+ } else if (GST_CLOCK_TIME_IS_VALID (data.timestamp)) {
+ gint64 rtime;
+
+ /* no offset, use the gstreamer timestamp */
+ rtime = gst_segment_to_running_time (&payload->segment, GST_FORMAT_TIME,
+ data.timestamp);
+
+ if (rtime == -1) {
+ GST_LOG_OBJECT (payload, "Clipped timestamp, using base RTP timestamp");
+ rtime = 0;
+ } else {
+ GST_LOG_OBJECT (payload,
+ "Using running_time %" GST_TIME_FORMAT " for RTP timestamp",
+ GST_TIME_ARGS (rtime));
+ rtime =
+ gst_util_uint64_scale_int (rtime, payload->clock_rate, GST_SECOND);
+ priv->base_offset = data.offset;
+ priv->base_rtime = rtime;
+ }
+ /* add running_time in clock-rate units to the base timestamp */
+ data.rtptime = payload->ts_base + rtime;
+ } else {
+ GST_LOG_OBJECT (payload,
+ "Using previous RTP timestamp %" G_GUINT32_FORMAT, payload->timestamp);
+ /* no timestamp to convert, take previous timestamp */
+ data.rtptime = payload->timestamp;
+ }
+
+ /* set ssrc, payload type, seq number, caps and rtptime */
+ if (is_list) {
+ gst_buffer_list_foreach (GST_BUFFER_LIST_CAST (obj),
+ (GstBufferListFunc) set_headers, &data);
+ } else {
+ GstBuffer *buf = GST_BUFFER_CAST (obj);
+ set_headers (&buf, 0, 0, &data);
+ }
+
+ priv->next_seqnum = data.seqnum;
+ payload->timestamp = data.rtptime;
+
+ GST_LOG_OBJECT (payload, "Preparing to push packet with size %"
+ G_GSIZE_FORMAT ", seq=%d, rtptime=%u, timestamp %" GST_TIME_FORMAT,
+ (is_list) ? -1 : gst_buffer_get_size (GST_BUFFER (obj)),
+ payload->seqnum, data.rtptime, GST_TIME_ARGS (data.timestamp));
+
+ if (g_atomic_int_compare_and_exchange (&payload->priv->
+ notified_first_timestamp, 1, 0)) {
+ g_object_notify (G_OBJECT (payload), "timestamp");
+ g_object_notify (G_OBJECT (payload), "seqnum");
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+no_rate:
+ {
+ GST_ELEMENT_ERROR (payload, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("subclass did not specify clock-rate"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/**
+ * gst_basertppayload_push_list:
+ * @payload: a #GstBaseRTPPayload
+ * @list: a #GstBufferList
+ *
+ * Push @list to the peer element of the payloader. The SSRC, payload type,
+ * seqnum and timestamp of the RTP buffer will be updated first.
+ *
+ * This function takes ownership of @list.
+ *
+ * Returns: a #GstFlowReturn.
+ *
+ * Since: 0.10.24
+ */
+GstFlowReturn
+gst_basertppayload_push_list (GstBaseRTPPayload * payload, GstBufferList * list)
+{
+ GstFlowReturn res;
+
+ res = gst_basertppayload_prepare_push (payload, list, TRUE);
+
+ if (G_LIKELY (res == GST_FLOW_OK))
+ res = gst_pad_push_list (payload->srcpad, list);
+ else
+ gst_buffer_list_unref (list);
+
+ return res;
+}
+
+/**
+ * gst_basertppayload_push:
+ * @payload: a #GstBaseRTPPayload
+ * @buffer: a #GstBuffer
+ *
+ * Push @buffer to the peer element of the payloader. The SSRC, payload type,
+ * seqnum and timestamp of the RTP buffer will be updated first.
+ *
+ * This function takes ownership of @buffer.
+ *
+ * Returns: a #GstFlowReturn.
+ */
+GstFlowReturn
+gst_basertppayload_push (GstBaseRTPPayload * payload, GstBuffer * buffer)
+{
+ GstFlowReturn res;
+
+ res = gst_basertppayload_prepare_push (payload, buffer, FALSE);
+
+ if (G_LIKELY (res == GST_FLOW_OK))
+ res = gst_pad_push (payload->srcpad, buffer);
+ else
+ gst_buffer_unref (buffer);
+
+ return res;
+}
+
+static void
+gst_basertppayload_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadPrivate *priv;
+ gint64 val;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (object);
+ priv = basertppayload->priv;
+
+ switch (prop_id) {
+ case PROP_MTU:
+ basertppayload->mtu = g_value_get_uint (value);
+ break;
+ case PROP_PT:
+ basertppayload->pt = g_value_get_uint (value);
+ break;
+ case PROP_SSRC:
+ val = g_value_get_uint (value);
+ basertppayload->ssrc = val;
+ priv->ssrc_random = FALSE;
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ val = g_value_get_uint (value);
+ basertppayload->ts_offset = val;
+ priv->ts_offset_random = FALSE;
+ break;
+ case PROP_SEQNUM_OFFSET:
+ val = g_value_get_int (value);
+ basertppayload->seqnum_offset = val;
+ priv->seqnum_offset_random = (val == -1);
+ GST_DEBUG_OBJECT (basertppayload, "seqnum offset 0x%04x, random %d",
+ basertppayload->seqnum_offset, priv->seqnum_offset_random);
+ break;
+ case PROP_MAX_PTIME:
+ basertppayload->priv->prop_max_ptime = g_value_get_int64 (value);
+ update_max_ptime (basertppayload);
+ break;
+ case PROP_MIN_PTIME:
+ basertppayload->min_ptime = g_value_get_int64 (value);
+ break;
+ case PROP_PERFECT_RTPTIME:
+ priv->perfect_rtptime = g_value_get_boolean (value);
+ break;
+ case PROP_PTIME_MULTIPLE:
+ basertppayload->abidata.ABI.ptime_multiple = g_value_get_int64 (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_basertppayload_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadPrivate *priv;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (object);
+ priv = basertppayload->priv;
+
+ switch (prop_id) {
+ case PROP_MTU:
+ g_value_set_uint (value, basertppayload->mtu);
+ break;
+ case PROP_PT:
+ g_value_set_uint (value, basertppayload->pt);
+ break;
+ case PROP_SSRC:
+ if (priv->ssrc_random)
+ g_value_set_uint (value, -1);
+ else
+ g_value_set_uint (value, basertppayload->ssrc);
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ if (priv->ts_offset_random)
+ g_value_set_uint (value, -1);
+ else
+ g_value_set_uint (value, (guint32) basertppayload->ts_offset);
+ break;
+ case PROP_SEQNUM_OFFSET:
+ if (priv->seqnum_offset_random)
+ g_value_set_int (value, -1);
+ else
+ g_value_set_int (value, (guint16) basertppayload->seqnum_offset);
+ break;
+ case PROP_MAX_PTIME:
+ g_value_set_int64 (value, basertppayload->max_ptime);
+ break;
+ case PROP_MIN_PTIME:
+ g_value_set_int64 (value, basertppayload->min_ptime);
+ break;
+ case PROP_TIMESTAMP:
+ g_value_set_uint (value, basertppayload->timestamp);
+ break;
+ case PROP_SEQNUM:
+ g_value_set_uint (value, basertppayload->seqnum);
+ break;
+ case PROP_PERFECT_RTPTIME:
+ g_value_set_boolean (value, priv->perfect_rtptime);
+ break;
+ case PROP_PTIME_MULTIPLE:
+ g_value_set_int64 (value, basertppayload->abidata.ABI.ptime_multiple);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_basertppayload_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstBaseRTPPayload *basertppayload;
+ GstBaseRTPPayloadPrivate *priv;
+ GstStateChangeReturn ret;
+
+ basertppayload = GST_BASE_RTP_PAYLOAD (element);
+ priv = basertppayload->priv;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ gst_segment_init (&basertppayload->segment, GST_FORMAT_UNDEFINED);
+
+ if (priv->seqnum_offset_random)
+ basertppayload->seqnum_base = g_random_int_range (0, G_MAXUINT16);
+ else
+ basertppayload->seqnum_base = basertppayload->seqnum_offset;
+ priv->next_seqnum = basertppayload->seqnum_base;
+ basertppayload->seqnum = basertppayload->seqnum_base;
+
+ if (priv->ssrc_random)
+ basertppayload->current_ssrc = g_random_int ();
+ else
+ basertppayload->current_ssrc = basertppayload->ssrc;
+
+ if (priv->ts_offset_random)
+ basertppayload->ts_base = g_random_int ();
+ else
+ basertppayload->ts_base = basertppayload->ts_offset;
+ basertppayload->timestamp = basertppayload->ts_base;
+ g_atomic_int_set (&basertppayload->priv->notified_first_timestamp, 1);
+ priv->base_offset = GST_BUFFER_OFFSET_NONE;
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ g_atomic_int_set (&basertppayload->priv->notified_first_timestamp, 1);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
diff --git a/gst-libs/gst/rtp/gstbasertppayload.h b/gst-libs/gst/rtp/gstbasertppayload.h
new file mode 100644
index 0000000..72b3839
--- /dev/null
+++ b/gst-libs/gst/rtp/gstbasertppayload.h
@@ -0,0 +1,174 @@
+/* GStreamer
+ * Copyright (C) <2005> 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.
+ */
+
+#ifndef __GST_BASE_RTP_PAYLOAD_H__
+#define __GST_BASE_RTP_PAYLOAD_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_RTP_PAYLOAD \
+ (gst_basertppayload_get_type())
+#define GST_BASE_RTP_PAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_RTP_PAYLOAD,GstBaseRTPPayload))
+#define GST_BASE_RTP_PAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_RTP_PAYLOAD,GstBaseRTPPayloadClass))
+#define GST_BASE_RTP_PAYLOAD_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BASE_RTP_PAYLOAD, GstBaseRTPPayloadClass))
+#define GST_IS_BASE_RTP_PAYLOAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_RTP_PAYLOAD))
+#define GST_IS_BASE_RTP_PAYLOAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_RTP_PAYLOAD))
+#define GST_BASE_RTP_PAYLOAD_CAST(obj) \
+ ((GstBaseRTPPayload*)(obj))
+
+typedef struct _GstBaseRTPPayload GstBaseRTPPayload;
+typedef struct _GstBaseRTPPayloadPrivate GstBaseRTPPayloadPrivate;
+typedef struct _GstBaseRTPPayloadClass GstBaseRTPPayloadClass;
+
+/**
+ * GST_BASE_RTP_PAYLOAD_SINKPAD:
+ * @payload: a #GstBaseRTPPayload
+ *
+ * Get access to the sinkpad of @payload.
+ */
+#define GST_BASE_RTP_PAYLOAD_SINKPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)->sinkpad)
+/**
+ * GST_BASE_RTP_PAYLOAD_SRCPAD:
+ * @payload: a #GstBaseRTPPayload
+ *
+ * Get access to the srcpad of @payload.
+ */
+#define GST_BASE_RTP_PAYLOAD_SRCPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)->srcpad)
+
+/**
+ * GST_BASE_RTP_PAYLOAD_PT:
+ * @payload: a #GstBaseRTPPayload
+ *
+ * Get access to the configured payload type of @payload.
+ */
+#define GST_BASE_RTP_PAYLOAD_PT(payload) (GST_BASE_RTP_PAYLOAD (payload)->pt)
+/**
+ * GST_BASE_RTP_PAYLOAD_MTU:
+ * @payload: a #GstBaseRTPPayload
+ *
+ * Get access to the configured MTU of @payload.
+ */
+#define GST_BASE_RTP_PAYLOAD_MTU(payload) (GST_BASE_RTP_PAYLOAD (payload)->mtu)
+
+struct _GstBaseRTPPayload
+{
+ GstElement element;
+
+ /*< private >*/
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* FIXME 0.11: none of these GRands are used anymore, remove them */
+ GRand *seq_rand;
+ GRand *ssrc_rand;
+ GRand *ts_rand;
+
+ guint32 ts_base;
+ guint16 seqnum_base;
+
+ gchar *media;
+ gchar *encoding_name;
+ gboolean dynamic;
+ guint32 clock_rate;
+
+ gint32 ts_offset;
+ guint32 timestamp;
+ gint16 seqnum_offset;
+ guint16 seqnum;
+ gint64 max_ptime;
+ guint pt;
+ guint ssrc;
+ guint current_ssrc;
+ guint mtu;
+
+ GstSegment segment;
+
+ guint64 min_ptime;
+
+ /*< private >*/
+ GstBaseRTPPayloadPrivate *priv;
+
+ union {
+ struct {
+ guint64 ptime; /* in ns */
+ guint64 ptime_multiple; /* in ns */
+ } ABI;
+ gpointer _gst_reserved[GST_PADDING - (sizeof(guint64)/sizeof(gpointer)) - 1];
+ } abidata;
+};
+
+/**
+ * GstBaseRTPPayloadClass:
+ * @parent_class: the parent class
+ * @set_caps: configure the payloader
+ * @handle_buffer: process data
+ * @handle_event: custom event handling
+ * @get_caps: get desired caps
+ *
+ * Base class for audio RTP payloader.
+ */
+struct _GstBaseRTPPayloadClass
+{
+ GstElementClass parent_class;
+
+ /* query accepted caps */
+ GstCaps * (*get_caps) (GstBaseRTPPayload *payload, GstPad * pad, GstCaps * filter);
+ /* receive caps on the sink pad, configure the payloader. */
+ gboolean (*set_caps) (GstBaseRTPPayload *payload, GstCaps *caps);
+
+ /* handle a buffer, perform 0 or more gst_basertppayload_push() on
+ * the RTP buffers. This function takes ownership of the buffer. */
+ GstFlowReturn (*handle_buffer) (GstBaseRTPPayload *payload,
+ GstBuffer *buffer);
+ gboolean (*handle_event) (GstBaseRTPPayload *payload, GstEvent * event);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_basertppayload_get_type (void);
+
+void gst_basertppayload_set_options (GstBaseRTPPayload *payload,
+ const gchar *media,
+ gboolean dynamic,
+ const gchar *encoding_name,
+ guint32 clock_rate);
+
+gboolean gst_basertppayload_set_outcaps (GstBaseRTPPayload *payload,
+ const gchar *fieldname, ...);
+
+gboolean gst_basertppayload_is_filled (GstBaseRTPPayload *payload,
+ guint size, GstClockTime duration);
+
+GstFlowReturn gst_basertppayload_push (GstBaseRTPPayload *payload,
+ GstBuffer *buffer);
+
+GstFlowReturn gst_basertppayload_push_list (GstBaseRTPPayload *payload,
+ GstBufferList *list);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_RTP_PAYLOAD_H__ */
diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.c b/gst-libs/gst/rtp/gstrtcpbuffer.c
new file mode 100644
index 0000000..323c5cf
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtcpbuffer.c
@@ -0,0 +1,2034 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim@fluendo.com>
+ *
+ * gstrtcpbuffer.h: various helper functions to manipulate buffers
+ * with RTCP payload.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstrtcpbuffer
+ * @short_description: Helper methods for dealing with RTCP buffers
+ * @see_also: #GstBaseRTPPayload, #GstBaseRTPDepayload, #gstrtpbuffer
+ *
+ * Note: The API in this module is not yet declared stable.
+ *
+ * <refsect2>
+ * <para>
+ * The GstRTPCBuffer helper functions makes it easy to parse and create regular
+ * #GstBuffer objects that contain compound RTCP packets. These buffers are typically
+ * of 'application/x-rtcp' #GstCaps.
+ * </para>
+ * <para>
+ * An RTCP buffer consists of 1 or more #GstRTCPPacket structures that you can
+ * retrieve with gst_rtcp_buffer_get_first_packet(). #GstRTCPPacket acts as a pointer
+ * into the RTCP buffer; you can move to the next packet with
+ * gst_rtcp_packet_move_to_next().
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2007-03-26 (0.10.13)
+ *
+ * Since: 0.10.13
+ */
+
+#include <string.h>
+
+#include "gstrtcpbuffer.h"
+
+/**
+ * gst_rtcp_buffer_new_take_data:
+ * @data: data for the new buffer
+ * @len: the length of data
+ *
+ * Create a new buffer and set the data and size of the buffer to @data and @len
+ * respectively. @data will be freed when the buffer is unreffed, so this
+ * function transfers ownership of @data to the new buffer.
+ *
+ * Returns: A newly allocated buffer with @data and of size @len.
+ */
+GstBuffer *
+gst_rtcp_buffer_new_take_data (gpointer data, guint len)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (len > 0, NULL);
+
+ result = gst_buffer_new ();
+ gst_buffer_take_memory (result, -1,
+ gst_memory_new_wrapped (0, data, g_free, len, 0, len));
+
+ return result;
+}
+
+/**
+ * gst_rtcp_buffer_new_copy_data:
+ * @data: data for the new buffer
+ * @len: the length of data
+ *
+ * Create a new buffer and set the data to a copy of @len
+ * bytes of @data and the size to @len. The data will be freed when the buffer
+ * is freed.
+ *
+ * Returns: A newly allocated buffer with a copy of @data and of size @len.
+ */
+GstBuffer *
+gst_rtcp_buffer_new_copy_data (gpointer data, guint len)
+{
+ return gst_rtcp_buffer_new_take_data (g_memdup (data, len), len);
+}
+
+/**
+ * gst_rtcp_buffer_validate_data:
+ * @data: the data to validate
+ * @len: the length of @data to validate
+ *
+ * Check if the @data and @size point to the data of a valid RTCP (compound)
+ * packet.
+ * Use this function to validate a packet before using the other functions in
+ * this module.
+ *
+ * Returns: TRUE if the data points to a valid RTCP packet.
+ */
+gboolean
+gst_rtcp_buffer_validate_data (guint8 * data, guint len)
+{
+ guint16 header_mask;
+ guint16 header_len;
+ guint8 version;
+ guint data_len;
+ gboolean padding;
+ guint8 pad_bytes;
+
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ /* we need 4 bytes for the type and length */
+ if (G_UNLIKELY (len < 4))
+ goto wrong_length;
+
+ /* first packet must be RR or SR and version must be 2 */
+ header_mask = ((data[0] << 8) | data[1]) & GST_RTCP_VALID_MASK;
+ if (G_UNLIKELY (header_mask != GST_RTCP_VALID_VALUE))
+ goto wrong_mask;
+
+ /* no padding when mask succeeds */
+ padding = FALSE;
+
+ /* store len */
+ data_len = len;
+
+ while (TRUE) {
+ /* get packet length */
+ header_len = (((data[2] << 8) | data[3]) + 1) << 2;
+ if (data_len < header_len)
+ goto wrong_length;
+
+ /* move to next compount packet */
+ data += header_len;
+ data_len -= header_len;
+
+ /* we are at the end now */
+ if (data_len < 4)
+ break;
+
+ /* check version of new packet */
+ version = data[0] & 0xc0;
+ if (version != (GST_RTCP_VERSION << 6))
+ goto wrong_version;
+
+ /* padding only allowed on last packet */
+ if ((padding = data[0] & 0x20))
+ break;
+ }
+ if (data_len > 0) {
+ /* some leftover bytes, check padding */
+ if (!padding)
+ goto wrong_length;
+
+ /* get padding */
+ pad_bytes = data[data_len - 1];
+ if (data_len != pad_bytes)
+ goto wrong_padding;
+ }
+ return TRUE;
+
+ /* ERRORS */
+wrong_length:
+ {
+ GST_DEBUG ("len check failed");
+ return FALSE;
+ }
+wrong_mask:
+ {
+ GST_DEBUG ("mask check failed (%04x != %04x)", header_mask,
+ GST_RTCP_VALID_VALUE);
+ return FALSE;
+ }
+wrong_version:
+ {
+ GST_DEBUG ("wrong version (%d < 2)", version >> 6);
+ return FALSE;
+ }
+wrong_padding:
+ {
+ GST_DEBUG ("padding check failed");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_buffer_validate:
+ * @buffer: the buffer to validate
+ *
+ * Check if the data pointed to by @buffer is a valid RTCP packet using
+ * gst_rtcp_buffer_validate_data().
+ *
+ * Returns: TRUE if @buffer is a valid RTCP packet.
+ */
+gboolean
+gst_rtcp_buffer_validate (GstBuffer * buffer)
+{
+ gboolean res;
+ guint8 *data;
+ gsize len;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+
+ data = gst_buffer_map (buffer, &len, NULL, GST_MAP_READ);
+ res = gst_rtcp_buffer_validate_data (data, len);
+ gst_buffer_unmap (buffer, data, len);
+
+ return res;
+}
+
+/**
+ * gst_rtcp_buffer_new:
+ * @mtu: the maximum mtu size.
+ *
+ * Create a new buffer for constructing RTCP packets. The packet will have a
+ * maximum size of @mtu.
+ *
+ * Returns: A newly allocated buffer.
+ */
+GstBuffer *
+gst_rtcp_buffer_new (guint mtu)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (mtu > 0, NULL);
+
+ result = gst_buffer_new ();
+ gst_buffer_take_memory (result, -1,
+ gst_memory_new_wrapped (0, g_malloc0 (mtu), g_free, mtu, 0, mtu));
+
+ return result;
+}
+
+/**
+ * gst_rtcp_buffer_map:
+ * @buffer: a buffer with an RTCP packet
+ * @flags: flags for the mapping
+ * @rtcp: resulting #GstRTCPBuffer
+ *
+ * Open @buffer for reading or writing, depending on @flags. The resulting RTCP
+ * buffer state is stored in @rtcp.
+ */
+gboolean
+gst_rtcp_buffer_map (GstBuffer * buffer, GstMapFlags flags,
+ GstRTCPBuffer * rtcp)
+{
+ g_return_val_if_fail (rtcp != NULL, FALSE);
+ g_return_val_if_fail (rtcp->buffer == NULL, FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+
+ rtcp->buffer = buffer;
+ rtcp->flags = flags;
+ rtcp->data = gst_buffer_map (buffer, &rtcp->size, &rtcp->maxsize, flags);
+
+ /* allow for expansion, e.g. adding packets, if needed */
+ if ((flags & GST_MAP_WRITE) != 0) {
+ /* unmap and adjust to max available, and remap */
+ gst_buffer_unmap (buffer, rtcp->data, rtcp->maxsize);
+ rtcp->data = gst_buffer_map (buffer, &rtcp->size, &rtcp->maxsize, flags);
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_buffer_unmap:
+ * @buffer: a buffer with an RTCP packet
+ *
+ * Finish @rtcp after being constructured. This function is usually called
+ * after gst_rtcp_buffer_map() and after adding the RTCP items to the new buffer.
+ *
+ * The function adjusts the size of @buffer with the total length of all the
+ * added packets.
+ */
+gboolean
+gst_rtcp_buffer_unmap (GstRTCPBuffer * rtcp)
+{
+ gboolean res;
+ GstRTCPPacket packet;
+
+ g_return_val_if_fail (rtcp != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (rtcp->buffer), FALSE);
+
+ /* move to the first free space */
+ if (gst_rtcp_buffer_get_first_packet (rtcp, &packet))
+ while (gst_rtcp_packet_move_to_next (&packet));
+
+ /* shrink size */
+ res = gst_buffer_unmap (rtcp->buffer, rtcp->data, packet.offset);
+ rtcp->buffer = NULL;
+
+ return res;
+}
+
+/**
+ * gst_rtcp_buffer_get_packet_count:
+ * @buffer: a valid RTCP buffer
+ *
+ * Get the number of RTCP packets in @buffer.
+ *
+ * Returns: the number of RTCP packets in @buffer.
+ */
+guint
+gst_rtcp_buffer_get_packet_count (GstRTCPBuffer * rtcp)
+{
+ GstRTCPPacket packet;
+ guint count;
+
+ g_return_val_if_fail (rtcp != NULL, 0);
+ g_return_val_if_fail (GST_IS_BUFFER (rtcp->buffer), 0);
+
+ count = 0;
+ if (gst_rtcp_buffer_get_first_packet (rtcp, &packet)) {
+ do {
+ count++;
+ } while (gst_rtcp_packet_move_to_next (&packet));
+ }
+
+ return count;
+}
+
+/**
+ * read_packet_header:
+ * @packet: a packet
+ *
+ * Read the packet headers for the packet pointed to by @packet.
+ *
+ * Returns: TRUE if @packet pointed to a valid header.
+ */
+static gboolean
+read_packet_header (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint size;
+ guint offset;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+
+ data = packet->rtcp->data;
+ size = packet->rtcp->size;
+
+ offset = packet->offset;
+
+ /* check if we are at the end of the buffer, we add 4 because we also want to
+ * ensure we can read the header. */
+ if (offset + 4 > size)
+ return FALSE;
+
+ if ((data[offset] & 0xc0) != (GST_RTCP_VERSION << 6))
+ return FALSE;
+
+ /* read count, type and length */
+ packet->padding = (data[offset] & 0x20) == 0x20;
+ packet->count = data[offset] & 0x1f;
+ packet->type = data[offset + 1];
+ packet->length = (data[offset + 2] << 8) | data[offset + 3];
+ packet->item_offset = 4;
+ packet->item_count = 0;
+ packet->entry_offset = 4;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_buffer_get_first_packet:
+ * @buffer: a valid RTCP buffer
+ * @packet: a #GstRTCPPacket
+ *
+ * Initialize a new #GstRTCPPacket pointer that points to the first packet in
+ * @buffer.
+ *
+ * Returns: TRUE if the packet existed in @buffer.
+ */
+gboolean
+gst_rtcp_buffer_get_first_packet (GstRTCPBuffer * rtcp, GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (rtcp != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (rtcp->buffer), FALSE);
+ g_return_val_if_fail (packet != NULL, FALSE);
+
+ /* init to 0 */
+ packet->rtcp = rtcp;
+ packet->offset = 0;
+ packet->type = GST_RTCP_TYPE_INVALID;
+
+ if (!read_packet_header (packet))
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_move_to_next:
+ * @packet: a #GstRTCPPacket
+ *
+ * Move the packet pointer @packet to the next packet in the payload.
+ * Use gst_rtcp_buffer_get_first_packet() to initialize @packet.
+ *
+ * Returns: TRUE if @packet is pointing to a valid packet after calling this
+ * function.
+ */
+gboolean
+gst_rtcp_packet_move_to_next (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type != GST_RTCP_TYPE_INVALID, FALSE);
+
+ /* if we have a padding or invalid packet, it must be the last,
+ * return FALSE */
+ if (packet->type == GST_RTCP_TYPE_INVALID || packet->padding)
+ goto end;
+
+ /* move to next packet. Add 4 because the header is not included in length */
+ packet->offset += (packet->length << 2) + 4;
+
+ /* try to read new header */
+ if (!read_packet_header (packet))
+ goto end;
+
+ return TRUE;
+
+ /* ERRORS */
+end:
+ {
+ packet->type = GST_RTCP_TYPE_INVALID;
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_buffer_add_packet:
+ * @buffer: a valid RTCP buffer
+ * @type: the #GstRTCPType of the new packet
+ * @packet: pointer to new packet
+ *
+ * Add a new packet of @type to @buffer. @packet will point to the newly created
+ * packet.
+ *
+ * Returns: %TRUE if the packet could be created. This function returns %FALSE
+ * if the max mtu is exceeded for the buffer.
+ */
+gboolean
+gst_rtcp_buffer_add_packet (GstRTCPBuffer * rtcp, GstRTCPType type,
+ GstRTCPPacket * packet)
+{
+ guint len, size;
+ guint8 *data;
+ gboolean result;
+
+ g_return_val_if_fail (rtcp != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (rtcp->buffer), FALSE);
+ g_return_val_if_fail (type != GST_RTCP_TYPE_INVALID, FALSE);
+ g_return_val_if_fail (packet != NULL, FALSE);
+
+ /* find free space */
+ if (gst_rtcp_buffer_get_first_packet (rtcp, packet))
+ while (gst_rtcp_packet_move_to_next (packet));
+
+ size = rtcp->size;
+
+ /* packet->offset is now pointing to the next free offset in the buffer to
+ * start a compount packet. Next we figure out if we have enough free space in
+ * the buffer to continue. */
+ switch (type) {
+ case GST_RTCP_TYPE_SR:
+ len = 28;
+ break;
+ case GST_RTCP_TYPE_RR:
+ len = 8;
+ break;
+ case GST_RTCP_TYPE_SDES:
+ len = 4;
+ break;
+ case GST_RTCP_TYPE_BYE:
+ len = 4;
+ break;
+ case GST_RTCP_TYPE_APP:
+ len = 12;
+ break;
+ case GST_RTCP_TYPE_RTPFB:
+ len = 12;
+ break;
+ case GST_RTCP_TYPE_PSFB:
+ len = 12;
+ break;
+ default:
+ goto unknown_type;
+ }
+ if (packet->offset + len >= size)
+ goto no_space;
+
+ data = rtcp->data + packet->offset;
+
+ data[0] = (GST_RTCP_VERSION << 6);
+ data[1] = type;
+ /* length is stored in multiples of 32 bit words minus the length of the
+ * header */
+ len = (len - 4) >> 2;
+ data[2] = len >> 8;
+ data[3] = len & 0xff;
+
+ /* now try to position to the packet */
+ result = read_packet_header (packet);
+
+ return result;
+
+ /* ERRORS */
+unknown_type:
+ {
+ g_warning ("unknown type %d", type);
+ return FALSE;
+ }
+no_space:
+ {
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_remove:
+ * @packet: a #GstRTCPPacket
+ *
+ * Removes the packet pointed to by @packet and moves pointer to the next one
+ *
+ * Returns: TRUE if @packet is pointing to a valid packet after calling this
+ * function.
+ */
+gboolean
+gst_rtcp_packet_remove (GstRTCPPacket * packet)
+{
+ gboolean ret = FALSE;
+ guint offset = 0;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type != GST_RTCP_TYPE_INVALID, FALSE);
+
+ /* The next packet starts at offset + length + 4 (the header) */
+ offset = packet->offset + (packet->length << 2) + 4;
+
+ /* Overwrite this packet with the rest of the data */
+ memmove (packet->rtcp->data + packet->offset,
+ packet->rtcp->data + offset, packet->rtcp->size - offset);
+
+ /* try to read next header */
+ ret = read_packet_header (packet);
+ if (!ret)
+ packet->type = GST_RTCP_TYPE_INVALID;
+
+ return ret;
+}
+
+/**
+ * gst_rtcp_packet_get_padding:
+ * @packet: a valid #GstRTCPPacket
+ *
+ * Get the packet padding of the packet pointed to by @packet.
+ *
+ * Returns: If the packet has the padding bit set.
+ */
+gboolean
+gst_rtcp_packet_get_padding (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type != GST_RTCP_TYPE_INVALID, FALSE);
+
+ return packet->padding;
+}
+
+/**
+ * gst_rtcp_packet_get_type:
+ * @packet: a valid #GstRTCPPacket
+ *
+ * Get the packet type of the packet pointed to by @packet.
+ *
+ * Returns: The packet type or GST_RTCP_TYPE_INVALID when @packet is not
+ * pointing to a valid packet.
+ */
+GstRTCPType
+gst_rtcp_packet_get_type (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, GST_RTCP_TYPE_INVALID);
+
+ return packet->type;
+}
+
+/**
+ * gst_rtcp_packet_get_count:
+ * @packet: a valid #GstRTCPPacket
+ *
+ * Get the count field in @packet.
+ *
+ * Returns: The count field in @packet or -1 if @packet does not point to a
+ * valid packet.
+ */
+guint8
+gst_rtcp_packet_get_count (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, -1);
+ g_return_val_if_fail (packet->type != GST_RTCP_TYPE_INVALID, -1);
+
+ return packet->count;
+}
+
+/**
+ * gst_rtcp_packet_get_length:
+ * @packet: a valid #GstRTCPPacket
+ *
+ * Get the length field of @packet. This is the length of the packet in
+ * 32-bit words minus one.
+ *
+ * Returns: The length field of @packet.
+ */
+guint16
+gst_rtcp_packet_get_length (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type != GST_RTCP_TYPE_INVALID, 0);
+
+ return packet->length;
+}
+
+/**
+ * gst_rtcp_packet_sr_get_sender_info:
+ * @packet: a valid SR #GstRTCPPacket
+ * @ssrc: result SSRC
+ * @ntptime: result NTP time
+ * @rtptime: result RTP time
+ * @packet_count: result packet count
+ * @octet_count: result octect count
+ *
+ * Parse the SR sender info and store the values.
+ */
+void
+gst_rtcp_packet_sr_get_sender_info (GstRTCPPacket * packet, guint32 * ssrc,
+ guint64 * ntptime, guint32 * rtptime, guint32 * packet_count,
+ guint32 * octet_count)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_SR);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ if (ssrc)
+ *ssrc = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (ntptime)
+ *ntptime = GST_READ_UINT64_BE (data);
+ data += 8;
+ if (rtptime)
+ *rtptime = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (packet_count)
+ *packet_count = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (octet_count)
+ *octet_count = GST_READ_UINT32_BE (data);
+}
+
+/**
+ * gst_rtcp_packet_sr_set_sender_info:
+ * @packet: a valid SR #GstRTCPPacket
+ * @ssrc: the SSRC
+ * @ntptime: the NTP time
+ * @rtptime: the RTP time
+ * @packet_count: the packet count
+ * @octet_count: the octect count
+ *
+ * Set the given values in the SR packet @packet.
+ */
+void
+gst_rtcp_packet_sr_set_sender_info (GstRTCPPacket * packet, guint32 ssrc,
+ guint64 ntptime, guint32 rtptime, guint32 packet_count, guint32 octet_count)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_SR);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ GST_WRITE_UINT32_BE (data, ssrc);
+ data += 4;
+ GST_WRITE_UINT64_BE (data, ntptime);
+ data += 8;
+ GST_WRITE_UINT32_BE (data, rtptime);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, packet_count);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, octet_count);
+}
+
+/**
+ * gst_rtcp_packet_rr_get_ssrc:
+ * @packet: a valid RR #GstRTCPPacket
+ *
+ * Get the ssrc field of the RR @packet.
+ *
+ * Returns: the ssrc.
+ */
+guint32
+gst_rtcp_packet_rr_get_ssrc (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint32 ssrc;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RR, 0);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ ssrc = GST_READ_UINT32_BE (data);
+
+ return ssrc;
+}
+
+/**
+ * gst_rtcp_packet_rr_set_ssrc:
+ * @packet: a valid RR #GstRTCPPacket
+ * @ssrc: the SSRC to set
+ *
+ * Set the ssrc field of the RR @packet.
+ */
+void
+gst_rtcp_packet_rr_set_ssrc (GstRTCPPacket * packet, guint32 ssrc)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RR);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ GST_WRITE_UINT32_BE (data, ssrc);
+}
+
+/**
+ * gst_rtcp_packet_get_rb_count:
+ * @packet: a valid SR or RR #GstRTCPPacket
+ *
+ * Get the number of report blocks in @packet.
+ *
+ * Returns: The number of report blocks in @packet.
+ */
+guint
+gst_rtcp_packet_get_rb_count (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RR ||
+ packet->type == GST_RTCP_TYPE_SR, 0);
+
+ return packet->count;
+}
+
+/**
+ * gst_rtcp_packet_get_rb:
+ * @packet: a valid SR or RR #GstRTCPPacket
+ * @nth: the nth report block in @packet
+ * @ssrc: result for data source being reported
+ * @fractionlost: result for fraction lost since last SR/RR
+ * @packetslost: result for the cumululative number of packets lost
+ * @exthighestseq: result for the extended last sequence number received
+ * @jitter: result for the interarrival jitter
+ * @lsr: result for the last SR packet from this source
+ * @dlsr: result for the delay since last SR packet
+ *
+ * Parse the values of the @nth report block in @packet and store the result in
+ * the values.
+ */
+void
+gst_rtcp_packet_get_rb (GstRTCPPacket * packet, guint nth, guint32 * ssrc,
+ guint8 * fractionlost, gint32 * packetslost, guint32 * exthighestseq,
+ guint32 * jitter, guint32 * lsr, guint32 * dlsr)
+{
+ guint8 *data;
+ guint32 tmp;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RR ||
+ packet->type == GST_RTCP_TYPE_SR);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ if (packet->type == GST_RTCP_TYPE_RR)
+ data += 4;
+ else
+ data += 24;
+
+ /* move to requested index */
+ data += (nth * 24);
+
+ if (ssrc)
+ *ssrc = GST_READ_UINT32_BE (data);
+ data += 4;
+ tmp = GST_READ_UINT32_BE (data);
+ if (fractionlost)
+ *fractionlost = (tmp >> 24);
+ if (packetslost) {
+ /* sign extend */
+ if (tmp & 0x00800000)
+ tmp |= 0xff000000;
+ else
+ tmp &= 0x00ffffff;
+ *packetslost = (gint32) tmp;
+ }
+ data += 4;
+ if (exthighestseq)
+ *exthighestseq = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (jitter)
+ *jitter = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (lsr)
+ *lsr = GST_READ_UINT32_BE (data);
+ data += 4;
+ if (dlsr)
+ *dlsr = GST_READ_UINT32_BE (data);
+}
+
+/**
+ * gst_rtcp_packet_add_rb:
+ * @packet: a valid SR or RR #GstRTCPPacket
+ * @ssrc: data source being reported
+ * @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
+ *
+ * Add a new report block to @packet with the given values.
+ *
+ * Returns: %TRUE if the packet was created. This function can return %FALSE if
+ * the max MTU is exceeded or the number of report blocks is greater than
+ * #GST_RTCP_MAX_RB_COUNT.
+ */
+gboolean
+gst_rtcp_packet_add_rb (GstRTCPPacket * packet, guint32 ssrc,
+ guint8 fractionlost, gint32 packetslost, guint32 exthighestseq,
+ guint32 jitter, guint32 lsr, guint32 dlsr)
+{
+ guint8 *data;
+ guint size, offset;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RR ||
+ packet->type == GST_RTCP_TYPE_SR, FALSE);
+
+ if (packet->count >= GST_RTCP_MAX_RB_COUNT)
+ goto no_space;
+
+ data = packet->rtcp->data;
+ size = packet->rtcp->size;
+
+ /* skip header */
+ offset = packet->offset + 4;
+ if (packet->type == GST_RTCP_TYPE_RR)
+ offset += 4;
+ else
+ offset += 24;
+
+ /* move to current index */
+ offset += (packet->count * 24);
+
+ /* we need 24 free bytes now */
+ if (offset + 24 >= size)
+ goto no_space;
+
+ /* increment packet count and length */
+ packet->count++;
+ data[packet->offset]++;
+ packet->length += 6;
+ data[packet->offset + 2] = (packet->length) >> 8;
+ data[packet->offset + 3] = (packet->length) & 0xff;
+
+ /* move to new report block offset */
+ data += offset;
+
+ GST_WRITE_UINT32_BE (data, ssrc);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, (fractionlost << 24) | (packetslost & 0xffffff));
+ data += 4;
+ GST_WRITE_UINT32_BE (data, exthighestseq);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, jitter);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, lsr);
+ data += 4;
+ GST_WRITE_UINT32_BE (data, dlsr);
+
+ return TRUE;
+
+no_space:
+ {
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_set_rb:
+ * @packet: a valid SR or RR #GstRTCPPacket
+ * @nth: the nth report block to set
+ * @ssrc: data source being reported
+ * @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
+ *
+ * Set the @nth new report block in @packet with the given values.
+ *
+ * Note: Not implemented.
+ */
+void
+gst_rtcp_packet_set_rb (GstRTCPPacket * packet, guint nth, guint32 ssrc,
+ guint8 fractionlost, gint32 packetslost, guint32 exthighestseq,
+ guint32 jitter, guint32 lsr, guint32 dlsr)
+{
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RR ||
+ packet->type == GST_RTCP_TYPE_SR);
+
+ g_warning ("not implemented");
+}
+
+
+/**
+ * gst_rtcp_packet_sdes_get_item_count:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Get the number of items in the SDES packet @packet.
+ *
+ * Returns: The number of items in @packet.
+ */
+guint
+gst_rtcp_packet_sdes_get_item_count (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, 0);
+
+ return packet->count;
+}
+
+/**
+ * gst_rtcp_packet_sdes_first_item:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Move to the first SDES item in @packet.
+ *
+ * Returns: TRUE if there was a first item.
+ */
+gboolean
+gst_rtcp_packet_sdes_first_item (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ packet->item_offset = 4;
+ packet->item_count = 0;
+ packet->entry_offset = 4;
+
+ if (packet->count == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_next_item:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Move to the next SDES item in @packet.
+ *
+ * Returns: TRUE if there was a next item.
+ */
+gboolean
+gst_rtcp_packet_sdes_next_item (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint offset;
+ guint len;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* if we are at the last item, we are done */
+ if (packet->item_count == packet->count)
+ return FALSE;
+
+ /* move to SDES */
+ data = packet->rtcp->data;
+ data += packet->offset;
+ /* move to item */
+ offset = packet->item_offset;
+ /* skip SSRC */
+ offset += 4;
+
+ /* don't overrun */
+ len = (packet->length << 2);
+
+ while (offset < len) {
+ if (data[offset] == 0) {
+ /* end of list, round to next 32-bit word */
+ offset = (offset + 4) & ~3;
+ break;
+ }
+ offset += data[offset + 1] + 2;
+ }
+ if (offset >= len)
+ return FALSE;
+
+ packet->item_offset = offset;
+ packet->item_count++;
+ packet->entry_offset = 4;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_get_ssrc:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Get the SSRC of the current SDES item.
+ *
+ * Returns: the SSRC of the current item.
+ */
+guint32
+gst_rtcp_packet_sdes_get_ssrc (GstRTCPPacket * packet)
+{
+ guint32 ssrc;
+ guint8 *data;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, 0);
+
+ /* move to SDES */
+ data = packet->rtcp->data;
+ data += packet->offset;
+ /* move to item */
+ data += packet->item_offset;
+
+ ssrc = GST_READ_UINT32_BE (data);
+
+ return ssrc;
+}
+
+/**
+ * gst_rtcp_packet_sdes_first_entry:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Move to the first SDES entry in the current item.
+ *
+ * Returns: %TRUE if there was a first entry.
+ */
+gboolean
+gst_rtcp_packet_sdes_first_entry (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint len, offset;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* move to SDES */
+ data = packet->rtcp->data;
+ data += packet->offset;
+ /* move to item */
+ offset = packet->item_offset;
+ /* skip SSRC */
+ offset += 4;
+
+ packet->entry_offset = 4;
+
+ /* don't overrun */
+ len = (packet->length << 2);
+ if (offset >= len)
+ return FALSE;
+
+ if (data[offset] == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_next_entry:
+ * @packet: a valid SDES #GstRTCPPacket
+ *
+ * Move to the next SDES entry in the current item.
+ *
+ * Returns: %TRUE if there was a next entry.
+ */
+gboolean
+gst_rtcp_packet_sdes_next_entry (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint len, offset, item_len;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* move to SDES */
+ data = packet->rtcp->data;
+ data += packet->offset;
+ /* move to item */
+ offset = packet->item_offset;
+ /* move to entry */
+ offset += packet->entry_offset;
+
+ item_len = data[offset + 1] + 2;
+ /* skip item */
+ offset += item_len;
+
+ /* don't overrun */
+ len = (packet->length << 2);
+ if (offset >= len)
+ return FALSE;
+
+ packet->entry_offset += item_len;
+
+ /* check for end of list */
+ if (data[offset] == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_get_entry:
+ * @packet: a valid SDES #GstRTCPPacket
+ * @type: result of the entry type
+ * @len: result length of the entry data
+ * @data: result entry data
+ *
+ * Get the data of the current SDES item entry. @type (when not NULL) will
+ * contain the type of the entry. @data (when not NULL) will point to @len
+ * bytes.
+ *
+ * When @type refers to a text item, @data will point to a UTF8 string. Note
+ * that this UTF8 string is NOT null-terminated. Use
+ * gst_rtcp_packet_sdes_copy_entry() to get a null-termined copy of the entry.
+ *
+ * Returns: %TRUE if there was valid data.
+ */
+gboolean
+gst_rtcp_packet_sdes_get_entry (GstRTCPPacket * packet,
+ GstRTCPSDESType * type, guint8 * len, guint8 ** data)
+{
+ guint8 *bdata;
+ guint offset;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* move to SDES */
+ bdata = packet->rtcp->data;
+ bdata += packet->offset;
+ /* move to item */
+ offset = packet->item_offset;
+ /* move to entry */
+ offset += packet->entry_offset;
+
+ if (bdata[offset] == 0)
+ return FALSE;
+
+ if (type)
+ *type = bdata[offset];
+ if (len)
+ *len = bdata[offset + 1];
+ if (data)
+ *data = &bdata[offset + 2];
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_copy_entry:
+ * @packet: a valid SDES #GstRTCPPacket
+ * @type: result of the entry type
+ * @len: result length of the entry data
+ * @data: result entry data
+ *
+ * This function is like gst_rtcp_packet_sdes_get_entry() but it returns a
+ * null-terminated copy of the data instead. use g_free() after usage.
+ *
+ * Returns: %TRUE if there was valid data.
+ */
+gboolean
+gst_rtcp_packet_sdes_copy_entry (GstRTCPPacket * packet,
+ GstRTCPSDESType * type, guint8 * len, guint8 ** data)
+{
+ guint8 *tdata;
+ guint8 tlen;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ if (!gst_rtcp_packet_sdes_get_entry (packet, type, &tlen, &tdata))
+ return FALSE;
+
+ if (len)
+ *len = tlen;
+ if (data)
+ *data = (guint8 *) g_strndup ((gchar *) tdata, tlen);
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_sdes_add_item:
+ * @packet: a valid SDES #GstRTCPPacket
+ * @ssrc: the SSRC of the new item to add
+ *
+ * Add a new SDES item for @ssrc to @packet.
+ *
+ * Returns: %TRUE if the item could be added, %FALSE if the maximum amount of
+ * items has been exceeded for the SDES packet or the MTU has been reached.
+ */
+gboolean
+gst_rtcp_packet_sdes_add_item (GstRTCPPacket * packet, guint32 ssrc)
+{
+ guint8 *data;
+ guint offset, size;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* increment item count when possible */
+ if (packet->count >= GST_RTCP_MAX_SDES_ITEM_COUNT)
+ goto no_space;
+
+ /* pretend there is a next packet for the next call */
+ packet->count++;
+
+ /* jump over current item */
+ gst_rtcp_packet_sdes_next_item (packet);
+
+ /* move to SDES */
+ data = packet->rtcp->data;
+ size = packet->rtcp->size;
+ data += packet->offset;
+ /* move to current item */
+ offset = packet->item_offset;
+
+ /* we need 2 free words now */
+ if (offset + 8 >= size)
+ goto no_next;
+
+ /* write SSRC */
+ GST_WRITE_UINT32_BE (&data[offset], ssrc);
+ /* write 0 entry with padding */
+ GST_WRITE_UINT32_BE (&data[offset + 4], 0);
+
+ /* update count */
+ data[0] = (data[0] & 0xe0) | packet->count;
+ /* update length, we added 2 words */
+ packet->length += 2;
+ data[2] = (packet->length) >> 8;
+ data[3] = (packet->length) & 0xff;
+
+ return TRUE;
+
+ /* ERRORS */
+no_space:
+ {
+ return FALSE;
+ }
+no_next:
+ {
+ packet->count--;
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_sdes_add_entry:
+ * @packet: a valid SDES #GstRTCPPacket
+ * @type: the #GstRTCPSDESType of the SDES entry
+ * @len: the data length
+ * @data: the data
+ *
+ * Add a new SDES entry to the current item in @packet.
+ *
+ * Returns: %TRUE if the item could be added, %FALSE if the MTU has been
+ * reached.
+ */
+gboolean
+gst_rtcp_packet_sdes_add_entry (GstRTCPPacket * packet, GstRTCPSDESType type,
+ guint8 len, const guint8 * data)
+{
+ guint8 *bdata;
+ guint offset, size, padded;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_SDES, FALSE);
+
+ /* move to SDES */
+ bdata = packet->rtcp->data;
+ size = packet->rtcp->size;
+ bdata += packet->offset;
+ /* move to item */
+ offset = packet->item_offset;
+ /* move to entry */
+ offset += packet->entry_offset;
+
+ /* add 1 byte end and up to 3 bytes padding to fill a full 32 bit word */
+ padded = (offset + 2 + len + 1 + 3) & ~3;
+
+ /* we need enough space for type, len, data and padding */
+ if (packet->offset + padded >= size)
+ goto no_space;
+
+ bdata[offset] = type;
+ bdata[offset + 1] = len;
+ memcpy (&bdata[offset + 2], data, len);
+ bdata[offset + 2 + len] = 0;
+
+ /* calculate new packet length */
+ packet->length = (padded - 4) >> 2;
+ bdata[2] = (packet->length) >> 8;
+ bdata[3] = (packet->length) & 0xff;
+
+ /* position to new next entry */
+ packet->entry_offset += 2 + len;
+
+ return TRUE;
+
+ /* ERRORS */
+no_space:
+ {
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_bye_get_ssrc_count:
+ * @packet: a valid BYE #GstRTCPPacket
+ *
+ * Get the number of SSRC fields in @packet.
+ *
+ * Returns: The number of SSRC fields in @packet.
+ */
+guint
+gst_rtcp_packet_bye_get_ssrc_count (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, -1);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, -1);
+
+ return packet->count;
+}
+
+/**
+ * gst_rtcp_packet_bye_get_nth_ssrc:
+ * @packet: a valid BYE #GstRTCPPacket
+ * @nth: the nth SSRC to get
+ *
+ * Get the @nth SSRC of the BYE @packet.
+ *
+ * Returns: The @nth SSRC of @packet.
+ */
+guint32
+gst_rtcp_packet_bye_get_nth_ssrc (GstRTCPPacket * packet, guint nth)
+{
+ guint8 *data;
+ guint offset;
+ guint32 ssrc;
+ guint8 sc;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, 0);
+
+ /* get amount of sources and check that we don't read too much */
+ sc = packet->count;
+ if (nth >= sc)
+ return 0;
+
+ /* get offset in 32-bits words into packet, skip the header */
+ offset = 1 + nth;
+ /* check that we don't go past the packet length */
+ if (offset > packet->length)
+ return 0;
+
+ /* scale to bytes */
+ offset <<= 2;
+ offset += packet->offset;
+
+ /* check if the packet is valid */
+ if (offset + 4 > packet->rtcp->size)
+ return 0;
+
+ data = packet->rtcp->data;
+ data += offset;
+
+ ssrc = GST_READ_UINT32_BE (data);
+
+ return ssrc;
+}
+
+/**
+ * gst_rtcp_packet_bye_add_ssrc:
+ * @packet: a valid BYE #GstRTCPPacket
+ * @ssrc: an SSRC to add
+ *
+ * Add @ssrc to the BYE @packet.
+ *
+ * Returns: %TRUE if the ssrc was added. This function can return %FALSE if
+ * the max MTU is exceeded or the number of sources blocks is greater than
+ * #GST_RTCP_MAX_BYE_SSRC_COUNT.
+ */
+gboolean
+gst_rtcp_packet_bye_add_ssrc (GstRTCPPacket * packet, guint32 ssrc)
+{
+ guint8 *data;
+ guint size, offset;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, FALSE);
+
+ if (packet->count >= GST_RTCP_MAX_BYE_SSRC_COUNT)
+ goto no_space;
+
+ data = packet->rtcp->data;
+ size = packet->rtcp->size;
+
+ /* skip header */
+ offset = packet->offset + 4;
+
+ /* move to current index */
+ offset += (packet->count * 4);
+
+ if (offset + 4 >= size)
+ goto no_space;
+
+ /* increment packet count and length */
+ packet->count++;
+ data[packet->offset]++;
+ packet->length += 1;
+ data[packet->offset + 2] = (packet->length) >> 8;
+ data[packet->offset + 3] = (packet->length) & 0xff;
+
+ /* move to new SSRC offset and write ssrc */
+ data += offset;
+ GST_WRITE_UINT32_BE (data, ssrc);
+
+ return TRUE;
+
+ /* ERRORS */
+no_space:
+ {
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_bye_add_ssrcs:
+ * @packet: a valid BYE #GstRTCPPacket
+ * @ssrc: an array of SSRCs to add
+ * @len: number of elements in @ssrc
+ *
+ * Adds @len SSRCs in @ssrc to BYE @packet.
+ *
+ * Returns: %TRUE if the all the SSRCs were added. This function can return %FALSE if
+ * the max MTU is exceeded or the number of sources blocks is greater than
+ * #GST_RTCP_MAX_BYE_SSRC_COUNT.
+ */
+gboolean
+gst_rtcp_packet_bye_add_ssrcs (GstRTCPPacket * packet, guint32 * ssrc,
+ guint len)
+{
+ guint i;
+ gboolean res;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, FALSE);
+
+ res = TRUE;
+ for (i = 0; i < len && res; i++) {
+ res = gst_rtcp_packet_bye_add_ssrc (packet, ssrc[i]);
+ }
+ return res;
+}
+
+/* get the offset in packet of the reason length */
+static guint
+get_reason_offset (GstRTCPPacket * packet)
+{
+ guint offset;
+
+ /* get amount of sources plus header */
+ offset = 1 + packet->count;
+
+ /* check that we don't go past the packet length */
+ if (offset > packet->length)
+ return 0;
+
+ /* scale to bytes */
+ offset <<= 2;
+ offset += packet->offset;
+
+ /* check if the packet is valid */
+ if (offset + 1 > packet->rtcp->size)
+ return 0;
+
+ return offset;
+}
+
+/**
+ * gst_rtcp_packet_bye_get_reason_len:
+ * @packet: a valid BYE #GstRTCPPacket
+ *
+ * Get the length of the reason string.
+ *
+ * Returns: The length of the reason string or 0 when there is no reason string
+ * present.
+ */
+guint8
+gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint roffset;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, 0);
+
+ roffset = get_reason_offset (packet);
+ if (roffset == 0)
+ return 0;
+
+ data = packet->rtcp->data;
+
+ return data[roffset];
+}
+
+/**
+ * gst_rtcp_packet_bye_get_reason:
+ * @packet: a valid BYE #GstRTCPPacket
+ *
+ * Get the reason in @packet.
+ *
+ * Returns: The reason for the BYE @packet or NULL if the packet did not contain
+ * a reason string. The string must be freed with g_free() after usage.
+ */
+gchar *
+gst_rtcp_packet_bye_get_reason (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint roffset;
+ guint8 len;
+
+ g_return_val_if_fail (packet != NULL, NULL);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, NULL);
+
+ roffset = get_reason_offset (packet);
+ if (roffset == 0)
+ return NULL;
+
+ data = packet->rtcp->data;
+
+ /* get length of reason string */
+ len = data[roffset];
+ if (len == 0)
+ return NULL;
+
+ /* move to string */
+ roffset += 1;
+
+ /* check if enough data to copy */
+ if (roffset + len > packet->rtcp->size)
+ return NULL;
+
+ return g_strndup ((gconstpointer) (data + roffset), len);
+}
+
+/**
+ * gst_rtcp_packet_bye_set_reason:
+ * @packet: a valid BYE #GstRTCPPacket
+ * @reason: a reason string
+ *
+ * Set the reason string to @reason in @packet.
+ *
+ * Returns: TRUE if the string could be set.
+ */
+gboolean
+gst_rtcp_packet_bye_set_reason (GstRTCPPacket * packet, const gchar * reason)
+{
+ guint8 *data;
+ guint roffset, size;
+ guint8 len, padded;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_BYE, FALSE);
+
+ if (reason == NULL)
+ return TRUE;
+
+ len = strlen (reason);
+ if (len == 0)
+ return TRUE;
+
+ /* make room for the string before we get the offset */
+ packet->length++;
+
+ roffset = get_reason_offset (packet);
+ if (roffset == 0)
+ goto no_space;
+
+ data = packet->rtcp->data;
+ size = packet->rtcp->size;
+
+ /* we have 1 byte length and we need to pad to 4 bytes */
+ padded = ((len + 1) + 3) & ~3;
+
+ /* we need enough space for the padded length */
+ if (roffset + padded >= size)
+ goto no_space;
+
+ data[roffset] = len;
+ memcpy (&data[roffset + 1], reason, len);
+
+ /* update packet length, we made room for 1 double word already */
+ packet->length += (padded >> 2) - 1;
+ data[packet->offset + 2] = (packet->length) >> 8;
+ data[packet->offset + 3] = (packet->length) & 0xff;
+
+ return TRUE;
+
+ /* ERRORS */
+no_space:
+ {
+ packet->length--;
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtcp_packet_fb_get_sender_ssrc:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ *
+ * Get the sender SSRC field of the RTPFB or PSFB @packet.
+ *
+ * Returns: the sender SSRC.
+ *
+ * Since: 0.10.23
+ */
+guint32
+gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint32 ssrc;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail ((packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB), 0);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ ssrc = GST_READ_UINT32_BE (data);
+
+ return ssrc;
+}
+
+/**
+ * gst_rtcp_packet_fb_set_sender_ssrc:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ * @ssrc: a sender SSRC
+ *
+ * Set the sender SSRC field of the RTPFB or PSFB @packet.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket * packet, guint32 ssrc)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB);
+
+ data = packet->rtcp->data;
+
+ /* skip header */
+ data += packet->offset + 4;
+ GST_WRITE_UINT32_BE (data, ssrc);
+}
+
+/**
+ * gst_rtcp_packet_fb_get_media_ssrc:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ *
+ * Get the media SSRC field of the RTPFB or PSFB @packet.
+ *
+ * Returns: the media SSRC.
+ *
+ * Since: 0.10.23
+ */
+guint32
+gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket * packet)
+{
+ guint8 *data;
+ guint32 ssrc;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail ((packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB), 0);
+
+ data = packet->rtcp->data;
+
+ /* skip header and sender ssrc */
+ data += packet->offset + 8;
+ ssrc = GST_READ_UINT32_BE (data);
+
+ return ssrc;
+}
+
+/**
+ * gst_rtcp_packet_fb_set_media_ssrc:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ * @ssrc: a media SSRC
+ *
+ * Set the media SSRC field of the RTPFB or PSFB @packet.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket * packet, guint32 ssrc)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB);
+
+ data = packet->rtcp->data;
+
+ /* skip header and sender ssrc */
+ data += packet->offset + 8;
+ GST_WRITE_UINT32_BE (data, ssrc);
+}
+
+/**
+ * gst_rtcp_packet_fb_get_type:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ *
+ * Get the feedback message type of the FB @packet.
+ *
+ * Returns: The feedback message type.
+ *
+ * Since: 0.10.23
+ */
+GstRTCPFBType
+gst_rtcp_packet_fb_get_type (GstRTCPPacket * packet)
+{
+ g_return_val_if_fail (packet != NULL, GST_RTCP_FB_TYPE_INVALID);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB, GST_RTCP_FB_TYPE_INVALID);
+
+ return packet->count;
+}
+
+/**
+ * gst_rtcp_packet_fb_set_type:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ * @type: the #GstRTCPFBType to set
+ *
+ * Set the feedback message type of the FB @packet.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtcp_packet_fb_set_type (GstRTCPPacket * packet, GstRTCPFBType type)
+{
+ guint8 *data;
+
+ g_return_if_fail (packet != NULL);
+ g_return_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB);
+
+ data = packet->rtcp->data;
+
+ data[packet->offset] = (data[packet->offset] & 0xe0) | type;
+ packet->count = type;
+}
+
+/**
+ * gst_rtcp_ntp_to_unix:
+ * @ntptime: an NTP timestamp
+ *
+ * Converts an NTP time to UNIX nanoseconds. @ntptime can typically be
+ * the NTP time of an SR RTCP message and contains, in the upper 32 bits, the
+ * number of seconds since 1900 and, in the lower 32 bits, the fractional
+ * seconds. The resulting value will be the number of nanoseconds since 1970.
+ *
+ * Returns: the UNIX time for @ntptime in nanoseconds.
+ */
+guint64
+gst_rtcp_ntp_to_unix (guint64 ntptime)
+{
+ guint64 unixtime;
+
+ /* conversion from NTP timestamp (seconds since 1900) to seconds since
+ * 1970. */
+ unixtime = ntptime - (G_GUINT64_CONSTANT (2208988800) << 32);
+ /* conversion to nanoseconds */
+ unixtime =
+ gst_util_uint64_scale (unixtime, GST_SECOND,
+ (G_GINT64_CONSTANT (1) << 32));
+
+ return unixtime;
+}
+
+/**
+ * gst_rtcp_unix_to_ntp:
+ * @unixtime: an UNIX timestamp in nanoseconds
+ *
+ * Converts a UNIX timestamp in nanoseconds to an NTP time. The caller should
+ * pass a value with nanoseconds since 1970. The NTP time will, in the upper
+ * 32 bits, contain the number of seconds since 1900 and, in the lower 32
+ * bits, the fractional seconds. The resulting value can be used as an ntptime
+ * for constructing SR RTCP packets.
+ *
+ * Returns: the NTP time for @unixtime.
+ */
+guint64
+gst_rtcp_unix_to_ntp (guint64 unixtime)
+{
+ guint64 ntptime;
+
+ /* convert clock time to NTP time. upper 32 bits should contain the seconds
+ * and the lower 32 bits, the fractions of a second. */
+ ntptime =
+ gst_util_uint64_scale (unixtime, (G_GINT64_CONSTANT (1) << 32),
+ GST_SECOND);
+ /* conversion from UNIX timestamp (seconds since 1970) to NTP (seconds
+ * since 1900). */
+ ntptime += (G_GUINT64_CONSTANT (2208988800) << 32);
+
+ return ntptime;
+}
+
+/**
+ * gst_rtcp_sdes_type_to_name:
+ * @type: a #GstRTCPSDESType
+ *
+ * Converts @type to the string equivalent. The string is typically used as a
+ * key in a #GstStructure containing SDES items.
+ *
+ * Returns: the string equivalent of @type
+ *
+ * Since: 0.10.26
+ */
+const gchar *
+gst_rtcp_sdes_type_to_name (GstRTCPSDESType type)
+{
+ const gchar *result;
+
+ switch (type) {
+ case GST_RTCP_SDES_CNAME:
+ result = "cname";
+ break;
+ case GST_RTCP_SDES_NAME:
+ result = "name";
+ break;
+ case GST_RTCP_SDES_EMAIL:
+ result = "email";
+ break;
+ case GST_RTCP_SDES_PHONE:
+ result = "phone";
+ break;
+ case GST_RTCP_SDES_LOC:
+ result = "location";
+ break;
+ case GST_RTCP_SDES_TOOL:
+ result = "tool";
+ break;
+ case GST_RTCP_SDES_NOTE:
+ result = "note";
+ break;
+ case GST_RTCP_SDES_PRIV:
+ result = "priv";
+ break;
+ default:
+ result = NULL;
+ break;
+ }
+ return result;
+}
+
+/**
+ * gst_rtcp_sdes_name_to_type:
+ * @name: a SDES name
+ *
+ * Convert @name into a @GstRTCPSDESType. @name is typically a key in a
+ * #GstStructure containing SDES items.
+ *
+ * Returns: the #GstRTCPSDESType for @name or #GST_RTCP_SDES_PRIV when @name
+ * is a private sdes item.
+ *
+ * Since: 0.10.26
+ */
+GstRTCPSDESType
+gst_rtcp_sdes_name_to_type (const gchar * name)
+{
+ if (name == NULL || strlen (name) == 0)
+ return GST_RTCP_SDES_INVALID;
+
+ if (strcmp ("cname", name) == 0)
+ return GST_RTCP_SDES_CNAME;
+
+ if (strcmp ("name", name) == 0)
+ return GST_RTCP_SDES_NAME;
+
+ if (strcmp ("email", name) == 0)
+ return GST_RTCP_SDES_EMAIL;
+
+ if (strcmp ("phone", name) == 0)
+ return GST_RTCP_SDES_PHONE;
+
+ if (strcmp ("location", name) == 0)
+ return GST_RTCP_SDES_LOC;
+
+ if (strcmp ("tool", name) == 0)
+ return GST_RTCP_SDES_TOOL;
+
+ if (strcmp ("note", name) == 0)
+ return GST_RTCP_SDES_NOTE;
+
+ return GST_RTCP_SDES_PRIV;
+}
+
+/**
+ * gst_rtcp_packet_fb_get_fci_length:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ *
+ * Get the length of the Feedback Control Information attached to a
+ * RTPFB or PSFB @packet.
+ *
+ * Returns: The length of the FCI in 32-bit words.
+ *
+ * Since: 0.10.31
+ */
+guint16
+gst_rtcp_packet_fb_get_fci_length (GstRTCPPacket * packet)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (packet != NULL, 0);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB, 0);
+
+ data = packet->rtcp->data + packet->offset + 2;
+
+ return GST_READ_UINT16_BE (data) - 2;
+}
+
+/**
+ * gst_rtcp_packet_fb_set_fci_length:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ * @wordlen: Length of the FCI in 32-bit words
+ *
+ * Set the length of the Feedback Control Information attached to a
+ * RTPFB or PSFB @packet.
+ *
+ * Returns: %TRUE if there was enough space in the packet to add this much FCI
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_rtcp_packet_fb_set_fci_length (GstRTCPPacket * packet, guint16 wordlen)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (packet != NULL, FALSE);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB, FALSE);
+
+ if (packet->rtcp->size < packet->offset + ((wordlen + 3) * 4))
+ return FALSE;
+
+ data = packet->rtcp->data + packet->offset + 2;
+ wordlen += 2;
+ GST_WRITE_UINT16_BE (data, wordlen);
+
+ return TRUE;
+}
+
+/**
+ * gst_rtcp_packet_fb_get_fci:
+ * @packet: a valid RTPFB or PSFB #GstRTCPPacket
+ *
+ * Get the Feedback Control Information attached to a RTPFB or PSFB @packet.
+ *
+ * Returns: a pointer to the FCI
+ *
+ * Since: 0.10.31
+ */
+guint8 *
+gst_rtcp_packet_fb_get_fci (GstRTCPPacket * packet)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (packet != NULL, NULL);
+ g_return_val_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
+ packet->type == GST_RTCP_TYPE_PSFB, NULL);
+
+ data = packet->rtcp->data + packet->offset;
+
+ if (GST_READ_UINT16_BE (data + 2) <= 2)
+ return NULL;
+
+ return data + 12;
+}
diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.h b/gst-libs/gst/rtp/gstrtcpbuffer.h
new file mode 100644
index 0000000..a9a547d
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtcpbuffer.h
@@ -0,0 +1,299 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim@fluendo.com>
+ *
+ * gstrtcpbuffer.h: various helper functions to manipulate buffers
+ * with RTCP payload.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RTCPBUFFER_H__
+#define __GST_RTCPBUFFER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_RTCP_VERSION:
+ *
+ * The supported RTCP version 2.
+ */
+#define GST_RTCP_VERSION 2
+
+/**
+ * GstRTCPType:
+ * @GST_RTCP_TYPE_INVALID: Invalid type
+ * @GST_RTCP_TYPE_SR: Sender report
+ * @GST_RTCP_TYPE_RR: Receiver report
+ * @GST_RTCP_TYPE_SDES: Source description
+ * @GST_RTCP_TYPE_BYE: Goodbye
+ * @GST_RTCP_TYPE_APP: Application defined
+ * @GST_RTCP_TYPE_RTPFB: Transport layer feedback. Since: 0.10.23
+ * @GST_RTCP_TYPE_PSFB: Payload-specific feedback. Since: 0.10.23
+ *
+ * Different RTCP packet types.
+ */
+typedef enum
+{
+ GST_RTCP_TYPE_INVALID = 0,
+ GST_RTCP_TYPE_SR = 200,
+ GST_RTCP_TYPE_RR = 201,
+ GST_RTCP_TYPE_SDES = 202,
+ GST_RTCP_TYPE_BYE = 203,
+ GST_RTCP_TYPE_APP = 204,
+ GST_RTCP_TYPE_RTPFB = 205,
+ GST_RTCP_TYPE_PSFB = 206
+} GstRTCPType;
+
+/**
+ * GstRTCPFBType:
+ * @GST_RTCP_FB_TYPE_INVALID: Invalid type
+ * @GST_RTCP_RTPFB_TYPE_NACK: Generic NACK
+ * @GST_RTCP_PSFB_TYPE_PLI: Picture Loss Indication
+ * @GST_RTCP_PSFB_TYPE_SLI: Slice Loss Indication
+ * @GST_RTCP_PSFB_TYPE_RPSI: Reference Picture Selection Indication
+ * @GST_RTCP_PSFB_TYPE_AFB: Application layer Feedback
+ *
+ * Different types of feedback messages.
+ *
+ * Since: 0.10.23
+ */
+typedef enum
+{
+ /* generic */
+ GST_RTCP_FB_TYPE_INVALID = 0,
+ /* RTPFB types */
+ GST_RTCP_RTPFB_TYPE_NACK = 1,
+ /* PSFB types */
+ GST_RTCP_PSFB_TYPE_PLI = 1,
+ GST_RTCP_PSFB_TYPE_SLI = 2,
+ GST_RTCP_PSFB_TYPE_RPSI = 3,
+ GST_RTCP_PSFB_TYPE_AFB = 15
+} GstRTCPFBType;
+
+/**
+ * GstRTCPSDESType:
+ * @GST_RTCP_SDES_INVALID: Invalid SDES entry
+ * @GST_RTCP_SDES_END: End of SDES list
+ * @GST_RTCP_SDES_CNAME: Canonical name
+ * @GST_RTCP_SDES_NAME: User name
+ * @GST_RTCP_SDES_EMAIL: User's electronic mail address
+ * @GST_RTCP_SDES_PHONE: User's phone number
+ * @GST_RTCP_SDES_LOC: Geographic user location
+ * @GST_RTCP_SDES_TOOL: Name of application or tool
+ * @GST_RTCP_SDES_NOTE: Notice about the source
+ * @GST_RTCP_SDES_PRIV: Private extensions
+ *
+ * Different types of SDES content.
+ */
+typedef enum
+{
+ GST_RTCP_SDES_INVALID = -1,
+ GST_RTCP_SDES_END = 0,
+ GST_RTCP_SDES_CNAME = 1,
+ GST_RTCP_SDES_NAME = 2,
+ GST_RTCP_SDES_EMAIL = 3,
+ GST_RTCP_SDES_PHONE = 4,
+ GST_RTCP_SDES_LOC = 5,
+ GST_RTCP_SDES_TOOL = 6,
+ GST_RTCP_SDES_NOTE = 7,
+ GST_RTCP_SDES_PRIV = 8
+} GstRTCPSDESType;
+
+/**
+ * GST_RTCP_MAX_SDES:
+ *
+ * The maximum text length for an SDES item.
+ */
+#define GST_RTCP_MAX_SDES 255
+
+/**
+ * GST_RTCP_MAX_RB_COUNT:
+ *
+ * The maximum amount of Receiver report blocks in RR and SR messages.
+ */
+#define GST_RTCP_MAX_RB_COUNT 31
+
+/**
+ * GST_RTCP_MAX_SDES_ITEM_COUNT:
+ *
+ * The maximum amount of SDES items.
+ */
+#define GST_RTCP_MAX_SDES_ITEM_COUNT 31
+
+/**
+ * GST_RTCP_MAX_BYE_SSRC_COUNT:
+ *
+ * The maximum amount of SSRCs in a BYE packet.
+ */
+#define GST_RTCP_MAX_BYE_SSRC_COUNT 31
+
+/**
+ * GST_RTCP_VALID_MASK:
+ *
+ * Mask for version, padding bit and packet type pair
+ */
+#define GST_RTCP_VALID_MASK (0xc000 | 0x2000 | 0xfe)
+/**
+ * GST_RTCP_VALID_VALUE:
+ *
+ * Valid value for the first two bytes of an RTCP packet after applying
+ * #GST_RTCP_VALID_MASK to them.
+ */
+#define GST_RTCP_VALID_VALUE ((GST_RTCP_VERSION << 14) | GST_RTCP_TYPE_SR)
+
+typedef struct _GstRTCPBuffer GstRTCPBuffer;
+typedef struct _GstRTCPPacket GstRTCPPacket;
+
+struct _GstRTCPBuffer
+{
+ GstBuffer *buffer;
+
+ GstMapFlags flags;
+ guint8 *data;
+ gsize size;
+ gsize maxsize;
+};
+
+/**
+ * GstRTCPPacket:
+ * @buffer: pointer to RTCP buffer
+ * @offset: offset of packet in buffer data
+ *
+ * Data structure that points to a packet at @offset in @buffer.
+ * The size of the structure is made public to allow stack allocations.
+ */
+struct _GstRTCPPacket
+{
+ GstRTCPBuffer *rtcp;
+ guint offset;
+
+ /*< private >*/
+ gboolean padding; /* padding field of current packet */
+ guint8 count; /* count field of current packet */
+ GstRTCPType type; /* type of current packet */
+ guint16 length; /* length of current packet in 32-bits words */
+
+ guint item_offset; /* current item offset for navigating SDES */
+ guint item_count; /* current item count */
+ guint entry_offset; /* current entry offset for navigating SDES items */
+};
+
+/* creating buffers */
+GstBuffer* gst_rtcp_buffer_new_take_data (gpointer data, guint len);
+GstBuffer* gst_rtcp_buffer_new_copy_data (gpointer data, guint len);
+
+gboolean gst_rtcp_buffer_validate_data (guint8 *data, guint len);
+gboolean gst_rtcp_buffer_validate (GstBuffer *buffer);
+
+GstBuffer* gst_rtcp_buffer_new (guint mtu);
+
+gboolean gst_rtcp_buffer_map (GstBuffer *buffer, GstMapFlags flags, GstRTCPBuffer *rtcp);
+gboolean gst_rtcp_buffer_unmap (GstRTCPBuffer *rtcp);
+
+/* adding/retrieving packets */
+guint gst_rtcp_buffer_get_packet_count (GstRTCPBuffer *rtcp);
+gboolean gst_rtcp_buffer_get_first_packet (GstRTCPBuffer *rtcp, GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_move_to_next (GstRTCPPacket *packet);
+
+gboolean gst_rtcp_buffer_add_packet (GstRTCPBuffer *rtcp, GstRTCPType type,
+ GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_remove (GstRTCPPacket *packet);
+
+/* working with packets */
+gboolean gst_rtcp_packet_get_padding (GstRTCPPacket *packet);
+guint8 gst_rtcp_packet_get_count (GstRTCPPacket *packet);
+GstRTCPType gst_rtcp_packet_get_type (GstRTCPPacket *packet);
+guint16 gst_rtcp_packet_get_length (GstRTCPPacket *packet);
+
+
+/* sender reports */
+void gst_rtcp_packet_sr_get_sender_info (GstRTCPPacket *packet, guint32 *ssrc,
+ guint64 *ntptime, guint32 *rtptime,
+ guint32 *packet_count, guint32 *octet_count);
+void gst_rtcp_packet_sr_set_sender_info (GstRTCPPacket *packet, guint32 ssrc,
+ guint64 ntptime, guint32 rtptime,
+ guint32 packet_count, guint32 octet_count);
+/* receiver reports */
+guint32 gst_rtcp_packet_rr_get_ssrc (GstRTCPPacket *packet);
+void gst_rtcp_packet_rr_set_ssrc (GstRTCPPacket *packet, guint32 ssrc);
+
+
+/* report blocks for SR and RR */
+guint gst_rtcp_packet_get_rb_count (GstRTCPPacket *packet);
+void gst_rtcp_packet_get_rb (GstRTCPPacket *packet, guint nth, guint32 *ssrc,
+ guint8 *fractionlost, gint32 *packetslost,
+ guint32 *exthighestseq, guint32 *jitter,
+ guint32 *lsr, guint32 *dlsr);
+gboolean gst_rtcp_packet_add_rb (GstRTCPPacket *packet, guint32 ssrc,
+ guint8 fractionlost, gint32 packetslost,
+ guint32 exthighestseq, guint32 jitter,
+ guint32 lsr, guint32 dlsr);
+void gst_rtcp_packet_set_rb (GstRTCPPacket *packet, guint nth, guint32 ssrc,
+ guint8 fractionlost, gint32 packetslost,
+ guint32 exthighestseq, guint32 jitter,
+ guint32 lsr, guint32 dlsr);
+
+/* source description packet */
+guint gst_rtcp_packet_sdes_get_item_count (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_sdes_first_item (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_sdes_next_item (GstRTCPPacket *packet);
+guint32 gst_rtcp_packet_sdes_get_ssrc (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_sdes_first_entry (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_sdes_next_entry (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_sdes_get_entry (GstRTCPPacket *packet,
+ GstRTCPSDESType *type, guint8 *len,
+ guint8 **data);
+gboolean gst_rtcp_packet_sdes_copy_entry (GstRTCPPacket *packet,
+ GstRTCPSDESType *type, guint8 *len,
+ guint8 **data);
+
+gboolean gst_rtcp_packet_sdes_add_item (GstRTCPPacket *packet, guint32 ssrc);
+gboolean gst_rtcp_packet_sdes_add_entry (GstRTCPPacket *packet, GstRTCPSDESType type,
+ guint8 len, const guint8 *data);
+
+/* bye packet */
+guint gst_rtcp_packet_bye_get_ssrc_count (GstRTCPPacket *packet);
+guint32 gst_rtcp_packet_bye_get_nth_ssrc (GstRTCPPacket *packet, guint nth);
+gboolean gst_rtcp_packet_bye_add_ssrc (GstRTCPPacket *packet, guint32 ssrc);
+gboolean gst_rtcp_packet_bye_add_ssrcs (GstRTCPPacket *packet, guint32 *ssrc, guint len);
+guint8 gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket *packet);
+gchar* gst_rtcp_packet_bye_get_reason (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket *packet, const gchar *reason);
+
+/* feedback packets */
+guint32 gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket *packet);
+void gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket *packet, guint32 ssrc);
+guint32 gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket *packet);
+void gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket *packet, guint32 ssrc);
+GstRTCPFBType gst_rtcp_packet_fb_get_type (GstRTCPPacket *packet);
+void gst_rtcp_packet_fb_set_type (GstRTCPPacket *packet, GstRTCPFBType type);
+guint16 gst_rtcp_packet_fb_get_fci_length (GstRTCPPacket *packet);
+gboolean gst_rtcp_packet_fb_set_fci_length (GstRTCPPacket *packet, guint16 wordlen);
+guint8 * gst_rtcp_packet_fb_get_fci (GstRTCPPacket *packet);
+
+/* helper functions */
+guint64 gst_rtcp_ntp_to_unix (guint64 ntptime);
+guint64 gst_rtcp_unix_to_ntp (guint64 unixtime);
+
+const gchar * gst_rtcp_sdes_type_to_name (GstRTCPSDESType type);
+GstRTCPSDESType gst_rtcp_sdes_name_to_type (const gchar *name);
+
+G_END_DECLS
+
+#endif /* __GST_RTCPBUFFER_H__ */
+
diff --git a/gst-libs/gst/rtp/gstrtpbuffer.c b/gst-libs/gst/rtp/gstrtpbuffer.c
new file mode 100644
index 0000000..0b1f916
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtpbuffer.c
@@ -0,0 +1,1517 @@
+/* GStreamer
+ * Copyright (C) <2005> Philippe Khalaf <burger@speedy.org>
+ * 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.
+ */
+
+/**
+ * SECTION:gstrtpbuffer
+ * @short_description: Helper methods for dealing with RTP buffers
+ * @see_also: #GstBaseRTPPayload, #GstBaseRTPDepayload, gstrtcpbuffer
+ *
+ * <refsect2>
+ * <para>
+ * The GstRTPBuffer helper functions makes it easy to parse and create regular
+ * #GstBuffer objects that contain RTP payloads. These buffers are typically of
+ * 'application/x-rtp' #GstCaps.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2006-07-17 (0.10.10)
+ */
+
+#include "gstrtpbuffer.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#define GST_RTP_HEADER_LEN 12
+
+/* Note: we use bitfields here to make sure the compiler doesn't add padding
+ * between fields on certain architectures; can't assume aligned access either
+ */
+typedef struct _GstRTPHeader
+{
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ unsigned int csrc_count:4; /* CSRC count */
+ unsigned int extension:1; /* header extension flag */
+ unsigned int padding:1; /* padding flag */
+ unsigned int version:2; /* protocol version */
+ unsigned int payload_type:7; /* payload type */
+ unsigned int marker:1; /* marker bit */
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+ unsigned int version:2; /* protocol version */
+ unsigned int padding:1; /* padding flag */
+ unsigned int extension:1; /* header extension flag */
+ unsigned int csrc_count:4; /* CSRC count */
+ unsigned int marker:1; /* marker bit */
+ unsigned int payload_type:7; /* payload type */
+#else
+#error "G_BYTE_ORDER should be big or little endian."
+#endif
+ unsigned int seq:16; /* sequence number */
+ unsigned int timestamp:32; /* timestamp */
+ unsigned int ssrc:32; /* synchronization source */
+ guint8 csrclist[4]; /* optional CSRC list, 32 bits each */
+} GstRTPHeader;
+
+#define GST_RTP_HEADER_VERSION(data) (((GstRTPHeader *)(data))->version)
+#define GST_RTP_HEADER_PADDING(data) (((GstRTPHeader *)(data))->padding)
+#define GST_RTP_HEADER_EXTENSION(data) (((GstRTPHeader *)(data))->extension)
+#define GST_RTP_HEADER_CSRC_COUNT(data) (((GstRTPHeader *)(data))->csrc_count)
+#define GST_RTP_HEADER_MARKER(data) (((GstRTPHeader *)(data))->marker)
+#define GST_RTP_HEADER_PAYLOAD_TYPE(data) (((GstRTPHeader *)(data))->payload_type)
+#define GST_RTP_HEADER_SEQ(data) (((GstRTPHeader *)(data))->seq)
+#define GST_RTP_HEADER_TIMESTAMP(data) (((GstRTPHeader *)(data))->timestamp)
+#define GST_RTP_HEADER_SSRC(data) (((GstRTPHeader *)(data))->ssrc)
+#define GST_RTP_HEADER_CSRC_LIST_OFFSET(data,i) \
+ data + G_STRUCT_OFFSET(GstRTPHeader, csrclist) + \
+ ((i) * sizeof(guint32))
+#define GST_RTP_HEADER_CSRC_SIZE(data) (GST_RTP_HEADER_CSRC_COUNT(data) * sizeof (guint32))
+
+/**
+ * gst_rtp_buffer_allocate_data:
+ * @buffer: a #GstBuffer
+ * @payload_len: the length of the payload
+ * @pad_len: the amount of padding
+ * @csrc_count: the number of CSRC entries
+ *
+ * Allocate enough data in @buffer to hold an RTP packet with @csrc_count CSRCs,
+ * a payload length of @payload_len and padding of @pad_len.
+ * MALLOCDATA of @buffer will be overwritten and will not be freed.
+ * All other RTP header fields will be set to 0/FALSE.
+ */
+void
+gst_rtp_buffer_allocate_data (GstBuffer * buffer, guint payload_len,
+ guint8 pad_len, guint8 csrc_count)
+{
+ guint len;
+ guint8 *data;
+ GstMemory *mem;
+
+ g_return_if_fail (csrc_count <= 15);
+ g_return_if_fail (GST_IS_BUFFER (buffer));
+
+ len = GST_RTP_HEADER_LEN + csrc_count * sizeof (guint32)
+ + payload_len + pad_len;
+
+ mem = gst_allocator_alloc (NULL, len, 0);
+
+ data = gst_memory_map (mem, NULL, NULL, GST_MAP_WRITE);
+ /* fill in defaults */
+ GST_RTP_HEADER_VERSION (data) = GST_RTP_VERSION;
+ GST_RTP_HEADER_PADDING (data) = FALSE;
+ GST_RTP_HEADER_EXTENSION (data) = FALSE;
+ GST_RTP_HEADER_CSRC_COUNT (data) = csrc_count;
+ memset (GST_RTP_HEADER_CSRC_LIST_OFFSET (data, 0), 0,
+ csrc_count * sizeof (guint32));
+ GST_RTP_HEADER_MARKER (data) = FALSE;
+ GST_RTP_HEADER_PAYLOAD_TYPE (data) = 0;
+ GST_RTP_HEADER_SEQ (data) = 0;
+ GST_RTP_HEADER_TIMESTAMP (data) = 0;
+ GST_RTP_HEADER_SSRC (data) = 0;
+ gst_memory_unmap (mem, data, len);
+
+ gst_buffer_take_memory (buffer, -1, mem);
+}
+
+/**
+ * gst_rtp_buffer_new_take_data:
+ * @data: data for the new buffer
+ * @len: the length of data
+ *
+ * Create a new buffer and set the data and size of the buffer to @data and @len
+ * respectively. @data will be freed when the buffer is unreffed, so this
+ * function transfers ownership of @data to the new buffer.
+ *
+ * Returns: A newly allocated buffer with @data and of size @len.
+ */
+GstBuffer *
+gst_rtp_buffer_new_take_data (gpointer data, gsize len)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (len > 0, NULL);
+
+ result = gst_buffer_new ();
+ gst_buffer_take_memory (result, -1,
+ gst_memory_new_wrapped (0, data, g_free, len, 0, len));
+
+ return result;
+}
+
+/**
+ * gst_rtp_buffer_new_copy_data:
+ * @data: data for the new buffer
+ * @len: the length of data
+ *
+ * Create a new buffer and set the data to a copy of @len
+ * bytes of @data and the size to @len. The data will be freed when the buffer
+ * is freed.
+ *
+ * Returns: A newly allocated buffer with a copy of @data and of size @len.
+ */
+GstBuffer *
+gst_rtp_buffer_new_copy_data (gpointer data, gsize len)
+{
+ return gst_rtp_buffer_new_take_data (g_memdup (data, len), len);
+}
+
+/**
+ * gst_rtp_buffer_new_allocate:
+ * @payload_len: the length of the payload
+ * @pad_len: the amount of padding
+ * @csrc_count: the number of CSRC entries
+ *
+ * Allocate a new #GstBuffer with enough data to hold an RTP packet with
+ * @csrc_count CSRCs, a payload length of @payload_len and padding of @pad_len.
+ * All other RTP header fields will be set to 0/FALSE.
+ *
+ * Returns: A newly allocated buffer that can hold an RTP packet with given
+ * parameters.
+ */
+GstBuffer *
+gst_rtp_buffer_new_allocate (guint payload_len, guint8 pad_len,
+ guint8 csrc_count)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (csrc_count <= 15, NULL);
+
+ result = gst_buffer_new ();
+ gst_rtp_buffer_allocate_data (result, payload_len, pad_len, csrc_count);
+
+ return result;
+}
+
+/**
+ * gst_rtp_buffer_new_allocate_len:
+ * @rtp_len: the total length of the packet
+ * @pad_len: the amount of padding
+ * @csrc_count: the number of CSRC entries
+ *
+ * Create a new #GstBuffer that can hold an RTP packet that is exactly
+ * @packet_len long. The length of the payload depends on @pad_len and
+ * @csrc_count and can be calculated with gst_rtp_buffer_calc_payload_len().
+ * All RTP header fields will be set to 0/FALSE.
+ *
+ * Returns: A newly allocated buffer that can hold an RTP packet of @packet_len.
+ */
+GstBuffer *
+gst_rtp_buffer_new_allocate_len (guint packet_len, guint8 pad_len,
+ guint8 csrc_count)
+{
+ guint len;
+
+ g_return_val_if_fail (csrc_count <= 15, NULL);
+
+ len = gst_rtp_buffer_calc_payload_len (packet_len, pad_len, csrc_count);
+
+ return gst_rtp_buffer_new_allocate (len, pad_len, csrc_count);
+}
+
+/**
+ * gst_rtp_buffer_calc_header_len:
+ * @csrc_count: the number of CSRC entries
+ *
+ * Calculate the header length of an RTP packet with @csrc_count CSRC entries.
+ * An RTP packet can have at most 15 CSRC entries.
+ *
+ * Returns: The length of an RTP header with @csrc_count CSRC entries.
+ */
+guint
+gst_rtp_buffer_calc_header_len (guint8 csrc_count)
+{
+ g_return_val_if_fail (csrc_count <= 15, 0);
+
+ return GST_RTP_HEADER_LEN + (csrc_count * sizeof (guint32));
+}
+
+/**
+ * gst_rtp_buffer_calc_packet_len:
+ * @payload_len: the length of the payload
+ * @pad_len: the amount of padding
+ * @csrc_count: the number of CSRC entries
+ *
+ * Calculate the total length of an RTP packet with a payload size of @payload_len,
+ * a padding of @pad_len and a @csrc_count CSRC entries.
+ *
+ * Returns: The total length of an RTP header with given parameters.
+ */
+guint
+gst_rtp_buffer_calc_packet_len (guint payload_len, guint8 pad_len,
+ guint8 csrc_count)
+{
+ g_return_val_if_fail (csrc_count <= 15, 0);
+
+ return payload_len + GST_RTP_HEADER_LEN + (csrc_count * sizeof (guint32))
+ + pad_len;
+}
+
+/**
+ * gst_rtp_buffer_calc_payload_len:
+ * @packet_len: the length of the total RTP packet
+ * @pad_len: the amount of padding
+ * @csrc_count: the number of CSRC entries
+ *
+ * Calculate the length of the payload of an RTP packet with size @packet_len,
+ * a padding of @pad_len and a @csrc_count CSRC entries.
+ *
+ * Returns: The length of the payload of an RTP packet with given parameters.
+ */
+guint
+gst_rtp_buffer_calc_payload_len (guint packet_len, guint8 pad_len,
+ guint8 csrc_count)
+{
+ g_return_val_if_fail (csrc_count <= 15, 0);
+
+ return packet_len - GST_RTP_HEADER_LEN - (csrc_count * sizeof (guint32))
+ - pad_len;
+}
+
+/*
+ * validate_data:
+ * @data: the data to validate
+ * @len: the length of @data to validate
+ * @payload: the payload if @data represents the header only
+ * @payload_len: the len of the payload
+ *
+ * Checks if @data is a valid RTP packet.
+ *
+ * Returns: TRUE if @data is a valid RTP packet
+ */
+static gboolean
+validate_data (guint8 * data, guint len, guint8 * payload, guint payload_len)
+{
+ guint8 padding;
+ guint8 csrc_count;
+ guint header_len;
+ guint8 version;
+
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ header_len = GST_RTP_HEADER_LEN;
+ if (G_UNLIKELY (len < header_len))
+ goto wrong_length;
+
+ /* check version */
+ version = (data[0] & 0xc0);
+ if (G_UNLIKELY (version != (GST_RTP_VERSION << 6)))
+ goto wrong_version;
+
+ /* calc header length with csrc */
+ csrc_count = (data[0] & 0x0f);
+ header_len += csrc_count * sizeof (guint32);
+
+ /* calc extension length when present. */
+ if (data[0] & 0x10) {
+ guint8 *extpos;
+ guint16 extlen;
+
+ /* this points to the extenstion bits and header length */
+ extpos = &data[header_len];
+
+ /* skip the header and check that we have enough space */
+ header_len += 4;
+ if (G_UNLIKELY (len < header_len))
+ goto wrong_length;
+
+ /* skip id */
+ extpos += 2;
+ /* read length as the number of 32 bits words */
+ extlen = GST_READ_UINT16_BE (extpos);
+
+ header_len += extlen * sizeof (guint32);
+ }
+
+ /* check for padding */
+ if (data[0] & 0x20) {
+ if (payload)
+ padding = payload[payload_len - 1];
+ else
+ padding = data[len - 1];
+ } else {
+ padding = 0;
+ }
+
+ /* check if padding and header not bigger than packet length */
+ if (G_UNLIKELY (len < padding + header_len))
+ goto wrong_padding;
+
+ return TRUE;
+
+ /* ERRORS */
+wrong_length:
+ {
+ GST_DEBUG ("len < header_len check failed (%d < %d)", len, header_len);
+ goto dump_packet;
+ }
+wrong_version:
+ {
+ GST_DEBUG ("version check failed (%d != %d)", version, GST_RTP_VERSION);
+ goto dump_packet;
+ }
+wrong_padding:
+ {
+ GST_DEBUG ("padding check failed (%d - %d < %d)", len, header_len, padding);
+ goto dump_packet;
+ }
+dump_packet:
+ {
+ GST_MEMDUMP ("buffer", data, len);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtp_buffer_validate_data:
+ * @data: the data to validate
+ * @len: the length of @data to validate
+ *
+ * Check if the @data and @size point to the data of a valid RTP packet.
+ * This function checks the length, version and padding of the packet data.
+ * Use this function to validate a packet before using the other functions in
+ * this module.
+ *
+ * Returns: TRUE if the data points to a valid RTP packet.
+ */
+gboolean
+gst_rtp_buffer_validate_data (guint8 * data, gsize len)
+{
+ return validate_data (data, len, NULL, 0);
+}
+
+/**
+ * gst_rtp_buffer_validate:
+ * @buffer: the buffer to validate
+ *
+ * Check if the data pointed to by @buffer is a valid RTP packet using
+ * gst_rtp_buffer_validate_data().
+ * Use this function to validate a packet before using the other functions in
+ * this module.
+ *
+ * Returns: TRUE if @buffer is a valid RTP packet.
+ */
+gboolean
+gst_rtp_buffer_validate (GstBuffer * buffer)
+{
+ gboolean res;
+ guint8 *data;
+ gsize len;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+
+ data = gst_buffer_map (buffer, &len, NULL, GST_MAP_READ);
+ res = validate_data (data, len, NULL, 0);
+ gst_buffer_unmap (buffer, data, len);
+
+ return res;
+}
+
+gboolean
+gst_rtp_buffer_map (GstBuffer * buffer, GstMapFlags flags, GstRTPBuffer * rtp)
+{
+ guint8 *data;
+ gsize size, maxsize;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+ g_return_val_if_fail (rtp != NULL, FALSE);
+ g_return_val_if_fail (rtp->buffer == NULL, FALSE);
+
+ data = gst_buffer_map (buffer, &size, &maxsize, flags);
+ if (data == NULL)
+ return FALSE;
+
+ rtp->buffer = buffer;
+ rtp->flags = flags;
+ rtp->data = data;
+ rtp->size = size;
+ rtp->maxsize = maxsize;
+
+ return TRUE;
+}
+
+gboolean
+gst_rtp_buffer_unmap (GstRTPBuffer * rtp)
+{
+ g_return_val_if_fail (rtp != NULL, FALSE);
+ g_return_val_if_fail (rtp->buffer != NULL, FALSE);
+
+ gst_buffer_unmap (rtp->buffer, rtp->data, rtp->size);
+
+ rtp->buffer = NULL;
+
+ return TRUE;
+}
+
+
+/**
+ * gst_rtp_buffer_set_packet_len:
+ * @rtp: the RTP packet
+ * @len: the new packet length
+ *
+ * Set the total @rtp size to @len. The data in the buffer will be made
+ * larger if needed. Any padding will be removed from the packet.
+ */
+void
+gst_rtp_buffer_set_packet_len (GstRTPBuffer * rtp, guint len)
+{
+ guint8 *data;
+
+ data = rtp->data;
+
+ if (rtp->maxsize <= len) {
+ /* FIXME, realloc bigger space */
+ g_warning ("not implemented");
+ }
+
+ gst_buffer_set_size (rtp->buffer, len);
+ rtp->size = len;
+
+ /* remove any padding */
+ GST_RTP_HEADER_PADDING (data) = FALSE;
+}
+
+/**
+ * gst_rtp_buffer_get_packet_len:
+ * @rtp: the RTP packet
+ *
+ * Return the total length of the packet in @buffer.
+ *
+ * Returns: The total length of the packet in @buffer.
+ */
+guint
+gst_rtp_buffer_get_packet_len (GstRTPBuffer * rtp)
+{
+ return gst_buffer_get_size (rtp->buffer);
+}
+
+/**
+ * gst_rtp_buffer_get_header_len:
+ * @rtp: the RTP packet
+ *
+ * Return the total length of the header in @buffer. This include the length of
+ * the fixed header, the CSRC list and the extension header.
+ *
+ * Returns: The total length of the header in @buffer.
+ */
+guint
+gst_rtp_buffer_get_header_len (GstRTPBuffer * rtp)
+{
+ guint len;
+ guint8 *data;
+
+ data = rtp->data;
+
+ len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data);
+ if (GST_RTP_HEADER_EXTENSION (data))
+ len += GST_READ_UINT16_BE (data + len + 2) * 4 + 4;
+
+ return len;
+}
+
+/**
+ * gst_rtp_buffer_get_version:
+ * @rtp: the RTP packet
+ *
+ * Get the version number of the RTP packet in @buffer.
+ *
+ * Returns: The version of @buffer.
+ */
+guint8
+gst_rtp_buffer_get_version (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_VERSION (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_set_version:
+ * @rtp: the RTP packet
+ * @version: the new version
+ *
+ * Set the version of the RTP packet in @buffer to @version.
+ */
+void
+gst_rtp_buffer_set_version (GstRTPBuffer * rtp, guint8 version)
+{
+ g_return_if_fail (version < 0x04);
+
+ GST_RTP_HEADER_VERSION (rtp->data) = version;
+}
+
+/**
+ * gst_rtp_buffer_get_padding:
+ * @rtp: the RTP packet
+ *
+ * Check if the padding bit is set on the RTP packet in @buffer.
+ *
+ * Returns: TRUE if @buffer has the padding bit set.
+ */
+gboolean
+gst_rtp_buffer_get_padding (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_PADDING (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_set_padding:
+ * @buffer: the buffer
+ * @padding: the new padding
+ *
+ * Set the padding bit on the RTP packet in @buffer to @padding.
+ */
+void
+gst_rtp_buffer_set_padding (GstRTPBuffer * rtp, gboolean padding)
+{
+ GST_RTP_HEADER_PADDING (rtp->data) = padding;
+}
+
+/**
+ * gst_rtp_buffer_pad_to:
+ * @rtp: the RTP packet
+ * @len: the new amount of padding
+ *
+ * Set the amount of padding in the RTP packet in @buffer to
+ * @len. If @len is 0, the padding is removed.
+ *
+ * NOTE: This function does not work correctly.
+ */
+void
+gst_rtp_buffer_pad_to (GstRTPBuffer * rtp, guint len)
+{
+ guint8 *data;
+
+ data = rtp->data;
+
+ if (len > 0)
+ GST_RTP_HEADER_PADDING (data) = TRUE;
+ else
+ GST_RTP_HEADER_PADDING (data) = FALSE;
+
+ /* FIXME, set the padding byte at the end of the payload data */
+}
+
+/**
+ * gst_rtp_buffer_get_extension:
+ * @rtp: the RTP packet
+ *
+ * Check if the extension bit is set on the RTP packet in @buffer.
+ *
+ * Returns: TRUE if @buffer has the extension bit set.
+ */
+gboolean
+gst_rtp_buffer_get_extension (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_EXTENSION (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_set_extension:
+ * @rtp: the RTP packet
+ * @extension: the new extension
+ *
+ * Set the extension bit on the RTP packet in @buffer to @extension.
+ */
+void
+gst_rtp_buffer_set_extension (GstRTPBuffer * rtp, gboolean extension)
+{
+ GST_RTP_HEADER_EXTENSION (rtp->data) = extension;
+}
+
+/**
+ * gst_rtp_buffer_get_extension_data:
+ * @rtp: the RTP packet
+ * @bits: location for result bits
+ * @data: location for data
+ * @wordlen: location for length of @data in 32 bits words
+ *
+ * Get the extension data. @bits will contain the extension 16 bits of custom
+ * data. @data will point to the data in the extension and @wordlen will contain
+ * the length of @data in 32 bits words.
+ *
+ * If @buffer did not contain an extension, this function will return %FALSE
+ * with @bits, @data and @wordlen unchanged.
+ *
+ * Returns: TRUE if @buffer had the extension bit set.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_rtp_buffer_get_extension_data (GstRTPBuffer * rtp, guint16 * bits,
+ gpointer * data, guint * wordlen)
+{
+ guint len;
+ guint8 *pdata;
+
+ pdata = rtp->data;
+
+ if (!GST_RTP_HEADER_EXTENSION (pdata))
+ return FALSE;
+
+ /* move to the extension */
+ len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (pdata);
+ pdata += len;
+
+ if (bits)
+ *bits = GST_READ_UINT16_BE (pdata);
+ if (wordlen)
+ *wordlen = GST_READ_UINT16_BE (pdata + 2);
+ if (data)
+ *data = pdata + 4;
+
+ return TRUE;
+}
+
+/**
+ * gst_rtp_buffer_set_extension_data:
+ * @rtp: the RTP packet
+ * @bits: the bits specific for the extension
+ * @length: the length that counts the number of 32-bit words in
+ * the extension, excluding the extension header ( therefore zero is a valid length)
+ *
+ * Set the extension bit of the rtp buffer and fill in the @bits and @length of the
+ * extension header. It will refuse to set the extension data if the buffer is not
+ * large enough.
+ *
+ * Returns: True if done.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_rtp_buffer_set_extension_data (GstRTPBuffer * rtp, guint16 bits,
+ guint16 length)
+{
+ guint32 min_size = 0;
+ guint8 *data;
+
+ data = rtp->data;
+
+ /* check if the buffer is big enough to hold the extension */
+ min_size =
+ GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data) + 4 +
+ length * sizeof (guint32);
+ if (G_UNLIKELY (min_size > rtp->size))
+ goto too_small;
+
+ /* now we can set the extension bit */
+ GST_RTP_HEADER_EXTENSION (rtp->data) = TRUE;
+
+ data += GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data);
+ GST_WRITE_UINT16_BE (data, bits);
+ GST_WRITE_UINT16_BE (data + 2, length);
+
+ return TRUE;
+
+ /* ERRORS */
+too_small:
+ {
+ g_warning
+ ("rtp buffer too small: need more than %d bytes but only have %"
+ G_GSIZE_FORMAT " bytes", min_size, rtp->size);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_rtp_buffer_get_ssrc:
+ * @rtp: the RTP packet
+ *
+ * Get the SSRC of the RTP packet in @buffer.
+ *
+ * Returns: the SSRC of @buffer in host order.
+ */
+guint32
+gst_rtp_buffer_get_ssrc (GstRTPBuffer * rtp)
+{
+ return g_ntohl (GST_RTP_HEADER_SSRC (rtp->data));
+}
+
+/**
+ * gst_rtp_buffer_set_ssrc:
+ * @rtp: the RTP packet
+ * @ssrc: the new SSRC
+ *
+ * Set the SSRC on the RTP packet in @buffer to @ssrc.
+ */
+void
+gst_rtp_buffer_set_ssrc (GstRTPBuffer * rtp, guint32 ssrc)
+{
+ GST_RTP_HEADER_SSRC (rtp->data) = g_htonl (ssrc);
+}
+
+/**
+ * gst_rtp_buffer_get_csrc_count:
+ * @rtp: the RTP packet
+ *
+ * Get the CSRC count of the RTP packet in @buffer.
+ *
+ * Returns: the CSRC count of @buffer.
+ */
+guint8
+gst_rtp_buffer_get_csrc_count (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_CSRC_COUNT (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_get_csrc:
+ * @rtp: the RTP packet
+ * @idx: the index of the CSRC to get
+ *
+ * Get the CSRC at index @idx in @buffer.
+ *
+ * Returns: the CSRC at index @idx in host order.
+ */
+guint32
+gst_rtp_buffer_get_csrc (GstRTPBuffer * rtp, guint8 idx)
+{
+ guint8 *data;
+
+ data = rtp->data;
+
+ g_return_val_if_fail (idx < GST_RTP_HEADER_CSRC_COUNT (data), 0);
+
+ return GST_READ_UINT32_BE (GST_RTP_HEADER_CSRC_LIST_OFFSET (data, idx));
+}
+
+/**
+ * gst_rtp_buffer_set_csrc:
+ * @rtp: the RTP packet
+ * @idx: the CSRC index to set
+ * @csrc: the CSRC in host order to set at @idx
+ *
+ * Modify the CSRC at index @idx in @buffer to @csrc.
+ */
+void
+gst_rtp_buffer_set_csrc (GstRTPBuffer * rtp, guint8 idx, guint32 csrc)
+{
+ guint8 *data;
+
+ data = rtp->data;
+
+ g_return_if_fail (idx < GST_RTP_HEADER_CSRC_COUNT (data));
+
+ GST_WRITE_UINT32_BE (GST_RTP_HEADER_CSRC_LIST_OFFSET (data, idx), csrc);
+}
+
+/**
+ * gst_rtp_buffer_get_marker:
+ * @rtp: the RTP packet
+ *
+ * Check if the marker bit is set on the RTP packet in @buffer.
+ *
+ * Returns: TRUE if @buffer has the marker bit set.
+ */
+gboolean
+gst_rtp_buffer_get_marker (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_MARKER (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_set_marker:
+ * @rtp: the RTP packet
+ * @marker: the new marker
+ *
+ * Set the marker bit on the RTP packet in @buffer to @marker.
+ */
+void
+gst_rtp_buffer_set_marker (GstRTPBuffer * rtp, gboolean marker)
+{
+ GST_RTP_HEADER_MARKER (rtp->data) = marker;
+}
+
+/**
+ * gst_rtp_buffer_get_payload_type:
+ * @rtp: the RTP packet
+ *
+ * Get the payload type of the RTP packet in @buffer.
+ *
+ * Returns: The payload type.
+ */
+guint8
+gst_rtp_buffer_get_payload_type (GstRTPBuffer * rtp)
+{
+ return GST_RTP_HEADER_PAYLOAD_TYPE (rtp->data);
+}
+
+/**
+ * gst_rtp_buffer_set_payload_type:
+ * @rtp: the RTP packet
+ * @payload_type: the new type
+ *
+ * Set the payload type of the RTP packet in @buffer to @payload_type.
+ */
+void
+gst_rtp_buffer_set_payload_type (GstRTPBuffer * rtp, guint8 payload_type)
+{
+ g_return_if_fail (payload_type < 0x80);
+
+ GST_RTP_HEADER_PAYLOAD_TYPE (rtp->data) = payload_type;
+}
+
+/**
+ * gst_rtp_buffer_get_seq:
+ * @rtp: the RTP packet
+ *
+ * Get the sequence number of the RTP packet in @buffer.
+ *
+ * Returns: The sequence number in host order.
+ */
+guint16
+gst_rtp_buffer_get_seq (GstRTPBuffer * rtp)
+{
+ return g_ntohs (GST_RTP_HEADER_SEQ (rtp->data));
+}
+
+/**
+ * gst_rtp_buffer_set_seq:
+ * @rtp: the RTP packet
+ * @seq: the new sequence number
+ *
+ * Set the sequence number of the RTP packet in @buffer to @seq.
+ */
+void
+gst_rtp_buffer_set_seq (GstRTPBuffer * rtp, guint16 seq)
+{
+ GST_RTP_HEADER_SEQ (rtp->data) = g_htons (seq);
+}
+
+/**
+ * gst_rtp_buffer_get_timestamp:
+ * @rtp: the RTP packet
+ *
+ * Get the timestamp of the RTP packet in @buffer.
+ *
+ * Returns: The timestamp in host order.
+ */
+guint32
+gst_rtp_buffer_get_timestamp (GstRTPBuffer * rtp)
+{
+ return g_ntohl (GST_RTP_HEADER_TIMESTAMP (rtp->data));
+}
+
+/**
+ * gst_rtp_buffer_set_timestamp:
+ * @rtp: the RTP packet
+ * @timestamp: the new timestamp
+ *
+ * Set the timestamp of the RTP packet in @buffer to @timestamp.
+ */
+void
+gst_rtp_buffer_set_timestamp (GstRTPBuffer * rtp, guint32 timestamp)
+{
+ GST_RTP_HEADER_TIMESTAMP (rtp->data) = g_htonl (timestamp);
+}
+
+
+/**
+ * gst_rtp_buffer_get_payload_subbuffer:
+ * @rtp: the RTP packet
+ * @offset: the offset in the payload
+ * @len: the length in the payload
+ *
+ * Create a subbuffer of the payload of the RTP packet in @buffer. @offset bytes
+ * are skipped in the payload and the subbuffer will be of size @len.
+ * If @len is -1 the total payload starting from @offset if subbuffered.
+ *
+ * Returns: A new buffer with the specified data of the payload.
+ *
+ * Since: 0.10.10
+ */
+GstBuffer *
+gst_rtp_buffer_get_payload_subbuffer (GstRTPBuffer * rtp, guint offset,
+ guint len)
+{
+ guint poffset, plen;
+
+ plen = gst_rtp_buffer_get_payload_len (rtp);
+ /* we can't go past the length */
+ if (G_UNLIKELY (offset >= plen))
+ goto wrong_offset;
+
+ /* apply offset */
+ poffset = gst_rtp_buffer_get_header_len (rtp) + offset;
+ plen -= offset;
+
+ /* see if we need to shrink the buffer based on @len */
+ if (len != -1 && len < plen)
+ plen = len;
+
+ return gst_buffer_copy_region (rtp->buffer, GST_BUFFER_COPY_ALL, poffset,
+ plen);
+
+ /* ERRORS */
+wrong_offset:
+ {
+ g_warning ("offset=%u should be less then plen=%u", offset, plen);
+ return NULL;
+ }
+}
+
+/**
+ * gst_rtp_buffer_get_payload_buffer:
+ * @rtp: the RTP packet
+ *
+ * Create a buffer of the payload of the RTP packet in @buffer. This function
+ * will internally create a subbuffer of @buffer so that a memcpy can be
+ * avoided.
+ *
+ * Returns: A new buffer with the data of the payload.
+ */
+GstBuffer *
+gst_rtp_buffer_get_payload_buffer (GstRTPBuffer * rtp)
+{
+ return gst_rtp_buffer_get_payload_subbuffer (rtp, 0, -1);
+}
+
+/**
+ * gst_rtp_buffer_get_payload_len:
+ * @rtp: the RTP packet
+ *
+ * Get the length of the payload of the RTP packet in @buffer.
+ *
+ * Returns: The length of the payload in @buffer.
+ */
+guint
+gst_rtp_buffer_get_payload_len (GstRTPBuffer * rtp)
+{
+ guint len, size;
+ guint8 *data;
+
+ size = rtp->size;
+ data = rtp->data;
+
+ len = size - gst_rtp_buffer_get_header_len (rtp);
+
+ if (GST_RTP_HEADER_PADDING (data))
+ len -= data[size - 1];
+
+ return len;
+}
+
+/**
+ * gst_rtp_buffer_get_payload:
+ * @rtp: the RTP packet
+ *
+ * Get a pointer to the payload data in @buffer. This pointer is valid as long
+ * as a reference to @buffer is held.
+ *
+ * Returns: A pointer to the payload data in @buffer.
+ */
+gpointer
+gst_rtp_buffer_get_payload (GstRTPBuffer * rtp)
+{
+ return rtp->data + gst_rtp_buffer_get_header_len (rtp);
+}
+
+/**
+ * gst_rtp_buffer_default_clock_rate:
+ * @payload_type: the static payload type
+ *
+ * Get the default clock-rate for the static payload type @payload_type.
+ *
+ * Returns: the default clock rate or -1 if the payload type is not static or
+ * the clock-rate is undefined.
+ *
+ * Since: 0.10.13
+ */
+guint32
+gst_rtp_buffer_default_clock_rate (guint8 payload_type)
+{
+ const GstRTPPayloadInfo *info;
+ guint32 res;
+
+ info = gst_rtp_payload_info_for_pt (payload_type);
+ if (!info)
+ return -1;
+
+ res = info->clock_rate;
+ /* 0 means unknown so we have to return -1 from this function */
+ if (res == 0)
+ res = -1;
+
+ return res;
+}
+
+/**
+ * gst_rtp_buffer_compare_seqnum:
+ * @seqnum1: a sequence number
+ * @seqnum2: a sequence number
+ *
+ * Compare two sequence numbers, taking care of wraparounds. This function
+ * returns the difference between @seqnum1 and @seqnum2.
+ *
+ * Returns: a negative value if @seqnum1 is bigger than @seqnum2, 0 if they
+ * are equal or a positive value if @seqnum1 is smaller than @segnum2.
+ *
+ * Since: 0.10.15
+ */
+gint
+gst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2)
+{
+ return (gint16) (seqnum2 - seqnum1);
+}
+
+/**
+ * gst_rtp_buffer_ext_timestamp:
+ * @exttimestamp: a previous extended timestamp
+ * @timestamp: a new timestamp
+ *
+ * Update the @exttimestamp field with @timestamp. For the first call of the
+ * method, @exttimestamp should point to a location with a value of -1.
+ *
+ * This function makes sure that the returned value is a constantly increasing
+ * value even in the case where there is a timestamp wraparound.
+ *
+ * Returns: The extended timestamp of @timestamp.
+ *
+ * Since: 0.10.15
+ */
+guint64
+gst_rtp_buffer_ext_timestamp (guint64 * exttimestamp, guint32 timestamp)
+{
+ guint64 result, diff, ext;
+
+ g_return_val_if_fail (exttimestamp != NULL, -1);
+
+ ext = *exttimestamp;
+
+ if (ext == -1) {
+ result = timestamp;
+ } else {
+ /* pick wraparound counter from previous timestamp and add to new timestamp */
+ result = timestamp + (ext & ~(G_GINT64_CONSTANT (0xffffffff)));
+
+ /* check for timestamp wraparound */
+ if (result < ext)
+ diff = ext - result;
+ else
+ diff = result - ext;
+
+ if (diff > G_MAXINT32) {
+ /* timestamp went backwards more than allowed, we wrap around and get
+ * updated extended timestamp. */
+ result += (G_GINT64_CONSTANT (1) << 32);
+ }
+ }
+ *exttimestamp = result;
+
+ return result;
+}
+
+/**
+ * gst_rtp_buffer_get_extension_onebyte_header:
+ * @rtp: the RTP packet
+ * @id: The ID of the header extension to be read (between 1 and 14).
+ * @nth: Read the nth extension packet with the requested ID
+ * @data: location for data
+ * @size: the size of the data in bytes
+ *
+ * Parses RFC 5285 style header extensions with a one byte header. It will
+ * return the nth extension with the requested id.
+ *
+ * Returns: TRUE if @buffer had the requested header extension
+ *
+ * Since: 0.10.31
+ */
+
+gboolean
+gst_rtp_buffer_get_extension_onebyte_header (GstRTPBuffer * rtp, guint8 id,
+ guint nth, gpointer * data, guint * size)
+{
+ guint16 bits;
+ guint8 *pdata;
+ guint wordlen;
+ gulong offset = 0;
+ guint count = 0;
+
+ g_return_val_if_fail (id > 0 && id < 15, FALSE);
+
+ if (!gst_rtp_buffer_get_extension_data (rtp, &bits, (gpointer) & pdata,
+ &wordlen))
+ return FALSE;
+
+ if (bits != 0xBEDE)
+ return FALSE;
+
+ for (;;) {
+ guint8 read_id, read_len;
+
+ if (offset + 1 >= wordlen * 4)
+ break;
+
+ read_id = GST_READ_UINT8 (pdata + offset) >> 4;
+ read_len = (GST_READ_UINT8 (pdata + offset) & 0x0F) + 1;
+ offset += 1;
+
+ /* ID 0 means its padding, skip */
+ if (read_id == 0)
+ continue;
+
+ /* ID 15 is special and means we should stop parsing */
+ if (read_id == 15)
+ break;
+
+ /* Ignore extension headers where the size does not fit */
+ if (offset + read_len > wordlen * 4)
+ break;
+
+ /* If we have the right one */
+ if (id == read_id) {
+ if (nth == count) {
+ if (data)
+ *data = pdata + offset;
+ if (size)
+ *size = read_len;
+
+ return TRUE;
+ }
+
+ count++;
+ }
+ offset += read_len;
+
+ if (offset >= wordlen * 4)
+ break;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_rtp_buffer_get_extension_twobytes_header:
+ * @rtp: the RTP packet
+ * @appbits: Application specific bits
+ * @id: The ID of the header extension to be read (between 1 and 14).
+ * @nth: Read the nth extension packet with the requested ID
+ * @data: location for data
+ * @size: the size of the data in bytes
+ *
+ * Parses RFC 5285 style header extensions with a two bytes header. It will
+ * return the nth extension with the requested id.
+ *
+ * Returns: TRUE if @buffer had the requested header extension
+ *
+ * Since: 0.10.31
+ */
+
+gboolean
+gst_rtp_buffer_get_extension_twobytes_header (GstRTPBuffer * rtp,
+ guint8 * appbits, guint8 id, guint nth, gpointer * data, guint * size)
+{
+ guint16 bits;
+ guint8 *pdata;
+ guint wordlen;
+ guint bytelen;
+ gulong offset = 0;
+ guint count = 0;
+
+ if (!gst_rtp_buffer_get_extension_data (rtp, &bits, (gpointer) & pdata,
+ &wordlen))
+ return FALSE;
+
+ if (bits >> 4 != 0x100)
+ return FALSE;
+
+ bytelen = wordlen * 4;
+
+ for (;;) {
+ guint8 read_id, read_len;
+
+ if (offset + 2 >= bytelen)
+ break;
+
+ read_id = GST_READ_UINT8 (pdata + offset);
+ offset += 1;
+
+ if (read_id == 0)
+ continue;
+
+ read_len = GST_READ_UINT8 (pdata + offset);
+ offset += 1;
+
+ /* Ignore extension headers where the size does not fit */
+ if (offset + read_len > bytelen)
+ break;
+
+ /* If we have the right one, return it */
+ if (id == read_id) {
+ if (nth == count) {
+ if (data)
+ *data = pdata + offset;
+ if (size)
+ *size = read_len;
+ if (appbits)
+ *appbits = bits;
+
+ return TRUE;
+ }
+
+ count++;
+ }
+ offset += read_len;
+ }
+
+ return FALSE;
+}
+
+static guint
+get_onebyte_header_end_offset (guint8 * pdata, guint wordlen)
+{
+ guint offset = 0;
+ guint bytelen = wordlen * 4;
+ guint paddingcount = 0;
+
+ while (offset + 1 < bytelen) {
+ guint8 read_id, read_len;
+
+ read_id = GST_READ_UINT8 (pdata + offset) >> 4;
+ read_len = (GST_READ_UINT8 (pdata + offset) & 0x0F) + 1;
+ offset += 1;
+
+ /* ID 0 means its padding, skip */
+ if (read_id == 0) {
+ paddingcount++;
+ continue;
+ }
+
+ paddingcount = 0;
+
+ /* ID 15 is special and means we should stop parsing */
+ /* It also means we can't add an extra packet */
+ if (read_id == 15)
+ return 0;
+
+ /* Ignore extension headers where the size does not fit */
+ if (offset + read_len > bytelen)
+ return 0;
+
+ offset += read_len;
+ }
+
+ return offset - paddingcount;
+}
+
+/**
+ * gst_rtp_buffer_add_extension_onebyte_header:
+ * @rtp: the RTP packet
+ * @id: The ID of the header extension (between 1 and 14).
+ * @data: location for data
+ * @size: the size of the data in bytes
+ *
+ * Adds a RFC 5285 header extension with a one byte header to the end of the
+ * RTP header. If there is already a RFC 5285 header extension with a one byte
+ * header, the new extension will be appended.
+ * It will not work if there is already a header extension that does not follow
+ * the mecanism described in RFC 5285 or if there is a header extension with
+ * a two bytes header as described in RFC 5285. In that case, use
+ * gst_rtp_buffer_add_extension_twobytes_header()
+ *
+ * Returns: %TRUE if header extension could be added
+ *
+ * Since: 0.10.31
+ */
+
+gboolean
+gst_rtp_buffer_add_extension_onebyte_header (GstRTPBuffer * rtp, guint8 id,
+ gpointer data, guint size)
+{
+ guint16 bits;
+ guint8 *pdata;
+ guint wordlen;
+ gboolean has_bit;
+
+ g_return_val_if_fail (id > 0 && id < 15, FALSE);
+ g_return_val_if_fail (size >= 1 && size <= 16, FALSE);
+ g_return_val_if_fail (gst_buffer_is_writable (rtp->buffer), FALSE);
+
+ has_bit = gst_rtp_buffer_get_extension_data (rtp, &bits,
+ (gpointer) & pdata, &wordlen);
+
+ if (has_bit) {
+ gulong offset = 0;
+ guint8 *nextext;
+ guint extlen;
+
+ if (bits != 0xBEDE)
+ return FALSE;
+
+ offset = get_onebyte_header_end_offset (pdata, wordlen);
+ if (offset == 0)
+ return FALSE;
+
+ nextext = pdata + offset;
+ offset = nextext - rtp->data;
+
+ /* Don't add extra header if there isn't enough space */
+ if (rtp->size < offset + size + 1)
+ return FALSE;
+
+ nextext[0] = (id << 4) | (0x0F & (size - 1));
+ memcpy (nextext + 1, data, size);
+
+ extlen = nextext - pdata + size + 1;
+ if (extlen % 4) {
+ wordlen = extlen / 4 + 1;
+ memset (nextext + size + 1, 0, 4 - extlen % 4);
+ } else {
+ wordlen = extlen / 4;
+ }
+
+ gst_rtp_buffer_set_extension_data (rtp, 0xBEDE, wordlen);
+ } else {
+ wordlen = (size + 1) / 4 + (((size + 1) % 4) ? 1 : 0);
+
+ gst_rtp_buffer_set_extension_data (rtp, 0xBEDE, wordlen);
+
+ gst_rtp_buffer_get_extension_data (rtp, &bits,
+ (gpointer) & pdata, &wordlen);
+
+ pdata[0] = (id << 4) | (0x0F & (size - 1));
+ memcpy (pdata + 1, data, size);
+
+ if ((size + 1) % 4)
+ memset (pdata + size + 1, 0, 4 - ((size + 1) % 4));
+ }
+
+ return TRUE;
+}
+
+
+static guint
+get_twobytes_header_end_offset (guint8 * pdata, guint wordlen)
+{
+ guint offset = 0;
+ guint bytelen = wordlen * 4;
+ guint paddingcount = 0;
+
+ while (offset + 2 < bytelen) {
+ guint8 read_id, read_len;
+
+ read_id = GST_READ_UINT8 (pdata + offset);
+ offset += 1;
+
+ /* ID 0 means its padding, skip */
+ if (read_id == 0) {
+ paddingcount++;
+ continue;
+ }
+
+ paddingcount = 0;
+
+ read_len = GST_READ_UINT8 (pdata + offset);
+ offset += 1;
+
+ /* Ignore extension headers where the size does not fit */
+ if (offset + read_len > bytelen)
+ return 0;
+
+ offset += read_len;
+ }
+
+ return offset - paddingcount;
+}
+
+/**
+ * gst_rtp_buffer_add_extension_twobytes_header:
+ * @rtp: the RTP packet
+ * @appbits: Application specific bits
+ * @id: The ID of the header extension
+ * @data: location for data
+ * @size: the size of the data in bytes
+ *
+ * Adds a RFC 5285 header extension with a two bytes header to the end of the
+ * RTP header. If there is already a RFC 5285 header extension with a two bytes
+ * header, the new extension will be appended.
+ * It will not work if there is already a header extension that does not follow
+ * the mecanism described in RFC 5285 or if there is a header extension with
+ * a one byte header as described in RFC 5285. In that case, use
+ * gst_rtp_buffer_add_extension_onebyte_header()
+ *
+ * Returns: %TRUE if header extension could be added
+ *
+ * Since: 0.10.31
+ */
+
+gboolean
+gst_rtp_buffer_add_extension_twobytes_header (GstRTPBuffer * rtp,
+ guint8 appbits, guint8 id, gpointer data, guint size)
+{
+ guint16 bits;
+ guint8 *pdata;
+ guint wordlen;
+ gboolean has_bit;
+
+ g_return_val_if_fail ((appbits & 0xF0) == 0, FALSE);
+ g_return_val_if_fail (size < 256, FALSE);
+ g_return_val_if_fail (gst_buffer_is_writable (rtp->buffer), FALSE);
+
+ has_bit = gst_rtp_buffer_get_extension_data (rtp, &bits,
+ (gpointer) & pdata, &wordlen);
+
+ if (has_bit) {
+ gulong offset = 0;
+ guint8 *nextext;
+ guint extlen;
+
+ if (bits != ((0x100 << 4) | (appbits & 0x0f)))
+ return FALSE;
+
+ offset = get_twobytes_header_end_offset (pdata, wordlen);
+
+ nextext = pdata + offset;
+
+ offset = nextext - rtp->data;
+
+ /* Don't add extra header if there isn't enough space */
+ if (rtp->size < offset + size + 2)
+ return FALSE;
+
+ nextext[0] = id;
+ nextext[1] = size;
+ memcpy (nextext + 2, data, size);
+
+ extlen = nextext - pdata + size + 2;
+ if (extlen % 4) {
+ wordlen = extlen / 4 + 1;
+ memset (nextext + size + 2, 0, 4 - extlen % 4);
+ } else {
+ wordlen = extlen / 4;
+ }
+
+ gst_rtp_buffer_set_extension_data (rtp, (0x100 << 4) | (appbits & 0x0F),
+ wordlen);
+ } else {
+ wordlen = (size + 2) / 4 + (((size + 2) % 4) ? 1 : 0);
+
+ gst_rtp_buffer_set_extension_data (rtp, (0x100 << 4) | (appbits & 0x0F),
+ wordlen);
+
+ gst_rtp_buffer_get_extension_data (rtp, &bits,
+ (gpointer) & pdata, &wordlen);
+
+ pdata[0] = id;
+ pdata[1] = size;
+ memcpy (pdata + 2, data, size);
+ if ((size + 2) % 4)
+ memset (pdata + size + 2, 0, 4 - ((size + 2) % 4));
+ }
+
+ return TRUE;
+}
diff --git a/gst-libs/gst/rtp/gstrtpbuffer.h b/gst-libs/gst/rtp/gstrtpbuffer.h
new file mode 100644
index 0000000..b40e714
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtpbuffer.h
@@ -0,0 +1,152 @@
+/* GStreamer
+ * Copyright (C) <2005> Philippe Khalaf <burger@speedy.org>
+ * <2005> Wim Taymans <wim@fluendo.com>
+ *
+ * gstrtpbuffer.h: various helper functions to manipulate buffers
+ * with RTP payload.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RTPBUFFER_H__
+#define __GST_RTPBUFFER_H__
+
+#include <gst/gst.h>
+#include <gst/rtp/gstrtppayloads.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_RTP_VERSION:
+ *
+ * The supported RTP version 2.
+ */
+#define GST_RTP_VERSION 2
+
+
+typedef struct _GstRTPBuffer GstRTPBuffer;
+
+/**
+ * GstRTPBuffer:
+ * @buffer: pointer to RTP buffer
+ *
+ * Data structure that points to an RTP packet.
+ * The size of the structure is made public to allow stack allocations.
+ */
+struct _GstRTPBuffer
+{
+ GstBuffer *buffer;
+ GstMapFlags flags;
+ guint8 *data;
+ gsize size;
+ gsize maxsize;
+};
+
+/* creating buffers */
+void gst_rtp_buffer_allocate_data (GstBuffer *buffer, guint payload_len,
+ guint8 pad_len, guint8 csrc_count);
+
+GstBuffer* gst_rtp_buffer_new_take_data (gpointer data, gsize len);
+GstBuffer* gst_rtp_buffer_new_copy_data (gpointer data, gsize len);
+GstBuffer* gst_rtp_buffer_new_allocate (guint payload_len, guint8 pad_len, guint8 csrc_count);
+GstBuffer* gst_rtp_buffer_new_allocate_len (guint packet_len, guint8 pad_len, guint8 csrc_count);
+
+guint gst_rtp_buffer_calc_header_len (guint8 csrc_count);
+guint gst_rtp_buffer_calc_packet_len (guint payload_len, guint8 pad_len, guint8 csrc_count);
+guint gst_rtp_buffer_calc_payload_len (guint packet_len, guint8 pad_len, guint8 csrc_count);
+
+gboolean gst_rtp_buffer_validate_data (guint8 *data, gsize len);
+gboolean gst_rtp_buffer_validate (GstBuffer *buffer);
+
+
+gboolean gst_rtp_buffer_map (GstBuffer *buffer, GstMapFlags flags, GstRTPBuffer *rtp);
+gboolean gst_rtp_buffer_unmap (GstRTPBuffer *rtp);
+
+void gst_rtp_buffer_set_packet_len (GstRTPBuffer *rtp, guint len);
+guint gst_rtp_buffer_get_packet_len (GstRTPBuffer *rtp);
+
+guint gst_rtp_buffer_get_header_len (GstRTPBuffer *rtp);
+
+guint8 gst_rtp_buffer_get_version (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_version (GstRTPBuffer *rtp, guint8 version);
+
+gboolean gst_rtp_buffer_get_padding (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_padding (GstRTPBuffer *rtp, gboolean padding);
+void gst_rtp_buffer_pad_to (GstRTPBuffer *rtp, guint len);
+
+gboolean gst_rtp_buffer_get_extension (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_extension (GstRTPBuffer *rtp, gboolean extension);
+gboolean gst_rtp_buffer_get_extension_data (GstRTPBuffer *rtp, guint16 *bits,
+ gpointer *data, guint *wordlen);
+gboolean gst_rtp_buffer_set_extension_data (GstRTPBuffer *rtp, guint16 bits, guint16 length);
+
+guint32 gst_rtp_buffer_get_ssrc (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_ssrc (GstRTPBuffer *rtp, guint32 ssrc);
+
+guint8 gst_rtp_buffer_get_csrc_count (GstRTPBuffer *rtp);
+guint32 gst_rtp_buffer_get_csrc (GstRTPBuffer *rtp, guint8 idx);
+void gst_rtp_buffer_set_csrc (GstRTPBuffer *rtp, guint8 idx, guint32 csrc);
+
+gboolean gst_rtp_buffer_get_marker (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_marker (GstRTPBuffer *rtp, gboolean marker);
+
+guint8 gst_rtp_buffer_get_payload_type (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_payload_type (GstRTPBuffer *rtp, guint8 payload_type);
+
+guint16 gst_rtp_buffer_get_seq (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_seq (GstRTPBuffer *rtp, guint16 seq);
+
+guint32 gst_rtp_buffer_get_timestamp (GstRTPBuffer *rtp);
+void gst_rtp_buffer_set_timestamp (GstRTPBuffer *rtp, guint32 timestamp);
+
+GstBuffer* gst_rtp_buffer_get_payload_buffer (GstRTPBuffer *rtp);
+GstBuffer* gst_rtp_buffer_get_payload_subbuffer (GstRTPBuffer *rtp, guint offset, guint len);
+
+guint gst_rtp_buffer_get_payload_len (GstRTPBuffer *rtp);
+gpointer gst_rtp_buffer_get_payload (GstRTPBuffer *rtp);
+
+/* some helpers */
+guint32 gst_rtp_buffer_default_clock_rate (guint8 payload_type);
+gint gst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2);
+guint64 gst_rtp_buffer_ext_timestamp (guint64 *exttimestamp, guint32 timestamp);
+
+gboolean gst_rtp_buffer_get_extension_onebyte_header (GstRTPBuffer *rtp,
+ guint8 id,
+ guint nth,
+ gpointer * data,
+ guint * size);
+gboolean gst_rtp_buffer_get_extension_twobytes_header (GstRTPBuffer *rtp,
+ guint8 * appbits,
+ guint8 id,
+ guint nth,
+ gpointer * data,
+ guint * size);
+
+gboolean gst_rtp_buffer_add_extension_onebyte_header (GstRTPBuffer *rtp,
+ guint8 id,
+ gpointer data,
+ guint size);
+gboolean gst_rtp_buffer_add_extension_twobytes_header (GstRTPBuffer *rtp,
+ guint8 appbits,
+ guint8 id,
+ gpointer data,
+ guint size);
+
+
+G_END_DECLS
+
+#endif /* __GST_RTPBUFFER_H__ */
+
diff --git a/gst-libs/gst/rtp/gstrtppayloads.c b/gst-libs/gst/rtp/gstrtppayloads.c
new file mode 100644
index 0000000..97c0fa9
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtppayloads.c
@@ -0,0 +1,229 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstrtppayloads.h: various helper functions to deal with RTP payload
+ * 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.
+ */
+
+/**
+ * SECTION:gstrtppayloads
+ * @short_description: Helper methods for dealing with RTP payloads
+ * @see_also: gstrtpbuffer
+ *
+ * <refsect2>
+ * <para>
+ * The GstRTPPayloads helper functions makes it easy to deal with static and dynamic
+ * payloads. Its main purpose is to retrieve properties such as the default clock-rate
+ * and get session bandwidth information.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2007-10-01 (0.10.15)
+ */
+
+#include <string.h>
+
+#include "gstrtppayloads.h"
+
+/* pt, encoding_name, media, rate, params, bitrate */
+static const GstRTPPayloadInfo info[] = {
+ /* static audio */
+ {0, "audio", "PCMU", 8000, "1", 64000},
+ /* { 1, "audio", "reserved", 0, NULL, 0 }, */
+ /* { 2, "audio", "reserved", 0, NULL, 0 }, */
+ {3, "audio", "GSM", 8000, "1", 0},
+ {4, "audio", "G723", 8000, "1", 0},
+ {5, "audio", "DVI4", 8000, "1", 32000},
+ {6, "audio", "DVI4", 16000, "1", 64000},
+ {7, "audio", "LPC", 8000, "1", 0},
+ {8, "audio", "PCMA", 8000, "1", 64000},
+ {9, "audio", "G722", 8000, "1", 64000},
+ {10, "audio", "L16", 44100, "2", 1411200},
+ {11, "audio", "L16", 44100, "1", 705600},
+ {12, "audio", "QCELP", 8000, "1", 0},
+ {13, "audio", "CN", 8000, "1", 0},
+ {14, "audio", "MPA", 90000, NULL, 0},
+ {15, "audio", "G728", 8000, "1", 0},
+ {16, "audio", "DVI4", 11025, "1", 44100},
+ {17, "audio", "DVI4", 22050, "1", 88200},
+ {18, "audio", "G729", 8000, "1", 0},
+ /* { 19, "audio", "reserved", 0, NULL, 0 }, */
+ /* { 20, "audio", "unassigned", 0, NULL, 0 }, */
+ /* { 21, "audio", "unassigned", 0, NULL, 0 }, */
+ /* { 22, "audio", "unassigned", 0, NULL, 0 }, */
+ /* { 23, "audio", "unassigned", 0, NULL, 0 }, */
+
+ /* video and video/audio */
+ /* { 24, "video", "unassigned", 0, NULL, 0 }, */
+ {25, "video", "CelB", 90000, NULL, 0},
+ {26, "video", "JPEG", 90000, NULL, 0},
+ /* { 27, "video", "unassigned", 0, NULL, 0 }, */
+ {28, "video", "nv", 90000, NULL, 0},
+ /* { 29, "video", "unassigned", 0, NULL, 0 }, */
+ /* { 30, "video", "unassigned", 0, NULL, 0 }, */
+ {31, "video", "H261", 90000, NULL, 0},
+ {32, "video", "MPV", 90000, NULL, 0},
+ {33, "video", "MP2T", 90000, NULL, 0},
+ {34, "video", "H263", 90000, NULL, 0},
+ /* { 35-71, "unassigned", 0, 0, NULL, 0 }, */
+ /* { 72-76, "reserved", 0, 0, NULL, 0 }, */
+ /* { 77-95, "unassigned", 0, 0, NULL, 0 }, */
+ /* { 96-127, "dynamic", 0, 0, NULL, 0 }, */
+
+ /* dynamic stuff */
+ {G_MAXUINT8, "application", "parityfec", 0, NULL, 0}, /* [RFC3009] */
+ {G_MAXUINT8, "application", "rtx", 0, NULL, 0}, /* [RFC4588] */
+ {G_MAXUINT8, "audio", "AMR", 8000, NULL, 0}, /* [RFC4867][RFC3267] */
+ {G_MAXUINT8, "audio", "AMR-WB", 16000, NULL, 0}, /* [RFC4867][RFC3267] */
+ {G_MAXUINT8, "audio", "DAT12", 0, NULL, 0}, /* [RFC3190] */
+ {G_MAXUINT8, "audio", "dsr-es201108", 0, NULL, 0}, /* [RFC3557] */
+ {G_MAXUINT8, "audio", "EVRC", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "EVRC0", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "EVRC1", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "EVRCB", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "EVRCB0", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "EVRCB1", 8000, "1", 0}, /* [RFC4788] */
+ {G_MAXUINT8, "audio", "G7221", 16000, "1", 0}, /* [RFC3047] */
+ {G_MAXUINT8, "audio", "G726-16", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "G726-24", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "G726-32", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "G726-40", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "G729D", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "G729E", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "GSM-EFR", 8000, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "L8", 0, NULL, 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "RED", 0, NULL, 0}, /* [RFC2198][RFC3555] */
+ {G_MAXUINT8, "audio", "rtx", 0, NULL, 0}, /* [RFC4588] */
+ {G_MAXUINT8, "audio", "VDVI", 0, "1", 0}, /* [RFC3551][RFC4856] */
+ {G_MAXUINT8, "audio", "L20", 0, NULL, 0}, /* [RFC3190] */
+ {G_MAXUINT8, "audio", "L24", 0, NULL, 0}, /* [RFC3190] */
+ {G_MAXUINT8, "audio", "MP4A-LATM", 0, NULL, 0}, /* [RFC3016] */
+ {G_MAXUINT8, "audio", "mpa-robust", 90000, NULL, 0}, /* [RFC3119] */
+ {G_MAXUINT8, "audio", "parityfec", 0, NULL, 0}, /* [RFC3009] */
+ {G_MAXUINT8, "audio", "SMV", 8000, "1", 0}, /* [RFC3558] */
+ {G_MAXUINT8, "audio", "SMV0", 8000, "1", 0}, /* [RFC3558] */
+ {G_MAXUINT8, "audio", "t140c", 0, NULL, 0}, /* [RFC4351] */
+ {G_MAXUINT8, "audio", "t38", 0, NULL, 0}, /* [RFC4612] */
+ {G_MAXUINT8, "audio", "telephone-event", 0, NULL, 0}, /* [RFC4733] */
+ {G_MAXUINT8, "audio", "tone", 0, NULL, 0}, /* [RFC4733] */
+ {G_MAXUINT8, "audio", "DVI4", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "G722", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "G723", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "G728", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "G729", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "GSM", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "L16", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "LPC", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "PCMA", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "audio", "PCMU", 0, NULL, 0}, /* [RFC4856] */
+ {G_MAXUINT8, "text", "parityfec", 0, NULL, 0}, /* [RFC3009] */
+ {G_MAXUINT8, "text", "red", 1000, NULL, 0}, /* [RFC4102] */
+ {G_MAXUINT8, "text", "rtx", 0, NULL, 0}, /* [RFC4588] */
+ {G_MAXUINT8, "text", "t140", 1000, NULL, 0}, /* [RFC4103] */
+ {G_MAXUINT8, "video", "BMPEG", 90000, NULL, 0}, /* [RFC2343][RFC3555] */
+ {G_MAXUINT8, "video", "BT656", 90000, NULL, 0}, /* [RFC2431][RFC3555] */
+ {G_MAXUINT8, "video", "DV", 90000, NULL, 0}, /* [RFC3189] */
+ {G_MAXUINT8, "video", "H263-1998", 90000, NULL, 0}, /* [RFC2429][RFC3555] */
+ {G_MAXUINT8, "video", "H263-2000", 90000, NULL, 0}, /* [RFC2429][RFC3555] */
+ {G_MAXUINT8, "video", "MP1S", 90000, NULL, 0}, /* [RFC2250][RFC3555] */
+ {G_MAXUINT8, "video", "MP2P", 90000, NULL, 0}, /* [RFC2250][RFC3555] */
+ {G_MAXUINT8, "video", "MP4V-ES", 90000, NULL, 0}, /* [RFC3016] */
+ {G_MAXUINT8, "video", "parityfec", 0, NULL, 0}, /* [RFC3009] */
+ {G_MAXUINT8, "video", "pointer", 90000, NULL, 0}, /* [RFC2862] */
+ {G_MAXUINT8, "video", "raw", 90000, NULL, 0}, /* [RFC4175] */
+ {G_MAXUINT8, "video", "rtx", 0, NULL, 0}, /* [RFC4588] */
+ {G_MAXUINT8, "video", "SMPTE292M", 0, NULL, 0}, /* [RFC3497] */
+ {G_MAXUINT8, "video", "vc1", 90000, NULL, 0}, /* [RFC4425] */
+
+ /* not in http://www.iana.org/assignments/rtp-parameters */
+ {G_MAXUINT8, "audio", "AC3", 0, NULL, 0},
+ {G_MAXUINT8, "audio", "ILBC", 8000, NULL, 0},
+ {G_MAXUINT8, "audio", "MPEG4-GENERIC", 0, NULL, 0},
+ {G_MAXUINT8, "audio", "SPEEX", 0, NULL, 0},
+
+ {G_MAXUINT8, "application", "MPEG4-GENERIC", 0, NULL, 0},
+
+ {G_MAXUINT8, "video", "H264", 90000, NULL, 0},
+ {G_MAXUINT8, "video", "MPEG4-GENERIC", 90000, NULL, 0},
+ {G_MAXUINT8, "video", "THEORA", 0, NULL, 0},
+ {G_MAXUINT8, "video", "VORBIS", 0, NULL, 0},
+ {G_MAXUINT8, "video", "X-SV3V-ES", 90000, NULL, 0},
+ {G_MAXUINT8, "video", "X-SORENSON-VIDEO", 90000, NULL, 0},
+
+ /* real stuff */
+ {G_MAXUINT8, "video", "x-pn-realvideo", 1000, NULL, 0},
+ {G_MAXUINT8, "audio", "x-pn-realaudio", 1000, NULL, 0},
+ {G_MAXUINT8, "application", "x-pn-realmedia", 1000, NULL, 0},
+
+ /* terminator */
+ {G_MAXUINT8, NULL, NULL, 0, NULL, 0}
+};
+
+/**
+ * gst_rtp_payload_info_for_pt:
+ * @payload_type: the payload_type to find
+ *
+ * Get the #GstRTPPayloadInfo for @payload_type. This function is
+ * mostly used to get the default clock-rate and bandwidth for static payload
+ * types specified with @payload_type.
+ *
+ * Returns: a #GstRTPPayloadInfo or NULL when no info could be found.
+ */
+const GstRTPPayloadInfo *
+gst_rtp_payload_info_for_pt (guint8 payload_type)
+{
+ const GstRTPPayloadInfo *result = NULL;
+ gint i;
+
+ for (i = 0; info[i].media; i++) {
+ if (info[i].payload_type == payload_type) {
+ result = &info[i];
+ break;
+ }
+ }
+ return result;
+}
+
+/**
+ * gst_rtp_payload_info_for_name:
+ * @media: the media to find
+ * @encoding_name: the encoding name to find
+ *
+ * Get the #GstRTPPayloadInfo for @media and @encoding_name. This function is
+ * mostly used to get the default clock-rate and bandwidth for dynamic payload
+ * types specified with @media and @encoding name.
+ *
+ * The search for @encoding_name will be performed in a case insensitve way.
+ *
+ * Returns: a #GstRTPPayloadInfo or NULL when no info could be found.
+ */
+const GstRTPPayloadInfo *
+gst_rtp_payload_info_for_name (const gchar * media, const gchar * encoding_name)
+{
+ const GstRTPPayloadInfo *result = NULL;
+ gint i;
+
+ for (i = 0; info[i].media; i++) {
+ if (strcmp (media, info[i].media) == 0
+ && g_ascii_strcasecmp (encoding_name, info[i].encoding_name) == 0) {
+ result = &info[i];
+ break;
+ }
+ }
+ return result;
+}
diff --git a/gst-libs/gst/rtp/gstrtppayloads.h b/gst-libs/gst/rtp/gstrtppayloads.h
new file mode 100644
index 0000000..3563468
--- /dev/null
+++ b/gst-libs/gst/rtp/gstrtppayloads.h
@@ -0,0 +1,193 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstrtppayloads.h: various helper functions to deal with RTP payload
+ * 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_RTPPAYLOADS_H__
+#define __GST_RTPPAYLOADS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstRTPPayload:
+ * @GST_RTP_PAYLOAD_PCMU: ITU-T G.711. mu-law audio (RFC 3551)
+ * @GST_RTP_PAYLOAD_1016: RFC 3551 says reserved
+ * @GST_RTP_PAYLOAD_G721: RFC 3551 says reserved
+ * @GST_RTP_PAYLOAD_GSM: GSM audio
+ * @GST_RTP_PAYLOAD_G723: ITU G.723.1 audio
+ * @GST_RTP_PAYLOAD_DVI4_8000: IMA ADPCM wave type (RFC 3551)
+ * @GST_RTP_PAYLOAD_DVI4_16000: IMA ADPCM wave type (RFC 3551)
+ * @GST_RTP_PAYLOAD_LPC: experimental linear predictive encoding
+ * @GST_RTP_PAYLOAD_PCMA: ITU-T G.711 A-law audio (RFC 3551)
+ * @GST_RTP_PAYLOAD_G722: ITU-T G.722 (RFC 3551)
+ * @GST_RTP_PAYLOAD_L16_STEREO: stereo PCM
+ * @GST_RTP_PAYLOAD_L16_MONO: mono PCM
+ * @GST_RTP_PAYLOAD_QCELP: EIA & TIA standard IS-733
+ * @GST_RTP_PAYLOAD_CN: Comfort Noise (RFC 3389)
+ * @GST_RTP_PAYLOAD_MPA: Audio MPEG 1-3.
+ * @GST_RTP_PAYLOAD_G728: ITU-T G.728 Speech coder (RFC 3551)
+ * @GST_RTP_PAYLOAD_DVI4_11025: IMA ADPCM wave type (RFC 3551)
+ * @GST_RTP_PAYLOAD_DVI4_22050: IMA ADPCM wave type (RFC 3551)
+ * @GST_RTP_PAYLOAD_G729: ITU-T G.729 Speech coder (RFC 3551)
+ * @GST_RTP_PAYLOAD_CELLB: See RFC 2029
+ * @GST_RTP_PAYLOAD_JPEG: ISO Standards 10918-1 and 10918-2 (RFC 2435)
+ * @GST_RTP_PAYLOAD_NV: nv encoding by Ron Frederick
+ * @GST_RTP_PAYLOAD_H261: ITU-T Recommendation H.261 (RFC 2032)
+ * @GST_RTP_PAYLOAD_MPV: Video MPEG 1 & 2 (RFC 2250)
+ * @GST_RTP_PAYLOAD_MP2T: MPEG-2 transport stream (RFC 2250)
+ * @GST_RTP_PAYLOAD_H263: Video H263 (RFC 2190)
+ *
+ *
+ * Standard predefined fixed payload types.
+ *
+ * The official list is at:
+ * http://www.iana.org/assignments/rtp-parameters
+ *
+ * Audio:
+ * reserved: 19
+ * unassigned: 20-23,
+ *
+ * Video:
+ * unassigned: 24, 27, 29, 30, 35-71, 77-95
+ * Reserved for RTCP conflict avoidance: 72-76
+ */
+typedef enum
+{
+ /* Audio: */
+ GST_RTP_PAYLOAD_PCMU = 0,
+ GST_RTP_PAYLOAD_1016 = 1, /* RFC 3551 says reserved */
+ GST_RTP_PAYLOAD_G721 = 2, /* RFC 3551 says reserved */
+ GST_RTP_PAYLOAD_GSM = 3,
+ GST_RTP_PAYLOAD_G723 = 4,
+ GST_RTP_PAYLOAD_DVI4_8000 = 5,
+ GST_RTP_PAYLOAD_DVI4_16000 = 6,
+ GST_RTP_PAYLOAD_LPC = 7,
+ GST_RTP_PAYLOAD_PCMA = 8,
+ GST_RTP_PAYLOAD_G722 = 9,
+ GST_RTP_PAYLOAD_L16_STEREO = 10,
+ GST_RTP_PAYLOAD_L16_MONO = 11,
+ GST_RTP_PAYLOAD_QCELP = 12,
+ GST_RTP_PAYLOAD_CN = 13,
+ GST_RTP_PAYLOAD_MPA = 14,
+ GST_RTP_PAYLOAD_G728 = 15,
+ GST_RTP_PAYLOAD_DVI4_11025 = 16,
+ GST_RTP_PAYLOAD_DVI4_22050 = 17,
+ GST_RTP_PAYLOAD_G729 = 18,
+
+ /* Video: */
+
+ GST_RTP_PAYLOAD_CELLB = 25,
+ GST_RTP_PAYLOAD_JPEG = 26,
+ GST_RTP_PAYLOAD_NV = 28,
+ GST_RTP_PAYLOAD_H261 = 31,
+ GST_RTP_PAYLOAD_MPV = 32,
+ GST_RTP_PAYLOAD_MP2T = 33,
+ GST_RTP_PAYLOAD_H263 = 34,
+
+ /* BOTH */
+} GstRTPPayload;
+
+/* backward compatibility */
+#define GST_RTP_PAYLOAD_G723_63 16
+#define GST_RTP_PAYLOAD_G723_53 17
+#define GST_RTP_PAYLOAD_TS48 18
+#define GST_RTP_PAYLOAD_TS41 19
+
+#define GST_RTP_PAYLOAD_G723_63_STRING "16"
+#define GST_RTP_PAYLOAD_G723_53_STRING "17"
+#define GST_RTP_PAYLOAD_TS48_STRING "18"
+#define GST_RTP_PAYLOAD_TS41_STRING "19"
+
+/* Defining the above as strings, to make the declaration of pad_templates
+ * easier. So if please keep these synchronized with the above.
+ */
+#define GST_RTP_PAYLOAD_PCMU_STRING "0"
+#define GST_RTP_PAYLOAD_1016_STRING "1"
+#define GST_RTP_PAYLOAD_G721_STRING "2"
+#define GST_RTP_PAYLOAD_GSM_STRING "3"
+#define GST_RTP_PAYLOAD_G723_STRING "4"
+#define GST_RTP_PAYLOAD_DVI4_8000_STRING "5"
+#define GST_RTP_PAYLOAD_DVI4_16000_STRING "6"
+#define GST_RTP_PAYLOAD_LPC_STRING "7"
+#define GST_RTP_PAYLOAD_PCMA_STRING "8"
+#define GST_RTP_PAYLOAD_G722_STRING "9"
+#define GST_RTP_PAYLOAD_L16_STEREO_STRING "10"
+#define GST_RTP_PAYLOAD_L16_MONO_STRING "11"
+#define GST_RTP_PAYLOAD_QCELP_STRING "12"
+#define GST_RTP_PAYLOAD_CN_STRING "13"
+#define GST_RTP_PAYLOAD_MPA_STRING "14"
+#define GST_RTP_PAYLOAD_G728_STRING "15"
+#define GST_RTP_PAYLOAD_DVI4_11025_STRING "16"
+#define GST_RTP_PAYLOAD_DVI4_22050_STRING "17"
+#define GST_RTP_PAYLOAD_G729_STRING "18"
+
+#define GST_RTP_PAYLOAD_CELLB_STRING "25"
+#define GST_RTP_PAYLOAD_JPEG_STRING "26"
+#define GST_RTP_PAYLOAD_NV_STRING "28"
+
+#define GST_RTP_PAYLOAD_H261_STRING "31"
+#define GST_RTP_PAYLOAD_MPV_STRING "32"
+#define GST_RTP_PAYLOAD_MP2T_STRING "33"
+#define GST_RTP_PAYLOAD_H263_STRING "34"
+
+#define GST_RTP_PAYLOAD_DYNAMIC_STRING "[96, 127]"
+
+/**
+ * GST_RTP_PAYLOAD_IS_DYNAMIC:
+ * @pt: a payload type
+ *
+ * Check if @pt is a dynamic payload type.
+ */
+#define GST_RTP_PAYLOAD_IS_DYNAMIC(pt) ((pt) >= 96 && (pt) <= 127)
+
+typedef struct _GstRTPPayloadInfo GstRTPPayloadInfo;
+
+/**
+ * GstRTPPayloadInfo:
+ * @payload_type: payload type, -1 means dynamic
+ * @media: the media type(s), usually "audio", "video", "application", "text",
+ * "message".
+ * @encoding_name: the encoding name of @pt
+ * @clock_rate: default clock rate, 0 = unknown/variable
+ * @encoding_parameters: encoding parameters. For audio this is the number of
+ * channels. NULL = not applicable.
+ * @bitrate: the bitrate of the media. 0 = unknown/variable.
+ *
+ * Structure holding default payload type information.
+ */
+struct _GstRTPPayloadInfo
+{
+ guint8 payload_type;
+ const gchar *media;
+ const gchar *encoding_name;
+ guint clock_rate;
+ const gchar *encoding_parameters;
+ guint bitrate;
+};
+
+const GstRTPPayloadInfo * gst_rtp_payload_info_for_pt (guint8 payload_type);
+const GstRTPPayloadInfo * gst_rtp_payload_info_for_name (const gchar *media, const gchar *encoding_name);
+
+G_END_DECLS
+
+#endif /* __GST_RTPPAYLOADS_H__ */
+
diff --git a/gst-libs/gst/rtsp/Makefile.am b/gst-libs/gst/rtsp/Makefile.am
new file mode 100644
index 0000000..74adf9e
--- /dev/null
+++ b/gst-libs/gst/rtsp/Makefile.am
@@ -0,0 +1,121 @@
+libgstrtspincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/rtsp
+
+libgstrtspinclude_HEADERS = gstrtspbase64.h \
+ gstrtsptransport.h \
+ gstrtspurl.h \
+ gstrtspmessage.h \
+ gstrtspconnection.h \
+ gstrtspdefs.h \
+ gstrtspextension.h \
+ gstrtsprange.h
+
+#gstrtspextreal.h
+#gstrtspextwms.h
+
+lib_LTLIBRARIES = libgstrtsp-@GST_MAJORMINOR@.la
+
+built_sources = gstrtsp-marshal.c gstrtsp-enumtypes.c
+built_headers = gstrtsp-marshal.h gstrtsp-enumtypes.h
+
+libgstrtsp_@GST_MAJORMINOR@_la_SOURCES = gstrtspbase64.c \
+ gstrtsptransport.c \
+ gstrtspurl.c \
+ gstrtspmessage.c \
+ gstrtspconnection.c \
+ gstrtspdefs.c \
+ gstrtspextension.c \
+ gstrtsprange.c
+
+nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES = $(built_sources)
+nodist_libgstrtspinclude_HEADERS = gstrtsp-enumtypes.h
+
+noinst_HEADERS = gstrtsp.h
+
+#gstrtspextwms.c
+#rtspextreal.c
+
+libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstrtsp_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(WIN32_LIBS) $(HSTRERROR_LIBS)
+libgstrtsp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+BUILT_SOURCES = $(built_headers) $(built_sources)
+EXTRA_DIST = gstrtsp-marshal.list
+CLEANFILES = $(BUILT_SOURCES)
+
+glib_gen_prefix = __gst_rtsp
+glib_enum_define = gst_rtsp
+glib_enum_headers = gstrtspdefs.h
+glib_gen_basename = gstrtsp
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstRtsp-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstrtspinclude_HEADERS))
+gir_headers+=$(patsubst %,$(builddir)/%, $(nodist_libgstrtspinclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/rtsp/%',$(libgstrtspinclude_HEADERS))
+gir_cincludes+=$(patsubst %,--c-include='gst/rtsp/%',$(nodist_libgstrtspinclude_HEADERS))
+
+GstRtsp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtsp-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstRtsp \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_builddir)/gst-libs \
+ -I$(top_srcdir)/gst-libs \
+ --add-include-path=$(builddir)/../sdp \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstrtsp-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstSdp-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-sdp-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-rtsp-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=$(builddir)/../sdp \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstrtsp -:SHARED libgstrtsp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstrtsp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstrtsp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/rtsp \
+ -:HEADERS $(libgstrtspinclude_HEADERS) \
+ $(nodist_libgstrtspinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/rtsp/Makefile.in b/gst-libs/gst/rtsp/Makefile.in
new file mode 100644
index 0000000..52b7129
--- /dev/null
+++ b/gst-libs/gst/rtsp/Makefile.in
@@ -0,0 +1,1099 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstrtspinclude_HEADERS) $(noinst_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/gst-glib-gen.mak
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/rtsp
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstrtspincludedir)" \
+ "$(DESTDIR)$(libgstrtspincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstrtsp_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo
+am__objects_1 = libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo \
+ libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo
+nodist_libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS = $(am__objects_1)
+libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstrtsp_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstrtsp_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstrtspinclude_HEADERS) \
+ $(nodist_libgstrtspinclude_HEADERS) $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+libgstrtspincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/rtsp
+libgstrtspinclude_HEADERS = gstrtspbase64.h \
+ gstrtsptransport.h \
+ gstrtspurl.h \
+ gstrtspmessage.h \
+ gstrtspconnection.h \
+ gstrtspdefs.h \
+ gstrtspextension.h \
+ gstrtsprange.h
+
+
+#gstrtspextreal.h
+#gstrtspextwms.h
+lib_LTLIBRARIES = libgstrtsp-@GST_MAJORMINOR@.la
+built_sources = gstrtsp-marshal.c gstrtsp-enumtypes.c
+built_headers = gstrtsp-marshal.h gstrtsp-enumtypes.h
+libgstrtsp_@GST_MAJORMINOR@_la_SOURCES = gstrtspbase64.c \
+ gstrtsptransport.c \
+ gstrtspurl.c \
+ gstrtspmessage.c \
+ gstrtspconnection.c \
+ gstrtspdefs.c \
+ gstrtspextension.c \
+ gstrtsprange.c
+
+nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES = $(built_sources)
+nodist_libgstrtspinclude_HEADERS = gstrtsp-enumtypes.h
+noinst_HEADERS = gstrtsp.h
+
+#gstrtspextwms.c
+#rtspextreal.c
+libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstrtsp_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(WIN32_LIBS) $(HSTRERROR_LIBS)
+libgstrtsp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+BUILT_SOURCES = $(built_headers) $(built_sources)
+EXTRA_DIST = gstrtsp-marshal.list
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+glib_gen_prefix = __gst_rtsp
+glib_enum_define = gst_rtsp
+glib_enum_headers = gstrtspdefs.h
+glib_gen_basename = gstrtsp
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstRtsp-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstrtspinclude_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstrtspinclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/rtsp/%',$(libgstrtspinclude_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/rtsp/%',$(nodist_libgstrtspinclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/rtsp/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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-@GST_MAJORMINOR@.la: $(libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstrtsp_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstrtsp_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstrtsp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstrtsp_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo: gstrtspbase64.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo `test -f 'gstrtspbase64.c' || echo '$(srcdir)/'`gstrtspbase64.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspbase64.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspbase64.lo `test -f 'gstrtspbase64.c' || echo '$(srcdir)/'`gstrtspbase64.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo: gstrtsptransport.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo `test -f 'gstrtsptransport.c' || echo '$(srcdir)/'`gstrtsptransport.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtsptransport.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsptransport.lo `test -f 'gstrtsptransport.c' || echo '$(srcdir)/'`gstrtsptransport.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo: gstrtspurl.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo `test -f 'gstrtspurl.c' || echo '$(srcdir)/'`gstrtspurl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspurl.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspurl.lo `test -f 'gstrtspurl.c' || echo '$(srcdir)/'`gstrtspurl.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo: gstrtspmessage.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo `test -f 'gstrtspmessage.c' || echo '$(srcdir)/'`gstrtspmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspmessage.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspmessage.lo `test -f 'gstrtspmessage.c' || echo '$(srcdir)/'`gstrtspmessage.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo: gstrtspconnection.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo `test -f 'gstrtspconnection.c' || echo '$(srcdir)/'`gstrtspconnection.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspconnection.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspconnection.lo `test -f 'gstrtspconnection.c' || echo '$(srcdir)/'`gstrtspconnection.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo: gstrtspdefs.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo `test -f 'gstrtspdefs.c' || echo '$(srcdir)/'`gstrtspdefs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspdefs.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspdefs.lo `test -f 'gstrtspdefs.c' || echo '$(srcdir)/'`gstrtspdefs.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo: gstrtspextension.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo `test -f 'gstrtspextension.c' || echo '$(srcdir)/'`gstrtspextension.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtspextension.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtspextension.lo `test -f 'gstrtspextension.c' || echo '$(srcdir)/'`gstrtspextension.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo: gstrtsprange.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo `test -f 'gstrtsprange.c' || echo '$(srcdir)/'`gstrtsprange.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtsprange.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsprange.lo `test -f 'gstrtsprange.c' || echo '$(srcdir)/'`gstrtsprange.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo: gstrtsp-marshal.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo `test -f 'gstrtsp-marshal.c' || echo '$(srcdir)/'`gstrtsp-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtsp-marshal.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-marshal.lo `test -f 'gstrtsp-marshal.c' || echo '$(srcdir)/'`gstrtsp-marshal.c
+
+libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo: gstrtsp-enumtypes.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) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.Tpo -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo `test -f 'gstrtsp-enumtypes.c' || echo '$(srcdir)/'`gstrtsp-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.Tpo $(DEPDIR)/libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstrtsp-enumtypes.c' object='libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_@GST_MAJORMINOR@_la-gstrtsp-enumtypes.lo `test -f 'gstrtsp-enumtypes.c' || echo '$(srcdir)/'`gstrtsp-enumtypes.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstrtspincludeHEADERS: $(libgstrtspinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstrtspincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstrtspincludedir)"
+ @list='$(libgstrtspinclude_HEADERS)'; test -n "$(libgstrtspincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstrtspincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstrtspincludedir)" || exit $$?; \
+ done
+
+uninstall-libgstrtspincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstrtspinclude_HEADERS)'; test -n "$(libgstrtspincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstrtspincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstrtspincludedir)" && rm -f $$files
+install-nodist_libgstrtspincludeHEADERS: $(nodist_libgstrtspinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstrtspincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstrtspincludedir)"
+ @list='$(nodist_libgstrtspinclude_HEADERS)'; test -n "$(libgstrtspincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstrtspincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstrtspincludedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstrtspincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstrtspinclude_HEADERS)'; test -n "$(libgstrtspincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstrtspincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstrtspincludedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstrtspincludedir)" "$(DESTDIR)$(libgstrtspincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA install-libgstrtspincludeHEADERS \
+ install-nodist_libgstrtspincludeHEADERS install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstrtspincludeHEADERS \
+ uninstall-nodist_libgstrtspincludeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgstrtspincludeHEADERS \
+ install-man install-nodist_libgstrtspincludeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES uninstall-libgstrtspincludeHEADERS \
+ uninstall-nodist_libgstrtspincludeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstRtsp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtsp-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstRtsp \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(builddir)/../sdp \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstrtsp-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstSdp-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-sdp-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-rtsp-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir)/../sdp \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstrtsp -:SHARED libgstrtsp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstrtsp_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstrtsp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstrtsp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstrtsp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/rtsp \
+ -:HEADERS $(libgstrtspinclude_HEADERS) \
+ $(nodist_libgstrtspinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/rtsp/gstrtsp-marshal.list b/gst-libs/gst/rtsp/gstrtsp-marshal.list
new file mode 100644
index 0000000..40b8c72
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsp-marshal.list
@@ -0,0 +1,2 @@
+# rtsp marshallers
+ENUM:POINTER,POINTER
diff --git a/gst-libs/gst/rtsp/gstrtsp.h b/gst-libs/gst/rtsp/gstrtsp.h
new file mode 100644
index 0000000..0632196
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsp.h
@@ -0,0 +1,27 @@
+/* GStreamer RTSP extension
+ * Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * rtsp.h: Generic include to pull in defs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __RTSP_H__
+#define __RTSP_H__
+
+#include <gst/rtsp/gstrtspdefs.h>
+#include <gst/rtsp/gstrtsp-enumtypes.h>
+
+#endif
diff --git a/gst-libs/gst/rtsp/gstrtspbase64.c b/gst-libs/gst/rtsp/gstrtspbase64.c
new file mode 100644
index 0000000..a1064d6
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspbase64.c
@@ -0,0 +1,91 @@
+/* GStreamer
+ * Copyright (C) <2007> Mike Smith <msmith@xiph.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.
+ */
+
+/**
+ * SECTION:gstrtspbase64
+ * @short_description: Helper functions to handle Base64
+ *
+ * Last reviewed on 2007-07-24 (0.10.14)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gstrtspbase64.h"
+
+/**
+ * gst_rtsp_base64_encode:
+ * @data: the binary data to encode
+ * @len: the length of @data
+ *
+ * Encode a sequence of binary data into its Base-64 stringified representation.
+ *
+ * Deprecated: Use g_base64_encode()
+ *
+ * Returns: a newly allocated, zero-terminated Base-64 encoded string
+ * representing @data.
+ */
+/* This isn't efficient, but it doesn't need to be */
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+gchar *gst_rtsp_base64_encode (const gchar * data, gsize len);
+#endif
+gchar *
+gst_rtsp_base64_encode (const gchar * data, gsize len)
+{
+ return g_base64_encode ((const guchar *) data, len);
+}
+#endif
+
+/**
+ * gst_rtsp_base64_decode_ip:
+ * @data: the base64 encoded data
+ * @len: location for output length or NULL
+ *
+ * Decode the base64 string pointed to by @data in-place. When @len is not #NULL
+ * it will contain the length of the decoded data.
+ *
+ * Deprecated: use g_base64_decode_inplace() instead.
+ */
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+void gst_rtsp_base64_decode_ip (gchar * data, gsize * len);
+#endif
+void
+gst_rtsp_base64_decode_ip (gchar * data, gsize * len)
+{
+ gint input_length, output_length, state = 0;
+ guint save = 0;
+
+ g_return_if_fail (data != NULL);
+
+ input_length = strlen (data);
+
+ g_return_if_fail (input_length > 1);
+
+ output_length =
+ g_base64_decode_step (data, input_length, (guchar *) data, &state, &save);
+
+ if (len)
+ *len = output_length;
+}
+#endif
diff --git a/gst-libs/gst/rtsp/gstrtspbase64.h b/gst-libs/gst/rtsp/gstrtspbase64.h
new file mode 100644
index 0000000..1501c10
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspbase64.h
@@ -0,0 +1,37 @@
+/* GStreamer
+ * Copyright (C) <2007> Mike Smith <msmith@xiph.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RTSP_BASE64_H__
+#define __GST_RTSP_BASE64_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#ifndef GST_DISABLE_DEPRECATED
+gchar *gst_rtsp_base64_encode (const gchar *data, gsize len);
+#endif
+
+#ifndef GST_DISABLE_DEPRECATED
+void gst_rtsp_base64_decode_ip (gchar *data, gsize *len);
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_BASE64_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c
new file mode 100644
index 0000000..2de21b9
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspconnection.c
@@ -0,0 +1,3678 @@
+/* GStreamer
+ * Copyright (C) <2005-2009> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/*
+ * 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:gstrtspconnection
+ * @short_description: manage RTSP connections
+ * @see_also: gstrtspurl
+ *
+ * This object manages the RTSP connection to the server. It provides function
+ * to receive and send bytes and messages.
+ *
+ * Last reviewed on 2007-07-24 (0.10.14)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* we include this here to get the G_OS_* defines */
+#include <glib.h>
+#include <gst/gst.h>
+
+#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 <winsock2.h>
+#include <ws2tcpip.h>
+#define EINPROGRESS WSAEINPROGRESS
+#else
+#include <sys/ioctl.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_FIONREAD_IN_SYS_FILIO
+#include <sys/filio.h>
+#endif
+
+#include "gstrtspconnection.h"
+#include "gstrtspbase64.h"
+
+union gst_sockaddr
+{
+ struct sockaddr sa;
+ struct sockaddr_in sa_in;
+ struct sockaddr_in6 sa_in6;
+ struct sockaddr_storage sa_stor;
+};
+
+typedef struct
+{
+ gint state;
+ guint save;
+ guchar out[3]; /* the size must be evenly divisible by 3 */
+ guint cout;
+ guint coutl;
+} DecodeCtx;
+
+#ifdef MSG_NOSIGNAL
+#define SEND_FLAGS MSG_NOSIGNAL
+#else
+#define SEND_FLAGS 0
+#endif
+
+#ifdef G_OS_WIN32
+#define READ_SOCKET(fd, buf, len) recv (fd, (char *)buf, len, 0)
+#define WRITE_SOCKET(fd, buf, len) send (fd, (const char *)buf, len, SEND_FLAGS)
+#define SETSOCKOPT(sock, level, name, val, len) setsockopt (sock, level, name, (const char *)val, len)
+#define CLOSE_SOCKET(sock) closesocket (sock)
+#define ERRNO_IS_EAGAIN (WSAGetLastError () == WSAEWOULDBLOCK)
+#define ERRNO_IS_EINTR (WSAGetLastError () == WSAEINTR)
+/* According to Microsoft's connect() documentation this one returns
+ * WSAEWOULDBLOCK and not WSAEINPROGRESS. */
+#define ERRNO_IS_EINPROGRESS (WSAGetLastError () == WSAEWOULDBLOCK)
+#else
+#define READ_SOCKET(fd, buf, len) read (fd, buf, len)
+#define WRITE_SOCKET(fd, buf, len) send (fd, buf, len, SEND_FLAGS)
+#define SETSOCKOPT(sock, level, name, val, len) setsockopt (sock, level, name, val, len)
+#define CLOSE_SOCKET(sock) close (sock)
+#define ERRNO_IS_EAGAIN (errno == EAGAIN)
+#define ERRNO_IS_EINTR (errno == EINTR)
+#define ERRNO_IS_EINPROGRESS (errno == EINPROGRESS)
+#endif
+
+#define ADD_POLLFD(fdset, pfd, fd) \
+G_STMT_START { \
+ (pfd)->fd = fd; \
+ gst_poll_add_fd (fdset, pfd); \
+} G_STMT_END
+
+#define REMOVE_POLLFD(fdset, pfd) \
+G_STMT_START { \
+ if ((pfd)->fd != -1) { \
+ GST_DEBUG ("remove fd %d", (pfd)->fd); \
+ gst_poll_remove_fd (fdset, pfd); \
+ CLOSE_SOCKET ((pfd)->fd); \
+ (pfd)->fd = -1; \
+ } \
+} G_STMT_END
+
+typedef enum
+{
+ TUNNEL_STATE_NONE,
+ TUNNEL_STATE_GET,
+ TUNNEL_STATE_POST,
+ TUNNEL_STATE_COMPLETE
+} GstRTSPTunnelState;
+
+#define TUNNELID_LEN 24
+
+struct _GstRTSPConnection
+{
+ /*< private > */
+ /* URL for the connection */
+ GstRTSPUrl *url;
+
+ /* connection state */
+ GstPollFD fd0;
+ GstPollFD fd1;
+
+ GstPollFD *readfd;
+ GstPollFD *writefd;
+
+ gboolean manual_http;
+
+ gchar tunnelid[TUNNELID_LEN];
+ gboolean tunneled;
+ GstRTSPTunnelState tstate;
+
+ GstPoll *fdset;
+ gchar *ip;
+
+ gint read_ahead;
+
+ gchar *initial_buffer;
+ gsize initial_buffer_offset;
+
+ /* Session state */
+ gint cseq; /* sequence number */
+ gchar session_id[512]; /* session id */
+ gint timeout; /* session timeout in seconds */
+ GTimer *timer; /* timeout timer */
+
+ /* Authentication */
+ GstRTSPAuthMethod auth_method;
+ gchar *username;
+ gchar *passwd;
+ GHashTable *auth_params;
+
+ DecodeCtx ctx;
+ DecodeCtx *ctxp;
+
+ gchar *proxy_host;
+ guint proxy_port;
+};
+
+enum
+{
+ STATE_START = 0,
+ STATE_DATA_HEADER,
+ STATE_DATA_BODY,
+ STATE_READ_LINES,
+ STATE_END,
+ STATE_LAST
+};
+
+enum
+{
+ READ_AHEAD_EOH = -1, /* end of headers */
+ READ_AHEAD_CRLF = -2,
+ READ_AHEAD_CRLFCR = -3
+};
+
+/* a structure for constructing RTSPMessages */
+typedef struct
+{
+ gint state;
+ GstRTSPResult status;
+ guint8 buffer[4096];
+ guint offset;
+
+ guint line;
+ guint8 *body_data;
+ glong body_len;
+} GstRTSPBuilder;
+
+static void
+build_reset (GstRTSPBuilder * builder)
+{
+ g_free (builder->body_data);
+ memset (builder, 0, sizeof (GstRTSPBuilder));
+}
+
+/**
+ * gst_rtsp_connection_create:
+ * @url: a #GstRTSPUrl
+ * @conn: storage for a #GstRTSPConnection
+ *
+ * Create a newly allocated #GstRTSPConnection from @url and store it in @conn.
+ * The connection will not yet attempt to connect to @url, use
+ * gst_rtsp_connection_connect().
+ *
+ * A copy of @url will be made.
+ *
+ * Returns: #GST_RTSP_OK when @conn contains a valid connection.
+ */
+GstRTSPResult
+gst_rtsp_connection_create (const GstRTSPUrl * url, GstRTSPConnection ** conn)
+{
+ GstRTSPConnection *newconn;
+#ifdef G_OS_WIN32
+ WSADATA w;
+ int error;
+#endif
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+#ifdef G_OS_WIN32
+ error = WSAStartup (0x0202, &w);
+
+ if (error)
+ goto startup_error;
+
+ if (w.wVersion != 0x0202)
+ goto version_error;
+#endif
+
+ newconn = g_new0 (GstRTSPConnection, 1);
+
+ if ((newconn->fdset = gst_poll_new (TRUE)) == NULL)
+ goto no_fdset;
+
+ newconn->url = gst_rtsp_url_copy (url);
+ newconn->fd0.fd = -1;
+ newconn->fd1.fd = -1;
+ newconn->timer = g_timer_new ();
+ newconn->timeout = 60;
+ newconn->cseq = 1;
+
+ newconn->auth_method = GST_RTSP_AUTH_NONE;
+ newconn->username = NULL;
+ newconn->passwd = NULL;
+ newconn->auth_params = NULL;
+
+ *conn = newconn;
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+#ifdef G_OS_WIN32
+startup_error:
+ {
+ g_warning ("Error %d on WSAStartup", error);
+ return GST_RTSP_EWSASTART;
+ }
+version_error:
+ {
+ g_warning ("Windows sockets are not version 0x202 (current 0x%x)",
+ w.wVersion);
+ WSACleanup ();
+ return GST_RTSP_EWSAVERSION;
+ }
+#endif
+no_fdset:
+ {
+ g_free (newconn);
+#ifdef G_OS_WIN32
+ WSACleanup ();
+#endif
+ return GST_RTSP_ESYS;
+ }
+}
+
+/**
+ * gst_rtsp_connection_create_from_fd:
+ * @fd: a file descriptor
+ * @ip: the IP address of the other end
+ * @port: the port used by the other end
+ * @initial_buffer: data already read from @fd
+ * @conn: storage for a #GstRTSPConnection
+ *
+ * Create a new #GstRTSPConnection for handling communication on the existing
+ * file descriptor @fd. The @initial_buffer contains any data already read from
+ * @fd which should be used before starting to read new data.
+ *
+ * Returns: #GST_RTSP_OK when @conn contains a valid connection.
+ *
+ * Since: 0.10.25
+ */
+GstRTSPResult
+gst_rtsp_connection_create_from_fd (gint fd, const gchar * ip, guint16 port,
+ const gchar * initial_buffer, GstRTSPConnection ** conn)
+{
+ GstRTSPConnection *newconn = NULL;
+ GstRTSPUrl *url;
+#ifdef G_OS_WIN32
+ gulong flags = 1;
+#endif
+ GstRTSPResult res;
+
+ g_return_val_if_fail (fd >= 0, GST_RTSP_EINVAL);
+ g_return_val_if_fail (ip != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ /* set to non-blocking mode so that we can cancel the communication */
+#ifndef G_OS_WIN32
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+#else
+ ioctlsocket (fd, FIONBIO, &flags);
+#endif /* G_OS_WIN32 */
+
+ /* create a url for the client address */
+ url = g_new0 (GstRTSPUrl, 1);
+ url->host = g_strdup (ip);
+ url->port = port;
+
+ /* now create the connection object */
+ GST_RTSP_CHECK (gst_rtsp_connection_create (url, &newconn), newconn_failed);
+ gst_rtsp_url_free (url);
+
+ ADD_POLLFD (newconn->fdset, &newconn->fd0, fd);
+
+ /* both read and write initially */
+ newconn->readfd = &newconn->fd0;
+ newconn->writefd = &newconn->fd0;
+
+ newconn->ip = g_strdup (ip);
+
+ newconn->initial_buffer = g_strdup (initial_buffer);
+
+ *conn = newconn;
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+newconn_failed:
+ {
+ gst_rtsp_url_free (url);
+ return res;
+ }
+}
+
+/**
+ * gst_rtsp_connection_accept:
+ * @sock: a socket
+ * @conn: storage for a #GstRTSPConnection
+ *
+ * Accept a new connection on @sock and create a new #GstRTSPConnection for
+ * handling communication on new socket.
+ *
+ * Returns: #GST_RTSP_OK when @conn contains a valid connection.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_connection_accept (gint sock, GstRTSPConnection ** conn)
+{
+ int fd;
+ union gst_sockaddr sa;
+ socklen_t slen = sizeof (sa);
+ gchar ip[INET6_ADDRSTRLEN];
+ guint16 port;
+
+ g_return_val_if_fail (sock >= 0, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ memset (&sa, 0, slen);
+
+#ifndef G_OS_WIN32
+ fd = accept (sock, &sa.sa, &slen);
+#else
+ fd = accept (sock, &sa.sa, (gint *) & slen);
+#endif /* G_OS_WIN32 */
+ if (fd == -1)
+ goto accept_failed;
+
+ if (getnameinfo (&sa.sa, slen, ip, sizeof (ip), NULL, 0, NI_NUMERICHOST) != 0)
+ goto getnameinfo_failed;
+
+ if (sa.sa.sa_family == AF_INET)
+ port = sa.sa_in.sin_port;
+ else if (sa.sa.sa_family == AF_INET6)
+ port = sa.sa_in6.sin6_port;
+ else
+ goto wrong_family;
+
+ return gst_rtsp_connection_create_from_fd (fd, ip, port, NULL, conn);
+
+ /* ERRORS */
+accept_failed:
+ {
+ return GST_RTSP_ESYS;
+ }
+getnameinfo_failed:
+wrong_family:
+ {
+ CLOSE_SOCKET (fd);
+ return GST_RTSP_ERROR;
+ }
+}
+
+static gchar *
+do_resolve (const gchar * host)
+{
+ static gchar ip[INET6_ADDRSTRLEN];
+ struct addrinfo *aires, hints;
+ struct addrinfo *ai;
+ gint aierr;
+
+ memset (&hints, 0, sizeof (struct addrinfo));
+ hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
+ hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
+ hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
+ hints.ai_protocol = 0; /* Any protocol */
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ aierr = getaddrinfo (host, NULL, &hints, &aires);
+ if (aierr != 0)
+ goto no_addrinfo;
+
+ for (ai = aires; ai; ai = ai->ai_next) {
+ if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
+ break;
+ }
+ }
+ if (ai == NULL)
+ goto no_family;
+
+ aierr = getnameinfo (ai->ai_addr, ai->ai_addrlen, ip, sizeof (ip), NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (aierr != 0)
+ goto no_address;
+
+ freeaddrinfo (aires);
+
+ return g_strdup (ip);
+
+ /* ERRORS */
+no_addrinfo:
+ {
+ GST_ERROR ("no addrinfo found for %s: %s", host, gai_strerror (aierr));
+ return NULL;
+ }
+no_family:
+ {
+ GST_ERROR ("no family found for %s", host);
+ freeaddrinfo (aires);
+ return NULL;
+ }
+no_address:
+ {
+ GST_ERROR ("no address found for %s: %s", host, gai_strerror (aierr));
+ freeaddrinfo (aires);
+ return NULL;
+ }
+}
+
+static GstRTSPResult
+do_connect (const gchar * ip, guint16 port, GstPollFD * fdout,
+ GstPoll * fdset, GTimeVal * timeout)
+{
+ gint fd;
+ struct addrinfo hints;
+ struct addrinfo *aires;
+ struct addrinfo *ai;
+ gint aierr;
+ gchar service[NI_MAXSERV];
+ gint ret;
+#ifdef G_OS_WIN32
+ unsigned long flags = 1;
+#endif /* G_OS_WIN32 */
+ GstClockTime to;
+ gint retval;
+
+ memset (&hints, 0, sizeof hints);
+ hints.ai_flags = AI_NUMERICHOST;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ g_snprintf (service, sizeof (service) - 1, "%hu", port);
+ service[sizeof (service) - 1] = '\0';
+
+ aierr = getaddrinfo (ip, service, &hints, &aires);
+ if (aierr != 0)
+ goto no_addrinfo;
+
+ for (ai = aires; ai; ai = ai->ai_next) {
+ if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
+ break;
+ }
+ }
+ if (ai == NULL)
+ goto no_family;
+
+ fd = socket (ai->ai_family, SOCK_STREAM, 0);
+ if (fd == -1)
+ goto no_socket;
+
+ /* set to non-blocking mode so that we can cancel the connect */
+#ifndef G_OS_WIN32
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+#else
+ ioctlsocket (fd, FIONBIO, &flags);
+#endif /* G_OS_WIN32 */
+
+ /* add the socket to our fdset */
+ ADD_POLLFD (fdset, fdout, fd);
+
+ /* we are going to connect ASYNC now */
+ ret = connect (fd, ai->ai_addr, ai->ai_addrlen);
+ if (ret == 0)
+ goto done;
+ if (!ERRNO_IS_EINPROGRESS)
+ goto sys_error;
+
+ /* wait for connect to complete up to the specified timeout or until we got
+ * interrupted. */
+ gst_poll_fd_ctl_write (fdset, fdout, TRUE);
+
+ to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
+
+ do {
+ retval = gst_poll_wait (fdset, to);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if (retval == 0)
+ goto timeout;
+ else if (retval == -1)
+ goto sys_error;
+
+ /* we can still have an error connecting on windows */
+ if (gst_poll_fd_has_error (fdset, fdout)) {
+ socklen_t len = sizeof (errno);
+#ifndef G_OS_WIN32
+ getsockopt (fd, SOL_SOCKET, SO_ERROR, &errno, &len);
+#else
+ getsockopt (fd, SOL_SOCKET, SO_ERROR, (char *) &errno, &len);
+#endif
+ goto sys_error;
+ } else {
+#ifdef __APPLE__
+ /* osx wakes up select with POLLOUT if the connection is refused... */
+ socklen_t len = sizeof (errno);
+ getsockopt (fd, SOL_SOCKET, SO_ERROR, (char *) &errno, &len);
+ if (errno != 0)
+ goto sys_error;
+#endif
+ }
+
+ gst_poll_fd_ignored (fdset, fdout);
+
+done:
+ freeaddrinfo (aires);
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+no_addrinfo:
+ {
+ GST_ERROR ("no addrinfo found for %s: %s", ip, gai_strerror (aierr));
+ return GST_RTSP_ERROR;
+ }
+no_family:
+ {
+ GST_ERROR ("no family found for %s", ip);
+ freeaddrinfo (aires);
+ return GST_RTSP_ERROR;
+ }
+no_socket:
+ {
+ GST_ERROR ("no socket %d (%s)", errno, g_strerror (errno));
+ freeaddrinfo (aires);
+ return GST_RTSP_ESYS;
+ }
+sys_error:
+ {
+ GST_ERROR ("system error %d (%s)", errno, g_strerror (errno));
+ REMOVE_POLLFD (fdset, fdout);
+ freeaddrinfo (aires);
+ return GST_RTSP_ESYS;
+ }
+timeout:
+ {
+ GST_ERROR ("timeout");
+ REMOVE_POLLFD (fdset, fdout);
+ freeaddrinfo (aires);
+ return GST_RTSP_ETIMEOUT;
+ }
+}
+
+static GstRTSPResult
+setup_tunneling (GstRTSPConnection * conn, GTimeVal * timeout)
+{
+ gint i;
+ GstRTSPResult res;
+ gchar *ip;
+ gchar *uri;
+ gchar *value;
+ guint16 port, url_port;
+ GstRTSPUrl *url;
+ gchar *hostparam;
+ GstRTSPMessage *msg;
+ GstRTSPMessage response;
+ gboolean old_http;
+
+ memset (&response, 0, sizeof (response));
+ gst_rtsp_message_init (&response);
+
+ /* create a random sessionid */
+ for (i = 0; i < TUNNELID_LEN; i++)
+ conn->tunnelid[i] = g_random_int_range ('a', 'z');
+ conn->tunnelid[TUNNELID_LEN - 1] = '\0';
+
+ url = conn->url;
+ /* get the port from the url */
+ gst_rtsp_url_get_port (url, &url_port);
+
+ if (conn->proxy_host) {
+ uri = g_strdup_printf ("http://%s:%d%s%s%s", url->host, url_port,
+ url->abspath, url->query ? "?" : "", url->query ? url->query : "");
+ hostparam = g_strdup_printf ("%s:%d", url->host, url_port);
+ ip = conn->proxy_host;
+ port = conn->proxy_port;
+ } else {
+ uri = g_strdup_printf ("%s%s%s", url->abspath, url->query ? "?" : "",
+ url->query ? url->query : "");
+ hostparam = NULL;
+ ip = conn->ip;
+ port = url_port;
+ }
+
+ /* create the GET request for the read connection */
+ GST_RTSP_CHECK (gst_rtsp_message_new_request (&msg, GST_RTSP_GET, uri),
+ no_message);
+ msg->type = GST_RTSP_MESSAGE_HTTP_REQUEST;
+
+ if (hostparam != NULL)
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_HOST, hostparam);
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_X_SESSIONCOOKIE,
+ conn->tunnelid);
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_ACCEPT,
+ "application/x-rtsp-tunnelled");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CACHE_CONTROL, "no-cache");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_PRAGMA, "no-cache");
+
+ /* we start by writing to this fd */
+ conn->writefd = &conn->fd0;
+
+ /* we need to temporarily set conn->tunneled to FALSE to prevent the HTTP
+ * request from being base64 encoded */
+ conn->tunneled = FALSE;
+ GST_RTSP_CHECK (gst_rtsp_connection_send (conn, msg, timeout), write_failed);
+ gst_rtsp_message_free (msg);
+ conn->tunneled = TRUE;
+
+ /* receive the response to the GET request */
+ /* we need to temporarily set manual_http to TRUE since
+ * gst_rtsp_connection_receive() will treat the HTTP response as a parsing
+ * failure otherwise */
+ old_http = conn->manual_http;
+ conn->manual_http = TRUE;
+ GST_RTSP_CHECK (gst_rtsp_connection_receive (conn, &response, timeout),
+ read_failed);
+ conn->manual_http = old_http;
+
+ if (response.type != GST_RTSP_MESSAGE_HTTP_RESPONSE ||
+ response.type_data.response.code != GST_RTSP_STS_OK)
+ goto wrong_result;
+
+ if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_X_SERVER_IP_ADDRESS,
+ &value, 0) == GST_RTSP_OK) {
+ if (conn->proxy_host) {
+ /* if we use a proxy we need to change the destination url */
+ g_free (url->host);
+ url->host = g_strdup (value);
+ g_free (hostparam);
+ hostparam = g_strdup_printf ("%s:%d", url->host, url_port);
+ } else {
+ /* and resolve the new ip address */
+ if (!(ip = do_resolve (value)))
+ goto not_resolved;
+ g_free (conn->ip);
+ conn->ip = ip;
+ }
+ }
+
+ /* connect to the host/port */
+ res = do_connect (ip, port, &conn->fd1, conn->fdset, timeout);
+ if (res != GST_RTSP_OK)
+ goto connect_failed;
+
+ /* this is now our writing socket */
+ conn->writefd = &conn->fd1;
+
+ /* create the POST request for the write connection */
+ GST_RTSP_CHECK (gst_rtsp_message_new_request (&msg, GST_RTSP_POST, uri),
+ no_message);
+ msg->type = GST_RTSP_MESSAGE_HTTP_REQUEST;
+
+ if (hostparam != NULL)
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_HOST, hostparam);
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_X_SESSIONCOOKIE,
+ conn->tunnelid);
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_ACCEPT,
+ "application/x-rtsp-tunnelled");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CACHE_CONTROL, "no-cache");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_PRAGMA, "no-cache");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_EXPIRES,
+ "Sun, 9 Jan 1972 00:00:00 GMT");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CONTENT_LENGTH, "32767");
+
+ /* we need to temporarily set conn->tunneled to FALSE to prevent the HTTP
+ * request from being base64 encoded */
+ conn->tunneled = FALSE;
+ GST_RTSP_CHECK (gst_rtsp_connection_send (conn, msg, timeout), write_failed);
+ gst_rtsp_message_free (msg);
+ conn->tunneled = TRUE;
+
+exit:
+ gst_rtsp_message_unset (&response);
+ g_free (hostparam);
+ g_free (uri);
+
+ return res;
+
+ /* ERRORS */
+no_message:
+ {
+ GST_ERROR ("failed to create request (%d)", res);
+ goto exit;
+ }
+write_failed:
+ {
+ GST_ERROR ("write failed (%d)", res);
+ gst_rtsp_message_free (msg);
+ conn->tunneled = TRUE;
+ goto exit;
+ }
+read_failed:
+ {
+ GST_ERROR ("read failed (%d)", res);
+ conn->manual_http = FALSE;
+ goto exit;
+ }
+wrong_result:
+ {
+ GST_ERROR ("got failure response %d %s", response.type_data.response.code,
+ response.type_data.response.reason);
+ res = GST_RTSP_ERROR;
+ goto exit;
+ }
+not_resolved:
+ {
+ GST_ERROR ("could not resolve %s", conn->ip);
+ res = GST_RTSP_ENET;
+ goto exit;
+ }
+connect_failed:
+ {
+ GST_ERROR ("failed to connect");
+ goto exit;
+ }
+}
+
+/**
+ * gst_rtsp_connection_connect:
+ * @conn: a #GstRTSPConnection
+ * @timeout: a #GTimeVal timeout
+ *
+ * Attempt to connect to the url of @conn made with
+ * gst_rtsp_connection_create(). If @timeout is #NULL this function can block
+ * forever. If @timeout contains a valid timeout, this function will return
+ * #GST_RTSP_ETIMEOUT after the timeout expired.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK when a connection could be made.
+ */
+GstRTSPResult
+gst_rtsp_connection_connect (GstRTSPConnection * conn, GTimeVal * timeout)
+{
+ GstRTSPResult res;
+ gchar *ip;
+ guint16 port;
+ GstRTSPUrl *url;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->url != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->fd0.fd < 0, GST_RTSP_EINVAL);
+
+ url = conn->url;
+
+ if (conn->proxy_host && conn->tunneled) {
+ if (!(ip = do_resolve (conn->proxy_host))) {
+ GST_ERROR ("could not resolve %s", conn->proxy_host);
+ goto not_resolved;
+ }
+ port = conn->proxy_port;
+ g_free (conn->proxy_host);
+ conn->proxy_host = ip;
+ } else {
+ if (!(ip = do_resolve (url->host))) {
+ GST_ERROR ("could not resolve %s", url->host);
+ goto not_resolved;
+ }
+ /* get the port from the url */
+ gst_rtsp_url_get_port (url, &port);
+
+ g_free (conn->ip);
+ conn->ip = ip;
+ }
+
+ /* connect to the host/port */
+ res = do_connect (ip, port, &conn->fd0, conn->fdset, timeout);
+ if (res != GST_RTSP_OK)
+ goto connect_failed;
+
+ /* this is our read URL */
+ conn->readfd = &conn->fd0;
+
+ if (conn->tunneled) {
+ res = setup_tunneling (conn, timeout);
+ if (res != GST_RTSP_OK)
+ goto tunneling_failed;
+ } else {
+ conn->writefd = &conn->fd0;
+ }
+
+ return GST_RTSP_OK;
+
+not_resolved:
+ {
+ return GST_RTSP_ENET;
+ }
+connect_failed:
+ {
+ GST_ERROR ("failed to connect");
+ return res;
+ }
+tunneling_failed:
+ {
+ GST_ERROR ("failed to setup tunneling");
+ return res;
+ }
+}
+
+static void
+auth_digest_compute_hex_urp (const gchar * username,
+ const gchar * realm, const gchar * password, gchar hex_urp[33])
+{
+ GChecksum *md5_context = g_checksum_new (G_CHECKSUM_MD5);
+ const gchar *digest_string;
+
+ g_checksum_update (md5_context, (const guchar *) username, strlen (username));
+ g_checksum_update (md5_context, (const guchar *) ":", 1);
+ g_checksum_update (md5_context, (const guchar *) realm, strlen (realm));
+ g_checksum_update (md5_context, (const guchar *) ":", 1);
+ g_checksum_update (md5_context, (const guchar *) password, strlen (password));
+ digest_string = g_checksum_get_string (md5_context);
+
+ memset (hex_urp, 0, 33);
+ memcpy (hex_urp, digest_string, strlen (digest_string));
+
+ g_checksum_free (md5_context);
+}
+
+static void
+auth_digest_compute_response (const gchar * method,
+ const gchar * uri, const gchar * hex_a1, const gchar * nonce,
+ gchar response[33])
+{
+ char hex_a2[33] = { 0, };
+ GChecksum *md5_context = g_checksum_new (G_CHECKSUM_MD5);
+ const gchar *digest_string;
+
+ /* compute A2 */
+ g_checksum_update (md5_context, (const guchar *) method, strlen (method));
+ g_checksum_update (md5_context, (const guchar *) ":", 1);
+ g_checksum_update (md5_context, (const guchar *) uri, strlen (uri));
+ digest_string = g_checksum_get_string (md5_context);
+ memcpy (hex_a2, digest_string, strlen (digest_string));
+
+ /* compute KD */
+ g_checksum_reset (md5_context);
+ g_checksum_update (md5_context, (const guchar *) hex_a1, strlen (hex_a1));
+ g_checksum_update (md5_context, (const guchar *) ":", 1);
+ g_checksum_update (md5_context, (const guchar *) nonce, strlen (nonce));
+ g_checksum_update (md5_context, (const guchar *) ":", 1);
+
+ g_checksum_update (md5_context, (const guchar *) hex_a2, 32);
+ digest_string = g_checksum_get_string (md5_context);
+ memset (response, 0, 33);
+ memcpy (response, digest_string, strlen (digest_string));
+
+ g_checksum_free (md5_context);
+}
+
+static void
+add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message)
+{
+ switch (conn->auth_method) {
+ case GST_RTSP_AUTH_BASIC:{
+ gchar *user_pass;
+ gchar *user_pass64;
+ gchar *auth_string;
+
+ if (conn->username == NULL || conn->passwd == NULL)
+ break;
+
+ user_pass = g_strdup_printf ("%s:%s", conn->username, conn->passwd);
+ user_pass64 = g_base64_encode ((guchar *) user_pass, strlen (user_pass));
+ auth_string = g_strdup_printf ("Basic %s", user_pass64);
+
+ gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
+ auth_string);
+
+ g_free (user_pass);
+ g_free (user_pass64);
+ break;
+ }
+ case GST_RTSP_AUTH_DIGEST:{
+ gchar response[33], hex_urp[33];
+ gchar *auth_string, *auth_string2;
+ gchar *realm;
+ gchar *nonce;
+ gchar *opaque;
+ const gchar *uri;
+ const gchar *method;
+
+ /* we need to have some params set */
+ if (conn->auth_params == NULL || conn->username == NULL ||
+ conn->passwd == NULL)
+ break;
+
+ /* we need the realm and nonce */
+ realm = (gchar *) g_hash_table_lookup (conn->auth_params, "realm");
+ nonce = (gchar *) g_hash_table_lookup (conn->auth_params, "nonce");
+ if (realm == NULL || nonce == NULL)
+ break;
+
+ auth_digest_compute_hex_urp (conn->username, realm, conn->passwd,
+ hex_urp);
+
+ method = gst_rtsp_method_as_text (message->type_data.request.method);
+ uri = message->type_data.request.uri;
+
+ /* Assume no qop, algorithm=md5, stale=false */
+ /* For algorithm MD5, a1 = urp. */
+ auth_digest_compute_response (method, uri, hex_urp, nonce, response);
+ auth_string = g_strdup_printf ("Digest username=\"%s\", "
+ "realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
+ conn->username, realm, nonce, uri, response);
+
+ opaque = (gchar *) g_hash_table_lookup (conn->auth_params, "opaque");
+ if (opaque) {
+ auth_string2 = g_strdup_printf ("%s, opaque=\"%s\"", auth_string,
+ opaque);
+ g_free (auth_string);
+ auth_string = auth_string2;
+ }
+ gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
+ auth_string);
+ break;
+ }
+ default:
+ /* Nothing to do */
+ break;
+ }
+}
+
+static void
+gen_date_string (gchar * date_string, guint len)
+{
+ static const char wkdays[7][4] =
+ { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+ static const char months[12][4] =
+ { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
+ "Nov", "Dec"
+ };
+ struct tm tm;
+ time_t t;
+
+ time (&t);
+
+#ifdef HAVE_GMTIME_R
+ gmtime_r (&t, &tm);
+#else
+ tm = *gmtime (&t);
+#endif
+
+ g_snprintf (date_string, len, "%s, %02d %s %04d %02d:%02d:%02d GMT",
+ wkdays[tm.tm_wday], tm.tm_mday, months[tm.tm_mon], tm.tm_year + 1900,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
+}
+
+static GstRTSPResult
+write_bytes (gint fd, const guint8 * buffer, guint * idx, guint size)
+{
+ guint left;
+
+ if (G_UNLIKELY (*idx > size))
+ return GST_RTSP_ERROR;
+
+ left = size - *idx;
+
+ while (left) {
+ gint r;
+
+ r = WRITE_SOCKET (fd, &buffer[*idx], left);
+ if (G_UNLIKELY (r == 0)) {
+ return GST_RTSP_EINTR;
+ } else if (G_UNLIKELY (r < 0)) {
+ if (ERRNO_IS_EAGAIN)
+ return GST_RTSP_EINTR;
+ if (!ERRNO_IS_EINTR)
+ return GST_RTSP_ESYS;
+ } else {
+ left -= r;
+ *idx += r;
+ }
+ }
+ return GST_RTSP_OK;
+}
+
+static gint
+fill_raw_bytes (GstRTSPConnection * conn, guint8 * buffer, guint size)
+{
+ gint out = 0;
+
+ if (G_UNLIKELY (conn->initial_buffer != NULL)) {
+ gsize left = strlen (&conn->initial_buffer[conn->initial_buffer_offset]);
+
+ out = MIN (left, size);
+ memcpy (buffer, &conn->initial_buffer[conn->initial_buffer_offset], out);
+
+ if (left == (gsize) out) {
+ g_free (conn->initial_buffer);
+ conn->initial_buffer = NULL;
+ conn->initial_buffer_offset = 0;
+ } else
+ conn->initial_buffer_offset += out;
+ }
+
+ if (G_LIKELY (size > (guint) out)) {
+ gint r;
+
+ r = READ_SOCKET (conn->readfd->fd, &buffer[out], size - out);
+ if (r <= 0) {
+ if (out == 0)
+ out = r;
+ } else
+ out += r;
+ }
+
+ return out;
+}
+
+static gint
+fill_bytes (GstRTSPConnection * conn, guint8 * buffer, guint size)
+{
+ DecodeCtx *ctx = conn->ctxp;
+ gint out = 0;
+
+ if (ctx) {
+ while (size > 0) {
+ guint8 in[sizeof (ctx->out) * 4 / 3];
+ gint r;
+
+ while (size > 0 && ctx->cout < ctx->coutl) {
+ /* we have some leftover bytes */
+ *buffer++ = ctx->out[ctx->cout++];
+ size--;
+ out++;
+ }
+
+ /* got what we needed? */
+ if (size == 0)
+ break;
+
+ /* try to read more bytes */
+ r = fill_raw_bytes (conn, in, sizeof (in));
+ if (r <= 0) {
+ if (out == 0)
+ out = r;
+ break;
+ }
+
+ ctx->cout = 0;
+ ctx->coutl =
+ g_base64_decode_step ((gchar *) in, r, ctx->out, &ctx->state,
+ &ctx->save);
+ }
+ } else {
+ out = fill_raw_bytes (conn, buffer, size);
+ }
+
+ return out;
+}
+
+static GstRTSPResult
+read_bytes (GstRTSPConnection * conn, guint8 * buffer, guint * idx, guint size)
+{
+ guint left;
+
+ if (G_UNLIKELY (*idx > size))
+ return GST_RTSP_ERROR;
+
+ left = size - *idx;
+
+ while (left) {
+ gint r;
+
+ r = fill_bytes (conn, &buffer[*idx], left);
+ if (G_UNLIKELY (r == 0)) {
+ return GST_RTSP_EEOF;
+ } else if (G_UNLIKELY (r < 0)) {
+ if (ERRNO_IS_EAGAIN)
+ return GST_RTSP_EINTR;
+ if (!ERRNO_IS_EINTR)
+ return GST_RTSP_ESYS;
+ } else {
+ left -= r;
+ *idx += r;
+ }
+ }
+ return GST_RTSP_OK;
+}
+
+/* The code below tries to handle clients using \r, \n or \r\n to indicate the
+ * end of a line. It even does its best to handle clients which mix them (even
+ * though this is a really stupid idea (tm).) It also handles Line White Space
+ * (LWS), where a line end followed by whitespace is considered LWS. This is
+ * the method used in RTSP (and HTTP) to break long lines.
+ */
+static GstRTSPResult
+read_line (GstRTSPConnection * conn, guint8 * buffer, guint * idx, guint size)
+{
+ while (TRUE) {
+ guint8 c;
+ gint r;
+
+ if (conn->read_ahead == READ_AHEAD_EOH) {
+ /* the last call to read_line() already determined that we have reached
+ * the end of the headers, so convey that information now */
+ conn->read_ahead = 0;
+ break;
+ } else if (conn->read_ahead == READ_AHEAD_CRLF) {
+ /* the last call to read_line() left off after having read \r\n */
+ c = '\n';
+ } else if (conn->read_ahead == READ_AHEAD_CRLFCR) {
+ /* the last call to read_line() left off after having read \r\n\r */
+ c = '\r';
+ } else if (conn->read_ahead != 0) {
+ /* the last call to read_line() left us with a character to start with */
+ c = (guint8) conn->read_ahead;
+ conn->read_ahead = 0;
+ } else {
+ /* read the next character */
+ r = fill_bytes (conn, &c, 1);
+ if (G_UNLIKELY (r == 0)) {
+ return GST_RTSP_EEOF;
+ } else if (G_UNLIKELY (r < 0)) {
+ if (ERRNO_IS_EAGAIN)
+ return GST_RTSP_EINTR;
+ if (!ERRNO_IS_EINTR)
+ return GST_RTSP_ESYS;
+ continue;
+ }
+ }
+
+ /* special treatment of line endings */
+ if (c == '\r' || c == '\n') {
+ guint8 read_ahead;
+
+ retry:
+ /* need to read ahead one more character to know what to do... */
+ r = fill_bytes (conn, &read_ahead, 1);
+ if (G_UNLIKELY (r == 0)) {
+ return GST_RTSP_EEOF;
+ } else if (G_UNLIKELY (r < 0)) {
+ if (ERRNO_IS_EAGAIN) {
+ /* remember the original character we read and try again next time */
+ if (conn->read_ahead == 0)
+ conn->read_ahead = c;
+ return GST_RTSP_EINTR;
+ }
+ if (!ERRNO_IS_EINTR)
+ return GST_RTSP_ESYS;
+ goto retry;
+ }
+
+ if (read_ahead == ' ' || read_ahead == '\t') {
+ if (conn->read_ahead == READ_AHEAD_CRLFCR) {
+ /* got \r\n\r followed by whitespace, treat it as a normal line
+ * followed by one starting with LWS */
+ conn->read_ahead = read_ahead;
+ break;
+ } else {
+ /* got LWS, change the line ending to a space and continue */
+ c = ' ';
+ conn->read_ahead = read_ahead;
+ }
+ } else if (conn->read_ahead == READ_AHEAD_CRLFCR) {
+ if (read_ahead == '\r' || read_ahead == '\n') {
+ /* got \r\n\r\r or \r\n\r\n, treat it as the end of the headers */
+ conn->read_ahead = READ_AHEAD_EOH;
+ break;
+ } else {
+ /* got \r\n\r followed by something else, this is not really
+ * supported since we have probably just eaten the first character
+ * of the body or the next message, so just ignore the second \r
+ * and live with it... */
+ conn->read_ahead = read_ahead;
+ break;
+ }
+ } else if (conn->read_ahead == READ_AHEAD_CRLF) {
+ if (read_ahead == '\r') {
+ /* got \r\n\r so far, need one more character... */
+ conn->read_ahead = READ_AHEAD_CRLFCR;
+ goto retry;
+ } else if (read_ahead == '\n') {
+ /* got \r\n\n, treat it as the end of the headers */
+ conn->read_ahead = READ_AHEAD_EOH;
+ break;
+ } else {
+ /* found the end of a line, keep read_ahead for the next line */
+ conn->read_ahead = read_ahead;
+ break;
+ }
+ } else if (c == read_ahead) {
+ /* got double \r or \n, treat it as the end of the headers */
+ conn->read_ahead = READ_AHEAD_EOH;
+ break;
+ } else if (c == '\r' && read_ahead == '\n') {
+ /* got \r\n so far, still need more to know what to do... */
+ conn->read_ahead = READ_AHEAD_CRLF;
+ goto retry;
+ } else {
+ /* found the end of a line, keep read_ahead for the next line */
+ conn->read_ahead = read_ahead;
+ break;
+ }
+ }
+
+ if (G_LIKELY (*idx < size - 1))
+ buffer[(*idx)++] = c;
+ }
+ buffer[*idx] = '\0';
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_write:
+ * @conn: a #GstRTSPConnection
+ * @data: the data to write
+ * @size: the size of @data
+ * @timeout: a timeout value or #NULL
+ *
+ * Attempt to write @size bytes of @data to the connected @conn, blocking up to
+ * the specified @timeout. @timeout can be #NULL, in which case this function
+ * might block forever.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_write (GstRTSPConnection * conn, const guint8 * data,
+ guint size, GTimeVal * timeout)
+{
+ guint offset;
+ gint retval;
+ GstClockTime to;
+ GstRTSPResult res;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL || size == 0, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
+
+ gst_poll_set_controllable (conn->fdset, TRUE);
+ gst_poll_fd_ctl_write (conn->fdset, conn->writefd, TRUE);
+ gst_poll_fd_ctl_read (conn->fdset, conn->readfd, FALSE);
+ /* clear all previous poll results */
+ gst_poll_fd_ignored (conn->fdset, conn->writefd);
+ gst_poll_fd_ignored (conn->fdset, conn->readfd);
+
+ to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
+
+ offset = 0;
+
+ while (TRUE) {
+ /* try to write */
+ res = write_bytes (conn->writefd->fd, data, &offset, size);
+ if (G_LIKELY (res == GST_RTSP_OK))
+ break;
+ if (G_UNLIKELY (res != GST_RTSP_EINTR))
+ goto write_error;
+
+ /* not all is written, wait until we can write more */
+ do {
+ retval = gst_poll_wait (conn->fdset, to);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if (G_UNLIKELY (retval == 0))
+ goto timeout;
+
+ if (G_UNLIKELY (retval == -1)) {
+ if (errno == EBUSY)
+ goto stopped;
+ else
+ goto select_error;
+ }
+
+ /* could also be an error with read socket */
+ if (gst_poll_fd_has_error (conn->fdset, conn->readfd))
+ goto socket_error;
+ }
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+timeout:
+ {
+ return GST_RTSP_ETIMEOUT;
+ }
+select_error:
+ {
+ return GST_RTSP_ESYS;
+ }
+stopped:
+ {
+ return GST_RTSP_EINTR;
+ }
+socket_error:
+ {
+ return GST_RTSP_ENET;
+ }
+write_error:
+ {
+ return res;
+ }
+}
+
+static GString *
+message_to_string (GstRTSPConnection * conn, GstRTSPMessage * message)
+{
+ GString *str = NULL;
+
+ str = g_string_new ("");
+
+ switch (message->type) {
+ case GST_RTSP_MESSAGE_REQUEST:
+ /* create request string, add CSeq */
+ g_string_append_printf (str, "%s %s RTSP/1.0\r\n"
+ "CSeq: %d\r\n",
+ gst_rtsp_method_as_text (message->type_data.request.method),
+ message->type_data.request.uri, conn->cseq++);
+ /* add session id if we have one */
+ if (conn->session_id[0] != '\0') {
+ gst_rtsp_message_remove_header (message, GST_RTSP_HDR_SESSION, -1);
+ gst_rtsp_message_add_header (message, GST_RTSP_HDR_SESSION,
+ conn->session_id);
+ }
+ /* add any authentication headers */
+ add_auth_header (conn, message);
+ break;
+ case GST_RTSP_MESSAGE_RESPONSE:
+ /* create response string */
+ g_string_append_printf (str, "RTSP/1.0 %d %s\r\n",
+ message->type_data.response.code, message->type_data.response.reason);
+ break;
+ case GST_RTSP_MESSAGE_HTTP_REQUEST:
+ /* create request string */
+ g_string_append_printf (str, "%s %s HTTP/%s\r\n",
+ gst_rtsp_method_as_text (message->type_data.request.method),
+ message->type_data.request.uri,
+ gst_rtsp_version_as_text (message->type_data.request.version));
+ /* add any authentication headers */
+ add_auth_header (conn, message);
+ break;
+ case GST_RTSP_MESSAGE_HTTP_RESPONSE:
+ /* create response string */
+ g_string_append_printf (str, "HTTP/%s %d %s\r\n",
+ gst_rtsp_version_as_text (message->type_data.request.version),
+ message->type_data.response.code, message->type_data.response.reason);
+ break;
+ case GST_RTSP_MESSAGE_DATA:
+ {
+ guint8 data_header[4];
+
+ /* prepare data header */
+ data_header[0] = '$';
+ data_header[1] = message->type_data.data.channel;
+ data_header[2] = (message->body_size >> 8) & 0xff;
+ data_header[3] = message->body_size & 0xff;
+
+ /* create string with header and data */
+ str = g_string_append_len (str, (gchar *) data_header, 4);
+ str =
+ g_string_append_len (str, (gchar *) message->body,
+ message->body_size);
+ break;
+ }
+ default:
+ g_string_free (str, TRUE);
+ g_return_val_if_reached (NULL);
+ break;
+ }
+
+ /* append headers and body */
+ if (message->type != GST_RTSP_MESSAGE_DATA) {
+ gchar date_string[100];
+
+ gen_date_string (date_string, sizeof (date_string));
+
+ /* add date header */
+ gst_rtsp_message_remove_header (message, GST_RTSP_HDR_DATE, -1);
+ gst_rtsp_message_add_header (message, GST_RTSP_HDR_DATE, date_string);
+
+ /* append headers */
+ gst_rtsp_message_append_headers (message, str);
+
+ /* append Content-Length and body if needed */
+ if (message->body != NULL && message->body_size > 0) {
+ gchar *len;
+
+ len = g_strdup_printf ("%d", message->body_size);
+ g_string_append_printf (str, "%s: %s\r\n",
+ gst_rtsp_header_as_text (GST_RTSP_HDR_CONTENT_LENGTH), len);
+ g_free (len);
+ /* header ends here */
+ g_string_append (str, "\r\n");
+ str =
+ g_string_append_len (str, (gchar *) message->body,
+ message->body_size);
+ } else {
+ /* just end headers */
+ g_string_append (str, "\r\n");
+ }
+ }
+
+ return str;
+}
+
+/**
+ * gst_rtsp_connection_send:
+ * @conn: a #GstRTSPConnection
+ * @message: the message to send
+ * @timeout: a timeout value or #NULL
+ *
+ * Attempt to send @message to the connected @conn, blocking up to
+ * the specified @timeout. @timeout can be #NULL, in which case this function
+ * might block forever.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_send (GstRTSPConnection * conn, GstRTSPMessage * message,
+ GTimeVal * timeout)
+{
+ GString *string = NULL;
+ GstRTSPResult res;
+ gchar *str;
+ gsize len;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
+
+ if (G_UNLIKELY (!(string = message_to_string (conn, message))))
+ goto no_message;
+
+ if (conn->tunneled) {
+ str = g_base64_encode ((const guchar *) string->str, string->len);
+ g_string_free (string, TRUE);
+ len = strlen (str);
+ } else {
+ str = string->str;
+ len = string->len;
+ g_string_free (string, FALSE);
+ }
+
+ /* write request */
+ res = gst_rtsp_connection_write (conn, (guint8 *) str, len, timeout);
+
+ g_free (str);
+
+ return res;
+
+no_message:
+ {
+ g_warning ("Wrong message");
+ return GST_RTSP_EINVAL;
+ }
+}
+
+static GstRTSPResult
+parse_string (gchar * dest, gint size, gchar ** src)
+{
+ GstRTSPResult res = GST_RTSP_OK;
+ gint idx;
+
+ idx = 0;
+ /* skip spaces */
+ while (g_ascii_isspace (**src))
+ (*src)++;
+
+ while (!g_ascii_isspace (**src) && **src != '\0') {
+ if (idx < size - 1)
+ dest[idx++] = **src;
+ else
+ res = GST_RTSP_EPARSE;
+ (*src)++;
+ }
+ if (size > 0)
+ dest[idx] = '\0';
+
+ return res;
+}
+
+static GstRTSPResult
+parse_protocol_version (gchar * protocol, GstRTSPMsgType * type,
+ GstRTSPVersion * version)
+{
+ GstRTSPResult res = GST_RTSP_OK;
+ gchar *ver;
+
+ if (G_LIKELY ((ver = strchr (protocol, '/')) != NULL)) {
+ guint major;
+ guint minor;
+ gchar dummychar;
+
+ *ver++ = '\0';
+
+ /* the version number must be formatted as X.Y with nothing following */
+ if (sscanf (ver, "%u.%u%c", &major, &minor, &dummychar) != 2)
+ res = GST_RTSP_EPARSE;
+
+ if (g_ascii_strcasecmp (protocol, "RTSP") == 0) {
+ if (major != 1 || minor != 0) {
+ *version = GST_RTSP_VERSION_INVALID;
+ res = GST_RTSP_ERROR;
+ }
+ } else if (g_ascii_strcasecmp (protocol, "HTTP") == 0) {
+ if (*type == GST_RTSP_MESSAGE_REQUEST)
+ *type = GST_RTSP_MESSAGE_HTTP_REQUEST;
+ else if (*type == GST_RTSP_MESSAGE_RESPONSE)
+ *type = GST_RTSP_MESSAGE_HTTP_RESPONSE;
+
+ if (major == 1 && minor == 1) {
+ *version = GST_RTSP_VERSION_1_1;
+ } else if (major != 1 || minor != 0) {
+ *version = GST_RTSP_VERSION_INVALID;
+ res = GST_RTSP_ERROR;
+ }
+ } else
+ res = GST_RTSP_EPARSE;
+ } else
+ res = GST_RTSP_EPARSE;
+
+ return res;
+}
+
+static GstRTSPResult
+parse_response_status (guint8 * buffer, GstRTSPMessage * msg)
+{
+ GstRTSPResult res = GST_RTSP_OK;
+ GstRTSPResult res2;
+ gchar versionstr[20];
+ gchar codestr[4];
+ gint code;
+ gchar *bptr;
+
+ bptr = (gchar *) buffer;
+
+ if (parse_string (versionstr, sizeof (versionstr), &bptr) != GST_RTSP_OK)
+ res = GST_RTSP_EPARSE;
+
+ if (parse_string (codestr, sizeof (codestr), &bptr) != GST_RTSP_OK)
+ res = GST_RTSP_EPARSE;
+ code = atoi (codestr);
+ if (G_UNLIKELY (*codestr == '\0' || code < 0 || code >= 600))
+ res = GST_RTSP_EPARSE;
+
+ while (g_ascii_isspace (*bptr))
+ bptr++;
+
+ if (G_UNLIKELY (gst_rtsp_message_init_response (msg, code, bptr,
+ NULL) != GST_RTSP_OK))
+ res = GST_RTSP_EPARSE;
+
+ res2 = parse_protocol_version (versionstr, &msg->type,
+ &msg->type_data.response.version);
+ if (G_LIKELY (res == GST_RTSP_OK))
+ res = res2;
+
+ return res;
+}
+
+static GstRTSPResult
+parse_request_line (guint8 * buffer, GstRTSPMessage * msg)
+{
+ GstRTSPResult res = GST_RTSP_OK;
+ GstRTSPResult res2;
+ gchar versionstr[20];
+ gchar methodstr[20];
+ gchar urlstr[4096];
+ gchar *bptr;
+ GstRTSPMethod method;
+
+ bptr = (gchar *) buffer;
+
+ if (parse_string (methodstr, sizeof (methodstr), &bptr) != GST_RTSP_OK)
+ res = GST_RTSP_EPARSE;
+ method = gst_rtsp_find_method (methodstr);
+
+ if (parse_string (urlstr, sizeof (urlstr), &bptr) != GST_RTSP_OK)
+ res = GST_RTSP_EPARSE;
+ if (G_UNLIKELY (*urlstr == '\0'))
+ res = GST_RTSP_EPARSE;
+
+ if (parse_string (versionstr, sizeof (versionstr), &bptr) != GST_RTSP_OK)
+ res = GST_RTSP_EPARSE;
+
+ if (G_UNLIKELY (*bptr != '\0'))
+ res = GST_RTSP_EPARSE;
+
+ if (G_UNLIKELY (gst_rtsp_message_init_request (msg, method,
+ urlstr) != GST_RTSP_OK))
+ res = GST_RTSP_EPARSE;
+
+ res2 = parse_protocol_version (versionstr, &msg->type,
+ &msg->type_data.request.version);
+ if (G_LIKELY (res == GST_RTSP_OK))
+ res = res2;
+
+ if (G_LIKELY (msg->type == GST_RTSP_MESSAGE_REQUEST)) {
+ /* GET and POST are not allowed as RTSP methods */
+ if (msg->type_data.request.method == GST_RTSP_GET ||
+ msg->type_data.request.method == GST_RTSP_POST) {
+ msg->type_data.request.method = GST_RTSP_INVALID;
+ if (res == GST_RTSP_OK)
+ res = GST_RTSP_ERROR;
+ }
+ } else if (msg->type == GST_RTSP_MESSAGE_HTTP_REQUEST) {
+ /* only GET and POST are allowed as HTTP methods */
+ if (msg->type_data.request.method != GST_RTSP_GET &&
+ msg->type_data.request.method != GST_RTSP_POST) {
+ msg->type_data.request.method = GST_RTSP_INVALID;
+ if (res == GST_RTSP_OK)
+ res = GST_RTSP_ERROR;
+ }
+ }
+
+ return res;
+}
+
+/* parsing lines means reading a Key: Value pair */
+static GstRTSPResult
+parse_line (guint8 * buffer, GstRTSPMessage * msg)
+{
+ GstRTSPHeaderField field;
+ gchar *line = (gchar *) buffer;
+ gchar *value;
+
+ if ((value = strchr (line, ':')) == NULL || value == line)
+ goto parse_error;
+
+ /* trim space before the colon */
+ if (value[-1] == ' ')
+ value[-1] = '\0';
+
+ /* replace the colon with a NUL */
+ *value++ = '\0';
+
+ /* find the header */
+ field = gst_rtsp_find_header_field (line);
+ if (field == GST_RTSP_HDR_INVALID)
+ goto done;
+
+ /* split up the value in multiple key:value pairs if it contains comma(s) */
+ while (*value != '\0') {
+ gchar *next_value;
+ gchar *comma = NULL;
+ gboolean quoted = FALSE;
+ guint comment = 0;
+
+ /* trim leading space */
+ if (*value == ' ')
+ value++;
+
+ /* for headers which may not appear multiple times, and thus may not
+ * contain multiple values on the same line, we can short-circuit the loop
+ * below and the entire value results in just one key:value pair*/
+ if (!gst_rtsp_header_allow_multiple (field))
+ next_value = value + strlen (value);
+ else
+ next_value = value;
+
+ /* find the next value, taking special care of quotes and comments */
+ while (*next_value != '\0') {
+ if ((quoted || comment != 0) && *next_value == '\\' &&
+ next_value[1] != '\0')
+ next_value++;
+ else if (comment == 0 && *next_value == '"')
+ quoted = !quoted;
+ else if (!quoted && *next_value == '(')
+ comment++;
+ else if (comment != 0 && *next_value == ')')
+ comment--;
+ else if (!quoted && comment == 0) {
+ /* To quote RFC 2068: "User agents MUST take special care in parsing
+ * the WWW-Authenticate field value if it contains more than one
+ * challenge, or if more than one WWW-Authenticate header field is
+ * provided, since the contents of a challenge may itself contain a
+ * comma-separated list of authentication parameters."
+ *
+ * What this means is that we cannot just look for an unquoted comma
+ * when looking for multiple values in Proxy-Authenticate and
+ * WWW-Authenticate headers. Instead we need to look for the sequence
+ * "comma [space] token space token" before we can split after the
+ * comma...
+ */
+ if (field == GST_RTSP_HDR_PROXY_AUTHENTICATE ||
+ field == GST_RTSP_HDR_WWW_AUTHENTICATE) {
+ if (*next_value == ',') {
+ if (next_value[1] == ' ') {
+ /* skip any space following the comma so we do not mistake it for
+ * separating between two tokens */
+ next_value++;
+ }
+ comma = next_value;
+ } else if (*next_value == ' ' && next_value[1] != ',' &&
+ next_value[1] != '=' && comma != NULL) {
+ next_value = comma;
+ comma = NULL;
+ break;
+ }
+ } else if (*next_value == ',')
+ break;
+ }
+
+ next_value++;
+ }
+
+ /* trim space */
+ if (value != next_value && next_value[-1] == ' ')
+ next_value[-1] = '\0';
+
+ if (*next_value != '\0')
+ *next_value++ = '\0';
+
+ /* add the key:value pair */
+ if (*value != '\0')
+ gst_rtsp_message_add_header (msg, field, value);
+
+ value = next_value;
+ }
+
+done:
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+parse_error:
+ {
+ return GST_RTSP_EPARSE;
+ }
+}
+
+/* convert all consecutive whitespace to a single space */
+static void
+normalize_line (guint8 * buffer)
+{
+ while (*buffer) {
+ if (g_ascii_isspace (*buffer)) {
+ guint8 *tmp;
+
+ *buffer++ = ' ';
+ for (tmp = buffer; g_ascii_isspace (*tmp); tmp++) {
+ }
+ if (buffer != tmp)
+ memmove (buffer, tmp, strlen ((gchar *) tmp) + 1);
+ } else {
+ buffer++;
+ }
+ }
+}
+
+/* returns:
+ * GST_RTSP_OK when a complete message was read.
+ * GST_RTSP_EEOF: when the read socket is closed
+ * GST_RTSP_EINTR: when more data is needed.
+ * GST_RTSP_..: some other error occured.
+ */
+static GstRTSPResult
+build_next (GstRTSPBuilder * builder, GstRTSPMessage * message,
+ GstRTSPConnection * conn)
+{
+ GstRTSPResult res;
+
+ while (TRUE) {
+ switch (builder->state) {
+ case STATE_START:
+ {
+ guint8 c;
+
+ builder->offset = 0;
+ res =
+ read_bytes (conn, (guint8 *) builder->buffer, &builder->offset, 1);
+ if (res != GST_RTSP_OK)
+ goto done;
+
+ c = builder->buffer[0];
+
+ /* we have 1 bytes now and we can see if this is a data message or
+ * not */
+ if (c == '$') {
+ /* data message, prepare for the header */
+ builder->state = STATE_DATA_HEADER;
+ } else if (c == '\n' || c == '\r') {
+ /* skip \n and \r */
+ builder->offset = 0;
+ } else {
+ builder->line = 0;
+ builder->state = STATE_READ_LINES;
+ }
+ break;
+ }
+ case STATE_DATA_HEADER:
+ {
+ res =
+ read_bytes (conn, (guint8 *) builder->buffer, &builder->offset, 4);
+ if (res != GST_RTSP_OK)
+ goto done;
+
+ gst_rtsp_message_init_data (message, builder->buffer[1]);
+
+ builder->body_len = (builder->buffer[2] << 8) | builder->buffer[3];
+ builder->body_data = g_malloc (builder->body_len + 1);
+ builder->body_data[builder->body_len] = '\0';
+ builder->offset = 0;
+ builder->state = STATE_DATA_BODY;
+ break;
+ }
+ case STATE_DATA_BODY:
+ {
+ res =
+ read_bytes (conn, builder->body_data, &builder->offset,
+ builder->body_len);
+ if (res != GST_RTSP_OK)
+ goto done;
+
+ /* we have the complete body now, store in the message adjusting the
+ * length to include the traling '\0' */
+ gst_rtsp_message_take_body (message,
+ (guint8 *) builder->body_data, builder->body_len + 1);
+ builder->body_data = NULL;
+ builder->body_len = 0;
+
+ builder->state = STATE_END;
+ break;
+ }
+ case STATE_READ_LINES:
+ {
+ res = read_line (conn, builder->buffer, &builder->offset,
+ sizeof (builder->buffer));
+ if (res != GST_RTSP_OK)
+ goto done;
+
+ /* we have a regular response */
+ if (builder->buffer[0] == '\0') {
+ gchar *hdrval;
+
+ /* empty line, end of message header */
+ /* see if there is a Content-Length header, but ignore it if this
+ * is a POST request with an x-sessioncookie header */
+ if (gst_rtsp_message_get_header (message,
+ GST_RTSP_HDR_CONTENT_LENGTH, &hdrval, 0) == GST_RTSP_OK &&
+ (message->type != GST_RTSP_MESSAGE_HTTP_REQUEST ||
+ message->type_data.request.method != GST_RTSP_POST ||
+ gst_rtsp_message_get_header (message,
+ GST_RTSP_HDR_X_SESSIONCOOKIE, NULL, 0) != GST_RTSP_OK)) {
+ /* there is, prepare to read the body */
+ builder->body_len = atol (hdrval);
+ builder->body_data = g_try_malloc (builder->body_len + 1);
+ /* we can't do much here, we need the length to know how many bytes
+ * we need to read next and when allocation fails, something is
+ * probably wrong with the length. */
+ if (builder->body_data == NULL)
+ goto invalid_body_len;
+
+ builder->body_data[builder->body_len] = '\0';
+ builder->offset = 0;
+ builder->state = STATE_DATA_BODY;
+ } else {
+ builder->state = STATE_END;
+ }
+ break;
+ }
+
+ /* we have a line */
+ normalize_line (builder->buffer);
+ if (builder->line == 0) {
+ /* first line, check for response status */
+ if (memcmp (builder->buffer, "RTSP", 4) == 0 ||
+ memcmp (builder->buffer, "HTTP", 4) == 0) {
+ builder->status = parse_response_status (builder->buffer, message);
+ } else {
+ builder->status = parse_request_line (builder->buffer, message);
+ }
+ } else {
+ /* else just parse the line */
+ res = parse_line (builder->buffer, message);
+ if (res != GST_RTSP_OK)
+ builder->status = res;
+ }
+ builder->line++;
+ builder->offset = 0;
+ break;
+ }
+ case STATE_END:
+ {
+ gchar *session_cookie;
+ gchar *session_id;
+
+ if (message->type == GST_RTSP_MESSAGE_DATA) {
+ /* data messages don't have headers */
+ res = GST_RTSP_OK;
+ goto done;
+ }
+
+ /* save the tunnel session in the connection */
+ if (message->type == GST_RTSP_MESSAGE_HTTP_REQUEST &&
+ !conn->manual_http &&
+ conn->tstate == TUNNEL_STATE_NONE &&
+ gst_rtsp_message_get_header (message, GST_RTSP_HDR_X_SESSIONCOOKIE,
+ &session_cookie, 0) == GST_RTSP_OK) {
+ strncpy (conn->tunnelid, session_cookie, TUNNELID_LEN);
+ conn->tunnelid[TUNNELID_LEN - 1] = '\0';
+ conn->tunneled = TRUE;
+ }
+
+ /* save session id in the connection for further use */
+ if (message->type == GST_RTSP_MESSAGE_RESPONSE &&
+ gst_rtsp_message_get_header (message, GST_RTSP_HDR_SESSION,
+ &session_id, 0) == GST_RTSP_OK) {
+ gint maxlen, i;
+
+ maxlen = sizeof (conn->session_id) - 1;
+ /* the sessionid can have attributes marked with ;
+ * Make sure we strip them */
+ for (i = 0; session_id[i] != '\0'; i++) {
+ if (session_id[i] == ';') {
+ maxlen = i;
+ /* parse timeout */
+ do {
+ i++;
+ } while (g_ascii_isspace (session_id[i]));
+ if (g_str_has_prefix (&session_id[i], "timeout=")) {
+ gint to;
+
+ /* if we parsed something valid, configure */
+ if ((to = atoi (&session_id[i + 8])) > 0)
+ conn->timeout = to;
+ }
+ break;
+ }
+ }
+
+ /* make sure to not overflow */
+ strncpy (conn->session_id, session_id, maxlen);
+ conn->session_id[maxlen] = '\0';
+ }
+ res = builder->status;
+ goto done;
+ }
+ default:
+ res = GST_RTSP_ERROR;
+ break;
+ }
+ }
+done:
+ return res;
+
+ /* ERRORS */
+invalid_body_len:
+ {
+ GST_DEBUG ("could not allocate body");
+ return GST_RTSP_ERROR;
+ }
+}
+
+/**
+ * gst_rtsp_connection_read:
+ * @conn: a #GstRTSPConnection
+ * @data: the data to read
+ * @size: the size of @data
+ * @timeout: a timeout value or #NULL
+ *
+ * Attempt to read @size bytes into @data from the connected @conn, blocking up to
+ * the specified @timeout. @timeout can be #NULL, in which case this function
+ * might block forever.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_read (GstRTSPConnection * conn, guint8 * data, guint size,
+ GTimeVal * timeout)
+{
+ guint offset;
+ gint retval;
+ GstClockTime to;
+ GstRTSPResult res;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
+
+ if (G_UNLIKELY (size == 0))
+ return GST_RTSP_OK;
+
+ offset = 0;
+
+ /* configure timeout if any */
+ to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
+
+ gst_poll_set_controllable (conn->fdset, TRUE);
+ gst_poll_fd_ctl_write (conn->fdset, conn->writefd, FALSE);
+ gst_poll_fd_ctl_read (conn->fdset, conn->readfd, TRUE);
+
+ while (TRUE) {
+ res = read_bytes (conn, data, &offset, size);
+ if (G_UNLIKELY (res == GST_RTSP_EEOF))
+ goto eof;
+ if (G_LIKELY (res == GST_RTSP_OK))
+ break;
+ if (G_UNLIKELY (res != GST_RTSP_EINTR))
+ goto read_error;
+
+ do {
+ retval = gst_poll_wait (conn->fdset, to);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ /* check for timeout */
+ if (G_UNLIKELY (retval == 0))
+ goto select_timeout;
+
+ if (G_UNLIKELY (retval == -1)) {
+ if (errno == EBUSY)
+ goto stopped;
+ else
+ goto select_error;
+ }
+
+ /* could also be an error with write socket */
+ if (gst_poll_fd_has_error (conn->fdset, conn->writefd))
+ goto socket_error;
+
+ gst_poll_set_controllable (conn->fdset, FALSE);
+ }
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+select_error:
+ {
+ return GST_RTSP_ESYS;
+ }
+select_timeout:
+ {
+ return GST_RTSP_ETIMEOUT;
+ }
+stopped:
+ {
+ return GST_RTSP_EINTR;
+ }
+eof:
+ {
+ return GST_RTSP_EEOF;
+ }
+socket_error:
+ {
+ res = GST_RTSP_ENET;
+ }
+read_error:
+ {
+ return res;
+ }
+}
+
+static GstRTSPMessage *
+gen_tunnel_reply (GstRTSPConnection * conn, GstRTSPStatusCode code,
+ const GstRTSPMessage * request)
+{
+ GstRTSPMessage *msg;
+ GstRTSPResult res;
+
+ if (gst_rtsp_status_as_text (code) == NULL)
+ code = GST_RTSP_STS_INTERNAL_SERVER_ERROR;
+
+ GST_RTSP_CHECK (gst_rtsp_message_new_response (&msg, code, NULL, request),
+ no_message);
+
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_SERVER,
+ "GStreamer RTSP Server");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CONNECTION, "close");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CACHE_CONTROL, "no-store");
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_PRAGMA, "no-cache");
+
+ if (code == GST_RTSP_STS_OK) {
+ if (conn->ip)
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_X_SERVER_IP_ADDRESS,
+ conn->ip);
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CONTENT_TYPE,
+ "application/x-rtsp-tunnelled");
+ }
+
+ return msg;
+
+ /* ERRORS */
+no_message:
+ {
+ return NULL;
+ }
+}
+
+/**
+ * gst_rtsp_connection_receive:
+ * @conn: a #GstRTSPConnection
+ * @message: the message to read
+ * @timeout: a timeout value or #NULL
+ *
+ * Attempt to read into @message from the connected @conn, blocking up to
+ * the specified @timeout. @timeout can be #NULL, in which case this function
+ * might block forever.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_receive (GstRTSPConnection * conn, GstRTSPMessage * message,
+ GTimeVal * timeout)
+{
+ GstRTSPResult res;
+ GstRTSPBuilder builder;
+ gint retval;
+ GstClockTime to;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
+
+ /* configure timeout if any */
+ to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
+
+ gst_poll_set_controllable (conn->fdset, TRUE);
+ gst_poll_fd_ctl_write (conn->fdset, conn->writefd, FALSE);
+ gst_poll_fd_ctl_read (conn->fdset, conn->readfd, TRUE);
+
+ memset (&builder, 0, sizeof (GstRTSPBuilder));
+ while (TRUE) {
+ res = build_next (&builder, message, conn);
+ if (G_UNLIKELY (res == GST_RTSP_EEOF))
+ goto eof;
+ else if (G_LIKELY (res == GST_RTSP_OK)) {
+ if (!conn->manual_http) {
+ if (message->type == GST_RTSP_MESSAGE_HTTP_REQUEST) {
+ if (conn->tstate == TUNNEL_STATE_NONE &&
+ message->type_data.request.method == GST_RTSP_GET) {
+ GstRTSPMessage *response;
+
+ conn->tstate = TUNNEL_STATE_GET;
+
+ /* tunnel GET request, we can reply now */
+ response = gen_tunnel_reply (conn, GST_RTSP_STS_OK, message);
+ res = gst_rtsp_connection_send (conn, response, timeout);
+ gst_rtsp_message_free (response);
+ if (res == GST_RTSP_OK)
+ res = GST_RTSP_ETGET;
+ goto cleanup;
+ } else if (conn->tstate == TUNNEL_STATE_NONE &&
+ message->type_data.request.method == GST_RTSP_POST) {
+ conn->tstate = TUNNEL_STATE_POST;
+
+ /* tunnel POST request, the caller now has to link the two
+ * connections. */
+ res = GST_RTSP_ETPOST;
+ goto cleanup;
+ } else {
+ res = GST_RTSP_EPARSE;
+ goto cleanup;
+ }
+ } else if (message->type == GST_RTSP_MESSAGE_HTTP_RESPONSE) {
+ res = GST_RTSP_EPARSE;
+ goto cleanup;
+ }
+ }
+
+ break;
+ } else if (G_UNLIKELY (res != GST_RTSP_EINTR))
+ goto read_error;
+
+ do {
+ retval = gst_poll_wait (conn->fdset, to);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ /* check for timeout */
+ if (G_UNLIKELY (retval == 0))
+ goto select_timeout;
+
+ if (G_UNLIKELY (retval == -1)) {
+ if (errno == EBUSY)
+ goto stopped;
+ else
+ goto select_error;
+ }
+
+ /* could also be an error with write socket */
+ if (gst_poll_fd_has_error (conn->fdset, conn->writefd))
+ goto socket_error;
+
+ /* once we start reading the wait cannot be controlled */
+ if (builder.state != STATE_START)
+ gst_poll_set_controllable (conn->fdset, FALSE);
+ }
+
+ /* we have a message here */
+ build_reset (&builder);
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+select_error:
+ {
+ res = GST_RTSP_ESYS;
+ goto cleanup;
+ }
+select_timeout:
+ {
+ res = GST_RTSP_ETIMEOUT;
+ goto cleanup;
+ }
+stopped:
+ {
+ res = GST_RTSP_EINTR;
+ goto cleanup;
+ }
+eof:
+ {
+ res = GST_RTSP_EEOF;
+ goto cleanup;
+ }
+socket_error:
+ {
+ res = GST_RTSP_ENET;
+ goto cleanup;
+ }
+read_error:
+cleanup:
+ {
+ build_reset (&builder);
+ gst_rtsp_message_unset (message);
+ return res;
+ }
+}
+
+/**
+ * gst_rtsp_connection_close:
+ * @conn: a #GstRTSPConnection
+ *
+ * Close the connected @conn. After this call, the connection is in the same
+ * state as when it was first created.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_close (GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ g_free (conn->ip);
+ conn->ip = NULL;
+
+ conn->read_ahead = 0;
+
+ g_free (conn->initial_buffer);
+ conn->initial_buffer = NULL;
+ conn->initial_buffer_offset = 0;
+
+ REMOVE_POLLFD (conn->fdset, &conn->fd0);
+ REMOVE_POLLFD (conn->fdset, &conn->fd1);
+ conn->writefd = NULL;
+ conn->readfd = NULL;
+ conn->tunneled = FALSE;
+ conn->tstate = TUNNEL_STATE_NONE;
+ conn->ctxp = NULL;
+ g_free (conn->username);
+ conn->username = NULL;
+ g_free (conn->passwd);
+ conn->passwd = NULL;
+ gst_rtsp_connection_clear_auth_params (conn);
+ conn->timeout = 60;
+ conn->cseq = 0;
+ conn->session_id[0] = '\0';
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_free:
+ * @conn: a #GstRTSPConnection
+ *
+ * Close and free @conn.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_connection_free (GstRTSPConnection * conn)
+{
+ GstRTSPResult res;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ res = gst_rtsp_connection_close (conn);
+ gst_poll_free (conn->fdset);
+ g_timer_destroy (conn->timer);
+ gst_rtsp_url_free (conn->url);
+ g_free (conn->proxy_host);
+ g_free (conn);
+#ifdef G_OS_WIN32
+ WSACleanup ();
+#endif
+
+ return res;
+}
+
+/**
+ * gst_rtsp_connection_poll:
+ * @conn: a #GstRTSPConnection
+ * @events: a bitmask of #GstRTSPEvent flags to check
+ * @revents: location for result flags
+ * @timeout: a timeout
+ *
+ * Wait up to the specified @timeout for the connection to become available for
+ * at least one of the operations specified in @events. When the function returns
+ * with #GST_RTSP_OK, @revents will contain a bitmask of available operations on
+ * @conn.
+ *
+ * @timeout can be #NULL, in which case this function might block forever.
+ *
+ * This function can be cancelled with gst_rtsp_connection_flush().
+ *
+ * Returns: #GST_RTSP_OK on success.
+ *
+ * Since: 0.10.15
+ */
+GstRTSPResult
+gst_rtsp_connection_poll (GstRTSPConnection * conn, GstRTSPEvent events,
+ GstRTSPEvent * revents, GTimeVal * timeout)
+{
+ GstClockTime to;
+ gint retval;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (events != 0, GST_RTSP_EINVAL);
+ g_return_val_if_fail (revents != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
+
+ gst_poll_set_controllable (conn->fdset, TRUE);
+
+ /* add fd to writer set when asked to */
+ gst_poll_fd_ctl_write (conn->fdset, conn->writefd,
+ events & GST_RTSP_EV_WRITE);
+
+ /* add fd to reader set when asked to */
+ gst_poll_fd_ctl_read (conn->fdset, conn->readfd, events & GST_RTSP_EV_READ);
+
+ /* configure timeout if any */
+ to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
+
+ do {
+ retval = gst_poll_wait (conn->fdset, to);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if (G_UNLIKELY (retval == 0))
+ goto select_timeout;
+
+ if (G_UNLIKELY (retval == -1)) {
+ if (errno == EBUSY)
+ goto stopped;
+ else
+ goto select_error;
+ }
+
+ *revents = 0;
+ if (events & GST_RTSP_EV_READ) {
+ if (gst_poll_fd_can_read (conn->fdset, conn->readfd))
+ *revents |= GST_RTSP_EV_READ;
+ }
+ if (events & GST_RTSP_EV_WRITE) {
+ if (gst_poll_fd_can_write (conn->fdset, conn->writefd))
+ *revents |= GST_RTSP_EV_WRITE;
+ }
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+select_timeout:
+ {
+ return GST_RTSP_ETIMEOUT;
+ }
+select_error:
+ {
+ return GST_RTSP_ESYS;
+ }
+stopped:
+ {
+ return GST_RTSP_EINTR;
+ }
+}
+
+/**
+ * gst_rtsp_connection_next_timeout:
+ * @conn: a #GstRTSPConnection
+ * @timeout: a timeout
+ *
+ * Calculate the next timeout for @conn, storing the result in @timeout.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_connection_next_timeout (GstRTSPConnection * conn, GTimeVal * timeout)
+{
+ gdouble elapsed;
+ glong sec;
+ gulong usec;
+ gint ctimeout;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (timeout != NULL, GST_RTSP_EINVAL);
+
+ ctimeout = conn->timeout;
+ if (ctimeout >= 20) {
+ /* Because we should act before the timeout we timeout 5
+ * seconds in advance. */
+ ctimeout -= 5;
+ } else if (ctimeout >= 5) {
+ /* else timeout 20% earlier */
+ ctimeout -= ctimeout / 5;
+ } else if (ctimeout >= 1) {
+ /* else timeout 1 second earlier */
+ ctimeout -= 1;
+ }
+
+ elapsed = g_timer_elapsed (conn->timer, &usec);
+ if (elapsed >= ctimeout) {
+ sec = 0;
+ usec = 0;
+ } else {
+ sec = ctimeout - elapsed;
+ if (usec <= G_USEC_PER_SEC)
+ usec = G_USEC_PER_SEC - usec;
+ else
+ usec = 0;
+ }
+
+ timeout->tv_sec = sec;
+ timeout->tv_usec = usec;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_reset_timeout:
+ * @conn: a #GstRTSPConnection
+ *
+ * Reset the timeout of @conn.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_connection_reset_timeout (GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ g_timer_start (conn->timer);
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_flush:
+ * @conn: a #GstRTSPConnection
+ * @flush: start or stop the flush
+ *
+ * Start or stop the flushing action on @conn. When flushing, all current
+ * and future actions on @conn will return #GST_RTSP_EINTR until the connection
+ * is set to non-flushing mode again.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_connection_flush (GstRTSPConnection * conn, gboolean flush)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ gst_poll_set_flushing (conn->fdset, flush);
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_set_proxy:
+ * @conn: a #GstRTSPConnection
+ * @host: the proxy host
+ * @port: the proxy port
+ *
+ * Set the proxy host and port.
+ *
+ * Returns: #GST_RTSP_OK.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_connection_set_proxy (GstRTSPConnection * conn,
+ const gchar * host, guint port)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ g_free (conn->proxy_host);
+ conn->proxy_host = g_strdup (host);
+ conn->proxy_port = port;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_connection_set_auth:
+ * @conn: a #GstRTSPConnection
+ * @method: authentication method
+ * @user: the user
+ * @pass: the password
+ *
+ * Configure @conn for authentication mode @method with @user and @pass as the
+ * user and password respectively.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_connection_set_auth (GstRTSPConnection * conn,
+ GstRTSPAuthMethod method, const gchar * user, const gchar * pass)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ if (method == GST_RTSP_AUTH_DIGEST && ((user == NULL || pass == NULL)
+ || g_strrstr (user, ":") != NULL))
+ return GST_RTSP_EINVAL;
+
+ /* Make sure the username and passwd are being set for authentication */
+ if (method == GST_RTSP_AUTH_NONE && (user == NULL || pass == NULL))
+ return GST_RTSP_EINVAL;
+
+ /* ":" chars are not allowed in usernames for basic auth */
+ if (method == GST_RTSP_AUTH_BASIC && g_strrstr (user, ":") != NULL)
+ return GST_RTSP_EINVAL;
+
+ g_free (conn->username);
+ g_free (conn->passwd);
+
+ conn->auth_method = method;
+ conn->username = g_strdup (user);
+ conn->passwd = g_strdup (pass);
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * str_case_hash:
+ * @key: ASCII string to hash
+ *
+ * Hashes @key in a case-insensitive manner.
+ *
+ * Returns: the hash code.
+ **/
+static guint
+str_case_hash (gconstpointer key)
+{
+ const char *p = key;
+ guint h = g_ascii_toupper (*p);
+
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + g_ascii_toupper (*p);
+
+ return h;
+}
+
+/**
+ * str_case_equal:
+ * @v1: an ASCII string
+ * @v2: another ASCII string
+ *
+ * Compares @v1 and @v2 in a case-insensitive manner
+ *
+ * Returns: %TRUE if they are equal (modulo case)
+ **/
+static gboolean
+str_case_equal (gconstpointer v1, gconstpointer v2)
+{
+ const char *string1 = v1;
+ const char *string2 = v2;
+
+ return g_ascii_strcasecmp (string1, string2) == 0;
+}
+
+/**
+ * gst_rtsp_connection_set_auth_param:
+ * @conn: a #GstRTSPConnection
+ * @param: authentication directive
+ * @value: value
+ *
+ * Setup @conn with authentication directives. This is not necesary for
+ * methods #GST_RTSP_AUTH_NONE and #GST_RTSP_AUTH_BASIC. For
+ * #GST_RTSP_AUTH_DIGEST, directives should be taken from the digest challenge
+ * in the WWW-Authenticate response header and can include realm, domain,
+ * nonce, opaque, stale, algorithm, qop as per RFC2617.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_rtsp_connection_set_auth_param (GstRTSPConnection * conn,
+ const gchar * param, const gchar * value)
+{
+ g_return_if_fail (conn != NULL);
+ g_return_if_fail (param != NULL);
+
+ if (conn->auth_params == NULL) {
+ conn->auth_params =
+ g_hash_table_new_full (str_case_hash, str_case_equal, g_free, g_free);
+ }
+ g_hash_table_insert (conn->auth_params, g_strdup (param), g_strdup (value));
+}
+
+/**
+ * gst_rtsp_connection_clear_auth_params:
+ * @conn: a #GstRTSPConnection
+ *
+ * Clear the list of authentication directives stored in @conn.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_rtsp_connection_clear_auth_params (GstRTSPConnection * conn)
+{
+ g_return_if_fail (conn != NULL);
+
+ if (conn->auth_params != NULL) {
+ g_hash_table_destroy (conn->auth_params);
+ conn->auth_params = NULL;
+ }
+}
+
+static GstRTSPResult
+set_qos_dscp (gint fd, guint qos_dscp)
+{
+ union gst_sockaddr sa;
+ socklen_t slen = sizeof (sa);
+ gint af;
+ gint tos;
+
+ if (fd == -1)
+ return GST_RTSP_OK;
+
+ if (getsockname (fd, &sa.sa, &slen) < 0)
+ goto no_getsockname;
+
+ af = sa.sa.sa_family;
+
+ /* if this is an IPv4-mapped address then do IPv4 QoS */
+ if (af == AF_INET6) {
+ if (IN6_IS_ADDR_V4MAPPED (&sa.sa_in6.sin6_addr))
+ af = AF_INET;
+ }
+
+ /* extract and shift 6 bits of the DSCP */
+ tos = (qos_dscp & 0x3f) << 2;
+
+ switch (af) {
+ case AF_INET:
+ if (SETSOCKOPT (fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0)
+ goto no_setsockopt;
+ break;
+ case AF_INET6:
+#ifdef IPV6_TCLASS
+ if (SETSOCKOPT (fd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof (tos)) < 0)
+ goto no_setsockopt;
+ break;
+#endif
+ default:
+ goto wrong_family;
+ }
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+no_getsockname:
+no_setsockopt:
+ {
+ return GST_RTSP_ESYS;
+ }
+
+wrong_family:
+ {
+ return GST_RTSP_ERROR;
+ }
+}
+
+/**
+ * gst_rtsp_connection_set_qos_dscp:
+ * @conn: a #GstRTSPConnection
+ * @qos_dscp: DSCP value
+ *
+ * Configure @conn to use the specified DSCP value.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ *
+ * Since: 0.10.20
+ */
+GstRTSPResult
+gst_rtsp_connection_set_qos_dscp (GstRTSPConnection * conn, guint qos_dscp)
+{
+ GstRTSPResult res;
+
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
+
+ res = set_qos_dscp (conn->fd0.fd, qos_dscp);
+ if (res == GST_RTSP_OK)
+ res = set_qos_dscp (conn->fd1.fd, qos_dscp);
+
+ return res;
+}
+
+
+/**
+ * gst_rtsp_connection_get_url:
+ * @conn: a #GstRTSPConnection
+ *
+ * Retrieve the URL of the other end of @conn.
+ *
+ * Returns: The URL. This value remains valid until the
+ * connection is freed.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPUrl *
+gst_rtsp_connection_get_url (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, NULL);
+
+ return conn->url;
+}
+
+/**
+ * gst_rtsp_connection_get_ip:
+ * @conn: a #GstRTSPConnection
+ *
+ * Retrieve the IP address of the other end of @conn.
+ *
+ * Returns: The IP address as a string. this value remains valid until the
+ * connection is closed.
+ *
+ * Since: 0.10.20
+ */
+const gchar *
+gst_rtsp_connection_get_ip (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, NULL);
+
+ return conn->ip;
+}
+
+/**
+ * gst_rtsp_connection_set_ip:
+ * @conn: a #GstRTSPConnection
+ * @ip: an ip address
+ *
+ * Set the IP address of the server.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtsp_connection_set_ip (GstRTSPConnection * conn, const gchar * ip)
+{
+ g_return_if_fail (conn != NULL);
+
+ g_free (conn->ip);
+ conn->ip = g_strdup (ip);
+}
+
+/**
+ * gst_rtsp_connection_get_readfd:
+ * @conn: a #GstRTSPConnection
+ *
+ * Get the file descriptor for reading.
+ *
+ * Returns: the file descriptor used for reading or -1 on error. The file
+ * descriptor remains valid until the connection is closed.
+ *
+ * Since: 0.10.23
+ */
+gint
+gst_rtsp_connection_get_readfd (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, -1);
+ g_return_val_if_fail (conn->readfd != NULL, -1);
+
+ return conn->readfd->fd;
+}
+
+/**
+ * gst_rtsp_connection_get_writefd:
+ * @conn: a #GstRTSPConnection
+ *
+ * Get the file descriptor for writing.
+ *
+ * Returns: the file descriptor used for writing or -1 on error. The file
+ * descriptor remains valid until the connection is closed.
+ *
+ * Since: 0.10.23
+ */
+gint
+gst_rtsp_connection_get_writefd (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, -1);
+ g_return_val_if_fail (conn->writefd != NULL, -1);
+
+ return conn->writefd->fd;
+}
+
+/**
+ * gst_rtsp_connection_set_http_mode:
+ * @conn: a #GstRTSPConnection
+ * @enable: %TRUE to enable manual HTTP mode
+ *
+ * By setting the HTTP mode to %TRUE the message parsing will support HTTP
+ * messages in addition to the RTSP messages. It will also disable the
+ * automatic handling of setting up an HTTP tunnel.
+ *
+ * Since: 0.10.25
+ */
+void
+gst_rtsp_connection_set_http_mode (GstRTSPConnection * conn, gboolean enable)
+{
+ g_return_if_fail (conn != NULL);
+
+ conn->manual_http = enable;
+}
+
+/**
+ * gst_rtsp_connection_set_tunneled:
+ * @conn: a #GstRTSPConnection
+ * @tunneled: the new state
+ *
+ * Set the HTTP tunneling state of the connection. This must be configured before
+ * the @conn is connected.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtsp_connection_set_tunneled (GstRTSPConnection * conn, gboolean tunneled)
+{
+ g_return_if_fail (conn != NULL);
+ g_return_if_fail (conn->readfd == NULL);
+ g_return_if_fail (conn->writefd == NULL);
+
+ conn->tunneled = tunneled;
+}
+
+/**
+ * gst_rtsp_connection_is_tunneled:
+ * @conn: a #GstRTSPConnection
+ *
+ * Get the tunneling state of the connection.
+ *
+ * Returns: if @conn is using HTTP tunneling.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_rtsp_connection_is_tunneled (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, FALSE);
+
+ return conn->tunneled;
+}
+
+/**
+ * gst_rtsp_connection_get_tunnelid:
+ * @conn: a #GstRTSPConnection
+ *
+ * Get the tunnel session id the connection.
+ *
+ * Returns: returns a non-empty string if @conn is being tunneled over HTTP.
+ *
+ * Since: 0.10.23
+ */
+const gchar *
+gst_rtsp_connection_get_tunnelid (const GstRTSPConnection * conn)
+{
+ g_return_val_if_fail (conn != NULL, NULL);
+
+ if (!conn->tunneled)
+ return NULL;
+
+ return conn->tunnelid;
+}
+
+/**
+ * gst_rtsp_connection_do_tunnel:
+ * @conn: a #GstRTSPConnection
+ * @conn2: a #GstRTSPConnection or %NULL
+ *
+ * If @conn received the first tunnel connection and @conn2 received
+ * the second tunnel connection, link the two connections together so that
+ * @conn manages the tunneled connection.
+ *
+ * After this call, @conn2 cannot be used anymore and must be freed with
+ * gst_rtsp_connection_free().
+ *
+ * If @conn2 is %NULL then only the base64 decoding context will be setup for
+ * @conn.
+ *
+ * Returns: return GST_RTSP_OK on success.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_connection_do_tunnel (GstRTSPConnection * conn,
+ GstRTSPConnection * conn2)
+{
+ g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
+
+ if (conn2 != NULL) {
+ g_return_val_if_fail (conn->tstate == TUNNEL_STATE_GET, GST_RTSP_EINVAL);
+ g_return_val_if_fail (conn2->tstate == TUNNEL_STATE_POST, GST_RTSP_EINVAL);
+ g_return_val_if_fail (!memcmp (conn2->tunnelid, conn->tunnelid,
+ TUNNELID_LEN), GST_RTSP_EINVAL);
+
+ /* both connections have fd0 as the read/write socket. start by taking the
+ * socket from conn2 and set it as the socket in conn */
+ conn->fd1 = conn2->fd0;
+
+ /* clean up some of the state of conn2 */
+ gst_poll_remove_fd (conn2->fdset, &conn2->fd0);
+ conn2->fd0.fd = -1;
+ conn2->readfd = conn2->writefd = NULL;
+
+ /* We make fd0 the write socket and fd1 the read socket. */
+ conn->writefd = &conn->fd0;
+ conn->readfd = &conn->fd1;
+
+ conn->tstate = TUNNEL_STATE_COMPLETE;
+ }
+
+ /* we need base64 decoding for the readfd */
+ conn->ctx.state = 0;
+ conn->ctx.save = 0;
+ conn->ctx.cout = 0;
+ conn->ctx.coutl = 0;
+ conn->ctxp = &conn->ctx;
+
+ return GST_RTSP_OK;
+}
+
+#define READ_ERR (G_IO_HUP | G_IO_ERR | G_IO_NVAL)
+#define READ_COND (G_IO_IN | READ_ERR)
+#define WRITE_ERR (G_IO_HUP | G_IO_ERR | G_IO_NVAL)
+#define WRITE_COND (G_IO_OUT | WRITE_ERR)
+
+typedef struct
+{
+ guint8 *data;
+ guint size;
+ guint id;
+} GstRTSPRec;
+
+/* async functions */
+struct _GstRTSPWatch
+{
+ GSource source;
+
+ GstRTSPConnection *conn;
+
+ GstRTSPBuilder builder;
+ GstRTSPMessage message;
+
+ GPollFD readfd;
+ GPollFD writefd;
+
+ /* queued message for transmission */
+ guint id;
+ GMutex *mutex;
+ GQueue *messages;
+ guint8 *write_data;
+ guint write_off;
+ guint write_size;
+ guint write_id;
+
+ GstRTSPWatchFuncs funcs;
+
+ gpointer user_data;
+ GDestroyNotify notify;
+};
+
+static gboolean
+gst_rtsp_source_prepare (GSource * source, gint * timeout)
+{
+ GstRTSPWatch *watch = (GstRTSPWatch *) source;
+
+ if (watch->conn->initial_buffer != NULL)
+ return TRUE;
+
+ *timeout = (watch->conn->timeout * 1000);
+
+ return FALSE;
+}
+
+static gboolean
+gst_rtsp_source_check (GSource * source)
+{
+ GstRTSPWatch *watch = (GstRTSPWatch *) source;
+
+ if (watch->readfd.revents & READ_COND)
+ return TRUE;
+
+ if (watch->writefd.revents & WRITE_COND)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+gst_rtsp_source_dispatch (GSource * source, GSourceFunc callback G_GNUC_UNUSED,
+ gpointer user_data G_GNUC_UNUSED)
+{
+ GstRTSPWatch *watch = (GstRTSPWatch *) source;
+ GstRTSPResult res = GST_RTSP_ERROR;
+ gboolean keep_running = TRUE;
+
+ /* first read as much as we can */
+ if (watch->readfd.revents & READ_COND || watch->conn->initial_buffer != NULL) {
+ do {
+ if (watch->readfd.revents & READ_ERR)
+ goto read_error;
+
+ res = build_next (&watch->builder, &watch->message, watch->conn);
+ if (res == GST_RTSP_EINTR)
+ break;
+ else if (G_UNLIKELY (res == GST_RTSP_EEOF)) {
+ watch->readfd.events = 0;
+ watch->readfd.revents = 0;
+ g_source_remove_poll ((GSource *) watch, &watch->readfd);
+ /* When we are in tunnelled mode, the read socket can be closed and we
+ * should be prepared for a new POST method to reopen it */
+ if (watch->conn->tstate == TUNNEL_STATE_COMPLETE) {
+ /* remove the read connection for the tunnel */
+ /* we accept a new POST request */
+ watch->conn->tstate = TUNNEL_STATE_GET;
+ /* and signal that we lost our tunnel */
+ if (watch->funcs.tunnel_lost)
+ res = watch->funcs.tunnel_lost (watch, watch->user_data);
+ goto read_done;
+ } else
+ goto eof;
+ } else if (G_LIKELY (res == GST_RTSP_OK)) {
+ if (!watch->conn->manual_http &&
+ watch->message.type == GST_RTSP_MESSAGE_HTTP_REQUEST) {
+ if (watch->conn->tstate == TUNNEL_STATE_NONE &&
+ watch->message.type_data.request.method == GST_RTSP_GET) {
+ GstRTSPMessage *response;
+ GstRTSPStatusCode code;
+
+ watch->conn->tstate = TUNNEL_STATE_GET;
+
+ if (watch->funcs.tunnel_start)
+ code = watch->funcs.tunnel_start (watch, watch->user_data);
+ else
+ code = GST_RTSP_STS_OK;
+
+ /* queue the response */
+ response = gen_tunnel_reply (watch->conn, code, &watch->message);
+ gst_rtsp_watch_send_message (watch, response, NULL);
+ gst_rtsp_message_free (response);
+ goto read_done;
+ } else if (watch->conn->tstate == TUNNEL_STATE_NONE &&
+ watch->message.type_data.request.method == GST_RTSP_POST) {
+ watch->conn->tstate = TUNNEL_STATE_POST;
+
+ /* in the callback the connection should be tunneled with the
+ * GET connection */
+ if (watch->funcs.tunnel_complete)
+ watch->funcs.tunnel_complete (watch, watch->user_data);
+ goto read_done;
+ }
+ }
+ }
+
+ if (!watch->conn->manual_http) {
+ /* if manual HTTP support is not enabled, then restore the message to
+ * what it would have looked like without the support for parsing HTTP
+ * messages being present */
+ if (watch->message.type == GST_RTSP_MESSAGE_HTTP_REQUEST) {
+ watch->message.type = GST_RTSP_MESSAGE_REQUEST;
+ watch->message.type_data.request.method = GST_RTSP_INVALID;
+ if (watch->message.type_data.request.version != GST_RTSP_VERSION_1_0)
+ watch->message.type_data.request.version = GST_RTSP_VERSION_INVALID;
+ res = GST_RTSP_EPARSE;
+ } else if (watch->message.type == GST_RTSP_MESSAGE_HTTP_RESPONSE) {
+ watch->message.type = GST_RTSP_MESSAGE_RESPONSE;
+ if (watch->message.type_data.response.version != GST_RTSP_VERSION_1_0)
+ watch->message.type_data.response.version =
+ GST_RTSP_VERSION_INVALID;
+ res = GST_RTSP_EPARSE;
+ }
+ }
+
+ if (G_LIKELY (res == GST_RTSP_OK)) {
+ if (watch->funcs.message_received)
+ watch->funcs.message_received (watch, &watch->message,
+ watch->user_data);
+ } else {
+ goto read_error;
+ }
+
+ read_done:
+ gst_rtsp_message_unset (&watch->message);
+ build_reset (&watch->builder);
+ } while (FALSE);
+ }
+
+ if (watch->writefd.revents & WRITE_COND) {
+ if (watch->writefd.revents & WRITE_ERR)
+ goto write_error;
+
+ g_mutex_lock (watch->mutex);
+ do {
+ if (watch->write_data == NULL) {
+ GstRTSPRec *rec;
+
+ /* get a new message from the queue */
+ rec = g_queue_pop_tail (watch->messages);
+ if (rec == NULL)
+ break;
+
+ watch->write_off = 0;
+ watch->write_data = rec->data;
+ watch->write_size = rec->size;
+ watch->write_id = rec->id;
+
+ g_slice_free (GstRTSPRec, rec);
+ }
+
+ res = write_bytes (watch->writefd.fd, watch->write_data,
+ &watch->write_off, watch->write_size);
+ g_mutex_unlock (watch->mutex);
+
+ if (res == GST_RTSP_EINTR)
+ goto write_blocked;
+ else if (G_LIKELY (res == GST_RTSP_OK)) {
+ if (watch->funcs.message_sent)
+ watch->funcs.message_sent (watch, watch->write_id, watch->user_data);
+ } else {
+ goto write_error;
+ }
+ g_mutex_lock (watch->mutex);
+
+ g_free (watch->write_data);
+ watch->write_data = NULL;
+ } while (TRUE);
+
+ watch->writefd.events = WRITE_ERR;
+
+ g_mutex_unlock (watch->mutex);
+ }
+
+write_blocked:
+ return keep_running;
+
+ /* ERRORS */
+eof:
+ {
+ if (watch->funcs.closed)
+ watch->funcs.closed (watch, watch->user_data);
+
+ /* always stop when the readfd returns EOF in non-tunneled mode */
+ return FALSE;
+ }
+read_error:
+ {
+ watch->readfd.events = 0;
+ watch->readfd.revents = 0;
+ g_source_remove_poll ((GSource *) watch, &watch->readfd);
+ keep_running = (watch->writefd.events != 0);
+
+ if (keep_running) {
+ if (watch->funcs.error_full)
+ GST_RTSP_CHECK (watch->funcs.error_full (watch, res, &watch->message,
+ 0, watch->user_data), error);
+ else
+ goto error;
+ } else
+ goto eof;
+ }
+write_error:
+ {
+ watch->writefd.events = 0;
+ watch->writefd.revents = 0;
+ g_source_remove_poll ((GSource *) watch, &watch->writefd);
+ keep_running = (watch->readfd.events != 0);
+
+ if (keep_running) {
+ if (watch->funcs.error_full)
+ GST_RTSP_CHECK (watch->funcs.error_full (watch, res, NULL,
+ watch->write_id, watch->user_data), error);
+ else
+ goto error;
+ } else
+ goto eof;
+ }
+error:
+ {
+ if (watch->funcs.error)
+ watch->funcs.error (watch, res, watch->user_data);
+
+ return keep_running;
+ }
+}
+
+static void
+gst_rtsp_rec_free (gpointer data)
+{
+ GstRTSPRec *rec = data;
+
+ g_free (rec->data);
+ g_slice_free (GstRTSPRec, rec);
+}
+
+static void
+gst_rtsp_source_finalize (GSource * source)
+{
+ GstRTSPWatch *watch = (GstRTSPWatch *) source;
+
+ build_reset (&watch->builder);
+ gst_rtsp_message_unset (&watch->message);
+
+ g_queue_foreach (watch->messages, (GFunc) gst_rtsp_rec_free, NULL);
+ g_queue_free (watch->messages);
+ watch->messages = NULL;
+ g_free (watch->write_data);
+
+ g_mutex_free (watch->mutex);
+
+ if (watch->notify)
+ watch->notify (watch->user_data);
+}
+
+static GSourceFuncs gst_rtsp_source_funcs = {
+ gst_rtsp_source_prepare,
+ gst_rtsp_source_check,
+ gst_rtsp_source_dispatch,
+ gst_rtsp_source_finalize,
+ NULL,
+ NULL
+};
+
+/**
+ * gst_rtsp_watch_new:
+ * @conn: a #GstRTSPConnection
+ * @funcs: watch functions
+ * @user_data: user data to pass to @funcs
+ * @notify: notify when @user_data is not referenced anymore
+ *
+ * Create a watch object for @conn. The functions provided in @funcs will be
+ * called with @user_data when activity happened on the watch.
+ *
+ * The new watch is usually created so that it can be attached to a
+ * maincontext with gst_rtsp_watch_attach().
+ *
+ * @conn must exist for the entire lifetime of the watch.
+ *
+ * Returns: a #GstRTSPWatch that can be used for asynchronous RTSP
+ * communication. Free with gst_rtsp_watch_unref () after usage.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPWatch *
+gst_rtsp_watch_new (GstRTSPConnection * conn,
+ GstRTSPWatchFuncs * funcs, gpointer user_data, GDestroyNotify notify)
+{
+ GstRTSPWatch *result;
+
+ g_return_val_if_fail (conn != NULL, NULL);
+ g_return_val_if_fail (funcs != NULL, NULL);
+ g_return_val_if_fail (conn->readfd != NULL, NULL);
+ g_return_val_if_fail (conn->writefd != NULL, NULL);
+
+ result = (GstRTSPWatch *) g_source_new (&gst_rtsp_source_funcs,
+ sizeof (GstRTSPWatch));
+
+ result->conn = conn;
+ result->builder.state = STATE_START;
+
+ result->mutex = g_mutex_new ();
+ result->messages = g_queue_new ();
+
+ result->readfd.fd = -1;
+ result->writefd.fd = -1;
+
+ gst_rtsp_watch_reset (result);
+
+ result->funcs = *funcs;
+ result->user_data = user_data;
+ result->notify = notify;
+
+ return result;
+}
+
+/**
+ * gst_rtsp_watch_reset:
+ * @watch: a #GstRTSPWatch
+ *
+ * Reset @watch, this is usually called after gst_rtsp_connection_do_tunnel()
+ * when the file descriptors of the connection might have changed.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtsp_watch_reset (GstRTSPWatch * watch)
+{
+ if (watch->readfd.fd != -1)
+ g_source_remove_poll ((GSource *) watch, &watch->readfd);
+ if (watch->writefd.fd != -1)
+ g_source_remove_poll ((GSource *) watch, &watch->writefd);
+
+ watch->readfd.fd = watch->conn->readfd->fd;
+ watch->readfd.events = READ_COND;
+ watch->readfd.revents = 0;
+
+ watch->writefd.fd = watch->conn->writefd->fd;
+ watch->writefd.events = WRITE_ERR;
+ watch->writefd.revents = 0;
+
+ if (watch->readfd.fd != -1)
+ g_source_add_poll ((GSource *) watch, &watch->readfd);
+ if (watch->writefd.fd != -1)
+ g_source_add_poll ((GSource *) watch, &watch->writefd);
+}
+
+/**
+ * gst_rtsp_watch_attach:
+ * @watch: a #GstRTSPWatch
+ * @context: a GMainContext (if NULL, the default context will be used)
+ *
+ * Adds a #GstRTSPWatch to a context so that it will be executed within that context.
+ *
+ * Returns: the ID (greater than 0) for the watch within the GMainContext.
+ *
+ * Since: 0.10.23
+ */
+guint
+gst_rtsp_watch_attach (GstRTSPWatch * watch, GMainContext * context)
+{
+ g_return_val_if_fail (watch != NULL, 0);
+
+ return g_source_attach ((GSource *) watch, context);
+}
+
+/**
+ * gst_rtsp_watch_unref:
+ * @watch: a #GstRTSPWatch
+ *
+ * Decreases the reference count of @watch by one. If the resulting reference
+ * count is zero the watch and associated memory will be destroyed.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_rtsp_watch_unref (GstRTSPWatch * watch)
+{
+ g_return_if_fail (watch != NULL);
+
+ g_source_unref ((GSource *) watch);
+}
+
+/**
+ * gst_rtsp_watch_write_data:
+ * @watch: a #GstRTSPWatch
+ * @data: the data to queue
+ * @size: the size of @data
+ * @id: location for a message ID or %NULL
+ *
+ * Write @data using the connection of the @watch. If it cannot be sent
+ * immediately, it will be queued for transmission in @watch. The contents of
+ * @message will then be serialized and transmitted when the connection of the
+ * @watch becomes writable. In case the @message is queued, the ID returned in
+ * @id will be non-zero and used as the ID argument in the message_sent
+ * callback.
+ *
+ * This function will take ownership of @data and g_free() it after use.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ *
+ * Since: 0.10.25
+ */
+GstRTSPResult
+gst_rtsp_watch_write_data (GstRTSPWatch * watch, const guint8 * data,
+ guint size, guint * id)
+{
+ GstRTSPResult res;
+ GstRTSPRec *rec;
+ guint off = 0;
+ GMainContext *context = NULL;
+
+ g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (size != 0, GST_RTSP_EINVAL);
+
+ g_mutex_lock (watch->mutex);
+
+ /* try to send the message synchronously first */
+ if (watch->messages->length == 0) {
+ res = write_bytes (watch->writefd.fd, data, &off, size);
+ if (res != GST_RTSP_EINTR) {
+ if (id != NULL)
+ *id = 0;
+ g_free ((gpointer) data);
+ goto done;
+ }
+ }
+
+ /* make a record with the data and id for sending async */
+ rec = g_slice_new (GstRTSPRec);
+ if (off == 0) {
+ rec->data = (guint8 *) data;
+ rec->size = size;
+ } else {
+ rec->data = g_memdup (data + off, size - off);
+ rec->size = size - off;
+ g_free ((gpointer) data);
+ }
+
+ do {
+ /* make sure rec->id is never 0 */
+ rec->id = ++watch->id;
+ } while (G_UNLIKELY (rec->id == 0));
+
+ /* add the record to a queue. FIXME we would like to have an upper limit here */
+ g_queue_push_head (watch->messages, rec);
+
+ /* make sure the main context will now also check for writability on the
+ * socket */
+ if (watch->writefd.events != WRITE_COND) {
+ watch->writefd.events = WRITE_COND;
+ context = ((GSource *) watch)->context;
+ }
+
+ if (id != NULL)
+ *id = rec->id;
+ res = GST_RTSP_OK;
+
+done:
+ g_mutex_unlock (watch->mutex);
+
+ if (context)
+ g_main_context_wakeup (context);
+
+ return res;
+}
+
+/**
+ * gst_rtsp_watch_send_message:
+ * @watch: a #GstRTSPWatch
+ * @message: a #GstRTSPMessage
+ * @id: location for a message ID or %NULL
+ *
+ * Send a @message using the connection of the @watch. If it cannot be sent
+ * immediately, it will be queued for transmission in @watch. The contents of
+ * @message will then be serialized and transmitted when the connection of the
+ * @watch becomes writable. In case the @message is queued, the ID returned in
+ * @id will be non-zero and used as the ID argument in the message_sent
+ * callback.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ *
+ * Since: 0.10.25
+ */
+GstRTSPResult
+gst_rtsp_watch_send_message (GstRTSPWatch * watch, GstRTSPMessage * message,
+ guint * id)
+{
+ GString *str;
+ guint size;
+
+ g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
+
+ /* make a record with the message as a string and id */
+ str = message_to_string (watch->conn, message);
+ size = str->len;
+ return gst_rtsp_watch_write_data (watch,
+ (guint8 *) g_string_free (str, FALSE), size, id);
+}
+
+/**
+ * gst_rtsp_watch_queue_data:
+ * @watch: a #GstRTSPWatch
+ * @data: the data to queue
+ * @size: the size of @data
+ *
+ * Queue @data for transmission in @watch. It will be transmitted when the
+ * connection of the @watch becomes writable.
+ *
+ * This function will take ownership of @data and g_free() it after use.
+ *
+ * The return value of this function will be used as the id argument in the
+ * message_sent callback.
+ *
+ * Deprecated: Use gst_rtsp_watch_write_data()
+ *
+ * Returns: an id.
+ *
+ * Since: 0.10.24
+ */
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+guint
+gst_rtsp_watch_queue_data (GstRTSPWatch * watch, const guint8 * data,
+ guint size);
+#endif
+guint
+gst_rtsp_watch_queue_data (GstRTSPWatch * watch, const guint8 * data,
+ guint size)
+{
+ GstRTSPRec *rec;
+ GMainContext *context = NULL;
+
+ g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (size != 0, GST_RTSP_EINVAL);
+
+ g_mutex_lock (watch->mutex);
+
+ /* make a record with the data and id */
+ rec = g_slice_new (GstRTSPRec);
+ rec->data = (guint8 *) data;
+ rec->size = size;
+ do {
+ /* make sure rec->id is never 0 */
+ rec->id = ++watch->id;
+ } while (G_UNLIKELY (rec->id == 0));
+
+ /* add the record to a queue. FIXME we would like to have an upper limit here */
+ g_queue_push_head (watch->messages, rec);
+
+ /* make sure the main context will now also check for writability on the
+ * socket */
+ if (watch->writefd.events != WRITE_COND) {
+ watch->writefd.events = WRITE_COND;
+ context = ((GSource *) watch)->context;
+ }
+ g_mutex_unlock (watch->mutex);
+
+ if (context)
+ g_main_context_wakeup (context);
+
+ return rec->id;
+}
+#endif /* GST_REMOVE_DEPRECATED */
+
+/**
+ * gst_rtsp_watch_queue_message:
+ * @watch: a #GstRTSPWatch
+ * @message: a #GstRTSPMessage
+ *
+ * Queue a @message for transmission in @watch. The contents of this
+ * message will be serialized and transmitted when the connection of the
+ * @watch becomes writable.
+ *
+ * The return value of this function will be used as the id argument in the
+ * message_sent callback.
+ *
+ * Deprecated: Use gst_rtsp_watch_send_message()
+ *
+ * Returns: an id.
+ *
+ * Since: 0.10.23
+ */
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+guint
+gst_rtsp_watch_queue_message (GstRTSPWatch * watch, GstRTSPMessage * message);
+#endif
+guint
+gst_rtsp_watch_queue_message (GstRTSPWatch * watch, GstRTSPMessage * message)
+{
+ GString *str;
+ guint size;
+
+ g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
+
+ /* make a record with the message as a string and id */
+ str = message_to_string (watch->conn, message);
+ size = str->len;
+ return gst_rtsp_watch_queue_data (watch,
+ (guint8 *) g_string_free (str, FALSE), size);
+}
+#endif /* GST_REMOVE_DEPRECATED */
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.h b/gst-libs/gst/rtsp/gstrtspconnection.h
new file mode 100644
index 0000000..2a34abd
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspconnection.h
@@ -0,0 +1,209 @@
+/* GStreamer
+ * Copyright (C) <2005,2009> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/*
+ * 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_CONNECTION_H__
+#define __GST_RTSP_CONNECTION_H__
+
+#include <glib.h>
+
+#include <gst/gstconfig.h>
+#include <gst/rtsp/gstrtspdefs.h>
+#include <gst/rtsp/gstrtspurl.h>
+#include <gst/rtsp/gstrtspmessage.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstRTSPConnection:
+ *
+ * Opaque RTSP connection object.
+ */
+typedef struct _GstRTSPConnection GstRTSPConnection;
+
+/* opening/closing a connection */
+GstRTSPResult gst_rtsp_connection_create (const GstRTSPUrl *url, GstRTSPConnection **conn);
+GstRTSPResult gst_rtsp_connection_create_from_fd (gint fd,
+ const gchar * ip,
+ guint16 port,
+ const gchar * initial_buffer,
+ GstRTSPConnection ** conn);
+GstRTSPResult gst_rtsp_connection_accept (gint sock, GstRTSPConnection **conn);
+GstRTSPResult gst_rtsp_connection_connect (GstRTSPConnection *conn, GTimeVal *timeout);
+GstRTSPResult gst_rtsp_connection_close (GstRTSPConnection *conn);
+GstRTSPResult gst_rtsp_connection_free (GstRTSPConnection *conn);
+
+
+/* sending/receiving raw bytes */
+GstRTSPResult gst_rtsp_connection_read (GstRTSPConnection * conn, guint8 * data,
+ guint size, GTimeVal * timeout);
+GstRTSPResult gst_rtsp_connection_write (GstRTSPConnection * conn, const guint8 * data,
+ guint size, GTimeVal * timeout);
+
+/* sending/receiving messages */
+GstRTSPResult gst_rtsp_connection_send (GstRTSPConnection *conn, GstRTSPMessage *message,
+ GTimeVal *timeout);
+GstRTSPResult gst_rtsp_connection_receive (GstRTSPConnection *conn, GstRTSPMessage *message,
+ GTimeVal *timeout);
+
+/* status management */
+GstRTSPResult gst_rtsp_connection_poll (GstRTSPConnection *conn, GstRTSPEvent events,
+ GstRTSPEvent *revents, GTimeVal *timeout);
+
+/* reset the timeout */
+GstRTSPResult gst_rtsp_connection_next_timeout (GstRTSPConnection *conn, GTimeVal *timeout);
+GstRTSPResult gst_rtsp_connection_reset_timeout (GstRTSPConnection *conn);
+
+/* flushing state */
+GstRTSPResult gst_rtsp_connection_flush (GstRTSPConnection *conn, gboolean flush);
+
+/* HTTP proxy support */
+GstRTSPResult gst_rtsp_connection_set_proxy (GstRTSPConnection *conn,
+ const gchar *host, guint port);
+
+/* configure authentication data */
+GstRTSPResult gst_rtsp_connection_set_auth (GstRTSPConnection *conn, GstRTSPAuthMethod method,
+ const gchar *user, const gchar *pass);
+
+void gst_rtsp_connection_set_auth_param (GstRTSPConnection *conn,
+ const gchar * param,
+ const gchar *value);
+void gst_rtsp_connection_clear_auth_params (GstRTSPConnection *conn);
+
+/* configure DSCP */
+GstRTSPResult gst_rtsp_connection_set_qos_dscp (GstRTSPConnection *conn,
+ guint qos_dscp);
+
+/* accessors */
+GstRTSPUrl * gst_rtsp_connection_get_url (const GstRTSPConnection *conn);
+const gchar * gst_rtsp_connection_get_ip (const GstRTSPConnection *conn);
+void gst_rtsp_connection_set_ip (GstRTSPConnection *conn, const gchar *ip);
+
+gint gst_rtsp_connection_get_readfd (const GstRTSPConnection *conn);
+gint gst_rtsp_connection_get_writefd (const GstRTSPConnection *conn);
+
+void gst_rtsp_connection_set_http_mode (GstRTSPConnection *conn,
+ gboolean enable);
+
+/* tunneling */
+void gst_rtsp_connection_set_tunneled (GstRTSPConnection *conn, gboolean tunneled);
+gboolean gst_rtsp_connection_is_tunneled (const GstRTSPConnection *conn);
+
+const gchar * gst_rtsp_connection_get_tunnelid (const GstRTSPConnection *conn);
+GstRTSPResult gst_rtsp_connection_do_tunnel (GstRTSPConnection *conn, GstRTSPConnection *conn2);
+
+/* async IO */
+
+/**
+ * GstRTSPWatch:
+ *
+ * Opaque RTSP watch object that can be used for asynchronous RTSP
+ * operations.
+ */
+typedef struct _GstRTSPWatch GstRTSPWatch;
+
+/**
+ * GstRTSPWatchFuncs:
+ * @message_received: callback when a message was received
+ * @message_sent: callback when a message was sent
+ * @closed: callback when the connection is closed
+ * @error: callback when an error occured
+ * @tunnel_start: a client started a tunneled connection. The tunnelid of the
+ * connection must be saved.
+ * @tunnel_complete: a client finished a tunneled connection. In this callback
+ * you usually pair the tunnelid of this connection with the saved one using
+ * gst_rtsp_connection_do_tunnel().
+ * @error_full: callback when an error occured with more information than
+ * the @error callback. Since 0.10.25
+ * @tunnel_lost: callback when the post connection of a tunnel is closed.
+ * Since 0.10.29
+ *
+ * Callback functions from a #GstRTSPWatch.
+ *
+ * Since: 0.10.23
+ */
+typedef struct {
+ GstRTSPResult (*message_received) (GstRTSPWatch *watch, GstRTSPMessage *message,
+ gpointer user_data);
+ GstRTSPResult (*message_sent) (GstRTSPWatch *watch, guint id,
+ gpointer user_data);
+ GstRTSPResult (*closed) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*error) (GstRTSPWatch *watch, GstRTSPResult result,
+ gpointer user_data);
+ GstRTSPStatusCode (*tunnel_start) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*tunnel_complete) (GstRTSPWatch *watch, gpointer user_data);
+ GstRTSPResult (*error_full) (GstRTSPWatch *watch, GstRTSPResult result,
+ GstRTSPMessage *message, guint id,
+ gpointer user_data);
+ GstRTSPResult (*tunnel_lost) (GstRTSPWatch *watch, gpointer user_data);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 2];
+} GstRTSPWatchFuncs;
+
+GstRTSPWatch * gst_rtsp_watch_new (GstRTSPConnection *conn,
+ GstRTSPWatchFuncs *funcs,
+ gpointer user_data,
+ GDestroyNotify notify);
+void gst_rtsp_watch_reset (GstRTSPWatch *watch);
+void gst_rtsp_watch_unref (GstRTSPWatch *watch);
+
+guint gst_rtsp_watch_attach (GstRTSPWatch *watch,
+ GMainContext *context);
+
+GstRTSPResult gst_rtsp_watch_write_data (GstRTSPWatch *watch,
+ const guint8 *data,
+ guint size, guint *id);
+GstRTSPResult gst_rtsp_watch_send_message (GstRTSPWatch *watch,
+ GstRTSPMessage *message,
+ guint *id);
+
+#ifndef GST_DISABLE_DEPRECATED
+guint gst_rtsp_watch_queue_data (GstRTSPWatch * watch,
+ const guint8 * data,
+ guint size);
+guint gst_rtsp_watch_queue_message (GstRTSPWatch *watch,
+ GstRTSPMessage *message);
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_CONNECTION_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtspdefs.c b/gst-libs/gst/rtsp/gstrtspdefs.c
new file mode 100644
index 0000000..ee74b98
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspdefs.c
@@ -0,0 +1,508 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstrtspdefs
+ * @short_description: common RTSP defines
+ * @see_also: gstrtspurl, gstrtspconnection
+ *
+ * Provides common defines for the RTSP library.
+ *
+ * Last reviewed on 2007-07-24 (0.10.14)
+ */
+
+#include <errno.h>
+
+#include "gstrtspdefs.h"
+
+#ifdef G_OS_WIN32
+#include <winsock2.h>
+#else
+#include <netdb.h>
+#endif
+
+struct rtsp_header
+{
+ const gchar *name;
+ gboolean multiple;
+};
+
+static const gchar *rtsp_methods[] = {
+ "DESCRIBE",
+ "ANNOUNCE",
+ "GET_PARAMETER",
+ "OPTIONS",
+ "PAUSE",
+ "PLAY",
+ "RECORD",
+ "REDIRECT",
+ "SETUP",
+ "SET_PARAMETER",
+ "TEARDOWN",
+ "GET",
+ "POST",
+ NULL
+};
+
+static struct rtsp_header rtsp_headers[] = {
+ {"Accept", TRUE},
+ {"Accept-Encoding", TRUE},
+ {"Accept-Language", TRUE},
+ {"Allow", TRUE},
+ {"Authorization", FALSE},
+ {"Bandwidth", FALSE},
+ {"Blocksize", FALSE},
+ {"Cache-Control", TRUE},
+ {"Conference", FALSE},
+ {"Connection", TRUE},
+ {"Content-Base", FALSE},
+ {"Content-Encoding", TRUE},
+ {"Content-Language", TRUE},
+ {"Content-Length", FALSE},
+ {"Content-Location", FALSE},
+ {"Content-Type", FALSE},
+ {"CSeq", FALSE},
+ {"Date", FALSE},
+ {"Expires", FALSE},
+ {"From", FALSE},
+ {"If-Modified-Since", FALSE},
+ {"Last-Modified", FALSE},
+ {"Proxy-Authenticate", TRUE},
+ {"Proxy-Require", TRUE},
+ {"Public", TRUE},
+ {"Range", FALSE},
+ {"Referer", FALSE},
+ {"Require", TRUE},
+ {"Retry-After", FALSE},
+ {"RTP-Info", TRUE},
+ {"Scale", FALSE},
+ {"Session", FALSE},
+ {"Server", FALSE},
+ {"Speed", FALSE},
+ {"Transport", TRUE},
+ {"Unsupported", FALSE},
+ {"User-Agent", FALSE},
+ {"Via", TRUE},
+ {"WWW-Authenticate", TRUE},
+
+ /* Real extensions */
+ {"ClientChallenge", FALSE},
+ {"RealChallenge1", FALSE},
+ {"RealChallenge2", FALSE},
+ {"RealChallenge3", FALSE},
+ {"Subscribe", FALSE},
+ {"Alert", FALSE},
+ {"ClientID", FALSE},
+ {"CompanyID", FALSE},
+ {"GUID", FALSE},
+ {"RegionData", FALSE},
+ {"SupportsMaximumASMBandwidth", FALSE},
+ {"Language", FALSE},
+ {"PlayerStarttime", FALSE},
+
+ /* Since 0.10.16 */
+ {"Location", FALSE},
+
+ /* Since 0.10.23 */
+ {"ETag", FALSE},
+ {"If-Match", TRUE},
+
+ /* WM extensions [MS-RTSP] Since 0.10.23 */
+ {"Accept-Charset", TRUE},
+ {"Supported", TRUE},
+ {"Vary", TRUE},
+ {"X-Accelerate-Streaming", FALSE},
+ {"X-Accept-Authentication", FALSE},
+ {"X-Accept-Proxy-Authentication", FALSE},
+ {"X-Broadcast-Id", FALSE},
+ {"X-Burst-Streaming", FALSE},
+ {"X-Notice", FALSE},
+ {"X-Player-Lag-Time", FALSE},
+ {"X-Playlist", FALSE},
+ {"X-Playlist-Change-Notice", FALSE},
+ {"X-Playlist-Gen-Id", FALSE},
+ {"X-Playlist-Seek-Id", FALSE},
+ {"X-Proxy-Client-Agent", FALSE},
+ {"X-Proxy-Client-Verb", FALSE},
+ {"X-Receding-PlaylistChange", FALSE},
+ {"X-RTP-Info", FALSE},
+ {"X-StartupProfile", FALSE},
+
+ /* Since 0.10.24 */
+ {"Timestamp", FALSE},
+
+ /* Since 0.10.25 */
+ {"Authentication-Info", FALSE},
+ {"Host", FALSE},
+ {"Pragma", TRUE},
+ {"X-Server-IP-Address", FALSE},
+ {"X-Sessioncookie", FALSE},
+
+ /* Since 0.10.36 */
+ {"RTCP-Interval", FALSE},
+
+ {NULL, FALSE}
+};
+
+#define DEF_STATUS(c, t) \
+ g_hash_table_insert (statuses, GUINT_TO_POINTER(c), (gpointer) t)
+
+static GHashTable *
+rtsp_init_status (void)
+{
+ GHashTable *statuses = g_hash_table_new (NULL, NULL);
+
+ DEF_STATUS (GST_RTSP_STS_CONTINUE, "Continue");
+ DEF_STATUS (GST_RTSP_STS_OK, "OK");
+ DEF_STATUS (GST_RTSP_STS_CREATED, "Created");
+ DEF_STATUS (GST_RTSP_STS_LOW_ON_STORAGE, "Low on Storage Space");
+ DEF_STATUS (GST_RTSP_STS_MULTIPLE_CHOICES, "Multiple Choices");
+ DEF_STATUS (GST_RTSP_STS_MOVED_PERMANENTLY, "Moved Permanently");
+ DEF_STATUS (GST_RTSP_STS_MOVE_TEMPORARILY, "Move Temporarily");
+ DEF_STATUS (GST_RTSP_STS_SEE_OTHER, "See Other");
+ DEF_STATUS (GST_RTSP_STS_NOT_MODIFIED, "Not Modified");
+ DEF_STATUS (GST_RTSP_STS_USE_PROXY, "Use Proxy");
+ DEF_STATUS (GST_RTSP_STS_BAD_REQUEST, "Bad Request");
+ DEF_STATUS (GST_RTSP_STS_UNAUTHORIZED, "Unauthorized");
+ DEF_STATUS (GST_RTSP_STS_PAYMENT_REQUIRED, "Payment Required");
+ DEF_STATUS (GST_RTSP_STS_FORBIDDEN, "Forbidden");
+ DEF_STATUS (GST_RTSP_STS_NOT_FOUND, "Not Found");
+ DEF_STATUS (GST_RTSP_STS_METHOD_NOT_ALLOWED, "Method Not Allowed");
+ DEF_STATUS (GST_RTSP_STS_NOT_ACCEPTABLE, "Not Acceptable");
+ DEF_STATUS (GST_RTSP_STS_PROXY_AUTH_REQUIRED,
+ "Proxy Authentication Required");
+ DEF_STATUS (GST_RTSP_STS_REQUEST_TIMEOUT, "Request Time-out");
+ DEF_STATUS (GST_RTSP_STS_GONE, "Gone");
+ DEF_STATUS (GST_RTSP_STS_LENGTH_REQUIRED, "Length Required");
+ DEF_STATUS (GST_RTSP_STS_PRECONDITION_FAILED, "Precondition Failed");
+ DEF_STATUS (GST_RTSP_STS_REQUEST_ENTITY_TOO_LARGE,
+ "Request Entity Too Large");
+ DEF_STATUS (GST_RTSP_STS_REQUEST_URI_TOO_LARGE, "Request-URI Too Large");
+ DEF_STATUS (GST_RTSP_STS_UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type");
+ DEF_STATUS (GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD,
+ "Parameter Not Understood");
+ DEF_STATUS (GST_RTSP_STS_CONFERENCE_NOT_FOUND, "Conference Not Found");
+ DEF_STATUS (GST_RTSP_STS_NOT_ENOUGH_BANDWIDTH, "Not Enough Bandwidth");
+ DEF_STATUS (GST_RTSP_STS_SESSION_NOT_FOUND, "Session Not Found");
+ DEF_STATUS (GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE,
+ "Method Not Valid in This State");
+ DEF_STATUS (GST_RTSP_STS_HEADER_FIELD_NOT_VALID_FOR_RESOURCE,
+ "Header Field Not Valid for Resource");
+ DEF_STATUS (GST_RTSP_STS_INVALID_RANGE, "Invalid Range");
+ DEF_STATUS (GST_RTSP_STS_PARAMETER_IS_READONLY, "Parameter Is Read-Only");
+ DEF_STATUS (GST_RTSP_STS_AGGREGATE_OPERATION_NOT_ALLOWED,
+ "Aggregate operation not allowed");
+ DEF_STATUS (GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED,
+ "Only aggregate operation allowed");
+ DEF_STATUS (GST_RTSP_STS_UNSUPPORTED_TRANSPORT, "Unsupported transport");
+ DEF_STATUS (GST_RTSP_STS_DESTINATION_UNREACHABLE, "Destination unreachable");
+ DEF_STATUS (GST_RTSP_STS_INTERNAL_SERVER_ERROR, "Internal Server Error");
+ DEF_STATUS (GST_RTSP_STS_NOT_IMPLEMENTED, "Not Implemented");
+ DEF_STATUS (GST_RTSP_STS_BAD_GATEWAY, "Bad Gateway");
+ DEF_STATUS (GST_RTSP_STS_SERVICE_UNAVAILABLE, "Service Unavailable");
+ DEF_STATUS (GST_RTSP_STS_GATEWAY_TIMEOUT, "Gateway Time-out");
+ DEF_STATUS (GST_RTSP_STS_RTSP_VERSION_NOT_SUPPORTED,
+ "RTSP Version not supported");
+ DEF_STATUS (GST_RTSP_STS_OPTION_NOT_SUPPORTED, "Option not supported");
+
+ return statuses;
+}
+
+/**
+ * gst_rtsp_strresult:
+ * @result: a #GstRTSPResult
+ *
+ * Convert @result in a human readable string.
+ *
+ * Returns: a newly allocated string. g_free() after usage.
+ */
+gchar *
+gst_rtsp_strresult (GstRTSPResult result)
+{
+ switch (result) {
+ case GST_RTSP_OK:
+ return g_strdup ("OK");
+#ifdef G_OS_WIN32
+ case GST_RTSP_ESYS:
+ case GST_RTSP_ENET:
+ {
+ gchar *res, *msg;
+ msg = g_win32_error_message (WSAGetLastError ());
+ if (result == GST_RTSP_ESYS)
+ res = g_strdup_printf ("System error: %s", msg);
+ else
+ res = g_strdup_printf ("Network error: %s", msg);
+ g_free (msg);
+ return res;
+ }
+#else
+ case GST_RTSP_ESYS:
+ return g_strdup_printf ("System error: %s", g_strerror (errno));
+ case GST_RTSP_ENET:
+ return g_strdup_printf ("Network error: %s", hstrerror (h_errno));
+#endif
+ case GST_RTSP_ERROR:
+ return g_strdup ("Generic error");
+ case GST_RTSP_EINVAL:
+ return g_strdup ("Invalid parameter specified");
+ case GST_RTSP_EINTR:
+ return g_strdup ("Operation interrupted");
+ case GST_RTSP_ENOMEM:
+ return g_strdup ("Out of memory");
+ case GST_RTSP_ERESOLV:
+ return g_strdup ("Cannot resolve host");
+ case GST_RTSP_ENOTIMPL:
+ return g_strdup ("Function not implemented");
+ case GST_RTSP_EPARSE:
+ return g_strdup ("Parse error");
+ case GST_RTSP_EWSASTART:
+ return g_strdup ("Error on WSAStartup");
+ case GST_RTSP_EWSAVERSION:
+ return g_strdup ("Windows sockets are not version 0x202");
+ case GST_RTSP_EEOF:
+ return g_strdup ("Received end-of-file");
+ case GST_RTSP_ENOTIP:
+ return g_strdup ("Host is not a valid IP address");
+ case GST_RTSP_ETIMEOUT:
+ return g_strdup ("Timeout while waiting for server response");
+ case GST_RTSP_ETGET:
+ return g_strdup ("Tunnel GET request received");
+ case GST_RTSP_ETPOST:
+ return g_strdup ("Tunnel POST request received");
+ case GST_RTSP_ELAST:
+ default:
+ return g_strdup_printf ("Unknown error (%d)", result);
+ }
+}
+
+/**
+ * gst_rtsp_method_as_text:
+ * @method: a #GstRTSPMethod
+ *
+ * Convert @method to a string.
+ *
+ * Returns: a string representation of @method.
+ */
+const gchar *
+gst_rtsp_method_as_text (GstRTSPMethod method)
+{
+ gint i;
+
+ if (method == GST_RTSP_INVALID)
+ return NULL;
+
+ i = 0;
+ while ((method & 1) == 0) {
+ i++;
+ method >>= 1;
+ }
+ return rtsp_methods[i];
+}
+
+/**
+ * gst_rtsp_version_as_text:
+ * @version: a #GstRTSPVersion
+ *
+ * Convert @version to a string.
+ *
+ * Returns: a string representation of @version.
+ */
+const gchar *
+gst_rtsp_version_as_text (GstRTSPVersion version)
+{
+ switch (version) {
+ case GST_RTSP_VERSION_1_0:
+ return "1.0";
+
+ case GST_RTSP_VERSION_1_1:
+ return "1.1";
+
+ default:
+ return "0.0";
+ }
+}
+
+/**
+ * gst_rtsp_header_as_text:
+ * @field: a #GstRTSPHeaderField
+ *
+ * Convert @field to a string.
+ *
+ * Returns: a string representation of @field.
+ */
+const gchar *
+gst_rtsp_header_as_text (GstRTSPHeaderField field)
+{
+ if (field == GST_RTSP_HDR_INVALID)
+ return NULL;
+ else
+ return rtsp_headers[field - 1].name;
+}
+
+/**
+ * gst_rtsp_status_as_text:
+ * @code: a #GstRTSPStatusCode
+ *
+ * Convert @code to a string.
+ *
+ * Returns: a string representation of @code.
+ */
+const gchar *
+gst_rtsp_status_as_text (GstRTSPStatusCode code)
+{
+ static GHashTable *statuses;
+
+ if (G_UNLIKELY (statuses == NULL))
+ statuses = rtsp_init_status ();
+
+ return g_hash_table_lookup (statuses, GUINT_TO_POINTER (code));
+}
+
+/**
+ * gst_rtsp_find_header_field:
+ * @header: a header string
+ *
+ * Convert @header to a #GstRTSPHeaderField.
+ *
+ * Returns: a #GstRTSPHeaderField for @header or #GST_RTSP_HDR_INVALID if the
+ * header field is unknown.
+ */
+GstRTSPHeaderField
+gst_rtsp_find_header_field (const gchar * header)
+{
+ gint idx;
+
+ for (idx = 0; rtsp_headers[idx].name; idx++) {
+ if (g_ascii_strcasecmp (rtsp_headers[idx].name, header) == 0) {
+ return idx + 1;
+ }
+ }
+ return GST_RTSP_HDR_INVALID;
+}
+
+/**
+ * gst_rtsp_find_method:
+ * @method: a method
+ *
+ * Convert @method to a #GstRTSPMethod.
+ *
+ * Returns: a #GstRTSPMethod for @method or #GST_RTSP_INVALID if the
+ * method is unknown.
+ */
+GstRTSPMethod
+gst_rtsp_find_method (const gchar * method)
+{
+ gint idx;
+
+ for (idx = 0; rtsp_methods[idx]; idx++) {
+ if (g_ascii_strcasecmp (rtsp_methods[idx], method) == 0) {
+ return (1 << idx);
+ }
+ }
+ return GST_RTSP_INVALID;
+}
+
+/**
+ * gst_rtsp_options_as_text:
+ * @options: one or more #GstRTSPMethod
+ *
+ * Convert @options to a string.
+ *
+ * Returns: a new string of @options. g_free() after usage.
+ *
+ * Since: 0.10.23
+ */
+gchar *
+gst_rtsp_options_as_text (GstRTSPMethod options)
+{
+ GString *str;
+
+ str = g_string_new ("");
+
+ if (options & GST_RTSP_OPTIONS)
+ g_string_append (str, "OPTIONS, ");
+ if (options & GST_RTSP_DESCRIBE)
+ g_string_append (str, "DESCRIBE, ");
+ if (options & GST_RTSP_ANNOUNCE)
+ g_string_append (str, "ANNOUNCE, ");
+ if (options & GST_RTSP_GET_PARAMETER)
+ g_string_append (str, "GET_PARAMETER, ");
+ if (options & GST_RTSP_PAUSE)
+ g_string_append (str, "PAUSE, ");
+ if (options & GST_RTSP_PLAY)
+ g_string_append (str, "PLAY, ");
+ if (options & GST_RTSP_RECORD)
+ g_string_append (str, "RECORD, ");
+ if (options & GST_RTSP_REDIRECT)
+ g_string_append (str, "REDIRECT, ");
+ if (options & GST_RTSP_SETUP)
+ g_string_append (str, "SETUP, ");
+ if (options & GST_RTSP_SET_PARAMETER)
+ g_string_append (str, "SET_PARAMETER, ");
+ if (options & GST_RTSP_TEARDOWN)
+ g_string_append (str, "TEARDOWN, ");
+
+ /* remove trailing ", " if there is one */
+ if (str->len > 2)
+ str = g_string_truncate (str, str->len - 2);
+
+ return g_string_free (str, FALSE);
+}
+
+/**
+ * gst_rtsp_header_allow_multiple:
+ * @field: a #GstRTSPHeaderField
+ *
+ * Check whether @field may appear multiple times in a message.
+ *
+ * Returns: %TRUE if multiple headers are allowed.
+ *
+ * Since: 0.10.25
+ */
+gboolean
+gst_rtsp_header_allow_multiple (GstRTSPHeaderField field)
+{
+ if (field == GST_RTSP_HDR_INVALID)
+ return FALSE;
+ else
+ return rtsp_headers[field - 1].multiple;
+}
diff --git a/gst-libs/gst/rtsp/gstrtspdefs.h b/gst-libs/gst/rtsp/gstrtspdefs.h
new file mode 100644
index 0000000..3727bf2
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspdefs.h
@@ -0,0 +1,412 @@
+/* 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_RTSP_DEFS_H__
+#define __GST_RTSP_DEFS_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_RTSP_CHECK:
+ * @stmt: a statement
+ * @label: a label
+ *
+ * Macro that checks the return value of @stmt and jumps to @label when it does
+ * not equal #GST_RTSP_OK.
+ */
+#define GST_RTSP_CHECK(stmt, label) \
+G_STMT_START { \
+ if (G_UNLIKELY ((res = (stmt)) != GST_RTSP_OK)) \
+ goto label; \
+} G_STMT_END
+
+/**
+ * GstRTSPResult:
+ * @GST_RTSP_OK: no error
+ * @GST_RTSP_ERROR: some unspecified error occured
+ * @GST_RTSP_EINVAL: invalid arguments were provided to a function
+ * @GST_RTSP_EINTR: an operation was canceled
+ * @GST_RTSP_ENOMEM: no memory was available for the operation
+ * @GST_RTSP_ERESOLV: a host resolve error occured
+ * @GST_RTSP_ENOTIMPL: function not implemented
+ * @GST_RTSP_ESYS: a system error occured, errno contains more details
+ * @GST_RTSP_EPARSE: a persing error occured
+ * @GST_RTSP_EWSASTART: windows networking could not start
+ * @GST_RTSP_EWSAVERSION: windows networking stack has wrong version
+ * @GST_RTSP_EEOF: end-of-file was reached
+ * @GST_RTSP_ENET: a network problem occured, h_errno contains more details
+ * @GST_RTSP_ENOTIP: the host is not an IP host
+ * @GST_RTSP_ETIMEOUT: a timeout occured
+ * @GST_RTSP_ETGET: the tunnel GET request has been performed
+ * @GST_RTSP_ETPOST: the tunnel POST request has been performed
+ * @GST_RTSP_ELAST: last error
+ *
+ * Result codes from the RTSP functions.
+ */
+typedef enum {
+ GST_RTSP_OK = 0,
+ /* errors */
+ GST_RTSP_ERROR = -1,
+ GST_RTSP_EINVAL = -2,
+ GST_RTSP_EINTR = -3,
+ GST_RTSP_ENOMEM = -4,
+ GST_RTSP_ERESOLV = -5,
+ GST_RTSP_ENOTIMPL = -6,
+ GST_RTSP_ESYS = -7,
+ GST_RTSP_EPARSE = -8,
+ GST_RTSP_EWSASTART = -9,
+ GST_RTSP_EWSAVERSION = -10,
+ GST_RTSP_EEOF = -11,
+ GST_RTSP_ENET = -12,
+ GST_RTSP_ENOTIP = -13,
+ GST_RTSP_ETIMEOUT = -14,
+ GST_RTSP_ETGET = -15,
+ GST_RTSP_ETPOST = -16,
+
+ GST_RTSP_ELAST = -17
+} GstRTSPResult;
+
+/**
+ * GstRTSPEvent:
+ * @GST_RTSP_EV_READ: connection is readable
+ * @GST_RTSP_EV_WRITE: connection is writable
+ *
+ * The possible events for the connection.
+ */
+typedef enum {
+ GST_RTSP_EV_READ = (1 << 0),
+ GST_RTSP_EV_WRITE = (1 << 1)
+} GstRTSPEvent;
+
+/**
+ * GstRTSPFamily:
+ * @GST_RTSP_FAM_NONE: unknown network family
+ * @GST_RTSP_FAM_INET: internet
+ * @GST_RTSP_FAM_INET6: internet V6
+ *
+ * The possible network families.
+ */
+typedef enum {
+ GST_RTSP_FAM_NONE,
+ GST_RTSP_FAM_INET,
+ GST_RTSP_FAM_INET6
+} GstRTSPFamily;
+
+/**
+ * GstRTSPState:
+ * @GST_RTSP_STATE_INVALID: invalid state
+ * @GST_RTSP_STATE_INIT: initializing
+ * @GST_RTSP_STATE_READY: ready for operation
+ * @GST_RTSP_STATE_SEEKING: seeking in progress
+ * @GST_RTSP_STATE_PLAYING: playing
+ * @GST_RTSP_STATE_RECORDING: recording
+ *
+ * The different RTSP states.
+ */
+typedef enum {
+ GST_RTSP_STATE_INVALID,
+ GST_RTSP_STATE_INIT,
+ GST_RTSP_STATE_READY,
+ GST_RTSP_STATE_SEEKING,
+ GST_RTSP_STATE_PLAYING,
+ GST_RTSP_STATE_RECORDING
+} GstRTSPState;
+
+/**
+ * GstRTSPVersion:
+ * @GST_RTSP_VERSION_INVALID: unknown/invalid version
+ * @GST_RTSP_VERSION_1_0: version 1.0
+ * @GST_RTSP_VERSION_1_1: version 1.1. Since 0.10.25
+ *
+ * The supported RTSP versions.
+ */
+typedef enum {
+ GST_RTSP_VERSION_INVALID = 0x00,
+ GST_RTSP_VERSION_1_0 = 0x10,
+ GST_RTSP_VERSION_1_1 = 0x11
+} GstRTSPVersion;
+
+/**
+ * GstRTSPMethod:
+ * @GST_RTSP_INVALID: invalid method
+ * @GST_RTSP_DESCRIBE: the DESCRIBE method
+ * @GST_RTSP_ANNOUNCE: the ANNOUNCE method
+ * @GST_RTSP_GET_PARAMETER: the GET_PARAMETER method
+ * @GST_RTSP_OPTIONS: the OPTIONS method
+ * @GST_RTSP_PAUSE: the PAUSE method
+ * @GST_RTSP_PLAY: the PLAY method
+ * @GST_RTSP_RECORD: the RECORD method
+ * @GST_RTSP_REDIRECT: the REDIRECT method
+ * @GST_RTSP_SETUP: the SETUP method
+ * @GST_RTSP_SET_PARAMETER: the SET_PARAMETER method
+ * @GST_RTSP_TEARDOWN: the TEARDOWN method
+ * @GST_RTSP_GET: the GET method (HTTP). Since 0.10.25
+ * @GST_RTSP_POST: the POST method (HTTP). Since 0.10.25
+ *
+ * The different supported RTSP methods.
+ */
+typedef enum {
+ GST_RTSP_INVALID = 0,
+ GST_RTSP_DESCRIBE = (1 << 0),
+ GST_RTSP_ANNOUNCE = (1 << 1),
+ GST_RTSP_GET_PARAMETER = (1 << 2),
+ GST_RTSP_OPTIONS = (1 << 3),
+ GST_RTSP_PAUSE = (1 << 4),
+ GST_RTSP_PLAY = (1 << 5),
+ GST_RTSP_RECORD = (1 << 6),
+ GST_RTSP_REDIRECT = (1 << 7),
+ GST_RTSP_SETUP = (1 << 8),
+ GST_RTSP_SET_PARAMETER = (1 << 9),
+ GST_RTSP_TEARDOWN = (1 << 10),
+ GST_RTSP_GET = (1 << 11),
+ GST_RTSP_POST = (1 << 12)
+} GstRTSPMethod;
+
+/**
+ * GstRTSPAuthMethod:
+ * @GST_RTSP_AUTH_NONE: no authentication
+ * @GST_RTSP_AUTH_BASIC: basic authentication
+ * @GST_RTSP_AUTH_DIGEST: digest authentication
+ *
+ * Authentication methods, ordered by strength
+ */
+typedef enum {
+ GST_RTSP_AUTH_NONE = 0x00,
+ GST_RTSP_AUTH_BASIC = 0x01,
+ GST_RTSP_AUTH_DIGEST = 0x02
+} GstRTSPAuthMethod;
+
+/**
+ * GST_RTSP_AUTH_MAX:
+ *
+ * Strongest available authentication method
+ */
+#define GST_RTSP_AUTH_MAX GST_RTSP_AUTH_DIGEST
+
+/**
+ * GstRTSPHeaderField:
+ *
+ * Enumeration of rtsp header fields.
+ */
+typedef enum {
+ /*< protected >*/
+ GST_RTSP_HDR_INVALID,
+
+ /*
+ * R = Request
+ * r = response
+ * g = general
+ * e = entity
+ */
+ GST_RTSP_HDR_ACCEPT, /* Accept R opt. entity */
+ GST_RTSP_HDR_ACCEPT_ENCODING, /* Accept-Encoding R opt. entity */
+ GST_RTSP_HDR_ACCEPT_LANGUAGE, /* Accept-Language R opt. all */
+ GST_RTSP_HDR_ALLOW, /* Allow r opt. all */
+ GST_RTSP_HDR_AUTHORIZATION, /* Authorization R opt. all */
+ GST_RTSP_HDR_BANDWIDTH, /* Bandwidth R opt. all */
+ GST_RTSP_HDR_BLOCKSIZE, /* Blocksize R opt. all but OPTIONS, TEARDOWN */
+ GST_RTSP_HDR_CACHE_CONTROL, /* Cache-Control g opt. SETUP */
+ GST_RTSP_HDR_CONFERENCE, /* Conference R opt. SETUP */
+ GST_RTSP_HDR_CONNECTION, /* Connection g req. all */
+ GST_RTSP_HDR_CONTENT_BASE, /* Content-Base e opt. entity */
+ GST_RTSP_HDR_CONTENT_ENCODING, /* Content-Encoding e req. SET_PARAMETER, DESCRIBE, ANNOUNCE */
+ GST_RTSP_HDR_CONTENT_LANGUAGE, /* Content-Language e req. DESCRIBE, ANNOUNCE */
+ GST_RTSP_HDR_CONTENT_LENGTH, /* Content-Length e req. SET_PARAMETER, ANNOUNCE, entity */
+ GST_RTSP_HDR_CONTENT_LOCATION, /* Content-Location e opt. entity */
+ GST_RTSP_HDR_CONTENT_TYPE, /* Content-Type e req. SET_PARAMETER, ANNOUNCE, entity */
+ GST_RTSP_HDR_CSEQ, /* CSeq g req. all */
+ GST_RTSP_HDR_DATE, /* Date g opt. all */
+ GST_RTSP_HDR_EXPIRES, /* Expires e opt. DESCRIBE, ANNOUNCE */
+ GST_RTSP_HDR_FROM, /* From R opt. all */
+ GST_RTSP_HDR_IF_MODIFIED_SINCE, /* If-Modified-Since R opt. DESCRIBE, SETUP */
+ GST_RTSP_HDR_LAST_MODIFIED, /* Last-Modified e opt. entity */
+ GST_RTSP_HDR_PROXY_AUTHENTICATE, /* Proxy-Authenticate */
+ GST_RTSP_HDR_PROXY_REQUIRE, /* Proxy-Require R req. all */
+ GST_RTSP_HDR_PUBLIC, /* Public r opt. all */
+ GST_RTSP_HDR_RANGE, /* Range Rr opt. PLAY, PAUSE, RECORD */
+ GST_RTSP_HDR_REFERER, /* Referer R opt. all */
+ GST_RTSP_HDR_REQUIRE, /* Require R req. all */
+ GST_RTSP_HDR_RETRY_AFTER, /* Retry-After r opt. all */
+ GST_RTSP_HDR_RTP_INFO, /* RTP-Info r req. PLAY */
+ GST_RTSP_HDR_SCALE, /* Scale Rr opt. PLAY, RECORD */
+ GST_RTSP_HDR_SESSION, /* Session Rr req. all but SETUP, OPTIONS */
+ GST_RTSP_HDR_SERVER, /* Server r opt. all */
+ GST_RTSP_HDR_SPEED, /* Speed Rr opt. PLAY */
+ GST_RTSP_HDR_TRANSPORT, /* Transport Rr req. SETUP */
+ GST_RTSP_HDR_UNSUPPORTED, /* Unsupported r req. all */
+ GST_RTSP_HDR_USER_AGENT, /* User-Agent R opt. all */
+ GST_RTSP_HDR_VIA, /* Via g opt. all */
+ GST_RTSP_HDR_WWW_AUTHENTICATE, /* WWW-Authenticate r opt. all */
+
+ /* Real extensions */
+ GST_RTSP_HDR_CLIENT_CHALLENGE, /* ClientChallenge */
+ GST_RTSP_HDR_REAL_CHALLENGE1, /* RealChallenge1 */
+ GST_RTSP_HDR_REAL_CHALLENGE2, /* RealChallenge2 */
+ GST_RTSP_HDR_REAL_CHALLENGE3, /* RealChallenge3 */
+ GST_RTSP_HDR_SUBSCRIBE, /* Subscribe */
+ GST_RTSP_HDR_ALERT, /* Alert */
+ GST_RTSP_HDR_CLIENT_ID, /* ClientID */
+ GST_RTSP_HDR_COMPANY_ID, /* CompanyID */
+ GST_RTSP_HDR_GUID, /* GUID */
+ GST_RTSP_HDR_REGION_DATA, /* RegionData */
+ GST_RTSP_HDR_MAX_ASM_WIDTH, /* SupportsMaximumASMBandwidth */
+ GST_RTSP_HDR_LANGUAGE, /* Language */
+ GST_RTSP_HDR_PLAYER_START_TIME, /* PlayerStarttime */
+
+ /* Since 0.10.16 */
+ GST_RTSP_HDR_LOCATION, /* Location */
+
+ /* Since 0.10.23 */
+ GST_RTSP_HDR_ETAG, /* ETag */
+ GST_RTSP_HDR_IF_MATCH, /* If-Match */
+
+ /* WM extensions [MS-RTSP] Since 0.10.23 */
+ GST_RTSP_HDR_ACCEPT_CHARSET, /* Accept-Charset */
+ GST_RTSP_HDR_SUPPORTED, /* Supported */
+ GST_RTSP_HDR_VARY, /* Vary */
+ GST_RTSP_HDR_X_ACCELERATE_STREAMING, /* X-Accelerate-Streaming */
+ GST_RTSP_HDR_X_ACCEPT_AUTHENT, /* X-Accept-Authentication */
+ GST_RTSP_HDR_X_ACCEPT_PROXY_AUTHENT, /* X-Accept-Proxy-Authentication */
+ GST_RTSP_HDR_X_BROADCAST_ID, /* X-Broadcast-Id */
+ GST_RTSP_HDR_X_BURST_STREAMING, /* X-Burst-Streaming */
+ GST_RTSP_HDR_X_NOTICE, /* X-Notice */
+ GST_RTSP_HDR_X_PLAYER_LAG_TIME, /* X-Player-Lag-Time */
+ GST_RTSP_HDR_X_PLAYLIST, /* X-Playlist */
+ GST_RTSP_HDR_X_PLAYLIST_CHANGE_NOTICE, /* X-Playlist-Change-Notice */
+ GST_RTSP_HDR_X_PLAYLIST_GEN_ID, /* X-Playlist-Gen-Id */
+ GST_RTSP_HDR_X_PLAYLIST_SEEK_ID, /* X-Playlist-Seek-Id */
+ GST_RTSP_HDR_X_PROXY_CLIENT_AGENT, /* X-Proxy-Client-Agent */
+ GST_RTSP_HDR_X_PROXY_CLIENT_VERB, /* X-Proxy-Client-Verb */
+ GST_RTSP_HDR_X_RECEDING_PLAYLISTCHANGE, /* X-Receding-PlaylistChange */
+ GST_RTSP_HDR_X_RTP_INFO, /* X-RTP-Info */
+ GST_RTSP_HDR_X_STARTUPPROFILE, /* X-StartupProfile */
+
+ /* Since 0.10.24 */
+ GST_RTSP_HDR_TIMESTAMP, /* Timestamp */
+
+ /* Since 0.10.25 */
+ GST_RTSP_HDR_AUTHENTICATION_INFO, /* Authentication-Info */
+ GST_RTSP_HDR_HOST, /* Host */
+ GST_RTSP_HDR_PRAGMA, /* Pragma */
+ GST_RTSP_HDR_X_SERVER_IP_ADDRESS, /* X-Server-IP-Address */
+ GST_RTSP_HDR_X_SESSIONCOOKIE, /* X-Sessioncookie */
+
+ /* Since 0.10.36 */
+ GST_RTSP_HDR_RTCP_INTERVAL, /* RTCP-Interval */
+
+ GST_RTSP_HDR_LAST
+} GstRTSPHeaderField;
+
+/**
+ * GstRTSPStatusCode:
+ *
+ * Enumeration of rtsp status codes.
+ */
+typedef enum {
+ /*< protected >*/
+ GST_RTSP_STS_INVALID = 0,
+ GST_RTSP_STS_CONTINUE = 100,
+ GST_RTSP_STS_OK = 200,
+ GST_RTSP_STS_CREATED = 201,
+ GST_RTSP_STS_LOW_ON_STORAGE = 250,
+ GST_RTSP_STS_MULTIPLE_CHOICES = 300,
+ GST_RTSP_STS_MOVED_PERMANENTLY = 301,
+ GST_RTSP_STS_MOVE_TEMPORARILY = 302,
+ GST_RTSP_STS_SEE_OTHER = 303,
+ GST_RTSP_STS_NOT_MODIFIED = 304,
+ GST_RTSP_STS_USE_PROXY = 305,
+ GST_RTSP_STS_BAD_REQUEST = 400,
+ GST_RTSP_STS_UNAUTHORIZED = 401,
+ GST_RTSP_STS_PAYMENT_REQUIRED = 402,
+ GST_RTSP_STS_FORBIDDEN = 403,
+ GST_RTSP_STS_NOT_FOUND = 404,
+ GST_RTSP_STS_METHOD_NOT_ALLOWED = 405,
+ GST_RTSP_STS_NOT_ACCEPTABLE = 406,
+ GST_RTSP_STS_PROXY_AUTH_REQUIRED = 407,
+ GST_RTSP_STS_REQUEST_TIMEOUT = 408,
+ GST_RTSP_STS_GONE = 410,
+ GST_RTSP_STS_LENGTH_REQUIRED = 411,
+ GST_RTSP_STS_PRECONDITION_FAILED = 412,
+ GST_RTSP_STS_REQUEST_ENTITY_TOO_LARGE = 413,
+ GST_RTSP_STS_REQUEST_URI_TOO_LARGE = 414,
+ GST_RTSP_STS_UNSUPPORTED_MEDIA_TYPE = 415,
+ GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD = 451,
+ GST_RTSP_STS_CONFERENCE_NOT_FOUND = 452,
+ GST_RTSP_STS_NOT_ENOUGH_BANDWIDTH = 453,
+ GST_RTSP_STS_SESSION_NOT_FOUND = 454,
+ GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE = 455,
+ GST_RTSP_STS_HEADER_FIELD_NOT_VALID_FOR_RESOURCE = 456,
+ GST_RTSP_STS_INVALID_RANGE = 457,
+ GST_RTSP_STS_PARAMETER_IS_READONLY = 458,
+ GST_RTSP_STS_AGGREGATE_OPERATION_NOT_ALLOWED = 459,
+ GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED = 460,
+ GST_RTSP_STS_UNSUPPORTED_TRANSPORT = 461,
+ GST_RTSP_STS_DESTINATION_UNREACHABLE = 462,
+ GST_RTSP_STS_INTERNAL_SERVER_ERROR = 500,
+ GST_RTSP_STS_NOT_IMPLEMENTED = 501,
+ GST_RTSP_STS_BAD_GATEWAY = 502,
+ GST_RTSP_STS_SERVICE_UNAVAILABLE = 503,
+ GST_RTSP_STS_GATEWAY_TIMEOUT = 504,
+ GST_RTSP_STS_RTSP_VERSION_NOT_SUPPORTED = 505,
+ GST_RTSP_STS_OPTION_NOT_SUPPORTED = 551
+} GstRTSPStatusCode;
+
+gchar* gst_rtsp_strresult (GstRTSPResult result);
+
+const gchar* gst_rtsp_method_as_text (GstRTSPMethod method);
+const gchar* gst_rtsp_version_as_text (GstRTSPVersion version);
+const gchar* gst_rtsp_header_as_text (GstRTSPHeaderField field);
+const gchar* gst_rtsp_status_as_text (GstRTSPStatusCode code);
+
+gchar* gst_rtsp_options_as_text (GstRTSPMethod options);
+
+GstRTSPHeaderField gst_rtsp_find_header_field (const gchar *header);
+GstRTSPMethod gst_rtsp_find_method (const gchar *method);
+
+gboolean gst_rtsp_header_allow_multiple (GstRTSPHeaderField field);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_DEFS_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtspextension.c b/gst-libs/gst/rtsp/gstrtspextension.c
new file mode 100644
index 0000000..32d5d8e
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspextension.c
@@ -0,0 +1,224 @@
+/* GStreamer RTSP extension
+ * Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstrtspextension.c: RTSP extension mechanism
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstrtspextension
+ * @short_description: Interface for extending RTSP protocols
+ *
+ * <refsect2>
+ * <para>
+ * This interface is implemented e.g. by the Windows Media Streaming RTSP
+ * exentension (rtspwms) and the RealMedia RTSP extension (rtspreal).
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2007-07-25 (0.10.14)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstrtsp-marshal.h"
+#include "gstrtsp-enumtypes.h"
+#include "gstrtspextension.h"
+
+static void gst_rtsp_extension_iface_init (GstRTSPExtension * iface);
+
+enum
+{
+ SIGNAL_SEND,
+ LAST_SIGNAL
+};
+
+static guint gst_rtsp_extension_signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_rtsp_extension_get_type (void)
+{
+ static volatile gsize gst_rtsp_extension_type = 0;
+ static const GTypeInfo gst_rtsp_extension_info = {
+ sizeof (GstRTSPExtensionInterface),
+ (GBaseInitFunc) gst_rtsp_extension_iface_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ };
+
+ if (g_once_init_enter (&gst_rtsp_extension_type)) {
+ GType tmp = g_type_register_static (G_TYPE_INTERFACE,
+ "GstRTSPExtension", &gst_rtsp_extension_info, 0);
+ g_once_init_leave (&gst_rtsp_extension_type, tmp);
+ }
+ return (GType) gst_rtsp_extension_type;
+}
+
+static void
+gst_rtsp_extension_iface_init (GstRTSPExtension * iface)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ gst_rtsp_extension_signals[SIGNAL_SEND] =
+ g_signal_new ("send", G_TYPE_FROM_CLASS (iface),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPExtensionInterface,
+ send), NULL, NULL, __gst_rtsp_marshal_ENUM__POINTER_POINTER,
+ GST_TYPE_RTSP_RESULT, 2, G_TYPE_POINTER, G_TYPE_POINTER);
+ initialized = TRUE;
+ }
+}
+
+gboolean
+gst_rtsp_extension_detect_server (GstRTSPExtension * ext, GstRTSPMessage * resp)
+{
+ GstRTSPExtensionInterface *iface;
+ gboolean res = TRUE;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->detect_server)
+ res = iface->detect_server (ext, resp);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_before_send (GstRTSPExtension * ext, GstRTSPMessage * req)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->before_send)
+ res = iface->before_send (ext, req);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_after_send (GstRTSPExtension * ext, GstRTSPMessage * req,
+ GstRTSPMessage * resp)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->after_send)
+ res = iface->after_send (ext, req, resp);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp,
+ GstStructure * s)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->parse_sdp)
+ res = iface->parse_sdp (ext, sdp, s);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_setup_media (GstRTSPExtension * ext, GstSDPMedia * media)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->setup_media)
+ res = iface->setup_media (ext, media);
+
+ return res;
+}
+
+gboolean
+gst_rtsp_extension_configure_stream (GstRTSPExtension * ext, GstCaps * caps)
+{
+ GstRTSPExtensionInterface *iface;
+ gboolean res = TRUE;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->configure_stream)
+ res = iface->configure_stream (ext, caps);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_get_transports (GstRTSPExtension * ext,
+ GstRTSPLowerTrans protocols, gchar ** transport)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->get_transports)
+ res = iface->get_transports (ext, protocols, transport);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_OK;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->stream_select)
+ res = iface->stream_select (ext, url);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_receive_request (GstRTSPExtension * ext,
+ GstRTSPMessage * msg)
+{
+ GstRTSPExtensionInterface *iface;
+ GstRTSPResult res = GST_RTSP_ENOTIMPL;
+
+ iface = GST_RTSP_EXTENSION_GET_IFACE (ext);
+ if (iface->receive_request)
+ res = iface->receive_request (ext, msg);
+
+ return res;
+}
+
+GstRTSPResult
+gst_rtsp_extension_send (GstRTSPExtension * ext, GstRTSPMessage * req,
+ GstRTSPMessage * resp)
+{
+ GstRTSPResult res = GST_RTSP_OK;
+
+ g_signal_emit (ext, gst_rtsp_extension_signals[SIGNAL_SEND], 0,
+ req, resp, &res);
+
+ return res;
+}
diff --git a/gst-libs/gst/rtsp/gstrtspextension.h b/gst-libs/gst/rtsp/gstrtspextension.h
new file mode 100644
index 0000000..e2995f3
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspextension.h
@@ -0,0 +1,97 @@
+/* GStreamer RTSP Extension
+ * Copyright (C) 2007 Wim Taymans <wim@fluendo.com>
+ *
+ * gstrtspextension.h: RTSP Extension interface.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_RTSP_EXTENSION_H__
+#define __GST_RTSP_EXTENSION_H__
+
+#include <gst/gst.h>
+
+#include <gst/sdp/gstsdpmessage.h>
+#include <gst/rtsp/gstrtsptransport.h>
+#include <gst/rtsp/gstrtspmessage.h>
+#include <gst/rtsp/gstrtspurl.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RTSP_EXTENSION \
+ (gst_rtsp_extension_get_type ())
+#define GST_RTSP_EXTENSION(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_RTSP_EXTENSION, GstRTSPExtension))
+#define GST_IS_RTSP_EXTENSION(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_RTSP_EXTENSION))
+#define GST_RTSP_EXTENSION_GET_IFACE(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_RTSP_EXTENSION, GstRTSPExtensionInterface))
+
+typedef struct _GstRTSPExtension GstRTSPExtension;
+typedef struct _GstRTSPExtensionInterface GstRTSPExtensionInterface;
+
+struct _GstRTSPExtensionInterface {
+ GTypeInterface parent;
+
+ /* vfunctions */
+ gboolean (*detect_server) (GstRTSPExtension *ext, GstRTSPMessage *resp);
+
+ GstRTSPResult (*before_send) (GstRTSPExtension *ext, GstRTSPMessage *req);
+ GstRTSPResult (*after_send) (GstRTSPExtension *ext, GstRTSPMessage *req, GstRTSPMessage *resp);
+
+ GstRTSPResult (*parse_sdp) (GstRTSPExtension *ext, GstSDPMessage *sdp, GstStructure *s);
+ GstRTSPResult (*setup_media) (GstRTSPExtension *ext, GstSDPMedia *media);
+
+ gboolean (*configure_stream) (GstRTSPExtension *ext, GstCaps *caps);
+
+ GstRTSPResult (*get_transports) (GstRTSPExtension *ext, GstRTSPLowerTrans protocols, gchar **transport);
+
+ GstRTSPResult (*stream_select) (GstRTSPExtension *ext, GstRTSPUrl *url);
+
+ /* signals */
+ GstRTSPResult (*send) (GstRTSPExtension *ext, GstRTSPMessage *req, GstRTSPMessage *resp);
+
+ /* ABI: more vfunctions added later */
+ GstRTSPResult (*receive_request) (GstRTSPExtension *ext, GstRTSPMessage *req);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+GType gst_rtsp_extension_get_type (void);
+
+/* invoke vfunction on interface */
+gboolean gst_rtsp_extension_detect_server (GstRTSPExtension *ext, GstRTSPMessage *resp);
+
+GstRTSPResult gst_rtsp_extension_before_send (GstRTSPExtension *ext, GstRTSPMessage *req);
+GstRTSPResult gst_rtsp_extension_after_send (GstRTSPExtension *ext, GstRTSPMessage *req,
+ GstRTSPMessage *resp);
+GstRTSPResult gst_rtsp_extension_parse_sdp (GstRTSPExtension *ext, GstSDPMessage *sdp,
+ GstStructure *s);
+GstRTSPResult gst_rtsp_extension_setup_media (GstRTSPExtension *ext, GstSDPMedia *media);
+gboolean gst_rtsp_extension_configure_stream (GstRTSPExtension *ext, GstCaps *caps);
+GstRTSPResult gst_rtsp_extension_get_transports (GstRTSPExtension *ext, GstRTSPLowerTrans protocols,
+ gchar **transport);
+GstRTSPResult gst_rtsp_extension_stream_select (GstRTSPExtension *ext, GstRTSPUrl *url);
+GstRTSPResult gst_rtsp_extension_receive_request (GstRTSPExtension *ext, GstRTSPMessage *req);
+
+/* signal emision */
+GstRTSPResult gst_rtsp_extension_send (GstRTSPExtension *ext, GstRTSPMessage *req,
+ GstRTSPMessage *resp);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_EXTENSION_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtspmessage.c b/gst-libs/gst/rtsp/gstrtspmessage.c
new file mode 100644
index 0000000..2b33c61
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspmessage.c
@@ -0,0 +1,842 @@
+/* GStreamer
+ * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.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:gstrtspmessage
+ * @short_description: RTSP messages
+ * @see_also: gstrtspconnection
+ *
+ * Provides methods for creating and parsing request, response and data messages.
+ *
+ * Last reviewed on 2007-07-25 (0.10.14)
+ */
+
+#include <string.h>
+
+#include <gst/gstutils.h>
+#include "gstrtspmessage.h"
+
+typedef struct _RTSPKeyValue
+{
+ GstRTSPHeaderField field;
+ gchar *value;
+} RTSPKeyValue;
+
+static void
+key_value_foreach (GArray * array, GFunc func, gpointer user_data)
+{
+ guint i;
+
+ g_return_if_fail (array != NULL);
+
+ for (i = 0; i < array->len; i++) {
+ (*func) (&g_array_index (array, RTSPKeyValue, i), user_data);
+ }
+}
+
+/**
+ * gst_rtsp_message_new:
+ * @msg: a location for the new #GstRTSPMessage
+ *
+ * Create a new initialized #GstRTSPMessage. Free with gst_rtsp_message_free().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_new (GstRTSPMessage ** msg)
+{
+ GstRTSPMessage *newmsg;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ newmsg = g_new0 (GstRTSPMessage, 1);
+
+ *msg = newmsg;
+
+ return gst_rtsp_message_init (newmsg);
+}
+
+/**
+ * gst_rtsp_message_init:
+ * @msg: a #GstRTSPMessage
+ *
+ * Initialize @msg. This function is mostly used when @msg is allocated on the
+ * stack. The reverse operation of this is gst_rtsp_message_unset().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_init (GstRTSPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_message_unset (msg);
+
+ msg->type = GST_RTSP_MESSAGE_INVALID;
+ msg->hdr_fields = g_array_new (FALSE, FALSE, sizeof (RTSPKeyValue));
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_get_type:
+ * @msg: a #GstRTSPMessage
+ *
+ * Get the message type of @msg.
+ *
+ * Returns: the message type.
+ */
+GstRTSPMsgType
+gst_rtsp_message_get_type (GstRTSPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_MESSAGE_INVALID);
+
+ return msg->type;
+}
+
+/**
+ * gst_rtsp_message_new_request:
+ * @msg: a location for the new #GstRTSPMessage
+ * @method: the request method to use
+ * @uri: the uri of the request
+ *
+ * Create a new #GstRTSPMessage with @method and @uri and store the result
+ * request message in @msg. Free with gst_rtsp_message_free().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_new_request (GstRTSPMessage ** msg, GstRTSPMethod method,
+ const gchar * uri)
+{
+ GstRTSPMessage *newmsg;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (uri != NULL, GST_RTSP_EINVAL);
+
+ newmsg = g_new0 (GstRTSPMessage, 1);
+
+ *msg = newmsg;
+
+ return gst_rtsp_message_init_request (newmsg, method, uri);
+}
+
+/**
+ * gst_rtsp_message_init_request:
+ * @msg: a #GstRTSPMessage
+ * @method: the request method to use
+ * @uri: the uri of the request
+ *
+ * Initialize @msg as a request message with @method and @uri. To clear @msg
+ * again, use gst_rtsp_message_unset().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_init_request (GstRTSPMessage * msg, GstRTSPMethod method,
+ const gchar * uri)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (uri != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_message_unset (msg);
+
+ msg->type = GST_RTSP_MESSAGE_REQUEST;
+ msg->type_data.request.method = method;
+ msg->type_data.request.uri = g_strdup (uri);
+ msg->type_data.request.version = GST_RTSP_VERSION_1_0;
+ msg->hdr_fields = g_array_new (FALSE, FALSE, sizeof (RTSPKeyValue));
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_parse_request:
+ * @msg: a #GstRTSPMessage
+ * @method: location to hold the method
+ * @uri: location to hold the uri
+ * @version: location to hold the version
+ *
+ * Parse the request message @msg and store the values @method, @uri and
+ * @version. The result locations can be #NULL if one is not interested in its
+ * value.
+ *
+ * @uri remains valid for as long as @msg is valid and unchanged.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_parse_request (GstRTSPMessage * msg,
+ GstRTSPMethod * method, const gchar ** uri, GstRTSPVersion * version)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_REQUEST ||
+ msg->type == GST_RTSP_MESSAGE_HTTP_REQUEST, GST_RTSP_EINVAL);
+
+ if (method)
+ *method = msg->type_data.request.method;
+ if (uri)
+ *uri = msg->type_data.request.uri;
+ if (version)
+ *version = msg->type_data.request.version;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_new_response:
+ * @msg: a location for the new #GstRTSPMessage
+ * @code: the status code
+ * @reason: the status reason or #NULL
+ * @request: the request that triggered the response or #NULL
+ *
+ * Create a new response #GstRTSPMessage with @code and @reason and store the
+ * result message in @msg. Free with gst_rtsp_message_free().
+ *
+ * When @reason is #NULL, the default reason for @code will be used.
+ *
+ * When @request is not #NULL, the relevant headers will be copied to the new
+ * response message.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_new_response (GstRTSPMessage ** msg, GstRTSPStatusCode code,
+ const gchar * reason, const GstRTSPMessage * request)
+{
+ GstRTSPMessage *newmsg;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ newmsg = g_new0 (GstRTSPMessage, 1);
+
+ *msg = newmsg;
+
+ return gst_rtsp_message_init_response (newmsg, code, reason, request);
+}
+
+/**
+ * gst_rtsp_message_init_response:
+ * @msg: a #GstRTSPMessage
+ * @code: the status code
+ * @reason: the status reason or #NULL
+ * @request: the request that triggered the response or #NULL
+ *
+ * Initialize @msg with @code and @reason.
+ *
+ * When @reason is #NULL, the default reason for @code will be used.
+ *
+ * When @request is not #NULL, the relevant headers will be copied to the new
+ * response message.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_init_response (GstRTSPMessage * msg, GstRTSPStatusCode code,
+ const gchar * reason, const GstRTSPMessage * request)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_message_unset (msg);
+
+ if (reason == NULL)
+ reason = gst_rtsp_status_as_text (code);
+
+ msg->type = GST_RTSP_MESSAGE_RESPONSE;
+ msg->type_data.response.code = code;
+ msg->type_data.response.reason = g_strdup (reason);
+ msg->type_data.response.version = GST_RTSP_VERSION_1_0;
+ msg->hdr_fields = g_array_new (FALSE, FALSE, sizeof (RTSPKeyValue));
+
+ if (request) {
+ if (request->type == GST_RTSP_MESSAGE_HTTP_REQUEST) {
+ msg->type = GST_RTSP_MESSAGE_HTTP_RESPONSE;
+ if (request->type_data.request.version != GST_RTSP_VERSION_INVALID)
+ msg->type_data.response.version = request->type_data.request.version;
+ else
+ msg->type_data.response.version = GST_RTSP_VERSION_1_1;
+ } else {
+ gchar *header;
+
+ /* copy CSEQ */
+ if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_CSEQ, &header,
+ 0) == GST_RTSP_OK) {
+ gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CSEQ, header);
+ }
+
+ /* copy session id */
+ if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_SESSION, &header,
+ 0) == GST_RTSP_OK) {
+ char *pos;
+
+ header = g_strdup (header);
+ if ((pos = strchr (header, ';'))) {
+ *pos = '\0';
+ }
+ g_strchomp (header);
+ gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header);
+ }
+
+ /* FIXME copy more headers? */
+ }
+ }
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_parse_response:
+ * @msg: a #GstRTSPMessage
+ * @code: location to hold the status code
+ * @reason: location to hold the status reason
+ * @version: location to hold the version
+ *
+ * Parse the response message @msg and store the values @code, @reason and
+ * @version. The result locations can be #NULL if one is not interested in its
+ * value.
+ *
+ * @reason remains valid for as long as @msg is valid and unchanged.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_parse_response (GstRTSPMessage * msg,
+ GstRTSPStatusCode * code, const gchar ** reason, GstRTSPVersion * version)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_RESPONSE ||
+ msg->type == GST_RTSP_MESSAGE_HTTP_RESPONSE, GST_RTSP_EINVAL);
+
+ if (code)
+ *code = msg->type_data.response.code;
+ if (reason)
+ *reason = msg->type_data.response.reason;
+ if (version)
+ *version = msg->type_data.response.version;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_new_data:
+ * @msg: a location for the new #GstRTSPMessage
+ * @channel: the channel
+ *
+ * Create a new data #GstRTSPMessage with @channel and store the
+ * result message in @msg. Free with gst_rtsp_message_free().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_new_data (GstRTSPMessage ** msg, guint8 channel)
+{
+ GstRTSPMessage *newmsg;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ newmsg = g_new0 (GstRTSPMessage, 1);
+
+ *msg = newmsg;
+
+ return gst_rtsp_message_init_data (newmsg, channel);
+}
+
+/**
+ * gst_rtsp_message_init_data:
+ * @msg: a #GstRTSPMessage
+ * @channel: a channel
+ *
+ * Initialize a new data #GstRTSPMessage for @channel.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_init_data (GstRTSPMessage * msg, guint8 channel)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_message_unset (msg);
+
+ msg->type = GST_RTSP_MESSAGE_DATA;
+ msg->type_data.data.channel = channel;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_parse_data:
+ * @msg: a #GstRTSPMessage
+ * @channel: location to hold the channel
+ *
+ * Parse the data message @msg and store the channel in @channel.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_parse_data (GstRTSPMessage * msg, guint8 * channel)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_DATA, GST_RTSP_EINVAL);
+
+ if (channel)
+ *channel = msg->type_data.data.channel;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_unset:
+ * @msg: a #GstRTSPMessage
+ *
+ * Unset the contents of @msg so that it becomes an uninitialized
+ * #GstRTSPMessage again. This function is mostly used in combination with
+ * gst_rtsp_message_init_request(), gst_rtsp_message_init_response() and
+ * gst_rtsp_message_init_data() on stack allocated #GstRTSPMessage structures.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_unset (GstRTSPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ switch (msg->type) {
+ case GST_RTSP_MESSAGE_INVALID:
+ break;
+ case GST_RTSP_MESSAGE_REQUEST:
+ case GST_RTSP_MESSAGE_HTTP_REQUEST:
+ g_free (msg->type_data.request.uri);
+ break;
+ case GST_RTSP_MESSAGE_RESPONSE:
+ case GST_RTSP_MESSAGE_HTTP_RESPONSE:
+ g_free (msg->type_data.response.reason);
+ break;
+ case GST_RTSP_MESSAGE_DATA:
+ break;
+ default:
+ g_return_val_if_reached (GST_RTSP_EINVAL);
+ }
+
+ if (msg->hdr_fields != NULL) {
+ guint i;
+
+ for (i = 0; i < msg->hdr_fields->len; i++) {
+ RTSPKeyValue *keyval = &g_array_index (msg->hdr_fields, RTSPKeyValue, i);
+
+ g_free (keyval->value);
+ }
+ g_array_free (msg->hdr_fields, TRUE);
+ }
+ g_free (msg->body);
+
+ memset (msg, 0, sizeof (GstRTSPMessage));
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_free:
+ * @msg: a #GstRTSPMessage
+ *
+ * Free the memory used by @msg.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_free (GstRTSPMessage * msg)
+{
+ GstRTSPResult res;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ res = gst_rtsp_message_unset (msg);
+ if (res == GST_RTSP_OK)
+ g_free (msg);
+
+ return res;
+}
+
+/**
+ * gst_rtsp_message_take_header:
+ * @msg: a #GstRTSPMessage
+ * @field: a #GstRTSPHeaderField
+ * @value: the value of the header
+ *
+ * Add a header with key @field and @value to @msg. This function takes
+ * ownership of @value.
+ *
+ * Returns: a #GstRTSPResult.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_message_take_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
+ gchar * value)
+{
+ RTSPKeyValue key_value;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (value != NULL, GST_RTSP_EINVAL);
+
+ key_value.field = field;
+ key_value.value = value;
+
+ g_array_append_val (msg->hdr_fields, key_value);
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_add_header:
+ * @msg: a #GstRTSPMessage
+ * @field: a #GstRTSPHeaderField
+ * @value: the value of the header
+ *
+ * Add a header with key @field and @value to @msg. This function takes a copy
+ * of @value.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
+ const gchar * value)
+{
+ return gst_rtsp_message_take_header (msg, field, g_strdup (value));
+}
+
+/**
+ * gst_rtsp_message_remove_header:
+ * @msg: a #GstRTSPMessage
+ * @field: a #GstRTSPHeaderField
+ * @indx: the index of the header
+ *
+ * Remove the @indx header with key @field from @msg. If @indx equals -1, all
+ * headers will be removed.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_message_remove_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
+ gint indx)
+{
+ GstRTSPResult res = GST_RTSP_ENOTIMPL;
+ guint i = 0;
+ gint cnt = 0;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ while (i < msg->hdr_fields->len) {
+ RTSPKeyValue *key_value = &g_array_index (msg->hdr_fields, RTSPKeyValue, i);
+
+ if (key_value->field == field && (indx == -1 || cnt++ == indx)) {
+ g_free (key_value->value);
+ g_array_remove_index (msg->hdr_fields, i);
+ res = GST_RTSP_OK;
+ if (indx != -1)
+ break;
+ } else {
+ i++;
+ }
+ }
+ return res;
+}
+
+/**
+ * gst_rtsp_message_get_header:
+ * @msg: a #GstRTSPMessage
+ * @field: a #GstRTSPHeaderField
+ * @value: pointer to hold the result
+ * @indx: the index of the header
+ *
+ * Get the @indx header value with key @field from @msg. The result in @value
+ * stays valid as long as it remains present in @msg.
+ *
+ * Returns: #GST_RTSP_OK when @field was found, #GST_RTSP_ENOTIMPL if the key
+ * was not found.
+ */
+GstRTSPResult
+gst_rtsp_message_get_header (const GstRTSPMessage * msg,
+ GstRTSPHeaderField field, gchar ** value, gint indx)
+{
+ guint i;
+ gint cnt = 0;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ /* no header initialized, there are no headers */
+ if (msg->hdr_fields == NULL)
+ return GST_RTSP_ENOTIMPL;
+
+ for (i = 0; i < msg->hdr_fields->len; i++) {
+ RTSPKeyValue *key_value = &g_array_index (msg->hdr_fields, RTSPKeyValue, i);
+
+ if (key_value->field == field && cnt++ == indx) {
+ if (value)
+ *value = key_value->value;
+ return GST_RTSP_OK;
+ }
+ }
+
+ return GST_RTSP_ENOTIMPL;
+}
+
+/**
+ * gst_rtsp_message_append_headers:
+ * @msg: a #GstRTSPMessage
+ * @str: a string
+ *
+ * Append the currently configured headers in @msg to the #GString @str suitable
+ * for transmission.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_append_headers (const GstRTSPMessage * msg, GString * str)
+{
+ guint i;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (str != NULL, GST_RTSP_EINVAL);
+
+ for (i = 0; i < msg->hdr_fields->len; i++) {
+ RTSPKeyValue *key_value;
+ const gchar *keystr;
+
+ key_value = &g_array_index (msg->hdr_fields, RTSPKeyValue, i);
+ keystr = gst_rtsp_header_as_text (key_value->field);
+
+ g_string_append_printf (str, "%s: %s\r\n", keystr, key_value->value);
+ }
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_set_body:
+ * @msg: a #GstRTSPMessage
+ * @data: the data
+ * @size: the size of @data
+ *
+ * Set the body of @msg to a copy of @data.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_set_body (GstRTSPMessage * msg, const guint8 * data,
+ guint size)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ return gst_rtsp_message_take_body (msg, g_memdup (data, size), size);
+}
+
+/**
+ * gst_rtsp_message_take_body:
+ * @msg: a #GstRTSPMessage
+ * @data: the data
+ * @size: the size of @data
+ *
+ * Set the body of @msg to @data and @size. This method takes ownership of
+ * @data.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_take_body (GstRTSPMessage * msg, guint8 * data, guint size)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL || size == 0, GST_RTSP_EINVAL);
+
+ if (msg->body)
+ g_free (msg->body);
+
+ msg->body = data;
+ msg->body_size = size;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_get_body:
+ * @msg: a #GstRTSPMessage
+ * @data: location for the data
+ * @size: location for the size of @data
+ *
+ * Get the body of @msg. @data remains valid for as long as @msg is valid and
+ * unchanged.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_get_body (const GstRTSPMessage * msg, guint8 ** data,
+ guint * size)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (size != NULL, GST_RTSP_EINVAL);
+
+ *data = msg->body;
+ *size = msg->body_size;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_message_steal_body:
+ * @msg: a #GstRTSPMessage
+ * @data: location for the data
+ * @size: location for the size of @data
+ *
+ * Take the body of @msg and store it in @data and @size. After this method,
+ * the body and size of @msg will be set to #NULL and 0 respectively.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_steal_body (GstRTSPMessage * msg, guint8 ** data, guint * size)
+{
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (size != NULL, GST_RTSP_EINVAL);
+
+ *data = msg->body;
+ *size = msg->body_size;
+
+ msg->body = NULL;
+ msg->body_size = 0;
+
+ return GST_RTSP_OK;
+}
+
+static void
+dump_key_value (gpointer data, gpointer user_data G_GNUC_UNUSED)
+{
+ RTSPKeyValue *key_value = (RTSPKeyValue *) data;
+
+ g_print (" key: '%s', value: '%s'\n",
+ gst_rtsp_header_as_text (key_value->field), key_value->value);
+}
+
+/**
+ * gst_rtsp_message_dump:
+ * @msg: a #GstRTSPMessage
+ *
+ * Dump the contents of @msg to stdout.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_message_dump (GstRTSPMessage * msg)
+{
+ guint8 *data;
+ guint size;
+
+ g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
+
+ switch (msg->type) {
+ case GST_RTSP_MESSAGE_REQUEST:
+ g_print ("RTSP request message %p\n", msg);
+ g_print (" request line:\n");
+ g_print (" method: '%s'\n",
+ gst_rtsp_method_as_text (msg->type_data.request.method));
+ g_print (" uri: '%s'\n", msg->type_data.request.uri);
+ g_print (" version: '%s'\n",
+ gst_rtsp_version_as_text (msg->type_data.request.version));
+ g_print (" headers:\n");
+ key_value_foreach (msg->hdr_fields, dump_key_value, NULL);
+ g_print (" body:\n");
+ gst_rtsp_message_get_body (msg, &data, &size);
+ gst_util_dump_mem (data, size);
+ break;
+ case GST_RTSP_MESSAGE_RESPONSE:
+ g_print ("RTSP response message %p\n", msg);
+ g_print (" status line:\n");
+ g_print (" code: '%d'\n", msg->type_data.response.code);
+ g_print (" reason: '%s'\n", msg->type_data.response.reason);
+ g_print (" version: '%s'\n",
+ gst_rtsp_version_as_text (msg->type_data.response.version));
+ g_print (" headers:\n");
+ key_value_foreach (msg->hdr_fields, dump_key_value, NULL);
+ gst_rtsp_message_get_body (msg, &data, &size);
+ g_print (" body: length %d\n", size);
+ gst_util_dump_mem (data, size);
+ break;
+ case GST_RTSP_MESSAGE_HTTP_REQUEST:
+ g_print ("HTTP request message %p\n", msg);
+ g_print (" request line:\n");
+ g_print (" method: '%s'\n",
+ gst_rtsp_method_as_text (msg->type_data.request.method));
+ g_print (" uri: '%s'\n", msg->type_data.request.uri);
+ g_print (" version: '%s'\n",
+ gst_rtsp_version_as_text (msg->type_data.request.version));
+ g_print (" headers:\n");
+ key_value_foreach (msg->hdr_fields, dump_key_value, NULL);
+ g_print (" body:\n");
+ gst_rtsp_message_get_body (msg, &data, &size);
+ gst_util_dump_mem (data, size);
+ break;
+ case GST_RTSP_MESSAGE_HTTP_RESPONSE:
+ g_print ("HTTP response message %p\n", msg);
+ g_print (" status line:\n");
+ g_print (" code: '%d'\n", msg->type_data.response.code);
+ g_print (" reason: '%s'\n", msg->type_data.response.reason);
+ g_print (" version: '%s'\n",
+ gst_rtsp_version_as_text (msg->type_data.response.version));
+ g_print (" headers:\n");
+ key_value_foreach (msg->hdr_fields, dump_key_value, NULL);
+ gst_rtsp_message_get_body (msg, &data, &size);
+ g_print (" body: length %d\n", size);
+ gst_util_dump_mem (data, size);
+ break;
+ case GST_RTSP_MESSAGE_DATA:
+ g_print ("RTSP data message %p\n", msg);
+ g_print (" channel: '%d'\n", msg->type_data.data.channel);
+ g_print (" size: '%d'\n", msg->body_size);
+ gst_rtsp_message_get_body (msg, &data, &size);
+ gst_util_dump_mem (data, size);
+ break;
+ default:
+ g_print ("unsupported message type %d\n", msg->type);
+ return GST_RTSP_EINVAL;
+ }
+ return GST_RTSP_OK;
+}
diff --git a/gst-libs/gst/rtsp/gstrtspmessage.h b/gst-libs/gst/rtsp/gstrtspmessage.h
new file mode 100644
index 0000000..dda1604
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspmessage.h
@@ -0,0 +1,187 @@
+/* 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_RTSP_MESSAGE_H__
+#define __GST_RTSP_MESSAGE_H__
+
+#include <glib.h>
+
+#include <gst/rtsp/gstrtspdefs.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstRTSPMsgType:
+ * @GST_RTSP_MESSAGE_INVALID: invalid message type
+ * @GST_RTSP_MESSAGE_REQUEST: RTSP request message
+ * @GST_RTSP_MESSAGE_RESPONSE: RTSP response message
+ * @GST_RTSP_MESSAGE_HTTP_REQUEST: HTTP request message. Since 0.10.25
+ * @GST_RTSP_MESSAGE_HTTP_RESPONSE: HTTP response message. Since 0.10.25
+ * @GST_RTSP_MESSAGE_DATA: data message
+ *
+ * The type of a message.
+ */
+typedef enum
+{
+ GST_RTSP_MESSAGE_INVALID,
+ GST_RTSP_MESSAGE_REQUEST,
+ GST_RTSP_MESSAGE_RESPONSE,
+ GST_RTSP_MESSAGE_HTTP_REQUEST,
+ GST_RTSP_MESSAGE_HTTP_RESPONSE,
+ GST_RTSP_MESSAGE_DATA
+} GstRTSPMsgType;
+
+typedef struct _GstRTSPMessage GstRTSPMessage;
+
+/**
+ * GstRTSPMessage:
+ * @type: the message type
+ *
+ * An RTSP message containing request, response or data messages. Depending on
+ * the @type, the appropriate structure may be accessed.
+ */
+struct _GstRTSPMessage
+{
+ GstRTSPMsgType type;
+
+ union {
+ struct {
+ GstRTSPMethod method;
+ gchar *uri;
+ GstRTSPVersion version;
+ } request;
+ struct {
+ GstRTSPStatusCode code;
+ gchar *reason;
+ GstRTSPVersion version;
+ } response;
+ struct {
+ guint8 channel;
+ } data;
+ } type_data;
+
+ /*< private >*/
+ GArray *hdr_fields;
+
+ guint8 *body;
+ guint body_size;
+};
+
+/* memory management */
+GstRTSPResult gst_rtsp_message_new (GstRTSPMessage **msg);
+GstRTSPResult gst_rtsp_message_init (GstRTSPMessage *msg);
+GstRTSPResult gst_rtsp_message_unset (GstRTSPMessage *msg);
+GstRTSPResult gst_rtsp_message_free (GstRTSPMessage *msg);
+
+GstRTSPMsgType gst_rtsp_message_get_type (GstRTSPMessage *msg);
+
+/* request */
+GstRTSPResult gst_rtsp_message_new_request (GstRTSPMessage **msg,
+ GstRTSPMethod method,
+ const gchar *uri);
+GstRTSPResult gst_rtsp_message_init_request (GstRTSPMessage *msg,
+ GstRTSPMethod method,
+ const gchar *uri);
+GstRTSPResult gst_rtsp_message_parse_request (GstRTSPMessage *msg,
+ GstRTSPMethod *method,
+ const gchar **uri,
+ GstRTSPVersion *version);
+
+/* response */
+GstRTSPResult gst_rtsp_message_new_response (GstRTSPMessage **msg,
+ GstRTSPStatusCode code,
+ const gchar *reason,
+ const GstRTSPMessage *request);
+GstRTSPResult gst_rtsp_message_init_response (GstRTSPMessage *msg,
+ GstRTSPStatusCode code,
+ const gchar *reason,
+ const GstRTSPMessage *request);
+GstRTSPResult gst_rtsp_message_parse_response (GstRTSPMessage *msg,
+ GstRTSPStatusCode *code,
+ const gchar **reason,
+ GstRTSPVersion *version);
+
+/* data */
+GstRTSPResult gst_rtsp_message_new_data (GstRTSPMessage **msg,
+ guint8 channel);
+GstRTSPResult gst_rtsp_message_init_data (GstRTSPMessage *msg,
+ guint8 channel);
+GstRTSPResult gst_rtsp_message_parse_data (GstRTSPMessage *msg,
+ guint8 *channel);
+
+/* headers */
+GstRTSPResult gst_rtsp_message_add_header (GstRTSPMessage *msg,
+ GstRTSPHeaderField field,
+ const gchar *value);
+GstRTSPResult gst_rtsp_message_take_header (GstRTSPMessage *msg,
+ GstRTSPHeaderField field,
+ gchar *value);
+GstRTSPResult gst_rtsp_message_remove_header (GstRTSPMessage *msg,
+ GstRTSPHeaderField field,
+ gint indx);
+GstRTSPResult gst_rtsp_message_get_header (const GstRTSPMessage *msg,
+ GstRTSPHeaderField field,
+ gchar **value,
+ gint indx);
+GstRTSPResult gst_rtsp_message_append_headers (const GstRTSPMessage *msg,
+ GString *str);
+
+/* handling the body */
+GstRTSPResult gst_rtsp_message_set_body (GstRTSPMessage *msg,
+ const guint8 *data,
+ guint size);
+GstRTSPResult gst_rtsp_message_take_body (GstRTSPMessage *msg,
+ guint8 *data,
+ guint size);
+GstRTSPResult gst_rtsp_message_get_body (const GstRTSPMessage *msg,
+ guint8 **data,
+ guint *size);
+GstRTSPResult gst_rtsp_message_steal_body (GstRTSPMessage *msg,
+ guint8 **data,
+ guint *size);
+
+/* debug */
+GstRTSPResult gst_rtsp_message_dump (GstRTSPMessage *msg);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_MESSAGE_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtsprange.c b/gst-libs/gst/rtsp/gstrtsprange.c
new file mode 100644
index 0000000..0ad75c8
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsprange.c
@@ -0,0 +1,272 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstrtsprange
+ * @short_description: dealing with time ranges
+ *
+ * Provides helper functions to deal with time ranges.
+ *
+ * Last reviewed on 2007-07-25 (0.10.14)
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+#include "gstrtsprange.h"
+
+/* npt-time = "now" | npt-sec | npt-hhmmss
+ * npt-sec = 1*DIGIT [ "." *DIGIT ]
+ * npt-hhmmss = npt-hh ":" npt-mm ":" npt-ss [ "." *DIGIT ]
+ * npt-hh = 1*DIGIT ; any positive number
+ * npt-mm = 1*2DIGIT ; 0-59
+ * npt-ss = 1*2DIGIT ; 0-59
+ */
+static GstRTSPResult
+parse_npt_time (const gchar * str, GstRTSPTime * time)
+{
+ if (strncmp (str, "now", 3) == 0) {
+ time->type = GST_RTSP_TIME_NOW;
+ } else if (str[0] == '\0') {
+ time->type = GST_RTSP_TIME_END;
+ } else if (strstr (str, ":")) {
+ gfloat seconds;
+ gint hours, mins;
+
+ sscanf (str, "%2d:%2d:%f", &hours, &mins, &seconds);
+
+ time->type = GST_RTSP_TIME_SECONDS;
+ time->seconds = ((hours * 60) + mins) * 60 + seconds;
+ } else {
+ gfloat seconds;
+
+ sscanf (str, "%f", &seconds);
+
+ time->type = GST_RTSP_TIME_SECONDS;
+ time->seconds = seconds;
+ }
+ return GST_RTSP_OK;
+}
+
+/* npt-range = ( npt-time "-" [ npt-time ] ) | ( "-" npt-time )
+ */
+static GstRTSPResult
+parse_npt_range (const gchar * str, GstRTSPTimeRange * range)
+{
+ GstRTSPResult res;
+ gchar *p;
+
+ range->unit = GST_RTSP_RANGE_NPT;
+
+ /* find '-' separator */
+ p = strstr (str, "-");
+ if (p == NULL)
+ return GST_RTSP_EINVAL;
+
+ if ((res = parse_npt_time (str, &range->min)) != GST_RTSP_OK)
+ goto done;
+
+ res = parse_npt_time (p + 1, &range->max);
+
+done:
+ return res;
+}
+
+static GstRTSPResult
+parse_clock_range (const gchar * str, GstRTSPTimeRange * range)
+{
+ return GST_RTSP_ENOTIMPL;
+}
+
+static GstRTSPResult
+parse_smpte_range (const gchar * str, GstRTSPTimeRange * range)
+{
+ return GST_RTSP_ENOTIMPL;
+}
+
+/**
+ * gst_rtsp_range_parse:
+ * @rangestr: a range string to parse
+ * @range: location to hold the #GstRTSPTimeRange result
+ *
+ * Parse @rangestr to a #GstRTSPTimeRange.
+ *
+ * Returns: #GST_RTSP_OK on success.
+ */
+GstRTSPResult
+gst_rtsp_range_parse (const gchar * rangestr, GstRTSPTimeRange ** range)
+{
+ GstRTSPResult ret;
+ GstRTSPTimeRange *res;
+ gchar *p;
+
+ g_return_val_if_fail (rangestr != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (range != NULL, GST_RTSP_EINVAL);
+
+ res = g_new0 (GstRTSPTimeRange, 1);
+
+ p = (gchar *) rangestr;
+ /* first figure out the units of the range */
+ if (g_str_has_prefix (p, "npt=")) {
+ ret = parse_npt_range (p + 4, res);
+ } else if (g_str_has_prefix (p, "clock=")) {
+ ret = parse_clock_range (p + 6, res);
+ } else if (g_str_has_prefix (p, "smpte=")) {
+ res->unit = GST_RTSP_RANGE_SMPTE;
+ ret = parse_smpte_range (p + 6, res);
+ } else if (g_str_has_prefix (p, "smpte-30-drop=")) {
+ res->unit = GST_RTSP_RANGE_SMPTE_30_DROP;
+ ret = parse_smpte_range (p + 14, res);
+ } else if (g_str_has_prefix (p, "smpte-25=")) {
+ res->unit = GST_RTSP_RANGE_SMPTE_25;
+ ret = parse_smpte_range (p + 9, res);
+ } else
+ goto invalid;
+
+ if (ret != GST_RTSP_OK)
+ goto invalid;
+
+ *range = res;
+ return ret;
+
+ /* ERRORS */
+invalid:
+ {
+ gst_rtsp_range_free (res);
+ return GST_RTSP_EINVAL;
+ }
+}
+
+static gboolean
+npt_time_string (const GstRTSPTime * time, GString * string)
+{
+ gboolean res = TRUE;;
+
+ switch (time->type) {
+ case GST_RTSP_TIME_SECONDS:
+ g_string_append_printf (string, "%f", time->seconds);
+ break;
+ case GST_RTSP_TIME_NOW:
+ g_string_append (string, "now");
+ break;
+ case GST_RTSP_TIME_END:
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ return res;
+}
+
+static gboolean
+npt_range_string (const GstRTSPTimeRange * range, GString * string)
+{
+ gboolean res;
+
+ if (!(res = npt_time_string (&range->min, string)))
+ goto done;
+
+ g_string_append (string, "-");
+
+ if (!(res = npt_time_string (&range->max, string)))
+ goto done;
+
+done:
+ return res;
+}
+
+/**
+ * gst_rtsp_range_to_string:
+ * @range: a #GstRTSPTimeRange
+ *
+ * Convert @range into a string representation.
+ *
+ * Returns: The string representation of @range. g_free() after usage.
+ *
+ * Since: 0.10.23
+ */
+gchar *
+gst_rtsp_range_to_string (const GstRTSPTimeRange * range)
+{
+ gchar *result = NULL;
+ GString *string;
+
+ g_return_val_if_fail (range != NULL, NULL);
+
+ string = g_string_new ("");
+
+ switch (range->unit) {
+ case GST_RTSP_RANGE_NPT:
+ g_string_append (string, "npt=");
+ if (!npt_range_string (range, string)) {
+ g_string_free (string, TRUE);
+ string = NULL;
+ }
+ break;
+ case GST_RTSP_RANGE_SMPTE:
+ case GST_RTSP_RANGE_SMPTE_30_DROP:
+ case GST_RTSP_RANGE_SMPTE_25:
+ case GST_RTSP_RANGE_CLOCK:
+ default:
+ g_warning ("time range unit not yet implemented");
+ g_string_free (string, TRUE);
+ string = NULL;
+ break;
+ }
+ if (string)
+ result = g_string_free (string, FALSE);
+
+ return result;
+}
+
+/**
+ * gst_rtsp_range_free:
+ * @range: a #GstRTSPTimeRange
+ *
+ * Free the memory alocated by @range.
+ */
+void
+gst_rtsp_range_free (GstRTSPTimeRange * range)
+{
+ g_free (range);
+}
diff --git a/gst-libs/gst/rtsp/gstrtsprange.h b/gst-libs/gst/rtsp/gstrtsprange.h
new file mode 100644
index 0000000..9d2c062
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsprange.h
@@ -0,0 +1,121 @@
+/* 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_RTSP_RANGE_H__
+#define __GST_RTSP_RANGE_H__
+
+#include <glib.h>
+
+#include <gst/rtsp/gstrtspdefs.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstRTSPRangeUnit:
+ * @GST_RTSP_RANGE_SMPTE: SMPTE timecode
+ * @GST_RTSP_RANGE_SMPTE_30_DROP: 29.97 frames per second
+ * @GST_RTSP_RANGE_SMPTE_25: 25 frames per second
+ * @GST_RTSP_RANGE_NPT: Normal play time
+ * @GST_RTSP_RANGE_CLOCK: Absolute time expressed as ISO 8601 timestamps
+ *
+ * Different possible time range units.
+ */
+typedef enum
+{
+ GST_RTSP_RANGE_SMPTE,
+ GST_RTSP_RANGE_SMPTE_30_DROP,
+ GST_RTSP_RANGE_SMPTE_25,
+ GST_RTSP_RANGE_NPT,
+ GST_RTSP_RANGE_CLOCK
+} GstRTSPRangeUnit;
+
+typedef struct _GstRTSPTimeRange GstRTSPTimeRange;
+typedef struct _GstRTSPTime GstRTSPTime;
+
+/**
+ * GstRTSPTimeType:
+ * @GST_RTSP_TIME_SECONDS: seconds
+ * @GST_RTSP_TIME_NOW: now
+ * @GST_RTSP_TIME_END: end
+ *
+ * Possible time types.
+ */
+typedef enum {
+ GST_RTSP_TIME_SECONDS,
+ GST_RTSP_TIME_NOW,
+ GST_RTSP_TIME_END
+} GstRTSPTimeType;
+
+/**
+ * GstRTSPTime:
+ * @type: the time of the time
+ * @seconds: seconds when @type is GST_RTSP_TIME_SECONDS
+ *
+ * A time indication.
+ */
+struct _GstRTSPTime {
+ GstRTSPTimeType type;
+ gdouble seconds;
+};
+
+/**
+ * GstRTSPTimeRange:
+ * @unit: the time units used
+ * @min: the minimum interval
+ * @max: the maximum interval
+ *
+ * A time range.
+ */
+struct _GstRTSPTimeRange {
+ GstRTSPRangeUnit unit;
+
+ GstRTSPTime min;
+ GstRTSPTime max;
+};
+
+GstRTSPResult gst_rtsp_range_parse (const gchar *rangestr, GstRTSPTimeRange **range);
+gchar * gst_rtsp_range_to_string (const GstRTSPTimeRange *range);
+void gst_rtsp_range_free (GstRTSPTimeRange *range);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_RANGE_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtsptransport.c b/gst-libs/gst/rtsp/gstrtsptransport.c
new file mode 100644
index 0000000..ab834a5
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsptransport.c
@@ -0,0 +1,716 @@
+/* GStreamer
+ * Copyright (C) <2005,2006,2007> Wim Taymans <wim@fluendo.com>
+ * <2007> Peter Kjellerstedt <pkj at axis 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.
+ */
+
+/**
+ * SECTION:gstrtsptransport
+ * @short_description: dealing with RTSP transports
+ *
+ * Provides helper functions to deal with RTSP transport strings.
+ *
+ * Last reviewed on 2007-07-25 (0.10.14)
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "gstrtsptransport.h"
+
+#define MAX_MANAGERS 2
+
+typedef enum
+{
+ RTSP_TRANSPORT_DELIVERY = 1 << 0, /* multicast | unicast */
+ RTSP_TRANSPORT_DESTINATION = 1 << 1,
+ RTSP_TRANSPORT_SOURCE = 1 << 2,
+ RTSP_TRANSPORT_INTERLEAVED = 1 << 3,
+ RTSP_TRANSPORT_APPEND = 1 << 4,
+ RTSP_TRANSPORT_TTL = 1 << 5,
+ RTSP_TRANSPORT_LAYERS = 1 << 6,
+ RTSP_TRANSPORT_PORT = 1 << 7,
+ RTSP_TRANSPORT_CLIENT_PORT = 1 << 8,
+ RTSP_TRANSPORT_SERVER_PORT = 1 << 9,
+ RTSP_TRANSPORT_SSRC = 1 << 10,
+ RTSP_TRANSPORT_MODE = 1 << 11,
+} RTSPTransportParameter;
+
+typedef struct
+{
+ const gchar *name;
+ const GstRTSPTransMode mode;
+ const gchar *gst_mime;
+ const gchar *manager[MAX_MANAGERS];
+} GstRTSPTransMap;
+
+static const GstRTSPTransMap transports[] = {
+ {"rtp", GST_RTSP_TRANS_RTP, "application/x-rtp", {"gstrtpbin", "rtpdec"}},
+ {"x-real-rdt", GST_RTSP_TRANS_RDT, "application/x-rdt", {"rdtmanager", NULL}},
+ {"x-pn-tng", GST_RTSP_TRANS_RDT, "application/x-rdt", {"rdtmanager", NULL}},
+ {NULL, GST_RTSP_TRANS_UNKNOWN, NULL, {NULL, NULL}}
+};
+
+typedef struct
+{
+ const gchar *name;
+ const GstRTSPProfile profile;
+} RTSPProfileMap;
+
+static const RTSPProfileMap profiles[] = {
+ {"avp", GST_RTSP_PROFILE_AVP},
+ {"savp", GST_RTSP_PROFILE_SAVP},
+ {NULL, GST_RTSP_PROFILE_UNKNOWN}
+};
+
+typedef struct
+{
+ const gchar *name;
+ const GstRTSPLowerTrans ltrans;
+} RTSPLTransMap;
+
+static const RTSPLTransMap ltrans[] = {
+ {"udp", GST_RTSP_LOWER_TRANS_UDP},
+ {"mcast", GST_RTSP_LOWER_TRANS_UDP_MCAST},
+ {"tcp", GST_RTSP_LOWER_TRANS_TCP},
+ {NULL, GST_RTSP_LOWER_TRANS_UNKNOWN}
+};
+
+
+GType
+gst_rtsp_lower_trans_get_type (void)
+{
+ static volatile gsize rtsp_lower_trans_type = 0;
+ static const GFlagsValue rtsp_lower_trans[] = {
+ {GST_RTSP_LOWER_TRANS_UDP, "GST_RTSP_LOWER_TRANS_UDP", "udp-unicast"},
+ {GST_RTSP_LOWER_TRANS_UDP_MCAST, "GST_RTSP_LOWER_TRANS_UDP_MCAST",
+ "udp-multicast"},
+ {GST_RTSP_LOWER_TRANS_TCP, "GST_RTSP_LOWER_TRANS_TCP", "tcp"},
+ {GST_RTSP_LOWER_TRANS_HTTP, "GST_RTSP_LOWER_TRANS_HTTP", "http"},
+ {0, NULL, NULL},
+ };
+
+ if (g_once_init_enter (&rtsp_lower_trans_type)) {
+ GType tmp = g_flags_register_static ("GstRTSPLowerTrans", rtsp_lower_trans);
+ g_once_init_leave (&rtsp_lower_trans_type, tmp);
+ }
+
+ return (GType) rtsp_lower_trans_type;
+}
+
+#define RTSP_TRANSPORT_PARAMETER_IS_UNIQUE(param) \
+G_STMT_START { \
+ if ((transport_params & (param)) != 0) \
+ goto invalid_transport; \
+ transport_params |= (param); \
+} G_STMT_END
+
+/**
+ * gst_rtsp_transport_new:
+ * @transport: location to hold the new #GstRTSPTransport
+ *
+ * Allocate a new initialized #GstRTSPTransport. Use gst_rtsp_transport_free()
+ * after usage.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_transport_new (GstRTSPTransport ** transport)
+{
+ GstRTSPTransport *trans;
+
+ g_return_val_if_fail (transport != NULL, GST_RTSP_EINVAL);
+
+ trans = g_new0 (GstRTSPTransport, 1);
+
+ *transport = trans;
+
+ return gst_rtsp_transport_init (trans);
+}
+
+/**
+ * gst_rtsp_transport_init:
+ * @transport: a #GstRTSPTransport
+ *
+ * Initialize @transport so that it can be used.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_transport_init (GstRTSPTransport * transport)
+{
+ g_return_val_if_fail (transport != NULL, GST_RTSP_EINVAL);
+
+ g_free (transport->destination);
+ g_free (transport->source);
+
+ memset (transport, 0, sizeof (GstRTSPTransport));
+
+ transport->trans = GST_RTSP_TRANS_RTP;
+ transport->profile = GST_RTSP_PROFILE_AVP;
+ transport->lower_transport = GST_RTSP_LOWER_TRANS_UDP_MCAST;
+ transport->mode_play = TRUE;
+ transport->mode_record = FALSE;
+ transport->interleaved.min = -1;
+ transport->interleaved.max = -1;
+ transport->port.min = -1;
+ transport->port.max = -1;
+ transport->client_port.min = -1;
+ transport->client_port.max = -1;
+ transport->server_port.min = -1;
+ transport->server_port.max = -1;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_transport_get_mime:
+ * @trans: a #GstRTSPTransMode
+ * @mime: location to hold the result
+ *
+ * Get the mime type of the transport mode @trans. This mime type is typically
+ * used to generate #GstCaps on buffers.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_transport_get_mime (GstRTSPTransMode trans, const gchar ** mime)
+{
+ gint i;
+
+ g_return_val_if_fail (mime != NULL, GST_RTSP_EINVAL);
+
+ for (i = 0; transports[i].name; i++)
+ if (transports[i].mode == trans)
+ break;
+ *mime = transports[i].gst_mime;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_transport_get_manager:
+ * @trans: a #GstRTSPTransMode
+ * @manager: location to hold the result
+ * @option: option index.
+ *
+ * Get the #GstElement that can handle the buffers transported over @trans.
+ *
+ * It is possible that there are several managers available, use @option to
+ * selected one.
+ *
+ * @manager will contain an element name or #NULL when no manager is
+ * needed/available for @trans.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_transport_get_manager (GstRTSPTransMode trans, const gchar ** manager,
+ guint option)
+{
+ gint i;
+
+ g_return_val_if_fail (manager != NULL, GST_RTSP_EINVAL);
+
+ for (i = 0; transports[i].name; i++)
+ if (transports[i].mode == trans)
+ break;
+
+ if (option < MAX_MANAGERS)
+ *manager = transports[i].manager[option];
+ else
+ *manager = NULL;
+
+ return GST_RTSP_OK;
+}
+
+static void
+parse_mode (GstRTSPTransport * transport, const gchar * str)
+{
+ transport->mode_play = (strstr (str, "play") != NULL);
+ transport->mode_record = (strstr (str, "record") != NULL);
+}
+
+static gboolean
+check_range (const gchar * str, gchar ** tmp, gint * range)
+{
+ glong range_val;
+
+ range_val = strtol (str, tmp, 10);
+ if (range_val >= G_MININT && range_val <= G_MAXINT) {
+ *range = range_val;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static gboolean
+parse_range (const gchar * str, GstRTSPRange * range)
+{
+ gchar *minus;
+ gchar *tmp;
+
+ /* even though strtol() allows white space, plus and minus in front of
+ * the number, we do not allow it
+ */
+ if (g_ascii_isspace (*str) || *str == '+' || *str == '-')
+ goto invalid_range;
+
+ minus = strstr (str, "-");
+ if (minus) {
+ if (g_ascii_isspace (minus[1]) || minus[1] == '+' || minus[1] == '-')
+ goto invalid_range;
+
+ if (!check_range (str, &tmp, &range->min) || str == tmp || tmp != minus)
+ goto invalid_range;
+
+ if (!check_range (minus + 1, &tmp, &range->max) || (*tmp && *tmp != ';'))
+ goto invalid_range;
+ } else {
+ if (!check_range (str, &tmp, &range->min) || str == tmp ||
+ (*tmp && *tmp != ';'))
+ goto invalid_range;
+
+ range->max = -1;
+ }
+
+ return TRUE;
+
+invalid_range:
+ {
+ range->min = -1;
+ range->max = -1;
+ return FALSE;
+ }
+}
+
+static gchar *
+range_as_text (const GstRTSPRange * range)
+{
+ if (range->min < 0)
+ return NULL;
+ else if (range->max < 0)
+ return g_strdup_printf ("%d", range->min);
+ else
+ return g_strdup_printf ("%d-%d", range->min, range->max);
+}
+
+static const gchar *
+rtsp_transport_mode_as_text (const GstRTSPTransport * transport)
+{
+ gint i;
+
+ for (i = 0; transports[i].name; i++)
+ if (transports[i].mode == transport->trans)
+ return transports[i].name;
+
+ return NULL;
+}
+
+static const gchar *
+rtsp_transport_profile_as_text (const GstRTSPTransport * transport)
+{
+ gint i;
+
+ for (i = 0; profiles[i].name; i++)
+ if (profiles[i].profile == transport->profile)
+ return profiles[i].name;
+
+ return NULL;
+}
+
+static const gchar *
+rtsp_transport_ltrans_as_text (const GstRTSPTransport * transport)
+{
+ gint i;
+
+ /* need to special case GST_RTSP_LOWER_TRANS_UDP_MCAST */
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST)
+ return "udp";
+
+ for (i = 0; ltrans[i].name; i++)
+ if (ltrans[i].ltrans == transport->lower_transport)
+ return ltrans[i].name;
+
+ return NULL;
+}
+
+#define IS_VALID_PORT_RANGE(range) \
+ (range.min >= 0 && range.min < 65536 && range.max < 65536)
+
+#define IS_VALID_INTERLEAVE_RANGE(range) \
+ (range.min >= 0 && range.min < 256 && range.max < 256)
+
+/**
+ * gst_rtsp_transport_parse:
+ * @str: a transport string
+ * @transport: a #GstRTSPTransport
+ *
+ * Parse the RTSP transport string @str into @transport.
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_transport_parse (const gchar * str, GstRTSPTransport * transport)
+{
+ gchar **split, *down, **transp = NULL;
+ guint transport_params = 0;
+ gint i, count;
+
+ g_return_val_if_fail (transport != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (str != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_transport_init (transport);
+
+ /* case insensitive */
+ down = g_ascii_strdown (str, -1);
+
+ split = g_strsplit (down, ";", 0);
+ g_free (down);
+
+ /* First field contains the transport/profile/lower_transport */
+ if (split[0] == NULL)
+ goto invalid_transport;
+
+ transp = g_strsplit (split[0], "/", 0);
+
+ if (transp[0] == NULL || transp[1] == NULL)
+ goto invalid_transport;
+
+ for (i = 0; transports[i].name; i++)
+ if (strcmp (transp[0], transports[i].name) == 0)
+ break;
+ transport->trans = transports[i].mode;
+
+ if (transport->trans != GST_RTSP_TRANS_RDT) {
+ for (i = 0; profiles[i].name; i++)
+ if (strcmp (transp[1], profiles[i].name) == 0)
+ break;
+ transport->profile = profiles[i].profile;
+ count = 2;
+ } else {
+ /* RDT has transport/lower_transport */
+ transport->profile = GST_RTSP_PROFILE_AVP;
+ count = 1;
+ }
+
+ if (transp[count] != NULL) {
+ for (i = 0; ltrans[i].name; i++)
+ if (strcmp (transp[count], ltrans[i].name) == 0)
+ break;
+ transport->lower_transport = ltrans[i].ltrans;
+ } else {
+ /* specifying the lower transport is optional */
+ if (transport->trans == GST_RTSP_TRANS_RTP &&
+ transport->profile == GST_RTSP_PROFILE_AVP)
+ transport->lower_transport = GST_RTSP_LOWER_TRANS_UDP_MCAST;
+ else
+ transport->lower_transport = GST_RTSP_LOWER_TRANS_UNKNOWN;
+ }
+
+ g_strfreev (transp);
+ transp = NULL;
+
+ if (transport->trans == GST_RTSP_TRANS_UNKNOWN ||
+ transport->profile == GST_RTSP_PROFILE_UNKNOWN ||
+ transport->lower_transport == GST_RTSP_LOWER_TRANS_UNKNOWN)
+ goto unsupported_transport;
+
+ i = 1;
+ while (split[i]) {
+ if (strcmp (split[i], "multicast") == 0) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_DELIVERY);
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP)
+ goto invalid_transport;
+ transport->lower_transport = GST_RTSP_LOWER_TRANS_UDP_MCAST;
+ } else if (strcmp (split[i], "unicast") == 0) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_DELIVERY);
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST)
+ transport->lower_transport = GST_RTSP_LOWER_TRANS_UDP;
+ } else if (g_str_has_prefix (split[i], "destination=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_DESTINATION);
+ transport->destination = g_strdup (split[i] + 12);
+ } else if (g_str_has_prefix (split[i], "source=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_SOURCE);
+ transport->source = g_strdup (split[i] + 7);
+ } else if (g_str_has_prefix (split[i], "layers=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_LAYERS);
+ transport->layers = strtoul (split[i] + 7, NULL, 10);
+ } else if (g_str_has_prefix (split[i], "mode=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_MODE);
+ parse_mode (transport, split[i] + 5);
+ if (!transport->mode_play && !transport->mode_record)
+ goto invalid_transport;
+ } else if (strcmp (split[i], "append") == 0) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_APPEND);
+ transport->append = TRUE;
+ } else if (g_str_has_prefix (split[i], "interleaved=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_INTERLEAVED);
+ parse_range (split[i] + 12, &transport->interleaved);
+ if (!IS_VALID_INTERLEAVE_RANGE (transport->interleaved))
+ goto invalid_transport;
+ } else if (g_str_has_prefix (split[i], "ttl=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_TTL);
+ transport->ttl = strtoul (split[i] + 4, NULL, 10);
+ if (transport->ttl >= 256)
+ goto invalid_transport;
+ } else if (g_str_has_prefix (split[i], "port=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_PORT);
+ if (parse_range (split[i] + 5, &transport->port)) {
+ if (!IS_VALID_PORT_RANGE (transport->port))
+ goto invalid_transport;
+ }
+ } else if (g_str_has_prefix (split[i], "client_port=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_CLIENT_PORT);
+ if (parse_range (split[i] + 12, &transport->client_port)) {
+ if (!IS_VALID_PORT_RANGE (transport->client_port))
+ goto invalid_transport;
+ }
+ } else if (g_str_has_prefix (split[i], "server_port=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_SERVER_PORT);
+ if (parse_range (split[i] + 12, &transport->server_port)) {
+ if (!IS_VALID_PORT_RANGE (transport->server_port))
+ goto invalid_transport;
+ }
+ } else if (g_str_has_prefix (split[i], "ssrc=")) {
+ RTSP_TRANSPORT_PARAMETER_IS_UNIQUE (RTSP_TRANSPORT_SSRC);
+ transport->ssrc = strtoul (split[i] + 5, NULL, 16);
+ } else {
+ /* unknown field... */
+ g_warning ("unknown transport field \"%s\"", split[i]);
+ }
+ i++;
+ }
+ g_strfreev (split);
+
+ return GST_RTSP_OK;
+
+unsupported_transport:
+ {
+ g_strfreev (split);
+ return GST_RTSP_ERROR;
+ }
+invalid_transport:
+ {
+ g_strfreev (transp);
+ g_strfreev (split);
+ return GST_RTSP_EINVAL;
+ }
+}
+
+/**
+ * gst_rtsp_transport_as_text:
+ * @transport: a #GstRTSPTransport
+ *
+ * Convert @transport into a string that can be used to signal the transport in
+ * an RTSP SETUP response.
+ *
+ * Returns: a string describing the RTSP transport or #NULL when the transport
+ * is invalid.
+ */
+gchar *
+gst_rtsp_transport_as_text (GstRTSPTransport * transport)
+{
+ GPtrArray *strs;
+ gchar *res;
+ const gchar *tmp;
+
+ g_return_val_if_fail (transport != NULL, NULL);
+
+ strs = g_ptr_array_new ();
+
+ /* add the transport specifier */
+ if ((tmp = rtsp_transport_mode_as_text (transport)) == NULL)
+ goto invalid_transport;
+ g_ptr_array_add (strs, g_ascii_strup (tmp, -1));
+
+ g_ptr_array_add (strs, g_strdup ("/"));
+
+ if ((tmp = rtsp_transport_profile_as_text (transport)) == NULL)
+ goto invalid_transport;
+ g_ptr_array_add (strs, g_ascii_strup (tmp, -1));
+
+ if (transport->trans != GST_RTSP_TRANS_RTP ||
+ transport->profile != GST_RTSP_PROFILE_AVP ||
+ transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP) {
+ g_ptr_array_add (strs, g_strdup ("/"));
+
+ if ((tmp = rtsp_transport_ltrans_as_text (transport)) == NULL)
+ goto invalid_transport;
+
+ g_ptr_array_add (strs, g_ascii_strup (tmp, -1));
+ }
+
+ /*
+ * the order of the following parameters is the same as the one specified in
+ * RFC 2326 to please some weird RTSP clients that require it
+ */
+
+ /* add the unicast/multicast parameter */
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST)
+ g_ptr_array_add (strs, g_strdup (";multicast"));
+ else
+ g_ptr_array_add (strs, g_strdup (";unicast"));
+
+ /* add the destination parameter */
+ if (transport->destination != NULL) {
+ g_ptr_array_add (strs, g_strdup (";destination="));
+ g_ptr_array_add (strs, g_strdup (transport->destination));
+ }
+
+ /* add the source parameter */
+ if (transport->source != NULL) {
+ g_ptr_array_add (strs, g_strdup (";source="));
+ g_ptr_array_add (strs, g_strdup (transport->source));
+ }
+
+ /* add the interleaved parameter */
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP &&
+ transport->interleaved.min >= 0) {
+ if (transport->interleaved.min < 256 && transport->interleaved.max < 256) {
+ g_ptr_array_add (strs, g_strdup (";interleaved="));
+ g_ptr_array_add (strs, range_as_text (&transport->interleaved));
+ } else
+ goto invalid_transport;
+ }
+
+ /* add the append parameter */
+ if (transport->mode_record && transport->append)
+ g_ptr_array_add (strs, g_strdup (";append"));
+
+ /* add the ttl parameter */
+ if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST &&
+ transport->ttl != 0) {
+ if (transport->ttl < 256) {
+ g_ptr_array_add (strs, g_strdup (";ttl="));
+ g_ptr_array_add (strs, g_strdup_printf ("%u", transport->ttl));
+ } else
+ goto invalid_transport;
+ }
+
+ /* add the layers parameter */
+ if (transport->layers != 0) {
+ g_ptr_array_add (strs, g_strdup (";layers="));
+ g_ptr_array_add (strs, g_strdup_printf ("%u", transport->layers));
+ }
+
+ /* add the port parameter */
+ if (transport->lower_transport != GST_RTSP_LOWER_TRANS_TCP) {
+ if (transport->trans == GST_RTSP_TRANS_RTP && transport->port.min >= 0) {
+ if (transport->port.min < 65536 && transport->port.max < 65536) {
+ g_ptr_array_add (strs, g_strdup (";port="));
+ g_ptr_array_add (strs, range_as_text (&transport->port));
+ } else
+ goto invalid_transport;
+ }
+
+ /* add the client_port parameter */
+ if (transport->trans == GST_RTSP_TRANS_RTP
+ && transport->client_port.min >= 0) {
+ if (transport->client_port.min < 65536
+ && transport->client_port.max < 65536) {
+ g_ptr_array_add (strs, g_strdup (";client_port="));
+ g_ptr_array_add (strs, range_as_text (&transport->client_port));
+ } else
+ goto invalid_transport;
+ }
+
+ /* add the server_port parameter */
+ if (transport->trans == GST_RTSP_TRANS_RTP
+ && transport->server_port.min >= 0) {
+ if (transport->server_port.min < 65536
+ && transport->server_port.max < 65536) {
+ g_ptr_array_add (strs, g_strdup (";server_port="));
+ g_ptr_array_add (strs, range_as_text (&transport->server_port));
+ } else
+ goto invalid_transport;
+ }
+ }
+
+ /* add the ssrc parameter */
+ if (transport->lower_transport != GST_RTSP_LOWER_TRANS_UDP_MCAST &&
+ transport->ssrc != 0) {
+ g_ptr_array_add (strs, g_strdup (";ssrc="));
+ g_ptr_array_add (strs, g_strdup_printf ("%08X", transport->ssrc));
+ }
+
+ /* add the mode parameter */
+ if (transport->mode_play && transport->mode_record)
+ g_ptr_array_add (strs, g_strdup (";mode=\"PLAY,RECORD\""));
+ else if (transport->mode_record)
+ g_ptr_array_add (strs, g_strdup (";mode=\"RECORD\""));
+ else if (transport->mode_play)
+ g_ptr_array_add (strs, g_strdup (";mode=\"PLAY\""));
+
+ /* add a terminating NULL */
+ g_ptr_array_add (strs, NULL);
+
+ res = g_strjoinv (NULL, (gchar **) strs->pdata);
+ g_strfreev ((gchar **) g_ptr_array_free (strs, FALSE));
+
+ return res;
+
+invalid_transport:
+ {
+ g_ptr_array_add (strs, NULL);
+ g_strfreev ((gchar **) g_ptr_array_free (strs, FALSE));
+ return NULL;
+ }
+}
+
+/**
+ * gst_rtsp_transport_free:
+ * @transport: a #GstRTSPTransport
+ *
+ * Free the memory used by @transport.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_transport_free (GstRTSPTransport * transport)
+{
+ g_return_val_if_fail (transport != NULL, GST_RTSP_EINVAL);
+
+ gst_rtsp_transport_init (transport);
+ g_free (transport);
+
+ return GST_RTSP_OK;
+}
diff --git a/gst-libs/gst/rtsp/gstrtsptransport.h b/gst-libs/gst/rtsp/gstrtsptransport.h
new file mode 100644
index 0000000..995d753
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtsptransport.h
@@ -0,0 +1,174 @@
+/* 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_RTSP_TRANSPORT_H__
+#define __GST_RTSP_TRANSPORT_H__
+
+#include <gst/rtsp/gstrtspdefs.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstRTSPTransMode:
+ * @GST_RTSP_TRANS_UNKNOWN: invalid tansport mode
+ * @GST_RTSP_TRANS_RTP: transfer RTP data
+ * @GST_RTSP_TRANS_RDT: transfer RDT (RealMedia) data
+ *
+ * The transfer mode to use.
+ */
+typedef enum {
+ GST_RTSP_TRANS_UNKNOWN = 0,
+ GST_RTSP_TRANS_RTP = (1 << 0),
+ GST_RTSP_TRANS_RDT = (1 << 1)
+} GstRTSPTransMode;
+
+/**
+ * GstRTSPProfile:
+ * @GST_RTSP_PROFILE_UNKNOWN: invalid profile
+ * @GST_RTSP_PROFILE_AVP: the Audio/Visual profile
+ * @GST_RTSP_PROFILE_SAVP: the secure Audio/Visual profile
+ *
+ * The transfer profile to use.
+ */
+typedef enum {
+ GST_RTSP_PROFILE_UNKNOWN = 0,
+ GST_RTSP_PROFILE_AVP = (1 << 0),
+ GST_RTSP_PROFILE_SAVP = (1 << 1)
+} GstRTSPProfile;
+
+/**
+ * GstRTSPLowerTrans:
+ * @GST_RTSP_LOWER_TRANS_UNKNOWN: invalid transport flag
+ * @GST_RTSP_LOWER_TRANS_UDP: stream data over UDP
+ * @GST_RTSP_LOWER_TRANS_UDP_MCAST: stream data over UDP multicast
+ * @GST_RTSP_LOWER_TRANS_TCP: stream data over TCP
+ * @GST_RTSP_LOWER_TRANS_HTTP: stream data tunneled over HTTP. Since: 0.10.23
+ *
+ * The different transport methods.
+ */
+typedef enum {
+ GST_RTSP_LOWER_TRANS_UNKNOWN = 0,
+ GST_RTSP_LOWER_TRANS_UDP = (1 << 0),
+ GST_RTSP_LOWER_TRANS_UDP_MCAST = (1 << 1),
+ GST_RTSP_LOWER_TRANS_TCP = (1 << 2),
+ GST_RTSP_LOWER_TRANS_HTTP = (1 << 4)
+} GstRTSPLowerTrans;
+
+#define GST_TYPE_RTSP_LOWER_TRANS (gst_rtsp_lower_trans_get_type())
+GType gst_rtsp_lower_trans_get_type (void);
+
+typedef struct _GstRTSPRange GstRTSPRange;
+typedef struct _GstRTSPTransport GstRTSPTransport;
+
+/**
+ * GstRTSPRange:
+ * @min: minimum value of the range
+ * @max: maximum value of the range
+ *
+ * A type to specify a range.
+ */
+
+struct _GstRTSPRange {
+ gint min;
+ gint max;
+};
+
+/**
+ * GstRTSPTransport:
+ * @trans: the transport mode
+ * @profile: the tansport profile
+ * @lower_transport: the lower transport
+ * @destination: the destination ip/hostname
+ * @source: the source ip/hostname
+ * @layers: the number of layers
+ * @mode_play: if play mode was selected
+ * @mode_record: if record mode was selected
+ * @append: is append mode was selected
+ * @interleaved: the interleave range
+ * @ttl: the time to live for multicast UDP
+ * @port: the port pair for multicast sessions
+ * @client_port: the client port pair for receiving data
+ * @server_port: the server port pair for receiving data
+ * @ssrc: the ssrc that the sender/receiver will use
+ *
+ * A structure holding the RTSP transport values.
+ */
+
+struct _GstRTSPTransport {
+ GstRTSPTransMode trans;
+ GstRTSPProfile profile;
+ GstRTSPLowerTrans lower_transport;
+
+ gchar *destination;
+ gchar *source;
+ guint layers;
+ gboolean mode_play;
+ gboolean mode_record;
+ gboolean append;
+ GstRTSPRange interleaved;
+
+ /* multicast specific */
+ guint ttl;
+
+ /* UDP specific */
+ GstRTSPRange port;
+ GstRTSPRange client_port;
+ GstRTSPRange server_port;
+ /* RTP specific */
+ guint ssrc;
+
+};
+
+GstRTSPResult gst_rtsp_transport_new (GstRTSPTransport **transport);
+GstRTSPResult gst_rtsp_transport_init (GstRTSPTransport *transport);
+
+GstRTSPResult gst_rtsp_transport_parse (const gchar *str, GstRTSPTransport *transport);
+gchar* gst_rtsp_transport_as_text (GstRTSPTransport *transport);
+
+GstRTSPResult gst_rtsp_transport_get_mime (GstRTSPTransMode trans, const gchar **mime);
+GstRTSPResult gst_rtsp_transport_get_manager (GstRTSPTransMode trans, const gchar **manager, guint option);
+
+GstRTSPResult gst_rtsp_transport_free (GstRTSPTransport *transport);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_TRANSPORT_H__ */
diff --git a/gst-libs/gst/rtsp/gstrtspurl.c b/gst-libs/gst/rtsp/gstrtspurl.c
new file mode 100644
index 0000000..db2637c
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspurl.c
@@ -0,0 +1,416 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstrtspurl
+ * @short_description: handling RTSP urls
+ *
+ * Provides helper functions to handle RTSP urls.
+ *
+ * Last reviewed on 2007-07-25 (0.10.14)
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gstrtspurl.h"
+
+GType
+gst_rtsp_url_get_type (void)
+{
+ static volatile gsize url_type = 0;
+
+ if (g_once_init_enter (&url_type)) {
+ GType tmp = g_boxed_type_register_static ("GstRTSPUrl",
+ (GBoxedCopyFunc) gst_rtsp_url_copy, (GBoxedFreeFunc) gst_rtsp_url_free);
+ g_once_init_leave (&url_type, tmp);
+ }
+
+ return (GType) url_type;
+}
+
+static const struct
+{
+ const char scheme[6];
+ GstRTSPLowerTrans transports;
+} rtsp_schemes_map[] = {
+ {
+ "rtsp", GST_RTSP_LOWER_TRANS_TCP | GST_RTSP_LOWER_TRANS_UDP |
+ GST_RTSP_LOWER_TRANS_UDP_MCAST}, {
+ "rtspu", GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST}, {
+ "rtspt", GST_RTSP_LOWER_TRANS_TCP}, {
+ "rtsph", GST_RTSP_LOWER_TRANS_HTTP | GST_RTSP_LOWER_TRANS_TCP}
+};
+
+/* format is rtsp[u]://[user:passwd@]host[:port]/abspath[?query] where host
+ * is a host name, an IPv4 dotted decimal address ("aaa.bbb.ccc.ddd") or an
+ * [IPv6] address ("[aabb:ccdd:eeff:gghh::sstt]" note the brackets around the
+ * address to allow the distinction between ':' as an IPv6 hexgroup separator
+ * and as a host/port separator) */
+
+/**
+ * gst_rtsp_url_parse:
+ * @urlstr: the url string to parse
+ * @url: location to hold the result.
+ *
+ * Parse the RTSP @urlstr into a newly allocated #GstRTSPUrl. Free after usage
+ * with gst_rtsp_url_free().
+ *
+ * Returns: a #GstRTSPResult.
+ */
+GstRTSPResult
+gst_rtsp_url_parse (const gchar * urlstr, GstRTSPUrl ** url)
+{
+ GstRTSPUrl *res;
+ gchar *p, *delim, *at, *col;
+ gchar *host_end = NULL;
+ guint i;
+
+ g_return_val_if_fail (urlstr != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (url != NULL, GST_RTSP_EINVAL);
+
+ res = g_new0 (GstRTSPUrl, 1);
+
+ p = (gchar *) urlstr;
+
+ col = strstr (p, "://");
+ if (col == NULL)
+ goto invalid;
+
+ for (i = 0; i < G_N_ELEMENTS (rtsp_schemes_map); i++) {
+ if (g_ascii_strncasecmp (rtsp_schemes_map[i].scheme, p, col - p) == 0) {
+ res->transports = rtsp_schemes_map[i].transports;
+ p = col + 3;
+ break;
+ }
+ }
+
+ if (res->transports == GST_RTSP_LOWER_TRANS_UNKNOWN)
+ goto invalid;
+
+ delim = strpbrk (p, "/?");
+ at = strchr (p, '@');
+
+ if (at && delim && at > delim)
+ at = NULL;
+
+ if (at) {
+ col = strchr (p, ':');
+
+ /* must have a ':' and it must be before the '@' */
+ if (col == NULL || col > at)
+ goto invalid;
+
+ res->user = g_strndup (p, col - p);
+ col++;
+ res->passwd = g_strndup (col, at - col);
+
+ /* move to host */
+ p = at + 1;
+ }
+
+ if (*p == '[') {
+ res->family = GST_RTSP_FAM_INET6;
+
+ /* we have an IPv6 address in the URL, find the ending ] which must be
+ * before any delimiter */
+ host_end = strchr (++p, ']');
+ if (!host_end || (delim && host_end >= delim))
+ goto invalid;
+
+ /* a port specifier must follow the address immediately */
+ col = host_end[1] == ':' ? host_end + 1 : NULL;
+ } else {
+ res->family = GST_RTSP_FAM_INET;
+
+ col = strchr (p, ':');
+
+ /* we have a ':' and a delimiter but the ':' is after the delimiter, it's
+ * not really part of the hostname */
+ if (col && delim && col >= delim)
+ col = NULL;
+
+ host_end = col ? col : delim;
+ }
+
+ if (!host_end)
+ res->host = g_strdup (p);
+ else {
+ res->host = g_strndup (p, host_end - p);
+
+ if (col) {
+ res->port = strtoul (col + 1, NULL, 10);
+ } else {
+ /* no port specified, set to 0. gst_rtsp_url_get_port() will return the
+ * default port */
+ res->port = 0;
+ }
+ }
+ p = delim;
+
+ if (p && *p == '/') {
+ delim = strchr (p, '?');
+ if (!delim)
+ res->abspath = g_strdup (p);
+ else
+ res->abspath = g_strndup (p, delim - p);
+ p = delim;
+ } else {
+ res->abspath = g_strdup ("/");
+ }
+
+ if (p && *p == '?')
+ res->query = g_strdup (p + 1);
+
+ *url = res;
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+invalid:
+ {
+ gst_rtsp_url_free (res);
+ return GST_RTSP_EINVAL;
+ }
+}
+
+/**
+ * gst_rtsp_url_copy:
+ * @url: a #GstRTSPUrl
+ *
+ * Make a copy of @url.
+ *
+ * Returns: a copy of @url. Free with gst_rtsp_url_free () after usage.
+ *
+ * Since: 0.10.22
+ */
+GstRTSPUrl *
+gst_rtsp_url_copy (const GstRTSPUrl * url)
+{
+ GstRTSPUrl *res;
+
+ g_return_val_if_fail (url != NULL, NULL);
+
+ res = g_new0 (GstRTSPUrl, 1);
+
+ res->transports = url->transports;
+ res->family = url->family;
+ res->user = g_strdup (url->user);
+ res->passwd = g_strdup (url->passwd);
+ res->host = g_strdup (url->host);
+ res->port = url->port;
+ res->abspath = g_strdup (url->abspath);
+ res->query = g_strdup (url->query);
+
+ return res;
+}
+
+/**
+ * gst_rtsp_url_free:
+ * @url: a #GstRTSPUrl
+ *
+ * Free the memory used by @url.
+ */
+void
+gst_rtsp_url_free (GstRTSPUrl * url)
+{
+ if (url == NULL)
+ return;
+
+ g_free (url->user);
+ g_free (url->passwd);
+ g_free (url->host);
+ g_free (url->abspath);
+ g_free (url->query);
+ g_free (url);
+}
+
+/**
+ * gst_rtsp_url_set_port:
+ * @url: a #GstRTSPUrl
+ * @port: the port
+ *
+ * Set the port number in @url to @port.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_url_set_port (GstRTSPUrl * url, guint16 port)
+{
+ g_return_val_if_fail (url != NULL, GST_RTSP_EINVAL);
+
+ url->port = port;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_url_get_port:
+ * @url: a #GstRTSPUrl
+ * @port: location to hold the port
+ *
+ * Get the port number of @url.
+ *
+ * Returns: #GST_RTSP_OK.
+ */
+GstRTSPResult
+gst_rtsp_url_get_port (const GstRTSPUrl * url, guint16 * port)
+{
+ g_return_val_if_fail (url != NULL, GST_RTSP_EINVAL);
+ g_return_val_if_fail (port != NULL, GST_RTSP_EINVAL);
+
+ /* if a port was specified, use that else use the default port. */
+ if (url->port != 0)
+ *port = url->port;
+ else
+ *port = GST_RTSP_DEFAULT_PORT;
+
+ return GST_RTSP_OK;
+}
+
+/**
+ * gst_rtsp_url_get_request_uri:
+ * @url: a #GstRTSPUrl
+ *
+ * Get a newly allocated string describing the request URI for @url.
+ *
+ * Returns: a string with the request URI. g_free() after usage.
+ */
+gchar *
+gst_rtsp_url_get_request_uri (const GstRTSPUrl * url)
+{
+ gchar *uri;
+ const gchar *pre_host;
+ const gchar *post_host;
+ const gchar *pre_query;
+ const gchar *query;
+
+ g_return_val_if_fail (url != NULL, NULL);
+
+ pre_host = url->family == GST_RTSP_FAM_INET6 ? "[" : "";
+ post_host = url->family == GST_RTSP_FAM_INET6 ? "]" : "";
+ pre_query = url->query ? "?" : "";
+ query = url->query ? url->query : "";
+
+ if (url->port != 0) {
+ uri = g_strdup_printf ("rtsp://%s%s%s:%u%s%s%s", pre_host, url->host,
+ post_host, url->port, url->abspath, pre_query, query);
+ } else {
+ uri = g_strdup_printf ("rtsp://%s%s%s%s%s%s", pre_host, url->host,
+ post_host, url->abspath, pre_query, query);
+ }
+
+ return uri;
+}
+
+static int
+hex_to_int (gchar c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ else if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ else
+ return -1;
+}
+
+static void
+unescape_path_component (gchar * comp)
+{
+ guint len = strlen (comp);
+ guint i;
+
+ for (i = 0; i + 2 < len; i++)
+ if (comp[i] == '%') {
+ int a, b;
+
+ a = hex_to_int (comp[i + 1]);
+ b = hex_to_int (comp[i + 2]);
+
+ /* The a||b check is to ensure that the byte is not '\0' */
+ if (a >= 0 && b >= 0 && (a || b)) {
+ comp[i] = (gchar) (a * 16 + b);
+ memmove (comp + i + 1, comp + i + 3, len - i - 3);
+ len -= 2;
+ comp[len] = '\0';
+ }
+ }
+}
+
+/**
+ * gst_rtsp_url_decode_path_components:
+ * @url: a #GstRTSPUrl
+ *
+ * Splits the path of @url on '/' boundaries, decoding the resulting components,
+ *
+ * The decoding performed by this routine is "URI decoding", as defined in RFC
+ * 3986, commonly known as percent-decoding. For example, a string "foo\%2fbar"
+ * will decode to "foo/bar" -- the \%2f being replaced by the corresponding byte
+ * with hex value 0x2f. Note that there is no guarantee that the resulting byte
+ * sequence is valid in any given encoding. As a special case, \%00 is not
+ * unescaped to NUL, as that would prematurely terminate the string.
+ *
+ * Also note that since paths usually start with a slash, the first component
+ * will usually be the empty string.
+ *
+ * Returns: a string vector. g_strfreev() after usage.
+ *
+ * Since: 0.10.32
+ */
+gchar **
+gst_rtsp_url_decode_path_components (const GstRTSPUrl * url)
+{
+ gchar **ret;
+ guint i;
+
+ g_return_val_if_fail (url != NULL, NULL);
+ g_return_val_if_fail (url->abspath != NULL, NULL);
+
+ ret = g_strsplit (url->abspath, "/", -1);
+
+ for (i = 0; ret[i]; i++)
+ unescape_path_component (ret[i]);
+
+ return ret;
+}
diff --git a/gst-libs/gst/rtsp/gstrtspurl.h b/gst-libs/gst/rtsp/gstrtspurl.h
new file mode 100644
index 0000000..b34ee87
--- /dev/null
+++ b/gst-libs/gst/rtsp/gstrtspurl.h
@@ -0,0 +1,103 @@
+/* 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_RTSP_URL_H__
+#define __GST_RTSP_URL_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gst/rtsp/gstrtspdefs.h>
+#include <gst/rtsp/gstrtsptransport.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_RTSP_DEFAULT_PORT:
+ *
+ * The default RTSP port to connect to.
+ */
+#define GST_RTSP_DEFAULT_PORT 554
+
+#define GST_TYPE_RTSP_URL (gst_rtsp_url_get_type())
+
+typedef struct _GstRTSPUrl GstRTSPUrl;
+
+/**
+ * GstRTSPUrl:
+ * @transports: the transports allowed
+ * @family: the family
+ * @user: the user
+ * @passwd: the password
+ * @host: the host
+ * @port: the port
+ * @abspath: the absolute path
+ * @query: additional query parameters
+ *
+ * This structure contains the result of a parsed RTSP URL
+ */
+struct _GstRTSPUrl {
+ GstRTSPLowerTrans transports;
+ GstRTSPFamily family;
+ gchar *user;
+ gchar *passwd;
+ gchar *host;
+ guint16 port;
+ gchar *abspath;
+ gchar *query;
+};
+
+GType gst_rtsp_url_get_type (void);
+
+GstRTSPResult gst_rtsp_url_parse (const gchar *urlstr, GstRTSPUrl **url);
+GstRTSPUrl* gst_rtsp_url_copy (const GstRTSPUrl *url);
+void gst_rtsp_url_free (GstRTSPUrl *url);
+gchar* gst_rtsp_url_get_request_uri (const GstRTSPUrl *url);
+gchar** gst_rtsp_url_decode_path_components
+ (const GstRTSPUrl *url);
+
+GstRTSPResult gst_rtsp_url_set_port (GstRTSPUrl *url, guint16 port);
+GstRTSPResult gst_rtsp_url_get_port (const GstRTSPUrl *url, guint16 *port);
+
+G_END_DECLS
+
+#endif /* __GST_RTSP_URL_H__ */
diff --git a/gst-libs/gst/sdp/Makefile.am b/gst-libs/gst/sdp/Makefile.am
new file mode 100644
index 0000000..200b11b
--- /dev/null
+++ b/gst-libs/gst/sdp/Makefile.am
@@ -0,0 +1,72 @@
+libgstsdpincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/sdp
+
+libgstsdpinclude_HEADERS = gstsdp.h \
+ gstsdpmessage.h
+
+lib_LTLIBRARIES = libgstsdp-@GST_MAJORMINOR@.la
+
+libgstsdp_@GST_MAJORMINOR@_la_SOURCES = gstsdpmessage.c
+
+libgstsdp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstsdp_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(WIN32_LIBS)
+libgstsdp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstSdp-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstsdpinclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/sdp/%',$(libgstsdpinclude_HEADERS))
+
+GstSdp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstsdp-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstSdp \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --library=libgstsdp-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-sdp-@GST_MAJORMINOR@ \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstsdp -:SHARED libgstsdp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsdp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstsdp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstsdp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/sdp \
+ -:HEADERS $(libgstsdpinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/sdp/Makefile.in b/gst-libs/gst/sdp/Makefile.in
new file mode 100644
index 0000000..dbff64c
--- /dev/null
+++ b/gst-libs/gst/sdp/Makefile.in
@@ -0,0 +1,881 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libs/gst/sdp
+DIST_COMMON = $(libgstsdpinclude_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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstsdpincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstsdp_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstsdp_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo
+libgstsdp_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstsdp_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstsdp_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstsdp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstsdp_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstsdpinclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+libgstsdpincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/sdp
+libgstsdpinclude_HEADERS = gstsdp.h \
+ gstsdpmessage.h
+
+lib_LTLIBRARIES = libgstsdp-@GST_MAJORMINOR@.la
+libgstsdp_@GST_MAJORMINOR@_la_SOURCES = gstsdpmessage.c
+libgstsdp_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstsdp_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(WIN32_LIBS)
+libgstsdp_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstSdp-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstsdpinclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/sdp/%',$(libgstsdpinclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_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-libs/gst/sdp/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/sdp/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstsdp-@GST_MAJORMINOR@.la: $(libgstsdp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstsdp_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstsdp_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstsdp_@GST_MAJORMINOR@_la_OBJECTS) $(libgstsdp_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo: gstsdpmessage.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) $(libgstsdp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo -MD -MP -MF $(DEPDIR)/libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.Tpo -c -o libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo `test -f 'gstsdpmessage.c' || echo '$(srcdir)/'`gstsdpmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.Tpo $(DEPDIR)/libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsdpmessage.c' object='libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsdp_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstsdp_@GST_MAJORMINOR@_la-gstsdpmessage.lo `test -f 'gstsdpmessage.c' || echo '$(srcdir)/'`gstsdpmessage.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstsdpincludeHEADERS: $(libgstsdpinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstsdpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstsdpincludedir)"
+ @list='$(libgstsdpinclude_HEADERS)'; test -n "$(libgstsdpincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstsdpincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstsdpincludedir)" || exit $$?; \
+ done
+
+uninstall-libgstsdpincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstsdpinclude_HEADERS)'; test -n "$(libgstsdpincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstsdpincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstsdpincludedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstsdpincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA install-libgstsdpincludeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstsdpincludeHEADERS uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgstsdpincludeHEADERS \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES uninstall-libgstsdpincludeHEADERS \
+ uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstSdp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstsdp-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstSdp \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstsdp-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-sdp-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstsdp -:SHARED libgstsdp-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstsdp_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsdp_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstsdp_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstsdp_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/sdp \
+ -:HEADERS $(libgstsdpinclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/sdp/gstsdp.h b/gst-libs/gst/sdp/gstsdp.h
new file mode 100644
index 0000000..3dbd86d
--- /dev/null
+++ b/gst-libs/gst/sdp/gstsdp.h
@@ -0,0 +1,58 @@
+/* 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_SDP_H__
+#define __GST_SDP_H__
+
+/**
+ * GstSDPResult:
+ * @GST_SDP_OK: A successful return value
+ * @GST_SDP_EINVAL: a function was given invalid parameters
+ *
+ * Return values for the SDP functions.
+ */
+typedef enum {
+ GST_SDP_OK = 0,
+ GST_SDP_EINVAL = -1
+} GstSDPResult;
+
+#endif /* __GST_SDP_H__ */
diff --git a/gst-libs/gst/sdp/gstsdpmessage.c b/gst-libs/gst/sdp/gstsdpmessage.c
new file mode 100644
index 0000000..cd95c7c
--- /dev/null
+++ b/gst-libs/gst/sdp/gstsdpmessage.c
@@ -0,0 +1,2241 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstsdpmessage
+ * @short_description: Helper methods for dealing with SDP messages
+ *
+ * <refsect2>
+ * <para>
+ * The GstSDPMessage helper functions makes it easy to parse and create SDP
+ * messages.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2007-07-24 (0.10.14)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <glib.h> /* for G_OS_WIN32 */
+#include <gst/gstinfo.h> /* For GST_STR_NULL */
+
+#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
+#ifdef _MSC_VER
+#include <Winsock2.h>
+#endif
+#include <ws2tcpip.h>
+#else
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#endif
+
+#include "gstsdpmessage.h"
+
+/* FIXME, is currently allocated on the stack */
+#define MAX_LINE_LEN 1024 * 16
+
+#define FREE_STRING(field) g_free (field); (field) = NULL
+#define REPLACE_STRING(field, val) FREE_STRING(field); (field) = g_strdup (val)
+
+#define INIT_ARRAY(field, type, init_func) \
+G_STMT_START { \
+ if (field) { \
+ guint i; \
+ for(i = 0; i < (field)->len; i++) \
+ init_func (&g_array_index ((field), type, i)); \
+ g_array_set_size ((field), 0); \
+ } \
+ else \
+ (field) = g_array_new (FALSE, TRUE, sizeof (type)); \
+} G_STMT_END
+
+#define FREE_ARRAY(field) \
+G_STMT_START { \
+ if (field) \
+ g_array_free ((field), TRUE); \
+ (field) = NULL; \
+} G_STMT_END
+
+#define INIT_PTR_ARRAY(field, type, init_func) \
+G_STMT_START { \
+ if (field) { \
+ guint i; \
+ for(i = 0; i < (field)->len; i++) \
+ init_func (g_array_index ((field), type, i)); \
+ g_array_set_size ((field), 0); \
+ } \
+ else \
+ (field) = g_array_new (FALSE, TRUE, sizeof (type)); \
+} G_STMT_END
+
+#define FREE_PTR_ARRAY(field) FREE_ARRAY(field)
+
+#define DEFINE_STRING_SETTER(field) \
+GstSDPResult gst_sdp_message_set_##field (GstSDPMessage *msg, const gchar *val) { \
+ g_free (msg->field); \
+ msg->field = g_strdup (val); \
+ return GST_SDP_OK; \
+}
+#define DEFINE_STRING_GETTER(field) \
+const gchar* gst_sdp_message_get_##field (const GstSDPMessage *msg) { \
+ return msg->field; \
+}
+
+#define DEFINE_ARRAY_LEN(field) \
+guint gst_sdp_message_##field##_len (const GstSDPMessage *msg) { \
+ return msg->field->len; \
+}
+#define DEFINE_ARRAY_GETTER(method, field, type) \
+type * gst_sdp_message_get_##method (const GstSDPMessage *msg, guint idx) { \
+ return &g_array_index (msg->field, type, idx); \
+}
+
+#define DEFINE_PTR_ARRAY_LEN(field) DEFINE_ARRAY_LEN(field)
+#define DEFINE_PTR_ARRAY_GETTER(method, field, type) \
+type gst_sdp_message_get_##method (const GstSDPMessage *msg, guint idx) { \
+ return g_array_index (msg->field, type, idx); \
+}
+#define DEFINE_PTR_ARRAY_ADDER(method, field, type, dup_method) \
+GstSDPResult gst_sdp_message_add_##method (GstSDPMessage *msg, type val) { \
+ type v = dup_method (val); \
+ g_array_append_val (msg->field, v); \
+ return GST_SDP_OK; \
+}
+
+static void
+gst_sdp_origin_init (GstSDPOrigin * origin)
+{
+ FREE_STRING (origin->username);
+ FREE_STRING (origin->sess_id);
+ FREE_STRING (origin->sess_version);
+ FREE_STRING (origin->nettype);
+ FREE_STRING (origin->addrtype);
+ FREE_STRING (origin->addr);
+}
+
+static void
+gst_sdp_connection_init (GstSDPConnection * connection)
+{
+ FREE_STRING (connection->nettype);
+ FREE_STRING (connection->addrtype);
+ FREE_STRING (connection->address);
+ connection->ttl = 0;
+ connection->addr_number = 0;
+}
+
+static void
+gst_sdp_bandwidth_init (GstSDPBandwidth * bandwidth)
+{
+ FREE_STRING (bandwidth->bwtype);
+ bandwidth->bandwidth = 0;
+}
+
+static void
+gst_sdp_time_init (GstSDPTime * t)
+{
+ FREE_STRING (t->start);
+ FREE_STRING (t->stop);
+ INIT_PTR_ARRAY (t->repeat, gchar *, g_free);
+ FREE_PTR_ARRAY (t->repeat);
+}
+
+static void
+gst_sdp_zone_init (GstSDPZone * zone)
+{
+ FREE_STRING (zone->time);
+ FREE_STRING (zone->typed_time);
+}
+
+static void
+gst_sdp_key_init (GstSDPKey * key)
+{
+ FREE_STRING (key->type);
+ FREE_STRING (key->data);
+}
+
+static void
+gst_sdp_attribute_init (GstSDPAttribute * attr)
+{
+ FREE_STRING (attr->key);
+ FREE_STRING (attr->value);
+}
+
+/**
+ * gst_sdp_message_new:
+ * @msg: pointer to new #GstSDPMessage
+ *
+ * Allocate a new GstSDPMessage and store the result in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_new (GstSDPMessage ** msg)
+{
+ GstSDPMessage *newmsg;
+
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ newmsg = g_new0 (GstSDPMessage, 1);
+
+ *msg = newmsg;
+
+ return gst_sdp_message_init (newmsg);
+}
+
+/**
+ * gst_sdp_message_init:
+ * @msg: a #GstSDPMessage
+ *
+ * Initialize @msg so that its contents are as if it was freshly allocated
+ * with gst_sdp_message_new(). This function is mostly used to initialize a message
+ * allocated on the stack. gst_sdp_message_uninit() undoes this operation.
+ *
+ * When this function is invoked on newly allocated data (with malloc or on the
+ * stack), its contents should be set to 0 before calling this function.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_init (GstSDPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ FREE_STRING (msg->version);
+ gst_sdp_origin_init (&msg->origin);
+ FREE_STRING (msg->session_name);
+ FREE_STRING (msg->information);
+ FREE_STRING (msg->uri);
+ INIT_PTR_ARRAY (msg->emails, gchar *, g_free);
+ INIT_PTR_ARRAY (msg->phones, gchar *, g_free);
+ gst_sdp_connection_init (&msg->connection);
+ INIT_ARRAY (msg->bandwidths, GstSDPBandwidth, gst_sdp_bandwidth_init);
+ INIT_ARRAY (msg->times, GstSDPTime, gst_sdp_time_init);
+ INIT_ARRAY (msg->zones, GstSDPZone, gst_sdp_zone_init);
+ gst_sdp_key_init (&msg->key);
+ INIT_ARRAY (msg->attributes, GstSDPAttribute, gst_sdp_attribute_init);
+ INIT_ARRAY (msg->medias, GstSDPMedia, gst_sdp_media_uninit);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_uninit:
+ * @msg: a #GstSDPMessage
+ *
+ * Free all resources allocated in @msg. @msg should not be used anymore after
+ * this function. This function should be used when @msg was allocated on the
+ * stack and initialized with gst_sdp_message_init().
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_uninit (GstSDPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ gst_sdp_message_init (msg);
+
+ FREE_PTR_ARRAY (msg->emails);
+ FREE_PTR_ARRAY (msg->phones);
+ FREE_ARRAY (msg->bandwidths);
+ FREE_ARRAY (msg->times);
+ FREE_ARRAY (msg->zones);
+ FREE_ARRAY (msg->attributes);
+ FREE_ARRAY (msg->medias);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_free:
+ * @msg: a #GstSDPMessage
+ *
+ * Free all resources allocated by @msg. @msg should not be used anymore after
+ * this function. This function should be used when @msg was dynamically
+ * allocated with gst_sdp_message_new().
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_free (GstSDPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ gst_sdp_message_uninit (msg);
+ g_free (msg);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_address_is_multicast:
+ * @nettype: a network type
+ * @addrtype: an address type
+ * @addr: an address
+ *
+ * Check if the given @addr is a multicast address.
+ *
+ * Returns: TRUE when @addr is multicast.
+ *
+ * Since: 0.10.32
+ */
+gboolean
+gst_sdp_address_is_multicast (const gchar * nettype, const gchar * addrtype,
+ const gchar * addr)
+{
+ struct addrinfo hints;
+ struct addrinfo *ai;
+ struct addrinfo *res;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (addr, FALSE);
+
+ /* we only support IN */
+ if (nettype && strcmp (nettype, "IN") != 0)
+ return FALSE;
+
+ memset (&hints, 0, sizeof (hints));
+ hints.ai_socktype = SOCK_DGRAM;
+
+ /* set the address type as a hint */
+ if (addrtype) {
+ if (!strcmp (addrtype, "IP4"))
+ hints.ai_family = AF_INET;
+ else if (!strcmp (addrtype, "IP6"))
+ hints.ai_family = AF_INET6;
+ }
+
+ if (getaddrinfo (addr, NULL, &hints, &res) < 0)
+ return FALSE;
+
+ for (ai = res; !ret && ai; ai = ai->ai_next) {
+ if (ai->ai_family == AF_INET)
+ ret =
+ IN_MULTICAST (ntohl (((struct sockaddr_in *) ai->ai_addr)->
+ sin_addr.s_addr));
+ else
+ ret =
+ IN6_IS_ADDR_MULTICAST (&((struct sockaddr_in6 *) ai->
+ ai_addr)->sin6_addr);
+ }
+
+ freeaddrinfo (res);
+
+ return ret;
+}
+
+/**
+ * gst_sdp_message_as_text:
+ * @msg: a #GstSDPMessage
+ *
+ * Convert the contents of @msg to a text string.
+ *
+ * Returns: A dynamically allocated string representing the SDP description.
+ */
+gchar *
+gst_sdp_message_as_text (const GstSDPMessage * msg)
+{
+ /* change all vars so they match rfc? */
+ GString *lines;
+ guint i;
+
+ g_return_val_if_fail (msg != NULL, NULL);
+
+ lines = g_string_new ("");
+
+ if (msg->version)
+ g_string_append_printf (lines, "v=%s\r\n", msg->version);
+
+ if (msg->origin.sess_id && msg->origin.sess_version && msg->origin.nettype &&
+ msg->origin.addrtype && msg->origin.addr)
+ g_string_append_printf (lines, "o=%s %s %s %s %s %s\r\n",
+ msg->origin.username ? msg->origin.username : "-", msg->origin.sess_id,
+ msg->origin.sess_version, msg->origin.nettype, msg->origin.addrtype,
+ msg->origin.addr);
+
+ if (msg->session_name)
+ g_string_append_printf (lines, "s=%s\r\n", msg->session_name);
+
+ if (msg->information)
+ g_string_append_printf (lines, "i=%s\r\n", msg->information);
+
+ if (msg->uri)
+ g_string_append_printf (lines, "u=%s\r\n", msg->uri);
+
+ for (i = 0; i < gst_sdp_message_emails_len (msg); i++)
+ g_string_append_printf (lines, "e=%s\r\n",
+ gst_sdp_message_get_email (msg, i));
+
+ for (i = 0; i < gst_sdp_message_phones_len (msg); i++)
+ g_string_append_printf (lines, "p=%s\r\n",
+ gst_sdp_message_get_phone (msg, i));
+
+ if (gst_sdp_message_emails_len (msg) == 0 &&
+ gst_sdp_message_phones_len (msg) == 0)
+ g_string_append_printf (lines, "e=NONE\r\n");
+
+ if (msg->connection.nettype && msg->connection.addrtype &&
+ msg->connection.address) {
+ g_string_append_printf (lines, "c=%s %s %s", msg->connection.nettype,
+ msg->connection.addrtype, msg->connection.address);
+ if (gst_sdp_address_is_multicast (msg->connection.nettype,
+ msg->connection.addrtype, msg->connection.address)) {
+ /* only add ttl for IP4 */
+ if (strcmp (msg->connection.addrtype, "IP4") == 0)
+ g_string_append_printf (lines, "/%u", msg->connection.ttl);
+ if (msg->connection.addr_number > 1)
+ g_string_append_printf (lines, "/%u", msg->connection.addr_number);
+ }
+ g_string_append_printf (lines, "\r\n");
+ }
+
+ for (i = 0; i < gst_sdp_message_bandwidths_len (msg); i++) {
+ const GstSDPBandwidth *bandwidth = gst_sdp_message_get_bandwidth (msg, i);
+
+ g_string_append_printf (lines, "b=%s:%u\r\n", bandwidth->bwtype,
+ bandwidth->bandwidth);
+ }
+
+ for (i = 0; i < gst_sdp_message_times_len (msg); i++) {
+ const GstSDPTime *times = gst_sdp_message_get_time (msg, i);
+
+ g_string_append_printf (lines, "t=%s %s\r\n", times->start, times->stop);
+
+ if (times->repeat != NULL) {
+ guint j;
+
+ g_string_append_printf (lines, "r=%s",
+ g_array_index (times->repeat, gchar *, 0));
+ for (j = 1; j < times->repeat->len; j++)
+ g_string_append_printf (lines, " %s",
+ g_array_index (times->repeat, gchar *, j));
+ g_string_append_printf (lines, "\r\n");
+ }
+ }
+
+ if (gst_sdp_message_zones_len (msg) > 0) {
+ const GstSDPZone *zone = gst_sdp_message_get_zone (msg, 0);
+
+ g_string_append_printf (lines, "z=%s %s", zone->time, zone->typed_time);
+ for (i = 1; i < gst_sdp_message_zones_len (msg); i++) {
+ zone = gst_sdp_message_get_zone (msg, i);
+ g_string_append_printf (lines, " %s %s", zone->time, zone->typed_time);
+ }
+ g_string_append_printf (lines, "\r\n");
+ }
+
+ if (msg->key.type) {
+ g_string_append_printf (lines, "k=%s", msg->key.type);
+ if (msg->key.data)
+ g_string_append_printf (lines, ":%s", msg->key.data);
+ g_string_append_printf (lines, "\r\n");
+ }
+
+ for (i = 0; i < gst_sdp_message_attributes_len (msg); i++) {
+ const GstSDPAttribute *attr = gst_sdp_message_get_attribute (msg, i);
+
+ if (attr->key) {
+ g_string_append_printf (lines, "a=%s", attr->key);
+ if (attr->value)
+ g_string_append_printf (lines, ":%s", attr->value);
+ g_string_append_printf (lines, "\r\n");
+ }
+ }
+
+ for (i = 0; i < gst_sdp_message_medias_len (msg); i++) {
+ const GstSDPMedia *media = gst_sdp_message_get_media (msg, i);
+ gchar *sdp_media_str;
+
+ sdp_media_str = gst_sdp_media_as_text (media);
+ g_string_append_printf (lines, "%s", sdp_media_str);
+ g_free (sdp_media_str);
+ }
+
+ return g_string_free (lines, FALSE);
+}
+
+static int
+hex_to_int (gchar c)
+{
+ return c >= '0' && c <= '9' ? c - '0'
+ : c >= 'A' && c <= 'F' ? c - 'A' + 10
+ : c >= 'a' && c <= 'f' ? c - 'a' + 10 : 0;
+}
+
+/**
+ * gst_sdp_message_parse_uri:
+ * @uri: the start of the uri
+ * @msg: the result #GstSDPMessage
+ *
+ * Parse the null-terminated @uri and store the result in @msg.
+ *
+ * The uri should be of the form:
+ *
+ * scheme://[address[:ttl=ttl][:noa=noa]]/[sessionname]
+ * [#type=value *[&type=value]]
+ *
+ * where value is url encoded. This looslely resembles
+ * http://tools.ietf.org/html/draft-fujikawa-sdp-url-01
+ *
+ * Returns: #GST_SDP_OK on success.
+ *
+ * Since: 0.10.31
+ */
+GstSDPResult
+gst_sdp_message_parse_uri (const gchar * uri, GstSDPMessage * msg)
+{
+ GstSDPResult res;
+ gchar *message;
+ const gchar *colon, *slash, *hash, *p;
+ GString *lines;
+
+ g_return_val_if_fail (uri != NULL, GST_SDP_EINVAL);
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ colon = strstr (uri, "://");
+ if (!colon)
+ goto no_colon;
+
+ /* FIXME connection info goes here */
+
+ slash = strstr (colon + 3, "/");
+ if (!slash)
+ goto no_slash;
+
+ /* FIXME session name goes here */
+
+ hash = strstr (slash + 1, "#");
+ if (!hash)
+ goto no_hash;
+
+ lines = g_string_new ("");
+
+ /* unescape */
+ for (p = hash + 1; *p; p++) {
+ if (*p == '&')
+ g_string_append_printf (lines, "\r\n");
+ else if (*p == '+')
+ g_string_append_c (lines, ' ');
+ else if (*p == '%') {
+ gchar a, b;
+
+ if ((a = p[1])) {
+ if ((b = p[2])) {
+ g_string_append_c (lines, (hex_to_int (a) << 4) | hex_to_int (b));
+ p += 2;
+ }
+ } else {
+ p++;
+ }
+ } else
+ g_string_append_c (lines, *p);
+ }
+
+ message = g_string_free (lines, FALSE);
+ res =
+ gst_sdp_message_parse_buffer ((const guint8 *) message, strlen (message),
+ msg);
+ g_free (message);
+
+ return res;
+
+ /* ERRORS */
+no_colon:
+ {
+ return GST_SDP_EINVAL;
+ }
+no_slash:
+ {
+ return GST_SDP_EINVAL;
+ }
+no_hash:
+ {
+ return GST_SDP_EINVAL;
+ }
+}
+
+static const guchar acceptable[96] = {
+ /* X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, /* 2X !"#$%&'()*+,-./ */
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 3X 0123456789:;<=>? */
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* 4X @ABCDEFGHIJKLMNO */
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, /* 5X PQRSTUVWXYZ[\]^_ */
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* 6X `abcdefghijklmno */
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 /* 7X pqrstuvwxyz{|}~DEL */
+};
+
+static const gchar hex[16] = "0123456789ABCDEF";
+
+#define ACCEPTABLE_CHAR(a) (((guchar)(a))>=32 && ((guchar)(a))<128 && acceptable[(((guchar)a))-32])
+
+/**
+ * gst_sdp_message_as_uri:
+ * @scheme: the uri scheme
+ * @msg: the #GstSDPMessage
+ *
+ * Creates a uri from @msg with the given @scheme. The uri has the format:
+ *
+ * @scheme:///[#type=value *[&type=value]]
+ *
+ * Where each value is url encoded.
+ *
+ * Returns: a uri for @msg.
+ *
+ * Since: 0.10.31
+ */
+gchar *
+gst_sdp_message_as_uri (const gchar * scheme, const GstSDPMessage * msg)
+{
+ gchar *serialized, *p;
+ gchar *res;
+ GString *lines;
+ gboolean first;
+
+ g_return_val_if_fail (scheme != NULL, NULL);
+ g_return_val_if_fail (msg != NULL, NULL);
+
+ p = serialized = gst_sdp_message_as_text (msg);
+
+ lines = g_string_new ("");
+ g_string_append_printf (lines, "%s:///#", scheme);
+
+ /* now escape */
+ first = TRUE;
+ for (p = serialized; *p; p++) {
+ if (first) {
+ g_string_append_printf (lines, "%c=", *p);
+ if (*(p + 1))
+ p++;
+ first = FALSE;
+ continue;
+ }
+ if (*p == '\r')
+ continue;
+ else if (*p == '\n') {
+ if (*(p + 1))
+ g_string_append_c (lines, '&');
+ first = TRUE;
+ } else if (*p == ' ')
+ g_string_append_c (lines, '+');
+ else if (ACCEPTABLE_CHAR (*p))
+ g_string_append_c (lines, *p);
+ else {
+ /* escape */
+ g_string_append_printf (lines, "%%%c%c", hex[*p >> 4], hex[*p & 0xf]);
+ }
+ }
+
+ res = g_string_free (lines, FALSE);
+ g_free (serialized);
+
+ return res;
+}
+
+/**
+ * gst_sdp_message_set_version:
+ * @msg: a #GstSDPMessage
+ * @version: the version
+ *
+ * Set the version in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_SETTER (version);
+/**
+ * gst_sdp_message_get_version:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the version in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_GETTER (version);
+
+/**
+ * gst_sdp_message_set_origin:
+ * @msg: a #GstSDPMessage
+ * @username: the user name
+ * @sess_id: a session id
+ * @sess_version: a session version
+ * @nettype: a network type
+ * @addrtype: an address type
+ * @addr: an address
+ *
+ * Configure the SDP origin in @msg with the given parameters.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_message_set_origin (GstSDPMessage * msg, const gchar * username,
+ const gchar * sess_id, const gchar * sess_version, const gchar * nettype,
+ const gchar * addrtype, const gchar * addr)
+{
+ REPLACE_STRING (msg->origin.username, username);
+ REPLACE_STRING (msg->origin.sess_id, sess_id);
+ REPLACE_STRING (msg->origin.sess_version, sess_version);
+ REPLACE_STRING (msg->origin.nettype, nettype);
+ REPLACE_STRING (msg->origin.addrtype, addrtype);
+ REPLACE_STRING (msg->origin.addr, addr);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_get_origin:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the origin of @msg.
+ *
+ * Returns: a #GstSDPOrigin. The result remains valid as long as @msg is valid.
+ */
+const GstSDPOrigin *
+gst_sdp_message_get_origin (const GstSDPMessage * msg)
+{
+ return &msg->origin;
+}
+
+/**
+ * gst_sdp_message_set_session_name:
+ * @msg: a #GstSDPMessage
+ * @session_name: the session name
+ *
+ * Set the session name in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_SETTER (session_name);
+/**
+ * gst_sdp_message_get_session_name:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the session name in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_GETTER (session_name);
+/**
+ * gst_sdp_message_set_information:
+ * @msg: a #GstSDPMessage
+ * @information: the information
+ *
+ * Set the information in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_SETTER (information);
+/**
+ * gst_sdp_message_get_information:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the information in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_GETTER (information);
+/**
+ * gst_sdp_message_set_uri:
+ * @msg: a #GstSDPMessage
+ * @uri: the URI
+ *
+ * Set the URI in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_SETTER (uri);
+/**
+ * gst_sdp_message_get_uri:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the URI in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_STRING_GETTER (uri);
+
+/**
+ * gst_sdp_message_emails_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of emails in @msg.
+ *
+ * Returns: the number of emails in @msg.
+ */
+DEFINE_ARRAY_LEN (emails);
+/**
+ * gst_sdp_message_get_email:
+ * @msg: a #GstSDPMessage
+ * @idx: an email index
+ *
+ * Get the email with number @idx from @msg.
+ *
+ * Returns: the email at position @idx.
+ */
+DEFINE_PTR_ARRAY_GETTER (email, emails, const gchar *);
+
+/**
+ * gst_sdp_message_add_email:
+ * @msg: a #GstSDPMessage
+ * @email: an email
+ *
+ * Add @email to the list of emails in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_PTR_ARRAY_ADDER (email, emails, const gchar *, g_strdup);
+
+/**
+ * gst_sdp_message_phones_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of phones in @msg.
+ *
+ * Returns: the number of phones in @msg.
+ */
+DEFINE_ARRAY_LEN (phones);
+/**
+ * gst_sdp_message_get_phone:
+ * @msg: a #GstSDPMessage
+ * @idx: a phone index
+ *
+ * Get the phone with number @idx from @msg.
+ *
+ * Returns: the phone at position @idx.
+ */
+DEFINE_PTR_ARRAY_GETTER (phone, phones, const gchar *);
+
+/**
+ * gst_sdp_message_add_phone:
+ * @msg: a #GstSDPMessage
+ * @phone: a phone
+ *
+ * Add @phone to the list of phones in @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+DEFINE_PTR_ARRAY_ADDER (phone, phones, const gchar *, g_strdup);
+
+/**
+ * gst_sdp_message_set_connection:
+ * @msg: a #GstSDPMessage
+ * @nettype: the type of network. "IN" is defined to have the meaning
+ * "Internet".
+ * @addrtype: the type of address.
+ * @address: the address
+ * @ttl: the time to live of the address
+ * @addr_number: the number of layers
+ *
+ * Configure the SDP connection in @msg with the given parameters.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_set_connection (GstSDPMessage * msg, const gchar * nettype,
+ const gchar * addrtype, const gchar * address, guint ttl, guint addr_number)
+{
+ REPLACE_STRING (msg->connection.nettype, nettype);
+ REPLACE_STRING (msg->connection.addrtype, addrtype);
+ REPLACE_STRING (msg->connection.address, address);
+ msg->connection.ttl = ttl;
+ msg->connection.addr_number = addr_number;
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_get_connection:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the connection of @msg.
+ *
+ * Returns: a #GstSDPConnection. The result remains valid as long as @msg is valid.
+ */
+const GstSDPConnection *
+gst_sdp_message_get_connection (const GstSDPMessage * msg)
+{
+ return &msg->connection;
+}
+
+/**
+ * gst_sdp_message_bandwidths_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of bandwidth information in @msg.
+ *
+ * Returns: the number of bandwidth information in @msg.
+ */
+DEFINE_ARRAY_LEN (bandwidths);
+/**
+ * gst_sdp_message_get_bandwidth:
+ * @msg: a #GstSDPMessage
+ * @idx: the bandwidth index
+ *
+ * Get the bandwidth at index @idx from @msg.
+ *
+ * Returns: a #GstSDPBandwidth.
+ */
+DEFINE_ARRAY_GETTER (bandwidth, bandwidths, const GstSDPBandwidth);
+
+/**
+ * gst_sdp_message_add_bandwidth:
+ * @msg: a #GstSDPMessage
+ * @bwtype: the bandwidth modifier type
+ * @bandwidth: the bandwidth in kilobits per second
+ *
+ * Add the specified bandwidth information to @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+
+GstSDPResult
+gst_sdp_message_add_bandwidth (GstSDPMessage * msg, const gchar * bwtype,
+ guint bandwidth)
+{
+ GstSDPBandwidth bw;
+
+ bw.bwtype = g_strdup (bwtype);
+ bw.bandwidth = bandwidth;
+
+ g_array_append_val (msg->bandwidths, bw);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_times_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of time information entries in @msg.
+ *
+ * Returns: the number of time information entries in @msg.
+ */
+DEFINE_ARRAY_LEN (times);
+
+/**
+ * gst_sdp_message_get_time:
+ * @msg: a #GstSDPMessage
+ * @idx: the time index
+ *
+ * Get time information with index @idx from @msg.
+ *
+ * Returns: a #GstSDPTime.
+ */
+DEFINE_ARRAY_GETTER (time, times, const GstSDPTime);
+
+/**
+ * gst_sdp_message_add_time:
+ * @msg: a #GstSDPMessage
+ * @start: the start time
+ * @stop: the stop time
+ * @repeat: the repeat times
+ *
+ * Add time information @start and @stop to @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_add_time (GstSDPMessage * msg, const gchar * start,
+ const gchar * stop, const gchar ** repeat)
+{
+ GstSDPTime times;
+
+ times.start = g_strdup (start);
+ times.stop = g_strdup (stop);
+ if (repeat) {
+ times.repeat = g_array_new (FALSE, TRUE, sizeof (gchar *));
+ for (; *repeat; repeat++) {
+ gchar *r = g_strdup (*repeat);
+
+ g_array_append_val (times.repeat, r);
+ }
+ } else
+ times.repeat = NULL;
+ g_array_append_val (msg->times, times);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_zones_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of time zone information entries in @msg.
+ *
+ * Returns: the number of time zone information entries in @msg.
+ */
+DEFINE_ARRAY_LEN (zones);
+/**
+ * gst_sdp_message_get_zone:
+ * @msg: a #GstSDPMessage
+ * @idx: the zone index
+ *
+ * Get time zone information with index @idx from @msg.
+ *
+ * Returns: a #GstSDPZone.
+ */
+DEFINE_ARRAY_GETTER (zone, zones, const GstSDPZone);
+
+/**
+ * gst_sdp_message_add_zone:
+ * @msg: a #GstSDPMessage
+ * @adj_time: the NTP time that a time zone adjustment happens
+ * @typed_time: the offset from the time when the session was first scheduled
+ *
+ * Add time zone information to @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_add_zone (GstSDPMessage * msg, const gchar * adj_time,
+ const gchar * typed_time)
+{
+ GstSDPZone zone;
+
+ zone.time = g_strdup (adj_time);
+ zone.typed_time = g_strdup (typed_time);
+
+ g_array_append_val (msg->zones, zone);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_set_key:
+ * @msg: a #GstSDPMessage
+ * @type: the encryption type
+ * @data: the encryption data
+ *
+ * Adds the encryption information to @msg.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_set_key (GstSDPMessage * msg, const gchar * type,
+ const gchar * data)
+{
+ REPLACE_STRING (msg->key.type, type);
+ REPLACE_STRING (msg->key.data, data);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_get_key:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the encryption information from @msg.
+ *
+ * Returns: a #GstSDPKey.
+ */
+const GstSDPKey *
+gst_sdp_message_get_key (const GstSDPMessage * msg)
+{
+ return &msg->key;
+}
+
+/**
+ * gst_sdp_message_attributes_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of attributes in @msg.
+ *
+ * Returns: the number of attributes in @msg.
+ */
+DEFINE_ARRAY_LEN (attributes);
+
+/**
+ * gst_sdp_message_get_attribute:
+ * @msg: a #GstSDPMessage
+ * @idx: the index
+ *
+ * Get the attribute at position @idx in @msg.
+ *
+ * Returns: the #GstSDPAttribute at position @idx.
+ */
+DEFINE_ARRAY_GETTER (attribute, attributes, const GstSDPAttribute);
+
+/**
+ * gst_sdp_message_get_attribute_val_n:
+ * @msg: a #GstSDPMessage
+ * @key: the key
+ * @nth: the index
+ *
+ * Get the @nth attribute with key @key in @msg.
+ *
+ * Returns: the attribute value of the @nth attribute with @key.
+ */
+const gchar *
+gst_sdp_message_get_attribute_val_n (const GstSDPMessage * msg,
+ const gchar * key, guint nth)
+{
+ guint i;
+
+ for (i = 0; i < msg->attributes->len; i++) {
+ GstSDPAttribute *attr;
+
+ attr = &g_array_index (msg->attributes, GstSDPAttribute, i);
+ if (!strcmp (attr->key, key)) {
+ if (nth == 0)
+ return attr->value;
+ else
+ nth--;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * gst_sdp_message_get_attribute_val:
+ * @msg: a #GstSDPMessage
+ * @key: the key
+ *
+ * Get the first attribute with key @key in @msg.
+ *
+ * Returns: the attribute value of the first attribute with @key.
+ */
+const gchar *
+gst_sdp_message_get_attribute_val (const GstSDPMessage * msg, const gchar * key)
+{
+ return gst_sdp_message_get_attribute_val_n (msg, key, 0);
+}
+
+/**
+ * gst_sdp_message_add_attribute:
+ * @msg: a #GstSDPMessage
+ * @key: the key
+ * @value: the value
+ *
+ * Add the attribute with @key and @value to @msg.
+ *
+ * Returns: @GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_message_add_attribute (GstSDPMessage * msg, const gchar * key,
+ const gchar * value)
+{
+ GstSDPAttribute attr;
+
+ attr.key = g_strdup (key);
+ attr.value = g_strdup (value);
+
+ g_array_append_val (msg->attributes, attr);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_message_medias_len:
+ * @msg: a #GstSDPMessage
+ *
+ * Get the number of media descriptions in @msg.
+ *
+ * Returns: the number of media descriptions in @msg.
+ */
+DEFINE_ARRAY_LEN (medias);
+/**
+ * gst_sdp_message_get_media:
+ * @msg: a #GstSDPMessage
+ * @idx: the index
+ *
+ * Get the media description at index @idx in @msg.
+ *
+ * Returns: a #GstSDPMedia.
+ */
+DEFINE_ARRAY_GETTER (media, medias, const GstSDPMedia);
+
+/**
+ * gst_sdp_message_add_media:
+ * @msg: a #GstSDPMessage
+ * @media: a #GstSDPMedia to add
+ *
+ * Adds @media to the array of medias in @msg. This function takes ownership of
+ * the contents of @media so that @media will have to be reinitialized with
+ * gst_sdp_media_init() before it can be used again.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_add_media (GstSDPMessage * msg, GstSDPMedia * media)
+{
+ guint len;
+ GstSDPMedia *nmedia;
+
+ len = msg->medias->len;
+ g_array_set_size (msg->medias, len + 1);
+ nmedia = &g_array_index (msg->medias, GstSDPMedia, len);
+
+ memcpy (nmedia, media, sizeof (GstSDPMedia));
+ memset (media, 0, sizeof (GstSDPMedia));
+
+ return GST_SDP_OK;
+}
+
+/* media access */
+
+/**
+ * gst_sdp_media_new:
+ * @media: pointer to new #GstSDPMedia
+ *
+ * Allocate a new GstSDPMedia and store the result in @media.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_new (GstSDPMedia ** media)
+{
+ GstSDPMedia *newmedia;
+
+ g_return_val_if_fail (media != NULL, GST_SDP_EINVAL);
+
+ newmedia = g_new0 (GstSDPMedia, 1);
+
+ *media = newmedia;
+
+ return gst_sdp_media_init (newmedia);
+}
+
+/**
+ * gst_sdp_media_init:
+ * @media: a #GstSDPMedia
+ *
+ * Initialize @media so that its contents are as if it was freshly allocated
+ * with gst_sdp_media_new(). This function is mostly used to initialize a media
+ * allocated on the stack. gst_sdp_media_uninit() undoes this operation.
+ *
+ * When this function is invoked on newly allocated data (with malloc or on the
+ * stack), its contents should be set to 0 before calling this function.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_init (GstSDPMedia * media)
+{
+ g_return_val_if_fail (media != NULL, GST_SDP_EINVAL);
+
+ FREE_STRING (media->media);
+ media->port = 0;
+ media->num_ports = 0;
+ FREE_STRING (media->proto);
+ INIT_PTR_ARRAY (media->fmts, gchar *, g_free);
+ FREE_STRING (media->information);
+ INIT_ARRAY (media->connections, GstSDPConnection, gst_sdp_connection_init);
+ INIT_ARRAY (media->bandwidths, GstSDPBandwidth, gst_sdp_bandwidth_init);
+ gst_sdp_key_init (&media->key);
+ INIT_ARRAY (media->attributes, GstSDPAttribute, gst_sdp_attribute_init);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_uninit:
+ * @media: a #GstSDPMedia
+ *
+ * Free all resources allocated in @media. @media should not be used anymore after
+ * this function. This function should be used when @media was allocated on the
+ * stack and initialized with gst_sdp_media_init().
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_uninit (GstSDPMedia * media)
+{
+ g_return_val_if_fail (media != NULL, GST_SDP_EINVAL);
+
+ gst_sdp_media_init (media);
+ FREE_PTR_ARRAY (media->fmts);
+ FREE_ARRAY (media->connections);
+ FREE_ARRAY (media->bandwidths);
+ FREE_ARRAY (media->attributes);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_free:
+ * @media: a #GstSDPMedia
+ *
+ * Free all resources allocated by @media. @media should not be used anymore after
+ * this function. This function should be used when @media was dynamically
+ * allocated with gst_sdp_media_new().
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_free (GstSDPMedia * media)
+{
+ g_return_val_if_fail (media != NULL, GST_SDP_EINVAL);
+
+ gst_sdp_media_uninit (media);
+ g_free (media);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_as_text:
+ * @media: a #GstSDPMedia
+ *
+ * Convert the contents of @media to a text string.
+ *
+ * Returns: A dynamically allocated string representing the media.
+ */
+gchar *
+gst_sdp_media_as_text (const GstSDPMedia * media)
+{
+ GString *lines;
+ guint i;
+
+ g_return_val_if_fail (media != NULL, NULL);
+
+ lines = g_string_new ("");
+
+ if (media->media)
+ g_string_append_printf (lines, "m=%s", media->media);
+
+ g_string_append_printf (lines, " %u", media->port);
+
+ if (media->num_ports > 1)
+ g_string_append_printf (lines, "/%u", media->num_ports);
+
+ g_string_append_printf (lines, " %s", media->proto);
+
+ for (i = 0; i < gst_sdp_media_formats_len (media); i++)
+ g_string_append_printf (lines, " %s", gst_sdp_media_get_format (media, i));
+ g_string_append_printf (lines, "\r\n");
+
+ if (media->information)
+ g_string_append_printf (lines, "i=%s", media->information);
+
+ for (i = 0; i < gst_sdp_media_connections_len (media); i++) {
+ const GstSDPConnection *conn = gst_sdp_media_get_connection (media, i);
+
+ if (conn->nettype && conn->addrtype && conn->address) {
+ g_string_append_printf (lines, "c=%s %s %s", conn->nettype,
+ conn->addrtype, conn->address);
+ if (gst_sdp_address_is_multicast (conn->nettype, conn->addrtype,
+ conn->address)) {
+ /* only add TTL for IP4 multicast */
+ if (strcmp (conn->addrtype, "IP4") == 0)
+ g_string_append_printf (lines, "/%u", conn->ttl);
+ if (conn->addr_number > 1)
+ g_string_append_printf (lines, "/%u", conn->addr_number);
+ }
+ g_string_append_printf (lines, "\r\n");
+ }
+ }
+
+ for (i = 0; i < gst_sdp_media_bandwidths_len (media); i++) {
+ const GstSDPBandwidth *bandwidth = gst_sdp_media_get_bandwidth (media, i);
+
+ g_string_append_printf (lines, "b=%s:%u\r\n", bandwidth->bwtype,
+ bandwidth->bandwidth);
+ }
+
+ if (media->key.type) {
+ g_string_append_printf (lines, "k=%s", media->key.type);
+ if (media->key.data)
+ g_string_append_printf (lines, ":%s", media->key.data);
+ g_string_append_printf (lines, "\r\n");
+ }
+
+ for (i = 0; i < gst_sdp_media_attributes_len (media); i++) {
+ const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i);
+
+ if (attr->key) {
+ g_string_append_printf (lines, "a=%s", attr->key);
+ if (attr->value)
+ g_string_append_printf (lines, ":%s", attr->value);
+ g_string_append_printf (lines, "\r\n");
+ }
+ }
+
+ return g_string_free (lines, FALSE);
+}
+
+/**
+ * gst_sdp_media_get_media:
+ * @media: a #GstSDPMedia
+ *
+ * Get the media description of @media.
+ *
+ * Returns: the media description.
+ */
+const gchar *
+gst_sdp_media_get_media (const GstSDPMedia * media)
+{
+ return media->media;
+}
+
+/**
+ * gst_sdp_media_set_media:
+ * @media: a #GstSDPMedia
+ * @med: the media description
+ *
+ * Set the media description of @media to @med.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_set_media (GstSDPMedia * media, const gchar * med)
+{
+ g_free (media->media);
+ media->media = g_strdup (med);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_get_port:
+ * @media: a #GstSDPMedia
+ *
+ * Get the port number for @media.
+ *
+ * Returns: the port number of @media.
+ */
+guint
+gst_sdp_media_get_port (const GstSDPMedia * media)
+{
+ return media->port;
+}
+
+/**
+ * gst_sdp_media_get_num_ports:
+ * @media: a #GstSDPMedia
+ *
+ * Get the number of ports for @media.
+ *
+ * Returns: the number of ports for @media.
+ */
+guint
+gst_sdp_media_get_num_ports (const GstSDPMedia * media)
+{
+ return media->num_ports;
+}
+
+/**
+ * gst_sdp_media_set_port_info:
+ * @media: a #GstSDPMedia
+ * @port: the port number
+ * @num_ports: the number of ports
+ *
+ * Set the port information in @media.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_set_port_info (GstSDPMedia * media, guint port, guint num_ports)
+{
+ media->port = port;
+ media->num_ports = num_ports;
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_get_proto:
+ * @media: a #GstSDPMedia
+ *
+ * Get the transport protocol of @media
+ *
+ * Returns: the transport protocol of @media.
+ */
+const gchar *
+gst_sdp_media_get_proto (const GstSDPMedia * media)
+{
+ return media->proto;
+}
+
+/**
+ * gst_sdp_media_set_proto:
+ * @media: a #GstSDPMedia
+ * @proto: the media transport protocol
+ *
+ * Set the media transport protocol of @media to @proto.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_set_proto (GstSDPMedia * media, const gchar * proto)
+{
+ g_free (media->proto);
+ media->proto = g_strdup (proto);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_formats_len:
+ * @media: a #GstSDPMedia
+ *
+ * Get the number of formats in @media.
+ *
+ * Returns: the number of formats in @media.
+ */
+guint
+gst_sdp_media_formats_len (const GstSDPMedia * media)
+{
+ return media->fmts->len;
+}
+
+/**
+ * gst_sdp_media_get_format:
+ * @media: a #GstSDPMedia
+ * @idx: an index
+ *
+ * Get the format information at position @idx in @media.
+ *
+ * Returns: the format at position @idx.
+ */
+const gchar *
+gst_sdp_media_get_format (const GstSDPMedia * media, guint idx)
+{
+ if (idx >= media->fmts->len)
+ return NULL;
+ return g_array_index (media->fmts, gchar *, idx);
+}
+
+/**
+ * gst_sdp_media_add_format:
+ * @media: a #GstSDPMedia
+ * @format: the format
+ *
+ * Add the format information to @media.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_add_format (GstSDPMedia * media, const gchar * format)
+{
+ gchar *fmt;
+
+ fmt = g_strdup (format);
+
+ g_array_append_val (media->fmts, fmt);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_get_information:
+ * @media: a #GstSDPMedia
+ *
+ * Get the information of @media
+ *
+ * Returns: the information of @media.
+ */
+const gchar *
+gst_sdp_media_get_information (const GstSDPMedia * media)
+{
+ return media->information;
+}
+
+/**
+ * gst_sdp_media_set_information:
+ * @media: a #GstSDPMedia
+ * @information: the media information
+ *
+ * Set the media information of @media to @information.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_set_information (GstSDPMedia * media, const gchar * information)
+{
+ g_free (media->information);
+ media->information = g_strdup (information);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_connections_len:
+ * @media: a #GstSDPMedia
+ *
+ * Get the number of connection fields in @media.
+ *
+ * Returns: the number of connections in @media.
+ */
+guint
+gst_sdp_media_connections_len (const GstSDPMedia * media)
+{
+ return media->connections->len;
+}
+
+/**
+ * gst_sdp_media_get_connection:
+ * @media: a #GstSDPMedia
+ * @idx: an index
+ *
+ * Get the connection at position @idx in @media.
+ *
+ * Returns: the #GstSDPConnection at position @idx.
+ */
+const GstSDPConnection *
+gst_sdp_media_get_connection (const GstSDPMedia * media, guint idx)
+{
+ return &g_array_index (media->connections, GstSDPConnection, idx);
+}
+
+/**
+ * gst_sdp_media_add_connection:
+ * @media: a #GstSDPMedia
+ * @nettype: the type of network. "IN" is defined to have the meaning
+ * "Internet".
+ * @addrtype: the type of address.
+ * @address: the address
+ * @ttl: the time to live of the address
+ * @addr_number: the number of layers
+ *
+ * Add the given connection parameters to @media.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_add_connection (GstSDPMedia * media, const gchar * nettype,
+ const gchar * addrtype, const gchar * address, guint ttl, guint addr_number)
+{
+ GstSDPConnection conn;
+
+ conn.nettype = g_strdup (nettype);
+ conn.addrtype = g_strdup (addrtype);
+ conn.address = g_strdup (address);
+ conn.ttl = ttl;
+ conn.addr_number = addr_number;
+
+ g_array_append_val (media->connections, conn);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_bandwidths_len:
+ * @media: a #GstSDPMedia
+ *
+ * Get the number of bandwidth fields in @media.
+ *
+ * Returns: the number of bandwidths in @media.
+ */
+guint
+gst_sdp_media_bandwidths_len (const GstSDPMedia * media)
+{
+ return media->bandwidths->len;
+}
+
+/**
+ * gst_sdp_media_get_bandwidth:
+ * @media: a #GstSDPMedia
+ * @idx: an index
+ *
+ * Get the bandwidth at position @idx in @media.
+ *
+ * Returns: the #GstSDPBandwidth at position @idx.
+ */
+const GstSDPBandwidth *
+gst_sdp_media_get_bandwidth (const GstSDPMedia * media, guint idx)
+{
+ return &g_array_index (media->bandwidths, GstSDPBandwidth, idx);
+}
+
+/**
+ * gst_sdp_media_add_bandwidth:
+ * @media: a #GstSDPMedia
+ * @bwtype: the bandwidth modifier type
+ * @bandwidth: the bandwidth in kilobits per second
+ *
+ * Add the bandwidth information with @bwtype and @bandwidth to @media.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_add_bandwidth (GstSDPMedia * media, const gchar * bwtype,
+ guint bandwidth)
+{
+ GstSDPBandwidth bw;
+
+ bw.bwtype = g_strdup (bwtype);
+ bw.bandwidth = bandwidth;
+
+ g_array_append_val (media->bandwidths, bw);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_set_key:
+ * @media: a #GstSDPMedia
+ * @type: the encryption type
+ * @data: the encryption data
+ *
+ * Adds the encryption information to @media.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_media_set_key (GstSDPMedia * media, const gchar * type,
+ const gchar * data)
+{
+ g_free (media->key.type);
+ media->key.type = g_strdup (type);
+ g_free (media->key.data);
+ media->key.data = g_strdup (data);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_get_key:
+ * @media: a #GstSDPMedia
+ *
+ * Get the encryption information from @media.
+ *
+ * Returns: a #GstSDPKey.
+ */
+const GstSDPKey *
+gst_sdp_media_get_key (const GstSDPMedia * media)
+{
+ return &media->key;
+}
+
+/**
+ * gst_sdp_media_attributes_len:
+ * @media: a #GstSDPMedia
+ *
+ * Get the number of attribute fields in @media.
+ *
+ * Returns: the number of attributes in @media.
+ */
+guint
+gst_sdp_media_attributes_len (const GstSDPMedia * media)
+{
+ return media->attributes->len;
+}
+
+/**
+ * gst_sdp_media_add_attribute:
+ * @media: a #GstSDPMedia
+ * @key: a key
+ * @value: a value
+ *
+ * Add the attribute with @key and @value to @media.
+ *
+ * Returns: #GST_SDP_OK.
+ */
+GstSDPResult
+gst_sdp_media_add_attribute (GstSDPMedia * media, const gchar * key,
+ const gchar * value)
+{
+ GstSDPAttribute attr;
+
+ attr.key = g_strdup (key);
+ attr.value = g_strdup (value);
+
+ g_array_append_val (media->attributes, attr);
+
+ return GST_SDP_OK;
+}
+
+/**
+ * gst_sdp_media_get_attribute:
+ * @media: a #GstSDPMedia
+ * @idx: an index
+ *
+ * Get the attribute at position @idx in @media.
+ *
+ * Returns: the #GstSDPAttribute at position @idx.
+ */
+const GstSDPAttribute *
+gst_sdp_media_get_attribute (const GstSDPMedia * media, guint idx)
+{
+ return &g_array_index (media->attributes, GstSDPAttribute, idx);
+}
+
+/**
+ * gst_sdp_media_get_attribute_val_n:
+ * @media: a #GstSDPMedia
+ * @key: a key
+ * @nth: an index
+ *
+ * Get the @nth attribute value for @key in @media.
+ *
+ * Returns: the @nth attribute value.
+ */
+const gchar *
+gst_sdp_media_get_attribute_val_n (const GstSDPMedia * media, const gchar * key,
+ guint nth)
+{
+ guint i;
+
+ for (i = 0; i < media->attributes->len; i++) {
+ GstSDPAttribute *attr;
+
+ attr = &g_array_index (media->attributes, GstSDPAttribute, i);
+ if (!strcmp (attr->key, key)) {
+ if (nth == 0)
+ return attr->value;
+ else
+ nth--;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * gst_sdp_media_get_attribute_val:
+ * @media: a #GstSDPMedia
+ * @key: a key
+ *
+ * Get the first attribute value for @key in @media.
+ *
+ * Returns: the first attribute value for @key.
+ */
+const gchar *
+gst_sdp_media_get_attribute_val (const GstSDPMedia * media, const gchar * key)
+{
+ return gst_sdp_media_get_attribute_val_n (media, key, 0);
+}
+
+static void
+read_string (gchar * dest, guint size, gchar ** src)
+{
+ guint idx;
+
+ idx = 0;
+ /* skip spaces */
+ while (g_ascii_isspace (**src))
+ (*src)++;
+
+ while (!g_ascii_isspace (**src) && **src != '\0') {
+ if (idx < size - 1)
+ dest[idx++] = **src;
+ (*src)++;
+ }
+ if (size > 0)
+ dest[idx] = '\0';
+}
+
+static void
+read_string_del (gchar * dest, guint size, gchar del, gchar ** src)
+{
+ guint idx;
+
+ idx = 0;
+ /* skip spaces */
+ while (g_ascii_isspace (**src))
+ (*src)++;
+
+ while (**src != del && **src != '\0') {
+ if (idx < size - 1)
+ dest[idx++] = **src;
+ (*src)++;
+ }
+ if (size > 0)
+ dest[idx] = '\0';
+}
+
+enum
+{
+ SDP_SESSION,
+ SDP_MEDIA,
+};
+
+typedef struct
+{
+ guint state;
+ GstSDPMessage *msg;
+ GstSDPMedia *media;
+} SDPContext;
+
+static gboolean
+gst_sdp_parse_line (SDPContext * c, gchar type, gchar * buffer)
+{
+ gchar str[8192];
+ gchar *p = buffer;
+
+#define READ_STRING(field) read_string (str, sizeof (str), &p); REPLACE_STRING (field, str)
+#define READ_UINT(field) read_string (str, sizeof (str), &p); field = strtoul (str, NULL, 10)
+
+ switch (type) {
+ case 'v':
+ if (buffer[0] != '0')
+ g_warning ("wrong SDP version");
+ gst_sdp_message_set_version (c->msg, buffer);
+ break;
+ case 'o':
+ READ_STRING (c->msg->origin.username);
+ READ_STRING (c->msg->origin.sess_id);
+ READ_STRING (c->msg->origin.sess_version);
+ READ_STRING (c->msg->origin.nettype);
+ READ_STRING (c->msg->origin.addrtype);
+ READ_STRING (c->msg->origin.addr);
+ break;
+ case 's':
+ REPLACE_STRING (c->msg->session_name, buffer);
+ break;
+ case 'i':
+ if (c->state == SDP_SESSION) {
+ REPLACE_STRING (c->msg->information, buffer);
+ } else {
+ REPLACE_STRING (c->media->information, buffer);
+ }
+ break;
+ case 'u':
+ REPLACE_STRING (c->msg->uri, buffer);
+ break;
+ case 'e':
+ gst_sdp_message_add_email (c->msg, buffer);
+ break;
+ case 'p':
+ gst_sdp_message_add_phone (c->msg, buffer);
+ break;
+ case 'c':
+ {
+ GstSDPConnection conn;
+ gchar *str2;
+
+ memset (&conn, 0, sizeof (conn));
+
+ str2 = p;
+ while ((str2 = strchr (str2, '/')))
+ *str2++ = ' ';
+ READ_STRING (conn.nettype);
+ READ_STRING (conn.addrtype);
+ READ_STRING (conn.address);
+ /* only read TTL for IP4 */
+ if (strcmp (conn.addrtype, "IP4") == 0)
+ READ_UINT (conn.ttl);
+ READ_UINT (conn.addr_number);
+
+ if (c->state == SDP_SESSION) {
+ gst_sdp_message_set_connection (c->msg, conn.nettype, conn.addrtype,
+ conn.address, conn.ttl, conn.addr_number);
+ } else {
+ gst_sdp_media_add_connection (c->media, conn.nettype, conn.addrtype,
+ conn.address, conn.ttl, conn.addr_number);
+ }
+ gst_sdp_connection_init (&conn);
+ break;
+ }
+ case 'b':
+ {
+ gchar str2[MAX_LINE_LEN];
+
+ read_string_del (str, sizeof (str), ':', &p);
+ if (*p != '\0')
+ p++;
+ read_string (str2, sizeof (str2), &p);
+ if (c->state == SDP_SESSION)
+ gst_sdp_message_add_bandwidth (c->msg, str, atoi (str2));
+ else
+ gst_sdp_media_add_bandwidth (c->media, str, atoi (str2));
+ break;
+ }
+ case 't':
+ break;
+ case 'k':
+ break;
+ case 'a':
+ read_string_del (str, sizeof (str), ':', &p);
+ if (*p != '\0')
+ p++;
+ if (c->state == SDP_SESSION)
+ gst_sdp_message_add_attribute (c->msg, str, p);
+ else
+ gst_sdp_media_add_attribute (c->media, str, p);
+ break;
+ case 'm':
+ {
+ gchar *slash;
+ GstSDPMedia nmedia;
+
+ c->state = SDP_MEDIA;
+ memset (&nmedia, 0, sizeof (nmedia));
+ gst_sdp_media_init (&nmedia);
+
+ /* m=<media> <port>/<number of ports> <proto> <fmt> ... */
+ READ_STRING (nmedia.media);
+ read_string (str, sizeof (str), &p);
+ slash = g_strrstr (str, "/");
+ if (slash) {
+ *slash = '\0';
+ nmedia.port = atoi (str);
+ nmedia.num_ports = atoi (slash + 1);
+ } else {
+ nmedia.port = atoi (str);
+ nmedia.num_ports = -1;
+ }
+ READ_STRING (nmedia.proto);
+ do {
+ read_string (str, sizeof (str), &p);
+ gst_sdp_media_add_format (&nmedia, str);
+ } while (*p != '\0');
+
+ gst_sdp_message_add_media (c->msg, &nmedia);
+ c->media =
+ &g_array_index (c->msg->medias, GstSDPMedia, c->msg->medias->len - 1);
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+/**
+ * gst_sdp_message_parse_buffer:
+ * @data: the start of the buffer
+ * @size: the size of the buffer
+ * @msg: the result #GstSDPMessage
+ *
+ * Parse the contents of @size bytes pointed to by @data and store the result in
+ * @msg.
+ *
+ * Returns: #GST_SDP_OK on success.
+ */
+GstSDPResult
+gst_sdp_message_parse_buffer (const guint8 * data, guint size,
+ GstSDPMessage * msg)
+{
+ gchar *p;
+ SDPContext c;
+ gchar type;
+ gchar buffer[MAX_LINE_LEN];
+ guint idx = 0;
+
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+ g_return_val_if_fail (data != NULL, GST_SDP_EINVAL);
+ g_return_val_if_fail (size != 0, GST_SDP_EINVAL);
+
+ c.state = SDP_SESSION;
+ c.msg = msg;
+ c.media = NULL;
+
+ p = (gchar *) data;
+ while (TRUE) {
+ while (g_ascii_isspace (*p))
+ p++;
+
+ type = *p++;
+ if (type == '\0')
+ break;
+
+ if (*p != '=')
+ goto line_done;
+ p++;
+
+ idx = 0;
+ while (*p != '\n' && *p != '\r' && *p != '\0') {
+ if (idx < sizeof (buffer) - 1)
+ buffer[idx++] = *p;
+ p++;
+ }
+ buffer[idx] = '\0';
+ gst_sdp_parse_line (&c, type, buffer);
+
+ line_done:
+ while (*p != '\n' && *p != '\0')
+ p++;
+ if (*p == '\n')
+ p++;
+ }
+
+ return GST_SDP_OK;
+}
+
+static void
+print_media (GstSDPMedia * media)
+{
+ g_print (" media: '%s'\n", GST_STR_NULL (media->media));
+ g_print (" port: '%u'\n", media->port);
+ g_print (" num_ports: '%u'\n", media->num_ports);
+ g_print (" proto: '%s'\n", GST_STR_NULL (media->proto));
+ if (media->fmts->len > 0) {
+ guint i;
+
+ g_print (" formats:\n");
+ for (i = 0; i < media->fmts->len; i++) {
+ g_print (" format '%s'\n", g_array_index (media->fmts, gchar *, i));
+ }
+ }
+ g_print (" information: '%s'\n", GST_STR_NULL (media->information));
+ if (media->connections->len > 0) {
+ guint i;
+
+ g_print (" connections:\n");
+ for (i = 0; i < media->connections->len; i++) {
+ GstSDPConnection *conn =
+ &g_array_index (media->connections, GstSDPConnection, i);
+
+ g_print (" nettype: '%s'\n", GST_STR_NULL (conn->nettype));
+ g_print (" addrtype: '%s'\n", GST_STR_NULL (conn->addrtype));
+ g_print (" address: '%s'\n", GST_STR_NULL (conn->address));
+ g_print (" ttl: '%u'\n", conn->ttl);
+ g_print (" addr_number: '%u'\n", conn->addr_number);
+ }
+ }
+ if (media->bandwidths->len > 0) {
+ guint i;
+
+ g_print (" bandwidths:\n");
+ for (i = 0; i < media->bandwidths->len; i++) {
+ GstSDPBandwidth *bw =
+ &g_array_index (media->bandwidths, GstSDPBandwidth, i);
+
+ g_print (" type: '%s'\n", GST_STR_NULL (bw->bwtype));
+ g_print (" bandwidth: '%u'\n", bw->bandwidth);
+ }
+ }
+ g_print (" key:\n");
+ g_print (" type: '%s'\n", GST_STR_NULL (media->key.type));
+ g_print (" data: '%s'\n", GST_STR_NULL (media->key.data));
+ if (media->attributes->len > 0) {
+ guint i;
+
+ g_print (" attributes:\n");
+ for (i = 0; i < media->attributes->len; i++) {
+ GstSDPAttribute *attr =
+ &g_array_index (media->attributes, GstSDPAttribute, i);
+
+ g_print (" attribute '%s' : '%s'\n", attr->key, attr->value);
+ }
+ }
+}
+
+/**
+ * gst_sdp_message_dump:
+ * @msg: a #GstSDPMessage
+ *
+ * Dump the parsed contents of @msg to stdout.
+ *
+ * Returns: a #GstSDPResult.
+ */
+GstSDPResult
+gst_sdp_message_dump (const GstSDPMessage * msg)
+{
+ g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+
+ g_print ("sdp packet %p:\n", msg);
+ g_print (" version: '%s'\n", GST_STR_NULL (msg->version));
+ g_print (" origin:\n");
+ g_print (" username: '%s'\n", GST_STR_NULL (msg->origin.username));
+ g_print (" sess_id: '%s'\n", GST_STR_NULL (msg->origin.sess_id));
+ g_print (" sess_version: '%s'\n", GST_STR_NULL (msg->origin.sess_version));
+ g_print (" nettype: '%s'\n", GST_STR_NULL (msg->origin.nettype));
+ g_print (" addrtype: '%s'\n", GST_STR_NULL (msg->origin.addrtype));
+ g_print (" addr: '%s'\n", GST_STR_NULL (msg->origin.addr));
+ g_print (" session_name: '%s'\n", GST_STR_NULL (msg->session_name));
+ g_print (" information: '%s'\n", GST_STR_NULL (msg->information));
+ g_print (" uri: '%s'\n", GST_STR_NULL (msg->uri));
+
+ if (msg->emails->len > 0) {
+ guint i;
+
+ g_print (" emails:\n");
+ for (i = 0; i < msg->emails->len; i++) {
+ g_print (" email '%s'\n", g_array_index (msg->emails, gchar *, i));
+ }
+ }
+ if (msg->phones->len > 0) {
+ guint i;
+
+ g_print (" phones:\n");
+ for (i = 0; i < msg->phones->len; i++) {
+ g_print (" phone '%s'\n", g_array_index (msg->phones, gchar *, i));
+ }
+ }
+ g_print (" connection:\n");
+ g_print (" nettype: '%s'\n", GST_STR_NULL (msg->connection.nettype));
+ g_print (" addrtype: '%s'\n", GST_STR_NULL (msg->connection.addrtype));
+ g_print (" address: '%s'\n", GST_STR_NULL (msg->connection.address));
+ g_print (" ttl: '%u'\n", msg->connection.ttl);
+ g_print (" addr_number: '%u'\n", msg->connection.addr_number);
+ if (msg->bandwidths->len > 0) {
+ guint i;
+
+ g_print (" bandwidths:\n");
+ for (i = 0; i < msg->bandwidths->len; i++) {
+ GstSDPBandwidth *bw =
+ &g_array_index (msg->bandwidths, GstSDPBandwidth, i);
+
+ g_print (" type: '%s'\n", GST_STR_NULL (bw->bwtype));
+ g_print (" bandwidth: '%u'\n", bw->bandwidth);
+ }
+ }
+ g_print (" key:\n");
+ g_print (" type: '%s'\n", GST_STR_NULL (msg->key.type));
+ g_print (" data: '%s'\n", GST_STR_NULL (msg->key.data));
+ if (msg->attributes->len > 0) {
+ guint i;
+
+ g_print (" attributes:\n");
+ for (i = 0; i < msg->attributes->len; i++) {
+ GstSDPAttribute *attr =
+ &g_array_index (msg->attributes, GstSDPAttribute, i);
+
+ g_print (" attribute '%s' : '%s'\n", attr->key, attr->value);
+ }
+ }
+ if (msg->medias->len > 0) {
+ guint i;
+
+ g_print (" medias:\n");
+ for (i = 0; i < msg->medias->len; i++) {
+ g_print (" media %u:\n", i);
+ print_media (&g_array_index (msg->medias, GstSDPMedia, i));
+ }
+ }
+ return GST_SDP_OK;
+}
diff --git a/gst-libs/gst/sdp/gstsdpmessage.h b/gst-libs/gst/sdp/gstsdpmessage.h
new file mode 100644
index 0000000..069eb38
--- /dev/null
+++ b/gst-libs/gst/sdp/gstsdpmessage.h
@@ -0,0 +1,423 @@
+/* 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_SDP_MESSAGE_H__
+#define __GST_SDP_MESSAGE_H__
+
+#include <glib.h>
+
+#include <gst/sdp/gstsdp.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstSDPOrigin:
+ * @username: the user's login on the originating host, or it is "-"
+ * if the originating host does not support the concept of user ids.
+ * @sess_id: is a numeric string such that the tuple of @username, @sess_id,
+ * @nettype, @addrtype and @addr form a globally unique identifier for the
+ * session.
+ * @sess_version: a version number for this announcement
+ * @nettype: the type of network. "IN" is defined to have the meaning
+ * "Internet".
+ * @addrtype: the type of @addr.
+ * @addr: the globally unique address of the machine from which the session was
+ * created.
+ *
+ * The contents of the SDP "o=" field which gives the originator of the session
+ * (their username and the address of the user's host) plus a session id and
+ * session version number.
+ */
+typedef struct {
+ gchar *username;
+ gchar *sess_id;
+ gchar *sess_version;
+ gchar *nettype;
+ gchar *addrtype;
+ gchar *addr;
+} GstSDPOrigin;
+
+/**
+ * GstSDPConnection:
+ * @nettype: the type of network. "IN" is defined to have the meaning
+ * "Internet".
+ * @addrtype: the type of @address.
+ * @address: the address
+ * @ttl: the time to live of the address
+ * @addr_number: the number of layers
+ *
+ * The contents of the SDP "c=" field which contains connection data.
+ */
+typedef struct {
+ gchar *nettype;
+ gchar *addrtype;
+ gchar *address;
+ guint ttl;
+ guint addr_number;
+} GstSDPConnection;
+
+/**
+ * GST_SDP_BWTYPE_CT:
+ *
+ * The Conference Total bandwidth modifier.
+ */
+#define GST_SDP_BWTYPE_CT "CT"
+/**
+ * GST_SDP_BWTYPE_AS:
+ *
+ * The Application-Specific Maximum bandwidth modifier.
+ */
+#define GST_SDP_BWTYPE_AS "AS"
+/**
+ * GST_SDP_BWTYPE_EXT_PREFIX:
+ *
+ * The extension prefix bandwidth modifier.
+ */
+#define GST_SDP_BWTYPE_EXT_PREFIX "X-"
+
+/**
+ * GST_SDP_BWTYPE_RS:
+ *
+ * RTCP bandwidth allocated to active data senders (RFC 3556).
+ *
+ * Since: 0.10.15
+ */
+#define GST_SDP_BWTYPE_RS "RS"
+/**
+ * GST_SDP_BWTYPE_RR:
+ *
+ * RTCP bandwidth allocated to data receivers (RFC 3556).
+ *
+ * Since: 0.10.15
+ */
+#define GST_SDP_BWTYPE_RR "RR"
+/**
+ * GST_SDP_BWTYPE_TIAS:
+ *
+ * Transport Independent Application Specific Maximum bandwidth (RFC 3890).
+ *
+ * Since: 0.10.30
+ */
+#define GST_SDP_BWTYPE_TIAS "TIAS"
+
+
+/**
+ * GstSDPBandwidth:
+ * @bwtype: the bandwidth modifier type
+ * @bandwidth: the bandwidth in kilobits per second
+ *
+ * The contents of the SDP "b=" field which specifies the proposed bandwidth to
+ * be used by the session or media.
+ */
+typedef struct {
+ gchar *bwtype;
+ guint bandwidth;
+} GstSDPBandwidth;
+
+/**
+ * GstSDPTime:
+ * @start: start time for the conference. The value is the decimal
+ * representation of Network Time Protocol (NTP) time values in seconds
+ * @stop: stop time for the conference. The value is the decimal
+ * representation of Network Time Protocol (NTP) time values in seconds
+ * @repeat: repeat times for a session
+ *
+ * The contents of the SDP "t=" field which specify the start and stop times for
+ * a conference session.
+ */
+typedef struct {
+ gchar *start;
+ gchar *stop;
+ GArray *repeat;
+} GstSDPTime;
+
+/**
+ * GstSDPZone:
+ * @time: the NTP time that a time zone adjustment happens
+ * @typed_time: the offset from the time when the session was first scheduled
+ *
+ * The contents of the SDP "z=" field which allows the sender to
+ * specify a list of time zone adjustments and offsets from the base
+ * time.
+ */
+typedef struct {
+ gchar *time;
+ gchar *typed_time;
+} GstSDPZone;
+
+/**
+ * GstSDPKey:
+ * @type: the encryption type
+ * @data: the encryption data
+ *
+ * The contents of the SDP "k=" field which is used to convey encryption
+ * keys.
+ */
+typedef struct {
+ gchar *type;
+ gchar *data;
+} GstSDPKey;
+
+/**
+ * GstSDPAttribute:
+ * @key: the attribute key
+ * @value: the attribute value or NULL when it was a property attribute
+ *
+ * The contents of the SDP "a=" field which contains a key/value pair.
+ */
+typedef struct {
+ gchar *key;
+ gchar *value;
+} GstSDPAttribute;
+
+/**
+ * GstSDPMedia:
+ * @media: the media type
+ * @port: the transport port to which the media stream will be sent
+ * @num_ports: the number of ports or -1 if only one port was specified
+ * @proto: the transport protocol
+ * @fmts: an array of #gchar formats
+ * @information: the media title
+ * @connections: array of #GstSDPConnection with media connection information
+ * @bandwidths: array of #GstSDPBandwidth with media bandwidth information
+ * @key: the encryption key
+ * @attributes: array of #GstSDPAttribute with the additional media attributes
+ *
+ * The contents of the SDP "m=" field with all related fields.
+ */
+typedef struct {
+ gchar *media;
+ guint port;
+ guint num_ports;
+ gchar *proto;
+ GArray *fmts;
+ gchar *information;
+ GArray *connections;
+ GArray *bandwidths;
+ GstSDPKey key;
+ GArray *attributes;
+} GstSDPMedia;
+
+/**
+ * GstSDPMessage:
+ * @version: the protocol version
+ * @origin: owner/creator and session identifier
+ * @session_name: session name
+ * @information: session information
+ * @uri: URI of description
+ * @emails: array of #gchar with email addresses
+ * @phones: array of #gchar with phone numbers
+ * @connection: connection information for the session
+ * @bandwidths: array of #GstSDPBandwidth with bandwidth information
+ * @times: array of #GstSDPTime with time descriptions
+ * @zones: array of #GstSDPZone with time zone adjustments
+ * @key: encryption key
+ * @attributes: array of #GstSDPAttribute with session attributes
+ * @medias: array of #GstSDPMedia with media descriptions
+ *
+ * The contents of the SDP message.
+ */
+typedef struct {
+ gchar *version;
+ GstSDPOrigin origin;
+ gchar *session_name;
+ gchar *information;
+ gchar *uri;
+ GArray *emails;
+ GArray *phones;
+ GstSDPConnection connection;
+ GArray *bandwidths;
+ GArray *times;
+ GArray *zones;
+ GstSDPKey key;
+ GArray *attributes;
+ GArray *medias;
+} GstSDPMessage;
+
+/* Session descriptions */
+GstSDPResult gst_sdp_message_new (GstSDPMessage **msg);
+GstSDPResult gst_sdp_message_init (GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_uninit (GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_free (GstSDPMessage *msg);
+
+GstSDPResult gst_sdp_message_parse_buffer (const guint8 *data, guint size, GstSDPMessage *msg);
+gchar* gst_sdp_message_as_text (const GstSDPMessage *msg);
+
+/* convert from/to uri */
+GstSDPResult gst_sdp_message_parse_uri (const gchar *uri, GstSDPMessage *msg);
+gchar* gst_sdp_message_as_uri (const gchar *scheme, const GstSDPMessage *msg);
+
+/* utils */
+gboolean gst_sdp_address_is_multicast (const gchar *nettype, const gchar *addrtype,
+ const gchar *addr);
+/* v=.. */
+const gchar* gst_sdp_message_get_version (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_version (GstSDPMessage *msg, const gchar *version);
+
+/* o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address> */
+const GstSDPOrigin* gst_sdp_message_get_origin (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_origin (GstSDPMessage *msg, const gchar *username,
+ const gchar *sess_id, const gchar *sess_version,
+ const gchar *nettype, const gchar *addrtype,
+ const gchar *addr);
+
+/* s=<session name> */
+const gchar* gst_sdp_message_get_session_name (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_session_name (GstSDPMessage *msg, const gchar *session_name);
+
+/* i=<session description> */
+const gchar* gst_sdp_message_get_information (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_information (GstSDPMessage *msg, const gchar *information);
+
+/* u=<uri> */
+const gchar* gst_sdp_message_get_uri (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_uri (GstSDPMessage *msg, const gchar *uri);
+
+/* e=<email-address> */
+guint gst_sdp_message_emails_len (const GstSDPMessage *msg);
+const gchar* gst_sdp_message_get_email (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_email (GstSDPMessage *msg, const gchar *email);
+
+/* p=<phone-number> */
+guint gst_sdp_message_phones_len (const GstSDPMessage *msg);
+const gchar* gst_sdp_message_get_phone (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_phone (GstSDPMessage *msg, const gchar *phone);
+
+/* c=<nettype> <addrtype> <connection-address>[/<ttl>][/<number of addresses>] */
+const GstSDPConnection* gst_sdp_message_get_connection (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_connection (GstSDPMessage *msg, const gchar *nettype,
+ const gchar *addrtype, const gchar *address,
+ guint ttl, guint addr_number);
+/* b=<bwtype>:<bandwidth> */
+guint gst_sdp_message_bandwidths_len (const GstSDPMessage *msg);
+const GstSDPBandwidth* gst_sdp_message_get_bandwidth (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_bandwidth (GstSDPMessage *msg, const gchar *bwtype,
+ guint bandwidth);
+/* t=<start-time> <stop-time> and
+ * r=<repeat interval> <active duration> <offsets from start-time> */
+guint gst_sdp_message_times_len (const GstSDPMessage *msg);
+const GstSDPTime* gst_sdp_message_get_time (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_time (GstSDPMessage *msg, const gchar *start, const gchar *stop, const gchar **repeat);
+
+/* z=<adjustment time> <offset> <adjustment time> <offset> .... */
+guint gst_sdp_message_zones_len (const GstSDPMessage *msg);
+const GstSDPZone* gst_sdp_message_get_zone (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_zone (GstSDPMessage *msg, const gchar *adj_time,
+ const gchar *typed_time);
+
+/* k=<method>[:<encryption key>] */
+const GstSDPKey* gst_sdp_message_get_key (const GstSDPMessage *msg);
+GstSDPResult gst_sdp_message_set_key (GstSDPMessage *msg, const gchar *type,
+ const gchar *data);
+/* a=... */
+guint gst_sdp_message_attributes_len (const GstSDPMessage *msg);
+const GstSDPAttribute* gst_sdp_message_get_attribute (const GstSDPMessage *msg, guint idx);
+const gchar* gst_sdp_message_get_attribute_val (const GstSDPMessage *msg, const gchar *key);
+const gchar* gst_sdp_message_get_attribute_val_n (const GstSDPMessage *msg, const gchar *key,
+ guint nth);
+GstSDPResult gst_sdp_message_add_attribute (GstSDPMessage *msg, const gchar *key,
+ const gchar *value);
+
+/* m=.. sections */
+guint gst_sdp_message_medias_len (const GstSDPMessage *msg);
+const GstSDPMedia* gst_sdp_message_get_media (const GstSDPMessage *msg, guint idx);
+GstSDPResult gst_sdp_message_add_media (GstSDPMessage *msg, GstSDPMedia *media);
+
+GstSDPResult gst_sdp_message_dump (const GstSDPMessage *msg);
+
+/* Media descriptions */
+GstSDPResult gst_sdp_media_new (GstSDPMedia **media);
+GstSDPResult gst_sdp_media_init (GstSDPMedia *media);
+GstSDPResult gst_sdp_media_uninit (GstSDPMedia *media);
+GstSDPResult gst_sdp_media_free (GstSDPMedia *media);
+
+gchar* gst_sdp_media_as_text (const GstSDPMedia *media);
+
+/* m=<media> <port>/<number of ports> <proto> <fmt> ... */
+const gchar* gst_sdp_media_get_media (const GstSDPMedia *media);
+GstSDPResult gst_sdp_media_set_media (GstSDPMedia *media, const gchar *med);
+
+guint gst_sdp_media_get_port (const GstSDPMedia *media);
+guint gst_sdp_media_get_num_ports (const GstSDPMedia *media);
+GstSDPResult gst_sdp_media_set_port_info (GstSDPMedia *media, guint port,
+ guint num_ports);
+
+const gchar* gst_sdp_media_get_proto (const GstSDPMedia *media);
+GstSDPResult gst_sdp_media_set_proto (GstSDPMedia *media, const gchar *proto);
+
+guint gst_sdp_media_formats_len (const GstSDPMedia *media);
+const gchar* gst_sdp_media_get_format (const GstSDPMedia *media, guint idx);
+GstSDPResult gst_sdp_media_add_format (GstSDPMedia *media, const gchar *format);
+
+/* i=<session description> */
+const gchar* gst_sdp_media_get_information (const GstSDPMedia *media);
+GstSDPResult gst_sdp_media_set_information (GstSDPMedia *media, const gchar *information);
+
+/* c=<nettype> <addrtype> <connection-address>[/<ttl>][/<number of addresses>] */
+guint gst_sdp_media_connections_len (const GstSDPMedia *media);
+const GstSDPConnection* gst_sdp_media_get_connection (const GstSDPMedia *media, guint idx);
+GstSDPResult gst_sdp_media_add_connection (GstSDPMedia *media, const gchar *nettype,
+ const gchar *addrtype, const gchar *address,
+ guint ttl, guint addr_number);
+
+/* b=<bwtype>:<bandwidth> */
+guint gst_sdp_media_bandwidths_len (const GstSDPMedia *media);
+const GstSDPBandwidth* gst_sdp_media_get_bandwidth (const GstSDPMedia *media, guint idx);
+GstSDPResult gst_sdp_media_add_bandwidth (GstSDPMedia *media, const gchar *bwtype,
+ guint bandwidth);
+
+/* k=<method>:<encryption key> */
+const GstSDPKey* gst_sdp_media_get_key (const GstSDPMedia *media);
+GstSDPResult gst_sdp_media_set_key (GstSDPMedia *media, const gchar *type,
+ const gchar *data);
+/* a=... */
+guint gst_sdp_media_attributes_len (const GstSDPMedia *media);
+const GstSDPAttribute * gst_sdp_media_get_attribute (const GstSDPMedia *media, guint idx);
+const gchar* gst_sdp_media_get_attribute_val (const GstSDPMedia *media, const gchar *key);
+const gchar* gst_sdp_media_get_attribute_val_n (const GstSDPMedia *media, const gchar *key,
+ guint nth);
+GstSDPResult gst_sdp_media_add_attribute (GstSDPMedia *media, const gchar *key,
+ const gchar *value);
+
+G_END_DECLS
+
+#endif /* __GST_SDP_MESSAGE_H__ */
diff --git a/gst-libs/gst/tag/Makefile.am b/gst-libs/gst/tag/Makefile.am
new file mode 100644
index 0000000..39fc3d8
--- /dev/null
+++ b/gst-libs/gst/tag/Makefile.am
@@ -0,0 +1,120 @@
+libgsttagincludedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/tag
+
+libgsttaginclude_HEADERS = \
+ tag.h gsttagdemux.h gsttagmux.h xmpwriter.h
+
+lib_LTLIBRARIES = libgsttag-@GST_MAJORMINOR@.la
+
+libgsttag_@GST_MAJORMINOR@_la_SOURCES = \
+ gstvorbistag.c gstid3tag.c gstxmptag.c gstexiftag.c \
+ lang.c licenses.c tags.c gsttagdemux.c gsttagmux.c \
+ gsttageditingprivate.c id3v2.c id3v2frames.c xmpwriter.c
+
+libgsttag_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ZLIB_CFLAGS) \
+ -DLICENSE_TRANSLATIONS_PATH=\"$(pkgdatadir)/license-translations.dict\"
+libgsttag_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ZLIB_LIBS)
+libgsttag_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+# lang-tables.dat contains generated static data and is included by lang.c
+# licenses-tables.dat contains generated data and is included by licenses.c
+EXTRA_DIST = lang-tables.dat licenses-tables.dat license-translations.dict
+
+noinst_HEADERS = gsttageditingprivate.h id3v2.h
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstTag-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgsttaginclude_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgsttag_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/tag/%',$(libgsttaginclude_HEADERS))
+
+GstTag-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgsttag-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstTag \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgsttag-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-tag-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+# little program that reads iso_639.xml and outputs tables for us as fallback
+# for when iso-codes are not available (and so we don't have to read the xml
+# just to map codes)
+mklangtables_SOURCES = mklangtables.c
+mklangtables_CFLAGS = $(GST_CFLAGS)
+mklangtables_LDADD = $(GST_LIBS)
+
+mklicensestables_SOURCES = mklicensestables.c
+mklicensestables_CFLAGS = $(GST_CFLAGS)
+mklicensestables_LDADD = $(GST_LIBS)
+
+EXTRA_PROGRAMS = mklangtables mklicensestables
+
+update-isocodes: mklangtables
+ $(builddir)/mklangtables > $(srcdir)/lang-tables.dat && \
+ echo "Updated lang-tables.dat"
+
+update-licenses: mklicensestables
+ $(builddir)/mklicensestables \
+ --translation-dictionary=$(srcdir)/license-translations.dict \
+ > $(srcdir)/licenses-tables.dat && \
+ echo "Updated licenses-tables.dat and license-translations.dict"
+
+#if USE_NLS
+# Yes, this is not great, but it's only an implementation detail. The
+# translations come from an external source here, so we don't want the
+# strings retranslated, but also we don't want to create 30 1kB .mo files,
+# so just do something for now, we can change it later if someone really cares.
+licensetransdir = $(pkgdatadir)
+licensetrans_DATA = $(srcdir)/license-translations.dict
+#endif
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgsttag -:SHARED libgsttag-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttag_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgsttag_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgsttag_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgsttaginclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/tag/Makefile.in b/gst-libs/gst/tag/Makefile.in
new file mode 100644
index 0000000..0f2c7b4
--- /dev/null
+++ b/gst-libs/gst/tag/Makefile.in
@@ -0,0 +1,1129 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@
+EXTRA_PROGRAMS = mklangtables$(EXEEXT) mklicensestables$(EXEEXT)
+subdir = gst-libs/gst/tag
+DIST_COMMON = $(libgsttaginclude_HEADERS) $(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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(licensetransdir)" "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgsttagincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgsttag_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgsttag_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo \
+ libgsttag_@GST_MAJORMINOR@_la-lang.lo \
+ libgsttag_@GST_MAJORMINOR@_la-licenses.lo \
+ libgsttag_@GST_MAJORMINOR@_la-tags.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo \
+ libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo \
+ libgsttag_@GST_MAJORMINOR@_la-id3v2.lo \
+ libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo \
+ libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo
+libgsttag_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgsttag_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgsttag_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgsttag_@GST_MAJORMINOR@_la_LDFLAGS) $(LDFLAGS) -o $@
+am_mklangtables_OBJECTS = mklangtables-mklangtables.$(OBJEXT)
+mklangtables_OBJECTS = $(am_mklangtables_OBJECTS)
+mklangtables_DEPENDENCIES = $(am__DEPENDENCIES_1)
+mklangtables_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mklangtables_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_mklicensestables_OBJECTS = \
+ mklicensestables-mklicensestables.$(OBJEXT)
+mklicensestables_OBJECTS = $(am_mklicensestables_OBJECTS)
+mklicensestables_DEPENDENCIES = $(am__DEPENDENCIES_1)
+mklicensestables_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(mklicensestables_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgsttag_@GST_MAJORMINOR@_la_SOURCES) \
+ $(mklangtables_SOURCES) $(mklicensestables_SOURCES)
+DIST_SOURCES = $(libgsttag_@GST_MAJORMINOR@_la_SOURCES) \
+ $(mklangtables_SOURCES) $(mklicensestables_SOURCES)
+DATA = $(gir_DATA) $(licensetrans_DATA) $(typelibs_DATA)
+HEADERS = $(libgsttaginclude_HEADERS) $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+libgsttagincludedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/tag
+
+libgsttaginclude_HEADERS = \
+ tag.h gsttagdemux.h gsttagmux.h xmpwriter.h
+
+lib_LTLIBRARIES = libgsttag-@GST_MAJORMINOR@.la
+libgsttag_@GST_MAJORMINOR@_la_SOURCES = \
+ gstvorbistag.c gstid3tag.c gstxmptag.c gstexiftag.c \
+ lang.c licenses.c tags.c gsttagdemux.c gsttagmux.c \
+ gsttageditingprivate.c id3v2.c id3v2frames.c xmpwriter.c
+
+libgsttag_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ZLIB_CFLAGS) \
+ -DLICENSE_TRANSLATIONS_PATH=\"$(pkgdatadir)/license-translations.dict\"
+
+libgsttag_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ZLIB_LIBS)
+libgsttag_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+# lang-tables.dat contains generated static data and is included by lang.c
+# licenses-tables.dat contains generated data and is included by licenses.c
+EXTRA_DIST = lang-tables.dat licenses-tables.dat license-translations.dict
+noinst_HEADERS = gsttageditingprivate.h id3v2.h
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstTag-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgsttaginclude_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgsttag_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/tag/%',$(libgsttaginclude_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+
+# little program that reads iso_639.xml and outputs tables for us as fallback
+# for when iso-codes are not available (and so we don't have to read the xml
+# just to map codes)
+mklangtables_SOURCES = mklangtables.c
+mklangtables_CFLAGS = $(GST_CFLAGS)
+mklangtables_LDADD = $(GST_LIBS)
+mklicensestables_SOURCES = mklicensestables.c
+mklicensestables_CFLAGS = $(GST_CFLAGS)
+mklicensestables_LDADD = $(GST_LIBS)
+
+#if USE_NLS
+# Yes, this is not great, but it's only an implementation detail. The
+# translations come from an external source here, so we don't want the
+# strings retranslated, but also we don't want to create 30 1kB .mo files,
+# so just do something for now, we can change it later if someone really cares.
+licensetransdir = $(pkgdatadir)
+licensetrans_DATA = $(srcdir)/license-translations.dict
+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-libs/gst/tag/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/tag/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgsttag-@GST_MAJORMINOR@.la: $(libgsttag_@GST_MAJORMINOR@_la_OBJECTS) $(libgsttag_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgsttag_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgsttag_@GST_MAJORMINOR@_la_OBJECTS) $(libgsttag_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+mklangtables$(EXEEXT): $(mklangtables_OBJECTS) $(mklangtables_DEPENDENCIES)
+ @rm -f mklangtables$(EXEEXT)
+ $(AM_V_CCLD)$(mklangtables_LINK) $(mklangtables_OBJECTS) $(mklangtables_LDADD) $(LIBS)
+mklicensestables$(EXEEXT): $(mklicensestables_OBJECTS) $(mklicensestables_DEPENDENCIES)
+ @rm -f mklicensestables$(EXEEXT)
+ $(AM_V_CCLD)$(mklicensestables_LINK) $(mklicensestables_OBJECTS) $(mklicensestables_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstexiftag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstid3tag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagmux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstxmptag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2frames.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-lang.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-licenses.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-tags.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-xmpwriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mklangtables-mklangtables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mklicensestables-mklicensestables.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo: gstvorbistag.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo `test -f 'gstvorbistag.c' || echo '$(srcdir)/'`gstvorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvorbistag.c' object='libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gstvorbistag.lo `test -f 'gstvorbistag.c' || echo '$(srcdir)/'`gstvorbistag.c
+
+libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo: gstid3tag.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstid3tag.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo `test -f 'gstid3tag.c' || echo '$(srcdir)/'`gstid3tag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstid3tag.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstid3tag.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstid3tag.c' object='libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gstid3tag.lo `test -f 'gstid3tag.c' || echo '$(srcdir)/'`gstid3tag.c
+
+libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo: gstxmptag.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstxmptag.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo `test -f 'gstxmptag.c' || echo '$(srcdir)/'`gstxmptag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstxmptag.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstxmptag.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstxmptag.c' object='libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gstxmptag.lo `test -f 'gstxmptag.c' || echo '$(srcdir)/'`gstxmptag.c
+
+libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo: gstexiftag.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstexiftag.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo `test -f 'gstexiftag.c' || echo '$(srcdir)/'`gstexiftag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstexiftag.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gstexiftag.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstexiftag.c' object='libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gstexiftag.lo `test -f 'gstexiftag.c' || echo '$(srcdir)/'`gstexiftag.c
+
+libgsttag_@GST_MAJORMINOR@_la-lang.lo: lang.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-lang.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-lang.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-lang.lo `test -f 'lang.c' || echo '$(srcdir)/'`lang.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-lang.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-lang.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lang.c' object='libgsttag_@GST_MAJORMINOR@_la-lang.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-lang.lo `test -f 'lang.c' || echo '$(srcdir)/'`lang.c
+
+libgsttag_@GST_MAJORMINOR@_la-licenses.lo: licenses.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-licenses.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-licenses.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-licenses.lo `test -f 'licenses.c' || echo '$(srcdir)/'`licenses.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-licenses.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-licenses.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='licenses.c' object='libgsttag_@GST_MAJORMINOR@_la-licenses.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-licenses.lo `test -f 'licenses.c' || echo '$(srcdir)/'`licenses.c
+
+libgsttag_@GST_MAJORMINOR@_la-tags.lo: tags.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-tags.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-tags.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-tags.lo `test -f 'tags.c' || echo '$(srcdir)/'`tags.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-tags.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-tags.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tags.c' object='libgsttag_@GST_MAJORMINOR@_la-tags.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-tags.lo `test -f 'tags.c' || echo '$(srcdir)/'`tags.c
+
+libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo: gsttagdemux.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo `test -f 'gsttagdemux.c' || echo '$(srcdir)/'`gsttagdemux.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttagdemux.c' object='libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gsttagdemux.lo `test -f 'gsttagdemux.c' || echo '$(srcdir)/'`gsttagdemux.c
+
+libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo: gsttagmux.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagmux.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo `test -f 'gsttagmux.c' || echo '$(srcdir)/'`gsttagmux.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagmux.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttagmux.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttagmux.c' object='libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gsttagmux.lo `test -f 'gsttagmux.c' || echo '$(srcdir)/'`gsttagmux.c
+
+libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo: gsttageditingprivate.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo `test -f 'gsttageditingprivate.c' || echo '$(srcdir)/'`gsttageditingprivate.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttageditingprivate.c' object='libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-gsttageditingprivate.lo `test -f 'gsttageditingprivate.c' || echo '$(srcdir)/'`gsttageditingprivate.c
+
+libgsttag_@GST_MAJORMINOR@_la-id3v2.lo: id3v2.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-id3v2.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-id3v2.lo `test -f 'id3v2.c' || echo '$(srcdir)/'`id3v2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='id3v2.c' object='libgsttag_@GST_MAJORMINOR@_la-id3v2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-id3v2.lo `test -f 'id3v2.c' || echo '$(srcdir)/'`id3v2.c
+
+libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo: id3v2frames.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2frames.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo `test -f 'id3v2frames.c' || echo '$(srcdir)/'`id3v2frames.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2frames.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-id3v2frames.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='id3v2frames.c' object='libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-id3v2frames.lo `test -f 'id3v2frames.c' || echo '$(srcdir)/'`id3v2frames.c
+
+libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo: xmpwriter.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) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo -MD -MP -MF $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-xmpwriter.Tpo -c -o libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo `test -f 'xmpwriter.c' || echo '$(srcdir)/'`xmpwriter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-xmpwriter.Tpo $(DEPDIR)/libgsttag_@GST_MAJORMINOR@_la-xmpwriter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xmpwriter.c' object='libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgsttag_@GST_MAJORMINOR@_la-xmpwriter.lo `test -f 'xmpwriter.c' || echo '$(srcdir)/'`xmpwriter.c
+
+mklangtables-mklangtables.o: mklangtables.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklangtables_CFLAGS) $(CFLAGS) -MT mklangtables-mklangtables.o -MD -MP -MF $(DEPDIR)/mklangtables-mklangtables.Tpo -c -o mklangtables-mklangtables.o `test -f 'mklangtables.c' || echo '$(srcdir)/'`mklangtables.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mklangtables-mklangtables.Tpo $(DEPDIR)/mklangtables-mklangtables.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mklangtables.c' object='mklangtables-mklangtables.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklangtables_CFLAGS) $(CFLAGS) -c -o mklangtables-mklangtables.o `test -f 'mklangtables.c' || echo '$(srcdir)/'`mklangtables.c
+
+mklangtables-mklangtables.obj: mklangtables.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklangtables_CFLAGS) $(CFLAGS) -MT mklangtables-mklangtables.obj -MD -MP -MF $(DEPDIR)/mklangtables-mklangtables.Tpo -c -o mklangtables-mklangtables.obj `if test -f 'mklangtables.c'; then $(CYGPATH_W) 'mklangtables.c'; else $(CYGPATH_W) '$(srcdir)/mklangtables.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mklangtables-mklangtables.Tpo $(DEPDIR)/mklangtables-mklangtables.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mklangtables.c' object='mklangtables-mklangtables.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklangtables_CFLAGS) $(CFLAGS) -c -o mklangtables-mklangtables.obj `if test -f 'mklangtables.c'; then $(CYGPATH_W) 'mklangtables.c'; else $(CYGPATH_W) '$(srcdir)/mklangtables.c'; fi`
+
+mklicensestables-mklicensestables.o: mklicensestables.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklicensestables_CFLAGS) $(CFLAGS) -MT mklicensestables-mklicensestables.o -MD -MP -MF $(DEPDIR)/mklicensestables-mklicensestables.Tpo -c -o mklicensestables-mklicensestables.o `test -f 'mklicensestables.c' || echo '$(srcdir)/'`mklicensestables.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mklicensestables-mklicensestables.Tpo $(DEPDIR)/mklicensestables-mklicensestables.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mklicensestables.c' object='mklicensestables-mklicensestables.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklicensestables_CFLAGS) $(CFLAGS) -c -o mklicensestables-mklicensestables.o `test -f 'mklicensestables.c' || echo '$(srcdir)/'`mklicensestables.c
+
+mklicensestables-mklicensestables.obj: mklicensestables.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklicensestables_CFLAGS) $(CFLAGS) -MT mklicensestables-mklicensestables.obj -MD -MP -MF $(DEPDIR)/mklicensestables-mklicensestables.Tpo -c -o mklicensestables-mklicensestables.obj `if test -f 'mklicensestables.c'; then $(CYGPATH_W) 'mklicensestables.c'; else $(CYGPATH_W) '$(srcdir)/mklicensestables.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mklicensestables-mklicensestables.Tpo $(DEPDIR)/mklicensestables-mklicensestables.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mklicensestables.c' object='mklicensestables-mklicensestables.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mklicensestables_CFLAGS) $(CFLAGS) -c -o mklicensestables-mklicensestables.obj `if test -f 'mklicensestables.c'; then $(CYGPATH_W) 'mklicensestables.c'; else $(CYGPATH_W) '$(srcdir)/mklicensestables.c'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-licensetransDATA: $(licensetrans_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(licensetransdir)" || $(MKDIR_P) "$(DESTDIR)$(licensetransdir)"
+ @list='$(licensetrans_DATA)'; test -n "$(licensetransdir)" || 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)$(licensetransdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(licensetransdir)" || exit $$?; \
+ done
+
+uninstall-licensetransDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(licensetrans_DATA)'; test -n "$(licensetransdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(licensetransdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(licensetransdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgsttagincludeHEADERS: $(libgsttaginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgsttagincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgsttagincludedir)"
+ @list='$(libgsttaginclude_HEADERS)'; test -n "$(libgsttagincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgsttagincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgsttagincludedir)" || exit $$?; \
+ done
+
+uninstall-libgsttagincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgsttaginclude_HEADERS)'; test -n "$(libgsttagincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgsttagincludedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgsttagincludedir)" && rm -f $$files
+
+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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(licensetransdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgsttagincludedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA install-libgsttagincludeHEADERS \
+ install-licensetransDATA install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgsttagincludeHEADERS uninstall-licensetransDATA \
+ uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libgsttagincludeHEADERS \
+ install-licensetransDATA install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ install-typelibsDATA 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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgsttagincludeHEADERS uninstall-licensetransDATA \
+ uninstall-typelibsDATA
+
+
+@HAVE_INTROSPECTION_TRUE@GstTag-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgsttag-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstTag \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgsttag-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstBase-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-tag-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+update-isocodes: mklangtables
+ $(builddir)/mklangtables > $(srcdir)/lang-tables.dat && \
+ echo "Updated lang-tables.dat"
+
+update-licenses: mklicensestables
+ $(builddir)/mklicensestables \
+ --translation-dictionary=$(srcdir)/license-translations.dict \
+ > $(srcdir)/licenses-tables.dat && \
+ echo "Updated licenses-tables.dat and license-translations.dict"
+#endif
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT libgsttag -:SHARED libgsttag-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttag_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgsttag_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgsttag_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgsttag_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgsttaginclude_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/tag/gstexiftag.c b/gst-libs/gst/tag/gstexiftag.c
new file mode 100644
index 0000000..967f535
--- /dev/null
+++ b/gst-libs/gst/tag/gstexiftag.c
@@ -0,0 +1,2751 @@
+/* GStreamer
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * gstexiftag.c: library for reading / modifying exif tags
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttagexif
+ * @short_description: tag mappings and support functions for plugins
+ * dealing with exif tags
+ * @see_also: #GstTagList
+ *
+ * Contains utility function to parse #GstTagList<!-- -->s from exif
+ * buffers and to create exif buffers from #GstTagList<!-- -->s
+ *
+ * Note that next IFD fields on the created exif buffers are set to 0.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gsttagsetter.h>
+#include <gst/base/gstbytewriter.h>
+#include "gsttageditingprivate.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gst/math-compat.h>
+
+/* Some useful constants */
+#define TIFF_LITTLE_ENDIAN 0x4949
+#define TIFF_BIG_ENDIAN 0x4D4D
+#define TIFF_HEADER_SIZE 8
+#define EXIF_TAG_ENTRY_SIZE (2 + 2 + 4 + 4)
+
+/* Exif tag types */
+#define EXIF_TYPE_BYTE 1
+#define EXIF_TYPE_ASCII 2
+#define EXIF_TYPE_SHORT 3
+#define EXIF_TYPE_LONG 4
+#define EXIF_TYPE_RATIONAL 5
+#define EXIF_TYPE_UNDEFINED 7
+#define EXIF_TYPE_SLONG 9
+#define EXIF_TYPE_SRATIONAL 10
+
+typedef struct _GstExifTagMatch GstExifTagMatch;
+typedef struct _GstExifWriter GstExifWriter;
+typedef struct _GstExifReader GstExifReader;
+typedef struct _GstExifTagData GstExifTagData;
+
+typedef void (*GstExifSerializationFunc) (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag);
+
+/*
+ * Function used to deserialize tags that don't follow the usual
+ * deserialization conversions. Usually those that have 'Ref' complementary
+ * tags.
+ *
+ * Those functions receive a exif tag data in the parameters, plus the taglist
+ * and the reader and buffer if they need to get more information to build
+ * its tags. There are lots of parameters, but this is needed to make it
+ * versatile. Explanation of them follows:
+ *
+ * exif_reader: The #GstExifReader with the reading parameter and taglist for
+ * results.
+ * reader: The #GstByteReader pointing to the start of the next tag entry in
+ * the ifd, useful for tags that use other complementary tags.
+ * the buffer start
+ * exiftag: The #GstExifTagMatch that contains this tag info
+ * tagdata: values from the already parsed tag
+ */
+typedef gint (*GstExifDeserializationFunc) (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata);
+
+#define EXIF_SERIALIZATION_FUNC(name) \
+static void serialize_ ## name (GstExifWriter * writer, \
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+
+#define EXIF_DESERIALIZATION_FUNC(name) \
+static gint deserialize_ ## name (GstExifReader * exif_reader, \
+ GstByteReader * reader, const GstExifTagMatch * exiftag, \
+ GstExifTagData * tagdata)
+
+#define EXIF_SERIALIZATION_DESERIALIZATION_FUNC(name) \
+ EXIF_SERIALIZATION_FUNC (name); \
+ EXIF_DESERIALIZATION_FUNC (name)
+
+/*
+ * A common case among serialization/deserialization routines is that
+ * the gstreamer tag is a string (with a predefined set of allowed values)
+ * and exif is an int. These macros cover these cases
+ */
+#define EXIF_SERIALIZATION_MAP_STRING_TO_INT_FUNC(name,funcname) \
+static void \
+serialize_ ## name (GstExifWriter * writer, const GstTagList * taglist, \
+ const GstExifTagMatch * exiftag) \
+{ \
+ gchar *str = NULL; \
+ gint exif_value; \
+\
+ if (!gst_tag_list_get_string_index (taglist, exiftag->gst_tag, 0, &str)) { \
+ GST_WARNING ("No %s tag present in taglist", exiftag->gst_tag); \
+ return; \
+ } \
+\
+ exif_value = __exif_tag_ ## funcname ## _to_exif_value (str); \
+ if (exif_value == -1) { \
+ g_free (str); \
+ return; \
+ } \
+ g_free (str); \
+\
+ switch (exiftag->exif_type) { \
+ case EXIF_TYPE_SHORT: \
+ gst_exif_writer_write_short_tag (writer, exiftag->exif_tag, exif_value); \
+ break; \
+ case EXIF_TYPE_LONG: \
+ gst_exif_writer_write_long_tag (writer, exiftag->exif_tag, exif_value); \
+ break; \
+ case EXIF_TYPE_UNDEFINED: \
+ { \
+ guint8 data = (guint8) exif_value; \
+ write_exif_undefined_tag (writer, exiftag->exif_tag, &data, 1); \
+ } \
+ break; \
+ default: \
+ g_assert_not_reached (); \
+ GST_WARNING ("Unmapped serialization for type %d", exiftag->exif_type); \
+ break; \
+ } \
+}
+
+#define EXIF_DESERIALIZATION_MAP_STRING_TO_INT_FUNC(name,funcname) \
+static gint \
+deserialize_ ## name (GstExifReader * exif_reader, \
+ GstByteReader * reader, const GstExifTagMatch * exiftag, \
+ GstExifTagData * tagdata) \
+{ \
+ const gchar *str = NULL; \
+ gint value; \
+\
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag, \
+ exiftag->exif_tag); \
+\
+ /* validate tag */ \
+ if (tagdata->count != 1) { \
+ GST_WARNING ("0x%X has unexpected count", tagdata->count); \
+ return 0; \
+ } \
+\
+ if (tagdata->tag_type == EXIF_TYPE_SHORT) { \
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) { \
+ value = GST_READ_UINT16_LE (tagdata->offset_as_data); \
+ } else { \
+ value = GST_READ_UINT16_BE (tagdata->offset_as_data); \
+ } \
+ } else if (tagdata->tag_type == EXIF_TYPE_UNDEFINED) { \
+ value = GST_READ_UINT8 (tagdata->offset_as_data); \
+ } else { \
+ GST_WARNING ("0x%X has unexpected type %d", exiftag->exif_tag, \
+ tagdata->tag_type); \
+ return 0; \
+ } \
+\
+ str = __exif_tag_## funcname ## _from_exif_value (value); \
+ if (str == NULL) { \
+ GST_WARNING ("Invalid value for tag 0x%X: %d", tagdata->tag, value); \
+ return 0; \
+ } \
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE, \
+ exiftag->gst_tag, str, NULL); \
+\
+ return 0; \
+}
+
+#define EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC(name,funcname) \
+ EXIF_SERIALIZATION_MAP_STRING_TO_INT_FUNC(name,funcname); \
+ EXIF_DESERIALIZATION_MAP_STRING_TO_INT_FUNC(name,funcname);
+
+struct _GstExifTagMatch
+{
+ const gchar *gst_tag;
+ guint16 exif_tag;
+ guint16 exif_type;
+
+ /* for tags that need special handling */
+ guint16 complementary_tag;
+ GstExifSerializationFunc serialize;
+ GstExifDeserializationFunc deserialize;
+};
+
+struct _GstExifTagData
+{
+ guint16 tag;
+ guint16 tag_type;
+ guint32 count;
+ guint32 offset;
+ const guint8 *offset_as_data;
+};
+
+/*
+ * Holds the info and variables necessary to write
+ * the exif tags properly
+ */
+struct _GstExifWriter
+{
+ GstByteWriter tagwriter;
+ GstByteWriter datawriter;
+
+ gint byte_order;
+ guint tags_total;
+};
+
+struct _GstExifReader
+{
+ GstTagList *taglist;
+ GstBuffer *buffer;
+ guint32 base_offset;
+ gint byte_order;
+
+ /* tags waiting for their complementary tags */
+ GSList *pending_tags;
+};
+
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (aperture_value);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (contrast);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (exposure_program);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (exposure_mode);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (flash);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (gain_control);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (geo_coordinate);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (geo_direction);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (geo_elevation);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (metering_mode);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (orientation);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (saturation);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (scene_capture_type);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (scene_type);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (sensitivity_type);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (sharpness);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (shutter_speed);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (source);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (speed);
+EXIF_SERIALIZATION_DESERIALIZATION_FUNC (white_balance);
+
+EXIF_DESERIALIZATION_FUNC (resolution);
+EXIF_DESERIALIZATION_FUNC (add_to_pending_tags);
+
+/* FIXME copyright tag has a weird "artist\0editor\0" format that is
+ * not yet handled */
+
+/* exif tag numbers */
+#define EXIF_TAG_GPS_LATITUDE_REF 0x1
+#define EXIF_TAG_GPS_LATITUDE 0x2
+#define EXIF_TAG_GPS_LONGITUDE_REF 0x3
+#define EXIF_TAG_GPS_LONGITUDE 0x4
+#define EXIF_TAG_GPS_ALTITUDE_REF 0x5
+#define EXIF_TAG_GPS_ALTITUDE 0x6
+#define EXIF_TAG_GPS_SPEED_REF 0xC
+#define EXIF_TAG_GPS_SPEED 0xD
+#define EXIF_TAG_GPS_TRACK_REF 0xE
+#define EXIF_TAG_GPS_TRACK 0xF
+#define EXIF_TAG_GPS_IMAGE_DIRECTION_REF 0x10
+#define EXIF_TAG_GPS_IMAGE_DIRECTION 0x11
+#define EXIF_TAG_GPS_HORIZONTAL_POSITIONING_ERROR 0x1F
+#define EXIF_TAG_IMAGE_DESCRIPTION 0x10E
+#define EXIF_TAG_MAKE 0x10F
+#define EXIF_TAG_MODEL 0x110
+#define EXIF_TAG_ORIENTATION 0x112
+#define EXIF_TAG_XRESOLUTION 0x11A
+#define EXIF_TAG_YRESOLUTION 0x11B
+#define EXIF_TAG_RESOLUTION_UNIT 0x128
+#define EXIF_TAG_SOFTWARE 0x131
+#define EXIF_TAG_DATE_TIME 0x132
+#define EXIF_TAG_ARTIST 0x13B
+#define EXIF_TAG_COPYRIGHT 0x8298
+#define EXIF_TAG_EXPOSURE_TIME 0x829A
+#define EXIF_TAG_F_NUMBER 0x829D
+#define EXIF_TAG_EXPOSURE_PROGRAM 0x8822
+#define EXIF_TAG_PHOTOGRAPHIC_SENSITIVITY 0x8827
+#define EXIF_TAG_SENSITIVITY_TYPE 0x8830
+#define EXIF_TAG_ISO_SPEED 0x8833
+#define EXIF_TAG_DATE_TIME_ORIGINAL 0x9003
+#define EXIF_TAG_DATE_TIME_DIGITIZED 0x9004
+#define EXIF_TAG_SHUTTER_SPEED_VALUE 0x9201
+#define EXIF_TAG_APERTURE_VALUE 0x9202
+#define EXIF_TAG_EXPOSURE_BIAS 0x9204
+#define EXIF_TAG_METERING_MODE 0x9207
+#define EXIF_TAG_FLASH 0x9209
+#define EXIF_TAG_FOCAL_LENGTH 0x920A
+#define EXIF_TAG_MAKER_NOTE 0x927C
+#define EXIF_TAG_FILE_SOURCE 0xA300
+#define EXIF_TAG_SCENE_TYPE 0xA301
+#define EXIF_TAG_EXPOSURE_MODE 0xA402
+#define EXIF_TAG_WHITE_BALANCE 0xA403
+#define EXIF_TAG_DIGITAL_ZOOM_RATIO 0xA404
+#define EXIF_TAG_SCENE_CAPTURE_TYPE 0xA406
+#define EXIF_TAG_GAIN_CONTROL 0xA407
+#define EXIF_TAG_CONTRAST 0xA408
+#define EXIF_TAG_SATURATION 0xA409
+#define EXIF_TAG_SHARPNESS 0xA40A
+
+/* IFD pointer tags */
+#define EXIF_IFD_TAG 0x8769
+#define EXIF_GPS_IFD_TAG 0x8825
+
+/* version tags */
+#define EXIF_VERSION_TAG 0x9000
+#define EXIF_FLASHPIX_VERSION_TAG 0xA000
+
+/* useful macros for speed tag */
+#define METERS_PER_SECOND_TO_KILOMETERS_PER_HOUR (3.6)
+#define KILOMETERS_PER_HOUR_TO_METERS_PER_SECOND (1/3.6)
+#define MILES_PER_HOUR_TO_METERS_PER_SECOND (0.44704)
+#define KNOTS_TO_METERS_PER_SECOND (0.514444)
+
+/*
+ * Should be kept in ascending id order
+ *
+ * {gst-tag, exif-tag, exig-type, complementary-exif-tag, serialization-func,
+ * deserialization-func}
+ */
+static const GstExifTagMatch tag_map_ifd0[] = {
+ {GST_TAG_IMAGE_HORIZONTAL_PPI, EXIF_TAG_XRESOLUTION, EXIF_TYPE_RATIONAL,
+ 0, NULL, deserialize_add_to_pending_tags},
+ {GST_TAG_IMAGE_VERTICAL_PPI, EXIF_TAG_YRESOLUTION, EXIF_TYPE_RATIONAL,
+ 0, NULL, deserialize_add_to_pending_tags},
+ {NULL, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT, 0, NULL,
+ deserialize_resolution},
+ {GST_TAG_DESCRIPTION, EXIF_TAG_IMAGE_DESCRIPTION, EXIF_TYPE_ASCII, 0, NULL,
+ NULL},
+ {GST_TAG_DEVICE_MANUFACTURER, EXIF_TAG_MAKE, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {GST_TAG_DEVICE_MODEL, EXIF_TAG_MODEL, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {GST_TAG_IMAGE_ORIENTATION, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT, 0,
+ serialize_orientation,
+ deserialize_orientation},
+ {GST_TAG_APPLICATION_NAME, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {GST_TAG_DATE_TIME, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {GST_TAG_ARTIST, EXIF_TAG_ARTIST, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {GST_TAG_COPYRIGHT, EXIF_TAG_COPYRIGHT, EXIF_TYPE_ASCII, 0, NULL, NULL},
+ {NULL, EXIF_IFD_TAG, EXIF_TYPE_LONG, 0, NULL, NULL},
+ {NULL, EXIF_GPS_IFD_TAG, EXIF_TYPE_LONG, 0, NULL, NULL},
+ {NULL, 0, 0, 0, NULL, NULL}
+};
+
+static const GstExifTagMatch tag_map_exif[] = {
+ {GST_TAG_CAPTURING_SHUTTER_SPEED, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL,
+ 0,
+ NULL, NULL},
+ {GST_TAG_CAPTURING_FOCAL_RATIO, EXIF_TAG_F_NUMBER, EXIF_TYPE_RATIONAL, 0,
+ NULL,
+ NULL},
+ {GST_TAG_CAPTURING_EXPOSURE_PROGRAM, EXIF_TAG_EXPOSURE_PROGRAM,
+ EXIF_TYPE_SHORT, 0, serialize_exposure_program,
+ deserialize_exposure_program},
+
+ /* don't need the serializer as we always write the iso speed alone */
+ {GST_TAG_CAPTURING_ISO_SPEED, EXIF_TAG_PHOTOGRAPHIC_SENSITIVITY,
+ EXIF_TYPE_SHORT, 0, NULL,
+ deserialize_add_to_pending_tags},
+
+ {GST_TAG_CAPTURING_ISO_SPEED, EXIF_TAG_SENSITIVITY_TYPE, EXIF_TYPE_SHORT, 0,
+ serialize_sensitivity_type, deserialize_sensitivity_type},
+ {GST_TAG_CAPTURING_ISO_SPEED, EXIF_TAG_ISO_SPEED, EXIF_TYPE_LONG, 0, NULL,
+ NULL},
+ {NULL, EXIF_VERSION_TAG, EXIF_TYPE_UNDEFINED, 0, NULL, NULL},
+ {GST_TAG_DATE_TIME, EXIF_TAG_DATE_TIME_ORIGINAL, EXIF_TYPE_ASCII, 0, NULL,
+ NULL},
+ {GST_TAG_CAPTURING_SHUTTER_SPEED, EXIF_TAG_SHUTTER_SPEED_VALUE,
+ EXIF_TYPE_SRATIONAL, 0,
+ serialize_shutter_speed, deserialize_shutter_speed},
+ {GST_TAG_CAPTURING_FOCAL_RATIO, EXIF_TAG_APERTURE_VALUE, EXIF_TYPE_RATIONAL,
+ 0,
+ serialize_aperture_value, deserialize_aperture_value},
+ {GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, EXIF_TAG_EXPOSURE_BIAS,
+ EXIF_TYPE_SRATIONAL, 0, NULL, NULL},
+ {GST_TAG_CAPTURING_METERING_MODE, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT, 0,
+ serialize_metering_mode, deserialize_metering_mode},
+ {GST_TAG_CAPTURING_FLASH_FIRED, EXIF_TAG_FLASH, EXIF_TYPE_SHORT, 0,
+ serialize_flash, deserialize_flash},
+ {GST_TAG_CAPTURING_FOCAL_LENGTH, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL, 0,
+ NULL, NULL},
+ {GST_TAG_APPLICATION_DATA, EXIF_TAG_MAKER_NOTE, EXIF_TYPE_UNDEFINED, 0, NULL,
+ NULL},
+ {NULL, EXIF_FLASHPIX_VERSION_TAG, EXIF_TYPE_UNDEFINED, 0, NULL, NULL},
+ {GST_TAG_CAPTURING_SOURCE, EXIF_TAG_FILE_SOURCE, EXIF_TYPE_UNDEFINED,
+ 0, serialize_source, deserialize_source},
+ {GST_TAG_CAPTURING_SOURCE, EXIF_TAG_SCENE_TYPE, EXIF_TYPE_UNDEFINED,
+ 0, serialize_scene_type, deserialize_scene_type},
+ {GST_TAG_CAPTURING_EXPOSURE_MODE, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_SHORT,
+ 0, serialize_exposure_mode, deserialize_exposure_mode},
+ {GST_TAG_CAPTURING_WHITE_BALANCE, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_SHORT,
+ 0, serialize_white_balance, deserialize_white_balance},
+ {GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, EXIF_TAG_DIGITAL_ZOOM_RATIO,
+ EXIF_TYPE_RATIONAL, 0, NULL,
+ NULL},
+ {GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, EXIF_TAG_SCENE_CAPTURE_TYPE,
+ EXIF_TYPE_SHORT, 0, serialize_scene_capture_type,
+ deserialize_scene_capture_type},
+ {GST_TAG_CAPTURING_GAIN_ADJUSTMENT, EXIF_TAG_GAIN_CONTROL,
+ EXIF_TYPE_SHORT, 0, serialize_gain_control,
+ deserialize_gain_control},
+ {GST_TAG_CAPTURING_CONTRAST, EXIF_TAG_CONTRAST, EXIF_TYPE_SHORT, 0,
+ serialize_contrast, deserialize_contrast},
+ {GST_TAG_CAPTURING_SATURATION, EXIF_TAG_SATURATION, EXIF_TYPE_SHORT, 0,
+ serialize_saturation, deserialize_saturation},
+ {GST_TAG_CAPTURING_SHARPNESS, EXIF_TAG_SHARPNESS, EXIF_TYPE_SHORT, 0,
+ serialize_sharpness, deserialize_sharpness},
+ {NULL, 0, 0, 0, NULL, NULL}
+};
+
+static const GstExifTagMatch tag_map_gps[] = {
+ {GST_TAG_GEO_LOCATION_LATITUDE, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL,
+ EXIF_TAG_GPS_LATITUDE_REF,
+ serialize_geo_coordinate, deserialize_geo_coordinate},
+ {GST_TAG_GEO_LOCATION_LONGITUDE, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL,
+ EXIF_TAG_GPS_LONGITUDE_REF,
+ serialize_geo_coordinate, deserialize_geo_coordinate},
+ {GST_TAG_GEO_LOCATION_ELEVATION, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL,
+ EXIF_TAG_GPS_ALTITUDE_REF,
+ serialize_geo_elevation, deserialize_geo_elevation},
+ {GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, EXIF_TAG_GPS_SPEED, EXIF_TYPE_RATIONAL,
+ EXIF_TAG_GPS_SPEED_REF,
+ serialize_speed, deserialize_speed},
+ {GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, EXIF_TAG_GPS_TRACK,
+ EXIF_TYPE_RATIONAL, EXIF_TAG_GPS_TRACK_REF,
+ serialize_geo_direction, deserialize_geo_direction},
+ {GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, EXIF_TAG_GPS_IMAGE_DIRECTION,
+ EXIF_TYPE_RATIONAL, EXIF_TAG_GPS_IMAGE_DIRECTION_REF,
+ serialize_geo_direction, deserialize_geo_direction},
+ {GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR,
+ EXIF_TAG_GPS_HORIZONTAL_POSITIONING_ERROR,
+ EXIF_TYPE_RATIONAL, 0, NULL, NULL},
+ {NULL, 0, 0, 0, NULL, NULL}
+};
+
+/* GstExifReader functions */
+static void
+gst_exif_reader_init (GstExifReader * reader, gint byte_order,
+ GstBuffer * buf, guint32 base_offset)
+{
+ ensure_exif_tags ();
+
+ reader->taglist = gst_tag_list_new ();
+ reader->buffer = buf;
+ reader->base_offset = base_offset;
+ reader->byte_order = byte_order;
+ reader->pending_tags = NULL;
+ if (reader->byte_order != G_LITTLE_ENDIAN &&
+ reader->byte_order != G_BIG_ENDIAN) {
+ GST_WARNING ("Unexpected byte order %d, using system default: %d",
+ reader->byte_order, G_BYTE_ORDER);
+ reader->byte_order = G_BYTE_ORDER;
+ }
+}
+
+static void
+gst_exif_reader_add_pending_tag (GstExifReader * reader, GstExifTagData * data)
+{
+ GstExifTagData *copy;
+
+ copy = g_slice_new (GstExifTagData);
+ memcpy (copy, data, sizeof (GstExifTagData));
+
+ reader->pending_tags = g_slist_prepend (reader->pending_tags, copy);
+}
+
+static GstExifTagData *
+gst_exif_reader_get_pending_tag (GstExifReader * reader, gint tagid)
+{
+ GSList *walker;
+
+ for (walker = reader->pending_tags; walker; walker = g_slist_next (walker)) {
+ GstExifTagData *data = (GstExifTagData *) walker->data;
+ if (data->tag == tagid)
+ return data;
+ }
+
+ return NULL;
+}
+
+static GstTagList *
+gst_exif_reader_reset (GstExifReader * reader, gboolean return_taglist)
+{
+ GstTagList *ret = NULL;
+ GSList *walker;
+
+ for (walker = reader->pending_tags; walker; walker = g_slist_next (walker)) {
+ GstExifTagData *data = (GstExifTagData *) walker->data;
+
+ g_slice_free (GstExifTagData, data);
+ }
+ g_slist_free (reader->pending_tags);
+
+ if (return_taglist) {
+ ret = reader->taglist;
+ reader->taglist = NULL;
+ }
+
+ if (reader->taglist) {
+ gst_tag_list_free (reader->taglist);
+ }
+
+ return ret;
+}
+
+/* GstExifWriter functions */
+
+static void
+gst_exif_writer_init (GstExifWriter * writer, gint byte_order)
+{
+ ensure_exif_tags ();
+
+ gst_byte_writer_init (&writer->tagwriter);
+ gst_byte_writer_init (&writer->datawriter);
+
+ writer->byte_order = byte_order;
+ writer->tags_total = 0;
+ if (writer->byte_order != G_LITTLE_ENDIAN &&
+ writer->byte_order != G_BIG_ENDIAN) {
+ GST_WARNING ("Unexpected byte order %d, using system default: %d",
+ writer->byte_order, G_BYTE_ORDER);
+ writer->byte_order = G_BYTE_ORDER;
+ }
+}
+
+static GstBuffer *
+gst_exif_writer_reset_and_get_buffer (GstExifWriter * writer)
+{
+ GstBuffer *header;
+ GstBuffer *data;
+
+ header = gst_byte_writer_reset_and_get_buffer (&writer->tagwriter);
+ data = gst_byte_writer_reset_and_get_buffer (&writer->datawriter);
+
+ return gst_buffer_join (header, data);
+}
+
+/*
+ * Given the exif tag with the passed id, returns the map index of the tag
+ * corresponding to it. If use_complementary is true, then the complementary
+ * are also used in the search.
+ *
+ * Returns -1 if not found
+ */
+static gint
+exif_tag_map_find_reverse (guint16 exif_tag, const GstExifTagMatch * tag_map,
+ gboolean use_complementary)
+{
+ gint i;
+
+ for (i = 0; tag_map[i].exif_tag != 0; i++) {
+ if (exif_tag == tag_map[i].exif_tag || (use_complementary &&
+ exif_tag == tag_map[i].complementary_tag)) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+static gboolean
+gst_tag_list_has_ifd_tags (const GstTagList * taglist,
+ const GstExifTagMatch * tag_map)
+{
+ gint i;
+
+ for (i = 0; tag_map[i].exif_tag != 0; i++) {
+ if (tag_map[i].gst_tag == NULL) {
+ if (tag_map[i].exif_tag == EXIF_GPS_IFD_TAG &&
+ gst_tag_list_has_ifd_tags (taglist, tag_map_gps))
+ return TRUE;
+ if (tag_map[i].exif_tag == EXIF_IFD_TAG &&
+ gst_tag_list_has_ifd_tags (taglist, tag_map_exif))
+ return TRUE;
+ continue;
+ }
+
+ if (gst_tag_list_get_value_index (taglist, tag_map[i].gst_tag, 0)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * Writes the tag entry.
+ *
+ * The tag entry is the tag id, the tag type,
+ * the count and the offset.
+ *
+ * The offset is the on the amount of data writen so far, as one
+ * can't predict the total bytes that the tag entries will take.
+ * This means those fields requires being updated later.
+ */
+static void
+gst_exif_writer_write_tag_header (GstExifWriter * writer,
+ guint16 exif_tag, guint16 exif_type, guint32 count, guint32 offset,
+ gboolean is_data)
+{
+ GST_DEBUG ("Writing tag entry: id %x, type %u, count %u, offset %u",
+ exif_tag, exif_type, count, offset);
+
+ if (writer->byte_order == G_LITTLE_ENDIAN) {
+ gst_byte_writer_put_uint16_le (&writer->tagwriter, exif_tag);
+ gst_byte_writer_put_uint16_le (&writer->tagwriter, exif_type);
+ gst_byte_writer_put_uint32_le (&writer->tagwriter, count);
+ gst_byte_writer_put_uint32_le (&writer->tagwriter, offset);
+ } else if (writer->byte_order == G_BIG_ENDIAN) {
+ gst_byte_writer_put_uint16_be (&writer->tagwriter, exif_tag);
+ gst_byte_writer_put_uint16_be (&writer->tagwriter, exif_type);
+ gst_byte_writer_put_uint32_be (&writer->tagwriter, count);
+ if (is_data) {
+ gst_byte_writer_put_uint32_le (&writer->tagwriter, offset);
+ } else {
+ gst_byte_writer_put_uint32_be (&writer->tagwriter, offset);
+ }
+ } else {
+ g_assert_not_reached ();
+ }
+
+ writer->tags_total++;
+}
+
+static void
+gst_exif_writer_write_rational_data (GstExifWriter * writer, guint32 frac_n,
+ guint32 frac_d)
+{
+ if (writer->byte_order == G_LITTLE_ENDIAN) {
+ gst_byte_writer_put_uint32_le (&writer->datawriter, frac_n);
+ gst_byte_writer_put_uint32_le (&writer->datawriter, frac_d);
+ } else {
+ gst_byte_writer_put_uint32_be (&writer->datawriter, frac_n);
+ gst_byte_writer_put_uint32_be (&writer->datawriter, frac_d);
+ }
+}
+
+static void
+gst_exif_writer_write_signed_rational_data (GstExifWriter * writer,
+ gint32 frac_n, gint32 frac_d)
+{
+ if (writer->byte_order == G_LITTLE_ENDIAN) {
+ gst_byte_writer_put_int32_le (&writer->datawriter, frac_n);
+ gst_byte_writer_put_int32_le (&writer->datawriter, frac_d);
+ } else {
+ gst_byte_writer_put_int32_be (&writer->datawriter, frac_n);
+ gst_byte_writer_put_int32_be (&writer->datawriter, frac_d);
+ }
+}
+
+static void
+gst_exif_writer_write_rational_tag (GstExifWriter * writer,
+ guint16 tag, guint32 frac_n, guint32 frac_d)
+{
+ guint32 offset = gst_byte_writer_get_size (&writer->datawriter);
+
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_RATIONAL,
+ 1, offset, FALSE);
+
+ gst_exif_writer_write_rational_data (writer, frac_n, frac_d);
+}
+
+static void
+gst_exif_writer_write_signed_rational_tag (GstExifWriter * writer,
+ guint16 tag, gint32 frac_n, gint32 frac_d)
+{
+ guint32 offset = gst_byte_writer_get_size (&writer->datawriter);
+
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_SRATIONAL,
+ 1, offset, FALSE);
+
+ gst_exif_writer_write_signed_rational_data (writer, frac_n, frac_d);
+}
+
+static void
+gst_exif_writer_write_rational_tag_from_double (GstExifWriter * writer,
+ guint16 tag, gdouble value)
+{
+ gint frac_n;
+ gint frac_d;
+
+ gst_util_double_to_fraction (value, &frac_n, &frac_d);
+
+ gst_exif_writer_write_rational_tag (writer, tag, frac_n, frac_d);
+}
+
+static void
+gst_exif_writer_write_signed_rational_tag_from_double (GstExifWriter * writer,
+ guint16 tag, gdouble value)
+{
+ gint frac_n;
+ gint frac_d;
+
+ gst_util_double_to_fraction (value, &frac_n, &frac_d);
+
+ gst_exif_writer_write_signed_rational_tag (writer, tag, frac_n, frac_d);
+}
+
+static void
+gst_exif_writer_write_byte_tag (GstExifWriter * writer, guint16 tag,
+ guint8 value)
+{
+ guint32 offset = 0;
+
+ GST_WRITE_UINT8 ((guint8 *) & offset, value);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_BYTE,
+ 1, offset, TRUE);
+}
+
+static void
+gst_exif_writer_write_short_tag (GstExifWriter * writer, guint16 tag,
+ guint16 value)
+{
+ guint32 offset = 0;
+
+ if (writer->byte_order == G_LITTLE_ENDIAN) {
+ GST_WRITE_UINT16_LE ((guint8 *) & offset, value);
+ } else {
+ GST_WRITE_UINT16_BE ((guint8 *) & offset, value);
+ }
+
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_SHORT,
+ 1, offset, TRUE);
+}
+
+static void
+gst_exif_writer_write_long_tag (GstExifWriter * writer, guint16 tag,
+ guint32 value)
+{
+ guint32 offset = 0;
+ if (writer->byte_order == G_LITTLE_ENDIAN) {
+ GST_WRITE_UINT32_LE ((guint8 *) & offset, value);
+ } else {
+ GST_WRITE_UINT32_BE ((guint8 *) & offset, value);
+ }
+
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_LONG,
+ 1, offset, TRUE);
+}
+
+
+static void
+write_exif_undefined_tag (GstExifWriter * writer, guint16 tag,
+ const guint8 * data, gint size)
+{
+ guint32 offset = 0;
+
+ if (size > 4) {
+ /* we only use the data offset here, later we add up the
+ * resulting tag headers offset and the base offset */
+ offset = gst_byte_writer_get_size (&writer->datawriter);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_UNDEFINED,
+ size, offset, FALSE);
+ gst_byte_writer_put_data (&writer->datawriter, data, size);
+ } else {
+ /* small enough to go in the offset */
+ memcpy ((guint8 *) & offset, data, size);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_UNDEFINED,
+ size, offset, TRUE);
+ }
+}
+
+static void
+write_exif_ascii_tag (GstExifWriter * writer, guint16 tag, const gchar * str)
+{
+ gint size;
+ guint32 offset = 0;
+ gchar *ascii_str;
+ gsize ascii_size;
+ GError *error = NULL;
+
+ size = strlen (str) + 1;
+
+ ascii_str =
+ g_convert (str, size, "latin1", "utf8", NULL, &ascii_size, &error);
+
+ if (error) {
+ GST_WARNING ("Failed to convert exif tag to ascii: 0x%x - %s. Error: %s",
+ tag, str, error->message);
+ g_error_free (error);
+ g_free (ascii_str);
+ return;
+ }
+
+ /* add the \0 at the end */
+ ascii_size++;
+
+ if (ascii_size > 4) {
+ /* we only use the data offset here, later we add up the
+ * resulting tag headers offset and the base offset */
+ offset = gst_byte_writer_get_size (&writer->datawriter);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_ASCII,
+ ascii_size, offset, FALSE);
+ gst_byte_writer_put_string (&writer->datawriter, ascii_str);
+ } else {
+ /* small enough to go in the offset */
+ memcpy ((guint8 *) & offset, ascii_str, ascii_size);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_ASCII,
+ ascii_size, offset, TRUE);
+ }
+
+ g_free (ascii_str);
+}
+
+static void
+write_exif_ascii_tag_from_taglist (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+{
+ gchar *str = NULL;
+ gboolean cleanup = FALSE;
+ const GValue *value;
+ gint tag_size = gst_tag_list_get_tag_size (taglist, exiftag->gst_tag);
+
+ if (tag_size != 1) {
+ /* FIXME support this by serializing them with a ','? */
+ GST_WARNING ("Multiple string tags not supported yet");
+ return;
+ }
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+
+ /* do some conversion if needed */
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_STRING:
+ str = (gchar *) g_value_get_string (value);
+ break;
+ default:
+ if (G_VALUE_TYPE (value) == GST_TYPE_DATE_TIME) {
+ GstDateTime *dt = (GstDateTime *) g_value_get_boxed (value);
+
+ if (dt == NULL) {
+ GST_WARNING ("NULL datetime received");
+ break;
+ }
+
+ str = g_strdup_printf ("%04d:%02d:%02d %02d:%02d:%02d",
+ gst_date_time_get_year (dt), gst_date_time_get_month (dt),
+ gst_date_time_get_day (dt), gst_date_time_get_hour (dt),
+ gst_date_time_get_minute (dt), gst_date_time_get_second (dt));
+
+ cleanup = TRUE;
+ } else {
+ GST_WARNING ("Conversion from %s to ascii string not supported",
+ G_VALUE_TYPE_NAME (value));
+ }
+ break;
+ }
+
+ if (str == NULL)
+ return;
+
+ write_exif_ascii_tag (writer, exiftag->exif_tag, str);
+ if (cleanup)
+ g_free (str);
+}
+
+static void
+write_exif_undefined_tag_from_taglist (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+{
+ const GValue *value;
+ guint8 *data = NULL;
+ gsize size = 0;
+ gint tag_size = gst_tag_list_get_tag_size (taglist, exiftag->gst_tag);
+ GstBuffer *buf = NULL;
+
+ if (tag_size != 1) {
+ GST_WARNING ("Only the first item in the taglist will be serialized");
+ return;
+ }
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+
+ /* do some conversion if needed */
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_STRING:
+ data = (guint8 *) g_value_get_string (value);
+ size = strlen ((gchar *) data); /* no need to +1, undefined doesn't require it */
+ break;
+ default:
+ if (G_VALUE_TYPE (value) == GST_TYPE_BUFFER) {
+ buf = gst_value_get_buffer (value);
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ } else {
+ GST_WARNING ("Conversion from %s to raw data not supported",
+ G_VALUE_TYPE_NAME (value));
+ }
+ break;
+ }
+
+ if (size > 0)
+ write_exif_undefined_tag (writer, exiftag->exif_tag, data, size);
+
+ if (buf)
+ gst_buffer_unmap (buf, data, size);
+}
+
+static void
+write_exif_rational_tag_from_taglist (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+{
+ const GValue *value;
+ gdouble num = 0;
+ gint tag_size = gst_tag_list_get_tag_size (taglist, exiftag->gst_tag);
+
+ if (tag_size != 1) {
+ GST_WARNING ("Only the first item in the taglist will be serialized");
+ return;
+ }
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+
+ /* do some conversion if needed */
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_DOUBLE:
+ num = g_value_get_double (value);
+ gst_exif_writer_write_rational_tag_from_double (writer, exiftag->exif_tag,
+ num);
+ break;
+ default:
+ if (G_VALUE_TYPE (value) == GST_TYPE_FRACTION) {
+ gst_exif_writer_write_rational_tag (writer, exiftag->exif_tag,
+ gst_value_get_fraction_numerator (value),
+ gst_value_get_fraction_denominator (value));
+ } else {
+ GST_WARNING ("Conversion from %s to rational not supported",
+ G_VALUE_TYPE_NAME (value));
+ }
+ break;
+ }
+}
+
+static void
+write_exif_signed_rational_tag_from_taglist (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+{
+ const GValue *value;
+ gdouble num = 0;
+ gint tag_size = gst_tag_list_get_tag_size (taglist, exiftag->gst_tag);
+
+ if (tag_size != 1) {
+ GST_WARNING ("Only the first item in the taglist will be serialized");
+ return;
+ }
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+
+ /* do some conversion if needed */
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_DOUBLE:
+ num = g_value_get_double (value);
+ gst_exif_writer_write_signed_rational_tag_from_double (writer,
+ exiftag->exif_tag, num);
+ break;
+ default:
+ if (G_VALUE_TYPE (value) == GST_TYPE_FRACTION) {
+ gst_exif_writer_write_signed_rational_tag (writer, exiftag->exif_tag,
+ gst_value_get_fraction_numerator (value),
+ gst_value_get_fraction_denominator (value));
+ } else {
+ GST_WARNING ("Conversion from %s to signed rational not supported",
+ G_VALUE_TYPE_NAME (value));
+ }
+ break;
+ }
+}
+
+static void
+write_exif_integer_tag_from_taglist (GstExifWriter * writer,
+ const GstTagList * taglist, const GstExifTagMatch * exiftag)
+{
+ const GValue *value;
+ guint32 num = 0;
+ gint tag_size = gst_tag_list_get_tag_size (taglist, exiftag->gst_tag);
+
+ if (tag_size != 1) {
+ GST_WARNING ("Only the first item in the taglist will be serialized");
+ return;
+ }
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+
+ /* do some conversion if needed */
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_INT:
+ num = g_value_get_int (value);
+ break;
+ default:
+ GST_WARNING ("Conversion from %s to int not supported",
+ G_VALUE_TYPE_NAME (value));
+ break;
+ }
+
+ switch (exiftag->exif_type) {
+ case EXIF_TYPE_LONG:
+ gst_exif_writer_write_long_tag (writer, exiftag->exif_tag, num);
+ break;
+ case EXIF_TYPE_SHORT:
+ gst_exif_writer_write_short_tag (writer, exiftag->exif_tag, num);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+write_exif_tag_from_taglist (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ GST_DEBUG ("Writing tag %s", exiftag->gst_tag);
+
+ /* check for special handling */
+ if (exiftag->serialize) {
+ exiftag->serialize (writer, taglist, exiftag);
+ return;
+ }
+
+ switch (exiftag->exif_type) {
+ case EXIF_TYPE_ASCII:
+ write_exif_ascii_tag_from_taglist (writer, taglist, exiftag);
+ break;
+ case EXIF_TYPE_UNDEFINED:
+ write_exif_undefined_tag_from_taglist (writer, taglist, exiftag);
+ break;
+ case EXIF_TYPE_RATIONAL:
+ write_exif_rational_tag_from_taglist (writer, taglist, exiftag);
+ break;
+ case EXIF_TYPE_SRATIONAL:
+ write_exif_signed_rational_tag_from_taglist (writer, taglist, exiftag);
+ break;
+ case EXIF_TYPE_LONG:
+ case EXIF_TYPE_SHORT:
+ write_exif_integer_tag_from_taglist (writer, taglist, exiftag);
+ break;
+ default:
+ GST_WARNING ("Unhandled tag type %d", exiftag->exif_type);
+ }
+}
+
+static void
+tagdata_copy (GstExifTagData * to, const GstExifTagData * from)
+{
+ to->tag = from->tag;
+ to->tag_type = from->tag_type;
+ to->count = from->count;
+ to->offset = from->offset;
+ to->offset_as_data = from->offset_as_data;
+}
+
+static void
+gst_exif_tag_rewrite_offsets (GstByteWriter * writer, gint byte_order,
+ guint32 offset, gint num_tags, GstByteWriter * inner_ifds_data)
+{
+ GstByteReader *reader;
+ gint i;
+ guint16 aux = G_MAXUINT16;
+
+ GST_LOG ("Rewriting tag entries offsets");
+
+ reader = (GstByteReader *) writer;
+
+ if (num_tags == -1) {
+ if (byte_order == G_LITTLE_ENDIAN) {
+ gst_byte_reader_get_uint16_le (reader, &aux);
+ } else {
+ gst_byte_reader_get_uint16_be (reader, &aux);
+ }
+ if (aux == G_MAXUINT16) {
+ GST_WARNING ("Failed to read number of tags, won't rewrite offsets");
+ return;
+ }
+ num_tags = (gint) aux;
+ }
+
+ g_return_if_fail (num_tags != -1);
+
+ GST_DEBUG ("number of tags %d", num_tags);
+
+ for (i = 0; i < num_tags; i++) {
+ guint16 type = 0;
+ guint32 cur_offset = 0;
+ gint byte_size = 0;
+ guint32 count = 0;
+ guint16 tag_id = 0;
+
+ g_assert (gst_byte_writer_get_pos (writer) <
+ gst_byte_writer_get_size (writer));
+
+ /* read the type */
+ if (byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint16_le (reader, &tag_id))
+ break;
+ if (!gst_byte_reader_get_uint16_le (reader, &type))
+ break;
+ if (!gst_byte_reader_get_uint32_le (reader, &count))
+ break;
+ } else {
+ if (!gst_byte_reader_get_uint16_be (reader, &tag_id))
+ break;
+ if (!gst_byte_reader_get_uint16_be (reader, &type))
+ break;
+ if (!gst_byte_reader_get_uint32_be (reader, &count))
+ break;
+ }
+
+ GST_LOG ("Parsed tag %x of type %u and count %u", tag_id, type, count);
+
+ switch (type) {
+ case EXIF_TYPE_BYTE:
+ case EXIF_TYPE_ASCII:
+ case EXIF_TYPE_UNDEFINED:
+ byte_size = count;
+ break;
+ case EXIF_TYPE_SHORT:
+ byte_size = count * 2; /* 2 bytes */
+ break;
+ case EXIF_TYPE_LONG:
+ case EXIF_TYPE_SLONG:
+ byte_size = count * 4; /* 4 bytes */
+ break;
+ case EXIF_TYPE_RATIONAL:
+ case EXIF_TYPE_SRATIONAL:
+ byte_size = count * 8; /* 8 bytes */
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ /* adjust the offset if needed */
+ if (byte_size > 4 || tag_id == EXIF_GPS_IFD_TAG || tag_id == EXIF_IFD_TAG) {
+ if (byte_order == G_LITTLE_ENDIAN) {
+ if (gst_byte_reader_peek_uint32_le (reader, &cur_offset)) {
+ gst_byte_writer_put_uint32_le (writer, cur_offset + offset);
+ }
+ } else {
+ if (gst_byte_reader_peek_uint32_be (reader, &cur_offset)) {
+ gst_byte_writer_put_uint32_be (writer, cur_offset + offset);
+ }
+ }
+ GST_DEBUG ("Rewriting tag offset from %u to (%u + %u) %u",
+ cur_offset, cur_offset, offset, cur_offset + offset);
+
+ if ((tag_id == EXIF_GPS_IFD_TAG || tag_id == EXIF_IFD_TAG) &&
+ inner_ifds_data != NULL) {
+ /* needs special handling */
+ if (!gst_byte_writer_set_pos (inner_ifds_data, cur_offset)) {
+ GST_WARNING ("Failed to position writer to rewrite inner ifd "
+ "offsets");
+ continue;
+ }
+
+ gst_exif_tag_rewrite_offsets (inner_ifds_data, byte_order, offset, -1,
+ NULL);
+ }
+ } else {
+ gst_byte_reader_skip (reader, 4);
+ GST_DEBUG ("No need to rewrite tag offset");
+ }
+ }
+ GST_LOG ("Done rewriting offsets");
+}
+
+static void
+parse_exif_ascii_tag (GstExifReader * reader, const GstExifTagMatch * tag,
+ guint32 count, guint32 offset, const guint8 * offset_as_data)
+{
+ GType tagtype;
+ gchar *str;
+ gchar *utfstr;
+ guint32 real_offset;
+ GError *error = NULL;
+
+ if (count > 4) {
+ guint8 *data;
+ gsize size;
+
+ if (offset < reader->base_offset) {
+ GST_WARNING ("Offset is smaller (%u) than base offset (%u)", offset,
+ reader->base_offset);
+ return;
+ }
+
+ real_offset = offset - reader->base_offset;
+
+ data = gst_buffer_map (reader->buffer, &size, NULL, GST_MAP_READ);
+ if (real_offset >= size) {
+ GST_WARNING ("Invalid offset %u for buffer of size %" G_GSIZE_FORMAT
+ ", not adding tag %s", real_offset, size, tag->gst_tag);
+ gst_buffer_unmap (reader->buffer, data, size);
+ return;
+ }
+
+ str = g_strndup ((gchar *) (data + real_offset), count);
+ gst_buffer_unmap (reader->buffer, data, size);
+ } else {
+ str = g_strndup ((gchar *) offset_as_data, count);
+ }
+
+ /* convert from ascii to utf8 */
+ if (g_utf8_validate (str, -1, NULL)) {
+ GST_DEBUG ("Exif string is already on utf8: %s", str);
+ utfstr = str;
+ } else {
+ GST_DEBUG ("Exif string isn't utf8, trying to convert from latin1: %s",
+ str);
+ utfstr = g_convert (str, count, "utf8", "latin1", NULL, NULL, &error);
+ g_free (str);
+ if (error) {
+ GST_WARNING ("Skipping tag %d:%s. Failed to convert ascii string "
+ "to utf8 : %s - %s", tag->exif_tag, tag->gst_tag, str,
+ error->message);
+ g_error_free (error);
+ g_free (utfstr);
+ return;
+ }
+ }
+
+ tagtype = gst_tag_get_type (tag->gst_tag);
+ if (tagtype == GST_TYPE_DATE_TIME) {
+ gint year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0;
+
+ if (sscanf (utfstr, "%04d:%02d:%02d %02d:%02d:%02d", &year, &month, &day,
+ &hour, &minute, &second) > 0) {
+ GstDateTime *d;
+
+ d = gst_date_time_new_local_time (year, month, day, hour, minute, second);
+ gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE,
+ tag->gst_tag, d, NULL);
+ gst_date_time_unref (d);
+ } else {
+ GST_WARNING ("Failed to parse %s into a datetime tag", str);
+ }
+ } else if (tagtype == G_TYPE_STRING) {
+ gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE, tag->gst_tag,
+ utfstr, NULL);
+ } else {
+ GST_WARNING ("No parsing function associated to %x(%s)", tag->exif_tag,
+ tag->gst_tag);
+ }
+ g_free (utfstr);
+}
+
+static void
+parse_exif_long_tag (GstExifReader * reader, const GstExifTagMatch * tag,
+ guint32 count, guint32 offset, const guint8 * offset_as_data)
+{
+ GType tagtype;
+
+ if (count > 1) {
+ GST_WARNING ("Long tags with more than one value are not supported");
+ return;
+ }
+
+ tagtype = gst_tag_get_type (tag->gst_tag);
+ if (tagtype == G_TYPE_INT) {
+ gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE, tag->gst_tag,
+ offset, NULL);
+ } else {
+ GST_WARNING ("No parsing function associated to %x(%s)", tag->exif_tag,
+ tag->gst_tag);
+ }
+}
+
+
+static void
+parse_exif_undefined_tag (GstExifReader * reader, const GstExifTagMatch * tag,
+ guint32 count, guint32 offset, const guint8 * offset_as_data)
+{
+ GType tagtype;
+ guint8 *data;
+ guint32 real_offset;
+
+ if (count > 4) {
+ guint8 *bdata;
+ gsize bsize;
+
+ if (offset < reader->base_offset) {
+ GST_WARNING ("Offset is smaller (%u) than base offset (%u)", offset,
+ reader->base_offset);
+ return;
+ }
+
+ real_offset = offset - reader->base_offset;
+
+ bdata = gst_buffer_map (reader->buffer, &bsize, NULL, GST_MAP_READ);
+
+ if (real_offset >= bsize) {
+ GST_WARNING ("Invalid offset %u for buffer of size %" G_GSIZE_FORMAT
+ ", not adding tag %s", real_offset, bsize, tag->gst_tag);
+ gst_buffer_unmap (reader->buffer, bdata, bsize);
+ return;
+ }
+
+ /* +1 because it could be a string without the \0 */
+ data = malloc (sizeof (guint8) * count + 1);
+ memcpy (data, bdata + real_offset, count);
+ data[count] = 0;
+
+ gst_buffer_unmap (reader->buffer, bdata, bsize);
+ } else {
+ data = malloc (sizeof (guint8) * count + 1);
+ memcpy (data, (guint8 *) offset_as_data, count);
+ data[count] = 0;
+ }
+
+ tagtype = gst_tag_get_type (tag->gst_tag);
+ if (tagtype == GST_TYPE_BUFFER) {
+ GstBuffer *buf;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, count, 0, count));
+ data = NULL;
+
+ gst_tag_list_add (reader->taglist, GST_TAG_MERGE_APPEND, tag->gst_tag,
+ buf, NULL);
+
+ gst_buffer_unref (buf);
+ } else if (tagtype == G_TYPE_STRING) {
+ gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE, tag->gst_tag,
+ data, NULL);
+ } else {
+ GST_WARNING ("No parsing function associated to %x(%s)", tag->exif_tag,
+ tag->gst_tag);
+ }
+ g_free (data);
+}
+
+static gboolean
+exif_reader_read_rational_tag (GstExifReader * exif_reader,
+ guint32 count, guint32 offset, gboolean is_signed,
+ gint32 * _frac_n, gint32 * _frac_d)
+{
+ GstByteReader data_reader;
+ guint32 real_offset;
+ gint32 frac_n = 0;
+ gint32 frac_d = 0;
+ guint8 *data;
+ gsize size;
+
+ if (count > 1) {
+ GST_WARNING ("Rationals with multiple entries are not supported");
+ }
+ if (offset < exif_reader->base_offset) {
+ GST_WARNING ("Offset is smaller (%u) than base offset (%u)", offset,
+ exif_reader->base_offset);
+ return FALSE;
+ }
+
+ real_offset = offset - exif_reader->base_offset;
+
+ data = gst_buffer_map (exif_reader->buffer, &size, NULL, GST_MAP_READ);
+
+ if (real_offset >= size) {
+ GST_WARNING ("Invalid offset %u for buffer of size %" G_GSIZE_FORMAT,
+ real_offset, size);
+ goto reader_fail;
+ }
+
+ gst_byte_reader_init (&data_reader, data, size);
+ if (!gst_byte_reader_set_pos (&data_reader, real_offset))
+ goto reader_fail;
+
+ if (!is_signed) {
+ guint32 aux_n = 0, aux_d = 0;
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint32_le (&data_reader, &aux_n) ||
+ !gst_byte_reader_get_uint32_le (&data_reader, &aux_d))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_get_uint32_be (&data_reader, &aux_n) ||
+ !gst_byte_reader_get_uint32_be (&data_reader, &aux_d))
+ goto reader_fail;
+ }
+ frac_n = (gint32) aux_n;
+ frac_d = (gint32) aux_d;
+ } else {
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_int32_le (&data_reader, &frac_n) ||
+ !gst_byte_reader_get_int32_le (&data_reader, &frac_d))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_get_int32_be (&data_reader, &frac_n) ||
+ !gst_byte_reader_get_int32_be (&data_reader, &frac_d))
+ goto reader_fail;
+ }
+ }
+
+ if (_frac_n)
+ *_frac_n = frac_n;
+ if (_frac_d)
+ *_frac_d = frac_d;
+
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+
+ return TRUE;
+
+reader_fail:
+ GST_WARNING ("Failed to read from byte reader. (Buffer too short?)");
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+ return FALSE;
+}
+
+static void
+parse_exif_rational_tag (GstExifReader * exif_reader,
+ const gchar * gst_tag, guint32 count, guint32 offset, gdouble multiplier,
+ gboolean is_signed)
+{
+ GType type;
+ gint32 frac_n = 0;
+ gint32 frac_d = 1;
+ gdouble value;
+
+ GST_DEBUG ("Reading fraction for tag %s...", gst_tag);
+ if (!exif_reader_read_rational_tag (exif_reader, count, offset, is_signed,
+ &frac_n, &frac_d))
+ return;
+ GST_DEBUG ("Read fraction for tag %s: %d/%d", gst_tag, frac_n, frac_d);
+
+ type = gst_tag_get_type (gst_tag);
+ switch (type) {
+ case G_TYPE_DOUBLE:
+ gst_util_fraction_to_double (frac_n, frac_d, &value);
+ value *= multiplier;
+ GST_DEBUG ("Adding %s tag: %lf", gst_tag, value);
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE, gst_tag,
+ value, NULL);
+ break;
+ default:
+ if (type == GST_TYPE_FRACTION) {
+ GValue fraction = { 0 };
+
+ g_value_init (&fraction, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&fraction, frac_n * multiplier, frac_d);
+ gst_tag_list_add_value (exif_reader->taglist, GST_TAG_MERGE_REPLACE,
+ gst_tag, &fraction);
+ g_value_unset (&fraction);
+ } else {
+ GST_WARNING ("Can't convert from fraction into %s", g_type_name (type));
+ }
+ }
+
+}
+
+static GstBuffer *
+write_exif_ifd (const GstTagList * taglist, gboolean byte_order,
+ guint32 base_offset, const GstExifTagMatch * tag_map)
+{
+ GstExifWriter writer;
+ gint i;
+
+ GST_DEBUG ("Formatting taglist %p as exif buffer. Byte order: %d, "
+ "base_offset: %u", taglist, byte_order, base_offset);
+
+ g_assert (byte_order == G_LITTLE_ENDIAN || byte_order == G_BIG_ENDIAN);
+
+ if (!gst_tag_list_has_ifd_tags (taglist, tag_map)) {
+ GST_DEBUG ("No tags for this ifd");
+ return NULL;
+ }
+
+ gst_exif_writer_init (&writer, byte_order);
+
+ /* write tag number as 0 */
+ gst_byte_writer_put_uint16_le (&writer.tagwriter, 0);
+
+ /* write both tag headers and data
+ * in ascending id order */
+
+ for (i = 0; tag_map[i].exif_tag != 0; i++) {
+
+ /* special cases have NULL gst tag */
+ if (tag_map[i].gst_tag == NULL) {
+ GstBuffer *inner_ifd = NULL;
+ const GstExifTagMatch *inner_tag_map = NULL;
+
+ GST_LOG ("Inner ifd tag: %x", tag_map[i].exif_tag);
+
+ if (tag_map[i].exif_tag == EXIF_GPS_IFD_TAG) {
+ inner_tag_map = tag_map_gps;
+ } else if (tag_map[i].exif_tag == EXIF_IFD_TAG) {
+ inner_tag_map = tag_map_exif;
+ } else if (tag_map[i].exif_tag == EXIF_VERSION_TAG) {
+ /* special case where we write the exif version */
+ write_exif_undefined_tag (&writer, EXIF_VERSION_TAG, (guint8 *) "0230",
+ 4);
+ } else if (tag_map[i].exif_tag == EXIF_FLASHPIX_VERSION_TAG) {
+ /* special case where we write the flashpix version */
+ write_exif_undefined_tag (&writer, EXIF_FLASHPIX_VERSION_TAG,
+ (guint8 *) "0100", 4);
+ }
+
+ if (inner_tag_map) {
+ /* base offset and tagheader size are added when rewriting offset */
+ inner_ifd = write_exif_ifd (taglist, byte_order,
+ gst_byte_writer_get_size (&writer.datawriter), inner_tag_map);
+ }
+
+ if (inner_ifd) {
+ guint8 *data;
+ gsize size;
+
+ GST_DEBUG ("Adding inner ifd: %x", tag_map[i].exif_tag);
+ gst_exif_writer_write_tag_header (&writer, tag_map[i].exif_tag,
+ EXIF_TYPE_LONG, 1,
+ gst_byte_writer_get_size (&writer.datawriter), FALSE);
+
+ data = gst_buffer_map (inner_ifd, &size, NULL, GST_MAP_READ);
+ gst_byte_writer_put_data (&writer.datawriter, data, size);
+ gst_buffer_unmap (inner_ifd, data, size);
+ gst_buffer_unref (inner_ifd);
+ }
+ continue;
+ }
+
+ GST_LOG ("Checking tag %s", tag_map[i].gst_tag);
+ if (gst_tag_list_get_value_index (taglist, tag_map[i].gst_tag, 0) == NULL)
+ continue;
+
+ write_exif_tag_from_taglist (&writer, taglist, &tag_map[i]);
+ }
+
+ /* Add the next IFD offset, we just set it to 0 because
+ * there is no easy way to predict what it is going to be.
+ * The user might rewrite the value if needed */
+ gst_byte_writer_put_uint32_le (&writer.tagwriter, 0);
+
+ /* write the number of tags */
+ gst_byte_writer_set_pos (&writer.tagwriter, 0);
+ if (writer.byte_order == G_LITTLE_ENDIAN)
+ gst_byte_writer_put_uint16_le (&writer.tagwriter, writer.tags_total);
+ else
+ gst_byte_writer_put_uint16_be (&writer.tagwriter, writer.tags_total);
+
+ GST_DEBUG ("Number of tags rewriten to %d", writer.tags_total);
+
+ /* now that we know the tag headers size, we can add the offsets */
+ gst_exif_tag_rewrite_offsets (&writer.tagwriter, writer.byte_order,
+ base_offset + gst_byte_writer_get_size (&writer.tagwriter),
+ writer.tags_total, &writer.datawriter);
+
+ return gst_exif_writer_reset_and_get_buffer (&writer);
+}
+
+static gboolean
+parse_exif_tag_header (GstByteReader * reader, gint byte_order,
+ GstExifTagData * _tagdata)
+{
+ g_assert (_tagdata);
+
+ /* read the fields */
+ if (byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint16_le (reader, &_tagdata->tag) ||
+ !gst_byte_reader_get_uint16_le (reader, &_tagdata->tag_type) ||
+ !gst_byte_reader_get_uint32_le (reader, &_tagdata->count) ||
+ !gst_byte_reader_get_data (reader, 4, &_tagdata->offset_as_data)) {
+ return FALSE;
+ }
+ _tagdata->offset = GST_READ_UINT32_LE (_tagdata->offset_as_data);
+ } else {
+ if (!gst_byte_reader_get_uint16_be (reader, &_tagdata->tag) ||
+ !gst_byte_reader_get_uint16_be (reader, &_tagdata->tag_type) ||
+ !gst_byte_reader_get_uint32_be (reader, &_tagdata->count) ||
+ !gst_byte_reader_get_data (reader, 4, &_tagdata->offset_as_data)) {
+ return FALSE;
+ }
+ _tagdata->offset = GST_READ_UINT32_BE (_tagdata->offset_as_data);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+parse_exif_ifd (GstExifReader * exif_reader, gint buf_offset,
+ const GstExifTagMatch * tag_map)
+{
+ GstByteReader reader;
+ guint16 entries = 0;
+ guint16 i;
+ guint8 *data;
+ gsize size;
+
+ g_return_val_if_fail (exif_reader->byte_order == G_LITTLE_ENDIAN
+ || exif_reader->byte_order == G_BIG_ENDIAN, FALSE);
+
+ data = gst_buffer_map (exif_reader->buffer, &size, NULL, GST_MAP_READ);
+
+ gst_byte_reader_init (&reader, data, size);
+ if (!gst_byte_reader_set_pos (&reader, buf_offset))
+ goto invalid_offset;
+
+ /* read the IFD entries number */
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint16_le (&reader, &entries))
+ goto read_error;
+ } else {
+ if (!gst_byte_reader_get_uint16_be (&reader, &entries))
+ goto read_error;
+ }
+ GST_DEBUG ("Read number of entries: %u", entries);
+
+ /* iterate over the buffer and find the tags and stuff */
+ for (i = 0; i < entries; i++) {
+ GstExifTagData tagdata;
+ gint map_index;
+
+ GST_LOG ("Reading entry: %u", i);
+
+ if (!parse_exif_tag_header (&reader, exif_reader->byte_order, &tagdata))
+ goto read_error;
+
+ GST_DEBUG ("Parsed tag: id 0x%x, type %u, count %u, offset %u (0x%x)"
+ ", buf size: %u", tagdata.tag, tagdata.tag_type, tagdata.count,
+ tagdata.offset, tagdata.offset, gst_byte_reader_get_size (&reader));
+
+ map_index = exif_tag_map_find_reverse (tagdata.tag, tag_map, TRUE);
+ if (map_index == -1) {
+ GST_WARNING ("Unmapped exif tag: 0x%x", tagdata.tag);
+ continue;
+ }
+
+ /*
+ * inner ifd tags handling, errors processing those are being ignored
+ * and we try to continue the parsing
+ */
+ if (tagdata.tag == EXIF_GPS_IFD_TAG) {
+ parse_exif_ifd (exif_reader,
+ tagdata.offset - exif_reader->base_offset, tag_map_gps);
+
+ continue;
+ }
+ if (tagdata.tag == EXIF_IFD_TAG) {
+ parse_exif_ifd (exif_reader,
+ tagdata.offset - exif_reader->base_offset, tag_map_exif);
+
+ continue;
+ }
+ if (tagdata.tag == EXIF_VERSION_TAG ||
+ tagdata.tag == EXIF_FLASHPIX_VERSION_TAG) {
+ /* skip */
+ continue;
+ }
+
+ /* tags that need specialized deserialization */
+ if (tag_map[map_index].deserialize) {
+ i += tag_map[map_index].deserialize (exif_reader, &reader,
+ &tag_map[map_index], &tagdata);
+ continue;
+ }
+
+ switch (tagdata.tag_type) {
+ case EXIF_TYPE_ASCII:
+ parse_exif_ascii_tag (exif_reader, &tag_map[map_index],
+ tagdata.count, tagdata.offset, tagdata.offset_as_data);
+ break;
+ case EXIF_TYPE_RATIONAL:
+ parse_exif_rational_tag (exif_reader, tag_map[map_index].gst_tag,
+ tagdata.count, tagdata.offset, 1, FALSE);
+ break;
+ case EXIF_TYPE_SRATIONAL:
+ parse_exif_rational_tag (exif_reader, tag_map[map_index].gst_tag,
+ tagdata.count, tagdata.offset, 1, TRUE);
+ break;
+ case EXIF_TYPE_UNDEFINED:
+ parse_exif_undefined_tag (exif_reader, &tag_map[map_index],
+ tagdata.count, tagdata.offset, tagdata.offset_as_data);
+ case EXIF_TYPE_LONG:
+ parse_exif_long_tag (exif_reader, &tag_map[map_index],
+ tagdata.count, tagdata.offset, tagdata.offset_as_data);
+ break;
+ default:
+ GST_WARNING ("Unhandled tag type: %u", tagdata.tag_type);
+ break;
+ }
+ }
+
+ /* check if the pending tags have something that can still be added */
+ {
+ GSList *walker;
+ GstExifTagData *data;
+
+ for (walker = exif_reader->pending_tags; walker;
+ walker = g_slist_next (walker)) {
+ data = (GstExifTagData *) walker->data;
+ switch (data->tag) {
+ case EXIF_TAG_XRESOLUTION:
+ parse_exif_rational_tag (exif_reader, GST_TAG_IMAGE_HORIZONTAL_PPI,
+ data->count, data->offset, 1, FALSE);
+ break;
+ case EXIF_TAG_YRESOLUTION:
+ parse_exif_rational_tag (exif_reader, GST_TAG_IMAGE_VERTICAL_PPI,
+ data->count, data->offset, 1, FALSE);
+ break;
+ default:
+ /* NOP */
+ break;
+ }
+ }
+ }
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+
+ return TRUE;
+
+invalid_offset:
+ {
+ GST_WARNING ("Buffer offset invalid when parsing exif ifd");
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+ return FALSE;
+ }
+read_error:
+ {
+ GST_WARNING ("Failed to parse the exif ifd");
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_tag_list_to_exif_buffer:
+ * @taglist: The taglist
+ * @byte_order: byte order used in writing (G_LITTLE_ENDIAN or G_BIG_ENDIAN)
+ * @base_offset: Offset from the tiff header first byte
+ *
+ * Formats the tags in taglist on exif format. The resulting buffer contains
+ * the tags IFD and is followed by the data pointed by the tag entries.
+ *
+ * Returns: A GstBuffer containing the tag entries followed by the tag data
+ *
+ * Since: 0.10.30
+ */
+GstBuffer *
+gst_tag_list_to_exif_buffer (const GstTagList * taglist, gint byte_order,
+ guint32 base_offset)
+{
+ return write_exif_ifd (taglist, byte_order, base_offset, tag_map_ifd0);
+}
+
+/**
+ * gst_tag_list_to_exif_buffer_with_tiff_header:
+ * @taglist: The taglist
+ *
+ * Formats the tags in taglist into exif structure, a tiff header
+ * is put in the beginning of the buffer.
+ *
+ * Returns: A GstBuffer containing the data
+ *
+ * Since: 0.10.30
+ */
+GstBuffer *
+gst_tag_list_to_exif_buffer_with_tiff_header (const GstTagList * taglist)
+{
+ GstBuffer *ifd;
+ GstByteWriter writer;
+ gsize size;
+ guint8 *data;
+
+ ifd = gst_tag_list_to_exif_buffer (taglist, G_BYTE_ORDER, 8);
+ if (ifd == NULL) {
+ GST_WARNING ("Failed to create exif buffer");
+ return NULL;
+ }
+
+ data = gst_buffer_map (ifd, &size, NULL, GST_MAP_READ);
+
+ size += TIFF_HEADER_SIZE;
+
+ /* TODO what is the correct endianness here? */
+ gst_byte_writer_init_with_size (&writer, size, FALSE);
+ /* TIFF header */
+ if (G_BYTE_ORDER == G_LITTLE_ENDIAN) {
+ gst_byte_writer_put_uint16_le (&writer, TIFF_LITTLE_ENDIAN);
+ gst_byte_writer_put_uint16_le (&writer, 42);
+ gst_byte_writer_put_uint32_le (&writer, 8);
+ } else {
+ gst_byte_writer_put_uint16_be (&writer, TIFF_BIG_ENDIAN);
+ gst_byte_writer_put_uint16_be (&writer, 42);
+ gst_byte_writer_put_uint32_be (&writer, 8);
+ }
+ if (!gst_byte_writer_put_data (&writer, data, size)) {
+ GST_WARNING ("Byte writer size mismatch");
+ /* reaching here is a programming error because we should have a buffer
+ * large enough */
+ g_assert_not_reached ();
+ gst_buffer_unmap (ifd, data, size);
+ gst_buffer_unref (ifd);
+ gst_byte_writer_reset (&writer);
+ return NULL;
+ }
+ gst_buffer_unmap (ifd, data, size);
+ gst_buffer_unref (ifd);
+
+ return gst_byte_writer_reset_and_get_buffer (&writer);
+}
+
+/**
+ * gst_tag_list_from_exif_buffer:
+ * @buffer: The exif buffer
+ * @byte_order: byte order of the data
+ * @base_offset: Offset from the tiff header to this buffer
+ *
+ * Parses the IFD and IFD tags data contained in the buffer and puts it
+ * on a taglist. The base_offset is used to subtract from the offset in
+ * the tag entries and be able to get the offset relative to the buffer
+ * start
+ *
+ * Returns: The parsed taglist
+ *
+ * Since: 0.10.30
+ */
+GstTagList *
+gst_tag_list_from_exif_buffer (GstBuffer * buffer, gint byte_order,
+ guint32 base_offset)
+{
+ GstExifReader reader;
+ g_return_val_if_fail (byte_order == G_LITTLE_ENDIAN
+ || byte_order == G_BIG_ENDIAN, NULL);
+
+ gst_exif_reader_init (&reader, byte_order, buffer, base_offset);
+
+ if (!parse_exif_ifd (&reader, 0, tag_map_ifd0))
+ goto read_error;
+
+ return gst_exif_reader_reset (&reader, TRUE);
+
+read_error:
+ {
+ gst_exif_reader_reset (&reader, FALSE);
+ GST_WARNING ("Failed to parse the exif buffer");
+ return NULL;
+ }
+}
+
+/**
+ * gst_tag_list_from_exif_buffer_with_tiff_header:
+ * @buffer: The exif buffer
+ *
+ * Parses the exif tags starting with a tiff header structure.
+ *
+ * Returns: The taglist
+ *
+ * Since: 0.10.30
+ */
+GstTagList *
+gst_tag_list_from_exif_buffer_with_tiff_header (GstBuffer * buffer)
+{
+ GstByteReader reader;
+ guint16 fortytwo = 42;
+ guint16 endianness = 0;
+ guint32 offset;
+ GstTagList *taglist = NULL;
+ GstBuffer *subbuffer;
+ guint8 *data, *sdata;
+ gsize size, ssize;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ GST_LOG ("Parsing exif tags with tiff header of size %" G_GSIZE_FORMAT, size);
+
+ gst_byte_reader_init (&reader, data, size);
+
+ GST_LOG ("Parsing the tiff header");
+ if (!gst_byte_reader_get_uint16_be (&reader, &endianness)) {
+ goto byte_reader_fail;
+ }
+
+ if (endianness == TIFF_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint16_le (&reader, &fortytwo) ||
+ !gst_byte_reader_get_uint32_le (&reader, &offset))
+ goto byte_reader_fail;
+ } else if (endianness == TIFF_BIG_ENDIAN) {
+ if (!gst_byte_reader_get_uint16_be (&reader, &fortytwo) ||
+ !gst_byte_reader_get_uint32_be (&reader, &offset))
+ goto byte_reader_fail;
+ } else
+ goto invalid_endianness;
+
+ if (fortytwo != 42)
+ goto invalid_magic;
+
+ subbuffer = gst_buffer_new_and_alloc (size - (TIFF_HEADER_SIZE - 2));
+
+ sdata = gst_buffer_map (subbuffer, &ssize, NULL, GST_MAP_WRITE);
+ memcpy (sdata, data + TIFF_HEADER_SIZE, size - TIFF_HEADER_SIZE);
+ gst_buffer_unmap (subbuffer, sdata, ssize);
+
+ taglist = gst_tag_list_from_exif_buffer (subbuffer,
+ endianness == TIFF_LITTLE_ENDIAN ? G_LITTLE_ENDIAN : G_BIG_ENDIAN, 8);
+
+ gst_buffer_unref (subbuffer);
+
+done:
+ gst_buffer_unmap (buffer, data, size);
+
+ return taglist;
+
+byte_reader_fail:
+ {
+ GST_WARNING ("Failed to read values from buffer");
+ goto done;
+ }
+invalid_endianness:
+ {
+ GST_WARNING ("Invalid endianness number %u", endianness);
+ goto done;
+ }
+invalid_magic:
+ {
+ GST_WARNING ("Invalid magic number %u, should be 42", fortytwo);
+ goto done;
+ }
+}
+
+/* special serialization functions */
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (contrast,
+ capturing_contrast);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (exposure_mode,
+ capturing_exposure_mode);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (exposure_program,
+ capturing_exposure_program);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (gain_control,
+ capturing_gain_adjustment);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (metering_mode,
+ capturing_metering_mode);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (orientation,
+ image_orientation);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (saturation,
+ capturing_saturation);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (scene_capture_type,
+ capturing_scene_capture_type);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (sharpness,
+ capturing_sharpness);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (source,
+ capturing_source);
+EXIF_SERIALIZATION_DESERIALIZATION_MAP_STRING_TO_INT_FUNC (white_balance,
+ capturing_white_balance);
+
+static void
+serialize_geo_coordinate (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gboolean latitude;
+ gdouble value;
+ gint degrees;
+ gint minutes;
+ gint seconds;
+ guint32 offset;
+
+ latitude = exiftag->exif_tag == EXIF_TAG_GPS_LATITUDE; /* exif tag for latitude */
+ if (!gst_tag_list_get_double (taglist, exiftag->gst_tag, &value)) {
+ GST_WARNING ("Failed to get double from tag list for tag: %s",
+ exiftag->gst_tag);
+ return;
+ }
+
+ /* first write the Latitude or Longitude Ref */
+ if (latitude) {
+ if (value >= 0) {
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "N");
+ } else {
+ value *= -1;
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "S");
+ }
+ } else {
+ if (value >= 0) {
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "E");
+ } else {
+ value *= -1;
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "W");
+ }
+ }
+
+ /* now write the degrees stuff */
+ GST_LOG ("Converting geo location %lf to degrees", value);
+ degrees = (gint) value;
+ value -= degrees;
+ minutes = (gint) (value * 60);
+ value = (value * 60) - minutes;
+ seconds = (gint) (value * 60);
+ GST_LOG ("Converted geo location to %d.%d'%d'' degrees", degrees,
+ minutes, seconds);
+
+ offset = gst_byte_writer_get_size (&writer->datawriter);
+ gst_exif_writer_write_tag_header (writer, exiftag->exif_tag,
+ EXIF_TYPE_RATIONAL, 3, offset, FALSE);
+ gst_exif_writer_write_rational_data (writer, degrees, 1);
+ gst_exif_writer_write_rational_data (writer, minutes, 1);
+ gst_exif_writer_write_rational_data (writer, seconds, 1);
+}
+
+static gint
+deserialize_geo_coordinate (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstByteReader fractions_reader;
+ gint multiplier;
+ GstExifTagData next_tagdata;
+ gint ret = 0;
+ /* for the conversion */
+ guint32 degrees_n = 0;
+ guint32 degrees_d = 1;
+ guint32 minutes_n = 0;
+ guint32 minutes_d = 1;
+ guint32 seconds_n = 0;
+ guint32 seconds_d = 1;
+ gdouble degrees;
+ gdouble minutes;
+ gdouble seconds;
+ guint8 *data = NULL;
+ gsize size = 0;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (exiftag->complementary_tag != tagdata->tag) {
+ /* First should come the 'Ref' tags */
+ GST_WARNING ("Tag %d is not the 'Ref' tag for latitude nor longitude",
+ tagdata->tag);
+ return ret;
+ }
+
+ if (tagdata->offset_as_data[0] == 'N' || tagdata->offset_as_data[0] == 'E') {
+ multiplier = 1;
+ } else if (tagdata->offset_as_data[0] == 'S'
+ || tagdata->offset_as_data[0] == 'W') {
+ multiplier = -1;
+ } else {
+ GST_WARNING ("Invalid LatitudeRef or LongitudeRef %c",
+ tagdata->offset_as_data[0]);
+ return ret;
+ }
+
+ /* now read the following tag that must be the latitude or longitude */
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_peek_uint16_le (reader, &next_tagdata.tag))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_peek_uint16_be (reader, &next_tagdata.tag))
+ goto reader_fail;
+ }
+
+ if (exiftag->exif_tag != next_tagdata.tag) {
+ GST_WARNING ("This is not a geo cordinate tag");
+ return ret;
+ }
+
+ /* read the remaining tag entry data */
+ if (!parse_exif_tag_header (reader, exif_reader->byte_order, &next_tagdata)) {
+ ret = -1;
+ goto reader_fail;
+ }
+
+ ret = 1;
+
+ /* some checking */
+ if (next_tagdata.tag_type != EXIF_TYPE_RATIONAL) {
+ GST_WARNING ("Invalid type %d for geo coordinate (latitude/longitude)",
+ next_tagdata.tag_type);
+ return ret;
+ }
+ if (next_tagdata.count != 3) {
+ GST_WARNING ("Geo coordinate should use 3 fractions, we have %u",
+ next_tagdata.count);
+ return ret;
+ }
+
+ data = gst_buffer_map (exif_reader->buffer, &size, NULL, GST_MAP_READ);
+
+ /* now parse the fractions */
+ gst_byte_reader_init (&fractions_reader, data, size);
+
+ if (!gst_byte_reader_set_pos (&fractions_reader,
+ next_tagdata.offset - exif_reader->base_offset))
+ goto reader_fail;
+
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_get_uint32_le (&fractions_reader, &degrees_n) ||
+ !gst_byte_reader_get_uint32_le (&fractions_reader, &degrees_d) ||
+ !gst_byte_reader_get_uint32_le (&fractions_reader, &minutes_n) ||
+ !gst_byte_reader_get_uint32_le (&fractions_reader, &minutes_d) ||
+ !gst_byte_reader_get_uint32_le (&fractions_reader, &seconds_n) ||
+ !gst_byte_reader_get_uint32_le (&fractions_reader, &seconds_d))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_get_uint32_be (&fractions_reader, &degrees_n) ||
+ !gst_byte_reader_get_uint32_be (&fractions_reader, &degrees_d) ||
+ !gst_byte_reader_get_uint32_be (&fractions_reader, &minutes_n) ||
+ !gst_byte_reader_get_uint32_be (&fractions_reader, &minutes_d) ||
+ !gst_byte_reader_get_uint32_be (&fractions_reader, &seconds_n) ||
+ !gst_byte_reader_get_uint32_be (&fractions_reader, &seconds_d))
+ goto reader_fail;
+ }
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+
+ GST_DEBUG ("Read degrees fraction for tag %s: %u/%u %u/%u %u/%u",
+ exiftag->gst_tag, degrees_n, degrees_d, minutes_n, minutes_d,
+ seconds_n, seconds_d);
+
+ gst_util_fraction_to_double (degrees_n, degrees_d, &degrees);
+ gst_util_fraction_to_double (minutes_n, minutes_d, &minutes);
+ gst_util_fraction_to_double (seconds_n, seconds_d, &seconds);
+
+ minutes += seconds / 60;
+ degrees += minutes / 60;
+ degrees *= multiplier;
+
+ GST_DEBUG ("Adding %s tag: %lf", exiftag->gst_tag, degrees);
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE,
+ exiftag->gst_tag, degrees, NULL);
+
+ return ret;
+
+reader_fail:
+ GST_WARNING ("Failed to read fields from buffer (too short?)");
+ if (data)
+ gst_buffer_unmap (exif_reader->buffer, data, size);
+ return ret;
+}
+
+
+static void
+serialize_geo_direction (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gdouble value;
+
+ if (!gst_tag_list_get_double (taglist, exiftag->gst_tag, &value)) {
+ GST_WARNING ("Failed to get double from tag list for tag: %s",
+ exiftag->gst_tag);
+ return;
+ }
+
+ /* first write the direction ref */
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "T");
+ gst_exif_writer_write_rational_tag_from_double (writer,
+ exiftag->exif_tag, value);
+}
+
+static gint
+deserialize_geo_direction (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstExifTagData next_tagdata = { 0, };
+ gint ret = 0;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (exiftag->complementary_tag == tagdata->tag) {
+ /* First should come the 'Ref' tags */
+ if (tagdata->offset_as_data[0] == 'M') {
+ GST_WARNING ("Magnetic direction is not supported");
+ return ret;
+ } else if (tagdata->offset_as_data[0] == 'T') {
+ /* nop */
+ } else {
+ GST_WARNING ("Invalid Ref for direction or track %c",
+ tagdata->offset_as_data[0]);
+ return ret;
+ }
+ } else {
+ GST_DEBUG ("No Direction Ref, using default=T");
+ if (tagdata->tag == exiftag->exif_tag) {
+ /* this is the main tag */
+ tagdata_copy (&next_tagdata, tagdata);
+ }
+ }
+
+ if (next_tagdata.tag == 0) {
+ /* now read the following tag that must be the exif_tag */
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_peek_uint16_le (reader, &next_tagdata.tag))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_peek_uint16_be (reader, &next_tagdata.tag))
+ goto reader_fail;
+ }
+
+ if (exiftag->exif_tag != next_tagdata.tag) {
+ GST_WARNING ("Unexpected tag");
+ return ret;
+ }
+
+ /* read the remaining tag entry data */
+ if (!parse_exif_tag_header (reader, exif_reader->byte_order, &next_tagdata)) {
+ ret = -1;
+ goto reader_fail;
+ }
+ ret = 1;
+ }
+
+ /* some checking */
+ if (next_tagdata.tag_type != EXIF_TYPE_RATIONAL) {
+ GST_WARNING ("Invalid type %d for 0x%x", next_tagdata.tag_type,
+ next_tagdata.tag);
+ return ret;
+ }
+ if (next_tagdata.count != 1) {
+ GST_WARNING ("0x%x tag must have a single fraction, we have %u",
+ next_tagdata.tag_type, next_tagdata.count);
+ return ret;
+ }
+
+ parse_exif_rational_tag (exif_reader,
+ exiftag->gst_tag, next_tagdata.count, next_tagdata.offset, 1, FALSE);
+
+ return ret;
+
+reader_fail:
+ GST_WARNING ("Failed to read fields from buffer (too short?)");
+ return ret;
+}
+
+
+static void
+serialize_geo_elevation (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gdouble value;
+
+ if (!gst_tag_list_get_double (taglist, exiftag->gst_tag, &value)) {
+ GST_WARNING ("Failed to get double from tag list for tag: %s",
+ exiftag->gst_tag);
+ return;
+ }
+
+ /* first write the Ref */
+ gst_exif_writer_write_byte_tag (writer,
+ exiftag->complementary_tag, value >= 0 ? 0 : 1);
+
+ if (value < 0)
+ value *= -1;
+
+ /* now the value */
+ gst_exif_writer_write_rational_tag_from_double (writer,
+ exiftag->exif_tag, value);
+}
+
+static gint
+deserialize_geo_elevation (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstExifTagData next_tagdata = { 0, };
+ gint multiplier = 1;
+ gint ret = 0;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (exiftag->complementary_tag == tagdata->tag) {
+ if (tagdata->offset_as_data[0] == 0) {
+ /* NOP */
+ } else if (tagdata->offset_as_data[0] == 1) {
+ multiplier = -1;
+ } else {
+ GST_WARNING ("Invalid GPSAltitudeRef %u", tagdata->offset_as_data[0]);
+ return ret;
+ }
+ } else {
+ GST_DEBUG ("No GPSAltitudeRef, using default=0");
+ if (tagdata->tag == exiftag->exif_tag) {
+ tagdata_copy (&next_tagdata, tagdata);
+ }
+ }
+
+ /* now read the following tag that must be the exif_tag */
+ if (next_tagdata.tag == 0) {
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_peek_uint16_le (reader, &next_tagdata.tag))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_peek_uint16_be (reader, &next_tagdata.tag))
+ goto reader_fail;
+ }
+
+ if (exiftag->exif_tag != next_tagdata.tag) {
+ GST_WARNING ("Unexpected tag");
+ return ret;
+ }
+
+ /* read the remaining tag entry data */
+ if (!parse_exif_tag_header (reader, exif_reader->byte_order, &next_tagdata)) {
+ ret = -1;
+ goto reader_fail;
+ }
+ ret = 1;
+ }
+
+ /* some checking */
+ if (next_tagdata.tag_type != EXIF_TYPE_RATIONAL) {
+ GST_WARNING ("Invalid type %d for 0x%x", next_tagdata.tag_type,
+ next_tagdata.tag);
+ return ret;
+ }
+ if (next_tagdata.count != 1) {
+ GST_WARNING ("0x%x tag must have a single fraction, we have %u",
+ next_tagdata.tag_type, next_tagdata.count);
+ return ret;
+ }
+
+ parse_exif_rational_tag (exif_reader,
+ exiftag->gst_tag, next_tagdata.count, next_tagdata.offset, multiplier,
+ FALSE);
+
+ return ret;
+
+reader_fail:
+ GST_WARNING ("Failed to read fields from buffer (too short?)");
+ return ret;
+}
+
+
+static void
+serialize_speed (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gdouble value;
+
+ if (!gst_tag_list_get_double (taglist, exiftag->gst_tag, &value)) {
+ GST_WARNING ("Failed to get double from tag list for tag: %s",
+ exiftag->gst_tag);
+ return;
+ }
+
+ /* first write the Ref */
+ write_exif_ascii_tag (writer, exiftag->complementary_tag, "K");
+
+ /* now the value */
+ gst_exif_writer_write_rational_tag_from_double (writer,
+ exiftag->exif_tag, value * METERS_PER_SECOND_TO_KILOMETERS_PER_HOUR);
+}
+
+static gint
+deserialize_speed (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstExifTagData next_tagdata = { 0, };
+ gdouble multiplier = 1;
+ gint ret = 0;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (exiftag->complementary_tag == tagdata->tag) {
+ if (tagdata->offset_as_data[0] == 'K') {
+ multiplier = KILOMETERS_PER_HOUR_TO_METERS_PER_SECOND;
+ } else if (tagdata->offset_as_data[0] == 'M') {
+ multiplier = MILES_PER_HOUR_TO_METERS_PER_SECOND;
+ } else if (tagdata->offset_as_data[0] == 'N') {
+ multiplier = KNOTS_TO_METERS_PER_SECOND;
+ } else {
+ GST_WARNING ("Invalid GPSSpeedRed %c", tagdata->offset_as_data[0]);
+ return ret;
+ }
+ } else {
+ GST_DEBUG ("No GPSSpeedRef, using default=K");
+ multiplier = KILOMETERS_PER_HOUR_TO_METERS_PER_SECOND;
+
+ if (tagdata->tag == exiftag->exif_tag) {
+ tagdata_copy (&next_tagdata, tagdata);
+ }
+ }
+
+ /* now read the following tag that must be the exif_tag */
+ if (next_tagdata.tag == 0) {
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ if (!gst_byte_reader_peek_uint16_le (reader, &next_tagdata.tag))
+ goto reader_fail;
+ } else {
+ if (!gst_byte_reader_peek_uint16_be (reader, &next_tagdata.tag))
+ goto reader_fail;
+ }
+
+ if (exiftag->exif_tag != next_tagdata.tag) {
+ GST_WARNING ("Unexpected tag");
+ return ret;
+ }
+
+ /* read the remaining tag entry data */
+ if (!parse_exif_tag_header (reader, exif_reader->byte_order, &next_tagdata)) {
+ ret = -1;
+ goto reader_fail;
+ }
+ ret = 1;
+ }
+
+
+ /* some checking */
+ if (next_tagdata.tag_type != EXIF_TYPE_RATIONAL) {
+ GST_WARNING ("Invalid type %d for 0x%x", next_tagdata.tag_type,
+ next_tagdata.tag);
+ return ret;
+ }
+ if (next_tagdata.count != 1) {
+ GST_WARNING ("0x%x tag must have a single fraction, we have %u",
+ next_tagdata.tag_type, next_tagdata.count);
+ return ret;
+ }
+
+ parse_exif_rational_tag (exif_reader,
+ exiftag->gst_tag, next_tagdata.count, next_tagdata.offset, multiplier,
+ FALSE);
+
+ return ret;
+
+reader_fail:
+ GST_WARNING ("Failed to read fields from buffer (too short?)");
+ return ret;
+}
+
+static void
+serialize_shutter_speed (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ const GValue *value = NULL;
+ gdouble num;
+
+ value = gst_tag_list_get_value_index (taglist, exiftag->gst_tag, 0);
+ if (!value) {
+ GST_WARNING ("Failed to get shutter speed from from tag list");
+ return;
+ }
+ gst_util_fraction_to_double (gst_value_get_fraction_numerator (value),
+ gst_value_get_fraction_denominator (value), &num);
+
+#ifdef HAVE_LOG2
+ num = -log2 (num);
+#else
+ num = -log (num) / M_LN2;
+#endif
+
+ /* now the value */
+ gst_exif_writer_write_signed_rational_tag_from_double (writer,
+ exiftag->exif_tag, num);
+}
+
+static gint
+deserialize_shutter_speed (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ gint32 frac_n, frac_d;
+ gdouble d;
+ GValue value = { 0 };
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (!exif_reader_read_rational_tag (exif_reader, tagdata->count,
+ tagdata->offset, TRUE, &frac_n, &frac_d))
+ return 0;
+
+ gst_util_fraction_to_double (frac_n, frac_d, &d);
+ d = pow (2, -d);
+ gst_util_double_to_fraction (d, &frac_n, &frac_d);
+
+ g_value_init (&value, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value, frac_n, frac_d);
+ gst_tag_list_add_value (exif_reader->taglist, GST_TAG_MERGE_KEEP,
+ exiftag->gst_tag, &value);
+ g_value_unset (&value);
+
+ return 0;
+}
+
+static void
+serialize_aperture_value (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gdouble num;
+
+ if (!gst_tag_list_get_double_index (taglist, exiftag->gst_tag, 0, &num)) {
+ GST_WARNING ("Failed to get focal ratio from from tag list");
+ return;
+ }
+#ifdef HAVE_LOG2
+ num = 2 * log2 (num);
+#else
+ num = 2 * (log (num) / M_LN2);
+#endif
+
+ /* now the value */
+ gst_exif_writer_write_rational_tag_from_double (writer,
+ exiftag->exif_tag, num);
+}
+
+static gint
+deserialize_aperture_value (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ gint32 frac_n, frac_d;
+ gdouble d;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (!exif_reader_read_rational_tag (exif_reader, tagdata->count,
+ tagdata->offset, FALSE, &frac_n, &frac_d))
+ return 0;
+
+ gst_util_fraction_to_double (frac_n, frac_d, &d);
+ d = pow (2, d / 2);
+
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_KEEP,
+ exiftag->gst_tag, d, NULL);
+
+ return 0;
+}
+
+static void
+serialize_sensitivity_type (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ /* we only support ISOSpeed as the sensitivity type (3) */
+ gst_exif_writer_write_short_tag (writer, exiftag->exif_tag, 3);
+}
+
+static gint
+deserialize_sensitivity_type (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstExifTagData *sensitivity = NULL;
+ guint16 type_data;
+
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ type_data = GST_READ_UINT16_LE (tagdata->offset_as_data);
+ } else {
+ type_data = GST_READ_UINT16_BE (tagdata->offset_as_data);
+ }
+
+ if (type_data != 3) {
+ GST_WARNING ("We only support SensitivityType=3");
+ return 0;
+ }
+
+ /* check the pending tags for the PhotographicSensitivity tag */
+ sensitivity =
+ gst_exif_reader_get_pending_tag (exif_reader,
+ EXIF_TAG_PHOTOGRAPHIC_SENSITIVITY);
+ if (sensitivity == NULL) {
+ GST_WARNING ("PhotographicSensitivity tag not found");
+ return 0;
+ }
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_KEEP,
+ GST_TAG_CAPTURING_ISO_SPEED, sensitivity->offset_as_data, NULL);
+
+ return 0;
+}
+
+static void
+serialize_flash (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ gboolean flash_fired;
+ const gchar *flash_mode;
+ guint16 tagvalue = 0;
+
+ if (!gst_tag_list_get_boolean_index (taglist, exiftag->gst_tag, 0,
+ &flash_fired)) {
+ GST_WARNING ("Failed to get flash fired from from tag list");
+ return;
+ }
+
+ if (flash_fired)
+ tagvalue = 1;
+
+ if (gst_tag_list_peek_string_index (taglist, GST_TAG_CAPTURING_FLASH_MODE, 0,
+ &flash_mode)) {
+ guint16 mode = 0;
+ if (strcmp (flash_mode, "auto") == 0) {
+ mode = 3;
+ } else if (strcmp (flash_mode, "always") == 0) {
+ mode = 1;
+ } else if (strcmp (flash_mode, "never") == 0) {
+ mode = 2;
+ }
+
+ tagvalue = tagvalue | (mode << 3);
+ } else {
+ GST_DEBUG ("flash-mode not available");
+ }
+
+ gst_exif_writer_write_short_tag (writer, exiftag->exif_tag, tagvalue);
+}
+
+static gint
+deserialize_flash (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ guint16 value = 0;
+ guint mode = 0;
+ const gchar *mode_str = NULL;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ value = GST_READ_UINT16_LE (tagdata->offset_as_data);
+ } else {
+ value = GST_READ_UINT16_BE (tagdata->offset_as_data);
+ }
+
+ /* check flash fired */
+ if (value & 0x1) {
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CAPTURING_FLASH_FIRED, TRUE, NULL);
+ } else {
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CAPTURING_FLASH_FIRED, FALSE, NULL);
+ }
+
+ mode = (value >> 3) & 0x3;
+ if (mode == 1) {
+ mode_str = "always";
+ } else if (mode == 2) {
+ mode_str = "never";
+ } else if (mode == 3) {
+ mode_str = "auto";
+ }
+
+ if (mode_str)
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_CAPTURING_FLASH_MODE, mode_str, NULL);
+
+ return 0;
+}
+
+static gint
+deserialize_resolution (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GstExifTagData *xres = NULL;
+ GstExifTagData *yres = NULL;
+ guint16 unit;
+ gdouble multiplier;
+
+ if (exif_reader->byte_order == G_LITTLE_ENDIAN) {
+ unit = GST_READ_UINT16_LE (tagdata->offset_as_data);
+ } else {
+ unit = GST_READ_UINT16_BE (tagdata->offset_as_data);
+ }
+
+ switch (unit) {
+ case 2: /* inch */
+ multiplier = 1;
+ break;
+ case 3: /* cm */
+ multiplier = 1 / 2.54;
+ break;
+ default:
+ GST_WARNING ("Invalid resolution unit, ignoring PPI tags");
+ return 0;
+ }
+
+ xres = gst_exif_reader_get_pending_tag (exif_reader, EXIF_TAG_XRESOLUTION);
+ if (xres) {
+ parse_exif_rational_tag (exif_reader, GST_TAG_IMAGE_HORIZONTAL_PPI,
+ xres->count, xres->offset, multiplier, FALSE);
+ }
+ yres = gst_exif_reader_get_pending_tag (exif_reader, EXIF_TAG_YRESOLUTION);
+ if (yres) {
+ parse_exif_rational_tag (exif_reader, GST_TAG_IMAGE_VERTICAL_PPI,
+ yres->count, yres->offset, multiplier, FALSE);
+ }
+
+ return 0;
+}
+
+static void
+serialize_scene_type (GstExifWriter * writer, const GstTagList * taglist,
+ const GstExifTagMatch * exiftag)
+{
+ const gchar *str;
+ guint8 value = 0;
+
+ if (gst_tag_list_peek_string_index (taglist, GST_TAG_CAPTURING_SOURCE, 0,
+ &str)) {
+ if (strcmp (str, "dsc") == 0) {
+ value = 1;
+ }
+ }
+
+ if (value != 0)
+ write_exif_undefined_tag (writer, exiftag->exif_tag, &value, 1);
+}
+
+static gint
+deserialize_scene_type (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ guint8 value = 0;
+
+ GST_LOG ("Starting to parse %s tag in exif 0x%x", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ value = GST_READ_UINT8 (tagdata->offset_as_data);
+
+ if (value == 1) {
+ gst_tag_list_add (exif_reader->taglist, GST_TAG_MERGE_KEEP,
+ GST_TAG_CAPTURING_SOURCE, "dsc", NULL);
+ }
+
+ return 0;
+}
+
+static gint
+deserialize_add_to_pending_tags (GstExifReader * exif_reader,
+ GstByteReader * reader, const GstExifTagMatch * exiftag,
+ GstExifTagData * tagdata)
+{
+ GST_LOG ("Adding %s tag in exif 0x%x to pending tags", exiftag->gst_tag,
+ exiftag->exif_tag);
+
+ /* add it to the pending tags, as we can only parse it when we find the
+ * SensitivityType tag */
+ gst_exif_reader_add_pending_tag (exif_reader, tagdata);
+ return 0;
+}
+
+#undef EXIF_SERIALIZATION_FUNC
+#undef EXIF_DESERIALIZATION_FUNC
+#undef EXIF_SERIALIZATION_DESERIALIZATION_FUNC
diff --git a/gst-libs/gst/tag/gstid3tag.c b/gst-libs/gst/tag/gstid3tag.c
new file mode 100644
index 0000000..8b1b8f1
--- /dev/null
+++ b/gst-libs/gst/tag/gstid3tag.c
@@ -0,0 +1,381 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gstid3tag.c: plugin for reading / modifying id3 tags
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttagid3
+ * @short_description: tag mappings and support functions for plugins
+ * dealing with ID3v1 and ID3v2 tags
+ * @see_also: #GstTagList
+ *
+ * <refsect2>
+ * <para>
+ * Contains various utility functions for plugins to parse or create
+ * ID3 tags and map ID3v2 identifiers to and from GStreamer identifiers.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gsttageditingprivate.h"
+#include <stdlib.h>
+#include <string.h>
+
+static const gchar genres[] =
+ "Blues\000Classic Rock\000Country\000Dance\000Disco\000Funk\000Grunge\000"
+ "Hip-Hop\000Jazz\000Metal\000New Age\000Oldies\000Other\000Pop\000R&B\000"
+ "Rap\000Reggae\000Rock\000Techno\000Industrial\000Alternative\000Ska\000"
+ "Death Metal\000Pranks\000Soundtrack\000Euro-Techno\000Ambient\000Trip-Hop"
+ "\000Vocal\000Jazz+Funk\000Fusion\000Trance\000Classical\000Instrumental\000"
+ "Acid\000House\000Game\000Sound Clip\000Gospel\000Noise\000Alternative Rock"
+ "\000Bass\000Soul\000Punk\000Space\000Meditative\000Instrumental Pop\000"
+ "Instrumental Rock\000Ethnic\000Gothic\000Darkwave\000Techno-Industrial\000"
+ "Electronic\000Pop-Folk\000Eurodance\000Dream\000Southern Rock\000Comedy"
+ "\000Cult\000Gangsta\000Top 40\000Christian Rap\000Pop/Funk\000Jungle\000"
+ "Native American\000Cabaret\000New Wave\000Psychedelic\000Rave\000Showtunes"
+ "\000Trailer\000Lo-Fi\000Tribal\000Acid Punk\000Acid Jazz\000Polka\000"
+ "Retro\000Musical\000Rock & Roll\000Hard Rock\000Folk\000Folk/Rock\000"
+ "National Folk\000Swing\000Bebob\000Latin\000Revival\000Celtic\000Bluegrass"
+ "\000Avantgarde\000Gothic Rock\000Progressive Rock\000Psychedelic Rock\000"
+ "Symphonic Rock\000Slow Rock\000Big Band\000Chorus\000Easy Listening\000"
+ "Acoustic\000Humour\000Speech\000Chanson\000Opera\000Chamber Music\000"
+ "Sonata\000Symphony\000Booty Bass\000Primus\000Porn Groove\000Satire\000"
+ "Slow Jam\000Club\000Tango\000Samba\000Folklore\000Ballad\000Power Ballad\000"
+ "Rhythmic Soul\000Freestyle\000Duet\000Punk Rock\000Drum Solo\000A Capella"
+ "\000Euro-House\000Dance Hall\000Goa\000Drum & Bass\000Club-House\000"
+ "Hardcore\000Terror\000Indie\000BritPop\000Negerpunk\000Polsk Punk\000"
+ "Beat\000Christian Gangsta Rap\000Heavy Metal\000Black Metal\000"
+ "Crossover\000Contemporary Christian\000Christian Rock\000Merengue\000"
+ "Salsa\000Thrash Metal\000Anime\000Jpop\000Synthpop";
+
+static const guint16 genres_idx[] = {
+ 0, 6, 19, 27, 33, 39, 44, 51, 59, 64, 70, 78, 85, 91, 95, 99, 103, 110, 115,
+ 122, 133, 145, 149, 161, 168, 179, 191, 199, 208, 214, 224, 231, 238, 248,
+ 261, 266, 272, 277, 288, 295, 301, 318, 323, 328, 333, 339, 350, 367, 385,
+ 392, 399, 408, 426, 437, 446, 456, 462, 476, 483, 488, 496, 503, 517, 526,
+ 533, 549, 557, 566, 578, 583, 593, 601, 607, 614, 624, 634, 640, 646, 654,
+ 666, 676, 681, 691, 705, 224, 711, 717, 723, 731, 738, 748, 759, 771, 788,
+ 805, 820, 830, 839, 846, 861, 870, 877, 884, 892, 898, 912, 919, 928, 939,
+ 946, 958, 965, 974, 979, 985, 991, 1000, 1007, 1020, 1034, 1044, 1049,
+ 1059, 1069, 1079, 1090, 1101, 1105, 1117, 1128, 1137, 1144, 1150, 1158,
+ 1168, 1179, 1184, 1206, 1218, 1230, 1240, 1263, 1278, 1287, 1293, 1306,
+ 1312, 1317
+};
+
+static const GstTagEntryMatch tag_matches[] = {
+ {GST_TAG_TITLE, "TIT2"},
+ {GST_TAG_ALBUM, "TALB"},
+ {GST_TAG_TRACK_NUMBER, "TRCK"},
+ {GST_TAG_ARTIST, "TPE1"},
+ {GST_TAG_ALBUM_ARTIST, "TPE2"},
+ {GST_TAG_COMPOSER, "TCOM"},
+ {GST_TAG_COPYRIGHT, "TCOP"},
+ {GST_TAG_COPYRIGHT_URI, "WCOP"},
+ {GST_TAG_ENCODED_BY, "TENC"},
+ {GST_TAG_GENRE, "TCON"},
+ {GST_TAG_DATE, "TDRC"},
+ {GST_TAG_COMMENT, "COMM"},
+ {GST_TAG_ALBUM_VOLUME_NUMBER, "TPOS"},
+ {GST_TAG_DURATION, "TLEN"},
+ {GST_TAG_ISRC, "TSRC"},
+ {GST_TAG_IMAGE, "APIC"},
+ {GST_TAG_ENCODER, "TSSE"},
+ {GST_TAG_BEATS_PER_MINUTE, "TBPM"},
+ {GST_TAG_ARTIST_SORTNAME, "TSOP"},
+ {GST_TAG_ALBUM_SORTNAME, "TSOA"},
+ {GST_TAG_TITLE_SORTNAME, "TSOT"},
+ {NULL, NULL}
+};
+
+/**
+ * gst_tag_from_id3_tag:
+ * @id3_tag: ID3v2 tag to convert to GStreamer tag
+ *
+ * Looks up the GStreamer tag for a ID3v2 tag.
+ *
+ * Returns: The corresponding GStreamer tag or NULL if none exists.
+ */
+const gchar *
+gst_tag_from_id3_tag (const gchar * id3_tag)
+{
+ int i = 0;
+
+ g_return_val_if_fail (id3_tag != NULL, NULL);
+
+ while (tag_matches[i].gstreamer_tag != NULL) {
+ if (strncmp (id3_tag, tag_matches[i].original_tag, 5) == 0) {
+ return tag_matches[i].gstreamer_tag;
+ }
+ i++;
+ }
+
+ GST_INFO ("Cannot map ID3v2 tag '%c%c%c%c' to GStreamer tag",
+ id3_tag[0], id3_tag[1], id3_tag[2], id3_tag[3]);
+
+ return NULL;
+}
+
+static const GstTagEntryMatch user_tag_matches[] = {
+ /* musicbrainz identifiers being used in the real world (foobar2000) */
+ {GST_TAG_MUSICBRAINZ_ARTISTID, "TXXX|musicbrainz_artistid"},
+ {GST_TAG_MUSICBRAINZ_ALBUMID, "TXXX|musicbrainz_albumid"},
+ {GST_TAG_MUSICBRAINZ_ALBUMARTISTID, "TXXX|musicbrainz_albumartistid"},
+ {GST_TAG_MUSICBRAINZ_TRMID, "TXXX|musicbrainz_trmid"},
+ {GST_TAG_CDDA_MUSICBRAINZ_DISCID, "TXXX|musicbrainz_discid"},
+ /* musicbrainz identifiers according to spec no one pays
+ * attention to (http://musicbrainz.org/docs/specs/metadata_tags.html) */
+ {GST_TAG_MUSICBRAINZ_ARTISTID, "TXXX|MusicBrainz Artist Id"},
+ {GST_TAG_MUSICBRAINZ_ALBUMID, "TXXX|MusicBrainz Album Id"},
+ {GST_TAG_MUSICBRAINZ_ALBUMARTISTID, "TXXX|MusicBrainz Album Artist Id"},
+ {GST_TAG_MUSICBRAINZ_TRMID, "TXXX|MusicBrainz TRM Id"},
+ /* according to: http://wiki.musicbrainz.org/MusicBrainzTag (yes, no space
+ * before 'ID' and not 'Id' either this time, yay for consistency) */
+ {GST_TAG_CDDA_MUSICBRAINZ_DISCID, "TXXX|MusicBrainz DiscID"},
+ /* foobar2000 uses these identifiers to store gain/peak information in
+ * ID3v2 tags <= v2.3.0. In v2.4.0 there's the RVA2 frame for that */
+ {GST_TAG_TRACK_GAIN, "TXXX|replaygain_track_gain"},
+ {GST_TAG_TRACK_PEAK, "TXXX|replaygain_track_peak"},
+ {GST_TAG_ALBUM_GAIN, "TXXX|replaygain_album_gain"},
+ {GST_TAG_ALBUM_PEAK, "TXXX|replaygain_album_peak"},
+ /* the following two are 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, "TXXX|discid"},
+ {GST_TAG_CDDA_CDDB_DISCID, "TXXX|CDDB DiscID"}
+};
+
+/**
+ * gst_tag_from_id3_user_tag:
+ * @type: the type of ID3v2 user tag (e.g. "TXXX" or "UDIF")
+ * @id3_user_tag: ID3v2 user tag to convert to GStreamer tag
+ *
+ * Looks up the GStreamer tag for an ID3v2 user tag (e.g. description in
+ * TXXX frame or owner in UFID frame).
+ *
+ * Returns: The corresponding GStreamer tag or NULL if none exists.
+ */
+const gchar *
+gst_tag_from_id3_user_tag (const gchar * type, const gchar * id3_user_tag)
+{
+ int i = 0;
+
+ g_return_val_if_fail (type != NULL && strlen (type) == 4, NULL);
+ g_return_val_if_fail (id3_user_tag != NULL, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (user_tag_matches); ++i) {
+ if (strncmp (type, user_tag_matches[i].original_tag, 4) == 0 &&
+ g_ascii_strcasecmp (id3_user_tag,
+ user_tag_matches[i].original_tag + 5) == 0) {
+ GST_LOG ("Mapped ID3v2 user tag '%s' to GStreamer tag '%s'",
+ user_tag_matches[i].original_tag, user_tag_matches[i].gstreamer_tag);
+ return user_tag_matches[i].gstreamer_tag;
+ }
+ }
+
+ GST_INFO ("Cannot map ID3v2 user tag '%s' of type '%s' to GStreamer tag",
+ id3_user_tag, type);
+
+ return NULL;
+}
+
+/**
+ * gst_tag_to_id3_tag:
+ * @gst_tag: GStreamer tag to convert to vorbiscomment tag
+ *
+ * Looks up the ID3v2 tag for a GStreamer tag.
+ *
+ * Returns: The corresponding ID3v2 tag or NULL if none exists.
+ */
+const gchar *
+gst_tag_to_id3_tag (const gchar * gst_tag)
+{
+ int i = 0;
+
+ g_return_val_if_fail (gst_tag != NULL, NULL);
+
+ while (tag_matches[i].gstreamer_tag != NULL) {
+ if (strcmp (gst_tag, tag_matches[i].gstreamer_tag) == 0) {
+ return tag_matches[i].original_tag;
+ }
+ i++;
+ }
+ return NULL;
+}
+
+static void
+gst_tag_extract_id3v1_string (GstTagList * list, const gchar * tag,
+ const gchar * start, const guint size)
+{
+ const gchar *env_vars[] = { "GST_ID3V1_TAG_ENCODING",
+ "GST_ID3_TAG_ENCODING", "GST_TAG_ENCODING", NULL
+ };
+ gchar *utf8;
+
+ utf8 = gst_tag_freeform_string_to_utf8 (start, size, env_vars);
+
+ if (utf8 && *utf8 != '\0') {
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, tag, utf8, NULL);
+ }
+
+ g_free (utf8);
+}
+
+/**
+ * gst_tag_list_new_from_id3v1:
+ * @data: 128 bytes of data containing the ID3v1 tag
+ *
+ * Parses the data containing an ID3v1 tag and returns a #GstTagList from the
+ * parsed data.
+ *
+ * Returns: A new tag list or NULL if the data was not an ID3v1 tag.
+ */
+GstTagList *
+gst_tag_list_new_from_id3v1 (const guint8 * data)
+{
+ guint year;
+ gchar *ystr;
+ GstTagList *list;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ if (data[0] != 'T' || data[1] != 'A' || data[2] != 'G')
+ return NULL;
+ list = gst_tag_list_new ();
+ gst_tag_extract_id3v1_string (list, GST_TAG_TITLE, (gchar *) & data[3], 30);
+ gst_tag_extract_id3v1_string (list, GST_TAG_ARTIST, (gchar *) & data[33], 30);
+ gst_tag_extract_id3v1_string (list, GST_TAG_ALBUM, (gchar *) & data[63], 30);
+ ystr = g_strndup ((gchar *) & data[93], 4);
+ year = strtoul (ystr, NULL, 10);
+ g_free (ystr);
+ if (year > 0) {
+ GDate *date = g_date_new_dmy (1, 1, year);
+
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_DATE, date, NULL);
+ g_date_free (date);
+ }
+ if (data[125] == 0 && data[126] != 0) {
+ gst_tag_extract_id3v1_string (list, GST_TAG_COMMENT, (gchar *) & data[97],
+ 28);
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_NUMBER,
+ (guint) data[126], NULL);
+ } else {
+ gst_tag_extract_id3v1_string (list, GST_TAG_COMMENT, (gchar *) & data[97],
+ 30);
+ }
+ if (data[127] < gst_tag_id3_genre_count () && !gst_tag_list_is_empty (list)) {
+ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_GENRE,
+ gst_tag_id3_genre_get (data[127]), NULL);
+ }
+
+ return list;
+}
+
+/**
+ * gst_tag_id3_genre_count:
+ *
+ * Gets the number of ID3v1 genres that can be identified. Winamp genres are
+ * included.
+ *
+ * Returns: the number of ID3v1 genres that can be identified
+ */
+guint
+gst_tag_id3_genre_count (void)
+{
+ return G_N_ELEMENTS (genres_idx);
+}
+
+/**
+ * gst_tag_id3_genre_get:
+ * @id: ID of genre to query
+ *
+ * Gets the ID3v1 genre name for a given ID.
+ *
+ * Returns: the genre or NULL if no genre is associated with that ID.
+ */
+const gchar *
+gst_tag_id3_genre_get (const guint id)
+{
+ guint idx;
+
+ if (id >= G_N_ELEMENTS (genres_idx))
+ return NULL;
+ idx = genres_idx[id];
+ g_assert (idx < sizeof (genres));
+ return &genres[idx];
+}
+
+/**
+ * gst_tag_list_add_id3_image:
+ * @tag_list: a tag list
+ * @image_data: the (encoded) image
+ * @image_data_len: the length of the encoded image data at @image_data
+ * @id3_picture_type: picture type as per the ID3 (v2.4.0) specification for
+ * the APIC frame (0 = unknown/other)
+ *
+ * Adds an image from an ID3 APIC frame (or similar, such as used in FLAC)
+ * to the given tag list. Also see gst_tag_image_data_to_image_buffer() for
+ * more information on image tags in GStreamer.
+ *
+ * Returns: %TRUE if the image was processed, otherwise %FALSE
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_tag_list_add_id3_image (GstTagList * tag_list, const guint8 * image_data,
+ guint image_data_len, guint id3_picture_type)
+{
+ GstTagImageType tag_image_type;
+ const gchar *tag_name;
+ GstBuffer *image;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (tag_list), FALSE);
+ g_return_val_if_fail (image_data != NULL, FALSE);
+ g_return_val_if_fail (image_data_len > 0, FALSE);
+
+ if (id3_picture_type == 0x01 || id3_picture_type == 0x02) {
+ /* file icon for preview. Don't add image-type to caps, since there
+ * is only supposed to be one of these, and the type is already indicated
+ * via the special tag */
+ tag_name = GST_TAG_PREVIEW_IMAGE;
+ tag_image_type = GST_TAG_IMAGE_TYPE_NONE;
+ } else {
+ tag_name = GST_TAG_IMAGE;
+
+ /* Remap the ID3v2 APIC type our ImageType enum */
+ if (id3_picture_type >= 0x3 && id3_picture_type <= 0x14)
+ tag_image_type = (GstTagImageType) (id3_picture_type - 2);
+ else
+ tag_image_type = GST_TAG_IMAGE_TYPE_UNDEFINED;
+ }
+
+ image = gst_tag_image_data_to_image_buffer (image_data, image_data_len,
+ tag_image_type);
+
+ if (image == NULL)
+ return FALSE;
+
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, tag_name, image, NULL);
+ gst_buffer_unref (image);
+ return TRUE;
+}
diff --git a/gst-libs/gst/tag/gsttagdemux.c b/gst-libs/gst/tag/gsttagdemux.c
new file mode 100644
index 0000000..ab4bbc4
--- /dev/null
+++ b/gst-libs/gst/tag/gsttagdemux.c
@@ -0,0 +1,1552 @@
+/* GStreamer Base Class for Tag Demuxing
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * Copyright (C) 2006-2007 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gsttagdemux
+ * @see_also: GstApeDemux, GstID3Demux
+ * @short_description: Base class for demuxing tags that are in chunks
+ * directly at the beginning or at the end of a file
+ *
+ * <refsect2>
+ * <para>
+ * Provides a base class for demuxing tags at the beginning or end of a
+ * stream and handles things like typefinding, querying, seeking, and
+ * different modes of operation (chain-based, pull_range-based, and providing
+ * downstream elements with random access if upstream supports that). The tag
+ * is stripped from the output, and all offsets are adjusted for the tag
+ * sizes, so that to the downstream element the stream will appear as if
+ * there was no tag at all. Also, once the tag has been parsed, GstTagDemux
+ * will try to determine the media type of the resulting stream and add a
+ * source pad with the appropriate caps in order to facilitate auto-plugging.
+ * </para>
+ * <title>Deriving from GstTagDemux</title>
+ * <para>
+ * Subclasses have to do four things:
+ * <itemizedlist>
+ * <listitem><para>
+ * In their base init function, they must add a pad template for the sink
+ * pad to the element class, describing the media type they can parse in
+ * the caps of the pad template.
+ * </para></listitem>
+ * <listitem><para>
+ * In their class init function, they must override
+ * GST_TAG_DEMUX_CLASS(demux_klass)->identify_tag with their own identify
+ * function.
+ * </para></listitem>
+ * <listitem><para>
+ * In their class init function, they must override
+ * GST_TAG_DEMUX_CLASS(demux_klass)->parse_tag with their own parse
+ * function.
+ * </para></listitem>
+ * <listitem><para>
+ * In their class init function, they must also set
+ * GST_TAG_DEMUX_CLASS(demux_klass)->min_start_size and/or
+ * GST_TAG_DEMUX_CLASS(demux_klass)->min_end_size to the minimum size required
+ * for the identify function to decide whether the stream has a supported tag
+ * or not. A class parsing ID3v1 tags, for example, would set min_end_size to
+ * 128 bytes.
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gsttagdemux.h"
+
+#include <gst/base/gsttypefindhelper.h>
+#include <gst/gst-i18n-plugin.h>
+#include <string.h>
+
+typedef enum
+{
+ GST_TAG_DEMUX_READ_START_TAG,
+ GST_TAG_DEMUX_TYPEFINDING,
+ GST_TAG_DEMUX_STREAMING
+} GstTagDemuxState;
+
+struct _GstTagDemuxPrivate
+{
+ GstPad *srcpad;
+ GstPad *sinkpad;
+
+ /* Number of bytes to remove from the
+ * start of file (tag at beginning) */
+ guint strip_start;
+
+ /* Number of bytes to remove from the
+ * end of file (tag at end) */
+ guint strip_end;
+
+ gint64 upstream_size;
+
+ GstTagDemuxState state;
+ GstBuffer *collect;
+ gsize collect_size;
+ GstCaps *src_caps;
+
+ GstTagList *event_tags;
+ GstTagList *parsed_tags;
+ gboolean send_tag_event;
+
+ GstSegment segment;
+ gboolean need_newseg;
+
+ GList *pending_events;
+};
+
+/* Require at least 8kB of data before we attempt typefind.
+ * Seems a decent value based on test files
+ * 40kB is massive overkill for the maximum, I think, but it
+ * doesn't do any harm (tpm: increased to 64kB after watching
+ * typefinding fail on a wavpack file that needed 42kB to succeed) */
+#define TYPE_FIND_MIN_SIZE 8192
+#define TYPE_FIND_MAX_SIZE 65536
+
+GST_DEBUG_CATEGORY_STATIC (tagdemux_debug);
+#define GST_CAT_DEFAULT (tagdemux_debug)
+
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("ANY")
+ );
+
+static void gst_tag_demux_dispose (GObject * object);
+
+static GstFlowReturn gst_tag_demux_chain (GstPad * pad, GstBuffer * buf);
+static gboolean gst_tag_demux_sink_event (GstPad * pad, GstEvent * event);
+
+static gboolean gst_tag_demux_src_activate_pull (GstPad * pad, gboolean active);
+static GstFlowReturn gst_tag_demux_read_range (GstTagDemux * tagdemux,
+ guint64 offset, guint length, GstBuffer ** buffer);
+
+static GstFlowReturn gst_tag_demux_src_getrange (GstPad * srcpad,
+ guint64 offset, guint length, GstBuffer ** buffer);
+
+static gboolean gst_tag_demux_add_srcpad (GstTagDemux * tagdemux,
+ GstCaps * new_caps);
+static gboolean gst_tag_demux_remove_srcpad (GstTagDemux * tagdemux);
+
+static gboolean gst_tag_demux_srcpad_event (GstPad * pad, GstEvent * event);
+static gboolean gst_tag_demux_sink_activate (GstPad * sinkpad);
+static GstStateChangeReturn gst_tag_demux_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_tag_demux_pad_query (GstPad * pad, GstQuery * query);
+static const GstQueryType *gst_tag_demux_get_query_types (GstPad * pad);
+static gboolean gst_tag_demux_get_upstream_size (GstTagDemux * tagdemux);
+static void gst_tag_demux_send_pending_events (GstTagDemux * tagdemux);
+static void gst_tag_demux_send_tag_event (GstTagDemux * tagdemux);
+static gboolean gst_tag_demux_send_new_segment (GstTagDemux * tagdemux);
+
+static void gst_tag_demux_base_init (gpointer g_class);
+static void gst_tag_demux_class_init (gpointer g_class, gpointer d);
+static void gst_tag_demux_init (GstTagDemux * obj, GstTagDemuxClass * klass);
+
+static gpointer parent_class; /* NULL */
+
+GType
+gst_tag_demux_result_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ {GST_TAG_DEMUX_RESULT_BROKEN_TAG, "GST_TAG_DEMUX_RESULT_BROKEN_TAG",
+ "broken-tag"},
+ {GST_TAG_DEMUX_RESULT_AGAIN, "GST_TAG_DEMUX_RESULT_AGAIN", "again"},
+ {GST_TAG_DEMUX_RESULT_OK, "GST_TAG_DEMUX_RESULT_OK", "ok"},
+ {0, NULL, NULL}
+ };
+ etype = g_enum_register_static ("GstTagDemuxResult", values);
+ }
+ return etype;
+}
+
+/* Cannot use boilerplate macros here because we want the abstract flag */
+GType
+gst_tag_demux_get_type (void)
+{
+ static GType object_type; /* 0 */
+
+ if (object_type == 0) {
+ static const GTypeInfo object_info = {
+ sizeof (GstTagDemuxClass),
+ gst_tag_demux_base_init,
+ NULL, /* base_finalize */
+ gst_tag_demux_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GstTagDemux),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gst_tag_demux_init
+ };
+
+ object_type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstTagDemux", &object_info, G_TYPE_FLAG_ABSTRACT);
+ }
+
+ return object_type;
+}
+
+static void
+gst_tag_demux_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+
+ GST_DEBUG_CATEGORY_INIT (tagdemux_debug, "tagdemux", 0,
+ "tag demux base class");
+}
+
+static void
+gst_tag_demux_class_init (gpointer klass, gpointer d)
+{
+ GstTagDemuxClass *tagdemux_class = GST_TAG_DEMUX_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = gst_tag_demux_dispose;
+
+ element_class->change_state = GST_DEBUG_FUNCPTR (gst_tag_demux_change_state);
+
+ g_type_class_add_private (klass, sizeof (GstTagDemuxPrivate));
+
+ /* subclasses must set at least one of these */
+ tagdemux_class->min_start_size = 0;
+ tagdemux_class->min_end_size = 0;
+}
+
+static void
+gst_tag_demux_reset (GstTagDemux * tagdemux)
+{
+ GstBuffer **buffer_p = &tagdemux->priv->collect;
+ GstCaps **caps_p = &tagdemux->priv->src_caps;
+
+ tagdemux->priv->strip_start = 0;
+ tagdemux->priv->strip_end = 0;
+ tagdemux->priv->upstream_size = -1;
+ tagdemux->priv->state = GST_TAG_DEMUX_READ_START_TAG;
+ tagdemux->priv->send_tag_event = FALSE;
+
+ gst_buffer_replace (buffer_p, NULL);
+ tagdemux->priv->collect_size = 0;
+ gst_caps_replace (caps_p, NULL);
+
+ gst_tag_demux_remove_srcpad (tagdemux);
+
+ if (tagdemux->priv->event_tags) {
+ gst_tag_list_free (tagdemux->priv->event_tags);
+ tagdemux->priv->event_tags = NULL;
+ }
+ if (tagdemux->priv->parsed_tags) {
+ gst_tag_list_free (tagdemux->priv->parsed_tags);
+ tagdemux->priv->parsed_tags = NULL;
+ }
+
+ gst_segment_init (&tagdemux->priv->segment, GST_FORMAT_UNDEFINED);
+ tagdemux->priv->need_newseg = TRUE;
+
+ g_list_foreach (tagdemux->priv->pending_events,
+ (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (tagdemux->priv->pending_events);
+ tagdemux->priv->pending_events = NULL;
+}
+
+static void
+gst_tag_demux_init (GstTagDemux * demux, GstTagDemuxClass * gclass)
+{
+ GstElementClass *element_klass = GST_ELEMENT_CLASS (gclass);
+ GstPadTemplate *tmpl;
+
+ demux->priv = g_type_instance_get_private ((GTypeInstance *) demux,
+ GST_TYPE_TAG_DEMUX);
+
+ tmpl = gst_element_class_get_pad_template (element_klass, "sink");
+ if (tmpl) {
+ demux->priv->sinkpad = gst_pad_new_from_template (tmpl, "sink");
+
+ gst_pad_set_activate_function (demux->priv->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_sink_activate));
+ gst_pad_set_event_function (demux->priv->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_sink_event));
+ gst_pad_set_chain_function (demux->priv->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_chain));
+ gst_element_add_pad (GST_ELEMENT (demux), demux->priv->sinkpad);
+ }
+
+ gst_tag_demux_reset (demux);
+}
+
+static void
+gst_tag_demux_dispose (GObject * object)
+{
+ GstTagDemux *tagdemux = GST_TAG_DEMUX (object);
+
+ gst_tag_demux_reset (tagdemux);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static gboolean
+gst_tag_demux_add_srcpad (GstTagDemux * tagdemux, GstCaps * new_caps)
+{
+ if (tagdemux->priv->src_caps == NULL ||
+ !gst_caps_is_equal (new_caps, tagdemux->priv->src_caps)) {
+
+ gst_caps_replace (&tagdemux->priv->src_caps, new_caps);
+
+ if (tagdemux->priv->srcpad != NULL) {
+ GST_DEBUG_OBJECT (tagdemux, "Changing src pad caps to %" GST_PTR_FORMAT,
+ tagdemux->priv->src_caps);
+
+ gst_pad_set_caps (tagdemux->priv->srcpad, tagdemux->priv->src_caps);
+ }
+ } else {
+ /* Caps never changed */
+ }
+
+ if (tagdemux->priv->srcpad == NULL) {
+ tagdemux->priv->srcpad =
+ gst_pad_new_from_template (gst_element_class_get_pad_template
+ (GST_ELEMENT_GET_CLASS (tagdemux), "src"), "src");
+ g_return_val_if_fail (tagdemux->priv->srcpad != NULL, FALSE);
+
+ gst_pad_set_query_type_function (tagdemux->priv->srcpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_get_query_types));
+ gst_pad_set_query_function (tagdemux->priv->srcpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_pad_query));
+ gst_pad_set_event_function (tagdemux->priv->srcpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_srcpad_event));
+ gst_pad_set_activatepull_function (tagdemux->priv->srcpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_src_activate_pull));
+ gst_pad_set_getrange_function (tagdemux->priv->srcpad,
+ GST_DEBUG_FUNCPTR (gst_tag_demux_src_getrange));
+
+ gst_pad_use_fixed_caps (tagdemux->priv->srcpad);
+
+ if (tagdemux->priv->src_caps)
+ gst_pad_set_caps (tagdemux->priv->srcpad, tagdemux->priv->src_caps);
+
+ GST_DEBUG_OBJECT (tagdemux, "Adding src pad with caps %" GST_PTR_FORMAT,
+ tagdemux->priv->src_caps);
+
+ gst_object_ref (tagdemux->priv->srcpad);
+ gst_pad_set_active (tagdemux->priv->srcpad, TRUE);
+ if (!gst_element_add_pad (GST_ELEMENT (tagdemux), tagdemux->priv->srcpad))
+ return FALSE;
+ gst_element_no_more_pads (GST_ELEMENT (tagdemux));
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_tag_demux_remove_srcpad (GstTagDemux * demux)
+{
+ gboolean res = TRUE;
+
+ if (demux->priv->srcpad != NULL) {
+ GST_DEBUG_OBJECT (demux, "Removing src pad");
+ res = gst_element_remove_pad (GST_ELEMENT (demux), demux->priv->srcpad);
+ g_return_val_if_fail (res != FALSE, FALSE);
+ gst_object_unref (demux->priv->srcpad);
+ demux->priv->srcpad = NULL;
+ }
+
+ return res;
+};
+
+/* will return FALSE if buffer is beyond end of data; will return TRUE
+ * if buffer was trimmed successfully or didn't need trimming, but may
+ * also return TRUE and set *buf_ref to NULL if the buffer was before
+ * the start of the data */
+static gboolean
+gst_tag_demux_trim_buffer (GstTagDemux * tagdemux, GstBuffer ** buf_ref,
+ gsize * buf_size)
+{
+ GstBuffer *buf = *buf_ref;
+
+ guint trim_start = 0;
+ guint out_size, bsize;
+ guint64 out_offset, boffset;
+ gboolean need_sub = FALSE;
+
+ bsize = out_size = gst_buffer_get_size (buf);
+ boffset = out_offset = GST_BUFFER_OFFSET (buf);
+
+ /* Adjust offset and length */
+ if (!GST_BUFFER_OFFSET_IS_VALID (buf)) {
+ /* Can't change anything without an offset */
+ *buf_size = bsize;
+ return TRUE;
+ }
+
+ /* If the buffer crosses the tag at the end of file, trim it */
+ if (tagdemux->priv->strip_end > 0) {
+ if (gst_tag_demux_get_upstream_size (tagdemux)) {
+ guint64 v1tag_offset =
+ tagdemux->priv->upstream_size - tagdemux->priv->strip_end;
+
+ if (out_offset >= v1tag_offset) {
+ GST_DEBUG_OBJECT (tagdemux, "Buffer is past the end of the data");
+ goto no_out_buffer_end;
+ }
+
+ if (out_offset + out_size > v1tag_offset) {
+ out_size = v1tag_offset - out_offset;
+ need_sub = TRUE;
+ }
+ }
+ }
+
+ if (tagdemux->priv->strip_start > 0) {
+ /* If the buffer crosses the tag at the start of file, trim it */
+ if (out_offset <= tagdemux->priv->strip_start) {
+ if (out_offset + out_size <= tagdemux->priv->strip_start) {
+ GST_DEBUG_OBJECT (tagdemux, "Buffer is before the start of the data");
+ goto no_out_buffer_start;
+ }
+
+ trim_start = tagdemux->priv->strip_start - out_offset;
+ out_size -= trim_start;
+ out_offset = 0;
+ } else {
+ out_offset -= tagdemux->priv->strip_start;
+ }
+ need_sub = TRUE;
+ }
+
+ if (need_sub == TRUE) {
+ if (out_size != bsize || !gst_buffer_is_writable (buf)) {
+ GstBuffer *sub;
+
+ GST_DEBUG_OBJECT (tagdemux, "Sub-buffering to trim size %d offset %"
+ G_GINT64_FORMAT " to %d offset %" G_GINT64_FORMAT,
+ bsize, boffset, out_size, out_offset);
+
+ sub =
+ gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, trim_start,
+ out_size);
+ g_return_val_if_fail (sub != NULL, FALSE);
+ gst_buffer_unref (buf);
+ *buf_ref = buf = sub;
+ *buf_size = out_size;
+ } else {
+ GST_DEBUG_OBJECT (tagdemux, "Adjusting buffer from size %d offset %"
+ G_GINT64_FORMAT " to %d offset %" G_GINT64_FORMAT,
+ bsize, boffset, out_size, out_offset);
+ }
+
+ GST_BUFFER_OFFSET (buf) = out_offset;
+ GST_BUFFER_OFFSET_END (buf) = out_offset + out_size;
+ }
+
+ return TRUE;
+
+no_out_buffer_end:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return FALSE;
+ }
+no_out_buffer_start:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return TRUE;
+ }
+}
+
+static void
+gst_tag_demux_chain_parse_tag (GstTagDemux * demux, GstBuffer * collect)
+{
+ GstTagDemuxResult parse_ret;
+ GstTagDemuxClass *klass;
+ guint tagsize = 0;
+ guint available;
+
+ g_assert (gst_buffer_is_writable (collect));
+
+ klass = GST_TAG_DEMUX_CLASS (G_OBJECT_GET_CLASS (demux));
+
+ /* If we receive a buffer that's from the middle of the file,
+ * we can't read tags so move to typefinding */
+ if (GST_BUFFER_OFFSET_IS_VALID (collect) && GST_BUFFER_OFFSET (collect) != 0) {
+ GST_DEBUG_OBJECT (demux, "Received buffer from non-zero offset %"
+ G_GINT64_FORMAT ". Can't read tags", GST_BUFFER_OFFSET (collect));
+ demux->priv->state = GST_TAG_DEMUX_TYPEFINDING;
+ return;
+ }
+
+ g_assert (klass->identify_tag != NULL);
+ g_assert (klass->parse_tag != NULL);
+
+ available = gst_buffer_get_size (collect);
+
+ if (available < klass->min_start_size) {
+ GST_DEBUG_OBJECT (demux, "Only %u bytes available, but %u needed "
+ "to identify tag", available, klass->min_start_size);
+ return; /* wait for more data */
+ }
+
+ if (!klass->identify_tag (demux, collect, TRUE, &tagsize)) {
+ GST_DEBUG_OBJECT (demux, "Could not identify start tag");
+ demux->priv->state = GST_TAG_DEMUX_TYPEFINDING;
+ return;
+ }
+
+ /* need to set offset of first buffer to 0 or trimming won't work */
+ if (!GST_BUFFER_OFFSET_IS_VALID (collect)) {
+ GST_WARNING_OBJECT (demux, "Fixing up first buffer without offset");
+ GST_BUFFER_OFFSET (collect) = 0;
+ }
+
+ GST_DEBUG_OBJECT (demux, "Identified tag, size = %u bytes", tagsize);
+
+ do {
+ GstTagList *tags = NULL;
+ guint newsize, saved_size;
+
+ demux->priv->strip_start = tagsize;
+
+ if (available < tagsize) {
+ GST_DEBUG_OBJECT (demux, "Only %u bytes available, but %u needed "
+ "to parse tag", available, tagsize);
+ return; /* wait for more data */
+ }
+
+ saved_size = gst_buffer_get_size (collect);
+ gst_buffer_set_size (collect, tagsize);
+ newsize = tagsize;
+
+ parse_ret = klass->parse_tag (demux, collect, TRUE, &newsize, &tags);
+
+ gst_buffer_set_size (collect, saved_size);
+
+ switch (parse_ret) {
+ case GST_TAG_DEMUX_RESULT_OK:
+ demux->priv->strip_start = newsize;
+ demux->priv->parsed_tags = tags;
+ GST_DEBUG_OBJECT (demux, "Read start tag of size %u", newsize);
+ break;
+ case GST_TAG_DEMUX_RESULT_BROKEN_TAG:
+ demux->priv->strip_start = newsize;
+ demux->priv->parsed_tags = tags;
+ GST_WARNING_OBJECT (demux, "Ignoring broken start tag of size %d",
+ demux->priv->strip_start);
+ break;
+ case GST_TAG_DEMUX_RESULT_AGAIN:
+ GST_DEBUG_OBJECT (demux, "Re-parse, this time with %u bytes", newsize);
+ g_assert (newsize != tagsize);
+ tagsize = newsize;
+ break;
+ }
+ } while (parse_ret == GST_TAG_DEMUX_RESULT_AGAIN);
+
+ GST_LOG_OBJECT (demux, "Parsed tag. Proceeding to typefinding");
+ demux->priv->state = GST_TAG_DEMUX_TYPEFINDING;
+ demux->priv->send_tag_event = TRUE;
+}
+
+static GstFlowReturn
+gst_tag_demux_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstTagDemux *demux;
+ gsize size;
+
+ demux = GST_TAG_DEMUX (GST_PAD_PARENT (pad));
+
+ size = gst_buffer_get_size (buf);
+
+ /* Update our segment position info */
+ if (demux->priv->segment.format == GST_FORMAT_BYTES) {
+ if (GST_BUFFER_OFFSET_IS_VALID (buf))
+ demux->priv->segment.position = GST_BUFFER_OFFSET (buf);
+ demux->priv->segment.position += size;
+ } else if (demux->priv->segment.format == GST_FORMAT_TIME) {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf))
+ demux->priv->segment.position = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf))
+ demux->priv->segment.position += GST_BUFFER_DURATION (buf);
+ }
+
+ if (demux->priv->collect == NULL) {
+ demux->priv->collect = buf;
+ } else {
+ demux->priv->collect = gst_buffer_join (demux->priv->collect, buf);
+ }
+ demux->priv->collect_size += size;
+ buf = NULL;
+
+ switch (demux->priv->state) {
+ case GST_TAG_DEMUX_READ_START_TAG:
+ demux->priv->collect = gst_buffer_make_writable (demux->priv->collect);
+ gst_tag_demux_chain_parse_tag (demux, demux->priv->collect);
+ if (demux->priv->state != GST_TAG_DEMUX_TYPEFINDING)
+ break;
+ /* Fall-through */
+ case GST_TAG_DEMUX_TYPEFINDING:{
+ GstTypeFindProbability probability = 0;
+ GstBuffer *typefind_buf = NULL;
+ gsize typefind_size;
+ GstCaps *caps;
+
+ if (demux->priv->collect_size <
+ TYPE_FIND_MIN_SIZE + demux->priv->strip_start)
+ break; /* Go get more data first */
+
+ GST_DEBUG_OBJECT (demux, "Typefinding with size %" G_GSIZE_FORMAT,
+ demux->priv->collect_size);
+
+ /* Trim the buffer and adjust offset for typefinding */
+ typefind_buf = demux->priv->collect;
+ gst_buffer_ref (typefind_buf);
+ if (!gst_tag_demux_trim_buffer (demux, &typefind_buf, &typefind_size))
+ return GST_FLOW_UNEXPECTED;
+
+ if (typefind_buf == NULL)
+ break; /* Still need more data */
+
+ caps = gst_type_find_helper_for_buffer (GST_OBJECT (demux),
+ typefind_buf, &probability);
+
+ if (caps == NULL) {
+ if (typefind_size < TYPE_FIND_MAX_SIZE) {
+ /* Just break for more data */
+ gst_buffer_unref (typefind_buf);
+ return GST_FLOW_OK;
+ }
+
+ /* We failed typefind */
+ GST_ELEMENT_ERROR (demux, STREAM, TYPE_NOT_FOUND, (NULL),
+ ("Could not detect type for contents within tag"));
+ gst_buffer_unref (typefind_buf);
+ gst_buffer_unref (demux->priv->collect);
+ demux->priv->collect = NULL;
+ demux->priv->collect_size = 0;
+ return GST_FLOW_ERROR;
+ }
+ gst_buffer_unref (typefind_buf);
+
+ GST_DEBUG_OBJECT (demux, "Found type %" GST_PTR_FORMAT " with a "
+ "probability of %u", caps, probability);
+
+ if (!gst_tag_demux_add_srcpad (demux, caps)) {
+ GST_DEBUG_OBJECT (demux, "Failed to add srcpad");
+ gst_caps_unref (caps);
+ goto error;
+ }
+ gst_caps_unref (caps);
+
+ /* Move onto streaming and fall-through to push out existing
+ * data */
+ demux->priv->state = GST_TAG_DEMUX_STREAMING;
+ /* fall-through */
+ }
+ case GST_TAG_DEMUX_STREAMING:{
+ GstBuffer *outbuf = NULL;
+ gsize outbuf_size;
+
+ /* Trim the buffer and adjust offset */
+ if (demux->priv->collect) {
+ outbuf = demux->priv->collect;
+ demux->priv->collect = NULL;
+ demux->priv->collect_size = 0;
+ if (!gst_tag_demux_trim_buffer (demux, &outbuf, &outbuf_size))
+ return GST_FLOW_UNEXPECTED;
+ }
+ if (outbuf) {
+ if (G_UNLIKELY (demux->priv->srcpad == NULL)) {
+ gst_buffer_unref (outbuf);
+ return GST_FLOW_ERROR;
+ }
+
+ /* Might need a new segment before the buffer */
+ if (demux->priv->need_newseg) {
+ if (!gst_tag_demux_send_new_segment (demux)) {
+ GST_WARNING_OBJECT (demux, "Downstream did not handle newsegment "
+ "event as it should");
+ }
+ demux->priv->need_newseg = FALSE;
+ }
+
+ /* send any pending events we cached */
+ gst_tag_demux_send_pending_events (demux);
+
+ /* Send our own pending tag event */
+ if (demux->priv->send_tag_event) {
+ gst_tag_demux_send_tag_event (demux);
+ demux->priv->send_tag_event = FALSE;
+ }
+
+ GST_LOG_OBJECT (demux, "Pushing buffer %p", outbuf);
+
+ return gst_pad_push (demux->priv->srcpad, outbuf);
+ }
+ }
+ }
+ return GST_FLOW_OK;
+
+error:
+ GST_DEBUG_OBJECT (demux, "error in chain function");
+
+ return GST_FLOW_ERROR;
+}
+
+static gboolean
+gst_tag_demux_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstTagDemux *demux;
+ gboolean ret;
+
+ demux = GST_TAG_DEMUX (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ if (demux->priv->srcpad == NULL) {
+ GST_WARNING_OBJECT (demux, "EOS before we found a type");
+ GST_ELEMENT_ERROR (demux, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ }
+ ret = gst_pad_event_default (pad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &demux->priv->segment);
+
+ demux->priv->need_newseg = TRUE;
+ gst_event_unref (event);
+ ret = TRUE;
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ default:
+ if (demux->priv->need_newseg && GST_EVENT_IS_SERIALIZED (event)) {
+ /* Cache all events if we have a pending segment, so they don't get
+ * lost (esp. tag events) */
+ GST_INFO_OBJECT (demux, "caching event: %" GST_PTR_FORMAT, event);
+ GST_OBJECT_LOCK (demux);
+ demux->priv->pending_events =
+ g_list_append (demux->priv->pending_events, event);
+ GST_OBJECT_UNLOCK (demux);
+ ret = TRUE;
+ } else {
+ ret = gst_pad_event_default (pad, event);
+ }
+ break;
+ }
+
+ gst_object_unref (demux);
+ return ret;
+}
+
+static gboolean
+gst_tag_demux_get_upstream_size (GstTagDemux * tagdemux)
+{
+ gint64 len;
+
+ /* Short-cut if we already queried upstream */
+ if (tagdemux->priv->upstream_size > 0)
+ return TRUE;
+
+ if (!gst_pad_query_peer_duration (tagdemux->priv->sinkpad, GST_FORMAT_BYTES,
+ &len) || len <= 0) {
+ return FALSE;
+ }
+
+ tagdemux->priv->upstream_size = len;
+ return TRUE;
+}
+
+static gboolean
+gst_tag_demux_srcpad_event (GstPad * pad, GstEvent * event)
+{
+ GstTagDemux *tagdemux;
+ gboolean res = FALSE;
+
+ tagdemux = GST_TAG_DEMUX (gst_pad_get_parent (pad));
+
+ /* Handle SEEK events, with adjusted byte offsets and sizes. */
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ gdouble rate;
+ GstFormat format;
+ GstSeekType cur_type, stop_type;
+ GstSeekFlags flags;
+ gint64 cur, stop;
+
+ gst_event_parse_seek (event, &rate, &format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+
+ if (format == GST_FORMAT_BYTES &&
+ tagdemux->priv->state == GST_TAG_DEMUX_STREAMING &&
+ gst_pad_is_linked (tagdemux->priv->sinkpad)) {
+ GstEvent *upstream;
+
+ switch (cur_type) {
+ case GST_SEEK_TYPE_SET:
+ if (cur == -1)
+ cur = 0;
+ cur += tagdemux->priv->strip_start;
+ break;
+ case GST_SEEK_TYPE_CUR:
+ break;
+ case GST_SEEK_TYPE_END:
+ /* Adjust the seek to be relative to the start of any end tag
+ * (note: 10 bytes before end is represented by stop=-10) */
+ if (cur > 0)
+ cur = 0;
+ cur -= tagdemux->priv->strip_end;
+ break;
+ case GST_SEEK_TYPE_NONE:
+ default:
+ break;
+ }
+ switch (stop_type) {
+ case GST_SEEK_TYPE_SET:
+ if (stop != -1) {
+ /* -1 means the end of the file, pass it upstream intact */
+ stop += tagdemux->priv->strip_start;
+ }
+ break;
+ case GST_SEEK_TYPE_CUR:
+ break;
+ case GST_SEEK_TYPE_END:
+ /* Adjust the seek to be relative to the start of any end tag
+ * (note: 10 bytes before end is represented by stop=-10) */
+ if (stop > 0)
+ stop = 0;
+ stop -= tagdemux->priv->strip_end;
+ break;
+ case GST_SEEK_TYPE_NONE:
+ default:
+ break;
+ }
+ upstream = gst_event_new_seek (rate, format, flags,
+ cur_type, cur, stop_type, stop);
+ res = gst_pad_push_event (tagdemux->priv->sinkpad, upstream);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_push_event (tagdemux->priv->sinkpad, event);
+ event = NULL;
+ break;
+ }
+
+ gst_object_unref (tagdemux);
+ if (event)
+ gst_event_unref (event);
+ return res;
+}
+
+/* Read and interpret any end tag when activating in pull_range.
+ * Returns FALSE if pad activation should fail. */
+static gboolean
+gst_tag_demux_pull_end_tag (GstTagDemux * demux, GstTagList ** tags)
+{
+ GstTagDemuxResult parse_ret;
+ GstTagDemuxClass *klass;
+ GstFlowReturn flow_ret;
+ GstTagList *new_tags = NULL;
+ GstBuffer *buffer = NULL;
+ gboolean have_tag;
+ gboolean res = FALSE;
+ guint64 offset;
+ guint tagsize;
+ gsize bsize;
+
+ klass = GST_TAG_DEMUX_CLASS (G_OBJECT_GET_CLASS (demux));
+
+ g_assert (klass->identify_tag != NULL);
+ g_assert (klass->parse_tag != NULL);
+
+ if (klass->min_end_size == 0) {
+ GST_DEBUG_OBJECT (demux, "Not looking for tag at the end");
+ return TRUE;
+ }
+
+ if (demux->priv->upstream_size < klass->min_end_size) {
+ GST_DEBUG_OBJECT (demux, "File too small");
+ return TRUE;
+ }
+
+ /* Pull enough to identify the tag and retrieve its total size */
+ offset = demux->priv->upstream_size - klass->min_end_size;
+
+ flow_ret = gst_pad_pull_range (demux->priv->sinkpad, offset,
+ klass->min_end_size, &buffer);
+
+ if (flow_ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (demux, "Could not read tag header from end of file, "
+ "ret = %s", gst_flow_get_name (flow_ret));
+ goto done;
+ }
+
+ bsize = gst_buffer_get_size (buffer);
+
+ if (bsize < klass->min_end_size) {
+ GST_DEBUG_OBJECT (demux, "Only managed to read %" G_GSIZE_FORMAT " bytes"
+ "from file (required: %u bytes)", bsize, klass->min_end_size);
+ goto done;
+ }
+
+ have_tag = klass->identify_tag (demux, buffer, FALSE, &tagsize);
+
+ if (!have_tag) {
+ GST_DEBUG_OBJECT (demux, "Could not find tag at end");
+ goto done;
+ }
+
+ /* Now pull the entire tag */
+ do {
+ guint newsize, saved_size;
+
+ GST_DEBUG_OBJECT (demux, "Identified tag at end, size=%u bytes", tagsize);
+
+ demux->priv->strip_end = tagsize;
+
+ g_assert (tagsize >= klass->min_end_size);
+
+ /* Get buffer that's exactly the requested size */
+ if (bsize != tagsize) {
+ gst_buffer_unref (buffer);
+ buffer = NULL;
+
+ offset = demux->priv->upstream_size - tagsize;
+
+ flow_ret = gst_pad_pull_range (demux->priv->sinkpad, offset,
+ tagsize, &buffer);
+
+ if (flow_ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (demux, "Could not read data from end of file at "
+ "offset %" G_GUINT64_FORMAT ". ret = %s", offset,
+ gst_flow_get_name (flow_ret));
+ goto done;
+ }
+
+ bsize = gst_buffer_get_size (buffer);
+
+ if (bsize < tagsize) {
+ GST_DEBUG_OBJECT (demux, "Only managed to read %" G_GSIZE_FORMAT
+ " bytes from file", bsize);
+ goto done;
+ }
+ }
+
+ GST_BUFFER_OFFSET (buffer) = offset;
+
+ saved_size = bsize;
+ gst_buffer_set_size (buffer, tagsize);
+ newsize = tagsize;
+
+ parse_ret = klass->parse_tag (demux, buffer, FALSE, &newsize, &new_tags);
+
+ gst_buffer_set_size (buffer, saved_size);
+
+ switch (parse_ret) {
+ case GST_TAG_DEMUX_RESULT_OK:
+ res = TRUE;
+ demux->priv->strip_end = newsize;
+ GST_DEBUG_OBJECT (demux, "Read tag at end, size %d",
+ demux->priv->strip_end);
+ break;
+ case GST_TAG_DEMUX_RESULT_BROKEN_TAG:
+ res = TRUE;
+ demux->priv->strip_end = newsize;
+ GST_WARNING_OBJECT (demux, "Ignoring broken tag at end, size %d",
+ demux->priv->strip_end);
+ break;
+ case GST_TAG_DEMUX_RESULT_AGAIN:
+ GST_DEBUG_OBJECT (demux, "Re-parse, this time with %d bytes", newsize);
+ g_assert (newsize != tagsize);
+ tagsize = newsize;
+ break;
+ }
+ } while (parse_ret == GST_TAG_DEMUX_RESULT_AGAIN);
+
+ *tags = new_tags;
+ new_tags = NULL;
+
+done:
+ if (new_tags)
+ gst_tag_list_free (new_tags);
+ if (buffer)
+ gst_buffer_unref (buffer);
+ return res;
+}
+
+/* Read and interpret any tag at the start when activating in
+ * pull_range. Returns FALSE if pad activation should fail. */
+static gboolean
+gst_tag_demux_pull_start_tag (GstTagDemux * demux, GstTagList ** tags)
+{
+ GstTagDemuxResult parse_ret;
+ GstTagDemuxClass *klass;
+ GstFlowReturn flow_ret;
+ GstTagList *new_tags = NULL;
+ GstBuffer *buffer = NULL;
+ gboolean have_tag;
+ gboolean res = FALSE;
+ guint req, tagsize;
+ gsize bsize;
+
+ klass = GST_TAG_DEMUX_CLASS (G_OBJECT_GET_CLASS (demux));
+
+ g_assert (klass->identify_tag != NULL);
+ g_assert (klass->parse_tag != NULL);
+
+ if (klass->min_start_size == 0) {
+ GST_DEBUG_OBJECT (demux, "Not looking for tag at the beginning");
+ return TRUE;
+ }
+
+ /* Handle tag at start. Try with 4kB to start with */
+ req = MAX (klass->min_start_size, 4096);
+
+ /* Pull enough to identify the tag and retrieve its total size */
+ flow_ret = gst_pad_pull_range (demux->priv->sinkpad, 0, req, &buffer);
+ if (flow_ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (demux, "Could not read data from start of file ret=%s",
+ gst_flow_get_name (flow_ret));
+ goto done;
+ }
+
+ bsize = gst_buffer_get_size (buffer);
+
+ if (bsize < klass->min_start_size) {
+ GST_DEBUG_OBJECT (demux, "Only managed to read %" G_GSIZE_FORMAT
+ " bytes from file - no tag in this file", bsize);
+ goto done;
+ }
+
+ have_tag = klass->identify_tag (demux, buffer, TRUE, &tagsize);
+
+ if (!have_tag) {
+ GST_DEBUG_OBJECT (demux, "Could not find start tag");
+ res = TRUE;
+ goto done;
+ }
+
+ GST_DEBUG_OBJECT (demux, "Identified start tag, size = %u bytes", tagsize);
+
+ do {
+ guint newsize, saved_size;
+
+ demux->priv->strip_start = tagsize;
+
+ /* Now pull the entire tag */
+ g_assert (tagsize >= klass->min_start_size);
+
+ if (bsize < tagsize) {
+ gst_buffer_unref (buffer);
+ buffer = NULL;
+
+ flow_ret = gst_pad_pull_range (demux->priv->sinkpad, 0, tagsize, &buffer);
+ if (flow_ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (demux, "Could not read data from start of file, "
+ "ret = %s", gst_flow_get_name (flow_ret));
+ goto done;
+ }
+
+ bsize = gst_buffer_get_size (buffer);
+
+ if (bsize < tagsize) {
+ GST_DEBUG_OBJECT (demux, "Only managed to read %" G_GSIZE_FORMAT
+ " bytes from file", bsize);
+ GST_ELEMENT_ERROR (demux, STREAM, DECODE,
+ (_("Failed to read tag: not enough data")), (NULL));
+ goto done;
+ }
+ }
+
+ saved_size = bsize;
+ gst_buffer_set_size (buffer, tagsize);
+ newsize = tagsize;
+ parse_ret = klass->parse_tag (demux, buffer, TRUE, &newsize, &new_tags);
+
+ gst_buffer_set_size (buffer, saved_size);
+
+ switch (parse_ret) {
+ case GST_TAG_DEMUX_RESULT_OK:
+ res = TRUE;
+ demux->priv->strip_start = newsize;
+ GST_DEBUG_OBJECT (demux, "Read start tag of size %d", newsize);
+ break;
+ case GST_TAG_DEMUX_RESULT_BROKEN_TAG:
+ res = TRUE;
+ demux->priv->strip_start = newsize;
+ GST_WARNING_OBJECT (demux, "Ignoring broken start tag of size %d",
+ demux->priv->strip_start);
+ break;
+ case GST_TAG_DEMUX_RESULT_AGAIN:
+ GST_DEBUG_OBJECT (demux, "Re-parse, this time with %d bytes", newsize);
+ g_assert (newsize != tagsize);
+ tagsize = newsize;
+ break;
+ }
+ } while (parse_ret == GST_TAG_DEMUX_RESULT_AGAIN);
+
+ *tags = new_tags;
+ new_tags = NULL;
+
+done:
+ if (new_tags)
+ gst_tag_list_free (new_tags);
+ if (buffer)
+ gst_buffer_unref (buffer);
+ return res;
+}
+
+/* This function operates similarly to gst_type_find_element_activate
+ * in the typefind element
+ * 1. try to activate in pull mode. if not, switch to push and succeed.
+ * 2. try to read tags in pull mode
+ * 3. typefind the contents
+ * 4. deactivate pull mode.
+ * 5. if we didn't find any caps, fail.
+ * 6. Add the srcpad
+ * 7. if the sink pad is activated, we are in pull mode. succeed.
+ * otherwise activate both pads in push mode and succeed.
+ */
+static gboolean
+gst_tag_demux_sink_activate (GstPad * sinkpad)
+{
+ GstTypeFindProbability probability = 0;
+ GstTagDemuxClass *klass;
+ GstTagDemux *demux;
+ GstTagList *start_tags = NULL;
+ GstTagList *end_tags = NULL;
+ gboolean e_tag_ok, s_tag_ok;
+ gboolean ret = FALSE;
+ GstCaps *caps = NULL;
+ GstQuery *query;
+ gboolean pull_mode;
+
+ demux = GST_TAG_DEMUX (GST_PAD_PARENT (sinkpad));
+ klass = GST_TAG_DEMUX_CLASS (G_OBJECT_GET_CLASS (demux));
+
+ /* 1: */
+ /* If we can activate pull_range upstream, then read any end and start
+ * tags, otherwise activate in push mode and the chain function will
+ * collect buffers, read the start tag and output a buffer to end
+ * preroll.
+ */
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (sinkpad, query)) {
+ gst_query_unref (query);
+ goto activate_push;
+ }
+
+ gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+ gst_query_unref (query);
+
+ if (!pull_mode)
+ goto activate_push;
+
+ if (!gst_pad_activate_pull (sinkpad, TRUE))
+ goto activate_push;
+
+ /* Look for tags at start and end of file */
+ GST_DEBUG_OBJECT (demux, "Activated pull mode. Looking for tags");
+ if (!gst_tag_demux_get_upstream_size (demux))
+ return FALSE;
+
+ demux->priv->strip_start = 0;
+ demux->priv->strip_end = 0;
+
+ s_tag_ok = gst_tag_demux_pull_start_tag (demux, &start_tags);
+ e_tag_ok = gst_tag_demux_pull_end_tag (demux, &end_tags);
+
+ if (klass->merge_tags != NULL) {
+ demux->priv->parsed_tags = klass->merge_tags (demux, start_tags, end_tags);
+ } else {
+ /* we merge in REPLACE mode, so put the less important tags first, which
+ * we'll just assume is the end tag (subclasses may change this behaviour
+ * or make it configurable by overriding the merge_tags vfunc) */
+ demux->priv->parsed_tags =
+ gst_tag_list_merge (end_tags, start_tags, GST_TAG_MERGE_REPLACE);
+ }
+
+ if (start_tags)
+ gst_tag_list_free (start_tags);
+ if (end_tags)
+ gst_tag_list_free (end_tags);
+
+ if (!e_tag_ok && !s_tag_ok)
+ return FALSE;
+
+ if (demux->priv->parsed_tags != NULL) {
+ demux->priv->send_tag_event = TRUE;
+ }
+
+ if (demux->priv->upstream_size <=
+ demux->priv->strip_start + demux->priv->strip_end) {
+ /* There was no data (probably due to a truncated file) */
+ GST_DEBUG_OBJECT (demux, "No data in file");
+ /* so we don't know about type either */
+ GST_ELEMENT_ERROR (demux, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ goto done_activate;
+ }
+
+ /* 3 - Do typefinding on data */
+ caps = gst_type_find_helper_get_range (GST_OBJECT (demux),
+ (GstTypeFindHelperGetRangeFunction) gst_tag_demux_read_range,
+ demux->priv->upstream_size
+ - (demux->priv->strip_start + demux->priv->strip_end), &probability);
+
+ GST_DEBUG_OBJECT (demux, "Found type %" GST_PTR_FORMAT " with a "
+ "probability of %u", caps, probability);
+
+ /* 4 - Deactivate pull mode */
+ if (!gst_pad_activate_pull (sinkpad, FALSE)) {
+ if (caps)
+ gst_caps_unref (caps);
+ GST_DEBUG_OBJECT (demux, "Could not deactivate sinkpad after reading tags");
+ return FALSE;
+ }
+
+ /* 5 - If we didn't find the caps, fail */
+ if (caps == NULL) {
+ GST_DEBUG_OBJECT (demux, "Could not detect type of contents");
+ GST_ELEMENT_ERROR (demux, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ goto done_activate;
+ }
+
+ /* tag reading and typefinding were already done, don't do them again in
+ * the chain function if we end up in push mode */
+ demux->priv->state = GST_TAG_DEMUX_STREAMING;
+
+ /* 6 Add the srcpad for output now we know caps. */
+ if (!gst_tag_demux_add_srcpad (demux, caps)) {
+ GST_DEBUG_OBJECT (demux, "Could not add source pad");
+ goto done_activate;
+ }
+
+ /* 7 - if the sinkpad is active, it was done by downstream so we're
+ * done, otherwise switch to push */
+ ret = TRUE;
+ if (!gst_pad_is_active (sinkpad)) {
+ ret = gst_pad_activate_push (demux->priv->srcpad, TRUE);
+ ret &= gst_pad_activate_push (sinkpad, TRUE);
+ }
+
+done_activate:
+
+ if (caps)
+ gst_caps_unref (caps);
+
+ return ret;
+
+activate_push:
+ {
+ GST_DEBUG_OBJECT (demux, "No pull mode. Changing to push, but won't be "
+ "able to read end tags");
+ demux->priv->state = GST_TAG_DEMUX_READ_START_TAG;
+ return gst_pad_activate_push (sinkpad, TRUE);
+ }
+}
+
+static gboolean
+gst_tag_demux_src_activate_pull (GstPad * pad, gboolean active)
+{
+ GstTagDemux *demux = GST_TAG_DEMUX (GST_PAD_PARENT (pad));
+
+ return gst_pad_activate_pull (demux->priv->sinkpad, active);
+}
+
+static GstFlowReturn
+gst_tag_demux_read_range (GstTagDemux * demux,
+ guint64 offset, guint length, GstBuffer ** buffer)
+{
+ GstFlowReturn ret;
+ guint64 in_offset;
+ guint in_length;
+ gsize size;
+
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ /* Adjust offset and length of the request to trim off tag information.
+ * For the returned buffer, adjust the output offset to match what downstream
+ * should see */
+ in_offset = offset + demux->priv->strip_start;
+
+ if (!gst_tag_demux_get_upstream_size (demux))
+ return GST_FLOW_ERROR;
+
+ if (in_offset + length >= demux->priv->upstream_size - demux->priv->strip_end) {
+ if (in_offset + demux->priv->strip_end >= demux->priv->upstream_size)
+ return GST_FLOW_UNEXPECTED;
+ in_length = demux->priv->upstream_size - demux->priv->strip_end - in_offset;
+ } else {
+ in_length = length;
+ }
+
+ ret = gst_pad_pull_range (demux->priv->sinkpad, in_offset, in_length, buffer);
+
+ if (ret == GST_FLOW_OK && *buffer) {
+ if (!gst_tag_demux_trim_buffer (demux, buffer, &size))
+ goto read_beyond_end;
+
+ /* this should only happen in streaming mode */
+ g_assert (*buffer != NULL);
+ }
+
+ return ret;
+
+read_beyond_end:
+ {
+ GST_DEBUG_OBJECT (demux, "attempted read beyond end of file");
+ if (*buffer != NULL) {
+ gst_buffer_unref (*buffer);
+ *buffer = NULL;
+ }
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstFlowReturn
+gst_tag_demux_src_getrange (GstPad * srcpad,
+ guint64 offset, guint length, GstBuffer ** buffer)
+{
+ GstTagDemux *demux = GST_TAG_DEMUX (GST_PAD_PARENT (srcpad));
+
+ /* downstream in pull mode won't miss a newsegment event,
+ * but it likely appreciates other (tag) events */
+ if (demux->priv->need_newseg) {
+ gst_tag_demux_send_pending_events (demux);
+ demux->priv->need_newseg = FALSE;
+ }
+
+ if (demux->priv->send_tag_event) {
+ gst_tag_demux_send_tag_event (demux);
+ demux->priv->send_tag_event = FALSE;
+ }
+
+ return gst_tag_demux_read_range (demux, offset, length, buffer);
+}
+
+static GstStateChangeReturn
+gst_tag_demux_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstTagDemux *demux = GST_TAG_DEMUX (element);
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_tag_demux_reset (demux);
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+static gboolean
+gst_tag_demux_pad_query (GstPad * pad, GstQuery * query)
+{
+ /* For a position or duration query, adjust the returned
+ * bytes to strip off the end and start areas */
+
+ GstTagDemux *demux = GST_TAG_DEMUX (GST_PAD_PARENT (pad));
+ GstPad *peer = NULL;
+ GstFormat format;
+ gint64 result;
+
+ if ((peer = gst_pad_get_peer (demux->priv->sinkpad)) == NULL)
+ return FALSE;
+
+ if (!gst_pad_query (peer, query)) {
+ gst_object_unref (peer);
+ return FALSE;
+ }
+
+ gst_object_unref (peer);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gst_query_parse_position (query, &format, &result);
+ if (format == GST_FORMAT_BYTES) {
+ result -= demux->priv->strip_start;
+ gst_query_set_position (query, format, result);
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ gst_query_parse_duration (query, &format, &result);
+ if (format == GST_FORMAT_BYTES) {
+ result -= demux->priv->strip_start + demux->priv->strip_end;
+ gst_query_set_duration (query, format, result);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+static const GstQueryType *
+gst_tag_demux_get_query_types (GstPad * pad)
+{
+ static const GstQueryType types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ 0
+ };
+
+ return types;
+}
+
+static void
+gst_tag_demux_send_pending_events (GstTagDemux * demux)
+{
+ GList *events;
+
+ /* send any pending events we cached */
+ GST_OBJECT_LOCK (demux);
+ events = demux->priv->pending_events;
+ demux->priv->pending_events = NULL;
+ GST_OBJECT_UNLOCK (demux);
+
+ while (events != NULL) {
+ GST_DEBUG_OBJECT (demux->priv->srcpad, "sending cached %s event: %"
+ GST_PTR_FORMAT, GST_EVENT_TYPE_NAME (events->data), events->data);
+ gst_pad_push_event (demux->priv->srcpad, GST_EVENT (events->data));
+ events = g_list_delete_link (events, events);
+ }
+}
+
+static void
+gst_tag_demux_send_tag_event (GstTagDemux * demux)
+{
+ /* FIXME: what's the correct merge mode? Docs need to tell... */
+ GstTagList *merged = gst_tag_list_merge (demux->priv->event_tags,
+ demux->priv->parsed_tags, GST_TAG_MERGE_KEEP);
+
+ if (demux->priv->parsed_tags)
+ gst_element_post_message (GST_ELEMENT (demux),
+ gst_message_new_tag (GST_OBJECT (demux),
+ gst_tag_list_copy (demux->priv->parsed_tags)));
+
+ if (merged) {
+ GstEvent *event = gst_event_new_tag (merged);
+
+ GST_EVENT_TIMESTAMP (event) = 0;
+ GST_DEBUG_OBJECT (demux, "Sending tag event on src pad");
+ gst_pad_push_event (demux->priv->srcpad, event);
+ }
+}
+
+static gboolean
+gst_tag_demux_send_new_segment (GstTagDemux * tagdemux)
+{
+ GstEvent *event;
+ gint64 start, stop, position;
+ GstSegment *seg = &tagdemux->priv->segment;
+ GstSegment newseg;
+
+ if (seg->format == GST_FORMAT_UNDEFINED) {
+ GST_LOG_OBJECT (tagdemux,
+ "No new segment received before first buffer. Using default");
+ gst_segment_init (seg, GST_FORMAT_BYTES);
+ seg->start = tagdemux->priv->strip_start;
+ seg->time = tagdemux->priv->strip_start;
+ }
+
+ /* Can't adjust segments in non-BYTES formats */
+ if (tagdemux->priv->segment.format != GST_FORMAT_BYTES) {
+ event = gst_event_new_segment (seg);
+ return gst_pad_push_event (tagdemux->priv->srcpad, event);
+ }
+
+ start = seg->start;
+ stop = seg->stop;
+ position = seg->time;
+
+ g_return_val_if_fail (start != -1, FALSE);
+ g_return_val_if_fail (position != -1, FALSE);
+
+ if (tagdemux->priv->strip_end > 0) {
+ if (gst_tag_demux_get_upstream_size (tagdemux)) {
+ guint64 v1tag_offset =
+ tagdemux->priv->upstream_size - tagdemux->priv->strip_end;
+
+ if (start >= v1tag_offset) {
+ /* Segment is completely within the end tag, output an open-ended
+ * segment, even though all the buffers will get trimmed away */
+ start = v1tag_offset;
+ stop = -1;
+ }
+
+ if (stop != -1 && stop >= v1tag_offset) {
+ GST_DEBUG_OBJECT (tagdemux,
+ "Segment crosses the end tag. Trimming end");
+ stop = v1tag_offset;
+ }
+ }
+ }
+
+ if (tagdemux->priv->strip_start > 0) {
+ if (start > tagdemux->priv->strip_start)
+ start -= tagdemux->priv->strip_start;
+ else
+ start = 0;
+
+ if (position > tagdemux->priv->strip_start)
+ position -= tagdemux->priv->strip_start;
+ else
+ position = 0;
+
+ if (stop != -1) {
+ if (stop > tagdemux->priv->strip_start)
+ stop -= tagdemux->priv->strip_start;
+ else
+ stop = 0;
+ }
+ }
+
+ GST_DEBUG_OBJECT (tagdemux, "Sending segment %" GST_SEGMENT_FORMAT, seg);
+
+ gst_segment_copy_into (seg, &newseg);
+ newseg.start = start;
+ newseg.stop = stop;
+ newseg.position = position;
+ event = gst_event_new_segment (&newseg);
+
+ return gst_pad_push_event (tagdemux->priv->srcpad, event);
+}
diff --git a/gst-libs/gst/tag/gsttagdemux.h b/gst-libs/gst/tag/gsttagdemux.h
new file mode 100644
index 0000000..1fbff90
--- /dev/null
+++ b/gst-libs/gst/tag/gsttagdemux.h
@@ -0,0 +1,144 @@
+/* GStreamer Base Class for Tag Demuxing
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TAG_DEMUX_H__
+#define __GST_TAG_DEMUX_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TAG_DEMUX (gst_tag_demux_get_type())
+#define GST_TAG_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_DEMUX,GstTagDemux))
+#define GST_TAG_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_DEMUX,GstTagDemuxClass))
+#define GST_IS_TAG_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_DEMUX))
+#define GST_IS_TAG_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_DEMUX))
+
+typedef struct _GstTagDemux GstTagDemux;
+typedef struct _GstTagDemuxClass GstTagDemuxClass;
+typedef struct _GstTagDemuxPrivate GstTagDemuxPrivate;
+
+/**
+ * GstTagDemuxResult:
+ * @GST_TAG_DEMUX_RESULT_BROKEN_TAG: cannot parse tag, just skip it
+ * @GST_TAG_DEMUX_RESULT_AGAIN : call again with less or more data
+ * @GST_TAG_DEMUX_RESULT_OK : parsed tag successfully
+ *
+ * Result values from the parse_tag virtual function.
+ *
+ * Since: 0.10.15
+ */
+typedef enum {
+ GST_TAG_DEMUX_RESULT_BROKEN_TAG,
+ GST_TAG_DEMUX_RESULT_AGAIN,
+ GST_TAG_DEMUX_RESULT_OK
+} GstTagDemuxResult;
+
+GType gst_tag_demux_result_get_type (void);
+#define GST_TYPE_TAG_DEMUX_RESULT (gst_tag_demux_result_get_type())
+
+/**
+ * GstTagDemux:
+ * @element: parent element
+ *
+ * Opaque #GstTagDemux structure.
+ *
+ * Since: 0.10.15
+ */
+struct _GstTagDemux
+{
+ GstElement element;
+
+ /*< private >*/
+ GstTagDemuxPrivate *priv;
+
+ gpointer reserved[GST_PADDING];
+};
+
+/**
+ * GstTagDemuxClass:
+ * @parent_class: the parent class.
+ * @min_start_size: minimum size required to identify a tag at the start and
+ * determine its total size. Set to 0 if not interested in start tags.
+ * Subclasses should set this in their class_init function.
+ * @min_end_size: minimum size required to identify a tag at the end and
+ * determine its total size. Set to 0 if not interested in end tags.
+ * Subclasses should set this in their class_init function.
+ * @identify_tag: identify tag and determine the size required to parse the
+ * tag. Buffer may be larger than the specified minimum size.
+ * Subclassed MUST override this vfunc in their class_init function.
+ * @parse_tag: parse the tag. Buffer will be exactly of the size determined by
+ * the identify_tag vfunc before. The parse_tag vfunc may change the size
+ * stored in *tag_size and return GST_TAG_DEMUX_RESULT_AGAIN to request a
+ * larger or smaller buffer. It is also permitted to adjust the tag_size to a
+ * smaller value and then return GST_TAG_DEMUX_RESULT_OK in one go.
+ * Subclassed MUST override the parse_tag vfunc in their class_init function.
+ * @merge_tags: merge start and end tags. Subclasses may want to override this
+ * vfunc to allow prioritising of start or end tag according to user
+ * preference. Note that both start_tags and end_tags may be NULL. By default
+ * start tags are prefered over end tags.
+ *
+ * The #GstTagDemuxClass structure. See documentation at beginning of section
+ * for details about what subclasses need to override and do.
+ *
+ * Since: 0.10.15
+ */
+struct _GstTagDemuxClass
+{
+ GstElementClass parent_class;
+
+ /* minimum size required to identify a tag at the start and determine
+ * its total size */
+ guint min_start_size;
+
+ /* minimum size required to identify a tag at the end and determine
+ * its total size */
+ guint min_end_size;
+
+ /* vtable */
+
+ /* identify tag and determine the size required to parse the tag */
+ gboolean (*identify_tag) (GstTagDemux * demux,
+ GstBuffer * buffer,
+ gboolean start_tag,
+ guint * tag_size);
+
+ /* parse the tag once it is identified and its size is known */
+ GstTagDemuxResult (*parse_tag) (GstTagDemux * demux,
+ GstBuffer * buffer,
+ gboolean start_tag,
+ guint * tag_size,
+ GstTagList ** tags);
+
+ /* merge start and end tags (optional) */
+ GstTagList * (*merge_tags) (GstTagDemux * demux,
+ const GstTagList * start_tags,
+ const GstTagList * end_tags);
+
+ /*< private >*/
+ gpointer reserved[GST_PADDING];
+};
+
+GType gst_tag_demux_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TAG_DEMUX_H__ */
+
diff --git a/gst-libs/gst/tag/gsttageditingprivate.c b/gst-libs/gst/tag/gsttageditingprivate.c
new file mode 100644
index 0000000..0626874
--- /dev/null
+++ b/gst-libs/gst/tag/gsttageditingprivate.c
@@ -0,0 +1,468 @@
+/* GStreamer
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "gsttageditingprivate.h"
+
+#include <string.h>
+
+gint
+__exif_tag_image_orientation_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "rotate-0") == 0)
+ return 1;
+ else if (strcmp (str, "flip-rotate-0") == 0)
+ return 2;
+ else if (strcmp (str, "rotate-180") == 0)
+ return 3;
+ else if (strcmp (str, "flip-rotate-180") == 0)
+ return 4;
+ else if (strcmp (str, "flip-rotate-270") == 0)
+ return 5;
+ else if (strcmp (str, "rotate-90") == 0)
+ return 6;
+ else if (strcmp (str, "flip-rotate-90") == 0)
+ return 7;
+ else if (strcmp (str, "rotate-270") == 0)
+ return 8;
+
+end:
+ GST_WARNING ("Invalid image orientation tag: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_image_orientation_from_exif_value (gint value)
+{
+ switch (value) {
+ case 1:
+ return "rotate-0";
+ case 2:
+ return "flip-rotate-0";
+ case 3:
+ return "rotate-180";
+ case 4:
+ return "flip-rotate-180";
+ case 5:
+ return "flip-rotate-270";
+ case 6:
+ return "rotate-90";
+ case 7:
+ return "flip-rotate-90";
+ case 8:
+ return "rotate-270";
+ default:
+ GST_WARNING ("Invalid tiff orientation tag value: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_exposure_program_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "undefined") == 0)
+ return 0;
+ else if (strcmp (str, "manual") == 0)
+ return 1;
+ else if (strcmp (str, "normal") == 0)
+ return 2;
+ else if (strcmp (str, "aperture-priority") == 0)
+ return 3;
+ else if (strcmp (str, "shutter-priority") == 0)
+ return 4;
+ else if (strcmp (str, "creative") == 0)
+ return 5;
+ else if (strcmp (str, "action") == 0)
+ return 6;
+ else if (strcmp (str, "portrait") == 0)
+ return 7;
+ else if (strcmp (str, "landscape") == 0)
+ return 8;
+
+end:
+ GST_WARNING ("Invalid capturing exposure program tag: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_exposure_program_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "undefined";
+ case 1:
+ return "manual";
+ case 2:
+ return "normal";
+ case 3:
+ return "aperture-priority";
+ case 4:
+ return "shutter-priority";
+ case 5:
+ return "creative";
+ case 6:
+ return "action";
+ case 7:
+ return "portrait";
+ case 8:
+ return "landscape";
+ default:
+ GST_WARNING ("Invalid exif exposure program: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_exposure_mode_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "auto-exposure") == 0)
+ return 0;
+ else if (strcmp (str, "manual-exposure") == 0)
+ return 1;
+ else if (strcmp (str, "auto-bracket") == 0)
+ return 2;
+
+end:
+ GST_WARNING ("Invalid capturing exposure mode tag: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_exposure_mode_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "auto-exposure";
+ case 1:
+ return "manual-exposure";
+ case 2:
+ return "auto-bracket";
+ default:
+ GST_WARNING ("Invalid exif exposure mode: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_scene_capture_type_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "standard") == 0)
+ return 0;
+ else if (strcmp (str, "landscape") == 0)
+ return 1;
+ else if (strcmp (str, "portrait") == 0)
+ return 2;
+ else if (strcmp (str, "night-scene") == 0)
+ return 3;
+
+end:
+ GST_WARNING ("Invalid capturing scene capture type: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_scene_capture_type_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "standard";
+ case 1:
+ return "landscape";
+ case 2:
+ return "portrait";
+ case 3:
+ return "night-scene";
+ default:
+ GST_WARNING ("Invalid exif scene capture type: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_gain_adjustment_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "none") == 0)
+ return 0;
+ else if (strcmp (str, "low-gain-up") == 0)
+ return 1;
+ else if (strcmp (str, "high-gain-up") == 0)
+ return 2;
+ else if (strcmp (str, "low-gain-down") == 0)
+ return 3;
+ else if (strcmp (str, "high-gain-down") == 0)
+ return 4;
+
+end:
+ GST_WARNING ("Invalid capturing gain adjustment type: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_gain_adjustment_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "none";
+ case 1:
+ return "low-gain-up";
+ case 2:
+ return "high-gain-up";
+ case 3:
+ return "low-gain-down";
+ case 4:
+ return "high-gain-down";
+ default:
+ GST_WARNING ("Invalid exif gain control type: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_white_balance_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "auto") == 0)
+ return 0;
+ else /* everything else is just manual */
+ return 1;
+
+end:
+ GST_WARNING ("Invalid white balance: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_white_balance_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "auto";
+ case 1:
+ return "manual";
+ default:
+ GST_WARNING ("Invalid white balance type: %d", value);
+ return NULL;
+ }
+}
+
+static gint
+__exif_tag_capturing_contrast_sharpness_to_exif_value (const gchar * str,
+ const gchar * tag_name)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "normal") == 0)
+ return 0;
+ else if (strcmp (str, "soft") == 0)
+ return 1;
+ else if (strcmp (str, "hard") == 0)
+ return 2;
+
+end:
+ GST_WARNING ("Invalid %s type: %s", tag_name, str);
+ return -1;
+}
+
+static const gchar *
+__exif_tag_capturing_contrast_sharpness_from_exif_value (gint value,
+ const gchar * tag_name)
+{
+ switch (value) {
+ case 0:
+ return "normal";
+ case 1:
+ return "soft";
+ case 2:
+ return "hard";
+ default:
+ GST_WARNING ("Invalid %s type: %d", tag_name, value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_contrast_to_exif_value (const gchar * str)
+{
+ return __exif_tag_capturing_contrast_sharpness_to_exif_value (str,
+ "contrast");
+}
+
+const gchar *
+__exif_tag_capturing_contrast_from_exif_value (gint value)
+{
+ return __exif_tag_capturing_contrast_sharpness_from_exif_value (value,
+ "contrast");
+}
+
+gint
+__exif_tag_capturing_saturation_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "normal") == 0)
+ return 0;
+ else if (strcmp (str, "low-saturation") == 0)
+ return 1;
+ else if (strcmp (str, "high-saturation") == 0)
+ return 2;
+
+end:
+ GST_WARNING ("Invalid saturation type: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_saturation_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "normal";
+ case 1:
+ return "low-saturation";
+ case 2:
+ return "high-saturation";
+ default:
+ GST_WARNING ("Invalid saturation type: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_sharpness_to_exif_value (const gchar * str)
+{
+ return __exif_tag_capturing_contrast_sharpness_to_exif_value (str,
+ "sharpness");
+}
+
+const gchar *
+__exif_tag_capturing_sharpness_from_exif_value (gint value)
+{
+ return __exif_tag_capturing_contrast_sharpness_from_exif_value (value,
+ "sharpness");
+}
+
+gint
+__exif_tag_capturing_metering_mode_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "unknown") == 0)
+ return 0;
+ else if (strcmp (str, "average") == 0)
+ return 1;
+ else if (strcmp (str, "center-weighted-average") == 0)
+ return 2;
+ else if (strcmp (str, "spot") == 0)
+ return 3;
+ else if (strcmp (str, "multi-spot") == 0)
+ return 4;
+ else if (strcmp (str, "pattern") == 0)
+ return 5;
+ else if (strcmp (str, "partial") == 0)
+ return 6;
+ else if (strcmp (str, "other") == 0)
+ return 255;
+
+end:
+ GST_WARNING ("Invalid metering mode type: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_metering_mode_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "unknown";
+ case 1:
+ return "average";
+ case 2:
+ return "center-weighted-average";
+ case 3:
+ return "spot";
+ case 4:
+ return "multi-spot";
+ case 5:
+ return "pattern";
+ case 6:
+ return "partial";
+ case 255:
+ return "other";
+ default:
+ GST_WARNING ("Invalid metering mode type: %d", value);
+ return NULL;
+ }
+}
+
+gint
+__exif_tag_capturing_source_to_exif_value (const gchar * str)
+{
+ if (str == NULL)
+ goto end;
+
+ if (strcmp (str, "dsc") == 0)
+ return 3;
+ else if (strcmp (str, "other") == 0)
+ return 0;
+ else if (strcmp (str, "transparent-scanner") == 0)
+ return 1;
+ else if (strcmp (str, "reflex-scanner") == 0)
+ return 2;
+
+end:
+ GST_WARNING ("Invalid capturing source type: %s", str);
+ return -1;
+}
+
+const gchar *
+__exif_tag_capturing_source_from_exif_value (gint value)
+{
+ switch (value) {
+ case 0:
+ return "other";
+ case 1:
+ return "transparent-scanner";
+ case 2:
+ return "reflex-scanner";
+ case 3:
+ return "dsc";
+ default:
+ GST_WARNING ("Invalid capturing source type: %d", value);
+ return NULL;
+ }
+}
diff --git a/gst-libs/gst/tag/gsttageditingprivate.h b/gst-libs/gst/tag/gsttageditingprivate.h
new file mode 100644
index 0000000..0cc70d0
--- /dev/null
+++ b/gst-libs/gst/tag/gsttageditingprivate.h
@@ -0,0 +1,75 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.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.
+ */
+
+
+#ifndef __GST_TAG_EDIT_PRIVATE_H__
+#define __GST_TAG_EDIT_PRIVATE_H__
+
+#include <gst/tag/tag.h>
+
+G_BEGIN_DECLS
+
+
+typedef struct _GstTagEntryMatch GstTagEntryMatch;
+struct _GstTagEntryMatch {
+ const gchar * gstreamer_tag;
+ const gchar * original_tag;
+};
+
+
+GType gst_vorbis_tag_get_type (void);
+
+gint __exif_tag_image_orientation_to_exif_value (const gchar * str);
+const gchar * __exif_tag_image_orientation_from_exif_value (gint value);
+
+gint __exif_tag_capturing_exposure_program_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_exposure_program_from_exif_value (gint value);
+
+gint __exif_tag_capturing_exposure_mode_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_exposure_mode_from_exif_value (gint value);
+
+gint __exif_tag_capturing_scene_capture_type_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_scene_capture_type_from_exif_value (gint value);
+
+gint __exif_tag_capturing_gain_adjustment_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_gain_adjustment_from_exif_value (gint value);
+
+gint __exif_tag_capturing_white_balance_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_white_balance_from_exif_value (gint value);
+
+gint __exif_tag_capturing_contrast_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_contrast_from_exif_value (gint value);
+
+gint __exif_tag_capturing_saturation_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_saturation_from_exif_value (gint value);
+
+gint __exif_tag_capturing_sharpness_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_sharpness_from_exif_value (gint value);
+
+gint __exif_tag_capturing_metering_mode_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_metering_mode_from_exif_value (gint value);
+
+gint __exif_tag_capturing_source_to_exif_value (const gchar * str);
+const gchar * __exif_tag_capturing_source_from_exif_value (gint value);
+
+#define ensure_exif_tags gst_tag_register_musicbrainz_tags
+
+G_END_DECLS
+
+#endif /* __GST_TAG_EDIT_PRIVATE_H__ */
diff --git a/gst-libs/gst/tag/gsttagmux.c b/gst-libs/gst/tag/gsttagmux.c
new file mode 100644
index 0000000..6d0a741
--- /dev/null
+++ b/gst-libs/gst/tag/gsttagmux.c
@@ -0,0 +1,531 @@
+/* GStreamer tag muxer base class
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2006 Sebastian Dröge <slomo@circular-chaos.org>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gsttagmux
+ * @see_also: GstApeMux, GstId3Mux
+ * @short_description: Base class for adding tags that are in one single chunk
+ * directly at the beginning or at the end of a file
+ *
+ * <refsect2>
+ * <para>
+ * Provides a base class for adding tags at the beginning or end of a
+ * stream.
+ * </para>
+ * <title>Deriving from GstTagMux</title>
+ * <para>
+ * Subclasses have to do the following things:
+ * <itemizedlist>
+ * <listitem><para>
+ * In their base init function, they must add pad templates for the sink
+ * pad and the source pad to the element class, describing the media type
+ * they accept and output in the caps of the pad template.
+ * </para></listitem>
+ * <listitem><para>
+ * In their class init function, they must override the
+ * GST_TAG_MUX_CLASS(mux_klass)->render_start_tag and/or
+ * GST_TAG_MUX_CLASS(mux_klass)->render_end_tag vfuncs and set up a render
+ * function.
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * </refsect2>
+ *
+ * Since 0.10.36
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <gst/gsttagsetter.h>
+#include <gst/tag/tag.h>
+
+#include "gsttagmux.h"
+
+struct _GstTagMuxPrivate
+{
+ GstPad *srcpad;
+ GstPad *sinkpad;
+ GstTagList *event_tags; /* tags received from upstream elements */
+ GstTagList *final_tags; /* Final set of tags used for muxing */
+ gsize start_tag_size;
+ gsize end_tag_size;
+ gboolean render_start_tag;
+ gboolean render_end_tag;
+
+ gint64 current_offset;
+ gint64 max_offset;
+
+ GstEvent *newsegment_ev; /* cached newsegment event from upstream */
+};
+
+GST_DEBUG_CATEGORY_STATIC (gst_tag_mux_debug);
+#define GST_CAT_DEFAULT gst_tag_mux_debug
+
+#define gst_tag_mux_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTagMux, gst_tag_mux, GST_TYPE_ELEMENT,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL));
+
+static GstStateChangeReturn
+gst_tag_mux_change_state (GstElement * element, GstStateChange transition);
+static GstFlowReturn gst_tag_mux_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_tag_mux_sink_event (GstPad * pad, GstEvent * event);
+
+static void
+gst_tag_mux_finalize (GObject * obj)
+{
+ GstTagMux *mux = GST_TAG_MUX (obj);
+
+ if (mux->priv->newsegment_ev) {
+ gst_event_unref (mux->priv->newsegment_ev);
+ mux->priv->newsegment_ev = NULL;
+ }
+
+ if (mux->priv->event_tags) {
+ gst_tag_list_free (mux->priv->event_tags);
+ mux->priv->event_tags = NULL;
+ }
+
+ if (mux->priv->final_tags) {
+ gst_tag_list_free (mux->priv->final_tags);
+ mux->priv->final_tags = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_tag_mux_class_init (GstTagMuxClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_tag_mux_finalize);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_tag_mux_change_state);
+
+ g_type_class_add_private (klass, sizeof (GstTagMuxPrivate));
+
+ GST_DEBUG_CATEGORY_INIT (gst_tag_mux_debug, "tagmux", 0,
+ "tag muxer base class");
+}
+
+static void
+gst_tag_mux_init (GstTagMux * mux)
+{
+ GstElementClass *element_klass = GST_ELEMENT_GET_CLASS (mux);
+ GstPadTemplate *tmpl;
+
+ mux->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (mux, GST_TYPE_TAG_MUX, GstTagMuxPrivate);
+
+ /* pad through which data comes in to the element */
+ tmpl = gst_element_class_get_pad_template (element_klass, "sink");
+ if (tmpl) {
+ mux->priv->sinkpad = gst_pad_new_from_template (tmpl, "sink");
+ } else {
+ g_warning ("GstTagMux subclass '%s' did not install a %s pad template!\n",
+ G_OBJECT_CLASS_NAME (element_klass), "sink");
+ mux->priv->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
+ }
+ gst_pad_set_chain_function (mux->priv->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_mux_chain));
+ gst_pad_set_event_function (mux->priv->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tag_mux_sink_event));
+ gst_element_add_pad (GST_ELEMENT (mux), mux->priv->sinkpad);
+
+ /* pad through which data goes out of the element */
+ tmpl = gst_element_class_get_pad_template (element_klass, "src");
+ if (tmpl) {
+ GstCaps *tmpl_caps = gst_pad_template_get_caps (tmpl);
+
+ mux->priv->srcpad = gst_pad_new_from_template (tmpl, "src");
+ gst_pad_use_fixed_caps (mux->priv->srcpad);
+ if (tmpl_caps != NULL && gst_caps_is_fixed (tmpl_caps)) {
+ gst_pad_set_caps (mux->priv->srcpad, tmpl_caps);
+ }
+ } else {
+ g_warning ("GstTagMux subclass '%s' did not install a %s pad template!\n",
+ G_OBJECT_CLASS_NAME (element_klass), "source");
+ mux->priv->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ }
+ gst_element_add_pad (GST_ELEMENT (mux), mux->priv->srcpad);
+
+ mux->priv->render_start_tag = TRUE;
+ mux->priv->render_end_tag = TRUE;
+}
+
+static GstTagList *
+gst_tag_mux_get_tags (GstTagMux * mux)
+{
+ GstTagSetter *tagsetter = GST_TAG_SETTER (mux);
+ const GstTagList *tagsetter_tags;
+ GstTagMergeMode merge_mode;
+
+ if (mux->priv->final_tags)
+ return mux->priv->final_tags;
+
+ tagsetter_tags = gst_tag_setter_get_tag_list (tagsetter);
+ merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter);
+
+ GST_LOG_OBJECT (mux, "merging tags, merge mode = %d", merge_mode);
+ GST_LOG_OBJECT (mux, "event tags: %" GST_PTR_FORMAT, mux->priv->event_tags);
+ GST_LOG_OBJECT (mux, "set tags: %" GST_PTR_FORMAT, tagsetter_tags);
+
+ mux->priv->final_tags =
+ gst_tag_list_merge (tagsetter_tags, mux->priv->event_tags, merge_mode);
+
+ GST_LOG_OBJECT (mux, "final tags: %" GST_PTR_FORMAT, mux->priv->final_tags);
+
+ return mux->priv->final_tags;
+}
+
+static GstFlowReturn
+gst_tag_mux_render_start_tag (GstTagMux * mux)
+{
+ GstTagMuxClass *klass;
+ GstBuffer *buffer;
+ GstTagList *taglist;
+ GstEvent *event;
+ GstFlowReturn ret;
+ GstSegment segment;
+
+ taglist = gst_tag_mux_get_tags (mux);
+
+ klass = GST_TAG_MUX_CLASS (G_OBJECT_GET_CLASS (mux));
+
+ if (klass->render_start_tag == NULL)
+ goto no_vfunc;
+
+ buffer = klass->render_start_tag (mux, taglist);
+
+ /* Null buffer is ok, just means we're not outputting anything */
+ if (buffer == NULL) {
+ GST_INFO_OBJECT (mux, "No start tag generated");
+ mux->priv->start_tag_size = 0;
+ return GST_FLOW_OK;
+ }
+
+ mux->priv->start_tag_size = gst_buffer_get_size (buffer);
+ GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes",
+ mux->priv->start_tag_size);
+
+ /* Send newsegment event from byte position 0, so the tag really gets
+ * written to the start of the file, independent of the upstream segment */
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_push_event (mux->priv->srcpad, gst_event_new_segment (&segment));
+
+ /* Send an event about the new tags to downstream elements */
+ /* gst_event_new_tag takes ownership of the list, so use a copy */
+ event = gst_event_new_tag (gst_tag_list_copy (taglist));
+ gst_pad_push_event (mux->priv->srcpad, event);
+
+ GST_BUFFER_OFFSET (buffer) = 0;
+ ret = gst_pad_push (mux->priv->srcpad, buffer);
+
+ mux->priv->current_offset = mux->priv->start_tag_size;
+ mux->priv->max_offset =
+ MAX (mux->priv->max_offset, mux->priv->current_offset);
+
+ return ret;
+
+no_vfunc:
+ {
+ GST_ERROR_OBJECT (mux, "Subclass does not implement "
+ "render_start_tag vfunc!");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_tag_mux_render_end_tag (GstTagMux * mux)
+{
+ GstTagMuxClass *klass;
+ GstBuffer *buffer;
+ GstTagList *taglist;
+ GstFlowReturn ret;
+ GstSegment segment;
+
+ taglist = gst_tag_mux_get_tags (mux);
+
+ klass = GST_TAG_MUX_CLASS (G_OBJECT_GET_CLASS (mux));
+
+ if (klass->render_end_tag == NULL)
+ goto no_vfunc;
+
+ buffer = klass->render_end_tag (mux, taglist);
+
+ if (buffer == NULL) {
+ GST_INFO_OBJECT (mux, "No end tag generated");
+ mux->priv->end_tag_size = 0;
+ return GST_FLOW_OK;
+ }
+
+ mux->priv->end_tag_size = gst_buffer_get_size (buffer);
+ GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes",
+ mux->priv->end_tag_size);
+
+ /* Send newsegment event from the end of the file, so it gets written there,
+ independent of whatever new segment events upstream has sent us */
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ segment.start = mux->priv->max_offset;
+ gst_pad_push_event (mux->priv->srcpad, gst_event_new_segment (&segment));
+
+ GST_BUFFER_OFFSET (buffer) = mux->priv->max_offset;
+ ret = gst_pad_push (mux->priv->srcpad, buffer);
+
+ return ret;
+
+no_vfunc:
+ {
+ GST_ERROR_OBJECT (mux, "Subclass does not implement "
+ "render_end_tag vfunc!");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstEvent *
+gst_tag_mux_adjust_event_offsets (GstTagMux * mux,
+ const GstEvent * newsegment_event)
+{
+ GstSegment segment;
+
+ gst_event_copy_segment ((GstEvent *) newsegment_event, &segment);
+
+ g_assert (segment.format == GST_FORMAT_BYTES);
+
+ if (segment.start != -1)
+ segment.start += mux->priv->start_tag_size;
+ if (segment.stop != -1)
+ segment.stop += mux->priv->start_tag_size;
+ if (segment.time != -1)
+ segment.time += mux->priv->start_tag_size;
+
+ GST_DEBUG_OBJECT (mux, "adjusting newsegment event offsets to start=%"
+ G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ", cur=%" G_GINT64_FORMAT
+ " (delta = +%" G_GSIZE_FORMAT ")", segment.start, segment.stop,
+ segment.time, mux->priv->start_tag_size);
+
+ return gst_event_new_segment (&segment);
+}
+
+static GstFlowReturn
+gst_tag_mux_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstTagMux *mux = GST_TAG_MUX (GST_OBJECT_PARENT (pad));
+ GstFlowReturn ret;
+ int length;
+
+ if (mux->priv->render_start_tag) {
+
+ GST_INFO_OBJECT (mux, "Adding tags to stream");
+ ret = gst_tag_mux_render_start_tag (mux);
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret));
+ gst_buffer_unref (buffer);
+ return ret;
+ }
+
+ /* Now send the cached newsegment event that we got from upstream */
+ if (mux->priv->newsegment_ev) {
+ GstEvent *newseg;
+ GstSegment segment;
+
+ GST_DEBUG_OBJECT (mux, "sending cached newsegment event");
+ newseg = gst_tag_mux_adjust_event_offsets (mux, mux->priv->newsegment_ev);
+ gst_event_unref (mux->priv->newsegment_ev);
+ mux->priv->newsegment_ev = NULL;
+
+ gst_event_copy_segment (newseg, &segment);
+
+ gst_pad_push_event (mux->priv->srcpad, newseg);
+ mux->priv->current_offset = segment.start;
+ mux->priv->max_offset =
+ MAX (mux->priv->max_offset, mux->priv->current_offset);
+ } else {
+ /* upstream sent no newsegment event or only one in a non-BYTE format */
+ }
+
+ mux->priv->render_start_tag = FALSE;
+ }
+
+ buffer = gst_buffer_make_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->priv->start_tag_size);
+ GST_BUFFER_OFFSET (buffer) += mux->priv->start_tag_size;
+ }
+
+ length = gst_buffer_get_size (buffer);
+
+ ret = gst_pad_push (mux->priv->srcpad, buffer);
+
+ mux->priv->current_offset += length;
+ mux->priv->max_offset =
+ MAX (mux->priv->max_offset, mux->priv->current_offset);
+
+ return ret;
+}
+
+static gboolean
+gst_tag_mux_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstTagMux *mux;
+ gboolean result;
+
+ mux = GST_TAG_MUX (gst_pad_get_parent (pad));
+ result = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:{
+ GstTagList *tags;
+
+ gst_event_parse_tag (event, &tags);
+
+ GST_INFO_OBJECT (mux, "Got tag event: %" GST_PTR_FORMAT, tags);
+
+ if (mux->priv->event_tags != NULL) {
+ gst_tag_list_insert (mux->priv->event_tags, tags,
+ GST_TAG_MERGE_REPLACE);
+ } else {
+ mux->priv->event_tags = gst_tag_list_copy (tags);
+ }
+
+ GST_INFO_OBJECT (mux, "Event tags are now: %" GST_PTR_FORMAT,
+ mux->priv->event_tags);
+
+ /* just drop the event, we'll push a new tag event in render_start_tag */
+ gst_event_unref (event);
+ result = TRUE;
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment segment;
+
+ gst_event_copy_segment (event, &segment);
+
+ if (segment.format != GST_FORMAT_BYTES) {
+ GST_WARNING_OBJECT (mux, "dropping newsegment event in %s format",
+ gst_format_get_name (segment.format));
+ gst_event_unref (event);
+ break;
+ }
+
+ if (mux->priv->render_start_tag) {
+ /* we have not rendered the tag yet, which means that we don't know
+ * how large it is going to be yet, so we can't adjust the offsets
+ * here at this point and need to cache the newsegment event for now
+ * (also, there could be tag events coming after this newsegment event
+ * and before the first buffer). */
+ if (mux->priv->newsegment_ev) {
+ GST_WARNING_OBJECT (mux, "discarding old cached newsegment event");
+ gst_event_unref (mux->priv->newsegment_ev);
+ }
+
+ GST_LOG_OBJECT (mux, "caching newsegment event for later");
+ mux->priv->newsegment_ev = event;
+ } else {
+ GST_DEBUG_OBJECT (mux, "got newsegment event, adjusting offsets");
+ gst_pad_push_event (mux->priv->srcpad,
+ gst_tag_mux_adjust_event_offsets (mux, event));
+ gst_event_unref (event);
+
+ mux->priv->current_offset = segment.start;
+ mux->priv->max_offset =
+ MAX (mux->priv->max_offset, mux->priv->current_offset);
+ }
+ event = NULL;
+ result = TRUE;
+ break;
+ }
+ case GST_EVENT_EOS:{
+ if (mux->priv->render_end_tag) {
+ GstFlowReturn ret;
+
+ GST_INFO_OBJECT (mux, "Adding tags to stream");
+ ret = gst_tag_mux_render_end_tag (mux);
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+
+ mux->priv->render_end_tag = FALSE;
+ }
+
+ /* Now forward EOS */
+ result = gst_pad_event_default (pad, event);
+ break;
+ }
+ default:
+ result = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (mux);
+
+ return result;
+}
+
+
+static GstStateChangeReturn
+gst_tag_mux_change_state (GstElement * element, GstStateChange transition)
+{
+ GstTagMux *mux;
+ GstStateChangeReturn result;
+
+ mux = GST_TAG_MUX (element);
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (result != GST_STATE_CHANGE_SUCCESS) {
+ return result;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ if (mux->priv->newsegment_ev) {
+ gst_event_unref (mux->priv->newsegment_ev);
+ mux->priv->newsegment_ev = NULL;
+ }
+ if (mux->priv->event_tags) {
+ gst_tag_list_free (mux->priv->event_tags);
+ mux->priv->event_tags = NULL;
+ }
+ mux->priv->start_tag_size = 0;
+ mux->priv->end_tag_size = 0;
+ mux->priv->render_start_tag = TRUE;
+ mux->priv->render_end_tag = TRUE;
+ mux->priv->current_offset = 0;
+ mux->priv->max_offset = 0;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return result;
+}
diff --git a/gst-libs/gst/tag/gsttagmux.h b/gst-libs/gst/tag/gsttagmux.h
new file mode 100644
index 0000000..ddb5988
--- /dev/null
+++ b/gst-libs/gst/tag/gsttagmux.h
@@ -0,0 +1,89 @@
+/* GStreamer tag muxer base class
+ * Copyright (C) 2006 Christophe Fergeau <teuf@gnome.org>
+ * Copyright (C) 2006,2011 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Pioneers of the Inevitable <songbird@songbirdnest.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef GST_TAG_MUX_H
+#define GST_TAG_MUX_H
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TAG_MUX \
+ (gst_tag_mux_get_type())
+#define GST_TAG_MUX(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_MUX,GstTagMux))
+#define GST_TAG_MUX_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_MUX,GstTagMuxClass))
+#define GST_IS_TAG_MUX(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_MUX))
+#define GST_IS_TAG_MUX_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_MUX))
+
+typedef struct _GstTagMux GstTagMux;
+typedef struct _GstTagMuxClass GstTagMuxClass;
+typedef struct _GstTagMuxPrivate GstTagMuxPrivate;
+
+/**
+ * GstTagMux:
+ * @element: parent element
+ *
+ * Opaque #GstTagMux structure.
+ *
+ * Since: 0.10.36
+ */
+struct _GstTagMux {
+ GstElement element;
+
+ /*< private >*/
+ GstTagMuxPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstTagMuxClass:
+ * @parent_class: the parent class.
+ * @render_start_tag: create a tag buffer to add to the beginning of the
+ * input stream given a tag list, or NULL
+ * @render_end_tag: create a tag buffer to add to the end of the
+ * input stream given a tag list, or NULL
+ *
+ * The #GstTagMuxClass structure. Subclasses need to override at least one
+ * of the two render vfuncs.
+ *
+ * Since: 0.10.36
+ */
+struct _GstTagMuxClass {
+ GstElementClass parent_class;
+
+ /* vfuncs */
+ GstBuffer * (*render_start_tag) (GstTagMux * mux, const GstTagList * tag_list);
+ GstBuffer * (*render_end_tag) (GstTagMux * mux, const GstTagList * tag_list);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tag_mux_get_type (void);
+
+G_END_DECLS
+
+#endif
diff --git a/gst-libs/gst/tag/gstvorbistag.c b/gst-libs/gst/tag/gstvorbistag.c
new file mode 100644
index 0000000..44cb50f
--- /dev/null
+++ b/gst-libs/gst/tag/gstvorbistag.c
@@ -0,0 +1,843 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gstvorbistag.c: library for reading / modifying vorbis tags
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttagvorbis
+ * @short_description: tag mappings and support functions for plugins
+ * dealing with vorbiscomments
+ * @see_also: #GstTagList
+ *
+ * <refsect2>
+ * <para>
+ * Contains various utility functions for plugins to parse or create
+ * vorbiscomments and map them to and from #GstTagList<!-- -->s.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gsttagsetter.h>
+#include <gst/base/gstbytereader.h>
+#include <gst/base/gstbytewriter.h>
+#include "gsttageditingprivate.h"
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * see http://xiph.org/ogg/vorbis/doc/v-comment.html
+ */
+static const GstTagEntryMatch tag_matches[] = {
+ {GST_TAG_TITLE, "TITLE"},
+ {GST_TAG_VERSION, "VERSION"},
+ {GST_TAG_ALBUM, "ALBUM"},
+ {GST_TAG_TRACK_NUMBER, "TRACKNUMBER"},
+ {GST_TAG_ALBUM_VOLUME_NUMBER, "DISCNUMBER"},
+ {GST_TAG_TRACK_COUNT, "TRACKTOTAL"},
+ {GST_TAG_ALBUM_VOLUME_COUNT, "DISCTOTAL"},
+ {GST_TAG_ARTIST, "ARTIST"},
+ {GST_TAG_PERFORMER, "PERFORMER"},
+ {GST_TAG_COMPOSER, "COMPOSER"},
+ {GST_TAG_COPYRIGHT, "COPYRIGHT"},
+ {GST_TAG_LICENSE, "LICENSE"},
+ {GST_TAG_LICENSE_URI, "LICENSE"},
+ {GST_TAG_GEO_LOCATION_NAME, "LOCATION"},
+ {GST_TAG_ORGANIZATION, "ORGANIZATION"},
+ {GST_TAG_DESCRIPTION, "DESCRIPTION"},
+ {GST_TAG_GENRE, "GENRE"},
+ {GST_TAG_DATE, "DATE"},
+ {GST_TAG_CONTACT, "CONTACT"},
+ {GST_TAG_ISRC, "ISRC"},
+ {GST_TAG_COMMENT, "COMMENT"},
+ {GST_TAG_TRACK_GAIN, "REPLAYGAIN_TRACK_GAIN"},
+ {GST_TAG_TRACK_PEAK, "REPLAYGAIN_TRACK_PEAK"},
+ {GST_TAG_ALBUM_GAIN, "REPLAYGAIN_ALBUM_GAIN"},
+ {GST_TAG_ALBUM_PEAK, "REPLAYGAIN_ALBUM_PEAK"},
+ {GST_TAG_REFERENCE_LEVEL, "REPLAYGAIN_REFERENCE_LOUDNESS"},
+ {GST_TAG_MUSICBRAINZ_TRACKID, "MUSICBRAINZ_TRACKID"},
+ {GST_TAG_MUSICBRAINZ_ARTISTID, "MUSICBRAINZ_ARTISTID"},
+ {GST_TAG_MUSICBRAINZ_ALBUMID, "MUSICBRAINZ_ALBUMID"},
+ {GST_TAG_MUSICBRAINZ_ALBUMARTISTID, "MUSICBRAINZ_ALBUMARTISTID"},
+ {GST_TAG_MUSICBRAINZ_TRMID, "MUSICBRAINZ_TRMID"},
+ {GST_TAG_ARTIST_SORTNAME, "ARTISTSORT"},
+ {GST_TAG_ARTIST_SORTNAME, "ARTISTSORTORDER"},
+ {GST_TAG_ARTIST_SORTNAME, "MUSICBRAINZ_SORTNAME"},
+ {GST_TAG_ALBUM_SORTNAME, "ALBUMSORT"},
+ {GST_TAG_ALBUM_SORTNAME, "ALBUMSORTORDER"},
+ {GST_TAG_TITLE_SORTNAME, "TITLESORT"},
+ {GST_TAG_TITLE_SORTNAME, "TITLESORTORDER"},
+ {GST_TAG_ALBUM_ARTIST, "ALBUMARTIST"},
+ {GST_TAG_ALBUM_ARTIST_SORTNAME, "ALBUMARTISTSORT"},
+ {GST_TAG_ALBUM_ARTIST_SORTNAME, "ALBUMARTISTSORTORDER"},
+ {GST_TAG_LANGUAGE_CODE, "LANGUAGE"},
+ {GST_TAG_CDDA_MUSICBRAINZ_DISCID, "MUSICBRAINZ_DISCID"},
+ {GST_TAG_CDDA_CDDB_DISCID, "DISCID"},
+ /* For the apparent de-facto standard for coverart in vorbis comments, see:
+ * http://www.hydrogenaudio.org/forums/lofiversion/index.php/t48386.html */
+ {GST_TAG_PREVIEW_IMAGE, "COVERART"},
+ /* some evidence that "BPM" is used elsewhere:
+ * http://mail.kde.org/pipermail/amarok/2006-May/000090.html
+ */
+ {GST_TAG_BEATS_PER_MINUTE, "BPM"},
+ /* What GStreamer calls encoder ("encoder used to encode this stream") is
+ stored in the vendor string in Vorbis/Theora/Kate and possibly others.
+ The Vorbis comment packet used in those streams uses ENCODER as the name
+ of the encoding program, which GStreamer calls application-name. */
+ {GST_TAG_APPLICATION_NAME, "ENCODER"},
+ {NULL, NULL}
+};
+
+/**
+ * gst_tag_from_vorbis_tag:
+ * @vorbis_tag: vorbiscomment tag to convert to GStreamer tag
+ *
+ * Looks up the GStreamer tag for a vorbiscomment tag.
+ *
+ * Returns: The corresponding GStreamer tag or NULL if none exists.
+ */
+const gchar *
+gst_tag_from_vorbis_tag (const gchar * vorbis_tag)
+{
+ int i = 0;
+ gchar *real_vorbis_tag;
+
+ g_return_val_if_fail (vorbis_tag != NULL, NULL);
+
+ gst_tag_register_musicbrainz_tags ();
+
+ real_vorbis_tag = g_ascii_strup (vorbis_tag, -1);
+ while (tag_matches[i].gstreamer_tag != NULL) {
+ if (strcmp (real_vorbis_tag, tag_matches[i].original_tag) == 0) {
+ break;
+ }
+ i++;
+ }
+ g_free (real_vorbis_tag);
+ return tag_matches[i].gstreamer_tag;
+}
+
+/**
+ * gst_tag_to_vorbis_tag:
+ * @gst_tag: GStreamer tag to convert to vorbiscomment tag
+ *
+ * Looks up the vorbiscomment tag for a GStreamer tag.
+ *
+ * Returns: The corresponding vorbiscomment tag or NULL if none exists.
+ */
+const gchar *
+gst_tag_to_vorbis_tag (const gchar * gst_tag)
+{
+ int i = 0;
+
+ g_return_val_if_fail (gst_tag != NULL, NULL);
+
+ gst_tag_register_musicbrainz_tags ();
+
+ while (tag_matches[i].gstreamer_tag != NULL) {
+ if (strcmp (gst_tag, tag_matches[i].gstreamer_tag) == 0) {
+ return tag_matches[i].original_tag;
+ }
+ i++;
+ }
+ return NULL;
+}
+
+
+/**
+ * gst_vorbis_tag_add:
+ * @list: a #GstTagList
+ * @tag: a vorbiscomment tag string (key in key=value), must be valid UTF-8
+ * @value: a vorbiscomment value string (value in key=value), must be valid UTF-8
+ *
+ * Convenience function using gst_tag_from_vorbis_tag(), parsing
+ * a vorbis comment string into the right type and adding it to the
+ * given taglist @list.
+ *
+ * Unknown vorbiscomment tags will be added to the tag list in form
+ * of a #GST_TAG_EXTENDED_COMMENT (since 0.10.10 at least).
+ */
+void
+gst_vorbis_tag_add (GstTagList * list, const gchar * tag, const gchar * value)
+{
+ const gchar *gst_tag;
+ GType tag_type;
+
+ g_return_if_fail (list != NULL);
+ g_return_if_fail (tag != NULL);
+ g_return_if_fail (value != NULL);
+
+ g_return_if_fail (g_utf8_validate (tag, -1, NULL));
+ g_return_if_fail (g_utf8_validate (value, -1, NULL));
+ g_return_if_fail (strchr (tag, '=') == NULL);
+
+ gst_tag = gst_tag_from_vorbis_tag (tag);
+ if (gst_tag == NULL) {
+ gchar *ext_comment;
+
+ ext_comment = g_strdup_printf ("%s=%s", tag, value);
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_EXTENDED_COMMENT,
+ ext_comment, NULL);
+ g_free (ext_comment);
+ return;
+ }
+
+ tag_type = gst_tag_get_type (gst_tag);
+ switch (tag_type) {
+ case G_TYPE_UINT:{
+ guint tmp;
+ gchar *check;
+ gboolean is_track_number_tag;
+ gboolean is_disc_number_tag;
+
+ is_track_number_tag = (strcmp (gst_tag, GST_TAG_TRACK_NUMBER) == 0);
+ is_disc_number_tag = (strcmp (gst_tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0);
+ tmp = strtoul (value, &check, 10);
+ if (*check == '/' && (is_track_number_tag || is_disc_number_tag)) {
+ guint count;
+
+ check++;
+ count = strtoul (check, &check, 10);
+ if (*check != '\0' || count == 0)
+ break;
+ if (is_track_number_tag) {
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_COUNT,
+ count, NULL);
+ } else {
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND,
+ GST_TAG_ALBUM_VOLUME_COUNT, count, NULL);
+ }
+ }
+ if (*check == '\0') {
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, gst_tag, tmp, NULL);
+ }
+ break;
+ }
+ case G_TYPE_STRING:{
+ gchar *valid = NULL;
+
+ /* specialcase for language code */
+ if (strcmp (tag, "LANGUAGE") == 0) {
+ const gchar *s = strchr (value, '[');
+
+ /* Accept both ISO-639-1 and ISO-639-2 codes */
+ if (s && strchr (s, ']') == s + 4) {
+ valid = g_strndup (s + 1, 3);
+ } else if (s && strchr (s, ']') == s + 3) {
+ valid = g_strndup (s + 1, 2);
+ } else if (strlen (value) != 2 && strlen (value) != 3) {
+ GST_WARNING ("doesn't contain an ISO-639 language code: %s", value);
+ }
+ } else if (strcmp (tag, "LICENSE") == 0) {
+ /* license tags in vorbis comments must contain an URI representing
+ * the license and nothing more, at least according to:
+ * http://wiki.xiph.org/index.php/LICENSE_and_COPYRIGHT_tags_on_Vorbis_Comments */
+ if (value && gst_uri_is_valid (value))
+ gst_tag = GST_TAG_LICENSE_URI;
+ }
+
+ if (!valid) {
+ valid = g_strdup (value);
+ }
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, gst_tag, valid, NULL);
+ g_free (valid);
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ gchar *c;
+
+ c = g_strdup (value);
+ g_strdelimit (c, ",", '.');
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, gst_tag,
+ g_strtod (c, NULL), NULL);
+ g_free (c);
+ break;
+ }
+ default:{
+ if (tag_type == GST_TYPE_DATE) {
+ guint y, d = 1, m = 1;
+ gchar *check = (gchar *) value;
+
+ y = strtoul (check, &check, 10);
+ if (*check == '-') {
+ check++;
+ m = strtoul (check, &check, 10);
+ if (*check == '-') {
+ check++;
+ d = strtoul (check, &check, 10);
+ }
+ }
+
+ /* accept dates like 2007-00-00 and 2007-05-00 */
+ if (y != 0) {
+ if (m == 0 && d == 0)
+ m = d = 1;
+ else if (m != 0 && d == 0)
+ d = 1;
+ }
+
+ /* date might be followed by a time */
+ if ((*check == '\0' || g_ascii_isspace (*check)) && y != 0 &&
+ g_date_valid_dmy (d, m, y)) {
+ GDate *date;
+
+ date = g_date_new_dmy (d, m, y);
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, gst_tag, date, NULL);
+ g_date_free (date);
+ } else {
+ GST_DEBUG ("skipping invalid date '%s' (%u,%u,%u)", value, y, m, d);
+ }
+ } else {
+ GST_WARNING ("Unhandled tag of type '%s' (%d)",
+ g_type_name (tag_type), (gint) tag_type);
+ }
+ break;
+ }
+ }
+}
+
+static void
+gst_vorbis_tag_add_coverart (GstTagList * tags, gchar * img_data_base64,
+ gint base64_len)
+{
+ GstBuffer *img;
+ gsize img_len;
+
+ if (base64_len < 2)
+ goto not_enough_data;
+
+ /* img_data_base64 points to a temporary copy of the base64 encoded data, so
+ * it's safe to do inpace decoding here
+ */
+ g_base64_decode_inplace (img_data_base64, &img_len);
+ if (img_len == 0)
+ goto decode_failed;
+
+ img =
+ gst_tag_image_data_to_image_buffer ((const guint8 *) img_data_base64,
+ img_len, GST_TAG_IMAGE_TYPE_NONE);
+
+ if (img == NULL)
+ goto convert_failed;
+
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_PREVIEW_IMAGE, img, NULL);
+
+ gst_buffer_unref (img);
+ return;
+
+/* ERRORS */
+not_enough_data:
+ {
+ GST_WARNING ("COVERART tag with too little base64-encoded data");
+ return;
+ }
+decode_failed:
+ {
+ GST_WARNING ("Couldn't decode base64 image data from COVERART tag");
+ return;
+ }
+convert_failed:
+ {
+ GST_WARNING ("Couldn't extract image or image type from COVERART tag");
+ return;
+ }
+}
+
+/* Standardized way of adding pictures to vorbiscomments:
+ * http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
+ */
+static void
+gst_vorbis_tag_add_metadata_block_picture (GstTagList * tags,
+ gchar * value, gint value_len)
+{
+ GstByteReader reader;
+ guint32 img_len = 0, img_type = 0;
+ guint32 img_mimetype_len = 0, img_description_len = 0;
+ gsize decoded_len;
+ const guint8 *data = NULL;
+
+ /* img_data_base64 points to a temporary copy of the base64 encoded data, so
+ * it's safe to do inpace decoding here
+ */
+ g_base64_decode_inplace (value, &decoded_len);
+ if (decoded_len == 0)
+ goto decode_failed;
+
+ gst_byte_reader_init (&reader, (guint8 *) value, decoded_len);
+
+ 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;
+
+ /* Skip width, height, color depth and number of colors for
+ * indexed formats */
+ if (!gst_byte_reader_skip (&reader, 4 * 4))
+ goto error;
+
+ if (!gst_byte_reader_get_uint32_be (&reader, &img_len))
+ goto error;
+
+ if (!gst_byte_reader_get_data (&reader, img_len, &data))
+ goto error;
+
+ gst_tag_list_add_id3_image (tags, data, img_len, img_type);
+
+ return;
+
+error:
+ GST_WARNING
+ ("Couldn't extract image or image type from METADATA_BLOCK_PICTURE tag");
+ return;
+decode_failed:
+ GST_WARNING ("Failed to decode Base64 data from METADATA_BLOCK_PICTURE tag");
+ return;
+}
+
+/**
+ * gst_tag_list_from_vorbiscomment:
+ * @data: data to convert
+ * @size: size of @data
+ * @id_data: identification data at start of stream
+ * @id_data_length: length of identification data
+ * @vendor_string: pointer to a string that should take the vendor string
+ * of this vorbis comment or NULL if you don't need it.
+ *
+ * Creates a new tag list that contains the information parsed out of a
+ * vorbiscomment packet.
+ *
+ * Returns: A new #GstTagList with all tags that could be extracted from the
+ * given vorbiscomment buffer or NULL on error.
+ */
+GstTagList *
+gst_tag_list_from_vorbiscomment (const guint8 * data, gsize size,
+ const guint8 * id_data, const guint id_data_length, gchar ** vendor_string)
+{
+#define ADVANCE(x) G_STMT_START{ \
+ data += x; \
+ size -= x; \
+ if (size < 4) goto error; \
+ cur_size = GST_READ_UINT32_LE (data); \
+ data += 4; \
+ size -= 4; \
+ if (cur_size > size) goto error; \
+ cur = (gchar*)data; \
+}G_STMT_END
+ gchar *cur, *value;
+ guint cur_size;
+ guint iterations;
+ guint value_len;
+ GstTagList *list;
+
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (id_data != NULL || id_data_length == 0, NULL);
+
+ list = gst_tag_list_new ();
+
+ if (size < 11 || size <= id_data_length + 4)
+ goto error;
+
+ if (id_data_length > 0 && memcmp (data, id_data, id_data_length) != 0)
+ goto error;
+
+ ADVANCE (id_data_length);
+
+ if (vendor_string)
+ *vendor_string = g_strndup (cur, cur_size);
+
+ ADVANCE (cur_size);
+ iterations = cur_size;
+ cur_size = 0;
+
+ while (iterations) {
+ ADVANCE (cur_size);
+ iterations--;
+ cur = g_strndup (cur, cur_size);
+ value = strchr (cur, '=');
+ if (value == NULL) {
+ g_free (cur);
+ continue;
+ }
+ *value = '\0';
+ value++;
+ value_len = strlen (value);
+ if (value_len == 0 || !g_utf8_validate (value, value_len, NULL)) {
+ g_free (cur);
+ continue;
+ }
+ /* we'll just ignore COVERARTMIME and typefind the image data */
+ if (g_ascii_strcasecmp (cur, "COVERARTMIME") == 0) {
+ continue;
+ } else if (g_ascii_strcasecmp (cur, "COVERART") == 0) {
+ gst_vorbis_tag_add_coverart (list, value, value_len);
+ } else if (g_ascii_strcasecmp (cur, "METADATA_BLOCK_PICTURE") == 0) {
+ gst_vorbis_tag_add_metadata_block_picture (list, value, value_len);
+ } else {
+ gst_vorbis_tag_add (list, cur, value);
+ }
+ g_free (cur);
+ }
+
+ return list;
+
+error:
+ gst_tag_list_free (list);
+ return NULL;
+#undef ADVANCE
+}
+
+/**
+ * gst_tag_list_from_vorbiscomment_buffer:
+ * @buffer: buffer to convert
+ * @id_data: identification data at start of stream
+ * @id_data_length: length of identification data
+ * @vendor_string: pointer to a string that should take the vendor string
+ * of this vorbis comment or NULL if you don't need it.
+ *
+ * Creates a new tag list that contains the information parsed out of a
+ * vorbiscomment packet.
+ *
+ * Returns: A new #GstTagList with all tags that could be extracted from the
+ * given vorbiscomment buffer or NULL on error.
+ */
+GstTagList *
+gst_tag_list_from_vorbiscomment_buffer (GstBuffer * buffer,
+ const guint8 * id_data, const guint id_data_length, gchar ** vendor_string)
+{
+ GstTagList *res;
+ guint8 *data;
+ gsize size;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ res =
+ gst_tag_list_from_vorbiscomment (data, size, id_data, id_data_length,
+ vendor_string);
+ gst_buffer_unmap (buffer, data, size);
+
+ return res;
+}
+
+typedef struct
+{
+ guint count;
+ guint data_count;
+ GList *entries;
+}
+MyForEach;
+
+static GList *
+gst_tag_to_metadata_block_picture (const gchar * tag,
+ const GValue * image_value)
+{
+#if 0
+ gchar *comment_data, *data_result;
+ const gchar *mime_type;
+ guint mime_type_len;
+ GstStructure *mime_struct;
+ GstBuffer *buffer;
+#endif
+ GList *l = NULL;
+#if 0
+ guint8 *data;
+ gsize size;
+ GstByteWriter writer;
+ GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE;
+ gint width = 0, height = 0;
+ guint8 *metadata_block;
+ guint metadata_block_len;
+#endif
+
+ g_return_val_if_fail (image_value != NULL, NULL);
+
+ /* FIXME, no more buffer caps */
+ g_assert_not_reached ();
+
+#if 0
+ buffer = gst_value_get_buffer (image_value);
+ g_return_val_if_fail (gst_caps_is_fixed (buffer->caps), NULL);
+ mime_struct = gst_caps_get_structure (buffer->caps, 0);
+
+ mime_type = gst_structure_get_name (mime_struct);
+ if (strcmp (mime_type, "text/uri-list") == 0)
+ mime_type = "-->";
+ mime_type_len = strlen (mime_type);
+
+ gst_structure_get (mime_struct, "image-type", GST_TYPE_TAG_IMAGE_TYPE,
+ &image_type, "width", G_TYPE_INT, &width, "height", G_TYPE_INT, &height,
+ NULL);
+
+ metadata_block_len = 32 + mime_type_len + gst_buffer_get_size (buffer);
+ gst_byte_writer_init_with_size (&writer, metadata_block_len, TRUE);
+
+ if (image_type == GST_TAG_IMAGE_TYPE_NONE
+ && strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0) {
+ gst_byte_writer_put_uint32_be_unchecked (&writer, 0x01);
+ } else {
+ /* Convert to ID3v2 APIC image type */
+ if (image_type == GST_TAG_IMAGE_TYPE_NONE)
+ image_type = GST_TAG_IMAGE_TYPE_UNDEFINED;
+ else
+ image_type = image_type + 2;
+ gst_byte_writer_put_uint32_be_unchecked (&writer, image_type);
+ }
+
+ gst_byte_writer_put_uint32_be_unchecked (&writer, mime_type_len);
+ gst_byte_writer_put_data_unchecked (&writer, (guint8 *) mime_type,
+ mime_type_len);
+ /* description length */
+ gst_byte_writer_put_uint32_be_unchecked (&writer, 0);
+ gst_byte_writer_put_uint32_be_unchecked (&writer, width);
+ gst_byte_writer_put_uint32_be_unchecked (&writer, height);
+ /* color depth */
+ gst_byte_writer_put_uint32_be_unchecked (&writer, 0);
+ /* for indexed formats the number of colors */
+ gst_byte_writer_put_uint32_be_unchecked (&writer, 0);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ gst_byte_writer_put_uint32_be_unchecked (&writer, size);
+ gst_byte_writer_put_data_unchecked (&writer, data, size);
+ gst_buffer_unmap (buffer, data, size);
+
+ g_assert (gst_byte_writer_get_pos (&writer) == metadata_block_len);
+
+ metadata_block = gst_byte_writer_reset_and_get_data (&writer);
+ comment_data = g_base64_encode (metadata_block, metadata_block_len);
+ g_free (metadata_block);
+ data_result = g_strdup_printf ("METADATA_BLOCK_PICTURE=%s", comment_data);
+ g_free (comment_data);
+
+ l = g_list_append (l, data_result);
+#endif
+
+ return l;
+}
+
+/**
+ * gst_tag_to_vorbis_comments:
+ * @list: a #GstTagList
+ * @tag: a GStreamer tag identifier, such as #GST_TAG_ARTIST
+ *
+ * Creates a new tag list that contains the information parsed out of a
+ * vorbiscomment packet.
+ *
+ * Returns: A #GList of newly-allowcated key=value strings. Free with
+ * g_list_foreach (list, (GFunc) g_free, NULL) plus g_list_free (list)
+ */
+GList *
+gst_tag_to_vorbis_comments (const GstTagList * list, const gchar * tag)
+{
+ const gchar *vorbis_tag = NULL;
+ GList *l = NULL;
+ guint i;
+
+ g_return_val_if_fail (list != NULL, NULL);
+ g_return_val_if_fail (tag != NULL, NULL);
+
+ /* Special case: cover art is split into two tags to store data and
+ * MIME-type. Even if the tag list contains multiple entries, there is
+ * no reasonable way to save more than one.
+ * If both, preview image and image, are present we prefer the
+ * image tag.
+ */
+ if ((strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0 &&
+ gst_tag_list_get_tag_size (list, GST_TAG_IMAGE) == 0) ||
+ strcmp (tag, GST_TAG_IMAGE) == 0) {
+ return gst_tag_to_metadata_block_picture (tag,
+ gst_tag_list_get_value_index (list, tag, 0));
+ }
+
+ if (strcmp (tag, GST_TAG_EXTENDED_COMMENT) != 0) {
+ vorbis_tag = gst_tag_to_vorbis_tag (tag);
+ if (!vorbis_tag)
+ return NULL;
+ }
+
+ /* FIXME: for tags that can map to multiple vorbis comment keys, add all
+ * of the possible keys */
+ for (i = 0; i < gst_tag_list_get_tag_size (list, tag); i++) {
+ GType tag_type = gst_tag_get_type (tag);
+ gchar *result = NULL;
+
+ switch (tag_type) {
+ case G_TYPE_UINT:{
+ guint u;
+
+ if (!gst_tag_list_get_uint_index (list, tag, i, &u))
+ g_return_val_if_reached (NULL);
+ result = g_strdup_printf ("%s=%u", vorbis_tag, u);
+ break;
+ }
+ case G_TYPE_STRING:{
+ const gchar *str = NULL;
+
+ if (!gst_tag_list_peek_string_index (list, tag, i, &str))
+ g_return_val_if_reached (NULL);
+
+ /* special case: GST_TAG_EXTENDED_COMMENT */
+ if (vorbis_tag == NULL) {
+ gchar *key = NULL, *val = NULL;
+
+ if (gst_tag_parse_extended_comment (str, &key, NULL, &val, TRUE)) {
+ result = g_strdup_printf ("%s=%s", key, val);
+ g_free (key);
+ g_free (val);
+ } else {
+ GST_WARNING ("Not a valid extended comment string: %s", str);
+ continue;
+ }
+ } else {
+ result = g_strdup_printf ("%s=%s", vorbis_tag, str);
+ }
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ gdouble value;
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+
+ if (!gst_tag_list_get_double_index (list, tag, i, &value))
+ g_return_val_if_reached (NULL);
+ g_ascii_formatd (buf, G_ASCII_DTOSTR_BUF_SIZE, "%f", value);
+ result = g_strconcat (vorbis_tag, "=", buf, NULL);
+ break;
+ }
+ default:{
+ if (tag_type == GST_TYPE_DATE) {
+ GDate *date;
+
+ if (!gst_tag_list_get_date_index (list, tag, i, &date))
+ g_return_val_if_reached (NULL);
+
+ /* vorbis suggests using ISO date formats */
+ result =
+ g_strdup_printf ("%s=%04d-%02d-%02d", vorbis_tag,
+ (gint) g_date_get_year (date), (gint) g_date_get_month (date),
+ (gint) g_date_get_day (date));
+ g_date_free (date);
+ } else {
+ GST_DEBUG ("Couldn't write tag %s", tag);
+ continue;
+ }
+ break;
+ }
+ }
+ l = g_list_prepend (l, result);
+ }
+
+ return g_list_reverse (l);
+}
+
+static void
+write_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data)
+{
+ MyForEach *data = (MyForEach *) user_data;
+ GList *comments;
+ GList *it;
+
+ comments = gst_tag_to_vorbis_comments (list, tag);
+
+ for (it = comments; it != NULL; it = it->next) {
+ gchar *result = it->data;
+
+ data->count++;
+ data->data_count += strlen (result);
+ data->entries = g_list_prepend (data->entries, result);
+ }
+
+ g_list_free (comments);
+}
+
+/**
+ * gst_tag_list_to_vorbiscomment_buffer:
+ * @list: tag list to convert
+ * @id_data: identification data at start of stream
+ * @id_data_length: length of identification data, may be 0 if @id_data is NULL
+ * @vendor_string: string that describes the vendor string or NULL
+ *
+ * Creates a new vorbiscomment buffer from a tag list.
+ *
+ * Returns: A new #GstBuffer containing a vorbiscomment buffer with all tags
+ * that could be converted from the given tag list.
+ */
+GstBuffer *
+gst_tag_list_to_vorbiscomment_buffer (const GstTagList * list,
+ const guint8 * id_data, const guint id_data_length,
+ const gchar * vendor_string)
+{
+ GstBuffer *buffer;
+ guint8 *data, *odata;
+ guint i;
+ GList *l;
+ MyForEach my_data = { 0, 0, NULL };
+ guint vendor_len;
+ int required_size;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
+ g_return_val_if_fail (id_data != NULL || id_data_length == 0, NULL);
+
+ if (vendor_string == NULL)
+ vendor_string = "GStreamer encoded vorbiscomment";
+ vendor_len = strlen (vendor_string);
+ required_size = id_data_length + 4 + vendor_len + 4 + 1;
+ gst_tag_list_foreach ((GstTagList *) list, write_one_tag, &my_data);
+ required_size += 4 * my_data.count + my_data.data_count;
+
+ buffer = gst_buffer_new_and_alloc (required_size);
+ odata = data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ if (id_data_length > 0) {
+ memcpy (data, id_data, id_data_length);
+ data += id_data_length;
+ }
+ GST_WRITE_UINT32_LE (data, vendor_len);
+ data += 4;
+ memcpy (data, vendor_string, vendor_len);
+ data += vendor_len;
+ l = my_data.entries = g_list_reverse (my_data.entries);
+ GST_WRITE_UINT32_LE (data, my_data.count);
+ data += 4;
+ for (i = 0; i < my_data.count; i++) {
+ guint size;
+ gchar *cur;
+
+ g_assert (l != NULL);
+ cur = l->data;
+ l = g_list_next (l);
+ size = strlen (cur);
+ GST_WRITE_UINT32_LE (data, size);
+ data += 4;
+ memcpy (data, cur, size);
+ data += size;
+ }
+ g_list_foreach (my_data.entries, (GFunc) g_free, NULL);
+ g_list_free (my_data.entries);
+ *data = 1;
+ gst_buffer_unmap (buffer, odata, required_size);
+
+ return buffer;
+}
diff --git a/gst-libs/gst/tag/gstxmptag.c b/gst-libs/gst/tag/gstxmptag.c
new file mode 100644
index 0000000..0c178b4
--- /dev/null
+++ b/gst-libs/gst/tag/gstxmptag.c
@@ -0,0 +1,1894 @@
+/* GStreamer
+ * Copyright (C) 2010 Stefan Kost <stefan.kost@nokia.com>
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * gstxmptag.c: library for reading / modifying xmp tags
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttagxmp
+ * @short_description: tag mappings and support functions for plugins
+ * dealing with xmp packets
+ * @see_also: #GstTagList
+ *
+ * Contains various utility functions for plugins to parse or create
+ * xmp packets and map them to and from #GstTagList<!-- -->s.
+ *
+ * Please note that the xmp parser is very lightweight and not strict at all.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "tag.h"
+#include <gst/gsttagsetter.h>
+#include "gsttageditingprivate.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+
+static const gchar *schema_list[] = {
+ "dc",
+ "xap",
+ "tiff",
+ "exif",
+ "photoshop",
+ "Iptc4xmpCore",
+ "Iptc4xmpExt",
+ NULL
+};
+
+/**
+ * gst_tag_xmp_list_schemas:
+ *
+ * Gets the list of supported schemas in the xmp lib
+ *
+ * Returns: a %NULL terminated array of strings with the schema names
+ *
+ * Since: 0.10.33
+ */
+const gchar **
+gst_tag_xmp_list_schemas (void)
+{
+ return schema_list;
+}
+
+typedef struct _XmpSerializationData XmpSerializationData;
+typedef struct _XmpTag XmpTag;
+
+/*
+ * Serializes a GValue into a string.
+ */
+typedef gchar *(*XmpSerializationFunc) (const GValue * value);
+
+/*
+ * Deserializes @str that is the gstreamer tag @gst_tag represented in
+ * XMP as the @xmp_tag_value and adds the result to the @taglist.
+ *
+ * @pending_tags is passed so that compound xmp tags can search for its
+ * complements on the list and use them. Note that used complements should
+ * be freed and removed from the list.
+ * The list is of PendingXmpTag
+ */
+typedef void (*XmpDeserializationFunc) (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag_value,
+ const gchar * str, GSList ** pending_tags);
+
+struct _XmpSerializationData
+{
+ GString *data;
+ const gchar **schemas;
+};
+
+static gboolean
+xmp_serialization_data_use_schema (XmpSerializationData * serdata,
+ const gchar * schemaname)
+{
+ gint i = 0;
+ if (serdata->schemas == NULL)
+ return TRUE;
+
+ while (serdata->schemas[i] != NULL) {
+ if (strcmp (serdata->schemas[i], schemaname) == 0)
+ return TRUE;
+ i++;
+ }
+ return FALSE;
+}
+
+typedef enum
+{
+ GstXmpTagTypeNone = 0,
+ GstXmpTagTypeSimple,
+ GstXmpTagTypeBag,
+ GstXmpTagTypeSeq,
+ GstXmpTagTypeStruct,
+
+ /* Not really a xmp type, this is a tag that in gst is represented with
+ * a single value and on xmp it needs 2 (or more) simple values
+ *
+ * e.g. GST_TAG_GEO_LOCATION_ELEVATION needs to be mapped into 2 complementary
+ * tags in the exif's schema. One of them stores the absolute elevation,
+ * and the other one stores if it is above of below sea level.
+ */
+ GstXmpTagTypeCompound
+} GstXmpTagType;
+
+struct _XmpTag
+{
+ const gchar *gst_tag;
+ const gchar *tag_name;
+ GstXmpTagType type;
+
+ /* some tags must be inside a Bag even
+ * if they are a single entry. Set it here so we know */
+ GstXmpTagType supertype;
+
+ /* For tags that need a rdf:parseType attribute */
+ const gchar *parse_type;
+
+ /* Used for struct and compound types */
+ GSList *children;
+
+ XmpSerializationFunc serialize;
+ XmpDeserializationFunc deserialize;
+};
+
+static GstTagMergeMode
+xmp_tag_get_merge_mode (XmpTag * xmptag)
+{
+ switch (xmptag->type) {
+ case GstXmpTagTypeBag:
+ case GstXmpTagTypeSeq:
+ return GST_TAG_MERGE_APPEND;
+ case GstXmpTagTypeSimple:
+ default:
+ return GST_TAG_MERGE_KEEP;
+ }
+}
+
+static const gchar *
+xmp_tag_type_get_name (GstXmpTagType tagtype)
+{
+ switch (tagtype) {
+ case GstXmpTagTypeSeq:
+ return "rdf:Seq";
+ case GstXmpTagTypeBag:
+ return "rdf:Bag";
+ default:
+ g_assert_not_reached ();
+ }
+ return NULL; /* make compiler happy with -DG_DISABLE_ASSERT */
+}
+
+struct _PendingXmpTag
+{
+ XmpTag *xmp_tag;
+ gchar *str;
+};
+typedef struct _PendingXmpTag PendingXmpTag;
+
+/*
+ * A schema is a mapping of strings (the tag name in gstreamer) to a list of
+ * tags in xmp (XmpTag).
+ */
+typedef GHashTable GstXmpSchema;
+#define gst_xmp_schema_lookup g_hash_table_lookup
+#define gst_xmp_schema_insert g_hash_table_insert
+static GstXmpSchema *
+gst_xmp_schema_new ()
+{
+ return g_hash_table_new (g_direct_hash, g_direct_equal);
+}
+
+/*
+ * Mappings from schema names into the schema group of tags (GstXmpSchema)
+ */
+static GHashTable *__xmp_schemas;
+
+static GstXmpSchema *
+_gst_xmp_get_schema (const gchar * name)
+{
+ GQuark key;
+ GstXmpSchema *schema;
+
+ key = g_quark_from_string (name);
+
+ schema = g_hash_table_lookup (__xmp_schemas, GUINT_TO_POINTER (key));
+ if (!schema) {
+ GST_WARNING ("Schema %s doesn't exist", name);
+ }
+ return schema;
+}
+
+static void
+_gst_xmp_add_schema (const gchar * name, GstXmpSchema * schema)
+{
+ GQuark key;
+
+ key = g_quark_from_string (name);
+
+ if (g_hash_table_lookup (__xmp_schemas, GUINT_TO_POINTER (key))) {
+ GST_WARNING ("Schema %s already exists, ignoring", name);
+ g_assert_not_reached ();
+ return;
+ }
+
+ g_hash_table_insert (__xmp_schemas, GUINT_TO_POINTER (key), schema);
+}
+
+static void
+_gst_xmp_schema_add_mapping (GstXmpSchema * schema, XmpTag * tag)
+{
+ GQuark key;
+
+ key = g_quark_from_string (tag->gst_tag);
+
+ if (gst_xmp_schema_lookup (schema, GUINT_TO_POINTER (key))) {
+ GST_WARNING ("Tag %s already present for the schema", tag->gst_tag);
+ g_assert_not_reached ();
+ return;
+ }
+ gst_xmp_schema_insert (schema, GUINT_TO_POINTER (key), tag);
+}
+
+static XmpTag *
+gst_xmp_tag_create (const gchar * gst_tag, const gchar * xmp_tag,
+ gint xmp_type, XmpSerializationFunc serialization_func,
+ XmpDeserializationFunc deserialization_func)
+{
+ XmpTag *xmpinfo;
+
+ xmpinfo = g_slice_new (XmpTag);
+ xmpinfo->gst_tag = gst_tag;
+ xmpinfo->tag_name = xmp_tag;
+ xmpinfo->type = xmp_type;
+ xmpinfo->supertype = GstXmpTagTypeNone;
+ xmpinfo->parse_type = NULL;
+ xmpinfo->serialize = serialization_func;
+ xmpinfo->deserialize = deserialization_func;
+ xmpinfo->children = NULL;
+
+ return xmpinfo;
+}
+
+static XmpTag *
+gst_xmp_tag_create_compound (const gchar * gst_tag, const gchar * xmp_tag_a,
+ const gchar * xmp_tag_b, XmpSerializationFunc serialization_func_a,
+ XmpSerializationFunc serialization_func_b,
+ XmpDeserializationFunc deserialization_func)
+{
+ XmpTag *xmptag;
+ XmpTag *xmptag_a =
+ gst_xmp_tag_create (gst_tag, xmp_tag_a, GstXmpTagTypeSimple,
+ serialization_func_a, deserialization_func);
+ XmpTag *xmptag_b =
+ gst_xmp_tag_create (gst_tag, xmp_tag_b, GstXmpTagTypeSimple,
+ serialization_func_b, deserialization_func);
+
+ xmptag =
+ gst_xmp_tag_create (gst_tag, NULL, GstXmpTagTypeCompound, NULL, NULL);
+
+ xmptag->children = g_slist_prepend (xmptag->children, xmptag_b);
+ xmptag->children = g_slist_prepend (xmptag->children, xmptag_a);
+
+ return xmptag;
+}
+
+static void
+_gst_xmp_schema_add_simple_mapping (GstXmpSchema * schema,
+ const gchar * gst_tag, const gchar * xmp_tag, gint xmp_type,
+ XmpSerializationFunc serialization_func,
+ XmpDeserializationFunc deserialization_func)
+{
+ _gst_xmp_schema_add_mapping (schema,
+ gst_xmp_tag_create (gst_tag, xmp_tag, xmp_type, serialization_func,
+ deserialization_func));
+}
+
+/*
+ * We do not return a copy here because elements are
+ * appended, and the API is not public, so we shouldn't
+ * have our lists modified during usage
+ */
+#if 0
+static GPtrArray *
+_xmp_tag_get_mapping (const gchar * gst_tag, XmpSerializationData * serdata)
+{
+ GPtrArray *ret = NULL;
+ GHashTableIter iter;
+ GQuark key = g_quark_from_string (gst_tag);
+ gpointer iterkey, value;
+ const gchar *schemaname;
+
+ g_hash_table_iter_init (&iter, __xmp_schemas);
+ while (!ret && g_hash_table_iter_next (&iter, &iterkey, &value)) {
+ GstXmpSchema *schema = (GstXmpSchema *) value;
+
+ schemaname = g_quark_to_string (GPOINTER_TO_UINT (iterkey));
+ if (xmp_serialization_data_use_schema (serdata, schemaname))
+ ret =
+ (GPtrArray *) gst_xmp_schema_lookup (schema, GUINT_TO_POINTER (key));
+ }
+ return ret;
+}
+#endif
+
+/* finds the gst tag that maps to this xmp tag in this schema */
+static const gchar *
+_gst_xmp_schema_get_mapping_reverse (GstXmpSchema * schema,
+ const gchar * xmp_tag, XmpTag ** _xmp_tag)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+ const gchar *ret = NULL;
+
+ /* Iterate over the hashtable */
+ g_hash_table_iter_init (&iter, schema);
+ while (!ret && g_hash_table_iter_next (&iter, &key, &value)) {
+ XmpTag *xmpinfo = (XmpTag *) value;
+
+ if (xmpinfo->tag_name) {
+ if (strcmp (xmpinfo->tag_name, xmp_tag) == 0) {
+ *_xmp_tag = xmpinfo;
+ ret = g_quark_to_string (GPOINTER_TO_UINT (key));
+ goto out;
+ }
+ } else if (xmpinfo->children) {
+ GSList *iter;
+ for (iter = xmpinfo->children; iter; iter = g_slist_next (iter)) {
+ XmpTag *child = iter->data;
+ if (strcmp (child->tag_name, xmp_tag) == 0) {
+ *_xmp_tag = child;
+ ret = g_quark_to_string (GPOINTER_TO_UINT (key));
+ goto out;
+ }
+ }
+ } else {
+ g_assert_not_reached ();
+ }
+ }
+
+out:
+ return ret;
+}
+
+/* finds the gst tag that maps to this xmp tag (searches on all schemas) */
+static const gchar *
+_gst_xmp_tag_get_mapping_reverse (const gchar * xmp_tag, XmpTag ** _xmp_tag)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+ const gchar *ret = NULL;
+
+ /* Iterate over the hashtable */
+ g_hash_table_iter_init (&iter, __xmp_schemas);
+ while (!ret && g_hash_table_iter_next (&iter, &key, &value)) {
+ ret = _gst_xmp_schema_get_mapping_reverse ((GstXmpSchema *) value, xmp_tag,
+ _xmp_tag);
+ }
+ return ret;
+}
+
+/* utility functions/macros */
+
+#define METERS_PER_SECOND_TO_KILOMETERS_PER_HOUR (3.6)
+#define KILOMETERS_PER_HOUR_TO_METERS_PER_SECOND (1/3.6)
+#define MILES_PER_HOUR_TO_METERS_PER_SECOND (0.44704)
+#define KNOTS_TO_METERS_PER_SECOND (0.514444)
+
+static gchar *
+double_to_fraction_string (gdouble num)
+{
+ gint frac_n;
+ gint frac_d;
+
+ gst_util_double_to_fraction (num, &frac_n, &frac_d);
+ return g_strdup_printf ("%d/%d", frac_n, frac_d);
+}
+
+/* (de)serialize functions */
+static gchar *
+serialize_exif_gps_coordinate (const GValue * value, gchar pos, gchar neg)
+{
+ gdouble num;
+ gchar c;
+ gint integer;
+ gchar fraction[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_return_val_if_fail (G_VALUE_TYPE (value) == G_TYPE_DOUBLE, NULL);
+
+ num = g_value_get_double (value);
+ if (num < 0) {
+ c = neg;
+ num *= -1;
+ } else {
+ c = pos;
+ }
+ integer = (gint) num;
+
+ g_ascii_dtostr (fraction, sizeof (fraction), (num - integer) * 60);
+
+ /* FIXME review GPSCoordinate serialization spec for the .mm or ,ss
+ * decision. Couldn't understand it clearly */
+ return g_strdup_printf ("%d,%s%c", integer, fraction, c);
+}
+
+static gchar *
+serialize_exif_latitude (const GValue * value)
+{
+ return serialize_exif_gps_coordinate (value, 'N', 'S');
+}
+
+static gchar *
+serialize_exif_longitude (const GValue * value)
+{
+ return serialize_exif_gps_coordinate (value, 'E', 'W');
+}
+
+static void
+deserialize_exif_gps_coordinate (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * str, gchar pos, gchar neg)
+{
+ gdouble value = 0;
+ gint d = 0, m = 0, s = 0;
+ gdouble m2 = 0;
+ gchar c = 0;
+ const gchar *current;
+
+ /* get the degrees */
+ if (sscanf (str, "%d", &d) != 1)
+ goto error;
+
+ /* find the beginning of the minutes */
+ current = strchr (str, ',');
+ if (current == NULL)
+ goto end;
+ current += 1;
+
+ /* check if it uses ,SS or .mm */
+ if (strchr (current, ',') != NULL) {
+ sscanf (current, "%d,%d%c", &m, &s, &c);
+ } else {
+ gchar *copy = g_strdup (current);
+ gint len = strlen (copy);
+ gint i;
+
+ /* check the last letter */
+ for (i = len - 1; len >= 0; len--) {
+ if (g_ascii_isspace (copy[i]))
+ continue;
+
+ if (g_ascii_isalpha (copy[i])) {
+ /* found it */
+ c = copy[i];
+ copy[i] = '\0';
+ break;
+
+ } else {
+ /* something is wrong */
+ g_free (copy);
+ goto error;
+ }
+ }
+
+ /* use a copy so we can change the last letter as E can cause
+ * problems here */
+ m2 = g_ascii_strtod (copy, NULL);
+ g_free (copy);
+ }
+
+end:
+ /* we can add them all as those that aren't parsed are 0 */
+ value = d + (m / 60.0) + (s / (60.0 * 60.0)) + (m2 / 60.0);
+
+ if (c == pos) {
+ //NOP
+ } else if (c == neg) {
+ value *= -1;
+ } else {
+ goto error;
+ }
+
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag), gst_tag, value,
+ NULL);
+ return;
+
+error:
+ GST_WARNING ("Failed to deserialize gps coordinate: %s", str);
+}
+
+static void
+deserialize_exif_latitude (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ deserialize_exif_gps_coordinate (xmptag, taglist, gst_tag, str, 'N', 'S');
+}
+
+static void
+deserialize_exif_longitude (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ deserialize_exif_gps_coordinate (xmptag, taglist, gst_tag, str, 'E', 'W');
+}
+
+static gchar *
+serialize_exif_altitude (const GValue * value)
+{
+ gdouble num;
+
+ num = g_value_get_double (value);
+
+ if (num < 0)
+ num *= -1;
+
+ return double_to_fraction_string (num);
+}
+
+static gchar *
+serialize_exif_altituderef (const GValue * value)
+{
+ gdouble num;
+
+ num = g_value_get_double (value);
+
+ /* 0 means above sea level, 1 means below */
+ if (num >= 0)
+ return g_strdup ("0");
+ return g_strdup ("1");
+}
+
+static void
+deserialize_exif_altitude (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ const gchar *altitude_str = NULL;
+ const gchar *altituderef_str = NULL;
+ gint frac_n;
+ gint frac_d;
+ gdouble value;
+
+ GSList *entry;
+ PendingXmpTag *ptag = NULL;
+
+ /* find the other missing part */
+ if (strcmp (xmp_tag, "exif:GPSAltitude") == 0) {
+ altitude_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, "exif:GPSAltitudeRef") == 0) {
+ altituderef_str = ptag->str;
+ break;
+ }
+ }
+
+ } else if (strcmp (xmp_tag, "exif:GPSAltitudeRef") == 0) {
+ altituderef_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, "exif:GPSAltitude") == 0) {
+ altitude_str = ptag->str;
+ break;
+ }
+ }
+
+ } else {
+ GST_WARNING ("Unexpected xmp tag %s", xmp_tag);
+ return;
+ }
+
+ if (!altitude_str) {
+ GST_WARNING ("Missing exif:GPSAltitude tag");
+ return;
+ }
+ if (!altituderef_str) {
+ GST_WARNING ("Missing exif:GPSAltitudeRef tag");
+ return;
+ }
+
+ if (sscanf (altitude_str, "%d/%d", &frac_n, &frac_d) != 2) {
+ GST_WARNING ("Failed to parse fraction: %s", altitude_str);
+ return;
+ }
+
+ gst_util_fraction_to_double (frac_n, frac_d, &value);
+
+ if (altituderef_str[0] == '0') {
+ /* nop */
+ } else if (altituderef_str[0] == '1') {
+ value *= -1;
+ } else {
+ GST_WARNING ("Unexpected exif:AltitudeRef value: %s", altituderef_str);
+ return;
+ }
+
+ /* add to the taglist */
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag),
+ GST_TAG_GEO_LOCATION_ELEVATION, value, NULL);
+
+ /* clean up entry */
+ g_free (ptag->str);
+ g_slice_free (PendingXmpTag, ptag);
+ *pending_tags = g_slist_delete_link (*pending_tags, entry);
+}
+
+static gchar *
+serialize_exif_gps_speed (const GValue * value)
+{
+ return double_to_fraction_string (g_value_get_double (value) *
+ METERS_PER_SECOND_TO_KILOMETERS_PER_HOUR);
+}
+
+static gchar *
+serialize_exif_gps_speedref (const GValue * value)
+{
+ /* we always use km/h */
+ return g_strdup ("K");
+}
+
+static void
+deserialize_exif_gps_speed (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ const gchar *speed_str = NULL;
+ const gchar *speedref_str = NULL;
+ gint frac_n;
+ gint frac_d;
+ gdouble value;
+
+ GSList *entry;
+ PendingXmpTag *ptag = NULL;
+
+ /* find the other missing part */
+ if (strcmp (xmp_tag, "exif:GPSSpeed") == 0) {
+ speed_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, "exif:GPSSpeedRef") == 0) {
+ speedref_str = ptag->str;
+ break;
+ }
+ }
+
+ } else if (strcmp (xmp_tag, "exif:GPSSpeedRef") == 0) {
+ speedref_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, "exif:GPSSpeed") == 0) {
+ speed_str = ptag->str;
+ break;
+ }
+ }
+
+ } else {
+ GST_WARNING ("Unexpected xmp tag %s", xmp_tag);
+ return;
+ }
+
+ if (!speed_str) {
+ GST_WARNING ("Missing exif:GPSSpeed tag");
+ return;
+ }
+ if (!speedref_str) {
+ GST_WARNING ("Missing exif:GPSSpeedRef tag");
+ return;
+ }
+
+ if (sscanf (speed_str, "%d/%d", &frac_n, &frac_d) != 2) {
+ GST_WARNING ("Failed to parse fraction: %s", speed_str);
+ return;
+ }
+
+ gst_util_fraction_to_double (frac_n, frac_d, &value);
+
+ if (speedref_str[0] == 'K') {
+ value *= KILOMETERS_PER_HOUR_TO_METERS_PER_SECOND;
+ } else if (speedref_str[0] == 'M') {
+ value *= MILES_PER_HOUR_TO_METERS_PER_SECOND;
+ } else if (speedref_str[0] == 'N') {
+ value *= KNOTS_TO_METERS_PER_SECOND;
+ } else {
+ GST_WARNING ("Unexpected exif:SpeedRef value: %s", speedref_str);
+ return;
+ }
+
+ /* add to the taglist */
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag),
+ GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, value, NULL);
+
+ /* clean up entry */
+ g_free (ptag->str);
+ g_slice_free (PendingXmpTag, ptag);
+ *pending_tags = g_slist_delete_link (*pending_tags, entry);
+}
+
+static gchar *
+serialize_exif_gps_direction (const GValue * value)
+{
+ return double_to_fraction_string (g_value_get_double (value));
+}
+
+static gchar *
+serialize_exif_gps_directionref (const GValue * value)
+{
+ /* T for true geographic direction (M would mean magnetic) */
+ return g_strdup ("T");
+}
+
+static void
+deserialize_exif_gps_direction (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags, const gchar * direction_tag,
+ const gchar * directionref_tag)
+{
+ const gchar *dir_str = NULL;
+ const gchar *dirref_str = NULL;
+ gint frac_n;
+ gint frac_d;
+ gdouble value;
+
+ GSList *entry;
+ PendingXmpTag *ptag = NULL;
+
+ /* find the other missing part */
+ if (strcmp (xmp_tag, direction_tag) == 0) {
+ dir_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, directionref_tag) == 0) {
+ dirref_str = ptag->str;
+ break;
+ }
+ }
+
+ } else if (strcmp (xmp_tag, directionref_tag) == 0) {
+ dirref_str = str;
+
+ for (entry = *pending_tags; entry; entry = g_slist_next (entry)) {
+ ptag = (PendingXmpTag *) entry->data;
+
+ if (strcmp (ptag->xmp_tag->tag_name, direction_tag) == 0) {
+ dir_str = ptag->str;
+ break;
+ }
+ }
+
+ } else {
+ GST_WARNING ("Unexpected xmp tag %s", xmp_tag);
+ return;
+ }
+
+ if (!dir_str) {
+ GST_WARNING ("Missing %s tag", dir_str);
+ return;
+ }
+ if (!dirref_str) {
+ GST_WARNING ("Missing %s tag", dirref_str);
+ return;
+ }
+
+ if (sscanf (dir_str, "%d/%d", &frac_n, &frac_d) != 2) {
+ GST_WARNING ("Failed to parse fraction: %s", dir_str);
+ return;
+ }
+
+ gst_util_fraction_to_double (frac_n, frac_d, &value);
+
+ if (dirref_str[0] == 'T') {
+ /* nop */
+ } else if (dirref_str[0] == 'M') {
+ GST_WARNING ("Magnetic direction tags aren't supported yet");
+ return;
+ } else {
+ GST_WARNING ("Unexpected %s value: %s", directionref_tag, dirref_str);
+ return;
+ }
+
+ /* add to the taglist */
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag), gst_tag, value,
+ NULL);
+
+ /* clean up entry */
+ g_free (ptag->str);
+ g_slice_free (PendingXmpTag, ptag);
+ *pending_tags = g_slist_delete_link (*pending_tags, entry);
+}
+
+static void
+deserialize_exif_gps_track (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ deserialize_exif_gps_direction (xmptag, taglist, gst_tag, xmp_tag, str,
+ pending_tags, "exif:GPSTrack", "exif:GPSTrackRef");
+}
+
+static void
+deserialize_exif_gps_img_direction (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ deserialize_exif_gps_direction (xmptag, taglist, gst_tag, xmp_tag, str,
+ pending_tags, "exif:GPSImgDirection", "exif:GPSImgDirectionRef");
+}
+
+static void
+deserialize_xmp_rating (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ guint value;
+
+ if (sscanf (str, "%u", &value) != 1) {
+ GST_WARNING ("Failed to parse xmp:Rating %s", str);
+ return;
+ }
+
+ if (value > 100) {
+ GST_WARNING ("Unsupported Rating tag %u (should be from 0 to 100), "
+ "ignoring", value);
+ return;
+ }
+
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag), gst_tag, value,
+ NULL);
+}
+
+static gchar *
+serialize_tiff_orientation (const GValue * value)
+{
+ const gchar *str;
+ gint num;
+
+ str = g_value_get_string (value);
+ if (str == NULL) {
+ GST_WARNING ("Failed to get image orientation tag value");
+ return NULL;
+ }
+
+ num = __exif_tag_image_orientation_to_exif_value (str);
+ if (num == -1)
+ return NULL;
+
+ return g_strdup_printf ("%d", num);
+}
+
+static void
+deserialize_tiff_orientation (XmpTag * xmptag, GstTagList * taglist,
+ const gchar * gst_tag, const gchar * xmp_tag, const gchar * str,
+ GSList ** pending_tags)
+{
+ guint value;
+ const gchar *orientation = NULL;
+
+ if (sscanf (str, "%u", &value) != 1) {
+ GST_WARNING ("Failed to parse tiff:Orientation %s", str);
+ return;
+ }
+
+ if (value < 1 || value > 8) {
+ GST_WARNING ("Invalid tiff:Orientation tag %u (should be from 1 to 8), "
+ "ignoring", value);
+ return;
+ }
+
+ orientation = __exif_tag_image_orientation_from_exif_value (value);
+ if (orientation == NULL)
+ return;
+ gst_tag_list_add (taglist, xmp_tag_get_merge_mode (xmptag), gst_tag,
+ orientation, NULL);
+}
+
+
+/* look at this page for addtional schemas
+ * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/XMP.html
+ */
+static gpointer
+_init_xmp_tag_map (gpointer user_data)
+{
+ XmpTag *xmpinfo;
+ GstXmpSchema *schema;
+
+ __xmp_schemas = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+ /* add the maps */
+ /* dublic code metadata
+ * http://dublincore.org/documents/dces/
+ */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_ARTIST,
+ "dc:creator", GstXmpTagTypeSeq, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_COPYRIGHT,
+ "dc:rights", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_DATE, "dc:date",
+ GstXmpTagTypeSeq, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_DESCRIPTION,
+ "dc:description", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_KEYWORDS,
+ "dc:subject", GstXmpTagTypeBag, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_TITLE, "dc:title",
+ GstXmpTagTypeSimple, NULL, NULL);
+ /* FIXME: we probably want GST_TAG_{,AUDIO_,VIDEO_}MIME_TYPE */
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_VIDEO_CODEC,
+ "dc:format", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_add_schema ("dc", schema);
+
+ /* xap (xmp) schema */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_USER_RATING,
+ "xmp:Rating", GstXmpTagTypeSimple, NULL, deserialize_xmp_rating);
+ _gst_xmp_add_schema ("xap", schema);
+
+ /* tiff */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema,
+ GST_TAG_DEVICE_MANUFACTURER, "tiff:Make", GstXmpTagTypeSimple, NULL,
+ NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_DEVICE_MODEL,
+ "tiff:Model", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_APPLICATION_NAME,
+ "tiff:Software", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_IMAGE_ORIENTATION,
+ "tiff:Orientation", GstXmpTagTypeSimple, serialize_tiff_orientation,
+ deserialize_tiff_orientation);
+ _gst_xmp_add_schema ("tiff", schema);
+
+ /* exif schema */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_DATE_TIME,
+ "exif:DateTimeOriginal", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema,
+ GST_TAG_GEO_LOCATION_LATITUDE, "exif:GPSLatitude",
+ GstXmpTagTypeSimple, serialize_exif_latitude, deserialize_exif_latitude);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_GEO_LOCATION_LONGITUDE,
+ "exif:GPSLongitude", GstXmpTagTypeSimple, serialize_exif_longitude,
+ deserialize_exif_longitude);
+ _gst_xmp_schema_add_simple_mapping (schema,
+ GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, "exif:ExposureBiasValue",
+ GstXmpTagTypeSimple, NULL, NULL);
+
+ /* compound exif tags */
+ xmpinfo = gst_xmp_tag_create_compound (GST_TAG_GEO_LOCATION_ELEVATION,
+ "exif:GPSAltitude", "exif:GPSAltitudeRef", serialize_exif_altitude,
+ serialize_exif_altituderef, deserialize_exif_altitude);
+ _gst_xmp_schema_add_mapping (schema, xmpinfo);
+
+ xmpinfo = gst_xmp_tag_create_compound (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED,
+ "exif:GPSSpeed", "exif:GPSSpeedRef", serialize_exif_gps_speed,
+ serialize_exif_gps_speedref, deserialize_exif_gps_speed);
+ _gst_xmp_schema_add_mapping (schema, xmpinfo);
+
+ xmpinfo =
+ gst_xmp_tag_create_compound (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION,
+ "exif:GPSTrack", "exif:GPSTrackRef", serialize_exif_gps_direction,
+ serialize_exif_gps_directionref, deserialize_exif_gps_track);
+ _gst_xmp_schema_add_mapping (schema, xmpinfo);
+
+ xmpinfo = gst_xmp_tag_create_compound (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION,
+ "exif:GPSImgDirection", "exif:GPSImgDirectionRef",
+ serialize_exif_gps_direction, serialize_exif_gps_directionref,
+ deserialize_exif_gps_img_direction);
+ _gst_xmp_schema_add_mapping (schema, xmpinfo);
+
+ _gst_xmp_add_schema ("exif", schema);
+
+ /* photoshop schema */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema,
+ GST_TAG_GEO_LOCATION_COUNTRY, "photoshop:Country",
+ GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_GEO_LOCATION_CITY,
+ "photoshop:City", GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_add_schema ("photoshop", schema);
+
+ /* iptc4xmpcore schema */
+ schema = gst_xmp_schema_new ();
+ _gst_xmp_schema_add_simple_mapping (schema,
+ GST_TAG_GEO_LOCATION_SUBLOCATION, "Iptc4xmpCore:Location",
+ GstXmpTagTypeSimple, NULL, NULL);
+ _gst_xmp_add_schema ("Iptc4xmpCore", schema);
+
+ /* iptc4xmpext schema */
+ schema = gst_xmp_schema_new ();
+ xmpinfo = gst_xmp_tag_create (NULL, "Iptc4xmpExt:LocationShown",
+ GstXmpTagTypeStruct, NULL, NULL);
+ xmpinfo->supertype = GstXmpTagTypeBag;
+ xmpinfo->parse_type = "Resource";
+ xmpinfo->children = g_slist_prepend (xmpinfo->children,
+ gst_xmp_tag_create (GST_TAG_GEO_LOCATION_SUBLOCATION,
+ "LocationDetails:Sublocation", GstXmpTagTypeSimple, NULL, NULL));
+ xmpinfo->children =
+ g_slist_prepend (xmpinfo->children,
+ gst_xmp_tag_create (GST_TAG_GEO_LOCATION_CITY,
+ "LocationDetails:City", GstXmpTagTypeSimple, NULL, NULL));
+ xmpinfo->children =
+ g_slist_prepend (xmpinfo->children,
+ gst_xmp_tag_create (GST_TAG_GEO_LOCATION_COUNTRY,
+ "LocationDetails:Country", GstXmpTagTypeSimple, NULL, NULL));
+ _gst_xmp_schema_add_mapping (schema, xmpinfo);
+ _gst_xmp_add_schema ("Iptc4xmpExt", schema);
+
+ return NULL;
+}
+
+static void
+xmp_tags_initialize ()
+{
+ static GOnce my_once = G_ONCE_INIT;
+ g_once (&my_once, (GThreadFunc) _init_xmp_tag_map, NULL);
+}
+
+typedef struct _GstXmpNamespaceMatch GstXmpNamespaceMatch;
+struct _GstXmpNamespaceMatch
+{
+ const gchar *ns_prefix;
+ const gchar *ns_uri;
+
+ /*
+ * Stores extra namespaces for array tags
+ * The namespaces should be writen in the form:
+ *
+ * xmlns:XpTo="http://some.org/your/ns/name/ (next ones)"
+ */
+ const gchar *extra_ns;
+};
+
+static const GstXmpNamespaceMatch ns_match[] = {
+ {"dc", "http://purl.org/dc/elements/1.1/", NULL},
+ {"exif", "http://ns.adobe.com/exif/1.0/", NULL},
+ {"tiff", "http://ns.adobe.com/tiff/1.0/", NULL},
+ {"xap", "http://ns.adobe.com/xap/1.0/", NULL},
+ {"photoshop", "http://ns.adobe.com/photoshop/1.0/", NULL},
+ {"Iptc4xmpCore", "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", NULL},
+ {"Iptc4xmpExt", "http://iptc.org/std/Iptc4xmpExt/2008-02-29/",
+ "xmlns:LocationDetails=\"http://iptc.org/std/Iptc4xmpExt/2008-02-29/LocationDetails/\""},
+ {NULL, NULL, NULL}
+};
+
+typedef struct _GstXmpNamespaceMap GstXmpNamespaceMap;
+struct _GstXmpNamespaceMap
+{
+ const gchar *original_ns;
+ gchar *gstreamer_ns;
+};
+
+/* parsing */
+
+static void
+read_one_tag (GstTagList * list, XmpTag * xmptag,
+ const gchar * v, GSList ** pending_tags)
+{
+ GType tag_type;
+ GstTagMergeMode merge_mode;
+ const gchar *tag = xmptag->gst_tag;
+
+ g_return_if_fail (tag != NULL);
+
+ if (xmptag->deserialize) {
+ xmptag->deserialize (xmptag, list, tag, xmptag->tag_name, v, pending_tags);
+ return;
+ }
+
+ merge_mode = xmp_tag_get_merge_mode (xmptag);
+ tag_type = gst_tag_get_type (tag);
+
+ /* add gstreamer tag depending on type */
+ switch (tag_type) {
+ case G_TYPE_STRING:{
+ gst_tag_list_add (list, merge_mode, tag, v, NULL);
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ gdouble value = 0;
+ gint frac_n, frac_d;
+
+ if (sscanf (v, "%d/%d", &frac_n, &frac_d) == 2) {
+ gst_util_fraction_to_double (frac_n, frac_d, &value);
+ gst_tag_list_add (list, merge_mode, tag, value, NULL);
+ } else {
+ GST_WARNING ("Failed to parse fraction: %s", v);
+ }
+ break;
+ }
+ default:
+ if (tag_type == GST_TYPE_DATE_TIME) {
+ GstDateTime *datetime = NULL;
+ gint year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
+ gint usecs = 0;
+ gint gmt_offset_hour = -1, gmt_offset_min = -1, gmt_offset = -1;
+ gchar usec_str[16];
+ gint ret;
+ gint len;
+
+ len = strlen (v);
+ if (len == 0) {
+ GST_WARNING ("Empty string for datetime parsing");
+ return;
+ }
+
+ GST_DEBUG ("Parsing %s into a datetime", v);
+
+ ret = sscanf (v, "%04d-%02d-%02dT%02d:%02d:%02d.%15s",
+ &year, &month, &day, &hour, &minute, &second, usec_str);
+ if (ret < 3) {
+ /* FIXME theoretically, xmp can express datetimes with only year
+ * or year and month, but gstdatetime doesn't support it */
+ GST_WARNING ("Invalid datetime value: %s", v);
+ }
+
+ /* parse the usecs */
+ if (ret >= 7) {
+ gint num_digits = 0;
+
+ /* find the number of digits */
+ while (isdigit ((gint) usec_str[num_digits++]) && num_digits < 6);
+
+ if (num_digits > 0) {
+ /* fill up to 6 digits with 0 */
+ while (num_digits < 6) {
+ usec_str[num_digits++] = 0;
+ }
+
+ g_assert (num_digits == 6);
+
+ usec_str[num_digits] = '\0';
+ usecs = atoi (usec_str);
+ }
+ }
+
+ /* parse the timezone info */
+ if (v[len - 1] == 'Z') {
+ GST_LOG ("UTC timezone");
+
+ /* Having a Z at the end means UTC */
+ datetime = gst_date_time_new (0, year, month, day, hour, minute,
+ second + usecs / 1000000.0);
+ } else {
+ gchar *plus_pos = NULL;
+ gchar *neg_pos = NULL;
+ gchar *pos = NULL;
+
+ GST_LOG ("Checking for timezone information");
+
+ /* check if there is timezone info */
+ plus_pos = strrchr (v, '+');
+ neg_pos = strrchr (v, '-');
+ if (plus_pos) {
+ pos = plus_pos + 1;
+ } else if (neg_pos) {
+ pos = neg_pos + 1;
+ }
+
+ if (pos) {
+ gint ret_tz = sscanf (pos, "%d:%d", &gmt_offset_hour,
+ &gmt_offset_min);
+
+ GST_DEBUG ("Parsing timezone: %s", pos);
+
+ if (ret_tz == 2) {
+ gmt_offset = gmt_offset_hour * 60 + gmt_offset_min;
+ if (neg_pos != NULL && neg_pos + 1 == pos)
+ gmt_offset *= -1;
+
+ GST_LOG ("Timezone offset: %f (%d minutes)", gmt_offset / 60.0,
+ gmt_offset);
+
+ /* no way to know if it is DST or not */
+ datetime =
+ gst_date_time_new (gmt_offset / 60.0,
+ year, month, day, hour, minute,
+ second + usecs / ((gdouble) G_USEC_PER_SEC));
+ } else {
+ GST_WARNING ("Failed to parse timezone information");
+ }
+ } else {
+ GST_WARNING ("No timezone signal found");
+ }
+ }
+
+ if (datetime) {
+ gst_tag_list_add (list, merge_mode, tag, datetime, NULL);
+ gst_date_time_unref (datetime);
+ }
+
+ } else if (tag_type == GST_TYPE_DATE) {
+ GDate *date;
+ gint d, m, y;
+
+ /* this is ISO 8601 Date and Time Format
+ * %F Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)
+ * %T The time in 24-hour notation (%H:%M:%S). (SU)
+ * e.g. 2009-05-30T18:26:14+03:00 */
+
+ /* FIXME: this would be the proper way, but needs
+ #define _XOPEN_SOURCE before #include <time.h>
+
+ date = g_date_new ();
+ struct tm tm={0,};
+ strptime (dts, "%FT%TZ", &tm);
+ g_date_set_time_t (date, mktime(&tm));
+ */
+ /* FIXME: this cannot parse the date
+ date = g_date_new ();
+ g_date_set_parse (date, v);
+ if (g_date_valid (date)) {
+ gst_tag_list_add (list, merge_mode, tag,
+ date, NULL);
+ } else {
+ GST_WARNING ("unparsable date: '%s'", v);
+ }
+ */
+ /* poor mans straw */
+ sscanf (v, "%04d-%02d-%02dT", &y, &m, &d);
+ date = g_date_new_dmy (d, m, y);
+ gst_tag_list_add (list, merge_mode, tag, date, NULL);
+ g_date_free (date);
+ } else {
+ GST_WARNING ("unhandled type for %s from xmp", tag);
+ }
+ break;
+ }
+}
+
+/**
+ * gst_tag_list_from_xmp_buffer:
+ * @buffer: buffer
+ *
+ * Parse a xmp packet into a taglist.
+ *
+ * Returns: new taglist or %NULL, free the list when done
+ *
+ * Since: 0.10.29
+ */
+GstTagList *
+gst_tag_list_from_xmp_buffer (GstBuffer * buffer)
+{
+ GstTagList *list = NULL;
+ gchar *xps, *xp1, *xp2, *xpe, *ns, *ne;
+ gsize len, max_ft_len;
+ gboolean in_tag;
+ gchar *part, *pp;
+ guint i;
+ XmpTag *last_xmp_tag = NULL;
+ GSList *pending_tags = NULL;
+
+ /* Used for strucuture xmp tags */
+ XmpTag *context_tag = NULL;
+
+ GstXmpNamespaceMap ns_map[] = {
+ {"dc", NULL}
+ ,
+ {"exif", NULL}
+ ,
+ {"tiff", NULL}
+ ,
+ {"xap", NULL}
+ ,
+ {"photoshop", NULL}
+ ,
+ {"Iptc4xmpCore", NULL}
+ ,
+ {"Iptc4xmpExt", NULL}
+ ,
+ {NULL, NULL}
+ };
+
+ xmp_tags_initialize ();
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+
+ GST_LOG ("Starting xmp parsing");
+
+ xps = gst_buffer_map (buffer, &len, NULL, GST_MAP_READ);
+ g_return_val_if_fail (len > 0, NULL);
+
+ xpe = &xps[len + 1];
+
+ /* check header and footer */
+ xp1 = g_strstr_len (xps, len, "<?xpacket begin");
+ if (!xp1)
+ goto missing_header;
+ xp1 = &xp1[strlen ("<?xpacket begin")];
+ while (*xp1 != '>' && *xp1 != '<' && xp1 < xpe)
+ xp1++;
+ if (*xp1 != '>')
+ goto missing_header;
+
+ max_ft_len = 1 + strlen ("<?xpacket end=\".\"?>");
+ if (len < max_ft_len)
+ goto missing_footer;
+
+ GST_DEBUG ("checking footer: [%s]", &xps[len - max_ft_len]);
+ xp2 = g_strstr_len (&xps[len - max_ft_len], max_ft_len, "<?xpacket ");
+ if (!xp2)
+ goto missing_footer;
+
+ GST_INFO ("xmp header okay");
+
+ /* skip > and text until first xml-node */
+ xp1++;
+ while (*xp1 != '<' && xp1 < xpe)
+ xp1++;
+
+ /* no tag can be longer that the whole buffer */
+ part = g_malloc (xp2 - xp1);
+ list = gst_tag_list_new ();
+
+ /* parse data into a list of nodes */
+ /* data is between xp1..xp2 */
+ in_tag = TRUE;
+ ns = ne = xp1;
+ pp = part;
+ while (ne < xp2) {
+ if (in_tag) {
+ ne++;
+ while (ne < xp2 && *ne != '>' && *ne != '<') {
+ if (*ne == '\n' || *ne == '\t' || *ne == ' ') {
+ while (ne < xp2 && (*ne == '\n' || *ne == '\t' || *ne == ' '))
+ ne++;
+ *pp++ = ' ';
+ } else {
+ *pp++ = *ne++;
+ }
+ }
+ *pp = '\0';
+ if (*ne != '>')
+ goto broken_xml;
+ /* create node */
+ /* {XML, ns, ne-ns} */
+ if (ns[0] != '/') {
+ gchar *as = strchr (part, ' ');
+ /* only log start nodes */
+ GST_INFO ("xml: %s", part);
+
+ if (as) {
+ gchar *ae, *d;
+
+ /* skip ' ' and scan the attributes */
+ as++;
+ d = ae = as;
+
+ /* split attr=value pairs */
+ while (*ae != '\0') {
+ if (*ae == '=') {
+ /* attr/value delimmiter */
+ d = ae;
+ } else if (*ae == '"') {
+ /* scan values */
+ gchar *v;
+
+ ae++;
+ while (*ae != '\0' && *ae != '"')
+ ae++;
+
+ *d = *ae = '\0';
+ v = &d[2];
+ GST_INFO (" : [%s][%s]", as, v);
+ if (!strncmp (as, "xmlns:", 6)) {
+ i = 0;
+ /* we need to rewrite known namespaces to what we use in
+ * tag_matches */
+ while (ns_match[i].ns_prefix) {
+ if (!strcmp (ns_match[i].ns_uri, v))
+ break;
+ i++;
+ }
+ if (ns_match[i].ns_prefix) {
+ if (strcmp (ns_map[i].original_ns, &as[6])) {
+ ns_map[i].gstreamer_ns = g_strdup (&as[6]);
+ }
+ }
+ } else {
+ XmpTag *xmp_tag = NULL;
+ /* FIXME: eventualy rewrite ns
+ * find ':'
+ * check if ns before ':' is in ns_map and ns_map[i].gstreamer_ns!=NULL
+ * do 2 stage filter in tag_matches
+ */
+ if (context_tag) {
+ GSList *iter;
+
+ for (iter = context_tag->children; iter;
+ iter = g_slist_next (iter)) {
+ XmpTag *child = iter->data;
+
+ GST_DEBUG ("Looking at child tag %s : %s", child->tag_name,
+ as);
+ if (strcmp (child->tag_name, as) == 0) {
+ xmp_tag = child;
+ break;
+ }
+ }
+
+ } else {
+ GST_LOG ("Looking for tag: %s", as);
+ _gst_xmp_tag_get_mapping_reverse (as, &xmp_tag);
+ }
+ if (xmp_tag) {
+ PendingXmpTag *ptag;
+
+ GST_DEBUG ("Found xmp tag: %s -> %s", xmp_tag->tag_name,
+ xmp_tag->gst_tag);
+
+ /* we shouldn't find a xmp structure here */
+ g_assert (xmp_tag->gst_tag != NULL);
+
+ ptag = g_slice_new (PendingXmpTag);
+ ptag->xmp_tag = xmp_tag;
+ ptag->str = g_strdup (v);
+
+ pending_tags = g_slist_append (pending_tags, ptag);
+ }
+ }
+ /* restore chars overwritten by '\0' */
+ *d = '=';
+ *ae = '"';
+ } else if (*ae == '\0' || *ae == ' ') {
+ /* end of attr/value pair */
+ as = &ae[1];
+ }
+ /* to next char if not eos */
+ if (*ae != '\0')
+ ae++;
+ }
+ } else {
+ /*
+ <dc:type><rdf:Bag><rdf:li>Image</rdf:li></rdf:Bag></dc:type>
+ <dc:creator><rdf:Seq><rdf:li/></rdf:Seq></dc:creator>
+ */
+ /* FIXME: eventualy rewrite ns */
+
+ /* skip rdf tags for now */
+ if (strncmp (part, "rdf:", 4)) {
+ /* if we're inside some struct, we look only on its children */
+ if (context_tag) {
+ GSList *iter;
+
+ /* check if this is the closing of the context */
+ if (part[0] == '/'
+ && strcmp (part + 1, context_tag->tag_name) == 0) {
+ GST_DEBUG ("Closing context tag %s", part);
+ context_tag = NULL;
+ } else {
+
+ for (iter = context_tag->children; iter;
+ iter = g_slist_next (iter)) {
+ XmpTag *child = iter->data;
+
+ GST_DEBUG ("Looking at child tag %s : %s", child->tag_name,
+ part);
+ if (strcmp (child->tag_name, part) == 0) {
+ last_xmp_tag = child;
+ break;
+ }
+ }
+ }
+
+ } else {
+ GST_LOG ("Looking for tag: %s", part);
+ _gst_xmp_tag_get_mapping_reverse (part, &last_xmp_tag);
+ if (last_xmp_tag && last_xmp_tag->type == GstXmpTagTypeStruct) {
+ context_tag = last_xmp_tag;
+ last_xmp_tag = NULL;
+ }
+ }
+ }
+ }
+ }
+ GST_LOG ("Next cycle");
+ /* next cycle */
+ ne++;
+ if (ne < xp2) {
+ if (*ne != '<')
+ in_tag = FALSE;
+ ns = ne;
+ pp = part;
+ }
+ } else {
+ while (ne < xp2 && *ne != '<') {
+ *pp++ = *ne;
+ ne++;
+ }
+ *pp = '\0';
+ /* create node */
+ /* {TXT, ns, (ne-ns)-1} */
+ if (ns[0] != '\n' && &ns[1] <= ne) {
+ /* only log non-newline nodes, we still have to parse them */
+ GST_INFO ("txt: %s", part);
+ if (last_xmp_tag) {
+ PendingXmpTag *ptag;
+
+ GST_DEBUG ("Found tag %s -> %s", last_xmp_tag->tag_name,
+ last_xmp_tag->gst_tag);
+
+ if (last_xmp_tag->type == GstXmpTagTypeStruct) {
+ g_assert (context_tag == NULL); /* we can't handle struct nesting currently */
+
+ context_tag = last_xmp_tag;
+ } else {
+ ptag = g_slice_new (PendingXmpTag);
+ ptag->xmp_tag = last_xmp_tag;
+ ptag->str = g_strdup (part);
+
+ pending_tags = g_slist_append (pending_tags, ptag);
+ }
+ }
+ }
+ /* next cycle */
+ in_tag = TRUE;
+ ns = ne;
+ pp = part;
+ }
+ }
+
+ while (pending_tags) {
+ PendingXmpTag *ptag = (PendingXmpTag *) pending_tags->data;
+
+ pending_tags = g_slist_delete_link (pending_tags, pending_tags);
+
+ read_one_tag (list, ptag->xmp_tag, ptag->str, &pending_tags);
+
+ g_free (ptag->str);
+ g_slice_free (PendingXmpTag, ptag);
+ }
+
+ GST_INFO ("xmp packet parsed, %d entries",
+ gst_structure_n_fields ((GstStructure *) list));
+
+ /* free resources */
+ i = 0;
+ while (ns_map[i].original_ns) {
+ g_free (ns_map[i].gstreamer_ns);
+ i++;
+ }
+ g_free (part);
+
+ gst_buffer_unmap (buffer, xps, len);
+
+ return list;
+
+ /* Errors */
+missing_header:
+ GST_WARNING ("malformed xmp packet header");
+ return NULL;
+missing_footer:
+ GST_WARNING ("malformed xmp packet footer");
+ return NULL;
+broken_xml:
+ GST_WARNING ("malformed xml tag: %s", part);
+ return NULL;
+}
+
+
+/* formatting */
+
+static void
+string_open_tag (GString * string, const char *tag)
+{
+ g_string_append_c (string, '<');
+ g_string_append (string, tag);
+ g_string_append_c (string, '>');
+}
+
+static void
+string_close_tag (GString * string, const char *tag)
+{
+ g_string_append (string, "</");
+ g_string_append (string, tag);
+ g_string_append (string, ">\n");
+}
+
+static char *
+gst_value_serialize_xmp (const GValue * value)
+{
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_STRING:
+ return g_markup_escape_text (g_value_get_string (value), -1);
+ case G_TYPE_INT:
+ return g_strdup_printf ("%d", g_value_get_int (value));
+ case G_TYPE_UINT:
+ return g_strdup_printf ("%u", g_value_get_uint (value));
+ case G_TYPE_DOUBLE:
+ return double_to_fraction_string (g_value_get_double (value));
+ default:
+ break;
+ }
+ /* put non-switchable types here */
+ if (G_VALUE_TYPE (value) == GST_TYPE_DATE) {
+ const GDate *date = gst_value_get_date (value);
+
+ return g_strdup_printf ("%04d-%02d-%02d",
+ (gint) g_date_get_year (date), (gint) g_date_get_month (date),
+ (gint) g_date_get_day (date));
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_DATE_TIME) {
+ gint year, month, day, hour, min, sec, microsec;
+ gfloat gmt_offset = 0;
+ gint gmt_offset_hour, gmt_offset_min;
+ GstDateTime *datetime = (GstDateTime *) g_value_get_boxed (value);
+
+ year = gst_date_time_get_year (datetime);
+ month = gst_date_time_get_month (datetime);
+ day = gst_date_time_get_day (datetime);
+ hour = gst_date_time_get_hour (datetime);
+ min = gst_date_time_get_minute (datetime);
+ sec = gst_date_time_get_second (datetime);
+ microsec = gst_date_time_get_microsecond (datetime);
+ gmt_offset = gst_date_time_get_time_zone_offset (datetime);
+ if (gmt_offset == 0) {
+ /* UTC */
+ return g_strdup_printf ("%04d-%02d-%02dT%02d:%02d:%02d.%06dZ",
+ year, month, day, hour, min, sec, microsec);
+ } else {
+ gmt_offset_hour = ABS (gmt_offset);
+ gmt_offset_min = (ABS (gmt_offset) - gmt_offset_hour) * 60;
+
+ return g_strdup_printf ("%04d-%02d-%02dT%02d:%02d:%02d.%06d%c%02d:%02d",
+ year, month, day, hour, min, sec, microsec,
+ gmt_offset >= 0 ? '+' : '-', gmt_offset_hour, gmt_offset_min);
+ }
+ } else {
+ return NULL;
+ }
+}
+
+static void
+write_one_tag (const GstTagList * list, XmpTag * xmp_tag, gpointer user_data)
+{
+ guint i = 0, ct;
+ XmpSerializationData *serialization_data = user_data;
+ GString *data = serialization_data->data;
+ char *s;
+
+ /* struct type handled differently */
+ if (xmp_tag->type == GstXmpTagTypeStruct ||
+ xmp_tag->type == GstXmpTagTypeCompound) {
+ GSList *iter;
+ gboolean use_it = FALSE;
+
+ /* check if any of the inner tags are present on the taglist */
+ for (iter = xmp_tag->children; iter && !use_it; iter = g_slist_next (iter)) {
+ XmpTag *child_tag = iter->data;
+
+ if (gst_tag_list_get_value_index (list, child_tag->gst_tag, 0) != NULL) {
+ use_it = TRUE;
+ break;
+ }
+ }
+
+ if (use_it) {
+ if (xmp_tag->tag_name)
+ string_open_tag (data, xmp_tag->tag_name);
+
+ if (xmp_tag->supertype) {
+ string_open_tag (data, xmp_tag_type_get_name (xmp_tag->supertype));
+ if (xmp_tag->parse_type) {
+ g_string_append (data, "<rdf:li rdf:parseType=\"");
+ g_string_append (data, xmp_tag->parse_type);
+ g_string_append_c (data, '"');
+ g_string_append_c (data, '>');
+ } else {
+ string_open_tag (data, "rdf:li");
+ }
+ }
+
+ /* now write it */
+ for (iter = xmp_tag->children; iter; iter = g_slist_next (iter)) {
+ write_one_tag (list, iter->data, user_data);
+ }
+
+ if (xmp_tag->supertype) {
+ string_close_tag (data, "rdf:li");
+ string_close_tag (data, xmp_tag_type_get_name (xmp_tag->supertype));
+ }
+
+ if (xmp_tag->tag_name)
+ string_close_tag (data, xmp_tag->tag_name);
+ }
+ return;
+ }
+
+ /* at this point we must have a gst_tag */
+ g_assert (xmp_tag->gst_tag);
+ if (gst_tag_list_get_value_index (list, xmp_tag->gst_tag, 0) == NULL)
+ return;
+
+ ct = gst_tag_list_get_tag_size (list, xmp_tag->gst_tag);
+ string_open_tag (data, xmp_tag->tag_name);
+
+ /* fast path for single valued tag */
+ if (ct == 1 || xmp_tag->type == GstXmpTagTypeSimple) {
+ if (xmp_tag->serialize) {
+ s = xmp_tag->serialize (gst_tag_list_get_value_index (list,
+ xmp_tag->gst_tag, 0));
+ } else {
+ s = gst_value_serialize_xmp (gst_tag_list_get_value_index (list,
+ xmp_tag->gst_tag, 0));
+ }
+ if (s) {
+ g_string_append (data, s);
+ g_free (s);
+ } else {
+ GST_WARNING ("unhandled type for %s to xmp", xmp_tag->gst_tag);
+ }
+ } else {
+ const gchar *typename;
+
+ typename = xmp_tag_type_get_name (xmp_tag->type);
+
+ string_open_tag (data, typename);
+ for (i = 0; i < ct; i++) {
+ GST_DEBUG ("mapping %s[%u/%u] to xmp", xmp_tag->gst_tag, i, ct);
+ if (xmp_tag->serialize) {
+ s = xmp_tag->serialize (gst_tag_list_get_value_index (list,
+ xmp_tag->gst_tag, i));
+ } else {
+ s = gst_value_serialize_xmp (gst_tag_list_get_value_index (list,
+ xmp_tag->gst_tag, i));
+ }
+ if (s) {
+ string_open_tag (data, "rdf:li");
+ g_string_append (data, s);
+ string_close_tag (data, "rdf:li");
+ g_free (s);
+ } else {
+ GST_WARNING ("unhandled type for %s to xmp", xmp_tag->gst_tag);
+ }
+ }
+ string_close_tag (data, typename);
+ }
+
+ string_close_tag (data, xmp_tag->tag_name);
+}
+
+/**
+ * gst_tag_list_to_xmp_buffer_full:
+ * @list: tags
+ * @read_only: does the container forbid inplace editing
+ * @schemas: %NULL terminated array of schemas to be used on serialization
+ *
+ * Formats a taglist as a xmp packet using only the selected
+ * schemas. An empty list (%NULL) means that all schemas should
+ * be used
+ *
+ * Returns: new buffer or %NULL, unref the buffer when done
+ *
+ * Since: 0.10.33
+ */
+GstBuffer *
+gst_tag_list_to_xmp_buffer_full (const GstTagList * list, gboolean read_only,
+ const gchar ** schemas)
+{
+ GstBuffer *buffer = NULL;
+ XmpSerializationData serialization_data;
+ GString *data;
+ guint i;
+ gsize bsize;
+ gpointer bdata;
+
+ serialization_data.data = g_string_sized_new (4096);
+ serialization_data.schemas = schemas;
+ data = serialization_data.data;
+
+ xmp_tags_initialize ();
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
+
+ /* xmp header */
+ g_string_append (data,
+ "<?xpacket begin=\"\xEF\xBB\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n");
+ g_string_append (data,
+ "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"GStreamer\">\n");
+ g_string_append (data,
+ "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"");
+ i = 0;
+ while (ns_match[i].ns_prefix) {
+ if (xmp_serialization_data_use_schema (&serialization_data,
+ ns_match[i].ns_prefix)) {
+ g_string_append_printf (data, " xmlns:%s=\"%s\"",
+ ns_match[i].ns_prefix, ns_match[i].ns_uri);
+ if (ns_match[i].extra_ns) {
+ g_string_append_printf (data, " %s", ns_match[i].extra_ns);
+ }
+ }
+ i++;
+ }
+ g_string_append (data, ">\n");
+ g_string_append (data, "<rdf:Description rdf:about=\"\">\n");
+
+ /* iterate the schemas */
+ if (schemas == NULL) {
+ /* use all schemas */
+ schemas = gst_tag_xmp_list_schemas ();
+ }
+ for (i = 0; schemas[i] != NULL; i++) {
+ GstXmpSchema *schema = _gst_xmp_get_schema (schemas[i]);
+ GHashTableIter iter;
+ gpointer key, value;
+
+ if (schema == NULL)
+ continue;
+
+ /* Iterate over the hashtable */
+ g_hash_table_iter_init (&iter, schema);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ write_one_tag (list, value, (gpointer) & serialization_data);
+ }
+ }
+
+ /* xmp footer */
+ g_string_append (data, "</rdf:Description>\n");
+ g_string_append (data, "</rdf:RDF>\n");
+ g_string_append (data, "</x:xmpmeta>\n");
+
+ if (!read_only) {
+ /* the xmp spec recommand to add 2-4KB padding for in-place editable xmp */
+ guint i;
+
+ for (i = 0; i < 32; i++) {
+ g_string_append (data, " " " "
+ " " " " "\n");
+ }
+ }
+ g_string_append_printf (data, "<?xpacket end=\"%c\"?>",
+ (read_only ? 'r' : 'w'));
+
+ bsize = data->len;
+ bdata = g_string_free (data, FALSE);
+
+ buffer = gst_buffer_new ();
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (0, bdata, g_free, bsize, 0, bsize));
+
+ return buffer;
+}
+
+/**
+ * gst_tag_list_to_xmp_buffer:
+ * @list: tags
+ * @read_only: does the container forbid inplace editing
+ *
+ * Formats a taglist as a xmp packet.
+ *
+ * Returns: new buffer or %NULL, unref the buffer when done
+ *
+ * Since: 0.10.29
+ */
+GstBuffer *
+gst_tag_list_to_xmp_buffer (const GstTagList * list, gboolean read_only)
+{
+ return gst_tag_list_to_xmp_buffer_full (list, read_only, NULL);
+}
+
+#undef gst_xmp_schema_lookup
+#undef gst_xmp_schema_insert
diff --git a/gst-libs/gst/tag/id3v2.c b/gst-libs/gst/tag/id3v2.c
new file mode 100644
index 0000000..f1f2e4a
--- /dev/null
+++ b/gst-libs/gst/tag/id3v2.c
@@ -0,0 +1,618 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/* Copyright 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * Copyright 2002,2003 Scott Wheeler <wheeler@kde.org> (portions from taglib)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/tag/tag.h>
+
+#include "id3v2.h"
+
+#define HANDLE_INVALID_SYNCSAFE
+
+static gboolean id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size);
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#define GST_CAT_DEFAULT id3v2_ensure_debug_category()
+
+GstDebugCategory *
+id3v2_ensure_debug_category (void)
+{
+ static gsize cat_gonce = 0;
+
+ if (g_once_init_enter (&cat_gonce)) {
+ gsize cat;
+
+ cat = (gsize) _gst_debug_category_new ("id3v2", 0, "ID3v2 tag parsing");
+
+ g_once_init_leave (&cat_gonce, cat);
+ }
+
+ return (GstDebugCategory *) cat_gonce;
+}
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+guint
+id3v2_read_synch_uint (const guint8 * data, guint size)
+{
+ gint i;
+ guint result = 0;
+ gint invalid = 0;
+
+ g_assert (size <= 4);
+
+ size--;
+ for (i = 0; i <= size; i++) {
+ invalid |= data[i] & 0x80;
+ result |= (data[i] & 0x7f) << ((size - i) * 7);
+ }
+
+#ifdef HANDLE_INVALID_SYNCSAFE
+ if (invalid) {
+ GST_WARNING ("Invalid synch-safe integer in ID3v2 frame "
+ "- using the actual value instead");
+ result = 0;
+ for (i = 0; i <= size; i++) {
+ result |= data[i] << ((size - i) * 8);
+ }
+ }
+#endif
+ return result;
+}
+
+/**
+ * gst_tag_get_id3v2_tag_size:
+ * @buffer: buffer holding ID3v2 tag (or at least the start of one)
+ *
+ * Determines size of an ID3v2 tag on buffer containing at least ID3v2 header,
+ * i.e. at least #GST_TAG_ID3V2_HEADER_SIZE (10) bytes;
+ *
+ * Returns: Size of tag, or 0 if header is invalid or too small.
+ *
+ * Since: 0.10.36
+ */
+guint
+gst_tag_get_id3v2_tag_size (GstBuffer * buffer)
+{
+ guint8 *data, flags;
+ gsize size;
+ guint result = 0;
+
+ g_return_val_if_fail (buffer != NULL, 0);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ if (size < ID3V2_HDR_SIZE)
+ goto too_small;
+
+ /* Check for 'ID3' string at start of buffer */
+ if (data[0] != 'I' || data[1] != 'D' || data[2] != '3')
+ goto no_tag;
+
+ /* Read the flags */
+ flags = data[5];
+
+ /* Read the size from the header */
+ result = id3v2_read_synch_uint (data + 6, 4);
+ if (result == 0)
+ goto empty;
+
+ result += ID3V2_HDR_SIZE;
+
+ /* Expand the read size to include a footer if there is one */
+ if ((flags & ID3V2_HDR_FLAG_FOOTER))
+ result += 10;
+
+ GST_DEBUG ("ID3v2 tag, size: %u bytes", result);
+
+done:
+ gst_buffer_unmap (buffer, data, size);
+
+ return result;
+
+too_small:
+ {
+ GST_DEBUG ("size too small");
+ goto done;
+ }
+no_tag:
+ {
+ GST_DEBUG ("No ID3v2 tag in data");
+ goto done;
+ }
+empty:
+ {
+ GST_DEBUG ("Empty tag size");
+ result = ID3V2_HDR_SIZE;
+ goto done;
+ }
+}
+
+guint8 *
+id3v2_ununsync_data (const guint8 * unsync_data, guint32 * size)
+{
+ const guint8 *end;
+ guint8 *out, *uu;
+ guint out_size;
+
+ uu = out = g_malloc (*size);
+
+ for (end = unsync_data + *size; unsync_data < end - 1; ++unsync_data, ++uu) {
+ *uu = *unsync_data;
+ if (G_UNLIKELY (*unsync_data == 0xff && *(unsync_data + 1) == 0x00))
+ ++unsync_data;
+ }
+
+ /* take care of last byte (if last two bytes weren't 0xff 0x00) */
+ if (unsync_data < end) {
+ *uu = *unsync_data;
+ ++uu;
+ }
+
+ out_size = uu - out;
+ GST_DEBUG ("size after un-unsyncing: %u (before: %u)", out_size, *size);
+
+ *size = out_size;
+ return out;
+}
+
+/**
+ * gst_tag_list_from_id3v2_tag:
+ * @buffer: buffer to convert
+ *
+ * Creates a new tag list that contains the information parsed out of a
+ * ID3 tag.
+ *
+ * Returns: A new #GstTagList with all tags that could be extracted from the
+ * given vorbiscomment buffer or NULL on error.
+ *
+ * Since: 0.10.36
+ */
+GstTagList *
+gst_tag_list_from_id3v2_tag (GstBuffer * buffer)
+{
+ guint8 *data, *uu_data = NULL;
+ guint read_size;
+ gsize size;
+ ID3TagsWorking work;
+ guint8 flags;
+ guint16 version;
+
+ read_size = gst_tag_get_id3v2_tag_size (buffer);
+
+ /* Ignore tag if it has no frames attached, but skip the header then */
+ if (read_size < ID3V2_HDR_SIZE)
+ return NULL;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ /* Read the version */
+ version = GST_READ_UINT16_BE (data + 3);
+
+ /* Read the flags */
+ flags = data[5];
+
+ /* Validate the version. At the moment, we only support up to 2.4.0 */
+ if (ID3V2_VER_MAJOR (version) > 4 || ID3V2_VER_MINOR (version) > 0)
+ goto wrong_version;
+
+ GST_DEBUG ("ID3v2 header flags: %s %s %s %s",
+ (flags & ID3V2_HDR_FLAG_UNSYNC) ? "UNSYNC" : "",
+ (flags & ID3V2_HDR_FLAG_EXTHDR) ? "EXTENDED_HEADER" : "",
+ (flags & ID3V2_HDR_FLAG_EXPERIMENTAL) ? "EXPERIMENTAL" : "",
+ (flags & ID3V2_HDR_FLAG_FOOTER) ? "FOOTER" : "");
+
+ /* This shouldn't really happen! Caller should have checked first */
+ if (size < read_size)
+ goto not_enough_data;
+
+ GST_DEBUG ("Reading ID3v2 tag with revision 2.%d.%d of size %u", version >> 8,
+ version & 0xff, read_size);
+
+ GST_MEMDUMP ("ID3v2 tag", data, read_size);
+
+ memset (&work, 0, sizeof (ID3TagsWorking));
+ work.buffer = buffer;
+ work.hdr.version = version;
+ work.hdr.size = read_size;
+ work.hdr.flags = flags;
+ work.hdr.frame_data = data + ID3V2_HDR_SIZE;
+ if (flags & ID3V2_HDR_FLAG_FOOTER)
+ work.hdr.frame_data_size = read_size - ID3V2_HDR_SIZE - 10;
+ else
+ work.hdr.frame_data_size = read_size - ID3V2_HDR_SIZE;
+
+ /* in v2.3 the frame sizes are not syncsafe, so the entire tag had to be
+ * unsynced. In v2.4 the frame sizes are syncsafe so it's just the frame
+ * data that needs un-unsyncing, but not the frame headers. */
+ if ((flags & ID3V2_HDR_FLAG_UNSYNC) != 0 && ID3V2_VER_MAJOR (version) <= 3) {
+ GST_DEBUG ("Un-unsyncing entire tag");
+ uu_data = id3v2_ununsync_data (work.hdr.frame_data,
+ &work.hdr.frame_data_size);
+ work.hdr.frame_data = uu_data;
+ GST_MEMDUMP ("ID3v2 tag (un-unsyced)", uu_data, work.hdr.frame_data_size);
+ }
+
+ id3v2_frames_to_tag_list (&work, work.hdr.frame_data_size);
+
+ g_free (uu_data);
+
+ gst_buffer_unmap (buffer, data, size);
+
+ return work.tags;
+
+ /* ERRORS */
+wrong_version:
+ {
+ GST_WARNING ("ID3v2 tag is from revision 2.%d.%d, "
+ "but decoder only supports 2.%d.%d. Ignoring as per spec.",
+ version >> 8, version & 0xff, ID3V2_VERSION >> 8, ID3V2_VERSION & 0xff);
+ gst_buffer_unmap (buffer, data, size);
+ return NULL;
+ }
+not_enough_data:
+ {
+ GST_DEBUG
+ ("Found ID3v2 tag with revision 2.%d.%d - need %u more bytes to read",
+ version >> 8, version & 0xff, (guint) (read_size - size));
+ gst_buffer_unmap (buffer, data, size);
+ return NULL;
+ }
+}
+
+static guint
+id3v2_frame_hdr_size (guint id3v2ver)
+{
+ /* ID3v2 < 2.3.0 only had 6 byte header */
+ switch (ID3V2_VER_MAJOR (id3v2ver)) {
+ case 0:
+ case 1:
+ case 2:
+ return 6;
+ case 3:
+ case 4:
+ default:
+ return 10;
+ }
+}
+
+static const gchar obsolete_frame_ids[][5] = {
+ {"CRM"}, {"EQU"}, {"LNK"}, {"RVA"}, {"TIM"}, {"TSI"}, /* From 2.2 */
+ {"EQUA"}, {"RVAD"}, {"TIME"}, {"TRDA"}, {"TSIZ"} /* From 2.3 */
+};
+
+static const struct ID3v2FrameIDConvert
+{
+ const gchar orig[5];
+ const gchar new[5];
+} frame_id_conversions[] = {
+ /* 2.3.x frames */
+ {
+ "TORY", "TDOR"}, {
+ "TYER", "TDRC"},
+ /* 2.2.x frames */
+ {
+ "BUF", "RBUF"}, {
+ "CNT", "PCNT"}, {
+ "COM", "COMM"}, {
+ "CRA", "AENC"}, {
+ "ETC", "ETCO"}, {
+ "GEO", "GEOB"}, {
+ "IPL", "TIPL"}, {
+ "MCI", "MCDI"}, {
+ "MLL", "MLLT"}, {
+ "PIC", "APIC"}, {
+ "POP", "POPM"}, {
+ "REV", "RVRB"}, {
+ "SLT", "SYLT"}, {
+ "STC", "SYTC"}, {
+ "TAL", "TALB"}, {
+ "TBP", "TBPM"}, {
+ "TCM", "TCOM"}, {
+ "TCO", "TCON"}, {
+ "TCR", "TCOP"}, {
+ "TDA", "TDAT"}, { /* obsolete, but we need to parse it anyway */
+ "TDY", "TDLY"}, {
+ "TEN", "TENC"}, {
+ "TFT", "TFLT"}, {
+ "TKE", "TKEY"}, {
+ "TLA", "TLAN"}, {
+ "TLE", "TLEN"}, {
+ "TMT", "TMED"}, {
+ "TOA", "TOAL"}, {
+ "TOF", "TOFN"}, {
+ "TOL", "TOLY"}, {
+ "TOR", "TDOR"}, {
+ "TOT", "TOAL"}, {
+ "TP1", "TPE1"}, {
+ "TP2", "TPE2"}, {
+ "TP3", "TPE3"}, {
+ "TP4", "TPE4"}, {
+ "TPA", "TPOS"}, {
+ "TPB", "TPUB"}, {
+ "TRC", "TSRC"}, {
+ "TRD", "TDRC"}, {
+ "TRK", "TRCK"}, {
+ "TSS", "TSSE"}, {
+ "TT1", "TIT1"}, {
+ "TT2", "TIT2"}, {
+ "TT3", "TIT3"}, {
+ "TXT", "TOLY"}, {
+ "TXX", "TXXX"}, {
+ "TYE", "TDRC"}, {
+ "UFI", "UFID"}, {
+ "ULT", "USLT"}, {
+ "WAF", "WOAF"}, {
+ "WAR", "WOAR"}, {
+ "WAS", "WOAS"}, {
+ "WCM", "WCOM"}, {
+ "WCP", "WCOP"}, {
+ "WPB", "WPUB"}, {
+ "WXX", "WXXX"}
+};
+
+static gboolean
+convert_fid_to_v240 (gchar * frame_id)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (obsolete_frame_ids); ++i) {
+ if (strncmp (frame_id, obsolete_frame_ids[i], 5) == 0)
+ return TRUE;
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (frame_id_conversions); ++i) {
+ if (strncmp (frame_id, frame_id_conversions[i].orig, 5) == 0) {
+ strcpy (frame_id, frame_id_conversions[i].new);
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+
+/* add unknown or unhandled ID3v2 frames to the taglist as binary blobs */
+static void
+id3v2_add_id3v2_frame_blob_to_taglist (ID3TagsWorking * work, guint size)
+{
+ GstBuffer *blob;
+ guint8 *frame_data;
+#if 0
+ GstCaps *caps;
+ gchar *media_type;
+#endif
+ guint frame_size, header_size;
+ guint i;
+
+ switch (ID3V2_VER_MAJOR (work->hdr.version)) {
+ case 1:
+ case 2:
+ header_size = 3 + 3;
+ break;
+ case 3:
+ case 4:
+ header_size = 4 + 4 + 2;
+ break;
+ default:
+ g_return_if_reached ();
+ }
+
+ frame_data = work->hdr.frame_data - header_size;
+ frame_size = size + header_size;
+
+ blob = gst_buffer_new_and_alloc (frame_size);
+ gst_buffer_fill (blob, 0, frame_data, frame_size);
+
+ /* Sanitize frame id */
+ for (i = 0; i < 4; i++) {
+ if (!g_ascii_isalnum (frame_data[i]))
+ frame_data[i] = '_';
+ }
+
+#if 0
+ media_type = g_strdup_printf ("application/x-gst-id3v2-%c%c%c%c-frame",
+ g_ascii_tolower (frame_data[0]), g_ascii_tolower (frame_data[1]),
+ g_ascii_tolower (frame_data[2]), g_ascii_tolower (frame_data[3]));
+ caps = gst_caps_new_simple (media_type, "version", G_TYPE_INT,
+ (gint) ID3V2_VER_MAJOR (work->hdr.version), NULL);
+ gst_buffer_set_caps (blob, caps);
+ gst_caps_unref (caps);
+ g_free (media_type);
+#endif
+
+ /* gst_util_dump_mem (GST_BUFFER_DATA (blob), GST_BUFFER_SIZE (blob)); */
+
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_ID3V2_FRAME, blob, NULL);
+ gst_buffer_unref (blob);
+}
+
+static gboolean
+id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size)
+{
+ guint frame_hdr_size;
+
+ /* Extended header if present */
+ if (work->hdr.flags & ID3V2_HDR_FLAG_EXTHDR) {
+ work->hdr.ext_hdr_size = id3v2_read_synch_uint (work->hdr.frame_data, 4);
+ if (work->hdr.ext_hdr_size < 6 ||
+ (work->hdr.ext_hdr_size) > work->hdr.frame_data_size) {
+ GST_DEBUG ("Invalid extended header. Broken tag");
+ return FALSE;
+ }
+ work->hdr.ext_flag_bytes = work->hdr.frame_data[4];
+ if (5 + work->hdr.ext_flag_bytes > work->hdr.frame_data_size) {
+ GST_DEBUG
+ ("Tag claims extended header, but doesn't have enough bytes. Broken tag");
+ return FALSE;
+ }
+
+ work->hdr.ext_flag_data = work->hdr.frame_data + 5;
+ work->hdr.frame_data += work->hdr.ext_hdr_size;
+ work->hdr.frame_data_size -= work->hdr.ext_hdr_size;
+ }
+
+ frame_hdr_size = id3v2_frame_hdr_size (work->hdr.version);
+ if (work->hdr.frame_data_size <= frame_hdr_size) {
+ GST_DEBUG ("Tag has no data frames. Broken tag");
+ return FALSE; /* Must have at least one frame */
+ }
+
+ work->tags = gst_tag_list_new ();
+
+ while (work->hdr.frame_data_size > frame_hdr_size) {
+ guint frame_size = 0;
+ gchar frame_id[5] = "";
+ guint16 frame_flags = 0x0;
+ gboolean obsolete_id = FALSE;
+ gboolean read_synch_size = TRUE;
+ guint i;
+
+ /* Read the header */
+ switch (ID3V2_VER_MAJOR (work->hdr.version)) {
+ case 0:
+ case 1:
+ case 2:
+ frame_id[0] = work->hdr.frame_data[0];
+ frame_id[1] = work->hdr.frame_data[1];
+ frame_id[2] = work->hdr.frame_data[2];
+ frame_id[3] = 0;
+ frame_id[4] = 0;
+ obsolete_id = convert_fid_to_v240 (frame_id);
+
+ /* 3 byte non-synchsafe size */
+ frame_size = work->hdr.frame_data[3] << 16 |
+ work->hdr.frame_data[4] << 8 | work->hdr.frame_data[5];
+ frame_flags = 0;
+ break;
+ case 3:
+ read_synch_size = FALSE; /* 2.3 frame size is not synch-safe */
+ case 4:
+ default:
+ frame_id[0] = work->hdr.frame_data[0];
+ frame_id[1] = work->hdr.frame_data[1];
+ frame_id[2] = work->hdr.frame_data[2];
+ frame_id[3] = work->hdr.frame_data[3];
+ frame_id[4] = 0;
+ if (read_synch_size)
+ frame_size = id3v2_read_synch_uint (work->hdr.frame_data + 4, 4);
+ else
+ frame_size = GST_READ_UINT32_BE (work->hdr.frame_data + 4);
+
+ frame_flags = GST_READ_UINT16_BE (work->hdr.frame_data + 8);
+
+ if (ID3V2_VER_MAJOR (work->hdr.version) == 3) {
+ frame_flags &= ID3V2_3_FRAME_FLAGS_MASK;
+ obsolete_id = convert_fid_to_v240 (frame_id);
+ if (obsolete_id)
+ GST_DEBUG ("Ignoring v2.3 frame %s", frame_id);
+ }
+ break;
+ }
+
+ work->hdr.frame_data += frame_hdr_size;
+ work->hdr.frame_data_size -= frame_hdr_size;
+
+ if (frame_size > work->hdr.frame_data_size || strcmp (frame_id, "") == 0)
+ break; /* No more frames to read */
+
+ /* Sanitize frame id */
+ switch (ID3V2_VER_MAJOR (work->hdr.version)) {
+ case 0:
+ case 1:
+ case 2:
+ for (i = 0; i < 3; i++) {
+ if (!g_ascii_isalnum (frame_id[i]))
+ frame_id[i] = '_';
+ }
+ break;
+ default:
+ for (i = 0; i < 4; i++) {
+ if (!g_ascii_isalnum (frame_id[i]))
+ frame_id[i] = '_';
+ }
+ }
+#if 1
+#if 0
+ GST_LOG
+ ("Frame @ %ld (0x%02lx) id %s size %u, next=%ld (0x%02lx) obsolete=%d",
+ (glong) (work->hdr.frame_data - start),
+ (glong) (work->hdr.frame_data - start), frame_id, frame_size,
+ (glong) (work->hdr.frame_data + frame_hdr_size + frame_size - start),
+ (glong) (work->hdr.frame_data + frame_hdr_size + frame_size - start),
+ obsolete_id);
+#endif
+#define flag_string(flag,str) \
+ ((frame_flags & (flag)) ? (str) : "")
+ GST_LOG ("Frame header flags: 0x%04x %s %s %s %s %s %s %s", frame_flags,
+ flag_string (ID3V2_FRAME_STATUS_FRAME_ALTER_PRESERVE, "ALTER_PRESERVE"),
+ flag_string (ID3V2_FRAME_STATUS_READONLY, "READONLY"),
+ flag_string (ID3V2_FRAME_FORMAT_GROUPING_ID, "GROUPING_ID"),
+ flag_string (ID3V2_FRAME_FORMAT_COMPRESSION, "COMPRESSION"),
+ flag_string (ID3V2_FRAME_FORMAT_ENCRYPTION, "ENCRYPTION"),
+ flag_string (ID3V2_FRAME_FORMAT_UNSYNCHRONISATION, "UNSYNC"),
+ flag_string (ID3V2_FRAME_FORMAT_DATA_LENGTH_INDICATOR, "LENGTH_IND"));
+#undef flag_str
+#endif
+
+ if (!obsolete_id) {
+ /* Now, read, decompress etc the contents of the frame
+ * into a TagList entry */
+ work->cur_frame_size = frame_size;
+ work->frame_id = frame_id;
+ work->frame_flags = frame_flags;
+
+ if (id3v2_parse_frame (work)) {
+ GST_LOG ("Extracted frame with id %s", frame_id);
+ } else {
+ GST_LOG ("Failed to extract frame with id %s", frame_id);
+ id3v2_add_id3v2_frame_blob_to_taglist (work, frame_size);
+ }
+ }
+ work->hdr.frame_data += frame_size;
+ work->hdr.frame_data_size -= frame_size;
+ }
+
+ if (gst_structure_n_fields (GST_STRUCTURE (work->tags)) == 0) {
+ GST_DEBUG ("Could not extract any frames from tag. Broken or empty tag");
+ gst_tag_list_free (work->tags);
+ work->tags = NULL;
+ return FALSE;
+ }
+
+ /* Set day/month now if they were in a separate (obsolete) TDAT frame */
+ if (work->pending_day != 0 && work->pending_month != 0) {
+ GDate *date = NULL;
+
+ if (gst_tag_list_get_date (work->tags, GST_TAG_DATE, &date)) {
+ g_date_set_day (date, work->pending_day);
+ g_date_set_month (date, work->pending_month);
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE,
+ date, NULL);
+ g_date_free (date);
+ }
+ }
+
+ return TRUE;
+}
diff --git a/gst-libs/gst/tag/id3v2.h b/gst-libs/gst/tag/id3v2.h
new file mode 100644
index 0000000..fd21bb6
--- /dev/null
+++ b/gst-libs/gst/tag/id3v2.h
@@ -0,0 +1,120 @@
+/* Copyright 2005 Jan Schmidt <thaytan@mad.scientist.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 __ID3TAGS_H__
+#define __ID3TAGS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define ID3V2_MARK_SIZE 3
+#define ID3V2_HDR_SIZE GST_TAG_ID3V2_HEADER_SIZE
+
+/* From id3v2.c */
+guint id3v2_read_synch_uint (const guint8 * data, guint size);
+
+/* Things shared by id3tags.c and id3v2frames.c */
+#define ID3V2_VERSION 0x0400
+#define ID3V2_VER_MAJOR(v) ((v) >> 8)
+#define ID3V2_VER_MINOR(v) ((v) & 0xff)
+
+typedef struct {
+ guint16 version;
+ guint8 flags;
+ guint32 size;
+
+ guint8 *frame_data;
+ guint32 frame_data_size;
+
+ guint32 ext_hdr_size;
+ guint8 ext_flag_bytes;
+ guint8 *ext_flag_data;
+} ID3v2Header;
+
+typedef struct {
+ ID3v2Header hdr;
+
+ GstBuffer *buffer;
+ GstTagList *tags;
+
+ /* Current frame decoding */
+ guint cur_frame_size;
+ gchar *frame_id;
+ guint16 frame_flags;
+
+ guint8 *parse_data;
+ guint parse_size;
+
+ /* To collect day/month from obsolete TDAT frame if it exists */
+ guint pending_month;
+ guint pending_day;
+} ID3TagsWorking;
+
+enum {
+ ID3V2_HDR_FLAG_UNSYNC = 0x80,
+ ID3V2_HDR_FLAG_EXTHDR = 0x40,
+ ID3V2_HDR_FLAG_EXPERIMENTAL = 0x20,
+ ID3V2_HDR_FLAG_FOOTER = 0x10
+};
+
+enum {
+ ID3V2_EXT_FLAG_UPDATE = 0x80,
+ ID3V2_EXT_FLAG_CRC = 0x40,
+ ID3V2_EXT_FLAG_RESTRICTED = 0x20
+};
+
+enum {
+ ID3V2_FRAME_STATUS_FRAME_ALTER_PRESERVE = 0x4000,
+ ID3V2_FRAME_STATUS_FILE_ALTER_PRESERVE = 0x2000,
+ ID3V2_FRAME_STATUS_READONLY = 0x1000,
+ ID3V2_FRAME_FORMAT_GROUPING_ID = 0x0040,
+ ID3V2_FRAME_FORMAT_COMPRESSION = 0x0008,
+ ID3V2_FRAME_FORMAT_ENCRYPTION = 0x0004,
+ ID3V2_FRAME_FORMAT_UNSYNCHRONISATION = 0x0002,
+ ID3V2_FRAME_FORMAT_DATA_LENGTH_INDICATOR = 0x0001
+};
+
+#define ID3V2_3_FRAME_FLAGS_MASK \
+ (ID3V2_FRAME_STATUS_FRAME_ALTER_PRESERVE | \
+ ID3V2_FRAME_STATUS_FILE_ALTER_PRESERVE | \
+ ID3V2_FRAME_STATUS_READONLY | \
+ ID3V2_FRAME_FORMAT_GROUPING_ID | \
+ ID3V2_FRAME_FORMAT_COMPRESSION | \
+ ID3V2_FRAME_FORMAT_ENCRYPTION)
+
+/* FIXME 0.11: remove 'private' bit from GST_TAG_ID3V2_FRAME */
+/**
+ * GST_TAG_ID3V2_FRAME:
+ *
+ * Contains a single unprocessed ID3v2 frame. (buffer)
+ *
+ * (Not public API for now)
+ */
+#define GST_TAG_ID3V2_FRAME "private-id3v2-frame"
+
+/* From id3v2frames.c */
+gboolean id3v2_parse_frame (ID3TagsWorking *work);
+
+guint8 * id3v2_ununsync_data (const guint8 * unsync_data, guint32 * size);
+
+GstDebugCategory * id3v2_ensure_debug_category (void);
+
+G_END_DECLS
+
+#endif
diff --git a/gst-libs/gst/tag/id3v2frames.c b/gst-libs/gst/tag/id3v2frames.c
new file mode 100644
index 0000000..78aa80e
--- /dev/null
+++ b/gst-libs/gst/tag/id3v2frames.c
@@ -0,0 +1,1168 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/* Copyright 2006-2008 Tim-Philipp Müller <tim centricular net>
+ * Copyright 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * Copyright 2002,2003 Scott Wheeler <wheeler@kde.org> (portions from taglib)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gst/tag/tag.h>
+#include <gst/base/gsttypefindhelper.h>
+
+#ifdef HAVE_ZLIB
+#include <zlib.h>
+#endif
+
+#include "id3v2.h"
+
+#ifndef GST_DISABLE_GST_DEBUG
+#define GST_CAT_DEFAULT id3v2_ensure_debug_category()
+#endif
+
+static gboolean parse_comment_frame (ID3TagsWorking * work);
+static gchar *parse_url_link_frame (ID3TagsWorking * work,
+ const gchar ** tag_name);
+static GArray *parse_text_identification_frame (ID3TagsWorking * work);
+static gchar *parse_user_text_identification_frame (ID3TagsWorking * work,
+ const gchar ** tag_name);
+static gchar *parse_unique_file_identifier (ID3TagsWorking * work,
+ const gchar ** tag_name);
+static gboolean parse_relative_volume_adjustment_two (ID3TagsWorking * work);
+static void parse_obsolete_tdat_frame (ID3TagsWorking * work);
+static gboolean id3v2_tag_to_taglist (ID3TagsWorking * work,
+ const gchar * tag_name, const gchar * tag_str);
+/* Parse a single string into an array of gchar* */
+static void parse_split_strings (guint8 encoding, gchar * data, gint data_size,
+ GArray ** out_fields);
+static void free_tag_strings (GArray * fields);
+static gboolean
+id3v2_genre_fields_to_taglist (ID3TagsWorking * work, const gchar * tag_name,
+ GArray * tag_fields);
+static gboolean parse_picture_frame (ID3TagsWorking * work);
+
+#define ID3V2_ENCODING_ISO8859 0x00
+#define ID3V2_ENCODING_UTF16 0x01
+#define ID3V2_ENCODING_UTF16BE 0x02
+#define ID3V2_ENCODING_UTF8 0x03
+
+gboolean
+id3v2_parse_frame (ID3TagsWorking * work)
+{
+ const gchar *tag_name;
+ gboolean result = FALSE;
+ gint i;
+ guint8 *frame_data = work->hdr.frame_data;
+ guint frame_data_size = work->cur_frame_size;
+ gchar *tag_str = NULL;
+ GArray *tag_fields = NULL;
+ guint8 *uu_data = NULL;
+
+#ifdef HAVE_ZLIB
+ guint8 *uncompressed_data = NULL;
+#endif
+
+ /* Check that the frame id is valid */
+ for (i = 0; i < 5 && work->frame_id[i] != '\0'; i++) {
+ if (!g_ascii_isalnum (work->frame_id[i])) {
+ GST_DEBUG ("Encountered invalid frame_id");
+ return FALSE;
+ }
+ }
+
+ /* Can't handle encrypted frames right now (in case we ever do, we'll have
+ * to do the decryption after the un-unsynchronisation and decompression,
+ * not here) */
+ if (work->frame_flags & ID3V2_FRAME_FORMAT_ENCRYPTION) {
+ GST_WARNING ("Encrypted frames are not supported");
+ return FALSE;
+ }
+
+ tag_name = gst_tag_from_id3_tag (work->frame_id);
+ if (tag_name == NULL &&
+ strncmp (work->frame_id, "RVA2", 4) != 0 &&
+ strncmp (work->frame_id, "TXXX", 4) != 0 &&
+ strncmp (work->frame_id, "TDAT", 4) != 0 &&
+ strncmp (work->frame_id, "UFID", 4) != 0) {
+ return FALSE;
+ }
+
+ if (work->frame_flags & (ID3V2_FRAME_FORMAT_COMPRESSION |
+ ID3V2_FRAME_FORMAT_DATA_LENGTH_INDICATOR)) {
+ if (work->hdr.frame_data_size <= 4)
+ return FALSE;
+ if (ID3V2_VER_MAJOR (work->hdr.version) == 3) {
+ work->parse_size = GST_READ_UINT32_BE (frame_data);
+ } else {
+ work->parse_size = id3v2_read_synch_uint (frame_data, 4);
+ }
+ frame_data += 4;
+ frame_data_size -= 4;
+ GST_LOG ("Un-unsynced data size %d (of %d)", work->parse_size,
+ frame_data_size);
+ if (work->parse_size > frame_data_size) {
+ GST_WARNING ("ID3v2 frame %s data has invalid size %d (>%d)",
+ work->frame_id, work->parse_size, frame_data_size);
+ return FALSE;
+ }
+ }
+
+ /* in v2.3 the frame sizes are not syncsafe, so the entire tag had to be
+ * unsynced. In v2.4 the frame sizes are syncsafe so it's just the frame
+ * data that needs un-unsyncing, but not the frame headers. */
+ if (ID3V2_VER_MAJOR (work->hdr.version) == 4) {
+ if ((work->hdr.flags & ID3V2_HDR_FLAG_UNSYNC) != 0 ||
+ ((work->frame_flags & ID3V2_FRAME_FORMAT_UNSYNCHRONISATION) != 0)) {
+ GST_DEBUG ("Un-unsyncing frame %s", work->frame_id);
+ uu_data = id3v2_ununsync_data (frame_data, &frame_data_size);
+ frame_data = uu_data;
+ GST_MEMDUMP ("ID3v2 frame (un-unsyced)", frame_data, frame_data_size);
+ }
+ }
+
+ work->parse_size = frame_data_size;
+
+ if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION) {
+#ifdef HAVE_ZLIB
+ uLongf destSize = work->parse_size;
+ Bytef *dest, *src;
+
+ uncompressed_data = g_malloc (work->parse_size);
+
+ dest = (Bytef *) uncompressed_data;
+ src = (Bytef *) frame_data;
+
+ if (uncompress (dest, &destSize, src, frame_data_size) != Z_OK) {
+ g_free (uncompressed_data);
+ g_free (uu_data);
+ return FALSE;
+ }
+ if (destSize != work->parse_size) {
+ GST_WARNING
+ ("Decompressing ID3v2 frame %s did not produce expected size %d bytes (got %lu)",
+ tag_name, work->parse_size, destSize);
+ g_free (uncompressed_data);
+ g_free (uu_data);
+ return FALSE;
+ }
+ work->parse_data = uncompressed_data;
+#else
+ GST_WARNING ("Compressed ID3v2 tag frame could not be decompressed, because"
+ " libgsttag-" GST_MAJORMINOR " was compiled without zlib support");
+ g_free (uu_data);
+ return FALSE;
+#endif
+ } else {
+ work->parse_data = frame_data;
+ }
+
+ if (work->frame_id[0] == 'T') {
+ if (strcmp (work->frame_id, "TDAT") == 0) {
+ parse_obsolete_tdat_frame (work);
+ result = TRUE;
+ } else if (strcmp (work->frame_id, "TXXX") == 0) {
+ /* Handle user text frame */
+ tag_str = parse_user_text_identification_frame (work, &tag_name);
+ } else {
+ /* Text identification frame */
+ tag_fields = parse_text_identification_frame (work);
+ }
+ } else if (work->frame_id[0] == 'W' && strcmp (work->frame_id, "WXXX") != 0) {
+ /* URL link frame: ISO-8859-1 encoded, one frame per tag */
+ tag_str = parse_url_link_frame (work, &tag_name);
+ } else if (!strcmp (work->frame_id, "COMM")) {
+ /* Comment */
+ result = parse_comment_frame (work);
+ } else if (!strcmp (work->frame_id, "APIC")) {
+ /* Attached picture */
+ result = parse_picture_frame (work);
+ } else if (!strcmp (work->frame_id, "RVA2")) {
+ /* Relative volume */
+ result = parse_relative_volume_adjustment_two (work);
+ } else if (!strcmp (work->frame_id, "UFID")) {
+ /* Unique file identifier */
+ tag_str = parse_unique_file_identifier (work, &tag_name);
+ }
+#ifdef HAVE_ZLIB
+ if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION) {
+ g_free (uncompressed_data);
+ uncompressed_data = NULL;
+ work->parse_data = frame_data;
+ }
+#endif
+
+ if (tag_str != NULL) {
+ /* g_print ("Tag %s value %s\n", tag_name, tag_str); */
+ result = id3v2_tag_to_taglist (work, tag_name, tag_str);
+ g_free (tag_str);
+ }
+ if (tag_fields != NULL) {
+ if (strcmp (work->frame_id, "TCON") == 0) {
+ /* Genre strings need special treatment */
+ result |= id3v2_genre_fields_to_taglist (work, tag_name, tag_fields);
+ } else {
+ gint t;
+
+ for (t = 0; t < tag_fields->len; t++) {
+ tag_str = g_array_index (tag_fields, gchar *, t);
+ if (tag_str != NULL && tag_str[0] != '\0')
+ result |= id3v2_tag_to_taglist (work, tag_name, tag_str);
+ }
+ }
+ free_tag_strings (tag_fields);
+ }
+
+ g_free (uu_data);
+
+ return result;
+}
+
+static gboolean
+parse_comment_frame (ID3TagsWorking * work)
+{
+ guint dummy;
+ guint8 encoding;
+ gchar language[4];
+ GArray *fields = NULL;
+ gchar *description, *text;
+
+ if (work->parse_size < 6)
+ return FALSE;
+
+ encoding = work->parse_data[0];
+ language[0] = g_ascii_tolower (work->parse_data[1]);
+ language[1] = g_ascii_tolower (work->parse_data[2]);
+ language[2] = g_ascii_tolower (work->parse_data[3]);
+ language[3] = '\0';
+
+ parse_split_strings (encoding, (gchar *) work->parse_data + 4,
+ work->parse_size - 4, &fields);
+
+ if (fields == NULL || fields->len < 2) {
+ GST_WARNING ("Failed to decode comment frame");
+ goto fail;
+ }
+ description = g_array_index (fields, gchar *, 0);
+ text = g_array_index (fields, gchar *, 1);
+
+ if (!g_utf8_validate (text, -1, NULL)) {
+ GST_WARNING ("Converted string is not valid utf-8");
+ goto fail;
+ }
+
+ /* skip our own dummy descriptions (from id3v2mux) */
+ if (strlen (description) > 0 && g_utf8_validate (description, -1, NULL) &&
+ sscanf (description, "c%u", &dummy) != 1) {
+ gchar *s;
+
+ /* must be either an ISO-639-1 or ISO-639-2 language code */
+ if (language[0] != '\0' &&
+ g_ascii_isalpha (language[0]) &&
+ g_ascii_isalpha (language[1]) &&
+ (g_ascii_isalpha (language[2]) || language[2] == '\0')) {
+ const gchar *lang_code;
+
+ /* prefer two-letter ISO 639-1 code if we have a mapping */
+ lang_code = gst_tag_get_language_code (language);
+ s = g_strdup_printf ("%s[%s]=%s", description,
+ (lang_code) ? lang_code : language, text);
+ } else {
+ s = g_strdup_printf ("%s=%s", description, text);
+ }
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_EXTENDED_COMMENT, s, NULL);
+ g_free (s);
+ } else if (text != NULL && *text != '\0') {
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_COMMENT, text, NULL);
+ } else {
+ goto fail;
+ }
+
+ free_tag_strings (fields);
+ return TRUE;
+
+fail:
+ {
+ GST_WARNING ("failed to parse COMM frame");
+ free_tag_strings (fields);
+ return FALSE;
+ }
+}
+
+static GArray *
+parse_text_identification_frame (ID3TagsWorking * work)
+{
+ guchar encoding;
+ GArray *fields = NULL;
+
+ if (work->parse_size < 2)
+ return NULL;
+
+ encoding = work->parse_data[0];
+ parse_split_strings (encoding, (gchar *) work->parse_data + 1,
+ work->parse_size - 1, &fields);
+ if (fields) {
+ if (fields->len > 0) {
+ GST_LOG ("Read %d fields from Text ID frame of size %d with encoding %d"
+ ". First is '%s'", fields->len, work->parse_size - 1, encoding,
+ g_array_index (fields, gchar *, 0));
+ } else {
+ GST_LOG ("Read 0 fields from Text ID frame of size %d with encoding %d",
+ work->parse_size - 1, encoding);
+ }
+ }
+
+ return fields;
+}
+
+static gboolean
+link_is_known_license (const gchar * url)
+{
+ return g_str_has_prefix (url, "http://creativecommons.org/licenses/");
+}
+
+static gchar *
+parse_url_link_frame (ID3TagsWorking * work, const gchar ** tag_name)
+{
+ gsize len;
+ gchar *nul, *data, *link;
+
+ *tag_name = NULL;
+
+ if (work->parse_size == 0)
+ return NULL;
+
+ data = (gchar *) work->parse_data;
+ /* if there's more data then the string is long, we only want to parse the
+ * data up to the terminating zero to g_convert and ignore the rest, as
+ * per spec */
+ nul = memchr (data, '\0', work->parse_size);
+ if (nul != NULL) {
+ len = (gsize) (nul - data);
+ } else {
+ len = work->parse_size;
+ }
+
+ link = g_convert (data, len, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+
+ if (link == NULL || !gst_uri_is_valid (link)) {
+ GST_DEBUG ("Invalid URI in %s frame: %s", work->frame_id,
+ GST_STR_NULL (link));
+ g_free (link);
+ return NULL;
+ }
+
+ /* we don't know if it's a link to a page that explains the copyright
+ * situation, or a link that points to/represents a license, the ID3 spec
+ * does not separate those two things; for now only put known license URIs
+ * into GST_TAG_LICENSE_URI and everything else into GST_TAG_COPYRIGHT_URI */
+ if (strcmp (work->frame_id, "WCOP") == 0) {
+ if (link_is_known_license (link))
+ *tag_name = GST_TAG_LICENSE_URI;
+ else
+ *tag_name = GST_TAG_COPYRIGHT_URI;
+ } else if (strcmp (work->frame_id, "WOAF") == 0) {
+ /* can't be bothered to create a CONTACT_URI tag for this, so let's just
+ * put into into GST_TAG_CONTACT, which is where it ends up when reading
+ * the info from vorbis comments as well */
+ *tag_name = GST_TAG_CONTACT;
+ }
+
+ return link;
+}
+
+
+static gchar *
+parse_user_text_identification_frame (ID3TagsWorking * work,
+ const gchar ** tag_name)
+{
+ gchar *ret;
+ guchar encoding;
+ GArray *fields = NULL;
+
+ *tag_name = NULL;
+
+ if (work->parse_size < 2)
+ return NULL;
+
+ encoding = work->parse_data[0];
+
+ parse_split_strings (encoding, (gchar *) work->parse_data + 1,
+ work->parse_size - 1, &fields);
+
+ if (fields == NULL)
+ return NULL;
+
+ if (fields->len != 2) {
+ GST_WARNING ("Expected 2 fields in TXXX frame, but got %d", fields->len);
+ free_tag_strings (fields);
+ return NULL;
+ }
+
+ *tag_name =
+ gst_tag_from_id3_user_tag ("TXXX", g_array_index (fields, gchar *, 0));
+
+ GST_LOG ("TXXX frame of size %d. Mapped descriptor '%s' to GStreamer tag %s",
+ work->parse_size - 1, g_array_index (fields, gchar *, 0),
+ GST_STR_NULL (*tag_name));
+
+ if (*tag_name) {
+ ret = g_strdup (g_array_index (fields, gchar *, 1));
+ /* GST_LOG ("%s = %s", *tag_name, GST_STR_NULL (ret)); */
+ } else {
+ ret = NULL;
+ }
+
+ free_tag_strings (fields);
+ return ret;
+}
+
+static gboolean
+parse_id_string (ID3TagsWorking * work, gchar ** p_str, gint * p_len,
+ gint * p_datalen)
+{
+ gint len, datalen;
+
+ if (work->parse_size < 2)
+ return FALSE;
+
+ for (len = 0; len < work->parse_size - 1; ++len) {
+ if (work->parse_data[len] == '\0')
+ break;
+ }
+
+ datalen = work->parse_size - (len + 1);
+ if (len == 0 || datalen <= 0)
+ return FALSE;
+
+ *p_str = g_strndup ((gchar *) work->parse_data, len);
+ *p_len = len;
+ *p_datalen = datalen;
+
+ return TRUE;
+}
+
+static gchar *
+parse_unique_file_identifier (ID3TagsWorking * work, const gchar ** tag_name)
+{
+ gint len, datalen;
+ gchar *owner_id, *data, *ret = NULL;
+
+ GST_LOG ("parsing UFID frame of size %d", work->parse_size);
+
+ if (!parse_id_string (work, &owner_id, &len, &datalen))
+ return NULL;
+
+ data = (gchar *) work->parse_data + len + 1;
+ GST_LOG ("UFID owner ID: %s (+ %d bytes of data)", owner_id, datalen);
+
+ if (strcmp (owner_id, "http://musicbrainz.org") == 0 &&
+ g_utf8_validate (data, datalen, NULL)) {
+ *tag_name = GST_TAG_MUSICBRAINZ_TRACKID;
+ ret = g_strndup (data, datalen);
+ } else {
+ GST_INFO ("Unknown UFID owner ID: %s", owner_id);
+ }
+ g_free (owner_id);
+
+ return ret;
+}
+
+/* parse data and return length of the next string in the given encoding,
+ * including the NUL terminator */
+static gint
+scan_encoded_string (guint8 encoding, gchar * data, gint data_size)
+{
+ gint i;
+
+ switch (encoding) {
+ case ID3V2_ENCODING_ISO8859:
+ case ID3V2_ENCODING_UTF8:
+ for (i = 0; i < data_size; ++i) {
+ if (data[i] == '\0')
+ return i + 1;
+ }
+ break;
+ case ID3V2_ENCODING_UTF16:
+ case ID3V2_ENCODING_UTF16BE:
+ /* we don't care about BOMs here and treat them as part of the string */
+ /* Find '\0\0' terminator */
+ for (i = 0; i < data_size - 1; i += 2) {
+ if (data[i] == '\0' && data[i + 1] == '\0')
+ return i + 2;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static gboolean
+parse_picture_frame (ID3TagsWorking * work)
+{
+ guint8 txt_encoding, pic_type;
+ gchar *mime_str = NULL;
+ gint len, datalen;
+
+ GST_LOG ("APIC frame (ID3v2.%u)", ID3V2_VER_MAJOR (work->hdr.version));
+
+ if (work->parse_size < 1 + 1 + 1 + 1 + 1)
+ goto not_enough_data;
+
+ txt_encoding = work->parse_data[0];
+ ++work->parse_data;
+ --work->parse_size;
+
+ /* Read image format; in early ID3v2 versions this is a fixed-length
+ * 3-character string without terminator; in later versions (>= 2.3.0)
+ * this is a NUL-terminated string of variable length */
+ if (ID3V2_VER_MAJOR (work->hdr.version) < 3) {
+ if (work->parse_size < 3)
+ goto not_enough_data;
+
+ mime_str = g_strndup ((gchar *) work->parse_data, 3);
+ len = 3;
+ } else {
+ if (!parse_id_string (work, &mime_str, &len, &datalen))
+ return FALSE;
+ ++len; /* for string terminator */
+ }
+
+ if (work->parse_size < len + 1 + 1 + 1)
+ goto not_enough_data;
+
+ work->parse_data += len;
+ work->parse_size -= len;
+
+ /* Read image type */
+ pic_type = work->parse_data[0];
+ ++work->parse_data;
+ --work->parse_size;
+
+ GST_LOG ("APIC frame mime type : %s", GST_STR_NULL (mime_str));
+ GST_LOG ("APIC frame picture type : 0x%02x", (guint) pic_type);
+
+ if (work->parse_size < 1 + 1)
+ goto not_enough_data;
+
+ len = scan_encoded_string (txt_encoding, (gchar *) work->parse_data,
+ work->parse_size);
+
+ if (len < 1)
+ goto error;
+
+ /* just skip the description string ... */
+ GST_LOG ("Skipping description string (%d bytes in original coding)", len);
+
+ if (work->parse_size < len + 1)
+ goto not_enough_data;
+
+ work->parse_data += len;
+ work->parse_size -= len;
+
+ GST_DEBUG ("image data is %u bytes", work->parse_size);
+
+ if (work->parse_size <= 0)
+ goto not_enough_data;
+
+ if (!gst_tag_list_add_id3_image (work->tags, (guint8 *) work->parse_data,
+ work->parse_size, pic_type)) {
+ goto error;
+ }
+
+ g_free (mime_str);
+ return TRUE;
+
+not_enough_data:
+ {
+ GST_DEBUG ("not enough data, skipping APIC frame");
+ /* fall through to error */
+ }
+error:
+ {
+ GST_DEBUG ("problem parsing APIC frame, skipping");
+ g_free (mime_str);
+ return FALSE;
+ }
+}
+
+#define ID3V2_RVA2_CHANNEL_MASTER 1
+
+static gboolean
+parse_relative_volume_adjustment_two (ID3TagsWorking * work)
+{
+ const gchar *gain_tag_name = NULL;
+ const gchar *peak_tag_name = NULL;
+ gdouble gain_dB, peak_val;
+ guint64 peak;
+ guint8 *data, chan, peak_bits;
+ gchar *id;
+ gint len, datalen, i;
+
+ if (!parse_id_string (work, &id, &len, &datalen))
+ return FALSE;
+
+ if (datalen < (1 + 2 + 1)) {
+ GST_WARNING ("broken RVA2 frame, data size only %d bytes", datalen);
+ g_free (id);
+ return FALSE;
+ }
+
+ data = work->parse_data + len + 1;
+ chan = GST_READ_UINT8 (data);
+ gain_dB = (gdouble) ((gint16) GST_READ_UINT16_BE (data + 1)) / 512.0;
+ /* The meaning of the peak value is not defined in the ID3v2 spec. However,
+ * the first/only implementation of this seems to have been in XMMS, and
+ * other libs (like mutagen) seem to follow that implementation as well:
+ * see http://bugs.xmms.org/attachment.cgi?id=113&action=view */
+ peak_bits = GST_READ_UINT8 (data + 1 + 2);
+ if (peak_bits > 64) {
+ GST_WARNING ("silly peak precision of %d bits, ignoring", (gint) peak_bits);
+ peak_bits = 0;
+ }
+ data += 1 + 2 + 1;
+ datalen -= 1 + 2 + 1;
+ if (peak_bits == 16) {
+ peak = GST_READ_UINT16_BE (data);
+ } else {
+ peak = 0;
+ for (i = 0; i < (GST_ROUND_UP_8 (peak_bits) / 8) && datalen > 0; ++i) {
+ peak = peak << 8;
+ peak |= GST_READ_UINT8 (data);
+ ++data;
+ --datalen;
+ }
+ }
+
+ peak = peak << (64 - GST_ROUND_UP_8 (peak_bits));
+ peak_val =
+ gst_guint64_to_gdouble (peak) / gst_util_guint64_to_gdouble (G_MAXINT64);
+ GST_LOG ("RVA2 frame: id=%s, chan=%u, adj=%.2fdB, peak_bits=%u, peak=%.2f",
+ id, chan, gain_dB, (guint) peak_bits, peak_val);
+
+ if (chan == ID3V2_RVA2_CHANNEL_MASTER && strcmp (id, "track") == 0) {
+ gain_tag_name = GST_TAG_TRACK_GAIN;
+ peak_tag_name = GST_TAG_TRACK_PEAK;
+ } else if (chan == ID3V2_RVA2_CHANNEL_MASTER && strcmp (id, "album") == 0) {
+ gain_tag_name = GST_TAG_ALBUM_GAIN;
+ peak_tag_name = GST_TAG_ALBUM_PEAK;
+ } else {
+ GST_INFO ("Unhandled RVA2 frame id '%s' for channel %d", id, chan);
+ }
+
+ if (gain_tag_name) {
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ gain_tag_name, gain_dB, NULL);
+ }
+ if (peak_tag_name && peak_bits > 0) {
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ peak_tag_name, peak_val, NULL);
+ }
+
+ g_free (id);
+
+ return (gain_tag_name != NULL || peak_tag_name != NULL);
+}
+
+static void
+parse_obsolete_tdat_frame (ID3TagsWorking * work)
+{
+ if (work->parse_size >= 5 &&
+ work->parse_data[0] == ID3V2_ENCODING_ISO8859 &&
+ g_ascii_isdigit (work->parse_data[1]) &&
+ g_ascii_isdigit (work->parse_data[2]) &&
+ g_ascii_isdigit (work->parse_data[3]) &&
+ g_ascii_isdigit (work->parse_data[4])) {
+ work->pending_day = (10 * g_ascii_digit_value (work->parse_data[1])) +
+ g_ascii_digit_value (work->parse_data[2]);
+ work->pending_month = (10 * g_ascii_digit_value (work->parse_data[3])) +
+ g_ascii_digit_value (work->parse_data[4]);
+ GST_LOG ("date (dd/mm) %02u/%02u", work->pending_day, work->pending_month);
+ }
+}
+
+static gboolean
+id3v2_tag_to_taglist (ID3TagsWorking * work, const gchar * tag_name,
+ const gchar * tag_str)
+{
+ GType tag_type = gst_tag_get_type (tag_name);
+ GstTagList *tag_list = work->tags;
+
+ if (tag_str == NULL)
+ return FALSE;
+
+ switch (tag_type) {
+ case G_TYPE_UINT:
+ {
+ gint current, total;
+
+ if (sscanf (tag_str, "%d/%d", &current, &total) == 2) {
+ if (total <= 0) {
+ GST_WARNING ("Ignoring invalid value for total %d in tag %s",
+ total, tag_name);
+ } else {
+ if (strcmp (tag_name, GST_TAG_TRACK_NUMBER) == 0) {
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
+ GST_TAG_TRACK_COUNT, total, NULL);
+ } else if (strcmp (tag_name, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) {
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
+ GST_TAG_ALBUM_VOLUME_COUNT, total, NULL);
+ }
+ }
+ } else if (sscanf (tag_str, "%d", &current) != 1) {
+ /* Not an integer in the string */
+ GST_WARNING ("Tag string for tag %s does not contain an integer - "
+ "ignoring", tag_name);
+ break;
+ }
+
+ if (current <= 0) {
+ GST_WARNING ("Ignoring invalid value %d in tag %s", current, tag_name);
+ } else {
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, tag_name, current,
+ NULL);
+ }
+ break;
+ }
+ case G_TYPE_UINT64:
+ {
+ guint64 tmp;
+
+ g_assert (strcmp (tag_name, GST_TAG_DURATION) == 0);
+ tmp = strtoul (tag_str, NULL, 10);
+ if (tmp == 0) {
+ break;
+ }
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
+ GST_TAG_DURATION, tmp * 1000 * 1000, NULL);
+ break;
+ }
+ case G_TYPE_STRING:{
+ const GValue *val;
+ guint i, num;
+
+ /* make sure we add each unique string only once per tag, we don't want
+ * to have the same genre in the genre list multiple times, for example,
+ * or the same DiscID in there twice just because it's contained in the
+ * tag multiple times under different TXXX user tags */
+ num = gst_tag_list_get_tag_size (tag_list, tag_name);
+ for (i = 0; i < num; ++i) {
+ val = gst_tag_list_get_value_index (tag_list, tag_name, i);
+ if (val != NULL && strcmp (g_value_get_string (val), tag_str) == 0)
+ break;
+ }
+ if (i == num) {
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND,
+ tag_name, tag_str, NULL);
+ }
+ break;
+ }
+
+ default:{
+ gchar *tmp = NULL;
+ GValue src = { 0, };
+ GValue dest = { 0, };
+
+ /* Ensure that any date string is complete */
+ if (tag_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 (tag_str, "%04u-%02u-%02u", &year, &month, &day) == 0)
+ break;
+
+ tmp = g_strdup_printf ("%04u-%02u-%02u", year, month, day);
+ tag_str = tmp;
+ }
+
+ /* handles anything else */
+ g_value_init (&src, G_TYPE_STRING);
+ g_value_set_string (&src, (const gchar *) tag_str);
+ g_value_init (&dest, tag_type);
+
+ if (g_value_transform (&src, &dest)) {
+ gst_tag_list_add_values (tag_list, GST_TAG_MERGE_APPEND,
+ tag_name, &dest, NULL);
+ } else if (tag_type == G_TYPE_DOUBLE) {
+ /* replaygain tags in TXXX frames ... */
+ g_value_set_double (&dest, g_strtod (tag_str, NULL));
+ gst_tag_list_add_values (tag_list, GST_TAG_MERGE_KEEP,
+ tag_name, &dest, NULL);
+ GST_LOG ("Converted string '%s' to double %f", tag_str,
+ g_value_get_double (&dest));
+ } else {
+ GST_WARNING ("Failed to transform tag from string to type '%s'",
+ g_type_name (tag_type));
+ }
+
+ g_value_unset (&src);
+ g_value_unset (&dest);
+ g_free (tmp);
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+/* Check that an array of characters contains only digits */
+static gboolean
+id3v2_are_digits (const gchar * chars, gint size)
+{
+ gint i;
+
+ for (i = 0; i < size; i++) {
+ if (!g_ascii_isdigit (chars[i]))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+id3v2_genre_string_to_taglist (ID3TagsWorking * work, const gchar * tag_name,
+ const gchar * tag_str, gint len)
+{
+ g_return_val_if_fail (tag_str != NULL, FALSE);
+
+ /* If it's a number, it might be a defined genre */
+ if (id3v2_are_digits (tag_str, len)) {
+ tag_str = gst_tag_id3_genre_get (strtol (tag_str, NULL, 10));
+ return id3v2_tag_to_taglist (work, tag_name, tag_str);
+ }
+ /* Otherwise it might be "RX" or "CR" */
+ if (len == 2) {
+ if (g_ascii_strncasecmp ("rx", tag_str, len) == 0)
+ return id3v2_tag_to_taglist (work, tag_name, "Remix");
+
+ if (g_ascii_strncasecmp ("cr", tag_str, len) == 0)
+ return id3v2_tag_to_taglist (work, tag_name, "Cover");
+ }
+
+ /* Otherwise it's a string */
+ return id3v2_tag_to_taglist (work, tag_name, tag_str);
+}
+
+static gboolean
+id3v2_genre_fields_to_taglist (ID3TagsWorking * work, const gchar * tag_name,
+ GArray * tag_fields)
+{
+ gchar *tag_str = NULL;
+ gboolean result = FALSE;
+ gint i;
+
+ for (i = 0; i < tag_fields->len; i++) {
+ gint len;
+
+ tag_str = g_array_index (tag_fields, gchar *, i);
+ if (tag_str == NULL)
+ continue;
+
+ len = strlen (tag_str);
+ /* Only supposed to see '(n)' type numeric genre strings in ID3 <= 2.3.0
+ * but apparently we see them in 2.4.0 sometimes too */
+ if (TRUE || work->hdr.version <= 0x300) { /* <= 2.3.0 */
+ /* Check for genre numbers wrapped in parentheses, possibly
+ * followed by a string */
+ while (len >= 2) {
+ gint pos;
+ gboolean found = FALSE;
+
+ /* Double parenthesis ends the numeric genres, but we need
+ * to swallow the first one so we actually output '(' */
+ if (tag_str[0] == '(' && tag_str[1] == '(') {
+ tag_str++;
+ len--;
+ break;
+ }
+
+ /* If the first char is not a parenthesis, then stop
+ * looking for parenthesised genre strings */
+ if (tag_str[0] != '(')
+ break;
+
+ for (pos = 1; pos < len; pos++) {
+ if (tag_str[pos] == ')') {
+ gchar *tmp_str;
+
+ tmp_str = g_strndup (tag_str + 1, pos - 1);
+ result |=
+ id3v2_genre_string_to_taglist (work, tag_name, tmp_str,
+ pos - 1);
+ g_free (tmp_str);
+ tag_str += pos + 1;
+ len -= pos + 1;
+ found = TRUE;
+ break;
+ }
+
+ /* If we encounter a non-digit while searching for a closing
+ * parenthesis, we should not try and interpret this as a
+ * numeric genre string */
+ if (!g_ascii_isdigit (tag_str[pos]))
+ break;
+ }
+ if (!found)
+ break; /* There was no closing parenthesis */
+ }
+ }
+
+ if (len > 0 && tag_str != NULL)
+ result |= id3v2_genre_string_to_taglist (work, tag_name, tag_str, len);
+ }
+ return result;
+}
+
+static const gchar utf16enc[] = "UTF-16";
+static const gchar utf16leenc[] = "UTF-16LE";
+static const gchar utf16beenc[] = "UTF-16BE";
+
+static gboolean
+find_utf16_bom (gchar * data, const gchar ** p_in_encoding)
+{
+ guint16 marker = (GST_READ_UINT8 (data) << 8) | GST_READ_UINT8 (data + 1);
+
+ switch (marker) {
+ case 0xFFFE:
+ *p_in_encoding = utf16leenc;
+ return TRUE;
+ case 0xFEFF:
+ *p_in_encoding = utf16beenc;
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+static void *
+string_utf8_dup (const gchar * start, const guint size)
+{
+ const gchar *env;
+ gsize bytes_read;
+ gchar *utf8;
+
+ /* Should we try the charsets specified
+ * via environment variables FIRST ? */
+ if (g_utf8_validate (start, size, NULL)) {
+ utf8 = g_strndup (start, size);
+ goto beach;
+ }
+
+ env = g_getenv ("GST_ID3V1_TAG_ENCODING");
+ if (!env || *env == '\0')
+ env = g_getenv ("GST_ID3_TAG_ENCODING");
+ if (!env || *env == '\0')
+ env = g_getenv ("GST_TAG_ENCODING");
+
+ /* Try charsets specified via the environment */
+ if (env && *env != '\0') {
+ gchar **c, **csets;
+
+ csets = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, -1);
+
+ for (c = csets; c && *c; ++c) {
+ if ((utf8 =
+ g_convert (start, size, "UTF-8", *c, &bytes_read, NULL, NULL))) {
+ if (bytes_read == size) {
+ GST_DEBUG ("Using charset %s to interperate id3 tags\n", *c);
+ g_strfreev (csets);
+ goto beach;
+ }
+ g_free (utf8);
+ utf8 = NULL;
+ }
+ }
+ }
+ /* Try current locale (if not UTF-8) */
+ if (!g_get_charset (&env)) {
+ if ((utf8 = g_locale_to_utf8 (start, size, &bytes_read, NULL, NULL))) {
+ if (bytes_read == size) {
+ goto beach;
+ }
+ g_free (utf8);
+ utf8 = NULL;
+ }
+ }
+
+ /* Try ISO-8859-1 */
+ utf8 =
+ g_convert (start, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
+ if (utf8 != NULL && bytes_read == size) {
+ goto beach;
+ }
+
+ g_free (utf8);
+ return NULL;
+
+beach:
+
+ g_strchomp (utf8);
+
+ return (utf8);
+}
+
+static void
+parse_insert_string_field (guint8 encoding, gchar * data, gint data_size,
+ GArray * fields)
+{
+ gchar *field = NULL;
+
+ switch (encoding) {
+ case ID3V2_ENCODING_UTF16:
+ case ID3V2_ENCODING_UTF16BE:
+ {
+ const gchar *in_encode;
+
+ if (encoding == ID3V2_ENCODING_UTF16)
+ in_encode = utf16enc;
+ else
+ in_encode = utf16beenc;
+
+ /* Sometimes we see strings with multiple BOM markers at the start.
+ * In that case, we assume the innermost one is correct. If that fails
+ * to produce valid UTF-8, we try the other endianness anyway */
+ while (data_size > 2 && find_utf16_bom (data, &in_encode)) {
+ data += 2; /* skip BOM */
+ data_size -= 2;
+ }
+
+ field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
+
+ if (field == NULL || g_utf8_validate (field, -1, NULL) == FALSE) {
+ /* As a fallback, try interpreting UTF-16 in the other endianness */
+ if (in_encode == utf16beenc)
+ field = g_convert (data, data_size, "UTF-8", utf16leenc,
+ NULL, NULL, NULL);
+ }
+ }
+
+ break;
+ case ID3V2_ENCODING_ISO8859:
+ if (g_utf8_validate (data, data_size, NULL))
+ field = g_strndup (data, data_size);
+ else
+ /* field = g_convert (data, data_size, "UTF-8", "ISO-8859-1",
+ NULL, NULL, NULL); */
+ field = string_utf8_dup (data, data_size);
+ break;
+ default:
+ field = g_strndup (data, data_size);
+ break;
+ }
+
+ if (field) {
+ if (g_utf8_validate (field, -1, NULL)) {
+ g_array_append_val (fields, field);
+ return;
+ }
+
+ GST_DEBUG ("%s was bad UTF-8 after conversion from encoding %d. Ignoring",
+ field, encoding);
+ g_free (field);
+ }
+}
+
+static void
+parse_split_strings (guint8 encoding, gchar * data, gint data_size,
+ GArray ** out_fields)
+{
+ GArray *fields = g_array_new (FALSE, TRUE, sizeof (gchar *));
+ gint text_pos;
+ gint prev = 0;
+
+ g_return_if_fail (out_fields != NULL);
+
+ switch (encoding) {
+ case ID3V2_ENCODING_ISO8859:
+ for (text_pos = 0; text_pos < data_size; text_pos++) {
+ if (data[text_pos] == 0) {
+ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 1, fields);
+ prev = text_pos + 1;
+ }
+ }
+ if (data_size - prev > 0 && data[prev] != 0x00) {
+ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+
+ break;
+ case ID3V2_ENCODING_UTF8:
+ for (prev = 0, text_pos = 0; text_pos < data_size; text_pos++) {
+ if (data[text_pos] == '\0') {
+ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 1, fields);
+ prev = text_pos + 1;
+ }
+ }
+ if (data_size - prev > 0 && data[prev] != 0x00) {
+ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+ break;
+ case ID3V2_ENCODING_UTF16:
+ case ID3V2_ENCODING_UTF16BE:
+ {
+ /* Find '\0\0' terminator */
+ for (text_pos = 0; text_pos < data_size - 1; text_pos += 2) {
+ if (data[text_pos] == '\0' && data[text_pos + 1] == '\0') {
+ /* found a delimiter */
+ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 2, fields);
+ text_pos++; /* Advance to the 2nd NULL terminator */
+ prev = text_pos + 1;
+ break;
+ }
+ }
+ if (data_size - prev > 1 &&
+ (data[prev] != 0x00 || data[prev + 1] != 0x00)) {
+ /* There were 2 or more non-null chars left, convert those too */
+ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+ break;
+ }
+ }
+ if (fields->len > 0)
+ *out_fields = fields;
+ else
+ g_array_free (fields, TRUE);
+}
+
+static void
+free_tag_strings (GArray * fields)
+{
+ if (fields) {
+ gint i;
+ gchar *c;
+
+ for (i = 0; i < fields->len; i++) {
+ c = g_array_index (fields, gchar *, i);
+ g_free (c);
+ }
+ g_array_free (fields, TRUE);
+ }
+}
diff --git a/gst-libs/gst/tag/lang-tables.dat b/gst-libs/gst/tag/lang-tables.dat
new file mode 100644
index 0000000..3367f70
--- /dev/null
+++ b/gst-libs/gst/tag/lang-tables.dat
@@ -0,0 +1,447 @@
+/* generated by mklangtables.c iso-codes 3.15 */
+
+#include <glib.h>
+
+#define ISO_639_FLAG_2T (1 << 0)
+#define ISO_639_FLAG_2B (1 << 1)
+
+/* *INDENT-OFF* */
+
+static const struct
+{
+ const gchar iso_639_1[3];
+ const gchar iso_639_2[4];
+ guint8 flags;
+ guint16 name_offset;
+} iso_639_codes[] = {
+ /* Afar */
+ { "aa", "aar", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 0 },
+ /* Abkhazian */
+ { "ab", "abk", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 5 },
+ /* Avestan */
+ { "ae", "ave", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 15 },
+ /* Afrikaans */
+ { "af", "afr", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 23 },
+ /* Akan */
+ { "ak", "aka", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 33 },
+ /* Amharic */
+ { "am", "amh", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 38 },
+ /* Aragonese */
+ { "an", "arg", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 46 },
+ /* Arabic */
+ { "ar", "ara", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 56 },
+ /* Assamese */
+ { "as", "asm", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 63 },
+ /* Avaric */
+ { "av", "ava", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 72 },
+ /* Aymara */
+ { "ay", "aym", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 79 },
+ /* Azerbaijani */
+ { "az", "aze", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 86 },
+ /* Bashkir */
+ { "ba", "bak", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 98 },
+ /* Belarusian */
+ { "be", "bel", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 106 },
+ /* Bulgarian */
+ { "bg", "bul", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 117 },
+ /* Bihari languages */
+ { "bh", "bih", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 127 },
+ /* Bislama */
+ { "bi", "bis", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 144 },
+ /* Bambara */
+ { "bm", "bam", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 152 },
+ /* Bengali */
+ { "bn", "ben", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 160 },
+ /* Tibetan */
+ { "bo", "bod", ISO_639_FLAG_2T, 168 },
+ { "bo", "tib", ISO_639_FLAG_2B, 168 },
+ /* Breton */
+ { "br", "bre", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 176 },
+ /* Bosnian */
+ { "bs", "bos", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 183 },
+ /* Catalan; Valencian */
+ { "ca", "cat", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 191 },
+ /* Chechen */
+ { "ce", "che", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 210 },
+ /* Chamorro */
+ { "ch", "cha", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 218 },
+ /* Corsican */
+ { "co", "cos", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 227 },
+ /* Cree */
+ { "cr", "cre", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 236 },
+ /* Czech */
+ { "cs", "ces", ISO_639_FLAG_2T, 241 },
+ { "cs", "cze", ISO_639_FLAG_2B, 241 },
+ /* Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic */
+ { "cu", "chu", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 247 },
+ /* Chuvash */
+ { "cv", "chv", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 328 },
+ /* Welsh */
+ { "cy", "cym", ISO_639_FLAG_2T, 336 },
+ { "cy", "wel", ISO_639_FLAG_2B, 336 },
+ /* Danish */
+ { "da", "dan", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 342 },
+ /* German */
+ { "de", "deu", ISO_639_FLAG_2T, 349 },
+ { "de", "ger", ISO_639_FLAG_2B, 349 },
+ /* Divehi; Dhivehi; Maldivian */
+ { "dv", "div", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 356 },
+ /* Dzongkha */
+ { "dz", "dzo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 383 },
+ /* Ewe */
+ { "ee", "ewe", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 392 },
+ /* Greek, Modern (1453-) */
+ { "el", "ell", ISO_639_FLAG_2T, 396 },
+ { "el", "gre", ISO_639_FLAG_2B, 396 },
+ /* English */
+ { "en", "eng", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 418 },
+ /* Esperanto */
+ { "eo", "epo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 426 },
+ /* Spanish; Castilian */
+ { "es", "spa", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 436 },
+ /* Estonian */
+ { "et", "est", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 455 },
+ /* Basque */
+ { "eu", "eus", ISO_639_FLAG_2T, 464 },
+ { "eu", "baq", ISO_639_FLAG_2B, 464 },
+ /* Persian */
+ { "fa", "fas", ISO_639_FLAG_2T, 471 },
+ { "fa", "per", ISO_639_FLAG_2B, 471 },
+ /* Fulah */
+ { "ff", "ful", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 479 },
+ /* Finnish */
+ { "fi", "fin", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 485 },
+ /* Fijian */
+ { "fj", "fij", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 493 },
+ /* Faroese */
+ { "fo", "fao", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 500 },
+ /* French */
+ { "fr", "fra", ISO_639_FLAG_2T, 508 },
+ { "fr", "fre", ISO_639_FLAG_2B, 508 },
+ /* Western Frisian */
+ { "fy", "fry", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 515 },
+ /* Irish */
+ { "ga", "gle", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 531 },
+ /* Gaelic; Scottish Gaelic */
+ { "gd", "gla", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 537 },
+ /* Galician */
+ { "gl", "glg", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 561 },
+ /* Guarani */
+ { "gn", "grn", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 570 },
+ /* Gujarati */
+ { "gu", "guj", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 578 },
+ /* Manx */
+ { "gv", "glv", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 587 },
+ /* Hausa */
+ { "ha", "hau", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 592 },
+ /* Hebrew */
+ { "he", "heb", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 598 },
+ /* Hindi */
+ { "hi", "hin", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 605 },
+ /* Hiri Motu */
+ { "ho", "hmo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 611 },
+ /* Croatian */
+ { "hr", "hrv", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 621 },
+ /* Haitian; Haitian Creole */
+ { "ht", "hat", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 630 },
+ /* Hungarian */
+ { "hu", "hun", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 654 },
+ /* Armenian */
+ { "hy", "hye", ISO_639_FLAG_2T, 664 },
+ { "hy", "arm", ISO_639_FLAG_2B, 664 },
+ /* Herero */
+ { "hz", "her", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 673 },
+ /* Interlingua (International Auxiliary Language Association) */
+ { "ia", "ina", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 680 },
+ /* Indonesian */
+ { "id", "ind", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 739 },
+ /* Interlingue; Occidental */
+ { "ie", "ile", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 750 },
+ /* Igbo */
+ { "ig", "ibo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 774 },
+ /* Sichuan Yi; Nuosu */
+ { "ii", "iii", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 779 },
+ /* Inupiaq */
+ { "ik", "ipk", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 797 },
+ /* Ido */
+ { "io", "ido", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 805 },
+ /* Icelandic */
+ { "is", "isl", ISO_639_FLAG_2T, 809 },
+ { "is", "ice", ISO_639_FLAG_2B, 809 },
+ /* Italian */
+ { "it", "ita", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 819 },
+ /* Inuktitut */
+ { "iu", "iku", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 827 },
+ /* Japanese */
+ { "ja", "jpn", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 837 },
+ /* Javanese */
+ { "jv", "jav", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 846 },
+ /* Georgian */
+ { "ka", "kat", ISO_639_FLAG_2T, 855 },
+ { "ka", "geo", ISO_639_FLAG_2B, 855 },
+ /* Kongo */
+ { "kg", "kon", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 864 },
+ /* Kikuyu; Gikuyu */
+ { "ki", "kik", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 870 },
+ /* Kuanyama; Kwanyama */
+ { "kj", "kua", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 885 },
+ /* Kazakh */
+ { "kk", "kaz", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 904 },
+ /* Kalaallisut; Greenlandic */
+ { "kl", "kal", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 911 },
+ /* Central Khmer */
+ { "km", "khm", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 936 },
+ /* Kannada */
+ { "kn", "kan", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 950 },
+ /* Korean */
+ { "ko", "kor", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 958 },
+ /* Kanuri */
+ { "kr", "kau", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 965 },
+ /* Kashmiri */
+ { "ks", "kas", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 972 },
+ /* Kurdish */
+ { "ku", "kur", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 981 },
+ /* Komi */
+ { "kv", "kom", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 989 },
+ /* Cornish */
+ { "kw", "cor", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 994 },
+ /* Kirghiz; Kyrgyz */
+ { "ky", "kir", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1002 },
+ /* Latin */
+ { "la", "lat", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1018 },
+ /* Luxembourgish; Letzeburgesch */
+ { "lb", "ltz", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1024 },
+ /* Ganda */
+ { "lg", "lug", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1053 },
+ /* Limburgan; Limburger; Limburgish */
+ { "li", "lim", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1059 },
+ /* Lingala */
+ { "ln", "lin", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1092 },
+ /* Lao */
+ { "lo", "lao", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1100 },
+ /* Lithuanian */
+ { "lt", "lit", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1104 },
+ /* Luba-Katanga */
+ { "lu", "lub", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1115 },
+ /* Latvian */
+ { "lv", "lav", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1128 },
+ /* Malagasy */
+ { "mg", "mlg", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1136 },
+ /* Marshallese */
+ { "mh", "mah", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1145 },
+ /* Maori */
+ { "mi", "mri", ISO_639_FLAG_2T, 1157 },
+ { "mi", "mao", ISO_639_FLAG_2B, 1157 },
+ /* Macedonian */
+ { "mk", "mkd", ISO_639_FLAG_2T, 1163 },
+ { "mk", "mac", ISO_639_FLAG_2B, 1163 },
+ /* Malayalam */
+ { "ml", "mal", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1174 },
+ /* Mongolian */
+ { "mn", "mon", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1184 },
+ /* Moldavian; Moldovan */
+ { "mo", "mol", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1194 },
+ /* Marathi */
+ { "mr", "mar", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1214 },
+ /* Malay */
+ { "ms", "msa", ISO_639_FLAG_2T, 1222 },
+ { "ms", "may", ISO_639_FLAG_2B, 1222 },
+ /* Maltese */
+ { "mt", "mlt", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1228 },
+ /* Burmese */
+ { "my", "mya", ISO_639_FLAG_2T, 1236 },
+ { "my", "bur", ISO_639_FLAG_2B, 1236 },
+ /* Nauru */
+ { "na", "nau", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1244 },
+ /* Bokm?l, Norwegian; Norwegian Bokm?l */
+ { "nb", "nob", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1250 },
+ /* Ndebele, North; North Ndebele */
+ { "nd", "nde", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1288 },
+ /* Nepali */
+ { "ne", "nep", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1318 },
+ /* Ndonga */
+ { "ng", "ndo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1325 },
+ /* Dutch; Flemish */
+ { "nl", "nld", ISO_639_FLAG_2T, 1332 },
+ { "nl", "dut", ISO_639_FLAG_2B, 1332 },
+ /* Norwegian Nynorsk; Nynorsk, Norwegian */
+ { "nn", "nno", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1347 },
+ /* Norwegian */
+ { "no", "nor", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1385 },
+ /* Ndebele, South; South Ndebele */
+ { "nr", "nbl", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1395 },
+ /* Navajo; Navaho */
+ { "nv", "nav", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1425 },
+ /* Chichewa; Chewa; Nyanja */
+ { "ny", "nya", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1440 },
+ /* Occitan (post 1500) */
+ { "oc", "oci", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1464 },
+ /* Ojibwa */
+ { "oj", "oji", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1484 },
+ /* Oromo */
+ { "om", "orm", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1491 },
+ /* Oriya */
+ { "or", "ori", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1497 },
+ /* Ossetian; Ossetic */
+ { "os", "oss", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1503 },
+ /* Panjabi; Punjabi */
+ { "pa", "pan", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1521 },
+ /* Pali */
+ { "pi", "pli", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1538 },
+ /* Polish */
+ { "pl", "pol", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1543 },
+ /* Pushto; Pashto */
+ { "ps", "pus", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1550 },
+ /* Portuguese */
+ { "pt", "por", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1565 },
+ /* Quechua */
+ { "qu", "que", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1576 },
+ /* Romansh */
+ { "rm", "roh", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1584 },
+ /* Rundi */
+ { "rn", "run", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1592 },
+ /* Romanian */
+ { "ro", "ron", ISO_639_FLAG_2T, 1598 },
+ { "ro", "rum", ISO_639_FLAG_2B, 1598 },
+ /* Russian */
+ { "ru", "rus", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1607 },
+ /* Kinyarwanda */
+ { "rw", "kin", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1615 },
+ /* Sanskrit */
+ { "sa", "san", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1627 },
+ /* Sardinian */
+ { "sc", "srd", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1636 },
+ /* Sindhi */
+ { "sd", "snd", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1646 },
+ /* Northern Sami */
+ { "se", "sme", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1653 },
+ /* Sango */
+ { "sg", "sag", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1667 },
+ /* Sinhala; Sinhalese */
+ { "si", "sin", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1673 },
+ /* Slovak */
+ { "sk", "slk", ISO_639_FLAG_2T, 1692 },
+ { "sk", "slo", ISO_639_FLAG_2B, 1692 },
+ /* Slovenian */
+ { "sl", "slv", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1699 },
+ /* Samoan */
+ { "sm", "smo", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1709 },
+ /* Shona */
+ { "sn", "sna", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1716 },
+ /* Somali */
+ { "so", "som", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1722 },
+ /* Albanian */
+ { "sq", "sqi", ISO_639_FLAG_2T, 1729 },
+ { "sq", "alb", ISO_639_FLAG_2B, 1729 },
+ /* Serbian */
+ { "sr", "srp", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1738 },
+ /* Swati */
+ { "ss", "ssw", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1746 },
+ /* Sotho, Southern */
+ { "st", "sot", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1752 },
+ /* Sundanese */
+ { "su", "sun", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1768 },
+ /* Swedish */
+ { "sv", "swe", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1778 },
+ /* Swahili */
+ { "sw", "swa", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1786 },
+ /* Tamil */
+ { "ta", "tam", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1794 },
+ /* Telugu */
+ { "te", "tel", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1800 },
+ /* Tajik */
+ { "tg", "tgk", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1807 },
+ /* Thai */
+ { "th", "tha", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1813 },
+ /* Tigrinya */
+ { "ti", "tir", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1818 },
+ /* Turkmen */
+ { "tk", "tuk", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1827 },
+ /* Tagalog */
+ { "tl", "tgl", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1835 },
+ /* Tswana */
+ { "tn", "tsn", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1843 },
+ /* Tonga (Tonga Islands) */
+ { "to", "ton", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1850 },
+ /* Turkish */
+ { "tr", "tur", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1872 },
+ /* Tsonga */
+ { "ts", "tso", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1880 },
+ /* Tatar */
+ { "tt", "tat", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1887 },
+ /* Twi */
+ { "tw", "twi", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1893 },
+ /* Tahitian */
+ { "ty", "tah", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1897 },
+ /* Uighur; Uyghur */
+ { "ug", "uig", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1906 },
+ /* Ukrainian */
+ { "uk", "ukr", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1921 },
+ /* Urdu */
+ { "ur", "urd", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1931 },
+ /* Uzbek */
+ { "uz", "uzb", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1936 },
+ /* Venda */
+ { "ve", "ven", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1942 },
+ /* Vietnamese */
+ { "vi", "vie", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1948 },
+ /* Volap?k */
+ { "vo", "vol", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1959 },
+ /* Walloon */
+ { "wa", "wln", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1968 },
+ /* Wolof */
+ { "wo", "wol", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1976 },
+ /* Xhosa */
+ { "xh", "xho", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1982 },
+ /* Yiddish */
+ { "yi", "yid", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1988 },
+ /* Yoruba */
+ { "yo", "yor", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 1996 },
+ /* Zhuang; Chuang */
+ { "za", "zha", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 2003 },
+ /* Chinese */
+ { "zh", "zho", ISO_639_FLAG_2T, 2018 },
+ { "zh", "chi", ISO_639_FLAG_2B, 2018 },
+ /* Zulu */
+ { "zu", "zul", ISO_639_FLAG_2T | ISO_639_FLAG_2B, 2026 },
+};
+
+static const gchar iso_639_names[] =
+ "Afar\000Abkhazian\000Avestan\000Afrikaans\000Akan\000Amharic\000Aragonese"
+ "\000Arabic\000Assamese\000Avaric\000Aymara\000Azerbaijani\000Bashkir\000B"
+ "elarusian\000Bulgarian\000Bihari languages\000Bislama\000Bambara\000Benga"
+ "li\000Tibetan\000Breton\000Bosnian\000Catalan; Valencian\000Chechen\000Ch"
+ "amorro\000Corsican\000Cree\000Czech\000Church Slavic; Old Slavonic; Churc"
+ "h Slavonic; Old Bulgarian; Old Church Slavonic\000Chuvash\000Welsh\000Dan"
+ "ish\000German\000Divehi; Dhivehi; Maldivian\000Dzongkha\000Ewe\000Greek, "
+ "Modern (1453-)\000English\000Esperanto\000Spanish; Castilian\000Estonian"
+ "\000Basque\000Persian\000Fulah\000Finnish\000Fijian\000Faroese\000French"
+ "\000Western Frisian\000Irish\000Gaelic; Scottish Gaelic\000Galician\000Gu"
+ "arani\000Gujarati\000Manx\000Hausa\000Hebrew\000Hindi\000Hiri Motu\000Cro"
+ "atian\000Haitian; Haitian Creole\000Hungarian\000Armenian\000Herero\000In"
+ "terlingua (International Auxiliary Language Association)\000Indonesian"
+ "\000Interlingue; Occidental\000Igbo\000Sichuan Yi; Nuosu\000Inupiaq\000Id"
+ "o\000Icelandic\000Italian\000Inuktitut\000Japanese\000Javanese\000Georgia"
+ "n\000Kongo\000Kikuyu; Gikuyu\000Kuanyama; Kwanyama\000Kazakh\000Kalaallis"
+ "ut; Greenlandic\000Central Khmer\000Kannada\000Korean\000Kanuri\000Kashmi"
+ "ri\000Kurdish\000Komi\000Cornish\000Kirghiz; Kyrgyz\000Latin\000Luxembour"
+ "gish; Letzeburgesch\000Ganda\000Limburgan; Limburger; Limburgish\000Linga"
+ "la\000Lao\000Lithuanian\000Luba-Katanga\000Latvian\000Malagasy\000Marshal"
+ "lese\000Maori\000Macedonian\000Malayalam\000Mongolian\000Moldavian; Moldo"
+ "van\000Marathi\000Malay\000Maltese\000Burmese\000Nauru\000Bokm\303\245l, "
+ "Norwegian; Norwegian Bokm\303\245l\000Ndebele, North; North Ndebele\000Ne"
+ "pali\000Ndonga\000Dutch; Flemish\000Norwegian Nynorsk; Nynorsk, Norwegian"
+ "\000Norwegian\000Ndebele, South; South Ndebele\000Navajo; Navaho\000Chich"
+ "ewa; Chewa; Nyanja\000Occitan (post 1500)\000Ojibwa\000Oromo\000Oriya\000"
+ "Ossetian; Ossetic\000Panjabi; Punjabi\000Pali\000Polish\000Pushto; Pashto"
+ "\000Portuguese\000Quechua\000Romansh\000Rundi\000Romanian\000Russian\000K"
+ "inyarwanda\000Sanskrit\000Sardinian\000Sindhi\000Northern Sami\000Sango"
+ "\000Sinhala; Sinhalese\000Slovak\000Slovenian\000Samoan\000Shona\000Somal"
+ "i\000Albanian\000Serbian\000Swati\000Sotho, Southern\000Sundanese\000Swed"
+ "ish\000Swahili\000Tamil\000Telugu\000Tajik\000Thai\000Tigrinya\000Turkmen"
+ "\000Tagalog\000Tswana\000Tonga (Tonga Islands)\000Turkish\000Tsonga\000Ta"
+ "tar\000Twi\000Tahitian\000Uighur; Uyghur\000Ukrainian\000Urdu\000Uzbek"
+ "\000Venda\000Vietnamese\000Volap\303\274k\000Walloon\000Wolof\000Xhosa"
+ "\000Yiddish\000Yoruba\000Zhuang; Chuang\000Chinese\000Zulu";
+
+/* *INDENT-ON* */
diff --git a/gst-libs/gst/tag/lang.c b/gst-libs/gst/tag/lang.c
new file mode 100644
index 0000000..a0838fe
--- /dev/null
+++ b/gst-libs/gst/tag/lang.c
@@ -0,0 +1,494 @@
+/* GStreamer language codes and names utility functions
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttaglanguagecodes
+ * @short_description: mappings for ISO-639 language codes and names
+ * @see_also: #GstTagList
+ *
+ * <refsect2>
+ * <para>
+ * Provides helper functions to convert between the various ISO-639 language
+ * codes, and to map language codes to language names.
+ * </para>
+ * </refsect2>
+ */
+
+/* FIXME 0.11: maybe switch to ISO-639-2 everywhere incl. GST_TAG_LANGUAGE? */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#undef GETTEXT_PACKAGE
+#define GETTEXT_PACKAGE "iso_639"
+
+#define ISO_639_XML_PATH ISO_CODES_PREFIX "/share/xml/iso-codes/iso_639.xml"
+#define ISO_CODES_LOCALEDIR ISO_CODES_PREFIX "/share/locale"
+
+#include <gst/gst-i18n-plugin.h>
+#include <gst/gst.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "tag.h"
+#include "lang-tables.dat"
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#define GST_CAT_DEFAULT ensure_debug_category()
+
+static GstDebugCategory *
+ensure_debug_category (void)
+{
+ static gsize cat_gonce = 0;
+
+ if (g_once_init_enter (&cat_gonce)) {
+ gsize cat_done;
+
+ cat_done = (gsize) _gst_debug_category_new ("tag-langcodes", 0,
+ "GstTag language codes and names");
+
+ g_once_init_leave (&cat_gonce, cat_done);
+ }
+
+ return (GstDebugCategory *) cat_gonce;
+}
+
+#else
+
+#define ensure_debug_category() /* NOOP */
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+/* ------------------------------------------------------------------------- */
+
+/* Loading and initing */
+
+#if defined(HAVE_ISO_CODES)
+static const gchar *
+get_val (const gchar ** names, const gchar ** vals, const gchar * name)
+{
+ while (names != NULL && *names != NULL) {
+ if (strcmp (*names, name) == 0)
+ return *vals;
+ ++names;
+ ++vals;
+ }
+ return NULL;
+}
+
+static void
+parse_start_element (GMarkupParseContext * ctx, const gchar * element_name,
+ const gchar ** attr_names, const gchar ** attr_vals,
+ gpointer user_data, GError ** error)
+{
+ GHashTable *ht = (GHashTable *) user_data;
+ const gchar *c1, *c2t, *c2b, *name, *tname;
+
+ if (strcmp (element_name, "iso_639_entry") != 0)
+ return;
+
+ c1 = get_val (attr_names, attr_vals, "iso_639_1_code");
+
+ /* only interested in languages with an ISO 639-1 code for now */
+ if (c1 == NULL)
+ return;
+
+ c2t = get_val (attr_names, attr_vals, "iso_639_2T_code");
+ c2b = get_val (attr_names, attr_vals, "iso_639_2B_code");
+ name = get_val (attr_names, attr_vals, "name");
+
+ if (c2t == NULL || c2b == NULL || name == NULL) {
+ GST_WARNING ("broken iso_639.xml entry: c2t=%p, c2b=%p, name=%p", c2t,
+ c2b, name);
+ return;
+ }
+
+ /* translate language name */
+ tname = _(name);
+
+ /* if no translation was found, it will return the input string, which we
+ * we don't want to put into the hash table because it will be freed again */
+ if (G_UNLIKELY (tname == name))
+ tname = g_intern_string (name);
+
+ /* now overwrite default/fallback mappings with names in locale language */
+ g_hash_table_replace (ht, (gpointer) g_intern_string (c1), (gpointer) tname);
+ g_hash_table_replace (ht, (gpointer) g_intern_string (c2b), (gpointer) tname);
+ if (strcmp (c2t, c2b) != 0) {
+ g_hash_table_replace (ht, (gpointer) g_intern_string (c2t),
+ (gpointer) tname);
+ }
+
+ GST_LOG ("%s %s %s : %s - %s", c1, c2t, c2b, name, tname);
+}
+
+static void
+gst_tag_load_iso_639_xml (GHashTable * ht)
+{
+ GMappedFile *f;
+ GError *err = NULL;
+ gchar *xml_data;
+ gsize xml_len;
+
+#ifdef ENABLE_NLS
+ GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
+ ISO_CODES_LOCALEDIR);
+ bindtextdomain (GETTEXT_PACKAGE, ISO_CODES_LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+#endif
+
+ f = g_mapped_file_new (ISO_639_XML_PATH, FALSE, NULL);
+ if (f != NULL) {
+ xml_data = (gchar *) g_mapped_file_get_contents (f);
+ xml_len = g_mapped_file_get_length (f);
+ } else {
+ if (!g_file_get_contents (ISO_639_XML_PATH, &xml_data, &xml_len, &err)) {
+ GST_WARNING ("Could not read %s: %s", ISO_639_XML_PATH, err->message);
+ g_error_free (err);
+ return;
+ }
+ }
+
+ if (g_utf8_validate (xml_data, xml_len, NULL)) {
+ GMarkupParser xml_parser = { parse_start_element, NULL, NULL, NULL, NULL };
+ GMarkupParseContext *ctx;
+
+ ctx = g_markup_parse_context_new (&xml_parser, 0, ht, NULL);
+ if (!g_markup_parse_context_parse (ctx, xml_data, xml_len, &err)) {
+ GST_WARNING ("Parsing iso_639.xml failed: %s", err->message);
+ g_error_free (err);
+ }
+ g_markup_parse_context_free (ctx);
+ } else {
+ GST_WARNING ("iso_639.xml file is not valid UTF-8");
+ GST_MEMDUMP ("iso_639.xml file", (guint8 *) xml_data, xml_len);
+ }
+
+ /* ... and clean up */
+ if (f != NULL)
+ g_mapped_file_unref (f);
+ else
+ g_free (xml_data);
+}
+#endif /* HAVE_ISO_CODES */
+
+static GHashTable *
+gst_tag_get_iso_639_ht (void)
+{
+ static gsize once_val = 0;
+ int i;
+
+ if (g_once_init_enter (&once_val)) {
+ GHashTable *ht;
+ gsize done_val;
+
+ GST_MEMDUMP ("iso 639 language names (internal default/fallback)",
+ (guint8 *) iso_639_names, sizeof (iso_639_names));
+
+ /* maps code -> language name; all strings are either interned strings
+ * or const static strings from lang-table.c */
+ ht = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* set up default/fallback mappings */
+ for (i = 0; i < G_N_ELEMENTS (iso_639_codes); ++i) {
+ GST_LOG ("%3d %s %s %c%c 0x%04x %s", i, iso_639_codes[i].iso_639_1,
+ iso_639_codes[i].iso_639_2,
+ ((iso_639_codes[i].flags & ISO_639_FLAG_2B)) ? 'B' : '.',
+ ((iso_639_codes[i].flags & ISO_639_FLAG_2T)) ? 'T' : '.',
+ iso_639_codes[i].name_offset,
+ iso_639_names + iso_639_codes[i].name_offset);
+
+#ifdef HAVE_ISO_CODES
+ /* intern these in order to minimise allocations when interning strings
+ * read from the xml file later */
+ g_intern_static_string (iso_639_codes[i].iso_639_1);
+ g_intern_static_string (iso_639_codes[i].iso_639_2);
+ g_intern_static_string (iso_639_names + iso_639_codes[i].name_offset);
+#endif
+
+ /* and add default mapping (these strings are always valid) */
+ g_hash_table_insert (ht, (gpointer) iso_639_codes[i].iso_639_1,
+ (gpointer) (iso_639_names + iso_639_codes[i].name_offset));
+ g_hash_table_insert (ht, (gpointer) iso_639_codes[i].iso_639_2,
+ (gpointer) (iso_639_names + iso_639_codes[i].name_offset));
+ }
+
+#ifdef HAVE_ISO_CODES
+ {
+ GstClockTime ts = gst_util_get_timestamp ();
+
+ gst_tag_load_iso_639_xml (ht);
+
+ ts = gst_util_get_timestamp () - ts;
+ GST_INFO ("iso_639.xml loading took %.2gms", (double) ts / GST_MSECOND);
+ }
+#else
+ GST_INFO ("iso-codes disabled or not available");
+#endif
+
+ done_val = (gsize) ht;
+ g_once_init_leave (&once_val, done_val);
+ }
+
+ return (GHashTable *) once_val;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int
+qsort_strcmp_func (const void *p1, const void *p2)
+{
+ return strcmp (*(char *const *) p1, *(char *const *) p2);
+}
+
+/**
+ * gst_tag_get_language_codes:
+ *
+ * Returns a list of known language codes (in form of two-letter ISO-639-1
+ * codes). This is useful for UIs to build a list of available languages for
+ * tagging purposes (e.g. to tag an audio track appropriately in a video or
+ * audio editor).
+ *
+ * Returns: NULL-terminated string array with two-letter language codes. Free
+ * with g_strfreev() when no longer needed.
+ *
+ * Since: 0.10.26
+ */
+gchar **
+gst_tag_get_language_codes (void)
+{
+ GHashTableIter iter;
+ GHashTable *ht;
+ gpointer key;
+ gchar **codes;
+ int i;
+
+ ensure_debug_category ();
+
+ ht = gst_tag_get_iso_639_ht ();
+
+ /* we have at least two keys for each language (-1 code and -2 code) */
+ codes = g_new (gchar *, (g_hash_table_size (ht) / 2) + 1);
+
+ i = 0;
+ g_hash_table_iter_init (&iter, ht);
+ while (g_hash_table_iter_next (&iter, &key, NULL)) {
+ const gchar *lang_code = key;
+
+ if (strlen (lang_code) == 2) {
+ codes[i] = g_strdup (lang_code);
+ ++i;
+ }
+ }
+ codes[i] = NULL;
+
+ /* be nice and sort the list */
+ qsort (&codes[0], i, sizeof (gchar *), qsort_strcmp_func);
+
+ return codes;
+}
+
+/**
+ * gst_tag_get_language_name:
+ * @language_code: two or three-letter ISO-639 language code
+ *
+ * Returns the name of the language given an ISO-639 language code, such
+ * as often found in a GST_TAG_LANGUAGE tag. The name will be translated
+ * according to the current locale (if the library was built against the
+ * iso-codes package, otherwise the English name will be returned).
+ *
+ * Language codes are case-sensitive and expected to be lower case.
+ *
+ * Returns: language name in UTF-8 format, or NULL if @language_code could
+ * not be mapped to a language name. The returned string must not be
+ * modified and does not need to freed; it will stay valid until the
+ * application is terminated.
+ *
+ * Since: 0.10.26
+ */
+const gchar *
+gst_tag_get_language_name (const gchar * language_code)
+{
+ const gchar *lang_name;
+ GHashTable *ht;
+
+ g_return_val_if_fail (language_code != NULL, NULL);
+
+ ensure_debug_category ();
+
+ ht = gst_tag_get_iso_639_ht ();
+
+ lang_name = g_hash_table_lookup (ht, (gpointer) language_code);
+ GST_LOG ("%s -> %s", language_code, GST_STR_NULL (lang_name));
+
+ return lang_name;
+}
+
+/**
+ * gst_tag_get_language_code_iso_639_1:
+ * @lang_code: ISO-639 language code (e.g. "deu" or "ger" or "de")
+ *
+ * Returns two-letter ISO-639-1 language code given a three-letter ISO-639-2
+ * language code or two-letter ISO-639-1 language code (both are accepted for
+ * convenience).
+ *
+ * Language codes are case-sensitive and expected to be lower case.
+ *
+ * Returns: two-letter ISO-639-1 language code string that maps to @lang_code,
+ * or NULL if no mapping is known. The returned string must not be
+ * modified or freed.
+ *
+ * Since: 0.10.26
+ */
+const gchar *
+gst_tag_get_language_code_iso_639_1 (const gchar * lang_code)
+{
+ const gchar *c = NULL;
+ int i;
+
+ g_return_val_if_fail (lang_code != NULL, NULL);
+
+ ensure_debug_category ();
+
+ /* FIXME: we are being a bit inconsistent here in the sense that will only
+ * map the language codes from our static table. Theoretically the iso-codes
+ * XML file might have had additional codes that are now in the hash table.
+ * We keep it simple for now and don't waste memory on additional tables. */
+ for (i = 0; i < G_N_ELEMENTS (iso_639_codes); ++i) {
+ /* we check both codes here, so function can be used in a more versatile
+ * way, to convert a language tag to a two-letter language code and/or
+ * verify an existing code */
+ if (strcmp (lang_code, iso_639_codes[i].iso_639_1) == 0 ||
+ strcmp (lang_code, iso_639_codes[i].iso_639_2) == 0) {
+ c = iso_639_codes[i].iso_639_1;
+ break;
+ }
+ }
+
+ GST_LOG ("%s -> %s", lang_code, GST_STR_NULL (c));
+
+ return c;
+}
+
+static const gchar *
+gst_tag_get_language_code_iso_639_2X (const gchar * lang_code, guint8 flags)
+{
+ int i;
+
+ /* FIXME: we are being a bit inconsistent here in the sense that we will only
+ * map the language codes from our static table. Theoretically the iso-codes
+ * XML file might have had additional codes that are now in the hash table.
+ * We keep it simple for now and don't waste memory on additional tables.
+ * Also, we currently only parse the iso_639.xml file if language names or
+ * a list of all codes is requested, and it'd be nice to keep it like that. */
+ for (i = 0; i < G_N_ELEMENTS (iso_639_codes); ++i) {
+ /* we check both codes here, so function can be used in a more versatile
+ * way, to convert a language tag to a three-letter language code and/or
+ * verify an existing code */
+ if (strcmp (lang_code, iso_639_codes[i].iso_639_1) == 0 ||
+ strcmp (lang_code, iso_639_codes[i].iso_639_2) == 0) {
+ if ((iso_639_codes[i].flags & flags) == flags) {
+ return iso_639_codes[i].iso_639_2;
+ } else if (i > 0 && (iso_639_codes[i - 1].flags & flags) == flags &&
+ iso_639_codes[i].name_offset == iso_639_codes[i - 1].name_offset) {
+ return iso_639_codes[i - 1].iso_639_2;
+ } else if ((i + 1) < G_N_ELEMENTS (iso_639_codes) &&
+ (iso_639_codes[i + 1].flags & flags) == flags &&
+ iso_639_codes[i].name_offset == iso_639_codes[i + 1].name_offset) {
+ return iso_639_codes[i + 1].iso_639_2;
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * gst_tag_get_language_code_iso_639_2T:
+ * @lang_code: ISO-639 language code (e.g. "deu" or "ger" or "de")
+ *
+ * Returns three-letter ISO-639-2 "terminological" language code given a
+ * two-letter ISO-639-1 language code or a three-letter ISO-639-2 language
+ * code (both are accepted for convenience).
+ *
+ * The "terminological" code is derived from the local name of the language
+ * (e.g. "deu" for German instead of "ger"). In most scenarios, the
+ * "terminological" codes are prefered over the "bibliographic" ones.
+ *
+ * Language codes are case-sensitive and expected to be lower case.
+ *
+ * Returns: three-letter ISO-639-2 language code string that maps to @lang_code,
+ * or NULL if no mapping is known. The returned string must not be
+ * modified or freed.
+ *
+ * Since: 0.10.26
+ */
+const gchar *
+gst_tag_get_language_code_iso_639_2T (const gchar * lang_code)
+{
+ const gchar *c;
+
+ g_return_val_if_fail (lang_code != NULL, NULL);
+
+ ensure_debug_category ();
+
+ c = gst_tag_get_language_code_iso_639_2X (lang_code, ISO_639_FLAG_2T);
+
+ GST_LOG ("%s -> %s", lang_code, GST_STR_NULL (c));
+
+ return c;
+}
+
+/**
+ * gst_tag_get_language_code_iso_639_2B:
+ * @lang_code: ISO-639 language code (e.g. "deu" or "ger" or "de")
+ *
+ * Returns three-letter ISO-639-2 "bibliographic" language code given a
+ * two-letter ISO-639-1 language code or a three-letter ISO-639-2 language
+ * code (both are accepted for convenience).
+ *
+ * The "bibliographic" code is derived from the English name of the language
+ * (e.g. "ger" for German instead of "de" or "deu"). In most scenarios, the
+ * "terminological" codes are prefered.
+ *
+ * Language codes are case-sensitive and expected to be lower case.
+ *
+ * Returns: three-letter ISO-639-2 language code string that maps to @lang_code,
+ * or NULL if no mapping is known. The returned string must not be
+ * modified or freed.
+ *
+ * Since: 0.10.26
+ */
+const gchar *
+gst_tag_get_language_code_iso_639_2B (const gchar * lang_code)
+{
+ const gchar *c;
+
+ g_return_val_if_fail (lang_code != NULL, NULL);
+
+ ensure_debug_category ();
+
+ c = gst_tag_get_language_code_iso_639_2X (lang_code, ISO_639_FLAG_2B);
+
+ GST_LOG ("%s -> %s", lang_code, GST_STR_NULL (c));
+
+ return c;
+}
diff --git a/gst-libs/gst/tag/license-translations.dict b/gst-libs/gst/tag/license-translations.dict
new file mode 100644
index 0000000..1fa8ce4
--- /dev/null
+++ b/gst-libs/gst/tag/license-translations.dict
Binary files differ
diff --git a/gst-libs/gst/tag/licenses-tables.dat b/gst-libs/gst/tag/licenses-tables.dat
new file mode 100644
index 0000000..cdf254f
--- /dev/null
+++ b/gst-libs/gst/tag/licenses-tables.dat
@@ -0,0 +1,467 @@
+/* created by mklicensestables.c */
+static const struct {
+ /* jurisdictions in addition to the generic version, bitfield */
+ const guint64 jurisdictions;
+ const GstTagLicenseFlags flags;
+ /* the bit after http://creativecommons.org/licenses/ */
+ const gchar ref[18];
+ gint16 title_idx; /* index in string table */
+ gint16 desc_idx; /* index in string table */
+} licenses[] = {
+ /* 0 http://creativecommons.org/licenses/GPL/2.0/ */
+ { 0x8000000000000000, 0x02000d07, "GPL/2.0/", 0, -1 },
+ /* 1 http://creativecommons.org/licenses/LGPL/2.1/ */
+ { 0x8000000000000000, 0x02000d07, "LGPL/2.1/", 4, -1 },
+ /* 2 http://creativecommons.org/licenses/by-nc-nd/2.0/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/at/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/au/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/be/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/br/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/ca/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/cl/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/de/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/es/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/hr/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/it/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/kr/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/nl/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/pl/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/tw/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/uk/
+ * 2 http://creativecommons.org/licenses/by-nc-nd/2.0/za/
+ * 2 http://creativecommons.org/licenses/by-nd-nc/2.0/jp/ */
+ { 0x8000002c2871a96e, 0x01010303, "by-nc-nd/2.0/", 9, -1 },
+ /* 3 http://creativecommons.org/licenses/by-nc-nd/2.1/au/ */
+ { 0x0000000000000004, 0x01010303, "by-nc-nd/2.1/", 9, -1 },
+ /* 4 http://creativecommons.org/licenses/by-nc-nd/2.1/es/ */
+ { 0x0000000000002000, 0x01010303, "by-nc-nd/2.1/", 9, -1 },
+ /* 5 http://creativecommons.org/licenses/by-nc-nd/2.1/jp/ */
+ { 0x0000000000200000, 0x01010303, "by-nc-nd/2.1/", 9, -1 },
+ /* 6 http://creativecommons.org/licenses/by-nc-nd/2.5/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/ar/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/au/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/bg/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/br/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/ca/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/ch/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/cn/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/co/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/dk/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/es/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/hr/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/hu/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/il/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/in/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/it/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/mk/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/mt/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/mx/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/my/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/nl/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/pe/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/pl/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/pt/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/scotland/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/se/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/si/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/tw/
+ * 6 http://creativecommons.org/licenses/by-nc-nd/2.5/za/ */
+ { 0x80000027ff9f36f5, 0x01010303, "by-nc-nd/2.5/", 9, -1 },
+ /* 7 http://creativecommons.org/licenses/by-nc-nd/3.0/
+ * 7 http://creativecommons.org/licenses/by-nc-nd/3.0/us/ */
+ { 0x8000001000000000, 0x01010303, "by-nc-nd/3.0/", 9, -1 },
+ /* 8 http://creativecommons.org/licenses/by-nc-sa/1.0/
+ * 8 http://creativecommons.org/licenses/by-nc-sa/1.0/fi/
+ * 8 http://creativecommons.org/licenses/by-nc-sa/1.0/il/
+ * 8 http://creativecommons.org/licenses/by-nc-sa/1.0/nl/ */
+ { 0x8000000008044000, 0x01010707, "by-nc-sa/1.0/", 44, -1 },
+ /* 9 http://creativecommons.org/licenses/by-nc-sa/2.0/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/at/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/au/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/be/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/br/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/ca/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/cl/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/de/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/es/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/hr/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/it/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/jp/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/kr/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/nl/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/pl/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/tw/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/uk/
+ * 9 http://creativecommons.org/licenses/by-nc-sa/2.0/za/ */
+ { 0x8000002c2871a96e, 0x01010707, "by-nc-sa/2.0/", 44, -1 },
+ /* 10 http://creativecommons.org/licenses/by-nc-sa/2.1/au/ */
+ { 0x0000000000000004, 0x01010707, "by-nc-sa/2.1/", 44, -1 },
+ /* 11 http://creativecommons.org/licenses/by-nc-sa/2.1/es/ */
+ { 0x0000000000002000, 0x01010707, "by-nc-sa/2.1/", 44, -1 },
+ /* 12 http://creativecommons.org/licenses/by-nc-sa/2.1/jp/ */
+ { 0x0000000000200000, 0x01010707, "by-nc-sa/2.1/", 44, -1 },
+ /* 13 http://creativecommons.org/licenses/by-nc-sa/2.5/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/ar/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/au/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/bg/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/br/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/ca/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/ch/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/cn/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/co/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/dk/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/es/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/hu/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/il/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/in/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/it/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/mk/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/mt/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/mx/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/my/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/nl/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/pe/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/pl/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/pt/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/se/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/si/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/tw/
+ * 13 http://creativecommons.org/licenses/by-nc-sa/2.5/za/ */
+ { 0x800000277f9f36f5, 0x01010707, "by-nc-sa/2.5/", 44, -1 },
+ /* 14 http://creativecommons.org/licenses/by-nc-sa/2.5/scotland/ */
+ { 0x0000000080000000, 0x01010703, "by-nc-sa/2.5/", 44, -1 },
+ /* 15 http://creativecommons.org/licenses/by-nc-sa/3.0/
+ * 15 http://creativecommons.org/licenses/by-nc-sa/3.0/us/ */
+ { 0x8000001000000000, 0x01010707, "by-nc-sa/3.0/", 44, -1 },
+ /* 16 http://creativecommons.org/licenses/by-nc/1.0/
+ * 16 http://creativecommons.org/licenses/by-nc/1.0/fi/
+ * 16 http://creativecommons.org/licenses/by-nc/1.0/il/
+ * 16 http://creativecommons.org/licenses/by-nc/1.0/nl/ */
+ { 0x8000000008044000, 0x01010307, "by-nc/1.0/", 81, -1 },
+ /* 17 http://creativecommons.org/licenses/by-nc/2.0/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/at/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/au/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/be/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/br/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/ca/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/cl/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/de/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/es/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/fr/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/hr/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/it/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/jp/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/kr/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/nl/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/pl/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/tw/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/uk/
+ * 17 http://creativecommons.org/licenses/by-nc/2.0/za/ */
+ { 0x8000002c2871a96e, 0x01010307, "by-nc/2.0/", 81, -1 },
+ /* 18 http://creativecommons.org/licenses/by-nc/2.1/au/ */
+ { 0x0000000000000004, 0x01010307, "by-nc/2.1/", 81, -1 },
+ /* 19 http://creativecommons.org/licenses/by-nc/2.1/es/ */
+ { 0x0000000000002000, 0x01010307, "by-nc/2.1/", 81, -1 },
+ /* 20 http://creativecommons.org/licenses/by-nc/2.1/jp/ */
+ { 0x0000000000200000, 0x01010307, "by-nc/2.1/", 81, -1 },
+ /* 21 http://creativecommons.org/licenses/by-nc/2.5/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/ar/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/au/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/bg/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/br/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/ca/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/ch/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/cn/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/co/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/dk/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/es/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/hr/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/hu/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/il/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/in/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/it/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/mk/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/mt/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/mx/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/my/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/nl/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/pe/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/pl/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/pt/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/se/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/si/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/tw/
+ * 21 http://creativecommons.org/licenses/by-nc/2.5/za/ */
+ { 0x800000277f9f36f5, 0x01010307, "by-nc/2.5/", 81, -1 },
+ /* 22 http://creativecommons.org/licenses/by-nc/2.5/scotland/ */
+ { 0x0000000080000000, 0x01010303, "by-nc/2.5/", 81, -1 },
+ /* 23 http://creativecommons.org/licenses/by-nc/3.0/
+ * 23 http://creativecommons.org/licenses/by-nc/3.0/us/ */
+ { 0x8000001000000000, 0x01010307, "by-nc/3.0/", 81, -1 },
+ /* 24 http://creativecommons.org/licenses/by-nd-nc/1.0/
+ * 24 http://creativecommons.org/licenses/by-nd-nc/1.0/fi/
+ * 24 http://creativecommons.org/licenses/by-nd-nc/1.0/il/
+ * 24 http://creativecommons.org/licenses/by-nd-nc/1.0/nl/ */
+ { 0x8000000008044000, 0x01010303, "by-nd-nc/1.0/", 107, -1 },
+ /* 25 http://creativecommons.org/licenses/by-nd-nc/2.0/jp/ */
+ { 0x0000000000200000, 0x01010303, "by-nd-nc/2.0/", 107, -1 },
+ /* 26 http://creativecommons.org/licenses/by-nd/1.0/
+ * 26 http://creativecommons.org/licenses/by-nd/1.0/fi/
+ * 26 http://creativecommons.org/licenses/by-nd/1.0/il/
+ * 26 http://creativecommons.org/licenses/by-nd/1.0/nl/ */
+ { 0x8000000008044000, 0x01000303, "by-nd/1.0/", 142, -1 },
+ /* 27 http://creativecommons.org/licenses/by-nd/2.0/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/at/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/au/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/be/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/br/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/ca/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/cl/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/de/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/es/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/fr/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/hr/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/it/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/jp/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/kr/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/nl/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/pl/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/tw/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/uk/
+ * 27 http://creativecommons.org/licenses/by-nd/2.0/za/ */
+ { 0x8000002c2871a96e, 0x01000303, "by-nd/2.0/", 142, -1 },
+ /* 28 http://creativecommons.org/licenses/by-nd/2.1/au/ */
+ { 0x0000000000000004, 0x01000303, "by-nd/2.1/", 142, -1 },
+ /* 29 http://creativecommons.org/licenses/by-nd/2.1/es/ */
+ { 0x0000000000002000, 0x01000303, "by-nd/2.1/", 142, -1 },
+ /* 30 http://creativecommons.org/licenses/by-nd/2.1/jp/ */
+ { 0x0000000000200000, 0x01000303, "by-nd/2.1/", 142, -1 },
+ /* 31 http://creativecommons.org/licenses/by-nd/2.5/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/ar/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/au/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/bg/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/br/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/ca/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/ch/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/cn/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/co/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/dk/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/es/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/hr/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/hu/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/il/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/in/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/it/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/mk/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/mt/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/mx/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/my/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/nl/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/pe/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/pl/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/pt/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/scotland/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/se/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/si/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/tw/
+ * 31 http://creativecommons.org/licenses/by-nd/2.5/za/ */
+ { 0x80000027ff9f36f5, 0x01000303, "by-nd/2.5/", 142, -1 },
+ /* 32 http://creativecommons.org/licenses/by-nd/3.0/
+ * 32 http://creativecommons.org/licenses/by-nd/3.0/us/ */
+ { 0x8000001000000000, 0x01000303, "by-nd/3.0/", 142, -1 },
+ /* 33 http://creativecommons.org/licenses/by-sa/1.0/
+ * 33 http://creativecommons.org/licenses/by-sa/1.0/fi/
+ * 33 http://creativecommons.org/licenses/by-sa/1.0/il/
+ * 33 http://creativecommons.org/licenses/by-sa/1.0/nl/ */
+ { 0x8000000008044000, 0x01000707, "by-sa/1.0/", 163, -1 },
+ /* 34 http://creativecommons.org/licenses/by-sa/2.0/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/at/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/au/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/be/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/br/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/ca/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/cl/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/de/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/es/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/fr/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/hr/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/it/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/jp/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/kr/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/nl/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/pl/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/tw/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/uk/
+ * 34 http://creativecommons.org/licenses/by-sa/2.0/za/ */
+ { 0x8000002c2871a96e, 0x01000707, "by-sa/2.0/", 163, -1 },
+ /* 35 http://creativecommons.org/licenses/by-sa/2.1/au/ */
+ { 0x0000000000000004, 0x01000707, "by-sa/2.1/", 163, -1 },
+ /* 36 http://creativecommons.org/licenses/by-sa/2.1/es/ */
+ { 0x0000000000002000, 0x01000707, "by-sa/2.1/", 163, -1 },
+ /* 37 http://creativecommons.org/licenses/by-sa/2.1/jp/ */
+ { 0x0000000000200000, 0x01000707, "by-sa/2.1/", 163, -1 },
+ /* 38 http://creativecommons.org/licenses/by-sa/2.5/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/ar/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/au/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/bg/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/br/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/ca/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/ch/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/cn/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/co/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/dk/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/es/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/hr/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/hu/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/il/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/in/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/it/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/mk/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/mt/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/mx/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/my/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/nl/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/pe/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/pl/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/pt/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/se/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/si/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/tw/
+ * 38 http://creativecommons.org/licenses/by-sa/2.5/za/ */
+ { 0x800000277f9f36f5, 0x01000707, "by-sa/2.5/", 163, -1 },
+ /* 39 http://creativecommons.org/licenses/by-sa/2.5/scotland/ */
+ { 0x0000000080000000, 0x01000703, "by-sa/2.5/", 163, -1 },
+ /* 40 http://creativecommons.org/licenses/by-sa/3.0/
+ * 40 http://creativecommons.org/licenses/by-sa/3.0/us/ */
+ { 0x8000001000000000, 0x01000707, "by-sa/3.0/", 163, -1 },
+ /* 41 http://creativecommons.org/licenses/by/1.0/
+ * 41 http://creativecommons.org/licenses/by/1.0/fi/
+ * 41 http://creativecommons.org/licenses/by/1.0/il/
+ * 41 http://creativecommons.org/licenses/by/1.0/nl/ */
+ { 0x8000000008044000, 0x01000307, "by/1.0/", 186, 198 },
+ /* 42 http://creativecommons.org/licenses/by/2.0/
+ * 42 http://creativecommons.org/licenses/by/2.0/at/
+ * 42 http://creativecommons.org/licenses/by/2.0/au/
+ * 42 http://creativecommons.org/licenses/by/2.0/be/
+ * 42 http://creativecommons.org/licenses/by/2.0/br/
+ * 42 http://creativecommons.org/licenses/by/2.0/ca/
+ * 42 http://creativecommons.org/licenses/by/2.0/cl/
+ * 42 http://creativecommons.org/licenses/by/2.0/de/
+ * 42 http://creativecommons.org/licenses/by/2.0/es/
+ * 42 http://creativecommons.org/licenses/by/2.0/fr/
+ * 42 http://creativecommons.org/licenses/by/2.0/hr/
+ * 42 http://creativecommons.org/licenses/by/2.0/it/
+ * 42 http://creativecommons.org/licenses/by/2.0/jp/
+ * 42 http://creativecommons.org/licenses/by/2.0/kr/
+ * 42 http://creativecommons.org/licenses/by/2.0/nl/
+ * 42 http://creativecommons.org/licenses/by/2.0/pl/
+ * 42 http://creativecommons.org/licenses/by/2.0/tw/
+ * 42 http://creativecommons.org/licenses/by/2.0/uk/
+ * 42 http://creativecommons.org/licenses/by/2.0/za/ */
+ { 0x8000002c2871a96e, 0x01000307, "by/2.0/", 186, 198 },
+ /* 43 http://creativecommons.org/licenses/by/2.1/au/ */
+ { 0x0000000000000004, 0x01000307, "by/2.1/", 186, 198 },
+ /* 44 http://creativecommons.org/licenses/by/2.1/es/ */
+ { 0x0000000000002000, 0x01000307, "by/2.1/", 186, 198 },
+ /* 45 http://creativecommons.org/licenses/by/2.1/jp/ */
+ { 0x0000000000200000, 0x01000307, "by/2.1/", 186, 198 },
+ /* 46 http://creativecommons.org/licenses/by/2.5/
+ * 46 http://creativecommons.org/licenses/by/2.5/ar/
+ * 46 http://creativecommons.org/licenses/by/2.5/au/
+ * 46 http://creativecommons.org/licenses/by/2.5/bg/
+ * 46 http://creativecommons.org/licenses/by/2.5/br/
+ * 46 http://creativecommons.org/licenses/by/2.5/ca/
+ * 46 http://creativecommons.org/licenses/by/2.5/ch/
+ * 46 http://creativecommons.org/licenses/by/2.5/cn/
+ * 46 http://creativecommons.org/licenses/by/2.5/co/
+ * 46 http://creativecommons.org/licenses/by/2.5/dk/
+ * 46 http://creativecommons.org/licenses/by/2.5/es/
+ * 46 http://creativecommons.org/licenses/by/2.5/hr/
+ * 46 http://creativecommons.org/licenses/by/2.5/hu/
+ * 46 http://creativecommons.org/licenses/by/2.5/il/
+ * 46 http://creativecommons.org/licenses/by/2.5/in/
+ * 46 http://creativecommons.org/licenses/by/2.5/it/
+ * 46 http://creativecommons.org/licenses/by/2.5/mk/
+ * 46 http://creativecommons.org/licenses/by/2.5/mt/
+ * 46 http://creativecommons.org/licenses/by/2.5/mx/
+ * 46 http://creativecommons.org/licenses/by/2.5/my/
+ * 46 http://creativecommons.org/licenses/by/2.5/nl/
+ * 46 http://creativecommons.org/licenses/by/2.5/pe/
+ * 46 http://creativecommons.org/licenses/by/2.5/pl/
+ * 46 http://creativecommons.org/licenses/by/2.5/pt/
+ * 46 http://creativecommons.org/licenses/by/2.5/se/
+ * 46 http://creativecommons.org/licenses/by/2.5/si/
+ * 46 http://creativecommons.org/licenses/by/2.5/tw/
+ * 46 http://creativecommons.org/licenses/by/2.5/za/ */
+ { 0x800000277f9f36f5, 0x01000307, "by/2.5/", 186, 198 },
+ /* 47 http://creativecommons.org/licenses/by/2.5/scotland/ */
+ { 0x0000000080000000, 0x01000303, "by/2.5/", 186, 198 },
+ /* 48 http://creativecommons.org/licenses/by/3.0/
+ * 48 http://creativecommons.org/licenses/by/3.0/us/ */
+ { 0x8000001000000000, 0x01000307, "by/3.0/", 186, 198 },
+ /* 49 http://creativecommons.org/licenses/devnations/2.0/ */
+ { 0x8000000000000000, 0x01020107, "devnations/2.0/", 277, -1 },
+ /* 50 http://creativecommons.org/licenses/nc-sa/1.0/
+ * 50 http://creativecommons.org/licenses/nc-sa/1.0/fi/
+ * 50 http://creativecommons.org/licenses/nc-sa/1.0/nl/ */
+ { 0x8000000008004000, 0x01010507, "nc-sa/1.0/", 296, -1 },
+ /* 51 http://creativecommons.org/licenses/nc-sa/2.0/jp/ */
+ { 0x0000000000200000, 0x01010507, "nc-sa/2.0/", 296, -1 },
+ /* 52 http://creativecommons.org/licenses/nc-sampling+/1.0/
+ * 52 http://creativecommons.org/licenses/nc-sampling+/1.0/tw/ */
+ { 0x8000000400000000, 0x01010307, "nc-sampling+/1.0/", 321, -1 },
+ /* 53 http://creativecommons.org/licenses/nc/1.0/
+ * 53 http://creativecommons.org/licenses/nc/1.0/fi/
+ * 53 http://creativecommons.org/licenses/nc/1.0/nl/ */
+ { 0x8000000008004000, 0x01010107, "nc/1.0/", 349, 363 },
+ /* 54 http://creativecommons.org/licenses/nc/2.0/jp/ */
+ { 0x0000000000200000, 0x01010107, "nc/2.0/", 349, 363 },
+ /* 55 http://creativecommons.org/licenses/nd-nc/1.0/
+ * 55 http://creativecommons.org/licenses/nd-nc/1.0/fi/
+ * 55 http://creativecommons.org/licenses/nd-nc/1.0/nl/ */
+ { 0x8000000008004000, 0x01010103, "nd-nc/1.0/", 547, -1 },
+ /* 56 http://creativecommons.org/licenses/nd-nc/2.0/jp/ */
+ { 0x0000000000200000, 0x01010103, "nd-nc/2.0/", 547, -1 },
+ /* 57 http://creativecommons.org/licenses/nd/1.0/
+ * 57 http://creativecommons.org/licenses/nd/1.0/fi/
+ * 57 http://creativecommons.org/licenses/nd/1.0/nl/ */
+ { 0x8000000008004000, 0x01000103, "nd/1.0/", 570, 579 },
+ /* 58 http://creativecommons.org/licenses/nd/2.0/jp/ */
+ { 0x0000000000200000, 0x01000103, "nd/2.0/", 570, 579 },
+ /* 59 http://creativecommons.org/licenses/publicdomain/ */
+ { 0x8000000000000000, 0x00000007, "publicdomain/", 712, -1 },
+ /* 60 http://creativecommons.org/licenses/sa/1.0/
+ * 60 http://creativecommons.org/licenses/sa/1.0/fi/
+ * 60 http://creativecommons.org/licenses/sa/1.0/nl/ */
+ { 0x8000000008004000, 0x01000507, "sa/1.0/", 726, 737 },
+ /* 61 http://creativecommons.org/licenses/sa/2.0/jp/ */
+ { 0x0000000000200000, 0x01000507, "sa/2.0/", 726, 737 },
+ /* 62 http://creativecommons.org/licenses/sampling+/1.0/
+ * 62 http://creativecommons.org/licenses/sampling+/1.0/br/
+ * 62 http://creativecommons.org/licenses/sampling+/1.0/de/
+ * 62 http://creativecommons.org/licenses/sampling+/1.0/tw/ */
+ { 0x8000000400000820, 0x0100030d, "sampling+/1.0/", 889, -1 },
+ /* 63 http://creativecommons.org/licenses/sampling/1.0/
+ * 63 http://creativecommons.org/licenses/sampling/1.0/br/
+ * 63 http://creativecommons.org/licenses/sampling/1.0/tw/ */
+ { 0x8000000400000020, 0x01000305, "sampling/1.0/", 903, -1 },
+};
+
+static const gchar license_strings[] =
+ "GPL\000LGPL\000Attribution-NonCommercial-NoDerivs\000Attribution-NonComme"
+ "rcial-ShareAlike\000Attribution-NonCommercial\000Attribution-NoDerivs-Non"
+ "Commercial\000Attribution-NoDerivs\000Attribution-ShareAlike\000Attributi"
+ "on\000You must attribute the work in the manner specified by the author o"
+ "r licensor.\000Developing Nations\000NonCommercial-ShareAlike\000NonComme"
+ "rcial Sampling Plus\000NonCommercial\000The licensor permits others to co"
+ "py, distribute and transmit the work. In return, licensees may not use th"
+ "e work for commercial purposes \342\200\224 unless they get the licensor'"
+ "s permission.\000NoDerivs-NonCommercial\000NoDerivs\000The licensor permi"
+ "ts others to copy, distribute and transmit only unaltered copies of the w"
+ "ork \342\200\224 not derivative works based on it.\000Public Domain\000Sh"
+ "areAlike\000The licensor permits others to distribute derivative works on"
+ "ly under the same license or one compatible with the one that governs the"
+ " licensor's work.\000Sampling Plus\000Sampling";
diff --git a/gst-libs/gst/tag/licenses.c b/gst-libs/gst/tag/licenses.c
new file mode 100644
index 0000000..f765cfd
--- /dev/null
+++ b/gst-libs/gst/tag/licenses.c
@@ -0,0 +1,632 @@
+/* GStreamer media licenses utility functions
+ * Copyright (C) 2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gsttaglicenses
+ * @short_description: utility functions for Creative Commons licenses
+ * @see_also: #GstTagList
+ *
+ * Provides information about Creative Commons media licenses, which are
+ * often expressed in media files as a license URI in tags. Also useful
+ * for applications creating media files, in case the user wants to license
+ * the content under a Creative Commons license.
+ */
+
+/* FIXME: add API to check obsolete-ness / replace-by */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "tag.h"
+#include "licenses-tables.dat"
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#define GST_CAT_DEFAULT ensure_debug_category()
+
+static GstDebugCategory *
+ensure_debug_category (void)
+{
+ static gsize cat_gonce = 0;
+
+ if (g_once_init_enter (&cat_gonce)) {
+ gsize cat_done;
+
+ cat_done = (gsize) _gst_debug_category_new ("tag-licenses", 0,
+ "GstTag licenses");
+
+ g_once_init_leave (&cat_gonce, cat_done);
+ }
+
+ return (GstDebugCategory *) cat_gonce;
+}
+
+#else
+
+#define ensure_debug_category() /* NOOP */
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+/* -------------------------------------------------------------------------
+ * Translations
+ * ------------------------------------------------------------------------- */
+
+#ifdef ENABLE_NLS
+static GVariant *
+gst_tag_get_license_translations_dictionary (void)
+{
+ static gsize var_gonce = 0;
+
+ if (g_once_init_enter (&var_gonce)) {
+ const gchar *dict_path;
+ GVariant *var = NULL;
+ GError *err = NULL;
+ gchar *data;
+ gsize len;
+
+ /* for gst-uninstalled */
+ dict_path = g_getenv ("GST_TAG_LICENSE_TRANSLATIONS_DICT");
+
+ if (dict_path == NULL)
+ dict_path = LICENSE_TRANSLATIONS_PATH;
+
+ GST_INFO ("Loading license translations from '%s'", dict_path);
+ if (g_file_get_contents (dict_path, &data, &len, &err)) {
+ var = g_variant_new_from_data (G_VARIANT_TYPE ("a{sa{ss}}"), data, len,
+ TRUE, (GDestroyNotify) g_free, data);
+ } else {
+ GST_WARNING ("Could not load translation dictionary %s", err->message);
+ g_error_free (err);
+ var = g_variant_new_array (G_VARIANT_TYPE ("{sa{ss}}"), NULL, 0);
+ }
+
+ g_once_init_leave (&var_gonce, (gsize) var);
+ }
+
+ return (GVariant *) var_gonce;
+}
+#endif
+
+#ifdef ENABLE_NLS
+
+#if !GLIB_CHECK_VERSION(2,28,0)
+static GVariant *
+gst_g_variant_lookup_value (GVariant * dictionary, const gchar * key,
+ const GVariantType * expected_type)
+{
+ GVariantIter iter;
+ GVariant *entry;
+ GVariant *value;
+
+ GST_ERROR ("here, using fallback");
+
+ g_assert (g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{s*}")));
+ g_assert (expected_type != NULL);
+
+ g_variant_iter_init (&iter, dictionary);
+ while ((entry = g_variant_iter_next_value (&iter))) {
+ GVariant *entry_key;
+ gboolean matches;
+
+ entry_key = g_variant_get_child_value (entry, 0);
+ matches = strcmp (g_variant_get_string (entry_key, NULL), key) == 0;
+ g_variant_unref (entry_key);
+
+ if (matches)
+ break;
+
+ g_variant_unref (entry);
+ }
+
+ if (entry == NULL)
+ return NULL;
+
+ value = g_variant_get_child_value (entry, 1);
+ g_variant_unref (entry);
+
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARIANT)) {
+ GVariant *tmp;
+
+ tmp = g_variant_get_variant (value);
+ g_variant_unref (value);
+
+ if (expected_type && !g_variant_is_of_type (tmp, expected_type)) {
+ g_variant_unref (tmp);
+ tmp = NULL;
+ }
+
+ value = tmp;
+ }
+
+ g_assert (value == NULL || g_variant_is_of_type (value, expected_type));
+
+ return value;
+}
+
+#define g_variant_lookup_value gst_g_variant_lookup_value
+#endif /* !GLIB_CHECK_VERSION(2,28,0) */
+
+static gboolean
+gst_variant_lookup_string_value (GVariant * dict, const gchar * lang,
+ const gchar ** translation)
+{
+ GVariant *trans;
+
+ trans = g_variant_lookup_value (dict, lang, G_VARIANT_TYPE ("s"));
+ if (trans == NULL)
+ return FALSE;
+
+ *translation = g_variant_get_string (trans, NULL);
+ /* string will stay valid */
+ g_variant_unref (trans);
+ GST_TRACE ("Result: '%s' for language '%s'", *translation, lang);
+ return TRUE;
+}
+#endif
+
+static const gchar *
+gst_license_str_translate (const gchar * s)
+{
+#ifdef ENABLE_NLS
+ GVariant *v, *dict, *trans;
+
+ v = gst_tag_get_license_translations_dictionary ();
+ g_assert (v != NULL);
+
+ dict = g_variant_lookup_value (v, s, G_VARIANT_TYPE ("a{ss}"));
+ if (dict != NULL) {
+ const gchar *const *lang;
+ const gchar *env_lang;
+
+ /* for unit tests */
+ if ((env_lang = g_getenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG"))) {
+ if (gst_variant_lookup_string_value (dict, env_lang, &s))
+ GST_TRACE ("Result: '%s' for forced language '%s'", s, env_lang);
+ goto beach;
+ }
+
+ lang = g_get_language_names ();
+ while (lang != NULL && *lang != NULL) {
+ GST_TRACE ("Looking up '%s' for language '%s'", s, *lang);
+ trans = g_variant_lookup_value (dict, *lang, G_VARIANT_TYPE ("s"));
+
+ if (trans != NULL) {
+ s = g_variant_get_string (trans, NULL);
+ /* s will stay valid */
+ g_variant_unref (trans);
+ GST_TRACE ("Result: '%s'", s);
+ break;
+ }
+
+ GST_TRACE ("No result for '%s' for language '%s'", s, *lang);
+ ++lang;
+ }
+
+ beach:
+
+ g_variant_unref (dict);
+ } else {
+ GST_WARNING ("No dict for string '%s'", s);
+ }
+#endif
+
+ return s;
+}
+
+/* -------------------------------------------------------------------------
+ * License handling
+ * ------------------------------------------------------------------------- */
+
+#define CC_LICENSE_REF_PREFIX "http://creativecommons.org/licenses/"
+
+/* is this license 'generic' (and a base for any of the supported
+ * jurisdictions), or jurisdiction-specific only? */
+#define JURISDICTION_GENERIC (G_GUINT64_CONSTANT (1) << 63)
+
+static const gchar jurisdictions[] =
+ "ar\000at\000au\000be\000bg\000br\000ca\000ch\000cl\000cn\000co\000de\000"
+ "dk\000es\000fi\000fr\000hr\000hu\000il\000in\000it\000jp\000kr\000mk\000"
+ "mt\000mx\000my\000nl\000pe\000pl\000pt\000scotland\000se\000si\000tw\000"
+ "uk\000us\000za";
+
+/**
+ * gst_tag_get_licenses:
+ *
+ * Returns a list of known license references (in form of URIs). This is
+ * useful for UIs to build a list of available licenses for tagging purposes
+ * (e.g. to tag an audio track appropriately in a video or audio editor, or
+ * an image in a camera application).
+ *
+ * Returns: NULL-terminated array of license strings. Free with g_strfreev()
+ * when no longer needed.
+ *
+ * Since: 0.10.36
+ */
+gchar **
+gst_tag_get_licenses (void)
+{
+ GPtrArray *arr;
+ int i;
+
+ arr = g_ptr_array_new ();
+ for (i = 0; i < G_N_ELEMENTS (licenses); ++i) {
+ const gchar *jurs;
+ gboolean is_generic;
+ guint64 jbits;
+ gchar *ref;
+
+ jbits = licenses[i].jurisdictions;
+ is_generic = (jbits & JURISDICTION_GENERIC) != 0;
+ if (is_generic) {
+ ref = g_strconcat (CC_LICENSE_REF_PREFIX, licenses[i].ref, NULL);
+ GST_LOG ("Adding %2d %s (generic)", i, ref);
+ g_ptr_array_add (arr, ref);
+ jbits &= ~JURISDICTION_GENERIC;
+ }
+
+ jurs = jurisdictions;
+ while (jbits != 0) {
+ if ((jbits & 1)) {
+ ref = g_strconcat (CC_LICENSE_REF_PREFIX, licenses[i].ref, jurs, "/",
+ NULL);
+ GST_LOG ("Adding %2d %s (%s: %s)", i, ref,
+ (is_generic) ? "derived" : "specific", jurs);
+ g_ptr_array_add (arr, ref);
+ }
+ g_assert (jurs < (jurisdictions + sizeof (jurisdictions)));
+ jurs += strlen (jurs) + 1;
+ jbits >>= 1;
+ }
+ }
+ g_ptr_array_add (arr, NULL);
+ return (gchar **) g_ptr_array_free (arr, FALSE);
+}
+
+static gint
+gst_tag_get_license_idx (const gchar * license_ref, const gchar ** jurisdiction)
+{
+ const gchar *ref, *jur_suffix;
+ int i;
+
+ GST_TRACE ("Looking up '%s'", license_ref);
+
+ if (!g_str_has_prefix (license_ref, CC_LICENSE_REF_PREFIX)) {
+ GST_WARNING ("unknown license prefix in ref '%s'", license_ref);
+ return -1;
+ }
+
+ if (jurisdiction != NULL)
+ *jurisdiction = NULL;
+
+ ref = license_ref + sizeof (CC_LICENSE_REF_PREFIX) - 1;
+ for (i = 0; i < G_N_ELEMENTS (licenses); ++i) {
+ guint64 jbits = licenses[i].jurisdictions;
+ const gchar *jurs, *lref = licenses[i].ref;
+ gsize lref_len = strlen (lref);
+
+ /* table should have "foo/bar/" with trailing slash */
+ g_assert (lref[lref_len - 1] == '/');
+
+ if ((jbits & JURISDICTION_GENERIC)) {
+ GST_TRACE ("[%2d] %s checking generic match", i, licenses[i].ref);
+
+ /* exact match? */
+ if (strcmp (ref, lref) == 0)
+ return i;
+
+ /* exact match but without the trailing slash in ref? */
+ if (strncmp (ref, lref, lref_len - 1) == 0 && ref[lref_len - 1] == '\0')
+ return i;
+ }
+
+ if (!g_str_has_prefix (ref, lref))
+ continue;
+
+ GST_TRACE ("[%2d] %s checking jurisdictions", i, licenses[i].ref);
+
+ jbits &= ~JURISDICTION_GENERIC;
+
+ jur_suffix = ref + lref_len;
+ if (*jur_suffix == '\0')
+ continue;
+
+ jurs = jurisdictions;
+ while (jbits != 0) {
+ guint jur_len = strlen (jurs);
+
+ if ((jbits & 1)) {
+ if (strncmp (jur_suffix, jurs, jur_len) == 0 &&
+ (jur_suffix[jur_len] == '\0' || jur_suffix[jur_len] == '/')) {
+ GST_LOG ("matched %s to %s with jurisdiction %s (idx %d)",
+ license_ref, licenses[i].ref, jurs, i);
+ if (jurisdiction != NULL)
+ *jurisdiction = jurs;
+ return i;
+ }
+ }
+ g_assert (jurs < (jurisdictions + sizeof (jurisdictions)));
+ jurs += jur_len + 1;
+ jbits >>= 1;
+ }
+ }
+
+ GST_WARNING ("unhandled license ref '%s'", license_ref);
+ return -1;
+}
+
+/**
+ * gst_tag_get_license_flags:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the flags of a license, which describe most of the features of
+ * a license in their most general form.
+ *
+ * Returns: the flags of the license, or 0 if the license is unknown
+ *
+ * Since: 0.10.36
+ */
+GstTagLicenseFlags
+gst_tag_get_license_flags (const gchar * license_ref)
+{
+ int idx;
+
+ g_return_val_if_fail (license_ref != NULL, 0);
+
+ idx = gst_tag_get_license_idx (license_ref, NULL);
+ return (idx < 0) ? 0 : licenses[idx].flags;
+}
+
+/**
+ * gst_tag_get_license_nick:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the nick name of a license, which is a short (untranslated) string
+ * such as e.g. "CC BY-NC-ND 2.0 UK".
+ *
+ * Returns: the nick name of the license, or NULL if the license is unknown
+ *
+ * Since: 0.10.36
+ */
+const gchar *
+gst_tag_get_license_nick (const gchar * license_ref)
+{
+ GstTagLicenseFlags flags;
+ const gchar *creator_prefix, *res;
+ gchar *nick, *c;
+
+ g_return_val_if_fail (license_ref != NULL, NULL);
+
+ flags = gst_tag_get_license_flags (license_ref);
+
+ if ((flags & GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE)) {
+ creator_prefix = "CC ";
+ } else if ((flags & GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE)) {
+ creator_prefix = "FSF ";
+ } else if (g_str_has_suffix (license_ref, "publicdomain/")) {
+ creator_prefix = "";
+ } else {
+ return NULL;
+ }
+
+ nick = g_strdup_printf ("%s%s", creator_prefix,
+ license_ref + sizeof (CC_LICENSE_REF_PREFIX) - 1);
+ g_strdelimit (nick, "/", ' ');
+ g_strchomp (nick);
+ for (c = nick; *c != '\0'; ++c)
+ *c = g_ascii_toupper (*c);
+
+ GST_LOG ("%s => nick %s", license_ref, nick);
+ res = g_intern_string (nick); /* for convenience */
+ g_free (nick);
+
+ return res;
+}
+
+/**
+ * gst_tag_get_license_title:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the title of a license, which is a short translated description
+ * of the license's features (generally not very pretty though).
+ *
+ * Returns: the title of the license, or NULL if the license is unknown or
+ * no title is available.
+ *
+ * Since: 0.10.36
+ */
+const gchar *
+gst_tag_get_license_title (const gchar * license_ref)
+{
+ int idx;
+
+ g_return_val_if_fail (license_ref != NULL, NULL);
+
+ idx = gst_tag_get_license_idx (license_ref, NULL);
+
+ if (idx < 0 || licenses[idx].title_idx < 0)
+ return NULL;
+
+ return gst_license_str_translate (&license_strings[licenses[idx].title_idx]);
+}
+
+/**
+ * gst_tag_get_license_description:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the description of a license, which is a translated description
+ * of the license's main features.
+ *
+ * Returns: the description of the license, or NULL if the license is unknown
+ * or a description is not available.
+ *
+ * Since: 0.10.36
+ */
+const gchar *
+gst_tag_get_license_description (const gchar * license_ref)
+{
+ int idx;
+
+ g_return_val_if_fail (license_ref != NULL, NULL);
+
+ idx = gst_tag_get_license_idx (license_ref, NULL);
+
+ if (idx < 0 || licenses[idx].desc_idx < 0)
+ return NULL;
+
+ return gst_license_str_translate (&license_strings[licenses[idx].desc_idx]);
+}
+
+/**
+ * gst_tag_get_license_jurisdiction:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the jurisdiction code of a license. This is usually a two-letter
+ * ISO 3166-1 alpha-2 code, but there is also the special case of Scotland,
+ * for which no code exists and which is thus represented as "scotland".
+ *
+ * Known jurisdictions: ar, at, au, be, bg, br, ca, ch, cl, cn, co, de,
+ * dk, es, fi, fr, hr, hu, il, in, it, jp, kr, mk, mt, mx, my, nl, pe, pl,
+ * pt, scotland, se, si, tw, uk, us, za.
+ *
+ * Returns: the jurisdiction code of the license, or NULL if the license is
+ * unknown or is not specific to a particular jurisdiction.
+ *
+ * Since: 0.10.36
+ */
+const gchar *
+gst_tag_get_license_jurisdiction (const gchar * license_ref)
+{
+ const gchar *jurisdiction;
+ int idx;
+
+ g_return_val_if_fail (license_ref != NULL, NULL);
+
+ idx = gst_tag_get_license_idx (license_ref, &jurisdiction);
+ return (idx < 0) ? NULL : jurisdiction;
+}
+
+/**
+ * gst_tag_get_license_version:
+ * @license_ref: a license reference string in form of a URI,
+ * e.g. "http://creativecommons.org/licenses/by-nc-nd/2.0/"
+ *
+ * Get the version of a license.
+ *
+ * Returns: the version of the license, or NULL if the license is not known or
+ * has no version
+ *
+ * Since: 0.10.36
+ */
+const gchar *
+gst_tag_get_license_version (const gchar * license_ref)
+{
+ int idx;
+
+ g_return_val_if_fail (license_ref != NULL, NULL);
+
+ idx = gst_tag_get_license_idx (license_ref, NULL);
+ if (idx < 0)
+ return NULL;
+
+#define LICENSE_FLAG_CC_OR_FSF \
+ (GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE|\
+ GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE)
+
+ /* e.g. publicdomain isn't versioned */
+ if (!(licenses[idx].flags & LICENSE_FLAG_CC_OR_FSF))
+ return NULL;
+
+ /* KISS for now... */
+ if (strstr (licenses[idx].ref, "/1.0/"))
+ return "1.0";
+ else if (strstr (licenses[idx].ref, "/2.0/"))
+ return "2.0";
+ else if (strstr (licenses[idx].ref, "/2.1/"))
+ return "2.1";
+ else if (strstr (licenses[idx].ref, "/2.5/"))
+ return "2.5";
+ else if (strstr (licenses[idx].ref, "/3.0/"))
+ return "3.0";
+
+ GST_ERROR ("Could not determine version for ref '%s'", license_ref);
+ return NULL;
+}
+
+GType
+gst_tag_license_flags_get_type (void)
+{
+ /* FIXME: we should really be using glib-mkenums for this.. */
+#define C_FLAGS(v) ((guint) v)
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_TAG_LICENSE_PERMITS_REPRODUCTION),
+ "GST_TAG_LICENSE_PERMITS_REPRODUCTION", "permits-reproduction"},
+ {C_FLAGS (GST_TAG_LICENSE_PERMITS_DISTRIBUTION),
+ "GST_TAG_LICENSE_PERMITS_DISTRIBUTION", "permits-distribution"},
+ {C_FLAGS (GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS),
+ "GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS",
+ "permits-derivative-works"},
+ {C_FLAGS (GST_TAG_LICENSE_PERMITS_SHARING),
+ "GST_TAG_LICENSE_PERMITS_SHARING", "permits-sharing"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_NOTICE),
+ "GST_TAG_LICENSE_REQUIRES_NOTICE", "requires-notice"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_ATTRIBUTION),
+ "GST_TAG_LICENSE_REQUIRES_ATTRIBUTION", "requires-attributions"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE),
+ "GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE", "requires-share-alike"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_SOURCE_CODE),
+ "GST_TAG_LICENSE_REQUIRES_SOURCE_CODE", "requires-source-code"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_COPYLEFT),
+ "GST_TAG_LICENSE_REQUIRES_COPYLEFT", "requires-copyleft"},
+ {C_FLAGS (GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT),
+ "GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT",
+ "requires-lesser-copyleft"},
+ {C_FLAGS (GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE),
+ "GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE",
+ "prohibits-commercial-use"},
+ {C_FLAGS (GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE),
+ "GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE",
+ "prohibits-high-income-nation-use"},
+ {C_FLAGS (GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE),
+ "GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE",
+ "creative-commons-license"},
+ {C_FLAGS (GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE),
+ "GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE",
+ "free-software-foundation-license"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstTagLicenseFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
diff --git a/gst-libs/gst/tag/mklangtables.c b/gst-libs/gst/tag/mklangtables.c
new file mode 100644
index 0000000..3a6156f
--- /dev/null
+++ b/gst-libs/gst/tag/mklangtables.c
@@ -0,0 +1,239 @@
+/* GStreamer Language Tag Utility Functions
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* mklangtables.c:
+ * little program that reads iso_639.xml and outputs tables for us as fallback
+ * for when iso-codes are not available or we fail to read the file for some
+ * reason, and so we don't have to parse the xml file just to map codes.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+#include <string.h>
+
+#define ISO_639_XML_PATH ISO_CODES_PREFIX "/share/xml/iso-codes/iso_639.xml"
+
+typedef struct
+{
+ gchar code_1[3]; /* de */
+ gchar code_2t[4]; /* deu */
+ gchar code_2b[4]; /* ger */
+ const gchar *name; /* German */
+ guint name_offset; /* offset into string table */
+} IsoLang;
+
+static GArray *languages = NULL;
+
+static void
+dump_languages (void)
+{
+ GString *names;
+ const char *s;
+ int i, num_escaped;
+
+ g_assert (languages != NULL);
+
+ names = g_string_new ("");
+
+ g_print ("/* generated by " __FILE__ " iso-codes " ISO_CODES_VERSION " */\n");
+ g_print ("\n");
+ g_print ("#include <glib.h>\n");
+ g_print ("\n");
+ g_print ("#define ISO_639_FLAG_2T (1 << 0)\n");
+ g_print ("#define ISO_639_FLAG_2B (1 << 1)\n");
+ g_print ("\n");
+ g_print ("/* *INDENT-OFF* */\n");
+ g_print ("\n");
+ g_print ("static const struct\n");
+ g_print ("{\n");
+ g_print (" const gchar iso_639_1[3];\n");
+ g_print (" const gchar iso_639_2[4];\n");
+ g_print (" guint8 flags;\n");
+ g_print (" guint16 name_offset;\n");
+ g_print ("} iso_639_codes[] = {\n");
+
+ for (i = 0, num_escaped = 0; i < languages->len; ++i) {
+ IsoLang *lang = &g_array_index (languages, IsoLang, i);
+
+ /* For now just print those where there's both a ISO-639-1 and -2 code */
+ if (lang->code_1[0] == '\0')
+ continue;
+
+ /* save current offset */
+ lang->name_offset = names->len;
+
+ /* adjust for fact that \000 is 4 chars now but will take up only 1 later */
+ lang->name_offset -= num_escaped * 3;
+
+ /* append one char at a time, making sure to escape UTF-8 characters */
+ for (s = lang->name; s != NULL && *s != '\0'; ++s) {
+ if (g_ascii_isprint (*s) && *s != '"' && *s != '\\') {
+ g_string_append_c (names, *s);
+ } else {
+ g_string_append_printf (names, "\\%03o", (unsigned char) *s);
+ ++num_escaped;
+ }
+ }
+ g_string_append (names, "\\000");
+ ++num_escaped;
+
+ g_print (" /* %s */\n", lang->name);
+ if (strcmp (lang->code_2b, lang->code_2t) == 0) {
+ g_print (" { \"%s\", \"%s\", ISO_639_FLAG_2T | ISO_639_FLAG_2B, %u },\n",
+ lang->code_1, lang->code_2t, lang->name_offset);
+ } else {
+ /* if 639-2T and 639-2B differ, put 639-2T first */
+ g_print (" { \"%s\", \"%s\", ISO_639_FLAG_2T, %u },\n",
+ lang->code_1, lang->code_2t, lang->name_offset);
+ g_print (" { \"%s\", \"%s\", ISO_639_FLAG_2B, %u },\n",
+ lang->code_1, lang->code_2b, lang->name_offset);
+ }
+ }
+
+ g_print ("};\n");
+ g_print ("\n");
+ g_print ("static const gchar iso_639_names[] =\n");
+ s = names->str;
+ while (s != NULL && *s != '\0') {
+ gchar line[74], *lastesc;
+ guint left;
+
+ left = strlen (s);
+ g_strlcpy (line, s, MIN (left, sizeof (line)));
+ s += sizeof (line) - 1;
+ /* avoid partial escaped codes at the end of a line */
+ if ((lastesc = strrchr (line, '\\')) && strlen (lastesc) < 4) {
+ s -= strlen (lastesc);
+ *lastesc = '\0';
+ }
+ g_print (" \"%s\"", line);
+ if (left < 74)
+ break;
+ g_print ("\n");
+ }
+ g_print (";\n");
+ g_print ("\n");
+ g_print ("/* *INDENT-ON* */\n");
+
+ g_string_free (names, TRUE);
+}
+
+static gboolean
+copy_attribute (gchar * dest, guint dest_len, const gchar ** attr_names,
+ const gchar ** attr_vals, const gchar * needle)
+{
+ while (attr_names != NULL && *attr_names != NULL) {
+ if (strcmp (*attr_names, needle) == 0) {
+ g_strlcpy (dest, *attr_vals, dest_len);
+ return TRUE;
+ }
+ ++attr_names;
+ ++attr_vals;
+ }
+ dest[0] = '\0';
+ return FALSE;
+}
+
+static void
+xml_start_element (GMarkupParseContext * ctx, const gchar * element_name,
+ const gchar ** attr_names, const gchar ** attr_vals,
+ gpointer user_data, GError ** error)
+{
+ gchar name[256];
+ IsoLang lang;
+
+ if (strcmp (element_name, "iso_639_entry") != 0)
+ return;
+
+ copy_attribute (lang.code_1, 3, attr_names, attr_vals, "iso_639_1_code");
+ copy_attribute (lang.code_2t, 4, attr_names, attr_vals, "iso_639_2T_code");
+ copy_attribute (lang.code_2b, 4, attr_names, attr_vals, "iso_639_2B_code");
+
+ copy_attribute (name, sizeof (name), attr_names, attr_vals, "name");
+ lang.name = g_intern_string (name);
+
+ g_array_append_val (languages, lang);
+}
+
+static void
+parse_iso_639_xml (const gchar * data, gsize len)
+{
+ GMarkupParser xml_parser = { xml_start_element, NULL, NULL, NULL, NULL };
+ GMarkupParseContext *ctx;
+ GError *err = NULL;
+
+ g_return_if_fail (g_utf8_validate (data, len, NULL));
+
+ ctx = g_markup_parse_context_new (&xml_parser, 0, NULL, NULL);
+ if (!g_markup_parse_context_parse (ctx, data, len, &err))
+ g_error ("Parsing failed: %s", err->message);
+
+ g_markup_parse_context_free (ctx);
+}
+
+static gint
+languages_sort_func (IsoLang * l1, IsoLang * l2)
+{
+ if (l1 == l2)
+ return 0;
+
+ if (l1->code_1[0] == '\0' && l2->code_1[0] != '\0')
+ return -1;
+
+ return strcmp (l1->code_1, l2->code_1);
+}
+
+int
+main (int argc, char **argv)
+{
+ GMappedFile *f;
+ gchar *xml_data;
+ gsize xml_len;
+
+ f = g_mapped_file_new (ISO_639_XML_PATH, FALSE, NULL);
+ if (f != NULL) {
+ xml_data = (gchar *) g_mapped_file_get_contents (f);
+ xml_len = g_mapped_file_get_length (f);
+ } else {
+ GError *err = NULL;
+
+ if (!g_file_get_contents (ISO_639_XML_PATH, &xml_data, &xml_len, &err))
+ g_error ("Could not read %s: %s", ISO_639_XML_PATH, err->message);
+ }
+
+ languages = g_array_new (FALSE, TRUE, sizeof (IsoLang));
+
+ parse_iso_639_xml (xml_data, xml_len);
+
+ g_array_sort (languages, (GCompareFunc) languages_sort_func);
+
+ dump_languages ();
+
+ g_array_free (languages, TRUE);
+
+ if (f != NULL)
+ g_mapped_file_unref (f);
+ else
+ g_free (xml_data);
+
+ return 0;
+}
diff --git a/gst-libs/gst/tag/mklicensestables.c b/gst-libs/gst/tag/mklicensestables.c
new file mode 100644
index 0000000..66249d9
--- /dev/null
+++ b/gst-libs/gst/tag/mklicensestables.c
@@ -0,0 +1,890 @@
+/* GStreamer License Utility Functions
+ * Copyright (C) 2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* mklicensestables.c:
+ * little program that reads liblicense's license RDF files and outputs tables
+ * with the most important information, so we don't have to parse megabytes
+ * of mostly redundant RDF files to get some basic information (and vendors
+ * don't have to ship it all).
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "tag.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* TODO: we can merge some of the jurisdiction-only license table entries
+ * into one entry with multiple jurisdictions and without the 'generic' flag,
+ * .e.g. by-nc-nd/2.5/es + by-nc-nd/2.5/au => by-nc-nd/2.5/{es,au} */
+
+#define LIBLICENSE_DATA_PREFIX "/usr/share/liblicense/licenses"
+
+static GHashTable *unknown_sources; /* NULL */
+
+static GList *licenses; /* NULL */
+
+/* list of languages used for translations */
+static GList *langs; /* NULL */
+
+/* keep in sync with licenses.c */
+static const gchar jurisdictions[] =
+ "ar\000at\000au\000be\000bg\000br\000ca\000ch\000cl\000cn\000co\000de\000"
+ "dk\000es\000fi\000fr\000hr\000hu\000il\000in\000it\000jp\000kr\000mk\000"
+ "mt\000mx\000my\000nl\000pe\000pl\000pt\000scotland\000se\000si\000tw\000"
+ "uk\000us\000za";
+
+/* keep in sync with gst_tag_get_license_version() */
+static const gchar known_versions[] = "1.0/2.0/2.1/2.5/3.0/";
+
+/* is this license 'generic' (and a base for any of the supported
+ * jurisdictions), or jurisdiction-specific only? */
+#define JURISDICTION_GENERIC (G_GUINT64_CONSTANT (1) << 63)
+
+typedef struct
+{
+ gchar *ref;
+ guint64 jurisdiction;
+ gchar *jurisdiction_suffix; /* if not generic (e.g. "jp/") */
+ gchar *legalcode;
+ gchar *version;
+ gchar *replaced_by;
+ gchar *source;
+
+ GstTagLicenseFlags flags;
+
+ gboolean deprecated;
+
+ GHashTable *titles;
+ GHashTable *descriptions;
+
+ /* for processing */
+ const gchar *cur_lang;
+ gboolean packed_into_source;
+
+ /* list of licenses packed into this one (ie. this is the source of those) */
+ GList *derived;
+} License;
+
+static GstTagLicenseFlags
+ref_to_flag (const gchar * ref)
+{
+ if (strcmp (ref, "http://creativecommons.org/ns#Reproduction") == 0)
+ return GST_TAG_LICENSE_PERMITS_REPRODUCTION;
+ if (strcmp (ref, "http://creativecommons.org/ns#Distribution") == 0)
+ return GST_TAG_LICENSE_PERMITS_DISTRIBUTION;
+ if (strcmp (ref, "http://creativecommons.org/ns#DerivativeWorks") == 0)
+ return GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS;
+ if (strcmp (ref, "http://creativecommons.org/ns#Sharing") == 0)
+ return GST_TAG_LICENSE_PERMITS_SHARING;
+ if (strcmp (ref, "http://creativecommons.org/ns#Notice") == 0)
+ return GST_TAG_LICENSE_REQUIRES_NOTICE;
+ if (strcmp (ref, "http://creativecommons.org/ns#Attribution") == 0)
+ return GST_TAG_LICENSE_REQUIRES_ATTRIBUTION;
+ if (strcmp (ref, "http://creativecommons.org/ns#ShareAlike") == 0)
+ return GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE;
+ if (strcmp (ref, "http://creativecommons.org/ns#SourceCode") == 0)
+ return GST_TAG_LICENSE_REQUIRES_SOURCE_CODE;
+ if (strcmp (ref, "http://creativecommons.org/ns#Copyleft") == 0)
+ return GST_TAG_LICENSE_REQUIRES_COPYLEFT;
+ if (strcmp (ref, "http://creativecommons.org/ns#LesserCopyleft") == 0)
+ return GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT;
+ if (strcmp (ref, "http://creativecommons.org/ns#CommercialUse") == 0)
+ return GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE;
+ if (strcmp (ref, "http://creativecommons.org/ns#HighIncomeNationUse") == 0)
+ return GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE;
+
+ g_error ("Unknown permits/requires/prohibits: %s\n", ref);
+ return 0;
+};
+
+static guint64
+ref_to_jurisdiction (const gchar * ref)
+{
+ const gchar *j = jurisdictions;
+ gchar *jur;
+ guint64 bit = 1;
+
+ jur = g_strdup (ref + strlen ("http://creativecommons.org/international/"));
+ g_strdelimit (jur, "/", '\0');
+ while (j < jurisdictions + sizeof (jurisdictions)) {
+ if (strcmp (j, jur) == 0) {
+ g_free (jur);
+ g_assert (bit != 0 && bit != JURISDICTION_GENERIC);
+ return bit;
+ }
+ j += strlen (j) + 1;
+ bit <<= 1;
+ }
+ g_error ("Unknown jurisdiction '%s'\n", ref);
+}
+
+typedef enum
+{
+ TAG_CC_LICENSE,
+ TAG_CC_JURISDICTION,
+ TAG_CC_LEGALCODE,
+ TAG_CC_PROHIBITS,
+ TAG_CC_REQUIRES,
+ TAG_CC_PERMITS,
+ TAG_CC_DEPRECATED_ON,
+ TAG_DC_CREATOR,
+ TAG_DC_SOURCE,
+ TAG_DC_TITLE,
+ TAG_DC_DESCRIPTION,
+ TAG_DCQ_HAS_VERSION,
+ TAG_DCQ_IS_REPLACED_BY,
+ TAG_RDF_RDF,
+ TAG_RDF_DESCRIPTION,
+} Tag;
+
+static const struct
+{
+ const gchar *element_name;
+ const gchar *attribute;
+ const Tag element_tag;
+} tag_map[] = {
+ {
+ "cc:License", "rdf:about", TAG_CC_LICENSE}, {
+ "cc:deprecatedOn", "rdf:datatype", TAG_CC_DEPRECATED_ON}, {
+ "cc:jurisdiction", "rdf:resource", TAG_CC_JURISDICTION}, {
+ "cc:legalcode", "rdf:resource", TAG_CC_LEGALCODE}, {
+ "cc:prohibits", "rdf:resource", TAG_CC_PROHIBITS}, {
+ "cc:requires", "rdf:resource", TAG_CC_REQUIRES}, {
+ "cc:permits", "rdf:resource", TAG_CC_PERMITS}, {
+ "dc:creator", "rdf:resource", TAG_DC_CREATOR}, {
+ "dc:source", "rdf:resource", TAG_DC_SOURCE}, {
+ "dc:title", "xml:lang", TAG_DC_TITLE}, {
+ "dc:description", "xml:lang", TAG_DC_DESCRIPTION}, {
+ "dcq:hasVersion", NULL, TAG_DCQ_HAS_VERSION}, {
+ "dcq:isReplacedBy", "rdf:resource", TAG_DCQ_IS_REPLACED_BY}, {
+ "rdf:RDF", NULL, TAG_RDF_RDF}, {
+ "rdf:Description", "rdf:about", TAG_RDF_DESCRIPTION},
+ /* these three are just for by-nc-nd_2.0_jp_.rdf */
+ {
+ "dc:isBasedOn", "rdf:resource", TAG_DC_SOURCE}, {
+ "dc:hasVersion", NULL, TAG_DCQ_HAS_VERSION}, {
+ "dc:isReplacedBy", "rdf:resource", TAG_DCQ_IS_REPLACED_BY}
+};
+
+static void
+parse_start (GMarkupParseContext * ctx, const gchar * element_name,
+ const gchar ** attr_names, const gchar ** attr_vals,
+ gpointer user_data, GError ** err)
+{
+ License *license = user_data;
+ const gchar *ref = NULL;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (tag_map); ++i) {
+ if (strcmp (element_name, tag_map[i].element_name) == 0)
+ break;
+ }
+
+ if (i == G_N_ELEMENTS (tag_map))
+ g_error ("Unexpected tag '%s'\n", element_name);
+
+ if (tag_map[i].attribute == NULL)
+ return;
+
+ if (!g_markup_collect_attributes (element_name, attr_names, attr_vals,
+ err, G_MARKUP_COLLECT_STRING, tag_map[i].attribute, &ref,
+ G_MARKUP_COLLECT_INVALID)) {
+ return;
+ }
+
+ switch (tag_map[i].element_tag) {
+ case TAG_CC_LICENSE:
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/licenses/"))
+ g_error ("Unexpected license reference: %s\n", ref);
+ /* we assume one license per file, and CC license ref */
+ g_assert (license->ref == NULL);
+ license->ref = g_strdup (ref);
+ break;
+ case TAG_CC_JURISDICTION:
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/international/"))
+ g_error ("Unknown license jurisdiction: %s\n", ref);
+ /* we assume one jurisdiction per license */
+ g_assert (license->jurisdiction == JURISDICTION_GENERIC);
+ license->jurisdiction = ref_to_jurisdiction (ref);
+ license->jurisdiction_suffix =
+ g_strdup (ref + strlen ("http://creativecommons.org/international/"));
+ break;
+ case TAG_CC_LEGALCODE:
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/licenses/"))
+ g_error ("Unexpected legalcode reference: %s\n", ref);
+ /* we assume one legalcode per license */
+ g_assert (license->legalcode == NULL);
+ license->legalcode = g_strdup (ref);
+ break;
+ case TAG_DC_CREATOR:
+ if (strcmp (ref, "http://creativecommons.org") == 0) {
+ license->flags |= GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE;
+ } else if (strcmp (ref, "http://fsf.org") == 0) {
+ license->flags |= GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE;
+ } else {
+ g_error ("Unknown license creator: %s\n", ref);
+ }
+ break;
+ case TAG_CC_DEPRECATED_ON:
+ break;
+ case TAG_CC_PROHIBITS:
+ case TAG_CC_REQUIRES:
+ case TAG_CC_PERMITS:
+ license->flags |= ref_to_flag (ref);
+ break;
+ case TAG_DC_TITLE:{
+ gchar *cur_lang;
+
+ cur_lang = g_strdelimit (g_strdup (ref), "-", '_');
+ license->cur_lang = g_intern_string (cur_lang);
+ if (!g_list_find_custom (langs, cur_lang, (GCompareFunc) strcmp))
+ langs = g_list_prepend (langs, (gpointer) license->cur_lang);
+
+ g_free (cur_lang);
+ break;
+ }
+ case TAG_DC_DESCRIPTION:{
+ gchar *cur_lang;
+
+ cur_lang = g_strdelimit (g_strdup (ref), "-", '_');
+ license->cur_lang = g_intern_string (cur_lang);
+ if (!g_list_find_custom (langs, cur_lang, (GCompareFunc) strcmp))
+ langs = g_list_prepend (langs, (gpointer) license->cur_lang);
+
+ g_free (cur_lang);
+ break;
+ }
+ case TAG_DCQ_IS_REPLACED_BY:
+ /* we assume one replacer per license for now */
+ g_assert (license->replaced_by == NULL);
+ license->replaced_by = g_strdup (ref);
+ break;
+ case TAG_RDF_DESCRIPTION:
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/licenses/"))
+ g_error ("Unexpected license reference: %s\n", ref);
+ if (license->ref != NULL && strcmp (license->ref, ref) != 0) {
+ gchar *f, *r = g_strdup (ref);
+
+ /* work around bug in some of the RDFs ... */
+ if ((f = strstr (r, "by-nc-nd"))) {
+ memcpy (f, "by-nd-nc", 8);
+ }
+ if (strcmp (license->ref, r) != 0) {
+ g_error ("rdf:Description chunk for other than current license");
+ }
+ g_free (r);
+ }
+ break;
+ case TAG_DC_SOURCE:
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/licenses/"))
+ g_error ("Unexpected source reference: %s\n", ref);
+ /* we assume one source (for jurisdiction-specific versions) */
+ g_assert (license->source == NULL);
+ license->source = g_strdup (ref);
+ break;
+ default:
+ g_printerr ("unhandled start tag: %s\n", element_name);
+ break;
+ }
+}
+
+static void
+parse_text (GMarkupParseContext * ctx, const gchar * text, gsize text_len,
+ gpointer user_data, GError ** err)
+{
+ License *license = user_data;
+ const gchar *element_name, *found;
+ int i;
+
+ element_name = g_markup_parse_context_get_element (ctx);
+ for (i = 0; i < G_N_ELEMENTS (tag_map); ++i) {
+ if (strcmp (element_name, tag_map[i].element_name) == 0)
+ break;
+ }
+
+ if (i == G_N_ELEMENTS (tag_map))
+ g_error ("Unexpected tag '%s'\n", element_name);
+
+ switch (tag_map[i].element_tag) {
+ case TAG_CC_LICENSE:
+ case TAG_CC_JURISDICTION:
+ case TAG_CC_LEGALCODE:
+ case TAG_DC_CREATOR:
+ case TAG_CC_PROHIBITS:
+ case TAG_CC_REQUIRES:
+ case TAG_CC_PERMITS:
+ case TAG_RDF_RDF:
+ case TAG_RDF_DESCRIPTION:
+ break;
+ case TAG_DC_TITLE:
+ if (license->titles == NULL) {
+ license->titles = g_hash_table_new (g_str_hash, g_str_equal);
+ }
+ g_hash_table_insert (license->titles, (gpointer) license->cur_lang,
+ (gpointer) g_intern_string (text));
+ break;
+ case TAG_DC_DESCRIPTION:{
+ gchar *txt = g_strdup (text);
+
+ if (license->descriptions == NULL) {
+ license->descriptions = g_hash_table_new (g_str_hash, g_str_equal);
+ }
+ g_strdelimit (txt, "\n", ' ');
+ g_hash_table_insert (license->descriptions, (gpointer) license->cur_lang,
+ (gpointer) g_intern_string (txt));
+ g_free (txt);
+ break;
+ }
+ case TAG_DCQ_HAS_VERSION:
+ /* we assume one version per license */
+ g_assert (license->version == NULL);
+ license->version = g_strdup (text);
+ found = strstr (known_versions, license->version);
+ if (found == NULL || found[strlen (license->version)] != '/')
+ g_error ("Unexpected version '%s', please add to table.", text);
+ break;
+ case TAG_CC_DEPRECATED_ON:
+ license->deprecated = TRUE;
+ break;
+ case TAG_DC_SOURCE: // FIXME
+ default:
+ g_print ("text (%s) (%s): '%s'\n", element_name, license->cur_lang, text);
+ }
+}
+
+static void
+parse_passthrough (GMarkupParseContext * ctx, const gchar * text, gsize len,
+ gpointer user_data, GError ** err)
+{
+ if (!g_str_has_prefix (text, "<?xml ")) {
+ g_error ("Unexpected passthrough text: %s\n", text);
+ }
+}
+
+static void
+parse_error (GMarkupParseContext * ctx, GError * err, gpointer data)
+{
+ g_error ("parse error: %s\n", err->message);
+}
+
+static const GMarkupParser license_rdf_parser = {
+ parse_start, NULL, parse_text, parse_passthrough, parse_error
+};
+
+static void
+parse_license_rdf (const gchar * fn, const gchar * rdf)
+{
+ GMarkupParseContext *ctx;
+ License *license;
+ GError *err = NULL;
+
+ if (!g_utf8_validate (rdf, -1, NULL)) {
+ g_error ("%s is not valid UTF-8\n", fn);
+ }
+
+ license = g_new0 (License, 1);
+
+ /* mark as generic until proven otherwise */
+ license->jurisdiction = JURISDICTION_GENERIC;
+
+ ctx = g_markup_parse_context_new (&license_rdf_parser,
+ G_MARKUP_TREAT_CDATA_AS_TEXT, license, NULL);
+
+ /* g_print ("Parsing %s\n", fn); */
+
+ if (!g_markup_parse_context_parse (ctx, rdf, -1, &err)) {
+ g_error ("Error parsing file %s: %s\n", fn, err->message);
+ }
+
+ licenses = g_list_append (licenses, license);
+
+ g_markup_parse_context_free (ctx);
+}
+
+static void
+read_licenses (const gchar * licenses_dir)
+{
+ const gchar *name;
+ GError *err = NULL;
+ GDir *dir;
+
+ dir = g_dir_open (licenses_dir, 0, &err);
+
+ if (dir == NULL)
+ g_error ("Failed to g_dir_open('%s'): %s", licenses_dir, err->message);
+
+ while ((name = g_dir_read_name (dir))) {
+ gchar *fn, *rdf;
+
+ fn = g_build_filename (licenses_dir, name, NULL);
+ if (g_file_get_contents (fn, &rdf, NULL, &err)) {
+ parse_license_rdf (fn, rdf);
+ g_free (rdf);
+ } else {
+ g_printerr ("Could not read file '%s': %s\n", fn, err->message);
+ g_error_free (err);
+ err = NULL;
+ }
+ g_free (fn);
+ }
+
+ g_dir_close (dir);
+}
+
+static License *
+find_license (const gchar * ref)
+{
+ GList *l;
+
+ if (!g_str_has_prefix (ref, "http://creativecommons.org/"))
+ return NULL;
+
+ for (l = licenses; l != NULL; l = l->next) {
+ License *license = l->data;
+
+ if (strcmp (license->ref, ref) == 0)
+ return license;
+ }
+
+ return NULL;
+}
+
+static int
+license_ref_cmp (License * a, License * b)
+{
+ return strcmp (a->ref, b->ref);
+}
+
+#define STRING_TABLE_MAX_STRINGS 100
+typedef struct
+{
+ GString *s;
+ guint num_escaped;
+ guint num_strings;
+ guint indices[STRING_TABLE_MAX_STRINGS];
+ gchar *strings[STRING_TABLE_MAX_STRINGS]; /* unescaped strings */
+} StringTable;
+
+static StringTable *
+string_table_new (void)
+{
+ StringTable *t = g_new0 (StringTable, 1);
+
+ t->s = g_string_new (NULL);
+ return t;
+}
+
+static void
+string_table_free (StringTable * t)
+{
+ int i;
+
+ for (i = 0; i < t->num_strings; ++i)
+ g_free (t->strings[i]);
+
+ g_string_free (t->s, TRUE);
+ g_free (t);
+}
+
+static guint
+string_table_add_string (StringTable * t, const gchar * str)
+{
+ const gchar *s;
+ guint idx, i;
+
+ /* check if we already have this string */
+ for (i = 0; i < t->num_strings; ++i) {
+ if (strcmp (t->strings[i], str) == 0)
+ return t->indices[i];
+ }
+
+ /* save current offset */
+ idx = t->s->len;
+
+ /* adjust for fact that \000 is 4 chars now but will take up only 1 later */
+ idx -= t->num_escaped * 3;
+
+ /* append one char at a time, making sure to escape UTF-8 characters */
+ for (s = str; s != NULL && *s != '\0'; ++s) {
+ if (g_ascii_isprint (*s) && *s != '"' && *s != '\\') {
+ g_string_append_c (t->s, *s);
+ } else {
+ g_string_append_printf (t->s, "\\%03o", (unsigned char) *s);
+ t->num_escaped++;
+ }
+ }
+ g_string_append (t->s, "\\000");
+ t->num_escaped++;
+
+ t->indices[t->num_strings] = idx;
+ t->strings[t->num_strings] = g_strdup (str);
+ ++t->num_strings;
+
+ return idx;
+}
+
+static void
+string_table_print (StringTable * t)
+{
+ const gchar *s;
+
+ s = t->s->str;
+ while (s != NULL && *s != '\0') {
+ gchar line[74], *lastesc;
+ guint left;
+
+ left = strlen (s);
+ g_strlcpy (line, s, MIN (left, sizeof (line)));
+ s += sizeof (line) - 1;
+ /* avoid partial escaped codes at the end of a line */
+ if ((lastesc = strrchr (line, '\\')) && strlen (lastesc) < 4) {
+ s -= strlen (lastesc);
+ *lastesc = '\0';
+ }
+ g_print (" \"%s\"", line);
+ if (left < 74)
+ break;
+ g_print ("\n");
+ }
+ g_print (";\n");
+}
+
+/* skip translation if translated string for e.g. "fr_ca" is same as for "fr" */
+static gboolean
+skip_translation (GHashTable * ht_strings, const gchar * lang,
+ const gchar * trans)
+{
+ const gchar *simple_trans;
+ gchar *simple_lang;
+
+ if (strchr (lang, '_') == NULL)
+ return FALSE;
+
+ simple_lang = g_strdup (lang);
+ g_strdelimit (simple_lang, "_", '\0');
+
+ simple_trans = g_hash_table_lookup (ht_strings, (gpointer) simple_lang);
+ g_free (simple_lang);
+
+ return (simple_trans != NULL && strcmp (trans, simple_trans) == 0);
+}
+
+static GVariant *
+create_translation_dict (GHashTable * ht_strings, const gchar * en)
+{
+ GVariantBuilder array;
+ guint count = 0;
+ GList *l;
+
+ g_variant_builder_init (&array, G_VARIANT_TYPE_ARRAY);
+
+ for (l = langs; l != NULL; l = l->next) {
+ const gchar *trans, *lang;
+
+ lang = (const gchar *) l->data;
+ trans = g_hash_table_lookup (ht_strings, (gpointer) lang);
+ if (trans != NULL && *trans != '\0' && strcmp (en, trans) != 0 &&
+ !skip_translation (ht_strings, lang, trans)) {
+ /* g_print ("%s (%s) => %s\n", en, lang, trans); */
+ g_variant_builder_add_value (&array,
+ g_variant_new_dict_entry (g_variant_new_string (lang),
+ g_variant_new_string (trans)));
+ ++count;
+ }
+ }
+
+ if (count == 0) {
+ g_variant_builder_clear (&array);
+ return NULL;
+ }
+
+ return g_variant_builder_end (&array);
+}
+
+static void
+write_translations_dictionary (GList * licenses, const gchar * dict_filename)
+{
+ /* maps C string => (dictionary of: locale => translation) */
+ GVariantBuilder array;
+ /* maps C string => boolean (if it's in the dictionary already */
+ GHashTable *translations;
+ GVariant *var;
+ GList *l;
+ FILE *f;
+
+ /* sort langs for prettiness / to make variant dumps easier to read */
+ langs = g_list_sort (langs, (GCompareFunc) strcmp);
+
+ g_variant_builder_init (&array, G_VARIANT_TYPE_ARRAY);
+
+ translations = g_hash_table_new (g_str_hash, g_str_equal);
+
+ for (l = licenses; l != NULL; l = l->next) {
+ const gchar *en;
+ License *license;
+
+ license = l->data;
+
+ if (license->packed_into_source)
+ continue;
+
+ /* add title + translations */
+ en = g_hash_table_lookup (license->titles, "en");
+ g_assert (en != NULL);
+
+ /* check if we already have added translations for this string */
+ if (!g_hash_table_lookup (translations, (gpointer) en)) {
+ GVariant *trans;
+
+ trans = create_translation_dict (license->titles, en);
+ if (trans != NULL) {
+ g_variant_builder_add_value (&array,
+ g_variant_new_dict_entry (g_variant_new_string (en), trans));
+ g_hash_table_insert (translations, (gpointer) en,
+ GINT_TO_POINTER (TRUE));
+ }
+ }
+
+ /* add description + translations */
+ if (license->descriptions == NULL)
+ continue;
+
+ en = g_hash_table_lookup (license->descriptions, "en");
+ g_assert (en != NULL);
+
+ /* check if we already have added translations for this string */
+ if (!g_hash_table_lookup (translations, (gpointer) en)) {
+ GVariant *trans;
+
+ trans = create_translation_dict (license->descriptions, en);
+ if (trans != NULL) {
+ g_variant_builder_add_value (&array,
+ g_variant_new_dict_entry (g_variant_new_string (en), trans));
+ g_hash_table_insert (translations, (gpointer) en,
+ GINT_TO_POINTER (TRUE));
+ }
+ }
+ }
+
+ var = g_variant_builder_end (&array);
+
+ f = fopen (dict_filename, "wb");
+ if (fwrite (g_variant_get_data (var), g_variant_get_size (var), 1, f) != 1) {
+ g_error ("failed to write dict to file: %s", g_strerror (errno));
+ }
+ fclose (f);
+
+ g_printerr ("Wrote dictionary to %s, size: %u, type: %s\n", dict_filename,
+ (guint) g_variant_get_size (var), (gchar *) g_variant_get_type (var));
+
+ g_variant_unref (var);
+ g_hash_table_destroy (translations);
+}
+
+int
+main (int argc, char **argv)
+{
+ gchar *translation_dict_fn = NULL;
+ GOptionContext *ctx;
+ GOptionEntry options[] = {
+ {"translation-dictionary", 0, 0, G_OPTION_ARG_FILENAME,
+ &translation_dict_fn, "Filename of translations dictionary to write",
+ NULL},
+ {NULL}
+ };
+ StringTable *string_table;
+ GError *err = NULL;
+ GList *l;
+ int idx = 0;
+
+ g_type_init ();
+
+ ctx = g_option_context_new ("");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_printerr ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+ g_option_context_free (ctx);
+
+ read_licenses (LIBLICENSE_DATA_PREFIX);
+
+ g_printerr ("%d licenses\n", g_list_length (licenses));
+
+ unknown_sources = g_hash_table_new (g_str_hash, g_str_equal);
+
+ for (l = licenses; l != NULL; l = l->next) {
+ License *license = l->data;
+
+ /* if the license has as source, check if we can 'pack' it into the
+ * original license as a jurisdiction-specific variant */
+ if (license->source != NULL) {
+ License *source = find_license (license->source);
+
+ if (source != NULL) {
+ if (source->flags != license->flags) {
+ g_printerr ("Source and derived license have different flags:\n"
+ "\t0x%08x : %s\n\t0x%08x : %s\n", source->flags, source->ref,
+ license->flags, license->ref);
+ source = NULL;
+ } else {
+ if (source->descriptions == NULL) {
+ /* neither should the derived one then */
+ g_assert (license->descriptions == NULL);
+ } else {
+ /* make sure we're not settling for fewer descriptions than
+ * there are */
+ g_assert (g_hash_table_size (license->titles) <=
+ g_hash_table_size (source->titles));
+ g_assert (g_hash_table_size (license->descriptions) <=
+ g_hash_table_size (source->descriptions));
+ }
+ }
+ } else {
+ /* a source is referenced that we haven't encountered
+ * (possibly a referencing bug? seems to happen e.g. when there's a
+ * 2.1 version of a jurisdiction license and it refers to a 2.1
+ * source version, but there's only a 2.0 or 2.5 source version. So
+ * maybe it's supposed to refer to the 2.0 source then, who knows) */
+ if (!g_hash_table_lookup (unknown_sources, license->source)) {
+ g_printerr ("Unknown source license %s\n", license->source);
+ g_hash_table_insert (unknown_sources, g_strdup (license->source),
+ GUINT_TO_POINTER (TRUE));
+ }
+ /* g_print ("Unknown source license %s referenced from %s\n",
+ * license->source, license->ref); */
+ }
+
+ /* should we pack this into the source or not */
+ if (source != NULL) {
+ source->jurisdiction |= license->jurisdiction;
+ source->derived = g_list_insert_sorted (source->derived, license,
+ (GCompareFunc) license_ref_cmp);
+ license->packed_into_source = TRUE;
+ }
+ } else {
+ /* no source license */
+ if (license->titles == NULL)
+ g_error ("License has no titles: %s\n", license->ref);
+ if (license->descriptions == NULL);
+ g_printerr ("License %s has no descriptions!\n", license->ref);
+ }
+ }
+
+ licenses = g_list_sort (licenses, (GCompareFunc) license_ref_cmp);
+
+ string_table = string_table_new ();
+
+ g_print ("/* created by mklicensestables.c */\n");
+ g_print ("static const struct {\n"
+ " /* jurisdictions in addition to the generic version, bitfield */\n"
+ " const guint64 jurisdictions;\n"
+ " const GstTagLicenseFlags flags;\n"
+ " /* the bit after http://creativecommons.org/licenses/ */\n"
+ " const gchar ref[18];\n"
+ " gint16 title_idx; /* index in string table */\n"
+ " gint16 desc_idx; /* index in string table */\n"
+ "} licenses[] = {\n");
+
+ for (l = licenses; l != NULL; l = l->next) {
+ const gchar *title_en, *desc_en;
+ int idx_title, idx_desc;
+ License *license;
+
+ license = l->data;
+
+ if (license->packed_into_source)
+ continue;
+
+ title_en = g_hash_table_lookup (license->titles, "en");
+ g_assert (title_en != NULL);
+ idx_title = string_table_add_string (string_table, title_en);
+ g_assert (idx_title <= G_MAXINT16);
+
+ if (license->descriptions != NULL) {
+ desc_en = g_hash_table_lookup (license->descriptions, "en");
+ g_assert (desc_en != NULL);
+ idx_desc = string_table_add_string (string_table, desc_en);
+ g_assert (idx_desc <= G_MAXINT16);
+ } else {
+ idx_desc = -1;
+ }
+
+ /* output comments with license refs covered by the next stanza */
+ if (license->derived != NULL) {
+ GList *d;
+
+ g_print (" /* %2d %s\n", idx, license->ref);
+
+ for (d = license->derived; d != NULL; d = d->next) {
+ License *derived_license = d->data;
+
+ g_print (" * %2d %s%s\n", idx, derived_license->ref,
+ (d->next == NULL) ? " */" : "");
+ }
+ } else {
+ g_print (" /* %2d %s */\n", idx, license->ref);
+ }
+ /* output essential data */
+ {
+ gchar *ref;
+
+ ref =
+ g_strdup (license->ref +
+ strlen ("http://creativecommons.org/licenses/"));
+
+ /* remove jurisdiction suffix from ref if this is non-generic, since
+ * the suffix is already contained in the jurisdiction flags */
+ if (license->jurisdiction_suffix != NULL) {
+ gsize suffix_len = strlen (license->jurisdiction_suffix);
+ gchar *cutoff;
+
+ cutoff = ref + strlen (ref) - suffix_len;
+ g_assert (!strncmp (cutoff, license->jurisdiction_suffix, suffix_len));
+ g_assert (cutoff[suffix_len - 1] == '/');
+ g_assert (cutoff[suffix_len] == '\0');
+ *cutoff = '\0';
+ }
+
+ g_print (" { 0x%016" G_GINT64_MODIFIER "x, 0x%08x, \"%s\", %d, %d }%s\n",
+ license->jurisdiction, license->flags, ref, idx_title, idx_desc,
+ (l->next != NULL) ? "," : "");
+
+ g_free (ref);
+ }
+ ++idx;
+ }
+ g_print ("};\n");
+
+ g_print ("\nstatic const gchar license_strings[] =\n");
+ string_table_print (string_table);
+ string_table_free (string_table);
+ string_table = NULL;
+
+ if (translation_dict_fn != NULL) {
+ write_translations_dictionary (licenses, translation_dict_fn);
+ }
+
+ return 0;
+}
diff --git a/gst-libs/gst/tag/tag.h b/gst-libs/gst/tag/tag.h
new file mode 100644
index 0000000..69a3ba4
--- /dev/null
+++ b/gst-libs/gst/tag/tag.h
@@ -0,0 +1,650 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * Copyright (C) 2006-2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TAG_TAG_H__
+#define __GST_TAG_TAG_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* Tag names */
+
+/**
+ * GST_TAG_MUSICBRAINZ_TRACKID
+ *
+ * MusicBrainz track ID
+ */
+#define GST_TAG_MUSICBRAINZ_TRACKID "musicbrainz-trackid"
+/**
+ * GST_TAG_MUSICBRAINZ_ARTISTID
+ *
+ * MusicBrainz artist ID
+ */
+#define GST_TAG_MUSICBRAINZ_ARTISTID "musicbrainz-artistid"
+/**
+ * GST_TAG_MUSICBRAINZ_ALBUMID
+ *
+ * MusicBrainz album ID
+ */
+#define GST_TAG_MUSICBRAINZ_ALBUMID "musicbrainz-albumid"
+/**
+ * GST_TAG_MUSICBRAINZ_ALBUMARTISTID
+ *
+ * MusicBrainz album artist ID
+ */
+#define GST_TAG_MUSICBRAINZ_ALBUMARTISTID "musicbrainz-albumartistid"
+/**
+ * GST_TAG_MUSICBRAINZ_TRMID
+ *
+ * MusicBrainz track TRM ID
+ */
+#define GST_TAG_MUSICBRAINZ_TRMID "musicbrainz-trmid"
+
+/* FIXME 0.11: remove GST_TAG_MUSICBRAINZ_SORTNAME */
+#ifndef GST_DISABLE_DEPRECATED
+/**
+ * GST_TAG_MUSICBRAINZ_SORTNAME
+ *
+ * MusicBrainz artist sort name
+ *
+ * Deprecated. Use GST_TAG_ARTIST_SORTNAME instead.
+ */
+#define GST_TAG_MUSICBRAINZ_SORTNAME GST_TAG_ARTIST_SORTNAME
+#endif
+
+/**
+ * GST_TAG_CMML_STREAM
+ *
+ * Annodex CMML stream element tag
+ */
+#define GST_TAG_CMML_STREAM "cmml-stream"
+/**
+ * GST_TAG_CMML_HEAD
+ *
+ * Annodex CMML head element tag
+ */
+
+#define GST_TAG_CMML_HEAD "cmml-head"
+/**
+ * GST_TAG_CMML_CLIP
+ *
+ * Annodex CMML clip element tag
+ */
+#define GST_TAG_CMML_CLIP "cmml-clip"
+
+/* CDDA tags */
+
+/**
+ * GST_TAG_CDDA_CDDB_DISCID:
+ *
+ * CDDB disc id in its short form (e.g. 'aa063d0f')
+ */
+#define GST_TAG_CDDA_CDDB_DISCID "discid"
+
+/**
+ * GST_TAG_CDDA_CDDB_DISCID_FULL:
+ *
+ * CDDB disc id including all details
+ */
+#define GST_TAG_CDDA_CDDB_DISCID_FULL "discid-full"
+
+/**
+ * GST_TAG_CDDA_MUSICBRAINZ_DISCID:
+ *
+ * Musicbrainz disc id (e.g. 'ahg7JUcfR3vCYBphSDIogOOWrr0-')
+ */
+#define GST_TAG_CDDA_MUSICBRAINZ_DISCID "musicbrainz-discid"
+
+/**
+ * GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL:
+ *
+ * Musicbrainz disc id details
+ */
+#define GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL "musicbrainz-discid-full"
+
+/**
+ * GST_TAG_CAPTURING_SHUTTER_SPEED:
+ *
+ * Shutter speed used when capturing an image, in seconds. (fraction)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_SHUTTER_SPEED "capturing-shutter-speed"
+
+/**
+ * GST_TAG_CAPTURING_FOCAL_RATIO:
+ *
+ * Focal ratio (f-number) used when capturing an image. (double)
+ *
+ * The value stored is the denominator of the focal ratio (f-number).
+ * For example, if this tag value is 2, the focal ratio is f/2.
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_FOCAL_RATIO "capturing-focal-ratio"
+
+/**
+ * GST_TAG_CAPTURING_FOCAL_LENGTH:
+ *
+ * Focal length used when capturing an image, in mm. (double)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_FOCAL_LENGTH "capturing-focal-length"
+
+/**
+ * GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO:
+ *
+ * Digital zoom ratio used when capturing an image. (double)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO "capturing-digital-zoom-ratio"
+
+/**
+ * GST_TAG_CAPTURING_ISO_SPEED:
+ *
+ * ISO speed used when capturing an image. (integer)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_ISO_SPEED "capturing-iso-speed"
+
+/**
+ * GST_TAG_CAPTURING_EXPOSURE_PROGRAM:
+ *
+ * Type of exposure control used when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "undefined"
+ * "manual"
+ * "normal" - automatically controlled
+ * "aperture-priority" - user selects aperture value
+ * "shutter-priority" - user selects shutter speed
+ * "creative" - biased towards depth of field
+ * "action" - biased towards fast shutter speed
+ * "portrait" - closeup, leaving background out of focus
+ * "landscape" - landscape photos, background in focus
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_EXPOSURE_PROGRAM "capturing-exposure-program"
+
+/**
+ * GST_TAG_CAPTURING_EXPOSURE_MODE:
+ *
+ * Exposure mode used when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "auto-exposure"
+ * "manual-exposure"
+ * "auto-bracket"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_EXPOSURE_MODE "capturing-exposure-mode"
+
+/**
+ * GST_TAG_CAPTURING_EXPOSURE_COMPENSATION:
+ *
+ * Exposure compensation using when capturing an image in EV. (double)
+ *
+ * Since: 0.10.33
+ */
+#define GST_TAG_CAPTURING_EXPOSURE_COMPENSATION "capturing-exposure-compensation"
+
+/**
+ * GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE:
+ *
+ * Scene mode used when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "standard"
+ * "landscape"
+ * "portrait"
+ * "night-scene"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE "capturing-scene-capture-type"
+
+/**
+ * GST_TAG_CAPTURING_GAIN_ADJUSTMENT:
+ *
+ * Gain adjustment applied to an image. (string)
+ *
+ * The allowed values are:
+ * "none"
+ * "low-gain-up"
+ * "high-gain-up"
+ * "low-gain-down"
+ * "high-gain-down"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_GAIN_ADJUSTMENT "capturing-gain-adjustment"
+
+/**
+ * GST_TAG_CAPTURING_WHITE_BALANCE:
+ *
+ * White balance mode used when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "auto"
+ * "manual"
+ * "daylight"
+ * "cloudy"
+ * "tungsten"
+ * "fluorescent"
+ * "fluorescent h" (newer daylight-calibrated fluorescents)
+ * "flash"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_WHITE_BALANCE "capturing-white-balance"
+
+/**
+ * GST_TAG_CAPTURING_CONTRAST:
+ *
+ * Direction of contrast processing applied when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "normal"
+ * "soft"
+ * "hard"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_CONTRAST "capturing-contrast"
+
+/**
+ * GST_TAG_CAPTURING_SATURATION:
+ *
+ * Direction of saturation processing applied when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "normal"
+ * "low-saturation"
+ * "high-saturation"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_SATURATION "capturing-saturation"
+
+/**
+ * GST_TAG_CAPTURING_SHARPNESS:
+ *
+ * Direction of sharpness processing applied when capturing an image. (string)
+ *
+ * The allowed values are:
+ * "normal"
+ * "soft"
+ * "hard"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_SHARPNESS "capturing-sharpness"
+
+/**
+ * GST_TAG_CAPTURING_FLASH_FIRED:
+ *
+ * If flash was fired during the capture of an image. (boolean)
+ *
+ * Note that if this tag isn't present, it should not be assumed that
+ * the flash did not fire. It should be treated as unknown.
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_FLASH_FIRED "capturing-flash-fired"
+
+/**
+ * GST_TAG_CAPTURING_FLASH_MODE:
+ *
+ * The flash mode selected during the capture of an image. (string)
+ *
+ * The allowed values are:
+ * "auto"
+ * "always"
+ * "never"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_FLASH_MODE "capturing-flash-mode"
+
+/**
+ * GST_TAG_CAPTURING_METERING_MODE:
+ *
+ * Defines the way a camera determines the exposure. (string)
+ *
+ * The allowed values are:
+ * "unknown"
+ * "average"
+ * "center-weighted-average"
+ * "spot"
+ * "multi-spot"
+ * "pattern"
+ * "partial"
+ * "other"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_METERING_MODE "capturing-metering-mode"
+
+/**
+ * GST_TAG_CAPTURING_SOURCE:
+ *
+ * Indicates the source of capture. The device/medium used to do the
+ * capture. (string)
+ *
+ * Allowed values are:
+ * "dsc" (= digital still camera)
+ * "transparent-scanner"
+ * "reflex-scanner"
+ * "other"
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_CAPTURING_SOURCE "capturing-source"
+
+/**
+ * GST_TAG_IMAGE_HORIZONTAL_PPI:
+ *
+ * Media (image/video) intended horizontal pixel density in ppi. (double)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_IMAGE_HORIZONTAL_PPI "image-horizontal-ppi"
+/**
+ * GST_TAG_IMAGE_VERTICAL_PPI:
+ *
+ * Media (image/video) intended vertical pixel density in ppi. (double)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_IMAGE_VERTICAL_PPI "image-vertical-ppi"
+
+
+/* additional information for image tags */
+
+/**
+ * GstTagImageType:
+ * @GST_TAG_IMAGE_TYPE_NONE : No image type. Can be used to
+ * tell functions such as gst_tag_image_data_to_image_buffer() that no
+ * image type should be set. (Since: 0.10.20)
+ * @GST_TAG_IMAGE_TYPE_UNDEFINED : Undefined/other image type
+ * @GST_TAG_IMAGE_TYPE_FRONT_COVER : Cover (front)
+ * @GST_TAG_IMAGE_TYPE_BACK_COVER : Cover (back)
+ * @GST_TAG_IMAGE_TYPE_LEAFLET_PAGE : Leaflet page
+ * @GST_TAG_IMAGE_TYPE_MEDIUM : Medium (e.g. label side of CD)
+ * @GST_TAG_IMAGE_TYPE_LEAD_ARTIST : Lead artist/lead performer/soloist
+ * @GST_TAG_IMAGE_TYPE_ARTIST : Artist/performer
+ * @GST_TAG_IMAGE_TYPE_CONDUCTOR : Conductor
+ * @GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA : Band/orchestra
+ * @GST_TAG_IMAGE_TYPE_COMPOSER : Composer
+ * @GST_TAG_IMAGE_TYPE_LYRICIST : Lyricist/text writer
+ * @GST_TAG_IMAGE_TYPE_RECORDING_LOCATION : Recording location
+ * @GST_TAG_IMAGE_TYPE_DURING_RECORDING : During recording
+ * @GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE : During performance
+ * @GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE : Movie/video screen capture
+ * @GST_TAG_IMAGE_TYPE_FISH : A fish as funny as the ID3v2 spec
+ * @GST_TAG_IMAGE_TYPE_ILLUSTRATION : Illustration
+ * @GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO : Band/artist logotype
+ * @GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO : Publisher/studio logotype
+ *
+ * Type of image contained in an image tag (specified as field in
+ * the image buffer's caps structure)
+ *
+ * Since: 0.10.9
+ */
+/* Note: keep in sync with register_tag_image_type_enum() */
+typedef enum {
+ GST_TAG_IMAGE_TYPE_NONE = -1,
+ GST_TAG_IMAGE_TYPE_UNDEFINED = 0,
+ GST_TAG_IMAGE_TYPE_FRONT_COVER,
+ GST_TAG_IMAGE_TYPE_BACK_COVER,
+ GST_TAG_IMAGE_TYPE_LEAFLET_PAGE,
+ GST_TAG_IMAGE_TYPE_MEDIUM,
+ GST_TAG_IMAGE_TYPE_LEAD_ARTIST,
+ GST_TAG_IMAGE_TYPE_ARTIST,
+ GST_TAG_IMAGE_TYPE_CONDUCTOR,
+ GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA,
+ GST_TAG_IMAGE_TYPE_COMPOSER,
+ GST_TAG_IMAGE_TYPE_LYRICIST,
+ GST_TAG_IMAGE_TYPE_RECORDING_LOCATION,
+ GST_TAG_IMAGE_TYPE_DURING_RECORDING,
+ GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE,
+ GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE,
+ GST_TAG_IMAGE_TYPE_FISH,
+ GST_TAG_IMAGE_TYPE_ILLUSTRATION,
+ GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO,
+ GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO
+} GstTagImageType;
+
+#define GST_TYPE_TAG_IMAGE_TYPE (gst_tag_image_type_get_type ())
+GType gst_tag_image_type_get_type (void);
+
+/**
+ * GST_TAG_ID3V2_HEADER_SIZE:
+ *
+ * ID3V2 header size considered minimum input for some functions such as
+ * gst_tag_list_from_id3v2_tag() and gst_tag_get_id3v2_tag_size() for example.
+ *
+ * Since: 0.10.36
+ */
+#define GST_TAG_ID3V2_HEADER_SIZE 10
+
+/* functions for vorbis comment manipulation */
+
+const gchar * gst_tag_from_vorbis_tag (const gchar * vorbis_tag);
+const gchar * gst_tag_to_vorbis_tag (const gchar * gst_tag);
+void gst_vorbis_tag_add (GstTagList * list,
+ const gchar * tag,
+ const gchar * value);
+
+GList * gst_tag_to_vorbis_comments (const GstTagList * list,
+ const gchar * tag);
+
+/* functions to convert GstBuffers with vorbiscomment contents to GstTagLists and back */
+GstTagList * gst_tag_list_from_vorbiscomment (const guint8 * data,
+ gsize size,
+ const guint8 * id_data,
+ const guint id_data_length,
+ gchar ** vendor_string);
+GstTagList * gst_tag_list_from_vorbiscomment_buffer (GstBuffer * buffer,
+ const guint8 * id_data,
+ const guint id_data_length,
+ gchar ** vendor_string);
+GstBuffer * gst_tag_list_to_vorbiscomment_buffer (const GstTagList * list,
+ const guint8 * id_data,
+ const guint id_data_length,
+ const gchar * vendor_string);
+
+/* functions for ID3 tag manipulation */
+
+/* FIXME 0.11: inconsistent API naming: gst_tag_list_new_from_id3v1(), gst_tag_list_from_*_buffer(),
+ * gst_tag_list_from_id3v2_tag(). Also, note gst.tag.list_xyz() namespace vs. gst.tag_list_xyz(),
+ * which is a bit confusing and possibly doesn't map too well */
+
+guint gst_tag_id3_genre_count (void);
+const gchar * gst_tag_id3_genre_get (const guint id);
+GstTagList * gst_tag_list_new_from_id3v1 (const guint8 * data);
+
+const gchar * gst_tag_from_id3_tag (const gchar * id3_tag);
+const gchar * gst_tag_from_id3_user_tag (const gchar * type,
+ const gchar * id3_user_tag);
+const gchar * gst_tag_to_id3_tag (const gchar * gst_tag);
+
+gboolean gst_tag_list_add_id3_image (GstTagList * tag_list,
+ const guint8 * image_data,
+ guint image_data_len,
+ guint id3_picture_type);
+
+GstTagList * gst_tag_list_from_id3v2_tag (GstBuffer * buffer);
+
+guint gst_tag_get_id3v2_tag_size (GstBuffer * buffer);
+
+/* functions to convert GstBuffers with xmp packets contents to GstTagLists and back */
+GstTagList * gst_tag_list_from_xmp_buffer (GstBuffer * buffer);
+GstBuffer * gst_tag_list_to_xmp_buffer (const GstTagList * list,
+ gboolean read_only);
+GstBuffer * gst_tag_list_to_xmp_buffer_full (const GstTagList * list,
+ gboolean read_only, const gchar ** schemas);
+const gchar** gst_tag_xmp_list_schemas (void);
+
+/* functions related to exif */
+GstBuffer * gst_tag_list_to_exif_buffer (const GstTagList * taglist,
+ gint byte_order,
+ guint32 base_offset);
+
+GstBuffer * gst_tag_list_to_exif_buffer_with_tiff_header (const GstTagList * taglist);
+
+GstTagList * gst_tag_list_from_exif_buffer (GstBuffer * buffer,
+ gint byte_order,
+ guint32 base_offset);
+
+GstTagList * gst_tag_list_from_exif_buffer_with_tiff_header (
+ GstBuffer * buffer);
+
+/* other tag-related functions */
+
+gboolean gst_tag_parse_extended_comment (const gchar * ext_comment,
+ gchar ** key,
+ gchar ** lang,
+ gchar ** value,
+ gboolean fail_if_no_key);
+
+gchar * gst_tag_freeform_string_to_utf8 (const gchar * data,
+ gint size,
+ const gchar ** env_vars);
+
+GstBuffer * gst_tag_image_data_to_image_buffer (const guint8 * image_data,
+ guint image_data_len,
+ GstTagImageType image_type);
+
+/* FIXME 0.11: get rid of this awkward register/init function, see tags.c */
+void gst_tag_register_musicbrainz_tags (void);
+
+
+/* language tag related functions */
+
+gchar ** gst_tag_get_language_codes (void);
+
+const gchar * gst_tag_get_language_name (const gchar * language_code);
+
+const gchar * gst_tag_get_language_code_iso_639_1 (const gchar * lang_code);
+
+const gchar * gst_tag_get_language_code_iso_639_2B (const gchar * lang_code);
+
+const gchar * gst_tag_get_language_code_iso_639_2T (const gchar * lang_code);
+
+/**
+ * gst_tag_get_language_code:
+ * @lang_code: ISO-639 language code (e.g. "deu" or "ger" or "de")
+ *
+ * Convenience macro wrapping gst_tag_get_language_code_iso_639_1().
+ *
+ * Since: 0.10.26
+ */
+#define gst_tag_get_language_code(lang_code) \
+ gst_tag_get_language_code_iso_639_1(lang_code)
+
+
+/* functions to deal with (mostly) Creative Commons licenses */
+
+/**
+ * GstTagLicenseFlags:
+ * @GST_TAG_LICENSE_PERMITS_REPRODUCTION: making multiple copies
+ * is allowed
+ * @GST_TAG_LICENSE_PERMITS_DISTRIBUTION: distribution, public display
+ * and public performance are allowed
+ * @GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS: distribution of derivative
+ * works is allowed
+ * @GST_TAG_LICENSE_PERMITS_SHARING: commercial derivatives are allowed,
+ * but only non-commercial distribution is allowed
+ * @GST_TAG_LICENSE_REQUIRES_NOTICE: copyright and license notices
+ * must be kept intact
+ * @GST_TAG_LICENSE_REQUIRES_ATTRIBUTION: credit must be given to
+ * copyright holder and/or author
+ * @GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE: derivative works must be
+ * licensed under the same terms or compatible terms as the original work
+ * @GST_TAG_LICENSE_REQUIRES_SOURCE_CODE: source code (the preferred
+ * form for making modifications) must be provided when exercising some
+ * rights granted by the license
+ * @GST_TAG_LICENSE_REQUIRES_COPYLEFT: derivative and combined works
+ * must be licensed under specified terms, similar to those of the original
+ * work
+ * @GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT: derivative works must be
+ * licensed under specified terms, with at least the same conditions as
+ * the original work; combinations with the work may be licensed under
+ * different terms
+ * @GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE: exercising rights for
+ * commercial purposes is prohibited
+ * @GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE: use in a
+ * non-developing country is prohibited
+ * @GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE: this license was created
+ * by the Creative Commons project
+ * @GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE: this license was
+ * created by the Free Software Foundation (FSF)
+ *
+ * See http://creativecommons.org/ns for more information.
+ *
+ * Since: 0.10.36
+ */
+typedef enum {
+ GST_TAG_LICENSE_PERMITS_REPRODUCTION = (1 << 0),
+ GST_TAG_LICENSE_PERMITS_DISTRIBUTION = (1 << 1),
+ GST_TAG_LICENSE_PERMITS_DERIVATIVE_WORKS = (1 << 2),
+ GST_TAG_LICENSE_PERMITS_SHARING = (1 << 3),
+
+ GST_TAG_LICENSE_REQUIRES_NOTICE = (1 << 8),
+ GST_TAG_LICENSE_REQUIRES_ATTRIBUTION = (1 << 9),
+ GST_TAG_LICENSE_REQUIRES_SHARE_ALIKE = (1 << 10),
+ GST_TAG_LICENSE_REQUIRES_SOURCE_CODE = (1 << 11),
+ GST_TAG_LICENSE_REQUIRES_COPYLEFT = (1 << 12),
+ GST_TAG_LICENSE_REQUIRES_LESSER_COPYLEFT = (1 << 13),
+
+ GST_TAG_LICENSE_PROHIBITS_COMMERCIAL_USE = (1 << 16),
+ GST_TAG_LICENSE_PROHIBITS_HIGH_INCOME_NATION_USE = (1 << 17),
+
+ GST_TAG_LICENSE_CREATIVE_COMMONS_LICENSE = (1 << 24),
+ GST_TAG_LICENSE_FREE_SOFTWARE_FOUNDATION_LICENSE = (1 << 25)
+} GstTagLicenseFlags;
+
+gchar ** gst_tag_get_licenses (void);
+
+GstTagLicenseFlags gst_tag_get_license_flags (const gchar * license_ref);
+
+const gchar * gst_tag_get_license_nick (const gchar * license_ref);
+
+const gchar * gst_tag_get_license_title (const gchar * license_ref);
+
+const gchar * gst_tag_get_license_version (const gchar * license_ref);
+
+const gchar * gst_tag_get_license_description (const gchar * license_ref);
+
+const gchar * gst_tag_get_license_jurisdiction (const gchar * license_ref);
+
+GType gst_tag_license_flags_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TAG_TAG_H__ */
diff --git a/gst-libs/gst/tag/tags.c b/gst-libs/gst/tag/tags.c
new file mode 100644
index 0000000..ed05e1b
--- /dev/null
+++ b/gst-libs/gst/tag/tags.c
@@ -0,0 +1,646 @@
+/* GStreamer non-core tag registration and tag utility functions
+ * Copyright (C) 2005 Ross Burton <ross@burtonini.com>
+ * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst-i18n-plugin.h>
+#include <gst/base/gsttypefindhelper.h>
+#include <gst/gst.h>
+#include "tag.h"
+#include "id3v2.h"
+
+#include <string.h>
+
+/**
+ * SECTION:gsttag
+ * @short_description: additional tag definitions for plugins and applications
+ * @see_also: #GstTagList
+ *
+ * <refsect2>
+ * <para>
+ * Contains additional standardized GStreamer tag definitions for plugins
+ * and applications, and functions to register them with the GStreamer
+ * tag system.
+ * </para>
+ * </refsect2>
+ */
+
+#ifndef GST_DISABLE_GST_DEBUG
+#define GST_CAT_DEFAULT gst_tag_ensure_debug_category()
+
+static GstDebugCategory *
+gst_tag_ensure_debug_category (void)
+{
+ static gsize cat_gonce = 0;
+
+ if (g_once_init_enter (&cat_gonce)) {
+ GstDebugCategory *cat = NULL;
+
+ GST_DEBUG_CATEGORY_INIT (cat, "tag-tags", 0, "GstTag helper functions");
+
+ g_once_init_leave (&cat_gonce, (gsize) cat);
+ }
+
+ return (GstDebugCategory *) cat_gonce;
+}
+#endif /* GST_DISABLE_GST_DEBUG */
+
+static gpointer
+gst_tag_register_tags_internal (gpointer unused)
+{
+#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
+
+ /* musicbrainz tags */
+ gst_tag_register (GST_TAG_MUSICBRAINZ_TRACKID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("track ID"), _("MusicBrainz track ID"), NULL);
+ gst_tag_register (GST_TAG_MUSICBRAINZ_ARTISTID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("artist ID"), _("MusicBrainz artist ID"), NULL);
+ gst_tag_register (GST_TAG_MUSICBRAINZ_ALBUMID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("album ID"), _("MusicBrainz album ID"), NULL);
+ gst_tag_register (GST_TAG_MUSICBRAINZ_ALBUMARTISTID, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("album artist ID"), _("MusicBrainz album artist ID"), NULL);
+ gst_tag_register (GST_TAG_MUSICBRAINZ_TRMID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("track TRM ID"), _("MusicBrainz TRM ID"), NULL);
+
+ /* CDDA tags */
+ gst_tag_register (GST_TAG_CDDA_CDDB_DISCID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, "discid", "CDDB discid for metadata retrieval",
+ gst_tag_merge_use_first);
+
+ gst_tag_register (GST_TAG_CDDA_CDDB_DISCID_FULL, GST_TAG_FLAG_META,
+ G_TYPE_STRING, "discid full",
+ "CDDB discid for metadata retrieval (full)", gst_tag_merge_use_first);
+
+ gst_tag_register (GST_TAG_CDDA_MUSICBRAINZ_DISCID, GST_TAG_FLAG_META,
+ G_TYPE_STRING, "musicbrainz-discid",
+ "Musicbrainz discid for metadata retrieval", gst_tag_merge_use_first);
+
+ gst_tag_register (GST_TAG_CDDA_MUSICBRAINZ_DISCID_FULL, GST_TAG_FLAG_META,
+ G_TYPE_STRING, "musicbrainz-discid-full",
+ "Musicbrainz discid for metadata retrieval (full)",
+ gst_tag_merge_use_first);
+
+ /* photography tags */
+ gst_tag_register (GST_TAG_CAPTURING_SHUTTER_SPEED, GST_TAG_FLAG_META,
+ GST_TYPE_FRACTION, _("capturing shutter speed"),
+ _("Shutter speed used when capturing an image, in seconds"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_FOCAL_RATIO, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("capturing focal ratio"),
+ _("Focal ratio (f-number) used when capturing the image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_FOCAL_LENGTH, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("capturing focal length"),
+ _("Focal length of the lens used capturing the image, in mm"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("capturing digital zoom ratio"),
+ _("Digital zoom ratio used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_ISO_SPEED, GST_TAG_FLAG_META,
+ G_TYPE_INT, _("capturing iso speed"),
+ _("The ISO speed used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing exposure program"),
+ _("The exposure program used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_EXPOSURE_MODE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing exposure mode"),
+ _("The exposure mode used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("capturing exposure compensation"),
+ _("The exposure compensation used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing scene capture type"),
+ _("The scene capture mode used when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing gain adjustment"),
+ _("The overall gain adjustment applied on an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_WHITE_BALANCE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing white balance"),
+ _("The white balance mode set when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_CONTRAST, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing contrast"),
+ _("The direction of contrast processing applied "
+ "when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_SATURATION, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing saturation"),
+ _("The direction of saturation processing applied when "
+ "capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_SHARPNESS, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing sharpness"),
+ _("The direction of sharpness processing applied "
+ "when capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_FLASH_FIRED, GST_TAG_FLAG_META,
+ G_TYPE_BOOLEAN, _("capturing flash fired"),
+ _("If the flash fired while capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_FLASH_MODE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing flash mode"),
+ _("The selected flash mode while capturing an image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_METERING_MODE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing metering mode"),
+ _("The metering mode used while determining exposure for capturing an"
+ " image"), NULL);
+
+ gst_tag_register (GST_TAG_CAPTURING_SOURCE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("capturing source"),
+ _("The source or type of device used for the capture"), NULL);
+
+ gst_tag_register (GST_TAG_IMAGE_HORIZONTAL_PPI, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("image horizontal ppi"),
+ _("Media (image/video) intended horizontal pixel density in ppi"), NULL);
+
+ gst_tag_register (GST_TAG_IMAGE_VERTICAL_PPI, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("image vertical ppi"),
+ _("Media (image/video) intended vertical pixel density in ppi"), NULL);
+
+ gst_tag_register (GST_TAG_ID3V2_FRAME, GST_TAG_FLAG_META,
+ GST_TYPE_BUFFER, _("ID3v2 frame"), _("unparsed id3v2 tag frame"),
+ gst_tag_merge_use_first);
+
+ return NULL;
+}
+
+/* FIXME 0.11: rename this to gst_tag_init() or gst_tag_register_tags() or
+ * even better: make tags auto-register themselves, either by defining them
+ * to a wrapper func that does the initing, or by adding tag factories so
+ * that the core can load+register tags automatically when needed. */
+
+/**
+ * gst_tag_register_musicbrainz_tags
+ *
+ * Registers additional musicbrainz-specific tags with the GStreamer tag
+ * system. Plugins and applications that use these tags should call this
+ * function before using them. Can be called multiple times.
+ */
+void
+gst_tag_register_musicbrainz_tags (void)
+{
+ static GOnce mb_once = G_ONCE_INIT;
+
+ g_once (&mb_once, gst_tag_register_tags_internal, NULL);
+}
+
+static void
+register_tag_image_type_enum (GType * id)
+{
+ static const GEnumValue image_types[] = {
+ {GST_TAG_IMAGE_TYPE_NONE, "GST_TAG_IMAGE_TYPE_NONE", "none"},
+ {GST_TAG_IMAGE_TYPE_UNDEFINED, "GST_TAG_IMAGE_TYPE_UNDEFINED", "undefined"},
+ {GST_TAG_IMAGE_TYPE_FRONT_COVER, "GST_TAG_IMAGE_TYPE_FRONT_COVER",
+ "front-cover"},
+ {GST_TAG_IMAGE_TYPE_BACK_COVER, "GST_TAG_IMAGE_TYPE_BACK_COVER",
+ "back-cover"},
+ {GST_TAG_IMAGE_TYPE_LEAFLET_PAGE, "GST_TAG_IMAGE_TYPE_LEAFLET_PAGE",
+ "leaflet-page"},
+ {GST_TAG_IMAGE_TYPE_MEDIUM, "GST_TAG_IMAGE_TYPE_MEDIUM", "medium"},
+ {GST_TAG_IMAGE_TYPE_LEAD_ARTIST, "GST_TAG_IMAGE_TYPE_LEAD_ARTIST",
+ "lead-artist"},
+ {GST_TAG_IMAGE_TYPE_ARTIST, "GST_TAG_IMAGE_TYPE_ARTIST", "artist"},
+ {GST_TAG_IMAGE_TYPE_CONDUCTOR, "GST_TAG_IMAGE_TYPE_CONDUCTOR", "conductor"},
+ {GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA, "GST_TAG_IMAGE_TYPE_BAND_ORCHESTRA",
+ "band-orchestra"},
+ {GST_TAG_IMAGE_TYPE_COMPOSER, "GST_TAG_IMAGE_TYPE_COMPOSER", "composer"},
+ {GST_TAG_IMAGE_TYPE_LYRICIST, "GST_TAG_IMAGE_TYPE_LYRICIST", "lyricist"},
+ {GST_TAG_IMAGE_TYPE_RECORDING_LOCATION,
+ "GST_TAG_IMAGE_TYPE_RECORDING_LOCATION",
+ "recording-location"},
+ {GST_TAG_IMAGE_TYPE_DURING_RECORDING, "GST_TAG_IMAGE_TYPE_DURING_RECORDING",
+ "during-recording"},
+ {GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE,
+ "GST_TAG_IMAGE_TYPE_DURING_PERFORMANCE",
+ "during-performance"},
+ {GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE, "GST_TAG_IMAGE_TYPE_VIDEO_CAPTURE",
+ "video-capture"},
+ {GST_TAG_IMAGE_TYPE_FISH, "GST_TAG_IMAGE_TYPE_FISH", "fish"},
+ {GST_TAG_IMAGE_TYPE_ILLUSTRATION, "GST_TAG_IMAGE_TYPE_ILLUSTRATION",
+ "illustration"},
+ {GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO, "GST_TAG_IMAGE_TYPE_BAND_ARTIST_LOGO",
+ "artist-logo"},
+ {GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO,
+ "GST_TAG_IMAGE_TYPE_PUBLISHER_STUDIO_LOGO",
+ "publisher-studio-logo"},
+ {0, NULL, NULL}
+ };
+
+ *id = g_enum_register_static ("GstTagImageType", image_types);
+
+ /* work around thread-safety issue with class creation in GLib */
+ g_type_class_ref (*id);
+}
+
+GType
+gst_tag_image_type_get_type (void)
+{
+ static GType id;
+
+ static GOnce once = G_ONCE_INIT;
+
+ g_once (&once, (GThreadFunc) register_tag_image_type_enum, &id);
+ return id;
+}
+
+static inline gboolean
+gst_tag_image_type_is_valid (GstTagImageType type)
+{
+ GEnumClass *klass;
+
+ gboolean res;
+
+ klass = g_type_class_ref (gst_tag_image_type_get_type ());
+ res = (g_enum_get_value (klass, type) != NULL);
+ g_type_class_unref (klass);
+
+ return res;
+}
+
+/**
+ * gst_tag_parse_extended_comment:
+ * @ext_comment: an extended comment string, see #GST_TAG_EXTENDED_COMMENT
+ * @key: return location for the comment description key, or NULL
+ * @lang: return location for the comment ISO-639 language code, or NULL
+ * @value: return location for the actual comment string, or NULL
+ * @fail_if_no_key: whether to fail if strings are not in key=value form
+ *
+ * Convenience function to parse a GST_TAG_EXTENDED_COMMENT string and
+ * separate it into its components.
+ *
+ * If successful, @key, @lang and/or @value will be set to newly allocated
+ * strings that you need to free with g_free() when done. @key and @lang
+ * may also be set to NULL by this function if there is no key or no language
+ * code in the extended comment string.
+ *
+ * Returns: TRUE if the string could be parsed, otherwise FALSE
+ *
+ * Since: 0.10.10
+ */
+gboolean
+gst_tag_parse_extended_comment (const gchar * ext_comment, gchar ** key,
+ gchar ** lang, gchar ** value, gboolean fail_if_no_key)
+{
+ const gchar *div, *bop, *bcl;
+
+ g_return_val_if_fail (ext_comment != NULL, FALSE);
+ g_return_val_if_fail (g_utf8_validate (ext_comment, -1, NULL), FALSE);
+
+ if (key)
+ *key = NULL;
+ if (lang)
+ *lang = NULL;
+
+ div = strchr (ext_comment, '=');
+ bop = strchr (ext_comment, '[');
+ bcl = strchr (ext_comment, ']');
+
+ if (div == NULL) {
+ if (fail_if_no_key)
+ return FALSE;
+ if (value)
+ *value = g_strdup (ext_comment);
+ return TRUE;
+ }
+
+ if (bop != NULL && bop < div) {
+ if (bcl < bop || bcl > div)
+ return FALSE;
+ if (key)
+ *key = g_strndup (ext_comment, bop - ext_comment);
+ if (lang)
+ *lang = g_strndup (bop + 1, bcl - bop - 1);
+ } else {
+ if (key)
+ *key = g_strndup (ext_comment, div - ext_comment);
+ }
+
+ if (value)
+ *value = g_strdup (div + 1);
+
+ return TRUE;
+}
+
+/**
+ * gst_tag_freeform_string_to_utf8:
+ * @data: string data
+ * @size: length of string data, or -1 if the string is NUL-terminated
+ * @env_vars: a NULL-terminated string array of environment variable names,
+ * or NULL
+ *
+ * Convenience function to read a string with unknown character encoding. If
+ * the string is already in UTF-8 encoding, it will be returned right away.
+ * If not it tries to detect byte-order-mark for UTF-16/32 cases and use that.
+ * Otherwise, the environment will be searched for a number of environment
+ * variables (whose names are specified in the NULL-terminated string array
+ * @env_vars) containing a list of character encodings to try/use. If none
+ * are specified, the current locale will be tried. If that also doesn't work,
+ * WINDOWS-1252/ISO-8859-1 is assumed (which will almost always succeed).
+ *
+ * Returns: a newly-allocated string in UTF-8 encoding, or NULL
+ *
+ * Since: 0.10.13
+ */
+gchar *
+gst_tag_freeform_string_to_utf8 (const gchar * data, gint size,
+ const gchar ** env_vars)
+{
+ const gchar *cur_loc = NULL;
+
+ gsize bytes_read;
+
+ gchar *utf8 = NULL;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ if (size < 0)
+ size = strlen (data);
+
+ /* chop off trailing string terminators to make sure utf8_validate doesn't
+ * get to see them (since that would make the utf8 check fail) */
+ while (size > 0 && data[size - 1] == '\0')
+ --size;
+
+ /* Should we try the charsets specified
+ * via environment variables FIRST ? */
+ if (g_utf8_validate (data, size, NULL)) {
+ utf8 = g_strndup (data, size);
+ GST_LOG ("String '%s' is valid UTF-8 already", utf8);
+ goto beach;
+ }
+
+ /* check for and use byte-order-mark for UTF-16/32 cases */
+ if (size >= 2) {
+ const gchar *c = NULL;
+ gint prefix, ssize;
+
+ if (size >= 4) {
+ prefix = 4;
+ ssize = GST_ROUND_DOWN_4 (size - 4);
+ switch (GST_READ_UINT32_BE (data)) {
+ case 0x0000FEFF:
+ c = "UTF-32BE";
+ break;
+ case 0xFFFE0000:
+ c = "UTF-32LE";
+ break;
+ default:
+ break;
+ }
+ }
+ if (!c) {
+ prefix = 2;
+ ssize = GST_ROUND_DOWN_2 (size - 2);
+ switch (GST_READ_UINT16_BE (data)) {
+ case 0xFEFF:
+ c = "UTF-16BE";
+ break;
+ case 0xFFFE:
+ c = "UTF-16LE";
+ break;
+ default:
+ break;
+ }
+ }
+ if (c) {
+ GST_LOG ("Trying to convert freeform string to UTF-8 from '%s'", c);
+ if ((utf8 =
+ g_convert (data + prefix, ssize, "UTF-8", c, &bytes_read, NULL,
+ NULL))) {
+ if (bytes_read == ssize)
+ goto beach;
+ g_free (utf8);
+ utf8 = NULL;
+ }
+ }
+ }
+
+ while (env_vars && *env_vars != NULL) {
+ const gchar *env = NULL;
+
+ /* Try charsets specified via the environment */
+ env = g_getenv (*env_vars);
+ if (env != NULL && *env != '\0') {
+ gchar **c, **csets;
+
+ csets = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, -1);
+
+ for (c = csets; c && *c; ++c) {
+ GST_LOG ("Trying to convert freeform string to UTF-8 from '%s'", *c);
+ if ((utf8 =
+ g_convert (data, size, "UTF-8", *c, &bytes_read, NULL, NULL))) {
+ if (bytes_read == size) {
+ g_strfreev (csets);
+ goto beach;
+ }
+ g_free (utf8);
+ utf8 = NULL;
+ }
+ }
+
+ g_strfreev (csets);
+ }
+ ++env_vars;
+ }
+
+ /* Try current locale (if not UTF-8) */
+ if (!g_get_charset (&cur_loc)) {
+ GST_LOG ("Trying to convert freeform string using locale ('%s')", cur_loc);
+ if ((utf8 = g_locale_to_utf8 (data, size, &bytes_read, NULL, NULL))) {
+ if (bytes_read == size) {
+ goto beach;
+ }
+ g_free (utf8);
+ utf8 = NULL;
+ }
+ }
+
+ /* Try Windows-1252 (which is a superset of ISO 8859-1 that uses a control
+ * character range in ISO 8859-1 for more printable characters) */
+ {
+ GError *err = NULL;
+
+ GST_LOG ("Trying to convert freeform string using Windows-1252/ISO-8859-1 "
+ "fallback");
+ utf8 = g_convert (data, size, "UTF-8", "WINDOWS-1252", &bytes_read, NULL,
+ &err);
+ if (err != NULL) {
+ /* fallback in case iconv implementation doesn't support windows-1252
+ * for some reason */
+ if (err->code == G_CONVERT_ERROR_NO_CONVERSION) {
+ utf8 = g_convert (data, size, "UTF-8", "ISO-8859-1", &bytes_read,
+ NULL, NULL);
+ }
+ g_error_free (err);
+ }
+
+ if (utf8 != NULL && bytes_read == size)
+ goto beach;
+ }
+
+ g_free (utf8);
+ return NULL;
+
+beach:
+
+ g_strchomp (utf8);
+ if (utf8 && utf8[0] != '\0') {
+ GST_LOG ("Returning '%s'", utf8);
+ return utf8;
+ }
+
+ g_free (utf8);
+ return NULL;
+}
+
+/**
+ * gst_tag_image_data_to_image_buffer:
+ * @image_data: the (encoded) image
+ * @image_data_len: the length of the encoded image data at @image_data
+ * @image_type: type of the image, or #GST_TAG_IMAGE_TYPE_UNDEFINED. Pass
+ * #GST_TAG_IMAGE_TYPE_NONE if no image type should be set at all (e.g.
+ * for preview images)
+ *
+ * Helper function for tag-reading plugins to create a #GstBuffer suitable to
+ * add to a #GstTagList as an image tag (such as #GST_TAG_IMAGE or
+ * #GST_TAG_PREVIEW_IMAGE) from the encoded image data and an (optional) image
+ * type.
+ *
+ * Background: cover art and other images in tags are usually stored as a
+ * blob of binary image data, often accompanied by a MIME type or some other
+ * content type string (e.g. 'png', 'jpeg', 'jpg'). Sometimes there is also an
+ * 'image type' to indicate what kind of image this is (e.g. front cover,
+ * back cover, artist, etc.). The image data may also be an URI to the image
+ * rather than the image itself.
+ *
+ * In GStreamer, image tags are #GstBuffer<!-- -->s containing the raw image
+ * data, with the buffer caps describing the content type of the image
+ * (e.g. image/jpeg, image/png, text/uri-list). The buffer caps may contain
+ * an additional 'image-type' field of #GST_TYPE_TAG_IMAGE_TYPE to describe
+ * the type of image (front cover, back cover etc.). #GST_TAG_PREVIEW_IMAGE
+ * tags should not carry an image type, their type is already indicated via
+ * the special tag name.
+ *
+ * This function will do various checks and typefind the encoded image
+ * data (we can't trust the declared mime type).
+ *
+ * Returns: a newly-allocated image buffer for use in tag lists, or NULL
+ *
+ * Since: 0.10.20
+ */
+GstBuffer *
+gst_tag_image_data_to_image_buffer (const guint8 * image_data,
+ guint image_data_len, GstTagImageType image_type)
+{
+ const gchar *name;
+ GstBuffer *image;
+ GstCaps *caps;
+ guint8 *data;
+
+ g_return_val_if_fail (image_data != NULL, NULL);
+ g_return_val_if_fail (image_data_len > 0, NULL);
+ g_return_val_if_fail (gst_tag_image_type_is_valid (image_type), NULL);
+
+ GST_DEBUG ("image data len: %u bytes", image_data_len);
+
+ /* allocate space for a NUL terminator for an uri too */
+ image = gst_buffer_new_and_alloc (image_data_len + 1);
+ if (image == NULL)
+ goto alloc_failed;
+
+ data = gst_buffer_map (image, NULL, NULL, GST_MAP_WRITE);
+ memcpy (data, image_data, image_data_len);
+ data[image_data_len] = '\0';
+ gst_buffer_unmap (image, data, image_data_len + 1);
+
+ /* Find GStreamer media type, can't trust declared type */
+ caps = gst_type_find_helper_for_buffer (NULL, image, NULL);
+
+ if (caps == NULL)
+ goto no_type;
+
+ GST_DEBUG ("Found GStreamer media type: %" GST_PTR_FORMAT, caps);
+
+ /* sanity check: make sure typefound/declared caps are either URI or image */
+ name = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+
+ if (!g_str_has_prefix (name, "image/") &&
+ !g_str_has_prefix (name, "video/") &&
+ !g_str_equal (name, "text/uri-list")) {
+ GST_DEBUG ("Unexpected image type '%s', ignoring image frame", name);
+ goto error;
+ }
+
+ /* Decrease size by 1 if we don't have an URI list
+ * to keep the original size of the image
+ */
+ if (!g_str_equal (name, "text/uri-list"))
+ gst_buffer_set_size (image, image_data_len);
+
+ if (image_type != GST_TAG_IMAGE_TYPE_NONE) {
+ GST_LOG ("Setting image type: %d", image_type);
+ caps = gst_caps_make_writable (caps);
+ gst_caps_set_simple (caps, "image-type", GST_TYPE_TAG_IMAGE_TYPE,
+ image_type, NULL);
+ }
+
+ g_warning ("extra image data can't be set");
+ gst_caps_unref (caps);
+
+ return image;
+
+/* ERRORS */
+no_type:
+ {
+ GST_DEBUG ("Could not determine GStreamer media type, ignoring image");
+ /* fall through */
+ }
+error:
+ {
+ if (image)
+ gst_buffer_unref (image);
+ if (caps)
+ gst_caps_unref (caps);
+ return NULL;
+ }
+alloc_failed:
+ {
+ GST_WARNING ("failed to allocate buffer of %d for image", image_data_len);
+ gst_buffer_unref (image);
+ return NULL;
+ }
+
+}
diff --git a/gst-libs/gst/tag/xmpwriter.c b/gst-libs/gst/tag/xmpwriter.c
new file mode 100644
index 0000000..842f897
--- /dev/null
+++ b/gst-libs/gst/tag/xmpwriter.c
@@ -0,0 +1,322 @@
+/* GStreamer TagXmpWriter
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gsttagxmpwriter
+ * @short_description: Interface for elements that provide XMP serialization
+ *
+ * <refsect2>
+ * <para>
+ * This interface is implemented by elements that are able to do XMP serialization. Examples for
+ * such elements are #jifmux and #qtmux.
+ * </para>
+ * <para>
+ * Applications can use this interface to configure which XMP schemas should be used when serializing
+ * tags into XMP. Schemas are represented by their names, a full list of the supported schemas can be
+ * obtained from gst_tag_xmp_list_schemas(). By default, all schemas are used.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xmpwriter.h"
+#include <string.h>
+#include <gst/tag/tag.h>
+
+static GQuark tag_xmp_writer_key;
+
+typedef struct
+{
+ GSList *schemas;
+ GStaticMutex lock;
+} GstTagXmpWriterData;
+
+GType
+gst_tag_xmp_writer_get_type (void)
+{
+ static volatile gsize xmp_config_type = 0;
+
+ if (g_once_init_enter (&xmp_config_type)) {
+ GType _type;
+ static const GTypeInfo xmp_config_info = {
+ sizeof (GstTagXmpWriterInterface), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0,
+ NULL
+ };
+
+ _type = g_type_register_static (G_TYPE_INTERFACE, "GstTagXmpWriter",
+ &xmp_config_info, 0);
+ tag_xmp_writer_key = g_quark_from_static_string ("GST_TAG_XMP_WRITER");
+ g_type_interface_add_prerequisite (_type, GST_TYPE_ELEMENT);
+
+ g_once_init_leave (&xmp_config_type, _type);
+ }
+
+ return xmp_config_type;
+}
+
+static void
+gst_tag_xmp_writer_data_add_schema_unlocked (GstTagXmpWriterData * data,
+ const gchar * schema)
+{
+ if (!g_slist_find_custom (data->schemas, schema, (GCompareFunc) strcmp)) {
+ data->schemas = g_slist_prepend (data->schemas, g_strdup (schema));
+ }
+}
+
+static void
+gst_tag_xmp_writer_data_add_all_schemas_unlocked (GstTagXmpWriterData * data)
+{
+ const gchar **schemas;
+ gint i = 0;
+
+ /* initialize it with all schemas */
+ schemas = gst_tag_xmp_list_schemas ();
+ while (schemas[i] != NULL) {
+ gst_tag_xmp_writer_data_add_schema_unlocked (data, schemas[i]);
+ i++;
+ }
+}
+
+
+static void
+gst_tag_xmp_writer_data_free (gpointer p)
+{
+ GstTagXmpWriterData *data = (GstTagXmpWriterData *) p;
+ GSList *iter;
+
+ if (data->schemas) {
+ for (iter = data->schemas; iter; iter = g_slist_next (iter)) {
+ g_free (iter->data);
+ }
+ g_slist_free (data->schemas);
+ }
+
+ g_static_mutex_free (&data->lock);
+
+ g_slice_free (GstTagXmpWriterData, data);
+}
+
+static GstTagXmpWriterData *
+gst_tag_xmp_writer_get_data (GstTagXmpWriter * xmpconfig)
+{
+ GstTagXmpWriterData *data;
+
+ data = g_object_get_qdata (G_OBJECT (xmpconfig), tag_xmp_writer_key);
+ if (!data) {
+ static GStaticMutex create_mutex = G_STATIC_MUTEX_INIT;
+
+ /* make sure no other thread is creating a GstTagXmpWriterData at the same time */
+ g_static_mutex_lock (&create_mutex);
+ data = g_object_get_qdata (G_OBJECT (xmpconfig), tag_xmp_writer_key);
+ if (!data) {
+ data = g_slice_new (GstTagXmpWriterData);
+ g_static_mutex_init (&data->lock);
+
+ data->schemas = NULL;
+ gst_tag_xmp_writer_data_add_all_schemas_unlocked (data);
+
+ g_object_set_qdata_full (G_OBJECT (xmpconfig), tag_xmp_writer_key, data,
+ gst_tag_xmp_writer_data_free);
+ }
+ g_static_mutex_unlock (&create_mutex);
+ }
+
+ return data;
+}
+
+/**
+ * gst_tag_xmp_writer_add_all_schemas:
+ * @config: a #GstTagXmpWriter
+ *
+ * Adds all available XMP schemas to the configuration. Meaning that
+ * all will be used.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_tag_xmp_writer_add_all_schemas (GstTagXmpWriter * config)
+{
+ GstTagXmpWriterData *data;
+
+ g_return_if_fail (GST_IS_TAG_XMP_WRITER (config));
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ gst_tag_xmp_writer_data_add_all_schemas_unlocked (data);
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_xmp_writer_add_schema:
+ * @config: a #GstTagXmpWriter
+ * @schema: the schema to be added
+ *
+ * Adds @schema to the list schemas
+ *
+ * Since: 0.10.33
+ */
+void
+gst_tag_xmp_writer_add_schema (GstTagXmpWriter * config, const gchar * schema)
+{
+ GstTagXmpWriterData *data;
+
+ g_return_if_fail (GST_IS_TAG_XMP_WRITER (config));
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ gst_tag_xmp_writer_data_add_schema_unlocked (data, schema);
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_xmp_writer_has_schema:
+ * @config: a #GstTagXmpWriter
+ * @schema: the schema to test
+ *
+ * Checks if @schema is going to be used
+ *
+ * Returns: %TRUE if it is going to be used
+ * Since: 0.10.33
+ */
+gboolean
+gst_tag_xmp_writer_has_schema (GstTagXmpWriter * config, const gchar * schema)
+{
+ GstTagXmpWriterData *data;
+ gboolean ret = FALSE;
+ GSList *iter;
+
+ g_return_val_if_fail (GST_IS_TAG_XMP_WRITER (config), FALSE);
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ for (iter = data->schemas; iter; iter = g_slist_next (iter)) {
+ if (strcmp ((const gchar *) iter->data, schema) == 0) {
+ ret = TRUE;
+ break;
+ }
+ }
+ g_static_mutex_unlock (&data->lock);
+
+ return ret;
+}
+
+/**
+ * gst_tag_xmp_writer_remove_schema:
+ * @config: a #GstTagXmpWriter
+ * @schema: the schema to remove
+ *
+ * Removes a schema from the list of schemas to use. Nothing is done if
+ * the schema wasn't in the list
+ *
+ * Since: 0.10.33
+ */
+void
+gst_tag_xmp_writer_remove_schema (GstTagXmpWriter * config,
+ const gchar * schema)
+{
+ GstTagXmpWriterData *data;
+ GSList *iter = NULL;
+
+ g_return_if_fail (GST_IS_TAG_XMP_WRITER (config));
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ for (iter = data->schemas; iter; iter = g_slist_next (iter)) {
+ if (strcmp ((const gchar *) iter->data, schema) == 0) {
+ g_free (iter->data);
+ data->schemas = g_slist_delete_link (data->schemas, iter);
+ break;
+ }
+ }
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_xmp_writer_remove_all_schemas:
+ * @config: a #GstTagXmpWriter
+ *
+ * Removes all schemas from the list of schemas to use. Meaning that no
+ * XMP will be generated.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_tag_xmp_writer_remove_all_schemas (GstTagXmpWriter * config)
+{
+ GstTagXmpWriterData *data;
+ GSList *iter;
+
+ g_return_if_fail (GST_IS_TAG_XMP_WRITER (config));
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ if (data->schemas) {
+ for (iter = data->schemas; iter; iter = g_slist_next (iter)) {
+ g_free (iter->data);
+ }
+ g_slist_free (data->schemas);
+ }
+ data->schemas = NULL;
+ g_static_mutex_unlock (&data->lock);
+}
+
+GstBuffer *
+gst_tag_xmp_writer_tag_list_to_xmp_buffer (GstTagXmpWriter * config,
+ const GstTagList * taglist, gboolean read_only)
+{
+ GstTagXmpWriterData *data;
+ GstBuffer *buf = NULL;
+ gint i = 0;
+ GSList *iter;
+
+ g_return_val_if_fail (GST_IS_TAG_XMP_WRITER (config), NULL);
+
+ data = gst_tag_xmp_writer_get_data (config);
+
+ g_static_mutex_lock (&data->lock);
+ if (data->schemas) {
+ gchar **array = g_new0 (gchar *, g_slist_length (data->schemas) + 1);
+ if (array) {
+ for (iter = data->schemas; iter; iter = g_slist_next (iter)) {
+ array[i++] = (gchar *) iter->data;
+ }
+ buf = gst_tag_list_to_xmp_buffer_full (taglist, read_only,
+ (const gchar **) array);
+ g_free (array);
+ }
+ }
+ g_static_mutex_unlock (&data->lock);
+
+ return buf;
+}
diff --git a/gst-libs/gst/tag/xmpwriter.h b/gst-libs/gst/tag/xmpwriter.h
new file mode 100644
index 0000000..a7f6e4a
--- /dev/null
+++ b/gst-libs/gst/tag/xmpwriter.h
@@ -0,0 +1,68 @@
+/* GStreamer XmpConfig
+ * Copyright (C) 2011 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __TAG_XMP_WRITER_H__
+#define __TAG_XMP_WRITER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TAG_XMP_WRITER \
+ (gst_tag_xmp_writer_get_type ())
+#define GST_TAG_XMP_WRITER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TAG_XMP_WRITER, GstTagXmpWriter))
+#define GST_TAG_XMP_WRITER_INTERFACE(iface) \
+ (G_TYPE_CHECK_INTERFACE_CAST ((iface), GST_TYPE_TAG_XMP_WRITER, GstTagXmpWriterInterface))
+#define GST_IS_TAG_XMP_WRITER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TAG_XMP_WRITER))
+#define GST_IS_TAG_XMP_WRITER_INTERFACE(iface) \
+ (G_TYPE_CHECK_INTERFACE_TYPE ((iface), GST_TYPE_TAG_XMP_WRITER))
+#define GST_TAG_XMP_WRITER_GET_INTERFACE(inst) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_TAG_XMP_WRITER, GstTagXmpWriterInterface))
+
+typedef struct _GstTagXmpWriter GstTagXmpWriter;
+typedef struct _GstTagXmpWriterInterface GstTagXmpWriterInterface;
+
+struct _GstTagXmpWriterInterface {
+ GTypeInterface parent;
+};
+
+GType gst_tag_xmp_writer_get_type (void);
+
+void gst_tag_xmp_writer_add_all_schemas (GstTagXmpWriter * config);
+
+void gst_tag_xmp_writer_add_schema (GstTagXmpWriter * config,
+ const gchar * schema);
+
+gboolean gst_tag_xmp_writer_has_schema (GstTagXmpWriter * config,
+ const gchar * schema);
+
+void gst_tag_xmp_writer_remove_schema (GstTagXmpWriter * config,
+ const gchar * schema);
+
+void gst_tag_xmp_writer_remove_all_schemas (GstTagXmpWriter * config);
+
+GstBuffer* gst_tag_xmp_writer_tag_list_to_xmp_buffer (GstTagXmpWriter * config,
+ const GstTagList * taglist,
+ gboolean read_only);
+
+G_END_DECLS
+
+#endif /* __TAG_XMP_WRITER_H__ */
diff --git a/gst-libs/gst/video/Makefile.am b/gst-libs/gst/video/Makefile.am
new file mode 100644
index 0000000..15b0c60
--- /dev/null
+++ b/gst-libs/gst/video/Makefile.am
@@ -0,0 +1,99 @@
+# variables used for enum/marshal generation
+glib_enum_headers = video.h
+glib_enum_define = GST_VIDEO
+glib_gen_prefix = gst_video
+glib_gen_basename = video
+
+built_sources = video-enumtypes.c
+built_headers = video-enumtypes.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+
+lib_LTLIBRARIES = libgstvideo-@GST_MAJORMINOR@.la
+
+CLEANFILES = $(BUILT_SOURCES)
+
+libgstvideo_@GST_MAJORMINOR@_la_SOURCES = \
+ video.c gstvideosink.c gstvideofilter.c convertframe.c gstmetavideo.c gstvideopool.c
+nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES = $(BUILT_SOURCES)
+
+libgstvideo_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/video
+libgstvideo_@GST_MAJORMINOR@include_HEADERS = \
+ video.h gstvideosink.h gstvideofilter.h gstmetavideo.h gstvideopool.h
+nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS = $(built_headers)
+
+libgstvideo_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstvideo_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
+libgstvideo_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstVideo-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+gir_headers+=$(patsubst %,$(builddir)/%, $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES))
+gir_sources+=$(patsubst %,$(builddir)/%, $(nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/video/%',$(libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+gir_cincludes+=$(patsubst %,--c-include='gst/video/%',$(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+
+GstVideo-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstvideo-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace GstVideo \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ $(gir_cincludes) \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir)/gst-libs \
+ -I$(top_builddir)/gst-libs \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ --library=libgstvideo-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --include=GstBase-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-video-@GST_MAJORMINOR@ \
+ --add-init-section="gst_init(NULL,NULL);" \
+ --output $@ \
+ $(gir_headers) \
+ $(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+ $(INTROSPECTION_COMPILER) \
+ --includedir=$(srcdir) \
+ --includedir=$(builddir) \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstvideo -:SHARED libgstvideo-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideo_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstvideo_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/gst-libs/gst/video/Makefile.in b/gst-libs/gst/video/Makefile.in
new file mode 100644
index 0000000..065ba6d
--- /dev/null
+++ b/gst-libs/gst/video/Makefile.in
@@ -0,0 +1,1058 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/gst-glib-gen.mak
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/video
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" \
+ "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvideo_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstvideo_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstvideo_@GST_MAJORMINOR@_la-video.lo \
+ libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo \
+ libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo \
+ libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo \
+ libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo \
+ libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo
+am__objects_1 = libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo
+am__objects_2 =
+am__objects_3 = $(am__objects_1) $(am__objects_2)
+nodist_libgstvideo_@GST_MAJORMINOR@_la_OBJECTS = $(am__objects_3)
+libgstvideo_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstvideo_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvideo_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstvideo_@GST_MAJORMINOR@_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# variables used for enum/marshal generation
+glib_enum_headers = video.h
+glib_enum_define = GST_VIDEO
+glib_gen_prefix = gst_video
+glib_gen_basename = video
+built_sources = video-enumtypes.c
+built_headers = video-enumtypes.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+lib_LTLIBRARIES = libgstvideo-@GST_MAJORMINOR@.la
+CLEANFILES = $(BUILT_SOURCES) $(am__append_1)
+libgstvideo_@GST_MAJORMINOR@_la_SOURCES = \
+ video.c gstvideosink.c gstvideofilter.c convertframe.c gstmetavideo.c gstvideopool.c
+
+nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES = $(BUILT_SOURCES)
+libgstvideo_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/video
+libgstvideo_@GST_MAJORMINOR@include_HEADERS = \
+ video.h gstvideosink.h gstvideofilter.h gstmetavideo.h gstvideopool.h
+
+nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS = $(built_headers)
+libgstvideo_@GST_MAJORMINOR@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstvideo_@GST_MAJORMINOR@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
+libgstvideo_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstVideo-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstvideo_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, \
+@HAVE_INTROSPECTION_TRUE@ $(nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/video/%',$(libgstvideo_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst \
+@HAVE_INTROSPECTION_TRUE@ %,--c-include='gst/video/%',$(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+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-libs/gst/video/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst-libs/gst/video/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-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || 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)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_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
+libgstvideo-@GST_MAJORMINOR@.la: $(libgstvideo_@GST_MAJORMINOR@_la_OBJECTS) $(libgstvideo_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvideo_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstvideo_@GST_MAJORMINOR@_la_OBJECTS) $(libgstvideo_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-convertframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvideo_@GST_MAJORMINOR@_la-video.lo: video.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-video.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-video.lo `test -f 'video.c' || echo '$(srcdir)/'`video.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='video.c' object='libgstvideo_@GST_MAJORMINOR@_la-video.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-video.lo `test -f 'video.c' || echo '$(srcdir)/'`video.c
+
+libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo: gstvideosink.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo `test -f 'gstvideosink.c' || echo '$(srcdir)/'`gstvideosink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideosink.c' object='libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideosink.lo `test -f 'gstvideosink.c' || echo '$(srcdir)/'`gstvideosink.c
+
+libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo: gstvideofilter.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo `test -f 'gstvideofilter.c' || echo '$(srcdir)/'`gstvideofilter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideofilter.c' object='libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideofilter.lo `test -f 'gstvideofilter.c' || echo '$(srcdir)/'`gstvideofilter.c
+
+libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo: convertframe.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-convertframe.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo `test -f 'convertframe.c' || echo '$(srcdir)/'`convertframe.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-convertframe.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-convertframe.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='convertframe.c' object='libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-convertframe.lo `test -f 'convertframe.c' || echo '$(srcdir)/'`convertframe.c
+
+libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo: gstmetavideo.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo `test -f 'gstmetavideo.c' || echo '$(srcdir)/'`gstmetavideo.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmetavideo.c' object='libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-gstmetavideo.lo `test -f 'gstmetavideo.c' || echo '$(srcdir)/'`gstmetavideo.c
+
+libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo: gstvideopool.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo `test -f 'gstvideopool.c' || echo '$(srcdir)/'`gstvideopool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideopool.c' object='libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-gstvideopool.lo `test -f 'gstvideopool.c' || echo '$(srcdir)/'`gstvideopool.c
+
+libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo: video-enumtypes.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) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.Tpo -c -o libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo `test -f 'video-enumtypes.c' || echo '$(srcdir)/'`video-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.Tpo $(DEPDIR)/libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='video-enumtypes.c' object='libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstvideo_@GST_MAJORMINOR@_la-video-enumtypes.lo `test -f 'video-enumtypes.c' || echo '$(srcdir)/'`video-enumtypes.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
+ @list='$(gir_DATA)'; test -n "$(girdir)" || 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)$(girdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+ done
+
+uninstall-girDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(girdir)" && rm -f $$files
+install-typelibsDATA: $(typelibs_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)"
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || 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)$(typelibsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+ done
+
+uninstall-typelibsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files
+install-libgstvideo_@GST_MAJORMINOR@includeHEADERS: $(libgstvideo_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstvideo_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstvideo_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstvideo_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstvideo_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstvideo_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstvideo_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" && rm -f $$files
+install-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS: $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstvideo_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)"
+ @list='$(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstvideo_@GST_MAJORMINOR@includedir)" || 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_HEADER) $$files '$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstvideo_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+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) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)" "$(DESTDIR)$(libgstvideo_@GST_MAJORMINOR@includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ install-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES \
+ install-libgstvideo_@GST_MAJORMINOR@includeHEADERS install-man \
+ install-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstvideo_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+# 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 <glib-object.h>\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 $@
+
+@HAVE_INTROSPECTION_TRUE@GstVideo-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstvideo-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstVideo \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstvideo-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --include=GstBase-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-base-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-video-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@ --output $@ \
+@HAVE_INTROSPECTION_TRUE@ $(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@ $(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=$(builddir) \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ --includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-base-@GST_MAJORMINOR@` \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer -:PROJECT libgstvideo -:SHARED libgstvideo-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideo_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstvideo_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideo_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstvideo_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/tag \
+ -:HEADERS $(libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstvideo_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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-libs/gst/video/convertframe.c b/gst-libs/gst/video/convertframe.c
new file mode 100644
index 0000000..6639248
--- /dev/null
+++ b/gst-libs/gst/video/convertframe.c
@@ -0,0 +1,698 @@
+/* Small helper element for format conversion
+ * Copyright (C) 2005 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2010 Brandon Lewis <brandon.lewis@collabora.co.uk>
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include "video.h"
+
+static gboolean
+caps_are_raw (const GstCaps * caps)
+{
+ guint i, len;
+
+ len = gst_caps_get_size (caps);
+
+ for (i = 0; i < len; i++) {
+ GstStructure *st = gst_caps_get_structure (caps, i);
+ if (gst_structure_has_name (st, "video/x-raw"))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+create_element (const gchar * factory_name, GstElement ** element,
+ GError ** err)
+{
+ *element = gst_element_factory_make (factory_name, NULL);
+ if (*element)
+ return TRUE;
+
+ if (err && *err == NULL) {
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
+ "cannot create element '%s' - please check your GStreamer installation",
+ factory_name);
+ }
+
+ return FALSE;
+}
+
+static GstElement *
+get_encoder (const GstCaps * caps, GError ** err)
+{
+ GList *encoders = NULL;
+ GList *filtered = NULL;
+ GstElementFactory *factory = NULL;
+ GstElement *encoder = NULL;
+
+ encoders =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_ENCODER |
+ GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE, GST_RANK_NONE);
+
+ if (encoders == NULL) {
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
+ "Cannot find any image encoder");
+ goto fail;
+ }
+
+ GST_INFO ("got factory list %p", encoders);
+ gst_plugin_feature_list_debug (encoders);
+
+ filtered =
+ gst_element_factory_list_filter (encoders, caps, GST_PAD_SRC, FALSE);
+ GST_INFO ("got filtered list %p", filtered);
+
+ if (filtered == NULL) {
+ gchar *tmp = gst_caps_to_string (caps);
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
+ "Cannot find any image encoder for caps %s", tmp);
+ g_free (tmp);
+ goto fail;
+ }
+
+ gst_plugin_feature_list_debug (filtered);
+
+ factory = (GstElementFactory *) filtered->data;
+
+ GST_INFO ("got factory %p", factory);
+ encoder = gst_element_factory_create (factory, NULL);
+
+ GST_INFO ("created encoder element %p, %s", encoder,
+ gst_element_get_name (encoder));
+
+fail:
+ if (encoders)
+ gst_plugin_feature_list_free (encoders);
+ if (filtered)
+ gst_plugin_feature_list_free (filtered);
+
+ return encoder;
+}
+
+static GstElement *
+build_convert_frame_pipeline (GstElement ** src_element,
+ GstElement ** sink_element, const GstCaps * from_caps,
+ const GstCaps * to_caps, GError ** err)
+{
+ GstElement *src = NULL, *csp = NULL, *vscale = NULL;
+ GstElement *sink = NULL, *encoder = NULL, *pipeline;
+ GError *error = NULL;
+
+ /* videoscale is here to correct for the pixel-aspect-ratio for us */
+ GST_DEBUG ("creating elements");
+ if (!create_element ("appsrc", &src, &error) ||
+ !create_element ("videoconvert", &csp, &error) ||
+ !create_element ("videoscale", &vscale, &error) ||
+ !create_element ("appsink", &sink, &error))
+ goto no_elements;
+
+ pipeline = gst_pipeline_new ("videoconvert-pipeline");
+ if (pipeline == NULL)
+ goto no_pipeline;
+
+ /* Add black borders if necessary to keep the DAR */
+ g_object_set (vscale, "add-borders", TRUE, NULL);
+
+ GST_DEBUG ("adding elements");
+ gst_bin_add_many (GST_BIN (pipeline), src, csp, vscale, sink, NULL);
+
+ /* set caps */
+ g_object_set (src, "caps", from_caps, NULL);
+ g_object_set (sink, "caps", to_caps, NULL);
+
+ /* FIXME: linking is still way too expensive, profile this properly */
+ GST_DEBUG ("linking src->csp");
+ if (!gst_element_link_pads (src, "src", csp, "sink"))
+ goto link_failed;
+
+ GST_DEBUG ("linking csp->vscale");
+ if (!gst_element_link_pads (csp, "src", vscale, "sink"))
+ goto link_failed;
+
+ if (caps_are_raw (to_caps)) {
+ GST_DEBUG ("linking vscale->sink");
+
+ if (!gst_element_link_pads (vscale, "src", sink, "sink"))
+ goto link_failed;
+ } else {
+ encoder = get_encoder (to_caps, &error);
+ if (!encoder)
+ goto no_encoder;
+ gst_bin_add (GST_BIN (pipeline), encoder);
+
+ GST_DEBUG ("linking vscale->encoder");
+ if (!gst_element_link (vscale, encoder))
+ goto link_failed;
+
+ GST_DEBUG ("linking encoder->sink");
+ if (!gst_element_link_pads (encoder, "src", sink, "sink"))
+ goto link_failed;
+ }
+
+ g_object_set (src, "emit-signals", TRUE, NULL);
+ g_object_set (sink, "emit-signals", TRUE, NULL);
+
+ *src_element = src;
+ *sink_element = sink;
+
+ return pipeline;
+ /* ERRORS */
+no_encoder:
+ {
+ gst_object_unref (pipeline);
+
+ GST_ERROR ("could not find an encoder for provided caps");
+ if (err)
+ *err = error;
+ else
+ g_error_free (error);
+
+ return NULL;
+ }
+no_elements:
+ {
+ if (src)
+ gst_object_unref (src);
+ if (csp)
+ gst_object_unref (csp);
+ if (vscale)
+ gst_object_unref (vscale);
+ if (sink)
+ gst_object_unref (sink);
+ GST_ERROR ("Could not convert video frame: %s", error->message);
+ if (err)
+ *err = error;
+ else
+ g_error_free (error);
+ return NULL;
+ }
+no_pipeline:
+ {
+ gst_object_unref (src);
+ gst_object_unref (csp);
+ gst_object_unref (vscale);
+ gst_object_unref (sink);
+
+ GST_ERROR ("Could not convert video frame: no pipeline (unknown error)");
+ if (err)
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ "Could not convert video frame: no pipeline (unknown error)");
+ return NULL;
+ }
+link_failed:
+ {
+ gst_object_unref (pipeline);
+
+ GST_ERROR ("Could not convert video frame: failed to link elements");
+ if (err)
+ *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
+ "Could not convert video frame: failed to link elements");
+ return NULL;
+ }
+}
+
+/**
+ * gst_video_convert_frame:
+ * @buf: a #GstBuffer
+ * @from_caps: the #GstCaps to convert from
+ * @to_caps: the #GstCaps to convert to
+ * @timeout: the maximum amount of time allowed for the processing.
+ * @error: pointer to a #GError. Can be %NULL.
+ *
+ * Converts a raw video buffer into the specified output caps.
+ *
+ * The output caps can be any raw video formats or any image formats (jpeg, png, ...).
+ *
+ * The width, height and pixel-aspect-ratio can also be specified in the output caps.
+ *
+ * Returns: The converted #GstBuffer, or %NULL if an error happened (in which case @err
+ * will point to the #GError).
+ *
+ * Since: 0.10.31
+ *
+ */
+GstBuffer *
+gst_video_convert_frame (GstBuffer * buf, GstCaps * from_caps,
+ const GstCaps * to_caps, GstClockTime timeout, GError ** error)
+{
+ GstMessage *msg;
+ GstBuffer *result = NULL;
+ GError *err = NULL;
+ GstBus *bus;
+ GstCaps *to_caps_copy = NULL;
+ GstFlowReturn ret;
+ GstElement *pipeline, *src, *sink;
+ guint i, n;
+
+ g_return_val_if_fail (buf != NULL, NULL);
+ g_return_val_if_fail (to_caps != NULL, NULL);
+ g_return_val_if_fail (from_caps != NULL, NULL);
+
+ to_caps_copy = gst_caps_new_empty ();
+ n = gst_caps_get_size (to_caps);
+ for (i = 0; i < n; i++) {
+ GstStructure *s = gst_caps_get_structure (to_caps, i);
+
+ s = gst_structure_copy (s);
+ gst_structure_remove_field (s, "framerate");
+ gst_caps_append_structure (to_caps_copy, s);
+ }
+
+ pipeline =
+ build_convert_frame_pipeline (&src, &sink, from_caps, to_caps_copy, &err);
+ if (!pipeline)
+ goto no_pipeline;
+
+ /* now set the pipeline to the paused state, after we push the buffer into
+ * appsrc, this should preroll the converted buffer in appsink */
+ GST_DEBUG ("running conversion pipeline to caps %" GST_PTR_FORMAT,
+ to_caps_copy);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ /* feed buffer in appsrc */
+ GST_DEBUG ("feeding buffer %p, size %" G_GSIZE_FORMAT ", caps %"
+ GST_PTR_FORMAT, buf, gst_buffer_get_size (buf), from_caps);
+ g_signal_emit_by_name (src, "push-buffer", buf, &ret);
+
+ /* now see what happens. We either got an error somewhere or the pipeline
+ * prerolled */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus,
+ timeout, GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE);
+
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ASYNC_DONE:
+ {
+ /* we're prerolled, get the frame from appsink */
+ g_signal_emit_by_name (sink, "pull-preroll", &result);
+
+ if (result) {
+ GST_DEBUG ("conversion successful: result = %p", result);
+ } else {
+ GST_ERROR ("prerolled but no result frame?!");
+ }
+ break;
+ }
+ case GST_MESSAGE_ERROR:{
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (msg, &err, &dbg);
+ if (err) {
+ GST_ERROR ("Could not convert video frame: %s", err->message);
+ GST_DEBUG ("%s [debug: %s]", err->message, GST_STR_NULL (dbg));
+ if (error)
+ *error = err;
+ else
+ g_error_free (err);
+ }
+ g_free (dbg);
+ break;
+ }
+ default:{
+ g_return_val_if_reached (NULL);
+ }
+ }
+ gst_message_unref (msg);
+ } else {
+ GST_ERROR ("Could not convert video frame: timeout during conversion");
+ if (error)
+ *error = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ "Could not convert video frame: timeout during conversion");
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+ gst_caps_unref (to_caps_copy);
+
+ return result;
+
+ /* ERRORS */
+no_pipeline:
+ {
+ gst_caps_unref (to_caps_copy);
+
+ if (error)
+ *error = err;
+ else
+ g_error_free (err);
+
+ return NULL;
+ }
+}
+
+typedef struct
+{
+ GMutex *mutex;
+ GstElement *pipeline;
+ GstVideoConvertFrameCallback callback;
+ gpointer user_data;
+ GDestroyNotify destroy_notify;
+ GMainContext *context;
+ GstBuffer *buffer;
+ gulong timeout_id;
+ gboolean finished;
+} GstVideoConvertFrameContext;
+
+typedef struct
+{
+ GstVideoConvertFrameCallback callback;
+ GstBuffer *buffer;
+ GError *error;
+ gpointer user_data;
+ GDestroyNotify destroy_notify;
+
+ GstVideoConvertFrameContext *context;
+} GstVideoConvertFrameCallbackContext;
+
+static void
+gst_video_convert_frame_context_free (GstVideoConvertFrameContext * ctx)
+{
+ /* Wait until all users of the mutex are done */
+ g_mutex_lock (ctx->mutex);
+ g_mutex_unlock (ctx->mutex);
+ g_mutex_free (ctx->mutex);
+ if (ctx->timeout_id)
+ g_source_remove (ctx->timeout_id);
+ if (ctx->buffer)
+ gst_buffer_unref (ctx->buffer);
+ g_main_context_unref (ctx->context);
+
+ gst_element_set_state (ctx->pipeline, GST_STATE_NULL);
+ gst_object_unref (ctx->pipeline);
+
+ g_slice_free (GstVideoConvertFrameContext, ctx);
+}
+
+static void
+ gst_video_convert_frame_callback_context_free
+ (GstVideoConvertFrameCallbackContext * ctx)
+{
+ if (ctx->context)
+ gst_video_convert_frame_context_free (ctx->context);
+ g_slice_free (GstVideoConvertFrameCallbackContext, ctx);
+}
+
+static gboolean
+convert_frame_dispatch_callback (GstVideoConvertFrameCallbackContext * ctx)
+{
+ ctx->callback (ctx->buffer, ctx->error, ctx->user_data);
+
+ if (ctx->destroy_notify)
+ ctx->destroy_notify (ctx->user_data);
+
+ return FALSE;
+}
+
+static void
+convert_frame_finish (GstVideoConvertFrameContext * context, GstBuffer * buffer,
+ GError * error)
+{
+ GSource *source;
+ GstVideoConvertFrameCallbackContext *ctx;
+
+ if (context->timeout_id)
+ g_source_remove (context->timeout_id);
+ context->timeout_id = 0;
+
+ ctx = g_slice_new (GstVideoConvertFrameCallbackContext);
+ ctx->callback = context->callback;
+ ctx->user_data = context->user_data;
+ ctx->destroy_notify = context->destroy_notify;
+ ctx->buffer = buffer;
+ ctx->error = error;
+ ctx->context = context;
+
+ source = g_timeout_source_new (0);
+ g_source_set_callback (source,
+ (GSourceFunc) convert_frame_dispatch_callback, ctx,
+ (GDestroyNotify) gst_video_convert_frame_callback_context_free);
+ g_source_attach (source, context->context);
+ g_source_unref (source);
+
+ context->finished = TRUE;
+}
+
+static gboolean
+convert_frame_timeout_callback (GstVideoConvertFrameContext * context)
+{
+ GError *error;
+
+ g_mutex_lock (context->mutex);
+
+ if (context->finished)
+ goto done;
+
+ GST_ERROR ("Could not convert video frame: timeout");
+
+ error = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ "Could not convert video frame: timeout");
+
+ convert_frame_finish (context, NULL, error);
+
+done:
+ g_mutex_unlock (context->mutex);
+ return FALSE;
+}
+
+static gboolean
+convert_frame_bus_callback (GstBus * bus, GstMessage * message,
+ GstVideoConvertFrameContext * context)
+{
+ g_mutex_lock (context->mutex);
+
+ if (context->finished)
+ goto done;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:{
+ GError *error;
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (message, &error, &dbg);
+
+ GST_ERROR ("Could not convert video frame: %s", error->message);
+ GST_DEBUG ("%s [debug: %s]", error->message, GST_STR_NULL (dbg));
+
+ convert_frame_finish (context, NULL, error);
+
+ g_free (dbg);
+ break;
+ }
+ default:
+ break;
+ }
+
+done:
+ g_mutex_unlock (context->mutex);
+
+ return FALSE;
+}
+
+static void
+convert_frame_need_data_callback (GstElement * src, guint size,
+ GstVideoConvertFrameContext * context)
+{
+ GstFlowReturn ret = GST_FLOW_ERROR;
+ GError *error;
+
+ g_mutex_lock (context->mutex);
+
+ if (context->finished)
+ goto done;
+
+ g_signal_emit_by_name (src, "push-buffer", context->buffer, &ret);
+ gst_buffer_unref (context->buffer);
+ context->buffer = NULL;
+
+ if (ret != GST_FLOW_OK) {
+ GST_ERROR ("Could not push video frame: %s", gst_flow_get_name (ret));
+
+ error = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ "Could not push video frame: %s", gst_flow_get_name (ret));
+
+ convert_frame_finish (context, NULL, error);
+ }
+
+ g_signal_handlers_disconnect_by_func (src, convert_frame_need_data_callback,
+ context);
+
+done:
+ g_mutex_unlock (context->mutex);
+}
+
+static void
+convert_frame_new_buffer_callback (GstElement * sink,
+ GstVideoConvertFrameContext * context)
+{
+ GstBuffer *buf = NULL;
+ GError *error = NULL;
+
+ g_mutex_lock (context->mutex);
+
+ if (context->finished)
+ goto done;
+
+ g_signal_emit_by_name (sink, "pull-preroll", &buf);
+
+ if (!buf) {
+ error = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ "Could not get converted video frame");
+ }
+
+ convert_frame_finish (context, buf, error);
+
+ g_signal_handlers_disconnect_by_func (sink, convert_frame_need_data_callback,
+ context);
+
+done:
+ g_mutex_unlock (context->mutex);
+}
+
+/**
+ * gst_video_convert_frame_async:
+ * @buf: a #GstBuffer
+ * @from_caps: the #GstCaps to convert from
+ * @to_caps: the #GstCaps to convert to
+ * @timeout: the maximum amount of time allowed for the processing.
+ * @callback: %GstVideoConvertFrameCallback that will be called after conversion.
+ * @user_data: extra data that will be passed to the @callback
+ * @destroy_notify: %GDestroyNotify to be called after @user_data is not needed anymore
+ *
+ * Converts a raw video buffer into the specified output caps.
+ *
+ * The output caps can be any raw video formats or any image formats (jpeg, png, ...).
+ *
+ * The width, height and pixel-aspect-ratio can also be specified in the output caps.
+ *
+ * @callback will be called after conversion, when an error occured or if conversion didn't
+ * finish after @timeout. @callback will always be called from the thread default
+ * %GMainContext, see g_main_context_get_thread_default(). If GLib before 2.22 is used,
+ * this will always be the global default main context.
+ *
+ * @destroy_notify will be called after the callback was called and @user_data is not needed
+ * anymore.
+ *
+ * Since: 0.10.31
+ *
+ */
+void
+gst_video_convert_frame_async (GstBuffer * buf, GstCaps * from_caps,
+ const GstCaps * to_caps, GstClockTime timeout,
+ GstVideoConvertFrameCallback callback, gpointer user_data,
+ GDestroyNotify destroy_notify)
+{
+ GMainContext *context = NULL;
+ GError *error = NULL;
+ GstBus *bus;
+ GstCaps *to_caps_copy = NULL;
+ GstElement *pipeline, *src, *sink;
+ guint i, n;
+ GSource *source;
+ GstVideoConvertFrameContext *ctx;
+
+ g_return_if_fail (buf != NULL);
+ g_return_if_fail (to_caps != NULL);
+ g_return_if_fail (from_caps != NULL);
+ g_return_if_fail (callback != NULL);
+
+ context = g_main_context_get_thread_default ();
+
+ if (!context)
+ context = g_main_context_default ();
+
+ to_caps_copy = gst_caps_new_empty ();
+ n = gst_caps_get_size (to_caps);
+ for (i = 0; i < n; i++) {
+ GstStructure *s = gst_caps_get_structure (to_caps, i);
+
+ s = gst_structure_copy (s);
+ gst_structure_remove_field (s, "framerate");
+ gst_caps_append_structure (to_caps_copy, s);
+ }
+
+ pipeline =
+ build_convert_frame_pipeline (&src, &sink, from_caps, to_caps_copy,
+ &error);
+ if (!pipeline)
+ goto no_pipeline;
+
+ bus = gst_element_get_bus (pipeline);
+
+ ctx = g_slice_new0 (GstVideoConvertFrameContext);
+ ctx->mutex = g_mutex_new ();
+ ctx->buffer = gst_buffer_ref (buf);
+ ctx->callback = callback;
+ ctx->user_data = user_data;
+ ctx->destroy_notify = destroy_notify;
+ ctx->context = g_main_context_ref (context);
+ ctx->finished = FALSE;
+ ctx->pipeline = pipeline;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ source = g_timeout_source_new (timeout / GST_MSECOND);
+ g_source_set_callback (source,
+ (GSourceFunc) convert_frame_timeout_callback, ctx, NULL);
+ ctx->timeout_id = g_source_attach (source, context);
+ g_source_unref (source);
+ }
+
+ g_signal_connect (src, "need-data",
+ G_CALLBACK (convert_frame_need_data_callback), ctx);
+ g_signal_connect (sink, "new-preroll",
+ G_CALLBACK (convert_frame_new_buffer_callback), ctx);
+
+ source = gst_bus_create_watch (bus);
+ g_source_set_callback (source, (GSourceFunc) convert_frame_bus_callback,
+ ctx, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ gst_object_unref (bus);
+ gst_caps_unref (to_caps_copy);
+
+ return;
+ /* ERRORS */
+no_pipeline:
+ {
+ GstVideoConvertFrameCallbackContext *ctx;
+ GSource *source;
+
+ gst_caps_unref (to_caps_copy);
+
+ ctx = g_slice_new0 (GstVideoConvertFrameCallbackContext);
+ ctx->callback = callback;
+ ctx->user_data = user_data;
+ ctx->destroy_notify = destroy_notify;
+ ctx->buffer = NULL;
+ ctx->error = error;
+
+ source = g_timeout_source_new (0);
+ g_source_set_callback (source,
+ (GSourceFunc) convert_frame_dispatch_callback, ctx,
+ (GDestroyNotify) gst_video_convert_frame_callback_context_free);
+ g_source_attach (source, context);
+ g_source_unref (source);
+ }
+}
diff --git a/gst-libs/gst/video/gstmetavideo.c b/gst-libs/gst/video/gstmetavideo.c
new file mode 100644
index 0000000..2946704
--- /dev/null
+++ b/gst-libs/gst/video/gstmetavideo.c
@@ -0,0 +1,254 @@
+/* GStreamer
+ * Copyright (C) <2011> 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 "gstmetavideo.h"
+
+/* video metadata */
+const GstMetaInfo *
+gst_meta_video_get_info (void)
+{
+ static const GstMetaInfo *meta_video_info = NULL;
+
+ if (meta_video_info == NULL) {
+ meta_video_info = gst_meta_register (GST_META_API_VIDEO, "GstMetaVideo",
+ sizeof (GstMetaVideo),
+ (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) NULL,
+ (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL);
+ }
+ return meta_video_info;
+}
+
+/**
+ * gst_buffer_get_meta_video_id:
+ * @buffer: a #GstBuffer
+ * @id: a metadata id
+ *
+ * Find the #GstMetaVideo on @buffer with the given @id.
+ *
+ * Buffers can contain multiple #GstMetaVideo metadata items when dealing with
+ * multiview buffers.
+ *
+ * Returns: the #GstMetaVideo with @id or %NULL when there is no such metadata
+ * on @buffer.
+ */
+GstMetaVideo *
+gst_buffer_get_meta_video_id (GstBuffer * buffer, gint id)
+{
+ gpointer state = NULL;
+ GstMeta *meta;
+ const GstMetaInfo *info = GST_META_INFO_VIDEO;
+
+ while ((meta = gst_buffer_iterate_meta (buffer, &state))) {
+ if (meta->info->api == info->api) {
+ GstMetaVideo *vmeta = (GstMetaVideo *) meta;
+ if (vmeta->id == id)
+ return vmeta;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * gst_buffer_add_meta_video:
+ * @buffer: a #GstBuffer
+ * @flags: #GstVideoFlags
+ * @format: a #GstVideoFormat
+ * @width: the width
+ * @height: the height
+ *
+ * Attaches GstVideoMeta metadata to @buffer with the given parameters and the
+ * default offsets and strides for @format and @width x @height.
+ *
+ * This function calculates the default offsets and strides and then calls
+ * gst_buffer_add_meta_video_full() with them.
+ *
+ * Returns: the #GstMetaVideo on @buffer.
+ */
+GstMetaVideo *
+gst_buffer_add_meta_video (GstBuffer * buffer, GstVideoFlags flags,
+ GstVideoFormat format, guint width, guint height)
+{
+ GstMetaVideo *meta;
+ GstVideoInfo info;
+
+ gst_video_info_set_format (&info, format, width, height);
+
+ meta = gst_buffer_add_meta_video_full (buffer, flags, format, width, height,
+ info.finfo->n_planes, info.offset, info.stride);
+
+ return meta;
+}
+
+/**
+ * gst_buffer_add_meta_video_full:
+ * @buffer: a #GstBuffer
+ * @flags: #GstVideoFlags
+ * @format: a #GstVideoFormat
+ * @width: the width
+ * @height: the height
+ * @n_planes: number of planes
+ * @offset: offset of each plane
+ * @stride: stride of each plane
+ *
+ * Attaches GstVideoMeta metadata to @buffer with the given parameters.
+ *
+ * Returns: the #GstMetaVideo on @buffer.
+ */
+GstMetaVideo *
+gst_buffer_add_meta_video_full (GstBuffer * buffer, GstVideoFlags flags,
+ GstVideoFormat format, guint width, guint height,
+ guint n_planes, gsize offset[GST_VIDEO_MAX_PLANES],
+ gint stride[GST_VIDEO_MAX_PLANES])
+{
+ GstMetaVideo *meta;
+ guint i;
+
+ meta =
+ (GstMetaVideo *) gst_buffer_add_meta (buffer, GST_META_INFO_VIDEO, NULL);
+
+ meta->flags = flags;
+ meta->format = format;
+ meta->id = 0;
+ meta->width = width;
+ meta->height = height;
+ meta->buffer = buffer;
+
+ meta->n_planes = n_planes;
+ for (i = 0; i < n_planes; i++) {
+ meta->offset[i] = offset[i];
+ meta->stride[i] = stride[i];
+ }
+ return meta;
+}
+
+static GstMemory *
+find_mem_for_offset (GstBuffer * buffer, guint * offset, GstMapFlags flags)
+{
+ guint n, i;
+ GstMemory *res = NULL;
+
+ n = gst_buffer_n_memory (buffer);
+ for (i = 0; i < n; i++) {
+ GstMemory *mem = NULL;
+ gsize size;
+
+ mem = gst_buffer_peek_memory (buffer, i, flags);
+ size = gst_memory_get_sizes (mem, NULL, NULL);
+
+ if (*offset < size) {
+ res = mem;
+ break;
+ }
+ *offset -= size;
+ }
+ return res;
+}
+
+/**
+ * gst_meta_video_map:
+ * @meta: a #GstVideoMeta
+ * @plane: a plane
+ * @stride: result stride
+ * @flags: @GstMapFlags
+ *
+ * Map the video plane with index @plane in @meta and return a pointer to the
+ * first byte of the plane and the stride of the plane.
+ *
+ * Returns: a pointer to the first byte of the plane data
+ */
+gpointer
+gst_meta_video_map (GstMetaVideo * meta, guint plane, gint * stride,
+ GstMapFlags flags)
+{
+ guint offset;
+ gboolean write;
+ GstBuffer *buffer;
+ GstMemory *mem;
+ guint8 *base;
+
+ g_return_val_if_fail (meta != NULL, NULL);
+ g_return_val_if_fail (plane < meta->n_planes, NULL);
+ g_return_val_if_fail (stride != NULL, NULL);
+
+ buffer = meta->buffer;
+ g_return_val_if_fail (buffer != NULL, NULL);
+
+ write = (flags & GST_MAP_WRITE) != 0;
+ g_return_val_if_fail (!write || gst_buffer_is_writable (buffer), NULL);
+
+ offset = meta->offset[plane];
+ *stride = meta->stride[plane];
+ /* find the memory block for this plane, this is the memory block containing
+ * the plane offset */
+ mem = find_mem_for_offset (buffer, &offset, flags);
+
+ base = gst_memory_map (mem, NULL, NULL, flags);
+
+ /* move to the right offset inside the block */
+ return base + offset;
+}
+
+/**
+ * gst_meta_video_unmap:
+ * @meta: a #GstVideoMeta
+ * @plane: a plane
+ * @data: the data to unmap
+ *
+ * Unmap previously mapped data with gst_video_meta_map().
+ *
+ * Returns: TRUE if the memory was successfully unmapped.
+ */
+gboolean
+gst_meta_video_unmap (GstMetaVideo * meta, guint plane, gpointer data)
+{
+ guint offset;
+ GstBuffer *buffer;
+ GstMemory *mem;
+ guint8 *base;
+
+ g_return_val_if_fail (meta != NULL, FALSE);
+ g_return_val_if_fail (plane < meta->n_planes, FALSE);
+
+ buffer = meta->buffer;
+ g_return_val_if_fail (buffer != NULL, FALSE);
+
+ offset = meta->offset[plane];
+ mem = find_mem_for_offset (buffer, &offset, GST_MAP_READ);
+ base = data;
+
+ gst_memory_unmap (mem, base - offset, -1);
+
+ return TRUE;
+}
+
+const GstMetaInfo *
+gst_meta_video_crop_get_info (void)
+{
+ static const GstMetaInfo *meta_video_crop_info = NULL;
+
+ if (meta_video_crop_info == NULL) {
+ meta_video_crop_info =
+ gst_meta_register (GST_META_API_VIDEO_CROP, "GstMetaVideoCrop",
+ sizeof (GstMetaVideoCrop), (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) NULL, (GstMetaCopyFunction) NULL,
+ (GstMetaTransformFunction) NULL);
+ }
+ return meta_video_crop_info;
+}
diff --git a/gst-libs/gst/video/gstmetavideo.h b/gst-libs/gst/video/gstmetavideo.h
new file mode 100644
index 0000000..12c1ed1
--- /dev/null
+++ b/gst-libs/gst/video/gstmetavideo.h
@@ -0,0 +1,116 @@
+/* GStreamer
+ * Copyright (C) <2011> 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 __GST_META_VIDEO_H__
+#define __GST_META_VIDEO_H__
+
+#include <gst/gst.h>
+
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+#define GST_META_API_VIDEO "GstMetaVideo"
+#define GST_META_INFO_VIDEO (gst_meta_video_get_info())
+typedef struct _GstMetaVideo GstMetaVideo;
+
+#define GST_META_API_VIDEO_CROP "GstMetaVideoCrop"
+#define GST_META_INFO_VIDEO_CROP (gst_meta_video_crop_get_info())
+typedef struct _GstMetaVideoCrop GstMetaVideoCrop;
+
+/**
+ * GstMetaVideo:
+ * @meta: parent #GstMeta
+ * @buffer: the buffer this metadata belongs to
+ * @flags: additional video flags
+ * @format: the video format
+ * @id: identifier of the frame
+ * @width: the video width
+ * @height: the video height
+ * @n_planes: the number of planes in the image
+ * @offset: array of offsets for the planes
+ * @stride: array of strides for the planes
+ * @map: map the memory of a plane
+ * @unmap: unmap the memory of a plane
+ *
+ * Extra buffer metadata describing image properties
+ */
+struct _GstMetaVideo {
+ GstMeta meta;
+
+ GstBuffer *buffer;
+
+ GstVideoFlags flags;
+ GstVideoFormat format;
+ gint id;
+ guint width;
+ guint height;
+
+ guint n_planes;
+ gsize offset[GST_VIDEO_MAX_PLANES];
+ gint stride[GST_VIDEO_MAX_PLANES];
+
+ gpointer (*map) (GstMetaVideo *meta, guint plane, gint *stride,
+ GstMapFlags flags);
+ gboolean (*unmap) (GstMetaVideo *meta, guint plane, gpointer data);
+};
+
+const GstMetaInfo * gst_meta_video_get_info (void);
+
+#define gst_buffer_get_meta_video(b) ((GstMetaVideo*)gst_buffer_get_meta((b),GST_META_INFO_VIDEO))
+GstMetaVideo * gst_buffer_get_meta_video_id (GstBuffer *buffer, gint id);
+
+GstMetaVideo * gst_buffer_add_meta_video (GstBuffer *buffer, GstVideoFlags flags,
+ GstVideoFormat format, guint width, guint height);
+GstMetaVideo * gst_buffer_add_meta_video_full (GstBuffer *buffer, GstVideoFlags flags,
+ GstVideoFormat format, guint width, guint height,
+ guint n_planes, gsize offset[GST_VIDEO_MAX_PLANES],
+ gint stride[GST_VIDEO_MAX_PLANES]);
+
+gpointer gst_meta_video_map (GstMetaVideo *meta, guint plane, gint *stride,
+ GstMapFlags flags);
+gboolean gst_meta_video_unmap (GstMetaVideo *meta, guint plane, gpointer data);
+
+/**
+ * GstMetaVideoCrop:
+ * @meta: parent #GstMeta
+ * @x: the horizontal offset
+ * @y: the vertical offset
+ * @width: the cropped width
+ * @height: the cropped height
+ *
+ * Extra buffer metadata describing image cropping.
+ */
+struct _GstMetaVideoCrop {
+ GstMeta meta;
+
+ guint x;
+ guint y;
+ guint width;
+ guint height;
+};
+
+const GstMetaInfo * gst_meta_video_crop_get_info (void);
+
+#define gst_buffer_get_meta_video_crop(b) ((GstMetaVideoCrop*)gst_buffer_get_meta((b),GST_META_INFO_VIDEO_CROP))
+#define gst_buffer_add_meta_video_crop(b) ((GstMetaVideoCrop*)gst_buffer_add_meta((b),GST_META_INFO_VIDEO_CROP, NULL))
+
+G_END_DECLS
+
+#endif /* __GST_META_VIDEO_H__ */
diff --git a/gst-libs/gst/video/gstvideofilter.c b/gst-libs/gst/video/gstvideofilter.c
new file mode 100644
index 0000000..16b0cb2
--- /dev/null
+++ b/gst-libs/gst/video/gstvideofilter.c
@@ -0,0 +1,123 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2003> David Schleef <ds@schleef.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.
+ */
+
+ /**
+ * SECTION:gstvideofilter
+ * @short_description: Base class for video filters
+ *
+ * <refsect2>
+ * <para>
+ * Provides useful functions and a base class for video filters.
+ * </para>
+ * <para>
+ * The videofilter will by default enable QoS on the parent GstBaseTransform
+ * to implement frame dropping.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvideofilter.h"
+
+#include <gst/video/video.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_video_filter_debug);
+#define GST_CAT_DEFAULT gst_video_filter_debug
+
+static void gst_video_filter_class_init (gpointer g_class, gpointer class_data);
+static void gst_video_filter_init (GTypeInstance * instance, gpointer g_class);
+
+static GstBaseTransformClass *parent_class = NULL;
+
+GType
+gst_video_filter_get_type (void)
+{
+ static GType video_filter_type = 0;
+
+ if (!video_filter_type) {
+ static const GTypeInfo video_filter_info = {
+ sizeof (GstVideoFilterClass),
+ NULL,
+ NULL,
+ gst_video_filter_class_init,
+ NULL,
+ NULL,
+ sizeof (GstVideoFilter),
+ 0,
+ gst_video_filter_init,
+ };
+
+ video_filter_type = g_type_register_static (GST_TYPE_BASE_TRANSFORM,
+ "GstVideoFilter", &video_filter_info, G_TYPE_FLAG_ABSTRACT);
+ }
+ return video_filter_type;
+}
+
+static gboolean
+gst_video_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ gsize * size)
+{
+ GstVideoInfo info;
+
+ if (!gst_video_info_from_caps (&info, caps)) {
+ GST_WARNING_OBJECT (btrans, "Failed to parse caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ *size = info.size;
+
+ GST_DEBUG_OBJECT (btrans, "Returning size %" G_GSIZE_FORMAT " bytes"
+ "for caps %" GST_PTR_FORMAT, *size, caps);
+
+ return TRUE;
+}
+
+static void
+gst_video_filter_class_init (gpointer g_class, gpointer class_data)
+{
+ GstBaseTransformClass *trans_class;
+ GstVideoFilterClass *klass;
+
+ klass = (GstVideoFilterClass *) g_class;
+ trans_class = (GstBaseTransformClass *) klass;
+
+ trans_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_video_filter_get_unit_size);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_video_filter_debug, "videofilter", 0,
+ "videofilter");
+}
+
+static void
+gst_video_filter_init (GTypeInstance * instance, gpointer g_class)
+{
+ GstVideoFilter *videofilter = GST_VIDEO_FILTER (instance);
+
+ GST_DEBUG_OBJECT (videofilter, "gst_video_filter_init");
+
+ videofilter->inited = FALSE;
+ /* enable QoS */
+ gst_base_transform_set_qos_enabled (GST_BASE_TRANSFORM (videofilter), TRUE);
+}
diff --git a/gst-libs/gst/video/gstvideofilter.h b/gst-libs/gst/video/gstvideofilter.h
new file mode 100644
index 0000000..bb0183e
--- /dev/null
+++ b/gst-libs/gst/video/gstvideofilter.h
@@ -0,0 +1,64 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_VIDEO_FILTER_H__
+#define __GST_VIDEO_FILTER_H__
+
+#include <gst/base/gstbasetransform.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstVideoFilter GstVideoFilter;
+typedef struct _GstVideoFilterClass GstVideoFilterClass;
+
+#define GST_TYPE_VIDEO_FILTER \
+ (gst_video_filter_get_type())
+#define GST_VIDEO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_FILTER,GstVideoFilter))
+#define GST_VIDEO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_FILTER,GstVideoFilterClass))
+#define GST_VIDEO_FILTER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_VIDEO_FILTER, GstVideoFilterClass))
+#define GST_IS_VIDEO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_FILTER))
+#define GST_IS_VIDEO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_FILTER))
+
+struct _GstVideoFilter {
+ GstBaseTransform element;
+
+ gboolean inited;
+};
+
+/**
+ * GstVideoFilterClass:
+ * @parent_class: the parent class structure
+ *
+ * The video filter class structure.
+ */
+struct _GstVideoFilterClass {
+ GstBaseTransformClass parent_class;
+};
+
+GType gst_video_filter_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_FILTER_H__ */
diff --git a/gst-libs/gst/video/gstvideopool.c b/gst-libs/gst/video/gstvideopool.c
new file mode 100644
index 0000000..435a327
--- /dev/null
+++ b/gst-libs/gst/video/gstvideopool.c
@@ -0,0 +1,74 @@
+/* GStreamer
+ * Copyright (C) <2011> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "gst/video/gstvideopool.h"
+
+/**
+ * gst_buffer_pool_config_set_video_alignment:
+ * @config: a #GstStructure
+ * @align: a #GstVideoAlignment
+ *
+ * Set the video alignment in @align to the bufferpool configuration
+ * @config
+ */
+void
+gst_buffer_pool_config_set_video_alignment (GstStructure * config,
+ GstVideoAlignment * align)
+{
+ g_return_if_fail (config != NULL);
+ g_return_if_fail (align != NULL);
+
+ gst_structure_set (config,
+ "padding-top", G_TYPE_UINT, align->padding_top,
+ "padding-bottom", G_TYPE_UINT, align->padding_bottom,
+ "padding-left", G_TYPE_UINT, align->padding_left,
+ "padding-right", G_TYPE_UINT, align->padding_right,
+ "stride-align0", G_TYPE_UINT, align->stride_align[0],
+ "stride-align1", G_TYPE_UINT, align->stride_align[1],
+ "stride-align2", G_TYPE_UINT, align->stride_align[2],
+ "stride-align3", G_TYPE_UINT, align->stride_align[3], NULL);
+}
+
+/**
+ * gst_buffer_pool_config_get_video_alignment:
+ * @config: a #GstStructure
+ * @align: a #GstVideoAlignment
+ *
+ * Get the video alignment from the bufferpool configuration @config in
+ * in @align
+ *
+ * Returns: #TRUE if @config could be parsed correctly.
+ */
+gboolean
+gst_buffer_pool_config_get_video_alignment (GstStructure * config,
+ GstVideoAlignment * align)
+{
+ g_return_val_if_fail (config != NULL, FALSE);
+ g_return_val_if_fail (align != NULL, FALSE);
+
+ return gst_structure_get (config,
+ "padding-top", G_TYPE_UINT, &align->padding_top,
+ "padding-bottom", G_TYPE_UINT, &align->padding_bottom,
+ "padding-left", G_TYPE_UINT, &align->padding_left,
+ "padding-right", G_TYPE_UINT, &align->padding_right,
+ "stride-align0", G_TYPE_UINT, &align->stride_align[0],
+ "stride-align1", G_TYPE_UINT, &align->stride_align[1],
+ "stride-align2", G_TYPE_UINT, &align->stride_align[2],
+ "stride-align3", G_TYPE_UINT, &align->stride_align[3], NULL);
+}
diff --git a/gst-libs/gst/video/gstvideopool.h b/gst-libs/gst/video/gstvideopool.h
new file mode 100644
index 0000000..179c724
--- /dev/null
+++ b/gst-libs/gst/video/gstvideopool.h
@@ -0,0 +1,74 @@
+/* GStreamer
+ * Copyright (C) <2011> 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 __GST_VIDEO_POOL_H__
+#define __GST_VIDEO_POOL_H__
+
+#include <gst/gst.h>
+
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_BUFFER_POOL_OPTION_META_VIDEO:
+ *
+ * An option that can be activated on bufferpool to request video metadata
+ * on buffers from the pool.
+ */
+#define GST_BUFFER_POOL_OPTION_META_VIDEO "GstBufferPoolOptionMetaVideo"
+
+/**
+ * GST_BUFFER_POOL_OPTION_VIDEO_LAYOUT:
+ *
+ * A bufferpool option to enable extra padding. When a bufferpool supports this
+ * option, gst_buffer_pool_set_video_alignment() can be called.
+ */
+#define GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT "GstBufferPoolOptionVideoAlignment"
+
+typedef struct _GstVideoAlignment GstVideoAlignment;
+
+/**
+ * GstVideoAlignment:
+ * @padding_left: extra pixels on the left side
+ * @padding_right: extra pixels on the right side
+ * @padding_top: extra pixels on the top
+ * @padding_bottom: extra pixels on the bottom
+ * @stride_align: array with extra alignment requirements for the strides
+ *
+ * Extra alignment paramters for the memory of video buffers. This
+ * structure is usually used to configure the bufferpool if it supports the
+ * #GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT.
+ */
+struct _GstVideoAlignment
+{
+ guint padding_top;
+ guint padding_bottom;
+ guint padding_left;
+ guint padding_right;
+ guint stride_align[GST_VIDEO_MAX_PLANES];
+};
+
+void gst_buffer_pool_config_set_video_alignment (GstStructure *config, GstVideoAlignment *align);
+gboolean gst_buffer_pool_config_get_video_alignment (GstStructure *config, GstVideoAlignment *align);
+
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_POOL_H__ */
diff --git a/gst-libs/gst/video/gstvideosink.c b/gst-libs/gst/video/gstvideosink.c
new file mode 100644
index 0000000..2e578d3
--- /dev/null
+++ b/gst-libs/gst/video/gstvideosink.c
@@ -0,0 +1,288 @@
+/* GStreamer video sink base class
+ * Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ * Copyright (C) <2009> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstvideosink
+ * @short_description: Base class for video sinks
+ *
+ * <refsect2>
+ * <para>
+ * Provides useful functions and a base class for video sinks.
+ * </para>
+ * <para>
+ * GstVideoSink will configure the default base sink to drop frames that
+ * arrive later than 20ms as this is considered the default threshold for
+ * observing out-of-sync frames.
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvideosink.h"
+
+enum
+{
+ PROP_SHOW_PREROLL_FRAME = 1
+};
+
+#define DEFAULT_SHOW_PREROLL_FRAME TRUE
+
+struct _GstVideoSinkPrivate
+{
+ gboolean show_preroll_frame; /* ATOMIC */
+};
+
+GST_DEBUG_CATEGORY_STATIC (video_sink_debug);
+#define GST_CAT_DEFAULT video_sink_debug
+
+static GstBaseSinkClass *parent_class = NULL;
+
+static void gst_video_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_video_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_video_sink_show_preroll_frame (GstBaseSink * bsink,
+ GstBuffer * buf);
+static GstFlowReturn gst_video_sink_show_frame (GstBaseSink * bsink,
+ GstBuffer * buf);
+
+/**
+ * gst_video_sink_center_rect:
+ * @src: the #GstVideoRectangle describing the source area
+ * @dst: the #GstVideoRectangle describing the destination area
+ * @result: a pointer to a #GstVideoRectangle which will receive the result area
+ * @scaling: a #gboolean indicating if scaling should be applied or not
+ *
+ * Takes @src rectangle and position it at the center of @dst rectangle with or
+ * without @scaling. It handles clipping if the @src rectangle is bigger than
+ * the @dst one and @scaling is set to FALSE.
+ */
+void
+gst_video_sink_center_rect (GstVideoRectangle src, GstVideoRectangle dst,
+ GstVideoRectangle * result, gboolean scaling)
+{
+ g_return_if_fail (result != NULL);
+
+ if (!scaling) {
+ result->w = MIN (src.w, dst.w);
+ result->h = MIN (src.h, dst.h);
+ result->x = (dst.w - result->w) / 2;
+ result->y = (dst.h - result->h) / 2;
+ } else {
+ gdouble src_ratio, dst_ratio;
+
+ src_ratio = (gdouble) src.w / src.h;
+ dst_ratio = (gdouble) dst.w / dst.h;
+
+ if (src_ratio > dst_ratio) {
+ result->w = dst.w;
+ result->h = dst.w / src_ratio;
+ result->x = 0;
+ result->y = (dst.h - result->h) / 2;
+ } else if (src_ratio < dst_ratio) {
+ result->w = dst.h * src_ratio;
+ result->h = dst.h;
+ result->x = (dst.w - result->w) / 2;
+ result->y = 0;
+ } else {
+ result->x = 0;
+ result->y = 0;
+ result->w = dst.w;
+ result->h = dst.h;
+ }
+ }
+
+ GST_DEBUG ("source is %dx%d dest is %dx%d, result is %dx%d with x,y %dx%d",
+ src.w, src.h, dst.w, dst.h, result->w, result->h, result->x, result->y);
+}
+
+/* Initing stuff */
+
+static void
+gst_video_sink_init (GstVideoSink * videosink)
+{
+ videosink->width = 0;
+ videosink->height = 0;
+
+ /* 20ms is more than enough, 80-130ms is noticable */
+ gst_base_sink_set_max_lateness (GST_BASE_SINK (videosink), 20 * GST_MSECOND);
+ gst_base_sink_set_qos_enabled (GST_BASE_SINK (videosink), TRUE);
+
+ videosink->priv = G_TYPE_INSTANCE_GET_PRIVATE (videosink,
+ GST_TYPE_VIDEO_SINK, GstVideoSinkPrivate);
+}
+
+static void
+gst_video_sink_class_init (GstVideoSinkClass * klass)
+{
+ GstBaseSinkClass *basesink_class = (GstBaseSinkClass *) klass;
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->set_property = gst_video_sink_set_property;
+ gobject_class->get_property = gst_video_sink_get_property;
+
+ /**
+ * GstVideoSink:show-preroll-frame
+ *
+ * Whether to show video frames during preroll. If set to #FALSE, video
+ * frames will only be rendered in PLAYING state.
+ *
+ * Since: 0.10.25
+ */
+ g_object_class_install_property (gobject_class, PROP_SHOW_PREROLL_FRAME,
+ g_param_spec_boolean ("show-preroll-frame", "Show preroll frame",
+ "Whether to render video frames during preroll",
+ DEFAULT_SHOW_PREROLL_FRAME,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ basesink_class->render = GST_DEBUG_FUNCPTR (gst_video_sink_show_frame);
+ basesink_class->preroll =
+ GST_DEBUG_FUNCPTR (gst_video_sink_show_preroll_frame);
+
+ g_type_class_add_private (klass, sizeof (GstVideoSinkPrivate));
+}
+
+static void
+gst_video_sink_base_init (gpointer g_class)
+{
+ GST_DEBUG_CATEGORY_INIT (video_sink_debug, "videosink", 0, "GstVideoSink");
+}
+
+static GstFlowReturn
+gst_video_sink_show_preroll_frame (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstVideoSinkClass *klass;
+ GstVideoSink *vsink;
+ gboolean do_show;
+
+ vsink = GST_VIDEO_SINK_CAST (bsink);
+ klass = GST_VIDEO_SINK_GET_CLASS (vsink);
+
+ do_show = g_atomic_int_get (&vsink->priv->show_preroll_frame);
+
+ if (G_UNLIKELY (!do_show)) {
+ GST_DEBUG_OBJECT (bsink, "not rendering frame with ts=%" GST_TIME_FORMAT
+ ", preroll rendering disabled",
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ }
+
+ if (klass->show_frame == NULL || !do_show) {
+ if (parent_class->preroll != NULL)
+ return parent_class->preroll (bsink, buf);
+ else
+ return GST_FLOW_OK;
+ }
+
+ GST_LOG_OBJECT (bsink, "rendering frame, ts=%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ return klass->show_frame (GST_VIDEO_SINK_CAST (bsink), buf);
+}
+
+static GstFlowReturn
+gst_video_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstVideoSinkClass *klass;
+
+ klass = GST_VIDEO_SINK_GET_CLASS (bsink);
+
+ if (klass->show_frame == NULL) {
+ if (parent_class->render != NULL)
+ return parent_class->render (bsink, buf);
+ else
+ return GST_FLOW_OK;
+ }
+
+ GST_LOG_OBJECT (bsink, "rendering frame, ts=%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ return klass->show_frame (GST_VIDEO_SINK_CAST (bsink), buf);
+}
+
+static void
+gst_video_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstVideoSink *vsink;
+
+ vsink = GST_VIDEO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_SHOW_PREROLL_FRAME:
+ g_atomic_int_set (&vsink->priv->show_preroll_frame,
+ g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_video_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstVideoSink *vsink;
+
+ vsink = GST_VIDEO_SINK (object);
+
+ switch (prop_id) {
+ case PROP_SHOW_PREROLL_FRAME:
+ g_value_set_boolean (value,
+ g_atomic_int_get (&vsink->priv->show_preroll_frame));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* Public methods */
+
+GType
+gst_video_sink_get_type (void)
+{
+ static GType videosink_type = 0;
+
+ if (!videosink_type) {
+ static const GTypeInfo videosink_info = {
+ sizeof (GstVideoSinkClass),
+ gst_video_sink_base_init,
+ NULL,
+ (GClassInitFunc) gst_video_sink_class_init,
+ NULL,
+ NULL,
+ sizeof (GstVideoSink),
+ 0,
+ (GInstanceInitFunc) gst_video_sink_init,
+ };
+
+ videosink_type = g_type_register_static (GST_TYPE_BASE_SINK,
+ "GstVideoSink", &videosink_info, 0);
+ }
+
+ return videosink_type;
+}
diff --git a/gst-libs/gst/video/gstvideosink.h b/gst-libs/gst/video/gstvideosink.h
new file mode 100644
index 0000000..4a115e4
--- /dev/null
+++ b/gst-libs/gst/video/gstvideosink.h
@@ -0,0 +1,132 @@
+/* GStreamer video sink base class
+ * Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ * Copyright (C) <2009> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* FIXME 0.11: turn this into a proper base class */
+
+#ifndef __GST_VIDEO_SINK_H__
+#define __GST_VIDEO_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_SINK (gst_video_sink_get_type())
+#define GST_VIDEO_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_SINK, GstVideoSink))
+#define GST_VIDEO_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VIDEO_SINK, GstVideoSinkClass))
+#define GST_IS_VIDEO_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_SINK))
+#define GST_IS_VIDEO_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VIDEO_SINK))
+#define GST_VIDEO_SINK_GET_CLASS(klass) \
+ (G_TYPE_INSTANCE_GET_CLASS ((klass), GST_TYPE_VIDEO_SINK, GstVideoSinkClass))
+
+/**
+ * GST_VIDEO_SINK_CAST:
+ * @obj: a #GstVideoSink or derived object
+ *
+ * Cast @obj to a #GstVideoSink without runtime type check.
+ *
+ * Since: 0.10.12
+ */
+#define GST_VIDEO_SINK_CAST(obj) ((GstVideoSink *) (obj))
+
+/**
+ * GST_VIDEO_SINK_PAD:
+ * @obj: a #GstVideoSink
+ *
+ * Get the sink #GstPad of @obj.
+ */
+#define GST_VIDEO_SINK_PAD(obj) GST_BASE_SINK_PAD(obj)
+
+#define GST_VIDEO_SINK_WIDTH(obj) (GST_VIDEO_SINK_CAST (obj)->width)
+#define GST_VIDEO_SINK_HEIGHT(obj) (GST_VIDEO_SINK_CAST (obj)->height)
+
+typedef struct _GstVideoSink GstVideoSink;
+typedef struct _GstVideoSinkClass GstVideoSinkClass;
+typedef struct _GstVideoRectangle GstVideoRectangle;
+typedef struct _GstVideoSinkPrivate GstVideoSinkPrivate;
+
+/**
+ * GstVideoRectangle:
+ * @x: X coordinate of rectangle's top-left point
+ * @y: Y coordinate of rectangle's top-left point
+ * @w: width of the rectangle
+ * @h: height of the rectangle
+ *
+ * Helper structure representing a rectangular area.
+ */
+struct _GstVideoRectangle {
+ gint x;
+ gint y;
+ gint w;
+ gint h;
+};
+
+/**
+ * GstVideoSink:
+ * @height: video height (derived class needs to set this)
+ * @width: video width (derived class needs to set this)
+ *
+ * The video sink instance structure. Derived video sinks should set the
+ * @height and @width members.
+ */
+struct _GstVideoSink {
+ GstBaseSink element; /* FIXME 0.11: this should not be called 'element' */
+
+ /*< public >*/
+ gint width, height;
+
+ /*< private >*/
+ GstVideoSinkPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+/**
+ * GstVideoSinkClass:
+ * @parent_class: the parent class structure
+ * @show_frame: render a video frame. Maps to #GstBaseSinkClass.render() and
+ * #GstBaseSinkClass.preroll() vfuncs. Rendering during preroll will be
+ * suppressed if the #GstVideoSink:show-preroll-frame property is set to
+ * %FALSE. Since: 0.10.25
+ *
+ * The video sink class structure. Derived classes should override the
+ * @show_frame virtual function.
+ */
+struct _GstVideoSinkClass {
+ GstBaseSinkClass parent_class;
+
+ GstFlowReturn (*show_frame) (GstVideoSink *video_sink, GstBuffer *buf);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+GType gst_video_sink_get_type (void);
+
+void gst_video_sink_center_rect (GstVideoRectangle src, GstVideoRectangle dst,
+ GstVideoRectangle *result, gboolean scaling);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_SINK_H__ */
diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c
new file mode 100644
index 0000000..130c980
--- /dev/null
+++ b/gst-libs/gst/video/video.c
@@ -0,0 +1,1538 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Library <2002> Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2007 David A. Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include "video.h"
+#include "gstmetavideo.h"
+
+static int fill_planes (GstVideoInfo * info);
+
+typedef struct
+{
+ guint32 fourcc;
+ GstVideoFormatInfo info;
+} VideoFormat;
+
+/* depths: bits, n_components, shift, depth */
+#define DPTH0 0, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+#define DPTH8 8, 1, { 0, 0, 0, 0 }, { 8, 0, 0, 0 }
+#define DPTH888 8, 3, { 0, 0, 0, 0 }, { 8, 8, 8, 0 }
+#define DPTH8888 8, 4, { 0, 0, 0, 0 }, { 8, 8, 8, 8 }
+#define DPTH10_10_10 10, 3, { 0, 0, 0, 0 }, { 10, 10, 10, 0 }
+#define DPTH16 16, 1, { 0, 0, 0, 0 }, { 16, 0, 0, 0 }
+#define DPTH16_16_16 16, 3, { 0, 0, 0, 0 }, { 16, 16, 16, 0 }
+#define DPTH16_16_16_16 16, 4, { 0, 0, 0, 0 }, { 16, 16, 16, 16 }
+#define DPTH555 16, 3, { 10, 5, 0, 0 }, { 5, 5, 5, 0 }
+#define DPTH565 16, 3, { 11, 5, 0, 0 }, { 5, 6, 5, 0 }
+
+/* pixel strides */
+#define PSTR0 { 0, 0, 0, 0 }
+#define PSTR1 { 1, 0, 0, 0 }
+#define PSTR111 { 1, 1, 1, 0 }
+#define PSTR1111 { 1, 1, 1, 1 }
+#define PSTR122 { 1, 2, 2, 0 }
+#define PSTR2 { 2, 0, 0, 0 }
+#define PSTR222 { 2, 2, 2, 0 }
+#define PSTR244 { 2, 4, 4, 0 }
+#define PSTR444 { 4, 4, 4, 0 }
+#define PSTR4444 { 4, 4, 4, 4 }
+#define PSTR333 { 3, 3, 3, 0 }
+#define PSTR488 { 4, 8, 8, 0 }
+#define PSTR8888 { 8, 8, 8, 8 }
+
+/* planes */
+#define PLANE_NA 0, { 0, 0, 0, 0 }
+#define PLANE0 1, { 0, 0, 0, 0 }
+#define PLANE011 2, { 0, 1, 1, 0 }
+#define PLANE012 3, { 0, 1, 2, 0 }
+#define PLANE0123 4, { 0, 1, 2, 3 }
+#define PLANE021 3, { 0, 2, 1, 0 }
+
+/* offsets */
+#define OFFS0 { 0, 0, 0, 0 }
+#define OFFS013 { 0, 1, 3, 0 }
+#define OFFS102 { 1, 0, 2, 0 }
+#define OFFS1230 { 1, 2, 3, 0 }
+#define OFFS012 { 0, 1, 2, 0 }
+#define OFFS210 { 2, 1, 0, 0 }
+#define OFFS123 { 1, 2, 3, 0 }
+#define OFFS321 { 3, 2, 1, 0 }
+#define OFFS0123 { 0, 1, 2, 3 }
+#define OFFS2103 { 2, 1, 0, 3 }
+#define OFFS3210 { 3, 2, 1, 0 }
+#define OFFS031 { 0, 3, 1, 0 }
+#define OFFS026 { 0, 2, 6, 0 }
+#define OFFS001 { 0, 0, 1, 0 }
+#define OFFS010 { 0, 1, 0, 0 }
+#define OFFS104 { 1, 0, 4, 0 }
+#define OFFS2460 { 2, 4, 6, 0 }
+
+/* subsampling */
+#define SUB410 { 0, 2, 2, 0 }, { 0, 2, 2, 0 }
+#define SUB411 { 0, 2, 2, 0 }, { 0, 0, 0, 0 }
+#define SUB420 { 0, 1, 1, 0 }, { 0, 1, 1, 0 }
+#define SUB422 { 0, 1, 1, 0 }, { 0, 0, 0, 0 }
+#define SUB4 { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+#define SUB444 { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+#define SUB4444 { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+#define SUB4204 { 0, 1, 1, 0 }, { 0, 1, 1, 0 }
+
+#define MAKE_YUV_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub ) \
+ { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV, depth, pstride, plane, offs, sub } }
+#define MAKE_YUVA_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub) \
+ { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } }
+
+#define MAKE_RGB_FORMAT(name, desc, depth, pstride, plane, offs, sub) \
+ { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB, depth, pstride, plane, offs, sub } }
+#define MAKE_RGBA_FORMAT(name, desc, depth, pstride, plane, offs, sub) \
+ { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } }
+
+#define MAKE_GRAY_FORMAT(name, desc, depth, pstride, plane, offs, sub) \
+ { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY, depth, pstride, plane, offs, sub } }
+
+static VideoFormat formats[] = {
+ {0x00000000, {GST_VIDEO_FORMAT_UNKNOWN, "UNKNOWN", "unknown video", 0, DPTH0,
+ PSTR0, PLANE_NA,
+ OFFS0}},
+
+ MAKE_YUV_FORMAT (I420, "raw video", GST_MAKE_FOURCC ('I', '4', '2', '0'),
+ DPTH888, PSTR111,
+ PLANE012, OFFS0, SUB420),
+ MAKE_YUV_FORMAT (YV12, "raw video", GST_MAKE_FOURCC ('Y', 'V', '1', '2'),
+ DPTH888, PSTR111,
+ PLANE021, OFFS0, SUB420),
+ MAKE_YUV_FORMAT (YUY2, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
+ DPTH888, PSTR244,
+ PLANE0, OFFS013, SUB422),
+ MAKE_YUV_FORMAT (UYVY, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
+ DPTH888, PSTR244,
+ PLANE0, OFFS102, SUB422),
+ MAKE_YUVA_FORMAT (AYUV, "raw video", GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'),
+ DPTH8888,
+ PSTR4444, PLANE0, OFFS1230, SUB4444),
+ MAKE_RGB_FORMAT (RGBx, "raw video", DPTH888, PSTR444, PLANE0, OFFS012,
+ SUB444),
+ MAKE_RGB_FORMAT (BGRx, "raw video", DPTH888, PSTR444, PLANE0, OFFS210,
+ SUB444),
+ MAKE_RGB_FORMAT (xRGB, "raw video", DPTH888, PSTR444, PLANE0, OFFS123,
+ SUB444),
+ MAKE_RGB_FORMAT (xBGR, "raw video", DPTH888, PSTR444, PLANE0, OFFS321,
+ SUB444),
+ MAKE_RGBA_FORMAT (RGBA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS0123,
+ SUB4444),
+ MAKE_RGBA_FORMAT (BGRA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS2103,
+ SUB4444),
+ MAKE_RGBA_FORMAT (ARGB, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS1230,
+ SUB4444),
+ MAKE_RGBA_FORMAT (ABGR, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS3210,
+ SUB4444),
+ MAKE_RGB_FORMAT (RGB, "raw video", DPTH888, PSTR333, PLANE0, OFFS012, SUB444),
+ MAKE_RGB_FORMAT (BGR, "raw video", DPTH888, PSTR333, PLANE0, OFFS210, SUB444),
+
+ MAKE_YUV_FORMAT (Y41B, "raw video", GST_MAKE_FOURCC ('Y', '4', '1', 'B'),
+ DPTH888, PSTR111,
+ PLANE012, OFFS0, SUB411),
+ MAKE_YUV_FORMAT (Y42B, "raw video", GST_MAKE_FOURCC ('Y', '4', '2', 'B'),
+ DPTH888, PSTR111,
+ PLANE012, OFFS0, SUB422),
+ MAKE_YUV_FORMAT (YVYU, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'),
+ DPTH888, PSTR244,
+ PLANE0, OFFS031, SUB422),
+ MAKE_YUV_FORMAT (Y444, "raw video", GST_MAKE_FOURCC ('Y', '4', '4', '4'),
+ DPTH888, PSTR111,
+ PLANE012, OFFS0, SUB444),
+ MAKE_YUV_FORMAT (v210, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '0'),
+ DPTH10_10_10,
+ PSTR0, PLANE0, OFFS0, SUB422),
+ MAKE_YUV_FORMAT (v216, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '6'),
+ DPTH16_16_16,
+ PSTR488, PLANE0, OFFS026, SUB422),
+ MAKE_YUV_FORMAT (NV12, "raw video", GST_MAKE_FOURCC ('N', 'V', '1', '2'),
+ DPTH888, PSTR122,
+ PLANE011, OFFS001, SUB420),
+ MAKE_YUV_FORMAT (NV21, "raw video", GST_MAKE_FOURCC ('N', 'V', '2', '1'),
+ DPTH888, PSTR122,
+ PLANE011, OFFS010, SUB420),
+
+ MAKE_GRAY_FORMAT (GRAY8, "raw video", DPTH8, PSTR1, PLANE0, OFFS0, SUB4),
+ MAKE_GRAY_FORMAT (GRAY16_BE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, SUB4),
+ MAKE_GRAY_FORMAT (GRAY16_LE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, SUB4),
+
+ MAKE_YUV_FORMAT (v308, "raw video", GST_MAKE_FOURCC ('v', '3', '0', '8'),
+ DPTH888, PSTR333,
+ PLANE0, OFFS012, SUB444),
+ MAKE_YUV_FORMAT (Y800, "raw video", GST_MAKE_FOURCC ('Y', '8', '0', '0'),
+ DPTH8, PSTR1,
+ PLANE0, OFFS0, SUB4),
+ MAKE_YUV_FORMAT (Y16, "raw video", GST_MAKE_FOURCC ('Y', '1', '6', ' '),
+ DPTH16, PSTR2,
+ PLANE0, OFFS0, SUB4),
+
+ MAKE_RGB_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444),
+ MAKE_RGB_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444),
+ MAKE_RGB_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444),
+ MAKE_RGB_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444),
+
+ MAKE_YUV_FORMAT (UYVP, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'),
+ DPTH10_10_10,
+ PSTR0, PLANE0, OFFS0, SUB422),
+ MAKE_YUVA_FORMAT (A420, "raw video", GST_MAKE_FOURCC ('A', '4', '2', '0'),
+ DPTH8888,
+ PSTR1111, PLANE0123, OFFS0, SUB4204),
+ MAKE_RGBA_FORMAT (RGB8_PALETTED, "raw video", DPTH8888, PSTR1111, PLANE0,
+ OFFS0, SUB4444),
+ MAKE_YUV_FORMAT (YUV9, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'V', '9'),
+ DPTH888, PSTR111,
+ PLANE012, OFFS0, SUB410),
+ MAKE_YUV_FORMAT (YVU9, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'U', '9'),
+ DPTH888, PSTR111,
+ PLANE021, OFFS0, SUB410),
+ MAKE_YUV_FORMAT (IYU1, "raw video", GST_MAKE_FOURCC ('I', 'Y', 'U', '1'),
+ DPTH888, PSTR0,
+ PLANE0, OFFS104, SUB411),
+ MAKE_RGBA_FORMAT (ARGB64, "raw video", DPTH16_16_16_16, PSTR8888, PLANE0,
+ OFFS2460,
+ SUB444),
+ MAKE_YUVA_FORMAT (AYUV64, "raw video", 0x00000000, DPTH16_16_16_16, PSTR8888,
+ PLANE0,
+ OFFS2460, SUB444),
+ MAKE_YUV_FORMAT (r210, "raw video", GST_MAKE_FOURCC ('r', '2', '1', '0'),
+ DPTH10_10_10,
+ PSTR444, PLANE0, OFFS0, SUB444),
+};
+
+/**
+ * SECTION:gstvideo
+ * @short_description: Support library for video operations
+ *
+ * <refsect2>
+ * <para>
+ * This library contains some helper functions and includes the
+ * videosink and videofilter base classes.
+ * </para>
+ * </refsect2>
+ */
+
+/**
+ * gst_video_calculate_display_ratio:
+ * @dar_n: Numerator of the calculated display_ratio
+ * @dar_d: Denominator of the calculated display_ratio
+ * @video_width: Width of the video frame in pixels
+ * @video_height: Height of the video frame in pixels
+ * @video_par_n: Numerator of the pixel aspect ratio of the input video.
+ * @video_par_d: Denominator of the pixel aspect ratio of the input video.
+ * @display_par_n: Numerator of the pixel aspect ratio of the display device
+ * @display_par_d: Denominator of the pixel aspect ratio of the display device
+ *
+ * Given the Pixel Aspect Ratio and size of an input video frame, and the
+ * pixel aspect ratio of the intended display device, calculates the actual
+ * display ratio the video will be rendered with.
+ *
+ * Returns: A boolean indicating success and a calculated Display Ratio in the
+ * dar_n and dar_d parameters.
+ * The return value is FALSE in the case of integer overflow or other error.
+ *
+ * Since: 0.10.7
+ */
+gboolean
+gst_video_calculate_display_ratio (guint * dar_n, guint * dar_d,
+ guint video_width, guint video_height,
+ guint video_par_n, guint video_par_d,
+ guint display_par_n, guint display_par_d)
+{
+ gint num, den;
+ gint tmp_n, tmp_d;
+
+ g_return_val_if_fail (dar_n != NULL, FALSE);
+ g_return_val_if_fail (dar_d != NULL, FALSE);
+
+ /* Calculate (video_width * video_par_n * display_par_d) /
+ * (video_height * video_par_d * display_par_n) */
+ if (!gst_util_fraction_multiply (video_width, video_height, video_par_n,
+ video_par_d, &tmp_n, &tmp_d))
+ goto error_overflow;
+
+ if (!gst_util_fraction_multiply (tmp_n, tmp_d, display_par_d, display_par_n,
+ &num, &den))
+ goto error_overflow;
+
+ g_return_val_if_fail (num > 0, FALSE);
+ g_return_val_if_fail (den > 0, FALSE);
+
+ *dar_n = num;
+ *dar_d = den;
+
+ return TRUE;
+
+ /* ERRORS */
+error_overflow:
+ {
+ GST_WARNING ("overflow in multiply");
+ return FALSE;
+ }
+}
+
+static GstVideoFormat
+gst_video_format_from_rgb32_masks (int red_mask, int green_mask, int blue_mask)
+{
+ if (red_mask == 0xff000000 && green_mask == 0x00ff0000 &&
+ blue_mask == 0x0000ff00) {
+ return GST_VIDEO_FORMAT_RGBx;
+ }
+ if (red_mask == 0x0000ff00 && green_mask == 0x00ff0000 &&
+ blue_mask == 0xff000000) {
+ return GST_VIDEO_FORMAT_BGRx;
+ }
+ if (red_mask == 0x00ff0000 && green_mask == 0x0000ff00 &&
+ blue_mask == 0x000000ff) {
+ return GST_VIDEO_FORMAT_xRGB;
+ }
+ if (red_mask == 0x000000ff && green_mask == 0x0000ff00 &&
+ blue_mask == 0x00ff0000) {
+ return GST_VIDEO_FORMAT_xBGR;
+ }
+
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+static GstVideoFormat
+gst_video_format_from_rgba32_masks (int red_mask, int green_mask,
+ int blue_mask, int alpha_mask)
+{
+ if (red_mask == 0xff000000 && green_mask == 0x00ff0000 &&
+ blue_mask == 0x0000ff00 && alpha_mask == 0x000000ff) {
+ return GST_VIDEO_FORMAT_RGBA;
+ }
+ if (red_mask == 0x0000ff00 && green_mask == 0x00ff0000 &&
+ blue_mask == 0xff000000 && alpha_mask == 0x000000ff) {
+ return GST_VIDEO_FORMAT_BGRA;
+ }
+ if (red_mask == 0x00ff0000 && green_mask == 0x0000ff00 &&
+ blue_mask == 0x000000ff && alpha_mask == 0xff000000) {
+ return GST_VIDEO_FORMAT_ARGB;
+ }
+ if (red_mask == 0x000000ff && green_mask == 0x0000ff00 &&
+ blue_mask == 0x00ff0000 && alpha_mask == 0xff000000) {
+ return GST_VIDEO_FORMAT_ABGR;
+ }
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+static GstVideoFormat
+gst_video_format_from_rgb24_masks (int red_mask, int green_mask, int blue_mask)
+{
+ if (red_mask == 0xff0000 && green_mask == 0x00ff00 && blue_mask == 0x0000ff) {
+ return GST_VIDEO_FORMAT_RGB;
+ }
+ if (red_mask == 0x0000ff && green_mask == 0x00ff00 && blue_mask == 0xff0000) {
+ return GST_VIDEO_FORMAT_BGR;
+ }
+
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+#define GST_VIDEO_COMP1_MASK_16_INT 0xf800
+#define GST_VIDEO_COMP2_MASK_16_INT 0x07e0
+#define GST_VIDEO_COMP3_MASK_16_INT 0x001f
+
+#define GST_VIDEO_COMP1_MASK_15_INT 0x7c00
+#define GST_VIDEO_COMP2_MASK_15_INT 0x03e0
+#define GST_VIDEO_COMP3_MASK_15_INT 0x001f
+
+static GstVideoFormat
+gst_video_format_from_rgb16_masks (int red_mask, int green_mask, int blue_mask)
+{
+ if (red_mask == GST_VIDEO_COMP1_MASK_16_INT
+ && green_mask == GST_VIDEO_COMP2_MASK_16_INT
+ && blue_mask == GST_VIDEO_COMP3_MASK_16_INT) {
+ return GST_VIDEO_FORMAT_RGB16;
+ }
+ if (red_mask == GST_VIDEO_COMP3_MASK_16_INT
+ && green_mask == GST_VIDEO_COMP2_MASK_16_INT
+ && blue_mask == GST_VIDEO_COMP1_MASK_16_INT) {
+ return GST_VIDEO_FORMAT_BGR16;
+ }
+ if (red_mask == GST_VIDEO_COMP1_MASK_15_INT
+ && green_mask == GST_VIDEO_COMP2_MASK_15_INT
+ && blue_mask == GST_VIDEO_COMP3_MASK_15_INT) {
+ return GST_VIDEO_FORMAT_RGB15;
+ }
+ if (red_mask == GST_VIDEO_COMP3_MASK_15_INT
+ && green_mask == GST_VIDEO_COMP2_MASK_15_INT
+ && blue_mask == GST_VIDEO_COMP1_MASK_15_INT) {
+ return GST_VIDEO_FORMAT_BGR15;
+ }
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+/**
+ * gst_video_format_from_masks:
+ * @depth: the amount of bits used for a pixel
+ * @bpp: the amount of bits used to store a pixel. This value is bigger than
+ * @depth
+ * @endianness: the endianness of the masks
+ * @red_mask: the red mask
+ * @green_mask: the green mask
+ * @blue_mask: the blue mask
+ * @alpha_mask: the optional alpha mask
+ *
+ * Find the #GstVideoFormat for the given parameters.
+ *
+ * Returns: a #GstVideoFormat or GST_VIDEO_FORMAT_UNKNOWN when the parameters to
+ * not specify a known format.
+ */
+GstVideoFormat
+gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
+ gint red_mask, gint green_mask, gint blue_mask, gint alpha_mask)
+{
+ GstVideoFormat format;
+
+ /* our caps system handles 24/32bpp RGB as big-endian. */
+ if ((bpp == 24 || bpp == 32) && endianness == G_LITTLE_ENDIAN) {
+ red_mask = GUINT32_TO_BE (red_mask);
+ green_mask = GUINT32_TO_BE (green_mask);
+ blue_mask = GUINT32_TO_BE (blue_mask);
+ endianness = G_BIG_ENDIAN;
+ if (bpp == 24) {
+ red_mask >>= 8;
+ green_mask >>= 8;
+ blue_mask >>= 8;
+ }
+ }
+
+ if (depth == 30 && bpp == 32) {
+ format = GST_VIDEO_FORMAT_r210;
+ } else if (depth == 24 && bpp == 32) {
+ format = gst_video_format_from_rgb32_masks (red_mask, green_mask,
+ blue_mask);
+ } else if (depth == 32 && bpp == 32 && alpha_mask) {
+ format = gst_video_format_from_rgba32_masks (red_mask, green_mask,
+ blue_mask, alpha_mask);
+ } else if (depth == 24 && bpp == 24) {
+ format = gst_video_format_from_rgb24_masks (red_mask, green_mask,
+ blue_mask);
+ } else if ((depth == 15 || depth == 16) && bpp == 16 &&
+ endianness == G_BYTE_ORDER) {
+ format = gst_video_format_from_rgb16_masks (red_mask, green_mask,
+ blue_mask);
+ } else if (depth == 8 && bpp == 8) {
+ format = GST_VIDEO_FORMAT_RGB8_PALETTED;
+ } else if (depth == 64 && bpp == 64) {
+ format = gst_video_format_from_rgba32_masks (red_mask, green_mask,
+ blue_mask, alpha_mask);
+ if (format == GST_VIDEO_FORMAT_ARGB) {
+ format = GST_VIDEO_FORMAT_ARGB64;
+ } else {
+ format = GST_VIDEO_FORMAT_UNKNOWN;
+ }
+ } else {
+ format = GST_VIDEO_FORMAT_UNKNOWN;
+ }
+ return format;
+}
+
+/**
+ * gst_video_format_from_fourcc:
+ * @fourcc: a FOURCC value representing raw YUV video
+ *
+ * Converts a FOURCC value into the corresponding #GstVideoFormat.
+ * If the FOURCC cannot be represented by #GstVideoFormat,
+ * #GST_VIDEO_FORMAT_UNKNOWN is returned.
+ *
+ * Since: 0.10.16
+ *
+ * Returns: the #GstVideoFormat describing the FOURCC value
+ */
+GstVideoFormat
+gst_video_format_from_fourcc (guint32 fourcc)
+{
+ switch (fourcc) {
+ case GST_MAKE_FOURCC ('I', '4', '2', '0'):
+ return GST_VIDEO_FORMAT_I420;
+ case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
+ return GST_VIDEO_FORMAT_YV12;
+ case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
+ return GST_VIDEO_FORMAT_YUY2;
+ case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'):
+ return GST_VIDEO_FORMAT_YVYU;
+ case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
+ return GST_VIDEO_FORMAT_UYVY;
+ case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
+ return GST_VIDEO_FORMAT_AYUV;
+ case GST_MAKE_FOURCC ('Y', '4', '1', 'B'):
+ return GST_VIDEO_FORMAT_Y41B;
+ case GST_MAKE_FOURCC ('Y', '4', '2', 'B'):
+ return GST_VIDEO_FORMAT_Y42B;
+ case GST_MAKE_FOURCC ('Y', '4', '4', '4'):
+ return GST_VIDEO_FORMAT_Y444;
+ case GST_MAKE_FOURCC ('v', '2', '1', '0'):
+ return GST_VIDEO_FORMAT_v210;
+ case GST_MAKE_FOURCC ('v', '2', '1', '6'):
+ return GST_VIDEO_FORMAT_v216;
+ case GST_MAKE_FOURCC ('N', 'V', '1', '2'):
+ return GST_VIDEO_FORMAT_NV12;
+ case GST_MAKE_FOURCC ('N', 'V', '2', '1'):
+ return GST_VIDEO_FORMAT_NV21;
+ case GST_MAKE_FOURCC ('v', '3', '0', '8'):
+ return GST_VIDEO_FORMAT_v308;
+ case GST_MAKE_FOURCC ('Y', '8', '0', '0'):
+ case GST_MAKE_FOURCC ('Y', '8', ' ', ' '):
+ case GST_MAKE_FOURCC ('G', 'R', 'E', 'Y'):
+ return GST_VIDEO_FORMAT_Y800;
+ case GST_MAKE_FOURCC ('Y', '1', '6', ' '):
+ return GST_VIDEO_FORMAT_Y16;
+ case GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'):
+ return GST_VIDEO_FORMAT_UYVP;
+ case GST_MAKE_FOURCC ('A', '4', '2', '0'):
+ return GST_VIDEO_FORMAT_A420;
+ case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'):
+ return GST_VIDEO_FORMAT_YUV9;
+ case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'):
+ return GST_VIDEO_FORMAT_YVU9;
+ case GST_MAKE_FOURCC ('I', 'Y', 'U', '1'):
+ return GST_VIDEO_FORMAT_IYU1;
+ case GST_MAKE_FOURCC ('A', 'Y', '6', '4'):
+ return GST_VIDEO_FORMAT_AYUV64;
+ default:
+ return GST_VIDEO_FORMAT_UNKNOWN;
+ }
+}
+
+/**
+ * gst_video_format_from_string:
+ * @format: a format string
+ *
+ * Convert the @format string to its #GstVideoFormat.
+ *
+ * Returns: the #GstVideoFormat for @format or GST_VIDEO_FORMAT_UNKNOWN when the
+ * string is not a known format.
+ */
+GstVideoFormat
+gst_video_format_from_string (const gchar * format)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ if (strcmp (GST_VIDEO_FORMAT_INFO_NAME (&formats[i].info), format) == 0)
+ return GST_VIDEO_FORMAT_INFO_FORMAT (&formats[i].info);
+ }
+ return GST_VIDEO_FORMAT_UNKNOWN;
+}
+
+
+/**
+ * gst_video_format_to_fourcc:
+ * @format: a #GstVideoFormat video format
+ *
+ * Converts a #GstVideoFormat value into the corresponding FOURCC. Only
+ * a few YUV formats have corresponding FOURCC values. If @format has
+ * no corresponding FOURCC value, 0 is returned.
+ *
+ * Since: 0.10.16
+ *
+ * Returns: the FOURCC corresponding to @format
+ */
+guint32
+gst_video_format_to_fourcc (GstVideoFormat format)
+{
+ g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
+
+ if (format >= G_N_ELEMENTS (formats))
+ return 0;
+
+ return formats[format].fourcc;
+}
+
+const gchar *
+gst_video_format_to_string (GstVideoFormat format)
+{
+ g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
+
+ if (format >= G_N_ELEMENTS (formats))
+ return NULL;
+
+ return GST_VIDEO_FORMAT_INFO_NAME (&formats[format].info);
+}
+
+/**
+ * gst_video_format_get_info:
+ * @format: a #GstVideoFormat
+ *
+ * Get the #GstVideoFormatInfo for @format
+ *
+ * Returns: The #GstVideoFormatInfo for @format.
+ */
+const GstVideoFormatInfo *
+gst_video_format_get_info (GstVideoFormat format)
+{
+ g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
+ g_return_val_if_fail (format < G_N_ELEMENTS (formats), NULL);
+
+ return &formats[format].info;
+}
+
+/**
+ * gst_video_info_init:
+ * @info: a #GstVideoInfo
+ *
+ * Initialize @info with default values.
+ */
+void
+gst_video_info_init (GstVideoInfo * info)
+{
+ g_return_if_fail (info != NULL);
+
+ memset (info, 0, sizeof (GstVideoInfo));
+ info->views = 1;
+ /* arrange for sensible defaults, e.g. if turned into caps */
+ info->fps_n = 0;
+ info->fps_d = 1;
+ info->par_n = 1;
+ info->par_d = 1;
+}
+
+/**
+ * gst_video_info_set_format:
+ * @info: a #GstVideoInfo
+ * @format: the format
+ * @width: a width
+ * @height: a height
+ *
+ * Set the default info for a video frame of @format and @width and @height.
+ */
+void
+gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format,
+ guint width, guint height)
+{
+ const GstVideoFormatInfo *finfo;
+
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN);
+
+ finfo = &formats[format].info;
+
+ info->flags = 0;
+ info->finfo = finfo;
+ info->width = width;
+ info->height = height;
+
+ fill_planes (info);
+}
+
+typedef struct
+{
+ const gchar *name;
+ GstVideoChromaSite site;
+} ChromaSiteInfo;
+
+static const ChromaSiteInfo chromasite[] = {
+ {"jpeg", GST_VIDEO_CHROMA_SITE_JPEG},
+ {"mpeg2", GST_VIDEO_CHROMA_SITE_MPEG2},
+ {"dv", GST_VIDEO_CHROMA_SITE_DV}
+};
+
+static GstVideoChromaSite
+gst_video_chroma_from_string (const gchar * s)
+{
+ gint i;
+ for (i = 0; i < G_N_ELEMENTS (chromasite); i++) {
+ if (g_str_equal (chromasite[i].name, s))
+ return chromasite[i].site;
+ }
+ return GST_VIDEO_CHROMA_SITE_UNKNOWN;
+}
+
+static const gchar *
+gst_video_chroma_to_string (GstVideoChromaSite site)
+{
+ gint i;
+ for (i = 0; i < G_N_ELEMENTS (chromasite); i++) {
+ if (chromasite[i].site == site)
+ return chromasite[i].name;
+ }
+ return NULL;
+}
+
+typedef struct
+{
+ const gchar *name;
+ GstVideoColorimetry color;
+} ColorimetryInfo;
+
+#define MAKE_COLORIMETRY(n,r,m,t,p) { GST_VIDEO_COLORIMETRY_ ##n, \
+ { GST_VIDEO_COLOR_RANGE ##r, GST_VIDEO_COLOR_MATRIX_ ##m, \
+ GST_VIDEO_TRANSFER_ ##t, GST_VIDEO_COLOR_PRIMARIES_ ##p } }
+
+static const ColorimetryInfo colorimetry[] = {
+ MAKE_COLORIMETRY (BT601, _16_235, BT601, BT709, BT470M),
+ MAKE_COLORIMETRY (BT709, _16_235, BT709, BT709, BT709),
+ MAKE_COLORIMETRY (SMPTE240M, _16_235, SMPTE240M, SMPTE240M, SMPTE240M),
+};
+
+static const ColorimetryInfo *
+gst_video_get_colorimetry (const gchar * s)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (colorimetry); i++) {
+ if (g_str_equal (colorimetry[i].name, s))
+ return &colorimetry[i];
+ }
+ return NULL;
+}
+
+#define IS_EQUAL(ci,i) (((ci)->color.range == (i)->range) && \
+ ((ci)->color.matrix == (i)->matrix) && \
+ ((ci)->color.transfer == (i)->transfer) && \
+ ((ci)->color.primaries == (i)->primaries))
+
+
+/**
+ * gst_video_colorimetry_from_string
+ * @cinfo: a #GstVideoColorimetry
+ * @color: a colorimetry string
+ *
+ * Parse the colorimetry string and update @cinfo with the parsed
+ * values.
+ *
+ * Returns: #TRUE if @color points to valid colorimetry info.
+ */
+gboolean
+gst_video_colorimetry_from_string (GstVideoColorimetry * cinfo,
+ const gchar * color)
+{
+ const ColorimetryInfo *ci;
+
+ if ((ci = gst_video_get_colorimetry (color))) {
+ *cinfo = ci->color;
+ } else {
+ /* FIXME, split and parse */
+ cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
+ cinfo->matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+ cinfo->transfer = GST_VIDEO_TRANSFER_BT709;
+ cinfo->primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+ }
+ return TRUE;
+}
+
+static void
+gst_video_caps_set_colorimetry (GstCaps * caps, GstVideoColorimetry * cinfo)
+{
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (colorimetry); i++) {
+ if (IS_EQUAL (&colorimetry[i], cinfo)) {
+ gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING,
+ colorimetry[i].name, NULL);
+ return;
+ }
+ }
+ /* FIXME, construct colorimetry */
+}
+
+/**
+ * gst_video_colorimetry_matches:
+ * @info: a #GstVideoInfo
+ * @color: a colorimetry string
+ *
+ * Check if the colorimetry information in @info matches that of the
+ * string @color.
+ *
+ * Returns: #TRUE if @color conveys the same colorimetry info as the color
+ * information in @info.
+ */
+gboolean
+gst_video_colorimetry_matches (GstVideoColorimetry * cinfo, const gchar * color)
+{
+ const ColorimetryInfo *ci;
+
+ if ((ci = gst_video_get_colorimetry (color)))
+ return IS_EQUAL (ci, cinfo);
+
+ return FALSE;
+}
+
+/**
+ * gst_video_info_from_caps:
+ * @info: a #GstVideoInfo
+ * @caps: a #GstCaps
+ *
+ * Parse @caps and update @info.
+ *
+ * Returns: TRUE if @caps could be parsed
+ */
+gboolean
+gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
+{
+ GstStructure *structure;
+ const gchar *s;
+ GstVideoFormat format;
+ gint width, height, views;
+ gint fps_n, fps_d;
+ gboolean interlaced;
+ gint par_n, par_d;
+
+ g_return_val_if_fail (info != NULL, FALSE);
+ g_return_val_if_fail (caps != NULL, FALSE);
+ g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE);
+
+ GST_DEBUG ("parsing caps %" GST_PTR_FORMAT, caps);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ if (!gst_structure_has_name (structure, "video/x-raw"))
+ goto wrong_name;
+
+ if (!(s = gst_structure_get_string (structure, "format")))
+ goto no_format;
+
+ format = gst_video_format_from_string (s);
+ if (format == GST_VIDEO_FORMAT_UNKNOWN)
+ goto unknown_format;
+
+ if (!gst_structure_get_int (structure, "width", &width))
+ goto no_width;
+ if (!gst_structure_get_int (structure, "height", &height))
+ goto no_height;
+
+ gst_video_info_set_format (info, format, width, height);
+
+ if (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)) {
+ info->fps_n = fps_n;
+ info->fps_d = fps_d;
+ } else {
+ info->fps_n = 0;
+ info->fps_d = 1;
+ }
+
+ if (!gst_structure_get_boolean (structure, "interlaced", &interlaced))
+ interlaced = FALSE;
+ if (interlaced)
+ info->flags |= GST_VIDEO_FLAG_INTERLACED;
+ else
+ info->flags &= ~GST_VIDEO_FLAG_INTERLACED;
+
+ if (gst_structure_get_int (structure, "views", &views))
+ info->views = views;
+ else
+ info->views = 1;
+
+ if ((s = gst_structure_get_string (structure, "chroma-site")))
+ info->chroma_site = gst_video_chroma_from_string (s);
+
+ if ((s = gst_structure_get_string (structure, "colorimetry")))
+ gst_video_colorimetry_from_string (&info->colorimetry, s);
+
+ if (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
+ &par_n, &par_d)) {
+ info->par_n = par_n;
+ info->par_d = par_d;
+ } else {
+ info->par_n = 1;
+ info->par_d = 1;
+ }
+ return TRUE;
+
+ /* ERROR */
+wrong_name:
+ {
+ GST_ERROR ("wrong name, expected video/x-raw");
+ return FALSE;
+ }
+no_format:
+ {
+ GST_ERROR ("no format given");
+ return FALSE;
+ }
+unknown_format:
+ {
+ GST_ERROR ("unknown format given");
+ return FALSE;
+ }
+no_width:
+ {
+ GST_ERROR ("no width property given");
+ return FALSE;
+ }
+no_height:
+ {
+ GST_ERROR ("no height property given");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_video_info_to_caps:
+ * @info: a #GstVideoInfo
+ *
+ * Convert the values of @info into a #GstCaps.
+ *
+ * Returns: a new #GstCaps containing the info of @info.
+ */
+GstCaps *
+gst_video_info_to_caps (GstVideoInfo * info)
+{
+ GstCaps *caps;
+ const gchar *format;
+
+ g_return_val_if_fail (info != NULL, NULL);
+ g_return_val_if_fail (info->finfo != NULL, NULL);
+ g_return_val_if_fail (info->finfo->format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
+
+ format = gst_video_format_to_string (info->finfo->format);
+ g_return_val_if_fail (format != NULL, NULL);
+
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, format,
+ "width", G_TYPE_INT, info->width,
+ "height", G_TYPE_INT, info->height,
+ "framerate", GST_TYPE_FRACTION, info->fps_n, info->fps_d,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, info->par_n, info->par_d, NULL);
+
+ if (info->flags & GST_VIDEO_FLAG_INTERLACED)
+ gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL);
+
+ if (info->chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN)
+ gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING,
+ gst_video_chroma_to_string (info->chroma_site), NULL);
+
+ gst_video_caps_set_colorimetry (caps, &info->colorimetry);
+
+ if (info->views > 1)
+ gst_caps_set_simple (caps, "views", G_TYPE_INT, info->views, NULL);
+
+ return caps;
+}
+
+/**
+ * gst_video_frame_map_id:
+ * @frame: pointer to #GstVideoFrame
+ * @info: a #GstVideoInfo
+ * @buffer: the buffer to map
+ * @id: the frame id to map
+ * @flags: #GstMapFlags
+ *
+ * Use @info and @buffer to fill in the values of @frame with the video frame
+ * information of frame @id.
+ *
+ * When @id is -1, the default frame is mapped. When @id != -1, this function
+ * will return %FALSE when there is no GstMetaVideo with that id.
+ *
+ * All video planes of @buffer will be mapped and the pointers will be set in
+ * @frame->data.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+gst_video_frame_map_id (GstVideoFrame * frame, GstVideoInfo * info,
+ GstBuffer * buffer, gint id, GstMapFlags flags)
+{
+ GstMetaVideo *meta;
+ guint8 *data;
+ gsize size;
+ gint i;
+
+ g_return_val_if_fail (frame != NULL, FALSE);
+ g_return_val_if_fail (info != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+
+ if (id == -1)
+ meta = gst_buffer_get_meta_video (buffer);
+ else
+ meta = gst_buffer_get_meta_video_id (buffer, id);
+
+ frame->buffer = buffer;
+ frame->meta = meta;
+
+ if (meta) {
+ frame->info.flags = meta->flags;
+ frame->info.finfo = &formats[meta->format].info;
+ frame->info.width = meta->width;
+ frame->info.height = meta->height;
+ frame->id = meta->id;
+
+ for (i = 0; i < info->finfo->n_planes; i++) {
+ frame->data[i] =
+ gst_meta_video_map (meta, i, &frame->info.stride[i], flags);
+ }
+ } else {
+ /* no metadata, we really need to have the metadata when the id is
+ * specified. */
+ if (id != -1)
+ goto no_metadata;
+
+ /* copy the info */
+ frame->info = *info;
+ frame->id = id;
+
+ data = gst_buffer_map (buffer, &size, NULL, flags);
+
+ /* do some sanity checks */
+ if (size < info->size)
+ goto invalid_size;
+
+ /* set up pointers */
+ for (i = 0; i < info->finfo->n_planes; i++) {
+ frame->data[i] = data + info->offset[i];
+ }
+ }
+ return TRUE;
+
+ /* ERRORS */
+no_metadata:
+ {
+ GST_ERROR ("no GstMetaVideo for id", id);
+ return FALSE;
+ }
+invalid_size:
+ {
+ GST_ERROR ("invalid buffer size %" G_GSIZE_FORMAT " < %" G_GSIZE_FORMAT,
+ size, info->size);
+ gst_buffer_unmap (buffer, data, size);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_video_frame_map:
+ * @frame: pointer to #GstVideoFrame
+ * @info: a #GstVideoInfo
+ * @buffer: the buffer to map
+ * @flags: #GstMapFlags
+ *
+ * Use @info and @buffer to fill in the values of @frame.
+ *
+ * All video planes of @buffer will be mapped and the pointers will be set in
+ * @frame->data.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+gst_video_frame_map (GstVideoFrame * frame, GstVideoInfo * info,
+ GstBuffer * buffer, GstMapFlags flags)
+{
+ return gst_video_frame_map_id (frame, info, buffer, -1, flags);
+}
+
+/**
+ * gst_video_frame_unmap:
+ * @frame: a #GstVideoFrame
+ *
+ * Unmap the memory previously mapped with gst_video_frame_map.
+ */
+void
+gst_video_frame_unmap (GstVideoFrame * frame)
+{
+ GstBuffer *buffer;
+ GstMetaVideo *meta;
+ gint i;
+
+ g_return_if_fail (frame != NULL);
+
+ buffer = frame->buffer;
+ meta = frame->meta;
+
+ if (meta) {
+ for (i = 0; i < frame->info.finfo->n_planes; i++) {
+ gst_meta_video_unmap (meta, i, frame->data[i]);
+ }
+ } else {
+ guint8 *data;
+
+ data = frame->data[0];
+ data -= frame->info.offset[0];
+ gst_buffer_unmap (buffer, data, -1);
+ }
+}
+
+/**
+ * gst_video_frame_copy:
+ * @dest: a #GstVideoFrame
+ * @src: a #GstVideoFrame
+ *
+ * Copy the contents from @src to @dest.
+ *
+ * Returns: TRUE if the contents could be copied.
+ */
+gboolean
+gst_video_frame_copy (GstVideoFrame * dest, const GstVideoFrame * src)
+{
+ guint i, n_planes;
+ const GstVideoInfo *sinfo;
+ GstVideoInfo *dinfo;
+
+ sinfo = &src->info;
+ dinfo = &dest->info;
+
+ g_return_val_if_fail (dinfo->finfo->format == sinfo->finfo->format, FALSE);
+ g_return_val_if_fail (dinfo->width == sinfo->width
+ && dinfo->height == sinfo->height, FALSE);
+
+ n_planes = dinfo->finfo->n_planes;
+
+ for (i = 0; i < n_planes; i++) {
+ guint w, h, j;
+ guint8 *sp, *dp;
+ gint ss, ds;
+
+ sp = src->data[i];
+ dp = dest->data[i];
+
+ ss = sinfo->stride[i];
+ ds = dinfo->stride[i];
+
+ w = MIN (ABS (ss), ABS (ds));
+ h = GST_VIDEO_FRAME_COMP_HEIGHT (dest, i);
+
+ GST_DEBUG ("w %d h %d", w, h);
+
+ for (j = 0; j < h; j++) {
+ memcpy (dp, sp, w);
+ dp += ds;
+ sp += ss;
+ }
+ }
+ return TRUE;
+}
+
+static int
+fill_planes (GstVideoInfo * info)
+{
+ gint width, height;
+
+ width = info->width;
+ height = info->height;
+
+ switch (info->finfo->format) {
+ case GST_VIDEO_FORMAT_YUY2:
+ case GST_VIDEO_FORMAT_YVYU:
+ case GST_VIDEO_FORMAT_UYVY:
+ info->stride[0] = GST_ROUND_UP_4 (width * 2);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_BGRx:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_ABGR:
+ case GST_VIDEO_FORMAT_r210:
+ info->stride[0] = width * 4;
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_RGB16:
+ case GST_VIDEO_FORMAT_BGR16:
+ case GST_VIDEO_FORMAT_RGB15:
+ case GST_VIDEO_FORMAT_BGR15:
+ info->stride[0] = GST_ROUND_UP_4 (width * 2);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ case GST_VIDEO_FORMAT_v308:
+ info->stride[0] = GST_ROUND_UP_4 (width * 3);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_v210:
+ info->stride[0] = ((width + 47) / 48) * 128;
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_v216:
+ info->stride[0] = GST_ROUND_UP_8 (width * 4);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_GRAY8:
+ case GST_VIDEO_FORMAT_Y800:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_Y16:
+ info->stride[0] = GST_ROUND_UP_4 (width * 2);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_UYVP:
+ info->stride[0] = GST_ROUND_UP_4 ((width * 2 * 5 + 3) / 4);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_RGB8_PALETTED:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_IYU1:
+ info->stride[0] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) +
+ GST_ROUND_UP_4 (width) / 2);
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_ARGB64:
+ case GST_VIDEO_FORMAT_AYUV64:
+ info->stride[0] = width * 8;
+ info->offset[0] = 0;
+ info->size = info->stride[0] * height;
+ break;
+ case GST_VIDEO_FORMAT_I420:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2);
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height);
+ info->offset[2] = info->offset[1] +
+ info->stride[1] * (GST_ROUND_UP_2 (height) / 2);
+ info->size = info->offset[2] +
+ info->stride[2] * (GST_ROUND_UP_2 (height) / 2);
+ break;
+ case GST_VIDEO_FORMAT_YV12: /* same as I420, but plane 1+2 swapped */
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2);
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[2] = info->stride[0] * GST_ROUND_UP_2 (height);
+ info->offset[1] = info->offset[2] +
+ info->stride[1] * (GST_ROUND_UP_2 (height) / 2);
+ info->size = info->offset[1] +
+ info->stride[2] * (GST_ROUND_UP_2 (height) / 2);
+ break;
+ case GST_VIDEO_FORMAT_Y41B:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_16 (width) / 4;
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * height;
+ info->offset[2] = info->offset[1] + info->stride[1] * height;
+ /* simplification of ROUNDUP4(w)*h + 2*((ROUNDUP16(w)/4)*h */
+ info->size = (info->stride[0] + (GST_ROUND_UP_16 (width) / 2)) * height;
+ break;
+ case GST_VIDEO_FORMAT_Y42B:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_8 (width) / 2;
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * height;
+ info->offset[2] = info->offset[1] + info->stride[1] * height;
+ /* simplification of ROUNDUP4(w)*h + 2*(ROUNDUP8(w)/2)*h */
+ info->size = (info->stride[0] + GST_ROUND_UP_8 (width)) * height;
+ break;
+ case GST_VIDEO_FORMAT_Y444:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = info->stride[0];
+ info->stride[2] = info->stride[0];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * height;
+ info->offset[2] = info->offset[1] * 2;
+ info->size = info->stride[0] * height * 3;
+ break;
+ case GST_VIDEO_FORMAT_NV12:
+ case GST_VIDEO_FORMAT_NV21:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = info->stride[0];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height);
+ info->size = info->stride[0] * GST_ROUND_UP_2 (height) * 3 / 2;
+ break;
+ case GST_VIDEO_FORMAT_A420:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2);
+ info->stride[2] = info->stride[1];
+ info->stride[3] = info->stride[0];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height);
+ info->offset[2] = info->offset[1] +
+ info->stride[1] * (GST_ROUND_UP_2 (height) / 2);
+ info->offset[3] = info->offset[2] +
+ info->stride[2] * (GST_ROUND_UP_2 (height) / 2);
+ info->size = info->offset[3] + info->stride[0];
+ break;
+ case GST_VIDEO_FORMAT_YUV9:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4);
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[1] = info->stride[0] * height;
+ info->offset[2] = info->offset[1] +
+ info->stride[1] * (GST_ROUND_UP_4 (height) / 4);
+ info->size = info->offset[2] +
+ info->stride[2] * (GST_ROUND_UP_4 (height) / 4);
+ break;
+ case GST_VIDEO_FORMAT_YVU9:
+ info->stride[0] = GST_ROUND_UP_4 (width);
+ info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4);
+ info->stride[2] = info->stride[1];
+ info->offset[0] = 0;
+ info->offset[2] = info->stride[0] * height;
+ info->offset[1] = info->offset[2] +
+ info->stride[1] * (GST_ROUND_UP_4 (height) / 4);
+ info->size = info->offset[2] +
+ info->stride[2] * (GST_ROUND_UP_4 (height) / 4);
+ break;
+ case GST_VIDEO_FORMAT_UNKNOWN:
+ GST_ERROR ("invalid format");
+ g_warning ("invalid format");
+ break;
+ }
+ return 0;
+}
+
+/**
+ * gst_video_format_convert:
+ * @info: a #GstVideoInfo
+ * @src_format: #GstFormat of the @src_value
+ * @src_value: value to convert
+ * @dest_format: #GstFormat of the @dest_value
+ * @dest_value: pointer to destination value
+ *
+ * Converts among various #GstFormat types. This function handles
+ * GST_FORMAT_BYTES, GST_FORMAT_TIME, and GST_FORMAT_DEFAULT. For
+ * raw video, GST_FORMAT_DEFAULT corresponds to video frames. This
+ * function can be used to handle pad queries of the type GST_QUERY_CONVERT.
+ *
+ * Since: 0.10.16
+ *
+ * Returns: TRUE if the conversion was successful.
+ */
+gboolean
+gst_video_info_convert (GstVideoInfo * info,
+ GstFormat src_format, gint64 src_value,
+ GstFormat dest_format, gint64 * dest_value)
+{
+ gboolean ret = FALSE;
+ int size, fps_n, fps_d;
+
+ g_return_val_if_fail (info != NULL, 0);
+ g_return_val_if_fail (info->finfo != NULL, 0);
+ g_return_val_if_fail (info->finfo->format != GST_VIDEO_FORMAT_UNKNOWN, 0);
+ g_return_val_if_fail (info->size > 0, 0);
+
+ size = info->size;
+ fps_n = info->fps_n;
+ fps_d = info->fps_d;
+
+ GST_DEBUG ("converting value %" G_GINT64_FORMAT " from %s to %s",
+ src_value, gst_format_get_name (src_format),
+ gst_format_get_name (dest_format));
+
+ if (src_format == dest_format) {
+ *dest_value = src_value;
+ ret = TRUE;
+ goto done;
+ }
+
+ if (src_value == -1) {
+ *dest_value = -1;
+ ret = TRUE;
+ goto done;
+ }
+
+ /* bytes to frames */
+ if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_DEFAULT) {
+ if (size != 0) {
+ *dest_value = gst_util_uint64_scale_int (src_value, 1, size);
+ } else {
+ GST_ERROR ("blocksize is 0");
+ *dest_value = 0;
+ }
+ ret = TRUE;
+ goto done;
+ }
+
+ /* frames to bytes */
+ if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_BYTES) {
+ *dest_value = gst_util_uint64_scale_int (src_value, size, 1);
+ ret = TRUE;
+ goto done;
+ }
+
+ /* time to frames */
+ if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_DEFAULT) {
+ if (fps_d != 0) {
+ *dest_value = gst_util_uint64_scale (src_value,
+ fps_n, GST_SECOND * fps_d);
+ } else {
+ GST_ERROR ("framerate denominator is 0");
+ *dest_value = 0;
+ }
+ ret = TRUE;
+ goto done;
+ }
+
+ /* frames to time */
+ if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_TIME) {
+ if (fps_n != 0) {
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * fps_d, fps_n);
+ } else {
+ GST_ERROR ("framerate numerator is 0");
+ *dest_value = 0;
+ }
+ ret = TRUE;
+ goto done;
+ }
+
+ /* time to bytes */
+ if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_BYTES) {
+ if (fps_d != 0) {
+ *dest_value = gst_util_uint64_scale (src_value,
+ fps_n * size, GST_SECOND * fps_d);
+ } else {
+ GST_ERROR ("framerate denominator is 0");
+ *dest_value = 0;
+ }
+ ret = TRUE;
+ goto done;
+ }
+
+ /* bytes to time */
+ if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_TIME) {
+ if (fps_n != 0 && size != 0) {
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * fps_d, fps_n * size);
+ } else {
+ GST_ERROR ("framerate denominator and/or blocksize is 0");
+ *dest_value = 0;
+ }
+ ret = TRUE;
+ }
+
+done:
+
+ GST_DEBUG ("ret=%d result %" G_GINT64_FORMAT, ret, *dest_value);
+
+ return ret;
+}
+
+#define GST_VIDEO_EVENT_STILL_STATE_NAME "GstEventStillFrame"
+
+/**
+ * gst_video_event_new_still_frame:
+ * @in_still: boolean value for the still-frame state of the event.
+ *
+ * Creates a new Still Frame event. If @in_still is %TRUE, then the event
+ * represents the start of a still frame sequence. If it is %FALSE, then
+ * the event ends a still frame sequence.
+ *
+ * To parse an event created by gst_video_event_new_still_frame() use
+ * gst_video_event_parse_still_frame().
+ *
+ * Returns: The new GstEvent
+ * Since: 0.10.26
+ */
+GstEvent *
+gst_video_event_new_still_frame (gboolean in_still)
+{
+ GstEvent *still_event;
+ GstStructure *s;
+
+ s = gst_structure_new (GST_VIDEO_EVENT_STILL_STATE_NAME,
+ "still-state", G_TYPE_BOOLEAN, in_still, NULL);
+ still_event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s);
+
+ return still_event;
+}
+
+/**
+ * gst_video_event_parse_still_frame:
+ * @event: A #GstEvent to parse
+ * @in_still: A boolean to receive the still-frame status from the event, or NULL
+ *
+ * Parse a #GstEvent, identify if it is a Still Frame event, and
+ * return the still-frame state from the event if it is.
+ * If the event represents the start of a still frame, the in_still
+ * variable will be set to TRUE, otherwise FALSE. It is OK to pass NULL for the
+ * in_still variable order to just check whether the event is a valid still-frame
+ * event.
+ *
+ * Create a still frame event using gst_video_event_new_still_frame()
+ *
+ * Returns: %TRUE if the event is a valid still-frame event. %FALSE if not
+ * Since: 0.10.26
+ */
+gboolean
+gst_video_event_parse_still_frame (GstEvent * event, gboolean * in_still)
+{
+ const GstStructure *s;
+ gboolean ev_still_state;
+
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_CUSTOM_DOWNSTREAM)
+ return FALSE; /* Not a still frame event */
+
+ s = gst_event_get_structure (event);
+ if (s == NULL
+ || !gst_structure_has_name (s, GST_VIDEO_EVENT_STILL_STATE_NAME))
+ return FALSE; /* Not a still frame event */
+ if (!gst_structure_get_boolean (s, "still-state", &ev_still_state))
+ return FALSE; /* Not a still frame event */
+ if (in_still)
+ *in_still = ev_still_state;
+ return TRUE;
+}
+
+/**
+ * gst_video_parse_caps_palette:
+ * @caps: #GstCaps to parse
+ *
+ * Returns the palette data from the caps as a #GstBuffer. For
+ * #GST_VIDEO_FORMAT_RGB8_PALETTED this is containing 256 #guint32
+ * values, each containing ARGB colors in native endianness.
+ *
+ * Returns: a #GstBuffer containing the palette data. Unref after usage.
+ * Since: 0.10.32
+ */
+GstBuffer *
+gst_video_parse_caps_palette (GstCaps * caps)
+{
+ GstStructure *s;
+ const GValue *p_v;
+ GstBuffer *p;
+
+ if (!gst_caps_is_fixed (caps))
+ return NULL;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ p_v = gst_structure_get_value (s, "palette_data");
+ if (!p_v || !GST_VALUE_HOLDS_BUFFER (p_v))
+ return NULL;
+
+ p = g_value_dup_boxed (p_v);
+
+ return p;
+}
diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h
new file mode 100644
index 0000000..56716f4
--- /dev/null
+++ b/gst-libs/gst/video/video.h
@@ -0,0 +1,711 @@
+/* GStreamer
+ * Copyright (C) <2011> 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 __GST_VIDEO_H__
+#define __GST_VIDEO_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#include <gst/video/video-enumtypes.h>
+
+/**
+ * GstVideoFormat:
+ * @GST_VIDEO_FORMAT_UNKNOWN: Unknown or unset video format id
+ * @GST_VIDEO_FORMAT_I420: planar 4:2:0 YUV
+ * @GST_VIDEO_FORMAT_YV12: planar 4:2:0 YVU (like I420 but UV planes swapped)
+ * @GST_VIDEO_FORMAT_YUY2: packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...)
+ * @GST_VIDEO_FORMAT_UYVY: packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...)
+ * @GST_VIDEO_FORMAT_AYUV: packed 4:4:4 YUV with alpha channel (A0-Y0-U0-V0 ...)
+ * @GST_VIDEO_FORMAT_RGBx: sparse rgb packed into 32 bit, space last
+ * @GST_VIDEO_FORMAT_BGRx: sparse reverse rgb packed into 32 bit, space last
+ * @GST_VIDEO_FORMAT_xRGB: sparse rgb packed into 32 bit, space first
+ * @GST_VIDEO_FORMAT_xBGR: sparse reverse rgb packed into 32 bit, space first
+ * @GST_VIDEO_FORMAT_RGBA: rgb with alpha channel last
+ * @GST_VIDEO_FORMAT_BGRA: reverse rgb with alpha channel last
+ * @GST_VIDEO_FORMAT_ARGB: rgb with alpha channel first
+ * @GST_VIDEO_FORMAT_ABGR: reverse rgb with alpha channel first
+ * @GST_VIDEO_FORMAT_RGB: rgb
+ * @GST_VIDEO_FORMAT_BGR: reverse rgb
+ * @GST_VIDEO_FORMAT_Y41B: planar 4:1:1 YUV (Since: 0.10.18)
+ * @GST_VIDEO_FORMAT_Y42B: planar 4:2:2 YUV (Since: 0.10.18)
+ * @GST_VIDEO_FORMAT_YVYU: packed 4:2:2 YUV (Y0-V0-Y1-U0 Y2-V2-Y3-U2 Y4 ...) (Since: 0.10.23)
+ * @GST_VIDEO_FORMAT_Y444: planar 4:4:4 YUV (Since: 0.10.24)
+ * @GST_VIDEO_FORMAT_v210: packed 4:2:2 10-bit YUV, complex format (Since: 0.10.24)
+ * @GST_VIDEO_FORMAT_v216: packed 4:2:2 16-bit YUV, Y0-U0-Y1-V1 order (Since: 0.10.24)
+ * @GST_VIDEO_FORMAT_NV12: planar 4:2:0 YUV with interleaved UV plane (Since: 0.10.26)
+ * @GST_VIDEO_FORMAT_NV21: planar 4:2:0 YUV with interleaved VU plane (Since: 0.10.26)
+ * @GST_VIDEO_FORMAT_GRAY8: 8-bit grayscale (Since: 0.10.29)
+ * @GST_VIDEO_FORMAT_GRAY16_BE: 16-bit grayscale, most significant byte first (Since: 0.10.29)
+ * @GST_VIDEO_FORMAT_GRAY16_LE: 16-bit grayscale, least significant byte first (Since: 0.10.29)
+ * @GST_VIDEO_FORMAT_v308: packed 4:4:4 YUV (Since: 0.10.29)
+ * @GST_VIDEO_FORMAT_Y800: same as GST_VIDEO_FORMAT_GRAY8 (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_Y16: same as GST_VIDEO_FORMAT_GRAY16_LE (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_RGB16: rgb 5-6-5 bits per component (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_BGR16: reverse rgb 5-6-5 bits per component (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_RGB15: rgb 5-5-5 bits per component (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_BGR15: reverse rgb 5-5-5 bits per component (Since: 0.10.30)
+ * @GST_VIDEO_FORMAT_UYVP: packed 10-bit 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...) (Since: 0.10.31)
+ * @GST_VIDEO_FORMAT_A420: planar 4:4:2:0 AYUV (Since: 0.10.31)
+ * @GST_VIDEO_FORMAT_RGB8_PALETTED: 8-bit paletted RGB (Since: 0.10.32)
+ * @GST_VIDEO_FORMAT_YUV9: planar 4:1:0 YUV (Since: 0.10.32)
+ * @GST_VIDEO_FORMAT_YVU9: planar 4:1:0 YUV (like YUV9 but UV planes swapped) (Since: 0.10.32)
+ * @GST_VIDEO_FORMAT_IYU1: packed 4:1:1 YUV (Cb-Y0-Y1-Cr-Y2-Y3 ...) (Since: 0.10.32)
+ * @GST_VIDEO_FORMAT_ARGB64: rgb with alpha channel first, 16 bits per channel (Since: 0.10.33)
+ * @GST_VIDEO_FORMAT_AYUV64: packed 4:4:4 YUV with alpha channel, 16 bits per channel (A0-Y0-U0-V0 ...) (Since: 0.10.33)
+ * @GST_VIDEO_FORMAT_r210: packed 4:4:4 RGB, 10 bits per channel (Since: 0.10.33)
+ *
+ * Enum value describing the most common video formats.
+ */
+typedef enum {
+ GST_VIDEO_FORMAT_UNKNOWN,
+ GST_VIDEO_FORMAT_I420,
+ GST_VIDEO_FORMAT_YV12,
+ GST_VIDEO_FORMAT_YUY2,
+ GST_VIDEO_FORMAT_UYVY,
+ GST_VIDEO_FORMAT_AYUV,
+ GST_VIDEO_FORMAT_RGBx,
+ GST_VIDEO_FORMAT_BGRx,
+ GST_VIDEO_FORMAT_xRGB,
+ GST_VIDEO_FORMAT_xBGR,
+ GST_VIDEO_FORMAT_RGBA,
+ GST_VIDEO_FORMAT_BGRA,
+ GST_VIDEO_FORMAT_ARGB,
+ GST_VIDEO_FORMAT_ABGR,
+ GST_VIDEO_FORMAT_RGB,
+ GST_VIDEO_FORMAT_BGR,
+ GST_VIDEO_FORMAT_Y41B,
+ GST_VIDEO_FORMAT_Y42B,
+ GST_VIDEO_FORMAT_YVYU,
+ GST_VIDEO_FORMAT_Y444,
+ GST_VIDEO_FORMAT_v210,
+ GST_VIDEO_FORMAT_v216,
+ GST_VIDEO_FORMAT_NV12,
+ GST_VIDEO_FORMAT_NV21,
+ GST_VIDEO_FORMAT_GRAY8,
+ GST_VIDEO_FORMAT_GRAY16_BE,
+ GST_VIDEO_FORMAT_GRAY16_LE,
+ GST_VIDEO_FORMAT_v308,
+ GST_VIDEO_FORMAT_Y800,
+ GST_VIDEO_FORMAT_Y16,
+ GST_VIDEO_FORMAT_RGB16,
+ GST_VIDEO_FORMAT_BGR16,
+ GST_VIDEO_FORMAT_RGB15,
+ GST_VIDEO_FORMAT_BGR15,
+ GST_VIDEO_FORMAT_UYVP,
+ GST_VIDEO_FORMAT_A420,
+ GST_VIDEO_FORMAT_RGB8_PALETTED,
+ GST_VIDEO_FORMAT_YUV9,
+ GST_VIDEO_FORMAT_YVU9,
+ GST_VIDEO_FORMAT_IYU1,
+ GST_VIDEO_FORMAT_ARGB64,
+ GST_VIDEO_FORMAT_AYUV64,
+ GST_VIDEO_FORMAT_r210
+} GstVideoFormat;
+
+#define GST_VIDEO_MAX_PLANES 4
+#define GST_VIDEO_MAX_COMPONENTS 4
+
+typedef struct _GstVideoFormatInfo GstVideoFormatInfo;
+
+/**
+ * GstVideoFormatFlags:
+ * @GST_VIDEO_FORMAT_FLAG_YUV: The video format is YUV, components are numbered
+ * 0=Y, 1=U, 2=V.
+ * @GST_VIDEO_FORMAT_FLAG_RGB: The video format is RGB, components are numbered
+ * 0=R, 1=G, 2=B.
+ * @GST_VIDEO_FORMAT_FLAG_GRAY: The video is gray, there is one gray component
+ * with index 0.
+ * @GST_VIDEO_FORMAT_FLAG_ALPHA: The video format has an alpha components with
+ * the number 3.
+ * @GST_VIDEO_FORMAT_FLAG_LE: The video format has data stored in little
+ * endianness.
+ * @GST_VIDEO_FORMAT_FLAG_PALETTE: The video format has a palette.
+ * @GST_VIDEO_FORMAT_FLAG_COMPLEX: The video format has a complex layout that
+ * can't be described with the usual information in the #GstVideoFormatInfo.
+ *
+ * The different video flags that a format info can have.
+ */
+typedef enum
+{
+ GST_VIDEO_FORMAT_FLAG_YUV = (1 << 0),
+ GST_VIDEO_FORMAT_FLAG_RGB = (1 << 1),
+ GST_VIDEO_FORMAT_FLAG_GRAY = (1 << 2),
+ GST_VIDEO_FORMAT_FLAG_ALPHA = (1 << 3),
+ GST_VIDEO_FORMAT_FLAG_LE = (1 << 4),
+ GST_VIDEO_FORMAT_FLAG_PALETTE = (1 << 5),
+ GST_VIDEO_FORMAT_FLAG_COMPLEX = (1 << 6)
+} GstVideoFormatFlags;
+
+#define GST_VIDEO_COMP_Y 0
+#define GST_VIDEO_COMP_U 1
+#define GST_VIDEO_COMP_V 2
+
+#define GST_VIDEO_COMP_R 0
+#define GST_VIDEO_COMP_G 1
+#define GST_VIDEO_COMP_B 2
+
+#define GST_VIDEO_COMP_A 3
+
+/**
+ * GstVideoFormatUnpack:
+ * @info: a #GstVideoFormatInfo
+ * @dest: a destination array
+ * @data: pointers to the data planes
+ * @stride: strides of the planes
+ * @x: the x position in the image to start from
+ * @y: the y position in the image to start from
+ * @width: the amount of pixels to unpack.
+ *
+ * Unpacks @width pixels from the given planes and strides containing data of
+ * format @info. The pixels will be unpacked into @dest which each component
+ * interleaved. @dest should at least be big enough to hold @width *
+ * n_components * size(unpack_format) bytes.
+ */
+typedef void (*GstVideoFormatUnpack) (GstVideoFormatInfo *info, gpointer dest,
+ const gpointer data[GST_VIDEO_MAX_PLANES],
+ const gint stride[GST_VIDEO_MAX_PLANES],
+ gint x, gint y, gint width);
+/**
+ * GstVideoFormatPack:
+ * @info: a #GstVideoFormatInfo
+ * @src: a source array
+ * @data: pointers to the destination data planes
+ * @stride: strides of the destination planes
+ * @x: the x position in the image to pack to
+ * @y: the y position in the image to pack to
+ * @width: the amount of pixels to pack.
+ *
+ * Packs @width pixels from @src to the given planes and strides in the
+ * format @info. The pixels from source have each component interleaved
+ * and will be packed into the planes in @data.
+ */
+typedef void (*GstVideoFormatPack) (GstVideoFormatInfo *info, const gpointer src,
+ gpointer data[GST_VIDEO_MAX_PLANES],
+ const gint stride[GST_VIDEO_MAX_PLANES],
+ gint x, gint y, gint width);
+
+/**
+ * GstVideoFormatInfo:
+ * @format: #GstVideoFormat
+ * @name: string representation of the format
+ * @description: use readable description of the format
+ * @flags: #GstVideoFormatFlags
+ * @bits: The number of bits used to pack data items. This can be less than 8
+ * when multiple pixels are stored in a byte. for values > 8 multiple bytes
+ * should be read according to the endianness flag before applying the shift
+ * and mask.
+ * @n_components: the number of components in the video format.
+ * @shift: the number of bits to shift away to get the component data
+ * @depth: the depth in bits for each component
+ * @pixel_stride: the pixel stride of each component. This is the amount of
+ * bytes to the pixel immediately to the right. When bits < 8, the stride is
+ * expressed in bits.
+ * @n_planes: the number of planes for this format. The number of planes can be
+ * less than the amount of components when multiple components are packed into
+ * one plane.
+ * @plane: the plane number where a component can be found
+ * @offset: the offset in the plane where the first pixel of the components
+ * can be found. If bits < 8 the amount is specified in bits.
+ * @w_sub: subsampling factor of the width for the component. Use
+ * GST_VIDEO_SUB_SCALE to scale a width.
+ * @h_sub: subsampling factor of the height for the component. Use
+ * GST_VIDEO_SUB_SCALE to scale a height.
+ * @unpack_format: the format of the unpacked pixels.
+ * @unpack_func: an unpack function for this format
+ * @pack_func: an pack function for this format
+ *
+ * Information for a video format.
+ */
+struct _GstVideoFormatInfo {
+ GstVideoFormat format;
+ const gchar *name;
+ const gchar *description;
+ GstVideoFormatFlags flags;
+ guint bits;
+ guint n_components;
+ guint shift[GST_VIDEO_MAX_COMPONENTS];
+ guint depth[GST_VIDEO_MAX_COMPONENTS];
+ gint pixel_stride[GST_VIDEO_MAX_COMPONENTS];
+ guint n_planes;
+ guint plane[GST_VIDEO_MAX_COMPONENTS];
+ guint offset[GST_VIDEO_MAX_COMPONENTS];
+ guint w_sub[GST_VIDEO_MAX_COMPONENTS];
+ guint h_sub[GST_VIDEO_MAX_COMPONENTS];
+
+ GstVideoFormat unpack_format;
+ GstVideoFormatUnpack unpack_func;
+ GstVideoFormatPack pack_func;
+};
+
+#define GST_VIDEO_FORMAT_INFO_FORMAT(info) ((info)->format)
+#define GST_VIDEO_FORMAT_INFO_NAME(info) ((info)->name)
+#define GST_VIDEO_FORMAT_INFO_FLAGS(info) ((info)->flags)
+
+#define GST_VIDEO_FORMAT_INFO_IS_YUV(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_YUV)
+#define GST_VIDEO_FORMAT_INFO_IS_RGB(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_RGB)
+#define GST_VIDEO_FORMAT_INFO_IS_GRAY(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_GRAY)
+#define GST_VIDEO_FORMAT_INFO_HAS_ALPHA(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_ALPHA)
+#define GST_VIDEO_FORMAT_INFO_IS_LE(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_LE)
+#define GST_VIDEO_FORMAT_INFO_HAS_PALETTE(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_PALETTE)
+
+#define GST_VIDEO_FORMAT_INFO_BITS(info) ((info)->bits)
+#define GST_VIDEO_FORMAT_INFO_N_COMPONENTS(info) ((info)->n_components)
+#define GST_VIDEO_FORMAT_INFO_SHIFT(info,c) ((info)->shift[c])
+#define GST_VIDEO_FORMAT_INFO_DEPTH(info,c) ((info)->depth[c])
+#define GST_VIDEO_FORMAT_INFO_PSTRIDE(info,c) ((info)->pixel_stride[c])
+#define GST_VIDEO_FORMAT_INFO_N_PLANES(info) ((info)->n_planes)
+#define GST_VIDEO_FORMAT_INFO_PLANE(info,c) ((info)->plane[c])
+#define GST_VIDEO_FORMAT_INFO_OFFSET(info,c) ((info)->offset[c])
+#define GST_VIDEO_FORMAT_INFO_W_SUB(info,c) ((info)->w_sub[c])
+#define GST_VIDEO_FORMAT_INFO_H_SUB(info,c) ((info)->h_sub[c])
+
+#define GST_VIDEO_SUB_SCALE(scale,val) (-((-((gint)val))>>(scale)))
+
+#define GST_VIDEO_FORMAT_INFO_SCALE_WIDTH(info,c,w) GST_VIDEO_SUB_SCALE ((info)->w_sub[(c)],(w))
+#define GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info,c,h) GST_VIDEO_SUB_SCALE ((info)->h_sub[(c)],(h))
+
+#define GST_VIDEO_FORMAT_INFO_DATA(info,planes,comp) \
+ (((guint8*)(planes)[info->plane[comp]]) + info->offset[comp])
+#define GST_VIDEO_FORMAT_INFO_STRIDE(info,strides,comp) ((strides)[info->plane[comp]])
+
+/* format properties */
+GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
+ gint red_mask, gint green_mask,
+ gint blue_mask, gint alpha_mask) G_GNUC_CONST;
+
+GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc) G_GNUC_CONST;
+GstVideoFormat gst_video_format_from_string (const gchar *format) G_GNUC_CONST;
+
+guint32 gst_video_format_to_fourcc (GstVideoFormat format) G_GNUC_CONST;
+const gchar * gst_video_format_to_string (GstVideoFormat format) G_GNUC_CONST;
+
+const GstVideoFormatInfo *
+ gst_video_format_get_info (GstVideoFormat format) G_GNUC_CONST;
+
+typedef struct _GstVideoInfo GstVideoInfo;
+typedef struct _GstVideoFrame GstVideoFrame;
+
+/**
+ * GstVideoFlags:
+ * @GST_META_VIDEO_FLAG_NONE: no flags
+ * @GST_META_VIDEO_FLAG_INTERLACED: The video is interlaced
+ * @GST_META_VIDEO_FLAG_TFF: The video has the top field first
+ * @GST_META_VIDEO_FLAG_RFF: The video has the repeat flag
+ * @GST_META_VIDEO_FLAG_ONEFIELD: one field
+ * @GST_META_VIDEO_FLAG_TELECINE: telecine
+ * @GST_META_VIDEO_FLAG_PROGRESSIVE: video is progressive
+ *
+ * Extra video flags
+ */
+typedef enum {
+ GST_VIDEO_FLAG_NONE = 0,
+ GST_VIDEO_FLAG_INTERLACED = (1 << 0),
+ GST_VIDEO_FLAG_TFF = (1 << 1),
+ GST_VIDEO_FLAG_RFF = (1 << 2),
+ GST_VIDEO_FLAG_ONEFIELD = (1 << 3),
+ GST_VIDEO_FLAG_TELECINE = (1 << 4),
+ GST_VIDEO_FLAG_PROGRESSIVE = (1 << 5)
+} GstVideoFlags;
+
+/**
+ * GstVideoChroma:
+ * @GST_VIDEO_CHROMA_SITE_UNKNOWN: unknown cositing
+ * @GST_VIDEO_CHROMA_SITE_NONE: no cositing
+ * @GST_VIDEO_CHROMA_SITE_H_COSITED: chroma is horizontally cosited
+ * @GST_VIDEO_CHROMA_SITE_V_COSITED: chroma is vertically cosited
+ * @GST_VIDEO_CHROMA_SITE_ALT_LINE: choma samples are sited on alternate lines
+ * @GST_VIDEO_CHROMA_SITE_COSITED: chroma samples cosited with luma samples
+ * @GST_VIDEO_CHROMA_SITE_JPEG: jpeg style cositing, also for mpeg1 and mjpeg
+ * @GST_VIDEO_CHROMA_SITE_MPEG2: mpeg2 style cositing
+ * @GST_VIDEO_CHROMA_SITE_DV: DV style cositing
+ *
+ * Various Chroma sitings.
+ */
+typedef enum {
+ GST_VIDEO_CHROMA_SITE_UNKNOWN = 0,
+ GST_VIDEO_CHROMA_SITE_NONE = (1 << 0),
+ GST_VIDEO_CHROMA_SITE_H_COSITED = (1 << 1),
+ GST_VIDEO_CHROMA_SITE_V_COSITED = (1 << 2),
+ GST_VIDEO_CHROMA_SITE_ALT_LINE = (1 << 3),
+ /* some common chroma cositing */
+ GST_VIDEO_CHROMA_SITE_COSITED = (GST_VIDEO_CHROMA_SITE_H_COSITED | GST_VIDEO_CHROMA_SITE_V_COSITED),
+ GST_VIDEO_CHROMA_SITE_JPEG = (GST_VIDEO_CHROMA_SITE_NONE),
+ GST_VIDEO_CHROMA_SITE_MPEG2 = (GST_VIDEO_CHROMA_SITE_H_COSITED),
+ GST_VIDEO_CHROMA_SITE_DV = (GST_VIDEO_CHROMA_SITE_COSITED | GST_VIDEO_CHROMA_SITE_ALT_LINE),
+} GstVideoChromaSite;
+
+/**
+ * GstVideoColorRange:
+ * @GST_VIDEO_COLOR_RANGE_UNKNOWN: unknown range
+ * @GST_VIDEO_COLOR_RANGE_0_255: [0..255] for 8 bit components
+ * @GST_VIDEO_COLOR_RANGE_16_235: [16..235] for 8 bit components. Chroma has
+ * [16..240] range.
+ *
+ * Possible color range values. These constants are defined for 8 bit color
+ * values and can be scaled for other bit depths.
+ */
+typedef enum {
+ GST_VIDEO_COLOR_RANGE_UNKNOWN = 0,
+ GST_VIDEO_COLOR_RANGE_0_255,
+ GST_VIDEO_COLOR_RANGE_16_235
+} GstVideoColorRange;
+
+/**
+ * GstVideoColorMatrix:
+ * @GST_VIDEO_COLOR_MATRIX_UNKNOWN: unknown matrix
+ * @GST_VIDEO_COLOR_MATRIX_RGB: identity matrix
+ * @GST_VIDEO_COLOR_MATRIX_BT709: ITU-R BT.709 transfer matrix
+ * @GST_VIDEO_COLOR_MATRIX_BT601: ITU-R BT.601 transfer matrix
+ * @GST_VIDEO_COLOR_MATRIX_SMPTE240M: SMPTE 240M transfer matrix
+ *
+ * The color matrix is used to convert between Y'PbPr and
+ * non-linear RGB (R'G'B')
+ */
+typedef enum {
+ GST_VIDEO_COLOR_MATRIX_UNKNOWN = 0,
+ GST_VIDEO_COLOR_MATRIX_RGB,
+ GST_VIDEO_COLOR_MATRIX_BT709,
+ GST_VIDEO_COLOR_MATRIX_BT601,
+ GST_VIDEO_COLOR_MATRIX_SMPTE240M
+} GstVideoColorMatrix;
+
+/**
+ * GstVideoTransferFunction:
+ * @GST_VIDEO_TRANSFER_UNKNOWN: unknown transfer function
+ * @GST_VIDEO_TRANSFER_GAMMA10: linear RGB, gamma 1.0 curve
+ * @GST_VIDEO_TRANSFER_GAMMA18: Gamma 1.8 curve
+ * @GST_VIDEO_TRANSFER_GAMMA20: Gamma 2.0 curve
+ * @GST_VIDEO_TRANSFER_GAMMA22: Gamma 2.2 curve
+ * @GST_VIDEO_TRANSFER_BT709: Gamma 2.2 curve with a linear segment in the lower
+ * range
+ * @GST_VIDEO_TRANSFER_SMPTE240M: Gamma 2.2 curve with a linear segment in the
+ * lower range
+ * @GST_VIDEO_TRANSFER_SRGB: Gamma 2.4 curve with a linear segment in the lower
+ * range
+ * @GST_VIDEO_TRANSFER_GAMMA28: Gamma 2.8 curve
+ *
+ * The video transfer function defines the formula for converting between
+ * non-linear RGB (R'G'B') and linear RGB
+ */
+typedef enum {
+ GST_VIDEO_TRANSFER_UNKNOWN = 0,
+ GST_VIDEO_TRANSFER_GAMMA10,
+ GST_VIDEO_TRANSFER_GAMMA18,
+ GST_VIDEO_TRANSFER_GAMMA20,
+ GST_VIDEO_TRANSFER_GAMMA22,
+ GST_VIDEO_TRANSFER_BT709,
+ GST_VIDEO_TRANSFER_SMPTE240M,
+ GST_VIDEO_TRANSFER_SRGB,
+ GST_VIDEO_TRANSFER_GAMMA28
+} GstVideoTransferFunction;
+
+/**
+ * GstVideoColorPrimaries:
+ * @GST_VIDEO_COLOR_PRIMARIES_UNKNOWN: unknown color primaries
+ * @GST_VIDEO_COLOR_PRIMARIES_BT709: BT709 primaries
+ * @GST_VIDEO_COLOR_PRIMARIES_BT470M: BT470M primaries
+ * @GST_VIDEO_COLOR_PRIMARIES_BT470BG: BT470BG primaries
+ * @GST_VIDEO_COLOR_PRIMARIES_SMPTE170M: SMPTE170M primaries
+ * @GST_VIDEO_COLOR_PRIMARIES_SMPTE240M: SMPTE240M primaries
+ *
+ * The color primaries define the how to transform linear RGB values to and from
+ * the CIE XYZ colorspace.
+ */
+typedef enum {
+ GST_VIDEO_COLOR_PRIMARIES_UNKNOWN = 0,
+ GST_VIDEO_COLOR_PRIMARIES_BT709,
+ GST_VIDEO_COLOR_PRIMARIES_BT470M,
+ GST_VIDEO_COLOR_PRIMARIES_BT470BG,
+ GST_VIDEO_COLOR_PRIMARIES_SMPTE170M,
+ GST_VIDEO_COLOR_PRIMARIES_SMPTE240M
+} GstVideoColorPrimaries;
+
+/**
+ * GstVideoColorimetry:
+ * @range: the color range. This is the valid range for the samples.
+ * It is used to convert the samples to Y'PbPr values.
+ * @matrix: the color matrix. Used to convert between Y'PbPr and
+ * non-linear RGB (R'G'B')
+ * @transfer: the transfer function. used to convert between R'G'B' and RGB
+ * @primaries: color primaries. used to convert between R'G'B' and CIE XYZ
+ *
+ * Structure describing the color info.
+ */
+typedef struct {
+ GstVideoColorRange range;
+ GstVideoColorMatrix matrix;
+ GstVideoTransferFunction transfer;
+ GstVideoColorPrimaries primaries;
+} GstVideoColorimetry;
+
+/* predefined colorimetry */
+#define GST_VIDEO_COLORIMETRY_BT601 "bt601"
+#define GST_VIDEO_COLORIMETRY_BT709 "bt709"
+#define GST_VIDEO_COLORIMETRY_SMPTE240M "smpte240m"
+
+gboolean gst_video_colorimetry_matches (GstVideoColorimetry *cinfo, const gchar *color);
+gboolean gst_video_colorimetry_from_string (GstVideoColorimetry *cinfo, const gchar *color);
+gchar * gst_video_colorimetry_to_string (GstVideoColorimetry *cinfo);
+
+/**
+ * GstVideoInfo:
+ * @finfo: the format info of the video
+ * @flags: additional video flags
+ * @width: the width of the video
+ * @height: the height of the video
+ * @views: the number of views for multiview video
+ * @size: the default size of one frame
+ * @chroma_site: a #GstVideoChromaSite.
+ * @colorimetry: the colorimetry info
+ * @palette: a buffer with palette data
+ * @par_n: the pixel-aspect-ratio numerator
+ * @par_d: the pixel-aspect-ratio demnominator
+ * @fps_n: the framerate numerator
+ * @fps_d: the framerate demnominator
+ * @offset: offsets of the planes
+ * @stride: strides of the planes
+ *
+ * Information describing image properties. This information can be filled
+ * in from GstCaps with gst_video_info_from_caps(). The information is also used
+ * to store the specific video info when mapping a video frame with
+ * gst_video_frame_map().
+ *
+ * Use the provided macros to access the info in this structure.
+ */
+struct _GstVideoInfo {
+ const GstVideoFormatInfo *finfo;
+ GstVideoFlags flags;
+ gint width;
+ gint height;
+ gsize size;
+ gint views;
+
+ GstVideoChromaSite chroma_site;
+ GstVideoColorimetry colorimetry;
+
+ GstBuffer *palette;
+
+ gint par_n;
+ gint par_d;
+ gint fps_n;
+ gint fps_d;
+
+ gsize offset[GST_VIDEO_MAX_PLANES];
+ gint stride[GST_VIDEO_MAX_PLANES];
+};
+
+/* general info */
+#define GST_VIDEO_INFO_FORMAT(i) (GST_VIDEO_FORMAT_INFO_FORMAT((i)->finfo))
+#define GST_VIDEO_INFO_NAME(i) (GST_VIDEO_FORMAT_INFO_NAME((i)->finfo))
+#define GST_VIDEO_INFO_IS_YUV(i) (GST_VIDEO_FORMAT_INFO_IS_YUV((i)->finfo))
+#define GST_VIDEO_INFO_IS_RGB(i) (GST_VIDEO_FORMAT_INFO_IS_RGB((i)->finfo))
+#define GST_VIDEO_INFO_IS_GRAY(i) (GST_VIDEO_FORMAT_INFO_IS_GRAY((i)->finfo))
+#define GST_VIDEO_INFO_HAS_ALPHA(i) (GST_VIDEO_FORMAT_INFO_HAS_ALPHA((i)->finfo))
+
+#define GST_VIDEO_INFO_FLAGS(i) ((i)->flags)
+#define GST_VIDEO_INFO_WIDTH(i) ((i)->width)
+#define GST_VIDEO_INFO_HEIGHT(i) ((i)->height)
+#define GST_VIDEO_INFO_SIZE(i) ((i)->size)
+#define GST_VIDEO_INFO_VIEWS(i) ((i)->views)
+#define GST_VIDEO_INFO_PAR_N(i) ((i)->par_n)
+#define GST_VIDEO_INFO_PAR_D(i) ((i)->par_d)
+#define GST_VIDEO_INFO_FPS_N(i) ((i)->fps_n)
+#define GST_VIDEO_INFO_FPS_D(i) ((i)->fps_d)
+
+/* dealing with planes */
+#define GST_VIDEO_INFO_N_PLANES(i) (GST_VIDEO_FORMAT_INFO_N_PLANES((i)->finfo))
+#define GST_VIDEO_INFO_PLANE_OFFSET(i,p) ((i)->offset[p])
+#define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[p])
+
+/* dealing with components */
+#define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo)
+#define GST_VIDEO_INFO_COMP_DATA(i,d,c) GST_VIDEO_FORMAT_INFO_DATA((i)->finfo,d,c)
+#define GST_VIDEO_INFO_COMP_STRIDE(i,c) GST_VIDEO_FORMAT_INFO_STRIDE((i)->finfo,(i)->stride,c)
+#define GST_VIDEO_INFO_COMP_WIDTH(i,c) GST_VIDEO_FORMAT_INFO_SCALE_WIDTH((i)->finfo,c,(i)->width)
+#define GST_VIDEO_INFO_COMP_HEIGHT(i,c) GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT((i)->finfo,c,(i)->height)
+#define GST_VIDEO_INFO_COMP_PLANE(i,c) GST_VIDEO_FORMAT_INFO_PLANE((i)->finfo,c)
+#define GST_VIDEO_INFO_COMP_OFFSET(i,c) GST_VIDEO_FORMAT_INFO_OFFSET((i)->finfo,c)
+#define GST_VIDEO_INFO_COMP_PSTRIDE(i,c) GST_VIDEO_FORMAT_INFO_PSTRIDE((i)->finfo,c)
+
+void gst_video_info_init (GstVideoInfo *info);
+
+void gst_video_info_set_format (GstVideoInfo *info, GstVideoFormat format,
+ guint width, guint height);
+
+gboolean gst_video_info_from_caps (GstVideoInfo *info, const GstCaps * caps);
+
+GstCaps * gst_video_info_to_caps (GstVideoInfo *info);
+
+gboolean gst_video_info_convert (GstVideoInfo *info,
+ GstFormat src_format,
+ gint64 src_value,
+ GstFormat dest_format,
+ gint64 *dest_value);
+
+/**
+ * GstVideoFrame:
+ * @info: the #GstVideoInfo
+ * @buffer: the mapped buffer
+ * @meta: pointer to metadata if any
+ * @id: id of the mapped frame. the id can for example be used to
+ * indentify the frame in case of multiview video.
+ * @data: pointers to the plane data
+ *
+ * A video frame obtained from gst_video_frame_map()
+ */
+struct _GstVideoFrame {
+ GstVideoInfo info;
+
+ GstBuffer *buffer;
+ gpointer meta;
+ gint id;
+
+ gpointer data[GST_VIDEO_MAX_PLANES];
+};
+
+gboolean gst_video_frame_map (GstVideoFrame *frame, GstVideoInfo *info,
+ GstBuffer *buffer, GstMapFlags flags);
+gboolean gst_video_frame_map_id (GstVideoFrame *frame, GstVideoInfo *info,
+ GstBuffer *buffer, gint id, GstMapFlags flags);
+void gst_video_frame_unmap (GstVideoFrame *frame);
+
+gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFrame *src);
+
+/* general info */
+#define GST_VIDEO_FRAME_FORMAT(f) (GST_VIDEO_INFO_FORMAT(&(f)->info))
+#define GST_VIDEO_FRAME_WIDTH(f) (GST_VIDEO_INFO_WIDTH(&(f)->info))
+#define GST_VIDEO_FRAME_HEIGHT(f) (GST_VIDEO_INFO_HEIGHT(&(f)->info))
+#define GST_VIDEO_FRAME_SIZE(f) (GST_VIDEO_INFO_SIZE(&(f)->info))
+
+/* dealing with planes */
+#define GST_VIDEO_FRAME_N_PLANES(f) (GST_VIDEO_INFO_N_PLANES(&(f)->info))
+#define GST_VIDEO_FRAME_PLANE_DATA(f,p) ((f)->data[p])
+#define GST_VIDEO_FRAME_PLANE_OFFSET(f,p) (GST_VIDEO_INFO_PLANE_OFFSET(&(f)->info,p))
+#define GST_VIDEO_FRAME_PLANE_STRIDE(f,p) (GST_VIDEO_INFO_PLANE_STRIDE(&(f)->info,p))
+
+/* dealing with components */
+#define GST_VIDEO_FRAME_N_COMPONENTS(f) GST_VIDEO_INFO_N_COMPONENTS(&(f)->info)
+#define GST_VIDEO_FRAME_COMP_DATA(f,c) GST_VIDEO_INFO_COMP_DATA(&(f)->info,(f)->data,c)
+#define GST_VIDEO_FRAME_COMP_STRIDE(f,c) GST_VIDEO_INFO_COMP_STRIDE(&(f)->info,c)
+#define GST_VIDEO_FRAME_COMP_WIDTH(f,c) GST_VIDEO_INFO_COMP_WIDTH(&(f)->info,c)
+#define GST_VIDEO_FRAME_COMP_HEIGHT(f,c) GST_VIDEO_INFO_COMP_HEIGHT(&(f)->info,c)
+#define GST_VIDEO_FRAME_COMP_PLANE(f,c) GST_VIDEO_INFO_COMP_PLANE(&(f)->info,c)
+#define GST_VIDEO_FRAME_COMP_OFFSET(f,c) GST_VIDEO_INFO_COMP_OFFSET(&(f)->info,c)
+#define GST_VIDEO_FRAME_COMP_PSTRIDE(f,c) GST_VIDEO_INFO_COMP_PSTRIDE(&(f)->info,c)
+
+#define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]"
+#define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define GST_VIDEO_NE(s) G_STRINGIFY(s)"_LE"
+# define GST_VIDEO_OE(s) G_STRINGIFY(s)"_BE"
+#else
+# define GST_VIDEO_NE(s) G_STRINGIFY(s)"_BE"
+# define GST_VIDEO_OE(s) G_STRINGIFY(s)"_LE"
+#endif
+
+#define GST_VIDEO_FORMATS_ALL "{ I420, YV12, YUY2, UYVY, AYUV, RGBx, " \
+ "BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, " \
+ "YVYU, Y444, v210, v216, NV12, NV21, GRAY8, GRAY16_BE, GRAY16_LE, " \
+ "v308, Y800, Y16, RGB16, BGR16, RGB15, BGR15, UYVP, A420, " \
+ "RGB8_PALETTED, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210 }"
+
+/**
+ * GST_VIDEO_CAPS_MAKE:
+ * @format: string format that describes the pixel layout, as string
+ * (e.g. "I420", "RGB", "YV12", "YUY2", "AYUV", etc.)
+ *
+ * Generic caps string for video, for use in pad templates.
+ */
+#define GST_VIDEO_CAPS_MAKE(format) \
+ "video/x-raw, " \
+ "format = (string) " format ", " \
+ "width = " GST_VIDEO_SIZE_RANGE ", " \
+ "height = " GST_VIDEO_SIZE_RANGE ", " \
+ "framerate = " GST_VIDEO_FPS_RANGE
+
+/* buffer flags */
+
+/**
+ * GstVideoBufferFlags:
+ * @GST_VIDEO_BUFFER_FLAG_TFF: If the #GstBuffer is interlaced, then the first field
+ * in the video frame is the top field. If unset, the
+ * bottom field is first.
+ * @GST_VIDEO_BUFFER_FLAG_RFF: If the #GstBuffer is interlaced, then the first field
+ * (as defined by the %GST_VIDEO_BUFFER_TFF flag setting)
+ * is repeated.
+ * @GST_VIDEO_BUFFER_FLAG_ONEFIELD: If the #GstBuffer is interlaced, then only the
+ * first field (as defined by the %GST_VIDEO_BUFFER_TFF
+ * flag setting) is to be displayed.
+ * @GST_VIDEO_BUFFER_FLAG_PROGRESSIVE: If the #GstBuffer is telecined, then the
+ * buffer is progressive if the %GST_VIDEO_BUFFER_PROGRESSIVE
+ * flag is set, else it is telecine mixed.
+ *
+ * Additional video buffer flags.
+ */
+typedef enum {
+ GST_VIDEO_BUFFER_FLAG_TFF = (GST_BUFFER_FLAG_LAST << 0),
+ GST_VIDEO_BUFFER_FLAG_RFF = (GST_BUFFER_FLAG_LAST << 1),
+ GST_VIDEO_BUFFER_FLAG_ONEFIELD = (GST_BUFFER_FLAG_LAST << 2),
+ GST_VIDEO_BUFFER_FLAG_PROGRESSIVE = (GST_BUFFER_FLAG_LAST << 3),
+
+ GST_VIDEO_BUFFER_FLAG_LAST = (GST_BUFFER_FLAG_LAST << 8)
+} GstVideoBufferFlags;
+
+/* some helper functions */
+gboolean gst_video_calculate_display_ratio (guint * dar_n,
+ guint * dar_d,
+ guint video_width,
+ guint video_height,
+ guint video_par_n,
+ guint video_par_d,
+ guint display_par_n,
+ guint display_par_d);
+
+GstBuffer * gst_video_parse_caps_palette (GstCaps * caps);
+
+/* video still frame event creation and parsing */
+
+GstEvent * gst_video_event_new_still_frame (gboolean in_still);
+
+gboolean gst_video_event_parse_still_frame (GstEvent * event, gboolean * in_still);
+
+
+/* convert/encode video frame from one format to another */
+
+typedef void (*GstVideoConvertFrameCallback) (GstBuffer * buf, GError *error, gpointer user_data);
+
+void gst_video_convert_frame_async (GstBuffer * buf,
+ GstCaps * from_caps,
+ const GstCaps * to_caps,
+ GstClockTime timeout,
+ GstVideoConvertFrameCallback callback,
+ gpointer user_data,
+ GDestroyNotify destroy_notify);
+
+GstBuffer * gst_video_convert_frame (GstBuffer * buf,
+ GstCaps * from_caps,
+ const GstCaps * to_caps,
+ GstClockTime timeout,
+ GError ** error);
+G_END_DECLS
+
+#endif /* __GST_VIDEO_H__ */
diff --git a/gst-plugins-base.doap b/gst-plugins-base.doap
new file mode 100644
index 0000000..b0e4670
--- /dev/null
+++ b/gst-plugins-base.doap
@@ -0,0 +1,450 @@
+<Project
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns="http://usefulinc.com/ns/doap#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:admin="http://webns.net/mvcb/">
+
+ <name>GStreamer Base Plug-ins</name>
+ <shortname>gst-plugins-base</shortname>
+ <homepage rdf:resource="http://gstreamer.freedesktop.org/modules/gst-plugins-base.html" />
+ <created>2005-06-17</created>
+ <shortdesc xml:lang="en">
+a basic collection of elements
+ </shortdesc>
+ <description xml:lang="en">
+GStreamer Base Plug-ins is 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. It also contains helper
+libraries and base classes useful for writing elements.
+A wide range of video and audio decoders, encoders, and filters are included.
+</description>
+ <category></category>
+ <bug-database rdf:resource="http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer&amp;component=gst-plugins-base" />
+ <screenshots></screenshots>
+ <mailing-list rdf:resource="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" />
+ <programming-language>C</programming-language>
+ <license rdf:resource="http://usefulinc.com/doap/licenses/lgpl"/>
+ <download-page rdf:resource="http://gstreamer.freedesktop.org/download/" />
+
+ <repository>
+ <GitRepository>
+ <location rdf:resource="git://anongit.freedesktop.org/gstreamer/gst-plugins-base"/>
+ <browse rdf:resource="http://cgit.freedesktop.org/gstreamer/gst-plugins-base"/>
+ </GitRepository>
+ </repository>
+
+ <release>
+ <Version>
+ <revision>0.11.1</revision>
+ <branch>0.11</branch>
+ <name>A handful sometimes, A heartful always</name>
+ <created>2011-09-29</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.1.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.1.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.11.0</revision>
+ <branch>0.11</branch>
+ <name>Just like a pacifier</name>
+ <created>2011-08-02</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.0.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.0.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.35</revision>
+ <branch>0.10</branch>
+ <name>Short Notice</name>
+ <created>2011-06-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.35.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.35.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.34</revision>
+ <branch>0.10</branch>
+ <name>Lemmings</name>
+ <created>2011-05-13</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.34.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.34.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.33</revision>
+ <branch>0.10</branch>
+ <name>Relaxing Distractions</name>
+ <created>2011-05-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.33.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.33.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.32</revision>
+ <branch>0.10</branch>
+ <name>Your Life You Like It Well</name>
+ <created>2011-01-21</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.32.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.32.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.31</revision>
+ <branch>0.10</branch>
+ <name>Dance Like It's 1982</name>
+ <created>2010-11-30</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.31.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.31.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.30</revision>
+ <branch>0.10</branch>
+ <name>Difficult Birth</name>
+ <created>2010-07-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.30.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.30.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.29</revision>
+ <branch>0.10</branch>
+ <name>Freaks</name>
+ <created>2010-04-27</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.29.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.29.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.28</revision>
+ <branch>0.10</branch>
+ <name>Those Norwegians</name>
+ <created>2010-03-08</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.28.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.28.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.27</revision>
+ <branch>0.10</branch>
+ <name>No Mistakes Allowed</name>
+ <created>2010-03-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.27.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.27.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.26</revision>
+ <branch>0.10</branch>
+ <name>You will know when you get there</name>
+ <created>2010-02-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.26.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.26.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.25</revision>
+ <branch>0.10</branch>
+ <name>Standard disclaimers apply</name>
+ <created>2009-10-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.25.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.25.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.24</revision>
+ <branch>0.10</branch>
+ <name>Counting the days</name>
+ <created>2009-08-04</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.24.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.24.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.23</revision>
+ <branch>0.10</branch>
+ <name>Emergency de-stress call</name>
+ <created>2009-05-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.23.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.23.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.22</revision>
+ <branch>0.10</branch>
+ <name>Hidey Hidey Hidey Ho</name>
+ <created>2009-01-19</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.22.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.22.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.21</revision>
+ <branch>0.10</branch>
+ <name>We Could Be Wrong</name>
+ <created>2008-10-02</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.21.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.21.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.20</revision>
+ <branch>0.10</branch>
+ <name>Here I Go Again</name>
+ <created>2008-06-18</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.20.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.20.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.19</revision>
+ <branch>0.10</branch>
+ <name>Good Times</name>
+ <created>2008-04-04</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.19.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.19.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.18</revision>
+ <branch>0.10</branch>
+ <name>I will follow</name>
+ <created>2008-03-21</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.18.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.18.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.17</revision>
+ <branch>0.10</branch>
+ <name>Peanut Butter and Jelly</name>
+ <created>2008-01-30</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.17.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.17.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.16</revision>
+ <branch>0.10</branch>
+ <name>Scheduled Interruption</name>
+ <created>2008-01-28</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.16.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.16.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.15</revision>
+ <branch>0.10</branch>
+ <name>No need to argue</name>
+ <created>2007-11-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.15.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.15.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.14</revision>
+ <branch>0.10</branch>
+ <name>Light Years Ahead</name>
+ <created>2007-08-03</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.14.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.14.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.13</revision>
+ <branch>0.10</branch>
+ <name>What's going on?</name>
+ <created>2007-06-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.13.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.13.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.12</revision>
+ <branch>0.10</branch>
+ <name>Zombie Horde</name>
+ <created>2007-03-07</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.12.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.12.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.11</revision>
+ <branch>0.10</branch>
+ <name>Dumb things</name>
+ <created>2006-12-06</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.11.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.11.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.10</revision>
+ <branch>0.10</branch>
+ <name>Chorizo</name>
+ <created>2006-09-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.10.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.10.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.9</revision>
+ <branch>0.10</branch>
+ <name>I walk the line</name>
+ <created>2006-07-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.9.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.9.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.8</revision>
+ <branch>0.10</branch>
+ <name>Moar gij zie mij nie</name>
+ <created>2006-06-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.8.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.8.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.7</revision>
+ <branch>0.10</branch>
+ <name>Leave the gun</name>
+ <created>2006-05-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.7.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.7.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.6</revision>
+ <branch>0.10</branch>
+ <name>Chao</name>
+ <created>2006-04-28</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.6.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.6.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.5</revision>
+ <branch>0.10</branch>
+ <name>Net</name>
+ <created>2006-03-13</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.4</revision>
+ <branch>0.10</branch>
+ <name>Power</name>
+ <created>2006-03-10</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.3</revision>
+ <branch>0.10</branch>
+ <name>Under Pressure</name>
+ <created>2006-02-09</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.2</revision>
+ <branch>0.10</branch>
+ <name>Then the devil is six</name>
+ <created>2006-01-16</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.1</revision>
+ <branch>0.10</branch>
+ <name>Dobro Dedek</name>
+ <created>2005-12-23</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.0</revision>
+ <branch>0.10</branch>
+ <name>Mont-d'or</name>
+ <created>2005-12-05</created>
+ </Version>
+ </release>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Wim Taymans</foaf:name>
+ <foaf:mbox_sha1sum>0d93fde052812d51a05fd86de9bdbf674423daa2</foaf:mbox_sha1sum>
+ </foaf:Person>
+ </maintainer>
+
+</Project>
diff --git a/gst-plugins-base.spec b/gst-plugins-base.spec
new file mode 100644
index 0000000..b5d7cba
--- /dev/null
+++ b/gst-plugins-base.spec
@@ -0,0 +1,306 @@
+%define majorminor 0.11
+%define gstreamer gstreamer011
+
+%define gst_minver 0.11.0
+
+Name: %{gstreamer}-plugins-base
+Version: 0.11.1
+Release: 1.gst
+Summary: GStreamer streaming media framework plug-ins
+
+Group: Applications/Multimedia
+License: LGPL
+URL: http://gstreamer.freedesktop.org/
+Vendor: GStreamer Backpackers Team <package@gstreamer.freedesktop.org>
+Source: http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+Requires: %{gstreamer} >= %{gst_minver}
+BuildRequires: %{gstreamer}-devel >= %{gst_minver}
+BuildRequires: gobject-introspection-devel >= 0.9.12
+
+BuildRequires: gcc-c++
+BuildRequires: gtk-doc >= 1.3
+BuildRequires: orc-devel
+Requires: orc
+
+Requires: libogg >= 1.0
+Requires: libvorbis >= 1.0
+BuildRequires: libogg-devel >= 1.0
+BuildRequires: libvorbis-devel >= 1.0
+BuildRequires: libXv-devel
+Requires: libXv-devel
+BuildRequires: alsa-lib-devel
+Requires: alsa-lib
+BuildRequires: cdparanoia-devel
+Requires: cdparanoia
+BuildRequires: libvisual-devel
+Requires: libvisual
+BuildRequires: pango-devel
+Requires: pango
+BuildRequires: libtheora-devel >= 1.0
+Requires: libtheora >= 1.0
+
+%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-base-%{version}
+export DOCS_ARE_INCOMPLETE_PLEASE_FIXME=0
+%build
+%configure \
+ --enable-gtk-doc --enable-introspection=yes
+
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%makeinstall
+
+# 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-base-%{majorminor}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -f gst-plugins-base-%{majorminor}.lang
+%defattr(-, root, root)
+%doc AUTHORS COPYING README REQUIREMENTS gst-plugins-base.doap
+
+# helper programs
+%{_bindir}/gst-visualise-%{majorminor}
+%{_bindir}/gst-discoverer-%{majorminor}
+%{_mandir}/man1/gst-visualise-%{majorminor}*
+
+# libraries
+%{_libdir}/libgstaudio-%{majorminor}.so.*
+%{_libdir}/libgstcdda-%{majorminor}.so*
+%{_libdir}/libgstinterfaces-%{majorminor}.so.*
+%{_libdir}/libgstnetbuffer-%{majorminor}.so*
+%{_libdir}/libgstpbutils-%{majorminor}.so*
+%{_libdir}/libgstriff-%{majorminor}.so.*
+%{_libdir}/libgstrtp-%{majorminor}.so*
+%{_libdir}/libgsttag-%{majorminor}.so.*
+%{_libdir}/libgstvideo-%{majorminor}.so.*
+%{_libdir}/libgstfft-%{majorminor}.so.*
+%{_libdir}/libgstrtsp-%{majorminor}.so.*
+%{_libdir}/libgstsdp-%{majorminor}.so.*
+%{_libdir}/libgstapp-%{majorminor}.so.*
+
+# base plugins without external dependencies
+%{_libdir}/gstreamer-%{majorminor}/libgstadder.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudioconvert.so
+%{_libdir}/gstreamer-%{majorminor}/libgstplayback.so
+%{_libdir}/gstreamer-%{majorminor}/libgsttypefindfunctions.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideotestsrc.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudiorate.so
+%{_libdir}/gstreamer-%{majorminor}/libgstsubparse.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvolume.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideoconvert.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideorate.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideoscale.so
+%{_libdir}/gstreamer-%{majorminor}/libgsttcp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudioresample.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudiotestsrc.so
+%{_libdir}/gstreamer-%{majorminor}/libgstgdp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstapp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstencodebin.so
+
+# Here are packages not in the base plugins package but not dependant
+# on an external lib
+
+# @USE_GST_V4L2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstvideo4linux2.so
+
+# base plugins with dependencies
+%{_libdir}/gstreamer-%{majorminor}/libgstalsa.so
+%{_libdir}/gstreamer-%{majorminor}/libgsttheora.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvorbis.so
+%{_libdir}/gstreamer-%{majorminor}/libgstogg.so
+%{_libdir}/gstreamer-%{majorminor}/libgstximage*.so
+%{_libdir}/gstreamer-%{majorminor}/libgstxvimagesink.so
+%{_libdir}/gstreamer-%{majorminor}/libgstlibvisual.so
+%{_libdir}/gstreamer-%{majorminor}/libgstpango.so
+%{_libdir}/gstreamer-%{majorminor}/libgstcdparanoia.so
+%{_libdir}/gstreamer-%{majorminor}/libgstgio.so
+# @USE_SCHRO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstschro.so
+%package devel
+Summary: GStreamer Plugin Library Headers
+Group: Development/Libraries
+Requires: %{gstreamer}-plugins-base = %{version}
+
+%description devel
+GStreamer Plugins Base library development and header files.
+
+%files devel
+%defattr(-, root, root)
+# plugin helper library headers
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/audio.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiofilter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/multichannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-ids.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-media.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-read.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/video.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstmetavideo.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideopool.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/colorbalance.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/colorbalancechannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/interfaces-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixeroptions.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixertrack.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/navigation.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/propertyprobe.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tuner.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tunerchannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tunernorm.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/videooverlay.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiosrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstbaseaudiosrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertpaudiopayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertpdepayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtpbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioclock.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstbaseaudiosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstringbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/tag.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertppayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideofilter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/netbuffer/gstnetbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/cdda/gstcddabasesrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/mixerutils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/videoorientation.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/descriptions.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/install-plugins.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/missing-plugins.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/pbutils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtcpbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfft.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfftf32.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfftf64.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstffts16.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstffts32.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsp-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspbase64.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspconnection.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspdefs.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspextension.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspmessage.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsprange.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsptransport.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspurl.h
+%{_includedir}/gstreamer-%{majorminor}/gst/sdp/gstsdp.h
+%{_includedir}/gstreamer-%{majorminor}/gst/sdp/gstsdpmessage.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtppayloads.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/gsttagdemux.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/pbutils-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/app/gstappsink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/app/gstappsrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/audio-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/video-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/streamvolume.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/codec-utils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/encoding-profile.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/encoding-target.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/gstdiscoverer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/gstpluginsbaseversion.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/xmpwriter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioiec61937.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiodecoder.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioencoder.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/gsttagmux.h
+
+%{_libdir}/libgstfft-%{majorminor}.so
+%{_libdir}/libgstrtsp-%{majorminor}.so
+%{_libdir}/libgstsdp-%{majorminor}.so
+%{_libdir}/libgstaudio-%{majorminor}.so
+%{_libdir}/libgstriff-%{majorminor}.so
+%{_libdir}/libgsttag-%{majorminor}.so
+%{_libdir}/libgstvideo-%{majorminor}.so
+%{_libdir}/libgstrtp-%{majorminor}.so
+%{_libdir}/libgstinterfaces-%{majorminor}.so
+%{_libdir}/libgstnetbuffer-%{majorminor}.so
+%{_libdir}/libgstpbutils-%{majorminor}.so
+%{_libdir}/libgstcdda-%{majorminor}.so
+%{_libdir}/libgstapp-%{majorminor}.so
+
+# pkg-config files
+%{_libdir}/pkgconfig/gstreamer-plugins-base-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-audio-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-cdda-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-fft-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-interfaces-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-netbuffer-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-pbutils-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-riff-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-rtp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-rtsp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-sdp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-tag-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-video-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-app-%{majorminor}.pc
+
+%{_libdir}/girepository-1.0/GstApp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstAudio-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstFft-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstInterfaces-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstNetbuffer-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstPbutils-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRiff-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRtp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRtsp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstSdp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstTag-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstVideo-%{majorminor}.typelib
+%{_datadir}/gir-1.0/GstApp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstAudio-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstFft-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstInterfaces-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstNetbuffer-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstPbutils-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRiff-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRtp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRtsp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstSdp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstTag-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstVideo-%{majorminor}.gir
+
+# gtk-doc documentation
+%doc %{_datadir}/gtk-doc/html/gst-plugins-base-libs-%{majorminor}
+%doc %{_datadir}/gtk-doc/html/gst-plugins-base-plugins-%{majorminor}
+%doc %{_datadir}/gst-plugins-base/license-translations.dict
+
+%changelog
+* Sun Aug 07 2011 Thomas Vander Stichele <thomas at apestaart dot org>
+- rename to gstreamer011
+- require 0.11 gstreamer
+- properly use majorminor macro
+- libgstplayback.so now contains playbin/decodebin elements.
+- gstappbuffer is gone
+- added metavideo and videopool headers
+
+* Fri Dec 15 2006 Thomas Vander Stichele <thomas at apestaart dot org>
+- add doap file
+- cleanups
+
+* Fri Sep 02 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- clean up a little
+
+* Fri May 6 2005 Christian Schaller <christian at fluendo dot com>
+- Added libgstaudiorate and libgstsubparse to spec file
+
+* Thu May 5 2005 Christian Schaller <christian at fluendo dot com>
+- first attempt at spec file for gst-plugins-base
diff --git a/gst-plugins-base.spec.in b/gst-plugins-base.spec.in
new file mode 100644
index 0000000..f815c78
--- /dev/null
+++ b/gst-plugins-base.spec.in
@@ -0,0 +1,306 @@
+%define majorminor @GST_MAJORMINOR@
+%define gstreamer gstreamer011
+
+%define gst_minver 0.11.0
+
+Name: %{gstreamer}-plugins-base
+Version: @VERSION@
+Release: @PACKAGE_VERSION_RELEASE@.gst
+Summary: GStreamer streaming media framework plug-ins
+
+Group: Applications/Multimedia
+License: LGPL
+URL: http://gstreamer.freedesktop.org/
+Vendor: GStreamer Backpackers Team <package@gstreamer.freedesktop.org>
+Source: http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+Requires: %{gstreamer} >= %{gst_minver}
+BuildRequires: %{gstreamer}-devel >= %{gst_minver}
+BuildRequires: gobject-introspection-devel >= 0.9.12
+
+BuildRequires: gcc-c++
+BuildRequires: gtk-doc >= 1.3
+BuildRequires: orc-devel
+Requires: orc
+
+@USE_VORBIS_TRUE@Requires: libogg >= 1.0
+@USE_VORBIS_TRUE@Requires: libvorbis >= 1.0
+@USE_VORBIS_TRUE@BuildRequires: libogg-devel >= 1.0
+@USE_VORBIS_TRUE@BuildRequires: libvorbis-devel >= 1.0
+@USE_XVIDEO_TRUE@BuildRequires: libXv-devel
+@USE_XVIDEO_TRUE@Requires: libXv-devel
+@USE_ALSA_TRUE@BuildRequires: alsa-lib-devel
+@USE_ALSA_TRUE@Requires: alsa-lib
+@USE_CDPARANOIA_TRUE@BuildRequires: cdparanoia-devel
+@USE_CDPARANOIA_TRUE@Requires: cdparanoia
+@USE_LIBVISUAL_TRUE@BuildRequires: libvisual-devel
+@USE_LIBVISUAL_TRUE@Requires: libvisual
+@USE_PANGO_TRUE@BuildRequires: pango-devel
+@USE_PANGO_TRUE@Requires: pango
+@USE_THEORA_TRUE@BuildRequires: libtheora-devel >= 1.0
+@USE_THEORA_TRUE@Requires: libtheora >= 1.0
+
+%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-base-%{version}
+export DOCS_ARE_INCOMPLETE_PLEASE_FIXME=0
+%build
+%configure \
+ --enable-gtk-doc --enable-introspection=yes
+
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%makeinstall
+
+# 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-base-%{majorminor}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -f gst-plugins-base-%{majorminor}.lang
+%defattr(-, root, root)
+%doc AUTHORS COPYING README REQUIREMENTS gst-plugins-base.doap
+
+# helper programs
+%{_bindir}/gst-visualise-%{majorminor}
+%{_bindir}/gst-discoverer-%{majorminor}
+%{_mandir}/man1/gst-visualise-%{majorminor}*
+
+# libraries
+%{_libdir}/libgstaudio-%{majorminor}.so.*
+%{_libdir}/libgstcdda-%{majorminor}.so*
+%{_libdir}/libgstinterfaces-%{majorminor}.so.*
+%{_libdir}/libgstnetbuffer-%{majorminor}.so*
+%{_libdir}/libgstpbutils-%{majorminor}.so*
+%{_libdir}/libgstriff-%{majorminor}.so.*
+%{_libdir}/libgstrtp-%{majorminor}.so*
+%{_libdir}/libgsttag-%{majorminor}.so.*
+%{_libdir}/libgstvideo-%{majorminor}.so.*
+%{_libdir}/libgstfft-%{majorminor}.so.*
+%{_libdir}/libgstrtsp-%{majorminor}.so.*
+%{_libdir}/libgstsdp-%{majorminor}.so.*
+%{_libdir}/libgstapp-%{majorminor}.so.*
+
+# base plugins without external dependencies
+%{_libdir}/gstreamer-%{majorminor}/libgstadder.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudioconvert.so
+%{_libdir}/gstreamer-%{majorminor}/libgstplayback.so
+%{_libdir}/gstreamer-%{majorminor}/libgsttypefindfunctions.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideotestsrc.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudiorate.so
+%{_libdir}/gstreamer-%{majorminor}/libgstsubparse.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvolume.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideoconvert.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideorate.so
+%{_libdir}/gstreamer-%{majorminor}/libgstvideoscale.so
+%{_libdir}/gstreamer-%{majorminor}/libgsttcp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudioresample.so
+%{_libdir}/gstreamer-%{majorminor}/libgstaudiotestsrc.so
+%{_libdir}/gstreamer-%{majorminor}/libgstgdp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstapp.so
+%{_libdir}/gstreamer-%{majorminor}/libgstencodebin.so
+
+# Here are packages not in the base plugins package but not dependant
+# on an external lib
+
+# @USE_GST_V4L2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstvideo4linux2.so
+
+# base plugins with dependencies
+@USE_ALSA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstalsa.so
+@USE_THEORA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgsttheora.so
+@USE_VORBIS_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstvorbis.so
+@USE_VORBIS_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstogg.so
+@USE_XVIDEO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstximage*.so
+@USE_XVIDEO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstxvimagesink.so
+@USE_LIBVISUAL_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstlibvisual.so
+@USE_PANGO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstpango.so
+@USE_CDPARANOIA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcdparanoia.so
+@USE_GIO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstgio.so
+# @USE_SCHRO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstschro.so
+%package devel
+Summary: GStreamer Plugin Library Headers
+Group: Development/Libraries
+Requires: %{gstreamer}-plugins-base = %{version}
+
+%description devel
+GStreamer Plugins Base library development and header files.
+
+%files devel
+%defattr(-, root, root)
+# plugin helper library headers
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/audio.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiofilter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/multichannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-ids.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-media.h
+%{_includedir}/gstreamer-%{majorminor}/gst/riff/riff-read.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/video.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstmetavideo.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideopool.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/colorbalance.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/colorbalancechannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/interfaces-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixeroptions.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/mixertrack.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/navigation.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/propertyprobe.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tuner.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tunerchannel.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/tunernorm.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/videooverlay.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiosrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstbaseaudiosrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertpaudiopayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertpdepayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtpbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioclock.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstbaseaudiosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstringbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/tag.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstbasertppayload.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideofilter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/gstvideosink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/netbuffer/gstnetbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/cdda/gstcddabasesrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/mixerutils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/videoorientation.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/descriptions.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/install-plugins.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/missing-plugins.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/pbutils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtcpbuffer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfft.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfftf32.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstfftf64.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstffts16.h
+%{_includedir}/gstreamer-%{majorminor}/gst/fft/gstffts32.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsp-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspbase64.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspconnection.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspdefs.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspextension.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspmessage.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsprange.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtsptransport.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtsp/gstrtspurl.h
+%{_includedir}/gstreamer-%{majorminor}/gst/sdp/gstsdp.h
+%{_includedir}/gstreamer-%{majorminor}/gst/sdp/gstsdpmessage.h
+%{_includedir}/gstreamer-%{majorminor}/gst/rtp/gstrtppayloads.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/gsttagdemux.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/pbutils-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/app/gstappsink.h
+%{_includedir}/gstreamer-%{majorminor}/gst/app/gstappsrc.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/audio-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/video/video-enumtypes.h
+%{_includedir}/gstreamer-%{majorminor}/gst/interfaces/streamvolume.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/codec-utils.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/encoding-profile.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/encoding-target.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/gstdiscoverer.h
+%{_includedir}/gstreamer-%{majorminor}/gst/pbutils/gstpluginsbaseversion.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/xmpwriter.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioiec61937.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudiodecoder.h
+%{_includedir}/gstreamer-%{majorminor}/gst/audio/gstaudioencoder.h
+%{_includedir}/gstreamer-%{majorminor}/gst/tag/gsttagmux.h
+
+%{_libdir}/libgstfft-%{majorminor}.so
+%{_libdir}/libgstrtsp-%{majorminor}.so
+%{_libdir}/libgstsdp-%{majorminor}.so
+%{_libdir}/libgstaudio-%{majorminor}.so
+%{_libdir}/libgstriff-%{majorminor}.so
+%{_libdir}/libgsttag-%{majorminor}.so
+%{_libdir}/libgstvideo-%{majorminor}.so
+%{_libdir}/libgstrtp-%{majorminor}.so
+%{_libdir}/libgstinterfaces-%{majorminor}.so
+%{_libdir}/libgstnetbuffer-%{majorminor}.so
+%{_libdir}/libgstpbutils-%{majorminor}.so
+%{_libdir}/libgstcdda-%{majorminor}.so
+%{_libdir}/libgstapp-%{majorminor}.so
+
+# pkg-config files
+%{_libdir}/pkgconfig/gstreamer-plugins-base-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-audio-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-cdda-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-fft-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-interfaces-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-netbuffer-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-pbutils-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-riff-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-rtp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-rtsp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-sdp-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-tag-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-video-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-app-%{majorminor}.pc
+
+%{_libdir}/girepository-1.0/GstApp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstAudio-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstFft-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstInterfaces-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstNetbuffer-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstPbutils-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRiff-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRtp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstRtsp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstSdp-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstTag-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstVideo-%{majorminor}.typelib
+%{_datadir}/gir-1.0/GstApp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstAudio-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstFft-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstInterfaces-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstNetbuffer-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstPbutils-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRiff-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRtp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstRtsp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstSdp-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstTag-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstVideo-%{majorminor}.gir
+
+# gtk-doc documentation
+%doc %{_datadir}/gtk-doc/html/gst-plugins-base-libs-%{majorminor}
+%doc %{_datadir}/gtk-doc/html/gst-plugins-base-plugins-%{majorminor}
+%doc %{_datadir}/gst-plugins-base/license-translations.dict
+
+%changelog
+* Sun Aug 07 2011 Thomas Vander Stichele <thomas at apestaart dot org>
+- rename to gstreamer011
+- require 0.11 gstreamer
+- properly use majorminor macro
+- libgstplayback.so now contains playbin/decodebin elements.
+- gstappbuffer is gone
+- added metavideo and videopool headers
+
+* Fri Dec 15 2006 Thomas Vander Stichele <thomas at apestaart dot org>
+- add doap file
+- cleanups
+
+* Fri Sep 02 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- clean up a little
+
+* Fri May 6 2005 Christian Schaller <christian at fluendo dot com>
+- Added libgstaudiorate and libgstsubparse to spec file
+
+* Thu May 5 2005 Christian Schaller <christian at fluendo dot com>
+- first attempt at spec file for gst-plugins-base
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..5fb3dfd
--- /dev/null
+++ b/gst/Makefile.in
@@ -0,0 +1,774 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/adder/Makefile.am b/gst/adder/Makefile.am
new file mode 100644
index 0000000..8fe5d21
--- /dev/null
+++ b/gst/adder/Makefile.am
@@ -0,0 +1,31 @@
+plugin_LTLIBRARIES = libgstadder.la
+
+ORC_SOURCE=gstadderorc
+include $(top_srcdir)/common/orc.mak
+
+
+libgstadder_la_SOURCES = gstadder.c
+nodist_libgstadder_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstadder_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstadder_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS)
+libgstadder_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstadder.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstadder -:SHARED libgstadder \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstadder_la_SOURCES) \
+ $(nodist_libgstadder_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstadder_la_CFLAGS) \
+ -:LDFLAGS $(libgstadder_la_LDFLAGS) \
+ $(libgstadder_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/adder/Makefile.in b/gst/adder/Makefile.in
new file mode 100644
index 0000000..fcb9842
--- /dev/null
+++ b/gst/adder/Makefile.in
@@ -0,0 +1,863 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/adder
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstadder_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstadder_la_OBJECTS = libgstadder_la-gstadder.lo
+am__objects_1 = libgstadder_la-tmp-orc.lo
+nodist_libgstadder_la_OBJECTS = $(am__objects_1)
+libgstadder_la_OBJECTS = $(am_libgstadder_la_OBJECTS) \
+ $(nodist_libgstadder_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstadder_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstadder_la_CFLAGS) $(CFLAGS) \
+ $(libgstadder_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstadder_la_SOURCES) $(nodist_libgstadder_la_SOURCES)
+DIST_SOURCES = $(libgstadder_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstadder.la
+ORC_SOURCE = gstadderorc
+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 $@";
+libgstadder_la_SOURCES = gstadder.c
+nodist_libgstadder_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstadder_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstadder_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS)
+
+libgstadder_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstadder.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/adder/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/adder/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
+libgstadder.la: $(libgstadder_la_OBJECTS) $(libgstadder_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstadder_la_LINK) -rpath $(plugindir) $(libgstadder_la_OBJECTS) $(libgstadder_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstadder_la-gstadder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstadder_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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstadder_la-gstadder.lo: gstadder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstadder_la_CFLAGS) $(CFLAGS) -MT libgstadder_la-gstadder.lo -MD -MP -MF $(DEPDIR)/libgstadder_la-gstadder.Tpo -c -o libgstadder_la-gstadder.lo `test -f 'gstadder.c' || echo '$(srcdir)/'`gstadder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstadder_la-gstadder.Tpo $(DEPDIR)/libgstadder_la-gstadder.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstadder.c' object='libgstadder_la-gstadder.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstadder_la_CFLAGS) $(CFLAGS) -c -o libgstadder_la-gstadder.lo `test -f 'gstadder.c' || echo '$(srcdir)/'`gstadder.c
+
+libgstadder_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstadder_la_CFLAGS) $(CFLAGS) -MT libgstadder_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstadder_la-tmp-orc.Tpo -c -o libgstadder_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstadder_la-tmp-orc.Tpo $(DEPDIR)/libgstadder_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstadder_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstadder_la_CFLAGS) $(CFLAGS) -c -o libgstadder_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstadder -:SHARED libgstadder \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstadder_la_SOURCES) \
+ $(nodist_libgstadder_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstadder_la_CFLAGS) \
+ -:LDFLAGS $(libgstadder_la_LDFLAGS) \
+ $(libgstadder_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/adder/gstadder.c b/gst/adder/gstadder.c
new file mode 100644
index 0000000..d5f9907
--- /dev/null
+++ b/gst/adder/gstadder.c
@@ -0,0 +1,1312 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2001 Thomas <thomas@apestaart.org>
+ * 2005,2006 Wim Taymans <wim@fluendo.com>
+ *
+ * adder.c: Adder element, N in, one out, samples are added
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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-adder
+ *
+ * The adder allows to mix several streams into one by adding the data.
+ * Mixed data is clamped to the min/max values of the data format.
+ *
+ * The adder currently mixes all data received on the sinkpads as soon as
+ * possible without trying to synchronize the streams.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch audiotestsrc freq=100 ! adder name=mix ! audioconvert ! alsasink audiotestsrc freq=500 ! mix.
+ * ]| This pipeline produces two sine waves mixed together.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-05-09 (0.10.7)
+ */
+/* Element-Checklist-Version: 5 */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "gstadder.h"
+#include <string.h> /* strcmp */
+#include "gstadderorc.h"
+
+/* highest positive/lowest negative x-bit value we can use for clamping */
+#define MAX_INT_32 ((gint32) (0x7fffffff))
+#define MAX_INT_16 ((gint16) (0x7fff))
+#define MAX_INT_8 ((gint8) (0x7f))
+#define MAX_UINT_32 ((guint32)(0xffffffff))
+#define MAX_UINT_16 ((guint16)(0xffff))
+#define MAX_UINT_8 ((guint8) (0xff))
+
+#define MIN_INT_32 ((gint32) (0x80000000))
+#define MIN_INT_16 ((gint16) (0x8000))
+#define MIN_INT_8 ((gint8) (0x80))
+#define MIN_UINT_32 ((guint32)(0x00000000))
+#define MIN_UINT_16 ((guint16)(0x0000))
+#define MIN_UINT_8 ((guint8) (0x00))
+
+enum
+{
+ PROP_0,
+ PROP_FILTER_CAPS
+};
+
+#define GST_CAT_DEFAULT gst_adder_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+/* elementfactory information */
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ S32LE, U32LE, S16LE, U16LE, S8, U8, F32LE, F64LE }")
+#else
+#define CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ S32BE, U32BE, S16BE, U16BE, S8, U8, F32BE, F64BE }")
+#endif
+
+static GstStaticPadTemplate gst_adder_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CAPS)
+ );
+
+static GstStaticPadTemplate gst_adder_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS (CAPS)
+ );
+
+#define gst_adder_parent_class parent_class
+G_DEFINE_TYPE (GstAdder, gst_adder, GST_TYPE_ELEMENT);
+
+static void gst_adder_dispose (GObject * object);
+static void gst_adder_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_adder_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_adder_setcaps (GstAdder * adder, GstPad * pad,
+ GstCaps * caps);
+static gboolean gst_adder_query (GstPad * pad, GstQuery * query);
+static gboolean gst_adder_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_adder_sink_event (GstPad * pad, GstEvent * event);
+
+static GstPad *gst_adder_request_new_pad (GstElement * element,
+ GstPadTemplate * temp, const gchar * unused, const GstCaps * caps);
+static void gst_adder_release_pad (GstElement * element, GstPad * pad);
+
+static GstStateChangeReturn gst_adder_change_state (GstElement * element,
+ GstStateChange transition);
+
+static GstBuffer *gst_adder_do_clip (GstCollectPads * pads,
+ GstCollectData * data, GstBuffer * buffer, gpointer user_data);
+static GstFlowReturn gst_adder_collected (GstCollectPads * pads,
+ gpointer user_data);
+
+/* non-clipping versions (for float) */
+#define MAKE_FUNC_NC(name,type) \
+static void name (type *out, type *in, gint samples) { \
+ gint i; \
+ for (i = 0; i < samples; i++) \
+ out[i] += in[i]; \
+}
+
+/* *INDENT-OFF* */
+MAKE_FUNC_NC (add_float64, gdouble)
+/* *INDENT-ON* */
+
+/* we can only accept caps that we and downstream can handle.
+ * if we have filtercaps set, use those to constrain the target caps.
+ */
+static GstCaps *
+gst_adder_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstAdder *adder;
+ GstCaps *result, *peercaps, *sinkcaps, *filter_caps;
+
+ adder = GST_ADDER (GST_PAD_PARENT (pad));
+
+ GST_OBJECT_LOCK (adder);
+ /* take filter */
+ if ((filter_caps = adder->filter_caps)) {
+ if (filter)
+ filter_caps =
+ gst_caps_intersect_full (filter, filter_caps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ gst_caps_ref (filter_caps);
+ } else {
+ filter_caps = gst_caps_ref (filter);
+ }
+ GST_OBJECT_UNLOCK (adder);
+
+ if (filter_caps && gst_caps_is_empty (filter_caps)) {
+ GST_WARNING_OBJECT (pad, "Empty filter caps");
+ return filter_caps;
+ }
+
+ /* get the downstream possible caps */
+ peercaps = gst_pad_peer_get_caps (adder->srcpad, filter_caps);
+
+ /* get the allowed caps on this sinkpad */
+ sinkcaps = gst_pad_get_current_caps (pad);
+ if (sinkcaps == NULL) {
+ sinkcaps = gst_pad_get_pad_template_caps (pad);
+ if (!sinkcaps)
+ sinkcaps = gst_caps_new_any ();
+ }
+
+ if (peercaps) {
+ /* if the peer has caps, intersect */
+ GST_DEBUG_OBJECT (adder, "intersecting peer and template caps");
+ result =
+ gst_caps_intersect_full (peercaps, sinkcaps, GST_CAPS_INTERSECT_FIRST);
+ 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. */
+ /* restrict with filter-caps if any */
+ if (filter_caps) {
+ GST_DEBUG_OBJECT (adder, "no peer caps, using filtered sinkcaps");
+ result =
+ gst_caps_intersect_full (filter_caps, sinkcaps,
+ GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (sinkcaps);
+ } else {
+ GST_DEBUG_OBJECT (adder, "no peer caps, using sinkcaps");
+ result = sinkcaps;
+ }
+ }
+
+ if (filter_caps)
+ gst_caps_unref (filter_caps);
+
+ GST_LOG_OBJECT (adder, "getting caps on pad %p,%s to %" GST_PTR_FORMAT, pad,
+ GST_PAD_NAME (pad), result);
+
+ return result;
+}
+
+typedef struct
+{
+ GstPad *pad;
+ GstCaps *caps;
+} IterData;
+
+static void
+setcapsfunc (const GValue * item, IterData * data)
+{
+ GstPad *otherpad = g_value_get_object (item);
+
+ if (otherpad != data->pad)
+ gst_pad_set_caps (data->pad, data->caps);
+}
+
+/* the first caps we receive on any of the sinkpads will define the caps for all
+ * the other sinkpads because we can only mix streams with the same caps.
+ */
+static gboolean
+gst_adder_setcaps (GstAdder * adder, GstPad * pad, GstCaps * caps)
+{
+ GstAudioInfo info;
+ GstIterator *it;
+ GstIteratorResult ires;
+ IterData idata;
+ gboolean done;
+
+ GST_LOG_OBJECT (adder, "setting caps pad %p,%s to %" GST_PTR_FORMAT, pad,
+ GST_PAD_NAME (pad), caps);
+
+ it = gst_element_iterate_pads (GST_ELEMENT_CAST (adder));
+
+ /* FIXME, see if the other pads can accept the format. Also lock the
+ * format on the other pads to this new format. */
+ idata.caps = caps;
+ idata.pad = pad;
+
+ done = FALSE;
+ while (!done) {
+ ires = gst_iterator_foreach (it, (GstIteratorForeachFunction) setcapsfunc,
+ &idata);
+
+ switch (ires) {
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ break;
+ default:
+ done = TRUE;
+ break;
+ }
+ }
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto invalid_format;
+
+ switch (GST_AUDIO_INFO_FORMAT (&info)) {
+ case GST_AUDIO_FORMAT_S8:
+ adder->func = (GstAdderFunction) add_int8;
+ break;
+ case GST_AUDIO_FORMAT_U8:
+ adder->func = (GstAdderFunction) add_uint8;
+ break;
+ case GST_AUDIO_FORMAT_S16:
+ adder->func = (GstAdderFunction) add_int16;
+ break;
+ case GST_AUDIO_FORMAT_U16:
+ adder->func = (GstAdderFunction) add_uint16;
+ break;
+ case GST_AUDIO_FORMAT_S32:
+ adder->func = (GstAdderFunction) add_int32;
+ break;
+ case GST_AUDIO_FORMAT_U32:
+ adder->func = (GstAdderFunction) add_uint32;
+ break;
+ case GST_AUDIO_FORMAT_F32:
+ adder->func = (GstAdderFunction) add_float32;
+ break;
+ case GST_AUDIO_FORMAT_F64:
+ adder->func = (GstAdderFunction) add_float64;
+ break;
+ default:
+ goto invalid_format;
+ }
+ return TRUE;
+
+ /* ERRORS */
+invalid_format:
+ {
+ GST_DEBUG_OBJECT (adder, "invalid format set as caps");
+ return FALSE;
+ }
+}
+
+/* FIXME, the duration query should reflect how long you will produce
+ * data, that is the amount of stream time until you will emit EOS.
+ *
+ * For synchronized mixing this is always the max of all the durations
+ * of upstream since we emit EOS when all of them finished.
+ *
+ * We don't do synchronized mixing so this really depends on where the
+ * streams where punched in and what their relative offsets are against
+ * eachother which we can get from the first timestamps we see.
+ *
+ * When we add a new stream (or remove a stream) the duration might
+ * also become invalid again and we need to post a new DURATION
+ * message to notify this fact to the parent.
+ * For now we take the max of all the upstream elements so the simple
+ * cases work at least somewhat.
+ */
+static gboolean
+gst_adder_query_duration (GstAdder * adder, GstQuery * query)
+{
+ gint64 max;
+ gboolean res;
+ GstFormat format;
+ GstIterator *it;
+ gboolean done;
+ GValue item = { 0, };
+
+ /* parse format */
+ gst_query_parse_duration (query, &format, NULL);
+
+ max = -1;
+ res = TRUE;
+ done = FALSE;
+
+ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (adder));
+ while (!done) {
+ GstIteratorResult ires;
+
+ ires = gst_iterator_next (it, &item);
+ switch (ires) {
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_OK:
+ {
+ GstPad *pad = g_value_get_object (&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;
+ }
+ g_value_reset (&item);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ max = -1;
+ res = TRUE;
+ gst_iterator_resync (it);
+ break;
+ default:
+ res = FALSE;
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ if (res) {
+ /* and store the max */
+ GST_DEBUG_OBJECT (adder, "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_adder_query_latency (GstAdder * adder, GstQuery * query)
+{
+ GstClockTime min, max;
+ gboolean live;
+ gboolean res;
+ GstIterator *it;
+ gboolean done;
+ GValue item = { 0, };
+
+ 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 (adder));
+ while (!done) {
+ GstIteratorResult ires;
+
+ ires = gst_iterator_next (it, &item);
+ switch (ires) {
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_OK:
+ {
+ GstPad *pad = g_value_get_object (&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);
+ g_value_reset (&item);
+ 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;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ if (res) {
+ /* store the results */
+ GST_DEBUG_OBJECT (adder, "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_adder_query (GstPad * pad, GstQuery * query)
+{
+ GstAdder *adder = GST_ADDER (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, adder->segment.position);
+ res = TRUE;
+ break;
+ case GST_FORMAT_DEFAULT:
+ gst_query_set_position (query, format, adder->offset);
+ res = TRUE;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ res = gst_adder_query_duration (adder, query);
+ break;
+ case GST_QUERY_LATENCY:
+ res = gst_adder_query_latency (adder, 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 (adder);
+ return res;
+}
+
+typedef struct
+{
+ GstEvent *event;
+ gboolean flush;
+} EventData;
+
+static gboolean
+forward_event_func (const GValue * val, GValue * ret, EventData * data)
+{
+ GstPad *pad = g_value_get_object (val);
+ GstEvent *event = data->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)) {
+ GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.",
+ event, GST_EVENT_TYPE_NAME (event));
+ /* quick hack to unflush the pads, ideally we need a way to just unflush
+ * this single collect pad */
+ if (data->flush)
+ gst_pad_send_event (pad, gst_event_new_flush_stop (TRUE));
+ } else {
+ g_value_set_boolean (ret, TRUE);
+ GST_LOG_OBJECT (pad, "Sent event %p (%s).",
+ event, GST_EVENT_TYPE_NAME (event));
+ }
+
+ /* continue on other pads, even if one failed */
+ 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 (GstAdder * adder, GstEvent * event, gboolean flush)
+{
+ gboolean ret;
+ GstIterator *it;
+ GstIteratorResult ires;
+ GValue vret = { 0 };
+ EventData data;
+
+ GST_LOG_OBJECT (adder, "Forwarding event %p (%s)", event,
+ GST_EVENT_TYPE_NAME (event));
+
+ data.event = event;
+ data.flush = flush;
+
+ g_value_init (&vret, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&vret, FALSE);
+ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (adder));
+ while (TRUE) {
+ ires =
+ gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func,
+ &vret, &data);
+ switch (ires) {
+ case GST_ITERATOR_RESYNC:
+ GST_WARNING ("resync");
+ gst_iterator_resync (it);
+ g_value_set_boolean (&vret, TRUE);
+ break;
+ case GST_ITERATOR_OK:
+ case GST_ITERATOR_DONE:
+ ret = g_value_get_boolean (&vret);
+ goto done;
+ default:
+ ret = FALSE;
+ goto done;
+ }
+ }
+done:
+ gst_iterator_free (it);
+ GST_LOG_OBJECT (adder, "Forwarded event %p (%s), ret=%d", event,
+ GST_EVENT_TYPE_NAME (event), ret);
+ gst_event_unref (event);
+
+ return ret;
+}
+
+static gboolean
+gst_adder_src_event (GstPad * pad, GstEvent * event)
+{
+ GstAdder *adder;
+ gboolean result;
+
+ adder = GST_ADDER (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (pad, "Got %s event on src pad",
+ GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ GstSeekFlags flags;
+ gdouble rate;
+ GstSeekType curtype, endtype;
+ gint64 cur, end;
+ gboolean flush;
+
+ /* parse the seek parameters */
+ gst_event_parse_seek (event, &rate, NULL, &flags, &curtype,
+ &cur, &endtype, &end);
+
+ if ((curtype != GST_SEEK_TYPE_NONE) && (curtype != GST_SEEK_TYPE_SET)) {
+ result = FALSE;
+ GST_DEBUG_OBJECT (adder,
+ "seeking failed, unhandled seek type for start: %d", curtype);
+ goto done;
+ }
+ if ((endtype != GST_SEEK_TYPE_NONE) && (endtype != GST_SEEK_TYPE_SET)) {
+ result = FALSE;
+ GST_DEBUG_OBJECT (adder,
+ "seeking failed, unhandled seek type for end: %d", endtype);
+ goto done;
+ }
+
+ flush = (flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH;
+
+ /* check if we are flushing */
+ if (flush) {
+ /* make sure we accept nothing anymore and return WRONG_STATE */
+ gst_collect_pads_set_flushing (adder->collect, TRUE);
+
+ /* flushing seek, start flush downstream, the flush will be done
+ * when all pads received a FLUSH_STOP. */
+ gst_pad_push_event (adder->srcpad, gst_event_new_flush_start ());
+
+ /* We can't send FLUSH_STOP here since upstream could start pushing data
+ * after we unlock adder->collect.
+ * We set flush_stop_pending to TRUE instead and send FLUSH_STOP after
+ * forwarding the seek upstream or from gst_adder_collected,
+ * whichever happens first.
+ */
+ g_atomic_int_set (&adder->flush_stop_pending, TRUE);
+ }
+ GST_DEBUG_OBJECT (adder, "handling seek event: %" GST_PTR_FORMAT, event);
+
+ /* now wait for the collected to be finished and mark a new
+ * segment. After we have the lock, no collect function is running and no
+ * new collect function will be called for as long as we're flushing. */
+ GST_OBJECT_LOCK (adder->collect);
+ adder->segment.rate = rate;
+ if (curtype == GST_SEEK_TYPE_SET)
+ adder->segment.start = cur;
+ else
+ adder->segment.start = 0;
+ if (endtype == GST_SEEK_TYPE_SET)
+ adder->segment.stop = end;
+ else
+ adder->segment.stop = GST_CLOCK_TIME_NONE;
+ if (flush) {
+ /* Yes, we need to call _set_flushing again *WHEN* the streaming threads
+ * have stopped so that the cookie gets properly updated. */
+ gst_collect_pads_set_flushing (adder->collect, TRUE);
+ }
+ GST_OBJECT_UNLOCK (adder->collect);
+ GST_DEBUG_OBJECT (adder, "forwarding seek event: %" GST_PTR_FORMAT,
+ event);
+
+ /* we're forwarding seek to all upstream peers and wait for one to reply
+ * with a newsegment-event before we send a newsegment-event downstream */
+ g_atomic_int_set (&adder->wait_for_new_segment, TRUE);
+ result = forward_event (adder, event, flush);
+ if (!result) {
+ /* seek failed. maybe source is a live source. */
+ GST_DEBUG_OBJECT (adder, "seeking failed");
+ }
+ if (g_atomic_int_compare_and_exchange (&adder->flush_stop_pending,
+ TRUE, FALSE)) {
+ GST_DEBUG_OBJECT (adder, "pending flush stop");
+ gst_pad_push_event (adder->srcpad, gst_event_new_flush_stop (TRUE));
+ }
+ break;
+ }
+ case GST_EVENT_QOS:
+ /* QoS might be tricky */
+ result = FALSE;
+ break;
+ case GST_EVENT_NAVIGATION:
+ /* navigation is rather pointless. */
+ result = FALSE;
+ break;
+ default:
+ /* just forward the rest for now */
+ GST_DEBUG_OBJECT (adder, "forward unhandled event: %s",
+ GST_EVENT_TYPE_NAME (event));
+ result = forward_event (adder, event, FALSE);
+ break;
+ }
+
+done:
+ gst_object_unref (adder);
+
+ return result;
+}
+
+static gboolean
+gst_adder_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstAdder *adder;
+ gboolean ret = TRUE;
+
+ adder = GST_ADDER (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (pad, "Got %s event on sink pad",
+ GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_adder_setcaps (adder, pad, caps);
+ gst_event_unref (event);
+
+ goto beach;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ /* we received a flush-stop. The collect_event function will push the
+ * event past our element. We simply forward all flush-stop events, even
+ * when no flush-stop was pending, this is required because collectpads
+ * does not provide an API to handle-but-not-forward the flush-stop.
+ * We unset the pending flush-stop flag so that we don't send anymore
+ * flush-stop from the collect function later.
+ */
+ GST_OBJECT_LOCK (adder->collect);
+ g_atomic_int_set (&adder->new_segment_pending, TRUE);
+ g_atomic_int_set (&adder->flush_stop_pending, FALSE);
+ /* Clear pending tags */
+ if (adder->pending_events) {
+ g_list_foreach (adder->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (adder->pending_events);
+ adder->pending_events = NULL;
+ }
+ GST_OBJECT_UNLOCK (adder->collect);
+ break;
+ case GST_EVENT_TAG:
+ GST_OBJECT_LOCK (adder->collect);
+ /* collect tags here so we can push them out when we collect data */
+ adder->pending_events = g_list_append (adder->pending_events, event);
+ GST_OBJECT_UNLOCK (adder->collect);
+ goto beach;
+ case GST_EVENT_SEGMENT:
+ if (g_atomic_int_compare_and_exchange (&adder->wait_for_new_segment,
+ TRUE, FALSE)) {
+ /* make sure we push a new segment, to inform about new basetime
+ * see FIXME in gst_adder_collected() */
+ g_atomic_int_set (&adder->new_segment_pending, TRUE);
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* now GstCollectPads can take care of the rest, e.g. EOS */
+ ret = adder->collect_event (pad, event);
+
+beach:
+ gst_object_unref (adder);
+ return ret;
+}
+
+static void
+gst_adder_class_init (GstAdderClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->set_property = gst_adder_set_property;
+ gobject_class->get_property = gst_adder_get_property;
+ gobject_class->dispose = gst_adder_dispose;
+
+ /**
+ * GstAdder:caps:
+ *
+ * Since: 0.10.24
+ */
+ g_object_class_install_property (gobject_class, PROP_FILTER_CAPS,
+ g_param_spec_boxed ("caps", "Target caps",
+ "Set target format for mixing (NULL means ANY). "
+ "Setting this property takes a reference to the supplied GstCaps "
+ "object.", GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_adder_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_adder_sink_template));
+ gst_element_class_set_details_simple (gstelement_class, "Adder",
+ "Generic/Audio",
+ "Add N audio channels together",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gstelement_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_adder_request_new_pad);
+ gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_adder_release_pad);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_adder_change_state);
+}
+
+static void
+gst_adder_init (GstAdder * adder)
+{
+ GstPadTemplate *template;
+
+ template = gst_static_pad_template_get (&gst_adder_src_template);
+ adder->srcpad = gst_pad_new_from_template (template, "src");
+ gst_object_unref (template);
+
+ gst_pad_set_getcaps_function (adder->srcpad,
+ GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
+ gst_pad_set_query_function (adder->srcpad,
+ GST_DEBUG_FUNCPTR (gst_adder_query));
+ gst_pad_set_event_function (adder->srcpad,
+ GST_DEBUG_FUNCPTR (gst_adder_src_event));
+ gst_element_add_pad (GST_ELEMENT (adder), adder->srcpad);
+
+ gst_audio_info_init (&adder->info);
+ adder->padcount = 0;
+ adder->func = NULL;
+
+ adder->filter_caps = NULL;
+
+ /* keep track of the sinkpads requested */
+ adder->collect = gst_collect_pads_new ();
+ gst_collect_pads_set_function (adder->collect,
+ GST_DEBUG_FUNCPTR (gst_adder_collected), adder);
+ gst_collect_pads_set_clip_function (adder->collect,
+ GST_DEBUG_FUNCPTR (gst_adder_do_clip), adder);
+}
+
+static void
+gst_adder_dispose (GObject * object)
+{
+ GstAdder *adder = GST_ADDER (object);
+
+ if (adder->collect) {
+ gst_object_unref (adder->collect);
+ adder->collect = NULL;
+ }
+ gst_caps_replace (&adder->filter_caps, NULL);
+ if (adder->pending_events) {
+ g_list_foreach (adder->pending_events, (GFunc) gst_event_unref, NULL);
+ g_list_free (adder->pending_events);
+ adder->pending_events = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_adder_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAdder *adder = GST_ADDER (object);
+
+ switch (prop_id) {
+ case PROP_FILTER_CAPS:{
+ GstCaps *new_caps = NULL;
+ GstCaps *old_caps;
+ const GstCaps *new_caps_val = gst_value_get_caps (value);
+
+ if (new_caps_val != NULL) {
+ new_caps = (GstCaps *) new_caps_val;
+ gst_caps_ref (new_caps);
+ }
+
+ GST_OBJECT_LOCK (adder);
+ old_caps = adder->filter_caps;
+ adder->filter_caps = new_caps;
+ GST_OBJECT_UNLOCK (adder);
+
+ if (old_caps)
+ gst_caps_unref (old_caps);
+
+ GST_DEBUG_OBJECT (adder, "set new caps %" GST_PTR_FORMAT, new_caps);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_adder_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstAdder *adder = GST_ADDER (object);
+
+ switch (prop_id) {
+ case PROP_FILTER_CAPS:
+ GST_OBJECT_LOCK (adder);
+ gst_value_set_caps (value, adder->filter_caps);
+ GST_OBJECT_UNLOCK (adder);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static GstPad *
+gst_adder_request_new_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * unused, const GstCaps * caps)
+{
+ gchar *name;
+ GstAdder *adder;
+ GstPad *newpad;
+ gint padcount;
+
+ if (templ->direction != GST_PAD_SINK)
+ goto not_sink;
+
+ adder = GST_ADDER (element);
+
+ /* increment pad counter */
+#if GLIB_CHECK_VERSION(2,29,5)
+ padcount = g_atomic_int_add (&adder->padcount, 1);
+#else
+ padcount = g_atomic_int_exchange_and_add (&adder->padcount, 1);
+#endif
+
+ name = g_strdup_printf ("sink%d", padcount);
+ newpad = gst_pad_new_from_template (templ, name);
+ GST_DEBUG_OBJECT (adder, "request new pad %s", name);
+ g_free (name);
+
+ gst_pad_set_getcaps_function (newpad,
+ GST_DEBUG_FUNCPTR (gst_adder_sink_getcaps));
+ gst_collect_pads_add_pad (adder->collect, newpad, 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 */
+ adder->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad);
+ gst_pad_set_event_function (newpad, GST_DEBUG_FUNCPTR (gst_adder_sink_event));
+
+ /* takes ownership of the pad */
+ if (!gst_element_add_pad (GST_ELEMENT (adder), newpad))
+ goto could_not_add;
+
+ return newpad;
+
+ /* errors */
+not_sink:
+ {
+ g_warning ("gstadder: request new pad that is not a SINK pad\n");
+ return NULL;
+ }
+could_not_add:
+ {
+ GST_DEBUG_OBJECT (adder, "could not add pad");
+ gst_collect_pads_remove_pad (adder->collect, newpad);
+ gst_object_unref (newpad);
+ return NULL;
+ }
+}
+
+static void
+gst_adder_release_pad (GstElement * element, GstPad * pad)
+{
+ GstAdder *adder;
+
+ adder = GST_ADDER (element);
+
+ GST_DEBUG_OBJECT (adder, "release pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ gst_collect_pads_remove_pad (adder->collect, pad);
+ gst_element_remove_pad (element, pad);
+}
+
+static GstBuffer *
+gst_adder_do_clip (GstCollectPads * pads, GstCollectData * data,
+ GstBuffer * buffer, gpointer user_data)
+{
+ GstAdder *adder = GST_ADDER (user_data);
+ gint rate, bpf;
+
+ rate = GST_AUDIO_INFO_RATE (&adder->info);
+ bpf = GST_AUDIO_INFO_BPF (&adder->info);
+
+ buffer = gst_audio_buffer_clip (buffer, &data->segment, rate, bpf);
+
+ return buffer;
+}
+
+static GstFlowReturn
+gst_adder_collected (GstCollectPads * pads, gpointer user_data)
+{
+ /*
+ * combine streams by adding data values
+ * basic algorithm :
+ * - this function is called when all pads have a buffer
+ * - get available bytes on all pads.
+ * - repeat for each input pad :
+ * - read available bytes, copy or add to target buffer
+ * - if there's an EOS event, remove the input channel
+ * - push out the output buffer
+ *
+ * todo:
+ * - would be nice to have a mixing mode, where instead of adding we mix
+ * - for float we could downscale after collect loop
+ * - for int we need to downscale each input to avoid clipping or
+ * mix into a temp (float) buffer and scale afterwards as well
+ */
+ GstAdder *adder;
+ GSList *collected, *next = NULL;
+ GstFlowReturn ret;
+ GstBuffer *outbuf = NULL, *gapbuf = NULL;
+ gpointer outdata = NULL;
+ guint outsize;
+ gint64 next_offset;
+ gint64 next_timestamp;
+ gint rate, bps, bpf;
+
+ adder = GST_ADDER (user_data);
+
+ /* this is fatal */
+ if (G_UNLIKELY (adder->func == NULL))
+ goto not_negotiated;
+
+ if (g_atomic_int_compare_and_exchange (&adder->flush_stop_pending,
+ TRUE, FALSE)) {
+ GST_DEBUG_OBJECT (adder, "pending flush stop");
+ gst_pad_push_event (adder->srcpad, gst_event_new_flush_stop (TRUE));
+ }
+
+ /* get available bytes for reading, this can be 0 which could mean empty
+ * buffers or EOS, which we will catch when we loop over the pads. */
+ outsize = gst_collect_pads_available (pads);
+ /* can only happen when no pads to collect or all EOS */
+ if (outsize == 0)
+ goto eos;
+
+ rate = GST_AUDIO_INFO_RATE (&adder->info);
+ bps = GST_AUDIO_INFO_BPS (&adder->info);
+ bpf = GST_AUDIO_INFO_BPF (&adder->info);
+
+ GST_LOG_OBJECT (adder,
+ "starting to cycle through channels, %d bytes available (bps = %d)",
+ outsize, bpf);
+
+ for (collected = pads->data; collected; collected = next) {
+ GstCollectData *collect_data;
+ GstBuffer *inbuf;
+ gboolean is_gap;
+
+ /* take next to see if this is the last collectdata */
+ next = g_slist_next (collected);
+
+ collect_data = (GstCollectData *) collected->data;
+
+ /* get a buffer of size bytes, if we get a buffer, it is at least outsize
+ * bytes big. */
+ inbuf = gst_collect_pads_take_buffer (pads, collect_data, outsize);
+ /* NULL means EOS or an empty buffer so we still need to flush in
+ * case of an empty buffer. */
+ if (inbuf == NULL) {
+ GST_LOG_OBJECT (adder, "channel %p: no bytes available", collect_data);
+ continue;
+ }
+
+ is_gap = GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP);
+
+ /* Try to make an output buffer */
+ if (outbuf == NULL) {
+ /* if this is a gap buffer but we have some more pads to check, skip it.
+ * If we are at the last buffer, take it, regardless if it is a GAP
+ * buffer or not. */
+ if (is_gap && next) {
+ GST_DEBUG_OBJECT (adder, "skipping, non-last GAP buffer");
+ /* we keep the GAP buffer, if we don't have anymore buffers (all pads
+ * EOS, we can use this one as the output buffer. */
+ if (gapbuf == NULL)
+ gapbuf = inbuf;
+ else
+ gst_buffer_unref (inbuf);
+ continue;
+ }
+
+ GST_LOG_OBJECT (adder, "channel %p: preparing output buffer of %d bytes",
+ collect_data, outsize);
+
+ outdata = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE);
+ } else {
+ if (!is_gap) {
+ /* we had a previous output buffer, mix this non-GAP buffer */
+ guint8 *indata;
+ gsize insize;
+
+ indata = gst_buffer_map (inbuf, &insize, NULL, GST_MAP_READ);
+
+ /* all buffers should have outsize, there are no short buffers because we
+ * asked for the max size above */
+ g_assert (insize == outsize);
+
+ GST_LOG_OBJECT (adder, "channel %p: mixing %" G_GSIZE_FORMAT " bytes"
+ " from data %p", collect_data, insize, indata);
+
+ /* further buffers, need to add them */
+ adder->func ((gpointer) outdata, (gpointer) indata, insize / bps);
+ gst_buffer_unmap (inbuf, indata, insize);
+ } else {
+ /* skip gap buffer */
+ GST_LOG_OBJECT (adder, "channel %p: skipping GAP buffer", collect_data);
+ }
+ gst_buffer_unref (inbuf);
+ }
+ }
+ if (outbuf)
+ gst_buffer_unmap (outbuf, outdata, outsize);
+
+ if (outbuf == NULL) {
+ /* no output buffer, reuse one of the GAP buffers then if we have one */
+ if (gapbuf) {
+ GST_LOG_OBJECT (adder, "reusing GAP buffer %p", gapbuf);
+ outbuf = gapbuf;
+ } else
+ /* assume EOS otherwise, this should not happen, really */
+ goto eos;
+ } else if (gapbuf)
+ /* we had an output buffer, unref the gapbuffer we kept */
+ gst_buffer_unref (gapbuf);
+
+ if (g_atomic_int_compare_and_exchange (&adder->new_segment_pending, TRUE,
+ FALSE)) {
+ GstEvent *event;
+
+ /* FIXME, use rate/applied_rate as set on all sinkpads.
+ * - currently we just set rate as received from last seek-event
+ *
+ * When seeking we set the start and stop positions as given in the seek
+ * event. We also adjust offset & timestamp acordingly.
+ * This basically ignores all newsegments sent by upstream.
+ */
+ event = gst_event_new_segment (&adder->segment);
+
+ if (adder->segment.rate > 0.0) {
+ adder->segment.position = adder->segment.start;
+ } else {
+ adder->segment.position = adder->segment.stop;
+ }
+ adder->offset = gst_util_uint64_scale (adder->segment.position,
+ rate, GST_SECOND);
+ GST_INFO_OBJECT (adder, "seg_start %" G_GUINT64_FORMAT ", seg_end %"
+ G_GUINT64_FORMAT, adder->segment.start, adder->segment.stop);
+ GST_INFO_OBJECT (adder, "timestamp %" G_GINT64_FORMAT ",new offset %"
+ G_GINT64_FORMAT, adder->segment.position, adder->offset);
+
+ if (event) {
+ if (!gst_pad_push_event (adder->srcpad, event)) {
+ GST_WARNING_OBJECT (adder->srcpad, "Sending event failed");
+ }
+ } else {
+ GST_WARNING_OBJECT (adder->srcpad, "Creating new segment event for "
+ "start:%" G_GINT64_FORMAT " end:%" G_GINT64_FORMAT " failed",
+ adder->segment.start, adder->segment.stop);
+ }
+ }
+
+ if (G_UNLIKELY (adder->pending_events)) {
+ GList *tmp = adder->pending_events;
+
+ while (tmp) {
+ GstEvent *ev = (GstEvent *) tmp->data;
+
+ gst_pad_push_event (adder->srcpad, ev);
+ tmp = g_list_next (tmp);
+ }
+ g_list_free (adder->pending_events);
+ adder->pending_events = NULL;
+ }
+
+ /* for the next timestamp, use the sample counter, which will
+ * never accumulate rounding errors */
+ if (adder->segment.rate > 0.0) {
+ next_offset = adder->offset + outsize / bpf;
+ } else {
+ next_offset = adder->offset - outsize / bpf;
+ }
+ next_timestamp = gst_util_uint64_scale (next_offset, GST_SECOND, rate);
+
+
+ /* set timestamps on the output buffer */
+ if (adder->segment.rate > 0.0) {
+ GST_BUFFER_TIMESTAMP (outbuf) = adder->segment.position;
+ GST_BUFFER_OFFSET (outbuf) = adder->offset;
+ GST_BUFFER_OFFSET_END (outbuf) = next_offset;
+ GST_BUFFER_DURATION (outbuf) = next_timestamp - adder->segment.position;
+ } else {
+ GST_BUFFER_TIMESTAMP (outbuf) = next_timestamp;
+ GST_BUFFER_OFFSET (outbuf) = next_offset;
+ GST_BUFFER_OFFSET_END (outbuf) = adder->offset;
+ GST_BUFFER_DURATION (outbuf) = adder->segment.position - next_timestamp;
+ }
+
+ adder->offset = next_offset;
+ adder->segment.position = next_timestamp;
+
+ /* send it out */
+ GST_LOG_OBJECT (adder, "pushing outbuf %p, timestamp %" GST_TIME_FORMAT
+ " offset %" G_GINT64_FORMAT, outbuf,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
+ GST_BUFFER_OFFSET (outbuf));
+ ret = gst_pad_push (adder->srcpad, outbuf);
+
+ GST_LOG_OBJECT (adder, "pushed outbuf, result = %s", gst_flow_get_name (ret));
+
+ return ret;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ GST_ELEMENT_ERROR (adder, STREAM, FORMAT, (NULL),
+ ("Unknown data received, not negotiated"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (adder, "no data available, must be EOS");
+ gst_pad_push_event (adder->srcpad, gst_event_new_eos ());
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstStateChangeReturn
+gst_adder_change_state (GstElement * element, GstStateChange transition)
+{
+ GstAdder *adder;
+ GstStateChangeReturn ret;
+
+ adder = GST_ADDER (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ adder->segment.position = 0;
+ adder->offset = 0;
+ adder->flush_stop_pending = FALSE;
+ adder->new_segment_pending = TRUE;
+ adder->wait_for_new_segment = FALSE;
+ gst_segment_init (&adder->segment, GST_FORMAT_TIME);
+ gst_collect_pads_start (adder->collect);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ 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 (adder->collect);
+ break;
+ default:
+ break;
+ }
+
+ 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_CAT_DEFAULT, "adder", 0,
+ "audio channel mixing element");
+
+ gst_adder_orc_init ();
+
+ if (!gst_element_register (plugin, "adder", GST_RANK_NONE, GST_TYPE_ADDER)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "adder",
+ "Adds multiple streams",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/adder/gstadder.h b/gst/adder/gstadder.h
new file mode 100644
index 0000000..5a50c03
--- /dev/null
+++ b/gst/adder/gstadder.h
@@ -0,0 +1,91 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstadder.h: Header for GstAdder 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_ADDER_H__
+#define __GST_ADDER_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstcollectpads.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ADDER (gst_adder_get_type())
+#define GST_ADDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ADDER,GstAdder))
+#define GST_IS_ADDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ADDER))
+#define GST_ADDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_ADDER,GstAdderClass))
+#define GST_IS_ADDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_ADDER))
+#define GST_ADDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_ADDER,GstAdderClass))
+
+typedef struct _GstAdder GstAdder;
+typedef struct _GstAdderClass GstAdderClass;
+typedef struct _GstAdderInputChannel GstAdderInputChannel;
+
+typedef void (*GstAdderFunction) (gpointer out, gpointer in, guint size);
+
+/**
+ * GstAdder:
+ *
+ * The adder object structure.
+ */
+struct _GstAdder {
+ GstElement element;
+
+ GstPad *srcpad;
+ GstCollectPads *collect;
+ /* pad counter, used for creating unique request pads */
+ gint padcount;
+
+ /* the next are valid for both int and float */
+ GstAudioInfo info;
+
+ /* function to add samples */
+ GstAdderFunction func;
+
+ /* counters to keep track of timestamps */
+ gint64 offset;
+
+ /* sink event handling */
+ GstPadEventFunction collect_event;
+ GstSegment segment;
+ volatile gboolean new_segment_pending;
+ volatile gboolean wait_for_new_segment;
+ /* src event handling */
+ volatile gboolean flush_stop_pending;
+
+ /* target caps */
+ GstCaps *filter_caps;
+
+ /* Pending inline events */
+ GList *pending_events;
+};
+
+struct _GstAdderClass {
+ GstElementClass parent_class;
+};
+
+GType gst_adder_get_type (void);
+
+G_END_DECLS
+
+
+#endif /* __GST_ADDER_H__ */
diff --git a/gst/adder/gstadderorc-dist.c b/gst/adder/gstadderorc-dist.c
new file mode 100644
index 0000000..b1850f0
--- /dev/null
+++ b/gst/adder/gstadderorc-dist.c
@@ -0,0 +1,835 @@
+
+/* autogenerated from gstadderorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void add_int32 (gint32 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1,
+ int n);
+void add_int16 (gint16 * ORC_RESTRICT d1, const gint16 * ORC_RESTRICT s1,
+ int n);
+void add_int8 (gint8 * ORC_RESTRICT d1, const gint8 * ORC_RESTRICT s1, int n);
+void add_uint32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1,
+ int n);
+void add_uint16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1,
+ int n);
+void add_uint8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n);
+void add_float32 (float *ORC_RESTRICT d1, const float *ORC_RESTRICT s1, int n);
+
+void gst_adder_orc_init (void);
+
+
+/* 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 */
+
+
+
+/* add_int32 */
+#ifdef DISABLE_ORC
+void
+add_int32 (gint32 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+ orc_union32 var33;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addssl */
+ var34.i = ORC_CLAMP_SL ((orc_int64) var32.i + (orc_int64) var33.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_int32 (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;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addssl */
+ var34.i = ORC_CLAMP_SL ((orc_int64) var32.i + (orc_int64) var33.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_int32;
+void
+add_int32 (gint32 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_int32;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_int16 */
+#ifdef DISABLE_ORC
+void
+add_int16 (gint16 * ORC_RESTRICT d1, const gint16 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_union16 var33;
+ orc_union16 var34;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr0[i];
+ /* 1: loadw */
+ var33 = ptr4[i];
+ /* 2: addssw */
+ var34.i = ORC_CLAMP_SW (var32.i + var33.i);
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_int16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_union16 var33;
+ orc_union16 var34;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr0[i];
+ /* 1: loadw */
+ var33 = ptr4[i];
+ /* 2: addssw */
+ var34.i = ORC_CLAMP_SW (var32.i + var33.i);
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_int16;
+void
+add_int16 (gint16 * ORC_RESTRICT d1, const gint16 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_int16;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_int8 */
+#ifdef DISABLE_ORC
+void
+add_int8 (gint8 * ORC_RESTRICT d1, const gint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr0[i];
+ /* 1: loadb */
+ var33 = ptr4[i];
+ /* 2: addssb */
+ var34 = ORC_CLAMP_SB (var32 + var33);
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_int8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr0[i];
+ /* 1: loadb */
+ var33 = ptr4[i];
+ /* 2: addssb */
+ var34 = ORC_CLAMP_SB (var32 + var33);
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_int8;
+void
+add_int8 (gint8 * ORC_RESTRICT d1, const gint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_int8;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_uint32 */
+#ifdef DISABLE_ORC
+void
+add_uint32 (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;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addusl */
+ var34.i =
+ ORC_CLAMP_UL ((orc_int64) (orc_uint32) var32.i +
+ (orc_int64) (orc_uint32) var33.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_uint32 (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;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addusl */
+ var34.i =
+ ORC_CLAMP_UL ((orc_int64) (orc_uint32) var32.i +
+ (orc_int64) (orc_uint32) var33.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_uint32;
+void
+add_uint32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_uint32;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_uint16 */
+#ifdef DISABLE_ORC
+void
+add_uint16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_union16 var33;
+ orc_union16 var34;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr0[i];
+ /* 1: loadw */
+ var33 = ptr4[i];
+ /* 2: addusw */
+ var34.i = ORC_CLAMP_UW ((orc_uint16) var32.i + (orc_uint16) var33.i);
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_uint16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_union16 var33;
+ orc_union16 var34;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr0[i];
+ /* 1: loadw */
+ var33 = ptr4[i];
+ /* 2: addusw */
+ var34.i = ORC_CLAMP_UW ((orc_uint16) var32.i + (orc_uint16) var33.i);
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_uint16;
+void
+add_uint16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_uint16;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_uint8 */
+#ifdef DISABLE_ORC
+void
+add_uint8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr0[i];
+ /* 1: loadb */
+ var33 = ptr4[i];
+ /* 2: addusb */
+ var34 = ORC_CLAMP_UB ((orc_uint8) var32 + (orc_uint8) var33);
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_uint8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr0[i];
+ /* 1: loadb */
+ var33 = ptr4[i];
+ /* 2: addusb */
+ var34 = ORC_CLAMP_UB ((orc_uint8) var32 + (orc_uint8) var33);
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_uint8;
+void
+add_uint8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_uint8;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* add_float32 */
+#ifdef DISABLE_ORC
+void
+add_float32 (float *ORC_RESTRICT d1, const float *ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+ orc_union32 var33;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f + _src2.f;
+ var34.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_add_float32 (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;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 1: loadl */
+ var33 = ptr4[i];
+ /* 2: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f + _src2.f;
+ var34.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_add_float32;
+void
+add_float32 (float *ORC_RESTRICT d1, const float *ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_add_float32;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+void
+gst_adder_orc_init (void)
+{
+#ifndef DISABLE_ORC
+ {
+ /* add_int32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_int32");
+ orc_program_set_backup_function (p, _backup_add_int32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "addssl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_int32 = p;
+ }
+ {
+ /* add_int16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_int16");
+ orc_program_set_backup_function (p, _backup_add_int16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 2, "s1");
+
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_int16 = p;
+ }
+ {
+ /* add_int8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_int8");
+ orc_program_set_backup_function (p, _backup_add_int8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+
+ orc_program_append_2 (p, "addssb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_int8 = p;
+ }
+ {
+ /* add_uint32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_uint32");
+ orc_program_set_backup_function (p, _backup_add_uint32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "addusl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_uint32 = p;
+ }
+ {
+ /* add_uint16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_uint16");
+ orc_program_set_backup_function (p, _backup_add_uint16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 2, "s1");
+
+ orc_program_append_2 (p, "addusw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_uint16 = p;
+ }
+ {
+ /* add_uint8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_uint8");
+ orc_program_set_backup_function (p, _backup_add_uint8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+
+ orc_program_append_2 (p, "addusb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_uint8 = p;
+ }
+ {
+ /* add_float32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "add_float32");
+ orc_program_set_backup_function (p, _backup_add_float32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "addf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_add_float32 = p;
+ }
+#endif
+}
diff --git a/gst/adder/gstadderorc-dist.h b/gst/adder/gstadderorc-dist.h
new file mode 100644
index 0000000..31ba99e
--- /dev/null
+++ b/gst/adder/gstadderorc-dist.h
@@ -0,0 +1,85 @@
+
+/* autogenerated from gstadderorc.orc */
+
+#ifndef _GSTADDERORC_H_
+#define _GSTADDERORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void gst_adder_orc_init (void);
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 add_int32 (gint32 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n);
+void add_int16 (gint16 * ORC_RESTRICT d1, const gint16 * ORC_RESTRICT s1, int n);
+void add_int8 (gint8 * ORC_RESTRICT d1, const gint8 * ORC_RESTRICT s1, int n);
+void add_uint32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n);
+void add_uint16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1, int n);
+void add_uint8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void add_float32 (float * ORC_RESTRICT d1, const float * ORC_RESTRICT s1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/adder/gstadderorc.orc b/gst/adder/gstadderorc.orc
new file mode 100644
index 0000000..f8c3caf
--- /dev/null
+++ b/gst/adder/gstadderorc.orc
@@ -0,0 +1,52 @@
+
+.init gst_adder_orc_init
+
+.function add_int32
+.dest 4 d1 gint32
+.source 4 s1 gint32
+
+addssl d1, d1, s1
+
+
+.function add_int16
+.dest 2 d1 gint16
+.source 2 s1 gint16
+
+addssw d1, d1, s1
+
+
+.function add_int8
+.dest 1 d1 gint8
+.source 1 s1 gint8
+
+addssb d1, d1, s1
+
+
+.function add_uint32
+.dest 4 d1 guint32
+.source 4 s1 guint32
+
+addusl d1, d1, s1
+
+
+.function add_uint16
+.dest 2 d1 guint16
+.source 2 s1 guint16
+
+addusw d1, d1, s1
+
+
+.function add_uint8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+
+addusb d1, d1, s1
+
+
+.function add_float32
+.dest 4 d1 float
+.source 4 s1 float
+
+addf d1, d1, s1
+
+
diff --git a/gst/app/Makefile.am b/gst/app/Makefile.am
new file mode 100644
index 0000000..2170623
--- /dev/null
+++ b/gst/app/Makefile.am
@@ -0,0 +1,21 @@
+plugin_LTLIBRARIES = libgstapp.la
+
+libgstapp_la_SOURCES = gstapp.c
+libgstapp_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
+libgstapp_la_LIBADD = $(GST_BASE_LIBS) $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la
+libgstapp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstapp_la_LIBTOOLFLAGS = --tag=disable-static
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstapp -:SHARED libgstapp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstapp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapp_la_CFLAGS) \
+ -:LDFLAGS $(libgstapp_la_LDFLAGS) \
+ $(libgstapp_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/app/Makefile.in b/gst/app/Makefile.in
new file mode 100644
index 0000000..17bfbcf
--- /dev/null
+++ b/gst/app/Makefile.in
@@ -0,0 +1,765 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/app
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstapp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la
+am_libgstapp_la_OBJECTS = libgstapp_la-gstapp.lo
+libgstapp_la_OBJECTS = $(am_libgstapp_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstapp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstapp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstapp_la_CFLAGS) $(CFLAGS) \
+ $(libgstapp_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstapp_la_SOURCES)
+DIST_SOURCES = $(libgstapp_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstapp.la
+libgstapp_la_SOURCES = gstapp.c
+libgstapp_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
+libgstapp_la_LIBADD = $(GST_BASE_LIBS) $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la
+libgstapp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstapp_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/app/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/app/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
+libgstapp.la: $(libgstapp_la_OBJECTS) $(libgstapp_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstapp_la_LINK) -rpath $(plugindir) $(libgstapp_la_OBJECTS) $(libgstapp_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapp_la-gstapp.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstapp_la-gstapp.lo: gstapp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_la_CFLAGS) $(CFLAGS) -MT libgstapp_la-gstapp.lo -MD -MP -MF $(DEPDIR)/libgstapp_la-gstapp.Tpo -c -o libgstapp_la-gstapp.lo `test -f 'gstapp.c' || echo '$(srcdir)/'`gstapp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapp_la-gstapp.Tpo $(DEPDIR)/libgstapp_la-gstapp.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstapp.c' object='libgstapp_la-gstapp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapp_la_CFLAGS) $(CFLAGS) -c -o libgstapp_la-gstapp.lo `test -f 'gstapp.c' || echo '$(srcdir)/'`gstapp.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstapp -:SHARED libgstapp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstapp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapp_la_CFLAGS) \
+ -:LDFLAGS $(libgstapp_la_LDFLAGS) \
+ $(libgstapp_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/app/gstapp.c b/gst/app/gstapp.c
new file mode 100644
index 0000000..ca54ae4
--- /dev/null
+++ b/gst/app/gstapp.c
@@ -0,0 +1,68 @@
+/* GStreamer
+ * Copyright (C) 2007 David Schleef <ds@schleef.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.
+ */
+/**
+ * SECTION:element-appsrc
+ *
+ * The appsrc element can be used by applications to insert data into a
+ * GStreamer pipeline. Unlike most GStreamer elements, Appsrc provides
+ * external API functions.
+ *
+ * For the documentation of the API, please see the
+ * <link linkend="gst-plugins-base-libs-appsrc">libgstapp</link> section in the
+ * GStreamer Plugins Base Libraries documentation.
+ *
+ * Since: 0.10.22
+ */
+/**
+ * SECTION:element-appsink
+ *
+ * Appsink is a sink plugin that supports many different methods for making
+ * the application get a handle on the GStreamer data in a pipeline. Unlike
+ * most GStreamer elements, Appsink provides external API functions.
+ *
+ * For the documentation of the API, please see the
+ * <link linkend="gst-plugins-base-libs-appsink">libgstapp</link> section in
+ * the GStreamer Plugins Base Libraries documentation.
+ *
+ * Since: 0.10.22
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_element_register (plugin, "appsrc", GST_RANK_NONE, GST_TYPE_APP_SRC);
+ gst_element_register (plugin, "appsink", GST_RANK_NONE, GST_TYPE_APP_SINK);
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "app",
+ "Elements used to communicate with applications",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/audioconvert/Makefile.am b/gst/audioconvert/Makefile.am
new file mode 100644
index 0000000..b8849b6
--- /dev/null
+++ b/gst/audioconvert/Makefile.am
@@ -0,0 +1,51 @@
+plugin_LTLIBRARIES = libgstaudioconvert.la
+
+ORC_SOURCE=gstaudioconvertorc
+include $(top_srcdir)/common/orc.mak
+
+libgstaudioconvert_la_SOURCES = \
+ gstaudioconvert.c \
+ audioconvert.c \
+ gstchannelmix.c \
+ gstaudioquantize.c \
+ plugin.c
+nodist_libgstaudioconvert_la_SOURCES = $(ORC_NODIST_SOURCES)
+
+libgstaudioconvert_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstaudioconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudioconvert_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+libgstaudioconvert_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstaudioconvert.h \
+ audioconvert.h \
+ gstchannelmix.h \
+ gstaudioquantize.h \
+ gstfastrandom.h \
+ plugin.h
+
+#TESTS = channelmixtest
+#noinst_PROGRAMS = channelmixtest
+
+#channelmixtest_CFLAGS = $(GST_CFLAGS)
+#channelmixtest_LDADD = libgstaudioconvert.la \
+# $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+# $(GST_LIBS)
+
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstaudioconvert -:SHARED libgstaudioconvert \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudioconvert_la_SOURCES) \
+ $(nodist_libgstaudioconvert_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudioconvert_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudioconvert_la_LDFLAGS) \
+ $(libgstaudioconvert_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/audioconvert/Makefile.in b/gst/audioconvert/Makefile.in
new file mode 100644
index 0000000..b6fcd5a
--- /dev/null
+++ b/gst/audioconvert/Makefile.in
@@ -0,0 +1,926 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/audioconvert
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstaudioconvert_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstaudioconvert_la_OBJECTS = \
+ libgstaudioconvert_la-gstaudioconvert.lo \
+ libgstaudioconvert_la-audioconvert.lo \
+ libgstaudioconvert_la-gstchannelmix.lo \
+ libgstaudioconvert_la-gstaudioquantize.lo \
+ libgstaudioconvert_la-plugin.lo
+am__objects_1 = libgstaudioconvert_la-tmp-orc.lo
+nodist_libgstaudioconvert_la_OBJECTS = $(am__objects_1)
+libgstaudioconvert_la_OBJECTS = $(am_libgstaudioconvert_la_OBJECTS) \
+ $(nodist_libgstaudioconvert_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstaudioconvert_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) \
+ $(libgstaudioconvert_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstaudioconvert_la_SOURCES) \
+ $(nodist_libgstaudioconvert_la_SOURCES)
+DIST_SOURCES = $(libgstaudioconvert_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstaudioconvert.la
+ORC_SOURCE = gstaudioconvertorc
+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 $@";
+libgstaudioconvert_la_SOURCES = \
+ gstaudioconvert.c \
+ audioconvert.c \
+ gstchannelmix.c \
+ gstaudioquantize.c \
+ plugin.c
+
+nodist_libgstaudioconvert_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstaudioconvert_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstaudioconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudioconvert_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+
+libgstaudioconvert_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstaudioconvert.h \
+ audioconvert.h \
+ gstchannelmix.h \
+ gstaudioquantize.h \
+ gstfastrandom.h \
+ plugin.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/audioconvert/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/audioconvert/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
+libgstaudioconvert.la: $(libgstaudioconvert_la_OBJECTS) $(libgstaudioconvert_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstaudioconvert_la_LINK) -rpath $(plugindir) $(libgstaudioconvert_la_OBJECTS) $(libgstaudioconvert_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_la-audioconvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_la-gstaudioconvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_la-gstaudioquantize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_la-gstchannelmix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_la-plugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioconvert_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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstaudioconvert_la-gstaudioconvert.lo: gstaudioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-gstaudioconvert.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-gstaudioconvert.Tpo -c -o libgstaudioconvert_la-gstaudioconvert.lo `test -f 'gstaudioconvert.c' || echo '$(srcdir)/'`gstaudioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-gstaudioconvert.Tpo $(DEPDIR)/libgstaudioconvert_la-gstaudioconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioconvert.c' object='libgstaudioconvert_la-gstaudioconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_la-gstaudioconvert.lo `test -f 'gstaudioconvert.c' || echo '$(srcdir)/'`gstaudioconvert.c
+
+libgstaudioconvert_la-audioconvert.lo: audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-audioconvert.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-audioconvert.Tpo -c -o libgstaudioconvert_la-audioconvert.lo `test -f 'audioconvert.c' || echo '$(srcdir)/'`audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-audioconvert.Tpo $(DEPDIR)/libgstaudioconvert_la-audioconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audioconvert.c' object='libgstaudioconvert_la-audioconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_la-audioconvert.lo `test -f 'audioconvert.c' || echo '$(srcdir)/'`audioconvert.c
+
+libgstaudioconvert_la-gstchannelmix.lo: gstchannelmix.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-gstchannelmix.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-gstchannelmix.Tpo -c -o libgstaudioconvert_la-gstchannelmix.lo `test -f 'gstchannelmix.c' || echo '$(srcdir)/'`gstchannelmix.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-gstchannelmix.Tpo $(DEPDIR)/libgstaudioconvert_la-gstchannelmix.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstchannelmix.c' object='libgstaudioconvert_la-gstchannelmix.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_la-gstchannelmix.lo `test -f 'gstchannelmix.c' || echo '$(srcdir)/'`gstchannelmix.c
+
+libgstaudioconvert_la-gstaudioquantize.lo: gstaudioquantize.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-gstaudioquantize.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-gstaudioquantize.Tpo -c -o libgstaudioconvert_la-gstaudioquantize.lo `test -f 'gstaudioquantize.c' || echo '$(srcdir)/'`gstaudioquantize.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-gstaudioquantize.Tpo $(DEPDIR)/libgstaudioconvert_la-gstaudioquantize.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioquantize.c' object='libgstaudioconvert_la-gstaudioquantize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_la-gstaudioquantize.lo `test -f 'gstaudioquantize.c' || echo '$(srcdir)/'`gstaudioquantize.c
+
+libgstaudioconvert_la-plugin.lo: plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-plugin.Tpo -c -o libgstaudioconvert_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-plugin.Tpo $(DEPDIR)/libgstaudioconvert_la-plugin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='plugin.c' object='libgstaudioconvert_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
+
+libgstaudioconvert_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -MT libgstaudioconvert_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstaudioconvert_la-tmp-orc.Tpo -c -o libgstaudioconvert_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioconvert_la-tmp-orc.Tpo $(DEPDIR)/libgstaudioconvert_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstaudioconvert_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioconvert_la_CFLAGS) $(CFLAGS) -c -o libgstaudioconvert_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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
+
+#TESTS = channelmixtest
+#noinst_PROGRAMS = channelmixtest
+
+#channelmixtest_CFLAGS = $(GST_CFLAGS)
+#channelmixtest_LDADD = libgstaudioconvert.la \
+# $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+# $(GST_LIBS)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstaudioconvert -:SHARED libgstaudioconvert \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudioconvert_la_SOURCES) \
+ $(nodist_libgstaudioconvert_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudioconvert_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudioconvert_la_LDFLAGS) \
+ $(libgstaudioconvert_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/audioconvert/audioconvert.c b/gst/audioconvert/audioconvert.c
new file mode 100644
index 0000000..97dee20
--- /dev/null
+++ b/gst/audioconvert/audioconvert.c
@@ -0,0 +1,792 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim at fluendo dot com>
+ *
+ * audioconvert.c: Convert audio to different audio formats automatically
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <math.h>
+#include <string.h>
+
+#include "gstchannelmix.h"
+#include "gstaudioquantize.h"
+#include "audioconvert.h"
+#include "gstaudioconvertorc.h"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define orc_audio_convert_unpack_u16_le orc_audio_convert_unpack_u16
+#define orc_audio_convert_unpack_u16_be orc_audio_convert_unpack_u16_swap
+#define orc_audio_convert_unpack_s16_le orc_audio_convert_unpack_s16
+#define orc_audio_convert_unpack_s16_be orc_audio_convert_unpack_s16_swap
+#define orc_audio_convert_unpack_u32_le orc_audio_convert_unpack_u32
+#define orc_audio_convert_unpack_u32_be orc_audio_convert_unpack_u32_swap
+#define orc_audio_convert_unpack_s32_le orc_audio_convert_unpack_s32
+#define orc_audio_convert_unpack_s32_be orc_audio_convert_unpack_s32_swap
+#define orc_audio_convert_unpack_float_le orc_audio_convert_unpack_float_s32
+#define orc_audio_convert_unpack_float_be orc_audio_convert_unpack_float_s32_swap
+#define orc_audio_convert_unpack_double_le orc_audio_convert_unpack_double_s32
+#define orc_audio_convert_unpack_double_be orc_audio_convert_unpack_double_s32_swap
+#define orc_audio_convert_unpack_float_hq_le orc_audio_convert_unpack_float_double
+#define orc_audio_convert_unpack_float_hq_be orc_audio_convert_unpack_float_double_swap
+#define orc_audio_convert_unpack_double_hq_le orc_audio_convert_unpack_double_double
+#define orc_audio_convert_unpack_double_hq_be orc_audio_convert_unpack_double_double_swap
+#define orc_audio_convert_unpack_u8_float orc_audio_convert_unpack_u8_double
+#define orc_audio_convert_unpack_u16_le_float orc_audio_convert_unpack_u16_double
+#define orc_audio_convert_unpack_u16_be_float orc_audio_convert_unpack_u16_double_swap
+#define orc_audio_convert_unpack_u32_le_float orc_audio_convert_unpack_u32_double
+#define orc_audio_convert_unpack_u32_be_float orc_audio_convert_unpack_u32_double_swap
+#define orc_audio_convert_unpack_s8_float orc_audio_convert_unpack_s8_double
+#define orc_audio_convert_unpack_s16_le_float orc_audio_convert_unpack_s16_double
+#define orc_audio_convert_unpack_s16_be_float orc_audio_convert_unpack_s16_double_swap
+#define orc_audio_convert_unpack_s32_le_float orc_audio_convert_unpack_s32_double
+#define orc_audio_convert_unpack_s32_be_float orc_audio_convert_unpack_s32_double_swap
+#define orc_audio_convert_pack_u8 orc_audio_convert_pack_u8
+#define orc_audio_convert_pack_u16_le orc_audio_convert_pack_u16
+#define orc_audio_convert_pack_u16_be orc_audio_convert_pack_u16_swap
+#define orc_audio_convert_pack_s16_le orc_audio_convert_pack_s16
+#define orc_audio_convert_pack_s16_be orc_audio_convert_pack_s16_swap
+#define orc_audio_convert_pack_u32_le orc_audio_convert_pack_u32
+#define orc_audio_convert_pack_u32_be orc_audio_convert_pack_u32_swap
+#define orc_audio_convert_pack_s32_le orc_audio_convert_pack_s32
+#define orc_audio_convert_pack_s32_be orc_audio_convert_pack_s32_swap
+#define orc_audio_convert_pack_float_le orc_audio_convert_pack_s32_float
+#define orc_audio_convert_pack_float_be orc_audio_convert_pack_s32_float_swap
+#define orc_audio_convert_pack_double_le orc_audio_convert_pack_s32_double
+#define orc_audio_convert_pack_double_be orc_audio_convert_pack_s32_double_swap
+#define orc_audio_convert_pack_float_hq_le orc_audio_convert_pack_double_float
+#define orc_audio_convert_pack_float_hq_be orc_audio_convert_pack_double_float_swap
+#define orc_audio_convert_pack_s8_float orc_audio_convert_pack_double_s8
+#define orc_audio_convert_pack_s16_le_float orc_audio_convert_pack_double_s16
+#define orc_audio_convert_pack_s16_be_float orc_audio_convert_pack_double_s16_swap
+#define orc_audio_convert_pack_s32_le_float orc_audio_convert_pack_double_s32
+#define orc_audio_convert_pack_s32_be_float orc_audio_convert_pack_double_s32_swap
+#define orc_audio_convert_pack_u8_float orc_audio_convert_pack_double_u8
+#define orc_audio_convert_pack_u16_le_float orc_audio_convert_pack_double_u16
+#define orc_audio_convert_pack_u16_be_float orc_audio_convert_pack_double_u16_swap
+#define orc_audio_convert_pack_u32_le_float orc_audio_convert_pack_double_u32
+#define orc_audio_convert_pack_u32_be_float orc_audio_convert_pack_double_u32_swap
+#else
+#define orc_audio_convert_unpack_u16_be orc_audio_convert_unpack_u16
+#define orc_audio_convert_unpack_u16_le orc_audio_convert_unpack_u16_swap
+#define orc_audio_convert_unpack_s16_be orc_audio_convert_unpack_s16
+#define orc_audio_convert_unpack_s16_le orc_audio_convert_unpack_s16_swap
+#define orc_audio_convert_unpack_u32_be orc_audio_convert_unpack_u32
+#define orc_audio_convert_unpack_u32_le orc_audio_convert_unpack_u32_swap
+#define orc_audio_convert_unpack_s32_be orc_audio_convert_unpack_s32
+#define orc_audio_convert_unpack_s32_le orc_audio_convert_unpack_s32_swap
+#define orc_audio_convert_unpack_float_be orc_audio_convert_unpack_float_s32
+#define orc_audio_convert_unpack_float_le orc_audio_convert_unpack_float_s32_swap
+#define orc_audio_convert_unpack_double_be orc_audio_convert_unpack_double_s32
+#define orc_audio_convert_unpack_double_le orc_audio_convert_unpack_double_s32_swap
+#define orc_audio_convert_unpack_float_hq_be orc_audio_convert_unpack_float_double
+#define orc_audio_convert_unpack_float_hq_le orc_audio_convert_unpack_float_double_swap
+#define orc_audio_convert_unpack_double_hq_be orc_audio_convert_unpack_double_double
+#define orc_audio_convert_unpack_double_hq_le orc_audio_convert_unpack_double_double_swap
+#define orc_audio_convert_unpack_u8_float orc_audio_convert_unpack_u8_double
+#define orc_audio_convert_unpack_u16_be_float orc_audio_convert_unpack_u16_double
+#define orc_audio_convert_unpack_u16_le_float orc_audio_convert_unpack_u16_double_swap
+#define orc_audio_convert_unpack_u32_be_float orc_audio_convert_unpack_u32_double
+#define orc_audio_convert_unpack_u32_le_float orc_audio_convert_unpack_u32_double_swap
+#define orc_audio_convert_unpack_s8_float orc_audio_convert_unpack_s8_double
+#define orc_audio_convert_unpack_s16_be_float orc_audio_convert_unpack_s16_double
+#define orc_audio_convert_unpack_s16_le_float orc_audio_convert_unpack_s16_double_swap
+#define orc_audio_convert_unpack_s32_be_float orc_audio_convert_unpack_s32_double
+#define orc_audio_convert_unpack_s32_le_float orc_audio_convert_unpack_s32_double_swap
+#define orc_audio_convert_pack_u8 orc_audio_convert_pack_u8
+#define orc_audio_convert_pack_u16_be orc_audio_convert_pack_u16
+#define orc_audio_convert_pack_u16_le orc_audio_convert_pack_u16_swap
+#define orc_audio_convert_pack_s16_be orc_audio_convert_pack_s16
+#define orc_audio_convert_pack_s16_le orc_audio_convert_pack_s16_swap
+#define orc_audio_convert_pack_u32_be orc_audio_convert_pack_u32
+#define orc_audio_convert_pack_u32_le orc_audio_convert_pack_u32_swap
+#define orc_audio_convert_pack_s32_be orc_audio_convert_pack_s32
+#define orc_audio_convert_pack_s32_le orc_audio_convert_pack_s32_swap
+#define orc_audio_convert_pack_float_be orc_audio_convert_pack_s32_float
+#define orc_audio_convert_pack_float_le orc_audio_convert_pack_s32_float_swap
+#define orc_audio_convert_pack_double_be orc_audio_convert_pack_s32_double
+#define orc_audio_convert_pack_double_le orc_audio_convert_pack_s32_double_swap
+#define orc_audio_convert_pack_float_hq_be orc_audio_convert_pack_double_float
+#define orc_audio_convert_pack_float_hq_le orc_audio_convert_pack_double_float_swap
+#define orc_audio_convert_pack_s8_float orc_audio_convert_pack_double_s8
+#define orc_audio_convert_pack_s16_be_float orc_audio_convert_pack_double_s16
+#define orc_audio_convert_pack_s16_le_float orc_audio_convert_pack_double_s16_swap
+#define orc_audio_convert_pack_s32_be_float orc_audio_convert_pack_double_s32
+#define orc_audio_convert_pack_s32_le_float orc_audio_convert_pack_double_s32_swap
+#define orc_audio_convert_pack_u8_float orc_audio_convert_pack_double_u8
+#define orc_audio_convert_pack_u16_be_float orc_audio_convert_pack_double_u16
+#define orc_audio_convert_pack_u16_le_float orc_audio_convert_pack_double_u16_swap
+#define orc_audio_convert_pack_u32_be_float orc_audio_convert_pack_double_u32
+#define orc_audio_convert_pack_u32_le_float orc_audio_convert_pack_double_u32_swap
+#endif
+
+/* sign bit in the intermediate format */
+#define SIGNED (1U<<31)
+
+/***
+ * unpack code
+ */
+#define MAKE_UNPACK_FUNC_NAME(name) \
+audio_convert_unpack_##name
+#define MAKE_ORC_UNPACK_FUNC_NAME(name) \
+orc_audio_convert_unpack_##name
+
+/* unpack from integer to signed integer 32 */
+#define MAKE_UNPACK_FUNC_II(name, stride, sign, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst, \
+ gint scale, gint count) \
+{ \
+ for (;count; count--) { \
+ *dst++ = (((gint32) READ_FUNC (src)) << scale) ^ (sign); \
+ src+=stride; \
+ } \
+}
+
+/* unpack from integer to signed integer 32 with orc */
+#define MAKE_UNPACK_FUNC_ORC_II(name, stride, sign, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst, \
+ gint scale, gint count) \
+{ \
+ MAKE_ORC_UNPACK_FUNC_NAME (name) (dst, src, scale, count); \
+}
+
+/* unpack from float to signed integer 32 */
+#define MAKE_UNPACK_FUNC_FI(name, type, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count) \
+{ \
+ gdouble temp; \
+ \
+ for (; count; count--) { \
+ /* blow up to 32 bit */ \
+ temp = floor ((READ_FUNC (*src++) * 2147483647.0) + 0.5); \
+ *dst++ = (gint32) CLAMP (temp, G_MININT32, G_MAXINT32); \
+ } \
+}
+
+/* unpack from float to signed integer 32 with orc */
+#define MAKE_UNPACK_FUNC_ORC_FI(name, type, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count) \
+{ \
+ MAKE_ORC_UNPACK_FUNC_NAME (name) ((guint32 *) dst, src, count); \
+}
+
+/* unpack from float to float 64 (double) */
+#define MAKE_UNPACK_FUNC_FF(name, type, FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s, \
+ gint count) \
+{ \
+ for (; count; count--) \
+ *dst++ = (gdouble) FUNC (*src++); \
+}
+
+/* unpack from float to float 64 (double) with orc */
+#define MAKE_UNPACK_FUNC_ORC_FF(name, type, FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s, \
+ gint count) \
+{ \
+ MAKE_ORC_UNPACK_FUNC_NAME (name) ((gdouble *) dst, src, count); \
+}
+
+/* unpack from int to float 64 (double) */
+#define MAKE_UNPACK_FUNC_IF(name, stride, sign, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (guint8 * src, gdouble * dst, gint scale, \
+ gint count) \
+{ \
+ gdouble tmp; \
+ for (; count; count--) { \
+ tmp = (gdouble) ((((gint32) READ_FUNC (src)) << scale) ^ (sign)); \
+ *dst++ = tmp * (1.0 / 2147483647.0); \
+ src += stride; \
+ } \
+}
+
+#define MAKE_UNPACK_FUNC_ORC_IF(name, stride, sign, READ_FUNC) \
+static void \
+MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gdouble *dst, \
+ gint scale, gint count) \
+{ \
+ MAKE_ORC_UNPACK_FUNC_NAME (name) (dst, src, scale, count); \
+}
+
+#define READ8(p) GST_READ_UINT8(p)
+#define READ16_FROM_LE(p) GST_READ_UINT16_LE (p)
+#define READ16_FROM_BE(p) GST_READ_UINT16_BE (p)
+#define READ24_FROM_LE(p) (p[0] | (p[1] << 8) | (p[2] << 16))
+#define READ24_FROM_BE(p) (p[2] | (p[1] << 8) | (p[0] << 16))
+#define READ32_FROM_LE(p) GST_READ_UINT32_LE (p)
+#define READ32_FROM_BE(p) GST_READ_UINT32_BE (p)
+
+
+
+MAKE_UNPACK_FUNC_ORC_II (u8, 1, SIGNED, READ8);
+MAKE_UNPACK_FUNC_ORC_II (s8, 1, 0, READ8);
+MAKE_UNPACK_FUNC_ORC_II (u16_le, 2, SIGNED, READ16_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_II (s16_le, 2, 0, READ16_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_II (u16_be, 2, SIGNED, READ16_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_II (s16_be, 2, 0, READ16_FROM_BE);
+MAKE_UNPACK_FUNC_II (u24_le, 3, SIGNED, READ24_FROM_LE);
+MAKE_UNPACK_FUNC_II (s24_le, 3, 0, READ24_FROM_LE);
+MAKE_UNPACK_FUNC_II (u24_be, 3, SIGNED, READ24_FROM_BE);
+MAKE_UNPACK_FUNC_II (s24_be, 3, 0, READ24_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_II (u32_le, 4, SIGNED, READ32_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_II (s32_le, 4, 0, READ32_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_II (u32_be, 4, SIGNED, READ32_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_II (s32_be, 4, 0, READ32_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_FI (float_le, gfloat, GFLOAT_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_FI (float_be, gfloat, GFLOAT_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_FI (double_le, gdouble, GDOUBLE_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_FI (double_be, gdouble, GDOUBLE_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_FF (float_hq_le, gfloat, GFLOAT_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_FF (float_hq_be, gfloat, GFLOAT_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_FF (double_hq_le, gdouble, GDOUBLE_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_FF (double_hq_be, gdouble, GDOUBLE_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_IF (u8_float, 1, SIGNED, READ8);
+MAKE_UNPACK_FUNC_ORC_IF (s8_float, 1, 0, READ8);
+MAKE_UNPACK_FUNC_ORC_IF (u16_le_float, 2, SIGNED, READ16_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_IF (s16_le_float, 2, 0, READ16_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_IF (u16_be_float, 2, SIGNED, READ16_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_IF (s16_be_float, 2, 0, READ16_FROM_BE);
+MAKE_UNPACK_FUNC_IF (u24_le_float, 3, SIGNED, READ24_FROM_LE);
+MAKE_UNPACK_FUNC_IF (s24_le_float, 3, 0, READ24_FROM_LE);
+MAKE_UNPACK_FUNC_IF (u24_be_float, 3, SIGNED, READ24_FROM_BE);
+MAKE_UNPACK_FUNC_IF (s24_be_float, 3, 0, READ24_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_IF (u32_le_float, 4, SIGNED, READ32_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_IF (s32_le_float, 4, 0, READ32_FROM_LE);
+MAKE_UNPACK_FUNC_ORC_IF (u32_be_float, 4, SIGNED, READ32_FROM_BE);
+MAKE_UNPACK_FUNC_ORC_IF (s32_be_float, 4, 0, READ32_FROM_BE);
+
+/* One of the double_hq_* functions generated above is ineffecient, but it's
+ * never used anyway. The same is true for one of the s32_* functions. */
+
+/***
+ * packing code
+ */
+#define MAKE_PACK_FUNC_NAME(name) \
+audio_convert_pack_##name
+#define MAKE_PACK_FUNC_NAME_ORC(name) \
+orc_audio_convert_pack_##name
+
+/*
+ * These functions convert the signed 32 bit integers to the
+ * target format. For this to work the following steps are done:
+ *
+ * 1) If the output format is unsigned we will XOR the sign bit. This
+ * will do the same as if we add 1<<31.
+ * 2) Afterwards we shift to the target depth. It's necessary to left-shift
+ * on signed values here to get arithmetical shifting.
+ * 3) This is then written into our target array by the corresponding write
+ * function for the target width.
+ */
+
+/* pack from signed integer 32 to integer using Orc */
+#define MAKE_PACK_FUNC_ORC_II(name, stride, sign, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst, \
+ gint scale, gint count) \
+{ \
+ MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, scale, count); \
+}
+
+/* pack from signed integer 32 to integer */
+#define MAKE_PACK_FUNC_II(name, stride, sign, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst, \
+ gint scale, gint count) \
+{ \
+ gint32 tmp; \
+ for (;count; count--) { \
+ tmp = (*src++ ^ (sign)) >> scale; \
+ WRITE_FUNC (dst, tmp); \
+ dst += stride; \
+ } \
+}
+
+/* pack from signed integer 32 to float using orc */
+#define MAKE_PACK_FUNC_ORC_IF(name, type, FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale, \
+ gint count) \
+{ \
+ MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, count); \
+}
+
+/* pack from signed integer 32 to float */
+#define MAKE_PACK_FUNC_IF(name, type, FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale, \
+ gint count) \
+{ \
+ for (; count; count--) \
+ *dst++ = FUNC ((type) ((*src++) * (1.0 / 2147483647.0))); \
+}
+
+/* pack from float 64 (double) to float */
+#define MAKE_PACK_FUNC_FF(name, type, FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s, \
+ gint count) \
+{ \
+ for (; count; count--) \
+ *dst++ = FUNC ((type) (*src++)); \
+}
+
+/* pack from float 64 (double) to float with orc */
+#define MAKE_PACK_FUNC_ORC_FF(name, type, FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s, \
+ gint count) \
+{ \
+ MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, count); \
+}
+
+/* pack from float 64 (double) to signed int.
+ * the floats are already in the correct range. Only a cast is needed.
+ */
+#define MAKE_PACK_FUNC_FI_S(name, stride, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale, \
+ gint count) \
+{ \
+ gint32 tmp; \
+ for (; count; count--) { \
+ tmp = (gint32) (*src); \
+ WRITE_FUNC (dst, tmp); \
+ src++; \
+ dst += stride; \
+ } \
+}
+
+/* pack from float 64 (double) to unsigned int.
+ * the floats are already in the correct range. Only a cast is needed
+ * and an addition of 2^(target_depth-1) to get in the correct unsigned
+ * range. */
+#define MAKE_PACK_FUNC_FI_U(name, stride, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale, \
+ gint count) \
+{ \
+ guint32 tmp; \
+ gdouble limit = (1U<<(32-scale-1)); \
+ for (; count; count--) { \
+ tmp = (guint32) (*src + limit); \
+ WRITE_FUNC (dst, tmp); \
+ src++; \
+ dst += stride; \
+ } \
+}
+
+/* pack from float 64 (double) to signed int with orc.
+ * the floats are already in the correct range. Only a cast is needed.
+ */
+#define MAKE_PACK_FUNC_ORC_FI_S(name, stride, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale, \
+ gint count) \
+{ \
+ MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, scale, count); \
+}
+
+/* pack from float 64 (double) to unsigned int with orc.
+ * the floats are already in the correct range. Only a cast is needed.
+ */
+#define MAKE_PACK_FUNC_ORC_FI_U(name, stride, WRITE_FUNC) \
+static void \
+MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale, \
+ gint count) \
+{ \
+ MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, scale, count); \
+}
+
+#define WRITE8(p, v) GST_WRITE_UINT8 (p, v)
+#define WRITE16_TO_LE(p,v) GST_WRITE_UINT16_LE (p, (guint16)(v))
+#define WRITE16_TO_BE(p,v) GST_WRITE_UINT16_BE (p, (guint16)(v))
+#define WRITE24_TO_LE(p,v) p[0] = v & 0xff; p[1] = (v >> 8) & 0xff; p[2] = (v >> 16) & 0xff
+#define WRITE24_TO_BE(p,v) p[2] = v & 0xff; p[1] = (v >> 8) & 0xff; p[0] = (v >> 16) & 0xff
+#define WRITE32_TO_LE(p,v) GST_WRITE_UINT32_LE (p, (guint32)(v))
+#define WRITE32_TO_BE(p,v) GST_WRITE_UINT32_BE (p, (guint32)(v))
+
+MAKE_PACK_FUNC_ORC_II (u8, 1, SIGNED, WRITE8);
+MAKE_PACK_FUNC_ORC_II (s8, 1, 0, WRITE8);
+MAKE_PACK_FUNC_ORC_II (u16_le, 2, SIGNED, WRITE16_TO_LE);
+MAKE_PACK_FUNC_ORC_II (s16_le, 2, 0, WRITE16_TO_LE);
+MAKE_PACK_FUNC_ORC_II (u16_be, 2, SIGNED, WRITE16_TO_BE);
+MAKE_PACK_FUNC_ORC_II (s16_be, 2, 0, WRITE16_TO_BE);
+MAKE_PACK_FUNC_II (u24_le, 3, SIGNED, WRITE24_TO_LE);
+MAKE_PACK_FUNC_II (s24_le, 3, 0, WRITE24_TO_LE);
+MAKE_PACK_FUNC_II (u24_be, 3, SIGNED, WRITE24_TO_BE);
+MAKE_PACK_FUNC_II (s24_be, 3, 0, WRITE24_TO_BE);
+MAKE_PACK_FUNC_ORC_II (u32_le, 4, SIGNED, WRITE32_TO_LE);
+MAKE_PACK_FUNC_ORC_II (s32_le, 4, 0, WRITE32_TO_LE);
+MAKE_PACK_FUNC_ORC_II (u32_be, 4, SIGNED, WRITE32_TO_BE);
+MAKE_PACK_FUNC_ORC_II (s32_be, 4, 0, WRITE32_TO_BE);
+MAKE_PACK_FUNC_ORC_IF (float_le, gfloat, GFLOAT_TO_LE);
+MAKE_PACK_FUNC_ORC_IF (float_be, gfloat, GFLOAT_TO_BE);
+MAKE_PACK_FUNC_ORC_IF (double_le, gdouble, GDOUBLE_TO_LE);
+MAKE_PACK_FUNC_ORC_IF (double_be, gdouble, GDOUBLE_TO_BE);
+MAKE_PACK_FUNC_ORC_FF (float_hq_le, gfloat, GFLOAT_TO_LE);
+MAKE_PACK_FUNC_ORC_FF (float_hq_be, gfloat, GFLOAT_TO_BE);
+MAKE_PACK_FUNC_ORC_FI_U (u8_float, 1, WRITE8);
+MAKE_PACK_FUNC_ORC_FI_S (s8_float, 1, WRITE8);
+MAKE_PACK_FUNC_ORC_FI_U (u16_le_float, 2, WRITE16_TO_LE);
+MAKE_PACK_FUNC_ORC_FI_S (s16_le_float, 2, WRITE16_TO_LE);
+MAKE_PACK_FUNC_ORC_FI_U (u16_be_float, 2, WRITE16_TO_BE);
+MAKE_PACK_FUNC_ORC_FI_S (s16_be_float, 2, WRITE16_TO_BE);
+MAKE_PACK_FUNC_FI_U (u24_le_float, 3, WRITE24_TO_LE);
+MAKE_PACK_FUNC_FI_S (s24_le_float, 3, WRITE24_TO_LE);
+MAKE_PACK_FUNC_FI_U (u24_be_float, 3, WRITE24_TO_BE);
+MAKE_PACK_FUNC_FI_S (s24_be_float, 3, WRITE24_TO_BE);
+MAKE_PACK_FUNC_ORC_FI_U (u32_le_float, 4, WRITE32_TO_LE);
+MAKE_PACK_FUNC_ORC_FI_S (s32_le_float, 4, WRITE32_TO_LE);
+MAKE_PACK_FUNC_ORC_FI_U (u32_be_float, 4, WRITE32_TO_BE);
+MAKE_PACK_FUNC_ORC_FI_S (s32_be_float, 4, WRITE32_TO_BE);
+
+/* For double_hq, packing and unpacking is the same, so we reuse the unpacking
+ * functions here. */
+#define audio_convert_pack_double_hq_le MAKE_UNPACK_FUNC_NAME (double_hq_le)
+#define audio_convert_pack_double_hq_be MAKE_UNPACK_FUNC_NAME (double_hq_be)
+
+static AudioConvertUnpack unpack_funcs[] = {
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u8),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s8),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u8),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s8),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u16_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s16_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u16_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s16_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u24_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s24_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u24_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s24_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u32_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s32_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u32_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s32_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (float_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (float_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (double_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (double_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (float_hq_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (float_hq_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (double_hq_le),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (double_hq_be),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u8_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s8_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u8_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s8_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u16_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s16_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u16_be_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s16_be_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u24_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s24_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u24_be_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s24_be_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u32_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s32_le_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (u32_be_float),
+ (AudioConvertUnpack) MAKE_UNPACK_FUNC_NAME (s32_be_float),
+};
+
+static AudioConvertPack pack_funcs[] = {
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u8),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s8),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u8),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s8),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u16_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s16_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u16_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s16_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u24_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s24_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u24_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s24_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u32_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s32_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u32_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s32_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (float_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (float_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (double_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (double_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (float_hq_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (float_hq_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (double_hq_le),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (double_hq_be),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u8_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s8_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u8_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s8_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u16_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s16_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u16_be_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s16_be_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u24_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s24_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u24_be_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s24_be_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u32_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s32_le_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (u32_be_float),
+ (AudioConvertPack) MAKE_PACK_FUNC_NAME (s32_be_float),
+};
+
+#define DOUBLE_INTERMEDIATE_FORMAT(ctx) \
+ ((!GST_AUDIO_FORMAT_INFO_IS_INTEGER (ctx->in.finfo) && \
+ !GST_AUDIO_FORMAT_INFO_IS_INTEGER (ctx->out.finfo)) || \
+ (ctx->ns != NOISE_SHAPING_NONE))
+
+static gint
+audio_convert_get_func_index (AudioConvertCtx * ctx,
+ const GstAudioFormatInfo * fmt)
+{
+ gint index = 0;
+
+ if (GST_AUDIO_FORMAT_INFO_IS_INTEGER (fmt)) {
+ index += (GST_AUDIO_FORMAT_INFO_WIDTH (fmt) / 8 - 1) * 4;
+ index += GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN (fmt) ? 0 : 2;
+ index += GST_AUDIO_FORMAT_INFO_IS_SIGNED (fmt) ? 1 : 0;
+ index += (ctx->ns == NOISE_SHAPING_NONE) ? 0 : 24;
+ } else {
+ /* this is float/double */
+ index = 16;
+ index += (GST_AUDIO_FORMAT_INFO_WIDTH (fmt) == 32) ? 0 : 2;
+ index += GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN (fmt) ? 0 : 1;
+ index += (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? 4 : 0;
+ }
+
+ return index;
+}
+
+static inline gboolean
+check_default (AudioConvertCtx * ctx, const GstAudioFormatInfo * fmt)
+{
+ if (!DOUBLE_INTERMEDIATE_FORMAT (ctx)) {
+ return GST_AUDIO_FORMAT_INFO_FORMAT (fmt) == GST_AUDIO_FORMAT_S32;
+ } else {
+ return GST_AUDIO_FORMAT_INFO_FORMAT (fmt) == GST_AUDIO_FORMAT_F64;
+ }
+}
+
+gboolean
+audio_convert_prepare_context (AudioConvertCtx * ctx, GstAudioInfo * in,
+ GstAudioInfo * out, GstAudioConvertDithering dither,
+ GstAudioConvertNoiseShaping ns)
+{
+ gint idx_in, idx_out;
+ gint in_depth, out_depth;
+
+ g_return_val_if_fail (ctx != NULL, FALSE);
+ g_return_val_if_fail (in != NULL, FALSE);
+ g_return_val_if_fail (out != NULL, FALSE);
+
+ /* first clean the existing context */
+ audio_convert_clean_context (ctx);
+
+ ctx->in = *in;
+ ctx->out = *out;
+
+ in_depth = GST_AUDIO_FORMAT_INFO_DEPTH (in->finfo);
+ out_depth = GST_AUDIO_FORMAT_INFO_DEPTH (out->finfo);
+
+ /* Don't dither or apply noise shaping if target depth is bigger than 20 bits
+ * as DA converters only can do a SNR up to 20 bits in reality.
+ * Also don't dither or apply noise shaping if target depth is larger than
+ * source depth. */
+ if (out_depth <= 20 && (!GST_AUDIO_FORMAT_INFO_IS_INTEGER (in->finfo)
+ || in_depth >= out_depth)) {
+ ctx->dither = dither;
+ ctx->ns = ns;
+ } else {
+ ctx->dither = DITHER_NONE;
+ ctx->ns = NOISE_SHAPING_NONE;
+ }
+
+ /* Use simple error feedback when output sample rate is smaller than
+ * 32000 as the other methods might move the noise to audible ranges */
+ if (ctx->ns > NOISE_SHAPING_ERROR_FEEDBACK && out->rate < 32000)
+ ctx->ns = NOISE_SHAPING_ERROR_FEEDBACK;
+
+ gst_channel_mix_setup_matrix (ctx);
+
+ idx_in = audio_convert_get_func_index (ctx, in->finfo);
+ ctx->unpack = unpack_funcs[idx_in];
+
+ idx_out = audio_convert_get_func_index (ctx, out->finfo);
+ ctx->pack = pack_funcs[idx_out];
+
+ /* if both formats are float/double or we use noise shaping use double as
+ * intermediate format and and switch mixing */
+ if (!DOUBLE_INTERMEDIATE_FORMAT (ctx)) {
+ GST_INFO ("use int mixing");
+ ctx->channel_mix = (AudioConvertMix) gst_channel_mix_mix_int;
+ } else {
+ GST_INFO ("use float mixing");
+ ctx->channel_mix = (AudioConvertMix) gst_channel_mix_mix_float;
+ }
+ GST_INFO ("unitsizes: %d -> %d", in->bpf, out->bpf);
+
+ /* check if input is in default format */
+ ctx->in_default = check_default (ctx, in->finfo);
+ /* check if channel mixer is passthrough */
+ ctx->mix_passthrough = gst_channel_mix_passthrough (ctx);
+ /* check if output is in default format */
+ ctx->out_default = check_default (ctx, out->finfo);
+
+ GST_INFO ("in default %d, mix passthrough %d, out default %d",
+ ctx->in_default, ctx->mix_passthrough, ctx->out_default);
+
+ ctx->in_scale =
+ GST_AUDIO_FORMAT_INFO_IS_INTEGER (in->finfo) ? (32 - in_depth) : 0;
+ ctx->out_scale =
+ GST_AUDIO_FORMAT_INFO_IS_INTEGER (out->finfo) ? (32 - out_depth) : 0;
+
+ gst_audio_quantize_setup (ctx);
+
+ return TRUE;
+}
+
+gboolean
+audio_convert_clean_context (AudioConvertCtx * ctx)
+{
+ g_return_val_if_fail (ctx != NULL, FALSE);
+
+ gst_audio_quantize_free (ctx);
+ gst_audio_info_init (&ctx->in);
+ gst_audio_info_init (&ctx->out);
+ gst_channel_mix_unset_matrix (ctx);
+
+ g_free (ctx->tmpbuf);
+ ctx->tmpbuf = NULL;
+ ctx->tmpbufsize = 0;
+
+ return TRUE;
+}
+
+gboolean
+audio_convert_get_sizes (AudioConvertCtx * ctx, gint samples, gint * srcsize,
+ gint * dstsize)
+{
+ g_return_val_if_fail (ctx != NULL, FALSE);
+
+ if (srcsize)
+ *srcsize = samples * ctx->in.bpf;
+ if (dstsize)
+ *dstsize = samples * ctx->out.bpf;
+
+ return TRUE;
+}
+
+gboolean
+audio_convert_convert (AudioConvertCtx * ctx, gpointer src,
+ gpointer dst, gint samples, gboolean src_writable)
+{
+ guint insize, outsize, size;
+ gpointer outbuf, tmpbuf;
+ guint intemp = 0, outtemp = 0, biggest;
+ gint in_width, out_width;
+
+ g_return_val_if_fail (ctx != NULL, FALSE);
+ g_return_val_if_fail (src != NULL, FALSE);
+ g_return_val_if_fail (dst != NULL, FALSE);
+ g_return_val_if_fail (samples >= 0, FALSE);
+
+ if (samples == 0)
+ return TRUE;
+
+ insize = ctx->in.bpf * samples;
+ outsize = ctx->out.bpf * samples;
+
+ in_width = GST_AUDIO_FORMAT_INFO_WIDTH (ctx->in.finfo);
+ out_width = GST_AUDIO_FORMAT_INFO_WIDTH (ctx->out.finfo);
+
+ /* find biggest temp buffer size */
+ size = (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? sizeof (gdouble)
+ : sizeof (gint32);
+
+ if (!ctx->in_default)
+ intemp = gst_util_uint64_scale (insize, size * 8, in_width);
+ if (!ctx->mix_passthrough || !ctx->out_default)
+ outtemp = gst_util_uint64_scale (outsize, size * 8, out_width);
+ biggest = MAX (intemp, outtemp);
+
+ /* see if one of the buffers can be used as temp */
+ if ((outsize >= biggest) && (ctx->out.bpf <= size))
+ tmpbuf = dst;
+ else if ((insize >= biggest) && src_writable && (ctx->in.bpf >= size))
+ tmpbuf = src;
+ else {
+ if (biggest > ctx->tmpbufsize) {
+ ctx->tmpbuf = g_realloc (ctx->tmpbuf, biggest);
+ ctx->tmpbufsize = biggest;
+ }
+ tmpbuf = ctx->tmpbuf;
+ }
+
+ /* start conversion */
+ if (!ctx->in_default) {
+ /* check if final conversion */
+ if (!(ctx->out_default && ctx->mix_passthrough))
+ outbuf = tmpbuf;
+ else
+ outbuf = dst;
+
+ /* unpack to default format */
+ ctx->unpack (src, outbuf, ctx->in_scale, samples * ctx->in.channels);
+
+ src = outbuf;
+ }
+
+ if (!ctx->mix_passthrough) {
+ /* check if final conversion */
+ if (!ctx->out_default)
+ outbuf = tmpbuf;
+ else
+ outbuf = dst;
+
+ /* convert channels */
+ ctx->channel_mix (ctx, src, outbuf, samples);
+
+ src = outbuf;
+ }
+
+ /* we only need to quantize if output format is int */
+ if (GST_AUDIO_FORMAT_INFO_IS_INTEGER (ctx->out.finfo)) {
+ if (ctx->out_default)
+ outbuf = dst;
+ else
+ outbuf = tmpbuf;
+ ctx->quantize (ctx, src, outbuf, samples);
+ }
+
+ if (!ctx->out_default) {
+ /* pack default format into dst */
+ ctx->pack (src, dst, ctx->out_scale, samples * ctx->out.channels);
+ }
+
+ return TRUE;
+}
diff --git a/gst/audioconvert/audioconvert.h b/gst/audioconvert/audioconvert.h
new file mode 100644
index 0000000..638a42a
--- /dev/null
+++ b/gst/audioconvert/audioconvert.h
@@ -0,0 +1,146 @@
+/* GStreamer
+ * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * audioconvert.h: audio format conversion library
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __AUDIO_CONVERT_H__
+#define __AUDIO_CONVERT_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+GST_DEBUG_CATEGORY_EXTERN (audio_convert_debug);
+#define GST_CAT_DEFAULT (audio_convert_debug)
+
+/**
+ * GstAudioConvertDithering:
+ * @DITHER_NONE: No dithering
+ * @DITHER_RPDF: Rectangular dithering
+ * @DITHER_TPDF: Triangular dithering (default)
+ * @DITHER_TPDF_HF: High frequency triangular dithering
+ *
+ * Set of available dithering methods when converting audio.
+ */
+typedef enum
+{
+ DITHER_NONE = 0,
+ DITHER_RPDF,
+ DITHER_TPDF,
+ DITHER_TPDF_HF
+} GstAudioConvertDithering;
+
+/**
+ * GstAudioConvertNoiseShaping:
+ * @NOISE_SHAPING_NONE: No noise shaping (default)
+ * @NOISE_SHAPING_ERROR_FEEDBACK: Error feedback
+ * @NOISE_SHAPING_SIMPLE: Simple 2-pole noise shaping
+ * @NOISE_SHAPING_MEDIUM: Medium 5-pole noise shaping
+ * @NOISE_SHAPING_HIGH: High 8-pole noise shaping
+ *
+ * Set of available noise shaping methods
+ */
+typedef enum
+{
+ NOISE_SHAPING_NONE = 0,
+ NOISE_SHAPING_ERROR_FEEDBACK,
+ NOISE_SHAPING_SIMPLE,
+ NOISE_SHAPING_MEDIUM,
+ NOISE_SHAPING_HIGH
+} GstAudioConvertNoiseShaping;
+
+typedef struct _AudioConvertCtx AudioConvertCtx;
+#if 0
+typedef struct _AudioConvertFmt AudioConvertFmt;
+
+struct _AudioConvertFmt
+{
+ /* general caps */
+ gboolean is_int;
+ gint endianness;
+ gint width;
+ gint rate;
+ gint channels;
+ GstAudioChannelPosition *pos;
+ gboolean unpositioned_layout;
+
+ /* int audio caps */
+ gboolean sign;
+ gint depth;
+
+ gint unit_size;
+};
+#endif
+
+typedef void (*AudioConvertUnpack) (gpointer src, gpointer dst, gint scale,
+ gint count);
+typedef void (*AudioConvertPack) (gpointer src, gpointer dst, gint scale,
+ gint count);
+
+typedef void (*AudioConvertMix) (AudioConvertCtx *, gpointer, gpointer, gint);
+typedef void (*AudioConvertQuantize) (AudioConvertCtx * ctx, gpointer src,
+ gpointer dst, gint count);
+
+struct _AudioConvertCtx
+{
+ GstAudioInfo in;
+ GstAudioInfo out;
+
+ AudioConvertUnpack unpack;
+ AudioConvertPack pack;
+
+ /* channel conversion matrix, m[in_channels][out_channels].
+ * If identity matrix, passthrough applies. */
+ gfloat **matrix;
+ /* temp storage for channelmix */
+ gpointer tmp;
+
+ gboolean in_default;
+ gboolean mix_passthrough;
+ gboolean out_default;
+
+ gpointer tmpbuf;
+ gint tmpbufsize;
+
+ gint in_scale;
+ gint out_scale;
+
+ AudioConvertMix channel_mix;
+
+ AudioConvertQuantize quantize;
+
+ GstAudioConvertDithering dither;
+ GstAudioConvertNoiseShaping ns;
+ /* last random number generated per channel for hifreq TPDF dither */
+ gpointer last_random;
+ /* contains the past quantization errors, error[out_channels][count] */
+ gdouble *error_buf;
+};
+
+gboolean audio_convert_prepare_context (AudioConvertCtx * ctx,
+ GstAudioInfo * in, GstAudioInfo * out,
+ GstAudioConvertDithering dither, GstAudioConvertNoiseShaping ns);
+gboolean audio_convert_get_sizes (AudioConvertCtx * ctx, gint samples,
+ gint * srcsize, gint * dstsize);
+
+gboolean audio_convert_clean_context (AudioConvertCtx * ctx);
+
+gboolean audio_convert_convert (AudioConvertCtx * ctx, gpointer src,
+ gpointer dst, gint samples, gboolean src_writable);
+
+#endif /* __AUDIO_CONVERT_H__ */
diff --git a/gst/audioconvert/gstaudioconvert.c b/gst/audioconvert/gstaudioconvert.c
new file mode 100644
index 0000000..6cf8775
--- /dev/null
+++ b/gst/audioconvert/gstaudioconvert.c
@@ -0,0 +1,711 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2011 Wim Taymans <wim.taymans at gmail dot com>
+ *
+ * gstaudioconvert.c: Convert audio to different audio formats automatically
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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-audioconvert
+ *
+ * Audioconvert converts raw audio buffers between various possible formats.
+ * It supports integer to float conversion, width/depth conversion,
+ * signedness and endianness conversion and channel transformations.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v -m audiotestsrc ! audioconvert ! audio/x-raw,format=S8,channels=2 ! level ! fakesink silent=TRUE
+ * ]| This pipeline converts audio to 8-bit. The level element shows that
+ * the output levels still match the one for a sine wave.
+ * |[
+ * gst-launch -v -m audiotestsrc ! audioconvert ! vorbisenc ! fakesink silent=TRUE
+ * ]| The vorbis encoder takes float audio data instead of the integer data
+ * generated by audiotestsrc.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-02 (0.10.4)
+ */
+
+/*
+ * design decisions:
+ * - audioconvert converts buffers in a set of supported caps. If it supports
+ * a caps, it supports conversion from these caps to any other caps it
+ * supports. (example: if it does A=>B and A=>C, it also does B=>C)
+ * - audioconvert does not save state between buffers. Every incoming buffer is
+ * converted and the converted buffer is pushed out.
+ * conclusion:
+ * audioconvert is not supposed to be a one-element-does-anything solution for
+ * audio conversions.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gstaudioconvert.h"
+#include "gstchannelmix.h"
+#include "gstaudioquantize.h"
+#include "plugin.h"
+
+GST_DEBUG_CATEGORY (audio_convert_debug);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+
+/*** DEFINITIONS **************************************************************/
+
+/* type functions */
+static void gst_audio_convert_dispose (GObject * obj);
+
+/* gstreamer functions */
+static gboolean gst_audio_convert_get_unit_size (GstBaseTransform * base,
+ GstCaps * caps, gsize * size);
+static GstCaps *gst_audio_convert_transform_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter);
+static void gst_audio_convert_fixate_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
+static gboolean gst_audio_convert_set_caps (GstBaseTransform * base,
+ GstCaps * incaps, GstCaps * outcaps);
+static GstFlowReturn gst_audio_convert_transform (GstBaseTransform * base,
+ GstBuffer * inbuf, GstBuffer * outbuf);
+static GstFlowReturn gst_audio_convert_transform_ip (GstBaseTransform * base,
+ GstBuffer * buf);
+static void gst_audio_convert_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_audio_convert_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+/* AudioConvert signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_DITHERING,
+ ARG_NOISE_SHAPING,
+};
+
+#define DEBUG_INIT \
+ GST_DEBUG_CATEGORY_INIT (audio_convert_debug, "audioconvert", 0, "audio conversion element"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+#define gst_audio_convert_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAudioConvert, gst_audio_convert,
+ GST_TYPE_BASE_TRANSFORM, DEBUG_INIT);
+
+/*** GSTREAMER PROTOTYPES *****************************************************/
+
+#define STATIC_CAPS \
+GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))
+
+static GstStaticPadTemplate gst_audio_convert_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ STATIC_CAPS);
+
+static GstStaticPadTemplate gst_audio_convert_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ STATIC_CAPS);
+
+#define GST_TYPE_AUDIO_CONVERT_DITHERING (gst_audio_convert_dithering_get_type ())
+static GType
+gst_audio_convert_dithering_get_type (void)
+{
+ static GType gtype = 0;
+
+ if (gtype == 0) {
+ static const GEnumValue values[] = {
+ {DITHER_NONE, "No dithering",
+ "none"},
+ {DITHER_RPDF, "Rectangular dithering", "rpdf"},
+ {DITHER_TPDF, "Triangular dithering (default)", "tpdf"},
+ {DITHER_TPDF_HF, "High frequency triangular dithering", "tpdf-hf"},
+ {0, NULL, NULL}
+ };
+
+ gtype = g_enum_register_static ("GstAudioConvertDithering", values);
+ }
+ return gtype;
+}
+
+#define GST_TYPE_AUDIO_CONVERT_NOISE_SHAPING (gst_audio_convert_ns_get_type ())
+static GType
+gst_audio_convert_ns_get_type (void)
+{
+ static GType gtype = 0;
+
+ if (gtype == 0) {
+ static const GEnumValue values[] = {
+ {NOISE_SHAPING_NONE, "No noise shaping (default)",
+ "none"},
+ {NOISE_SHAPING_ERROR_FEEDBACK, "Error feedback", "error-feedback"},
+ {NOISE_SHAPING_SIMPLE, "Simple 2-pole noise shaping", "simple"},
+ {NOISE_SHAPING_MEDIUM, "Medium 5-pole noise shaping", "medium"},
+ {NOISE_SHAPING_HIGH, "High 8-pole noise shaping", "high"},
+ {0, NULL, NULL}
+ };
+
+ gtype = g_enum_register_static ("GstAudioConvertNoiseShaping", values);
+ }
+ return gtype;
+}
+
+
+/*** TYPE FUNCTIONS ***********************************************************/
+static void
+gst_audio_convert_class_init (GstAudioConvertClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseTransformClass *basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
+
+ gobject_class->dispose = gst_audio_convert_dispose;
+ gobject_class->set_property = gst_audio_convert_set_property;
+ gobject_class->get_property = gst_audio_convert_get_property;
+
+ g_object_class_install_property (gobject_class, ARG_DITHERING,
+ g_param_spec_enum ("dithering", "Dithering",
+ "Selects between different dithering methods.",
+ GST_TYPE_AUDIO_CONVERT_DITHERING, DITHER_TPDF,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, ARG_NOISE_SHAPING,
+ g_param_spec_enum ("noise-shaping", "Noise shaping",
+ "Selects between different noise shaping methods.",
+ GST_TYPE_AUDIO_CONVERT_NOISE_SHAPING, NOISE_SHAPING_NONE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_audio_convert_src_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_audio_convert_sink_template));
+ gst_element_class_set_details_simple (element_class,
+ "Audio converter", "Filter/Converter/Audio",
+ "Convert audio to different formats", "Benjamin Otte <otte@gnome.org>");
+
+ basetransform_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_get_unit_size);
+ basetransform_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_transform_caps);
+ basetransform_class->fixate_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_fixate_caps);
+ basetransform_class->set_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_set_caps);
+ basetransform_class->transform_ip =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_transform_ip);
+ basetransform_class->transform =
+ GST_DEBUG_FUNCPTR (gst_audio_convert_transform);
+
+ basetransform_class->passthrough_on_same_caps = TRUE;
+}
+
+static void
+gst_audio_convert_init (GstAudioConvert * this)
+{
+ this->dither = DITHER_TPDF;
+ this->ns = NOISE_SHAPING_NONE;
+ memset (&this->ctx, 0, sizeof (AudioConvertCtx));
+
+ gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (this), TRUE);
+}
+
+static void
+gst_audio_convert_dispose (GObject * obj)
+{
+ GstAudioConvert *this = GST_AUDIO_CONVERT (obj);
+
+ audio_convert_clean_context (&this->ctx);
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+/*** GSTREAMER FUNCTIONS ******************************************************/
+
+/* BaseTransform vmethods */
+static gboolean
+gst_audio_convert_get_unit_size (GstBaseTransform * base, GstCaps * caps,
+ gsize * size)
+{
+ GstAudioInfo info;
+
+ g_assert (size);
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto parse_error;
+
+ *size = info.bpf;
+ GST_INFO_OBJECT (base, "unit_size = %" G_GSIZE_FORMAT, *size);
+
+ return TRUE;
+
+parse_error:
+ {
+ GST_INFO_OBJECT (base, "failed to parse caps to get unit_size");
+ return FALSE;
+ }
+}
+
+/* copies the given caps */
+static GstCaps *
+gst_audio_convert_caps_remove_format_info (GstCaps * caps)
+{
+ GstStructure *st;
+ gint i, n;
+ GstCaps *res;
+
+ res = gst_caps_new_empty ();
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ st = gst_caps_get_structure (caps, i);
+
+ /* If this is already expressed by the existing caps
+ * skip this structure */
+ if (i > 0 && gst_caps_is_subset_structure (res, st))
+ continue;
+
+ st = gst_structure_copy (st);
+ gst_structure_remove_fields (st, "format", "channel-positions", NULL);
+
+ gst_caps_append_structure (res, st);
+ }
+
+ return res;
+}
+
+/* The caps can be transformed into any other caps with format info removed.
+ * However, we should prefer passthrough, so if passthrough is possible,
+ * put it first in the list. */
+static GstCaps *
+gst_audio_convert_transform_caps (GstBaseTransform * btrans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *tmp, *tmp2;
+ GstCaps *result;
+
+ result = gst_caps_copy (caps);
+
+ /* Get all possible caps that we can transform to */
+ tmp = gst_audio_convert_caps_remove_format_info (caps);
+
+ if (filter) {
+ tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (tmp);
+ tmp = tmp2;
+ }
+
+ result = tmp;
+
+ GST_DEBUG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " into %"
+ GST_PTR_FORMAT, caps, result);
+
+ return result;
+}
+
+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,
+ }
+};
+
+static const GValue *
+find_suitable_channel_layout (const GValue * val, guint chans)
+{
+ /* if output layout is fixed already and looks sane, we're done */
+ if (GST_VALUE_HOLDS_ARRAY (val) && gst_value_array_get_size (val) == chans)
+ return val;
+
+ /* if it's a list, go through it recursively and return the first
+ * sane-enough looking value we find */
+ if (GST_VALUE_HOLDS_LIST (val)) {
+ gint i;
+
+ for (i = 0; i < gst_value_list_get_size (val); ++i) {
+ const GValue *v, *ret;
+
+ v = gst_value_list_get_value (val, i);
+ if ((ret = find_suitable_channel_layout (v, chans)))
+ return ret;
+ }
+ }
+
+ return NULL;
+}
+
+static void
+gst_audio_convert_fixate_channels (GstBaseTransform * base, GstStructure * ins,
+ GstStructure * outs)
+{
+ const GValue *in_layout, *out_layout;
+ gint in_chans, out_chans;
+
+ if (!gst_structure_get_int (ins, "channels", &in_chans))
+ return; /* this shouldn't really happen, should it? */
+
+ if (!gst_structure_has_field (outs, "channels")) {
+ /* we could try to get the implied number of channels from the layout,
+ * but that seems overdoing it for a somewhat exotic corner case */
+ gst_structure_remove_field (outs, "channel-positions");
+ return;
+ }
+
+ /* ok, let's fixate the channels if they are not fixated yet */
+ gst_structure_fixate_field_nearest_int (outs, "channels", in_chans);
+
+ if (!gst_structure_get_int (outs, "channels", &out_chans)) {
+ /* shouldn't really happen ... */
+ gst_structure_remove_field (outs, "channel-positions");
+ return;
+ }
+
+ /* check if the output has a channel layout (or a list of layouts) */
+ out_layout = gst_structure_get_value (outs, "channel-positions");
+
+ /* get the channel layout of the input if any */
+ in_layout = gst_structure_get_value (ins, "channel-positions");
+
+ if (out_layout == NULL) {
+ if (out_chans <= 2 && (in_chans != out_chans || in_layout == NULL))
+ return; /* nothing to do, default layout will be assumed */
+ GST_WARNING_OBJECT (base, "downstream caps contain no channel layout");
+ }
+
+ if (in_chans == out_chans && in_layout != NULL) {
+ GValue res = { 0, };
+
+ /* same number of channels and no output layout: just use input layout */
+ if (out_layout == NULL) {
+ gst_structure_set_value (outs, "channel-positions", in_layout);
+ return;
+ }
+
+ /* if output layout is fixed already and looks sane, we're done */
+ if (GST_VALUE_HOLDS_ARRAY (out_layout) &&
+ gst_value_array_get_size (out_layout) == out_chans) {
+ return;
+ }
+
+ /* if the output layout is not fixed, check if the output layout contains
+ * the input layout */
+ if (gst_value_intersect (&res, in_layout, out_layout)) {
+ gst_structure_set_value (outs, "channel-positions", in_layout);
+ g_value_unset (&res);
+ return;
+ }
+
+ /* output layout is not fixed and does not contain the input layout, so
+ * just pick the first layout in the list (it should be a list ...) */
+ if ((out_layout = find_suitable_channel_layout (out_layout, out_chans))) {
+ gst_structure_set_value (outs, "channel-positions", out_layout);
+ return;
+ }
+
+ /* ... else fall back to default layout (NB: out_layout is NULL here) */
+ GST_WARNING_OBJECT (base, "unexpected output channel layout");
+ }
+
+ /* number of input channels != number of output channels:
+ * if this value contains a list of channel layouts (or even worse: a list
+ * with another list), just pick the first value and repeat until we find a
+ * channel position array or something else that's not a list; we assume
+ * the input if half-way sane and don't try to fall back on other list items
+ * if the first one is something unexpected or non-channel-pos-array-y */
+ if (out_layout != NULL && GST_VALUE_HOLDS_LIST (out_layout))
+ out_layout = find_suitable_channel_layout (out_layout, out_chans);
+
+ if (out_layout != NULL) {
+ if (GST_VALUE_HOLDS_ARRAY (out_layout) &&
+ gst_value_array_get_size (out_layout) == out_chans) {
+ /* looks sane enough, let's use it */
+ gst_structure_set_value (outs, "channel-positions", out_layout);
+ return;
+ }
+
+ /* what now?! Just ignore what we're given and use default positions */
+ GST_WARNING_OBJECT (base, "invalid or unexpected channel-positions");
+ }
+
+ /* missing or invalid output layout and we can't use the input layout for
+ * one reason or another, so just pick a default layout (we could be smarter
+ * and try to add/remove channels from the input layout, or pick a default
+ * layout based on LFE-presence in input layout, but let's save that for
+ * another day) */
+ if (out_chans > 0 && out_chans <= G_N_ELEMENTS (default_positions[0])) {
+ GST_DEBUG_OBJECT (base, "using default channel layout as fallback");
+ gst_audio_set_channel_positions (outs, default_positions[out_chans - 1]);
+ }
+}
+
+/* try to keep as many of the structure members the same by fixating the
+ * possible ranges; this way we convert the least amount of things as possible
+ */
+static void
+gst_audio_convert_fixate_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
+{
+ GstStructure *ins, *outs;
+ gint rate;
+ const gchar *fmt;
+
+ 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);
+
+ gst_audio_convert_fixate_channels (base, ins, outs);
+
+ if ((fmt = gst_structure_get_string (ins, "format"))) {
+ /* FIXME, find the best format */
+ gst_structure_fixate_field_string (outs, "format", fmt);
+ }
+
+ if (gst_structure_get_int (ins, "rate", &rate)) {
+ if (gst_structure_has_field (outs, "rate")) {
+ gst_structure_fixate_field_nearest_int (outs, "rate", rate);
+ }
+ }
+ GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps);
+}
+
+static gboolean
+gst_audio_convert_set_caps (GstBaseTransform * base, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstAudioConvert *this = GST_AUDIO_CONVERT (base);
+ GstAudioInfo in_info;
+ GstAudioInfo out_info;
+
+ GST_DEBUG_OBJECT (base, "incaps %" GST_PTR_FORMAT ", outcaps %"
+ GST_PTR_FORMAT, incaps, outcaps);
+
+ if (!gst_audio_info_from_caps (&in_info, incaps))
+ goto invalid_in;
+ if (!gst_audio_info_from_caps (&out_info, outcaps))
+ goto invalid_out;
+
+ if (!audio_convert_prepare_context (&this->ctx, &in_info, &out_info,
+ this->dither, this->ns))
+ goto no_converter;
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_in:
+ {
+ GST_ERROR_OBJECT (base, "invalid input caps");
+ return FALSE;
+ }
+invalid_out:
+ {
+ GST_ERROR_OBJECT (base, "invalid output caps");
+ return FALSE;
+ }
+no_converter:
+ {
+ GST_ERROR_OBJECT (base, "could not find converter");
+ return FALSE;
+ }
+}
+
+static GstFlowReturn
+gst_audio_convert_transform_ip (GstBaseTransform * base, GstBuffer * buf)
+{
+ /* nothing to do here */
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_audio_convert_transform (GstBaseTransform * base, GstBuffer * inbuf,
+ GstBuffer * outbuf)
+{
+ GstFlowReturn ret;
+ GstAudioConvert *this = GST_AUDIO_CONVERT (base);
+ gsize srcsize, dstsize;
+ gint insize, outsize;
+ gint samples;
+ gpointer src, dst;
+
+ /* get amount of samples to convert. */
+ samples = gst_buffer_get_size (inbuf) / this->ctx.in.bpf;
+
+ /* get in/output sizes, to see if the buffers we got are of correct
+ * sizes */
+ if (!audio_convert_get_sizes (&this->ctx, samples, &insize, &outsize))
+ goto error;
+
+ if (insize == 0 || outsize == 0)
+ return GST_FLOW_OK;
+
+ /* get src and dst data */
+ src = gst_buffer_map (inbuf, &srcsize, NULL, GST_MAP_READ);
+ dst = gst_buffer_map (outbuf, &dstsize, NULL, GST_MAP_WRITE);
+
+ /* check in and outsize */
+ if (srcsize < insize)
+ goto wrong_size;
+ if (dstsize < outsize)
+ goto wrong_size;
+
+ /* and convert the samples */
+ if (!GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP)) {
+ if (!audio_convert_convert (&this->ctx, src, dst,
+ samples, gst_buffer_is_writable (inbuf)))
+ goto convert_error;
+ } else {
+ /* Create silence buffer */
+ gst_audio_format_fill_silence (this->ctx.out.finfo, dst, outsize);
+ }
+ ret = GST_FLOW_OK;
+
+done:
+ gst_buffer_unmap (outbuf, dst, outsize);
+ gst_buffer_unmap (inbuf, src, srcsize);
+
+ return ret;
+
+ /* ERRORS */
+error:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, FORMAT,
+ (NULL), ("cannot get input/output sizes for %d samples", samples));
+ return GST_FLOW_ERROR;
+ }
+wrong_size:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, FORMAT,
+ (NULL),
+ ("input/output buffers are of wrong size in: %" G_GSIZE_FORMAT " < %d"
+ " or out: %" G_GSIZE_FORMAT " < %d",
+ srcsize, insize, dstsize, outsize));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+convert_error:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, FORMAT,
+ (NULL), ("error while converting"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static void
+gst_audio_convert_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAudioConvert *this = GST_AUDIO_CONVERT (object);
+
+ switch (prop_id) {
+ case ARG_DITHERING:
+ this->dither = g_value_get_enum (value);
+ break;
+ case ARG_NOISE_SHAPING:
+ this->ns = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_convert_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAudioConvert *this = GST_AUDIO_CONVERT (object);
+
+ switch (prop_id) {
+ case ARG_DITHERING:
+ g_value_set_enum (value, this->dither);
+ break;
+ case ARG_NOISE_SHAPING:
+ g_value_set_enum (value, this->ns);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/gst/audioconvert/gstaudioconvert.h b/gst/audioconvert/gstaudioconvert.h
new file mode 100644
index 0000000..62f324f
--- /dev/null
+++ b/gst/audioconvert/gstaudioconvert.h
@@ -0,0 +1,60 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim at fluendo dot com>
+ *
+ * gstaudioconvert.h: Convert audio to different audio formats automatically
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_CONVERT_H__
+#define __GST_AUDIO_CONVERT_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+
+#include "audioconvert.h"
+
+#define GST_TYPE_AUDIO_CONVERT (gst_audio_convert_get_type())
+#define GST_AUDIO_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CONVERT,GstAudioConvert))
+#define GST_AUDIO_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_CONVERT,GstAudioConvertClass))
+#define GST_IS_AUDIO_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CONVERT))
+#define GST_IS_AUDIO_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_CONVERT))
+
+typedef struct _GstAudioConvert GstAudioConvert;
+typedef struct _GstAudioConvertClass GstAudioConvertClass;
+
+/**
+ * GstAudioConvert:
+ *
+ * The audioconvert object structure.
+ */
+struct _GstAudioConvert
+{
+ GstBaseTransform element;
+
+ AudioConvertCtx ctx;
+
+ GstAudioConvertDithering dither;
+ GstAudioConvertNoiseShaping ns;
+};
+
+struct _GstAudioConvertClass
+{
+ GstBaseTransformClass parent_class;
+};
+
+#endif /* __GST_AUDIO_CONVERT_H__ */
diff --git a/gst/audioconvert/gstaudioconvertorc-dist.c b/gst/audioconvert/gstaudioconvertorc-dist.c
new file mode 100644
index 0000000..8080b1b
--- /dev/null
+++ b/gst/audioconvert/gstaudioconvertorc-dist.c
@@ -0,0 +1,6872 @@
+
+/* autogenerated from gstaudioconvertorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void orc_audio_convert_unpack_u8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_float_s32 (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_s32 (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_double (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_double_swap (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_double (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_double_swap (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_u8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32_float (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_float_swap (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_double (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_float (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_float_swap (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_u8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, 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_audio_convert_unpack_u8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var37.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << p1;
+ /* 5: xorl */
+ var36.i = var39.i ^ var35.i;
+ /* 6: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var37.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << ex->params[24];
+ /* 5: xorl */
+ var36.i = var39.i ^ var35.i;
+ /* 6: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u8");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_u8);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_C1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var36.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var35.i = var37.i << p1;
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var36.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var35.i = var37.i << ex->params[24];
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s8 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s8");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_s8);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var36.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var37.i = var36.i << p1;
+ /* 4: xorl */
+ var35.i = var37.i ^ var34.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var36.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var37.i = var36.i << ex->params[24];
+ /* 4: xorl */
+ var35.i = var37.i ^ var34.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u16");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_u16);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var35.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var34.i = var35.i << p1;
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var35.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var34.i = var35.i << ex->params[24];
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s16 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s16");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_s16);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var37.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << p1;
+ /* 5: xorl */
+ var36.i = var39.i ^ var35.i;
+ /* 6: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var37.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << ex->params[24];
+ /* 5: xorl */
+ var36.i = var39.i ^ var35.i;
+ /* 6: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u16_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_C1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var36.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var35.i = var37.i << p1;
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var36.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var35.i = var37.i << ex->params[24];
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s16_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s16_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var36.i = var33.i << p1;
+ /* 3: xorl */
+ var35.i = var36.i ^ var34.i;
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var36.i = var33.i << ex->params[24];
+ /* 3: xorl */
+ var35.i = var36.i ^ var34.i;
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u32");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, 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: shll */
+ var33.i = var32.i << p1;
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s32 (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: shll */
+ var33.i = var32.i << ex->params[24];
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s32 (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s32");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_unpack_s32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var36.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var37.i = var36.i << p1;
+ /* 4: xorl */
+ var35.i = var37.i ^ var34.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var36.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var37.i = var36.i << ex->params[24];
+ /* 4: xorl */
+ var35.i = var37.i ^ var34.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var34.i = var35.i << p1;
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var34.i = var35.i << ex->params[24];
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s32_swap (gint32 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_float_s32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_float_s32 (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var33.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+ /* 3: loadpl */
+ var34.i = (int) 0x3f000000; /* 1056964608 or 5.2221e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 2: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var36.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var37.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f + _src2.f;
+ var38.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: convfl */
+ {
+ int tmp;
+ tmp = (int) var38.f;
+ if (tmp == 0x80000000 && !(var38.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_float_s32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var33.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+ /* 3: loadpl */
+ var34.i = (int) 0x3f000000; /* 1056964608 or 5.2221e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 2: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var36.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var37.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f + _src2.f;
+ var38.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: convfl */
+ {
+ int tmp;
+ tmp = (int) var38.f;
+ if (tmp == 0x80000000 && !(var38.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_float_s32 (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_float_s32");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_float_s32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x4f000000, "c1");
+ orc_program_add_constant (p, 4, 0x3f000000, "c2");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_float_s32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_float_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+ /* 4: loadpl */
+ var35.i = (int) 0x3f000000; /* 1056964608 or 5.2221e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var37.i = ORC_SWAP_L (var33.i);
+ /* 3: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var37.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var38.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var38.i);
+ _src2.i = ORC_DENORMAL (var35.i);
+ _dest1.f = _src1.f + _src2.f;
+ var39.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 6: convfl */
+ {
+ int tmp;
+ tmp = (int) var39.f;
+ if (tmp == 0x80000000 && !(var39.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 7: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_float_s32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+ /* 4: loadpl */
+ var35.i = (int) 0x3f000000; /* 1056964608 or 5.2221e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var37.i = ORC_SWAP_L (var33.i);
+ /* 3: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var37.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var38.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: addf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var38.i);
+ _src2.i = ORC_DENORMAL (var35.i);
+ _dest1.f = _src1.f + _src2.f;
+ var39.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 6: convfl */
+ {
+ int tmp;
+ tmp = (int) var39.f;
+ if (tmp == 0x80000000 && !(var39.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 7: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_float_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_float_s32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_float_s32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x4f000000, "c1");
+ orc_program_add_constant (p, 4, 0x3f000000, "c2");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_double_s32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_double_s32 (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 1: loadpq */
+ var33.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+ /* 3: loadpq */
+ var34.i = ORC_UINT64_C (0x3fe0000000000000); /* 0.5f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: addd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f + _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 5: convdl */
+ {
+ int tmp;
+ tmp = var38.f;
+ if (tmp == 0x80000000 && !(var38.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_double_s32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 1: loadpq */
+ var33.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+ /* 3: loadpq */
+ var34.i = ORC_UINT64_C (0x3fe0000000000000); /* 0.5f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: addd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f + _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 5: convdl */
+ {
+ int tmp;
+ tmp = var38.f;
+ if (tmp == 0x80000000 && !(var38.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_double_s32 (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_double_s32");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_double_s32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
+ orc_program_add_constant_int64 (p, 8, 0x3fe0000000000000ULL, "c2");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "loadq", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_double_s32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_double_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+ orc_union64 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+ /* 4: loadpq */
+ var35.i = ORC_UINT64_C (0x3fe0000000000000); /* 0.5f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: swapq */
+ var37.i = ORC_SWAP_Q (var33.i);
+ /* 3: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 5: addd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var38.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _dest1.f = _src1.f + _src2.f;
+ var39.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 6: convdl */
+ {
+ int tmp;
+ tmp = var39.f;
+ if (tmp == 0x80000000 && !(var39.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 7: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_double_s32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+ orc_union64 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+ /* 4: loadpq */
+ var35.i = ORC_UINT64_C (0x3fe0000000000000); /* 0.5f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: swapq */
+ var37.i = ORC_SWAP_Q (var33.i);
+ /* 3: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 5: addd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var38.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _dest1.f = _src1.f + _src2.f;
+ var39.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 6: convdl */
+ {
+ int tmp;
+ tmp = var39.f;
+ if (tmp == 0x80000000 && !(var39.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 7: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_double_s32_swap (guint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_double_s32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_double_s32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
+ orc_program_add_constant_int64 (p, 8, 0x3fe0000000000000ULL, "c2");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "swapq", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_float_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_float_double (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr4[i];
+ /* 1: convfd */
+ {
+ orc_union32 _src1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ var33.f = _src1.f;
+ }
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_float_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr4[i];
+ /* 1: convfd */
+ {
+ orc_union32 _src1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ var33.f = _src1.f;
+ }
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_float_double (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_float_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_float_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "convfd", 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_audio_convert_unpack_float_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_float_double_swap (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: convfd */
+ {
+ orc_union32 _src1;
+ _src1.i = ORC_DENORMAL (var35.i);
+ var34.f = _src1.f;
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_float_double_swap (OrcExecutor *
+ ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: convfd */
+ {
+ orc_union32 _src1;
+ _src1.i = ORC_DENORMAL (var35.i);
+ var34.f = _src1.f;
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_float_double_swap (gdouble * ORC_RESTRICT d1,
+ const gfloat * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_float_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_float_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfd", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_double_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_double_double (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_double_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_double_double (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_double_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_double_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 8, "s1");
+
+ orc_program_append_2 (p, "copyq", 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_audio_convert_unpack_double_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_double_double_swap (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: swapq */
+ var33.i = ORC_SWAP_Q (var32.i);
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_double_double_swap (OrcExecutor *
+ ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: swapq */
+ var33.i = ORC_SWAP_Q (var32.i);
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_double_double_swap (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_double_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_double_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 8, "s1");
+
+ orc_program_append_2 (p, "swapq", 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_audio_convert_unpack_u8_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var37.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << p1;
+ /* 5: xorl */
+ var40.i = var39.i ^ var35.i;
+ /* 6: convld */
+ var36.f = var40.i;
+ /* 7: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u8_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var37.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << ex->params[24];
+ /* 5: xorl */
+ var40.i = var39.i ^ var35.i;
+ /* 6: convld */
+ var36.f = var40.i;
+ /* 7: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u8_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u8_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s8_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var36.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var38.i = var37.i << p1;
+ /* 4: convld */
+ var35.f = var38.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s8_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var36.i = (orc_uint8) var34;
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var38.i = var37.i << ex->params[24];
+ /* 4: convld */
+ var35.f = var38.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s8_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s8_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s8_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u16_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var36.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var37.i = var36.i << p1;
+ /* 4: xorl */
+ var38.i = var37.i ^ var34.i;
+ /* 5: convld */
+ var35.f = var38.i;
+ /* 6: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u16_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var36.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var37.i = var36.i << ex->params[24];
+ /* 4: xorl */
+ var38.i = var37.i ^ var34.i;
+ /* 5: convld */
+ var35.f = var38.i;
+ /* 6: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u16_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u16_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s16_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var35.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var36.i = var35.i << p1;
+ /* 3: convld */
+ var34.f = var36.i;
+ /* 4: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s16_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr4[i];
+ /* 1: convuwl */
+ var35.i = (orc_uint16) var33.i;
+ /* 2: shll */
+ var36.i = var35.i << ex->params[24];
+ /* 3: convld */
+ var34.f = var36.i;
+ /* 4: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s16_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s16_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s16_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u16_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var37.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << p1;
+ /* 5: xorl */
+ var40.i = var39.i ^ var35.i;
+ /* 6: convld */
+ var36.f = var40.i;
+ /* 7: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u16_double_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+ /* 4: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var37.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var38.i = (orc_uint16) var37.i;
+ /* 3: shll */
+ var39.i = var38.i << ex->params[24];
+ /* 5: xorl */
+ var40.i = var39.i ^ var35.i;
+ /* 6: convld */
+ var36.f = var40.i;
+ /* 7: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u16_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u16_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s16_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var36.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var38.i = var37.i << p1;
+ /* 4: convld */
+ var35.f = var38.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s16_double_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: swapw */
+ var36.i = ORC_SWAP_W (var34.i);
+ /* 2: convuwl */
+ var37.i = (orc_uint16) var36.i;
+ /* 3: shll */
+ var38.i = var37.i << ex->params[24];
+ /* 4: convld */
+ var35.f = var38.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s16_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s16_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s16_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u32_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var36.i = var33.i << p1;
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: convld */
+ var35.f = var37.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u32_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var36.i = var33.i << ex->params[24];
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: convld */
+ var35.f = var37.i;
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u32_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u32_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s32_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var35.i = var33.i << p1;
+ /* 2: convld */
+ var34.f = var35.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s32_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shll */
+ var35.i = var33.i << ex->params[24];
+ /* 2: convld */
+ var34.f = var35.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s32_double (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s32_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s32_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_u32_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_u32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var36.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var37.i = var36.i << p1;
+ /* 4: xorl */
+ var38.i = var37.i ^ var34.i;
+ /* 5: convld */
+ var35.f = var38.i;
+ /* 6: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_u32_double_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union64 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 3: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var36.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var37.i = var36.i << ex->params[24];
+ /* 4: xorl */
+ var38.i = var37.i ^ var34.i;
+ /* 5: convld */
+ var35.f = var38.i;
+ /* 6: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_u32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_u32_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_u32_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_unpack_s32_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_unpack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var36.i = var35.i << p1;
+ /* 3: convld */
+ var34.f = var36.i;
+ /* 4: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_unpack_s32_double_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: swapl */
+ var35.i = ORC_SWAP_L (var33.i);
+ /* 2: shll */
+ var36.i = var35.i << ex->params[24];
+ /* 3: convld */
+ var34.f = var36.i;
+ /* 4: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_unpack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_unpack_s32_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_unpack_s32_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convld", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_u8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_u8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_int8 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 2: xorl */
+ var37.i = var34.i ^ var35.i;
+ /* 3: shrul */
+ var38.i = ((orc_uint32) var37.i) >> p1;
+ /* 4: convlw */
+ var39.i = var38.i;
+ /* 5: convwb */
+ var36 = var39.i;
+ /* 6: storeb */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_int8 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 2: xorl */
+ var37.i = var34.i ^ var35.i;
+ /* 3: shrul */
+ var38.i = ((orc_uint32) var37.i) >> ex->params[24];
+ /* 4: convlw */
+ var39.i = var38.i;
+ /* 5: convwb */
+ var36 = var39.i;
+ /* 6: storeb */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_u8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_u8");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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_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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: shrsl */
+ var36.i = var34.i >> p1;
+ /* 2: convlw */
+ var37.i = var36.i;
+ /* 3: convwb */
+ var35 = var37.i;
+ /* 4: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: shrsl */
+ var36.i = var34.i >> ex->params[24];
+ /* 2: convlw */
+ var37.i = var36.i;
+ /* 3: convwb */
+ var35 = var37.i;
+ /* 4: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s8 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s8");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_s8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ 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_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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_u16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_u16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var37.i = ((orc_uint32) var36.i) >> p1;
+ /* 4: convlw */
+ var35.i = var37.i;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var37.i = ((orc_uint32) var36.i) >> ex->params[24];
+ /* 4: convlw */
+ var35.i = var37.i;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_u16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_u16");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shrsl */
+ var35.i = var33.i >> p1;
+ /* 2: convlw */
+ var34.i = var35.i;
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shrsl */
+ var35.i = var33.i >> ex->params[24];
+ /* 2: convlw */
+ var34.i = var35.i;
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s16 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s16");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_s16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_u16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 2: xorl */
+ var37.i = var34.i ^ var35.i;
+ /* 3: shrul */
+ var38.i = ((orc_uint32) var37.i) >> p1;
+ /* 4: convlw */
+ var39.i = var38.i;
+ /* 5: swapw */
+ var36.i = ORC_SWAP_W (var39.i);
+ /* 6: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_u16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 2: xorl */
+ var37.i = var34.i ^ var35.i;
+ /* 3: shrul */
+ var38.i = ((orc_uint32) var37.i) >> ex->params[24];
+ /* 4: convlw */
+ var39.i = var38.i;
+ /* 5: swapw */
+ var36.i = ORC_SWAP_W (var39.i);
+ /* 6: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_u16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_u16_swap);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "swapw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: shrsl */
+ var36.i = var34.i >> p1;
+ /* 2: convlw */
+ var37.i = var36.i;
+ /* 3: swapw */
+ var35.i = ORC_SWAP_W (var37.i);
+ /* 4: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: shrsl */
+ var36.i = var34.i >> ex->params[24];
+ /* 2: convlw */
+ var37.i = var36.i;
+ /* 3: swapw */
+ var35.i = ORC_SWAP_W (var37.i);
+ /* 4: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s16_swap);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ 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, "swapw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_u32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_u32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var35.i = ((orc_uint32) var36.i) >> p1;
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var35.i = ((orc_uint32) var36.i) >> ex->params[24];
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_u32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_u32");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, 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: shrsl */
+ var33.i = var32.i >> p1;
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32 (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: shrsl */
+ var33.i = var32.i >> ex->params[24];
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32 (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32");
+ orc_program_set_backup_function (p, _backup_orc_audio_convert_pack_s32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_u32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var37.i = ((orc_uint32) var36.i) >> p1;
+ /* 4: swapl */
+ var35.i = ORC_SWAP_L (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_u32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 1: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 2: xorl */
+ var36.i = var33.i ^ var34.i;
+ /* 3: shrul */
+ var37.i = ((orc_uint32) var36.i) >> ex->params[24];
+ /* 4: swapl */
+ var35.i = ORC_SWAP_L (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_u32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_u32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shrsl */
+ var35.i = var33.i >> p1;
+ /* 2: swapl */
+ var34.i = ORC_SWAP_L (var35.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: shrsl */
+ var35.i = var33.i >> ex->params[24];
+ /* 2: swapl */
+ var34.i = ORC_SWAP_L (var35.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32_float */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32_float (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convlf */
+ var35.f = var33.i;
+ /* 3: divf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var36.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32_float (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convlf */
+ var35.f = var33.i;
+ /* 3: divf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var36.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32_float (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32_float");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s32_float);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x4f000000, "c1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "divf", 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;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32_float_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32_float_swap (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convlf */
+ var36.f = var33.i;
+ /* 3: divf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var36.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var37.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: swapl */
+ var35.i = ORC_SWAP_L (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32_float_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x4f000000; /* 1325400064 or 6.54835e-315f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convlf */
+ var36.f = var33.i;
+ /* 3: divf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var36.i);
+ _src2.i = ORC_DENORMAL (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var37.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: swapl */
+ var35.i = ORC_SWAP_L (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32_float_swap (gfloat * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32_float_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s32_float_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x4f000000, "c1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "divf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32_double */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32_double (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var35.f = var33.i;
+ /* 3: divd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32_double (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var35.f = var33.i;
+ /* 3: divd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32_double (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32_double");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s32_double);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "divd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storeq", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_s32_double_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var36.f = var33.i;
+ /* 3: divd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: swapq */
+ var35.i = ORC_SWAP_Q (var37.i);
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_s32_double_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x41dfffffffc00000); /* 2.14748e+09f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var36.f = var33.i;
+ /* 3: divd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f / _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: swapq */
+ var35.i = ORC_SWAP_Q (var37.i);
+ /* 5: storeq */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_s32_double_swap (gdouble * ORC_RESTRICT d1,
+ const gint32 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_s32_double_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_s32_double_swap);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "divd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapq", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_float */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_float (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union32 var33;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _dest.f = _src1.f;
+ var33.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_float (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union32 var33;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _dest.f = _src1.f;
+ var33.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_float (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_float");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_float);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+
+ orc_program_append_2 (p, "convdf", 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_audio_convert_pack_double_float_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_float_swap (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest.f = _src1.f;
+ var35.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: swapl */
+ var34.i = ORC_SWAP_L (var35.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_float_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest.f = _src1.f;
+ var35.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: swapl */
+ var34.i = ORC_SWAP_L (var35.i);
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_float_swap (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_float_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_float_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_u8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_u8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_int8 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var37.i = tmp;
+ }
+ /* 3: xorl */
+ var38.i = var37.i ^ var35.i;
+ /* 4: shrul */
+ var39.i = ((orc_uint32) var38.i) >> p1;
+ /* 5: convlw */
+ var40.i = var39.i;
+ /* 6: convwb */
+ var36 = var40.i;
+ /* 7: storeb */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_int8 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var37.i = tmp;
+ }
+ /* 3: xorl */
+ var38.i = var37.i ^ var35.i;
+ /* 4: shrul */
+ var39.i = ((orc_uint32) var38.i) >> ex->params[24];
+ /* 5: convlw */
+ var40.i = var39.i;
+ /* 6: convwb */
+ var36 = var40.i;
+ /* 7: storeb */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_u8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_u8");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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_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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_s8 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_s8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_int8 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 2: shrsl */
+ var37.i = var36.i >> p1;
+ /* 3: convlw */
+ var38.i = var37.i;
+ /* 4: convwb */
+ var35 = var38.i;
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_s8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_int8 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 2: shrsl */
+ var37.i = var36.i >> ex->params[24];
+ /* 3: convlw */
+ var38.i = var37.i;
+ /* 4: convwb */
+ var35 = var38.i;
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_s8 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_s8");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_s8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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_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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_u16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_u16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var38.i = ((orc_uint32) var37.i) >> p1;
+ /* 5: convlw */
+ var35.i = var38.i;
+ /* 6: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var38.i = ((orc_uint32) var37.i) >> ex->params[24];
+ /* 5: convlw */
+ var35.i = var38.i;
+ /* 6: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_u16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_u16");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_s16 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_s16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var36.i = var35.i >> p1;
+ /* 3: convlw */
+ var34.i = var36.i;
+ /* 4: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_s16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union16 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var36.i = var35.i >> ex->params[24];
+ /* 3: convlw */
+ var34.i = var36.i;
+ /* 4: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_s16 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_s16");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_s16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_u16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var37.i = tmp;
+ }
+ /* 3: xorl */
+ var38.i = var37.i ^ var35.i;
+ /* 4: shrul */
+ var39.i = ((orc_uint32) var38.i) >> p1;
+ /* 5: convlw */
+ var40.i = var39.i;
+ /* 6: swapw */
+ var36.i = ORC_SWAP_W (var40.i);
+ /* 7: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_u16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var35.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var37.i = tmp;
+ }
+ /* 3: xorl */
+ var38.i = var37.i ^ var35.i;
+ /* 4: shrul */
+ var39.i = ((orc_uint32) var38.i) >> ex->params[24];
+ /* 5: convlw */
+ var40.i = var39.i;
+ /* 6: swapw */
+ var36.i = ORC_SWAP_W (var40.i);
+ /* 7: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_u16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_u16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_u16_swap);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "swapw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_s16_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 2: shrsl */
+ var37.i = var36.i >> p1;
+ /* 3: convlw */
+ var38.i = var37.i;
+ /* 4: swapw */
+ var35.i = ORC_SWAP_W (var38.i);
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_s16_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var34.f;
+ if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 2: shrsl */
+ var37.i = var36.i >> ex->params[24];
+ /* 3: convlw */
+ var38.i = var37.i;
+ /* 4: swapw */
+ var35.i = ORC_SWAP_W (var38.i);
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_s16_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_s16_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_s16_swap);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "swapw", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_u32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_u32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var35.i = ((orc_uint32) var37.i) >> p1;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var35.i = ((orc_uint32) var37.i) >> ex->params[24];
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_u32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_u32");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_s32 */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_s32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var34.i = var35.i >> p1;
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_s32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var34.i = var35.i >> ex->params[24];
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_s32 (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_s32");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_s32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_u32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var38.i = ((orc_uint32) var37.i) >> p1;
+ /* 5: swapl */
+ var35.i = ORC_SWAP_L (var38.i);
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_u32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+ /* 2: loadpl */
+ var34.i = (int) 0x80000000; /* -2147483648 or 1.061e-314f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var36.i = tmp;
+ }
+ /* 3: xorl */
+ var37.i = var36.i ^ var34.i;
+ /* 4: shrul */
+ var38.i = ((orc_uint32) var37.i) >> ex->params[24];
+ /* 5: swapl */
+ var35.i = ORC_SWAP_L (var38.i);
+ /* 6: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_u32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_u32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_u32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_constant (p, 4, 0x80000000, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_audio_convert_pack_double_s32_swap */
+#ifdef DISABLE_ORC
+void
+orc_audio_convert_pack_double_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var36.i = var35.i >> p1;
+ /* 3: swapl */
+ var34.i = ORC_SWAP_L (var36.i);
+ /* 4: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_audio_convert_pack_double_s32_swap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdl */
+ {
+ int tmp;
+ tmp = var33.f;
+ if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 2: shrsl */
+ var36.i = var35.i >> ex->params[24];
+ /* 3: swapl */
+ var34.i = ORC_SWAP_L (var36.i);
+ /* 4: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_audio_convert_pack_double_s32_swap (guint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_audio_convert_pack_double_s32_swap");
+ orc_program_set_backup_function (p,
+ _backup_orc_audio_convert_pack_double_s32_swap);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapl", 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
diff --git a/gst/audioconvert/gstaudioconvertorc-dist.h b/gst/audioconvert/gstaudioconvertorc-dist.h
new file mode 100644
index 0000000..85121fa
--- /dev/null
+++ b/gst/audioconvert/gstaudioconvertorc-dist.h
@@ -0,0 +1,130 @@
+
+/* autogenerated from gstaudioconvertorc.orc */
+
+#ifndef _GSTAUDIOCONVERTORC_H_
+#define _GSTAUDIOCONVERTORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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_audio_convert_unpack_u8 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s8 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_swap (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_swap (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32 (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_swap (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_swap (gint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_float_s32 (guint32 * ORC_RESTRICT d1, const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_s32_swap (guint32 * ORC_RESTRICT d1, const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_s32 (guint32 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_s32_swap (guint32 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_double (gdouble * ORC_RESTRICT d1, const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_float_double_swap (gdouble * ORC_RESTRICT d1, const gfloat * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_double (gdouble * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_double_double_swap (gdouble * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_unpack_u8_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s8_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u16_double_swap (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s16_double_swap (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_double (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_u32_double_swap (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_unpack_s32_double_swap (gdouble * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u8 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s8 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u16 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s16 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u16_swap (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s16_swap (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u32 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32 (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_u32_swap (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32_swap (guint8 * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_s32_float (gfloat * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_float_swap (gfloat * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_double (gdouble * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_s32_double_swap (gdouble * ORC_RESTRICT d1, const gint32 * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_float (gfloat * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_float_swap (gfloat * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_audio_convert_pack_double_u8 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s8 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u16 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s16 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u16_swap (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s16_swap (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u32 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s32 (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_u32_swap (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+void orc_audio_convert_pack_double_s32_swap (guint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int p1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/audioconvert/gstaudioconvertorc.orc b/gst/audioconvert/gstaudioconvertorc.orc
new file mode 100644
index 0000000..aea1376
--- /dev/null
+++ b/gst/audioconvert/gstaudioconvertorc.orc
@@ -0,0 +1,591 @@
+
+.function orc_audio_convert_unpack_u8
+.dest 4 d1 gint32
+.source 1 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll t3, t3, p1
+xorl d1, t3, c1
+
+
+.function orc_audio_convert_unpack_s8
+.dest 4 d1 gint32
+.source 1 s1 guint8
+.param 4 p1
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll d1, t3, p1
+
+
+.function orc_audio_convert_unpack_u16
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t2
+
+convuwl t2, s1
+shll t2, t2, p1
+xorl d1, t2, c1
+
+
+.function orc_audio_convert_unpack_s16
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.param 4 p1
+.temp 4 t2
+
+convuwl t2, s1
+shll d1, t2, p1
+
+
+.function orc_audio_convert_unpack_u16_swap
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll t2, t2, p1
+xorl d1, t2, c1
+
+
+.function orc_audio_convert_unpack_s16_swap
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.param 4 p1
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll d1, t2, p1
+
+
+.function orc_audio_convert_unpack_u32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+shll t1, s1, p1
+xorl d1, t1, c1
+
+
+.function orc_audio_convert_unpack_s32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.param 4 p1
+
+shll d1, s1, p1
+
+
+.function orc_audio_convert_unpack_u32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+swapl t1, s1
+shll t1, t1, p1
+xorl d1, t1, c1
+
+
+.function orc_audio_convert_unpack_s32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.param 4 p1
+.temp 4 t1
+
+swapl t1, s1
+shll d1, t1, p1
+
+.function orc_audio_convert_unpack_float_s32
+.source 4 s1 gfloat
+.dest 4 d1 guint32
+.temp 4 t1
+
+loadl t1, s1
+# multiply with 2147483647.0
+mulf t1, t1, 0x4F000000
+# add 0.5 for rounding
+addf t1, t1, 0x3F000000
+convfl d1, t1
+
+.function orc_audio_convert_unpack_float_s32_swap
+.source 4 s1 gfloat
+.dest 4 d1 guint32
+.temp 4 t1
+
+swapl t1, s1
+# multiply with 2147483647.0
+mulf t1, t1, 0x4F000000
+# add 0.5 for rounding
+addf t1, t1, 0x3F000000
+convfl d1, t1
+
+.function orc_audio_convert_unpack_double_s32
+.source 8 s1 gdouble
+.dest 4 d1 guint32
+.temp 8 t1
+
+loadq t1, s1
+# multiply with 2147483647.0
+muld t1, t1, 0x41DFFFFFFFC00000L
+# add 0.5 for rounding
+addd t1, t1, 0x3FE0000000000000L
+convdl d1, t1
+
+.function orc_audio_convert_unpack_double_s32_swap
+.source 8 s1 gdouble
+.dest 4 d1 guint32
+.temp 8 t1
+
+swapq t1, s1
+# multiply with 2147483647.0
+muld t1, t1, 0x41DFFFFFFFC00000L
+# add 0.5 for rounding
+addd t1, t1, 0x3FE0000000000000L
+convdl d1, t1
+
+.function orc_audio_convert_unpack_float_double
+.dest 8 d1 gdouble
+.source 4 s1 gfloat
+
+convfd d1, s1
+
+.function orc_audio_convert_unpack_float_double_swap
+.dest 8 d1 gdouble
+.source 4 s1 gfloat
+.temp 4 t1
+
+swapl t1, s1
+convfd d1, t1
+
+.function orc_audio_convert_unpack_double_double
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+copyq d1, s1
+
+.function orc_audio_convert_unpack_double_double_swap
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+swapq d1, s1
+
+.function orc_audio_convert_unpack_u8_double
+.dest 8 d1 gdouble
+.source 1 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll t3, t3, p1
+xorl t3, t3, c1
+convld d1, t3
+
+.function orc_audio_convert_unpack_s8_double
+.dest 8 d1 gdouble
+.source 1 s1 guint8
+.param 4 p1
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll t3, t3, p1
+convld d1, t3
+
+.function orc_audio_convert_unpack_u16_double
+.dest 8 d1 gdouble
+.source 2 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t2
+
+convuwl t2, s1
+shll t2, t2, p1
+xorl t2, t2, c1
+convld d1, t2
+
+.function orc_audio_convert_unpack_s16_double
+.dest 8 d1 gdouble
+.source 2 s1 guint8
+.param 4 p1
+.temp 4 t2
+
+convuwl t2, s1
+shll t2, t2, p1
+convld d1, t2
+
+.function orc_audio_convert_unpack_u16_double_swap
+.dest 8 d1 gdouble
+.source 2 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll t2, t2, p1
+xorl t2, t2, c1
+convld d1, t2
+
+.function orc_audio_convert_unpack_s16_double_swap
+.dest 8 d1 gdouble
+.source 2 s1 guint8
+.param 4 p1
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll t2, t2, p1
+convld d1, t2
+
+.function orc_audio_convert_unpack_u32_double
+.dest 8 d1 gdouble
+.source 4 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+shll t1, s1, p1
+xorl t1, t1, c1
+convld d1, t1
+
+.function orc_audio_convert_unpack_s32_double
+.dest 8 d1 gdouble
+.source 4 s1 guint8
+.param 4 p1
+.temp 4 t1
+
+shll t1, s1, p1
+convld d1, t1
+
+.function orc_audio_convert_unpack_u32_double_swap
+.dest 8 d1 gdouble
+.source 4 s1 guint8
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+swapl t1, s1
+shll t1, t1, p1
+xorl t1, t1, c1
+convld d1, t1
+
+.function orc_audio_convert_unpack_s32_double_swap
+.dest 8 d1 gdouble
+.source 4 s1 guint8
+.param 4 p1
+.temp 4 t1
+
+swapl t1, s1
+shll t1, t1, p1
+convld d1, t1
+
+.function orc_audio_convert_pack_u8
+.dest 1 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+.temp 2 t2
+
+xorl t1, s1, c1
+shrul t1, t1, p1
+convlw t2, t1
+convwb d1, t2
+
+
+.function orc_audio_convert_pack_s8
+.dest 1 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.temp 4 t1
+.temp 2 t2
+
+shrsl t1, s1, p1
+convlw t2, t1
+convwb d1, t2
+
+
+
+.function orc_audio_convert_pack_u16
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul t1, t1, p1
+convlw d1, t1
+
+
+.function orc_audio_convert_pack_s16
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.temp 4 t1
+
+shrsl t1, s1, p1
+convlw d1, t1
+
+
+.function orc_audio_convert_pack_u16_swap
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+.temp 2 t2
+
+xorl t1, s1, c1
+shrul t1, t1, p1
+convlw t2, t1
+swapw d1, t2
+
+
+.function orc_audio_convert_pack_s16_swap
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.temp 4 t1
+.temp 2 t2
+
+shrsl t1, s1, p1
+convlw t2, t1
+swapw d1, t2
+
+
+
+.function orc_audio_convert_pack_u32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul d1, t1, p1
+
+
+.function orc_audio_convert_pack_s32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+
+shrsl d1, s1, p1
+
+
+.function orc_audio_convert_pack_u32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul t1, t1, p1
+swapl d1, t1
+
+
+.function orc_audio_convert_pack_s32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.param 4 p1
+.temp 4 t1
+
+shrsl t1, s1, p1
+swapl d1, t1
+
+.function orc_audio_convert_pack_s32_float
+.dest 4 d1 gfloat
+.source 4 s1 gint32
+.temp 4 t1
+
+convlf t1, s1
+# divide by 2147483647.0
+divf t1, t1, 0x4F000000
+storel d1, t1
+
+.function orc_audio_convert_pack_s32_float_swap
+.dest 4 d1 gfloat
+.source 4 s1 gint32
+.temp 4 t1
+
+convlf t1, s1
+# divide by 2147483647.0
+divf t1, t1, 0x4F000000
+swapl d1, t1
+
+.function orc_audio_convert_pack_s32_double
+.dest 8 d1 gdouble
+.source 4 s1 gint32
+.temp 8 t1
+
+convld t1, s1
+# divide by 2147483647.0
+divd t1, t1, 0x41DFFFFFFFC00000L
+storeq d1, t1
+
+.function orc_audio_convert_pack_s32_double_swap
+.dest 8 d1 gdouble
+.source 4 s1 gint32
+.temp 8 t1
+
+convld t1, s1
+# divide by 2147483647.0
+divd t1, t1, 0x41DFFFFFFFC00000L
+swapq d1, t1
+
+.function orc_audio_convert_pack_double_float
+.dest 4 d1 gfloat
+.source 8 s1 gdouble
+
+convdf d1, s1
+
+.function orc_audio_convert_pack_double_float_swap
+.dest 4 d1 gfloat
+.source 8 s1 gdouble
+.temp 4 t1
+
+convdf t1, s1
+swapl d1, t1
+
+.function orc_audio_convert_pack_double_u8
+.dest 1 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+.temp 2 t2
+
+convdl t1, s1
+xorl t1, t1, c1
+shrul t1, t1, p1
+convlw t2, t1
+convwb d1, t2
+
+.function orc_audio_convert_pack_double_s8
+.dest 1 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.temp 4 t1
+.temp 2 t2
+
+convdl t1, s1
+shrsl t1, t1, p1
+convlw t2, t1
+convwb d1, t2
+
+.function orc_audio_convert_pack_double_u16
+.dest 2 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+convdl t1, s1
+xorl t1, t1, c1
+shrul t1, t1, p1
+convlw d1, t1
+
+.function orc_audio_convert_pack_double_s16
+.dest 2 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.temp 4 t1
+
+convdl t1, s1
+shrsl t1, t1, p1
+convlw d1, t1
+
+.function orc_audio_convert_pack_double_u16_swap
+.dest 2 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+.temp 2 t2
+
+convdl t1, s1
+xorl t1, t1, c1
+shrul t1, t1, p1
+convlw t2, t1
+swapw d1, t2
+
+.function orc_audio_convert_pack_double_s16_swap
+.dest 2 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.temp 4 t1
+.temp 2 t2
+
+convdl t1, s1
+shrsl t1, t1, p1
+convlw t2, t1
+swapw d1, t2
+
+.function orc_audio_convert_pack_double_u32
+.dest 4 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+convdl t1, s1
+xorl t1, t1, c1
+shrul d1, t1, p1
+
+.function orc_audio_convert_pack_double_s32
+.dest 4 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.temp 4 t1
+
+convdl t1, s1
+shrsl d1, t1, p1
+
+.function orc_audio_convert_pack_double_u32_swap
+.dest 4 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.const 4 c1 0x80000000
+.temp 4 t1
+
+convdl t1, s1
+xorl t1, t1, c1
+shrul t1, t1, p1
+swapl d1, t1
+
+.function orc_audio_convert_pack_double_s32_swap
+.dest 4 d1 guint8
+.source 8 s1 gdouble
+.param 4 p1
+.temp 4 t1
+
+convdl t1, s1
+shrsl t1, t1, p1
+swapl d1, t1
+
diff --git a/gst/audioconvert/gstaudioquantize.c b/gst/audioconvert/gstaudioquantize.c
new file mode 100644
index 0000000..5d45d85
--- /dev/null
+++ b/gst/audioconvert/gstaudioquantize.c
@@ -0,0 +1,503 @@
+/* GStreamer
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstaudioquantize.c: quantizes audio to the target format and optionally
+ * applies dithering and noise shaping.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * FIXME: When doing dithering with int as intermediate format
+ * one gets audible harmonics while the noise floor is
+ * constant for double as intermediate format!
+ */
+
+/* TODO: - Maybe drop 5-pole noise shaping and use coefficients
+ * generated by dmaker
+ * http://shibatch.sf.net
+ */
+
+#include <gst/gst.h>
+#include <string.h>
+#include <math.h>
+#include "audioconvert.h"
+#include "gstaudioquantize.h"
+
+#include "gstfastrandom.h"
+
+#define MAKE_QUANTIZE_FUNC_NAME(name) \
+gst_audio_quantize_quantize_##name
+
+/* Quantize functions for gint32 as intermediate format */
+
+#define MAKE_QUANTIZE_FUNC_I(name, DITHER_INIT_FUNC, ADD_DITHER_FUNC, \
+ ROUND_FUNC) \
+static void \
+MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gint32 *src, \
+ gint32 *dst, gint count) \
+{ \
+ gint scale = ctx->out_scale; \
+ gint channels = ctx->out.channels; \
+ gint chan_pos; \
+ \
+ if (scale > 0) { \
+ gint32 tmp; \
+ guint32 mask = 0xffffffff & (0xffffffff << scale); \
+ guint32 bias = 1U << (scale - 1); \
+ DITHER_INIT_FUNC() \
+ \
+ for (;count;count--) { \
+ for (chan_pos = 0; chan_pos < channels; chan_pos++) { \
+ tmp = *src++; \
+ ADD_DITHER_FUNC() \
+ ROUND_FUNC() \
+ *dst = tmp & mask; \
+ dst++; \
+ } \
+ } \
+ } else { \
+ for (;count;count--) { \
+ for (chan_pos = 0; chan_pos < channels; chan_pos++) { \
+ *dst = *src++; \
+ dst++; \
+ } \
+ } \
+ } \
+}
+
+
+/* Quantize functions for gdouble as intermediate format with
+ * int as target */
+
+#define MAKE_QUANTIZE_FUNC_F(name, DITHER_INIT_FUNC, NS_INIT_FUNC, \
+ ADD_NS_FUNC, ADD_DITHER_FUNC, \
+ UPDATE_ERROR_FUNC) \
+static void \
+MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gdouble *src, \
+ gdouble *dst, gint count) \
+{ \
+ gint scale = ctx->out_scale; \
+ gint channels = ctx->out.channels; \
+ gint chan_pos; \
+ gdouble factor = (1U<<(32-scale-1)) - 1; \
+ \
+ if (scale > 0) { \
+ gdouble tmp; \
+ DITHER_INIT_FUNC() \
+ NS_INIT_FUNC() \
+ \
+ for (;count;count--) { \
+ for (chan_pos = 0; chan_pos < channels; chan_pos++) { \
+ tmp = *src++; \
+ ADD_NS_FUNC() \
+ ADD_DITHER_FUNC() \
+ tmp = floor(tmp * factor + 0.5); \
+ *dst = CLAMP (tmp, -factor - 1, factor); \
+ UPDATE_ERROR_FUNC() \
+ dst++; \
+ } \
+ } \
+ } else { \
+ for (;count;count--) { \
+ for (chan_pos = 0; chan_pos < channels; chan_pos++) { \
+ *dst = *src++ * 2147483647.0; \
+ dst++; \
+ } \
+ } \
+ } \
+}
+
+/* Rounding functions for int as intermediate format, only used when
+ * not using dithering. With dithering we include this offset in our
+ * dither noise instead. */
+
+#define ROUND() \
+ if (tmp > 0 && G_MAXINT32 - tmp <= bias) \
+ tmp = G_MAXINT32; \
+ else \
+ tmp += bias;
+
+
+#define NONE_FUNC()
+
+/* Dithering definitions
+ * See http://en.wikipedia.org/wiki/Dithering or
+ * http://www.cadenzarecording.com/Dither.html for explainations.
+ *
+ * We already add the rounding offset to the dither noise here
+ * to have only one overflow check instead of two. */
+
+#define INIT_DITHER_RPDF_I() \
+ gint32 rand; \
+ gint32 dither = (1<<(scale));
+
+#define ADD_DITHER_RPDF_I() \
+ rand = gst_fast_random_int32_range (bias - dither, \
+ bias + dither); \
+ if (rand > 0 && tmp > 0 && G_MAXINT32 - tmp <= rand) \
+ tmp = G_MAXINT32; \
+ else if (rand < 0 && tmp < 0 && G_MININT32 - tmp >= rand) \
+ tmp = G_MININT32; \
+ else \
+ tmp += rand;
+
+#define INIT_DITHER_RPDF_F() \
+ gdouble dither = 1.0/(1U<<(32 - scale - 1));
+
+#define ADD_DITHER_RPDF_F() \
+ tmp += gst_fast_random_double_range (- dither, dither);
+
+#define INIT_DITHER_TPDF_I() \
+ gint32 rand; \
+ gint32 dither = (1<<(scale - 1)); \
+ bias = bias >> 1;
+
+#define ADD_DITHER_TPDF_I() \
+ rand = gst_fast_random_int32_range (bias - dither, \
+ bias + dither - 1) \
+ + gst_fast_random_int32_range (bias - dither, \
+ bias + dither - 1); \
+ if (rand > 0 && tmp > 0 && G_MAXINT32 - tmp <= rand) \
+ tmp = G_MAXINT32; \
+ else if (rand < 0 && tmp < 0 && G_MININT32 - tmp >= rand) \
+ tmp = G_MININT32; \
+ else \
+ tmp += rand;
+
+#define INIT_DITHER_TPDF_F() \
+ gdouble dither = 1.0/(1U<<(32 - scale));
+
+#define ADD_DITHER_TPDF_F() \
+ tmp += gst_fast_random_double_range (- dither, dither) \
+ + gst_fast_random_double_range (- dither, dither);
+
+#define INIT_DITHER_TPDF_HF_I() \
+ gint32 rand; \
+ gint32 dither = (1<<(scale-1)); \
+ gint32 *last_random = (gint32 *) ctx->last_random, tmp_rand; \
+ bias = bias >> 1;
+
+#define ADD_DITHER_TPDF_HF_I() \
+ tmp_rand = gst_fast_random_int32_range (bias - dither, \
+ bias + dither); \
+ rand = tmp_rand - last_random[chan_pos]; \
+ last_random[chan_pos] = tmp_rand; \
+ if (rand > 0 && tmp > 0 && G_MAXINT32 - tmp <= rand) \
+ tmp = G_MAXINT32; \
+ else if (rand < 0 && tmp < 0 && G_MININT32 - tmp >= rand) \
+ tmp = G_MININT32; \
+ else \
+ tmp += rand;
+
+/* Like TPDF dither but the dither noise is oriented more to the
+ * higher frequencies */
+
+#define INIT_DITHER_TPDF_HF_F() \
+ gdouble rand; \
+ gdouble dither = 1.0/(1U<<(32 - scale)); \
+ gdouble *last_random = (gdouble *) ctx->last_random, tmp_rand;
+
+#define ADD_DITHER_TPDF_HF_F() \
+ tmp_rand = gst_fast_random_double_range (- dither, dither); \
+ rand = tmp_rand - last_random[chan_pos]; \
+ last_random[chan_pos] = tmp_rand; \
+ tmp += rand;
+
+/* Noise shaping definitions.
+ * See http://en.wikipedia.org/wiki/Noise_shaping for explanations. */
+
+
+/* Simple error feedback: Just accumulate the dithering and quantization
+ * error and remove it from each sample. */
+
+#define INIT_NS_ERROR_FEEDBACK() \
+ gdouble orig; \
+ gdouble *errors = ctx->error_buf;
+
+#define ADD_NS_ERROR_FEEDBACK() \
+ orig = tmp; \
+ tmp -= errors[chan_pos];
+
+#define UPDATE_ERROR_ERROR_FEEDBACK() \
+ errors[chan_pos] += (*dst)/factor - orig;
+
+/* Same as error feedback but also add 1/2 of the previous error value.
+ * This moves the noise a bit more into the higher frequencies. */
+
+#define INIT_NS_SIMPLE() \
+ gdouble orig; \
+ gdouble *errors = ctx->error_buf, cur_error;
+
+#define ADD_NS_SIMPLE() \
+ cur_error = errors[chan_pos*2] - 0.5 * errors[chan_pos*2 + 1]; \
+ tmp -= cur_error; \
+ orig = tmp;
+
+#define UPDATE_ERROR_SIMPLE() \
+ errors[chan_pos*2 + 1] = errors[chan_pos*2]; \
+ errors[chan_pos*2] = (*dst)/factor - orig;
+
+
+/* Noise shaping coefficients from[1], moves most power of the
+ * error noise into inaudible frequency ranges.
+ *
+ * [1]
+ * "Minimally Audible Noise Shaping", Stanley P. Lipshitz,
+ * John Vanderkooy, and Robert A. Wannamaker,
+ * J. Audio Eng. Soc., Vol. 39, No. 11, November 1991. */
+
+static const gdouble ns_medium_coeffs[] = {
+ 2.033, -2.165, 1.959, -1.590, 0.6149
+};
+
+#define INIT_NS_MEDIUM() \
+ gdouble orig; \
+ gdouble *errors = ctx->error_buf, cur_error; \
+ int j;
+
+#define ADD_NS_MEDIUM() \
+ cur_error = 0.0; \
+ for (j = 0; j < 5; j++) \
+ cur_error += errors[chan_pos*5 + j] * ns_medium_coeffs[j]; \
+ tmp -= cur_error; \
+ orig = tmp;
+
+#define UPDATE_ERROR_MEDIUM() \
+ for (j = 4; j > 0; j--) \
+ errors[chan_pos*5 + j] = errors[chan_pos*5 + j-1]; \
+ errors[chan_pos*5] = (*dst)/factor - orig;
+
+/* Noise shaping coefficients by David Schleef, moves most power of the
+ * error noise into inaudible frequency ranges */
+
+static const gdouble ns_high_coeffs[] = {
+ 2.08484, -2.92975, 3.27918, -3.31399, 2.61339, -1.72008, 0.876066, -0.340122
+};
+
+#define INIT_NS_HIGH() \
+ gdouble orig; \
+ gdouble *errors = ctx->error_buf, cur_error; \
+ int j;
+
+#define ADD_NS_HIGH() \
+ cur_error = 0.0; \
+ for (j = 0; j < 8; j++) \
+ cur_error += errors[chan_pos + j] * ns_high_coeffs[j]; \
+ tmp -= cur_error; \
+ orig = tmp;
+
+#define UPDATE_ERROR_HIGH() \
+ for (j = 7; j > 0; j--) \
+ errors[chan_pos + j] = errors[chan_pos + j-1]; \
+ errors[chan_pos] = (*dst)/factor - orig;
+
+
+MAKE_QUANTIZE_FUNC_I (signed_none_none, NONE_FUNC, NONE_FUNC, ROUND);
+MAKE_QUANTIZE_FUNC_I (signed_rpdf_none, INIT_DITHER_RPDF_I, ADD_DITHER_RPDF_I,
+ NONE_FUNC);
+MAKE_QUANTIZE_FUNC_I (signed_tpdf_none, INIT_DITHER_TPDF_I, ADD_DITHER_TPDF_I,
+ NONE_FUNC);
+MAKE_QUANTIZE_FUNC_I (signed_tpdf_hf_none, INIT_DITHER_TPDF_HF_I,
+ ADD_DITHER_TPDF_HF_I, NONE_FUNC);
+
+MAKE_QUANTIZE_FUNC_I (unsigned_none_none, NONE_FUNC, NONE_FUNC, ROUND);
+MAKE_QUANTIZE_FUNC_I (unsigned_rpdf_none, INIT_DITHER_RPDF_I, ADD_DITHER_RPDF_I,
+ NONE_FUNC);
+MAKE_QUANTIZE_FUNC_I (unsigned_tpdf_none, INIT_DITHER_TPDF_I, ADD_DITHER_TPDF_I,
+ NONE_FUNC);
+MAKE_QUANTIZE_FUNC_I (unsigned_tpdf_hf_none, INIT_DITHER_TPDF_HF_I,
+ ADD_DITHER_TPDF_HF_I, NONE_FUNC);
+
+MAKE_QUANTIZE_FUNC_F (float_none_error_feedback, NONE_FUNC,
+ INIT_NS_ERROR_FEEDBACK, ADD_NS_ERROR_FEEDBACK, NONE_FUNC,
+ UPDATE_ERROR_ERROR_FEEDBACK);
+MAKE_QUANTIZE_FUNC_F (float_none_simple, NONE_FUNC, INIT_NS_SIMPLE,
+ ADD_NS_SIMPLE, NONE_FUNC, UPDATE_ERROR_SIMPLE);
+MAKE_QUANTIZE_FUNC_F (float_none_medium, NONE_FUNC, INIT_NS_MEDIUM,
+ ADD_NS_MEDIUM, NONE_FUNC, UPDATE_ERROR_MEDIUM);
+MAKE_QUANTIZE_FUNC_F (float_none_high, NONE_FUNC, INIT_NS_HIGH, ADD_NS_HIGH,
+ NONE_FUNC, UPDATE_ERROR_HIGH);
+
+MAKE_QUANTIZE_FUNC_F (float_rpdf_error_feedback, INIT_DITHER_RPDF_F,
+ INIT_NS_ERROR_FEEDBACK, ADD_NS_ERROR_FEEDBACK, ADD_DITHER_RPDF_F,
+ UPDATE_ERROR_ERROR_FEEDBACK);
+MAKE_QUANTIZE_FUNC_F (float_rpdf_simple, INIT_DITHER_RPDF_F, INIT_NS_SIMPLE,
+ ADD_NS_SIMPLE, ADD_DITHER_RPDF_F, UPDATE_ERROR_SIMPLE);
+MAKE_QUANTIZE_FUNC_F (float_rpdf_medium, INIT_DITHER_RPDF_F, INIT_NS_MEDIUM,
+ ADD_NS_MEDIUM, ADD_DITHER_RPDF_F, UPDATE_ERROR_MEDIUM);
+MAKE_QUANTIZE_FUNC_F (float_rpdf_high, INIT_DITHER_RPDF_F, INIT_NS_HIGH,
+ ADD_NS_HIGH, ADD_DITHER_RPDF_F, UPDATE_ERROR_HIGH);
+
+MAKE_QUANTIZE_FUNC_F (float_tpdf_error_feedback, INIT_DITHER_TPDF_F,
+ INIT_NS_ERROR_FEEDBACK, ADD_NS_ERROR_FEEDBACK, ADD_DITHER_TPDF_F,
+ UPDATE_ERROR_ERROR_FEEDBACK);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_simple, INIT_DITHER_TPDF_F, INIT_NS_SIMPLE,
+ ADD_NS_SIMPLE, ADD_DITHER_TPDF_F, UPDATE_ERROR_SIMPLE);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_medium, INIT_DITHER_TPDF_F, INIT_NS_MEDIUM,
+ ADD_NS_MEDIUM, ADD_DITHER_TPDF_F, UPDATE_ERROR_MEDIUM);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_high, INIT_DITHER_TPDF_F, INIT_NS_HIGH,
+ ADD_NS_HIGH, ADD_DITHER_TPDF_F, UPDATE_ERROR_HIGH);
+
+MAKE_QUANTIZE_FUNC_F (float_tpdf_hf_error_feedback, INIT_DITHER_TPDF_HF_F,
+ INIT_NS_ERROR_FEEDBACK, ADD_NS_ERROR_FEEDBACK, ADD_DITHER_TPDF_HF_F,
+ UPDATE_ERROR_ERROR_FEEDBACK);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_hf_simple, INIT_DITHER_TPDF_HF_F,
+ INIT_NS_SIMPLE, ADD_NS_SIMPLE, ADD_DITHER_TPDF_HF_F, UPDATE_ERROR_SIMPLE);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_hf_medium, INIT_DITHER_TPDF_HF_F,
+ INIT_NS_MEDIUM, ADD_NS_MEDIUM, ADD_DITHER_TPDF_HF_F, UPDATE_ERROR_MEDIUM);
+MAKE_QUANTIZE_FUNC_F (float_tpdf_hf_high, INIT_DITHER_TPDF_HF_F, INIT_NS_HIGH,
+ ADD_NS_HIGH, ADD_DITHER_TPDF_HF_F, UPDATE_ERROR_HIGH);
+
+static AudioConvertQuantize quantize_funcs[] = {
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (signed_none_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (signed_rpdf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (signed_tpdf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (signed_tpdf_hf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (unsigned_none_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (unsigned_rpdf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (unsigned_tpdf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (unsigned_tpdf_hf_none),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_none_error_feedback),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_none_simple),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_none_medium),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_none_high),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_rpdf_error_feedback),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_rpdf_simple),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_rpdf_medium),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_rpdf_high),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_error_feedback),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_simple),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_medium),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_high),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_hf_error_feedback),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_hf_simple),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_hf_medium),
+ (AudioConvertQuantize) MAKE_QUANTIZE_FUNC_NAME (float_tpdf_hf_high)
+};
+
+static void
+gst_audio_quantize_setup_noise_shaping (AudioConvertCtx * ctx)
+{
+ switch (ctx->ns) {
+ case NOISE_SHAPING_HIGH:{
+ ctx->error_buf = g_new0 (gdouble, ctx->out.channels * 8);
+ break;
+ }
+ case NOISE_SHAPING_MEDIUM:{
+ ctx->error_buf = g_new0 (gdouble, ctx->out.channels * 5);
+ break;
+ }
+ case NOISE_SHAPING_SIMPLE:{
+ ctx->error_buf = g_new0 (gdouble, ctx->out.channels * 2);
+ break;
+ }
+ case NOISE_SHAPING_ERROR_FEEDBACK:
+ ctx->error_buf = g_new0 (gdouble, ctx->out.channels);
+ break;
+ case NOISE_SHAPING_NONE:
+ default:
+ ctx->error_buf = NULL;
+ break;
+ }
+ return;
+}
+
+static void
+gst_audio_quantize_free_noise_shaping (AudioConvertCtx * ctx)
+{
+ switch (ctx->ns) {
+ case NOISE_SHAPING_HIGH:
+ case NOISE_SHAPING_MEDIUM:
+ case NOISE_SHAPING_SIMPLE:
+ case NOISE_SHAPING_ERROR_FEEDBACK:
+ case NOISE_SHAPING_NONE:
+ default:
+ break;
+ }
+
+ g_free (ctx->error_buf);
+ ctx->error_buf = NULL;
+ return;
+}
+
+static void
+gst_audio_quantize_setup_dither (AudioConvertCtx * ctx)
+{
+ switch (ctx->dither) {
+ case DITHER_TPDF_HF:
+ if (GST_AUDIO_FORMAT_INFO_IS_INTEGER (ctx->out.finfo))
+ ctx->last_random = g_new0 (gint32, ctx->out.channels);
+ else
+ ctx->last_random = g_new0 (gdouble, ctx->out.channels);
+ break;
+ case DITHER_RPDF:
+ case DITHER_TPDF:
+ ctx->last_random = NULL;
+ break;
+ case DITHER_NONE:
+ default:
+ ctx->last_random = NULL;
+ break;
+ }
+ return;
+}
+
+static void
+gst_audio_quantize_free_dither (AudioConvertCtx * ctx)
+{
+ g_free (ctx->last_random);
+
+ return;
+}
+
+static void
+gst_audio_quantize_setup_quantize_func (AudioConvertCtx * ctx)
+{
+ gint index = 0;
+
+ if (!GST_AUDIO_FORMAT_INFO_IS_INTEGER (ctx->out.finfo)) {
+ ctx->quantize = NULL;
+ return;
+ }
+
+ if (ctx->ns == NOISE_SHAPING_NONE) {
+ index += ctx->dither;
+ index += GST_AUDIO_FORMAT_INFO_IS_SIGNED (ctx->out.finfo) ? 0 : 4;
+ } else {
+ index += 8 + (4 * ctx->dither);
+ index += ctx->ns - 1;
+ }
+
+ ctx->quantize = quantize_funcs[index];
+}
+
+gboolean
+gst_audio_quantize_setup (AudioConvertCtx * ctx)
+{
+ gst_audio_quantize_setup_dither (ctx);
+ gst_audio_quantize_setup_noise_shaping (ctx);
+ gst_audio_quantize_setup_quantize_func (ctx);
+
+ return TRUE;
+}
+
+void
+gst_audio_quantize_free (AudioConvertCtx * ctx)
+{
+ gst_audio_quantize_free_dither (ctx);
+ gst_audio_quantize_free_noise_shaping (ctx);
+}
diff --git a/gst/audioconvert/gstaudioquantize.h b/gst/audioconvert/gstaudioquantize.h
new file mode 100644
index 0000000..b7e5cce
--- /dev/null
+++ b/gst/audioconvert/gstaudioquantize.h
@@ -0,0 +1,34 @@
+/* GStreamer
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstaudioquantize.h: quantizes audio to the target format and optionally
+ * applies dithering and noise shaping.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/gst.h>
+#include "audioconvert.h"
+
+#ifndef __GST_AUDIO_QUANTIZE_H__
+#define __GST_AUDIO_QUANTIZE_H__
+
+gboolean gst_audio_quantize_setup (AudioConvertCtx * ctx);
+void gst_audio_quantize_reset (AudioConvertCtx * ctx);
+void gst_audio_quantize_free (AudioConvertCtx * ctx);
+
+
+#endif /* __GST_AUDIO_QUANTIZE_H__ */
diff --git a/gst/audioconvert/gstchannelmix.c b/gst/audioconvert/gstchannelmix.c
new file mode 100644
index 0000000..a68f2c1
--- /dev/null
+++ b/gst/audioconvert/gstchannelmix.c
@@ -0,0 +1,743 @@
+/* GStreamer
+ * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2008 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstchannelmix.c: setup of channel conversion matrices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <math.h>
+#include <string.h>
+#include <gst/audio/multichannel.h>
+
+#include "gstchannelmix.h"
+
+/*
+ * Channel matrix functions.
+ */
+
+void
+gst_channel_mix_unset_matrix (AudioConvertCtx * this)
+{
+ gint i;
+
+ /* don't access if nothing there */
+ if (!this->matrix)
+ return;
+
+ /* free */
+ for (i = 0; i < this->in.channels; i++)
+ g_free (this->matrix[i]);
+ g_free (this->matrix);
+
+ this->matrix = NULL;
+ g_free (this->tmp);
+ this->tmp = NULL;
+}
+
+/*
+ * Detect and fill in identical channels. E.g.
+ * forward the left/right front channels in a
+ * 5.1 to 2.0 conversion.
+ */
+
+static void
+gst_channel_mix_fill_identical (AudioConvertCtx * this)
+{
+ gint ci, co;
+
+ /* Apart from the compatible channel assignments, we can also have
+ * same channel assignments. This is much simpler, we simply copy
+ * the value from source to dest! */
+ for (co = 0; co < this->out.channels; co++) {
+ /* find a channel in input with same position */
+ for (ci = 0; ci < this->in.channels; ci++) {
+ if (this->in.position[ci] == this->out.position[co]) {
+ this->matrix[ci][co] = 1.0;
+ }
+ }
+ }
+}
+
+/*
+ * Detect and fill in compatible channels. E.g.
+ * forward left/right front to mono (or the other
+ * way around) when going from 2.0 to 1.0.
+ */
+
+static void
+gst_channel_mix_fill_compatible (AudioConvertCtx * this)
+{
+ /* Conversions from one-channel to compatible two-channel configs */
+ struct
+ {
+ GstAudioChannelPosition pos1[2];
+ GstAudioChannelPosition pos2[1];
+ } conv[] = {
+ /* front: mono <-> stereo */
+ { {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}},
+ /* front center: 2 <-> 1 */
+ { {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}},
+ /* rear: 2 <-> 1 */
+ { {
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, { {
+ GST_AUDIO_CHANNEL_POSITION_INVALID}}
+ };
+ gint c;
+
+ /* conversions from compatible (but not the same) channel schemes */
+ for (c = 0; conv[c].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID; c++) {
+ gint pos1_0 = -1, pos1_1 = -1, pos1_2 = -1;
+ gint pos2_0 = -1, pos2_1 = -1, pos2_2 = -1;
+ gint n;
+
+ for (n = 0; n < this->in.channels; n++) {
+ if (this->in.position[n] == conv[c].pos1[0])
+ pos1_0 = n;
+ else if (this->in.position[n] == conv[c].pos1[1])
+ pos1_1 = n;
+ else if (this->in.position[n] == conv[c].pos2[0])
+ pos1_2 = n;
+ }
+ for (n = 0; n < this->out.channels; n++) {
+ if (this->out.position[n] == conv[c].pos1[0])
+ pos2_0 = n;
+ else if (this->out.position[n] == conv[c].pos1[1])
+ pos2_1 = n;
+ else if (this->out.position[n] == conv[c].pos2[0])
+ pos2_2 = n;
+ }
+
+ /* The general idea here is to fill in channels from the same position
+ * as good as possible. This means mixing left<->center and right<->center.
+ */
+
+ /* left -> center */
+ if (pos1_0 != -1 && pos1_2 == -1 && pos2_0 == -1 && pos2_2 != -1)
+ this->matrix[pos1_0][pos2_2] = 1.0;
+ else if (pos1_0 != -1 && pos1_2 != -1 && pos2_0 == -1 && pos2_2 != -1)
+ this->matrix[pos1_0][pos2_2] = 0.5;
+ else if (pos1_0 != -1 && pos1_2 == -1 && pos2_0 != -1 && pos2_2 != -1)
+ this->matrix[pos1_0][pos2_2] = 1.0;
+
+ /* right -> center */
+ if (pos1_1 != -1 && pos1_2 == -1 && pos2_1 == -1 && pos2_2 != -1)
+ this->matrix[pos1_1][pos2_2] = 1.0;
+ else if (pos1_1 != -1 && pos1_2 != -1 && pos2_1 == -1 && pos2_2 != -1)
+ this->matrix[pos1_1][pos2_2] = 0.5;
+ else if (pos1_1 != -1 && pos1_2 == -1 && pos2_1 != -1 && pos2_2 != -1)
+ this->matrix[pos1_1][pos2_2] = 1.0;
+
+ /* center -> left */
+ if (pos1_2 != -1 && pos1_0 == -1 && pos2_2 == -1 && pos2_0 != -1)
+ this->matrix[pos1_2][pos2_0] = 1.0;
+ else if (pos1_2 != -1 && pos1_0 != -1 && pos2_2 == -1 && pos2_0 != -1)
+ this->matrix[pos1_2][pos2_0] = 0.5;
+ else if (pos1_2 != -1 && pos1_0 == -1 && pos2_2 != -1 && pos2_0 != -1)
+ this->matrix[pos1_2][pos2_0] = 1.0;
+
+ /* center -> right */
+ if (pos1_2 != -1 && pos1_1 == -1 && pos2_2 == -1 && pos2_1 != -1)
+ this->matrix[pos1_2][pos2_1] = 1.0;
+ else if (pos1_2 != -1 && pos1_1 != -1 && pos2_2 == -1 && pos2_1 != -1)
+ this->matrix[pos1_2][pos2_1] = 0.5;
+ else if (pos1_2 != -1 && pos1_1 == -1 && pos2_2 != -1 && pos2_1 != -1)
+ this->matrix[pos1_2][pos2_1] = 1.0;
+ }
+}
+
+/*
+ * Detect and fill in channels not handled by the
+ * above two, e.g. center to left/right front in
+ * 5.1 to 2.0 (or the other way around).
+ *
+ * Unfortunately, limited to static conversions
+ * for now.
+ */
+
+static void
+gst_channel_mix_detect_pos (GstAudioInfo * info,
+ gint * f, gboolean * has_f,
+ gint * c, gboolean * has_c, gint * r, gboolean * has_r,
+ gint * s, gboolean * has_s, gint * b, gboolean * has_b)
+{
+ gint n;
+
+ for (n = 0; n < info->channels; n++) {
+ switch (info->position[n]) {
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_MONO:
+ f[1] = n;
+ *has_f = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT:
+ f[0] = n;
+ *has_f = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT:
+ f[2] = n;
+ *has_f = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER:
+ c[1] = n;
+ *has_c = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER:
+ c[0] = n;
+ *has_c = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER:
+ c[2] = n;
+ *has_c = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_REAR_CENTER:
+ r[1] = n;
+ *has_r = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_REAR_LEFT:
+ r[0] = n;
+ *has_r = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT:
+ r[2] = n;
+ *has_r = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT:
+ s[0] = n;
+ *has_s = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT:
+ s[2] = n;
+ *has_s = TRUE;
+ break;
+ case GST_AUDIO_CHANNEL_POSITION_LFE:
+ *has_b = TRUE;
+ b[1] = n;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+gst_channel_mix_fill_one_other (gfloat ** matrix,
+ GstAudioInfo * from_info, gint * from_idx,
+ GstAudioInfo * to_info, gint * to_idx, gfloat ratio)
+{
+
+ /* src & dst have center => passthrough */
+ if (from_idx[1] != -1 && to_idx[1] != -1) {
+ matrix[from_idx[1]][to_idx[1]] = ratio;
+ }
+
+ /* src & dst have left => passthrough */
+ if (from_idx[0] != -1 && to_idx[0] != -1) {
+ matrix[from_idx[0]][to_idx[0]] = ratio;
+ }
+
+ /* src & dst have right => passthrough */
+ if (from_idx[2] != -1 && to_idx[2] != -1) {
+ matrix[from_idx[2]][to_idx[2]] = ratio;
+ }
+
+ /* src has left & dst has center => put into center */
+ if (from_idx[0] != -1 && to_idx[1] != -1 && from_idx[1] != -1) {
+ matrix[from_idx[0]][to_idx[1]] = 0.5 * ratio;
+ } else if (from_idx[0] != -1 && to_idx[1] != -1 && from_idx[1] == -1) {
+ matrix[from_idx[0]][to_idx[1]] = ratio;
+ }
+
+ /* src has right & dst has center => put into center */
+ if (from_idx[2] != -1 && to_idx[1] != -1 && from_idx[1] != -1) {
+ matrix[from_idx[2]][to_idx[1]] = 0.5 * ratio;
+ } else if (from_idx[2] != -1 && to_idx[1] != -1 && from_idx[1] == -1) {
+ matrix[from_idx[2]][to_idx[1]] = ratio;
+ }
+
+ /* src has center & dst has left => passthrough */
+ if (from_idx[1] != -1 && to_idx[0] != -1 && from_idx[0] != -1) {
+ matrix[from_idx[1]][to_idx[0]] = 0.5 * ratio;
+ } else if (from_idx[1] != -1 && to_idx[0] != -1 && from_idx[0] == -1) {
+ matrix[from_idx[1]][to_idx[0]] = ratio;
+ }
+
+ /* src has center & dst has right => passthrough */
+ if (from_idx[1] != -1 && to_idx[2] != -1 && from_idx[2] != -1) {
+ matrix[from_idx[1]][to_idx[2]] = 0.5 * ratio;
+ } else if (from_idx[1] != -1 && to_idx[2] != -1 && from_idx[2] == -1) {
+ matrix[from_idx[1]][to_idx[2]] = ratio;
+ }
+}
+
+#define RATIO_CENTER_FRONT (1.0 / sqrt (2.0))
+#define RATIO_CENTER_SIDE (1.0 / 2.0)
+#define RATIO_CENTER_REAR (1.0 / sqrt (8.0))
+
+#define RATIO_FRONT_CENTER (1.0 / sqrt (2.0))
+#define RATIO_FRONT_SIDE (1.0 / sqrt (2.0))
+#define RATIO_FRONT_REAR (1.0 / 2.0)
+
+#define RATIO_SIDE_CENTER (1.0 / 2.0)
+#define RATIO_SIDE_FRONT (1.0 / sqrt (2.0))
+#define RATIO_SIDE_REAR (1.0 / sqrt (2.0))
+
+#define RATIO_CENTER_BASS (1.0 / sqrt (2.0))
+#define RATIO_FRONT_BASS (1.0)
+#define RATIO_SIDE_BASS (1.0 / sqrt (2.0))
+#define RATIO_REAR_BASS (1.0 / sqrt (2.0))
+
+static void
+gst_channel_mix_fill_others (AudioConvertCtx * this)
+{
+ gboolean in_has_front = FALSE, out_has_front = FALSE,
+ in_has_center = FALSE, out_has_center = FALSE,
+ in_has_rear = FALSE, out_has_rear = FALSE,
+ in_has_side = FALSE, out_has_side = FALSE,
+ in_has_bass = FALSE, out_has_bass = FALSE;
+ /* LEFT, RIGHT, MONO */
+ gint in_f[3] = { -1, -1, -1 };
+ gint out_f[3] = { -1, -1, -1 };
+ /* LOC, ROC, CENTER */
+ gint in_c[3] = { -1, -1, -1 };
+ gint out_c[3] = { -1, -1, -1 };
+ /* RLEFT, RRIGHT, RCENTER */
+ gint in_r[3] = { -1, -1, -1 };
+ gint out_r[3] = { -1, -1, -1 };
+ /* SLEFT, INVALID, SRIGHT */
+ gint in_s[3] = { -1, -1, -1 };
+ gint out_s[3] = { -1, -1, -1 };
+ /* INVALID, LFE, INVALID */
+ gint in_b[3] = { -1, -1, -1 };
+ gint out_b[3] = { -1, -1, -1 };
+
+ /* First see where (if at all) the various channels from/to
+ * which we want to convert are located in our matrix/array. */
+ gst_channel_mix_detect_pos (&this->in,
+ in_f, &in_has_front,
+ in_c, &in_has_center, in_r, &in_has_rear,
+ in_s, &in_has_side, in_b, &in_has_bass);
+ gst_channel_mix_detect_pos (&this->out,
+ out_f, &out_has_front,
+ out_c, &out_has_center, out_r, &out_has_rear,
+ out_s, &out_has_side, out_b, &out_has_bass);
+
+ /* The general idea here is:
+ * - if the source has a channel that the destination doesn't have mix
+ * it into the nearest available destination channel
+ * - if the destination has a channel that the source doesn't have mix
+ * the nearest source channel into the destination channel
+ *
+ * The ratio for the mixing becomes lower as the distance between the
+ * channels gets larger
+ */
+
+ /* center <-> front/side/rear */
+ if (!in_has_center && in_has_front && out_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_c, RATIO_CENTER_FRONT);
+ } else if (!in_has_center && !in_has_front && in_has_side && out_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_c, RATIO_CENTER_SIDE);
+ } else if (!in_has_center && !in_has_front && !in_has_side && in_has_rear
+ && out_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_r, &this->out,
+ out_c, RATIO_CENTER_REAR);
+ } else if (in_has_center && !out_has_center && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_c, &this->out, out_f, RATIO_CENTER_FRONT);
+ } else if (in_has_center && !out_has_center && !out_has_front && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_c, &this->out, out_s, RATIO_CENTER_SIDE);
+ } else if (in_has_center && !out_has_center && !out_has_front && !out_has_side
+ && out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_c, &this->out,
+ out_r, RATIO_CENTER_REAR);
+ }
+
+ /* front <-> center/side/rear */
+ if (!in_has_front && in_has_center && !in_has_side && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_c, &this->out, out_f, RATIO_CENTER_FRONT);
+ } else if (!in_has_front && !in_has_center && in_has_side && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_f, RATIO_FRONT_SIDE);
+ } else if (!in_has_front && in_has_center && in_has_side && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_c, &this->out, out_f, 0.5 * RATIO_CENTER_FRONT);
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_f, 0.5 * RATIO_FRONT_SIDE);
+ } else if (!in_has_front && !in_has_center && !in_has_side && in_has_rear
+ && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_r, &this->out,
+ out_f, RATIO_FRONT_REAR);
+ } else if (in_has_front && out_has_center && !out_has_side && !out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_c, RATIO_CENTER_FRONT);
+ } else if (in_has_front && !out_has_center && out_has_side && !out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_s, RATIO_FRONT_SIDE);
+ } else if (in_has_front && out_has_center && out_has_side && !out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_c, 0.5 * RATIO_CENTER_FRONT);
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_s, 0.5 * RATIO_FRONT_SIDE);
+ } else if (in_has_front && !out_has_center && !out_has_side && !out_has_front
+ && out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_f, &this->out,
+ out_r, RATIO_FRONT_REAR);
+ }
+
+ /* side <-> center/front/rear */
+ if (!in_has_side && in_has_front && !in_has_rear && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_s, RATIO_FRONT_SIDE);
+ } else if (!in_has_side && !in_has_front && in_has_rear && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_r, &this->out, out_s, RATIO_SIDE_REAR);
+ } else if (!in_has_side && in_has_front && in_has_rear && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_s, 0.5 * RATIO_FRONT_SIDE);
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_r, &this->out, out_s, 0.5 * RATIO_SIDE_REAR);
+ } else if (!in_has_side && !in_has_front && !in_has_rear && in_has_center
+ && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_c, &this->out,
+ out_s, RATIO_CENTER_SIDE);
+ } else if (in_has_side && out_has_front && !out_has_rear && !out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_f, RATIO_FRONT_SIDE);
+ } else if (in_has_side && !out_has_front && out_has_rear && !out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_r, RATIO_SIDE_REAR);
+ } else if (in_has_side && out_has_front && out_has_rear && !out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_f, 0.5 * RATIO_FRONT_SIDE);
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_r, 0.5 * RATIO_SIDE_REAR);
+ } else if (in_has_side && !out_has_front && !out_has_rear && out_has_center
+ && !out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_s, &this->out,
+ out_c, RATIO_CENTER_SIDE);
+ }
+
+ /* rear <-> center/front/side */
+ if (!in_has_rear && in_has_side && out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_r, RATIO_SIDE_REAR);
+ } else if (!in_has_rear && !in_has_side && in_has_front && out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_r, RATIO_FRONT_REAR);
+ } else if (!in_has_rear && !in_has_side && !in_has_front && in_has_center
+ && out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_c, &this->out,
+ out_r, RATIO_CENTER_REAR);
+ } else if (in_has_rear && !out_has_rear && out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_r, &this->out, out_s, RATIO_SIDE_REAR);
+ } else if (in_has_rear && !out_has_rear && !out_has_side && out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_r, &this->out, out_f, RATIO_FRONT_REAR);
+ } else if (in_has_rear && !out_has_rear && !out_has_side && !out_has_front
+ && out_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix, &this->in, in_r, &this->out,
+ out_c, RATIO_CENTER_REAR);
+ }
+
+ /* bass <-> any */
+ if (in_has_bass && !out_has_bass) {
+ if (out_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_b, &this->out, out_c, RATIO_CENTER_BASS);
+ }
+ if (out_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_b, &this->out, out_f, RATIO_FRONT_BASS);
+ }
+ if (out_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_b, &this->out, out_s, RATIO_SIDE_BASS);
+ }
+ if (out_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_b, &this->out, out_r, RATIO_REAR_BASS);
+ }
+ } else if (!in_has_bass && out_has_bass) {
+ if (in_has_center) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_c, &this->out, out_b, RATIO_CENTER_BASS);
+ }
+ if (in_has_front) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_f, &this->out, out_b, RATIO_FRONT_BASS);
+ }
+ if (in_has_side) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_s, &this->out, out_b, RATIO_REAR_BASS);
+ }
+ if (in_has_rear) {
+ gst_channel_mix_fill_one_other (this->matrix,
+ &this->in, in_r, &this->out, out_b, RATIO_REAR_BASS);
+ }
+ }
+}
+
+/*
+ * Normalize output values.
+ */
+
+static void
+gst_channel_mix_fill_normalize (AudioConvertCtx * this)
+{
+ gfloat sum, top = 0;
+ gint i, j;
+
+ for (j = 0; j < this->out.channels; j++) {
+ /* calculate sum */
+ sum = 0.0;
+ for (i = 0; i < this->in.channels; i++) {
+ sum += fabs (this->matrix[i][j]);
+ }
+ if (sum > top) {
+ top = sum;
+ }
+ }
+
+ /* normalize to this */
+ if (top == 0.0)
+ return;
+
+ for (j = 0; j < this->out.channels; j++) {
+ for (i = 0; i < this->in.channels; i++) {
+ this->matrix[i][j] /= top;
+ }
+ }
+}
+
+static gboolean
+gst_channel_mix_fill_special (AudioConvertCtx * this)
+{
+ GstAudioInfo *in = &this->in, *out = &this->out;
+
+ /* Special, standard conversions here */
+
+ /* Mono<->Stereo, just a fast-path */
+ if (in->channels == 2 && out->channels == 1 &&
+ ((in->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT &&
+ in->position[1] == GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT) ||
+ (in->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT &&
+ in->position[1] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT)) &&
+ out->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO) {
+ this->matrix[0][0] = 0.5;
+ this->matrix[1][0] = 0.5;
+ return TRUE;
+ } else if (in->channels == 1 && out->channels == 2 &&
+ ((out->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT &&
+ out->position[1] == GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT) ||
+ (out->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT &&
+ out->position[1] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT)) &&
+ in->position[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO) {
+ this->matrix[0][0] = 1.0;
+ this->matrix[0][1] = 1.0;
+ return TRUE;
+ }
+
+ /* TODO: 5.1 <-> Stereo and other standard conversions */
+
+ return FALSE;
+}
+
+/*
+ * Automagically generate conversion matrix.
+ */
+
+static void
+gst_channel_mix_fill_matrix (AudioConvertCtx * this)
+{
+ if (gst_channel_mix_fill_special (this))
+ return;
+
+ gst_channel_mix_fill_identical (this);
+
+ if (!GST_AUDIO_INFO_HAS_DEFAULT_POSITIONS (&this->in)) {
+ gst_channel_mix_fill_compatible (this);
+ gst_channel_mix_fill_others (this);
+ gst_channel_mix_fill_normalize (this);
+ }
+}
+
+/* only call after this->out and this->in are filled in */
+void
+gst_channel_mix_setup_matrix (AudioConvertCtx * this)
+{
+ gint i, j;
+
+ /* don't lose memory */
+ gst_channel_mix_unset_matrix (this);
+
+ /* temp storage */
+ if (GST_AUDIO_FORMAT_INFO_IS_INTEGER (this->in.finfo) ||
+ GST_AUDIO_FORMAT_INFO_IS_INTEGER (this->out.finfo)) {
+ this->tmp = (gpointer) g_new (gint32, this->out.channels);
+ } else {
+ this->tmp = (gpointer) g_new (gdouble, this->out.channels);
+ }
+
+ /* allocate */
+ this->matrix = g_new0 (gfloat *, this->in.channels);
+ for (i = 0; i < this->in.channels; i++) {
+ this->matrix[i] = g_new (gfloat, this->out.channels);
+ for (j = 0; j < this->out.channels; j++)
+ this->matrix[i][j] = 0.;
+ }
+
+ /* setup the matrix' internal values */
+ gst_channel_mix_fill_matrix (this);
+
+#ifndef GST_DISABLE_GST_DEBUG
+ /* debug */
+ {
+ GString *s;
+ s = g_string_new ("Matrix for");
+ g_string_append_printf (s, " %d -> %d: ",
+ this->in.channels, this->out.channels);
+ g_string_append (s, "{");
+ for (i = 0; i < this->in.channels; i++) {
+ if (i != 0)
+ g_string_append (s, ",");
+ g_string_append (s, " {");
+ for (j = 0; j < this->out.channels; j++) {
+ if (j != 0)
+ g_string_append (s, ",");
+ g_string_append_printf (s, " %f", this->matrix[i][j]);
+ }
+ g_string_append (s, " }");
+ }
+ g_string_append (s, " }");
+ GST_DEBUG ("%s", s->str);
+ g_string_free (s, TRUE);
+ }
+#endif
+}
+
+gboolean
+gst_channel_mix_passthrough (AudioConvertCtx * this)
+{
+ gint i;
+
+ /* only NxN matrices can be identities */
+ if (this->in.channels != this->out.channels)
+ return FALSE;
+
+ /* this assumes a normalized matrix */
+ for (i = 0; i < this->in.channels; i++)
+ if (this->matrix[i][i] != 1.)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* IMPORTANT: out_data == in_data is possible, make sure to not overwrite data
+ * you might need later on! */
+void
+gst_channel_mix_mix_int (AudioConvertCtx * this,
+ gint32 * in_data, gint32 * out_data, gint samples)
+{
+ gint in, out, n;
+ gint64 res;
+ gboolean backwards;
+ gint inchannels, outchannels;
+ gint32 *tmp = (gint32 *) this->tmp;
+
+ g_return_if_fail (this->matrix != NULL);
+ g_return_if_fail (this->tmp != NULL);
+
+ inchannels = this->in.channels;
+ outchannels = this->out.channels;
+ backwards = outchannels > inchannels;
+
+ /* FIXME: use liboil here? */
+ for (n = (backwards ? samples - 1 : 0); n < samples && n >= 0;
+ backwards ? n-- : n++) {
+ for (out = 0; out < outchannels; out++) {
+ /* convert */
+ res = 0;
+ for (in = 0; in < inchannels; in++) {
+ res += in_data[n * inchannels + in] * this->matrix[in][out];
+ }
+
+ /* clip (shouldn't we use doubles instead as intermediate format?) */
+ if (res < G_MININT32)
+ res = G_MININT32;
+ else if (res > G_MAXINT32)
+ res = G_MAXINT32;
+ tmp[out] = res;
+ }
+ memcpy (&out_data[n * outchannels], this->tmp,
+ sizeof (gint32) * outchannels);
+ }
+}
+
+void
+gst_channel_mix_mix_float (AudioConvertCtx * this,
+ gdouble * in_data, gdouble * out_data, gint samples)
+{
+ gint in, out, n;
+ gdouble res;
+ gboolean backwards;
+ gint inchannels, outchannels;
+ gdouble *tmp = (gdouble *) this->tmp;
+
+ g_return_if_fail (this->matrix != NULL);
+ g_return_if_fail (this->tmp != NULL);
+
+ inchannels = this->in.channels;
+ outchannels = this->out.channels;
+ backwards = outchannels > inchannels;
+
+ /* FIXME: use liboil here? */
+ for (n = (backwards ? samples - 1 : 0); n < samples && n >= 0;
+ backwards ? n-- : n++) {
+ for (out = 0; out < outchannels; out++) {
+ /* convert */
+ res = 0.0;
+ for (in = 0; in < inchannels; in++) {
+ res += in_data[n * inchannels + in] * this->matrix[in][out];
+ }
+
+ /* clip (shouldn't we use doubles instead as intermediate format?) */
+ if (res < -1.0)
+ res = -1.0;
+ else if (res > 1.0)
+ res = 1.0;
+ tmp[out] = res;
+ }
+ memcpy (&out_data[n * outchannels], this->tmp,
+ sizeof (gdouble) * outchannels);
+ }
+}
diff --git a/gst/audioconvert/gstchannelmix.h b/gst/audioconvert/gstchannelmix.h
new file mode 100644
index 0000000..e02748e
--- /dev/null
+++ b/gst/audioconvert/gstchannelmix.h
@@ -0,0 +1,56 @@
+/* GStreamer
+ * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * gstchannelmix.h: setup of channel conversion matrices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CHANNEL_MIX_H__
+#define __GST_CHANNEL_MIX_H__
+
+#include <gst/gst.h>
+#include "audioconvert.h"
+
+/*
+ * Delete channel mixer matrix.
+ */
+void gst_channel_mix_unset_matrix (AudioConvertCtx * this);
+
+/*
+ * Setup channel mixer matrix.
+ */
+void gst_channel_mix_setup_matrix (AudioConvertCtx * this);
+
+/*
+ * Checks for passthrough (= identity matrix).
+ */
+gboolean gst_channel_mix_passthrough (AudioConvertCtx * this);
+
+/*
+ * Do actual mixing.
+ */
+void gst_channel_mix_mix_int (AudioConvertCtx * this,
+ gint32 * in_data,
+ gint32 * out_data,
+ gint samples);
+
+void gst_channel_mix_mix_float (AudioConvertCtx * this,
+ gdouble * in_data,
+ gdouble * out_data,
+ gint samples);
+
+#endif /* __GST_CHANNEL_MIX_H__ */
diff --git a/gst/audioconvert/gstfastrandom.h b/gst/audioconvert/gstfastrandom.h
new file mode 100644
index 0000000..022b87e
--- /dev/null
+++ b/gst/audioconvert/gstfastrandom.h
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstfastrandom.h: Fast, bad PNRG
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <glib.h>
+
+#ifndef __GST_FAST_RANDOM__
+#define __GST_FAST_RANDOM__
+
+/* transform [0..2^32] -> [0..1] */
+#define GST_RAND_DOUBLE_TRANSFORM 2.3283064365386962890625e-10
+
+/* This is the base function, implementing a linear congruential generator
+ * and returning a pseudo random number between 0 and 2^32 - 1.
+ */
+static inline guint32
+gst_fast_random_uint32 (void)
+{
+ static guint32 state = 0xdeadbeef;
+
+ return (state = state * 1103515245 + 12345);
+}
+
+static inline guint32
+gst_fast_random_uint32_range (gint32 start, gint32 end)
+{
+ guint64 tmp = gst_fast_random_uint32 ();
+
+ tmp = (tmp * (end - start)) / G_MAXUINT32 + start;
+
+ return (guint32) tmp;
+}
+
+static inline gint32
+gst_fast_random_int32 (void)
+{
+ return (gint32) gst_fast_random_uint32 ();
+}
+
+static inline gint32
+gst_fast_random_int32_range (gint32 start, gint32 end)
+{
+ gint64 tmp = gst_fast_random_uint32 ();
+
+ tmp = (tmp * (end - start)) / G_MAXUINT32 + start;
+
+ return (gint32) tmp;
+}
+
+static inline gdouble
+gst_fast_random_double (void)
+{
+ gdouble ret;
+
+ ret = gst_fast_random_uint32 () * GST_RAND_DOUBLE_TRANSFORM;
+ ret = (ret + gst_fast_random_uint32 ()) * GST_RAND_DOUBLE_TRANSFORM;
+
+ if (ret >= 1.0)
+ return gst_fast_random_double ();
+
+ return ret;
+}
+
+static inline gdouble
+gst_fast_random_double_range (gdouble start, gdouble end)
+{
+ return gst_fast_random_double () * (end - start) + start;
+}
+
+#undef GST_RAND_DOUBLE_TRANSFORM
+
+#endif /* __GST_FAST_RANDOM__ */
+
diff --git a/gst/audioconvert/plugin.c b/gst/audioconvert/plugin.c
new file mode 100644
index 0000000..105f0e9
--- /dev/null
+++ b/gst/audioconvert/plugin.c
@@ -0,0 +1,49 @@
+/* GStreamer audio conversion plugin
+ * Copyright (C) 2004 Andy Wingo <wingo at pobox.com>
+ *
+ * plugin.c: the stubs for the audioconvert 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"
+
+#include <gst/audio/multichannel.h>
+#include "gstaudioconvertorc.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ /* ensure GstAudioChannelPosition type is registered */
+ if (!gst_audio_channel_position_get_type ())
+ return FALSE;
+
+ if (!gst_element_register (plugin, "audioconvert",
+ GST_RANK_PRIMARY, gst_audio_convert_get_type ()))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "audioconvert",
+ "Convert audio to different formats",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/audioconvert/plugin.h b/gst/audioconvert/plugin.h
new file mode 100644
index 0000000..5aa3ec4
--- /dev/null
+++ b/gst/audioconvert/plugin.h
@@ -0,0 +1,35 @@
+/* GStreamer buffer-frames conversion plugin
+ * Copyright (C) 2004 Andy Wingo <wingo at pobox.com>
+ *
+ * plugin.h: the stubs for the buffer-frames-convert 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_AUDIO_CONVERT_H__
+#define __GST_PLUGIN_AUDIO_CONVERT_H__
+
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+GType gst_audio_convert_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLUGIN_AUDIO_CONVERT_H__ */
diff --git a/gst/audiorate/Makefile.am b/gst/audiorate/Makefile.am
new file mode 100644
index 0000000..bcb6625
--- /dev/null
+++ b/gst/audiorate/Makefile.am
@@ -0,0 +1,25 @@
+noinst_HEADERS = gstaudiorate.h
+
+plugin_LTLIBRARIES = libgstaudiorate.la
+
+libgstaudiorate_la_SOURCES = gstaudiorate.c
+libgstaudiorate_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstaudiorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudiorate_la_LIBADD = $(GST_LIBS) \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la
+
+libgstaudiorate_la_LIBTOOLFLAGS = --tag=disable-static
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstaudiorate -:SHARED libgstaudiorate \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudiorate_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiorate_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudiorate_la_LDFLAGS) \
+ $(libgstaudiorate_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/audiorate/Makefile.in b/gst/audiorate/Makefile.in
new file mode 100644
index 0000000..da18e94
--- /dev/null
+++ b/gst/audiorate/Makefile.in
@@ -0,0 +1,771 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/audiorate
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstaudiorate_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la
+am_libgstaudiorate_la_OBJECTS = libgstaudiorate_la-gstaudiorate.lo
+libgstaudiorate_la_OBJECTS = $(am_libgstaudiorate_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstaudiorate_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstaudiorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstaudiorate_la_CFLAGS) $(CFLAGS) \
+ $(libgstaudiorate_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstaudiorate_la_SOURCES)
+DIST_SOURCES = $(libgstaudiorate_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+noinst_HEADERS = gstaudiorate.h
+plugin_LTLIBRARIES = libgstaudiorate.la
+libgstaudiorate_la_SOURCES = gstaudiorate.c
+libgstaudiorate_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstaudiorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudiorate_la_LIBADD = $(GST_LIBS) \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la
+
+libgstaudiorate_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/audiorate/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/audiorate/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
+libgstaudiorate.la: $(libgstaudiorate_la_OBJECTS) $(libgstaudiorate_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstaudiorate_la_LINK) -rpath $(plugindir) $(libgstaudiorate_la_OBJECTS) $(libgstaudiorate_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiorate_la-gstaudiorate.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstaudiorate_la-gstaudiorate.lo: gstaudiorate.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiorate_la_CFLAGS) $(CFLAGS) -MT libgstaudiorate_la-gstaudiorate.lo -MD -MP -MF $(DEPDIR)/libgstaudiorate_la-gstaudiorate.Tpo -c -o libgstaudiorate_la-gstaudiorate.lo `test -f 'gstaudiorate.c' || echo '$(srcdir)/'`gstaudiorate.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiorate_la-gstaudiorate.Tpo $(DEPDIR)/libgstaudiorate_la-gstaudiorate.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiorate.c' object='libgstaudiorate_la-gstaudiorate.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiorate_la_CFLAGS) $(CFLAGS) -c -o libgstaudiorate_la-gstaudiorate.lo `test -f 'gstaudiorate.c' || echo '$(srcdir)/'`gstaudiorate.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstaudiorate -:SHARED libgstaudiorate \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudiorate_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiorate_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudiorate_la_LDFLAGS) \
+ $(libgstaudiorate_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/audiorate/gstaudiorate.c b/gst/audiorate/gstaudiorate.c
new file mode 100644
index 0000000..743933c
--- /dev/null
+++ b/gst/audiorate/gstaudiorate.c
@@ -0,0 +1,769 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-audiorate
+ * @see_also: #GstVideoRate
+ *
+ * This element takes an incoming stream of timestamped raw audio frames and
+ * produces a perfect stream by inserting or dropping samples as needed.
+ *
+ * This operation may be of use to link to elements that require or otherwise
+ * implicitly assume a perfect stream as they do not store timestamps,
+ * but derive this by some means (e.g. bitrate for some AVI cases).
+ *
+ * The properties #GstAudioRate:in, #GstAudioRate:out, #GstAudioRate:add
+ * and #GstAudioRate:drop can be read to obtain information about number of
+ * input samples, output samples, dropped samples (i.e. the number of unused
+ * input samples) and inserted samples (i.e. the number of samples added to
+ * stream).
+ *
+ * When the #GstAudioRate:silent property is set to FALSE, a GObject property
+ * notification will be emitted whenever one of the #GstAudioRate:add or
+ * #GstAudioRate:drop values changes.
+ * This can potentially cause performance degradation.
+ * Note that property notification will happen from the streaming thread, so
+ * applications should be prepared for this.
+ *
+ * If the #GstAudioRate:tolerance property is non-zero, and an incoming buffer's
+ * timestamp deviates less than the property indicates from what would make a
+ * 'perfect time', then no samples will be added or dropped.
+ * Note that the output is still guaranteed to be a perfect stream, which means
+ * that the incoming data is then simply shifted (by less than the indicated
+ * tolerance) to a perfect time.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v alsasrc ! audiorate ! wavenc ! filesink location=alsa.wav
+ * ]| Capture audio from an ALSA device, and turn it into a perfect stream
+ * for saving in a raw audio file.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "gstaudiorate.h"
+
+#define GST_CAT_DEFAULT audio_rate_debug
+GST_DEBUG_CATEGORY_STATIC (audio_rate_debug);
+
+/* GstAudioRate signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_SILENT TRUE
+#define DEFAULT_TOLERANCE 0
+#define DEFAULT_SKIP_TO_FIRST FALSE
+
+enum
+{
+ ARG_0,
+ ARG_IN,
+ ARG_OUT,
+ ARG_ADD,
+ ARG_DROP,
+ ARG_SILENT,
+ ARG_TOLERANCE,
+ ARG_SKIP_TO_FIRST
+};
+
+static GstStaticPadTemplate gst_audio_rate_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))
+ );
+
+static GstStaticPadTemplate gst_audio_rate_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))
+ );
+
+static gboolean gst_audio_rate_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_audio_rate_src_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_audio_rate_chain (GstPad * pad, GstBuffer * buf);
+
+static void gst_audio_rate_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_audio_rate_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstStateChangeReturn gst_audio_rate_change_state (GstElement * element,
+ GstStateChange transition);
+
+/*static guint gst_audio_rate_signals[LAST_SIGNAL] = { 0 }; */
+
+static GParamSpec *pspec_drop = NULL;
+static GParamSpec *pspec_add = NULL;
+
+#define gst_audio_rate_parent_class parent_class
+G_DEFINE_TYPE (GstAudioRate, gst_audio_rate, GST_TYPE_ELEMENT);
+
+static void
+gst_audio_rate_class_init (GstAudioRateClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ object_class->set_property = gst_audio_rate_set_property;
+ object_class->get_property = gst_audio_rate_get_property;
+
+ g_object_class_install_property (object_class, ARG_IN,
+ g_param_spec_uint64 ("in", "In",
+ "Number of input samples", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, ARG_OUT,
+ g_param_spec_uint64 ("out", "Out", "Number of output samples", 0,
+ G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ pspec_add = g_param_spec_uint64 ("add", "Add", "Number of added samples",
+ 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, ARG_ADD, pspec_add);
+ pspec_drop = g_param_spec_uint64 ("drop", "Drop", "Number of dropped samples",
+ 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, ARG_DROP, pspec_drop);
+ g_object_class_install_property (object_class, ARG_SILENT,
+ g_param_spec_boolean ("silent", "silent",
+ "Don't emit notify for dropped and duplicated frames", DEFAULT_SILENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstAudioRate:tolerance
+ *
+ * The difference between incoming timestamp and next timestamp must exceed
+ * the given value for audiorate to add or drop samples.
+ *
+ * Since: 0.10.26
+ **/
+ g_object_class_install_property (object_class, ARG_TOLERANCE,
+ g_param_spec_uint64 ("tolerance", "tolerance",
+ "Only act if timestamp jitter/imperfection exceeds indicated tolerance (ns)",
+ 0, G_MAXUINT64, DEFAULT_TOLERANCE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstAudioRate:skip-to-first:
+ *
+ * Don't produce buffers before the first one we receive.
+ *
+ * Since: 0.10.33
+ **/
+ g_object_class_install_property (object_class, ARG_SKIP_TO_FIRST,
+ g_param_spec_boolean ("skip-to-first", "Skip to first buffer",
+ "Don't produce buffers before the first one we receive",
+ DEFAULT_SKIP_TO_FIRST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (element_class,
+ "Audio rate adjuster", "Filter/Effect/Audio",
+ "Drops/duplicates/adjusts timestamps on audio samples to make a perfect stream",
+ "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_audio_rate_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_audio_rate_src_template));
+
+ element_class->change_state = gst_audio_rate_change_state;
+}
+
+static void
+gst_audio_rate_reset (GstAudioRate * audiorate)
+{
+ audiorate->next_offset = -1;
+ audiorate->next_ts = -1;
+ audiorate->discont = TRUE;
+ gst_segment_init (&audiorate->sink_segment, GST_FORMAT_UNDEFINED);
+ gst_segment_init (&audiorate->src_segment, GST_FORMAT_TIME);
+
+ GST_DEBUG_OBJECT (audiorate, "handle reset");
+}
+
+static gboolean
+gst_audio_rate_setcaps (GstAudioRate * audiorate, GstCaps * caps)
+{
+ GstAudioInfo info;
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto wrong_caps;
+
+ audiorate->info = info;
+
+ return TRUE;
+
+ /* ERRORS */
+wrong_caps:
+ {
+ GST_DEBUG_OBJECT (audiorate, "could not parse caps");
+ return FALSE;
+ }
+}
+
+static void
+gst_audio_rate_init (GstAudioRate * audiorate)
+{
+ audiorate->sinkpad =
+ gst_pad_new_from_static_template (&gst_audio_rate_sink_template, "sink");
+ gst_pad_set_event_function (audiorate->sinkpad, gst_audio_rate_sink_event);
+ gst_pad_set_chain_function (audiorate->sinkpad, gst_audio_rate_chain);
+ gst_pad_set_getcaps_function (audiorate->sinkpad, gst_pad_proxy_getcaps);
+ gst_element_add_pad (GST_ELEMENT (audiorate), audiorate->sinkpad);
+
+ audiorate->srcpad =
+ gst_pad_new_from_static_template (&gst_audio_rate_src_template, "src");
+ gst_pad_set_event_function (audiorate->srcpad, gst_audio_rate_src_event);
+ gst_pad_set_getcaps_function (audiorate->srcpad, gst_pad_proxy_getcaps);
+ gst_element_add_pad (GST_ELEMENT (audiorate), audiorate->srcpad);
+
+ audiorate->in = 0;
+ audiorate->out = 0;
+ audiorate->drop = 0;
+ audiorate->add = 0;
+ audiorate->silent = DEFAULT_SILENT;
+ audiorate->tolerance = DEFAULT_TOLERANCE;
+}
+
+static void
+gst_audio_rate_fill_to_time (GstAudioRate * audiorate, GstClockTime time)
+{
+ GstBuffer *buf;
+
+ GST_DEBUG_OBJECT (audiorate, "next_ts: %" GST_TIME_FORMAT
+ ", filling to %" GST_TIME_FORMAT, GST_TIME_ARGS (audiorate->next_ts),
+ GST_TIME_ARGS (time));
+
+ if (!GST_CLOCK_TIME_IS_VALID (time) ||
+ !GST_CLOCK_TIME_IS_VALID (audiorate->next_ts))
+ return;
+
+ /* feed an empty buffer to chain with the given timestamp,
+ * it will take care of filling */
+ buf = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buf) = time;
+ gst_audio_rate_chain (audiorate->sinkpad, buf);
+}
+
+static gboolean
+gst_audio_rate_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstAudioRate *audiorate;
+
+ audiorate = GST_AUDIO_RATE (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ if ((res = gst_audio_rate_setcaps (audiorate, caps))) {
+ res = gst_pad_push_event (audiorate->srcpad, event);
+ } else {
+ gst_event_unref (event);
+ }
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (audiorate, "handling FLUSH_STOP");
+ gst_audio_rate_reset (audiorate);
+ res = gst_pad_push_event (audiorate->srcpad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &audiorate->sink_segment);
+
+ GST_DEBUG_OBJECT (audiorate, "handle NEWSEGMENT");
+#if 0
+ /* FIXME: bad things will likely happen if rate < 0 ... */
+ if (!update) {
+ /* a new segment starts. We need to figure out what will be the next
+ * sample offset. We mark the offsets as invalid so that the _chain
+ * function will perform this calculation. */
+ gst_audio_rate_fill_to_time (audiorate, audiorate->src_segment.stop);
+#endif
+ audiorate->next_offset = -1;
+ audiorate->next_ts = -1;
+#if 0
+ } else {
+ gst_audio_rate_fill_to_time (audiorate, audiorate->src_segment.start);
+ }
+#endif
+
+ GST_DEBUG_OBJECT (audiorate, "updated segment: %" GST_SEGMENT_FORMAT,
+ &audiorate->sink_segment);
+
+ if (audiorate->sink_segment.format == GST_FORMAT_TIME) {
+ /* TIME formats can be copied to src and forwarded */
+ res = gst_pad_push_event (audiorate->srcpad, event);
+ gst_segment_copy_into (&audiorate->sink_segment,
+ &audiorate->src_segment);
+ } else {
+ /* other formats will be handled in the _chain function */
+ gst_event_unref (event);
+ res = TRUE;
+ }
+ break;
+ }
+ case GST_EVENT_EOS:
+ /* Fill segment until the end */
+ if (GST_CLOCK_TIME_IS_VALID (audiorate->src_segment.stop))
+ gst_audio_rate_fill_to_time (audiorate, audiorate->src_segment.stop);
+ res = gst_pad_push_event (audiorate->srcpad, event);
+ break;
+ default:
+ res = gst_pad_push_event (audiorate->srcpad, event);
+ break;
+ }
+
+ gst_object_unref (audiorate);
+
+ return res;
+}
+
+static gboolean
+gst_audio_rate_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstAudioRate *audiorate;
+
+ audiorate = GST_AUDIO_RATE (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ res = gst_pad_push_event (audiorate->sinkpad, event);
+ break;
+ }
+
+ gst_object_unref (audiorate);
+
+ return res;
+}
+
+static gboolean
+gst_audio_rate_convert (GstAudioRate * audiorate,
+ GstFormat src_fmt, guint64 src_val, GstFormat dest_fmt, guint64 * dest_val)
+{
+ return gst_audio_info_convert (&audiorate->info, src_fmt, src_val, dest_fmt,
+ (gint64 *) dest_val);
+}
+
+
+static gboolean
+gst_audio_rate_convert_segments (GstAudioRate * audiorate)
+{
+ GstFormat src_fmt, dst_fmt;
+
+ src_fmt = audiorate->sink_segment.format;
+ dst_fmt = audiorate->src_segment.format;
+
+#define CONVERT_VAL(field) gst_audio_rate_convert (audiorate, \
+ src_fmt, audiorate->sink_segment.field, \
+ dst_fmt, &audiorate->src_segment.field);
+
+ audiorate->sink_segment.rate = audiorate->src_segment.rate;
+ audiorate->sink_segment.flags = audiorate->src_segment.flags;
+ audiorate->sink_segment.applied_rate = audiorate->src_segment.applied_rate;
+ CONVERT_VAL (start);
+ CONVERT_VAL (stop);
+ CONVERT_VAL (time);
+ CONVERT_VAL (base);
+ CONVERT_VAL (position);
+#undef CONVERT_VAL
+
+ return TRUE;
+}
+
+static void
+gst_audio_rate_notify_drop (GstAudioRate * audiorate)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) audiorate, "drop");
+#else
+ g_object_notify_by_pspec ((GObject *) audiorate, pspec_drop);
+#endif
+}
+
+static void
+gst_audio_rate_notify_add (GstAudioRate * audiorate)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) audiorate, "add");
+#else
+ g_object_notify_by_pspec ((GObject *) audiorate, pspec_add);
+#endif
+}
+
+static GstFlowReturn
+gst_audio_rate_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstAudioRate *audiorate;
+ GstClockTime in_time;
+ guint64 in_offset, in_offset_end, in_samples;
+ guint in_size;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstClockTimeDiff diff;
+ gint rate, bpf;
+
+ audiorate = GST_AUDIO_RATE (gst_pad_get_parent (pad));
+
+ rate = GST_AUDIO_INFO_RATE (&audiorate->info);
+ bpf = GST_AUDIO_INFO_BPF (&audiorate->info);
+
+ /* need to be negotiated now */
+ if (bpf == 0)
+ goto not_negotiated;
+
+ /* we have a new pending segment */
+ if (audiorate->next_offset == -1) {
+ gint64 pos;
+
+ /* update the TIME segment */
+ gst_audio_rate_convert_segments (audiorate);
+
+ /* first buffer, we are negotiated and we have a segment, calculate the
+ * current expected offsets based on the segment.start, which is the first
+ * media time of the segment and should match the media time of the first
+ * buffer in that segment, which is the offset expressed in DEFAULT units.
+ */
+ /* convert first timestamp of segment to sample position */
+ pos = gst_util_uint64_scale_int (audiorate->src_segment.start,
+ GST_AUDIO_INFO_RATE (&audiorate->info), GST_SECOND);
+
+ GST_DEBUG_OBJECT (audiorate, "resync to offset %" G_GINT64_FORMAT, pos);
+
+ /* resyncing is a discont */
+ audiorate->discont = TRUE;
+
+ audiorate->next_offset = pos;
+ audiorate->next_ts = gst_util_uint64_scale_int (audiorate->next_offset,
+ GST_SECOND, GST_AUDIO_INFO_RATE (&audiorate->info));
+
+ if (audiorate->skip_to_first && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ GST_DEBUG_OBJECT (audiorate, "but skipping to first buffer instead");
+ pos = gst_util_uint64_scale_int (GST_BUFFER_TIMESTAMP (buf),
+ GST_AUDIO_INFO_RATE (&audiorate->info), GST_SECOND);
+ GST_DEBUG_OBJECT (audiorate, "so resync to offset %" G_GINT64_FORMAT,
+ pos);
+ audiorate->next_offset = pos;
+ audiorate->next_ts = GST_BUFFER_TIMESTAMP (buf);
+ }
+ }
+
+ audiorate->in++;
+
+ in_time = GST_BUFFER_TIMESTAMP (buf);
+ if (in_time == GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (audiorate, "no timestamp, using expected next time");
+ in_time = audiorate->next_ts;
+ }
+
+ in_size = gst_buffer_get_size (buf);
+ in_samples = in_size / bpf;
+
+ /* calculate the buffer offset */
+ in_offset = gst_util_uint64_scale_int_round (in_time, rate, GST_SECOND);
+ in_offset_end = in_offset + in_samples;
+
+ GST_LOG_OBJECT (audiorate,
+ "in_time:%" GST_TIME_FORMAT ", in_duration:%" GST_TIME_FORMAT
+ ", in_size:%u, in_offset:%" G_GUINT64_FORMAT ", in_offset_end:%"
+ G_GUINT64_FORMAT ", ->next_offset:%" G_GUINT64_FORMAT ", ->next_ts:%"
+ GST_TIME_FORMAT, GST_TIME_ARGS (in_time),
+ GST_TIME_ARGS (GST_FRAMES_TO_CLOCK_TIME (in_samples, rate)),
+ in_size, in_offset, in_offset_end, audiorate->next_offset,
+ GST_TIME_ARGS (audiorate->next_ts));
+
+ diff = in_time - audiorate->next_ts;
+ if (diff <= (GstClockTimeDiff) audiorate->tolerance &&
+ diff >= (GstClockTimeDiff) - audiorate->tolerance) {
+ /* buffer time close enough to expected time,
+ * so produce a perfect stream by simply 'shifting'
+ * it to next ts and offset and sending */
+ GST_LOG_OBJECT (audiorate, "within tolerance %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (audiorate->tolerance));
+ /* The outgoing buffer's offset will be set to ->next_offset, we also
+ * need to adjust the offset_end value accordingly */
+ in_offset_end = audiorate->next_offset + in_samples;
+ goto send;
+ }
+
+ /* do we need to insert samples */
+ if (in_offset > audiorate->next_offset) {
+ GstBuffer *fill;
+ gint fillsize;
+ guint64 fillsamples;
+
+ /* We don't want to allocate a single unreasonably huge buffer - it might
+ be hundreds of megabytes. So, limit each output buffer to one second of
+ audio */
+ fillsamples = in_offset - audiorate->next_offset;
+
+ while (fillsamples > 0) {
+ guint64 cursamples = MIN (fillsamples, rate);
+ guint8 *data;
+
+ fillsamples -= cursamples;
+ fillsize = cursamples * bpf;
+
+ fill = gst_buffer_new_and_alloc (fillsize);
+
+ data = gst_buffer_map (fill, NULL, NULL, GST_MAP_WRITE);
+ /* FIXME, 0 might not be the silence byte for the negotiated format. */
+ memset (data, 0, fillsize);
+ gst_buffer_unmap (fill, data, fillsize);
+
+ GST_DEBUG_OBJECT (audiorate, "inserting %" G_GUINT64_FORMAT " samples",
+ cursamples);
+
+ GST_BUFFER_OFFSET (fill) = audiorate->next_offset;
+ audiorate->next_offset += cursamples;
+ GST_BUFFER_OFFSET_END (fill) = audiorate->next_offset;
+
+ /* Use next timestamp, then calculate following timestamp based on
+ * offset to get duration. Neccesary complexity to get 'perfect'
+ * streams */
+ GST_BUFFER_TIMESTAMP (fill) = audiorate->next_ts;
+ audiorate->next_ts = gst_util_uint64_scale_int (audiorate->next_offset,
+ GST_SECOND, rate);
+ GST_BUFFER_DURATION (fill) = audiorate->next_ts -
+ GST_BUFFER_TIMESTAMP (fill);
+
+ /* we created this buffer to fill a gap */
+ GST_BUFFER_FLAG_SET (fill, GST_BUFFER_FLAG_GAP);
+ /* set discont if it's pending, this is mostly done for the first buffer
+ * and after a flushing seek */
+ if (audiorate->discont) {
+ GST_BUFFER_FLAG_SET (fill, GST_BUFFER_FLAG_DISCONT);
+ audiorate->discont = FALSE;
+ }
+
+ ret = gst_pad_push (audiorate->srcpad, fill);
+ if (ret != GST_FLOW_OK)
+ goto beach;
+ audiorate->out++;
+ audiorate->add += cursamples;
+
+ if (!audiorate->silent)
+ gst_audio_rate_notify_add (audiorate);
+ }
+
+ } else if (in_offset < audiorate->next_offset) {
+ /* need to remove samples */
+ if (in_offset_end <= audiorate->next_offset) {
+ guint64 drop = in_size / bpf;
+
+ audiorate->drop += drop;
+
+ GST_DEBUG_OBJECT (audiorate, "dropping %" G_GUINT64_FORMAT " samples",
+ drop);
+
+ /* we can drop the buffer completely */
+ gst_buffer_unref (buf);
+ buf = NULL;
+
+ if (!audiorate->silent)
+ gst_audio_rate_notify_drop (audiorate);
+
+ goto beach;
+ } else {
+ guint64 truncsamples;
+ guint truncsize, leftsize;
+ GstBuffer *trunc;
+
+ /* truncate buffer */
+ truncsamples = audiorate->next_offset - in_offset;
+ truncsize = truncsamples * bpf;
+ leftsize = in_size - truncsize;
+
+ trunc =
+ gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, truncsize,
+ leftsize);
+
+ gst_buffer_unref (buf);
+ buf = trunc;
+
+ audiorate->drop += truncsamples;
+ GST_DEBUG_OBJECT (audiorate, "truncating %" G_GUINT64_FORMAT " samples",
+ truncsamples);
+
+ if (!audiorate->silent)
+ gst_audio_rate_notify_drop (audiorate);
+ }
+ }
+
+send:
+ if (gst_buffer_get_size (buf) == 0)
+ goto beach;
+
+ /* Now calculate parameters for whichever buffer (either the original
+ * or truncated one) we're pushing. */
+ GST_BUFFER_OFFSET (buf) = audiorate->next_offset;
+ GST_BUFFER_OFFSET_END (buf) = in_offset_end;
+
+ GST_BUFFER_TIMESTAMP (buf) = audiorate->next_ts;
+ audiorate->next_ts = gst_util_uint64_scale_int (in_offset_end,
+ GST_SECOND, rate);
+ GST_BUFFER_DURATION (buf) = audiorate->next_ts - GST_BUFFER_TIMESTAMP (buf);
+
+ if (audiorate->discont) {
+ /* we need to output a discont buffer, do so now */
+ GST_DEBUG_OBJECT (audiorate, "marking DISCONT on output buffer");
+ buf = gst_buffer_make_writable (buf);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ audiorate->discont = FALSE;
+ } else if (GST_BUFFER_IS_DISCONT (buf)) {
+ /* else we make everything continuous so we can safely remove the DISCONT
+ * flag from the buffer if there was one */
+ GST_DEBUG_OBJECT (audiorate, "removing DISCONT from buffer");
+ buf = gst_buffer_make_writable (buf);
+ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
+ }
+
+ /* set last_stop on segment */
+ audiorate->src_segment.position =
+ GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf);
+
+ ret = gst_pad_push (audiorate->srcpad, buf);
+ buf = NULL;
+ audiorate->out++;
+
+ audiorate->next_offset = in_offset_end;
+beach:
+
+ if (buf)
+ gst_buffer_unref (buf);
+
+ gst_object_unref (audiorate);
+
+ return ret;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ gst_buffer_unref (buf);
+
+ GST_ELEMENT_ERROR (audiorate, STREAM, FORMAT,
+ (NULL), ("pipeline error, format was not negotiated"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+}
+
+static void
+gst_audio_rate_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstAudioRate *audiorate = GST_AUDIO_RATE (object);
+
+ switch (prop_id) {
+ case ARG_SILENT:
+ audiorate->silent = g_value_get_boolean (value);
+ break;
+ case ARG_TOLERANCE:
+ audiorate->tolerance = g_value_get_uint64 (value);
+ break;
+ case ARG_SKIP_TO_FIRST:
+ audiorate->skip_to_first = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_rate_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstAudioRate *audiorate = GST_AUDIO_RATE (object);
+
+ switch (prop_id) {
+ case ARG_IN:
+ g_value_set_uint64 (value, audiorate->in);
+ break;
+ case ARG_OUT:
+ g_value_set_uint64 (value, audiorate->out);
+ break;
+ case ARG_ADD:
+ g_value_set_uint64 (value, audiorate->add);
+ break;
+ case ARG_DROP:
+ g_value_set_uint64 (value, audiorate->drop);
+ break;
+ case ARG_SILENT:
+ g_value_set_boolean (value, audiorate->silent);
+ break;
+ case ARG_TOLERANCE:
+ g_value_set_uint64 (value, audiorate->tolerance);
+ break;
+ case ARG_SKIP_TO_FIRST:
+ g_value_set_boolean (value, audiorate->skip_to_first);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_audio_rate_change_state (GstElement * element, GstStateChange transition)
+{
+ GstAudioRate *audiorate = GST_AUDIO_RATE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ audiorate->in = 0;
+ audiorate->out = 0;
+ audiorate->drop = 0;
+ audiorate->add = 0;
+ gst_audio_info_init (&audiorate->info);
+ gst_audio_rate_reset (audiorate);
+ break;
+ default:
+ break;
+ }
+
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (audio_rate_debug, "audiorate", 0,
+ "AudioRate stream fixer");
+
+ return gst_element_register (plugin, "audiorate", GST_RANK_NONE,
+ GST_TYPE_AUDIO_RATE);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "audiorate",
+ "Adjusts audio frames",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/audiorate/gstaudiorate.h b/gst/audiorate/gstaudiorate.h
new file mode 100644
index 0000000..b0b191e
--- /dev/null
+++ b/gst/audiorate/gstaudiorate.h
@@ -0,0 +1,84 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_AUDIO_RATE_H__
+#define __GST_AUDIO_RATE_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_RATE \
+ (gst_audio_rate_get_type())
+#define GST_AUDIO_RATE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_RATE,GstAudioRate))
+#define GST_AUDIO_RATE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_RATE,GstAudioRate))
+#define GST_IS_AUDIO_RATE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_RATE))
+#define GST_IS_AUDIO_RATE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_RATE))
+
+typedef struct _GstAudioRate GstAudioRate;
+typedef struct _GstAudioRateClass GstAudioRateClass;
+
+/**
+ * GstAudioRate:
+ *
+ * Opaque data structure.
+ */
+struct _GstAudioRate
+{
+ GstElement element;
+
+ GstPad *sinkpad, *srcpad;
+
+ /* audio format */
+ GstAudioInfo info;
+
+ /* stats */
+ guint64 in, out, add, drop;
+ gboolean silent;
+ guint64 tolerance;
+ gboolean skip_to_first;
+
+ /* audio state */
+ guint64 next_offset;
+ guint64 next_ts;
+
+ gboolean discont;
+
+ gboolean new_segment;
+ /* we accept all formats on the sink */
+ GstSegment sink_segment;
+ /* we output TIME format on the src */
+ GstSegment src_segment;
+};
+
+struct _GstAudioRateClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_audio_rate_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_RATE_H__ */
diff --git a/gst/audioresample/Makefile.am b/gst/audioresample/Makefile.am
new file mode 100644
index 0000000..9c2999c
--- /dev/null
+++ b/gst/audioresample/Makefile.am
@@ -0,0 +1,57 @@
+plugin_LTLIBRARIES = libgstaudioresample.la
+
+# FIXME: we still link against orc if it's there, even if --disable-orc was used
+if HAVE_ORC
+ORC_TEST_LIBS = -lorc-test-0.4
+else
+ORC_TEST_LIBS =
+endif
+
+libgstaudioresample_la_SOURCES = \
+ gstaudioresample.c \
+ speex_resampler_int.c \
+ speex_resampler_float.c \
+ speex_resampler_double.c
+
+libgstaudioresample_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ORC_CFLAGS)
+
+libgstaudioresample_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS) $(ORC_TEST_LIBS) \
+ $(LIBM)
+
+libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudioresample_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ arch.h \
+ fixed_arm4.h \
+ fixed_arm5e.h \
+ fixed_bfin.h \
+ fixed_debug.h \
+ fixed_generic.h \
+ gstaudioresample.h \
+ resample.c \
+ resample_sse.h \
+ speex_resampler.h \
+ speex_resampler_wrapper.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstaudioresample -:SHARED libgstaudioresample \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudioresample_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudioresample_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudioresample_la_LDFLAGS) \
+ $(libgstaudioresample_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/audioresample/Makefile.in b/gst/audioresample/Makefile.in
new file mode 100644
index 0000000..7f8df9f
--- /dev/null
+++ b/gst/audioresample/Makefile.in
@@ -0,0 +1,834 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/audioresample
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstaudioresample_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstaudioresample_la_OBJECTS = \
+ libgstaudioresample_la-gstaudioresample.lo \
+ libgstaudioresample_la-speex_resampler_int.lo \
+ libgstaudioresample_la-speex_resampler_float.lo \
+ libgstaudioresample_la-speex_resampler_double.lo
+libgstaudioresample_la_OBJECTS = $(am_libgstaudioresample_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstaudioresample_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) \
+ $(libgstaudioresample_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstaudioresample_la_SOURCES)
+DIST_SOURCES = $(libgstaudioresample_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstaudioresample.la
+@HAVE_ORC_FALSE@ORC_TEST_LIBS =
+
+# FIXME: we still link against orc if it's there, even if --disable-orc was used
+@HAVE_ORC_TRUE@ORC_TEST_LIBS = -lorc-test-0.4
+libgstaudioresample_la_SOURCES = \
+ gstaudioresample.c \
+ speex_resampler_int.c \
+ speex_resampler_float.c \
+ speex_resampler_double.c
+
+libgstaudioresample_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ORC_CFLAGS)
+
+libgstaudioresample_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS) $(ORC_TEST_LIBS) \
+ $(LIBM)
+
+libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudioresample_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ arch.h \
+ fixed_arm4.h \
+ fixed_arm5e.h \
+ fixed_bfin.h \
+ fixed_debug.h \
+ fixed_generic.h \
+ gstaudioresample.h \
+ resample.c \
+ resample_sse.h \
+ speex_resampler.h \
+ speex_resampler_wrapper.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/audioresample/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/audioresample/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
+libgstaudioresample.la: $(libgstaudioresample_la_OBJECTS) $(libgstaudioresample_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstaudioresample_la_LINK) -rpath $(plugindir) $(libgstaudioresample_la_OBJECTS) $(libgstaudioresample_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioresample_la-gstaudioresample.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioresample_la-speex_resampler_double.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioresample_la-speex_resampler_float.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioresample_la-speex_resampler_int.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstaudioresample_la-gstaudioresample.lo: gstaudioresample.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -MT libgstaudioresample_la-gstaudioresample.lo -MD -MP -MF $(DEPDIR)/libgstaudioresample_la-gstaudioresample.Tpo -c -o libgstaudioresample_la-gstaudioresample.lo `test -f 'gstaudioresample.c' || echo '$(srcdir)/'`gstaudioresample.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioresample_la-gstaudioresample.Tpo $(DEPDIR)/libgstaudioresample_la-gstaudioresample.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudioresample.c' object='libgstaudioresample_la-gstaudioresample.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -c -o libgstaudioresample_la-gstaudioresample.lo `test -f 'gstaudioresample.c' || echo '$(srcdir)/'`gstaudioresample.c
+
+libgstaudioresample_la-speex_resampler_int.lo: speex_resampler_int.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -MT libgstaudioresample_la-speex_resampler_int.lo -MD -MP -MF $(DEPDIR)/libgstaudioresample_la-speex_resampler_int.Tpo -c -o libgstaudioresample_la-speex_resampler_int.lo `test -f 'speex_resampler_int.c' || echo '$(srcdir)/'`speex_resampler_int.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioresample_la-speex_resampler_int.Tpo $(DEPDIR)/libgstaudioresample_la-speex_resampler_int.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='speex_resampler_int.c' object='libgstaudioresample_la-speex_resampler_int.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -c -o libgstaudioresample_la-speex_resampler_int.lo `test -f 'speex_resampler_int.c' || echo '$(srcdir)/'`speex_resampler_int.c
+
+libgstaudioresample_la-speex_resampler_float.lo: speex_resampler_float.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -MT libgstaudioresample_la-speex_resampler_float.lo -MD -MP -MF $(DEPDIR)/libgstaudioresample_la-speex_resampler_float.Tpo -c -o libgstaudioresample_la-speex_resampler_float.lo `test -f 'speex_resampler_float.c' || echo '$(srcdir)/'`speex_resampler_float.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioresample_la-speex_resampler_float.Tpo $(DEPDIR)/libgstaudioresample_la-speex_resampler_float.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='speex_resampler_float.c' object='libgstaudioresample_la-speex_resampler_float.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -c -o libgstaudioresample_la-speex_resampler_float.lo `test -f 'speex_resampler_float.c' || echo '$(srcdir)/'`speex_resampler_float.c
+
+libgstaudioresample_la-speex_resampler_double.lo: speex_resampler_double.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -MT libgstaudioresample_la-speex_resampler_double.lo -MD -MP -MF $(DEPDIR)/libgstaudioresample_la-speex_resampler_double.Tpo -c -o libgstaudioresample_la-speex_resampler_double.lo `test -f 'speex_resampler_double.c' || echo '$(srcdir)/'`speex_resampler_double.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioresample_la-speex_resampler_double.Tpo $(DEPDIR)/libgstaudioresample_la-speex_resampler_double.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='speex_resampler_double.c' object='libgstaudioresample_la-speex_resampler_double.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioresample_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioresample_la_CFLAGS) $(CFLAGS) -c -o libgstaudioresample_la-speex_resampler_double.lo `test -f 'speex_resampler_double.c' || echo '$(srcdir)/'`speex_resampler_double.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstaudioresample -:SHARED libgstaudioresample \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudioresample_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudioresample_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudioresample_la_LDFLAGS) \
+ $(libgstaudioresample_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/audioresample/README b/gst/audioresample/README
new file mode 100644
index 0000000..faab16f
--- /dev/null
+++ b/gst/audioresample/README
@@ -0,0 +1,347 @@
+ arch.h
+ fixed_arm4.h
+ fixed_arm5e.h
+ fixed_bfin.h
+ fixed_debug.h
+ fixed_generic.h
+ resample.c
+ speex_resampler.h
+
+are taken from http://git.xiph.org/speex.git/ as of 2009-11-10.
+
+The only changes are:
+
+diff -Naur old/arch.h new/arch.h
+--- old/arch.h 2009-11-10 12:18:29.000000000 +0100
++++ new/arch.h 2009-11-10 12:19:09.000000000 +0100
+@@ -78,7 +78,10 @@
+ #include "../include/speex/speex_types.h"
+ #endif
+
++#ifndef ABS
+ #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */
++#endif
++
+ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */
+ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */
+ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */
+@@ -134,6 +137,28 @@
+
+ #else
+
++#ifdef DOUBLE_PRECISION
++typedef double spx_mem_t;
++typedef double spx_coef_t;
++typedef double spx_lsp_t;
++typedef double spx_sig_t;
++typedef double spx_word16_t;
++typedef double spx_word32_t;
++
++#define Q15ONE 1.0
++#define LPC_SCALING 1.
++#define SIG_SCALING 1.
++#define LSP_SCALING 1.
++#define GAMMA_SCALING 1.
++#define GAIN_SCALING 1.
++#define GAIN_SCALING_1 1.
++
++
++#define VERY_SMALL 1e-20
++#define VERY_LARGE32 1e20
++#define VERY_LARGE16 1e20
++#define Q15_ONE ((spx_word16_t)1.)
++#else /* !DOUBLE_PRECISION */
+ typedef float spx_mem_t;
+ typedef float spx_coef_t;
+ typedef float spx_lsp_t;
+@@ -154,6 +179,7 @@
+ #define VERY_LARGE32 1e15f
+ #define VERY_LARGE16 1e15f
+ #define Q15_ONE ((spx_word16_t)1.f)
++#endif /* DOUBLE_PRECISION */
+
+ #define QCONST16(x,bits) (x)
+ #define QCONST32(x,bits) (x)
+diff -Naur old/resample.c new/resample.c
+--- old/resample.c 2009-11-10 12:18:51.000000000 +0100
++++ new/resample.c 2009-11-10 12:19:09.000000000 +0100
+@@ -63,22 +63,27 @@
+
+ #ifdef OUTSIDE_SPEEX
+ #include <stdlib.h>
+-static void *
++
++#include <glib.h>
++
++#define EXPORT G_GNUC_INTERNAL
++
++static inline void *
+ speex_alloc (int size)
+ {
+- return calloc (size, 1);
++ return g_malloc0 (size);
+ }
+
+-static void *
++static inline void *
+ speex_realloc (void *ptr, int size)
+ {
+- return realloc (ptr, size);
++ return g_realloc (ptr, size);
+ }
+
+-static void
++static inline void
+ speex_free (void *ptr)
+ {
+- free (ptr);
++ g_free (ptr);
+ }
+
+ #include "speex_resampler.h"
+@@ -90,7 +95,6 @@
+ #include "os_support.h"
+ #endif /* OUTSIDE_SPEEX */
+
+-#include "stack_alloc.h"
+ #include <math.h>
+
+ #ifndef M_PI
+@@ -263,10 +267,17 @@
+ };
+
+ /*8,24,40,56,80,104,128,160,200,256,320*/
++#ifdef DOUBLE_PRECISION
++static double
++compute_func (double x, struct FuncDef *func)
++{
++ double y, frac;
++#else
+ static double
+ compute_func (float x, struct FuncDef *func)
+ {
+ float y, frac;
++#endif
+ double interp[4];
+ int ind;
+ y = x * func->oversample;
+@@ -317,11 +328,19 @@
+ }
+ #else
+ /* The slow way of computing a sinc for the table. Should improve that some day */
++#ifdef DOUBLE_PRECISION
++static spx_word16_t
++sinc (double cutoff, double x, int N, struct FuncDef *window_func)
++{
++ /*fprintf (stderr, "%f ", x); */
++ double xx = x * cutoff;
++#else
+ static spx_word16_t
+ sinc (float cutoff, float x, int N, struct FuncDef *window_func)
+ {
+ /*fprintf (stderr, "%f ", x); */
+ float xx = x * cutoff;
++#endif
+ if (fabs (x) < 1e-6)
+ return cutoff;
+ else if (fabs (x) > .5 * N)
+@@ -372,6 +391,7 @@
+ }
+ #endif
+
++#ifndef DOUBLE_PRECISION
+ static int
+ resampler_basic_direct_single (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+@@ -428,6 +448,7 @@
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+ }
++#endif
+
+ #ifdef FIXED_POINT
+ #else
+@@ -483,6 +504,7 @@
+ }
+ #endif
+
++#ifndef DOUBLE_PRECISION
+ static int
+ resampler_basic_interpolate_single (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+@@ -562,6 +584,7 @@
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+ }
++#endif
+
+ #ifdef FIXED_POINT
+ #else
+@@ -592,10 +615,16 @@
+ PDIV32 (SHL32 ((samp_frac_num * st->oversample) % st->den_rate, 15),
+ st->den_rate);
+ #else
++#ifdef DOUBLE_PRECISION
++ const spx_word16_t frac =
++ ((double) ((samp_frac_num * st->oversample) % st->den_rate)) /
++ st->den_rate;
++#else
+ const spx_word16_t frac =
+ ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
+ st->den_rate;
+ #endif
++#endif
+ spx_word16_t interp[4];
+
+
+@@ -696,20 +725,27 @@
+ spx_int32_t j;
+ for (j = 0; j < st->filt_len; j++) {
+ st->sinc_table[i * st->filt_len + j] =
+- sinc (st->cutoff,
+- ((j - (spx_int32_t) st->filt_len / 2 + 1) -
++ sinc (st->cutoff, ((j - (spx_int32_t) st->filt_len / 2 + 1) -
++#ifdef DOUBLE_PRECISION
++ ((double) i) / st->den_rate), st->filt_len,
++#else
+ ((float) i) / st->den_rate), st->filt_len,
++#endif
+ quality_map[st->quality].window_func);
+ }
+ }
+ #ifdef FIXED_POINT
+ st->resampler_ptr = resampler_basic_direct_single;
+ #else
++#ifdef DOUBLE_PRECISION
++ st->resampler_ptr = resampler_basic_direct_double;
++#else
+ if (st->quality > 8)
+ st->resampler_ptr = resampler_basic_direct_double;
+ else
+ st->resampler_ptr = resampler_basic_direct_single;
+ #endif
++#endif
+ /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff); */
+ } else {
+ spx_int32_t i;
+@@ -725,16 +761,24 @@
+ }
+ for (i = -4; i < (spx_int32_t) (st->oversample * st->filt_len + 4); i++)
+ st->sinc_table[i + 4] =
++#ifdef DOUBLE_PRECISION
++ sinc (st->cutoff, (i / (double) st->oversample - st->filt_len / 2),
++#else
+ sinc (st->cutoff, (i / (float) st->oversample - st->filt_len / 2),
++#endif
+ st->filt_len, quality_map[st->quality].window_func);
+ #ifdef FIXED_POINT
+ st->resampler_ptr = resampler_basic_interpolate_single;
+ #else
++#ifdef DOUBLE_PRECISION
++ st->resampler_ptr = resampler_basic_interpolate_double;
++#else
+ if (st->quality > 8)
+ st->resampler_ptr = resampler_basic_interpolate_double;
+ else
+ st->resampler_ptr = resampler_basic_interpolate_single;
+ #endif
++#endif
+ /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff); */
+ }
+ st->int_advance = st->num_rate / st->den_rate;
+@@ -964,11 +1008,18 @@
+ spx_uint32_t channel_index, const spx_int16_t * in, spx_uint32_t * in_len,
+ spx_int16_t * out, spx_uint32_t * out_len)
+ #else
++#ifdef DOUBLE_PRECISION
++EXPORT int
++speex_resampler_process_float (SpeexResamplerState * st,
++ spx_uint32_t channel_index, const double *in, spx_uint32_t * in_len,
++ double *out, spx_uint32_t * out_len)
++#else
+ EXPORT int
+ speex_resampler_process_float (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const float *in, spx_uint32_t * in_len,
+ float *out, spx_uint32_t * out_len)
+ #endif
++#endif
+ {
+ int j;
+ spx_uint32_t ilen = *in_len;
+@@ -1086,9 +1137,16 @@
+ return RESAMPLER_ERR_SUCCESS;
+ }
+
++#ifdef DOUBLE_PRECISION
++EXPORT int
++speex_resampler_process_interleaved_float (SpeexResamplerState * st,
++ const double *in, spx_uint32_t * in_len, double *out,
++ spx_uint32_t * out_len)
++#else
+ EXPORT int
+ speex_resampler_process_interleaved_float (SpeexResamplerState * st,
+ const float *in, spx_uint32_t * in_len, float *out, spx_uint32_t * out_len)
++#endif
+ {
+ spx_uint32_t i;
+ int istride_save, ostride_save;
+diff -Naur old/speex_resampler.h new/speex_resampler.h
+--- old/speex_resampler.h 2009-11-10 12:18:09.000000000 +0100
++++ new/speex_resampler.h 2009-11-10 12:19:09.000000000 +0100
+@@ -77,10 +77,10 @@
+ #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
+ #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
+
+-#define spx_int16_t short
+-#define spx_int32_t int
+-#define spx_uint16_t unsigned short
+-#define spx_uint32_t unsigned int
++#define spx_int16_t gint16
++#define spx_int32_t gint32
++#define spx_uint16_t guint16
++#define spx_uint32_t guint32
+
+ #else /* OUTSIDE_SPEEX */
+
+@@ -166,12 +166,21 @@
+ * @param out Output buffer
+ * @param out_len Size of the output buffer. Returns the number of samples written
+ */
++#ifdef DOUBLE_PRECISION
++int speex_resampler_process_float(SpeexResamplerState *st,
++ spx_uint32_t channel_index,
++ const double *in,
++ spx_uint32_t *in_len,
++ double *out,
++ spx_uint32_t *out_len);
++#else
+ int speex_resampler_process_float(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
+ spx_uint32_t *out_len);
++#endif
+
+ /** Resample an int array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
+@@ -199,11 +208,19 @@
+ * @param out_len Size of the output buffer. Returns the number of samples written.
+ * This is all per-channel.
+ */
++#ifdef DOUBLE_PRECISION
++int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
++ const double *in,
++ spx_uint32_t *in_len,
++ double *out,
++ spx_uint32_t *out_len);
++#else
+ int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
+ spx_uint32_t *out_len);
++#endif
+
+ /** Resample an interleaved int array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
diff --git a/gst/audioresample/arch.h b/gst/audioresample/arch.h
new file mode 100644
index 0000000..c518458
--- /dev/null
+++ b/gst/audioresample/arch.h
@@ -0,0 +1,265 @@
+/* Copyright (C) 2003 Jean-Marc Valin */
+/**
+ @file arch.h
+ @brief Various architecture definitions Speex
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef ARCH_H
+#define ARCH_H
+
+#ifndef SPEEX_VERSION
+#define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */
+#define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */
+#define SPEEX_MICRO_VERSION 15 /**< Micro Speex version. */
+#define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */
+#define SPEEX_VERSION "speex-1.2beta3" /**< Speex version string. */
+#endif
+
+/* A couple test to catch stupid option combinations */
+#ifdef FIXED_POINT
+
+#ifdef FLOATING_POINT
+#error You cannot compile as floating point and fixed point at the same time
+#endif
+#ifdef _USE_SSE
+#error SSE is only for floating-point
+#endif
+#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM))
+#error Make up your mind. What CPU do you have?
+#endif
+#ifdef VORBIS_PSYCHO
+#error Vorbis-psy model currently not implemented in fixed-point
+#endif
+
+#else
+
+#ifndef FLOATING_POINT
+#error You now need to define either FIXED_POINT or FLOATING_POINT
+#endif
+#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM)
+#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions?
+#endif
+#ifdef FIXED_POINT_DEBUG
+#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?"
+#endif
+
+
+#endif
+
+#ifndef OUTSIDE_SPEEX
+#include "../include/speex/speex_types.h"
+#endif
+
+#ifndef ABS
+#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */
+#endif
+
+#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */
+#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */
+#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */
+#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */
+#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */
+#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
+
+#ifdef FIXED_POINT
+
+typedef spx_int16_t spx_word16_t;
+typedef spx_int32_t spx_word32_t;
+typedef spx_word32_t spx_mem_t;
+typedef spx_word16_t spx_coef_t;
+typedef spx_word16_t spx_lsp_t;
+typedef spx_word32_t spx_sig_t;
+
+#define Q15ONE 32767
+
+#define LPC_SCALING 8192
+#define SIG_SCALING 16384
+#define LSP_SCALING 8192.
+#define GAMMA_SCALING 32768.
+#define GAIN_SCALING 64
+#define GAIN_SCALING_1 0.015625
+
+#define LPC_SHIFT 13
+#define LSP_SHIFT 13
+#define SIG_SHIFT 14
+#define GAIN_SHIFT 6
+
+#define VERY_SMALL 0
+#define VERY_LARGE32 ((spx_word32_t)2147483647)
+#define VERY_LARGE16 ((spx_word16_t)32767)
+#define Q15_ONE ((spx_word16_t)32767)
+
+
+#ifdef FIXED_DEBUG
+#include "fixed_debug.h"
+#else
+
+#include "fixed_generic.h"
+
+#ifdef ARM5E_ASM
+#include "fixed_arm5e.h"
+#elif defined (ARM4_ASM)
+#include "fixed_arm4.h"
+#elif defined (BFIN_ASM)
+#include "fixed_bfin.h"
+#endif
+
+#endif
+
+
+#else
+
+#ifdef DOUBLE_PRECISION
+typedef double spx_mem_t;
+typedef double spx_coef_t;
+typedef double spx_lsp_t;
+typedef double spx_sig_t;
+typedef double spx_word16_t;
+typedef double spx_word32_t;
+
+#define Q15ONE 1.0
+#define LPC_SCALING 1.
+#define SIG_SCALING 1.
+#define LSP_SCALING 1.
+#define GAMMA_SCALING 1.
+#define GAIN_SCALING 1.
+#define GAIN_SCALING_1 1.
+
+
+#define VERY_SMALL 1e-20
+#define VERY_LARGE32 1e20
+#define VERY_LARGE16 1e20
+#define Q15_ONE ((spx_word16_t)1.)
+#else /* !DOUBLE_PRECISION */
+typedef float spx_mem_t;
+typedef float spx_coef_t;
+typedef float spx_lsp_t;
+typedef float spx_sig_t;
+typedef float spx_word16_t;
+typedef float spx_word32_t;
+
+#define Q15ONE 1.0f
+#define LPC_SCALING 1.f
+#define SIG_SCALING 1.f
+#define LSP_SCALING 1.f
+#define GAMMA_SCALING 1.f
+#define GAIN_SCALING 1.f
+#define GAIN_SCALING_1 1.f
+
+
+#define VERY_SMALL 1e-15f
+#define VERY_LARGE32 1e15f
+#define VERY_LARGE16 1e15f
+#define Q15_ONE ((spx_word16_t)1.f)
+#endif /* DOUBLE_PRECISION */
+
+#define QCONST16(x,bits) (x)
+#define QCONST32(x,bits) (x)
+
+#define NEG16(x) (-(x))
+#define NEG32(x) (-(x))
+#define EXTRACT16(x) (x)
+#define EXTEND32(x) (x)
+#define SHR16(a,shift) (a)
+#define SHL16(a,shift) (a)
+#define SHR32(a,shift) (a)
+#define SHL32(a,shift) (a)
+#define PSHR16(a,shift) (a)
+#define PSHR32(a,shift) (a)
+#define VSHR32(a,shift) (a)
+#define SATURATE16(x,a) (x)
+#define SATURATE32(x,a) (x)
+
+#define PSHR(a,shift) (a)
+#define SHR(a,shift) (a)
+#define SHL(a,shift) (a)
+#define SATURATE(x,a) (x)
+
+#define ADD16(a,b) ((a)+(b))
+#define SUB16(a,b) ((a)-(b))
+#define ADD32(a,b) ((a)+(b))
+#define SUB32(a,b) ((a)-(b))
+#define MULT16_16_16(a,b) ((a)*(b))
+#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b))
+#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b))
+
+#define MULT16_32_Q11(a,b) ((a)*(b))
+#define MULT16_32_Q13(a,b) ((a)*(b))
+#define MULT16_32_Q14(a,b) ((a)*(b))
+#define MULT16_32_Q15(a,b) ((a)*(b))
+#define MULT16_32_P15(a,b) ((a)*(b))
+
+#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b))
+#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b))
+
+#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b))
+#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b))
+#define MAC16_16_P13(c,a,b) ((c)+(a)*(b))
+#define MULT16_16_Q11_32(a,b) ((a)*(b))
+#define MULT16_16_Q13(a,b) ((a)*(b))
+#define MULT16_16_Q14(a,b) ((a)*(b))
+#define MULT16_16_Q15(a,b) ((a)*(b))
+#define MULT16_16_P15(a,b) ((a)*(b))
+#define MULT16_16_P13(a,b) ((a)*(b))
+#define MULT16_16_P14(a,b) ((a)*(b))
+
+#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b))
+#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b))
+#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b))
+#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b))
+
+
+#endif
+
+
+#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
+
+/* 2 on TI C5x DSP */
+#define BYTES_PER_CHAR 2
+#define BITS_PER_CHAR 16
+#define LOG2_BITS_PER_CHAR 4
+
+#else
+
+#define BYTES_PER_CHAR 1
+#define BITS_PER_CHAR 8
+#define LOG2_BITS_PER_CHAR 3
+
+#endif
+
+
+
+#ifdef FIXED_DEBUG
+extern long long spx_mips;
+#endif
+
+
+#endif
diff --git a/gst/audioresample/fixed_arm4.h b/gst/audioresample/fixed_arm4.h
new file mode 100644
index 0000000..b6981ca
--- /dev/null
+++ b/gst/audioresample/fixed_arm4.h
@@ -0,0 +1,148 @@
+/* Copyright (C) 2004 Jean-Marc Valin */
+/**
+ @file fixed_arm4.h
+ @brief ARM4 fixed-point operations
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef FIXED_ARM4_H
+#define FIXED_ARM4_H
+
+#undef MULT16_32_Q14
+static inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) {
+ int res;
+ int dummy;
+ asm (
+ "smull %0,%1,%2,%3 \n\t"
+ "mov %0, %0, lsr #14 \n\t"
+ "add %0, %0, %1, lsl #18 \n\t"
+ : "=&r"(res), "=&r" (dummy)
+ : "r"(y),"r"((int)x));
+ return(res);
+}
+
+#undef MULT16_32_Q15
+static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
+ int res;
+ int dummy;
+ asm (
+ "smull %0,%1,%2,%3 \n\t"
+ "mov %0, %0, lsr #15 \n\t"
+ "add %0, %0, %1, lsl #17 \n\t"
+ : "=&r"(res), "=&r" (dummy)
+ : "r"(y),"r"((int)x));
+ return(res);
+}
+
+#undef DIV32_16
+static inline short DIV32_16(int a, int b)
+{
+ int res=0;
+ int dead1, dead2, dead3, dead4, dead5;
+ __asm__ __volatile__ (
+ "\teor %5, %0, %1\n"
+ "\tmovs %4, %0\n"
+ "\trsbmi %0, %0, #0 \n"
+ "\tmovs %4, %1\n"
+ "\trsbmi %1, %1, #0 \n"
+ "\tmov %4, #1\n"
+
+ "\tsubs %3, %0, %1, asl #14 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #14 \n"
+
+ "\tsubs %3, %0, %1, asl #13 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #13 \n"
+
+ "\tsubs %3, %0, %1, asl #12 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #12 \n"
+
+ "\tsubs %3, %0, %1, asl #11 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #11 \n"
+
+ "\tsubs %3, %0, %1, asl #10 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #10 \n"
+
+ "\tsubs %3, %0, %1, asl #9 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #9 \n"
+
+ "\tsubs %3, %0, %1, asl #8 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #8 \n"
+
+ "\tsubs %3, %0, %1, asl #7 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #7 \n"
+
+ "\tsubs %3, %0, %1, asl #6 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #6 \n"
+
+ "\tsubs %3, %0, %1, asl #5 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #5 \n"
+
+ "\tsubs %3, %0, %1, asl #4 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #4 \n"
+
+ "\tsubs %3, %0, %1, asl #3 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #3 \n"
+
+ "\tsubs %3, %0, %1, asl #2 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #2 \n"
+
+ "\tsubs %3, %0, %1, asl #1 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4, asl #1 \n"
+
+ "\tsubs %3, %0, %1 \n"
+ "\tmovpl %0, %3 \n"
+ "\torrpl %2, %2, %4 \n"
+
+ "\tmovs %5, %5, lsr #31 \n"
+ "\trsbne %2, %2, #0 \n"
+ : "=r" (dead1), "=r" (dead2), "=r" (res),
+ "=r" (dead3), "=r" (dead4), "=r" (dead5)
+ : "0" (a), "1" (b), "2" (res)
+ : "cc"
+ );
+ return res;
+}
+
+
+#endif
diff --git a/gst/audioresample/fixed_arm5e.h b/gst/audioresample/fixed_arm5e.h
new file mode 100644
index 0000000..9b4861c
--- /dev/null
+++ b/gst/audioresample/fixed_arm5e.h
@@ -0,0 +1,178 @@
+/* Copyright (C) 2003 Jean-Marc Valin */
+/**
+ @file fixed_arm5e.h
+ @brief ARM-tuned fixed-point operations
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef FIXED_ARM5E_H
+#define FIXED_ARM5E_H
+
+#undef MULT16_16
+static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
+ int res;
+ asm ("smulbb %0,%1,%2;\n"
+ : "=&r"(res)
+ : "%r"(x),"r"(y));
+ return(res);
+}
+
+#undef MAC16_16
+static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+ int res;
+ asm ("smlabb %0,%1,%2,%3;\n"
+ : "=&r"(res)
+ : "%r"(x),"r"(y),"r"(a));
+ return(res);
+}
+
+#undef MULT16_32_Q15
+static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
+ int res;
+ asm ("smulwb %0,%1,%2;\n"
+ : "=&r"(res)
+ : "%r"(y<<1),"r"(x));
+ return(res);
+}
+
+#undef MAC16_32_Q15
+static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+ int res;
+ asm ("smlawb %0,%1,%2,%3;\n"
+ : "=&r"(res)
+ : "%r"(y<<1),"r"(x),"r"(a));
+ return(res);
+}
+
+#undef MULT16_32_Q11
+static inline spx_word32_t MULT16_32_Q11(spx_word16_t x, spx_word32_t y) {
+ int res;
+ asm ("smulwb %0,%1,%2;\n"
+ : "=&r"(res)
+ : "%r"(y<<5),"r"(x));
+ return(res);
+}
+
+#undef MAC16_32_Q11
+static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+ int res;
+ asm ("smlawb %0,%1,%2,%3;\n"
+ : "=&r"(res)
+ : "%r"(y<<5),"r"(x),"r"(a));
+ return(res);
+}
+
+#undef DIV32_16
+static inline short DIV32_16(int a, int b)
+{
+ int res=0;
+ int dead1, dead2, dead3, dead4, dead5;
+ __asm__ __volatile__ (
+ "\teor %5, %0, %1\n"
+ "\tmovs %4, %0\n"
+ "\trsbmi %0, %0, #0 \n"
+ "\tmovs %4, %1\n"
+ "\trsbmi %1, %1, #0 \n"
+ "\tmov %4, #1\n"
+
+ "\tsubs %3, %0, %1, asl #14 \n"
+ "\torrpl %2, %2, %4, asl #14 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #13 \n"
+ "\torrpl %2, %2, %4, asl #13 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #12 \n"
+ "\torrpl %2, %2, %4, asl #12 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #11 \n"
+ "\torrpl %2, %2, %4, asl #11 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #10 \n"
+ "\torrpl %2, %2, %4, asl #10 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #9 \n"
+ "\torrpl %2, %2, %4, asl #9 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #8 \n"
+ "\torrpl %2, %2, %4, asl #8 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #7 \n"
+ "\torrpl %2, %2, %4, asl #7 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #6 \n"
+ "\torrpl %2, %2, %4, asl #6 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #5 \n"
+ "\torrpl %2, %2, %4, asl #5 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #4 \n"
+ "\torrpl %2, %2, %4, asl #4 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #3 \n"
+ "\torrpl %2, %2, %4, asl #3 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #2 \n"
+ "\torrpl %2, %2, %4, asl #2 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1, asl #1 \n"
+ "\torrpl %2, %2, %4, asl #1 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tsubs %3, %0, %1 \n"
+ "\torrpl %2, %2, %4 \n"
+ "\tmovpl %0, %3 \n"
+
+ "\tmovs %5, %5, lsr #31 \n"
+ "\trsbne %2, %2, #0 \n"
+ : "=r" (dead1), "=r" (dead2), "=r" (res),
+ "=r" (dead3), "=r" (dead4), "=r" (dead5)
+ : "0" (a), "1" (b), "2" (res)
+ : "memory", "cc"
+ );
+ return res;
+}
+
+
+
+
+#endif
diff --git a/gst/audioresample/fixed_bfin.h b/gst/audioresample/fixed_bfin.h
new file mode 100644
index 0000000..9eb21e3
--- /dev/null
+++ b/gst/audioresample/fixed_bfin.h
@@ -0,0 +1,176 @@
+/* Copyright (C) 2005 Analog Devices
+ Author: Jean-Marc Valin */
+/**
+ @file fixed_bfin.h
+ @brief Blackfin fixed-point operations
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef FIXED_BFIN_H
+#define FIXED_BFIN_H
+
+#include "bfin.h"
+
+#undef PDIV32_16
+static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b)
+{
+ spx_word32_t res, bb;
+ bb = b;
+ a += b>>1;
+ __asm__ (
+ "P0 = 15;\n\t"
+ "R0 = %1;\n\t"
+ "R1 = %2;\n\t"
+ //"R0 = R0 + R1;\n\t"
+ "R0 <<= 1;\n\t"
+ "DIVS (R0, R1);\n\t"
+ "LOOP divide%= LC0 = P0;\n\t"
+ "LOOP_BEGIN divide%=;\n\t"
+ "DIVQ (R0, R1);\n\t"
+ "LOOP_END divide%=;\n\t"
+ "R0 = R0.L;\n\t"
+ "%0 = R0;\n\t"
+ : "=m" (res)
+ : "m" (a), "m" (bb)
+ : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS);
+ return res;
+}
+
+#undef DIV32_16
+static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b)
+{
+ spx_word32_t res, bb;
+ bb = b;
+ /* Make the roundinf consistent with the C version
+ (do we need to do that?)*/
+ if (a<0)
+ a += (b-1);
+ __asm__ (
+ "P0 = 15;\n\t"
+ "R0 = %1;\n\t"
+ "R1 = %2;\n\t"
+ "R0 <<= 1;\n\t"
+ "DIVS (R0, R1);\n\t"
+ "LOOP divide%= LC0 = P0;\n\t"
+ "LOOP_BEGIN divide%=;\n\t"
+ "DIVQ (R0, R1);\n\t"
+ "LOOP_END divide%=;\n\t"
+ "R0 = R0.L;\n\t"
+ "%0 = R0;\n\t"
+ : "=m" (res)
+ : "m" (a), "m" (bb)
+ : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS);
+ return res;
+}
+
+#undef MAX16
+static inline spx_word16_t MAX16(spx_word16_t a, spx_word16_t b)
+{
+ spx_word32_t res;
+ __asm__ (
+ "%1 = %1.L (X);\n\t"
+ "%2 = %2.L (X);\n\t"
+ "%0 = MAX(%1,%2);"
+ : "=d" (res)
+ : "%d" (a), "d" (b)
+ : "ASTAT"
+ );
+ return res;
+}
+
+#undef MULT16_32_Q15
+static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b)
+{
+ spx_word32_t res;
+ __asm__
+ (
+ "A1 = %2.L*%1.L (M);\n\t"
+ "A1 = A1 >>> 15;\n\t"
+ "%0 = (A1 += %2.L*%1.H) ;\n\t"
+ : "=&W" (res), "=&d" (b)
+ : "d" (a), "1" (b)
+ : "A1", "ASTAT"
+ );
+ return res;
+}
+
+#undef MAC16_32_Q15
+static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word32_t b)
+{
+ spx_word32_t res;
+ __asm__
+ (
+ "A1 = %2.L*%1.L (M);\n\t"
+ "A1 = A1 >>> 15;\n\t"
+ "%0 = (A1 += %2.L*%1.H);\n\t"
+ "%0 = %0 + %4;\n\t"
+ : "=&W" (res), "=&d" (b)
+ : "d" (a), "1" (b), "d" (c)
+ : "A1", "ASTAT"
+ );
+ return res;
+}
+
+#undef MULT16_32_Q14
+static inline spx_word32_t MULT16_32_Q14(spx_word16_t a, spx_word32_t b)
+{
+ spx_word32_t res;
+ __asm__
+ (
+ "%2 <<= 1;\n\t"
+ "A1 = %1.L*%2.L (M);\n\t"
+ "A1 = A1 >>> 15;\n\t"
+ "%0 = (A1 += %1.L*%2.H);\n\t"
+ : "=W" (res), "=d" (a), "=d" (b)
+ : "1" (a), "2" (b)
+ : "A1", "ASTAT"
+ );
+ return res;
+}
+
+#undef MAC16_32_Q14
+static inline spx_word32_t MAC16_32_Q14(spx_word32_t c, spx_word16_t a, spx_word32_t b)
+{
+ spx_word32_t res;
+ __asm__
+ (
+ "%1 <<= 1;\n\t"
+ "A1 = %2.L*%1.L (M);\n\t"
+ "A1 = A1 >>> 15;\n\t"
+ "%0 = (A1 += %2.L*%1.H);\n\t"
+ "%0 = %0 + %4;\n\t"
+ : "=&W" (res), "=&d" (b)
+ : "d" (a), "1" (b), "d" (c)
+ : "A1", "ASTAT"
+ );
+ return res;
+}
+
+#endif
diff --git a/gst/audioresample/fixed_debug.h b/gst/audioresample/fixed_debug.h
new file mode 100644
index 0000000..54f3866
--- /dev/null
+++ b/gst/audioresample/fixed_debug.h
@@ -0,0 +1,487 @@
+/* Copyright (C) 2003 Jean-Marc Valin */
+/**
+ @file fixed_debug.h
+ @brief Fixed-point operations with debugging
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef FIXED_DEBUG_H
+#define FIXED_DEBUG_H
+
+#include <stdio.h>
+
+extern long long spx_mips;
+#define MIPS_INC spx_mips++,
+
+#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
+#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
+
+
+#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768)
+#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL)
+
+static inline short NEG16(int x)
+{
+ int res;
+ if (!VERIFY_SHORT(x))
+ {
+ fprintf (stderr, "NEG16: input is not short: %d\n", (int)x);
+ }
+ res = -x;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "NEG16: output is not short: %d\n", (int)res);
+ spx_mips++;
+ return res;
+}
+static inline int NEG32(long long x)
+{
+ long long res;
+ if (!VERIFY_INT(x))
+ {
+ fprintf (stderr, "NEG16: input is not int: %d\n", (int)x);
+ }
+ res = -x;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "NEG16: output is not int: %d\n", (int)res);
+ spx_mips++;
+ return res;
+}
+
+#define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__)
+static inline short _EXTRACT16(int x, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(x))
+ {
+ fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line);
+ }
+ res = x;
+ spx_mips++;
+ return res;
+}
+
+#define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__)
+static inline int _EXTEND32(int x, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(x))
+ {
+ fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line);
+ }
+ res = x;
+ spx_mips++;
+ return res;
+}
+
+#define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__)
+static inline short _SHR16(int a, int shift, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
+ {
+ fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line);
+ }
+ res = a>>shift;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line);
+ spx_mips++;
+ return res;
+}
+#define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__)
+static inline short _SHL16(int a, int shift, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
+ {
+ fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line);
+ }
+ res = a<<shift;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "SHL16: output is not short: %d in %s: line %d\n", res, file, line);
+ spx_mips++;
+ return res;
+}
+
+static inline int SHR32(long long a, int shift)
+{
+ long long res;
+ if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
+ {
+ fprintf (stderr, "SHR32: inputs are not int: %d %d\n", (int)a, shift);
+ }
+ res = a>>shift;
+ if (!VERIFY_INT(res))
+ {
+ fprintf (stderr, "SHR32: output is not int: %d\n", (int)res);
+ }
+ spx_mips++;
+ return res;
+}
+static inline int SHL32(long long a, int shift)
+{
+ long long res;
+ if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
+ {
+ fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift);
+ }
+ res = a<<shift;
+ if (!VERIFY_INT(res))
+ {
+ fprintf (stderr, "SHL32: output is not int: %d\n", (int)res);
+ }
+ spx_mips++;
+ return res;
+}
+
+#define PSHR16(a,shift) (SHR16(ADD16((a),((1<<((shift))>>1))),shift))
+#define PSHR32(a,shift) (SHR32(ADD32((a),((EXTEND32(1)<<((shift))>>1))),shift))
+#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
+
+#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+
+//#define SHR(a,shift) ((a) >> (shift))
+//#define SHL(a,shift) ((a) << (shift))
+
+#define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__)
+static inline short _ADD16(int a, int b, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
+ }
+ res = a+b;
+ if (!VERIFY_SHORT(res))
+ {
+ fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line);
+ }
+ spx_mips++;
+ return res;
+}
+
+#define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__)
+static inline short _SUB16(int a, int b, char *file, int line)
+{
+ int res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
+ }
+ res = a-b;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line);
+ spx_mips++;
+ return res;
+}
+
+#define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__)
+static inline int _ADD32(long long a, long long b, char *file, int line)
+{
+ long long res;
+ if (!VERIFY_INT(a) || !VERIFY_INT(b))
+ {
+ fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
+ }
+ res = a+b;
+ if (!VERIFY_INT(res))
+ {
+ fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line);
+ }
+ spx_mips++;
+ return res;
+}
+
+static inline int SUB32(long long a, long long b)
+{
+ long long res;
+ if (!VERIFY_INT(a) || !VERIFY_INT(b))
+ {
+ fprintf (stderr, "SUB32: inputs are not int: %d %d\n", (int)a, (int)b);
+ }
+ res = a-b;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "SUB32: output is not int: %d\n", (int)res);
+ spx_mips++;
+ return res;
+}
+
+#define ADD64(a,b) (MIPS_INC(a)+(b))
+
+/* result fits in 16 bits */
+static inline short MULT16_16_16(int a, int b)
+{
+ int res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b);
+ }
+ res = a*b;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res);
+ spx_mips++;
+ return res;
+}
+
+#define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__)
+static inline int _MULT16_16(int a, int b, char *file, int line)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
+ }
+ res = ((long long)a)*b;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line);
+ spx_mips++;
+ return res;
+}
+
+#define MAC16_16(c,a,b) (spx_mips--,ADD32((c),MULT16_16((a),(b))))
+#define MAC16_16_Q11(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11)))))
+#define MAC16_16_Q13(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13)))))
+#define MAC16_16_P13(c,a,b) (EXTRACT16(ADD32((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13))))
+
+
+#define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__)
+static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
+ {
+ fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
+ }
+ if (ABS32(b)>=(EXTEND32(1)<<(15+Q)))
+ fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
+ res = (((long long)a)*(long long)b) >> Q;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line);
+ spx_mips+=5;
+ return res;
+}
+
+static inline int MULT16_32_PX(int a, long long b, int Q)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
+ {
+ fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b);
+ }
+ if (ABS32(b)>=(EXTEND32(1)<<(15+Q)))
+ fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b);
+ res = ((((long long)a)*(long long)b) + ((EXTEND32(1)<<Q)>>1))>> Q;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res);
+ spx_mips+=5;
+ return res;
+}
+
+
+#define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11)
+#define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b)))
+#define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12)
+#define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13)
+#define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14)
+#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
+#define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15)
+#define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b)))
+
+static inline int SATURATE(int a, int b)
+{
+ if (a>b)
+ a=b;
+ if (a<-b)
+ a = -b;
+ return a;
+}
+
+static inline int MULT16_16_Q11_32(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res >>= 11;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res);
+ spx_mips+=3;
+ return res;
+}
+static inline short MULT16_16_Q13(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res >>= 13;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res);
+ spx_mips+=3;
+ return res;
+}
+static inline short MULT16_16_Q14(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res >>= 14;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res);
+ spx_mips+=3;
+ return res;
+}
+static inline short MULT16_16_Q15(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res >>= 15;
+ if (!VERIFY_SHORT(res))
+ {
+ fprintf (stderr, "MULT16_16_Q15: output is not short: %d\n", (int)res);
+ }
+ spx_mips+=3;
+ return res;
+}
+
+static inline short MULT16_16_P13(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res += 4096;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res);
+ res >>= 13;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res);
+ spx_mips+=4;
+ return res;
+}
+static inline short MULT16_16_P14(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res += 8192;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res);
+ res >>= 14;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res);
+ spx_mips+=4;
+ return res;
+}
+static inline short MULT16_16_P15(int a, int b)
+{
+ long long res;
+ if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b);
+ }
+ res = ((long long)a)*b;
+ res += 16384;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res);
+ res >>= 15;
+ if (!VERIFY_SHORT(res))
+ fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res);
+ spx_mips+=4;
+ return res;
+}
+
+#define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__)
+
+static inline int _DIV32_16(long long a, long long b, char *file, int line)
+{
+ long long res;
+ if (b==0)
+ {
+ fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
+ return 0;
+ }
+ if (!VERIFY_INT(a) || !VERIFY_SHORT(b))
+ {
+ fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
+ }
+ res = a/b;
+ if (!VERIFY_SHORT(res))
+ {
+ fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line);
+ if (res>32767)
+ res = 32767;
+ if (res<-32768)
+ res = -32768;
+ }
+ spx_mips+=20;
+ return res;
+}
+
+#define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__)
+static inline int _DIV32(long long a, long long b, char *file, int line)
+{
+ long long res;
+ if (b==0)
+ {
+ fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
+ return 0;
+ }
+
+ if (!VERIFY_INT(a) || !VERIFY_INT(b))
+ {
+ fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
+ }
+ res = a/b;
+ if (!VERIFY_INT(res))
+ fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line);
+ spx_mips+=36;
+ return res;
+}
+#define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b)
+#define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b)
+
+#endif
diff --git a/gst/audioresample/fixed_generic.h b/gst/audioresample/fixed_generic.h
new file mode 100644
index 0000000..3fb096e
--- /dev/null
+++ b/gst/audioresample/fixed_generic.h
@@ -0,0 +1,106 @@
+/* Copyright (C) 2003 Jean-Marc Valin */
+/**
+ @file fixed_generic.h
+ @brief Generic fixed-point operations
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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.
+*/
+
+#ifndef FIXED_GENERIC_H
+#define FIXED_GENERIC_H
+
+#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
+#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
+
+#define NEG16(x) (-(x))
+#define NEG32(x) (-(x))
+#define EXTRACT16(x) ((spx_word16_t)(x))
+#define EXTEND32(x) ((spx_word32_t)(x))
+#define SHR16(a,shift) ((a) >> (shift))
+#define SHL16(a,shift) ((a) << (shift))
+#define SHR32(a,shift) ((a) >> (shift))
+#define SHL32(a,shift) ((a) << (shift))
+#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift))
+#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift))
+#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
+#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+
+#define SHR(a,shift) ((a) >> (shift))
+#define SHL(a,shift) ((spx_word32_t)(a) << (shift))
+#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift))
+#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+
+
+#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b)))
+#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b))
+#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b))
+#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b))
+
+
+/* result fits in 16 bits */
+#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b))))
+
+/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */
+#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b)))
+
+#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b))))
+#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12))
+#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13))
+#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+
+#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
+#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)))
+
+#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15))
+#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
+#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)))
+
+
+#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11)))
+#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13)))
+#define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13)))
+
+#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11))
+#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
+#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
+#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
+
+#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13))
+#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14))
+#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
+
+#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
+
+#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b))))
+#define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b))))
+#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b)))
+#define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b)))
+
+#endif
diff --git a/gst/audioresample/gstaudioresample.c b/gst/audioresample/gstaudioresample.c
new file mode 100644
index 0000000..358061e
--- /dev/null
+++ b/gst/audioresample/gstaudioresample.c
@@ -0,0 +1,1464 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2003,2004 David A. Schleef <ds@schleef.org>
+ * Copyright (C) 2007-2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-audioresample
+ *
+ * audioresample resamples raw audio buffers to different sample rates using
+ * a configurable windowing function to enhance quality.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! audio/x-raw, rate=8000 ! alsasink
+ * ]| Decode an Ogg/Vorbis downsample to 8Khz and play sound through alsa.
+ * To create the Ogg/Vorbis file refer to the documentation of vorbisenc.
+ * </refsect2>
+ */
+
+/* TODO:
+ * - Enable SSE/ARM optimizations and select at runtime
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <math.h>
+
+#include "gstaudioresample.h"
+#include <gst/gstutils.h>
+#include <gst/audio/audio.h>
+#include <gst/base/gstbasetransform.h>
+
+#ifndef DISABLE_ORC
+#include <orc/orc.h>
+#include <orc-test/orctest.h>
+#include <orc-test/orcprofile.h>
+#endif
+
+GST_DEBUG_CATEGORY (audio_resample_debug);
+#define GST_CAT_DEFAULT audio_resample_debug
+
+enum
+{
+ PROP_0,
+ PROP_QUALITY
+};
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define SUPPORTED_CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ F32LE, F64LE, S32LE, S24LE, S16LE, S8 }")
+#else
+#define SUPPORTED_CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ F32BE, F64BE, S32BE, S24BE, S16BE, S8 }")
+#endif
+
+/* If TRUE integer arithmetic resampling is faster and will be used if appropiate */
+#if defined AUDIORESAMPLE_FORMAT_INT
+static gboolean gst_audio_resample_use_int = TRUE;
+#elif defined AUDIORESAMPLE_FORMAT_FLOAT
+static gboolean gst_audio_resample_use_int = FALSE;
+#else
+static gboolean gst_audio_resample_use_int = FALSE;
+#endif
+
+static GstStaticPadTemplate gst_audio_resample_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (SUPPORTED_CAPS));
+
+static GstStaticPadTemplate gst_audio_resample_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (SUPPORTED_CAPS));
+
+static void gst_audio_resample_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_audio_resample_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+/* vmethods */
+static gboolean gst_audio_resample_get_unit_size (GstBaseTransform * base,
+ GstCaps * caps, gsize * size);
+static GstCaps *gst_audio_resample_transform_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter);
+static void gst_audio_resample_fixate_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
+static gboolean gst_audio_resample_transform_size (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * incaps, gsize insize,
+ GstCaps * outcaps, gsize * outsize);
+static gboolean gst_audio_resample_set_caps (GstBaseTransform * base,
+ GstCaps * incaps, GstCaps * outcaps);
+static GstFlowReturn gst_audio_resample_transform (GstBaseTransform * base,
+ GstBuffer * inbuf, GstBuffer * outbuf);
+static gboolean gst_audio_resample_sink_event (GstBaseTransform * base,
+ GstEvent * event);
+static gboolean gst_audio_resample_start (GstBaseTransform * base);
+static gboolean gst_audio_resample_stop (GstBaseTransform * base);
+static gboolean gst_audio_resample_query (GstPad * pad, GstQuery * query);
+static const GstQueryType *gst_audio_resample_query_type (GstPad * pad);
+
+#define gst_audio_resample_parent_class parent_class
+G_DEFINE_TYPE (GstAudioResample, gst_audio_resample, GST_TYPE_BASE_TRANSFORM);
+
+static void
+gst_audio_resample_class_init (GstAudioResampleClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->set_property = gst_audio_resample_set_property;
+ gobject_class->get_property = gst_audio_resample_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_QUALITY,
+ g_param_spec_int ("quality", "Quality", "Resample quality with 0 being "
+ "the lowest and 10 being the best",
+ SPEEX_RESAMPLER_QUALITY_MIN, SPEEX_RESAMPLER_QUALITY_MAX,
+ SPEEX_RESAMPLER_QUALITY_DEFAULT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_audio_resample_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_audio_resample_sink_template));
+
+ gst_element_class_set_details_simple (gstelement_class, "Audio resampler",
+ "Filter/Converter/Audio", "Resamples audio",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ GST_BASE_TRANSFORM_CLASS (klass)->start =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_start);
+ GST_BASE_TRANSFORM_CLASS (klass)->stop =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_stop);
+ GST_BASE_TRANSFORM_CLASS (klass)->transform_size =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_transform_size);
+ GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_get_unit_size);
+ GST_BASE_TRANSFORM_CLASS (klass)->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_transform_caps);
+ GST_BASE_TRANSFORM_CLASS (klass)->fixate_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_fixate_caps);
+ GST_BASE_TRANSFORM_CLASS (klass)->set_caps =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_set_caps);
+ GST_BASE_TRANSFORM_CLASS (klass)->transform =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_transform);
+ GST_BASE_TRANSFORM_CLASS (klass)->sink_event =
+ GST_DEBUG_FUNCPTR (gst_audio_resample_sink_event);
+
+ GST_BASE_TRANSFORM_CLASS (klass)->passthrough_on_same_caps = TRUE;
+}
+
+static void
+gst_audio_resample_init (GstAudioResample * resample)
+{
+ GstBaseTransform *trans = GST_BASE_TRANSFORM (resample);
+
+ resample->quality = SPEEX_RESAMPLER_QUALITY_DEFAULT;
+
+ gst_base_transform_set_gap_aware (trans, TRUE);
+ gst_pad_set_query_function (trans->srcpad, gst_audio_resample_query);
+ gst_pad_set_query_type_function (trans->srcpad,
+ gst_audio_resample_query_type);
+}
+
+/* vmethods */
+static gboolean
+gst_audio_resample_start (GstBaseTransform * base)
+{
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (base);
+
+ resample->need_discont = TRUE;
+
+ resample->num_gap_samples = 0;
+ resample->num_nongap_samples = 0;
+ resample->t0 = GST_CLOCK_TIME_NONE;
+ resample->in_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->out_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->samples_in = 0;
+ resample->samples_out = 0;
+
+ resample->tmp_in = NULL;
+ resample->tmp_in_size = 0;
+ resample->tmp_out = NULL;
+ resample->tmp_out_size = 0;
+
+ return TRUE;
+}
+
+static gboolean
+gst_audio_resample_stop (GstBaseTransform * base)
+{
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (base);
+
+ if (resample->state) {
+ resample->funcs->destroy (resample->state);
+ resample->state = NULL;
+ }
+
+ resample->funcs = NULL;
+
+ g_free (resample->tmp_in);
+ resample->tmp_in = NULL;
+ resample->tmp_in_size = 0;
+
+ g_free (resample->tmp_out);
+ resample->tmp_out = NULL;
+ resample->tmp_out_size = 0;
+
+ return TRUE;
+}
+
+static gboolean
+gst_audio_resample_get_unit_size (GstBaseTransform * base, GstCaps * caps,
+ gsize * size)
+{
+ GstAudioInfo info;
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ *size = GST_AUDIO_INFO_BPF (&info);
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_caps:
+ {
+ GST_ERROR_OBJECT (base, "invalid caps");
+ return FALSE;
+ }
+}
+
+static GstCaps *
+gst_audio_resample_transform_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ const GValue *val;
+ GstStructure *s;
+ GstCaps *res;
+ gint i, n;
+
+ /* transform single caps into input_caps + input_caps with the rate
+ * field set to our supported range. This ensures that upstream knows
+ * about downstream's prefered rate(s) and can negotiate accordingly. */
+ res = gst_caps_new_empty ();
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ s = gst_caps_get_structure (caps, i);
+
+ /* If this is already expressed by the existing caps
+ * skip this structure */
+ if (i > 0 && gst_caps_is_subset_structure (res, s))
+ continue;
+
+ /* first, however, check if the caps contain a range for the rate field, in
+ * which case that side isn't going to care much about the exact sample rate
+ * chosen and we should just assume things will get fixated to something sane
+ * and we may just as well offer our full range instead of the range in the
+ * caps. If the rate is not an int range value, it's likely to express a
+ * real preference or limitation and we should maintain that structure as
+ * preference by putting it first into the transformed caps, and only add
+ * our full rate range as second option */
+ s = gst_structure_copy (s);
+ val = gst_structure_get_value (s, "rate");
+ if (val == NULL || GST_VALUE_HOLDS_INT_RANGE (val)) {
+ /* overwrite existing range, or add field if it doesn't exist yet */
+ gst_structure_set (s, "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
+ } else {
+ /* append caps with full range to existing caps with non-range rate field */
+ gst_caps_append_structure (res, gst_structure_copy (s));
+ gst_structure_set (s, "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
+ }
+ gst_caps_append_structure (res, s);
+ }
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (res);
+ res = intersection;
+ }
+
+ return res;
+}
+
+/* Fixate rate to the allowed rate that has the smallest difference */
+static void
+gst_audio_resample_fixate_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
+{
+ GstStructure *s;
+ gint rate;
+
+ s = gst_caps_get_structure (caps, 0);
+ if (G_UNLIKELY (!gst_structure_get_int (s, "rate", &rate)))
+ return;
+
+ s = gst_caps_get_structure (othercaps, 0);
+ gst_structure_fixate_field_nearest_int (s, "rate", rate);
+}
+
+static const SpeexResampleFuncs *
+gst_audio_resample_get_funcs (gint width, gboolean fp)
+{
+ const SpeexResampleFuncs *funcs = NULL;
+
+ if (gst_audio_resample_use_int && (width == 8 || width == 16) && !fp)
+ funcs = &int_funcs;
+ else if ((!gst_audio_resample_use_int && (width == 8 || width == 16) && !fp)
+ || (width == 32 && fp))
+ funcs = &float_funcs;
+ else if ((width == 64 && fp) || ((width == 32 || width == 24) && !fp))
+ funcs = &double_funcs;
+ else
+ g_assert_not_reached ();
+
+ return funcs;
+}
+
+static SpeexResamplerState *
+gst_audio_resample_init_state (GstAudioResample * resample, gint width,
+ gint channels, gint inrate, gint outrate, gint quality, gboolean fp)
+{
+ SpeexResamplerState *ret = NULL;
+ gint err = RESAMPLER_ERR_SUCCESS;
+ const SpeexResampleFuncs *funcs = gst_audio_resample_get_funcs (width, fp);
+
+ ret = funcs->init (channels, inrate, outrate, quality, &err);
+
+ if (G_UNLIKELY (err != RESAMPLER_ERR_SUCCESS)) {
+ GST_ERROR_OBJECT (resample, "Failed to create resampler state: %s",
+ funcs->strerror (err));
+ return NULL;
+ }
+
+ funcs->skip_zeros (ret);
+
+ return ret;
+}
+
+static gboolean
+gst_audio_resample_update_state (GstAudioResample * resample, gint width,
+ gint channels, gint inrate, gint outrate, gint quality, gboolean fp)
+{
+ gboolean ret = TRUE;
+ gboolean updated_latency = FALSE;
+
+ updated_latency = (resample->inrate != inrate
+ || quality != resample->quality) && resample->state != NULL;
+
+ if (resample->state == NULL) {
+ ret = TRUE;
+ } else if (resample->channels != channels || fp != resample->fp
+ || width != resample->width) {
+ resample->funcs->destroy (resample->state);
+ resample->state =
+ gst_audio_resample_init_state (resample, width, channels, inrate,
+ outrate, quality, fp);
+
+ resample->funcs = gst_audio_resample_get_funcs (width, fp);
+ ret = (resample->state != NULL);
+ } else if (resample->inrate != inrate || resample->outrate != outrate) {
+ gint err = RESAMPLER_ERR_SUCCESS;
+
+ err = resample->funcs->set_rate (resample->state, inrate, outrate);
+
+ if (G_UNLIKELY (err != RESAMPLER_ERR_SUCCESS))
+ GST_ERROR_OBJECT (resample, "Failed to update rate: %s",
+ resample->funcs->strerror (err));
+
+ ret = (err == RESAMPLER_ERR_SUCCESS);
+ } else if (quality != resample->quality) {
+ gint err = RESAMPLER_ERR_SUCCESS;
+
+ err = resample->funcs->set_quality (resample->state, quality);
+
+ if (G_UNLIKELY (err != RESAMPLER_ERR_SUCCESS))
+ GST_ERROR_OBJECT (resample, "Failed to update quality: %s",
+ resample->funcs->strerror (err));
+
+ ret = (err == RESAMPLER_ERR_SUCCESS);
+ }
+
+ resample->width = width;
+ resample->channels = channels;
+ resample->fp = fp;
+ resample->quality = quality;
+ resample->inrate = inrate;
+ resample->outrate = outrate;
+
+ if (updated_latency)
+ gst_element_post_message (GST_ELEMENT (resample),
+ gst_message_new_latency (GST_OBJECT (resample)));
+
+ return ret;
+}
+
+static void
+gst_audio_resample_reset_state (GstAudioResample * resample)
+{
+ if (resample->state)
+ resample->funcs->reset_mem (resample->state);
+}
+
+static gint
+_gcd (gint a, gint b)
+{
+ while (b != 0) {
+ int temp = a;
+
+ a = b;
+ b = temp % b;
+ }
+
+ return ABS (a);
+}
+
+static gboolean
+gst_audio_resample_transform_size (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps,
+ gsize * othersize)
+{
+ gboolean ret = TRUE;
+ GstAudioInfo in, out;
+ guint32 ratio_den, ratio_num;
+ gint inrate, outrate, gcd;
+ gint bpf;
+
+ GST_LOG_OBJECT (base, "asked to transform size %" G_GSIZE_FORMAT
+ " in direction %s", size, direction == GST_PAD_SINK ? "SINK" : "SRC");
+
+ /* Get sample width -> bytes_per_samp, channels, inrate, outrate */
+ ret = gst_audio_info_from_caps (&in, caps);
+ ret &= gst_audio_info_from_caps (&out, othercaps);
+ if (G_UNLIKELY (!ret)) {
+ GST_ERROR_OBJECT (base, "Wrong caps");
+ return FALSE;
+ }
+ /* Number of samples in either buffer is size / (width*channels) ->
+ * calculate the factor */
+ bpf = GST_AUDIO_INFO_BPF (&in);
+ inrate = GST_AUDIO_INFO_RATE (&in);
+ outrate = GST_AUDIO_INFO_RATE (&out);
+
+ /* Convert source buffer size to samples */
+ size /= bpf;
+
+ /* Simplify the conversion ratio factors */
+ gcd = _gcd (inrate, outrate);
+ ratio_num = inrate / gcd;
+ ratio_den = outrate / gcd;
+
+ if (direction == GST_PAD_SINK) {
+ /* asked to convert size of an incoming buffer. Round up the output size */
+ *othersize = gst_util_uint64_scale_int_ceil (size, ratio_den, ratio_num);
+ *othersize *= bpf;
+ } else {
+ /* asked to convert size of an outgoing buffer. Round down the input size */
+ *othersize = gst_util_uint64_scale_int (size, ratio_num, ratio_den);
+ *othersize *= bpf;
+ }
+
+ GST_LOG_OBJECT (base,
+ "transformed size %" G_GSIZE_FORMAT " to %" G_GSIZE_FORMAT,
+ size * bpf, *othersize);
+
+ return ret;
+}
+
+static gboolean
+gst_audio_resample_set_caps (GstBaseTransform * base, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ gboolean ret;
+ gint width, inrate, outrate, channels;
+ gboolean fp;
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (base);
+ GstAudioInfo in, out;
+
+ GST_LOG ("incaps %" GST_PTR_FORMAT ", outcaps %"
+ GST_PTR_FORMAT, incaps, outcaps);
+
+ if (!gst_audio_info_from_caps (&in, incaps))
+ goto invalid_incaps;
+ if (!gst_audio_info_from_caps (&out, outcaps))
+ goto invalid_outcaps;
+
+ /* FIXME do some checks */
+
+ /* take new values */
+ width = GST_AUDIO_FORMAT_INFO_WIDTH (in.finfo);
+ channels = GST_AUDIO_INFO_CHANNELS (&in);
+ inrate = GST_AUDIO_INFO_RATE (&in);
+ outrate = GST_AUDIO_INFO_RATE (&out);
+ fp = GST_AUDIO_FORMAT_INFO_IS_FLOAT (in.finfo);
+
+ ret =
+ gst_audio_resample_update_state (resample, width, channels, inrate,
+ outrate, resample->quality, fp);
+
+ if (G_UNLIKELY (!ret))
+ return FALSE;
+
+ return TRUE;
+
+ /* ERROR */
+invalid_incaps:
+ {
+ GST_ERROR_OBJECT (base, "invalid incaps");
+ return FALSE;
+ }
+invalid_outcaps:
+ {
+ GST_ERROR_OBJECT (base, "invalid outcaps");
+ return FALSE;
+ }
+}
+
+#define GST_MAXINT24 (8388607)
+#define GST_MININT24 (-8388608)
+
+#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
+#define GST_READ_UINT24 GST_READ_UINT24_LE
+#define GST_WRITE_UINT24 GST_WRITE_UINT24_LE
+#else
+#define GST_READ_UINT24 GST_READ_UINT24_BE
+#define GST_WRITE_UINT24 GST_WRITE_UINT24_BE
+#endif
+
+static void
+gst_audio_resample_convert_buffer (GstAudioResample * resample,
+ const guint8 * in, guint8 * out, guint len, gboolean inverse)
+{
+ len *= resample->channels;
+
+ if (inverse) {
+ if (gst_audio_resample_use_int && resample->width == 8 && !resample->fp) {
+ gint8 *o = (gint8 *) out;
+ gint16 *i = (gint16 *) in;
+ gint32 tmp;
+
+ while (len) {
+ tmp = *i + (G_MAXINT8 >> 1);
+ *o = CLAMP (tmp >> 8, G_MININT8, G_MAXINT8);
+ o++;
+ i++;
+ len--;
+ }
+ } else if (!gst_audio_resample_use_int && resample->width == 8
+ && !resample->fp) {
+ gint8 *o = (gint8 *) out;
+ gfloat *i = (gfloat *) in;
+ gfloat tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = (gint8) CLAMP (tmp * G_MAXINT8 + 0.5, G_MININT8, G_MAXINT8);
+ o++;
+ i++;
+ len--;
+ }
+ } else if (!gst_audio_resample_use_int && resample->width == 16
+ && !resample->fp) {
+ gint16 *o = (gint16 *) out;
+ gfloat *i = (gfloat *) in;
+ gfloat tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = (gint16) CLAMP (tmp * G_MAXINT16 + 0.5, G_MININT16, G_MAXINT16);
+ o++;
+ i++;
+ len--;
+ }
+ } else if (resample->width == 24 && !resample->fp) {
+ guint8 *o = (guint8 *) out;
+ gdouble *i = (gdouble *) in;
+ gdouble tmp;
+
+ while (len) {
+ tmp = *i;
+ GST_WRITE_UINT24 (o, (gint32) CLAMP (tmp * GST_MAXINT24 + 0.5,
+ GST_MININT24, GST_MAXINT24));
+ o += 3;
+ i++;
+ len--;
+ }
+ } else if (resample->width == 32 && !resample->fp) {
+ gint32 *o = (gint32 *) out;
+ gdouble *i = (gdouble *) in;
+ gdouble tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = (gint32) CLAMP (tmp * G_MAXINT32 + 0.5, G_MININT32, G_MAXINT32);
+ o++;
+ i++;
+ len--;
+ }
+ } else {
+ g_assert_not_reached ();
+ }
+ } else {
+ if (gst_audio_resample_use_int && resample->width == 8 && !resample->fp) {
+ gint8 *i = (gint8 *) in;
+ gint16 *o = (gint16 *) out;
+ gint32 tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = tmp << 8;
+ o++;
+ i++;
+ len--;
+ }
+ } else if (!gst_audio_resample_use_int && resample->width == 8
+ && !resample->fp) {
+ gint8 *i = (gint8 *) in;
+ gfloat *o = (gfloat *) out;
+ gfloat tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = tmp / G_MAXINT8;
+ o++;
+ i++;
+ len--;
+ }
+ } else if (!gst_audio_resample_use_int && resample->width == 16
+ && !resample->fp) {
+ gint16 *i = (gint16 *) in;
+ gfloat *o = (gfloat *) out;
+ gfloat tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = tmp / G_MAXINT16;
+ o++;
+ i++;
+ len--;
+ }
+ } else if (resample->width == 24 && !resample->fp) {
+ guint8 *i = (guint8 *) in;
+ gdouble *o = (gdouble *) out;
+ gdouble tmp;
+ guint32 tmp2;
+
+ while (len) {
+ tmp2 = GST_READ_UINT24 (i);
+ if (tmp2 & 0x00800000)
+ tmp2 |= 0xff000000;
+ tmp = (gint32) tmp2;
+ *o = tmp / GST_MAXINT24;
+ o++;
+ i += 3;
+ len--;
+ }
+ } else if (resample->width == 32 && !resample->fp) {
+ gint32 *i = (gint32 *) in;
+ gdouble *o = (gdouble *) out;
+ gdouble tmp;
+
+ while (len) {
+ tmp = *i;
+ *o = tmp / G_MAXINT32;
+ o++;
+ i++;
+ len--;
+ }
+ } else {
+ g_assert_not_reached ();
+ }
+ }
+}
+
+static guint8 *
+gst_audio_resample_workspace_realloc (guint8 ** workspace, guint * size,
+ guint new_size)
+{
+ guint8 *new;
+ if (new_size <= *size)
+ /* no need to resize */
+ return *workspace;
+ new = g_realloc (*workspace, new_size);
+ if (!new)
+ /* failure (re)allocating memeory */
+ return NULL;
+ /* success */
+ *workspace = new;
+ *size = new_size;
+ return *workspace;
+}
+
+/* Push history_len zeros into the filter, but discard the output. */
+static void
+gst_audio_resample_dump_drain (GstAudioResample * resample, guint history_len)
+{
+ gint outsize;
+ guint in_len, in_processed;
+ guint out_len, out_processed;
+ guint num, den;
+ gpointer buf;
+
+ g_assert (resample->state != NULL);
+
+ resample->funcs->get_ratio (resample->state, &num, &den);
+
+ in_len = in_processed = history_len;
+ out_processed = out_len =
+ gst_util_uint64_scale_int_ceil (history_len, den, num);
+ outsize = out_len * resample->channels * (resample->funcs->width / 8);
+
+ if (out_len == 0)
+ return;
+
+ buf = g_malloc (outsize);
+ resample->funcs->process (resample->state, NULL, &in_processed, buf,
+ &out_processed);
+ g_free (buf);
+
+ g_assert (in_len == in_processed);
+}
+
+static void
+gst_audio_resample_push_drain (GstAudioResample * resample, guint history_len)
+{
+ GstBuffer *outbuf;
+ GstFlowReturn res;
+ gint outsize;
+ guint in_len, in_processed;
+ guint out_len, out_processed;
+ gint err;
+ guint num, den;
+ guint8 *data;
+
+ g_assert (resample->state != NULL);
+
+ /* Don't drain samples if we were reset. */
+ if (!GST_CLOCK_TIME_IS_VALID (resample->t0))
+ return;
+
+ resample->funcs->get_ratio (resample->state, &num, &den);
+
+ in_len = in_processed = history_len;
+ out_len = out_processed =
+ gst_util_uint64_scale_int_ceil (history_len, den, num);
+ outsize = out_len * resample->channels * (resample->width / 8);
+
+ if (out_len == 0)
+ return;
+
+ outbuf = gst_buffer_new_and_alloc (outsize);
+
+ data = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE);
+
+ if (resample->funcs->width != resample->width) {
+ /* need to convert data format; allocate workspace */
+ if (!gst_audio_resample_workspace_realloc (&resample->tmp_out,
+ &resample->tmp_out_size, (resample->funcs->width / 8) * out_len *
+ resample->channels)) {
+ GST_ERROR_OBJECT (resample, "failed to allocate workspace");
+ return;
+ }
+
+ /* process */
+ err = resample->funcs->process (resample->state, NULL, &in_processed,
+ resample->tmp_out, &out_processed);
+
+ /* convert output format */
+ gst_audio_resample_convert_buffer (resample, resample->tmp_out,
+ data, out_processed, TRUE);
+ } else {
+ /* don't need to convert data format; process */
+ err = resample->funcs->process (resample->state, NULL, &in_processed,
+ data, &out_processed);
+ }
+
+ /* If we wrote more than allocated something is really wrong now
+ * and we should better abort immediately */
+ g_assert (out_len >= out_processed);
+
+ outsize = out_processed * resample->channels * (resample->width / 8);
+ gst_buffer_unmap (outbuf, data, outsize);
+
+ if (G_UNLIKELY (err != RESAMPLER_ERR_SUCCESS)) {
+ GST_WARNING_OBJECT (resample, "Failed to process drain: %s",
+ resample->funcs->strerror (err));
+ gst_buffer_unref (outbuf);
+ return;
+ }
+
+ /* time */
+ if (GST_CLOCK_TIME_IS_VALID (resample->t0)) {
+ GST_BUFFER_TIMESTAMP (outbuf) = resample->t0 +
+ gst_util_uint64_scale_int_round (resample->samples_out, GST_SECOND,
+ resample->outrate);
+ GST_BUFFER_DURATION (outbuf) = resample->t0 +
+ gst_util_uint64_scale_int_round (resample->samples_out + out_processed,
+ GST_SECOND, resample->outrate) - GST_BUFFER_TIMESTAMP (outbuf);
+ } else {
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
+ }
+ /* offset */
+ if (resample->out_offset0 != GST_BUFFER_OFFSET_NONE) {
+ GST_BUFFER_OFFSET (outbuf) = resample->out_offset0 + resample->samples_out;
+ GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET (outbuf) + out_processed;
+ } else {
+ GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
+ }
+ /* move along */
+ resample->samples_out += out_processed;
+ resample->samples_in += history_len;
+
+ if (G_UNLIKELY (out_processed == 0 && in_len * den > num)) {
+ GST_WARNING_OBJECT (resample, "Failed to get drain, dropping buffer");
+ gst_buffer_unref (outbuf);
+ return;
+ }
+
+ GST_LOG_OBJECT (resample,
+ "Pushing drain buffer of %u bytes with timestamp %" GST_TIME_FORMAT
+ " duration %" GST_TIME_FORMAT " offset %" G_GUINT64_FORMAT " offset_end %"
+ G_GUINT64_FORMAT, outsize,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf),
+ GST_BUFFER_OFFSET_END (outbuf));
+
+ res = gst_pad_push (GST_BASE_TRANSFORM_SRC_PAD (resample), outbuf);
+
+ if (G_UNLIKELY (res != GST_FLOW_OK))
+ GST_WARNING_OBJECT (resample, "Failed to push drain: %s",
+ gst_flow_get_name (res));
+
+ return;
+}
+
+static gboolean
+gst_audio_resample_sink_event (GstBaseTransform * base, GstEvent * event)
+{
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (base);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_audio_resample_reset_state (resample);
+ if (resample->state)
+ resample->funcs->skip_zeros (resample->state);
+ resample->num_gap_samples = 0;
+ resample->num_nongap_samples = 0;
+ resample->t0 = GST_CLOCK_TIME_NONE;
+ resample->in_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->out_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->samples_in = 0;
+ resample->samples_out = 0;
+ resample->need_discont = TRUE;
+ break;
+ case GST_EVENT_SEGMENT:
+ if (resample->state) {
+ guint latency = resample->funcs->get_input_latency (resample->state);
+ gst_audio_resample_push_drain (resample, latency);
+ }
+ gst_audio_resample_reset_state (resample);
+ if (resample->state)
+ resample->funcs->skip_zeros (resample->state);
+ resample->num_gap_samples = 0;
+ resample->num_nongap_samples = 0;
+ resample->t0 = GST_CLOCK_TIME_NONE;
+ resample->in_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->out_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->samples_in = 0;
+ resample->samples_out = 0;
+ resample->need_discont = TRUE;
+ break;
+ case GST_EVENT_EOS:
+ if (resample->state) {
+ guint latency = resample->funcs->get_input_latency (resample->state);
+ gst_audio_resample_push_drain (resample, latency);
+ }
+ gst_audio_resample_reset_state (resample);
+ break;
+ default:
+ break;
+ }
+
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (base, event);
+}
+
+static gboolean
+gst_audio_resample_check_discont (GstAudioResample * resample, GstBuffer * buf)
+{
+ guint64 offset;
+ guint64 delta;
+
+ /* is the incoming buffer a discontinuity? */
+ if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buf)))
+ return TRUE;
+
+ /* no valid timestamps or offsets to compare --> no discontinuity */
+ if (G_UNLIKELY (!(GST_BUFFER_TIMESTAMP_IS_VALID (buf) &&
+ GST_CLOCK_TIME_IS_VALID (resample->t0))))
+ return FALSE;
+
+ /* convert the inbound timestamp to an offset. */
+ offset =
+ gst_util_uint64_scale_int_round (GST_BUFFER_TIMESTAMP (buf) -
+ resample->t0, resample->inrate, GST_SECOND);
+
+ /* many elements generate imperfect streams due to rounding errors, so we
+ * permit a small error (up to one sample) without triggering a filter
+ * flush/restart (if triggered incorrectly, this will be audible) */
+ /* allow even up to more samples, since sink is not so strict anyway,
+ * so give that one a chance to handle this as configured */
+ delta = ABS ((gint64) (offset - resample->samples_in));
+ if (delta <= (resample->inrate >> 5))
+ return FALSE;
+
+ GST_WARNING_OBJECT (resample,
+ "encountered timestamp discontinuity of %" G_GUINT64_FORMAT " samples = %"
+ GST_TIME_FORMAT, delta,
+ GST_TIME_ARGS (gst_util_uint64_scale_int_round (delta, GST_SECOND,
+ resample->inrate)));
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_audio_resample_process (GstAudioResample * resample, GstBuffer * inbuf,
+ GstBuffer * outbuf)
+{
+ gsize in_size, out_size;
+ guint8 *in_data, *out_data;
+ guint32 in_len, in_processed;
+ guint32 out_len, out_processed;
+ guint filt_len = resample->funcs->get_filt_len (resample->state);
+
+ in_data = gst_buffer_map (inbuf, &in_size, NULL, GST_MAP_READ);
+ out_data = gst_buffer_map (outbuf, &out_size, NULL, GST_MAP_WRITE);
+
+ in_len = in_size / resample->channels;
+ out_len = out_size / resample->channels;
+
+ in_len /= (resample->width / 8);
+ out_len /= (resample->width / 8);
+
+ in_processed = in_len;
+ out_processed = out_len;
+
+ if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP)) {
+ resample->num_nongap_samples = 0;
+ if (resample->num_gap_samples < filt_len) {
+ guint zeros_to_push;
+ if (in_len >= filt_len - resample->num_gap_samples)
+ zeros_to_push = filt_len - resample->num_gap_samples;
+ else
+ zeros_to_push = in_len;
+
+ gst_audio_resample_push_drain (resample, zeros_to_push);
+ in_len -= zeros_to_push;
+ resample->num_gap_samples += zeros_to_push;
+ }
+
+ {
+ guint num, den;
+ resample->funcs->get_ratio (resample->state, &num, &den);
+ if (resample->samples_in + in_len >= filt_len / 2)
+ out_processed =
+ gst_util_uint64_scale_int_ceil (resample->samples_in + in_len -
+ filt_len / 2, den, num) - resample->samples_out;
+ else
+ out_processed = 0;
+
+ memset (out_data, 0, out_size);
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
+ resample->num_gap_samples += in_len;
+ in_processed = in_len;
+ }
+ } else { /* not a gap */
+
+ gint err;
+
+ if (resample->num_gap_samples > filt_len) {
+ /* push in enough zeros to restore the filter to the right offset */
+ guint num, den;
+ resample->funcs->get_ratio (resample->state, &num, &den);
+ gst_audio_resample_dump_drain (resample,
+ (resample->num_gap_samples - filt_len) % num);
+ }
+ resample->num_gap_samples = 0;
+ if (resample->num_nongap_samples < filt_len) {
+ resample->num_nongap_samples += in_len;
+ if (resample->num_nongap_samples > filt_len)
+ resample->num_nongap_samples = filt_len;
+ }
+
+ if (resample->funcs->width != resample->width) {
+ /* need to convert data format for processing; ensure we have enough
+ * workspace available */
+ if (!gst_audio_resample_workspace_realloc (&resample->tmp_in,
+ &resample->tmp_in_size, in_len * resample->channels *
+ (resample->funcs->width / 8)) ||
+ !gst_audio_resample_workspace_realloc (&resample->tmp_out,
+ &resample->tmp_out_size, out_len * resample->channels *
+ (resample->funcs->width / 8))) {
+ GST_ERROR_OBJECT (resample, "failed to allocate workspace");
+ gst_buffer_unmap (inbuf, in_data, in_size);
+ gst_buffer_unmap (outbuf, out_data, out_size);
+ return GST_FLOW_ERROR;
+ }
+
+ /* convert input */
+ gst_audio_resample_convert_buffer (resample, in_data,
+ resample->tmp_in, in_len, FALSE);
+
+ /* process */
+ err = resample->funcs->process (resample->state,
+ resample->tmp_in, &in_processed, resample->tmp_out, &out_processed);
+
+ /* convert output */
+ gst_audio_resample_convert_buffer (resample, resample->tmp_out,
+ out_data, out_processed, TRUE);
+ } else {
+ /* no format conversion required; process */
+ err = resample->funcs->process (resample->state,
+ in_data, &in_processed, out_data, &out_processed);
+ }
+
+ if (G_UNLIKELY (err != RESAMPLER_ERR_SUCCESS)) {
+ GST_ERROR_OBJECT (resample, "Failed to convert data: %s",
+ resample->funcs->strerror (err));
+ gst_buffer_unmap (inbuf, in_data, in_size);
+ gst_buffer_unmap (outbuf, out_data, out_size);
+ return GST_FLOW_ERROR;
+ }
+ }
+
+ /* If we wrote more than allocated something is really wrong now and we
+ * should better abort immediately */
+ g_assert (out_len >= out_processed);
+
+ if (G_UNLIKELY (in_len != in_processed)) {
+ GST_WARNING_OBJECT (resample, "converted %d of %d input samples",
+ in_processed, in_len);
+ }
+
+ /* time */
+ if (GST_CLOCK_TIME_IS_VALID (resample->t0)) {
+ GST_BUFFER_TIMESTAMP (outbuf) = resample->t0 +
+ gst_util_uint64_scale_int_round (resample->samples_out, GST_SECOND,
+ resample->outrate);
+ GST_BUFFER_DURATION (outbuf) = resample->t0 +
+ gst_util_uint64_scale_int_round (resample->samples_out + out_processed,
+ GST_SECOND, resample->outrate) - GST_BUFFER_TIMESTAMP (outbuf);
+ } else {
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
+ }
+ /* offset */
+ if (resample->out_offset0 != GST_BUFFER_OFFSET_NONE) {
+ GST_BUFFER_OFFSET (outbuf) = resample->out_offset0 + resample->samples_out;
+ GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET (outbuf) + out_processed;
+ } else {
+ GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
+ }
+ /* move along */
+ resample->samples_out += out_processed;
+ resample->samples_in += in_len;
+
+ out_size = out_processed * resample->channels * (resample->width / 8);
+ gst_buffer_unmap (inbuf, in_data, in_size);
+ gst_buffer_unmap (outbuf, out_data, out_size);
+
+ GST_LOG_OBJECT (resample,
+ "Converted to buffer of %" G_GUINT32_FORMAT
+ " samples (%" G_GSIZE_FORMAT " bytes) with timestamp %" GST_TIME_FORMAT
+ ", duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT
+ ", offset_end %" G_GUINT64_FORMAT, out_processed, out_size,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)),
+ GST_BUFFER_OFFSET (outbuf), GST_BUFFER_OFFSET_END (outbuf));
+
+ if (out_processed == 0) {
+ GST_DEBUG_OBJECT (resample, "buffer dropped");
+ return GST_BASE_TRANSFORM_FLOW_DROPPED;
+ }
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_audio_resample_transform (GstBaseTransform * base, GstBuffer * inbuf,
+ GstBuffer * outbuf)
+{
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (base);
+ GstFlowReturn ret;
+
+ if (resample->state == NULL) {
+ if (G_UNLIKELY (!(resample->state =
+ gst_audio_resample_init_state (resample, resample->width,
+ resample->channels, resample->inrate, resample->outrate,
+ resample->quality, resample->fp))))
+ return GST_FLOW_ERROR;
+
+ resample->funcs =
+ gst_audio_resample_get_funcs (resample->width, resample->fp);
+ }
+
+ GST_LOG_OBJECT (resample, "transforming buffer of %ld bytes, ts %"
+ GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT ", offset %"
+ G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT,
+ gst_buffer_get_size (inbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (inbuf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (inbuf)),
+ GST_BUFFER_OFFSET (inbuf), GST_BUFFER_OFFSET_END (inbuf));
+
+ /* check for timestamp discontinuities; flush/reset if needed, and set
+ * flag to resync timestamp and offset counters and send event
+ * downstream */
+ if (G_UNLIKELY (gst_audio_resample_check_discont (resample, inbuf))) {
+ gst_audio_resample_reset_state (resample);
+ resample->need_discont = TRUE;
+ }
+
+ /* handle discontinuity */
+ if (G_UNLIKELY (resample->need_discont)) {
+ resample->funcs->skip_zeros (resample->state);
+ resample->num_gap_samples = 0;
+ resample->num_nongap_samples = 0;
+ /* reset */
+ resample->samples_in = 0;
+ resample->samples_out = 0;
+ GST_DEBUG_OBJECT (resample, "found discontinuity; resyncing");
+ /* resync the timestamp and offset counters if possible */
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (inbuf)) {
+ resample->t0 = GST_BUFFER_TIMESTAMP (inbuf);
+ } else {
+ GST_DEBUG_OBJECT (resample, "... but new timestamp is invalid");
+ resample->t0 = GST_CLOCK_TIME_NONE;
+ }
+ if (GST_BUFFER_OFFSET_IS_VALID (inbuf)) {
+ resample->in_offset0 = GST_BUFFER_OFFSET (inbuf);
+ resample->out_offset0 =
+ gst_util_uint64_scale_int_round (resample->in_offset0,
+ resample->outrate, resample->inrate);
+ } else {
+ GST_DEBUG_OBJECT (resample, "... but new offset is invalid");
+ resample->in_offset0 = GST_BUFFER_OFFSET_NONE;
+ resample->out_offset0 = GST_BUFFER_OFFSET_NONE;
+ }
+ /* set DISCONT flag on output buffer */
+ GST_DEBUG_OBJECT (resample, "marking this buffer with the DISCONT flag");
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ resample->need_discont = FALSE;
+ }
+
+ ret = gst_audio_resample_process (resample, inbuf, outbuf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ return ret;
+
+ GST_DEBUG_OBJECT (resample, "input = samples [%" G_GUINT64_FORMAT ", %"
+ G_GUINT64_FORMAT ") = [%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT
+ ") ns; output = samples [%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT
+ ") = [%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ") ns",
+ GST_BUFFER_OFFSET (inbuf), GST_BUFFER_OFFSET_END (inbuf),
+ GST_BUFFER_TIMESTAMP (inbuf), GST_BUFFER_TIMESTAMP (inbuf) +
+ GST_BUFFER_DURATION (inbuf), GST_BUFFER_OFFSET (outbuf),
+ GST_BUFFER_OFFSET_END (outbuf), GST_BUFFER_TIMESTAMP (outbuf),
+ GST_BUFFER_TIMESTAMP (outbuf) + GST_BUFFER_DURATION (outbuf));
+
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_audio_resample_query (GstPad * pad, GstQuery * query)
+{
+ GstAudioResample *resample = GST_AUDIO_RESAMPLE (gst_pad_get_parent (pad));
+ GstBaseTransform *trans;
+ gboolean res = TRUE;
+ if (G_UNLIKELY (resample == NULL))
+ return FALSE;
+
+ trans = GST_BASE_TRANSFORM (resample);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ GstClockTime min, max;
+ gboolean live;
+ guint64 latency;
+ GstPad *peer;
+ gint rate = resample->inrate;
+ gint resampler_latency;
+
+ if (resample->state)
+ resampler_latency =
+ resample->funcs->get_input_latency (resample->state);
+ else
+ resampler_latency = 0;
+
+ if (gst_base_transform_is_passthrough (trans))
+ resampler_latency = 0;
+
+ if ((peer = gst_pad_get_peer (GST_BASE_TRANSFORM_SINK_PAD (trans)))) {
+ if ((res = gst_pad_query (peer, query))) {
+ gst_query_parse_latency (query, &live, &min, &max);
+
+ GST_DEBUG_OBJECT (resample, "Peer latency: min %"
+ GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min), GST_TIME_ARGS (max));
+
+ /* add our own latency */
+ if (rate != 0 && resampler_latency != 0)
+ latency = gst_util_uint64_scale_round (resampler_latency,
+ GST_SECOND, rate);
+ else
+ latency = 0;
+
+ GST_DEBUG_OBJECT (resample, "Our latency: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (latency));
+
+ min += latency;
+ if (GST_CLOCK_TIME_IS_VALID (max))
+ max += latency;
+
+ GST_DEBUG_OBJECT (resample, "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 (resample);
+ return res;
+}
+
+static const GstQueryType *
+gst_audio_resample_query_type (GstPad * pad)
+{
+ static const GstQueryType types[] = {
+ GST_QUERY_LATENCY,
+ 0
+ };
+
+ return types;
+}
+
+static void
+gst_audio_resample_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAudioResample *resample;
+ gint quality;
+
+ resample = GST_AUDIO_RESAMPLE (object);
+
+ switch (prop_id) {
+ case PROP_QUALITY:
+ GST_BASE_TRANSFORM_LOCK (resample);
+ quality = g_value_get_int (value);
+ GST_DEBUG_OBJECT (resample, "new quality %d", quality);
+
+ gst_audio_resample_update_state (resample, resample->width,
+ resample->channels, resample->inrate, resample->outrate,
+ quality, resample->fp);
+ GST_BASE_TRANSFORM_UNLOCK (resample);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_resample_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAudioResample *resample;
+
+ resample = GST_AUDIO_RESAMPLE (object);
+
+ switch (prop_id) {
+ case PROP_QUALITY:
+ g_value_set_int (value, resample->quality);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* FIXME: should have a benchmark fallback for the case where orc is disabled */
+#if defined(AUDIORESAMPLE_FORMAT_AUTO) && !defined(DISABLE_ORC)
+
+#define BENCHMARK_SIZE 512
+
+static gboolean
+_benchmark_int_float (SpeexResamplerState * st)
+{
+ gint16 in[BENCHMARK_SIZE] = { 0, }, G_GNUC_UNUSED out[BENCHMARK_SIZE / 2];
+ gfloat in_tmp[BENCHMARK_SIZE], out_tmp[BENCHMARK_SIZE / 2];
+ gint i;
+ guint32 inlen = BENCHMARK_SIZE, outlen = BENCHMARK_SIZE / 2;
+
+ for (i = 0; i < BENCHMARK_SIZE; i++) {
+ gfloat tmp = in[i];
+ in_tmp[i] = tmp / G_MAXINT16;
+ }
+
+ resample_float_resampler_process_interleaved_float (st,
+ (const guint8 *) in_tmp, &inlen, (guint8 *) out_tmp, &outlen);
+
+ if (outlen == 0) {
+ GST_ERROR ("Failed to use float resampler");
+ return FALSE;
+ }
+
+ for (i = 0; i < outlen; i++) {
+ gfloat tmp = out_tmp[i];
+ out[i] = CLAMP (tmp * G_MAXINT16 + 0.5, G_MININT16, G_MAXINT16);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+_benchmark_int_int (SpeexResamplerState * st)
+{
+ gint16 in[BENCHMARK_SIZE] = { 0, }, out[BENCHMARK_SIZE / 2];
+ guint32 inlen = BENCHMARK_SIZE, outlen = BENCHMARK_SIZE / 2;
+
+ resample_int_resampler_process_interleaved_int (st, (const guint8 *) in,
+ &inlen, (guint8 *) out, &outlen);
+
+ if (outlen == 0) {
+ GST_ERROR ("Failed to use int resampler");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+_benchmark_integer_resampling (void)
+{
+ OrcProfile a, b;
+ gdouble av, bv;
+ SpeexResamplerState *sta, *stb;
+ int i;
+
+ orc_profile_init (&a);
+ orc_profile_init (&b);
+
+ sta = resample_float_resampler_init (1, 48000, 24000, 4, NULL);
+ if (sta == NULL) {
+ GST_ERROR ("Failed to create float resampler state");
+ return FALSE;
+ }
+
+ stb = resample_int_resampler_init (1, 48000, 24000, 4, NULL);
+ if (stb == NULL) {
+ resample_float_resampler_destroy (sta);
+ GST_ERROR ("Failed to create int resampler state");
+ return FALSE;
+ }
+
+ /* Benchmark */
+ for (i = 0; i < 10; i++) {
+ orc_profile_start (&a);
+ if (!_benchmark_int_float (sta))
+ goto error;
+ orc_profile_stop (&a);
+ }
+
+ /* Benchmark */
+ for (i = 0; i < 10; i++) {
+ orc_profile_start (&b);
+ if (!_benchmark_int_int (stb))
+ goto error;
+ orc_profile_stop (&b);
+ }
+
+ /* Handle results */
+ orc_profile_get_ave_std (&a, &av, NULL);
+ orc_profile_get_ave_std (&b, &bv, NULL);
+
+ /* Remember benchmark result in global variable */
+ gst_audio_resample_use_int = (av > bv);
+ resample_float_resampler_destroy (sta);
+ resample_int_resampler_destroy (stb);
+
+ if (av > bv)
+ GST_INFO ("Using integer resampler if appropiate: %lf < %lf", bv, av);
+ else
+ GST_INFO ("Using float resampler for everything: %lf <= %lf", av, bv);
+
+ return TRUE;
+
+error:
+ resample_float_resampler_destroy (sta);
+ resample_int_resampler_destroy (stb);
+
+ return FALSE;
+}
+#endif /* defined(AUDIORESAMPLE_FORMAT_AUTO) && !defined(DISABLE_ORC) */
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (audio_resample_debug, "audioresample", 0,
+ "audio resampling element");
+
+#if defined(AUDIORESAMPLE_FORMAT_AUTO) && !defined(DISABLE_ORC)
+ if (!_benchmark_integer_resampling ())
+ return FALSE;
+#else
+ GST_WARNING ("Orc disabled, can't benchmark int vs. float resampler");
+ {
+ GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+ GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+ GST_CAT_WARNING (GST_CAT_PERFORMANCE, "orc disabled, no benchmarking done");
+ }
+#endif
+
+ if (!gst_element_register (plugin, "audioresample", GST_RANK_PRIMARY,
+ GST_TYPE_AUDIO_RESAMPLE)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "audioresample",
+ "Resamples audio", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN);
diff --git a/gst/audioresample/gstaudioresample.h b/gst/audioresample/gstaudioresample.h
new file mode 100644
index 0000000..da75b64
--- /dev/null
+++ b/gst/audioresample/gstaudioresample.h
@@ -0,0 +1,98 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2007-2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __AUDIO_RESAMPLE_H__
+#define __AUDIO_RESAMPLE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+
+#include "speex_resampler_wrapper.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AUDIO_RESAMPLE \
+ (gst_audio_resample_get_type())
+#define GST_AUDIO_RESAMPLE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_RESAMPLE,GstAudioResample))
+#define GST_AUDIO_RESAMPLE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_RESAMPLE,GstAudioResampleClass))
+#define GST_IS_AUDIO_RESAMPLE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_RESAMPLE))
+#define GST_IS_AUDIO_RESAMPLE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_RESAMPLE))
+
+typedef struct _GstAudioResample GstAudioResample;
+typedef struct _GstAudioResampleClass GstAudioResampleClass;
+
+/**
+ * GstAudioResample:
+ *
+ * Opaque data structure.
+ */
+struct _GstAudioResample {
+ GstBaseTransform element;
+
+ /* <private> */
+ gboolean need_discont;
+
+ GstClockTime t0;
+ guint64 in_offset0;
+ guint64 out_offset0;
+ guint64 samples_in;
+ guint64 samples_out;
+
+ guint64 num_gap_samples;
+ guint64 num_nongap_samples;
+
+ GstAudioInfo in;
+ GstAudioInfo out;
+
+ /* properties */
+ gint quality;
+
+ /* state */
+ gboolean fp;
+ gint width;
+ gint channels;
+ gint inrate;
+ gint outrate;
+
+ guint8 *tmp_in;
+ guint tmp_in_size;
+
+ guint8 *tmp_out;
+ guint tmp_out_size;
+
+ SpeexResamplerState *state;
+ const SpeexResampleFuncs *funcs;
+};
+
+struct _GstAudioResampleClass {
+ GstBaseTransformClass parent_class;
+};
+
+GType gst_audio_resample_get_type(void);
+
+G_END_DECLS
+
+#endif /* __AUDIO_RESAMPLE_H__ */
diff --git a/gst/audioresample/resample.c b/gst/audioresample/resample.c
new file mode 100644
index 0000000..66c2c6d
--- /dev/null
+++ b/gst/audioresample/resample.c
@@ -0,0 +1,1429 @@
+/* Copyright (C) 2007-2008 Jean-Marc Valin
+ Copyright (C) 2008 Thorvald Natvig
+
+ File: resample.c
+ Arbitrary resampling code
+
+ Redistribution and use in source and binary forms, with or without
+ modification, 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.
+*/
+
+/*
+ The design goals of this code are:
+ - Very fast algorithm
+ - SIMD-friendly algorithm
+ - Low memory requirement
+ - Good *perceptual* quality (and not best SNR)
+
+ Warning: This resampler is relatively new. Although I think I got rid of
+ all the major bugs and I don't expect the API to change anymore, there
+ may be something I've missed. So use with caution.
+
+ This algorithm is based on this original resampling algorithm:
+ Smith, Julius O. Digital Audio Resampling Home Page
+ Center for Computer Research in Music and Acoustics (CCRMA),
+ Stanford University, 2007.
+ Web published at http://www-ccrma.stanford.edu/~jos/resample/.
+
+ There is one main difference, though. This resampler uses cubic
+ interpolation instead of linear interpolation in the above paper. This
+ makes the table much smaller and makes it possible to compute that table
+ on a per-stream basis. In turn, being able to tweak the table for each
+ stream makes it possible to both reduce complexity on simple ratios
+ (e.g. 2/3), and get rid of the rounding operations in the inner loop.
+ The latter both reduces CPU time and makes the algorithm more SIMD-friendly.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef OUTSIDE_SPEEX
+#include <stdlib.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <glib.h>
+
+#ifdef HAVE_ORC
+#include <orc/orc.h>
+#endif
+
+#define EXPORT G_GNUC_INTERNAL
+
+#ifdef _USE_SSE
+#ifndef HAVE_XMMINTRIN_H
+#undef _USE_SSE
+#endif
+#endif
+
+#ifdef _USE_SSE2
+#ifndef HAVE_EMMINTRIN_H
+#undef _USE_SSE2
+#endif
+#endif
+
+static inline void *
+speex_alloc (int size)
+{
+ return g_malloc0 (size);
+}
+
+static inline void *
+speex_realloc (void *ptr, int size)
+{
+ return g_realloc (ptr, size);
+}
+
+static inline void
+speex_free (void *ptr)
+{
+ g_free (ptr);
+}
+
+#include "speex_resampler.h"
+#include "arch.h"
+#else /* OUTSIDE_SPEEX */
+
+#include "../include/speex/speex_resampler.h"
+#include "arch.h"
+#include "os_support.h"
+#endif /* OUTSIDE_SPEEX */
+
+#include <math.h>
+
+#ifdef FIXED_POINT
+#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x)))
+#else
+#define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x))))
+#endif
+
+#define IMAX(a,b) ((a) > (b) ? (a) : (b))
+#define IMIN(a,b) ((a) < (b) ? (a) : (b))
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#if defined _USE_SSE || defined _USE_SSE2
+#include "resample_sse.h"
+#endif
+
+/* Numer of elements to allocate on the stack */
+#ifdef VAR_ARRAYS
+#define FIXED_STACK_ALLOC 8192
+#else
+#define FIXED_STACK_ALLOC 1024
+#endif
+
+/* Allow selecting SSE or not when compiled with SSE support */
+#ifdef _USE_SSE
+#define SSE_FALLBACK(macro) \
+ if (st->use_sse) goto sse_##macro##_sse; {
+#define SSE_IMPLEMENTATION(macro) \
+ goto sse_##macro##_end; } sse_##macro##_sse: {
+#define SSE_END(macro) sse_##macro##_end:; }
+#else
+#define SSE_FALLBACK(macro)
+#endif
+
+#ifdef _USE_SSE2
+#define SSE2_FALLBACK(macro) \
+ if (st->use_sse2) goto sse2_##macro##_sse2; {
+#define SSE2_IMPLEMENTATION(macro) \
+ goto sse2_##macro##_end; } sse2_##macro##_sse2: {
+#define SSE2_END(macro) sse2_##macro##_end:; }
+#else
+#define SSE2_FALLBACK(macro)
+#endif
+
+
+typedef int (*resampler_basic_func) (SpeexResamplerState *, spx_uint32_t,
+ const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *);
+
+struct SpeexResamplerState_
+{
+ spx_uint32_t in_rate;
+ spx_uint32_t out_rate;
+ spx_uint32_t num_rate;
+ spx_uint32_t den_rate;
+
+ int quality;
+ spx_uint32_t nb_channels;
+ spx_uint32_t filt_len;
+ spx_uint32_t mem_alloc_size;
+ spx_uint32_t buffer_size;
+ int int_advance;
+ int frac_advance;
+ float cutoff;
+ spx_uint32_t oversample;
+ int initialised;
+ int started;
+
+ /* These are per-channel */
+ spx_int32_t *last_sample;
+ spx_uint32_t *samp_frac_num;
+ spx_uint32_t *magic_samples;
+
+ spx_word16_t *mem;
+ spx_word16_t *sinc_table;
+ spx_uint32_t sinc_table_length;
+ resampler_basic_func resampler_ptr;
+
+ int in_stride;
+ int out_stride;
+
+ int use_sse:1;
+ int use_sse2:1;
+};
+
+static double kaiser12_table[68] = {
+ 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076,
+ 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014,
+ 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601,
+ 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014,
+ 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490,
+ 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546,
+ 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178,
+ 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947,
+ 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058,
+ 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438,
+ 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734,
+ 0.00001000, 0.00000000
+};
+
+/*
+static double kaiser12_table[36] = {
+ 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741,
+ 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762,
+ 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274,
+ 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466,
+ 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291,
+ 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000};
+*/
+static double kaiser10_table[36] = {
+ 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446,
+ 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347,
+ 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962,
+ 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451,
+ 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739,
+ 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000
+};
+
+static double kaiser8_table[36] = {
+ 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200,
+ 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126,
+ 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272,
+ 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758,
+ 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490,
+ 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000
+};
+
+static double kaiser6_table[36] = {
+ 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003,
+ 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565,
+ 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561,
+ 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058,
+ 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600,
+ 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000
+};
+
+struct FuncDef
+{
+ double *table;
+ int oversample;
+};
+
+static struct FuncDef _KAISER12 = { kaiser12_table, 64 };
+
+#define KAISER12 (&_KAISER12)
+/*static struct FuncDef _KAISER12 = {kaiser12_table, 32};
+#define KAISER12 (&_KAISER12)*/
+static struct FuncDef _KAISER10 = { kaiser10_table, 32 };
+
+#define KAISER10 (&_KAISER10)
+static struct FuncDef _KAISER8 = { kaiser8_table, 32 };
+
+#define KAISER8 (&_KAISER8)
+static struct FuncDef _KAISER6 = { kaiser6_table, 32 };
+
+#define KAISER6 (&_KAISER6)
+
+struct QualityMapping
+{
+ int base_length;
+ int oversample;
+ float downsample_bandwidth;
+ float upsample_bandwidth;
+ struct FuncDef *window_func;
+};
+
+
+/* This table maps conversion quality to internal parameters. There are two
+ reasons that explain why the up-sampling bandwidth is larger than the
+ down-sampling bandwidth:
+ 1) When up-sampling, we can assume that the spectrum is already attenuated
+ close to the Nyquist rate (from an A/D or a previous resampling filter)
+ 2) Any aliasing that occurs very close to the Nyquist rate will be masked
+ by the sinusoids/noise just below the Nyquist rate (guaranteed only for
+ up-sampling).
+*/
+static const struct QualityMapping quality_map[11] = {
+ {8, 4, 0.830f, 0.860f, KAISER6}, /* Q0 */
+ {16, 4, 0.850f, 0.880f, KAISER6}, /* Q1 */
+ {32, 4, 0.882f, 0.910f, KAISER6}, /* Q2 *//* 82.3% cutoff ( ~60 dB stop) 6 */
+ {48, 8, 0.895f, 0.917f, KAISER8}, /* Q3 *//* 84.9% cutoff ( ~80 dB stop) 8 */
+ {64, 8, 0.921f, 0.940f, KAISER8}, /* Q4 *//* 88.7% cutoff ( ~80 dB stop) 8 */
+ {80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 *//* 89.1% cutoff (~100 dB stop) 10 */
+ {96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 *//* 91.5% cutoff (~100 dB stop) 10 */
+ {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 *//* 93.1% cutoff (~100 dB stop) 10 */
+ {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 *//* 94.5% cutoff (~100 dB stop) 10 */
+ {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 *//* 95.5% cutoff (~100 dB stop) 10 */
+ {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 *//* 96.6% cutoff (~100 dB stop) 10 */
+};
+
+/*8,24,40,56,80,104,128,160,200,256,320*/
+#ifdef DOUBLE_PRECISION
+static double
+compute_func (double x, struct FuncDef *func)
+{
+ double y, frac;
+#else
+static double
+compute_func (float x, struct FuncDef *func)
+{
+ float y, frac;
+#endif
+ double interp[4];
+ int ind;
+ y = x * func->oversample;
+ ind = (int) floor (y);
+ frac = (y - ind);
+ /* CSE with handle the repeated powers */
+ interp[3] = -0.1666666667 * frac + 0.1666666667 * (frac * frac * frac);
+ interp[2] = frac + 0.5 * (frac * frac) - 0.5 * (frac * frac * frac);
+ /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac; */
+ interp[0] =
+ -0.3333333333 * frac + 0.5 * (frac * frac) -
+ 0.1666666667 * (frac * frac * frac);
+ /* Just to make sure we don't have rounding problems */
+ interp[1] = 1.f - interp[3] - interp[2] - interp[0];
+
+ /*sum = frac*accum[1] + (1-frac)*accum[2]; */
+ return interp[0] * func->table[ind] + interp[1] * func->table[ind + 1] +
+ interp[2] * func->table[ind + 2] + interp[3] * func->table[ind + 3];
+}
+
+#if 0
+#include <stdio.h>
+int
+main (int argc, char **argv)
+{
+ int i;
+ for (i = 0; i < 256; i++) {
+ printf ("%f\n", compute_func (i / 256., KAISER12));
+ }
+ return 0;
+}
+#endif
+
+#ifdef FIXED_POINT
+/* The slow way of computing a sinc for the table. Should improve that some day */
+static spx_word16_t
+sinc (float cutoff, float x, int N, struct FuncDef *window_func)
+{
+ /*fprintf (stderr, "%f ", x); */
+ float xx = x * cutoff;
+ if (fabs (x) < 1e-6f)
+ return WORD2INT (32768. * cutoff);
+ else if (fabs (x) > .5f * N)
+ return 0;
+ /*FIXME: Can it really be any slower than this? */
+ return WORD2INT (32768. * cutoff * sin (G_PI * xx) / (G_PI * xx) *
+ compute_func (fabs (2. * x / N), window_func));
+}
+#else
+/* The slow way of computing a sinc for the table. Should improve that some day */
+#ifdef DOUBLE_PRECISION
+static spx_word16_t
+sinc (double cutoff, double x, int N, struct FuncDef *window_func)
+{
+ /*fprintf (stderr, "%f ", x); */
+ double xx = x * cutoff;
+#else
+static spx_word16_t
+sinc (float cutoff, float x, int N, struct FuncDef *window_func)
+{
+ /*fprintf (stderr, "%f ", x); */
+ float xx = x * cutoff;
+#endif
+ if (fabs (x) < 1e-6)
+ return cutoff;
+ else if (fabs (x) > .5 * N)
+ return 0;
+ /*FIXME: Can it really be any slower than this? */
+ return cutoff * sin (G_PI * xx) / (G_PI * xx) * compute_func (fabs (2. * x /
+ N), window_func);
+}
+#endif
+
+#ifdef FIXED_POINT
+static void
+cubic_coef (spx_word16_t x, spx_word16_t interp[4])
+{
+ /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation
+ but I know it's MMSE-optimal on a sinc */
+ spx_word16_t x2, x3;
+ x2 = MULT16_16_P15 (x, x);
+ x3 = MULT16_16_P15 (x, x2);
+ interp[0] =
+ PSHR32 (MULT16_16 (QCONST16 (-0.16667f, 15),
+ x) + MULT16_16 (QCONST16 (0.16667f, 15), x3), 15);
+ interp[1] =
+ EXTRACT16 (EXTEND32 (x) + SHR32 (SUB32 (EXTEND32 (x2), EXTEND32 (x3)),
+ 1));
+ interp[3] =
+ PSHR32 (MULT16_16 (QCONST16 (-0.33333f, 15),
+ x) + MULT16_16 (QCONST16 (.5f, 15),
+ x2) - MULT16_16 (QCONST16 (0.16667f, 15), x3), 15);
+ /* Just to make sure we don't have rounding problems */
+ interp[2] = Q15_ONE - interp[0] - interp[1] - interp[3];
+ if (interp[2] < 32767)
+ interp[2] += 1;
+}
+#else
+static void
+cubic_coef (spx_word16_t frac, spx_word16_t interp[4])
+{
+ /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation
+ but I know it's MMSE-optimal on a sinc */
+ interp[0] = -0.16667f * frac + 0.16667f * frac * frac * frac;
+ interp[1] = frac + 0.5f * frac * frac - 0.5f * frac * frac * frac;
+ /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac; */
+ interp[3] =
+ -0.33333f * frac + 0.5f * frac * frac - 0.16667f * frac * frac * frac;
+ /* Just to make sure we don't have rounding problems */
+ interp[2] = 1. - interp[0] - interp[1] - interp[3];
+}
+#endif
+
+#ifndef DOUBLE_PRECISION
+static int
+resampler_basic_direct_single (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+ spx_word16_t * out, spx_uint32_t * out_len)
+{
+ const int N = st->filt_len;
+ int out_sample = 0;
+ int last_sample = st->last_sample[channel_index];
+ spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
+ const spx_word16_t *sinc_table = st->sinc_table;
+ const int out_stride = st->out_stride;
+ const int int_advance = st->int_advance;
+ const int frac_advance = st->frac_advance;
+ const spx_uint32_t den_rate = st->den_rate;
+ spx_word32_t sum;
+ int j;
+
+ while (!(last_sample >= (spx_int32_t) * in_len
+ || out_sample >= (spx_int32_t) * out_len)) {
+ const spx_word16_t *sinc = &sinc_table[samp_frac_num * N];
+ const spx_word16_t *iptr = &in[last_sample];
+
+ SSE_FALLBACK (INNER_PRODUCT_SINGLE)
+ sum = 0;
+ for (j = 0; j < N; j++)
+ sum += MULT16_16 (sinc[j], iptr[j]);
+
+/* This code is slower on most DSPs which have only 2 accumulators.
+ Plus this this forces truncation to 32 bits and you lose the HW guard bits.
+ I think we can trust the compiler and let it vectorize and/or unroll itself.
+ spx_word32_t accum[4] = {0,0,0,0};
+ for(j=0;j<N;j+=4) {
+ accum[0] += MULT16_16(sinc[j], iptr[j]);
+ accum[1] += MULT16_16(sinc[j+1], iptr[j+1]);
+ accum[2] += MULT16_16(sinc[j+2], iptr[j+2]);
+ accum[3] += MULT16_16(sinc[j+3], iptr[j+3]);
+ }
+ sum = accum[0] + accum[1] + accum[2] + accum[3];
+*/
+#ifdef OVERRIDE_INNER_PRODUCT_SINGLE
+ SSE_IMPLEMENTATION (INNER_PRODUCT_SINGLE)
+ sum = inner_product_single (sinc, iptr, N);
+ SSE_END (INNER_PRODUCT_SINGLE)
+#endif
+ out[out_stride * out_sample++] = SATURATE32 (PSHR32 (sum, 15), 32767);
+ last_sample += int_advance;
+ samp_frac_num += frac_advance;
+ if (samp_frac_num >= den_rate) {
+ samp_frac_num -= den_rate;
+ last_sample++;
+ }
+ }
+
+ st->last_sample[channel_index] = last_sample;
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+}
+#endif
+
+#ifdef FIXED_POINT
+#else
+/* This is the same as the previous function, except with a double-precision accumulator */
+static int
+resampler_basic_direct_double (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+ spx_word16_t * out, spx_uint32_t * out_len)
+{
+ const int N = st->filt_len;
+ int out_sample = 0;
+ int last_sample = st->last_sample[channel_index];
+ spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
+ const spx_word16_t *sinc_table = st->sinc_table;
+ const int out_stride = st->out_stride;
+ const int int_advance = st->int_advance;
+ const int frac_advance = st->frac_advance;
+ const spx_uint32_t den_rate = st->den_rate;
+ double sum;
+ int j;
+
+ while (!(last_sample >= (spx_int32_t) * in_len
+ || out_sample >= (spx_int32_t) * out_len)) {
+ const spx_word16_t *sinc = &sinc_table[samp_frac_num * N];
+ const spx_word16_t *iptr = &in[last_sample];
+
+ SSE2_FALLBACK (INNER_PRODUCT_DOUBLE)
+ double accum[4] = { 0, 0, 0, 0 };
+
+ for (j = 0; j < N; j += 4) {
+ accum[0] += sinc[j] * iptr[j];
+ accum[1] += sinc[j + 1] * iptr[j + 1];
+ accum[2] += sinc[j + 2] * iptr[j + 2];
+ accum[3] += sinc[j + 3] * iptr[j + 3];
+ }
+ sum = accum[0] + accum[1] + accum[2] + accum[3];
+#ifdef OVERRIDE_INNER_PRODUCT_DOUBLE
+ SSE2_IMPLEMENTATION (INNER_PRODUCT_DOUBLE)
+ sum = inner_product_double (sinc, iptr, N);
+ SSE2_END (INNER_PRODUCT_DOUBLE)
+#endif
+ out[out_stride * out_sample++] = PSHR32 (sum, 15);
+ last_sample += int_advance;
+ samp_frac_num += frac_advance;
+ if (samp_frac_num >= den_rate) {
+ samp_frac_num -= den_rate;
+ last_sample++;
+ }
+ }
+
+ st->last_sample[channel_index] = last_sample;
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+}
+#endif
+
+#ifndef DOUBLE_PRECISION
+static int
+resampler_basic_interpolate_single (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+ spx_word16_t * out, spx_uint32_t * out_len)
+{
+ const int N = st->filt_len;
+ int out_sample = 0;
+ int last_sample = st->last_sample[channel_index];
+ spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
+ const int out_stride = st->out_stride;
+ const int int_advance = st->int_advance;
+ const int frac_advance = st->frac_advance;
+ const spx_uint32_t den_rate = st->den_rate;
+ int j;
+ spx_word32_t sum;
+
+ while (!(last_sample >= (spx_int32_t) * in_len
+ || out_sample >= (spx_int32_t) * out_len)) {
+ const spx_word16_t *iptr = &in[last_sample];
+
+ const int offset = samp_frac_num * st->oversample / st->den_rate;
+#ifdef FIXED_POINT
+ const spx_word16_t frac =
+ PDIV32 (SHL32 ((samp_frac_num * st->oversample) % st->den_rate, 15),
+ st->den_rate);
+#else
+ const spx_word16_t frac =
+ ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
+ st->den_rate;
+#endif
+ spx_word16_t interp[4];
+
+
+ SSE_FALLBACK (INTERPOLATE_PRODUCT_SINGLE)
+ spx_word32_t accum[4] = { 0, 0, 0, 0 };
+
+ for (j = 0; j < N; j++) {
+ const spx_word16_t curr_in = iptr[j];
+ accum[0] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset - 2]);
+ accum[1] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset - 1]);
+ accum[2] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset]);
+ accum[3] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset + 1]);
+ }
+
+ cubic_coef (frac, interp);
+ sum =
+ MULT16_32_Q15 (interp[0], SHR32 (accum[0],
+ 1)) + MULT16_32_Q15 (interp[1], SHR32 (accum[1],
+ 1)) + MULT16_32_Q15 (interp[2], SHR32 (accum[2],
+ 1)) + MULT16_32_Q15 (interp[3], SHR32 (accum[3], 1));
+#ifdef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE
+ SSE_IMPLEMENTATION (INTERPOLATE_PRODUCT_SINGLE)
+ cubic_coef (frac, interp);
+ sum =
+ interpolate_product_single (iptr,
+ st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample,
+ interp);
+ SSE_END (INTERPOLATE_PRODUCT_SINGLE)
+#endif
+ out[out_stride * out_sample++] = SATURATE32 (PSHR32 (sum, 14), 32767);
+ last_sample += int_advance;
+ samp_frac_num += frac_advance;
+ if (samp_frac_num >= den_rate) {
+ samp_frac_num -= den_rate;
+ last_sample++;
+ }
+ }
+
+ st->last_sample[channel_index] = last_sample;
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+}
+#endif
+
+#ifdef FIXED_POINT
+#else
+/* This is the same as the previous function, except with a double-precision accumulator */
+static int
+resampler_basic_interpolate_double (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
+ spx_word16_t * out, spx_uint32_t * out_len)
+{
+ const int N = st->filt_len;
+ int out_sample = 0;
+ int last_sample = st->last_sample[channel_index];
+ spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
+ const int out_stride = st->out_stride;
+ const int int_advance = st->int_advance;
+ const int frac_advance = st->frac_advance;
+ const spx_uint32_t den_rate = st->den_rate;
+ int j;
+ spx_word32_t sum;
+
+ while (!(last_sample >= (spx_int32_t) * in_len
+ || out_sample >= (spx_int32_t) * out_len)) {
+ const spx_word16_t *iptr = &in[last_sample];
+
+ const int offset = samp_frac_num * st->oversample / st->den_rate;
+#ifdef FIXED_POINT
+ const spx_word16_t frac =
+ PDIV32 (SHL32 ((samp_frac_num * st->oversample) % st->den_rate, 15),
+ st->den_rate);
+#else
+#ifdef DOUBLE_PRECISION
+ const spx_word16_t frac =
+ ((double) ((samp_frac_num * st->oversample) % st->den_rate)) /
+ st->den_rate;
+#else
+ const spx_word16_t frac =
+ ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
+ st->den_rate;
+#endif
+#endif
+ spx_word16_t interp[4];
+
+
+ SSE2_FALLBACK (INTERPOLATE_PRODUCT_DOUBLE)
+ double accum[4] = { 0, 0, 0, 0 };
+
+ for (j = 0; j < N; j++) {
+ const double curr_in = iptr[j];
+ accum[0] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset - 2]);
+ accum[1] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset - 1]);
+ accum[2] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset]);
+ accum[3] +=
+ MULT16_16 (curr_in,
+ st->sinc_table[4 + (j + 1) * st->oversample - offset + 1]);
+ }
+
+ cubic_coef (frac, interp);
+ sum =
+ MULT16_32_Q15 (interp[0], accum[0]) + MULT16_32_Q15 (interp[1],
+ accum[1]) + MULT16_32_Q15 (interp[2],
+ accum[2]) + MULT16_32_Q15 (interp[3], accum[3]);
+#ifdef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE
+ SSE2_IMPLEMENTATION (INTERPOLATE_PRODUCT_DOUBLE)
+ cubic_coef (frac, interp);
+ sum =
+ interpolate_product_double (iptr,
+ st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample,
+ interp);
+ SSE2_END (INTERPOLATE_PRODUCT_DOUBLE)
+#endif
+ out[out_stride * out_sample++] = PSHR32 (sum, 15);
+ last_sample += int_advance;
+ samp_frac_num += frac_advance;
+ if (samp_frac_num >= den_rate) {
+ samp_frac_num -= den_rate;
+ last_sample++;
+ }
+ }
+
+ st->last_sample[channel_index] = last_sample;
+ st->samp_frac_num[channel_index] = samp_frac_num;
+ return out_sample;
+}
+#endif
+
+static void
+update_filter (SpeexResamplerState * st)
+{
+ spx_uint32_t old_length;
+
+ old_length = st->filt_len;
+ st->oversample = quality_map[st->quality].oversample;
+ st->filt_len = quality_map[st->quality].base_length;
+
+ if (st->num_rate > st->den_rate) {
+ /* down-sampling */
+ st->cutoff =
+ quality_map[st->quality].downsample_bandwidth * st->den_rate /
+ st->num_rate;
+ /* FIXME: divide the numerator and denominator by a certain amount if they're too large */
+ st->filt_len = st->filt_len * st->num_rate / st->den_rate;
+ /* Round down to make sure we have a multiple of 4 */
+ st->filt_len &= (~0x3);
+ if (2 * st->den_rate < st->num_rate)
+ st->oversample >>= 1;
+ if (4 * st->den_rate < st->num_rate)
+ st->oversample >>= 1;
+ if (8 * st->den_rate < st->num_rate)
+ st->oversample >>= 1;
+ if (16 * st->den_rate < st->num_rate)
+ st->oversample >>= 1;
+ if (st->oversample < 1)
+ st->oversample = 1;
+ } else {
+ /* up-sampling */
+ st->cutoff = quality_map[st->quality].upsample_bandwidth;
+ }
+
+ /* Choose the resampling type that requires the least amount of memory */
+ if (st->den_rate <= st->oversample) {
+ spx_uint32_t i;
+ if (!st->sinc_table)
+ st->sinc_table =
+ (spx_word16_t *) speex_alloc (st->filt_len * st->den_rate *
+ sizeof (spx_word16_t));
+ else if (st->sinc_table_length < st->filt_len * st->den_rate) {
+ st->sinc_table =
+ (spx_word16_t *) speex_realloc (st->sinc_table,
+ st->filt_len * st->den_rate * sizeof (spx_word16_t));
+ st->sinc_table_length = st->filt_len * st->den_rate;
+ }
+ for (i = 0; i < st->den_rate; i++) {
+ spx_int32_t j;
+ for (j = 0; j < st->filt_len; j++) {
+ st->sinc_table[i * st->filt_len + j] =
+ sinc (st->cutoff, ((j - (spx_int32_t) st->filt_len / 2 + 1) -
+#ifdef DOUBLE_PRECISION
+ ((double) i) / st->den_rate), st->filt_len,
+#else
+ ((float) i) / st->den_rate), st->filt_len,
+#endif
+ quality_map[st->quality].window_func);
+ }
+ }
+#ifdef FIXED_POINT
+ st->resampler_ptr = resampler_basic_direct_single;
+#else
+#ifdef DOUBLE_PRECISION
+ st->resampler_ptr = resampler_basic_direct_double;
+#else
+ if (st->quality > 8)
+ st->resampler_ptr = resampler_basic_direct_double;
+ else
+ st->resampler_ptr = resampler_basic_direct_single;
+#endif
+#endif
+ /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff); */
+ } else {
+ spx_int32_t i;
+ if (!st->sinc_table)
+ st->sinc_table =
+ (spx_word16_t *) speex_alloc ((st->filt_len * st->oversample +
+ 8) * sizeof (spx_word16_t));
+ else if (st->sinc_table_length < st->filt_len * st->oversample + 8) {
+ st->sinc_table =
+ (spx_word16_t *) speex_realloc (st->sinc_table,
+ (st->filt_len * st->oversample + 8) * sizeof (spx_word16_t));
+ st->sinc_table_length = st->filt_len * st->oversample + 8;
+ }
+ for (i = -4; i < (spx_int32_t) (st->oversample * st->filt_len + 4); i++)
+ st->sinc_table[i + 4] =
+#ifdef DOUBLE_PRECISION
+ sinc (st->cutoff, (i / (double) st->oversample - st->filt_len / 2),
+#else
+ sinc (st->cutoff, (i / (float) st->oversample - st->filt_len / 2),
+#endif
+ st->filt_len, quality_map[st->quality].window_func);
+#ifdef FIXED_POINT
+ st->resampler_ptr = resampler_basic_interpolate_single;
+#else
+#ifdef DOUBLE_PRECISION
+ st->resampler_ptr = resampler_basic_interpolate_double;
+#else
+ if (st->quality > 8)
+ st->resampler_ptr = resampler_basic_interpolate_double;
+ else
+ st->resampler_ptr = resampler_basic_interpolate_single;
+#endif
+#endif
+ /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff); */
+ }
+ st->int_advance = st->num_rate / st->den_rate;
+ st->frac_advance = st->num_rate % st->den_rate;
+
+
+ /* Here's the place where we update the filter memory to take into account
+ the change in filter length. It's probably the messiest part of the code
+ due to handling of lots of corner cases. */
+ if (!st->mem) {
+ spx_uint32_t i;
+ st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
+ st->mem =
+ (spx_word16_t *) speex_alloc (st->nb_channels * st->mem_alloc_size *
+ sizeof (spx_word16_t));
+ for (i = 0; i < st->nb_channels * st->mem_alloc_size; i++)
+ st->mem[i] = 0;
+ /*speex_warning("init filter"); */
+ } else if (!st->started) {
+ spx_uint32_t i;
+ st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
+ st->mem =
+ (spx_word16_t *) speex_realloc (st->mem,
+ st->nb_channels * st->mem_alloc_size * sizeof (spx_word16_t));
+ for (i = 0; i < st->nb_channels * st->mem_alloc_size; i++)
+ st->mem[i] = 0;
+ /*speex_warning("reinit filter"); */
+ } else if (st->filt_len > old_length) {
+ spx_int32_t i;
+ /* Increase the filter length */
+ /*speex_warning("increase filter size"); */
+ int old_alloc_size = st->mem_alloc_size;
+ if ((st->filt_len - 1 + st->buffer_size) > st->mem_alloc_size) {
+ st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
+ st->mem =
+ (spx_word16_t *) speex_realloc (st->mem,
+ st->nb_channels * st->mem_alloc_size * sizeof (spx_word16_t));
+ }
+ for (i = st->nb_channels - 1; i >= 0; i--) {
+ spx_int32_t j;
+ spx_uint32_t olen = old_length;
+ /*if (st->magic_samples[i]) */
+ {
+ /* Try and remove the magic samples as if nothing had happened */
+
+ /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */
+ olen = old_length + 2 * st->magic_samples[i];
+ for (j = old_length - 2 + st->magic_samples[i]; j >= 0; j--)
+ st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]] =
+ st->mem[i * old_alloc_size + j];
+ for (j = 0; j < st->magic_samples[i]; j++)
+ st->mem[i * st->mem_alloc_size + j] = 0;
+ st->magic_samples[i] = 0;
+ }
+ if (st->filt_len > olen) {
+ /* If the new filter length is still bigger than the "augmented" length */
+ /* Copy data going backward */
+ for (j = 0; j < olen - 1; j++)
+ st->mem[i * st->mem_alloc_size + (st->filt_len - 2 - j)] =
+ st->mem[i * st->mem_alloc_size + (olen - 2 - j)];
+ /* Then put zeros for lack of anything better */
+ for (; j < st->filt_len - 1; j++)
+ st->mem[i * st->mem_alloc_size + (st->filt_len - 2 - j)] = 0;
+ /* Adjust last_sample */
+ st->last_sample[i] += (st->filt_len - olen) / 2;
+ } else {
+ /* Put back some of the magic! */
+ st->magic_samples[i] = (olen - st->filt_len) / 2;
+ for (j = 0; j < st->filt_len - 1 + st->magic_samples[i]; j++)
+ st->mem[i * st->mem_alloc_size + j] =
+ st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]];
+ }
+ }
+ } else if (st->filt_len < old_length) {
+ spx_uint32_t i;
+ /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic"
+ samples so they can be used directly as input the next time(s) */
+ for (i = 0; i < st->nb_channels; i++) {
+ spx_uint32_t j;
+ spx_uint32_t old_magic = st->magic_samples[i];
+ st->magic_samples[i] = (old_length - st->filt_len) / 2;
+ /* We must copy some of the memory that's no longer used */
+ /* Copy data going backward */
+ for (j = 0; j < st->filt_len - 1 + st->magic_samples[i] + old_magic; j++)
+ st->mem[i * st->mem_alloc_size + j] =
+ st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]];
+ st->magic_samples[i] += old_magic;
+ }
+ }
+
+}
+
+EXPORT SpeexResamplerState *
+speex_resampler_init (spx_uint32_t nb_channels, spx_uint32_t in_rate,
+ spx_uint32_t out_rate, int quality, int *err)
+{
+ return speex_resampler_init_frac (nb_channels, in_rate, out_rate, in_rate,
+ out_rate, quality, err);
+}
+
+#if defined HAVE_ORC && !defined DISABLE_ORC
+static void
+check_insn_set (SpeexResamplerState * st, const char *name)
+{
+ if (!name)
+ return;
+ if (!strcmp (name, "sse"))
+ st->use_sse = 1;
+ if (!strcmp (name, "sse2"))
+ st->use_sse = st->use_sse2 = 1;
+}
+#endif
+
+EXPORT SpeexResamplerState *
+speex_resampler_init_frac (spx_uint32_t nb_channels, spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate,
+ int quality, int *err)
+{
+ spx_uint32_t i;
+ SpeexResamplerState *st;
+ if (quality > 10 || quality < 0) {
+ if (err)
+ *err = RESAMPLER_ERR_INVALID_ARG;
+ return NULL;
+ }
+ st = (SpeexResamplerState *) speex_alloc (sizeof (SpeexResamplerState));
+ st->initialised = 0;
+ st->started = 0;
+ st->in_rate = 0;
+ st->out_rate = 0;
+ st->num_rate = 0;
+ st->den_rate = 0;
+ st->quality = -1;
+ st->sinc_table_length = 0;
+ st->mem_alloc_size = 0;
+ st->filt_len = 0;
+ st->mem = 0;
+ st->resampler_ptr = 0;
+
+ st->cutoff = 1.f;
+ st->nb_channels = nb_channels;
+ st->in_stride = 1;
+ st->out_stride = 1;
+
+#ifdef FIXED_POINT
+ st->buffer_size = 160;
+#else
+ st->buffer_size = 160;
+#endif
+
+ st->use_sse = st->use_sse2 = 0;
+#if defined HAVE_ORC && !defined DISABLE_ORC
+ orc_init ();
+ {
+ OrcTarget *target = orc_target_get_default ();
+ if (target) {
+ unsigned int flags = orc_target_get_default_flags (target);
+ check_insn_set (st, orc_target_get_name (target));
+ for (i = 0; i < 32; ++i) {
+ if (flags & (1 << i)) {
+ check_insn_set (st, orc_target_get_flag_name (target, i));
+ }
+ }
+ }
+ }
+#endif
+
+ /* Per channel data */
+ st->last_sample = (spx_int32_t *) speex_alloc (nb_channels * sizeof (int));
+ st->magic_samples = (spx_uint32_t *) speex_alloc (nb_channels * sizeof (int));
+ st->samp_frac_num = (spx_uint32_t *) speex_alloc (nb_channels * sizeof (int));
+ for (i = 0; i < nb_channels; i++) {
+ st->last_sample[i] = 0;
+ st->magic_samples[i] = 0;
+ st->samp_frac_num[i] = 0;
+ }
+
+ speex_resampler_set_quality (st, quality);
+ speex_resampler_set_rate_frac (st, ratio_num, ratio_den, in_rate, out_rate);
+
+
+ update_filter (st);
+
+ st->initialised = 1;
+ if (err)
+ *err = RESAMPLER_ERR_SUCCESS;
+
+ return st;
+}
+
+EXPORT void
+speex_resampler_destroy (SpeexResamplerState * st)
+{
+ speex_free (st->mem);
+ speex_free (st->sinc_table);
+ speex_free (st->last_sample);
+ speex_free (st->magic_samples);
+ speex_free (st->samp_frac_num);
+ speex_free (st);
+}
+
+static int
+speex_resampler_process_native (SpeexResamplerState * st,
+ spx_uint32_t channel_index, spx_uint32_t * in_len, spx_word16_t * out,
+ spx_uint32_t * out_len)
+{
+ int j = 0;
+ const int N = st->filt_len;
+ int out_sample = 0;
+ spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
+ spx_uint32_t ilen;
+
+ st->started = 1;
+
+ /* Call the right resampler through the function ptr */
+ out_sample = st->resampler_ptr (st, channel_index, mem, in_len, out, out_len);
+
+ if (st->last_sample[channel_index] < (spx_int32_t) * in_len)
+ *in_len = st->last_sample[channel_index];
+ *out_len = out_sample;
+ st->last_sample[channel_index] -= *in_len;
+
+ ilen = *in_len;
+
+ for (j = 0; j < N - 1; ++j)
+ mem[j] = mem[j + ilen];
+
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+static int
+speex_resampler_magic (SpeexResamplerState * st, spx_uint32_t channel_index,
+ spx_word16_t ** out, spx_uint32_t out_len)
+{
+ spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
+ spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
+ const int N = st->filt_len;
+
+ speex_resampler_process_native (st, channel_index, &tmp_in_len, *out,
+ &out_len);
+
+ st->magic_samples[channel_index] -= tmp_in_len;
+
+ /* If we couldn't process all "magic" input samples, save the rest for next time */
+ if (st->magic_samples[channel_index]) {
+ spx_uint32_t i;
+ for (i = 0; i < st->magic_samples[channel_index]; i++)
+ mem[N - 1 + i] = mem[N - 1 + i + tmp_in_len];
+ }
+ *out += out_len * st->out_stride;
+ return out_len;
+}
+
+#ifdef FIXED_POINT
+EXPORT int
+speex_resampler_process_int (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_int16_t * in, spx_uint32_t * in_len,
+ spx_int16_t * out, spx_uint32_t * out_len)
+#else
+#ifdef DOUBLE_PRECISION
+EXPORT int
+speex_resampler_process_float (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const double *in, spx_uint32_t * in_len,
+ double *out, spx_uint32_t * out_len)
+#else
+EXPORT int
+speex_resampler_process_float (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const float *in, spx_uint32_t * in_len,
+ float *out, spx_uint32_t * out_len)
+#endif
+#endif
+{
+ int j;
+ spx_uint32_t ilen = *in_len;
+ spx_uint32_t olen = *out_len;
+ spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
+ const int filt_offs = st->filt_len - 1;
+ const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
+ const int istride = st->in_stride;
+
+ if (st->magic_samples[channel_index])
+ olen -= speex_resampler_magic (st, channel_index, &out, olen);
+ if (!st->magic_samples[channel_index]) {
+ while (ilen && olen) {
+ spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
+ spx_uint32_t ochunk = olen;
+
+ if (in) {
+ for (j = 0; j < ichunk; ++j)
+ x[j + filt_offs] = in[j * istride];
+ } else {
+ for (j = 0; j < ichunk; ++j)
+ x[j + filt_offs] = 0;
+ }
+ speex_resampler_process_native (st, channel_index, &ichunk, out, &ochunk);
+ ilen -= ichunk;
+ olen -= ochunk;
+ out += ochunk * st->out_stride;
+ if (in)
+ in += ichunk * istride;
+ }
+ }
+ *in_len -= ilen;
+ *out_len -= olen;
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+#ifdef FIXED_POINT
+EXPORT int
+speex_resampler_process_float (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const float *in, spx_uint32_t * in_len,
+ float *out, spx_uint32_t * out_len)
+#else
+EXPORT int
+speex_resampler_process_int (SpeexResamplerState * st,
+ spx_uint32_t channel_index, const spx_int16_t * in, spx_uint32_t * in_len,
+ spx_int16_t * out, spx_uint32_t * out_len)
+#endif
+{
+ int j;
+ const int istride_save = st->in_stride;
+ const int ostride_save = st->out_stride;
+ spx_uint32_t ilen = *in_len;
+ spx_uint32_t olen = *out_len;
+ spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
+ const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1);
+#ifdef VAR_ARRAYS
+ const unsigned int ylen =
+ (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC;
+ VARDECL (spx_word16_t * ystack);
+ ALLOC (ystack, ylen, spx_word16_t);
+#else
+ const unsigned int ylen = FIXED_STACK_ALLOC;
+ spx_word16_t ystack[FIXED_STACK_ALLOC];
+#endif
+
+ st->out_stride = 1;
+
+ while (ilen && olen) {
+ spx_word16_t *y = ystack;
+ spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
+ spx_uint32_t ochunk = (olen > ylen) ? ylen : olen;
+ spx_uint32_t omagic = 0;
+
+ if (st->magic_samples[channel_index]) {
+ omagic = speex_resampler_magic (st, channel_index, &y, ochunk);
+ ochunk -= omagic;
+ olen -= omagic;
+ }
+ if (!st->magic_samples[channel_index]) {
+ if (in) {
+ for (j = 0; j < ichunk; ++j)
+#ifdef FIXED_POINT
+ x[j + st->filt_len - 1] = WORD2INT (in[j * istride_save]);
+#else
+ x[j + st->filt_len - 1] = in[j * istride_save];
+#endif
+ } else {
+ for (j = 0; j < ichunk; ++j)
+ x[j + st->filt_len - 1] = 0;
+ }
+
+ speex_resampler_process_native (st, channel_index, &ichunk, y, &ochunk);
+ } else {
+ ichunk = 0;
+ ochunk = 0;
+ }
+
+ for (j = 0; j < ochunk + omagic; ++j)
+#ifdef FIXED_POINT
+ out[j * ostride_save] = ystack[j];
+#else
+ out[j * ostride_save] = WORD2INT (ystack[j]);
+#endif
+
+ ilen -= ichunk;
+ olen -= ochunk;
+ out += (ochunk + omagic) * ostride_save;
+ if (in)
+ in += ichunk * istride_save;
+ }
+ st->out_stride = ostride_save;
+ *in_len -= ilen;
+ *out_len -= olen;
+
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+#ifdef DOUBLE_PRECISION
+EXPORT int
+speex_resampler_process_interleaved_float (SpeexResamplerState * st,
+ const double *in, spx_uint32_t * in_len, double *out,
+ spx_uint32_t * out_len)
+#else
+EXPORT int
+speex_resampler_process_interleaved_float (SpeexResamplerState * st,
+ const float *in, spx_uint32_t * in_len, float *out, spx_uint32_t * out_len)
+#endif
+{
+ spx_uint32_t i;
+ int istride_save, ostride_save;
+ spx_uint32_t bak_len = *out_len;
+ istride_save = st->in_stride;
+ ostride_save = st->out_stride;
+ st->in_stride = st->out_stride = st->nb_channels;
+ for (i = 0; i < st->nb_channels; i++) {
+ *out_len = bak_len;
+ if (in != NULL)
+ speex_resampler_process_float (st, i, in + i, in_len, out + i, out_len);
+ else
+ speex_resampler_process_float (st, i, NULL, in_len, out + i, out_len);
+ }
+ st->in_stride = istride_save;
+ st->out_stride = ostride_save;
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT int
+speex_resampler_process_interleaved_int (SpeexResamplerState * st,
+ const spx_int16_t * in, spx_uint32_t * in_len, spx_int16_t * out,
+ spx_uint32_t * out_len)
+{
+ spx_uint32_t i;
+ int istride_save, ostride_save;
+ spx_uint32_t bak_len = *out_len;
+ istride_save = st->in_stride;
+ ostride_save = st->out_stride;
+ st->in_stride = st->out_stride = st->nb_channels;
+ for (i = 0; i < st->nb_channels; i++) {
+ *out_len = bak_len;
+ if (in != NULL)
+ speex_resampler_process_int (st, i, in + i, in_len, out + i, out_len);
+ else
+ speex_resampler_process_int (st, i, NULL, in_len, out + i, out_len);
+ }
+ st->in_stride = istride_save;
+ st->out_stride = ostride_save;
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT int
+speex_resampler_set_rate (SpeexResamplerState * st, spx_uint32_t in_rate,
+ spx_uint32_t out_rate)
+{
+ return speex_resampler_set_rate_frac (st, in_rate, out_rate, in_rate,
+ out_rate);
+}
+
+EXPORT void
+speex_resampler_get_rate (SpeexResamplerState * st, spx_uint32_t * in_rate,
+ spx_uint32_t * out_rate)
+{
+ *in_rate = st->in_rate;
+ *out_rate = st->out_rate;
+}
+
+EXPORT int
+speex_resampler_set_rate_frac (SpeexResamplerState * st, spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate)
+{
+ spx_uint32_t fact;
+ spx_uint32_t old_den;
+ spx_uint32_t i;
+ if (st->in_rate == in_rate && st->out_rate == out_rate
+ && st->num_rate == ratio_num && st->den_rate == ratio_den)
+ return RESAMPLER_ERR_SUCCESS;
+
+ old_den = st->den_rate;
+ st->in_rate = in_rate;
+ st->out_rate = out_rate;
+ st->num_rate = ratio_num;
+ st->den_rate = ratio_den;
+ /* FIXME: This is terribly inefficient, but who cares (at least for now)? */
+ for (fact = 2; fact <= IMIN (st->num_rate, st->den_rate); fact++) {
+ while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0)) {
+ st->num_rate /= fact;
+ st->den_rate /= fact;
+ }
+ }
+
+ if (old_den > 0) {
+ for (i = 0; i < st->nb_channels; i++) {
+ st->samp_frac_num[i] = st->samp_frac_num[i] * st->den_rate / old_den;
+ /* Safety net */
+ if (st->samp_frac_num[i] >= st->den_rate)
+ st->samp_frac_num[i] = st->den_rate - 1;
+ }
+ }
+
+ if (st->initialised)
+ update_filter (st);
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT void
+speex_resampler_get_ratio (SpeexResamplerState * st, spx_uint32_t * ratio_num,
+ spx_uint32_t * ratio_den)
+{
+ *ratio_num = st->num_rate;
+ *ratio_den = st->den_rate;
+}
+
+EXPORT int
+speex_resampler_set_quality (SpeexResamplerState * st, int quality)
+{
+ if (quality > 10 || quality < 0)
+ return RESAMPLER_ERR_INVALID_ARG;
+ if (st->quality == quality)
+ return RESAMPLER_ERR_SUCCESS;
+ st->quality = quality;
+ if (st->initialised)
+ update_filter (st);
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT void
+speex_resampler_get_quality (SpeexResamplerState * st, int *quality)
+{
+ *quality = st->quality;
+}
+
+EXPORT void
+speex_resampler_set_input_stride (SpeexResamplerState * st, spx_uint32_t stride)
+{
+ st->in_stride = stride;
+}
+
+EXPORT void
+speex_resampler_get_input_stride (SpeexResamplerState * st,
+ spx_uint32_t * stride)
+{
+ *stride = st->in_stride;
+}
+
+EXPORT void
+speex_resampler_set_output_stride (SpeexResamplerState * st,
+ spx_uint32_t stride)
+{
+ st->out_stride = stride;
+}
+
+EXPORT void
+speex_resampler_get_output_stride (SpeexResamplerState * st,
+ spx_uint32_t * stride)
+{
+ *stride = st->out_stride;
+}
+
+EXPORT int
+speex_resampler_get_input_latency (SpeexResamplerState * st)
+{
+ return st->filt_len / 2;
+}
+
+EXPORT int
+speex_resampler_get_output_latency (SpeexResamplerState * st)
+{
+ return ((st->filt_len / 2) * st->den_rate +
+ (st->num_rate >> 1)) / st->num_rate;
+}
+
+EXPORT int
+speex_resampler_get_filt_len (SpeexResamplerState * st)
+{
+ return st->filt_len;
+}
+
+EXPORT int
+speex_resampler_skip_zeros (SpeexResamplerState * st)
+{
+ spx_uint32_t i;
+ for (i = 0; i < st->nb_channels; i++)
+ st->last_sample[i] = st->filt_len / 2;
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT int
+speex_resampler_reset_mem (SpeexResamplerState * st)
+{
+ spx_uint32_t i;
+ for (i = 0; i < st->nb_channels * (st->filt_len - 1); i++)
+ st->mem[i] = 0;
+ return RESAMPLER_ERR_SUCCESS;
+}
+
+EXPORT const char *
+speex_resampler_strerror (int err)
+{
+ switch (err) {
+ case RESAMPLER_ERR_SUCCESS:
+ return "Success.";
+ case RESAMPLER_ERR_ALLOC_FAILED:
+ return "Memory allocation failed.";
+ case RESAMPLER_ERR_BAD_STATE:
+ return "Bad resampler state.";
+ case RESAMPLER_ERR_INVALID_ARG:
+ return "Invalid argument.";
+ case RESAMPLER_ERR_PTR_OVERLAP:
+ return "Input and output buffers overlap.";
+ default:
+ return "Unknown error. Bad error code or strange version mismatch.";
+ }
+}
diff --git a/gst/audioresample/resample_sse.h b/gst/audioresample/resample_sse.h
new file mode 100644
index 0000000..36522a3
--- /dev/null
+++ b/gst/audioresample/resample_sse.h
@@ -0,0 +1,180 @@
+/* Copyright (C) 2007-2008 Jean-Marc Valin
+ * Copyright (C) 2008 Thorvald Natvig
+ */
+/**
+ @file resample_sse.h
+ @brief Resampler functions (SSE version)
+*/
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``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 FOUNDATION OR
+ CONTRIBUTORS 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_XMMINTRIN_H
+#include <xmmintrin.h>
+#endif
+
+#define OVERRIDE_INNER_PRODUCT_SINGLE
+static inline float inner_product_single(const float *a, const float *b, unsigned int len)
+{
+ int i;
+ float ret;
+ __m128 sum = _mm_setzero_ps();
+ for (i=0;i<len;i+=8)
+ {
+ sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a+i), _mm_loadu_ps(b+i)));
+ sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a+i+4), _mm_loadu_ps(b+i+4)));
+ }
+ sum = _mm_add_ps(sum, _mm_movehl_ps(sum, sum));
+ sum = _mm_add_ss(sum, _mm_shuffle_ps(sum, sum, 0x55));
+ _mm_store_ss(&ret, sum);
+ return ret;
+}
+
+#define OVERRIDE_INTERPOLATE_PRODUCT_SINGLE
+static inline float interpolate_product_single(const float *a, const float *b, unsigned int len, const spx_uint32_t oversample, float *frac) {
+ int i;
+ float ret;
+ __m128 sum = _mm_setzero_ps();
+ __m128 f = _mm_loadu_ps(frac);
+ for(i=0;i<len;i+=2)
+ {
+ sum = _mm_add_ps(sum, _mm_mul_ps(_mm_load1_ps(a+i), _mm_loadu_ps(b+i*oversample)));
+ sum = _mm_add_ps(sum, _mm_mul_ps(_mm_load1_ps(a+i+1), _mm_loadu_ps(b+(i+1)*oversample)));
+ }
+ sum = _mm_mul_ps(f, sum);
+ sum = _mm_add_ps(sum, _mm_movehl_ps(sum, sum));
+ sum = _mm_add_ss(sum, _mm_shuffle_ps(sum, sum, 0x55));
+ _mm_store_ss(&ret, sum);
+ return ret;
+}
+
+#ifdef _USE_SSE2
+#ifdef HAVE_EMMINTRIN_H
+#include <emmintrin.h>
+#endif
+#define OVERRIDE_INNER_PRODUCT_DOUBLE
+
+#ifdef DOUBLE_PRECISION
+static inline double inner_product_double(const double *a, const double *b, unsigned int len)
+{
+ int i;
+ double ret;
+ __m128d sum = _mm_setzero_pd();
+ for (i=0;i<len;i+=4)
+ {
+ sum = _mm_add_pd(sum, _mm_mul_pd(_mm_loadu_pd(a+i), _mm_loadu_pd(b+i)));
+ sum = _mm_add_pd(sum, _mm_mul_pd(_mm_loadu_pd(a+i+2), _mm_loadu_pd(b+i+2)));
+ }
+ sum = _mm_add_sd(sum, _mm_unpackhi_pd(sum, sum));
+ _mm_store_sd(&ret, sum);
+ return ret;
+}
+#else
+static inline double inner_product_double(const float *a, const float *b, unsigned int len)
+{
+ int i;
+ double ret;
+ __m128d sum = _mm_setzero_pd();
+ __m128 t;
+ for (i=0;i<len;i+=8)
+ {
+ t = _mm_mul_ps(_mm_loadu_ps(a+i), _mm_loadu_ps(b+i));
+ sum = _mm_add_pd(sum, _mm_cvtps_pd(t));
+ sum = _mm_add_pd(sum, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
+
+ t = _mm_mul_ps(_mm_loadu_ps(a+i+4), _mm_loadu_ps(b+i+4));
+ sum = _mm_add_pd(sum, _mm_cvtps_pd(t));
+ sum = _mm_add_pd(sum, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
+ }
+ sum = _mm_add_sd(sum, _mm_unpackhi_pd(sum, sum));
+ _mm_store_sd(&ret, sum);
+ return ret;
+}
+#endif
+
+
+#define OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE
+
+#ifdef DOUBLE_PRECISION
+static inline double interpolate_product_double(const double *a, const double *b, unsigned int len, const spx_uint32_t oversample, double *frac) {
+ int i;
+ double ret;
+ __m128d sum;
+ __m128d sum1 = _mm_setzero_pd();
+ __m128d sum2 = _mm_setzero_pd();
+ __m128d f1 = _mm_loadu_pd(frac);
+ __m128d f2 = _mm_loadu_pd(frac+2);
+ __m128d t;
+ for(i=0;i<len;i+=2)
+ {
+ t = _mm_mul_pd(_mm_load1_pd(a+i), _mm_loadu_pd(b+i*oversample));
+ sum1 = _mm_add_pd(sum1, t);
+ sum2 = _mm_add_pd(sum2, _mm_unpackhi_pd(t, t));
+
+ t = _mm_mul_pd(_mm_load1_pd(a+i+1), _mm_loadu_pd(b+(i+1)*oversample));
+ sum1 = _mm_add_pd(sum1, t);
+ sum2 = _mm_add_pd(sum2, _mm_unpackhi_pd(t, t));
+ }
+ sum1 = _mm_mul_pd(f1, sum1);
+ sum2 = _mm_mul_pd(f2, sum2);
+ sum = _mm_add_pd(sum1, sum2);
+ sum = _mm_add_sd(sum, _mm_unpackhi_pd(sum, sum));
+ _mm_store_sd(&ret, sum);
+ return ret;
+}
+#else
+static inline double interpolate_product_double(const float *a, const float *b, unsigned int len, const spx_uint32_t oversample, float *frac) {
+ int i;
+ double ret;
+ __m128d sum;
+ __m128d sum1 = _mm_setzero_pd();
+ __m128d sum2 = _mm_setzero_pd();
+ __m128 f = _mm_loadu_ps(frac);
+ __m128d f1 = _mm_cvtps_pd(f);
+ __m128d f2 = _mm_cvtps_pd(_mm_movehl_ps(f,f));
+ __m128 t;
+ for(i=0;i<len;i+=2)
+ {
+ t = _mm_mul_ps(_mm_load1_ps(a+i), _mm_loadu_ps(b+i*oversample));
+ sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
+ sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
+
+ t = _mm_mul_ps(_mm_load1_ps(a+i+1), _mm_loadu_ps(b+(i+1)*oversample));
+ sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
+ sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
+ }
+ sum1 = _mm_mul_pd(f1, sum1);
+ sum2 = _mm_mul_pd(f2, sum2);
+ sum = _mm_add_pd(sum1, sum2);
+ sum = _mm_add_sd(sum, _mm_unpackhi_pd(sum, sum));
+ _mm_store_sd(&ret, sum);
+ return ret;
+}
+#endif
+
+#endif
diff --git a/gst/audioresample/speex_resampler.h b/gst/audioresample/speex_resampler.h
new file mode 100644
index 0000000..894b380
--- /dev/null
+++ b/gst/audioresample/speex_resampler.h
@@ -0,0 +1,367 @@
+/* Copyright (C) 2007 Jean-Marc Valin
+
+ File: speex_resampler.h
+ Resampling code
+
+ The design goals of this code are:
+ - Very fast algorithm
+ - Low memory requirement
+ - Good *perceptual* quality (and not best SNR)
+
+ Redistribution and use in source and binary forms, with or without
+ modification, 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.
+*/
+
+
+#ifndef SPEEX_RESAMPLER_H
+#define SPEEX_RESAMPLER_H
+
+#ifdef OUTSIDE_SPEEX
+
+/********* WARNING: MENTAL SANITY ENDS HERE *************/
+
+/* If the resampler is defined outside of Speex, we change the symbol names so that
+ there won't be any clash if linking with Speex later on. */
+
+/* #define RANDOM_PREFIX your software name here */
+#ifndef RANDOM_PREFIX
+#error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes"
+#endif
+
+#define CAT_PREFIX2(a,b) a ## b
+#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b)
+
+#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init)
+#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac)
+#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy)
+#define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float)
+#define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int)
+#define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float)
+#define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int)
+#define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate)
+#define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate)
+#define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac)
+#define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio)
+#define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality)
+#define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality)
+#define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride)
+#define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride)
+#define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride)
+#define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride)
+#define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency)
+#define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency)
+#define speex_resampler_get_filt_len CAT_PREFIX(RANDOM_PREFIX,_resampler_get_filt_len)
+#define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros)
+#define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
+#define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
+
+#define spx_int16_t gint16
+#define spx_int32_t gint32
+#define spx_uint16_t guint16
+#define spx_uint32_t guint32
+
+#else /* OUTSIDE_SPEEX */
+
+#ifdef _BUILD_SPEEX
+# include "speex_types.h"
+#else
+# include <speex/speex_types.h>
+#endif
+
+#endif /* OUTSIDE_SPEEX */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SPEEX_RESAMPLER_QUALITY_MAX 10
+#define SPEEX_RESAMPLER_QUALITY_MIN 0
+#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4
+#define SPEEX_RESAMPLER_QUALITY_VOIP 3
+#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5
+
+enum {
+ RESAMPLER_ERR_SUCCESS = 0,
+ RESAMPLER_ERR_ALLOC_FAILED = 1,
+ RESAMPLER_ERR_BAD_STATE = 2,
+ RESAMPLER_ERR_INVALID_ARG = 3,
+ RESAMPLER_ERR_PTR_OVERLAP = 4,
+
+ RESAMPLER_ERR_MAX_ERROR
+};
+
+struct SpeexResamplerState_;
+typedef struct SpeexResamplerState_ SpeexResamplerState;
+
+/** Create a new resampler with integer input and output rates.
+ * @param nb_channels Number of channels to be processed
+ * @param in_rate Input sampling rate (integer number of Hz).
+ * @param out_rate Output sampling rate (integer number of Hz).
+ * @param quality Resampling quality between 0 and 10, where 0 has poor quality
+ * and 10 has very high quality.
+ * @return Newly created resampler state
+ * @retval NULL Error: not enough memory
+ */
+SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate,
+ int quality,
+ int *err);
+
+/** Create a new resampler with fractional input/output rates. The sampling
+ * rate ratio is an arbitrary rational number with both the numerator and
+ * denominator being 32-bit integers.
+ * @param nb_channels Number of channels to be processed
+ * @param ratio_num Numerator of the sampling rate ratio
+ * @param ratio_den Denominator of the sampling rate ratio
+ * @param in_rate Input sampling rate rounded to the nearest integer (in Hz).
+ * @param out_rate Output sampling rate rounded to the nearest integer (in Hz).
+ * @param quality Resampling quality between 0 and 10, where 0 has poor quality
+ * and 10 has very high quality.
+ * @return Newly created resampler state
+ * @retval NULL Error: not enough memory
+ */
+SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels,
+ spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate,
+ int quality,
+ int *err);
+
+/** Destroy a resampler state.
+ * @param st Resampler state
+ */
+void speex_resampler_destroy(SpeexResamplerState *st);
+
+/** Resample a float array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
+ * @param channel_index Index of the channel to process for the multi-channel
+ * base (0 otherwise)
+ * @param in Input buffer
+ * @param in_len Number of input samples in the input buffer. Returns the
+ * number of samples processed
+ * @param out Output buffer
+ * @param out_len Size of the output buffer. Returns the number of samples written
+ */
+#ifdef DOUBLE_PRECISION
+int speex_resampler_process_float(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const double *in,
+ spx_uint32_t *in_len,
+ double *out,
+ spx_uint32_t *out_len);
+#else
+int speex_resampler_process_float(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
+ spx_uint32_t *out_len);
+#endif
+
+/** Resample an int array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
+ * @param channel_index Index of the channel to process for the multi-channel
+ * base (0 otherwise)
+ * @param in Input buffer
+ * @param in_len Number of input samples in the input buffer. Returns the number
+ * of samples processed
+ * @param out Output buffer
+ * @param out_len Size of the output buffer. Returns the number of samples written
+ */
+int speex_resampler_process_int(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const spx_int16_t *in,
+ spx_uint32_t *in_len,
+ spx_int16_t *out,
+ spx_uint32_t *out_len);
+
+/** Resample an interleaved float array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
+ * @param in Input buffer
+ * @param in_len Number of input samples in the input buffer. Returns the number
+ * of samples processed. This is all per-channel.
+ * @param out Output buffer
+ * @param out_len Size of the output buffer. Returns the number of samples written.
+ * This is all per-channel.
+ */
+#ifdef DOUBLE_PRECISION
+int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
+ const double *in,
+ spx_uint32_t *in_len,
+ double *out,
+ spx_uint32_t *out_len);
+#else
+int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
+ spx_uint32_t *out_len);
+#endif
+
+/** Resample an interleaved int array. The input and output buffers must *not* overlap.
+ * @param st Resampler state
+ * @param in Input buffer
+ * @param in_len Number of input samples in the input buffer. Returns the number
+ * of samples processed. This is all per-channel.
+ * @param out Output buffer
+ * @param out_len Size of the output buffer. Returns the number of samples written.
+ * This is all per-channel.
+ */
+int speex_resampler_process_interleaved_int(SpeexResamplerState *st,
+ const spx_int16_t *in,
+ spx_uint32_t *in_len,
+ spx_int16_t *out,
+ spx_uint32_t *out_len);
+
+/** Set (change) the input/output sampling rates (integer value).
+ * @param st Resampler state
+ * @param in_rate Input sampling rate (integer number of Hz).
+ * @param out_rate Output sampling rate (integer number of Hz).
+ */
+int speex_resampler_set_rate(SpeexResamplerState *st,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate);
+
+/** Get the current input/output sampling rates (integer value).
+ * @param st Resampler state
+ * @param in_rate Input sampling rate (integer number of Hz) copied.
+ * @param out_rate Output sampling rate (integer number of Hz) copied.
+ */
+void speex_resampler_get_rate(SpeexResamplerState *st,
+ spx_uint32_t *in_rate,
+ spx_uint32_t *out_rate);
+
+/** Set (change) the input/output sampling rates and resampling ratio
+ * (fractional values in Hz supported).
+ * @param st Resampler state
+ * @param ratio_num Numerator of the sampling rate ratio
+ * @param ratio_den Denominator of the sampling rate ratio
+ * @param in_rate Input sampling rate rounded to the nearest integer (in Hz).
+ * @param out_rate Output sampling rate rounded to the nearest integer (in Hz).
+ */
+int speex_resampler_set_rate_frac(SpeexResamplerState *st,
+ spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate);
+
+/** Get the current resampling ratio. This will be reduced to the least
+ * common denominator.
+ * @param st Resampler state
+ * @param ratio_num Numerator of the sampling rate ratio copied
+ * @param ratio_den Denominator of the sampling rate ratio copied
+ */
+void speex_resampler_get_ratio(SpeexResamplerState *st,
+ spx_uint32_t *ratio_num,
+ spx_uint32_t *ratio_den);
+
+/** Set (change) the conversion quality.
+ * @param st Resampler state
+ * @param quality Resampling quality between 0 and 10, where 0 has poor
+ * quality and 10 has very high quality.
+ */
+int speex_resampler_set_quality(SpeexResamplerState *st,
+ int quality);
+
+/** Get the conversion quality.
+ * @param st Resampler state
+ * @param quality Resampling quality between 0 and 10, where 0 has poor
+ * quality and 10 has very high quality.
+ */
+void speex_resampler_get_quality(SpeexResamplerState *st,
+ int *quality);
+
+/** Set (change) the input stride.
+ * @param st Resampler state
+ * @param stride Input stride
+ */
+void speex_resampler_set_input_stride(SpeexResamplerState *st,
+ spx_uint32_t stride);
+
+/** Get the input stride.
+ * @param st Resampler state
+ * @param stride Input stride copied
+ */
+void speex_resampler_get_input_stride(SpeexResamplerState *st,
+ spx_uint32_t *stride);
+
+/** Set (change) the output stride.
+ * @param st Resampler state
+ * @param stride Output stride
+ */
+void speex_resampler_set_output_stride(SpeexResamplerState *st,
+ spx_uint32_t stride);
+
+/** Get the output stride.
+ * @param st Resampler state copied
+ * @param stride Output stride
+ */
+void speex_resampler_get_output_stride(SpeexResamplerState *st,
+ spx_uint32_t *stride);
+
+/** Get the latency introduced by the resampler measured in input samples.
+ * @param st Resampler state
+ */
+int speex_resampler_get_input_latency(SpeexResamplerState *st);
+
+/** Get the latency introduced by the resampler measured in output samples.
+ * @param st Resampler state
+ */
+int speex_resampler_get_output_latency(SpeexResamplerState *st);
+
+/** Get the length of the filter in input samples.
+ * @param st Resampler state
+ */
+int speex_resampler_get_filt_len(SpeexResamplerState *st);
+
+/** Make sure that the first samples to go out of the resamplers don't have
+ * leading zeros. This is only useful before starting to use a newly created
+ * resampler. It is recommended to use that when resampling an audio file, as
+ * it will generate a file with the same length. For real-time processing,
+ * it is probably easier not to use this call (so that the output duration
+ * is the same for the first frame).
+ * @param st Resampler state
+ */
+int speex_resampler_skip_zeros(SpeexResamplerState *st);
+
+/** Reset a resampler so a new (unrelated) stream can be processed.
+ * @param st Resampler state
+ */
+int speex_resampler_reset_mem(SpeexResamplerState *st);
+
+/** Returns the English meaning for an error code
+ * @param err Error code
+ * @return English string
+ */
+const char *speex_resampler_strerror(int err);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gst/audioresample/speex_resampler_double.c b/gst/audioresample/speex_resampler_double.c
new file mode 100644
index 0000000..ef2503d
--- /dev/null
+++ b/gst/audioresample/speex_resampler_double.c
@@ -0,0 +1,26 @@
+/* GStreamer
+ * Copyright (C) 2007-2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define _USE_SSE2
+#define FLOATING_POINT
+#define DOUBLE_PRECISION
+#define OUTSIDE_SPEEX
+#define RANDOM_PREFIX resample_double
+
+#include "resample.c"
diff --git a/gst/audioresample/speex_resampler_float.c b/gst/audioresample/speex_resampler_float.c
new file mode 100644
index 0000000..ef3df15
--- /dev/null
+++ b/gst/audioresample/speex_resampler_float.c
@@ -0,0 +1,26 @@
+/* GStreamer
+ * Copyright (C) 2007-2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define _USE_SSE
+#define _USE_SSE2
+#define FLOATING_POINT
+#define OUTSIDE_SPEEX
+#define RANDOM_PREFIX resample_float
+
+#include "resample.c"
diff --git a/gst/audioresample/speex_resampler_int.c b/gst/audioresample/speex_resampler_int.c
new file mode 100644
index 0000000..6b85860
--- /dev/null
+++ b/gst/audioresample/speex_resampler_int.c
@@ -0,0 +1,24 @@
+/* GStreamer
+ * Copyright (C) 2007-2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define FIXED_POINT 1
+#define OUTSIDE_SPEEX 1
+#define RANDOM_PREFIX resample_int
+
+#include "resample.c"
diff --git a/gst/audioresample/speex_resampler_wrapper.h b/gst/audioresample/speex_resampler_wrapper.h
new file mode 100644
index 0000000..08a82bc
--- /dev/null
+++ b/gst/audioresample/speex_resampler_wrapper.h
@@ -0,0 +1,168 @@
+/* GStreamer
+ * Copyright (C) 2007-2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __SPEEX_RESAMPLER_WRAPPER_H__
+#define __SPEEX_RESAMPLER_WRAPPER_H__
+
+#define SPEEX_RESAMPLER_QUALITY_MAX 10
+#define SPEEX_RESAMPLER_QUALITY_MIN 0
+#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4
+#define SPEEX_RESAMPLER_QUALITY_VOIP 3
+#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5
+
+enum
+{
+ RESAMPLER_ERR_SUCCESS = 0,
+ RESAMPLER_ERR_ALLOC_FAILED = 1,
+ RESAMPLER_ERR_BAD_STATE = 2,
+ RESAMPLER_ERR_INVALID_ARG = 3,
+ RESAMPLER_ERR_PTR_OVERLAP = 4,
+
+ RESAMPLER_ERR_MAX_ERROR
+};
+
+typedef struct SpeexResamplerState_ SpeexResamplerState;
+
+typedef struct {
+ SpeexResamplerState *(*init) (guint32 nb_channels,
+ guint32 in_rate, guint32 out_rate, gint quality, gint * err);
+ void (*destroy) (SpeexResamplerState * st);
+ int (*process) (SpeexResamplerState *
+ st, const guint8 * in, guint32 * in_len, guint8 * out, guint32 * out_len);
+ int (*set_rate) (SpeexResamplerState * st,
+ guint32 in_rate, guint32 out_rate);
+ void (*get_rate) (SpeexResamplerState * st,
+ guint32 * in_rate, guint32 * out_rate);
+ void (*get_ratio) (SpeexResamplerState * st,
+ guint32 * ratio_num, guint32 * ratio_den);
+ int (*get_input_latency) (SpeexResamplerState * st);
+ int (*get_filt_len) (SpeexResamplerState * st);
+ int (*set_quality) (SpeexResamplerState * st, gint quality);
+ int (*reset_mem) (SpeexResamplerState * st);
+ int (*skip_zeros) (SpeexResamplerState * st);
+ const char * (*strerror) (gint err);
+ unsigned int width;
+} SpeexResampleFuncs;
+
+SpeexResamplerState *resample_float_resampler_init (guint32 nb_channels,
+ guint32 in_rate, guint32 out_rate, gint quality, gint * err);
+void resample_float_resampler_destroy (SpeexResamplerState * st);
+int resample_float_resampler_process_interleaved_float (SpeexResamplerState *
+ st, const guint8 * in, guint32 * in_len, guint8 * out, guint32 * out_len);
+int resample_float_resampler_set_rate (SpeexResamplerState * st,
+ guint32 in_rate, guint32 out_rate);
+void resample_float_resampler_get_rate (SpeexResamplerState * st,
+ guint32 * in_rate, guint32 * out_rate);
+void resample_float_resampler_get_ratio (SpeexResamplerState * st,
+ guint32 * ratio_num, guint32 * ratio_den);
+int resample_float_resampler_get_input_latency (SpeexResamplerState * st);
+int resample_float_resampler_get_filt_len (SpeexResamplerState * st);
+int resample_float_resampler_set_quality (SpeexResamplerState * st, gint quality);
+int resample_float_resampler_reset_mem (SpeexResamplerState * st);
+int resample_float_resampler_skip_zeros (SpeexResamplerState * st);
+const char * resample_float_resampler_strerror (gint err);
+
+static const SpeexResampleFuncs float_funcs =
+{
+ resample_float_resampler_init,
+ resample_float_resampler_destroy,
+ resample_float_resampler_process_interleaved_float,
+ resample_float_resampler_set_rate,
+ resample_float_resampler_get_rate,
+ resample_float_resampler_get_ratio,
+ resample_float_resampler_get_input_latency,
+ resample_float_resampler_get_filt_len,
+ resample_float_resampler_set_quality,
+ resample_float_resampler_reset_mem,
+ resample_float_resampler_skip_zeros,
+ resample_float_resampler_strerror,
+ 32
+};
+
+SpeexResamplerState *resample_double_resampler_init (guint32 nb_channels,
+ guint32 in_rate, guint32 out_rate, gint quality, gint * err);
+void resample_double_resampler_destroy (SpeexResamplerState * st);
+int resample_double_resampler_process_interleaved_float (SpeexResamplerState *
+ st, const guint8 * in, guint32 * in_len, guint8 * out, guint32 * out_len);
+int resample_double_resampler_set_rate (SpeexResamplerState * st,
+ guint32 in_rate, guint32 out_rate);
+void resample_double_resampler_get_rate (SpeexResamplerState * st,
+ guint32 * in_rate, guint32 * out_rate);
+void resample_double_resampler_get_ratio (SpeexResamplerState * st,
+ guint32 * ratio_num, guint32 * ratio_den);
+int resample_double_resampler_get_input_latency (SpeexResamplerState * st);
+int resample_double_resampler_get_filt_len (SpeexResamplerState * st);
+int resample_double_resampler_set_quality (SpeexResamplerState * st, gint quality);
+int resample_double_resampler_reset_mem (SpeexResamplerState * st);
+int resample_double_resampler_skip_zeros (SpeexResamplerState * st);
+const char * resample_double_resampler_strerror (gint err);
+
+static const SpeexResampleFuncs double_funcs =
+{
+ resample_double_resampler_init,
+ resample_double_resampler_destroy,
+ resample_double_resampler_process_interleaved_float,
+ resample_double_resampler_set_rate,
+ resample_double_resampler_get_rate,
+ resample_double_resampler_get_ratio,
+ resample_double_resampler_get_input_latency,
+ resample_double_resampler_get_filt_len,
+ resample_double_resampler_set_quality,
+ resample_double_resampler_reset_mem,
+ resample_double_resampler_skip_zeros,
+ resample_double_resampler_strerror,
+ 64
+};
+
+SpeexResamplerState *resample_int_resampler_init (guint32 nb_channels,
+ guint32 in_rate, guint32 out_rate, gint quality, gint * err);
+void resample_int_resampler_destroy (SpeexResamplerState * st);
+int resample_int_resampler_process_interleaved_int (SpeexResamplerState *
+ st, const guint8 * in, guint32 * in_len, guint8 * out, guint32 * out_len);
+int resample_int_resampler_set_rate (SpeexResamplerState * st,
+ guint32 in_rate, guint32 out_rate);
+void resample_int_resampler_get_rate (SpeexResamplerState * st,
+ guint32 * in_rate, guint32 * out_rate);
+void resample_int_resampler_get_ratio (SpeexResamplerState * st,
+ guint32 * ratio_num, guint32 * ratio_den);
+int resample_int_resampler_get_input_latency (SpeexResamplerState * st);
+int resample_int_resampler_get_filt_len (SpeexResamplerState * st);
+int resample_int_resampler_set_quality (SpeexResamplerState * st, gint quality);
+int resample_int_resampler_reset_mem (SpeexResamplerState * st);
+int resample_int_resampler_skip_zeros (SpeexResamplerState * st);
+const char * resample_int_resampler_strerror (gint err);
+
+static const SpeexResampleFuncs int_funcs =
+{
+ resample_int_resampler_init,
+ resample_int_resampler_destroy,
+ resample_int_resampler_process_interleaved_int,
+ resample_int_resampler_set_rate,
+ resample_int_resampler_get_rate,
+ resample_int_resampler_get_ratio,
+ resample_int_resampler_get_input_latency,
+ resample_int_resampler_get_filt_len,
+ resample_int_resampler_set_quality,
+ resample_int_resampler_reset_mem,
+ resample_int_resampler_skip_zeros,
+ resample_int_resampler_strerror,
+ 16
+};
+
+#endif /* __SPEEX_RESAMPLER_WRAPPER_H__ */
diff --git a/gst/audiotestsrc/Makefile.am b/gst/audiotestsrc/Makefile.am
new file mode 100644
index 0000000..c00f9ff
--- /dev/null
+++ b/gst/audiotestsrc/Makefile.am
@@ -0,0 +1,25 @@
+plugin_LTLIBRARIES = libgstaudiotestsrc.la
+
+libgstaudiotestsrc_la_SOURCES = gstaudiotestsrc.c
+libgstaudiotestsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS)
+libgstaudiotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudiotestsrc_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(LIBM)
+libgstaudiotestsrc_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstaudiotestsrc.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstaudiotestsrc -:SHARED libgstaudiotestsrc \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudiotestsrc_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiotestsrc_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudiotestsrc_la_LDFLAGS) \
+ $(libgstaudiotestsrc_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/audiotestsrc/Makefile.in b/gst/audiotestsrc/Makefile.in
new file mode 100644
index 0000000..ac8387f
--- /dev/null
+++ b/gst/audiotestsrc/Makefile.in
@@ -0,0 +1,774 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/audiotestsrc
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstaudiotestsrc_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstaudiotestsrc_la_OBJECTS = \
+ libgstaudiotestsrc_la-gstaudiotestsrc.lo
+libgstaudiotestsrc_la_OBJECTS = $(am_libgstaudiotestsrc_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstaudiotestsrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstaudiotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstaudiotestsrc_la_CFLAGS) $(CFLAGS) \
+ $(libgstaudiotestsrc_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstaudiotestsrc_la_SOURCES)
+DIST_SOURCES = $(libgstaudiotestsrc_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstaudiotestsrc.la
+libgstaudiotestsrc_la_SOURCES = gstaudiotestsrc.c
+libgstaudiotestsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS)
+libgstaudiotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstaudiotestsrc_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(LIBM)
+
+libgstaudiotestsrc_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstaudiotestsrc.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/audiotestsrc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/audiotestsrc/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
+libgstaudiotestsrc.la: $(libgstaudiotestsrc_la_OBJECTS) $(libgstaudiotestsrc_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstaudiotestsrc_la_LINK) -rpath $(plugindir) $(libgstaudiotestsrc_la_OBJECTS) $(libgstaudiotestsrc_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiotestsrc_la-gstaudiotestsrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstaudiotestsrc_la-gstaudiotestsrc.lo: gstaudiotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiotestsrc_la_CFLAGS) $(CFLAGS) -MT libgstaudiotestsrc_la-gstaudiotestsrc.lo -MD -MP -MF $(DEPDIR)/libgstaudiotestsrc_la-gstaudiotestsrc.Tpo -c -o libgstaudiotestsrc_la-gstaudiotestsrc.lo `test -f 'gstaudiotestsrc.c' || echo '$(srcdir)/'`gstaudiotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiotestsrc_la-gstaudiotestsrc.Tpo $(DEPDIR)/libgstaudiotestsrc_la-gstaudiotestsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaudiotestsrc.c' object='libgstaudiotestsrc_la-gstaudiotestsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiotestsrc_la_CFLAGS) $(CFLAGS) -c -o libgstaudiotestsrc_la-gstaudiotestsrc.lo `test -f 'gstaudiotestsrc.c' || echo '$(srcdir)/'`gstaudiotestsrc.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstaudiotestsrc -:SHARED libgstaudiotestsrc \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstaudiotestsrc_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiotestsrc_la_CFLAGS) \
+ -:LDFLAGS $(libgstaudiotestsrc_la_LDFLAGS) \
+ $(libgstaudiotestsrc_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/audiotestsrc/gstaudiotestsrc.c b/gst/audiotestsrc/gstaudiotestsrc.c
new file mode 100644
index 0000000..01b7d8a
--- /dev/null
+++ b/gst/audiotestsrc/gstaudiotestsrc.c
@@ -0,0 +1,1297 @@
+/* GStreamer
+ * Copyright (C) 2005 Stefan Kost <ensonic@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:element-audiotestsrc
+ *
+ * AudioTestSrc can be used to generate basic audio signals. It support several
+ * different waveforms and allows to set the base frequency and volume.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch audiotestsrc ! audioconvert ! alsasink
+ * ]| This pipeline produces a sine with default frequency, 440 Hz, and the
+ * default volume, 0.8 (relative to a maximum 1.0).
+ * |[
+ * gst-launch audiotestsrc wave=2 freq=200 ! audioconvert ! tee name=t ! queue ! alsasink t. ! queue ! libvisual_lv_scope ! videoconvert ! xvimagesink
+ * ]| In this example a saw wave is generated. The wave is shown using a
+ * scope visualizer from libvisual, allowing you to visually verify that
+ * the saw wave is correct.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gst/controller/gstcontroller.h>
+
+#include "gstaudiotestsrc.h"
+
+
+#define M_PI_M2 ( G_PI + G_PI )
+
+GST_DEBUG_CATEGORY_STATIC (audio_test_src_debug);
+#define GST_CAT_DEFAULT audio_test_src_debug
+
+#define DEFAULT_SAMPLES_PER_BUFFER 1024
+#define DEFAULT_WAVE GST_AUDIO_TEST_SRC_WAVE_SINE
+#define DEFAULT_FREQ 440.0
+#define DEFAULT_VOLUME 0.8
+#define DEFAULT_IS_LIVE FALSE
+#define DEFAULT_TIMESTAMP_OFFSET G_GINT64_CONSTANT (0)
+#define DEFAULT_CAN_ACTIVATE_PUSH TRUE
+#define DEFAULT_CAN_ACTIVATE_PULL FALSE
+
+enum
+{
+ PROP_0,
+ PROP_SAMPLES_PER_BUFFER,
+ PROP_WAVE,
+ PROP_FREQ,
+ PROP_VOLUME,
+ PROP_IS_LIVE,
+ PROP_TIMESTAMP_OFFSET,
+ PROP_CAN_ACTIVATE_PUSH,
+ PROP_CAN_ACTIVATE_PULL,
+ PROP_LAST
+};
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define FORMAT_STR "{ S16LE, S32LE, F32LE, F64LE }"
+#define DEFAULT_FORMAT_STR "S16LE"
+#else
+#define FORMAT_STR "{ S16BE, S32BE, F32BE, F64BE }"
+#define DEFAULT_FORMAT_STR "S16BE"
+#endif
+
+static GstStaticPadTemplate gst_audio_test_src_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw, "
+ "format = (string) " FORMAT_STR ", "
+ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")
+ );
+
+#define gst_audio_test_src_parent_class parent_class
+G_DEFINE_TYPE (GstAudioTestSrc, gst_audio_test_src, GST_TYPE_BASE_SRC);
+
+#define GST_TYPE_AUDIO_TEST_SRC_WAVE (gst_audiostestsrc_wave_get_type())
+static GType
+gst_audiostestsrc_wave_get_type (void)
+{
+ static GType audiostestsrc_wave_type = 0;
+ static const GEnumValue audiostestsrc_waves[] = {
+ {GST_AUDIO_TEST_SRC_WAVE_SINE, "Sine", "sine"},
+ {GST_AUDIO_TEST_SRC_WAVE_SQUARE, "Square", "square"},
+ {GST_AUDIO_TEST_SRC_WAVE_SAW, "Saw", "saw"},
+ {GST_AUDIO_TEST_SRC_WAVE_TRIANGLE, "Triangle", "triangle"},
+ {GST_AUDIO_TEST_SRC_WAVE_SILENCE, "Silence", "silence"},
+ {GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE, "White uniform noise", "white-noise"},
+ {GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE, "Pink noise", "pink-noise"},
+ {GST_AUDIO_TEST_SRC_WAVE_SINE_TAB, "Sine table", "sine-table"},
+ {GST_AUDIO_TEST_SRC_WAVE_TICKS, "Periodic Ticks", "ticks"},
+ {GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE, "White Gaussian noise",
+ "gaussian-noise"},
+ {GST_AUDIO_TEST_SRC_WAVE_RED_NOISE, "Red (brownian) noise", "red-noise"},
+ {GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE, "Blue noise", "blue-noise"},
+ {GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE, "Violet noise", "violet-noise"},
+ {0, NULL, NULL},
+ };
+
+ if (G_UNLIKELY (audiostestsrc_wave_type == 0)) {
+ audiostestsrc_wave_type = g_enum_register_static ("GstAudioTestSrcWave",
+ audiostestsrc_waves);
+ }
+ return audiostestsrc_wave_type;
+}
+
+static void gst_audio_test_src_finalize (GObject * object);
+
+static void gst_audio_test_src_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_audio_test_src_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static gboolean gst_audio_test_src_setcaps (GstBaseSrc * basesrc,
+ GstCaps * caps);
+static void gst_audio_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
+
+static gboolean gst_audio_test_src_is_seekable (GstBaseSrc * basesrc);
+static gboolean gst_audio_test_src_do_seek (GstBaseSrc * basesrc,
+ GstSegment * segment);
+static gboolean gst_audio_test_src_query (GstBaseSrc * basesrc,
+ GstQuery * query);
+
+static void gst_audio_test_src_change_wave (GstAudioTestSrc * src);
+
+static void gst_audio_test_src_get_times (GstBaseSrc * basesrc,
+ GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
+static gboolean gst_audio_test_src_start (GstBaseSrc * basesrc);
+static gboolean gst_audio_test_src_stop (GstBaseSrc * basesrc);
+static GstFlowReturn gst_audio_test_src_fill (GstBaseSrc * basesrc,
+ guint64 offset, guint length, GstBuffer * buffer);
+
+static void
+gst_audio_test_src_class_init (GstAudioTestSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+
+ gobject_class->set_property = gst_audio_test_src_set_property;
+ gobject_class->get_property = gst_audio_test_src_get_property;
+ gobject_class->finalize = gst_audio_test_src_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_SAMPLES_PER_BUFFER,
+ g_param_spec_int ("samplesperbuffer", "Samples per buffer",
+ "Number of samples in each outgoing buffer",
+ 1, G_MAXINT, DEFAULT_SAMPLES_PER_BUFFER,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_WAVE,
+ g_param_spec_enum ("wave", "Waveform", "Oscillator waveform",
+ GST_TYPE_AUDIO_TEST_SRC_WAVE, GST_AUDIO_TEST_SRC_WAVE_SINE,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_FREQ,
+ g_param_spec_double ("freq", "Frequency", "Frequency of test signal",
+ 0.0, 20000.0, DEFAULT_FREQ,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_VOLUME,
+ g_param_spec_double ("volume", "Volume", "Volume of test signal", 0.0,
+ 1.0, DEFAULT_VOLUME,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_IS_LIVE,
+ g_param_spec_boolean ("is-live", "Is Live",
+ "Whether to act as a live source", DEFAULT_IS_LIVE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass),
+ PROP_TIMESTAMP_OFFSET, g_param_spec_int64 ("timestamp-offset",
+ "Timestamp offset",
+ "An offset added to timestamps set on buffers (in ns)", G_MININT64,
+ G_MAXINT64, DEFAULT_TIMESTAMP_OFFSET,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CAN_ACTIVATE_PUSH,
+ g_param_spec_boolean ("can-activate-push", "Can activate push",
+ "Can activate in push mode", DEFAULT_CAN_ACTIVATE_PUSH,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CAN_ACTIVATE_PULL,
+ g_param_spec_boolean ("can-activate-pull", "Can activate pull",
+ "Can activate in pull mode", DEFAULT_CAN_ACTIVATE_PULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_audio_test_src_src_template));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Audio test source", "Source/Audio",
+ "Creates audio test signals of given frequency and volume",
+ "Stefan Kost <ensonic@users.sf.net>");
+
+ gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_audio_test_src_setcaps);
+ gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_audio_test_src_fixate);
+ gstbasesrc_class->is_seekable =
+ GST_DEBUG_FUNCPTR (gst_audio_test_src_is_seekable);
+ gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_audio_test_src_do_seek);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_audio_test_src_query);
+ gstbasesrc_class->get_times =
+ GST_DEBUG_FUNCPTR (gst_audio_test_src_get_times);
+ gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_audio_test_src_start);
+ gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_audio_test_src_stop);
+ gstbasesrc_class->fill = GST_DEBUG_FUNCPTR (gst_audio_test_src_fill);
+}
+
+static void
+gst_audio_test_src_init (GstAudioTestSrc * src)
+{
+ src->volume = DEFAULT_VOLUME;
+ src->freq = DEFAULT_FREQ;
+
+ /* we operate in time */
+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
+ gst_base_src_set_live (GST_BASE_SRC (src), DEFAULT_IS_LIVE);
+
+ src->samples_per_buffer = DEFAULT_SAMPLES_PER_BUFFER;
+ src->generate_samples_per_buffer = src->samples_per_buffer;
+ src->timestamp_offset = DEFAULT_TIMESTAMP_OFFSET;
+ src->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
+
+ src->gen = NULL;
+
+ src->wave = DEFAULT_WAVE;
+ gst_base_src_set_blocksize (GST_BASE_SRC (src), -1);
+}
+
+static void
+gst_audio_test_src_finalize (GObject * object)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (object);
+
+ if (src->gen)
+ g_rand_free (src->gen);
+ src->gen = NULL;
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_audio_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (bsrc);
+ GstStructure *structure;
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ GST_DEBUG_OBJECT (src, "fixating samplerate to %d", GST_AUDIO_DEF_RATE);
+
+ gst_structure_fixate_field_nearest_int (structure, "rate",
+ GST_AUDIO_DEF_RATE);
+
+ gst_structure_fixate_field_string (structure, "format", DEFAULT_FORMAT_STR);
+
+ /* fixate to mono unless downstream requires stereo, for backwards compat */
+ gst_structure_fixate_field_nearest_int (structure, "channels", 1);
+
+ GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps);
+}
+
+static gboolean
+gst_audio_test_src_setcaps (GstBaseSrc * basesrc, GstCaps * caps)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc);
+ GstAudioInfo info;
+
+ if (!gst_audio_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ GST_DEBUG_OBJECT (src, "negotiated to caps %" GST_PTR_FORMAT, caps);
+
+ src->info = info;
+
+ gst_audio_test_src_change_wave (src);
+
+ return TRUE;
+
+ /* ERROR */
+invalid_caps:
+ {
+ GST_ERROR_OBJECT (basesrc, "received invalid caps");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_audio_test_src_query (GstBaseSrc * basesrc, GstQuery * query)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc);
+ 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);
+
+ if (!gst_audio_info_convert (&src->info, src_fmt, src_val, dest_fmt,
+ &dest_val))
+ goto error;
+
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ res = TRUE;
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ /* if we can operate in pull mode */
+ gst_query_set_scheduling (query, src->can_activate_pull, TRUE, FALSE, 1,
+ -1, 1);
+ res = TRUE;
+ break;
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
+ break;
+ }
+
+ return res;
+ /* ERROR */
+error:
+ {
+ GST_DEBUG_OBJECT (src, "query failed");
+ return FALSE;
+ }
+}
+
+#define DEFINE_SINE(type,scale) \
+static void \
+gst_audio_test_src_create_sine_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble step, amp; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ step = M_PI_M2 * src->freq / GST_AUDIO_INFO_RATE (&src->info); \
+ amp = src->volume * scale; \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ for (c = 0; c < channels; ++c) { \
+ samples[i++] = (g##type) (sin (src->accumulator) * amp); \
+ } \
+ } \
+}
+
+DEFINE_SINE (int16, 32767.0);
+DEFINE_SINE (int32, 2147483647.0);
+DEFINE_SINE (float, 1.0);
+DEFINE_SINE (double, 1.0);
+
+static const ProcessFunc sine_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_sine_int16,
+ (ProcessFunc) gst_audio_test_src_create_sine_int32,
+ (ProcessFunc) gst_audio_test_src_create_sine_float,
+ (ProcessFunc) gst_audio_test_src_create_sine_double
+};
+
+#define DEFINE_SQUARE(type,scale) \
+static void \
+gst_audio_test_src_create_square_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble step, amp; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ step = M_PI_M2 * src->freq / GST_AUDIO_INFO_RATE (&src->info); \
+ amp = src->volume * scale; \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ for (c = 0; c < channels; ++c) { \
+ samples[i++] = (g##type) ((src->accumulator < G_PI) ? amp : -amp); \
+ } \
+ } \
+}
+
+DEFINE_SQUARE (int16, 32767.0);
+DEFINE_SQUARE (int32, 2147483647.0);
+DEFINE_SQUARE (float, 1.0);
+DEFINE_SQUARE (double, 1.0);
+
+static const ProcessFunc square_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_square_int16,
+ (ProcessFunc) gst_audio_test_src_create_square_int32,
+ (ProcessFunc) gst_audio_test_src_create_square_float,
+ (ProcessFunc) gst_audio_test_src_create_square_double
+};
+
+#define DEFINE_SAW(type,scale) \
+static void \
+gst_audio_test_src_create_saw_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble step, amp; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ step = M_PI_M2 * src->freq / GST_AUDIO_INFO_RATE (&src->info); \
+ amp = (src->volume * scale) / G_PI; \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ if (src->accumulator < G_PI) { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) (src->accumulator * amp); \
+ } else { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) ((M_PI_M2 - src->accumulator) * -amp); \
+ } \
+ } \
+}
+
+DEFINE_SAW (int16, 32767.0);
+DEFINE_SAW (int32, 2147483647.0);
+DEFINE_SAW (float, 1.0);
+DEFINE_SAW (double, 1.0);
+
+static const ProcessFunc saw_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_saw_int16,
+ (ProcessFunc) gst_audio_test_src_create_saw_int32,
+ (ProcessFunc) gst_audio_test_src_create_saw_float,
+ (ProcessFunc) gst_audio_test_src_create_saw_double
+};
+
+#define DEFINE_TRIANGLE(type,scale) \
+static void \
+gst_audio_test_src_create_triangle_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble step, amp; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ step = M_PI_M2 * src->freq / GST_AUDIO_INFO_RATE (&src->info); \
+ amp = (src->volume * scale) / G_PI_2; \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ if (src->accumulator < (G_PI_2)) { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) (src->accumulator * amp); \
+ } else if (src->accumulator < (G_PI * 1.5)) { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) ((src->accumulator - G_PI) * -amp); \
+ } else { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) ((M_PI_M2 - src->accumulator) * -amp); \
+ } \
+ } \
+}
+
+DEFINE_TRIANGLE (int16, 32767.0);
+DEFINE_TRIANGLE (int32, 2147483647.0);
+DEFINE_TRIANGLE (float, 1.0);
+DEFINE_TRIANGLE (double, 1.0);
+
+static const ProcessFunc triangle_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_triangle_int16,
+ (ProcessFunc) gst_audio_test_src_create_triangle_int32,
+ (ProcessFunc) gst_audio_test_src_create_triangle_float,
+ (ProcessFunc) gst_audio_test_src_create_triangle_double
+};
+
+#define DEFINE_SILENCE(type) \
+static void \
+gst_audio_test_src_create_silence_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ memset (samples, 0, src->generate_samples_per_buffer * sizeof (g##type) * src->info.channels); \
+}
+
+DEFINE_SILENCE (int16);
+DEFINE_SILENCE (int32);
+DEFINE_SILENCE (float);
+DEFINE_SILENCE (double);
+
+static const ProcessFunc silence_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_silence_int16,
+ (ProcessFunc) gst_audio_test_src_create_silence_int32,
+ (ProcessFunc) gst_audio_test_src_create_silence_float,
+ (ProcessFunc) gst_audio_test_src_create_silence_double
+};
+
+#define DEFINE_WHITE_NOISE(type,scale) \
+static void \
+gst_audio_test_src_create_white_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c; \
+ gdouble amp = (src->volume * scale); \
+ gint channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) (amp * g_rand_double_range (src->gen, -1.0, 1.0)); \
+ } \
+}
+
+DEFINE_WHITE_NOISE (int16, 32767.0);
+DEFINE_WHITE_NOISE (int32, 2147483647.0);
+DEFINE_WHITE_NOISE (float, 1.0);
+DEFINE_WHITE_NOISE (double, 1.0);
+
+static const ProcessFunc white_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_white_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_white_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_white_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_white_noise_double
+};
+
+/* pink noise calculation is based on
+ * http://www.firstpr.com.au/dsp/pink-noise/phil_burk_19990905_patest_pink.c
+ * which has been released under public domain
+ * Many thanks Phil!
+ */
+static void
+gst_audio_test_src_init_pink_noise (GstAudioTestSrc * src)
+{
+ gint i;
+ gint num_rows = 12; /* arbitrary: 1 .. PINK_MAX_RANDOM_ROWS */
+ glong pmax;
+
+ src->pink.index = 0;
+ src->pink.index_mask = (1 << num_rows) - 1;
+ /* calculate maximum possible signed random value.
+ * Extra 1 for white noise always added. */
+ pmax = (num_rows + 1) * (1 << (PINK_RANDOM_BITS - 1));
+ src->pink.scalar = 1.0f / pmax;
+ /* Initialize rows. */
+ for (i = 0; i < num_rows; i++)
+ src->pink.rows[i] = 0;
+ src->pink.running_sum = 0;
+}
+
+/* Generate Pink noise values between -1.0 and +1.0 */
+static gdouble
+gst_audio_test_src_generate_pink_noise_value (GstAudioTestSrc * src)
+{
+ GstPinkNoise *pink = &src->pink;
+ glong new_random;
+ glong sum;
+
+ /* Increment and mask index. */
+ pink->index = (pink->index + 1) & pink->index_mask;
+
+ /* If index is zero, don't update any random values. */
+ if (pink->index != 0) {
+ /* Determine how many trailing zeros in PinkIndex. */
+ /* This algorithm will hang if n==0 so test first. */
+ gint num_zeros = 0;
+ gint n = pink->index;
+
+ while ((n & 1) == 0) {
+ n = n >> 1;
+ num_zeros++;
+ }
+
+ /* Replace the indexed ROWS random value.
+ * Subtract and add back to RunningSum instead of adding all the random
+ * values together. Only one changes each time.
+ */
+ pink->running_sum -= pink->rows[num_zeros];
+ new_random = 32768.0 - (65536.0 * (gulong) g_rand_int (src->gen)
+ / (G_MAXUINT32 + 1.0));
+ pink->running_sum += new_random;
+ pink->rows[num_zeros] = new_random;
+ }
+
+ /* Add extra white noise value. */
+ new_random = 32768.0 - (65536.0 * (gulong) g_rand_int (src->gen)
+ / (G_MAXUINT32 + 1.0));
+ sum = pink->running_sum + new_random;
+
+ /* Scale to range of -1.0 to 0.9999. */
+ return (pink->scalar * sum);
+}
+
+#define DEFINE_PINK(type, scale) \
+static void \
+gst_audio_test_src_create_pink_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble amp; \
+ \
+ amp = src->volume * scale; \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ for (c = 0; c < channels; ++c) { \
+ samples[i++] = \
+ (g##type) (gst_audio_test_src_generate_pink_noise_value (src) * \
+ amp); \
+ } \
+ } \
+}
+
+DEFINE_PINK (int16, 32767.0);
+DEFINE_PINK (int32, 2147483647.0);
+DEFINE_PINK (float, 1.0);
+DEFINE_PINK (double, 1.0);
+
+static const ProcessFunc pink_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_pink_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_pink_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_pink_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_pink_noise_double
+};
+
+static void
+gst_audio_test_src_init_sine_table (GstAudioTestSrc * src)
+{
+ gint i;
+ gdouble ang = 0.0;
+ gdouble step = M_PI_M2 / 1024.0;
+ gdouble amp = src->volume;
+
+ for (i = 0; i < 1024; i++) {
+ src->wave_table[i] = sin (ang) * amp;
+ ang += step;
+ }
+}
+
+#define DEFINE_SINE_TABLE(type,scale) \
+static void \
+gst_audio_test_src_create_sine_table_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels; \
+ gdouble step, scl; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ step = M_PI_M2 * src->freq / GST_AUDIO_INFO_RATE (&src->info); \
+ scl = 1024.0 / M_PI_M2; \
+ \
+ i = 0; \
+ while (i < (src->generate_samples_per_buffer * channels)) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ for (c = 0; c < channels; ++c) \
+ samples[i++] = (g##type) scale * src->wave_table[(gint) (src->accumulator * scl)]; \
+ } \
+}
+
+DEFINE_SINE_TABLE (int16, 32767.0);
+DEFINE_SINE_TABLE (int32, 2147483647.0);
+DEFINE_SINE_TABLE (float, 1.0);
+DEFINE_SINE_TABLE (double, 1.0);
+
+static const ProcessFunc sine_table_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_sine_table_int16,
+ (ProcessFunc) gst_audio_test_src_create_sine_table_int32,
+ (ProcessFunc) gst_audio_test_src_create_sine_table_float,
+ (ProcessFunc) gst_audio_test_src_create_sine_table_double
+};
+
+#define DEFINE_TICKS(type,scale) \
+static void \
+gst_audio_test_src_create_tick_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c, channels, samplerate; \
+ gdouble step, scl; \
+ \
+ channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ samplerate = GST_AUDIO_INFO_RATE (&src->info); \
+ step = M_PI_M2 * src->freq / samplerate; \
+ scl = 1024.0 / M_PI_M2; \
+ \
+ for (i = 0; i < src->generate_samples_per_buffer; i++) { \
+ src->accumulator += step; \
+ if (src->accumulator >= M_PI_M2) \
+ src->accumulator -= M_PI_M2; \
+ \
+ if ((src->next_sample + i)%samplerate < 1600) { \
+ for (c = 0; c < channels; ++c) \
+ samples[(i * channels) + c] = (g##type) scale * src->wave_table[(gint) (src->accumulator * scl)]; \
+ } else { \
+ for (c = 0; c < channels; ++c) \
+ samples[(i * channels) + c] = 0; \
+ } \
+ } \
+}
+
+DEFINE_TICKS (int16, 32767.0);
+DEFINE_TICKS (int32, 2147483647.0);
+DEFINE_TICKS (float, 1.0);
+DEFINE_TICKS (double, 1.0);
+
+static const ProcessFunc tick_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_tick_int16,
+ (ProcessFunc) gst_audio_test_src_create_tick_int32,
+ (ProcessFunc) gst_audio_test_src_create_tick_float,
+ (ProcessFunc) gst_audio_test_src_create_tick_double
+};
+
+/* Gaussian white noise using Box-Muller algorithm. unit variance
+ * normally-distributed random numbers are generated in pairs as the real
+ * and imaginary parts of a compex random variable with
+ * uniformly-distributed argument and \chi^{2}-distributed modulus.
+ */
+
+#define DEFINE_GAUSSIAN_WHITE_NOISE(type,scale) \
+static void \
+gst_audio_test_src_create_gaussian_white_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c; \
+ gdouble amp = (src->volume * scale); \
+ gint channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ for (i = 0; i < src->generate_samples_per_buffer * channels; ) { \
+ for (c = 0; c < channels; ++c) { \
+ gdouble mag = sqrt (-2 * log (1.0 - g_rand_double (src->gen))); \
+ gdouble phs = g_rand_double_range (src->gen, 0.0, M_PI_M2); \
+ \
+ samples[i++] = (g##type) (amp * mag * cos (phs)); \
+ if (++c >= channels) \
+ break; \
+ samples[i++] = (g##type) (amp * mag * sin (phs)); \
+ } \
+ } \
+}
+
+DEFINE_GAUSSIAN_WHITE_NOISE (int16, 32767.0);
+DEFINE_GAUSSIAN_WHITE_NOISE (int32, 2147483647.0);
+DEFINE_GAUSSIAN_WHITE_NOISE (float, 1.0);
+DEFINE_GAUSSIAN_WHITE_NOISE (double, 1.0);
+
+static const ProcessFunc gaussian_white_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_gaussian_white_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_gaussian_white_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_gaussian_white_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_gaussian_white_noise_double
+};
+
+/* Brownian (Red) Noise: noise where the power density decreases by 6 dB per
+ * octave with increasing frequency
+ *
+ * taken from http://vellocet.com/dsp/noise/VRand.html
+ * by Andrew Simper of Vellocet (andy@vellocet.com)
+ */
+
+#define DEFINE_RED_NOISE(type,scale) \
+static void \
+gst_audio_test_src_create_red_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c; \
+ gdouble amp = (src->volume * scale); \
+ gdouble state = src->red.state; \
+ gint channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ for (i = 0; i < src->generate_samples_per_buffer * channels; ) { \
+ for (c = 0; c < channels; ++c) { \
+ while (TRUE) { \
+ gdouble r = g_rand_double_range (src->gen, -1.0, 1.0); \
+ state += r; \
+ if (state<-8.0f || state>8.0f) state -= r; \
+ else break; \
+ } \
+ samples[i++] = (g##type) (amp * state * 0.0625f); /* /16.0 */ \
+ } \
+ } \
+ src->red.state = state; \
+}
+
+DEFINE_RED_NOISE (int16, 32767.0);
+DEFINE_RED_NOISE (int32, 2147483647.0);
+DEFINE_RED_NOISE (float, 1.0);
+DEFINE_RED_NOISE (double, 1.0);
+
+static const ProcessFunc red_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_red_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_red_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_red_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_red_noise_double
+};
+
+/* Blue Noise: apply spectral inversion to pink noise */
+
+#define DEFINE_BLUE_NOISE(type) \
+static void \
+gst_audio_test_src_create_blue_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c; \
+ static gdouble flip=1.0; \
+ gint channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ gst_audio_test_src_create_pink_noise_##type (src, samples); \
+ for (i = 0; i < src->generate_samples_per_buffer * channels; ) { \
+ for (c = 0; c < channels; ++c) { \
+ samples[i++] *= flip; \
+ } \
+ flip *= -1.0; \
+ } \
+}
+
+DEFINE_BLUE_NOISE (int16);
+DEFINE_BLUE_NOISE (int32);
+DEFINE_BLUE_NOISE (float);
+DEFINE_BLUE_NOISE (double);
+
+static const ProcessFunc blue_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_blue_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_blue_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_blue_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_blue_noise_double
+};
+
+
+/* Violet Noise: apply spectral inversion to red noise */
+
+#define DEFINE_VIOLET_NOISE(type) \
+static void \
+gst_audio_test_src_create_violet_noise_##type (GstAudioTestSrc * src, g##type * samples) \
+{ \
+ gint i, c; \
+ static gdouble flip=1.0; \
+ gint channels = GST_AUDIO_INFO_CHANNELS (&src->info); \
+ \
+ gst_audio_test_src_create_red_noise_##type (src, samples); \
+ for (i = 0; i < src->generate_samples_per_buffer * channels; ) { \
+ for (c = 0; c < channels; ++c) { \
+ samples[i++] *= flip; \
+ } \
+ flip *= -1.0; \
+ } \
+}
+
+DEFINE_VIOLET_NOISE (int16);
+DEFINE_VIOLET_NOISE (int32);
+DEFINE_VIOLET_NOISE (float);
+DEFINE_VIOLET_NOISE (double);
+
+static const ProcessFunc violet_noise_funcs[] = {
+ (ProcessFunc) gst_audio_test_src_create_violet_noise_int16,
+ (ProcessFunc) gst_audio_test_src_create_violet_noise_int32,
+ (ProcessFunc) gst_audio_test_src_create_violet_noise_float,
+ (ProcessFunc) gst_audio_test_src_create_violet_noise_double
+};
+
+
+/*
+ * gst_audio_test_src_change_wave:
+ * Assign function pointer of wave genrator.
+ */
+static void
+gst_audio_test_src_change_wave (GstAudioTestSrc * src)
+{
+ gint idx;
+
+ switch (GST_AUDIO_FORMAT_INFO_FORMAT (src->info.finfo)) {
+ case GST_AUDIO_FORMAT_S16:
+ idx = 0;
+ break;
+ case GST_AUDIO_FORMAT_S32:
+ idx = 1;
+ break;
+ case GST_AUDIO_FORMAT_F32:
+ idx = 2;
+ break;
+ case GST_AUDIO_FORMAT_F64:
+ idx = 3;
+ break;
+ default:
+ src->process = NULL;
+ return;
+ }
+
+ switch (src->wave) {
+ case GST_AUDIO_TEST_SRC_WAVE_SINE:
+ src->process = sine_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_SQUARE:
+ src->process = square_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_SAW:
+ src->process = saw_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_TRIANGLE:
+ src->process = triangle_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_SILENCE:
+ src->process = silence_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ src->process = white_noise_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ gst_audio_test_src_init_pink_noise (src);
+ src->process = pink_noise_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_SINE_TAB:
+ gst_audio_test_src_init_sine_table (src);
+ src->process = sine_table_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_TICKS:
+ gst_audio_test_src_init_sine_table (src);
+ src->process = tick_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ src->process = gaussian_white_noise_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_RED_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ src->red.state = 0.0;
+ src->process = red_noise_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ gst_audio_test_src_init_pink_noise (src);
+ src->process = blue_noise_funcs[idx];
+ break;
+ case GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE:
+ if (!(src->gen))
+ src->gen = g_rand_new ();
+ src->red.state = 0.0;
+ src->process = violet_noise_funcs[idx];
+ default:
+ GST_ERROR ("invalid wave-form");
+ break;
+ }
+}
+
+/*
+ * gst_audio_test_src_change_volume:
+ * Recalc wave tables for precalculated waves.
+ */
+static void
+gst_audio_test_src_change_volume (GstAudioTestSrc * src)
+{
+ switch (src->wave) {
+ case GST_AUDIO_TEST_SRC_WAVE_SINE_TAB:
+ gst_audio_test_src_init_sine_table (src);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_audio_test_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ /* for live sources, sync on the timestamp of the buffer */
+ if (gst_base_src_is_live (basesrc)) {
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ /* get duration to calculate end time */
+ GstClockTime duration = GST_BUFFER_DURATION (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ *end = timestamp + duration;
+ }
+ *start = timestamp;
+ }
+ } else {
+ *start = -1;
+ *end = -1;
+ }
+}
+
+static gboolean
+gst_audio_test_src_start (GstBaseSrc * basesrc)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc);
+
+ src->next_sample = 0;
+ src->next_byte = 0;
+ src->next_time = 0;
+ src->check_seek_stop = FALSE;
+ src->eos_reached = FALSE;
+ src->tags_pushed = FALSE;
+ src->accumulator = 0;
+
+ return TRUE;
+}
+
+static gboolean
+gst_audio_test_src_stop (GstBaseSrc * basesrc)
+{
+ return TRUE;
+}
+
+/* seek to time, will be called when we operate in push mode. In pull mode we
+ * get the requested byte offset. */
+static gboolean
+gst_audio_test_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (basesrc);
+ GstClockTime time;
+ gint samplerate, bpf;
+
+ GST_DEBUG_OBJECT (src, "seeking %" GST_SEGMENT_FORMAT, segment);
+
+ time = segment->position;
+ src->reverse = (segment->rate < 0.0);
+
+ samplerate = GST_AUDIO_INFO_RATE (&src->info);
+ bpf = GST_AUDIO_INFO_BPF (&src->info);
+
+ /* now move to the time indicated */
+ src->next_sample = gst_util_uint64_scale_int (time, samplerate, GST_SECOND);
+ src->next_byte = src->next_sample * bpf;
+ if (samplerate == 0)
+ src->next_time = 0;
+ else
+ src->next_time =
+ gst_util_uint64_scale_int (src->next_sample, GST_SECOND, samplerate);
+
+ GST_DEBUG_OBJECT (src, "seeking next_sample=%" G_GINT64_FORMAT
+ " next_time=%" GST_TIME_FORMAT, src->next_sample,
+ GST_TIME_ARGS (src->next_time));
+
+ g_assert (src->next_time <= time);
+
+ if (!src->reverse) {
+ if (GST_CLOCK_TIME_IS_VALID (segment->start)) {
+ segment->time = segment->start;
+ }
+ } else {
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop)) {
+ segment->time = segment->stop;
+ }
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop)) {
+ time = segment->stop;
+ src->sample_stop = gst_util_uint64_scale_int (time, samplerate, GST_SECOND);
+ src->check_seek_stop = TRUE;
+ } else {
+ src->check_seek_stop = FALSE;
+ }
+ src->eos_reached = FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_audio_test_src_is_seekable (GstBaseSrc * basesrc)
+{
+ /* we're seekable... */
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_audio_test_src_fill (GstBaseSrc * basesrc, guint64 offset,
+ guint length, GstBuffer * buffer)
+{
+ GstAudioTestSrc *src;
+ GstClockTime next_time;
+ gint64 next_sample, next_byte;
+ gint bytes, samples;
+ GstElementClass *eclass;
+ guint8 *data;
+ gint samplerate, bpf;
+
+ src = GST_AUDIO_TEST_SRC (basesrc);
+
+ /* example for tagging generated data */
+ if (!src->tags_pushed) {
+ GstTagList *taglist;
+
+ taglist = gst_tag_list_new ();
+
+ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND,
+ GST_TAG_DESCRIPTION, "audiotest wave", NULL);
+
+ eclass = GST_ELEMENT_CLASS (parent_class);
+ if (eclass->send_event)
+ eclass->send_event (GST_ELEMENT_CAST (basesrc),
+ gst_event_new_tag (taglist));
+ src->tags_pushed = TRUE;
+ }
+
+ if (src->eos_reached) {
+ GST_INFO_OBJECT (src, "eos");
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ samplerate = GST_AUDIO_INFO_RATE (&src->info);
+ bpf = GST_AUDIO_INFO_BPF (&src->info);
+
+ /* if no length was given, use our default length in samples otherwise convert
+ * the length in bytes to samples. */
+ if (length == -1)
+ samples = src->samples_per_buffer;
+ else
+ samples = length / bpf;
+
+ /* if no offset was given, use our next logical byte */
+ if (offset == -1)
+ offset = src->next_byte;
+
+ /* now see if we are at the byteoffset we think we are */
+ if (offset != src->next_byte) {
+ GST_DEBUG_OBJECT (src, "seek to new offset %" G_GUINT64_FORMAT, offset);
+ /* we have a discont in the expected sample offset, do a 'seek' */
+ src->next_sample = offset / bpf;
+ src->next_time =
+ gst_util_uint64_scale_int (src->next_sample, GST_SECOND, samplerate);
+ src->next_byte = offset;
+ }
+
+ /* check for eos */
+ if (src->check_seek_stop &&
+ (src->sample_stop > src->next_sample) &&
+ (src->sample_stop < src->next_sample + samples)
+ ) {
+ /* calculate only partial buffer */
+ src->generate_samples_per_buffer = src->sample_stop - src->next_sample;
+ next_sample = src->sample_stop;
+ src->eos_reached = TRUE;
+ } else {
+ /* calculate full buffer */
+ src->generate_samples_per_buffer = samples;
+ next_sample = src->next_sample + (src->reverse ? (-samples) : samples);
+ }
+
+ bytes = src->generate_samples_per_buffer * bpf;
+
+ next_byte = src->next_byte + (src->reverse ? (-bytes) : bytes);
+ next_time = gst_util_uint64_scale_int (next_sample, GST_SECOND, samplerate);
+
+ GST_LOG_OBJECT (src, "samplerate %d", samplerate);
+ GST_LOG_OBJECT (src, "next_sample %" G_GINT64_FORMAT ", ts %" GST_TIME_FORMAT,
+ next_sample, GST_TIME_ARGS (next_time));
+
+ GST_BUFFER_OFFSET (buffer) = src->next_sample;
+ GST_BUFFER_OFFSET_END (buffer) = next_sample;
+ if (!src->reverse) {
+ GST_BUFFER_TIMESTAMP (buffer) = src->timestamp_offset + src->next_time;
+ GST_BUFFER_DURATION (buffer) = next_time - src->next_time;
+ } else {
+ GST_BUFFER_TIMESTAMP (buffer) = src->timestamp_offset + next_time;
+ GST_BUFFER_DURATION (buffer) = src->next_time - next_time;
+ }
+
+ gst_object_sync_values (G_OBJECT (src), GST_BUFFER_TIMESTAMP (buffer));
+
+ src->next_time = next_time;
+ src->next_sample = next_sample;
+ src->next_byte = next_byte;
+
+ GST_LOG_OBJECT (src, "generating %u samples at ts %" GST_TIME_FORMAT,
+ src->generate_samples_per_buffer,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+
+ data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ src->process (src, data);
+ gst_buffer_unmap (buffer, data, bytes);
+
+ if (G_UNLIKELY ((src->wave == GST_AUDIO_TEST_SRC_WAVE_SILENCE)
+ || (src->volume == 0.0))) {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_GAP);
+ }
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_audio_test_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (object);
+
+ switch (prop_id) {
+ case PROP_SAMPLES_PER_BUFFER:
+ src->samples_per_buffer = g_value_get_int (value);
+ break;
+ case PROP_WAVE:
+ src->wave = g_value_get_enum (value);
+ gst_audio_test_src_change_wave (src);
+ break;
+ case PROP_FREQ:
+ src->freq = g_value_get_double (value);
+ break;
+ case PROP_VOLUME:
+ src->volume = g_value_get_double (value);
+ gst_audio_test_src_change_volume (src);
+ break;
+ case PROP_IS_LIVE:
+ gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value));
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ src->timestamp_offset = g_value_get_int64 (value);
+ break;
+ case PROP_CAN_ACTIVATE_PUSH:
+ GST_BASE_SRC (src)->can_activate_push = g_value_get_boolean (value);
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ src->can_activate_pull = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_audio_test_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstAudioTestSrc *src = GST_AUDIO_TEST_SRC (object);
+
+ switch (prop_id) {
+ case PROP_SAMPLES_PER_BUFFER:
+ g_value_set_int (value, src->samples_per_buffer);
+ break;
+ case PROP_WAVE:
+ g_value_set_enum (value, src->wave);
+ break;
+ case PROP_FREQ:
+ g_value_set_double (value, src->freq);
+ break;
+ case PROP_VOLUME:
+ g_value_set_double (value, src->volume);
+ break;
+ case PROP_IS_LIVE:
+ g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (src)));
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ g_value_set_int64 (value, src->timestamp_offset);
+ break;
+ case PROP_CAN_ACTIVATE_PUSH:
+ g_value_set_boolean (value, GST_BASE_SRC (src)->can_activate_push);
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ g_value_set_boolean (value, src->can_activate_pull);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ /* initialize gst controller library */
+ gst_controller_init (NULL, NULL);
+
+ GST_DEBUG_CATEGORY_INIT (audio_test_src_debug, "audiotestsrc", 0,
+ "Audio Test Source");
+
+ return gst_element_register (plugin, "audiotestsrc",
+ GST_RANK_NONE, GST_TYPE_AUDIO_TEST_SRC);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "audiotestsrc",
+ "Creates audio test signals of given frequency and volume",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/audiotestsrc/gstaudiotestsrc.h b/gst/audiotestsrc/gstaudiotestsrc.h
new file mode 100644
index 0000000..ac31392
--- /dev/null
+++ b/gst/audiotestsrc/gstaudiotestsrc.h
@@ -0,0 +1,146 @@
+/* GStreamer
+ * Copyright (C) 2005 Stefan Kost <ensonic@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_AUDIO_TEST_SRC_H__
+#define __GST_AUDIO_TEST_SRC_H__
+
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesrc.h>
+
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_AUDIO_TEST_SRC \
+ (gst_audio_test_src_get_type())
+#define GST_AUDIO_TEST_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_TEST_SRC,GstAudioTestSrc))
+#define GST_AUDIO_TEST_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_TEST_SRC,GstAudioTestSrcClass))
+#define GST_IS_AUDIO_TEST_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_TEST_SRC))
+#define GST_IS_AUDIO_TEST_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_TEST_SRC))
+
+/**
+ * GstAudioTestSrcWave:
+ * @GST_AUDIO_TEST_SRC_WAVE_SINE: a sine wave
+ * @GST_AUDIO_TEST_SRC_WAVE_SQUARE: a square wave
+ * @GST_AUDIO_TEST_SRC_WAVE_SAW: a saw wave
+ * @GST_AUDIO_TEST_SRC_WAVE_TRIANGLE: a tringle wave
+ * @GST_AUDIO_TEST_SRC_WAVE_SILENCE: silence
+ * @GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE: white uniform noise
+ * @GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE: pink noise
+ * @GST_AUDIO_TEST_SRC_WAVE_SINE_TAB: sine wave using a table
+ * @GST_AUDIO_TEST_SRC_WAVE_TICKS: periodic ticks
+ * @GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE: white (zero mean) Gaussian noise; volume sets the standard deviation of the noise in units of the range of values of the sample type, e.g. volume=0.1 produces noise with a standard deviation of 0.1*32767=3277 with 16-bit integer samples, or 0.1*1.0=0.1 with floating-point samples.
+ * @GST_AUDIO_TEST_SRC_WAVE_RED_NOISE: red (brownian) noise
+ * @GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE: spectraly inverted pink noise
+ * @GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE: spectraly inverted red (brownian) noise
+ *
+ * Different types of supported sound waves.
+ */
+typedef enum {
+ GST_AUDIO_TEST_SRC_WAVE_SINE,
+ GST_AUDIO_TEST_SRC_WAVE_SQUARE,
+ GST_AUDIO_TEST_SRC_WAVE_SAW,
+ GST_AUDIO_TEST_SRC_WAVE_TRIANGLE,
+ GST_AUDIO_TEST_SRC_WAVE_SILENCE,
+ GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_SINE_TAB,
+ GST_AUDIO_TEST_SRC_WAVE_TICKS,
+ GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_RED_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE,
+ GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE
+} GstAudioTestSrcWave;
+
+#define PINK_MAX_RANDOM_ROWS (30)
+#define PINK_RANDOM_BITS (16)
+#define PINK_RANDOM_SHIFT ((sizeof(long)*8)-PINK_RANDOM_BITS)
+
+typedef struct {
+ glong rows[PINK_MAX_RANDOM_ROWS];
+ glong running_sum; /* Used to optimize summing of generators. */
+ gint index; /* Incremented each sample. */
+ gint index_mask; /* Index wrapped by ANDing with this mask. */
+ gdouble scalar; /* Used to scale within range of -1.0 to +1.0 */
+} GstPinkNoise;
+
+typedef struct {
+ gdouble state; /* noise state */
+} GstRedNoise;
+
+typedef struct _GstAudioTestSrc GstAudioTestSrc;
+typedef struct _GstAudioTestSrcClass GstAudioTestSrcClass;
+
+typedef void (*ProcessFunc) (GstAudioTestSrc*, guint8 *);
+
+/**
+ * GstAudioTestSrc:
+ *
+ * audiotestsrc object structure.
+ */
+struct _GstAudioTestSrc {
+ GstBaseSrc parent;
+
+ ProcessFunc process;
+
+ /* parameters */
+ GstAudioTestSrcWave wave;
+ gdouble volume;
+ gdouble freq;
+
+ /* audio parameters */
+ GstAudioInfo info;
+ gint samples_per_buffer;
+
+ /*< private >*/
+ gboolean tags_pushed; /* send tags just once ? */
+ GstClockTimeDiff timestamp_offset; /* base offset */
+ GstClockTime next_time; /* next timestamp */
+ gint64 next_sample; /* next sample to send */
+ gint64 next_byte; /* next byte to send */
+ gint64 sample_stop;
+ gboolean check_seek_stop;
+ gboolean eos_reached;
+ gint generate_samples_per_buffer; /* used to generate a partial buffer */
+ gboolean can_activate_pull;
+ gboolean reverse; /* play backwards */
+
+ /* waveform specific context data */
+ GRand *gen; /* random number generator */
+ gdouble accumulator; /* phase angle */
+ GstPinkNoise pink;
+ GstRedNoise red;
+ gdouble wave_table[1024];
+};
+
+struct _GstAudioTestSrcClass {
+ GstBaseSrcClass parent_class;
+};
+
+GType gst_audio_test_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_AUDIO_TEST_SRC_H__ */
diff --git a/gst/encoding/Makefile.am b/gst/encoding/Makefile.am
new file mode 100644
index 0000000..dace539
--- /dev/null
+++ b/gst/encoding/Makefile.am
@@ -0,0 +1,53 @@
+# variables used for enum/marshal generation
+glib_enum_define = GST_ENCODE
+glib_gen_prefix = gst_encode
+glib_gen_basename = gstencode
+
+built_sources = gstencode-marshal.c
+built_headers = gstencode-marshal.h
+
+plugin_LTLIBRARIES = libgstencodebin.la
+
+libgstencodebin_la_SOURCES = \
+ gstencodebin.c \
+ gstsmartencoder.c \
+ gststreamcombiner.c \
+ gststreamsplitter.c
+
+nodist_libgstencodebin_la_SOURCES = $(built_sources)
+libgstencodebin_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstencodebin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstencodebin_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+libgstencodebin_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstencodebin.h \
+ gststreamcombiner.h \
+ gststreamsplitter.h \
+ gstsmartencoder.h
+
+
+BUILT_SOURCES = $(built_headers) $(built_sources)
+
+EXTRA_DIST = gstencode-marshal.list
+
+CLEANFILES = $(BUILT_SOURCES)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstencodebin -:SHARED libgstencodebin \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstencodebin_la_SOURCES) \
+ $(nodist_libgstencodebin_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstencodebin_la_CFLAGS) \
+ -:LDFLAGS $(libgstencodebin_la_LDFLAGS) \
+ $(libgstencodebin_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/encoding/Makefile.in b/gst/encoding/Makefile.in
new file mode 100644
index 0000000..ca1bf51
--- /dev/null
+++ b/gst/encoding/Makefile.in
@@ -0,0 +1,887 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/encoding
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstencodebin_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+am_libgstencodebin_la_OBJECTS = libgstencodebin_la-gstencodebin.lo \
+ libgstencodebin_la-gstsmartencoder.lo \
+ libgstencodebin_la-gststreamcombiner.lo \
+ libgstencodebin_la-gststreamsplitter.lo
+am__objects_1 = libgstencodebin_la-gstencode-marshal.lo
+nodist_libgstencodebin_la_OBJECTS = $(am__objects_1)
+libgstencodebin_la_OBJECTS = $(am_libgstencodebin_la_OBJECTS) \
+ $(nodist_libgstencodebin_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstencodebin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstencodebin_la_CFLAGS) $(CFLAGS) \
+ $(libgstencodebin_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstencodebin_la_SOURCES) \
+ $(nodist_libgstencodebin_la_SOURCES)
+DIST_SOURCES = $(libgstencodebin_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# variables used for enum/marshal generation
+glib_enum_define = GST_ENCODE
+glib_gen_prefix = gst_encode
+glib_gen_basename = gstencode
+built_sources = gstencode-marshal.c
+built_headers = gstencode-marshal.h
+plugin_LTLIBRARIES = libgstencodebin.la
+libgstencodebin_la_SOURCES = \
+ gstencodebin.c \
+ gstsmartencoder.c \
+ gststreamcombiner.c \
+ gststreamsplitter.c
+
+nodist_libgstencodebin_la_SOURCES = $(built_sources)
+libgstencodebin_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+libgstencodebin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstencodebin_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+
+libgstencodebin_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstencodebin.h \
+ gststreamcombiner.h \
+ gststreamsplitter.h \
+ gstsmartencoder.h
+
+BUILT_SOURCES = $(built_headers) $(built_sources)
+EXTRA_DIST = gstencode-marshal.list
+CLEANFILES = $(BUILT_SOURCES)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(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/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/encoding/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/encoding/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
+libgstencodebin.la: $(libgstencodebin_la_OBJECTS) $(libgstencodebin_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstencodebin_la_LINK) -rpath $(plugindir) $(libgstencodebin_la_OBJECTS) $(libgstencodebin_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstencodebin_la-gstencode-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstencodebin_la-gstencodebin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstencodebin_la-gstsmartencoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstencodebin_la-gststreamcombiner.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstencodebin_la-gststreamsplitter.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstencodebin_la-gstencodebin.lo: gstencodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -MT libgstencodebin_la-gstencodebin.lo -MD -MP -MF $(DEPDIR)/libgstencodebin_la-gstencodebin.Tpo -c -o libgstencodebin_la-gstencodebin.lo `test -f 'gstencodebin.c' || echo '$(srcdir)/'`gstencodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstencodebin_la-gstencodebin.Tpo $(DEPDIR)/libgstencodebin_la-gstencodebin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstencodebin.c' object='libgstencodebin_la-gstencodebin.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -c -o libgstencodebin_la-gstencodebin.lo `test -f 'gstencodebin.c' || echo '$(srcdir)/'`gstencodebin.c
+
+libgstencodebin_la-gstsmartencoder.lo: gstsmartencoder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -MT libgstencodebin_la-gstsmartencoder.lo -MD -MP -MF $(DEPDIR)/libgstencodebin_la-gstsmartencoder.Tpo -c -o libgstencodebin_la-gstsmartencoder.lo `test -f 'gstsmartencoder.c' || echo '$(srcdir)/'`gstsmartencoder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstencodebin_la-gstsmartencoder.Tpo $(DEPDIR)/libgstencodebin_la-gstsmartencoder.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsmartencoder.c' object='libgstencodebin_la-gstsmartencoder.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -c -o libgstencodebin_la-gstsmartencoder.lo `test -f 'gstsmartencoder.c' || echo '$(srcdir)/'`gstsmartencoder.c
+
+libgstencodebin_la-gststreamcombiner.lo: gststreamcombiner.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -MT libgstencodebin_la-gststreamcombiner.lo -MD -MP -MF $(DEPDIR)/libgstencodebin_la-gststreamcombiner.Tpo -c -o libgstencodebin_la-gststreamcombiner.lo `test -f 'gststreamcombiner.c' || echo '$(srcdir)/'`gststreamcombiner.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstencodebin_la-gststreamcombiner.Tpo $(DEPDIR)/libgstencodebin_la-gststreamcombiner.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gststreamcombiner.c' object='libgstencodebin_la-gststreamcombiner.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -c -o libgstencodebin_la-gststreamcombiner.lo `test -f 'gststreamcombiner.c' || echo '$(srcdir)/'`gststreamcombiner.c
+
+libgstencodebin_la-gststreamsplitter.lo: gststreamsplitter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -MT libgstencodebin_la-gststreamsplitter.lo -MD -MP -MF $(DEPDIR)/libgstencodebin_la-gststreamsplitter.Tpo -c -o libgstencodebin_la-gststreamsplitter.lo `test -f 'gststreamsplitter.c' || echo '$(srcdir)/'`gststreamsplitter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstencodebin_la-gststreamsplitter.Tpo $(DEPDIR)/libgstencodebin_la-gststreamsplitter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gststreamsplitter.c' object='libgstencodebin_la-gststreamsplitter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -c -o libgstencodebin_la-gststreamsplitter.lo `test -f 'gststreamsplitter.c' || echo '$(srcdir)/'`gststreamsplitter.c
+
+libgstencodebin_la-gstencode-marshal.lo: gstencode-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -MT libgstencodebin_la-gstencode-marshal.lo -MD -MP -MF $(DEPDIR)/libgstencodebin_la-gstencode-marshal.Tpo -c -o libgstencodebin_la-gstencode-marshal.lo `test -f 'gstencode-marshal.c' || echo '$(srcdir)/'`gstencode-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstencodebin_la-gstencode-marshal.Tpo $(DEPDIR)/libgstencodebin_la-gstencode-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstencode-marshal.c' object='libgstencodebin_la-gstencode-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstencodebin_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstencodebin_la_CFLAGS) $(CFLAGS) -c -o libgstencodebin_la-gstencode-marshal.lo `test -f 'gstencode-marshal.c' || echo '$(srcdir)/'`gstencode-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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 <glib-object.h>\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 libgstencodebin -:SHARED libgstencodebin \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstencodebin_la_SOURCES) \
+ $(nodist_libgstencodebin_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstencodebin_la_CFLAGS) \
+ -:LDFLAGS $(libgstencodebin_la_LDFLAGS) \
+ $(libgstencodebin_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/encoding/gstencode-marshal.list b/gst/encoding/gstencode-marshal.list
new file mode 100644
index 0000000..00f26ed
--- /dev/null
+++ b/gst/encoding/gstencode-marshal.list
@@ -0,0 +1 @@
+OBJECT:BOXED
diff --git a/gst/encoding/gstencodebin.c b/gst/encoding/gstencodebin.c
new file mode 100644
index 0000000..f081a1c
--- /dev/null
+++ b/gst/encoding/gstencodebin.c
@@ -0,0 +1,2078 @@
+/* GStreamer encoding bin
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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 <string.h>
+#include "gstencodebin.h"
+#include "gstsmartencoder.h"
+#include "gststreamsplitter.h"
+#include "gststreamcombiner.h"
+#include <gst/gst-i18n-plugin.h>
+
+/**
+ * SECTION:element-encodebin
+ *
+ * EncodeBin provides a bin for encoding/muxing various streams according to
+ * a specified #GstEncodingProfile.
+ *
+ * Based on the profile that was set (via the #GstEncodeBin:profile property),
+ * EncodeBin will internally select and configure the required elements
+ * (encoders, muxers, but also audio and video converters) so that you can
+ * provide it raw or pre-encoded streams of data in input and have your
+ * encoded/muxed/converted stream in output.
+ *
+ * <refsect2>
+ * <title>Features</title>
+ * <itemizedlist>
+ * <listitem>
+ * Automatic encoder and muxer selection based on elements available on the
+ * system.
+ * </listitem>
+ * <listitem>
+ * Conversion of raw audio/video streams (scaling, framerate conversion,
+ * colorspace conversion, samplerate conversion) to conform to the profile
+ * output format.
+ * </listitem>
+ * <listitem>
+ * Variable number of streams. If the presence property for a stream encoding
+ * profile is 0, you can request any number of sink pads for it via the
+ * standard request pad gstreamer API or the #GstEncodeBin::request-pad action
+ * signal.
+ * </listitem>
+ * <listitem>
+ * Avoid reencoding (passthrough). If the input stream is already encoded and is
+ * compatible with what the #GstEncodingProfile expects, then the stream won't
+ * be re-encoded but just passed through downstream to the muxer or the output.
+ * </listitem>
+ * <listitem>
+ * Mix pre-encoded and raw streams as input. In addition to the passthrough
+ * feature above, you can feed both raw audio/video *AND* already-encoded data
+ * to a pad. #GstEncodeBin will take care of passing through the compatible
+ * segments and re-encoding the segments of media that need encoding.
+ * </listitem>
+ * <listitem>
+ * Standard behaviour is to use a #GstEncodingContainerProfile to have both
+ * encoding and muxing performed. But you can also provide a single stream
+ * profile (like #GstEncodingAudioProfile) to only have the encoding done and
+ * handle the encoded output yourself.
+ * </listitem>
+ * <listitem>
+ * Audio imperfection corrections. Incoming audio streams can have non perfect
+ * timestamps (jitter), like the streams coming from ASF files. #GstEncodeBin
+ * will automatically fix those imperfections for you. See
+ * #GstEncodeBin:audio-jitter-tolerance for more details.
+ * </listitem>
+ * <listitem>
+ * Variable or Constant video framerate. If your #GstEncodingVideoProfile has
+ * the variableframerate property deactivated (default), then the incoming
+ * raw video stream will be retimestampped in order to produce a constant
+ * framerate.
+ * </listitem>
+ * <listitem>
+ * Cross-boundary re-encoding. When feeding compatible pre-encoded streams that
+ * fall on segment boundaries, and for supported formats (right now only H263),
+ * the GOP will be decoded/reencoded when needed to produce an encoded output
+ * that fits exactly within the request GstSegment.
+ * </listitem>
+ * <listitem>
+ * Missing plugin support. If a #GstElement is missing to encode/mux to the
+ * request profile formats, a missing-plugin #GstMessage will be posted on the
+ * #GstBus, allowing systems that support the missing-plugin system to offer the
+ * user a way to install the missing element.
+ * </listitem>
+ * </itemizedlist>
+ * </refsect2>
+ */
+
+
+/* TODO/FIXME
+ *
+ * Handling mp3!xing!idv3 and theora!ogg tagsetting scenarios:
+ * Once we have chosen a muxer:
+ * When a new stream is requested:
+ * If muxer isn't 'Formatter' OR doesn't have a TagSetter interface:
+ * Find a Formatter for the given stream (preferably with TagSetter)
+ * Insert that before muxer
+ **/
+
+#define fast_pad_link(a,b) gst_pad_link_full((a),(b),GST_PAD_LINK_CHECK_NOTHING)
+#define fast_element_link(a,b) gst_element_link_pads_full((a),"src",(b),"sink",GST_PAD_LINK_CHECK_NOTHING)
+
+typedef enum
+{
+ GST_ENC_FLAG_NO_AUDIO_CONVERSION = (1 << 0),
+ GST_ENC_FLAG_NO_VIDEO_CONVERSION = (1 << 1)
+} GstEncFlags;
+
+#define GST_TYPE_ENC_FLAGS (gst_enc_flags_get_type())
+GType gst_enc_flags_get_type (void);
+
+/* generic templates */
+static GstStaticPadTemplate muxer_src_template =
+GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate video_sink_template =
+GST_STATIC_PAD_TEMPLATE ("video_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate audio_sink_template =
+GST_STATIC_PAD_TEMPLATE ("audio_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+/* static GstStaticPadTemplate text_sink_template = */
+/* GST_STATIC_PAD_TEMPLATE ("text_%d", */
+/* GST_PAD_SINK, */
+/* GST_PAD_REQUEST, */
+/* GST_STATIC_CAPS_ANY); */
+static GstStaticPadTemplate private_sink_template =
+GST_STATIC_PAD_TEMPLATE ("private_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+struct _GstEncodeBin
+{
+ GstBin parent;
+
+ /* the profile field is only valid if it could be entirely setup */
+ GstEncodingProfile *profile;
+
+ GList *streams; /* List of StreamGroup, not sorted */
+
+ GstElement *muxer;
+ /* Ghostpad with changing target */
+ GstPad *srcpad;
+
+ /* TRUE if in PAUSED/PLAYING */
+ gboolean active;
+
+ /* available muxers, encoders and parsers */
+ GList *muxers;
+ GList *formatters;
+ GList *encoders;
+ GList *parsers;
+
+ /* Increasing counter for unique pad name */
+ guint last_pad_id;
+
+ /* Cached caps for identification */
+ GstCaps *raw_video_caps;
+ GstCaps *raw_audio_caps;
+ /* GstCaps *raw_text_caps; */
+
+ guint queue_buffers_max;
+ guint queue_bytes_max;
+ guint64 queue_time_max;
+
+ guint64 tolerance;
+ gboolean avoid_reencoding;
+
+ GstEncFlags flags;
+};
+
+struct _GstEncodeBinClass
+{
+ GstBinClass parent;
+
+ /* Action Signals */
+ GstPad *(*request_pad) (GstEncodeBin * encodebin, GstCaps * caps);
+};
+
+typedef struct _StreamGroup StreamGroup;
+
+struct _StreamGroup
+{
+ GstEncodeBin *ebin;
+ GstEncodingProfile *profile;
+ GstPad *ghostpad; /* Sink ghostpad */
+ GstElement *inqueue; /* Queue just after the ghostpad */
+ GstElement *splitter;
+ GList *converters; /* List of conversion GstElement */
+ GstElement *capsfilter; /* profile->restriction (if non-NULL/ANY) */
+ GstElement *encoder; /* Encoder (can be NULL) */
+ GstElement *combiner;
+ GstElement *parser;
+ GstElement *smartencoder;
+ GstElement *outfilter; /* Output capsfilter (streamprofile.format) */
+ GstElement *formatter;
+ GstElement *outqueue; /* Queue just before the muxer */
+};
+
+/* Default for queues (same defaults as queue element) */
+#define DEFAULT_QUEUE_BUFFERS_MAX 200
+#define DEFAULT_QUEUE_BYTES_MAX 10 * 1024 * 1024
+#define DEFAULT_QUEUE_TIME_MAX GST_SECOND
+#define DEFAULT_AUDIO_JITTER_TOLERANCE 20 * GST_MSECOND
+#define DEFAULT_AVOID_REENCODING FALSE
+#define DEFAULT_FLAGS 0
+
+#define DEFAULT_RAW_CAPS \
+ "video/x-raw; " \
+ "audio/x-raw; " \
+ "text/plain; " \
+ "text/x-pango-markup; " \
+ "video/x-dvd-subpicture; " \
+ "subpicture/x-pgs"
+
+/* Properties */
+enum
+{
+ PROP_0,
+ PROP_PROFILE,
+ PROP_QUEUE_BUFFERS_MAX,
+ PROP_QUEUE_BYTES_MAX,
+ PROP_QUEUE_TIME_MAX,
+ PROP_AUDIO_JITTER_TOLERANCE,
+ PROP_AVOID_REENCODING,
+ PROP_FLAGS,
+ PROP_LAST
+};
+
+/* Signals */
+enum
+{
+ SIGNAL_REQUEST_PAD,
+ LAST_SIGNAL
+};
+
+#define C_FLAGS(v) ((guint) v)
+
+GType
+gst_enc_flags_get_type (void)
+{
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_ENC_FLAG_NO_AUDIO_CONVERSION), "Do not use audio conversion "
+ "elements", "no-audio-conversion"},
+ {C_FLAGS (GST_ENC_FLAG_NO_VIDEO_CONVERSION), "Do not use video conversion "
+ "elements", "no-video-conversion"},
+ {0, NULL, NULL}
+ };
+ static volatile GType id = 0;
+
+ if (g_once_init_enter ((gsize *) & id)) {
+ GType _id;
+
+ _id = g_flags_register_static ("GstEncFlags", values);
+
+ g_once_init_leave ((gsize *) & id, _id);
+ }
+
+ return id;
+}
+
+static guint gst_encode_bin_signals[LAST_SIGNAL] = { 0 };
+
+static GstStaticCaps default_raw_caps = GST_STATIC_CAPS (DEFAULT_RAW_CAPS);
+
+GST_DEBUG_CATEGORY_STATIC (gst_encode_bin_debug);
+#define GST_CAT_DEFAULT gst_encode_bin_debug
+
+G_DEFINE_TYPE (GstEncodeBin, gst_encode_bin, GST_TYPE_BIN);
+
+static void gst_encode_bin_dispose (GObject * object);
+static void gst_encode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_encode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static GstStateChangeReturn gst_encode_bin_change_state (GstElement * element,
+ GstStateChange transition);
+
+static GstPad *gst_encode_bin_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_encode_bin_release_pad (GstElement * element, GstPad * pad);
+
+static gboolean
+gst_encode_bin_set_profile (GstEncodeBin * ebin, GstEncodingProfile * profile);
+static void gst_encode_bin_tear_down_profile (GstEncodeBin * ebin);
+static gboolean gst_encode_bin_setup_profile (GstEncodeBin * ebin,
+ GstEncodingProfile * profile);
+
+static StreamGroup *_create_stream_group (GstEncodeBin * ebin,
+ GstEncodingProfile * sprof, const gchar * sinkpadname, GstCaps * sinkcaps);
+static void stream_group_remove (GstEncodeBin * ebin, StreamGroup * sgroup);
+static GstPad *gst_encode_bin_request_pad_signal (GstEncodeBin * encodebin,
+ GstCaps * caps);
+
+static inline GstElement *_get_formatter (GstEncodeBin * ebin,
+ GstEncodingProfile * sprof);
+
+static void
+gst_encode_bin_class_init (GstEncodeBinClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+
+ gobject_klass->dispose = gst_encode_bin_dispose;
+ gobject_klass->set_property = gst_encode_bin_set_property;
+ gobject_klass->get_property = gst_encode_bin_get_property;
+
+ /* Properties */
+
+ /**
+ * GstEncodeBin:profile:
+ *
+ * The #GstEncodingProfile to use. This property must be set before going
+ * to %GST_STATE_PAUSED or higher.
+ */
+ g_object_class_install_property (gobject_klass, PROP_PROFILE,
+ g_param_spec_object ("profile", "Profile",
+ "The GstEncodingProfile to use", GST_TYPE_ENCODING_PROFILE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_QUEUE_BYTES_MAX,
+ g_param_spec_uint ("queue-bytes-max", "Max. size (kB)",
+ "Max. amount of data in the queue (bytes, 0=disable)",
+ 0, G_MAXUINT, DEFAULT_QUEUE_BYTES_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_QUEUE_BUFFERS_MAX,
+ g_param_spec_uint ("queue-buffers-max", "Max. size (buffers)",
+ "Max. number of buffers in the queue (0=disable)", 0, G_MAXUINT,
+ DEFAULT_QUEUE_BUFFERS_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_QUEUE_TIME_MAX,
+ g_param_spec_uint64 ("queue-time-max", "Max. size (ns)",
+ "Max. amount of data in the queue (in ns, 0=disable)", 0, G_MAXUINT64,
+ DEFAULT_QUEUE_TIME_MAX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_AUDIO_JITTER_TOLERANCE,
+ g_param_spec_uint64 ("audio-jitter-tolerance", "Audio jitter tolerance",
+ "Amount of timestamp jitter/imperfection to allow on audio streams before inserting/dropping samples (ns)",
+ 0, G_MAXUINT64, DEFAULT_AUDIO_JITTER_TOLERANCE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_AVOID_REENCODING,
+ g_param_spec_boolean ("avoid-reencoding", "Avoid re-encoding",
+ "Whether to re-encode portions of compatible video streams that lay on segment boundaries",
+ DEFAULT_AVOID_REENCODING,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstEncodeBin:flags
+ *
+ * Control the behaviour of encodebin.
+ */
+ g_object_class_install_property (gobject_klass, PROP_FLAGS,
+ g_param_spec_flags ("flags", "Flags", "Flags to control behaviour",
+ GST_TYPE_ENC_FLAGS, DEFAULT_FLAGS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /* Signals */
+ /**
+ * GstEncodeBin::request-pad
+ * @encodebin: a #GstEncodeBin instance
+ * @caps: a #GstCaps
+ *
+ * Use this method to request an unused sink request #GstPad that can take the
+ * provided @caps as input. You must release the pad with
+ * gst_element_release_request_pad() when you are done with it.
+ *
+ * Returns: A compatible #GstPad, or %NULL if no compatible #GstPad could be
+ * created or is available.
+ */
+ gst_encode_bin_signals[SIGNAL_REQUEST_PAD] =
+ g_signal_new ("request-pad", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstEncodeBinClass,
+ request_pad), NULL, NULL, gst_encode_marshal_OBJECT__BOXED,
+ GST_TYPE_PAD, 1, GST_TYPE_CAPS);
+
+ klass->request_pad = gst_encode_bin_request_pad_signal;
+
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&muxer_src_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&video_sink_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&audio_sink_template));
+ /* gst_element_class_add_pad_template (gstelement_klass, */
+ /* gst_static_pad_template_get (&text_sink_template)); */
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&private_sink_template));
+
+ gstelement_klass->change_state =
+ GST_DEBUG_FUNCPTR (gst_encode_bin_change_state);
+ gstelement_klass->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_encode_bin_request_new_pad);
+ gstelement_klass->release_pad =
+ GST_DEBUG_FUNCPTR (gst_encode_bin_release_pad);
+
+ gst_element_class_set_details_simple (gstelement_klass,
+ "Encoder Bin",
+ "Generic/Bin/Encoder",
+ "Convenience encoding/muxing element",
+ "Edward Hervey <edward.hervey@collabora.co.uk>");
+}
+
+static void
+gst_encode_bin_dispose (GObject * object)
+{
+ GstEncodeBin *ebin = (GstEncodeBin *) object;
+
+ if (ebin->muxers)
+ gst_plugin_feature_list_free (ebin->muxers);
+
+ if (ebin->formatters)
+ gst_plugin_feature_list_free (ebin->formatters);
+
+ if (ebin->encoders)
+ gst_plugin_feature_list_free (ebin->encoders);
+
+ if (ebin->parsers)
+ gst_plugin_feature_list_free (ebin->parsers);
+
+ gst_encode_bin_tear_down_profile (ebin);
+
+ if (ebin->raw_video_caps)
+ gst_caps_unref (ebin->raw_video_caps);
+ if (ebin->raw_audio_caps)
+ gst_caps_unref (ebin->raw_audio_caps);
+ /* if (ebin->raw_text_caps) */
+ /* gst_caps_unref (ebin->raw_text_caps); */
+
+ G_OBJECT_CLASS (gst_encode_bin_parent_class)->dispose (object);
+}
+
+static void
+gst_encode_bin_init (GstEncodeBin * encode_bin)
+{
+ GstPadTemplate *tmpl;
+
+ encode_bin->muxers =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_MUXER,
+ GST_RANK_MARGINAL);
+
+ encode_bin->formatters =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_FORMATTER,
+ GST_RANK_SECONDARY);
+
+ encode_bin->encoders =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_ENCODER,
+ GST_RANK_MARGINAL);
+
+ encode_bin->parsers =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_PARSER,
+ GST_RANK_MARGINAL);
+
+ encode_bin->raw_video_caps = gst_caps_from_string ("video/x-raw");
+ encode_bin->raw_audio_caps = gst_caps_from_string ("audio/x-raw");
+ /* encode_bin->raw_text_caps = */
+ /* gst_caps_from_string ("text/plain;text/x-pango-markup"); */
+
+ encode_bin->queue_buffers_max = DEFAULT_QUEUE_BUFFERS_MAX;
+ encode_bin->queue_bytes_max = DEFAULT_QUEUE_BYTES_MAX;
+ encode_bin->queue_time_max = DEFAULT_QUEUE_TIME_MAX;
+ encode_bin->tolerance = DEFAULT_AUDIO_JITTER_TOLERANCE;
+ encode_bin->avoid_reencoding = DEFAULT_AVOID_REENCODING;
+ encode_bin->flags = DEFAULT_FLAGS;
+
+ tmpl = gst_static_pad_template_get (&muxer_src_template);
+ encode_bin->srcpad = gst_ghost_pad_new_no_target_from_template ("src", tmpl);
+ gst_object_unref (tmpl);
+ gst_element_add_pad (GST_ELEMENT_CAST (encode_bin), encode_bin->srcpad);
+}
+
+static void
+gst_encode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstEncodeBin *ebin = (GstEncodeBin *) object;
+
+ switch (prop_id) {
+ case PROP_PROFILE:
+ gst_encode_bin_set_profile (ebin,
+ (GstEncodingProfile *) g_value_get_object (value));
+ break;
+ case PROP_QUEUE_BUFFERS_MAX:
+ ebin->queue_buffers_max = g_value_get_uint (value);
+ break;
+ case PROP_QUEUE_BYTES_MAX:
+ ebin->queue_bytes_max = g_value_get_uint (value);
+ break;
+ case PROP_QUEUE_TIME_MAX:
+ ebin->queue_time_max = g_value_get_uint64 (value);
+ break;
+ case PROP_AUDIO_JITTER_TOLERANCE:
+ ebin->tolerance = g_value_get_uint64 (value);
+ break;
+ case PROP_AVOID_REENCODING:
+ ebin->avoid_reencoding = g_value_get_boolean (value);
+ break;
+ case PROP_FLAGS:
+ ebin->flags = g_value_get_flags (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_encode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstEncodeBin *ebin = (GstEncodeBin *) object;
+
+ switch (prop_id) {
+ case PROP_PROFILE:
+ g_value_set_object (value, (GObject *) ebin->profile);
+ break;
+ case PROP_QUEUE_BUFFERS_MAX:
+ g_value_set_uint (value, ebin->queue_buffers_max);
+ break;
+ case PROP_QUEUE_BYTES_MAX:
+ g_value_set_uint (value, ebin->queue_bytes_max);
+ break;
+ case PROP_QUEUE_TIME_MAX:
+ g_value_set_uint64 (value, ebin->queue_time_max);
+ break;
+ case PROP_AUDIO_JITTER_TOLERANCE:
+ g_value_set_uint64 (value, ebin->tolerance);
+ break;
+ case PROP_AVOID_REENCODING:
+ g_value_set_boolean (value, ebin->avoid_reencoding);
+ break;
+ case PROP_FLAGS:
+ g_value_set_flags (value, ebin->flags);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static inline gboolean
+are_raw_caps (const GstCaps * caps)
+{
+ GstCaps *raw = gst_static_caps_get (&default_raw_caps);
+
+ if (gst_caps_can_intersect (caps, raw)) {
+ gst_caps_unref (raw);
+ return TRUE;
+ }
+ gst_caps_unref (raw);
+ return FALSE;
+}
+
+/* Returns the number of time a given stream profile is currently used
+ * in encodebin */
+static inline guint
+stream_profile_used_count (GstEncodeBin * ebin, GstEncodingProfile * sprof)
+{
+ guint nbprofused = 0;
+ GList *tmp;
+
+ for (tmp = ebin->streams; tmp; tmp = tmp->next) {
+ StreamGroup *sgroup = (StreamGroup *) tmp->data;
+
+ if (sgroup->profile == sprof)
+ nbprofused++;
+ }
+
+ return nbprofused;
+}
+
+static inline GstEncodingProfile *
+next_unused_stream_profile (GstEncodeBin * ebin, GType ptype, GstCaps * caps)
+{
+ GST_DEBUG_OBJECT (ebin, "ptype:%s, caps:%" GST_PTR_FORMAT,
+ g_type_name (ptype), caps);
+
+ if (G_UNLIKELY (ptype == G_TYPE_NONE && caps != NULL)) {
+ /* Identify the profile type based on raw caps */
+ if (gst_caps_can_intersect (ebin->raw_video_caps, caps))
+ ptype = GST_TYPE_ENCODING_VIDEO_PROFILE;
+ else if (gst_caps_can_intersect (ebin->raw_audio_caps, caps))
+ ptype = GST_TYPE_ENCODING_AUDIO_PROFILE;
+ /* else if (gst_caps_can_intersect (ebin->raw_text_caps, caps)) */
+ /* ptype = GST_TYPE_ENCODING_TEXT_PROFILE; */
+ GST_DEBUG_OBJECT (ebin, "Detected profile type as being %s",
+ g_type_name (ptype));
+ }
+
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (ebin->profile)) {
+ const GList *tmp;
+
+ for (tmp =
+ gst_encoding_container_profile_get_profiles
+ (GST_ENCODING_CONTAINER_PROFILE (ebin->profile)); tmp;
+ tmp = tmp->next) {
+ GstEncodingProfile *sprof = (GstEncodingProfile *) tmp->data;
+
+ /* Pick an available Stream profile for which:
+ * * either it is of the compatibly raw type,
+ * * OR we can pass it through directly without encoding
+ */
+ if (G_TYPE_FROM_INSTANCE (sprof) == ptype) {
+ guint presence = gst_encoding_profile_get_presence (sprof);
+ GST_DEBUG ("Found a stream profile with the same type");
+ if ((presence == 0)
+ || (presence > stream_profile_used_count (ebin, sprof)))
+ return sprof;
+ } else if ((caps != NULL) && (ptype == G_TYPE_NONE)) {
+ GstCaps *outcaps;
+ gboolean res;
+
+ outcaps = gst_encoding_profile_get_input_caps (sprof);
+ GST_DEBUG ("Unknown stream, seeing if it's compatible with %"
+ GST_PTR_FORMAT, outcaps);
+ res = gst_caps_can_intersect (outcaps, caps);
+ gst_caps_unref (outcaps);
+
+ if (res)
+ return sprof;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static GstPad *
+request_pad_for_stream (GstEncodeBin * encodebin, GType ptype,
+ const gchar * name, GstCaps * caps)
+{
+ StreamGroup *sgroup;
+ GstEncodingProfile *sprof;
+
+ GST_DEBUG_OBJECT (encodebin, "name:%s caps:%" GST_PTR_FORMAT, name, caps);
+
+ /* Figure out if we have a unused GstEncodingProfile we can use for
+ * these caps */
+ sprof = next_unused_stream_profile (encodebin, ptype, caps);
+
+ if (G_UNLIKELY (sprof == NULL))
+ goto no_stream_profile;
+
+ sgroup = _create_stream_group (encodebin, sprof, name, caps);
+ if (G_UNLIKELY (sgroup == NULL))
+ goto no_stream_group;
+
+ return sgroup->ghostpad;
+
+no_stream_profile:
+ {
+ GST_WARNING_OBJECT (encodebin, "Couldn't find a compatible stream profile");
+ return NULL;
+ }
+
+no_stream_group:
+ {
+ GST_WARNING_OBJECT (encodebin, "Couldn't create a StreamGroup");
+ return NULL;
+ }
+}
+
+static GstPad *
+gst_encode_bin_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
+{
+ GstEncodeBin *ebin = (GstEncodeBin *) element;
+ GstPad *res = NULL;
+
+ GST_DEBUG_OBJECT (element, "templ:%s, name:%s", templ->name_template, name);
+
+ /* Identify the stream group */
+ if (caps != NULL) {
+ res = request_pad_for_stream (ebin, G_TYPE_NONE, name, (GstCaps *) caps);
+ }
+
+ if (res == NULL) {
+ GType ptype = G_TYPE_NONE;
+
+ if (!strcmp (templ->name_template, "video_%d"))
+ ptype = GST_TYPE_ENCODING_VIDEO_PROFILE;
+ else if (!strcmp (templ->name_template, "audio_%d"))
+ ptype = GST_TYPE_ENCODING_AUDIO_PROFILE;
+ /* else if (!strcmp (templ->name_template, "text_%d")) */
+ /* ptype = GST_TYPE_ENCODING_TEXT_PROFILE; */
+
+ /* FIXME : Check uniqueness of pad */
+ /* FIXME : Check that the requested number is the last one, and if not,
+ * update the last_pad_id variable so that we don't create a pad with
+ * the same name/number in the future */
+
+ res = request_pad_for_stream (ebin, ptype, name, NULL);
+ }
+
+ return res;
+}
+
+static GstPad *
+gst_encode_bin_request_pad_signal (GstEncodeBin * encodebin, GstCaps * caps)
+{
+ GstPad *pad = request_pad_for_stream (encodebin, G_TYPE_NONE, NULL, caps);
+
+ return pad ? GST_PAD_CAST (gst_object_ref (pad)) : NULL;
+}
+
+static inline StreamGroup *
+find_stream_group_from_pad (GstEncodeBin * ebin, GstPad * pad)
+{
+ GList *tmp;
+
+ for (tmp = ebin->streams; tmp; tmp = tmp->next) {
+ StreamGroup *sgroup = (StreamGroup *) tmp->data;
+ if (G_UNLIKELY (sgroup->ghostpad == pad))
+ return sgroup;
+ }
+
+ return NULL;
+}
+
+static void
+gst_encode_bin_release_pad (GstElement * element, GstPad * pad)
+{
+ GstEncodeBin *ebin = (GstEncodeBin *) element;
+ StreamGroup *sgroup;
+
+ /* Find the associated StreamGroup */
+
+ sgroup = find_stream_group_from_pad (ebin, pad);
+ if (G_UNLIKELY (sgroup == NULL))
+ goto no_stream_group;
+
+ /* Release objects/data associated with the StreamGroup */
+ stream_group_remove (ebin, sgroup);
+
+ return;
+
+no_stream_group:
+ {
+ GST_WARNING_OBJECT (ebin, "Couldn't find corresponding StreamGroup");
+ return;
+ }
+}
+
+/* Create a parser for the given stream profile */
+static inline GstElement *
+_get_parser (GstEncodeBin * ebin, GstEncodingProfile * sprof)
+{
+ GList *parsers1, *parsers, *tmp;
+ GstElement *parser = NULL;
+ GstElementFactory *parserfact = NULL;
+ const GstCaps *format;
+
+ format = gst_encoding_profile_get_format (sprof);
+
+ GST_DEBUG ("Getting list of parsers for format %" GST_PTR_FORMAT, format);
+
+ /* FIXME : requesting twice the parsers twice is a bit ugly, we should
+ * have a method to request on more than one condition */
+ parsers1 =
+ gst_element_factory_list_filter (ebin->parsers, format,
+ GST_PAD_SRC, FALSE);
+ parsers =
+ gst_element_factory_list_filter (parsers1, format, GST_PAD_SINK, FALSE);
+ gst_plugin_feature_list_free (parsers1);
+
+ if (G_UNLIKELY (parsers == NULL)) {
+ GST_DEBUG ("Couldn't find any compatible parsers");
+ return NULL;
+ }
+
+ for (tmp = parsers; tmp; tmp = tmp->next) {
+ /* FIXME : We're only picking the first one so far */
+ /* FIXME : signal the user if he wants this */
+ parserfact = (GstElementFactory *) tmp->data;
+ break;
+ }
+
+ if (parserfact)
+ parser = gst_element_factory_create (parserfact, NULL);
+
+ gst_plugin_feature_list_free (parsers);
+
+ return parser;
+}
+
+static GstElement *
+_create_element_and_set_preset (GstElementFactory * factory,
+ const gchar * preset, const gchar * name)
+{
+ GstElement *res = NULL;
+
+ GST_DEBUG ("Creating element from factory %s", GST_OBJECT_NAME (factory));
+ res = gst_element_factory_create (factory, name);
+ if (preset && GST_IS_PRESET (res) &&
+ !gst_preset_load_preset (GST_PRESET (res), preset)) {
+ GST_WARNING ("Couldn't set preset [%s] on element [%s]",
+ preset, GST_OBJECT_NAME (factory));
+ gst_object_unref (res);
+ res = NULL;
+ }
+
+ return res;
+}
+
+/* Create the encoder for the given stream profile */
+static inline GstElement *
+_get_encoder (GstEncodeBin * ebin, GstEncodingProfile * sprof)
+{
+ GList *encoders, *tmp;
+ GstElement *encoder = NULL;
+ GstElementFactory *encoderfact = NULL;
+ const GstCaps *format;
+ const gchar *preset;
+
+ format = gst_encoding_profile_get_format (sprof);
+ preset = gst_encoding_profile_get_preset (sprof);
+
+ GST_DEBUG ("Getting list of encoders for format %" GST_PTR_FORMAT, format);
+
+ /* If stream caps are raw, return identity */
+ if (G_UNLIKELY (are_raw_caps (format))) {
+ GST_DEBUG ("Stream format is raw, returning identity as the encoder");
+ encoder = gst_element_factory_make ("identity", NULL);
+ goto beach;
+ }
+
+ encoders =
+ gst_element_factory_list_filter (ebin->encoders, format,
+ GST_PAD_SRC, FALSE);
+
+ if (G_UNLIKELY (encoders == NULL)) {
+ GST_DEBUG ("Couldn't find any compatible encoders");
+ goto beach;
+ }
+
+ for (tmp = encoders; tmp; tmp = tmp->next) {
+ encoderfact = (GstElementFactory *) tmp->data;
+ if ((encoder = _create_element_and_set_preset (encoderfact, preset, NULL)))
+ break;
+ }
+
+ gst_plugin_feature_list_free (encoders);
+
+beach:
+ return encoder;
+}
+
+static GstPad *
+local_element_request_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * name, const GstCaps * caps)
+{
+ GstPad *newpad = NULL;
+ GstElementClass *oclass;
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->request_new_pad)
+ newpad = (oclass->request_new_pad) (element, templ, name, caps);
+
+ if (newpad)
+ gst_object_ref (newpad);
+
+ return newpad;
+}
+
+static GstPad *
+gst_element_get_pad_from_template (GstElement * element, GstPadTemplate * templ)
+{
+ GstPad *ret = NULL;
+ GstPadPresence presence;
+
+ /* If this function is ever exported, we need check the validity of `element'
+ * and `templ', and to make sure the template actually belongs to the
+ * element. */
+
+ presence = GST_PAD_TEMPLATE_PRESENCE (templ);
+
+ switch (presence) {
+ case GST_PAD_ALWAYS:
+ case GST_PAD_SOMETIMES:
+ ret = gst_element_get_static_pad (element, templ->name_template);
+ if (!ret && presence == GST_PAD_ALWAYS)
+ g_warning
+ ("Element %s has an ALWAYS template %s, but no pad of the same name",
+ GST_OBJECT_NAME (element), templ->name_template);
+ break;
+
+ case GST_PAD_REQUEST:
+ ret = gst_element_request_pad (element, templ, NULL, NULL);
+ break;
+ }
+
+ return ret;
+}
+
+/* FIXME : Improve algorithm for finding compatible muxer sink pad */
+static inline GstPad *
+get_compatible_muxer_sink_pad (GstEncodeBin * ebin, GstElement * encoder,
+ GstCaps * sinkcaps)
+{
+ GstPad *sinkpad;
+ GstPadTemplate *srctempl = NULL;
+ GstPadTemplate *sinktempl;
+
+ if (encoder) {
+ GstPad *srcpad;
+ srcpad = gst_element_get_static_pad (encoder, "src");
+
+ srctempl = gst_pad_get_pad_template (srcpad);
+
+ GST_DEBUG_OBJECT (ebin,
+ "Attempting to find pad from muxer %s compatible with %s:%s",
+ GST_ELEMENT_NAME (ebin->muxer), GST_DEBUG_PAD_NAME (srcpad));
+
+ gst_object_unref (srcpad);
+ sinktempl = gst_element_get_compatible_pad_template (ebin->muxer, srctempl);
+ gst_object_unref (srctempl);
+ } else {
+ srctempl =
+ gst_pad_template_new ("whatever", GST_PAD_SRC, GST_PAD_ALWAYS,
+ sinkcaps);
+ g_assert (srctempl != NULL);
+ sinktempl = gst_element_get_compatible_pad_template (ebin->muxer, srctempl);
+ g_object_unref (srctempl);
+ }
+
+ if (G_UNLIKELY (sinktempl == NULL))
+ goto no_template;
+
+ sinkpad = gst_element_get_pad_from_template (ebin->muxer, sinktempl);
+
+ return sinkpad;
+
+no_template:
+ {
+ GST_WARNING_OBJECT (ebin, "No compatible pad available on muxer");
+ return NULL;
+ }
+}
+
+static gboolean
+_has_class (GstElement * element, const gchar * classname)
+{
+ GstElementClass *klass;
+ const gchar *value;
+
+ klass = GST_ELEMENT_GET_CLASS (element);
+ value = gst_element_class_get_metadata (klass, GST_ELEMENT_METADATA_KLASS);
+
+ return strstr (value, classname) != NULL;
+}
+
+/* FIXME : Add handling of streams that don't need encoding */
+/* FIXME : Add handling of streams that don't require conversion elements */
+/*
+ * Create the elements, StreamGroup, add the sink pad, link it to the muxer
+ *
+ * sinkpadname: If non-NULL, that name will be assigned to the sink ghost pad
+ * sinkcaps: If non-NULL will be used to figure out how to setup the group */
+static StreamGroup *
+_create_stream_group (GstEncodeBin * ebin, GstEncodingProfile * sprof,
+ const gchar * sinkpadname, GstCaps * sinkcaps)
+{
+ StreamGroup *sgroup = NULL;
+ GstPad *sinkpad, *srcpad, *muxerpad = NULL;
+ /* Element we will link to the encoder */
+ GstElement *last = NULL;
+ GList *tmp, *tosync = NULL;
+ GstCaps *format, *restriction;
+ const gchar *missing_element_name;
+
+ format = gst_encoding_profile_get_format (sprof);
+ restriction = gst_encoding_profile_get_restriction (sprof);
+
+ GST_DEBUG ("Creating group. format %" GST_PTR_FORMAT ", for caps %"
+ GST_PTR_FORMAT, format, sinkcaps);
+ GST_DEBUG ("avoid_reencoding:%d", ebin->avoid_reencoding);
+
+ sgroup = g_slice_new0 (StreamGroup);
+ sgroup->ebin = ebin;
+ sgroup->profile = sprof;
+
+ /* NOTE for people reading this code:
+ *
+ * We construct the group starting by the furthest downstream element
+ * and making our way up adding/syncing/linking as we go.
+ *
+ * There are two parallel paths:
+ * * One for raw data which goes through converters and encoders
+ * * One for already encoded data
+ */
+
+ /* Exception to the rule above:
+ * We check if we have an available encoder so we can abort early */
+ /* FIXME : What if we only want to do passthrough ??? */
+ GST_LOG ("Checking for encoder availability");
+ sgroup->encoder = _get_encoder (ebin, sprof);
+ if (G_UNLIKELY (sgroup->encoder == NULL))
+ goto no_encoder;
+
+ /* Muxer.
+ * If we are handling a container profile, figure out if the muxer has a
+ * sinkpad compatible with the selected profile */
+ if (ebin->muxer) {
+ muxerpad = get_compatible_muxer_sink_pad (ebin, NULL, format);
+ if (G_UNLIKELY (muxerpad == NULL))
+ goto no_muxer_pad;
+
+ }
+
+ /* Output Queue.
+ * We only use a 1buffer long queue here, the actual queueing will be done
+ * in the input queue */
+ last = sgroup->outqueue = gst_element_factory_make ("queue", NULL);
+ g_object_set (sgroup->outqueue, "max-size-buffers", (guint32) 1,
+ "max-size-bytes", (guint32) 0, "max-size-time", (guint64) 0,
+ "silent", TRUE, NULL);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->outqueue);
+ tosync = g_list_append (tosync, sgroup->outqueue);
+ srcpad = gst_element_get_static_pad (sgroup->outqueue, "src");
+ if (muxerpad) {
+ if (G_UNLIKELY (fast_pad_link (srcpad, muxerpad) != GST_PAD_LINK_OK)) {
+ goto muxer_link_failure;
+ }
+ gst_object_unref (muxerpad);
+ } else {
+ gst_ghost_pad_set_target (GST_GHOST_PAD (ebin->srcpad), srcpad);
+ }
+ gst_object_unref (srcpad);
+
+ /* Check if we need a formatter
+ * If we have no muxer or
+ * if the muxer isn't a formatter and doesn't implement the tagsetter interface
+ */
+ if (!ebin->muxer || (!GST_IS_TAG_SETTER (ebin->muxer)
+ || !_has_class (ebin->muxer, "Formatter"))) {
+ sgroup->formatter = _get_formatter (ebin, sprof);
+ if (sgroup->formatter) {
+ GST_DEBUG ("Adding formatter for %" GST_PTR_FORMAT, format);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->formatter);
+ tosync = g_list_append (tosync, sgroup->formatter);
+ if (G_UNLIKELY (!fast_element_link (sgroup->formatter, last)))
+ goto formatter_link_failure;
+ last = sgroup->formatter;
+ }
+ }
+
+
+ /* Output capsfilter
+ * This will receive the format caps from the streamprofile */
+ GST_DEBUG ("Adding output capsfilter for %" GST_PTR_FORMAT, format);
+ sgroup->outfilter = gst_element_factory_make ("capsfilter", NULL);
+ g_object_set (sgroup->outfilter, "caps", format, NULL);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->outfilter);
+ tosync = g_list_append (tosync, sgroup->outfilter);
+ if (G_UNLIKELY (!fast_element_link (sgroup->outfilter, last)))
+ goto outfilter_link_failure;
+ last = sgroup->outfilter;
+
+
+ /* FIXME :
+ *
+ * The usage of parsers in encoding/muxing scenarios is
+ * just too undefined to just use as-is.
+ *
+ * Take the use-case where you want to re-mux a stream of type
+ * "my/media". You create a StreamEncodingProfile with that type
+ * as the target (as-is). And you use decodebin2/uridecodebin
+ * upstream.
+ *
+ * * demuxer exposes "my/media"
+ * * a parser is available for "my/media" which has a source pad
+ * caps of "my/media,parsed=True"
+ * * decodebin2/uridecodebin exposes a new pad with the parsed caps
+ * * You request a new stream from encodebin, which will match the
+ * streamprofile and creates a group (i.e. going through this method)
+ * There is a matching parser (the same used in the decoder) whose
+ * source pad caps intersects with the stream profile caps, you
+ * therefore use it...
+ * * ... but that parser has a "my/media,parsed=False" sink pad caps
+ * * ... and you can't link your decodebin pad to encodebin.
+ *
+ * In the end, it comes down to parsers only taking into account the
+ * decoding use-cases.
+ *
+ * One way to solve that might be to :
+ * * Make parsers sink pad caps be "framed={False,True}" and the
+ * source pad caps be "framed=True"
+ * * Modify decodebin2 accordingly to avoid looping and chaining
+ * an infinite number of parsers
+ *
+ * Another way would be to have "well-known" caps properties to specify
+ * whether a stream has been parsed or not.
+ * * currently we fail. aacparse uses 'framed' and mp3parse uses 'parsed'
+ */
+ /* FIXME : Re-enable once parser situation is un-$#*@(%$#ed */
+#if 0
+ /* Parser.
+ * FIXME : identify smart parsers (used for re-encoding) */
+ sgroup->parser = _get_parser (ebin, sprof);
+
+ if (sgroup->parser != NULL) {
+ GST_DEBUG ("Got a parser %s", GST_ELEMENT_NAME (sgroup->parser));
+ gst_bin_add (GST_BIN (ebin), sgroup->parser);
+ tosync = g_list_append (tosync, sgroup->parser);
+ if (G_UNLIKELY (!gst_element_link (sgroup->parser, last)))
+ goto parser_link_failure;
+ last = sgroup->parser;
+ }
+#endif
+
+ /* Stream combiner */
+ sgroup->combiner = g_object_new (GST_TYPE_STREAM_COMBINER, NULL);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->combiner);
+ tosync = g_list_append (tosync, sgroup->combiner);
+ if (G_UNLIKELY (!fast_element_link (sgroup->combiner, last)))
+ goto combiner_link_failure;
+
+
+ /* Stream splitter */
+ sgroup->splitter = g_object_new (GST_TYPE_STREAM_SPLITTER, NULL);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->splitter);
+ tosync = g_list_append (tosync, sgroup->splitter);
+
+ /* Input queue
+ * FIXME : figure out what max-size to use for the input queue */
+ sgroup->inqueue = gst_element_factory_make ("queue", NULL);
+ g_object_set (sgroup->inqueue, "max-size-buffers",
+ (guint32) ebin->queue_buffers_max, "max-size-bytes",
+ (guint32) ebin->queue_bytes_max, "max-size-time",
+ (guint64) ebin->queue_time_max, "silent", TRUE, NULL);
+
+ gst_bin_add (GST_BIN (ebin), sgroup->inqueue);
+ tosync = g_list_append (tosync, sgroup->inqueue);
+ if (G_UNLIKELY (!fast_element_link (sgroup->inqueue, sgroup->splitter)))
+ goto splitter_link_failure;
+
+ /* Expose input queue sink pad as ghostpad */
+ sinkpad = gst_element_get_static_pad (sgroup->inqueue, "sink");
+ if (sinkpadname == NULL) {
+ gchar *pname =
+ g_strdup_printf ("%s_%d", gst_encoding_profile_get_type_nick (sprof),
+ ebin->last_pad_id++);
+ GST_DEBUG ("Adding ghost pad %s", pname);
+ sgroup->ghostpad = gst_ghost_pad_new (pname, sinkpad);
+ g_free (pname);
+ } else
+ sgroup->ghostpad = gst_ghost_pad_new (sinkpadname, sinkpad);
+ gst_object_unref (sinkpad);
+
+
+ /* Path 1 : Already-encoded data */
+ sinkpad =
+ local_element_request_pad (sgroup->combiner, NULL, "passthroughsink",
+ NULL);
+ if (G_UNLIKELY (sinkpad == NULL))
+ goto no_combiner_sinkpad;
+
+ if (ebin->avoid_reencoding) {
+ GstCaps *tmpcaps;
+
+ GST_DEBUG ("Asked to use Smart Encoder");
+ sgroup->smartencoder = g_object_new (GST_TYPE_SMART_ENCODER, NULL);
+
+ /* Check if stream format is compatible */
+ srcpad = gst_element_get_static_pad (sgroup->smartencoder, "src");
+ tmpcaps = gst_pad_get_caps (srcpad, NULL);
+ if (!gst_caps_can_intersect (tmpcaps, format)) {
+ GST_DEBUG ("We don't have a smart encoder for the stream format");
+ gst_object_unref (sgroup->smartencoder);
+ sgroup->smartencoder = NULL;
+ } else {
+ gst_bin_add ((GstBin *) ebin, sgroup->smartencoder);
+ fast_pad_link (srcpad, sinkpad);
+ tosync = g_list_append (tosync, sgroup->smartencoder);
+ sinkpad = gst_element_get_static_pad (sgroup->smartencoder, "sink");
+ }
+ gst_caps_unref (tmpcaps);
+ g_object_unref (srcpad);
+ }
+
+ srcpad =
+ local_element_request_pad (sgroup->splitter, NULL, "passthroughsrc",
+ NULL);
+ if (G_UNLIKELY (srcpad == NULL))
+ goto no_splitter_srcpad;
+
+ /* Go straight to splitter */
+ if (G_UNLIKELY (fast_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK))
+ goto passthrough_link_failure;
+ g_object_unref (sinkpad);
+ g_object_unref (srcpad);
+
+
+ /* Path 2 : Conversion / Encoding */
+
+ /* 1. Create the encoder */
+ GST_LOG ("Adding encoder");
+ last = sgroup->encoder;
+ gst_bin_add ((GstBin *) ebin, sgroup->encoder);
+ tosync = g_list_append (tosync, sgroup->encoder);
+
+ sinkpad =
+ local_element_request_pad (sgroup->combiner, NULL, "encodingsink", NULL);
+ if (G_UNLIKELY (sinkpad == NULL))
+ goto no_combiner_sinkpad;
+ srcpad = gst_element_get_static_pad (sgroup->encoder, "src");
+ if (G_UNLIKELY (fast_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK))
+ goto encoder_link_failure;
+ g_object_unref (sinkpad);
+ g_object_unref (srcpad);
+
+
+ /* 3. Create the conversion/restriction elements */
+ /* 3.1. capsfilter */
+ if (restriction && !gst_caps_is_any (restriction)) {
+ GST_LOG ("Adding capsfilter for restriction caps : %" GST_PTR_FORMAT,
+ restriction);
+
+ last = sgroup->capsfilter = gst_element_factory_make ("capsfilter", NULL);
+ g_object_set (sgroup->capsfilter, "caps", restriction, NULL);
+ gst_bin_add ((GstBin *) ebin, sgroup->capsfilter);
+ tosync = g_list_append (tosync, sgroup->capsfilter);
+ fast_element_link (sgroup->capsfilter, sgroup->encoder);
+ }
+
+ /* 3.2. restriction elements */
+ /* FIXME : Once we have properties for specific converters, use those */
+ if (GST_IS_ENCODING_VIDEO_PROFILE (sprof)) {
+ const gboolean native_video =
+ !!(ebin->flags & GST_ENC_FLAG_NO_VIDEO_CONVERSION);
+ GstElement *cspace = NULL, *scale, *vrate, *cspace2 = NULL;
+
+ GST_LOG ("Adding conversion elements for video stream");
+
+ if (!native_video) {
+ cspace = gst_element_factory_make ("videoconvert", NULL);
+ scale = gst_element_factory_make ("videoscale", NULL);
+ if (!scale) {
+ missing_element_name = "videoscale";
+ goto missing_element;
+ }
+ /* 4-tap scaling and black borders */
+ g_object_set (scale, "method", 2, "add-borders", TRUE, NULL);
+ cspace2 = gst_element_factory_make ("videoconvert", NULL);
+
+ if (!cspace || !cspace2) {
+ missing_element_name = "videoconvert";
+ goto missing_element;
+ }
+
+ gst_bin_add_many ((GstBin *) ebin, cspace, scale, cspace2, NULL);
+ tosync = g_list_append (tosync, cspace);
+ tosync = g_list_append (tosync, scale);
+ tosync = g_list_append (tosync, cspace2);
+
+ sgroup->converters = g_list_prepend (sgroup->converters, cspace);
+ sgroup->converters = g_list_prepend (sgroup->converters, scale);
+ sgroup->converters = g_list_prepend (sgroup->converters, cspace2);
+
+ if (!fast_element_link (cspace, scale) ||
+ !fast_element_link (scale, cspace2))
+ goto converter_link_failure;
+ }
+
+ if (!gst_encoding_video_profile_get_variableframerate
+ (GST_ENCODING_VIDEO_PROFILE (sprof))) {
+ vrate = gst_element_factory_make ("videorate", NULL);
+ if (!vrate) {
+ missing_element_name = "videorate";
+ goto missing_element;
+ }
+
+ gst_bin_add ((GstBin *) ebin, vrate);
+ tosync = g_list_prepend (tosync, vrate);
+ sgroup->converters = g_list_prepend (sgroup->converters, vrate);
+
+ if ((!native_video && !fast_element_link (cspace2, vrate))
+ || !fast_element_link (vrate, last))
+ goto converter_link_failure;
+
+ if (!native_video)
+ last = cspace;
+ else
+ last = vrate;
+ } else if (!native_video) {
+ if (!fast_element_link (cspace2, last))
+ goto converter_link_failure;
+ last = cspace;
+ }
+
+ } else if (GST_IS_ENCODING_AUDIO_PROFILE (sprof)
+ && !(ebin->flags & GST_ENC_FLAG_NO_AUDIO_CONVERSION)) {
+ GstElement *aconv, *ares, *arate, *aconv2;
+
+ GST_LOG ("Adding conversion elements for audio stream");
+
+ arate = gst_element_factory_make ("audiorate", NULL);
+ g_object_set (arate, "tolerance", (guint64) ebin->tolerance, NULL);
+ if (!arate) {
+ missing_element_name = "audiorate";
+ goto missing_element;
+ }
+ aconv = gst_element_factory_make ("audioconvert", NULL);
+ aconv2 = gst_element_factory_make ("audioconvert", NULL);
+ ares = gst_element_factory_make ("audioresample", NULL);
+ if (!aconv || !aconv2) {
+ missing_element_name = "audioconvert";
+ goto missing_element;
+ }
+ if (!ares) {
+ missing_element_name = "audioresample";
+ goto missing_element;
+ }
+
+ gst_bin_add_many ((GstBin *) ebin, arate, aconv, ares, aconv2, NULL);
+ tosync = g_list_append (tosync, arate);
+ tosync = g_list_append (tosync, aconv);
+ tosync = g_list_append (tosync, ares);
+ tosync = g_list_append (tosync, aconv2);
+ if (!fast_element_link (arate, aconv) ||
+ !fast_element_link (aconv, ares) ||
+ !fast_element_link (ares, aconv2) || !fast_element_link (aconv2, last))
+ goto converter_link_failure;
+
+ sgroup->converters = g_list_prepend (sgroup->converters, arate);
+ sgroup->converters = g_list_prepend (sgroup->converters, aconv);
+ sgroup->converters = g_list_prepend (sgroup->converters, ares);
+ sgroup->converters = g_list_prepend (sgroup->converters, aconv2);
+
+ last = arate;
+ }
+
+ /* Link to stream splitter */
+ sinkpad = gst_element_get_static_pad (last, "sink");
+ srcpad =
+ local_element_request_pad (sgroup->splitter, NULL, "encodingsrc", NULL);
+ if (G_UNLIKELY (srcpad == NULL))
+ goto no_splitter_srcpad;
+ if (G_UNLIKELY (fast_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK))
+ goto splitter_encoding_failure;
+ g_object_unref (sinkpad);
+ g_object_unref (srcpad);
+
+ /* End of Stream 2 setup */
+
+ /* Sync all elements to parent state */
+ for (tmp = tosync; tmp; tmp = tmp->next)
+ gst_element_sync_state_with_parent ((GstElement *) tmp->data);
+ g_list_free (tosync);
+
+ /* Add ghostpad */
+ GST_DEBUG ("Adding ghostpad %s:%s", GST_DEBUG_PAD_NAME (sgroup->ghostpad));
+ gst_pad_set_active (sgroup->ghostpad, TRUE);
+ gst_element_add_pad ((GstElement *) ebin, sgroup->ghostpad);
+
+ /* Add StreamGroup to our list of streams */
+
+ GST_DEBUG
+ ("Done creating elements, adding StreamGroup to our controlled stream list");
+
+ ebin->streams = g_list_prepend (ebin->streams, sgroup);
+
+ if (format)
+ gst_caps_unref (format);
+ if (restriction)
+ gst_caps_unref (restriction);
+
+ return sgroup;
+
+splitter_encoding_failure:
+ GST_ERROR_OBJECT (ebin, "Error linking splitter to encoding stream");
+ goto cleanup;
+
+no_encoder:
+ GST_ERROR_OBJECT (ebin, "Couldn't create encoder for format %" GST_PTR_FORMAT,
+ format);
+ /* missing plugin support */
+ gst_element_post_message (GST_ELEMENT_CAST (ebin),
+ gst_missing_encoder_message_new (GST_ELEMENT_CAST (ebin), format));
+ GST_ELEMENT_ERROR (ebin, CORE, MISSING_PLUGIN, (NULL),
+ ("Couldn't create encoder for format %" GST_PTR_FORMAT, format));
+ goto cleanup;
+
+no_muxer_pad:
+ GST_ERROR_OBJECT (ebin,
+ "Couldn't find a compatible muxer pad to link encoder to");
+ goto cleanup;
+
+missing_element:
+ gst_element_post_message (GST_ELEMENT_CAST (ebin),
+ gst_missing_element_message_new (GST_ELEMENT_CAST (ebin),
+ missing_element_name));
+ GST_ELEMENT_ERROR (ebin, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ missing_element_name), (NULL));
+ goto cleanup;
+
+encoder_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failed to link the encoder");
+ goto cleanup;
+
+muxer_link_failure:
+ GST_ERROR_OBJECT (ebin, "Couldn't link encoder to muxer");
+ goto cleanup;
+
+formatter_link_failure:
+ GST_ERROR_OBJECT (ebin, "Couldn't link output filter to output queue");
+ goto cleanup;
+
+outfilter_link_failure:
+ GST_ERROR_OBJECT (ebin,
+ "Couldn't link output filter to output queue/formatter");
+ goto cleanup;
+
+passthrough_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failed linking splitter in passthrough mode");
+ goto cleanup;
+
+no_splitter_srcpad:
+ GST_ERROR_OBJECT (ebin, "Couldn't get a source pad from the splitter");
+ goto cleanup;
+
+no_combiner_sinkpad:
+ GST_ERROR_OBJECT (ebin, "Couldn't get a sink pad from the combiner");
+ goto cleanup;
+
+splitter_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failure linking to the splitter");
+ goto cleanup;
+
+combiner_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failure linking to the combiner");
+ goto cleanup;
+
+#if 0
+parser_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failure linking the parser");
+ goto cleanup;
+#endif
+
+converter_link_failure:
+ GST_ERROR_OBJECT (ebin, "Failure linking the video converters");
+ goto cleanup;
+
+cleanup:
+ /* FIXME : Actually properly cleanup everything */
+ if (format)
+ gst_caps_unref (format);
+ if (restriction)
+ gst_caps_unref (restriction);
+ g_slice_free (StreamGroup, sgroup);
+ return NULL;
+}
+
+static gboolean
+_gst_caps_match_foreach (GQuark field_id, const GValue * value, gpointer data)
+{
+ GstStructure *structure = data;
+ const GValue *other_value = gst_structure_id_get_value (structure, field_id);
+
+ if (G_UNLIKELY (other_value == NULL))
+ return FALSE;
+ if (gst_value_compare (value, other_value) == GST_VALUE_EQUAL) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * checks that there is at least one structure on caps_a that has
+ * all its fields exactly the same as one structure on caps_b
+ */
+static gboolean
+_gst_caps_match (const GstCaps * caps_a, const GstCaps * caps_b)
+{
+ gint i, j;
+ gboolean res = FALSE;
+
+ for (i = 0; i < gst_caps_get_size (caps_a); i++) {
+ GstStructure *structure_a = gst_caps_get_structure (caps_a, i);
+ for (j = 0; j < gst_caps_get_size (caps_b); j++) {
+ GstStructure *structure_b = gst_caps_get_structure (caps_b, j);
+
+ res = gst_structure_foreach (structure_a, _gst_caps_match_foreach,
+ structure_b);
+ if (res)
+ goto end;
+ }
+ }
+end:
+ return res;
+}
+
+static gboolean
+_factory_can_handle_caps (GstElementFactory * factory, const GstCaps * caps,
+ GstPadDirection dir, gboolean exact)
+{
+ GList *templates = factory->staticpadtemplates;
+
+ while (templates) {
+ GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
+
+ if (template->direction == dir) {
+ GstCaps *tmp = gst_static_caps_get (&template->static_caps);
+
+ if ((exact && _gst_caps_match (caps, tmp)) ||
+ (!exact && gst_caps_can_intersect (tmp, caps))) {
+ gst_caps_unref (tmp);
+ return TRUE;
+ }
+ gst_caps_unref (tmp);
+ }
+ templates = g_list_next (templates);
+ }
+
+ return FALSE;
+}
+
+static inline GstElement *
+_get_formatter (GstEncodeBin * ebin, GstEncodingProfile * sprof)
+{
+ GList *formatters, *tmpfmtr;
+ GstElement *formatter = NULL;
+ GstElementFactory *formatterfact = NULL;
+ const GstCaps *format;
+ const gchar *preset;
+
+ format = gst_encoding_profile_get_format (sprof);
+ preset = gst_encoding_profile_get_preset (sprof);
+
+ GST_DEBUG ("Getting list of formatters for format %" GST_PTR_FORMAT, format);
+
+ formatters =
+ gst_element_factory_list_filter (ebin->formatters, format, GST_PAD_SRC,
+ FALSE);
+
+ if (formatters == NULL)
+ goto beach;
+
+ /* FIXME : signal the user if he wants this */
+ for (tmpfmtr = formatters; tmpfmtr; tmpfmtr = tmpfmtr->next) {
+ formatterfact = (GstElementFactory *) tmpfmtr->data;
+
+ GST_DEBUG_OBJECT (ebin, "Trying formatter %s",
+ GST_OBJECT_NAME (formatterfact));
+
+ if ((formatter =
+ _create_element_and_set_preset (formatterfact, preset, NULL)))
+ break;
+ }
+
+ gst_plugin_feature_list_free (formatters);
+
+beach:
+ return formatter;
+}
+
+static gint
+compare_elements (gconstpointer a, gconstpointer b, gpointer udata)
+{
+ GstCaps *caps = udata;
+ GstElementFactory *fac_a = (GstElementFactory *) a;
+ GstElementFactory *fac_b = (GstElementFactory *) b;
+
+ /* FIXME not quite sure this is the best algorithm to order the elements
+ * Some caps similarity comparison algorithm would fit better than going
+ * boolean (equals/not equals).
+ */
+ gboolean equals_a = _factory_can_handle_caps (fac_a, caps, GST_PAD_SRC, TRUE);
+ gboolean equals_b = _factory_can_handle_caps (fac_b, caps, GST_PAD_SRC, TRUE);
+
+ if (equals_a == equals_b) {
+ return gst_plugin_feature_get_rank ((GstPluginFeature *) fac_b) -
+ gst_plugin_feature_get_rank ((GstPluginFeature *) fac_a);
+ } else if (equals_a) {
+ return -1;
+ } else if (equals_b) {
+ return 1;
+ }
+ return 0;
+}
+
+static inline GstElement *
+_get_muxer (GstEncodeBin * ebin)
+{
+ GList *muxers, *formatters, *tmpmux;
+ GstElement *muxer = NULL;
+ GstElementFactory *muxerfact = NULL;
+ const GList *tmp;
+ const GstCaps *format;
+ const gchar *preset;
+
+ format = gst_encoding_profile_get_format (ebin->profile);
+ preset = gst_encoding_profile_get_preset (ebin->profile);
+
+ GST_DEBUG ("Getting list of muxers for format %" GST_PTR_FORMAT, format);
+
+ muxers =
+ gst_element_factory_list_filter (ebin->muxers, format, GST_PAD_SRC, TRUE);
+
+ formatters =
+ gst_element_factory_list_filter (ebin->formatters, format, GST_PAD_SRC,
+ TRUE);
+
+ muxers = g_list_sort_with_data (muxers, compare_elements, (gpointer) format);
+ formatters =
+ g_list_sort_with_data (formatters, compare_elements, (gpointer) format);
+
+ muxers = g_list_concat (muxers, formatters);
+
+ if (muxers == NULL)
+ goto beach;
+
+ /* FIXME : signal the user if he wants this */
+ for (tmpmux = muxers; tmpmux; tmpmux = tmpmux->next) {
+ gboolean cansinkstreams = TRUE;
+ const GList *profiles =
+ gst_encoding_container_profile_get_profiles
+ (GST_ENCODING_CONTAINER_PROFILE (ebin->profile));
+
+ muxerfact = (GstElementFactory *) tmpmux->data;
+
+ GST_DEBUG ("Trying muxer %s", GST_OBJECT_NAME (muxerfact));
+
+ /* See if the muxer can sink all of our stream profile caps */
+ for (tmp = profiles; tmp; tmp = tmp->next) {
+ GstEncodingProfile *sprof = (GstEncodingProfile *) tmp->data;
+
+ if (!_factory_can_handle_caps (muxerfact,
+ gst_encoding_profile_get_format (sprof), GST_PAD_SINK, FALSE)) {
+ GST_DEBUG ("Skipping muxer because it can't sink caps %"
+ GST_PTR_FORMAT, gst_encoding_profile_get_format (sprof));
+ cansinkstreams = FALSE;
+ break;
+ }
+ }
+
+ /* Only use a muxer than can use all streams and than can accept the
+ * preset (which may be present or not) */
+ if (cansinkstreams && (muxer =
+ _create_element_and_set_preset (muxerfact, preset, "muxer")))
+ break;
+ }
+
+ gst_plugin_feature_list_free (muxers);
+
+beach:
+ return muxer;
+}
+
+static gboolean
+create_elements_and_pads (GstEncodeBin * ebin)
+{
+ gboolean ret = TRUE;
+ GstElement *muxer = NULL;
+ GstPad *muxerpad;
+ const GList *tmp, *profiles;
+ GstEncodingProfile *sprof;
+
+ GST_DEBUG ("Current profile : %s",
+ gst_encoding_profile_get_name (ebin->profile));
+
+ if (GST_IS_ENCODING_CONTAINER_PROFILE (ebin->profile)) {
+ /* 1. Get the compatible muxer */
+ muxer = _get_muxer (ebin);
+ if (G_UNLIKELY (muxer == NULL))
+ goto no_muxer;
+
+ /* Record the muxer */
+ ebin->muxer = muxer;
+ gst_bin_add ((GstBin *) ebin, muxer);
+
+ /* 2. Ghost the muxer source pad */
+
+ /* FIXME : We should figure out if it's a static/request/dyamic pad,
+ * but for the time being let's assume it's a static pad :) */
+ muxerpad = gst_element_get_static_pad (muxer, "src");
+ if (G_UNLIKELY (muxerpad == NULL))
+ goto no_muxer_pad;
+
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD (ebin->srcpad), muxerpad))
+ goto no_muxer_ghost_pad;
+
+ gst_object_unref (muxerpad);
+ /* 3. Activate fixed presence streams */
+ profiles =
+ gst_encoding_container_profile_get_profiles
+ (GST_ENCODING_CONTAINER_PROFILE (ebin->profile));
+ for (tmp = profiles; tmp; tmp = tmp->next) {
+ sprof = (GstEncodingProfile *) tmp->data;
+
+ GST_DEBUG ("Trying stream profile with presence %d",
+ gst_encoding_profile_get_presence (sprof));
+
+ if (gst_encoding_profile_get_presence (sprof) != 0) {
+ if (G_UNLIKELY (_create_stream_group (ebin, sprof, NULL, NULL) == NULL))
+ goto stream_error;
+ }
+ }
+ } else {
+ if (G_UNLIKELY (_create_stream_group (ebin, ebin->profile, NULL,
+ NULL) == NULL))
+ goto stream_error;
+ }
+
+ return ret;
+
+no_muxer:
+ {
+ GST_WARNING ("No available muxer for %" GST_PTR_FORMAT,
+ gst_encoding_profile_get_format (ebin->profile));
+ /* missing plugin support */
+ gst_element_post_message (GST_ELEMENT_CAST (ebin),
+ gst_missing_encoder_message_new (GST_ELEMENT_CAST (ebin),
+ gst_encoding_profile_get_format (ebin->profile)));
+ GST_ELEMENT_ERROR (ebin, CORE, MISSING_PLUGIN, (NULL),
+ ("No available muxer for format %" GST_PTR_FORMAT,
+ gst_encoding_profile_get_format (ebin->profile)));
+ return FALSE;
+ }
+
+no_muxer_pad:
+ {
+ GST_WARNING ("Can't get source pad from muxer (%s)",
+ GST_ELEMENT_NAME (muxer));
+ gst_bin_remove (GST_BIN (ebin), muxer);
+ return FALSE;
+ }
+
+no_muxer_ghost_pad:
+ {
+ GST_WARNING ("Couldn't set %s:%s as source ghostpad target",
+ GST_DEBUG_PAD_NAME (muxerpad));
+ gst_bin_remove (GST_BIN (ebin), muxer);
+ gst_object_unref (muxerpad);
+ return FALSE;
+ }
+
+stream_error:
+ {
+ GST_WARNING ("Could not create Streams");
+ if (muxer)
+ gst_bin_remove (GST_BIN (ebin), muxer);
+ ebin->muxer = NULL;
+ return FALSE;
+ }
+}
+
+static void
+release_pads (const GValue * item, GstElement * elt)
+{
+ GstPad *pad = g_value_get_object (item);
+ GstPad *peer = NULL;
+
+ GST_DEBUG_OBJECT (elt, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ /* Unlink from its peer pad */
+ if ((peer = gst_pad_get_peer (pad))) {
+ if (GST_PAD_DIRECTION (peer) == GST_PAD_SRC)
+ gst_pad_unlink (peer, pad);
+ else
+ gst_pad_unlink (pad, peer);
+ gst_object_unref (peer);
+ }
+
+ /* Release it from the object */
+ gst_element_release_request_pad (elt, pad);
+}
+
+static void inline
+stream_group_free (GstEncodeBin * ebin, StreamGroup * sgroup)
+{
+ GList *tmp;
+ GstPad *tmppad;
+ GstPad *pad;
+
+ GST_DEBUG_OBJECT (ebin, "Freeing StreamGroup %p", sgroup);
+
+ if (ebin->muxer) {
+ /* outqueue - Muxer */
+ tmppad = gst_element_get_static_pad (sgroup->outqueue, "src");
+ pad = gst_pad_get_peer (tmppad);
+
+ /* Remove muxer request sink pad */
+ gst_pad_unlink (tmppad, pad);
+ gst_element_release_request_pad (ebin->muxer, pad);
+ gst_object_unref (tmppad);
+ gst_object_unref (pad);
+ }
+ if (sgroup->outqueue)
+ gst_element_set_state (sgroup->outqueue, GST_STATE_NULL);
+
+ if (sgroup->formatter) {
+ /* capsfilter - formatter - outqueue */
+ gst_element_set_state (sgroup->formatter, GST_STATE_NULL);
+ gst_element_set_state (sgroup->outfilter, GST_STATE_NULL);
+ gst_element_unlink (sgroup->formatter, sgroup->outqueue);
+ gst_element_unlink (sgroup->outfilter, sgroup->formatter);
+ } else {
+ /* Capsfilter - outqueue */
+ gst_element_set_state (sgroup->outfilter, GST_STATE_NULL);
+ gst_element_unlink (sgroup->outfilter, sgroup->outqueue);
+ }
+ gst_element_set_state (sgroup->outqueue, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN (ebin), sgroup->outqueue);
+
+ /* streamcombiner - parser - capsfilter */
+ if (sgroup->parser) {
+ gst_element_set_state (sgroup->parser, GST_STATE_NULL);
+ gst_element_unlink (sgroup->parser, sgroup->outfilter);
+ gst_element_unlink (sgroup->combiner, sgroup->parser);
+ gst_bin_remove ((GstBin *) ebin, sgroup->parser);
+ }
+
+ /* Sink Ghostpad */
+ if (sgroup->ghostpad)
+ gst_element_remove_pad (GST_ELEMENT_CAST (ebin), sgroup->ghostpad);
+
+ if (sgroup->inqueue)
+ gst_element_set_state (sgroup->inqueue, GST_STATE_NULL);
+
+ if (sgroup->encoder)
+ gst_element_set_state (sgroup->encoder, GST_STATE_NULL);
+ if (sgroup->outfilter)
+ gst_element_set_state (sgroup->outfilter, GST_STATE_NULL);
+ if (sgroup->smartencoder)
+ gst_element_set_state (sgroup->smartencoder, GST_STATE_NULL);
+
+ if (sgroup->capsfilter) {
+ gst_element_set_state (sgroup->capsfilter, GST_STATE_NULL);
+ gst_element_unlink (sgroup->capsfilter, sgroup->encoder);
+ gst_bin_remove ((GstBin *) ebin, sgroup->capsfilter);
+ }
+
+ for (tmp = sgroup->converters; tmp; tmp = tmp->next) {
+ GstElement *elt = (GstElement *) tmp->data;
+
+ gst_element_set_state (elt, GST_STATE_NULL);
+ gst_bin_remove ((GstBin *) ebin, elt);
+ }
+ if (sgroup->converters)
+ g_list_free (sgroup->converters);
+
+ if (sgroup->combiner) {
+ GstIterator *it = gst_element_iterate_sink_pads (sgroup->combiner);
+ GstIteratorResult itret = GST_ITERATOR_OK;
+
+ while (itret == GST_ITERATOR_OK || itret == GST_ITERATOR_RESYNC) {
+ itret =
+ gst_iterator_foreach (it, (GstIteratorForeachFunction) release_pads,
+ sgroup->combiner);
+ gst_iterator_resync (it);
+ }
+ gst_iterator_free (it);
+ gst_element_set_state (sgroup->combiner, GST_STATE_NULL);
+ gst_bin_remove ((GstBin *) ebin, sgroup->combiner);
+ }
+
+ if (sgroup->splitter) {
+ GstIterator *it = gst_element_iterate_src_pads (sgroup->splitter);
+ GstIteratorResult itret = GST_ITERATOR_OK;
+ while (itret == GST_ITERATOR_OK || itret == GST_ITERATOR_RESYNC) {
+ itret =
+ gst_iterator_foreach (it, (GstIteratorForeachFunction) release_pads,
+ sgroup->splitter);
+ gst_iterator_resync (it);
+ }
+ gst_iterator_free (it);
+
+ gst_element_set_state (sgroup->splitter, GST_STATE_NULL);
+ gst_bin_remove ((GstBin *) ebin, sgroup->splitter);
+ }
+
+ if (sgroup->inqueue)
+ gst_bin_remove ((GstBin *) ebin, sgroup->inqueue);
+
+ if (sgroup->encoder)
+ gst_bin_remove ((GstBin *) ebin, sgroup->encoder);
+
+ if (sgroup->smartencoder)
+ gst_bin_remove ((GstBin *) ebin, sgroup->smartencoder);
+
+ if (sgroup->outfilter)
+ gst_bin_remove ((GstBin *) ebin, sgroup->outfilter);
+
+ g_slice_free (StreamGroup, sgroup);
+}
+
+static void
+stream_group_remove (GstEncodeBin * ebin, StreamGroup * sgroup)
+{
+ ebin->streams = g_list_remove (ebin->streams, sgroup);
+
+ stream_group_free (ebin, sgroup);
+}
+
+static void
+gst_encode_bin_tear_down_profile (GstEncodeBin * ebin)
+{
+ if (G_UNLIKELY (ebin->profile == NULL))
+ return;
+
+ GST_DEBUG ("Tearing down profile %s",
+ gst_encoding_profile_get_name (ebin->profile));
+
+ while (ebin->streams)
+ stream_group_remove (ebin, (StreamGroup *) ebin->streams->data);
+
+ /* Set ghostpad target to NULL */
+ gst_ghost_pad_set_target (GST_GHOST_PAD (ebin->srcpad), NULL);
+
+ /* Remove muxer if present */
+ if (ebin->muxer) {
+ gst_element_set_state (ebin->muxer, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN (ebin), ebin->muxer);
+ ebin->muxer = NULL;
+ }
+
+ /* free/clear profile */
+ gst_encoding_profile_unref (ebin->profile);
+ ebin->profile = NULL;
+}
+
+static gboolean
+gst_encode_bin_setup_profile (GstEncodeBin * ebin, GstEncodingProfile * profile)
+{
+ gboolean res;
+
+ g_return_val_if_fail (ebin->profile == NULL, FALSE);
+
+ GST_DEBUG ("Setting up profile %s (type:%s)",
+ gst_encoding_profile_get_name (profile),
+ gst_encoding_profile_get_type_nick (profile));
+
+ ebin->profile = profile;
+ gst_mini_object_ref ((GstMiniObject *) ebin->profile);
+
+ /* Create elements */
+ res = create_elements_and_pads (ebin);
+ if (res == FALSE)
+ gst_encode_bin_tear_down_profile (ebin);
+
+ return res;
+}
+
+static gboolean
+gst_encode_bin_set_profile (GstEncodeBin * ebin, GstEncodingProfile * profile)
+{
+ g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE);
+
+ GST_DEBUG_OBJECT (ebin, "profile : %s",
+ gst_encoding_profile_get_name (profile));
+
+ if (G_UNLIKELY (ebin->active)) {
+ GST_WARNING_OBJECT (ebin, "Element already active, can't change profile");
+ return FALSE;
+ }
+
+ /* If we're not active, we can deactivate the previous profile */
+ if (ebin->profile) {
+ gst_encode_bin_tear_down_profile (ebin);
+ }
+
+ return gst_encode_bin_setup_profile (ebin, profile);
+}
+
+static inline gboolean
+gst_encode_bin_activate (GstEncodeBin * ebin)
+{
+ ebin->active = ebin->profile != NULL;
+ return ebin->active;
+}
+
+static void
+gst_encode_bin_deactivate (GstEncodeBin * ebin)
+{
+ ebin->active = FALSE;
+}
+
+static GstStateChangeReturn
+gst_encode_bin_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstEncodeBin *ebin = (GstEncodeBin *) element;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ if (!gst_encode_bin_activate (ebin)) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto beach;
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret =
+ GST_ELEMENT_CLASS (gst_encode_bin_parent_class)->change_state (element,
+ transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto beach;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_encode_bin_deactivate (ebin);
+ break;
+ default:
+ break;
+ }
+
+beach:
+ return ret;
+}
+
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gboolean res;
+
+ GST_DEBUG_CATEGORY_INIT (gst_encode_bin_debug, "encodebin", 0, "encoder bin");
+
+#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 */
+
+
+ res = gst_element_register (plugin, "encodebin", GST_RANK_NONE,
+ GST_TYPE_ENCODE_BIN);
+
+ return res;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "encoding",
+ "various encoding-related elements", plugin_init, VERSION, GST_LICENSE,
+ GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/encoding/gstencodebin.h b/gst/encoding/gstencodebin.h
new file mode 100644
index 0000000..2d594b0
--- /dev/null
+++ b/gst/encoding/gstencodebin.h
@@ -0,0 +1,39 @@
+/* GStreamer encoding bin
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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_ENCODEBIN_H__
+#define __GST_ENCODEBIN_H__
+
+#include <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+#include "gstencode-marshal.h"
+
+#define GST_TYPE_ENCODE_BIN (gst_encode_bin_get_type())
+#define GST_ENCODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODE_BIN,GstEncodeBin))
+#define GST_ENCODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ENCODE_BIN,GstEncodeBinClass))
+#define GST_IS_ENCODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODE_BIN))
+#define GST_IS_ENCODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ENCODE_BIN))
+
+typedef struct _GstEncodeBin GstEncodeBin;
+typedef struct _GstEncodeBinClass GstEncodeBinClass;
+
+GType gst_encode_bin_get_type(void);
+
+#endif /* __GST_ENCODEBIN_H__ */
diff --git a/gst/encoding/gstsmartencoder.c b/gst/encoding/gstsmartencoder.c
new file mode 100644
index 0000000..bfd7289
--- /dev/null
+++ b/gst/encoding/gstsmartencoder.c
@@ -0,0 +1,689 @@
+/* GStreamer Smart Video Encoder element
+ * Copyright (C) <2010> Edward Hervey <bilboed@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.
+ */
+
+/* TODO:
+ * * Implement get_caps/set_caps (store/forward caps)
+ * * Adjust template caps to the formats we can support
+ **/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include "gstsmartencoder.h"
+
+GST_DEBUG_CATEGORY_STATIC (smart_encoder_debug);
+#define GST_CAT_DEFAULT smart_encoder_debug
+
+/* FIXME : Update this with new caps */
+/* WARNING : We can only allow formats with closed-GOP */
+#define ALLOWED_CAPS "video/x-h263;video/x-intel-h263;"\
+ "video/mpeg,mpegversion=(int)1,systemstream=(boolean)false;"\
+ "video/mpeg,mpegversion=(int)2,systemstream=(boolean)false;"
+
+static GstStaticPadTemplate src_template =
+GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (ALLOWED_CAPS)
+ );
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (ALLOWED_CAPS)
+ );
+
+static GQuark INTERNAL_ELEMENT;
+
+/* GstSmartEncoder signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0
+ /* FILL ME */
+};
+
+static void
+_do_init (void)
+{
+ INTERNAL_ELEMENT = g_quark_from_string ("internal-element");
+};
+
+G_DEFINE_TYPE_EXTENDED (GstSmartEncoder, gst_smart_encoder, GST_TYPE_ELEMENT, 0,
+ _do_init ());
+
+static void gst_smart_encoder_dispose (GObject * object);
+
+static gboolean setup_recoder_pipeline (GstSmartEncoder * smart_encoder);
+
+static GstFlowReturn gst_smart_encoder_chain (GstPad * pad, GstBuffer * buf);
+static gboolean smart_encoder_sink_event (GstPad * pad, GstEvent * event);
+static GstCaps *smart_encoder_sink_getcaps (GstPad * pad, GstCaps * filter);
+static GstStateChangeReturn
+gst_smart_encoder_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void
+gst_smart_encoder_class_init (GstSmartEncoderClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *element_class;
+
+ element_class = (GstElementClass *) klass;
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ gst_smart_encoder_parent_class = g_type_class_peek_parent (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+
+ gst_element_class_set_details_simple (element_class, "Smart Video Encoder",
+ "Codec/Recoder/Video",
+ "Re-encodes portions of Video that lay on segment boundaries",
+ "Edward Hervey <bilboed@gmail.com>");
+
+ gobject_class->dispose = (GObjectFinalizeFunc) (gst_smart_encoder_dispose);
+ element_class->change_state = gst_smart_encoder_change_state;
+
+ GST_DEBUG_CATEGORY_INIT (smart_encoder_debug, "smartencoder", 0,
+ "Smart Encoder");
+}
+
+static void
+smart_encoder_reset (GstSmartEncoder * smart_encoder)
+{
+ gst_segment_init (smart_encoder->segment, GST_FORMAT_UNDEFINED);
+
+ if (smart_encoder->encoder) {
+ /* Clean up/remove elements */
+ gst_element_set_state (smart_encoder->encoder, GST_STATE_NULL);
+ gst_element_set_state (smart_encoder->decoder, GST_STATE_NULL);
+ gst_element_set_bus (smart_encoder->encoder, NULL);
+ gst_element_set_bus (smart_encoder->decoder, NULL);
+ gst_pad_set_active (smart_encoder->internal_srcpad, FALSE);
+ gst_pad_set_active (smart_encoder->internal_sinkpad, FALSE);
+ gst_object_unref (smart_encoder->encoder);
+ gst_object_unref (smart_encoder->decoder);
+ gst_object_unref (smart_encoder->internal_srcpad);
+ gst_object_unref (smart_encoder->internal_sinkpad);
+
+ smart_encoder->encoder = NULL;
+ smart_encoder->decoder = NULL;
+ smart_encoder->internal_sinkpad = NULL;
+ smart_encoder->internal_srcpad = NULL;
+ }
+
+ if (smart_encoder->newsegment) {
+ gst_event_unref (smart_encoder->newsegment);
+ smart_encoder->newsegment = NULL;
+ }
+}
+
+
+static void
+gst_smart_encoder_init (GstSmartEncoder * smart_encoder)
+{
+ smart_encoder->sinkpad =
+ gst_pad_new_from_static_template (&sink_template, "sink");
+ gst_pad_set_chain_function (smart_encoder->sinkpad, gst_smart_encoder_chain);
+ gst_pad_set_event_function (smart_encoder->sinkpad, smart_encoder_sink_event);
+ gst_pad_set_getcaps_function (smart_encoder->sinkpad,
+ smart_encoder_sink_getcaps);
+ gst_element_add_pad (GST_ELEMENT (smart_encoder), smart_encoder->sinkpad);
+
+ smart_encoder->srcpad =
+ gst_pad_new_from_static_template (&src_template, "src");
+ gst_pad_use_fixed_caps (smart_encoder->srcpad);
+ gst_element_add_pad (GST_ELEMENT (smart_encoder), smart_encoder->srcpad);
+
+ smart_encoder->segment = gst_segment_new ();
+
+ smart_encoder_reset (smart_encoder);
+}
+
+void
+gst_smart_encoder_dispose (GObject * object)
+{
+ GstSmartEncoder *smart_encoder = (GstSmartEncoder *) object;
+
+ if (smart_encoder->segment)
+ gst_segment_free (smart_encoder->segment);
+ smart_encoder->segment = NULL;
+ if (smart_encoder->available_caps)
+ gst_caps_unref (smart_encoder->available_caps);
+ smart_encoder->available_caps = NULL;
+ G_OBJECT_CLASS (gst_smart_encoder_parent_class)->dispose (object);
+}
+
+static GstFlowReturn
+gst_smart_encoder_reencode_gop (GstSmartEncoder * smart_encoder)
+{
+ GstFlowReturn res = GST_FLOW_OK;
+ GList *tmp;
+
+ if (smart_encoder->encoder == NULL) {
+ if (!setup_recoder_pipeline (smart_encoder))
+ return GST_FLOW_ERROR;
+ }
+
+ /* Activate elements */
+ /* Set elements to PAUSED */
+ gst_element_set_state (smart_encoder->encoder, GST_STATE_PAUSED);
+ gst_element_set_state (smart_encoder->decoder, GST_STATE_PAUSED);
+
+ GST_INFO ("Pushing Flush start/stop to clean decoder/encoder");
+ gst_pad_push_event (smart_encoder->internal_srcpad,
+ gst_event_new_flush_start ());
+ gst_pad_push_event (smart_encoder->internal_srcpad,
+ gst_event_new_flush_stop (TRUE));
+
+ /* push newsegment */
+ GST_INFO ("Pushing newsegment %" GST_PTR_FORMAT, smart_encoder->newsegment);
+ gst_pad_push_event (smart_encoder->internal_srcpad,
+ gst_event_ref (smart_encoder->newsegment));
+
+ /* Push buffers through our pads */
+ GST_DEBUG ("Pushing pending buffers");
+
+ for (tmp = smart_encoder->pending_gop; tmp; tmp = tmp->next) {
+ GstBuffer *buf = (GstBuffer *) tmp->data;
+
+ res = gst_pad_push (smart_encoder->internal_srcpad, buf);
+ if (G_UNLIKELY (res != GST_FLOW_OK))
+ break;
+ }
+
+ if (G_UNLIKELY (res != GST_FLOW_OK)) {
+ GST_WARNING ("Error pushing pending buffers : %s", gst_flow_get_name (res));
+ /* Remove pending bfufers */
+ for (tmp = smart_encoder->pending_gop; tmp; tmp = tmp->next) {
+ gst_buffer_unref ((GstBuffer *) tmp->data);
+ }
+ } else {
+ GST_INFO ("Pushing out EOS to flush out decoder/encoder");
+ gst_pad_push_event (smart_encoder->internal_srcpad, gst_event_new_eos ());
+ }
+
+ /* Activate elements */
+ /* Set elements to PAUSED */
+ gst_element_set_state (smart_encoder->encoder, GST_STATE_NULL);
+ gst_element_set_state (smart_encoder->decoder, GST_STATE_NULL);
+
+ g_list_free (smart_encoder->pending_gop);
+ smart_encoder->pending_gop = NULL;
+
+ return res;
+}
+
+static GstFlowReturn
+gst_smart_encoder_push_pending_gop (GstSmartEncoder * smart_encoder)
+{
+ guint64 cstart, cstop;
+ GList *tmp;
+ GstFlowReturn res = GST_FLOW_OK;
+
+ GST_DEBUG ("Pushing pending GOP (%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT
+ ")", GST_TIME_ARGS (smart_encoder->gop_start),
+ GST_TIME_ARGS (smart_encoder->gop_stop));
+
+ /* If GOP is entirely within segment, just push downstream */
+ if (gst_segment_clip (smart_encoder->segment, GST_FORMAT_TIME,
+ smart_encoder->gop_start, smart_encoder->gop_stop, &cstart, &cstop)) {
+ if ((cstart != smart_encoder->gop_start)
+ || (cstop != smart_encoder->gop_stop)) {
+ GST_DEBUG ("GOP needs to be re-encoded from %" GST_TIME_FORMAT " to %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (cstart), GST_TIME_ARGS (cstop));
+ res = gst_smart_encoder_reencode_gop (smart_encoder);
+ } else {
+ /* The whole GOP is within the segment, push all pending buffers downstream */
+ GST_DEBUG ("GOP doesn't need to be modified, pushing downstream");
+ for (tmp = smart_encoder->pending_gop; tmp; tmp = tmp->next) {
+ GstBuffer *buf = (GstBuffer *) tmp->data;
+ res = gst_pad_push (smart_encoder->srcpad, buf);
+ if (G_UNLIKELY (res != GST_FLOW_OK))
+ break;
+ }
+ }
+ } else {
+ /* The whole GOP is outside the segment, there's most likely
+ * a bug somewhere. */
+ GST_WARNING
+ ("GOP is entirely outside of the segment, upstream gave us too much data");
+ for (tmp = smart_encoder->pending_gop; tmp; tmp = tmp->next) {
+ gst_buffer_unref ((GstBuffer *) tmp->data);
+ }
+ }
+
+ if (smart_encoder->pending_gop) {
+ g_list_free (smart_encoder->pending_gop);
+ smart_encoder->pending_gop = NULL;
+ }
+ smart_encoder->gop_start = GST_CLOCK_TIME_NONE;
+ smart_encoder->gop_stop = GST_CLOCK_TIME_NONE;
+
+ return res;
+}
+
+static GstFlowReturn
+gst_smart_encoder_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstSmartEncoder *smart_encoder;
+ GstFlowReturn res = GST_FLOW_OK;
+ gboolean discont, keyframe;
+
+ smart_encoder = GST_SMART_ENCODER (gst_object_get_parent (GST_OBJECT (pad)));
+
+ discont = GST_BUFFER_IS_DISCONT (buf);
+ keyframe = !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ GST_DEBUG ("New buffer %s %s %" GST_TIME_FORMAT,
+ discont ? "discont" : "",
+ keyframe ? "keyframe" : "", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+
+ if (keyframe) {
+ GST_DEBUG ("Got a keyframe");
+
+ /* If there's a pending GOP, flush it out */
+ if (smart_encoder->pending_gop) {
+ /* Mark gop_stop */
+ smart_encoder->gop_stop = GST_BUFFER_TIMESTAMP (buf);
+
+ /* flush pending */
+ res = gst_smart_encoder_push_pending_gop (smart_encoder);
+ if (G_UNLIKELY (res != GST_FLOW_OK))
+ goto beach;
+ }
+
+ /* Mark gop_start for new gop */
+ smart_encoder->gop_start = GST_BUFFER_TIMESTAMP (buf);
+ }
+
+ /* Store buffer */
+ smart_encoder->pending_gop = g_list_append (smart_encoder->pending_gop, buf);
+ /* Update GOP stop position */
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ smart_encoder->gop_stop = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf))
+ smart_encoder->gop_stop += GST_BUFFER_DURATION (buf);
+ }
+
+ GST_DEBUG ("Buffer stored , Current GOP : %" GST_TIME_FORMAT " -- %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (smart_encoder->gop_start),
+ GST_TIME_ARGS (smart_encoder->gop_stop));
+
+beach:
+ gst_object_unref (smart_encoder);
+ return res;
+}
+
+static gboolean
+smart_encoder_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstSmartEncoder *smart_encoder = GST_SMART_ENCODER (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ smart_encoder_reset (smart_encoder);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, smart_encoder->segment);
+
+ GST_DEBUG_OBJECT (smart_encoder, "segment: %" GST_SEGMENT_FORMAT,
+ smart_encoder->segment);
+ if (smart_encoder->segment->format != GST_FORMAT_TIME)
+ GST_ERROR
+ ("smart_encoder can not handle streams not specified in GST_FORMAT_TIME");
+
+ /* And keep a copy for further usage */
+ if (smart_encoder->newsegment)
+ gst_event_unref (smart_encoder->newsegment);
+ smart_encoder->newsegment = gst_event_ref (event);
+ }
+ break;
+ case GST_EVENT_EOS:
+ GST_DEBUG ("Eos, flushing remaining data");
+ gst_smart_encoder_push_pending_gop (smart_encoder);
+ break;
+ default:
+ break;
+ }
+
+ res = gst_pad_push_event (smart_encoder->srcpad, event);
+
+ gst_object_unref (smart_encoder);
+ return res;
+}
+
+static GstCaps *
+smart_encoder_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstCaps *peer, *tmpl, *res;
+ GstSmartEncoder *smart_encoder = GST_SMART_ENCODER (gst_pad_get_parent (pad));
+
+ /* Use computed caps */
+ if (smart_encoder->available_caps)
+ tmpl = gst_caps_ref (smart_encoder->available_caps);
+ else
+ tmpl = gst_static_pad_template_get_caps (&src_template);
+
+ /* Try getting it from downstream */
+ peer = gst_pad_peer_get_caps (smart_encoder->srcpad, tmpl);
+
+ if (peer == NULL) {
+ res = tmpl;
+ } else {
+ res = peer;
+ gst_caps_unref (tmpl);
+ }
+
+ gst_object_unref (smart_encoder);
+ return res;
+}
+
+/*****************************************
+ * Internal encoder/decoder pipeline *
+ ******************************************/
+
+static GstElementFactory *
+get_decoder_factory (GstCaps * caps)
+{
+ GstElementFactory *fact = NULL;
+ GList *decoders, *tmp;
+
+ tmp =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_DECODER,
+ GST_RANK_MARGINAL);
+ decoders = gst_element_factory_list_filter (tmp, caps, GST_PAD_SINK, FALSE);
+ gst_plugin_feature_list_free (tmp);
+
+ for (tmp = decoders; tmp; tmp = tmp->next) {
+ /* We just pick the first one */
+ fact = (GstElementFactory *) tmp->data;
+ gst_object_ref (fact);
+ break;
+ }
+
+ gst_plugin_feature_list_free (decoders);
+
+ return fact;
+}
+
+static GstElementFactory *
+get_encoder_factory (GstCaps * caps)
+{
+ GstElementFactory *fact = NULL;
+ GList *encoders, *tmp;
+
+ tmp =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_ENCODER,
+ GST_RANK_MARGINAL);
+ encoders = gst_element_factory_list_filter (tmp, caps, GST_PAD_SRC, FALSE);
+ gst_plugin_feature_list_free (tmp);
+
+ for (tmp = encoders; tmp; tmp = tmp->next) {
+ /* We just pick the first one */
+ fact = (GstElementFactory *) tmp->data;
+ gst_object_ref (fact);
+ break;
+ }
+
+ gst_plugin_feature_list_free (encoders);
+
+ return fact;
+}
+
+static GstElement *
+get_decoder (GstCaps * caps)
+{
+ GstElementFactory *fact = get_decoder_factory (caps);
+ GstElement *res = NULL;
+
+ if (fact) {
+ res = gst_element_factory_create (fact, "internal-decoder");
+ gst_object_unref (fact);
+ }
+ return res;
+}
+
+static GstElement *
+get_encoder (GstCaps * caps)
+{
+ GstElementFactory *fact = get_encoder_factory (caps);
+ GstElement *res = NULL;
+
+ if (fact) {
+ res = gst_element_factory_create (fact, "internal-encoder");
+ gst_object_unref (fact);
+ }
+ return res;
+}
+
+static GstFlowReturn
+internal_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstSmartEncoder *smart_encoder =
+ g_object_get_qdata ((GObject *) pad, INTERNAL_ELEMENT);
+
+ return gst_pad_push (smart_encoder->srcpad, buf);
+}
+
+static gboolean
+setup_recoder_pipeline (GstSmartEncoder * smart_encoder)
+{
+ GstPad *tmppad;
+ GstCaps *caps;
+
+ /* Fast path */
+ if (G_UNLIKELY (smart_encoder->encoder))
+ return TRUE;
+
+ GST_DEBUG ("Creating internal decoder and encoder");
+
+ /* Create decoder/encoder */
+ caps = gst_pad_get_current_caps (smart_encoder->sinkpad);
+ smart_encoder->decoder = get_decoder (caps);
+ if (G_UNLIKELY (smart_encoder->decoder == NULL))
+ goto no_decoder;
+ gst_caps_unref (caps);
+ gst_element_set_bus (smart_encoder->decoder, GST_ELEMENT_BUS (smart_encoder));
+
+ caps = gst_pad_get_current_caps (smart_encoder->sinkpad);
+ smart_encoder->encoder = get_encoder (caps);
+ if (G_UNLIKELY (smart_encoder->encoder == NULL))
+ goto no_encoder;
+ gst_caps_unref (caps);
+ gst_element_set_bus (smart_encoder->encoder, GST_ELEMENT_BUS (smart_encoder));
+
+ GST_DEBUG ("Creating internal pads");
+
+ /* Create internal pads */
+
+ /* Source pad which we'll use to feed data to decoders */
+ smart_encoder->internal_srcpad = gst_pad_new ("internal_src", GST_PAD_SRC);
+ g_object_set_qdata ((GObject *) smart_encoder->internal_srcpad,
+ INTERNAL_ELEMENT, smart_encoder);
+ gst_pad_set_active (smart_encoder->internal_srcpad, TRUE);
+
+ /* Sink pad which will get the buffers from the encoder.
+ * Note: We don't need an event function since we'll be discarding all
+ * of them. */
+ smart_encoder->internal_sinkpad = gst_pad_new ("internal_sink", GST_PAD_SINK);
+ g_object_set_qdata ((GObject *) smart_encoder->internal_sinkpad,
+ INTERNAL_ELEMENT, smart_encoder);
+ gst_pad_set_chain_function (smart_encoder->internal_sinkpad, internal_chain);
+ gst_pad_set_active (smart_encoder->internal_sinkpad, TRUE);
+
+ GST_DEBUG ("Linking pads to elements");
+
+ /* Link everything */
+ tmppad = gst_element_get_static_pad (smart_encoder->encoder, "src");
+ if (GST_PAD_LINK_FAILED (gst_pad_link (tmppad,
+ smart_encoder->internal_sinkpad)))
+ goto sinkpad_link_fail;
+ gst_object_unref (tmppad);
+
+ if (!gst_element_link (smart_encoder->decoder, smart_encoder->encoder))
+ goto encoder_decoder_link_fail;
+
+ tmppad = gst_element_get_static_pad (smart_encoder->decoder, "sink");
+ if (GST_PAD_LINK_FAILED (gst_pad_link (smart_encoder->internal_srcpad,
+ tmppad)))
+ goto srcpad_link_fail;
+ gst_object_unref (tmppad);
+
+ GST_DEBUG ("Done creating internal elements/pads");
+
+ return TRUE;
+
+no_decoder:
+ {
+ GST_WARNING ("Couldn't find a decoder for %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (caps);
+ return FALSE;
+ }
+
+no_encoder:
+ {
+ GST_WARNING ("Couldn't find an encoder for %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (caps);
+ return FALSE;
+ }
+
+srcpad_link_fail:
+ {
+ gst_object_unref (tmppad);
+ GST_WARNING ("Couldn't link internal srcpad to decoder");
+ return FALSE;
+ }
+
+sinkpad_link_fail:
+ {
+ gst_object_unref (tmppad);
+ GST_WARNING ("Couldn't link encoder to internal sinkpad");
+ return FALSE;
+ }
+
+encoder_decoder_link_fail:
+ {
+ GST_WARNING ("Couldn't link decoder to encoder");
+ return FALSE;
+ }
+}
+
+static GstStateChangeReturn
+gst_smart_encoder_find_elements (GstSmartEncoder * smart_encoder)
+{
+ guint i, n;
+ GstCaps *tmpl, *st, *res;
+ GstElementFactory *dec, *enc;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ if (G_UNLIKELY (smart_encoder->available_caps))
+ goto beach;
+
+ /* Iterate over all pad template caps and see if we have both an
+ * encoder and a decoder for those media types */
+ tmpl = gst_static_pad_template_get_caps (&src_template);
+ res = gst_caps_new_empty ();
+ n = gst_caps_get_size (tmpl);
+
+ for (i = 0; i < n; i++) {
+ st = gst_caps_copy_nth (tmpl, i);
+ GST_DEBUG_OBJECT (smart_encoder,
+ "Checking for available decoder and encoder for %" GST_PTR_FORMAT, st);
+ if (!(dec = get_decoder_factory (st))) {
+ gst_caps_unref (st);
+ continue;
+ }
+ gst_object_unref (dec);
+ if (!(enc = get_encoder_factory (st))) {
+ gst_caps_unref (st);
+ continue;
+ }
+ gst_object_unref (enc);
+ GST_DEBUG_OBJECT (smart_encoder, "OK");
+ gst_caps_append (res, st);
+ }
+
+ gst_caps_unref (tmpl);
+
+ if (gst_caps_is_empty (res))
+ ret = GST_STATE_CHANGE_FAILURE;
+ else
+ smart_encoder->available_caps = res;
+
+ GST_DEBUG_OBJECT (smart_encoder, "Done, available_caps:%" GST_PTR_FORMAT,
+ smart_encoder->available_caps);
+
+beach:
+ return ret;
+}
+
+/******************************************
+ * GstElement vmethod implementations *
+ ******************************************/
+
+static GstStateChangeReturn
+gst_smart_encoder_change_state (GstElement * element, GstStateChange transition)
+{
+ GstSmartEncoder *smart_encoder;
+ GstStateChangeReturn ret;
+
+ g_return_val_if_fail (GST_IS_SMART_ENCODER (element),
+ GST_STATE_CHANGE_FAILURE);
+
+ smart_encoder = GST_SMART_ENCODER (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ /* Figure out which elements are available */
+ if ((ret =
+ gst_smart_encoder_find_elements (smart_encoder)) ==
+ GST_STATE_CHANGE_FAILURE)
+ goto beach;
+ break;
+ default:
+ break;
+ }
+
+ ret =
+ GST_ELEMENT_CLASS (gst_smart_encoder_parent_class)->change_state (element,
+ transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ smart_encoder_reset (smart_encoder);
+ break;
+ default:
+ break;
+ }
+
+beach:
+ return ret;
+}
diff --git a/gst/encoding/gstsmartencoder.h b/gst/encoding/gstsmartencoder.h
new file mode 100644
index 0000000..1536626
--- /dev/null
+++ b/gst/encoding/gstsmartencoder.h
@@ -0,0 +1,71 @@
+/* GStreamer video re-encoder element
+ * Copyright (C) <2010> Edward Hervey <bilboed@bilboed.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 __SMART_ENCODER_H__
+#define __SMART_ENCODER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SMART_ENCODER \
+ (gst_smart_encoder_get_type())
+#define GST_SMART_ENCODER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMART_ENCODER,GstSmartEncoder))
+#define GST_SMART_ENCODER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMART_ENCODER,GstSmartEncoderClass))
+#define GST_IS_SMART_ENCODER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMART_ENCODER))
+#define GST_IS_SMART_ENCODER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMART_ENCODER))
+
+typedef struct _GstSmartEncoder GstSmartEncoder;
+typedef struct _GstSmartEncoderClass GstSmartEncoderClass;
+
+struct _GstSmartEncoder {
+ GstElement element;
+
+ GstPad *sinkpad, *srcpad;
+
+ GstSegment *segment;
+ GstEvent *newsegment;
+
+ /* Pending GOP to be checked */
+ GList *pending_gop;
+ guint64 gop_start; /* GOP start in running time */
+ guint64 gop_stop; /* GOP end in running time */
+
+ /* Internal recoding elements */
+ GstPad *internal_sinkpad;
+ GstPad *internal_srcpad;
+ GstElement *decoder;
+ GstElement *encoder;
+
+ /* Available caps at runtime */
+ GstCaps *available_caps;
+};
+
+struct _GstSmartEncoderClass {
+ GstElementClass parent_class;
+};
+
+GType gst_smart_encoder_get_type(void);
+
+G_END_DECLS
+
+#endif /* __SMART_ENCODER_H__ */
diff --git a/gst/encoding/gststreamcombiner.c b/gst/encoding/gststreamcombiner.c
new file mode 100644
index 0000000..cc74ac5
--- /dev/null
+++ b/gst/encoding/gststreamcombiner.c
@@ -0,0 +1,253 @@
+/* GStreamer Stream Combiner
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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 "gststreamcombiner.h"
+
+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_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_stream_combiner_debug);
+#define GST_CAT_DEFAULT gst_stream_combiner_debug
+
+G_DEFINE_TYPE (GstStreamCombiner, gst_stream_combiner, GST_TYPE_ELEMENT);
+
+#define STREAMS_LOCK(obj) (g_mutex_lock(obj->lock))
+#define STREAMS_UNLOCK(obj) (g_mutex_unlock(obj->lock))
+
+static void gst_stream_combiner_dispose (GObject * object);
+
+static GstPad *gst_stream_combiner_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_stream_combiner_release_pad (GstElement * element,
+ GstPad * pad);
+
+static void
+gst_stream_combiner_class_init (GstStreamCombinerClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+
+ gobject_klass->dispose = gst_stream_combiner_dispose;
+
+ GST_DEBUG_CATEGORY_INIT (gst_stream_combiner_debug, "streamcombiner", 0,
+ "Stream Combiner");
+
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&sink_template));
+
+ gstelement_klass->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_combiner_request_new_pad);
+ gstelement_klass->release_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_combiner_release_pad);
+
+ gst_element_class_set_details_simple (gstelement_klass,
+ "streamcombiner", "Generic",
+ "Recombines streams splitted by the streamsplitter element",
+ "Edward Hervey <edward.hervey@collabora.co.uk>");
+}
+
+static void
+gst_stream_combiner_dispose (GObject * object)
+{
+ GstStreamCombiner *stream_combiner = (GstStreamCombiner *) object;
+
+ if (stream_combiner->lock) {
+ g_mutex_free (stream_combiner->lock);
+ stream_combiner->lock = NULL;
+ }
+
+ G_OBJECT_CLASS (gst_stream_combiner_parent_class)->dispose (object);
+}
+
+static GstFlowReturn
+gst_stream_combiner_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstStreamCombiner *stream_combiner =
+ (GstStreamCombiner *) GST_PAD_PARENT (pad);
+ /* FIXME : IMPLEMENT */
+
+ /* with lock taken, check if we're the active stream, if not drop */
+ return gst_pad_push (stream_combiner->srcpad, buf);
+}
+
+static gboolean
+gst_stream_combiner_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamCombiner *stream_combiner =
+ (GstStreamCombiner *) GST_PAD_PARENT (pad);
+ /* FIXME : IMPLEMENT */
+
+ GST_DEBUG_OBJECT (pad, "Got event %s", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ if (gst_event_has_name (event, "stream-switching-eos")) {
+ gst_event_unref (event);
+ event = gst_event_new_eos ();
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* SEGMENT : lock, wait for other stream to EOS, select stream, unlock, push */
+ /* EOS : lock, mark pad as unused, unlock , drop event */
+ /* CUSTOM_REAL_EOS : push EOS downstream */
+ /* FLUSH_START : lock, mark as flushing, unlock. if wasn't flushing forward */
+ /* FLUSH_STOP : lock, unmark as flushing, unlock, if was flushing forward */
+ /* OTHER : if selected pad forward */
+ return gst_pad_push_event (stream_combiner->srcpad, event);
+}
+
+static GstCaps *
+gst_stream_combiner_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstStreamCombiner *stream_combiner =
+ (GstStreamCombiner *) GST_PAD_PARENT (pad);
+
+ return gst_pad_peer_get_caps (stream_combiner->srcpad, filter);
+}
+
+static gboolean
+gst_stream_combiner_src_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamCombiner *stream_combiner =
+ (GstStreamCombiner *) GST_PAD_PARENT (pad);
+ GstPad *sinkpad = NULL;
+
+ STREAMS_LOCK (stream_combiner);
+ if (stream_combiner->current)
+ sinkpad = stream_combiner->current;
+ else if (stream_combiner->sinkpads)
+ sinkpad = (GstPad *) stream_combiner->sinkpads->data;
+ STREAMS_UNLOCK (stream_combiner);
+
+ if (sinkpad)
+ /* Forward upstream as is */
+ return gst_pad_push_event (sinkpad, event);
+ return FALSE;
+}
+
+static gboolean
+gst_stream_combiner_src_query (GstPad * pad, GstQuery * query)
+{
+ GstStreamCombiner *stream_combiner =
+ (GstStreamCombiner *) GST_PAD_PARENT (pad);
+
+ GstPad *sinkpad = NULL;
+
+ STREAMS_LOCK (stream_combiner);
+ if (stream_combiner->current)
+ sinkpad = stream_combiner->current;
+ else if (stream_combiner->sinkpads)
+ sinkpad = (GstPad *) stream_combiner->sinkpads->data;
+ STREAMS_UNLOCK (stream_combiner);
+
+ if (sinkpad)
+ /* Forward upstream as is */
+ return gst_pad_peer_query (sinkpad, query);
+ return FALSE;
+}
+
+static void
+gst_stream_combiner_init (GstStreamCombiner * stream_combiner)
+{
+ stream_combiner->srcpad =
+ gst_pad_new_from_static_template (&src_template, "src");
+ gst_pad_set_event_function (stream_combiner->srcpad,
+ gst_stream_combiner_src_event);
+ gst_pad_set_query_function (stream_combiner->srcpad,
+ gst_stream_combiner_src_query);
+ gst_element_add_pad (GST_ELEMENT (stream_combiner), stream_combiner->srcpad);
+
+ stream_combiner->lock = g_mutex_new ();
+}
+
+static GstPad *
+gst_stream_combiner_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
+{
+ GstStreamCombiner *stream_combiner = (GstStreamCombiner *) element;
+ GstPad *sinkpad;
+
+ GST_DEBUG_OBJECT (element, "templ:%p, name:%s", templ, name);
+
+ sinkpad = gst_pad_new_from_static_template (&sink_template, name);
+ gst_pad_set_chain_function (sinkpad, gst_stream_combiner_chain);
+ gst_pad_set_event_function (sinkpad, gst_stream_combiner_sink_event);
+ gst_pad_set_getcaps_function (sinkpad, gst_stream_combiner_sink_getcaps);
+
+ STREAMS_LOCK (stream_combiner);
+ stream_combiner->sinkpads =
+ g_list_append (stream_combiner->sinkpads, sinkpad);
+ gst_pad_set_active (sinkpad, TRUE);
+ gst_element_add_pad (element, sinkpad);
+ stream_combiner->cookie++;
+ STREAMS_UNLOCK (stream_combiner);
+
+ GST_DEBUG_OBJECT (element, "Returning pad %p", sinkpad);
+
+ return sinkpad;
+}
+
+static void
+gst_stream_combiner_release_pad (GstElement * element, GstPad * pad)
+{
+ GstStreamCombiner *stream_combiner = (GstStreamCombiner *) element;
+ GList *tmp;
+
+ GST_DEBUG_OBJECT (element, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ STREAMS_LOCK (stream_combiner);
+ tmp = g_list_find (stream_combiner->sinkpads, pad);
+ if (tmp) {
+ GstPad *pad = (GstPad *) tmp->data;
+
+ stream_combiner->sinkpads =
+ g_list_delete_link (stream_combiner->sinkpads, tmp);
+ stream_combiner->cookie++;
+
+ if (pad == stream_combiner->current) {
+ /* Deactivate current flow */
+ GST_DEBUG_OBJECT (element, "Removed pad was the current one");
+ stream_combiner->current = NULL;
+ }
+ GST_DEBUG_OBJECT (element, "Removing pad from ourself");
+ gst_element_remove_pad (element, pad);
+ }
+ STREAMS_UNLOCK (stream_combiner);
+
+ return;
+}
diff --git a/gst/encoding/gststreamcombiner.h b/gst/encoding/gststreamcombiner.h
new file mode 100644
index 0000000..ce67277
--- /dev/null
+++ b/gst/encoding/gststreamcombiner.h
@@ -0,0 +1,60 @@
+/* GStreamer Stream Combiner
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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_STREAMCOMBINER_H__
+#define __GST_STREAMCOMBINER_H__
+
+#include <gst/gst.h>
+
+#define GST_TYPE_STREAM_COMBINER (gst_stream_combiner_get_type())
+#define GST_STREAM_COMBINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STREAM_COMBINER,GstStreamCombiner))
+#define GST_STREAM_COMBINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STREAM_COMBINER,GstStreamCombinerClass))
+#define GST_IS_STREAM_COMBINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STREAM_COMBINER))
+#define GST_IS_STREAM_COMBINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STREAM_COMBINER))
+
+typedef struct _GstStreamCombiner GstStreamCombiner;
+typedef struct _GstStreamCombinerClass GstStreamCombinerClass;
+
+struct _GstStreamCombiner {
+ GstElement parent;
+
+ GstPad *srcpad;
+
+ /* lock protects:
+ * * the current pad
+ * * the list of srcpads
+ */
+ GMutex *lock;
+ /* Currently activated srcpad */
+ GstPad *current;
+ GList *sinkpads;
+ guint32 cookie;
+
+};
+
+struct _GstStreamCombinerClass {
+ GstElementClass parent;
+};
+
+GType gst_stream_combiner_get_type(void);
+
+GstElement *gst_stream_combiner_new (gchar *name);
+
+#endif /* __GST_STREAMCOMBINER_H__ */
diff --git a/gst/encoding/gststreamsplitter.c b/gst/encoding/gststreamsplitter.c
new file mode 100644
index 0000000..ff9e679
--- /dev/null
+++ b/gst/encoding/gststreamsplitter.c
@@ -0,0 +1,448 @@
+/* GStreamer Stream Splitter
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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 "gststreamsplitter.h"
+
+static GstStaticPadTemplate src_template =
+GST_STATIC_PAD_TEMPLATE ("src_%d", GST_PAD_SRC, GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_stream_splitter_debug);
+#define GST_CAT_DEFAULT gst_stream_splitter_debug
+
+G_DEFINE_TYPE (GstStreamSplitter, gst_stream_splitter, GST_TYPE_ELEMENT);
+
+#define STREAMS_LOCK(obj) (g_mutex_lock(obj->lock))
+#define STREAMS_UNLOCK(obj) (g_mutex_unlock(obj->lock))
+
+static void gst_stream_splitter_dispose (GObject * object);
+
+static gboolean gst_stream_splitter_sink_setcaps (GstPad * pad, GstCaps * caps);
+
+static GstPad *gst_stream_splitter_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_stream_splitter_release_pad (GstElement * element,
+ GstPad * pad);
+
+static void
+gst_stream_splitter_class_init (GstStreamSplitterClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+
+ gobject_klass->dispose = gst_stream_splitter_dispose;
+
+ GST_DEBUG_CATEGORY_INIT (gst_stream_splitter_debug, "streamsplitter", 0,
+ "Stream Splitter");
+
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&sink_template));
+
+ gstelement_klass->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_splitter_request_new_pad);
+ gstelement_klass->release_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_splitter_release_pad);
+
+ gst_element_class_set_details_simple (gstelement_klass,
+ "streamsplitter", "Generic",
+ "Splits streams based on their media type",
+ "Edward Hervey <edward.hervey@collabora.co.uk>");
+}
+
+static void
+gst_stream_splitter_dispose (GObject * object)
+{
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) object;
+
+ if (stream_splitter->lock) {
+ g_mutex_free (stream_splitter->lock);
+ stream_splitter->lock = NULL;
+ }
+
+ g_list_foreach (stream_splitter->pending_events, (GFunc) gst_event_unref,
+ NULL);
+ g_list_free (stream_splitter->pending_events);
+ stream_splitter->pending_events = NULL;
+
+ G_OBJECT_CLASS (gst_stream_splitter_parent_class)->dispose (object);
+}
+
+static GstFlowReturn
+gst_stream_splitter_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ GstFlowReturn res;
+ GstPad *srcpad = NULL;
+
+ STREAMS_LOCK (stream_splitter);
+ if (stream_splitter->current)
+ srcpad = gst_object_ref (stream_splitter->current);
+ STREAMS_UNLOCK (stream_splitter);
+
+ if (G_UNLIKELY (srcpad == NULL))
+ goto nopad;
+
+ if (G_UNLIKELY (stream_splitter->pending_events)) {
+ GList *tmp;
+ GST_DEBUG_OBJECT (srcpad, "Pushing out pending events");
+
+ for (tmp = stream_splitter->pending_events; tmp; tmp = tmp->next) {
+ GstEvent *event = (GstEvent *) tmp->data;
+ gst_pad_push_event (srcpad, event);
+ }
+ g_list_free (stream_splitter->pending_events);
+ stream_splitter->pending_events = NULL;
+ }
+
+ /* Forward to currently activated stream */
+ res = gst_pad_push (srcpad, buf);
+ gst_object_unref (srcpad);
+
+ return res;
+
+nopad:
+ GST_WARNING_OBJECT (stream_splitter, "No output pad was configured");
+ return GST_FLOW_ERROR;
+}
+
+static gboolean
+gst_stream_splitter_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ gboolean res = TRUE;
+ gboolean toall = FALSE;
+ gboolean store = FALSE;
+ gboolean eos = FALSE;
+ gboolean flushpending = FALSE;
+
+ /* FLUSH_START/STOP : forward to all
+ * EOS : transform to CUSTOM_REAL_EOS and forward to all
+ * INBAND events : store to send in chain function to selected chain
+ * OUT_OF_BAND events : send to all
+ */
+
+ GST_DEBUG_OBJECT (stream_splitter, "Got event %s",
+ GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = gst_stream_splitter_sink_setcaps (pad, caps);
+
+ store = TRUE;
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ flushpending = TRUE;
+ toall = TRUE;
+ break;
+ case GST_EVENT_FLUSH_START:
+ toall = TRUE;
+ break;
+ case GST_EVENT_EOS:
+ /* Replace with our custom eos event */
+ gst_event_unref (event);
+ event =
+ gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+ gst_structure_empty_new ("stream-switching-eos"));
+ toall = TRUE;
+ eos = TRUE;
+ break;
+ default:
+ if (GST_EVENT_TYPE (event) & GST_EVENT_TYPE_SERIALIZED)
+ store = TRUE;
+ }
+
+ if (flushpending) {
+ g_list_foreach (stream_splitter->pending_events, (GFunc) gst_event_unref,
+ NULL);
+ g_list_free (stream_splitter->pending_events);
+ stream_splitter->pending_events = NULL;
+ }
+
+ if (store) {
+ stream_splitter->pending_events =
+ g_list_append (stream_splitter->pending_events, event);
+ } else if (toall || eos) {
+ GList *tmp;
+ guint32 cookie;
+
+ /* Send to all pads */
+ STREAMS_LOCK (stream_splitter);
+ resync:
+ if (G_UNLIKELY (stream_splitter->srcpads == NULL)) {
+ STREAMS_UNLOCK (stream_splitter);
+ /* No source pads */
+ gst_event_unref (event);
+ res = FALSE;
+ goto beach;
+ }
+ tmp = stream_splitter->srcpads;
+ cookie = stream_splitter->cookie;
+ while (tmp) {
+ GstPad *srcpad = (GstPad *) tmp->data;
+ STREAMS_UNLOCK (stream_splitter);
+ /* In case of EOS, we first push out the real one to flush out
+ * each streams (but which will be discarded in the streamcombiner)
+ * before our custom one (which will be converted back to and EOS
+ * in the streamcombiner) */
+ if (eos)
+ gst_pad_push_event (srcpad, gst_event_new_eos ());
+ gst_event_ref (event);
+ res = gst_pad_push_event (srcpad, event);
+ STREAMS_LOCK (stream_splitter);
+ if (G_UNLIKELY (cookie != stream_splitter->cookie))
+ goto resync;
+ tmp = tmp->next;
+ }
+ STREAMS_UNLOCK (stream_splitter);
+ gst_event_unref (event);
+ } else {
+ GstPad *pad;
+
+ /* Only send to current pad */
+
+ STREAMS_LOCK (stream_splitter);
+ pad = stream_splitter->current;
+ STREAMS_UNLOCK (stream_splitter);
+ if (pad)
+ res = gst_pad_push_event (pad, event);
+ else {
+ gst_event_unref (event);
+ res = FALSE;
+ }
+ }
+
+beach:
+ return res;
+}
+
+static GstCaps *
+gst_stream_splitter_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ guint32 cookie;
+ GList *tmp;
+ GstCaps *res = NULL;
+
+ /* Return the combination of all downstream caps */
+
+ STREAMS_LOCK (stream_splitter);
+
+resync:
+ if (G_UNLIKELY (stream_splitter->srcpads == NULL)) {
+ res = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ goto beach;
+ }
+
+ res = NULL;
+ cookie = stream_splitter->cookie;
+ tmp = stream_splitter->srcpads;
+
+ while (tmp) {
+ GstPad *srcpad = (GstPad *) tmp->data;
+
+ STREAMS_UNLOCK (stream_splitter);
+ if (res) {
+ GstCaps *peercaps = gst_pad_peer_get_caps (srcpad, filter);
+ if (peercaps)
+ gst_caps_merge (res, gst_caps_make_writable (peercaps));
+ } else {
+ res = gst_pad_peer_get_caps (srcpad, filter);
+ }
+ STREAMS_LOCK (stream_splitter);
+
+ if (G_UNLIKELY (cookie != stream_splitter->cookie)) {
+ if (res)
+ gst_caps_unref (res);
+ goto resync;
+ }
+ tmp = tmp->next;
+ }
+
+beach:
+ STREAMS_UNLOCK (stream_splitter);
+ return res;
+}
+
+static gboolean
+gst_stream_splitter_sink_setcaps (GstPad * pad, GstCaps * caps)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ guint32 cookie;
+ GList *tmp;
+ gboolean res;
+
+ GST_DEBUG_OBJECT (stream_splitter, "caps %" GST_PTR_FORMAT, caps);
+
+ /* Try on all pads, choose the one that succeeds as the current stream */
+ STREAMS_LOCK (stream_splitter);
+
+resync:
+ if (G_UNLIKELY (stream_splitter->srcpads == NULL)) {
+ res = FALSE;
+ goto beach;
+ }
+
+ res = FALSE;
+ tmp = stream_splitter->srcpads;
+ cookie = stream_splitter->cookie;
+
+ while (tmp) {
+ GstPad *srcpad = (GstPad *) tmp->data;
+ GstCaps *peercaps;
+
+ STREAMS_UNLOCK (stream_splitter);
+ peercaps = gst_pad_peer_get_caps (srcpad, NULL);
+ if (peercaps) {
+ res = gst_caps_can_intersect (caps, peercaps);
+ gst_caps_unref (peercaps);
+ }
+ STREAMS_LOCK (stream_splitter);
+
+ if (G_UNLIKELY (cookie != stream_splitter->cookie))
+ goto resync;
+
+ if (res) {
+ /* FIXME : we need to switch properly */
+ GST_DEBUG_OBJECT (srcpad, "Setting caps on this pad was succesfull");
+ stream_splitter->current = srcpad;
+ goto beach;
+ }
+ tmp = tmp->next;
+ }
+
+beach:
+ STREAMS_UNLOCK (stream_splitter);
+ return res;
+}
+
+static gboolean
+gst_stream_splitter_src_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+
+ GST_DEBUG_OBJECT (pad, "%s", GST_EVENT_TYPE_NAME (event));
+
+ /* Forward upstream as is */
+ return gst_pad_push_event (stream_splitter->sinkpad, event);
+}
+
+static gboolean
+gst_stream_splitter_src_query (GstPad * pad, GstQuery * query)
+{
+ GstStreamSplitter *stream_splitter =
+ (GstStreamSplitter *) GST_PAD_PARENT (pad);
+
+ GST_DEBUG_OBJECT (pad, "%s", GST_QUERY_TYPE_NAME (query));
+
+ /* Forward upstream as is */
+ return gst_pad_peer_query (stream_splitter->sinkpad, query);
+}
+
+static void
+gst_stream_splitter_init (GstStreamSplitter * stream_splitter)
+{
+ stream_splitter->sinkpad =
+ gst_pad_new_from_static_template (&sink_template, "sink");
+ /* FIXME : No buffer alloc for the time being, it will resort to the fallback */
+ /* gst_pad_set_bufferalloc_function (stream_splitter->sinkpad, */
+ /* gst_stream_splitter_buffer_alloc); */
+ gst_pad_set_chain_function (stream_splitter->sinkpad,
+ gst_stream_splitter_chain);
+ gst_pad_set_event_function (stream_splitter->sinkpad,
+ gst_stream_splitter_sink_event);
+ gst_pad_set_getcaps_function (stream_splitter->sinkpad,
+ gst_stream_splitter_sink_getcaps);
+ gst_element_add_pad (GST_ELEMENT (stream_splitter), stream_splitter->sinkpad);
+
+ stream_splitter->lock = g_mutex_new ();
+}
+
+static GstPad *
+gst_stream_splitter_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
+{
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) element;
+ GstPad *srcpad;
+
+ srcpad = gst_pad_new_from_static_template (&src_template, name);
+ gst_pad_set_event_function (srcpad, gst_stream_splitter_src_event);
+ gst_pad_set_query_function (srcpad, gst_stream_splitter_src_query);
+
+ STREAMS_LOCK (stream_splitter);
+ stream_splitter->srcpads = g_list_append (stream_splitter->srcpads, srcpad);
+ gst_pad_set_active (srcpad, TRUE);
+ gst_element_add_pad (element, srcpad);
+ stream_splitter->cookie++;
+ STREAMS_UNLOCK (stream_splitter);
+
+ return srcpad;
+}
+
+static void
+gst_stream_splitter_release_pad (GstElement * element, GstPad * pad)
+{
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) element;
+ GList *tmp;
+
+ STREAMS_LOCK (stream_splitter);
+ tmp = g_list_find (stream_splitter->srcpads, pad);
+ if (tmp) {
+ GstPad *pad = (GstPad *) tmp->data;
+
+ stream_splitter->srcpads =
+ g_list_delete_link (stream_splitter->srcpads, tmp);
+ stream_splitter->cookie++;
+
+ if (pad == stream_splitter->current) {
+ /* Deactivate current flow */
+ GST_DEBUG_OBJECT (element, "Removed pad was the current one");
+ stream_splitter->current = NULL;
+ }
+
+ gst_element_remove_pad (element, pad);
+ }
+ STREAMS_UNLOCK (stream_splitter);
+
+ return;
+}
diff --git a/gst/encoding/gststreamsplitter.h b/gst/encoding/gststreamsplitter.h
new file mode 100644
index 0000000..b503c00
--- /dev/null
+++ b/gst/encoding/gststreamsplitter.h
@@ -0,0 +1,62 @@
+/* GStreamer Stream Splitter
+ * Copyright (C) 2010 Edward Hervey <edward.hervey@collabora.co.uk>
+ * (C) 2009 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_STREAMSPLITTER_H__
+#define __GST_STREAMSPLITTER_H__
+
+#include <gst/gst.h>
+
+#define GST_TYPE_STREAM_SPLITTER (gst_stream_splitter_get_type())
+#define GST_STREAM_SPLITTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STREAM_SPLITTER,GstStreamSplitter))
+#define GST_STREAM_SPLITTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STREAM_SPLITTER,GstStreamSplitterClass))
+#define GST_IS_STREAM_SPLITTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STREAM_SPLITTER))
+#define GST_IS_STREAM_SPLITTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STREAM_SPLITTER))
+
+typedef struct _GstStreamSplitter GstStreamSplitter;
+typedef struct _GstStreamSplitterClass GstStreamSplitterClass;
+
+struct _GstStreamSplitter {
+ GstElement parent;
+
+ GstPad *sinkpad;
+
+ /* lock protects:
+ * * the current pad
+ * * the list of srcpads
+ */
+ GMutex *lock;
+ /* Currently activated srcpad */
+ GstPad *current;
+ GList *srcpads;
+ guint32 cookie;
+
+ /* List of pending in-band events */
+ GList *pending_events;
+};
+
+struct _GstStreamSplitterClass {
+ GstElementClass parent;
+};
+
+GType gst_stream_splitter_get_type(void);
+
+GstElement *gst_stream_splitter_new (gchar *name);
+
+#endif /* __GST_STREAMSPLITTER_H__ */
diff --git a/gst/gdp/Makefile.am b/gst/gdp/Makefile.am
new file mode 100644
index 0000000..a8aba8b
--- /dev/null
+++ b/gst/gdp/Makefile.am
@@ -0,0 +1,29 @@
+plugin_LTLIBRARIES = libgstgdp.la
+
+libgstgdp_la_SOURCES = \
+ gstgdp.c \
+ gstgdppay.c \
+ gstgdpdepay.c
+
+libgstgdp_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstgdp_la_LIBADD = $(GST_BASE_LIBS) $(GST_GDP_LIBS)
+libgstgdp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstgdp_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstgdppay.h \
+ gstgdpdepay.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstgdp -:SHARED libgstgdp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstgdp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgdp_la_CFLAGS) \
+ -:LDFLAGS $(libgstgdp_la_LDFLAGS) \
+ $(libgstgdp_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/gdp/Makefile.in b/gst/gdp/Makefile.in
new file mode 100644
index 0000000..075389f
--- /dev/null
+++ b/gst/gdp/Makefile.in
@@ -0,0 +1,795 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/gdp
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstgdp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstgdp_la_OBJECTS = libgstgdp_la-gstgdp.lo \
+ libgstgdp_la-gstgdppay.lo libgstgdp_la-gstgdpdepay.lo
+libgstgdp_la_OBJECTS = $(am_libgstgdp_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstgdp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstgdp_la_CFLAGS) $(CFLAGS) \
+ $(libgstgdp_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstgdp_la_SOURCES)
+DIST_SOURCES = $(libgstgdp_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstgdp.la
+libgstgdp_la_SOURCES = \
+ gstgdp.c \
+ gstgdppay.c \
+ gstgdpdepay.c
+
+libgstgdp_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstgdp_la_LIBADD = $(GST_BASE_LIBS) $(GST_GDP_LIBS)
+libgstgdp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstgdp_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstgdppay.h \
+ gstgdpdepay.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/gdp/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/gdp/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
+libgstgdp.la: $(libgstgdp_la_OBJECTS) $(libgstgdp_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstgdp_la_LINK) -rpath $(plugindir) $(libgstgdp_la_OBJECTS) $(libgstgdp_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdp_la-gstgdp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdp_la-gstgdpdepay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdp_la-gstgdppay.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstgdp_la-gstgdp.lo: gstgdp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -MT libgstgdp_la-gstgdp.lo -MD -MP -MF $(DEPDIR)/libgstgdp_la-gstgdp.Tpo -c -o libgstgdp_la-gstgdp.lo `test -f 'gstgdp.c' || echo '$(srcdir)/'`gstgdp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdp_la-gstgdp.Tpo $(DEPDIR)/libgstgdp_la-gstgdp.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgdp.c' object='libgstgdp_la-gstgdp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -c -o libgstgdp_la-gstgdp.lo `test -f 'gstgdp.c' || echo '$(srcdir)/'`gstgdp.c
+
+libgstgdp_la-gstgdppay.lo: gstgdppay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -MT libgstgdp_la-gstgdppay.lo -MD -MP -MF $(DEPDIR)/libgstgdp_la-gstgdppay.Tpo -c -o libgstgdp_la-gstgdppay.lo `test -f 'gstgdppay.c' || echo '$(srcdir)/'`gstgdppay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdp_la-gstgdppay.Tpo $(DEPDIR)/libgstgdp_la-gstgdppay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgdppay.c' object='libgstgdp_la-gstgdppay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -c -o libgstgdp_la-gstgdppay.lo `test -f 'gstgdppay.c' || echo '$(srcdir)/'`gstgdppay.c
+
+libgstgdp_la-gstgdpdepay.lo: gstgdpdepay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -MT libgstgdp_la-gstgdpdepay.lo -MD -MP -MF $(DEPDIR)/libgstgdp_la-gstgdpdepay.Tpo -c -o libgstgdp_la-gstgdpdepay.lo `test -f 'gstgdpdepay.c' || echo '$(srcdir)/'`gstgdpdepay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdp_la-gstgdpdepay.Tpo $(DEPDIR)/libgstgdp_la-gstgdpdepay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstgdpdepay.c' object='libgstgdp_la-gstgdpdepay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdp_la_CFLAGS) $(CFLAGS) -c -o libgstgdp_la-gstgdpdepay.lo `test -f 'gstgdpdepay.c' || echo '$(srcdir)/'`gstgdpdepay.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstgdp -:SHARED libgstgdp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstgdp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgdp_la_CFLAGS) \
+ -:LDFLAGS $(libgstgdp_la_LDFLAGS) \
+ $(libgstgdp_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/gdp/README b/gst/gdp/README
new file mode 100644
index 0000000..6b84afc
--- /dev/null
+++ b/gst/gdp/README
@@ -0,0 +1,22 @@
+Sample pipelines:
+- replacing tcpserversink protocol=gdp with gdppay ! tcpserversink:
+ - raw audio:
+ - server:
+ gst-launch -v audiotestsrc ! gdppay version=0.2 ! tcpserversink
+ - client:
+ gst-launch -v tcpclientsrc protocol=gdp ! alsasink sync=FALSE
+
+ - vorbis packets:
+ - server:
+ gst-launch -v audiotestsrc ! audioconvert ! vorbisenc ! gdppay version=0.2 ! tcpserversink
+ - client:
+ gst-launch -v tcpclientsrc protocol=gdp ! vorbisdec ! audioconvert ! alsasink sync=FALSE
+
+ - ogg packets:
+ - server:
+ gst-launch -v audiotestsrc ! audioconvert ! vorbisenc ! oggmux ! gdppay version=0.2 ! tcpserversink
+ - client:
+ gst-launch -v tcpclientsrc protocol=gdp ! oggdemux ! vorbisdec ! audioconvert ! alsasink sync=FALSE
+
+ In all the client pipelines, tcpclientsrc protocol=gdp can be replaced with
+ tcpclientsrc ! gdpdepay
diff --git a/gst/gdp/gstgdp.c b/gst/gdp/gstgdp.c
new file mode 100644
index 0000000..31d3259
--- /dev/null
+++ b/gst/gdp/gstgdp.c
@@ -0,0 +1,46 @@
+/* GStreamer
+ * Copyright (C) 2006 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/dataprotocol/dataprotocol.h>
+
+#include "gstgdppay.h"
+#include "gstgdpdepay.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_dp_init ();
+
+ if (!gst_gdp_depay_plugin_init (plugin))
+ return FALSE;
+
+ if (!gst_gdp_pay_plugin_init (plugin))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,
+ "gdp",
+ "Payload/depayload GDP packets", plugin_init,
+ VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/gdp/gstgdpdepay.c b/gst/gdp/gstgdpdepay.c
new file mode 100644
index 0000000..b608977
--- /dev/null
+++ b/gst/gdp/gstgdpdepay.c
@@ -0,0 +1,479 @@
+/* GStreamer
+ * Copyright (C) 2006 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.
+ */
+
+/**
+ * SECTION:element-gdpdepay
+ * @see_also: gdppay
+ *
+ * This element depayloads GStreamer Data Protocol buffers back to deserialized
+ * buffers and events.
+ *
+ * <refsect2>
+ * |[
+ * gst-launch -v -m filesrc location=test.gdp ! gdpdepay ! xvimagesink
+ * ]| This pipeline plays back a serialized video stream as created in the
+ * example for gdppay.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/dataprotocol/dataprotocol.h>
+
+#include "gstgdpdepay.h"
+
+enum
+{
+ PROP_0,
+};
+
+static GstStaticPadTemplate gdp_depay_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-gdp"));
+
+static GstStaticPadTemplate gdp_depay_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_gdp_depay_debug);
+#define GST_CAT_DEFAULT gst_gdp_depay_debug
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_gdp_depay_debug, "gdpdepay", 0, \
+ "GDP depayloader");
+#define gst_gdp_depay_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGDPDepay, gst_gdp_depay,
+ GST_TYPE_ELEMENT, _do_init);
+
+static gboolean gst_gdp_depay_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_gdp_depay_src_event (GstPad * pad, GstEvent * event);
+
+static GstFlowReturn gst_gdp_depay_chain (GstPad * pad, GstBuffer * buffer);
+
+static GstStateChangeReturn gst_gdp_depay_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_gdp_depay_finalize (GObject * object);
+
+static void
+gst_gdp_depay_class_init (GstGDPDepayClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "GDP Depayloader", "GDP/Depayloader",
+ "Depayloads GStreamer Data Protocol buffers",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gdp_depay_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gdp_depay_src_template));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_gdp_depay_change_state);
+ gobject_class->finalize = gst_gdp_depay_finalize;
+}
+
+static void
+gst_gdp_depay_init (GstGDPDepay * gdpdepay)
+{
+ gdpdepay->sinkpad =
+ gst_pad_new_from_static_template (&gdp_depay_sink_template, "sink");
+ gst_pad_set_chain_function (gdpdepay->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_depay_chain));
+ gst_pad_set_event_function (gdpdepay->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_depay_sink_event));
+ gst_element_add_pad (GST_ELEMENT (gdpdepay), gdpdepay->sinkpad);
+
+ gdpdepay->srcpad =
+ gst_pad_new_from_static_template (&gdp_depay_src_template, "src");
+ gst_pad_set_event_function (gdpdepay->srcpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_depay_src_event));
+ /* our caps will always be decided by the incoming GDP caps buffers */
+ gst_pad_use_fixed_caps (gdpdepay->srcpad);
+ gst_element_add_pad (GST_ELEMENT (gdpdepay), gdpdepay->srcpad);
+
+ gdpdepay->adapter = gst_adapter_new ();
+}
+
+static void
+gst_gdp_depay_finalize (GObject * gobject)
+{
+ GstGDPDepay *this;
+
+ this = GST_GDP_DEPAY (gobject);
+ if (this->caps)
+ gst_caps_unref (this->caps);
+ g_free (this->header);
+ gst_adapter_clear (this->adapter);
+ g_object_unref (this->adapter);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (gobject));
+}
+
+static gboolean
+gst_gdp_depay_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstGDPDepay *this;
+ gboolean res = TRUE;
+
+ this = GST_GDP_DEPAY (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ /* forward flush start */
+ res = gst_pad_push_event (this->srcpad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ /* clear adapter on flush */
+ gst_adapter_clear (this->adapter);
+ /* forward flush stop */
+ res = gst_pad_push_event (this->srcpad, event);
+ break;
+ case GST_EVENT_EOS:
+ /* after EOS, we don't expect to output anything anymore */
+ res = gst_pad_push_event (this->srcpad, event);
+ break;
+ case GST_EVENT_SEGMENT:
+ case GST_EVENT_TAG:
+ case GST_EVENT_BUFFERSIZE:
+ default:
+ /* we unref most events as we take them from the datastream */
+ gst_event_unref (event);
+ break;
+ }
+ gst_object_unref (this);
+
+ return res;
+}
+
+static gboolean
+gst_gdp_depay_src_event (GstPad * pad, GstEvent * event)
+{
+ GstGDPDepay *this;
+ gboolean res = TRUE;
+
+ this = GST_GDP_DEPAY (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ /* we refuse seek for now. */
+ gst_event_unref (event);
+ res = FALSE;
+ break;
+ case GST_EVENT_QOS:
+ case GST_EVENT_NAVIGATION:
+ default:
+ /* everything else is passed */
+ res = gst_pad_push_event (this->sinkpad, event);
+ break;
+ }
+ gst_object_unref (this);
+
+ return res;
+}
+
+static GstFlowReturn
+gst_gdp_depay_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstGDPDepay *this;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstCaps *caps;
+ GstBuffer *buf;
+ GstEvent *event;
+ guint available;
+
+ this = GST_GDP_DEPAY (gst_pad_get_parent (pad));
+
+ /* On DISCONT, get rid of accumulated data. We assume a buffer after the
+ * DISCONT contains (part of) a new valid header, if not we error because we
+ * lost sync */
+ if (GST_BUFFER_IS_DISCONT (buffer)) {
+ gst_adapter_clear (this->adapter);
+ this->state = GST_GDP_DEPAY_STATE_HEADER;
+ }
+ gst_adapter_push (this->adapter, buffer);
+
+ while (TRUE) {
+ switch (this->state) {
+ case GST_GDP_DEPAY_STATE_HEADER:
+ {
+ guint8 *header;
+
+ /* collect a complete header, validate and store the header. Figure out
+ * the payload length and switch to the PAYLOAD state */
+ available = gst_adapter_available (this->adapter);
+ if (available < GST_DP_HEADER_LENGTH)
+ goto done;
+
+ GST_LOG_OBJECT (this, "reading GDP header from adapter");
+ header = gst_adapter_take (this->adapter, GST_DP_HEADER_LENGTH);
+ if (!gst_dp_validate_header (GST_DP_HEADER_LENGTH, header)) {
+ g_free (header);
+ goto header_validate_error;
+ }
+
+ /* store types and payload length. Also store the header, which we need
+ * to make the payload. */
+ this->payload_length = gst_dp_header_payload_length (header);
+ this->payload_type = gst_dp_header_payload_type (header);
+ /* free previous header and store new one. */
+ g_free (this->header);
+ this->header = header;
+
+ GST_LOG_OBJECT (this,
+ "read GDP header, payload size %d, payload type %d, switching to state PAYLOAD",
+ this->payload_length, this->payload_type);
+ this->state = GST_GDP_DEPAY_STATE_PAYLOAD;
+ break;
+ }
+ case GST_GDP_DEPAY_STATE_PAYLOAD:
+ {
+ /* in this state we wait for all the payload data to be available in the
+ * adapter. Then we switch to the state where we actually process the
+ * payload. */
+ available = gst_adapter_available (this->adapter);
+ if (available < this->payload_length)
+ goto done;
+
+ /* change state based on type */
+ if (this->payload_type == GST_DP_PAYLOAD_BUFFER) {
+ GST_LOG_OBJECT (this, "switching to state BUFFER");
+ this->state = GST_GDP_DEPAY_STATE_BUFFER;
+ } else if (this->payload_type == GST_DP_PAYLOAD_CAPS) {
+ GST_LOG_OBJECT (this, "switching to state CAPS");
+ this->state = GST_GDP_DEPAY_STATE_CAPS;
+ } else if (this->payload_type >= GST_DP_PAYLOAD_EVENT_NONE) {
+ GST_LOG_OBJECT (this, "switching to state EVENT");
+ this->state = GST_GDP_DEPAY_STATE_EVENT;
+ } else {
+ goto wrong_type;
+ }
+
+ if (this->payload_length) {
+ const guint8 *data;
+ gboolean res;
+
+ data = gst_adapter_map (this->adapter, this->payload_length);
+ res = gst_dp_validate_payload (GST_DP_HEADER_LENGTH, this->header,
+ data);
+ gst_adapter_unmap (this->adapter, 0);
+
+ if (!res)
+ goto payload_validate_error;
+ }
+
+ break;
+ }
+ case GST_GDP_DEPAY_STATE_BUFFER:
+ {
+ /* if we receive a buffer without caps first, we error out */
+ if (!this->caps)
+ goto no_caps;
+
+ GST_LOG_OBJECT (this, "reading GDP buffer from adapter");
+ buf = gst_dp_buffer_from_header (GST_DP_HEADER_LENGTH, this->header);
+ if (!buf)
+ goto buffer_failed;
+
+ /* now take the payload if there is any */
+ if (this->payload_length > 0) {
+ guint8 *payload;
+
+ payload = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ gst_adapter_copy (this->adapter, payload, 0, this->payload_length);
+ gst_buffer_unmap (buf, payload, this->payload_length);
+
+ gst_adapter_flush (this->adapter, this->payload_length);
+ }
+
+ /* set caps and push */
+ GST_LOG_OBJECT (this, "deserialized buffer %p, pushing, timestamp %"
+ GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
+ ", offset %" G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT
+ ", size %" G_GSIZE_FORMAT ", flags 0x%x",
+ buf,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)),
+ GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf),
+ gst_buffer_get_size (buf), GST_BUFFER_FLAGS (buf));
+ ret = gst_pad_push (this->srcpad, buf);
+ if (ret != GST_FLOW_OK)
+ goto push_error;
+
+ GST_LOG_OBJECT (this, "switching to state HEADER");
+ this->state = GST_GDP_DEPAY_STATE_HEADER;
+ break;
+ }
+ case GST_GDP_DEPAY_STATE_CAPS:
+ {
+ guint8 *payload;
+
+ /* take the payload of the caps */
+ GST_LOG_OBJECT (this, "reading GDP caps from adapter");
+ payload = gst_adapter_take (this->adapter, this->payload_length);
+ caps = gst_dp_caps_from_packet (GST_DP_HEADER_LENGTH, this->header,
+ payload);
+ g_free (payload);
+ if (!caps)
+ goto caps_failed;
+
+ GST_DEBUG_OBJECT (this, "deserialized caps %" GST_PTR_FORMAT, caps);
+ gst_caps_replace (&(this->caps), caps);
+ gst_pad_set_caps (this->srcpad, caps);
+ /* drop the creation ref we still have */
+ gst_caps_unref (caps);
+
+ GST_LOG_OBJECT (this, "switching to state HEADER");
+ this->state = GST_GDP_DEPAY_STATE_HEADER;
+ break;
+ }
+ case GST_GDP_DEPAY_STATE_EVENT:
+ {
+ guint8 *payload;
+
+ GST_LOG_OBJECT (this, "reading GDP event from adapter");
+
+ /* adapter doesn't like 0 length payload */
+ if (this->payload_length > 0)
+ payload = gst_adapter_take (this->adapter, this->payload_length);
+ else
+ payload = NULL;
+ event = gst_dp_event_from_packet (GST_DP_HEADER_LENGTH, this->header,
+ payload);
+ g_free (payload);
+ if (!event)
+ goto event_failed;
+
+ GST_DEBUG_OBJECT (this, "deserialized event %p of type %s, pushing",
+ event, gst_event_type_get_name (event->type));
+ gst_pad_push_event (this->srcpad, event);
+
+ GST_LOG_OBJECT (this, "switching to state HEADER");
+ this->state = GST_GDP_DEPAY_STATE_HEADER;
+ break;
+ }
+ }
+ }
+
+done:
+ gst_object_unref (this);
+ return ret;
+
+ /* ERRORS */
+header_validate_error:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("GDP packet header does not validate"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+payload_validate_error:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("GDP packet payload does not validate"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+wrong_type:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("GDP packet header is of wrong type"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+no_caps:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("Received a buffer without first receiving caps"));
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
+ }
+buffer_failed:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("could not create buffer from GDP packet"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+push_error:
+ {
+ GST_WARNING_OBJECT (this, "pushing depayloaded buffer returned %d", ret);
+ goto done;
+ }
+caps_failed:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("could not create caps from GDP packet"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+event_failed:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, DECODE, (NULL),
+ ("could not create event from GDP packet"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static GstStateChangeReturn
+gst_gdp_depay_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstGDPDepay *this = GST_GDP_DEPAY (element);
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ if (this->caps) {
+ gst_caps_unref (this->caps);
+ this->caps = NULL;
+ }
+ gst_adapter_clear (this->adapter);
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+gboolean
+gst_gdp_depay_plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "gdpdepay", GST_RANK_NONE,
+ GST_TYPE_GDP_DEPAY))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/gst/gdp/gstgdpdepay.h b/gst/gdp/gstgdpdepay.h
new file mode 100644
index 0000000..64b7db2
--- /dev/null
+++ b/gst/gdp/gstgdpdepay.h
@@ -0,0 +1,82 @@
+/* GStreamer
+ * Copyright (C) 2006 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.
+ */
+
+#ifndef __GST_GDP_DEPAY_H__
+#define __GST_GDP_DEPAY_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GDP_DEPAY \
+ (gst_gdp_depay_get_type())
+#define GST_GDP_DEPAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDP_DEPAY,GstGDPDepay))
+#define GST_GDP_DEPAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDP_DEPAY,GstGDPDepayClass))
+#define GST_IS_GDP_DEPAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDP_DEPAY))
+#define GST_IS_GDP_DEPAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDP_DEPAY))
+
+typedef enum {
+ GST_GDP_DEPAY_STATE_HEADER = 0,
+ GST_GDP_DEPAY_STATE_PAYLOAD,
+ GST_GDP_DEPAY_STATE_BUFFER,
+ GST_GDP_DEPAY_STATE_CAPS,
+ GST_GDP_DEPAY_STATE_EVENT,
+} GstGDPDepayState;
+
+
+typedef struct _GstGDPDepay GstGDPDepay;
+typedef struct _GstGDPDepayClass GstGDPDepayClass;
+
+/**
+ * GstGDPDepay:
+ *
+ * Private gdpdepay element structure.
+ */
+struct _GstGDPDepay
+{
+ GstElement element;
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstAdapter *adapter;
+ GstGDPDepayState state;
+ GstCaps *caps;
+
+ guint8 *header;
+ guint32 payload_length;
+ GstDPPayloadType payload_type;
+};
+
+struct _GstGDPDepayClass
+{
+ GstElementClass parent_class;
+};
+
+gboolean gst_gdp_depay_plugin_init (GstPlugin * plugin);
+
+GType gst_gdp_depay_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GDP_DEPAY_H__ */
diff --git a/gst/gdp/gstgdppay.c b/gst/gdp/gstgdppay.c
new file mode 100644
index 0000000..6c59dfa
--- /dev/null
+++ b/gst/gdp/gstgdppay.c
@@ -0,0 +1,895 @@
+/* GStreamer
+ * Copyright (C) 2006 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.
+ */
+
+/**
+ * SECTION:element-gdppay
+ * @see_also: gdpdepay
+ *
+ * This element payloads GStreamer buffers and events using the
+ * GStreamer Data Protocol.
+ *
+ * <refsect2>
+ * |[
+ * gst-launch -v -m videotestsrc num-buffers=50 ! gdppay ! filesink location=test.gdp
+ * ]| This pipeline creates a serialized video stream that can be played back
+ * with the example shown in gdpdepay.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/dataprotocol/dataprotocol.h>
+
+#include "gstgdppay.h"
+
+static GstStaticPadTemplate gdp_pay_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate gdp_pay_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-gdp"));
+
+GST_DEBUG_CATEGORY_STATIC (gst_gdp_pay_debug);
+#define GST_CAT_DEFAULT gst_gdp_pay_debug
+
+#define DEFAULT_CRC_HEADER TRUE
+#define DEFAULT_CRC_PAYLOAD FALSE
+#define DEFAULT_VERSION GST_DP_VERSION_1_0
+
+enum
+{
+ PROP_0,
+ PROP_CRC_HEADER,
+ PROP_CRC_PAYLOAD,
+ PROP_VERSION,
+};
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_gdp_pay_debug, "gdppay", 0, \
+ "GDP payloader");
+#define gst_gdp_pay_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstGDPPay, gst_gdp_pay, GST_TYPE_ELEMENT, _do_init);
+
+static void gst_gdp_pay_reset (GstGDPPay * this);
+
+static GstFlowReturn gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_gdp_pay_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event);
+
+static GstStateChangeReturn gst_gdp_pay_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_gdp_pay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_gdp_pay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void gst_gdp_pay_finalize (GObject * gobject);
+
+static void
+gst_gdp_pay_class_init (GstGDPPayClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->set_property = gst_gdp_pay_set_property;
+ gobject_class->get_property = gst_gdp_pay_get_property;
+ gobject_class->finalize = gst_gdp_pay_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_CRC_HEADER,
+ g_param_spec_boolean ("crc-header", "CRC Header",
+ "Calculate and store a CRC checksum on the header",
+ DEFAULT_CRC_HEADER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CRC_PAYLOAD,
+ g_param_spec_boolean ("crc-payload", "CRC Payload",
+ "Calculate and store a CRC checksum on the payload",
+ DEFAULT_CRC_PAYLOAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_VERSION,
+ g_param_spec_enum ("version", "Version",
+ "Version of the GStreamer Data Protocol",
+ GST_TYPE_DP_VERSION, DEFAULT_VERSION,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "GDP Payloader", "GDP/Payloader",
+ "Payloads GStreamer Data Protocol buffers",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gdp_pay_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gdp_pay_src_template));
+
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_gdp_pay_change_state);
+}
+
+static void
+gst_gdp_pay_init (GstGDPPay * gdppay)
+{
+ gdppay->sinkpad =
+ gst_pad_new_from_static_template (&gdp_pay_sink_template, "sink");
+ gst_pad_set_chain_function (gdppay->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_pay_chain));
+ gst_pad_set_event_function (gdppay->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_pay_sink_event));
+ gst_element_add_pad (GST_ELEMENT (gdppay), gdppay->sinkpad);
+
+ gdppay->srcpad =
+ gst_pad_new_from_static_template (&gdp_pay_src_template, "src");
+ gst_pad_set_event_function (gdppay->srcpad,
+ GST_DEBUG_FUNCPTR (gst_gdp_pay_src_event));
+ gst_element_add_pad (GST_ELEMENT (gdppay), gdppay->srcpad);
+
+ gdppay->crc_header = DEFAULT_CRC_HEADER;
+ gdppay->crc_payload = DEFAULT_CRC_PAYLOAD;
+ gdppay->header_flag = gdppay->crc_header | gdppay->crc_payload;
+ gdppay->version = DEFAULT_VERSION;
+ gdppay->offset = 0;
+
+ gdppay->packetizer = gst_dp_packetizer_new (gdppay->version);
+}
+
+static void
+gst_gdp_pay_finalize (GObject * gobject)
+{
+ GstGDPPay *this = GST_GDP_PAY (gobject);
+
+ gst_gdp_pay_reset (this);
+ gst_dp_packetizer_free (this->packetizer);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (gobject));
+}
+
+static void
+gst_gdp_pay_reset (GstGDPPay * this)
+{
+ GST_DEBUG_OBJECT (this, "Resetting GDP object");
+ /* clear the queued buffers */
+ while (this->queue) {
+ GstBuffer *buffer;
+
+ buffer = GST_BUFFER_CAST (this->queue->data);
+
+ /* delete buffer from queue now */
+ this->queue = g_list_delete_link (this->queue, this->queue);
+
+ gst_buffer_unref (buffer);
+ }
+ if (this->caps) {
+ gst_caps_unref (this->caps);
+ this->caps = NULL;
+ }
+ if (this->caps_buf) {
+ gst_buffer_unref (this->caps_buf);
+ this->caps_buf = NULL;
+ }
+ if (this->tag_buf) {
+ gst_buffer_unref (this->tag_buf);
+ this->tag_buf = NULL;
+ }
+ if (this->new_segment_buf) {
+ gst_buffer_unref (this->new_segment_buf);
+ this->new_segment_buf = NULL;
+ }
+ this->sent_streamheader = FALSE;
+ this->offset = 0;
+}
+
+/* set OFFSET and OFFSET_END with running count */
+static void
+gst_gdp_stamp_buffer (GstGDPPay * this, GstBuffer * buffer)
+{
+ GST_BUFFER_OFFSET (buffer) = this->offset;
+ GST_BUFFER_OFFSET_END (buffer) = this->offset + gst_buffer_get_size (buffer);
+ this->offset = GST_BUFFER_OFFSET_END (buffer);
+}
+
+static GstBuffer *
+gst_gdp_buffer_from_caps (GstGDPPay * this, GstCaps * caps)
+{
+ GstBuffer *headerbuf;
+ GstBuffer *payloadbuf;
+ guint8 *header, *payload;
+ guint len, plen;
+
+ if (!this->packetizer->packet_from_caps (caps, this->header_flag, &len,
+ &header, &payload))
+ goto packet_failed;
+
+ GST_LOG_OBJECT (this, "creating GDP header and payload buffer from caps");
+ headerbuf = gst_buffer_new ();
+ gst_buffer_take_memory (headerbuf, -1,
+ gst_memory_new_wrapped (0, header, g_free, len, 0, len));
+
+ payloadbuf = gst_buffer_new ();
+ plen = gst_dp_header_payload_length (header);
+ gst_buffer_take_memory (payloadbuf, -1,
+ gst_memory_new_wrapped (0, payload, g_free, plen, 0, plen));
+
+ return gst_buffer_join (headerbuf, payloadbuf);
+
+ /* ERRORS */
+packet_failed:
+ {
+ GST_WARNING_OBJECT (this, "could not create GDP header from caps");
+ return NULL;
+ }
+}
+
+static GstBuffer *
+gst_gdp_pay_buffer_from_buffer (GstGDPPay * this, GstBuffer * buffer)
+{
+ GstBuffer *headerbuf;
+ guint8 *header;
+ guint len;
+
+ if (!this->packetizer->header_from_buffer (buffer, this->header_flag, &len,
+ &header))
+ goto no_buffer;
+
+ GST_LOG_OBJECT (this, "creating GDP header and payload buffer from buffer");
+ headerbuf = gst_buffer_new ();
+ gst_buffer_take_memory (headerbuf, -1,
+ gst_memory_new_wrapped (0, header, g_free, len, 0, len));
+
+ /* we do not want to lose the ref on the incoming buffer */
+ gst_buffer_ref (buffer);
+
+ return gst_buffer_join (headerbuf, buffer);
+
+ /* ERRORS */
+no_buffer:
+ {
+ GST_WARNING_OBJECT (this, "could not create GDP header from buffer");
+ return NULL;
+ }
+}
+
+static GstBuffer *
+gst_gdp_buffer_from_event (GstGDPPay * this, GstEvent * event)
+{
+ GstBuffer *headerbuf;
+ GstBuffer *payloadbuf;
+ guint8 *header, *payload;
+ guint len, plen;
+ gboolean ret;
+
+ ret =
+ this->packetizer->packet_from_event (event, this->header_flag, &len,
+ &header, &payload);
+ if (!ret)
+ goto no_event;
+
+ GST_LOG_OBJECT (this, "creating GDP header and payload buffer from event");
+ headerbuf = gst_buffer_new ();
+ gst_buffer_take_memory (headerbuf, -1,
+ gst_memory_new_wrapped (0, header, g_free, len, 0, len));
+
+ payloadbuf = gst_buffer_new ();
+ plen = gst_dp_header_payload_length (header);
+ if (plen && payload != NULL) {
+ gst_buffer_take_memory (payloadbuf, -1,
+ gst_memory_new_wrapped (0, payload, g_free, plen, 0, plen));
+ }
+
+ return gst_buffer_join (headerbuf, payloadbuf);
+
+ /* ERRORS */
+no_event:
+ {
+ GST_WARNING_OBJECT (this, "could not create GDP header from event %s (%d)",
+ gst_event_type_get_name (event->type), event->type);
+ return NULL;
+ }
+}
+
+
+/* set our caps with streamheader, based on the latest newsegment and caps,
+ * and (possibly) GDP-serialized buffers of the streamheaders on the src pad */
+static GstFlowReturn
+gst_gdp_pay_reset_streamheader (GstGDPPay * this)
+{
+ GstCaps *caps;
+ /* We use copies of these to avoid circular refcounts */
+ GstBuffer *new_segment_buf, *caps_buf, *tag_buf;
+ GstStructure *structure;
+ GstFlowReturn r = GST_FLOW_OK;
+ gboolean version_one_zero = TRUE;
+
+ GValue array = { 0 };
+ GValue value = { 0 };
+
+ GST_DEBUG_OBJECT (this, "start");
+ /* In version 0.2, we didn't need or send new segment or tags */
+ if (this->version == GST_DP_VERSION_0_2)
+ version_one_zero = FALSE;
+
+ if (version_one_zero) {
+ if (!this->new_segment_buf || !this->caps_buf) {
+ GST_DEBUG_OBJECT (this, "1.0, missing new_segment or caps, returning");
+ return GST_FLOW_OK;
+ }
+ } else {
+ if (!this->caps_buf) {
+ GST_DEBUG_OBJECT (this, "0.2, missing caps, returning");
+ return GST_FLOW_OK;
+ }
+ }
+
+ /* put copies of the buffers in a fixed list
+ * Stamp the buffers with offset and offset_end as well.
+ * We do this here so the offsets match the order the buffers go out in */
+ g_value_init (&array, GST_TYPE_ARRAY);
+
+ if (version_one_zero) {
+ gst_gdp_stamp_buffer (this, this->new_segment_buf);
+ GST_DEBUG_OBJECT (this, "1.0, appending copy of new segment buffer %p",
+ this->new_segment_buf);
+ new_segment_buf = gst_buffer_copy (this->new_segment_buf);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, new_segment_buf);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ gst_buffer_unref (new_segment_buf);
+
+ if (this->tag_buf) {
+ gst_gdp_stamp_buffer (this, this->tag_buf);
+ GST_DEBUG_OBJECT (this, "1.0, appending current tags buffer %p",
+ this->tag_buf);
+ tag_buf = this->tag_buf;
+ this->tag_buf = NULL;
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, tag_buf);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ gst_buffer_unref (tag_buf);
+ }
+ }
+
+ gst_gdp_stamp_buffer (this, this->caps_buf);
+ GST_DEBUG_OBJECT (this, "appending copy of caps buffer %p", this->caps_buf);
+ caps_buf = gst_buffer_copy (this->caps_buf);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, caps_buf);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+ gst_buffer_unref (caps_buf);
+
+ /* we also need to add GDP serializations of the streamheaders of the
+ * incoming caps */
+ structure = gst_caps_get_structure (this->caps, 0);
+ if (gst_structure_has_field (structure, "streamheader")) {
+ const GValue *sh;
+
+ GArray *buffers;
+
+ GstBuffer *buffer;
+
+ int i;
+
+ sh = gst_structure_get_value (structure, "streamheader");
+ buffers = g_value_peek_pointer (sh);
+ GST_DEBUG_OBJECT (this,
+ "Need to serialize %d incoming streamheader buffers on ours",
+ buffers->len);
+ for (i = 0; i < buffers->len; ++i) {
+ GValue *bufval;
+
+ GstBuffer *outbuffer;
+
+ bufval = &g_array_index (buffers, GValue, i);
+ buffer = g_value_peek_pointer (bufval);
+ /* this buffer is deserialized by gdpdepay as a regular buffer,
+ it needs IN_CAPS, because it's a streamheader - otherwise it
+ is mixed with regular data buffers */
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
+
+ outbuffer = gst_gdp_pay_buffer_from_buffer (this, buffer);
+ if (!outbuffer) {
+ g_value_unset (&array);
+ goto no_buffer;
+ }
+
+ /* Setting IN_CAPS as other GDP event buffers */
+ GST_DEBUG_OBJECT (this,
+ "Setting IN_CAPS flag on outgoing buffer %" GST_PTR_FORMAT,
+ outbuffer);
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ GST_BUFFER_OFFSET (outbuffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (outbuffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_TIMESTAMP (outbuffer) = GST_CLOCK_TIME_NONE;
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_set_buffer (&value, outbuffer);
+ gst_value_array_append_value (&array, &value);
+ g_value_unset (&value);
+
+ gst_buffer_unref (outbuffer);
+ }
+ } else {
+ GST_DEBUG_OBJECT (this, "no streamheader to serialize");
+ }
+
+ GST_DEBUG_OBJECT (this, "%d serialized buffers on streamheaders",
+ gst_value_array_get_size (&array));
+ caps = gst_caps_from_string ("application/x-gdp");
+ structure = gst_caps_get_structure (caps, 0);
+
+ gst_structure_set_value (structure, "streamheader", &array);
+ g_value_unset (&array);
+
+ GST_DEBUG_OBJECT (this, "Setting caps on src pad %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (this->srcpad, caps);
+
+ /* if these are our first ever buffers, send out new_segment first */
+ if (!this->sent_streamheader) {
+ GstEvent *event;
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ event = gst_event_new_segment (&segment);
+
+ GST_DEBUG_OBJECT (this, "Sending out new_segment event %p", event);
+ if (!gst_pad_push_event (this->srcpad, event)) {
+ GST_WARNING_OBJECT (this, "pushing new segment failed");
+ r = GST_FLOW_ERROR;
+ goto done;
+ }
+ }
+
+ /* push out these streamheader buffers, then flush our internal queue */
+ GST_DEBUG_OBJECT (this, "Pushing GDP new_segment buffer %p with offset %"
+ G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT, this->new_segment_buf,
+ GST_BUFFER_OFFSET (this->new_segment_buf),
+ GST_BUFFER_OFFSET_END (this->new_segment_buf));
+ /* we stored these bufs with refcount 1, so make sure we keep a ref */
+ r = gst_pad_push (this->srcpad, gst_buffer_ref (this->new_segment_buf));
+ if (r != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (this, "pushing GDP newsegment buffer returned %d", r);
+ goto done;
+ }
+ if (this->tag_buf) {
+ GST_DEBUG_OBJECT (this, "Pushing GDP tag buffer %p", this->tag_buf);
+ /* we stored these bufs with refcount 1, so make sure we keep a ref */
+ r = gst_pad_push (this->srcpad, gst_buffer_ref (this->tag_buf));
+ if (r != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (this, "pushing GDP tag buffer returned %d", r);
+ goto done;
+ }
+ }
+ GST_DEBUG_OBJECT (this, "Pushing GDP caps buffer %p", this->caps_buf);
+ r = gst_pad_push (this->srcpad, gst_buffer_ref (this->caps_buf));
+ if (r != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (this, "pushing GDP caps buffer returned %d", r);
+ goto done;
+ }
+ this->sent_streamheader = TRUE;
+ GST_DEBUG_OBJECT (this, "need to push %d queued buffers",
+ g_list_length (this->queue));
+ while (this->queue) {
+ GstBuffer *buffer;
+
+ buffer = GST_BUFFER_CAST (this->queue->data);
+ GST_DEBUG_OBJECT (this, "Pushing queued GDP buffer %p", buffer);
+
+ /* delete buffer from queue now */
+ this->queue = g_list_delete_link (this->queue, this->queue);
+
+ /* set caps and push */
+ r = gst_pad_push (this->srcpad, buffer);
+ if (r != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (this, "pushing queued GDP buffer returned %d", r);
+ goto done;
+ }
+ }
+
+done:
+ gst_caps_unref (caps);
+ GST_DEBUG_OBJECT (this, "stop");
+ return r;
+
+ /* ERRORS */
+no_buffer:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, FORMAT, (NULL),
+ ("failed to create GDP buffer from streamheader"));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* queue a buffer internally if we haven't sent streamheader buffers yet;
+ * otherwise, just push on, this takes ownership of the buffer. */
+static GstFlowReturn
+gst_gdp_queue_buffer (GstGDPPay * this, GstBuffer * buffer)
+{
+ if (this->sent_streamheader) {
+ GST_LOG_OBJECT (this, "Pushing GDP buffer %p, caps %" GST_PTR_FORMAT,
+ buffer, this->caps);
+ return gst_pad_push (this->srcpad, buffer);
+ }
+
+ /* store it on an internal queue. buffer remains reffed. */
+ this->queue = g_list_append (this->queue, buffer);
+ GST_DEBUG_OBJECT (this, "streamheader not sent yet, "
+ "queued buffer %p, now %d buffers queued",
+ buffer, g_list_length (this->queue));
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstGDPPay *this;
+#if 0
+ GstCaps *caps;
+#endif
+ GstBuffer *outbuffer;
+ GstFlowReturn ret;
+
+ this = GST_GDP_PAY (gst_pad_get_parent (pad));
+
+ /* we should have received a new_segment before, otherwise it's a bug.
+ * fake one in that case */
+ if (!this->new_segment_buf) {
+ GstEvent *event;
+ GstSegment segment;
+
+ GST_WARNING_OBJECT (this,
+ "did not receive new-segment before first buffer");
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ event = gst_event_new_segment (&segment);
+ outbuffer = gst_gdp_buffer_from_event (this, event);
+ gst_event_unref (event);
+
+ /* GDP 0.2 doesn't know about new-segment, so this is not fatal */
+ if (!outbuffer) {
+ GST_ELEMENT_WARNING (this, STREAM, ENCODE, (NULL),
+ ("Could not create GDP buffer from new segment event"));
+ } else {
+ GST_BUFFER_TIMESTAMP (outbuffer) = GST_BUFFER_TIMESTAMP (buffer);
+ GST_BUFFER_DURATION (outbuffer) = 0;
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ GST_DEBUG_OBJECT (this, "Storing buffer %p as new_segment_buf",
+ outbuffer);
+ this->new_segment_buf = outbuffer;
+ }
+ }
+#if 0
+ /* make sure we've received caps before */
+ caps = gst_buffer_get_caps (buffer);
+ if (!this->caps && !caps)
+ goto no_caps;
+
+ /* if the caps have changed, process caps first */
+ if (caps && !gst_caps_is_equal (this->caps, caps)) {
+ GST_LOG_OBJECT (this, "caps changed to %p, %" GST_PTR_FORMAT, caps, caps);
+ gst_caps_replace (&(this->caps), caps);
+ outbuffer = gst_gdp_buffer_from_caps (this, caps);
+ if (!outbuffer)
+ goto no_caps_buffer;
+
+ GST_BUFFER_TIMESTAMP (outbuffer) = GST_BUFFER_TIMESTAMP (buffer);
+ GST_BUFFER_DURATION (outbuffer) = 0;
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+
+ if (this->caps_buf)
+ gst_buffer_unref (this->caps_buf);
+ this->caps_buf = outbuffer;
+ gst_gdp_pay_reset_streamheader (this);
+ }
+
+ if (caps)
+ gst_caps_unref (caps);
+#endif
+
+ /* create a GDP header packet,
+ * then create a GST buffer of the header packet and the buffer contents */
+ outbuffer = gst_gdp_pay_buffer_from_buffer (this, buffer);
+ if (!outbuffer)
+ goto no_buffer;
+
+ /* If the incoming buffer is IN_CAPS, that means we have it on the caps
+ * as streamheader, and we have serialized a GDP version of it and put it
+ * on our caps */
+ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS)) {
+ GST_DEBUG_OBJECT (this, "Setting IN_CAPS flag on outgoing buffer %p",
+ outbuffer);
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ }
+
+ gst_gdp_stamp_buffer (this, outbuffer);
+ GST_BUFFER_TIMESTAMP (outbuffer) = GST_BUFFER_TIMESTAMP (buffer);
+ GST_BUFFER_DURATION (outbuffer) = GST_BUFFER_DURATION (buffer);
+
+ ret = gst_gdp_queue_buffer (this, outbuffer);
+
+done:
+ gst_buffer_unref (buffer);
+ gst_object_unref (this);
+ return ret;
+
+ /* ERRORS */
+#if 0
+no_caps:
+ {
+ /* when returning a fatal error as a GstFlowReturn we must post an error
+ * message */
+ GST_ELEMENT_ERROR (this, STREAM, FORMAT, (NULL),
+ ("first received buffer does not have caps set"));
+ if (caps)
+ gst_caps_unref (caps);
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
+ }
+no_caps_buffer:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, ENCODE, (NULL),
+ ("Could not create GDP buffer from caps %" GST_PTR_FORMAT, caps));
+ gst_caps_unref (caps);
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+#endif
+no_buffer:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, ENCODE, (NULL),
+ ("Could not create GDP buffer from buffer"));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static gboolean
+gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstBuffer *outbuffer;
+ GstGDPPay *this = GST_GDP_PAY (gst_pad_get_parent (pad));
+ GstFlowReturn flowret;
+ GstCaps *caps;
+ gboolean ret = TRUE;
+
+ GST_DEBUG_OBJECT (this, "received event %p of type %s (%d)",
+ event, gst_event_type_get_name (event->type), event->type);
+
+ /* now turn the event into a buffer */
+ outbuffer = gst_gdp_buffer_from_event (this, event);
+ if (!outbuffer)
+ goto no_outbuffer;
+
+ GST_BUFFER_TIMESTAMP (outbuffer) = GST_EVENT_TIMESTAMP (event);
+ GST_BUFFER_DURATION (outbuffer) = 0;
+
+ /* if we got a new segment or tag event, we should put it on our streamheader,
+ * and not send it on */
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ GST_DEBUG_OBJECT (this, "Storing in caps buffer %p as new_segment_buf",
+ outbuffer);
+
+ if (this->new_segment_buf)
+ gst_buffer_unref (this->new_segment_buf);
+ this->new_segment_buf = outbuffer;
+
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ gst_gdp_pay_reset_streamheader (this);
+ break;
+ case GST_EVENT_CAPS:{
+ gst_event_parse_caps (event, &caps);
+ if (this->caps == NULL || !gst_caps_is_equal (this->caps, caps)) {
+ GST_INFO_OBJECT (pad, "caps changed to %" GST_PTR_FORMAT, caps);
+ gst_caps_replace (&this->caps, caps);
+ outbuffer = gst_gdp_buffer_from_caps (this, caps);
+ if (outbuffer == NULL)
+ goto no_buffer_from_caps;
+
+ GST_BUFFER_DURATION (outbuffer) = 0;
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ if (this->caps_buf)
+ gst_buffer_unref (this->caps_buf);
+ this->caps_buf = outbuffer;
+ gst_gdp_pay_reset_streamheader (this);
+ }
+ break;
+ }
+ case GST_EVENT_TAG:
+ GST_DEBUG_OBJECT (this, "Storing in caps buffer %p as tag_buf",
+ outbuffer);
+
+ if (this->tag_buf)
+ gst_buffer_unref (this->tag_buf);
+ this->tag_buf = outbuffer;
+
+ GST_BUFFER_FLAG_SET (outbuffer, GST_BUFFER_FLAG_IN_CAPS);
+ gst_gdp_pay_reset_streamheader (this);
+ break;
+ default:
+ GST_DEBUG_OBJECT (this, "queuing GDP buffer %p of event %p", outbuffer,
+ event);
+ flowret = gst_gdp_queue_buffer (this, outbuffer);
+ if (flowret != GST_FLOW_OK)
+ goto push_error;
+ break;
+ }
+
+ /* if we have EOS, we should send on EOS ourselves */
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ GST_DEBUG_OBJECT (this, "Sending on EOS event %p", event);
+ /* ref, we unref later again */
+ ret = gst_pad_push_event (this->srcpad, gst_event_ref (event));
+ }
+
+done:
+ gst_event_unref (event);
+ gst_object_unref (this);
+
+ return ret;
+
+ /* ERRORS */
+no_outbuffer:
+ {
+ GST_ELEMENT_WARNING (this, STREAM, ENCODE, (NULL),
+ ("Could not create GDP buffer from received event (type %s)",
+ gst_event_type_get_name (event->type)));
+ ret = FALSE;
+ goto done;
+ }
+no_buffer_from_caps:
+ {
+ GST_ELEMENT_ERROR (this, STREAM, ENCODE, (NULL),
+ ("Could not create GDP buffer from caps %" GST_PTR_FORMAT, caps));
+ ret = FALSE;
+ goto done;
+ }
+push_error:
+ {
+ GST_WARNING_OBJECT (this, "queueing GDP event buffer returned %d", flowret);
+ ret = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_gdp_pay_src_event (GstPad * pad, GstEvent * event)
+{
+ GstGDPPay *this;
+ gboolean res = TRUE;
+
+ this = GST_GDP_PAY (gst_pad_get_parent (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ /* we refuse seek for now. */
+ gst_event_unref (event);
+ res = FALSE;
+ break;
+ case GST_EVENT_QOS:
+ case GST_EVENT_NAVIGATION:
+ default:
+ /* everything else is passed */
+ res = gst_pad_push_event (this->sinkpad, event);
+ break;
+ }
+ gst_object_unref (this);
+
+ return res;
+}
+
+static void
+gst_gdp_pay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstGDPPay *this;
+
+ g_return_if_fail (GST_IS_GDP_PAY (object));
+ this = GST_GDP_PAY (object);
+
+ switch (prop_id) {
+ case PROP_CRC_HEADER:
+ this->crc_header =
+ g_value_get_boolean (value) ? GST_DP_HEADER_FLAG_CRC_HEADER : 0;
+ this->header_flag = this->crc_header | this->crc_payload;
+ break;
+ case PROP_CRC_PAYLOAD:
+ this->crc_payload =
+ g_value_get_boolean (value) ? GST_DP_HEADER_FLAG_CRC_PAYLOAD : 0;
+ this->header_flag = this->crc_header | this->crc_payload;
+ break;
+ case PROP_VERSION:
+ this->version = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_gdp_pay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstGDPPay *this;
+
+ g_return_if_fail (GST_IS_GDP_PAY (object));
+ this = GST_GDP_PAY (object);
+
+ switch (prop_id) {
+ case PROP_CRC_HEADER:
+ g_value_set_boolean (value, this->crc_header);
+ break;
+ case PROP_CRC_PAYLOAD:
+ g_value_set_boolean (value, this->crc_payload);
+ break;
+ case PROP_VERSION:
+ g_value_set_enum (value, this->version);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstStateChangeReturn
+gst_gdp_pay_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstGDPPay *this = GST_GDP_PAY (element);
+
+ switch (transition) {
+ 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:
+ gst_gdp_pay_reset (this);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+gboolean
+gst_gdp_pay_plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "gdppay", GST_RANK_NONE, GST_TYPE_GDP_PAY))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/gst/gdp/gstgdppay.h b/gst/gdp/gstgdppay.h
new file mode 100644
index 0000000..3e280b5
--- /dev/null
+++ b/gst/gdp/gstgdppay.h
@@ -0,0 +1,81 @@
+/* GStreamer
+ * Copyright (C) 2006 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.
+ */
+
+#ifndef __GST_GDP_PAY_H__
+#define __GST_GDP_PAY_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GDP_PAY \
+ (gst_gdp_pay_get_type())
+#define GST_GDP_PAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDP_PAY,GstGDPPay))
+#define GST_GDP_PAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDP_PAY,GstGDPPayClass))
+#define GST_IS_GDP_PAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDP_PAY))
+#define GST_IS_GDP_PAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDP_PAY))
+
+typedef struct _GstGDPPay GstGDPPay;
+typedef struct _GstGDPPayClass GstGDPPayClass;
+
+/**
+ * GstGDPPay:
+ *
+ * Private gdppay element structure.
+ */
+struct _GstGDPPay
+{
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ GstCaps *caps; /* incoming caps */
+
+ GstBuffer *caps_buf;
+ GstBuffer *new_segment_buf;
+ GstBuffer *tag_buf;
+
+ gboolean sent_streamheader; /* TRUE after the first streamheaders are sent */
+ GList *queue; /* list of queued buffers before streamheaders are sent */
+ guint64 offset;
+
+ gboolean crc_header;
+ gboolean crc_payload;
+ GstDPHeaderFlag header_flag;
+ GstDPVersion version;
+ GstDPPacketizer *packetizer;
+};
+
+struct _GstGDPPayClass
+{
+ GstElementClass parent_class;
+};
+
+gboolean gst_gdp_pay_plugin_init (GstPlugin * plugin);
+
+GType gst_gdp_pay_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_GDP_PAY_H__ */
diff --git a/gst/playback/Makefile.am b/gst/playback/Makefile.am
new file mode 100644
index 0000000..dbe93ec
--- /dev/null
+++ b/gst/playback/Makefile.am
@@ -0,0 +1,68 @@
+# variables used for enum/marshal generation
+glib_enum_define = GST_PLAY
+glib_gen_prefix = gst_play
+glib_gen_basename = gstplay
+
+built_sources = gstplay-marshal.c
+built_headers = gstplay-marshal.h
+
+plugin_LTLIBRARIES = libgstplayback.la
+
+csp_cflags = -DCOLORSPACE=\"videoconvert\"
+
+libgstplayback_la_SOURCES = \
+ gstdecodebin2.c \
+ gsturidecodebin.c \
+ gstplayback.c \
+ gstplaybin2.c \
+ gstplaysink.c \
+ gstplay-enum.c \
+ gststreamselector.c \
+ gstsubtitleoverlay.c \
+ gstplaysinkvideoconvert.c \
+ gstplaysinkaudioconvert.c \
+ gststreamsynchronizer.c
+
+nodist_libgstplayback_la_SOURCES = $(built_sources)
+libgstplayback_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(csp_cflags)
+libgstplayback_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstplayback_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+libgstplayback_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstplayback.h \
+ gstplaysink.h \
+ gstplay-enum.h \
+ gststreamselector.h \
+ gstrawcaps.h \
+ gstsubtitleoverlay.h \
+ gstplaysinkvideoconvert.h \
+ gstplaysinkaudioconvert.h \
+ gststreamsynchronizer.h
+
+BUILT_SOURCES = $(built_headers) $(built_sources)
+
+EXTRA_DIST = gstplay-marshal.list
+
+CLEANFILES = $(BUILT_SOURCES)
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstplayback -:SHARED libgstplayback \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstplayback_la_SOURCES) \
+ $(nodist_libgstplayback_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstplayback_la_CFLAGS) $(csp_cflags) \
+ -:LDFLAGS $(libgstplayback_la_LDFLAGS) \
+ $(libgstplayback_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/playback/Makefile.in b/gst/playback/Makefile.in
new file mode 100644
index 0000000..61f8abc
--- /dev/null
+++ b/gst/playback/Makefile.in
@@ -0,0 +1,974 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/playback
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstplayback_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+am_libgstplayback_la_OBJECTS = libgstplayback_la-gstdecodebin2.lo \
+ libgstplayback_la-gsturidecodebin.lo \
+ libgstplayback_la-gstplayback.lo \
+ libgstplayback_la-gstplaybin2.lo \
+ libgstplayback_la-gstplaysink.lo \
+ libgstplayback_la-gstplay-enum.lo \
+ libgstplayback_la-gststreamselector.lo \
+ libgstplayback_la-gstsubtitleoverlay.lo \
+ libgstplayback_la-gstplaysinkvideoconvert.lo \
+ libgstplayback_la-gstplaysinkaudioconvert.lo \
+ libgstplayback_la-gststreamsynchronizer.lo
+am__objects_1 = libgstplayback_la-gstplay-marshal.lo
+nodist_libgstplayback_la_OBJECTS = $(am__objects_1)
+libgstplayback_la_OBJECTS = $(am_libgstplayback_la_OBJECTS) \
+ $(nodist_libgstplayback_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstplayback_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstplayback_la_CFLAGS) $(CFLAGS) \
+ $(libgstplayback_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstplayback_la_SOURCES) \
+ $(nodist_libgstplayback_la_SOURCES)
+DIST_SOURCES = $(libgstplayback_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+
+# variables used for enum/marshal generation
+glib_enum_define = GST_PLAY
+glib_gen_prefix = gst_play
+glib_gen_basename = gstplay
+built_sources = gstplay-marshal.c
+built_headers = gstplay-marshal.h
+plugin_LTLIBRARIES = libgstplayback.la
+csp_cflags = -DCOLORSPACE=\"videoconvert\"
+libgstplayback_la_SOURCES = \
+ gstdecodebin2.c \
+ gsturidecodebin.c \
+ gstplayback.c \
+ gstplaybin2.c \
+ gstplaysink.c \
+ gstplay-enum.c \
+ gststreamselector.c \
+ gstsubtitleoverlay.c \
+ gstplaysinkvideoconvert.c \
+ gstplaysinkaudioconvert.c \
+ gststreamsynchronizer.c
+
+nodist_libgstplayback_la_SOURCES = $(built_sources)
+libgstplayback_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(csp_cflags)
+libgstplayback_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstplayback_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+
+libgstplayback_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstplayback.h \
+ gstplaysink.h \
+ gstplay-enum.h \
+ gststreamselector.h \
+ gstrawcaps.h \
+ gstsubtitleoverlay.h \
+ gstplaysinkvideoconvert.h \
+ gstplaysinkaudioconvert.h \
+ gststreamsynchronizer.h
+
+BUILT_SOURCES = $(built_headers) $(built_sources)
+EXTRA_DIST = gstplay-marshal.list
+CLEANFILES = $(BUILT_SOURCES)
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(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/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/playback/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/playback/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
+libgstplayback.la: $(libgstplayback_la_OBJECTS) $(libgstplayback_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstplayback_la_LINK) -rpath $(plugindir) $(libgstplayback_la_OBJECTS) $(libgstplayback_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstdecodebin2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplay-enum.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplay-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplayback.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplaybin2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplaysink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplaysinkaudioconvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstplaysinkvideoconvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gststreamselector.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gststreamsynchronizer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gstsubtitleoverlay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayback_la-gsturidecodebin.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstplayback_la-gstdecodebin2.lo: gstdecodebin2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstdecodebin2.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstdecodebin2.Tpo -c -o libgstplayback_la-gstdecodebin2.lo `test -f 'gstdecodebin2.c' || echo '$(srcdir)/'`gstdecodebin2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstdecodebin2.Tpo $(DEPDIR)/libgstplayback_la-gstdecodebin2.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdecodebin2.c' object='libgstplayback_la-gstdecodebin2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstdecodebin2.lo `test -f 'gstdecodebin2.c' || echo '$(srcdir)/'`gstdecodebin2.c
+
+libgstplayback_la-gsturidecodebin.lo: gsturidecodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gsturidecodebin.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gsturidecodebin.Tpo -c -o libgstplayback_la-gsturidecodebin.lo `test -f 'gsturidecodebin.c' || echo '$(srcdir)/'`gsturidecodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gsturidecodebin.Tpo $(DEPDIR)/libgstplayback_la-gsturidecodebin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsturidecodebin.c' object='libgstplayback_la-gsturidecodebin.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gsturidecodebin.lo `test -f 'gsturidecodebin.c' || echo '$(srcdir)/'`gsturidecodebin.c
+
+libgstplayback_la-gstplayback.lo: gstplayback.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplayback.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplayback.Tpo -c -o libgstplayback_la-gstplayback.lo `test -f 'gstplayback.c' || echo '$(srcdir)/'`gstplayback.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplayback.Tpo $(DEPDIR)/libgstplayback_la-gstplayback.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplayback.c' object='libgstplayback_la-gstplayback.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplayback.lo `test -f 'gstplayback.c' || echo '$(srcdir)/'`gstplayback.c
+
+libgstplayback_la-gstplaybin2.lo: gstplaybin2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplaybin2.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplaybin2.Tpo -c -o libgstplayback_la-gstplaybin2.lo `test -f 'gstplaybin2.c' || echo '$(srcdir)/'`gstplaybin2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplaybin2.Tpo $(DEPDIR)/libgstplayback_la-gstplaybin2.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplaybin2.c' object='libgstplayback_la-gstplaybin2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplaybin2.lo `test -f 'gstplaybin2.c' || echo '$(srcdir)/'`gstplaybin2.c
+
+libgstplayback_la-gstplaysink.lo: gstplaysink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplaysink.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplaysink.Tpo -c -o libgstplayback_la-gstplaysink.lo `test -f 'gstplaysink.c' || echo '$(srcdir)/'`gstplaysink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplaysink.Tpo $(DEPDIR)/libgstplayback_la-gstplaysink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplaysink.c' object='libgstplayback_la-gstplaysink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplaysink.lo `test -f 'gstplaysink.c' || echo '$(srcdir)/'`gstplaysink.c
+
+libgstplayback_la-gstplay-enum.lo: gstplay-enum.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplay-enum.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplay-enum.Tpo -c -o libgstplayback_la-gstplay-enum.lo `test -f 'gstplay-enum.c' || echo '$(srcdir)/'`gstplay-enum.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplay-enum.Tpo $(DEPDIR)/libgstplayback_la-gstplay-enum.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplay-enum.c' object='libgstplayback_la-gstplay-enum.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplay-enum.lo `test -f 'gstplay-enum.c' || echo '$(srcdir)/'`gstplay-enum.c
+
+libgstplayback_la-gststreamselector.lo: gststreamselector.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gststreamselector.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gststreamselector.Tpo -c -o libgstplayback_la-gststreamselector.lo `test -f 'gststreamselector.c' || echo '$(srcdir)/'`gststreamselector.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gststreamselector.Tpo $(DEPDIR)/libgstplayback_la-gststreamselector.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gststreamselector.c' object='libgstplayback_la-gststreamselector.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gststreamselector.lo `test -f 'gststreamselector.c' || echo '$(srcdir)/'`gststreamselector.c
+
+libgstplayback_la-gstsubtitleoverlay.lo: gstsubtitleoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstsubtitleoverlay.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstsubtitleoverlay.Tpo -c -o libgstplayback_la-gstsubtitleoverlay.lo `test -f 'gstsubtitleoverlay.c' || echo '$(srcdir)/'`gstsubtitleoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstsubtitleoverlay.Tpo $(DEPDIR)/libgstplayback_la-gstsubtitleoverlay.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsubtitleoverlay.c' object='libgstplayback_la-gstsubtitleoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstsubtitleoverlay.lo `test -f 'gstsubtitleoverlay.c' || echo '$(srcdir)/'`gstsubtitleoverlay.c
+
+libgstplayback_la-gstplaysinkvideoconvert.lo: gstplaysinkvideoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplaysinkvideoconvert.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplaysinkvideoconvert.Tpo -c -o libgstplayback_la-gstplaysinkvideoconvert.lo `test -f 'gstplaysinkvideoconvert.c' || echo '$(srcdir)/'`gstplaysinkvideoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplaysinkvideoconvert.Tpo $(DEPDIR)/libgstplayback_la-gstplaysinkvideoconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplaysinkvideoconvert.c' object='libgstplayback_la-gstplaysinkvideoconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplaysinkvideoconvert.lo `test -f 'gstplaysinkvideoconvert.c' || echo '$(srcdir)/'`gstplaysinkvideoconvert.c
+
+libgstplayback_la-gstplaysinkaudioconvert.lo: gstplaysinkaudioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplaysinkaudioconvert.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplaysinkaudioconvert.Tpo -c -o libgstplayback_la-gstplaysinkaudioconvert.lo `test -f 'gstplaysinkaudioconvert.c' || echo '$(srcdir)/'`gstplaysinkaudioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplaysinkaudioconvert.Tpo $(DEPDIR)/libgstplayback_la-gstplaysinkaudioconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplaysinkaudioconvert.c' object='libgstplayback_la-gstplaysinkaudioconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplaysinkaudioconvert.lo `test -f 'gstplaysinkaudioconvert.c' || echo '$(srcdir)/'`gstplaysinkaudioconvert.c
+
+libgstplayback_la-gststreamsynchronizer.lo: gststreamsynchronizer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gststreamsynchronizer.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gststreamsynchronizer.Tpo -c -o libgstplayback_la-gststreamsynchronizer.lo `test -f 'gststreamsynchronizer.c' || echo '$(srcdir)/'`gststreamsynchronizer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gststreamsynchronizer.Tpo $(DEPDIR)/libgstplayback_la-gststreamsynchronizer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gststreamsynchronizer.c' object='libgstplayback_la-gststreamsynchronizer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gststreamsynchronizer.lo `test -f 'gststreamsynchronizer.c' || echo '$(srcdir)/'`gststreamsynchronizer.c
+
+libgstplayback_la-gstplay-marshal.lo: gstplay-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -MT libgstplayback_la-gstplay-marshal.lo -MD -MP -MF $(DEPDIR)/libgstplayback_la-gstplay-marshal.Tpo -c -o libgstplayback_la-gstplay-marshal.lo `test -f 'gstplay-marshal.c' || echo '$(srcdir)/'`gstplay-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayback_la-gstplay-marshal.Tpo $(DEPDIR)/libgstplayback_la-gstplay-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplay-marshal.c' object='libgstplayback_la-gstplay-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstplayback_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayback_la_CFLAGS) $(CFLAGS) -c -o libgstplayback_la-gstplay-marshal.lo `test -f 'gstplay-marshal.c' || echo '$(srcdir)/'`gstplay-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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 <glib-object.h>\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 libgstplayback -:SHARED libgstplayback \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstplayback_la_SOURCES) \
+ $(nodist_libgstplayback_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstplayback_la_CFLAGS) $(csp_cflags) \
+ -:LDFLAGS $(libgstplayback_la_LDFLAGS) \
+ $(libgstplayback_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/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
new file mode 100644
index 0000000..1c256e9
--- /dev/null
+++ b/gst/playback/gstdecodebin2.c
@@ -0,0 +1,4019 @@
+/* GStreamer
+ * Copyright (C) <2006> Edward Hervey <edward@fluendo.com>
+ * Copyright (C) <2009> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * Copyright (C) <2011> Hewlett-Packard Development Company, L.P.
+ * Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, 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-decodebin
+ *
+ * #GstBin that auto-magically constructs a decoding pipeline using available
+ * decoders and demuxers via auto-plugging.
+ *
+ * decodebin is considered stable now and replaces the old #decodebin element.
+ * #uridecodebin uses decodebin internally and is often more convenient to
+ * use, as it creates a suitable source element as well.
+ */
+
+/* Implementation notes:
+ *
+ * The following section describes how decodebin works internally.
+ *
+ * The first part of decodebin is its typefind element, which tries
+ * to determine the media type of the input stream. If the type is found
+ * autoplugging starts.
+ *
+ * decodebin internally organizes the elements it autoplugged into GstDecodeChains
+ * and GstDecodeGroups. A decode chain is a single chain of decoding, this
+ * means that if decodebin every autoplugs an element with two+ srcpads
+ * (e.g. a demuxer) this will end the chain and everything following this
+ * demuxer will be put into decode groups below the chain. Otherwise,
+ * if an element has a single srcpad that outputs raw data the decode chain
+ * is ended too and a GstDecodePad is stored and blocked.
+ *
+ * A decode group combines a number of chains that are created by a
+ * demuxer element. All those chains are connected through a multiqueue to
+ * the demuxer. A new group for the same demuxer is only created if the
+ * demuxer has signaled no-more-pads, in which case all following pads
+ * create a new chain in the new group.
+ *
+ * This continues until the top-level decode chain is complete. A decode
+ * chain is complete if it either ends with a blocked endpad, if autoplugging
+ * stopped because no suitable plugins could be found or if the active group
+ * is complete. A decode group on the other hand is complete if all child
+ * chains are complete.
+ *
+ * If this happens at some point, all endpads of all active groups are exposed.
+ * For this decodebin adds the endpads, signals no-more-pads and then unblocks
+ * them. Now playback starts.
+ *
+ * If one of the chains that end on a endpad receives EOS decodebin checks
+ * if all chains and groups are drained. In that case everything goes into EOS.
+ * If there is a chain where the active group is drained but there exist next
+ * groups, the active group is hidden (endpads are removed) and the next group
+ * is exposed. This means that in some cases more pads may be created even
+ * after the initial no-more-pads signal. This happens for example with
+ * so-called "chained oggs", most commonly found among ogg/vorbis internet
+ * radio streams.
+ *
+ * Note 1: If we're talking about blocked endpads this really means that the
+ * *target* pads of the endpads are blocked. Pads that are exposed to the outside
+ * should never ever be blocked!
+ *
+ * Note 2: If a group is complete and the parent's chain demuxer adds new pads
+ * but never signaled no-more-pads this additional pads will be ignored!
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst-i18n-plugin.h>
+
+#include <string.h>
+#include <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+
+#include "gstplay-marshal.h"
+#include "gstplay-enum.h"
+#include "gstplayback.h"
+#include "gstrawcaps.h"
+
+/* generic templates */
+static GstStaticPadTemplate decoder_bin_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate decoder_bin_src_template =
+GST_STATIC_PAD_TEMPLATE ("src%d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_decode_bin_debug);
+#define GST_CAT_DEFAULT gst_decode_bin_debug
+
+typedef struct _GstPendingPad GstPendingPad;
+typedef struct _GstDecodeElement GstDecodeElement;
+typedef struct _GstDecodeChain GstDecodeChain;
+typedef struct _GstDecodeGroup GstDecodeGroup;
+typedef struct _GstDecodePad GstDecodePad;
+typedef GstGhostPadClass GstDecodePadClass;
+typedef struct _GstDecodeBin GstDecodeBin;
+typedef struct _GstDecodeBinClass GstDecodeBinClass;
+
+#define GST_TYPE_DECODE_BIN (gst_decode_bin_get_type())
+#define GST_DECODE_BIN_CAST(obj) ((GstDecodeBin*)(obj))
+#define GST_DECODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DECODE_BIN,GstDecodeBin))
+#define GST_DECODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DECODE_BIN,GstDecodeBinClass))
+#define GST_IS_DECODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DECODE_BIN))
+#define GST_IS_DECODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DECODE_BIN))
+
+/**
+ * GstDecodeBin:
+ *
+ * The opaque #GstDecodeBin data structure
+ */
+struct _GstDecodeBin
+{
+ GstBin bin; /* we extend GstBin */
+
+ /* properties */
+ GstCaps *caps; /* caps on which to stop decoding */
+ gchar *encoding; /* encoding of subtitles */
+ gboolean use_buffering; /* configure buffering on multiqueues */
+ gint low_percent;
+ gint high_percent;
+ guint max_size_bytes;
+ guint max_size_buffers;
+ guint64 max_size_time;
+ gboolean post_stream_topology;
+
+ GstElement *typefind; /* this holds the typefind object */
+
+ GMutex *expose_lock; /* Protects exposal and removal of groups */
+ GstDecodeChain *decode_chain; /* Top level decode chain */
+ gint nbpads; /* unique identifier for source pads */
+
+ GMutex *factories_lock;
+ guint32 factories_cookie; /* Cookie from last time when factories was updated */
+ GList *factories; /* factories we can use for selecting elements */
+
+ GMutex *subtitle_lock; /* Protects changes to subtitles and encoding */
+ GList *subtitles; /* List of elements with subtitle-encoding,
+ * protected by above mutex! */
+
+ gboolean have_type; /* if we received the have_type signal */
+ guint have_type_id; /* signal id for have-type from typefind */
+
+ gboolean async_pending; /* async-start has been emited */
+
+ GMutex *dyn_lock; /* lock protecting pad blocking */
+ gboolean shutdown; /* if we are shutting down */
+ GList *blocked_pads; /* pads that have set to block */
+
+ gboolean expose_allstreams; /* Whether to expose unknow type streams or not */
+
+ gboolean upstream_seekable; /* if upstream is seekable */
+};
+
+struct _GstDecodeBinClass
+{
+ GstBinClass parent_class;
+
+ /* signal fired when we found a pad that we cannot decode */
+ void (*unknown_type) (GstElement * element, GstPad * pad, GstCaps * caps);
+
+ /* signal fired to know if we continue trying to decode the given caps */
+ gboolean (*autoplug_continue) (GstElement * element, GstPad * pad,
+ GstCaps * caps);
+ /* signal fired to get a list of factories to try to autoplug */
+ GValueArray *(*autoplug_factories) (GstElement * element, GstPad * pad,
+ GstCaps * caps);
+ /* signal fired to sort the factories */
+ GValueArray *(*autoplug_sort) (GstElement * element, GstPad * pad,
+ GstCaps * caps, GValueArray * factories);
+ /* signal fired to select from the proposed list of factories */
+ GstAutoplugSelectResult (*autoplug_select) (GstElement * element,
+ GstPad * pad, GstCaps * caps, GstElementFactory * factory);
+
+ /* fired when the last group is drained */
+ void (*drained) (GstElement * element);
+};
+
+/* signals */
+enum
+{
+ SIGNAL_UNKNOWN_TYPE,
+ SIGNAL_AUTOPLUG_CONTINUE,
+ SIGNAL_AUTOPLUG_FACTORIES,
+ SIGNAL_AUTOPLUG_SELECT,
+ SIGNAL_AUTOPLUG_SORT,
+ SIGNAL_DRAINED,
+ LAST_SIGNAL
+};
+
+/* automatic sizes, while prerolling we buffer up to 2MB, we ignore time
+ * and buffers in this case. */
+#define AUTO_PREROLL_SIZE_BYTES 2 * 1024 * 1024
+#define AUTO_PREROLL_SIZE_BUFFERS 0
+#define AUTO_PREROLL_NOT_SEEKABLE_SIZE_TIME 0
+#define AUTO_PREROLL_SEEKABLE_SIZE_TIME 10 * GST_SECOND
+
+/* whan playing, keep a max of 2MB of data but try to keep the number of buffers
+ * as low as possible (try to aim for 5 buffers) */
+#define AUTO_PLAY_SIZE_BYTES 2 * 1024 * 1024
+#define AUTO_PLAY_SIZE_BUFFERS 5
+#define AUTO_PLAY_SIZE_TIME 0
+
+#define DEFAULT_SUBTITLE_ENCODING NULL
+#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_LOW_PERCENT 10
+#define DEFAULT_HIGH_PERCENT 99
+/* by default we use the automatic values above */
+#define DEFAULT_MAX_SIZE_BYTES 0
+#define DEFAULT_MAX_SIZE_BUFFERS 0
+#define DEFAULT_MAX_SIZE_TIME 0
+#define DEFAULT_POST_STREAM_TOPOLOGY FALSE
+#define DEFAULT_EXPOSE_ALL_STREAMS TRUE
+
+/* Properties */
+enum
+{
+ PROP_0,
+ PROP_CAPS,
+ PROP_SUBTITLE_ENCODING,
+ PROP_SINK_CAPS,
+ PROP_USE_BUFFERING,
+ PROP_LOW_PERCENT,
+ PROP_HIGH_PERCENT,
+ PROP_MAX_SIZE_BYTES,
+ PROP_MAX_SIZE_BUFFERS,
+ PROP_MAX_SIZE_TIME,
+ PROP_POST_STREAM_TOPOLOGY,
+ PROP_EXPOSE_ALL_STREAMS,
+ PROP_LAST
+};
+
+static GstBinClass *parent_class;
+static guint gst_decode_bin_signals[LAST_SIGNAL] = { 0 };
+
+static GstStaticCaps default_raw_caps = GST_STATIC_CAPS (DEFAULT_RAW_CAPS);
+
+static void do_async_start (GstDecodeBin * dbin);
+static void do_async_done (GstDecodeBin * dbin);
+
+static void type_found (GstElement * typefind, guint probability,
+ GstCaps * caps, GstDecodeBin * decode_bin);
+
+static void decodebin_set_queue_size (GstDecodeBin * dbin,
+ GstElement * multiqueue, gboolean preroll);
+
+static gboolean gst_decode_bin_autoplug_continue (GstElement * element,
+ GstPad * pad, GstCaps * caps);
+static GValueArray *gst_decode_bin_autoplug_factories (GstElement *
+ element, GstPad * pad, GstCaps * caps);
+static GValueArray *gst_decode_bin_autoplug_sort (GstElement * element,
+ GstPad * pad, GstCaps * caps, GValueArray * factories);
+static GstAutoplugSelectResult gst_decode_bin_autoplug_select (GstElement *
+ element, GstPad * pad, GstCaps * caps, GstElementFactory * factory);
+
+static void gst_decode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_decode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_decode_bin_set_caps (GstDecodeBin * dbin, GstCaps * caps);
+static GstCaps *gst_decode_bin_get_caps (GstDecodeBin * dbin);
+static void caps_notify_cb (GstPad * pad, GParamSpec * unused,
+ GstDecodeChain * chain);
+
+static GstPad *find_sink_pad (GstElement * element);
+static GstStateChangeReturn gst_decode_bin_change_state (GstElement * element,
+ GstStateChange transition);
+
+#define EXPOSE_LOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "expose locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_DECODE_BIN_CAST(dbin)->expose_lock); \
+ GST_LOG_OBJECT (dbin, \
+ "expose locked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define EXPOSE_UNLOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "expose unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_DECODE_BIN_CAST(dbin)->expose_lock); \
+} G_STMT_END
+
+#define DYN_LOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "dynlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_DECODE_BIN_CAST(dbin)->dyn_lock); \
+ GST_LOG_OBJECT (dbin, \
+ "dynlocked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define DYN_UNLOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "dynunlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_DECODE_BIN_CAST(dbin)->dyn_lock); \
+} G_STMT_END
+
+#define SUBTITLE_LOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "subtitle locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_DECODE_BIN_CAST(dbin)->subtitle_lock); \
+ GST_LOG_OBJECT (dbin, \
+ "subtitle lock from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define SUBTITLE_UNLOCK(dbin) G_STMT_START { \
+ GST_LOG_OBJECT (dbin, \
+ "subtitle unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_DECODE_BIN_CAST(dbin)->subtitle_lock); \
+} G_STMT_END
+
+struct _GstPendingPad
+{
+ GstPad *pad;
+ GstDecodeChain *chain;
+ gulong event_probe_id;
+};
+
+struct _GstDecodeElement
+{
+ GstElement *element;
+ GstElement *capsfilter; /* Optional capsfilter for Parser/Convert */
+};
+
+/* GstDecodeGroup
+ *
+ * Streams belonging to the same group/chain of a media file
+ *
+ * When changing something here lock the parent chain!
+ */
+struct _GstDecodeGroup
+{
+ GstDecodeBin *dbin;
+ GstDecodeChain *parent;
+
+ GstElement *multiqueue; /* Used for linking all child chains */
+ gulong overrunsig; /* the overrun signal for multiqueue */
+
+ gboolean overrun; /* TRUE if the multiqueue signaled overrun. This
+ * means that we should really expose the group */
+
+ gboolean no_more_pads; /* TRUE if the demuxer signaled no-more-pads */
+ gboolean drained; /* TRUE if the all children are drained */
+
+ GList *children; /* List of GstDecodeChains in this group */
+
+ GList *reqpads; /* List of RequestPads for multiqueue, there is
+ * exactly one RequestPad per child chain */
+};
+
+struct _GstDecodeChain
+{
+ GstDecodeGroup *parent;
+ GstDecodeBin *dbin;
+
+ GMutex *lock; /* Protects this chain and its groups */
+
+ GstPad *pad; /* srcpad that caused creation of this chain */
+
+ gboolean demuxer; /* TRUE if elements->data is a demuxer */
+ GList *elements; /* All elements in this group, first
+ is the latest and most downstream element */
+
+ /* Note: there are only groups if the last element of this chain
+ * is a demuxer, otherwise the chain will end with an endpad.
+ * The other way around this means, that endpad only exists if this
+ * chain doesn't end with a demuxer! */
+
+ GstDecodeGroup *active_group; /* Currently active group */
+ GList *next_groups; /* head is newest group, tail is next group.
+ a new group will be created only if the head
+ group had no-more-pads. If it's only exposed
+ all new pads will be ignored! */
+ GList *pending_pads; /* Pads that have no fixed caps yet */
+
+ GstDecodePad *endpad; /* Pad of this chain that could be exposed */
+ gboolean deadend; /* This chain is incomplete and can't be completed,
+ e.g. no suitable decoder could be found
+ e.g. stream got EOS without buffers
+ */
+ GstCaps *endcaps; /* Caps that were used when linking to the endpad
+ or that resulted in the deadend
+ */
+
+ /* FIXME: This should be done directly via a thread! */
+ GList *old_groups; /* Groups that should be freed later */
+};
+
+static void gst_decode_chain_free (GstDecodeChain * chain);
+static GstDecodeChain *gst_decode_chain_new (GstDecodeBin * dbin,
+ GstDecodeGroup * group, GstPad * pad);
+static void gst_decode_group_hide (GstDecodeGroup * group);
+static void gst_decode_group_free (GstDecodeGroup * group);
+static GstDecodeGroup *gst_decode_group_new (GstDecodeBin * dbin,
+ GstDecodeChain * chain);
+static gboolean gst_decode_chain_is_complete (GstDecodeChain * chain);
+static gboolean gst_decode_chain_expose (GstDecodeChain * chain,
+ GList ** endpads, gboolean * missing_plugin);
+static gboolean gst_decode_chain_is_drained (GstDecodeChain * chain);
+static gboolean gst_decode_group_is_complete (GstDecodeGroup * group);
+static GstPad *gst_decode_group_control_demuxer_pad (GstDecodeGroup * group,
+ GstPad * pad);
+static gboolean gst_decode_group_is_drained (GstDecodeGroup * group);
+
+static gboolean gst_decode_bin_expose (GstDecodeBin * dbin);
+
+#define CHAIN_MUTEX_LOCK(chain) G_STMT_START { \
+ GST_LOG_OBJECT (chain->dbin, \
+ "locking chain %p from thread %p", \
+ chain, g_thread_self ()); \
+ g_mutex_lock (chain->lock); \
+ GST_LOG_OBJECT (chain->dbin, \
+ "locked chain %p from thread %p", \
+ chain, g_thread_self ()); \
+} G_STMT_END
+
+#define CHAIN_MUTEX_UNLOCK(chain) G_STMT_START { \
+ GST_LOG_OBJECT (chain->dbin, \
+ "unlocking chain %p from thread %p", \
+ chain, g_thread_self ()); \
+ g_mutex_unlock (chain->lock); \
+} G_STMT_END
+
+/* GstDecodePad
+ *
+ * GstPad private used for source pads of chains
+ */
+struct _GstDecodePad
+{
+ GstGhostPad parent;
+ GstDecodeBin *dbin;
+ GstDecodeChain *chain;
+
+ gboolean blocked; /* the *target* pad is blocked */
+ gboolean exposed; /* the pad is exposed */
+ gboolean drained; /* an EOS has been seen on the pad */
+
+ gulong block_id;
+};
+
+GType gst_decode_pad_get_type (void);
+G_DEFINE_TYPE (GstDecodePad, gst_decode_pad, GST_TYPE_GHOST_PAD);
+#define GST_TYPE_DECODE_PAD (gst_decode_pad_get_type ())
+#define GST_DECODE_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DECODE_PAD,GstDecodePad))
+
+static GstDecodePad *gst_decode_pad_new (GstDecodeBin * dbin, GstPad * pad,
+ GstDecodeChain * chain);
+static void gst_decode_pad_activate (GstDecodePad * dpad,
+ GstDecodeChain * chain);
+static void gst_decode_pad_unblock (GstDecodePad * dpad);
+static void gst_decode_pad_set_blocked (GstDecodePad * dpad, gboolean blocked);
+
+static void gst_pending_pad_free (GstPendingPad * ppad);
+static GstProbeReturn pad_event_cb (GstPad * pad, GstProbeType type,
+ gpointer type_data, gpointer data);
+
+/********************************
+ * Standard GObject boilerplate *
+ ********************************/
+
+static void gst_decode_bin_class_init (GstDecodeBinClass * klass);
+static void gst_decode_bin_init (GstDecodeBin * decode_bin);
+static void gst_decode_bin_dispose (GObject * object);
+static void gst_decode_bin_finalize (GObject * object);
+
+static GType
+gst_decode_bin_get_type (void)
+{
+ static GType gst_decode_bin_type = 0;
+
+ if (!gst_decode_bin_type) {
+ static const GTypeInfo gst_decode_bin_info = {
+ sizeof (GstDecodeBinClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_decode_bin_class_init,
+ NULL,
+ NULL,
+ sizeof (GstDecodeBin),
+ 0,
+ (GInstanceInitFunc) gst_decode_bin_init,
+ NULL
+ };
+
+ gst_decode_bin_type =
+ g_type_register_static (GST_TYPE_BIN, "GstDecodeBin",
+ &gst_decode_bin_info, 0);
+ }
+
+ return gst_decode_bin_type;
+}
+
+static gboolean
+_gst_boolean_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gboolean myboolean;
+
+ myboolean = g_value_get_boolean (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boolean (return_accu, myboolean);
+
+ /* stop emission if FALSE */
+ return myboolean;
+}
+
+/* we collect the first result */
+static gboolean
+_gst_array_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gpointer array;
+
+ array = g_value_get_boxed (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boxed (return_accu, array);
+
+ return FALSE;
+}
+
+static gboolean
+_gst_select_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ GstAutoplugSelectResult res;
+
+ res = g_value_get_enum (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_enum (return_accu, res);
+
+ return FALSE;
+}
+
+static gboolean
+_gst_array_hasvalue_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gpointer array;
+
+ array = g_value_get_boxed (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boxed (return_accu, array);
+
+ if (array != NULL)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+gst_decode_bin_class_init (GstDecodeBinClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_klass->dispose = gst_decode_bin_dispose;
+ gobject_klass->finalize = gst_decode_bin_finalize;
+ gobject_klass->set_property = gst_decode_bin_set_property;
+ gobject_klass->get_property = gst_decode_bin_get_property;
+
+ /**
+ * GstDecodeBin::unknown-type:
+ * @bin: The decodebin.
+ * @pad: The new pad containing caps that cannot be resolved to a 'final'
+ * stream type.
+ * @caps: The #GstCaps of the pad that cannot be resolved.
+ *
+ * This signal is emitted when a pad for which there is no further possible
+ * decoding is added to the decodebin.
+ */
+ gst_decode_bin_signals[SIGNAL_UNKNOWN_TYPE] =
+ g_signal_new ("unknown-type", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, unknown_type),
+ NULL, NULL, gst_marshal_VOID__OBJECT_BOXED, G_TYPE_NONE, 2,
+ GST_TYPE_PAD, GST_TYPE_CAPS);
+
+ /**
+ * GstDecodeBin::autoplug-continue:
+ * @bin: The decodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps found.
+ *
+ * This signal is emitted whenever decodebin finds a new stream. It is
+ * emitted before looking for any elements that can handle that stream.
+ *
+ * <note>
+ * Invocation of signal handlers stops after the first signal handler
+ * returns #FALSE. Signal handlers are invoked in the order they were
+ * connected in.
+ * </note>
+ *
+ * Returns: #TRUE if you wish decodebin to look for elements that can
+ * handle the given @caps. If #FALSE, those caps will be considered as
+ * final and the pad will be exposed as such (see 'pad-added' signal of
+ * #GstElement).
+ */
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_CONTINUE] =
+ g_signal_new ("autoplug-continue", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, autoplug_continue),
+ _gst_boolean_accumulator, NULL, gst_play_marshal_BOOLEAN__OBJECT_BOXED,
+ G_TYPE_BOOLEAN, 2, GST_TYPE_PAD, GST_TYPE_CAPS);
+
+ /**
+ * GstDecodeBin::autoplug-factories:
+ * @bin: The decodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps found.
+ *
+ * This function is emited when an array of possible factories for @caps on
+ * @pad is needed. Decodebin will by default return an array with all
+ * compatible factories, sorted by rank.
+ *
+ * If this function returns NULL, @pad will be exposed as a final caps.
+ *
+ * If this function returns an empty array, the pad will be considered as
+ * having an unhandled type media type.
+ *
+ * <note>
+ * Only the signal handler that is connected first will ever by invoked.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: a #GValueArray* with a list of factories to try. The factories are
+ * by default tried in the returned order or based on the index returned by
+ * "autoplug-select".
+ */
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_FACTORIES] =
+ g_signal_new ("autoplug-factories", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass,
+ autoplug_factories), _gst_array_accumulator, NULL,
+ gst_play_marshal_BOXED__OBJECT_BOXED, G_TYPE_VALUE_ARRAY, 2,
+ GST_TYPE_PAD, GST_TYPE_CAPS);
+
+ /**
+ * GstDecodeBin::autoplug-sort:
+ * @bin: The decodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps.
+ * @factories: A #GValueArray of possible #GstElementFactory to use.
+ *
+ * Once decodebin has found the possible #GstElementFactory objects to try
+ * for @caps on @pad, this signal is emited. The purpose of the signal is for
+ * the application to perform additional sorting or filtering on the element
+ * factory array.
+ *
+ * The callee should copy and modify @factories or return #NULL if the
+ * order should not change.
+ *
+ * <note>
+ * Invocation of signal handlers stops after one signal handler has
+ * returned something else than #NULL. Signal handlers are invoked in
+ * the order they were connected in.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: A new sorted array of #GstElementFactory objects.
+ */
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_SORT] =
+ g_signal_new ("autoplug-sort", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, autoplug_sort),
+ _gst_array_hasvalue_accumulator, NULL,
+ gst_play_marshal_BOXED__OBJECT_BOXED_BOXED, G_TYPE_VALUE_ARRAY, 3,
+ GST_TYPE_PAD, GST_TYPE_CAPS, G_TYPE_VALUE_ARRAY);
+
+ /**
+ * GstDecodeBin::autoplug-select:
+ * @bin: The decodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps.
+ * @factory: A #GstElementFactory to use.
+ *
+ * This signal is emitted once decodebin has found all the possible
+ * #GstElementFactory that can be used to handle the given @caps. For each of
+ * those factories, this signal is emited.
+ *
+ * The signal handler should return a #GST_TYPE_AUTOPLUG_SELECT_RESULT enum
+ * value indicating what decodebin should do next.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_TRY will try to autoplug an element from
+ * @factory.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_EXPOSE will expose @pad without plugging
+ * any element to it.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_SKIP will skip @factory and move to the
+ * next factory.
+ *
+ * <note>
+ * Only the signal handler that is connected first will ever by invoked.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: a #GST_TYPE_AUTOPLUG_SELECT_RESULT that indicates the required
+ * operation. the default handler will always return
+ * #GST_AUTOPLUG_SELECT_TRY.
+ */
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_SELECT] =
+ g_signal_new ("autoplug-select", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, autoplug_select),
+ _gst_select_accumulator, NULL,
+ gst_play_marshal_ENUM__OBJECT_BOXED_OBJECT,
+ GST_TYPE_AUTOPLUG_SELECT_RESULT, 3, GST_TYPE_PAD, GST_TYPE_CAPS,
+ GST_TYPE_ELEMENT_FACTORY);
+
+ /**
+ * GstDecodeBin::drained
+ * @bin: The decodebin
+ *
+ * This signal is emitted once decodebin has finished decoding all the data.
+ *
+ * Since: 0.10.16
+ */
+ gst_decode_bin_signals[SIGNAL_DRAINED] =
+ g_signal_new ("drained", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, drained),
+ NULL, NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ g_object_class_install_property (gobject_klass, PROP_CAPS,
+ g_param_spec_boxed ("caps", "Caps", "The caps on which to stop decoding.",
+ GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_SUBTITLE_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 encoding. "
+ "If not set, the GST_SUBTITLE_ENCODING environment variable will "
+ "be checked for an encoding to use. If that is not set either, "
+ "ISO-8859-15 will be assumed.", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_SINK_CAPS,
+ g_param_spec_boxed ("sink-caps", "Sink Caps",
+ "The caps of the input data. (NULL = use typefind element)",
+ GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstDecodeBin::use-buffering
+ *
+ * Activate buffering in decodebin. This will instruct the multiqueues behind
+ * decoders to emit BUFFERING messages.
+
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_USE_BUFFERING,
+ g_param_spec_boolean ("use-buffering", "Use Buffering",
+ "Emit GST_MESSAGE_BUFFERING based on low-/high-percent thresholds",
+ DEFAULT_USE_BUFFERING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstDecodeBin:low-percent
+ *
+ * Low threshold percent for buffering to start.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_LOW_PERCENT,
+ g_param_spec_int ("low-percent", "Low percent",
+ "Low threshold for buffering to start", 0, 100,
+ DEFAULT_LOW_PERCENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstDecodeBin:high-percent
+ *
+ * High threshold percent for buffering to finish.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_HIGH_PERCENT,
+ g_param_spec_int ("high-percent", "High percent",
+ "High threshold for buffering to finish", 0, 100,
+ DEFAULT_HIGH_PERCENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstDecodeBin:max-size-bytes
+ *
+ * Max amount amount of bytes in the queue (0=automatic).
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_MAX_SIZE_BYTES,
+ g_param_spec_uint ("max-size-bytes", "Max. size (bytes)",
+ "Max. amount of bytes in the queue (0=automatic)",
+ 0, G_MAXUINT, DEFAULT_MAX_SIZE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstDecodeBin:max-size-buffers
+ *
+ * Max amount amount of buffers in the queue (0=automatic).
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_MAX_SIZE_BUFFERS,
+ g_param_spec_uint ("max-size-buffers", "Max. size (buffers)",
+ "Max. number of buffers in the queue (0=automatic)",
+ 0, G_MAXUINT, DEFAULT_MAX_SIZE_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstDecodeBin:max-size-time
+ *
+ * Max amount amount of time in the queue (in ns, 0=automatic).
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_MAX_SIZE_TIME,
+ g_param_spec_uint64 ("max-size-time", "Max. size (ns)",
+ "Max. amount of data in the queue (in ns, 0=automatic)",
+ 0, G_MAXUINT64,
+ DEFAULT_MAX_SIZE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstDecodeBin::post-stream-topology
+ *
+ * Post stream-topology messages on the bus every time the topology changes.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_klass, PROP_POST_STREAM_TOPOLOGY,
+ g_param_spec_boolean ("post-stream-topology", "Post Stream Topology",
+ "Post stream-topology messages",
+ DEFAULT_POST_STREAM_TOPOLOGY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstDecodeBin::expose-all-streams
+ *
+ * Expose streams of unknown type.
+ *
+ * If set to %FALSE, then only the streams that can be decoded to the final
+ * caps (see 'caps' property) will have a pad exposed. Streams that do not
+ * match those caps but could have been decoded will not have decoder plugged
+ * in internally and will not have a pad exposed.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_klass, PROP_EXPOSE_ALL_STREAMS,
+ g_param_spec_boolean ("expose-all-streams", "Expose All Streams",
+ "Expose all streams, including those of unknown type or that don't match the 'caps' property",
+ DEFAULT_EXPOSE_ALL_STREAMS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+
+
+ klass->autoplug_continue =
+ GST_DEBUG_FUNCPTR (gst_decode_bin_autoplug_continue);
+ klass->autoplug_factories =
+ GST_DEBUG_FUNCPTR (gst_decode_bin_autoplug_factories);
+ klass->autoplug_sort = GST_DEBUG_FUNCPTR (gst_decode_bin_autoplug_sort);
+ klass->autoplug_select = GST_DEBUG_FUNCPTR (gst_decode_bin_autoplug_select);
+
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&decoder_bin_sink_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&decoder_bin_src_template));
+
+ gst_element_class_set_details_simple (gstelement_klass,
+ "Decoder Bin", "Generic/Bin/Decoder",
+ "Autoplug and decode to raw media",
+ "Edward Hervey <edward.hervey@collabora.co.uk>, "
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstelement_klass->change_state =
+ GST_DEBUG_FUNCPTR (gst_decode_bin_change_state);
+}
+
+/* Must be called with factories lock! */
+static void
+gst_decode_bin_update_factories_list (GstDecodeBin * dbin)
+{
+ if (!dbin->factories
+ || dbin->factories_cookie !=
+ gst_default_registry_get_feature_list_cookie ()) {
+ if (dbin->factories)
+ gst_plugin_feature_list_free (dbin->factories);
+ dbin->factories =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_DECODABLE, GST_RANK_MARGINAL);
+ dbin->factories_cookie = gst_default_registry_get_feature_list_cookie ();
+ }
+}
+
+static void
+gst_decode_bin_init (GstDecodeBin * decode_bin)
+{
+ /* first filter out the interesting element factories */
+ decode_bin->factories_lock = g_mutex_new ();
+
+ /* we create the typefind element only once */
+ decode_bin->typefind = gst_element_factory_make ("typefind", "typefind");
+ if (!decode_bin->typefind) {
+ g_warning ("can't find typefind element, decodebin will not work");
+ } else {
+ GstPad *pad;
+ GstPad *gpad;
+ GstPadTemplate *pad_tmpl;
+
+ /* add the typefind element */
+ if (!gst_bin_add (GST_BIN (decode_bin), decode_bin->typefind)) {
+ g_warning ("Could not add typefind element, decodebin will not work");
+ gst_object_unref (decode_bin->typefind);
+ decode_bin->typefind = NULL;
+ }
+
+ /* get the sinkpad */
+ pad = gst_element_get_static_pad (decode_bin->typefind, "sink");
+
+ /* get the pad template */
+ pad_tmpl = gst_static_pad_template_get (&decoder_bin_sink_template);
+
+ /* ghost the sink pad to ourself */
+ gpad = gst_ghost_pad_new_from_template ("sink", pad, pad_tmpl);
+ gst_pad_set_active (gpad, TRUE);
+ gst_element_add_pad (GST_ELEMENT (decode_bin), gpad);
+
+ gst_object_unref (pad_tmpl);
+ gst_object_unref (pad);
+
+ /* connect a signal to find out when the typefind element found
+ * a type */
+ decode_bin->have_type_id =
+ g_signal_connect (G_OBJECT (decode_bin->typefind), "have-type",
+ G_CALLBACK (type_found), decode_bin);
+ }
+
+ decode_bin->expose_lock = g_mutex_new ();
+ decode_bin->decode_chain = NULL;
+
+ decode_bin->dyn_lock = g_mutex_new ();
+ decode_bin->shutdown = FALSE;
+ decode_bin->blocked_pads = NULL;
+
+ decode_bin->subtitle_lock = g_mutex_new ();
+
+ decode_bin->encoding = g_strdup (DEFAULT_SUBTITLE_ENCODING);
+ decode_bin->caps = gst_static_caps_get (&default_raw_caps);
+ decode_bin->use_buffering = DEFAULT_USE_BUFFERING;
+ decode_bin->low_percent = DEFAULT_LOW_PERCENT;
+ decode_bin->high_percent = DEFAULT_HIGH_PERCENT;
+
+ decode_bin->max_size_bytes = DEFAULT_MAX_SIZE_BYTES;
+ decode_bin->max_size_buffers = DEFAULT_MAX_SIZE_BUFFERS;
+ decode_bin->max_size_time = DEFAULT_MAX_SIZE_TIME;
+
+ decode_bin->expose_allstreams = DEFAULT_EXPOSE_ALL_STREAMS;
+}
+
+static void
+gst_decode_bin_dispose (GObject * object)
+{
+ GstDecodeBin *decode_bin;
+
+ decode_bin = GST_DECODE_BIN (object);
+
+ if (decode_bin->factories)
+ gst_plugin_feature_list_free (decode_bin->factories);
+ decode_bin->factories = NULL;
+
+ if (decode_bin->decode_chain)
+ gst_decode_chain_free (decode_bin->decode_chain);
+ decode_bin->decode_chain = NULL;
+
+ if (decode_bin->caps)
+ gst_caps_unref (decode_bin->caps);
+ decode_bin->caps = NULL;
+
+ g_free (decode_bin->encoding);
+ decode_bin->encoding = NULL;
+
+ g_list_free (decode_bin->subtitles);
+ decode_bin->subtitles = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_decode_bin_finalize (GObject * object)
+{
+ GstDecodeBin *decode_bin;
+
+ decode_bin = GST_DECODE_BIN (object);
+
+ if (decode_bin->expose_lock) {
+ g_mutex_free (decode_bin->expose_lock);
+ decode_bin->expose_lock = NULL;
+ }
+
+ if (decode_bin->dyn_lock) {
+ g_mutex_free (decode_bin->dyn_lock);
+ decode_bin->dyn_lock = NULL;
+ }
+
+ if (decode_bin->subtitle_lock) {
+ g_mutex_free (decode_bin->subtitle_lock);
+ decode_bin->subtitle_lock = NULL;
+ }
+
+ if (decode_bin->factories_lock) {
+ g_mutex_free (decode_bin->factories_lock);
+ decode_bin->factories_lock = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/* _set_caps
+ * Changes the caps on which decodebin will stop decoding.
+ * Will unref the previously set one. The refcount of the given caps will be
+ * increased.
+ * @caps can be NULL.
+ *
+ * MT-safe
+ */
+static void
+gst_decode_bin_set_caps (GstDecodeBin * dbin, GstCaps * caps)
+{
+ GST_DEBUG_OBJECT (dbin, "Setting new caps: %" GST_PTR_FORMAT, caps);
+
+ GST_OBJECT_LOCK (dbin);
+ gst_caps_replace (&dbin->caps, caps);
+ GST_OBJECT_UNLOCK (dbin);
+}
+
+/* _get_caps
+ * Returns the currently configured caps on which decodebin will stop decoding.
+ * The returned caps (if not NULL), will have its refcount incremented.
+ *
+ * MT-safe
+ */
+static GstCaps *
+gst_decode_bin_get_caps (GstDecodeBin * dbin)
+{
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (dbin, "Getting currently set caps");
+
+ GST_OBJECT_LOCK (dbin);
+ caps = dbin->caps;
+ if (caps)
+ gst_caps_ref (caps);
+ GST_OBJECT_UNLOCK (dbin);
+
+ return caps;
+}
+
+static void
+gst_decode_bin_set_sink_caps (GstDecodeBin * dbin, GstCaps * caps)
+{
+ GST_DEBUG_OBJECT (dbin, "Setting new caps: %" GST_PTR_FORMAT, caps);
+
+ g_object_set (dbin->typefind, "force-caps", caps, NULL);
+}
+
+static GstCaps *
+gst_decode_bin_get_sink_caps (GstDecodeBin * dbin)
+{
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (dbin, "Getting currently set caps");
+
+ g_object_get (dbin->typefind, "force-caps", &caps, NULL);
+
+ return caps;
+}
+
+static void
+gst_decode_bin_set_subs_encoding (GstDecodeBin * dbin, const gchar * encoding)
+{
+ GList *walk;
+
+ GST_DEBUG_OBJECT (dbin, "Setting new encoding: %s", GST_STR_NULL (encoding));
+
+ SUBTITLE_LOCK (dbin);
+ g_free (dbin->encoding);
+ dbin->encoding = g_strdup (encoding);
+
+ /* set the subtitle encoding on all added elements */
+ for (walk = dbin->subtitles; walk; walk = g_list_next (walk)) {
+ g_object_set (G_OBJECT (walk->data), "subtitle-encoding", dbin->encoding,
+ NULL);
+ }
+ SUBTITLE_UNLOCK (dbin);
+}
+
+static gchar *
+gst_decode_bin_get_subs_encoding (GstDecodeBin * dbin)
+{
+ gchar *encoding;
+
+ GST_DEBUG_OBJECT (dbin, "Getting currently set encoding");
+
+ SUBTITLE_LOCK (dbin);
+ encoding = g_strdup (dbin->encoding);
+ SUBTITLE_UNLOCK (dbin);
+
+ return encoding;
+}
+
+static void
+gst_decode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstDecodeBin *dbin;
+
+ dbin = GST_DECODE_BIN (object);
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ gst_decode_bin_set_caps (dbin, g_value_get_boxed (value));
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ gst_decode_bin_set_subs_encoding (dbin, g_value_get_string (value));
+ break;
+ case PROP_SINK_CAPS:
+ gst_decode_bin_set_sink_caps (dbin, g_value_get_boxed (value));
+ break;
+ case PROP_USE_BUFFERING:
+ dbin->use_buffering = g_value_get_boolean (value);
+ break;
+ case PROP_LOW_PERCENT:
+ dbin->low_percent = g_value_get_int (value);
+ break;
+ case PROP_HIGH_PERCENT:
+ dbin->high_percent = g_value_get_int (value);
+ break;
+ case PROP_MAX_SIZE_BYTES:
+ dbin->max_size_bytes = g_value_get_uint (value);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ dbin->max_size_buffers = g_value_get_uint (value);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ dbin->max_size_time = g_value_get_uint64 (value);
+ break;
+ case PROP_POST_STREAM_TOPOLOGY:
+ dbin->post_stream_topology = g_value_get_boolean (value);
+ break;
+ case PROP_EXPOSE_ALL_STREAMS:
+ dbin->expose_allstreams = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_decode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstDecodeBin *dbin;
+
+ dbin = GST_DECODE_BIN (object);
+ switch (prop_id) {
+ case PROP_CAPS:
+ g_value_take_boxed (value, gst_decode_bin_get_caps (dbin));
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ g_value_take_string (value, gst_decode_bin_get_subs_encoding (dbin));
+ break;
+ case PROP_SINK_CAPS:
+ g_value_take_boxed (value, gst_decode_bin_get_sink_caps (dbin));
+ break;
+ case PROP_USE_BUFFERING:
+ g_value_set_boolean (value, dbin->use_buffering);
+ break;
+ case PROP_LOW_PERCENT:
+ g_value_set_int (value, dbin->low_percent);
+ break;
+ case PROP_HIGH_PERCENT:
+ g_value_set_int (value, dbin->high_percent);
+ break;
+ case PROP_MAX_SIZE_BYTES:
+ g_value_set_uint (value, dbin->max_size_bytes);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ g_value_set_uint (value, dbin->max_size_buffers);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ g_value_set_uint64 (value, dbin->max_size_time);
+ break;
+ case PROP_POST_STREAM_TOPOLOGY:
+ g_value_set_boolean (value, dbin->post_stream_topology);
+ break;
+ case PROP_EXPOSE_ALL_STREAMS:
+ g_value_set_boolean (value, dbin->expose_allstreams);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+/*****
+ * Default autoplug signal handlers
+ *****/
+static gboolean
+gst_decode_bin_autoplug_continue (GstElement * element, GstPad * pad,
+ GstCaps * caps)
+{
+ GST_DEBUG_OBJECT (element, "autoplug-continue returns TRUE");
+
+ /* by default we always continue */
+ return TRUE;
+}
+
+static GValueArray *
+gst_decode_bin_autoplug_factories (GstElement * element, GstPad * pad,
+ GstCaps * caps)
+{
+ GList *list, *tmp;
+ GValueArray *result;
+ GstDecodeBin *dbin = GST_DECODE_BIN_CAST (element);
+
+ GST_DEBUG_OBJECT (element, "finding factories");
+
+ /* return all compatible factories for caps */
+ g_mutex_lock (dbin->factories_lock);
+ gst_decode_bin_update_factories_list (dbin);
+ list =
+ gst_element_factory_list_filter (dbin->factories, caps, GST_PAD_SINK,
+ FALSE);
+ g_mutex_unlock (dbin->factories_lock);
+
+ result = g_value_array_new (g_list_length (list));
+ for (tmp = list; tmp; tmp = tmp->next) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+ GValue val = { 0, };
+
+ g_value_init (&val, G_TYPE_OBJECT);
+ g_value_set_object (&val, factory);
+ g_value_array_append (result, &val);
+ g_value_unset (&val);
+ }
+ gst_plugin_feature_list_free (list);
+
+ GST_DEBUG_OBJECT (element, "autoplug-factories returns %p", result);
+
+ return result;
+}
+
+static GValueArray *
+gst_decode_bin_autoplug_sort (GstElement * element, GstPad * pad,
+ GstCaps * caps, GValueArray * factories)
+{
+ return NULL;
+}
+
+static GstAutoplugSelectResult
+gst_decode_bin_autoplug_select (GstElement * element, GstPad * pad,
+ GstCaps * caps, GstElementFactory * factory)
+{
+ GST_DEBUG_OBJECT (element, "default autoplug-select returns TRY");
+
+ /* Try factory. */
+ return GST_AUTOPLUG_SELECT_TRY;
+}
+
+/********
+ * Discovery methods
+ *****/
+
+static gboolean are_final_caps (GstDecodeBin * dbin, GstCaps * caps);
+static gboolean is_demuxer_element (GstElement * srcelement);
+
+static gboolean connect_pad (GstDecodeBin * dbin, GstElement * src,
+ GstDecodePad * dpad, GstPad * pad, GstCaps * caps, GValueArray * factories,
+ GstDecodeChain * chain);
+static gboolean connect_element (GstDecodeBin * dbin, GstElement * element,
+ GstDecodeChain * chain);
+static void expose_pad (GstDecodeBin * dbin, GstElement * src,
+ GstDecodePad * dpad, GstPad * pad, GstCaps * caps, GstDecodeChain * chain);
+
+static void pad_added_cb (GstElement * element, GstPad * pad,
+ GstDecodeChain * chain);
+static void pad_removed_cb (GstElement * element, GstPad * pad,
+ GstDecodeChain * chain);
+static void no_more_pads_cb (GstElement * element, GstDecodeChain * chain);
+
+static GstDecodeGroup *gst_decode_chain_get_current_group (GstDecodeChain *
+ chain);
+
+/* called when a new pad is discovered. It will perform some basic actions
+ * before trying to link something to it.
+ *
+ * - Check the caps, don't do anything when there are no caps or when they have
+ * no good type.
+ * - signal AUTOPLUG_CONTINUE to check if we need to continue autoplugging this
+ * pad.
+ * - if the caps are non-fixed, setup a handler to continue autoplugging when
+ * the caps become fixed (connect to notify::caps).
+ * - get list of factories to autoplug.
+ * - continue autoplugging to one of the factories.
+ */
+static void
+analyze_new_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad,
+ GstCaps * caps, GstDecodeChain * chain)
+{
+ gboolean apcontinue = TRUE;
+ GValueArray *factories = NULL, *result = NULL;
+ GstDecodePad *dpad;
+ GstElementFactory *factory;
+ const gchar *classification;
+ gboolean is_parser_converter = FALSE;
+ gboolean res;
+
+ GST_DEBUG_OBJECT (dbin, "Pad %s:%s caps:%" GST_PTR_FORMAT,
+ GST_DEBUG_PAD_NAME (pad), caps);
+
+ if (chain->elements
+ && src != ((GstDecodeElement *) chain->elements->data)->element
+ && src != ((GstDecodeElement *) chain->elements->data)->capsfilter) {
+ GST_ERROR_OBJECT (dbin, "New pad from not the last element in this chain");
+ return;
+ }
+
+ if (chain->endpad) {
+ GST_ERROR_OBJECT (dbin, "New pad in a chain that is already complete");
+ return;
+ }
+
+ if (chain->demuxer) {
+ GstDecodeGroup *group;
+ GstDecodeChain *oldchain = chain;
+
+ /* we are adding a new pad for a demuxer (see is_demuxer_element(),
+ * start a new chain for it */
+ CHAIN_MUTEX_LOCK (oldchain);
+ group = gst_decode_chain_get_current_group (chain);
+ if (group) {
+ chain = gst_decode_chain_new (dbin, group, pad);
+ group->children = g_list_prepend (group->children, chain);
+ }
+ CHAIN_MUTEX_UNLOCK (oldchain);
+ if (!group) {
+ GST_WARNING_OBJECT (dbin, "No current group");
+ return;
+ }
+ }
+
+ if ((caps == NULL) || gst_caps_is_empty (caps))
+ goto unknown_type;
+
+ if (gst_caps_is_any (caps))
+ goto any_caps;
+
+ dpad = gst_decode_pad_new (dbin, pad, chain);
+
+ /* 1. Emit 'autoplug-continue' the result will tell us if this pads needs
+ * further autoplugging. Only do this for fixed caps, for unfixed caps
+ * we will later come here again from the notify::caps handler. The
+ * problem with unfixed caps is that we can reliably tell if the output
+ * is e.g. accepted by a sink because only parts of the possible final
+ * caps might be accepted by the sink. */
+ if (gst_caps_is_fixed (caps))
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_CONTINUE], 0, dpad, caps,
+ &apcontinue);
+ else
+ apcontinue = TRUE;
+
+ /* 1.a if autoplug-continue is FALSE or caps is a raw format, goto pad_is_final */
+ if ((!apcontinue) || are_final_caps (dbin, caps))
+ goto expose_pad;
+
+ /* 1.b For Parser/Converter that can output different stream formats
+ * we insert a capsfilter with the sorted caps of all possible next
+ * elements and continue with the capsfilter srcpad */
+ factory = gst_element_get_factory (src);
+ classification = gst_element_factory_get_klass (factory);
+ is_parser_converter = (strstr (classification, "Parser")
+ && strstr (classification, "Converter"));
+
+ /* 1.c when the caps are not fixed yet, we can't be sure what element to
+ * connect. We delay autoplugging until the caps are fixed */
+ if (!is_parser_converter && !gst_caps_is_fixed (caps))
+ goto non_fixed;
+
+ /* 1.d else get the factories and if there's no compatible factory goto
+ * unknown_type */
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_FACTORIES], 0, dpad, caps,
+ &factories);
+
+ /* NULL means that we can expose the pad */
+ if (factories == NULL)
+ goto expose_pad;
+
+ /* if the array is empty, we have a type for which we have no decoder */
+ if (factories->n_values == 0) {
+ if (!dbin->expose_allstreams) {
+ GstCaps *raw = gst_static_caps_get (&default_raw_caps);
+
+ /* If the caps are raw, this just means we don't want to expose them */
+ if (gst_caps_can_intersect (raw, caps)) {
+ g_value_array_free (factories);
+ gst_caps_unref (raw);
+ gst_object_unref (dpad);
+ goto discarded_type;
+ }
+ gst_caps_unref (raw);
+ }
+
+ /* if not we have a unhandled type with no compatible factories */
+ g_value_array_free (factories);
+ gst_object_unref (dpad);
+ goto unknown_type;
+ }
+
+ /* 1.e sort some more. */
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_SORT], 0, dpad, caps, factories,
+ &result);
+ if (result) {
+ g_value_array_free (factories);
+ factories = result;
+ }
+
+ /* At this point we have a potential decoder, but we might not need it
+ * if it doesn't match the output caps */
+ if (!dbin->expose_allstreams && gst_caps_is_fixed (caps)) {
+ guint i;
+ const GList *tmps;
+ gboolean dontuse = FALSE;
+
+ GST_DEBUG ("Checking if we can abort early");
+
+ /* 1.f Do an early check to see if the candidates are potential decoders, but
+ * due to the fact that they decode to a mediatype that is not final we don't
+ * need them */
+
+ for (i = 0; i < factories->n_values && !dontuse; i++) {
+ GstElementFactory *factory =
+ g_value_get_object (g_value_array_get_nth (factories, i));
+ GstCaps *tcaps;
+
+ /* We are only interested in skipping decoders */
+ if (strstr (gst_element_factory_get_klass (factory), "Decoder")) {
+
+ GST_DEBUG ("Trying factory %s",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
+
+ /* Check the source pad template caps to see if they match raw caps but don't match
+ * our final caps*/
+ for (tmps = gst_element_factory_get_static_pad_templates (factory);
+ tmps && !dontuse; tmps = tmps->next) {
+ GstStaticPadTemplate *st = (GstStaticPadTemplate *) tmps->data;
+ if (st->direction != GST_PAD_SRC)
+ continue;
+ tcaps = gst_static_pad_template_get_caps (st);
+
+ apcontinue = TRUE;
+
+ /* Emit autoplug-continue to see if the caps are considered to be raw caps */
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_CONTINUE], 0, dpad, tcaps,
+ &apcontinue);
+
+ /* If autoplug-continue returns TRUE and the caps are not final, don't use them */
+ if (apcontinue && !are_final_caps (dbin, tcaps))
+ dontuse = TRUE;
+ gst_caps_unref (tcaps);
+ }
+ }
+ }
+
+ if (dontuse) {
+ gst_object_unref (dpad);
+ g_value_array_free (factories);
+ goto discarded_type;
+ }
+ }
+
+ /* 1.g now get the factory template caps and insert the capsfilter if this
+ * is a parser/converter
+ */
+ if (is_parser_converter) {
+ GstCaps *filter_caps;
+ gint i;
+ GstPad *p;
+ GstDecodeElement *delem;
+
+ g_assert (chain->elements != NULL);
+ delem = (GstDecodeElement *) chain->elements->data;
+
+ filter_caps = gst_caps_new_empty ();
+ for (i = 0; i < factories->n_values; i++) {
+ GstElementFactory *factory =
+ g_value_get_object (g_value_array_get_nth (factories, i));
+ GstCaps *tcaps, *intersection;
+ const GList *tmps;
+
+ GST_DEBUG ("Trying factory %s",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
+
+ if (gst_element_get_factory (src) == factory) {
+ GST_DEBUG ("Skipping factory");
+ continue;
+ }
+
+ for (tmps = gst_element_factory_get_static_pad_templates (factory); tmps;
+ tmps = tmps->next) {
+ GstStaticPadTemplate *st = (GstStaticPadTemplate *) tmps->data;
+ if (st->direction != GST_PAD_SINK || st->presence != GST_PAD_ALWAYS)
+ continue;
+ tcaps = gst_static_pad_template_get_caps (st);
+ intersection =
+ gst_caps_intersect_full (tcaps, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_merge (filter_caps, intersection);
+ gst_caps_unref (tcaps);
+ }
+ }
+
+ /* Append the parser caps to prevent any not-negotiated errors */
+ gst_caps_merge (filter_caps, gst_caps_copy (caps));
+
+ delem->capsfilter = gst_element_factory_make ("capsfilter", NULL);
+ g_object_set (G_OBJECT (delem->capsfilter), "caps", filter_caps, NULL);
+ gst_caps_unref (filter_caps);
+ gst_element_set_state (delem->capsfilter, GST_STATE_PAUSED);
+ gst_bin_add (GST_BIN_CAST (dbin), gst_object_ref (delem->capsfilter));
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), NULL);
+ p = gst_element_get_static_pad (delem->capsfilter, "sink");
+ gst_pad_link_full (pad, p, GST_PAD_LINK_CHECK_NOTHING);
+ gst_object_unref (p);
+ p = gst_element_get_static_pad (delem->capsfilter, "src");
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), p);
+ pad = p;
+
+ if (!gst_caps_is_fixed (caps)) {
+ g_value_array_free (factories);
+ goto non_fixed;
+ }
+ }
+
+ /* 1.h else continue autoplugging something from the list. */
+ GST_LOG_OBJECT (pad, "Let's continue discovery on this pad");
+ res = connect_pad (dbin, src, dpad, pad, caps, factories, chain);
+
+ /* Need to unref the capsfilter srcpad here if
+ * we inserted a capsfilter */
+ if (is_parser_converter)
+ gst_object_unref (pad);
+
+ gst_object_unref (dpad);
+ g_value_array_free (factories);
+
+ if (!res)
+ goto unknown_type;
+
+ return;
+
+expose_pad:
+ {
+ GST_LOG_OBJECT (dbin, "Pad is final. autoplug-continue:%d", apcontinue);
+ expose_pad (dbin, src, dpad, pad, caps, chain);
+ gst_object_unref (dpad);
+ return;
+ }
+
+discarded_type:
+ {
+ GST_LOG_OBJECT (pad, "Known type, but discarded because not final caps");
+ chain->deadend = TRUE;
+ chain->endcaps = gst_caps_ref (caps);
+
+ /* Try to expose anything */
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ gst_decode_bin_expose (dbin);
+ }
+ EXPOSE_UNLOCK (dbin);
+ do_async_done (dbin);
+
+ return;
+ }
+
+unknown_type:
+ {
+ GST_LOG_OBJECT (pad, "Unknown type, posting message and firing signal");
+
+ chain->deadend = TRUE;
+ chain->endcaps = gst_caps_ref (caps);
+
+ gst_element_post_message (GST_ELEMENT_CAST (dbin),
+ gst_missing_decoder_message_new (GST_ELEMENT_CAST (dbin), caps));
+
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_UNKNOWN_TYPE], 0, pad, caps);
+
+ /* Try to expose anything */
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ gst_decode_bin_expose (dbin);
+ }
+ EXPOSE_UNLOCK (dbin);
+
+ if (src == dbin->typefind) {
+ gchar *desc;
+
+ if (caps && !gst_caps_is_empty (caps)) {
+ desc = gst_pb_utils_get_decoder_description (caps);
+ GST_ELEMENT_ERROR (dbin, STREAM, CODEC_NOT_FOUND,
+ (_("A %s plugin is required to play this stream, "
+ "but not installed."), desc),
+ ("No decoder to handle media type '%s'",
+ gst_structure_get_name (gst_caps_get_structure (caps, 0))));
+ g_free (desc);
+ } else {
+ GST_ELEMENT_ERROR (dbin, STREAM, TYPE_NOT_FOUND,
+ (_("Could not determine type of stream")),
+ ("Stream caps %" GST_PTR_FORMAT, caps));
+ }
+ do_async_done (dbin);
+ }
+ return;
+ }
+non_fixed:
+ {
+ GST_DEBUG_OBJECT (pad, "pad has non-fixed caps delay autoplugging");
+ gst_object_unref (dpad);
+ goto setup_caps_delay;
+ }
+any_caps:
+ {
+ GST_WARNING_OBJECT (pad,
+ "pad has ANY caps, not able to autoplug to anything");
+ goto setup_caps_delay;
+ }
+setup_caps_delay:
+ {
+ GstPendingPad *ppad;
+
+ /* connect to caps notification */
+ CHAIN_MUTEX_LOCK (chain);
+ GST_LOG_OBJECT (dbin, "Chain %p has now %d dynamic pads", chain,
+ g_list_length (chain->pending_pads));
+ ppad = g_slice_new0 (GstPendingPad);
+ ppad->pad = gst_object_ref (pad);
+ ppad->chain = chain;
+ ppad->event_probe_id =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT, pad_event_cb, ppad, NULL);
+ chain->pending_pads = g_list_prepend (chain->pending_pads, ppad);
+ g_signal_connect (G_OBJECT (pad), "notify::caps",
+ G_CALLBACK (caps_notify_cb), chain);
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ /* If we're here because we have a Parser/Converter
+ * we have to unref the pad */
+ if (is_parser_converter)
+ gst_object_unref (pad);
+
+ return;
+ }
+}
+
+
+/* connect_pad:
+ *
+ * Try to connect the given pad to an element created from one of the factories,
+ * and recursively.
+ *
+ * Note that dpad is ghosting pad, and so pad is linked; be sure to unset dpad's
+ * target before trying to link pad.
+ *
+ * Returns TRUE if an element was properly created and linked
+ */
+static gboolean
+connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad,
+ GstPad * pad, GstCaps * caps, GValueArray * factories,
+ GstDecodeChain * chain)
+{
+ gboolean res = FALSE;
+ GstPad *mqpad = NULL;
+ gboolean is_demuxer = chain->parent && !chain->elements; /* First pad after the demuxer */
+
+ g_return_val_if_fail (factories != NULL, FALSE);
+ g_return_val_if_fail (factories->n_values > 0, FALSE);
+
+ GST_DEBUG_OBJECT (dbin, "pad %s:%s , chain:%p",
+ GST_DEBUG_PAD_NAME (pad), chain);
+
+ /* 1. is element demuxer or parser */
+ if (is_demuxer) {
+ GST_LOG_OBJECT (src,
+ "is a demuxer, connecting the pad through multiqueue '%s'",
+ GST_OBJECT_NAME (chain->parent->multiqueue));
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), NULL);
+ if (!(mqpad = gst_decode_group_control_demuxer_pad (chain->parent, pad)))
+ goto beach;
+ src = chain->parent->multiqueue;
+ pad = mqpad;
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), pad);
+ }
+
+ /* 2. Try to create an element and link to it */
+ while (factories->n_values > 0) {
+ GstAutoplugSelectResult ret;
+ GstElementFactory *factory;
+ GstDecodeElement *delem;
+ GstElement *element;
+ GstPad *sinkpad;
+ gboolean subtitle;
+
+ /* Set dpad target to pad again, it might've been unset
+ * below but we came back here because something failed
+ */
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), pad);
+
+ /* take first factory */
+ factory = g_value_get_object (g_value_array_get_nth (factories, 0));
+ /* Remove selected factory from the list. */
+ g_value_array_remove (factories, 0);
+
+ /* Check if the caps are really supported by the factory. The
+ * factory list is non-empty-subset filtered while caps
+ * are only accepted by a pad if they are a subset of the
+ * pad caps.
+ *
+ * FIXME: Only do this for fixed caps here. Non-fixed caps
+ * can happen if a Parser/Converter was autoplugged before
+ * this. We then assume that it will be able to convert to
+ * everything that the decoder would want.
+ *
+ * A subset check will fail here because the parser caps
+ * will be generic and while the decoder will only
+ * support a subset of the parser caps.
+ */
+ if (gst_caps_is_fixed (caps)) {
+ const GList *templs;
+ gboolean skip = FALSE;
+
+ templs = gst_element_factory_get_static_pad_templates (factory);
+
+ while (templs) {
+ GstStaticPadTemplate *templ = (GstStaticPadTemplate *) templs->data;
+
+ if (templ->direction == GST_PAD_SINK) {
+ GstCaps *templcaps = gst_static_caps_get (&templ->static_caps);
+
+ if (!gst_caps_is_subset (caps, templcaps)) {
+ gst_caps_unref (templcaps);
+ skip = TRUE;
+ break;
+ }
+
+ gst_caps_unref (templcaps);
+ }
+ templs = g_list_next (templs);
+ }
+ if (skip)
+ continue;
+ }
+
+ /* If the factory is for a parser we first check if the factory
+ * was already used for the current chain. If it was used already
+ * we would otherwise create an infinite loop here because the
+ * parser apparently accepts its own output as input.
+ * This is only done for parsers because it's perfectly valid
+ * to have other element classes after each other because a
+ * parser is the only one that does not change the data. A
+ * valid example for this would be multiple id3demux in a row.
+ */
+ if (strstr (gst_element_factory_get_klass (factory), "Parser")) {
+ gboolean skip = FALSE;
+ GList *l;
+
+ CHAIN_MUTEX_LOCK (chain);
+ for (l = chain->elements; l; l = l->next) {
+ GstDecodeElement *delem = (GstDecodeElement *) l->data;
+ GstElement *otherelement = delem->element;
+
+ if (gst_element_get_factory (otherelement) == factory) {
+ skip = TRUE;
+ break;
+ }
+ }
+ CHAIN_MUTEX_UNLOCK (chain);
+ if (skip) {
+ GST_DEBUG_OBJECT (dbin,
+ "Skipping factory '%s' because it was already used in this chain",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST (factory)));
+ continue;
+ }
+ }
+
+ /* emit autoplug-select to see what we should do with it. */
+ g_signal_emit (G_OBJECT (dbin),
+ gst_decode_bin_signals[SIGNAL_AUTOPLUG_SELECT],
+ 0, dpad, caps, factory, &ret);
+
+ switch (ret) {
+ case GST_AUTOPLUG_SELECT_TRY:
+ GST_DEBUG_OBJECT (dbin, "autoplug select requested try");
+ break;
+ case GST_AUTOPLUG_SELECT_EXPOSE:
+ GST_DEBUG_OBJECT (dbin, "autoplug select requested expose");
+ /* expose the pad, we don't have the source element */
+ expose_pad (dbin, src, dpad, pad, caps, chain);
+ res = TRUE;
+ goto beach;
+ case GST_AUTOPLUG_SELECT_SKIP:
+ GST_DEBUG_OBJECT (dbin, "autoplug select requested skip");
+ continue;
+ default:
+ GST_WARNING_OBJECT (dbin, "autoplug select returned unhandled %d", ret);
+ break;
+ }
+
+ /* 2.0. Unlink pad */
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), NULL);
+
+ /* 2.1. Try to create an element */
+ if ((element = gst_element_factory_create (factory, NULL)) == NULL) {
+ GST_WARNING_OBJECT (dbin, "Could not create an element from %s",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
+ continue;
+ }
+
+ /* ... activate it ... We do this before adding it to the bin so that we
+ * don't accidentally make it post error messages that will stop
+ * everything. */
+ if ((gst_element_set_state (element,
+ GST_STATE_READY)) == GST_STATE_CHANGE_FAILURE) {
+ GST_WARNING_OBJECT (dbin, "Couldn't set %s to READY",
+ GST_ELEMENT_NAME (element));
+ gst_object_unref (element);
+ continue;
+ }
+
+ /* 2.3. Find its sink pad, this should work after activating it. */
+ if (!(sinkpad = find_sink_pad (element))) {
+ GST_WARNING_OBJECT (dbin, "Element %s doesn't have a sink pad",
+ GST_ELEMENT_NAME (element));
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+ continue;
+ }
+
+ /* 2.4 add it ... */
+ if (!(gst_bin_add (GST_BIN_CAST (dbin), element))) {
+ GST_WARNING_OBJECT (dbin, "Couldn't add %s to the bin",
+ GST_ELEMENT_NAME (element));
+ gst_object_unref (sinkpad);
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+ continue;
+ }
+
+ /* 2.5 ...and try to link */
+ if ((gst_pad_link (pad, sinkpad)) != GST_PAD_LINK_OK) {
+ GST_WARNING_OBJECT (dbin, "Link failed on pad %s:%s",
+ GST_DEBUG_PAD_NAME (sinkpad));
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (sinkpad);
+ gst_bin_remove (GST_BIN (dbin), element);
+ continue;
+ }
+ gst_object_unref (sinkpad);
+ GST_LOG_OBJECT (dbin, "linked on pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ CHAIN_MUTEX_LOCK (chain);
+ delem = g_slice_new (GstDecodeElement);
+ delem->element = gst_object_ref (element);
+ delem->capsfilter = NULL;
+ chain->elements = g_list_prepend (chain->elements, delem);
+ chain->demuxer = is_demuxer_element (element);
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ /* link this element further */
+ connect_element (dbin, element, chain);
+
+ /* try to configure the subtitle encoding property when we can */
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
+ "subtitle-encoding")) {
+ SUBTITLE_LOCK (dbin);
+ GST_DEBUG_OBJECT (dbin,
+ "setting subtitle-encoding=%s to element", dbin->encoding);
+ g_object_set (G_OBJECT (element), "subtitle-encoding", dbin->encoding,
+ NULL);
+ SUBTITLE_UNLOCK (dbin);
+ subtitle = TRUE;
+ } else
+ subtitle = FALSE;
+
+ /* Bring the element to the state of the parent */
+ if ((gst_element_set_state (element,
+ GST_STATE_PAUSED)) == GST_STATE_CHANGE_FAILURE) {
+ GstDecodeElement *dtmp = NULL;
+ GstElement *tmp = NULL;
+
+ GST_WARNING_OBJECT (dbin, "Couldn't set %s to PAUSED",
+ GST_ELEMENT_NAME (element));
+
+ /* Remove all elements in this chain that were just added. No
+ * other thread could've added elements in the meantime */
+ CHAIN_MUTEX_LOCK (chain);
+ do {
+ GList *l;
+
+ dtmp = chain->elements->data;
+ tmp = dtmp->element;
+
+ /* Disconnect any signal handlers that might be connected
+ * in connect_element() or analyze_pad() */
+ g_signal_handlers_disconnect_by_func (tmp, pad_added_cb, chain);
+ g_signal_handlers_disconnect_by_func (tmp, pad_removed_cb, chain);
+ g_signal_handlers_disconnect_by_func (tmp, no_more_pads_cb, chain);
+
+ for (l = chain->pending_pads; l;) {
+ GstPendingPad *pp = l->data;
+ GList *n;
+
+ if (GST_PAD_PARENT (pp->pad) != tmp) {
+ l = l->next;
+ continue;
+ }
+
+ g_signal_handlers_disconnect_by_func (pp->pad, caps_notify_cb, chain);
+ gst_pad_remove_probe (pp->pad, pp->event_probe_id);
+ gst_object_unref (pp->pad);
+ g_slice_free (GstPendingPad, pp);
+
+ /* Remove element from the list, update list head and go to the
+ * next element in the list */
+ n = l->next;
+ chain->pending_pads = g_list_delete_link (chain->pending_pads, l);
+ l = n;
+ }
+
+ if (dtmp->capsfilter) {
+ gst_bin_remove (GST_BIN (dbin), dtmp->capsfilter);
+ gst_element_set_state (dtmp->capsfilter, GST_STATE_NULL);
+ gst_object_unref (dtmp->capsfilter);
+ }
+
+ gst_bin_remove (GST_BIN (dbin), tmp);
+ gst_element_set_state (tmp, GST_STATE_NULL);
+
+ gst_object_unref (tmp);
+ g_slice_free (GstDecodeElement, dtmp);
+
+ chain->elements = g_list_delete_link (chain->elements, chain->elements);
+ } while (tmp != element);
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ continue;
+ }
+ if (subtitle) {
+ SUBTITLE_LOCK (dbin);
+ /* we added the element now, add it to the list of subtitle-encoding
+ * elements when we can set the property */
+ dbin->subtitles = g_list_prepend (dbin->subtitles, element);
+ SUBTITLE_UNLOCK (dbin);
+ }
+
+ res = TRUE;
+ break;
+ }
+
+beach:
+ if (mqpad)
+ gst_object_unref (mqpad);
+
+ return res;
+}
+
+static GstCaps *
+get_pad_caps (GstPad * pad)
+{
+ GstCaps *caps;
+
+ /* first check the pad caps, if this is set, we are positively sure it is
+ * fixed and exactly what the element will produce. */
+ caps = gst_pad_get_current_caps (pad);
+
+ /* then use the getcaps function if we don't have caps. These caps might not
+ * be fixed in some cases, in which case analyze_new_pad will set up a
+ * notify::caps signal to continue autoplugging. */
+ if (caps == NULL)
+ caps = gst_pad_get_caps (pad, NULL);
+
+ return caps;
+}
+
+static gboolean
+connect_element (GstDecodeBin * dbin, GstElement * element,
+ GstDecodeChain * chain)
+{
+ GList *pads;
+ gboolean res = TRUE;
+ gboolean dynamic = FALSE;
+ GList *to_connect = NULL;
+
+ GST_DEBUG_OBJECT (dbin, "Attempting to connect element %s [chain:%p] further",
+ GST_ELEMENT_NAME (element), chain);
+
+ /* 1. Loop over pad templates, grabbing existing pads along the way */
+ for (pads = GST_ELEMENT_GET_CLASS (element)->padtemplates; pads;
+ pads = g_list_next (pads)) {
+ GstPadTemplate *templ = GST_PAD_TEMPLATE (pads->data);
+ const gchar *templ_name;
+
+ /* we are only interested in source pads */
+ if (GST_PAD_TEMPLATE_DIRECTION (templ) != GST_PAD_SRC)
+ continue;
+
+ templ_name = GST_PAD_TEMPLATE_NAME_TEMPLATE (templ);
+ GST_DEBUG_OBJECT (dbin, "got a source pad template %s", templ_name);
+
+ /* figure out what kind of pad this is */
+ switch (GST_PAD_TEMPLATE_PRESENCE (templ)) {
+ case GST_PAD_ALWAYS:
+ {
+ /* get the pad that we need to autoplug */
+ GstPad *pad = gst_element_get_static_pad (element, templ_name);
+
+ if (pad) {
+ GST_DEBUG_OBJECT (dbin, "got the pad for always template %s",
+ templ_name);
+ /* here is the pad, we need to autoplug it */
+ to_connect = g_list_prepend (to_connect, pad);
+ } else {
+ /* strange, pad is marked as always but it's not
+ * there. Fix the element */
+ GST_WARNING_OBJECT (dbin,
+ "could not get the pad for always template %s", templ_name);
+ }
+ break;
+ }
+ case GST_PAD_SOMETIMES:
+ {
+ /* try to get the pad to see if it is already created or
+ * not */
+ GstPad *pad = gst_element_get_static_pad (element, templ_name);
+
+ if (pad) {
+ GST_DEBUG_OBJECT (dbin, "got the pad for sometimes template %s",
+ templ_name);
+ /* the pad is created, we need to autoplug it */
+ to_connect = g_list_prepend (to_connect, pad);
+ } else {
+ GST_DEBUG_OBJECT (dbin,
+ "did not get the sometimes pad of template %s", templ_name);
+ /* we have an element that will create dynamic pads */
+ dynamic = TRUE;
+ }
+ break;
+ }
+ case GST_PAD_REQUEST:
+ /* ignore request pads */
+ GST_DEBUG_OBJECT (dbin, "ignoring request padtemplate %s", templ_name);
+ break;
+ }
+ }
+
+ /* 2. if there are more potential pads, connect to relevant signals */
+ if (dynamic) {
+ GST_LOG_OBJECT (dbin, "Adding signals to element %s in chain %p",
+ GST_ELEMENT_NAME (element), chain);
+ g_signal_connect (G_OBJECT (element), "pad-added",
+ G_CALLBACK (pad_added_cb), chain);
+ g_signal_connect (G_OBJECT (element), "pad-removed",
+ G_CALLBACK (pad_removed_cb), chain);
+ g_signal_connect (G_OBJECT (element), "no-more-pads",
+ G_CALLBACK (no_more_pads_cb), chain);
+ }
+
+ /* 3. for every available pad, connect it */
+ for (pads = to_connect; pads; pads = g_list_next (pads)) {
+ GstPad *pad = GST_PAD_CAST (pads->data);
+ GstCaps *caps;
+
+ caps = get_pad_caps (pad);
+ analyze_new_pad (dbin, element, pad, caps, chain);
+ if (caps)
+ gst_caps_unref (caps);
+
+ gst_object_unref (pad);
+ }
+ g_list_free (to_connect);
+
+ return res;
+}
+
+/* expose_pad:
+ *
+ * Expose the given pad on the chain as a decoded pad.
+ */
+static void
+expose_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad,
+ GstPad * pad, GstCaps * caps, GstDecodeChain * chain)
+{
+ GstPad *mqpad = NULL;
+
+ GST_DEBUG_OBJECT (dbin, "pad %s:%s, chain:%p",
+ GST_DEBUG_PAD_NAME (pad), chain);
+
+ /* If this is the first pad for this chain, there are no other elements
+ * and the source element is not the multiqueue we must link through the
+ * multiqueue.
+ *
+ * This is the case if a demuxer directly exposed a raw pad.
+ */
+ if (chain->parent && !chain->elements && src != chain->parent->multiqueue) {
+ GST_LOG_OBJECT (src, "connecting the pad through multiqueue");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), NULL);
+ if (!(mqpad = gst_decode_group_control_demuxer_pad (chain->parent, pad)))
+ goto beach;
+ pad = mqpad;
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), pad);
+ }
+
+ gst_decode_pad_activate (dpad, chain);
+ chain->endpad = gst_object_ref (dpad);
+ chain->endcaps = gst_caps_ref (caps);
+
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ gst_decode_bin_expose (dbin);
+ }
+ EXPOSE_UNLOCK (dbin);
+
+ if (mqpad)
+ gst_object_unref (mqpad);
+
+beach:
+ return;
+}
+
+/* check_upstream_seekable:
+ *
+ * Check if upstream is seekable.
+ */
+static void
+check_upstream_seekable (GstDecodeBin * dbin, GstPad * pad)
+{
+ GstQuery *query;
+ gint64 start = -1, stop = -1;
+
+ dbin->upstream_seekable = FALSE;
+
+ query = gst_query_new_seeking (GST_FORMAT_BYTES);
+ if (!gst_pad_peer_query (pad, query)) {
+ GST_DEBUG_OBJECT (dbin, "seeking query failed");
+ gst_query_unref (query);
+ return;
+ }
+
+ gst_query_parse_seeking (query, NULL, &dbin->upstream_seekable,
+ &start, &stop);
+
+ gst_query_unref (query);
+
+ /* try harder to query upstream size if we didn't get it the first time */
+ if (dbin->upstream_seekable && stop == -1) {
+ GST_DEBUG_OBJECT (dbin, "doing duration query to fix up unset stop");
+ gst_pad_query_peer_duration (pad, GST_FORMAT_BYTES, &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 (dbin->upstream_seekable && (start != 0 || stop <= start)) {
+ GST_DEBUG_OBJECT (dbin, "seekable but unknown start/stop -> disable");
+ dbin->upstream_seekable = FALSE;
+ }
+
+ GST_DEBUG_OBJECT (dbin, "upstream seekable: %d", dbin->upstream_seekable);
+}
+
+static void
+type_found (GstElement * typefind, guint probability,
+ GstCaps * caps, GstDecodeBin * decode_bin)
+{
+ GstPad *pad, *sink_pad;
+
+ GST_DEBUG_OBJECT (decode_bin, "typefind found caps %" GST_PTR_FORMAT, caps);
+
+ /* If the typefinder (but not something else) finds text/plain - i.e. that's
+ * the top-level type of the file - then error out.
+ */
+ if (gst_structure_has_name (gst_caps_get_structure (caps, 0), "text/plain")) {
+ GST_ELEMENT_ERROR (decode_bin, STREAM, WRONG_TYPE,
+ (_("This appears to be a text file")),
+ ("decodebin cannot decode plain text files"));
+ goto exit;
+ }
+
+ /* FIXME: we can only deal with one type, we don't yet support dynamically changing
+ * caps from the typefind element */
+ if (decode_bin->have_type || decode_bin->decode_chain)
+ goto exit;
+
+ decode_bin->have_type = TRUE;
+
+ pad = gst_element_get_static_pad (typefind, "src");
+ sink_pad = gst_element_get_static_pad (typefind, "sink");
+
+ /* if upstream is seekable we can safely set a limit in time to the queues so
+ * that streams at low bitrates can preroll */
+ check_upstream_seekable (decode_bin, sink_pad);
+
+ /* need some lock here to prevent race with shutdown state change
+ * which might yank away e.g. decode_chain while building stuff here.
+ * In typical cases, STREAM_LOCK is held and handles that, it need not
+ * be held (if called from a proxied setcaps), so grab it anyway */
+ GST_PAD_STREAM_LOCK (sink_pad);
+ decode_bin->decode_chain = gst_decode_chain_new (decode_bin, NULL, pad);
+ analyze_new_pad (decode_bin, typefind, pad, caps, decode_bin->decode_chain);
+ GST_PAD_STREAM_UNLOCK (sink_pad);
+
+ gst_object_unref (sink_pad);
+ gst_object_unref (pad);
+
+exit:
+ return;
+}
+
+static GstProbeReturn
+pad_event_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer data)
+{
+ GstEvent *event = type_data;
+ GstPendingPad *ppad = (GstPendingPad *) data;
+ GstDecodeChain *chain = ppad->chain;
+ GstDecodeBin *dbin = chain->dbin;
+
+ g_assert (ppad);
+ g_assert (chain);
+ g_assert (dbin);
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ GST_DEBUG_OBJECT (dbin, "Received EOS on a non final pad, this stream "
+ "ended too early");
+ chain->deadend = TRUE;
+ /* we don't set the endcaps because NULL endcaps means early EOS */
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain))
+ gst_decode_bin_expose (dbin);
+ EXPOSE_UNLOCK (dbin);
+ break;
+ default:
+ break;
+ }
+ return GST_PROBE_OK;
+}
+
+static void
+pad_added_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain)
+{
+ GstCaps *caps;
+ GstDecodeBin *dbin;
+
+ dbin = chain->dbin;
+
+ GST_DEBUG_OBJECT (pad, "pad added, chain:%p", chain);
+
+ caps = get_pad_caps (pad);
+ analyze_new_pad (dbin, element, pad, caps, chain);
+ if (caps)
+ gst_caps_unref (caps);
+
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ GST_LOG_OBJECT (dbin,
+ "That was the last dynamic object, now attempting to expose the group");
+ if (!gst_decode_bin_expose (dbin))
+ GST_WARNING_OBJECT (dbin, "Couldn't expose group");
+ }
+ EXPOSE_UNLOCK (dbin);
+}
+
+static void
+pad_removed_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain)
+{
+ GList *l;
+
+ GST_LOG_OBJECT (pad, "pad removed, chain:%p", chain);
+
+ /* In fact, we don't have to do anything here, the active group will be
+ * removed when the group's multiqueue is drained */
+ CHAIN_MUTEX_LOCK (chain);
+ for (l = chain->pending_pads; l; l = l->next) {
+ GstPendingPad *ppad = l->data;
+ GstPad *opad = ppad->pad;
+
+ if (pad == opad) {
+ g_signal_handlers_disconnect_by_func (pad, caps_notify_cb, chain);
+ gst_pending_pad_free (ppad);
+ chain->pending_pads = g_list_delete_link (chain->pending_pads, l);
+ break;
+ }
+ }
+ CHAIN_MUTEX_UNLOCK (chain);
+}
+
+static void
+no_more_pads_cb (GstElement * element, GstDecodeChain * chain)
+{
+ GstDecodeGroup *group = NULL;
+
+ GST_LOG_OBJECT (element, "got no more pads");
+
+ CHAIN_MUTEX_LOCK (chain);
+ if (!chain->elements
+ || ((GstDecodeElement *) chain->elements->data)->element != element) {
+ GST_LOG_OBJECT (chain->dbin, "no-more-pads from old chain element '%s'",
+ GST_OBJECT_NAME (element));
+ CHAIN_MUTEX_UNLOCK (chain);
+ return;
+ } else if (!chain->demuxer) {
+ GST_LOG_OBJECT (chain->dbin, "no-more-pads from a non-demuxer element '%s'",
+ GST_OBJECT_NAME (element));
+ CHAIN_MUTEX_UNLOCK (chain);
+ return;
+ }
+
+ /* when we received no_more_pads, we can complete the pads of the chain */
+ if (!chain->next_groups && chain->active_group) {
+ group = chain->active_group;
+ } else if (chain->next_groups) {
+ group = chain->next_groups->data;
+ }
+ if (!group) {
+ GST_ERROR_OBJECT (chain->dbin, "can't find group for element");
+ CHAIN_MUTEX_UNLOCK (chain);
+ return;
+ }
+
+ GST_DEBUG_OBJECT (element, "Setting group %p to complete", group);
+
+ group->no_more_pads = TRUE;
+ /* this group has prerolled enough to not need more pads,
+ * we can probably set its buffering state to playing now */
+ GST_DEBUG_OBJECT (group->dbin, "Setting group %p multiqueue to "
+ "'playing' buffering mode", group);
+ decodebin_set_queue_size (group->dbin, group->multiqueue, FALSE);
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ EXPOSE_LOCK (chain->dbin);
+ if (gst_decode_chain_is_complete (chain->dbin->decode_chain)) {
+ gst_decode_bin_expose (chain->dbin);
+ }
+ EXPOSE_UNLOCK (chain->dbin);
+}
+
+static void
+caps_notify_cb (GstPad * pad, GParamSpec * unused, GstDecodeChain * chain)
+{
+ GstElement *element;
+ GList *l;
+
+ GST_LOG_OBJECT (pad, "Notified caps for pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ /* Disconnect this; if we still need it, we'll reconnect to this in
+ * analyze_new_pad */
+ g_signal_handlers_disconnect_by_func (pad, caps_notify_cb, chain);
+
+ element = GST_ELEMENT_CAST (gst_pad_get_parent (pad));
+
+ CHAIN_MUTEX_LOCK (chain);
+ for (l = chain->pending_pads; l; l = l->next) {
+ GstPendingPad *ppad = l->data;
+ if (ppad->pad == pad) {
+ gst_pending_pad_free (ppad);
+ chain->pending_pads = g_list_delete_link (chain->pending_pads, l);
+ break;
+ }
+ }
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ pad_added_cb (element, pad, chain);
+
+ gst_object_unref (element);
+}
+
+/* Decide whether an element is a demuxer based on the
+ * klass and number/type of src pad templates it has */
+static gboolean
+is_demuxer_element (GstElement * srcelement)
+{
+ GstElementFactory *srcfactory;
+ GstElementClass *elemclass;
+ GList *walk;
+ const gchar *klass;
+ gint potential_src_pads = 0;
+
+ srcfactory = gst_element_get_factory (srcelement);
+ klass = gst_element_factory_get_klass (srcfactory);
+
+ /* Can't be a demuxer unless it has Demux in the klass name */
+ if (!strstr (klass, "Demux"))
+ return FALSE;
+
+ /* Walk the src pad templates and count how many the element
+ * might produce */
+ elemclass = GST_ELEMENT_GET_CLASS (srcelement);
+
+ walk = gst_element_class_get_pad_template_list (elemclass);
+ while (walk != NULL) {
+ GstPadTemplate *templ;
+
+ templ = (GstPadTemplate *) walk->data;
+ if (GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) {
+ switch (GST_PAD_TEMPLATE_PRESENCE (templ)) {
+ case GST_PAD_ALWAYS:
+ case GST_PAD_SOMETIMES:
+ if (strstr (GST_PAD_TEMPLATE_NAME_TEMPLATE (templ), "%"))
+ potential_src_pads += 2; /* Might make multiple pads */
+ else
+ potential_src_pads += 1;
+ break;
+ case GST_PAD_REQUEST:
+ potential_src_pads += 2;
+ break;
+ }
+ }
+ walk = g_list_next (walk);
+ }
+
+ if (potential_src_pads < 2)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Returns TRUE if the caps are compatible with the caps specified in the 'caps'
+ * property (which by default are the raw caps)
+ *
+ * The decodebin_lock should be taken !
+ */
+static gboolean
+are_final_caps (GstDecodeBin * dbin, GstCaps * caps)
+{
+ gboolean res;
+
+ GST_LOG_OBJECT (dbin, "Checking with caps %" GST_PTR_FORMAT, caps);
+
+ /* lock for getting the caps */
+ GST_OBJECT_LOCK (dbin);
+ res = gst_caps_can_intersect (dbin->caps, caps);
+ GST_OBJECT_UNLOCK (dbin);
+
+ GST_LOG_OBJECT (dbin, "Caps are %sfinal caps", res ? "" : "not ");
+
+ return res;
+}
+
+/****
+ * GstDecodeChain functions
+ ****/
+
+/* gst_decode_chain_get_current_group:
+ *
+ * Returns the current group of this chain, to which
+ * new chains should be attached or NULL if the last
+ * group didn't have no-more-pads.
+ *
+ * Not MT-safe: Call with parent chain lock!
+ */
+static GstDecodeGroup *
+gst_decode_chain_get_current_group (GstDecodeChain * chain)
+{
+ GstDecodeGroup *group;
+
+ if (!chain->next_groups && chain->active_group
+ && chain->active_group->overrun && !chain->active_group->no_more_pads) {
+ GST_WARNING_OBJECT (chain->dbin,
+ "Currently active group %p is exposed"
+ " and wants to add a new pad without having signaled no-more-pads",
+ chain->active_group);
+ return NULL;
+ }
+
+ if (chain->next_groups && (group = chain->next_groups->data) && group->overrun
+ && !group->no_more_pads) {
+ GST_WARNING_OBJECT (chain->dbin,
+ "Currently newest pending group %p "
+ "had overflow but didn't signal no-more-pads", group);
+ return NULL;
+ }
+
+ /* Now we know that we can really return something useful */
+ if (!chain->active_group) {
+ chain->active_group = group = gst_decode_group_new (chain->dbin, chain);
+ } else if (!chain->active_group->overrun
+ && !chain->active_group->no_more_pads) {
+ group = chain->active_group;
+ } else if (chain->next_groups && (group = chain->next_groups->data)
+ && !group->overrun && !group->no_more_pads) {
+ /* group = chain->next_groups->data */
+ } else {
+ group = gst_decode_group_new (chain->dbin, chain);
+ chain->next_groups = g_list_prepend (chain->next_groups, group);
+ }
+
+ return group;
+}
+
+static void gst_decode_group_free_internal (GstDecodeGroup * group,
+ gboolean hide);
+
+static void
+gst_decode_chain_free_internal (GstDecodeChain * chain, gboolean hide)
+{
+ GList *l;
+
+ CHAIN_MUTEX_LOCK (chain);
+
+ GST_DEBUG_OBJECT (chain->dbin, "%s chain %p", (hide ? "Hiding" : "Freeing"),
+ chain);
+
+ if (chain->active_group) {
+ gst_decode_group_free_internal (chain->active_group, hide);
+ if (!hide)
+ chain->active_group = NULL;
+ }
+
+ for (l = chain->next_groups; l; l = l->next) {
+ gst_decode_group_free_internal ((GstDecodeGroup *) l->data, hide);
+ if (!hide)
+ l->data = NULL;
+ }
+ if (!hide) {
+ g_list_free (chain->next_groups);
+ chain->next_groups = NULL;
+ }
+
+ if (!hide) {
+ for (l = chain->old_groups; l; l = l->next) {
+ GstDecodeGroup *group = l->data;
+
+ gst_decode_group_free (group);
+ }
+ g_list_free (chain->old_groups);
+ chain->old_groups = NULL;
+ }
+
+ for (l = chain->pending_pads; l; l = l->next) {
+ GstPendingPad *ppad = l->data;
+ GstPad *pad = ppad->pad;
+
+ g_signal_handlers_disconnect_by_func (pad, caps_notify_cb, chain);
+ gst_pending_pad_free (ppad);
+ l->data = NULL;
+ }
+ g_list_free (chain->pending_pads);
+ chain->pending_pads = NULL;
+
+ for (l = chain->elements; l; l = l->next) {
+ GstDecodeElement *delem = l->data;
+ GstElement *element = delem->element;
+
+ g_signal_handlers_disconnect_by_func (element, pad_added_cb, chain);
+ g_signal_handlers_disconnect_by_func (element, pad_removed_cb, chain);
+ g_signal_handlers_disconnect_by_func (element, no_more_pads_cb, chain);
+
+ if (delem->capsfilter) {
+ if (GST_OBJECT_PARENT (delem->capsfilter) ==
+ GST_OBJECT_CAST (chain->dbin))
+ gst_bin_remove (GST_BIN_CAST (chain->dbin), delem->capsfilter);
+ if (!hide) {
+ gst_element_set_state (delem->capsfilter, GST_STATE_NULL);
+ }
+ }
+
+ if (GST_OBJECT_PARENT (element) == GST_OBJECT_CAST (chain->dbin))
+ gst_bin_remove (GST_BIN_CAST (chain->dbin), element);
+ if (!hide) {
+ gst_element_set_state (element, GST_STATE_NULL);
+ }
+
+ SUBTITLE_LOCK (chain->dbin);
+ /* remove possible subtitle element */
+ chain->dbin->subtitles = g_list_remove (chain->dbin->subtitles, element);
+ SUBTITLE_UNLOCK (chain->dbin);
+
+ if (!hide) {
+ if (delem->capsfilter) {
+ gst_object_unref (delem->capsfilter);
+ delem->capsfilter = NULL;
+ }
+
+ gst_object_unref (element);
+ l->data = NULL;
+
+ g_slice_free (GstDecodeElement, delem);
+ }
+ }
+ if (!hide) {
+ g_list_free (chain->elements);
+ chain->elements = NULL;
+ }
+
+ if (chain->endpad) {
+ if (chain->endpad->exposed) {
+ gst_element_remove_pad (GST_ELEMENT_CAST (chain->dbin),
+ GST_PAD_CAST (chain->endpad));
+ }
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (chain->endpad), NULL);
+ chain->endpad->exposed = FALSE;
+ if (!hide) {
+ gst_object_unref (chain->endpad);
+ chain->endpad = NULL;
+ }
+ }
+
+ if (chain->pad) {
+ gst_object_unref (chain->pad);
+ chain->pad = NULL;
+ }
+
+ if (chain->endcaps) {
+ gst_caps_unref (chain->endcaps);
+ chain->endcaps = NULL;
+ }
+
+ GST_DEBUG_OBJECT (chain->dbin, "%s chain %p", (hide ? "Hidden" : "Freed"),
+ chain);
+ CHAIN_MUTEX_UNLOCK (chain);
+ if (!hide) {
+ g_mutex_free (chain->lock);
+ g_slice_free (GstDecodeChain, chain);
+ }
+}
+
+/* gst_decode_chain_free:
+ *
+ * Completely frees and removes the chain and all
+ * child groups from decodebin.
+ *
+ * MT-safe, don't hold the chain lock or any child chain's lock
+ * when calling this!
+ */
+static void
+gst_decode_chain_free (GstDecodeChain * chain)
+{
+ gst_decode_chain_free_internal (chain, FALSE);
+}
+
+/* gst_decode_chain_new:
+ *
+ * Creates a new decode chain and initializes it.
+ *
+ * It's up to the caller to add it to the list of child chains of
+ * a group!
+ */
+static GstDecodeChain *
+gst_decode_chain_new (GstDecodeBin * dbin, GstDecodeGroup * parent,
+ GstPad * pad)
+{
+ GstDecodeChain *chain = g_slice_new0 (GstDecodeChain);
+
+ GST_DEBUG_OBJECT (dbin, "Creating new chain %p with parent group %p", chain,
+ parent);
+
+ chain->dbin = dbin;
+ chain->parent = parent;
+ chain->lock = g_mutex_new ();
+ chain->pad = gst_object_ref (pad);
+
+ return chain;
+}
+
+/****
+ * GstDecodeGroup functions
+ ****/
+
+/* The overrun callback is used to expose groups that have not yet had their
+ * no_more_pads called while the (large) multiqueue overflowed. When this
+ * happens we must assume that the no_more_pads will not arrive anymore and we
+ * must expose the pads that we have.
+ */
+static void
+multi_queue_overrun_cb (GstElement * queue, GstDecodeGroup * group)
+{
+ GstDecodeBin *dbin;
+
+ dbin = group->dbin;
+
+ GST_LOG_OBJECT (dbin, "multiqueue '%s' (%p) is full", GST_OBJECT_NAME (queue),
+ queue);
+
+ group->overrun = TRUE;
+
+ /* FIXME: We should make sure that everything gets exposed now
+ * even if child chains are not complete because the will never
+ * be complete! Ignore any non-complete chains when exposing
+ * and never expose them later
+ */
+
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ if (!gst_decode_bin_expose (dbin))
+ GST_WARNING_OBJECT (dbin, "Couldn't expose group");
+ }
+ EXPOSE_UNLOCK (group->dbin);
+}
+
+static void
+gst_decode_group_free_internal (GstDecodeGroup * group, gboolean hide)
+{
+ GList *l;
+
+ GST_DEBUG_OBJECT (group->dbin, "%s group %p", (hide ? "Hiding" : "Freeing"),
+ group);
+ for (l = group->children; l; l = l->next) {
+ GstDecodeChain *chain = (GstDecodeChain *) l->data;
+
+ gst_decode_chain_free_internal (chain, hide);
+ if (!hide)
+ l->data = NULL;
+ }
+ if (!hide) {
+ g_list_free (group->children);
+ group->children = NULL;
+ }
+
+ if (!hide) {
+ for (l = group->reqpads; l; l = l->next) {
+ GstPad *pad = l->data;
+
+ gst_element_release_request_pad (group->multiqueue, pad);
+ gst_object_unref (pad);
+ l->data = NULL;
+ }
+ g_list_free (group->reqpads);
+ group->reqpads = NULL;
+ }
+
+ if (group->multiqueue) {
+ if (group->overrunsig) {
+ g_signal_handler_disconnect (group->multiqueue, group->overrunsig);
+ group->overrunsig = 0;
+ }
+
+ if (GST_OBJECT_PARENT (group->multiqueue) == GST_OBJECT_CAST (group->dbin))
+ gst_bin_remove (GST_BIN_CAST (group->dbin), group->multiqueue);
+ if (!hide) {
+ gst_element_set_state (group->multiqueue, GST_STATE_NULL);
+ gst_object_unref (group->multiqueue);
+ group->multiqueue = NULL;
+ }
+ }
+
+ GST_DEBUG_OBJECT (group->dbin, "%s group %p", (hide ? "Hided" : "Freed"),
+ group);
+ if (!hide)
+ g_slice_free (GstDecodeGroup, group);
+}
+
+/* gst_decode_group_free:
+ *
+ * Completely frees and removes the decode group and all
+ * it's children.
+ *
+ * Never call this from any streaming thread!
+ *
+ * Not MT-safe, call with parent's chain lock!
+ */
+static void
+gst_decode_group_free (GstDecodeGroup * group)
+{
+ gst_decode_group_free_internal (group, FALSE);
+}
+
+/* gst_decode_group_hide:
+ *
+ * Hide the decode group only, this means that
+ * all child endpads are removed from decodebin
+ * and all signals are unconnected.
+ *
+ * No element is set to NULL state and completely
+ * unrefed here.
+ *
+ * Can be called from streaming threads.
+ *
+ * Not MT-safe, call with parent's chain lock!
+ */
+static void
+gst_decode_group_hide (GstDecodeGroup * group)
+{
+ gst_decode_group_free_internal (group, TRUE);
+}
+
+/* configure queue sizes, this depends on the buffering method and if we are
+ * playing or prerolling. */
+static void
+decodebin_set_queue_size (GstDecodeBin * dbin, GstElement * multiqueue,
+ gboolean preroll)
+{
+ guint max_bytes, max_buffers;
+ guint64 max_time;
+
+ if (preroll || dbin->use_buffering) {
+ /* takes queue limits, initially we only queue up up to the max bytes limit,
+ * with a default of 2MB. we use the same values for buffering mode. */
+ if ((max_bytes = dbin->max_size_bytes) == 0)
+ max_bytes = AUTO_PREROLL_SIZE_BYTES;
+ if ((max_buffers = dbin->max_size_buffers) == 0)
+ max_buffers = AUTO_PREROLL_SIZE_BUFFERS;
+ if ((max_time = dbin->max_size_time) == 0)
+ max_time = dbin->upstream_seekable ? AUTO_PREROLL_SEEKABLE_SIZE_TIME :
+ AUTO_PREROLL_NOT_SEEKABLE_SIZE_TIME;
+ } else {
+ /* update runtime limits. At runtime, we try to keep the amount of buffers
+ * in the queues as low as possible (but at least 5 buffers). */
+ if ((max_bytes = dbin->max_size_bytes) == 0)
+ max_bytes = AUTO_PLAY_SIZE_BYTES;
+ if ((max_buffers = dbin->max_size_buffers) == 0)
+ max_buffers = AUTO_PLAY_SIZE_BUFFERS;
+ if ((max_time = dbin->max_size_time) == 0)
+ max_time = AUTO_PLAY_SIZE_TIME;
+ }
+
+ g_object_set (multiqueue,
+ "max-size-bytes", max_bytes, "max-size-time", max_time,
+ "max-size-buffers", max_buffers, NULL);
+}
+
+/* gst_decode_group_new:
+ * @dbin: Parent decodebin
+ * @parent: Parent chain or %NULL
+ *
+ * Creates a new GstDecodeGroup. It is up to the caller to add it to the list
+ * of groups.
+ */
+static GstDecodeGroup *
+gst_decode_group_new (GstDecodeBin * dbin, GstDecodeChain * parent)
+{
+ GstDecodeGroup *group = g_slice_new0 (GstDecodeGroup);
+ GstElement *mq;
+
+ GST_DEBUG_OBJECT (dbin, "Creating new group %p with parent chain %p", group,
+ parent);
+
+ group->dbin = dbin;
+ group->parent = parent;
+
+ mq = group->multiqueue = gst_element_factory_make ("multiqueue", NULL);
+ if (G_UNLIKELY (!group->multiqueue))
+ goto missing_multiqueue;
+
+ /* default is for use-buffering is FALSE */
+ if (dbin->use_buffering) {
+ g_object_set (mq,
+ "use-buffering", TRUE,
+ "low-percent", dbin->low_percent,
+ "high-percent", dbin->high_percent, NULL);
+ }
+
+ /* configure queue sizes for preroll */
+ decodebin_set_queue_size (dbin, mq, TRUE);
+
+ group->overrunsig = g_signal_connect (G_OBJECT (mq), "overrun",
+ G_CALLBACK (multi_queue_overrun_cb), group);
+
+ gst_bin_add (GST_BIN (dbin), gst_object_ref (mq));
+ gst_element_set_state (mq, GST_STATE_PAUSED);
+
+ return group;
+
+ /* ERRORS */
+missing_multiqueue:
+ {
+ gst_element_post_message (GST_ELEMENT_CAST (dbin),
+ gst_missing_element_message_new (GST_ELEMENT_CAST (dbin),
+ "multiqueue"));
+ GST_ELEMENT_ERROR (dbin, CORE, MISSING_PLUGIN, (NULL), ("no multiqueue!"));
+ g_slice_free (GstDecodeGroup, group);
+ return NULL;
+ }
+}
+
+/* gst_decode_group_control_demuxer_pad
+ *
+ * Adds a new demuxer srcpad to the given group.
+ *
+ * Returns the srcpad of the multiqueue corresponding the given pad.
+ * Returns NULL if there was an error.
+ */
+static GstPad *
+gst_decode_group_control_demuxer_pad (GstDecodeGroup * group, GstPad * pad)
+{
+ GstDecodeBin *dbin;
+ GstPad *srcpad, *sinkpad;
+ GstIterator *it = NULL;
+ GValue item = { 0, };
+
+ dbin = group->dbin;
+
+ GST_LOG_OBJECT (dbin, "group:%p pad %s:%s", group, GST_DEBUG_PAD_NAME (pad));
+
+ srcpad = NULL;
+
+ if (G_UNLIKELY (!group->multiqueue))
+ return NULL;
+
+ if (!(sinkpad = gst_element_get_request_pad (group->multiqueue, "sink%d"))) {
+ GST_ERROR_OBJECT (dbin, "Couldn't get sinkpad from multiqueue");
+ return NULL;
+ }
+
+ if ((gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK)) {
+ GST_ERROR_OBJECT (dbin, "Couldn't link demuxer and multiqueue");
+ goto error;
+ }
+
+ it = gst_pad_iterate_internal_links (sinkpad);
+
+ if (!it || (gst_iterator_next (it, &item)) != GST_ITERATOR_OK
+ || ((srcpad = g_value_dup_object (&item)) == NULL)) {
+ GST_ERROR_OBJECT (dbin,
+ "Couldn't get srcpad from multiqueue for sinkpad %" GST_PTR_FORMAT,
+ sinkpad);
+ goto error;
+ }
+ CHAIN_MUTEX_LOCK (group->parent);
+ group->reqpads = g_list_prepend (group->reqpads, gst_object_ref (sinkpad));
+ CHAIN_MUTEX_UNLOCK (group->parent);
+
+beach:
+ g_value_unset (&item);
+ if (it)
+ gst_iterator_free (it);
+ gst_object_unref (sinkpad);
+ return srcpad;
+
+error:
+ gst_element_release_request_pad (group->multiqueue, sinkpad);
+ goto beach;
+}
+
+/* gst_decode_group_is_complete:
+ *
+ * Checks if the group is complete, this means that
+ * a) overrun of the multiqueue or no-more-pads happened
+ * b) all child chains are complete
+ *
+ * Not MT-safe, always call with decodebin expose lock
+ */
+static gboolean
+gst_decode_group_is_complete (GstDecodeGroup * group)
+{
+ GList *l;
+ gboolean complete = TRUE;
+
+ if (!group->overrun && !group->no_more_pads) {
+ complete = FALSE;
+ goto out;
+ }
+
+ for (l = group->children; l; l = l->next) {
+ GstDecodeChain *chain = l->data;
+
+ if (!gst_decode_chain_is_complete (chain)) {
+ complete = FALSE;
+ goto out;
+ }
+ }
+
+out:
+ GST_DEBUG_OBJECT (group->dbin, "Group %p is complete: %d", group, complete);
+ return complete;
+}
+
+/* gst_decode_chain_is_complete:
+ *
+ * Returns TRUE if the chain is complete, this means either
+ * a) This chain is a dead end, i.e. we have no suitable plugins
+ * b) This chain ends in an endpad and this is blocked or exposed
+ *
+ * Not MT-safe, always call with decodebin expose lock
+ */
+static gboolean
+gst_decode_chain_is_complete (GstDecodeChain * chain)
+{
+ gboolean complete = FALSE;
+
+ CHAIN_MUTEX_LOCK (chain);
+ if (chain->deadend) {
+ complete = TRUE;
+ goto out;
+ }
+
+ if (chain->endpad && (chain->endpad->blocked || chain->endpad->exposed)) {
+ complete = TRUE;
+ goto out;
+ }
+
+ if (chain->demuxer) {
+ if (chain->active_group
+ && gst_decode_group_is_complete (chain->active_group)) {
+ complete = TRUE;
+ goto out;
+ }
+ }
+
+out:
+ CHAIN_MUTEX_UNLOCK (chain);
+ GST_DEBUG_OBJECT (chain->dbin, "Chain %p is complete: %d", chain, complete);
+ return complete;
+}
+
+static gboolean
+drain_and_switch_chains (GstDecodeChain * chain, GstDecodePad * drainpad,
+ gboolean * last_group, gboolean * drained, gboolean * switched);
+/* drain_and_switch_chains/groups:
+ *
+ * CALL WITH CHAIN LOCK (or group parent) TAKEN !
+ *
+ * Goes down the chains/groups until it finds the chain
+ * to which the drainpad belongs.
+ *
+ * It marks that pad/chain as drained and then will figure
+ * out which group to switch to or not.
+ *
+ * last_chain will be set to TRUE if the group to which the
+ * pad belongs is the last one.
+ *
+ * drained will be set to TRUE if the chain/group is drained.
+ *
+ * Returns: TRUE if the chain contained the target pad */
+static gboolean
+drain_and_switch_group (GstDecodeGroup * group, GstDecodePad * drainpad,
+ gboolean * last_group, gboolean * drained, gboolean * switched)
+{
+ gboolean handled = FALSE;
+ gboolean alldrained = TRUE;
+ GList *tmp;
+
+ GST_DEBUG ("Checking group %p (target pad %s:%s)",
+ group, GST_DEBUG_PAD_NAME (drainpad));
+
+ /* Definitely can't be in drained groups */
+ if (G_UNLIKELY (group->drained)) {
+ goto beach;
+ }
+
+ /* Figure out if all our chains are drained with the
+ * new information */
+ for (tmp = group->children; tmp; tmp = tmp->next) {
+ GstDecodeChain *chain = (GstDecodeChain *) tmp->data;
+ gboolean subdrained = FALSE;
+
+ handled |=
+ drain_and_switch_chains (chain, drainpad, last_group, &subdrained,
+ switched);
+ if (!subdrained)
+ alldrained = FALSE;
+ }
+
+beach:
+ GST_DEBUG ("group %p (last_group:%d, drained:%d, switched:%d, handled:%d)",
+ group, *last_group, alldrained, *switched, handled);
+ *drained = alldrained;
+ return handled;
+}
+
+static gboolean
+drain_and_switch_chains (GstDecodeChain * chain, GstDecodePad * drainpad,
+ gboolean * last_group, gboolean * drained, gboolean * switched)
+{
+ gboolean handled = FALSE;
+ GstDecodeBin *dbin = chain->dbin;
+
+ GST_DEBUG ("Checking chain %p (target pad %s:%s)",
+ chain, GST_DEBUG_PAD_NAME (drainpad));
+
+ CHAIN_MUTEX_LOCK (chain);
+
+ if (chain->endpad) {
+ /* Check if we're reached the target endchain */
+ if (chain == drainpad->chain) {
+ GST_DEBUG ("Found the target chain");
+ drainpad->drained = TRUE;
+ handled = TRUE;
+ }
+
+ *drained = chain->endpad->drained;
+ goto beach;
+ }
+
+ /* We known there are groups to switch to */
+ if (chain->next_groups)
+ *last_group = FALSE;
+
+ /* Check the active group */
+ if (chain->active_group) {
+ gboolean subdrained = FALSE;
+ handled = drain_and_switch_group (chain->active_group, drainpad,
+ last_group, &subdrained, switched);
+
+ /* The group is drained, see if we can switch to another */
+ if (handled && subdrained && !*switched) {
+ if (chain->next_groups) {
+ /* Switch to next group */
+ GST_DEBUG_OBJECT (dbin, "Hiding current group %p", chain->active_group);
+ gst_decode_group_hide (chain->active_group);
+ chain->old_groups =
+ g_list_prepend (chain->old_groups, chain->active_group);
+ GST_DEBUG_OBJECT (dbin, "Switching to next group %p",
+ chain->next_groups->data);
+ chain->active_group = chain->next_groups->data;
+ chain->next_groups =
+ g_list_delete_link (chain->next_groups, chain->next_groups);
+ *switched = TRUE;
+ *drained = FALSE;
+ } else {
+ GST_DEBUG ("Group %p was the last in chain %p", chain->active_group,
+ chain);
+ *drained = TRUE;
+ /* We're drained ! */
+ }
+ }
+ }
+
+beach:
+ CHAIN_MUTEX_UNLOCK (chain);
+
+ GST_DEBUG ("Chain %p (handled:%d, last_group:%d, drained:%d, switched:%d)",
+ chain, handled, *last_group, *drained, *switched);
+
+ return handled;
+}
+
+/* check if the group is drained, meaning all pads have seen an EOS
+ * event. */
+static gboolean
+gst_decode_pad_handle_eos (GstDecodePad * pad)
+{
+ gboolean last_group = TRUE;
+ gboolean switched = FALSE;
+ gboolean drained = FALSE;
+ GstDecodeChain *chain = pad->chain;
+ GstDecodeBin *dbin = chain->dbin;
+
+ GST_LOG_OBJECT (dbin, "pad %p", pad);
+ drain_and_switch_chains (dbin->decode_chain, pad, &last_group, &drained,
+ &switched);
+
+ if (switched) {
+ /* If we resulted in a group switch, expose what's needed */
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain))
+ gst_decode_bin_expose (dbin);
+ EXPOSE_UNLOCK (dbin);
+ }
+
+ return last_group;
+}
+
+/* gst_decode_group_is_drained:
+ *
+ * Check is this group is drained and cache this result.
+ * The group is drained if all child chains are drained.
+ *
+ * Not MT-safe, call with group->parent's lock */
+static gboolean
+gst_decode_group_is_drained (GstDecodeGroup * group)
+{
+ GList *l;
+ gboolean drained = TRUE;
+
+ if (group->drained) {
+ drained = TRUE;
+ goto out;
+ }
+
+ for (l = group->children; l; l = l->next) {
+ GstDecodeChain *chain = l->data;
+
+ CHAIN_MUTEX_LOCK (chain);
+ if (!gst_decode_chain_is_drained (chain))
+ drained = FALSE;
+ CHAIN_MUTEX_UNLOCK (chain);
+ if (!drained)
+ goto out;
+ }
+ group->drained = drained;
+
+out:
+ GST_DEBUG_OBJECT (group->dbin, "Group %p is drained: %d", group, drained);
+ return drained;
+}
+
+/* gst_decode_chain_is_drained:
+ *
+ * Check is the chain is drained, which means that
+ * either
+ *
+ * a) it's endpad is drained
+ * b) there are no pending pads, the active group is drained
+ * and there are no next groups
+ *
+ * Not MT-safe, call with chain lock
+ */
+static gboolean
+gst_decode_chain_is_drained (GstDecodeChain * chain)
+{
+ gboolean drained = FALSE;
+
+ if (chain->endpad) {
+ drained = chain->endpad->drained;
+ goto out;
+ }
+
+ if (chain->pending_pads) {
+ drained = FALSE;
+ goto out;
+ }
+
+ if (chain->active_group && gst_decode_group_is_drained (chain->active_group)
+ && !chain->next_groups) {
+ drained = TRUE;
+ goto out;
+ }
+
+out:
+ GST_DEBUG_OBJECT (chain->dbin, "Chain %p is drained: %d", chain, drained);
+ return drained;
+}
+
+/* sort_end_pads:
+ * GCompareFunc to use with lists of GstPad.
+ * Sorts pads by mime type.
+ * First video (raw, then non-raw), then audio (raw, then non-raw),
+ * then others.
+ *
+ * Return: negative if a<b, 0 if a==b, positive if a>b
+ */
+static gint
+sort_end_pads (GstDecodePad * da, GstDecodePad * db)
+{
+ gint va, vb;
+ GstCaps *capsa, *capsb;
+ GstStructure *sa, *sb;
+ const gchar *namea, *nameb;
+
+ capsa = get_pad_caps (GST_PAD_CAST (da));
+ capsb = get_pad_caps (GST_PAD_CAST (db));
+
+ sa = gst_caps_get_structure ((const GstCaps *) capsa, 0);
+ sb = gst_caps_get_structure ((const GstCaps *) capsb, 0);
+
+ namea = gst_structure_get_name (sa);
+ nameb = gst_structure_get_name (sb);
+
+ if (g_strrstr (namea, "video/x-raw"))
+ va = 0;
+ else if (g_strrstr (namea, "video/"))
+ va = 1;
+ else if (g_strrstr (namea, "audio/x-raw"))
+ va = 2;
+ else if (g_strrstr (namea, "audio/"))
+ va = 3;
+ else
+ va = 4;
+
+ if (g_strrstr (nameb, "video/x-raw"))
+ vb = 0;
+ else if (g_strrstr (nameb, "video/"))
+ vb = 1;
+ else if (g_strrstr (nameb, "audio/x-raw"))
+ vb = 2;
+ else if (g_strrstr (nameb, "audio/"))
+ vb = 3;
+ else
+ vb = 4;
+
+ gst_caps_unref (capsa);
+ gst_caps_unref (capsb);
+
+ return va - vb;
+}
+
+static GstCaps *
+_gst_element_get_linked_caps (GstElement * src, GstElement * sink)
+{
+ GstIterator *it;
+ GstElement *parent;
+ GstPad *pad, *peer;
+ gboolean done = FALSE;
+ GstCaps *caps = NULL;
+ GValue item = { 0, };
+
+ it = gst_element_iterate_src_pads (src);
+ while (!done) {
+ switch (gst_iterator_next (it, &item)) {
+ case GST_ITERATOR_OK:
+ pad = g_value_get_object (&item);
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ parent = gst_pad_get_parent_element (peer);
+ if (parent == sink) {
+ caps = gst_pad_get_current_caps (pad);
+ done = TRUE;
+ }
+
+ if (parent)
+ gst_object_unref (parent);
+ gst_object_unref (peer);
+ }
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_ERROR:
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ return caps;
+}
+
+static GQuark topology_structure_name = 0;
+static GQuark topology_caps = 0;
+static GQuark topology_next = 0;
+static GQuark topology_pad = 0;
+
+/* FIXME: Invent gst_structure_take_structure() to prevent all the
+ * structure copying for nothing
+ */
+static GstStructure *
+gst_decode_chain_get_topology (GstDecodeChain * chain)
+{
+ GstStructure *s, *u;
+ GList *l;
+ GstCaps *caps;
+
+ if (G_UNLIKELY ((chain->endpad || chain->deadend)
+ && (chain->endcaps == NULL))) {
+ GST_WARNING ("End chain without valid caps !");
+ return NULL;
+ }
+
+ u = gst_structure_id_empty_new (topology_structure_name);
+
+ /* Now at the last element */
+ if (chain->elements && (chain->endpad || chain->deadend)) {
+ s = gst_structure_id_empty_new (topology_structure_name);
+ gst_structure_id_set (u, topology_caps, GST_TYPE_CAPS, chain->endcaps,
+ NULL);
+
+ if (chain->endpad)
+ gst_structure_id_set (u, topology_pad, GST_TYPE_PAD, chain->endpad, NULL);
+ gst_structure_id_set (s, topology_next, GST_TYPE_STRUCTURE, u, NULL);
+ gst_structure_free (u);
+ u = s;
+ } else if (chain->active_group) {
+ GValue list = { 0, };
+ GValue item = { 0, };
+
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&item, GST_TYPE_STRUCTURE);
+ for (l = chain->active_group->children; l; l = l->next) {
+ s = gst_decode_chain_get_topology (l->data);
+ if (s) {
+ gst_value_set_structure (&item, s);
+ gst_value_list_append_value (&list, &item);
+ g_value_reset (&item);
+ gst_structure_free (s);
+ }
+ }
+ gst_structure_id_set_value (u, topology_next, &list);
+ g_value_unset (&list);
+ g_value_unset (&item);
+ }
+
+ /* Get caps between all elements in this chain */
+ l = (chain->elements && chain->elements->next) ? chain->elements : NULL;
+ for (; l && l->next; l = l->next) {
+ GstDecodeElement *delem, *delem_next;
+ GstElement *elem, *elem_next;
+ GstCaps *caps;
+
+ delem = l->data;
+ elem = delem->element;
+ delem_next = l->next->data;
+ elem_next = delem_next->element;
+
+ caps = _gst_element_get_linked_caps (elem_next, elem);
+
+ if (caps) {
+ s = gst_structure_id_empty_new (topology_structure_name);
+ gst_structure_id_set (u, topology_caps, GST_TYPE_CAPS, caps, NULL);
+ gst_caps_unref (caps);
+
+ gst_structure_id_set (s, topology_next, GST_TYPE_STRUCTURE, u, NULL);
+ gst_structure_free (u);
+ u = s;
+ }
+ }
+
+ /* Caps that resulted in this chain */
+ caps = gst_pad_get_current_caps (chain->pad);
+ if (!caps) {
+ caps = get_pad_caps (chain->pad);
+ if (G_UNLIKELY (!gst_caps_is_fixed (caps))) {
+ GST_ERROR_OBJECT (chain->pad,
+ "Couldn't get fixed caps, got %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (caps);
+ caps = NULL;
+ }
+ }
+ gst_structure_set (u, "caps", GST_TYPE_CAPS, caps, NULL);
+ gst_caps_unref (caps);
+
+ return u;
+}
+
+static void
+gst_decode_bin_post_topology_message (GstDecodeBin * dbin)
+{
+ GstStructure *s;
+ GstMessage *msg;
+
+ s = gst_decode_chain_get_topology (dbin->decode_chain);
+
+ msg = gst_message_new_element (GST_OBJECT (dbin), s);
+ gst_element_post_message (GST_ELEMENT (dbin), msg);
+}
+
+/* Must only be called if the toplevel chain is complete and blocked! */
+/* Not MT-safe, call with decodebin expose lock! */
+static gboolean
+gst_decode_bin_expose (GstDecodeBin * dbin)
+{
+ GList *tmp, *endpads = NULL;
+ gboolean missing_plugin = FALSE;
+ gboolean already_exposed = TRUE;
+
+ GST_DEBUG_OBJECT (dbin, "Exposing currently active chains/groups");
+
+ /* Don't expose if we're currently shutting down */
+ DYN_LOCK (dbin);
+ if (G_UNLIKELY (dbin->shutdown == TRUE)) {
+ GST_WARNING_OBJECT (dbin, "Currently, shutting down, aborting exposing");
+ DYN_UNLOCK (dbin);
+ return FALSE;
+ }
+ DYN_UNLOCK (dbin);
+
+ /* Get the pads that we're going to expose and mark things as exposed */
+ if (!gst_decode_chain_expose (dbin->decode_chain, &endpads, &missing_plugin)) {
+ g_list_foreach (endpads, (GFunc) gst_object_unref, NULL);
+ g_list_free (endpads);
+ GST_ERROR_OBJECT (dbin, "Broken chain/group tree");
+ g_return_val_if_reached (FALSE);
+ return FALSE;
+ }
+ if (endpads == NULL) {
+ if (missing_plugin) {
+ GST_WARNING_OBJECT (dbin, "No suitable plugins found");
+ GST_ELEMENT_ERROR (dbin, CORE, MISSING_PLUGIN, (NULL),
+ ("no suitable plugins found"));
+ } else {
+ /* in this case, the stream ended without buffers,
+ * just post a warning */
+ GST_WARNING_OBJECT (dbin, "All streams finished without buffers");
+ GST_ELEMENT_ERROR (dbin, STREAM, FAILED, (NULL),
+ ("all streams without buffers"));
+ }
+ return FALSE;
+ }
+
+ /* Check if this was called when everything was exposed already */
+ for (tmp = endpads; tmp && already_exposed; tmp = tmp->next) {
+ GstDecodePad *dpad = tmp->data;
+
+ already_exposed &= dpad->exposed;
+ if (!already_exposed)
+ break;
+ }
+ if (already_exposed) {
+ GST_DEBUG_OBJECT (dbin, "Everything was exposed already!");
+ g_list_foreach (endpads, (GFunc) gst_object_unref, NULL);
+ g_list_free (endpads);
+ return TRUE;
+ }
+
+ /* Set all already exposed pads to blocked */
+ for (tmp = endpads; tmp; tmp = tmp->next) {
+ GstDecodePad *dpad = tmp->data;
+
+ if (dpad->exposed) {
+ GST_DEBUG_OBJECT (dpad, "blocking exposed pad");
+ gst_decode_pad_set_blocked (dpad, TRUE);
+ }
+ }
+
+ /* re-order pads : video, then audio, then others */
+ endpads = g_list_sort (endpads, (GCompareFunc) sort_end_pads);
+
+ /* Expose pads */
+ for (tmp = endpads; tmp; tmp = tmp->next) {
+ GstDecodePad *dpad = (GstDecodePad *) tmp->data;
+ gchar *padname;
+
+ /* 1. rewrite name */
+ padname = g_strdup_printf ("src%d", dbin->nbpads);
+ dbin->nbpads++;
+ GST_DEBUG_OBJECT (dbin, "About to expose dpad %s as %s",
+ GST_OBJECT_NAME (dpad), padname);
+ gst_object_set_name (GST_OBJECT (dpad), padname);
+ g_free (padname);
+
+ /* 2. activate and add */
+ if (!dpad->exposed
+ && !gst_element_add_pad (GST_ELEMENT (dbin), GST_PAD_CAST (dpad))) {
+ /* not really fatal, we can try to add the other pads */
+ g_warning ("error adding pad to decodebin");
+ continue;
+ }
+ dpad->exposed = TRUE;
+
+ /* 3. emit signal */
+ GST_INFO_OBJECT (dpad, "added new decoded pad");
+ }
+
+ /* 4. Signal no-more-pads. This allows the application to hook stuff to the
+ * exposed pads */
+ GST_LOG_OBJECT (dbin, "signalling no-more-pads");
+ gst_element_no_more_pads (GST_ELEMENT (dbin));
+
+ /* 5. Send a custom element message with the stream topology */
+ if (dbin->post_stream_topology)
+ gst_decode_bin_post_topology_message (dbin);
+
+ /* 6. Unblock internal pads. The application should have connected stuff now
+ * so that streaming can continue. */
+ for (tmp = endpads; tmp; tmp = tmp->next) {
+ GstDecodePad *dpad = (GstDecodePad *) tmp->data;
+
+ GST_DEBUG_OBJECT (dpad, "unblocking");
+ gst_decode_pad_unblock (dpad);
+ GST_DEBUG_OBJECT (dpad, "unblocked");
+ gst_object_unref (dpad);
+ }
+ g_list_free (endpads);
+
+ do_async_done (dbin);
+ GST_DEBUG_OBJECT (dbin, "Exposed everything");
+ return TRUE;
+}
+
+/* gst_decode_chain_expose:
+ *
+ * Check if the chain can be exposed and add all endpads
+ * to the endpads list.
+ *
+ * Also update the active group's multiqueue to the
+ * runtime limits.
+ *
+ * Not MT-safe, call with decodebin expose lock! *
+ */
+static gboolean
+gst_decode_chain_expose (GstDecodeChain * chain, GList ** endpads,
+ gboolean * missing_plugin)
+{
+ GstDecodeGroup *group;
+ GList *l;
+ GstDecodeBin *dbin;
+
+ if (chain->deadend) {
+ if (chain->endcaps)
+ *missing_plugin = TRUE;
+ return TRUE;
+ }
+
+ if (chain->endpad) {
+ if (!chain->endpad->blocked && !chain->endpad->exposed)
+ return FALSE;
+ *endpads = g_list_prepend (*endpads, gst_object_ref (chain->endpad));
+ return TRUE;
+ }
+
+ group = chain->active_group;
+ if (!group)
+ return FALSE;
+ if (!group->no_more_pads && !group->overrun)
+ return FALSE;
+
+ dbin = group->dbin;
+
+ /* configure queues for playback */
+ decodebin_set_queue_size (dbin, group->multiqueue, FALSE);
+
+ /* we can now disconnect any overrun signal, which is used to expose the
+ * group. */
+ if (group->overrunsig) {
+ GST_LOG_OBJECT (dbin, "Disconnecting overrun");
+ g_signal_handler_disconnect (group->multiqueue, group->overrunsig);
+ group->overrunsig = 0;
+ }
+
+ for (l = group->children; l; l = l->next) {
+ GstDecodeChain *childchain = l->data;
+
+ if (!gst_decode_chain_expose (childchain, endpads, missing_plugin))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/*************************
+ * GstDecodePad functions
+ *************************/
+
+static void
+gst_decode_pad_class_init (GstDecodePadClass * klass)
+{
+}
+
+static void
+gst_decode_pad_init (GstDecodePad * pad)
+{
+ pad->chain = NULL;
+ pad->blocked = FALSE;
+ pad->exposed = FALSE;
+ pad->drained = FALSE;
+ gst_object_ref_sink (pad);
+}
+
+static GstProbeReturn
+source_pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstDecodePad *dpad = user_data;
+ GstDecodeChain *chain;
+ GstDecodeBin *dbin;
+
+ chain = dpad->chain;
+ dbin = chain->dbin;
+
+ GST_LOG_OBJECT (dpad, "blocked: dpad->chain:%p", chain);
+
+ dpad->blocked = TRUE;
+
+ EXPOSE_LOCK (dbin);
+ if (gst_decode_chain_is_complete (dbin->decode_chain)) {
+ if (!gst_decode_bin_expose (dbin))
+ GST_WARNING_OBJECT (dbin, "Couldn't expose group");
+ }
+ EXPOSE_UNLOCK (dbin);
+
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+source_pad_event_probe (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstEvent *event = type_data;
+ GstDecodePad *dpad = user_data;
+ gboolean res = TRUE;
+
+ GST_LOG_OBJECT (pad, "%s dpad:%p", GST_EVENT_TYPE_NAME (event), dpad);
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ GST_DEBUG_OBJECT (pad, "we received EOS");
+
+ /* Check if all pads are drained.
+ * * If there is no next group, we will let the EOS go through.
+ * * If there is a next group but the current group isn't completely
+ * drained, we will drop the EOS event.
+ * * If there is a next group to expose and this was the last non-drained
+ * pad for that group, we will remove the ghostpad of the current group
+ * first, which unlinks the peer and so drops the EOS. */
+ res = gst_decode_pad_handle_eos (dpad);
+ }
+ if (res)
+ return GST_PROBE_OK;
+ else
+ return GST_PROBE_DROP;
+}
+
+static void
+gst_decode_pad_set_blocked (GstDecodePad * dpad, gboolean blocked)
+{
+ GstDecodeBin *dbin = dpad->dbin;
+ GstPad *opad;
+
+ DYN_LOCK (dbin);
+
+ GST_DEBUG_OBJECT (dpad, "blocking pad: %d", blocked);
+
+ opad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (dpad));
+ if (!opad)
+ goto out;
+
+ /* do not block if shutting down.
+ * we do not consider/expect it blocked further below, but use other trick */
+ if (!blocked || !dbin->shutdown) {
+ if (blocked) {
+ if (dpad->block_id == 0)
+ dpad->block_id = gst_pad_add_probe (opad, GST_PROBE_TYPE_BLOCK,
+ source_pad_blocked_cb, gst_object_ref (dpad),
+ (GDestroyNotify) gst_object_unref);
+ } else {
+ if (dpad->block_id != 0) {
+ gst_pad_remove_probe (opad, dpad->block_id);
+ dpad->block_id = 0;
+ }
+ dpad->blocked = FALSE;
+ }
+ }
+
+ if (blocked) {
+ if (dbin->shutdown) {
+ /* deactivate to force flushing state to prevent NOT_LINKED errors */
+ gst_pad_set_active (GST_PAD_CAST (dpad), FALSE);
+ /* note that deactivating the target pad would have no effect here,
+ * since elements are typically connected first (and pads exposed),
+ * and only then brought to PAUSED state (so pads activated) */
+ } else {
+ gst_object_ref (dpad);
+ dbin->blocked_pads = g_list_prepend (dbin->blocked_pads, dpad);
+ }
+ } else {
+ GList *l;
+
+ if ((l = g_list_find (dbin->blocked_pads, dpad))) {
+ gst_object_unref (dpad);
+ dbin->blocked_pads = g_list_delete_link (dbin->blocked_pads, l);
+ }
+ }
+ gst_object_unref (opad);
+out:
+ DYN_UNLOCK (dbin);
+}
+
+static void
+gst_decode_pad_add_drained_check (GstDecodePad * dpad)
+{
+ gst_pad_add_probe (GST_PAD_CAST (dpad), GST_PROBE_TYPE_EVENT,
+ source_pad_event_probe, dpad, NULL);
+}
+
+static void
+gst_decode_pad_activate (GstDecodePad * dpad, GstDecodeChain * chain)
+{
+ g_return_if_fail (chain != NULL);
+
+ dpad->chain = chain;
+ gst_pad_set_active (GST_PAD_CAST (dpad), TRUE);
+ gst_decode_pad_set_blocked (dpad, TRUE);
+ gst_decode_pad_add_drained_check (dpad);
+}
+
+static void
+gst_decode_pad_unblock (GstDecodePad * dpad)
+{
+ gst_decode_pad_set_blocked (dpad, FALSE);
+}
+
+/*gst_decode_pad_new:
+ *
+ * Creates a new GstDecodePad for the given pad.
+ */
+static GstDecodePad *
+gst_decode_pad_new (GstDecodeBin * dbin, GstPad * pad, GstDecodeChain * chain)
+{
+ GstDecodePad *dpad;
+ GstPadTemplate *pad_tmpl;
+
+ GST_DEBUG_OBJECT (dbin, "making new decodepad");
+ pad_tmpl = gst_static_pad_template_get (&decoder_bin_src_template);
+ dpad =
+ g_object_new (GST_TYPE_DECODE_PAD, "direction", GST_PAD_DIRECTION (pad),
+ "template", pad_tmpl, NULL);
+ gst_ghost_pad_construct (GST_GHOST_PAD_CAST (dpad));
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), pad);
+ dpad->chain = chain;
+ dpad->dbin = dbin;
+ gst_object_unref (pad_tmpl);
+
+ return dpad;
+}
+
+static void
+gst_pending_pad_free (GstPendingPad * ppad)
+{
+ g_assert (ppad);
+ g_assert (ppad->pad);
+
+ if (ppad->event_probe_id != 0)
+ gst_pad_remove_probe (ppad->pad, ppad->event_probe_id);
+ gst_object_unref (ppad->pad);
+ g_slice_free (GstPendingPad, ppad);
+}
+
+/*****
+ * Element add/remove
+ *****/
+
+static void
+do_async_start (GstDecodeBin * dbin)
+{
+ GstMessage *message;
+
+ dbin->async_pending = TRUE;
+
+ message = gst_message_new_async_start (GST_OBJECT_CAST (dbin));
+ parent_class->handle_message (GST_BIN_CAST (dbin), message);
+}
+
+static void
+do_async_done (GstDecodeBin * dbin)
+{
+ GstMessage *message;
+
+ if (dbin->async_pending) {
+ message = gst_message_new_async_done (GST_OBJECT_CAST (dbin), FALSE);
+ parent_class->handle_message (GST_BIN_CAST (dbin), message);
+
+ dbin->async_pending = FALSE;
+ }
+}
+
+/*****
+ * convenience functions
+ *****/
+
+/* find_sink_pad
+ *
+ * Returns the first sink pad of the given element, or NULL if it doesn't have
+ * any.
+ */
+
+static GstPad *
+find_sink_pad (GstElement * element)
+{
+ GstIterator *it;
+ GstPad *pad = NULL;
+ GValue item = { 0, };
+
+ it = gst_element_iterate_sink_pads (element);
+
+ if ((gst_iterator_next (it, &item)) == GST_ITERATOR_OK)
+ pad = g_value_dup_object (&item);
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ return pad;
+}
+
+/* call with dyn_lock held */
+static void
+unblock_pads (GstDecodeBin * dbin)
+{
+ GList *tmp;
+
+ GST_LOG_OBJECT (dbin, "unblocking pads");
+
+ for (tmp = dbin->blocked_pads; tmp; tmp = tmp->next) {
+ GstDecodePad *dpad = (GstDecodePad *) tmp->data;
+ GstPad *opad;
+
+ opad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (dpad));
+ if (!opad)
+ continue;
+
+ GST_DEBUG_OBJECT (dpad, "unblocking");
+ if (dpad->block_id != 0) {
+ gst_pad_remove_probe (opad, dpad->block_id);
+ dpad->block_id = 0;
+ }
+ dpad->blocked = FALSE;
+ /* make flushing, prevent NOT_LINKED */
+ GST_PAD_SET_FLUSHING (GST_PAD_CAST (dpad));
+ gst_object_unref (dpad);
+ gst_object_unref (opad);
+ GST_DEBUG_OBJECT (dpad, "unblocked");
+ }
+
+ /* clear, no more blocked pads */
+ g_list_free (dbin->blocked_pads);
+ dbin->blocked_pads = NULL;
+}
+
+static GstStateChangeReturn
+gst_decode_bin_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstDecodeBin *dbin = GST_DECODE_BIN (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (dbin->typefind == NULL)
+ goto missing_typefind;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ /* Make sure we've cleared all existing chains */
+ if (dbin->decode_chain) {
+ gst_decode_chain_free (dbin->decode_chain);
+ dbin->decode_chain = NULL;
+ }
+ DYN_LOCK (dbin);
+ GST_LOG_OBJECT (dbin, "clearing shutdown flag");
+ dbin->shutdown = FALSE;
+ DYN_UNLOCK (dbin);
+ dbin->have_type = FALSE;
+ ret = GST_STATE_CHANGE_ASYNC;
+ do_async_start (dbin);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ DYN_LOCK (dbin);
+ GST_LOG_OBJECT (dbin, "setting shutdown flag");
+ dbin->shutdown = TRUE;
+ unblock_pads (dbin);
+ DYN_UNLOCK (dbin);
+ default:
+ break;
+ }
+
+ {
+ GstStateChangeReturn bret;
+
+ bret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (G_UNLIKELY (bret == GST_STATE_CHANGE_FAILURE))
+ goto activate_failed;
+ else if (G_UNLIKELY (bret == GST_STATE_CHANGE_NO_PREROLL)) {
+ do_async_done (dbin);
+ ret = bret;
+ }
+ }
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ do_async_done (dbin);
+ if (dbin->decode_chain) {
+ gst_decode_chain_free (dbin->decode_chain);
+ dbin->decode_chain = NULL;
+ }
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ default:
+ break;
+ }
+
+ return ret;
+
+/* ERRORS */
+missing_typefind:
+ {
+ gst_element_post_message (element,
+ gst_missing_element_message_new (element, "typefind"));
+ GST_ELEMENT_ERROR (dbin, CORE, MISSING_PLUGIN, (NULL), ("no typefind!"));
+ return GST_STATE_CHANGE_FAILURE;
+ }
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (element,
+ "element failed to change states -- activation problem?");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+gboolean
+gst_decode_bin_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_decode_bin_debug, "decodebin", 0, "decoder bin");
+
+ /* Register some quarks here for the stream topology message */
+ topology_structure_name = g_quark_from_static_string ("stream-topology");
+ topology_caps = g_quark_from_static_string ("caps");
+ topology_next = g_quark_from_static_string ("next");
+ topology_pad = g_quark_from_static_string ("pad");
+
+ return gst_element_register (plugin, "decodebin", GST_RANK_NONE,
+ GST_TYPE_DECODE_BIN);
+}
diff --git a/gst/playback/gstplay-enum.c b/gst/playback/gstplay-enum.c
new file mode 100644
index 0000000..e337fdf
--- /dev/null
+++ b/gst/playback/gstplay-enum.c
@@ -0,0 +1,81 @@
+/* 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 "gstplay-enum.h"
+
+#define C_ENUM(v) ((gint) v)
+#define C_FLAGS(v) ((guint) v)
+
+GType
+gst_autoplug_select_result_get_type (void)
+{
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_AUTOPLUG_SELECT_TRY), "GST_AUTOPLUG_SELECT_TRY", "try"},
+ {C_ENUM (GST_AUTOPLUG_SELECT_EXPOSE), "GST_AUTOPLUG_SELECT_EXPOSE",
+ "expose"},
+ {C_ENUM (GST_AUTOPLUG_SELECT_SKIP), "GST_AUTOPLUG_SELECT_SKIP", "skip"},
+ {0, NULL, NULL}
+ };
+ static volatile GType id = 0;
+
+ if (g_once_init_enter ((gsize *) & id)) {
+ GType _id;
+
+ _id = g_enum_register_static ("GstAutoplugSelectResult", values);
+
+ g_once_init_leave ((gsize *) & id, _id);
+ }
+
+ return id;
+}
+
+GType
+gst_play_flags_get_type (void)
+{
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PLAY_FLAG_VIDEO), "Render the video stream", "video"},
+ {C_FLAGS (GST_PLAY_FLAG_AUDIO), "Render the audio stream", "audio"},
+ {C_FLAGS (GST_PLAY_FLAG_TEXT), "Render subtitles", "text"},
+ {C_FLAGS (GST_PLAY_FLAG_VIS),
+ "Render visualisation when no video is present", "vis"},
+ {C_FLAGS (GST_PLAY_FLAG_SOFT_VOLUME), "Use software volume", "soft-volume"},
+ {C_FLAGS (GST_PLAY_FLAG_NATIVE_AUDIO), "Only use native audio formats",
+ "native-audio"},
+ {C_FLAGS (GST_PLAY_FLAG_NATIVE_VIDEO), "Only use native video formats",
+ "native-video"},
+ {C_FLAGS (GST_PLAY_FLAG_DOWNLOAD), "Attempt progressive download buffering",
+ "download"},
+ {C_FLAGS (GST_PLAY_FLAG_BUFFERING), "Buffer demuxed/parsed data",
+ "buffering"},
+ {C_FLAGS (GST_PLAY_FLAG_DEINTERLACE), "Deinterlace video if necessary",
+ "deinterlace"},
+ {0, NULL, NULL}
+ };
+ static volatile GType id = 0;
+
+ if (g_once_init_enter ((gsize *) & id)) {
+ GType _id;
+
+ _id = g_flags_register_static ("GstPlayFlags", values);
+
+ g_once_init_leave ((gsize *) & id, _id);
+ }
+
+ return id;
+}
diff --git a/gst/playback/gstplay-enum.h b/gst/playback/gstplay-enum.h
new file mode 100644
index 0000000..b0709ab
--- /dev/null
+++ b/gst/playback/gstplay-enum.h
@@ -0,0 +1,80 @@
+/* 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 __GST_PLAY_ENUM_H__
+#define __GST_PLAY_ENUM_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstAutoplugSelectResult:
+ * @GST_AUTOPLUG_SELECT_TRY: try to autoplug the current factory
+ * @GST_AUTOPLUG_SELECT_EXPOSE: expose the pad as a raw stream
+ * @GST_AUTOPLUG_SELECT_SKIP: skip the current factory
+ *
+ * return values for the autoplug-select signal.
+ */
+typedef enum {
+ GST_AUTOPLUG_SELECT_TRY,
+ GST_AUTOPLUG_SELECT_EXPOSE,
+ GST_AUTOPLUG_SELECT_SKIP
+} GstAutoplugSelectResult;
+
+#define GST_TYPE_AUTOPLUG_SELECT_RESULT (gst_autoplug_select_result_get_type())
+GType gst_autoplug_select_result_get_type (void);
+
+/**
+ * GstPlayFlags:
+ * @GST_PLAY_FLAG_VIDEO: Enable rendering of the video stream
+ * @GST_PLAY_FLAG_AUDIO: Enable rendering of the audio stream
+ * @GST_PLAY_FLAG_TEXT: Enable rendering of subtitles
+ * @GST_PLAY_FLAG_VIS: Enable rendering of visualisations when there is
+ * no video stream.
+ * @GST_PLAY_FLAG_SOFT_VOLUME: Use software volume
+ * @GST_PLAY_FLAG_NATIVE_AUDIO: only allow native audio formats, this omits
+ * configuration of audioconvert and audioresample.
+ * @GST_PLAY_FLAG_NATIVE_VIDEO: only allow native video formats, this omits
+ * configuration of videoconvert and videoscale.
+ * @GST_PLAY_FLAG_DOWNLOAD: enable progressice download buffering for selected
+ * formats.
+ * @GST_PLAY_FLAG_BUFFERING: enable buffering of the demuxed or parsed data.
+ *
+ * Extra flags to configure the behaviour of the sinks.
+ */
+typedef enum {
+ GST_PLAY_FLAG_VIDEO = (1 << 0),
+ GST_PLAY_FLAG_AUDIO = (1 << 1),
+ GST_PLAY_FLAG_TEXT = (1 << 2),
+ GST_PLAY_FLAG_VIS = (1 << 3),
+ GST_PLAY_FLAG_SOFT_VOLUME = (1 << 4),
+ GST_PLAY_FLAG_NATIVE_AUDIO = (1 << 5),
+ GST_PLAY_FLAG_NATIVE_VIDEO = (1 << 6),
+ GST_PLAY_FLAG_DOWNLOAD = (1 << 7),
+ GST_PLAY_FLAG_BUFFERING = (1 << 8),
+ GST_PLAY_FLAG_DEINTERLACE = (1 << 9)
+} GstPlayFlags;
+
+#define GST_TYPE_PLAY_FLAGS (gst_play_flags_get_type())
+GType gst_play_flags_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLAY_ENUM_H__ */
diff --git a/gst/playback/gstplay-marshal.list b/gst/playback/gstplay-marshal.list
new file mode 100644
index 0000000..ace5d91
--- /dev/null
+++ b/gst/playback/gstplay-marshal.list
@@ -0,0 +1,9 @@
+BOOLEAN:OBJECT,BOXED
+BOOLEAN:OBJECT,OBJECT,OBJECT
+BOXED:OBJECT,BOXED
+ENUM:OBJECT,OBJECT,BOXED
+ENUM:OBJECT,BOXED,OBJECT
+BOXED:OBJECT,BOXED,BOXED
+BOXED:INT
+OBJECT:BOXED
+OBJECT:INT
diff --git a/gst/playback/gstplayback.c b/gst/playback/gstplayback.c
new file mode 100644
index 0000000..75eddd7
--- /dev/null
+++ b/gst/playback/gstplayback.c
@@ -0,0 +1,67 @@
+/* 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/gst.h>
+
+#include <gst/gst-i18n-plugin.h>
+#include <gst/pbutils/pbutils.h>
+
+#include "gstplayback.h"
+#include "gstplaysink.h"
+#include "gststreamselector.h"
+#include "gstsubtitleoverlay.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gboolean res;
+
+ gst_pb_utils_init ();
+
+#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 */
+
+ /* ref class from a thread-safe context to work around missing bit of
+ * thread-safety in GObject */
+ g_type_class_ref (GST_TYPE_STREAM_SELECTOR);
+
+ res = gst_play_bin2_plugin_init (plugin);
+ res &= gst_play_sink_plugin_init (plugin);
+ res &= gst_subtitle_overlay_plugin_init (plugin);
+
+ res &= gst_decode_bin_plugin_init (plugin);
+ res &= gst_uri_decode_bin_plugin_init (plugin);
+
+ return res;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "playback",
+ "various playback elements", plugin_init, VERSION, GST_LICENSE,
+ GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/playback/gstplayback.h b/gst/playback/gstplayback.h
new file mode 100644
index 0000000..910b1a3
--- /dev/null
+++ b/gst/playback/gstplayback.h
@@ -0,0 +1,33 @@
+/* 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 __GST_PLAY_BACK_H__
+#define __GST_PLAY_BACK_H__
+
+
+#include <gst/gst.h>
+
+gboolean gst_decode_bin_plugin_init (GstPlugin * plugin);
+gboolean gst_uri_decode_bin_plugin_init (GstPlugin * plugin);
+
+gboolean gst_play_bin_plugin_init (GstPlugin * plugin);
+gboolean gst_play_bin2_plugin_init (GstPlugin * plugin);
+
+
+#endif /* __GST_PLAY_BACK_H__ */
diff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c
new file mode 100644
index 0000000..8498a3e
--- /dev/null
+++ b/gst/playback/gstplaybin2.c
@@ -0,0 +1,3921 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-playbin
+ *
+ * Playbin provides a stand-alone everything-in-one abstraction for an
+ * audio and/or video player.
+ *
+ * Playbin can handle both audio and video files and features
+ * <itemizedlist>
+ * <listitem>
+ * automatic file type recognition and based on that automatic
+ * selection and usage of the right audio/video/subtitle demuxers/decoders
+ * </listitem>
+ * <listitem>
+ * visualisations for audio files
+ * </listitem>
+ * <listitem>
+ * subtitle support for video files. Subtitles can be store in external
+ * files.
+ * </listitem>
+ * <listitem>
+ * stream selection between different video/audio/subtitles streams
+ * </listitem>
+ * <listitem>
+ * meta info (tag) extraction
+ * </listitem>
+ * <listitem>
+ * easy access to the last video frame
+ * </listitem>
+ * <listitem>
+ * buffering when playing streams over a network
+ * </listitem>
+ * <listitem>
+ * volume control with mute option
+ * </listitem>
+ * </itemizedlist>
+ *
+ * <refsect2>
+ * <title>Usage</title>
+ * <para>
+ * A playbin element can be created just like any other element using
+ * gst_element_factory_make(). The file/URI to play should be set via the #GstPlayBin:uri
+ * property. This must be an absolute URI, relative file paths are not allowed.
+ * Example URIs are file:///home/joe/movie.avi or http://www.joedoe.com/foo.ogg
+ *
+ * Playbin is a #GstPipeline. It will notify the application of everything
+ * that's happening (errors, end of stream, tags found, state changes, etc.)
+ * by posting messages on its #GstBus. The application needs to watch the
+ * bus.
+ *
+ * Playback can be initiated by setting the element to PLAYING state using
+ * gst_element_set_state(). Note that the state change will take place in
+ * the background in a separate thread, when the function returns playback
+ * is probably not happening yet and any errors might not have occured yet.
+ * Applications using playbin should ideally be written to deal with things
+ * completely asynchroneous.
+ *
+ * When playback has finished (an EOS message has been received on the bus)
+ * or an error has occured (an ERROR message has been received on the bus) or
+ * the user wants to play a different track, playbin should be set back to
+ * READY or NULL state, then the #GstPlayBin:uri property should be set to the
+ * new location and then playbin be set to PLAYING state again.
+ *
+ * Seeking can be done using gst_element_seek_simple() or gst_element_seek()
+ * on the playbin element. Again, the seek will not be executed
+ * instantaneously, but will be done in a background thread. When the seek
+ * call returns the seek will most likely still be in process. An application
+ * may wait for the seek to finish (or fail) using gst_element_get_state() with
+ * -1 as the timeout, but this will block the user interface and is not
+ * recommended at all.
+ *
+ * Applications may query the current position and duration of the stream
+ * via gst_element_query_position() and gst_element_query_duration() and
+ * setting the format passed to GST_FORMAT_TIME. If the query was successful,
+ * the duration or position will have been returned in units of nanoseconds.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Advanced Usage: specifying the audio and video sink</title>
+ * <para>
+ * By default, if no audio sink or video sink has been specified via the
+ * #GstPlayBin:audio-sink or #GstPlayBin:video-sink property, playbin will use the autoaudiosink
+ * and autovideosink elements to find the first-best available output method.
+ * This should work in most cases, but is not always desirable. Often either
+ * the user or application might want to specify more explicitly what to use
+ * for audio and video output.
+ *
+ * If the application wants more control over how audio or video should be
+ * output, it may create the audio/video sink elements itself (for example
+ * using gst_element_factory_make()) and provide them to playbin using the
+ * #GstPlayBin:audio-sink or #GstPlayBin:video-sink property.
+ *
+ * GNOME-based applications, for example, will usually want to create
+ * gconfaudiosink and gconfvideosink elements and make playbin use those,
+ * so that output happens to whatever the user has configured in the GNOME
+ * Multimedia System Selector configuration dialog.
+ *
+ * The sink elements do not necessarily need to be ready-made sinks. It is
+ * possible to create container elements that look like a sink to playbin,
+ * but in reality contain a number of custom elements linked together. This
+ * can be achieved by creating a #GstBin and putting elements in there and
+ * linking them, and then creating a sink #GstGhostPad for the bin and pointing
+ * it to the sink pad of the first element within the bin. This can be used
+ * for a number of purposes, for example to force output to a particular
+ * format or to modify or observe the data before it is output.
+ *
+ * It is also possible to 'suppress' audio and/or video output by using
+ * 'fakesink' elements (or capture it from there using the fakesink element's
+ * "handoff" signal, which, nota bene, is fired from the streaming thread!).
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Retrieving Tags and Other Meta Data</title>
+ * <para>
+ * Most of the common meta data (artist, title, etc.) can be retrieved by
+ * watching for TAG messages on the pipeline's bus (see above).
+ *
+ * Other more specific meta information like width/height/framerate of video
+ * streams or samplerate/number of channels of audio streams can be obtained
+ * from the negotiated caps on the sink pads of the sinks.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Buffering</title>
+ * Playbin handles buffering automatically for the most part, but applications
+ * need to handle parts of the buffering process as well. Whenever playbin is
+ * buffering, it will post BUFFERING messages on the bus with a percentage
+ * value that shows the progress of the buffering process. Applications need
+ * to set playbin to PLAYING or PAUSED state in response to these messages.
+ * They may also want to convey the buffering progress to the user in some
+ * way. Here is how to extract the percentage information from the message
+ * (requires GStreamer >= 0.10.11):
+ * |[
+ * switch (GST_MESSAGE_TYPE (msg)) {
+ * case GST_MESSAGE_BUFFERING: {
+ * gint percent = 0;
+ * gst_message_parse_buffering (msg, &amp;percent);
+ * g_print ("Buffering (%%u percent done)", percent);
+ * break;
+ * }
+ * ...
+ * }
+ * ]|
+ * Note that applications should keep/set the pipeline in the PAUSED state when
+ * a BUFFERING message is received with a buffer percent value < 100 and set
+ * the pipeline back to PLAYING state when a BUFFERING message with a value
+ * of 100 percent is received (if PLAYING is the desired state, that is).
+ * </refsect2>
+ * <refsect2>
+ * <title>Embedding the video window in your application</title>
+ * By default, playbin (or rather the video sinks used) will create their own
+ * window. Applications will usually want to force output to a window of their
+ * own, however. This can be done using the #GstXOverlay interface, which most
+ * video sinks implement. See the documentation there for more details.
+ * </refsect2>
+ * <refsect2>
+ * <title>Specifying which CD/DVD device to use</title>
+ * The device to use for CDs/DVDs needs to be set on the source element
+ * playbin creates before it is opened. The only way to do this at the moment
+ * is to connect to playbin's "notify::source" signal, which will be emitted
+ * by playbin when it has created the source element for a particular URI.
+ * In the signal callback you can check if the source element has a "device"
+ * property and set it appropriately. In future ways might be added to specify
+ * the device as part of the URI, but at the time of writing this is not
+ * possible yet.
+ * </refsect2>
+ * <refsect2>
+ * <title>Handling redirects</title>
+ * <para>
+ * Some elements may post 'redirect' messages on the bus to tell the
+ * application to open another location. These are element messages containing
+ * a structure named 'redirect' along with a 'new-location' field of string
+ * type. The new location may be a relative or an absolute URI. Examples
+ * for such redirects can be found in many quicktime movie trailers.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Examples</title>
+ * |[
+ * gst-launch -v playbin uri=file:///path/to/somefile.avi
+ * ]| This will play back the given AVI video file, given that the video and
+ * audio decoders required to decode the content are installed. Since no
+ * special audio sink or video sink is supplied (not possible via gst-launch),
+ * playbin will try to find a suitable audio and video sink automatically
+ * using the autoaudiosink and autovideosink elements.
+ * |[
+ * gst-launch -v playbin uri=cdda://4
+ * ]| This will play back track 4 on an audio CD in your disc drive (assuming
+ * the drive is detected automatically by the plugin).
+ * |[
+ * gst-launch -v playbin uri=dvd://1
+ * ]| This will play back title 1 of a DVD in your disc drive (assuming
+ * the drive is detected automatically by the plugin).
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/gst.h>
+
+#include <gst/gst-i18n-plugin.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/interfaces/streamvolume.h>
+
+#include "gstplay-enum.h"
+#include "gstplay-marshal.h"
+#include "gstplayback.h"
+#include "gstplaysink.h"
+#include "gstsubtitleoverlay.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_play_bin_debug);
+#define GST_CAT_DEFAULT gst_play_bin_debug
+
+#define GST_TYPE_PLAY_BIN (gst_play_bin_get_type())
+#define GST_PLAY_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAY_BIN,GstPlayBin))
+#define GST_PLAY_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAY_BIN,GstPlayBinClass))
+#define GST_IS_PLAY_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAY_BIN))
+#define GST_IS_PLAY_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAY_BIN))
+
+#define VOLUME_MAX_DOUBLE 10.0
+
+typedef struct _GstPlayBin GstPlayBin;
+typedef struct _GstPlayBinClass GstPlayBinClass;
+typedef struct _GstSourceGroup GstSourceGroup;
+typedef struct _GstSourceSelect GstSourceSelect;
+
+typedef GstCaps *(*SourceSelectGetMediaCapsFunc) (void);
+
+/* has the info for a selector and provides the link to the sink */
+struct _GstSourceSelect
+{
+ const gchar *media_list[8]; /* the media types for the selector */
+ SourceSelectGetMediaCapsFunc get_media_caps; /* more complex caps for the selector */
+ GstPlaySinkType type; /* the sink pad type of the selector */
+
+ GstElement *selector; /* the selector */
+ GPtrArray *channels;
+ GstPad *srcpad; /* the source pad of the selector */
+ GstPad *sinkpad; /* the sinkpad of the sink when the selector
+ * is linked
+ */
+ GstEvent *sinkpad_delayed_event;
+ gulong sinkpad_data_probe;
+ gulong block_id;
+};
+
+#define GST_SOURCE_GROUP_GET_LOCK(group) (((GstSourceGroup*)(group))->lock)
+#define GST_SOURCE_GROUP_LOCK(group) (g_mutex_lock (GST_SOURCE_GROUP_GET_LOCK(group)))
+#define GST_SOURCE_GROUP_UNLOCK(group) (g_mutex_unlock (GST_SOURCE_GROUP_GET_LOCK(group)))
+
+enum
+{
+ PLAYBIN_STREAM_AUDIO = 0,
+ PLAYBIN_STREAM_VIDEO,
+ PLAYBIN_STREAM_TEXT,
+ PLAYBIN_STREAM_LAST
+};
+
+/* a structure to hold the objects for decoding a uri and the subtitle uri
+ */
+struct _GstSourceGroup
+{
+ GstPlayBin *playbin;
+
+ GMutex *lock;
+
+ gboolean valid; /* the group has valid info to start playback */
+ gboolean active; /* the group is active */
+
+ /* properties */
+ gchar *uri;
+ gchar *suburi;
+ GValueArray *streaminfo;
+ GstElement *source;
+
+ GPtrArray *video_channels; /* links to selector pads */
+ GPtrArray *audio_channels; /* links to selector pads */
+ GPtrArray *text_channels; /* links to selector pads */
+
+ GstElement *audio_sink; /* autoplugged audio and video sinks */
+ GstElement *video_sink;
+
+ /* uridecodebins for uri and subtitle uri */
+ GstElement *uridecodebin;
+ GstElement *suburidecodebin;
+ gint pending;
+ gboolean sub_pending;
+
+ gulong pad_added_id;
+ gulong pad_removed_id;
+ gulong no_more_pads_id;
+ gulong notify_source_id;
+ gulong drained_id;
+ gulong autoplug_factories_id;
+ gulong autoplug_select_id;
+ gulong autoplug_continue_id;
+
+ gulong sub_pad_added_id;
+ gulong sub_pad_removed_id;
+ gulong sub_no_more_pads_id;
+ gulong sub_autoplug_continue_id;
+
+ gulong block_id;
+
+ GMutex *stream_changed_pending_lock;
+ GList *stream_changed_pending;
+
+ /* selectors for different streams */
+ GstSourceSelect selector[PLAYBIN_STREAM_LAST];
+};
+
+#define GST_PLAY_BIN_GET_LOCK(bin) (&((GstPlayBin*)(bin))->lock)
+#define GST_PLAY_BIN_LOCK(bin) (g_static_rec_mutex_lock (GST_PLAY_BIN_GET_LOCK(bin)))
+#define GST_PLAY_BIN_UNLOCK(bin) (g_static_rec_mutex_unlock (GST_PLAY_BIN_GET_LOCK(bin)))
+
+/* lock to protect dynamic callbacks, like no-more-pads */
+#define GST_PLAY_BIN_DYN_LOCK(bin) g_mutex_lock ((bin)->dyn_lock)
+#define GST_PLAY_BIN_DYN_UNLOCK(bin) g_mutex_unlock ((bin)->dyn_lock)
+
+/* lock for shutdown */
+#define GST_PLAY_BIN_SHUTDOWN_LOCK(bin,label) \
+G_STMT_START { \
+ if (G_UNLIKELY (g_atomic_int_get (&bin->shutdown))) \
+ goto label; \
+ GST_PLAY_BIN_DYN_LOCK (bin); \
+ if (G_UNLIKELY (g_atomic_int_get (&bin->shutdown))) { \
+ GST_PLAY_BIN_DYN_UNLOCK (bin); \
+ goto label; \
+ } \
+} G_STMT_END
+
+/* unlock for shutdown */
+#define GST_PLAY_BIN_SHUTDOWN_UNLOCK(bin) \
+ GST_PLAY_BIN_DYN_UNLOCK (bin); \
+
+/**
+ * GstPlayBin:
+ *
+ * playbin element structure
+ */
+struct _GstPlayBin
+{
+ GstPipeline parent;
+
+ GStaticRecMutex lock; /* to protect group switching */
+
+ /* the groups, we use a double buffer to switch between current and next */
+ GstSourceGroup groups[2]; /* array with group info */
+ GstSourceGroup *curr_group; /* pointer to the currently playing group */
+ GstSourceGroup *next_group; /* pointer to the next group */
+
+ /* properties */
+ guint connection_speed; /* connection speed in bits/sec (0 = unknown) */
+ gint current_video; /* the currently selected stream */
+ gint current_audio; /* the currently selected stream */
+ gint current_text; /* the currently selected stream */
+
+ guint64 buffer_duration; /* When buffering, the max buffer duration (ns) */
+ guint buffer_size; /* When buffering, the max buffer size (bytes) */
+
+ /* our play sink */
+ GstPlaySink *playsink;
+
+ /* the last activated source */
+ GstElement *source;
+
+ /* lock protecting dynamic adding/removing */
+ GMutex *dyn_lock;
+ /* if we are shutting down or not */
+ gint shutdown;
+
+ GMutex *elements_lock;
+ guint32 elements_cookie;
+ GList *elements; /* factories we can use for selecting elements */
+
+ gboolean have_selector; /* set to FALSE when we fail to create an
+ * input-selector, so that we only post a
+ * warning once */
+
+ GstElement *audio_sink; /* configured audio sink, or NULL */
+ GstElement *video_sink; /* configured video sink, or NULL */
+ GstElement *text_sink; /* configured text sink, or NULL */
+
+ struct
+ {
+ gboolean valid;
+ GstFormat format;
+ gint64 duration;
+ } duration[5]; /* cached durations */
+
+ guint64 ring_buffer_max_size; /* 0 means disabled */
+};
+
+struct _GstPlayBinClass
+{
+ GstPipelineClass parent_class;
+
+ /* notify app that the current uri finished decoding and it is possible to
+ * queue a new one for gapless playback */
+ void (*about_to_finish) (GstPlayBin * playbin);
+
+ /* notify app that number of audio/video/text streams changed */
+ void (*video_changed) (GstPlayBin * playbin);
+ void (*audio_changed) (GstPlayBin * playbin);
+ void (*text_changed) (GstPlayBin * playbin);
+
+ /* notify app that the tags of audio/video/text streams changed */
+ void (*video_tags_changed) (GstPlayBin * playbin, gint stream);
+ void (*audio_tags_changed) (GstPlayBin * playbin, gint stream);
+ void (*text_tags_changed) (GstPlayBin * playbin, gint stream);
+
+ /* get audio/video/text tags for a stream */
+ GstTagList *(*get_video_tags) (GstPlayBin * playbin, gint stream);
+ GstTagList *(*get_audio_tags) (GstPlayBin * playbin, gint stream);
+ GstTagList *(*get_text_tags) (GstPlayBin * playbin, gint stream);
+
+ /* get the last video frame and convert it to the given caps */
+ GstBuffer *(*convert_frame) (GstPlayBin * playbin, GstCaps * caps);
+
+ /* get audio/video/text pad for a stream */
+ GstPad *(*get_video_pad) (GstPlayBin * playbin, gint stream);
+ GstPad *(*get_audio_pad) (GstPlayBin * playbin, gint stream);
+ GstPad *(*get_text_pad) (GstPlayBin * playbin, gint stream);
+};
+
+/* props */
+#define DEFAULT_URI NULL
+#define DEFAULT_SUBURI NULL
+#define DEFAULT_SOURCE NULL
+#define DEFAULT_FLAGS GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_TEXT | \
+ GST_PLAY_FLAG_SOFT_VOLUME
+#define DEFAULT_N_VIDEO 0
+#define DEFAULT_CURRENT_VIDEO -1
+#define DEFAULT_N_AUDIO 0
+#define DEFAULT_CURRENT_AUDIO -1
+#define DEFAULT_N_TEXT 0
+#define DEFAULT_CURRENT_TEXT -1
+#define DEFAULT_SUBTITLE_ENCODING NULL
+#define DEFAULT_AUDIO_SINK NULL
+#define DEFAULT_VIDEO_SINK NULL
+#define DEFAULT_VIS_PLUGIN NULL
+#define DEFAULT_TEXT_SINK NULL
+#define DEFAULT_VOLUME 1.0
+#define DEFAULT_MUTE FALSE
+#define DEFAULT_FRAME NULL
+#define DEFAULT_FONT_DESC NULL
+#define DEFAULT_CONNECTION_SPEED 0
+#define DEFAULT_BUFFER_DURATION -1
+#define DEFAULT_BUFFER_SIZE -1
+#define DEFAULT_RING_BUFFER_MAX_SIZE 0
+
+enum
+{
+ PROP_0,
+ PROP_URI,
+ PROP_SUBURI,
+ PROP_SOURCE,
+ PROP_FLAGS,
+ PROP_N_VIDEO,
+ PROP_CURRENT_VIDEO,
+ PROP_N_AUDIO,
+ PROP_CURRENT_AUDIO,
+ PROP_N_TEXT,
+ PROP_CURRENT_TEXT,
+ PROP_SUBTITLE_ENCODING,
+ PROP_AUDIO_SINK,
+ PROP_VIDEO_SINK,
+ PROP_VIS_PLUGIN,
+ PROP_TEXT_SINK,
+ PROP_VOLUME,
+ PROP_MUTE,
+ PROP_FRAME,
+ PROP_FONT_DESC,
+ PROP_CONNECTION_SPEED,
+ PROP_BUFFER_SIZE,
+ PROP_BUFFER_DURATION,
+ PROP_AV_OFFSET,
+ PROP_RING_BUFFER_MAX_SIZE,
+ PROP_LAST
+};
+
+/* signals */
+enum
+{
+ SIGNAL_ABOUT_TO_FINISH,
+ SIGNAL_CONVERT_FRAME,
+ SIGNAL_VIDEO_CHANGED,
+ SIGNAL_AUDIO_CHANGED,
+ SIGNAL_TEXT_CHANGED,
+ SIGNAL_VIDEO_TAGS_CHANGED,
+ SIGNAL_AUDIO_TAGS_CHANGED,
+ SIGNAL_TEXT_TAGS_CHANGED,
+ SIGNAL_GET_VIDEO_TAGS,
+ SIGNAL_GET_AUDIO_TAGS,
+ SIGNAL_GET_TEXT_TAGS,
+ SIGNAL_GET_VIDEO_PAD,
+ SIGNAL_GET_AUDIO_PAD,
+ SIGNAL_GET_TEXT_PAD,
+ SIGNAL_SOURCE_SETUP,
+ LAST_SIGNAL
+};
+
+static void gst_play_bin_class_init (GstPlayBinClass * klass);
+static void gst_play_bin_init (GstPlayBin * playbin);
+static void gst_play_bin_finalize (GObject * object);
+
+static void gst_play_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * spec);
+static void gst_play_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * spec);
+
+static GstStateChangeReturn gst_play_bin_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void gst_play_bin_handle_message (GstBin * bin, GstMessage * message);
+static gboolean gst_play_bin_query (GstElement * element, GstQuery * query);
+
+static GstTagList *gst_play_bin_get_video_tags (GstPlayBin * playbin,
+ gint stream);
+static GstTagList *gst_play_bin_get_audio_tags (GstPlayBin * playbin,
+ gint stream);
+static GstTagList *gst_play_bin_get_text_tags (GstPlayBin * playbin,
+ gint stream);
+
+static GstBuffer *gst_play_bin_convert_frame (GstPlayBin * playbin,
+ GstCaps * caps);
+
+static GstPad *gst_play_bin_get_video_pad (GstPlayBin * playbin, gint stream);
+static GstPad *gst_play_bin_get_audio_pad (GstPlayBin * playbin, gint stream);
+static GstPad *gst_play_bin_get_text_pad (GstPlayBin * playbin, gint stream);
+
+static gboolean setup_next_source (GstPlayBin * playbin, GstState target);
+
+static void no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group);
+static void pad_removed_cb (GstElement * decodebin, GstPad * pad,
+ GstSourceGroup * group);
+
+static void gst_play_bin_suburidecodebin_block (GstSourceGroup * group,
+ GstElement * suburidecodebin, gboolean block);
+static void gst_play_bin_suburidecodebin_seek_to_start (GstElement *
+ suburidecodebin);
+
+static GstElementClass *parent_class;
+
+static guint gst_play_bin_signals[LAST_SIGNAL] = { 0 };
+
+#define REMOVE_SIGNAL(obj,id) \
+if (id) { \
+ g_signal_handler_disconnect (obj, id); \
+ id = 0; \
+}
+
+static GType
+gst_play_bin_get_type (void)
+{
+ static GType gst_play_bin_type = 0;
+
+ if (!gst_play_bin_type) {
+ static const GTypeInfo gst_play_bin_info = {
+ sizeof (GstPlayBinClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_play_bin_class_init,
+ NULL,
+ NULL,
+ sizeof (GstPlayBin),
+ 0,
+ (GInstanceInitFunc) gst_play_bin_init,
+ NULL
+ };
+ static const GInterfaceInfo svol_info = {
+ NULL, NULL, NULL
+ };
+
+ gst_play_bin_type = g_type_register_static (GST_TYPE_PIPELINE,
+ "GstPlayBin", &gst_play_bin_info, 0);
+
+ g_type_add_interface_static (gst_play_bin_type, GST_TYPE_STREAM_VOLUME,
+ &svol_info);
+ }
+
+ return gst_play_bin_type;
+}
+
+static void
+gst_play_bin_class_init (GstPlayBinClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+ GstBinClass *gstbin_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+ gstbin_klass = (GstBinClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_klass->set_property = gst_play_bin_set_property;
+ gobject_klass->get_property = gst_play_bin_get_property;
+
+ gobject_klass->finalize = gst_play_bin_finalize;
+
+ /**
+ * GstPlayBin:uri
+ *
+ * Set the next URI that playbin will play. This property can be set from the
+ * about-to-finish signal to queue the next media file.
+ */
+ g_object_class_install_property (gobject_klass, PROP_URI,
+ g_param_spec_string ("uri", "URI", "URI of the media to play",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin:suburi
+ *
+ * Set the next subtitle URI that playbin will play. This property can be
+ * set from the about-to-finish signal to queue the next subtitle media file.
+ */
+ g_object_class_install_property (gobject_klass, PROP_SUBURI,
+ g_param_spec_string ("suburi", ".sub-URI", "Optional URI of a subtitle",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_SOURCE,
+ g_param_spec_object ("source", "Source", "Source element",
+ GST_TYPE_ELEMENT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin:flags
+ *
+ * Control the behaviour of playbin.
+ */
+ g_object_class_install_property (gobject_klass, PROP_FLAGS,
+ g_param_spec_flags ("flags", "Flags", "Flags to control behaviour",
+ GST_TYPE_PLAY_FLAGS, DEFAULT_FLAGS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin:n-video
+ *
+ * Get the total number of available video streams.
+ */
+ g_object_class_install_property (gobject_klass, PROP_N_VIDEO,
+ g_param_spec_int ("n-video", "Number Video",
+ "Total number of video streams", 0, G_MAXINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:current-video
+ *
+ * Get or set the currently playing video stream. By default the first video
+ * stream with data is played.
+ */
+ g_object_class_install_property (gobject_klass, PROP_CURRENT_VIDEO,
+ g_param_spec_int ("current-video", "Current Video",
+ "Currently playing video stream (-1 = auto)",
+ -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:n-audio
+ *
+ * Get the total number of available audio streams.
+ */
+ g_object_class_install_property (gobject_klass, PROP_N_AUDIO,
+ g_param_spec_int ("n-audio", "Number Audio",
+ "Total number of audio streams", 0, G_MAXINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:current-audio
+ *
+ * Get or set the currently playing audio stream. By default the first audio
+ * stream with data is played.
+ */
+ g_object_class_install_property (gobject_klass, PROP_CURRENT_AUDIO,
+ g_param_spec_int ("current-audio", "Current audio",
+ "Currently playing audio stream (-1 = auto)",
+ -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:n-text
+ *
+ * Get the total number of available subtitle streams.
+ */
+ g_object_class_install_property (gobject_klass, PROP_N_TEXT,
+ g_param_spec_int ("n-text", "Number Text",
+ "Total number of text streams", 0, G_MAXINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:current-text:
+ *
+ * Get or set the currently playing subtitle stream. By default the first
+ * subtitle stream with data is played.
+ */
+ g_object_class_install_property (gobject_klass, PROP_CURRENT_TEXT,
+ g_param_spec_int ("current-text", "Current Text",
+ "Currently playing text stream (-1 = auto)",
+ -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_SUBTITLE_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 encoding. "
+ "If not set, the GST_SUBTITLE_ENCODING environment variable will "
+ "be checked for an encoding to use. If that is not set either, "
+ "ISO-8859-15 will be assumed.", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_VIDEO_SINK,
+ g_param_spec_object ("video-sink", "Video Sink",
+ "the video output element to use (NULL = default sink)",
+ GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_AUDIO_SINK,
+ g_param_spec_object ("audio-sink", "Audio Sink",
+ "the audio output element to use (NULL = default sink)",
+ GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_VIS_PLUGIN,
+ g_param_spec_object ("vis-plugin", "Vis plugin",
+ "the visualization element to use (NULL = default)",
+ GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_TEXT_SINK,
+ g_param_spec_object ("text-sink", "Text plugin",
+ "the text output element to use (NULL = default textoverlay)",
+ GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin:volume:
+ *
+ * Get or set the current audio stream volume. 1.0 means 100%,
+ * 0.0 means mute. This uses a linear volume scale.
+ *
+ */
+ g_object_class_install_property (gobject_klass, PROP_VOLUME,
+ g_param_spec_double ("volume", "Volume", "The audio volume, 1.0=100%",
+ 0.0, VOLUME_MAX_DOUBLE, 1.0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_MUTE,
+ g_param_spec_boolean ("mute", "Mute",
+ "Mute the audio channel without changing the volume", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin:frame:
+ * @playbin: a #GstPlayBin
+ *
+ * Get the currently rendered or prerolled frame in the video sink.
+ * The #GstCaps on the buffer will describe the format of the buffer.
+ */
+ g_object_class_install_property (gobject_klass, PROP_FRAME,
+ g_param_spec_boxed ("frame", "Frame",
+ "The last frame (NULL = no video available)",
+ GST_TYPE_BUFFER, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_FONT_DESC,
+ g_param_spec_string ("subtitle-font-desc",
+ "Subtitle font description",
+ "Pango font description of font "
+ "to be used for subtitle rendering", NULL,
+ G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_CONNECTION_SPEED,
+ g_param_spec_uint ("connection-speed", "Connection Speed",
+ "Network connection speed in kbps (0 = unknown)",
+ 0, G_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_klass, PROP_BUFFER_SIZE,
+ g_param_spec_int ("buffer-size", "Buffer size (bytes)",
+ "Buffer size when buffering network streams",
+ -1, G_MAXINT, DEFAULT_BUFFER_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_BUFFER_DURATION,
+ g_param_spec_int64 ("buffer-duration", "Buffer duration (ns)",
+ "Buffer duration when buffering network streams",
+ -1, G_MAXINT64, DEFAULT_BUFFER_DURATION,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlayBin:av-offset:
+ *
+ * Control the synchronisation offset between the audio and video streams.
+ * Positive values make the audio ahead of the video and negative values make
+ * the audio go behind the video.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_klass, PROP_AV_OFFSET,
+ g_param_spec_int64 ("av-offset", "AV Offset",
+ "The synchronisation offset between audio and video in nanoseconds",
+ G_MININT64, G_MAXINT64, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstQueue2:ring-buffer-max-size
+ *
+ * The maximum size of the ring buffer in bytes. If set to 0, the ring
+ * buffer is disabled. Default 0.
+ *
+ * Since: 0.10.31
+ */
+ g_object_class_install_property (gobject_klass, PROP_RING_BUFFER_MAX_SIZE,
+ g_param_spec_uint64 ("ring-buffer-max-size",
+ "Max. ring buffer size (bytes)",
+ "Max. amount of data in the ring buffer (bytes, 0 = ring buffer disabled)",
+ 0, G_MAXUINT, DEFAULT_RING_BUFFER_MAX_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlayBin::about-to-finish
+ * @playbin: a #GstPlayBin
+ *
+ * This signal is emitted when the current uri is about to finish. You can
+ * set the uri and suburi to make sure that playback continues.
+ */
+ gst_play_bin_signals[SIGNAL_ABOUT_TO_FINISH] =
+ g_signal_new ("about-to-finish", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, about_to_finish), NULL, NULL,
+ gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstPlayBin::video-changed
+ * @playbin: a #GstPlayBin
+ *
+ * This signal is emitted whenever the number or order of the video
+ * streams has changed. The application will most likely want to select
+ * a new video stream.
+ */
+ gst_play_bin_signals[SIGNAL_VIDEO_CHANGED] =
+ g_signal_new ("video-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, video_changed), NULL, NULL,
+ gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ * GstPlayBin::audio-changed
+ * @playbin: a #GstPlayBin
+ *
+ * This signal is emitted whenever the number or order of the audio
+ * streams has changed. The application will most likely want to select
+ * a new audio stream.
+ */
+ gst_play_bin_signals[SIGNAL_AUDIO_CHANGED] =
+ g_signal_new ("audio-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, audio_changed), NULL, NULL,
+ gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ * GstPlayBin::text-changed
+ * @playbin: a #GstPlayBin
+ *
+ * This signal is emitted whenever the number or order of the text
+ * streams has changed. The application will most likely want to select
+ * a new text stream.
+ */
+ gst_play_bin_signals[SIGNAL_TEXT_CHANGED] =
+ g_signal_new ("text-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, text_changed), NULL, NULL,
+ gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstPlayBin::video-tags-changed
+ * @playbin: a #GstPlayBin
+ * @stream: stream index with changed tags
+ *
+ * This signal is emitted whenever the tags of a video stream have changed.
+ * The application will most likely want to get the new tags.
+ *
+ * Since: 0.10.24
+ */
+ gst_play_bin_signals[SIGNAL_VIDEO_TAGS_CHANGED] =
+ g_signal_new ("video-tags-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, video_tags_changed), NULL, NULL,
+ gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ /**
+ * GstPlayBin::audio-tags-changed
+ * @playbin: a #GstPlayBin
+ * @stream: stream index with changed tags
+ *
+ * This signal is emitted whenever the tags of an audio stream have changed.
+ * The application will most likely want to get the new tags.
+ *
+ * Since: 0.10.24
+ */
+ gst_play_bin_signals[SIGNAL_AUDIO_TAGS_CHANGED] =
+ g_signal_new ("audio-tags-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, audio_tags_changed), NULL, NULL,
+ gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ /**
+ * GstPlayBin::text-tags-changed
+ * @playbin: a #GstPlayBin
+ * @stream: stream index with changed tags
+ *
+ * This signal is emitted whenever the tags of a text stream have changed.
+ * The application will most likely want to get the new tags.
+ *
+ * Since: 0.10.24
+ */
+ gst_play_bin_signals[SIGNAL_TEXT_TAGS_CHANGED] =
+ g_signal_new ("text-tags-changed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPlayBinClass, text_tags_changed), NULL, NULL,
+ gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ /**
+ * GstPlayBin::source-setup:
+ * @playbin: a #GstPlayBin
+ * @source: source element
+ *
+ * This signal is emitted after the source element has been created, so
+ * it can be configured by setting additional properties (e.g. set a
+ * proxy server for an http source, or set the device and read speed for
+ * an audio cd source). This is functionally equivalent to connecting to
+ * the notify::source signal, but more convenient.
+ *
+ * Since: 0.10.33
+ */
+ gst_play_bin_signals[SIGNAL_SOURCE_SETUP] =
+ g_signal_new ("source-setup", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
+
+ /**
+ * GstPlayBin::get-video-tags
+ * @playbin: a #GstPlayBin
+ * @stream: a video stream number
+ *
+ * Action signal to retrieve the tags of a specific video stream number.
+ * This information can be used to select a stream.
+ *
+ * Returns: a GstTagList with tags or NULL when the stream number does not
+ * exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_VIDEO_TAGS] =
+ g_signal_new ("get-video-tags", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_video_tags), NULL, NULL,
+ gst_play_marshal_BOXED__INT, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
+ /**
+ * GstPlayBin::get-audio-tags
+ * @playbin: a #GstPlayBin
+ * @stream: an audio stream number
+ *
+ * Action signal to retrieve the tags of a specific audio stream number.
+ * This information can be used to select a stream.
+ *
+ * Returns: a GstTagList with tags or NULL when the stream number does not
+ * exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_AUDIO_TAGS] =
+ g_signal_new ("get-audio-tags", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_audio_tags), NULL, NULL,
+ gst_play_marshal_BOXED__INT, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
+ /**
+ * GstPlayBin::get-text-tags
+ * @playbin: a #GstPlayBin
+ * @stream: a text stream number
+ *
+ * Action signal to retrieve the tags of a specific text stream number.
+ * This information can be used to select a stream.
+ *
+ * Returns: a GstTagList with tags or NULL when the stream number does not
+ * exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_TEXT_TAGS] =
+ g_signal_new ("get-text-tags", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_text_tags), NULL, NULL,
+ gst_play_marshal_BOXED__INT, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
+ /**
+ * GstPlayBin::convert-frame
+ * @playbin: a #GstPlayBin
+ * @caps: the target format of the frame
+ *
+ * Action signal to retrieve the currently playing video frame in the format
+ * specified by @caps.
+ * If @caps is %NULL, no conversion will be performed and this function is
+ * equivalent to the #GstPlayBin::frame property.
+ *
+ * Returns: a #GstBuffer of the current video frame converted to #caps.
+ * The caps on the buffer will describe the final layout of the buffer data.
+ * %NULL is returned when no current buffer can be retrieved or when the
+ * conversion failed.
+ */
+ gst_play_bin_signals[SIGNAL_CONVERT_FRAME] =
+ g_signal_new ("convert-frame", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, convert_frame), NULL, NULL,
+ gst_play_marshal_BUFFER__BOXED, GST_TYPE_BUFFER, 1, GST_TYPE_CAPS);
+
+ /**
+ * GstPlayBin::get-video-pad
+ * @playbin: a #GstPlayBin
+ * @stream: a video stream number
+ *
+ * Action signal to retrieve the stream-selector sinkpad for a specific
+ * video stream.
+ * This pad can be used for notifications of caps changes, stream-specific
+ * queries, etc.
+ *
+ * Returns: a #GstPad, or NULL when the stream number does not exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_VIDEO_PAD] =
+ g_signal_new ("get-video-pad", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_video_pad), NULL, NULL,
+ gst_play_marshal_OBJECT__INT, GST_TYPE_PAD, 1, G_TYPE_INT);
+ /**
+ * GstPlayBin::get-audio-pad
+ * @playbin: a #GstPlayBin
+ * @stream: an audio stream number
+ *
+ * Action signal to retrieve the stream-selector sinkpad for a specific
+ * audio stream.
+ * This pad can be used for notifications of caps changes, stream-specific
+ * queries, etc.
+ *
+ * Returns: a #GstPad, or NULL when the stream number does not exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_AUDIO_PAD] =
+ g_signal_new ("get-audio-pad", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_audio_pad), NULL, NULL,
+ gst_play_marshal_OBJECT__INT, GST_TYPE_PAD, 1, G_TYPE_INT);
+ /**
+ * GstPlayBin::get-text-pad
+ * @playbin: a #GstPlayBin
+ * @stream: a text stream number
+ *
+ * Action signal to retrieve the stream-selector sinkpad for a specific
+ * text stream.
+ * This pad can be used for notifications of caps changes, stream-specific
+ * queries, etc.
+ *
+ * Returns: a #GstPad, or NULL when the stream number does not exist.
+ */
+ gst_play_bin_signals[SIGNAL_GET_TEXT_PAD] =
+ g_signal_new ("get-text-pad", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlayBinClass, get_text_pad), NULL, NULL,
+ gst_play_marshal_OBJECT__INT, GST_TYPE_PAD, 1, G_TYPE_INT);
+
+ klass->get_video_tags = gst_play_bin_get_video_tags;
+ klass->get_audio_tags = gst_play_bin_get_audio_tags;
+ klass->get_text_tags = gst_play_bin_get_text_tags;
+
+ klass->convert_frame = gst_play_bin_convert_frame;
+
+ klass->get_video_pad = gst_play_bin_get_video_pad;
+ klass->get_audio_pad = gst_play_bin_get_audio_pad;
+ klass->get_text_pad = gst_play_bin_get_text_pad;
+
+ gst_element_class_set_details_simple (gstelement_klass,
+ "Player Bin 2", "Generic/Bin/Player",
+ "Autoplug and play media from an uri",
+ "Wim Taymans <wim.taymans@gmail.com>");
+
+ gstelement_klass->change_state =
+ GST_DEBUG_FUNCPTR (gst_play_bin_change_state);
+ gstelement_klass->query = GST_DEBUG_FUNCPTR (gst_play_bin_query);
+
+ gstbin_klass->handle_message =
+ GST_DEBUG_FUNCPTR (gst_play_bin_handle_message);
+}
+
+static void
+init_group (GstPlayBin * playbin, GstSourceGroup * group)
+{
+ int n;
+
+ /* store the array for the different channels */
+ group->video_channels = g_ptr_array_new ();
+ group->audio_channels = g_ptr_array_new ();
+ group->text_channels = g_ptr_array_new ();
+ group->lock = g_mutex_new ();
+ /* init selectors. The selector is found by finding the first prefix that
+ * matches the media. */
+ group->playbin = playbin;
+ /* If you add any items to these lists, check that media_list[] is defined
+ * above to be large enough to hold MAX(items)+1, so as to accomodate a
+ * NULL terminator (set when the memory is zeroed on allocation) */
+ group->selector[PLAYBIN_STREAM_AUDIO].media_list[0] = "audio/";
+ group->selector[PLAYBIN_STREAM_AUDIO].type = GST_PLAY_SINK_TYPE_AUDIO;
+ group->selector[PLAYBIN_STREAM_AUDIO].channels = group->audio_channels;
+ group->selector[PLAYBIN_STREAM_VIDEO].media_list[0] = "video/";
+ group->selector[PLAYBIN_STREAM_VIDEO].type = GST_PLAY_SINK_TYPE_VIDEO;
+ group->selector[PLAYBIN_STREAM_VIDEO].channels = group->video_channels;
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[0] = "text/";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[1] = "application/x-subtitle";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[2] = "application/x-ssa";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[3] = "application/x-ass";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[4] = "video/x-dvd-subpicture";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[5] = "subpicture/";
+ group->selector[PLAYBIN_STREAM_TEXT].media_list[6] = "subtitle/";
+ group->selector[PLAYBIN_STREAM_TEXT].get_media_caps =
+ gst_subtitle_overlay_create_factory_caps;
+ group->selector[PLAYBIN_STREAM_TEXT].type = GST_PLAY_SINK_TYPE_TEXT;
+ group->selector[PLAYBIN_STREAM_TEXT].channels = group->text_channels;
+
+ for (n = 0; n < PLAYBIN_STREAM_LAST; n++) {
+ GstSourceSelect *select = &group->selector[n];
+ select->sinkpad_delayed_event = NULL;
+ select->sinkpad_data_probe = 0;
+ }
+}
+
+static void
+free_group (GstPlayBin * playbin, GstSourceGroup * group)
+{
+ int n;
+
+ for (n = 0; n < PLAYBIN_STREAM_LAST; n++) {
+ GstSourceSelect *select = &group->selector[n];
+ if (select->sinkpad && select->sinkpad_data_probe)
+ gst_pad_remove_probe (select->sinkpad, select->sinkpad_data_probe);
+ if (select->sinkpad_delayed_event)
+ gst_event_unref (select->sinkpad_delayed_event);
+ }
+
+ g_free (group->uri);
+ g_free (group->suburi);
+ g_ptr_array_free (group->video_channels, TRUE);
+ g_ptr_array_free (group->audio_channels, TRUE);
+ g_ptr_array_free (group->text_channels, TRUE);
+
+ g_mutex_free (group->lock);
+ if (group->audio_sink) {
+ if (group->audio_sink != playbin->audio_sink)
+ gst_element_set_state (group->audio_sink, GST_STATE_NULL);
+ gst_object_unref (group->audio_sink);
+ }
+ group->audio_sink = NULL;
+ if (group->video_sink) {
+ if (group->video_sink != playbin->video_sink)
+ gst_element_set_state (group->video_sink, GST_STATE_NULL);
+ gst_object_unref (group->video_sink);
+ }
+ group->video_sink = NULL;
+
+ g_list_free (group->stream_changed_pending);
+ group->stream_changed_pending = NULL;
+
+ if (group->stream_changed_pending_lock)
+ g_mutex_free (group->stream_changed_pending_lock);
+ group->stream_changed_pending_lock = NULL;
+}
+
+static void
+notify_volume_cb (GObject * selector, GParamSpec * pspec, GstPlayBin * playbin)
+{
+ g_object_notify (G_OBJECT (playbin), "volume");
+}
+
+static void
+notify_mute_cb (GObject * selector, GParamSpec * pspec, GstPlayBin * playbin)
+{
+ g_object_notify (G_OBJECT (playbin), "mute");
+}
+
+/* Must be called with elements lock! */
+static void
+gst_play_bin_update_elements_list (GstPlayBin * playbin)
+{
+ GList *res, *tmp;
+
+ if (!playbin->elements ||
+ playbin->elements_cookie !=
+ gst_default_registry_get_feature_list_cookie ()) {
+ if (playbin->elements)
+ gst_plugin_feature_list_free (playbin->elements);
+ res =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_DECODABLE, GST_RANK_MARGINAL);
+ tmp =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS, GST_RANK_MARGINAL);
+ playbin->elements = g_list_concat (res, tmp);
+ playbin->elements =
+ g_list_sort (playbin->elements, gst_plugin_feature_rank_compare_func);
+ playbin->elements_cookie = gst_default_registry_get_feature_list_cookie ();
+ }
+}
+
+static void
+gst_play_bin_init (GstPlayBin * playbin)
+{
+ g_static_rec_mutex_init (&playbin->lock);
+ playbin->dyn_lock = g_mutex_new ();
+
+ /* assume we can create a selector */
+ playbin->have_selector = TRUE;
+
+ /* init groups */
+ playbin->curr_group = &playbin->groups[0];
+ playbin->next_group = &playbin->groups[1];
+ init_group (playbin, &playbin->groups[0]);
+ init_group (playbin, &playbin->groups[1]);
+
+ /* first filter out the interesting element factories */
+ playbin->elements_lock = g_mutex_new ();
+
+ /* add sink */
+ playbin->playsink = g_object_new (GST_TYPE_PLAY_SINK, NULL);
+ gst_bin_add (GST_BIN_CAST (playbin), GST_ELEMENT_CAST (playbin->playsink));
+ gst_play_sink_set_flags (playbin->playsink, DEFAULT_FLAGS);
+ /* Connect to notify::volume and notify::mute signals for proxying */
+ g_signal_connect (playbin->playsink, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playbin);
+ g_signal_connect (playbin->playsink, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playbin);
+
+ playbin->current_video = DEFAULT_CURRENT_VIDEO;
+ playbin->current_audio = DEFAULT_CURRENT_AUDIO;
+ playbin->current_text = DEFAULT_CURRENT_TEXT;
+
+ playbin->buffer_duration = DEFAULT_BUFFER_DURATION;
+ playbin->buffer_size = DEFAULT_BUFFER_SIZE;
+ playbin->ring_buffer_max_size = DEFAULT_RING_BUFFER_MAX_SIZE;
+}
+
+static void
+gst_play_bin_finalize (GObject * object)
+{
+ GstPlayBin *playbin;
+
+ playbin = GST_PLAY_BIN (object);
+
+ free_group (playbin, &playbin->groups[0]);
+ free_group (playbin, &playbin->groups[1]);
+
+ if (playbin->source)
+ gst_object_unref (playbin->source);
+ if (playbin->video_sink) {
+ gst_element_set_state (playbin->video_sink, GST_STATE_NULL);
+ gst_object_unref (playbin->video_sink);
+ }
+ if (playbin->audio_sink) {
+ gst_element_set_state (playbin->audio_sink, GST_STATE_NULL);
+ gst_object_unref (playbin->audio_sink);
+ }
+ if (playbin->text_sink) {
+ gst_element_set_state (playbin->text_sink, GST_STATE_NULL);
+ gst_object_unref (playbin->text_sink);
+ }
+
+ if (playbin->elements)
+ gst_plugin_feature_list_free (playbin->elements);
+
+ g_static_rec_mutex_free (&playbin->lock);
+ g_mutex_free (playbin->dyn_lock);
+ g_mutex_free (playbin->elements_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_playbin_uri_is_valid (GstPlayBin * playbin, const gchar * uri)
+{
+ const gchar *c;
+
+ GST_LOG_OBJECT (playbin, "checking uri '%s'", uri);
+
+ /* this just checks the protocol */
+ if (!gst_uri_is_valid (uri))
+ return FALSE;
+
+ for (c = uri; *c != '\0'; ++c) {
+ if (!g_ascii_isprint (*c))
+ goto invalid;
+ if (*c == ' ')
+ goto invalid;
+ }
+
+ return TRUE;
+
+invalid:
+ {
+ GST_WARNING_OBJECT (playbin, "uri '%s' not valid, character #%u",
+ uri, (guint) ((guintptr) c - (guintptr) uri));
+ return FALSE;
+ }
+}
+
+static void
+gst_play_bin_set_uri (GstPlayBin * playbin, const gchar * uri)
+{
+ GstSourceGroup *group;
+
+ if (uri == NULL) {
+ g_warning ("cannot set NULL uri");
+ return;
+ }
+
+ if (!gst_playbin_uri_is_valid (playbin, uri)) {
+ if (g_str_has_prefix (uri, "file:")) {
+ GST_ERROR_OBJECT (playbin, "malformed file URI '%s' - make sure to "
+ "escape spaces and non-ASCII characters properly and specify an "
+ "absolute path. Use gst_filename_to_uri() to convert filenames "
+ "to URIs", uri);
+ } else {
+ GST_ERROR_OBJECT (playbin, "malformed URI '%s'", uri);
+ }
+ }
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = playbin->next_group;
+
+ GST_SOURCE_GROUP_LOCK (group);
+ /* store the uri in the next group we will play */
+ g_free (group->uri);
+ group->uri = g_strdup (uri);
+ group->valid = TRUE;
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ GST_DEBUG ("set new uri to %s", uri);
+ GST_PLAY_BIN_UNLOCK (playbin);
+}
+
+static void
+gst_play_bin_set_suburi (GstPlayBin * playbin, const gchar * suburi)
+{
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = playbin->next_group;
+
+ GST_SOURCE_GROUP_LOCK (group);
+ g_free (group->suburi);
+ group->suburi = g_strdup (suburi);
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ GST_DEBUG ("setting new .sub uri to %s", suburi);
+
+ GST_PLAY_BIN_UNLOCK (playbin);
+}
+
+static void
+gst_play_bin_set_flags (GstPlayBin * playbin, GstPlayFlags flags)
+{
+ gst_play_sink_set_flags (playbin->playsink, flags);
+ gst_play_sink_reconfigure (playbin->playsink);
+}
+
+static GstPlayFlags
+gst_play_bin_get_flags (GstPlayBin * playbin)
+{
+ GstPlayFlags flags;
+
+ flags = gst_play_sink_get_flags (playbin->playsink);
+
+ return flags;
+}
+
+/* get the currently playing group or if nothing is playing, the next
+ * group. Must be called with the PLAY_BIN_LOCK. */
+static GstSourceGroup *
+get_group (GstPlayBin * playbin)
+{
+ GstSourceGroup *result;
+
+ if (!(result = playbin->curr_group))
+ result = playbin->next_group;
+
+ return result;
+}
+
+static GstPad *
+gst_play_bin_get_video_pad (GstPlayBin * playbin, gint stream)
+{
+ GstPad *sinkpad = NULL;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ if (stream < group->video_channels->len) {
+ sinkpad = g_ptr_array_index (group->video_channels, stream);
+ gst_object_ref (sinkpad);
+ }
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return sinkpad;
+}
+
+static GstPad *
+gst_play_bin_get_audio_pad (GstPlayBin * playbin, gint stream)
+{
+ GstPad *sinkpad = NULL;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ if (stream < group->audio_channels->len) {
+ sinkpad = g_ptr_array_index (group->audio_channels, stream);
+ gst_object_ref (sinkpad);
+ }
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return sinkpad;
+}
+
+static GstPad *
+gst_play_bin_get_text_pad (GstPlayBin * playbin, gint stream)
+{
+ GstPad *sinkpad = NULL;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ if (stream < group->text_channels->len) {
+ sinkpad = g_ptr_array_index (group->text_channels, stream);
+ gst_object_ref (sinkpad);
+ }
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return sinkpad;
+}
+
+
+static GstTagList *
+get_tags (GstPlayBin * playbin, GPtrArray * channels, gint stream)
+{
+ GstTagList *result;
+ GstPad *sinkpad;
+
+ if (!channels || stream >= channels->len)
+ return NULL;
+
+ sinkpad = g_ptr_array_index (channels, stream);
+ g_object_get (sinkpad, "tags", &result, NULL);
+
+ return result;
+}
+
+static GstTagList *
+gst_play_bin_get_video_tags (GstPlayBin * playbin, gint stream)
+{
+ GstTagList *result;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ result = get_tags (playbin, group->video_channels, stream);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return result;
+}
+
+static GstTagList *
+gst_play_bin_get_audio_tags (GstPlayBin * playbin, gint stream)
+{
+ GstTagList *result;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ result = get_tags (playbin, group->audio_channels, stream);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return result;
+}
+
+static GstTagList *
+gst_play_bin_get_text_tags (GstPlayBin * playbin, gint stream)
+{
+ GstTagList *result;
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ result = get_tags (playbin, group->text_channels, stream);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return result;
+}
+
+static GstBuffer *
+gst_play_bin_convert_frame (GstPlayBin * playbin, GstCaps * caps)
+{
+ return gst_play_sink_convert_frame (playbin->playsink, caps);
+}
+
+/* Returns current stream number, or -1 if none has been selected yet */
+static int
+get_current_stream_number (GstPlayBin * playbin, GPtrArray * channels)
+{
+ /* Internal API cleanup would make this easier... */
+ int i;
+ GstPad *pad, *current;
+ GstObject *selector = NULL;
+ int ret = -1;
+
+ for (i = 0; i < channels->len; i++) {
+ pad = g_ptr_array_index (channels, i);
+ if ((selector = gst_pad_get_parent (pad))) {
+ g_object_get (selector, "active-pad", &current, NULL);
+ gst_object_unref (selector);
+
+ if (pad == current) {
+ gst_object_unref (current);
+ ret = i;
+ break;
+ }
+
+ if (current)
+ gst_object_unref (current);
+ }
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_play_bin_set_current_video_stream (GstPlayBin * playbin, gint stream)
+{
+ GstSourceGroup *group;
+ GPtrArray *channels;
+ GstPad *sinkpad;
+
+ GST_PLAY_BIN_LOCK (playbin);
+
+ GST_DEBUG_OBJECT (playbin, "Changing current video stream %d -> %d",
+ playbin->current_video, stream);
+
+ group = get_group (playbin);
+ if (!(channels = group->video_channels))
+ goto no_channels;
+
+ if (stream == -1 || channels->len <= stream) {
+ sinkpad = NULL;
+ } else {
+ /* take channel from selected stream */
+ sinkpad = g_ptr_array_index (channels, stream);
+ }
+
+ if (sinkpad)
+ gst_object_ref (sinkpad);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ if (sinkpad) {
+ GstObject *selector;
+
+ if ((selector = gst_pad_get_parent (sinkpad))) {
+ /* activate the selected pad */
+ g_object_set (selector, "active-pad", sinkpad, NULL);
+ gst_object_unref (selector);
+ }
+ gst_object_unref (sinkpad);
+ }
+ return TRUE;
+
+no_channels:
+ {
+ GST_PLAY_BIN_UNLOCK (playbin);
+ GST_DEBUG_OBJECT (playbin, "can't switch video, we have no channels");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_play_bin_set_current_audio_stream (GstPlayBin * playbin, gint stream)
+{
+ GstSourceGroup *group;
+ GPtrArray *channels;
+ GstPad *sinkpad;
+
+ GST_PLAY_BIN_LOCK (playbin);
+
+ GST_DEBUG_OBJECT (playbin, "Changing current audio stream %d -> %d",
+ playbin->current_audio, stream);
+
+ group = get_group (playbin);
+ if (!(channels = group->audio_channels))
+ goto no_channels;
+
+ if (stream == -1 || channels->len <= stream) {
+ sinkpad = NULL;
+ } else {
+ /* take channel from selected stream */
+ sinkpad = g_ptr_array_index (channels, stream);
+ }
+
+ if (sinkpad)
+ gst_object_ref (sinkpad);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ if (sinkpad) {
+ GstObject *selector;
+
+ if ((selector = gst_pad_get_parent (sinkpad))) {
+ /* activate the selected pad */
+ g_object_set (selector, "active-pad", sinkpad, NULL);
+ gst_object_unref (selector);
+ }
+ gst_object_unref (sinkpad);
+ }
+ return TRUE;
+
+no_channels:
+ {
+ GST_PLAY_BIN_UNLOCK (playbin);
+ GST_DEBUG_OBJECT (playbin, "can't switch audio, we have no channels");
+ return FALSE;
+ }
+}
+
+static void
+gst_play_bin_suburidecodebin_seek_to_start (GstElement * suburidecodebin)
+{
+ GstIterator *it = gst_element_iterate_src_pads (suburidecodebin);
+ GstPad *sinkpad;
+ GValue item = { 0, };
+
+ if (it && gst_iterator_next (it, &item) == GST_ITERATOR_OK
+ && ((sinkpad = g_value_get_object (&item)) != NULL)) {
+ GstEvent *event;
+
+ event =
+ gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, -1);
+ if (!gst_pad_send_event (sinkpad, event)) {
+ event =
+ gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, -1);
+ if (!gst_pad_send_event (sinkpad, event))
+ GST_DEBUG_OBJECT (suburidecodebin, "Seeking to the beginning failed!");
+ }
+
+ g_value_unset (&item);
+ }
+
+ if (it)
+ gst_iterator_free (it);
+}
+
+static void
+gst_play_bin_suburidecodebin_block (GstSourceGroup * group,
+ GstElement * suburidecodebin, gboolean block)
+{
+ GstIterator *it = gst_element_iterate_src_pads (suburidecodebin);
+ gboolean done = FALSE;
+ GValue item = { 0, };
+
+ GST_DEBUG_OBJECT (suburidecodebin, "Blocking suburidecodebin: %d", block);
+
+ if (!it)
+ return;
+ while (!done) {
+ GstPad *sinkpad;
+
+ switch (gst_iterator_next (it, &item)) {
+ case GST_ITERATOR_OK:
+ sinkpad = g_value_get_object (&item);
+ if (block) {
+ group->block_id =
+ gst_pad_add_probe (sinkpad, GST_PROBE_TYPE_BLOCK, NULL, NULL,
+ NULL);
+ } else if (group->block_id) {
+ gst_pad_remove_probe (sinkpad, group->block_id);
+ group->block_id = 0;
+ }
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_ERROR:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (it);
+}
+
+static gboolean
+gst_play_bin_set_current_text_stream (GstPlayBin * playbin, gint stream)
+{
+ GstSourceGroup *group;
+ GPtrArray *channels;
+ GstPad *sinkpad;
+
+ GST_PLAY_BIN_LOCK (playbin);
+
+ GST_DEBUG_OBJECT (playbin, "Changing current text stream %d -> %d",
+ playbin->current_text, stream);
+
+ group = get_group (playbin);
+ if (!(channels = group->text_channels))
+ goto no_channels;
+
+ if (stream == -1 || channels->len <= stream) {
+ sinkpad = NULL;
+ } else {
+ /* take channel from selected stream */
+ sinkpad = g_ptr_array_index (channels, stream);
+ }
+
+ if (sinkpad)
+ gst_object_ref (sinkpad);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ if (sinkpad) {
+ GstObject *selector;
+
+ if ((selector = gst_pad_get_parent (sinkpad))) {
+ GstPad *old_sinkpad;
+
+ g_object_get (selector, "active-pad", &old_sinkpad, NULL);
+
+ if (old_sinkpad != sinkpad) {
+ gboolean need_unblock, need_block, need_seek;
+ GstPad *src, *peer = NULL, *oldpeer = NULL;
+ GstElement *parent_element = NULL, *old_parent_element = NULL;
+
+ /* Now check if we need to seek the suburidecodebin to the beginning
+ * or if we need to block all suburidecodebin sinkpads or if we need
+ * to unblock all suburidecodebin sinkpads
+ */
+ if (sinkpad)
+ peer = gst_pad_get_peer (sinkpad);
+ if (old_sinkpad)
+ oldpeer = gst_pad_get_peer (old_sinkpad);
+
+ if (peer)
+ parent_element = gst_pad_get_parent_element (peer);
+ if (oldpeer)
+ old_parent_element = gst_pad_get_parent_element (oldpeer);
+
+ need_block = (old_parent_element == group->suburidecodebin
+ && parent_element != old_parent_element);
+ need_unblock = (parent_element == group->suburidecodebin
+ && parent_element != old_parent_element);
+ need_seek = (parent_element == group->suburidecodebin);
+
+ if (peer)
+ gst_object_unref (peer);
+ if (oldpeer)
+ gst_object_unref (oldpeer);
+ if (parent_element)
+ gst_object_unref (parent_element);
+ if (old_parent_element)
+ gst_object_unref (old_parent_element);
+
+ /* Block all suburidecodebin sinkpads */
+ if (need_block)
+ gst_play_bin_suburidecodebin_block (group, group->suburidecodebin,
+ TRUE);
+
+ /* activate the selected pad */
+ g_object_set (selector, "active-pad", sinkpad, NULL);
+
+ src = gst_element_get_static_pad (GST_ELEMENT_CAST (selector), "src");
+ peer = gst_pad_get_peer (src);
+ if (peer) {
+ GstStructure *s;
+ GstEvent *event;
+ /* Flush the subtitle renderer to remove any
+ * currently displayed subtitles. This event will
+ * never travel outside subtitleoverlay!
+ */
+ s = gst_structure_empty_new ("subtitleoverlay-flush-subtitle");
+ event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_OOB, s);
+ gst_pad_send_event (peer, event);
+ gst_object_unref (peer);
+ }
+ gst_object_unref (src);
+
+ /* Unblock pads if necessary */
+ if (need_unblock)
+ gst_play_bin_suburidecodebin_block (group, group->suburidecodebin,
+ FALSE);
+
+ /* seek to the beginning */
+ if (need_seek)
+ gst_play_bin_suburidecodebin_seek_to_start (group->suburidecodebin);
+ }
+ gst_object_unref (selector);
+
+ if (old_sinkpad)
+ gst_object_unref (old_sinkpad);
+ }
+ gst_object_unref (sinkpad);
+ }
+ return TRUE;
+
+no_channels:
+ {
+ GST_PLAY_BIN_UNLOCK (playbin);
+ return FALSE;
+ }
+}
+
+static void
+gst_play_bin_set_sink (GstPlayBin * playbin, GstElement ** elem,
+ const gchar * dbg, GstElement * sink)
+{
+ GST_INFO_OBJECT (playbin, "Setting %s sink to %" GST_PTR_FORMAT, dbg, sink);
+
+ GST_PLAY_BIN_LOCK (playbin);
+ if (*elem != sink) {
+ GstElement *old;
+
+ old = *elem;
+ if (sink)
+ gst_object_ref_sink (sink);
+
+ *elem = sink;
+ if (old)
+ gst_object_unref (old);
+ }
+ GST_LOG_OBJECT (playbin, "%s sink now %" GST_PTR_FORMAT, dbg, *elem);
+ GST_PLAY_BIN_UNLOCK (playbin);
+}
+
+static void
+gst_play_bin_set_encoding (GstPlayBin * playbin, const gchar * encoding)
+{
+ GstElement *elem;
+
+ GST_PLAY_BIN_LOCK (playbin);
+
+ /* set subtitles on all current and next decodebins. */
+ if ((elem = playbin->groups[0].uridecodebin))
+ g_object_set (G_OBJECT (elem), "subtitle-encoding", encoding, NULL);
+ if ((elem = playbin->groups[0].suburidecodebin))
+ g_object_set (G_OBJECT (elem), "subtitle-encoding", encoding, NULL);
+ if ((elem = playbin->groups[1].uridecodebin))
+ g_object_set (G_OBJECT (elem), "subtitle-encoding", encoding, NULL);
+ if ((elem = playbin->groups[1].suburidecodebin))
+ g_object_set (G_OBJECT (elem), "subtitle-encoding", encoding, NULL);
+
+ gst_play_sink_set_subtitle_encoding (playbin->playsink, encoding);
+ GST_PLAY_BIN_UNLOCK (playbin);
+}
+
+static void
+gst_play_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstPlayBin *playbin = GST_PLAY_BIN (object);
+
+ switch (prop_id) {
+ case PROP_URI:
+ gst_play_bin_set_uri (playbin, g_value_get_string (value));
+ break;
+ case PROP_SUBURI:
+ gst_play_bin_set_suburi (playbin, g_value_get_string (value));
+ break;
+ case PROP_FLAGS:
+ gst_play_bin_set_flags (playbin, g_value_get_flags (value));
+ break;
+ case PROP_CURRENT_VIDEO:
+ gst_play_bin_set_current_video_stream (playbin, g_value_get_int (value));
+ break;
+ case PROP_CURRENT_AUDIO:
+ gst_play_bin_set_current_audio_stream (playbin, g_value_get_int (value));
+ break;
+ case PROP_CURRENT_TEXT:
+ gst_play_bin_set_current_text_stream (playbin, g_value_get_int (value));
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ gst_play_bin_set_encoding (playbin, g_value_get_string (value));
+ break;
+ case PROP_VIDEO_SINK:
+ gst_play_bin_set_sink (playbin, &playbin->video_sink, "video",
+ g_value_get_object (value));
+ break;
+ case PROP_AUDIO_SINK:
+ gst_play_bin_set_sink (playbin, &playbin->audio_sink, "audio",
+ g_value_get_object (value));
+ break;
+ case PROP_VIS_PLUGIN:
+ gst_play_sink_set_vis_plugin (playbin->playsink,
+ g_value_get_object (value));
+ break;
+ case PROP_TEXT_SINK:
+ gst_play_bin_set_sink (playbin, &playbin->text_sink, "text",
+ g_value_get_object (value));
+ break;
+ case PROP_VOLUME:
+ gst_play_sink_set_volume (playbin->playsink, g_value_get_double (value));
+ break;
+ case PROP_MUTE:
+ gst_play_sink_set_mute (playbin->playsink, g_value_get_boolean (value));
+ break;
+ case PROP_FONT_DESC:
+ gst_play_sink_set_font_desc (playbin->playsink,
+ g_value_get_string (value));
+ break;
+ case PROP_CONNECTION_SPEED:
+ GST_PLAY_BIN_LOCK (playbin);
+ playbin->connection_speed = g_value_get_uint (value) * 1000;
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_BUFFER_SIZE:
+ playbin->buffer_size = g_value_get_int (value);
+ break;
+ case PROP_BUFFER_DURATION:
+ playbin->buffer_duration = g_value_get_int64 (value);
+ break;
+ case PROP_AV_OFFSET:
+ gst_play_sink_set_av_offset (playbin->playsink,
+ g_value_get_int64 (value));
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ playbin->ring_buffer_max_size = g_value_get_uint64 (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstElement *
+gst_play_bin_get_current_sink (GstPlayBin * playbin, GstElement ** elem,
+ const gchar * dbg, GstPlaySinkType type)
+{
+ GstElement *sink = gst_play_sink_get_sink (playbin->playsink, type);
+
+ GST_LOG_OBJECT (playbin, "play_sink_get_sink() returned %s sink %"
+ GST_PTR_FORMAT ", the originally set %s sink is %" GST_PTR_FORMAT,
+ dbg, sink, dbg, *elem);
+
+ if (sink == NULL) {
+ GST_PLAY_BIN_LOCK (playbin);
+ if ((sink = *elem))
+ gst_object_ref (sink);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ }
+
+ return sink;
+}
+
+static void
+gst_play_bin_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstPlayBin *playbin = GST_PLAY_BIN (object);
+
+ switch (prop_id) {
+ case PROP_URI:
+ {
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ g_value_set_string (value, group->uri);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ }
+ case PROP_SUBURI:
+ {
+ GstSourceGroup *group;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ g_value_set_string (value, group->suburi);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ }
+ case PROP_SOURCE:
+ {
+ GST_OBJECT_LOCK (playbin);
+ g_value_set_object (value, playbin->source);
+ GST_OBJECT_UNLOCK (playbin);
+ break;
+ }
+ case PROP_FLAGS:
+ g_value_set_flags (value, gst_play_bin_get_flags (playbin));
+ break;
+ case PROP_N_VIDEO:
+ {
+ GstSourceGroup *group;
+ gint n_video;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ n_video = (group->video_channels ? group->video_channels->len : 0);
+ g_value_set_int (value, n_video);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ }
+ case PROP_CURRENT_VIDEO:
+ GST_PLAY_BIN_LOCK (playbin);
+ g_value_set_int (value, playbin->current_video);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_N_AUDIO:
+ {
+ GstSourceGroup *group;
+ gint n_audio;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ n_audio = (group->audio_channels ? group->audio_channels->len : 0);
+ g_value_set_int (value, n_audio);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ }
+ case PROP_CURRENT_AUDIO:
+ GST_PLAY_BIN_LOCK (playbin);
+ g_value_set_int (value, playbin->current_audio);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_N_TEXT:
+ {
+ GstSourceGroup *group;
+ gint n_text;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+ n_text = (group->text_channels ? group->text_channels->len : 0);
+ g_value_set_int (value, n_text);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ }
+ case PROP_CURRENT_TEXT:
+ GST_PLAY_BIN_LOCK (playbin);
+ g_value_set_int (value, playbin->current_text);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ GST_PLAY_BIN_LOCK (playbin);
+ g_value_take_string (value,
+ gst_play_sink_get_subtitle_encoding (playbin->playsink));
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_VIDEO_SINK:
+ g_value_take_object (value,
+ gst_play_bin_get_current_sink (playbin, &playbin->video_sink,
+ "video", GST_PLAY_SINK_TYPE_VIDEO));
+ break;
+ case PROP_AUDIO_SINK:
+ g_value_take_object (value,
+ gst_play_bin_get_current_sink (playbin, &playbin->audio_sink,
+ "audio", GST_PLAY_SINK_TYPE_AUDIO));
+ break;
+ case PROP_VIS_PLUGIN:
+ g_value_take_object (value,
+ gst_play_sink_get_vis_plugin (playbin->playsink));
+ break;
+ case PROP_TEXT_SINK:
+ g_value_take_object (value,
+ gst_play_bin_get_current_sink (playbin, &playbin->text_sink,
+ "text", GST_PLAY_SINK_TYPE_TEXT));
+ break;
+ case PROP_VOLUME:
+ g_value_set_double (value, gst_play_sink_get_volume (playbin->playsink));
+ break;
+ case PROP_MUTE:
+ g_value_set_boolean (value, gst_play_sink_get_mute (playbin->playsink));
+ break;
+ case PROP_FRAME:
+ gst_value_take_buffer (value,
+ gst_play_sink_get_last_frame (playbin->playsink));
+ break;
+ case PROP_FONT_DESC:
+ g_value_take_string (value,
+ gst_play_sink_get_font_desc (playbin->playsink));
+ break;
+ case PROP_CONNECTION_SPEED:
+ GST_PLAY_BIN_LOCK (playbin);
+ g_value_set_uint (value, playbin->connection_speed / 1000);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ break;
+ case PROP_BUFFER_SIZE:
+ GST_OBJECT_LOCK (playbin);
+ g_value_set_int (value, playbin->buffer_size);
+ GST_OBJECT_UNLOCK (playbin);
+ break;
+ case PROP_BUFFER_DURATION:
+ GST_OBJECT_LOCK (playbin);
+ g_value_set_int64 (value, playbin->buffer_duration);
+ GST_OBJECT_UNLOCK (playbin);
+ break;
+ case PROP_AV_OFFSET:
+ g_value_set_int64 (value,
+ gst_play_sink_get_av_offset (playbin->playsink));
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ g_value_set_uint64 (value, playbin->ring_buffer_max_size);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_play_bin_update_cached_duration_from_query (GstPlayBin * playbin,
+ gboolean valid, GstQuery * query)
+{
+ GstFormat fmt;
+ gint64 duration;
+ gint i;
+
+ GST_DEBUG_OBJECT (playbin, "Updating cached duration from query");
+ gst_query_parse_duration (query, &fmt, &duration);
+
+ for (i = 0; i < G_N_ELEMENTS (playbin->duration); i++) {
+ if (playbin->duration[i].format == 0 || fmt == playbin->duration[i].format) {
+ playbin->duration[i].valid = valid;
+ playbin->duration[i].format = fmt;
+ playbin->duration[i].duration = valid ? duration : -1;
+ break;
+ }
+ }
+}
+
+static void
+gst_play_bin_update_cached_duration (GstPlayBin * playbin)
+{
+ const GstFormat formats[] =
+ { GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_DEFAULT };
+ gboolean ret;
+ GstQuery *query;
+ gint i;
+
+ GST_DEBUG_OBJECT (playbin, "Updating cached durations before group switch");
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ query = gst_query_new_duration (formats[i]);
+ ret =
+ GST_ELEMENT_CLASS (parent_class)->query (GST_ELEMENT_CAST (playbin),
+ query);
+ gst_play_bin_update_cached_duration_from_query (playbin, ret, query);
+ gst_query_unref (query);
+ }
+}
+
+static gboolean
+gst_play_bin_query (GstElement * element, GstQuery * query)
+{
+ GstPlayBin *playbin = GST_PLAY_BIN (element);
+ gboolean ret;
+
+ /* During a group switch we shouldn't allow duration queries
+ * because it's not clear if the old or new group's duration
+ * is returned and if the sinks are already playing new data
+ * or old data. See bug #585969
+ *
+ * While we're at it, also don't do any other queries during
+ * a group switch or any other event that causes topology changes
+ * by taking the playbin lock in any case.
+ */
+ GST_PLAY_BIN_LOCK (playbin);
+
+ if (GST_QUERY_TYPE (query) == GST_QUERY_DURATION) {
+ GstSourceGroup *group = playbin->curr_group;
+ gboolean pending;
+
+ GST_SOURCE_GROUP_LOCK (group);
+ if (group->stream_changed_pending_lock) {
+ g_mutex_lock (group->stream_changed_pending_lock);
+ pending = group->pending || group->stream_changed_pending;
+ g_mutex_unlock (group->stream_changed_pending_lock);
+ } else {
+ pending = group->pending;
+ }
+ if (pending) {
+ GstFormat fmt;
+ gint i;
+
+ ret = FALSE;
+ gst_query_parse_duration (query, &fmt, NULL);
+ for (i = 0; i < G_N_ELEMENTS (playbin->duration); i++) {
+ if (fmt == playbin->duration[i].format) {
+ ret = playbin->duration[i].valid;
+ gst_query_set_duration (query, fmt,
+ (ret ? playbin->duration[i].duration : -1));
+ break;
+ }
+ }
+ /* if nothing cached yet, we might as well request duration,
+ * such as during initial startup */
+ if (ret) {
+ GST_DEBUG_OBJECT (playbin,
+ "Taking cached duration because of pending group switch: %d", ret);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ GST_PLAY_BIN_UNLOCK (playbin);
+ return ret;
+ }
+ }
+ GST_SOURCE_GROUP_UNLOCK (group);
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->query (element, query);
+
+ if (GST_QUERY_TYPE (query) == GST_QUERY_DURATION)
+ gst_play_bin_update_cached_duration_from_query (playbin, ret, query);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return ret;
+}
+
+/* mime types we are not handling on purpose right now, don't post a
+ * missing-plugin message for these */
+static const gchar *blacklisted_mimes[] = {
+ NULL
+};
+
+static void
+gst_play_bin_handle_message (GstBin * bin, GstMessage * msg)
+{
+ GstPlayBin *playbin = GST_PLAY_BIN (bin);
+ GstSourceGroup *group;
+
+ if (gst_is_missing_plugin_message (msg)) {
+ gchar *detail;
+ guint i;
+
+ detail = gst_missing_plugin_message_get_installer_detail (msg);
+ for (i = 0; detail != NULL && blacklisted_mimes[i] != NULL; ++i) {
+ if (strstr (detail, "|decoder-") && strstr (detail, blacklisted_mimes[i])) {
+ GST_LOG_OBJECT (bin, "suppressing message %" GST_PTR_FORMAT, msg);
+ gst_message_unref (msg);
+ g_free (detail);
+ return;
+ }
+ }
+ g_free (detail);
+ } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ELEMENT) {
+ const GstStructure *s = gst_message_get_structure (msg);
+
+ /* Drop all stream-changed messages except the last one */
+ if (strcmp ("playbin-stream-changed", gst_structure_get_name (s)) == 0) {
+ guint32 seqnum = gst_message_get_seqnum (msg);
+ GList *l, *l_prev;
+
+ group = playbin->curr_group;
+ g_mutex_lock (group->stream_changed_pending_lock);
+ for (l = group->stream_changed_pending; l;) {
+ guint32 l_seqnum = GPOINTER_TO_UINT (l->data);
+
+ if (l_seqnum == seqnum) {
+ l_prev = l;
+ l = l->next;
+ group->stream_changed_pending =
+ g_list_delete_link (group->stream_changed_pending, l_prev);
+ if (group->stream_changed_pending) {
+ gst_message_unref (msg);
+ msg = NULL;
+ break;
+ }
+ } else {
+ l = l->next;
+ }
+ }
+ g_mutex_unlock (group->stream_changed_pending_lock);
+ }
+ } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ASYNC_START ||
+ GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ASYNC_DONE) {
+ GstObject *src = GST_OBJECT_CAST (msg->src);
+
+ /* Ignore async state changes from the uridecodebin children,
+ * see bug #602000. */
+ group = playbin->curr_group;
+ if (src && (group = playbin->curr_group) &&
+ ((group->uridecodebin && src == GST_OBJECT_CAST (group->uridecodebin))
+ || (group->suburidecodebin
+ && src == GST_OBJECT_CAST (group->suburidecodebin)))) {
+ GST_DEBUG_OBJECT (playbin,
+ "Ignoring async state change of uridecodebin: %s",
+ GST_OBJECT_NAME (src));
+ gst_message_unref (msg);
+ msg = NULL;
+ }
+ } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
+ /* If we get an error of the subtitle uridecodebin transform
+ * them into warnings and disable the subtitles */
+ group = playbin->curr_group;
+ if (group && group->suburidecodebin) {
+ if (G_UNLIKELY (gst_object_has_ancestor (msg->src, GST_OBJECT_CAST
+ (group->suburidecodebin)))) {
+ GError *err;
+ gchar *debug = NULL;
+ GstMessage *new_msg;
+ GstIterator *it;
+ gboolean done = FALSE;
+ GValue item = { 0, };
+
+ gst_message_parse_error (msg, &err, &debug);
+ new_msg = gst_message_new_warning (msg->src, err, debug);
+
+ gst_message_unref (msg);
+ g_error_free (err);
+ g_free (debug);
+ msg = new_msg;
+
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_added_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_removed_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_no_more_pads_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_autoplug_continue_id);
+
+ it = gst_element_iterate_src_pads (group->suburidecodebin);
+ while (it && !done) {
+ GstPad *p = NULL;
+ GstIteratorResult res;
+
+ res = gst_iterator_next (it, &item);
+
+ switch (res) {
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_OK:
+ p = g_value_get_object (&item);
+ pad_removed_cb (NULL, p, group);
+ g_value_reset (&item);
+ break;
+
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_ERROR:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ if (it)
+ gst_iterator_free (it);
+
+ gst_object_ref (group->suburidecodebin);
+ gst_bin_remove (bin, group->suburidecodebin);
+ gst_element_set_locked_state (group->suburidecodebin, FALSE);
+
+ if (group->sub_pending) {
+ group->sub_pending = FALSE;
+ no_more_pads_cb (NULL, group);
+ }
+ }
+ }
+ }
+
+ if (msg)
+ GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
+}
+
+static void
+selector_active_pad_changed (GObject * selector, GParamSpec * pspec,
+ GstPlayBin * playbin)
+{
+ const gchar *property;
+ GstSourceGroup *group;
+ GstSourceSelect *select = NULL;
+ int i;
+
+ GST_PLAY_BIN_LOCK (playbin);
+ group = get_group (playbin);
+
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ if (selector == G_OBJECT (group->selector[i].selector)) {
+ select = &group->selector[i];
+ }
+ }
+
+ /* We got a pad-change after our group got switched out; no need to notify */
+ if (!select) {
+ GST_PLAY_BIN_UNLOCK (playbin);
+ return;
+ }
+
+ switch (select->type) {
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ property = "current-video";
+ playbin->current_video = get_current_stream_number (playbin,
+ group->video_channels);
+ break;
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ property = "current-audio";
+ playbin->current_audio = get_current_stream_number (playbin,
+ group->audio_channels);
+ break;
+ case GST_PLAY_SINK_TYPE_TEXT:
+ property = "current-text";
+ playbin->current_text = get_current_stream_number (playbin,
+ group->text_channels);
+ break;
+ default:
+ property = NULL;
+ }
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ if (property)
+ g_object_notify (G_OBJECT (playbin), property);
+}
+
+/* this callback sends a delayed event once the pad becomes unblocked */
+static GstProbeReturn
+stream_changed_data_probe (GstPad * pad, GstProbeType type,
+ GstMiniObject * object, gpointer data)
+{
+ GstSourceSelect *select = (GstSourceSelect *) data;
+ GstEvent *e;
+
+ /* we need do this just once, so cleanup first */
+ gst_pad_remove_probe (pad, select->sinkpad_data_probe);
+ select->sinkpad_data_probe = 0;
+ e = select->sinkpad_delayed_event;
+ select->sinkpad_delayed_event = NULL;
+
+ /* really, this should not happen */
+ if (!e) {
+ GST_WARNING ("Data probed called, but no delayed event");
+ return GST_PROBE_OK;
+ }
+
+ if (GST_IS_EVENT (object)
+ && GST_EVENT_TYPE (GST_EVENT_CAST (object)) == GST_EVENT_SEGMENT) {
+ /* push the event first, then send the delayed one */
+ gst_event_ref (GST_EVENT_CAST (object));
+ gst_pad_send_event (pad, GST_EVENT_CAST (object));
+ gst_pad_send_event (pad, e);
+ return GST_PROBE_DROP;
+ } else {
+ /* send delayed event, then allow the caller to go on */
+ gst_pad_send_event (pad, e);
+ return GST_PROBE_OK;
+ }
+}
+
+/* helper function to lookup stuff in lists */
+static gboolean
+array_has_value (const gchar * values[], const gchar * value)
+{
+ gint i;
+
+ for (i = 0; values[i]; i++) {
+ if (values[i] && g_str_has_prefix (value, values[i]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+typedef struct
+{
+ GstPlayBin *playbin;
+ gint stream_id;
+ GstPlaySinkType type;
+} NotifyTagsData;
+
+static void
+notify_tags_cb (GObject * object, GParamSpec * pspec, gpointer user_data)
+{
+ NotifyTagsData *ntdata = (NotifyTagsData *) user_data;
+ gint signal;
+
+ GST_DEBUG_OBJECT (ntdata->playbin, "Tags on pad %" GST_PTR_FORMAT
+ " with stream id %d and type %d have changed",
+ object, ntdata->stream_id, ntdata->type);
+
+ switch (ntdata->type) {
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ signal = SIGNAL_VIDEO_TAGS_CHANGED;
+ break;
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ signal = SIGNAL_AUDIO_TAGS_CHANGED;
+ break;
+ case GST_PLAY_SINK_TYPE_TEXT:
+ signal = SIGNAL_TEXT_TAGS_CHANGED;
+ break;
+ default:
+ signal = -1;
+ break;
+ }
+
+ if (signal >= 0)
+ g_signal_emit (G_OBJECT (ntdata->playbin), gst_play_bin_signals[signal], 0,
+ ntdata->stream_id);
+}
+
+/* this function is called when a new pad is added to decodebin. We check the
+ * type of the pad and add it to the selector element of the group.
+ */
+static void
+pad_added_cb (GstElement * decodebin, GstPad * pad, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GstCaps *caps;
+ const GstStructure *s;
+ const gchar *name;
+ GstPad *sinkpad;
+ GstPadLinkReturn res;
+ GstSourceSelect *select = NULL;
+ gint i;
+ gboolean changed = FALSE;
+
+ playbin = group->playbin;
+
+ caps = gst_pad_get_caps (pad, NULL);
+ s = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (s);
+
+ GST_DEBUG_OBJECT (playbin,
+ "pad %s:%s with caps %" GST_PTR_FORMAT " added in group %p",
+ GST_DEBUG_PAD_NAME (pad), caps, group);
+
+ /* major type of the pad, this determines the selector to use */
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ if (array_has_value (group->selector[i].media_list, name)) {
+ select = &group->selector[i];
+ break;
+ } else if (group->selector[i].get_media_caps) {
+ GstCaps *media_caps = group->selector[i].get_media_caps ();
+
+ if (media_caps && gst_caps_can_intersect (media_caps, caps)) {
+ select = &group->selector[i];
+ gst_caps_unref (media_caps);
+ break;
+ }
+ gst_caps_unref (media_caps);
+ }
+ }
+ /* no selector found for the media type, don't bother linking it to a
+ * selector. This will leave the pad unlinked and thus ignored. */
+ if (select == NULL)
+ goto unknown_type;
+
+ GST_SOURCE_GROUP_LOCK (group);
+ if (select->selector == NULL && playbin->have_selector) {
+ /* no selector, create one */
+ GST_DEBUG_OBJECT (playbin, "creating new input selector");
+ select->selector = gst_element_factory_make ("input-selector", NULL);
+ if (select->selector == NULL) {
+ /* post the missing selector message only once */
+ playbin->have_selector = FALSE;
+ gst_element_post_message (GST_ELEMENT_CAST (playbin),
+ gst_missing_element_message_new (GST_ELEMENT_CAST (playbin),
+ "input-selector"));
+ GST_ELEMENT_WARNING (playbin, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "input-selector"), (NULL));
+ } else {
+ g_object_set (select->selector, "sync-streams", TRUE, NULL);
+
+ g_signal_connect (select->selector, "notify::active-pad",
+ G_CALLBACK (selector_active_pad_changed), playbin);
+
+ GST_DEBUG_OBJECT (playbin, "adding new selector %p", select->selector);
+ gst_bin_add (GST_BIN_CAST (playbin), select->selector);
+ gst_element_set_state (select->selector, GST_STATE_PAUSED);
+ }
+ }
+
+ if (select->srcpad == NULL) {
+ if (select->selector) {
+ /* save source pad of the selector */
+ select->srcpad = gst_element_get_static_pad (select->selector, "src");
+ } else {
+ /* no selector, use the pad as the source pad then */
+ select->srcpad = gst_object_ref (pad);
+ }
+
+ /* block the selector srcpad. It's possible that multiple decodebins start
+ * pushing data into the selectors before we have a chance to collect all
+ * streams and connect the sinks, resulting in not-linked errors. After we
+ * configured the sinks we will unblock them all. */
+ GST_DEBUG_OBJECT (playbin, "blocking %" GST_PTR_FORMAT, select->srcpad);
+ select->block_id =
+ gst_pad_add_probe (select->srcpad, GST_PROBE_TYPE_BLOCK, NULL, NULL,
+ NULL);
+ }
+
+ /* get sinkpad for the new stream */
+ if (select->selector) {
+ if ((sinkpad = gst_element_get_request_pad (select->selector, "sink%d"))) {
+ gulong notify_tags_handler = 0;
+ NotifyTagsData *ntdata;
+
+ GST_DEBUG_OBJECT (playbin, "got pad %s:%s from selector",
+ GST_DEBUG_PAD_NAME (sinkpad));
+
+ /* store the selector for the pad */
+ g_object_set_data (G_OBJECT (sinkpad), "playbin.select", select);
+
+ /* connect to the notify::tags signal for our
+ * own *-tags-changed signals
+ */
+ ntdata = g_new0 (NotifyTagsData, 1);
+ ntdata->playbin = playbin;
+ ntdata->stream_id = select->channels->len;
+ ntdata->type = select->type;
+
+ notify_tags_handler =
+ g_signal_connect_data (G_OBJECT (sinkpad), "notify::tags",
+ G_CALLBACK (notify_tags_cb), ntdata, (GClosureNotify) g_free,
+ (GConnectFlags) 0);
+ g_object_set_data (G_OBJECT (sinkpad), "playbin.notify_tags_handler",
+ (gpointer) (guintptr) notify_tags_handler);
+
+ /* store the pad in the array */
+ GST_DEBUG_OBJECT (playbin, "pad %p added to array", sinkpad);
+ g_ptr_array_add (select->channels, sinkpad);
+
+ res = gst_pad_link (pad, sinkpad);
+ if (GST_PAD_LINK_FAILED (res))
+ goto link_failed;
+
+ /* store selector pad so we can release it */
+ g_object_set_data (G_OBJECT (pad), "playbin.sinkpad", sinkpad);
+
+ changed = TRUE;
+ GST_DEBUG_OBJECT (playbin, "linked pad %s:%s to selector %p",
+ GST_DEBUG_PAD_NAME (pad), select->selector);
+ }
+ } else {
+ /* no selector, don't configure anything, we'll link the new pad directly to
+ * the sink. */
+ changed = FALSE;
+ sinkpad = NULL;
+ }
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ if (changed) {
+ int signal;
+ gboolean always_ok = (decodebin == group->suburidecodebin);
+
+ switch (select->type) {
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ /* we want to return NOT_LINKED for unselected pads but only for pads
+ * from the normal uridecodebin. This makes sure that subtitle streams
+ * are not raced past audio/video from decodebin's multiqueue.
+ * For pads from suburidecodebin OK should always be returned, otherwise
+ * it will most likely stop. */
+ g_object_set (sinkpad, "always-ok", always_ok, NULL);
+ signal = SIGNAL_VIDEO_CHANGED;
+ break;
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ g_object_set (sinkpad, "always-ok", always_ok, NULL);
+ signal = SIGNAL_AUDIO_CHANGED;
+ break;
+ case GST_PLAY_SINK_TYPE_TEXT:
+ g_object_set (sinkpad, "always-ok", always_ok, NULL);
+ signal = SIGNAL_TEXT_CHANGED;
+ break;
+ default:
+ signal = -1;
+ }
+
+ if (signal >= 0)
+ g_signal_emit (G_OBJECT (playbin), gst_play_bin_signals[signal], 0, NULL);
+ }
+
+done:
+ gst_caps_unref (caps);
+ return;
+
+ /* ERRORS */
+unknown_type:
+ {
+ GST_ERROR_OBJECT (playbin, "unknown type %s for pad %s:%s",
+ name, GST_DEBUG_PAD_NAME (pad));
+ goto done;
+ }
+link_failed:
+ {
+ GST_ERROR_OBJECT (playbin,
+ "failed to link pad %s:%s to selector, reason %d",
+ GST_DEBUG_PAD_NAME (pad), res);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ goto done;
+ }
+}
+
+/* called when a pad is removed from the uridecodebin. We unlink the pad from
+ * the selector. This will make the selector select a new pad. */
+static void
+pad_removed_cb (GstElement * decodebin, GstPad * pad, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GstPad *peer;
+ GstElement *selector;
+ GstSourceSelect *select;
+
+ playbin = group->playbin;
+
+ GST_DEBUG_OBJECT (playbin,
+ "pad %s:%s removed from group %p", GST_DEBUG_PAD_NAME (pad), group);
+
+ GST_SOURCE_GROUP_LOCK (group);
+ /* get the selector sinkpad */
+ if (!(peer = g_object_get_data (G_OBJECT (pad), "playbin.sinkpad")))
+ goto not_linked;
+
+ if ((select = g_object_get_data (G_OBJECT (peer), "playbin.select"))) {
+ gulong notify_tags_handler;
+
+ notify_tags_handler =
+ (guintptr) g_object_get_data (G_OBJECT (peer),
+ "playbin.notify_tags_handler");
+ if (notify_tags_handler != 0)
+ g_signal_handler_disconnect (G_OBJECT (peer), notify_tags_handler);
+ g_object_set_data (G_OBJECT (peer), "playbin.notify_tags_handler", NULL);
+
+ /* remove the pad from the array */
+ g_ptr_array_remove (select->channels, peer);
+ GST_DEBUG_OBJECT (playbin, "pad %p removed from array", peer);
+ }
+
+ /* unlink the pad now (can fail, the pad is unlinked before it's removed) */
+ gst_pad_unlink (pad, peer);
+
+ /* get selector, this can be NULL when the element is removing the pads
+ * because it's being disposed. */
+ selector = GST_ELEMENT_CAST (gst_pad_get_parent (peer));
+ if (!selector) {
+ gst_object_unref (peer);
+ goto no_selector;
+ }
+
+ /* release the pad to the selector, this will make the selector choose a new
+ * pad. */
+ gst_element_release_request_pad (selector, peer);
+ gst_object_unref (peer);
+
+ gst_object_unref (selector);
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ return;
+
+ /* ERRORS */
+not_linked:
+ {
+ GST_DEBUG_OBJECT (playbin, "pad not linked");
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return;
+ }
+no_selector:
+ {
+ GST_DEBUG_OBJECT (playbin, "selector not found");
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return;
+ }
+}
+
+/* we get called when all pads are available and we must connect the sinks to
+ * them.
+ * The main purpose of the code is to see if we have video/audio and subtitles
+ * and pick the right pipelines to display them.
+ *
+ * The selectors installed on the group tell us about the presence of
+ * audio/video and subtitle streams. This allows us to see if we need
+ * visualisation, video or/and audio.
+ */
+static void
+no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GstPadLinkReturn res;
+ gint i;
+ gboolean configure;
+
+ playbin = group->playbin;
+
+ GST_DEBUG_OBJECT (playbin, "no more pads in group %p", group);
+
+ GST_PLAY_BIN_SHUTDOWN_LOCK (playbin, shutdown);
+
+ GST_SOURCE_GROUP_LOCK (group);
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ GstSourceSelect *select = &group->selector[i];
+
+ /* check if the specific media type was detected and thus has a selector
+ * created for it. If there is the media type, get a sinkpad from the sink
+ * and link it. We only do this if we have not yet requested the sinkpad
+ * before. */
+ if (select->srcpad && select->sinkpad == NULL) {
+ GST_DEBUG_OBJECT (playbin, "requesting new sink pad %d", select->type);
+ select->sinkpad =
+ gst_play_sink_request_pad (playbin->playsink, select->type);
+
+ res = gst_pad_link (select->srcpad, select->sinkpad);
+ GST_DEBUG_OBJECT (playbin, "linked type %s, result: %d",
+ select->media_list[0], res);
+ if (res != GST_PAD_LINK_OK) {
+ GST_ELEMENT_ERROR (playbin, CORE, PAD,
+ ("Internal playbin error."),
+ ("Failed to link selector to sink. Error %d", res));
+ }
+ }
+ }
+ GST_DEBUG_OBJECT (playbin, "pending %d > %d", group->pending,
+ group->pending - 1);
+
+ if (group->pending > 0)
+ group->pending--;
+
+ if (group->suburidecodebin == decodebin)
+ group->sub_pending = FALSE;
+
+ if (group->pending == 0) {
+ /* we are the last group to complete, we will configure the output and then
+ * signal the other waiters. */
+ GST_LOG_OBJECT (playbin, "last group complete");
+ configure = TRUE;
+ } else {
+ GST_LOG_OBJECT (playbin, "have more pending groups");
+ configure = FALSE;
+ }
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ if (configure) {
+ /* if we have custom sinks, configure them now */
+ GST_SOURCE_GROUP_LOCK (group);
+
+ if (group->audio_sink) {
+ GST_INFO_OBJECT (playbin, "setting custom audio sink %" GST_PTR_FORMAT,
+ group->audio_sink);
+ gst_play_sink_set_sink (playbin->playsink, GST_PLAY_SINK_TYPE_AUDIO,
+ group->audio_sink);
+ }
+
+ if (group->video_sink) {
+ GST_INFO_OBJECT (playbin, "setting custom video sink %" GST_PTR_FORMAT,
+ group->video_sink);
+ gst_play_sink_set_sink (playbin->playsink, GST_PLAY_SINK_TYPE_VIDEO,
+ group->video_sink);
+ }
+
+ if (playbin->text_sink) {
+ GST_INFO_OBJECT (playbin, "setting custom text sink %" GST_PTR_FORMAT,
+ playbin->text_sink);
+ gst_play_sink_set_sink (playbin->playsink, GST_PLAY_SINK_TYPE_TEXT,
+ playbin->text_sink);
+ }
+
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ /* signal the other decodebins that they can continue now. */
+ GST_SOURCE_GROUP_LOCK (group);
+ /* unblock all selectors */
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ GstSourceSelect *select = &group->selector[i];
+
+ /* All streamsynchronizer streams should see stream-changed message,
+ * to arrange for blocking unblocking. */
+ if (select->sinkpad) {
+ GstStructure *s;
+ GstMessage *msg;
+ GstEvent *event;
+ guint32 seqnum;
+
+ s = gst_structure_new ("playbin-stream-changed", "uri", G_TYPE_STRING,
+ group->uri, NULL);
+ if (group->suburi)
+ gst_structure_set (s, "suburi", G_TYPE_STRING, group->suburi, NULL);
+ msg = gst_message_new_element (GST_OBJECT_CAST (playbin), s);
+ seqnum = gst_message_get_seqnum (msg);
+ event = gst_event_new_sink_message (msg);
+ g_mutex_lock (group->stream_changed_pending_lock);
+ group->stream_changed_pending =
+ g_list_prepend (group->stream_changed_pending,
+ GUINT_TO_POINTER (seqnum));
+
+ /* remove any data probe we might have, and replace */
+ if (select->sinkpad_delayed_event)
+ gst_event_unref (select->sinkpad_delayed_event);
+ select->sinkpad_delayed_event = event;
+ if (select->sinkpad_data_probe)
+ gst_pad_remove_probe (select->sinkpad, select->sinkpad_data_probe);
+
+ /* we go to the trouble of setting a probe on the pad to send
+ the playbin-stream-changed event as sending it here might
+ find that the pad is blocked, so we'd block here, and the
+ pad might not be linked yet. Additionally, sending it here
+ apparently would be on the wrong thread */
+ select->sinkpad_data_probe =
+ gst_pad_add_probe (select->sinkpad, GST_PROBE_TYPE_DATA,
+ (GstPadProbeCallback) stream_changed_data_probe, (gpointer) select,
+ NULL);
+
+ g_mutex_unlock (group->stream_changed_pending_lock);
+ gst_message_unref (msg);
+ }
+
+ if (select->srcpad) {
+ GST_DEBUG_OBJECT (playbin, "unblocking %" GST_PTR_FORMAT,
+ select->srcpad);
+ if (select->block_id) {
+ gst_pad_remove_probe (select->srcpad, select->block_id);
+ select->block_id = 0;
+ }
+ }
+ }
+ GST_SOURCE_GROUP_UNLOCK (group);
+ }
+
+ GST_PLAY_BIN_SHUTDOWN_UNLOCK (playbin);
+
+ return;
+
+shutdown:
+ {
+ GST_DEBUG ("ignoring, we are shutting down");
+ /* Request a flushing pad from playsink that we then link to the selector.
+ * Then we unblock the selectors so that they stop with a WRONG_STATE
+ * instead of a NOT_LINKED error.
+ */
+ GST_SOURCE_GROUP_LOCK (group);
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ GstSourceSelect *select = &group->selector[i];
+
+ if (select->srcpad) {
+ if (select->sinkpad == NULL) {
+ GST_DEBUG_OBJECT (playbin, "requesting new flushing sink pad");
+ select->sinkpad =
+ gst_play_sink_request_pad (playbin->playsink,
+ GST_PLAY_SINK_TYPE_FLUSHING);
+ res = gst_pad_link (select->srcpad, select->sinkpad);
+ GST_DEBUG_OBJECT (playbin, "linked flushing, result: %d", res);
+ }
+ GST_DEBUG_OBJECT (playbin, "unblocking %" GST_PTR_FORMAT,
+ select->srcpad);
+ if (select->block_id) {
+ gst_pad_remove_probe (select->srcpad, select->block_id);
+ select->block_id = 0;
+ }
+ }
+ }
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return;
+ }
+}
+
+static void
+drained_cb (GstElement * decodebin, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+
+ playbin = group->playbin;
+
+ GST_DEBUG_OBJECT (playbin, "about to finish in group %p", group);
+
+ /* after this call, we should have a next group to activate or we EOS */
+ g_signal_emit (G_OBJECT (playbin),
+ gst_play_bin_signals[SIGNAL_ABOUT_TO_FINISH], 0, NULL);
+
+ /* now activate the next group. If the app did not set a uri, this will
+ * fail and we can do EOS */
+ setup_next_source (playbin, GST_STATE_PAUSED);
+}
+
+/* Like gst_element_factory_can_sink_any_caps() but doesn't
+ * allow ANY caps on the sinkpad template */
+static gboolean
+_factory_can_sink_caps (GstElementFactory * factory, GstCaps * caps)
+{
+ const GList *templs;
+
+ templs = gst_element_factory_get_static_pad_templates (factory);
+
+ while (templs) {
+ GstStaticPadTemplate *templ = (GstStaticPadTemplate *) templs->data;
+
+ if (templ->direction == GST_PAD_SINK) {
+ GstCaps *templcaps = gst_static_caps_get (&templ->static_caps);
+
+ if (!gst_caps_is_any (templcaps)
+ && gst_caps_can_intersect (templcaps, caps)) {
+ gst_caps_unref (templcaps);
+ return TRUE;
+ }
+ gst_caps_unref (templcaps);
+ }
+ templs = g_list_next (templs);
+ }
+
+ return FALSE;
+}
+
+/* Called when we must provide a list of factories to plug to @pad with @caps.
+ * We first check if we have a sink that can handle the format and if we do, we
+ * return NULL, to expose the pad. If we have no sink (or the sink does not
+ * work), we return the list of elements that can connect. */
+static GValueArray *
+autoplug_factories_cb (GstElement * decodebin, GstPad * pad,
+ GstCaps * caps, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GList *mylist, *tmp;
+ GValueArray *result;
+
+ playbin = group->playbin;
+
+ GST_DEBUG_OBJECT (playbin, "factories group %p for %s:%s, %" GST_PTR_FORMAT,
+ group, GST_DEBUG_PAD_NAME (pad), caps);
+
+ /* filter out the elements based on the caps. */
+ g_mutex_lock (playbin->elements_lock);
+ gst_play_bin_update_elements_list (playbin);
+ mylist =
+ gst_element_factory_list_filter (playbin->elements, caps, GST_PAD_SINK,
+ FALSE);
+ g_mutex_unlock (playbin->elements_lock);
+
+ GST_DEBUG_OBJECT (playbin, "found factories %p", mylist);
+ GST_PLUGIN_FEATURE_LIST_DEBUG (mylist);
+
+ /* 2 additional elements for the already set audio/video sinks */
+ result = g_value_array_new (g_list_length (mylist) + 2);
+
+ /* Check if we already have an audio/video sink and if this is the case
+ * put it as the first element of the array */
+ if (group->audio_sink) {
+ GstElementFactory *factory = gst_element_get_factory (group->audio_sink);
+
+ if (factory && _factory_can_sink_caps (factory, caps)) {
+ GValue val = { 0, };
+
+ g_value_init (&val, G_TYPE_OBJECT);
+ g_value_set_object (&val, factory);
+ result = g_value_array_append (result, &val);
+ g_value_unset (&val);
+ }
+ }
+
+ if (group->video_sink) {
+ GstElementFactory *factory = gst_element_get_factory (group->video_sink);
+
+ if (factory && _factory_can_sink_caps (factory, caps)) {
+ GValue val = { 0, };
+
+ g_value_init (&val, G_TYPE_OBJECT);
+ g_value_set_object (&val, factory);
+ result = g_value_array_append (result, &val);
+ g_value_unset (&val);
+ }
+ }
+
+ for (tmp = mylist; tmp; tmp = tmp->next) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+ GValue val = { 0, };
+
+ if (group->audio_sink && gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_SINK |
+ GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO)) {
+ continue;
+ }
+ if (group->video_sink && gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_SINK | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO
+ | GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)) {
+ continue;
+ }
+
+ g_value_init (&val, G_TYPE_OBJECT);
+ g_value_set_object (&val, factory);
+ g_value_array_append (result, &val);
+ g_value_unset (&val);
+ }
+ gst_plugin_feature_list_free (mylist);
+
+ return result;
+}
+
+/* autoplug-continue decides, if a pad has raw caps that can be exposed
+ * directly or if further decoding is necessary. We use this to expose
+ * supported subtitles directly */
+
+/* FIXME 0.11: Remove the checks for ANY caps, a sink should specify
+ * explicitely the caps it supports and if it claims to support ANY
+ * caps it really should support everything */
+static gboolean
+autoplug_continue_cb (GstElement * element, GstPad * pad, GstCaps * caps,
+ GstSourceGroup * group)
+{
+ gboolean ret = TRUE;
+ GstElement *sink;
+ GstPad *sinkpad = NULL;
+
+ GST_PLAY_BIN_LOCK (group->playbin);
+ GST_SOURCE_GROUP_LOCK (group);
+
+ if ((sink = group->playbin->text_sink))
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ if (sinkpad) {
+ GstCaps *sinkcaps;
+
+ /* Ignore errors here, if a custom sink fails to go
+ * to READY things are wrong and will error out later
+ */
+ if (GST_STATE (sink) < GST_STATE_READY)
+ gst_element_set_state (sink, GST_STATE_READY);
+
+ sinkcaps = gst_pad_get_caps (sinkpad, NULL);
+ if (!gst_caps_is_any (sinkcaps))
+ ret = !gst_pad_accept_caps (sinkpad, caps);
+ gst_caps_unref (sinkcaps);
+ gst_object_unref (sinkpad);
+ } else {
+ GstCaps *subcaps = gst_subtitle_overlay_create_factory_caps ();
+ ret = !gst_caps_is_subset (caps, subcaps);
+ gst_caps_unref (subcaps);
+ }
+ /* If autoplugging can stop don't do additional checks */
+ if (!ret)
+ goto done;
+
+ /* If this is from the subtitle uridecodebin we don't need to
+ * check the audio and video sink */
+ if (group->suburidecodebin
+ && gst_object_has_ancestor (GST_OBJECT_CAST (element),
+ GST_OBJECT_CAST (group->suburidecodebin)))
+ goto done;
+
+ if ((sink = group->audio_sink)) {
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ if (sinkpad) {
+ GstCaps *sinkcaps;
+
+ /* Ignore errors here, if a custom sink fails to go
+ * to READY things are wrong and will error out later
+ */
+ if (GST_STATE (sink) < GST_STATE_READY)
+ gst_element_set_state (sink, GST_STATE_READY);
+
+ sinkcaps = gst_pad_get_caps (sinkpad, NULL);
+ if (!gst_caps_is_any (sinkcaps))
+ ret = !gst_pad_accept_caps (sinkpad, caps);
+ gst_caps_unref (sinkcaps);
+ gst_object_unref (sinkpad);
+ }
+ }
+ if (!ret)
+ goto done;
+
+ if ((sink = group->video_sink)) {
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ if (sinkpad) {
+ GstCaps *sinkcaps;
+
+ /* Ignore errors here, if a custom sink fails to go
+ * to READY things are wrong and will error out later
+ */
+ if (GST_STATE (sink) < GST_STATE_READY)
+ gst_element_set_state (sink, GST_STATE_READY);
+
+ sinkcaps = gst_pad_get_caps (sinkpad, NULL);
+ if (!gst_caps_is_any (sinkcaps))
+ ret = !gst_pad_accept_caps (sinkpad, caps);
+ gst_caps_unref (sinkcaps);
+ gst_object_unref (sinkpad);
+ }
+ }
+
+done:
+ GST_SOURCE_GROUP_UNLOCK (group);
+ GST_PLAY_BIN_UNLOCK (group->playbin);
+
+ GST_DEBUG_OBJECT (group->playbin,
+ "continue autoplugging group %p for %s:%s, %" GST_PTR_FORMAT ": %d",
+ group, GST_DEBUG_PAD_NAME (pad), caps, ret);
+
+ return ret;
+}
+
+static gboolean
+sink_accepts_caps (GstElement * sink, GstCaps * caps)
+{
+ GstPad *sinkpad;
+
+ /* ... activate it ... We do this before adding it to the bin so that we
+ * don't accidentally make it post error messages that will stop
+ * everything. */
+ if (GST_STATE (sink) < GST_STATE_READY &&
+ gst_element_set_state (sink,
+ GST_STATE_READY) == GST_STATE_CHANGE_FAILURE) {
+ return FALSE;
+ }
+
+ if ((sinkpad = gst_element_get_static_pad (sink, "sink"))) {
+ /* Got the sink pad, now let's see if the element actually does accept the
+ * caps that we have */
+ if (!gst_pad_accept_caps (sinkpad, caps)) {
+ gst_object_unref (sinkpad);
+ return FALSE;
+ }
+ gst_object_unref (sinkpad);
+ }
+
+ return TRUE;
+}
+
+/* We are asked to select an element. See if the next element to check
+ * is a sink. If this is the case, we see if the sink works by setting it to
+ * READY. If the sink works, we return SELECT_EXPOSE to make decodebin
+ * expose the raw pad so that we can setup the mixers. */
+static GstAutoplugSelectResult
+autoplug_select_cb (GstElement * decodebin, GstPad * pad,
+ GstCaps * caps, GstElementFactory * factory, GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GstElement *element;
+ const gchar *klass;
+ GstPlaySinkType type;
+ GstElement **sinkp;
+
+ playbin = group->playbin;
+
+ GST_DEBUG_OBJECT (playbin, "select group %p for %s:%s, %" GST_PTR_FORMAT,
+ group, GST_DEBUG_PAD_NAME (pad), caps);
+
+ GST_DEBUG_OBJECT (playbin, "checking factory %s", GST_OBJECT_NAME (factory));
+
+ /* if it's not a sink, we just make decodebin try it */
+ if (!gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_SINK))
+ return GST_AUTOPLUG_SELECT_TRY;
+
+ /* it's a sink, see if an instance of it actually works */
+ GST_DEBUG_OBJECT (playbin, "we found a sink");
+
+ klass = gst_element_factory_get_klass (factory);
+
+ /* figure out the klass */
+ if (strstr (klass, "Audio")) {
+ GST_DEBUG_OBJECT (playbin, "we found an audio sink");
+ type = GST_PLAY_SINK_TYPE_AUDIO;
+ sinkp = &group->audio_sink;
+ } else if (strstr (klass, "Video")) {
+ GST_DEBUG_OBJECT (playbin, "we found a video sink");
+ type = GST_PLAY_SINK_TYPE_VIDEO;
+ sinkp = &group->video_sink;
+ } else {
+ /* unknown klass, skip this element */
+ GST_WARNING_OBJECT (playbin, "unknown sink klass %s found", klass);
+ return GST_AUTOPLUG_SELECT_SKIP;
+ }
+
+ /* if we are asked to do visualisations and it's an audio sink, skip the
+ * element. We can only do visualisations with raw sinks */
+ if (gst_play_sink_get_flags (playbin->playsink) & GST_PLAY_FLAG_VIS) {
+ if (type == GST_PLAY_SINK_TYPE_AUDIO) {
+ GST_DEBUG_OBJECT (playbin, "skip audio sink because of vis");
+ return GST_AUTOPLUG_SELECT_SKIP;
+ }
+ }
+
+ /* now see if we already have a sink element */
+ GST_SOURCE_GROUP_LOCK (group);
+ if (*sinkp) {
+ GstElement *sink = gst_object_ref (*sinkp);
+
+ if (sink_accepts_caps (sink, caps)) {
+ GST_DEBUG_OBJECT (playbin,
+ "Existing sink '%s' accepts caps: %" GST_PTR_FORMAT,
+ GST_ELEMENT_NAME (sink), caps);
+ gst_object_unref (sink);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return GST_AUTOPLUG_SELECT_EXPOSE;
+ } else {
+ GST_DEBUG_OBJECT (playbin,
+ "Existing sink '%s' does not accept caps: %" GST_PTR_FORMAT,
+ GST_ELEMENT_NAME (sink), caps);
+ gst_object_unref (sink);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return GST_AUTOPLUG_SELECT_SKIP;
+ }
+ }
+ GST_DEBUG_OBJECT (playbin, "we have no pending sink, try to create one");
+
+ if ((element = gst_element_factory_create (factory, NULL)) == NULL) {
+ GST_WARNING_OBJECT (playbin, "Could not create an element from %s",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return GST_AUTOPLUG_SELECT_SKIP;
+ }
+
+ /* Check if the selected sink actually supports the
+ * caps and can be set to READY*/
+ if (!sink_accepts_caps (element, caps)) {
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ return GST_AUTOPLUG_SELECT_SKIP;
+ }
+
+ /* remember the sink in the group now, the element is floating, we take
+ * ownership now
+ *
+ * store the sink in the group, we will configure it later when we
+ * reconfigure the sink */
+ GST_DEBUG_OBJECT (playbin, "remember sink");
+ gst_object_ref_sink (element);
+ *sinkp = element;
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ /* tell decodebin to expose the pad because we are going to use this
+ * sink */
+ GST_DEBUG_OBJECT (playbin, "we found a working sink, expose pad");
+
+ return GST_AUTOPLUG_SELECT_EXPOSE;
+}
+
+static void
+notify_source_cb (GstElement * uridecodebin, GParamSpec * pspec,
+ GstSourceGroup * group)
+{
+ GstPlayBin *playbin;
+ GstElement *source;
+
+ playbin = group->playbin;
+
+ g_object_get (group->uridecodebin, "source", &source, NULL);
+
+ GST_OBJECT_LOCK (playbin);
+ if (playbin->source)
+ gst_object_unref (playbin->source);
+ playbin->source = source;
+ GST_OBJECT_UNLOCK (playbin);
+
+ g_object_notify (G_OBJECT (playbin), "source");
+
+ g_signal_emit (playbin, gst_play_bin_signals[SIGNAL_SOURCE_SETUP],
+ 0, playbin->source);
+}
+
+/* must be called with the group lock */
+static gboolean
+group_set_locked_state_unlocked (GstPlayBin * playbin, GstSourceGroup * group,
+ gboolean locked)
+{
+ GST_DEBUG_OBJECT (playbin, "locked_state %d on group %p", locked, group);
+
+ if (group->uridecodebin)
+ gst_element_set_locked_state (group->uridecodebin, locked);
+ if (group->suburidecodebin)
+ gst_element_set_locked_state (group->suburidecodebin, locked);
+
+ return TRUE;
+}
+
+/* must be called with PLAY_BIN_LOCK */
+static gboolean
+activate_group (GstPlayBin * playbin, GstSourceGroup * group, GstState target)
+{
+ GstElement *uridecodebin;
+ GstElement *suburidecodebin = NULL;
+ GstPlayFlags flags;
+
+ g_return_val_if_fail (group->valid, FALSE);
+ g_return_val_if_fail (!group->active, FALSE);
+
+ GST_DEBUG_OBJECT (playbin, "activating group %p", group);
+
+ GST_SOURCE_GROUP_LOCK (group);
+
+ /* First set up the custom sources */
+ if (playbin->audio_sink)
+ group->audio_sink = gst_object_ref (playbin->audio_sink);
+ if (playbin->video_sink)
+ group->video_sink = gst_object_ref (playbin->video_sink);
+
+ g_list_free (group->stream_changed_pending);
+ group->stream_changed_pending = NULL;
+ if (!group->stream_changed_pending_lock)
+ group->stream_changed_pending_lock = g_mutex_new ();
+
+ if (group->uridecodebin) {
+ GST_DEBUG_OBJECT (playbin, "reusing existing uridecodebin");
+ uridecodebin = group->uridecodebin;
+ gst_element_set_state (uridecodebin, GST_STATE_READY);
+ gst_bin_add (GST_BIN_CAST (playbin), gst_object_ref (uridecodebin));
+ } else {
+ GST_DEBUG_OBJECT (playbin, "making new uridecodebin");
+ uridecodebin = gst_element_factory_make ("uridecodebin", NULL);
+ if (!uridecodebin)
+ goto no_decodebin;
+ gst_bin_add (GST_BIN_CAST (playbin), uridecodebin);
+ group->uridecodebin = gst_object_ref (uridecodebin);
+ }
+
+ flags = gst_play_sink_get_flags (playbin->playsink);
+
+ g_object_set (uridecodebin,
+ /* configure connection speed */
+ "connection-speed", playbin->connection_speed / 1000,
+ /* configure uri */
+ "uri", group->uri,
+ /* configure download buffering */
+ "download", ((flags & GST_PLAY_FLAG_DOWNLOAD) != 0),
+ /* configure buffering of demuxed/parsed data */
+ "use-buffering", ((flags & GST_PLAY_FLAG_BUFFERING) != 0),
+ /* configure buffering parameters */
+ "buffer-duration", playbin->buffer_duration,
+ "buffer-size", playbin->buffer_size,
+ "ring-buffer-max-size", playbin->ring_buffer_max_size, NULL);
+
+ /* connect pads and other things */
+ group->pad_added_id = g_signal_connect (uridecodebin, "pad-added",
+ G_CALLBACK (pad_added_cb), group);
+ group->pad_removed_id = g_signal_connect (uridecodebin, "pad-removed",
+ G_CALLBACK (pad_removed_cb), group);
+ group->no_more_pads_id = g_signal_connect (uridecodebin, "no-more-pads",
+ G_CALLBACK (no_more_pads_cb), group);
+ group->notify_source_id = g_signal_connect (uridecodebin, "notify::source",
+ G_CALLBACK (notify_source_cb), group);
+
+ /* we have 1 pending no-more-pads */
+ group->pending = 1;
+
+ /* is called when the uridecodebin is out of data and we can switch to the
+ * next uri */
+ group->drained_id =
+ g_signal_connect (uridecodebin, "drained", G_CALLBACK (drained_cb),
+ group);
+
+ /* will be called when a new media type is found. We return a list of decoders
+ * including sinks for decodebin to try */
+ group->autoplug_factories_id =
+ g_signal_connect (uridecodebin, "autoplug-factories",
+ G_CALLBACK (autoplug_factories_cb), group);
+ group->autoplug_select_id =
+ g_signal_connect (uridecodebin, "autoplug-select",
+ G_CALLBACK (autoplug_select_cb), group);
+ group->autoplug_continue_id =
+ g_signal_connect (uridecodebin, "autoplug-continue",
+ G_CALLBACK (autoplug_continue_cb), group);
+
+ if (group->suburi) {
+ /* subtitles */
+ if (group->suburidecodebin) {
+ GST_DEBUG_OBJECT (playbin, "reusing existing suburidecodebin");
+ suburidecodebin = group->suburidecodebin;
+ gst_element_set_state (suburidecodebin, GST_STATE_READY);
+ gst_bin_add (GST_BIN_CAST (playbin), gst_object_ref (suburidecodebin));
+ } else {
+ GST_DEBUG_OBJECT (playbin, "making new suburidecodebin");
+ suburidecodebin = gst_element_factory_make ("uridecodebin", NULL);
+ if (!suburidecodebin)
+ goto no_decodebin;
+
+ gst_bin_add (GST_BIN_CAST (playbin), suburidecodebin);
+ group->suburidecodebin = gst_object_ref (suburidecodebin);
+ }
+
+ g_object_set (suburidecodebin,
+ /* configure connection speed */
+ "connection-speed", playbin->connection_speed,
+ /* configure uri */
+ "uri", group->suburi, NULL);
+
+ /* connect pads and other things */
+ group->sub_pad_added_id = g_signal_connect (suburidecodebin, "pad-added",
+ G_CALLBACK (pad_added_cb), group);
+ group->sub_pad_removed_id = g_signal_connect (suburidecodebin,
+ "pad-removed", G_CALLBACK (pad_removed_cb), group);
+ group->sub_no_more_pads_id = g_signal_connect (suburidecodebin,
+ "no-more-pads", G_CALLBACK (no_more_pads_cb), group);
+
+ group->sub_autoplug_continue_id =
+ g_signal_connect (suburidecodebin, "autoplug-continue",
+ G_CALLBACK (autoplug_continue_cb), group);
+
+ /* we have 2 pending no-more-pads */
+ group->pending = 2;
+ group->sub_pending = TRUE;
+ } else {
+ group->sub_pending = FALSE;
+ }
+
+ /* release the group lock before setting the state of the decodebins, they
+ * might fire signals in this thread that we need to handle with the
+ * group_lock taken. */
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ if (suburidecodebin) {
+ if (gst_element_set_state (suburidecodebin,
+ target) == GST_STATE_CHANGE_FAILURE) {
+ GST_DEBUG_OBJECT (playbin,
+ "failed state change of subtitle uridecodebin");
+ GST_SOURCE_GROUP_LOCK (group);
+
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_added_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_removed_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_no_more_pads_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_autoplug_continue_id);
+ /* Might already be removed because of an error message */
+ if (GST_OBJECT_PARENT (suburidecodebin) == GST_OBJECT_CAST (playbin))
+ gst_bin_remove (GST_BIN_CAST (playbin), suburidecodebin);
+ if (group->sub_pending) {
+ group->pending--;
+ group->sub_pending = FALSE;
+ }
+ gst_element_set_state (suburidecodebin, GST_STATE_READY);
+ GST_SOURCE_GROUP_UNLOCK (group);
+ }
+ }
+ if (gst_element_set_state (uridecodebin, target) == GST_STATE_CHANGE_FAILURE)
+ goto uridecodebin_failure;
+
+ GST_SOURCE_GROUP_LOCK (group);
+ /* alow state changes of the playbin affect the group elements now */
+ group_set_locked_state_unlocked (playbin, group, FALSE);
+ group->active = TRUE;
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ return TRUE;
+
+ /* ERRORS */
+no_decodebin:
+ {
+ GstMessage *msg;
+
+ /* delete any custom sinks we might have */
+ if (group->audio_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->audio_sink != playbin->audio_sink)
+ gst_element_set_state (group->audio_sink, GST_STATE_NULL);
+ gst_object_unref (group->audio_sink);
+ }
+ group->audio_sink = NULL;
+ if (group->video_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->video_sink != playbin->video_sink)
+ gst_element_set_state (group->video_sink, GST_STATE_NULL);
+ gst_object_unref (group->video_sink);
+ }
+ group->video_sink = NULL;
+
+ GST_SOURCE_GROUP_UNLOCK (group);
+ msg =
+ gst_missing_element_message_new (GST_ELEMENT_CAST (playbin),
+ "uridecodebin");
+ gst_element_post_message (GST_ELEMENT_CAST (playbin), msg);
+
+ GST_ELEMENT_ERROR (playbin, CORE, MISSING_PLUGIN,
+ (_("Could not create \"uridecodebin\" element.")), (NULL));
+ return FALSE;
+ }
+uridecodebin_failure:
+ {
+ /* delete any custom sinks we might have */
+ if (group->audio_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->audio_sink != playbin->audio_sink)
+ gst_element_set_state (group->audio_sink, GST_STATE_NULL);
+ gst_object_unref (group->audio_sink);
+ }
+ group->audio_sink = NULL;
+ if (group->video_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->video_sink != playbin->video_sink)
+ gst_element_set_state (group->video_sink, GST_STATE_NULL);
+ gst_object_unref (group->video_sink);
+ }
+ group->video_sink = NULL;
+
+ GST_DEBUG_OBJECT (playbin, "failed state change of uridecodebin");
+ return FALSE;
+ }
+}
+
+/* unlink a group of uridecodebins from the sink.
+ * must be called with PLAY_BIN_LOCK */
+static gboolean
+deactivate_group (GstPlayBin * playbin, GstSourceGroup * group)
+{
+ gint i;
+
+ g_return_val_if_fail (group->valid, FALSE);
+ g_return_val_if_fail (group->active, FALSE);
+
+ GST_DEBUG_OBJECT (playbin, "unlinking group %p", group);
+
+ GST_SOURCE_GROUP_LOCK (group);
+ group->active = FALSE;
+ for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+ GstSourceSelect *select = &group->selector[i];
+
+ GST_DEBUG_OBJECT (playbin, "unlinking selector %s", select->media_list[0]);
+
+ if (select->srcpad) {
+ if (select->sinkpad) {
+ GST_LOG_OBJECT (playbin, "unlinking from sink");
+ gst_pad_unlink (select->srcpad, select->sinkpad);
+
+ /* release back */
+ GST_LOG_OBJECT (playbin, "release sink pad");
+ gst_play_sink_release_pad (playbin->playsink, select->sinkpad);
+ select->sinkpad = NULL;
+ }
+
+ gst_object_unref (select->srcpad);
+ select->srcpad = NULL;
+ }
+
+ if (select->selector) {
+ gint n;
+
+ /* release and unref requests pad from the selector */
+ for (n = 0; n < select->channels->len; n++) {
+ GstPad *sinkpad = g_ptr_array_index (select->channels, n);
+
+ gst_element_release_request_pad (select->selector, sinkpad);
+ gst_object_unref (sinkpad);
+ }
+ g_ptr_array_set_size (select->channels, 0);
+
+ gst_element_set_state (select->selector, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (playbin), select->selector);
+ select->selector = NULL;
+ }
+ }
+ /* delete any custom sinks we might have */
+ if (group->audio_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->audio_sink != playbin->audio_sink)
+ gst_element_set_state (group->audio_sink, GST_STATE_NULL);
+ gst_object_unref (group->audio_sink);
+ }
+ group->audio_sink = NULL;
+ if (group->video_sink) {
+ /* If this is a automatically created sink set it to NULL */
+ if (group->video_sink != playbin->video_sink)
+ gst_element_set_state (group->video_sink, GST_STATE_NULL);
+ gst_object_unref (group->video_sink);
+ }
+ group->video_sink = NULL;
+
+ if (group->uridecodebin) {
+ REMOVE_SIGNAL (group->uridecodebin, group->pad_added_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->pad_removed_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->no_more_pads_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->notify_source_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->drained_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->autoplug_factories_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->autoplug_select_id);
+ REMOVE_SIGNAL (group->uridecodebin, group->autoplug_continue_id);
+ gst_bin_remove (GST_BIN_CAST (playbin), group->uridecodebin);
+ }
+
+ if (group->suburidecodebin) {
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_added_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_pad_removed_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_no_more_pads_id);
+ REMOVE_SIGNAL (group->suburidecodebin, group->sub_autoplug_continue_id);
+
+ /* Might already be removed because of errors */
+ if (GST_OBJECT_PARENT (group->suburidecodebin) == GST_OBJECT_CAST (playbin))
+ gst_bin_remove (GST_BIN_CAST (playbin), group->suburidecodebin);
+ }
+
+ GST_SOURCE_GROUP_UNLOCK (group);
+
+ return TRUE;
+}
+
+/* setup the next group to play, this assumes the next_group is valid and
+ * configured. It swaps out the current_group and activates the valid
+ * next_group. */
+static gboolean
+setup_next_source (GstPlayBin * playbin, GstState target)
+{
+ GstSourceGroup *new_group, *old_group;
+
+ GST_DEBUG_OBJECT (playbin, "setup sources");
+
+ /* see if there is a next group */
+ GST_PLAY_BIN_LOCK (playbin);
+ new_group = playbin->next_group;
+ if (!new_group || !new_group->valid)
+ goto no_next_group;
+
+ /* first unlink the current source, if any */
+ old_group = playbin->curr_group;
+ if (old_group && old_group->valid && old_group->active) {
+ gst_play_bin_update_cached_duration (playbin);
+ /* unlink our pads with the sink */
+ deactivate_group (playbin, old_group);
+ old_group->valid = FALSE;
+ }
+
+ /* swap old and new */
+ playbin->curr_group = new_group;
+ playbin->next_group = old_group;
+
+ /* activate the new group */
+ if (!activate_group (playbin, new_group, target))
+ goto activate_failed;
+
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return TRUE;
+
+ /* ERRORS */
+no_next_group:
+ {
+ GST_DEBUG_OBJECT (playbin, "no next group");
+ if (target == GST_STATE_READY && new_group && new_group->uri == NULL)
+ GST_ELEMENT_ERROR (playbin, RESOURCE, NOT_FOUND, ("No URI set"), (NULL));
+ GST_PLAY_BIN_UNLOCK (playbin);
+ return FALSE;
+ }
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (playbin, "activate failed");
+ GST_PLAY_BIN_UNLOCK (playbin);
+ return FALSE;
+ }
+}
+
+/* The group that is currently playing is copied again to the
+ * next_group so that it will start playing the next time.
+ */
+static gboolean
+save_current_group (GstPlayBin * playbin)
+{
+ GstSourceGroup *curr_group;
+
+ GST_DEBUG_OBJECT (playbin, "save current group");
+
+ /* see if there is a current group */
+ GST_PLAY_BIN_LOCK (playbin);
+ curr_group = playbin->curr_group;
+ if (curr_group && curr_group->valid) {
+ /* unlink our pads with the sink */
+ deactivate_group (playbin, curr_group);
+ }
+ /* swap old and new */
+ playbin->curr_group = playbin->next_group;
+ playbin->next_group = curr_group;
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return TRUE;
+}
+
+/* clear the locked state from all groups. This function is called before a
+ * state change to NULL is performed on them. */
+static gboolean
+groups_set_locked_state (GstPlayBin * playbin, gboolean locked)
+{
+ GST_DEBUG_OBJECT (playbin, "setting locked state to %d on all groups",
+ locked);
+
+ GST_PLAY_BIN_LOCK (playbin);
+ GST_SOURCE_GROUP_LOCK (playbin->curr_group);
+ group_set_locked_state_unlocked (playbin, playbin->curr_group, locked);
+ GST_SOURCE_GROUP_UNLOCK (playbin->curr_group);
+ GST_SOURCE_GROUP_LOCK (playbin->next_group);
+ group_set_locked_state_unlocked (playbin, playbin->next_group, locked);
+ GST_SOURCE_GROUP_UNLOCK (playbin->next_group);
+ GST_PLAY_BIN_UNLOCK (playbin);
+
+ return TRUE;
+}
+
+static GstStateChangeReturn
+gst_play_bin_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstPlayBin *playbin;
+ gboolean do_save = FALSE;
+
+ playbin = GST_PLAY_BIN (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ memset (&playbin->duration, 0, sizeof (playbin->duration));
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_LOG_OBJECT (playbin, "clearing shutdown flag");
+ memset (&playbin->duration, 0, sizeof (playbin->duration));
+ g_atomic_int_set (&playbin->shutdown, 0);
+
+ if (!setup_next_source (playbin, GST_STATE_READY)) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto failure;
+ }
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ async_down:
+ /* FIXME unlock our waiting groups */
+ GST_LOG_OBJECT (playbin, "setting shutdown flag");
+ g_atomic_int_set (&playbin->shutdown, 1);
+ memset (&playbin->duration, 0, sizeof (playbin->duration));
+
+ /* wait for all callbacks to end by taking the lock.
+ * No dynamic (critical) new callbacks will
+ * be able to happen as we set the shutdown flag. */
+ GST_PLAY_BIN_DYN_LOCK (playbin);
+ GST_LOG_OBJECT (playbin, "dynamic lock taken, we can continue shutdown");
+ GST_PLAY_BIN_DYN_UNLOCK (playbin);
+ if (!do_save)
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ /* we go async to PAUSED, so if that fails, we never make it to PAUSED
+ * an no state change PAUSED to READY passes here,
+ * though it is a nice-to-have ... */
+ if (!g_atomic_int_get (&playbin->shutdown)) {
+ do_save = TRUE;
+ goto async_down;
+ }
+ memset (&playbin->duration, 0, sizeof (playbin->duration));
+
+ /* unlock so that all groups go to NULL */
+ groups_set_locked_state (playbin, FALSE);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto failure;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ /* FIXME Release audio device when we implement that */
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ save_current_group (playbin);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ {
+ guint i;
+
+ /* also do missed state change down to READY */
+ if (do_save)
+ save_current_group (playbin);
+ /* Deactive the groups, set the uridecodebins to NULL
+ * and unref them.
+ */
+ for (i = 0; i < 2; i++) {
+ if (playbin->groups[i].active && playbin->groups[i].valid) {
+ deactivate_group (playbin, &playbin->groups[i]);
+ playbin->groups[i].valid = FALSE;
+ }
+
+ if (playbin->groups[i].uridecodebin) {
+ gst_element_set_state (playbin->groups[i].uridecodebin,
+ GST_STATE_NULL);
+ gst_object_unref (playbin->groups[i].uridecodebin);
+ playbin->groups[i].uridecodebin = NULL;
+ }
+
+ if (playbin->groups[i].suburidecodebin) {
+ gst_element_set_state (playbin->groups[i].suburidecodebin,
+ GST_STATE_NULL);
+ gst_object_unref (playbin->groups[i].suburidecodebin);
+ playbin->groups[i].suburidecodebin = NULL;
+ }
+ }
+
+ /* Set our sinks back to NULL, they might not be child of playbin */
+ if (playbin->audio_sink)
+ gst_element_set_state (playbin->audio_sink, GST_STATE_NULL);
+ if (playbin->video_sink)
+ gst_element_set_state (playbin->video_sink, GST_STATE_NULL);
+ if (playbin->text_sink)
+ gst_element_set_state (playbin->text_sink, GST_STATE_NULL);
+
+ /* make sure the groups don't perform a state change anymore until we
+ * enable them again */
+ groups_set_locked_state (playbin, TRUE);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERRORS */
+failure:
+ {
+ if (transition == GST_STATE_CHANGE_READY_TO_PAUSED) {
+ GstSourceGroup *curr_group;
+
+ curr_group = playbin->curr_group;
+ if (curr_group && curr_group->active && curr_group->valid) {
+ /* unlink our pads with the sink */
+ deactivate_group (playbin, curr_group);
+ curr_group->valid = FALSE;
+ }
+
+ /* Swap current and next group back */
+ playbin->curr_group = playbin->next_group;
+ playbin->next_group = curr_group;
+ }
+ return ret;
+ }
+}
+
+gboolean
+gst_play_bin2_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_play_bin_debug, "playbin", 0, "play bin");
+
+ return gst_element_register (plugin, "playbin", GST_RANK_NONE,
+ GST_TYPE_PLAY_BIN);
+}
diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
new file mode 100644
index 0000000..76e6e3a
--- /dev/null
+++ b/gst/playback/gstplaysink.c
@@ -0,0 +1,3665 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/gst.h>
+
+#include <gst/gst-i18n-plugin.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/video/video.h>
+
+#include "gstplaysink.h"
+#include "gststreamsynchronizer.h"
+#include "gstplaysinkvideoconvert.h"
+#include "gstplaysinkaudioconvert.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_play_sink_debug);
+#define GST_CAT_DEFAULT gst_play_sink_debug
+
+#define VOLUME_MAX_DOUBLE 10.0
+
+#define DEFAULT_FLAGS GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_TEXT | \
+ GST_PLAY_FLAG_SOFT_VOLUME
+
+#define GST_PLAY_CHAIN(c) ((GstPlayChain *)(c))
+
+/* holds the common data fields for the audio and video pipelines. We keep them
+ * in a structure to more easily have all the info available. */
+typedef struct
+{
+ GstPlaySink *playsink;
+ GstElement *bin;
+ gboolean added;
+ gboolean activated;
+ gboolean raw;
+} GstPlayChain;
+
+typedef struct
+{
+ GstPlayChain chain;
+ GstPad *sinkpad;
+ GstElement *queue;
+ GstElement *conv;
+ GstElement *volume; /* element with the volume property */
+ gboolean sink_volume; /* if the volume was provided by the sink */
+ GstElement *mute; /* element with the mute property */
+ GstElement *sink;
+ GstElement *ts_offset;
+} GstPlayAudioChain;
+
+typedef struct
+{
+ GstPlayChain chain;
+ GstPad *sinkpad, *srcpad;
+ GstElement *conv;
+ GstElement *deinterlace;
+} GstPlayVideoDeinterlaceChain;
+
+typedef struct
+{
+ GstPlayChain chain;
+ GstPad *sinkpad;
+ GstElement *queue;
+ GstElement *conv;
+ GstElement *sink;
+ gboolean async;
+ GstElement *ts_offset;
+} GstPlayVideoChain;
+
+typedef struct
+{
+ GstPlayChain chain;
+ GstPad *sinkpad;
+ GstElement *queue;
+ GstElement *conv;
+ GstElement *resample;
+ GstPad *blockpad; /* srcpad of resample, used for switching the vis */
+ GstPad *vissinkpad; /* visualisation sinkpad, */
+ GstElement *vis;
+ GstPad *vissrcpad; /* visualisation srcpad, */
+ GstPad *srcpad; /* outgoing srcpad, used to connect to the next
+ * chain */
+} GstPlayVisChain;
+
+typedef struct
+{
+ GstPlayChain chain;
+ GstPad *sinkpad;
+ GstElement *queue;
+ GstElement *identity;
+ GstElement *overlay;
+ GstPad *videosinkpad;
+ GstPad *textsinkpad;
+ GstPad *srcpad; /* outgoing srcpad, used to connect to the next
+ * chain */
+ GstElement *sink; /* custom sink to receive subtitle buffers */
+} GstPlayTextChain;
+
+#define GST_PLAY_SINK_GET_LOCK(playsink) (&((GstPlaySink *)playsink)->lock)
+#define GST_PLAY_SINK_LOCK(playsink) G_STMT_START { \
+ GST_LOG_OBJECT (playsink, "locking from thread %p", g_thread_self ()); \
+ g_static_rec_mutex_lock (GST_PLAY_SINK_GET_LOCK (playsink)); \
+ GST_LOG_OBJECT (playsink, "locked from thread %p", g_thread_self ()); \
+} G_STMT_END
+#define GST_PLAY_SINK_UNLOCK(playsink) G_STMT_START { \
+ GST_LOG_OBJECT (playsink, "unlocking from thread %p", g_thread_self ()); \
+ g_static_rec_mutex_unlock (GST_PLAY_SINK_GET_LOCK (playsink)); \
+} G_STMT_END
+
+#define PENDING_FLAG_SET(playsink, flagtype) \
+ ((playsink->pending_blocked_pads) |= (1 << flagtype))
+#define PENDING_FLAG_UNSET(playsink, flagtype) \
+ ((playsink->pending_blocked_pads) &= ~(1 << flagtype))
+#define PENDING_FLAG_IS_SET(playsink, flagtype) \
+ ((playsink->pending_blocked_pads) & (1 << flagtype))
+#define PENDING_VIDEO_BLOCK(playsink) \
+ ((playsink->pending_blocked_pads) & (1 << GST_PLAY_SINK_TYPE_VIDEO_RAW | 1 << GST_PLAY_SINK_TYPE_VIDEO))
+#define PENDING_AUDIO_BLOCK(playsink) \
+ ((playsink->pending_blocked_pads) & (1 << GST_PLAY_SINK_TYPE_AUDIO_RAW | 1 << GST_PLAY_SINK_TYPE_AUDIO))
+#define PENDING_TEXT_BLOCK(playsink) \
+ PENDING_FLAG_IS_SET(playsink, GST_PLAY_SINK_TYPE_TEXT)
+
+struct _GstPlaySink
+{
+ GstBin bin;
+
+ GStaticRecMutex lock;
+
+ gboolean async_pending;
+ gboolean need_async_start;
+
+ GstPlayFlags flags;
+
+ GstStreamSynchronizer *stream_synchronizer;
+
+ /* chains */
+ GstPlayAudioChain *audiochain;
+ GstPlayVideoDeinterlaceChain *videodeinterlacechain;
+ GstPlayVideoChain *videochain;
+ GstPlayVisChain *vischain;
+ GstPlayTextChain *textchain;
+
+ /* audio */
+ GstPad *audio_pad;
+ gboolean audio_pad_raw;
+ gboolean audio_pad_blocked;
+ GstPad *audio_srcpad_stream_synchronizer;
+ GstPad *audio_sinkpad_stream_synchronizer;
+ gulong audio_block_id;
+ /* audio tee */
+ GstElement *audio_tee;
+ GstPad *audio_tee_sink;
+ GstPad *audio_tee_asrc;
+ GstPad *audio_tee_vissrc;
+ /* video */
+ GstPad *video_pad;
+ gboolean video_pad_raw;
+ gboolean video_pad_blocked;
+ GstPad *video_srcpad_stream_synchronizer;
+ GstPad *video_sinkpad_stream_synchronizer;
+ gulong video_block_id;
+ /* text */
+ GstPad *text_pad;
+ gboolean text_pad_blocked;
+ GstPad *text_srcpad_stream_synchronizer;
+ GstPad *text_sinkpad_stream_synchronizer;
+ gulong text_block_id;
+
+ guint32 pending_blocked_pads;
+
+ /* properties */
+ GstElement *audio_sink;
+ GstElement *video_sink;
+ GstElement *visualisation;
+ GstElement *text_sink;
+ gdouble volume;
+ gboolean mute;
+ gchar *font_desc; /* font description */
+ gchar *subtitle_encoding; /* subtitle encoding */
+ guint connection_speed; /* connection speed in bits/sec (0 = unknown) */
+ gint count;
+ gboolean volume_changed; /* volume/mute changed while no audiochain */
+ gboolean mute_changed; /* ... has been created yet */
+ gint64 av_offset;
+};
+
+struct _GstPlaySinkClass
+{
+ GstBinClass parent_class;
+
+ gboolean (*reconfigure) (GstPlaySink * playsink);
+
+ GstBuffer *(*convert_frame) (GstPlaySink * playsink, GstCaps * caps);
+};
+
+
+static GstStaticPadTemplate audiotemplate =
+GST_STATIC_PAD_TEMPLATE ("audio_sink",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate videotemplate =
+GST_STATIC_PAD_TEMPLATE ("video_sink",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate texttemplate = GST_STATIC_PAD_TEMPLATE ("text_sink",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+/* FIXME 0.11: Remove */
+static GstStaticPadTemplate audiorawtemplate =
+GST_STATIC_PAD_TEMPLATE ("audio_raw_sink",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate videorawtemplate =
+GST_STATIC_PAD_TEMPLATE ("video_raw_sink",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+
+/* props */
+enum
+{
+ PROP_0,
+ PROP_FLAGS,
+ PROP_MUTE,
+ PROP_VOLUME,
+ PROP_FONT_DESC,
+ PROP_SUBTITLE_ENCODING,
+ PROP_VIS_PLUGIN,
+ PROP_FRAME,
+ PROP_AV_OFFSET,
+ PROP_LAST
+};
+
+/* signals */
+enum
+{
+ LAST_SIGNAL
+};
+
+static void gst_play_sink_dispose (GObject * object);
+static void gst_play_sink_finalize (GObject * object);
+static void gst_play_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * spec);
+static void gst_play_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * spec);
+
+static GstPad *gst_play_sink_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_play_sink_release_request_pad (GstElement * element,
+ GstPad * pad);
+static gboolean gst_play_sink_send_event (GstElement * element,
+ GstEvent * event);
+static GstStateChangeReturn gst_play_sink_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void gst_play_sink_handle_message (GstBin * bin, GstMessage * message);
+
+static void notify_volume_cb (GObject * object, GParamSpec * pspec,
+ GstPlaySink * playsink);
+static void notify_mute_cb (GObject * object, GParamSpec * pspec,
+ GstPlaySink * playsink);
+
+static void update_av_offset (GstPlaySink * playsink);
+
+void
+gst_play_marshal_BUFFER__BOXED (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 GstBuffer *(*GMarshalFunc_OBJECT__BOXED) (gpointer data1,
+ gpointer arg_1, gpointer data2);
+ register GMarshalFunc_OBJECT__BOXED callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+ GstBuffer *v_return;
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 2);
+
+ 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_OBJECT__BOXED) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (data1, g_value_get_boxed (param_values + 1), data2);
+
+ gst_value_take_buffer (return_value, v_return);
+}
+
+/* static guint gst_play_sink_signals[LAST_SIGNAL] = { 0 }; */
+
+G_DEFINE_TYPE (GstPlaySink, gst_play_sink, GST_TYPE_BIN);
+
+static void
+gst_play_sink_class_init (GstPlaySinkClass * klass)
+{
+ GObjectClass *gobject_klass;
+ GstElementClass *gstelement_klass;
+ GstBinClass *gstbin_klass;
+
+ gobject_klass = (GObjectClass *) klass;
+ gstelement_klass = (GstElementClass *) klass;
+ gstbin_klass = (GstBinClass *) klass;
+
+ gobject_klass->dispose = gst_play_sink_dispose;
+ gobject_klass->finalize = gst_play_sink_finalize;
+ gobject_klass->set_property = gst_play_sink_set_property;
+ gobject_klass->get_property = gst_play_sink_get_property;
+
+
+ /**
+ * GstPlaySink:flags
+ *
+ * Control the behaviour of playsink.
+ */
+ g_object_class_install_property (gobject_klass, PROP_FLAGS,
+ g_param_spec_flags ("flags", "Flags", "Flags to control behaviour",
+ GST_TYPE_PLAY_FLAGS, DEFAULT_FLAGS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPlaySink:volume:
+ *
+ * Get or set the current audio stream volume. 1.0 means 100%,
+ * 0.0 means mute. This uses a linear volume scale.
+ *
+ */
+ g_object_class_install_property (gobject_klass, PROP_VOLUME,
+ g_param_spec_double ("volume", "Volume", "The audio volume, 1.0=100%",
+ 0.0, VOLUME_MAX_DOUBLE, 1.0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_MUTE,
+ g_param_spec_boolean ("mute", "Mute",
+ "Mute the audio channel without changing the volume", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_FONT_DESC,
+ g_param_spec_string ("subtitle-font-desc",
+ "Subtitle font description",
+ "Pango font description of font "
+ "to be used for subtitle rendering", NULL,
+ G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_SUBTITLE_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 encoding. "
+ "If not set, the GST_SUBTITLE_ENCODING environment variable will "
+ "be checked for an encoding to use. If that is not set either, "
+ "ISO-8859-15 will be assumed.", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_VIS_PLUGIN,
+ g_param_spec_object ("vis-plugin", "Vis plugin",
+ "the visualization element to use (NULL = default)",
+ GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlaySink:frame:
+ *
+ * Get the currently rendered or prerolled frame in the video sink.
+ * The #GstCaps on the buffer will describe the format of the buffer.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_klass, PROP_FRAME,
+ g_param_spec_boxed ("frame", "Frame",
+ "The last frame (NULL = no video available)",
+ GST_TYPE_BUFFER, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstPlaySink:av-offset:
+ *
+ * Control the synchronisation offset between the audio and video streams.
+ * Positive values make the audio ahead of the video and negative values make
+ * the audio go behind the video.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_klass, PROP_AV_OFFSET,
+ g_param_spec_int64 ("av-offset", "AV Offset",
+ "The synchronisation offset between audio and video in nanoseconds",
+ G_MININT64, G_MAXINT64, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_signal_new ("reconfigure", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstPlaySinkClass,
+ reconfigure), NULL, NULL, gst_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN,
+ 0, G_TYPE_NONE);
+ /**
+ * GstPlaySink::convert-frame
+ * @playsink: a #GstPlaySink
+ * @caps: the target format of the frame
+ *
+ * Action signal to retrieve the currently playing video frame in the format
+ * specified by @caps.
+ * If @caps is %NULL, no conversion will be performed and this function is
+ * equivalent to the #GstPlaySink::frame property.
+ *
+ * Returns: a #GstBuffer of the current video frame converted to #caps.
+ * The caps on the buffer will describe the final layout of the buffer data.
+ * %NULL is returned when no current buffer can be retrieved or when the
+ * conversion failed.
+ *
+ * Since: 0.10.30
+ */
+ g_signal_new ("convert-frame", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstPlaySinkClass, convert_frame), NULL, NULL,
+ gst_play_marshal_BUFFER__BOXED, GST_TYPE_BUFFER, 1, GST_TYPE_CAPS);
+
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&audiorawtemplate));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&audiotemplate));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&videorawtemplate));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&videotemplate));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&texttemplate));
+ gst_element_class_set_details_simple (gstelement_klass, "Player Sink",
+ "Generic/Bin/Sink",
+ "Convenience sink for multiple streams",
+ "Wim Taymans <wim.taymans@gmail.com>");
+
+ gstelement_klass->change_state =
+ GST_DEBUG_FUNCPTR (gst_play_sink_change_state);
+ gstelement_klass->send_event = GST_DEBUG_FUNCPTR (gst_play_sink_send_event);
+ gstelement_klass->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_play_sink_request_new_pad);
+ gstelement_klass->release_pad =
+ GST_DEBUG_FUNCPTR (gst_play_sink_release_request_pad);
+
+ gstbin_klass->handle_message =
+ GST_DEBUG_FUNCPTR (gst_play_sink_handle_message);
+
+ klass->reconfigure = GST_DEBUG_FUNCPTR (gst_play_sink_reconfigure);
+ klass->convert_frame = GST_DEBUG_FUNCPTR (gst_play_sink_convert_frame);
+}
+
+static void
+gst_play_sink_init (GstPlaySink * playsink)
+{
+ /* init groups */
+ playsink->video_sink = NULL;
+ playsink->audio_sink = NULL;
+ playsink->visualisation = NULL;
+ playsink->text_sink = NULL;
+ playsink->volume = 1.0;
+ playsink->font_desc = NULL;
+ playsink->subtitle_encoding = NULL;
+ playsink->flags = DEFAULT_FLAGS;
+
+ playsink->stream_synchronizer =
+ g_object_new (GST_TYPE_STREAM_SYNCHRONIZER, NULL);
+ gst_bin_add (GST_BIN_CAST (playsink),
+ GST_ELEMENT_CAST (playsink->stream_synchronizer));
+
+ g_static_rec_mutex_init (&playsink->lock);
+ GST_OBJECT_FLAG_SET (playsink, GST_ELEMENT_IS_SINK);
+}
+
+static void
+disconnect_chain (GstPlayAudioChain * chain, GstPlaySink * playsink)
+{
+ if (chain) {
+ if (chain->volume)
+ g_signal_handlers_disconnect_by_func (chain->volume, notify_volume_cb,
+ playsink);
+ if (chain->mute)
+ g_signal_handlers_disconnect_by_func (chain->mute, notify_mute_cb,
+ playsink);
+ }
+}
+
+static void
+free_chain (GstPlayChain * chain)
+{
+ if (chain) {
+ if (chain->bin)
+ gst_object_unref (chain->bin);
+ g_free (chain);
+ }
+}
+
+static void
+gst_play_sink_dispose (GObject * object)
+{
+ GstPlaySink *playsink;
+
+ playsink = GST_PLAY_SINK (object);
+
+ if (playsink->audio_sink != NULL) {
+ gst_element_set_state (playsink->audio_sink, GST_STATE_NULL);
+ gst_object_unref (playsink->audio_sink);
+ playsink->audio_sink = NULL;
+ }
+ if (playsink->video_sink != NULL) {
+ gst_element_set_state (playsink->video_sink, GST_STATE_NULL);
+ gst_object_unref (playsink->video_sink);
+ playsink->video_sink = NULL;
+ }
+ if (playsink->visualisation != NULL) {
+ gst_element_set_state (playsink->visualisation, GST_STATE_NULL);
+ gst_object_unref (playsink->visualisation);
+ playsink->visualisation = NULL;
+ }
+ if (playsink->text_sink != NULL) {
+ gst_element_set_state (playsink->text_sink, GST_STATE_NULL);
+ gst_object_unref (playsink->text_sink);
+ playsink->text_sink = NULL;
+ }
+
+ free_chain ((GstPlayChain *) playsink->videodeinterlacechain);
+ playsink->videodeinterlacechain = NULL;
+ free_chain ((GstPlayChain *) playsink->videochain);
+ playsink->videochain = NULL;
+ free_chain ((GstPlayChain *) playsink->audiochain);
+ playsink->audiochain = NULL;
+ free_chain ((GstPlayChain *) playsink->vischain);
+ playsink->vischain = NULL;
+ free_chain ((GstPlayChain *) playsink->textchain);
+ playsink->textchain = NULL;
+
+ if (playsink->audio_tee_sink) {
+ gst_object_unref (playsink->audio_tee_sink);
+ playsink->audio_tee_sink = NULL;
+ }
+
+ if (playsink->audio_tee_vissrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_vissrc);
+ gst_object_unref (playsink->audio_tee_vissrc);
+ playsink->audio_tee_vissrc = NULL;
+ }
+
+ if (playsink->audio_tee_asrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_asrc);
+ gst_object_unref (playsink->audio_tee_asrc);
+ playsink->audio_tee_asrc = NULL;
+ }
+
+ g_free (playsink->font_desc);
+ playsink->font_desc = NULL;
+
+ g_free (playsink->subtitle_encoding);
+ playsink->subtitle_encoding = NULL;
+
+ playsink->stream_synchronizer = NULL;
+
+ G_OBJECT_CLASS (gst_play_sink_parent_class)->dispose (object);
+}
+
+static void
+gst_play_sink_finalize (GObject * object)
+{
+ GstPlaySink *playsink;
+
+ playsink = GST_PLAY_SINK (object);
+
+ g_static_rec_mutex_free (&playsink->lock);
+
+ G_OBJECT_CLASS (gst_play_sink_parent_class)->finalize (object);
+}
+
+void
+gst_play_sink_set_sink (GstPlaySink * playsink, GstPlaySinkType type,
+ GstElement * sink)
+{
+ GstElement **elem = NULL, *old = NULL;
+
+ GST_LOG ("Setting sink %" GST_PTR_FORMAT " as sink type %d", sink, type);
+
+ GST_PLAY_SINK_LOCK (playsink);
+ switch (type) {
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ elem = &playsink->audio_sink;
+ break;
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ elem = &playsink->video_sink;
+ break;
+ case GST_PLAY_SINK_TYPE_TEXT:
+ elem = &playsink->text_sink;
+ break;
+ default:
+ break;
+ }
+ if (elem) {
+ old = *elem;
+ if (sink)
+ gst_object_ref (sink);
+ *elem = sink;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ if (old) {
+ if (old != sink)
+ gst_element_set_state (old, GST_STATE_NULL);
+ gst_object_unref (old);
+ }
+}
+
+GstElement *
+gst_play_sink_get_sink (GstPlaySink * playsink, GstPlaySinkType type)
+{
+ GstElement *result = NULL;
+ GstElement *elem = NULL, *chainp = NULL;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ switch (type) {
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ {
+ GstPlayAudioChain *chain;
+ if ((chain = (GstPlayAudioChain *) playsink->audiochain))
+ chainp = chain->sink;
+ elem = playsink->audio_sink;
+ break;
+ }
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ {
+ GstPlayVideoChain *chain;
+ if ((chain = (GstPlayVideoChain *) playsink->videochain))
+ chainp = chain->sink;
+ elem = playsink->video_sink;
+ break;
+ }
+ case GST_PLAY_SINK_TYPE_TEXT:
+ {
+ GstPlayTextChain *chain;
+ if ((chain = (GstPlayTextChain *) playsink->textchain))
+ chainp = chain->sink;
+ elem = playsink->text_sink;
+ break;
+ }
+ default:
+ break;
+ }
+ if (chainp) {
+ /* we have an active chain with a sink, get the sink */
+ result = gst_object_ref (chainp);
+ }
+ /* nothing found, return last configured sink */
+ if (result == NULL && elem)
+ result = gst_object_ref (elem);
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+static GstProbeReturn
+gst_play_sink_vis_blocked (GstPad * tee_pad, GstProbeType type,
+ gpointer type_data, gpointer user_data)
+{
+ GstPlaySink *playsink;
+ GstPlayVisChain *chain;
+
+ playsink = GST_PLAY_SINK (user_data);
+
+ GST_PLAY_SINK_LOCK (playsink);
+ GST_DEBUG_OBJECT (playsink, "vis pad blocked");
+ /* now try to change the plugin in the running vis chain */
+ if (!(chain = (GstPlayVisChain *) playsink->vischain))
+ goto done;
+
+ /* unlink the old plugin and unghost the pad */
+ gst_pad_unlink (chain->blockpad, chain->vissinkpad);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (chain->srcpad), NULL);
+
+ /* set the old plugin to NULL and remove */
+ gst_element_set_state (chain->vis, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (chain->chain.bin), chain->vis);
+
+ /* add new plugin and set state to playing */
+ chain->vis = playsink->visualisation;
+ gst_bin_add (GST_BIN_CAST (chain->chain.bin), chain->vis);
+ gst_element_set_state (chain->vis, GST_STATE_PLAYING);
+
+ /* get pads */
+ chain->vissinkpad = gst_element_get_static_pad (chain->vis, "sink");
+ chain->vissrcpad = gst_element_get_static_pad (chain->vis, "src");
+
+ /* link pads */
+ gst_pad_link_full (chain->blockpad, chain->vissinkpad,
+ GST_PAD_LINK_CHECK_NOTHING);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (chain->srcpad),
+ chain->vissrcpad);
+
+done:
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ /* remove the probe and unblock the pad */
+ return GST_PROBE_REMOVE;
+}
+
+void
+gst_play_sink_set_vis_plugin (GstPlaySink * playsink, GstElement * vis)
+{
+ GstPlayVisChain *chain;
+
+ /* setting NULL means creating the default vis plugin */
+ if (vis == NULL)
+ vis = gst_element_factory_make ("goom", "vis");
+
+ /* simply return if we don't have a vis plugin here */
+ if (vis == NULL)
+ return;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ /* first store the new vis */
+ if (playsink->visualisation)
+ gst_object_unref (playsink->visualisation);
+ /* take ownership */
+ gst_object_ref_sink (vis);
+ playsink->visualisation = vis;
+
+ /* now try to change the plugin in the running vis chain, if we have no chain,
+ * we don't bother, any future vis chain will be created with the new vis
+ * plugin. */
+ if (!(chain = (GstPlayVisChain *) playsink->vischain))
+ goto done;
+
+ /* block the pad, the next time the callback is called we can change the
+ * visualisation. It's possible that this never happens or that the pad was
+ * already blocked. If the callback never happens, we don't have new data so
+ * we don't need the new vis plugin. If the pad was already blocked, the
+ * function returns FALSE but the previous pad block will do the right thing
+ * anyway. */
+ GST_DEBUG_OBJECT (playsink, "blocking vis pad");
+ gst_pad_add_probe (chain->blockpad, GST_PROBE_TYPE_BLOCK,
+ gst_play_sink_vis_blocked, playsink, NULL);
+done:
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return;
+}
+
+GstElement *
+gst_play_sink_get_vis_plugin (GstPlaySink * playsink)
+{
+ GstElement *result = NULL;
+ GstPlayVisChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ if ((chain = (GstPlayVisChain *) playsink->vischain)) {
+ /* we have an active chain, get the sink */
+ if (chain->vis)
+ result = gst_object_ref (chain->vis);
+ }
+ /* nothing found, return last configured sink */
+ if (result == NULL && playsink->visualisation)
+ result = gst_object_ref (playsink->visualisation);
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+void
+gst_play_sink_set_volume (GstPlaySink * playsink, gdouble volume)
+{
+ GstPlayAudioChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ playsink->volume = volume;
+ chain = (GstPlayAudioChain *) playsink->audiochain;
+ if (chain && chain->volume) {
+ GST_LOG_OBJECT (playsink, "elements: volume=%" GST_PTR_FORMAT ", mute=%"
+ GST_PTR_FORMAT "; new volume=%.03f, mute=%d", chain->volume,
+ chain->mute, volume, playsink->mute);
+ /* if there is a mute element or we are not muted, set the volume */
+ if (chain->mute || !playsink->mute)
+ g_object_set (chain->volume, "volume", volume, NULL);
+ } else {
+ GST_LOG_OBJECT (playsink, "no volume element");
+ playsink->volume_changed = TRUE;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gdouble
+gst_play_sink_get_volume (GstPlaySink * playsink)
+{
+ gdouble result;
+ GstPlayAudioChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayAudioChain *) playsink->audiochain;
+ result = playsink->volume;
+ if (chain && chain->volume) {
+ if (chain->mute || !playsink->mute) {
+ g_object_get (chain->volume, "volume", &result, NULL);
+ playsink->volume = result;
+ }
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+void
+gst_play_sink_set_mute (GstPlaySink * playsink, gboolean mute)
+{
+ GstPlayAudioChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ playsink->mute = mute;
+ chain = (GstPlayAudioChain *) playsink->audiochain;
+ if (chain) {
+ if (chain->mute) {
+ g_object_set (chain->mute, "mute", mute, NULL);
+ } else if (chain->volume) {
+ if (mute)
+ g_object_set (chain->volume, "volume", (gdouble) 0.0, NULL);
+ else
+ g_object_set (chain->volume, "volume", (gdouble) playsink->volume,
+ NULL);
+ }
+ } else {
+ playsink->mute_changed = TRUE;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gboolean
+gst_play_sink_get_mute (GstPlaySink * playsink)
+{
+ gboolean result;
+ GstPlayAudioChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayAudioChain *) playsink->audiochain;
+ if (chain && chain->mute) {
+ g_object_get (chain->mute, "mute", &result, NULL);
+ playsink->mute = result;
+ } else {
+ result = playsink->mute;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+static void
+post_missing_element_message (GstPlaySink * playsink, const gchar * name)
+{
+ GstMessage *msg;
+
+ msg = gst_missing_element_message_new (GST_ELEMENT_CAST (playsink), name);
+ gst_element_post_message (GST_ELEMENT_CAST (playsink), msg);
+}
+
+static gboolean
+add_chain (GstPlayChain * chain, gboolean add)
+{
+ if (chain->added == add)
+ return TRUE;
+
+ if (add)
+ gst_bin_add (GST_BIN_CAST (chain->playsink), chain->bin);
+ else {
+ gst_bin_remove (GST_BIN_CAST (chain->playsink), chain->bin);
+ /* we don't want to lose our sink status */
+ GST_OBJECT_FLAG_SET (chain->playsink, GST_ELEMENT_IS_SINK);
+ }
+
+ chain->added = add;
+
+ return TRUE;
+}
+
+static gboolean
+activate_chain (GstPlayChain * chain, gboolean activate)
+{
+ GstState state;
+
+ if (chain->activated == activate)
+ return TRUE;
+
+ GST_OBJECT_LOCK (chain->playsink);
+ state = GST_STATE_TARGET (chain->playsink);
+ GST_OBJECT_UNLOCK (chain->playsink);
+
+ if (activate)
+ gst_element_set_state (chain->bin, state);
+ else
+ gst_element_set_state (chain->bin, GST_STATE_NULL);
+
+ chain->activated = activate;
+
+ return TRUE;
+}
+
+static gboolean
+element_is_sink (GstElement * element)
+{
+ gboolean is_sink;
+
+ GST_OBJECT_LOCK (element);
+ is_sink = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK);
+ GST_OBJECT_UNLOCK (element);
+
+ GST_DEBUG_OBJECT (element, "is a sink: %s", (is_sink) ? "yes" : "no");
+ return is_sink;
+}
+
+static gboolean
+element_has_property (GstElement * element, const gchar * pname, GType type)
+{
+ GParamSpec *pspec;
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (element), pname);
+
+ if (pspec == NULL) {
+ GST_DEBUG_OBJECT (element, "no %s property", pname);
+ return FALSE;
+ }
+
+ if (type == G_TYPE_INVALID || type == pspec->value_type ||
+ g_type_is_a (pspec->value_type, type)) {
+ GST_DEBUG_OBJECT (element, "has %s property of type %s", pname,
+ (type == G_TYPE_INVALID) ? "any type" : g_type_name (type));
+ return TRUE;
+ }
+
+ GST_WARNING_OBJECT (element, "has %s property, but property is of type %s "
+ "and we expected it to be of type %s", pname,
+ g_type_name (pspec->value_type), g_type_name (type));
+
+ return FALSE;
+}
+
+typedef struct
+{
+ const gchar *prop_name;
+ GType prop_type;
+ gboolean need_sink;
+} FindPropertyHelper;
+
+static gint
+find_property (const GValue * item, FindPropertyHelper * helper)
+{
+ GstElement *element = g_value_get_object (item);
+ if (helper->need_sink && !element_is_sink (element)) {
+ return 1;
+ }
+
+ if (!element_has_property (element, helper->prop_name, helper->prop_type)) {
+ return 1;
+ }
+
+ GST_INFO_OBJECT (element, "found %s with %s property", helper->prop_name,
+ (helper->need_sink) ? "sink" : "element");
+ return 0; /* keep it */
+}
+
+/* FIXME: why not move these functions into core? */
+/* find a sink in the hierarchy with a property named @name. This function does
+ * not increase the refcount of the returned object and thus remains valid as
+ * long as the bin is valid. */
+static GstElement *
+gst_play_sink_find_property_sinks (GstPlaySink * playsink, GstElement * obj,
+ const gchar * name, GType expected_type)
+{
+ GstElement *result = NULL;
+ GstIterator *it;
+
+ if (element_has_property (obj, name, expected_type)) {
+ result = obj;
+ } else if (GST_IS_BIN (obj)) {
+ gboolean found;
+ GValue item = { 0, };
+ FindPropertyHelper helper = { name, expected_type, TRUE };
+
+ it = gst_bin_iterate_recurse (GST_BIN_CAST (obj));
+ found = gst_iterator_find_custom (it,
+ (GCompareFunc) find_property, &item, &helper);
+ gst_iterator_free (it);
+ if (found) {
+ result = g_value_get_object (&item);
+ /* we don't need the extra ref */
+ g_value_unset (&item);
+ }
+ }
+ return result;
+}
+
+/* find an object in the hierarchy with a property named @name */
+static GstElement *
+gst_play_sink_find_property (GstPlaySink * playsink, GstElement * obj,
+ const gchar * name, GType expected_type)
+{
+ GstElement *result = NULL;
+ GstIterator *it;
+
+ if (GST_IS_BIN (obj)) {
+ gboolean found;
+ GValue item = { 0, };
+ FindPropertyHelper helper = { name, expected_type, FALSE };
+
+ it = gst_bin_iterate_recurse (GST_BIN_CAST (obj));
+ found = gst_iterator_find_custom (it,
+ (GCompareFunc) find_property, &item, &helper);
+ gst_iterator_free (it);
+ if (found)
+ result = g_value_dup_object (&item);
+ g_value_unset (&item);
+ } else {
+ if (element_has_property (obj, name, expected_type)) {
+ result = obj;
+ gst_object_ref (obj);
+ }
+ }
+ return result;
+}
+
+static void
+do_async_start (GstPlaySink * playsink)
+{
+ GstMessage *message;
+
+ if (!playsink->need_async_start) {
+ GST_INFO_OBJECT (playsink, "no async_start needed");
+ return;
+ }
+
+ playsink->async_pending = TRUE;
+
+ GST_INFO_OBJECT (playsink, "Sending async_start message");
+ message = gst_message_new_async_start (GST_OBJECT_CAST (playsink));
+ GST_BIN_CLASS (gst_play_sink_parent_class)->handle_message (GST_BIN_CAST
+ (playsink), message);
+}
+
+static void
+do_async_done (GstPlaySink * playsink)
+{
+ GstMessage *message;
+
+ if (playsink->async_pending) {
+ GST_INFO_OBJECT (playsink, "Sending async_done message");
+ message = gst_message_new_async_done (GST_OBJECT_CAST (playsink), FALSE);
+ GST_BIN_CLASS (gst_play_sink_parent_class)->handle_message (GST_BIN_CAST
+ (playsink), message);
+
+ playsink->async_pending = FALSE;
+ }
+
+ playsink->need_async_start = FALSE;
+}
+
+/* try to change the state of an element. This function returns the element when
+ * the state change could be performed. When this function returns NULL an error
+ * occured and the element is unreffed if @unref is TRUE. */
+static GstElement *
+try_element (GstPlaySink * playsink, GstElement * element, gboolean unref)
+{
+ GstStateChangeReturn ret;
+
+ if (element) {
+ ret = gst_element_set_state (element, GST_STATE_READY);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ GST_DEBUG_OBJECT (playsink, "failed state change..");
+ gst_element_set_state (element, GST_STATE_NULL);
+ if (unref)
+ gst_object_unref (element);
+ element = NULL;
+ }
+ }
+ return element;
+}
+
+/* make the element (bin) that contains the elements needed to perform
+ * video display. Only used for *raw* video streams.
+ *
+ * +------------------------------------------------------------+
+ * | vbin |
+ * | +-------+ +----------+ +----------+ +---------+ |
+ * | | queue | |colorspace| |videoscale| |videosink| |
+ * | +-sink src-sink src-sink src-sink | |
+ * | | +-------+ +----------+ +----------+ +---------+ |
+ * sink-+ |
+ * +------------------------------------------------------------+
+ *
+ */
+static GstPlayVideoDeinterlaceChain *
+gen_video_deinterlace_chain (GstPlaySink * playsink)
+{
+ GstPlayVideoDeinterlaceChain *chain;
+ GstBin *bin;
+ GstPad *pad;
+ GstElement *head = NULL, *prev = NULL;
+
+ chain = g_new0 (GstPlayVideoDeinterlaceChain, 1);
+ chain->chain.playsink = playsink;
+
+ GST_DEBUG_OBJECT (playsink, "making video deinterlace chain %p", chain);
+
+ /* create a bin to hold objects, as we create them we add them to this bin so
+ * that when something goes wrong we only need to unref the bin */
+ chain->chain.bin = gst_bin_new ("vdbin");
+ bin = GST_BIN_CAST (chain->chain.bin);
+ gst_object_ref_sink (bin);
+
+ GST_DEBUG_OBJECT (playsink, "creating " COLORSPACE);
+ chain->conv = gst_element_factory_make (COLORSPACE, "vdconv");
+ if (chain->conv == NULL) {
+ post_missing_element_message (playsink, COLORSPACE);
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ COLORSPACE), ("video rendering might fail"));
+ } else {
+ gst_bin_add (bin, chain->conv);
+ head = chain->conv;
+ prev = chain->conv;
+ }
+
+ GST_DEBUG_OBJECT (playsink, "creating deinterlace");
+ chain->deinterlace = gst_element_factory_make ("deinterlace", "deinterlace");
+ if (chain->deinterlace == NULL) {
+ post_missing_element_message (playsink, "deinterlace");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "deinterlace"), ("deinterlacing won't work"));
+ } else {
+ gst_bin_add (bin, chain->deinterlace);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", chain->deinterlace, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = chain->deinterlace;
+ }
+ prev = chain->deinterlace;
+ }
+
+ if (head) {
+ pad = gst_element_get_static_pad (head, "sink");
+ chain->sinkpad = gst_ghost_pad_new ("sink", pad);
+ gst_object_unref (pad);
+ } else {
+ chain->sinkpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK);
+ }
+
+ if (prev) {
+ pad = gst_element_get_static_pad (prev, "src");
+ chain->srcpad = gst_ghost_pad_new ("src", pad);
+ gst_object_unref (pad);
+ } else {
+ chain->srcpad = gst_ghost_pad_new ("src", chain->sinkpad);
+ }
+
+ gst_element_add_pad (chain->chain.bin, chain->sinkpad);
+ gst_element_add_pad (chain->chain.bin, chain->srcpad);
+
+ return chain;
+
+link_failed:
+ {
+ GST_ELEMENT_ERROR (playsink, CORE, PAD,
+ (NULL), ("Failed to configure the video deinterlace chain."));
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+}
+
+/* make the element (bin) that contains the elements needed to perform
+ * video display.
+ *
+ * +------------------------------------------------------------+
+ * | vbin |
+ * | +-------+ +----------+ +----------+ +---------+ |
+ * | | queue | |colorspace| |videoscale| |videosink| |
+ * | +-sink src-sink src-sink src-sink | |
+ * | | +-------+ +----------+ +----------+ +---------+ |
+ * sink-+ |
+ * +------------------------------------------------------------+
+ *
+ */
+static GstPlayVideoChain *
+gen_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+{
+ GstPlayVideoChain *chain;
+ GstBin *bin;
+ GstPad *pad;
+ GstElement *head = NULL, *prev = NULL, *elem = NULL;
+
+ chain = g_new0 (GstPlayVideoChain, 1);
+ chain->chain.playsink = playsink;
+ chain->chain.raw = raw;
+
+ GST_DEBUG_OBJECT (playsink, "making video chain %p", chain);
+
+ if (playsink->video_sink) {
+ GST_DEBUG_OBJECT (playsink, "trying configured videosink");
+ chain->sink = try_element (playsink, playsink->video_sink, FALSE);
+ } else {
+ /* only try fallback if no specific sink was chosen */
+ if (chain->sink == NULL) {
+ GST_DEBUG_OBJECT (playsink, "trying autovideosink");
+ elem = gst_element_factory_make ("autovideosink", "videosink");
+ chain->sink = try_element (playsink, elem, TRUE);
+ }
+ if (chain->sink == NULL) {
+ /* if default sink from config.h is different then try it too */
+ if (strcmp (DEFAULT_VIDEOSINK, "autovideosink")) {
+ GST_DEBUG_OBJECT (playsink, "trying " DEFAULT_VIDEOSINK);
+ elem = gst_element_factory_make (DEFAULT_VIDEOSINK, "videosink");
+ chain->sink = try_element (playsink, elem, TRUE);
+ }
+ }
+ if (chain->sink)
+ playsink->video_sink = gst_object_ref (chain->sink);
+ }
+ if (chain->sink == NULL)
+ goto no_sinks;
+ head = chain->sink;
+
+ /* if we can disable async behaviour of the sink, we can avoid adding a
+ * queue for the audio chain. */
+ elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "async",
+ G_TYPE_BOOLEAN);
+ if (elem) {
+ GST_DEBUG_OBJECT (playsink, "setting async property to %d on element %s",
+ async, GST_ELEMENT_NAME (elem));
+ g_object_set (elem, "async", async, NULL);
+ chain->async = async;
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no async property on the sink");
+ chain->async = TRUE;
+ }
+
+ /* find ts-offset element */
+ gst_object_replace ((GstObject **) & chain->ts_offset, (GstObject *)
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "ts-offset",
+ G_TYPE_INT64));
+
+ /* create a bin to hold objects, as we create them we add them to this bin so
+ * that when something goes wrong we only need to unref the bin */
+ chain->chain.bin = gst_bin_new ("vbin");
+ bin = GST_BIN_CAST (chain->chain.bin);
+ gst_object_ref_sink (bin);
+ gst_bin_add (bin, chain->sink);
+
+ /* decouple decoder from sink, this improves playback quite a lot since the
+ * decoder can continue while the sink blocks for synchronisation. We don't
+ * need a lot of buffers as this consumes a lot of memory and we don't want
+ * too little because else we would be context switching too quickly. */
+ chain->queue = gst_element_factory_make ("queue", "vqueue");
+ if (chain->queue == NULL) {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), ("video rendering might be suboptimal"));
+ head = chain->sink;
+ prev = NULL;
+ } else {
+ g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
+ "max-size-bytes", 0, "max-size-time", (gint64) 0, "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->queue);
+ head = prev = chain->queue;
+ }
+
+ if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
+ GST_DEBUG_OBJECT (playsink, "creating videoconverter");
+ chain->conv =
+ g_object_new (GST_TYPE_PLAY_SINK_VIDEO_CONVERT, "name", "vconv", NULL);
+ gst_bin_add (bin, chain->conv);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = chain->conv;
+ }
+ prev = chain->conv;
+ }
+
+ if (prev) {
+ GST_DEBUG_OBJECT (playsink, "linking to sink");
+ if (!gst_element_link_pads_full (prev, "src", chain->sink, NULL,
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ }
+
+ pad = gst_element_get_static_pad (head, "sink");
+ chain->sinkpad = gst_ghost_pad_new ("sink", pad);
+ gst_object_unref (pad);
+
+ gst_element_add_pad (chain->chain.bin, chain->sinkpad);
+
+ return chain;
+
+ /* ERRORS */
+no_sinks:
+ {
+ if (!elem && !playsink->video_sink) {
+ post_missing_element_message (playsink, "autovideosink");
+ if (strcmp (DEFAULT_VIDEOSINK, "autovideosink")) {
+ post_missing_element_message (playsink, DEFAULT_VIDEOSINK);
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Both autovideosink and %s elements are missing."),
+ DEFAULT_VIDEOSINK), (NULL));
+ } else {
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("The autovideosink element is missing.")), (NULL));
+ }
+ } else {
+ if (playsink->video_sink) {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("Configured videosink %s is not working."),
+ GST_ELEMENT_NAME (playsink->video_sink)), (NULL));
+ } else if (strcmp (DEFAULT_VIDEOSINK, "autovideosink")) {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("Both autovideosink and %s elements are not working."),
+ DEFAULT_VIDEOSINK), (NULL));
+ } else {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("The autovideosink element is not working.")), (NULL));
+ }
+ }
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+link_failed:
+ {
+ GST_ELEMENT_ERROR (playsink, CORE, PAD,
+ (NULL), ("Failed to configure the video sink."));
+ /* checking sink made it READY */
+ gst_element_set_state (chain->sink, GST_STATE_NULL);
+ /* Remove chain from the bin to allow reuse later */
+ gst_bin_remove (bin, chain->sink);
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+}
+
+static gboolean
+setup_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+{
+ GstElement *elem;
+ GstPlayVideoChain *chain;
+ GstStateChangeReturn ret;
+
+ chain = playsink->videochain;
+
+ chain->chain.raw = raw;
+
+ /* if the chain was active we don't do anything */
+ if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+ return TRUE;
+
+ /* try to set the sink element to READY again */
+ ret = gst_element_set_state (chain->sink, GST_STATE_READY);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return FALSE;
+
+ /* find ts-offset element */
+
+ gst_object_replace ((GstObject **) & chain->ts_offset, (GstObject *)
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "ts-offset",
+ G_TYPE_INT64));
+
+ /* if we can disable async behaviour of the sink, we can avoid adding a
+ * queue for the audio chain. */
+ elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "async",
+ G_TYPE_BOOLEAN);
+ if (elem) {
+ GST_DEBUG_OBJECT (playsink, "setting async property to %d on element %s",
+ async, GST_ELEMENT_NAME (elem));
+ g_object_set (elem, "async", async, NULL);
+ chain->async = async;
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no async property on the sink");
+ chain->async = TRUE;
+ }
+ return TRUE;
+}
+
+/* make an element for playback of video with subtitles embedded.
+ * Only used for *raw* video streams.
+ *
+ * +--------------------------------------------+
+ * | tbin |
+ * | +--------+ +-----------------+ |
+ * | | queue | | subtitleoverlay | |
+ * video--src sink---video_sink | |
+ * | +--------+ | src--src
+ * text------------------text_sink | |
+ * | +-----------------+ |
+ * +--------------------------------------------+
+ *
+ */
+static GstPlayTextChain *
+gen_text_chain (GstPlaySink * playsink)
+{
+ GstPlayTextChain *chain;
+ GstBin *bin;
+ GstElement *elem;
+ GstPad *videosinkpad, *textsinkpad, *srcpad;
+
+ chain = g_new0 (GstPlayTextChain, 1);
+ chain->chain.playsink = playsink;
+
+ GST_DEBUG_OBJECT (playsink, "making text chain %p", chain);
+
+ chain->chain.bin = gst_bin_new ("tbin");
+ bin = GST_BIN_CAST (chain->chain.bin);
+ gst_object_ref_sink (bin);
+
+ videosinkpad = textsinkpad = srcpad = NULL;
+
+ /* first try to hook the text pad to the custom sink */
+ if (playsink->text_sink) {
+ GST_DEBUG_OBJECT (playsink, "trying configured textsink");
+ chain->sink = try_element (playsink, playsink->text_sink, FALSE);
+ if (chain->sink) {
+ elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "async",
+ G_TYPE_BOOLEAN);
+ if (elem) {
+ /* make sure the sparse subtitles don't participate in the preroll */
+ g_object_set (elem, "async", FALSE, NULL);
+ GST_DEBUG_OBJECT (playsink, "adding custom text sink");
+ gst_bin_add (bin, chain->sink);
+ /* NOTE streamsynchronizer needs streams decoupled */
+ /* make a little queue */
+ chain->queue = gst_element_factory_make ("queue", "subqueue");
+ if (chain->queue == NULL) {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), ("rendering might be suboptimal"));
+ } else {
+ g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
+ "max-size-bytes", 0, "max-size-time", (gint64) 0,
+ "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->queue);
+ }
+ /* we have a custom sink, this will be our textsinkpad */
+ if (gst_element_link_pads_full (chain->queue, "src", chain->sink,
+ "sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS)) {
+ /* we're all fine now and we can add the sink to the chain */
+ GST_DEBUG_OBJECT (playsink, "using custom text sink");
+ textsinkpad = gst_element_get_static_pad (chain->queue, "sink");
+ } else {
+ GST_WARNING_OBJECT (playsink,
+ "can't find a sink pad on custom text sink");
+ gst_bin_remove (bin, chain->sink);
+ gst_bin_remove (bin, chain->queue);
+ chain->sink = NULL;
+ chain->queue = NULL;
+ }
+ /* try to set sync to true but it's no biggie when we can't */
+ if ((elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink,
+ "sync", G_TYPE_BOOLEAN)))
+ g_object_set (elem, "sync", TRUE, NULL);
+
+ if (!textsinkpad)
+ gst_bin_remove (bin, chain->sink);
+ } else {
+ GST_WARNING_OBJECT (playsink,
+ "can't find async property in custom text sink");
+ }
+ }
+ if (textsinkpad == NULL) {
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Custom text sink element is not usable.")),
+ ("fallback to default textoverlay"));
+ }
+ }
+
+ if (textsinkpad == NULL) {
+ if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
+ /* make a little queue */
+ chain->queue = gst_element_factory_make ("queue", "vqueue");
+ if (chain->queue == NULL) {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), ("video rendering might be suboptimal"));
+ } else {
+ g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
+ "max-size-bytes", 0, "max-size-time", (gint64) 0,
+ "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->queue);
+ videosinkpad = gst_element_get_static_pad (chain->queue, "sink");
+ }
+
+ chain->overlay =
+ gst_element_factory_make ("subtitleoverlay", "suboverlay");
+ if (chain->overlay == NULL) {
+ post_missing_element_message (playsink, "subtitleoverlay");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "subtitleoverlay"), ("subtitle rendering disabled"));
+ } else {
+ GstElement *element;
+
+ gst_bin_add (bin, chain->overlay);
+
+ g_object_set (G_OBJECT (chain->overlay), "silent", FALSE, NULL);
+ if (playsink->font_desc) {
+ g_object_set (G_OBJECT (chain->overlay), "font-desc",
+ playsink->font_desc, NULL);
+ }
+ if (playsink->subtitle_encoding) {
+ g_object_set (G_OBJECT (chain->overlay), "subtitle-encoding",
+ playsink->subtitle_encoding, NULL);
+ }
+
+ gst_element_link_pads_full (chain->queue, "src", chain->overlay,
+ "video_sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS);
+
+ /* make another little queue to decouple streams */
+ element = gst_element_factory_make ("queue", "subqueue");
+ if (element == NULL) {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), ("rendering might be suboptimal"));
+ } else {
+ g_object_set (G_OBJECT (element), "max-size-buffers", 3,
+ "max-size-bytes", 0, "max-size-time", (gint64) 0,
+ "silent", TRUE, NULL);
+ gst_bin_add (bin, element);
+ gst_element_link_pads_full (element, "src", chain->overlay,
+ "subtitle_sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS);
+ textsinkpad = gst_element_get_static_pad (element, "sink");
+ srcpad = gst_element_get_static_pad (chain->overlay, "src");
+ }
+ }
+ }
+ }
+
+ if (videosinkpad == NULL) {
+ /* if we still don't have a videosink, we don't have an overlay. the only
+ * thing we can do is insert an identity and ghost the src
+ * and sink pads. */
+ chain->identity = gst_element_factory_make ("identity", "tidentity");
+ if (chain->identity == NULL) {
+ post_missing_element_message (playsink, "identity");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "identity"), (NULL));
+ } else {
+ g_object_set (chain->identity, "signal-handoffs", FALSE, NULL);
+ g_object_set (chain->identity, "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->identity);
+ srcpad = gst_element_get_static_pad (chain->identity, "src");
+ videosinkpad = gst_element_get_static_pad (chain->identity, "sink");
+ }
+ }
+
+ /* expose the ghostpads */
+ if (videosinkpad) {
+ chain->videosinkpad = gst_ghost_pad_new ("sink", videosinkpad);
+ gst_object_unref (videosinkpad);
+ gst_element_add_pad (chain->chain.bin, chain->videosinkpad);
+ }
+ if (textsinkpad) {
+ chain->textsinkpad = gst_ghost_pad_new ("text_sink", textsinkpad);
+ gst_object_unref (textsinkpad);
+ gst_element_add_pad (chain->chain.bin, chain->textsinkpad);
+ }
+ if (srcpad) {
+ chain->srcpad = gst_ghost_pad_new ("src", srcpad);
+ gst_object_unref (srcpad);
+ gst_element_add_pad (chain->chain.bin, chain->srcpad);
+ }
+
+ return chain;
+}
+
+static void
+notify_volume_cb (GObject * object, GParamSpec * pspec, GstPlaySink * playsink)
+{
+ gdouble vol;
+
+ g_object_get (object, "volume", &vol, NULL);
+ playsink->volume = vol;
+
+ g_object_notify (G_OBJECT (playsink), "volume");
+}
+
+static void
+notify_mute_cb (GObject * object, GParamSpec * pspec, GstPlaySink * playsink)
+{
+ gboolean mute;
+
+ g_object_get (object, "mute", &mute, NULL);
+ playsink->mute = mute;
+
+ g_object_notify (G_OBJECT (playsink), "mute");
+}
+
+/* make the chain that contains the elements needed to perform
+ * audio playback.
+ *
+ * We add a tee as the first element so that we can link the visualisation chain
+ * to it when requested.
+ *
+ * +-------------------------------------------------------------+
+ * | abin |
+ * | +---------+ +----------+ +---------+ +---------+ |
+ * | |audioconv| |audioscale| | volume | |audiosink| |
+ * | +-srck src-sink src-sink src-sink | |
+ * | | +---------+ +----------+ +---------+ +---------+ |
+ * sink-+ |
+ * +-------------------------------------------------------------+
+ */
+static GstPlayAudioChain *
+gen_audio_chain (GstPlaySink * playsink, gboolean raw)
+{
+ GstPlayAudioChain *chain;
+ GstBin *bin;
+ gboolean have_volume;
+ GstPad *pad;
+ GstElement *head, *prev, *elem = NULL;
+
+ chain = g_new0 (GstPlayAudioChain, 1);
+ chain->chain.playsink = playsink;
+ chain->chain.raw = raw;
+
+ GST_DEBUG_OBJECT (playsink, "making audio chain %p", chain);
+
+ if (playsink->audio_sink) {
+ GST_DEBUG_OBJECT (playsink, "trying configured audiosink %" GST_PTR_FORMAT,
+ playsink->audio_sink);
+ chain->sink = try_element (playsink, playsink->audio_sink, FALSE);
+ } else {
+ /* only try fallback if no specific sink was chosen */
+ if (chain->sink == NULL) {
+ GST_DEBUG_OBJECT (playsink, "trying autoaudiosink");
+ elem = gst_element_factory_make ("autoaudiosink", "audiosink");
+ chain->sink = try_element (playsink, elem, TRUE);
+ }
+ if (chain->sink == NULL) {
+ /* if default sink from config.h is different then try it too */
+ if (strcmp (DEFAULT_AUDIOSINK, "autoaudiosink")) {
+ GST_DEBUG_OBJECT (playsink, "trying " DEFAULT_AUDIOSINK);
+ elem = gst_element_factory_make (DEFAULT_AUDIOSINK, "audiosink");
+ chain->sink = try_element (playsink, elem, TRUE);
+ }
+ }
+ if (chain->sink)
+ playsink->audio_sink = gst_object_ref (chain->sink);
+ }
+ if (chain->sink == NULL)
+ goto no_sinks;
+
+ chain->chain.bin = gst_bin_new ("abin");
+ bin = GST_BIN_CAST (chain->chain.bin);
+ gst_object_ref_sink (bin);
+ gst_bin_add (bin, chain->sink);
+
+ /* we have to add a queue when we need to decouple for the video sink in
+ * visualisations and for streamsynchronizer */
+ GST_DEBUG_OBJECT (playsink, "adding audio queue");
+ chain->queue = gst_element_factory_make ("queue", "aqueue");
+ if (chain->queue == NULL) {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), ("audio playback and visualizations might not work"));
+ head = chain->sink;
+ prev = NULL;
+ } else {
+ g_object_set (chain->queue, "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->queue);
+ prev = head = chain->queue;
+ }
+
+ /* find ts-offset element */
+ gst_object_replace ((GstObject **) & chain->ts_offset, (GstObject *)
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "ts-offset",
+ G_TYPE_INT64));
+
+ /* check if the sink, or something within the sink, has the volume property.
+ * If it does we don't need to add a volume element. */
+ elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "volume",
+ G_TYPE_DOUBLE);
+ if (elem) {
+ chain->volume = elem;
+
+ g_signal_connect (chain->volume, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playsink);
+
+ GST_DEBUG_OBJECT (playsink, "the sink has a volume property");
+ have_volume = TRUE;
+ chain->sink_volume = TRUE;
+ /* if the sink also has a mute property we can use this as well. We'll only
+ * use the mute property if there is a volume property. We can simulate the
+ * mute with the volume otherwise. */
+ chain->mute =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "mute",
+ G_TYPE_BOOLEAN);
+ if (chain->mute) {
+ GST_DEBUG_OBJECT (playsink, "the sink has a mute property");
+ g_signal_connect (chain->mute, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playsink);
+ }
+ /* use the sink to control the volume and mute */
+ if (playsink->volume_changed) {
+ g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume, NULL);
+ playsink->volume_changed = FALSE;
+ }
+ if (playsink->mute_changed) {
+ if (chain->mute) {
+ g_object_set (chain->mute, "mute", playsink->mute, NULL);
+ } else {
+ if (playsink->mute)
+ g_object_set (chain->volume, "volume", (gdouble) 0.0, NULL);
+ }
+ playsink->mute_changed = FALSE;
+ }
+ } else {
+ /* no volume, we need to add a volume element when we can */
+ GST_DEBUG_OBJECT (playsink, "the sink has no volume property");
+ have_volume = FALSE;
+ chain->sink_volume = FALSE;
+ }
+
+ if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_AUDIO) || (!have_volume
+ && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME)) {
+ GST_DEBUG_OBJECT (playsink, "creating audioconvert");
+ chain->conv =
+ g_object_new (GST_TYPE_PLAY_SINK_AUDIO_CONVERT, "name", "aconv", NULL);
+ gst_bin_add (bin, chain->conv);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = chain->conv;
+ }
+ prev = chain->conv;
+
+ GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_converters =
+ !(playsink->flags & GST_PLAY_FLAG_NATIVE_AUDIO);
+ GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_volume = (!have_volume
+ && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME);
+
+ if (!have_volume && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME) {
+ GstPlaySinkAudioConvert *conv =
+ GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
+
+ if (conv->volume) {
+ chain->volume = conv->volume;
+ have_volume = TRUE;
+
+ g_signal_connect (chain->volume, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playsink);
+
+ /* volume also has the mute property */
+ chain->mute = chain->volume;
+ g_signal_connect (chain->mute, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playsink);
+
+ /* configure with the latest volume and mute */
+ g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume,
+ NULL);
+ g_object_set (G_OBJECT (chain->mute), "mute", playsink->mute, NULL);
+ }
+ }
+ }
+
+ if (prev) {
+ /* we only have to link to the previous element if we have something in
+ * front of the sink */
+ GST_DEBUG_OBJECT (playsink, "linking to sink");
+ if (!gst_element_link_pads_full (prev, "src", chain->sink, NULL,
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ }
+
+ /* post a warning if we have no way to configure the volume */
+ if (!have_volume) {
+ GST_ELEMENT_WARNING (playsink, STREAM, NOT_IMPLEMENTED,
+ (_("No volume control found")), ("Volume/mute is not available"));
+ }
+
+ /* and ghost the sinkpad of the headmost element */
+ GST_DEBUG_OBJECT (playsink, "ghosting sink pad");
+ pad = gst_element_get_static_pad (head, "sink");
+ chain->sinkpad = gst_ghost_pad_new ("sink", pad);
+ gst_object_unref (pad);
+ gst_element_add_pad (chain->chain.bin, chain->sinkpad);
+
+ return chain;
+
+ /* ERRORS */
+no_sinks:
+ {
+ if (!elem && !playsink->audio_sink) {
+ post_missing_element_message (playsink, "autoaudiosink");
+ if (strcmp (DEFAULT_AUDIOSINK, "autoaudiosink")) {
+ post_missing_element_message (playsink, DEFAULT_AUDIOSINK);
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Both autoaudiosink and %s elements are missing."),
+ DEFAULT_AUDIOSINK), (NULL));
+ } else {
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("The autoaudiosink element is missing.")), (NULL));
+ }
+ } else {
+ if (playsink->audio_sink) {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("Configured audiosink %s is not working."),
+ GST_ELEMENT_NAME (playsink->audio_sink)), (NULL));
+ } else if (strcmp (DEFAULT_AUDIOSINK, "autoaudiosink")) {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("Both autoaudiosink and %s elements are not working."),
+ DEFAULT_AUDIOSINK), (NULL));
+ } else {
+ GST_ELEMENT_ERROR (playsink, CORE, STATE_CHANGE,
+ (_("The autoaudiosink element is not working.")), (NULL));
+ }
+ }
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+link_failed:
+ {
+ GST_ELEMENT_ERROR (playsink, CORE, PAD,
+ (NULL), ("Failed to configure the audio sink."));
+ /* checking sink made it READY */
+ gst_element_set_state (chain->sink, GST_STATE_NULL);
+ /* Remove chain from the bin to allow reuse later */
+ gst_bin_remove (bin, chain->sink);
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+}
+
+static gboolean
+setup_audio_chain (GstPlaySink * playsink, gboolean raw)
+{
+ GstElement *elem;
+ GstPlayAudioChain *chain;
+ GstStateChangeReturn ret;
+
+ chain = playsink->audiochain;
+
+ chain->chain.raw = raw;
+
+ /* if the chain was active we don't do anything */
+ if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+ return TRUE;
+
+ /* try to set the sink element to READY again */
+ ret = gst_element_set_state (chain->sink, GST_STATE_READY);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return FALSE;
+
+ /* find ts-offset element */
+ gst_object_replace ((GstObject **) & chain->ts_offset, (GstObject *)
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "ts-offset",
+ G_TYPE_INT64));
+
+ /* check if the sink, or something within the sink, has the volume property.
+ * If it does we don't need to add a volume element. */
+ elem =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "volume",
+ G_TYPE_DOUBLE);
+ if (elem) {
+ chain->volume = elem;
+
+ if (playsink->volume_changed) {
+ GST_DEBUG_OBJECT (playsink, "the sink has a volume property, setting %f",
+ playsink->volume);
+ /* use the sink to control the volume */
+ g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume, NULL);
+ playsink->volume_changed = FALSE;
+ }
+
+ g_signal_connect (chain->volume, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playsink);
+ /* if the sink also has a mute property we can use this as well. We'll only
+ * use the mute property if there is a volume property. We can simulate the
+ * mute with the volume otherwise. */
+ chain->mute =
+ gst_play_sink_find_property_sinks (playsink, chain->sink, "mute",
+ G_TYPE_BOOLEAN);
+ if (chain->mute) {
+ GST_DEBUG_OBJECT (playsink, "the sink has a mute property");
+ g_signal_connect (chain->mute, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playsink);
+ }
+
+ GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_volume = FALSE;
+ } else {
+ GstPlaySinkAudioConvert *conv =
+ GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
+
+ /* no volume, we need to add a volume element when we can */
+ conv->use_volume = TRUE;
+ GST_DEBUG_OBJECT (playsink, "the sink has no volume property");
+
+ /* Disconnect signals */
+ disconnect_chain (chain, playsink);
+
+ if (conv->volume) {
+ chain->volume = conv->volume;
+ chain->mute = chain->volume;
+
+ g_signal_connect (chain->volume, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playsink);
+
+ g_signal_connect (chain->mute, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playsink);
+
+ /* configure with the latest volume and mute */
+ g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume, NULL);
+ g_object_set (G_OBJECT (chain->mute), "mute", playsink->mute, NULL);
+ }
+
+ GST_DEBUG_OBJECT (playsink, "reusing existing volume element");
+ }
+ return TRUE;
+}
+
+/*
+ * +-------------------------------------------------------------------+
+ * | visbin |
+ * | +----------+ +------------+ +----------+ +-------+ |
+ * | | visqueue | | audioconv | | audiores | | vis | |
+ * | +-sink src-sink + samp src-sink src-sink src-+ |
+ * | | +----------+ +------------+ +----------+ +-------+ | |
+ * sink-+ +-src
+ * +-------------------------------------------------------------------+
+ *
+ */
+static GstPlayVisChain *
+gen_vis_chain (GstPlaySink * playsink)
+{
+ GstPlayVisChain *chain;
+ GstBin *bin;
+ gboolean res;
+ GstPad *pad;
+ GstElement *elem;
+
+ chain = g_new0 (GstPlayVisChain, 1);
+ chain->chain.playsink = playsink;
+
+ GST_DEBUG_OBJECT (playsink, "making vis chain %p", chain);
+
+ chain->chain.bin = gst_bin_new ("visbin");
+ bin = GST_BIN_CAST (chain->chain.bin);
+ gst_object_ref_sink (bin);
+
+ /* we're queuing raw audio here, we can remove this queue when we can disable
+ * async behaviour in the video sink. */
+ chain->queue = gst_element_factory_make ("queue", "visqueue");
+ if (chain->queue == NULL)
+ goto no_queue;
+ g_object_set (chain->queue, "silent", TRUE, NULL);
+ gst_bin_add (bin, chain->queue);
+
+ chain->conv = gst_element_factory_make ("audioconvert", "aconv");
+ if (chain->conv == NULL)
+ goto no_audioconvert;
+ gst_bin_add (bin, chain->conv);
+
+ chain->resample = gst_element_factory_make ("audioresample", "aresample");
+ if (chain->resample == NULL)
+ goto no_audioresample;
+ gst_bin_add (bin, chain->resample);
+
+ /* this pad will be used for blocking the dataflow and switching the vis
+ * plugin */
+ chain->blockpad = gst_element_get_static_pad (chain->resample, "src");
+
+ if (playsink->visualisation) {
+ GST_DEBUG_OBJECT (playsink, "trying configure vis");
+ chain->vis = try_element (playsink, playsink->visualisation, FALSE);
+ }
+ if (chain->vis == NULL) {
+ GST_DEBUG_OBJECT (playsink, "trying goom");
+ elem = gst_element_factory_make ("goom", "vis");
+ chain->vis = try_element (playsink, elem, TRUE);
+ }
+ if (chain->vis == NULL)
+ goto no_goom;
+
+ gst_bin_add (bin, chain->vis);
+
+ res = gst_element_link_pads_full (chain->queue, "src", chain->conv, "sink",
+ GST_PAD_LINK_CHECK_NOTHING);
+ res &=
+ gst_element_link_pads_full (chain->conv, "src", chain->resample, "sink",
+ GST_PAD_LINK_CHECK_NOTHING);
+ res &=
+ gst_element_link_pads_full (chain->resample, "src", chain->vis, "sink",
+ GST_PAD_LINK_CHECK_NOTHING);
+ if (!res)
+ goto link_failed;
+
+ chain->vissinkpad = gst_element_get_static_pad (chain->vis, "sink");
+ chain->vissrcpad = gst_element_get_static_pad (chain->vis, "src");
+
+ pad = gst_element_get_static_pad (chain->queue, "sink");
+ chain->sinkpad = gst_ghost_pad_new ("sink", pad);
+ gst_object_unref (pad);
+ gst_element_add_pad (chain->chain.bin, chain->sinkpad);
+
+ chain->srcpad = gst_ghost_pad_new ("src", chain->vissrcpad);
+ gst_element_add_pad (chain->chain.bin, chain->srcpad);
+
+ return chain;
+
+ /* ERRORS */
+no_queue:
+ {
+ post_missing_element_message (playsink, "queue");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "queue"), (NULL));
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+no_audioconvert:
+ {
+ post_missing_element_message (playsink, "audioconvert");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "audioconvert"), ("possibly a liboil version mismatch?"));
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+no_audioresample:
+ {
+ post_missing_element_message (playsink, "audioresample");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "audioresample"), (NULL));
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+no_goom:
+ {
+ post_missing_element_message (playsink, "goom");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "goom"), (NULL));
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+link_failed:
+ {
+ GST_ELEMENT_ERROR (playsink, CORE, PAD,
+ (NULL), ("Failed to configure the visualisation element."));
+ /* element made it to READY */
+ gst_element_set_state (chain->vis, GST_STATE_NULL);
+ free_chain ((GstPlayChain *) chain);
+ return NULL;
+ }
+}
+
+/* this function is called when all the request pads are requested and when we
+ * have to construct the final pipeline. Based on the flags we construct the
+ * final output pipelines.
+ */
+gboolean
+gst_play_sink_reconfigure (GstPlaySink * playsink)
+{
+ GstPlayFlags flags;
+ gboolean need_audio, need_video, need_deinterlace, need_vis, need_text;
+
+ GST_DEBUG_OBJECT (playsink, "reconfiguring");
+
+ /* assume we need nothing */
+ need_audio = need_video = need_deinterlace = need_vis = need_text = FALSE;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ GST_OBJECT_LOCK (playsink);
+ /* get flags, there are protected with the object lock */
+ flags = playsink->flags;
+ GST_OBJECT_UNLOCK (playsink);
+
+ /* figure out which components we need */
+ if (flags & GST_PLAY_FLAG_TEXT && playsink->text_pad) {
+ /* we have subtitles and we are requested to show it */
+ need_text = TRUE;
+ }
+
+ if (((flags & GST_PLAY_FLAG_VIDEO)
+ || (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) {
+ /* we have video and we are requested to show it */
+ need_video = TRUE;
+
+ /* we only deinterlace if native video is not requested and
+ * we have raw video */
+ if ((flags & GST_PLAY_FLAG_DEINTERLACE)
+ && !(flags & GST_PLAY_FLAG_NATIVE_VIDEO) && playsink->video_pad_raw)
+ need_deinterlace = TRUE;
+ }
+
+ if (playsink->audio_pad) {
+ if ((flags & GST_PLAY_FLAG_AUDIO) || (flags & GST_PLAY_FLAG_NATIVE_AUDIO)) {
+ need_audio = TRUE;
+ }
+ if (playsink->audio_pad_raw) {
+ /* only can do vis with raw uncompressed audio */
+ if (flags & GST_PLAY_FLAG_VIS && !need_video) {
+ /* also add video when we add visualisation */
+ need_video = TRUE;
+ need_vis = TRUE;
+ }
+ }
+ }
+
+ /* we have a text_pad and we need text rendering, in this case we need a
+ * video_pad to combine the video with the text or visualizations */
+ if (need_text && !need_video) {
+ if (playsink->video_pad) {
+ need_video = TRUE;
+ } else if (need_audio) {
+ GST_ELEMENT_WARNING (playsink, STREAM, FORMAT,
+ (_("Can't play a text file without video or visualizations.")),
+ ("Have text pad but no video pad or visualizations"));
+ need_text = FALSE;
+ } else {
+ GST_ELEMENT_ERROR (playsink, STREAM, FORMAT,
+ (_("Can't play a text file without video or visualizations.")),
+ ("Have text pad but no video pad or visualizations"));
+ GST_PLAY_SINK_UNLOCK (playsink);
+ return FALSE;
+ }
+ }
+
+ GST_DEBUG_OBJECT (playsink, "audio:%d, video:%d, vis:%d, text:%d", need_audio,
+ need_video, need_vis, need_text);
+
+ /* set up video pipeline */
+ if (need_video) {
+ gboolean raw, async;
+
+ /* we need a raw sink when we do vis or when we have a raw pad */
+ raw = need_vis ? TRUE : playsink->video_pad_raw;
+ /* we try to set the sink async=FALSE when we need vis, this way we can
+ * avoid a queue in the audio chain. */
+ async = !need_vis;
+
+ GST_DEBUG_OBJECT (playsink, "adding video, raw %d",
+ playsink->video_pad_raw);
+
+ if (playsink->videochain) {
+ /* try to reactivate the chain */
+ if (!setup_video_chain (playsink, raw, async)) {
+ if (playsink->video_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->video_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->video_sinkpad_stream_synchronizer);
+ playsink->video_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->video_srcpad_stream_synchronizer);
+ playsink->video_srcpad_stream_synchronizer = NULL;
+ }
+
+ add_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+
+ /* Remove the sink from the bin to keep its state
+ * and unparent it to allow reuse */
+ if (playsink->videochain->sink)
+ gst_bin_remove (GST_BIN_CAST (playsink->videochain->chain.bin),
+ playsink->videochain->sink);
+
+ activate_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+ free_chain ((GstPlayChain *) playsink->videochain);
+ playsink->videochain = NULL;
+ }
+ }
+
+ if (!playsink->videochain)
+ playsink->videochain = gen_video_chain (playsink, raw, async);
+ if (!playsink->videochain)
+ goto no_chain;
+
+ if (!playsink->video_sinkpad_stream_synchronizer) {
+ GValue item = { 0, };
+ GstIterator *it;
+
+ playsink->video_sinkpad_stream_synchronizer =
+ gst_element_get_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer), "sink_%d");
+ it = gst_pad_iterate_internal_links
+ (playsink->video_sinkpad_stream_synchronizer);
+ g_assert (it);
+ gst_iterator_next (it, &item);
+ playsink->video_srcpad_stream_synchronizer = g_value_dup_object (&item);
+ g_value_unset (&item);
+ g_assert (playsink->video_srcpad_stream_synchronizer);
+ gst_iterator_free (it);
+ }
+
+ if (playsink->video_pad)
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad),
+ playsink->video_sinkpad_stream_synchronizer);
+
+ if (need_deinterlace) {
+ if (!playsink->videodeinterlacechain)
+ playsink->videodeinterlacechain =
+ gen_video_deinterlace_chain (playsink);
+ if (!playsink->videodeinterlacechain)
+ goto no_chain;
+
+ GST_DEBUG_OBJECT (playsink, "adding video deinterlace chain");
+
+ GST_DEBUG_OBJECT (playsink, "setting up deinterlacing chain");
+
+ add_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), TRUE);
+ activate_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), TRUE);
+
+ gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
+ playsink->videodeinterlacechain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ } else {
+ if (playsink->videodeinterlacechain) {
+ add_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain),
+ FALSE);
+ }
+ }
+
+ GST_DEBUG_OBJECT (playsink, "adding video chain");
+ add_chain (GST_PLAY_CHAIN (playsink->videochain), TRUE);
+ activate_chain (GST_PLAY_CHAIN (playsink->videochain), TRUE);
+ /* if we are not part of vis or subtitles, set the ghostpad target */
+ if (!need_vis && !need_text && (!playsink->textchain
+ || !playsink->text_pad)) {
+ GST_DEBUG_OBJECT (playsink, "ghosting video sinkpad");
+ if (need_deinterlace)
+ gst_pad_link_full (playsink->videodeinterlacechain->srcpad,
+ playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ else
+ gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
+ playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ }
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no video needed");
+ if (playsink->videochain) {
+ GST_DEBUG_OBJECT (playsink, "removing video chain");
+ if (playsink->vischain) {
+ GstPad *srcpad;
+
+ GST_DEBUG_OBJECT (playsink, "unlinking vis chain");
+
+ /* also had visualisation, release the tee srcpad before we then
+ * unlink the video from it */
+ if (playsink->audio_tee_vissrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_vissrc);
+ gst_object_unref (playsink->audio_tee_vissrc);
+ playsink->audio_tee_vissrc = NULL;
+ }
+ srcpad =
+ gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
+ gst_pad_unlink (srcpad, playsink->videochain->sinkpad);
+ }
+
+ if (playsink->video_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->video_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->video_sinkpad_stream_synchronizer);
+ playsink->video_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->video_srcpad_stream_synchronizer);
+ playsink->video_srcpad_stream_synchronizer = NULL;
+ }
+
+ add_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+ if (playsink->videochain->ts_offset)
+ gst_object_unref (playsink->videochain->ts_offset);
+ playsink->videochain->ts_offset = NULL;
+ }
+
+ if (playsink->videodeinterlacechain) {
+ add_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), FALSE);
+ }
+
+ if (playsink->video_pad)
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL);
+ }
+
+ if (need_audio) {
+ gboolean raw;
+
+ GST_DEBUG_OBJECT (playsink, "adding audio");
+
+ /* get a raw sink if we are asked for a raw pad */
+ raw = playsink->audio_pad_raw;
+
+ if (playsink->audiochain) {
+ /* try to reactivate the chain */
+ if (!setup_audio_chain (playsink, raw)) {
+ GST_DEBUG_OBJECT (playsink, "removing current audio chain");
+ if (playsink->audio_tee_asrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_asrc);
+ gst_object_unref (playsink->audio_tee_asrc);
+ playsink->audio_tee_asrc = NULL;
+ }
+
+ if (playsink->audio_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->audio_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->audio_sinkpad_stream_synchronizer);
+ playsink->audio_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->audio_srcpad_stream_synchronizer);
+ playsink->audio_srcpad_stream_synchronizer = NULL;
+ }
+
+ add_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+
+ /* Remove the sink from the bin to keep its state
+ * and unparent it to allow reuse */
+ if (playsink->audiochain->sink)
+ gst_bin_remove (GST_BIN_CAST (playsink->audiochain->chain.bin),
+ playsink->audiochain->sink);
+
+ activate_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ disconnect_chain (playsink->audiochain, playsink);
+ playsink->audiochain->volume = NULL;
+ playsink->audiochain->mute = NULL;
+ if (playsink->audiochain->ts_offset)
+ gst_object_unref (playsink->audiochain->ts_offset);
+ playsink->audiochain->ts_offset = NULL;
+ free_chain ((GstPlayChain *) playsink->audiochain);
+ playsink->audiochain = NULL;
+ playsink->volume_changed = playsink->mute_changed = FALSE;
+ }
+ }
+
+ if (!playsink->audiochain) {
+ GST_DEBUG_OBJECT (playsink, "creating new audio chain");
+ playsink->audiochain = gen_audio_chain (playsink, raw);
+ }
+
+ if (!playsink->audio_sinkpad_stream_synchronizer) {
+ GValue item = { 0, };
+ GstIterator *it;
+
+ playsink->audio_sinkpad_stream_synchronizer =
+ gst_element_get_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer), "sink_%d");
+ it = gst_pad_iterate_internal_links
+ (playsink->audio_sinkpad_stream_synchronizer);
+ g_assert (it);
+ gst_iterator_next (it, &item);
+ playsink->audio_srcpad_stream_synchronizer = g_value_dup_object (&item);
+ g_value_unset (&item);
+ g_assert (playsink->audio_srcpad_stream_synchronizer);
+ gst_iterator_free (it);
+ }
+
+ if (playsink->audiochain) {
+ GST_DEBUG_OBJECT (playsink, "adding audio chain");
+ if (playsink->audio_tee_asrc == NULL) {
+ playsink->audio_tee_asrc =
+ gst_element_get_request_pad (playsink->audio_tee, "src%d");
+ }
+ add_chain (GST_PLAY_CHAIN (playsink->audiochain), TRUE);
+ activate_chain (GST_PLAY_CHAIN (playsink->audiochain), TRUE);
+ gst_pad_link_full (playsink->audio_tee_asrc,
+ playsink->audio_sinkpad_stream_synchronizer,
+ GST_PAD_LINK_CHECK_NOTHING);
+ gst_pad_link_full (playsink->audio_srcpad_stream_synchronizer,
+ playsink->audiochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ }
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no audio needed");
+ /* we have no audio or we are requested to not play audio */
+ if (playsink->audiochain) {
+ GST_DEBUG_OBJECT (playsink, "removing audio chain");
+ /* release the audio pad */
+ if (playsink->audio_tee_asrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_asrc);
+ gst_object_unref (playsink->audio_tee_asrc);
+ playsink->audio_tee_asrc = NULL;
+ }
+
+ if (playsink->audio_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->audio_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->audio_sinkpad_stream_synchronizer);
+ playsink->audio_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->audio_srcpad_stream_synchronizer);
+ playsink->audio_srcpad_stream_synchronizer = NULL;
+ }
+
+ if (playsink->audiochain->sink_volume) {
+ disconnect_chain (playsink->audiochain, playsink);
+ playsink->audiochain->volume = NULL;
+ playsink->audiochain->mute = NULL;
+ if (playsink->audiochain->ts_offset)
+ gst_object_unref (playsink->audiochain->ts_offset);
+ playsink->audiochain->ts_offset = NULL;
+ }
+ add_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ }
+ }
+
+ if (need_vis) {
+ GstPad *srcpad;
+
+ if (!playsink->vischain)
+ playsink->vischain = gen_vis_chain (playsink);
+
+ GST_DEBUG_OBJECT (playsink, "adding visualisation");
+
+ if (playsink->vischain) {
+ GST_DEBUG_OBJECT (playsink, "setting up vis chain");
+ srcpad =
+ gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
+ add_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
+ activate_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
+ if (playsink->audio_tee_vissrc == NULL) {
+ playsink->audio_tee_vissrc =
+ gst_element_get_request_pad (playsink->audio_tee, "src%d");
+ }
+ gst_pad_link_full (playsink->audio_tee_vissrc,
+ playsink->vischain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_pad_link_full (srcpad, playsink->video_sinkpad_stream_synchronizer,
+ GST_PAD_LINK_CHECK_NOTHING);
+ gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
+ playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_object_unref (srcpad);
+ }
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no vis needed");
+ if (playsink->vischain) {
+ if (playsink->audio_tee_vissrc) {
+ gst_element_release_request_pad (playsink->audio_tee,
+ playsink->audio_tee_vissrc);
+ gst_object_unref (playsink->audio_tee_vissrc);
+ playsink->audio_tee_vissrc = NULL;
+ }
+ GST_DEBUG_OBJECT (playsink, "removing vis chain");
+ add_chain (GST_PLAY_CHAIN (playsink->vischain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->vischain), FALSE);
+ }
+ }
+
+ if (need_text) {
+ GST_DEBUG_OBJECT (playsink, "adding text");
+ if (!playsink->textchain) {
+ GST_DEBUG_OBJECT (playsink, "creating text chain");
+ playsink->textchain = gen_text_chain (playsink);
+ }
+ if (playsink->textchain) {
+ GstIterator *it;
+
+ GST_DEBUG_OBJECT (playsink, "adding text chain");
+ if (playsink->textchain->overlay)
+ g_object_set (G_OBJECT (playsink->textchain->overlay), "silent", FALSE,
+ NULL);
+ add_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+
+ if (!playsink->text_sinkpad_stream_synchronizer) {
+ GValue item = { 0, };
+
+ playsink->text_sinkpad_stream_synchronizer =
+ gst_element_get_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer), "sink_%d");
+ it = gst_pad_iterate_internal_links
+ (playsink->text_sinkpad_stream_synchronizer);
+ g_assert (it);
+ gst_iterator_next (it, &item);
+ playsink->text_srcpad_stream_synchronizer = g_value_dup_object (&item);
+ g_value_unset (&item);
+ g_assert (playsink->text_srcpad_stream_synchronizer);
+ gst_iterator_free (it);
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad),
+ playsink->text_sinkpad_stream_synchronizer);
+ gst_pad_link_full (playsink->text_srcpad_stream_synchronizer,
+ playsink->textchain->textsinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ }
+
+ if (need_vis) {
+ GstPad *srcpad;
+
+ srcpad =
+ gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
+ gst_pad_unlink (srcpad, playsink->videochain->sinkpad);
+ gst_pad_link_full (srcpad, playsink->textchain->videosinkpad,
+ GST_PAD_LINK_CHECK_NOTHING);
+ gst_object_unref (srcpad);
+ } else {
+ if (need_deinterlace)
+ gst_pad_link_full (playsink->videodeinterlacechain->srcpad,
+ playsink->textchain->videosinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ else
+ gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
+ playsink->textchain->videosinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ }
+ gst_pad_link_full (playsink->textchain->srcpad,
+ playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+
+ activate_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+ }
+ } else {
+ GST_DEBUG_OBJECT (playsink, "no text needed");
+ /* we have no subtitles/text or we are requested to not show them */
+
+ if (playsink->text_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->text_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->text_sinkpad_stream_synchronizer);
+ playsink->text_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->text_srcpad_stream_synchronizer);
+ playsink->text_srcpad_stream_synchronizer = NULL;
+ }
+
+ if (playsink->textchain) {
+ if (playsink->text_pad == NULL) {
+ /* no text pad, remove the chain entirely */
+ GST_DEBUG_OBJECT (playsink, "removing text chain");
+ add_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+ activate_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+ } else {
+ /* we have a chain and a textpad, turn the subtitles off */
+ GST_DEBUG_OBJECT (playsink, "turning off the text");
+ if (playsink->textchain->overlay)
+ g_object_set (G_OBJECT (playsink->textchain->overlay), "silent", TRUE,
+ NULL);
+ }
+ }
+ if (!need_video && playsink->video_pad) {
+ if (playsink->video_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->video_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->video_sinkpad_stream_synchronizer);
+ playsink->video_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->video_srcpad_stream_synchronizer);
+ playsink->video_srcpad_stream_synchronizer = NULL;
+ }
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL);
+ }
+
+ if (playsink->text_pad && !playsink->textchain)
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad), NULL);
+ }
+ update_av_offset (playsink);
+ do_async_done (playsink);
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return TRUE;
+
+ /* ERRORS */
+no_chain:
+ {
+ /* gen_ chain already posted error */
+ GST_DEBUG_OBJECT (playsink, "failed to setup chain");
+ GST_PLAY_SINK_UNLOCK (playsink);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_play_sink_set_flags:
+ * @playsink: a #GstPlaySink
+ * @flags: #GstPlayFlags
+ *
+ * Configure @flags on @playsink. The flags control the behaviour of @playsink
+ * when constructing the sink pipelins.
+ *
+ * Returns: TRUE if the flags could be configured.
+ */
+gboolean
+gst_play_sink_set_flags (GstPlaySink * playsink, GstPlayFlags flags)
+{
+ g_return_val_if_fail (GST_IS_PLAY_SINK (playsink), FALSE);
+
+ GST_OBJECT_LOCK (playsink);
+ playsink->flags = flags;
+ GST_OBJECT_UNLOCK (playsink);
+
+ return TRUE;
+}
+
+/**
+ * gst_play_sink_get_flags:
+ * @playsink: a #GstPlaySink
+ *
+ * Get the flags of @playsink. That flags control the behaviour of the sink when
+ * it constructs the sink pipelines.
+ *
+ * Returns: the currently configured #GstPlayFlags.
+ */
+GstPlayFlags
+gst_play_sink_get_flags (GstPlaySink * playsink)
+{
+ GstPlayFlags res;
+
+ g_return_val_if_fail (GST_IS_PLAY_SINK (playsink), 0);
+
+ GST_OBJECT_LOCK (playsink);
+ res = playsink->flags;
+ GST_OBJECT_UNLOCK (playsink);
+
+ return res;
+}
+
+void
+gst_play_sink_set_font_desc (GstPlaySink * playsink, const gchar * desc)
+{
+ GstPlayTextChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayTextChain *) playsink->textchain;
+ g_free (playsink->font_desc);
+ playsink->font_desc = g_strdup (desc);
+ if (chain && chain->overlay) {
+ g_object_set (chain->overlay, "font-desc", desc, NULL);
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gchar *
+gst_play_sink_get_font_desc (GstPlaySink * playsink)
+{
+ gchar *result = NULL;
+ GstPlayTextChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayTextChain *) playsink->textchain;
+ if (chain && chain->overlay) {
+ g_object_get (chain->overlay, "font-desc", &result, NULL);
+ playsink->font_desc = g_strdup (result);
+ } else {
+ result = g_strdup (playsink->font_desc);
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+void
+gst_play_sink_set_subtitle_encoding (GstPlaySink * playsink,
+ const gchar * encoding)
+{
+ GstPlayTextChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayTextChain *) playsink->textchain;
+ g_free (playsink->subtitle_encoding);
+ playsink->subtitle_encoding = g_strdup (encoding);
+ if (chain && chain->overlay) {
+ g_object_set (chain->overlay, "subtitle-encoding", encoding, NULL);
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gchar *
+gst_play_sink_get_subtitle_encoding (GstPlaySink * playsink)
+{
+ gchar *result = NULL;
+ GstPlayTextChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ chain = (GstPlayTextChain *) playsink->textchain;
+ if (chain && chain->overlay) {
+ g_object_get (chain->overlay, "subtitle-encoding", &result, NULL);
+ playsink->subtitle_encoding = g_strdup (result);
+ } else {
+ result = g_strdup (playsink->subtitle_encoding);
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+static void
+update_av_offset (GstPlaySink * playsink)
+{
+ gint64 av_offset;
+ GstPlayAudioChain *achain;
+ GstPlayVideoChain *vchain;
+
+ av_offset = playsink->av_offset;
+ achain = (GstPlayAudioChain *) playsink->audiochain;
+ vchain = (GstPlayVideoChain *) playsink->videochain;
+
+ if (achain && vchain && achain->ts_offset && vchain->ts_offset) {
+ g_object_set (achain->ts_offset, "ts-offset", MAX (0, -av_offset), NULL);
+ g_object_set (vchain->ts_offset, "ts-offset", MAX (0, av_offset), NULL);
+ } else {
+ GST_LOG_OBJECT (playsink, "no ts_offset elements");
+ }
+}
+
+void
+gst_play_sink_set_av_offset (GstPlaySink * playsink, gint64 av_offset)
+{
+ GST_PLAY_SINK_LOCK (playsink);
+ playsink->av_offset = av_offset;
+ update_av_offset (playsink);
+ GST_PLAY_SINK_UNLOCK (playsink);
+}
+
+gint64
+gst_play_sink_get_av_offset (GstPlaySink * playsink)
+{
+ gint64 result;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ result = playsink->av_offset;
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+/**
+ * gst_play_sink_get_last_frame:
+ * @playsink: a #GstPlaySink
+ *
+ * Get the last displayed frame from @playsink. This frame is in the native
+ * format of the sink element, the caps on the result buffer contain the format
+ * of the frame data.
+ *
+ * Returns: a #GstBuffer with the frame data or %NULL when no video frame is
+ * available.
+ */
+GstBuffer *
+gst_play_sink_get_last_frame (GstPlaySink * playsink)
+{
+ GstBuffer *result = NULL;
+ GstPlayVideoChain *chain;
+
+ GST_PLAY_SINK_LOCK (playsink);
+ GST_DEBUG_OBJECT (playsink, "taking last frame");
+ /* get the video chain if we can */
+ if ((chain = (GstPlayVideoChain *) playsink->videochain)) {
+ GST_DEBUG_OBJECT (playsink, "found video chain");
+ /* see if the chain is active */
+ if (chain->chain.activated && chain->sink) {
+ GstElement *elem;
+
+ GST_DEBUG_OBJECT (playsink, "video chain active and has a sink");
+
+ /* find and get the last-buffer property now */
+ if ((elem =
+ gst_play_sink_find_property (playsink, chain->sink,
+ "last-buffer", GST_TYPE_BUFFER))) {
+ GST_DEBUG_OBJECT (playsink, "getting last-buffer property");
+ g_object_get (elem, "last-buffer", &result, NULL);
+ gst_object_unref (elem);
+ }
+ }
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return result;
+}
+
+/**
+ * gst_play_sink_convert_frame:
+ * @playsink: a #GstPlaySink
+ * @caps: a #GstCaps
+ *
+ * Get the last displayed frame from @playsink. If caps is %NULL, the video will
+ * be in the native format of the sink element and the caps on the buffer
+ * describe the format of the frame. If @caps is not %NULL, the video
+ * frame will be converted to the format of the caps.
+ *
+ * Returns: a #GstBuffer with the frame data or %NULL when no video frame is
+ * available or when the conversion failed.
+ */
+GstBuffer *
+gst_play_sink_convert_frame (GstPlaySink * playsink, GstCaps * caps)
+{
+ GstBuffer *result;
+
+ result = gst_play_sink_get_last_frame (playsink);
+ if (result != NULL && caps != NULL) {
+ GstBuffer *temp;
+ GError *err = NULL;
+
+ /* FIXME, need to get the input buffer caps */
+ temp = gst_video_convert_frame (result, NULL, caps, 25 * GST_SECOND, &err);
+ gst_buffer_unref (result);
+ if (temp == NULL && err) {
+ /* I'm really uncertain whether we should make playsink post an error
+ * on the bus or not. It's not like it's a critical issue regarding
+ * playsink behaviour. */
+ GST_ERROR ("Error converting frame: %s", err->message);
+ }
+ result = temp;
+ }
+ return result;
+}
+
+static gboolean
+is_raw_structure (GstStructure * s)
+{
+ const gchar *name;
+
+ name = gst_structure_get_name (s);
+
+ if (g_str_has_prefix (name, "video/x-raw") ||
+ g_str_has_prefix (name, "audio/x-raw"))
+ return TRUE;
+ return FALSE;
+}
+
+static gboolean
+is_raw_pad (GstPad * pad)
+{
+ GstPad *peer = gst_pad_get_peer (pad);
+ GstCaps *caps;
+ gboolean raw = TRUE;
+
+ if (!peer)
+ return raw;
+
+ caps = gst_pad_get_current_caps (peer);
+ if (!caps) {
+ guint i, n;
+
+ caps = gst_pad_get_caps (peer, NULL);
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ gboolean r = is_raw_structure (gst_caps_get_structure (caps, i));
+
+ if (i == 0) {
+ raw = r;
+ } else if (raw != r) {
+ GST_ERROR_OBJECT (pad,
+ "Caps contains raw and non-raw structures: %" GST_PTR_FORMAT, caps);
+ raw = FALSE;
+ break;
+ }
+ }
+ } else {
+ raw = is_raw_structure (gst_caps_get_structure (caps, 0));
+ }
+ gst_caps_unref (caps);
+ gst_object_unref (peer);
+
+ return raw;
+}
+
+static GstProbeReturn
+sinkpad_blocked_cb (GstPad * blockedpad, GstProbeType type, gpointer type_data,
+ gpointer user_data);
+
+static void
+video_set_blocked (GstPlaySink * playsink, gboolean blocked)
+{
+ if (playsink->video_pad) {
+ GstPad *opad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
+ (playsink->video_pad)));
+ if (blocked && playsink->video_block_id == 0) {
+ playsink->video_block_id =
+ gst_pad_add_probe (opad, GST_PROBE_TYPE_BLOCK, sinkpad_blocked_cb,
+ gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
+ } else if (!blocked && playsink->video_block_id) {
+ gst_pad_remove_probe (opad, playsink->video_block_id);
+ PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_VIDEO_RAW);
+ PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_VIDEO);
+ playsink->video_block_id = 0;
+ playsink->video_pad_blocked = FALSE;
+ }
+ gst_object_unref (opad);
+ }
+}
+
+static void
+audio_set_blocked (GstPlaySink * playsink, gboolean blocked)
+{
+ if (playsink->audio_pad) {
+ GstPad *opad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
+ (playsink->audio_pad)));
+ if (blocked && playsink->audio_block_id == 0) {
+ playsink->audio_block_id =
+ gst_pad_add_probe (opad, GST_PROBE_TYPE_BLOCK, sinkpad_blocked_cb,
+ gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
+ } else if (!blocked && playsink->audio_block_id) {
+ gst_pad_remove_probe (opad, playsink->audio_block_id);
+ PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_AUDIO_RAW);
+ PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_AUDIO);
+ playsink->audio_block_id = 0;
+ playsink->audio_pad_blocked = FALSE;
+ }
+ gst_object_unref (opad);
+ }
+}
+
+static void
+text_set_blocked (GstPlaySink * playsink, gboolean blocked)
+{
+ if (playsink->text_pad) {
+ GstPad *opad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
+ (playsink->text_pad)));
+ if (blocked && playsink->text_block_id == 0) {
+ playsink->text_block_id =
+ gst_pad_add_probe (opad, GST_PROBE_TYPE_BLOCK, sinkpad_blocked_cb,
+ gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
+ } else if (!blocked && playsink->text_block_id) {
+ gst_pad_remove_probe (opad, playsink->text_block_id);
+ PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_TEXT);
+ playsink->text_block_id = 0;
+ playsink->text_pad_blocked = FALSE;
+ }
+ gst_object_unref (opad);
+ }
+}
+
+static GstProbeReturn
+sinkpad_blocked_cb (GstPad * blockedpad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstPlaySink *playsink = (GstPlaySink *) user_data;
+ GstPad *pad;
+
+ GST_PLAY_SINK_LOCK (playsink);
+
+ pad = GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (blockedpad)));
+ if (pad == playsink->video_pad) {
+ playsink->video_pad_blocked = TRUE;
+ GST_DEBUG_OBJECT (pad, "Video pad blocked");
+ } else if (pad == playsink->audio_pad) {
+ playsink->audio_pad_blocked = TRUE;
+ GST_DEBUG_OBJECT (pad, "Audio pad blocked");
+ } else if (pad == playsink->text_pad) {
+ playsink->text_pad_blocked = TRUE;
+ GST_DEBUG_OBJECT (pad, "Text pad blocked");
+ }
+
+ /* We reconfigure when for ALL streams:
+ * * there isn't a pad
+ * * OR the pad is blocked
+ * * OR there are no pending blocks on that pad
+ */
+
+ if ((!playsink->video_pad || playsink->video_pad_blocked
+ || !PENDING_VIDEO_BLOCK (playsink)) && (!playsink->audio_pad
+ || playsink->audio_pad_blocked || !PENDING_AUDIO_BLOCK (playsink))
+ && (!playsink->text_pad || playsink->text_pad_blocked
+ || !PENDING_TEXT_BLOCK (playsink))) {
+ GST_DEBUG_OBJECT (playsink, "All pads blocked -- reconfiguring");
+
+ if (playsink->video_pad) {
+ playsink->video_pad_raw = is_raw_pad (playsink->video_pad);
+ GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d",
+ playsink->video_pad_raw);
+ }
+
+ if (playsink->audio_pad) {
+ playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad);
+ GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d",
+ playsink->audio_pad_raw);
+ }
+
+ gst_play_sink_reconfigure (playsink);
+
+ video_set_blocked (playsink, FALSE);
+ audio_set_blocked (playsink, FALSE);
+ text_set_blocked (playsink, FALSE);
+ }
+
+ gst_object_unref (pad);
+
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ return GST_PROBE_OK;
+}
+
+static void
+caps_notify_cb (GstPad * pad, GParamSpec * unused, GstPlaySink * playsink)
+{
+ gboolean reconfigure = FALSE;
+ GstCaps *caps;
+ gboolean raw;
+
+ g_object_get (pad, "caps", &caps, NULL);
+ if (!caps)
+ return;
+
+ if (pad == playsink->audio_pad) {
+ raw = is_raw_pad (pad);
+ reconfigure = (! !playsink->audio_pad_raw != ! !raw)
+ && playsink->audiochain;
+ GST_DEBUG_OBJECT (pad,
+ "Audio caps changed: raw %d reconfigure %d caps %" GST_PTR_FORMAT, raw,
+ reconfigure, caps);
+ } else if (pad == playsink->video_pad) {
+ raw = is_raw_pad (pad);
+ reconfigure = (! !playsink->video_pad_raw != ! !raw)
+ && playsink->videochain;
+ GST_DEBUG_OBJECT (pad,
+ "Video caps changed: raw %d reconfigure %d caps %" GST_PTR_FORMAT, raw,
+ reconfigure, caps);
+ }
+
+ gst_caps_unref (caps);
+
+ if (reconfigure) {
+ GST_PLAY_SINK_LOCK (playsink);
+ video_set_blocked (playsink, TRUE);
+ audio_set_blocked (playsink, TRUE);
+ text_set_blocked (playsink, TRUE);
+ GST_PLAY_SINK_UNLOCK (playsink);
+ }
+}
+
+/**
+ * gst_play_sink_request_pad
+ * @playsink: a #GstPlaySink
+ * @type: a #GstPlaySinkType
+ *
+ * Create or return a pad of @type.
+ *
+ * Returns: a #GstPad of @type or %NULL when the pad could not be created.
+ */
+GstPad *
+gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
+{
+ GstPad *res = NULL;
+ gboolean created = FALSE;
+ gboolean activate = TRUE;
+ const gchar *pad_name = NULL;
+ gulong *block_id = NULL;
+
+ GST_DEBUG_OBJECT (playsink, "request pad type %d", type);
+
+ GST_PLAY_SINK_LOCK (playsink);
+ switch (type) {
+ case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+ case GST_PLAY_SINK_TYPE_AUDIO:
+ pad_name = "audio_sink";
+ if (!playsink->audio_tee) {
+ GST_LOG_OBJECT (playsink, "creating tee");
+ /* create tee when needed. This element will feed the audio sink chain
+ * and the vis chain. */
+ playsink->audio_tee = gst_element_factory_make ("tee", "audiotee");
+ if (playsink->audio_tee == NULL) {
+ post_missing_element_message (playsink, "tee");
+ GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "tee"), (NULL));
+ res = NULL;
+ break;
+ } else {
+ playsink->audio_tee_sink =
+ gst_element_get_static_pad (playsink->audio_tee, "sink");
+ gst_bin_add (GST_BIN_CAST (playsink), playsink->audio_tee);
+ gst_element_set_state (playsink->audio_tee, GST_STATE_PAUSED);
+ }
+ } else {
+ gst_element_set_state (playsink->audio_tee, GST_STATE_PAUSED);
+ }
+ if (!playsink->audio_pad) {
+ GST_LOG_OBJECT (playsink, "ghosting tee sinkpad");
+ playsink->audio_pad =
+ gst_ghost_pad_new (pad_name, playsink->audio_tee_sink);
+ g_signal_connect (G_OBJECT (playsink->audio_pad), "notify::caps",
+ G_CALLBACK (caps_notify_cb), playsink);
+ created = TRUE;
+ }
+ playsink->audio_pad_raw = FALSE;
+ res = playsink->audio_pad;
+ block_id = &playsink->audio_block_id;
+ break;
+ case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+ case GST_PLAY_SINK_TYPE_VIDEO:
+ pad_name = "video_sink";
+ if (!playsink->video_pad) {
+ GST_LOG_OBJECT (playsink, "ghosting videosink");
+ playsink->video_pad =
+ gst_ghost_pad_new_no_target (pad_name, GST_PAD_SINK);
+ g_signal_connect (G_OBJECT (playsink->video_pad), "notify::caps",
+ G_CALLBACK (caps_notify_cb), playsink);
+ created = TRUE;
+ }
+ playsink->video_pad_raw = FALSE;
+ res = playsink->video_pad;
+ block_id = &playsink->video_block_id;
+ break;
+ case GST_PLAY_SINK_TYPE_TEXT:
+ GST_LOG_OBJECT (playsink, "ghosting text");
+ if (!playsink->text_pad) {
+ playsink->text_pad =
+ gst_ghost_pad_new_no_target ("text_sink", GST_PAD_SINK);
+ created = TRUE;
+ }
+ res = playsink->text_pad;
+ block_id = &playsink->text_block_id;
+ break;
+ case GST_PLAY_SINK_TYPE_FLUSHING:
+ {
+ gchar *padname;
+
+ /* we need a unique padname for the flushing pad. */
+ padname = g_strdup_printf ("flushing_%d", playsink->count);
+ res = gst_ghost_pad_new_no_target (padname, GST_PAD_SINK);
+ g_free (padname);
+ playsink->count++;
+ activate = FALSE;
+ created = TRUE;
+ break;
+ }
+ default:
+ res = NULL;
+ break;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ if (created && res) {
+ /* we have to add the pad when it's active or we get an error when the
+ * element is 'running' */
+ gst_pad_set_active (res, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (playsink), res);
+ if (block_id && *block_id == 0) {
+ GstPad *blockpad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (res)));
+
+ *block_id =
+ gst_pad_add_probe (blockpad, GST_PROBE_TYPE_BLOCK, sinkpad_blocked_cb,
+ gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
+ PENDING_FLAG_SET (playsink, type);
+ gst_object_unref (blockpad);
+ }
+ if (!activate)
+ gst_pad_set_active (res, activate);
+ }
+
+ return res;
+}
+
+static GstPad *
+gst_play_sink_request_new_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * name, const GstCaps * caps)
+{
+ GstPlaySink *psink;
+ GstPad *pad;
+ GstPlaySinkType type;
+ const gchar *tplname;
+
+ g_return_val_if_fail (templ != NULL, NULL);
+
+ GST_DEBUG_OBJECT (element, "name:%s", name);
+
+ psink = GST_PLAY_SINK (element);
+ tplname = GST_PAD_TEMPLATE_NAME_TEMPLATE (templ);
+
+ /* Figure out the GstPlaySinkType based on the template */
+ if (!strcmp (tplname, "audio_sink"))
+ type = GST_PLAY_SINK_TYPE_AUDIO;
+ else if (!strcmp (tplname, "audio_raw_sink"))
+ type = GST_PLAY_SINK_TYPE_AUDIO_RAW;
+ else if (!strcmp (tplname, "video_sink"))
+ type = GST_PLAY_SINK_TYPE_VIDEO;
+ else if (!strcmp (tplname, "video_raw_sink"))
+ type = GST_PLAY_SINK_TYPE_VIDEO_RAW;
+ else if (!strcmp (tplname, "text_sink"))
+ type = GST_PLAY_SINK_TYPE_TEXT;
+ else
+ goto unknown_template;
+
+ pad = gst_play_sink_request_pad (psink, type);
+ return pad;
+
+unknown_template:
+ GST_WARNING_OBJECT (element, "Unknown pad template");
+ return NULL;
+}
+
+void
+gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad)
+{
+ GstPad **res = NULL;
+ gboolean untarget = TRUE;
+
+ GST_DEBUG_OBJECT (playsink, "release pad %" GST_PTR_FORMAT, pad);
+
+ GST_PLAY_SINK_LOCK (playsink);
+ if (pad == playsink->video_pad) {
+ res = &playsink->video_pad;
+ g_signal_handlers_disconnect_by_func (playsink->video_pad, caps_notify_cb,
+ playsink);
+ } else if (pad == playsink->audio_pad) {
+ res = &playsink->audio_pad;
+ g_signal_handlers_disconnect_by_func (playsink->audio_pad, caps_notify_cb,
+ playsink);
+ } else if (pad == playsink->text_pad) {
+ res = &playsink->text_pad;
+ } else {
+ /* try to release the given pad anyway, these could be the FLUSHING pads. */
+ res = &pad;
+ untarget = FALSE;
+ }
+ GST_PLAY_SINK_UNLOCK (playsink);
+
+ if (*res) {
+ GST_DEBUG_OBJECT (playsink, "deactivate pad %" GST_PTR_FORMAT, *res);
+ gst_pad_set_active (*res, FALSE);
+ if (untarget) {
+ GST_DEBUG_OBJECT (playsink, "untargeting pad %" GST_PTR_FORMAT, *res);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (*res), NULL);
+ }
+ GST_DEBUG_OBJECT (playsink, "remove pad %" GST_PTR_FORMAT, *res);
+ gst_element_remove_pad (GST_ELEMENT_CAST (playsink), *res);
+ *res = NULL;
+ }
+}
+
+static void
+gst_play_sink_release_request_pad (GstElement * element, GstPad * pad)
+{
+ GstPlaySink *psink = GST_PLAY_SINK (element);
+
+ gst_play_sink_release_pad (psink, pad);
+}
+
+static void
+gst_play_sink_handle_message (GstBin * bin, GstMessage * message)
+{
+ GstPlaySink *playsink;
+
+ playsink = GST_PLAY_SINK_CAST (bin);
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_STEP_DONE:
+ {
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush, intermediate, eos;
+ guint64 duration;
+
+ GST_INFO_OBJECT (playsink, "Handling step-done message");
+ gst_message_parse_step_done (message, &format, &amount, &rate, &flush,
+ &intermediate, &duration, &eos);
+
+ if (format == GST_FORMAT_BUFFERS) {
+ /* for the buffer format, we align the other streams */
+ if (playsink->audiochain) {
+ GstEvent *event;
+
+ event =
+ gst_event_new_step (GST_FORMAT_TIME, duration, rate, flush,
+ intermediate);
+
+ if (!gst_element_send_event (playsink->audiochain->chain.bin, event)) {
+ GST_DEBUG_OBJECT (playsink, "Event failed when sent to audio sink");
+ }
+ }
+ }
+ GST_BIN_CLASS (gst_play_sink_parent_class)->handle_message (bin, message);
+ break;
+ }
+ default:
+ GST_BIN_CLASS (gst_play_sink_parent_class)->handle_message (bin, message);
+ break;
+ }
+}
+
+/* Send an event to our sinks until one of them works; don't then send to the
+ * remaining sinks (unlike GstBin)
+ * Special case: If a text sink is set we need to send the event
+ * to them in case it's source is different from the a/v stream's source.
+ */
+static gboolean
+gst_play_sink_send_event_to_sink (GstPlaySink * playsink, GstEvent * event)
+{
+ gboolean res = TRUE;
+
+ if (playsink->textchain && playsink->textchain->sink) {
+ gst_event_ref (event);
+ if ((res = gst_element_send_event (playsink->textchain->chain.bin, event))) {
+ GST_DEBUG_OBJECT (playsink, "Sent event succesfully to text sink");
+ } else {
+ GST_DEBUG_OBJECT (playsink, "Event failed when sent to text sink");
+ }
+ }
+
+ if (playsink->videochain) {
+ gst_event_ref (event);
+ if ((res = gst_element_send_event (playsink->videochain->chain.bin, event))) {
+ GST_DEBUG_OBJECT (playsink, "Sent event succesfully to video sink");
+ goto done;
+ }
+ GST_DEBUG_OBJECT (playsink, "Event failed when sent to video sink");
+ }
+ if (playsink->audiochain) {
+ gst_event_ref (event);
+ if ((res = gst_element_send_event (playsink->audiochain->chain.bin, event))) {
+ GST_DEBUG_OBJECT (playsink, "Sent event succesfully to audio sink");
+ goto done;
+ }
+ GST_DEBUG_OBJECT (playsink, "Event failed when sent to audio sink");
+ }
+
+done:
+ gst_event_unref (event);
+ return res;
+}
+
+/* We only want to send the event to a single sink (overriding GstBin's
+ * behaviour), but we want to keep GstPipeline's behaviour - wrapping seek
+ * events appropriately. So, this is a messy duplication of code. */
+static gboolean
+gst_play_sink_send_event (GstElement * element, GstEvent * event)
+{
+ gboolean res = FALSE;
+ GstEventType event_type = GST_EVENT_TYPE (event);
+ GstPlaySink *playsink;
+
+ playsink = GST_PLAY_SINK_CAST (element);
+
+ switch (event_type) {
+ case GST_EVENT_SEEK:
+ GST_DEBUG_OBJECT (element, "Sending event to a sink");
+ res = gst_play_sink_send_event_to_sink (playsink, event);
+ break;
+ case GST_EVENT_STEP:
+ {
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush, intermediate;
+
+ gst_event_parse_step (event, &format, &amount, &rate, &flush,
+ &intermediate);
+
+ if (format == GST_FORMAT_BUFFERS) {
+ /* for buffers, we will try to step video frames, for other formats we
+ * send the step to all sinks */
+ res = gst_play_sink_send_event_to_sink (playsink, event);
+ } else {
+ res =
+ GST_ELEMENT_CLASS (gst_play_sink_parent_class)->send_event (element,
+ event);
+ }
+ break;
+ }
+ default:
+ res =
+ GST_ELEMENT_CLASS (gst_play_sink_parent_class)->send_event (element,
+ event);
+ break;
+ }
+ return res;
+}
+
+static GstStateChangeReturn
+gst_play_sink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstStateChangeReturn bret;
+
+ GstPlaySink *playsink;
+
+ playsink = GST_PLAY_SINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ playsink->need_async_start = TRUE;
+ /* we want to go async to PAUSED until we managed to configure and add the
+ * sinks */
+ do_async_start (playsink);
+ ret = GST_STATE_CHANGE_ASYNC;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ /* unblock all pads here */
+ GST_PLAY_SINK_LOCK (playsink);
+ video_set_blocked (playsink, FALSE);
+ audio_set_blocked (playsink, FALSE);
+ text_set_blocked (playsink, FALSE);
+ GST_PLAY_SINK_UNLOCK (playsink);
+ /* fall through */
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ if (playsink->audiochain && playsink->audiochain->sink_volume) {
+ /* remove our links to the mute and volume elements when they were
+ * provided by a sink */
+ disconnect_chain (playsink->audiochain, playsink);
+ playsink->audiochain->volume = NULL;
+ playsink->audiochain->mute = NULL;
+ }
+
+ if (playsink->audiochain && playsink->audiochain->ts_offset) {
+ gst_object_unref (playsink->audiochain->ts_offset);
+ playsink->audiochain->ts_offset = NULL;
+ }
+
+ if (playsink->videochain && playsink->videochain->ts_offset) {
+ gst_object_unref (playsink->videochain->ts_offset);
+ playsink->videochain->ts_offset = NULL;
+ }
+ ret = GST_STATE_CHANGE_SUCCESS;
+ break;
+ default:
+ /* all other state changes return SUCCESS by default, this value can be
+ * overridden by the result of the children */
+ ret = GST_STATE_CHANGE_SUCCESS;
+ break;
+ }
+
+ /* do the state change of the children */
+ bret =
+ GST_ELEMENT_CLASS (gst_play_sink_parent_class)->change_state (element,
+ transition);
+ /* now look at the result of our children and adjust the return value */
+ switch (bret) {
+ case GST_STATE_CHANGE_FAILURE:
+ /* failure, we stop */
+ goto activate_failed;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* some child returned NO_PREROLL. This is strange but we never know. We
+ * commit our async state change (if any) and return the NO_PREROLL */
+ do_async_done (playsink);
+ ret = bret;
+ break;
+ case GST_STATE_CHANGE_ASYNC:
+ /* some child was async, return this */
+ ret = bret;
+ break;
+ default:
+ /* return our previously configured return value */
+ break;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ /* FIXME Release audio device when we implement that */
+ playsink->need_async_start = TRUE;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ if (playsink->video_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->video_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->video_sinkpad_stream_synchronizer);
+ playsink->video_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->video_srcpad_stream_synchronizer);
+ playsink->video_srcpad_stream_synchronizer = NULL;
+ }
+ if (playsink->audio_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->audio_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->audio_sinkpad_stream_synchronizer);
+ playsink->audio_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->audio_srcpad_stream_synchronizer);
+ playsink->audio_srcpad_stream_synchronizer = NULL;
+ }
+ if (playsink->text_sinkpad_stream_synchronizer) {
+ gst_element_release_request_pad (GST_ELEMENT_CAST
+ (playsink->stream_synchronizer),
+ playsink->text_sinkpad_stream_synchronizer);
+ gst_object_unref (playsink->text_sinkpad_stream_synchronizer);
+ playsink->text_sinkpad_stream_synchronizer = NULL;
+ gst_object_unref (playsink->text_srcpad_stream_synchronizer);
+ playsink->text_srcpad_stream_synchronizer = NULL;
+ }
+ }
+ /* fall through */
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ /* remove sinks we added */
+ if (playsink->videodeinterlacechain) {
+ activate_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain),
+ FALSE);
+ add_chain (GST_PLAY_CHAIN (playsink->videodeinterlacechain), FALSE);
+ }
+ if (playsink->videochain) {
+ activate_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+ add_chain (GST_PLAY_CHAIN (playsink->videochain), FALSE);
+ }
+ if (playsink->audiochain) {
+ activate_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ add_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ }
+ if (playsink->vischain) {
+ activate_chain (GST_PLAY_CHAIN (playsink->vischain), FALSE);
+ add_chain (GST_PLAY_CHAIN (playsink->vischain), FALSE);
+ }
+ if (playsink->textchain) {
+ activate_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+ add_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+ }
+ do_async_done (playsink);
+ /* when going to READY, keep elements around as long as possible,
+ * so they may be re-used faster next time/url around.
+ * when really going to NULL, clean up everything completely. */
+ if (transition == GST_STATE_CHANGE_READY_TO_NULL) {
+
+ /* Unparent the sinks to allow reuse */
+ if (playsink->videochain && playsink->videochain->sink)
+ gst_bin_remove (GST_BIN_CAST (playsink->videochain->chain.bin),
+ playsink->videochain->sink);
+ if (playsink->audiochain && playsink->audiochain->sink)
+ gst_bin_remove (GST_BIN_CAST (playsink->audiochain->chain.bin),
+ playsink->audiochain->sink);
+ if (playsink->textchain && playsink->textchain->sink)
+ gst_bin_remove (GST_BIN_CAST (playsink->textchain->chain.bin),
+ playsink->textchain->sink);
+
+ if (playsink->audio_sink != NULL)
+ gst_element_set_state (playsink->audio_sink, GST_STATE_NULL);
+ if (playsink->video_sink != NULL)
+ gst_element_set_state (playsink->video_sink, GST_STATE_NULL);
+ if (playsink->visualisation != NULL)
+ gst_element_set_state (playsink->visualisation, GST_STATE_NULL);
+ if (playsink->text_sink != NULL)
+ gst_element_set_state (playsink->text_sink, GST_STATE_NULL);
+
+ free_chain ((GstPlayChain *) playsink->videodeinterlacechain);
+ playsink->videodeinterlacechain = NULL;
+ free_chain ((GstPlayChain *) playsink->videochain);
+ playsink->videochain = NULL;
+ free_chain ((GstPlayChain *) playsink->audiochain);
+ playsink->audiochain = NULL;
+ free_chain ((GstPlayChain *) playsink->vischain);
+ playsink->vischain = NULL;
+ free_chain ((GstPlayChain *) playsink->textchain);
+ playsink->textchain = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+ return ret;
+
+ /* ERRORS */
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (element,
+ "element failed to change states -- activation problem?");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+static void
+gst_play_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * spec)
+{
+ GstPlaySink *playsink = GST_PLAY_SINK (object);
+
+ switch (prop_id) {
+ case PROP_FLAGS:
+ gst_play_sink_set_flags (playsink, g_value_get_flags (value));
+ break;
+ case PROP_VOLUME:
+ gst_play_sink_set_volume (playsink, g_value_get_double (value));
+ break;
+ case PROP_MUTE:
+ gst_play_sink_set_mute (playsink, g_value_get_boolean (value));
+ break;
+ case PROP_FONT_DESC:
+ gst_play_sink_set_font_desc (playsink, g_value_get_string (value));
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ gst_play_sink_set_subtitle_encoding (playsink,
+ g_value_get_string (value));
+ break;
+ case PROP_VIS_PLUGIN:
+ gst_play_sink_set_vis_plugin (playsink, g_value_get_object (value));
+ break;
+ case PROP_AV_OFFSET:
+ gst_play_sink_set_av_offset (playsink, g_value_get_int64 (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, spec);
+ break;
+ }
+}
+
+static void
+gst_play_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * spec)
+{
+ GstPlaySink *playsink = GST_PLAY_SINK (object);
+
+ switch (prop_id) {
+ case PROP_FLAGS:
+ g_value_set_flags (value, gst_play_sink_get_flags (playsink));
+ break;
+ case PROP_VOLUME:
+ g_value_set_double (value, gst_play_sink_get_volume (playsink));
+ break;
+ case PROP_MUTE:
+ g_value_set_boolean (value, gst_play_sink_get_mute (playsink));
+ break;
+ case PROP_FONT_DESC:
+ g_value_take_string (value, gst_play_sink_get_font_desc (playsink));
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ g_value_take_string (value,
+ gst_play_sink_get_subtitle_encoding (playsink));
+ break;
+ case PROP_VIS_PLUGIN:
+ g_value_take_object (value, gst_play_sink_get_vis_plugin (playsink));
+ break;
+ case PROP_FRAME:
+ gst_value_take_buffer (value, gst_play_sink_get_last_frame (playsink));
+ break;
+ case PROP_AV_OFFSET:
+ g_value_set_int64 (value, gst_play_sink_get_av_offset (playsink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, spec);
+ break;
+ }
+}
+
+
+gboolean
+gst_play_sink_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_play_sink_debug, "playsink", 0, "play bin");
+
+ return gst_element_register (plugin, "playsink", GST_RANK_NONE,
+ GST_TYPE_PLAY_SINK);
+}
diff --git a/gst/playback/gstplaysink.h b/gst/playback/gstplaysink.h
new file mode 100644
index 0000000..6759ea4
--- /dev/null
+++ b/gst/playback/gstplaysink.h
@@ -0,0 +1,113 @@
+/* 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 __GST_PLAY_SINK_H__
+#define __GST_PLAY_SINK_H__
+
+#include <gst/gst.h>
+
+#include "gstplay-enum.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PLAY_SINK \
+ (gst_play_sink_get_type())
+#define GST_PLAY_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY_SINK, GstPlaySink))
+#define GST_PLAY_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY_SINK, GstPlaySinkClass))
+#define GST_IS_PLAY_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAY_SINK))
+#define GST_IS_PLAY_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK))
+#define GST_PLAY_SINK_CAST(obj) \
+ ((GstPlaySink*)(obj))
+
+/**
+ * GstPlaySinkType:
+ * @GST_PLAY_SINK_TYPE_AUDIO: an audio pad
+ * @GST_PLAY_SINK_TYPE_AUDIO_RAW: a raw audio pad. Deprecated.
+ * @GST_PLAY_SINK_TYPE_VIDEO: a video pad
+ * @GST_PLAY_SINK_TYPE_VIDEO_RAW: a raw video pad. Deprecated.
+ * @GST_PLAY_SINK_TYPE_TEXT: a text pad
+ * @GST_PLAY_SINK_TYPE_LAST: the last type
+ * @GST_PLAY_SINK_TYPE_FLUSHING: a flushing pad, used when shutting down
+ *
+ * Types of pads that can be requested from the sinks.
+ */
+typedef enum {
+ GST_PLAY_SINK_TYPE_AUDIO = 0,
+ GST_PLAY_SINK_TYPE_AUDIO_RAW = 1,
+ GST_PLAY_SINK_TYPE_VIDEO = 2,
+ GST_PLAY_SINK_TYPE_VIDEO_RAW = 3,
+ GST_PLAY_SINK_TYPE_TEXT = 4,
+ GST_PLAY_SINK_TYPE_LAST = 5,
+
+ /* this is a dummy pad */
+ GST_PLAY_SINK_TYPE_FLUSHING = 6
+} GstPlaySinkType;
+
+typedef struct _GstPlaySink GstPlaySink;
+typedef struct _GstPlaySinkClass GstPlaySinkClass;
+
+GType gst_play_sink_get_type (void);
+
+GstPad * gst_play_sink_request_pad (GstPlaySink *playsink, GstPlaySinkType type);
+void gst_play_sink_release_pad (GstPlaySink *playsink, GstPad *pad);
+
+void gst_play_sink_set_sink (GstPlaySink * playsink, GstPlaySinkType type, GstElement * sink);
+GstElement * gst_play_sink_get_sink (GstPlaySink * playsink, GstPlaySinkType type);
+
+void gst_play_sink_set_vis_plugin (GstPlaySink * playsink, GstElement * vis);
+GstElement * gst_play_sink_get_vis_plugin (GstPlaySink * playsink);
+
+void gst_play_sink_set_volume (GstPlaySink *playsink, gdouble volume);
+gdouble gst_play_sink_get_volume (GstPlaySink *playsink);
+
+void gst_play_sink_set_mute (GstPlaySink *playsink, gboolean mute);
+gboolean gst_play_sink_get_mute (GstPlaySink *playsink);
+
+gboolean gst_play_sink_set_flags (GstPlaySink * playsink, GstPlayFlags flags);
+GstPlayFlags gst_play_sink_get_flags (GstPlaySink * playsink);
+
+void gst_play_sink_set_font_desc (GstPlaySink *playsink, const gchar * desc);
+gchar * gst_play_sink_get_font_desc (GstPlaySink *playsink);
+void gst_play_sink_set_subtitle_encoding (GstPlaySink *playsink, const gchar * encoding);
+gchar * gst_play_sink_get_subtitle_encoding (GstPlaySink *playsink);
+
+void gst_play_sink_set_av_offset (GstPlaySink *playsink, gint64 av_offset);
+gint64 gst_play_sink_get_av_offset (GstPlaySink *playsink);
+
+GstBuffer * gst_play_sink_get_last_frame (GstPlaySink * playsink);
+GstBuffer * gst_play_sink_convert_frame (GstPlaySink * playsink, GstCaps * caps);
+
+gboolean gst_play_sink_reconfigure (GstPlaySink * playsink);
+
+gboolean gst_play_sink_plugin_init (GstPlugin * plugin);
+
+void
+gst_play_marshal_BUFFER__BOXED (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);
+
+G_END_DECLS
+
+#endif /* __GST_PLAY_SINK_H__ */
diff --git a/gst/playback/gstplaysinkaudioconvert.c b/gst/playback/gstplaysinkaudioconvert.c
new file mode 100644
index 0000000..08f356e
--- /dev/null
+++ b/gst/playback/gstplaysinkaudioconvert.c
@@ -0,0 +1,498 @@
+/* GStreamer
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplaysinkaudioconvert.h"
+
+#include <gst/pbutils/pbutils.h>
+#include <gst/gst-i18n-plugin.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_play_sink_audio_convert_debug);
+#define GST_CAT_DEFAULT gst_play_sink_audio_convert_debug
+
+#define parent_class gst_play_sink_audio_convert_parent_class
+
+G_DEFINE_TYPE (GstPlaySinkAudioConvert, gst_play_sink_audio_convert,
+ GST_TYPE_BIN);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+is_raw_caps (GstCaps * caps)
+{
+ gint i, n;
+ GstStructure *s;
+ const gchar *name;
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ s = gst_caps_get_structure (caps, i);
+ name = gst_structure_get_name (s);
+ if (!g_str_has_prefix (name, "audio/x-raw"))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+post_missing_element_message (GstPlaySinkAudioConvert * self,
+ const gchar * name)
+{
+ GstMessage *msg;
+
+ msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), name);
+ gst_element_post_message (GST_ELEMENT_CAST (self), msg);
+}
+
+static GstProbeReturn
+pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstPlaySinkAudioConvert *self = user_data;
+ GstPad *peer;
+ GstCaps *caps;
+ gboolean raw;
+
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Pad blocked");
+
+ /* There must be a peer at this point */
+ peer = gst_pad_get_peer (self->sinkpad);
+ caps = gst_pad_get_current_caps (peer);
+ if (!caps)
+ caps = gst_pad_get_caps (peer, NULL);
+ gst_object_unref (peer);
+
+ raw = is_raw_caps (caps);
+ GST_DEBUG_OBJECT (self, "Caps %" GST_PTR_FORMAT " are raw: %d", caps, raw);
+ gst_caps_unref (caps);
+
+ if (raw == self->raw)
+ goto unblock;
+ self->raw = raw;
+
+ if (raw) {
+ GstBin *bin = GST_BIN_CAST (self);
+ GstElement *head = NULL, *prev = NULL;
+ GstPad *pad;
+
+ GST_DEBUG_OBJECT (self, "Creating raw conversion pipeline");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+
+ if (self->use_converters) {
+ self->conv = gst_element_factory_make ("audioconvert", "conv");
+ if (self->conv == NULL) {
+ post_missing_element_message (self, "audioconvert");
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "audioconvert"), ("audio rendering might fail"));
+ } else {
+ gst_bin_add (bin, self->conv);
+ gst_element_sync_state_with_parent (self->conv);
+ prev = head = self->conv;
+ }
+
+ self->resample = gst_element_factory_make ("audioresample", "resample");
+ if (self->resample == NULL) {
+ post_missing_element_message (self, "audioresample");
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "audioresample"), ("possibly a liboil version mismatch?"));
+ } else {
+ gst_bin_add (bin, self->resample);
+ gst_element_sync_state_with_parent (self->resample);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", self->resample, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = self->resample;
+ }
+ prev = self->resample;
+ }
+ }
+
+ if (self->use_volume && self->volume) {
+ gst_bin_add (bin, gst_object_ref (self->volume));
+ gst_element_sync_state_with_parent (self->volume);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", self->volume, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = self->volume;
+ }
+ prev = self->volume;
+ }
+
+ if (head) {
+ pad = gst_element_get_static_pad (head, "sink");
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), pad);
+ gst_object_unref (pad);
+ }
+
+ if (prev) {
+ pad = gst_element_get_static_pad (prev, "src");
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), pad);
+ gst_object_unref (pad);
+ }
+
+ if (!head && !prev) {
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ }
+
+ GST_DEBUG_OBJECT (self, "Raw conversion pipeline created");
+ } else {
+ GstBin *bin = GST_BIN_CAST (self);
+
+ GST_DEBUG_OBJECT (self, "Removing raw conversion pipeline");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+
+ if (self->conv) {
+ gst_element_set_state (self->conv, GST_STATE_NULL);
+ gst_bin_remove (bin, self->conv);
+ self->conv = NULL;
+ }
+ if (self->resample) {
+ gst_element_set_state (self->resample, GST_STATE_NULL);
+ gst_bin_remove (bin, self->resample);
+ self->resample = NULL;
+ }
+ if (self->volume) {
+ gst_element_set_state (self->volume, GST_STATE_NULL);
+ if (GST_OBJECT_PARENT (self->volume) == GST_OBJECT_CAST (self)) {
+ gst_bin_remove (GST_BIN_CAST (self), self->volume);
+ }
+ }
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+
+ GST_DEBUG_OBJECT (self, "Raw conversion pipeline removed");
+ }
+
+unblock:
+ self->sink_proxypad_block_id = 0;
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+
+ return GST_PROBE_REMOVE;
+
+link_failed:
+ {
+ GST_ELEMENT_ERROR (self, CORE, PAD,
+ (NULL), ("Failed to configure the audio converter."));
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ self->sink_proxypad_block_id = 0;
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+
+ return GST_PROBE_REMOVE;
+ }
+}
+
+static void
+block_proxypad (GstPlaySinkAudioConvert * self)
+{
+ if (self->sink_proxypad_block_id == 0) {
+ self->sink_proxypad_block_id =
+ gst_pad_add_probe (self->sink_proxypad, GST_PROBE_TYPE_BLOCK,
+ pad_blocked_cb, gst_object_ref (self),
+ (GDestroyNotify) gst_object_unref);
+ }
+}
+
+static void
+unblock_proxypad (GstPlaySinkAudioConvert * self)
+{
+ if (self->sink_proxypad_block_id != 0) {
+ gst_pad_remove_probe (self->sink_proxypad, self->sink_proxypad_block_id);
+ self->sink_proxypad_block_id = 0;
+ }
+}
+
+static gboolean
+gst_play_sink_audio_convert_sink_setcaps (GstPlaySinkAudioConvert * self,
+ GstCaps * caps)
+{
+ GstStructure *s;
+ const gchar *name;
+ gboolean reconfigure = FALSE;
+
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ s = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (s);
+
+ if (g_str_has_prefix (name, "audio/x-raw")) {
+ if (!self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
+ GST_DEBUG_OBJECT (self, "Changing caps from non-raw to raw");
+ reconfigure = TRUE;
+ block_proxypad (self);
+ }
+ } else {
+ if (self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
+ GST_DEBUG_OBJECT (self, "Changing caps from raw to non-raw");
+ reconfigure = TRUE;
+ block_proxypad (self);
+ }
+ }
+
+ /* Otherwise the setcaps below fails */
+ if (reconfigure) {
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+ }
+
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+
+ GST_DEBUG_OBJECT (self, "Setting sink caps %" GST_PTR_FORMAT, caps);
+
+ return TRUE;
+}
+
+static gboolean
+gst_play_sink_audio_convert_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstPlaySinkAudioConvert *self =
+ GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad));
+ gboolean ret;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_play_sink_audio_convert_sink_setcaps (self, caps);
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = gst_proxy_pad_event_default (pad, gst_event_ref (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Segment before %" GST_SEGMENT_FORMAT,
+ &self->segment);
+ gst_event_copy_segment (event, &self->segment);
+ GST_DEBUG_OBJECT (self, "Segment after %" GST_SEGMENT_FORMAT,
+ &self->segment);
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Resetting segment");
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+ break;
+ default:
+ break;
+ }
+
+ gst_event_unref (event);
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static GstCaps *
+gst_play_sink_audio_convert_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstPlaySinkAudioConvert *self =
+ GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad));
+ GstCaps *ret;
+ GstPad *otherpad, *peer;
+
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ if (pad == self->srcpad)
+ otherpad = gst_object_ref (self->sinkpad);
+ else
+ otherpad = gst_object_ref (self->srcpad);
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+
+ peer = gst_pad_get_peer (otherpad);
+ if (peer) {
+ ret = gst_pad_get_caps (peer, filter);
+ gst_object_unref (peer);
+ } else {
+ ret = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ }
+
+ gst_object_unref (otherpad);
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static void
+gst_play_sink_audio_convert_finalize (GObject * object)
+{
+ GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT_CAST (object);
+
+ if (self->volume)
+ gst_object_unref (self->volume);
+
+ gst_object_unref (self->sink_proxypad);
+ g_mutex_free (self->lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static GstStateChangeReturn
+gst_play_sink_audio_convert_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT_CAST (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ unblock_proxypad (self);
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+ 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_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+ if (self->conv) {
+ gst_element_set_state (self->conv, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (self), self->conv);
+ self->conv = NULL;
+ }
+ if (self->resample) {
+ gst_element_set_state (self->resample, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (self), self->resample);
+ self->resample = NULL;
+ }
+ if (self->volume) {
+ gst_element_set_state (self->volume, GST_STATE_NULL);
+ if (GST_OBJECT_PARENT (self->volume) == GST_OBJECT_CAST (self)) {
+ gst_bin_remove (GST_BIN_CAST (self), self->volume);
+ }
+ }
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ self->raw = FALSE;
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
+ unblock_proxypad (self);
+ GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_play_sink_audio_convert_class_init (GstPlaySinkAudioConvertClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ GST_DEBUG_CATEGORY_INIT (gst_play_sink_audio_convert_debug,
+ "playsinkaudioconvert", 0, "play bin");
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->finalize = gst_play_sink_audio_convert_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Player Sink Audio Converter", "Audio/Bin/Converter",
+ "Convenience bin for audio conversion",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_change_state);
+}
+
+static void
+gst_play_sink_audio_convert_init (GstPlaySinkAudioConvert * self)
+{
+ GstPadTemplate *templ;
+
+ self->lock = g_mutex_new ();
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+
+ templ = gst_static_pad_template_get (&sinktemplate);
+ self->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", templ);
+ gst_pad_set_event_function (self->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_sink_event));
+ gst_pad_set_getcaps_function (self->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_getcaps));
+
+ self->sink_proxypad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (self->sinkpad)));
+
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->sinkpad);
+ gst_object_unref (templ);
+
+ templ = gst_static_pad_template_get (&srctemplate);
+ self->srcpad = gst_ghost_pad_new_no_target_from_template ("src", templ);
+ gst_pad_set_getcaps_function (self->srcpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_getcaps));
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->srcpad);
+ gst_object_unref (templ);
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+
+ /* FIXME: Only create this on demand but for now we need
+ * it to always exist because of playsink's volume proxying
+ * logic.
+ */
+ self->volume = gst_element_factory_make ("volume", "volume");
+ if (self->volume)
+ gst_object_ref_sink (self->volume);
+}
diff --git a/gst/playback/gstplaysinkaudioconvert.h b/gst/playback/gstplaysinkaudioconvert.h
new file mode 100644
index 0000000..f9a0791
--- /dev/null
+++ b/gst/playback/gstplaysinkaudioconvert.h
@@ -0,0 +1,89 @@
+/* GStreamer
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+
+#ifndef __GST_PLAY_SINK_AUDIO_CONVERT_H__
+#define __GST_PLAY_SINK_AUDIO_CONVERT_H__
+
+G_BEGIN_DECLS
+#define GST_TYPE_PLAY_SINK_AUDIO_CONVERT \
+ (gst_play_sink_audio_convert_get_type())
+#define GST_PLAY_SINK_AUDIO_CONVERT(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY_SINK_AUDIO_CONVERT, GstPlaySinkAudioConvert))
+#define GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj) \
+ ((GstPlaySinkAudioConvert *) obj)
+#define GST_PLAY_SINK_AUDIO_CONVERT_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY_SINK_AUDIO_CONVERT, GstPlaySinkAudioConvertClass))
+#define GST_IS_PLAY_SINK_AUDIO_CONVERT(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAY_SINK_AUDIO_CONVERT))
+#define GST_IS_PLAY_SINK_AUDIO_CONVERT_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK_AUDIO_CONVERT))
+
+#define GST_PLAY_SINK_AUDIO_CONVERT_LOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj)->lock); \
+ GST_LOG_OBJECT (obj, \
+ "locked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj)->lock); \
+} G_STMT_END
+
+typedef struct _GstPlaySinkAudioConvert GstPlaySinkAudioConvert;
+typedef struct _GstPlaySinkAudioConvertClass GstPlaySinkAudioConvertClass;
+
+struct _GstPlaySinkAudioConvert
+{
+ GstBin parent;
+
+ /* < private > */
+ GMutex *lock;
+
+ GstPad *sinkpad, *sink_proxypad;
+ gulong sink_proxypad_block_id;
+ GstSegment segment;
+
+ GstPad *srcpad;
+
+ gboolean raw;
+ GstElement *conv, *resample;
+
+ /* < pseudo public > */
+ GstElement *volume;
+ gboolean use_volume;
+ gboolean use_converters;
+};
+
+struct _GstPlaySinkAudioConvertClass
+{
+ GstBinClass parent;
+};
+
+GType gst_play_sink_audio_convert_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_PLAY_SINK_AUDIO_CONVERT_H__ */
diff --git a/gst/playback/gstplaysinkvideoconvert.c b/gst/playback/gstplaysinkvideoconvert.c
new file mode 100644
index 0000000..68a77b2
--- /dev/null
+++ b/gst/playback/gstplaysinkvideoconvert.c
@@ -0,0 +1,462 @@
+/* GStreamer
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplaysinkvideoconvert.h"
+
+#include <gst/pbutils/pbutils.h>
+#include <gst/gst-i18n-plugin.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_play_sink_video_convert_debug);
+#define GST_CAT_DEFAULT gst_play_sink_video_convert_debug
+
+#define parent_class gst_play_sink_video_convert_parent_class
+
+G_DEFINE_TYPE (GstPlaySinkVideoConvert, gst_play_sink_video_convert,
+ GST_TYPE_BIN);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+is_raw_caps (GstCaps * caps)
+{
+ gint i, n;
+ GstStructure *s;
+ const gchar *name;
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ s = gst_caps_get_structure (caps, i);
+ name = gst_structure_get_name (s);
+ if (!g_str_has_prefix (name, "video/x-raw"))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+post_missing_element_message (GstPlaySinkVideoConvert * self,
+ const gchar * name)
+{
+ GstMessage *msg;
+
+ msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), name);
+ gst_element_post_message (GST_ELEMENT_CAST (self), msg);
+}
+
+static GstProbeReturn
+pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstPlaySinkVideoConvert *self = user_data;
+ GstPad *peer;
+ GstCaps *caps;
+ gboolean raw;
+
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Pad blocked");
+
+ /* There must be a peer at this point */
+ peer = gst_pad_get_peer (self->sinkpad);
+ caps = gst_pad_get_current_caps (peer);
+ if (!caps)
+ caps = gst_pad_get_caps (peer, NULL);
+ gst_object_unref (peer);
+
+ raw = is_raw_caps (caps);
+ GST_DEBUG_OBJECT (self, "Caps %" GST_PTR_FORMAT " are raw: %d", caps, raw);
+ gst_caps_unref (caps);
+
+ if (raw == self->raw)
+ goto unblock;
+ self->raw = raw;
+
+ if (raw) {
+ GstBin *bin = GST_BIN_CAST (self);
+ GstElement *head = NULL, *prev = NULL;
+ GstPad *pad;
+
+ GST_DEBUG_OBJECT (self, "Creating raw conversion pipeline");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+
+ self->conv = gst_element_factory_make (COLORSPACE, "conv");
+ if (self->conv == NULL) {
+ post_missing_element_message (self, COLORSPACE);
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ COLORSPACE), ("video rendering might fail"));
+ } else {
+ gst_bin_add (bin, self->conv);
+ gst_element_sync_state_with_parent (self->conv);
+ prev = head = self->conv;
+ }
+
+ self->scale = gst_element_factory_make ("videoscale", "scale");
+ if (self->scale == NULL) {
+ post_missing_element_message (self, "videoscale");
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "videoscale"), ("possibly a liboil version mismatch?"));
+ } else {
+ /* Add black borders if necessary to keep the DAR */
+ g_object_set (self->scale, "add-borders", TRUE, NULL);
+ gst_bin_add (bin, self->scale);
+ gst_element_sync_state_with_parent (self->scale);
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", self->scale, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+ goto link_failed;
+ } else {
+ head = self->scale;
+ }
+ prev = self->scale;
+ }
+
+ if (head) {
+ pad = gst_element_get_static_pad (head, "sink");
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), pad);
+ gst_object_unref (pad);
+ }
+
+ if (prev) {
+ pad = gst_element_get_static_pad (prev, "src");
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), pad);
+ gst_object_unref (pad);
+ }
+
+ if (!head && !prev) {
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ }
+
+ GST_DEBUG_OBJECT (self, "Raw conversion pipeline created");
+ } else {
+ GstBin *bin = GST_BIN_CAST (self);
+
+ GST_DEBUG_OBJECT (self, "Removing raw conversion pipeline");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+
+ if (self->conv) {
+ gst_element_set_state (self->conv, GST_STATE_NULL);
+ gst_bin_remove (bin, self->conv);
+ self->conv = NULL;
+ }
+ if (self->scale) {
+ gst_element_set_state (self->scale, GST_STATE_NULL);
+ gst_bin_remove (bin, self->scale);
+ self->scale = NULL;
+ }
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+
+ GST_DEBUG_OBJECT (self, "Raw conversion pipeline removed");
+ }
+
+unblock:
+ self->sink_proxypad_block_id = 0;
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+
+ return GST_PROBE_REMOVE;
+
+link_failed:
+ {
+ GST_ELEMENT_ERROR (self, CORE, PAD,
+ (NULL), ("Failed to configure the video converter."));
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ self->sink_proxypad_block_id = 0;
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+
+ return GST_PROBE_REMOVE;
+ }
+}
+
+static void
+block_proxypad (GstPlaySinkVideoConvert * self)
+{
+ if (self->sink_proxypad_block_id == 0) {
+ self->sink_proxypad_block_id =
+ gst_pad_add_probe (self->sink_proxypad, GST_PROBE_TYPE_BLOCK,
+ pad_blocked_cb, gst_object_ref (self),
+ (GDestroyNotify) gst_object_unref);
+ }
+}
+
+static void
+unblock_proxypad (GstPlaySinkVideoConvert * self)
+{
+ if (self->sink_proxypad_block_id != 0) {
+ gst_pad_remove_probe (self->sink_proxypad, self->sink_proxypad_block_id);
+ self->sink_proxypad_block_id = 0;
+ }
+}
+
+static gboolean
+gst_play_sink_video_convert_sink_setcaps (GstPlaySinkVideoConvert * self,
+ GstCaps * caps)
+{
+ GstStructure *s;
+ const gchar *name;
+ gboolean reconfigure = FALSE;
+
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ s = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (s);
+
+ if (g_str_has_prefix (name, "video/x-raw")) {
+ if (!self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
+ GST_DEBUG_OBJECT (self, "Changing caps from non-raw to raw");
+ reconfigure = TRUE;
+ block_proxypad (self);
+ }
+ } else {
+ if (self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
+ GST_DEBUG_OBJECT (self, "Changing caps from raw to non-raw");
+ reconfigure = TRUE;
+ block_proxypad (self);
+ }
+ }
+
+ /* Otherwise the setcaps below fails */
+ if (reconfigure) {
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+ }
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+
+ GST_DEBUG_OBJECT (self, "Setting sink caps %" GST_PTR_FORMAT, caps);
+
+ return TRUE;
+}
+
+static gboolean
+gst_play_sink_video_convert_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstPlaySinkVideoConvert *self =
+ GST_PLAY_SINK_VIDEO_CONVERT (gst_pad_get_parent (pad));
+ gboolean ret;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_play_sink_video_convert_sink_setcaps (self, caps);
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = gst_proxy_pad_event_default (pad, gst_event_ref (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Segment before %" GST_SEGMENT_FORMAT,
+ &self->segment);
+ gst_event_copy_segment (event, &self->segment);
+ GST_DEBUG_OBJECT (self, "Segment after %" GST_SEGMENT_FORMAT,
+ &self->segment);
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Resetting segment");
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+ break;
+ default:
+ break;
+ }
+
+ gst_event_unref (event);
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static GstCaps *
+gst_play_sink_video_convert_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstPlaySinkVideoConvert *self =
+ GST_PLAY_SINK_VIDEO_CONVERT (gst_pad_get_parent (pad));
+ GstCaps *ret;
+ GstPad *otherpad, *peer;
+
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ if (pad == self->srcpad)
+ otherpad = gst_object_ref (self->sinkpad);
+ else
+ otherpad = gst_object_ref (self->srcpad);
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+
+ peer = gst_pad_get_peer (otherpad);
+ if (peer) {
+ ret = gst_pad_get_caps (peer, filter);
+ gst_object_unref (peer);
+ } else {
+ ret = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ }
+
+ gst_object_unref (otherpad);
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static void
+gst_play_sink_video_convert_finalize (GObject * object)
+{
+ GstPlaySinkVideoConvert *self = GST_PLAY_SINK_VIDEO_CONVERT_CAST (object);
+
+ gst_object_unref (self->sink_proxypad);
+ g_mutex_free (self->lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static GstStateChangeReturn
+gst_play_sink_video_convert_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstPlaySinkVideoConvert *self = GST_PLAY_SINK_VIDEO_CONVERT_CAST (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ unblock_proxypad (self);
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+ 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_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+ if (self->conv) {
+ gst_element_set_state (self->conv, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (self), self->conv);
+ self->conv = NULL;
+ }
+ if (self->scale) {
+ gst_element_set_state (self->scale, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (self), self->scale);
+ self->scale = NULL;
+ }
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+ self->raw = FALSE;
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
+ if (!gst_pad_is_blocked (self->sink_proxypad))
+ block_proxypad (self);
+ GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_play_sink_video_convert_class_init (GstPlaySinkVideoConvertClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ GST_DEBUG_CATEGORY_INIT (gst_play_sink_video_convert_debug,
+ "playsinkvideoconvert", 0, "play bin");
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ gobject_class->finalize = gst_play_sink_video_convert_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_set_details_simple (gstelement_class,
+ "Player Sink Video Converter", "Video/Bin/Converter",
+ "Convenience bin for video conversion",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_change_state);
+}
+
+static void
+gst_play_sink_video_convert_init (GstPlaySinkVideoConvert * self)
+{
+ GstPadTemplate *templ;
+
+ self->lock = g_mutex_new ();
+ gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+
+ templ = gst_static_pad_template_get (&sinktemplate);
+ self->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", templ);
+ gst_pad_set_event_function (self->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_sink_event));
+ gst_pad_set_getcaps_function (self->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_getcaps));
+
+ self->sink_proxypad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (self->sinkpad)));
+
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->sinkpad);
+ gst_object_unref (templ);
+
+ templ = gst_static_pad_template_get (&srctemplate);
+ self->srcpad = gst_ghost_pad_new_no_target_from_template ("src", templ);
+ gst_pad_set_getcaps_function (self->srcpad,
+ GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_getcaps));
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->srcpad);
+ gst_object_unref (templ);
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ self->sink_proxypad);
+}
diff --git a/gst/playback/gstplaysinkvideoconvert.h b/gst/playback/gstplaysinkvideoconvert.h
new file mode 100644
index 0000000..9c32976
--- /dev/null
+++ b/gst/playback/gstplaysinkvideoconvert.h
@@ -0,0 +1,84 @@
+/* GStreamer
+ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+
+#ifndef __GST_PLAY_SINK_VIDEO_CONVERT_H__
+#define __GST_PLAY_SINK_VIDEO_CONVERT_H__
+
+G_BEGIN_DECLS
+#define GST_TYPE_PLAY_SINK_VIDEO_CONVERT \
+ (gst_play_sink_video_convert_get_type())
+#define GST_PLAY_SINK_VIDEO_CONVERT(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY_SINK_VIDEO_CONVERT, GstPlaySinkVideoConvert))
+#define GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj) \
+ ((GstPlaySinkVideoConvert *) obj)
+#define GST_PLAY_SINK_VIDEO_CONVERT_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY_SINK_VIDEO_CONVERT, GstPlaySinkVideoConvertClass))
+#define GST_IS_PLAY_SINK_VIDEO_CONVERT(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAY_SINK_VIDEO_CONVERT))
+#define GST_IS_PLAY_SINK_VIDEO_CONVERT_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK_VIDEO_CONVERT))
+
+#define GST_PLAY_SINK_VIDEO_CONVERT_LOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj)->lock); \
+ GST_LOG_OBJECT (obj, \
+ "locked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj)->lock); \
+} G_STMT_END
+
+typedef struct _GstPlaySinkVideoConvert GstPlaySinkVideoConvert;
+typedef struct _GstPlaySinkVideoConvertClass GstPlaySinkVideoConvertClass;
+
+struct _GstPlaySinkVideoConvert
+{
+ GstBin parent;
+
+ /* < private > */
+ GMutex *lock;
+
+ GstPad *sinkpad, *sink_proxypad;
+ gulong sink_proxypad_block_id;
+ GstSegment segment;
+
+ GstPad *srcpad;
+
+ gboolean raw;
+ GstElement *conv, *scale;
+};
+
+struct _GstPlaySinkVideoConvertClass
+{
+ GstBinClass parent;
+};
+
+GType gst_play_sink_video_convert_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_PLAY_SINK_VIDEO_CONVERT_H__ */
diff --git a/gst/playback/gstrawcaps.h b/gst/playback/gstrawcaps.h
new file mode 100644
index 0000000..7f9ef35
--- /dev/null
+++ b/gst/playback/gstrawcaps.h
@@ -0,0 +1,39 @@
+/* GStreamer
+ * Copyright (C) <2009> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_RAW_CAPS_H__
+#define __GST_RAW_CAPS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define DEFAULT_RAW_CAPS \
+ "video/x-raw; " \
+ "audio/x-raw; " \
+ "text/plain; " \
+ "text/x-pango-markup; " \
+ "video/x-dvd-subpicture; " \
+ "subpicture/x-pgs"
+
+G_END_DECLS
+
+#endif /* __GST_RAW_CAPS__ */
+
diff --git a/gst/playback/gststreamselector.c b/gst/playback/gststreamselector.c
new file mode 100644
index 0000000..24f0031
--- /dev/null
+++ b/gst/playback/gststreamselector.c
@@ -0,0 +1,690 @@
+/* GStreamer
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
+ * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gststreamselector.h"
+
+GST_DEBUG_CATEGORY_STATIC (stream_selector_debug);
+#define GST_CAT_DEFAULT stream_selector_debug
+
+static GstStaticPadTemplate gst_stream_selector_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate gst_stream_selector_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+enum
+{
+ PROP_0,
+ PROP_N_PADS,
+ PROP_ACTIVE_PAD,
+ PROP_LAST
+};
+
+static gboolean gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel,
+ GstPad * pad);
+static GstPad *gst_stream_selector_activate_sinkpad (GstStreamSelector * sel,
+ GstPad * pad);
+static GstPad *gst_stream_selector_get_linked_pad (GstPad * pad,
+ gboolean strict);
+
+#define GST_TYPE_SELECTOR_PAD \
+ (gst_selector_pad_get_type())
+#define GST_SELECTOR_PAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SELECTOR_PAD, GstSelectorPad))
+#define GST_SELECTOR_PAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SELECTOR_PAD, GstSelectorPadClass))
+#define GST_IS_SELECTOR_PAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SELECTOR_PAD))
+#define GST_IS_SELECTOR_PAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SELECTOR_PAD))
+#define GST_SELECTOR_PAD_CAST(obj) \
+ ((GstSelectorPad *)(obj))
+
+typedef struct _GstSelectorPad GstSelectorPad;
+typedef struct _GstSelectorPadClass GstSelectorPadClass;
+
+struct _GstSelectorPad
+{
+ GstPad parent;
+
+ gboolean active;
+ gboolean eos;
+ gboolean segment_pending;
+ GstSegment segment;
+ GstTagList *tags;
+};
+
+struct _GstSelectorPadClass
+{
+ GstPadClass parent;
+};
+
+static void gst_selector_pad_class_init (GstSelectorPadClass * klass);
+static void gst_selector_pad_init (GstSelectorPad * pad);
+static void gst_selector_pad_finalize (GObject * object);
+
+static void gst_selector_pad_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstPadClass *selector_pad_parent_class = NULL;
+
+static void gst_selector_pad_reset (GstSelectorPad * pad);
+static gboolean gst_selector_pad_event (GstPad * pad, GstEvent * event);
+static GstCaps *gst_selector_pad_getcaps (GstPad * pad, GstCaps * filter);
+static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf);
+
+enum
+{
+ PROP_PAD_0,
+ PROP_PAD_TAGS,
+ PROP_PAD_ACTIVE,
+ PROP_PAD_LAST
+};
+
+static GType
+gst_selector_pad_get_type (void)
+{
+ static GType selector_pad_type = 0;
+
+ if (!selector_pad_type) {
+ static const GTypeInfo selector_pad_info = {
+ sizeof (GstSelectorPadClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_selector_pad_class_init,
+ NULL,
+ NULL,
+ sizeof (GstSelectorPad),
+ 0,
+ (GInstanceInitFunc) gst_selector_pad_init,
+ };
+
+ selector_pad_type =
+ g_type_register_static (GST_TYPE_PAD, "GstPlaybinSelectorPad",
+ &selector_pad_info, 0);
+ }
+ return selector_pad_type;
+}
+
+static void
+gst_selector_pad_class_init (GstSelectorPadClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ selector_pad_parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_selector_pad_finalize;
+ gobject_class->get_property = gst_selector_pad_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_PAD_TAGS,
+ g_param_spec_boxed ("tags", "Tags",
+ "The currently active tags on the pad", GST_TYPE_TAG_LIST,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_PAD_ACTIVE,
+ g_param_spec_boolean ("active", "Active",
+ "If the pad is currently active", FALSE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_selector_pad_init (GstSelectorPad * pad)
+{
+ gst_selector_pad_reset (pad);
+}
+
+static void
+gst_selector_pad_finalize (GObject * object)
+{
+ GstSelectorPad *pad;
+
+ pad = GST_SELECTOR_PAD_CAST (object);
+
+ if (pad->tags)
+ gst_tag_list_free (pad->tags);
+
+ G_OBJECT_CLASS (selector_pad_parent_class)->finalize (object);
+}
+
+static void
+gst_selector_pad_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstSelectorPad *pad;
+
+ pad = GST_SELECTOR_PAD (object);
+
+ switch (prop_id) {
+ case PROP_PAD_TAGS:
+ GST_OBJECT_LOCK (object);
+ g_value_set_boxed (value, pad->tags);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PROP_PAD_ACTIVE:
+ {
+ GstStreamSelector *sel;
+
+ sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+ g_value_set_boolean (value, gst_stream_selector_is_active_sinkpad (sel,
+ GST_PAD_CAST (pad)));
+ gst_object_unref (sel);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_selector_pad_reset (GstSelectorPad * pad)
+{
+ pad->active = FALSE;
+ pad->eos = FALSE;
+ gst_segment_init (&pad->segment, GST_FORMAT_UNDEFINED);
+}
+
+static gboolean
+gst_selector_pad_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ gboolean forward = TRUE;
+ GstStreamSelector *sel;
+ GstSelectorPad *selpad;
+ GstPad *active_sinkpad;
+
+ sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+
+ /* only forward if we are dealing with the active sinkpad */
+ active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
+ forward = (active_sinkpad == pad);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ gst_selector_pad_reset (selpad);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &selpad->segment);
+
+ GST_DEBUG_OBJECT (selpad, "configured SEGMENT %" GST_SEGMENT_FORMAT,
+ &selpad->segment);
+ /* if we are not going to forward the segment, mark the segment as
+ * pending */
+ if (!forward)
+ selpad->segment_pending = TRUE;
+ break;
+ }
+ case GST_EVENT_TAG:
+ {
+ GstTagList *tags;
+
+ GST_OBJECT_LOCK (selpad);
+ if (selpad->tags)
+ gst_tag_list_free (selpad->tags);
+ gst_event_parse_tag (event, &tags);
+ if (tags)
+ tags = gst_tag_list_copy (tags);
+ selpad->tags = tags;
+ GST_DEBUG_OBJECT (sel, "received tags %" GST_PTR_FORMAT, selpad->tags);
+ GST_OBJECT_UNLOCK (selpad);
+ break;
+ }
+ case GST_EVENT_EOS:
+ selpad->eos = TRUE;
+ break;
+ default:
+ break;
+ }
+ if (forward)
+ res = gst_pad_push_event (sel->srcpad, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (sel);
+
+ return res;
+}
+
+static GstCaps *
+gst_selector_pad_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstStreamSelector *sel;
+ GstCaps *caps;
+
+ sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (sel, "Getting caps of srcpad peer");
+ caps = gst_pad_peer_get_caps (sel->srcpad, filter);
+ if (caps == NULL)
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ gst_object_unref (sel);
+
+ return caps;
+}
+
+static GstFlowReturn
+gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstStreamSelector *sel;
+ GstFlowReturn res;
+ GstPad *active_sinkpad;
+ GstSelectorPad *selpad;
+ GstClockTime timestamp;
+ GstSegment *seg;
+
+ sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+ seg = &selpad->segment;
+
+ active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ GST_DEBUG_OBJECT (sel, "received timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+ seg->position = timestamp;
+ }
+
+ /* Ignore buffers from pads except the selected one */
+ if (pad != active_sinkpad)
+ goto ignore;
+
+ /* if we have a pending segment, push it out now */
+ if (selpad->segment_pending) {
+ gst_pad_push_event (sel->srcpad, gst_event_new_segment (seg));
+ selpad->segment_pending = FALSE;
+ }
+
+ /* forward */
+ GST_DEBUG_OBJECT (sel, "Forwarding buffer %p from pad %s:%s", buf,
+ GST_DEBUG_PAD_NAME (pad));
+ res = gst_pad_push (sel->srcpad, buf);
+done:
+ gst_object_unref (sel);
+ return res;
+ /* dropped buffers */
+ignore:
+ {
+ GST_DEBUG_OBJECT (sel, "Ignoring buffer %p from pad %s:%s",
+ buf, GST_DEBUG_PAD_NAME (pad));
+ gst_buffer_unref (buf);
+ res = GST_FLOW_NOT_LINKED;
+ goto done;
+ }
+}
+
+static void gst_stream_selector_dispose (GObject * object);
+
+static void gst_stream_selector_init (GstStreamSelector * sel);
+static void gst_stream_selector_base_init (GstStreamSelectorClass * klass);
+static void gst_stream_selector_class_init (GstStreamSelectorClass * klass);
+
+static void gst_stream_selector_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_stream_selector_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstPad *gst_stream_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * unused, const GstCaps * caps);
+static void gst_stream_selector_release_pad (GstElement * element,
+ GstPad * pad);
+static GstIterator *gst_stream_selector_pad_iterate_linked_pads (GstPad * pad);
+static GstCaps *gst_stream_selector_getcaps (GstPad * pad, GstCaps * filter);
+
+static GstElementClass *parent_class = NULL;
+
+GType
+gst_stream_selector_get_type (void)
+{
+ static GType stream_selector_type = 0;
+
+ if (!stream_selector_type) {
+ static const GTypeInfo stream_selector_info = {
+ sizeof (GstStreamSelectorClass),
+ (GBaseInitFunc) gst_stream_selector_base_init,
+ NULL,
+ (GClassInitFunc) gst_stream_selector_class_init,
+ NULL,
+ NULL,
+ sizeof (GstStreamSelector),
+ 0,
+ (GInstanceInitFunc) gst_stream_selector_init,
+ };
+ stream_selector_type =
+ g_type_register_static (GST_TYPE_ELEMENT,
+ "GstStreamSelector", &stream_selector_info, 0);
+ GST_DEBUG_CATEGORY_INIT (stream_selector_debug,
+ "streamselector", 0, "A stream-selector element");
+ }
+
+ return stream_selector_type;
+}
+
+static void
+gst_stream_selector_base_init (GstStreamSelectorClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_details_simple (element_class,
+ "StreamSelector", "Generic",
+ "N-to-1 input stream_selectoring",
+ "Julien Moutte <julien@moutte.net>, "
+ "Jan Schmidt <thaytan@mad.scientist.com>, "
+ "Wim Taymans <wim.taymans@gmail.com>");
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_stream_selector_sink_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_stream_selector_src_factory));
+}
+
+static void
+gst_stream_selector_class_init (GstStreamSelectorClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = gst_stream_selector_dispose;
+
+ gobject_class->set_property = gst_stream_selector_set_property;
+ gobject_class->get_property = gst_stream_selector_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_N_PADS,
+ g_param_spec_uint ("n-pads", "Number of Pads",
+ "The number of sink pads", 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
+ g_param_spec_object ("active-pad", "Active Pad",
+ "The currently active sink pad", GST_TYPE_PAD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->request_new_pad = gst_stream_selector_request_new_pad;
+ gstelement_class->release_pad = gst_stream_selector_release_pad;
+}
+
+static void
+gst_stream_selector_init (GstStreamSelector * sel)
+{
+ sel->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_iterate_internal_links_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_selector_pad_iterate_linked_pads));
+ gst_pad_set_getcaps_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_selector_getcaps));
+ gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad);
+ /* sinkpad management */
+ sel->padcount = 0;
+ sel->active_sinkpad = NULL;
+ gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
+}
+
+static void
+gst_stream_selector_dispose (GObject * object)
+{
+ GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
+
+ if (sel->active_sinkpad) {
+ gst_object_unref (sel->active_sinkpad);
+ sel->active_sinkpad = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_stream_selector_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_ACTIVE_PAD:
+ {
+ GstPad *pad = NULL;
+ GstPad **active_pad_p;
+
+ pad = g_value_get_object (value);
+
+ GST_OBJECT_LOCK (object);
+ if (pad != sel->active_sinkpad) {
+ GstSelectorPad *selpad;
+
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+ /* we can only activate pads that have data received */
+ if (selpad && !selpad->active) {
+ GST_DEBUG_OBJECT (sel, "No data received on pad %" GST_PTR_FORMAT,
+ pad);
+ } else {
+ active_pad_p = &sel->active_sinkpad;
+ gst_object_replace ((GstObject **) active_pad_p,
+ GST_OBJECT_CAST (pad));
+ GST_DEBUG_OBJECT (sel, "New active pad is %" GST_PTR_FORMAT,
+ sel->active_sinkpad);
+ }
+ }
+ GST_OBJECT_UNLOCK (object);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_stream_selector_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_N_PADS:
+ GST_OBJECT_LOCK (object);
+ g_value_set_uint (value, sel->n_pads);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PROP_ACTIVE_PAD:{
+ GST_OBJECT_LOCK (object);
+ g_value_set_object (value, sel->active_sinkpad);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstPad *
+gst_stream_selector_get_linked_pad (GstPad * pad, gboolean strict)
+{
+ GstStreamSelector *sel;
+ GstPad *otherpad = NULL;
+
+ sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+
+ GST_OBJECT_LOCK (sel);
+ if (pad == sel->srcpad)
+ otherpad = sel->active_sinkpad;
+ else if (pad == sel->active_sinkpad || !strict)
+ otherpad = sel->srcpad;
+ if (otherpad)
+ gst_object_ref (otherpad);
+ GST_OBJECT_UNLOCK (sel);
+ gst_object_unref (sel);
+ return otherpad;
+}
+
+static GstCaps *
+gst_stream_selector_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstPad *otherpad;
+ GstObject *parent;
+ GstCaps *caps;
+
+ otherpad = gst_stream_selector_get_linked_pad (pad, FALSE);
+ parent = gst_object_get_parent (GST_OBJECT (pad));
+ if (!otherpad) {
+ GST_DEBUG_OBJECT (parent,
+ "Pad %s:%s not linked, returning ANY", GST_DEBUG_PAD_NAME (pad));
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ } else {
+ GST_DEBUG_OBJECT (parent,
+ "Pad %s:%s is linked (to %s:%s), returning peer caps",
+ GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (otherpad));
+ /* if the peer has caps, use those. If the pad is not linked, this function
+ * returns NULL and we return ANY */
+ if (!(caps = gst_pad_peer_get_caps (otherpad, filter)))
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ gst_object_unref (otherpad);
+ }
+
+ gst_object_unref (parent);
+ return caps;
+}
+
+/* check if the pad is the active sinkpad */
+static gboolean
+gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel, GstPad * pad)
+{
+ gboolean res;
+
+ GST_OBJECT_LOCK (sel);
+ res = (pad == sel->active_sinkpad);
+ GST_OBJECT_UNLOCK (sel);
+
+ return res;
+}
+
+/* Get or create the active sinkpad */
+static GstPad *
+gst_stream_selector_activate_sinkpad (GstStreamSelector * sel, GstPad * pad)
+{
+ GstPad *active_sinkpad;
+ GstSelectorPad *selpad;
+
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+
+ GST_OBJECT_LOCK (sel);
+ selpad->active = TRUE;
+ active_sinkpad = sel->active_sinkpad;
+ if (active_sinkpad == NULL) {
+ /* first pad we get an alloc on becomes the activated pad by default */
+ active_sinkpad = sel->active_sinkpad = gst_object_ref (pad);
+ GST_DEBUG_OBJECT (sel, "Activating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+ }
+ GST_OBJECT_UNLOCK (sel);
+
+ return active_sinkpad;
+}
+
+static GstIterator *
+gst_stream_selector_pad_iterate_linked_pads (GstPad * pad)
+{
+ GstStreamSelector *sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
+ GValue value = { 0, };
+ GstPad *otherpad;
+ GstIterator *ret = NULL;
+
+ otherpad = gst_stream_selector_get_linked_pad (pad, TRUE);
+ if (otherpad) {
+ g_value_init (&value, GST_TYPE_PAD);
+ g_value_set_object (&value, otherpad);
+ ret = gst_iterator_new_single (GST_TYPE_PAD, &value);
+ g_value_unset (&value);
+ gst_object_unref (otherpad);
+ }
+ gst_object_unref (sel);
+
+ return ret;
+}
+
+static GstPad *
+gst_stream_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * unused, const GstCaps * caps)
+{
+ GstStreamSelector *sel;
+ gchar *name = NULL;
+ GstPad *sinkpad = NULL;
+
+ sel = GST_STREAM_SELECTOR (element);
+ g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL);
+ GST_LOG_OBJECT (sel, "Creating new pad %d", sel->padcount);
+ GST_OBJECT_LOCK (sel);
+ name = g_strdup_printf ("sink%d", sel->padcount++);
+ sinkpad = g_object_new (GST_TYPE_SELECTOR_PAD,
+ "name", name, "direction", templ->direction, "template", templ, NULL);
+ g_free (name);
+ sel->n_pads++;
+ GST_OBJECT_UNLOCK (sel);
+
+ gst_pad_set_event_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_selector_pad_event));
+ gst_pad_set_getcaps_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_selector_pad_getcaps));
+ gst_pad_set_chain_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_selector_pad_chain));
+ gst_pad_set_iterate_internal_links_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_selector_pad_iterate_linked_pads));
+
+ gst_pad_set_active (sinkpad, TRUE);
+ gst_element_add_pad (GST_ELEMENT (sel), sinkpad);
+ return sinkpad;
+}
+
+static void
+gst_stream_selector_release_pad (GstElement * element, GstPad * pad)
+{
+ GstStreamSelector *sel;
+
+ sel = GST_STREAM_SELECTOR (element);
+ GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ GST_OBJECT_LOCK (sel);
+ /* if the pad was the active pad, makes us select a new one */
+ if (sel->active_sinkpad == pad) {
+ GST_DEBUG_OBJECT (sel, "Deactivating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+ sel->active_sinkpad = NULL;
+ }
+ sel->n_pads--;
+ GST_OBJECT_UNLOCK (sel);
+
+ gst_pad_set_active (pad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT (sel), pad);
+}
diff --git a/gst/playback/gststreamselector.h b/gst/playback/gststreamselector.h
new file mode 100644
index 0000000..5200a0b
--- /dev/null
+++ b/gst/playback/gststreamselector.h
@@ -0,0 +1,62 @@
+/* GStreamer
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
+ * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_STREAM_SELECTOR_H__
+#define __GST_STREAM_SELECTOR_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STREAM_SELECTOR \
+ (gst_stream_selector_get_type())
+#define GST_STREAM_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_STREAM_SELECTOR, GstStreamSelector))
+#define GST_STREAM_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_STREAM_SELECTOR, GstStreamSelectorClass))
+#define GST_IS_STREAM_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_STREAM_SELECTOR))
+#define GST_IS_STREAM_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_STREAM_SELECTOR))
+
+typedef struct _GstStreamSelector GstStreamSelector;
+typedef struct _GstStreamSelectorClass GstStreamSelectorClass;
+
+struct _GstStreamSelector {
+ GstElement element;
+
+ GstPad *srcpad;
+
+ GstPad *active_sinkpad;
+ guint n_pads;
+ guint padcount;
+
+ GstSegment segment;
+};
+
+struct _GstStreamSelectorClass {
+ GstElementClass parent_class;
+};
+
+GType gst_stream_selector_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_STREAM_SELECTOR_H__ */
diff --git a/gst/playback/gststreamsynchronizer.c b/gst/playback/gststreamsynchronizer.c
new file mode 100644
index 0000000..017a944
--- /dev/null
+++ b/gst/playback/gststreamsynchronizer.c
@@ -0,0 +1,944 @@
+/* GStreamer
+ * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gststreamsynchronizer.h"
+
+GST_DEBUG_CATEGORY_STATIC (stream_synchronizer_debug);
+#define GST_CAT_DEFAULT stream_synchronizer_debug
+
+#define GST_STREAM_SYNCHRONIZER_LOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_STREAM_SYNCHRONIZER_CAST(obj)->lock); \
+ GST_LOG_OBJECT (obj, \
+ "locked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define GST_STREAM_SYNCHRONIZER_UNLOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_STREAM_SYNCHRONIZER_CAST(obj)->lock); \
+} G_STMT_END
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src_%d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static const gboolean passthrough = TRUE;
+
+#define gst_stream_synchronizer_parent_class parent_class
+G_DEFINE_TYPE (GstStreamSynchronizer, gst_stream_synchronizer,
+ GST_TYPE_ELEMENT);
+
+typedef struct
+{
+ GstStreamSynchronizer *transform;
+ guint stream_number;
+ GstPad *srcpad;
+ GstPad *sinkpad;
+ GstSegment segment;
+
+ gboolean wait;
+ gboolean new_stream;
+ gboolean drop_discont;
+ gboolean is_eos;
+ gboolean seen_data;
+
+ gint64 running_time_diff;
+} GstStream;
+
+/* Must be called with lock! */
+static GstPad *
+gst_stream_get_other_pad (GstStream * stream, GstPad * pad)
+{
+ if (stream->sinkpad == pad)
+ return gst_object_ref (stream->srcpad);
+ else if (stream->srcpad == pad)
+ return gst_object_ref (stream->sinkpad);
+
+ return NULL;
+}
+
+static GstPad *
+gst_stream_get_other_pad_from_pad (GstPad * pad)
+{
+ GstStreamSynchronizer *self =
+ GST_STREAM_SYNCHRONIZER (gst_pad_get_parent (pad));
+ GstStream *stream;
+ GstPad *opad = NULL;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (!stream)
+ goto out;
+
+ opad = gst_stream_get_other_pad (stream, pad);
+
+out:
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ gst_object_unref (self);
+
+ if (!opad)
+ GST_WARNING_OBJECT (pad, "Trying to get other pad after releasing");
+
+ return opad;
+}
+
+/* Generic pad functions */
+static GstIterator *
+gst_stream_synchronizer_iterate_internal_links (GstPad * pad)
+{
+ GstIterator *it = NULL;
+ GstPad *opad;
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ GValue value = { 0, };
+
+ g_value_init (&value, GST_TYPE_PAD);
+ g_value_set_object (&value, opad);
+ it = gst_iterator_new_single (GST_TYPE_PAD, &value);
+ g_value_unset (&value);
+ gst_object_unref (opad);
+ }
+
+ return it;
+}
+
+static gboolean
+gst_stream_synchronizer_query (GstPad * pad, GstQuery * query)
+{
+ GstPad *opad;
+ gboolean ret = FALSE;
+
+ GST_LOG_OBJECT (pad, "Handling query %s", GST_QUERY_TYPE_NAME (query));
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_peer_query (opad, query);
+ gst_object_unref (opad);
+ }
+
+ return ret;
+}
+
+static GstCaps *
+gst_stream_synchronizer_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstPad *opad;
+ GstCaps *ret = NULL;
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_peer_get_caps (opad, filter);
+ gst_object_unref (opad);
+ }
+
+ if (ret == NULL)
+ ret = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret);
+
+ return ret;
+}
+
+static gboolean
+gst_stream_synchronizer_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstPad *opad;
+ gboolean ret = FALSE;
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_peer_accept_caps (opad, caps);
+ gst_object_unref (opad);
+ }
+
+ GST_LOG_OBJECT (pad, "Caps%s accepted: %" GST_PTR_FORMAT, (ret ? "" : " not"),
+ caps);
+
+ return ret;
+}
+
+/* srcpad functions */
+static gboolean
+gst_stream_synchronizer_src_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamSynchronizer *self =
+ GST_STREAM_SYNCHRONIZER (gst_pad_get_parent (pad));
+ GstPad *opad;
+ gboolean ret = FALSE;
+
+ if (passthrough)
+ goto skip_adjustments;
+
+ GST_LOG_OBJECT (pad, "Handling event %s: %" GST_PTR_FORMAT,
+ GST_EVENT_TYPE_NAME (event), event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_QOS:{
+ gdouble proportion;
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+ gint64 running_time_diff;
+ GstStream *stream;
+
+ gst_event_parse_qos (event, NULL, &proportion, &diff, &timestamp);
+ gst_event_unref (event);
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream)
+ running_time_diff = stream->running_time_diff;
+ else
+ running_time_diff = -1;
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+
+ if (running_time_diff == -1) {
+ GST_WARNING_OBJECT (pad, "QOS event before group start");
+ goto out;
+ } else if (timestamp < running_time_diff) {
+ GST_DEBUG_OBJECT (pad, "QOS event from previous group");
+ goto out;
+ }
+
+ GST_LOG_OBJECT (pad,
+ "Adjusting QOS event: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " = %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (timestamp),
+ GST_TIME_ARGS (running_time_diff),
+ GST_TIME_ARGS (timestamp - running_time_diff));
+
+ timestamp -= running_time_diff;
+
+ /* That case is invalid for QoS events */
+ if (diff < 0 && -diff > timestamp) {
+ GST_DEBUG_OBJECT (pad, "QOS event from previous group");
+ ret = TRUE;
+ goto out;
+ }
+
+ event =
+ gst_event_new_qos (GST_QOS_TYPE_UNDERFLOW, proportion, diff,
+ timestamp);
+ break;
+ }
+ default:
+ break;
+ }
+
+skip_adjustments:
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_push_event (opad, event);
+ gst_object_unref (opad);
+ }
+
+out:
+ gst_object_unref (self);
+
+ return ret;
+}
+
+/* sinkpad functions */
+static gboolean
+gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstStreamSynchronizer *self =
+ GST_STREAM_SYNCHRONIZER (gst_pad_get_parent (pad));
+ GstPad *opad;
+ gboolean ret = FALSE;
+
+ if (passthrough)
+ goto skip_adjustments;
+
+ GST_LOG_OBJECT (pad, "Handling event %s: %" GST_PTR_FORMAT,
+ GST_EVENT_TYPE_NAME (event), event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SINK_MESSAGE:{
+ GstMessage *message;
+
+ gst_event_parse_sink_message (event, &message);
+ if (gst_message_has_name (message, "playbin-stream-changed")) {
+ GstStream *stream;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream) {
+ GList *l;
+ gboolean all_wait = TRUE;
+
+ GST_DEBUG_OBJECT (pad, "Stream %d changed", stream->stream_number);
+
+ stream->is_eos = FALSE;
+ stream->wait = TRUE;
+ stream->new_stream = TRUE;
+
+ for (l = self->streams; l; l = l->next) {
+ GstStream *ostream = l->data;
+
+ all_wait = all_wait && ostream->wait;
+ if (!all_wait)
+ break;
+ }
+ if (all_wait) {
+ gint64 position = 0;
+
+ GST_DEBUG_OBJECT (self, "All streams have changed -- unblocking");
+
+ for (l = self->streams; l; l = l->next) {
+ GstStream *ostream = l->data;
+ gint64 stop_running_time;
+ gint64 position_running_time;
+
+ ostream->wait = FALSE;
+
+ stop_running_time =
+ gst_segment_to_running_time (&ostream->segment,
+ GST_FORMAT_TIME, ostream->segment.stop);
+ position_running_time =
+ gst_segment_to_running_time (&ostream->segment,
+ GST_FORMAT_TIME, ostream->segment.position);
+ position =
+ MAX (position, MAX (stop_running_time,
+ position_running_time));
+ }
+ position = MAX (0, position);
+ self->group_start_time = MAX (self->group_start_time, position);
+
+ GST_DEBUG_OBJECT (self, "New group start time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (self->group_start_time));
+
+ g_cond_broadcast (self->stream_finish_cond);
+ }
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ }
+ gst_message_unref (message);
+ break;
+ }
+ case GST_EVENT_SEGMENT:{
+ GstStream *stream;
+ GstSegment segment;
+
+ gst_event_copy_segment (event, &segment);
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream) {
+ if (stream->wait) {
+ GST_DEBUG_OBJECT (pad, "Stream %d is waiting", stream->stream_number);
+ g_cond_wait (self->stream_finish_cond, self->lock);
+ stream = gst_pad_get_element_private (pad);
+ if (stream)
+ stream->wait = FALSE;
+ }
+ }
+
+ if (self->shutdown) {
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ gst_event_unref (event);
+ goto done;
+ }
+
+ if (stream && segment.format == GST_FORMAT_TIME) {
+ if (stream->new_stream) {
+ gint64 position_running_time = 0;
+ gint64 stop_running_time = 0;
+
+ if (stream->segment.format == GST_FORMAT_TIME) {
+ position_running_time =
+ gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
+ stream->segment.position);
+ position_running_time = MAX (position_running_time, 0);
+ stop_running_time =
+ gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
+ stream->segment.stop);
+ stop_running_time = MAX (position_running_time, 0);
+
+ if (stop_running_time != position_running_time) {
+ GST_WARNING_OBJECT (pad,
+ "Gap between position and segment stop: %" GST_TIME_FORMAT
+ " != %" GST_TIME_FORMAT, GST_TIME_ARGS (stop_running_time),
+ GST_TIME_ARGS (position_running_time));
+ }
+
+ if (stop_running_time < position_running_time) {
+ GST_DEBUG_OBJECT (pad, "Updating stop position");
+ stream->segment.stop = stream->segment.position;
+ gst_pad_push_event (stream->srcpad,
+ gst_event_new_segment (&stream->segment));
+ }
+ stop_running_time = MAX (stop_running_time, position_running_time);
+ GST_DEBUG_OBJECT (pad,
+ "Stop running time of last group: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stop_running_time));
+ }
+ stream->new_stream = FALSE;
+ stream->drop_discont = TRUE;
+
+ if (stop_running_time < self->group_start_time) {
+ gint64 diff = self->group_start_time - stop_running_time;
+
+ GST_DEBUG_OBJECT (pad,
+ "Advancing running time for other streams by: %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (diff));
+
+ segment.base += diff;
+ }
+ }
+
+ GST_DEBUG_OBJECT (pad, "Segment was: %" GST_SEGMENT_FORMAT,
+ &stream->segment);
+ gst_segment_copy_into (&segment, &stream->segment);
+ GST_DEBUG_OBJECT (pad, "Segment now is: %" GST_SEGMENT_FORMAT,
+ &stream->segment);
+
+ GST_DEBUG_OBJECT (pad, "Stream start running time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->segment.base));
+ stream->running_time_diff = stream->segment.base;
+ } else if (stream) {
+ GST_WARNING_OBJECT (pad, "Non-TIME segment: %s",
+ gst_format_get_name (segment.format));
+ gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:{
+ GstStream *stream;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream) {
+ GST_DEBUG_OBJECT (pad, "Resetting segment for stream %d",
+ stream->stream_number);
+ gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
+
+ stream->is_eos = FALSE;
+ stream->wait = FALSE;
+ stream->new_stream = FALSE;
+ stream->drop_discont = FALSE;
+ stream->seen_data = FALSE;
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ break;
+ }
+ case GST_EVENT_EOS:{
+ GstStream *stream;
+ GList *l;
+ gboolean all_eos = TRUE;
+ gboolean seen_data;
+ GSList *pads = NULL;
+ GstPad *srcpad;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (!stream) {
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ GST_WARNING_OBJECT (pad, "EOS for unknown stream");
+ break;
+ }
+
+ GST_DEBUG_OBJECT (pad, "Have EOS for stream %d", stream->stream_number);
+ stream->is_eos = TRUE;
+
+ seen_data = stream->seen_data;
+ srcpad = gst_object_ref (stream->srcpad);
+
+ for (l = self->streams; l; l = l->next) {
+ GstStream *ostream = l->data;
+
+ all_eos = all_eos && ostream->is_eos;
+ if (!all_eos)
+ break;
+ }
+
+ if (all_eos) {
+ GST_DEBUG_OBJECT (self, "All streams are EOS -- forwarding");
+ for (l = self->streams; l; l = l->next) {
+ GstStream *ostream = l->data;
+ /* local snapshot of current pads */
+ gst_object_ref (ostream->srcpad);
+ pads = g_slist_prepend (pads, ostream->srcpad);
+ }
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ /* drop lock when sending eos, which may block in e.g. preroll */
+ if (pads) {
+ GstPad *pad;
+ GSList *epad;
+
+ ret = TRUE;
+ epad = pads;
+ while (epad) {
+ pad = epad->data;
+ GST_DEBUG_OBJECT (pad, "Pushing EOS");
+ ret = ret && gst_pad_push_event (pad, gst_event_new_eos ());
+ gst_object_unref (pad);
+ epad = g_slist_next (epad);
+ }
+ g_slist_free (pads);
+ } else {
+ /* if EOS, but no data has passed, then send something to replace EOS
+ * for preroll purposes */
+ if (!seen_data) {
+ GstBuffer *buf = gst_buffer_new ();
+
+ gst_pad_push (srcpad, buf);
+ }
+ }
+ gst_object_unref (srcpad);
+ goto done;
+ break;
+ }
+ default:
+ break;
+ }
+
+skip_adjustments:
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_push_event (opad, event);
+ gst_object_unref (opad);
+ }
+
+done:
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_stream_synchronizer_sink_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstStreamSynchronizer *self =
+ GST_STREAM_SYNCHRONIZER (gst_pad_get_parent (pad));
+ GstPad *opad;
+ GstFlowReturn ret = GST_FLOW_ERROR;
+ GstStream *stream;
+ GstClockTime timestamp = GST_CLOCK_TIME_NONE;
+ GstClockTime timestamp_end = GST_CLOCK_TIME_NONE;
+
+ if (passthrough) {
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_push (opad, buffer);
+ gst_object_unref (opad);
+ }
+ goto done;
+ }
+
+ GST_LOG_OBJECT (pad, "Handling buffer %p: size=%" G_GSIZE_FORMAT
+ ", timestamp=%" GST_TIME_FORMAT " duration=%" GST_TIME_FORMAT
+ " offset=%" G_GUINT64_FORMAT " offset_end=%" G_GUINT64_FORMAT,
+ buffer, gst_buffer_get_size (buffer),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)),
+ GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET_END (buffer));
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)
+ && GST_BUFFER_DURATION_IS_VALID (buffer))
+ timestamp_end = timestamp + GST_BUFFER_DURATION (buffer);
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+
+ stream->seen_data = TRUE;
+ if (stream && stream->drop_discont) {
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
+ stream->drop_discont = FALSE;
+ }
+
+ if (stream && stream->segment.format == GST_FORMAT_TIME
+ && GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ GST_LOG_OBJECT (pad,
+ "Updating last-stop from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->segment.position), GST_TIME_ARGS (timestamp));
+ stream->segment.position = timestamp;
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+
+ opad = gst_stream_get_other_pad_from_pad (pad);
+ if (opad) {
+ ret = gst_pad_push (opad, buffer);
+ gst_object_unref (opad);
+ }
+
+ GST_LOG_OBJECT (pad, "Push returned: %s", gst_flow_get_name (ret));
+ if (ret == GST_FLOW_OK) {
+ GList *l;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream && stream->segment.format == GST_FORMAT_TIME
+ && GST_CLOCK_TIME_IS_VALID (timestamp_end)) {
+ GST_LOG_OBJECT (pad,
+ "Updating last-stop from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->segment.position),
+ GST_TIME_ARGS (timestamp_end));
+ stream->segment.position = timestamp_end;
+ }
+
+ /* Advance EOS streams if necessary. For non-EOS
+ * streams the demuxers should already do this! */
+ for (l = self->streams; l; l = l->next) {
+ GstStream *ostream = l->data;
+ gint64 position;
+
+ if (!ostream->is_eos || ostream->segment.format != GST_FORMAT_TIME)
+ continue;
+
+ if (ostream->segment.position != -1)
+ position = ostream->segment.position;
+ else
+ position = ostream->segment.start;
+
+ /* Is there a 1 second lag? */
+ if (position != -1 && position + GST_SECOND < timestamp_end) {
+ gint64 new_start, new_stop;
+
+ new_start = timestamp_end - GST_SECOND;
+ if (ostream->segment.stop == -1)
+ new_stop = -1;
+ else
+ new_stop = MAX (new_start, ostream->segment.stop);
+
+ GST_DEBUG_OBJECT (ostream->sinkpad,
+ "Advancing stream %u from %" GST_TIME_FORMAT " to %"
+ GST_TIME_FORMAT, ostream->stream_number, GST_TIME_ARGS (position),
+ GST_TIME_ARGS (new_start));
+
+ ostream->segment.start = new_start;
+ ostream->segment.stop = new_stop;
+ ostream->segment.time = new_start;
+ ostream->segment.position = new_start;
+
+ gst_pad_push_event (ostream->srcpad,
+ gst_event_new_segment (&ostream->segment));
+ }
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ }
+
+done:
+
+ gst_object_unref (self);
+
+ return ret;
+}
+
+/* GstElement vfuncs */
+static GstPad *
+gst_stream_synchronizer_request_new_pad (GstElement * element,
+ GstPadTemplate * temp, const gchar * name, const GstCaps * caps)
+{
+ GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (element);
+ GstStream *stream;
+ gchar *tmp;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ GST_DEBUG_OBJECT (self, "Requesting new pad for stream %d",
+ self->current_stream_number);
+
+ stream = g_slice_new0 (GstStream);
+ stream->transform = self;
+ stream->stream_number = self->current_stream_number;
+
+ tmp = g_strdup_printf ("sink_%d", self->current_stream_number);
+ stream->sinkpad = gst_pad_new_from_static_template (&sinktemplate, tmp);
+ g_free (tmp);
+ gst_pad_set_element_private (stream->sinkpad, stream);
+ gst_pad_set_iterate_internal_links_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_iterate_internal_links));
+ gst_pad_set_query_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_query));
+ gst_pad_set_getcaps_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_getcaps));
+ gst_pad_set_acceptcaps_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_acceptcaps));
+ gst_pad_set_event_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_sink_event));
+ gst_pad_set_chain_function (stream->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_sink_chain));
+
+ tmp = g_strdup_printf ("src_%d", self->current_stream_number);
+ stream->srcpad = gst_pad_new_from_static_template (&srctemplate, tmp);
+ g_free (tmp);
+ gst_pad_set_element_private (stream->srcpad, stream);
+ gst_pad_set_iterate_internal_links_function (stream->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_iterate_internal_links));
+ gst_pad_set_query_function (stream->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_query));
+ gst_pad_set_getcaps_function (stream->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_getcaps));
+ gst_pad_set_acceptcaps_function (stream->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_acceptcaps));
+ gst_pad_set_event_function (stream->srcpad,
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_src_event));
+
+ gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
+
+ self->streams = g_list_prepend (self->streams, stream);
+ self->current_stream_number++;
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+
+ /* Add pads and activate unless we're going to NULL */
+ g_static_rec_mutex_lock (GST_STATE_GET_LOCK (self));
+ if (GST_STATE_TARGET (self) != GST_STATE_NULL) {
+ gst_pad_set_active (stream->srcpad, TRUE);
+ gst_pad_set_active (stream->sinkpad, TRUE);
+ }
+ gst_element_add_pad (GST_ELEMENT_CAST (self), stream->srcpad);
+ gst_element_add_pad (GST_ELEMENT_CAST (self), stream->sinkpad);
+ g_static_rec_mutex_unlock (GST_STATE_GET_LOCK (self));
+
+ return stream->sinkpad;
+}
+
+/* Must be called with lock! */
+static void
+gst_stream_synchronizer_release_stream (GstStreamSynchronizer * self,
+ GstStream * stream)
+{
+ GList *l;
+
+ GST_DEBUG_OBJECT (self, "Releasing stream %d", stream->stream_number);
+
+ for (l = self->streams; l; l = l->next) {
+ if (l->data == stream) {
+ self->streams = g_list_delete_link (self->streams, l);
+ break;
+ }
+ }
+ g_assert (l != NULL);
+
+ /* we can drop the lock, since stream exists now only local.
+ * Moreover, we should drop, to prevent deadlock with STREAM_LOCK
+ * (due to reverse lock order) when deactivating pads */
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+
+ gst_pad_set_element_private (stream->srcpad, NULL);
+ gst_pad_set_element_private (stream->sinkpad, NULL);
+ gst_pad_set_active (stream->srcpad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (self), stream->srcpad);
+ gst_pad_set_active (stream->sinkpad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (self), stream->sinkpad);
+
+ if (stream->segment.format == GST_FORMAT_TIME) {
+ gint64 stop_running_time;
+ gint64 position_running_time;
+
+ stop_running_time =
+ gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
+ stream->segment.stop);
+ position_running_time =
+ gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
+ stream->segment.position);
+ stop_running_time = MAX (stop_running_time, position_running_time);
+
+ GST_DEBUG_OBJECT (stream->sinkpad,
+ "Stop running time was: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stop_running_time));
+
+ self->group_start_time = MAX (self->group_start_time, stop_running_time);
+ }
+
+ g_slice_free (GstStream, stream);
+
+ /* NOTE: In theory we have to check here if all streams
+ * are EOS but the one that was removed wasn't and then
+ * send EOS downstream. But due to the way how playsink
+ * works this is not necessary and will only cause problems
+ * for gapless playback. playsink will only add/remove pads
+ * when it's reconfigured, which happens when the streams
+ * change
+ */
+
+ /* lock for good measure, since the caller had it */
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+}
+
+static void
+gst_stream_synchronizer_release_pad (GstElement * element, GstPad * pad)
+{
+ GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (element);
+ GstStream *stream;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ stream = gst_pad_get_element_private (pad);
+ if (stream) {
+ g_assert (stream->sinkpad == pad);
+
+ gst_stream_synchronizer_release_stream (self, stream);
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+}
+
+static GstStateChangeReturn
+gst_stream_synchronizer_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_DEBUG_OBJECT (self, "State change NULL->READY");
+ self->shutdown = FALSE;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (self, "State change READY->PAUSED");
+ self->group_start_time = 0;
+ self->shutdown = FALSE;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_DEBUG_OBJECT (self, "State change PAUSED->PLAYING");
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (self, "State change READY->NULL");
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ g_cond_broadcast (self->stream_finish_cond);
+ self->shutdown = TRUE;
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ default:
+ break;
+ }
+
+ {
+ GstStateChangeReturn bret;
+
+ bret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ GST_DEBUG_OBJECT (self, "Base class state changed returned: %d", bret);
+ if (G_UNLIKELY (bret == GST_STATE_CHANGE_FAILURE))
+ return ret;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_DEBUG_OBJECT (self, "State change PLAYING->PAUSED");
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ GList *l;
+
+ GST_DEBUG_OBJECT (self, "State change PAUSED->READY");
+ self->group_start_time = 0;
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ for (l = self->streams; l; l = l->next) {
+ GstStream *stream = l->data;
+
+ gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
+ stream->wait = FALSE;
+ stream->new_stream = FALSE;
+ stream->drop_discont = FALSE;
+ stream->is_eos = FALSE;
+ }
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ break;
+ }
+ case GST_STATE_CHANGE_READY_TO_NULL:{
+ GST_DEBUG_OBJECT (self, "State change READY->NULL");
+
+ GST_STREAM_SYNCHRONIZER_LOCK (self);
+ while (self->streams)
+ gst_stream_synchronizer_release_stream (self, self->streams->data);
+ self->current_stream_number = 0;
+ GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+/* GObject vfuncs */
+static void
+gst_stream_synchronizer_finalize (GObject * object)
+{
+ GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (object);
+
+ if (self->lock) {
+ g_mutex_free (self->lock);
+ self->lock = NULL;
+ }
+
+ if (self->stream_finish_cond) {
+ g_cond_free (self->stream_finish_cond);
+ self->stream_finish_cond = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/* GObject type initialization */
+static void
+gst_stream_synchronizer_init (GstStreamSynchronizer * self)
+{
+ self->lock = g_mutex_new ();
+ self->stream_finish_cond = g_cond_new ();
+}
+
+static void
+gst_stream_synchronizer_class_init (GstStreamSynchronizerClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (stream_synchronizer_debug,
+ "streamsynchronizer", 0, "Stream Synchronizer");
+
+ gobject_class->finalize = gst_stream_synchronizer_finalize;
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gst_element_class_set_details_simple (element_class,
+ "Stream Synchronizer", "Generic",
+ "Synchronizes a group of streams to have equal durations and starting points",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_change_state);
+ element_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_request_new_pad);
+ element_class->release_pad =
+ GST_DEBUG_FUNCPTR (gst_stream_synchronizer_release_pad);
+}
diff --git a/gst/playback/gststreamsynchronizer.h b/gst/playback/gststreamsynchronizer.h
new file mode 100644
index 0000000..e2379ae
--- /dev/null
+++ b/gst/playback/gststreamsynchronizer.h
@@ -0,0 +1,67 @@
+/* GStreamer
+ * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_STREAM_SYNCHRONIZER_H__
+#define __GST_STREAM_SYNCHRONIZER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STREAM_SYNCHRONIZER \
+ (gst_stream_synchronizer_get_type())
+#define GST_STREAM_SYNCHRONIZER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_STREAM_SYNCHRONIZER, GstStreamSynchronizer))
+#define GST_STREAM_SYNCHRONIZER_CAST(obj) \
+ ((GstStreamSynchronizer *) obj)
+#define GST_STREAM_SYNCHRONIZER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_STREAM_SYNCHRONIZER, GstStreamSynchronizerClass))
+#define GST_IS_STREAM_SYNCHRONIZER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_STREAM_SYNCHRONIZER))
+#define GST_IS_STREAM_SYNCHRONIZER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_STREAM_SYNCHRONIZER))
+
+typedef struct _GstStreamSynchronizer GstStreamSynchronizer;
+typedef struct _GstStreamSynchronizerClass GstStreamSynchronizerClass;
+
+struct _GstStreamSynchronizer
+{
+ GstElement parent;
+
+ /* < private > */
+ GMutex *lock;
+ GCond *stream_finish_cond;
+ gboolean shutdown;
+
+ GList *streams;
+ guint current_stream_number;
+
+ GstClockTime group_start_time;
+};
+
+struct _GstStreamSynchronizerClass
+{
+ GstElementClass parent;
+};
+
+GType gst_stream_synchronizer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_STREAM_SYNCHRONIZER_H__ */
diff --git a/gst/playback/gstsubtitleoverlay.c b/gst/playback/gstsubtitleoverlay.c
new file mode 100644
index 0000000..4d4573e
--- /dev/null
+++ b/gst/playback/gstsubtitleoverlay.c
@@ -0,0 +1,2124 @@
+/*
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-subtitleoverlay
+ *
+ * #GstBin that auto-magically overlays a video stream with subtitles by
+ * autoplugging the required elements.
+ *
+ * It supports raw, timestamped text, different textual subtitle formats and
+ * DVD subpicture subtitles.
+ *
+ * <refsect2>
+ * <title>Examples</title>
+ * |[
+ * gst-launch -v filesrc location=test.mkv ! matroskademux name=demux ! "video/x-h264" ! queue2 ! decodebin ! subtitleoverlay name=overlay ! videoconvert ! autovideosink demux. ! "video/x-dvd-subpicture" ! queue2 ! overlay.
+ * ]| This will play back the given Matroska file with h264 video and subpicture subtitles.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstsubtitleoverlay.h"
+
+#include <gst/gstfilter.h>
+#include <gst/pbutils/missing-plugins.h>
+#include <gst/video/video.h>
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (subtitle_overlay_debug);
+#define GST_CAT_DEFAULT subtitle_overlay_debug
+
+#define IS_SUBTITLE_CHAIN_IGNORE_ERROR(flow) \
+ G_UNLIKELY (flow == GST_FLOW_ERROR || flow == GST_FLOW_NOT_NEGOTIATED)
+
+#define IS_VIDEO_CHAIN_IGNORE_ERROR(flow) \
+ G_UNLIKELY (flow == GST_FLOW_ERROR)
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate video_sinktemplate =
+GST_STATIC_PAD_TEMPLATE ("video_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate subtitle_sinktemplate =
+GST_STATIC_PAD_TEMPLATE ("subtitle_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+enum
+{
+ PROP_0,
+ PROP_SILENT,
+ PROP_FONT_DESC,
+ PROP_SUBTITLE_ENCODING
+};
+
+#define gst_subtitle_overlay_parent_class parent_class
+G_DEFINE_TYPE (GstSubtitleOverlay, gst_subtitle_overlay, GST_TYPE_BIN);
+
+static GQuark _subtitle_overlay_event_marker_id = 0;
+
+static void
+do_async_start (GstSubtitleOverlay * self)
+{
+ if (!self->do_async) {
+ GstMessage *msg = gst_message_new_async_start (GST_OBJECT_CAST (self));
+
+ GST_DEBUG_OBJECT (self, "Posting async-start");
+ GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (self), msg);
+ self->do_async = TRUE;
+ }
+}
+
+static void
+do_async_done (GstSubtitleOverlay * self)
+{
+ if (self->do_async) {
+ GstMessage *msg =
+ gst_message_new_async_done (GST_OBJECT_CAST (self), FALSE);
+
+ GST_DEBUG_OBJECT (self, "Posting async-done");
+ GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (self), msg);
+ self->do_async = FALSE;
+ }
+}
+
+static GstProbeReturn
+_pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data);
+
+static void
+block_video (GstSubtitleOverlay * self)
+{
+ if (self->video_block_id != 0)
+ return;
+
+ if (self->video_block_pad) {
+ self->video_block_id =
+ gst_pad_add_probe (self->video_block_pad, GST_PROBE_TYPE_BLOCK,
+ _pad_blocked_cb, gst_object_ref (self),
+ (GDestroyNotify) gst_object_unref);
+ }
+}
+
+static void
+unblock_video (GstSubtitleOverlay * self)
+{
+ if (self->video_block_id) {
+ gst_pad_remove_probe (self->video_block_pad, self->video_block_id);
+ self->video_sink_blocked = FALSE;
+ self->video_block_id = 0;
+ }
+}
+
+static void
+block_subtitle (GstSubtitleOverlay * self)
+{
+ if (self->subtitle_block_id != 0)
+ return;
+
+ if (self->subtitle_block_pad) {
+ self->subtitle_block_id =
+ gst_pad_add_probe (self->subtitle_block_pad, GST_PROBE_TYPE_BLOCK,
+ _pad_blocked_cb, gst_object_ref (self),
+ (GDestroyNotify) gst_object_unref);
+ }
+}
+
+static void
+unblock_subtitle (GstSubtitleOverlay * self)
+{
+ if (self->subtitle_block_id) {
+ gst_pad_remove_probe (self->subtitle_block_pad, self->subtitle_block_id);
+ self->subtitle_sink_blocked = FALSE;
+ self->subtitle_block_id = 0;
+ }
+}
+
+static void
+gst_subtitle_overlay_finalize (GObject * object)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (object);
+
+ if (self->lock) {
+ g_mutex_free (self->lock);
+ self->lock = NULL;
+ }
+
+ if (self->factories_lock) {
+ g_mutex_free (self->factories_lock);
+ self->factories_lock = NULL;
+ }
+
+ if (self->factories)
+ gst_plugin_feature_list_free (self->factories);
+ self->factories = NULL;
+ gst_caps_replace (&self->factory_caps, NULL);
+
+ if (self->font_desc) {
+ g_free (self->font_desc);
+ self->font_desc = NULL;
+ }
+
+ if (self->encoding) {
+ g_free (self->encoding);
+ self->encoding = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+_is_renderer (GstElementFactory * factory)
+{
+ const gchar *klass, *name;
+
+ klass = gst_element_factory_get_klass (factory);
+ name = gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST (factory));
+
+ if (strstr (klass, "Overlay/Subtitle") != NULL ||
+ strstr (klass, "Overlay/SubPicture") != NULL)
+ return TRUE;
+ if (strcmp (name, "textoverlay") == 0)
+ return TRUE;
+ return FALSE;
+}
+
+static gboolean
+_is_parser (GstElementFactory * factory)
+{
+ const gchar *klass;
+
+ klass = gst_element_factory_get_klass (factory);
+
+ if (strstr (klass, "Parser/Subtitle") != NULL)
+ return TRUE;
+ return FALSE;
+}
+
+static const gchar *_sub_pad_names[] = { "subpicture", "subpicture_sink",
+ "text", "text_sink",
+ "subtitle_sink", "subtitle"
+};
+
+static inline gboolean
+_is_raw_video (GstStructure * s)
+{
+ const gchar *name;
+
+ name = gst_structure_get_name (s);
+
+ if (g_str_has_prefix (name, "video/x-raw"))
+ return TRUE;
+ return FALSE;
+}
+
+static gboolean
+_is_raw_video_pad (GstPad * pad)
+{
+ GstCaps *caps = gst_pad_get_current_caps (pad);
+ gboolean raw;
+
+ raw = _is_raw_video (gst_caps_get_structure (caps, 0));
+
+ gst_caps_unref (caps);
+
+ return raw;
+}
+
+static GstCaps *
+_get_sub_caps (GstElementFactory * factory)
+{
+ const GList *templates;
+ GList *walk;
+ gboolean is_parser = _is_parser (factory);
+
+ templates = gst_element_factory_get_static_pad_templates (factory);
+ for (walk = (GList *) templates; walk; walk = g_list_next (walk)) {
+ GstStaticPadTemplate *templ = walk->data;
+
+ if (templ->direction == GST_PAD_SINK && templ->presence == GST_PAD_ALWAYS) {
+ gboolean found = FALSE;
+
+ if (is_parser) {
+ found = TRUE;
+ } else {
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (_sub_pad_names); i++) {
+ if (strcmp (templ->name_template, _sub_pad_names[i]) == 0) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ if (found)
+ return gst_static_caps_get (&templ->static_caps);
+ }
+ }
+ return NULL;
+}
+
+static gboolean
+_factory_filter (GstPluginFeature * feature, GstCaps ** subcaps)
+{
+ GstElementFactory *factory;
+ guint rank;
+ const gchar *name;
+ const GList *templates;
+ GList *walk;
+ gboolean is_renderer;
+ GstCaps *templ_caps = NULL;
+ gboolean have_video_sink = FALSE;
+
+ /* we only care about element factories */
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+
+ factory = GST_ELEMENT_FACTORY_CAST (feature);
+
+ /* only select elements with autoplugging rank or textoverlay */
+ name = gst_plugin_feature_get_name (feature);
+ rank = gst_plugin_feature_get_rank (feature);
+ if (strcmp ("textoverlay", name) != 0 && rank < GST_RANK_MARGINAL)
+ return FALSE;
+
+ /* Check if it's a renderer or a parser */
+ if (_is_renderer (factory)) {
+ is_renderer = TRUE;
+ } else if (_is_parser (factory)) {
+ is_renderer = FALSE;
+ } else {
+ return FALSE;
+ }
+
+ /* Check if there's a video sink in case of a renderer */
+ if (is_renderer) {
+ templates = gst_element_factory_get_static_pad_templates (factory);
+ for (walk = (GList *) templates; walk; walk = g_list_next (walk)) {
+ GstStaticPadTemplate *templ = walk->data;
+
+ /* we only care about the always-sink templates */
+ if (templ->direction == GST_PAD_SINK && templ->presence == GST_PAD_ALWAYS) {
+ if (strcmp (templ->name_template, "video") == 0 ||
+ strcmp (templ->name_template, "video_sink") == 0) {
+ have_video_sink = TRUE;
+ }
+ }
+ }
+ }
+ templ_caps = _get_sub_caps (factory);
+
+ if (is_renderer && have_video_sink && templ_caps) {
+ GstCaps *tmp;
+
+ GST_DEBUG ("Found renderer element %s (%s) with caps %" GST_PTR_FORMAT,
+ gst_element_factory_get_longname (factory),
+ gst_plugin_feature_get_name (feature), templ_caps);
+ tmp = gst_caps_union (*subcaps, templ_caps);
+ gst_caps_unref (templ_caps);
+ gst_caps_replace (subcaps, tmp);
+ gst_caps_unref (tmp);
+ return TRUE;
+ } else if (!is_renderer && !have_video_sink && templ_caps) {
+ GstCaps *tmp;
+
+ GST_DEBUG ("Found parser element %s (%s) with caps %" GST_PTR_FORMAT,
+ gst_element_factory_get_longname (factory),
+ gst_plugin_feature_get_name (feature), templ_caps);
+ tmp = gst_caps_union (*subcaps, templ_caps);
+ gst_caps_unref (templ_caps);
+ gst_caps_replace (subcaps, tmp);
+ gst_caps_unref (tmp);
+ return TRUE;
+ } else {
+ if (templ_caps)
+ gst_caps_unref (templ_caps);
+ return FALSE;
+ }
+}
+
+/* Call with factories_lock! */
+static gboolean
+gst_subtitle_overlay_update_factory_list (GstSubtitleOverlay * self)
+{
+ if (!self->factories
+ || self->factories_cookie !=
+ gst_default_registry_get_feature_list_cookie ()) {
+ GstCaps *subcaps;
+ GList *factories;
+
+ subcaps = gst_caps_new_empty ();
+
+ factories = gst_default_registry_feature_filter (
+ (GstPluginFeatureFilter) _factory_filter, FALSE, &subcaps);
+ GST_DEBUG_OBJECT (self, "Created factory caps: %" GST_PTR_FORMAT, subcaps);
+ gst_caps_replace (&self->factory_caps, subcaps);
+ gst_caps_unref (subcaps);
+ if (self->factories)
+ gst_plugin_feature_list_free (self->factories);
+ self->factories = factories;
+ self->factories_cookie = gst_default_registry_get_feature_list_cookie ();
+ }
+
+ return (self->factories != NULL);
+}
+
+G_LOCK_DEFINE_STATIC (_factory_caps);
+static GstCaps *_factory_caps = NULL;
+static guint32 _factory_caps_cookie = 0;
+
+GstCaps *
+gst_subtitle_overlay_create_factory_caps (void)
+{
+ GList *factories;
+ GstCaps *subcaps = NULL;
+
+ G_LOCK (_factory_caps);
+ if (!_factory_caps
+ || _factory_caps_cookie !=
+ gst_default_registry_get_feature_list_cookie ()) {
+ if (_factory_caps)
+ gst_caps_unref (_factory_caps);
+ _factory_caps = gst_caps_new_empty ();
+
+ factories = gst_default_registry_feature_filter (
+ (GstPluginFeatureFilter) _factory_filter, FALSE, &_factory_caps);
+ GST_DEBUG ("Created factory caps: %" GST_PTR_FORMAT, _factory_caps);
+ gst_plugin_feature_list_free (factories);
+ _factory_caps_cookie = gst_default_registry_get_feature_list_cookie ();
+ }
+ subcaps = gst_caps_ref (_factory_caps);
+ G_UNLOCK (_factory_caps);
+
+ return subcaps;
+}
+
+static gboolean
+_filter_factories_for_caps (GstElementFactory * factory, const GstCaps * caps)
+{
+ GstCaps *fcaps = _get_sub_caps (factory);
+ gboolean ret = (fcaps) ? gst_caps_can_intersect (fcaps, caps) : FALSE;
+
+ if (fcaps)
+ gst_caps_unref (fcaps);
+
+ if (ret)
+ gst_object_ref (factory);
+ return ret;
+}
+
+static gint
+_sort_by_ranks (GstPluginFeature * f1, GstPluginFeature * f2)
+{
+ gint diff;
+ const gchar *rname1, *rname2;
+
+ diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1);
+ if (diff != 0)
+ return diff;
+
+ /* If the ranks are the same sort by name to get deterministic results */
+ rname1 = gst_plugin_feature_get_name (f1);
+ rname2 = gst_plugin_feature_get_name (f2);
+
+ diff = strcmp (rname1, rname2);
+
+ return diff;
+}
+
+static GstPad *
+_get_sub_pad (GstElement * element)
+{
+ GstPad *pad;
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (_sub_pad_names); i++) {
+ pad = gst_element_get_static_pad (element, _sub_pad_names[i]);
+ if (pad)
+ return pad;
+ }
+ return NULL;
+}
+
+static GstPad *
+_get_video_pad (GstElement * element)
+{
+ static const gchar *pad_names[] = { "video", "video_sink" };
+ GstPad *pad;
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (pad_names); i++) {
+ pad = gst_element_get_static_pad (element, pad_names[i]);
+ if (pad)
+ return pad;
+ }
+ return NULL;
+}
+
+static gboolean
+_create_element (GstSubtitleOverlay * self, GstElement ** element,
+ const gchar * factory_name, GstElementFactory * factory,
+ const gchar * element_name, gboolean mandatory)
+{
+ GstElement *elt;
+
+ g_assert (!factory || !factory_name);
+
+ if (factory_name) {
+ elt = gst_element_factory_make (factory_name, element_name);
+ } else {
+ factory_name =
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST (factory));
+ elt = gst_element_factory_create (factory, element_name);
+ }
+
+ if (G_UNLIKELY (!elt)) {
+ if (!factory) {
+ GstMessage *msg;
+
+ msg =
+ gst_missing_element_message_new (GST_ELEMENT_CAST (self),
+ factory_name);
+ gst_element_post_message (GST_ELEMENT_CAST (self), msg);
+
+ if (mandatory)
+ GST_ELEMENT_ERROR (self, CORE, MISSING_PLUGIN, (NULL),
+ ("no '%s' plugin found", factory_name));
+ else
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN, (NULL),
+ ("no '%s' plugin found", factory_name));
+ } else {
+ if (mandatory) {
+ GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL),
+ ("can't instantiate '%s'", factory_name));
+ } else {
+ GST_ELEMENT_WARNING (self, CORE, FAILED, (NULL),
+ ("can't instantiate '%s'", factory_name));
+ }
+ }
+
+ return FALSE;
+ }
+
+ if (G_UNLIKELY (gst_element_set_state (elt,
+ GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS)) {
+ gst_object_unref (elt);
+ if (mandatory) {
+ GST_ELEMENT_ERROR (self, CORE, STATE_CHANGE, (NULL),
+ ("failed to set '%s' to READY", factory_name));
+ } else {
+ GST_WARNING_OBJECT (self, "Failed to set '%s' to READY", factory_name);
+ }
+ return FALSE;
+ }
+
+ if (G_UNLIKELY (!gst_bin_add (GST_BIN_CAST (self), gst_object_ref (elt)))) {
+ gst_element_set_state (elt, GST_STATE_NULL);
+ gst_object_unref (elt);
+ if (mandatory) {
+ GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL),
+ ("failed to add '%s' to subtitleoverlay", factory_name));
+ } else {
+ GST_WARNING_OBJECT (self, "Failed to add '%s' to subtitleoverlay",
+ factory_name);
+ }
+ return FALSE;
+ }
+
+ gst_element_sync_state_with_parent (elt);
+ *element = elt;
+ return TRUE;
+}
+
+static void
+_remove_element (GstSubtitleOverlay * self, GstElement ** element)
+{
+ if (*element) {
+ gst_bin_remove (GST_BIN_CAST (self), *element);
+ gst_element_set_state (*element, GST_STATE_NULL);
+ gst_object_unref (*element);
+ *element = NULL;
+ }
+}
+
+static void
+_generate_update_segment_event (GstSegment * segment, GstEvent ** event1)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ event = gst_event_new_segment (segment);
+ structure = gst_event_writable_structure (event);
+ gst_structure_id_set (structure, _subtitle_overlay_event_marker_id,
+ G_TYPE_BOOLEAN, TRUE, NULL);
+ *event1 = event;
+}
+
+static gboolean
+_setup_passthrough (GstSubtitleOverlay * self)
+{
+ GstPad *src, *sink;
+ GstElement *identity;
+
+ GST_DEBUG_OBJECT (self, "Doing video passthrough");
+
+ if (self->passthrough_identity) {
+ GST_DEBUG_OBJECT (self, "Already in passthrough mode");
+ goto out;
+ }
+
+ /* Unlink & destroy everything */
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->video_sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->subtitle_sinkpad), NULL);
+ self->silent_property = NULL;
+ _remove_element (self, &self->post_colorspace);
+ _remove_element (self, &self->overlay);
+ _remove_element (self, &self->parser);
+ _remove_element (self, &self->renderer);
+ _remove_element (self, &self->pre_colorspace);
+ _remove_element (self, &self->passthrough_identity);
+
+ if (G_UNLIKELY (!_create_element (self, &self->passthrough_identity,
+ "identity", NULL, "passthrough-identity", TRUE))) {
+ return FALSE;
+ }
+
+ identity = self->passthrough_identity;
+ g_object_set (G_OBJECT (identity), "silent", TRUE, "signal-handoffs", FALSE,
+ NULL);
+
+ /* Set src ghostpad target */
+ src = gst_element_get_static_pad (self->passthrough_identity, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_ELEMENT_ERROR (self, CORE, PAD, (NULL),
+ ("Failed to get srcpad from identity"));
+ return FALSE;
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
+ src))) {
+ GST_ELEMENT_ERROR (self, CORE, PAD, (NULL),
+ ("Failed to set srcpad target"));
+ gst_object_unref (src);
+ return FALSE;
+ }
+ gst_object_unref (src);
+
+ sink = gst_element_get_static_pad (self->passthrough_identity, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_ELEMENT_ERROR (self, CORE, PAD, (NULL),
+ ("Failed to get sinkpad from identity"));
+ return FALSE;
+ }
+
+ /* Send segment to the identity. This is dropped because identity
+ * is not linked downstream yet */
+ if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
+ GstEvent *event1;
+
+ _generate_update_segment_event (&self->video_segment, &event1);
+ GST_DEBUG_OBJECT (self,
+ "Pushing video segment event: %" GST_PTR_FORMAT, event1);
+ gst_pad_send_event (sink, event1);
+ }
+
+ /* Link sink ghostpads to identity */
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->video_sinkpad), sink))) {
+ GST_ELEMENT_ERROR (self, CORE, PAD, (NULL),
+ ("Failed to set video sinkpad target"));
+ gst_object_unref (sink);
+ return FALSE;
+ }
+ gst_object_unref (sink);
+
+ GST_DEBUG_OBJECT (self, "Video passthrough setup successfully");
+
+out:
+ /* Unblock pads */
+ unblock_video (self);
+ unblock_subtitle (self);
+
+ return TRUE;
+}
+
+/* Must be called with subtitleoverlay lock! */
+static void
+gst_subtitle_overlay_set_fps (GstSubtitleOverlay * self)
+{
+ GObjectClass *gobject_class;
+ GParamSpec *pspec;
+
+ if (!self->parser || self->fps_d == 0)
+ return;
+
+ gobject_class = G_OBJECT_GET_CLASS (self->parser);
+ pspec = g_object_class_find_property (gobject_class, "video-fps");
+ if (!pspec || pspec->value_type != GST_TYPE_FRACTION)
+ return;
+
+ GST_DEBUG_OBJECT (self, "Updating video-fps property in parser");
+ g_object_set (self->parser, "video-fps", self->fps_n, self->fps_d, NULL);
+}
+
+static const gchar *
+_get_silent_property (GstElement * element, gboolean * invert)
+{
+ static const struct
+ {
+ const gchar *name;
+ gboolean invert;
+ } properties[] = { {
+ "silent", FALSE}, {
+ "enable", TRUE}};
+ GObjectClass *gobject_class;
+ GParamSpec *pspec;
+ guint i;
+
+ gobject_class = G_OBJECT_GET_CLASS (element);
+
+ for (i = 0; i < G_N_ELEMENTS (properties); i++) {
+ pspec = g_object_class_find_property (gobject_class, properties[i].name);
+ if (pspec && pspec->value_type == G_TYPE_BOOLEAN) {
+ *invert = properties[i].invert;
+ return properties[i].name;
+ }
+ }
+ return NULL;
+}
+
+static gboolean
+_has_subtitle_encoding_property (GstElement * element)
+{
+ GParamSpec *pspec;
+
+ pspec =
+ g_object_class_find_property (G_OBJECT_GET_CLASS (element),
+ "subtitle-encoding");
+ return (pspec && pspec->value_type == G_TYPE_STRING);
+}
+
+static gboolean
+_has_font_desc_property (GstElement * element)
+{
+ GParamSpec *pspec;
+
+ pspec =
+ g_object_class_find_property (G_OBJECT_GET_CLASS (element), "font-desc");
+ return (pspec && pspec->value_type == G_TYPE_STRING);
+}
+
+static GstProbeReturn
+_pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY_CAST (user_data);
+ GstCaps *subcaps;
+ GList *l, *factories = NULL;
+
+ GST_DEBUG_OBJECT (pad, "Pad blocked");
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ if (pad == self->video_block_pad)
+ self->video_sink_blocked = TRUE;
+ else if (pad == self->subtitle_block_pad)
+ self->subtitle_sink_blocked = TRUE;
+
+ /* Now either both or the video sink are blocked */
+
+ /* Get current subtitle caps */
+ subcaps = self->subcaps;
+ if (!subcaps) {
+ GstPad *peer;
+
+ peer = gst_pad_get_peer (self->subtitle_sinkpad);
+ if (peer) {
+ subcaps = gst_pad_get_current_caps (peer);
+ if (!subcaps) {
+ subcaps = gst_pad_get_caps (peer, NULL);
+ if (!gst_caps_is_fixed (subcaps)) {
+ gst_caps_unref (subcaps);
+ subcaps = NULL;
+ }
+ }
+ gst_object_unref (peer);
+ }
+ gst_caps_replace (&self->subcaps, subcaps);
+ if (subcaps)
+ gst_caps_unref (subcaps);
+ }
+ GST_DEBUG_OBJECT (self, "Current subtitle caps: %" GST_PTR_FORMAT, subcaps);
+
+ /* If there are no subcaps but the subtitle sink is blocked upstream
+ * must behave wrong as there are no fixed caps set for the first
+ * buffer or in-order event */
+ if (G_UNLIKELY (!subcaps && self->subtitle_sink_blocked)) {
+ GST_ELEMENT_WARNING (self, CORE, NEGOTIATION, (NULL),
+ ("Subtitle sink is blocked but we have no subtitle caps"));
+ subcaps = NULL;
+ }
+
+ if (self->subtitle_error || (self->silent && !self->silent_property)) {
+ _setup_passthrough (self);
+ do_async_done (self);
+ goto out;
+ }
+
+ /* Now do something with the caps */
+ if (subcaps && !self->subtitle_flush) {
+ GstPad *target =
+ gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (self->subtitle_sinkpad));
+
+ if (target && gst_pad_accept_caps (target, subcaps)) {
+ GST_DEBUG_OBJECT (pad, "Target accepts caps");
+
+ gst_object_unref (target);
+
+ /* Unblock pads */
+ unblock_video (self);
+ unblock_subtitle (self);
+
+ goto out;
+ } else if (target) {
+ gst_object_unref (target);
+ }
+ }
+
+ if (self->subtitle_sink_blocked && !self->video_sink_blocked) {
+ GST_DEBUG_OBJECT (self, "Subtitle sink blocked but video not blocked");
+ block_video (self);
+ goto out;
+ }
+
+ self->subtitle_flush = FALSE;
+
+ /* Find our factories */
+ g_mutex_lock (self->factories_lock);
+ gst_subtitle_overlay_update_factory_list (self);
+ if (subcaps) {
+ factories = gst_filter_run (self->factories,
+ (GstFilterFunc) _filter_factories_for_caps, FALSE, subcaps);
+ if (!factories) {
+ GstMessage *msg;
+
+ msg = gst_missing_decoder_message_new (GST_ELEMENT_CAST (self), subcaps);
+ gst_element_post_message (GST_ELEMENT_CAST (self), msg);
+ GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN, (NULL),
+ ("no suitable subtitle plugin found"));
+ subcaps = NULL;
+ self->subtitle_error = TRUE;
+ }
+ }
+ g_mutex_unlock (self->factories_lock);
+
+ if (!subcaps) {
+ _setup_passthrough (self);
+ do_async_done (self);
+ goto out;
+ }
+
+ /* Now the interesting parts are done: subtitle overlaying! */
+
+ /* Sort the factories by rank */
+ factories = g_list_sort (factories, (GCompareFunc) _sort_by_ranks);
+
+ for (l = factories; l; l = l->next) {
+ GstElementFactory *factory = l->data;
+ gboolean is_renderer = _is_renderer (factory);
+ GstElement *element;
+ GstPad *sink, *src;
+
+ /* Unlink & destroy everything */
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->video_sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->subtitle_sinkpad),
+ NULL);
+ self->silent_property = NULL;
+ _remove_element (self, &self->post_colorspace);
+ _remove_element (self, &self->overlay);
+ _remove_element (self, &self->parser);
+ _remove_element (self, &self->renderer);
+ _remove_element (self, &self->pre_colorspace);
+ _remove_element (self, &self->passthrough_identity);
+
+ GST_DEBUG_OBJECT (self, "Trying factory '%s'",
+ GST_STR_NULL (gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST
+ (factory))));
+
+ if (G_UNLIKELY ((is_renderer
+ && !_create_element (self, &self->renderer, NULL, factory,
+ "renderer", FALSE)) || (!is_renderer
+ && !_create_element (self, &self->parser, NULL, factory,
+ "parser", FALSE))))
+ continue;
+
+ element = is_renderer ? self->renderer : self->parser;
+
+ /* If this is a parser, create textoverlay and link video and the parser to it
+ * Else link the renderer to the output colorspace */
+ if (!is_renderer) {
+ GstElement *overlay;
+ GstPad *video_peer;
+
+ /* Try to get the latest video framerate */
+ video_peer = gst_pad_get_peer (self->video_sinkpad);
+ if (video_peer) {
+ GstCaps *video_caps;
+
+ video_caps = gst_pad_get_current_caps (video_peer);
+ if (!video_caps) {
+ video_caps = gst_pad_get_caps (video_peer, NULL);
+ if (!gst_caps_is_fixed (video_caps)) {
+ gst_caps_unref (video_caps);
+ video_caps = NULL;
+ }
+ }
+
+ if (video_caps) {
+ GstVideoInfo info;
+
+ if (gst_video_info_from_caps (&info, video_caps)) {
+ if (self->fps_n != info.fps_n || self->fps_d != info.fps_d) {
+ GST_DEBUG_OBJECT (self, "New video fps: %d/%d", info.fps_n,
+ info.fps_d);
+ self->fps_n = info.fps_n;
+ self->fps_d = info.fps_d;
+ }
+ }
+ }
+
+ if (video_caps)
+ gst_caps_unref (video_caps);
+ gst_object_unref (video_peer);
+ }
+
+ if (_has_subtitle_encoding_property (self->parser))
+ g_object_set (self->parser, "subtitle-encoding", self->encoding, NULL);
+
+ /* Try to set video fps on the parser */
+ gst_subtitle_overlay_set_fps (self);
+
+ /* First link everything internally */
+ if (G_UNLIKELY (!_create_element (self, &self->overlay, "textoverlay",
+ NULL, "overlay", FALSE))) {
+ continue;
+ }
+ overlay = self->overlay;
+ self->silent_property = "silent";
+ self->silent_property_invert = FALSE;
+
+ /* Set some properties */
+ g_object_set (G_OBJECT (overlay),
+ "halign", "center", "valign", "bottom", "wait-text", FALSE, NULL);
+ if (self->font_desc)
+ g_object_set (G_OBJECT (overlay), "font-desc", self->font_desc, NULL);
+
+ src = gst_element_get_static_pad (element, "src");
+ if (G_UNLIKELY (!src)) {
+ continue;
+ }
+
+ sink = gst_element_get_static_pad (overlay, "text_sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get text sink from textoverlay");
+ gst_object_unref (src);
+ continue;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (src, sink) != GST_PAD_LINK_OK)) {
+ GST_WARNING_OBJECT (self, "Can't link parser to textoverlay");
+ gst_object_unref (sink);
+ gst_object_unref (src);
+ continue;
+ }
+ gst_object_unref (sink);
+ gst_object_unref (src);
+
+ if (G_UNLIKELY (!_create_element (self, &self->post_colorspace,
+ COLORSPACE, NULL, "post-colorspace", FALSE))) {
+ continue;
+ }
+
+ src = gst_element_get_static_pad (overlay, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get src pad from overlay");
+ continue;
+ }
+
+ sink = gst_element_get_static_pad (self->post_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ gst_object_unref (src);
+ continue;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (src, sink) != GST_PAD_LINK_OK)) {
+ GST_WARNING_OBJECT (self, "Can't link overlay with " COLORSPACE);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ if (G_UNLIKELY (!_create_element (self, &self->pre_colorspace,
+ COLORSPACE, NULL, "pre-colorspace", FALSE))) {
+ continue;
+ }
+
+ sink = gst_element_get_static_pad (overlay, "video_sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get video sink from textoverlay");
+ continue;
+ }
+
+ src = gst_element_get_static_pad (self->pre_colorspace, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get srcpad from " COLORSPACE);
+ gst_object_unref (sink);
+ continue;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (src, sink) != GST_PAD_LINK_OK)) {
+ GST_WARNING_OBJECT (self, "Can't link " COLORSPACE " to textoverlay");
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ /* Set src ghostpad target */
+ src = gst_element_get_static_pad (self->post_colorspace, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get src pad from " COLORSPACE);
+ continue;
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->srcpad), src))) {
+ GST_WARNING_OBJECT (self, "Can't set srcpad target");
+ gst_object_unref (src);
+ continue;
+ }
+ gst_object_unref (src);
+
+ /* Send segments to the parser/overlay if necessary. These are not sent
+ * outside this element because of the proxy pad event function */
+ if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
+ GstEvent *event1;
+
+ sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ continue;
+ }
+
+ _generate_update_segment_event (&self->video_segment, &event1);
+ GST_DEBUG_OBJECT (self,
+ "Pushing video segment event: %" GST_PTR_FORMAT, event1);
+ gst_pad_send_event (sink, event1);
+
+ gst_object_unref (sink);
+ }
+
+ if (self->subtitle_segment.format != GST_FORMAT_UNDEFINED) {
+ GstEvent *event1;
+
+ sink = gst_element_get_static_pad (element, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Failed to get subpad");
+ continue;
+ }
+
+ _generate_update_segment_event (&self->subtitle_segment, &event1);
+ GST_DEBUG_OBJECT (self,
+ "Pushing subtitle segment event: %" GST_PTR_FORMAT, event1);
+ gst_pad_send_event (sink, event1);
+
+ gst_object_unref (sink);
+ }
+
+ /* Set the sink ghostpad targets */
+ sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ continue;
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->video_sinkpad), sink))) {
+ GST_WARNING_OBJECT (self, "Can't set video sinkpad target");
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (sink);
+
+ /* Link subtitle identity to subtitle pad of our element */
+ sink = gst_element_get_static_pad (element, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Failed to get subpad");
+ continue;
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->subtitle_sinkpad), sink))) {
+ GST_WARNING_OBJECT (self, "Failed to set subtitle sink target");
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (sink);
+ } else {
+ const gchar *name =
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST (factory));
+ gboolean is_raw_video = _is_raw_video_pad (self->video_sinkpad);
+
+ if (strcmp (name, "textoverlay") == 0) {
+ /* Set some textoverlay specific properties */
+ g_object_set (G_OBJECT (element),
+ "halign", "center", "valign", "bottom", "wait-text", FALSE, NULL);
+ if (self->font_desc)
+ g_object_set (G_OBJECT (element), "font-desc", self->font_desc, NULL);
+ self->silent_property = "silent";
+ self->silent_property_invert = FALSE;
+ } else {
+ self->silent_property =
+ _get_silent_property (element, &self->silent_property_invert);
+ if (_has_subtitle_encoding_property (self->renderer))
+ g_object_set (self->renderer, "subtitle-encoding", self->encoding,
+ NULL);
+ if (_has_font_desc_property (self->renderer))
+ g_object_set (self->renderer, "font-desc", self->font_desc, NULL);
+ }
+
+ if (is_raw_video) {
+ /* First check that renderer also supports raw video */
+ sink = _get_video_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get video sink from renderer");
+ continue;
+ }
+
+ if (G_UNLIKELY (!_is_raw_video_pad (sink))) {
+ GST_DEBUG_OBJECT (self, "Renderer doesn't support raw video");
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (sink);
+
+ /* First link everything internally */
+ if (G_UNLIKELY (!_create_element (self, &self->post_colorspace,
+ COLORSPACE, NULL, "post-colorspace", FALSE))) {
+ continue;
+ }
+ src = gst_element_get_static_pad (element, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get src pad from renderer");
+ continue;
+ }
+
+ sink = gst_element_get_static_pad (self->post_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ gst_object_unref (src);
+ continue;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (src, sink) != GST_PAD_LINK_OK)) {
+ GST_WARNING_OBJECT (self, "Can't link renderer with " COLORSPACE);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ if (G_UNLIKELY (!_create_element (self, &self->pre_colorspace,
+ COLORSPACE, NULL, "pre-colorspace", FALSE))) {
+ continue;
+ }
+
+ sink = _get_video_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get video sink from renderer");
+ continue;
+ }
+
+ src = gst_element_get_static_pad (self->pre_colorspace, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get srcpad from " COLORSPACE);
+ gst_object_unref (sink);
+ continue;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (src, sink) != GST_PAD_LINK_OK)) {
+ GST_WARNING_OBJECT (self, "Can't link " COLORSPACE " to renderer");
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ /* Set src ghostpad target */
+ src = gst_element_get_static_pad (self->post_colorspace, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get src pad from " COLORSPACE);
+ continue;
+ }
+ } else { /* No raw video pad */
+ GstCaps *allowed_caps, *video_caps = NULL;
+ GstPad *video_peer;
+ gboolean can_intersect = FALSE;
+
+ video_peer = gst_pad_get_peer (self->video_sinkpad);
+ if (video_peer) {
+ video_caps = gst_pad_get_current_caps (video_peer);
+ if (!video_caps) {
+ video_caps = gst_pad_get_caps (video_peer, NULL);
+ }
+ gst_object_unref (video_peer);
+ }
+
+ sink = _get_video_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get video sink from renderer");
+ continue;
+ }
+ allowed_caps = gst_pad_get_caps (sink, NULL);
+ gst_object_unref (sink);
+
+ if (allowed_caps && video_caps)
+ can_intersect = gst_caps_can_intersect (allowed_caps, video_caps);
+
+ if (allowed_caps)
+ gst_caps_unref (allowed_caps);
+
+ if (video_caps)
+ gst_caps_unref (video_caps);
+
+ if (G_UNLIKELY (!can_intersect)) {
+ GST_WARNING_OBJECT (self, "Renderer with custom caps is not "
+ "compatible with video stream");
+ continue;
+ }
+
+ src = gst_element_get_static_pad (element, "src");
+ if (G_UNLIKELY (!src)) {
+ GST_WARNING_OBJECT (self, "Can't get src pad from renderer");
+ continue;
+ }
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->srcpad), src))) {
+ GST_WARNING_OBJECT (self, "Can't set srcpad target");
+ gst_object_unref (src);
+ continue;
+ }
+ gst_object_unref (src);
+
+ /* Send segments to the renderer if necessary. These are not sent
+ * outside this element because of the proxy pad event handler */
+ if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
+ GstEvent *event1;
+
+ sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ continue;
+ }
+
+ _generate_update_segment_event (&self->video_segment, &event1);
+ GST_DEBUG_OBJECT (self,
+ "Pushing video segment event: %" GST_PTR_FORMAT, event1);
+ gst_pad_send_event (sink, event1);
+ gst_object_unref (sink);
+ }
+
+ if (self->subtitle_segment.format != GST_FORMAT_UNDEFINED) {
+ GstEvent *event1;
+
+ sink = _get_sub_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Failed to get subpad");
+ continue;
+ }
+
+ _generate_update_segment_event (&self->subtitle_segment, &event1);
+ GST_DEBUG_OBJECT (self,
+ "Pushing subtitle segment event: %" GST_PTR_FORMAT, event1);
+ gst_pad_send_event (sink, event1);
+ gst_object_unref (sink);
+ }
+
+ /* Set the sink ghostpad targets */
+ if (self->pre_colorspace) {
+ sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from " COLORSPACE);
+ continue;
+ }
+ } else {
+ sink = _get_video_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Can't get sink pad from %" GST_PTR_FORMAT,
+ element);
+ continue;
+ }
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->video_sinkpad), sink))) {
+ GST_WARNING_OBJECT (self, "Can't set video sinkpad target");
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (sink);
+
+ sink = _get_sub_pad (element);
+ if (G_UNLIKELY (!sink)) {
+ GST_WARNING_OBJECT (self, "Failed to get subpad");
+ continue;
+ }
+
+ if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
+ (self->subtitle_sinkpad), sink))) {
+ GST_WARNING_OBJECT (self, "Failed to set subtitle sink target");
+ gst_object_unref (sink);
+ continue;
+ }
+ gst_object_unref (sink);
+ }
+
+ break;
+ }
+
+ if (G_UNLIKELY (l == NULL)) {
+ GST_ELEMENT_WARNING (self, CORE, FAILED, (NULL),
+ ("Failed to find any usable factories"));
+ self->subtitle_error = TRUE;
+ _setup_passthrough (self);
+ do_async_done (self);
+ } else {
+ GST_DEBUG_OBJECT (self, "Everything worked, unblocking pads");
+ unblock_video (self);
+ unblock_subtitle (self);
+ do_async_done (self);
+ }
+
+out:
+ if (factories)
+ gst_plugin_feature_list_free (factories);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ return GST_PROBE_OK;
+}
+
+static GstStateChangeReturn
+gst_subtitle_overlay_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_DEBUG_OBJECT (self, "State change NULL->READY");
+ g_mutex_lock (self->factories_lock);
+ if (G_UNLIKELY (!gst_subtitle_overlay_update_factory_list (self))) {
+ g_mutex_unlock (self->factories_lock);
+ return GST_STATE_CHANGE_FAILURE;
+ }
+ g_mutex_unlock (self->factories_lock);
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ /* Set the internal pads to blocking */
+ block_video (self);
+ block_subtitle (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG_OBJECT (self, "State change READY->PAUSED");
+ gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
+ gst_segment_init (&self->subtitle_segment, GST_FORMAT_UNDEFINED);
+
+ self->fps_n = self->fps_d = 0;
+
+ self->subtitle_flush = FALSE;
+ self->subtitle_error = FALSE;
+
+ self->downstream_chain_error = FALSE;
+
+ do_async_start (self);
+ ret = GST_STATE_CHANGE_ASYNC;
+
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_DEBUG_OBJECT (self, "State change PAUSED->PLAYING");
+ default:
+ break;
+ }
+
+ {
+ GstStateChangeReturn bret;
+
+ bret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ GST_DEBUG_OBJECT (self, "Base class state changed returned: %d", bret);
+ if (G_UNLIKELY (bret == GST_STATE_CHANGE_FAILURE))
+ return ret;
+ else if (bret == GST_STATE_CHANGE_ASYNC)
+ ret = bret;
+ else if (G_UNLIKELY (bret == GST_STATE_CHANGE_NO_PREROLL)) {
+ do_async_done (self);
+ ret = bret;
+ }
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_DEBUG_OBJECT (self, "State change PLAYING->PAUSED");
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (self, "State change PAUSED->READY");
+ do_async_done (self);
+
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_DEBUG_OBJECT (self, "State change READY->NULL");
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ gst_caps_replace (&self->subcaps, NULL);
+
+ /* Unlink ghost pads */
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->video_sinkpad), NULL);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->subtitle_sinkpad),
+ NULL);
+
+ /* Unblock pads */
+ unblock_video (self);
+ unblock_subtitle (self);
+
+ /* Remove elements */
+ self->silent_property = NULL;
+ _remove_element (self, &self->post_colorspace);
+ _remove_element (self, &self->overlay);
+ _remove_element (self, &self->parser);
+ _remove_element (self, &self->renderer);
+ _remove_element (self, &self->pre_colorspace);
+ _remove_element (self, &self->passthrough_identity);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_subtitle_overlay_handle_message (GstBin * bin, GstMessage * message)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY_CAST (bin);
+
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR) {
+ GstObject *src = GST_MESSAGE_SRC (message);
+
+ /* Convert error messages from the subtitle pipeline to
+ * warnings and switch to passthrough mode */
+ if (src && (
+ (self->overlay
+ && gst_object_has_ancestor (src,
+ GST_OBJECT_CAST (self->overlay))) || (self->parser
+ && gst_object_has_ancestor (src,
+ GST_OBJECT_CAST (self->parser))) || (self->renderer
+ && gst_object_has_ancestor (src,
+ GST_OBJECT_CAST (self->renderer))))) {
+ GError *err = NULL;
+ gchar *debug = NULL;
+ GstMessage *wmsg;
+
+ gst_message_parse_error (message, &err, &debug);
+ GST_DEBUG_OBJECT (self,
+ "Got error message from subtitle element %s: %s (%s)",
+ GST_MESSAGE_SRC_NAME (message), GST_STR_NULL (err->message),
+ GST_STR_NULL (debug));
+
+ wmsg = gst_message_new_warning (src, err, debug);
+ gst_message_unref (message);
+ g_error_free (err);
+ g_free (debug);
+ message = wmsg;
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->subtitle_error = TRUE;
+
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ }
+ }
+
+ GST_BIN_CLASS (parent_class)->handle_message (bin, message);
+}
+
+static void
+gst_subtitle_overlay_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY_CAST (object);
+
+ switch (prop_id) {
+ case PROP_SILENT:
+ g_value_set_boolean (value, self->silent);
+ break;
+ case PROP_FONT_DESC:
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ g_value_set_string (value, self->font_desc);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ g_value_set_string (value, self->encoding);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_subtitle_overlay_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY_CAST (object);
+
+ switch (prop_id) {
+ case PROP_SILENT:
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->silent = g_value_get_boolean (value);
+ if (self->silent_property) {
+ gboolean silent = self->silent;
+
+ if (self->silent_property_invert)
+ silent = !silent;
+
+ if (self->overlay)
+ g_object_set (self->overlay, self->silent_property, silent, NULL);
+ else if (self->renderer)
+ g_object_set (self->renderer, self->silent_property, silent, NULL);
+ } else {
+ block_subtitle (self);
+ block_video (self);
+ }
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ case PROP_FONT_DESC:
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ g_free (self->font_desc);
+ self->font_desc = g_value_dup_string (value);
+ if (self->overlay)
+ g_object_set (self->overlay, "font-desc", self->font_desc, NULL);
+ else if (self->renderer && _has_font_desc_property (self->renderer))
+ g_object_set (self->renderer, "font-desc", self->font_desc, NULL);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ g_free (self->encoding);
+ self->encoding = g_value_dup_string (value);
+ if (self->renderer && _has_subtitle_encoding_property (self->renderer))
+ g_object_set (self->renderer, "subtitle-encoding", self->encoding,
+ NULL);
+ if (self->parser && _has_subtitle_encoding_property (self->parser))
+ g_object_set (self->parser, "subtitle-encoding", self->encoding, NULL);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_subtitle_overlay_class_init (GstSubtitleOverlayClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+ GstBinClass *bin_class = (GstBinClass *) klass;
+
+ gobject_class->finalize = gst_subtitle_overlay_finalize;
+ gobject_class->set_property = gst_subtitle_overlay_set_property;
+ gobject_class->get_property = gst_subtitle_overlay_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent",
+ "Silent",
+ "Whether to show subtitles", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_FONT_DESC,
+ g_param_spec_string ("font-desc",
+ "Subtitle font description",
+ "Pango font description of font "
+ "to be used for subtitle rendering", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SUBTITLE_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 encoding. "
+ "If not set, the GST_SUBTITLE_ENCODING environment variable will "
+ "be checked for an encoding to use. If that is not set either, "
+ "ISO-8859-15 will be assumed.", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&video_sinktemplate));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&subtitle_sinktemplate));
+
+ gst_element_class_set_details_simple (element_class, "Subtitle Overlay",
+ "Video/Overlay/Subtitle",
+ "Overlays a video stream with subtitles",
+ "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_change_state);
+
+ bin_class->handle_message =
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_handle_message);
+}
+
+static GstFlowReturn
+gst_subtitle_overlay_src_proxy_chain (GstPad * proxypad, GstBuffer * buffer)
+{
+ GstPad *ghostpad;
+ GstSubtitleOverlay *self;
+ GstFlowReturn ret;
+
+ ghostpad = GST_PAD_CAST (gst_pad_get_parent (proxypad));
+ if (G_UNLIKELY (!ghostpad)) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+ self = GST_SUBTITLE_OVERLAY_CAST (gst_pad_get_parent (ghostpad));
+ if (G_UNLIKELY (!self || self->srcpad != ghostpad)) {
+ gst_buffer_unref (buffer);
+ gst_object_unref (ghostpad);
+ return GST_FLOW_ERROR;
+ }
+
+ ret = gst_proxy_pad_chain_default (proxypad, buffer);
+
+ if (IS_VIDEO_CHAIN_IGNORE_ERROR (ret)) {
+ GST_ERROR_OBJECT (self, "Downstream chain error: %s",
+ gst_flow_get_name (ret));
+ self->downstream_chain_error = TRUE;
+ }
+
+ gst_object_unref (self);
+ gst_object_unref (ghostpad);
+
+ return ret;
+}
+
+static gboolean
+gst_subtitle_overlay_src_proxy_event (GstPad * proxypad, GstEvent * event)
+{
+ GstPad *ghostpad = NULL;
+ GstSubtitleOverlay *self = NULL;
+ gboolean ret = FALSE;
+ const GstStructure *s;
+
+ ghostpad = GST_PAD_CAST (gst_pad_get_parent (proxypad));
+ if (G_UNLIKELY (!ghostpad))
+ goto out;
+ self = GST_SUBTITLE_OVERLAY_CAST (gst_pad_get_parent (ghostpad));
+ if (G_UNLIKELY (!self || self->srcpad != ghostpad))
+ goto out;
+
+ s = gst_event_get_structure (event);
+ if (s && gst_structure_id_has_field (s, _subtitle_overlay_event_marker_id)) {
+ GST_DEBUG_OBJECT (ghostpad, "Dropping event with marker: %" GST_PTR_FORMAT,
+ event);
+ gst_event_unref (event);
+ event = NULL;
+ ret = TRUE;
+ } else {
+ ret = gst_proxy_pad_event_default (proxypad, event);
+ event = NULL;
+ }
+
+out:
+ if (event)
+ gst_event_unref (event);
+ if (self)
+ gst_object_unref (self);
+ if (ghostpad)
+ gst_object_unref (ghostpad);
+ return ret;
+}
+
+static gboolean
+gst_subtitle_overlay_video_sink_setcaps (GstSubtitleOverlay * self,
+ GstCaps * caps)
+{
+ GstPad *target;
+ gboolean ret = TRUE;
+ GstVideoInfo info;
+
+ GST_DEBUG_OBJECT (self, "Setting caps: %" GST_PTR_FORMAT, caps);
+
+ if (!gst_video_info_from_caps (&info, caps)) {
+ GST_ERROR_OBJECT (self, "Failed to parse caps");
+ ret = FALSE;
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ goto out;
+ }
+
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (self->video_sinkpad));
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+
+ if (!target || !gst_pad_accept_caps (target, caps)) {
+ GST_DEBUG_OBJECT (target, "Target did not accept caps -- reconfiguring");
+
+ block_subtitle (self);
+ block_video (self);
+ }
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ if (self->fps_n != info.fps_n || self->fps_d != info.fps_d) {
+ GST_DEBUG_OBJECT (self, "New video fps: %d/%d", info.fps_n, info.fps_d);
+ self->fps_n = info.fps_n;
+ self->fps_d = info.fps_d;
+ gst_subtitle_overlay_set_fps (self);
+ }
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+out:
+ if (target)
+ gst_object_unref (target);
+ return ret;
+}
+
+static gboolean
+gst_subtitle_overlay_video_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
+ gboolean ret;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ {
+ GST_DEBUG_OBJECT (pad,
+ "Resetting video segment because of flush-stop event");
+ gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
+ self->fps_n = self->fps_d = 0;
+ break;
+ }
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_subtitle_overlay_video_sink_setcaps (self, caps);
+ if (!ret)
+ goto done;
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = gst_proxy_pad_event_default (pad, gst_event_ref (event));
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+ GST_DEBUG_OBJECT (pad, "segment event: %" GST_PTR_FORMAT, event);
+ gst_event_copy_segment (event, &self->video_segment);
+
+ if (self->video_segment.format != GST_FORMAT_TIME)
+ goto invalid_format;
+ }
+
+done:
+ gst_event_unref (event);
+ gst_object_unref (self);
+
+ return ret;
+
+ /* ERRORS */
+invalid_format:
+ {
+ GST_ERROR_OBJECT (pad, "Newsegment event in non-time format: %s",
+ gst_format_get_name (self->video_segment.format));
+ ret = FALSE;
+ goto done;
+ }
+}
+
+static GstFlowReturn
+gst_subtitle_overlay_video_sink_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (GST_PAD_PARENT (pad));
+ GstFlowReturn ret = gst_proxy_pad_chain_default (pad, buffer);
+
+ if (G_UNLIKELY (self->downstream_chain_error) || self->passthrough_identity) {
+ return ret;
+ } else if (IS_VIDEO_CHAIN_IGNORE_ERROR (ret)) {
+ GST_DEBUG_OBJECT (self, "Subtitle renderer produced chain error: %s",
+ gst_flow_get_name (ret));
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->subtitle_error = TRUE;
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ return GST_FLOW_OK;
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_subtitle_overlay_subtitle_sink_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (GST_PAD_PARENT (pad));
+
+ if (self->subtitle_error) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+ } else {
+ GstFlowReturn ret = gst_proxy_pad_chain_default (pad, buffer);
+
+ if (IS_SUBTITLE_CHAIN_IGNORE_ERROR (ret)) {
+ GST_DEBUG_OBJECT (self, "Subtitle chain error: %s",
+ gst_flow_get_name (ret));
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->subtitle_error = TRUE;
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ return GST_FLOW_OK;
+ }
+
+ return ret;
+ }
+}
+
+static GstCaps *
+gst_subtitle_overlay_subtitle_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
+ GstCaps *ret;
+
+ g_mutex_lock (self->factories_lock);
+ if (G_UNLIKELY (!gst_subtitle_overlay_update_factory_list (self)))
+ ret = GST_CAPS_NONE;
+ else if (filter)
+ ret =
+ gst_caps_intersect_full (filter, self->factory_caps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ ret = gst_caps_ref (self->factory_caps);
+ g_mutex_unlock (self->factories_lock);
+
+ GST_DEBUG_OBJECT (pad, "Returning subtitle caps %" GST_PTR_FORMAT, ret);
+
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static gboolean
+gst_subtitle_overlay_subtitle_sink_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstCaps *othercaps = gst_subtitle_overlay_subtitle_sink_getcaps (pad, NULL);
+ gboolean ret = gst_caps_is_subset (caps, othercaps);
+
+ gst_caps_unref (othercaps);
+
+ return ret;
+}
+
+static gboolean
+gst_subtitle_overlay_subtitle_sink_setcaps (GstSubtitleOverlay * self,
+ GstCaps * caps)
+{
+ gboolean ret = TRUE;
+ GstPad *target = NULL;;
+
+ GST_DEBUG_OBJECT (self, "Setting caps: %" GST_PTR_FORMAT, caps);
+
+ target =
+ gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (self->subtitle_sinkpad));
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ gst_caps_replace (&self->subcaps, caps);
+
+ if (target && gst_pad_accept_caps (target, caps)) {
+ GST_DEBUG_OBJECT (self, "Target accepts caps");
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ goto out;
+ }
+
+ GST_DEBUG_OBJECT (self, "Target did not accept caps");
+
+ self->subtitle_error = FALSE;
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+out:
+ if (target)
+ gst_object_unref (target);
+
+ return ret;
+}
+
+static GstPadLinkReturn
+gst_subtitle_overlay_subtitle_sink_link (GstPad * pad, GstPad * peer)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
+ GstPadLinkReturn ret;
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (pad, "Linking pad to peer %" GST_PTR_FORMAT, peer);
+
+ caps = gst_pad_get_current_caps (peer);
+ if (!caps) {
+ caps = gst_pad_get_caps (peer, NULL);
+ if (!gst_caps_is_fixed (caps)) {
+ gst_caps_unref (caps);
+ caps = NULL;
+ }
+ }
+
+ if (caps) {
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ GST_DEBUG_OBJECT (pad, "Have fixed peer caps: %" GST_PTR_FORMAT, caps);
+ gst_caps_replace (&self->subcaps, caps);
+
+ self->subtitle_error = FALSE;
+
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+ gst_caps_unref (caps);
+ }
+
+ ret = gst_ghost_pad_link_default (pad, peer);
+
+ gst_object_unref (self);
+ return ret;
+}
+
+static void
+gst_subtitle_overlay_subtitle_sink_unlink (GstPad * pad)
+{
+ GstSubtitleOverlay *self =
+ GST_SUBTITLE_OVERLAY (gst_object_ref (GST_PAD_PARENT (pad)));
+
+ /* FIXME: Can't use gst_pad_get_parent() here because this is called with
+ * the object lock from state changes
+ */
+
+ GST_DEBUG_OBJECT (pad, "Pad unlinking");
+ gst_caps_replace (&self->subcaps, NULL);
+
+ gst_ghost_pad_unlink_default (pad);
+
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->subtitle_error = FALSE;
+
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ gst_object_unref (self);
+}
+
+static gboolean
+gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
+ gboolean ret;
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB &&
+ gst_event_has_name (event, "subtitleoverlay-flush-subtitle")) {
+ GST_DEBUG_OBJECT (pad, "Custom subtitle flush event");
+ GST_SUBTITLE_OVERLAY_LOCK (self);
+ self->subtitle_flush = TRUE;
+ self->subtitle_error = FALSE;
+ block_subtitle (self);
+ block_video (self);
+ GST_SUBTITLE_OVERLAY_UNLOCK (self);
+
+ gst_event_unref (event);
+ event = NULL;
+ ret = TRUE;
+ goto out;
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_subtitle_overlay_subtitle_sink_setcaps (self, caps);
+ if (!ret)
+ goto out;
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (pad,
+ "Resetting subtitle segment because of flush-stop");
+ gst_segment_init (&self->subtitle_segment, GST_FORMAT_UNDEFINED);
+ /* fall through */
+ case GST_EVENT_FLUSH_START:
+ case GST_EVENT_SEGMENT:
+ case GST_EVENT_EOS:
+ {
+ GstStructure *structure;
+
+ /* Add our event marker to make sure no events from here go ever outside
+ * the element, they're only interesting for our internal elements */
+ event = GST_EVENT_CAST (gst_event_make_writable (event));
+ structure = gst_event_writable_structure (event);
+
+ gst_structure_id_set (structure, _subtitle_overlay_event_marker_id,
+ G_TYPE_BOOLEAN, TRUE, NULL);
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = gst_proxy_pad_event_default (pad, gst_event_ref (event));
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+ GST_DEBUG_OBJECT (pad, "segment event: %" GST_PTR_FORMAT, event);
+ gst_event_copy_segment (event, &self->subtitle_segment);
+ GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
+ &self->subtitle_segment);
+ }
+ gst_event_unref (event);
+
+out:
+ gst_object_unref (self);
+ return ret;
+}
+
+static void
+gst_subtitle_overlay_init (GstSubtitleOverlay * self)
+{
+ GstPadTemplate *templ;
+ GstPad *proxypad = NULL;
+
+ self->lock = g_mutex_new ();
+ self->factories_lock = g_mutex_new ();
+
+ templ = gst_static_pad_template_get (&srctemplate);
+ self->srcpad = gst_ghost_pad_new_no_target_from_template ("src", templ);
+
+ proxypad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (self->srcpad)));
+ gst_pad_set_event_function (proxypad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_src_proxy_event));
+ gst_pad_set_chain_function (proxypad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_src_proxy_chain));
+ gst_object_unref (proxypad);
+
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->srcpad);
+
+ templ = gst_static_pad_template_get (&video_sinktemplate);
+ self->video_sinkpad =
+ gst_ghost_pad_new_no_target_from_template ("video_sink", templ);
+ gst_pad_set_event_function (self->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_video_sink_event));
+ gst_pad_set_chain_function (self->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_video_sink_chain));
+
+ proxypad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
+ (self->video_sinkpad)));
+ self->video_block_pad = proxypad;
+
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->video_sinkpad);
+
+ templ = gst_static_pad_template_get (&subtitle_sinktemplate);
+ self->subtitle_sinkpad =
+ gst_ghost_pad_new_no_target_from_template ("subtitle_sink", templ);
+ gst_pad_set_link_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_link));
+ gst_pad_set_unlink_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_unlink));
+ gst_pad_set_event_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_event));
+ gst_pad_set_chain_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_chain));
+ gst_pad_set_getcaps_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_getcaps));
+ gst_pad_set_acceptcaps_function (self->subtitle_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_subtitle_overlay_subtitle_sink_acceptcaps));
+
+ proxypad =
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
+ (self->subtitle_sinkpad)));
+ self->subtitle_block_pad = proxypad;
+
+ gst_element_add_pad (GST_ELEMENT_CAST (self), self->subtitle_sinkpad);
+
+ self->fps_n = 0;
+ self->fps_d = 0;
+}
+
+gboolean
+gst_subtitle_overlay_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (subtitle_overlay_debug, "subtitleoverlay", 0,
+ "Subtitle Overlay");
+
+ _subtitle_overlay_event_marker_id =
+ g_quark_from_static_string ("gst-subtitle-overlay-event-marker");
+
+ return gst_element_register (plugin, "subtitleoverlay", GST_RANK_NONE,
+ GST_TYPE_SUBTITLE_OVERLAY);
+}
diff --git a/gst/playback/gstsubtitleoverlay.h b/gst/playback/gstsubtitleoverlay.h
new file mode 100644
index 0000000..0fe6b1b
--- /dev/null
+++ b/gst/playback/gstsubtitleoverlay.h
@@ -0,0 +1,121 @@
+/* GStreamer
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_SUBTITLE_OVERLAY_H__
+#define __GST_SUBTITLE_OVERLAY_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_SUBTITLE_OVERLAY \
+ (gst_subtitle_overlay_get_type())
+#define GST_SUBTITLE_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SUBTITLE_OVERLAY, GstSubtitleOverlay))
+#define GST_SUBTITLE_OVERLAY_CAST(obj) \
+ ((GstSubtitleOverlay *) obj)
+#define GST_SUBTITLE_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SUBTITLE_OVERLAY, GstSubtitleOverlayClass))
+#define GST_IS_SUBTITLE_OVERLAY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SUBTITLE_OVERLAY))
+#define GST_IS_SUBTITLE_OVERLAY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SUBTITLE_OVERLAY))
+
+#define GST_SUBTITLE_OVERLAY_LOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "locking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (GST_SUBTITLE_OVERLAY_CAST(obj)->lock); \
+ GST_LOG_OBJECT (obj, \
+ "locked from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define GST_SUBTITLE_OVERLAY_UNLOCK(obj) G_STMT_START { \
+ GST_LOG_OBJECT (obj, \
+ "unlocking from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (GST_SUBTITLE_OVERLAY_CAST(obj)->lock); \
+} G_STMT_END
+
+typedef struct _GstSubtitleOverlay GstSubtitleOverlay;
+typedef struct _GstSubtitleOverlayClass GstSubtitleOverlayClass;
+
+struct _GstSubtitleOverlay
+{
+ GstBin parent;
+
+ gboolean silent;
+ gchar *font_desc;
+ gchar *encoding;
+
+ /* < private > */
+ gboolean do_async;
+
+ GstPad *srcpad;
+ gboolean downstream_chain_error;
+
+ GstPad *video_sinkpad;
+ GstPad *video_block_pad;
+ gulong video_block_id;
+ gboolean video_sink_blocked;
+ GstSegment video_segment;
+ gint fps_n, fps_d;
+
+ GstPad *subtitle_sinkpad;
+ GstPad *subtitle_block_pad;
+ gulong subtitle_block_id;
+ gboolean subtitle_sink_blocked;
+ GstSegment subtitle_segment;
+ gboolean subtitle_flush;
+ gboolean subtitle_error;
+
+ GMutex *factories_lock;
+ GList *factories;
+ guint32 factories_cookie;
+ GstCaps *factory_caps;
+
+ GMutex *lock;
+ GstCaps *subcaps;
+
+ GstElement *passthrough_identity;
+
+ GstElement *pre_colorspace;
+ GstElement *post_colorspace;
+
+ GstElement *parser;
+ GstElement *overlay;
+
+ GstElement *renderer;
+
+ const gchar *silent_property;
+ gboolean silent_property_invert;
+};
+
+struct _GstSubtitleOverlayClass
+{
+ GstBinClass parent;
+};
+
+GType gst_subtitle_overlay_get_type (void);
+gboolean gst_subtitle_overlay_plugin_init (GstPlugin * plugin);
+
+GstCaps *gst_subtitle_overlay_create_factory_caps (void);
+
+G_END_DECLS
+#endif /* __GST_SUBTITLE_OVERLAY_H__ */
diff --git a/gst/playback/gsturidecodebin.c b/gst/playback/gsturidecodebin.c
new file mode 100644
index 0000000..1988b63
--- /dev/null
+++ b/gst/playback/gsturidecodebin.c
@@ -0,0 +1,2553 @@
+/* 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.
+ */
+
+/**
+ * SECTION:element-uridecodebin
+ *
+ * Decodes data from a URI into raw media. It selects a source element that can
+ * handle the given #GstURIDecodeBin:uri scheme and connects it to a decodebin.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/gst.h>
+#include <gst/gst-i18n-plugin.h>
+#include <gst/pbutils/missing-plugins.h>
+
+#include "gstplay-marshal.h"
+#include "gstplay-enum.h"
+#include "gstrawcaps.h"
+#include "gstplayback.h"
+
+#define GST_TYPE_URI_DECODE_BIN \
+ (gst_uri_decode_bin_get_type())
+#define GST_URI_DECODE_BIN(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_URI_DECODE_BIN,GstURIDecodeBin))
+#define GST_URI_DECODE_BIN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_URI_DECODE_BIN,GstURIDecodeBinClass))
+#define GST_IS_URI_DECODE_BIN(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_URI_DECODE_BIN))
+#define GST_IS_URI_DECODE_BIN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_URI_DECODE_BIN))
+#define GST_URI_DECODE_BIN_CAST(obj) ((GstURIDecodeBin *) (obj))
+
+typedef struct _GstURIDecodeBin GstURIDecodeBin;
+typedef struct _GstURIDecodeBinClass GstURIDecodeBinClass;
+
+#define GST_URI_DECODE_BIN_GET_LOCK(dec) (((GstURIDecodeBin*)(dec))->lock)
+#define GST_URI_DECODE_BIN_LOCK(dec) (g_mutex_lock(GST_URI_DECODE_BIN_GET_LOCK(dec)))
+#define GST_URI_DECODE_BIN_UNLOCK(dec) (g_mutex_unlock(GST_URI_DECODE_BIN_GET_LOCK(dec)))
+
+typedef struct _GstURIDecodeBinStream
+{
+ gulong probe_id;
+ guint bitrate;
+} GstURIDecodeBinStream;
+
+/**
+ * GstURIDecodeBin
+ *
+ * uridecodebin element struct
+ */
+struct _GstURIDecodeBin
+{
+ GstBin parent_instance;
+
+ GMutex *lock; /* lock for constructing */
+
+ GMutex *factories_lock;
+ guint32 factories_cookie;
+ GList *factories; /* factories we can use for selecting elements */
+
+ gchar *uri;
+ guint connection_speed;
+ GstCaps *caps;
+ gchar *encoding;
+
+ gboolean is_stream;
+ gboolean is_download;
+ gboolean need_queue;
+ guint64 buffer_duration; /* When buffering, buffer duration (ns) */
+ guint buffer_size; /* When buffering, buffer size (bytes) */
+ gboolean download;
+ gboolean use_buffering;
+
+ GstElement *source;
+ GstElement *queue;
+ GstElement *typefind;
+ guint have_type_id; /* have-type signal id from typefind */
+ GSList *decodebins;
+ GSList *pending_decodebins;
+ GHashTable *streams;
+ gint numpads;
+
+ /* for dynamic sources */
+ guint src_np_sig_id; /* new-pad signal id */
+ guint src_nmp_sig_id; /* no-more-pads signal id */
+ gint pending;
+
+ gboolean async_pending; /* async-start has been emited */
+
+ gboolean expose_allstreams; /* Whether to expose unknow type streams or not */
+
+ guint64 ring_buffer_max_size; /* 0 means disabled */
+};
+
+struct _GstURIDecodeBinClass
+{
+ GstBinClass parent_class;
+
+ /* signal fired when we found a pad that we cannot decode */
+ void (*unknown_type) (GstElement * element, GstPad * pad, GstCaps * caps);
+
+ /* signal fired to know if we continue trying to decode the given caps */
+ gboolean (*autoplug_continue) (GstElement * element, GstPad * pad,
+ GstCaps * caps);
+ /* signal fired to get a list of factories to try to autoplug */
+ GValueArray *(*autoplug_factories) (GstElement * element, GstPad * pad,
+ GstCaps * caps);
+ /* signal fired to sort the factories */
+ GValueArray *(*autoplug_sort) (GstElement * element, GstPad * pad,
+ GstCaps * caps, GValueArray * factories);
+ /* signal fired to select from the proposed list of factories */
+ GstAutoplugSelectResult (*autoplug_select) (GstElement * element,
+ GstPad * pad, GstCaps * caps, GstElementFactory * factory);
+
+ /* emited when all data is decoded */
+ void (*drained) (GstElement * element);
+};
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src%d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticCaps default_raw_caps = GST_STATIC_CAPS (DEFAULT_RAW_CAPS);
+
+GST_DEBUG_CATEGORY_STATIC (gst_uri_decode_bin_debug);
+#define GST_CAT_DEFAULT gst_uri_decode_bin_debug
+
+/* signals */
+enum
+{
+ SIGNAL_UNKNOWN_TYPE,
+ SIGNAL_AUTOPLUG_CONTINUE,
+ SIGNAL_AUTOPLUG_FACTORIES,
+ SIGNAL_AUTOPLUG_SELECT,
+ SIGNAL_DRAINED,
+ SIGNAL_AUTOPLUG_SORT,
+ SIGNAL_SOURCE_SETUP,
+ LAST_SIGNAL
+};
+
+/* properties */
+#define DEFAULT_PROP_URI NULL
+#define DEFAULT_PROP_SOURCE NULL
+#define DEFAULT_CONNECTION_SPEED 0
+#define DEFAULT_CAPS (gst_static_caps_get (&default_raw_caps))
+#define DEFAULT_SUBTITLE_ENCODING NULL
+#define DEFAULT_BUFFER_DURATION -1
+#define DEFAULT_BUFFER_SIZE -1
+#define DEFAULT_DOWNLOAD FALSE
+#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_EXPOSE_ALL_STREAMS TRUE
+#define DEFAULT_RING_BUFFER_MAX_SIZE 0
+
+enum
+{
+ PROP_0,
+ PROP_URI,
+ PROP_SOURCE,
+ PROP_CONNECTION_SPEED,
+ PROP_CAPS,
+ PROP_SUBTITLE_ENCODING,
+ PROP_BUFFER_SIZE,
+ PROP_BUFFER_DURATION,
+ PROP_DOWNLOAD,
+ PROP_USE_BUFFERING,
+ PROP_EXPOSE_ALL_STREAMS,
+ PROP_RING_BUFFER_MAX_SIZE,
+ PROP_LAST
+};
+
+static guint gst_uri_decode_bin_signals[LAST_SIGNAL] = { 0 };
+
+GType gst_uri_decode_bin_get_type (void);
+#define gst_uri_decode_bin_parent_class parent_class
+G_DEFINE_TYPE (GstURIDecodeBin, gst_uri_decode_bin, GST_TYPE_BIN);
+
+static void remove_decoders (GstURIDecodeBin * bin, gboolean force);
+static void gst_uri_decode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_uri_decode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_uri_decode_bin_finalize (GObject * obj);
+
+static void handle_message (GstBin * bin, GstMessage * msg);
+
+static gboolean gst_uri_decode_bin_query (GstElement * element,
+ GstQuery * query);
+static GstStateChangeReturn gst_uri_decode_bin_change_state (GstElement *
+ element, GstStateChange transition);
+
+static gboolean
+_gst_boolean_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gboolean myboolean;
+
+ myboolean = g_value_get_boolean (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boolean (return_accu, myboolean);
+
+ /* stop emission if FALSE */
+ return myboolean;
+}
+
+static gboolean
+_gst_array_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gpointer array;
+
+ array = g_value_get_boxed (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boxed (return_accu, array);
+
+ return FALSE;
+}
+
+static gboolean
+_gst_select_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ GstAutoplugSelectResult res;
+
+ res = g_value_get_enum (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_enum (return_accu, res);
+
+ return FALSE;
+}
+
+static gboolean
+_gst_array_hasvalue_accumulator (GSignalInvocationHint * ihint,
+ GValue * return_accu, const GValue * handler_return, gpointer dummy)
+{
+ gpointer array;
+
+ array = g_value_get_boxed (handler_return);
+ if (!(ihint->run_type & G_SIGNAL_RUN_CLEANUP))
+ g_value_set_boxed (return_accu, array);
+
+ if (array != NULL)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_uri_decode_bin_autoplug_continue (GstElement * element, GstPad * pad,
+ GstCaps * caps)
+{
+ /* by default we always continue */
+ return TRUE;
+}
+
+/* Must be called with factories lock! */
+static void
+gst_uri_decode_bin_update_factories_list (GstURIDecodeBin * dec)
+{
+ if (!dec->factories ||
+ dec->factories_cookie !=
+ gst_default_registry_get_feature_list_cookie ()) {
+ if (dec->factories)
+ gst_plugin_feature_list_free (dec->factories);
+ dec->factories =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_DECODABLE, GST_RANK_MARGINAL);
+ dec->factories_cookie = gst_default_registry_get_feature_list_cookie ();
+ }
+}
+
+static GValueArray *
+gst_uri_decode_bin_autoplug_factories (GstElement * element, GstPad * pad,
+ GstCaps * caps)
+{
+ GList *list, *tmp;
+ GValueArray *result;
+ GstURIDecodeBin *dec = GST_URI_DECODE_BIN_CAST (element);
+
+ GST_DEBUG_OBJECT (element, "finding factories");
+
+ /* return all compatible factories for caps */
+ g_mutex_lock (dec->factories_lock);
+ gst_uri_decode_bin_update_factories_list (dec);
+ list =
+ gst_element_factory_list_filter (dec->factories, caps, GST_PAD_SINK,
+ FALSE);
+ g_mutex_unlock (dec->factories_lock);
+
+ result = g_value_array_new (g_list_length (list));
+ for (tmp = list; tmp; tmp = tmp->next) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+ GValue val = { 0, };
+
+ g_value_init (&val, G_TYPE_OBJECT);
+ g_value_set_object (&val, factory);
+ g_value_array_append (result, &val);
+ g_value_unset (&val);
+ }
+ gst_plugin_feature_list_free (list);
+
+ GST_DEBUG_OBJECT (element, "autoplug-factories returns %p", result);
+
+ return result;
+}
+
+static GValueArray *
+gst_uri_decode_bin_autoplug_sort (GstElement * element, GstPad * pad,
+ GstCaps * caps, GValueArray * factories)
+{
+ return NULL;
+}
+
+static GstAutoplugSelectResult
+gst_uri_decode_bin_autoplug_select (GstElement * element, GstPad * pad,
+ GstCaps * caps, GstElementFactory * factory)
+{
+ GST_DEBUG_OBJECT (element, "default autoplug-select returns TRY");
+
+ /* Try factory. */
+ return GST_AUTOPLUG_SELECT_TRY;
+}
+
+static void
+gst_uri_decode_bin_class_init (GstURIDecodeBinClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBinClass *gstbin_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbin_class = GST_BIN_CLASS (klass);
+
+ gobject_class->set_property = gst_uri_decode_bin_set_property;
+ gobject_class->get_property = gst_uri_decode_bin_get_property;
+ gobject_class->finalize = gst_uri_decode_bin_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_URI,
+ g_param_spec_string ("uri", "URI", "URI to decode",
+ DEFAULT_PROP_URI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SOURCE,
+ g_param_spec_object ("source", "Source", "Source object used",
+ GST_TYPE_ELEMENT, G_PARAM_READABLE | 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_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_CAPS,
+ g_param_spec_boxed ("caps", "Caps",
+ "The caps on which to stop decoding. (NULL = default)",
+ GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SUBTITLE_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 encoding. "
+ "If not set, the GST_SUBTITLE_ENCODING environment variable will "
+ "be checked for an encoding to use. If that is not set either, "
+ "ISO-8859-15 will be assumed.", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE,
+ g_param_spec_int ("buffer-size", "Buffer size (bytes)",
+ "Buffer size when buffering streams (-1 default value)",
+ -1, G_MAXINT, DEFAULT_BUFFER_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BUFFER_DURATION,
+ g_param_spec_int64 ("buffer-duration", "Buffer duration (ns)",
+ "Buffer duration when buffering streams (-1 default value)",
+ -1, G_MAXINT64, DEFAULT_BUFFER_DURATION,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstURIDecodeBin::download:
+ *
+ * For certain media type, enable download buffering.
+ */
+ g_object_class_install_property (gobject_class, PROP_DOWNLOAD,
+ g_param_spec_boolean ("download", "Download",
+ "Attempt download buffering when buffering network streams",
+ DEFAULT_DOWNLOAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstURIDecodeBin::use-buffering:
+ *
+ * Emit BUFFERING messages based on low-/high-percent thresholds of the
+ * demuxed or parsed data.
+ * When download buffering is activated and used for the current media
+ * type, this property does nothing. Otherwise perform buffering on the
+ * demuxed or parsed media.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, PROP_USE_BUFFERING,
+ g_param_spec_boolean ("use-buffering", "Use Buffering",
+ "Perform buffering on demuxed/parsed media",
+ DEFAULT_USE_BUFFERING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstURIDecodeBin::expose-all-streams
+ *
+ * Expose streams of unknown type.
+ *
+ * If set to %FALSE, then only the streams that can be decoded to the final
+ * caps (see 'caps' property) will have a pad exposed. Streams that do not
+ * match those caps but could have been decoded will not have decoder plugged
+ * in internally and will not have a pad exposed.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_class, PROP_EXPOSE_ALL_STREAMS,
+ g_param_spec_boolean ("expose-all-streams", "Expose All Streams",
+ "Expose all streams, including those of unknown type or that don't match the 'caps' property",
+ DEFAULT_EXPOSE_ALL_STREAMS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstURIDecodeBin::ring-buffer-max-size
+ *
+ * The maximum size of the ring buffer in kilobytes. If set to 0, the ring
+ * buffer is disabled. Default is 0.
+ *
+ * Since: 0.10.31
+ */
+ g_object_class_install_property (gobject_class, PROP_RING_BUFFER_MAX_SIZE,
+ g_param_spec_uint64 ("ring-buffer-max-size",
+ "Max. ring buffer size (bytes)",
+ "Max. amount of data in the ring buffer (bytes, 0 = ring buffer disabled)",
+ 0, G_MAXUINT, DEFAULT_RING_BUFFER_MAX_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstURIDecodeBin::unknown-type:
+ * @bin: The uridecodebin.
+ * @pad: the new pad containing caps that cannot be resolved to a 'final'.
+ * stream type.
+ * @caps: the #GstCaps of the pad that cannot be resolved.
+ *
+ * This signal is emitted when a pad for which there is no further possible
+ * decoding is added to the uridecodebin.
+ */
+ gst_uri_decode_bin_signals[SIGNAL_UNKNOWN_TYPE] =
+ g_signal_new ("unknown-type", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstURIDecodeBinClass, unknown_type),
+ NULL, NULL, gst_marshal_VOID__OBJECT_BOXED, G_TYPE_NONE, 2,
+ GST_TYPE_PAD, GST_TYPE_CAPS);
+
+ /**
+ * GstURIDecodeBin::autoplug-continue:
+ * @bin: The uridecodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps found.
+ *
+ * This signal is emitted whenever uridecodebin finds a new stream. It is
+ * emitted before looking for any elements that can handle that stream.
+ *
+ * <note>
+ * Invocation of signal handlers stops after the first signal handler
+ * returns #FALSE. Signal handlers are invoked in the order they were
+ * connected in.
+ * </note>
+ *
+ * Returns: #TRUE if you wish uridecodebin to look for elements that can
+ * handle the given @caps. If #FALSE, those caps will be considered as
+ * final and the pad will be exposed as such (see 'pad-added' signal of
+ * #GstElement).
+ */
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_CONTINUE] =
+ g_signal_new ("autoplug-continue", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstURIDecodeBinClass,
+ autoplug_continue), _gst_boolean_accumulator, NULL,
+ gst_play_marshal_BOOLEAN__OBJECT_BOXED, G_TYPE_BOOLEAN, 2, GST_TYPE_PAD,
+ GST_TYPE_CAPS);
+
+ /**
+ * GstURIDecodeBin::autoplug-factories:
+ * @bin: The uridecodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps found.
+ *
+ * This function is emited when an array of possible factories for @caps on
+ * @pad is needed. Uridecodebin will by default return an array with all
+ * compatible factories, sorted by rank.
+ *
+ * If this function returns NULL, @pad will be exposed as a final caps.
+ *
+ * If this function returns an empty array, the pad will be considered as
+ * having an unhandled type media type.
+ *
+ * <note>
+ * Only the signal handler that is connected first will ever by invoked.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: a #GValueArray* with a list of factories to try. The factories are
+ * by default tried in the returned order or based on the index returned by
+ * "autoplug-select".
+ */
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_FACTORIES] =
+ g_signal_new ("autoplug-factories", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstURIDecodeBinClass,
+ autoplug_factories), _gst_array_accumulator, NULL,
+ gst_play_marshal_BOXED__OBJECT_BOXED, G_TYPE_VALUE_ARRAY, 2,
+ GST_TYPE_PAD, GST_TYPE_CAPS);
+
+ /**
+ * GstURIDecodeBin::autoplug-sort:
+ * @bin: The uridecodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps.
+ * @factories: A #GValueArray of possible #GstElementFactory to use.
+ *
+ * Once decodebin has found the possible #GstElementFactory objects to try
+ * for @caps on @pad, this signal is emited. The purpose of the signal is for
+ * the application to perform additional sorting or filtering on the element
+ * factory array.
+ *
+ * The callee should copy and modify @factories or return #NULL if the
+ * order should not change.
+ *
+ * <note>
+ * Invocation of signal handlers stops after one signal handler has
+ * returned something else than #NULL. Signal handlers are invoked in
+ * the order they were connected in.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: A new sorted array of #GstElementFactory objects.
+ *
+ * Since: 0.10.33
+ */
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_SORT] =
+ g_signal_new ("autoplug-sort", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstURIDecodeBinClass, autoplug_sort),
+ _gst_array_hasvalue_accumulator, NULL,
+ gst_play_marshal_BOXED__OBJECT_BOXED_BOXED, G_TYPE_VALUE_ARRAY, 3,
+ GST_TYPE_PAD, GST_TYPE_CAPS, G_TYPE_VALUE_ARRAY);
+
+ /**
+ * GstURIDecodeBin::autoplug-select:
+ * @bin: The uridecodebin.
+ * @pad: The #GstPad.
+ * @caps: The #GstCaps.
+ * @factory: A #GstElementFactory to use.
+ *
+ * This signal is emitted once uridecodebin has found all the possible
+ * #GstElementFactory that can be used to handle the given @caps. For each of
+ * those factories, this signal is emited.
+ *
+ * The signal handler should return a #GST_TYPE_AUTOPLUG_SELECT_RESULT enum
+ * value indicating what decodebin should do next.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_TRY will try to autoplug an element from
+ * @factory.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_EXPOSE will expose @pad without plugging
+ * any element to it.
+ *
+ * A value of #GST_AUTOPLUG_SELECT_SKIP will skip @factory and move to the
+ * next factory.
+ *
+ * <note>
+ * Only the signal handler that is connected first will ever by invoked.
+ * Don't connect signal handlers with the #G_CONNECT_AFTER flag to this
+ * signal, they will never be invoked!
+ * </note>
+ *
+ * Returns: a #GST_TYPE_AUTOPLUG_SELECT_RESULT that indicates the required
+ * operation. The default handler will always return
+ * #GST_AUTOPLUG_SELECT_TRY.
+ */
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_SELECT] =
+ g_signal_new ("autoplug-select", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstURIDecodeBinClass,
+ autoplug_select), _gst_select_accumulator, NULL,
+ gst_play_marshal_ENUM__OBJECT_BOXED_OBJECT,
+ GST_TYPE_AUTOPLUG_SELECT_RESULT, 3, GST_TYPE_PAD, GST_TYPE_CAPS,
+ GST_TYPE_ELEMENT_FACTORY);
+
+ /**
+ * GstURIDecodeBin::drained:
+ *
+ * This signal is emitted when the data for the current uri is played.
+ */
+ gst_uri_decode_bin_signals[SIGNAL_DRAINED] =
+ g_signal_new ("drained", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstURIDecodeBinClass, drained), NULL, NULL,
+ gst_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ /**
+ * GstURIDecodeBin::source-setup:
+ * @bin: the uridecodebin.
+ * @source: source element
+ *
+ * This signal is emitted after the source element has been created, so
+ * it can be configured by setting additional properties (e.g. set a
+ * proxy server for an http source, or set the device and read speed for
+ * an audio cd source). This is functionally equivalent to connecting to
+ * the notify::source signal, but more convenient.
+ *
+ * Since: 0.10.33
+ */
+ gst_uri_decode_bin_signals[SIGNAL_SOURCE_SETUP] =
+ g_signal_new ("source-setup", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_set_details_simple (gstelement_class,
+ "URI Decoder", "Generic/Bin/Decoder",
+ "Autoplug and decode an URI to raw media",
+ "Wim Taymans <wim.taymans@gmail.com>");
+
+ gstelement_class->query = GST_DEBUG_FUNCPTR (gst_uri_decode_bin_query);
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_uri_decode_bin_change_state);
+
+ gstbin_class->handle_message = GST_DEBUG_FUNCPTR (handle_message);
+
+ klass->autoplug_continue =
+ GST_DEBUG_FUNCPTR (gst_uri_decode_bin_autoplug_continue);
+ klass->autoplug_factories =
+ GST_DEBUG_FUNCPTR (gst_uri_decode_bin_autoplug_factories);
+ klass->autoplug_sort = GST_DEBUG_FUNCPTR (gst_uri_decode_bin_autoplug_sort);
+ klass->autoplug_select =
+ GST_DEBUG_FUNCPTR (gst_uri_decode_bin_autoplug_select);
+}
+
+static void
+gst_uri_decode_bin_init (GstURIDecodeBin * dec)
+{
+ /* first filter out the interesting element factories */
+ dec->factories_lock = g_mutex_new ();
+
+ dec->lock = g_mutex_new ();
+
+ dec->uri = g_strdup (DEFAULT_PROP_URI);
+ dec->connection_speed = DEFAULT_CONNECTION_SPEED;
+ dec->caps = DEFAULT_CAPS;
+ dec->encoding = g_strdup (DEFAULT_SUBTITLE_ENCODING);
+
+ dec->buffer_duration = DEFAULT_BUFFER_DURATION;
+ dec->buffer_size = DEFAULT_BUFFER_SIZE;
+ dec->download = DEFAULT_DOWNLOAD;
+ dec->use_buffering = DEFAULT_USE_BUFFERING;
+ dec->expose_allstreams = DEFAULT_EXPOSE_ALL_STREAMS;
+ dec->ring_buffer_max_size = DEFAULT_RING_BUFFER_MAX_SIZE;
+
+ GST_OBJECT_FLAG_SET (dec, GST_ELEMENT_IS_SOURCE);
+}
+
+static void
+gst_uri_decode_bin_finalize (GObject * obj)
+{
+ GstURIDecodeBin *dec = GST_URI_DECODE_BIN (obj);
+
+ remove_decoders (dec, TRUE);
+ g_mutex_free (dec->lock);
+ g_mutex_free (dec->factories_lock);
+ g_free (dec->uri);
+ g_free (dec->encoding);
+ if (dec->factories)
+ gst_plugin_feature_list_free (dec->factories);
+ if (dec->caps)
+ gst_caps_unref (dec->caps);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_uri_decode_bin_set_encoding (GstURIDecodeBin * dec, const gchar * encoding)
+{
+ GSList *walk;
+
+ GST_URI_DECODE_BIN_LOCK (dec);
+
+ /* set property first */
+ GST_OBJECT_LOCK (dec);
+ g_free (dec->encoding);
+ dec->encoding = g_strdup (encoding);
+ GST_OBJECT_UNLOCK (dec);
+
+ /* set the property on all decodebins now */
+ for (walk = dec->decodebins; walk; walk = g_slist_next (walk)) {
+ GObject *decodebin = G_OBJECT (walk->data);
+
+ g_object_set (decodebin, "subtitle-encoding", encoding, NULL);
+ }
+ GST_URI_DECODE_BIN_UNLOCK (dec);
+}
+
+static void
+gst_uri_decode_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstURIDecodeBin *dec = GST_URI_DECODE_BIN (object);
+
+ switch (prop_id) {
+ case PROP_URI:
+ GST_OBJECT_LOCK (dec);
+ g_free (dec->uri);
+ dec->uri = g_value_dup_string (value);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_CONNECTION_SPEED:
+ GST_OBJECT_LOCK (dec);
+ dec->connection_speed = g_value_get_uint (value) * 1000;
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_CAPS:
+ GST_OBJECT_LOCK (dec);
+ if (dec->caps)
+ gst_caps_unref (dec->caps);
+ dec->caps = g_value_dup_boxed (value);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ gst_uri_decode_bin_set_encoding (dec, g_value_get_string (value));
+ break;
+ case PROP_BUFFER_SIZE:
+ dec->buffer_size = g_value_get_int (value);
+ break;
+ case PROP_BUFFER_DURATION:
+ dec->buffer_duration = g_value_get_int64 (value);
+ break;
+ case PROP_DOWNLOAD:
+ dec->download = g_value_get_boolean (value);
+ break;
+ case PROP_USE_BUFFERING:
+ dec->use_buffering = g_value_get_boolean (value);
+ break;
+ case PROP_EXPOSE_ALL_STREAMS:
+ dec->expose_allstreams = g_value_get_boolean (value);
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ dec->ring_buffer_max_size = g_value_get_uint64 (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_uri_decode_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstURIDecodeBin *dec = GST_URI_DECODE_BIN (object);
+
+ switch (prop_id) {
+ case PROP_URI:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_string (value, dec->uri);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_SOURCE:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_object (value, dec->source);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_CONNECTION_SPEED:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_uint (value, dec->connection_speed / 1000);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_CAPS:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_boxed (value, dec->caps);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_SUBTITLE_ENCODING:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_string (value, dec->encoding);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_BUFFER_SIZE:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_int (value, dec->buffer_size);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_BUFFER_DURATION:
+ GST_OBJECT_LOCK (dec);
+ g_value_set_int64 (value, dec->buffer_duration);
+ GST_OBJECT_UNLOCK (dec);
+ break;
+ case PROP_DOWNLOAD:
+ g_value_set_boolean (value, dec->download);
+ break;
+ case PROP_USE_BUFFERING:
+ g_value_set_boolean (value, dec->use_buffering);
+ break;
+ case PROP_EXPOSE_ALL_STREAMS:
+ g_value_set_boolean (value, dec->expose_allstreams);
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ g_value_set_uint64 (value, dec->ring_buffer_max_size);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+do_async_start (GstURIDecodeBin * dbin)
+{
+ GstMessage *message;
+
+ dbin->async_pending = TRUE;
+
+ message = gst_message_new_async_start (GST_OBJECT_CAST (dbin));
+ GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (dbin), message);
+}
+
+static void
+do_async_done (GstURIDecodeBin * dbin)
+{
+ GstMessage *message;
+
+ if (dbin->async_pending) {
+ GST_DEBUG_OBJECT (dbin, "posting ASYNC_DONE");
+ message = gst_message_new_async_done (GST_OBJECT_CAST (dbin), FALSE);
+ GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (dbin), message);
+
+ dbin->async_pending = FALSE;
+ }
+}
+
+#define DEFAULT_QUEUE_SIZE (3 * GST_SECOND)
+#define DEFAULT_QUEUE_MIN_THRESHOLD ((DEFAULT_QUEUE_SIZE * 30) / 100)
+#define DEFAULT_QUEUE_THRESHOLD ((DEFAULT_QUEUE_SIZE * 95) / 100)
+
+static void
+unknown_type_cb (GstElement * element, GstPad * pad, GstCaps * caps,
+ GstURIDecodeBin * decoder)
+{
+ gchar *capsstr;
+
+ capsstr = gst_caps_to_string (caps);
+ GST_ELEMENT_WARNING (decoder, STREAM, CODEC_NOT_FOUND,
+ (_("No decoder available for type \'%s\'."), capsstr), (NULL));
+ g_free (capsstr);
+}
+
+/* add a streaminfo that indicates that the stream is handled by the
+ * given element. This usually means that a stream without actual data is
+ * produced but one that is sunken by an element. Examples of this are:
+ * cdaudio, a hardware decoder/sink, dvd meta bins etc...
+ */
+static void
+add_element_stream (GstElement * element, GstURIDecodeBin * decoder)
+{
+ g_warning ("add element stream");
+}
+
+/* when the decoder element signals that no more pads will be generated, we
+ * can commit the current group.
+ */
+static void
+no_more_pads_full (GstElement * element, gboolean subs,
+ GstURIDecodeBin * decoder)
+{
+ gboolean final;
+
+ /* setup phase */
+ GST_DEBUG_OBJECT (element, "no more pads, %d pending", decoder->pending);
+
+ GST_URI_DECODE_BIN_LOCK (decoder);
+ final = (decoder->pending == 0);
+
+ /* nothing pending, we can exit */
+ if (final)
+ goto done;
+
+ /* the object has no pending no_more_pads */
+ if (!g_object_get_data (G_OBJECT (element), "pending"))
+ goto done;
+ g_object_set_data (G_OBJECT (element), "pending", NULL);
+
+ decoder->pending--;
+ final = (decoder->pending == 0);
+
+done:
+ GST_URI_DECODE_BIN_UNLOCK (decoder);
+
+ if (final)
+ gst_element_no_more_pads (GST_ELEMENT_CAST (decoder));
+
+ return;
+}
+
+static void
+no_more_pads (GstElement * element, GstURIDecodeBin * decoder)
+{
+ no_more_pads_full (element, FALSE, decoder);
+}
+
+static void
+source_no_more_pads (GstElement * element, GstURIDecodeBin * bin)
+{
+ GST_DEBUG_OBJECT (bin, "No more pads in source element %s.",
+ GST_ELEMENT_NAME (element));
+
+ g_signal_handler_disconnect (element, bin->src_np_sig_id);
+ bin->src_np_sig_id = 0;
+ g_signal_handler_disconnect (element, bin->src_nmp_sig_id);
+ bin->src_nmp_sig_id = 0;
+
+ no_more_pads_full (element, FALSE, bin);
+}
+
+static void
+configure_stream_buffering (GstURIDecodeBin * decoder)
+{
+ GstElement *queue = NULL;
+ GHashTableIter iter;
+ gpointer key, value;
+ gint bitrate = 0;
+
+ /* automatic configuration enabled ? */
+ if (decoder->buffer_size != -1)
+ return;
+
+ GST_URI_DECODE_BIN_LOCK (decoder);
+ if (decoder->queue)
+ queue = gst_object_ref (decoder->queue);
+
+ g_hash_table_iter_init (&iter, decoder->streams);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ GstURIDecodeBinStream *stream = value;
+
+ if (stream->bitrate && bitrate >= 0)
+ bitrate += stream->bitrate;
+ else
+ bitrate = -1;
+ }
+ GST_URI_DECODE_BIN_UNLOCK (decoder);
+
+ GST_DEBUG_OBJECT (decoder, "overall bitrate %d", bitrate);
+ if (!queue)
+ return;
+
+ if (bitrate > 0) {
+ guint64 time;
+ guint bytes;
+
+ /* all streams have a bitrate;
+ * configure queue size based on queue duration using combined bitrate */
+ g_object_get (queue, "max-size-time", &time, NULL);
+ GST_DEBUG_OBJECT (decoder, "queue buffering time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (time));
+ if (time > 0) {
+ bytes = gst_util_uint64_scale (time, bitrate, 8 * GST_SECOND);
+ GST_DEBUG_OBJECT (decoder, "corresponds to buffer size %d", bytes);
+ g_object_set (queue, "max-size-bytes", bytes, NULL);
+ }
+ }
+
+ gst_object_unref (queue);
+}
+
+static GstProbeReturn
+decoded_pad_event_probe (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstEvent *event = type_data;
+ GstURIDecodeBin *decoder = user_data;
+
+ GST_LOG_OBJECT (pad, "%s, decoder %p", GST_EVENT_TYPE_NAME (event), decoder);
+
+ /* look for a bitrate tag */
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:
+ {
+ GstTagList *list;
+ guint bitrate = 0;
+ GstURIDecodeBinStream *stream;
+
+ gst_event_parse_tag (event, &list);
+ if (!gst_tag_list_get_uint_index (list, GST_TAG_NOMINAL_BITRATE, 0,
+ &bitrate)) {
+ gst_tag_list_get_uint_index (list, GST_TAG_BITRATE, 0, &bitrate);
+ }
+ GST_DEBUG_OBJECT (pad, "found bitrate %u", bitrate);
+ if (bitrate) {
+ GST_URI_DECODE_BIN_LOCK (decoder);
+ stream = g_hash_table_lookup (decoder->streams, pad);
+ GST_URI_DECODE_BIN_UNLOCK (decoder);
+ if (stream) {
+ stream->bitrate = bitrate;
+ /* no longer need this probe now */
+ gst_pad_remove_probe (pad, stream->probe_id);
+ /* configure buffer if possible */
+ configure_stream_buffering (decoder);
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ /* never drop */
+ return GST_PROBE_OK;
+}
+
+/* Called by the signal handlers when a decodebin has found a new raw pad */
+static void
+new_decoded_pad_added_cb (GstElement * element, GstPad * pad,
+ GstURIDecodeBin * decoder)
+{
+ GstPad *newpad;
+ GstPadTemplate *pad_tmpl;
+ gchar *padname;
+ GstURIDecodeBinStream *stream;
+
+ GST_DEBUG_OBJECT (element, "new decoded pad, name: <%s>", GST_PAD_NAME (pad));
+
+ GST_URI_DECODE_BIN_LOCK (decoder);
+ padname = g_strdup_printf ("src%d", decoder->numpads);
+ decoder->numpads++;
+ GST_URI_DECODE_BIN_UNLOCK (decoder);
+
+ pad_tmpl = gst_static_pad_template_get (&srctemplate);
+ newpad = gst_ghost_pad_new_from_template (padname, pad, pad_tmpl);
+ gst_object_unref (pad_tmpl);
+ g_free (padname);
+
+ /* store ref to the ghostpad so we can remove it */
+ g_object_set_data (G_OBJECT (pad), "uridecodebin.ghostpad", newpad);
+
+ /* add event probe to monitor tags */
+ stream = g_slice_alloc0 (sizeof (GstURIDecodeBinStream));
+ stream->probe_id =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT, decoded_pad_event_probe,
+ decoder, NULL);
+ GST_URI_DECODE_BIN_LOCK (decoder);
+ g_hash_table_insert (decoder->streams, pad, stream);
+ GST_URI_DECODE_BIN_UNLOCK (decoder);
+
+ gst_pad_set_active (newpad, TRUE);
+ gst_element_add_pad (GST_ELEMENT_CAST (decoder), newpad);
+}
+
+static GstProbeReturn
+source_pad_event_probe (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstEvent *event = type_data;
+ GstURIDecodeBin *decoder = user_data;
+
+ GST_LOG_OBJECT (pad, "%s, decoder %p", GST_EVENT_TYPE_NAME (event), decoder);
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ GST_DEBUG_OBJECT (pad, "we received EOS");
+
+ g_signal_emit (decoder,
+ gst_uri_decode_bin_signals[SIGNAL_DRAINED], 0, NULL);
+ }
+ /* never drop events */
+ return GST_PROBE_OK;
+}
+
+/* called when we found a raw pad on the source element. We need to set up a
+ * padprobe to detect EOS before exposing the pad. */
+static void
+expose_decoded_pad (GstElement * element, GstPad * pad,
+ GstURIDecodeBin * decoder)
+{
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT, source_pad_event_probe, decoder,
+ NULL);
+
+ new_decoded_pad_added_cb (element, pad, decoder);
+}
+
+static void
+pad_removed_cb (GstElement * element, GstPad * pad, GstURIDecodeBin * decoder)
+{
+ GstPad *ghost;
+
+ GST_DEBUG_OBJECT (element, "pad removed name: <%s:%s>",
+ GST_DEBUG_PAD_NAME (pad));
+
+ /* we only care about srcpads */
+ if (!GST_PAD_IS_SRC (pad))
+ return;
+
+ if (!(ghost = g_object_get_data (G_OBJECT (pad), "uridecodebin.ghostpad")))
+ goto no_ghost;
+
+ /* unghost the pad */
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghost), NULL);
+
+ /* deactivate and remove */
+ gst_pad_set_active (pad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (decoder), ghost);
+
+ return;
+
+ /* ERRORS */
+no_ghost:
+ {
+ GST_WARNING_OBJECT (element, "no ghost pad found");
+ return;
+ }
+}
+
+/* helper function to lookup stuff in lists */
+static gboolean
+array_has_value (const gchar * values[], const gchar * value)
+{
+ gint i;
+
+ for (i = 0; values[i]; i++) {
+ if (g_str_has_prefix (value, values[i]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+array_has_uri_value (const gchar * values[], const gchar * value)
+{
+ gint i;
+
+ for (i = 0; values[i]; i++) {
+ if (!g_ascii_strncasecmp (value, values[i], strlen (values[i])))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* list of URIs that we consider to be streams and that need buffering.
+ * We have no mechanism yet to figure this out with a query. */
+static const gchar *stream_uris[] = { "http://", "https://", "mms://",
+ "mmsh://", "mmsu://", "mmst://", "fd://", "myth://", "ssh://",
+ "ftp://", "sftp://",
+ NULL
+};
+
+/* list of URIs that need a queue because they are pretty bursty */
+static const gchar *queue_uris[] = { "cdda://", NULL };
+
+/* blacklisted URIs, we know they will always fail. */
+static const gchar *blacklisted_uris[] = { NULL };
+
+/* mime types that we don't consider to be media types */
+#if 0
+static const gchar *no_media_mimes[] = {
+ "application/x-executable", "application/x-bzip", "application/x-gzip",
+ "application/zip", "application/x-compress", NULL
+};
+#endif
+
+/* media types we can download */
+static const gchar *download_media[] = {
+ "video/quicktime", "video/mj2", "audio/x-m4a", "application/x-3gp",
+ "video/x-flv", "video/x-msvideo", "video/webm", NULL
+};
+
+#define IS_STREAM_URI(uri) (array_has_uri_value (stream_uris, uri))
+#define IS_QUEUE_URI(uri) (array_has_uri_value (queue_uris, uri))
+#define IS_BLACKLISTED_URI(uri) (array_has_uri_value (blacklisted_uris, uri))
+#define IS_NO_MEDIA_MIME(mime) (array_has_value (no_media_mimes, mime))
+#define IS_DOWNLOAD_MEDIA(media) (array_has_value (download_media, media))
+
+/*
+ * Generate and configure a source element.
+ */
+static GstElement *
+gen_source_element (GstURIDecodeBin * decoder)
+{
+ GstElement *source;
+
+ if (!decoder->uri)
+ goto no_uri;
+
+ GST_LOG_OBJECT (decoder, "finding source for %s", decoder->uri);
+
+ if (!gst_uri_is_valid (decoder->uri))
+ goto invalid_uri;
+
+ if (IS_BLACKLISTED_URI (decoder->uri))
+ goto uri_blacklisted;
+
+ source = gst_element_make_from_uri (GST_URI_SRC, decoder->uri, "source");
+ if (!source)
+ goto no_source;
+
+ GST_LOG_OBJECT (decoder, "found source type %s", G_OBJECT_TYPE_NAME (source));
+
+ decoder->is_stream = IS_STREAM_URI (decoder->uri);
+ GST_LOG_OBJECT (decoder, "source is stream: %d", decoder->is_stream);
+
+ decoder->need_queue = IS_QUEUE_URI (decoder->uri);
+ GST_LOG_OBJECT (decoder, "source needs queue: %d", decoder->need_queue);
+
+ /* make HTTP sources send extra headers so we get icecast
+ * metadata in case the stream is an icecast stream */
+ if (!strncmp (decoder->uri, "http://", 7) &&
+ g_object_class_find_property (G_OBJECT_GET_CLASS (source),
+ "iradio-mode")) {
+ GST_LOG_OBJECT (decoder, "configuring iradio-mode");
+ g_object_set (source, "iradio-mode", TRUE, NULL);
+ }
+
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (source),
+ "connection-speed")) {
+ GST_DEBUG_OBJECT (decoder,
+ "setting connection-speed=%d to source element",
+ decoder->connection_speed / 1000);
+ g_object_set (source, "connection-speed",
+ decoder->connection_speed / 1000, NULL);
+ }
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (source),
+ "subtitle-encoding")) {
+ GST_DEBUG_OBJECT (decoder,
+ "setting subtitle-encoding=%s to source element", decoder->encoding);
+ g_object_set (source, "subtitle-encoding", decoder->encoding, NULL);
+ }
+ return source;
+
+ /* ERRORS */
+no_uri:
+ {
+ GST_ELEMENT_ERROR (decoder, RESOURCE, NOT_FOUND,
+ (_("No URI specified to play from.")), (NULL));
+ return NULL;
+ }
+invalid_uri:
+ {
+ GST_ELEMENT_ERROR (decoder, RESOURCE, NOT_FOUND,
+ (_("Invalid URI \"%s\"."), decoder->uri), (NULL));
+ return NULL;
+ }
+uri_blacklisted:
+ {
+ GST_ELEMENT_ERROR (decoder, RESOURCE, FAILED,
+ (_("This stream type cannot be played yet.")), (NULL));
+ return NULL;
+ }
+no_source:
+ {
+ gchar *prot = gst_uri_get_protocol (decoder->uri);
+
+ /* whoops, could not create the source element, dig a little deeper to
+ * figure out what might be wrong. */
+ if (prot) {
+ GstMessage *msg;
+
+ msg =
+ gst_missing_uri_source_message_new (GST_ELEMENT_CAST (decoder), prot);
+ gst_element_post_message (GST_ELEMENT_CAST (decoder), msg);
+
+ GST_ELEMENT_ERROR (decoder, CORE, MISSING_PLUGIN,
+ (_("No URI handler implemented for \"%s\"."), prot), (NULL));
+ g_free (prot);
+ } else
+ goto invalid_uri;
+
+ return NULL;
+ }
+}
+
+/**
+ * has_all_raw_caps:
+ * @pad: a #GstPad
+ * @all_raw: pointer to hold the result
+ *
+ * check if the caps of the pad are all raw. The caps are all raw if
+ * all of its structures contain audio/x-raw or video/x-raw.
+ *
+ * Returns: %FALSE @pad has no caps. Else TRUE and @all_raw set t the result.
+ */
+static gboolean
+has_all_raw_caps (GstPad * pad, GstCaps * rawcaps, gboolean * all_raw)
+{
+ GstCaps *caps, *intersection;
+ gint capssize;
+ gboolean res = FALSE;
+
+ caps = gst_pad_get_caps (pad, NULL);
+ if (caps == NULL)
+ return FALSE;
+
+ GST_DEBUG_OBJECT (pad, "have caps %" GST_PTR_FORMAT, caps);
+
+ capssize = gst_caps_get_size (caps);
+ /* no caps, skip and move to the next pad */
+ if (capssize == 0 || gst_caps_is_empty (caps) || gst_caps_is_any (caps))
+ goto done;
+
+ intersection = gst_caps_intersect (caps, rawcaps);
+ *all_raw = !gst_caps_is_empty (intersection)
+ && (gst_caps_get_size (intersection) == capssize);
+ gst_caps_unref (intersection);
+
+ res = TRUE;
+
+done:
+ gst_caps_unref (caps);
+ return res;
+}
+
+static void
+post_missing_plugin_error (GstElement * dec, const gchar * element_name)
+{
+ GstMessage *msg;
+
+ msg = gst_missing_element_message_new (dec, element_name);
+ gst_element_post_message (dec, msg);
+
+ GST_ELEMENT_ERROR (dec, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ element_name), (NULL));
+}
+
+/**
+ * analyse_source:
+ * @decoder: a #GstURIDecodeBin
+ * @is_raw: are all pads raw data
+ * @have_out: does the source have output
+ * @is_dynamic: is this a dynamic source
+ * @use_queue: put a queue before raw output pads
+ *
+ * Check the source of @decoder and collect information about it.
+ *
+ * @is_raw will be set to TRUE if the source only produces raw pads. When this
+ * function returns, all of the raw pad of the source will be added
+ * to @decoder.
+ *
+ * @have_out: will be set to TRUE if the source has output pads.
+ *
+ * @is_dynamic: TRUE if the element will create (more) pads dynamically later
+ * on.
+ *
+ * Returns: FALSE if a fatal error occured while scanning.
+ */
+static gboolean
+analyse_source (GstURIDecodeBin * decoder, gboolean * is_raw,
+ gboolean * have_out, gboolean * is_dynamic, gboolean use_queue)
+{
+ GstIterator *pads_iter;
+ gboolean done = FALSE;
+ gboolean res = TRUE;
+ GstCaps *rawcaps;
+ GstPad *pad;
+ GValue item = { 0, };
+
+ *have_out = FALSE;
+ *is_raw = FALSE;
+ *is_dynamic = FALSE;
+
+ g_object_get (decoder, "caps", &rawcaps, NULL);
+ if (!rawcaps)
+ rawcaps = DEFAULT_CAPS;
+
+ pads_iter = gst_element_iterate_src_pads (decoder->source);
+ while (!done) {
+ switch (gst_iterator_next (pads_iter, &item)) {
+ case GST_ITERATOR_ERROR:
+ res = FALSE;
+ /* FALLTROUGH */
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ /* reset results and resync */
+ *have_out = FALSE;
+ *is_raw = FALSE;
+ *is_dynamic = FALSE;
+ gst_iterator_resync (pads_iter);
+ break;
+ case GST_ITERATOR_OK:
+ pad = g_value_get_object (&item);
+ /* we now officially have an ouput pad */
+ *have_out = TRUE;
+
+ /* if FALSE, this pad has no caps and we continue with the next pad. */
+ if (!has_all_raw_caps (pad, rawcaps, is_raw)) {
+ g_value_reset (&item);
+ break;
+ }
+
+ /* caps on source pad are all raw, we can add the pad */
+ if (*is_raw) {
+ GstElement *outelem;
+
+ if (use_queue) {
+ GstPad *sinkpad;
+
+ /* insert a queue element right before the raw pad */
+ outelem = gst_element_factory_make ("queue2", NULL);
+ if (!outelem)
+ goto no_queue2;
+
+ gst_bin_add (GST_BIN_CAST (decoder), outelem);
+
+ sinkpad = gst_element_get_static_pad (outelem, "sink");
+ gst_pad_link (pad, sinkpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (pad);
+
+ /* save queue pointer so we can remove it later */
+ decoder->queue = outelem;
+
+ /* get the new raw srcpad */
+ pad = gst_element_get_static_pad (outelem, "src");
+ } else {
+ outelem = decoder->source;
+ }
+ expose_decoded_pad (outelem, pad, decoder);
+ }
+ g_value_reset (&item);
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (pads_iter);
+ gst_caps_unref (rawcaps);
+
+ if (!*have_out) {
+ GstElementClass *elemclass;
+ GList *walk;
+
+ /* element has no output pads, check for padtemplates that list SOMETIMES
+ * pads. */
+ elemclass = GST_ELEMENT_GET_CLASS (decoder->source);
+
+ walk = gst_element_class_get_pad_template_list (elemclass);
+ while (walk != NULL) {
+ GstPadTemplate *templ;
+
+ templ = (GstPadTemplate *) walk->data;
+ if (GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) {
+ if (GST_PAD_TEMPLATE_PRESENCE (templ) == GST_PAD_SOMETIMES)
+ *is_dynamic = TRUE;
+ break;
+ }
+ walk = g_list_next (walk);
+ }
+ }
+
+ return res;
+no_queue2:
+ {
+ post_missing_plugin_error (GST_ELEMENT_CAST (decoder), "queue2");
+
+ g_value_unset (&item);
+ gst_iterator_free (pads_iter);
+ gst_caps_unref (rawcaps);
+
+ return FALSE;
+ }
+}
+
+/* Remove all decodebin from ourself
+ * If force is FALSE, then the decodebin instances will be stored in
+ * pending_decodebins for re-use later on.
+ * If force is TRUE, then all decodebin instances will be unreferenced
+ * and cleared, including the pending ones. */
+static void
+remove_decoders (GstURIDecodeBin * bin, gboolean force)
+{
+ GSList *walk;
+
+ for (walk = bin->decodebins; walk; walk = g_slist_next (walk)) {
+ GstElement *decoder = GST_ELEMENT_CAST (walk->data);
+
+ GST_DEBUG_OBJECT (bin, "removing old decoder element");
+ if (force) {
+ gst_element_set_state (decoder, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (bin), decoder);
+ } else {
+ GstCaps *caps;
+
+ gst_element_set_state (decoder, GST_STATE_READY);
+ /* add it to our list of pending decodebins */
+ g_object_ref (decoder);
+ gst_bin_remove (GST_BIN_CAST (bin), decoder);
+ /* restore some properties we might have changed */
+ g_object_set (decoder, "sink-caps", NULL, NULL);
+ caps = DEFAULT_CAPS;
+ g_object_set (decoder, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ bin->pending_decodebins =
+ g_slist_prepend (bin->pending_decodebins, decoder);
+ }
+ }
+ g_slist_free (bin->decodebins);
+ bin->decodebins = NULL;
+ if (force) {
+ GSList *tmp;
+
+ for (tmp = bin->pending_decodebins; tmp; tmp = tmp->next) {
+ gst_element_set_state ((GstElement *) tmp->data, GST_STATE_NULL);
+ gst_object_unref ((GstElement *) tmp->data);
+ }
+ g_slist_free (bin->pending_decodebins);
+ bin->pending_decodebins = NULL;
+
+ }
+
+ /* Don't loose the SOURCE flag */
+ GST_OBJECT_FLAG_SET (bin, GST_ELEMENT_IS_SOURCE);
+}
+
+static void
+proxy_unknown_type_signal (GstElement * element, GstPad * pad, GstCaps * caps,
+ GstURIDecodeBin * dec)
+{
+ GST_DEBUG_OBJECT (dec, "unknown-type signaled");
+
+ g_signal_emit (dec,
+ gst_uri_decode_bin_signals[SIGNAL_UNKNOWN_TYPE], 0, pad, caps);
+}
+
+static gboolean
+proxy_autoplug_continue_signal (GstElement * element, GstPad * pad,
+ GstCaps * caps, GstURIDecodeBin * dec)
+{
+ gboolean result;
+
+ g_signal_emit (dec,
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_CONTINUE], 0, pad, caps,
+ &result);
+
+ GST_DEBUG_OBJECT (dec, "autoplug-continue returned %d", result);
+
+ return result;
+}
+
+static GValueArray *
+proxy_autoplug_factories_signal (GstElement * element, GstPad * pad,
+ GstCaps * caps, GstURIDecodeBin * dec)
+{
+ GValueArray *result;
+
+ g_signal_emit (dec,
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_FACTORIES], 0, pad, caps,
+ &result);
+
+ GST_DEBUG_OBJECT (dec, "autoplug-factories returned %p", result);
+
+ return result;
+}
+
+static GValueArray *
+proxy_autoplug_sort_signal (GstElement * element, GstPad * pad,
+ GstCaps * caps, GValueArray * factories, GstURIDecodeBin * dec)
+{
+ GValueArray *result;
+
+ g_signal_emit (dec,
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_SORT], 0, pad, caps,
+ factories, &result);
+
+ GST_DEBUG_OBJECT (dec, "autoplug-sort returned %p", result);
+
+ return result;
+}
+
+static GstAutoplugSelectResult
+proxy_autoplug_select_signal (GstElement * element, GstPad * pad,
+ GstCaps * caps, GstElementFactory * factory, GstURIDecodeBin * dec)
+{
+ GstAutoplugSelectResult result;
+
+ g_signal_emit (dec,
+ gst_uri_decode_bin_signals[SIGNAL_AUTOPLUG_SELECT], 0, pad, caps, factory,
+ &result);
+
+ GST_DEBUG_OBJECT (dec, "autoplug-select returned %d", result);
+
+ return result;
+}
+
+static void
+proxy_drained_signal (GstElement * element, GstURIDecodeBin * dec)
+{
+ GST_DEBUG_OBJECT (dec, "drained signaled");
+
+ g_signal_emit (dec, gst_uri_decode_bin_signals[SIGNAL_DRAINED], 0, NULL);
+}
+
+/* make a decodebin and connect to all the signals */
+static GstElement *
+make_decoder (GstURIDecodeBin * decoder)
+{
+ GstElement *decodebin;
+
+ /* re-use pending decodebin */
+ if (decoder->pending_decodebins) {
+ GSList *first = decoder->pending_decodebins;
+ GST_LOG_OBJECT (decoder, "re-using pending decodebin");
+ decodebin = (GstElement *) first->data;
+ decoder->pending_decodebins =
+ g_slist_delete_link (decoder->pending_decodebins, first);
+ } else {
+ GST_LOG_OBJECT (decoder, "making new decodebin");
+
+ /* now create the decoder element */
+ decodebin = gst_element_factory_make ("decodebin", NULL);
+
+ if (!decodebin)
+ goto no_decodebin;
+
+ /* sanity check */
+ if (decodebin->numsinkpads == 0)
+ goto no_typefind;
+
+ /* connect signals to proxy */
+ g_signal_connect (decodebin, "unknown-type",
+ G_CALLBACK (proxy_unknown_type_signal), decoder);
+ g_signal_connect (decodebin, "autoplug-continue",
+ G_CALLBACK (proxy_autoplug_continue_signal), decoder);
+ g_signal_connect (decodebin, "autoplug-factories",
+ G_CALLBACK (proxy_autoplug_factories_signal), decoder);
+ g_signal_connect (decodebin, "autoplug-sort",
+ G_CALLBACK (proxy_autoplug_sort_signal), decoder);
+ g_signal_connect (decodebin, "autoplug-select",
+ G_CALLBACK (proxy_autoplug_select_signal), decoder);
+ g_signal_connect (decodebin, "drained",
+ G_CALLBACK (proxy_drained_signal), decoder);
+
+ /* set up callbacks to create the links between decoded data
+ * and video/audio/subtitle rendering/output. */
+ g_signal_connect (decodebin,
+ "pad-added", G_CALLBACK (new_decoded_pad_added_cb), decoder);
+ g_signal_connect (decodebin,
+ "pad-removed", G_CALLBACK (pad_removed_cb), decoder);
+ g_signal_connect (decodebin, "no-more-pads",
+ G_CALLBACK (no_more_pads), decoder);
+ g_signal_connect (decodebin,
+ "unknown-type", G_CALLBACK (unknown_type_cb), decoder);
+ }
+
+ /* configure caps if we have any */
+ if (decoder->caps)
+ g_object_set (decodebin, "caps", decoder->caps, NULL);
+
+ /* Propagate expose-all-streams property */
+ g_object_set (decodebin, "expose-all-streams", decoder->expose_allstreams,
+ NULL);
+
+ if (!decoder->is_stream) {
+ /* propagate the use-buffering property but only when we are not already
+ * doing stream buffering with queue2. FIXME, we might want to do stream
+ * buffering with the multiqueue buffering instead of queue2. */
+ g_object_set (decodebin, "use-buffering", decoder->use_buffering, NULL);
+
+ if (decoder->use_buffering) {
+ guint max_bytes;
+ guint64 max_time;
+
+ /* configure sizes when buffering */
+ if ((max_bytes = decoder->buffer_size) == -1)
+ max_bytes = 2 * 1024 * 1024;
+ if ((max_time = decoder->buffer_duration) == -1)
+ max_time = 2 * GST_SECOND;
+
+ g_object_set (decodebin, "max-size-bytes", max_bytes, "max-size-buffers",
+ (guint) 0, "max-size-time", max_time, NULL);
+ }
+ }
+
+ g_object_set_data (G_OBJECT (decodebin), "pending", GINT_TO_POINTER (1));
+ g_object_set (decodebin, "subtitle-encoding", decoder->encoding, NULL);
+ decoder->pending++;
+ GST_LOG_OBJECT (decoder, "have %d pending dynamic objects", decoder->pending);
+
+ gst_bin_add (GST_BIN_CAST (decoder), decodebin);
+
+ decoder->decodebins = g_slist_prepend (decoder->decodebins, decodebin);
+
+ return decodebin;
+
+ /* ERRORS */
+no_decodebin:
+ {
+ post_missing_plugin_error (GST_ELEMENT_CAST (decoder), "decodebin");
+ GST_ELEMENT_ERROR (decoder, CORE, MISSING_PLUGIN, (NULL),
+ ("No decodebin element, check your installation"));
+ return NULL;
+ }
+no_typefind:
+ {
+ gst_object_unref (decodebin);
+ GST_ELEMENT_ERROR (decoder, CORE, MISSING_PLUGIN, (NULL),
+ ("No typefind element, decodebin is unusable, check your installation"));
+ return NULL;
+ }
+}
+
+/* signaled when we have a stream and we need to configure the download
+ * buffering or regular buffering */
+static void
+type_found (GstElement * typefind, guint probability,
+ GstCaps * caps, GstURIDecodeBin * decoder)
+{
+ GstElement *dec_elem, *queue;
+ GstStructure *s;
+ const gchar *media_type;
+
+ GST_DEBUG_OBJECT (decoder, "typefind found caps %" GST_PTR_FORMAT, caps);
+
+ s = gst_caps_get_structure (caps, 0);
+ media_type = gst_structure_get_name (s);
+
+ /* remember if we need download buffering */
+ decoder->is_download = IS_DOWNLOAD_MEDIA (media_type) && decoder->download;
+ /* only enable download buffering if the upstream duration is known */
+ if (decoder->is_download) {
+ gint64 dur;
+
+ decoder->is_download =
+ (gst_element_query_duration (typefind, GST_FORMAT_BYTES, &dur)
+ && dur != -1);
+ }
+
+ dec_elem = make_decoder (decoder);
+ if (!dec_elem)
+ goto no_decodebin;
+
+ queue = gst_element_factory_make ("queue2", NULL);
+ if (!queue)
+ goto no_queue2;
+
+ g_object_set (queue, "use-buffering", TRUE, NULL);
+ g_object_set (queue, "ring-buffer-max-size", decoder->ring_buffer_max_size,
+ NULL);
+
+ GST_DEBUG_OBJECT (decoder, "check media-type %s, %d", media_type,
+ decoder->download);
+
+ if (decoder->is_download) {
+ gchar *temp_template, *filename;
+ const gchar *tmp_dir, *prgname;
+
+ tmp_dir = g_get_tmp_dir ();
+ prgname = g_get_prgname ();
+ if (prgname == NULL)
+ prgname = "GStreamer";
+
+ filename = g_strdup_printf ("%s-XXXXXX", prgname);
+
+ /* build our filename */
+ temp_template = g_build_filename (tmp_dir, filename, NULL);
+
+ GST_DEBUG_OBJECT (decoder, "enable download buffering in %s (%s, %s, %s)",
+ temp_template, tmp_dir, prgname, filename);
+
+ /* configure progressive download for selected media types */
+ g_object_set (queue, "temp-template", temp_template, NULL);
+
+ g_free (filename);
+ g_free (temp_template);
+ }
+
+ /* Disable max-size-buffers */
+ g_object_set (queue, "max-size-buffers", 0, NULL);
+
+ /* If buffer size or duration are set, set them on the queue2 element */
+ if (decoder->buffer_size != -1)
+ g_object_set (queue, "max-size-bytes", decoder->buffer_size, NULL);
+ if (decoder->buffer_duration != -1)
+ g_object_set (queue, "max-size-time", decoder->buffer_duration, NULL);
+
+ gst_bin_add (GST_BIN_CAST (decoder), queue);
+
+ if (!gst_element_link_pads (typefind, "src", queue, "sink"))
+ goto could_not_link;
+
+ /* to force caps on the decodebin element and avoid reparsing stuff by
+ * typefind. It also avoids a deadlock in the way typefind activates pads in
+ * the state change */
+ g_object_set (dec_elem, "sink-caps", caps, NULL);
+
+ if (!gst_element_link_pads (queue, "src", dec_elem, "sink"))
+ goto could_not_link;
+
+ /* PLAYING in one go might fail (see bug #632782) */
+ gst_element_set_state (dec_elem, GST_STATE_PAUSED);
+ gst_element_set_state (dec_elem, GST_STATE_PLAYING);
+ gst_element_set_state (queue, GST_STATE_PLAYING);
+
+ do_async_done (decoder);
+
+ return;
+
+ /* ERRORS */
+no_decodebin:
+ {
+ /* error was posted */
+ return;
+ }
+could_not_link:
+ {
+ GST_ELEMENT_ERROR (decoder, CORE, NEGOTIATION,
+ (NULL), ("Can't link typefind to decodebin element"));
+ return;
+ }
+no_queue2:
+ {
+ post_missing_plugin_error (GST_ELEMENT_CAST (decoder), "queue2");
+ return;
+ }
+}
+
+/* setup a streaming source. This will first plug a typefind element to the
+ * source. After we find the type, we decide to plug a queue2 and continue to
+ * plug a decodebin starting from the found caps */
+static gboolean
+setup_streaming (GstURIDecodeBin * decoder)
+{
+ GstElement *typefind;
+
+ /* now create the decoder element */
+ typefind = gst_element_factory_make ("typefind", NULL);
+ if (!typefind)
+ goto no_typefind;
+
+ gst_bin_add (GST_BIN_CAST (decoder), typefind);
+
+ if (!gst_element_link_pads (decoder->source, NULL, typefind, "sink"))
+ goto could_not_link;
+
+ decoder->typefind = typefind;
+
+ /* connect a signal to find out when the typefind element found
+ * a type */
+ decoder->have_type_id =
+ g_signal_connect (decoder->typefind, "have-type",
+ G_CALLBACK (type_found), decoder);
+
+ do_async_start (decoder);
+
+ return TRUE;
+
+ /* ERRORS */
+no_typefind:
+ {
+ post_missing_plugin_error (GST_ELEMENT_CAST (decoder), "typefind");
+ GST_ELEMENT_ERROR (decoder, CORE, MISSING_PLUGIN, (NULL),
+ ("No typefind element, check your installation"));
+ return FALSE;
+ }
+could_not_link:
+ {
+ GST_ELEMENT_ERROR (decoder, CORE, NEGOTIATION,
+ (NULL), ("Can't link source to typefind element"));
+ gst_bin_remove (GST_BIN_CAST (decoder), typefind);
+ /* Don't loose the SOURCE flag */
+ GST_OBJECT_FLAG_SET (decoder, GST_ELEMENT_IS_SOURCE);
+ return FALSE;
+ }
+}
+
+static void
+free_stream (gpointer value)
+{
+ g_slice_free (GstURIDecodeBinStream, value);
+}
+
+/* remove source and all related elements */
+static void
+remove_source (GstURIDecodeBin * bin)
+{
+ GstElement *source = bin->source;
+
+ if (source) {
+ GST_DEBUG_OBJECT (bin, "removing old src element");
+ gst_element_set_state (source, GST_STATE_NULL);
+
+ if (bin->src_np_sig_id) {
+ g_signal_handler_disconnect (source, bin->src_np_sig_id);
+ bin->src_np_sig_id = 0;
+ }
+ if (bin->src_nmp_sig_id) {
+ g_signal_handler_disconnect (source, bin->src_nmp_sig_id);
+ bin->src_nmp_sig_id = 0;
+ }
+ gst_bin_remove (GST_BIN_CAST (bin), source);
+ bin->source = NULL;
+ }
+ if (bin->queue) {
+ GST_DEBUG_OBJECT (bin, "removing old queue element");
+ gst_element_set_state (bin->queue, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (bin), bin->queue);
+ bin->queue = NULL;
+ }
+ if (bin->typefind) {
+ GST_DEBUG_OBJECT (bin, "removing old typefind element");
+ gst_element_set_state (bin->typefind, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (bin), bin->typefind);
+ bin->typefind = NULL;
+ }
+ if (bin->streams) {
+ g_hash_table_destroy (bin->streams);
+ bin->streams = NULL;
+ }
+ /* Don't loose the SOURCE flag */
+ GST_OBJECT_FLAG_SET (bin, GST_ELEMENT_IS_SOURCE);
+}
+
+/* is called when a dynamic source element created a new pad. */
+static void
+source_new_pad (GstElement * element, GstPad * pad, GstURIDecodeBin * bin)
+{
+ GstElement *decoder;
+ gboolean is_raw;
+ GstCaps *rawcaps;
+
+ GST_URI_DECODE_BIN_LOCK (bin);
+ GST_DEBUG_OBJECT (bin, "Found new pad %s.%s in source element %s",
+ GST_DEBUG_PAD_NAME (pad), GST_ELEMENT_NAME (element));
+
+ g_object_get (bin, "caps", &rawcaps, NULL);
+ if (!rawcaps)
+ rawcaps = DEFAULT_CAPS;
+
+ /* if this is a pad with all raw caps, we can expose it */
+ if (has_all_raw_caps (pad, rawcaps, &is_raw) && is_raw) {
+ /* it's all raw, create output pads. */
+ GST_URI_DECODE_BIN_UNLOCK (bin);
+ gst_caps_unref (rawcaps);
+ expose_decoded_pad (element, pad, bin);
+ return;
+ }
+ gst_caps_unref (rawcaps);
+
+ /* not raw, create decoder */
+ decoder = make_decoder (bin);
+ if (!decoder)
+ goto no_decodebin;
+
+ /* and link to decoder */
+ if (!gst_element_link_pads (bin->source, NULL, decoder, "sink"))
+ goto could_not_link;
+
+ GST_DEBUG_OBJECT (bin, "linked decoder to new pad");
+
+ gst_element_set_state (decoder, GST_STATE_PLAYING);
+ GST_URI_DECODE_BIN_UNLOCK (bin);
+
+ return;
+
+ /* ERRORS */
+no_decodebin:
+ {
+ /* error was posted */
+ GST_URI_DECODE_BIN_UNLOCK (bin);
+ return;
+ }
+could_not_link:
+ {
+ GST_ELEMENT_ERROR (bin, CORE, NEGOTIATION,
+ (NULL), ("Can't link source to decoder element"));
+ GST_URI_DECODE_BIN_UNLOCK (bin);
+ return;
+ }
+}
+
+/* construct and run the source and decoder elements until we found
+ * all the streams or until a preroll queue has been filled.
+*/
+static gboolean
+setup_source (GstURIDecodeBin * decoder)
+{
+ gboolean is_raw, have_out, is_dynamic;
+
+ GST_DEBUG_OBJECT (decoder, "setup source");
+
+ /* delete old src */
+ remove_source (decoder);
+
+ decoder->pending = 0;
+
+ /* create and configure an element that can handle the uri */
+ if (!(decoder->source = gen_source_element (decoder)))
+ goto no_source;
+
+ /* state will be merged later - if file is not found, error will be
+ * handled by the application right after. */
+ gst_bin_add (GST_BIN_CAST (decoder), decoder->source);
+
+ /* notify of the new source used */
+ g_object_notify (G_OBJECT (decoder), "source");
+
+ g_signal_emit (decoder, gst_uri_decode_bin_signals[SIGNAL_SOURCE_SETUP],
+ 0, decoder->source);
+
+ /* remove the old decoders now, if any */
+ remove_decoders (decoder, FALSE);
+
+ /* stream admin setup */
+ decoder->streams = g_hash_table_new_full (NULL, NULL, NULL, free_stream);
+
+ /* see if the source element emits raw audio/video all by itself,
+ * if so, we can create streams for the pads and be done with it.
+ * Also check that is has source pads, if not, we assume it will
+ * do everything itself. */
+ if (!analyse_source (decoder, &is_raw, &have_out, &is_dynamic,
+ decoder->need_queue))
+ goto invalid_source;
+
+ if (is_raw) {
+ GST_DEBUG_OBJECT (decoder, "Source provides all raw data");
+ /* source provides raw data, we added the pads and we can now signal a
+ * no_more pads because we are done. */
+ gst_element_no_more_pads (GST_ELEMENT_CAST (decoder));
+ return TRUE;
+ }
+ if (!have_out && !is_dynamic) {
+ GST_DEBUG_OBJECT (decoder, "Source has no output pads");
+ /* create a stream to indicate that this uri is handled by a self
+ * contained element. We are now done. */
+ add_element_stream (decoder->source, decoder);
+ return TRUE;
+ }
+ if (is_dynamic) {
+ GST_DEBUG_OBJECT (decoder, "Source has dynamic output pads");
+ /* connect a handler for the new-pad signal */
+ decoder->src_np_sig_id =
+ g_signal_connect (decoder->source, "pad-added",
+ G_CALLBACK (source_new_pad), decoder);
+ decoder->src_nmp_sig_id =
+ g_signal_connect (decoder->source, "no-more-pads",
+ G_CALLBACK (source_no_more_pads), decoder);
+ g_object_set_data (G_OBJECT (decoder->source), "pending",
+ GINT_TO_POINTER (1));
+ decoder->pending++;
+ } else {
+ if (decoder->is_stream) {
+ GST_DEBUG_OBJECT (decoder, "Setting up streaming");
+ /* do the stream things here */
+ if (!setup_streaming (decoder))
+ goto streaming_failed;
+ } else {
+ GstElement *dec_elem;
+
+ /* no streaming source, we can link now */
+ GST_DEBUG_OBJECT (decoder, "Plugging decodebin to source");
+
+ dec_elem = make_decoder (decoder);
+ if (!dec_elem)
+ goto no_decoder;
+
+ if (!gst_element_link_pads (decoder->source, NULL, dec_elem, "sink"))
+ goto could_not_link;
+ }
+ }
+ return TRUE;
+
+ /* ERRORS */
+no_source:
+ {
+ /* error message was already posted */
+ return FALSE;
+ }
+invalid_source:
+ {
+ GST_ELEMENT_ERROR (decoder, CORE, FAILED,
+ (_("Source element is invalid.")), (NULL));
+ return FALSE;
+ }
+no_decoder:
+ {
+ /* message was posted */
+ return FALSE;
+ }
+streaming_failed:
+ {
+ /* message was posted */
+ return FALSE;
+ }
+could_not_link:
+ {
+ GST_ELEMENT_ERROR (decoder, CORE, NEGOTIATION,
+ (NULL), ("Can't link source to decoder element"));
+ return FALSE;
+ }
+}
+
+static void
+value_list_append_structure_list (GValue * list_val, GstStructure ** first,
+ GList * structure_list)
+{
+ GList *l;
+
+ for (l = structure_list; l != NULL; l = l->next) {
+ GValue val = { 0, };
+
+ if (*first == NULL)
+ *first = gst_structure_copy ((GstStructure *) l->data);
+
+ g_value_init (&val, GST_TYPE_STRUCTURE);
+ g_value_take_boxed (&val, gst_structure_copy ((GstStructure *) l->data));
+ gst_value_list_append_value (list_val, &val);
+ g_value_unset (&val);
+ }
+}
+
+/* if it's a redirect message with multiple redirect locations we might
+ * want to pick a different 'best' location depending on the required
+ * bitrates and the connection speed */
+static GstMessage *
+handle_redirect_message (GstURIDecodeBin * dec, GstMessage * msg)
+{
+ const GValue *locations_list, *location_val;
+ GstMessage *new_msg;
+ GstStructure *new_structure = NULL;
+ GList *l_good = NULL, *l_neutral = NULL, *l_bad = NULL;
+ GValue new_list = { 0, };
+ guint size, i;
+ const GstStructure *structure;
+
+ GST_DEBUG_OBJECT (dec, "redirect message: %" GST_PTR_FORMAT, msg);
+ GST_DEBUG_OBJECT (dec, "connection speed: %u", dec->connection_speed);
+
+ structure = gst_message_get_structure (msg);
+ if (dec->connection_speed == 0 || structure == NULL)
+ return msg;
+
+ locations_list = gst_structure_get_value (structure, "locations");
+ if (locations_list == NULL)
+ return msg;
+
+ size = gst_value_list_get_size (locations_list);
+ if (size < 2)
+ return msg;
+
+ /* maintain existing order as much as possible, just sort references
+ * with too high a bitrate to the end (the assumption being that if
+ * bitrates are given they are given for all interesting streams and
+ * that the you-need-at-least-version-xyz redirect has the same bitrate
+ * as the lowest referenced redirect alternative) */
+ for (i = 0; i < size; ++i) {
+ const GstStructure *s;
+ gint bitrate = 0;
+
+ location_val = gst_value_list_get_value (locations_list, i);
+ s = (const GstStructure *) g_value_get_boxed (location_val);
+ if (!gst_structure_get_int (s, "minimum-bitrate", &bitrate) || bitrate <= 0) {
+ GST_DEBUG_OBJECT (dec, "no bitrate: %" GST_PTR_FORMAT, s);
+ l_neutral = g_list_append (l_neutral, (gpointer) s);
+ } else if (bitrate > dec->connection_speed) {
+ GST_DEBUG_OBJECT (dec, "bitrate too high: %" GST_PTR_FORMAT, s);
+ l_bad = g_list_append (l_bad, (gpointer) s);
+ } else if (bitrate <= dec->connection_speed) {
+ GST_DEBUG_OBJECT (dec, "bitrate OK: %" GST_PTR_FORMAT, s);
+ l_good = g_list_append (l_good, (gpointer) s);
+ }
+ }
+
+ g_value_init (&new_list, GST_TYPE_LIST);
+ value_list_append_structure_list (&new_list, &new_structure, l_good);
+ value_list_append_structure_list (&new_list, &new_structure, l_neutral);
+ value_list_append_structure_list (&new_list, &new_structure, l_bad);
+ gst_structure_set_value (new_structure, "locations", &new_list);
+ g_value_unset (&new_list);
+
+ g_list_free (l_good);
+ g_list_free (l_neutral);
+ g_list_free (l_bad);
+
+ new_msg = gst_message_new_element (msg->src, new_structure);
+ gst_message_unref (msg);
+
+ GST_DEBUG_OBJECT (dec, "new redirect message: %" GST_PTR_FORMAT, new_msg);
+ return new_msg;
+}
+
+static void
+handle_message (GstBin * bin, GstMessage * msg)
+{
+ if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ELEMENT
+ && gst_message_has_name (msg, "redirect")) {
+ /* sort redirect messages based on the connection speed. This simplifies
+ * the user of this element as it can in most cases just pick the first item
+ * of the sorted list as a good redirection candidate. It can of course
+ * choose something else from the list if it has a better way. */
+ msg = handle_redirect_message (GST_URI_DECODE_BIN (bin), msg);
+ }
+ GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
+}
+
+/* generic struct passed to all query fold methods
+ * FIXME, move to core.
+ */
+typedef struct
+{
+ GstQuery *query;
+ gint64 min;
+ gint64 max;
+ gboolean seekable;
+ gboolean live;
+} QueryFold;
+
+typedef void (*QueryInitFunction) (GstURIDecodeBin * dec, QueryFold * fold);
+typedef void (*QueryDoneFunction) (GstURIDecodeBin * dec, QueryFold * fold);
+
+/* for duration/position we collect all durations/positions and take
+ * the MAX of all valid results */
+static void
+decoder_query_init (GstURIDecodeBin * dec, QueryFold * fold)
+{
+ fold->min = 0;
+ fold->max = -1;
+ fold->seekable = TRUE;
+ fold->live = 0;
+}
+
+static gboolean
+decoder_query_duration_fold (const GValue * item, GValue * ret,
+ QueryFold * fold)
+{
+ GstPad *pad = g_value_get_object (item);
+
+ if (gst_pad_query (pad, fold->query)) {
+ gint64 duration;
+
+ g_value_set_boolean (ret, TRUE);
+
+ gst_query_parse_duration (fold->query, NULL, &duration);
+
+ GST_DEBUG_OBJECT (item, "got duration %" G_GINT64_FORMAT, duration);
+
+ if (duration > fold->max)
+ fold->max = duration;
+ }
+ return TRUE;
+}
+
+static void
+decoder_query_duration_done (GstURIDecodeBin * dec, QueryFold * fold)
+{
+ GstFormat format;
+
+ gst_query_parse_duration (fold->query, &format, NULL);
+ /* store max in query result */
+ gst_query_set_duration (fold->query, format, fold->max);
+
+ GST_DEBUG ("max duration %" G_GINT64_FORMAT, fold->max);
+}
+
+static gboolean
+decoder_query_position_fold (const GValue * item, GValue * ret,
+ QueryFold * fold)
+{
+ GstPad *pad = g_value_get_object (item);
+
+ if (gst_pad_query (pad, fold->query)) {
+ gint64 position;
+
+ g_value_set_boolean (ret, TRUE);
+
+ gst_query_parse_position (fold->query, NULL, &position);
+
+ GST_DEBUG_OBJECT (item, "got position %" G_GINT64_FORMAT, position);
+
+ if (position > fold->max)
+ fold->max = position;
+ }
+
+ return TRUE;
+}
+
+static void
+decoder_query_position_done (GstURIDecodeBin * dec, QueryFold * fold)
+{
+ GstFormat format;
+
+ gst_query_parse_position (fold->query, &format, NULL);
+ /* store max in query result */
+ gst_query_set_position (fold->query, format, fold->max);
+
+ GST_DEBUG_OBJECT (dec, "max position %" G_GINT64_FORMAT, fold->max);
+}
+
+static gboolean
+decoder_query_latency_fold (const GValue * item, GValue * ret, QueryFold * fold)
+{
+ GstPad *pad = g_value_get_object (item);
+
+ if (gst_pad_query (pad, fold->query)) {
+ GstClockTime min, max;
+ gboolean live;
+
+ g_value_set_boolean (ret, TRUE);
+
+ gst_query_parse_latency (fold->query, &live, &min, &max);
+
+ GST_DEBUG_OBJECT (item,
+ "got latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
+ ", live %d", GST_TIME_ARGS (min), GST_TIME_ARGS (max), live);
+
+ /* for the combined latency we collect the MAX of all min latencies and
+ * the MIN of all max latencies */
+ if (min > fold->min)
+ fold->min = min;
+ if (fold->max == -1)
+ fold->max = max;
+ else if (max < fold->max)
+ fold->max = max;
+ if (fold->live == FALSE)
+ fold->live = live;
+ }
+
+ return TRUE;
+}
+
+static void
+decoder_query_latency_done (GstURIDecodeBin * dec, QueryFold * fold)
+{
+ /* store max in query result */
+ gst_query_set_latency (fold->query, fold->live, fold->min, fold->max);
+
+ GST_DEBUG_OBJECT (dec,
+ "latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
+ ", live %d", GST_TIME_ARGS (fold->min), GST_TIME_ARGS (fold->max),
+ fold->live);
+}
+
+/* we are seekable if all srcpads are seekable */
+static gboolean
+decoder_query_seeking_fold (const GValue * item, GValue * ret, QueryFold * fold)
+{
+ GstPad *pad = g_value_get_object (item);
+
+ if (gst_pad_query (pad, fold->query)) {
+ gboolean seekable;
+
+ g_value_set_boolean (ret, TRUE);
+ gst_query_parse_seeking (fold->query, NULL, &seekable, NULL, NULL);
+
+ GST_DEBUG_OBJECT (item, "got seekable %d", seekable);
+
+ if (fold->seekable == TRUE)
+ fold->seekable = seekable;
+ }
+
+ return TRUE;
+}
+
+static void
+decoder_query_seeking_done (GstURIDecodeBin * dec, QueryFold * fold)
+{
+ GstFormat format;
+
+ gst_query_parse_seeking (fold->query, &format, NULL, NULL, NULL);
+ gst_query_set_seeking (fold->query, format, fold->seekable, 0, -1);
+
+ GST_DEBUG_OBJECT (dec, "seekable %d", fold->seekable);
+}
+
+/* generic fold, return first valid result */
+static gboolean
+decoder_query_generic_fold (const GValue * item, GValue * ret, QueryFold * fold)
+{
+ GstPad *pad = g_value_get_object (item);
+ gboolean res;
+
+ if ((res = gst_pad_query (pad, fold->query))) {
+ g_value_set_boolean (ret, TRUE);
+ GST_DEBUG_OBJECT (item, "answered query %p", fold->query);
+ }
+
+ /* and stop as soon as we have a valid result */
+ return !res;
+}
+
+
+/* we're a bin, the default query handler iterates sink elements, which we don't
+ * have normally. We should just query all source pads.
+ */
+static gboolean
+gst_uri_decode_bin_query (GstElement * element, GstQuery * query)
+{
+ GstURIDecodeBin *decoder;
+ gboolean res = FALSE;
+ GstIterator *iter;
+ GstIteratorFoldFunction fold_func;
+ QueryInitFunction fold_init = NULL;
+ QueryDoneFunction fold_done = NULL;
+ QueryFold fold_data;
+ GValue ret = { 0 };
+
+ decoder = GST_URI_DECODE_BIN (element);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:
+ /* iterate and collect durations */
+ fold_func = (GstIteratorFoldFunction) decoder_query_duration_fold;
+ fold_init = decoder_query_init;
+ fold_done = decoder_query_duration_done;
+ break;
+ case GST_QUERY_POSITION:
+ /* iterate and collect durations */
+ fold_func = (GstIteratorFoldFunction) decoder_query_position_fold;
+ fold_init = decoder_query_init;
+ fold_done = decoder_query_position_done;
+ break;
+ case GST_QUERY_LATENCY:
+ /* iterate and collect durations */
+ fold_func = (GstIteratorFoldFunction) decoder_query_latency_fold;
+ fold_init = decoder_query_init;
+ fold_done = decoder_query_latency_done;
+ break;
+ case GST_QUERY_SEEKING:
+ /* iterate and collect durations */
+ fold_func = (GstIteratorFoldFunction) decoder_query_seeking_fold;
+ fold_init = decoder_query_init;
+ fold_done = decoder_query_seeking_done;
+ break;
+ default:
+ fold_func = (GstIteratorFoldFunction) decoder_query_generic_fold;
+ break;
+ }
+
+ fold_data.query = query;
+
+ g_value_init (&ret, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&ret, FALSE);
+
+ iter = gst_element_iterate_src_pads (element);
+ GST_DEBUG_OBJECT (element, "Sending query %p (type %d) to src pads",
+ query, GST_QUERY_TYPE (query));
+
+ if (fold_init)
+ fold_init (decoder, &fold_data);
+
+ while (TRUE) {
+ GstIteratorResult ires;
+
+ ires = gst_iterator_fold (iter, fold_func, &ret, &fold_data);
+
+ switch (ires) {
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (iter);
+ if (fold_init)
+ fold_init (decoder, &fold_data);
+ g_value_set_boolean (&ret, FALSE);
+ break;
+ case GST_ITERATOR_OK:
+ case GST_ITERATOR_DONE:
+ res = g_value_get_boolean (&ret);
+ if (fold_done != NULL && res)
+ fold_done (decoder, &fold_data);
+ goto done;
+ default:
+ res = FALSE;
+ goto done;
+ }
+ }
+done:
+ gst_iterator_free (iter);
+
+ return res;
+}
+
+static GstStateChangeReturn
+gst_uri_decode_bin_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstURIDecodeBin *decoder;
+
+ decoder = GST_URI_DECODE_BIN (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (!setup_source (decoder))
+ goto source_failed;
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_DEBUG ("ready to paused");
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto setup_failed;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG ("paused to ready");
+ remove_decoders (decoder, FALSE);
+ remove_source (decoder);
+ do_async_done (decoder);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_DEBUG ("ready to null");
+ remove_decoders (decoder, TRUE);
+ remove_source (decoder);
+ break;
+ default:
+ break;
+ }
+ return ret;
+
+ /* ERRORS */
+source_failed:
+ {
+ return GST_STATE_CHANGE_FAILURE;
+ }
+setup_failed:
+ {
+ /* clean up leftover groups */
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+gboolean
+gst_uri_decode_bin_plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_uri_decode_bin_debug, "uridecodebin", 0,
+ "URI decoder element");
+
+ return gst_element_register (plugin, "uridecodebin", GST_RANK_NONE,
+ GST_TYPE_URI_DECODE_BIN);
+}
diff --git a/gst/subparse/Makefile.am b/gst/subparse/Makefile.am
new file mode 100644
index 0000000..4a33bd4
--- /dev/null
+++ b/gst/subparse/Makefile.am
@@ -0,0 +1,33 @@
+plugin_LTLIBRARIES = libgstsubparse.la
+
+if USE_XML
+SAMIPARSE_SOURCES = samiparse.c samiparse.h
+else
+SAMIPARSE_SOURCES =
+endif
+
+libgstsubparse_la_SOURCES = \
+ gstssaparse.c \
+ gstssaparse.h \
+ gstsubparse.c \
+ gstsubparse.h \
+ $(SAMIPARSE_SOURCES) \
+ tmplayerparse.c \
+ tmplayerparse.h \
+ mpl2parse.c \
+ mpl2parse.h \
+ qttextparse.c \
+ qttextparse.h
+
+libgstsubparse_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
+libgstsubparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstsubparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstsubparse_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstssaparse.h \
+ gstsubparse.h \
+ samiparse.h \
+ tmplayerparse.h \
+ mpl2parse.h \
+ qttextparse.h
diff --git a/gst/subparse/Makefile.in b/gst/subparse/Makefile.in
new file mode 100644
index 0000000..6b95299
--- /dev/null
+++ b/gst/subparse/Makefile.in
@@ -0,0 +1,830 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/subparse
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstsubparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am__libgstsubparse_la_SOURCES_DIST = gstssaparse.c gstssaparse.h \
+ gstsubparse.c gstsubparse.h samiparse.c samiparse.h \
+ tmplayerparse.c tmplayerparse.h mpl2parse.c mpl2parse.h \
+ qttextparse.c qttextparse.h
+@USE_XML_TRUE@am__objects_1 = libgstsubparse_la-samiparse.lo
+am_libgstsubparse_la_OBJECTS = libgstsubparse_la-gstssaparse.lo \
+ libgstsubparse_la-gstsubparse.lo $(am__objects_1) \
+ libgstsubparse_la-tmplayerparse.lo \
+ libgstsubparse_la-mpl2parse.lo \
+ libgstsubparse_la-qttextparse.lo
+libgstsubparse_la_OBJECTS = $(am_libgstsubparse_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstsubparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstsubparse_la_CFLAGS) $(CFLAGS) \
+ $(libgstsubparse_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstsubparse_la_SOURCES)
+DIST_SOURCES = $(am__libgstsubparse_la_SOURCES_DIST)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstsubparse.la
+@USE_XML_FALSE@SAMIPARSE_SOURCES =
+@USE_XML_TRUE@SAMIPARSE_SOURCES = samiparse.c samiparse.h
+libgstsubparse_la_SOURCES = \
+ gstssaparse.c \
+ gstssaparse.h \
+ gstsubparse.c \
+ gstsubparse.h \
+ $(SAMIPARSE_SOURCES) \
+ tmplayerparse.c \
+ tmplayerparse.h \
+ mpl2parse.c \
+ mpl2parse.h \
+ qttextparse.c \
+ qttextparse.h
+
+libgstsubparse_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
+libgstsubparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstsubparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstsubparse_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstssaparse.h \
+ gstsubparse.h \
+ samiparse.h \
+ tmplayerparse.h \
+ mpl2parse.h \
+ qttextparse.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/subparse/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/subparse/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
+libgstsubparse.la: $(libgstsubparse_la_OBJECTS) $(libgstsubparse_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstsubparse_la_LINK) -rpath $(plugindir) $(libgstsubparse_la_OBJECTS) $(libgstsubparse_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-gstssaparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-gstsubparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-mpl2parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-qttextparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-samiparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsubparse_la-tmplayerparse.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstsubparse_la-gstssaparse.lo: gstssaparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-gstssaparse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-gstssaparse.Tpo -c -o libgstsubparse_la-gstssaparse.lo `test -f 'gstssaparse.c' || echo '$(srcdir)/'`gstssaparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-gstssaparse.Tpo $(DEPDIR)/libgstsubparse_la-gstssaparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstssaparse.c' object='libgstsubparse_la-gstssaparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-gstssaparse.lo `test -f 'gstssaparse.c' || echo '$(srcdir)/'`gstssaparse.c
+
+libgstsubparse_la-gstsubparse.lo: gstsubparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-gstsubparse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-gstsubparse.Tpo -c -o libgstsubparse_la-gstsubparse.lo `test -f 'gstsubparse.c' || echo '$(srcdir)/'`gstsubparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-gstsubparse.Tpo $(DEPDIR)/libgstsubparse_la-gstsubparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsubparse.c' object='libgstsubparse_la-gstsubparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-gstsubparse.lo `test -f 'gstsubparse.c' || echo '$(srcdir)/'`gstsubparse.c
+
+libgstsubparse_la-samiparse.lo: samiparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-samiparse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-samiparse.Tpo -c -o libgstsubparse_la-samiparse.lo `test -f 'samiparse.c' || echo '$(srcdir)/'`samiparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-samiparse.Tpo $(DEPDIR)/libgstsubparse_la-samiparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='samiparse.c' object='libgstsubparse_la-samiparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-samiparse.lo `test -f 'samiparse.c' || echo '$(srcdir)/'`samiparse.c
+
+libgstsubparse_la-tmplayerparse.lo: tmplayerparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-tmplayerparse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-tmplayerparse.Tpo -c -o libgstsubparse_la-tmplayerparse.lo `test -f 'tmplayerparse.c' || echo '$(srcdir)/'`tmplayerparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-tmplayerparse.Tpo $(DEPDIR)/libgstsubparse_la-tmplayerparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmplayerparse.c' object='libgstsubparse_la-tmplayerparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-tmplayerparse.lo `test -f 'tmplayerparse.c' || echo '$(srcdir)/'`tmplayerparse.c
+
+libgstsubparse_la-mpl2parse.lo: mpl2parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-mpl2parse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-mpl2parse.Tpo -c -o libgstsubparse_la-mpl2parse.lo `test -f 'mpl2parse.c' || echo '$(srcdir)/'`mpl2parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-mpl2parse.Tpo $(DEPDIR)/libgstsubparse_la-mpl2parse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl2parse.c' object='libgstsubparse_la-mpl2parse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-mpl2parse.lo `test -f 'mpl2parse.c' || echo '$(srcdir)/'`mpl2parse.c
+
+libgstsubparse_la-qttextparse.lo: qttextparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -MT libgstsubparse_la-qttextparse.lo -MD -MP -MF $(DEPDIR)/libgstsubparse_la-qttextparse.Tpo -c -o libgstsubparse_la-qttextparse.lo `test -f 'qttextparse.c' || echo '$(srcdir)/'`qttextparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsubparse_la-qttextparse.Tpo $(DEPDIR)/libgstsubparse_la-qttextparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='qttextparse.c' object='libgstsubparse_la-qttextparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsubparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsubparse_la_CFLAGS) $(CFLAGS) -c -o libgstsubparse_la-qttextparse.lo `test -f 'qttextparse.c' || echo '$(srcdir)/'`qttextparse.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/subparse/gstssaparse.c b/gst/subparse/gstssaparse.c
new file mode 100644
index 0000000..dc75364
--- /dev/null
+++ b/gst/subparse/gstssaparse.c
@@ -0,0 +1,401 @@
+/* GStreamer SSA subtitle parser
+ * Copyright (c) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* Super-primitive SSA parser - we just want the text and ignore
+ * everything else like styles and timing codes etc. for now */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h> /* atoi() */
+#include <string.h>
+
+#include "gstssaparse.h"
+
+GST_DEBUG_CATEGORY_STATIC (ssa_parse_debug);
+#define GST_CAT_DEFAULT ssa_parse_debug
+
+static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-ssa; application/x-ass")
+ );
+
+static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/x-pango-markup")
+ );
+
+#define gst_ssa_parse_parent_class parent_class
+G_DEFINE_TYPE (GstSsaParse, gst_ssa_parse, GST_TYPE_ELEMENT);
+
+static GstStateChangeReturn gst_ssa_parse_change_state (GstElement *
+ element, GstStateChange transition);
+static gboolean gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps);
+static gboolean gst_ssa_parse_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_ssa_parse_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_ssa_parse_chain (GstPad * sinkpad, GstBuffer * buf);
+
+static void
+gst_ssa_parse_dispose (GObject * object)
+{
+ GstSsaParse *parse = GST_SSA_PARSE (object);
+
+ g_free (parse->ini);
+ parse->ini = NULL;
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_ssa_parse_init (GstSsaParse * parse)
+{
+ parse->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink");
+ gst_pad_set_chain_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ssa_parse_chain));
+ gst_pad_set_event_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ssa_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
+
+ parse->srcpad = gst_pad_new_from_static_template (&src_templ, "src");
+ gst_pad_set_event_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_ssa_parse_src_event));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad);
+ gst_pad_use_fixed_caps (parse->srcpad);
+ gst_pad_set_caps (parse->srcpad,
+ gst_static_pad_template_get_caps (&src_templ));
+
+ parse->ini = NULL;
+ parse->framed = FALSE;
+ parse->send_tags = FALSE;
+}
+
+static void
+gst_ssa_parse_class_init (GstSsaParseClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ object_class->dispose = gst_ssa_parse_dispose;
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_templ));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_templ));
+ gst_element_class_set_details_simple (element_class,
+ "SSA Subtitle Parser", "Codec/Parser/Subtitle",
+ "Parses SSA subtitle streams",
+ "Tim-Philipp Müller <tim centricular net>");
+
+ GST_DEBUG_CATEGORY_INIT (ssa_parse_debug, "ssaparse", 0,
+ "SSA subtitle parser");
+
+ element_class->change_state = GST_DEBUG_FUNCPTR (gst_ssa_parse_change_state);
+}
+
+static gboolean
+gst_ssa_parse_src_event (GstPad * pad, GstEvent * event)
+{
+ return gst_pad_event_default (pad, event);
+}
+
+static gboolean
+gst_ssa_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = gst_ssa_parse_setcaps (pad, caps);
+ gst_event_unref (event);
+ break;
+ }
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps)
+{
+ GstSsaParse *parse = GST_SSA_PARSE (GST_PAD_PARENT (sinkpad));
+ const GValue *val;
+ GstStructure *s;
+ const guchar bom_utf8[] = { 0xEF, 0xBB, 0xBF };
+ GstBuffer *priv;
+ gchar *data, *ptr;
+ gsize size, left;
+
+ s = gst_caps_get_structure (caps, 0);
+ val = gst_structure_get_value (s, "codec_data");
+ if (val == NULL) {
+ parse->framed = FALSE;
+ GST_ERROR ("Only SSA subtitles embedded in containers are supported");
+ return FALSE;
+ }
+
+ parse->framed = TRUE;
+ parse->send_tags = TRUE;
+
+ priv = (GstBuffer *) g_value_get_boxed (val);
+ g_return_val_if_fail (priv != NULL, FALSE);
+
+ gst_buffer_ref (priv);
+
+ data = gst_buffer_map (priv, &size, NULL, GST_MAP_READ);
+
+ ptr = data;
+ left = size;
+
+ /* skip UTF-8 BOM */
+ if (left >= 3 && memcmp (ptr, bom_utf8, 3) == 0) {
+ ptr += 3;
+ left -= 3;
+ }
+
+ if (!strstr (data, "[Script Info]")) {
+ GST_WARNING_OBJECT (parse, "Invalid Init section - no Script Info header");
+ gst_buffer_unref (priv);
+ return FALSE;
+ }
+
+ if (!g_utf8_validate (ptr, left, NULL)) {
+ GST_WARNING_OBJECT (parse, "Init section is not valid UTF-8");
+ gst_buffer_unref (priv);
+ return FALSE;
+ }
+
+ /* FIXME: parse initial section */
+ parse->ini = g_strndup (ptr, left);
+ GST_LOG_OBJECT (parse, "Init section:\n%s", parse->ini);
+
+ gst_buffer_unmap (priv, data, size);
+ gst_buffer_unref (priv);
+
+ return TRUE;
+}
+
+static gboolean
+gst_ssa_parse_remove_override_codes (GstSsaParse * parse, gchar * txt)
+{
+ gchar *t, *end;
+ gboolean removed_any = FALSE;
+
+ while ((t = strchr (txt, '{'))) {
+ end = strchr (txt, '}');
+ if (end == NULL) {
+ GST_WARNING_OBJECT (parse, "Missing { for style override code");
+ return removed_any;
+ }
+ /* move terminating NUL character forward as well */
+ g_memmove (t, end + 1, strlen (end + 1) + 1);
+ removed_any = TRUE;
+ }
+
+ /* these may occur outside of curly brackets. We don't handle the different
+ * wrapping modes yet, so just remove these markers from the text for now */
+ while ((t = strstr (txt, "\\n"))) {
+ t[0] = ' ';
+ t[1] = '\n';
+ }
+ while ((t = strstr (txt, "\\N"))) {
+ t[0] = ' ';
+ t[1] = '\n';
+ }
+ while ((t = strstr (txt, "\\h"))) {
+ t[0] = ' ';
+ t[1] = ' ';
+ }
+
+ return removed_any;
+}
+
+/**
+ * gst_ssa_parse_push_line:
+ * @parse: caller element
+ * @txt: text to push
+ * @start: timestamp for the buffer
+ * @duration: duration for the buffer
+ *
+ * Parse the text in a buffer with the given properties and
+ * push it to the srcpad of the @parse element
+ *
+ * Returns: result of the push of the created buffer
+ */
+static GstFlowReturn
+gst_ssa_parse_push_line (GstSsaParse * parse, gchar * txt,
+ GstClockTime start, GstClockTime duration)
+{
+ GstFlowReturn ret;
+ GstBuffer *buf;
+ gchar *t, *escaped;
+ gint num, i, len;
+
+ num = atoi (txt);
+ GST_LOG_OBJECT (parse, "Parsing line #%d at %" GST_TIME_FORMAT,
+ num, GST_TIME_ARGS (start));
+
+ /* skip all non-text fields before the actual text */
+ t = txt;
+ for (i = 0; i < 8; ++i) {
+ t = strchr (t, ',');
+ if (t == NULL)
+ return GST_FLOW_ERROR;
+ ++t;
+ }
+
+ GST_LOG_OBJECT (parse, "Text : %s", t);
+
+ if (gst_ssa_parse_remove_override_codes (parse, t)) {
+ GST_LOG_OBJECT (parse, "Clean: %s", t);
+ }
+
+ /* we claim to output pango markup, so we must escape the
+ * text even if we don't actually use any pango markup yet */
+ escaped = g_markup_printf_escaped ("%s", t);
+
+ len = strlen (escaped);
+
+ /* allocate enough for a terminating NUL, but don't include it in buf size */
+ buf = gst_buffer_new_and_alloc (len + 1);
+ gst_buffer_fill (buf, 0, escaped, len + 1);
+ gst_buffer_set_size (buf, len);
+ g_free (escaped);
+
+ GST_BUFFER_TIMESTAMP (buf) = start;
+ GST_BUFFER_DURATION (buf) = duration;
+
+ GST_LOG_OBJECT (parse, "Pushing buffer with timestamp %" GST_TIME_FORMAT
+ " and duration %" GST_TIME_FORMAT, GST_TIME_ARGS (start),
+ GST_TIME_ARGS (duration));
+
+ ret = gst_pad_push (parse->srcpad, buf);
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (parse, "Push of text '%s' returned flow %s", txt,
+ gst_flow_get_name (ret));
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_ssa_parse_chain (GstPad * sinkpad, GstBuffer * buf)
+{
+ GstFlowReturn ret;
+ GstSsaParse *parse = GST_SSA_PARSE (GST_PAD_PARENT (sinkpad));
+ GstClockTime ts;
+ gchar *txt;
+ gchar *data;
+ gsize size;
+
+ if (G_UNLIKELY (!parse->framed))
+ goto not_framed;
+
+ if (G_UNLIKELY (parse->send_tags)) {
+ GstTagList *tags;
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_SUBTITLE_CODEC,
+ "SubStation Alpha", NULL);
+ gst_element_found_tags_for_pad (GST_ELEMENT (parse), parse->srcpad, tags);
+ parse->send_tags = FALSE;
+ }
+
+ /* make double-sure it's 0-terminated and all */
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ txt = g_strndup (data, size);
+ gst_buffer_unmap (buf, data, size);
+
+ if (txt == NULL)
+ goto empty_text;
+
+ ts = GST_BUFFER_TIMESTAMP (buf);
+ ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf));
+
+ if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) {
+ GstSegment segment;
+
+ /* just advance time without sending anything */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = ts;
+ segment.time = ts;
+ gst_pad_push_event (parse->srcpad, gst_event_new_segment (&segment));
+ ret = GST_FLOW_OK;
+ }
+
+ gst_buffer_unref (buf);
+ g_free (txt);
+
+ return ret;
+
+/* ERRORS */
+not_framed:
+ {
+ GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
+ ("Only SSA subtitles embedded in containers are supported"));
+ gst_buffer_unref (buf);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+empty_text:
+ {
+ GST_ELEMENT_WARNING (parse, STREAM, FORMAT, (NULL),
+ ("Received empty subtitle"));
+ gst_buffer_unref (buf);
+ return GST_FLOW_OK;
+ }
+}
+
+static GstStateChangeReturn
+gst_ssa_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstSsaParse *parse = GST_SSA_PARSE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ 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:
+ g_free (parse->ini);
+ parse->ini = NULL;
+ parse->framed = FALSE;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/gst/subparse/gstssaparse.h b/gst/subparse/gstssaparse.h
new file mode 100644
index 0000000..518c3cd
--- /dev/null
+++ b/gst/subparse/gstssaparse.h
@@ -0,0 +1,57 @@
+/* GStreamer SSA subtitle parser
+ * Copyright (c) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_SSA_PARSE_H__
+#define __GST_SSA_PARSE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SSA_PARSE (gst_ssa_parse_get_type ())
+#define GST_SSA_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SSA_PARSE, GstSsaParse))
+#define GST_SSA_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SSA_PARSE, GstSsaParseClass))
+#define GST_IS_SSA_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SSA_PARSE))
+#define GST_IS_SSA_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SSA_PARSE))
+
+typedef struct _GstSsaParse GstSsaParse;
+typedef struct _GstSsaParseClass GstSsaParseClass;
+
+struct _GstSsaParse {
+ GstElement element;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ gboolean framed;
+ gboolean send_tags;
+
+ gchar *ini;
+};
+
+struct _GstSsaParseClass {
+ GstElementClass parent_class;
+};
+
+GType gst_ssa_parse_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_SSA_PARSE_H__ */
+
diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c
new file mode 100644
index 0000000..2a12d96
--- /dev/null
+++ b/gst/subparse/gstsubparse.c
@@ -0,0 +1,1833 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2004 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <glib.h>
+
+#include "gstsubparse.h"
+#include "gstssaparse.h"
+#include "samiparse.h"
+#include "tmplayerparse.h"
+#include "mpl2parse.h"
+#include "qttextparse.h"
+
+GST_DEBUG_CATEGORY (sub_parse_debug);
+
+#define DEFAULT_ENCODING NULL
+
+enum
+{
+ PROP_0,
+ PROP_ENCODING,
+ PROP_VIDEOFPS
+};
+
+static void
+gst_sub_parse_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void
+gst_sub_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+
+#ifndef GST_DISABLE_XML
+static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-subtitle; application/x-subtitle-sami; "
+ "application/x-subtitle-tmplayer; application/x-subtitle-mpl2; "
+ "application/x-subtitle-dks; application/x-subtitle-qttext")
+ );
+#else
+static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("application/x-subtitle; application/x-subtitle-dks; "
+ "application/x-subtitle-tmplayer; application/x-subtitle-mpl2; "
+ "application/x-subtitle-qttext")
+ );
+#endif
+
+static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/plain; text/x-pango-markup")
+ );
+
+
+static gboolean gst_sub_parse_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_sub_parse_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_sub_parse_sink_event (GstPad * pad, GstEvent * event);
+
+static GstStateChangeReturn gst_sub_parse_change_state (GstElement * element,
+ GstStateChange transition);
+
+static GstFlowReturn gst_sub_parse_chain (GstPad * sinkpad, GstBuffer * buf);
+
+#define gst_sub_parse_parent_class parent_class
+G_DEFINE_TYPE (GstSubParse, gst_sub_parse, GST_TYPE_ELEMENT);
+
+static void
+gst_sub_parse_dispose (GObject * object)
+{
+ GstSubParse *subparse = GST_SUBPARSE (object);
+
+ GST_DEBUG_OBJECT (subparse, "cleaning up subtitle parser");
+
+ switch (subparse->parser_type) {
+ case GST_SUB_PARSE_FORMAT_QTTEXT:
+ qttext_context_deinit (&subparse->state);
+ break;
+#ifndef GST_DISABLE_XML
+ case GST_SUB_PARSE_FORMAT_SAMI:
+ sami_context_deinit (&subparse->state);
+ break;
+#endif
+ default:
+ break;
+ }
+
+ if (subparse->encoding) {
+ g_free (subparse->encoding);
+ subparse->encoding = NULL;
+ }
+
+ if (subparse->detected_encoding) {
+ g_free (subparse->detected_encoding);
+ subparse->detected_encoding = NULL;
+ }
+
+ if (subparse->adapter) {
+ g_object_unref (subparse->adapter);
+ subparse->adapter = NULL;
+ }
+
+ if (subparse->textbuf) {
+ g_string_free (subparse->textbuf, TRUE);
+ subparse->textbuf = NULL;
+ }
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_sub_parse_class_init (GstSubParseClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ object_class->dispose = gst_sub_parse_dispose;
+ object_class->set_property = gst_sub_parse_set_property;
+ object_class->get_property = gst_sub_parse_get_property;
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_templ));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_templ));
+ gst_element_class_set_details_simple (element_class,
+ "Subtitle parser", "Codec/Parser/Subtitle",
+ "Parses subtitle (.sub) files into text streams",
+ "Gustavo J. A. M. Carneiro <gjc@inescporto.pt>, "
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ element_class->change_state = gst_sub_parse_change_state;
+
+ g_object_class_install_property (object_class, PROP_ENCODING,
+ g_param_spec_string ("subtitle-encoding", "subtitle charset encoding",
+ "Encoding to assume if input subtitles are not in UTF-8 or any other "
+ "Unicode encoding. If not set, the GST_SUBTITLE_ENCODING environment "
+ "variable will be checked for an encoding to use. If that is not set "
+ "either, ISO-8859-15 will be assumed.", DEFAULT_ENCODING,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_VIDEOFPS,
+ gst_param_spec_fraction ("video-fps", "Video framerate",
+ "Framerate of the video stream. This is needed by some subtitle "
+ "formats to synchronize subtitles and video properly. If not set "
+ "and the subtitle format requires it subtitles may be out of sync.",
+ 0, 1, G_MAXINT, 1, 24000, 1001,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_sub_parse_init (GstSubParse * subparse)
+{
+ subparse->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink");
+ gst_pad_set_chain_function (subparse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_sub_parse_chain));
+ gst_pad_set_event_function (subparse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_sub_parse_sink_event));
+ gst_element_add_pad (GST_ELEMENT (subparse), subparse->sinkpad);
+
+ subparse->srcpad = gst_pad_new_from_static_template (&src_templ, "src");
+ gst_pad_set_event_function (subparse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_sub_parse_src_event));
+ gst_pad_set_query_function (subparse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_sub_parse_src_query));
+ gst_element_add_pad (GST_ELEMENT (subparse), subparse->srcpad);
+
+ subparse->textbuf = g_string_new (NULL);
+ subparse->parser_type = GST_SUB_PARSE_FORMAT_UNKNOWN;
+ subparse->flushing = FALSE;
+ gst_segment_init (&subparse->segment, GST_FORMAT_TIME);
+ subparse->need_segment = TRUE;
+ subparse->encoding = g_strdup (DEFAULT_ENCODING);
+ subparse->detected_encoding = NULL;
+ subparse->adapter = gst_adapter_new ();
+
+ subparse->fps_n = 24000;
+ subparse->fps_d = 1001;
+}
+
+/*
+ * Source pad functions.
+ */
+
+static gboolean
+gst_sub_parse_src_query (GstPad * pad, GstQuery * query)
+{
+ GstSubParse *self = GST_SUBPARSE (gst_pad_get_parent (pad));
+ gboolean ret = FALSE;
+
+ GST_DEBUG ("Handling %s query", GST_QUERY_TYPE_NAME (query));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:{
+ GstFormat fmt;
+
+ gst_query_parse_position (query, &fmt, NULL);
+ if (fmt != GST_FORMAT_TIME) {
+ ret = gst_pad_peer_query (self->sinkpad, query);
+ } else {
+ ret = TRUE;
+ gst_query_set_position (query, GST_FORMAT_TIME, self->segment.position);
+ }
+ break;
+ }
+ case GST_QUERY_SEEKING:
+ {
+ GstFormat fmt;
+ gboolean seekable = FALSE;
+
+ ret = TRUE;
+
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+ if (fmt == GST_FORMAT_TIME) {
+ GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+
+ seekable = gst_pad_peer_query (self->sinkpad, peerquery);
+ if (seekable)
+ gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+ gst_query_unref (peerquery);
+ }
+
+ gst_query_set_seeking (query, fmt, seekable, seekable ? 0 : -1, -1);
+ break;
+ }
+ default:
+ ret = gst_pad_peer_query (self->sinkpad, query);
+ break;
+ }
+
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static gboolean
+gst_sub_parse_src_event (GstPad * pad, GstEvent * event)
+{
+ GstSubParse *self = GST_SUBPARSE (gst_pad_get_parent (pad));
+ gboolean ret = FALSE;
+
+ GST_DEBUG ("Handling %s event", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType start_type, stop_type;
+ gint64 start, stop;
+ gdouble rate;
+ gboolean update;
+
+ gst_event_parse_seek (event, &rate, &format, &flags,
+ &start_type, &start, &stop_type, &stop);
+
+ if (format != GST_FORMAT_TIME) {
+ GST_WARNING_OBJECT (self, "we only support seeking in TIME format");
+ gst_event_unref (event);
+ goto beach;
+ }
+
+ /* Convert that seek to a seeking in bytes at position 0,
+ FIXME: could use an index */
+ ret = gst_pad_push_event (self->sinkpad,
+ gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, 0));
+
+ if (ret) {
+ /* Apply the seek to our segment */
+ gst_segment_do_seek (&self->segment, rate, format, flags,
+ start_type, start, stop_type, stop, &update);
+
+ GST_DEBUG_OBJECT (self, "segment after seek: %" GST_SEGMENT_FORMAT,
+ &self->segment);
+
+ self->next_offset = 0;
+
+ self->need_segment = TRUE;
+ } else {
+ GST_WARNING_OBJECT (self, "seek to 0 bytes failed");
+ }
+
+ gst_event_unref (event);
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+beach:
+ gst_object_unref (self);
+
+ return ret;
+}
+
+static void
+gst_sub_parse_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSubParse *subparse = GST_SUBPARSE (object);
+
+ GST_OBJECT_LOCK (subparse);
+ switch (prop_id) {
+ case PROP_ENCODING:
+ g_free (subparse->encoding);
+ subparse->encoding = g_value_dup_string (value);
+ GST_LOG_OBJECT (object, "subtitle encoding set to %s",
+ GST_STR_NULL (subparse->encoding));
+ break;
+ case PROP_VIDEOFPS:
+ {
+ subparse->fps_n = gst_value_get_fraction_numerator (value);
+ subparse->fps_d = gst_value_get_fraction_denominator (value);
+ GST_DEBUG_OBJECT (object, "video framerate set to %d/%d", subparse->fps_n,
+ subparse->fps_d);
+
+ if (!subparse->state.have_internal_fps) {
+ subparse->state.fps_n = subparse->fps_n;
+ subparse->state.fps_d = subparse->fps_d;
+ }
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (subparse);
+}
+
+static void
+gst_sub_parse_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstSubParse *subparse = GST_SUBPARSE (object);
+
+ GST_OBJECT_LOCK (subparse);
+ switch (prop_id) {
+ case PROP_ENCODING:
+ g_value_set_string (value, subparse->encoding);
+ break;
+ case PROP_VIDEOFPS:
+ gst_value_set_fraction (value, subparse->fps_n, subparse->fps_d);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (subparse);
+}
+
+static const gchar *
+gst_sub_parse_get_format_description (GstSubParseFormat format)
+{
+ switch (format) {
+ case GST_SUB_PARSE_FORMAT_MDVDSUB:
+ return "MicroDVD";
+ case GST_SUB_PARSE_FORMAT_SUBRIP:
+ return "SubRip";
+ case GST_SUB_PARSE_FORMAT_MPSUB:
+ return "MPSub";
+ case GST_SUB_PARSE_FORMAT_SAMI:
+ return "SAMI";
+ case GST_SUB_PARSE_FORMAT_TMPLAYER:
+ return "TMPlayer";
+ case GST_SUB_PARSE_FORMAT_MPL2:
+ return "MPL2";
+ case GST_SUB_PARSE_FORMAT_SUBVIEWER:
+ return "SubViewer";
+ case GST_SUB_PARSE_FORMAT_DKS:
+ return "DKS";
+ case GST_SUB_PARSE_FORMAT_QTTEXT:
+ return "QTtext";
+ default:
+ case GST_SUB_PARSE_FORMAT_UNKNOWN:
+ break;
+ }
+ return NULL;
+}
+
+static gchar *
+gst_convert_to_utf8 (const gchar * str, gsize len, const gchar * encoding,
+ gsize * consumed, GError ** err)
+{
+ gchar *ret = NULL;
+
+ *consumed = 0;
+ /* The char cast is necessary in glib < 2.24 */
+ ret =
+ g_convert_with_fallback (str, len, "UTF-8", encoding, (char *) "*",
+ consumed, NULL, err);
+ if (ret == NULL)
+ return ret;
+
+ /* + 3 to skip UTF-8 BOM if it was added */
+ len = strlen (ret);
+ if (len >= 3 && (guint8) ret[0] == 0xEF && (guint8) ret[1] == 0xBB
+ && (guint8) ret[2] == 0xBF)
+ g_memmove (ret, ret + 3, len + 1 - 3);
+
+ return ret;
+}
+
+static gchar *
+detect_encoding (const gchar * str, gsize len)
+{
+ if (len >= 3 && (guint8) str[0] == 0xEF && (guint8) str[1] == 0xBB
+ && (guint8) str[2] == 0xBF)
+ return g_strdup ("UTF-8");
+
+ if (len >= 2 && (guint8) str[0] == 0xFE && (guint8) str[1] == 0xFF)
+ return g_strdup ("UTF-16BE");
+
+ if (len >= 2 && (guint8) str[0] == 0xFF && (guint8) str[1] == 0xFE)
+ return g_strdup ("UTF-16LE");
+
+ if (len >= 4 && (guint8) str[0] == 0x00 && (guint8) str[1] == 0x00
+ && (guint8) str[2] == 0xFE && (guint8) str[3] == 0xFF)
+ return g_strdup ("UTF-32BE");
+
+ if (len >= 4 && (guint8) str[0] == 0xFF && (guint8) str[1] == 0xFE
+ && (guint8) str[2] == 0x00 && (guint8) str[3] == 0x00)
+ return g_strdup ("UTF-32LE");
+
+ return NULL;
+}
+
+static gchar *
+convert_encoding (GstSubParse * self, const gchar * str, gsize len,
+ gsize * consumed)
+{
+ const gchar *encoding;
+ GError *err = NULL;
+ gchar *ret = NULL;
+
+ *consumed = 0;
+
+ /* First try any detected encoding */
+ if (self->detected_encoding) {
+ ret =
+ gst_convert_to_utf8 (str, len, self->detected_encoding, consumed, &err);
+
+ if (!err)
+ return ret;
+
+ GST_WARNING_OBJECT (self, "could not convert string from '%s' to UTF-8: %s",
+ self->detected_encoding, err->message);
+ g_free (self->detected_encoding);
+ self->detected_encoding = NULL;
+ g_error_free (err);
+ }
+
+ /* Otherwise check if it's UTF8 */
+ if (self->valid_utf8) {
+ if (g_utf8_validate (str, len, NULL)) {
+ GST_LOG_OBJECT (self, "valid UTF-8, no conversion needed");
+ *consumed = len;
+ return g_strndup (str, len);
+ }
+ GST_INFO_OBJECT (self, "invalid UTF-8!");
+ self->valid_utf8 = FALSE;
+ }
+
+ /* Else try fallback */
+ encoding = self->encoding;
+ if (encoding == NULL || *encoding == '\0') {
+ 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";
+ }
+ }
+
+ ret = gst_convert_to_utf8 (str, len, encoding, consumed, &err);
+
+ if (err) {
+ GST_WARNING_OBJECT (self, "could not convert string from '%s' to UTF-8: %s",
+ encoding, err->message);
+ g_error_free (err);
+
+ /* invalid input encoding, fall back to ISO-8859-15 (always succeeds) */
+ ret = gst_convert_to_utf8 (str, len, "ISO-8859-15", consumed, NULL);
+ }
+
+ GST_LOG_OBJECT (self,
+ "successfully converted %" G_GSIZE_FORMAT " characters from %s to UTF-8"
+ "%s", len, encoding, (err) ? " , using ISO-8859-15 as fallback" : "");
+
+ return ret;
+}
+
+static gchar *
+get_next_line (GstSubParse * self)
+{
+ char *line = NULL;
+ const char *line_end;
+ int line_len;
+ gboolean have_r = FALSE;
+
+ line_end = strchr (self->textbuf->str, '\n');
+
+ if (!line_end) {
+ /* end-of-line not found; return for more data */
+ return NULL;
+ }
+
+ /* get rid of '\r' */
+ if (line_end != self->textbuf->str && *(line_end - 1) == '\r') {
+ line_end--;
+ have_r = TRUE;
+ }
+
+ line_len = line_end - self->textbuf->str;
+ line = g_strndup (self->textbuf->str, line_len);
+ self->textbuf = g_string_erase (self->textbuf, 0,
+ line_len + (have_r ? 2 : 1));
+ return line;
+}
+
+static gchar *
+parse_mdvdsub (ParserState * state, const gchar * line)
+{
+ const gchar *line_split;
+ gchar *line_chunk;
+ guint start_frame, end_frame;
+ guint64 clip_start = 0, clip_stop = 0;
+ gboolean in_seg = FALSE;
+ GString *markup;
+ gchar *ret;
+
+ /* style variables */
+ gboolean italic;
+ gboolean bold;
+ guint fontsize;
+ gdouble fps = 0.0;
+
+ if (sscanf (line, "{%u}{%u}", &start_frame, &end_frame) != 2) {
+ g_warning ("Parse of the following line, assumed to be in microdvd .sub"
+ " format, failed:\n%s", line);
+ return NULL;
+ }
+
+ /* skip the {%u}{%u} part */
+ line = strchr (line, '}') + 1;
+ line = strchr (line, '}') + 1;
+
+ /* see if there's a first line with a framerate */
+ if (start_frame == 1 && end_frame == 1) {
+ gchar *rest, *end = NULL;
+
+ rest = g_strdup (line);
+ g_strdelimit (rest, ",", '.');
+ fps = g_ascii_strtod (rest, &end);
+ if (end != rest) {
+ gst_util_double_to_fraction (fps, &state->fps_n, &state->fps_d);
+ GST_INFO ("framerate from file: %d/%d ('%s')", state->fps_n,
+ state->fps_d, rest);
+ }
+ g_free (rest);
+ return NULL;
+ }
+
+ state->start_time =
+ gst_util_uint64_scale (start_frame, GST_SECOND * state->fps_d,
+ state->fps_n);
+ state->duration =
+ gst_util_uint64_scale (end_frame - start_frame, GST_SECOND * state->fps_d,
+ state->fps_n);
+
+ /* Check our segment start/stop */
+ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
+ state->start_time, state->start_time + state->duration, &clip_start,
+ &clip_stop);
+
+ /* No need to parse that text if it's out of segment */
+ if (in_seg) {
+ state->start_time = clip_start;
+ state->duration = clip_stop - clip_start;
+ } else {
+ return NULL;
+ }
+
+ markup = g_string_new (NULL);
+ while (1) {
+ italic = FALSE;
+ bold = FALSE;
+ fontsize = 0;
+ /* parse style markup */
+ if (strncmp (line, "{y:i}", 5) == 0) {
+ italic = TRUE;
+ line = strchr (line, '}') + 1;
+ }
+ if (strncmp (line, "{y:b}", 5) == 0) {
+ bold = TRUE;
+ line = strchr (line, '}') + 1;
+ }
+ if (sscanf (line, "{s:%u}", &fontsize) == 1) {
+ line = strchr (line, '}') + 1;
+ }
+ /* forward slashes at beginning/end signify italics too */
+ if (g_str_has_prefix (line, "/")) {
+ italic = TRUE;
+ ++line;
+ }
+ if ((line_split = strchr (line, '|')))
+ line_chunk = g_markup_escape_text (line, line_split - line);
+ else
+ line_chunk = g_markup_escape_text (line, strlen (line));
+
+ /* Remove italics markers at end of line/stanza (CHECKME: are end slashes
+ * always at the end of a line or can they span multiple lines?) */
+ if (g_str_has_suffix (line_chunk, "/")) {
+ line_chunk[strlen (line_chunk) - 1] = '\0';
+ }
+
+ markup = g_string_append (markup, "<span");
+ if (italic)
+ g_string_append (markup, " style=\"italic\"");
+ if (bold)
+ g_string_append (markup, " weight=\"bold\"");
+ if (fontsize)
+ g_string_append_printf (markup, " size=\"%u\"", fontsize * 1000);
+ g_string_append_printf (markup, ">%s</span>", line_chunk);
+ g_free (line_chunk);
+ if (line_split) {
+ g_string_append (markup, "\n");
+ line = line_split + 1;
+ } else {
+ break;
+ }
+ }
+ ret = markup->str;
+ g_string_free (markup, FALSE);
+ GST_DEBUG ("parse_mdvdsub returning (%f+%f): %s",
+ state->start_time / (double) GST_SECOND,
+ state->duration / (double) GST_SECOND, ret);
+ return ret;
+}
+
+static void
+strip_trailing_newlines (gchar * txt)
+{
+ if (txt) {
+ guint len;
+
+ len = strlen (txt);
+ while (len > 1 && txt[len - 1] == '\n') {
+ txt[len - 1] = '\0';
+ --len;
+ }
+ }
+}
+
+/* we want to escape text in general, but retain basic markup like
+ * <i></i>, <u></u>, and <b></b>. The easiest and safest way is to
+ * just unescape a white list of allowed markups again after
+ * escaping everything (the text between these simple markers isn't
+ * necessarily escaped, so it seems best to do it like this) */
+static void
+subrip_unescape_formatting (gchar * txt)
+{
+ gchar *pos;
+
+ for (pos = txt; pos != NULL && *pos != '\0'; ++pos) {
+ if (g_ascii_strncasecmp (pos, "&lt;u&gt;", 9) == 0 ||
+ g_ascii_strncasecmp (pos, "&lt;i&gt;", 9) == 0 ||
+ g_ascii_strncasecmp (pos, "&lt;b&gt;", 9) == 0) {
+ pos[0] = '<';
+ pos[1] = g_ascii_tolower (pos[4]);
+ pos[2] = '>';
+ /* move NUL terminator as well */
+ g_memmove (pos + 3, pos + 9, strlen (pos + 9) + 1);
+ pos += 2;
+ }
+ }
+
+ for (pos = txt; pos != NULL && *pos != '\0'; ++pos) {
+ if (g_ascii_strncasecmp (pos, "&lt;/u&gt;", 10) == 0 ||
+ g_ascii_strncasecmp (pos, "&lt;/i&gt;", 10) == 0 ||
+ g_ascii_strncasecmp (pos, "&lt;/b&gt;", 10) == 0) {
+ pos[0] = '<';
+ pos[1] = '/';
+ pos[2] = g_ascii_tolower (pos[5]);
+ pos[3] = '>';
+ /* move NUL terminator as well */
+ g_memmove (pos + 4, pos + 10, strlen (pos + 10) + 1);
+ pos += 3;
+ }
+ }
+}
+
+
+static gboolean
+subrip_remove_unhandled_tag (gchar * start, gchar * stop)
+{
+ gchar *tag, saved;
+
+ tag = start + strlen ("&lt;");
+ if (*tag == '/')
+ ++tag;
+
+ if (g_ascii_tolower (*tag) < 'a' || g_ascii_tolower (*tag) > 'z')
+ return FALSE;
+
+ saved = *stop;
+ *stop = '\0';
+ GST_LOG ("removing unhandled tag '%s'", start);
+ *stop = saved;
+ g_memmove (start, stop, strlen (stop) + 1);
+ return TRUE;
+}
+
+/* remove tags we haven't explicitly allowed earlier on, like font tags
+ * for example */
+static void
+subrip_remove_unhandled_tags (gchar * txt)
+{
+ gchar *pos, *gt;
+
+ for (pos = txt; pos != NULL && *pos != '\0'; ++pos) {
+ if (strncmp (pos, "&lt;", 4) == 0 && (gt = strstr (pos + 4, "&gt;"))) {
+ if (subrip_remove_unhandled_tag (pos, gt + strlen ("&gt;")))
+ --pos;
+ }
+ }
+}
+
+/* we only allow <i>, <u> and <b>, so let's take a simple approach. This code
+ * assumes the input has been escaped and subrip_unescape_formatting() has then
+ * been run over the input! This function adds missing closing markup tags and
+ * removes broken closing tags for tags that have never been opened. */
+static void
+subrip_fix_up_markup (gchar ** p_txt)
+{
+ gchar *cur, *next_tag;
+ gchar open_tags[32];
+ guint num_open_tags = 0;
+
+ g_assert (*p_txt != NULL);
+
+ cur = *p_txt;
+ while (*cur != '\0') {
+ next_tag = strchr (cur, '<');
+ if (next_tag == NULL)
+ break;
+ ++next_tag;
+ switch (*next_tag) {
+ case '/':{
+ ++next_tag;
+ if (num_open_tags == 0 || open_tags[num_open_tags - 1] != *next_tag) {
+ GST_LOG ("broken input, closing tag '%c' is not open", *next_tag);
+ g_memmove (next_tag - 2, next_tag + 2, strlen (next_tag + 2) + 1);
+ next_tag -= 2;
+ } else {
+ /* it's all good, closing tag which is open */
+ --num_open_tags;
+ }
+ break;
+ }
+ case 'i':
+ case 'b':
+ case 'u':
+ if (num_open_tags == G_N_ELEMENTS (open_tags))
+ return; /* something dodgy is going on, stop parsing */
+ open_tags[num_open_tags] = *next_tag;
+ ++num_open_tags;
+ break;
+ default:
+ GST_ERROR ("unexpected tag '%c' (%s)", *next_tag, next_tag);
+ g_assert_not_reached ();
+ break;
+ }
+ cur = next_tag;
+ }
+
+ if (num_open_tags > 0) {
+ GString *s;
+
+ s = g_string_new (*p_txt);
+ while (num_open_tags > 0) {
+ GST_LOG ("adding missing closing tag '%c'", open_tags[num_open_tags - 1]);
+ g_string_append_c (s, '<');
+ g_string_append_c (s, '/');
+ g_string_append_c (s, open_tags[num_open_tags - 1]);
+ g_string_append_c (s, '>');
+ --num_open_tags;
+ }
+ g_free (*p_txt);
+ *p_txt = g_string_free (s, FALSE);
+ }
+}
+
+static gboolean
+parse_subrip_time (const gchar * ts_string, GstClockTime * t)
+{
+ gchar s[128] = { '\0', };
+ gchar *end, *p;
+ guint hour, min, sec, msec, len;
+
+ while (*ts_string == ' ')
+ ++ts_string;
+
+ g_strlcpy (s, ts_string, sizeof (s));
+ if ((end = strstr (s, "-->")))
+ *end = '\0';
+ g_strchomp (s);
+
+ /* ms may be in these formats:
+ * hh:mm:ss,500 = 500ms
+ * hh:mm:ss, 5 = 5ms
+ * hh:mm:ss, 5 = 50ms
+ * hh:mm:ss, 50 = 50ms
+ * hh:mm:ss,5 = 500ms
+ * and the same with . instead of ,.
+ * sscanf() doesn't differentiate between ' 5' and '5' so munge
+ * the white spaces within the timestamp to '0' (I'm sure there's a
+ * way to make sscanf() do this for us, but how?)
+ */
+ g_strdelimit (s, " ", '0');
+ g_strdelimit (s, ".", ',');
+
+ /* make sure we have exactly three digits after he comma */
+ p = strchr (s, ',');
+ g_assert (p != NULL);
+ ++p;
+ len = strlen (p);
+ if (len > 3) {
+ p[3] = '\0';
+ } else
+ while (len < 3) {
+ g_strlcat (&p[len], "0", 2);
+ ++len;
+ }
+
+ GST_LOG ("parsing timestamp '%s'", s);
+ if (sscanf (s, "%u:%u:%u,%u", &hour, &min, &sec, &msec) != 4) {
+ GST_WARNING ("failed to parse subrip timestamp string '%s'", s);
+ return FALSE;
+ }
+
+ *t = ((hour * 3600) + (min * 60) + sec) * GST_SECOND + msec * GST_MSECOND;
+ return TRUE;
+}
+
+static gchar *
+parse_subrip (ParserState * state, const gchar * line)
+{
+ int subnum;
+ gchar *ret;
+
+ switch (state->state) {
+ case 0:
+ /* looking for a single integer */
+ if (sscanf (line, "%u", &subnum) == 1)
+ state->state = 1;
+ return NULL;
+ case 1:
+ {
+ GstClockTime ts_start, ts_end;
+ gchar *end_time;
+
+ /* looking for start_time --> end_time */
+ if ((end_time = strstr (line, " --> ")) &&
+ parse_subrip_time (line, &ts_start) &&
+ parse_subrip_time (end_time + strlen (" --> "), &ts_end) &&
+ state->start_time <= ts_end) {
+ state->state = 2;
+ state->start_time = ts_start;
+ state->duration = ts_end - ts_start;
+ } else {
+ GST_DEBUG ("error parsing subrip time line '%s'", line);
+ state->state = 0;
+ }
+ return NULL;
+ }
+ case 2:
+ {
+ /* No need to parse that text if it's out of segment */
+ guint64 clip_start = 0, clip_stop = 0;
+ gboolean in_seg = FALSE;
+
+ /* Check our segment start/stop */
+ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
+ state->start_time, state->start_time + state->duration,
+ &clip_start, &clip_stop);
+
+ if (in_seg) {
+ state->start_time = clip_start;
+ state->duration = clip_stop - clip_start;
+ } else {
+ state->state = 0;
+ return NULL;
+ }
+ }
+ /* looking for subtitle text; empty line ends this subtitle entry */
+ if (state->buf->len)
+ g_string_append_c (state->buf, '\n');
+ g_string_append (state->buf, line);
+ if (strlen (line) == 0) {
+ ret = g_markup_escape_text (state->buf->str, state->buf->len);
+ g_string_truncate (state->buf, 0);
+ state->state = 0;
+ subrip_unescape_formatting (ret);
+ subrip_remove_unhandled_tags (ret);
+ strip_trailing_newlines (ret);
+ subrip_fix_up_markup (&ret);
+ return ret;
+ }
+ return NULL;
+ default:
+ g_return_val_if_reached (NULL);
+ }
+}
+
+static void
+unescape_newlines_br (gchar * read)
+{
+ gchar *write = read;
+
+ /* Replace all occurences of '[br]' with a newline as version 2
+ * of the subviewer format uses this for newlines */
+
+ if (read[0] == '\0' || read[1] == '\0' || read[2] == '\0' || read[3] == '\0')
+ return;
+
+ do {
+ if (strncmp (read, "[br]", 4) == 0) {
+ *write = '\n';
+ read += 4;
+ } else {
+ *write = *read;
+ read++;
+ }
+ write++;
+ } while (*read);
+
+ *write = '\0';
+}
+
+static gchar *
+parse_subviewer (ParserState * state, const gchar * line)
+{
+ guint h1, m1, s1, ms1;
+ guint h2, m2, s2, ms2;
+ gchar *ret;
+
+ /* TODO: Maybe also parse the fields in the header, especially DELAY.
+ * For examples see the unit test or
+ * http://www.doom9.org/index.html?/sub.htm */
+
+ switch (state->state) {
+ case 0:
+ /* looking for start_time,end_time */
+ if (sscanf (line, "%u:%u:%u.%u,%u:%u:%u.%u",
+ &h1, &m1, &s1, &ms1, &h2, &m2, &s2, &ms2) == 8) {
+ state->state = 1;
+ state->start_time =
+ (((guint64) h1) * 3600 + m1 * 60 + s1) * GST_SECOND +
+ ms1 * GST_MSECOND;
+ state->duration =
+ (((guint64) h2) * 3600 + m2 * 60 + s2) * GST_SECOND +
+ ms2 * GST_MSECOND - state->start_time;
+ }
+ return NULL;
+ case 1:
+ {
+ /* No need to parse that text if it's out of segment */
+ guint64 clip_start = 0, clip_stop = 0;
+ gboolean in_seg = FALSE;
+
+ /* Check our segment start/stop */
+ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
+ state->start_time, state->start_time + state->duration,
+ &clip_start, &clip_stop);
+
+ if (in_seg) {
+ state->start_time = clip_start;
+ state->duration = clip_stop - clip_start;
+ } else {
+ state->state = 0;
+ return NULL;
+ }
+ }
+ /* looking for subtitle text; empty line ends this subtitle entry */
+ if (state->buf->len)
+ g_string_append_c (state->buf, '\n');
+ g_string_append (state->buf, line);
+ if (strlen (line) == 0) {
+ ret = g_strdup (state->buf->str);
+ unescape_newlines_br (ret);
+ strip_trailing_newlines (ret);
+ g_string_truncate (state->buf, 0);
+ state->state = 0;
+ return ret;
+ }
+ return NULL;
+ default:
+ g_assert_not_reached ();
+ return NULL;
+ }
+}
+
+static gchar *
+parse_mpsub (ParserState * state, const gchar * line)
+{
+ gchar *ret;
+ float t1, t2;
+
+ switch (state->state) {
+ case 0:
+ /* looking for two floats (offset, duration) */
+ if (sscanf (line, "%f %f", &t1, &t2) == 2) {
+ state->state = 1;
+ state->start_time += state->duration + GST_SECOND * t1;
+ state->duration = GST_SECOND * t2;
+ }
+ return NULL;
+ case 1:
+ { /* No need to parse that text if it's out of segment */
+ guint64 clip_start = 0, clip_stop = 0;
+ gboolean in_seg = FALSE;
+
+ /* Check our segment start/stop */
+ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
+ state->start_time, state->start_time + state->duration,
+ &clip_start, &clip_stop);
+
+ if (in_seg) {
+ state->start_time = clip_start;
+ state->duration = clip_stop - clip_start;
+ } else {
+ state->state = 0;
+ return NULL;
+ }
+ }
+ /* looking for subtitle text; empty line ends this
+ * subtitle entry */
+ if (state->buf->len)
+ g_string_append_c (state->buf, '\n');
+ g_string_append (state->buf, line);
+ if (strlen (line) == 0) {
+ ret = g_strdup (state->buf->str);
+ g_string_truncate (state->buf, 0);
+ state->state = 0;
+ return ret;
+ }
+ return NULL;
+ default:
+ g_assert_not_reached ();
+ return NULL;
+ }
+}
+
+static const gchar *
+dks_skip_timestamp (const gchar * line)
+{
+ while (*line && *line != ']')
+ line++;
+ if (*line == ']')
+ line++;
+ return line;
+}
+
+static gchar *
+parse_dks (ParserState * state, const gchar * line)
+{
+ guint h, m, s;
+
+ switch (state->state) {
+ case 0:
+ /* Looking for the start time and text */
+ if (sscanf (line, "[%u:%u:%u]", &h, &m, &s) == 3) {
+ const gchar *text;
+ state->start_time = (((guint64) h) * 3600 + m * 60 + s) * GST_SECOND;
+ text = dks_skip_timestamp (line);
+ if (*text) {
+ state->state = 1;
+ g_string_append (state->buf, text);
+ }
+ }
+ return NULL;
+ case 1:
+ {
+ guint64 clip_start = 0, clip_stop = 0;
+ gboolean in_seg;
+ gchar *ret;
+
+ /* Looking for the end time */
+ if (sscanf (line, "[%u:%u:%u]", &h, &m, &s) == 3) {
+ state->state = 0;
+ state->duration = (((guint64) h) * 3600 + m * 60 + s) * GST_SECOND -
+ state->start_time;
+ } else {
+ GST_WARNING ("Failed to parse subtitle end time");
+ return NULL;
+ }
+
+ /* Check if this subtitle is out of the current segment */
+ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME,
+ state->start_time, state->start_time + state->duration,
+ &clip_start, &clip_stop);
+
+ if (!in_seg) {
+ return NULL;
+ }
+
+ state->start_time = clip_start;
+ state->duration = clip_stop - clip_start;
+
+ ret = g_strdup (state->buf->str);
+ g_string_truncate (state->buf, 0);
+ unescape_newlines_br (ret);
+ return ret;
+ }
+ default:
+ g_assert_not_reached ();
+ return NULL;
+ }
+}
+
+static void
+parser_state_init (ParserState * state)
+{
+ GST_DEBUG ("initialising parser");
+
+ if (state->buf) {
+ g_string_truncate (state->buf, 0);
+ } else {
+ state->buf = g_string_new (NULL);
+ }
+
+ state->start_time = 0;
+ state->duration = 0;
+ state->max_duration = 0; /* no limit */
+ state->state = 0;
+ state->segment = NULL;
+}
+
+static void
+parser_state_dispose (GstSubParse * self, ParserState * state)
+{
+ if (state->buf) {
+ g_string_free (state->buf, TRUE);
+ state->buf = NULL;
+ }
+ if (state->user_data) {
+ switch (self->parser_type) {
+#ifndef GST_DISABLE_XML
+ case GST_SUB_PARSE_FORMAT_SAMI:
+ sami_context_reset (state);
+ break;
+#endif
+ default:
+ break;
+ }
+ }
+}
+
+/* regex type enum */
+typedef enum
+{
+ GST_SUB_PARSE_REGEX_UNKNOWN = 0,
+ GST_SUB_PARSE_REGEX_MDVDSUB = 1,
+ GST_SUB_PARSE_REGEX_SUBRIP = 2,
+ GST_SUB_PARSE_REGEX_DKS = 3,
+} GstSubParseRegex;
+
+static gpointer
+gst_sub_parse_data_format_autodetect_regex_once (GstSubParseRegex regtype)
+{
+ gpointer result = NULL;
+ GError *gerr = NULL;
+ switch (regtype) {
+ case GST_SUB_PARSE_REGEX_MDVDSUB:
+ result =
+ (gpointer) g_regex_new ("^\\{[0-9]+\\}\\{[0-9]+\\}",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, &gerr);
+ if (result == NULL) {
+ g_warning ("Compilation of mdvd regex failed: %s", gerr->message);
+ g_error_free (gerr);
+ }
+ break;
+ case GST_SUB_PARSE_REGEX_SUBRIP:
+ result = (gpointer) g_regex_new ("^ {0,3}[ 0-9]{1,4}\\s*(\x0d)?\x0a"
+ " ?[0-9]{1,2}: ?[0-9]{1,2}: ?[0-9]{1,2}[,.] {0,2}[0-9]{1,3}"
+ " +--> +[0-9]{1,2}: ?[0-9]{1,2}: ?[0-9]{1,2}[,.] {0,2}[0-9]{1,2}",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, &gerr);
+ if (result == NULL) {
+ g_warning ("Compilation of subrip regex failed: %s", gerr->message);
+ g_error_free (gerr);
+ }
+ break;
+ case GST_SUB_PARSE_REGEX_DKS:
+ result = (gpointer) g_regex_new ("^\\[[0-9]+:[0-9]+:[0-9]+\\].*",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, &gerr);
+ if (result == NULL) {
+ g_warning ("Compilation of dks regex failed: %s", gerr->message);
+ g_error_free (gerr);
+ }
+ break;
+ default:
+ GST_WARNING ("Trying to allocate regex of unknown type %u", regtype);
+ }
+ return result;
+}
+
+/*
+ * FIXME: maybe we should pass along a second argument, the preceding
+ * text buffer, because that is how this originally worked, even though
+ * I don't really see the use of that.
+ */
+
+static GstSubParseFormat
+gst_sub_parse_data_format_autodetect (gchar * match_str)
+{
+ guint n1, n2, n3;
+
+ static GOnce mdvd_rx_once = G_ONCE_INIT;
+ static GOnce subrip_rx_once = G_ONCE_INIT;
+ static GOnce dks_rx_once = G_ONCE_INIT;
+
+ GRegex *mdvd_grx;
+ GRegex *subrip_grx;
+ GRegex *dks_grx;
+
+ g_once (&mdvd_rx_once,
+ (GThreadFunc) gst_sub_parse_data_format_autodetect_regex_once,
+ (gpointer) GST_SUB_PARSE_REGEX_MDVDSUB);
+ g_once (&subrip_rx_once,
+ (GThreadFunc) gst_sub_parse_data_format_autodetect_regex_once,
+ (gpointer) GST_SUB_PARSE_REGEX_SUBRIP);
+ g_once (&dks_rx_once,
+ (GThreadFunc) gst_sub_parse_data_format_autodetect_regex_once,
+ (gpointer) GST_SUB_PARSE_REGEX_DKS);
+
+ mdvd_grx = (GRegex *) mdvd_rx_once.retval;
+ subrip_grx = (GRegex *) subrip_rx_once.retval;
+ dks_grx = (GRegex *) dks_rx_once.retval;
+
+ if (g_regex_match (mdvd_grx, match_str, 0, NULL) == TRUE) {
+ GST_LOG ("MicroDVD (frame based) format detected");
+ return GST_SUB_PARSE_FORMAT_MDVDSUB;
+ }
+ if (g_regex_match (subrip_grx, match_str, 0, NULL) == TRUE) {
+ GST_LOG ("SubRip (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_SUBRIP;
+ }
+ if (g_regex_match (dks_grx, match_str, 0, NULL) == TRUE) {
+ GST_LOG ("DKS (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_DKS;
+ }
+
+ if (!strncmp (match_str, "FORMAT=TIME", 11)) {
+ GST_LOG ("MPSub (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_MPSUB;
+ }
+#ifndef GST_DISABLE_XML
+ if (strstr (match_str, "<SAMI>") != NULL ||
+ strstr (match_str, "<sami>") != NULL) {
+ GST_LOG ("SAMI (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_SAMI;
+ }
+#endif
+ /* we're boldly assuming the first subtitle appears within the first hour */
+ if (sscanf (match_str, "0:%02u:%02u:", &n1, &n2) == 2 ||
+ sscanf (match_str, "0:%02u:%02u=", &n1, &n2) == 2 ||
+ sscanf (match_str, "00:%02u:%02u:", &n1, &n2) == 2 ||
+ sscanf (match_str, "00:%02u:%02u=", &n1, &n2) == 2 ||
+ sscanf (match_str, "00:%02u:%02u,%u=", &n1, &n2, &n3) == 3) {
+ GST_LOG ("TMPlayer (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_TMPLAYER;
+ }
+ if (sscanf (match_str, "[%u][%u]", &n1, &n2) == 2) {
+ GST_LOG ("MPL2 (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_MPL2;
+ }
+ if (strstr (match_str, "[INFORMATION]") != NULL) {
+ GST_LOG ("SubViewer (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_SUBVIEWER;
+ }
+ if (strstr (match_str, "{QTtext}") != NULL) {
+ GST_LOG ("QTtext (time based) format detected");
+ return GST_SUB_PARSE_FORMAT_QTTEXT;
+ }
+
+ GST_DEBUG ("no subtitle format detected");
+ return GST_SUB_PARSE_FORMAT_UNKNOWN;
+}
+
+static GstCaps *
+gst_sub_parse_format_autodetect (GstSubParse * self)
+{
+ gchar *data;
+ GstSubParseFormat format;
+
+ if (strlen (self->textbuf->str) < 30) {
+ GST_DEBUG ("File too small to be a subtitles file");
+ return NULL;
+ }
+
+ data = g_strndup (self->textbuf->str, 35);
+ format = gst_sub_parse_data_format_autodetect (data);
+ g_free (data);
+
+ self->parser_type = format;
+ self->subtitle_codec = gst_sub_parse_get_format_description (format);
+ parser_state_init (&self->state);
+
+ switch (format) {
+ case GST_SUB_PARSE_FORMAT_MDVDSUB:
+ self->parse_line = parse_mdvdsub;
+ return gst_caps_new_simple ("text/x-pango-markup", NULL);
+ case GST_SUB_PARSE_FORMAT_SUBRIP:
+ self->parse_line = parse_subrip;
+ return gst_caps_new_simple ("text/x-pango-markup", NULL);
+ case GST_SUB_PARSE_FORMAT_MPSUB:
+ self->parse_line = parse_mpsub;
+ return gst_caps_new_simple ("text/plain", NULL);
+#ifndef GST_DISABLE_XML
+ case GST_SUB_PARSE_FORMAT_SAMI:
+ self->parse_line = parse_sami;
+ sami_context_init (&self->state);
+ return gst_caps_new_simple ("text/x-pango-markup", NULL);
+#endif
+ case GST_SUB_PARSE_FORMAT_TMPLAYER:
+ self->parse_line = parse_tmplayer;
+ self->state.max_duration = 5 * GST_SECOND;
+ return gst_caps_new_simple ("text/plain", NULL);
+ case GST_SUB_PARSE_FORMAT_MPL2:
+ self->parse_line = parse_mpl2;
+ return gst_caps_new_simple ("text/x-pango-markup", NULL);
+ case GST_SUB_PARSE_FORMAT_DKS:
+ self->parse_line = parse_dks;
+ return gst_caps_new_simple ("text/plain", NULL);
+ case GST_SUB_PARSE_FORMAT_SUBVIEWER:
+ self->parse_line = parse_subviewer;
+ return gst_caps_new_simple ("text/plain", NULL);
+ case GST_SUB_PARSE_FORMAT_QTTEXT:
+ self->parse_line = parse_qttext;
+ qttext_context_init (&self->state);
+ return gst_caps_new_simple ("text/x-pango-markup", NULL);
+ case GST_SUB_PARSE_FORMAT_UNKNOWN:
+ default:
+ GST_DEBUG ("no subtitle format detected");
+ GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE,
+ ("The input is not a valid/supported subtitle file"), (NULL));
+ return NULL;
+ }
+}
+
+static void
+feed_textbuf (GstSubParse * self, GstBuffer * buf)
+{
+ gboolean discont;
+ gsize consumed;
+ gchar *input = NULL;
+ const guint8 *data;
+ gsize avail;
+
+ discont = GST_BUFFER_IS_DISCONT (buf);
+
+ if (GST_BUFFER_OFFSET_IS_VALID (buf) &&
+ GST_BUFFER_OFFSET (buf) != self->offset) {
+ self->offset = GST_BUFFER_OFFSET (buf);
+ discont = TRUE;
+ }
+
+ if (discont) {
+ GST_INFO ("discontinuity");
+ /* flush the parser state */
+ parser_state_init (&self->state);
+ g_string_truncate (self->textbuf, 0);
+ gst_adapter_clear (self->adapter);
+#ifndef GST_DISABLE_XML
+ if (self->parser_type == GST_SUB_PARSE_FORMAT_SAMI)
+ sami_context_reset (&self->state);
+#endif
+ /* we could set a flag to make sure that the next buffer we push out also
+ * has the DISCONT flag set, but there's no point really given that it's
+ * subtitles which are discontinuous by nature. */
+ }
+
+ self->offset = GST_BUFFER_OFFSET (buf) + gst_buffer_get_size (buf);
+ self->next_offset = self->offset;
+
+ gst_adapter_push (self->adapter, buf);
+
+ avail = gst_adapter_available (self->adapter);
+ data = gst_adapter_map (self->adapter, avail);
+ input = convert_encoding (self, (const gchar *) data, avail, &consumed);
+
+ if (input && consumed > 0) {
+ self->textbuf = g_string_append (self->textbuf, input);
+ gst_adapter_unmap (self->adapter, consumed);
+ } else {
+ gst_adapter_unmap (self->adapter, 0);
+ }
+
+ g_free (input);
+}
+
+static GstFlowReturn
+handle_buffer (GstSubParse * self, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstCaps *caps = NULL;
+ gchar *line, *subtitle, *data;
+ gsize size;
+
+ if (self->first_buffer) {
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ self->detected_encoding = detect_encoding (data, size);
+ gst_buffer_unmap (buf, data, size);
+ self->first_buffer = FALSE;
+ self->state.fps_n = self->fps_n;
+ self->state.fps_d = self->fps_d;
+ }
+
+ feed_textbuf (self, buf);
+
+ /* make sure we know the format */
+ if (G_UNLIKELY (self->parser_type == GST_SUB_PARSE_FORMAT_UNKNOWN)) {
+ if (!(caps = gst_sub_parse_format_autodetect (self))) {
+ return GST_FLOW_UNEXPECTED;
+ }
+ if (!gst_pad_set_caps (self->srcpad, caps)) {
+ gst_caps_unref (caps);
+ return GST_FLOW_UNEXPECTED;
+ }
+ gst_caps_unref (caps);
+
+ /* push tags */
+ if (self->subtitle_codec != NULL) {
+ GstTagList *tags;
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_SUBTITLE_CODEC,
+ self->subtitle_codec, NULL);
+ gst_element_found_tags_for_pad (GST_ELEMENT (self), self->srcpad, tags);
+ }
+ }
+
+ while (!self->flushing && (line = get_next_line (self))) {
+ guint offset = 0;
+
+ /* Set segment on our parser state machine */
+ self->state.segment = &self->segment;
+ /* Now parse the line, out of segment lines will just return NULL */
+ GST_LOG_OBJECT (self, "Parsing line '%s'", line + offset);
+ subtitle = self->parse_line (&self->state, line + offset);
+ g_free (line);
+
+ if (subtitle) {
+ guint subtitle_len = strlen (subtitle);
+
+ /* +1 for terminating NUL character */
+ buf = gst_buffer_new_and_alloc (subtitle_len + 1);
+
+ /* copy terminating NUL character as well */
+ gst_buffer_fill (buf, 0, subtitle, subtitle_len + 1);
+ gst_buffer_set_size (buf, subtitle_len);
+
+ GST_BUFFER_TIMESTAMP (buf) = self->state.start_time;
+ GST_BUFFER_DURATION (buf) = self->state.duration;
+
+ /* in some cases (e.g. tmplayer) we can only determine the duration
+ * of a text chunk from the timestamp of the next text chunk; in those
+ * cases, we probably want to limit the duration to something
+ * reasonable, so we don't end up showing some text for e.g. 40 seconds
+ * just because nothing else is being said during that time */
+ if (self->state.max_duration > 0 && GST_BUFFER_DURATION_IS_VALID (buf)) {
+ if (GST_BUFFER_DURATION (buf) > self->state.max_duration)
+ GST_BUFFER_DURATION (buf) = self->state.max_duration;
+ }
+
+ self->segment.position = self->state.start_time;
+
+ GST_DEBUG_OBJECT (self, "Sending text '%s', %" GST_TIME_FORMAT " + %"
+ GST_TIME_FORMAT, subtitle, GST_TIME_ARGS (self->state.start_time),
+ GST_TIME_ARGS (self->state.duration));
+
+ ret = gst_pad_push (self->srcpad, buf);
+
+ /* move this forward (the tmplayer parser needs this) */
+ if (self->state.duration != GST_CLOCK_TIME_NONE)
+ self->state.start_time += self->state.duration;
+
+ g_free (subtitle);
+ subtitle = NULL;
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (self, "flow: %s", gst_flow_get_name (ret));
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_sub_parse_chain (GstPad * sinkpad, GstBuffer * buf)
+{
+ GstFlowReturn ret;
+ GstSubParse *self;
+
+ self = GST_SUBPARSE (GST_PAD_PARENT (sinkpad));
+
+ /* Push newsegment if needed */
+ if (self->need_segment) {
+ GST_LOG_OBJECT (self, "pushing newsegment event with %" GST_SEGMENT_FORMAT,
+ &self->segment);
+
+ gst_pad_push_event (self->srcpad, gst_event_new_segment (&self->segment));
+ self->need_segment = FALSE;
+ }
+
+ ret = handle_buffer (self, buf);
+
+ return ret;
+}
+
+static gboolean
+gst_sub_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstSubParse *self = GST_SUBPARSE (gst_pad_get_parent (pad));
+ gboolean ret = FALSE;
+
+ GST_DEBUG ("Handling %s event", GST_EVENT_TYPE_NAME (event));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:{
+ /* Make sure the last subrip chunk is pushed out even
+ * if the file does not have an empty line at the end */
+ if (self->parser_type == GST_SUB_PARSE_FORMAT_SUBRIP ||
+ self->parser_type == GST_SUB_PARSE_FORMAT_TMPLAYER ||
+ self->parser_type == GST_SUB_PARSE_FORMAT_MPL2 ||
+ self->parser_type == GST_SUB_PARSE_FORMAT_QTTEXT) {
+ gchar term_chars[] = { '\n', '\n', '\0' };
+ GstBuffer *buf = gst_buffer_new_and_alloc (2 + 1);
+
+ GST_DEBUG ("EOS. Pushing remaining text (if any)");
+ gst_buffer_fill (buf, 0, term_chars, 3);
+ gst_buffer_set_size (buf, 2);
+
+ GST_BUFFER_OFFSET (buf) = self->offset;
+ gst_sub_parse_chain (pad, buf);
+ }
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &self->segment);
+ GST_DEBUG_OBJECT (self, "newsegment (%s)",
+ gst_format_get_name (self->segment.format));
+
+ /* if not time format, we'll either start with a 0 timestamp anyway or
+ * it's following a seek in which case we'll have saved the requested
+ * seek segment and don't want to overwrite it (remember that on a seek
+ * we always just seek back to the start in BYTES format and just throw
+ * away all text that's before the requested position; if the subtitles
+ * come from an upstream demuxer, it won't be able to handle our BYTES
+ * seek request and instead send us a newsegment from the seek request
+ * it received via its video pads instead, so all is fine then too) */
+ ret = TRUE;
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_FLUSH_START:
+ {
+ self->flushing = TRUE;
+
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ {
+ self->flushing = FALSE;
+
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ gst_object_unref (self);
+
+ return ret;
+}
+
+
+static GstStateChangeReturn
+gst_sub_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstSubParse *self = GST_SUBPARSE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ /* format detection will init the parser state */
+ self->offset = 0;
+ self->next_offset = 0;
+ self->parser_type = GST_SUB_PARSE_FORMAT_UNKNOWN;
+ self->valid_utf8 = TRUE;
+ self->first_buffer = TRUE;
+ g_free (self->detected_encoding);
+ self->detected_encoding = NULL;
+ g_string_truncate (self->textbuf, 0);
+ gst_adapter_clear (self->adapter);
+ 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:
+ parser_state_dispose (self, &self->state);
+ self->parser_type = GST_SUB_PARSE_FORMAT_UNKNOWN;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+/*
+ * Typefind support.
+ */
+
+/* FIXME 0.11: these caps are ugly, use app/x-subtitle + type field or so;
+ * also, give different subtitle formats really different types */
+static GstStaticCaps mpl2_caps =
+GST_STATIC_CAPS ("application/x-subtitle-mpl2");
+#define SUB_CAPS (gst_static_caps_get (&sub_caps))
+
+static GstStaticCaps tmp_caps =
+GST_STATIC_CAPS ("application/x-subtitle-tmplayer");
+#define TMP_CAPS (gst_static_caps_get (&tmp_caps))
+
+static GstStaticCaps sub_caps = GST_STATIC_CAPS ("application/x-subtitle");
+#define MPL2_CAPS (gst_static_caps_get (&mpl2_caps))
+
+#ifndef GST_DISABLE_XML
+static GstStaticCaps smi_caps = GST_STATIC_CAPS ("application/x-subtitle-sami");
+#define SAMI_CAPS (gst_static_caps_get (&smi_caps))
+#endif
+
+static GstStaticCaps dks_caps = GST_STATIC_CAPS ("application/x-subtitle-dks");
+#define DKS_CAPS (gst_static_caps_get (&dks_caps))
+
+static GstStaticCaps qttext_caps =
+GST_STATIC_CAPS ("application/x-subtitle-qttext");
+#define QTTEXT_CAPS (gst_static_caps_get (&qttext_caps))
+
+static void
+gst_subparse_type_find (GstTypeFind * tf, gpointer private)
+{
+ GstSubParseFormat format;
+ const guint8 *data;
+ GstCaps *caps;
+ gchar *str;
+ gchar *encoding = NULL;
+ const gchar *end;
+
+ if (!(data = gst_type_find_peek (tf, 0, 129)))
+ return;
+
+ /* make sure string passed to _autodetect() is NUL-terminated */
+ str = g_malloc0 (129);
+ memcpy (str, data, 128);
+
+ if ((encoding = detect_encoding (str, 128)) != NULL) {
+ gchar *converted_str;
+ GError *err = NULL;
+ gsize tmp;
+
+ converted_str = gst_convert_to_utf8 (str, 128, encoding, &tmp, &err);
+ if (converted_str == NULL) {
+ GST_DEBUG ("Encoding '%s' detected but conversion failed: %s", encoding,
+ err->message);
+ g_error_free (err);
+ g_free (encoding);
+ } else {
+ g_free (str);
+ str = converted_str;
+ g_free (encoding);
+ }
+ }
+
+ /* Check if at least the first 120 chars are valid UTF8,
+ * otherwise convert as always */
+ if (!g_utf8_validate (str, 128, &end) && (end - str) < 120) {
+ gchar *converted_str;
+ GError *err = NULL;
+ gsize tmp;
+ const gchar *enc;
+
+ enc = g_getenv ("GST_SUBTITLE_ENCODING");
+ if (enc == NULL || *enc == '\0') {
+ /* if local encoding is UTF-8 and no encoding specified
+ * via the environment variable, assume ISO-8859-15 */
+ if (g_get_charset (&enc)) {
+ enc = "ISO-8859-15";
+ }
+ }
+ converted_str = gst_convert_to_utf8 (str, 128, enc, &tmp, &err);
+ if (converted_str != NULL) {
+ g_free (str);
+ str = converted_str;
+ }
+ }
+
+ format = gst_sub_parse_data_format_autodetect (str);
+ g_free (str);
+
+ switch (format) {
+ case GST_SUB_PARSE_FORMAT_MDVDSUB:
+ GST_DEBUG ("MicroDVD format detected");
+ caps = SUB_CAPS;
+ break;
+ case GST_SUB_PARSE_FORMAT_SUBRIP:
+ GST_DEBUG ("SubRip format detected");
+ caps = SUB_CAPS;
+ break;
+ case GST_SUB_PARSE_FORMAT_MPSUB:
+ GST_DEBUG ("MPSub format detected");
+ caps = SUB_CAPS;
+ break;
+#ifndef GST_DISABLE_XML
+ case GST_SUB_PARSE_FORMAT_SAMI:
+ GST_DEBUG ("SAMI (time-based) format detected");
+ caps = SAMI_CAPS;
+ break;
+#endif
+ case GST_SUB_PARSE_FORMAT_TMPLAYER:
+ GST_DEBUG ("TMPlayer (time based) format detected");
+ caps = TMP_CAPS;
+ break;
+ /* FIXME: our MPL2 typefinding is not really good enough to warrant
+ * returning a high probability (however, since we registered our
+ * typefinder here with a rank of MARGINAL we should pretty much only
+ * be called if most other typefinders have already run */
+ case GST_SUB_PARSE_FORMAT_MPL2:
+ GST_DEBUG ("MPL2 (time based) format detected");
+ caps = MPL2_CAPS;
+ break;
+ case GST_SUB_PARSE_FORMAT_SUBVIEWER:
+ GST_DEBUG ("SubViewer format detected");
+ caps = SUB_CAPS;
+ break;
+ case GST_SUB_PARSE_FORMAT_DKS:
+ GST_DEBUG ("DKS format detected");
+ caps = DKS_CAPS;
+ break;
+ case GST_SUB_PARSE_FORMAT_QTTEXT:
+ GST_DEBUG ("QTtext format detected");
+ caps = QTTEXT_CAPS;
+ break;
+ default:
+ case GST_SUB_PARSE_FORMAT_UNKNOWN:
+ GST_DEBUG ("no subtitle format detected");
+ return;
+ }
+
+ /* if we're here, it's ok */
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, caps);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ static const gchar *sub_exts[] =
+ { "srt", "sub", "mpsub", "mdvd", "smi", "txt", "dks", NULL };
+
+ GST_DEBUG_CATEGORY_INIT (sub_parse_debug, "subparse", 0, ".sub parser");
+
+ if (!gst_type_find_register (plugin, "subparse_typefind", GST_RANK_MARGINAL,
+ gst_subparse_type_find, (gchar **) sub_exts, SUB_CAPS, NULL, NULL))
+ return FALSE;
+
+ if (!gst_element_register (plugin, "subparse",
+ GST_RANK_PRIMARY, GST_TYPE_SUBPARSE) ||
+ !gst_element_register (plugin, "ssaparse",
+ GST_RANK_PRIMARY, GST_TYPE_SSA_PARSE)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "subparse",
+ "Subtitle parsing",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/subparse/gstsubparse.h b/gst/subparse/gstsubparse.h
new file mode 100644
index 0000000..93c1968
--- /dev/null
+++ b/gst/subparse/gstsubparse.h
@@ -0,0 +1,119 @@
+/* GStreamer
+ * Copyright (C) <2002> David A. Schleef <ds@schleef.org>
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_SUBPARSE_H__
+#define __GST_SUBPARSE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+
+GST_DEBUG_CATEGORY_EXTERN (sub_parse_debug);
+#define GST_CAT_DEFAULT sub_parse_debug
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SUBPARSE \
+ (gst_sub_parse_get_type ())
+#define GST_SUBPARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SUBPARSE, GstSubParse))
+#define GST_SUBPARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SUBPARSE, GstSubParseClass))
+#define GST_IS_SUBPARSE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SUBPARSE))
+#define GST_IS_SUBPARSE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SUBPARSE))
+
+typedef struct _GstSubParse GstSubParse;
+typedef struct _GstSubParseClass GstSubParseClass;
+
+/* format enum */
+typedef enum
+{
+ GST_SUB_PARSE_FORMAT_UNKNOWN = 0,
+ GST_SUB_PARSE_FORMAT_MDVDSUB = 1,
+ GST_SUB_PARSE_FORMAT_SUBRIP = 2,
+ GST_SUB_PARSE_FORMAT_MPSUB = 3,
+ GST_SUB_PARSE_FORMAT_SAMI = 4,
+ GST_SUB_PARSE_FORMAT_TMPLAYER = 5,
+ GST_SUB_PARSE_FORMAT_MPL2 = 6,
+ GST_SUB_PARSE_FORMAT_SUBVIEWER = 7,
+ GST_SUB_PARSE_FORMAT_DKS = 8,
+ GST_SUB_PARSE_FORMAT_QTTEXT = 9
+} GstSubParseFormat;
+
+typedef struct {
+ int state;
+ GString *buf;
+ guint64 start_time;
+ guint64 duration;
+ guint64 max_duration; /* to clamp duration, 0 = no limit (used by tmplayer parser) */
+ GstSegment *segment;
+ gpointer user_data;
+ gboolean have_internal_fps; /* If TRUE don't overwrite fps by property */
+ gint fps_n, fps_d; /* used by frame based parsers */
+} ParserState;
+
+typedef gchar* (*Parser) (ParserState *state, const gchar *line);
+
+struct _GstSubParse {
+ GstElement element;
+
+ GstPad *sinkpad,*srcpad;
+
+ /* contains the input in the input encoding */
+ GstAdapter *adapter;
+ /* contains the UTF-8 decoded input */
+ GString *textbuf;
+
+ GstSubParseFormat parser_type;
+ gboolean parser_detected;
+ const gchar *subtitle_codec;
+
+ Parser parse_line;
+ ParserState state;
+
+ /* seek */
+ guint64 offset;
+ guint64 next_offset;
+
+ /* Segment */
+ GstSegment segment;
+ gboolean need_segment;
+
+ gboolean flushing;
+ gboolean valid_utf8;
+ gchar *detected_encoding;
+ gchar *encoding;
+
+ gboolean first_buffer;
+
+ /* used by frame based parsers */
+ gint fps_n, fps_d;
+};
+
+struct _GstSubParseClass {
+ GstElementClass parent_class;
+};
+
+GType gst_sub_parse_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_SUBPARSE_H__ */
diff --git a/gst/subparse/mpl2parse.c b/gst/subparse/mpl2parse.c
new file mode 100644
index 0000000..b043064
--- /dev/null
+++ b/gst/subparse/mpl2parse.c
@@ -0,0 +1,107 @@
+/* GStreamer mpl2 format subtitle parser
+ * Copyright (C) 2006 Kamil Pawlowski <kamilpe 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 "mpl2parse.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/* From http://lists.mplayerhq.hu/pipermail/mplayer-users/2003-February/030222.html
+ *
+ * [123][456] Sample subtitle
+ * [1234][5678] Line 1|Line 2
+ * [12345][67890] /Italic|Normal
+ * [12345][67890] /Italic|/Italic
+ * [12345][67890] Normal|/Italic
+ *
+ * (The space between the last ']' bracket and the text appears to be optional)
+ */
+
+static gchar *
+mpl2_parse_line (ParserState * state, const gchar * line, guint line_num)
+{
+ GString *markup;
+ gint dc_start, dc_stop;
+
+ /* parse subtitle file line */
+ if (sscanf (line, "[%u][%u]", &dc_start, &dc_stop) != 2) {
+ GST_WARNING ("failed to extract timestamps for line '%s'", line);
+ return NULL;
+ }
+
+ GST_LOG ("line format %u %u", dc_start, dc_stop);
+ state->start_time = GST_SECOND / 10 * dc_start;
+ state->duration = (GST_SECOND / 10 * dc_stop) - state->start_time;
+
+ /* skip brackets with timestamps */
+ line = strchr (line, ']') + 1;
+ line = strchr (line, ']') + 1;
+
+ markup = g_string_new (NULL);
+
+ while (1) {
+ const gchar *sep;
+ gchar *line_chunk_escaped;
+ gboolean italics;
+
+ /* skip leading white spaces */
+ while (*line == ' ' || *line == '\t')
+ ++line;
+
+ /* a '/' at the beginning indicates italics */
+ if (*line == '/') {
+ italics = TRUE;
+ g_string_append (markup, "<i>");
+ ++line;
+ } else {
+ italics = FALSE;
+ }
+
+ if ((sep = strchr (line, '|')))
+ line_chunk_escaped = g_markup_escape_text (line, sep - line);
+ else
+ line_chunk_escaped = g_markup_escape_text (line, -1);
+
+ GST_LOG ("escaped line: %s", line_chunk_escaped);
+ g_string_append (markup, line_chunk_escaped);
+
+ g_free (line_chunk_escaped);
+
+ if (italics)
+ g_string_append (markup, "</i>");
+ if (sep == NULL)
+ break;
+
+ /* move after the '|' and append another line */
+ g_string_append (markup, "\n");
+ line = sep + 1;
+ }
+
+ return g_strstrip (g_string_free (markup, FALSE));
+}
+
+gchar *
+parse_mpl2 (ParserState * state, const gchar * line)
+{
+ gchar *ret;
+
+ ret = mpl2_parse_line (state, line, state->state);
+ ++state->state;
+ return ret;
+}
diff --git a/gst/subparse/mpl2parse.h b/gst/subparse/mpl2parse.h
new file mode 100644
index 0000000..aed62c0
--- /dev/null
+++ b/gst/subparse/mpl2parse.h
@@ -0,0 +1,32 @@
+/* GStreamer mpl2 format subtitle parser
+ * Copyright (C) 2006 Kamil Pawlowski <kamilpe 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 _MPL2_PARSE_H_
+#define _MPL2_PARSE_H_
+
+#include "gstsubparse.h"
+
+G_BEGIN_DECLS
+
+gchar * parse_mpl2 (ParserState * state, const gchar * line);
+
+G_END_DECLS
+
+#endif /* _MPL2_PARSE_H_ */
+
diff --git a/gst/subparse/qttextparse.c b/gst/subparse/qttextparse.c
new file mode 100644
index 0000000..b48daf9
--- /dev/null
+++ b/gst/subparse/qttextparse.c
@@ -0,0 +1,453 @@
+/* GStreamer QTtext subtitle parser
+ * Copyright (c) 2009 Thiago Santos <thiago.sousa.santos 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.
+ */
+
+/* References:
+ * http://www.apple.com/quicktime/tutorials/texttracks.html
+ * http://www.apple.com/quicktime/tutorials/textdescriptors.html
+ */
+
+#include "qttextparse.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define MIN_TO_NSEC (60 * GST_SECOND)
+#define HOUR_TO_NSEC (60 * MIN_TO_NSEC)
+
+#define GST_QTTEXT_CONTEXT(state) ((GstQTTextContext *) (state)->user_data)
+
+typedef struct _GstQTTextContext GstQTTextContext;
+
+struct _GstQTTextContext
+{
+ /* timing variables */
+ gint timescale;
+ gboolean absolute;
+ guint64 start_time;
+
+ gboolean markup_open;
+ gboolean need_markup;
+
+ gchar *font;
+ gint font_size;
+ gchar *bg_color;
+ gchar *fg_color;
+
+ gboolean bold;
+ gboolean italic;
+};
+
+void
+qttext_context_init (ParserState * state)
+{
+ GstQTTextContext *context;
+
+ state->user_data = g_new0 (GstQTTextContext, 1);
+
+ context = GST_QTTEXT_CONTEXT (state);
+
+ /* we use 1000 as a default */
+ context->timescale = 1000;
+ context->absolute = TRUE;
+
+ context->markup_open = FALSE;
+ context->need_markup = FALSE;
+
+ context->font_size = 12;
+}
+
+void
+qttext_context_deinit (ParserState * state)
+{
+ if (state->user_data != NULL) {
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+ g_free (context->font);
+ g_free (context->bg_color);
+ g_free (context->fg_color);
+
+ g_free (state->user_data);
+ state->user_data = NULL;
+ }
+}
+
+/*
+ * Reads the string right after the ':'
+ */
+static gchar *
+read_str (const gchar * line, const gchar * end)
+{
+ gint index = 0;
+
+ while (line[index] != ':' && line[index] != '}') {
+ index++;
+ }
+ if (line[index] != ':')
+ return NULL;
+ index++;
+ while (line[index] == ' ')
+ index++;
+
+ return g_strndup (line + index, (end - (line + index)));
+}
+
+/* search for the ':' and parse the number right after it */
+static gint
+read_int (const gchar * line)
+{
+ gint index = 0;
+ while (line[index] != ':' && line[index] != '}') {
+ index++;
+ }
+ if (line[index] != ':')
+ return 0;
+ index++;
+ return atoi (line + index);
+}
+
+/* skip the ':' and then match the following string
+ * with 'match', but only if it before 'upto' */
+static gboolean
+string_match (const gchar * line, const gchar * match, const gchar * upto)
+{
+ gchar *result = strstr (line, match);
+ return (result < upto);
+}
+
+/*
+ * Reads the color values and stores them in r, g and b.
+ */
+static gboolean
+read_color (const gchar * line, gint * r, gint * g, gint * b)
+{
+ gint index = 0;
+ while (line[index] != ':' && line[index] != '}') {
+ index++;
+ }
+ if (line[index] != ':')
+ return FALSE;
+ index++;
+
+ *r = atoi (line + index);
+
+ while (line[index] != '}' && line[index] != ',') {
+ index++;
+ }
+ if (line[index] != ',')
+ return FALSE;
+ index++;
+
+ *g = atoi (line + index);
+
+ while (line[index] != '}' && line[index] != ',') {
+ index++;
+ }
+ if (line[index] != ',')
+ return FALSE;
+ index++;
+
+ *b = atoi (line + index);
+
+ return TRUE;
+}
+
+static gchar *
+make_color (gint r, gint g, gint b)
+{
+ /* qttext goes up to 65535, while pango goes to 255 */
+ r /= 256;
+ g /= 256;
+ b /= 256;
+ return g_strdup_printf ("#%02X%02X%02X", r, g, b);
+}
+
+static gboolean
+qttext_parse_tag (ParserState * state, const gchar * line, gint * index)
+{
+ gchar *next;
+ gint next_index;
+ gint aux;
+ gchar *str;
+ gint r, g, b;
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+
+ g_assert (line[*index] == '{');
+
+ next = strchr (line + *index, '}');
+ if (next == NULL) {
+ goto error_out;
+ } else {
+ next_index = 1 + (next - line);
+ }
+ g_assert (line[next_index - 1] == '}');
+
+ *index = *index + 1; /* skip the { */
+
+ /* now identify our tag */
+ /* FIXME: those should be case unsensitive */
+ /* TODO: there are other tags that could be added here */
+ if (strncmp (line + *index, "QTtext", 6) == 0) {
+ /* NOP */
+
+ } else if (strncmp (line + *index, "font", 4) == 0) {
+ str = read_str (line + *index + 4, line + next_index - 1);
+ if (str) {
+ g_free (context->font);
+ context->font = str;
+ context->need_markup = TRUE;
+ GST_DEBUG ("Setting qttext font to %s", str);
+ } else {
+ GST_WARNING ("Failed to parse qttext font at line: %s", line);
+ }
+
+ } else if (strncmp (line + *index, "size", 4) == 0) {
+ aux = read_int (line + *index + 4);
+ if (aux == 0) {
+ GST_WARNING ("Invalid size at line %s, using 12", line);
+ context->font_size = 12;
+ } else {
+ GST_DEBUG ("Setting qttext font-size to: %d", aux);
+ context->font_size = aux;
+ }
+ context->need_markup = TRUE;
+
+ } else if (strncmp (line + *index, "textColor", 9) == 0) {
+ if (read_color (line + *index + 9, &r, &g, &b)) {
+ context->fg_color = make_color (r, g, b);
+ GST_DEBUG ("Setting qttext fg color to %s", context->fg_color);
+ } else {
+ GST_WARNING ("Failed to read textColor at line %s", line);
+ }
+ context->need_markup = TRUE;
+
+ } else if (strncmp (line + *index, "backColor", 9) == 0) {
+ if (read_color (line + *index + 9, &r, &g, &b)) {
+ context->bg_color = make_color (r, g, b);
+ GST_DEBUG ("Setting qttext bg color to %s", context->bg_color);
+ } else {
+ GST_WARNING ("Failed to read backColor at line %s, disabling", line);
+ g_free (context->bg_color);
+ context->bg_color = NULL;
+ }
+ context->need_markup = TRUE;
+
+ } else if (strncmp (line + *index, "plain", 5) == 0) {
+ context->bold = FALSE;
+ context->italic = FALSE;
+ context->need_markup = TRUE;
+ GST_DEBUG ("Setting qttext style to plain");
+
+ } else if (strncmp (line + *index, "bold", 4) == 0) {
+ context->bold = TRUE;
+ context->italic = FALSE;
+ context->need_markup = TRUE;
+ GST_DEBUG ("Setting qttext style to bold");
+
+ } else if (strncmp (line + *index, "italic", 6) == 0) {
+ context->bold = FALSE;
+ context->italic = TRUE;
+ context->need_markup = TRUE;
+ GST_DEBUG ("Setting qttext style to italic");
+
+ } else if (strncmp (line + *index, "timescale", 9) == 0) {
+ aux = read_int (line + *index + 9);
+ if (aux == 0) {
+ GST_WARNING ("Couldn't interpret timescale at line %s, using 1000", line);
+ context->timescale = 1000;
+ } else {
+ GST_DEBUG ("Setting qttext timescale to: %d", aux);
+ context->timescale = aux;
+ }
+
+ } else if (strncmp (line + *index, "timestamps", 10) == 0) {
+ if (string_match (line + *index + 10, "relative", line + next_index)) {
+ GST_DEBUG ("Setting qttext timestamps to relative");
+ context->absolute = FALSE;
+ } else {
+ /* call it absolute otherwise */
+ GST_DEBUG ("Setting qttext timestamps to absolute");
+ context->absolute = TRUE;
+ }
+
+ } else {
+ GST_WARNING ("Unused qttext tag starting at: %s", line + *index);
+ }
+
+ *index = next_index;
+ return TRUE;
+
+error_out:
+ {
+ GST_WARNING ("Failed to parse qttext tag at line %s", line);
+ return FALSE;
+ }
+}
+
+static guint64
+qttext_parse_timestamp (ParserState * state, const gchar * line, gint index)
+{
+ int ret;
+ gint hour, min, sec, dec;
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+
+ ret = sscanf (line + index, "[%d:%d:%d.%d]", &hour, &min, &sec, &dec);
+ if (ret != 3 && ret != 4) {
+ /* bad timestamp */
+ GST_WARNING ("Bad qttext timestamp found: %s", line);
+ return 0;
+ }
+
+ if (ret == 3) {
+ /* be forgiving for missing decimal part */
+ dec = 0;
+ }
+
+ /* parse the decimal part according to the timescale */
+ g_assert (context->timescale != 0);
+ dec = (GST_SECOND * dec) / context->timescale;
+
+ /* return the result */
+ return hour * HOUR_TO_NSEC + min * MIN_TO_NSEC + sec * GST_SECOND + dec;
+}
+
+static void
+qttext_open_markup (ParserState * state)
+{
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+
+ g_string_append (state->buf, "<span");
+
+ /* add your markup tags here */
+ if (context->font)
+ g_string_append_printf (state->buf, " font='%s %d'", context->font,
+ context->font_size);
+ else
+ g_string_append_printf (state->buf, " font='%d'", context->font_size);
+
+ if (context->bg_color)
+ g_string_append_printf (state->buf, " bgcolor='%s'", context->bg_color);
+ if (context->fg_color)
+ g_string_append_printf (state->buf, " color='%s'", context->fg_color);
+
+ if (context->bold)
+ g_string_append (state->buf, " weight='bold'");
+ if (context->italic)
+ g_string_append (state->buf, " style='italic'");
+
+ g_string_append (state->buf, ">");
+}
+
+static void
+qttext_prepare_text (ParserState * state)
+{
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+ if (state->buf == NULL) {
+ state->buf = g_string_sized_new (256); /* this should be enough */
+ } else {
+ g_string_append (state->buf, "\n");
+ }
+
+ /* if needed, add pango markup */
+ if (context->need_markup) {
+ if (context->markup_open) {
+ g_string_append (state->buf, "</span>");
+ }
+ qttext_open_markup (state);
+ context->markup_open = TRUE;
+ }
+}
+
+static void
+qttext_parse_text (ParserState * state, const gchar * line, gint index)
+{
+ qttext_prepare_text (state);
+ g_string_append (state->buf, line + index);
+}
+
+static gchar *
+qttext_get_text (ParserState * state)
+{
+ gchar *ret;
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+ if (state->buf == NULL)
+ return NULL;
+
+ if (context->markup_open) {
+ g_string_append (state->buf, "</span>");
+ }
+ ret = g_string_free (state->buf, FALSE);
+ state->buf = NULL;
+ context->markup_open = FALSE;
+ return ret;
+}
+
+gchar *
+parse_qttext (ParserState * state, const gchar * line)
+{
+ gint i;
+ guint64 ts;
+ gchar *ret = NULL;
+ GstQTTextContext *context = GST_QTTEXT_CONTEXT (state);
+
+ i = 0;
+ while (line[i] != '\0') {
+ /* find first interesting character from 'i' onwards */
+
+ if (line[i] == '{') {
+ /* this is a tag, parse it */
+ if (!qttext_parse_tag (state, line, &i)) {
+ break;
+ }
+ } else if (line[i] == '[') {
+ /* this is a time, convert it to a timestamp */
+ ts = qttext_parse_timestamp (state, line, i);
+
+ /* check if we have pending text to send, in case we prepare it */
+ if (state->buf) {
+ ret = qttext_get_text (state);
+ if (context->absolute)
+ state->duration = ts - context->start_time;
+ else
+ state->duration = ts;
+ state->start_time = context->start_time;
+ }
+ state->buf = NULL;
+
+ if (ts == 0) {
+ /* this is an error */
+ } else {
+ if (context->absolute)
+ context->start_time = ts;
+ else
+ context->start_time += ts;
+ }
+
+ /* we assume there is nothing else on this line */
+ break;
+
+ } else if (line[i] == ' ' || line[i] == '\t') {
+ i++; /* NOP */
+ } else {
+ /* this is the actual text, output the rest of the line as it */
+ qttext_parse_text (state, line, i);
+ break;
+ }
+ }
+ return ret;
+}
diff --git a/gst/subparse/qttextparse.h b/gst/subparse/qttextparse.h
new file mode 100644
index 0000000..6d4f393
--- /dev/null
+++ b/gst/subparse/qttextparse.h
@@ -0,0 +1,36 @@
+/* GStreamer QTtext subtitle parser
+ * Copyright (c) 2009 Thiago Santos <thiago.sousa.santos collabora co uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _QTTEXT_PARSE_H_
+#define _QTTEXT_PARSE_H_
+
+#include "gstsubparse.h"
+
+G_BEGIN_DECLS
+
+gchar * parse_qttext (ParserState * state, const gchar * line);
+
+void qttext_context_init (ParserState * state);
+
+void qttext_context_deinit (ParserState * state);
+
+G_END_DECLS
+
+#endif /* _QTTEXT_PARSE_H_ */
+
diff --git a/gst/subparse/samiparse.c b/gst/subparse/samiparse.c
new file mode 100644
index 0000000..135748a
--- /dev/null
+++ b/gst/subparse/samiparse.c
@@ -0,0 +1,474 @@
+/* GStreamer SAMI subtitle parser
+ * Copyright (c) 2006 Young-Ho Cha <ganadist at chollian net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "samiparse.h"
+
+#include <libxml/HTMLparser.h>
+#include <string.h>
+
+#define ITALIC_TAG 'i'
+#define SPAN_TAG 's'
+#define RUBY_TAG 'r'
+#define RT_TAG 't'
+#define CLEAR_TAG '0'
+
+typedef struct _GstSamiContext GstSamiContext;
+
+struct _GstSamiContext
+{
+ GString *buf; /* buffer to collect content */
+ GString *rubybuf; /* buffer to collect ruby content */
+ GString *resultbuf; /* when opening the next 'sync' tag, move
+ * from 'buf' to avoid to append following
+ * content */
+ GString *state; /* in many sami files there are tags that
+ * are not closed, so for each open tag the
+ * parser will append a tag flag here so
+ * that tags can be closed properly on
+ * 'sync' tags. See _context_push_state()
+ * and _context_pop_state(). */
+ htmlParserCtxtPtr htmlctxt; /* html parser context */
+ gboolean has_result; /* set when ready to push out result */
+ gboolean in_sync; /* flag to avoid appending anything except the
+ * content of the sync elements to buf */
+ guint64 time1; /* previous start attribute in sync tag */
+ guint64 time2; /* current start attribute in sync tag */
+};
+
+static gchar *
+has_tag (GString * str, const gchar tag)
+{
+ return strrchr (str->str, tag);
+}
+
+static void
+sami_context_push_state (GstSamiContext * sctx, char state)
+{
+ GST_LOG ("state %c", state);
+ g_string_append_c (sctx->state, state);
+}
+
+static void
+sami_context_pop_state (GstSamiContext * sctx, char state)
+{
+ GString *str = g_string_new ("");
+ GString *context_state = sctx->state;
+ int i;
+
+ GST_LOG ("state %c", state);
+ for (i = context_state->len - 1; i >= 0; i--) {
+ switch (context_state->str[i]) {
+ case ITALIC_TAG: /* <i> */
+ {
+ g_string_append (str, "</i>");
+ break;
+ }
+ case SPAN_TAG: /* <span foreground= > */
+ {
+ g_string_append (str, "</span>");
+ break;
+ }
+ case RUBY_TAG: /* <span size= > -- ruby */
+ {
+ break;
+ }
+ case RT_TAG: /* ruby */
+ {
+ /* FIXME: support for furigana/ruby once implemented in pango */
+ g_string_append (sctx->rubybuf, "</span>");
+ if (has_tag (context_state, ITALIC_TAG)) {
+ g_string_append (sctx->rubybuf, "</i>");
+ }
+
+ break;
+ }
+ default:
+ break;
+ }
+ if (context_state->str[i] == state) {
+ g_string_append (sctx->buf, str->str);
+ g_string_free (str, TRUE);
+ g_string_truncate (context_state, i);
+ return;
+ }
+ }
+ if (state == CLEAR_TAG) {
+ g_string_append (sctx->buf, str->str);
+ g_string_truncate (context_state, 0);
+ }
+ g_string_free (str, TRUE);
+}
+
+static void
+handle_start_sync (GstSamiContext * sctx, const xmlChar ** atts)
+{
+ int i;
+
+ sami_context_pop_state (sctx, CLEAR_TAG);
+ if (atts != NULL) {
+ for (i = 0; (atts[i] != NULL); i += 2) {
+ const xmlChar *key, *value;
+
+ key = atts[i];
+ value = atts[i + 1];
+
+ if (!value)
+ continue;
+ if (!xmlStrncmp ((const xmlChar *) "start", key, 5)) {
+ /* Only set a new start time if we don't have text pending */
+ if (sctx->resultbuf->len == 0)
+ sctx->time1 = sctx->time2;
+
+ sctx->time2 = atoi ((const char *) value) * GST_MSECOND;
+ g_string_append (sctx->resultbuf, sctx->buf->str);
+ sctx->has_result = (sctx->resultbuf->len != 0) ? TRUE : FALSE;
+ g_string_truncate (sctx->buf, 0);
+ }
+ }
+ }
+}
+
+static void
+handle_start_font (GstSamiContext * sctx, const xmlChar ** atts)
+{
+ int i;
+
+ sami_context_pop_state (sctx, SPAN_TAG);
+ if (atts != NULL) {
+ g_string_append (sctx->buf, "<span");
+ for (i = 0; (atts[i] != NULL); i += 2) {
+ const xmlChar *key, *value;
+
+ key = atts[i];
+ value = atts[i + 1];
+
+ if (!value)
+ continue;
+ if (!xmlStrncmp ((const xmlChar *) "color", key, 5)) {
+ /*
+ * There are invalid color value in many
+ * sami files.
+ * It will fix hex color value that start without '#'
+ */
+ const gchar *sharp = "";
+ int len = xmlStrlen (value);
+
+ if (!(*value == '#' && len == 7)) {
+ gchar *r;
+
+ /* check if it looks like hex */
+ if (strtol ((const char *) value, &r, 16) >= 0 &&
+ ((xmlChar *) r == (value + 6) && len == 6)) {
+ sharp = "#";
+ }
+ }
+ /* some colours can be found in many sami files, but X RGB database
+ * doesn't contain a colour by this name, so map explicitly */
+ if (!xmlStrncasecmp (value, (const xmlChar *) "aqua", len)) {
+ value = (const xmlChar *) "#00ffff";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "crimson", len)) {
+ value = (const xmlChar *) "#dc143c";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "fuchsia", len)) {
+ value = (const xmlChar *) "#ff00ff";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "indigo", len)) {
+ value = (const xmlChar *) "#4b0082";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "lime", len)) {
+ value = (const xmlChar *) "#00ff00";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "olive", len)) {
+ value = (const xmlChar *) "#808000";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "silver", len)) {
+ value = (const xmlChar *) "#c0c0c0";
+ } else if (!xmlStrncasecmp (value, (const xmlChar *) "teal", len)) {
+ value = (const xmlChar *) "#008080";
+ }
+ g_string_append_printf (sctx->buf, " foreground=\"%s%s\"", sharp,
+ value);
+ } else if (!xmlStrncasecmp ((const xmlChar *) "face", key, 4)) {
+ g_string_append_printf (sctx->buf, " font_family=\"%s\"", value);
+ }
+ }
+ g_string_append_c (sctx->buf, '>');
+ sami_context_push_state (sctx, SPAN_TAG);
+ }
+}
+
+static void
+start_sami_element (void *ctx, const xmlChar * name, const xmlChar ** atts)
+{
+ GstSamiContext *sctx = (GstSamiContext *) ctx;
+
+ GST_LOG ("name:%s", name);
+
+ if (!xmlStrncmp ((const xmlChar *) "sync", name, 4)) {
+ handle_start_sync (sctx, atts);
+ sctx->in_sync = TRUE;
+ } else if (!xmlStrncmp ((const xmlChar *) "font", name, 4)) {
+ handle_start_font (sctx, atts);
+ } else if (!xmlStrncmp ((const xmlChar *) "ruby", name, 4)) {
+ sami_context_push_state (sctx, RUBY_TAG);
+ } else if (!xmlStrncmp ((const xmlChar *) "br", name, 2)) {
+ g_string_append_c (sctx->buf, '\n');
+ /* FIXME: support for furigana/ruby once implemented in pango */
+ } else if (!xmlStrncmp ((const xmlChar *) "rt", name, 2)) {
+ if (has_tag (sctx->state, ITALIC_TAG)) {
+ g_string_append (sctx->rubybuf, "<i>");
+ }
+ g_string_append (sctx->rubybuf, "<span size='xx-small' rise='-100'>");
+ sami_context_push_state (sctx, RT_TAG);
+ } else if (!xmlStrncmp ((const xmlChar *) "p", name, 1)) {
+ } else if (!xmlStrncmp ((const xmlChar *) "i", name, 1)) {
+ g_string_append (sctx->buf, "<i>");
+ sami_context_push_state (sctx, ITALIC_TAG);
+ }
+}
+
+static void
+end_sami_element (void *ctx, const xmlChar * name)
+{
+ GstSamiContext *sctx = (GstSamiContext *) ctx;
+
+ GST_LOG ("name:%s", name);
+
+ if (!xmlStrncmp ((const xmlChar *) "sync", name, 4)) {
+ sctx->in_sync = FALSE;
+ } else if ((!xmlStrncmp ((const xmlChar *) "body", name, 4)) ||
+ (!xmlStrncmp ((const xmlChar *) "sami", name, 4))) {
+ /* We will usually have one buffer left when the body is closed
+ * as we need the next sync to actually send it */
+ if (sctx->buf->len != 0) {
+ /* Only set a new start time if we don't have text pending */
+ if (sctx->resultbuf->len == 0)
+ sctx->time1 = sctx->time2;
+
+ sctx->time2 = GST_CLOCK_TIME_NONE;
+ g_string_append (sctx->resultbuf, sctx->buf->str);
+ sctx->has_result = (sctx->resultbuf->len != 0) ? TRUE : FALSE;
+ g_string_truncate (sctx->buf, 0);
+ }
+ } else if (!xmlStrncmp ((const xmlChar *) "font", name, 4)) {
+ sami_context_pop_state (sctx, SPAN_TAG);
+ } else if (!xmlStrncmp ((const xmlChar *) "ruby", name, 4)) {
+ sami_context_pop_state (sctx, RUBY_TAG);
+ } else if (!xmlStrncmp ((const xmlChar *) "i", name, 1)) {
+ sami_context_pop_state (sctx, ITALIC_TAG);
+ }
+}
+
+static void
+characters_sami (void *ctx, const xmlChar * ch, int len)
+{
+ GstSamiContext *sctx = (GstSamiContext *) ctx;
+ gchar *escaped;
+ gchar *tmp;
+ gint i;
+
+ /* Skip everything except content of the sync elements */
+ if (!sctx->in_sync)
+ return;
+
+ escaped = g_markup_escape_text ((const gchar *) ch, len);
+ g_strstrip (escaped);
+
+ /* Remove double spaces forom the string as those are
+ * usually added by newlines and indention */
+ tmp = escaped;
+ for (i = 0; i <= strlen (escaped); i++) {
+ escaped[i] = *tmp;
+ if (*tmp != ' ') {
+ tmp++;
+ continue;
+ }
+ while (*tmp == ' ')
+ tmp++;
+ }
+
+ if (has_tag (sctx->state, RT_TAG)) {
+ g_string_append_c (sctx->rubybuf, ' ');
+ g_string_append (sctx->rubybuf, escaped);
+ g_string_append_c (sctx->rubybuf, ' ');
+ } else {
+ g_string_append (sctx->buf, escaped);
+ }
+ g_free (escaped);
+}
+
+static xmlSAXHandler samiSAXHandlerStruct = {
+ NULL, /* internalSubset */
+ NULL, /* isStandalone */
+ NULL, /* hasInternalSubset */
+ NULL, /* hasExternalSubset */
+ NULL, /* resolveEntity */
+ NULL, /* getEntity */
+ NULL, /* entityDecl */
+ NULL, /* notationDecl */
+ NULL, /* attributeDecl */
+ NULL, /* elementDecl */
+ NULL, /* unparsedEntityDecl */
+ NULL, /* setDocumentLocator */
+ NULL, /* startDocument */
+ NULL, /* endDocument */
+ start_sami_element, /* startElement */
+ end_sami_element, /* endElement */
+ NULL, /* reference */
+ characters_sami, /* characters */
+ NULL, /* ignorableWhitespace */
+ NULL, /* processingInstruction */
+ NULL, /* comment */
+ NULL, /* xmlParserWarning */
+ NULL, /* xmlParserError */
+ NULL, /* xmlParserError */
+ NULL, /* getParameterEntity */
+ NULL, /* cdataBlock */
+ NULL, /* externalSubset */
+ 1, /* initialized */
+ NULL, /* private */
+ NULL, /* startElementNsSAX2Func */
+ NULL, /* endElementNsSAX2Func */
+ NULL /* xmlStructuredErrorFunc */
+};
+
+static xmlSAXHandlerPtr samiSAXHandler = &samiSAXHandlerStruct;
+
+void
+sami_context_init (ParserState * state)
+{
+ GstSamiContext *context;
+
+ g_assert (state->user_data == NULL);
+ state->user_data = (gpointer) g_new0 (GstSamiContext, 1);
+ context = (GstSamiContext *) state->user_data;
+
+ context->htmlctxt = htmlCreatePushParserCtxt (samiSAXHandler, context,
+ "", 0, NULL, XML_CHAR_ENCODING_UTF8);
+ context->buf = g_string_new ("");
+ context->rubybuf = g_string_new ("");
+ context->resultbuf = g_string_new ("");
+ context->state = g_string_new ("");
+}
+
+void
+sami_context_deinit (ParserState * state)
+{
+ GstSamiContext *context = (GstSamiContext *) state->user_data;
+
+ if (context) {
+ htmlParserCtxtPtr htmlctxt = context->htmlctxt;
+
+ /* destroy sax context */
+ htmlDocPtr doc;
+
+ htmlParseChunk (htmlctxt, "", 0, 1);
+ doc = htmlctxt->myDoc;
+ htmlFreeParserCtxt (htmlctxt);
+ context->htmlctxt = NULL;
+ if (doc)
+ xmlFreeDoc (doc);
+ g_string_free (context->buf, TRUE);
+ g_string_free (context->rubybuf, TRUE);
+ g_string_free (context->resultbuf, TRUE);
+ g_string_free (context->state, TRUE);
+ g_free (context);
+ state->user_data = NULL;
+ }
+}
+
+void
+sami_context_reset (ParserState * state)
+{
+ GstSamiContext *context = (GstSamiContext *) state->user_data;
+
+ if (context) {
+ g_string_truncate (context->buf, 0);
+ g_string_truncate (context->rubybuf, 0);
+ g_string_truncate (context->resultbuf, 0);
+ g_string_truncate (context->state, 0);
+ context->has_result = FALSE;
+ context->in_sync = FALSE;
+ context->time1 = 0;
+ context->time2 = 0;
+ }
+}
+
+static gchar *
+fix_invalid_entities (const gchar * line)
+{
+ const gchar *cp, *pp; /* current pointer, previous pointer */
+ gssize size;
+ GString *ret = g_string_new (NULL);
+
+ pp = line;
+ cp = strchr (line, '&');
+ while (cp) {
+ size = cp - pp;
+ ret = g_string_append_len (ret, pp, size);
+ cp++;
+ if (g_ascii_strncasecmp (cp, "nbsp;", 5)
+ && (!g_ascii_strncasecmp (cp, "nbsp", 4))) {
+ /* translate "&nbsp" to "&nbsp;" */
+ ret = g_string_append_len (ret, "&nbsp;", 6);
+ cp += 4;
+ } else if (g_ascii_strncasecmp (cp, "quot;", 5)
+ && g_ascii_strncasecmp (cp, "amp;", 4)
+ && g_ascii_strncasecmp (cp, "apos;", 5)
+ && g_ascii_strncasecmp (cp, "lt;", 3)
+ && g_ascii_strncasecmp (cp, "gt;", 3)
+ && g_ascii_strncasecmp (cp, "nbsp;", 5)
+ && cp[0] != '#') {
+ /* translate "&" to "&amp;" */
+ ret = g_string_append_len (ret, "&amp;", 5);
+ } else {
+ /* do not translate */
+ ret = g_string_append_c (ret, '&');
+ }
+
+ pp = cp;
+ cp = strchr (pp, '&');
+ }
+ ret = g_string_append (ret, pp);
+ return g_string_free (ret, FALSE);
+}
+
+gchar *
+parse_sami (ParserState * state, const gchar * line)
+{
+ gchar *fixed_line;
+ GstSamiContext *context = (GstSamiContext *) state->user_data;
+
+ fixed_line = fix_invalid_entities (line);
+ htmlParseChunk (context->htmlctxt, fixed_line, strlen (fixed_line), 0);
+ g_free (fixed_line);
+
+ if (context->has_result) {
+ gchar *r;
+
+ if (context->rubybuf->len) {
+ context->rubybuf = g_string_append_c (context->rubybuf, '\n');
+ g_string_prepend (context->resultbuf, context->rubybuf->str);
+ context->rubybuf = g_string_truncate (context->rubybuf, 0);
+ }
+
+ r = g_string_free (context->resultbuf, FALSE);
+ context->resultbuf = g_string_new ("");
+ state->start_time = context->time1;
+ state->duration = context->time2 - context->time1;
+ context->has_result = FALSE;
+ return r;
+ }
+ return NULL;
+}
diff --git a/gst/subparse/samiparse.h b/gst/subparse/samiparse.h
new file mode 100644
index 0000000..a45de01
--- /dev/null
+++ b/gst/subparse/samiparse.h
@@ -0,0 +1,38 @@
+/* GStreamer SAMI subtitle parser
+ * Copyright (c) 2006 Young-Ho Cha <ganadist chollian net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _SAMI_PARSE_H_
+#define _SAMI_PARSE_H_
+
+#include "gstsubparse.h"
+
+G_BEGIN_DECLS
+
+gchar * parse_sami (ParserState * state, const gchar * line);
+
+void sami_context_init (ParserState * state);
+
+void sami_context_deinit (ParserState * state);
+
+void sami_context_reset (ParserState * state);
+
+G_END_DECLS
+
+#endif /* _SAMI_PARSE_H_ */
+
diff --git a/gst/subparse/tmplayerparse.c b/gst/subparse/tmplayerparse.c
new file mode 100644
index 0000000..3937de6
--- /dev/null
+++ b/gst/subparse/tmplayerparse.c
@@ -0,0 +1,154 @@
+/* GStreamer tmplayer format subtitle parser
+ * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "tmplayerparse.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/* From http://forum.doom9.org/archive/index.php/t-81059.html:
+ *
+ * TMPlayer format, which comes in five varieties:
+ *
+ * time-base 00:00:00:
+ * 00:00:50:This is the Earth at a time|when the dinosaurs roamed...
+ * 00:00:53:
+ * 00:00:54:a lush and fertile planet.
+ * 00:00:56:
+ *
+ * time-base 0:00:00:
+ * 0:00:50:This is the Earth at a time|when the dinosaurs roamed...
+ * 0:00:53:
+ * 0:00:54:a lush and fertile planet.
+ * 0:00:56:
+ *
+ * time-base 00:00:00=
+ * 00:00:50=This is the Earth at a time|when the dinosaurs roamed...
+ * 00:00:53=
+ * 00:00:54=a lush and fertile planet.
+ * 00:00:56=
+ *
+ * time-base 0:00:00=
+ * 0:00:50=This is the Earth at a time|when the dinosaurs roamed...
+ * 0:00:53=
+ * 0:00:54=a lush and fertile planet.
+ * 0:00:56=
+ *
+ * and multiline time-base 00:00:00,1=
+ * 00:00:50,1=This is the Earth at a time
+ * 00:00:50,2=when the dinosaurs roamed...
+ * 00:00:53,1=
+ * 00:00:54,1=a lush and fertile planet.
+ * 00:00:56,1=
+ *
+ * --------------------------------------------------------------------------
+ *
+ * And another variety (which is 'time-base 0:00:00:' but without empty lines):
+ *
+ * 00:00:01:This is the Earth at a time|when the dinosaurs roamed...
+ * 00:00:03:a lush and fertile planet.
+ * 00:00:06:More text here
+ * 00:00:12:Yet another line
+ *
+ */
+
+static gchar *
+tmplayer_process_buffer (ParserState * state)
+{
+ gchar *ret;
+
+ ret = g_strndup (state->buf->str, state->buf->len);
+ g_strdelimit (ret, "|", '\n');
+ g_string_truncate (state->buf, 0);
+ return ret;
+}
+
+static gchar *
+tmplayer_parse_line (ParserState * state, const gchar * line, guint line_num)
+{
+ GstClockTime ts = GST_CLOCK_TIME_NONE;
+ const gchar *text_start = NULL;
+ gchar *ret = NULL;
+ gchar divc = '\0';
+ guint h, m, s, l = 1;
+
+ if (sscanf (line, "%u:%02u:%02u,%u%c", &h, &m, &s, &l, &divc) == 5 &&
+ (divc == '=')) {
+ GST_LOG ("multiline format %u %u %u %u", h, m, s, l);
+ ts = GST_SECOND * ((((h * 60) + m) * 60) + s);
+ text_start = strchr (line, '=');
+ } else if (sscanf (line, "%u:%02u:%02u%c", &h, &m, &s, &divc) == 4 &&
+ (divc == '=' || divc == ':')) {
+ GST_LOG ("single line format %u %u %u %u %c", h, m, s, l, divc);
+ ts = GST_SECOND * ((((h * 60) + m) * 60) + s);
+ text_start = strchr (line + 6, divc);
+ } else if (line[0] == '\0' && state->buf->len > 0 &&
+ GST_CLOCK_TIME_IS_VALID (state->start_time)) {
+ /* if we get an empty line (could be the end of the file, but doesn't have
+ * to be), just push whatever is still in the buffer without a duration */
+ GST_LOG ("empty line, and there's still text in the buffer");
+ ret = tmplayer_process_buffer (state);
+ state->duration = GST_CLOCK_TIME_NONE;
+ return ret;
+ } else {
+ GST_WARNING ("failed to parse line: '%s'", line);
+ return NULL;
+ }
+
+ /* if this is a line without text, or the first line in a multiline file,
+ * process and return the data in the buffer, which is the previous line(s) */
+ if (text_start == NULL || text_start[1] == '\0' ||
+ (l == 1 && state->buf->len > 0)) {
+
+ if (GST_CLOCK_TIME_IS_VALID (state->start_time) &&
+ state->start_time < ts && line_num > 0) {
+ ret = tmplayer_process_buffer (state);
+ state->duration = ts - state->start_time;
+ /* ..and append current line's text (if there is any) for the next round.
+ * We don't have to store ts as pending_start_time, since we deduce the
+ * durations from the start times anyway, so as long as the parser just
+ * forwards state->start_time by duration after it pushes the line we
+ * are about to return it will all be good. */
+ g_string_append (state->buf, text_start + 1);
+ } else if (line_num > 0) {
+ GST_WARNING ("end of subtitle unit but no valid start time?!");
+ }
+ } else {
+ if (l > 1)
+ g_string_append_c (state->buf, '\n');
+ g_string_append (state->buf, text_start + 1);
+ state->start_time = ts;
+ }
+
+ GST_LOG ("returning: '%s'", GST_STR_NULL (ret));
+ return ret;
+}
+
+gchar *
+parse_tmplayer (ParserState * state, const gchar * line)
+{
+ gchar *ret;
+
+ /* GST_LOG ("Parsing: %s", line); */
+
+ ret = tmplayer_parse_line (state, line, state->state);
+ ++state->state;
+
+ return ret;
+}
diff --git a/gst/subparse/tmplayerparse.h b/gst/subparse/tmplayerparse.h
new file mode 100644
index 0000000..a0001af
--- /dev/null
+++ b/gst/subparse/tmplayerparse.h
@@ -0,0 +1,32 @@
+/* GStreamer tmplayer format subtitle parser
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _TMPLAYER_PARSE_H_
+#define _TMPLAYER_PARSE_H_
+
+#include "gstsubparse.h"
+
+G_BEGIN_DECLS
+
+gchar * parse_tmplayer (ParserState * state, const gchar * line);
+
+G_END_DECLS
+
+#endif /* _TMPLAYER_PARSE_H_ */
+
diff --git a/gst/tcp/Makefile.am b/gst/tcp/Makefile.am
new file mode 100644
index 0000000..a970a2b
--- /dev/null
+++ b/gst/tcp/Makefile.am
@@ -0,0 +1,56 @@
+plugin_LTLIBRARIES = libgsttcp.la
+
+# variables used for enum/marshal generation
+glib_enum_headers = gsttcp.h
+glib_enum_define = GST_TCP
+glib_gen_prefix = gst_tcp
+glib_gen_basename = gsttcp
+
+include $(top_srcdir)/common/gst-glib-gen.mak
+
+built_sources = gsttcp-enumtypes.c gsttcp-marshal.c
+built_headers = gsttcp-enumtypes.h gsttcp-marshal.h
+
+BUILT_SOURCES = $(built_sources) $(built_headers)
+
+libgsttcp_la_SOURCES = \
+ gsttcpplugin.c \
+ gsttcp.c \
+ gstmultifdsink.c \
+ gsttcpclientsrc.c gsttcpclientsink.c \
+ gsttcpserversrc.c gsttcpserversink.c
+
+nodist_libgsttcp_la_SOURCES = \
+ $(built_sources)
+
+# remove ENABLE_NEW when dataprotocol is stable
+libgsttcp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_GDP_CFLAGS) $(GST_CFLAGS) -DGST_ENABLE_NEW
+libgsttcp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttcp_la_LIBADD = $(GST_BASE_LIBS) $(GST_GDP_LIBS) $(GST_LIBS)
+libgsttcp_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gsttcpplugin.h \
+ gsttcp.h \
+ gstmultifdsink.h \
+ gsttcpclientsrc.h gsttcpclientsink.h \
+ gsttcpserversrc.h gsttcpserversink.h
+
+CLEANFILES = $(BUILT_SOURCES)
+
+EXTRA_DIST = gsttcp-marshal.list
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgsttcp -:SHARED libgsttcp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttcp_la_SOURCES) \
+ $(nodist_libgsttcp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsttcp_la_CFLAGS) \
+ -:LDFLAGS $(libgsttcp_la_LDFLAGS) \
+ $(libgsttcp_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/tcp/Makefile.in b/gst/tcp/Makefile.in
new file mode 100644
index 0000000..dc8d3a1
--- /dev/null
+++ b/gst/tcp/Makefile.in
@@ -0,0 +1,929 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/tcp
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgsttcp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgsttcp_la_OBJECTS = libgsttcp_la-gsttcpplugin.lo \
+ libgsttcp_la-gsttcp.lo libgsttcp_la-gstmultifdsink.lo \
+ libgsttcp_la-gsttcpclientsrc.lo \
+ libgsttcp_la-gsttcpclientsink.lo \
+ libgsttcp_la-gsttcpserversrc.lo \
+ libgsttcp_la-gsttcpserversink.lo
+am__objects_1 = libgsttcp_la-gsttcp-enumtypes.lo \
+ libgsttcp_la-gsttcp-marshal.lo
+nodist_libgsttcp_la_OBJECTS = $(am__objects_1)
+libgsttcp_la_OBJECTS = $(am_libgsttcp_la_OBJECTS) \
+ $(nodist_libgsttcp_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgsttcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgsttcp_la_CFLAGS) $(CFLAGS) \
+ $(libgsttcp_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgsttcp_la_SOURCES) $(nodist_libgsttcp_la_SOURCES)
+DIST_SOURCES = $(libgsttcp_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgsttcp.la
+
+# variables used for enum/marshal generation
+glib_enum_headers = gsttcp.h
+glib_enum_define = GST_TCP
+glib_gen_prefix = gst_tcp
+glib_gen_basename = gsttcp
+enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
+built_sources = gsttcp-enumtypes.c gsttcp-marshal.c
+built_headers = gsttcp-enumtypes.h gsttcp-marshal.h
+BUILT_SOURCES = $(built_sources) $(built_headers)
+libgsttcp_la_SOURCES = \
+ gsttcpplugin.c \
+ gsttcp.c \
+ gstmultifdsink.c \
+ gsttcpclientsrc.c gsttcpclientsink.c \
+ gsttcpserversrc.c gsttcpserversink.c
+
+nodist_libgsttcp_la_SOURCES = \
+ $(built_sources)
+
+
+# remove ENABLE_NEW when dataprotocol is stable
+libgsttcp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_GDP_CFLAGS) $(GST_CFLAGS) -DGST_ENABLE_NEW
+libgsttcp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttcp_la_LIBADD = $(GST_BASE_LIBS) $(GST_GDP_LIBS) $(GST_LIBS)
+libgsttcp_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gsttcpplugin.h \
+ gsttcp.h \
+ gstmultifdsink.h \
+ gsttcpclientsrc.h gsttcpclientsink.h \
+ gsttcpserversrc.h gsttcpserversink.h
+
+CLEANFILES = $(BUILT_SOURCES)
+EXTRA_DIST = gsttcp-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/tcp/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/tcp/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
+libgsttcp.la: $(libgsttcp_la_OBJECTS) $(libgsttcp_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgsttcp_la_LINK) -rpath $(plugindir) $(libgsttcp_la_OBJECTS) $(libgsttcp_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gstmultifdsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcp-enumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcp-marshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcpclientsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcpclientsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcpplugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcpserversink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttcp_la-gsttcpserversrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgsttcp_la-gsttcpplugin.lo: gsttcpplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcpplugin.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcpplugin.Tpo -c -o libgsttcp_la-gsttcpplugin.lo `test -f 'gsttcpplugin.c' || echo '$(srcdir)/'`gsttcpplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcpplugin.Tpo $(DEPDIR)/libgsttcp_la-gsttcpplugin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcpplugin.c' object='libgsttcp_la-gsttcpplugin.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcpplugin.lo `test -f 'gsttcpplugin.c' || echo '$(srcdir)/'`gsttcpplugin.c
+
+libgsttcp_la-gsttcp.lo: gsttcp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcp.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcp.Tpo -c -o libgsttcp_la-gsttcp.lo `test -f 'gsttcp.c' || echo '$(srcdir)/'`gsttcp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcp.Tpo $(DEPDIR)/libgsttcp_la-gsttcp.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcp.c' object='libgsttcp_la-gsttcp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcp.lo `test -f 'gsttcp.c' || echo '$(srcdir)/'`gsttcp.c
+
+libgsttcp_la-gstmultifdsink.lo: gstmultifdsink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gstmultifdsink.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gstmultifdsink.Tpo -c -o libgsttcp_la-gstmultifdsink.lo `test -f 'gstmultifdsink.c' || echo '$(srcdir)/'`gstmultifdsink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gstmultifdsink.Tpo $(DEPDIR)/libgsttcp_la-gstmultifdsink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmultifdsink.c' object='libgsttcp_la-gstmultifdsink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gstmultifdsink.lo `test -f 'gstmultifdsink.c' || echo '$(srcdir)/'`gstmultifdsink.c
+
+libgsttcp_la-gsttcpclientsrc.lo: gsttcpclientsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcpclientsrc.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcpclientsrc.Tpo -c -o libgsttcp_la-gsttcpclientsrc.lo `test -f 'gsttcpclientsrc.c' || echo '$(srcdir)/'`gsttcpclientsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcpclientsrc.Tpo $(DEPDIR)/libgsttcp_la-gsttcpclientsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcpclientsrc.c' object='libgsttcp_la-gsttcpclientsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcpclientsrc.lo `test -f 'gsttcpclientsrc.c' || echo '$(srcdir)/'`gsttcpclientsrc.c
+
+libgsttcp_la-gsttcpclientsink.lo: gsttcpclientsink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcpclientsink.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcpclientsink.Tpo -c -o libgsttcp_la-gsttcpclientsink.lo `test -f 'gsttcpclientsink.c' || echo '$(srcdir)/'`gsttcpclientsink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcpclientsink.Tpo $(DEPDIR)/libgsttcp_la-gsttcpclientsink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcpclientsink.c' object='libgsttcp_la-gsttcpclientsink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcpclientsink.lo `test -f 'gsttcpclientsink.c' || echo '$(srcdir)/'`gsttcpclientsink.c
+
+libgsttcp_la-gsttcpserversrc.lo: gsttcpserversrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcpserversrc.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcpserversrc.Tpo -c -o libgsttcp_la-gsttcpserversrc.lo `test -f 'gsttcpserversrc.c' || echo '$(srcdir)/'`gsttcpserversrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcpserversrc.Tpo $(DEPDIR)/libgsttcp_la-gsttcpserversrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcpserversrc.c' object='libgsttcp_la-gsttcpserversrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcpserversrc.lo `test -f 'gsttcpserversrc.c' || echo '$(srcdir)/'`gsttcpserversrc.c
+
+libgsttcp_la-gsttcpserversink.lo: gsttcpserversink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcpserversink.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcpserversink.Tpo -c -o libgsttcp_la-gsttcpserversink.lo `test -f 'gsttcpserversink.c' || echo '$(srcdir)/'`gsttcpserversink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcpserversink.Tpo $(DEPDIR)/libgsttcp_la-gsttcpserversink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcpserversink.c' object='libgsttcp_la-gsttcpserversink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcpserversink.lo `test -f 'gsttcpserversink.c' || echo '$(srcdir)/'`gsttcpserversink.c
+
+libgsttcp_la-gsttcp-enumtypes.lo: gsttcp-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcp-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcp-enumtypes.Tpo -c -o libgsttcp_la-gsttcp-enumtypes.lo `test -f 'gsttcp-enumtypes.c' || echo '$(srcdir)/'`gsttcp-enumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcp-enumtypes.Tpo $(DEPDIR)/libgsttcp_la-gsttcp-enumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcp-enumtypes.c' object='libgsttcp_la-gsttcp-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcp-enumtypes.lo `test -f 'gsttcp-enumtypes.c' || echo '$(srcdir)/'`gsttcp-enumtypes.c
+
+libgsttcp_la-gsttcp-marshal.lo: gsttcp-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -MT libgsttcp_la-gsttcp-marshal.lo -MD -MP -MF $(DEPDIR)/libgsttcp_la-gsttcp-marshal.Tpo -c -o libgsttcp_la-gsttcp-marshal.lo `test -f 'gsttcp-marshal.c' || echo '$(srcdir)/'`gsttcp-marshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttcp_la-gsttcp-marshal.Tpo $(DEPDIR)/libgsttcp_la-gsttcp-marshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttcp-marshal.c' object='libgsttcp_la-gsttcp-marshal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttcp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttcp_la_CFLAGS) $(CFLAGS) -c -o libgsttcp_la-gsttcp-marshal.lo `test -f 'gsttcp-marshal.c' || echo '$(srcdir)/'`gsttcp-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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 <glib-object.h>\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 libgsttcp -:SHARED libgsttcp \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttcp_la_SOURCES) \
+ $(nodist_libgsttcp_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsttcp_la_CFLAGS) \
+ -:LDFLAGS $(libgsttcp_la_LDFLAGS) \
+ $(libgsttcp_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/tcp/README b/gst/tcp/README
new file mode 100644
index 0000000..47e4894
--- /dev/null
+++ b/gst/tcp/README
@@ -0,0 +1,53 @@
+This part of the documentation is for the new tcp elements:
+- tcpclientsrc
+- tcpclientsink
+- tcpserversrc
+- tcpserversink
+
+TESTS
+-----
+Use these tests to test functionality of the various tcp plugins
+
+* server: nc -l -p 3000
+ client: nc localhost 3000
+ everything you type in the server is shown on the client
+ everything you type in the client is shown on the server
+
+* server: nc -l -p 3000
+ client: gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+ everything you type in the server is shown on the client
+
+* server: nc -l -p 3000
+ client: gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+ everything you type in the client is shown on the server
+
+* server: gst-launch tcpserversrc protocol=none port=3000 ! fdsink fd=2
+ client: gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+
+* server: gst-launch fdsrc fd=1 ! tcpserversink protocol=none port=3000
+ client: gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+ -> Received first buffer without caps set
+
+TODO
+----
+- implement DNS resolution
+
+multifdsink
+-----------
+- operation:
+ - client fd gets added when "add" signal gets emitted on multifdsink
+ - signal handler creates a GstTCPClient structure, adds it to ->clients,
+ and adds the fd to ->fd_hash, then emits client-added
+ - client
+
+ - when a buffer comes in:
+ - the _render vmethod puts the buffer on the global queue
+ - and increases bytes_to_serve
+ - (currently it sets streamheaders, but since this is treated globally
+ this is wrong - clients can be at different positions in the stream)
+
+ - when a client issues a write (ie requests data):
+ - when using GDP, if no caps sent yet, send caps first, then set caps_sent
+ - if streamheader buffers, and we haven't sent yet to this client,
+ send current streamheader buffers, then set streamheader_sent
+ - send out buffers
diff --git a/gst/tcp/gstmultifdsink.c b/gst/tcp/gstmultifdsink.c
new file mode 100644
index 0000000..e4e6310
--- /dev/null
+++ b/gst/tcp/gstmultifdsink.c
@@ -0,0 +1,2894 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2006 Wim Taymans <wim at fluendo dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-multifdsink
+ * @see_also: tcpserversink
+ *
+ * This plugin writes incoming data to a set of file descriptors. The
+ * file descriptors can be added to multifdsink by emitting the #GstMultiFdSink::add signal.
+ * For each descriptor added, the #GstMultiFdSink::client-added signal will be called.
+ *
+ * As of version 0.10.8, a client can also be added with the #GstMultiFdSink::add-full signal
+ * that allows for more control over what and how much data a client
+ * initially receives.
+ *
+ * Clients can be removed from multifdsink by emitting the #GstMultiFdSink::remove signal. For
+ * each descriptor removed, the #GstMultiFdSink::client-removed signal will be called. The
+ * #GstMultiFdSink::client-removed signal can also be fired when multifdsink decides that a
+ * client is not active anymore or, depending on the value of the
+ * #GstMultiFdSink:recover-policy property, if the client is reading too slowly.
+ * In all cases, multifdsink will never close a file descriptor itself.
+ * The user of multifdsink is responsible for closing all file descriptors.
+ * This can for example be done in response to the #GstMultiFdSink::client-fd-removed signal.
+ * Note that multifdsink still has a reference to the file descriptor when the
+ * #GstMultiFdSink::client-removed signal is emitted, so that "get-stats" can be performed on
+ * the descriptor; it is therefore not safe to close the file descriptor in
+ * the #GstMultiFdSink::client-removed signal handler, and you should use the
+ * #GstMultiFdSink::client-fd-removed signal to safely close the fd.
+ *
+ * Multifdsink internally keeps a queue of the incoming buffers and uses a
+ * separate thread to send the buffers to the clients. This ensures that no
+ * client write can block the pipeline and that clients can read with different
+ * speeds.
+ *
+ * When adding a client to multifdsink, the #GstMultiFdSink:sync-method property will define
+ * which buffer in the queued buffers will be sent first to the client. Clients
+ * can be sent the most recent buffer (which might not be decodable by the
+ * client if it is not a keyframe), the next keyframe received in
+ * multifdsink (which can take some time depending on the keyframe rate), or the
+ * last received keyframe (which will cause a simple burst-on-connect).
+ * Multifdsink will always keep at least one keyframe in its internal buffers
+ * when the sync-mode is set to latest-keyframe.
+ *
+ * As of version 0.10.8, there are additional values for the #GstMultiFdSink:sync-method
+ * property to allow finer control over burst-on-connect behaviour. By selecting
+ * the 'burst' method a minimum burst size can be chosen, 'burst-keyframe'
+ * additionally requires that the burst begin with a keyframe, and
+ * 'burst-with-keyframe' attempts to burst beginning with a keyframe, but will
+ * prefer a minimum burst size even if it requires not starting with a keyframe.
+ *
+ * Multifdsink can be instructed to keep at least a minimum amount of data
+ * expressed in time or byte units in its internal queues with the the
+ * #GstMultiFdSink:time-min and #GstMultiFdSink:bytes-min properties respectively.
+ * These properties are useful if the application adds clients with the
+ * #GstMultiFdSink::add-full signal to make sure that a burst connect can
+ * actually be honored.
+ *
+ * When streaming data, clients are allowed to read at a different rate than
+ * the rate at which multifdsink receives data. If the client is reading too
+ * fast, no data will be send to the client until multifdsink receives more
+ * data. If the client, however, reads too slowly, data for that client will be
+ * queued up in multifdsink. Two properties control the amount of data
+ * (buffers) that is queued in multifdsink: #GstMultiFdSink:buffers-max and
+ * #GstMultiFdSink:buffers-soft-max. A client that falls behind by
+ * #GstMultiFdSink:buffers-max is removed from multifdsink forcibly.
+ *
+ * A client with a lag of at least #GstMultiFdSink:buffers-soft-max enters the recovery
+ * procedure which is controlled with the #GstMultiFdSink:recover-policy property.
+ * A recover policy of NONE will do nothing, RESYNC_LATEST will send the most recently
+ * received buffer as the next buffer for the client, RESYNC_SOFT_LIMIT
+ * positions the client to the soft limit in the buffer queue and
+ * RESYNC_KEYFRAME positions the client at the most recent keyframe in the
+ * buffer queue.
+ *
+ * multifdsink will by default synchronize on the clock before serving the
+ * buffers to the clients. This behaviour can be disabled by setting the sync
+ * property to FALSE. Multifdsink will by default not do QoS and will never
+ * drop late buffers.
+ *
+ * Last reviewed on 2006-09-12 (0.10.10)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst-i18n-plugin.h>
+
+#include <sys/ioctl.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+
+#ifdef HAVE_FIONREAD_IN_SYS_FILIO
+#include <sys/filio.h>
+#endif
+
+#include "gstmultifdsink.h"
+#include "gsttcp-marshal.h"
+
+#define NOT_IMPLEMENTED 0
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (multifdsink_debug);
+#define GST_CAT_DEFAULT (multifdsink_debug)
+
+/* MultiFdSink signals and args */
+enum
+{
+ /* methods */
+ SIGNAL_ADD,
+ SIGNAL_ADD_BURST,
+ SIGNAL_REMOVE,
+ SIGNAL_REMOVE_FLUSH,
+ SIGNAL_CLEAR,
+ SIGNAL_GET_STATS,
+
+ /* signals */
+ SIGNAL_CLIENT_ADDED,
+ SIGNAL_CLIENT_REMOVED,
+ SIGNAL_CLIENT_FD_REMOVED,
+
+ LAST_SIGNAL
+};
+
+
+/* this is really arbitrarily chosen */
+#define DEFAULT_MODE 1
+#define DEFAULT_BUFFERS_MAX -1
+#define DEFAULT_BUFFERS_SOFT_MAX -1
+#define DEFAULT_TIME_MIN -1
+#define DEFAULT_BYTES_MIN -1
+#define DEFAULT_BUFFERS_MIN -1
+#define DEFAULT_UNIT_TYPE GST_TCP_UNIT_TYPE_BUFFERS
+#define DEFAULT_UNITS_MAX -1
+#define DEFAULT_UNITS_SOFT_MAX -1
+#define DEFAULT_RECOVER_POLICY GST_RECOVER_POLICY_NONE
+#define DEFAULT_TIMEOUT 0
+#define DEFAULT_SYNC_METHOD GST_SYNC_METHOD_LATEST
+
+#define DEFAULT_BURST_UNIT GST_TCP_UNIT_TYPE_UNDEFINED
+#define DEFAULT_BURST_VALUE 0
+
+#define DEFAULT_QOS_DSCP -1
+#define DEFAULT_HANDLE_READ TRUE
+
+#define DEFAULT_RESEND_STREAMHEADER TRUE
+
+enum
+{
+ PROP_0,
+ PROP_MODE,
+ PROP_BUFFERS_QUEUED,
+ PROP_BYTES_QUEUED,
+ PROP_TIME_QUEUED,
+
+ PROP_UNIT_TYPE,
+ PROP_UNITS_MAX,
+ PROP_UNITS_SOFT_MAX,
+
+ PROP_BUFFERS_MAX,
+ PROP_BUFFERS_SOFT_MAX,
+
+ PROP_TIME_MIN,
+ PROP_BYTES_MIN,
+ PROP_BUFFERS_MIN,
+
+ PROP_RECOVER_POLICY,
+ PROP_TIMEOUT,
+ PROP_SYNC_METHOD,
+ PROP_BYTES_TO_SERVE,
+ PROP_BYTES_SERVED,
+
+ PROP_BURST_UNIT,
+ PROP_BURST_VALUE,
+
+ PROP_QOS_DSCP,
+
+ PROP_HANDLE_READ,
+
+ PROP_RESEND_STREAMHEADER,
+
+ PROP_NUM_FDS,
+
+ PROP_LAST
+};
+
+/* For backward compat, we can't really select the poll mode anymore with
+ * GstPoll. */
+#define GST_TYPE_FDSET_MODE (gst_fdset_mode_get_type())
+static GType
+gst_fdset_mode_get_type (void)
+{
+ static GType fdset_mode_type = 0;
+ static const GEnumValue fdset_mode[] = {
+ {0, "Select", "select"},
+ {1, "Poll", "poll"},
+ {2, "EPoll", "epoll"},
+ {0, NULL, NULL},
+ };
+
+ if (!fdset_mode_type) {
+ fdset_mode_type = g_enum_register_static ("GstFDSetMode", fdset_mode);
+ }
+ return fdset_mode_type;
+}
+
+#define GST_TYPE_RECOVER_POLICY (gst_recover_policy_get_type())
+static GType
+gst_recover_policy_get_type (void)
+{
+ static GType recover_policy_type = 0;
+ static const GEnumValue recover_policy[] = {
+ {GST_RECOVER_POLICY_NONE,
+ "Do not try to recover", "none"},
+ {GST_RECOVER_POLICY_RESYNC_LATEST,
+ "Resync client to latest buffer", "latest"},
+ {GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT,
+ "Resync client to soft limit", "soft-limit"},
+ {GST_RECOVER_POLICY_RESYNC_KEYFRAME,
+ "Resync client to most recent keyframe", "keyframe"},
+ {0, NULL, NULL},
+ };
+
+ if (!recover_policy_type) {
+ recover_policy_type =
+ g_enum_register_static ("GstRecoverPolicy", recover_policy);
+ }
+ return recover_policy_type;
+}
+
+#define GST_TYPE_SYNC_METHOD (gst_sync_method_get_type())
+static GType
+gst_sync_method_get_type (void)
+{
+ static GType sync_method_type = 0;
+ static const GEnumValue sync_method[] = {
+ {GST_SYNC_METHOD_LATEST,
+ "Serve starting from the latest buffer", "latest"},
+ {GST_SYNC_METHOD_NEXT_KEYFRAME,
+ "Serve starting from the next keyframe", "next-keyframe"},
+ {GST_SYNC_METHOD_LATEST_KEYFRAME,
+ "Serve everything since the latest keyframe (burst)",
+ "latest-keyframe"},
+ {GST_SYNC_METHOD_BURST, "Serve burst-value data to client", "burst"},
+ {GST_SYNC_METHOD_BURST_KEYFRAME,
+ "Serve burst-value data starting on a keyframe",
+ "burst-keyframe"},
+ {GST_SYNC_METHOD_BURST_WITH_KEYFRAME,
+ "Serve burst-value data preferably starting on a keyframe",
+ "burst-with-keyframe"},
+ {0, NULL, NULL},
+ };
+
+ if (!sync_method_type) {
+ sync_method_type = g_enum_register_static ("GstSyncMethod", sync_method);
+ }
+ return sync_method_type;
+}
+
+#define GST_TYPE_UNIT_TYPE (gst_unit_type_get_type())
+static GType
+gst_unit_type_get_type (void)
+{
+ static GType unit_type_type = 0;
+ static const GEnumValue unit_type[] = {
+ {GST_TCP_UNIT_TYPE_UNDEFINED, "Undefined", "undefined"},
+ {GST_TCP_UNIT_TYPE_BUFFERS, "Buffers", "buffers"},
+ {GST_TCP_UNIT_TYPE_BYTES, "Bytes", "bytes"},
+ {GST_TCP_UNIT_TYPE_TIME, "Time", "time"},
+ {0, NULL, NULL},
+ };
+
+ if (!unit_type_type) {
+ unit_type_type = g_enum_register_static ("GstTCPUnitType", unit_type);
+ }
+ return unit_type_type;
+}
+
+#define GST_TYPE_CLIENT_STATUS (gst_client_status_get_type())
+static GType
+gst_client_status_get_type (void)
+{
+ static GType client_status_type = 0;
+ static const GEnumValue client_status[] = {
+ {GST_CLIENT_STATUS_OK, "ok", "ok"},
+ {GST_CLIENT_STATUS_CLOSED, "Closed", "closed"},
+ {GST_CLIENT_STATUS_REMOVED, "Removed", "removed"},
+ {GST_CLIENT_STATUS_SLOW, "Too slow", "slow"},
+ {GST_CLIENT_STATUS_ERROR, "Error", "error"},
+ {GST_CLIENT_STATUS_DUPLICATE, "Duplicate", "duplicate"},
+ {GST_CLIENT_STATUS_FLUSHING, "Flushing", "flushing"},
+ {0, NULL, NULL},
+ };
+
+ if (!client_status_type) {
+ client_status_type =
+ g_enum_register_static ("GstClientStatus", client_status);
+ }
+ return client_status_type;
+}
+
+static void gst_multi_fd_sink_finalize (GObject * object);
+
+static void gst_multi_fd_sink_remove_client_link (GstMultiFdSink * sink,
+ GList * link);
+
+static GstFlowReturn gst_multi_fd_sink_render (GstBaseSink * bsink,
+ GstBuffer * buf);
+static GstStateChangeReturn gst_multi_fd_sink_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_multi_fd_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_multi_fd_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+#define gst_multi_fd_sink_parent_class parent_class
+G_DEFINE_TYPE (GstMultiFdSink, gst_multi_fd_sink, GST_TYPE_BASE_SINK);
+
+static guint gst_multi_fd_sink_signals[LAST_SIGNAL] = { 0 };
+
+static void
+gst_multi_fd_sink_class_init (GstMultiFdSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+
+ gobject_class->set_property = gst_multi_fd_sink_set_property;
+ gobject_class->get_property = gst_multi_fd_sink_get_property;
+ gobject_class->finalize = gst_multi_fd_sink_finalize;
+
+ /**
+ * GstMultiFdSink::mode
+ *
+ * The mode for selecting activity on the fds.
+ *
+ * This property is deprecated since 0.10.18, if will now automatically
+ * select and use the most optimal method.
+ */
+ g_object_class_install_property (gobject_class, PROP_MODE,
+ g_param_spec_enum ("mode", "Mode",
+ "The mode for selecting activity on the fds (deprecated)",
+ GST_TYPE_FDSET_MODE, DEFAULT_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BUFFERS_MAX,
+ g_param_spec_int ("buffers-max", "Buffers max",
+ "max number of buffers to queue for a client (-1 = no limit)", -1,
+ G_MAXINT, DEFAULT_BUFFERS_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BUFFERS_SOFT_MAX,
+ g_param_spec_int ("buffers-soft-max", "Buffers soft max",
+ "Recover client when going over this limit (-1 = no limit)", -1,
+ G_MAXINT, DEFAULT_BUFFERS_SOFT_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BYTES_MIN,
+ g_param_spec_int ("bytes-min", "Bytes min",
+ "min number of bytes to queue (-1 = as little as possible)", -1,
+ G_MAXINT, DEFAULT_BYTES_MIN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TIME_MIN,
+ g_param_spec_int64 ("time-min", "Time min",
+ "min number of time to queue (-1 = as little as possible)", -1,
+ G_MAXINT64, DEFAULT_TIME_MIN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BUFFERS_MIN,
+ g_param_spec_int ("buffers-min", "Buffers min",
+ "min number of buffers to queue (-1 = as few as possible)", -1,
+ G_MAXINT, DEFAULT_BUFFERS_MIN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_UNIT_TYPE,
+ g_param_spec_enum ("unit-type", "Units type",
+ "The unit to measure the max/soft-max/queued properties",
+ GST_TYPE_UNIT_TYPE, DEFAULT_UNIT_TYPE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_UNITS_MAX,
+ g_param_spec_int64 ("units-max", "Units max",
+ "max number of units to queue (-1 = no limit)", -1, G_MAXINT64,
+ DEFAULT_UNITS_MAX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_UNITS_SOFT_MAX,
+ g_param_spec_int64 ("units-soft-max", "Units soft max",
+ "Recover client when going over this limit (-1 = no limit)", -1,
+ G_MAXINT64, DEFAULT_UNITS_SOFT_MAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BUFFERS_QUEUED,
+ g_param_spec_uint ("buffers-queued", "Buffers queued",
+ "Number of buffers currently queued", 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+#if NOT_IMPLEMENTED
+ g_object_class_install_property (gobject_class, PROP_BYTES_QUEUED,
+ g_param_spec_uint ("bytes-queued", "Bytes queued",
+ "Number of bytes currently queued", 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TIME_QUEUED,
+ g_param_spec_uint64 ("time-queued", "Time queued",
+ "Number of time currently queued", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+#endif
+
+ g_object_class_install_property (gobject_class, PROP_RECOVER_POLICY,
+ g_param_spec_enum ("recover-policy", "Recover Policy",
+ "How to recover when client reaches the soft max",
+ GST_TYPE_RECOVER_POLICY, DEFAULT_RECOVER_POLICY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TIMEOUT,
+ g_param_spec_uint64 ("timeout", "Timeout",
+ "Maximum inactivity timeout in nanoseconds for a client (0 = no limit)",
+ 0, G_MAXUINT64, DEFAULT_TIMEOUT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SYNC_METHOD,
+ g_param_spec_enum ("sync-method", "Sync Method",
+ "How to sync new clients to the stream", GST_TYPE_SYNC_METHOD,
+ DEFAULT_SYNC_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, 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 (gobject_class, PROP_BYTES_SERVED,
+ g_param_spec_uint64 ("bytes-served", "Bytes served",
+ "Total number of bytes send to all clients", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BURST_UNIT,
+ g_param_spec_enum ("burst-unit", "Burst unit",
+ "The format of the burst units (when sync-method is burst[[-with]-keyframe])",
+ GST_TYPE_UNIT_TYPE, DEFAULT_BURST_UNIT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BURST_VALUE,
+ g_param_spec_uint64 ("burst-value", "Burst value",
+ "The amount of burst expressed in burst-unit", 0, G_MAXUINT64,
+ DEFAULT_BURST_VALUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, 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));
+ /**
+ * GstMultiFdSink::handle-read
+ *
+ * Handle read requests from clients and discard the data.
+ *
+ * Since: 0.10.23
+ */
+ g_object_class_install_property (gobject_class, PROP_HANDLE_READ,
+ g_param_spec_boolean ("handle-read", "Handle Read",
+ "Handle client reads and discard the data",
+ DEFAULT_HANDLE_READ, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstMultiFdSink::resend-streamheader
+ *
+ * Resend the streamheaders to existing clients when they change.
+ *
+ * Since: 0.10.23
+ */
+ g_object_class_install_property (gobject_class, PROP_RESEND_STREAMHEADER,
+ g_param_spec_boolean ("resend-streamheader", "Resend streamheader",
+ "Resend the streamheader if it changes in the caps",
+ DEFAULT_RESEND_STREAMHEADER,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_NUM_FDS,
+ g_param_spec_uint ("num-fds", "Number of fds",
+ "The current number of client file descriptors.",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstMultiFdSink::add:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ * @fd: the file descriptor to add to multifdsink
+ *
+ * Hand the given open file descriptor to multifdsink to write to.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_ADD] =
+ g_signal_new ("add", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ add), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1,
+ G_TYPE_INT);
+ /**
+ * GstMultiFdSink::add-full:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ * @fd: the file descriptor to add to multifdsink
+ * @sync: the sync method to use
+ * @unit_type_min: the unit-type of @value_min
+ * @value_min: the minimum amount of data to burst expressed in
+ * @unit_type_min units.
+ * @unit_type_max: the unit-type of @value_max
+ * @value_max: the maximum amount of data to burst expressed in
+ * @unit_type_max units.
+ *
+ * Hand the given open file descriptor to multifdsink to write to and
+ * specify the burst parameters for the new connection.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_ADD_BURST] =
+ g_signal_new ("add-full", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ add_full), NULL, NULL,
+ gst_tcp_marshal_VOID__INT_ENUM_INT_UINT64_INT_UINT64, G_TYPE_NONE, 6,
+ G_TYPE_INT, GST_TYPE_SYNC_METHOD, GST_TYPE_UNIT_TYPE, G_TYPE_UINT64,
+ GST_TYPE_UNIT_TYPE, G_TYPE_UINT64);
+ /**
+ * GstMultiFdSink::remove:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ * @fd: the file descriptor to remove from multifdsink
+ *
+ * Remove the given open file descriptor from multifdsink.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_REMOVE] =
+ g_signal_new ("remove", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ remove), NULL, NULL, gst_tcp_marshal_VOID__INT, G_TYPE_NONE, 1,
+ G_TYPE_INT);
+ /**
+ * GstMultiFdSink::remove-flush:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ * @fd: the file descriptor to remove from multifdsink
+ *
+ * Remove the given open file descriptor from multifdsink after flushing all
+ * the pending data to the fd.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_REMOVE_FLUSH] =
+ g_signal_new ("remove-flush", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ remove_flush), NULL, NULL, gst_tcp_marshal_VOID__INT, G_TYPE_NONE, 1,
+ G_TYPE_INT);
+ /**
+ * GstMultiFdSink::clear:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ *
+ * Remove all file descriptors from multifdsink. Since multifdsink did not
+ * open fd's itself, it does not explicitly close the fd. The application
+ * should do so by connecting to the client-fd-removed callback.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_CLEAR] =
+ g_signal_new ("clear", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ clear), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /**
+ * GstMultiFdSink::get-stats:
+ * @gstmultifdsink: the multifdsink element to emit this signal on
+ * @fd: the file descriptor to get stats of from multifdsink
+ *
+ * Get statistics about @fd. This function returns a GValueArray to ease
+ * automatic wrapping for bindings.
+ *
+ * Returns: a GValueArray with the statistics. The array contains guint64
+ * values that represent respectively: total number of bytes sent, time
+ * when the client was added, time when the client was
+ * disconnected/removed, time the client is/was active, last activity
+ * time (in epoch seconds), number of buffers dropped.
+ * All times are expressed in nanoseconds (GstClockTime).
+ * The array can be 0-length if the client was not found.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_GET_STATS] =
+ g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ get_stats), NULL, NULL, gst_tcp_marshal_BOXED__INT,
+ G_TYPE_VALUE_ARRAY, 1, G_TYPE_INT);
+
+ /**
+ * GstMultiFdSink::client-added:
+ * @gstmultifdsink: the multifdsink element that emitted this signal
+ * @fd: the file descriptor that was added to multifdsink
+ *
+ * The given file descriptor was added to multifdsink. This signal will
+ * be emitted from the streaming thread so application should be prepared
+ * for that.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_ADDED] =
+ g_signal_new ("client-added", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiFdSinkClass, client_added),
+ NULL, NULL, gst_tcp_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+ /**
+ * GstMultiFdSink::client-removed:
+ * @gstmultifdsink: the multifdsink element that emitted this signal
+ * @fd: the file descriptor that is to be removed from multifdsink
+ * @status: the reason why the client was removed
+ *
+ * The given file descriptor is about to be removed from multifdsink. This
+ * signal will be emitted from the streaming thread so applications should
+ * be prepared for that.
+ *
+ * @gstmultifdsink still holds a handle to @fd so it is possible to call
+ * the get-stats signal from this callback. For the same reason it is
+ * not safe to close() and reuse @fd in this callback.
+ */
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_REMOVED] =
+ g_signal_new ("client-removed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ client_removed), NULL, NULL, gst_tcp_marshal_VOID__INT_BOXED,
+ G_TYPE_NONE, 2, G_TYPE_INT, GST_TYPE_CLIENT_STATUS);
+ /**
+ * GstMultiFdSink::client-fd-removed:
+ * @gstmultifdsink: the multifdsink element that emitted this signal
+ * @fd: the file descriptor that was removed from multifdsink
+ *
+ * The given file descriptor was removed from multifdsink. This signal will
+ * be emitted from the streaming thread so applications should be prepared
+ * for that.
+ *
+ * In this callback, @gstmultifdsink has removed all the information
+ * associated with @fd and it is therefore not possible to call get-stats
+ * with @fd. It is however safe to close() and reuse @fd in the callback.
+ *
+ * Since: 0.10.7
+ */
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_FD_REMOVED] =
+ g_signal_new ("client-fd-removed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiFdSinkClass,
+ client_fd_removed), NULL, NULL, gst_tcp_marshal_VOID__INT,
+ G_TYPE_NONE, 1, G_TYPE_INT);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Multi filedescriptor sink", "Sink/Network",
+ "Send data to multiple filedescriptors",
+ "Thomas Vander Stichele <thomas at apestaart dot org>, "
+ "Wim Taymans <wim@fluendo.com>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_multi_fd_sink_change_state);
+
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_render);
+
+ klass->add = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_add);
+ klass->add_full = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_add_full);
+ klass->remove = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_remove);
+ klass->remove_flush = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_remove_flush);
+ klass->clear = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_clear);
+ klass->get_stats = GST_DEBUG_FUNCPTR (gst_multi_fd_sink_get_stats);
+
+ GST_DEBUG_CATEGORY_INIT (multifdsink_debug, "multifdsink", 0, "FD sink");
+}
+
+static void
+gst_multi_fd_sink_init (GstMultiFdSink * this)
+{
+ GST_OBJECT_FLAG_UNSET (this, GST_MULTI_FD_SINK_OPEN);
+
+ this->mode = DEFAULT_MODE;
+
+ CLIENTS_LOCK_INIT (this);
+ this->clients = NULL;
+ this->fd_hash = g_hash_table_new (g_int_hash, g_int_equal);
+
+ this->bufqueue = g_array_new (FALSE, TRUE, sizeof (GstBuffer *));
+ this->unit_type = DEFAULT_UNIT_TYPE;
+ this->units_max = DEFAULT_UNITS_MAX;
+ this->units_soft_max = DEFAULT_UNITS_SOFT_MAX;
+ this->time_min = DEFAULT_TIME_MIN;
+ this->bytes_min = DEFAULT_BYTES_MIN;
+ this->buffers_min = DEFAULT_BUFFERS_MIN;
+ this->recover_policy = DEFAULT_RECOVER_POLICY;
+
+ this->timeout = DEFAULT_TIMEOUT;
+ this->def_sync_method = DEFAULT_SYNC_METHOD;
+ this->def_burst_unit = DEFAULT_BURST_UNIT;
+ this->def_burst_value = DEFAULT_BURST_VALUE;
+
+ this->qos_dscp = DEFAULT_QOS_DSCP;
+ this->handle_read = DEFAULT_HANDLE_READ;
+
+ this->resend_streamheader = DEFAULT_RESEND_STREAMHEADER;
+
+ this->header_flags = 0;
+}
+
+static void
+gst_multi_fd_sink_finalize (GObject * object)
+{
+ GstMultiFdSink *this;
+
+ this = GST_MULTI_FD_SINK (object);
+
+ CLIENTS_LOCK_FREE (this);
+ g_hash_table_destroy (this->fd_hash);
+ g_array_free (this->bufqueue, TRUE);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gint
+setup_dscp_client (GstMultiFdSink * sink, GstTCPClient * client)
+{
+ gint tos;
+ gint ret;
+ union gst_sockaddr
+ {
+ struct sockaddr sa;
+ struct sockaddr_in6 sa_in6;
+ struct sockaddr_storage sa_stor;
+ } sa;
+ socklen_t slen = sizeof (sa);
+ gint af;
+
+ /* don't touch */
+ if (sink->qos_dscp < 0)
+ return 0;
+
+ if ((ret = getsockname (client->fd.fd, &sa.sa, &slen)) < 0) {
+ GST_DEBUG_OBJECT (sink, "could not get sockname: %s", g_strerror (errno));
+ return ret;
+ }
+
+ af = sa.sa.sa_family;
+
+ /* if this is an IPv4-mapped address then do IPv4 QoS */
+ if (af == AF_INET6) {
+
+ GST_DEBUG_OBJECT (sink, "check IP6 socket");
+ if (IN6_IS_ADDR_V4MAPPED (&(sa.sa_in6.sin6_addr))) {
+ GST_DEBUG_OBJECT (sink, "mapped to IPV4");
+ af = AF_INET;
+ }
+ }
+
+ /* extract and shift 6 bits of the DSCP */
+ tos = (sink->qos_dscp & 0x3f) << 2;
+
+ switch (af) {
+ case AF_INET:
+ ret = setsockopt (client->fd.fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos));
+ break;
+ case AF_INET6:
+#ifdef IPV6_TCLASS
+ ret =
+ setsockopt (client->fd.fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,
+ sizeof (tos));
+ break;
+#endif
+ default:
+ ret = 0;
+ GST_ERROR_OBJECT (sink, "unsupported AF");
+ break;
+ }
+ if (ret)
+ GST_DEBUG_OBJECT (sink, "could not set DSCP: %s", g_strerror (errno));
+
+ return ret;
+}
+
+
+static void
+setup_dscp (GstMultiFdSink * sink)
+{
+ GList *clients, *next;
+
+ CLIENTS_LOCK (sink);
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+
+ setup_dscp_client (sink, client);
+ }
+ CLIENTS_UNLOCK (sink);
+}
+
+/* "add-full" signal implementation */
+void
+gst_multi_fd_sink_add_full (GstMultiFdSink * sink, int fd,
+ GstSyncMethod sync_method, GstTCPUnitType min_unit, guint64 min_value,
+ GstTCPUnitType max_unit, guint64 max_value)
+{
+ GstTCPClient *client;
+ GList *clink;
+ GTimeVal now;
+ gint flags;
+ struct stat statbuf;
+
+ GST_DEBUG_OBJECT (sink, "[fd %5d] adding client, sync_method %d, "
+ "min_unit %d, min_value %" G_GUINT64_FORMAT
+ ", max_unit %d, max_value %" G_GUINT64_FORMAT, fd, sync_method,
+ min_unit, min_value, max_unit, max_value);
+
+ /* do limits check if we can */
+ if (min_unit == max_unit) {
+ if (max_value != -1 && min_value != -1 && max_value < min_value)
+ goto wrong_limits;
+ }
+
+ /* create client datastructure */
+ client = g_new0 (GstTCPClient, 1);
+ client->fd.fd = fd;
+ client->status = GST_CLIENT_STATUS_OK;
+ client->bufpos = -1;
+ client->flushcount = -1;
+ client->bufoffset = 0;
+ client->sending = NULL;
+ client->bytes_sent = 0;
+ client->dropped_buffers = 0;
+ client->avg_queue_size = 0;
+ client->first_buffer_ts = GST_CLOCK_TIME_NONE;
+ client->last_buffer_ts = GST_CLOCK_TIME_NONE;
+ client->new_connection = TRUE;
+ client->burst_min_unit = min_unit;
+ client->burst_min_value = min_value;
+ client->burst_max_unit = max_unit;
+ client->burst_max_value = max_value;
+ client->sync_method = sync_method;
+ client->currently_removing = FALSE;
+
+ /* update start time */
+ g_get_current_time (&now);
+ client->connect_time = GST_TIMEVAL_TO_TIME (now);
+ client->disconnect_time = 0;
+ /* set last activity time to connect time */
+ client->last_activity_time = client->connect_time;
+
+ CLIENTS_LOCK (sink);
+
+ /* check the hash to find a duplicate fd */
+ clink = g_hash_table_lookup (sink->fd_hash, &client->fd.fd);
+ if (clink != NULL)
+ goto duplicate;
+
+ /* we can add the fd now */
+ clink = sink->clients = g_list_prepend (sink->clients, client);
+ g_hash_table_insert (sink->fd_hash, &client->fd.fd, clink);
+ sink->clients_cookie++;
+
+ /* set the socket to non blocking */
+ if (fcntl (fd, F_SETFL, O_NONBLOCK) < 0) {
+ GST_ERROR_OBJECT (sink, "failed to make socket %d non-blocking: %s", fd,
+ g_strerror (errno));
+ }
+
+ /* we always read from a client */
+ gst_poll_add_fd (sink->fdset, &client->fd);
+
+ /* we don't try to read from write only fds */
+ if (sink->handle_read) {
+ flags = fcntl (fd, F_GETFL, 0);
+ if ((flags & O_ACCMODE) != O_WRONLY) {
+ gst_poll_fd_ctl_read (sink->fdset, &client->fd, TRUE);
+ }
+ }
+ /* figure out the mode, can't use send() for non sockets */
+ if (fstat (fd, &statbuf) == 0 && S_ISSOCK (statbuf.st_mode)) {
+ client->is_socket = TRUE;
+ setup_dscp_client (sink, client);
+ }
+
+ gst_poll_restart (sink->fdset);
+
+ CLIENTS_UNLOCK (sink);
+
+ g_signal_emit (G_OBJECT (sink),
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_ADDED], 0, fd);
+
+ return;
+
+ /* errors */
+wrong_limits:
+ {
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] wrong values min =%" G_GUINT64_FORMAT ", max=%"
+ G_GUINT64_FORMAT ", unit %d specified when adding client", fd,
+ min_value, max_value, min_unit);
+ return;
+ }
+duplicate:
+ {
+ client->status = GST_CLIENT_STATUS_DUPLICATE;
+ CLIENTS_UNLOCK (sink);
+ GST_WARNING_OBJECT (sink, "[fd %5d] duplicate client found, refusing", fd);
+ g_signal_emit (G_OBJECT (sink),
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_REMOVED], 0, fd,
+ client->status);
+ g_free (client);
+ return;
+ }
+}
+
+/* "add" signal implemntation */
+void
+gst_multi_fd_sink_add (GstMultiFdSink * sink, int fd)
+{
+ gst_multi_fd_sink_add_full (sink, fd, sink->def_sync_method,
+ sink->def_burst_unit, sink->def_burst_value, sink->def_burst_unit, -1);
+}
+
+/* "remove" signal implementation */
+void
+gst_multi_fd_sink_remove (GstMultiFdSink * sink, int fd)
+{
+ GList *clink;
+
+ GST_DEBUG_OBJECT (sink, "[fd %5d] removing client", fd);
+
+ CLIENTS_LOCK (sink);
+ clink = g_hash_table_lookup (sink->fd_hash, &fd);
+ if (clink != NULL) {
+ GstTCPClient *client = (GstTCPClient *) clink->data;
+
+ if (client->status != GST_CLIENT_STATUS_OK) {
+ GST_INFO_OBJECT (sink,
+ "[fd %5d] Client already disconnecting with status %d",
+ fd, client->status);
+ goto done;
+ }
+
+ client->status = GST_CLIENT_STATUS_REMOVED;
+ gst_multi_fd_sink_remove_client_link (sink, clink);
+ gst_poll_restart (sink->fdset);
+ } else {
+ GST_WARNING_OBJECT (sink, "[fd %5d] no client with this fd found!", fd);
+ }
+
+done:
+ CLIENTS_UNLOCK (sink);
+}
+
+/* "remove-flush" signal implementation */
+void
+gst_multi_fd_sink_remove_flush (GstMultiFdSink * sink, int fd)
+{
+ GList *clink;
+
+ GST_DEBUG_OBJECT (sink, "[fd %5d] flushing client", fd);
+
+ CLIENTS_LOCK (sink);
+ clink = g_hash_table_lookup (sink->fd_hash, &fd);
+ if (clink != NULL) {
+ GstTCPClient *client = (GstTCPClient *) clink->data;
+
+ if (client->status != GST_CLIENT_STATUS_OK) {
+ GST_INFO_OBJECT (sink,
+ "[fd %5d] Client already disconnecting with status %d",
+ fd, client->status);
+ goto done;
+ }
+
+ /* take the position of the client as the number of buffers left to flush.
+ * If the client was at position -1, we flush 0 buffers, 0 == flush 1
+ * buffer, etc... */
+ client->flushcount = client->bufpos + 1;
+ /* mark client as flushing. We can not remove the client right away because
+ * it might have some buffers to flush in the ->sending queue. */
+ client->status = GST_CLIENT_STATUS_FLUSHING;
+ } else {
+ GST_WARNING_OBJECT (sink, "[fd %5d] no client with this fd found!", fd);
+ }
+done:
+ CLIENTS_UNLOCK (sink);
+}
+
+/* can be called both through the signal (i.e. from any thread) or when
+ * stopping, after the writing thread has shut down */
+void
+gst_multi_fd_sink_clear (GstMultiFdSink * sink)
+{
+ GList *clients, *next;
+ guint32 cookie;
+
+ GST_DEBUG_OBJECT (sink, "clearing all clients");
+
+ CLIENTS_LOCK (sink);
+restart:
+ cookie = sink->clients_cookie;
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+
+ if (cookie != sink->clients_cookie) {
+ GST_DEBUG_OBJECT (sink, "cookie changed while removing all clients");
+ goto restart;
+ }
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+
+ client->status = GST_CLIENT_STATUS_REMOVED;
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ }
+ gst_poll_restart (sink->fdset);
+ CLIENTS_UNLOCK (sink);
+}
+
+/* "get-stats" signal implementation
+ * the array returned contains:
+ *
+ * guint64 : bytes_sent
+ * guint64 : connect time (in nanoseconds, since Epoch)
+ * guint64 : disconnect time (in nanoseconds, since Epoch)
+ * guint64 : time the client is/was connected (in nanoseconds)
+ * guint64 : last activity time (in nanoseconds, since Epoch)
+ * guint64 : buffers dropped due to recovery
+ * guint64 : timestamp of the first buffer sent (in nanoseconds)
+ * guint64 : timestamp of the last buffer sent (in nanoseconds)
+ */
+GValueArray *
+gst_multi_fd_sink_get_stats (GstMultiFdSink * sink, int fd)
+{
+ GstTCPClient *client;
+ GValueArray *result = NULL;
+ GList *clink;
+
+ CLIENTS_LOCK (sink);
+ clink = g_hash_table_lookup (sink->fd_hash, &fd);
+ if (clink == NULL)
+ goto noclient;
+
+ client = (GstTCPClient *) clink->data;
+ if (client != NULL) {
+ GValue value = { 0 };
+ guint64 interval;
+
+ result = g_value_array_new (7);
+
+ 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->connect_time);
+ result = g_value_array_append (result, &value);
+ g_value_unset (&value);
+ if (client->disconnect_time == 0) {
+ GTimeVal nowtv;
+
+ g_get_current_time (&nowtv);
+
+ interval = GST_TIMEVAL_TO_TIME (nowtv) - client->connect_time;
+ } else {
+ interval = client->disconnect_time - client->connect_time;
+ }
+ 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_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, interval);
+ result = g_value_array_append (result, &value);
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, client->last_activity_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->dropped_buffers);
+ result = g_value_array_append (result, &value);
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, client->first_buffer_ts);
+ result = g_value_array_append (result, &value);
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, client->last_buffer_ts);
+ result = g_value_array_append (result, &value);
+ }
+
+noclient:
+ CLIENTS_UNLOCK (sink);
+
+ /* python doesn't like a NULL pointer yet */
+ if (result == NULL) {
+ GST_WARNING_OBJECT (sink, "[fd %5d] no client with this found!", fd);
+ result = g_value_array_new (0);
+ }
+
+ return result;
+}
+
+/* should be called with the clientslock helt.
+ * Note that we don't close the fd as we didn't open it in the first
+ * place. An application should connect to the client-fd-removed signal and
+ * close the fd itself.
+ */
+static void
+gst_multi_fd_sink_remove_client_link (GstMultiFdSink * sink, GList * link)
+{
+ int fd;
+ GTimeVal now;
+ GstTCPClient *client = (GstTCPClient *) link->data;
+ GstMultiFdSinkClass *fclass;
+
+ fclass = GST_MULTI_FD_SINK_GET_CLASS (sink);
+
+ fd = client->fd.fd;
+
+ if (client->currently_removing) {
+ GST_WARNING_OBJECT (sink, "[fd %5d] client is already being removed", fd);
+ return;
+ } else {
+ client->currently_removing = TRUE;
+ }
+
+ /* FIXME: if we keep track of ip we can log it here and signal */
+ switch (client->status) {
+ case GST_CLIENT_STATUS_OK:
+ GST_WARNING_OBJECT (sink, "[fd %5d] removing client %p for no reason",
+ fd, client);
+ break;
+ case GST_CLIENT_STATUS_CLOSED:
+ GST_DEBUG_OBJECT (sink, "[fd %5d] removing client %p because of close",
+ fd, client);
+ break;
+ case GST_CLIENT_STATUS_REMOVED:
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] removing client %p because the app removed it", fd, client);
+ break;
+ case GST_CLIENT_STATUS_SLOW:
+ GST_INFO_OBJECT (sink,
+ "[fd %5d] removing client %p because it was too slow", fd, client);
+ break;
+ case GST_CLIENT_STATUS_ERROR:
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] removing client %p because of error", fd, client);
+ break;
+ case GST_CLIENT_STATUS_FLUSHING:
+ default:
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] removing client %p with invalid reason %d", fd, client,
+ client->status);
+ break;
+ }
+
+ gst_poll_remove_fd (sink->fdset, &client->fd);
+
+ g_get_current_time (&now);
+ client->disconnect_time = GST_TIMEVAL_TO_TIME (now);
+
+ /* free client buffers */
+ g_slist_foreach (client->sending, (GFunc) gst_mini_object_unref, NULL);
+ g_slist_free (client->sending);
+ client->sending = NULL;
+
+ if (client->caps)
+ gst_caps_unref (client->caps);
+ client->caps = NULL;
+
+ /* unlock the mutex before signaling because the signal handler
+ * might query some properties */
+ CLIENTS_UNLOCK (sink);
+
+ g_signal_emit (G_OBJECT (sink),
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_REMOVED], 0, fd, client->status);
+
+ /* lock again before we remove the client completely */
+ CLIENTS_LOCK (sink);
+
+ /* fd cannot be reused in the above signal callback so we can safely
+ * remove it from the hashtable here */
+ if (!g_hash_table_remove (sink->fd_hash, &client->fd.fd)) {
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] error removing client %p from hash", client->fd.fd, client);
+ }
+ /* after releasing the lock above, the link could be invalid, more
+ * precisely, the next and prev pointers could point to invalid list
+ * links. One optimisation could be to add a cookie to the linked list
+ * and take a shortcut when it did not change between unlocking and locking
+ * our mutex. For now we just walk the list again. */
+ sink->clients = g_list_remove (sink->clients, client);
+ sink->clients_cookie++;
+
+ if (fclass->removed)
+ fclass->removed (sink, client->fd.fd);
+
+ g_free (client);
+ CLIENTS_UNLOCK (sink);
+
+ /* and the fd is really gone now */
+ g_signal_emit (G_OBJECT (sink),
+ gst_multi_fd_sink_signals[SIGNAL_CLIENT_FD_REMOVED], 0, fd);
+
+ CLIENTS_LOCK (sink);
+}
+
+/* handle a read on a client fd,
+ * which either indicates a close or should be ignored
+ * returns FALSE if some error occured or the client closed. */
+static gboolean
+gst_multi_fd_sink_handle_client_read (GstMultiFdSink * sink,
+ GstTCPClient * client)
+{
+ int avail, fd;
+ gboolean ret;
+
+ fd = client->fd.fd;
+
+ if (ioctl (fd, FIONREAD, &avail) < 0)
+ goto ioctl_failed;
+
+ GST_DEBUG_OBJECT (sink, "[fd %5d] select reports client read of %d bytes",
+ fd, avail);
+
+ ret = TRUE;
+
+ if (avail == 0) {
+ /* client sent close, so remove it */
+ GST_DEBUG_OBJECT (sink, "[fd %5d] client asked for close, removing", fd);
+ client->status = GST_CLIENT_STATUS_CLOSED;
+ ret = FALSE;
+ } else if (avail < 0) {
+ GST_WARNING_OBJECT (sink, "[fd %5d] avail < 0, removing", fd);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ ret = FALSE;
+ } else {
+ guint8 dummy[512];
+ gint nread;
+
+ /* just Read 'n' Drop, could also just drop the client as it's not supposed
+ * to write to us except for closing the socket, I guess it's because we
+ * like to listen to our customers. */
+ do {
+ /* this is the maximum we can read */
+ gint to_read = MIN (avail, 512);
+
+ GST_DEBUG_OBJECT (sink, "[fd %5d] client wants us to read %d bytes",
+ fd, to_read);
+
+ nread = read (fd, dummy, to_read);
+ if (nread < -1) {
+ GST_WARNING_OBJECT (sink, "[fd %5d] could not read %d bytes: %s (%d)",
+ fd, to_read, g_strerror (errno), errno);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ ret = FALSE;
+ break;
+ } else if (nread == 0) {
+ GST_WARNING_OBJECT (sink, "[fd %5d] 0 bytes in read, removing", fd);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ ret = FALSE;
+ break;
+ }
+ avail -= nread;
+ }
+ while (avail > 0);
+ }
+ return ret;
+
+ /* ERRORS */
+ioctl_failed:
+ {
+ GST_WARNING_OBJECT (sink, "[fd %5d] ioctl failed: %s (%d)",
+ fd, g_strerror (errno), errno);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ return FALSE;
+ }
+}
+
+static gboolean
+is_sync_frame (GstMultiFdSink * sink, GstBuffer * buffer)
+{
+ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) {
+ return FALSE;
+ } else if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* queue the given buffer for the given client, possibly adding the GDP
+ * header if GDP is being used */
+static gboolean
+gst_multi_fd_sink_client_queue_buffer (GstMultiFdSink * sink,
+ GstTCPClient * client, GstBuffer * buffer)
+{
+ GstCaps *caps;
+
+ /* TRUE: send them if the new caps have them */
+ gboolean send_streamheader = FALSE;
+ GstStructure *s;
+
+#if 0
+ /* before we queue the buffer, we check if we need to queue streamheader
+ * buffers (because it's a new client, or because they changed) */
+ caps = gst_buffer_get_caps (buffer); /* cleaned up after streamheader */
+#else
+ caps = NULL;
+#endif
+ if (!client->caps) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] no previous caps for this client, send streamheader",
+ client->fd.fd);
+ send_streamheader = TRUE;
+ client->caps = gst_caps_ref (caps);
+ } else {
+ /* there were previous caps recorded, so compare */
+ if (!gst_caps_is_equal (caps, client->caps)) {
+ const GValue *sh1, *sh2;
+
+ /* caps are not equal, but could still have the same streamheader */
+ s = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_has_field (s, "streamheader")) {
+ /* no new streamheader, so nothing new to send */
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] new caps do not have streamheader, not sending",
+ client->fd.fd);
+ } else {
+ /* there is a new streamheader */
+ s = gst_caps_get_structure (client->caps, 0);
+ if (!gst_structure_has_field (s, "streamheader")) {
+ /* no previous streamheader, so send the new one */
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] previous caps did not have streamheader, sending",
+ client->fd.fd);
+ send_streamheader = TRUE;
+ } else {
+ /* both old and new caps have streamheader set */
+ if (!sink->resend_streamheader) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] asked to not resend the streamheader, not sending",
+ client->fd.fd);
+ send_streamheader = FALSE;
+ } else {
+ sh1 = gst_structure_get_value (s, "streamheader");
+ s = gst_caps_get_structure (caps, 0);
+ sh2 = gst_structure_get_value (s, "streamheader");
+ if (gst_value_compare (sh1, sh2) != GST_VALUE_EQUAL) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] new streamheader different from old, sending",
+ client->fd.fd);
+ send_streamheader = TRUE;
+ }
+ }
+ }
+ }
+ }
+ /* Replace the old caps */
+ gst_caps_unref (client->caps);
+ client->caps = gst_caps_ref (caps);
+ }
+
+ if (G_UNLIKELY (send_streamheader)) {
+ const GValue *sh;
+ GArray *buffers;
+ int i;
+
+ GST_LOG_OBJECT (sink,
+ "[fd %5d] sending streamheader from caps %" GST_PTR_FORMAT,
+ client->fd.fd, caps);
+ s = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_has_field (s, "streamheader")) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] no new streamheader, so nothing to send", client->fd.fd);
+ } else {
+ GST_LOG_OBJECT (sink,
+ "[fd %5d] sending streamheader from caps %" GST_PTR_FORMAT,
+ client->fd.fd, caps);
+ sh = gst_structure_get_value (s, "streamheader");
+ g_assert (G_VALUE_TYPE (sh) == GST_TYPE_ARRAY);
+ buffers = g_value_peek_pointer (sh);
+ GST_DEBUG_OBJECT (sink, "%d streamheader buffers", buffers->len);
+ for (i = 0; i < buffers->len; ++i) {
+ GValue *bufval;
+ GstBuffer *buffer;
+
+ bufval = &g_array_index (buffers, GValue, i);
+ g_assert (G_VALUE_TYPE (bufval) == GST_TYPE_BUFFER);
+ buffer = g_value_peek_pointer (bufval);
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] queueing streamheader buffer of length %" G_GSIZE_FORMAT,
+ client->fd.fd, gst_buffer_get_size (buffer));
+ gst_buffer_ref (buffer);
+
+ client->sending = g_slist_append (client->sending, buffer);
+ }
+ }
+ }
+
+ gst_caps_unref (caps);
+ caps = NULL;
+
+ GST_LOG_OBJECT (sink, "[fd %5d] queueing buffer of length %" G_GSIZE_FORMAT,
+ client->fd.fd, gst_buffer_get_size (buffer));
+
+ gst_buffer_ref (buffer);
+ client->sending = g_slist_append (client->sending, buffer);
+
+ return TRUE;
+}
+
+/* find the keyframe in the list of buffers starting the
+ * search from @idx. @direction as -1 will search backwards,
+ * 1 will search forwards.
+ * Returns: the index or -1 if there is no keyframe after idx.
+ */
+static gint
+find_syncframe (GstMultiFdSink * sink, gint idx, gint direction)
+{
+ gint i, len, result;
+
+ /* take length of queued buffers */
+ len = sink->bufqueue->len;
+
+ /* assume we don't find a keyframe */
+ result = -1;
+
+ /* then loop over all buffers to find the first keyframe */
+ for (i = idx; i >= 0 && i < len; i += direction) {
+ GstBuffer *buf;
+
+ buf = g_array_index (sink->bufqueue, GstBuffer *, i);
+ if (is_sync_frame (sink, buf)) {
+ GST_LOG_OBJECT (sink, "found keyframe at %d from %d, direction %d",
+ i, idx, direction);
+ result = i;
+ break;
+ }
+ }
+ return result;
+}
+
+#define find_next_syncframe(s,i) find_syncframe(s,i,1)
+#define find_prev_syncframe(s,i) find_syncframe(s,i,-1)
+
+/* Get the number of buffers from the buffer queue needed to satisfy
+ * the maximum max in the configured units.
+ * If units are not BUFFERS, and there are insufficient buffers in the
+ * queue to satify the limit, return len(queue) + 1 */
+static gint
+get_buffers_max (GstMultiFdSink * sink, gint64 max)
+{
+ switch (sink->unit_type) {
+ case GST_TCP_UNIT_TYPE_BUFFERS:
+ return max;
+ case GST_TCP_UNIT_TYPE_TIME:
+ {
+ GstBuffer *buf;
+ int i;
+ int len;
+ gint64 diff;
+ GstClockTime first = GST_CLOCK_TIME_NONE;
+
+ len = sink->bufqueue->len;
+
+ for (i = 0; i < len; i++) {
+ buf = g_array_index (sink->bufqueue, GstBuffer *, i);
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ if (first == -1)
+ first = GST_BUFFER_TIMESTAMP (buf);
+
+ diff = first - GST_BUFFER_TIMESTAMP (buf);
+
+ if (diff > max)
+ return i + 1;
+ }
+ }
+ return len + 1;
+ }
+ case GST_TCP_UNIT_TYPE_BYTES:
+ {
+ GstBuffer *buf;
+ int i;
+ int len;
+ gint acc = 0;
+
+ len = sink->bufqueue->len;
+
+ for (i = 0; i < len; i++) {
+ buf = g_array_index (sink->bufqueue, GstBuffer *, i);
+ acc += gst_buffer_get_size (buf);
+
+ if (acc > max)
+ return i + 1;
+ }
+ return len + 1;
+ }
+ default:
+ return max;
+ }
+}
+
+/* find the positions in the buffer queue where *_min and *_max
+ * is satisfied
+ */
+/* count the amount of data in the buffers and return the index
+ * that satifies the given limits.
+ *
+ * Returns: index @idx in the buffer queue so that the given limits are
+ * satisfied. TRUE if all the limits could be satisfied, FALSE if not
+ * enough data was in the queue.
+ *
+ * FIXME, this code might now work if any of the units is in buffers...
+ */
+static gboolean
+find_limits (GstMultiFdSink * sink,
+ gint * min_idx, gint bytes_min, gint buffers_min, gint64 time_min,
+ gint * max_idx, gint bytes_max, gint buffers_max, gint64 time_max)
+{
+ GstClockTime first, time;
+ gint i, len, bytes;
+ gboolean result, max_hit;
+
+ /* take length of queue */
+ len = sink->bufqueue->len;
+
+ /* this must hold */
+ g_assert (len > 0);
+
+ GST_LOG_OBJECT (sink,
+ "bytes_min %d, buffers_min %d, time_min %" GST_TIME_FORMAT
+ ", bytes_max %d, buffers_max %d, time_max %" GST_TIME_FORMAT, bytes_min,
+ buffers_min, GST_TIME_ARGS (time_min), bytes_max, buffers_max,
+ GST_TIME_ARGS (time_max));
+
+ /* do the trivial buffer limit test */
+ if (buffers_min != -1 && len < buffers_min) {
+ *min_idx = len - 1;
+ *max_idx = len - 1;
+ return FALSE;
+ }
+
+ result = FALSE;
+ /* else count bytes and time */
+ first = -1;
+ bytes = 0;
+ /* unset limits */
+ *min_idx = -1;
+ *max_idx = -1;
+ max_hit = FALSE;
+
+ i = 0;
+ /* loop through the buffers, when a limit is ok, mark it
+ * as -1, we have at least one buffer in the queue. */
+ do {
+ GstBuffer *buf;
+
+ /* if we checked all min limits, update result */
+ if (bytes_min == -1 && time_min == -1 && *min_idx == -1) {
+ /* don't go below 0 */
+ *min_idx = MAX (i - 1, 0);
+ }
+ /* if we reached one max limit break out */
+ if (max_hit) {
+ /* i > 0 when we get here, we subtract one to get the position
+ * of the previous buffer. */
+ *max_idx = i - 1;
+ /* we have valid complete result if we found a min_idx too */
+ result = *min_idx != -1;
+ break;
+ }
+ buf = g_array_index (sink->bufqueue, GstBuffer *, i);
+
+ bytes += gst_buffer_get_size (buf);
+
+ /* take timestamp and save for the base first timestamp */
+ if ((time = GST_BUFFER_TIMESTAMP (buf)) != -1) {
+ GST_LOG_OBJECT (sink, "Ts %" GST_TIME_FORMAT " on buffer",
+ GST_TIME_ARGS (time));
+ if (first == -1)
+ first = time;
+
+ /* increase max usage if we did not fill enough. Note that
+ * buffers are sorted from new to old, so the first timestamp is
+ * bigger than the next one. */
+ if (time_min != -1 && first - time >= time_min)
+ time_min = -1;
+ if (time_max != -1 && first - time >= time_max)
+ max_hit = TRUE;
+ } else {
+ GST_LOG_OBJECT (sink, "No timestamp on buffer");
+ }
+ /* time is OK or unknown, check and increase if not enough bytes */
+ if (bytes_min != -1) {
+ if (bytes >= bytes_min)
+ bytes_min = -1;
+ }
+ if (bytes_max != -1) {
+ if (bytes >= bytes_max) {
+ max_hit = TRUE;
+ }
+ }
+ i++;
+ }
+ while (i < len);
+
+ /* if we did not hit the max or min limit, set to buffer size */
+ if (*max_idx == -1)
+ *max_idx = len - 1;
+ /* make sure min does not exceed max */
+ if (*min_idx == -1)
+ *min_idx = *max_idx;
+
+ return result;
+}
+
+/* parse the unit/value pair and assign it to the result value of the
+ * right type, leave the other values untouched
+ *
+ * Returns: FALSE if the unit is unknown or undefined. TRUE otherwise.
+ */
+static gboolean
+assign_value (GstTCPUnitType unit, guint64 value, gint * bytes, gint * buffers,
+ GstClockTime * time)
+{
+ gboolean res = TRUE;
+
+ /* set only the limit of the given format to the given value */
+ switch (unit) {
+ case GST_TCP_UNIT_TYPE_BUFFERS:
+ *buffers = (gint) value;
+ break;
+ case GST_TCP_UNIT_TYPE_TIME:
+ *time = value;
+ break;
+ case GST_TCP_UNIT_TYPE_BYTES:
+ *bytes = (gint) value;
+ break;
+ case GST_TCP_UNIT_TYPE_UNDEFINED:
+ default:
+ res = FALSE;
+ break;
+ }
+ return res;
+}
+
+/* count the index in the buffer queue to satisfy the given unit
+ * and value pair starting from buffer at index 0.
+ *
+ * Returns: TRUE if there was enough data in the queue to satisfy the
+ * burst values. @idx contains the index in the buffer that contains enough
+ * data to satisfy the limits or the last buffer in the queue when the
+ * function returns FALSE.
+ */
+static gboolean
+count_burst_unit (GstMultiFdSink * sink, gint * min_idx,
+ GstTCPUnitType min_unit, guint64 min_value, gint * max_idx,
+ GstTCPUnitType max_unit, guint64 max_value)
+{
+ gint bytes_min = -1, buffers_min = -1;
+ gint bytes_max = -1, buffers_max = -1;
+ GstClockTime time_min = GST_CLOCK_TIME_NONE, time_max = GST_CLOCK_TIME_NONE;
+
+ assign_value (min_unit, min_value, &bytes_min, &buffers_min, &time_min);
+ assign_value (max_unit, max_value, &bytes_max, &buffers_max, &time_max);
+
+ return find_limits (sink, min_idx, bytes_min, buffers_min, time_min,
+ max_idx, bytes_max, buffers_max, time_max);
+}
+
+/* decide where in the current buffer queue this new client should start
+ * receiving buffers from.
+ * This function is called whenever a client is connected and has not yet
+ * received a buffer.
+ * If this returns -1, it means that we haven't found a good point to
+ * start streaming from yet, and this function should be called again later
+ * when more buffers have arrived.
+ */
+static gint
+gst_multi_fd_sink_new_client (GstMultiFdSink * sink, GstTCPClient * client)
+{
+ gint result;
+
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] new client, deciding where to start in queue", client->fd.fd);
+ GST_DEBUG_OBJECT (sink, "queue is currently %d buffers long",
+ sink->bufqueue->len);
+ switch (client->sync_method) {
+ case GST_SYNC_METHOD_LATEST:
+ /* no syncing, we are happy with whatever the client is going to get */
+ result = client->bufpos;
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_LATEST, position %d", client->fd.fd, result);
+ break;
+ case GST_SYNC_METHOD_NEXT_KEYFRAME:
+ {
+ /* if one of the new buffers (between client->bufpos and 0) in the queue
+ * is a sync point, we can proceed, otherwise we need to keep waiting */
+ GST_LOG_OBJECT (sink,
+ "[fd %5d] new client, bufpos %d, waiting for keyframe", client->fd.fd,
+ client->bufpos);
+
+ result = find_prev_syncframe (sink, client->bufpos);
+ if (result != -1) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_NEXT_KEYFRAME: result %d",
+ client->fd.fd, result);
+ break;
+ }
+
+ /* client is not on a syncbuffer, need to skip these buffers and
+ * wait some more */
+ GST_LOG_OBJECT (sink,
+ "[fd %5d] new client, skipping buffer(s), no syncpoint found",
+ client->fd.fd);
+ client->bufpos = -1;
+ break;
+ }
+ case GST_SYNC_METHOD_LATEST_KEYFRAME:
+ {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_LATEST_KEYFRAME", client->fd.fd);
+
+ /* for new clients we initially scan the complete buffer queue for
+ * a sync point when a buffer is added. If we don't find a keyframe,
+ * we need to wait for the next keyframe and so we change the client's
+ * sync method to GST_SYNC_METHOD_NEXT_KEYFRAME.
+ */
+ result = find_next_syncframe (sink, 0);
+ if (result != -1) {
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_LATEST_KEYFRAME: result %d", client->fd.fd,
+ result);
+ break;
+ }
+
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_LATEST_KEYFRAME: no keyframe found, "
+ "switching to SYNC_METHOD_NEXT_KEYFRAME", client->fd.fd);
+ /* throw client to the waiting state */
+ client->bufpos = -1;
+ /* and make client sync to next keyframe */
+ client->sync_method = GST_SYNC_METHOD_NEXT_KEYFRAME;
+ break;
+ }
+ case GST_SYNC_METHOD_BURST:
+ {
+ gboolean ok;
+ gint max;
+
+ /* move to the position where we satisfy the client's burst
+ * parameters. If we could not satisfy the parameters because there
+ * is not enough data, we just send what we have (which is in result).
+ * We use the max value to limit the search
+ */
+ ok = count_burst_unit (sink, &result, client->burst_min_unit,
+ client->burst_min_value, &max, client->burst_max_unit,
+ client->burst_max_value);
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_BURST: burst_unit returned %d, result %d",
+ client->fd.fd, ok, result);
+
+ GST_LOG_OBJECT (sink, "min %d, max %d", result, max);
+
+ /* we hit the max and it is below the min, use that then */
+ if (max != -1 && max <= result) {
+ result = MAX (max - 1, 0);
+ GST_DEBUG_OBJECT (sink,
+ "[fd %5d] SYNC_METHOD_BURST: result above max, taken down to %d",
+ client->fd.fd, result);
+ }
+ break;
+ }
+ case GST_SYNC_METHOD_BURST_KEYFRAME:
+ {
+ gint min_idx, max_idx;
+ gint next_syncframe, prev_syncframe;
+
+ /* BURST_KEYFRAME:
+ *
+ * _always_ start sending a keyframe to the client. We first search
+ * a keyframe between min/max limits. If there is none, we send it the
+ * last keyframe before min. If there is none, the behaviour is like
+ * NEXT_KEYFRAME.
+ */
+ /* gather burst limits */
+ count_burst_unit (sink, &min_idx, client->burst_min_unit,
+ client->burst_min_value, &max_idx, client->burst_max_unit,
+ client->burst_max_value);
+
+ GST_LOG_OBJECT (sink, "min %d, max %d", min_idx, max_idx);
+
+ /* first find a keyframe after min_idx */
+ next_syncframe = find_next_syncframe (sink, min_idx);
+ if (next_syncframe != -1 && next_syncframe < max_idx) {
+ /* we have a valid keyframe and it's below the max */
+ GST_LOG_OBJECT (sink, "found keyframe in min/max limits");
+ result = next_syncframe;
+ break;
+ }
+
+ /* no valid keyframe, try to find one below min */
+ prev_syncframe = find_prev_syncframe (sink, min_idx);
+ if (prev_syncframe != -1) {
+ GST_WARNING_OBJECT (sink,
+ "using keyframe below min in BURST_KEYFRAME sync mode");
+ result = prev_syncframe;
+ break;
+ }
+
+ /* no prev keyframe or not enough data */
+ GST_WARNING_OBJECT (sink,
+ "no prev keyframe found in BURST_KEYFRAME sync mode, waiting for next");
+
+ /* throw client to the waiting state */
+ client->bufpos = -1;
+ /* and make client sync to next keyframe */
+ client->sync_method = GST_SYNC_METHOD_NEXT_KEYFRAME;
+ result = -1;
+ break;
+ }
+ case GST_SYNC_METHOD_BURST_WITH_KEYFRAME:
+ {
+ gint min_idx, max_idx;
+ gint next_syncframe;
+
+ /* BURST_WITH_KEYFRAME:
+ *
+ * try to start sending a keyframe to the client. We first search
+ * a keyframe between min/max limits. If there is none, we send it the
+ * amount of data up 'till min.
+ */
+ /* gather enough data to burst */
+ count_burst_unit (sink, &min_idx, client->burst_min_unit,
+ client->burst_min_value, &max_idx, client->burst_max_unit,
+ client->burst_max_value);
+
+ GST_LOG_OBJECT (sink, "min %d, max %d", min_idx, max_idx);
+
+ /* first find a keyframe after min_idx */
+ next_syncframe = find_next_syncframe (sink, min_idx);
+ if (next_syncframe != -1 && next_syncframe < max_idx) {
+ /* we have a valid keyframe and it's below the max */
+ GST_LOG_OBJECT (sink, "found keyframe in min/max limits");
+ result = next_syncframe;
+ break;
+ }
+
+ /* no keyframe, send data from min_idx */
+ GST_WARNING_OBJECT (sink, "using min in BURST_WITH_KEYFRAME sync mode");
+
+ /* make sure we don't go over the max limit */
+ if (max_idx != -1 && max_idx <= min_idx) {
+ result = MAX (max_idx - 1, 0);
+ } else {
+ result = min_idx;
+ }
+
+ break;
+ }
+ default:
+ g_warning ("unknown sync method %d", client->sync_method);
+ result = client->bufpos;
+ break;
+ }
+ return result;
+}
+
+/* Handle a write on a client,
+ * which indicates a read request from a client.
+ *
+ * For each client we maintain a queue of GstBuffers that contain the raw bytes
+ * we need to send to the client. In the case of the GDP protocol, we create
+ * buffers out of the header bytes so that we can focus only on sending
+ * buffers.
+ *
+ * We first check to see if we need to send caps (in GDP) and streamheaders.
+ * If so, we queue them.
+ *
+ * Then we run into the main loop that tries to send as many buffers as
+ * possible. It will first exhaust the client->sending queue and if the queue
+ * is empty, it will pick a buffer from the global queue.
+ *
+ * Sending the buffers from the client->sending queue is basically writing
+ * the bytes to the socket and maintaining a count of the bytes that were
+ * sent. When the buffer is completely sent, it is removed from the
+ * client->sending queue and we try to pick a new buffer for sending.
+ *
+ * When the sending returns a partial buffer we stop sending more data as
+ * the next send operation could block.
+ *
+ * This functions returns FALSE if some error occured.
+ */
+static gboolean
+gst_multi_fd_sink_handle_client_write (GstMultiFdSink * sink,
+ GstTCPClient * client)
+{
+ int fd = client->fd.fd;
+ gboolean more;
+ gboolean flushing;
+ GstClockTime now;
+ GTimeVal nowtv;
+
+ g_get_current_time (&nowtv);
+ now = GST_TIMEVAL_TO_TIME (nowtv);
+
+ flushing = client->status == GST_CLIENT_STATUS_FLUSHING;
+
+ more = TRUE;
+ do {
+ gint maxsize;
+
+ if (!client->sending) {
+ /* client is not working on a buffer */
+ if (client->bufpos == -1) {
+ /* client is too fast, remove from write queue until new buffer is
+ * available */
+ gst_poll_fd_ctl_write (sink->fdset, &client->fd, FALSE);
+ /* if we flushed out all of the client buffers, we can stop */
+ if (client->flushcount == 0)
+ goto flushed;
+
+ return TRUE;
+ } else {
+ /* client can pick a buffer from the global queue */
+ GstBuffer *buf;
+ GstClockTime timestamp;
+
+ /* for new connections, we need to find a good spot in the
+ * bufqueue to start streaming from */
+ if (client->new_connection && !flushing) {
+ gint position = gst_multi_fd_sink_new_client (sink, client);
+
+ if (position >= 0) {
+ /* we got a valid spot in the queue */
+ client->new_connection = FALSE;
+ client->bufpos = position;
+ } else {
+ /* cannot send data to this client yet */
+ gst_poll_fd_ctl_write (sink->fdset, &client->fd, FALSE);
+ return TRUE;
+ }
+ }
+
+ /* we flushed all remaining buffers, no need to get a new one */
+ if (client->flushcount == 0)
+ goto flushed;
+
+ /* grab buffer */
+ buf = g_array_index (sink->bufqueue, GstBuffer *, client->bufpos);
+ client->bufpos--;
+
+ /* update stats */
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ if (client->first_buffer_ts == GST_CLOCK_TIME_NONE)
+ client->first_buffer_ts = timestamp;
+ if (timestamp != -1)
+ client->last_buffer_ts = timestamp;
+
+ /* decrease flushcount */
+ if (client->flushcount != -1)
+ client->flushcount--;
+
+ GST_LOG_OBJECT (sink, "[fd %5d] client %p at position %d",
+ fd, client, client->bufpos);
+
+ /* queueing a buffer will ref it */
+ gst_multi_fd_sink_client_queue_buffer (sink, client, buf);
+
+ /* need to start from the first byte for this new buffer */
+ client->bufoffset = 0;
+ }
+ }
+
+ /* see if we need to send something */
+ if (client->sending) {
+ ssize_t wrote;
+ GstBuffer *head;
+ guint8 *data;
+ gsize size;
+
+ /* pick first buffer from list */
+ head = GST_BUFFER (client->sending->data);
+
+ data = gst_buffer_map (head, &size, NULL, GST_MAP_READ);
+ maxsize = size - client->bufoffset;
+
+ /* try to write the complete buffer */
+#ifdef MSG_NOSIGNAL
+#define FLAGS MSG_NOSIGNAL
+#else
+#define FLAGS 0
+#endif
+ if (client->is_socket) {
+ wrote = send (fd, data + client->bufoffset, maxsize, FLAGS);
+ } else {
+ wrote = write (fd, data + client->bufoffset, maxsize);
+ }
+ gst_buffer_unmap (head, data, size);
+
+ if (wrote < 0) {
+ /* hmm error.. */
+ if (errno == EAGAIN) {
+ /* nothing serious, resource was unavailable, try again later */
+ more = FALSE;
+ } else if (errno == ECONNRESET) {
+ goto connection_reset;
+ } else {
+ goto write_error;
+ }
+ } else {
+ if (wrote < maxsize) {
+ /* partial write means that the client cannot read more and we should
+ * stop sending more */
+ GST_LOG_OBJECT (sink,
+ "partial write on %d of %" G_GSSIZE_FORMAT " bytes", fd, wrote);
+ client->bufoffset += wrote;
+ more = FALSE;
+ } else {
+ /* complete buffer was written, we can proceed to the next one */
+ client->sending = g_slist_remove (client->sending, head);
+ gst_buffer_unref (head);
+ /* make sure we start from byte 0 for the next buffer */
+ client->bufoffset = 0;
+ }
+ /* update stats */
+ client->bytes_sent += wrote;
+ client->last_activity_time = now;
+ sink->bytes_served += wrote;
+ }
+ }
+ } while (more);
+
+ return TRUE;
+
+ /* ERRORS */
+flushed:
+ {
+ GST_DEBUG_OBJECT (sink, "[fd %5d] flushed, removing", fd);
+ client->status = GST_CLIENT_STATUS_REMOVED;
+ return FALSE;
+ }
+connection_reset:
+ {
+ GST_DEBUG_OBJECT (sink, "[fd %5d] connection reset by peer, removing", fd);
+ client->status = GST_CLIENT_STATUS_CLOSED;
+ return FALSE;
+ }
+write_error:
+ {
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] could not write, removing client: %s (%d)", fd,
+ g_strerror (errno), errno);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ return FALSE;
+ }
+}
+
+/* calculate the new position for a client after recovery. This function
+ * does not update the client position but merely returns the required
+ * position.
+ */
+static gint
+gst_multi_fd_sink_recover_client (GstMultiFdSink * sink, GstTCPClient * client)
+{
+ gint newbufpos;
+
+ GST_WARNING_OBJECT (sink,
+ "[fd %5d] client %p is lagging at %d, recover using policy %d",
+ client->fd.fd, client, client->bufpos, sink->recover_policy);
+
+ switch (sink->recover_policy) {
+ case GST_RECOVER_POLICY_NONE:
+ /* do nothing, client will catch up or get kicked out when it reaches
+ * the hard max */
+ newbufpos = client->bufpos;
+ break;
+ case GST_RECOVER_POLICY_RESYNC_LATEST:
+ /* move to beginning of queue */
+ newbufpos = -1;
+ break;
+ case GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT:
+ /* move to beginning of soft max */
+ newbufpos = get_buffers_max (sink, sink->units_soft_max);
+ break;
+ case GST_RECOVER_POLICY_RESYNC_KEYFRAME:
+ /* find keyframe in buffers, we search backwards to find the
+ * closest keyframe relative to what this client already received. */
+ newbufpos = MIN (sink->bufqueue->len - 1,
+ get_buffers_max (sink, sink->units_soft_max) - 1);
+
+ while (newbufpos >= 0) {
+ GstBuffer *buf;
+
+ buf = g_array_index (sink->bufqueue, GstBuffer *, newbufpos);
+ if (is_sync_frame (sink, buf)) {
+ /* found a buffer that is not a delta unit */
+ break;
+ }
+ newbufpos--;
+ }
+ break;
+ default:
+ /* unknown recovery procedure */
+ newbufpos = get_buffers_max (sink, sink->units_soft_max);
+ break;
+ }
+ return newbufpos;
+}
+
+/* Queue a buffer on the global queue.
+ *
+ * This function adds the buffer to the front of a GArray. It removes the
+ * tail buffer if the max queue size is exceeded, unreffing the queued buffer.
+ * Note that unreffing the buffer is not a problem as clients who
+ * started writing out this buffer will still have a reference to it in the
+ * client->sending queue.
+ *
+ * After adding the buffer, we update all client positions in the queue. If
+ * a client moves over the soft max, we start the recovery procedure for this
+ * slow client. If it goes over the hard max, it is put into the slow list
+ * and removed.
+ *
+ * Special care is taken of clients that were waiting for a new buffer (they
+ * had a position of -1) because they can proceed after adding this new buffer.
+ * This is done by adding the client back into the write fd_set and signalling
+ * the select thread that the fd_set changed.
+ */
+static void
+gst_multi_fd_sink_queue_buffer (GstMultiFdSink * sink, GstBuffer * buf)
+{
+ GList *clients, *next;
+ gint queuelen;
+ gboolean need_signal = FALSE;
+ gint max_buffer_usage;
+ gint i;
+ GTimeVal nowtv;
+ GstClockTime now;
+ gint max_buffers, soft_max_buffers;
+ guint cookie;
+
+ g_get_current_time (&nowtv);
+ now = GST_TIMEVAL_TO_TIME (nowtv);
+
+ CLIENTS_LOCK (sink);
+ /* add buffer to queue */
+ g_array_prepend_val (sink->bufqueue, buf);
+ queuelen = sink->bufqueue->len;
+
+ if (sink->units_max > 0)
+ max_buffers = get_buffers_max (sink, sink->units_max);
+ else
+ max_buffers = -1;
+
+ if (sink->units_soft_max > 0)
+ soft_max_buffers = get_buffers_max (sink, sink->units_soft_max);
+ else
+ soft_max_buffers = -1;
+ GST_LOG_OBJECT (sink, "Using max %d, softmax %d", max_buffers,
+ soft_max_buffers);
+
+ /* then loop over the clients and update the positions */
+ max_buffer_usage = 0;
+
+restart:
+ cookie = sink->clients_cookie;
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+
+ if (cookie != sink->clients_cookie) {
+ GST_DEBUG_OBJECT (sink, "Clients cookie outdated, restarting");
+ goto restart;
+ }
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+
+ client->bufpos++;
+ GST_LOG_OBJECT (sink, "[fd %5d] client %p at position %d",
+ client->fd.fd, client, client->bufpos);
+ /* check soft max if needed, recover client */
+ if (soft_max_buffers > 0 && client->bufpos >= soft_max_buffers) {
+ gint newpos;
+
+ newpos = gst_multi_fd_sink_recover_client (sink, client);
+ if (newpos != client->bufpos) {
+ client->dropped_buffers += client->bufpos - newpos;
+ client->bufpos = newpos;
+ client->discont = TRUE;
+ GST_INFO_OBJECT (sink, "[fd %5d] client %p position reset to %d",
+ client->fd.fd, client, client->bufpos);
+ } else {
+ GST_INFO_OBJECT (sink,
+ "[fd %5d] client %p not recovering position",
+ client->fd.fd, client);
+ }
+ }
+ /* check hard max and timeout, remove client */
+ if ((max_buffers > 0 && client->bufpos >= max_buffers) ||
+ (sink->timeout > 0
+ && now - client->last_activity_time > sink->timeout)) {
+ /* remove client */
+ GST_WARNING_OBJECT (sink, "[fd %5d] client %p is too slow, removing",
+ client->fd.fd, client);
+ /* remove the client, the fd set will be cleared and the select thread
+ * will be signaled */
+ client->status = GST_CLIENT_STATUS_SLOW;
+ /* set client to invalid position while being removed */
+ client->bufpos = -1;
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ need_signal = TRUE;
+ continue;
+ } else if (client->bufpos == 0 || client->new_connection) {
+ /* can send data to this client now. need to signal the select thread that
+ * the fd_set changed */
+ gst_poll_fd_ctl_write (sink->fdset, &client->fd, TRUE);
+ need_signal = TRUE;
+ }
+ /* keep track of maximum buffer usage */
+ if (client->bufpos > max_buffer_usage) {
+ max_buffer_usage = client->bufpos;
+ }
+ }
+
+ /* make sure we respect bytes-min, buffers-min and time-min when they are set */
+ {
+ gint usage, max;
+
+ GST_LOG_OBJECT (sink,
+ "extending queue %d to respect time_min %" GST_TIME_FORMAT
+ ", bytes_min %d, buffers_min %d", max_buffer_usage,
+ GST_TIME_ARGS (sink->time_min), sink->bytes_min, sink->buffers_min);
+
+ /* get index where the limits are ok, we don't really care if all limits
+ * are ok, we just queue as much as we need. We also don't compare against
+ * the max limits. */
+ find_limits (sink, &usage, sink->bytes_min, sink->buffers_min,
+ sink->time_min, &max, -1, -1, -1);
+
+ max_buffer_usage = MAX (max_buffer_usage, usage + 1);
+ GST_LOG_OBJECT (sink, "extended queue to %d", max_buffer_usage);
+ }
+
+ /* now look for sync points and make sure there is at least one
+ * sync point in the queue. We only do this if the LATEST_KEYFRAME or
+ * BURST_KEYFRAME mode is selected */
+ if (sink->def_sync_method == GST_SYNC_METHOD_LATEST_KEYFRAME ||
+ sink->def_sync_method == GST_SYNC_METHOD_BURST_KEYFRAME) {
+ /* no point in searching beyond the queue length */
+ gint limit = queuelen;
+ GstBuffer *buf;
+
+ /* no point in searching beyond the soft-max if any. */
+ if (soft_max_buffers > 0) {
+ limit = MIN (limit, soft_max_buffers);
+ }
+ GST_LOG_OBJECT (sink,
+ "extending queue to include sync point, now at %d, limit is %d",
+ max_buffer_usage, limit);
+ for (i = 0; i < limit; i++) {
+ buf = g_array_index (sink->bufqueue, GstBuffer *, i);
+ if (is_sync_frame (sink, buf)) {
+ /* found a sync frame, now extend the buffer usage to
+ * include at least this frame. */
+ max_buffer_usage = MAX (max_buffer_usage, i);
+ break;
+ }
+ }
+ GST_LOG_OBJECT (sink, "max buffer usage is now %d", max_buffer_usage);
+ }
+
+ GST_LOG_OBJECT (sink, "len %d, usage %d", queuelen, max_buffer_usage);
+
+ /* nobody is referencing units after max_buffer_usage so we can
+ * remove them from the queue. We remove them in reverse order as
+ * this is the most optimal for GArray. */
+ for (i = queuelen - 1; i > max_buffer_usage; i--) {
+ GstBuffer *old;
+
+ /* queue exceeded max size */
+ queuelen--;
+ old = g_array_index (sink->bufqueue, GstBuffer *, i);
+ sink->bufqueue = g_array_remove_index (sink->bufqueue, i);
+
+ /* unref tail buffer */
+ gst_buffer_unref (old);
+ }
+ /* save for stats */
+ sink->buffers_queued = max_buffer_usage;
+ CLIENTS_UNLOCK (sink);
+
+ /* and send a signal to thread if fd_set changed */
+ if (need_signal) {
+ gst_poll_restart (sink->fdset);
+ }
+}
+
+/* Handle the clients. Basically does a blocking select for one
+ * of the client fds to become read or writable. We also have a
+ * filedescriptor to receive commands on that we need to check.
+ *
+ * After going out of the select call, we read and write to all
+ * clients that can do so. Badly behaving clients are put on a
+ * garbage list and removed.
+ */
+static void
+gst_multi_fd_sink_handle_clients (GstMultiFdSink * sink)
+{
+ int result;
+ GList *clients, *next;
+ gboolean try_again;
+ GstMultiFdSinkClass *fclass;
+ guint cookie;
+
+ fclass = GST_MULTI_FD_SINK_GET_CLASS (sink);
+
+ do {
+ try_again = FALSE;
+
+ /* check for:
+ * - server socket input (ie, new client connections)
+ * - client socket input (ie, clients saying goodbye)
+ * - client socket output (ie, client reads) */
+ GST_LOG_OBJECT (sink, "waiting on action on fdset");
+
+ result = gst_poll_wait (sink->fdset, sink->timeout != 0 ? sink->timeout :
+ GST_CLOCK_TIME_NONE);
+
+ /* Handle the special case in which the sink is not receiving more buffers
+ * and will not disconnect innactive client in the streaming thread. */
+ if (G_UNLIKELY (result == 0)) {
+ GstClockTime now;
+ GTimeVal nowtv;
+
+ g_get_current_time (&nowtv);
+ now = GST_TIMEVAL_TO_TIME (nowtv);
+
+ CLIENTS_LOCK (sink);
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+ if (sink->timeout > 0
+ && now - client->last_activity_time > sink->timeout) {
+ client->status = GST_CLIENT_STATUS_SLOW;
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ }
+ }
+ CLIENTS_UNLOCK (sink);
+ return;
+ } else if (result < 0) {
+ GST_WARNING_OBJECT (sink, "wait failed: %s (%d)", g_strerror (errno),
+ errno);
+ if (errno == EBADF) {
+ /* ok, so one or more of the fds is invalid. We loop over them to find
+ * the ones that give an error to the F_GETFL fcntl. */
+ CLIENTS_LOCK (sink);
+ restart:
+ cookie = sink->clients_cookie;
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+ int fd;
+ long flags;
+ int res;
+
+ if (cookie != sink->clients_cookie) {
+ GST_DEBUG_OBJECT (sink, "Cookie changed finding bad fd");
+ goto restart;
+ }
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+
+ fd = client->fd.fd;
+
+ res = fcntl (fd, F_GETFL, &flags);
+ if (res == -1) {
+ GST_WARNING_OBJECT (sink, "fnctl failed for %d, removing: %s (%d)",
+ fd, g_strerror (errno), errno);
+ if (errno == EBADF) {
+ client->status = GST_CLIENT_STATUS_ERROR;
+ /* releases the CLIENTS lock */
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ }
+ }
+ }
+ CLIENTS_UNLOCK (sink);
+ /* after this, go back in the select loop as the read/writefds
+ * are not valid */
+ try_again = TRUE;
+ } else if (errno == EINTR) {
+ /* interrupted system call, just redo the wait */
+ try_again = TRUE;
+ } else if (errno == EBUSY) {
+ /* the call to gst_poll_wait() was flushed */
+ return;
+ } else {
+ /* this is quite bad... */
+ GST_ELEMENT_ERROR (sink, RESOURCE, READ, (NULL),
+ ("select failed: %s (%d)", g_strerror (errno), errno));
+ return;
+ }
+ } else {
+ GST_LOG_OBJECT (sink, "wait done: %d sockets with events", result);
+ }
+ } while (try_again);
+
+ /* subclasses can check fdset with this virtual function */
+ if (fclass->wait)
+ fclass->wait (sink, sink->fdset);
+
+ /* Check the clients */
+ CLIENTS_LOCK (sink);
+
+restart2:
+ cookie = sink->clients_cookie;
+ for (clients = sink->clients; clients; clients = next) {
+ GstTCPClient *client;
+
+ if (sink->clients_cookie != cookie) {
+ GST_DEBUG_OBJECT (sink, "Restarting loop, cookie out of date");
+ goto restart2;
+ }
+
+ client = (GstTCPClient *) clients->data;
+ next = g_list_next (clients);
+
+ if (client->status != GST_CLIENT_STATUS_FLUSHING
+ && client->status != GST_CLIENT_STATUS_OK) {
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ continue;
+ }
+
+ if (gst_poll_fd_has_closed (sink->fdset, &client->fd)) {
+ client->status = GST_CLIENT_STATUS_CLOSED;
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ continue;
+ }
+ if (gst_poll_fd_has_error (sink->fdset, &client->fd)) {
+ GST_WARNING_OBJECT (sink, "gst_poll_fd_has_error for %d", client->fd.fd);
+ client->status = GST_CLIENT_STATUS_ERROR;
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ continue;
+ }
+ if (gst_poll_fd_can_read (sink->fdset, &client->fd)) {
+ /* handle client read */
+ if (!gst_multi_fd_sink_handle_client_read (sink, client)) {
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ continue;
+ }
+ }
+ if (gst_poll_fd_can_write (sink->fdset, &client->fd)) {
+ /* handle client write */
+ if (!gst_multi_fd_sink_handle_client_write (sink, client)) {
+ gst_multi_fd_sink_remove_client_link (sink, clients);
+ continue;
+ }
+ }
+ }
+ CLIENTS_UNLOCK (sink);
+}
+
+/* we handle the client communication in another thread so that we do not block
+ * the gstreamer thread while we select() on the client fds */
+static gpointer
+gst_multi_fd_sink_thread (GstMultiFdSink * sink)
+{
+ while (sink->running) {
+ gst_multi_fd_sink_handle_clients (sink);
+ }
+ return NULL;
+}
+
+static GstFlowReturn
+gst_multi_fd_sink_render (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstMultiFdSink *sink;
+ gboolean in_caps;
+#if 0
+ GstCaps *bufcaps, *padcaps;
+#endif
+
+ sink = GST_MULTI_FD_SINK (bsink);
+
+ g_return_val_if_fail (GST_OBJECT_FLAG_IS_SET (sink, GST_MULTI_FD_SINK_OPEN),
+ GST_FLOW_WRONG_STATE);
+
+#if 0
+ /* since we check every buffer for streamheader caps, we need to make
+ * sure every buffer has caps set */
+ bufcaps = gst_buffer_get_caps (buf);
+ padcaps = GST_PAD_CAPS (GST_BASE_SINK_PAD (bsink));
+
+ /* make sure we have caps on the pad */
+ if (!padcaps && !bufcaps)
+ goto no_caps;
+#endif
+
+ /* get IN_CAPS first, code below might mess with the flags */
+ in_caps = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+
+#if 0
+ /* stamp the buffer with previous caps if no caps set */
+ if (!bufcaps) {
+ if (!gst_buffer_is_writable (buf)) {
+ /* metadata is not writable, copy will be made and original buffer
+ * will be unreffed so we need to ref so that we don't lose the
+ * buffer in the render method. */
+ gst_buffer_ref (buf);
+ /* the new buffer is ours only, we keep it out of the scope of this
+ * function */
+ buf = gst_buffer_make_writable (buf);
+ } else {
+ /* else the metadata is writable, we ref because we keep the buffer
+ * out of the scope of this method */
+ gst_buffer_ref (buf);
+ }
+ /* buffer metadata is writable now, set the caps */
+ gst_buffer_set_caps (buf, padcaps);
+ } else {
+ gst_caps_unref (bufcaps);
+
+ /* since we keep this buffer out of the scope of this method */
+ gst_buffer_ref (buf);
+ }
+#endif
+
+ GST_LOG_OBJECT (sink, "received buffer %p, in_caps: %s, offset %"
+ G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT
+ ", timestamp %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT,
+ buf, in_caps ? "yes" : "no", GST_BUFFER_OFFSET (buf),
+ GST_BUFFER_OFFSET_END (buf),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+
+ /* if we get IN_CAPS buffers, but the previous buffer was not IN_CAPS,
+ * it means we're getting new streamheader buffers, and we should clear
+ * the old ones */
+ if (in_caps && sink->previous_buffer_in_caps == FALSE) {
+ GST_DEBUG_OBJECT (sink,
+ "receiving new IN_CAPS buffers, clearing old streamheader");
+ g_slist_foreach (sink->streamheader, (GFunc) gst_mini_object_unref, NULL);
+ g_slist_free (sink->streamheader);
+ sink->streamheader = NULL;
+ }
+
+ /* save the current in_caps */
+ sink->previous_buffer_in_caps = in_caps;
+
+ /* if the incoming buffer is marked as IN CAPS, then we assume for now
+ * it's a streamheader that needs to be sent to each new client, so we
+ * put it on our internal list of streamheader buffers.
+ * FIXME: we could check if the buffer's contents are in fact part of the
+ * current streamheader.
+ *
+ * We don't send the buffer to the client, since streamheaders are sent
+ * separately when necessary. */
+ if (in_caps) {
+ GST_DEBUG_OBJECT (sink, "appending IN_CAPS buffer with length %"
+ G_GSIZE_FORMAT " to streamheader", gst_buffer_get_size (buf));
+ sink->streamheader = g_slist_append (sink->streamheader, buf);
+ } else {
+ /* queue the buffer, this is a regular data buffer. */
+ gst_multi_fd_sink_queue_buffer (sink, buf);
+
+ sink->bytes_to_serve += gst_buffer_get_size (buf);
+ }
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+#if 0
+no_caps:
+ {
+ GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, (NULL),
+ ("Received first buffer without caps set"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+#endif
+}
+
+static void
+gst_multi_fd_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstMultiFdSink *multifdsink;
+
+ multifdsink = GST_MULTI_FD_SINK (object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ multifdsink->mode = g_value_get_enum (value);
+ break;
+ case PROP_BUFFERS_MAX:
+ multifdsink->units_max = g_value_get_int (value);
+ break;
+ case PROP_BUFFERS_SOFT_MAX:
+ multifdsink->units_soft_max = g_value_get_int (value);
+ break;
+ case PROP_TIME_MIN:
+ multifdsink->time_min = g_value_get_int64 (value);
+ break;
+ case PROP_BYTES_MIN:
+ multifdsink->bytes_min = g_value_get_int (value);
+ break;
+ case PROP_BUFFERS_MIN:
+ multifdsink->buffers_min = g_value_get_int (value);
+ break;
+ case PROP_UNIT_TYPE:
+ multifdsink->unit_type = g_value_get_enum (value);
+ break;
+ case PROP_UNITS_MAX:
+ multifdsink->units_max = g_value_get_int64 (value);
+ break;
+ case PROP_UNITS_SOFT_MAX:
+ multifdsink->units_soft_max = g_value_get_int64 (value);
+ break;
+ case PROP_RECOVER_POLICY:
+ multifdsink->recover_policy = g_value_get_enum (value);
+ break;
+ case PROP_TIMEOUT:
+ multifdsink->timeout = g_value_get_uint64 (value);
+ break;
+ case PROP_SYNC_METHOD:
+ multifdsink->def_sync_method = g_value_get_enum (value);
+ break;
+ case PROP_BURST_UNIT:
+ multifdsink->def_burst_unit = g_value_get_enum (value);
+ break;
+ case PROP_BURST_VALUE:
+ multifdsink->def_burst_value = g_value_get_uint64 (value);
+ break;
+ case PROP_QOS_DSCP:
+ multifdsink->qos_dscp = g_value_get_int (value);
+ setup_dscp (multifdsink);
+ break;
+ case PROP_HANDLE_READ:
+ multifdsink->handle_read = g_value_get_boolean (value);
+ break;
+ case PROP_RESEND_STREAMHEADER:
+ multifdsink->resend_streamheader = g_value_get_boolean (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_multi_fd_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstMultiFdSink *multifdsink;
+
+ multifdsink = GST_MULTI_FD_SINK (object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ g_value_set_enum (value, multifdsink->mode);
+ break;
+ case PROP_BUFFERS_MAX:
+ g_value_set_int (value, multifdsink->units_max);
+ break;
+ case PROP_BUFFERS_SOFT_MAX:
+ g_value_set_int (value, multifdsink->units_soft_max);
+ break;
+ case PROP_TIME_MIN:
+ g_value_set_int64 (value, multifdsink->time_min);
+ break;
+ case PROP_BYTES_MIN:
+ g_value_set_int (value, multifdsink->bytes_min);
+ break;
+ case PROP_BUFFERS_MIN:
+ g_value_set_int (value, multifdsink->buffers_min);
+ break;
+ case PROP_BUFFERS_QUEUED:
+ g_value_set_uint (value, multifdsink->buffers_queued);
+ break;
+ case PROP_BYTES_QUEUED:
+ g_value_set_uint (value, multifdsink->bytes_queued);
+ break;
+ case PROP_TIME_QUEUED:
+ g_value_set_uint64 (value, multifdsink->time_queued);
+ break;
+ case PROP_UNIT_TYPE:
+ g_value_set_enum (value, multifdsink->unit_type);
+ break;
+ case PROP_UNITS_MAX:
+ g_value_set_int64 (value, multifdsink->units_max);
+ break;
+ case PROP_UNITS_SOFT_MAX:
+ g_value_set_int64 (value, multifdsink->units_soft_max);
+ break;
+ case PROP_RECOVER_POLICY:
+ g_value_set_enum (value, multifdsink->recover_policy);
+ break;
+ case PROP_TIMEOUT:
+ g_value_set_uint64 (value, multifdsink->timeout);
+ break;
+ case PROP_SYNC_METHOD:
+ g_value_set_enum (value, multifdsink->def_sync_method);
+ break;
+ case PROP_BYTES_TO_SERVE:
+ g_value_set_uint64 (value, multifdsink->bytes_to_serve);
+ break;
+ case PROP_BYTES_SERVED:
+ g_value_set_uint64 (value, multifdsink->bytes_served);
+ break;
+ case PROP_BURST_UNIT:
+ g_value_set_enum (value, multifdsink->def_burst_unit);
+ break;
+ case PROP_BURST_VALUE:
+ g_value_set_uint64 (value, multifdsink->def_burst_value);
+ break;
+ case PROP_QOS_DSCP:
+ g_value_set_int (value, multifdsink->qos_dscp);
+ break;
+ case PROP_HANDLE_READ:
+ g_value_set_boolean (value, multifdsink->handle_read);
+ break;
+ case PROP_RESEND_STREAMHEADER:
+ g_value_set_boolean (value, multifdsink->resend_streamheader);
+ break;
+ case PROP_NUM_FDS:
+ g_value_set_uint (value, g_hash_table_size (multifdsink->fd_hash));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+/* create a socket for sending to remote machine */
+static gboolean
+gst_multi_fd_sink_start (GstBaseSink * bsink)
+{
+ GstMultiFdSinkClass *fclass;
+ GstMultiFdSink *this;
+
+ if (GST_OBJECT_FLAG_IS_SET (bsink, GST_MULTI_FD_SINK_OPEN))
+ return TRUE;
+
+ this = GST_MULTI_FD_SINK (bsink);
+ fclass = GST_MULTI_FD_SINK_GET_CLASS (this);
+
+ GST_INFO_OBJECT (this, "starting in mode %d", this->mode);
+ if ((this->fdset = gst_poll_new (TRUE)) == NULL)
+ goto socket_pair;
+
+ this->streamheader = NULL;
+ this->bytes_to_serve = 0;
+ this->bytes_served = 0;
+
+ if (fclass->init) {
+ fclass->init (this);
+ }
+
+ this->running = TRUE;
+ this->thread = g_thread_create ((GThreadFunc) gst_multi_fd_sink_thread,
+ this, TRUE, NULL);
+
+ GST_OBJECT_FLAG_SET (this, GST_MULTI_FD_SINK_OPEN);
+
+ return TRUE;
+
+ /* ERRORS */
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+}
+
+static gboolean
+multifdsink_hash_remove (gpointer key, gpointer value, gpointer data)
+{
+ return TRUE;
+}
+
+static gboolean
+gst_multi_fd_sink_stop (GstBaseSink * bsink)
+{
+ GstMultiFdSinkClass *fclass;
+ GstMultiFdSink *this;
+ GstBuffer *buf;
+ int i;
+
+ this = GST_MULTI_FD_SINK (bsink);
+ fclass = GST_MULTI_FD_SINK_GET_CLASS (this);
+
+ if (!GST_OBJECT_FLAG_IS_SET (bsink, GST_MULTI_FD_SINK_OPEN))
+ return TRUE;
+
+ this->running = FALSE;
+
+ gst_poll_set_flushing (this->fdset, TRUE);
+ if (this->thread) {
+ GST_DEBUG_OBJECT (this, "joining thread");
+ g_thread_join (this->thread);
+ GST_DEBUG_OBJECT (this, "joined thread");
+ this->thread = NULL;
+ }
+
+ /* free the clients */
+ gst_multi_fd_sink_clear (this);
+
+ if (this->streamheader) {
+ g_slist_foreach (this->streamheader, (GFunc) gst_mini_object_unref, NULL);
+ g_slist_free (this->streamheader);
+ this->streamheader = NULL;
+ }
+
+ if (fclass->close)
+ fclass->close (this);
+
+ if (this->fdset) {
+ gst_poll_free (this->fdset);
+ this->fdset = NULL;
+ }
+ g_hash_table_foreach_remove (this->fd_hash, multifdsink_hash_remove, this);
+
+ /* remove all queued buffers */
+ if (this->bufqueue) {
+ GST_DEBUG_OBJECT (this, "Emptying bufqueue with %d buffers",
+ this->bufqueue->len);
+ for (i = this->bufqueue->len - 1; i >= 0; --i) {
+ buf = g_array_index (this->bufqueue, GstBuffer *, i);
+ GST_LOG_OBJECT (this, "Removing buffer %p (%d) with refcount %d", buf, i,
+ GST_MINI_OBJECT_REFCOUNT (buf));
+ gst_buffer_unref (buf);
+ this->bufqueue = g_array_remove_index (this->bufqueue, i);
+ }
+ /* freeing the array is done in _finalize */
+ }
+ GST_OBJECT_FLAG_UNSET (this, GST_MULTI_FD_SINK_OPEN);
+
+ return TRUE;
+}
+
+static GstStateChangeReturn
+gst_multi_fd_sink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstMultiFdSink *sink;
+ GstStateChangeReturn ret;
+
+ sink = GST_MULTI_FD_SINK (element);
+
+ /* we disallow changing the state from the streaming thread */
+ if (g_thread_self () == sink->thread)
+ return GST_STATE_CHANGE_FAILURE;
+
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_multi_fd_sink_start (GST_BASE_SINK (sink)))
+ goto start_failed;
+ 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:
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_multi_fd_sink_stop (GST_BASE_SINK (sink));
+ break;
+ default:
+ break;
+ }
+ return ret;
+
+ /* ERRORS */
+start_failed:
+ {
+ /* error message was posted */
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
diff --git a/gst/tcp/gstmultifdsink.h b/gst/tcp/gstmultifdsink.h
new file mode 100644
index 0000000..b0465af
--- /dev/null
+++ b/gst/tcp/gstmultifdsink.h
@@ -0,0 +1,285 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+
+#ifndef __GST_MULTI_FD_SINK_H__
+#define __GST_MULTI_FD_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#include "gsttcp.h"
+
+#define GST_TYPE_MULTI_FD_SINK \
+ (gst_multi_fd_sink_get_type())
+#define GST_MULTI_FD_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_FD_SINK,GstMultiFdSink))
+#define GST_MULTI_FD_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_FD_SINK,GstMultiFdSinkClass))
+#define GST_IS_MULTI_FD_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_FD_SINK))
+#define GST_IS_MULTI_FD_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_FD_SINK))
+#define GST_MULTI_FD_SINK_GET_CLASS(klass) \
+ (G_TYPE_INSTANCE_GET_CLASS ((klass), GST_TYPE_MULTI_FD_SINK, GstMultiFdSinkClass))
+
+
+typedef struct _GstMultiFdSink GstMultiFdSink;
+typedef struct _GstMultiFdSinkClass GstMultiFdSinkClass;
+
+typedef enum {
+ GST_MULTI_FD_SINK_OPEN = (GST_ELEMENT_FLAG_LAST << 0),
+
+ GST_MULTI_FD_SINK_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} GstMultiFdSinkFlags;
+
+/**
+ * GstRecoverPolicy:
+ * @GST_RECOVER_POLICY_NONE : no recovering is done
+ * @GST_RECOVER_POLICY_RESYNC_LATEST : client is moved to last buffer
+ * @GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT: client is moved to the soft limit
+ * @GST_RECOVER_POLICY_RESYNC_KEYFRAME : client is moved to latest keyframe
+ *
+ * Possible values for the recovery procedure to use when a client consumes
+ * data too slow and has a backlag of more that soft-limit buffers.
+ */
+typedef enum
+{
+ GST_RECOVER_POLICY_NONE,
+ GST_RECOVER_POLICY_RESYNC_LATEST,
+ GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT,
+ GST_RECOVER_POLICY_RESYNC_KEYFRAME
+} GstRecoverPolicy;
+
+/**
+ * GstSyncMethod:
+ * @GST_SYNC_METHOD_LATEST : client receives most recent buffer
+ * @GST_SYNC_METHOD_NEXT_KEYFRAME : client receives next keyframe
+ * @GST_SYNC_METHOD_LATEST_KEYFRAME : client receives latest keyframe (burst)
+ * @GST_SYNC_METHOD_BURST : client receives specific amount of data
+ * @GST_SYNC_METHOD_BURST_KEYFRAME : client receives specific amount of data
+ * starting from latest keyframe
+ * @GST_SYNC_METHOD_BURST_WITH_KEYFRAME : client receives specific amount of data from
+ * a keyframe, or if there is not enough data after
+ * the keyframe, starting before the keyframe
+ *
+ * This enum defines the selection of the first buffer that is sent
+ * to a new client.
+ */
+typedef enum
+{
+ GST_SYNC_METHOD_LATEST,
+ GST_SYNC_METHOD_NEXT_KEYFRAME,
+ GST_SYNC_METHOD_LATEST_KEYFRAME,
+ GST_SYNC_METHOD_BURST,
+ GST_SYNC_METHOD_BURST_KEYFRAME,
+ GST_SYNC_METHOD_BURST_WITH_KEYFRAME
+} GstSyncMethod;
+
+/**
+ * GstTCPUnitType:
+ * @GST_TCP_UNIT_TYPE_UNDEFINED: undefined
+ * @GST_TCP_UNIT_TYPE_BUFFERS : buffers
+ * @GST_TCP_UNIT_TYPE_TIME : timeunits (in nanoseconds)
+ * @GST_TCP_UNIT_TYPE_BYTES : bytes
+ *
+ * The units used to specify limits.
+ */
+typedef enum
+{
+ GST_TCP_UNIT_TYPE_UNDEFINED,
+ GST_TCP_UNIT_TYPE_BUFFERS,
+ GST_TCP_UNIT_TYPE_TIME,
+ GST_TCP_UNIT_TYPE_BYTES
+} GstTCPUnitType;
+
+/**
+ * GstClientStatus:
+ * @GST_CLIENT_STATUS_OK : client is ok
+ * @GST_CLIENT_STATUS_CLOSED : client closed the socket
+ * @GST_CLIENT_STATUS_REMOVED : client is removed
+ * @GST_CLIENT_STATUS_SLOW : client is too slow
+ * @GST_CLIENT_STATUS_ERROR : client is in error
+ * @GST_CLIENT_STATUS_DUPLICATE: same client added twice
+ * @GST_CLIENT_STATUS_FLUSHING : client is flushing out the remaining buffers.
+ *
+ * This specifies the reason why a client was removed from
+ * multifdsink and is received in the "client-removed" signal.
+ */
+typedef enum
+{
+ GST_CLIENT_STATUS_OK = 0,
+ GST_CLIENT_STATUS_CLOSED = 1,
+ GST_CLIENT_STATUS_REMOVED = 2,
+ GST_CLIENT_STATUS_SLOW = 3,
+ GST_CLIENT_STATUS_ERROR = 4,
+ GST_CLIENT_STATUS_DUPLICATE = 5,
+ GST_CLIENT_STATUS_FLUSHING = 6
+} GstClientStatus;
+
+/* structure for a client
+ */
+typedef struct {
+ GstPollFD fd;
+
+ gint bufpos; /* position of this client in the global queue */
+ gint flushcount; /* the remaining number of buffers to flush out or -1 if the
+ client is not flushing. */
+
+ GstClientStatus status;
+ gboolean is_socket;
+
+ GSList *sending; /* the buffers we need to send */
+ gint bufoffset; /* offset in the first buffer */
+
+ gboolean discont;
+
+ gboolean caps_sent;
+ gboolean new_connection;
+
+ gboolean currently_removing;
+
+ /* method to sync client when connecting */
+ GstSyncMethod sync_method;
+ GstTCPUnitType burst_min_unit;
+ guint64 burst_min_value;
+ GstTCPUnitType burst_max_unit;
+ guint64 burst_max_value;
+
+ GstCaps *caps; /* caps of last queued buffer */
+
+ /* stats */
+ guint64 bytes_sent;
+ guint64 connect_time;
+ guint64 disconnect_time;
+ guint64 last_activity_time;
+ guint64 dropped_buffers;
+ guint64 avg_queue_size;
+ guint64 first_buffer_ts;
+ guint64 last_buffer_ts;
+} GstTCPClient;
+
+#define CLIENTS_LOCK_INIT(fdsink) (g_static_rec_mutex_init(&fdsink->clientslock))
+#define CLIENTS_LOCK_FREE(fdsink) (g_static_rec_mutex_free(&fdsink->clientslock))
+#define CLIENTS_LOCK(fdsink) (g_static_rec_mutex_lock(&fdsink->clientslock))
+#define CLIENTS_UNLOCK(fdsink) (g_static_rec_mutex_unlock(&fdsink->clientslock))
+
+/**
+ * GstMultiFdSink:
+ *
+ * The multifdsink object structure.
+ */
+struct _GstMultiFdSink {
+ GstBaseSink element;
+
+ /*< private >*/
+ guint64 bytes_to_serve; /* how much bytes we must serve */
+ guint64 bytes_served; /* how much bytes have we served */
+
+ GStaticRecMutex clientslock; /* lock to protect the clients list */
+ GList *clients; /* list of clients we are serving */
+ GHashTable *fd_hash; /* index on fd to client */
+ guint clients_cookie; /* Cookie to detect changes to the clients list */
+
+ gint mode;
+ GstPoll *fdset;
+
+ GSList *streamheader; /* GSList of GstBuffers to use as streamheader */
+ gboolean previous_buffer_in_caps;
+
+ guint mtu;
+ gint qos_dscp;
+ gboolean handle_read;
+
+ GArray *bufqueue; /* global queue of buffers */
+
+ gboolean running; /* the thread state */
+ GThread *thread; /* the sender thread */
+
+ /* these values are used to check if a client is reading fast
+ * enough and to control receovery */
+ GstTCPUnitType unit_type;/* the type of the units */
+ gint64 units_max; /* max units to queue for a client */
+ gint64 units_soft_max; /* max units a client can lag before recovery starts */
+ GstRecoverPolicy recover_policy;
+ GstClockTime timeout; /* max amount of nanoseconds to remain idle */
+
+ GstSyncMethod def_sync_method; /* what method to use for connecting clients */
+ GstTCPUnitType def_burst_unit;
+ guint64 def_burst_value;
+
+ /* these values are used to control the amount of data
+ * kept in the queues. It allows clients to perform a burst
+ * on connect. */
+ gint bytes_min; /* min number of bytes to queue */
+ gint64 time_min; /* min time to queue */
+ gint buffers_min; /* min number of buffers to queue */
+
+ gboolean resend_streamheader; /* resend streamheader if it changes */
+
+ /* stats */
+ gint buffers_queued; /* number of queued buffers */
+ gint bytes_queued; /* number of queued bytes */
+ gint time_queued; /* number of queued time */
+
+ guint8 header_flags;
+};
+
+struct _GstMultiFdSinkClass {
+ GstBaseSinkClass parent_class;
+
+ /* element methods */
+ void (*add) (GstMultiFdSink *sink, int fd);
+ void (*add_full) (GstMultiFdSink *sink, int fd, GstSyncMethod sync,
+ GstTCPUnitType format, guint64 value,
+ GstTCPUnitType max_unit, guint64 max_value);
+ void (*remove) (GstMultiFdSink *sink, int fd);
+ void (*remove_flush) (GstMultiFdSink *sink, int fd);
+ void (*clear) (GstMultiFdSink *sink);
+ GValueArray* (*get_stats) (GstMultiFdSink *sink, int fd);
+
+ /* vtable */
+ gboolean (*init) (GstMultiFdSink *sink);
+ gboolean (*wait) (GstMultiFdSink *sink, GstPoll *set);
+ gboolean (*close) (GstMultiFdSink *sink);
+ void (*removed) (GstMultiFdSink *sink, int fd);
+
+ /* signals */
+ void (*client_added) (GstElement *element, gint fd);
+ void (*client_removed) (GstElement *element, gint fd, GstClientStatus status);
+ void (*client_fd_removed) (GstElement *element, gint fd);
+};
+
+GType gst_multi_fd_sink_get_type (void);
+
+void gst_multi_fd_sink_add (GstMultiFdSink *sink, int fd);
+void gst_multi_fd_sink_add_full (GstMultiFdSink *sink, int fd, GstSyncMethod sync,
+ GstTCPUnitType min_unit, guint64 min_value,
+ GstTCPUnitType max_unit, guint64 max_value);
+void gst_multi_fd_sink_remove (GstMultiFdSink *sink, int fd);
+void gst_multi_fd_sink_remove_flush (GstMultiFdSink *sink, int fd);
+void gst_multi_fd_sink_clear (GstMultiFdSink *sink);
+GValueArray* gst_multi_fd_sink_get_stats (GstMultiFdSink *sink, int fd);
+
+G_END_DECLS
+
+#endif /* __GST_MULTI_FD_SINK_H__ */
diff --git a/gst/tcp/gsttcp-marshal.list b/gst/tcp/gsttcp-marshal.list
new file mode 100644
index 0000000..0d7208e
--- /dev/null
+++ b/gst/tcp/gsttcp-marshal.list
@@ -0,0 +1,5 @@
+VOID:STRING,UINT
+VOID:INT
+VOID:INT,BOXED
+VOID:INT,ENUM,INT,UINT64,INT,UINT64
+BOXED:INT
diff --git a/gst/tcp/gsttcp.c b/gst/tcp/gsttcp.c
new file mode 100644
index 0000000..f1b83a4
--- /dev/null
+++ b/gst/tcp/gsttcp.c
@@ -0,0 +1,475 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gsttcp.c: TCP 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 <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#ifdef HAVE_FIONREAD_IN_SYS_FILIO
+#include <sys/filio.h>
+#endif
+
+#include "gsttcp.h"
+#include <gst/gst-i18n-plugin.h>
+
+GST_DEBUG_CATEGORY_EXTERN (tcp_debug);
+#define GST_CAT_DEFAULT tcp_debug
+
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
+/* resolve host to IP address, throwing errors if it fails */
+/* host can already be an IP address */
+/* returns a newly allocated gchar * with the dotted ip address,
+ or NULL, in which case it already fired an error. */
+gchar *
+gst_tcp_host_to_ip (GstElement * element, const gchar * host)
+{
+ struct hostent *hostinfo;
+ char **addrs;
+ gchar *ip;
+ struct in_addr addr;
+
+ GST_DEBUG_OBJECT (element, "resolving host %s", host);
+
+ /* first check if it already is an IP address */
+ if (inet_aton (host, &addr)) {
+ ip = g_strdup (host);
+ goto beach;
+ }
+ /* FIXME: could do a localhost check here */
+
+ /* perform a name lookup */
+ if (!(hostinfo = gethostbyname (host)))
+ goto resolve_error;
+
+ if (hostinfo->h_addrtype != AF_INET)
+ goto not_ip;
+
+ addrs = hostinfo->h_addr_list;
+
+ /* There could be more than one IP address, but we just return the first */
+ ip = g_strdup (inet_ntoa (*(struct in_addr *) *addrs));
+
+beach:
+ GST_DEBUG_OBJECT (element, "resolved to IP %s", ip);
+ return ip;
+
+resolve_error:
+ {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND, (NULL),
+ ("Could not find IP address for host \"%s\".", host));
+ return NULL;
+ }
+not_ip:
+ {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND, (NULL),
+ ("host \"%s\" is not an IP host", host));
+ return NULL;
+ }
+}
+
+/* write buffer to given socket incrementally.
+ * Returns number of bytes written.
+ */
+gint
+gst_tcp_socket_write (int socket, const void *buf, size_t count)
+{
+ size_t bytes_written = 0;
+
+ while (bytes_written < count) {
+ ssize_t wrote = send (socket, (const char *) buf + bytes_written,
+ count - bytes_written, MSG_NOSIGNAL);
+
+ if (wrote <= 0) {
+ GST_WARNING ("error while writing");
+ return bytes_written;
+ }
+ bytes_written += wrote;
+ }
+
+ GST_LOG ("wrote %" G_GSIZE_FORMAT " bytes succesfully", bytes_written);
+ return bytes_written;
+}
+
+/* atomically read count bytes into buf, cancellable. return val of GST_FLOW_OK
+ * indicates success, anything else is failure.
+ */
+static GstFlowReturn
+gst_tcp_socket_read (GstElement * this, int socket, void *buf, size_t count,
+ GstPoll * fdset)
+{
+ ssize_t n;
+ size_t bytes_read;
+ int num_to_read;
+ int ret;
+
+ bytes_read = 0;
+
+ while (bytes_read < count) {
+ /* do a blocking select on the socket */
+ /* no action (0) is an error too in our case */
+ if ((ret = gst_poll_wait (fdset, GST_CLOCK_TIME_NONE)) <= 0) {
+ if (ret == -1 && errno == EBUSY)
+ goto cancelled;
+ else
+ goto select_error;
+ }
+
+ /* ask how much is available for reading on the socket */
+ if (ioctl (socket, FIONREAD, &num_to_read) < 0)
+ goto ioctl_error;
+
+ if (num_to_read == 0)
+ goto got_eos;
+
+ /* sizeof(ssize_t) >= sizeof(int), so I know num_to_read <= SSIZE_MAX */
+
+ num_to_read = MIN (num_to_read, count - bytes_read);
+
+ n = read (socket, ((guint8 *) buf) + bytes_read, num_to_read);
+
+ if (n < 0)
+ goto read_error;
+
+ if (n < num_to_read)
+ goto short_read;
+
+ bytes_read += num_to_read;
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+select_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("select failed: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+cancelled:
+ {
+ GST_DEBUG_OBJECT (this, "Select was cancelled");
+ return GST_FLOW_WRONG_STATE;
+ }
+ioctl_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("ioctl failed: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+got_eos:
+ {
+ GST_DEBUG_OBJECT (this, "Got EOS on socket stream");
+ return GST_FLOW_UNEXPECTED;
+ }
+read_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("read failed: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+short_read:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("short read: wanted %d bytes, got %" G_GSSIZE_FORMAT, num_to_read, n));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* close the socket and reset the fd. Used to clean up after errors. */
+void
+gst_tcp_socket_close (GstPollFD * socket)
+{
+ if (socket->fd >= 0) {
+ close (socket->fd);
+ socket->fd = -1;
+ }
+}
+
+/* read a buffer from the given socket
+ * returns:
+ * - a GstBuffer in which data should be read
+ * - NULL, indicating a connection close or an error, to be handled with
+ * EOS
+ */
+GstFlowReturn
+gst_tcp_read_buffer (GstElement * this, int socket, GstPoll * fdset,
+ GstBuffer ** buf)
+{
+ int ret;
+ gssize bytes_read;
+ int readsize;
+ guint8 *data;
+
+ *buf = NULL;
+
+ /* do a blocking select on the socket */
+ /* no action (0) is an error too in our case */
+ if ((ret = gst_poll_wait (fdset, GST_CLOCK_TIME_NONE)) <= 0) {
+ if (ret == -1 && errno == EBUSY)
+ goto cancelled;
+ else
+ goto select_error;
+ }
+
+ /* ask how much is available for reading on the socket */
+ if (ioctl (socket, FIONREAD, &readsize) < 0)
+ goto ioctl_error;
+
+ if (readsize == 0)
+ goto got_eos;
+
+ /* sizeof(ssize_t) >= sizeof(int), so I know readsize <= SSIZE_MAX */
+
+ *buf = gst_buffer_new_and_alloc (readsize);
+
+ data = gst_buffer_map (*buf, NULL, NULL, GST_MAP_WRITE);
+ bytes_read = read (socket, data, readsize);
+ gst_buffer_unmap (*buf, data, bytes_read);
+
+ if (bytes_read < 0)
+ goto read_error;
+
+ if (bytes_read < readsize)
+ /* but mom, you promised to give me readsize bytes! */
+ goto short_read;
+
+ GST_LOG_OBJECT (this,
+ "returning buffer of size %" G_GSSIZE_FORMAT, bytes_read);
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+select_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("select failed: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+cancelled:
+ {
+ GST_DEBUG_OBJECT (this, "Select was cancelled");
+ return GST_FLOW_WRONG_STATE;
+ }
+ioctl_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("ioctl failed: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+got_eos:
+ {
+ GST_DEBUG_OBJECT (this, "Got EOS on socket stream");
+ return GST_FLOW_UNEXPECTED;
+ }
+read_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("read failed: %s", g_strerror (errno)));
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ return GST_FLOW_ERROR;
+ }
+short_read:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("short read: wanted %d bytes, got %" G_GSSIZE_FORMAT, readsize,
+ bytes_read));
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* read a buffer from the given socket
+ * returns:
+ * - a GstBuffer in which data should be read
+ * - NULL, indicating a connection close or an error, to be handled with
+ * EOS
+ */
+GstFlowReturn
+gst_tcp_gdp_read_buffer (GstElement * this, int socket, GstPoll * fdset,
+ GstBuffer ** buf)
+{
+ GstFlowReturn ret;
+ guint8 *header = NULL;
+ guint8 *data;
+ gsize size;
+
+ GST_LOG_OBJECT (this, "Reading %d bytes for buffer packet header",
+ GST_DP_HEADER_LENGTH);
+
+ *buf = NULL;
+ header = g_malloc (GST_DP_HEADER_LENGTH);
+
+ ret = gst_tcp_socket_read (this, socket, header, GST_DP_HEADER_LENGTH, fdset);
+
+ if (ret != GST_FLOW_OK)
+ goto header_read_error;
+
+ if (!gst_dp_validate_header (GST_DP_HEADER_LENGTH, header))
+ goto validate_error;
+
+ if (gst_dp_header_payload_type (header) != GST_DP_PAYLOAD_BUFFER)
+ goto is_not_buffer;
+
+ GST_LOG_OBJECT (this, "validated buffer packet header");
+
+ *buf = gst_dp_buffer_from_header (GST_DP_HEADER_LENGTH, header);
+
+ g_free (header);
+
+ data = gst_buffer_map (*buf, &size, NULL, GST_MAP_WRITE);
+ ret = gst_tcp_socket_read (this, socket, data, size, fdset);
+ gst_buffer_unmap (*buf, data, size);
+
+ if (ret != GST_FLOW_OK)
+ goto data_read_error;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+header_read_error:
+ {
+ g_free (header);
+ return ret;
+ }
+validate_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("GDP buffer packet header does not validate"));
+ g_free (header);
+ return GST_FLOW_ERROR;
+ }
+is_not_buffer:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("GDP packet contains something that is not a buffer (type %d)",
+ gst_dp_header_payload_type (header)));
+ g_free (header);
+ return GST_FLOW_ERROR;
+ }
+data_read_error:
+ {
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ return ret;
+ }
+}
+
+GstFlowReturn
+gst_tcp_gdp_read_caps (GstElement * this, int socket, GstPoll * fdset,
+ GstCaps ** caps)
+{
+ GstFlowReturn ret;
+ guint8 *header = NULL;
+ guint8 *payload = NULL;
+ size_t payload_length;
+
+ GST_LOG_OBJECT (this, "Reading %d bytes for caps packet header",
+ GST_DP_HEADER_LENGTH);
+
+ *caps = NULL;
+ header = g_malloc (GST_DP_HEADER_LENGTH);
+
+ ret = gst_tcp_socket_read (this, socket, header, GST_DP_HEADER_LENGTH, fdset);
+
+ if (ret != GST_FLOW_OK)
+ goto header_read_error;
+
+ if (!gst_dp_validate_header (GST_DP_HEADER_LENGTH, header))
+ goto header_validate_error;
+
+ if (gst_dp_header_payload_type (header) != GST_DP_PAYLOAD_CAPS)
+ goto is_not_caps;
+
+ GST_LOG_OBJECT (this, "validated caps packet header");
+
+ payload_length = gst_dp_header_payload_length (header);
+ payload = g_malloc (payload_length);
+
+ GST_LOG_OBJECT (this,
+ "Reading %" G_GSIZE_FORMAT " bytes for caps packet payload",
+ payload_length);
+
+ ret = gst_tcp_socket_read (this, socket, payload, payload_length, fdset);
+
+ if (ret != GST_FLOW_OK)
+ goto payload_read_error;
+
+ if (!gst_dp_validate_payload (GST_DP_HEADER_LENGTH, header, payload))
+ goto payload_validate_error;
+
+ *caps = gst_dp_caps_from_packet (GST_DP_HEADER_LENGTH, header, payload);
+
+ GST_DEBUG_OBJECT (this, "Got caps over GDP: %" GST_PTR_FORMAT, *caps);
+
+ g_free (header);
+ g_free (payload);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+header_read_error:
+ {
+ g_free (header);
+ return ret;
+ }
+header_validate_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("GDP caps packet header does not validate"));
+ g_free (header);
+ return GST_FLOW_ERROR;
+ }
+is_not_caps:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("GDP packet contains something that is not a caps (type %d)",
+ gst_dp_header_payload_type (header)));
+ g_free (header);
+ return GST_FLOW_ERROR;
+ }
+payload_read_error:
+ {
+ g_free (header);
+ g_free (payload);
+ return ret;
+ }
+payload_validate_error:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("GDP caps packet payload does not validate"));
+ g_free (header);
+ g_free (payload);
+ return GST_FLOW_ERROR;
+ }
+}
diff --git a/gst/tcp/gsttcp.h b/gst/tcp/gsttcp.h
new file mode 100644
index 0000000..64299ef
--- /dev/null
+++ b/gst/tcp/gsttcp.h
@@ -0,0 +1,50 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gsttcp.h: 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_TCP_HELP_H__
+#define __GST_TCP_HELP_H__
+
+#include "gsttcp-enumtypes.h"
+#include <gst/gst.h>
+#undef GST_DISABLE_DEPRECATED
+#include <gst/dataprotocol/dataprotocol.h>
+
+#define TCP_HIGHEST_PORT 65535
+#define TCP_DEFAULT_HOST "localhost"
+#define TCP_DEFAULT_PORT 4953
+
+G_BEGIN_DECLS
+
+gchar * gst_tcp_host_to_ip (GstElement *element, const gchar *host);
+
+gint gst_tcp_socket_write (int socket, const void *buf, size_t count);
+
+void gst_tcp_socket_close (GstPollFD *socket);
+
+GstFlowReturn gst_tcp_read_buffer (GstElement * this, int socket, GstPoll * fdset, GstBuffer **buf);
+
+GstFlowReturn gst_tcp_gdp_read_buffer (GstElement * this, int socket, GstPoll * fdset, GstBuffer **buf);
+GstFlowReturn gst_tcp_gdp_read_caps (GstElement * this, int socket, GstPoll * fdset, GstCaps **caps);
+
+G_END_DECLS
+
+#endif /* __GST_TCP_HELP_H__ */
diff --git a/gst/tcp/gsttcpclientsink.c b/gst/tcp/gsttcpclientsink.c
new file mode 100644
index 0000000..a8dc756
--- /dev/null
+++ b/gst/tcp/gsttcpclientsink.c
@@ -0,0 +1,358 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+/**
+ * SECTION:element-tcpclientsink
+ * @see_also: #tcpclientsrc
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * # server:
+ * nc -l -p 3000
+ * # client:
+ * gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+ * ]| everything you type in the client is shown on the server
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst-i18n-plugin.h>
+#include <gst/dataprotocol/dataprotocol.h>
+#include "gsttcp.h"
+#include "gsttcpclientsink.h"
+#include <string.h> /* memset */
+
+/* TCPClientSink signals and args */
+enum
+{
+ FRAME_ENCODED,
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+GST_DEBUG_CATEGORY_STATIC (tcpclientsink_debug);
+#define GST_CAT_DEFAULT (tcpclientsink_debug)
+
+enum
+{
+ ARG_0,
+ ARG_HOST,
+ ARG_PORT
+};
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static void gst_tcp_client_sink_finalize (GObject * gobject);
+
+static gboolean gst_tcp_client_sink_setcaps (GstBaseSink * bsink,
+ GstCaps * caps);
+static GstFlowReturn gst_tcp_client_sink_render (GstBaseSink * bsink,
+ GstBuffer * buf);
+static GstStateChangeReturn gst_tcp_client_sink_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_tcp_client_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tcp_client_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+
+/*static guint gst_tcp_client_sink_signals[LAST_SIGNAL] = { 0 }; */
+
+#define gst_tcp_client_sink_parent_class parent_class
+G_DEFINE_TYPE (GstTCPClientSink, gst_tcp_client_sink, GST_TYPE_BASE_SINK);
+
+static void
+gst_tcp_client_sink_class_init (GstTCPClientSinkClass * 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_tcp_client_sink_set_property;
+ gobject_class->get_property = gst_tcp_client_sink_get_property;
+ gobject_class->finalize = gst_tcp_client_sink_finalize;
+
+ g_object_class_install_property (gobject_class, ARG_HOST,
+ g_param_spec_string ("host", "Host", "The host/IP to send the packets to",
+ TCP_DEFAULT_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_PORT,
+ g_param_spec_int ("port", "Port", "The port to send the packets to",
+ 0, TCP_HIGHEST_PORT, TCP_DEFAULT_PORT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "TCP client sink", "Sink/Network",
+ "Send data as a client over the network via TCP",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gstelement_class->change_state = gst_tcp_client_sink_change_state;
+
+ gstbasesink_class->set_caps = gst_tcp_client_sink_setcaps;
+ gstbasesink_class->render = gst_tcp_client_sink_render;
+
+ GST_DEBUG_CATEGORY_INIT (tcpclientsink_debug, "tcpclientsink", 0, "TCP sink");
+}
+
+static void
+gst_tcp_client_sink_init (GstTCPClientSink * this)
+{
+ this->host = g_strdup (TCP_DEFAULT_HOST);
+ this->port = TCP_DEFAULT_PORT;
+
+ this->sock_fd.fd = -1;
+ GST_OBJECT_FLAG_UNSET (this, GST_TCP_CLIENT_SINK_OPEN);
+}
+
+static void
+gst_tcp_client_sink_finalize (GObject * gobject)
+{
+ GstTCPClientSink *this = GST_TCP_CLIENT_SINK (gobject);
+
+ g_free (this->host);
+
+ G_OBJECT_CLASS (parent_class)->finalize (gobject);
+}
+
+static gboolean
+gst_tcp_client_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
+{
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_tcp_client_sink_render (GstBaseSink * bsink, GstBuffer * buf)
+{
+ size_t wrote = 0;
+ GstTCPClientSink *sink;
+ guint8 *data;
+ gsize size;
+
+ sink = GST_TCP_CLIENT_SINK (bsink);
+
+ g_return_val_if_fail (GST_OBJECT_FLAG_IS_SET (sink, GST_TCP_CLIENT_SINK_OPEN),
+ GST_FLOW_WRONG_STATE);
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ GST_LOG_OBJECT (sink, "writing %" G_GSIZE_FORMAT " bytes for buffer data",
+ size);
+
+ /* write buffer data */
+ wrote = gst_tcp_socket_write (sink->sock_fd.fd, data, size);
+ gst_buffer_unmap (buf, data, size);
+
+ if (wrote < size)
+ goto write_error;
+
+ sink->data_written += wrote;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+write_error:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
+ (_("Error while sending data to \"%s:%d\"."), sink->host, sink->port),
+ ("Only %" G_GSIZE_FORMAT " of %" G_GSIZE_FORMAT " bytes written: %s",
+ wrote, size, g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+gst_tcp_client_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTCPClientSink *tcpclientsink;
+
+ g_return_if_fail (GST_IS_TCP_CLIENT_SINK (object));
+ tcpclientsink = GST_TCP_CLIENT_SINK (object);
+
+ switch (prop_id) {
+ case ARG_HOST:
+ if (!g_value_get_string (value)) {
+ g_warning ("host property cannot be NULL");
+ break;
+ }
+ g_free (tcpclientsink->host);
+ tcpclientsink->host = g_strdup (g_value_get_string (value));
+ break;
+ case ARG_PORT:
+ tcpclientsink->port = g_value_get_int (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_tcp_client_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTCPClientSink *tcpclientsink;
+
+ g_return_if_fail (GST_IS_TCP_CLIENT_SINK (object));
+ tcpclientsink = GST_TCP_CLIENT_SINK (object);
+
+ switch (prop_id) {
+ case ARG_HOST:
+ g_value_set_string (value, tcpclientsink->host);
+ break;
+ case ARG_PORT:
+ g_value_set_int (value, tcpclientsink->port);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+/* create a socket for sending to remote machine */
+static gboolean
+gst_tcp_client_sink_start (GstTCPClientSink * this)
+{
+ int ret;
+ gchar *ip;
+
+ if (GST_OBJECT_FLAG_IS_SET (this, GST_TCP_CLIENT_SINK_OPEN))
+ return TRUE;
+
+ /* reset caps_sent flag */
+ this->caps_sent = FALSE;
+
+ /* create sending client socket */
+ GST_DEBUG_OBJECT (this, "opening sending client socket to %s:%d", this->host,
+ this->port);
+ if ((this->sock_fd.fd = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_WRITE, (NULL), GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+ GST_DEBUG_OBJECT (this, "opened sending client socket with fd %d",
+ this->sock_fd.fd);
+
+ /* look up name if we need to */
+ ip = gst_tcp_host_to_ip (GST_ELEMENT (this), this->host);
+ if (!ip) {
+ gst_tcp_socket_close (&this->sock_fd);
+ return FALSE;
+ }
+ GST_DEBUG_OBJECT (this, "IP address for host %s is %s", this->host, ip);
+
+ /* connect to server */
+ memset (&this->server_sin, 0, sizeof (this->server_sin));
+ this->server_sin.sin_family = AF_INET; /* network socket */
+ this->server_sin.sin_port = htons (this->port); /* on port */
+ this->server_sin.sin_addr.s_addr = inet_addr (ip); /* on host ip */
+ g_free (ip);
+
+ GST_DEBUG_OBJECT (this, "connecting to server");
+ ret = connect (this->sock_fd.fd, (struct sockaddr *) &this->server_sin,
+ sizeof (this->server_sin));
+
+ if (ret) {
+ gst_tcp_socket_close (&this->sock_fd);
+ switch (errno) {
+ case ECONNREFUSED:
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_WRITE,
+ (_("Connection to %s:%d refused."), this->host, this->port),
+ (NULL));
+ return FALSE;
+ break;
+ default:
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ, (NULL),
+ ("connect to %s:%d failed: %s", this->host, this->port,
+ g_strerror (errno)));
+ return FALSE;
+ break;
+ }
+ }
+
+ GST_OBJECT_FLAG_SET (this, GST_TCP_CLIENT_SINK_OPEN);
+
+ this->data_written = 0;
+
+ return TRUE;
+}
+
+static gboolean
+gst_tcp_client_sink_stop (GstTCPClientSink * this)
+{
+ if (!GST_OBJECT_FLAG_IS_SET (this, GST_TCP_CLIENT_SINK_OPEN))
+ return TRUE;
+
+ gst_tcp_socket_close (&this->sock_fd);
+
+ GST_OBJECT_FLAG_UNSET (this, GST_TCP_CLIENT_SINK_OPEN);
+
+ return TRUE;
+}
+
+static GstStateChangeReturn
+gst_tcp_client_sink_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstTCPClientSink *sink;
+ GstStateChangeReturn res;
+
+ sink = GST_TCP_CLIENT_SINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (!gst_tcp_client_sink_start (sink))
+ goto start_failure;
+ break;
+ default:
+ break;
+ }
+ res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_tcp_client_sink_stop (sink);
+ default:
+ break;
+ }
+ return res;
+
+start_failure:
+ {
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
diff --git a/gst/tcp/gsttcpclientsink.h b/gst/tcp/gsttcpclientsink.h
new file mode 100644
index 0000000..09556ff
--- /dev/null
+++ b/gst/tcp/gsttcpclientsink.h
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TCP_CLIENT_SINK_H__
+#define __GST_TCP_CLIENT_SINK_H__
+
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+#include "gsttcp.h"
+
+G_BEGIN_DECLS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <arpa/inet.h>
+#include "gsttcp.h"
+
+#define GST_TYPE_TCP_CLIENT_SINK \
+ (gst_tcp_client_sink_get_type())
+#define GST_TCP_CLIENT_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TCP_CLIENT_SINK,GstTCPClientSink))
+#define GST_TCP_CLIENT_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TCP_CLIENT_SINK,GstTCPClientSinkClass))
+#define GST_IS_TCP_CLIENT_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TCP_CLIENT_SINK))
+#define GST_IS_TCP_CLIENT_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TCP_CLIENT_SINK))
+
+typedef struct _GstTCPClientSink GstTCPClientSink;
+typedef struct _GstTCPClientSinkClass GstTCPClientSinkClass;
+
+typedef enum {
+ GST_TCP_CLIENT_SINK_OPEN = (GST_ELEMENT_FLAG_LAST << 0),
+
+ GST_TCP_CLIENT_SINK_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2),
+} GstTCPClientSinkFlags;
+
+struct _GstTCPClientSink {
+ GstBaseSink element;
+
+ /* server information */
+ int port;
+ gchar *host;
+ struct sockaddr_in server_sin;
+
+ /* socket */
+ GstPollFD sock_fd;
+
+ size_t data_written; /* how much bytes have we written ? */
+ gboolean caps_sent; /* whether or not we sent caps already */
+};
+
+struct _GstTCPClientSinkClass {
+ GstBaseSinkClass parent_class;
+};
+
+GType gst_tcp_client_sink_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_TCP_CLIENT_SINK_H__ */
diff --git a/gst/tcp/gsttcpclientsrc.c b/gst/tcp/gsttcpclientsrc.c
new file mode 100644
index 0000000..3a83fba
--- /dev/null
+++ b/gst/tcp/gsttcpclientsrc.c
@@ -0,0 +1,392 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+/**
+ * SECTION:element-tcpclientsrc
+ * @see_also: #tcpclientsink
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * # server:
+ * nc -l -p 3000
+ * # client:
+ * gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+ * ]| everything you type in the server is shown on the client
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst-i18n-plugin.h>
+#include "gsttcp.h"
+#include "gsttcpclientsrc.h"
+#include <string.h> /* memset */
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+
+
+GST_DEBUG_CATEGORY_STATIC (tcpclientsrc_debug);
+#define GST_CAT_DEFAULT tcpclientsrc_debug
+
+#define MAX_READ_SIZE 4 * 1024
+
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+
+enum
+{
+ PROP_0,
+ PROP_HOST,
+ PROP_PORT
+};
+
+#define gst_tcp_client_src_parent_class parent_class
+G_DEFINE_TYPE (GstTCPClientSrc, gst_tcp_client_src, GST_TYPE_PUSH_SRC);
+
+
+static void gst_tcp_client_src_finalize (GObject * gobject);
+
+static GstCaps *gst_tcp_client_src_getcaps (GstBaseSrc * psrc,
+ GstCaps * filter);
+
+static GstFlowReturn gst_tcp_client_src_create (GstPushSrc * psrc,
+ GstBuffer ** outbuf);
+static gboolean gst_tcp_client_src_stop (GstBaseSrc * bsrc);
+static gboolean gst_tcp_client_src_start (GstBaseSrc * bsrc);
+static gboolean gst_tcp_client_src_unlock (GstBaseSrc * bsrc);
+static gboolean gst_tcp_client_src_unlock_stop (GstBaseSrc * bsrc);
+
+static void gst_tcp_client_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tcp_client_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_tcp_client_src_class_init (GstTCPClientSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+ GstPushSrcClass *gstpush_src_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+ gstpush_src_class = (GstPushSrcClass *) klass;
+
+ gobject_class->set_property = gst_tcp_client_src_set_property;
+ gobject_class->get_property = gst_tcp_client_src_get_property;
+ gobject_class->finalize = gst_tcp_client_src_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_HOST,
+ g_param_spec_string ("host", "Host",
+ "The host IP address to receive packets from", TCP_DEFAULT_HOST,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PORT,
+ g_param_spec_int ("port", "Port", "The port to receive packets from", 0,
+ TCP_HIGHEST_PORT, TCP_DEFAULT_PORT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "TCP client source", "Source/Network",
+ "Receive data as a client over the network via TCP",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gstbasesrc_class->get_caps = gst_tcp_client_src_getcaps;
+ gstbasesrc_class->start = gst_tcp_client_src_start;
+ gstbasesrc_class->stop = gst_tcp_client_src_stop;
+ gstbasesrc_class->unlock = gst_tcp_client_src_unlock;
+ gstbasesrc_class->unlock_stop = gst_tcp_client_src_unlock_stop;
+
+ gstpush_src_class->create = gst_tcp_client_src_create;
+
+ GST_DEBUG_CATEGORY_INIT (tcpclientsrc_debug, "tcpclientsrc", 0,
+ "TCP Client Source");
+}
+
+static void
+gst_tcp_client_src_init (GstTCPClientSrc * this)
+{
+ this->port = TCP_DEFAULT_PORT;
+ this->host = g_strdup (TCP_DEFAULT_HOST);
+ this->sock_fd.fd = -1;
+ this->caps = NULL;
+
+ GST_OBJECT_FLAG_UNSET (this, GST_TCP_CLIENT_SRC_OPEN);
+}
+
+static void
+gst_tcp_client_src_finalize (GObject * gobject)
+{
+ GstTCPClientSrc *this = GST_TCP_CLIENT_SRC (gobject);
+
+ g_free (this->host);
+
+ G_OBJECT_CLASS (parent_class)->finalize (gobject);
+}
+
+static GstCaps *
+gst_tcp_client_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
+{
+ GstTCPClientSrc *src;
+ GstCaps *caps = NULL;
+
+ src = GST_TCP_CLIENT_SRC (bsrc);
+
+ if (!GST_OBJECT_FLAG_IS_SET (src, GST_TCP_CLIENT_SRC_OPEN))
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ else if (src->caps && filter)
+ caps =
+ gst_caps_intersect_full (filter, src->caps, GST_CAPS_INTERSECT_FIRST);
+ else if (src->caps)
+ caps = gst_caps_copy (src->caps);
+ else
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ GST_DEBUG_OBJECT (src, "returning caps %" GST_PTR_FORMAT, caps);
+ g_assert (GST_IS_CAPS (caps));
+ return caps;
+}
+
+static GstFlowReturn
+gst_tcp_client_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
+{
+ GstTCPClientSrc *src;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ src = GST_TCP_CLIENT_SRC (psrc);
+
+ if (!GST_OBJECT_FLAG_IS_SET (src, GST_TCP_CLIENT_SRC_OPEN))
+ goto wrong_state;
+
+ GST_LOG_OBJECT (src, "asked for a buffer");
+
+ /* read the buffer header */
+ ret = gst_tcp_read_buffer (GST_ELEMENT (src), src->sock_fd.fd,
+ src->fdset, outbuf);
+
+ if (ret == GST_FLOW_OK) {
+ GST_LOG_OBJECT (src,
+ "Returning buffer from _get of size %" G_GSIZE_FORMAT ", ts %"
+ GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT
+ ", offset %" G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT,
+ gst_buffer_get_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));
+ }
+
+ return ret;
+
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (src, "connection to closed, cannot read data");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+static void
+gst_tcp_client_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTCPClientSrc *tcpclientsrc = GST_TCP_CLIENT_SRC (object);
+
+ switch (prop_id) {
+ case PROP_HOST:
+ if (!g_value_get_string (value)) {
+ g_warning ("host property cannot be NULL");
+ break;
+ }
+ g_free (tcpclientsrc->host);
+ tcpclientsrc->host = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_PORT:
+ tcpclientsrc->port = g_value_get_int (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_tcp_client_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTCPClientSrc *tcpclientsrc = GST_TCP_CLIENT_SRC (object);
+
+ switch (prop_id) {
+ case PROP_HOST:
+ g_value_set_string (value, tcpclientsrc->host);
+ break;
+ case PROP_PORT:
+ g_value_set_int (value, tcpclientsrc->port);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* create a socket for connecting to remote server */
+static gboolean
+gst_tcp_client_src_start (GstBaseSrc * bsrc)
+{
+ int ret;
+ gchar *ip;
+ GstTCPClientSrc *src = GST_TCP_CLIENT_SRC (bsrc);
+
+ if ((src->fdset = gst_poll_new (TRUE)) == NULL)
+ goto socket_pair;
+
+ /* create receiving client socket */
+ GST_DEBUG_OBJECT (src, "opening receiving client socket to %s:%d",
+ src->host, src->port);
+
+ if ((src->sock_fd.fd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
+ goto no_socket;
+
+ GST_DEBUG_OBJECT (src, "opened receiving client socket with fd %d",
+ src->sock_fd.fd);
+ GST_OBJECT_FLAG_SET (src, GST_TCP_CLIENT_SRC_OPEN);
+
+ /* look up name if we need to */
+ if (!(ip = gst_tcp_host_to_ip (GST_ELEMENT (src), src->host)))
+ goto name_resolv;
+
+ GST_DEBUG_OBJECT (src, "IP address for host %s is %s", src->host, ip);
+
+ /* connect to server */
+ memset (&src->server_sin, 0, sizeof (src->server_sin));
+ src->server_sin.sin_family = AF_INET; /* network socket */
+ src->server_sin.sin_port = htons (src->port); /* on port */
+ src->server_sin.sin_addr.s_addr = inet_addr (ip); /* on host ip */
+ g_free (ip);
+
+ GST_DEBUG_OBJECT (src, "connecting to server");
+ ret = connect (src->sock_fd.fd, (struct sockaddr *) &src->server_sin,
+ sizeof (src->server_sin));
+ if (ret)
+ goto connect_failed;
+
+ /* add the socket to the poll */
+ gst_poll_add_fd (src->fdset, &src->sock_fd);
+ gst_poll_fd_ctl_read (src->fdset, &src->sock_fd, TRUE);
+
+ return TRUE;
+
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+no_socket:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+name_resolv:
+ {
+ gst_tcp_client_src_stop (GST_BASE_SRC (src));
+ return FALSE;
+ }
+connect_failed:
+ {
+ gst_tcp_client_src_stop (GST_BASE_SRC (src));
+ switch (errno) {
+ case ECONNREFUSED:
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("Connection to %s:%d refused."), src->host, src->port), (NULL));
+ break;
+ default:
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("connect to %s:%d failed: %s", src->host, src->port,
+ g_strerror (errno)));
+ break;
+ }
+ return FALSE;
+ }
+}
+
+/* close the socket and associated resources
+ * unset OPEN flag
+ * used both to recover from errors and go to NULL state */
+static gboolean
+gst_tcp_client_src_stop (GstBaseSrc * bsrc)
+{
+ GstTCPClientSrc *src;
+
+ src = GST_TCP_CLIENT_SRC (bsrc);
+
+ GST_DEBUG_OBJECT (src, "closing socket");
+
+ if (src->fdset != NULL) {
+ gst_poll_free (src->fdset);
+ src->fdset = NULL;
+ }
+
+ gst_tcp_socket_close (&src->sock_fd);
+ src->caps_received = FALSE;
+ if (src->caps) {
+ gst_caps_unref (src->caps);
+ src->caps = NULL;
+ }
+ GST_OBJECT_FLAG_UNSET (src, GST_TCP_CLIENT_SRC_OPEN);
+
+ return TRUE;
+}
+
+/* will be called only between calls to start() and stop() */
+static gboolean
+gst_tcp_client_src_unlock (GstBaseSrc * bsrc)
+{
+ GstTCPClientSrc *src = GST_TCP_CLIENT_SRC (bsrc);
+
+ GST_DEBUG_OBJECT (src, "set to flushing");
+ gst_poll_set_flushing (src->fdset, TRUE);
+
+ return TRUE;
+}
+
+/* will be called only between calls to start() and stop() */
+static gboolean
+gst_tcp_client_src_unlock_stop (GstBaseSrc * bsrc)
+{
+ GstTCPClientSrc *src = GST_TCP_CLIENT_SRC (bsrc);
+
+ GST_DEBUG_OBJECT (src, "unset flushing");
+ gst_poll_set_flushing (src->fdset, FALSE);
+
+ return TRUE;
+}
diff --git a/gst/tcp/gsttcpclientsrc.h b/gst/tcp/gsttcpclientsrc.h
new file mode 100644
index 0000000..77d5702
--- /dev/null
+++ b/gst/tcp/gsttcpclientsrc.h
@@ -0,0 +1,82 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+
+#ifndef __GST_TCP_CLIENT_SRC_H__
+#define __GST_TCP_CLIENT_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+G_BEGIN_DECLS
+
+#include <netdb.h> /* sockaddr_in */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h> /* sockaddr_in */
+#include <unistd.h>
+
+#include "gsttcp.h"
+
+#define GST_TYPE_TCP_CLIENT_SRC \
+ (gst_tcp_client_src_get_type())
+#define GST_TCP_CLIENT_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TCP_CLIENT_SRC,GstTCPClientSrc))
+#define GST_TCP_CLIENT_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TCP_CLIENT_SRC,GstTCPClientSrcClass))
+#define GST_IS_TCP_CLIENT_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TCP_CLIENT_SRC))
+#define GST_IS_TCP_CLIENT_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TCP_CLIENT_SRC))
+
+typedef struct _GstTCPClientSrc GstTCPClientSrc;
+typedef struct _GstTCPClientSrcClass GstTCPClientSrcClass;
+
+typedef enum {
+ GST_TCP_CLIENT_SRC_OPEN = (GST_ELEMENT_FLAG_LAST << 0),
+
+ GST_TCP_CLIENT_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} GstTCPClientSrcFlags;
+
+struct _GstTCPClientSrc {
+ GstPushSrc element;
+
+ /* server information */
+ int port;
+ gchar *host;
+ struct sockaddr_in server_sin;
+
+ /* socket */
+ GstPollFD sock_fd;
+ GstPoll *fdset;
+
+ gboolean caps_received; /* if we have received caps yet */
+ GstCaps *caps;
+};
+
+struct _GstTCPClientSrcClass {
+ GstPushSrcClass parent_class;
+};
+
+GType gst_tcp_client_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TCP_CLIENT_SRC_H__ */
diff --git a/gst/tcp/gsttcpplugin.c b/gst/tcp/gsttcpplugin.c
new file mode 100644
index 0000000..bb2cf48
--- /dev/null
+++ b/gst/tcp/gsttcpplugin.c
@@ -0,0 +1,63 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/dataprotocol/dataprotocol.h>
+#include "gsttcpclientsrc.h"
+#include "gsttcpclientsink.h"
+#include "gsttcpserversrc.h"
+#include "gsttcpserversink.h"
+#include "gstmultifdsink.h"
+
+GST_DEBUG_CATEGORY (tcp_debug);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_dp_init ();
+
+ if (!gst_element_register (plugin, "tcpclientsink", GST_RANK_NONE,
+ GST_TYPE_TCP_CLIENT_SINK))
+ return FALSE;
+ if (!gst_element_register (plugin, "tcpclientsrc", GST_RANK_NONE,
+ GST_TYPE_TCP_CLIENT_SRC))
+ return FALSE;
+ if (!gst_element_register (plugin, "tcpserversink", GST_RANK_NONE,
+ GST_TYPE_TCP_SERVER_SINK))
+ return FALSE;
+ if (!gst_element_register (plugin, "tcpserversrc", GST_RANK_NONE,
+ GST_TYPE_TCP_SERVER_SRC))
+ return FALSE;
+ if (!gst_element_register (plugin, "multifdsink", GST_RANK_NONE,
+ GST_TYPE_MULTI_FD_SINK))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (tcp_debug, "tcp", 0, "TCP calls");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "tcp",
+ "transfer data over the network via TCP",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/tcp/gsttcpplugin.h b/gst/tcp/gsttcpplugin.h
new file mode 100644
index 0000000..38b91be
--- /dev/null
+++ b/gst/tcp/gsttcpplugin.h
@@ -0,0 +1,40 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TCP_H__
+#define __GST_TCP_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ typedef enum
+ {
+ CONTROL_ZERO,
+ CONTROL_NONE,
+ CONTROL_TCP
+ } Gst_TCP_Control;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_TCP_H__ */
diff --git a/gst/tcp/gsttcpserversink.c b/gst/tcp/gsttcpserversink.c
new file mode 100644
index 0000000..1c9ea4a
--- /dev/null
+++ b/gst/tcp/gsttcpserversink.c
@@ -0,0 +1,371 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+/**
+ * SECTION:element-tcpserversink
+ * @see_also: #multifdsink
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * # server:
+ * gst-launch fdsrc fd=1 ! tcpserversink protocol=none port=3000
+ * # client:
+ * gst-launch tcpclientsrc protocol=none port=3000 ! fdsink fd=2
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst-i18n-plugin.h>
+#include <string.h> /* memset */
+
+#include <sys/ioctl.h>
+
+#ifdef HAVE_FIONREAD_IN_SYS_FILIO
+#include <sys/filio.h>
+#endif
+
+#include "gsttcp.h"
+#include "gsttcpserversink.h"
+#include "gsttcp-marshal.h"
+
+#define TCP_BACKLOG 5
+
+GST_DEBUG_CATEGORY_STATIC (tcpserversink_debug);
+#define GST_CAT_DEFAULT (tcpserversink_debug)
+
+enum
+{
+ ARG_0,
+ ARG_HOST,
+ ARG_PORT,
+};
+
+static void gst_tcp_server_sink_finalize (GObject * gobject);
+
+static gboolean gst_tcp_server_sink_handle_wait (GstMultiFdSink * sink,
+ GstPoll * set);
+static gboolean gst_tcp_server_sink_init_send (GstMultiFdSink * this);
+static gboolean gst_tcp_server_sink_close (GstMultiFdSink * this);
+static void gst_tcp_server_sink_removed (GstMultiFdSink * sink, int fd);
+
+static void gst_tcp_server_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tcp_server_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+#define gst_tcp_server_sink_parent_class parent_class
+G_DEFINE_TYPE (GstTCPServerSink, gst_tcp_server_sink, GST_TYPE_MULTI_FD_SINK);
+
+static void
+gst_tcp_server_sink_class_init (GstTCPServerSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstMultiFdSinkClass *gstmultifdsink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstmultifdsink_class = (GstMultiFdSinkClass *) klass;
+
+ gobject_class->set_property = gst_tcp_server_sink_set_property;
+ gobject_class->get_property = gst_tcp_server_sink_get_property;
+ gobject_class->finalize = gst_tcp_server_sink_finalize;
+
+ g_object_class_install_property (gobject_class, ARG_HOST,
+ g_param_spec_string ("host", "host", "The host/IP to send the packets to",
+ TCP_DEFAULT_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_PORT,
+ g_param_spec_int ("port", "port", "The port to send the packets to",
+ 0, TCP_HIGHEST_PORT, TCP_DEFAULT_PORT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "TCP server sink", "Sink/Network",
+ "Send data as a server over the network via TCP",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gstmultifdsink_class->init = gst_tcp_server_sink_init_send;
+ gstmultifdsink_class->wait = gst_tcp_server_sink_handle_wait;
+ gstmultifdsink_class->close = gst_tcp_server_sink_close;
+ gstmultifdsink_class->removed = gst_tcp_server_sink_removed;
+
+ GST_DEBUG_CATEGORY_INIT (tcpserversink_debug, "tcpserversink", 0, "TCP sink");
+}
+
+static void
+gst_tcp_server_sink_init (GstTCPServerSink * this)
+{
+ this->server_port = TCP_DEFAULT_PORT;
+ /* should support as minimum 576 for IPV4 and 1500 for IPV6 */
+ /* this->mtu = 1500; */
+ this->host = g_strdup (TCP_DEFAULT_HOST);
+
+ this->server_sock.fd = -1;
+}
+
+static void
+gst_tcp_server_sink_finalize (GObject * gobject)
+{
+ GstTCPServerSink *this = GST_TCP_SERVER_SINK (gobject);
+
+ g_free (this->host);
+
+ G_OBJECT_CLASS (parent_class)->finalize (gobject);
+}
+
+/* handle a read request on the server,
+ * which indicates a new client connection */
+static gboolean
+gst_tcp_server_sink_handle_server_read (GstTCPServerSink * sink)
+{
+ /* new client */
+ int client_sock_fd;
+ struct sockaddr_in client_address;
+ socklen_t client_address_len;
+
+ /* For some stupid reason, client_address and client_address_len has to be
+ * zeroed */
+ memset (&client_address, 0, sizeof (client_address));
+ client_address_len = 0;
+
+ client_sock_fd =
+ accept (sink->server_sock.fd, (struct sockaddr *) &client_address,
+ &client_address_len);
+ if (client_sock_fd == -1)
+ goto accept_failed;
+
+ gst_multi_fd_sink_add (GST_MULTI_FD_SINK (sink), client_sock_fd);
+
+ GST_DEBUG_OBJECT (sink, "added new client ip %s with fd %d",
+ inet_ntoa (client_address.sin_addr), client_sock_fd);
+
+ return TRUE;
+
+ /* ERRORS */
+accept_failed:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
+ ("Could not accept client on server socket %d: %s (%d)",
+ sink->server_sock.fd, g_strerror (errno), errno));
+ return FALSE;
+ }
+}
+
+static void
+gst_tcp_server_sink_removed (GstMultiFdSink * sink, int fd)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ GstTCPServerSink *this = GST_TCP_SERVER_SINK (sink);
+#endif
+
+ GST_LOG_OBJECT (this, "closing fd %d", fd);
+ if (close (fd) < 0) {
+ GST_WARNING_OBJECT (this, "error closing fd %d: %s", fd,
+ g_strerror (errno));
+ }
+}
+
+static gboolean
+gst_tcp_server_sink_handle_wait (GstMultiFdSink * sink, GstPoll * set)
+{
+ GstTCPServerSink *this = GST_TCP_SERVER_SINK (sink);
+
+ if (gst_poll_fd_can_read (set, &this->server_sock)) {
+ /* handle new client connection on server socket */
+ if (!gst_tcp_server_sink_handle_server_read (this))
+ goto connection_failed;
+ }
+ return TRUE;
+
+ /* ERRORS */
+connection_failed:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+ ("client connection failed: %s", g_strerror (errno)));
+ return FALSE;
+ }
+}
+
+static void
+gst_tcp_server_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTCPServerSink *sink;
+
+ g_return_if_fail (GST_IS_TCP_SERVER_SINK (object));
+ sink = GST_TCP_SERVER_SINK (object);
+
+ switch (prop_id) {
+ case ARG_HOST:
+ if (!g_value_get_string (value)) {
+ g_warning ("host property cannot be NULL");
+ break;
+ }
+ g_free (sink->host);
+ sink->host = g_strdup (g_value_get_string (value));
+ break;
+ case ARG_PORT:
+ sink->server_port = g_value_get_int (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_tcp_server_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTCPServerSink *sink;
+
+ g_return_if_fail (GST_IS_TCP_SERVER_SINK (object));
+ sink = GST_TCP_SERVER_SINK (object);
+
+ switch (prop_id) {
+ case ARG_HOST:
+ g_value_set_string (value, sink->host);
+ break;
+ case ARG_PORT:
+ g_value_set_int (value, sink->server_port);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+/* create a socket for sending to remote machine */
+static gboolean
+gst_tcp_server_sink_init_send (GstMultiFdSink * parent)
+{
+ int ret;
+ GstTCPServerSink *this = GST_TCP_SERVER_SINK (parent);
+
+ /* create sending server socket */
+ if ((this->server_sock.fd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
+ goto no_socket;
+
+ GST_DEBUG_OBJECT (this, "opened sending server socket with fd %d",
+ this->server_sock.fd);
+
+ /* make address reusable */
+ ret = 1;
+ if (setsockopt (this->server_sock.fd, SOL_SOCKET, SO_REUSEADDR,
+ (void *) &ret, sizeof (ret)) < 0)
+ goto reuse_failed;
+
+ /* keep connection alive; avoids SIGPIPE during write */
+ ret = 1;
+ if (setsockopt (this->server_sock.fd, SOL_SOCKET, SO_KEEPALIVE,
+ (void *) &ret, sizeof (ret)) < 0)
+ goto keepalive_failed;
+
+ /* name the socket */
+ memset (&this->server_sin, 0, sizeof (this->server_sin));
+ this->server_sin.sin_family = AF_INET; /* network socket */
+ this->server_sin.sin_port = htons (this->server_port); /* on port */
+ this->server_sin.sin_addr.s_addr = htonl (INADDR_ANY); /* for hosts */
+
+ /* bind it */
+ GST_DEBUG_OBJECT (this, "binding server socket to address");
+ ret = bind (this->server_sock.fd, (struct sockaddr *) &this->server_sin,
+ sizeof (this->server_sin));
+ if (ret)
+ goto bind_failed;
+
+ /* set the server socket to nonblocking */
+ fcntl (this->server_sock.fd, F_SETFL, O_NONBLOCK);
+
+ GST_DEBUG_OBJECT (this, "listening on server socket %d with queue of %d",
+ this->server_sock.fd, TCP_BACKLOG);
+ if (listen (this->server_sock.fd, TCP_BACKLOG) == -1)
+ goto listen_failed;
+
+ GST_DEBUG_OBJECT (this,
+ "listened on server socket %d, returning from connection setup",
+ this->server_sock.fd);
+
+ gst_poll_add_fd (parent->fdset, &this->server_sock);
+ gst_poll_fd_ctl_read (parent->fdset, &this->server_sock, TRUE);
+
+ return TRUE;
+
+ /* ERRORS */
+no_socket:
+ {
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_WRITE, (NULL), GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+reuse_failed:
+ {
+ gst_tcp_socket_close (&this->server_sock);
+ GST_ELEMENT_ERROR (this, RESOURCE, SETTINGS, (NULL),
+ ("Could not setsockopt: %s", g_strerror (errno)));
+ return FALSE;
+ }
+keepalive_failed:
+ {
+ gst_tcp_socket_close (&this->server_sock);
+ GST_ELEMENT_ERROR (this, RESOURCE, SETTINGS, (NULL),
+ ("Could not setsockopt: %s", g_strerror (errno)));
+ return FALSE;
+ }
+listen_failed:
+ {
+ gst_tcp_socket_close (&this->server_sock);
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ, (NULL),
+ ("Could not listen on server socket: %s", g_strerror (errno)));
+ return FALSE;
+ }
+bind_failed:
+ {
+ gst_tcp_socket_close (&this->server_sock);
+ switch (errno) {
+ default:
+ GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ, (NULL),
+ ("bind on port %d failed: %s", this->server_port,
+ g_strerror (errno)));
+ break;
+ }
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_tcp_server_sink_close (GstMultiFdSink * parent)
+{
+ GstTCPServerSink *this = GST_TCP_SERVER_SINK (parent);
+
+ if (this->server_sock.fd != -1) {
+ gst_poll_remove_fd (parent->fdset, &this->server_sock);
+
+ close (this->server_sock.fd);
+ this->server_sock.fd = -1;
+ }
+ return TRUE;
+}
diff --git a/gst/tcp/gsttcpserversink.h b/gst/tcp/gsttcpserversink.h
new file mode 100644
index 0000000..ac8846d
--- /dev/null
+++ b/gst/tcp/gsttcpserversink.h
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+
+#ifndef __GST_TCP_SERVER_SINK_H__
+#define __GST_TCP_SERVER_SINK_H__
+
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <arpa/inet.h>
+#include "gstmultifdsink.h"
+
+#define GST_TYPE_TCP_SERVER_SINK \
+ (gst_tcp_server_sink_get_type())
+#define GST_TCP_SERVER_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TCP_SERVER_SINK,GstTCPServerSink))
+#define GST_TCP_SERVER_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TCP_SERVER_SINK,GstTCPServerSinkClass))
+#define GST_IS_TCP_SERVER_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TCP_SERVER_SINK))
+#define GST_IS_TCP_SERVER_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TCP_SERVER_SINK))
+
+typedef struct _GstTCPServerSink GstTCPServerSink;
+typedef struct _GstTCPServerSinkClass GstTCPServerSinkClass;
+
+typedef enum {
+ GST_TCP_SERVER_SINK_OPEN = (GST_ELEMENT_FLAG_LAST << 0),
+
+ GST_TCP_SERVER_SINK_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} GstTCPServerSinkFlags;
+
+/**
+ * GstTCPServerSink:
+ *
+ * Opaque data structure.
+ */
+struct _GstTCPServerSink {
+ GstMultiFdSink element;
+
+ /* server information */
+ int server_port;
+ gchar *host;
+ struct sockaddr_in server_sin;
+
+ /* socket */
+ GstPollFD server_sock;
+};
+
+struct _GstTCPServerSinkClass {
+ GstMultiFdSinkClass parent_class;
+};
+
+GType gst_tcp_server_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TCP_SERVER_SINK_H__ */
diff --git a/gst/tcp/gsttcpserversrc.c b/gst/tcp/gsttcpserversrc.c
new file mode 100644
index 0000000..786557e
--- /dev/null
+++ b/gst/tcp/gsttcpserversrc.c
@@ -0,0 +1,412 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+/**
+ * SECTION:element-tcpserversrc
+ * @see_also: #tcpserversink
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * # server:
+ * gst-launch tcpserversrc protocol=none port=3000 ! fdsink fd=2
+ * # client:
+ * gst-launch fdsrc fd=1 ! tcpclientsink protocol=none port=3000
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst-i18n-plugin.h>
+#include "gsttcp.h"
+#include "gsttcpserversrc.h"
+#include <string.h> /* memset */
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+
+
+GST_DEBUG_CATEGORY_STATIC (tcpserversrc_debug);
+#define GST_CAT_DEFAULT tcpserversrc_debug
+
+#define TCP_DEFAULT_LISTEN_HOST NULL /* listen on all interfaces */
+#define TCP_BACKLOG 1 /* client connection queue */
+
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+
+enum
+{
+ PROP_0,
+ PROP_HOST,
+ PROP_PORT
+};
+
+#define gst_tcp_server_src_parent_class parent_class
+G_DEFINE_TYPE (GstTCPServerSrc, gst_tcp_server_src, GST_TYPE_PUSH_SRC);
+
+
+static void gst_tcp_server_src_finalize (GObject * gobject);
+
+static gboolean gst_tcp_server_src_start (GstBaseSrc * bsrc);
+static gboolean gst_tcp_server_src_stop (GstBaseSrc * bsrc);
+static gboolean gst_tcp_server_src_unlock (GstBaseSrc * bsrc);
+static GstFlowReturn gst_tcp_server_src_create (GstPushSrc * psrc,
+ GstBuffer ** buf);
+
+static void gst_tcp_server_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tcp_server_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_tcp_server_src_class_init (GstTCPServerSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+ GstPushSrcClass *gstpush_src_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+ gstpush_src_class = (GstPushSrcClass *) klass;
+
+ gobject_class->set_property = gst_tcp_server_src_set_property;
+ gobject_class->get_property = gst_tcp_server_src_get_property;
+ gobject_class->finalize = gst_tcp_server_src_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_HOST,
+ g_param_spec_string ("host", "Host", "The hostname to listen as",
+ TCP_DEFAULT_LISTEN_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PORT,
+ g_param_spec_int ("port", "Port", "The port to listen to",
+ 0, TCP_HIGHEST_PORT, TCP_DEFAULT_PORT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "TCP server source", "Source/Network",
+ "Receive data as a server over the network via TCP",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+
+ gstbasesrc_class->start = gst_tcp_server_src_start;
+ gstbasesrc_class->stop = gst_tcp_server_src_stop;
+ gstbasesrc_class->unlock = gst_tcp_server_src_unlock;
+
+ gstpush_src_class->create = gst_tcp_server_src_create;
+
+ GST_DEBUG_CATEGORY_INIT (tcpserversrc_debug, "tcpserversrc", 0,
+ "TCP Server Source");
+}
+
+static void
+gst_tcp_server_src_init (GstTCPServerSrc * src)
+{
+ src->server_port = TCP_DEFAULT_PORT;
+ src->host = g_strdup (TCP_DEFAULT_HOST);
+ src->server_sock_fd.fd = -1;
+ src->client_sock_fd.fd = -1;
+
+ GST_OBJECT_FLAG_UNSET (src, GST_TCP_SERVER_SRC_OPEN);
+}
+
+static void
+gst_tcp_server_src_finalize (GObject * gobject)
+{
+ GstTCPServerSrc *src = GST_TCP_SERVER_SRC (gobject);
+
+ g_free (src->host);
+
+ G_OBJECT_CLASS (parent_class)->finalize (gobject);
+}
+
+static GstFlowReturn
+gst_tcp_server_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
+{
+ GstTCPServerSrc *src;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ src = GST_TCP_SERVER_SRC (psrc);
+
+ if (!GST_OBJECT_FLAG_IS_SET (src, GST_TCP_SERVER_SRC_OPEN))
+ goto wrong_state;
+
+restart:
+ if (src->client_sock_fd.fd >= 0) {
+ /* if we have a client, wait for read */
+ gst_poll_fd_ctl_read (src->fdset, &src->server_sock_fd, FALSE);
+ gst_poll_fd_ctl_read (src->fdset, &src->client_sock_fd, TRUE);
+ } else {
+ /* else wait on server socket for connections */
+ gst_poll_fd_ctl_read (src->fdset, &src->server_sock_fd, TRUE);
+ }
+
+ /* no action (0) is an error too in our case */
+ if ((ret = gst_poll_wait (src->fdset, GST_CLOCK_TIME_NONE)) <= 0) {
+ if (ret == -1 && errno == EBUSY)
+ goto select_cancelled;
+ else
+ goto select_error;
+ }
+
+ /* if we have no client socket we can accept one now */
+ if (src->client_sock_fd.fd < 0) {
+ if (gst_poll_fd_can_read (src->fdset, &src->server_sock_fd)) {
+ if ((src->client_sock_fd.fd =
+ accept (src->server_sock_fd.fd,
+ (struct sockaddr *) &src->client_sin,
+ &src->client_sin_len)) == -1)
+ goto accept_error;
+
+ gst_poll_add_fd (src->fdset, &src->client_sock_fd);
+ }
+ /* and restart now to poll the socket. */
+ goto restart;
+ }
+
+ GST_LOG_OBJECT (src, "asked for a buffer");
+
+ ret = gst_tcp_read_buffer (GST_ELEMENT (src), src->client_sock_fd.fd,
+ src->fdset, outbuf);
+
+ if (ret == GST_FLOW_OK) {
+ GST_LOG_OBJECT (src,
+ "Returning buffer from _get of size %" G_GSIZE_FORMAT ", ts %"
+ GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT
+ ", offset %" G_GINT64_FORMAT ", offset_end %" G_GINT64_FORMAT,
+ gst_buffer_get_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));
+ }
+
+ return ret;
+
+wrong_state:
+ {
+ GST_DEBUG_OBJECT (src, "connection to closed, cannot read data");
+ return GST_FLOW_WRONG_STATE;
+ }
+select_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("Select error: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+select_cancelled:
+ {
+ GST_DEBUG_OBJECT (src, "select canceled");
+ return GST_FLOW_WRONG_STATE;
+ }
+accept_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("Could not accept client on server socket: %s", g_strerror (errno)));
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+gst_tcp_server_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTCPServerSrc *tcpserversrc = GST_TCP_SERVER_SRC (object);
+
+ switch (prop_id) {
+ case PROP_HOST:
+ if (!g_value_get_string (value)) {
+ g_warning ("host property cannot be NULL");
+ break;
+ }
+ g_free (tcpserversrc->host);
+ tcpserversrc->host = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_PORT:
+ tcpserversrc->server_port = g_value_get_int (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_tcp_server_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTCPServerSrc *tcpserversrc = GST_TCP_SERVER_SRC (object);
+
+ switch (prop_id) {
+ case PROP_HOST:
+ g_value_set_string (value, tcpserversrc->host);
+ break;
+ case PROP_PORT:
+ g_value_set_int (value, tcpserversrc->server_port);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* set up server */
+static gboolean
+gst_tcp_server_src_start (GstBaseSrc * bsrc)
+{
+ int ret;
+ GstTCPServerSrc *src = GST_TCP_SERVER_SRC (bsrc);
+
+ /* reset caps_received flag */
+ src->caps_received = FALSE;
+
+ /* create the server listener socket */
+ if ((src->server_sock_fd.fd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
+ goto socket_error;
+
+ GST_DEBUG_OBJECT (src, "opened receiving server socket with fd %d",
+ src->server_sock_fd.fd);
+
+ /* make address reusable */
+ ret = 1;
+ if (setsockopt (src->server_sock_fd.fd, SOL_SOCKET, SO_REUSEADDR, &ret,
+ sizeof (int)) < 0)
+ goto sock_opt;
+
+ /* name the socket */
+ memset (&src->server_sin, 0, sizeof (src->server_sin));
+ src->server_sin.sin_family = AF_INET; /* network socket */
+ src->server_sin.sin_port = htons (src->server_port); /* on port */
+ if (src->host) {
+ gchar *host;
+
+ if (!(host = gst_tcp_host_to_ip (GST_ELEMENT (src), src->host)))
+ goto host_error;
+ src->server_sin.sin_addr.s_addr = inet_addr (host);
+ g_free (host);
+ } else
+ src->server_sin.sin_addr.s_addr = htonl (INADDR_ANY);
+
+ /* bind it */
+ GST_DEBUG_OBJECT (src, "binding server socket to address");
+ if ((ret = bind (src->server_sock_fd.fd, (struct sockaddr *) &src->server_sin,
+ sizeof (src->server_sin))) < 0)
+ goto bind_error;
+
+ GST_DEBUG_OBJECT (src, "listening on server socket %d with queue of %d",
+ src->server_sock_fd.fd, TCP_BACKLOG);
+
+ if (listen (src->server_sock_fd.fd, TCP_BACKLOG) == -1)
+ goto listen_error;
+
+ /* create an fdset to keep track of our file descriptors */
+ if ((src->fdset = gst_poll_new (TRUE)) == NULL)
+ goto socket_pair;
+
+ gst_poll_add_fd (src->fdset, &src->server_sock_fd);
+
+ GST_DEBUG_OBJECT (src, "received client");
+
+ GST_OBJECT_FLAG_SET (src, GST_TCP_SERVER_SRC_OPEN);
+
+ return TRUE;
+
+ /* ERRORS */
+socket_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+sock_opt:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
+ ("Could not setsockopt: %s", g_strerror (errno)));
+ gst_tcp_socket_close (&src->server_sock_fd);
+ return FALSE;
+ }
+host_error:
+ {
+ gst_tcp_socket_close (&src->server_sock_fd);
+ return FALSE;
+ }
+bind_error:
+ {
+ gst_tcp_socket_close (&src->server_sock_fd);
+ switch (errno) {
+ default:
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("bind failed: %s", g_strerror (errno)));
+ break;
+ }
+ return FALSE;
+ }
+listen_error:
+ {
+ gst_tcp_socket_close (&src->server_sock_fd);
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("Could not listen on server socket: %s", g_strerror (errno)));
+ return FALSE;
+ }
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ gst_tcp_socket_close (&src->server_sock_fd);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_tcp_server_src_stop (GstBaseSrc * bsrc)
+{
+ GstTCPServerSrc *src = GST_TCP_SERVER_SRC (bsrc);
+
+ gst_poll_free (src->fdset);
+ src->fdset = NULL;
+
+ gst_tcp_socket_close (&src->server_sock_fd);
+ gst_tcp_socket_close (&src->client_sock_fd);
+
+ GST_OBJECT_FLAG_UNSET (src, GST_TCP_SERVER_SRC_OPEN);
+
+ return TRUE;
+}
+
+/* will be called only between calls to start() and stop() */
+static gboolean
+gst_tcp_server_src_unlock (GstBaseSrc * bsrc)
+{
+ GstTCPServerSrc *src = GST_TCP_SERVER_SRC (bsrc);
+
+ gst_poll_set_flushing (src->fdset, TRUE);
+
+ return TRUE;
+}
diff --git a/gst/tcp/gsttcpserversrc.h b/gst/tcp/gsttcpserversrc.h
new file mode 100644
index 0000000..f5e80e2
--- /dev/null
+++ b/gst/tcp/gsttcpserversrc.h
@@ -0,0 +1,88 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> 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.
+ */
+
+
+#ifndef __GST_TCP_SERVER_SRC_H__
+#define __GST_TCP_SERVER_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+G_END_DECLS
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "gsttcp.h"
+
+#include <fcntl.h>
+
+#define GST_TYPE_TCP_SERVER_SRC \
+ (gst_tcp_server_src_get_type())
+#define GST_TCP_SERVER_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TCP_SERVER_SRC,GstTCPServerSrc))
+#define GST_TCP_SERVER_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TCP_SERVER_SRC,GstTCPServerSrcClass))
+#define GST_IS_TCP_SERVER_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TCP_SERVER_SRC))
+#define GST_IS_TCP_SERVER_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TCP_SERVER_SRC))
+
+typedef struct _GstTCPServerSrc GstTCPServerSrc;
+typedef struct _GstTCPServerSrcClass GstTCPServerSrcClass;
+
+typedef enum {
+ GST_TCP_SERVER_SRC_OPEN = (GST_ELEMENT_FLAG_LAST << 0),
+
+ GST_TCP_SERVER_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} GstTCPServerSrcFlags;
+
+struct _GstTCPServerSrc {
+ GstPushSrc element;
+
+ /* server information */
+ int server_port;
+ gchar *host;
+ struct sockaddr_in server_sin;
+ GstPollFD server_sock_fd;
+
+ /* client information */
+ struct sockaddr_in client_sin;
+ socklen_t client_sin_len;
+ GstPollFD client_sock_fd;
+
+ GstPoll *fdset;
+
+ gboolean caps_received; /* if we have received caps yet */
+};
+
+struct _GstTCPServerSrcClass {
+ GstPushSrcClass parent_class;
+};
+
+GType gst_tcp_server_src_get_type (void);
+
+G_BEGIN_DECLS
+
+#endif /* __GST_TCP_SERVER_SRC_H__ */
diff --git a/gst/typefind/Makefile.am b/gst/typefind/Makefile.am
new file mode 100644
index 0000000..3258b15
--- /dev/null
+++ b/gst/typefind/Makefile.am
@@ -0,0 +1,26 @@
+plugin_LTLIBRARIES = libgsttypefindfunctions.la
+
+libgsttypefindfunctions_la_SOURCES = gsttypefindfunctions.c
+libgsttypefindfunctions_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CFLAGS) $(GIO_CFLAGS)
+libgsttypefindfunctions_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttypefindfunctions_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) $(GIO_LIBS)
+
+libgsttypefindfunctions_la_LIBTOOLFLAGS = --tag=disable-static
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgsttypefindfunctions -:SHARED libgsttypefindfunctions \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttypefindfunctions_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsttypefindfunctions_la_CFLAGS) \
+ -:LDFLAGS $(libgsttypefindfunctions_la_LDFLAGS) \
+ $(libgsttypefindfunctions_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/typefind/Makefile.in b/gst/typefind/Makefile.in
new file mode 100644
index 0000000..be4c8cf
--- /dev/null
+++ b/gst/typefind/Makefile.in
@@ -0,0 +1,774 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/typefind
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgsttypefindfunctions_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgsttypefindfunctions_la_OBJECTS = \
+ libgsttypefindfunctions_la-gsttypefindfunctions.lo
+libgsttypefindfunctions_la_OBJECTS = \
+ $(am_libgsttypefindfunctions_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgsttypefindfunctions_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgsttypefindfunctions_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgsttypefindfunctions_la_CFLAGS) \
+ $(CFLAGS) $(libgsttypefindfunctions_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgsttypefindfunctions_la_SOURCES)
+DIST_SOURCES = $(libgsttypefindfunctions_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgsttypefindfunctions.la
+libgsttypefindfunctions_la_SOURCES = gsttypefindfunctions.c
+libgsttypefindfunctions_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CFLAGS) $(GIO_CFLAGS)
+
+libgsttypefindfunctions_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgsttypefindfunctions_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) $(GIO_LIBS)
+
+libgsttypefindfunctions_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/typefind/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/typefind/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
+libgsttypefindfunctions.la: $(libgsttypefindfunctions_la_OBJECTS) $(libgsttypefindfunctions_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgsttypefindfunctions_la_LINK) -rpath $(plugindir) $(libgsttypefindfunctions_la_OBJECTS) $(libgsttypefindfunctions_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttypefindfunctions_la-gsttypefindfunctions.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgsttypefindfunctions_la-gsttypefindfunctions.lo: gsttypefindfunctions.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttypefindfunctions_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttypefindfunctions_la_CFLAGS) $(CFLAGS) -MT libgsttypefindfunctions_la-gsttypefindfunctions.lo -MD -MP -MF $(DEPDIR)/libgsttypefindfunctions_la-gsttypefindfunctions.Tpo -c -o libgsttypefindfunctions_la-gsttypefindfunctions.lo `test -f 'gsttypefindfunctions.c' || echo '$(srcdir)/'`gsttypefindfunctions.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttypefindfunctions_la-gsttypefindfunctions.Tpo $(DEPDIR)/libgsttypefindfunctions_la-gsttypefindfunctions.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttypefindfunctions.c' object='libgsttypefindfunctions_la-gsttypefindfunctions.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttypefindfunctions_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttypefindfunctions_la_CFLAGS) $(CFLAGS) -c -o libgsttypefindfunctions_la-gsttypefindfunctions.lo `test -f 'gsttypefindfunctions.c' || echo '$(srcdir)/'`gsttypefindfunctions.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgsttypefindfunctions -:SHARED libgsttypefindfunctions \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgsttypefindfunctions_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsttypefindfunctions_la_CFLAGS) \
+ -:LDFLAGS $(libgsttypefindfunctions_la_LDFLAGS) \
+ $(libgsttypefindfunctions_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/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c
new file mode 100644
index 0000000..2e2a567
--- /dev/null
+++ b/gst/typefind/gsttypefindfunctions.c
@@ -0,0 +1,4623 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * Copyright (C) 2005-2009 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gsttypefindfunctions.c: collection of various typefind 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 <glib.h>
+#include <glib/gprintf.h>
+
+/* don't want to add gio xdgmime typefinder if gio was disabled via configure */
+#ifdef HAVE_GIO
+#include <gio/gio.h>
+#define USE_GIO
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <gst/pbutils/pbutils.h>
+
+GST_DEBUG_CATEGORY_STATIC (type_find_debug);
+#define GST_CAT_DEFAULT type_find_debug
+
+/* so our code stays ready for 0.11 */
+#define gst_type_find_peek(tf,off,len) \
+ ((const guint8 *)gst_type_find_peek((tf),(off),(len)))
+
+/* DataScanCtx: helper for typefind functions that scan through data
+ * step-by-step, to avoid doing a peek at each and every offset */
+
+#define DATA_SCAN_CTX_CHUNK_SIZE 4096
+
+typedef struct
+{
+ guint64 offset;
+ const guint8 *data;
+ gint size;
+} DataScanCtx;
+
+static inline void
+data_scan_ctx_advance (GstTypeFind * tf, DataScanCtx * c, guint bytes_to_skip)
+{
+ c->offset += bytes_to_skip;
+ if (G_LIKELY (c->size > bytes_to_skip)) {
+ c->size -= bytes_to_skip;
+ c->data += bytes_to_skip;
+ } else {
+ c->data += c->size;
+ c->size = 0;
+ }
+}
+
+static inline gboolean
+data_scan_ctx_ensure_data (GstTypeFind * tf, DataScanCtx * c, gint min_len)
+{
+ const guint8 *data;
+ guint64 len;
+ guint chunk_len = MAX (DATA_SCAN_CTX_CHUNK_SIZE, min_len);
+
+ if (G_LIKELY (c->size >= min_len))
+ return TRUE;
+
+ data = gst_type_find_peek (tf, c->offset, chunk_len);
+ if (G_LIKELY (data != NULL)) {
+ c->data = data;
+ c->size = chunk_len;
+ return TRUE;
+ }
+
+ /* if there's less than our chunk size, try to get as much as we can, but
+ * always at least min_len bytes (we might be typefinding the first buffer
+ * of the stream and not have as much data available as we'd like) */
+ len = gst_type_find_get_length (tf);
+ if (len > 0) {
+ len = CLAMP (len - c->offset, min_len, chunk_len);
+ } else {
+ len = min_len;
+ }
+
+ data = gst_type_find_peek (tf, c->offset, len);
+ if (data != NULL) {
+ c->data = data;
+ c->size = len;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static inline gboolean
+data_scan_ctx_memcmp (GstTypeFind * tf, DataScanCtx * c, guint offset,
+ const gchar * data, guint len)
+{
+ if (!data_scan_ctx_ensure_data (tf, c, offset + len))
+ return FALSE;
+
+ return (memcmp (c->data + offset, data, len) == 0);
+}
+
+/*** text/plain ***/
+static gboolean xml_check_first_element (GstTypeFind * tf,
+ const gchar * element, guint elen, gboolean strict);
+static gboolean sdp_check_header (GstTypeFind * tf);
+
+static GstStaticCaps utf8_caps = GST_STATIC_CAPS ("text/plain");
+
+#define UTF8_CAPS gst_static_caps_get(&utf8_caps)
+
+static gboolean
+utf8_type_find_have_valid_utf8_at_offset (GstTypeFind * tf, guint64 offset,
+ GstTypeFindProbability * prob)
+{
+ const guint8 *data;
+
+ /* randomly decided values */
+ guint min_size = 16; /* minimum size */
+ guint size = 32 * 1024; /* starting size */
+ guint probability = 95; /* starting probability */
+ guint step = 10; /* how much we reduce probability in each
+ * iteration */
+
+ while (probability > step && size > min_size) {
+ data = gst_type_find_peek (tf, offset, size);
+ if (data) {
+ gchar *end;
+ gchar *start = (gchar *) data;
+
+ if (g_utf8_validate (start, size, (const gchar **) &end) || (end - start + 4 > size)) { /* allow last char to be cut off */
+ *prob = probability;
+ return TRUE;
+ }
+ *prob = 0;
+ return FALSE;
+ }
+ size /= 2;
+ probability -= step;
+ }
+ *prob = 0;
+ return FALSE;
+}
+
+static void
+utf8_type_find (GstTypeFind * tf, gpointer unused)
+{
+ GstTypeFindProbability start_prob, mid_prob;
+ guint64 length;
+
+ /* leave xml to the xml typefinders */
+ if (xml_check_first_element (tf, "", 0, TRUE))
+ return;
+
+ /* leave sdp to the sdp typefinders */
+ if (sdp_check_header (tf))
+ return;
+
+ /* check beginning of stream */
+ if (!utf8_type_find_have_valid_utf8_at_offset (tf, 0, &start_prob))
+ return;
+
+ GST_LOG ("start is plain text with probability of %u", start_prob);
+
+ /* POSSIBLE is the highest probability we ever return if we can't
+ * probe into the middle of the file and don't know its length */
+
+ length = gst_type_find_get_length (tf);
+ if (length == 0 || length == (guint64) - 1) {
+ gst_type_find_suggest (tf, MIN (start_prob, GST_TYPE_FIND_POSSIBLE),
+ UTF8_CAPS);
+ return;
+ }
+
+ if (length < 64 * 1024) {
+ gst_type_find_suggest (tf, start_prob, UTF8_CAPS);
+ return;
+ }
+
+ /* check middle of stream */
+ if (!utf8_type_find_have_valid_utf8_at_offset (tf, length / 2, &mid_prob))
+ return;
+
+ GST_LOG ("middle is plain text with probability of %u", mid_prob);
+ gst_type_find_suggest (tf, (start_prob + mid_prob) / 2, UTF8_CAPS);
+}
+
+/*** text/uri-list ***/
+
+static GstStaticCaps uri_caps = GST_STATIC_CAPS ("text/uri-list");
+
+#define URI_CAPS (gst_static_caps_get(&uri_caps))
+#define BUFFER_SIZE 16 /* If the string is < 16 bytes we're screwed */
+#define INC_BUFFER { \
+ pos++; \
+ if (pos == BUFFER_SIZE) { \
+ pos = 0; \
+ offset += BUFFER_SIZE; \
+ data = gst_type_find_peek (tf, offset, BUFFER_SIZE); \
+ if (data == NULL) return; \
+ } else { \
+ data++; \
+ } \
+}
+static void
+uri_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, BUFFER_SIZE);
+ guint pos = 0;
+ guint offset = 0;
+
+ if (data) {
+ /* Search for # comment lines */
+ while (*data == '#') {
+ /* Goto end of line */
+ while (*data != '\n') {
+ INC_BUFFER;
+ }
+
+ INC_BUFFER;
+ }
+
+ if (!g_ascii_isalpha (*data)) {
+ /* Had a non alpha char - can't be uri-list */
+ return;
+ }
+
+ INC_BUFFER;
+
+ while (g_ascii_isalnum (*data)) {
+ INC_BUFFER;
+ }
+
+ if (*data != ':') {
+ /* First non alpha char is not a : */
+ return;
+ }
+
+ /* Get the next 2 bytes as well */
+ data = gst_type_find_peek (tf, offset + pos, 3);
+ if (data == NULL)
+ return;
+
+ if (data[1] != '/' && data[2] != '/') {
+ return;
+ }
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, URI_CAPS);
+ }
+}
+
+/*** application/x-hls ***/
+
+static GstStaticCaps hls_caps = GST_STATIC_CAPS ("application/x-hls");
+#define HLS_CAPS (gst_static_caps_get(&hls_caps))
+
+/* See http://tools.ietf.org/html/draft-pantos-http-live-streaming-05 */
+static void
+hls_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 7)))
+ return;
+
+ if (memcmp (c.data, "#EXTM3U", 7))
+ return;
+
+ data_scan_ctx_advance (tf, &c, 7);
+
+ /* Check only the first 256 bytes */
+ while (c.offset < 256) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 21)))
+ return;
+
+ /* Search for # comment lines */
+ if (c.data[0] == '#' && (memcmp (c.data, "#EXT-X-TARGETDURATION", 21) == 0
+ || memcmp (c.data, "#EXT-X-STREAM-INF", 17) == 0)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, HLS_CAPS);
+ return;
+ }
+
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+}
+
+
+/*** application/xml **********************************************************/
+
+#define XML_BUFFER_SIZE 16
+#define XML_INC_BUFFER { \
+ pos++; \
+ if (pos == XML_BUFFER_SIZE) { \
+ pos = 0; \
+ offset += XML_BUFFER_SIZE; \
+ data = gst_type_find_peek (tf, offset, XML_BUFFER_SIZE); \
+ if (data == NULL) return FALSE; \
+ } else { \
+ data++; \
+ } \
+}
+
+static gboolean
+xml_check_first_element (GstTypeFind * tf, const gchar * element, guint elen,
+ gboolean strict)
+{
+ gboolean got_xmldec;
+ const guint8 *data;
+ guint offset = 0;
+ guint pos = 0;
+
+ data = gst_type_find_peek (tf, 0, XML_BUFFER_SIZE);
+ if (!data)
+ return FALSE;
+
+ /* look for the XMLDec
+ * see XML spec 2.8, Prolog and Document Type Declaration
+ * http://www.w3.org/TR/2004/REC-xml-20040204/#sec-prolog-dtd */
+ got_xmldec = (memcmp (data, "<?xml", 5) == 0);
+
+ if (strict && !got_xmldec)
+ return FALSE;
+
+ /* skip XMLDec in any case if we've got one */
+ if (got_xmldec) {
+ pos += 5;
+ data += 5;
+ }
+
+ /* look for the first element, it has to be the requested element. Bail
+ * out if it is not within the first 4kB. */
+ while (data && (offset + pos) < 4096) {
+ while (*data != '<' && (offset + pos) < 4096) {
+ XML_INC_BUFFER;
+ }
+
+ XML_INC_BUFFER;
+ if (!g_ascii_isalpha (*data)) {
+ /* if not alphabetic, it's a PI or an element / attribute declaration
+ * like <?xxx or <!xxx */
+ XML_INC_BUFFER;
+ continue;
+ }
+
+ /* the first normal element, check if it's the one asked for */
+ data = gst_type_find_peek (tf, offset + pos, elen + 1);
+ return (data && element && strncmp ((char *) data, element, elen) == 0);
+ }
+
+ return FALSE;
+}
+
+static GstStaticCaps generic_xml_caps = GST_STATIC_CAPS ("application/xml");
+
+#define GENERIC_XML_CAPS (gst_static_caps_get(&generic_xml_caps))
+static void
+xml_type_find (GstTypeFind * tf, gpointer unused)
+{
+ if (xml_check_first_element (tf, "", 0, TRUE)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, GENERIC_XML_CAPS);
+ }
+}
+
+/*** application/sdp *********************************************************/
+
+static GstStaticCaps sdp_caps = GST_STATIC_CAPS ("application/sdp");
+
+#define SDP_CAPS (gst_static_caps_get(&sdp_caps))
+static gboolean
+sdp_check_header (GstTypeFind * tf)
+{
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 5);
+ if (!data)
+ return FALSE;
+
+ /* sdp must start with v=0[\r]\n */
+ if (memcmp (data, "v=0", 3))
+ return FALSE;
+
+ if (data[3] == '\r' && data[4] == '\n')
+ return TRUE;
+ if (data[3] == '\n')
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+sdp_type_find (GstTypeFind * tf, gpointer unused)
+{
+ if (sdp_check_header (tf))
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SDP_CAPS);
+}
+
+/*** application/smil *********************************************************/
+
+static GstStaticCaps smil_caps = GST_STATIC_CAPS ("application/smil");
+
+#define SMIL_CAPS (gst_static_caps_get(&smil_caps))
+static void
+smil_type_find (GstTypeFind * tf, gpointer unused)
+{
+ if (xml_check_first_element (tf, "smil", 4, FALSE)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SMIL_CAPS);
+ }
+}
+
+/*** text/html ***/
+
+static GstStaticCaps html_caps = GST_STATIC_CAPS ("text/html");
+
+#define HTML_CAPS gst_static_caps_get (&html_caps)
+
+static void
+html_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const gchar *d, *data;
+
+ data = (const gchar *) gst_type_find_peek (tf, 0, 16);
+ if (!data)
+ return;
+
+ if (!g_ascii_strncasecmp (data, "<!DOCTYPE HTML", 14)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, HTML_CAPS);
+ } else if (xml_check_first_element (tf, "html", 4, FALSE)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, HTML_CAPS);
+ } else if ((d = memchr (data, '<', 16))) {
+ data = (const gchar *) gst_type_find_peek (tf, d - data, 6);
+ if (data && g_ascii_strncasecmp (data, "<html>", 6) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, HTML_CAPS);
+ }
+ }
+}
+
+/*** audio/midi ***/
+
+static GstStaticCaps mid_caps = GST_STATIC_CAPS ("audio/midi");
+
+#define MID_CAPS gst_static_caps_get(&mid_caps)
+static void
+mid_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ /* http://jedi.ks.uiuc.edu/~johns/links/music/midifile.html */
+ if (data && data[0] == 'M' && data[1] == 'T' && data[2] == 'h'
+ && data[3] == 'd')
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MID_CAPS);
+}
+
+/*** audio/mobile-xmf ***/
+
+static GstStaticCaps mxmf_caps = GST_STATIC_CAPS ("audio/mobile-xmf");
+
+#define MXMF_CAPS gst_static_caps_get(&mxmf_caps)
+static void
+mxmf_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = NULL;
+
+ /* Search FileId "XMF_" 4 bytes */
+ data = gst_type_find_peek (tf, 0, 4);
+ if (data && data[0] == 'X' && data[1] == 'M' && data[2] == 'F'
+ && data[3] == '_') {
+ /* Search Format version "2.00" 4 bytes */
+ data = gst_type_find_peek (tf, 4, 4);
+ if (data && data[0] == '2' && data[1] == '.' && data[2] == '0'
+ && data[3] == '0') {
+ /* Search TypeId 2 1 byte */
+ data = gst_type_find_peek (tf, 11, 1);
+ if (data && data[0] == 2) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MXMF_CAPS);
+ }
+ }
+ }
+}
+
+
+/*** video/x-fli ***/
+
+static GstStaticCaps flx_caps = GST_STATIC_CAPS ("video/x-fli");
+
+#define FLX_CAPS gst_static_caps_get(&flx_caps)
+static void
+flx_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 134);
+
+ if (data) {
+ /* check magic and the frame type of the first frame */
+ if ((data[4] == 0x11 || data[4] == 0x12 ||
+ data[4] == 0x30 || data[4] == 0x44) &&
+ data[5] == 0xaf &&
+ ((data[132] == 0x00 || data[132] == 0xfa) && data[133] == 0xf1)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FLX_CAPS);
+ }
+ return;
+ }
+ data = gst_type_find_peek (tf, 0, 6);
+ if (data) {
+ /* check magic only */
+ if ((data[4] == 0x11 || data[4] == 0x12 ||
+ data[4] == 0x30 || data[4] == 0x44) && data[5] == 0xaf) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, FLX_CAPS);
+ }
+ return;
+ }
+}
+
+/*** application/x-id3 ***/
+
+static GstStaticCaps id3_caps = GST_STATIC_CAPS ("application/x-id3");
+
+#define ID3_CAPS gst_static_caps_get(&id3_caps)
+static void
+id3v2_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 10);
+
+ if (data && memcmp (data, "ID3", 3) == 0 &&
+ data[3] != 0xFF && data[4] != 0xFF &&
+ (data[6] & 0x80) == 0 && (data[7] & 0x80) == 0 &&
+ (data[8] & 0x80) == 0 && (data[9] & 0x80) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, ID3_CAPS);
+ }
+}
+
+static void
+id3v1_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, -128, 3);
+
+ if (data && memcmp (data, "TAG", 3) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, ID3_CAPS);
+ }
+}
+
+/*** application/x-ape ***/
+
+static GstStaticCaps apetag_caps = GST_STATIC_CAPS ("application/x-apetag");
+
+#define APETAG_CAPS gst_static_caps_get(&apetag_caps)
+static void
+apetag_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+
+ /* APEv1/2 at start of file */
+ data = gst_type_find_peek (tf, 0, 8);
+ if (data && !memcmp (data, "APETAGEX", 8)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, APETAG_CAPS);
+ return;
+ }
+
+ /* APEv1/2 at end of file */
+ data = gst_type_find_peek (tf, -32, 8);
+ if (data && !memcmp (data, "APETAGEX", 8)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, APETAG_CAPS);
+ return;
+ }
+}
+
+/*** audio/x-ttafile ***/
+
+static GstStaticCaps tta_caps = GST_STATIC_CAPS ("audio/x-ttafile");
+
+#define TTA_CAPS gst_static_caps_get(&tta_caps)
+static void
+tta_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 3);
+
+ if (data) {
+ if (memcmp (data, "TTA", 3) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, TTA_CAPS);
+ return;
+ }
+ }
+}
+
+/*** audio/x-flac ***/
+static GstStaticCaps flac_caps = GST_STATIC_CAPS ("audio/x-flac");
+
+#define FLAC_CAPS (gst_static_caps_get(&flac_caps))
+
+static void
+flac_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 4)))
+ return;
+
+ /* standard flac (also old/broken flac-in-ogg with an initial 4-byte marker
+ * packet and without the usual packet framing) */
+ if (memcmp (c.data, "fLaC", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FLAC_CAPS);
+ return;
+ }
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 6)))
+ return;
+
+ /* flac-in-ogg, see http://flac.sourceforge.net/ogg_mapping.html */
+ if (memcmp (c.data, "\177FLAC\001", 6) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FLAC_CAPS);
+ return;
+ }
+
+/* disabled because it happily typefinds /dev/urandom as audio/x-flac, and
+ * because I yet have to see header-less flac in the wild */
+#if 0
+ /* flac without headers (subset format) */
+ /* 64K should be enough */
+ while (c.offset < (64 * 1024)) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 4)))
+ break;
+
+ /* look for frame header,
+ * http://flac.sourceforge.net/format.html#frame_header
+ */
+ if (c.data[0] == 0xff && (c.data[1] >> 2) == 0x3e) {
+ /* bit 15 in the header must be 0 */
+ if (((c.data[1] >> 1) & 0x01) == 0x01)
+ goto advance;
+
+ /* blocksize must be != 0x00 */
+ if ((c.data[2] >> 4) == 0x00)
+ goto advance;
+
+ /* samplerate must be != 0x0f */
+ if ((c.data[2] & 0x0f) == 0x0f)
+ goto advance;
+ /* also 0 is invalid, as it means get the info from the header and we
+ * don't have headers if we are here */
+ if ((c.data[2] & 0x0f) == 0x00)
+ goto advance;
+
+ /* channel assignment must be < 11 */
+ if ((c.data[3] >> 4) >= 11)
+ goto advance;
+
+ /* sample size must be != 0x07 and != 0x05 */
+ if (((c.data[3] >> 1) & 0x07) == 0x07)
+ goto advance;
+ if (((c.data[3] >> 1) & 0x07) == 0x05)
+ goto advance;
+ /* also 0 is invalid, as it means get the info from the header and we
+ * don't have headers if we are here */
+ if (((c.data[3] >> 1) & 0x07) == 0x00)
+ goto advance;
+
+ /* next bit must be 0 */
+ if ((c.data[3] & 0x01) == 0x01)
+ goto advance;
+
+ /* FIXME: shouldn't we include the crc check ? */
+
+ GST_DEBUG ("Found flac without headers at %d", (gint) c.offset);
+ gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, FLAC_CAPS);
+ return;
+ }
+ advance:
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+#endif
+}
+
+/*** audio/mpeg version 2, 4 ***/
+
+static GstStaticCaps aac_caps = GST_STATIC_CAPS ("audio/mpeg, "
+ "mpegversion = (int) { 2, 4 }, framed = (bool) false");
+#define AAC_CAPS (gst_static_caps_get(&aac_caps))
+#define AAC_AMOUNT (4096)
+static void
+aac_type_find (GstTypeFind * tf, gpointer unused)
+{
+ /* LUT to convert the AudioObjectType from the ADTS header to a string */
+ DataScanCtx c = { 0, NULL, 0 };
+
+ while (c.offset < AAC_AMOUNT) {
+ guint snc, len;
+
+ /* detect adts header or adif header.
+ * The ADIF header is 4 bytes, that should be OK. The ADTS header, on
+ * the other hand, is 14 bits only, so we require one valid frame with
+ * again a valid syncpoint on the next one (28 bits) for certainty. We
+ * require 4 kB, which is quite a lot, since frames are generally 200-400
+ * bytes.
+ * LOAS has 2 possible syncwords, which are 11 bits and 16 bits long.
+ * The following stream syntax depends on which one is found.
+ */
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 6)))
+ break;
+
+ snc = GST_READ_UINT16_BE (c.data);
+ if (G_UNLIKELY ((snc & 0xfff6) == 0xfff0)) {
+ /* ADTS header - find frame length */
+ GST_DEBUG ("Found one ADTS syncpoint at offset 0x%" G_GINT64_MODIFIER
+ "x, tracing next...", c.offset);
+ len = ((c.data[3] & 0x03) << 11) |
+ (c.data[4] << 3) | ((c.data[5] & 0xe0) >> 5);
+
+ if (len == 0 || !data_scan_ctx_ensure_data (tf, &c, len + 2)) {
+ GST_DEBUG ("Wrong sync or next frame not within reach, len=%u", len);
+ goto next;
+ }
+
+ /* check if there's a second ADTS frame */
+ snc = GST_READ_UINT16_BE (c.data + len);
+ if ((snc & 0xfff6) == 0xfff0) {
+ GstCaps *caps;
+ guint mpegversion, sample_freq_idx, channel_config, profile_idx, rate;
+ guint8 audio_config[2];
+
+ mpegversion = (c.data[1] & 0x08) ? 2 : 4;
+ profile_idx = c.data[2] >> 6;
+ sample_freq_idx = ((c.data[2] & 0x3c) >> 2);
+ channel_config = ((c.data[2] & 0x01) << 2) + (c.data[3] >> 6);
+
+ GST_DEBUG ("Found second ADTS-%d syncpoint at offset 0x%"
+ G_GINT64_MODIFIER "x, framelen %u", mpegversion, c.offset, len);
+
+ /* 0xd and 0xe are reserved. 0xf means the sample frequency is directly
+ * specified in the header, but that's not allowed for ADTS */
+ if (sample_freq_idx > 0xc) {
+ GST_DEBUG ("Unexpected sample frequency index %d or wrong sync",
+ sample_freq_idx);
+ goto next;
+ }
+
+ rate = gst_codec_utils_aac_get_sample_rate_from_index (sample_freq_idx);
+ GST_LOG ("ADTS: profile=%u, rate=%u", profile_idx, rate);
+
+ /* The ADTS frame header is slightly different from the
+ * AudioSpecificConfig defined for the MPEG-4 container, so we just
+ * construct enough of it for getting the level here. */
+ /* ADTS counts profiles from 0 instead of 1 to save bits */
+ audio_config[0] = (profile_idx + 1) << 3;
+ audio_config[0] |= (sample_freq_idx >> 1) & 0x7;
+ audio_config[1] = (sample_freq_idx & 0x1) << 7;
+ audio_config[1] |= (channel_config & 0xf) << 3;
+
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "framed", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, mpegversion,
+ "stream-format", G_TYPE_STRING, "adts", NULL);
+
+ gst_codec_utils_aac_caps_set_level_and_profile (caps, audio_config, 2);
+
+ /* add rate and number of channels if we can */
+ if (channel_config != 0 && channel_config <= 7) {
+ const guint channels_map[] = { 0, 1, 2, 3, 4, 5, 6, 8 };
+
+ gst_caps_set_simple (caps, "channels", G_TYPE_INT,
+ channels_map[channel_config], "rate", G_TYPE_INT, rate, NULL);
+ }
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, caps);
+ gst_caps_unref (caps);
+ break;
+ }
+
+ GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
+ } else if (G_UNLIKELY (((snc & 0xffe0) == 0x56e0) || (snc == 0x4de1))) {
+ /* LOAS frame */
+
+ GST_DEBUG ("Found one LOAS syncword at offset 0x%" G_GINT64_MODIFIER
+ "x, tracing next...", c.offset);
+
+ /* check length of frame for each type of detectable LOAS streams */
+ if (snc == 0x4de1) {
+ /* EPAudioSyncStream */
+ len = ((c.data[2] & 0x0f) << 9) | (c.data[3] << 1) |
+ ((c.data[4] & 0x80) >> 7);
+ /* add size of EP sync stream header */
+ len += 7;
+ } else {
+ /* AudioSyncStream */
+ len = ((c.data[1] & 0x1f) << 8) | c.data[2];
+ /* add size of sync stream header */
+ len += 3;
+ }
+
+ if (len == 0 || !data_scan_ctx_ensure_data (tf, &c, len + 2)) {
+ GST_DEBUG ("Wrong sync or next frame not within reach, len=%u", len);
+ goto next;
+ }
+
+ /* check if there's a second LOAS frame */
+ snc = GST_READ_UINT16_BE (c.data + len);
+ if (((snc & 0xffe0) == 0x56e0) || (snc == 0x4de1)) {
+ GST_DEBUG ("Found second LOAS syncword at offset 0x%"
+ G_GINT64_MODIFIER "x, framelen %u", c.offset, len);
+
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_LIKELY, "audio/mpeg",
+ "framed", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, 4,
+ "stream-format", G_TYPE_STRING, "loas", NULL);
+ break;
+ }
+
+ GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
+ } else if (!memcmp (c.data, "ADIF", 4)) {
+ /* ADIF header */
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_LIKELY, "audio/mpeg",
+ "framed", G_TYPE_BOOLEAN, FALSE, "mpegversion", G_TYPE_INT, 4,
+ "stream-format", G_TYPE_STRING, "adif", NULL);
+ break;
+ }
+
+ next:
+
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+}
+
+/*** audio/mpeg version 1 ***/
+
+/*
+ * The chance that random data is identified as a valid mp3 header is 63 / 2^18
+ * (0.024%) per try. This makes the function for calculating false positives
+ * 1 - (1 - ((63 / 2 ^18) ^ GST_MP3_TYPEFIND_MIN_HEADERS)) ^ buffersize)
+ * This has the following probabilities of false positives:
+ * datasize MIN_HEADERS
+ * (bytes) 1 2 3 4
+ * 4096 62.6% 0.02% 0% 0%
+ * 16384 98% 0.09% 0% 0%
+ * 1 MiB 100% 5.88% 0% 0%
+ * 1 GiB 100% 100% 1.44% 0%
+ * 1 TiB 100% 100% 100% 0.35%
+ * This means that the current choice (3 headers by most of the time 4096 byte
+ * buffers is pretty safe for now.
+ *
+ * The max. size of each frame is 1440 bytes, which means that for N frames to
+ * be detected, we need 1440 * GST_MP3_TYPEFIND_MIN_HEADERS + 3 bytes of data.
+ * Assuming we step into the stream right after the frame header, this
+ * means we need 1440 * (GST_MP3_TYPEFIND_MIN_HEADERS + 1) - 1 + 3 bytes
+ * of data (5762) to always detect any mp3.
+ */
+
+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] = { {11025, 12000, 8000},
+{22050, 24000, 16000},
+{44100, 48000, 32000}
+};
+
+static inline guint
+mp3_type_frame_length_from_header (guint32 header, guint * put_layer,
+ guint * put_channels, guint * put_bitrate, guint * put_samplerate,
+ gboolean * may_be_free_format, gint possible_free_framelen)
+{
+ guint bitrate, layer, length, mode, samplerate, version, channels;
+
+ if ((header & 0xffe00000) != 0xffe00000)
+ return 0;
+
+ /* we don't need extension, copyright, original or
+ * emphasis for the frame length */
+ header >>= 6;
+
+ /* mode */
+ mode = header & 0x3;
+ header >>= 3;
+
+ /* padding */
+ length = header & 0x1;
+ header >>= 1;
+
+ /* sampling frequency */
+ samplerate = header & 0x3;
+ if (samplerate == 3)
+ return 0;
+ header >>= 2;
+
+ /* bitrate index */
+ bitrate = header & 0xF;
+ if (bitrate == 0 && possible_free_framelen == -1) {
+ GST_LOG ("Possibly a free format mp3 - signalling");
+ *may_be_free_format = TRUE;
+ }
+ if (bitrate == 15 || (bitrate == 0 && possible_free_framelen == -1))
+ return 0;
+
+ /* ignore error correction, too */
+ header >>= 5;
+
+ /* layer */
+ layer = 4 - (header & 0x3);
+ if (layer == 4)
+ return 0;
+ header >>= 2;
+
+ /* version 0=MPEG2.5; 2=MPEG2; 3=MPEG1 */
+ version = header & 0x3;
+ if (version == 1)
+ return 0;
+
+ /* lookup */
+ channels = (mode == 3) ? 1 : 2;
+ samplerate = mp3types_freqs[version > 0 ? version - 1 : 0][samplerate];
+ if (bitrate == 0) {
+ if (layer == 1) {
+ length *= 4;
+ length += possible_free_framelen;
+ bitrate = length * samplerate / 48000;
+ } else {
+ length += possible_free_framelen;
+ bitrate = length * samplerate /
+ ((layer == 3 && version != 3) ? 72000 : 144000);
+ }
+ } else {
+ /* calculating */
+ bitrate = mp3types_bitrates[version == 3 ? 0 : 1][layer - 1][bitrate];
+ if (layer == 1) {
+ length = ((12000 * bitrate / samplerate) + length) * 4;
+ } else {
+ length += ((layer == 3
+ && version != 3) ? 72000 : 144000) * bitrate / samplerate;
+ }
+ }
+
+ GST_LOG ("mp3typefind: calculated mp3 frame length of %u bytes", length);
+ GST_LOG
+ ("mp3typefind: samplerate = %u - bitrate = %u - layer = %u - version = %u"
+ " - channels = %u", samplerate, bitrate, layer, version, channels);
+
+ if (put_layer)
+ *put_layer = layer;
+ if (put_channels)
+ *put_channels = channels;
+ if (put_bitrate)
+ *put_bitrate = bitrate;
+ if (put_samplerate)
+ *put_samplerate = samplerate;
+
+ return length;
+}
+
+
+static GstStaticCaps mp3_caps = GST_STATIC_CAPS ("audio/mpeg, "
+ "mpegversion = (int) 1, layer = (int) [ 1, 3 ]");
+#define MP3_CAPS (gst_static_caps_get(&mp3_caps))
+/*
+ * random values for typefinding
+ * if no more data is available, we will return a probability of
+ * (found_headers/TRY_HEADERS) * (MAXIMUM * (TRY_SYNC - bytes_skipped)
+ * / TRY_SYNC)
+ * if found_headers >= MIN_HEADERS
+ */
+#define GST_MP3_TYPEFIND_MIN_HEADERS (2)
+#define GST_MP3_TYPEFIND_TRY_HEADERS (5)
+#define GST_MP3_TYPEFIND_TRY_SYNC (GST_TYPE_FIND_MAXIMUM * 100) /* 10kB */
+#define GST_MP3_TYPEFIND_SYNC_SIZE (2048)
+#define GST_MP3_WRONG_HEADER (10)
+
+static void
+mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
+ guint * found_layer, GstTypeFindProbability * found_prob)
+{
+ const guint8 *data = NULL;
+ const guint8 *data_end = NULL;
+ guint size;
+ guint64 skipped;
+ gint last_free_offset = -1;
+ gint last_free_framelen = -1;
+ gboolean headerstart = TRUE;
+
+ *found_layer = 0;
+ *found_prob = 0;
+
+ size = 0;
+ skipped = 0;
+ while (skipped < GST_MP3_TYPEFIND_TRY_SYNC) {
+ if (size <= 0) {
+ size = GST_MP3_TYPEFIND_SYNC_SIZE * 2;
+ do {
+ size /= 2;
+ data = gst_type_find_peek (tf, skipped + start_off, size);
+ } while (size > 10 && !data);
+ if (!data)
+ break;
+ data_end = data + size;
+ }
+ if (*data == 0xFF) {
+ const guint8 *head_data = NULL;
+ guint layer = 0, bitrate, samplerate, channels;
+ guint found = 0; /* number of valid headers found */
+ guint64 offset = skipped;
+ gboolean changed = FALSE;
+
+ while (found < GST_MP3_TYPEFIND_TRY_HEADERS) {
+ guint32 head;
+ guint length;
+ guint prev_layer = 0;
+ guint prev_channels = 0, prev_samplerate = 0;
+ gboolean free = FALSE;
+
+ if ((gint64) (offset - skipped + 4) >= 0 &&
+ data + offset - skipped + 4 < data_end) {
+ head_data = data + offset - skipped;
+ } else {
+ head_data = gst_type_find_peek (tf, offset + start_off, 4);
+ }
+ if (!head_data)
+ break;
+ head = GST_READ_UINT32_BE (head_data);
+ if (!(length = mp3_type_frame_length_from_header (head, &layer,
+ &channels, &bitrate, &samplerate, &free,
+ last_free_framelen))) {
+ if (free) {
+ if (last_free_offset == -1)
+ last_free_offset = offset;
+ else {
+ last_free_framelen = offset - last_free_offset;
+ offset = last_free_offset;
+ continue;
+ }
+ } else {
+ last_free_framelen = -1;
+ }
+
+ /* Mark the fact that we didn't find a valid header at the beginning */
+ if (found == 0)
+ headerstart = FALSE;
+
+ GST_LOG ("%d. header at offset %" G_GUINT64_FORMAT
+ " (0x%" G_GINT64_MODIFIER "x) was not an mp3 header "
+ "(possibly-free: %s)", found + 1, start_off + offset,
+ start_off + offset, free ? "yes" : "no");
+ break;
+ }
+ if ((prev_layer && prev_layer != layer) ||
+ /* (prev_bitrate && prev_bitrate != bitrate) || <-- VBR */
+ (prev_samplerate && prev_samplerate != samplerate) ||
+ (prev_channels && prev_channels != channels)) {
+ /* this means an invalid property, or a change, which might mean
+ * that this is not a mp3 but just a random bytestream. It could
+ * be a freaking funky encoded mp3 though. We'll just not count
+ * this header*/
+ if (prev_layer)
+ changed = TRUE;
+ prev_layer = layer;
+ prev_channels = channels;
+ prev_samplerate = samplerate;
+ } else {
+ found++;
+ GST_LOG ("found %d. header at offset %" G_GUINT64_FORMAT " (0x%"
+ G_GINT64_MODIFIER "X)", found, start_off + offset,
+ start_off + offset);
+ }
+ offset += length;
+ }
+ g_assert (found <= GST_MP3_TYPEFIND_TRY_HEADERS);
+ if (head_data == NULL &&
+ gst_type_find_peek (tf, offset + start_off - 1, 1) == NULL)
+ /* Incomplete last frame - don't count it. */
+ found--;
+ if (found == GST_MP3_TYPEFIND_TRY_HEADERS ||
+ (found >= GST_MP3_TYPEFIND_MIN_HEADERS && head_data == NULL)) {
+ /* we can make a valid guess */
+ guint probability = found * GST_TYPE_FIND_MAXIMUM *
+ (GST_MP3_TYPEFIND_TRY_SYNC - skipped) /
+ GST_MP3_TYPEFIND_TRY_HEADERS / GST_MP3_TYPEFIND_TRY_SYNC;
+
+ if (!headerstart
+ && probability > (GST_TYPE_FIND_MINIMUM + GST_MP3_WRONG_HEADER))
+ probability -= GST_MP3_WRONG_HEADER;
+ if (probability < GST_TYPE_FIND_MINIMUM)
+ probability = GST_TYPE_FIND_MINIMUM;
+ if (start_off > 0)
+ probability /= 2;
+ if (!changed)
+ probability = (probability + GST_TYPE_FIND_MAXIMUM) / 2;
+
+ GST_INFO
+ ("audio/mpeg calculated %u = %u * %u / %u * (%u - %"
+ G_GUINT64_FORMAT ") / %u", probability, GST_TYPE_FIND_MAXIMUM,
+ found, GST_MP3_TYPEFIND_TRY_HEADERS, GST_MP3_TYPEFIND_TRY_SYNC,
+ (guint64) skipped, GST_MP3_TYPEFIND_TRY_SYNC);
+ /* make sure we're not id3 tagged */
+ head_data = gst_type_find_peek (tf, -128, 3);
+ if (head_data && (memcmp (head_data, "TAG", 3) == 0)) {
+ probability = 0;
+ }
+ g_assert (probability <= GST_TYPE_FIND_MAXIMUM);
+
+ *found_prob = probability;
+ if (probability > 0)
+ *found_layer = layer;
+ return;
+ }
+ }
+ data++;
+ skipped++;
+ size--;
+ }
+}
+
+static void
+mp3_type_find (GstTypeFind * tf, gpointer unused)
+{
+ GstTypeFindProbability prob, mid_prob;
+ const guint8 *data;
+ guint layer, mid_layer;
+ guint64 length;
+
+ mp3_type_find_at_offset (tf, 0, &layer, &prob);
+ length = gst_type_find_get_length (tf);
+
+ if (length == 0 || length == (guint64) - 1) {
+ if (prob != 0)
+ goto suggest;
+ return;
+ }
+
+ /* if we're pretty certain already, skip the additional check */
+ if (prob >= GST_TYPE_FIND_LIKELY)
+ goto suggest;
+
+ mp3_type_find_at_offset (tf, length / 2, &mid_layer, &mid_prob);
+
+ if (mid_prob > 0) {
+ if (prob == 0) {
+ GST_LOG ("detected audio/mpeg only in the middle (p=%u)", mid_prob);
+ layer = mid_layer;
+ prob = mid_prob;
+ goto suggest;
+ }
+
+ if (layer != mid_layer) {
+ GST_WARNING ("audio/mpeg layer discrepancy: %u vs. %u", layer, mid_layer);
+ return; /* FIXME: or should we just go with the one in the middle? */
+ }
+
+ /* detected mpeg audio both in middle of the file and at the start */
+ prob = (prob + mid_prob) / 2;
+ goto suggest;
+ }
+
+ /* let's see if there's a valid header right at the start */
+ data = gst_type_find_peek (tf, 0, 4); /* use min. frame size? */
+ if (data && mp3_type_frame_length_from_header (GST_READ_UINT32_BE (data),
+ &layer, NULL, NULL, NULL, NULL, 0) != 0) {
+ if (prob == 0)
+ prob = GST_TYPE_FIND_POSSIBLE - 10;
+ else
+ prob = MAX (GST_TYPE_FIND_POSSIBLE - 10, prob + 10);
+ }
+
+ if (prob > 0)
+ goto suggest;
+
+ return;
+
+suggest:
+ {
+ g_return_if_fail (layer >= 1 && layer <= 3);
+
+ gst_type_find_suggest_simple (tf, prob, "audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL);
+ }
+}
+
+/*** audio/x-musepack ***/
+
+static GstStaticCaps musepack_caps =
+GST_STATIC_CAPS ("audio/x-musepack, streamversion= (int) { 7, 8 }");
+
+#define MUSEPACK_CAPS (gst_static_caps_get(&musepack_caps))
+static void
+musepack_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+ GstTypeFindProbability prop = GST_TYPE_FIND_MINIMUM;
+ gint streamversion = -1;
+
+ if (data && memcmp (data, "MP+", 3) == 0) {
+ streamversion = 7;
+ if ((data[3] & 0x7f) == 7) {
+ prop = GST_TYPE_FIND_MAXIMUM;
+ } else {
+ prop = GST_TYPE_FIND_LIKELY + 10;
+ }
+ } else if (data && memcmp (data, "MPCK", 4) == 0) {
+ streamversion = 8;
+ prop = GST_TYPE_FIND_MAXIMUM;
+ }
+
+ if (streamversion != -1) {
+ gst_type_find_suggest_simple (tf, prop, "audio/x-musepack",
+ "streamversion", G_TYPE_INT, streamversion, NULL);
+ }
+}
+
+/*** audio/x-ac3 ***/
+/* FIXME 0.11: should be audio/ac3, but isn't for backwards compatibility */
+static GstStaticCaps ac3_caps = GST_STATIC_CAPS ("audio/x-ac3");
+
+#define AC3_CAPS (gst_static_caps_get(&ac3_caps))
+
+static GstStaticCaps eac3_caps = GST_STATIC_CAPS ("audio/x-eac3");
+
+#define EAC3_CAPS (gst_static_caps_get(&eac3_caps))
+
+struct ac3_frmsize
+{
+ unsigned short bit_rate;
+ unsigned short frm_size[3];
+};
+
+static const struct ac3_frmsize ac3_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 void
+ac3_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+
+ /* Search for an ac3 frame; not neccesarily right at the start, but give it
+ * a lower probability if not found right at the start. Check that the
+ * frame is followed by a second frame at the expected offset.
+ * We could also check the two ac3 CRCs, but we don't do that right now */
+ while (c.offset < 1024) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 5)))
+ break;
+
+ if (c.data[0] == 0x0b && c.data[1] == 0x77) {
+ guint bsid = c.data[5] >> 3;
+
+ if (bsid <= 8) {
+ /* ac3 */
+ guint fscod = c.data[4] >> 6;
+ guint frmsizecod = c.data[4] & 0x3f;
+
+ if (fscod < 3 && frmsizecod < 38) {
+ DataScanCtx c_next = c;
+ guint frame_size;
+
+ frame_size = ac3_frmsizecod_tbl[frmsizecod].frm_size[fscod];
+ GST_LOG ("possible AC3 frame sync at offset %"
+ G_GUINT64_FORMAT ", size=%u", c.offset, frame_size);
+ if (data_scan_ctx_ensure_data (tf, &c_next, (frame_size * 2) + 5)) {
+ data_scan_ctx_advance (tf, &c_next, frame_size * 2);
+
+ if (c_next.data[0] == 0x0b && c_next.data[1] == 0x77) {
+ fscod = c_next.data[4] >> 6;
+ frmsizecod = c_next.data[4] & 0x3f;
+
+ if (fscod < 3 && frmsizecod < 38) {
+ GstTypeFindProbability prob;
+
+ GST_LOG ("found second AC3 frame (size=%u), looks good",
+ ac3_frmsizecod_tbl[frmsizecod].frm_size[fscod]);
+ if (c.offset == 0)
+ prob = GST_TYPE_FIND_MAXIMUM;
+ else
+ prob = GST_TYPE_FIND_NEARLY_CERTAIN;
+
+ gst_type_find_suggest (tf, prob, AC3_CAPS);
+ return;
+ }
+ } else {
+ GST_LOG ("no second AC3 frame found, false sync");
+ }
+ }
+ }
+ } else if (bsid <= 16 && bsid > 10) {
+ /* eac3 */
+ DataScanCtx c_next = c;
+ guint frame_size;
+
+ frame_size = (((c.data[2] & 0x07) << 8) + c.data[3]) + 1;
+ GST_LOG ("possible E-AC3 frame sync at offset %"
+ G_GUINT64_FORMAT ", size=%u", c.offset, frame_size);
+ if (data_scan_ctx_ensure_data (tf, &c_next, (frame_size * 2) + 5)) {
+ data_scan_ctx_advance (tf, &c_next, frame_size * 2);
+
+ if (c_next.data[0] == 0x0b && c_next.data[1] == 0x77) {
+ GstTypeFindProbability prob;
+
+ GST_LOG ("found second E-AC3 frame, looks good");
+ if (c.offset == 0)
+ prob = GST_TYPE_FIND_MAXIMUM;
+ else
+ prob = GST_TYPE_FIND_NEARLY_CERTAIN;
+
+ gst_type_find_suggest (tf, prob, EAC3_CAPS);
+ return;
+ } else {
+ GST_LOG ("no second E-AC3 frame found, false sync");
+ }
+ }
+ } else {
+ GST_LOG ("invalid AC3 BSID: %u", bsid);
+ }
+ }
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+}
+
+/*** audio/x-dts ***/
+static GstStaticCaps dts_caps = GST_STATIC_CAPS ("audio/x-dts");
+#define DTS_CAPS (gst_static_caps_get (&dts_caps))
+#define DTS_MIN_FRAMESIZE 96
+#define DTS_MAX_FRAMESIZE 18725 /* 16384*16/14 */
+
+static gboolean
+dts_parse_frame_header (DataScanCtx * c, guint * frame_size,
+ guint * sample_rate, guint * channels, guint * depth, guint * endianness)
+{
+ 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
+ };
+ guint16 hdr[8];
+ guint32 marker;
+ guint num_blocks, chans, lfe, i;
+
+ marker = GST_READ_UINT32_BE (c->data);
+
+ /* raw big endian or 14-bit big endian */
+ if (marker == 0x7FFE8001 || marker == 0x1FFFE800) {
+ *endianness = G_BIG_ENDIAN;
+ for (i = 0; i < G_N_ELEMENTS (hdr); ++i)
+ hdr[i] = GST_READ_UINT16_BE (c->data + (i * sizeof (guint16)));
+ } else
+ /* raw little endian or 14-bit little endian */
+ if (marker == 0xFE7F0180 || marker == 0xFF1F00E8) {
+ *endianness = G_LITTLE_ENDIAN;
+ for (i = 0; i < G_N_ELEMENTS (hdr); ++i)
+ hdr[i] = GST_READ_UINT16_LE (c->data + (i * sizeof (guint16)));
+ } else {
+ return FALSE;
+ }
+
+ GST_LOG ("dts sync marker 0x%08x at offset %u", marker, (guint) c->offset);
+
+ /* 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);
+ *depth = 14;
+ } else {
+ *depth = 16;
+ }
+
+ GST_LOG ("frame header: %04x%04x%04x%04x", hdr[2], hdr[3], hdr[4], hdr[5]);
+
+ num_blocks = (hdr[2] >> 2) & 0x7F;
+ *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;
+
+ if (num_blocks < 5 || *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;
+
+ return TRUE;
+}
+
+static void
+dts_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+
+ /* Search for an dts frame; not neccesarily right at the start, but give it
+ * a lower probability if not found right at the start. Check that the
+ * frame is followed by a second frame at the expected offset. */
+ while (c.offset <= DTS_MAX_FRAMESIZE) {
+ guint frame_size = 0, rate = 0, chans = 0, depth = 0, endianness = 0;
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, DTS_MIN_FRAMESIZE)))
+ return;
+
+ if (G_UNLIKELY (dts_parse_frame_header (&c, &frame_size, &rate, &chans,
+ &depth, &endianness))) {
+ GstTypeFindProbability prob;
+ DataScanCtx next_c;
+
+ prob = (c.offset == 0) ? GST_TYPE_FIND_LIKELY : GST_TYPE_FIND_POSSIBLE;
+
+ /* check for second frame sync */
+ next_c = c;
+ data_scan_ctx_advance (tf, &next_c, frame_size);
+ if (data_scan_ctx_ensure_data (tf, &next_c, 4)) {
+ GST_LOG ("frame size: %u 0x%04x", frame_size, frame_size);
+ GST_MEMDUMP ("second frame sync", next_c.data, 4);
+ if (GST_READ_UINT32_BE (c.data) == GST_READ_UINT32_BE (next_c.data))
+ prob = GST_TYPE_FIND_MAXIMUM;
+ }
+
+ if (chans > 0) {
+ gst_type_find_suggest_simple (tf, prob, "audio/x-dts",
+ "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, chans,
+ "depth", G_TYPE_INT, depth, "endianness", G_TYPE_INT, endianness,
+ "framed", G_TYPE_BOOLEAN, FALSE, NULL);
+ } else {
+ gst_type_find_suggest_simple (tf, prob, "audio/x-dts",
+ "rate", G_TYPE_INT, rate, "depth", G_TYPE_INT, depth,
+ "endianness", G_TYPE_INT, endianness,
+ "framed", G_TYPE_BOOLEAN, FALSE, NULL);
+ }
+
+ return;
+ }
+
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+}
+
+/*** gsm ***/
+
+/* can only be detected by using the extension, in which case we use the default
+ * GSM properties */
+static GstStaticCaps gsm_caps =
+GST_STATIC_CAPS ("audio/x-gsm, rate=8000, channels=1");
+
+#define GSM_CAPS (gst_static_caps_get(&gsm_caps))
+
+/*** wavpack ***/
+
+static GstStaticCaps wavpack_caps =
+GST_STATIC_CAPS ("audio/x-wavpack, framed = (boolean) false");
+
+#define WAVPACK_CAPS (gst_static_caps_get(&wavpack_caps))
+
+static GstStaticCaps wavpack_correction_caps =
+GST_STATIC_CAPS ("audio/x-wavpack-correction, framed = (boolean) false");
+
+#define WAVPACK_CORRECTION_CAPS (gst_static_caps_get(&wavpack_correction_caps))
+
+static void
+wavpack_type_find (GstTypeFind * tf, gpointer unused)
+{
+ guint64 offset;
+ guint32 blocksize;
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 32);
+ if (!data)
+ return;
+
+ if (data[0] != 'w' || data[1] != 'v' || data[2] != 'p' || data[3] != 'k')
+ return;
+
+ /* Note: wavpack blocks can be fairly large (easily 60-110k), possibly
+ * larger than the max. limits imposed by certain typefinding elements
+ * like id3demux or apedemux, so typefinding is most likely only going to
+ * work in pull-mode */
+ blocksize = GST_READ_UINT32_LE (data + 4);
+ GST_LOG ("wavpack header, blocksize=0x%04x", blocksize);
+ offset = 32;
+ while (offset < 32 + blocksize) {
+ guint32 sublen;
+
+ /* get chunk header */
+ GST_LOG ("peeking at chunk at offset 0x%04x", (guint) offset);
+ data = gst_type_find_peek (tf, offset, 4);
+ if (data == NULL)
+ break;
+ sublen = ((guint32) data[1]) << 1;
+ if (data[0] & 0x80) {
+ sublen |= (((guint32) data[2]) << 9) | (((guint32) data[3]) << 17);
+ sublen += 1 + 3; /* id + length */
+ } else {
+ sublen += 1 + 1; /* id + length */
+ }
+ if (sublen > blocksize - offset + 32) {
+ GST_LOG ("chunk length too big (%u > %" G_GUINT64_FORMAT ")", sublen,
+ blocksize - offset);
+ break;
+ }
+ if ((data[0] & 0x20) == 0) {
+ switch (data[0] & 0x0f) {
+ case 0xa: /* ID_WV_BITSTREAM */
+ case 0xc: /* ID_WVX_BITSTREAM */
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, WAVPACK_CAPS);
+ return;
+ case 0xb: /* ID_WVC_BITSTREAM */
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY,
+ WAVPACK_CORRECTION_CAPS);
+ return;
+ default:
+ break;
+ }
+ }
+ offset += sublen;
+ }
+}
+
+/*** application/postscrip ***/
+static GstStaticCaps postscript_caps =
+GST_STATIC_CAPS ("application/postscript");
+
+#define POSTSCRIPT_CAPS (gst_static_caps_get(&postscript_caps))
+
+static void
+postscript_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 3);
+ if (!data)
+ return;
+
+ if (data[0] == 0x04)
+ data++;
+ if (data[0] == '%' && data[1] == '!')
+ gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, POSTSCRIPT_CAPS);
+
+}
+
+/*** image/svg+xml ***/
+static GstStaticCaps svg_caps = GST_STATIC_CAPS ("image/svg+xml");
+
+#define SVG_CAPS (gst_static_caps_get(&svg_caps))
+
+static void
+svg_type_find (GstTypeFind * tf, gpointer unused)
+{
+ static const gchar svg_doctype[] = "!DOCTYPE svg";
+ static const gchar svg_tag[] = "<svg";
+ DataScanCtx c = { 0, NULL, 0 };
+
+ while (c.offset <= 1024) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 12)))
+ break;
+
+ if (memcmp (svg_doctype, c.data, 12) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SVG_CAPS);
+ return;
+ } else if (memcmp (svg_tag, c.data, 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, SVG_CAPS);
+ return;
+ }
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+}
+
+/*** multipart/x-mixed-replace mimestream ***/
+
+static GstStaticCaps multipart_caps =
+GST_STATIC_CAPS ("multipart/x-mixed-replace");
+#define MULTIPART_CAPS gst_static_caps_get(&multipart_caps)
+
+/* multipart/x-mixed replace is:
+ * <maybe some whitespace>--<some ascii chars>[\r]\n
+ * <more ascii chars>[\r]\nContent-type:<more ascii>[\r]\n */
+static void
+multipart_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+ const guint8 *x;
+
+#define MULTIPART_MAX_BOUNDARY_OFFSET 16
+ data = gst_type_find_peek (tf, 0, MULTIPART_MAX_BOUNDARY_OFFSET);
+ if (!data)
+ return;
+
+ for (x = data;
+ x - data < MULTIPART_MAX_BOUNDARY_OFFSET - 2 && g_ascii_isspace (*x);
+ x++);
+ if (x[0] != '-' || x[1] != '-')
+ return;
+
+ /* Could be okay, peek what should be enough for a complete header */
+#define MULTIPART_MAX_HEADER_SIZE 256
+ data = gst_type_find_peek (tf, 0, MULTIPART_MAX_HEADER_SIZE);
+ if (!data)
+ return;
+
+ for (x = data; x - data < MULTIPART_MAX_HEADER_SIZE - 14; x++) {
+ if (!isascii (*x)) {
+ return;
+ }
+ if (*x == '\n' &&
+ !g_ascii_strncasecmp ("content-type:", (gchar *) x + 1, 13)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MULTIPART_CAPS);
+ return;
+ }
+ }
+}
+
+/*** video/mpeg systemstream ***/
+static GstStaticCaps mpeg_sys_caps = GST_STATIC_CAPS ("video/mpeg, "
+ "systemstream = (boolean) true, mpegversion = (int) [ 1, 2 ]");
+
+#define MPEG_SYS_CAPS gst_static_caps_get(&mpeg_sys_caps)
+#define IS_MPEG_HEADER(data) (G_UNLIKELY((((guint8 *)(data))[0] == 0x00) && \
+ (((guint8 *)(data))[1] == 0x00) && \
+ (((guint8 *)(data))[2] == 0x01)))
+
+#define IS_MPEG_PACK_CODE(b) ((b) == 0xBA)
+#define IS_MPEG_SYS_CODE(b) ((b) == 0xBB)
+#define IS_MPEG_PACK_HEADER(data) (IS_MPEG_HEADER (data) && \
+ IS_MPEG_PACK_CODE (((guint8 *)(data))[3]))
+
+#define IS_MPEG_PES_CODE(b) (((b) & 0xF0) == 0xE0 || ((b) & 0xF0) == 0xC0 || \
+ (b) >= 0xBD)
+#define IS_MPEG_PES_HEADER(data) (IS_MPEG_HEADER (data) && \
+ IS_MPEG_PES_CODE (((guint8 *)(data))[3]))
+
+#define MPEG2_MAX_PROBE_LENGTH (128 * 1024) /* 128kB should be 64 packs of the
+ * most common 2kB pack size. */
+
+#define MPEG2_MIN_SYS_HEADERS 2
+#define MPEG2_MAX_SYS_HEADERS 5
+
+static gboolean
+mpeg_sys_is_valid_pack (GstTypeFind * tf, const guint8 * data, guint len,
+ guint * pack_size)
+{
+ /* Check the pack header @ offset for validity, assuming that the 4 byte header
+ * itself has already been checked. */
+ guint8 stuff_len;
+
+ if (len < 12)
+ return FALSE;
+
+ /* Check marker bits */
+ if ((data[4] & 0xC4) == 0x44) {
+ /* MPEG-2 PACK */
+ if (len < 14)
+ return FALSE;
+
+ if ((data[6] & 0x04) != 0x04 ||
+ (data[8] & 0x04) != 0x04 ||
+ (data[9] & 0x01) != 0x01 || (data[12] & 0x03) != 0x03)
+ return FALSE;
+
+ stuff_len = data[13] & 0x07;
+
+ /* Check the following header bytes, if we can */
+ if ((14 + stuff_len + 4) <= len) {
+ if (!IS_MPEG_HEADER (data + 14 + stuff_len))
+ return FALSE;
+ }
+ if (pack_size)
+ *pack_size = 14 + stuff_len;
+ return TRUE;
+ } else if ((data[4] & 0xF1) == 0x21) {
+ /* MPEG-1 PACK */
+ if ((data[6] & 0x01) != 0x01 ||
+ (data[8] & 0x01) != 0x01 ||
+ (data[9] & 0x80) != 0x80 || (data[11] & 0x01) != 0x01)
+ return FALSE;
+
+ /* Check the following header bytes, if we can */
+ if ((12 + 4) <= len) {
+ if (!IS_MPEG_HEADER (data + 12))
+ return FALSE;
+ }
+ if (pack_size)
+ *pack_size = 12;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+mpeg_sys_is_valid_pes (GstTypeFind * tf, const guint8 * data, guint len,
+ guint * pack_size)
+{
+ guint pes_packet_len;
+
+ /* Check the PES header at the given position, assuming the header code itself
+ * was already checked */
+ if (len < 6)
+ return FALSE;
+
+ /* For MPEG Program streams, unbounded PES is not allowed, so we must have a
+ * valid length present */
+ pes_packet_len = GST_READ_UINT16_BE (data + 4);
+ if (pes_packet_len == 0)
+ return FALSE;
+
+ /* Check the following header, if we can */
+ if (6 + pes_packet_len + 4 <= len) {
+ if (!IS_MPEG_HEADER (data + 6 + pes_packet_len))
+ return FALSE;
+ }
+
+ if (pack_size)
+ *pack_size = 6 + pes_packet_len;
+ return TRUE;
+}
+
+static gboolean
+mpeg_sys_is_valid_sys (GstTypeFind * tf, const guint8 * data, guint len,
+ guint * pack_size)
+{
+ guint sys_hdr_len;
+
+ /* Check the System header at the given position, assuming the header code itself
+ * was already checked */
+ if (len < 6)
+ return FALSE;
+ sys_hdr_len = GST_READ_UINT16_BE (data + 4);
+ if (sys_hdr_len < 6)
+ return FALSE;
+
+ /* Check the following header, if we can */
+ if (6 + sys_hdr_len + 4 <= len) {
+ if (!IS_MPEG_HEADER (data + 6 + sys_hdr_len))
+ return FALSE;
+ }
+
+ if (pack_size)
+ *pack_size = 6 + sys_hdr_len;
+
+ return TRUE;
+}
+
+/* calculation of possibility to identify random data as mpeg systemstream:
+ * bits that must match in header detection: 32 (or more)
+ * chance that random data is identifed: 1/2^32
+ * chance that MPEG2_MIN_PACK_HEADERS headers are identified:
+ * 1/2^(32*MPEG2_MIN_PACK_HEADERS)
+ * chance that this happens in MPEG2_MAX_PROBE_LENGTH bytes:
+ * 1-(1+1/2^(32*MPEG2_MIN_PACK_HEADERS)^MPEG2_MAX_PROBE_LENGTH)
+ * for current values:
+ * 1-(1+1/2^(32*4)^101024)
+ * = <some_number>
+ * Since we also check marker bits and pes packet lengths, this probability is a
+ * very coarse upper bound.
+ */
+static void
+mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data, *data0, *first_sync, *end;
+ gint mpegversion = 0;
+ guint pack_headers = 0;
+ guint pes_headers = 0;
+ guint pack_size;
+ guint since_last_sync = 0;
+ guint32 sync_word = 0xffffffff;
+
+ G_STMT_START {
+ gint len;
+
+ len = MPEG2_MAX_PROBE_LENGTH;
+ do {
+ len = len / 2;
+ data = gst_type_find_peek (tf, 0, 5 + len);
+ } while (data == NULL && len >= 32);
+
+ if (!data)
+ return;
+
+ end = data + len;
+ }
+ G_STMT_END;
+
+ data0 = data;
+ first_sync = NULL;
+
+ while (data < end) {
+ sync_word <<= 8;
+ if (sync_word == 0x00000100) {
+ /* Found potential sync word */
+ if (first_sync == NULL)
+ first_sync = data - 3;
+
+ if (since_last_sync > 4) {
+ /* If more than 4 bytes since the last sync word, reset our counters,
+ * as we're only interested in counting contiguous packets */
+ pes_headers = pack_headers = 0;
+ }
+ pack_size = 0;
+
+ if (IS_MPEG_PACK_CODE (data[0])) {
+ if ((data[1] & 0xC0) == 0x40) {
+ /* MPEG-2 */
+ mpegversion = 2;
+ } else if ((data[1] & 0xF0) == 0x20) {
+ mpegversion = 1;
+ }
+ if (mpegversion != 0 &&
+ mpeg_sys_is_valid_pack (tf, data - 3, end - data + 3, &pack_size)) {
+ pack_headers++;
+ }
+ } else if (IS_MPEG_PES_CODE (data[0])) {
+ /* PES stream */
+ if (mpeg_sys_is_valid_pes (tf, data - 3, end - data + 3, &pack_size)) {
+ pes_headers++;
+ if (mpegversion == 0)
+ mpegversion = 2;
+ }
+ } else if (IS_MPEG_SYS_CODE (data[0])) {
+ if (mpeg_sys_is_valid_sys (tf, data - 3, end - data + 3, &pack_size)) {
+ pack_headers++;
+ }
+ }
+
+ /* If we found a packet with a known size, skip the bytes in it and loop
+ * around to check the next packet. */
+ if (pack_size != 0) {
+ data += pack_size - 3;
+ sync_word = 0xffffffff;
+ since_last_sync = 0;
+ continue;
+ }
+ }
+
+ sync_word |= data[0];
+ since_last_sync++;
+ data++;
+
+ /* If we have found MAX headers, and *some* were pes headers (pack headers
+ * are optional in an mpeg system stream) then return our high-probability
+ * result */
+ if (pes_headers > 0 && (pack_headers + pes_headers) > MPEG2_MAX_SYS_HEADERS)
+ goto suggest;
+ }
+
+ /* If we at least saw MIN headers, and *some* were pes headers (pack headers
+ * are optional in an mpeg system stream) then return a lower-probability
+ * result */
+ if (pes_headers > 0 && (pack_headers + pes_headers) > MPEG2_MIN_SYS_HEADERS)
+ goto suggest;
+
+ return;
+suggest:
+ {
+ guint prob;
+
+ prob = GST_TYPE_FIND_POSSIBLE + (10 * (pack_headers + pes_headers));
+ prob = MIN (prob, GST_TYPE_FIND_MAXIMUM);
+
+ /* lower probability if the first packet wasn't right at the start */
+ if (data0 != first_sync && prob >= 10)
+ prob -= 10;
+
+ GST_LOG ("Suggesting MPEG %d system stream, %d packs, %d pes, prob %u%%\n",
+ mpegversion, pack_headers, pes_headers, prob);
+
+ gst_type_find_suggest_simple (tf, prob, "video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, TRUE,
+ "mpegversion", G_TYPE_INT, mpegversion, NULL);
+ }
+};
+
+/*** video/mpegts Transport Stream ***/
+static GstStaticCaps mpegts_caps = GST_STATIC_CAPS ("video/mpegts, "
+ "systemstream = (boolean) true, packetsize = (int) [ 188, 208 ]");
+#define MPEGTS_CAPS gst_static_caps_get(&mpegts_caps)
+
+#define GST_MPEGTS_TYPEFIND_MIN_HEADERS 4
+#define GST_MPEGTS_TYPEFIND_MAX_HEADERS 10
+#define GST_MPEGTS_MAX_PACKET_SIZE 208
+#define GST_MPEGTS_TYPEFIND_SYNC_SIZE \
+ (GST_MPEGTS_TYPEFIND_MIN_HEADERS * GST_MPEGTS_MAX_PACKET_SIZE)
+#define GST_MPEGTS_TYPEFIND_MAX_SYNC \
+ (GST_MPEGTS_TYPEFIND_MAX_HEADERS * GST_MPEGTS_MAX_PACKET_SIZE)
+#define GST_MPEGTS_TYPEFIND_SCAN_LENGTH \
+ (GST_MPEGTS_TYPEFIND_MAX_SYNC * 4)
+
+#define MPEGTS_HDR_SIZE 4
+/* Check for sync byte, error_indicator == 0 and packet has payload */
+#define IS_MPEGTS_HEADER(data) (((data)[0] == 0x47) && \
+ (((data)[1] & 0x80) == 0x00) && \
+ (((data)[3] & 0x30) != 0x00))
+
+/* Helper function to search ahead at intervals of packet_size for mpegts
+ * headers */
+static gint
+mpeg_ts_probe_headers (GstTypeFind * tf, guint64 offset, gint packet_size)
+{
+ /* We always enter this function having found at least one header already */
+ gint found = 1;
+ const guint8 *data = NULL;
+
+ GST_LOG ("looking for mpeg-ts packets of size %u", packet_size);
+ while (found < GST_MPEGTS_TYPEFIND_MAX_HEADERS) {
+ offset += packet_size;
+
+ data = gst_type_find_peek (tf, offset, MPEGTS_HDR_SIZE);
+ if (data == NULL || !IS_MPEGTS_HEADER (data))
+ return found;
+
+ found++;
+ GST_LOG ("mpeg-ts sync #%2d at offset %" G_GUINT64_FORMAT, found, offset);
+ }
+
+ return found;
+}
+
+/* Try and detect at least 4 packets in at most 10 packets worth of
+ * data. Need to try several possible packet sizes */
+static void
+mpeg_ts_type_find (GstTypeFind * tf, gpointer unused)
+{
+ /* TS packet sizes to test: normal, DVHS packet size and
+ * FEC with 16 or 20 byte codes packet size. */
+ const gint pack_sizes[] = { 188, 192, 204, 208 };
+ const guint8 *data = NULL;
+ guint size = 0;
+ guint64 skipped = 0;
+
+ while (skipped < GST_MPEGTS_TYPEFIND_SCAN_LENGTH) {
+ if (size < MPEGTS_HDR_SIZE) {
+ data = gst_type_find_peek (tf, skipped, GST_MPEGTS_TYPEFIND_SYNC_SIZE);
+ if (!data)
+ break;
+ size = GST_MPEGTS_TYPEFIND_SYNC_SIZE;
+ }
+
+ /* Have at least MPEGTS_HDR_SIZE bytes at this point */
+ if (IS_MPEGTS_HEADER (data)) {
+ gint p;
+
+ GST_LOG ("possible mpeg-ts sync at offset %" G_GUINT64_FORMAT, skipped);
+
+ for (p = 0; p < G_N_ELEMENTS (pack_sizes); p++) {
+ gint found;
+
+ /* Probe ahead at size pack_sizes[p] */
+ found = mpeg_ts_probe_headers (tf, skipped, pack_sizes[p]);
+ if (found >= GST_MPEGTS_TYPEFIND_MIN_HEADERS) {
+ gint probability;
+
+ /* found at least 4 headers. 10 headers = MAXIMUM probability.
+ * Arbitrarily, I assigned 10% probability for each header we
+ * found, 40% -> 100% */
+ probability = MIN (10 * found, GST_TYPE_FIND_MAXIMUM);
+
+ gst_type_find_suggest_simple (tf, probability, "video/mpegts",
+ "systemstream", G_TYPE_BOOLEAN, TRUE,
+ "packetsize", G_TYPE_INT, pack_sizes[p], NULL);
+ return;
+ }
+ }
+ }
+ data++;
+ skipped++;
+ size--;
+ }
+}
+
+#define GST_MPEGVID_TYPEFIND_TRY_PICTURES 6
+#define GST_MPEGVID_TYPEFIND_TRY_SYNC (100 * 1024) /* 100 kB */
+
+/* Scan ahead a maximum of max_extra_offset bytes until the next IS_MPEG_HEADER
+ * offset. After the call, offset will be after the 0x000001, i.e. at the 4th
+ * byte of the MPEG header. Returns TRUE if a header was found, FALSE if not.
+ */
+static gboolean
+mpeg_find_next_header (GstTypeFind * tf, DataScanCtx * c,
+ guint64 max_extra_offset)
+{
+ guint64 extra_offset;
+
+ for (extra_offset = 0; extra_offset <= max_extra_offset; ++extra_offset) {
+ if (!data_scan_ctx_ensure_data (tf, c, 4))
+ return FALSE;
+ if (IS_MPEG_HEADER (c->data)) {
+ data_scan_ctx_advance (tf, c, 3);
+ return TRUE;
+ }
+ data_scan_ctx_advance (tf, c, 1);
+ }
+ return FALSE;
+}
+
+/*** video/mpeg MPEG-4 elementary video stream ***/
+
+static GstStaticCaps mpeg4_video_caps = GST_STATIC_CAPS ("video/mpeg, "
+ "systemstream=(boolean)false, mpegversion=4, parsed=(boolean)false");
+#define MPEG4_VIDEO_CAPS gst_static_caps_get(&mpeg4_video_caps)
+
+/*
+ * This typefind is based on the elementary video header defined in
+ * http://xhelmboyx.tripod.com/formats/mpeg-layout.txt
+ * In addition, it allows the visual object sequence header to be
+ * absent, and even the VOS header to be absent. In the latter case,
+ * a number of VOPs have to be present.
+ */
+static void
+mpeg4_video_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+ gboolean seen_vios_at_0 = FALSE;
+ gboolean seen_vios = FALSE;
+ gboolean seen_vos = FALSE;
+ gboolean seen_vol = FALSE;
+ guint num_vop_headers = 0;
+ guint8 sc;
+
+ while (c.offset < GST_MPEGVID_TYPEFIND_TRY_SYNC) {
+ if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES)
+ break;
+
+ if (!mpeg_find_next_header (tf, &c,
+ GST_MPEGVID_TYPEFIND_TRY_SYNC - c.offset))
+ break;
+
+ sc = c.data[0];
+
+ /* visual_object_sequence_start_code */
+ if (sc == 0xB0) {
+ if (seen_vios)
+ break; /* Terminate at second vios */
+ if (c.offset == 0)
+ seen_vios_at_0 = TRUE;
+ seen_vios = TRUE;
+ data_scan_ctx_advance (tf, &c, 2);
+ if (!mpeg_find_next_header (tf, &c, 0))
+ break;
+
+ sc = c.data[0];
+
+ /* Optional metadata */
+ if (sc == 0xB2)
+ if (!mpeg_find_next_header (tf, &c, 24))
+ break;
+ }
+
+ /* visual_object_start_code (consider it optional) */
+ if (sc == 0xB5) {
+ data_scan_ctx_advance (tf, &c, 2);
+ /* may contain ID marker and YUV clamping */
+ if (!mpeg_find_next_header (tf, &c, 7))
+ break;
+
+ sc = c.data[0];
+ }
+
+ /* video_object_start_code */
+ if (sc <= 0x1F) {
+ if (seen_vos)
+ break; /* Terminate at second vos */
+ seen_vos = TRUE;
+ data_scan_ctx_advance (tf, &c, 2);
+ continue;
+ }
+
+ /* video_object_layer_start_code */
+ if (sc >= 0x20 && sc <= 0x2F) {
+ seen_vol = TRUE;
+ data_scan_ctx_advance (tf, &c, 5);
+ continue;
+ }
+
+ /* video_object_plane_start_code */
+ if (sc == 0xB6) {
+ num_vop_headers++;
+ data_scan_ctx_advance (tf, &c, 2);
+ continue;
+ }
+
+ /* Unknown start code. */
+ }
+
+ if (num_vop_headers > 0 || seen_vol) {
+ GstTypeFindProbability probability = 0;
+
+ GST_LOG ("Found %d pictures, vios: %d, vos:%d, vol:%d", num_vop_headers,
+ seen_vios, seen_vos, seen_vol);
+
+ if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_vios_at_0
+ && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_MAXIMUM - 1;
+ else if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_vios
+ && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 1;
+ else if (seen_vios_at_0 && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 6;
+ else if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_vos
+ && seen_vol)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 6;
+ else if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_vol)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 9;
+ else if (num_vop_headers >= GST_MPEGVID_TYPEFIND_TRY_PICTURES)
+ probability = GST_TYPE_FIND_LIKELY - 1;
+ else if (num_vop_headers > 2 && seen_vios && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_LIKELY - 9;
+ else if (seen_vios && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_LIKELY - 20;
+ else if (num_vop_headers > 0 && seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_POSSIBLE;
+ else if (num_vop_headers > 0)
+ probability = GST_TYPE_FIND_POSSIBLE - 10;
+ else if (seen_vos && seen_vol)
+ probability = GST_TYPE_FIND_POSSIBLE - 20;
+
+ gst_type_find_suggest (tf, probability, MPEG4_VIDEO_CAPS);
+ }
+}
+
+/*** video/x-h263 H263 video stream ***/
+static GstStaticCaps h263_video_caps = GST_STATIC_CAPS ("video/x-h263");
+
+#define H263_VIDEO_CAPS gst_static_caps_get(&h263_video_caps)
+
+#define H263_MAX_PROBE_LENGTH (128 * 1024)
+
+static void
+h263_video_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+ guint64 data = 0;
+ guint64 psc = 0;
+ guint8 tr = 0;
+ guint format;
+ guint good = 0;
+ guint bad = 0;
+
+ while (c.offset < H263_MAX_PROBE_LENGTH) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 4)))
+ break;
+
+ /* Find the picture start code */
+ data = (data << 8) + c.data[0];
+ psc = data & G_GUINT64_CONSTANT (0xfffffc0000);
+ if (psc == 0x800000) {
+ /* Found PSC */
+ /* TR */
+ tr = (data & 0x3fc) >> 2;
+ /* Source Format */
+ format = tr & 0x07;
+
+ /* Now that we have a Valid PSC, check if we also have a valid PTYPE and
+ the Source Format, which should range between 1 and 5 */
+ if (((tr >> 6) == 0x2) && (format > 0 && format < 6))
+ good++;
+ else
+ bad++;
+
+ /* FIXME: maybe bail out early if we get mostly bad syncs ? */
+ }
+
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+
+ if (good > 0 && bad == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, H263_VIDEO_CAPS);
+ else if (good > 2 * bad)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, H263_VIDEO_CAPS);
+
+ return;
+}
+
+/*** video/x-h264 H264 elementary video stream ***/
+
+static GstStaticCaps h264_video_caps =
+GST_STATIC_CAPS ("video/x-h264,stream-format=byte-stream");
+
+#define H264_VIDEO_CAPS gst_static_caps_get(&h264_video_caps)
+
+#define H264_MAX_PROBE_LENGTH (128 * 1024) /* 128kB for HD should be enough. */
+
+static void
+h264_video_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+
+ /* Stream consists of: a series of sync codes (00 00 00 01) followed
+ * by NALs
+ */
+ int nut, ref;
+ int good = 0;
+ int bad = 0;
+
+ while (c.offset < H264_MAX_PROBE_LENGTH) {
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 4)))
+ break;
+
+ if (IS_MPEG_HEADER (c.data)) {
+ nut = c.data[3] & 0x9f; /* forbiden_zero_bit | nal_unit_type */
+ ref = c.data[3] & 0x60; /* nal_ref_idc */
+
+ /* if forbiden bit is different to 0 won't be h264 */
+ if (nut > 0x1f) {
+ bad++;
+ break;
+ }
+
+ /* collect statistics about the NAL types */
+ if ((nut >= 1 && nut <= 13) || nut == 19) {
+ if ((nut == 5 && ref == 0) ||
+ ((nut == 6 || (nut >= 9 && nut <= 12)) && ref != 0)) {
+ bad++;
+ } else {
+ good++;
+ }
+ } else if (nut >= 14 && nut <= 33) {
+ /* reserved */
+ /* Theoretically these are good, since if they exist in the
+ stream it merely means that a newer backwards-compatible
+ h.264 stream. But we should be identifying that separately. */
+ bad++;
+ } else {
+ /* unspecified, application specific */
+ /* don't consider these bad */
+ }
+
+ GST_DEBUG ("good %d bad %d", good, bad);
+
+ if (good >= 10 && bad < 4) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, H264_VIDEO_CAPS);
+ return;
+ }
+
+ data_scan_ctx_advance (tf, &c, 4);
+ }
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+
+ if (good >= 2 && bad < 1) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, H264_VIDEO_CAPS);
+ return;
+ }
+}
+
+/*** video/mpeg video stream ***/
+
+static GstStaticCaps mpeg_video_caps = GST_STATIC_CAPS ("video/mpeg, "
+ "systemstream = (boolean) false");
+#define MPEG_VIDEO_CAPS gst_static_caps_get(&mpeg_video_caps)
+
+/*
+ * Idea is the same as MPEG system stream typefinding: We check each
+ * byte of the stream to see if - from that point on - the stream
+ * matches a predefined set of marker bits as defined in the MPEG
+ * video specs.
+ *
+ * I'm sure someone will do a chance calculation here too.
+ */
+
+static void
+mpeg_video_stream_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+ gboolean seen_seq_at_0 = FALSE;
+ gboolean seen_seq = FALSE;
+ gboolean seen_gop = FALSE;
+ guint64 last_pic_offset = 0;
+ guint num_pic_headers = 0;
+ gint found = 0;
+
+ while (c.offset < GST_MPEGVID_TYPEFIND_TRY_SYNC) {
+ if (found >= GST_MPEGVID_TYPEFIND_TRY_PICTURES)
+ break;
+
+ if (!data_scan_ctx_ensure_data (tf, &c, 5))
+ break;
+
+ if (!IS_MPEG_HEADER (c.data))
+ goto next;
+
+ /* a pack header indicates that this isn't an elementary stream */
+ if (c.data[3] == 0xBA && mpeg_sys_is_valid_pack (tf, c.data, c.size, NULL))
+ return;
+
+ /* do we have a sequence header? */
+ if (c.data[3] == 0xB3) {
+ seen_seq_at_0 = seen_seq_at_0 || (c.offset == 0);
+ seen_seq = TRUE;
+ data_scan_ctx_advance (tf, &c, 4 + 8);
+ continue;
+ }
+
+ /* or a GOP header */
+ if (c.data[3] == 0xB8) {
+ seen_gop = TRUE;
+ data_scan_ctx_advance (tf, &c, 8);
+ continue;
+ }
+
+ /* but what we'd really like to see is a picture header */
+ if (c.data[3] == 0x00) {
+ ++num_pic_headers;
+ last_pic_offset = c.offset;
+ data_scan_ctx_advance (tf, &c, 8);
+ continue;
+ }
+
+ /* ... each followed by a slice header with slice_vertical_pos=1 that's
+ * not too far away from the previously seen picture header. */
+ if (c.data[3] == 0x01 && num_pic_headers > found &&
+ (c.offset - last_pic_offset) >= 4 &&
+ (c.offset - last_pic_offset) <= 64) {
+ data_scan_ctx_advance (tf, &c, 4);
+ found += 1;
+ continue;
+ }
+
+ next:
+
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+
+ if (found > 0 || seen_seq) {
+ GstTypeFindProbability probability = 0;
+
+ GST_LOG ("Found %d pictures, seq:%d, gop:%d", found, seen_seq, seen_gop);
+
+ if (found >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_seq && seen_gop)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 1;
+ else if (found >= GST_MPEGVID_TYPEFIND_TRY_PICTURES && seen_seq)
+ probability = GST_TYPE_FIND_NEARLY_CERTAIN - 9;
+ else if (found >= GST_MPEGVID_TYPEFIND_TRY_PICTURES)
+ probability = GST_TYPE_FIND_LIKELY;
+ else if (seen_seq_at_0 && seen_gop && found > 2)
+ probability = GST_TYPE_FIND_LIKELY - 10;
+ else if (seen_seq && seen_gop && found > 2)
+ probability = GST_TYPE_FIND_LIKELY - 20;
+ else if (seen_seq_at_0 && found > 0)
+ probability = GST_TYPE_FIND_POSSIBLE;
+ else if (seen_seq && found > 0)
+ probability = GST_TYPE_FIND_POSSIBLE - 5;
+ else if (found > 0)
+ probability = GST_TYPE_FIND_POSSIBLE - 10;
+ else if (seen_seq)
+ probability = GST_TYPE_FIND_POSSIBLE - 20;
+
+ gst_type_find_suggest_simple (tf, probability, "video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, 1, NULL);
+ }
+}
+
+/*** audio/x-aiff ***/
+
+static GstStaticCaps aiff_caps = GST_STATIC_CAPS ("audio/x-aiff");
+
+#define AIFF_CAPS gst_static_caps_get(&aiff_caps)
+static void
+aiff_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data && memcmp (data, "FORM", 4) == 0) {
+ data += 8;
+ if (memcmp (data, "AIFF", 4) == 0 || memcmp (data, "AIFC", 4) == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, AIFF_CAPS);
+ }
+}
+
+/*** audio/x-svx ***/
+
+static GstStaticCaps svx_caps = GST_STATIC_CAPS ("audio/x-svx");
+
+#define SVX_CAPS gst_static_caps_get(&svx_caps)
+static void
+svx_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data && memcmp (data, "FORM", 4) == 0) {
+ data += 8;
+ if (memcmp (data, "8SVX", 4) == 0 || memcmp (data, "16SV", 4) == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SVX_CAPS);
+ }
+}
+
+/*** audio/x-shorten ***/
+
+static GstStaticCaps shn_caps = GST_STATIC_CAPS ("audio/x-shorten");
+
+#define SHN_CAPS gst_static_caps_get(&shn_caps)
+static void
+shn_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data && memcmp (data, "ajkg", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SHN_CAPS);
+ }
+ data = gst_type_find_peek (tf, -8, 8);
+ if (data && memcmp (data, "SHNAMPSK", 8) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SHN_CAPS);
+ }
+}
+
+/*** application/x-ape ***/
+
+static GstStaticCaps ape_caps = GST_STATIC_CAPS ("application/x-ape");
+
+#define APE_CAPS gst_static_caps_get(&ape_caps)
+static void
+ape_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data && memcmp (data, "MAC ", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY + 10, APE_CAPS);
+ }
+}
+
+/*** ISO FORMATS ***/
+
+/*** audio/x-m4a ***/
+
+static GstStaticCaps m4a_caps = GST_STATIC_CAPS ("audio/x-m4a");
+
+#define M4A_CAPS (gst_static_caps_get(&m4a_caps))
+static void
+m4a_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 4, 8);
+
+ if (data && (memcmp (data, "ftypM4A ", 8) == 0)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, M4A_CAPS);
+ }
+}
+
+/*** application/x-3gp ***/
+
+/* The Q is there because variables can't start with a number. */
+static GstStaticCaps q3gp_caps = GST_STATIC_CAPS ("application/x-3gp");
+#define Q3GP_CAPS (gst_static_caps_get(&q3gp_caps))
+
+static const gchar *
+q3gp_type_find_get_profile (const guint8 * data)
+{
+ switch (GST_MAKE_FOURCC (data[0], data[1], data[2], 0)) {
+ case GST_MAKE_FOURCC ('3', 'g', 'g', 0):
+ return "general";
+ case GST_MAKE_FOURCC ('3', 'g', 'p', 0):
+ return "basic";
+ case GST_MAKE_FOURCC ('3', 'g', 's', 0):
+ return "streaming-server";
+ case GST_MAKE_FOURCC ('3', 'g', 'r', 0):
+ return "progressive-download";
+ default:
+ break;
+ }
+ return NULL;
+}
+
+static void
+q3gp_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const gchar *profile;
+ guint32 ftyp_size = 0;
+ gint offset = 0;
+ const guint8 *data = NULL;
+
+ if ((data = gst_type_find_peek (tf, 0, 12)) == NULL) {
+ return;
+ }
+
+ data += 4;
+ if (memcmp (data, "ftyp", 4) != 0) {
+ return;
+ }
+
+ /* check major brand */
+ data += 4;
+ if ((profile = q3gp_type_find_get_profile (data))) {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM,
+ "application/x-3gp", "profile", G_TYPE_STRING, profile, NULL);
+ return;
+ }
+
+ /* check compatible brands */
+ if ((data = gst_type_find_peek (tf, 0, 4)) != NULL) {
+ ftyp_size = GST_READ_UINT32_BE (data);
+ }
+ for (offset = 16; offset < ftyp_size; offset += 4) {
+ if ((data = gst_type_find_peek (tf, offset, 3)) == NULL) {
+ break;
+ }
+ if ((profile = q3gp_type_find_get_profile (data))) {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM,
+ "application/x-3gp", "profile", G_TYPE_STRING, profile, NULL);
+ return;
+ }
+ }
+
+ return;
+
+}
+
+/*** video/mj2 and image/jp2 ***/
+static GstStaticCaps mj2_caps = GST_STATIC_CAPS ("video/mj2");
+
+#define MJ2_CAPS gst_static_caps_get(&mj2_caps)
+
+static GstStaticCaps jp2_caps = GST_STATIC_CAPS ("image/jp2");
+
+#define JP2_CAPS gst_static_caps_get(&jp2_caps)
+
+static void
+jp2_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 24);
+ if (!data)
+ return;
+
+ /* jp2 signature */
+ if (memcmp (data, "\000\000\000\014jP \015\012\207\012", 12) != 0)
+ return;
+
+ /* check ftyp box */
+ data += 12;
+ if (memcmp (data + 4, "ftyp", 4) == 0) {
+ if (memcmp (data + 8, "jp2 ", 4) == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, JP2_CAPS);
+ else if (memcmp (data + 8, "mjp2", 4) == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MJ2_CAPS);
+ }
+}
+
+/*** video/quicktime ***/
+
+static GstStaticCaps qt_caps = GST_STATIC_CAPS ("video/quicktime");
+
+#define QT_CAPS gst_static_caps_get(&qt_caps)
+#define STRNCMP(x,y,z) (strncmp ((char*)(x), (char*)(y), z))
+
+/* FIXME 0.11: go through http://www.ftyps.com/ */
+static void
+qt_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+ guint tip = 0;
+ guint64 offset = 0;
+ guint64 size;
+ const gchar *variant = NULL;
+
+ while ((data = gst_type_find_peek (tf, offset, 12)) != NULL) {
+ guint64 new_offset;
+
+ if (STRNCMP (&data[4], "ftypqt ", 8) == 0) {
+ tip = GST_TYPE_FIND_MAXIMUM;
+ break;
+ }
+
+ if (STRNCMP (&data[4], "ftypisom", 8) == 0 ||
+ STRNCMP (&data[4], "ftypavc1", 8) == 0 ||
+ STRNCMP (&data[4], "ftypmp42", 8) == 0) {
+ tip = GST_TYPE_FIND_MAXIMUM;
+ variant = "iso";
+ break;
+ }
+
+ /* box/atom types that are in common with ISO base media file format */
+ if (STRNCMP (&data[4], "moov", 4) == 0 ||
+ STRNCMP (&data[4], "mdat", 4) == 0 ||
+ STRNCMP (&data[4], "ftyp", 4) == 0 ||
+ STRNCMP (&data[4], "free", 4) == 0 ||
+ STRNCMP (&data[4], "uuid", 4) == 0 ||
+ STRNCMP (&data[4], "skip", 4) == 0) {
+ if (tip == 0) {
+ tip = GST_TYPE_FIND_LIKELY;
+ } else {
+ tip = GST_TYPE_FIND_NEARLY_CERTAIN;
+ }
+ }
+ /* other box/atom types, apparently quicktime specific */
+ else if (STRNCMP (&data[4], "pnot", 4) == 0 ||
+ STRNCMP (&data[4], "PICT", 4) == 0 ||
+ STRNCMP (&data[4], "wide", 4) == 0 ||
+ STRNCMP (&data[4], "prfl", 4) == 0) {
+ tip = GST_TYPE_FIND_MAXIMUM;
+ break;
+ } else {
+ tip = 0;
+ break;
+ }
+
+ size = GST_READ_UINT32_BE (data);
+ /* check compatible brands rather than ever expaning major brands above */
+ if ((STRNCMP (&data[4], "ftyp", 4) == 0) && (size >= 16)) {
+ new_offset = offset + 12;
+ while (new_offset + 4 <= offset + size) {
+ data = gst_type_find_peek (tf, new_offset, 4);
+ if (data == NULL)
+ goto done;
+ if (STRNCMP (&data[4], "isom", 4) == 0 ||
+ STRNCMP (&data[4], "avc1", 4) == 0 ||
+ STRNCMP (&data[4], "mp41", 4) == 0 ||
+ STRNCMP (&data[4], "mp42", 4) == 0) {
+ tip = GST_TYPE_FIND_MAXIMUM;
+ variant = "iso";
+ goto done;
+ }
+ new_offset += 4;
+ }
+ }
+ if (size == 1) {
+ const guint8 *sizedata;
+
+ sizedata = gst_type_find_peek (tf, offset + 8, 8);
+ if (sizedata == NULL)
+ break;
+
+ size = GST_READ_UINT64_BE (sizedata);
+ } else {
+ if (size < 8)
+ break;
+ }
+ new_offset = offset + size;
+ if (new_offset <= offset)
+ break;
+ offset = new_offset;
+ }
+
+done:
+ if (tip > 0) {
+ if (variant) {
+ GstCaps *caps = gst_caps_copy (QT_CAPS);
+
+ gst_caps_set_simple (caps, "variant", G_TYPE_STRING, variant, NULL);
+ gst_type_find_suggest (tf, tip, caps);
+ gst_caps_unref (caps);
+ } else {
+ gst_type_find_suggest (tf, tip, QT_CAPS);
+ }
+ }
+};
+
+
+/*** image/x-quicktime ***/
+
+static GstStaticCaps qtif_caps = GST_STATIC_CAPS ("image/x-quicktime");
+
+#define QTIF_CAPS gst_static_caps_get(&qtif_caps)
+
+/* how many atoms we check before we give up */
+#define QTIF_MAXROUNDS 25
+
+static void
+qtif_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+ gboolean found_idsc = FALSE;
+ gboolean found_idat = FALSE;
+ guint64 offset = 0;
+ guint rounds = 0;
+
+ while ((data = gst_type_find_peek (tf, offset, 8)) != NULL) {
+ guint64 size;
+
+ size = GST_READ_UINT32_BE (data);
+ if (size == 1) {
+ const guint8 *sizedata;
+
+ sizedata = gst_type_find_peek (tf, offset + 8, 8);
+ if (sizedata == NULL)
+ break;
+
+ size = GST_READ_UINT64_BE (sizedata);
+ }
+ if (size < 8)
+ break;
+
+ if (STRNCMP (data + 4, "idsc", 4) == 0)
+ found_idsc = TRUE;
+ if (STRNCMP (data + 4, "idat", 4) == 0)
+ found_idat = TRUE;
+
+ if (found_idsc && found_idat) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, QTIF_CAPS);
+ return;
+ }
+
+ offset += size;
+ if (++rounds > QTIF_MAXROUNDS)
+ break;
+ }
+
+ if (found_idsc || found_idat) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, QTIF_CAPS);
+ return;
+ }
+};
+
+/*** audio/x-mod ***/
+
+static GstStaticCaps mod_caps = GST_STATIC_CAPS ("audio/x-mod");
+
+#define MOD_CAPS gst_static_caps_get(&mod_caps)
+/* FIXME: M15 CheckType to do */
+static void
+mod_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+
+ /* MOD */
+ if ((data = gst_type_find_peek (tf, 1080, 4)) != NULL) {
+ /* Protracker and variants */
+ if ((memcmp (data, "M.K.", 4) == 0) || (memcmp (data, "M!K!", 4) == 0) ||
+ /* Star Tracker */
+ (memcmp (data, "FLT", 3) == 0 && isdigit (data[3])) ||
+ (memcmp (data, "EXO", 3) == 0 && isdigit (data[3])) ||
+ /* Oktalyzer (Amiga) */
+ (memcmp (data, "OKTA", 4) == 0) ||
+ /* Oktalyser (Atari) */
+ (memcmp (data, "CD81", 4) == 0) ||
+ /* Fasttracker */
+ (memcmp (data + 1, "CHN", 3) == 0 && isdigit (data[0])) ||
+ /* Fasttracker or Taketracker */
+ (memcmp (data + 2, "CH", 2) == 0 && isdigit (data[0])
+ && isdigit (data[1])) || (memcmp (data + 2, "CN", 2) == 0
+ && isdigit (data[0]) && isdigit (data[1]))) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ /* XM */
+ if ((data = gst_type_find_peek (tf, 0, 38)) != NULL) {
+ if (memcmp (data, "Extended Module: ", 17) == 0 && data[37] == 0x1A) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ /* OKT */
+ if (data || (data = gst_type_find_peek (tf, 0, 8)) != NULL) {
+ if (memcmp (data, "OKTASONG", 8) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ if (data || (data = gst_type_find_peek (tf, 0, 4)) != NULL) {
+ /* 669 */
+ if ((memcmp (data, "if", 2) == 0) || (memcmp (data, "JN", 2) == 0)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MOD_CAPS);
+ return;
+ }
+ /* AMF */
+ if ((memcmp (data, "AMF", 3) == 0 && data[3] > 10 && data[3] < 14) ||
+ /* IT */
+ (memcmp (data, "IMPM", 4) == 0) ||
+ /* MED */
+ (memcmp (data, "MMD0", 4) == 0) || (memcmp (data, "MMD1", 4) == 0) ||
+ /* MTM */
+ (memcmp (data, "MTM", 3) == 0)) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ /* DSM */
+ if (memcmp (data, "RIFF", 4) == 0) {
+ const guint8 *data2 = gst_type_find_peek (tf, 8, 4);
+
+ if (data2) {
+ if (memcmp (data2, "DSMF", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ }
+ /* FAM */
+ if (memcmp (data, "FAM\xFE", 4) == 0) {
+ const guint8 *data2 = gst_type_find_peek (tf, 44, 3);
+
+ if (data2) {
+ if (memcmp (data2, "compare", 3) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ } else {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MOD_CAPS);
+ return;
+ }
+ }
+ /* GDM */
+ if (memcmp (data, "GDM\xFE", 4) == 0) {
+ const guint8 *data2 = gst_type_find_peek (tf, 71, 4);
+
+ if (data2) {
+ if (memcmp (data2, "GMFS", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ } else {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MOD_CAPS);
+ return;
+ }
+ }
+ }
+ /* IMF */
+ if ((data = gst_type_find_peek (tf, 60, 4)) != NULL) {
+ if (memcmp (data, "IM10", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ /* S3M */
+ if ((data = gst_type_find_peek (tf, 44, 4)) != NULL) {
+ if (memcmp (data, "SCRM", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ /* STM */
+ if ((data = gst_type_find_peek (tf, 20, 8)) != NULL) {
+ if (g_ascii_strncasecmp ((gchar *) data, "!Scream!", 8) == 0 ||
+ g_ascii_strncasecmp ((gchar *) data, "BMOD2STM", 8) == 0) {
+ const guint8 *id, *stmtype;
+
+ if ((id = gst_type_find_peek (tf, 28, 1)) == NULL)
+ return;
+ if ((stmtype = gst_type_find_peek (tf, 29, 1)) == NULL)
+ return;
+ if (*id == 0x1A && *stmtype == 2)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+ /* AMF */
+ if ((data = gst_type_find_peek (tf, 0, 19)) != NULL) {
+ if (memcmp (data, "ASYLUM Music Format", 19) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MOD_CAPS);
+ return;
+ }
+ }
+}
+
+/*** application/x-shockwave-flash ***/
+
+static GstStaticCaps swf_caps =
+GST_STATIC_CAPS ("application/x-shockwave-flash");
+#define SWF_CAPS (gst_static_caps_get(&swf_caps))
+static void
+swf_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data && (data[0] == 'F' || data[0] == 'C') &&
+ data[1] == 'W' && data[2] == 'S') {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SWF_CAPS);
+ }
+}
+
+/*** image/jpeg ***/
+
+#define JPEG_MARKER_IS_START_OF_FRAME(x) \
+ ((x)>=0xc0 && (x) <= 0xcf && (x)!=0xc4 && (x)!=0xc8 && (x)!=0xcc)
+
+static GstStaticCaps jpeg_caps = GST_STATIC_CAPS ("image/jpeg");
+
+#define JPEG_CAPS (gst_static_caps_get(&jpeg_caps))
+static void
+jpeg_type_find (GstTypeFind * tf, gpointer unused)
+{
+ GstTypeFindProbability prob = GST_TYPE_FIND_POSSIBLE;
+ DataScanCtx c = { 0, NULL, 0 };
+ GstCaps *caps;
+ guint num_markers;
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 2)))
+ return;
+
+ if (c.data[0] != 0xff || c.data[1] != 0xd8)
+ return;
+
+ num_markers = 1;
+ data_scan_ctx_advance (tf, &c, 2);
+
+ caps = gst_caps_copy (JPEG_CAPS);
+
+ while (data_scan_ctx_ensure_data (tf, &c, 4) && c.offset < (200 * 1024)) {
+ guint16 len;
+ guint8 marker;
+
+ if (c.data[0] != 0xff)
+ break;
+
+ marker = c.data[1];
+ if (G_UNLIKELY (marker == 0xff)) {
+ data_scan_ctx_advance (tf, &c, 1);
+ continue;
+ }
+
+ data_scan_ctx_advance (tf, &c, 2);
+
+ /* we assume all markers we'll see before SOF have a payload length; if
+ * that's not the case we'll just detect a false sync and bail out, but
+ * still report POSSIBLE probability */
+ len = GST_READ_UINT16_BE (c.data);
+
+ GST_LOG ("possible JPEG marker 0x%02x (@0x%04x), segment length %u",
+ marker, (guint) c.offset, len);
+
+ if (!data_scan_ctx_ensure_data (tf, &c, len))
+ break;
+
+ if (marker == 0xc4 || /* DEFINE_HUFFMAN_TABLES */
+ marker == 0xcc || /* DEFINE_ARITHMETIC_CONDITIONING */
+ marker == 0xdb || /* DEFINE_QUANTIZATION_TABLES */
+ marker == 0xdd || /* DEFINE_RESTART_INTERVAL */
+ marker == 0xfe) { /* COMMENT */
+ data_scan_ctx_advance (tf, &c, len);
+ ++num_markers;
+ } else if (marker == 0xe0 && len >= (2 + 4) && /* APP0 */
+ data_scan_ctx_memcmp (tf, &c, 2, "JFIF", 4)) {
+ GST_LOG ("found JFIF tag");
+ prob = GST_TYPE_FIND_MAXIMUM;
+ data_scan_ctx_advance (tf, &c, len);
+ ++num_markers;
+ /* we continue until we find a start of frame marker */
+ } else if (marker == 0xe1 && len >= (2 + 4) && /* APP1 */
+ data_scan_ctx_memcmp (tf, &c, 2, "Exif", 4)) {
+ GST_LOG ("found Exif tag");
+ prob = GST_TYPE_FIND_MAXIMUM;
+ data_scan_ctx_advance (tf, &c, len);
+ ++num_markers;
+ /* we continue until we find a start of frame marker */
+ } else if (marker >= 0xe0 && marker <= 0xef) { /* APPn */
+ data_scan_ctx_advance (tf, &c, len);
+ ++num_markers;
+ } else if (JPEG_MARKER_IS_START_OF_FRAME (marker) && len >= (2 + 8)) {
+ int h, w;
+
+ h = GST_READ_UINT16_BE (c.data + 2 + 1);
+ w = GST_READ_UINT16_BE (c.data + 2 + 1 + 2);
+ if (h == 0 || w == 0) {
+ GST_WARNING ("bad width %u and/or height %u in SOF header", w, h);
+ break;
+ }
+
+ GST_LOG ("SOF at offset %" G_GUINT64_FORMAT ", num_markers=%d, "
+ "WxH=%dx%d", c.offset - 2, num_markers, w, h);
+
+ if (num_markers >= 5 || prob == GST_TYPE_FIND_MAXIMUM)
+ prob = GST_TYPE_FIND_MAXIMUM;
+ else
+ prob = GST_TYPE_FIND_LIKELY;
+
+ gst_caps_set_simple (caps, "width", G_TYPE_INT, w,
+ "height", G_TYPE_INT, h, NULL);
+ break;
+ } else {
+ GST_WARNING ("bad length or unexpected JPEG marker 0xff 0x%02x", marker);
+ break;
+ }
+ }
+
+ gst_type_find_suggest (tf, prob, caps);
+ gst_caps_unref (caps);
+}
+
+/*** image/bmp ***/
+
+static GstStaticCaps bmp_caps = GST_STATIC_CAPS ("image/bmp");
+
+#define BMP_CAPS (gst_static_caps_get(&bmp_caps))
+static void
+bmp_type_find (GstTypeFind * tf, gpointer unused)
+{
+ DataScanCtx c = { 0, NULL, 0 };
+ guint32 struct_size, w, h, planes, bpp;
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 54)))
+ return;
+
+ if (c.data[0] != 'B' || c.data[1] != 'M')
+ return;
+
+ /* skip marker + size */
+ data_scan_ctx_advance (tf, &c, 2 + 4);
+
+ /* reserved, must be 0 */
+ if (c.data[0] != 0 || c.data[1] != 0 || c.data[2] != 0 || c.data[3] != 0)
+ return;
+
+ data_scan_ctx_advance (tf, &c, 2 + 2);
+
+ /* offset to start of image data in bytes (check for sanity) */
+ GST_LOG ("offset=%u", GST_READ_UINT32_LE (c.data));
+ if (GST_READ_UINT32_LE (c.data) > (10 * 1024 * 1024))
+ return;
+
+ struct_size = GST_READ_UINT32_LE (c.data + 4);
+ GST_LOG ("struct_size=%u", struct_size);
+
+ data_scan_ctx_advance (tf, &c, 4 + 4);
+
+ if (struct_size == 0x0C) {
+ w = GST_READ_UINT16_LE (c.data);
+ h = GST_READ_UINT16_LE (c.data + 2);
+ planes = GST_READ_UINT16_LE (c.data + 2 + 2);
+ bpp = GST_READ_UINT16_LE (c.data + 2 + 2 + 2);
+ } else if (struct_size == 40 || struct_size == 64 || struct_size == 108
+ || struct_size == 124 || struct_size == 0xF0) {
+ w = GST_READ_UINT32_LE (c.data);
+ h = GST_READ_UINT32_LE (c.data + 4);
+ planes = GST_READ_UINT16_LE (c.data + 4 + 4);
+ bpp = GST_READ_UINT16_LE (c.data + 4 + 4 + 2);
+ } else {
+ return;
+ }
+
+ /* image sizes sanity check */
+ GST_LOG ("w=%u, h=%u, planes=%u, bpp=%u", w, h, planes, bpp);
+ if (w == 0 || w > 0xfffff || h == 0 || h > 0xfffff || planes != 1 ||
+ (bpp != 1 && bpp != 4 && bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32))
+ return;
+
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM, "image/bmp",
+ "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, "bpp", G_TYPE_INT, bpp,
+ NULL);
+}
+
+/*** image/tiff ***/
+static GstStaticCaps tiff_caps = GST_STATIC_CAPS ("image/tiff, "
+ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }");
+#define TIFF_CAPS (gst_static_caps_get(&tiff_caps))
+static GstStaticCaps tiff_be_caps = GST_STATIC_CAPS ("image/tiff, "
+ "endianness = (int) BIG_ENDIAN");
+#define TIFF_BE_CAPS (gst_static_caps_get(&tiff_be_caps))
+static GstStaticCaps tiff_le_caps = GST_STATIC_CAPS ("image/tiff, "
+ "endianness = (int) LITTLE_ENDIAN");
+#define TIFF_LE_CAPS (gst_static_caps_get(&tiff_le_caps))
+static void
+tiff_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 8);
+ guint8 le_header[4] = { 0x49, 0x49, 0x2A, 0x00 };
+ guint8 be_header[4] = { 0x4D, 0x4D, 0x00, 0x2A };
+
+ if (data) {
+ if (memcmp (data, le_header, 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, TIFF_LE_CAPS);
+ } else if (memcmp (data, be_header, 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, TIFF_BE_CAPS);
+ }
+ }
+}
+
+/*** PNM ***/
+
+static GstStaticCaps pnm_caps = GST_STATIC_CAPS ("image/x-portable-bitmap; "
+ "image/x-portable-graymap; image/x-portable-pixmap; "
+ "image/x-portable-anymap");
+
+#define PNM_CAPS (gst_static_caps_get(&pnm_caps))
+
+#define IS_PNM_WHITESPACE(c) \
+ ((c) == ' ' || (c) == '\r' || (c) == '\n' || (c) == 't')
+
+static void
+pnm_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ const gchar *media_type = NULL;
+ DataScanCtx c = { 0, NULL, 0 };
+ guint h = 0, w = 0;
+
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 16)))
+ return;
+
+ /* see http://en.wikipedia.org/wiki/Netpbm_format */
+ if (c.data[0] != 'P' || c.data[1] < '1' || c.data[1] > '7' ||
+ !IS_PNM_WHITESPACE (c.data[2]) ||
+ (c.data[3] != '#' && c.data[3] < '0' && c.data[3] > '9'))
+ return;
+
+ switch (c.data[1]) {
+ case '1':
+ media_type = "image/x-portable-bitmap"; /* ASCII */
+ break;
+ case '2':
+ media_type = "image/x-portable-graymap"; /* ASCII */
+ break;
+ case '3':
+ media_type = "image/x-portable-pixmap"; /* ASCII */
+ break;
+ case '4':
+ media_type = "image/x-portable-bitmap"; /* Raw */
+ break;
+ case '5':
+ media_type = "image/x-portable-graymap"; /* Raw */
+ break;
+ case '6':
+ media_type = "image/x-portable-pixmap"; /* Raw */
+ break;
+ case '7':
+ media_type = "image/x-portable-anymap";
+ break;
+ default:
+ g_return_if_reached ();
+ }
+
+ /* try to extract width and height as well */
+ if (c.data[1] != '7') {
+ gchar s[64] = { 0, }
+ , sep1, sep2;
+
+ /* need to skip any comment lines first */
+ data_scan_ctx_advance (tf, &c, 3);
+ while (c.data[0] == '#') { /* we know there's still data left */
+ data_scan_ctx_advance (tf, &c, 1);
+ while (c.data[0] != '\n' && c.data[0] != '\r') {
+ if (!data_scan_ctx_ensure_data (tf, &c, 4))
+ return;
+ data_scan_ctx_advance (tf, &c, 1);
+ }
+ data_scan_ctx_advance (tf, &c, 1);
+ GST_LOG ("skipped comment line in PNM header");
+ }
+
+ if (!data_scan_ctx_ensure_data (tf, &c, 32) &&
+ !data_scan_ctx_ensure_data (tf, &c, 4)) {
+ return;
+ }
+
+ /* need to NUL-terminate data for sscanf */
+ memcpy (s, c.data, MIN (sizeof (s) - 1, c.size));
+ if (sscanf (s, "%u%c%u%c", &w, &sep1, &h, &sep2) == 4 &&
+ IS_PNM_WHITESPACE (sep1) && IS_PNM_WHITESPACE (sep2) &&
+ w > 0 && w < G_MAXINT && h > 0 && h < G_MAXINT) {
+ GST_LOG ("extracted PNM width and height: %dx%d", w, h);
+ } else {
+ w = 0;
+ h = 0;
+ }
+ } else {
+ /* FIXME: extract width + height for anymaps too */
+ }
+
+ if (w > 0 && h > 0) {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM, media_type,
+ "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL);
+ } else {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_LIKELY, media_type, NULL);
+ }
+}
+
+static GstStaticCaps sds_caps = GST_STATIC_CAPS ("audio/x-sds");
+
+#define SDS_CAPS (gst_static_caps_get(&sds_caps))
+static void
+sds_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+ guint8 mask[4] = { 0xFF, 0xFF, 0x80, 0xFF };
+ guint8 match[4] = { 0xF0, 0x7E, 0, 0x01 };
+ gint x;
+
+ if (data) {
+ for (x = 0; x < 4; x++) {
+ if ((data[x] & mask[x]) != match[x]) {
+ return;
+ }
+ }
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SDS_CAPS);
+ }
+}
+
+static GstStaticCaps ircam_caps = GST_STATIC_CAPS ("audio/x-ircam");
+
+#define IRCAM_CAPS (gst_static_caps_get(&ircam_caps))
+static void
+ircam_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+ guint8 mask[4] = { 0xFF, 0xFF, 0xF8, 0xFF };
+ guint8 match[4] = { 0x64, 0xA3, 0x00, 0x00 };
+ gint x;
+ gboolean matched = TRUE;
+
+ if (!data) {
+ return;
+ }
+ for (x = 0; x < 4; x++) {
+ if ((data[x] & mask[x]) != match[x]) {
+ matched = FALSE;
+ }
+ }
+ if (matched) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, IRCAM_CAPS);
+ return;
+ }
+ /* now try the reverse version */
+ matched = TRUE;
+ for (x = 0; x < 4; x++) {
+ if ((data[x] & mask[3 - x]) != match[3 - x]) {
+ matched = FALSE;
+ }
+ }
+}
+
+/* EBML typefind helper */
+static gboolean
+ebml_check_header (GstTypeFind * tf, const gchar * doctype, int doctype_len)
+{
+ /* 4 bytes for EBML ID, 1 byte for header length identifier */
+ const guint8 *data = gst_type_find_peek (tf, 0, 4 + 1);
+ gint len_mask = 0x80, size = 1, n = 1, total;
+
+ if (!data)
+ return FALSE;
+
+ /* ebml header? */
+ if (data[0] != 0x1A || data[1] != 0x45 || data[2] != 0xDF || data[3] != 0xA3)
+ return FALSE;
+
+ /* length of header */
+ total = data[4];
+ while (size <= 8 && !(total & len_mask)) {
+ size++;
+ len_mask >>= 1;
+ }
+ if (size > 8)
+ return FALSE;
+ total &= (len_mask - 1);
+ while (n < size)
+ total = (total << 8) | data[4 + n++];
+
+ /* get new data for full header, 4 bytes for EBML ID,
+ * EBML length tag and the actual header */
+ data = gst_type_find_peek (tf, 0, 4 + size + total);
+ if (!data)
+ return FALSE;
+
+ /* only check doctype if asked to do so */
+ if (doctype == NULL || doctype_len == 0)
+ return TRUE;
+
+ /* the header must contain the doctype. For now, we don't parse the
+ * whole header but simply check for the availability of that array
+ * of characters inside the header. Not fully fool-proof, but good
+ * enough. */
+ for (n = 4 + size; n <= 4 + size + total - doctype_len; n++)
+ if (!memcmp (&data[n], doctype, doctype_len))
+ return TRUE;
+
+ return FALSE;
+}
+
+/*** video/x-matroska ***/
+static GstStaticCaps matroska_caps = GST_STATIC_CAPS ("video/x-matroska");
+
+#define MATROSKA_CAPS (gst_static_caps_get(&matroska_caps))
+static void
+matroska_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ if (ebml_check_header (tf, "matroska", 8))
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MATROSKA_CAPS);
+ else if (ebml_check_header (tf, NULL, 0))
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MATROSKA_CAPS);
+}
+
+/*** video/webm ***/
+static GstStaticCaps webm_caps = GST_STATIC_CAPS ("video/webm");
+
+#define WEBM_CAPS (gst_static_caps_get(&webm_caps))
+static void
+webm_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ if (ebml_check_header (tf, "webm", 4))
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, WEBM_CAPS);
+}
+
+/*** application/mxf ***/
+static GstStaticCaps mxf_caps = GST_STATIC_CAPS ("application/mxf");
+
+#define MXF_MAX_PROBE_LENGTH (1024 * 64)
+#define MXF_CAPS (gst_static_caps_get(&mxf_caps))
+
+/*
+ * MXF files start with a header partition pack key of 16 bytes which is defined
+ * at SMPTE-377M 6.1. Before this there can be up to 64K of run-in which _must_
+ * not contain the partition pack key.
+ */
+static void
+mxf_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+ static const guint8 partition_pack_key[] =
+ { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0d, 0x01, 0x02, 0x01,
+ 0x01
+ };
+ DataScanCtx c = { 0, NULL, 0 };
+
+ while (c.offset <= MXF_MAX_PROBE_LENGTH) {
+ guint i;
+ if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 1024)))
+ break;
+
+ /* look over in chunks of 1kbytes to avoid too much overhead */
+
+ for (i = 0; i < 1024 - 16; i++) {
+ /* Check first byte before calling more expensive memcmp function */
+ if (G_UNLIKELY (c.data[i] == 0x06
+ && memcmp (c.data + i, partition_pack_key, 13) == 0)) {
+ /* Header partition pack? */
+ if (c.data[i + 13] != 0x02)
+ goto advance;
+
+ /* Partition status */
+ if (c.data[i + 14] >= 0x05)
+ goto advance;
+
+ /* Reserved, must be 0x00 */
+ if (c.data[i + 15] != 0x00)
+ goto advance;
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MXF_CAPS);
+ return;
+ }
+ }
+
+ advance:
+ data_scan_ctx_advance (tf, &c, 1024 - 16);
+ }
+}
+
+/*** video/x-dv ***/
+
+static GstStaticCaps dv_caps = GST_STATIC_CAPS ("video/x-dv, "
+ "systemstream = (boolean) true");
+#define DV_CAPS (gst_static_caps_get(&dv_caps))
+static void
+dv_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 5);
+
+ /* check for DIF and DV flag */
+ if (data && (data[0] == 0x1f) && (data[1] == 0x07) && (data[2] == 0x00)) {
+ const gchar *format;
+
+ if (data[3] & 0x80) {
+ format = "PAL";
+ } else {
+ format = "NTSC";
+ }
+
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM, "video/x-dv",
+ "systemstream", G_TYPE_BOOLEAN, TRUE,
+ "format", G_TYPE_STRING, format, NULL);
+ }
+}
+
+
+/*** application/ogg and application/x-annodex ***/
+static GstStaticCaps ogg_caps = GST_STATIC_CAPS ("application/ogg");
+static GstStaticCaps annodex_caps = GST_STATIC_CAPS ("application/x-annodex");
+static GstStaticCaps ogg_annodex_caps =
+ GST_STATIC_CAPS ("application/ogg;application/x-annodex");
+
+#define OGGANX_CAPS (gst_static_caps_get(&ogg_annodex_caps))
+
+static void
+ogganx_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if ((data != NULL) && (memcmp (data, "OggS", 4) == 0)) {
+
+ /* Check for an annodex fishbone header */
+ data = gst_type_find_peek (tf, 28, 8);
+ if (data && memcmp (data, "fishead\0", 8) == 0)
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM,
+ gst_static_caps_get (&annodex_caps));
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM,
+ gst_static_caps_get (&ogg_caps));
+ }
+}
+
+/*** audio/x-vorbis ***/
+static GstStaticCaps vorbis_caps = GST_STATIC_CAPS ("audio/x-vorbis");
+
+#define VORBIS_CAPS (gst_static_caps_get(&vorbis_caps))
+static void
+vorbis_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 30);
+
+ if (data) {
+ guint blocksize_0;
+ guint blocksize_1;
+
+ /* 1 byte packet type (identification=0x01)
+ 6 byte string "vorbis"
+ 4 byte vorbis version */
+ if (memcmp (data, "\001vorbis\000\000\000\000", 11) != 0)
+ return;
+ data += 11;
+ /* 1 byte channels must be != 0 */
+ if (data[0] == 0)
+ return;
+ data++;
+ /* 4 byte samplerate must be != 0 */
+ if (GST_READ_UINT32_LE (data) == 0)
+ return;
+ data += 16;
+ /* blocksize checks */
+ blocksize_0 = data[0] & 0x0F;
+ blocksize_1 = (data[0] & 0xF0) >> 4;
+ if (blocksize_0 > blocksize_1)
+ return;
+ if (blocksize_0 < 6 || blocksize_0 > 13)
+ return;
+ if (blocksize_1 < 6 || blocksize_1 > 13)
+ return;
+ data++;
+ /* framing bit */
+ if ((data[0] & 0x01) != 1)
+ return;
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, VORBIS_CAPS);
+ }
+}
+
+/*** video/x-theora ***/
+
+static GstStaticCaps theora_caps = GST_STATIC_CAPS ("video/x-theora");
+
+#define THEORA_CAPS (gst_static_caps_get(&theora_caps))
+static void
+theora_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 7); //42);
+
+ if (data) {
+ if (data[0] != 0x80)
+ return;
+ if (memcmp (&data[1], "theora", 6) != 0)
+ return;
+ /* FIXME: make this more reliable when specs are out */
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, THEORA_CAPS);
+ }
+}
+
+/*** kate ***/
+static void
+kate_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 64);
+ gchar category[16] = { 0, };
+
+ if (G_UNLIKELY (data == NULL))
+ return;
+
+ /* see: http://wiki.xiph.org/index.php/OggKate#Format_specification */
+ if (G_LIKELY (memcmp (data, "\200kate\0\0\0", 8) != 0))
+ return;
+
+ /* make sure we always have a NUL-terminated string */
+ memcpy (category, data + 48, 15);
+ GST_LOG ("kate category: %s", category);
+ /* canonical categories for subtitles: subtitles, spu-subtitles, SUB, K-SPU */
+ if (strcmp (category, "subtitles") == 0 || strcmp (category, "SUB") == 0 ||
+ strcmp (category, "spu-subtitles") == 0 ||
+ strcmp (category, "K-SPU") == 0) {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM,
+ "subtitle/x-kate", NULL);
+ } else {
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_MAXIMUM,
+ "application/x-kate", NULL);
+ }
+}
+
+/*** application/x-ogm-video or audio***/
+
+static GstStaticCaps ogmvideo_caps =
+GST_STATIC_CAPS ("application/x-ogm-video");
+#define OGMVIDEO_CAPS (gst_static_caps_get(&ogmvideo_caps))
+static void
+ogmvideo_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 9);
+
+ if (data) {
+ if (memcmp (data, "\001video\000\000\000", 9) != 0)
+ return;
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, OGMVIDEO_CAPS);
+ }
+}
+
+static GstStaticCaps ogmaudio_caps =
+GST_STATIC_CAPS ("application/x-ogm-audio");
+#define OGMAUDIO_CAPS (gst_static_caps_get(&ogmaudio_caps))
+static void
+ogmaudio_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 9);
+
+ if (data) {
+ if (memcmp (data, "\001audio\000\000\000", 9) != 0)
+ return;
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, OGMAUDIO_CAPS);
+ }
+}
+
+static GstStaticCaps ogmtext_caps = GST_STATIC_CAPS ("application/x-ogm-text");
+
+#define OGMTEXT_CAPS (gst_static_caps_get(&ogmtext_caps))
+static void
+ogmtext_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 9);
+
+ if (data) {
+ if (memcmp (data, "\001text\000\000\000\000", 9) != 0)
+ return;
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, OGMTEXT_CAPS);
+ }
+}
+
+/*** audio/x-speex ***/
+
+static GstStaticCaps speex_caps = GST_STATIC_CAPS ("audio/x-speex");
+
+#define SPEEX_CAPS (gst_static_caps_get(&speex_caps))
+static void
+speex_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 80);
+
+ if (data) {
+ /* 8 byte string "Speex "
+ 24 byte speex version string + int */
+ if (memcmp (data, "Speex ", 8) != 0)
+ return;
+ data += 32;
+
+ /* 4 byte header size >= 80 */
+ if (GST_READ_UINT32_LE (data) < 80)
+ return;
+ data += 4;
+
+ /* 4 byte sample rate <= 48000 */
+ if (GST_READ_UINT32_LE (data) > 48000)
+ return;
+ data += 4;
+
+ /* currently there are only 3 speex modes. */
+ if (GST_READ_UINT32_LE (data) > 3)
+ return;
+ data += 12;
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SPEEX_CAPS);
+ }
+}
+
+/*** audio/x-celt ***/
+
+static GstStaticCaps celt_caps = GST_STATIC_CAPS ("audio/x-celt");
+
+#define CELT_CAPS (gst_static_caps_get(&celt_caps))
+static void
+celt_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 8);
+
+ if (data) {
+ /* 8 byte string "CELT " */
+ if (memcmp (data, "CELT ", 8) != 0)
+ return;
+
+ /* TODO: Check other values of the CELT header */
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, CELT_CAPS);
+ }
+}
+
+/*** application/x-ogg-skeleton ***/
+static GstStaticCaps ogg_skeleton_caps =
+GST_STATIC_CAPS ("application/x-ogg-skeleton, parsed=(boolean)FALSE");
+#define OGG_SKELETON_CAPS (gst_static_caps_get(&ogg_skeleton_caps))
+static void
+oggskel_type_find (GstTypeFind * tf, gpointer private)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 12);
+
+ if (data) {
+ /* 8 byte string "fishead\0" for the ogg skeleton stream */
+ if (memcmp (data, "fishead\0", 8) != 0)
+ return;
+ data += 8;
+
+ /* Require that the header contains version 3.0 */
+ if (GST_READ_UINT16_LE (data) != 3)
+ return;
+ data += 2;
+ if (GST_READ_UINT16_LE (data) != 0)
+ return;
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, OGG_SKELETON_CAPS);
+ }
+}
+
+static GstStaticCaps cmml_caps = GST_STATIC_CAPS ("text/x-cmml");
+
+#define CMML_CAPS (gst_static_caps_get(&cmml_caps))
+static void
+cmml_type_find (GstTypeFind * tf, gpointer private)
+{
+ /* Header is 12 bytes minimum (though we don't check the minor version */
+ const guint8 *data = gst_type_find_peek (tf, 0, 12);
+
+ if (data) {
+
+ /* 8 byte string "CMML\0\0\0\0" for the magic number */
+ if (memcmp (data, "CMML\0\0\0\0", 8) != 0)
+ return;
+ data += 8;
+
+ /* Require that the header contains at least version 2.0 */
+ if (GST_READ_UINT16_LE (data) < 2)
+ return;
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, CMML_CAPS);
+ }
+}
+
+/*** application/x-tar ***/
+
+static GstStaticCaps tar_caps = GST_STATIC_CAPS ("application/x-tar");
+
+#define TAR_CAPS (gst_static_caps_get(&tar_caps))
+#define OLDGNU_MAGIC "ustar " /* 7 chars and a NUL */
+#define NEWGNU_MAGIC "ustar" /* 5 chars and a NUL */
+static void
+tar_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 257, 8);
+
+ /* of course we are not certain, but we don't want other typefind funcs
+ * to detect formats of files within the tar archive, e.g. mp3s */
+ if (data) {
+ if (memcmp (data, OLDGNU_MAGIC, 8) == 0) { /* sic */
+ gst_type_find_suggest (tf, GST_TYPE_FIND_NEARLY_CERTAIN, TAR_CAPS);
+ } else if (memcmp (data, NEWGNU_MAGIC, 6) == 0 && /* sic */
+ g_ascii_isdigit (data[6]) && g_ascii_isdigit (data[7])) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_NEARLY_CERTAIN, TAR_CAPS);
+ }
+ }
+}
+
+/*** application/x-ar ***/
+
+static GstStaticCaps ar_caps = GST_STATIC_CAPS ("application/x-ar");
+
+#define AR_CAPS (gst_static_caps_get(&ar_caps))
+static void
+ar_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 24);
+
+ if (data && memcmp (data, "!<arch>", 7) == 0) {
+ gint i;
+
+ for (i = 7; i < 24; ++i) {
+ if (!g_ascii_isprint (data[i]) && data[i] != '\n') {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, AR_CAPS);
+ }
+ }
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_NEARLY_CERTAIN, AR_CAPS);
+ }
+}
+
+/*** audio/x-au ***/
+
+/* NOTE: we cannot replace this function with TYPE_FIND_REGISTER_START_WITH,
+ * as it is only possible to register one typefind factory per 'name'
+ * (which is in this case the caps), and the first one would be replaced by
+ * the second one. */
+static GstStaticCaps au_caps = GST_STATIC_CAPS ("audio/x-au");
+
+#define AU_CAPS (gst_static_caps_get(&au_caps))
+static void
+au_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data) {
+ if (memcmp (data, ".snd", 4) == 0 || memcmp (data, "dns.", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, AU_CAPS);
+ }
+ }
+}
+
+
+/*** video/x-nuv ***/
+
+/* NOTE: we cannot replace this function with TYPE_FIND_REGISTER_START_WITH,
+ * as it is only possible to register one typefind factory per 'name'
+ * (which is in this case the caps), and the first one would be replaced by
+ * the second one. */
+static GstStaticCaps nuv_caps = GST_STATIC_CAPS ("video/x-nuv");
+
+#define NUV_CAPS (gst_static_caps_get(&nuv_caps))
+static void
+nuv_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 11);
+
+ if (data) {
+ if (memcmp (data, "MythTVVideo", 11) == 0
+ || memcmp (data, "NuppelVideo", 11) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, NUV_CAPS);
+ }
+ }
+}
+
+/*** audio/x-paris ***/
+/* NOTE: do not replace this function with two TYPE_FIND_REGISTER_START_WITH */
+static GstStaticCaps paris_caps = GST_STATIC_CAPS ("audio/x-paris");
+
+#define PARIS_CAPS (gst_static_caps_get(&paris_caps))
+static void
+paris_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 4);
+
+ if (data) {
+ if (memcmp (data, " paf", 4) == 0 || memcmp (data, "fap ", 4) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, PARIS_CAPS);
+ }
+ }
+}
+
+/*** audio/iLBC-sh ***/
+/* NOTE: do not replace this function with two TYPE_FIND_REGISTER_START_WITH */
+static GstStaticCaps ilbc_caps = GST_STATIC_CAPS ("audio/iLBC-sh");
+
+#define ILBC_CAPS (gst_static_caps_get(&ilbc_caps))
+static void
+ilbc_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 8);
+
+ if (data) {
+ if (memcmp (data, "#!iLBC30", 8) == 0 || memcmp (data, "#!iLBC20", 8) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, ILBC_CAPS);
+ }
+ }
+}
+
+/*** application/x-ms-dos-executable ***/
+
+static GstStaticCaps msdos_caps =
+GST_STATIC_CAPS ("application/x-ms-dos-executable");
+#define MSDOS_CAPS (gst_static_caps_get(&msdos_caps))
+/* see http://www.madchat.org/vxdevl/papers/winsys/pefile/pefile.htm */
+static void
+msdos_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 64);
+
+ if (data && data[0] == 'M' && data[1] == 'Z' &&
+ GST_READ_UINT16_LE (data + 8) == 4) {
+ guint32 pe_offset = GST_READ_UINT32_LE (data + 60);
+
+ data = gst_type_find_peek (tf, pe_offset, 2);
+ if (data && data[0] == 'P' && data[1] == 'E') {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_NEARLY_CERTAIN, MSDOS_CAPS);
+ }
+ }
+}
+
+/*** application/x-mmsh ***/
+
+static GstStaticCaps mmsh_caps = GST_STATIC_CAPS ("application/x-mmsh");
+
+#define MMSH_CAPS gst_static_caps_get(&mmsh_caps)
+
+/* This is to recognise mssh-over-http */
+static void
+mmsh_type_find (GstTypeFind * tf, gpointer unused)
+{
+ static const guint8 asf_marker[16] = { 0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66,
+ 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c
+ };
+
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 2 + 2 + 4 + 2 + 2 + 16);
+ if (data && data[0] == 0x24 && data[1] == 0x48 &&
+ GST_READ_UINT16_LE (data + 2) > 2 + 2 + 4 + 2 + 2 + 16 &&
+ memcmp (data + 2 + 2 + 4 + 2 + 2, asf_marker, 16) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MMSH_CAPS);
+ }
+}
+
+/*** video/x-dirac ***/
+
+/* NOTE: we cannot replace this function with TYPE_FIND_REGISTER_START_WITH,
+ * as it is only possible to register one typefind factory per 'name'
+ * (which is in this case the caps), and the first one would be replaced by
+ * the second one. */
+static GstStaticCaps dirac_caps = GST_STATIC_CAPS ("video/x-dirac");
+
+#define DIRAC_CAPS (gst_static_caps_get(&dirac_caps))
+static void
+dirac_type_find (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data = gst_type_find_peek (tf, 0, 8);
+
+ if (data) {
+ if (memcmp (data, "BBCD", 4) == 0 || memcmp (data, "KW-DIRAC", 8) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, DIRAC_CAPS);
+ }
+ }
+}
+
+/*** video/vivo ***/
+
+static GstStaticCaps vivo_caps = GST_STATIC_CAPS ("video/vivo");
+
+#define VIVO_CAPS gst_static_caps_get(&vivo_caps)
+
+static void
+vivo_type_find (GstTypeFind * tf, gpointer unused)
+{
+ static const guint8 vivo_marker[] = { 'V', 'e', 'r', 's', 'i', 'o', 'n',
+ ':', 'V', 'i', 'v', 'o', '/'
+ };
+ const guint8 *data;
+ guint hdr_len, pos;
+
+ data = gst_type_find_peek (tf, 0, 1024);
+ if (data == NULL || data[0] != 0x00)
+ return;
+
+ if ((data[1] & 0x80)) {
+ if ((data[2] & 0x80))
+ return;
+ hdr_len = ((guint) (data[1] & 0x7f)) << 7;
+ hdr_len += data[2];
+ if (hdr_len > 2048)
+ return;
+ pos = 3;
+ } else {
+ hdr_len = data[1];
+ pos = 2;
+ }
+
+ /* 1008 = 1022 - strlen ("Version:Vivo/") - 1 */
+ while (pos < 1008 && data[pos] == '\r' && data[pos + 1] == '\n')
+ pos += 2;
+
+ if (memcmp (data + pos, vivo_marker, sizeof (vivo_marker)) == 0) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, VIVO_CAPS);
+ }
+}
+
+/*** XDG MIME typefinder (to avoid false positives mostly) ***/
+
+#ifdef USE_GIO
+static void
+xdgmime_typefind (GstTypeFind * find, gpointer user_data)
+{
+ gchar *mimetype;
+ gsize length = 16384;
+ guint64 tf_length;
+ const guint8 *data;
+ gchar *tmp;
+
+ if ((tf_length = gst_type_find_get_length (find)) > 0)
+ length = MIN (length, tf_length);
+
+ if ((data = gst_type_find_peek (find, 0, length)) == NULL)
+ return;
+
+ tmp = g_content_type_guess (NULL, data, length, NULL);
+ if (tmp == NULL || g_content_type_is_unknown (tmp)) {
+ g_free (tmp);
+ return;
+ }
+
+ mimetype = g_content_type_get_mime_type (tmp);
+ g_free (tmp);
+
+ if (mimetype == NULL)
+ return;
+
+ GST_DEBUG ("Got mimetype '%s'", mimetype);
+
+ /* Ignore audio/video types:
+ * - our own typefinders in -base are likely to be better at this
+ * (and if they're not, we really want to fix them, that's why we don't
+ * report xdg-detected audio/video types at all, not even with a low
+ * probability)
+ * - we want to detect GStreamer media types and not MIME types
+ * - the purpose of this xdg mime finder is mainly to prevent false
+ * positives of non-media formats, not to typefind audio/video formats */
+ if (g_str_has_prefix (mimetype, "audio/") ||
+ g_str_has_prefix (mimetype, "video/")) {
+ GST_LOG ("Ignoring audio/video mime type");
+ g_free (mimetype);
+ return;
+ }
+
+ /* Again, we mainly want the xdg typefinding to prevent false-positives on
+ * non-media formats, so suggest the type with a probability that trumps
+ * uncertain results of our typefinders, but not more than that. */
+ GST_LOG ("Suggesting '%s' with probability POSSIBLE", mimetype);
+ gst_type_find_suggest_simple (find, GST_TYPE_FIND_POSSIBLE, mimetype, NULL);
+ g_free (mimetype);
+}
+#endif /* USE_GIO */
+
+/*** Windows icon typefinder (to avoid false positives mostly) ***/
+
+static void
+windows_icon_typefind (GstTypeFind * find, gpointer user_data)
+{
+ const guint8 *data;
+ gint64 datalen;
+ guint16 type, nimages;
+ gint32 size, offset;
+
+ datalen = gst_type_find_get_length (find);
+ if ((data = gst_type_find_peek (find, 0, 6)) == NULL)
+ return;
+
+ /* header - simple and not enough to rely on it alone */
+ if (GST_READ_UINT16_LE (data) != 0)
+ return;
+ type = GST_READ_UINT16_LE (data + 2);
+ if (type != 1 && type != 2)
+ return;
+ nimages = GST_READ_UINT16_LE (data + 4);
+ if (nimages == 0) /* we can assume we can't have an empty image file ? */
+ return;
+
+ /* first image */
+ if (data[6 + 3] != 0)
+ return;
+ if (type == 1) {
+ guint16 planes = GST_READ_UINT16_LE (data + 6 + 4);
+ if (planes > 1)
+ return;
+ }
+ size = GST_READ_UINT32_LE (data + 6 + 8);
+ offset = GST_READ_UINT32_LE (data + 6 + 12);
+ if (offset < 0 || size <= 0 || size >= datalen || offset >= datalen
+ || size + offset > datalen)
+ return;
+
+ gst_type_find_suggest_simple (find, GST_TYPE_FIND_NEARLY_CERTAIN,
+ "image/x-icon", NULL);
+}
+
+/*** WAP WBMP typefinder ***/
+
+static void
+wbmp_typefind (GstTypeFind * find, gpointer user_data)
+{
+ const guint8 *data;
+ gint64 datalen;
+ guint w, h, size;
+
+ /* http://en.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format */
+ datalen = gst_type_find_get_length (find);
+ if (datalen == 0)
+ return;
+
+ data = gst_type_find_peek (find, 0, 5);
+ if (data == NULL)
+ return;
+
+ /* want 0x00 0x00 at start */
+ if (*data++ != 0 || *data++ != 0)
+ return;
+
+ /* min header size */
+ size = 4;
+
+ /* let's assume max width/height is 65536 */
+ w = *data++;
+ if ((w & 0x80)) {
+ w = (w << 8) | *data++;
+ if ((w & 0x80))
+ return;
+ ++size;
+ data = gst_type_find_peek (find, 4, 2);
+ if (data == NULL)
+ return;
+ }
+ h = *data++;
+ if ((h & 0x80)) {
+ h = (h << 8) | *data++;
+ if ((h & 0x80))
+ return;
+ ++size;
+ }
+
+ if (w == 0 || h == 0)
+ return;
+
+ /* now add bitmap size */
+ size += h * (GST_ROUND_UP_8 (w) / 8);
+
+ if (datalen == size) {
+ gst_type_find_suggest_simple (find, GST_TYPE_FIND_POSSIBLE - 10,
+ "image/vnd.wap.wbmp", NULL);
+ }
+}
+
+/*** DEGAS Atari images (also to avoid false positives, see #625129) ***/
+static void
+degas_type_find (GstTypeFind * tf, gpointer private)
+{
+ /* No magic, but it should have a fixed size and a few invalid values */
+ /* http://www.fileformat.info/format/atari/spec/6ecf9f6eb5be494284a47feb8a214687/view.htm */
+ gint64 len;
+ const guint8 *data;
+ guint16 resolution;
+ int n;
+
+ len = gst_type_find_get_length (tf);
+ if (len < 34) /* smallest header of the lot */
+ return;
+ data = gst_type_find_peek (tf, 0, 4);
+ if (G_UNLIKELY (data == NULL))
+ return;
+ resolution = GST_READ_UINT16_BE (data);
+ if (len == 32034) {
+ /* could be DEGAS */
+ if (resolution <= 2)
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_POSSIBLE + 5,
+ "image/x-degas", NULL);
+ } else if (len == 32066) {
+ /* could be DEGAS Elite */
+ if (resolution <= 2) {
+ data = gst_type_find_peek (tf, len - 16, 8);
+ if (G_UNLIKELY (data == NULL))
+ return;
+ for (n = 0; n < 4; n++) {
+ if (GST_READ_UINT16_BE (data + n * 2) > 2)
+ return;
+ }
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_POSSIBLE + 5,
+ "image/x-degas", NULL);
+ }
+ } else if (len >= 66 && len < 32066) {
+ /* could be compressed DEGAS Elite, but it's compressed and so we can't rely on size,
+ it does have 4 16 bytes values near the end that are 0-2 though. */
+ if ((resolution & 0x8000) && (resolution & 0x7fff) <= 2) {
+ data = gst_type_find_peek (tf, len - 16, 8);
+ if (G_UNLIKELY (data == NULL))
+ return;
+ for (n = 0; n < 4; n++) {
+ if (GST_READ_UINT16_BE (data + n * 2) > 2)
+ return;
+ }
+ gst_type_find_suggest_simple (tf, GST_TYPE_FIND_POSSIBLE + 5,
+ "image/x-degas", NULL);
+ }
+ }
+}
+
+/*** generic typefind for streams that have some data at a specific position***/
+typedef struct
+{
+ const guint8 *data;
+ guint size;
+ guint probability;
+ GstCaps *caps;
+}
+GstTypeFindData;
+
+static void
+start_with_type_find (GstTypeFind * tf, gpointer private)
+{
+ GstTypeFindData *start_with = (GstTypeFindData *) private;
+ const guint8 *data;
+
+ GST_LOG ("trying to find mime type %s with the first %u bytes of data",
+ gst_structure_get_name (gst_caps_get_structure (start_with->caps, 0)),
+ start_with->size);
+ data = gst_type_find_peek (tf, 0, start_with->size);
+ if (data && memcmp (data, start_with->data, start_with->size) == 0) {
+ gst_type_find_suggest (tf, start_with->probability, start_with->caps);
+ }
+}
+
+static void
+sw_data_destroy (GstTypeFindData * sw_data)
+{
+ if (G_LIKELY (sw_data->caps != NULL))
+ gst_caps_unref (sw_data->caps);
+ g_free (sw_data);
+}
+
+#define TYPE_FIND_REGISTER_START_WITH(plugin,name,rank,ext,_data,_size,_probability)\
+G_BEGIN_DECLS{ \
+ GstTypeFindData *sw_data = g_new (GstTypeFindData, 1); \
+ sw_data->data = (const guint8 *)_data; \
+ sw_data->size = _size; \
+ sw_data->probability = _probability; \
+ sw_data->caps = gst_caps_new_simple (name, NULL); \
+ if (!gst_type_find_register (plugin, name, rank, start_with_type_find,\
+ (char **) ext, sw_data->caps, sw_data, \
+ (GDestroyNotify) (sw_data_destroy))) { \
+ gst_caps_unref (sw_data->caps); \
+ g_free (sw_data); \
+ } \
+}G_END_DECLS
+
+/*** same for riff types ***/
+
+static void
+riff_type_find (GstTypeFind * tf, gpointer private)
+{
+ GstTypeFindData *riff_data = (GstTypeFindData *) private;
+ const guint8 *data = gst_type_find_peek (tf, 0, 12);
+
+ if (data && (memcmp (data, "RIFF", 4) == 0 || memcmp (data, "AVF0", 4) == 0)) {
+ data += 8;
+ if (memcmp (data, riff_data->data, 4) == 0)
+ gst_type_find_suggest (tf, riff_data->probability, riff_data->caps);
+ }
+}
+
+#define TYPE_FIND_REGISTER_RIFF(plugin,name,rank,ext,_data) \
+G_BEGIN_DECLS{ \
+ GstTypeFindData *sw_data = g_new (GstTypeFindData, 1); \
+ sw_data->data = (gpointer)_data; \
+ sw_data->size = 4; \
+ sw_data->probability = GST_TYPE_FIND_MAXIMUM; \
+ sw_data->caps = gst_caps_new_simple (name, NULL); \
+ if (!gst_type_find_register (plugin, name, rank, riff_type_find, \
+ (char **) ext, sw_data->caps, sw_data, \
+ (GDestroyNotify) (sw_data_destroy))) { \
+ gst_caps_unref (sw_data->caps); \
+ g_free (sw_data); \
+ } \
+}G_END_DECLS
+
+
+/*** plugin initialization ***/
+
+#define TYPE_FIND_REGISTER(plugin,name,rank,func,ext,caps,priv,notify) \
+G_BEGIN_DECLS{\
+ if (!gst_type_find_register (plugin, name, rank, func, (char **) ext, caps, priv, notify))\
+ return FALSE; \
+}G_END_DECLS
+
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ /* can't initialize this via a struct as caps can't be statically initialized */
+
+ /* note: asx/wax/wmx are XML files, asf doesn't handle them */
+ /* FIXME-0.11: these should be const,
+ this requires gstreamer/gst/gsttypefind::gst_type_find_register()
+ to have define the parameter as const
+ */
+ static const gchar *asf_exts[] = { "asf", "wm", "wma", "wmv", NULL };
+ static const gchar *au_exts[] = { "au", "snd", NULL };
+ static const gchar *avi_exts[] = { "avi", NULL };
+ static const gchar *qcp_exts[] = { "qcp", NULL };
+ static const gchar *cdxa_exts[] = { "dat", NULL };
+ static const gchar *flac_exts[] = { "flac", NULL };
+ static const gchar *flx_exts[] = { "flc", "fli", NULL };
+ static const gchar *id3_exts[] =
+ { "mp3", "mp2", "mp1", "mpga", "ogg", "flac", "tta", NULL };
+ static const gchar *apetag_exts[] = { "mp3", "ape", "mpc", "wv", NULL };
+ static const gchar *tta_exts[] = { "tta", NULL };
+ static const gchar *mod_exts[] = { "669", "amf", "dsm", "gdm", "far", "imf",
+ "it", "med", "mod", "mtm", "okt", "sam",
+ "s3m", "stm", "stx", "ult", "xm", NULL
+ };
+ static const gchar *mp3_exts[] = { "mp3", "mp2", "mp1", "mpga", NULL };
+ static const gchar *ac3_exts[] = { "ac3", "eac3", NULL };
+ static const gchar *dts_exts[] = { "dts", NULL };
+ static const gchar *gsm_exts[] = { "gsm", NULL };
+ static const gchar *musepack_exts[] = { "mpc", "mpp", "mp+", NULL };
+ static const gchar *mpeg_sys_exts[] = { "mpe", "mpeg", "mpg", NULL };
+ static const gchar *mpeg_video_exts[] = { "mpv", "mpeg", "mpg", NULL };
+ static const gchar *mpeg_ts_exts[] = { "ts", "mts", NULL };
+ static const gchar *ogg_exts[] = { "anx", "ogg", "ogm", NULL };
+ static const gchar *qt_exts[] = { "mov", NULL };
+ static const gchar *qtif_exts[] = { "qif", "qtif", "qti", NULL };
+ static const gchar *mj2_exts[] = { "mj2", NULL };
+ static const gchar *jp2_exts[] = { "jp2", NULL };
+ static const gchar *rm_exts[] = { "ra", "ram", "rm", "rmvb", NULL };
+ static const gchar *swf_exts[] = { "swf", "swfl", NULL };
+ static const gchar *utf8_exts[] = { "txt", NULL };
+ static const gchar *wav_exts[] = { "wav", NULL };
+ static const gchar *aiff_exts[] = { "aiff", "aif", "aifc", NULL };
+ static const gchar *svx_exts[] = { "iff", "svx", NULL };
+ static const gchar *paris_exts[] = { "paf", NULL };
+ static const gchar *nist_exts[] = { "nist", NULL };
+ static const gchar *voc_exts[] = { "voc", NULL };
+ static const gchar *sds_exts[] = { "sds", NULL };
+ static const gchar *ircam_exts[] = { "sf", NULL };
+ static const gchar *w64_exts[] = { "w64", NULL };
+ static const gchar *shn_exts[] = { "shn", NULL };
+ static const gchar *ape_exts[] = { "ape", NULL };
+ static const gchar *uri_exts[] = { "ram", NULL };
+ static const gchar *hls_exts[] = { "m3u8", NULL };
+ static const gchar *sdp_exts[] = { "sdp", NULL };
+ static const gchar *smil_exts[] = { "smil", NULL };
+ static const gchar *html_exts[] = { "htm", "html", NULL };
+ static const gchar *xml_exts[] = { "xml", NULL };
+ static const gchar *jpeg_exts[] = { "jpg", "jpe", "jpeg", NULL };
+ static const gchar *gif_exts[] = { "gif", NULL };
+ static const gchar *png_exts[] = { "png", NULL };
+ static const gchar *bmp_exts[] = { "bmp", NULL };
+ static const gchar *tiff_exts[] = { "tif", "tiff", NULL };
+ static const gchar *matroska_exts[] = { "mkv", "mka", NULL };
+ static const gchar *webm_exts[] = { "webm", NULL };
+ static const gchar *mve_exts[] = { "mve", NULL };
+ static const gchar *dv_exts[] = { "dv", "dif", NULL };
+ static const gchar *amr_exts[] = { "amr", NULL };
+ static const gchar *ilbc_exts[] = { "ilbc", NULL };
+ static const gchar *sid_exts[] = { "sid", NULL };
+ static const gchar *xcf_exts[] = { "xcf", NULL };
+ static const gchar *mng_exts[] = { "mng", NULL };
+ static const gchar *jng_exts[] = { "jng", NULL };
+ static const gchar *xpm_exts[] = { "xpm", NULL };
+ static const gchar *pnm_exts[] = { "pnm", "ppm", "pgm", "pbm", NULL };
+ static const gchar *ras_exts[] = { "ras", NULL };
+ static const gchar *bz2_exts[] = { "bz2", NULL };
+ static const gchar *gz_exts[] = { "gz", NULL };
+ static const gchar *zip_exts[] = { "zip", NULL };
+ static const gchar *compress_exts[] = { "Z", NULL };
+ static const gchar *m4a_exts[] = { "m4a", NULL };
+ static const gchar *q3gp_exts[] = { "3gp", NULL };
+ static const gchar *aac_exts[] = { "aac", "adts", "adif", "loas", NULL };
+ static const gchar *spc_exts[] = { "spc", NULL };
+ static const gchar *wavpack_exts[] = { "wv", "wvp", NULL };
+ static const gchar *wavpack_correction_exts[] = { "wvc", NULL };
+ static const gchar *rar_exts[] = { "rar", NULL };
+ static const gchar *tar_exts[] = { "tar", NULL };
+ static const gchar *ar_exts[] = { "a", NULL };
+ static const gchar *msdos_exts[] = { "dll", "exe", "ocx", "sys", "scr",
+ "msstyles", "cpl", NULL
+ };
+ static const gchar *flv_exts[] = { "flv", NULL };
+ static const gchar *m4v_exts[] = { "m4v", NULL };
+ static const gchar *h263_exts[] = { "h263", "263", NULL };
+ static const gchar *h264_exts[] = { "h264", "x264", "264", NULL };
+ static const gchar *nuv_exts[] = { "nuv", NULL };
+ static const gchar *vivo_exts[] = { "viv", NULL };
+ static const gchar *nsf_exts[] = { "nsf", NULL };
+ static const gchar *gym_exts[] = { "gym", NULL };
+ static const gchar *ay_exts[] = { "ay", NULL };
+ static const gchar *gbs_exts[] = { "gbs", NULL };
+ static const gchar *kss_exts[] = { "kss", NULL };
+ static const gchar *sap_exts[] = { "sap", NULL };
+ static const gchar *vgm_exts[] = { "vgm", NULL };
+ static const gchar *mid_exts[] = { "mid", "midi", NULL };
+ static const gchar *mxmf_exts[] = { "mxmf", NULL };
+ static const gchar *imelody_exts[] = { "imy", "ime", "imelody", NULL };
+ static const gchar *pdf_exts[] = { "pdf", NULL };
+ static const gchar *ps_exts[] = { "ps", NULL };
+ static const gchar *svg_exts[] = { "svg", NULL };
+ static const gchar *mxf_exts[] = { "mxf", NULL };
+ static const gchar *ivf_exts[] = { "ivf", NULL };
+ static const gchar *msword_exts[] = { "doc", NULL };
+ static const gchar *dsstore_exts[] = { "DS_Store", NULL };
+ static const gchar *psd_exts[] = { "psd", NULL };
+ static const gchar *y4m_exts[] = { "y4m", NULL };
+
+ GST_DEBUG_CATEGORY_INIT (type_find_debug, "typefindfunctions",
+ GST_DEBUG_FG_GREEN | GST_DEBUG_BG_RED, "generic type find functions");
+
+ /* must use strings, macros don't accept initializers */
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-ms-asf", GST_RANK_SECONDARY,
+ asf_exts,
+ "\060\046\262\165\216\146\317\021\246\331\000\252\000\142\316\154", 16,
+ GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/x-musepack", GST_RANK_PRIMARY,
+ musepack_type_find, musepack_exts, MUSEPACK_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-au", GST_RANK_MARGINAL,
+ au_type_find, au_exts, AU_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_RIFF (plugin, "video/x-msvideo", GST_RANK_PRIMARY,
+ avi_exts, "AVI ");
+ TYPE_FIND_REGISTER_RIFF (plugin, "audio/qcelp", GST_RANK_PRIMARY,
+ qcp_exts, "QLCM");
+ TYPE_FIND_REGISTER_RIFF (plugin, "video/x-cdxa", GST_RANK_PRIMARY,
+ cdxa_exts, "CDXA");
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-vcd", GST_RANK_PRIMARY,
+ cdxa_exts, "\000\377\377\377\377\377\377\377\377\377\377\000", 12,
+ GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-imelody", GST_RANK_PRIMARY,
+ imelody_exts, "BEGIN:IMELODY", 13, GST_TYPE_FIND_MAXIMUM);
+#if 0
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-smoke", GST_RANK_PRIMARY,
+ NULL, "\x80smoke\x00\x01\x00", 6, GST_TYPE_FIND_MAXIMUM);
+#endif
+ TYPE_FIND_REGISTER (plugin, "audio/midi", GST_RANK_PRIMARY, mid_type_find,
+ mid_exts, MID_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_RIFF (plugin, "audio/riff-midi", GST_RANK_PRIMARY,
+ mid_exts, "RMID");
+ TYPE_FIND_REGISTER (plugin, "audio/mobile-xmf", GST_RANK_PRIMARY,
+ mxmf_type_find, mxmf_exts, MXMF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-fli", GST_RANK_MARGINAL, flx_type_find,
+ flx_exts, FLX_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-id3v2", GST_RANK_PRIMARY + 103,
+ id3v2_type_find, id3_exts, ID3_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-id3v1", GST_RANK_PRIMARY + 101,
+ id3v1_type_find, id3_exts, ID3_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-apetag", GST_RANK_PRIMARY + 102,
+ apetag_type_find, apetag_exts, APETAG_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-ttafile", GST_RANK_PRIMARY,
+ tta_type_find, tta_exts, TTA_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-mod", GST_RANK_SECONDARY, mod_type_find,
+ mod_exts, MOD_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/mpeg", GST_RANK_PRIMARY, mp3_type_find,
+ mp3_exts, MP3_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-ac3", GST_RANK_PRIMARY, ac3_type_find,
+ ac3_exts, AC3_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-dts", GST_RANK_SECONDARY, dts_type_find,
+ dts_exts, DTS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-gsm", GST_RANK_PRIMARY, NULL, gsm_exts,
+ GSM_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/mpeg-sys", GST_RANK_PRIMARY,
+ mpeg_sys_type_find, mpeg_sys_exts, MPEG_SYS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/mpegts", GST_RANK_PRIMARY,
+ mpeg_ts_type_find, mpeg_ts_exts, MPEGTS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/ogg", GST_RANK_PRIMARY,
+ ogganx_type_find, ogg_exts, OGGANX_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/mpeg-elementary", GST_RANK_MARGINAL,
+ mpeg_video_stream_type_find, mpeg_video_exts, MPEG_VIDEO_CAPS, NULL,
+ NULL);
+ TYPE_FIND_REGISTER (plugin, "video/mpeg4", GST_RANK_PRIMARY,
+ mpeg4_video_type_find, m4v_exts, MPEG_VIDEO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-h263", GST_RANK_SECONDARY,
+ h263_video_type_find, h263_exts, H263_VIDEO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-h264", GST_RANK_PRIMARY,
+ h264_video_type_find, h264_exts, H264_VIDEO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-nuv", GST_RANK_SECONDARY, nuv_type_find,
+ nuv_exts, NUV_CAPS, NULL, NULL);
+
+ /* ISO formats */
+ TYPE_FIND_REGISTER (plugin, "audio/x-m4a", GST_RANK_PRIMARY, m4a_type_find,
+ m4a_exts, M4A_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-3gp", GST_RANK_PRIMARY,
+ q3gp_type_find, q3gp_exts, Q3GP_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/quicktime", GST_RANK_SECONDARY,
+ qt_type_find, qt_exts, QT_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/x-quicktime", GST_RANK_SECONDARY,
+ qtif_type_find, qtif_exts, QTIF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/jp2", GST_RANK_PRIMARY,
+ jp2_type_find, jp2_exts, JP2_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/mj2", GST_RANK_PRIMARY,
+ jp2_type_find, mj2_exts, MJ2_CAPS, NULL, NULL);
+
+ TYPE_FIND_REGISTER (plugin, "text/html", GST_RANK_SECONDARY, html_type_find,
+ html_exts, HTML_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/vnd.rn-realmedia",
+ GST_RANK_SECONDARY, rm_exts, ".RMF", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-pn-realaudio",
+ GST_RANK_SECONDARY, rm_exts, ".ra\375", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "application/x-shockwave-flash",
+ GST_RANK_SECONDARY, swf_type_find, swf_exts, SWF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-flv", GST_RANK_SECONDARY,
+ flv_exts, "FLV", 3, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "text/plain", GST_RANK_MARGINAL, utf8_type_find,
+ utf8_exts, UTF8_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "text/uri-list", GST_RANK_MARGINAL, uri_type_find,
+ uri_exts, URI_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-hls", GST_RANK_MARGINAL,
+ hls_type_find, hls_exts, HLS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/sdp", GST_RANK_SECONDARY,
+ sdp_type_find, sdp_exts, SDP_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/smil", GST_RANK_SECONDARY,
+ smil_type_find, smil_exts, SMIL_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/xml", GST_RANK_MARGINAL,
+ xml_type_find, xml_exts, GENERIC_XML_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_RIFF (plugin, "audio/x-wav", GST_RANK_PRIMARY, wav_exts,
+ "WAVE");
+ TYPE_FIND_REGISTER (plugin, "audio/x-aiff", GST_RANK_SECONDARY,
+ aiff_type_find, aiff_exts, AIFF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-svx", GST_RANK_SECONDARY, svx_type_find,
+ svx_exts, SVX_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-paris", GST_RANK_SECONDARY,
+ paris_type_find, paris_exts, PARIS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-nist", GST_RANK_SECONDARY,
+ nist_exts, "NIST", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-voc", GST_RANK_SECONDARY,
+ voc_exts, "Creative", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/x-sds", GST_RANK_SECONDARY, sds_type_find,
+ sds_exts, SDS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-ircam", GST_RANK_SECONDARY,
+ ircam_type_find, ircam_exts, IRCAM_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-w64", GST_RANK_SECONDARY,
+ w64_exts, "riff", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/x-shorten", GST_RANK_SECONDARY,
+ shn_type_find, shn_exts, SHN_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ape", GST_RANK_SECONDARY,
+ ape_type_find, ape_exts, APE_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/jpeg", GST_RANK_PRIMARY + 15,
+ jpeg_type_find, jpeg_exts, JPEG_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/gif", GST_RANK_PRIMARY,
+ gif_exts, "GIF8", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/png", GST_RANK_PRIMARY + 14,
+ png_exts, "\211PNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "image/bmp", GST_RANK_PRIMARY, bmp_type_find,
+ bmp_exts, BMP_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/tiff", GST_RANK_PRIMARY, tiff_type_find,
+ tiff_exts, TIFF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/x-portable-pixmap", GST_RANK_SECONDARY,
+ pnm_type_find, pnm_exts, PNM_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-matroska", GST_RANK_PRIMARY,
+ matroska_type_find, matroska_exts, MATROSKA_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/webm", GST_RANK_PRIMARY,
+ webm_type_find, webm_exts, WEBM_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/mxf", GST_RANK_PRIMARY,
+ mxf_type_find, mxf_exts, MXF_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-mve", GST_RANK_SECONDARY,
+ mve_exts, "Interplay MVE File\032\000\032\000\000\001\063\021", 26,
+ GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "video/x-dv", GST_RANK_SECONDARY, dv_type_find,
+ dv_exts, DV_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-amr-nb-sh", GST_RANK_PRIMARY,
+ amr_exts, "#!AMR", 5, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-amr-wb-sh", GST_RANK_PRIMARY,
+ amr_exts, "#!AMR-WB", 7, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/iLBC-sh", GST_RANK_PRIMARY,
+ ilbc_type_find, ilbc_exts, ILBC_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-sid", GST_RANK_MARGINAL,
+ sid_exts, "PSID", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-xcf", GST_RANK_SECONDARY,
+ xcf_exts, "gimp xcf", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-mng", GST_RANK_SECONDARY,
+ mng_exts, "\212MNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-jng", GST_RANK_SECONDARY,
+ jng_exts, "\213JNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-xpixmap", GST_RANK_SECONDARY,
+ xpm_exts, "/* XPM */", 9, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-sun-raster",
+ GST_RANK_SECONDARY, ras_exts, "\131\246\152\225", 4,
+ GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-bzip",
+ GST_RANK_SECONDARY, bz2_exts, "BZh", 3, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-gzip",
+ GST_RANK_SECONDARY, gz_exts, "\037\213", 2, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/zip", GST_RANK_SECONDARY,
+ zip_exts, "PK\003\004", 4, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-compress",
+ GST_RANK_SECONDARY, compress_exts, "\037\235", 2, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER (plugin, "subtitle/x-kate", GST_RANK_MARGINAL,
+ kate_type_find, NULL, NULL, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-flac", GST_RANK_PRIMARY,
+ flac_type_find, flac_exts, FLAC_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-vorbis", GST_RANK_PRIMARY,
+ vorbis_type_find, NULL, VORBIS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-theora", GST_RANK_PRIMARY,
+ theora_type_find, NULL, THEORA_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ogm-video", GST_RANK_PRIMARY,
+ ogmvideo_type_find, NULL, OGMVIDEO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ogm-audio", GST_RANK_PRIMARY,
+ ogmaudio_type_find, NULL, OGMAUDIO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ogm-text", GST_RANK_PRIMARY,
+ ogmtext_type_find, NULL, OGMTEXT_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-speex", GST_RANK_PRIMARY,
+ speex_type_find, NULL, SPEEX_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-celt", GST_RANK_PRIMARY,
+ celt_type_find, NULL, CELT_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ogg-skeleton", GST_RANK_PRIMARY,
+ oggskel_type_find, NULL, OGG_SKELETON_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "text/x-cmml", GST_RANK_PRIMARY, cmml_type_find,
+ NULL, CMML_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-executable",
+ GST_RANK_MARGINAL, NULL, "\177ELF", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/aac", GST_RANK_SECONDARY,
+ aac_type_find, aac_exts, AAC_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-spc", GST_RANK_SECONDARY,
+ spc_exts, "SNES-SPC700 Sound File Data", 27, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER (plugin, "audio/x-wavpack", GST_RANK_SECONDARY,
+ wavpack_type_find, wavpack_exts, WAVPACK_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "audio/x-wavpack-correction", GST_RANK_SECONDARY,
+ wavpack_type_find, wavpack_correction_exts, WAVPACK_CORRECTION_CAPS, NULL,
+ NULL);
+ TYPE_FIND_REGISTER (plugin, "application/postscript", GST_RANK_SECONDARY,
+ postscript_type_find, ps_exts, POSTSCRIPT_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "image/svg+xml", GST_RANK_SECONDARY,
+ svg_type_find, svg_exts, SVG_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-rar",
+ GST_RANK_SECONDARY, rar_exts, "Rar!", 4, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER (plugin, "application/x-tar", GST_RANK_SECONDARY,
+ tar_type_find, tar_exts, TAR_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ar", GST_RANK_SECONDARY,
+ ar_type_find, ar_exts, AR_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-ms-dos-executable",
+ GST_RANK_SECONDARY, msdos_type_find, msdos_exts, MSDOS_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/x-dirac", GST_RANK_PRIMARY,
+ dirac_type_find, NULL, DIRAC_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "multipart/x-mixed-replace", GST_RANK_SECONDARY,
+ multipart_type_find, NULL, MULTIPART_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "application/x-mmsh", GST_RANK_SECONDARY,
+ mmsh_type_find, NULL, MMSH_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER (plugin, "video/vivo", GST_RANK_SECONDARY,
+ vivo_type_find, vivo_exts, VIVO_CAPS, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-nsf",
+ GST_RANK_SECONDARY, nsf_exts, "NESM\x1a", 5, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-gym",
+ GST_RANK_SECONDARY, gym_exts, "GYMX", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-ay",
+ GST_RANK_SECONDARY, ay_exts, "ZXAYEMUL", 8, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-gbs",
+ GST_RANK_SECONDARY, gbs_exts, "GBS\x01", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-vgm",
+ GST_RANK_SECONDARY, vgm_exts, "Vgm\x20", 4, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-sap",
+ GST_RANK_SECONDARY, sap_exts, "SAP\x0d\x0a" "AUTHOR\x20", 12,
+ GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-ivf", GST_RANK_SECONDARY,
+ ivf_exts, "DKIF", 4, GST_TYPE_FIND_NEARLY_CERTAIN);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-kss", GST_RANK_SECONDARY,
+ kss_exts, "KSSX\0", 5, GST_TYPE_FIND_MAXIMUM);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/pdf", GST_RANK_SECONDARY,
+ pdf_exts, "%PDF-", 5, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/msword",
+ GST_RANK_SECONDARY, msword_exts, "\320\317\021\340\241\261\032\341", 8,
+ GST_TYPE_FIND_LIKELY);
+ /* Mac OS X .DS_Store files tend to be taken for video/mpeg */
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/octet-stream",
+ GST_RANK_SECONDARY, dsstore_exts, "\000\000\000\001Bud1", 8,
+ GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "image/vnd.adobe.photoshop",
+ GST_RANK_SECONDARY, psd_exts, "8BPS\000\001\000\000\000\000", 10,
+ GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER (plugin, "image/vnd.wap.wbmp", GST_RANK_MARGINAL,
+ wbmp_typefind, NULL, NULL, NULL, NULL);
+ TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-yuv4mpeg",
+ GST_RANK_SECONDARY, y4m_exts, "YUV4MPEG2 ", 10, GST_TYPE_FIND_LIKELY);
+ TYPE_FIND_REGISTER (plugin, "image/x-icon", GST_RANK_MARGINAL,
+ windows_icon_typefind, NULL, NULL, NULL, NULL);
+
+#ifdef USE_GIO
+ TYPE_FIND_REGISTER (plugin, "xdgmime-base", GST_RANK_MARGINAL,
+ xdgmime_typefind, NULL, NULL, NULL, NULL);
+#endif
+
+ TYPE_FIND_REGISTER (plugin, "image/x-degas", GST_RANK_MARGINAL,
+ degas_type_find, NULL, NULL, NULL, NULL);
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "typefindfunctions",
+ "default typefind functions",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/videoconvert/Makefile.am b/gst/videoconvert/Makefile.am
new file mode 100644
index 0000000..e9c8f78
--- /dev/null
+++ b/gst/videoconvert/Makefile.am
@@ -0,0 +1,35 @@
+plugin_LTLIBRARIES = libgstvideoconvert.la
+
+ORC_SOURCE=gstvideoconvertorc
+include $(top_srcdir)/common/orc.mak
+
+libgstvideoconvert_la_SOURCES = gstvideoconvert.c videoconvert.c
+nodist_libgstvideoconvert_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvideoconvert_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ORC_CFLAGS)
+libgstvideoconvert_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS)
+libgstvideoconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoconvert_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstvideoconvert.h videoconvert.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstvideoconvert -:SHARED libgstvideoconvert \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideoconvert_la_SOURCES) \
+ $(nodist_libgstvideoconvert_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideoconvert_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideoconvert_la_LDFLAGS) \
+ $(libgstvideoconvert_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/videoconvert/Makefile.in b/gst/videoconvert/Makefile.in
new file mode 100644
index 0000000..2e580ad
--- /dev/null
+++ b/gst/videoconvert/Makefile.in
@@ -0,0 +1,881 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/videoconvert
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvideoconvert_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstvideoconvert_la_OBJECTS = \
+ libgstvideoconvert_la-gstvideoconvert.lo \
+ libgstvideoconvert_la-videoconvert.lo
+am__objects_1 = libgstvideoconvert_la-tmp-orc.lo
+nodist_libgstvideoconvert_la_OBJECTS = $(am__objects_1)
+libgstvideoconvert_la_OBJECTS = $(am_libgstvideoconvert_la_OBJECTS) \
+ $(nodist_libgstvideoconvert_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvideoconvert_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) \
+ $(libgstvideoconvert_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvideoconvert_la_SOURCES) \
+ $(nodist_libgstvideoconvert_la_SOURCES)
+DIST_SOURCES = $(libgstvideoconvert_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstvideoconvert.la
+ORC_SOURCE = gstvideoconvertorc
+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 $@";
+libgstvideoconvert_la_SOURCES = gstvideoconvert.c videoconvert.c
+nodist_libgstvideoconvert_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvideoconvert_la_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(ORC_CFLAGS)
+
+libgstvideoconvert_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS)
+
+libgstvideoconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoconvert_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstvideoconvert.h videoconvert.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/videoconvert/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/videoconvert/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
+libgstvideoconvert.la: $(libgstvideoconvert_la_OBJECTS) $(libgstvideoconvert_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvideoconvert_la_LINK) -rpath $(plugindir) $(libgstvideoconvert_la_OBJECTS) $(libgstvideoconvert_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoconvert_la-gstvideoconvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoconvert_la-tmp-orc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoconvert_la-videoconvert.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvideoconvert_la-gstvideoconvert.lo: gstvideoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -MT libgstvideoconvert_la-gstvideoconvert.lo -MD -MP -MF $(DEPDIR)/libgstvideoconvert_la-gstvideoconvert.Tpo -c -o libgstvideoconvert_la-gstvideoconvert.lo `test -f 'gstvideoconvert.c' || echo '$(srcdir)/'`gstvideoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoconvert_la-gstvideoconvert.Tpo $(DEPDIR)/libgstvideoconvert_la-gstvideoconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideoconvert.c' object='libgstvideoconvert_la-gstvideoconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -c -o libgstvideoconvert_la-gstvideoconvert.lo `test -f 'gstvideoconvert.c' || echo '$(srcdir)/'`gstvideoconvert.c
+
+libgstvideoconvert_la-videoconvert.lo: videoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -MT libgstvideoconvert_la-videoconvert.lo -MD -MP -MF $(DEPDIR)/libgstvideoconvert_la-videoconvert.Tpo -c -o libgstvideoconvert_la-videoconvert.lo `test -f 'videoconvert.c' || echo '$(srcdir)/'`videoconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoconvert_la-videoconvert.Tpo $(DEPDIR)/libgstvideoconvert_la-videoconvert.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='videoconvert.c' object='libgstvideoconvert_la-videoconvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -c -o libgstvideoconvert_la-videoconvert.lo `test -f 'videoconvert.c' || echo '$(srcdir)/'`videoconvert.c
+
+libgstvideoconvert_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -MT libgstvideoconvert_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideoconvert_la-tmp-orc.Tpo -c -o libgstvideoconvert_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoconvert_la-tmp-orc.Tpo $(DEPDIR)/libgstvideoconvert_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstvideoconvert_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoconvert_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoconvert_la_CFLAGS) $(CFLAGS) -c -o libgstvideoconvert_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstvideoconvert -:SHARED libgstvideoconvert \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideoconvert_la_SOURCES) \
+ $(nodist_libgstvideoconvert_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideoconvert_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideoconvert_la_LDFLAGS) \
+ $(libgstvideoconvert_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/videoconvert/gstvideoconvert.c b/gst/videoconvert/gstvideoconvert.c
new file mode 100644
index 0000000..b920fdd
--- /dev/null
+++ b/gst/videoconvert/gstvideoconvert.c
@@ -0,0 +1,516 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * This file:
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2010 David Schleef <ds@schleef.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.
+ */
+
+/**
+ * SECTION:element-videoconvert
+ *
+ * Convert video frames between a great variety of video formats.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v videotestsrc ! video/x-raw,format=\(fourcc\)YUY2 ! videoconvert ! ximagesink
+ * ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstvideoconvert.h"
+#include <gst/video/video.h>
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY (videoconvert_debug);
+#define GST_CAT_DEFAULT videoconvert_debug
+GST_DEBUG_CATEGORY (videoconvert_performance);
+
+enum
+{
+ PROP_0,
+ PROP_DITHER
+};
+
+#define CSP_VIDEO_CAPS GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL)
+
+static GstStaticPadTemplate gst_video_convert_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CSP_VIDEO_CAPS)
+ );
+
+static GstStaticPadTemplate gst_video_convert_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CSP_VIDEO_CAPS)
+ );
+
+GType gst_video_convert_get_type (void);
+
+static void gst_video_convert_set_property (GObject * object,
+ guint property_id, const GValue * value, GParamSpec * pspec);
+static void gst_video_convert_get_property (GObject * object,
+ guint property_id, GValue * value, GParamSpec * pspec);
+
+static gboolean gst_video_convert_set_caps (GstBaseTransform * btrans,
+ GstCaps * incaps, GstCaps * outcaps);
+static gboolean gst_video_convert_get_unit_size (GstBaseTransform * btrans,
+ GstCaps * caps, gsize * size);
+static GstFlowReturn gst_video_convert_transform (GstBaseTransform * btrans,
+ GstBuffer * inbuf, GstBuffer * outbuf);
+
+static GType
+dither_method_get_type (void)
+{
+ static GType gtype = 0;
+
+ if (gtype == 0) {
+ static const GEnumValue values[] = {
+ {DITHER_NONE, "No dithering (default)", "none"},
+ {DITHER_VERTERR, "Vertical error propogation", "verterr"},
+ {DITHER_HALFTONE, "Half-tone", "halftone"},
+ {0, NULL, NULL}
+ };
+
+ gtype = g_enum_register_static ("GstColorspaceDitherMethod", values);
+ }
+ return gtype;
+}
+
+/* copies the given caps */
+static GstCaps *
+gst_video_convert_caps_remove_format_info (GstCaps * caps)
+{
+ GstStructure *st;
+ gint i, n;
+ GstCaps *res;
+
+ res = gst_caps_new_empty ();
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ st = gst_caps_get_structure (caps, i);
+
+ /* If this is already expressed by the existing caps
+ * skip this structure */
+ if (i > 0 && gst_caps_is_subset_structure (res, st))
+ continue;
+
+ st = gst_structure_copy (st);
+ gst_structure_remove_fields (st, "format", "palette_data",
+ "colorimetry", "chroma-site", NULL);
+
+ gst_caps_append_structure (res, st);
+ }
+
+ return res;
+}
+
+/* The caps can be transformed into any other caps with format info removed.
+ * However, we should prefer passthrough, so if passthrough is possible,
+ * put it first in the list. */
+static GstCaps *
+gst_video_convert_transform_caps (GstBaseTransform * btrans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *tmp, *tmp2;
+ GstCaps *result;
+
+ result = gst_caps_copy (caps);
+
+ /* Get all possible caps that we can transform to */
+ tmp = gst_video_convert_caps_remove_format_info (caps);
+
+ if (filter) {
+ tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (tmp);
+ tmp = tmp2;
+ }
+
+ result = tmp;
+
+ GST_DEBUG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " into %"
+ GST_PTR_FORMAT, caps, result);
+
+ return result;
+}
+
+static gboolean
+gst_video_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query)
+{
+ GstBufferPool *pool = NULL;
+ guint size, min, max, prefix, alignment;
+
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+
+ if (pool) {
+ GstStructure *config;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_META_VIDEO);
+ gst_buffer_pool_set_config (pool, config);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstVideoConvert *space;
+ GstVideoInfo in_info;
+ GstVideoInfo out_info;
+ ColorSpaceColorSpec in_spec, out_spec;
+ gboolean interlaced;
+
+ space = GST_VIDEO_CONVERT_CAST (btrans);
+
+ if (space->convert) {
+ videoconvert_convert_free (space->convert);
+ }
+
+ /* input caps */
+ if (!gst_video_info_from_caps (&in_info, incaps))
+ goto invalid_caps;
+
+ if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) {
+ in_spec = COLOR_SPEC_RGB;
+ } else if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) {
+ if (in_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT709)
+ in_spec = COLOR_SPEC_YUV_BT709;
+ else
+ in_spec = COLOR_SPEC_YUV_BT470_6;
+ } else {
+ in_spec = COLOR_SPEC_GRAY;
+ }
+
+ /* output caps */
+ if (!gst_video_info_from_caps (&out_info, outcaps))
+ goto invalid_caps;
+
+ if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) {
+ out_spec = COLOR_SPEC_RGB;
+ } else if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) {
+ if (out_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT709)
+ out_spec = COLOR_SPEC_YUV_BT709;
+ else
+ out_spec = COLOR_SPEC_YUV_BT470_6;
+ } else {
+ out_spec = COLOR_SPEC_GRAY;
+ }
+
+ /* these must match */
+ if (in_info.width != out_info.width || in_info.height != out_info.height ||
+ in_info.fps_n != out_info.fps_n || in_info.fps_d != out_info.fps_d)
+ goto format_mismatch;
+
+ /* if present, these must match too */
+ if (in_info.par_n != out_info.par_n || in_info.par_d != out_info.par_d)
+ goto format_mismatch;
+
+ /* if present, these must match too */
+ if ((in_info.flags & GST_VIDEO_FLAG_INTERLACED) !=
+ (out_info.flags & GST_VIDEO_FLAG_INTERLACED))
+ goto format_mismatch;
+
+ space->from_info = in_info;
+ space->from_spec = in_spec;
+ space->to_info = out_info;
+ space->to_spec = out_spec;
+
+ interlaced = (in_info.flags & GST_VIDEO_FLAG_INTERLACED) != 0;
+
+ space->convert =
+ videoconvert_convert_new (GST_VIDEO_INFO_FORMAT (&out_info), out_spec,
+ GST_VIDEO_INFO_FORMAT (&in_info), in_spec, in_info.width, in_info.height);
+ if (space->convert == NULL)
+ goto no_convert;
+
+ videoconvert_convert_set_interlaced (space->convert, interlaced);
+
+ /* palette, only for from data */
+ if (GST_VIDEO_INFO_FORMAT (&space->from_info) ==
+ GST_VIDEO_FORMAT_RGB8_PALETTED
+ && GST_VIDEO_INFO_FORMAT (&space->to_info) ==
+ GST_VIDEO_FORMAT_RGB8_PALETTED) {
+ goto format_mismatch;
+ } else if (GST_VIDEO_INFO_FORMAT (&space->from_info) ==
+ GST_VIDEO_FORMAT_RGB8_PALETTED) {
+ GstBuffer *palette;
+ guint32 *data;
+
+ palette = gst_video_parse_caps_palette (incaps);
+
+ if (!palette || gst_buffer_get_size (palette) < 256 * 4) {
+ if (palette)
+ gst_buffer_unref (palette);
+ goto invalid_palette;
+ }
+
+ data = gst_buffer_map (palette, NULL, NULL, GST_MAP_READ);
+ videoconvert_convert_set_palette (space->convert, data);
+ gst_buffer_unmap (palette, data, -1);
+
+ gst_buffer_unref (palette);
+ } else if (GST_VIDEO_INFO_FORMAT (&space->to_info) ==
+ GST_VIDEO_FORMAT_RGB8_PALETTED) {
+ const guint32 *palette;
+ GstBuffer *p_buf;
+
+ palette = videoconvert_convert_get_palette (space->convert);
+
+ p_buf = gst_buffer_new_and_alloc (256 * 4);
+ gst_buffer_fill (p_buf, 0, palette, 256 * 4);
+ gst_caps_set_simple (outcaps, "palette_data", GST_TYPE_BUFFER, p_buf, NULL);
+ gst_buffer_unref (p_buf);
+ }
+
+ GST_DEBUG ("reconfigured %d %d", GST_VIDEO_INFO_FORMAT (&space->from_info),
+ GST_VIDEO_INFO_FORMAT (&space->to_info));
+
+ space->negotiated = TRUE;
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_caps:
+ {
+ GST_ERROR_OBJECT (space, "invalid caps");
+ goto error_done;
+ }
+format_mismatch:
+ {
+ GST_ERROR_OBJECT (space, "input and output formats do not match");
+ goto error_done;
+ }
+no_convert:
+ {
+ GST_ERROR_OBJECT (space, "could not create converter");
+ goto error_done;
+ }
+invalid_palette:
+ {
+ GST_ERROR_OBJECT (space, "invalid palette");
+ goto error_done;
+ }
+error_done:
+ {
+ space->negotiated = FALSE;
+ return FALSE;
+ }
+}
+
+#define gst_video_convert_parent_class parent_class
+G_DEFINE_TYPE (GstVideoConvert, gst_video_convert, GST_TYPE_VIDEO_FILTER);
+
+static void
+gst_video_convert_finalize (GObject * obj)
+{
+ GstVideoConvert *space = GST_VIDEO_CONVERT (obj);
+
+ if (space->convert) {
+ videoconvert_convert_free (space->convert);
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_video_convert_class_init (GstVideoConvertClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+ GstBaseTransformClass *gstbasetransform_class =
+ (GstBaseTransformClass *) klass;
+
+ gobject_class->set_property = gst_video_convert_set_property;
+ gobject_class->get_property = gst_video_convert_get_property;
+ gobject_class->finalize = gst_video_convert_finalize;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_video_convert_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_video_convert_sink_template));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ " Colorspace converter", "Filter/Converter/Video",
+ "Converts video from one colorspace to another",
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ gstbasetransform_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_video_convert_transform_caps);
+ gstbasetransform_class->set_caps =
+ GST_DEBUG_FUNCPTR (gst_video_convert_set_caps);
+ gstbasetransform_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_video_convert_get_unit_size);
+ gstbasetransform_class->decide_allocation =
+ GST_DEBUG_FUNCPTR (gst_video_convert_decide_allocation);
+ gstbasetransform_class->transform =
+ GST_DEBUG_FUNCPTR (gst_video_convert_transform);
+
+ gstbasetransform_class->passthrough_on_same_caps = TRUE;
+
+ g_object_class_install_property (gobject_class, PROP_DITHER,
+ g_param_spec_enum ("dither", "Dither", "Apply dithering while converting",
+ dither_method_get_type (), DITHER_NONE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_video_convert_init (GstVideoConvert * space)
+{
+ space->negotiated = FALSE;
+}
+
+void
+gst_video_convert_set_property (GObject * object, guint property_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstVideoConvert *csp;
+
+ csp = GST_VIDEO_CONVERT (object);
+
+ switch (property_id) {
+ case PROP_DITHER:
+ csp->dither = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+void
+gst_video_convert_get_property (GObject * object, guint property_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstVideoConvert *csp;
+
+ csp = GST_VIDEO_CONVERT (object);
+
+ switch (property_id) {
+ case PROP_DITHER:
+ g_value_set_enum (value, csp->dither);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_video_convert_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ gsize * size)
+{
+ gboolean ret = TRUE;
+ GstVideoInfo info;
+
+ g_assert (size);
+
+ ret = gst_video_info_from_caps (&info, caps);
+ if (ret) {
+ *size = info.size;
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
+ GstBuffer * outbuf)
+{
+ GstVideoConvert *space;
+ GstVideoFrame in_frame, out_frame;
+
+ space = GST_VIDEO_CONVERT_CAST (btrans);
+
+ GST_DEBUG ("from %s -> to %s", GST_VIDEO_INFO_NAME (&space->from_info),
+ GST_VIDEO_INFO_NAME (&space->to_info));
+
+ if (G_UNLIKELY (!space->negotiated))
+ goto unknown_format;
+
+ videoconvert_convert_set_dither (space->convert, space->dither);
+
+ if (!gst_video_frame_map (&in_frame, &space->from_info, inbuf, GST_MAP_READ))
+ goto invalid_buffer;
+
+ if (!gst_video_frame_map (&out_frame, &space->to_info, outbuf, GST_MAP_WRITE))
+ goto invalid_buffer;
+
+ videoconvert_convert_convert (space->convert, &out_frame, &in_frame);
+
+ gst_video_frame_unmap (&out_frame);
+ gst_video_frame_unmap (&in_frame);
+
+ /* baseclass copies timestamps */
+ GST_DEBUG ("from %s -> to %s done", GST_VIDEO_INFO_NAME (&space->from_info),
+ GST_VIDEO_INFO_NAME (&space->to_info));
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+unknown_format:
+ {
+ GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL),
+ ("attempting to convert colorspaces between unknown formats"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+invalid_buffer:
+ {
+ GST_ELEMENT_WARNING (space, CORE, NOT_IMPLEMENTED, (NULL),
+ ("invalid video buffer received"));
+ return GST_FLOW_OK;
+ }
+#if 0
+not_supported:
+ {
+ GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL),
+ ("cannot convert between formats"));
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+#endif
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (videoconvert_debug, "videoconvert", 0,
+ "Colorspace Converter");
+ GST_DEBUG_CATEGORY_GET (videoconvert_performance, "GST_PERFORMANCE");
+
+ return gst_element_register (plugin, "videoconvert",
+ GST_RANK_NONE, GST_TYPE_VIDEO_CONVERT);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "videoconvert", "Colorspace conversion", plugin_init, VERSION, "LGPL", "",
+ "")
diff --git a/gst/videoconvert/gstvideoconvert.h b/gst/videoconvert/gstvideoconvert.h
new file mode 100644
index 0000000..abd8270
--- /dev/null
+++ b/gst/videoconvert/gstvideoconvert.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * This file:
+ * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VIDEOCONVERT_H__
+#define __GST_VIDEOCONVERT_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/gstvideofilter.h>
+#include "videoconvert.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_CONVERT (gst_video_convert_get_type())
+#define GST_VIDEO_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_CONVERT,GstVideoConvert))
+#define GST_VIDEO_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_CONVERT,GstVideoConvertClass))
+#define GST_IS_VIDEO_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_CONVERT))
+#define GST_IS_VIDEO_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_CONVERT))
+#define GST_VIDEO_CONVERT_CAST(obj) ((GstVideoConvert *)(obj))
+
+typedef struct _GstVideoConvert GstVideoConvert;
+typedef struct _GstVideoConvertClass GstVideoConvertClass;
+
+/**
+ * GstVideoConvert:
+ *
+ * Opaque object data structure.
+ */
+struct _GstVideoConvert {
+ GstVideoFilter element;
+
+ GstVideoInfo from_info;
+ GstVideoInfo to_info;
+ gboolean negotiated;
+
+ ColorSpaceColorSpec from_spec;
+ ColorSpaceColorSpec to_spec;
+
+ VideoConvert *convert;
+ gboolean dither;
+};
+
+struct _GstVideoConvertClass
+{
+ GstVideoFilterClass parent_class;
+};
+
+G_END_DECLS
+
+#endif /* __GST_VIDEOCONVERT_H__ */
diff --git a/gst/videoconvert/gstvideoconvertorc-dist.c b/gst/videoconvert/gstvideoconvertorc-dist.c
new file mode 100644
index 0000000..6645465
--- /dev/null
+++ b/gst/videoconvert/gstvideoconvertorc-dist.c
@@ -0,0 +1,19395 @@
+
+/* autogenerated from gstvideoconvertorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n);
+void orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1,
+ int p2, int n);
+void orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1,
+ int p2, int n);
+void orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int p4, int n);
+void orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int n);
+void orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5,
+ int n);
+void orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5,
+ int n);
+void orc_pack_123x (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n);
+void orc_pack_x123 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n);
+void cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1,
+ int p2, int n);
+void cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
+ const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
+ const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
+ const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3,
+ guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m);
+void cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m);
+void cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3,
+ guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_convert_I420_BGRA_avg (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 cogorc_getline_I420 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_getline_A420 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, 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 */
+
+
+
+/* cogorc_memcpy_2d */
+#ifdef DISABLE_ORC
+void
+cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr4[i];
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_memcpy_2d (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 var32;
+ orc_int8 var33;
+
+ 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr4[i];
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+ }
+
+}
+
+void
+cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_memcpy_2d");
+ orc_program_set_backup_function (p, _backup_cogorc_memcpy_2d);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+
+ orc_program_append_2 (p, "copyb", 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;
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_downsample_horiz_cosite_1tap */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[0];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_downsample_horiz_cosite_1tap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[0];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_downsample_horiz_cosite_1tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_downsample_horiz_cosite_1tap);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+
+ orc_program_append_2 (p, "select0wb", 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
+
+
+/* cogorc_downsample_horiz_cosite_3tap */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_horiz_cosite_3tap (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_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 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_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+
+ /* 9: loadpw */
+ var40.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+ /* 13: loadpw */
+ var41.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var38 = ptr4[i];
+ /* 1: copyw */
+ var43.i = var38.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var44 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var45 = _src.x2[1];
+ }
+ /* 4: loadw */
+ var39 = ptr5[i];
+ /* 5: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var46 = _src.x2[0];
+ }
+ /* 6: convubw */
+ var47.i = (orc_uint8) var44;
+ /* 7: convubw */
+ var48.i = (orc_uint8) var45;
+ /* 8: convubw */
+ var49.i = (orc_uint8) var46;
+ /* 10: mullw */
+ var50.i = (var48.i * var40.i) & 0xffff;
+ /* 11: addw */
+ var51.i = var47.i + var49.i;
+ /* 12: addw */
+ var52.i = var51.i + var50.i;
+ /* 14: addw */
+ var53.i = var52.i + var41.i;
+ /* 15: shrsw */
+ var54.i = var53.i >> 2;
+ /* 16: convsuswb */
+ var42 = ORC_CLAMP_UB (var54.i);
+ /* 17: storeb */
+ ptr0[i] = var42;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_downsample_horiz_cosite_3tap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 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_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+
+ /* 9: loadpw */
+ var40.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+ /* 13: loadpw */
+ var41.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var38 = ptr4[i];
+ /* 1: copyw */
+ var43.i = var38.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var44 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var45 = _src.x2[1];
+ }
+ /* 4: loadw */
+ var39 = ptr5[i];
+ /* 5: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var46 = _src.x2[0];
+ }
+ /* 6: convubw */
+ var47.i = (orc_uint8) var44;
+ /* 7: convubw */
+ var48.i = (orc_uint8) var45;
+ /* 8: convubw */
+ var49.i = (orc_uint8) var46;
+ /* 10: mullw */
+ var50.i = (var48.i * var40.i) & 0xffff;
+ /* 11: addw */
+ var51.i = var47.i + var49.i;
+ /* 12: addw */
+ var52.i = var51.i + var50.i;
+ /* 14: addw */
+ var53.i = var52.i + var41.i;
+ /* 15: shrsw */
+ var54.i = var53.i >> 2;
+ /* 16: convsuswb */
+ var42 = ORC_CLAMP_UB (var54.i);
+ /* 17: storeb */
+ ptr0[i] = var42;
+ }
+
+}
+
+void
+cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_downsample_horiz_cosite_3tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_downsample_horiz_cosite_3tap);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_constant (p, 4, 0x00000002, "c1");
+ 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, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_T4, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T5, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T4,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_downsample_420_jpeg */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_420_jpeg (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_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var40.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.i;
+ var41 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.i;
+ var42 = _src.x2[1];
+ }
+ /* 4: avgub */
+ var43 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr5[i];
+ /* 6: copyw */
+ var44.i = var38.i;
+ /* 7: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var45 = _src.x2[0];
+ }
+ /* 8: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var46 = _src.x2[1];
+ }
+ /* 9: avgub */
+ var47 = ((orc_uint8) var45 + (orc_uint8) var46 + 1) >> 1;
+ /* 10: avgub */
+ var39 = ((orc_uint8) var43 + (orc_uint8) var47 + 1) >> 1;
+ /* 11: storeb */
+ ptr0[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_downsample_420_jpeg (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var40.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.i;
+ var41 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.i;
+ var42 = _src.x2[1];
+ }
+ /* 4: avgub */
+ var43 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr5[i];
+ /* 6: copyw */
+ var44.i = var38.i;
+ /* 7: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var45 = _src.x2[0];
+ }
+ /* 8: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var46 = _src.x2[1];
+ }
+ /* 9: avgub */
+ var47 = ((orc_uint8) var45 + (orc_uint8) var46 + 1) >> 1;
+ /* 10: avgub */
+ var39 = ((orc_uint8) var43 + (orc_uint8) var47 + 1) >> 1;
+ /* 11: storeb */
+ ptr0[i] = var39;
+ }
+
+}
+
+void
+cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_downsample_420_jpeg");
+ orc_program_set_backup_function (p, _backup_cogorc_downsample_420_jpeg);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_temporary (p, 2, "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_append_2 (p, "copyw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T2, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T4, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T4,
+ 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
+
+
+/* cogorc_downsample_vert_halfsite_2tap */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_vert_halfsite_2tap (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_cogorc_downsample_vert_halfsite_2tap (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
+cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_downsample_vert_halfsite_2tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_downsample_vert_halfsite_2tap);
+ 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
+
+
+/* cogorc_downsample_vert_cosite_3tap */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_vert_cosite_3tap (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_union16 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_union16 var47;
+ orc_union16 var48;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 6: loadpw */
+ var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+ /* 10: loadpw */
+ var39.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var41.i = (orc_uint8) var35;
+ /* 2: loadb */
+ var36 = ptr5[i];
+ /* 3: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 4: loadb */
+ var37 = ptr6[i];
+ /* 5: convubw */
+ var43.i = (orc_uint8) var37;
+ /* 7: mullw */
+ var44.i = (var42.i * var38.i) & 0xffff;
+ /* 8: addw */
+ var45.i = var41.i + var43.i;
+ /* 9: addw */
+ var46.i = var45.i + var44.i;
+ /* 11: addw */
+ var47.i = var46.i + var39.i;
+ /* 12: shrsw */
+ var48.i = var47.i >> 2;
+ /* 13: convsuswb */
+ var40 = ORC_CLAMP_UB (var48.i);
+ /* 14: storeb */
+ ptr0[i] = var40;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_downsample_vert_cosite_3tap (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_union16 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_union16 var47;
+ orc_union16 var48;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 6: loadpw */
+ var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+ /* 10: loadpw */
+ var39.i = (int) 0x00000002; /* 2 or 9.88131e-324f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var41.i = (orc_uint8) var35;
+ /* 2: loadb */
+ var36 = ptr5[i];
+ /* 3: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 4: loadb */
+ var37 = ptr6[i];
+ /* 5: convubw */
+ var43.i = (orc_uint8) var37;
+ /* 7: mullw */
+ var44.i = (var42.i * var38.i) & 0xffff;
+ /* 8: addw */
+ var45.i = var41.i + var43.i;
+ /* 9: addw */
+ var46.i = var45.i + var44.i;
+ /* 11: addw */
+ var47.i = var46.i + var39.i;
+ /* 12: shrsw */
+ var48.i = var47.i >> 2;
+ /* 13: convsuswb */
+ var40 = ORC_CLAMP_UB (var48.i);
+ /* 14: storeb */
+ ptr0[i] = var40;
+ }
+
+}
+
+void
+cogorc_downsample_vert_cosite_3tap (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 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, "cogorc_downsample_vert_cosite_3tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_downsample_vert_cosite_3tap);
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+ 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_T2,
+ 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
+
+
+/* cogorc_downsample_vert_halfsite_4tap */
+#ifdef DISABLE_ORC
+void
+cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, 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 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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;
+
+ /* 9: loadpw */
+ var40.i = (int) 0x0000001a; /* 26 or 1.28457e-322f */
+ /* 12: loadpw */
+ var41.i = (int) 0x00000006; /* 6 or 2.96439e-323f */
+ /* 15: loadpw */
+ var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 2: loadb */
+ var37 = ptr5[i];
+ /* 3: convubw */
+ var45.i = (orc_uint8) var37;
+ /* 4: loadb */
+ var38 = ptr6[i];
+ /* 5: convubw */
+ var46.i = (orc_uint8) var38;
+ /* 6: loadb */
+ var39 = ptr7[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 8: addw */
+ var48.i = var45.i + var46.i;
+ /* 10: mullw */
+ var49.i = (var48.i * var40.i) & 0xffff;
+ /* 11: addw */
+ var50.i = var44.i + var47.i;
+ /* 13: mullw */
+ var51.i = (var50.i * var41.i) & 0xffff;
+ /* 14: addw */
+ var52.i = var49.i + var51.i;
+ /* 16: addw */
+ var53.i = var52.i + var42.i;
+ /* 17: shrsw */
+ var54.i = var53.i >> 6;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var54.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_downsample_vert_halfsite_4tap (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 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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];
+
+ /* 9: loadpw */
+ var40.i = (int) 0x0000001a; /* 26 or 1.28457e-322f */
+ /* 12: loadpw */
+ var41.i = (int) 0x00000006; /* 6 or 2.96439e-323f */
+ /* 15: loadpw */
+ var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 2: loadb */
+ var37 = ptr5[i];
+ /* 3: convubw */
+ var45.i = (orc_uint8) var37;
+ /* 4: loadb */
+ var38 = ptr6[i];
+ /* 5: convubw */
+ var46.i = (orc_uint8) var38;
+ /* 6: loadb */
+ var39 = ptr7[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 8: addw */
+ var48.i = var45.i + var46.i;
+ /* 10: mullw */
+ var49.i = (var48.i * var40.i) & 0xffff;
+ /* 11: addw */
+ var50.i = var44.i + var47.i;
+ /* 13: mullw */
+ var51.i = (var50.i * var41.i) & 0xffff;
+ /* 14: addw */
+ var52.i = var49.i + var51.i;
+ /* 16: addw */
+ var53.i = var52.i + var42.i;
+ /* 17: shrsw */
+ var54.i = var53.i >> 6;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var54.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+void
+cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_downsample_vert_halfsite_4tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_downsample_vert_halfsite_4tap);
+ 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, 0x0000001a, "c1");
+ orc_program_add_constant (p, 4, 0x00000006, "c2");
+ orc_program_add_constant (p, 4, 0x00000020, "c3");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+
+ 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, "convubw", 0, ORC_VAR_T4, 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 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_C3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_upsample_horiz_cosite_1tap */
+#ifdef DISABLE_ORC
+void
+cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: copyb */
+ var35 = var33;
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35;
+ _dest.x2[1] = var35;
+ var34.i = _dest.i;
+ }
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_upsample_horiz_cosite_1tap (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: copyb */
+ var35 = var33;
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35;
+ _dest.x2[1] = var35;
+ var34.i = _dest.i;
+ }
+ /* 3: storew */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_upsample_horiz_cosite_1tap");
+ orc_program_set_backup_function (p,
+ _backup_cogorc_upsample_horiz_cosite_1tap);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_temporary (p, 1, "t1");
+
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T1,
+ 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
+
+
+/* cogorc_upsample_horiz_cosite */
+#ifdef DISABLE_ORC
+void
+cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: copyb */
+ var37 = var34;
+ /* 2: loadb */
+ var35 = ptr5[i];
+ /* 3: avgub */
+ var38 = ((orc_uint8) var37 + (orc_uint8) var35 + 1) >> 1;
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37;
+ _dest.x2[1] = var38;
+ var36.i = _dest.i;
+ }
+ /* 5: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_upsample_horiz_cosite (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: copyb */
+ var37 = var34;
+ /* 2: loadb */
+ var35 = ptr5[i];
+ /* 3: avgub */
+ var38 = ((orc_uint8) var37 + (orc_uint8) var35 + 1) >> 1;
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37;
+ _dest.x2[1] = var38;
+ var36.i = _dest.i;
+ }
+ /* 5: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_upsample_horiz_cosite");
+ orc_program_set_backup_function (p, _backup_cogorc_upsample_horiz_cosite);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_temporary (p, 1, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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
+
+
+/* cogorc_upsample_vert_avgub */
+#ifdef DISABLE_ORC
+void
+cogorc_upsample_vert_avgub (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_cogorc_upsample_vert_avgub (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
+cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_upsample_vert_avgub");
+ orc_program_set_backup_function (p, _backup_cogorc_upsample_vert_avgub);
+ 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
+
+
+/* orc_unpack_yuyv_y */
+#ifdef DISABLE_ORC
+void
+orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[0];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_yuyv_y (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[0];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_yuyv_y");
+ orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_y);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+
+ orc_program_append_2 (p, "select0wb", 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_unpack_yuyv_u */
+#ifdef DISABLE_ORC
+void
+orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_yuyv_u (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_yuyv_u");
+ orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_u);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_unpack_yuyv_v */
+#ifdef DISABLE_ORC
+void
+orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select1lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[1];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_yuyv_v (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select1lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[1];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_yuyv_v");
+ orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_v);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "select1lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_pack_yuyv */
+#ifdef DISABLE_ORC
+void
+orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var41.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var42 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var43 = _src.x2[1];
+ }
+ /* 4: loadb */
+ var38 = ptr5[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var42;
+ _dest.x2[1] = var38;
+ var44.i = _dest.i;
+ }
+ /* 6: loadb */
+ var39 = ptr6[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43;
+ _dest.x2[1] = var39;
+ var45.i = _dest.i;
+ }
+ /* 8: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.i;
+ _dest.x2[1] = var45.i;
+ var40.i = _dest.i;
+ }
+ /* 9: storel */
+ ptr0[i] = var40;
+ }
+
+}
+
+#else
+static void
+_backup_orc_pack_yuyv (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var41.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var42 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var43 = _src.x2[1];
+ }
+ /* 4: loadb */
+ var38 = ptr5[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var42;
+ _dest.x2[1] = var38;
+ var44.i = _dest.i;
+ }
+ /* 6: loadb */
+ var39 = ptr6[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43;
+ _dest.x2[1] = var39;
+ var45.i = _dest.i;
+ }
+ /* 8: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.i;
+ _dest.x2[1] = var45.i;
+ var40.i = _dest.i;
+ }
+ /* 9: storel */
+ ptr0[i] = var40;
+ }
+
+}
+
+void
+orc_pack_yuyv (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 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_pack_yuyv");
+ orc_program_set_backup_function (p, _backup_orc_pack_yuyv);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_temporary (p, 1, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_T5, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T5,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T5,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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
+
+
+/* orc_unpack_uyvy_y */
+#ifdef DISABLE_ORC
+void
+orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[1];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_uyvy_y (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var32 = ptr4[i];
+ /* 1: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var32.i;
+ var33 = _src.x2[1];
+ }
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_uyvy_y");
+ orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_y);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+
+ orc_program_append_2 (p, "select1wb", 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_unpack_uyvy_u */
+#ifdef DISABLE_ORC
+void
+orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_uyvy_u (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_uyvy_u");
+ orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_u);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_unpack_uyvy_v */
+#ifdef DISABLE_ORC
+void
+orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select1lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[1];
+ }
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_unpack_uyvy_v (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select1lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[1];
+ }
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_unpack_uyvy_v");
+ orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_v);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "select1lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_pack_uyvy */
+#ifdef DISABLE_ORC
+void
+orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var41.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var42 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var43 = _src.x2[1];
+ }
+ /* 4: loadb */
+ var38 = ptr5[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38;
+ _dest.x2[1] = var42;
+ var44.i = _dest.i;
+ }
+ /* 6: loadb */
+ var39 = ptr6[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var43;
+ var45.i = _dest.i;
+ }
+ /* 8: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.i;
+ _dest.x2[1] = var45.i;
+ var40.i = _dest.i;
+ }
+ /* 9: storel */
+ ptr0[i] = var40;
+ }
+
+}
+
+#else
+static void
+_backup_orc_pack_uyvy (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var37 = ptr4[i];
+ /* 1: copyw */
+ var41.i = var37.i;
+ /* 2: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var42 = _src.x2[0];
+ }
+ /* 3: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.i;
+ var43 = _src.x2[1];
+ }
+ /* 4: loadb */
+ var38 = ptr5[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38;
+ _dest.x2[1] = var42;
+ var44.i = _dest.i;
+ }
+ /* 6: loadb */
+ var39 = ptr6[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var43;
+ var45.i = _dest.i;
+ }
+ /* 8: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.i;
+ _dest.x2[1] = var45.i;
+ var40.i = _dest.i;
+ }
+ /* 9: storel */
+ ptr0[i] = var40;
+ }
+
+}
+
+void
+orc_pack_uyvy (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 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_pack_uyvy");
+ orc_program_set_backup_function (p, _backup_orc_pack_uyvy);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_temporary (p, 1, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_T5, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T5,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T5,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T3, ORC_VAR_S2, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T4, ORC_VAR_S3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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
+
+
+/* orc_matrix2_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+
+ /* 2: loadpw */
+ var35.i = p1;
+ /* 6: loadpw */
+ var37.i = p2;
+ /* 9: loadpw */
+ var38.i = p3;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var40.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var41.i = (var40.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var43.i = (var42.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var44.i = var41.i + var43.i;
+ /* 10: addw */
+ var45.i = var44.i + var38.i;
+ /* 11: shrsw */
+ var46.i = var45.i >> 6;
+ /* 12: convsuswb */
+ var39 = ORC_CLAMP_UB (var46.i);
+ /* 13: storeb */
+ ptr0[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix2_u8 (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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+
+ /* 2: loadpw */
+ var35.i = ex->params[24];
+ /* 6: loadpw */
+ var37.i = ex->params[25];
+ /* 9: loadpw */
+ var38.i = ex->params[26];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var40.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var41.i = (var40.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var43.i = (var42.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var44.i = var41.i + var43.i;
+ /* 10: addw */
+ var45.i = var44.i + var38.i;
+ /* 11: shrsw */
+ var46.i = var45.i >> 6;
+ /* 12: convsuswb */
+ var39 = ORC_CLAMP_UB (var46.i);
+ /* 13: storeb */
+ ptr0[i] = var39;
+ }
+
+}
+
+void
+orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix2_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix2_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_constant (p, 4, 0x00000006, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_parameter (p, 2, "p3");
+ 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_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ 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_T1, ORC_VAR_T1, ORC_VAR_P3,
+ 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix2_11_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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;
+
+ /* 2: loadpw */
+ var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var38.i = p1;
+ /* 8: loadpw */
+ var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var41.i = p2;
+ /* 13: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 3: subw */
+ var45.i = var44.i - var37.i;
+ /* 5: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 6: loadb */
+ var39 = ptr5[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 9: subw */
+ var48.i = var47.i - var40.i;
+ /* 11: mullw */
+ var49.i = (var48.i * var41.i) & 0xffff;
+ /* 12: addw */
+ var50.i = var46.i + var49.i;
+ /* 14: addw */
+ var51.i = var50.i + var42.i;
+ /* 15: shrsw */
+ var52.i = var51.i >> 8;
+ /* 16: addw */
+ var53.i = var52.i + var45.i;
+ /* 17: addw */
+ var54.i = var53.i + var48.i;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var54.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix2_11_u8 (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 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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];
+
+ /* 2: loadpw */
+ var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var38.i = ex->params[24];
+ /* 8: loadpw */
+ var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var41.i = ex->params[25];
+ /* 13: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 3: subw */
+ var45.i = var44.i - var37.i;
+ /* 5: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 6: loadb */
+ var39 = ptr5[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 9: subw */
+ var48.i = var47.i - var40.i;
+ /* 11: mullw */
+ var49.i = (var48.i * var41.i) & 0xffff;
+ /* 12: addw */
+ var50.i = var46.i + var49.i;
+ /* 14: addw */
+ var51.i = var50.i + var42.i;
+ /* 15: shrsw */
+ var52.i = var51.i >> 8;
+ /* 16: addw */
+ var53.i = var52.i + var45.i;
+ /* 17: addw */
+ var54.i = var53.i + var48.i;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var54.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+void
+orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix2_11_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix2_11_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_constant (p, 4, 0x00000010, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x00000008, "c3");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_P2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3,
+ 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix2_12_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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;
+ orc_union16 var55;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+
+ /* 2: loadpw */
+ var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var38.i = p1;
+ /* 8: loadpw */
+ var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var41.i = p2;
+ /* 13: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 3: subw */
+ var45.i = var44.i - var37.i;
+ /* 5: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 6: loadb */
+ var39 = ptr5[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 9: subw */
+ var48.i = var47.i - var40.i;
+ /* 11: mullw */
+ var49.i = (var48.i * var41.i) & 0xffff;
+ /* 12: addw */
+ var50.i = var46.i + var49.i;
+ /* 14: addw */
+ var51.i = var50.i + var42.i;
+ /* 15: shrsw */
+ var52.i = var51.i >> 8;
+ /* 16: addw */
+ var53.i = var52.i + var45.i;
+ /* 17: addw */
+ var54.i = var53.i + var48.i;
+ /* 18: addw */
+ var55.i = var54.i + var48.i;
+ /* 19: convsuswb */
+ var43 = ORC_CLAMP_UB (var55.i);
+ /* 20: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix2_12_u8 (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 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_int8 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;
+ orc_union16 var55;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+
+ /* 2: loadpw */
+ var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var38.i = ex->params[24];
+ /* 8: loadpw */
+ var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var41.i = ex->params[25];
+ /* 13: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr4[i];
+ /* 1: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 3: subw */
+ var45.i = var44.i - var37.i;
+ /* 5: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 6: loadb */
+ var39 = ptr5[i];
+ /* 7: convubw */
+ var47.i = (orc_uint8) var39;
+ /* 9: subw */
+ var48.i = var47.i - var40.i;
+ /* 11: mullw */
+ var49.i = (var48.i * var41.i) & 0xffff;
+ /* 12: addw */
+ var50.i = var46.i + var49.i;
+ /* 14: addw */
+ var51.i = var50.i + var42.i;
+ /* 15: shrsw */
+ var52.i = var51.i >> 8;
+ /* 16: addw */
+ var53.i = var52.i + var45.i;
+ /* 17: addw */
+ var54.i = var53.i + var48.i;
+ /* 18: addw */
+ var55.i = var54.i + var48.i;
+ /* 19: convsuswb */
+ var43 = ORC_CLAMP_UB (var55.i);
+ /* 20: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+void
+orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix2_12_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix2_12_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_constant (p, 4, 0x00000010, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x00000008, "c3");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_P2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3,
+ 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix3_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int p4, 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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 2: loadpw */
+ var35.i = p1;
+ /* 6: loadpw */
+ var37.i = p2;
+ /* 11: loadpw */
+ var39.i = p3;
+ /* 14: loadpw */
+ var40.i = p4;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var42.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var43.i = (var42.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var45.i = (var44.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var46.i = var43.i + var45.i;
+ /* 9: loadb */
+ var38 = ptr6[i];
+ /* 10: convubw */
+ var47.i = (orc_uint8) var38;
+ /* 12: mullw */
+ var48.i = (var47.i * var39.i) & 0xffff;
+ /* 13: addw */
+ var49.i = var46.i + var48.i;
+ /* 15: addw */
+ var50.i = var49.i + var40.i;
+ /* 16: shrsw */
+ var51.i = var50.i >> 6;
+ /* 17: convsuswb */
+ var41 = ORC_CLAMP_UB (var51.i);
+ /* 18: storeb */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix3_u8 (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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 2: loadpw */
+ var35.i = ex->params[24];
+ /* 6: loadpw */
+ var37.i = ex->params[25];
+ /* 11: loadpw */
+ var39.i = ex->params[26];
+ /* 14: loadpw */
+ var40.i = ex->params[27];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var42.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var43.i = (var42.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var45.i = (var44.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var46.i = var43.i + var45.i;
+ /* 9: loadb */
+ var38 = ptr6[i];
+ /* 10: convubw */
+ var47.i = (orc_uint8) var38;
+ /* 12: mullw */
+ var48.i = (var47.i * var39.i) & 0xffff;
+ /* 13: addw */
+ var49.i = var46.i + var48.i;
+ /* 15: addw */
+ var50.i = var49.i + var40.i;
+ /* 16: shrsw */
+ var51.i = var50.i >> 6;
+ /* 17: convsuswb */
+ var41 = ORC_CLAMP_UB (var51.i);
+ /* 18: storeb */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int p4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix3_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix3_u8);
+ 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, 0x00000006, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_parameter (p, 2, "p3");
+ orc_program_add_parameter (p, 2, "p4");
+ 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_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ 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_S3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3,
+ 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_T1, ORC_VAR_T1, ORC_VAR_P4,
+ 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;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+ ex->params[ORC_VAR_P4] = p4;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix3_100_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, 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_union16 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_int8 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;
+ orc_union16 var55;
+ orc_union16 var56;
+ orc_union16 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 2: loadpw */
+ var36.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var37.i = p1;
+ /* 8: loadpw */
+ var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var40.i = p2;
+ /* 15: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 17: loadpw */
+ var43.i = p3;
+ /* 20: loadpw */
+ var44.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var46.i = (orc_uint8) var35;
+ /* 3: subw */
+ var47.i = var46.i - var36.i;
+ /* 5: mullw */
+ var48.i = (var47.i * var37.i) & 0xffff;
+ /* 6: loadb */
+ var38 = ptr5[i];
+ /* 7: convubw */
+ var49.i = (orc_uint8) var38;
+ /* 9: subw */
+ var50.i = var49.i - var39.i;
+ /* 11: mullw */
+ var51.i = (var50.i * var40.i) & 0xffff;
+ /* 12: addw */
+ var52.i = var48.i + var51.i;
+ /* 13: loadb */
+ var41 = ptr6[i];
+ /* 14: convubw */
+ var53.i = (orc_uint8) var41;
+ /* 16: subw */
+ var54.i = var53.i - var42.i;
+ /* 18: mullw */
+ var55.i = (var54.i * var43.i) & 0xffff;
+ /* 19: addw */
+ var56.i = var52.i + var55.i;
+ /* 21: addw */
+ var57.i = var56.i + var44.i;
+ /* 22: shrsw */
+ var58.i = var57.i >> 8;
+ /* 23: addw */
+ var59.i = var58.i + var47.i;
+ /* 24: convsuswb */
+ var45 = ORC_CLAMP_UB (var59.i);
+ /* 25: storeb */
+ ptr0[i] = var45;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix3_100_u8 (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_union16 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_int8 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;
+ orc_union16 var55;
+ orc_union16 var56;
+ orc_union16 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 2: loadpw */
+ var36.i = (int) 0x00000010; /* 16 or 7.90505e-323f */
+ /* 4: loadpw */
+ var37.i = ex->params[24];
+ /* 8: loadpw */
+ var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 10: loadpw */
+ var40.i = ex->params[25];
+ /* 15: loadpw */
+ var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 17: loadpw */
+ var43.i = ex->params[26];
+ /* 20: loadpw */
+ var44.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var46.i = (orc_uint8) var35;
+ /* 3: subw */
+ var47.i = var46.i - var36.i;
+ /* 5: mullw */
+ var48.i = (var47.i * var37.i) & 0xffff;
+ /* 6: loadb */
+ var38 = ptr5[i];
+ /* 7: convubw */
+ var49.i = (orc_uint8) var38;
+ /* 9: subw */
+ var50.i = var49.i - var39.i;
+ /* 11: mullw */
+ var51.i = (var50.i * var40.i) & 0xffff;
+ /* 12: addw */
+ var52.i = var48.i + var51.i;
+ /* 13: loadb */
+ var41 = ptr6[i];
+ /* 14: convubw */
+ var53.i = (orc_uint8) var41;
+ /* 16: subw */
+ var54.i = var53.i - var42.i;
+ /* 18: mullw */
+ var55.i = (var54.i * var43.i) & 0xffff;
+ /* 19: addw */
+ var56.i = var52.i + var55.i;
+ /* 21: addw */
+ var57.i = var56.i + var44.i;
+ /* 22: shrsw */
+ var58.i = var57.i >> 8;
+ /* 23: addw */
+ var59.i = var58.i + var47.i;
+ /* 24: convsuswb */
+ var45 = ORC_CLAMP_UB (var59.i);
+ /* 25: storeb */
+ ptr0[i] = var45;
+ }
+
+}
+
+void
+orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix3_100_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix3_100_u8);
+ 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, 0x00000010, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x00000008, "c3");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_parameter (p, 2, "p3");
+ 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, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3,
+ 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix3_100_offset_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5,
+ 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_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_int8 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;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 2: loadpw */
+ var36.i = p1;
+ /* 6: loadpw */
+ var38.i = p2;
+ /* 11: loadpw */
+ var40.i = p3;
+ /* 14: loadpw */
+ var41.i = p4;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var43.i = (orc_uint8) var35;
+ /* 3: mullw */
+ var44.i = (var43.i * var36.i) & 0xffff;
+ /* 4: loadb */
+ var37 = ptr5[i];
+ /* 5: convubw */
+ var45.i = (orc_uint8) var37;
+ /* 7: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 8: addw */
+ var47.i = var44.i + var46.i;
+ /* 9: loadb */
+ var39 = ptr6[i];
+ /* 10: convubw */
+ var48.i = (orc_uint8) var39;
+ /* 12: mullw */
+ var49.i = (var48.i * var40.i) & 0xffff;
+ /* 13: addw */
+ var50.i = var47.i + var49.i;
+ /* 15: addw */
+ var51.i = var50.i + var41.i;
+ /* 16: shrsw */
+ var52.i = var51.i >> p5;
+ /* 17: addw */
+ var53.i = var52.i + var43.i;
+ /* 18: convsuswb */
+ var42 = ORC_CLAMP_UB (var53.i);
+ /* 19: storeb */
+ ptr0[i] = var42;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix3_100_offset_u8 (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_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_int8 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;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 2: loadpw */
+ var36.i = ex->params[24];
+ /* 6: loadpw */
+ var38.i = ex->params[25];
+ /* 11: loadpw */
+ var40.i = ex->params[26];
+ /* 14: loadpw */
+ var41.i = ex->params[27];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr4[i];
+ /* 1: convubw */
+ var43.i = (orc_uint8) var35;
+ /* 3: mullw */
+ var44.i = (var43.i * var36.i) & 0xffff;
+ /* 4: loadb */
+ var37 = ptr5[i];
+ /* 5: convubw */
+ var45.i = (orc_uint8) var37;
+ /* 7: mullw */
+ var46.i = (var45.i * var38.i) & 0xffff;
+ /* 8: addw */
+ var47.i = var44.i + var46.i;
+ /* 9: loadb */
+ var39 = ptr6[i];
+ /* 10: convubw */
+ var48.i = (orc_uint8) var39;
+ /* 12: mullw */
+ var49.i = (var48.i * var40.i) & 0xffff;
+ /* 13: addw */
+ var50.i = var47.i + var49.i;
+ /* 15: addw */
+ var51.i = var50.i + var41.i;
+ /* 16: shrsw */
+ var52.i = var51.i >> ex->params[28];
+ /* 17: addw */
+ var53.i = var52.i + var43.i;
+ /* 18: convsuswb */
+ var42 = ORC_CLAMP_UB (var53.i);
+ /* 19: storeb */
+ ptr0[i] = var42;
+ }
+
+}
+
+void
+orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix3_100_offset_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix3_100_offset_u8);
+ 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_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_parameter (p, 2, "p3");
+ orc_program_add_parameter (p, 2, "p4");
+ orc_program_add_parameter (p, 2, "p5");
+ 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_T3, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_P1,
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ 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_S3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3,
+ 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_T1, ORC_VAR_T1, ORC_VAR_P4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P5,
+ 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, "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;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+ ex->params[ORC_VAR_P4] = p4;
+ ex->params[ORC_VAR_P5] = p5;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_matrix3_000_u8 */
+#ifdef DISABLE_ORC
+void
+orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int p4, int p5, 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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 2: loadpw */
+ var35.i = p1;
+ /* 6: loadpw */
+ var37.i = p2;
+ /* 11: loadpw */
+ var39.i = p3;
+ /* 14: loadpw */
+ var40.i = p4;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var42.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var43.i = (var42.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var45.i = (var44.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var46.i = var43.i + var45.i;
+ /* 9: loadb */
+ var38 = ptr6[i];
+ /* 10: convubw */
+ var47.i = (orc_uint8) var38;
+ /* 12: mullw */
+ var48.i = (var47.i * var39.i) & 0xffff;
+ /* 13: addw */
+ var49.i = var46.i + var48.i;
+ /* 15: addw */
+ var50.i = var49.i + var40.i;
+ /* 16: shrsw */
+ var51.i = var50.i >> p5;
+ /* 17: convwb */
+ var41 = var51.i;
+ /* 18: storeb */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_orc_matrix3_000_u8 (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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 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;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 2: loadpw */
+ var35.i = ex->params[24];
+ /* 6: loadpw */
+ var37.i = ex->params[25];
+ /* 11: loadpw */
+ var39.i = ex->params[26];
+ /* 14: loadpw */
+ var40.i = ex->params[27];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var42.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var43.i = (var42.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var44.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var45.i = (var44.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var46.i = var43.i + var45.i;
+ /* 9: loadb */
+ var38 = ptr6[i];
+ /* 10: convubw */
+ var47.i = (orc_uint8) var38;
+ /* 12: mullw */
+ var48.i = (var47.i * var39.i) & 0xffff;
+ /* 13: addw */
+ var49.i = var46.i + var48.i;
+ /* 15: addw */
+ var50.i = var49.i + var40.i;
+ /* 16: shrsw */
+ var51.i = var50.i >> ex->params[28];
+ /* 17: convwb */
+ var41 = var51.i;
+ /* 18: storeb */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int p2, int p3, int p4, int p5, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_matrix3_000_u8");
+ orc_program_set_backup_function (p, _backup_orc_matrix3_000_u8);
+ 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_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_parameter (p, 2, "p3");
+ orc_program_add_parameter (p, 2, "p4");
+ orc_program_add_parameter (p, 2, "p5");
+ 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_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ 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_S3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3,
+ 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_T1, ORC_VAR_T1, ORC_VAR_P4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convwb", 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;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+ ex->params[ORC_VAR_P4] = p4;
+ ex->params[ORC_VAR_P5] = p5;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_pack_123x */
+#ifdef DISABLE_ORC
+void
+orc_pack_123x (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 4: loadpb */
+ var37 = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: loadb */
+ var35 = ptr5[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr6[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var40.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_orc_pack_123x (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 4: loadpb */
+ var37 = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: loadb */
+ var35 = ptr5[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr6[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var40.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+orc_pack_123x (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_pack_123x");
+ orc_program_set_backup_function (p, _backup_orc_pack_123x);
+ orc_program_add_destination (p, 4, "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_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_pack_x123 */
+#ifdef DISABLE_ORC
+void
+orc_pack_x123 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 0: loadpb */
+ var34 = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: loadb */
+ var35 = ptr4[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr5[i];
+ /* 4: loadb */
+ var37 = ptr6[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var40.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_orc_pack_x123 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 0: loadpb */
+ var34 = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 1: loadb */
+ var35 = ptr4[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr5[i];
+ /* 4: loadb */
+ var37 = ptr6[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var40.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+orc_pack_x123 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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_pack_x123");
+ orc_program_set_backup_function (p, _backup_orc_pack_x123);
+ orc_program_add_destination (p, 4, "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_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_P1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_combine2_u8 */
+#ifdef DISABLE_ORC
+void
+cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+
+ /* 2: loadpw */
+ var35.i = p1;
+ /* 6: loadpw */
+ var37.i = p2;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var39.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var40.i = (var39.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var41.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var42.i = (var41.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var43.i = var40.i + var42.i;
+ /* 9: shruw */
+ var44.i = ((orc_uint16) var43.i) >> 8;
+ /* 10: convsuswb */
+ var38 = ORC_CLAMP_UB (var44.i);
+ /* 11: storeb */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_combine2_u8 (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 var34;
+ orc_union16 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+
+ /* 2: loadpw */
+ var35.i = ex->params[24];
+ /* 6: loadpw */
+ var37.i = ex->params[25];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr4[i];
+ /* 1: convubw */
+ var39.i = (orc_uint8) var34;
+ /* 3: mullw */
+ var40.i = (var39.i * var35.i) & 0xffff;
+ /* 4: loadb */
+ var36 = ptr5[i];
+ /* 5: convubw */
+ var41.i = (orc_uint8) var36;
+ /* 7: mullw */
+ var42.i = (var41.i * var37.i) & 0xffff;
+ /* 8: addw */
+ var43.i = var40.i + var42.i;
+ /* 9: shruw */
+ var44.i = ((orc_uint16) var43.i) >> 8;
+ /* 10: convsuswb */
+ var38 = ORC_CLAMP_UB (var44.i);
+ /* 11: storeb */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_combine2_u8");
+ orc_program_set_backup_function (p, _backup_cogorc_combine2_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_constant (p, 4, 0x00000008, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ 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_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
+ 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, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2,
+ 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, "shruw", 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_I420_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ const orc_int8 *ORC_RESTRICT ptr7;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr1 = (orc_union32 *) d2;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr6[i];
+ /* 1: loadb */
+ var34 = ptr7[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var39.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[0];
+ _dest.x2[1] = var35.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[1];
+ _dest.x2[1] = var35.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ /* 6: loadw */
+ var37 = ptr5[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 8: storel */
+ ptr1[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_I420_UYVY (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ const orc_int8 *ORC_RESTRICT ptr7;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr1 = (orc_union32 *) ex->arrays[1];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+ ptr7 = (orc_int8 *) ex->arrays[7];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr6[i];
+ /* 1: loadb */
+ var34 = ptr7[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var39.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[0];
+ _dest.x2[1] = var35.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[1];
+ _dest.x2[1] = var35.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ /* 6: loadw */
+ var37 = ptr5[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 8: storel */
+ ptr1[i] = var38;
+ }
+
+}
+
+void
+cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_I420_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_I420_UYVY);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_destination (p, 4, "d2");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_source (p, 1, "s4");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S3, ORC_VAR_S4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D2, ORC_VAR_T1, 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_D2] = d2;
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_I420_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ const orc_int8 *ORC_RESTRICT ptr7;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr1 = (orc_union32 *) d2;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr6[i];
+ /* 1: loadb */
+ var34 = ptr7[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var39.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ /* 6: loadw */
+ var37 = ptr5[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 8: storel */
+ ptr1[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_I420_YUY2 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ const orc_int8 *ORC_RESTRICT ptr7;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr1 = (orc_union32 *) ex->arrays[1];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+ ptr7 = (orc_int8 *) ex->arrays[7];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr6[i];
+ /* 1: loadb */
+ var34 = ptr7[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var39.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ /* 6: loadw */
+ var37 = ptr5[i];
+ /* 7: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 8: storel */
+ ptr1[i] = var38;
+ }
+
+}
+
+void
+cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_I420_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_I420_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_destination (p, 4, "d2");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_source (p, 1, "s4");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S3, ORC_VAR_S4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D2, ORC_VAR_S2, ORC_VAR_T1,
+ 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_D2] = d2;
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_I420_AYUV */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ 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 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union32 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr1 = (orc_union32 *) d2;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 8: loadpb */
+ var39 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var42 = ptr6[i >> 1];
+ /* 1: loadupdb */
+ var43 = ptr7[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var42;
+ _dest.x2[1] = var43;
+ var44.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var45.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var45.i;
+ _dest.x2[1] = var44.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ /* 9: loadb */
+ var40 = ptr5[i];
+ /* 10: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var46.i = _dest.i;
+ }
+ /* 11: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var46.i;
+ _dest.x2[1] = var44.i;
+ var41.i = _dest.i;
+ }
+ /* 12: storel */
+ ptr1[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_I420_AYUV (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ 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 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union32 var41;
+ orc_int8 var42;
+ orc_int8 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr1 = (orc_union32 *) ex->arrays[1];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+ ptr7 = (orc_int8 *) ex->arrays[7];
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 8: loadpb */
+ var39 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var42 = ptr6[i >> 1];
+ /* 1: loadupdb */
+ var43 = ptr7[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var42;
+ _dest.x2[1] = var43;
+ var44.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var45.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var45.i;
+ _dest.x2[1] = var44.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ /* 9: loadb */
+ var40 = ptr5[i];
+ /* 10: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var46.i = _dest.i;
+ }
+ /* 11: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var46.i;
+ _dest.x2[1] = var44.i;
+ var41.i = _dest.i;
+ }
+ /* 12: storel */
+ ptr1[i] = var41;
+ }
+
+}
+
+void
+cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_I420_AYUV");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_I420_AYUV);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_destination (p, 4, "d2");
+ 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, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_T1,
+ 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_D2] = d2;
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_YUY2_I420 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_union16 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr3 = (orc_int8 *) d4;
+ ptr4 = (orc_union32 *) s1;
+ ptr5 = (orc_union32 *) s2;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var40;
+ /* 3: loadl */
+ var36 = ptr5[i];
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var41.x2[0] = _src.x2[1];
+ var42.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var41.x2[1] = _src.x2[1];
+ var42.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr1[i] = var42;
+ /* 6: avgub */
+ var43.x2[0] = ((orc_uint8) var39.x2[0] + (orc_uint8) var41.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var39.x2[1] + (orc_uint8) var41.x2[1] + 1) >> 1;
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 8: storeb */
+ ptr3[i] = var37;
+ /* 9: storeb */
+ ptr2[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_YUY2_I420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_union16 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr3 = (orc_int8 *) ex->arrays[3];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+ ptr5 = (orc_union32 *) ex->arrays[5];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var40;
+ /* 3: loadl */
+ var36 = ptr5[i];
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var41.x2[0] = _src.x2[1];
+ var42.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var41.x2[1] = _src.x2[1];
+ var42.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr1[i] = var42;
+ /* 6: avgub */
+ var43.x2[0] = ((orc_uint8) var39.x2[0] + (orc_uint8) var41.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var39.x2[1] + (orc_uint8) var41.x2[1] + 1) >> 1;
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 8: storeb */
+ ptr3[i] = var37;
+ /* 9: storeb */
+ ptr2[i] = var38;
+ }
+
+}
+
+void
+cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_YUY2_I420");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_I420);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_destination (p, 1, "d4");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_source (p, 4, "s2");
+ 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, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D4, ORC_VAR_D3, ORC_VAR_T1,
+ 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_D4] = d4;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->arrays[ORC_VAR_S2] = (void *) s2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_UYVY_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+ orc_union32 var33;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr4[i];
+ /* 1: swapw */
+ var33.x2[0] = ORC_SWAP_W (var32.x2[0]);
+ var33.x2[1] = ORC_SWAP_W (var32.x2[1]);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_UYVY_YUY2 (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_union32 var32;
+ orc_union32 var33;
+
+ 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr4[i];
+ /* 1: swapw */
+ var33.x2[0] = ORC_SWAP_W (var32.x2[0]);
+ var33.x2[1] = ORC_SWAP_W (var32.x2[1]);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+ }
+
+}
+
+void
+cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_UYVY_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "swapw", 1, 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;
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_420_422 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr4[i];
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ /* 3: loadb */
+ var34 = ptr4[i];
+ /* 4: copyb */
+ var35 = var34;
+ /* 5: storeb */
+ ptr1[i] = var35;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_planar_chroma_420_422 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var32 = ptr4[i];
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ /* 3: loadb */
+ var34 = ptr4[i];
+ /* 4: copyb */
+ var35 = var34;
+ /* 5: storeb */
+ ptr1[i] = var35;
+ }
+ }
+
+}
+
+void
+cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_420_422");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_420_422);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_source (p, 1, "s1");
+
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_D2, 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;
+ ORC_EXECUTOR_M (ex) = m;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->params[ORC_VAR_D1] = d1_stride;
+ ex->arrays[ORC_VAR_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_420_444 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: splatbw */
+ var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff);
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: storew */
+ ptr1[i] = var34;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_planar_chroma_420_444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: splatbw */
+ var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff);
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: storew */
+ ptr1[i] = var34;
+ }
+ }
+
+}
+
+void
+cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1,
+ int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_420_444");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_420_444);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_422_444 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: splatbw */
+ var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff);
+ /* 2: storew */
+ ptr0[i] = var34;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_planar_chroma_422_444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_union16 var34;
+
+ 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr4[i];
+ /* 1: splatbw */
+ var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff);
+ /* 2: storew */
+ ptr0[i] = var34;
+ }
+ }
+
+}
+
+void
+cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_422_444");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_422_444);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_444_422 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var34.i;
+ var36 = _src.x2[1];
+ var37 = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+ /* 3: storeb */
+ ptr0[i] = var35;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_planar_chroma_444_422 (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_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+
+ 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var34.i;
+ var36 = _src.x2[1];
+ var37 = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+ /* 3: storeb */
+ ptr0[i] = var35;
+ }
+ }
+
+}
+
+void
+cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_444_422");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_444_422);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_temporary (p, 1, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_444_420 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr4[i];
+ /* 1: loadw */
+ var36 = ptr5[i];
+ /* 2: avgub */
+ var38.x2[0] =
+ ((orc_uint8) var35.x2[0] + (orc_uint8) var36.x2[0] + 1) >> 1;
+ var38.x2[1] =
+ ((orc_uint8) var35.x2[1] + (orc_uint8) var36.x2[1] + 1) >> 1;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var39 = _src.x2[1];
+ var40 = _src.x2[0];
+ }
+ /* 4: avgub */
+ var37 = ((orc_uint8) var39 + (orc_uint8) var40 + 1) >> 1;
+ /* 5: storeb */
+ ptr0[i] = var37;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_planar_chroma_444_420 (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_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr4[i];
+ /* 1: loadw */
+ var36 = ptr5[i];
+ /* 2: avgub */
+ var38.x2[0] =
+ ((orc_uint8) var35.x2[0] + (orc_uint8) var36.x2[0] + 1) >> 1;
+ var38.x2[1] =
+ ((orc_uint8) var35.x2[1] + (orc_uint8) var36.x2[1] + 1) >> 1;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var39 = _src.x2[1];
+ var40 = _src.x2[0];
+ }
+ /* 4: avgub */
+ var37 = ((orc_uint8) var39 + (orc_uint8) var40 + 1) >> 1;
+ /* 5: storeb */
+ ptr0[i] = var37;
+ }
+ }
+
+}
+
+void
+cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_444_420");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_444_420);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_planar_chroma_422_420 */
+#ifdef DISABLE_ORC
+void
+cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ int i;
+ int j;
+ 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;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+
+
+ 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_cogorc_planar_chroma_422_420 (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;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var32;
+ orc_int8 var33;
+ orc_int8 var34;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+
+
+ 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
+cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_planar_chroma_422_420");
+ orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_422_420);
+ 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;
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_YUY2_AYUV */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_YUY2_AYUV (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ 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);
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_YUY2_AYUV");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_AYUV);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 2, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_UYVY_AYUV */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_UYVY_AYUV (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ 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);
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_UYVY_AYUV");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_AYUV);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 2, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_YUY2_Y42B */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[0];
+ var37.x2[0] = _src.x2[1];
+ var34.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[1];
+ var37.x2[1] = _src.x2[1];
+ var34.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var37.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 4: storeb */
+ ptr2[i] = var35;
+ /* 5: storeb */
+ ptr1[i] = var36;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_YUY2_Y42B (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[0];
+ var37.x2[0] = _src.x2[1];
+ var34.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[1];
+ var37.x2[1] = _src.x2[1];
+ var34.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var37.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 4: storeb */
+ ptr2[i] = var35;
+ /* 5: storeb */
+ ptr1[i] = var36;
+ }
+ }
+
+}
+
+void
+cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_YUY2_Y42B");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_Y42B);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T1,
+ 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_UYVY_Y42B */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[0];
+ var34.x2[0] = _src.x2[1];
+ var37.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[1];
+ var34.x2[1] = _src.x2[1];
+ var37.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var37.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 4: storeb */
+ ptr2[i] = var35;
+ /* 5: storeb */
+ ptr1[i] = var36;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_UYVY_Y42B (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[0];
+ var34.x2[0] = _src.x2[1];
+ var37.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var33.x2[1];
+ var34.x2[1] = _src.x2[1];
+ var37.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var34;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var37.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 4: storeb */
+ ptr2[i] = var35;
+ /* 5: storeb */
+ ptr1[i] = var36;
+ }
+ }
+
+}
+
+void
+cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_UYVY_Y42B");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_Y42B);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T1,
+ 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_YUY2_Y444 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_union16 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var36.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var36.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var36;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var40 = _src.x2[1];
+ var41 = _src.x2[0];
+ }
+ /* 4: splatbw */
+ var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff);
+ /* 5: storew */
+ ptr1[i] = var37;
+ /* 6: splatbw */
+ var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff);
+ /* 7: storew */
+ ptr2[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_YUY2_Y444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_union16 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var36.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var36.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var36;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var40 = _src.x2[1];
+ var41 = _src.x2[0];
+ }
+ /* 4: splatbw */
+ var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff);
+ /* 5: storew */
+ ptr1[i] = var37;
+ /* 6: splatbw */
+ var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff);
+ /* 7: storew */
+ ptr2[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_YUY2_Y444");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_Y444);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_destination (p, 2, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D3, ORC_VAR_T3, 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_UYVY_Y444 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_union16 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var36.x2[0] = _src.x2[1];
+ var39.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var36.x2[1] = _src.x2[1];
+ var39.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var36;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var40 = _src.x2[1];
+ var41 = _src.x2[0];
+ }
+ /* 4: splatbw */
+ var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff);
+ /* 5: storew */
+ ptr1[i] = var37;
+ /* 6: splatbw */
+ var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff);
+ /* 7: storew */
+ ptr2[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_UYVY_Y444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_union16 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var36.x2[0] = _src.x2[1];
+ var39.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var36.x2[1] = _src.x2[1];
+ var39.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var36;
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var40 = _src.x2[1];
+ var41 = _src.x2[0];
+ }
+ /* 4: splatbw */
+ var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff);
+ /* 5: storew */
+ ptr1[i] = var37;
+ /* 6: splatbw */
+ var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff);
+ /* 7: storew */
+ ptr2[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_UYVY_Y444");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_Y444);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_destination (p, 2, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D3, ORC_VAR_T3, 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_UYVY_I420 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_union16 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr3 = (orc_int8 *) d4;
+ ptr4 = (orc_union32 *) s1;
+ ptr5 = (orc_union32 *) s2;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var39;
+ /* 3: loadl */
+ var36 = ptr5[i];
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var41.x2[0] = _src.x2[1];
+ var42.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var41.x2[1] = _src.x2[1];
+ var42.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr1[i] = var41;
+ /* 6: avgub */
+ var43.x2[0] = ((orc_uint8) var40.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var40.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 8: storeb */
+ ptr3[i] = var37;
+ /* 9: storeb */
+ ptr2[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_UYVY_I420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_union16 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr3 = (orc_int8 *) ex->arrays[3];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+ ptr5 = (orc_union32 *) ex->arrays[5];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var35.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: storew */
+ ptr0[i] = var39;
+ /* 3: loadl */
+ var36 = ptr5[i];
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var41.x2[0] = _src.x2[1];
+ var42.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var41.x2[1] = _src.x2[1];
+ var42.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr1[i] = var41;
+ /* 6: avgub */
+ var43.x2[0] = ((orc_uint8) var40.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var40.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 8: storeb */
+ ptr3[i] = var37;
+ /* 9: storeb */
+ ptr2[i] = var38;
+ }
+
+}
+
+void
+cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_UYVY_I420");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_I420);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_destination (p, 1, "d4");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_source (p, 4, "s2");
+ 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, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D4, ORC_VAR_D3, ORC_VAR_T1,
+ 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_D4] = d4;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->arrays[ORC_VAR_S2] = (void *) s2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_I420 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ const orc_union64 *ORC_RESTRICT ptr5;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union64 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_union32 var46;
+ orc_union32 var47;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union32 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_int8 var53;
+ orc_int8 var54;
+ orc_int8 var55;
+ orc_int8 var56;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr3 = ORC_PTR_OFFSET (d4, d4_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.x2[0];
+ var46.x2[0] = _src.x2[1];
+ var47.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var40.x2[1];
+ var46.x2[1] = _src.x2[1];
+ var47.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var47.x2[0];
+ var41.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var47.x2[1];
+ var41.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var41;
+ /* 4: loadq */
+ var42 = ptr5[i];
+ /* 5: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var42.x2[0];
+ var48.x2[0] = _src.x2[1];
+ var49.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var42.x2[1];
+ var48.x2[1] = _src.x2[1];
+ var49.x2[1] = _src.x2[0];
+ }
+ /* 6: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var49.x2[0];
+ var43.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var49.x2[1];
+ var43.x2[1] = _src.x2[1];
+ }
+ /* 7: storew */
+ ptr1[i] = var43;
+ /* 8: avgub */
+ var50.x4[0] =
+ ((orc_uint8) var46.x4[0] + (orc_uint8) var48.x4[0] + 1) >> 1;
+ var50.x4[1] =
+ ((orc_uint8) var46.x4[1] + (orc_uint8) var48.x4[1] + 1) >> 1;
+ var50.x4[2] =
+ ((orc_uint8) var46.x4[2] + (orc_uint8) var48.x4[2] + 1) >> 1;
+ var50.x4[3] =
+ ((orc_uint8) var46.x4[3] + (orc_uint8) var48.x4[3] + 1) >> 1;
+ /* 9: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var50.x2[0];
+ var51.x2[0] = _src.x2[1];
+ var52.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var50.x2[1];
+ var51.x2[1] = _src.x2[1];
+ var52.x2[1] = _src.x2[0];
+ }
+ /* 10: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var52.i;
+ var53 = _src.x2[1];
+ var54 = _src.x2[0];
+ }
+ /* 11: avgub */
+ var44 = ((orc_uint8) var53 + (orc_uint8) var54 + 1) >> 1;
+ /* 12: storeb */
+ ptr2[i] = var44;
+ /* 13: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var51.i;
+ var55 = _src.x2[1];
+ var56 = _src.x2[0];
+ }
+ /* 14: avgub */
+ var45 = ((orc_uint8) var55 + (orc_uint8) var56 + 1) >> 1;
+ /* 15: storeb */
+ ptr3[i] = var45;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_I420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_int8 *ORC_RESTRICT ptr3;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ const orc_union64 *ORC_RESTRICT ptr5;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union64 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_union32 var46;
+ orc_union32 var47;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union32 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_int8 var53;
+ orc_int8 var54;
+ orc_int8 var55;
+ orc_int8 var56;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr3 = ORC_PTR_OFFSET (ex->arrays[3], ex->params[3] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.x2[0];
+ var46.x2[0] = _src.x2[1];
+ var47.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var40.x2[1];
+ var46.x2[1] = _src.x2[1];
+ var47.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var47.x2[0];
+ var41.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var47.x2[1];
+ var41.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var41;
+ /* 4: loadq */
+ var42 = ptr5[i];
+ /* 5: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var42.x2[0];
+ var48.x2[0] = _src.x2[1];
+ var49.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var42.x2[1];
+ var48.x2[1] = _src.x2[1];
+ var49.x2[1] = _src.x2[0];
+ }
+ /* 6: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var49.x2[0];
+ var43.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var49.x2[1];
+ var43.x2[1] = _src.x2[1];
+ }
+ /* 7: storew */
+ ptr1[i] = var43;
+ /* 8: avgub */
+ var50.x4[0] =
+ ((orc_uint8) var46.x4[0] + (orc_uint8) var48.x4[0] + 1) >> 1;
+ var50.x4[1] =
+ ((orc_uint8) var46.x4[1] + (orc_uint8) var48.x4[1] + 1) >> 1;
+ var50.x4[2] =
+ ((orc_uint8) var46.x4[2] + (orc_uint8) var48.x4[2] + 1) >> 1;
+ var50.x4[3] =
+ ((orc_uint8) var46.x4[3] + (orc_uint8) var48.x4[3] + 1) >> 1;
+ /* 9: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var50.x2[0];
+ var51.x2[0] = _src.x2[1];
+ var52.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var50.x2[1];
+ var51.x2[1] = _src.x2[1];
+ var52.x2[1] = _src.x2[0];
+ }
+ /* 10: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var52.i;
+ var53 = _src.x2[1];
+ var54 = _src.x2[0];
+ }
+ /* 11: avgub */
+ var44 = ((orc_uint8) var53 + (orc_uint8) var54 + 1) >> 1;
+ /* 12: storeb */
+ ptr2[i] = var44;
+ /* 13: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var51.i;
+ var55 = _src.x2[1];
+ var56 = _src.x2[0];
+ }
+ /* 14: avgub */
+ var45 = ((orc_uint8) var55 + (orc_uint8) var56 + 1) >> 1;
+ /* 15: storeb */
+ ptr3[i] = var45;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_I420");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_I420);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_destination (p, 1, "d4");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_source (p, 8, "s2");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 1, "t7");
+ orc_program_add_temporary (p, 1, "t8");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D2, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 2, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T7, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D4, ORC_VAR_T7, ORC_VAR_T8,
+ 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_D4] = d4;
+ ex->params[ORC_VAR_D4] = d4_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+ ex->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_YUY2 (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_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 4, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var44.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var44.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_UYVY (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_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 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);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var44.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var44.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_UYVY);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 4, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_Y42B */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] =
+ ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] =
+ ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 5: storeb */
+ ptr2[i] = var37;
+ /* 6: storeb */
+ ptr1[i] = var38;
+ /* 7: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 8: storew */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_Y42B (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 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);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] =
+ ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] =
+ ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 5: storeb */
+ ptr2[i] = var37;
+ /* 6: storeb */
+ ptr1[i] = var38;
+ /* 7: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 8: storew */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_Y42B");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_Y42B);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_Y444 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j);
+ ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var38.i = _src.x2[1];
+ var39.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr2[i] = var35;
+ /* 4: storeb */
+ ptr1[i] = var36;
+ /* 5: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var37 = _src.x2[1];
+ }
+ /* 6: storeb */
+ ptr0[i] = var37;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_Y444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
+ ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j);
+ ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j);
+ ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var38.i = _src.x2[1];
+ var39.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr2[i] = var35;
+ /* 4: storeb */
+ ptr1[i] = var36;
+ /* 5: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var37 = _src.x2[1];
+ }
+ /* 6: storeb */
+ ptr0[i] = var37;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3,
+ int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_Y444");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_Y444);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 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_D2] = d2;
+ ex->params[ORC_VAR_D2] = d2_stride;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->params[ORC_VAR_D3] = d3_stride;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_S1] = s1_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y42B_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr5[i];
+ /* 1: loadb */
+ var34 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y42B_YUY2 (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_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr5[i];
+ /* 1: loadb */
+ var34 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y42B_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y42B_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr5[i];
+ /* 1: loadb */
+ var34 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var35.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var35.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y42B_UYVY (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_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr5[i];
+ /* 1: loadb */
+ var34 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 3: loadw */
+ var35 = ptr4[i];
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var35.x2[0];
+ var36.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var35.x2[1];
+ var36.x2[1] = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y42B_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_UYVY);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y42B_AYUV */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+ /* 3: loadpb */
+ var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr5[i];
+ /* 1: loadb */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var41.i = _dest.i;
+ }
+ /* 4: loadw */
+ var39 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var40;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y42B_AYUV (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int j;
+ int n = ex->n;
+ int m = ex->params[ORC_VAR_A1];
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+ /* 3: loadpb */
+ var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr5[i];
+ /* 1: loadb */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var41.i = _dest.i;
+ }
+ /* 4: loadw */
+ var39 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var40;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y42B_AYUV");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_AYUV);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T4, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y444_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_union16 *ORC_RESTRICT ptr6;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var36 = ptr5[i];
+ /* 1: loadw */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 4: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y444_YUY2 (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_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_union16 *ORC_RESTRICT ptr6;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var36 = ptr5[i];
+ /* 1: loadw */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 4: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y444_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_source (p, 2, "s3");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y444_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_union16 *ORC_RESTRICT ptr6;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var36 = ptr5[i];
+ /* 1: loadw */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 4: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var38.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var38.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y444_UYVY (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_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ const orc_union16 *ORC_RESTRICT ptr6;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var36 = ptr5[i];
+ /* 1: loadw */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 4: avgub */
+ var43.x2[0] =
+ ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] =
+ ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var38.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var38.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y444_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_UYVY);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_source (p, 2, "s3");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_Y444_AYUV */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+ ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j);
+ ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j);
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 1: loadb */
+ var35 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var39.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_Y444_AYUV (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_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ 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);
+ ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j);
+ ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j);
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 1: loadb */
+ var35 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var39.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+ }
+
+}
+
+void
+cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride,
+ const guint8 * ORC_RESTRICT s2, int s2_stride,
+ const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_Y444_AYUV");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_AYUV);
+ orc_program_add_destination (p, 4, "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, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_S2] = s2_stride;
+ ex->arrays[ORC_VAR_S3] = (void *) s3;
+ ex->params[ORC_VAR_S3] = s3_stride;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_ARGB */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var61;
+ _dest.x2[1] = var87;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var88;
+ _dest.x2[1] = var89;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_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_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ 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);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var61;
+ _dest.x2[1] = var87;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var88;
+ _dest.x2[1] = var89;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_ARGB");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_ARGB);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "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, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 2, "t10");
+ orc_program_add_temporary (p, 2, "t11");
+ orc_program_add_temporary (p, 2, "t12");
+ orc_program_add_temporary (p, 1, "t13");
+ orc_program_add_temporary (p, 1, "t14");
+ orc_program_add_temporary (p, 1, "t15");
+ orc_program_add_temporary (p, 4, "t16");
+
+ orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T9, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3,
+ ORC_VAR_T13, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T14,
+ ORC_VAR_T15, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_BGRA */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var89;
+ _dest.x2[1] = var88;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var61;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_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_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ 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);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var89;
+ _dest.x2[1] = var88;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var61;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_BGRA");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_BGRA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "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, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 2, "t10");
+ orc_program_add_temporary (p, 2, "t11");
+ orc_program_add_temporary (p, 2, "t12");
+ orc_program_add_temporary (p, 1, "t13");
+ orc_program_add_temporary (p, 1, "t14");
+ orc_program_add_temporary (p, 1, "t15");
+ orc_program_add_temporary (p, 4, "t16");
+
+ orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T9, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T15,
+ ORC_VAR_T14, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T13,
+ ORC_VAR_T3, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_ABGR */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var61;
+ _dest.x2[1] = var89;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var88;
+ _dest.x2[1] = var87;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_ABGR (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_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ 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);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var61;
+ _dest.x2[1] = var89;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var88;
+ _dest.x2[1] = var87;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_ABGR");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_ABGR);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "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, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 2, "t10");
+ orc_program_add_temporary (p, 2, "t11");
+ orc_program_add_temporary (p, 2, "t12");
+ orc_program_add_temporary (p, 1, "t13");
+ orc_program_add_temporary (p, 1, "t14");
+ orc_program_add_temporary (p, 1, "t15");
+ orc_program_add_temporary (p, 4, "t16");
+
+ orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T9, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3,
+ ORC_VAR_T15, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T14,
+ ORC_VAR_T13, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_AYUV_RGBA */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ int i;
+ int j;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ for (j = 0; j < m; j++) {
+ ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
+ ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var88;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var89;
+ _dest.x2[1] = var61;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_AYUV_RGBA (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_union32 var48;
+ orc_union32 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_union16 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_int8 var87;
+ orc_int8 var88;
+ orc_int8 var89;
+ orc_union16 var90;
+ orc_union16 var91;
+ orc_union32 var92;
+
+ 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);
+
+ /* 1: loadpb */
+ var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 14: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 21: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 25: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 29: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 40: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var48 = ptr4[i];
+ /* 2: subb */
+ var57.x4[0] = var48.x4[0] - var49.x4[0];
+ var57.x4[1] = var48.x4[1] - var49.x4[1];
+ var57.x4[2] = var48.x4[2] - var49.x4[2];
+ var57.x4[3] = var48.x4[3] - var49.x4[3];
+ /* 3: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var57.i;
+ var58.i = _src.x2[1];
+ var59.i = _src.x2[0];
+ }
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var59.i;
+ var60 = _src.x2[1];
+ var61 = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var58.i;
+ var62 = _src.x2[1];
+ var63 = _src.x2[0];
+ }
+ /* 6: convsbw */
+ var64.i = var60;
+ /* 7: convsbw */
+ var65.i = var63;
+ /* 8: convsbw */
+ var66.i = var62;
+ /* 10: mullw */
+ var67.i = (var64.i * var50.i) & 0xffff;
+ /* 11: shrsw */
+ var68.i = var67.i >> 8;
+ /* 12: addssw */
+ var69.i = ORC_CLAMP_SW (var64.i + var68.i);
+ /* 13: addssw */
+ var70.i = ORC_CLAMP_SW (var69.i + var66.i);
+ /* 15: mullw */
+ var71.i = (var66.i * var51.i) & 0xffff;
+ /* 16: shrsw */
+ var72.i = var71.i >> 8;
+ /* 17: subssw */
+ var73.i = ORC_CLAMP_SW (var70.i - var72.i);
+ /* 18: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var66.i);
+ /* 19: addssw */
+ var75.i = ORC_CLAMP_SW (var69.i + var65.i);
+ /* 20: addssw */
+ var76.i = ORC_CLAMP_SW (var75.i + var65.i);
+ /* 22: mullw */
+ var77.i = (var65.i * var52.i) & 0xffff;
+ /* 23: shrsw */
+ var78.i = var77.i >> 8;
+ /* 24: addssw */
+ var79.i = ORC_CLAMP_SW (var76.i + var78.i);
+ /* 26: mullw */
+ var80.i = (var65.i * var53.i) & 0xffff;
+ /* 27: shrsw */
+ var81.i = var80.i >> 8;
+ /* 28: subssw */
+ var82.i = ORC_CLAMP_SW (var69.i - var81.i);
+ /* 30: mullw */
+ var83.i = (var66.i * var54.i) & 0xffff;
+ /* 31: shrsw */
+ var84.i = var83.i >> 8;
+ /* 32: subssw */
+ var85.i = ORC_CLAMP_SW (var82.i - var84.i);
+ /* 33: subssw */
+ var86.i = ORC_CLAMP_SW (var85.i - var84.i);
+ /* 34: convssswb */
+ var87 = ORC_CLAMP_SB (var74.i);
+ /* 35: convssswb */
+ var88 = ORC_CLAMP_SB (var86.i);
+ /* 36: convssswb */
+ var89 = ORC_CLAMP_SB (var79.i);
+ /* 37: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var88;
+ var90.i = _dest.i;
+ }
+ /* 38: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var89;
+ _dest.x2[1] = var61;
+ var91.i = _dest.i;
+ }
+ /* 39: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var90.i;
+ _dest.x2[1] = var91.i;
+ var92.i = _dest.i;
+ }
+ /* 41: addb */
+ var56.x4[0] = var92.x4[0] + var55.x4[0];
+ var56.x4[1] = var92.x4[1] + var55.x4[1];
+ var56.x4[2] = var92.x4[2] + var55.x4[2];
+ var56.x4[3] = var92.x4[3] + var55.x4[3];
+ /* 42: storel */
+ ptr0[i] = var56;
+ }
+ }
+
+}
+
+void
+cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride,
+ const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_convert_AYUV_RGBA");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_RGBA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 4, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "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, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 2, "t10");
+ orc_program_add_temporary (p, 2, "t11");
+ orc_program_add_temporary (p, 2, "t12");
+ orc_program_add_temporary (p, 1, "t13");
+ orc_program_add_temporary (p, 1, "t14");
+ orc_program_add_temporary (p, 1, "t15");
+ orc_program_add_temporary (p, 4, "t16");
+
+ orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T9, ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T13,
+ ORC_VAR_T14, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T15,
+ ORC_VAR_T3, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_convert_I420_BGRA */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_union16 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_int8 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_int8 var57;
+ orc_union16 var58;
+ orc_int8 var59;
+ orc_int8 var60;
+ orc_union16 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_int8 var85;
+ orc_int8 var86;
+ orc_int8 var87;
+ orc_union16 var88;
+ orc_union16 var89;
+ orc_union32 var90;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 1: loadpb */
+ var46 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 5: loadpb */
+ var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpb */
+ var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 12: loadpw */
+ var49.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 17: loadpw */
+ var50.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 24: loadpw */
+ var51.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 28: loadpw */
+ var52.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 32: loadpw */
+ var53.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 41: loadpb */
+ var54 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 44: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var45 = ptr4[i];
+ /* 2: subb */
+ var57 = var45 - var46;
+ /* 3: convsbw */
+ var58.i = var57;
+ /* 4: loadupib */
+ var59 =
+ (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] +
+ 1) >> 1 : ptr5[i >> 1];
+ /* 6: subb */
+ var60 = var59 - var47;
+ /* 7: convsbw */
+ var61.i = var60;
+ /* 8: loadupib */
+ var62 =
+ (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] +
+ 1) >> 1 : ptr6[i >> 1];
+ /* 10: subb */
+ var63 = var62 - var48;
+ /* 11: convsbw */
+ var64.i = var63;
+ /* 13: mullw */
+ var65.i = (var58.i * var49.i) & 0xffff;
+ /* 14: shrsw */
+ var66.i = var65.i >> 8;
+ /* 15: addssw */
+ var67.i = ORC_CLAMP_SW (var58.i + var66.i);
+ /* 16: addssw */
+ var68.i = ORC_CLAMP_SW (var67.i + var64.i);
+ /* 18: mullw */
+ var69.i = (var64.i * var50.i) & 0xffff;
+ /* 19: shrsw */
+ var70.i = var69.i >> 8;
+ /* 20: subssw */
+ var71.i = ORC_CLAMP_SW (var68.i - var70.i);
+ /* 21: addssw */
+ var72.i = ORC_CLAMP_SW (var71.i + var64.i);
+ /* 22: addssw */
+ var73.i = ORC_CLAMP_SW (var67.i + var61.i);
+ /* 23: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var61.i);
+ /* 25: mullw */
+ var75.i = (var61.i * var51.i) & 0xffff;
+ /* 26: shrsw */
+ var76.i = var75.i >> 8;
+ /* 27: addssw */
+ var77.i = ORC_CLAMP_SW (var74.i + var76.i);
+ /* 29: mullw */
+ var78.i = (var61.i * var52.i) & 0xffff;
+ /* 30: shrsw */
+ var79.i = var78.i >> 8;
+ /* 31: subssw */
+ var80.i = ORC_CLAMP_SW (var67.i - var79.i);
+ /* 33: mullw */
+ var81.i = (var64.i * var53.i) & 0xffff;
+ /* 34: shrsw */
+ var82.i = var81.i >> 8;
+ /* 35: subssw */
+ var83.i = ORC_CLAMP_SW (var80.i - var82.i);
+ /* 36: subssw */
+ var84.i = ORC_CLAMP_SW (var83.i - var82.i);
+ /* 37: convssswb */
+ var85 = ORC_CLAMP_SB (var72.i);
+ /* 38: convssswb */
+ var86 = ORC_CLAMP_SB (var84.i);
+ /* 39: convssswb */
+ var87 = ORC_CLAMP_SB (var77.i);
+ /* 40: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var86;
+ var88.i = _dest.i;
+ }
+ /* 42: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var85;
+ _dest.x2[1] = var54;
+ var89.i = _dest.i;
+ }
+ /* 43: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var88.i;
+ _dest.x2[1] = var89.i;
+ var90.i = _dest.i;
+ }
+ /* 45: addb */
+ var56.x4[0] = var90.x4[0] + var55.x4[0];
+ var56.x4[1] = var90.x4[1] + var55.x4[1];
+ var56.x4[2] = var90.x4[2] + var55.x4[2];
+ var56.x4[3] = var90.x4[3] + var55.x4[3];
+ /* 46: storel */
+ ptr0[i] = var56;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_I420_BGRA (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_union16 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_int8 var54;
+ orc_union32 var55;
+ orc_union32 var56;
+ orc_int8 var57;
+ orc_union16 var58;
+ orc_int8 var59;
+ orc_int8 var60;
+ orc_union16 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_union16 var65;
+ orc_union16 var66;
+ orc_union16 var67;
+ orc_union16 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_int8 var85;
+ orc_int8 var86;
+ orc_int8 var87;
+ orc_union16 var88;
+ orc_union16 var89;
+ orc_union32 var90;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 1: loadpb */
+ var46 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 5: loadpb */
+ var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 9: loadpb */
+ var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 12: loadpw */
+ var49.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 17: loadpw */
+ var50.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 24: loadpw */
+ var51.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 28: loadpw */
+ var52.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 32: loadpw */
+ var53.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 41: loadpb */
+ var54 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 44: loadpb */
+ var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var45 = ptr4[i];
+ /* 2: subb */
+ var57 = var45 - var46;
+ /* 3: convsbw */
+ var58.i = var57;
+ /* 4: loadupib */
+ var59 =
+ (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] +
+ 1) >> 1 : ptr5[i >> 1];
+ /* 6: subb */
+ var60 = var59 - var47;
+ /* 7: convsbw */
+ var61.i = var60;
+ /* 8: loadupib */
+ var62 =
+ (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] +
+ 1) >> 1 : ptr6[i >> 1];
+ /* 10: subb */
+ var63 = var62 - var48;
+ /* 11: convsbw */
+ var64.i = var63;
+ /* 13: mullw */
+ var65.i = (var58.i * var49.i) & 0xffff;
+ /* 14: shrsw */
+ var66.i = var65.i >> 8;
+ /* 15: addssw */
+ var67.i = ORC_CLAMP_SW (var58.i + var66.i);
+ /* 16: addssw */
+ var68.i = ORC_CLAMP_SW (var67.i + var64.i);
+ /* 18: mullw */
+ var69.i = (var64.i * var50.i) & 0xffff;
+ /* 19: shrsw */
+ var70.i = var69.i >> 8;
+ /* 20: subssw */
+ var71.i = ORC_CLAMP_SW (var68.i - var70.i);
+ /* 21: addssw */
+ var72.i = ORC_CLAMP_SW (var71.i + var64.i);
+ /* 22: addssw */
+ var73.i = ORC_CLAMP_SW (var67.i + var61.i);
+ /* 23: addssw */
+ var74.i = ORC_CLAMP_SW (var73.i + var61.i);
+ /* 25: mullw */
+ var75.i = (var61.i * var51.i) & 0xffff;
+ /* 26: shrsw */
+ var76.i = var75.i >> 8;
+ /* 27: addssw */
+ var77.i = ORC_CLAMP_SW (var74.i + var76.i);
+ /* 29: mullw */
+ var78.i = (var61.i * var52.i) & 0xffff;
+ /* 30: shrsw */
+ var79.i = var78.i >> 8;
+ /* 31: subssw */
+ var80.i = ORC_CLAMP_SW (var67.i - var79.i);
+ /* 33: mullw */
+ var81.i = (var64.i * var53.i) & 0xffff;
+ /* 34: shrsw */
+ var82.i = var81.i >> 8;
+ /* 35: subssw */
+ var83.i = ORC_CLAMP_SW (var80.i - var82.i);
+ /* 36: subssw */
+ var84.i = ORC_CLAMP_SW (var83.i - var82.i);
+ /* 37: convssswb */
+ var85 = ORC_CLAMP_SB (var72.i);
+ /* 38: convssswb */
+ var86 = ORC_CLAMP_SB (var84.i);
+ /* 39: convssswb */
+ var87 = ORC_CLAMP_SB (var77.i);
+ /* 40: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var87;
+ _dest.x2[1] = var86;
+ var88.i = _dest.i;
+ }
+ /* 42: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var85;
+ _dest.x2[1] = var54;
+ var89.i = _dest.i;
+ }
+ /* 43: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var88.i;
+ _dest.x2[1] = var89.i;
+ var90.i = _dest.i;
+ }
+ /* 45: addb */
+ var56.x4[0] = var90.x4[0] + var55.x4[0];
+ var56.x4[1] = var90.x4[1] + var55.x4[1];
+ var56.x4[2] = var90.x4[2] + var55.x4[2];
+ var56.x4[3] = var90.x4[3] + var55.x4[3];
+ /* 46: storel */
+ ptr0[i] = var56;
+ }
+
+}
+
+void
+cogorc_convert_I420_BGRA (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 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, "cogorc_convert_I420_BGRA");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_I420_BGRA);
+ orc_program_add_destination (p, 4, "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, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 1, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_constant (p, 4, 0x000000ff, "c8");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 1, "t10");
+ orc_program_add_temporary (p, 1, "t11");
+ orc_program_add_temporary (p, 1, "t12");
+ orc_program_add_temporary (p, 4, "t13");
+
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T9, ORC_VAR_T4, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T10, ORC_VAR_T7,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T11, ORC_VAR_T8,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T12, ORC_VAR_T9,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T12,
+ ORC_VAR_T11, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T10,
+ ORC_VAR_C8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T13, ORC_VAR_T1,
+ ORC_VAR_T2, ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T13, ORC_VAR_C2,
+ 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
+
+
+/* cogorc_convert_I420_BGRA_avg */
+#ifdef DISABLE_ORC
+void
+cogorc_convert_I420_BGRA_avg (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_union32 *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 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_int8 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_int8 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_int8 var65;
+ orc_int8 var66;
+ orc_int8 var67;
+ orc_int8 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_union16 var87;
+ orc_union16 var88;
+ orc_union16 var89;
+ orc_int8 var90;
+ orc_int8 var91;
+ orc_int8 var92;
+ orc_union16 var93;
+ orc_union16 var94;
+ orc_union32 var95;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+ ptr8 = (orc_int8 *) s5;
+
+ /* 1: loadpb */
+ var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 7: loadpb */
+ var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 13: loadpb */
+ var49 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 16: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 21: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 28: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 32: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 36: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 45: loadpb */
+ var55 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 48: loadpb */
+ var56.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var46 = ptr4[i];
+ /* 2: subb */
+ var58 = var46 - var47;
+ /* 3: convsbw */
+ var59.i = var58;
+ /* 4: loadupib */
+ var60 =
+ (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] +
+ 1) >> 1 : ptr5[i >> 1];
+ /* 5: loadupib */
+ var61 =
+ (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] +
+ 1) >> 1 : ptr6[i >> 1];
+ /* 6: avgub */
+ var62 = ((orc_uint8) var60 + (orc_uint8) var61 + 1) >> 1;
+ /* 8: subb */
+ var63 = var62 - var48;
+ /* 9: convsbw */
+ var64.i = var63;
+ /* 10: loadupib */
+ var65 =
+ (i & 1) ? ((orc_uint8) ptr7[i >> 1] + (orc_uint8) ptr7[(i >> 1) + 1] +
+ 1) >> 1 : ptr7[i >> 1];
+ /* 11: loadupib */
+ var66 =
+ (i & 1) ? ((orc_uint8) ptr8[i >> 1] + (orc_uint8) ptr8[(i >> 1) + 1] +
+ 1) >> 1 : ptr8[i >> 1];
+ /* 12: avgub */
+ var67 = ((orc_uint8) var65 + (orc_uint8) var66 + 1) >> 1;
+ /* 14: subb */
+ var68 = var67 - var49;
+ /* 15: convsbw */
+ var69.i = var68;
+ /* 17: mullw */
+ var70.i = (var59.i * var50.i) & 0xffff;
+ /* 18: shrsw */
+ var71.i = var70.i >> 8;
+ /* 19: addssw */
+ var72.i = ORC_CLAMP_SW (var59.i + var71.i);
+ /* 20: addssw */
+ var73.i = ORC_CLAMP_SW (var72.i + var69.i);
+ /* 22: mullw */
+ var74.i = (var69.i * var51.i) & 0xffff;
+ /* 23: shrsw */
+ var75.i = var74.i >> 8;
+ /* 24: subssw */
+ var76.i = ORC_CLAMP_SW (var73.i - var75.i);
+ /* 25: addssw */
+ var77.i = ORC_CLAMP_SW (var76.i + var69.i);
+ /* 26: addssw */
+ var78.i = ORC_CLAMP_SW (var72.i + var64.i);
+ /* 27: addssw */
+ var79.i = ORC_CLAMP_SW (var78.i + var64.i);
+ /* 29: mullw */
+ var80.i = (var64.i * var52.i) & 0xffff;
+ /* 30: shrsw */
+ var81.i = var80.i >> 8;
+ /* 31: addssw */
+ var82.i = ORC_CLAMP_SW (var79.i + var81.i);
+ /* 33: mullw */
+ var83.i = (var64.i * var53.i) & 0xffff;
+ /* 34: shrsw */
+ var84.i = var83.i >> 8;
+ /* 35: subssw */
+ var85.i = ORC_CLAMP_SW (var72.i - var84.i);
+ /* 37: mullw */
+ var86.i = (var69.i * var54.i) & 0xffff;
+ /* 38: shrsw */
+ var87.i = var86.i >> 8;
+ /* 39: subssw */
+ var88.i = ORC_CLAMP_SW (var85.i - var87.i);
+ /* 40: subssw */
+ var89.i = ORC_CLAMP_SW (var88.i - var87.i);
+ /* 41: convssswb */
+ var90 = ORC_CLAMP_SB (var77.i);
+ /* 42: convssswb */
+ var91 = ORC_CLAMP_SB (var89.i);
+ /* 43: convssswb */
+ var92 = ORC_CLAMP_SB (var82.i);
+ /* 44: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var92;
+ _dest.x2[1] = var91;
+ var93.i = _dest.i;
+ }
+ /* 46: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var90;
+ _dest.x2[1] = var55;
+ var94.i = _dest.i;
+ }
+ /* 47: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var93.i;
+ _dest.x2[1] = var94.i;
+ var95.i = _dest.i;
+ }
+ /* 49: addb */
+ var57.x4[0] = var95.x4[0] + var56.x4[0];
+ var57.x4[1] = var95.x4[1] + var56.x4[1];
+ var57.x4[2] = var95.x4[2] + var56.x4[2];
+ var57.x4[3] = var95.x4[3] + var56.x4[3];
+ /* 50: storel */
+ ptr0[i] = var57;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_convert_I420_BGRA_avg (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *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 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+ orc_union16 var50;
+ orc_union16 var51;
+ orc_union16 var52;
+ orc_union16 var53;
+ orc_union16 var54;
+ orc_int8 var55;
+ orc_union32 var56;
+ orc_union32 var57;
+ orc_int8 var58;
+ orc_union16 var59;
+ orc_int8 var60;
+ orc_int8 var61;
+ orc_int8 var62;
+ orc_int8 var63;
+ orc_union16 var64;
+ orc_int8 var65;
+ orc_int8 var66;
+ orc_int8 var67;
+ orc_int8 var68;
+ orc_union16 var69;
+ orc_union16 var70;
+ orc_union16 var71;
+ orc_union16 var72;
+ orc_union16 var73;
+ orc_union16 var74;
+ orc_union16 var75;
+ orc_union16 var76;
+ orc_union16 var77;
+ orc_union16 var78;
+ orc_union16 var79;
+ orc_union16 var80;
+ orc_union16 var81;
+ orc_union16 var82;
+ orc_union16 var83;
+ orc_union16 var84;
+ orc_union16 var85;
+ orc_union16 var86;
+ orc_union16 var87;
+ orc_union16 var88;
+ orc_union16 var89;
+ orc_int8 var90;
+ orc_int8 var91;
+ orc_int8 var92;
+ orc_union16 var93;
+ orc_union16 var94;
+ orc_union32 var95;
+
+ ptr0 = (orc_union32 *) 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];
+
+ /* 1: loadpb */
+ var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 7: loadpb */
+ var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 13: loadpb */
+ var49 = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ /* 16: loadpw */
+ var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */
+ /* 21: loadpw */
+ var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */
+ /* 28: loadpw */
+ var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */
+ /* 32: loadpw */
+ var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */
+ /* 36: loadpw */
+ var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */
+ /* 45: loadpb */
+ var55 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 48: loadpb */
+ var56.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+ var56.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var46 = ptr4[i];
+ /* 2: subb */
+ var58 = var46 - var47;
+ /* 3: convsbw */
+ var59.i = var58;
+ /* 4: loadupib */
+ var60 =
+ (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] +
+ 1) >> 1 : ptr5[i >> 1];
+ /* 5: loadupib */
+ var61 =
+ (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] +
+ 1) >> 1 : ptr6[i >> 1];
+ /* 6: avgub */
+ var62 = ((orc_uint8) var60 + (orc_uint8) var61 + 1) >> 1;
+ /* 8: subb */
+ var63 = var62 - var48;
+ /* 9: convsbw */
+ var64.i = var63;
+ /* 10: loadupib */
+ var65 =
+ (i & 1) ? ((orc_uint8) ptr7[i >> 1] + (orc_uint8) ptr7[(i >> 1) + 1] +
+ 1) >> 1 : ptr7[i >> 1];
+ /* 11: loadupib */
+ var66 =
+ (i & 1) ? ((orc_uint8) ptr8[i >> 1] + (orc_uint8) ptr8[(i >> 1) + 1] +
+ 1) >> 1 : ptr8[i >> 1];
+ /* 12: avgub */
+ var67 = ((orc_uint8) var65 + (orc_uint8) var66 + 1) >> 1;
+ /* 14: subb */
+ var68 = var67 - var49;
+ /* 15: convsbw */
+ var69.i = var68;
+ /* 17: mullw */
+ var70.i = (var59.i * var50.i) & 0xffff;
+ /* 18: shrsw */
+ var71.i = var70.i >> 8;
+ /* 19: addssw */
+ var72.i = ORC_CLAMP_SW (var59.i + var71.i);
+ /* 20: addssw */
+ var73.i = ORC_CLAMP_SW (var72.i + var69.i);
+ /* 22: mullw */
+ var74.i = (var69.i * var51.i) & 0xffff;
+ /* 23: shrsw */
+ var75.i = var74.i >> 8;
+ /* 24: subssw */
+ var76.i = ORC_CLAMP_SW (var73.i - var75.i);
+ /* 25: addssw */
+ var77.i = ORC_CLAMP_SW (var76.i + var69.i);
+ /* 26: addssw */
+ var78.i = ORC_CLAMP_SW (var72.i + var64.i);
+ /* 27: addssw */
+ var79.i = ORC_CLAMP_SW (var78.i + var64.i);
+ /* 29: mullw */
+ var80.i = (var64.i * var52.i) & 0xffff;
+ /* 30: shrsw */
+ var81.i = var80.i >> 8;
+ /* 31: addssw */
+ var82.i = ORC_CLAMP_SW (var79.i + var81.i);
+ /* 33: mullw */
+ var83.i = (var64.i * var53.i) & 0xffff;
+ /* 34: shrsw */
+ var84.i = var83.i >> 8;
+ /* 35: subssw */
+ var85.i = ORC_CLAMP_SW (var72.i - var84.i);
+ /* 37: mullw */
+ var86.i = (var69.i * var54.i) & 0xffff;
+ /* 38: shrsw */
+ var87.i = var86.i >> 8;
+ /* 39: subssw */
+ var88.i = ORC_CLAMP_SW (var85.i - var87.i);
+ /* 40: subssw */
+ var89.i = ORC_CLAMP_SW (var88.i - var87.i);
+ /* 41: convssswb */
+ var90 = ORC_CLAMP_SB (var77.i);
+ /* 42: convssswb */
+ var91 = ORC_CLAMP_SB (var89.i);
+ /* 43: convssswb */
+ var92 = ORC_CLAMP_SB (var82.i);
+ /* 44: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var92;
+ _dest.x2[1] = var91;
+ var93.i = _dest.i;
+ }
+ /* 46: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var90;
+ _dest.x2[1] = var55;
+ var94.i = _dest.i;
+ }
+ /* 47: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var93.i;
+ _dest.x2[1] = var94.i;
+ var95.i = _dest.i;
+ }
+ /* 49: addb */
+ var57.x4[0] = var95.x4[0] + var56.x4[0];
+ var57.x4[1] = var95.x4[1] + var56.x4[1];
+ var57.x4[2] = var95.x4[2] + var56.x4[2];
+ var57.x4[3] = var95.x4[3] + var56.x4[3];
+ /* 50: storel */
+ ptr0[i] = var57;
+ }
+
+}
+
+void
+cogorc_convert_I420_BGRA_avg (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 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, "cogorc_convert_I420_BGRA_avg");
+ orc_program_set_backup_function (p, _backup_cogorc_convert_I420_BGRA_avg);
+ orc_program_add_destination (p, 4, "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, 1, 0x00000008, "c1");
+ orc_program_add_constant (p, 1, 0x00000080, "c2");
+ orc_program_add_constant (p, 4, 0x0000002a, "c3");
+ orc_program_add_constant (p, 4, 0x00000067, "c4");
+ orc_program_add_constant (p, 4, 0x00000004, "c5");
+ orc_program_add_constant (p, 4, 0x00000064, "c6");
+ orc_program_add_constant (p, 4, 0x00000068, "c7");
+ orc_program_add_constant (p, 4, 0x000000ff, "c8");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+ orc_program_add_temporary (p, 2, "t9");
+ orc_program_add_temporary (p, 2, "t10");
+ orc_program_add_temporary (p, 1, "t11");
+ orc_program_add_temporary (p, 1, "t12");
+ orc_program_add_temporary (p, 1, "t13");
+ orc_program_add_temporary (p, 4, "t14");
+
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T4, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T4, ORC_VAR_S5,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C3,
+ 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, "addssw", 0, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_T7,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C4,
+ 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, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T7,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T5, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T6, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C5,
+ 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, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10,
+ ORC_VAR_T1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C6,
+ 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, "subssw", 0, ORC_VAR_T9, ORC_VAR_T5, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C7,
+ 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, "subssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T11, ORC_VAR_T8,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T12, ORC_VAR_T9,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T13,
+ ORC_VAR_T12, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T11,
+ ORC_VAR_C8, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T14, ORC_VAR_T1,
+ ORC_VAR_T2, ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T14, ORC_VAR_C2,
+ 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
+
+
+/* cogorc_getline_I420 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var39 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var40 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var41.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var42.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var41.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_I420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var39 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var40 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var41.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var42.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var41.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_I420 (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 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, "cogorc_getline_I420");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_I420);
+ orc_program_add_destination (p, 4, "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, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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
+
+
+/* cogorc_getline_YUV9 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union64 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union32 var43;
+ orc_union32 var44;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 4: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var40 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var41 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var40;
+ _dest.x2[1] = var41;
+ var42.i = _dest.i;
+ }
+ /* 3: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var42.i;
+ var43.i = _dest.i;
+ }
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var38.x2[0];
+ var44.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var38.x2[1];
+ var44.x2[1] = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_YUV9 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union64 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union32 var43;
+ orc_union32 var44;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 4: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var40 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var41 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var40;
+ _dest.x2[1] = var41;
+ var42.i = _dest.i;
+ }
+ /* 3: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var42.i;
+ var43.i = _dest.i;
+ }
+ /* 5: loadw */
+ var38 = ptr4[i];
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var38.x2[0];
+ var44.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var38.x2[1];
+ var44.x2[1] = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var39;
+ }
+
+}
+
+void
+cogorc_getline_YUV9 (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 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, "cogorc_getline_YUV9");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_YUV9);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+ orc_program_add_temporary (p, 1, "t5");
+
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T5, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3,
+ 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
+
+
+/* cogorc_getline_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_YUY2 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_YUY2);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 2, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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
+
+
+/* cogorc_getline_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_UYVY (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var42.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var42.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var42.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_UYVY);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 2, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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
+
+
+/* cogorc_getline_YVYU */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 3: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: swapw */
+ var41.i = ORC_SWAP_W (var39.i);
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_YVYU (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 3: loadpb */
+ var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var36 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: swapw */
+ var41.i = ORC_SWAP_W (var39.i);
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var37.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_YVYU");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_YVYU);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 2, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4,
+ 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
+
+
+/* cogorc_getline_Y42B */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 3: loadpb */
+ var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr5[i];
+ /* 1: loadb */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var41.i = _dest.i;
+ }
+ /* 4: loadw */
+ var39 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var40;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_Y42B (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union64 var40;
+ orc_union16 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 3: loadpb */
+ var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var36 = ptr5[i];
+ /* 1: loadb */
+ var37 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var41.i = _dest.i;
+ }
+ /* 4: loadw */
+ var39 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var42.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var38.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var42.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var43.i = _dest.i;
+ }
+ /* 7: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 8: storeq */
+ ptr0[i] = var40;
+ }
+
+}
+
+void
+cogorc_getline_Y42B (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 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, "cogorc_getline_Y42B");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_Y42B);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_source (p, 1, "s3");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T4, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3,
+ 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
+
+
+/* cogorc_getline_Y444 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 1: loadb */
+ var35 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var39.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_Y444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ const orc_int8 *ORC_RESTRICT ptr6;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+ ptr6 = (orc_int8 *) ex->arrays[6];
+
+ /* 3: loadpb */
+ var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 1: loadb */
+ var35 = ptr6[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var34;
+ _dest.x2[1] = var35;
+ var39.i = _dest.i;
+ }
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var40.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var39.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_Y444 (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 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, "cogorc_getline_Y444");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_Y444);
+ orc_program_add_destination (p, 4, "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, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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
+
+
+/* cogorc_getline_Y800 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+ /* 0: loadpb */
+ var33 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 3: loadpw */
+ var35.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */
+
+ for (i = 0; i < n; i++) {
+ /* 1: loadb */
+ var34 = ptr4[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var37.i;
+ _dest.x2[1] = var35.i;
+ var36.i = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_Y800 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+ /* 0: loadpb */
+ var33 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 3: loadpw */
+ var35.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */
+
+ for (i = 0; i < n; i++) {
+ /* 1: loadb */
+ var34 = ptr4[i];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var33;
+ _dest.x2[1] = var34;
+ var37.i = _dest.i;
+ }
+ /* 4: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var37.i;
+ _dest.x2[1] = var35.i;
+ var36.i = _dest.i;
+ }
+ /* 5: storel */
+ ptr0[i] = var36;
+ }
+
+}
+
+void
+cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_Y800");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_Y800);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_constant (p, 2, 0x00008080, "c2");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C2,
+ 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
+
+
+/* cogorc_getline_Y16 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+ /* 2: loadpb */
+ var35 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 4: loadpw */
+ var36.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: convhwb */
+ var38 = ((orc_uint16) var34.i) >> 8;
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35;
+ _dest.x2[1] = var38;
+ var39.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var36.i;
+ var37.i = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var37;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_Y16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+ /* 2: loadpb */
+ var35 = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ /* 4: loadpw */
+ var36.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: convhwb */
+ var38 = ((orc_uint16) var34.i) >> 8;
+ /* 3: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var35;
+ _dest.x2[1] = var38;
+ var39.i = _dest.i;
+ }
+ /* 5: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var36.i;
+ var37.i = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var37;
+ }
+
+}
+
+void
+cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_Y16");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_Y16);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_constant (p, 2, 0x00008080, "c2");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+
+ orc_program_append_2 (p, "convhwb", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C2,
+ 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
+
+
+/* cogorc_getline_BGRA */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * 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: swapl */
+ var33.i = ORC_SWAP_L (var32.i);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_BGRA (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: swapl */
+ var33.i = ORC_SWAP_L (var32.i);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_BGRA");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_BGRA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "swapl", 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
+
+
+/* cogorc_getline_ABGR */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var47;
+ _dest.x2[1] = var44;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var45;
+ _dest.x2[1] = var46;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_ABGR (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var47;
+ _dest.x2[1] = var44;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var45;
+ _dest.x2[1] = var46;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_ABGR");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_ABGR);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ 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, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T8, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T7, ORC_VAR_T8,
+ 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
+
+
+/* cogorc_getline_RGBA */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var46;
+ _dest.x2[1] = var45;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44;
+ _dest.x2[1] = var47;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_RGBA (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var46;
+ _dest.x2[1] = var45;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44;
+ _dest.x2[1] = var47;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_RGBA");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_RGBA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ 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, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T8, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T7, ORC_VAR_T8,
+ 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
+
+
+/* cogorc_getline_NV12 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+
+ /* 3: loadpb */
+ var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr5[i];
+ /* 1: loadw */
+ var35 = ptr5[i];
+ /* 2: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var34.i;
+ _dest.x2[1] = var35.i;
+ var39.i = _dest.i;
+ }
+ /* 4: loadw */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_NV12 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+
+ /* 3: loadpb */
+ var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr5[i];
+ /* 1: loadw */
+ var35 = ptr5[i];
+ /* 2: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var34.i;
+ _dest.x2[1] = var35.i;
+ var39.i = _dest.i;
+ }
+ /* 4: loadw */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var40.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var40.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.x2[0];
+ _dest.x2[1] = var39.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var40.x2[1];
+ _dest.x2[1] = var39.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_NV12");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_NV12);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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
+
+
+/* cogorc_getline_NV21 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+
+ /* 3: loadpb */
+ var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr5[i];
+ /* 1: swapw */
+ var39.i = ORC_SWAP_W (var35.i);
+ /* 2: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var40.i = _dest.i;
+ }
+ /* 4: loadw */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_NV21 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+
+ /* 3: loadpb */
+ var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+ var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr5[i];
+ /* 1: swapw */
+ var39.i = ORC_SWAP_W (var35.i);
+ /* 2: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var39.i;
+ _dest.x2[1] = var39.i;
+ var40.i = _dest.i;
+ }
+ /* 4: loadw */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[0];
+ _dest.x2[1] = var37.x2[0];
+ var41.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36.x2[1];
+ _dest.x2[1] = var37.x2[1];
+ var41.x2[1] = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[0];
+ _dest.x2[1] = var40.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var41.x2[1];
+ _dest.x2[1] = var40.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storeq */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_NV21");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_NV21);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_constant (p, 1, 0x000000ff, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3,
+ 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
+
+
+/* cogorc_getline_A420 */
+#ifdef DISABLE_ORC
+void
+cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
+ const guint8 * ORC_RESTRICT s4, int n)
+{
+ int i;
+ orc_union32 *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 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var39 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var40 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var41.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr7[i];
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var42.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var41.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_getline_A420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *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 var36;
+ orc_int8 var37;
+ orc_union32 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union32 *) 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];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadupdb */
+ var39 = ptr5[i >> 1];
+ /* 1: loadupdb */
+ var40 = ptr6[i >> 1];
+ /* 2: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var39;
+ _dest.x2[1] = var40;
+ var41.i = _dest.i;
+ }
+ /* 3: loadb */
+ var36 = ptr7[i];
+ /* 4: loadb */
+ var37 = ptr4[i];
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var36;
+ _dest.x2[1] = var37;
+ var42.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var42.i;
+ _dest.x2[1] = var41.i;
+ var38.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
+ const guint8 * ORC_RESTRICT s4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_getline_A420");
+ orc_program_set_backup_function (p, _backup_cogorc_getline_A420);
+ orc_program_add_destination (p, 4, "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_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S2,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S3,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_I420 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_int8 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[0];
+ var42.x2[0] = _src.x2[1];
+ var43.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[1];
+ var42.x2[1] = _src.x2[1];
+ var43.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var39;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.x2[0];
+ var44.x2[0] = _src.x2[1];
+ var45.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var42.x2[1];
+ var44.x2[1] = _src.x2[1];
+ var45.x2[1] = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var45.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 6: avgub */
+ var40 = ((orc_uint8) var46 + (orc_uint8) var47 + 1) >> 1;
+ /* 7: storeb */
+ ptr1[i] = var40;
+ /* 8: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var48 = _src.x2[1];
+ var49 = _src.x2[0];
+ }
+ /* 9: avgub */
+ var41 = ((orc_uint8) var48 + (orc_uint8) var49 + 1) >> 1;
+ /* 10: storeb */
+ ptr2[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_I420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_int8 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[0];
+ var42.x2[0] = _src.x2[1];
+ var43.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[1];
+ var42.x2[1] = _src.x2[1];
+ var43.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var39;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.x2[0];
+ var44.x2[0] = _src.x2[1];
+ var45.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var42.x2[1];
+ var44.x2[1] = _src.x2[1];
+ var45.x2[1] = _src.x2[0];
+ }
+ /* 5: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var45.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 6: avgub */
+ var40 = ((orc_uint8) var46 + (orc_uint8) var47 + 1) >> 1;
+ /* 7: storeb */
+ ptr1[i] = var40;
+ /* 8: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var48 = _src.x2[1];
+ var49 = _src.x2[0];
+ }
+ /* 9: avgub */
+ var41 = ((orc_uint8) var48 + (orc_uint8) var49 + 1) >> 1;
+ /* 10: storeb */
+ ptr2[i] = var41;
+ }
+
+}
+
+void
+cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_I420");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_I420);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+ orc_program_add_temporary (p, 1, "t5");
+ orc_program_add_temporary (p, 1, "t6");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D2, ORC_VAR_T5, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T5, ORC_VAR_T6,
+ 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_YUY2 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_YUY2 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var43.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var43.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_YUY2");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_YUY2);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 4, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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
+
+
+/* cogorc_putline_YVYU */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: swapw */
+ var45.i = ORC_SWAP_W (var43.i);
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var45.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var45.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_YVYU (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: swapw */
+ var45.i = ORC_SWAP_W (var43.i);
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var45.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var45.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_YVYU");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_YVYU);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 4, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ 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
+
+
+/* cogorc_putline_UYVY */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var44.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var44.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_UYVY (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 4: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var44.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var44.x2[1] = _src.x2[1];
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[0];
+ _dest.x2[1] = var44.x2[0];
+ var38.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var43.x2[1];
+ _dest.x2[1] = var44.x2[1];
+ var38.x2[1] = _dest.i;
+ }
+ /* 6: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+void
+cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_UYVY");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_UYVY);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 2, "t3");
+ orc_program_add_temporary (p, 4, "t4");
+ orc_program_add_temporary (p, 4, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1,
+ 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
+
+
+/* cogorc_putline_Y42B */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_int8 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 5: storeb */
+ ptr2[i] = var37;
+ /* 6: storeb */
+ ptr1[i] = var38;
+ /* 7: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 8: storew */
+ ptr0[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_Y42B (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_int8 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var44.i;
+ var37 = _src.x2[1];
+ var38 = _src.x2[0];
+ }
+ /* 5: storeb */
+ ptr2[i] = var37;
+ /* 6: storeb */
+ ptr1[i] = var38;
+ /* 7: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 8: storew */
+ ptr0[i] = var39;
+ }
+
+}
+
+void
+cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_Y42B");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_Y42B);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_Y444 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr1 = (orc_int8 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var38.i = _src.x2[1];
+ var39.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr2[i] = var35;
+ /* 4: storeb */
+ ptr1[i] = var36;
+ /* 5: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var37 = _src.x2[1];
+ }
+ /* 6: storeb */
+ ptr0[i] = var37;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_Y444 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr1 = (orc_int8 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var38.i = _src.x2[1];
+ var39.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.i;
+ var35 = _src.x2[1];
+ var36 = _src.x2[0];
+ }
+ /* 3: storeb */
+ ptr2[i] = var35;
+ /* 4: storeb */
+ ptr1[i] = var36;
+ /* 5: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var39.i;
+ var37 = _src.x2[1];
+ }
+ /* 6: storeb */
+ ptr0[i] = var37;
+ }
+
+}
+
+void
+cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_Y444");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_Y444);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_Y800 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_Y800 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_int8 var34;
+ orc_union16 var35;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var33.i;
+ var35.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var35.i;
+ var34 = _src.x2[1];
+ }
+ /* 3: storeb */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_Y800");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_Y800);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 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;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_Y16 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var36.i;
+ var37 = _src.x2[1];
+ }
+ /* 3: convubw */
+ var38.i = (orc_uint8) var37;
+ /* 4: shlw */
+ var35.i = var38.i << 8;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_Y16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: select0lw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var36.i;
+ var37 = _src.x2[1];
+ }
+ /* 3: convubw */
+ var38.i = (orc_uint8) var37;
+ /* 4: shlw */
+ var35.i = var38.i << 8;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+void
+cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_Y16");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_Y16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant (p, 4, 0x00000008, "c1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+
+ orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
+ 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
+
+
+/* cogorc_putline_BGRA */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * 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: swapl */
+ var33.i = ORC_SWAP_L (var32.i);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_BGRA (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: swapl */
+ var33.i = ORC_SWAP_L (var32.i);
+ /* 2: storel */
+ ptr0[i] = var33;
+ }
+
+}
+
+void
+cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_BGRA");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_BGRA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+
+ orc_program_append_2 (p, "swapl", 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
+
+
+/* cogorc_putline_ABGR */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var47;
+ _dest.x2[1] = var44;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var45;
+ _dest.x2[1] = var46;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_ABGR (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var47;
+ _dest.x2[1] = var44;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var45;
+ _dest.x2[1] = var46;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var48.i;
+ _dest.x2[1] = var49.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_ABGR");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_ABGR);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ 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, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T7,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T6, ORC_VAR_T5,
+ 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
+
+
+/* cogorc_putline_RGBA */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44;
+ _dest.x2[1] = var47;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var46;
+ _dest.x2[1] = var45;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var49.i;
+ _dest.x2[1] = var48.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_RGBA (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_int8 var44;
+ orc_int8 var45;
+ orc_int8 var46;
+ orc_int8 var47;
+ orc_union16 var48;
+ orc_union16 var49;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var40 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var42.i;
+ var44 = _src.x2[1];
+ var45 = _src.x2[0];
+ }
+ /* 3: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.i;
+ var46 = _src.x2[1];
+ var47 = _src.x2[0];
+ }
+ /* 4: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44;
+ _dest.x2[1] = var47;
+ var48.i = _dest.i;
+ }
+ /* 5: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var46;
+ _dest.x2[1] = var45;
+ var49.i = _dest.i;
+ }
+ /* 6: mergewl */
+ {
+ orc_union32 _dest;
+ _dest.x2[0] = var49.i;
+ _dest.x2[1] = var48.i;
+ var41.i = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var41;
+ }
+
+}
+
+void
+cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_RGBA");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_RGBA);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ 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, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+ orc_program_add_temporary (p, 2, "t7");
+ orc_program_add_temporary (p, 2, "t8");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T8,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T7,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T6, ORC_VAR_T4, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T5, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T5, ORC_VAR_T6,
+ 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
+
+
+/* cogorc_putline_NV12 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_union16 *) d2;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var37.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var37.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var37;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var38.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var38.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 6: storew */
+ ptr1[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_NV12 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union16 var41;
+ orc_union16 var42;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_union16 *) ex->arrays[1];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var36 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[0];
+ var39.x2[0] = _src.x2[1];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var36.x2[1];
+ var39.x2[1] = _src.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var37.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var37.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var37;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var39.i;
+ var41.i = _src.x2[1];
+ var42.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var38.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1;
+ var38.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1;
+ /* 6: storew */
+ ptr1[i] = var38;
+ }
+
+}
+
+void
+cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_NV12");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_NV12);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_T4,
+ 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_D2] = d2;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_NV21 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_union16 *) d2;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var38.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var38.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var38;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 6: swapw */
+ var39.i = ORC_SWAP_W (var44.i);
+ /* 7: storew */
+ ptr1[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_NV21 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 *ORC_RESTRICT ptr1;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_union16 *) ex->arrays[1];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var37 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[0];
+ var40.x2[0] = _src.x2[1];
+ var41.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var37.x2[1];
+ var40.x2[1] = _src.x2[1];
+ var41.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[0];
+ var38.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var41.x2[1];
+ var38.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var38;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var40.i;
+ var42.i = _src.x2[1];
+ var43.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 6: swapw */
+ var39.i = ORC_SWAP_W (var44.i);
+ /* 7: storew */
+ ptr1[i] = var39;
+ }
+
+}
+
+void
+cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_NV21");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_NV21);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 2, "d2");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "swapw", 0, ORC_VAR_D2, ORC_VAR_T5, 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_D2] = d2;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* cogorc_putline_A420 */
+#ifdef DISABLE_ORC
+void
+cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_union16 *ORC_RESTRICT ptr3;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_int8 var42;
+ orc_union32 var43;
+ orc_union32 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+ orc_int8 var50;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr1 = (orc_int8 *) d2;
+ ptr2 = (orc_int8 *) d3;
+ ptr3 = (orc_union16 *) d4;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[0];
+ var43.x2[0] = _src.x2[1];
+ var44.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[1];
+ var43.x2[1] = _src.x2[1];
+ var44.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var39;
+ /* 4: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[0];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr3[i] = var40;
+ /* 6: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[0];
+ var45.x2[0] = _src.x2[1];
+ var46.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[1];
+ var45.x2[1] = _src.x2[1];
+ var46.x2[1] = _src.x2[0];
+ }
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var46.i;
+ var47 = _src.x2[1];
+ var48 = _src.x2[0];
+ }
+ /* 8: avgub */
+ var41 = ((orc_uint8) var47 + (orc_uint8) var48 + 1) >> 1;
+ /* 9: storeb */
+ ptr1[i] = var41;
+ /* 10: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var45.i;
+ var49 = _src.x2[1];
+ var50 = _src.x2[0];
+ }
+ /* 11: avgub */
+ var42 = ((orc_uint8) var49 + (orc_uint8) var50 + 1) >> 1;
+ /* 12: storeb */
+ ptr2[i] = var42;
+ }
+
+}
+
+#else
+static void
+_backup_cogorc_putline_A420 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_int8 *ORC_RESTRICT ptr1;
+ orc_int8 *ORC_RESTRICT ptr2;
+ orc_union16 *ORC_RESTRICT ptr3;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union16 var39;
+ orc_union16 var40;
+ orc_int8 var41;
+ orc_int8 var42;
+ orc_union32 var43;
+ orc_union32 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_int8 var47;
+ orc_int8 var48;
+ orc_int8 var49;
+ orc_int8 var50;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr1 = (orc_int8 *) ex->arrays[1];
+ ptr2 = (orc_int8 *) ex->arrays[2];
+ ptr3 = (orc_union16 *) ex->arrays[3];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[0];
+ var43.x2[0] = _src.x2[1];
+ var44.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union32 _src;
+ _src.i = var38.x2[1];
+ var43.x2[1] = _src.x2[1];
+ var44.x2[1] = _src.x2[0];
+ }
+ /* 2: select1wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[0];
+ var39.x2[0] = _src.x2[1];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[1];
+ var39.x2[1] = _src.x2[1];
+ }
+ /* 3: storew */
+ ptr0[i] = var39;
+ /* 4: select0wb */
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[0];
+ var40.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var44.x2[1];
+ var40.x2[1] = _src.x2[0];
+ }
+ /* 5: storew */
+ ptr3[i] = var40;
+ /* 6: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[0];
+ var45.x2[0] = _src.x2[1];
+ var46.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var43.x2[1];
+ var45.x2[1] = _src.x2[1];
+ var46.x2[1] = _src.x2[0];
+ }
+ /* 7: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var46.i;
+ var47 = _src.x2[1];
+ var48 = _src.x2[0];
+ }
+ /* 8: avgub */
+ var41 = ((orc_uint8) var47 + (orc_uint8) var48 + 1) >> 1;
+ /* 9: storeb */
+ ptr1[i] = var41;
+ /* 10: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var45.i;
+ var49 = _src.x2[1];
+ var50 = _src.x2[0];
+ }
+ /* 11: avgub */
+ var42 = ((orc_uint8) var49 + (orc_uint8) var50 + 1) >> 1;
+ /* 12: storeb */
+ ptr2[i] = var42;
+ }
+
+}
+
+void
+cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2,
+ guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static 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, "cogorc_putline_A420");
+ orc_program_set_backup_function (p, _backup_cogorc_putline_A420);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_destination (p, 1, "d2");
+ orc_program_add_destination (p, 1, "d3");
+ orc_program_add_destination (p, 2, "d4");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+ orc_program_add_temporary (p, 1, "t5");
+ orc_program_add_temporary (p, 1, "t6");
+
+ orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "select0wb", 1, ORC_VAR_D4, ORC_VAR_T1,
+ ORC_VAR_D1, ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D2, ORC_VAR_T5, ORC_VAR_T6,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T5, ORC_VAR_T6,
+ 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_D2] = d2;
+ ex->arrays[ORC_VAR_D3] = d3;
+ ex->arrays[ORC_VAR_D4] = d4;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
diff --git a/gst/videoconvert/gstvideoconvertorc-dist.h b/gst/videoconvert/gstvideoconvertorc-dist.h
new file mode 100644
index 0000000..6ba5ae6
--- /dev/null
+++ b/gst/videoconvert/gstvideoconvertorc-dist.h
@@ -0,0 +1,168 @@
+
+/* autogenerated from gstvideoconvertorc.orc */
+
+#ifndef _GSTVIDEOCONVERTORC_H_
+#define _GSTVIDEOCONVERTORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n);
+void orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n);
+void orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n);
+void orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int n);
+void orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int n);
+void orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, int n);
+void orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, int n);
+void orc_pack_123x (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int n);
+void orc_pack_x123 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int n);
+void cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n);
+void cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m);
+void cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m);
+void cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m);
+void cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_convert_I420_BGRA_avg (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 cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n);
+void cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
+void cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n);
+void cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, int n);
+void cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/videoconvert/gstvideoconvertorc.orc b/gst/videoconvert/gstvideoconvertorc.orc
new file mode 100644
index 0000000..086990e
--- /dev/null
+++ b/gst/videoconvert/gstvideoconvertorc.orc
@@ -0,0 +1,1757 @@
+
+.function cogorc_memcpy_2d
+.flags 2d
+.dest 1 d1 guint8
+.source 1 s1 guint8
+
+copyb d1, s1
+
+
+.function cogorc_downsample_horiz_cosite_1tap
+.dest 1 d1 guint8
+.source 2 s1 guint8
+
+select0wb d1, s1
+
+
+.function cogorc_downsample_horiz_cosite_3tap
+.dest 1 d1 guint8
+.source 2 s1 guint8
+.source 2 s2 guint8
+.temp 1 t1
+.temp 1 t2
+.temp 1 t3
+.temp 2 t4
+.temp 2 t5
+.temp 2 t6
+
+copyw t4, s1
+select0wb t1, t4
+select1wb t2, t4
+select0wb t3, s2
+convubw t4, t1
+convubw t5, t2
+convubw t6, t3
+mullw t5, t5, 2
+addw t4, t4, t6
+addw t4, t4, t5
+addw t4, t4, 2
+shrsw t4, t4, 2
+convsuswb d1, t4
+
+
+.function cogorc_downsample_420_jpeg
+.dest 1 d1 guint8
+.source 2 s1 guint8
+.source 2 s2 guint8
+.temp 2 t1
+.temp 1 t2
+.temp 1 t3
+.temp 1 t4
+.temp 1 t5
+
+copyw t1, s1
+select0wb t2, t1
+select1wb t3, t1
+avgub t2, t2, t3
+copyw t1, s2
+select0wb t4, t1
+select1wb t5, t1
+avgub t4, t4, t5
+avgub d1, t2, t4
+
+
+.function cogorc_downsample_vert_halfsite_2tap
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+
+avgub d1, s1, s2
+
+
+.function cogorc_downsample_vert_cosite_3tap
+.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
+mullw t2, t2, 2
+addw t1, t1, t3
+addw t1, t1, t2
+addw t1, t1, 2
+shrsw t1, t1, 2
+convsuswb d1, t1
+
+
+
+.function cogorc_downsample_vert_halfsite_4tap
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.source 1 s4 guint8
+.temp 2 t1
+.temp 2 t2
+.temp 2 t3
+.temp 2 t4
+
+convubw t1, s1
+convubw t2, s2
+convubw t3, s3
+convubw t4, s4
+addw t2, t2, t3
+mullw t2, t2, 26
+addw t1, t1, t4
+mullw t1, t1, 6
+addw t2, t2, t1
+addw t2, t2, 32
+shrsw t2, t2, 6
+convsuswb d1, t2
+
+
+.function cogorc_upsample_horiz_cosite_1tap
+.dest 2 d1 guint8 guint8
+.source 1 s1 guint8
+.temp 1 t1
+
+copyb t1, s1
+mergebw d1, t1, t1
+
+
+.function cogorc_upsample_horiz_cosite
+.dest 2 d1 guint8 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.temp 1 t1
+.temp 1 t2
+
+copyb t1, s1
+avgub t2, t1, s2
+mergebw d1, t1, t2
+
+
+.function cogorc_upsample_vert_avgub
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+
+avgub d1, s1, s2
+
+
+
+
+.function orc_unpack_yuyv_y
+.dest 1 d1 guint8
+.source 2 s1 guint8
+
+select0wb d1, s1
+
+
+.function orc_unpack_yuyv_u
+.dest 1 d1 guint8
+.source 4 s1 guint8
+.temp 2 t1
+
+select0lw t1, s1
+select1wb d1, t1
+
+
+.function orc_unpack_yuyv_v
+.dest 1 d1 guint8
+.source 4 s1 guint8
+.temp 2 t1
+
+select1lw t1, s1
+select1wb d1, t1
+
+
+.function orc_pack_yuyv
+.dest 4 d1 guint8
+.source 2 s1 guint8 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.temp 1 t1
+.temp 1 t2
+.temp 2 t3
+.temp 2 t4
+.temp 2 t5
+
+copyw t5, s1
+select0wb t1, t5
+select1wb t2, t5
+mergebw t3, t1, s2
+mergebw t4, t2, s3
+mergewl d1, t3, t4
+
+
+.function orc_unpack_uyvy_y
+.dest 1 d1 guint8
+.source 2 s1 guint8
+
+select1wb d1, s1
+
+
+.function orc_unpack_uyvy_u
+.dest 1 d1 guint8
+.source 4 s1 guint8
+.temp 2 t1
+
+select0lw t1, s1
+select0wb d1, t1
+
+
+.function orc_unpack_uyvy_v
+.dest 1 d1 guint8
+.source 4 s1 guint8
+.temp 2 t1
+
+select1lw t1, s1
+select0wb d1, t1
+
+
+.function orc_pack_uyvy
+.dest 4 d1 guint8
+.source 2 s1 guint8 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.temp 1 t1
+.temp 1 t2
+.temp 2 t3
+.temp 2 t4
+.temp 2 t5
+
+copyw t5, s1
+select0wb t1, t5
+select1wb t2, t5
+mergebw t3, s2, t1
+mergebw t4, s3, t2
+mergewl d1, t3, t4
+
+
+.function orc_matrix2_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.param 2 p1
+.param 2 p2
+.param 2 p3
+.temp 2 t1
+.temp 2 t2
+
+convubw t1, s1
+mullw t1, t1, p1
+convubw t2, s2
+mullw t2, t2, p2
+addw t1, t1, t2
+addw t1, t1, p3
+shrsw t1, t1, 6
+convsuswb d1, t1
+
+
+.function orc_matrix2_11_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.param 2 p1
+.param 2 p2
+.temp 2 t1
+.temp 2 t2
+.temp 2 t3
+.temp 2 t4
+
+convubw t1, s1
+subw t1, t1, 16
+mullw t3, t1, p1
+convubw t2, s2
+subw t2, t2, 128
+mullw t4, t2, p2
+addw t3, t3, t4
+addw t3, t3, 128
+shrsw t3, t3, 8
+addw t3, t3, t1
+addw t3, t3, t2
+convsuswb d1, t3
+
+
+.function orc_matrix2_12_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.param 2 p1
+.param 2 p2
+.temp 2 t1
+.temp 2 t2
+.temp 2 t3
+.temp 2 t4
+
+convubw t1, s1
+subw t1, t1, 16
+mullw t3, t1, p1
+convubw t2, s2
+subw t2, t2, 128
+mullw t4, t2, p2
+addw t3, t3, t4
+addw t3, t3, 128
+shrsw t3, t3, 8
+addw t3, t3, t1
+addw t3, t3, t2
+addw t3, t3, t2
+convsuswb d1, t3
+
+
+.function orc_matrix3_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.source 1 s3 guint8 guint8
+.param 2 p1
+.param 2 p2
+.param 2 p3
+.param 2 p4
+.temp 2 t1
+.temp 2 t2
+
+convubw t1, s1
+mullw t1, t1, p1
+convubw t2, s2
+mullw t2, t2, p2
+addw t1, t1, t2
+convubw t2, s3
+mullw t2, t2, p3
+addw t1, t1, t2
+addw t1, t1, p4
+shrsw t1, t1, 6
+convsuswb d1, t1
+
+
+.function orc_matrix3_100_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.source 1 s3 guint8 guint8
+.param 2 p1
+.param 2 p2
+.param 2 p3
+.temp 2 t1
+.temp 2 t2
+.temp 2 t3
+#.temp 2 t4
+
+convubw t1, s1
+subw t1, t1, 16
+mullw t3, t1, p1
+convubw t2, s2
+subw t2, t2, 128
+mullw t2, t2, p2
+addw t3, t3, t2
+convubw t2, s3
+subw t2, t2, 128
+mullw t2, t2, p3
+addw t3, t3, t2
+addw t3, t3, 128
+shrsw t3, t3, 8
+addw t3, t3, t1
+convsuswb d1, t3
+
+
+.function orc_matrix3_100_offset_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.source 1 s3 guint8 guint8
+.param 2 p1
+.param 2 p2
+.param 2 p3
+.param 2 p4
+.param 2 p5
+#.param 2 p6
+.temp 2 t1
+.temp 2 t2
+.temp 2 t3
+#.temp 2 t3
+#.temp 2 t4
+
+convubw t3, s1
+mullw t1, t3, p1
+convubw t2, s2
+mullw t2, t2, p2
+addw t1, t1, t2
+convubw t2, s3
+mullw t2, t2, p3
+addw t1, t1, t2
+addw t1, t1, p4
+shrsw t1, t1, p5
+#addw t1, t1, p6
+addw t1, t1, t3
+convsuswb d1, t1
+
+
+
+.function orc_matrix3_000_u8
+.dest 1 d1 guint8 guint8
+.source 1 s1 guint8 guint8
+.source 1 s2 guint8 guint8
+.source 1 s3 guint8 guint8
+.param 2 p1
+.param 2 p2
+.param 2 p3
+.param 2 p4
+.param 2 p5
+#.param 2 p6
+.temp 2 t1
+.temp 2 t2
+#.temp 2 t3
+#.temp 2 t4
+
+convubw t1, s1
+mullw t1, t1, p1
+convubw t2, s2
+mullw t2, t2, p2
+addw t1, t1, t2
+convubw t2, s3
+mullw t2, t2, p3
+addw t1, t1, t2
+addw t1, t1, p4
+shrsw t1, t1, p5
+#addw t1, t1, p6
+convwb d1, t1
+
+
+
+.function orc_pack_123x
+.dest 4 d1 guint32 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.param 1 p1
+.temp 2 t1
+.temp 2 t2
+
+mergebw t1, s1, s2
+mergebw t2, s3, p1
+mergewl d1, t1, t2
+
+
+.function orc_pack_x123
+.dest 4 d1 guint32 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.param 1 p1
+.temp 2 t1
+.temp 2 t2
+
+mergebw t1, p1, s1
+mergebw t2, s2, s3
+mergewl d1, t1, t2
+
+
+.function cogorc_combine2_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.param 2 p1
+.param 2 p2
+.temp 2 t1
+.temp 2 t2
+
+convubw t1, s1
+mullw t1, t1, p1
+convubw t2, s2
+mullw t2, t2, p2
+addw t1, t1, t2
+shruw t1, t1, 8
+convsuswb d1, t1
+
+
+.function cogorc_convert_I420_UYVY
+.dest 4 d1 guint8
+.dest 4 d2 guint8
+.source 2 y1 guint8
+.source 2 y2 guint8
+.source 1 u guint8
+.source 1 v guint8
+.temp 2 uv
+
+mergebw uv, u, v
+x2 mergebw d1, uv, y1
+x2 mergebw d2, uv, y2
+
+
+.function cogorc_convert_I420_YUY2
+.dest 4 d1 guint8
+.dest 4 d2 guint8
+.source 2 y1 guint8
+.source 2 y2 guint8
+.source 1 u guint8
+.source 1 v guint8
+.temp 2 uv
+
+mergebw uv, u, v
+x2 mergebw d1, y1, uv
+x2 mergebw d2, y2, uv
+
+
+
+.function cogorc_convert_I420_AYUV
+.dest 4 d1 guint8
+.dest 4 d2 guint8
+.source 1 y1 guint8
+.source 1 y2 guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+.temp 1 tu
+.temp 1 tv
+
+loadupdb tu, u
+loadupdb tv, v
+mergebw uv, tu, tv
+mergebw ay, c255, y1
+mergewl d1, ay, uv
+mergebw ay, c255, y2
+mergewl d2, ay, uv
+
+
+.function cogorc_convert_YUY2_I420
+.dest 2 y1 guint8
+.dest 2 y2 guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 yuv1 guint8
+.source 4 yuv2 guint8
+.temp 2 t1
+.temp 2 t2
+.temp 2 ty
+
+x2 splitwb t1, ty, yuv1
+storew y1, ty
+x2 splitwb t2, ty, yuv2
+storew y2, ty
+x2 avgub t1, t1, t2
+splitwb v, u, t1
+
+
+.function cogorc_convert_UYVY_YUY2
+.flags 2d
+.dest 4 yuy2 guint8
+.source 4 uyvy guint8
+
+x2 swapw yuy2, uyvy
+
+
+.function cogorc_planar_chroma_420_422
+.flags 2d
+.dest 1 d1 guint8
+.dest 1 d2 guint8
+.source 1 s guint8
+
+copyb d1, s
+copyb d2, s
+
+
+.function cogorc_planar_chroma_420_444
+.flags 2d
+.dest 2 d1 guint8
+.dest 2 d2 guint8
+.source 1 s guint8
+.temp 2 t
+
+splatbw t, s
+storew d1, t
+storew d2, t
+
+
+.function cogorc_planar_chroma_422_444
+.flags 2d
+.dest 2 d1 guint8
+.source 1 s guint8
+.temp 2 t
+
+splatbw t, s
+storew d1, t
+
+
+.function cogorc_planar_chroma_444_422
+.flags 2d
+.dest 1 d guint8
+.source 2 s guint8
+.temp 1 t1
+.temp 1 t2
+
+splitwb t1, t2, s
+avgub d, t1, t2
+
+
+.function cogorc_planar_chroma_444_420
+.flags 2d
+.dest 1 d guint8
+.source 2 s1 guint8
+.source 2 s2 guint8
+.temp 2 t
+.temp 1 t1
+.temp 1 t2
+
+x2 avgub t, s1, s2
+splitwb t1, t2, t
+avgub d, t1, t2
+
+
+.function cogorc_planar_chroma_422_420
+.flags 2d
+.dest 1 d guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+
+avgub d, s1, s2
+
+
+.function cogorc_convert_YUY2_AYUV
+.flags 2d
+.dest 8 ayuv guint8
+.source 4 yuy2 guint8
+.const 2 c255 0xff
+.temp 2 yy
+.temp 2 uv
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitwb uv, yy, yuy2
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_convert_UYVY_AYUV
+.flags 2d
+.dest 8 ayuv guint8
+.source 4 uyvy guint8
+.const 2 c255 0xff
+.temp 2 yy
+.temp 2 uv
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitwb yy, uv, uyvy
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_convert_YUY2_Y42B
+.flags 2d
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 yuy2 guint8
+.temp 2 uv
+
+x2 splitwb uv, y, yuy2
+splitwb v, u, uv
+
+
+.function cogorc_convert_UYVY_Y42B
+.flags 2d
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 uyvy guint8
+.temp 2 uv
+
+x2 splitwb y, uv, uyvy
+splitwb v, u, uv
+
+
+.function cogorc_convert_YUY2_Y444
+.flags 2d
+.dest 2 y guint8
+.dest 2 uu guint8
+.dest 2 vv guint8
+.source 4 yuy2 guint8
+.temp 2 uv
+.temp 1 u
+.temp 1 v
+
+x2 splitwb uv, y, yuy2
+splitwb v, u, uv
+splatbw uu, u
+splatbw vv, v
+
+
+.function cogorc_convert_UYVY_Y444
+.flags 2d
+.dest 2 y guint8
+.dest 2 uu guint8
+.dest 2 vv guint8
+.source 4 uyvy guint8
+.temp 2 uv
+.temp 1 u
+.temp 1 v
+
+x2 splitwb y, uv, uyvy
+splitwb v, u, uv
+splatbw uu, u
+splatbw vv, v
+
+
+.function cogorc_convert_UYVY_I420
+.dest 2 y1 guint8
+.dest 2 y2 guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 yuv1 guint8
+.source 4 yuv2 guint8
+.temp 2 t1
+.temp 2 t2
+.temp 2 ty
+
+x2 splitwb ty, t1, yuv1
+storew y1, ty
+x2 splitwb ty, t2, yuv2
+storew y2, ty
+x2 avgub t1, t1, t2
+splitwb v, u, t1
+
+
+
+.function cogorc_convert_AYUV_I420
+.flags 2d
+.dest 2 y1 guint8
+.dest 2 y2 guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 8 ayuv1 guint8
+.source 8 ayuv2 guint8
+.temp 4 ay
+.temp 4 uv1
+.temp 4 uv2
+.temp 4 uv
+.temp 2 uu
+.temp 2 vv
+.temp 1 t1
+.temp 1 t2
+
+x2 splitlw uv1, ay, ayuv1
+x2 select1wb y1, ay
+x2 splitlw uv2, ay, ayuv2
+x2 select1wb y2, ay
+x4 avgub uv, uv1, uv2
+x2 splitwb vv, uu, uv
+splitwb t1, t2, uu
+avgub u, t1, t2
+splitwb t1, t2, vv
+avgub v, t1, t2
+
+
+
+.function cogorc_convert_AYUV_YUY2
+.flags 2d
+.dest 4 yuy2 guint8
+.source 8 ayuv guint8
+.temp 2 yy
+.temp 2 uv1
+.temp 2 uv2
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+x2 select1wb yy, ayay
+x2 mergebw yuy2, yy, uv1
+
+
+.function cogorc_convert_AYUV_UYVY
+.flags 2d
+.dest 4 yuy2 guint8
+.source 8 ayuv guint8
+.temp 2 yy
+.temp 2 uv1
+.temp 2 uv2
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+x2 select1wb yy, ayay
+x2 mergebw yuy2, uv1, yy
+
+
+
+.function cogorc_convert_AYUV_Y42B
+.flags 2d
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 8 ayuv guint8
+.temp 4 ayay
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+splitwb v, u, uv1
+x2 select1wb y, ayay
+
+
+.function cogorc_convert_AYUV_Y444
+.flags 2d
+.dest 1 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 ayuv guint8
+.temp 2 ay
+.temp 2 uv
+
+splitlw uv, ay, ayuv
+splitwb v, u, uv
+select1wb y, ay
+
+
+.function cogorc_convert_Y42B_YUY2
+.flags 2d
+.dest 4 yuy2 guint8
+.source 2 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.temp 2 uv
+
+mergebw uv, u, v
+x2 mergebw yuy2, y, uv
+
+
+.function cogorc_convert_Y42B_UYVY
+.flags 2d
+.dest 4 uyvy guint8
+.source 2 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.temp 2 uv
+
+mergebw uv, u, v
+x2 mergebw uyvy, uv, y
+
+
+.function cogorc_convert_Y42B_AYUV
+.flags 2d
+.dest 8 ayuv guint8
+.source 2 yy guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+.temp 4 uvuv
+.temp 4 ayay
+
+mergebw uv, u, v
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_convert_Y444_YUY2
+.flags 2d
+.dest 4 yuy2 guint8
+.source 2 y guint8
+.source 2 u guint8
+.source 2 v guint8
+.temp 2 uv
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+
+x2 mergebw uvuv, u, v
+splitlw uv1, uv2, uvuv
+x2 avgub uv, uv1, uv2
+x2 mergebw yuy2, y, uv
+
+
+.function cogorc_convert_Y444_UYVY
+.flags 2d
+.dest 4 uyvy guint8
+.source 2 y guint8
+.source 2 u guint8
+.source 2 v guint8
+.temp 2 uv
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+
+x2 mergebw uvuv, u, v
+splitlw uv1, uv2, uvuv
+x2 avgub uv, uv1, uv2
+x2 mergebw uyvy, uv, y
+
+
+.function cogorc_convert_Y444_AYUV
+.flags 2d
+.dest 4 ayuv guint8
+.source 1 yy guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+
+mergebw uv, u, v
+mergebw ay, c255, yy
+mergewl ayuv, ay, uv
+
+
+
+.function cogorc_convert_AYUV_ARGB
+.flags 2d
+.dest 4 argb guint8
+.source 4 ayuv guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 a
+.temp 1 y
+.temp 1 u
+.temp 1 v
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+
+x4 subb x, ayuv, 128
+splitlw t1, t2, x
+splitwb y, a, t2
+splitwb v, u, t1
+convsbw wy, y
+convsbw wu, u
+convsbw wv, v
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, a, r
+mergebw t2, g, b
+mergewl x, t1, t2
+x4 addb argb, x, 128
+
+
+
+.function cogorc_convert_AYUV_BGRA
+.flags 2d
+.dest 4 argb guint8
+.source 4 ayuv guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 a
+.temp 1 y
+.temp 1 u
+.temp 1 v
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+
+x4 subb x, ayuv, 128
+splitlw t1, t2, x
+splitwb y, a, t2
+splitwb v, u, t1
+convsbw wy, y
+convsbw wu, u
+convsbw wv, v
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, b, g
+mergebw t2, r, a
+mergewl x, t1, t2
+x4 addb argb, x, 128
+
+
+
+
+.function cogorc_convert_AYUV_ABGR
+.flags 2d
+.dest 4 argb guint8
+.source 4 ayuv guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 a
+.temp 1 y
+.temp 1 u
+.temp 1 v
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+
+x4 subb x, ayuv, 128
+splitlw t1, t2, x
+splitwb y, a, t2
+splitwb v, u, t1
+convsbw wy, y
+convsbw wu, u
+convsbw wv, v
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, a, b
+mergebw t2, g, r
+mergewl x, t1, t2
+x4 addb argb, x, 128
+
+
+
+.function cogorc_convert_AYUV_RGBA
+.flags 2d
+.dest 4 argb guint8
+.source 4 ayuv guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 a
+.temp 1 y
+.temp 1 u
+.temp 1 v
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+
+x4 subb x, ayuv, 128
+splitlw t1, t2, x
+splitwb y, a, t2
+splitwb v, u, t1
+convsbw wy, y
+convsbw wu, u
+convsbw wv, v
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, r, g
+mergebw t2, b, a
+mergewl x, t1, t2
+x4 addb argb, x, 128
+
+
+
+.function cogorc_convert_I420_BGRA
+.dest 4 argb guint8
+.source 1 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 t3
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+.const 1 c128 128
+
+subb t3, y, c128
+convsbw wy, t3
+loadupib t3, u
+subb t3, t3, c128
+convsbw wu, t3
+loadupib t3, v
+subb t3, t3, c128
+convsbw wv, t3
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, b, g
+mergebw t2, r, 255
+mergewl x, t1, t2
+x4 addb argb, x, c128
+
+
+
+.function cogorc_convert_I420_BGRA_avg
+.dest 4 argb guint8
+.source 1 y guint8
+.source 1 u1 guint8
+.source 1 u2 guint8
+.source 1 v1 guint8
+.source 1 v2 guint8
+.temp 2 t1
+.temp 2 t2
+.temp 1 t3
+.temp 1 t4
+.temp 2 wy
+.temp 2 wu
+.temp 2 wv
+.temp 2 wr
+.temp 2 wg
+.temp 2 wb
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 4 x
+.const 1 c8 8
+.const 1 c128 128
+
+subb t3, y, c128
+convsbw wy, t3
+loadupib t3, u1
+loadupib t4, u2
+avgub t3, t3, t4
+subb t3, t3, c128
+convsbw wu, t3
+loadupib t3, v1
+loadupib t4, v2
+avgub t3, t3, t4
+subb t3, t3, c128
+convsbw wv, t3
+
+mullw t1, wy, 42
+shrsw t1, t1, c8
+addssw wy, wy, t1
+
+addssw wr, wy, wv
+mullw t1, wv, 103
+shrsw t1, t1, c8
+subssw wr, wr, t1
+addssw wr, wr, wv
+
+addssw wb, wy, wu
+addssw wb, wb, wu
+mullw t1, wu, 4
+shrsw t1, t1, c8
+addssw wb, wb, t1
+
+mullw t1, wu, 100
+shrsw t1, t1, c8
+subssw wg, wy, t1
+mullw t1, wv, 104
+shrsw t1, t1, c8
+subssw wg, wg, t1
+subssw wg, wg, t1
+
+convssswb r, wr
+convssswb g, wg
+convssswb b, wb
+
+mergebw t1, b, g
+mergebw t2, r, 255
+mergewl x, t1, t2
+x4 addb argb, x, c128
+
+
+
+.function cogorc_getline_I420
+.dest 4 d guint8
+.source 1 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+.temp 1 tu
+.temp 1 tv
+
+loadupdb tu, u
+loadupdb tv, v
+mergebw uv, tu, tv
+mergebw ay, c255, y
+mergewl d, ay, uv
+
+.function cogorc_getline_YUV9
+.dest 8 d guint8
+.source 2 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 tuv
+.temp 4 ay
+.temp 4 uv
+.temp 1 tu
+.temp 1 tv
+
+loadupdb tu, u
+loadupdb tv, v
+mergebw tuv, tu, tv
+mergewl uv, tuv, tuv
+x2 mergebw ay, c255, y
+x2 mergewl d, ay, uv
+
+.function cogorc_getline_YUY2
+.dest 8 ayuv guint8
+.source 4 yuy2 guint8
+.const 2 c255 0xff
+.temp 2 yy
+.temp 2 uv
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitwb uv, yy, yuy2
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_getline_UYVY
+.dest 8 ayuv guint8
+.source 4 uyvy guint8
+.const 2 c255 0xff
+.temp 2 yy
+.temp 2 uv
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitwb yy, uv, uyvy
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_getline_YVYU
+.dest 8 ayuv guint8
+.source 4 uyvy guint8
+.const 2 c255 0xff
+.temp 2 yy
+.temp 2 uv
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitwb uv, yy, uyvy
+swapw uv, uv
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_getline_Y42B
+.dest 8 ayuv guint8
+.source 2 yy guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+.temp 4 uvuv
+.temp 4 ayay
+
+mergebw uv, u, v
+x2 mergebw ayay, c255, yy
+mergewl uvuv, uv, uv
+x2 mergewl ayuv, ayay, uvuv
+
+
+.function cogorc_getline_Y444
+.dest 4 ayuv guint8
+.source 1 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 2 ay
+
+mergebw uv, u, v
+mergebw ay, c255, y
+mergewl ayuv, ay, uv
+
+
+.function cogorc_getline_Y800
+.dest 4 ayuv guint8
+.source 1 y guint8
+.const 1 c255 255
+.const 2 c0x8080 0x8080
+.temp 2 ay
+
+mergebw ay, c255, y
+mergewl ayuv, ay, c0x8080
+
+.function cogorc_getline_Y16
+.dest 4 ayuv guint8
+.source 2 y guint8
+.const 1 c255 255
+.const 2 c0x8080 0x8080
+.temp 2 ay
+.temp 1 yb
+
+convhwb yb, y
+mergebw ay, c255, yb
+mergewl ayuv, ay, c0x8080
+
+.function cogorc_getline_BGRA
+.dest 4 argb guint8
+.source 4 bgra guint8
+
+swapl argb, bgra
+
+
+.function cogorc_getline_ABGR
+.dest 4 argb guint8
+.source 4 abgr guint8
+.temp 1 a
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 2 gr
+.temp 2 ab
+.temp 2 ar
+.temp 2 gb
+
+splitlw gr, ab, abgr
+splitwb r, g, gr
+splitwb b, a, ab
+mergebw ar, a, r
+mergebw gb, g, b
+mergewl argb, ar, gb
+
+
+.function cogorc_getline_RGBA
+.dest 4 argb guint8
+.source 4 rgba guint8
+.temp 1 a
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 2 rg
+.temp 2 ba
+.temp 2 ar
+.temp 2 gb
+
+splitlw ba, rg, rgba
+splitwb g, r, rg
+splitwb a, b, ba
+mergebw ar, a, r
+mergebw gb, g, b
+mergewl argb, ar, gb
+
+
+.function cogorc_getline_NV12
+.dest 8 d guint8
+.source 2 y guint8
+.source 2 uv guint8
+.const 1 c255 255
+.temp 4 ay
+.temp 4 uvuv
+
+mergewl uvuv, uv, uv
+x2 mergebw ay, c255, y
+x2 mergewl d, ay, uvuv
+
+
+.function cogorc_getline_NV21
+.dest 8 d guint8
+.source 2 y guint8
+.source 2 vu guint8
+.const 1 c255 255
+.temp 2 uv
+.temp 4 ay
+.temp 4 uvuv
+
+swapw uv, vu
+mergewl uvuv, uv, uv
+x2 mergebw ay, c255, y
+x2 mergewl d, ay, uvuv
+
+.function cogorc_getline_A420
+.dest 4 d guint8
+.source 1 y guint8
+.source 1 u guint8
+.source 1 v guint8
+.source 1 a guint8
+.temp 2 uv
+.temp 2 ay
+.temp 1 tu
+.temp 1 tv
+
+loadupdb tu, u
+loadupdb tv, v
+mergebw uv, tu, tv
+mergebw ay, a, y
+mergewl d, ay, uv
+
+.function cogorc_putline_I420
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 8 ayuv guint8
+.temp 4 ay
+.temp 4 uv
+.temp 2 uu
+.temp 2 vv
+.temp 1 t1
+.temp 1 t2
+
+x2 splitlw uv, ay, ayuv
+x2 select1wb y, ay
+x2 splitwb vv, uu, uv
+splitwb t1, t2, uu
+avgub u, t1, t2
+splitwb t1, t2, vv
+avgub v, t1, t2
+
+
+
+.function cogorc_putline_YUY2
+.dest 4 yuy2 guint8
+.source 8 ayuv guint8
+.temp 2 yy
+.temp 2 uv1
+.temp 2 uv2
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+x2 select1wb yy, ayay
+x2 mergebw yuy2, yy, uv1
+
+
+.function cogorc_putline_YVYU
+.dest 4 yuy2 guint8
+.source 8 ayuv guint8
+.temp 2 yy
+.temp 2 uv1
+.temp 2 uv2
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+x2 select1wb yy, ayay
+swapw uv1, uv1
+x2 mergebw yuy2, yy, uv1
+
+
+.function cogorc_putline_UYVY
+.dest 4 yuy2 guint8
+.source 8 ayuv guint8
+.temp 2 yy
+.temp 2 uv1
+.temp 2 uv2
+.temp 4 ayay
+.temp 4 uvuv
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+x2 select1wb yy, ayay
+x2 mergebw yuy2, uv1, yy
+
+
+
+.function cogorc_putline_Y42B
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 8 ayuv guint8
+.temp 4 ayay
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+
+x2 splitlw uvuv, ayay, ayuv
+splitlw uv1, uv2, uvuv
+x2 avgub uv1, uv1, uv2
+splitwb v, u, uv1
+x2 select1wb y, ayay
+
+
+.function cogorc_putline_Y444
+.dest 1 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.source 4 ayuv guint8
+.temp 2 ay
+.temp 2 uv
+
+splitlw uv, ay, ayuv
+splitwb v, u, uv
+select1wb y, ay
+
+
+.function cogorc_putline_Y800
+.dest 1 y guint8
+.source 4 ayuv guint8
+.temp 2 ay
+
+select0lw ay, ayuv
+select1wb y, ay
+
+.function cogorc_putline_Y16
+.dest 2 y guint8
+.source 4 ayuv guint8
+.temp 2 ay
+.temp 1 yb
+
+select0lw ay, ayuv
+select1wb yb, ay
+convubw ay, yb
+shlw y, ay, 8
+
+.function cogorc_putline_BGRA
+.dest 4 bgra guint8
+.source 4 argb guint8
+
+swapl bgra, argb
+
+
+.function cogorc_putline_ABGR
+.dest 4 abgr guint8
+.source 4 argb guint8
+.temp 1 a
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 2 gr
+.temp 2 ab
+.temp 2 ar
+.temp 2 gb
+
+splitlw gb, ar, argb
+splitwb b, g, gb
+splitwb r, a, ar
+mergebw ab, a, b
+mergebw gr, g, r
+mergewl abgr, ab, gr
+
+
+.function cogorc_putline_RGBA
+.dest 4 rgba guint8
+.source 4 argb guint8
+.temp 1 a
+.temp 1 r
+.temp 1 g
+.temp 1 b
+.temp 2 rg
+.temp 2 ba
+.temp 2 ar
+.temp 2 gb
+
+splitlw gb, ar, argb
+splitwb b, g, gb
+splitwb r, a, ar
+mergebw ba, b, a
+mergebw rg, r, g
+mergewl rgba, rg, ba
+
+
+.function cogorc_putline_NV12
+.dest 2 y guint8
+.dest 2 uv guint8
+.source 8 ayuv guint8
+.temp 4 ay
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+
+x2 splitlw uvuv, ay, ayuv
+x2 select1wb y, ay
+splitlw uv1, uv2, uvuv
+x2 avgub uv, uv1, uv2
+
+
+.function cogorc_putline_NV21
+.dest 2 y guint8
+.dest 2 vu guint8
+.source 8 ayuv guint8
+.temp 4 ay
+.temp 4 uvuv
+.temp 2 uv1
+.temp 2 uv2
+.temp 2 uv
+
+x2 splitlw uvuv, ay, ayuv
+x2 select1wb y, ay
+splitlw uv1, uv2, uvuv
+x2 avgub uv, uv1, uv2
+swapw vu, uv
+
+.function cogorc_putline_A420
+.dest 2 y guint8
+.dest 1 u guint8
+.dest 1 v guint8
+.dest 2 a guint8
+.source 8 ayuv guint8
+.temp 4 ay
+.temp 4 uv
+.temp 2 uu
+.temp 2 vv
+.temp 1 t1
+.temp 1 t2
+
+x2 splitlw uv, ay, ayuv
+x2 select1wb y, ay
+x2 select0wb a, ay
+x2 splitwb vv, uu, uv
+splitwb t1, t2, uu
+avgub u, t1, t2
+splitwb t1, t2, vv
+avgub v, t1, t2
diff --git a/gst/videoconvert/videoconvert.c b/gst/videoconvert/videoconvert.c
new file mode 100644
index 0000000..690d4e0
--- /dev/null
+++ b/gst/videoconvert/videoconvert.c
@@ -0,0 +1,2386 @@
+/* GStreamer
+ * Copyright (C) 2010 David Schleef <ds@schleef.org>
+ * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "videoconvert.h"
+#include <glib.h>
+#include <string.h>
+#include "gstvideoconvertorc.h"
+
+
+static void videoconvert_convert_generic (VideoConvert * convert,
+ GstVideoFrame * dest, const GstVideoFrame * src);
+static void videoconvert_convert_lookup_fastpath (VideoConvert * convert);
+static void videoconvert_convert_lookup_getput (VideoConvert * convert);
+static void videoconvert_dither_none (VideoConvert * convert, int j);
+static void videoconvert_dither_verterr (VideoConvert * convert, int j);
+static void videoconvert_dither_halftone (VideoConvert * convert, int j);
+
+
+VideoConvert *
+videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec,
+ GstVideoFormat from_format, ColorSpaceColorSpec from_spec,
+ int width, int height)
+{
+ const GstVideoFormatInfo *to_info, *from_info;
+ VideoConvert *convert;
+ int i;
+
+ from_info = gst_video_format_get_info (from_format);
+ to_info = gst_video_format_get_info (to_format);
+
+ g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (to_info)
+ || to_spec == COLOR_SPEC_RGB, NULL);
+ g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (to_info)
+ || to_spec == COLOR_SPEC_YUV_BT709
+ || to_spec == COLOR_SPEC_YUV_BT470_6, NULL);
+ g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (to_info)
+ || GST_VIDEO_FORMAT_INFO_IS_YUV (to_info)
+ || (GST_VIDEO_FORMAT_INFO_IS_GRAY (to_info) &&
+ to_spec == COLOR_SPEC_GRAY), NULL);
+
+ g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (from_info)
+ || from_spec == COLOR_SPEC_RGB, NULL);
+ g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (from_info)
+ || from_spec == COLOR_SPEC_YUV_BT709
+ || from_spec == COLOR_SPEC_YUV_BT470_6, NULL);
+ g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (from_info)
+ || GST_VIDEO_FORMAT_INFO_IS_YUV (from_info)
+ || (GST_VIDEO_FORMAT_INFO_IS_GRAY (from_info) &&
+ from_spec == COLOR_SPEC_GRAY), NULL);
+
+ convert = g_malloc (sizeof (VideoConvert));
+ memset (convert, 0, sizeof (VideoConvert));
+
+ convert->to_format = to_format;
+ convert->to_spec = to_spec;
+ convert->from_format = from_format;
+ convert->from_spec = from_spec;
+ convert->height = height;
+ convert->width = width;
+ convert->convert = videoconvert_convert_generic;
+ convert->dither16 = videoconvert_dither_none;
+
+ if (to_info->depth[0] > 8 || from_info->depth[0] > 8) {
+ convert->use_16bit = TRUE;
+ } else {
+ convert->use_16bit = FALSE;
+ }
+
+ videoconvert_convert_lookup_fastpath (convert);
+ videoconvert_convert_lookup_getput (convert);
+
+ convert->tmpline = g_malloc (sizeof (guint8) * (width + 8) * 4);
+ convert->tmpline16 = g_malloc (sizeof (guint16) * (width + 8) * 4);
+ convert->errline = g_malloc (sizeof (guint16) * width * 4);
+
+ if (to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
+ /* build poor man's palette, taken from ffmpegcolorspace */
+ static const guint8 pal_value[6] = { 0x00, 0x33, 0x66, 0x99, 0xcc, 0xff };
+ guint32 *palette;
+ gint r, g, b;
+
+ convert->palette = palette = g_new (guint32, 256);
+ i = 0;
+ for (r = 0; r < 6; r++) {
+ for (g = 0; g < 6; g++) {
+ for (b = 0; b < 6; b++) {
+ palette[i++] =
+ (0xffU << 24) | (pal_value[r] << 16) | (pal_value[g] << 8) |
+ pal_value[b];
+ }
+ }
+ }
+ palette[i++] = 0; /* 100% transparent, i == 6*6*6 */
+ while (i < 256)
+ palette[i++] = 0xff000000;
+ }
+
+ return convert;
+}
+
+void
+videoconvert_convert_free (VideoConvert * convert)
+{
+ g_free (convert->palette);
+ g_free (convert->tmpline);
+ g_free (convert->tmpline16);
+ g_free (convert->errline);
+
+ g_free (convert);
+}
+
+void
+videoconvert_convert_set_interlaced (VideoConvert * convert,
+ gboolean interlaced)
+{
+ convert->interlaced = interlaced;
+}
+
+void
+videoconvert_convert_set_dither (VideoConvert * convert, int type)
+{
+ switch (type) {
+ case 0:
+ default:
+ convert->dither16 = videoconvert_dither_none;
+ break;
+ case 1:
+ convert->dither16 = videoconvert_dither_verterr;
+ break;
+ case 2:
+ convert->dither16 = videoconvert_dither_halftone;
+ break;
+ }
+}
+
+void
+videoconvert_convert_set_palette (VideoConvert * convert,
+ const guint32 * palette)
+{
+ if (convert->palette == NULL) {
+ convert->palette = g_malloc (sizeof (guint32) * 256);
+ }
+ memcpy (convert->palette, palette, sizeof (guint32) * 256);
+}
+
+const guint32 *
+videoconvert_convert_get_palette (VideoConvert * convert)
+{
+ return convert->palette;
+}
+
+void
+videoconvert_convert_convert (VideoConvert * convert,
+ GstVideoFrame * dest, const GstVideoFrame * src)
+{
+ convert->convert (convert, dest, src);
+}
+
+/* Line conversion to AYUV */
+
+#define FRAME_GET_STRIDE(dir, comp) \
+ ((dir)->info.stride[comp])
+#define FRAME_GET_LINE(dir, comp, line) \
+ (((guint8*)(dir)->data[comp]) + FRAME_GET_STRIDE (dir, comp) * (line))
+
+static void
+getline_I420 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_I420 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j >> 1),
+ FRAME_GET_LINE (src, 2, j >> 1), convert->width);
+}
+
+static void
+putline_I420 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_I420 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j >> 1),
+ FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2);
+}
+
+static void
+getline_YV12 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_I420 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j >> 1),
+ FRAME_GET_LINE (src, 2, j >> 1), convert->width);
+}
+
+static void
+putline_YV12 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_I420 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j >> 1),
+ FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2);
+}
+
+static void
+getline_YUY2 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_YUY2 (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2);
+}
+
+static void
+putline_YUY2 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_YUY2 (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2);
+}
+
+static void
+getline_UYVY (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_UYVY (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2);
+}
+
+static void
+putline_UYVY (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_UYVY (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2);
+}
+
+static void
+getline_YVYU (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_YVYU (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2);
+}
+
+static void
+putline_YVYU (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_YVYU (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2);
+}
+
+static void
+getline_v308 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = srcline[i * 3 + 0];
+ dest[i * 4 + 2] = srcline[i * 3 + 1];
+ dest[i * 4 + 3] = srcline[i * 3 + 2];
+ }
+}
+
+static void
+putline_v308 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i * 3 + 0] = src[i * 4 + 1];
+ destline[i * 3 + 1] = src[i * 4 + 2];
+ destline[i * 3 + 2] = src[i * 4 + 3];
+ }
+}
+
+static void
+getline_AYUV (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ memcpy (dest, FRAME_GET_LINE (src, 0, j), convert->width * 4);
+}
+
+static void
+putline_AYUV (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ memcpy (FRAME_GET_LINE (dest, 0, j), src, convert->width * 4);
+}
+
+#if 0
+static void
+getline_v410 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = GST_READ_UINT16_LE (srcline + i * 8 + 0);
+ dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 8 + 2);
+ dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + i * 8 + 4);
+ dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + i * 8 + 6);
+ }
+}
+#endif
+
+static void
+getline_v210 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+
+ for (i = 0; i < convert->width; i += 6) {
+ guint32 a0, a1, a2, a3;
+ guint16 y0, y1, y2, y3, y4, y5;
+ guint16 u0, u2, u4;
+ guint16 v0, v2, v4;
+
+ a0 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 0);
+ a1 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 4);
+ a2 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 8);
+ a3 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 12);
+
+ u0 = ((a0 >> 0) & 0x3ff) >> 2;
+ y0 = ((a0 >> 10) & 0x3ff) >> 2;
+ v0 = ((a0 >> 20) & 0x3ff) >> 2;
+ y1 = ((a1 >> 0) & 0x3ff) >> 2;
+
+ u2 = ((a1 >> 10) & 0x3ff) >> 2;
+ y2 = ((a1 >> 20) & 0x3ff) >> 2;
+ v2 = ((a2 >> 0) & 0x3ff) >> 2;
+ y3 = ((a2 >> 10) & 0x3ff) >> 2;
+
+ u4 = ((a2 >> 20) & 0x3ff) >> 2;
+ y4 = ((a3 >> 0) & 0x3ff) >> 2;
+ v4 = ((a3 >> 10) & 0x3ff) >> 2;
+ y5 = ((a3 >> 20) & 0x3ff) >> 2;
+
+ dest[4 * (i + 0) + 0] = 0xff;
+ dest[4 * (i + 0) + 1] = y0;
+ dest[4 * (i + 0) + 2] = u0;
+ dest[4 * (i + 0) + 3] = v0;
+
+ dest[4 * (i + 1) + 0] = 0xff;
+ dest[4 * (i + 1) + 1] = y1;
+ dest[4 * (i + 1) + 2] = u0;
+ dest[4 * (i + 1) + 3] = v0;
+
+ dest[4 * (i + 2) + 0] = 0xff;
+ dest[4 * (i + 2) + 1] = y2;
+ dest[4 * (i + 2) + 2] = u2;
+ dest[4 * (i + 2) + 3] = v2;
+
+ dest[4 * (i + 3) + 0] = 0xff;
+ dest[4 * (i + 3) + 1] = y3;
+ dest[4 * (i + 3) + 2] = u2;
+ dest[4 * (i + 3) + 3] = v2;
+
+ dest[4 * (i + 4) + 0] = 0xff;
+ dest[4 * (i + 4) + 1] = y4;
+ dest[4 * (i + 4) + 2] = u4;
+ dest[4 * (i + 4) + 3] = v4;
+
+ dest[4 * (i + 5) + 0] = 0xff;
+ dest[4 * (i + 5) + 1] = y5;
+ dest[4 * (i + 5) + 2] = u4;
+ dest[4 * (i + 5) + 3] = v4;
+
+ }
+
+}
+
+static void
+putline_v210 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+
+ for (i = 0; i < convert->width + 5; i += 6) {
+ guint32 a0, a1, a2, a3;
+ guint16 y0, y1, y2, y3, y4, y5;
+ guint16 u0, u1, u2;
+ guint16 v0, v1, v2;
+
+ y0 = src[4 * (i + 0) + 1] << 2;
+ y1 = src[4 * (i + 1) + 1] << 2;
+ y2 = src[4 * (i + 2) + 1] << 2;
+ y3 = src[4 * (i + 3) + 1] << 2;
+ y4 = src[4 * (i + 4) + 1] << 2;
+ y5 = src[4 * (i + 5) + 1] << 2;
+
+ u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2]) << 1;
+ u1 = (src[4 * (i + 2) + 2] + src[4 * (i + 3) + 2]) << 1;
+ u2 = (src[4 * (i + 4) + 2] + src[4 * (i + 5) + 2]) << 1;
+
+ v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3]) << 1;
+ v1 = (src[4 * (i + 2) + 3] + src[4 * (i + 3) + 3]) << 1;
+ v2 = (src[4 * (i + 4) + 3] + src[4 * (i + 5) + 3]) << 1;
+
+ a0 = u0 | (y0 << 10) | (v0 << 20);
+ a1 = y1 | (u1 << 10) | (y2 << 20);
+ a2 = v1 | (y3 << 10) | (u2 << 20);
+ a3 = y4 | (v2 << 10) | (y5 << 20);
+
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 0, a0);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 4, a1);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 8, a2);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 12, a3);
+ }
+}
+
+static void
+getline16_v210 (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+
+ for (i = 0; i < convert->width; i += 6) {
+ guint32 a0, a1, a2, a3;
+ guint16 y0, y1, y2, y3, y4, y5;
+ guint16 u0, u2, u4;
+ guint16 v0, v2, v4;
+
+ a0 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 0);
+ a1 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 4);
+ a2 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 8);
+ a3 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 12);
+
+ u0 = ((a0 >> 0) & 0x3ff) << 6;
+ y0 = ((a0 >> 10) & 0x3ff) << 6;
+ v0 = ((a0 >> 20) & 0x3ff) << 6;
+ y1 = ((a1 >> 0) & 0x3ff) << 6;
+
+ u2 = ((a1 >> 10) & 0x3ff) << 6;
+ y2 = ((a1 >> 20) & 0x3ff) << 6;
+ v2 = ((a2 >> 0) & 0x3ff) << 6;
+ y3 = ((a2 >> 10) & 0x3ff) << 6;
+
+ u4 = ((a2 >> 20) & 0x3ff) << 6;
+ y4 = ((a3 >> 0) & 0x3ff) << 6;
+ v4 = ((a3 >> 10) & 0x3ff) << 6;
+ y5 = ((a3 >> 20) & 0x3ff) << 6;
+
+ dest[4 * (i + 0) + 0] = 0xffff;
+ dest[4 * (i + 0) + 1] = y0;
+ dest[4 * (i + 0) + 2] = u0;
+ dest[4 * (i + 0) + 3] = v0;
+
+ dest[4 * (i + 1) + 0] = 0xffff;
+ dest[4 * (i + 1) + 1] = y1;
+ dest[4 * (i + 1) + 2] = u0;
+ dest[4 * (i + 1) + 3] = v0;
+
+ dest[4 * (i + 2) + 0] = 0xffff;
+ dest[4 * (i + 2) + 1] = y2;
+ dest[4 * (i + 2) + 2] = u2;
+ dest[4 * (i + 2) + 3] = v2;
+
+ dest[4 * (i + 3) + 0] = 0xffff;
+ dest[4 * (i + 3) + 1] = y3;
+ dest[4 * (i + 3) + 2] = u2;
+ dest[4 * (i + 3) + 3] = v2;
+
+ dest[4 * (i + 4) + 0] = 0xffff;
+ dest[4 * (i + 4) + 1] = y4;
+ dest[4 * (i + 4) + 2] = u4;
+ dest[4 * (i + 4) + 3] = v4;
+
+ dest[4 * (i + 5) + 0] = 0xffff;
+ dest[4 * (i + 5) + 1] = y5;
+ dest[4 * (i + 5) + 2] = u4;
+ dest[4 * (i + 5) + 3] = v4;
+
+ }
+}
+
+static void
+putline16_v210 (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+
+ for (i = 0; i < convert->width + 5; i += 6) {
+ guint32 a0, a1, a2, a3;
+ guint16 y0, y1, y2, y3, y4, y5;
+ guint16 u0, u1, u2;
+ guint16 v0, v1, v2;
+
+ y0 = src[4 * (i + 0) + 1] >> 6;
+ y1 = src[4 * (i + 1) + 1] >> 6;
+ y2 = src[4 * (i + 2) + 1] >> 6;
+ y3 = src[4 * (i + 3) + 1] >> 6;
+ y4 = src[4 * (i + 4) + 1] >> 6;
+ y5 = src[4 * (i + 5) + 1] >> 6;
+
+ u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2] + 1) >> 7;
+ u1 = (src[4 * (i + 2) + 2] + src[4 * (i + 3) + 2] + 1) >> 7;
+ u2 = (src[4 * (i + 4) + 2] + src[4 * (i + 5) + 2] + 1) >> 7;
+
+ v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3] + 1) >> 7;
+ v1 = (src[4 * (i + 2) + 3] + src[4 * (i + 3) + 3] + 1) >> 7;
+ v2 = (src[4 * (i + 4) + 3] + src[4 * (i + 5) + 3] + 1) >> 7;
+
+ a0 = u0 | (y0 << 10) | (v0 << 20);
+ a1 = y1 | (u1 << 10) | (y2 << 20);
+ a2 = v1 | (y3 << 10) | (u2 << 20);
+ a3 = y4 | (v2 << 10) | (y5 << 20);
+
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 0, a0);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 4, a1);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 8, a2);
+ GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 12, a3);
+ }
+}
+
+static void
+getline_v216 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 4 + 2) >> 8;
+ dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 0) >> 8;
+ dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 4) >> 8;
+ }
+}
+
+static void
+putline_v216 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width / 2; i++) {
+ GST_WRITE_UINT16_LE (destline + i * 8 + 0, src[(i * 2 + 0) * 4 + 2] << 8);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 2, src[(i * 2 + 0) * 4 + 1] << 8);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 4, src[(i * 2 + 1) * 4 + 3] << 8);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 8, src[(i * 2 + 0) * 4 + 1] << 8);
+ }
+}
+
+static void
+getline16_v216 (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xffff;
+ dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 4 + 2);
+ dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 0);
+ dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 4);
+ }
+}
+
+static void
+putline16_v216 (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width / 2; i++) {
+ GST_WRITE_UINT16_LE (destline + i * 8 + 0, src[(i * 2 + 0) * 4 + 2]);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 2, src[(i * 2 + 0) * 4 + 1]);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 4, src[(i * 2 + 1) * 4 + 3]);
+ GST_WRITE_UINT16_LE (destline + i * 8 + 8, src[(i * 2 + 0) * 4 + 1]);
+ }
+}
+
+static void
+getline_Y41B (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_YUV9 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j), FRAME_GET_LINE (src, 2, j),
+ convert->width / 2);
+}
+
+static void
+putline_Y41B (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destlineY = FRAME_GET_LINE (dest, 0, j);
+ guint8 *destlineU = FRAME_GET_LINE (dest, 1, j);
+ guint8 *destlineV = FRAME_GET_LINE (dest, 2, j);
+
+ for (i = 0; i < convert->width - 3; i += 4) {
+ destlineY[i] = src[i * 4 + 1];
+ destlineY[i + 1] = src[i * 4 + 5];
+ destlineY[i + 2] = src[i * 4 + 9];
+ destlineY[i + 3] = src[i * 4 + 13];
+
+ destlineU[i >> 2] =
+ (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 + 14] +
+ 2) >> 2;
+ destlineV[i >> 2] =
+ (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 + 15] +
+ 2) >> 2;
+ }
+
+ if (i == convert->width - 3) {
+ destlineY[i] = src[i * 4 + 1];
+ destlineY[i + 1] = src[i * 4 + 5];
+ destlineY[i + 2] = src[i * 4 + 9];
+
+ destlineU[i >> 2] =
+ (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + 1) / 3;
+ destlineV[i >> 2] =
+ (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + 1) / 3;
+ } else if (i == convert->width - 2) {
+ destlineY[i] = src[i * 4 + 1];
+ destlineY[i + 1] = src[i * 4 + 5];
+
+ destlineU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6] + 1) >> 1;
+ destlineV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7] + 1) >> 1;
+ } else if (i == convert->width - 1) {
+ destlineY[i + 1] = src[i * 4 + 5];
+
+ destlineU[i >> 2] = src[i * 4 + 2];
+ destlineV[i >> 2] = src[i * 4 + 3];
+ }
+}
+
+static void
+getline_Y42B (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_Y42B (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j),
+ FRAME_GET_LINE (src, 2, j), convert->width / 2);
+}
+
+static void
+putline_Y42B (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_Y42B (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j),
+ FRAME_GET_LINE (dest, 2, j), src, convert->width / 2);
+}
+
+static void
+getline_Y444 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_Y444 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j), FRAME_GET_LINE (src, 2, j), convert->width);
+}
+
+static void
+putline_Y444 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_Y444 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j),
+ FRAME_GET_LINE (dest, 2, j), src, convert->width);
+}
+
+static void
+getline_Y800 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_Y800 (dest, FRAME_GET_LINE (src, 0, j), convert->width);
+}
+
+static void
+putline_Y800 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_Y800 (FRAME_GET_LINE (dest, 0, j), src, convert->width);
+}
+
+static void
+getline_Y16 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_Y16 (dest, FRAME_GET_LINE (src, 0, j), convert->width);
+}
+
+static void
+putline_Y16 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_Y16 (FRAME_GET_LINE (dest, 0, j), src, convert->width);
+}
+
+static void
+getline_RGB16 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = ((srcline[i] >> 11) & 0x1f) << 3;
+ dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x3f) << 2;
+ dest[i * 4 + 3] = ((srcline[i]) & 0x1f) << 3;
+ }
+}
+
+static void
+putline_RGB16 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i] =
+ ((src[i * 4 + 1] >> 3) << 11) | ((src[i * 4 +
+ 2] >> 2) << 5) | (src[i * 4 + 3] >> 3);
+ }
+}
+
+static void
+getline_BGR16 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 3] = ((srcline[i] >> 11) & 0x1f) << 3;
+ dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x3f) << 2;
+ dest[i * 4 + 1] = ((srcline[i]) & 0x1f) << 3;
+ }
+}
+
+static void
+putline_BGR16 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i] =
+ ((src[i * 4 + 3] >> 3) << 11) | ((src[i * 4 +
+ 2] >> 2) << 5) | (src[i * 4 + 1] >> 3);
+ }
+}
+
+static void
+getline_RGB15 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = ((srcline[i] >> 10) & 0x1f) << 3;
+ dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x1f) << 3;
+ dest[i * 4 + 3] = ((srcline[i]) & 0x1f) << 3;
+ }
+}
+
+static void
+putline_RGB15 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i] =
+ ((src[i * 4 + 1] >> 3) << 10) | ((src[i * 4 +
+ 2] >> 3) << 5) | (src[i * 4 + 3] >> 3);
+ }
+}
+
+static void
+getline_BGR15 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 3] = ((srcline[i] >> 10) & 0x1f) << 3;
+ dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x1f) << 3;
+ dest[i * 4 + 1] = ((srcline[i]) & 0x1f) << 3;
+ }
+}
+
+static void
+putline_BGR15 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i] =
+ ((src[i * 4 + 3] >> 3) << 10) | ((src[i * 4 +
+ 2] >> 3) << 5) | (src[i * 4 + 1] >> 3);
+ }
+}
+
+static void
+getline_BGRA (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_BGRA (dest, FRAME_GET_LINE (src, 0, j), convert->width);
+}
+
+static void
+putline_BGRA (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_BGRA (FRAME_GET_LINE (dest, 0, j), src, convert->width);
+}
+
+static void
+getline_ABGR (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_ABGR (dest, FRAME_GET_LINE (src, 0, j), convert->width);
+}
+
+static void
+putline_ABGR (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_ABGR (FRAME_GET_LINE (dest, 0, j), src, convert->width);
+}
+
+static void
+getline_RGBA (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_RGBA (dest, FRAME_GET_LINE (src, 0, j), convert->width);
+}
+
+static void
+putline_RGBA (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_RGBA (FRAME_GET_LINE (dest, 0, j), src, convert->width);
+}
+
+static void
+getline_RGB (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = srcline[i * 3 + 0];
+ dest[i * 4 + 2] = srcline[i * 3 + 1];
+ dest[i * 4 + 3] = srcline[i * 3 + 2];
+ }
+}
+
+static void
+putline_RGB (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i * 3 + 0] = src[i * 4 + 1];
+ destline[i * 3 + 1] = src[i * 4 + 2];
+ destline[i * 3 + 2] = src[i * 4 + 3];
+ }
+}
+
+static void
+getline_BGR (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = srcline[i * 3 + 2];
+ dest[i * 4 + 2] = srcline[i * 3 + 1];
+ dest[i * 4 + 3] = srcline[i * 3 + 0];
+ }
+}
+
+static void
+putline_BGR (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ destline[i * 3 + 0] = src[i * 4 + 3];
+ destline[i * 3 + 1] = src[i * 4 + 2];
+ destline[i * 3 + 2] = src[i * 4 + 1];
+ }
+}
+
+static void
+getline_NV12 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_NV12 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j >> 1), convert->width / 2);
+}
+
+static void
+putline_NV12 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_NV12 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j >> 1), src, convert->width / 2);
+}
+
+static void
+getline_NV21 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_NV21 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 2, j >> 1), convert->width / 2);
+}
+
+static void
+putline_NV21 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_NV21 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2);
+}
+
+static void
+getline_UYVP (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i += 2) {
+ guint16 y0, y1;
+ guint16 u0;
+ guint16 v0;
+
+ u0 = (srcline[(i / 2) * 5 + 0] << 2) | (srcline[(i / 2) * 5 + 1] >> 6);
+ y0 = ((srcline[(i / 2) * 5 + 1] & 0x3f) << 4) | (srcline[(i / 2) * 5 +
+ 2] >> 4);
+ v0 = ((srcline[(i / 2) * 5 + 2] & 0x0f) << 6) | (srcline[(i / 2) * 5 +
+ 3] >> 2);
+ y1 = ((srcline[(i / 2) * 5 + 3] & 0x03) << 8) | srcline[(i / 2) * 5 + 4];
+
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = y0 >> 2;
+ dest[i * 4 + 2] = u0 >> 2;
+ dest[i * 4 + 3] = v0 >> 2;
+ dest[i * 4 + 4] = 0xff;
+ dest[i * 4 + 5] = y1 >> 2;
+ dest[i * 4 + 6] = u0 >> 2;
+ dest[i * 4 + 7] = v0 >> 2;
+ }
+}
+
+static void
+putline_UYVP (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width; i += 2) {
+ guint16 y0, y1;
+ guint16 u0;
+ guint16 v0;
+
+ y0 = src[4 * (i + 0) + 1];
+ y1 = src[4 * (i + 1) + 1];
+ u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2] + 1) >> 1;
+ v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3] + 1) >> 1;
+
+ destline[(i / 2) * 5 + 0] = u0;
+ destline[(i / 2) * 5 + 1] = y0 >> 2;
+ destline[(i / 2) * 5 + 2] = (y0 << 6) | (v0 >> 4);
+ destline[(i / 2) * 5 + 3] = (v0 << 4) | (y1 >> 2);
+ destline[(i / 2) * 5 + 4] = (y1 << 2);
+ }
+}
+
+static void
+getline_A420 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_A420 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j >> 1),
+ FRAME_GET_LINE (src, 2, j >> 1),
+ FRAME_GET_LINE (src, 3, j), convert->width);
+}
+
+static void
+putline_A420 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ cogorc_putline_A420 (FRAME_GET_LINE (dest, 0, j),
+ FRAME_GET_LINE (dest, 1, j >> 1),
+ FRAME_GET_LINE (dest, 2, j >> 1),
+ FRAME_GET_LINE (dest, 3, j), src, convert->width / 2);
+}
+
+static void
+getline_RGB8P (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ guint32 v = convert->palette[srcline[i]];
+ dest[i * 4 + 0] = (v >> 24) & 0xff;
+ dest[i * 4 + 1] = (v >> 16) & 0xff;
+ dest[i * 4 + 2] = (v >> 8) & 0xff;
+ dest[i * 4 + 3] = (v) & 0xff;
+ }
+}
+
+static void
+putline_RGB8P (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ /* Use our poor man's palette, taken from ffmpegcolorspace too */
+ for (i = 0; i < convert->width; i++) {
+ /* crude approximation for alpha ! */
+ if (src[i * 4 + 0] < 0x80)
+ destline[i] = 6 * 6 * 6;
+ else
+ destline[i] =
+ ((((src[i * 4 + 1]) / 47) % 6) * 6 * 6 + (((src[i * 4 +
+ 2]) / 47) % 6) * 6 + (((src[i * 4 + 3]) / 47) % 6));
+ }
+}
+
+
+static void
+getline_YUV9 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ cogorc_getline_YUV9 (dest,
+ FRAME_GET_LINE (src, 0, j),
+ FRAME_GET_LINE (src, 1, j >> 2),
+ FRAME_GET_LINE (src, 2, j >> 2), convert->width / 2);
+}
+
+static void
+putline_YUV9 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destY = FRAME_GET_LINE (dest, 0, j);
+ guint8 *destU = FRAME_GET_LINE (dest, 1, j >> 2);
+ guint8 *destV = FRAME_GET_LINE (dest, 2, j >> 2);
+
+ for (i = 0; i < convert->width - 3; i += 4) {
+ destY[i] = src[i * 4 + 1];
+ destY[i + 1] = src[i * 4 + 5];
+ destY[i + 2] = src[i * 4 + 9];
+ destY[i + 3] = src[i * 4 + 13];
+ if (j % 4 == 0) {
+ destU[i >> 2] =
+ (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 +
+ 14]) >> 2;
+ destV[i >> 2] =
+ (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 +
+ 15]) >> 2;
+ }
+ }
+
+ if (i == convert->width - 3) {
+ destY[i] = src[i * 4 + 1];
+ destY[i + 1] = src[i * 4 + 5];
+ destY[i + 2] = src[i * 4 + 9];
+ if (j % 4 == 0) {
+ destU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10]) / 3;
+ destV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11]) / 3;
+ }
+ } else if (i == convert->width - 2) {
+ destY[i] = src[i * 4 + 1];
+ destY[i + 1] = src[i * 4 + 5];
+ if (j % 4 == 0) {
+ destU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6]) >> 1;
+ destV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7]) >> 1;
+ }
+ } else if (i == convert->width - 1) {
+ destY[i] = src[i * 4 + 1];
+ destU[i >> 2] = src[i * 4 + 2];
+ destV[i >> 2] = src[i * 4 + 3];
+ }
+}
+
+static void
+getline_IYU1 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+
+ for (i = 0; i < convert->width - 3; i += 4) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 4] = 0xff;
+ dest[i * 4 + 8] = 0xff;
+ dest[i * 4 + 12] = 0xff;
+ dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1];
+ dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2];
+ dest[i * 4 + 9] = srcline[(i >> 2) * 6 + 4];
+ dest[i * 4 + 13] = srcline[(i >> 2) * 6 + 5];
+ dest[i * 4 + 2] = dest[i * 4 + 6] = dest[i * 4 + 10] = dest[i * 4 + 14] =
+ srcline[(i >> 2) * 6 + 0];
+ dest[i * 4 + 3] = dest[i * 4 + 7] = dest[i * 4 + 11] = dest[i * 4 + 15] =
+ srcline[(i >> 2) * 6 + 3];
+ }
+
+ if (i == convert->width - 3) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 4] = 0xff;
+ dest[i * 4 + 8] = 0xff;
+ dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1];
+ dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2];
+ dest[i * 4 + 9] = srcline[(i >> 2) * 6 + 4];
+ dest[i * 4 + 2] = dest[i * 4 + 6] = dest[i * 4 + 10] =
+ srcline[(i >> 2) * 6 + 0];
+ dest[i * 4 + 3] = dest[i * 4 + 7] = dest[i * 4 + 11] =
+ srcline[(i >> 2) * 6 + 3];
+ } else if (i == convert->width - 2) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 4] = 0xff;
+ dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1];
+ dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2];
+ dest[i * 4 + 2] = dest[i * 4 + 6] = srcline[(i >> 2) * 6 + 0];
+ dest[i * 4 + 3] = dest[i * 4 + 7] = srcline[(i >> 2) * 6 + 3];
+ } else if (i == convert->width - 1) {
+ dest[i * 4 + 0] = 0xff;
+ dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1];
+ dest[i * 4 + 2] = srcline[(i >> 2) * 6 + 0];
+ dest[i * 4 + 3] = srcline[(i >> 2) * 6 + 3];
+ }
+}
+
+static void
+putline_IYU1 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+
+ for (i = 0; i < convert->width - 3; i += 4) {
+ destline[(i >> 2) * 6 + 1] = src[i * 4 + 1];
+ destline[(i >> 2) * 6 + 2] = src[i * 4 + 5];
+ destline[(i >> 2) * 6 + 4] = src[i * 4 + 9];
+ destline[(i >> 2) * 6 + 5] = src[i * 4 + 13];
+ destline[(i >> 2) * 6 + 0] =
+ (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 +
+ 14]) >> 2;
+ destline[(i >> 2) * 6 + 3] =
+ (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 +
+ 15]) >> 2;
+ }
+
+ if (i == convert->width - 3) {
+ destline[(i >> 2) * 6 + 1] = src[i * 4 + 1];
+ destline[(i >> 2) * 6 + 2] = src[i * 4 + 5];
+ destline[(i >> 2) * 6 + 4] = src[i * 4 + 9];
+ destline[(i >> 2) * 6 + 0] =
+ (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10]) / 3;
+ destline[(i >> 2) * 6 + 3] =
+ (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11]) / 3;
+ } else if (i == convert->width - 2) {
+ destline[(i >> 2) * 6 + 1] = src[i * 4 + 1];
+ destline[(i >> 2) * 6 + 2] = src[i * 4 + 5];
+ destline[(i >> 2) * 6 + 0] = (src[i * 4 + 2] + src[i * 4 + 6]) >> 1;
+ destline[(i >> 2) * 6 + 3] = (src[i * 4 + 3] + src[i * 4 + 7]) >> 1;
+ } else if (i == convert->width - 1) {
+ destline[(i >> 2) * 6 + 1] = src[i * 4 + 1];
+ destline[(i >> 2) * 6 + 0] = src[i * 4 + 2];
+ destline[(i >> 2) * 6 + 3] = src[i * 4 + 3];
+ }
+}
+
+static void
+getline_AY64 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width * 4; i++) {
+ dest[i] = srcline[i] >> 8;
+ }
+}
+
+static void
+putline_AY64 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width * 4; i++) {
+ destline[i] = src[i] << 8;
+ }
+}
+
+static void
+getline16_AY64 (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j)
+{
+ memcpy (dest, FRAME_GET_LINE (src, 0, j), convert->width * 8);
+}
+
+static void
+putline16_AY64 (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j)
+{
+ memcpy (FRAME_GET_LINE (dest, 0, j), src, convert->width * 8);
+}
+
+static void
+getline_r210 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,
+ int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ guint8 x;
+ dest[i * 4 + 0] = 0xff;
+ x = GST_READ_UINT32_BE (srcline + i * 4);
+ dest[i * 4 + 1] = (x >> 22) & 0xff;
+ dest[i * 4 + 2] = (x >> 12) & 0xff;
+ dest[i * 4 + 3] = (x >> 2) & 0xff;
+ }
+}
+
+static void
+putline_r210 (VideoConvert * convert, GstVideoFrame * dest, const guint8 * src,
+ int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width / 2; i++) {
+ guint32 x = 0;
+ x |= src[i * 4 + 1] << 22;
+ x |= (src[i * 4 + 1] & 0xc0) << 14;
+ x |= src[i * 4 + 2] << 12;
+ x |= (src[i * 4 + 2] & 0xc0) << 10;
+ x |= src[i * 4 + 3] << 2;
+ x |= (src[i * 4 + 3] & 0xc0) >> 6;
+ GST_WRITE_UINT32_BE (destline + i * 4, x);
+ }
+}
+
+static void
+getline16_r210 (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j)
+{
+ int i;
+ const guint8 *srcline = FRAME_GET_LINE (src, 0, j);
+ for (i = 0; i < convert->width; i++) {
+ guint32 x;
+ dest[i * 4 + 0] = 0xffff;
+ x = GST_READ_UINT32_BE (srcline + i * 4);
+ dest[i * 4 + 1] = ((x >> 14) & 0xffc0) | (x >> 24);
+ dest[i * 4 + 2] = ((x >> 4) & 0xffc0) | ((x >> 14) & 0x3f);
+ dest[i * 4 + 3] = ((x << 6) & 0xffc0) | ((x >> 4) & 0x3f);
+ }
+}
+
+static void
+putline16_r210 (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j)
+{
+ int i;
+ guint8 *destline = FRAME_GET_LINE (dest, 0, j);
+ for (i = 0; i < convert->width / 2; i++) {
+ guint32 x = 0;
+ x |= (src[i * 4 + 1] & 0xffc0) << 14;
+ x |= (src[i * 4 + 2] & 0xffc0) << 4;
+ x |= (src[i * 4 + 3] & 0xffc0) >> 6;
+ GST_WRITE_UINT32_BE (destline + i * 4, x);
+ }
+}
+
+static void
+getline16_convert (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j)
+{
+ int i;
+ convert->getline (convert, convert->tmpline, src, j);
+ for (i = 0; i < convert->width * 4; i++) {
+ dest[i] = convert->tmpline[i] << 8;
+ }
+}
+
+static void
+putline16_convert (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j)
+{
+ int i;
+ for (i = 0; i < convert->width * 4; i++) {
+ convert->tmpline[i] = src[i] >> 8;
+ }
+ convert->putline (convert, dest, convert->tmpline, j);
+}
+
+typedef struct
+{
+ GstVideoFormat format;
+ void (*getline) (VideoConvert * convert, guint8 * dest,
+ const GstVideoFrame * src, int j);
+ void (*putline) (VideoConvert * convert, GstVideoFrame * dest,
+ const guint8 * src, int j);
+ void (*getline16) (VideoConvert * convert, guint16 * dest,
+ const GstVideoFrame * src, int j);
+ void (*putline16) (VideoConvert * convert, GstVideoFrame * dest,
+ const guint16 * src, int j);
+} VideoLine;
+static const VideoLine lines[] = {
+ {GST_VIDEO_FORMAT_I420, getline_I420, putline_I420},
+ {GST_VIDEO_FORMAT_YV12, getline_YV12, putline_YV12},
+ {GST_VIDEO_FORMAT_YUY2, getline_YUY2, putline_YUY2},
+ {GST_VIDEO_FORMAT_UYVY, getline_UYVY, putline_UYVY},
+ {GST_VIDEO_FORMAT_AYUV, getline_AYUV, putline_AYUV},
+ {GST_VIDEO_FORMAT_RGBx, getline_RGBA, putline_RGBA},
+ {GST_VIDEO_FORMAT_BGRx, getline_BGRA, putline_BGRA},
+ {GST_VIDEO_FORMAT_xRGB, getline_AYUV, putline_AYUV},
+ {GST_VIDEO_FORMAT_xBGR, getline_ABGR, putline_ABGR},
+ {GST_VIDEO_FORMAT_RGBA, getline_RGBA, putline_RGBA},
+ {GST_VIDEO_FORMAT_BGRA, getline_BGRA, putline_BGRA},
+ {GST_VIDEO_FORMAT_ARGB, getline_AYUV, putline_AYUV},
+ {GST_VIDEO_FORMAT_ABGR, getline_ABGR, putline_ABGR},
+ {GST_VIDEO_FORMAT_RGB, getline_RGB, putline_RGB},
+ {GST_VIDEO_FORMAT_BGR, getline_BGR, putline_BGR},
+ {GST_VIDEO_FORMAT_Y41B, getline_Y41B, putline_Y41B},
+ {GST_VIDEO_FORMAT_Y42B, getline_Y42B, putline_Y42B},
+ {GST_VIDEO_FORMAT_YVYU, getline_YVYU, putline_YVYU},
+ {GST_VIDEO_FORMAT_Y444, getline_Y444, putline_Y444},
+ {GST_VIDEO_FORMAT_v210, getline_v210, putline_v210,
+ getline16_v210, putline16_v210},
+ {GST_VIDEO_FORMAT_v216, getline_v216, putline_v216,
+ getline16_v216, putline16_v216},
+ {GST_VIDEO_FORMAT_NV12, getline_NV12, putline_NV12},
+ {GST_VIDEO_FORMAT_NV21, getline_NV21, putline_NV21},
+ //{GST_VIDEO_FORMAT_GRAY8, getline_GRAY8, putline_GRAY8},
+ //{GST_VIDEO_FORMAT_GRAY16_BE, getline_GRAY16_BE, putline_GRAY16_BE},
+ //{GST_VIDEO_FORMAT_GRAY16_LE, getline_GRAY16_LE, putline_GRAY16_LE},
+ {GST_VIDEO_FORMAT_v308, getline_v308, putline_v308},
+ {GST_VIDEO_FORMAT_Y800, getline_Y800, putline_Y800},
+ {GST_VIDEO_FORMAT_Y16, getline_Y16, putline_Y16},
+ {GST_VIDEO_FORMAT_RGB16, getline_RGB16, putline_RGB16},
+ {GST_VIDEO_FORMAT_BGR16, getline_BGR16, putline_BGR16},
+ {GST_VIDEO_FORMAT_RGB15, getline_RGB15, putline_RGB15},
+ {GST_VIDEO_FORMAT_BGR15, getline_BGR15, putline_BGR15},
+ {GST_VIDEO_FORMAT_UYVP, getline_UYVP, putline_UYVP},
+ {GST_VIDEO_FORMAT_A420, getline_A420, putline_A420}
+ , {GST_VIDEO_FORMAT_RGB8_PALETTED, getline_RGB8P, putline_RGB8P},
+ {GST_VIDEO_FORMAT_YUV9, getline_YUV9, putline_YUV9},
+ {GST_VIDEO_FORMAT_YVU9, getline_YUV9, putline_YUV9}, /* alias */
+ {GST_VIDEO_FORMAT_IYU1, getline_IYU1, putline_IYU1},
+ {GST_VIDEO_FORMAT_ARGB64, getline_AY64, putline_AY64, getline16_AY64,
+ putline16_AY64},
+ {GST_VIDEO_FORMAT_AYUV64, getline_AY64, putline_AY64, getline16_AY64,
+ putline16_AY64},
+ {GST_VIDEO_FORMAT_r210, getline_r210, putline_r210, getline16_r210,
+ putline16_r210}
+};
+
+static void
+matrix_rgb_to_yuv_bt470_6 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ r = tmpline[i * 4 + 1];
+ g = tmpline[i * 4 + 2];
+ b = tmpline[i * 4 + 3];
+
+ y = (66 * r + 129 * g + 25 * b + 4096) >> 8;
+ u = (-38 * r - 74 * g + 112 * b + 32768) >> 8;
+ v = (112 * r - 94 * g - 18 * b + 32768) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (y, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (u, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (v, 0, 255);
+ }
+}
+
+static void
+matrix_rgb_to_yuv_bt709 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ r = tmpline[i * 4 + 1];
+ g = tmpline[i * 4 + 2];
+ b = tmpline[i * 4 + 3];
+
+ y = (47 * r + 157 * g + 16 * b + 4096) >> 8;
+ u = (-26 * r - 87 * g + 112 * b + 32768) >> 8;
+ v = (112 * r - 102 * g - 10 * b + 32768) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (y, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (u, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (v, 0, 255);
+ }
+}
+
+static void
+matrix_yuv_bt470_6_to_rgb (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (298 * y + 409 * v - 57068) >> 8;
+ g = (298 * y - 100 * u - 208 * v + 34707) >> 8;
+ b = (298 * y + 516 * u - 70870) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 255);
+ }
+}
+
+static void
+matrix_yuv_bt709_to_rgb (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (298 * y + 459 * v - 63514) >> 8;
+ g = (298 * y - 55 * u - 136 * v + 19681) >> 8;
+ b = (298 * y + 541 * u - 73988) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 255);
+ }
+}
+
+static void
+matrix_yuv_bt709_to_yuv_bt470_6 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (256 * y + 25 * u + 49 * v - 9536) >> 8;
+ g = (253 * u - 28 * v + 3958) >> 8;
+ b = (-19 * u + 252 * v + 2918) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 255);
+ }
+}
+
+static void
+matrix_yuv_bt470_6_to_yuv_bt709 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint8 *tmpline = convert->tmpline;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (256 * y - 30 * u - 53 * v + 10600) >> 8;
+ g = (261 * u + 29 * v - 4367) >> 8;
+ b = (19 * u + 262 * v - 3289) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 255);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 255);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 255);
+ }
+}
+
+static void
+matrix_identity (VideoConvert * convert)
+{
+ /* do nothing */
+}
+
+static void
+matrix16_rgb_to_yuv_bt470_6 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ r = tmpline[i * 4 + 1];
+ g = tmpline[i * 4 + 2];
+ b = tmpline[i * 4 + 3];
+
+ y = (66 * r + 129 * g + 25 * b + 4096 * 256) >> 8;
+ u = (-38 * r - 74 * g + 112 * b + 32768 * 256) >> 8;
+ v = (112 * r - 94 * g - 18 * b + 32768 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (y, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (u, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (v, 0, 65535);
+ }
+}
+
+static void
+matrix16_rgb_to_yuv_bt709 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ r = tmpline[i * 4 + 1];
+ g = tmpline[i * 4 + 2];
+ b = tmpline[i * 4 + 3];
+
+ y = (47 * r + 157 * g + 16 * b + 4096 * 256) >> 8;
+ u = (-26 * r - 87 * g + 112 * b + 32768 * 256) >> 8;
+ v = (112 * r - 102 * g - 10 * b + 32768 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (y, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (u, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (v, 0, 65535);
+ }
+}
+
+static void
+matrix16_yuv_bt470_6_to_rgb (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (298 * y + 409 * v - 57068 * 256) >> 8;
+ g = (298 * y - 100 * u - 208 * v + 34707 * 256) >> 8;
+ b = (298 * y + 516 * u - 70870 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 65535);
+ }
+}
+
+static void
+matrix16_yuv_bt709_to_rgb (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (298 * y + 459 * v - 63514 * 256) >> 8;
+ g = (298 * y - 55 * u - 136 * v + 19681 * 256) >> 8;
+ b = (298 * y + 541 * u - 73988 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 65535);
+ }
+}
+
+static void
+matrix16_yuv_bt709_to_yuv_bt470_6 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (256 * y + 25 * u + 49 * v - 9536 * 256) >> 8;
+ g = (253 * u - 28 * v + 3958 * 256) >> 8;
+ b = (-19 * u + 252 * v + 2918 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 65535);
+ }
+}
+
+static void
+matrix16_yuv_bt470_6_to_yuv_bt709 (VideoConvert * convert)
+{
+ int i;
+ int r, g, b;
+ int y, u, v;
+ guint16 *tmpline = convert->tmpline16;
+
+ for (i = 0; i < convert->width; i++) {
+ y = tmpline[i * 4 + 1];
+ u = tmpline[i * 4 + 2];
+ v = tmpline[i * 4 + 3];
+
+ r = (256 * y - 30 * u - 53 * v + 10600 * 256) >> 8;
+ g = (261 * u + 29 * v - 4367 * 256) >> 8;
+ b = (19 * u + 262 * v - 3289 * 256) >> 8;
+
+ tmpline[i * 4 + 1] = CLAMP (r, 0, 65535);
+ tmpline[i * 4 + 2] = CLAMP (g, 0, 65535);
+ tmpline[i * 4 + 3] = CLAMP (b, 0, 65535);
+ }
+}
+
+static void
+matrix16_identity (VideoConvert * convert)
+{
+ /* do nothing */
+}
+
+
+
+static void
+videoconvert_convert_lookup_getput (VideoConvert * convert)
+{
+ int i;
+
+ convert->getline = NULL;
+ convert->getline16 = NULL;
+ for (i = 0; i < sizeof (lines) / sizeof (lines[0]); i++) {
+ if (lines[i].format == convert->from_format) {
+ convert->getline = lines[i].getline;
+ convert->getline16 = lines[i].getline16;
+ break;
+ }
+ }
+ convert->putline = NULL;
+ convert->putline16 = NULL;
+ for (i = 0; i < sizeof (lines) / sizeof (lines[0]); i++) {
+ if (lines[i].format == convert->to_format) {
+ convert->putline = lines[i].putline;
+ convert->putline16 = lines[i].putline16;
+ break;
+ }
+ }
+ GST_DEBUG ("get %p put %p", convert->getline, convert->putline);
+
+ if (convert->getline16 == NULL) {
+ convert->getline16 = getline16_convert;
+ }
+ if (convert->putline16 == NULL) {
+ convert->putline16 = putline16_convert;
+ }
+
+ if (convert->from_spec == convert->to_spec) {
+ convert->matrix = matrix_identity;
+ convert->matrix16 = matrix16_identity;
+ } else if (convert->from_spec == COLOR_SPEC_RGB
+ && convert->to_spec == COLOR_SPEC_YUV_BT470_6) {
+ convert->matrix = matrix_rgb_to_yuv_bt470_6;
+ convert->matrix16 = matrix16_rgb_to_yuv_bt470_6;
+ } else if (convert->from_spec == COLOR_SPEC_RGB
+ && convert->to_spec == COLOR_SPEC_YUV_BT709) {
+ convert->matrix = matrix_rgb_to_yuv_bt709;
+ convert->matrix16 = matrix16_rgb_to_yuv_bt709;
+ } else if (convert->from_spec == COLOR_SPEC_YUV_BT470_6
+ && convert->to_spec == COLOR_SPEC_RGB) {
+ convert->matrix = matrix_yuv_bt470_6_to_rgb;
+ convert->matrix16 = matrix16_yuv_bt470_6_to_rgb;
+ } else if (convert->from_spec == COLOR_SPEC_YUV_BT709
+ && convert->to_spec == COLOR_SPEC_RGB) {
+ convert->matrix = matrix_yuv_bt709_to_rgb;
+ convert->matrix16 = matrix16_yuv_bt709_to_rgb;
+ } else if (convert->from_spec == COLOR_SPEC_YUV_BT709
+ && convert->to_spec == COLOR_SPEC_YUV_BT470_6) {
+ convert->matrix = matrix_yuv_bt709_to_yuv_bt470_6;
+ convert->matrix16 = matrix16_yuv_bt709_to_yuv_bt470_6;
+ } else if (convert->from_spec == COLOR_SPEC_YUV_BT470_6
+ && convert->to_spec == COLOR_SPEC_YUV_BT709) {
+ convert->matrix = matrix_yuv_bt470_6_to_yuv_bt709;
+ convert->matrix16 = matrix16_yuv_bt470_6_to_yuv_bt709;
+ }
+}
+
+static void
+videoconvert_convert_generic (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int j;
+
+ if (convert->getline == NULL) {
+ GST_ERROR ("no getline");
+ return;
+ }
+
+ if (convert->putline == NULL) {
+ GST_ERROR ("no putline");
+ return;
+ }
+
+ if (convert->use_16bit) {
+ for (j = 0; j < convert->height; j++) {
+ convert->getline16 (convert, convert->tmpline16, src, j);
+ convert->matrix16 (convert);
+ convert->dither16 (convert, j);
+ convert->putline16 (convert, dest, convert->tmpline16, j);
+ }
+ } else {
+ for (j = 0; j < convert->height; j++) {
+ convert->getline (convert, convert->tmpline, src, j);
+ convert->matrix (convert);
+ convert->putline (convert, dest, convert->tmpline, j);
+ }
+ }
+}
+
+static void
+videoconvert_dither_none (VideoConvert * convert, int j)
+{
+}
+
+static void
+videoconvert_dither_verterr (VideoConvert * convert, int j)
+{
+ int i;
+ guint16 *tmpline = convert->tmpline16;
+ guint16 *errline = convert->errline;
+
+ for (i = 0; i < 4 * convert->width; i++) {
+ tmpline[i] += errline[i];
+ errline[i] = tmpline[i] & 0xff;
+ }
+}
+
+static void
+videoconvert_dither_halftone (VideoConvert * convert, int j)
+{
+ int i;
+ guint16 *tmpline = convert->tmpline16;
+ static guint16 halftone[8][8] = {
+ {0, 128, 32, 160, 8, 136, 40, 168},
+ {192, 64, 224, 96, 200, 72, 232, 104},
+ {48, 176, 16, 144, 56, 184, 24, 152},
+ {240, 112, 208, 80, 248, 120, 216, 88},
+ {12, 240, 44, 172, 4, 132, 36, 164},
+ {204, 76, 236, 108, 196, 68, 228, 100},
+ {60, 188, 28, 156, 52, 180, 20, 148},
+ {252, 142, 220, 92, 244, 116, 212, 84}
+ };
+
+ for (i = 0; i < convert->width * 4; i++) {
+ tmpline[i] += halftone[(i >> 2) & 7][j & 7];
+ }
+}
+
+/* Fast paths */
+
+static void
+convert_I420_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+
+ for (i = 0; i < convert->height; i += 2) {
+ cogorc_convert_I420_YUY2 (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (dest, 0, i + 1),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 0, i + 1),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2);
+ }
+}
+
+static void
+convert_I420_UYVY (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+
+ for (i = 0; i < convert->height; i += 2) {
+ cogorc_convert_I420_UYVY (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (dest, 0, i + 1),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 0, i + 1),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2);
+ }
+}
+
+static void
+convert_I420_AYUV (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+
+ for (i = 0; i < convert->height; i += 2) {
+ cogorc_convert_I420_AYUV (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (dest, 0, i + 1),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 0, i + 1),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 2, i >> 1), convert->width);
+ }
+}
+
+static void
+convert_I420_Y42B (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_420_422 (FRAME_GET_LINE (dest, 1, 0),
+ 2 * FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 1, 1),
+ 2 * FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2, convert->height / 2);
+
+ cogorc_planar_chroma_420_422 (FRAME_GET_LINE (dest, 2, 0),
+ 2 * FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (dest, 2, 1),
+ 2 * FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height / 2);
+}
+
+static void
+convert_I420_Y444 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 1, 0),
+ 2 * FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 1, 1),
+ 2 * FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+
+ cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 2, 0),
+ 2 * FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (dest, 2, 1),
+ 2 * FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+}
+
+static void
+convert_YUY2_I420 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+
+ for (i = 0; i < convert->height; i += 2) {
+ cogorc_convert_YUY2_I420 (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (dest, 0, i + 1),
+ FRAME_GET_LINE (dest, 1, i >> 1),
+ FRAME_GET_LINE (dest, 2, i >> 1),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 0, i + 1), (convert->width + 1) / 2);
+ }
+}
+
+static void
+convert_YUY2_AYUV (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_YUY2_AYUV (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_YUY2_Y42B (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_YUY2_Y42B (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_YUY2_Y444 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_YUY2_Y444 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+
+static void
+convert_UYVY_I420 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+
+ for (i = 0; i < convert->height; i += 2) {
+ cogorc_convert_UYVY_I420 (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (dest, 0, i + 1),
+ FRAME_GET_LINE (dest, 1, i >> 1),
+ FRAME_GET_LINE (dest, 2, i >> 1),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 0, i + 1), (convert->width + 1) / 2);
+ }
+}
+
+static void
+convert_UYVY_AYUV (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_UYVY_AYUV (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_UYVY_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_UYVY_YUY2 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_UYVY_Y42B (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_UYVY_Y42B (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_UYVY_Y444 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_UYVY_Y444 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_AYUV_I420 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_I420 (FRAME_GET_LINE (dest, 0, 0),
+ 2 * FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 0, 1),
+ 2 * FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ 2 * FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 0, 1),
+ 2 * FRAME_GET_STRIDE (src, 0), convert->width / 2, convert->height / 2);
+}
+
+static void
+convert_AYUV_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_YUY2 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width / 2, convert->height);
+}
+
+static void
+convert_AYUV_UYVY (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_UYVY (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width / 2, convert->height);
+}
+
+static void
+convert_AYUV_Y42B (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_Y42B (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_AYUV_Y444 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_Y444 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width, convert->height);
+}
+
+static void
+convert_Y42B_I420 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ 2 * FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 1, 1),
+ 2 * FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+
+ cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ 2 * FRAME_GET_STRIDE (src, 2), FRAME_GET_LINE (src, 2, 1),
+ 2 * FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+}
+
+static void
+convert_Y42B_Y444 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_422_444 (FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2, convert->height);
+
+ cogorc_planar_chroma_422_444 (FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y42B_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y42B_YUY2 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y42B_UYVY (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y42B_UYVY (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y42B_AYUV (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y42B_AYUV (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width) / 2, convert->height);
+}
+
+static void
+convert_Y444_I420 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ 2 * FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 1, 1),
+ 2 * FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+
+ cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ 2 * FRAME_GET_STRIDE (src, 2), FRAME_GET_LINE (src, 2, 1),
+ 2 * FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2,
+ (convert->height + 1) / 2);
+}
+
+static void
+convert_Y444_Y42B (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), FRAME_GET_STRIDE (dest, 0),
+ FRAME_GET_LINE (src, 0, 0), FRAME_GET_STRIDE (src, 0),
+ convert->width, convert->height);
+
+ cogorc_planar_chroma_444_422 (FRAME_GET_LINE (dest, 1, 0),
+ FRAME_GET_STRIDE (dest, 1), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), (convert->width + 1) / 2, convert->height);
+
+ cogorc_planar_chroma_444_422 (FRAME_GET_LINE (dest, 2, 0),
+ FRAME_GET_STRIDE (dest, 2), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y444_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y444_YUY2 (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y444_UYVY (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y444_UYVY (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), (convert->width + 1) / 2, convert->height);
+}
+
+static void
+convert_Y444_AYUV (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_Y444_AYUV (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), FRAME_GET_LINE (src, 1, 0),
+ FRAME_GET_STRIDE (src, 1), FRAME_GET_LINE (src, 2, 0),
+ FRAME_GET_STRIDE (src, 2), convert->width, convert->height);
+}
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+static void
+convert_AYUV_ARGB (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_ARGB (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width, convert->height);
+}
+
+static void
+convert_AYUV_BGRA (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_BGRA (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width, convert->height);
+}
+
+static void
+convert_AYUV_ABGR (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_ABGR (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width, convert->height);
+}
+
+static void
+convert_AYUV_RGBA (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ cogorc_convert_AYUV_RGBA (FRAME_GET_LINE (dest, 0, 0),
+ FRAME_GET_STRIDE (dest, 0), FRAME_GET_LINE (src, 0, 0),
+ FRAME_GET_STRIDE (src, 0), convert->width, convert->height);
+}
+
+static void
+convert_I420_BGRA (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src)
+{
+ int i;
+ int quality = 0;
+
+ if (quality > 3) {
+ for (i = 0; i < convert->height; i++) {
+ if (i & 1) {
+ cogorc_convert_I420_BGRA_avg (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 1, (i >> 1) + 1),
+ FRAME_GET_LINE (src, 2, i >> 1),
+ FRAME_GET_LINE (src, 2, (i >> 1) + 1), convert->width);
+ } else {
+ cogorc_convert_I420_BGRA (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 2, i >> 1), convert->width);
+ }
+ }
+ } else {
+ for (i = 0; i < convert->height; i++) {
+ cogorc_convert_I420_BGRA (FRAME_GET_LINE (dest, 0, i),
+ FRAME_GET_LINE (src, 0, i),
+ FRAME_GET_LINE (src, 1, i >> 1),
+ FRAME_GET_LINE (src, 2, i >> 1), convert->width);
+ }
+ }
+}
+#endif
+
+
+
+/* Fast paths */
+
+typedef struct
+{
+ GstVideoFormat from_format;
+ ColorSpaceColorSpec from_spec;
+ GstVideoFormat to_format;
+ ColorSpaceColorSpec to_spec;
+ gboolean keeps_color_spec;
+ void (*convert) (VideoConvert * convert, GstVideoFrame * dest,
+ const GstVideoFrame * src);
+} VideoTransform;
+static const VideoTransform transforms[] = {
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2,
+ COLOR_SPEC_NONE, TRUE, convert_I420_YUY2},
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY,
+ COLOR_SPEC_NONE, TRUE, convert_I420_UYVY},
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV,
+ COLOR_SPEC_NONE, TRUE, convert_I420_AYUV},
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B,
+ COLOR_SPEC_NONE, TRUE, convert_I420_Y42B},
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444,
+ COLOR_SPEC_NONE, TRUE, convert_I420_Y444},
+
+ {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420,
+ COLOR_SPEC_NONE, TRUE, convert_YUY2_I420},
+ {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, TRUE, convert_UYVY_YUY2}, /* alias */
+ {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV,
+ COLOR_SPEC_NONE, TRUE, convert_YUY2_AYUV},
+ {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B,
+ COLOR_SPEC_NONE, TRUE, convert_YUY2_Y42B},
+ {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444,
+ COLOR_SPEC_NONE, TRUE, convert_YUY2_Y444},
+
+ {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420,
+ COLOR_SPEC_NONE, TRUE, convert_UYVY_I420},
+ {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2,
+ COLOR_SPEC_NONE, TRUE, convert_UYVY_YUY2},
+ {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV,
+ COLOR_SPEC_NONE, TRUE, convert_UYVY_AYUV},
+ {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B,
+ COLOR_SPEC_NONE, TRUE, convert_UYVY_Y42B},
+ {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444,
+ COLOR_SPEC_NONE, TRUE, convert_UYVY_Y444},
+
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420,
+ COLOR_SPEC_NONE, TRUE, convert_AYUV_I420},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2,
+ COLOR_SPEC_NONE, TRUE, convert_AYUV_YUY2},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY,
+ COLOR_SPEC_NONE, TRUE, convert_AYUV_UYVY},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B,
+ COLOR_SPEC_NONE, TRUE, convert_AYUV_Y42B},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444,
+ COLOR_SPEC_NONE, TRUE, convert_AYUV_Y444},
+
+ {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420,
+ COLOR_SPEC_NONE, TRUE, convert_Y42B_I420},
+ {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2,
+ COLOR_SPEC_NONE, TRUE, convert_Y42B_YUY2},
+ {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY,
+ COLOR_SPEC_NONE, TRUE, convert_Y42B_UYVY},
+ {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV,
+ COLOR_SPEC_NONE, TRUE, convert_Y42B_AYUV},
+ {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444,
+ COLOR_SPEC_NONE, TRUE, convert_Y42B_Y444},
+
+ {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420,
+ COLOR_SPEC_NONE, TRUE, convert_Y444_I420},
+ {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2,
+ COLOR_SPEC_NONE, TRUE, convert_Y444_YUY2},
+ {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY,
+ COLOR_SPEC_NONE, TRUE, convert_Y444_UYVY},
+ {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV,
+ COLOR_SPEC_NONE, TRUE, convert_Y444_AYUV},
+ {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B,
+ COLOR_SPEC_NONE, TRUE, convert_Y444_Y42B},
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_ARGB,
+ COLOR_SPEC_RGB, FALSE, convert_AYUV_ARGB},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRA,
+ COLOR_SPEC_RGB, FALSE, convert_AYUV_BGRA},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_xRGB, COLOR_SPEC_RGB, FALSE, convert_AYUV_ARGB}, /* alias */
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRx, COLOR_SPEC_RGB, FALSE, convert_AYUV_BGRA}, /* alias */
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_ABGR,
+ COLOR_SPEC_RGB, FALSE, convert_AYUV_ABGR},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_RGBA,
+ COLOR_SPEC_RGB, FALSE, convert_AYUV_RGBA},
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_xBGR, COLOR_SPEC_RGB, FALSE, convert_AYUV_ABGR}, /* alias */
+ {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_RGBx, COLOR_SPEC_RGB, FALSE, convert_AYUV_RGBA}, /* alias */
+
+ {GST_VIDEO_FORMAT_I420, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRA,
+ COLOR_SPEC_RGB, FALSE, convert_I420_BGRA},
+#endif
+};
+
+static void
+videoconvert_convert_lookup_fastpath (VideoConvert * convert)
+{
+ int i;
+
+ for (i = 0; i < sizeof (transforms) / sizeof (transforms[0]); i++) {
+ if (transforms[i].to_format == convert->to_format &&
+ transforms[i].from_format == convert->from_format &&
+ (transforms[i].keeps_color_spec ||
+ (transforms[i].from_spec == convert->from_spec &&
+ transforms[i].to_spec == convert->to_spec))) {
+ convert->convert = transforms[i].convert;
+ return;
+ }
+ }
+}
diff --git a/gst/videoconvert/videoconvert.h b/gst/videoconvert/videoconvert.h
new file mode 100644
index 0000000..8d946ab
--- /dev/null
+++ b/gst/videoconvert/videoconvert.h
@@ -0,0 +1,91 @@
+/* Video conversion functions
+ * Copyright (C) 2010 David Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __COLORSPACE_H__
+#define __COLORSPACE_H__
+
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+
+typedef struct _VideoConvert VideoConvert;
+
+typedef enum {
+ COLOR_SPEC_NONE = 0,
+ COLOR_SPEC_RGB,
+ COLOR_SPEC_GRAY,
+ COLOR_SPEC_YUV_BT470_6,
+ COLOR_SPEC_YUV_BT709
+} ColorSpaceColorSpec;
+
+typedef enum {
+ DITHER_NONE,
+ DITHER_VERTERR,
+ DITHER_HALFTONE
+} ColorSpaceDitherMethod;
+
+struct _VideoConvert {
+ gint width, height;
+ gboolean interlaced;
+ gboolean use_16bit;
+ gboolean dither;
+
+ GstVideoFormat from_format;
+ ColorSpaceColorSpec from_spec;
+ GstVideoFormat to_format;
+ ColorSpaceColorSpec to_spec;
+ guint32 *palette;
+
+ guint8 *tmpline;
+ guint16 *tmpline16;
+ guint16 *errline;
+
+ void (*convert) (VideoConvert *convert, GstVideoFrame *dest, const GstVideoFrame *src);
+ void (*getline) (VideoConvert *convert, guint8 *dest, const GstVideoFrame *src, int j);
+ void (*putline) (VideoConvert *convert, GstVideoFrame *dest, const guint8 *src, int j);
+ void (*matrix) (VideoConvert *convert);
+
+ void (*getline16) (VideoConvert *convert, guint16 *dest, const GstVideoFrame *src, int j);
+ void (*putline16) (VideoConvert *convert, GstVideoFrame *dest, const guint16 *src, int j);
+ void (*matrix16) (VideoConvert *convert);
+ void (*dither16) (VideoConvert *convert, int j);
+};
+
+VideoConvert * videoconvert_convert_new (GstVideoFormat to_format,
+ ColorSpaceColorSpec from_spec,
+ GstVideoFormat from_format,
+ ColorSpaceColorSpec to_spec,
+ int width, int height);
+void videoconvert_convert_free (VideoConvert * convert);
+
+void videoconvert_convert_set_dither (VideoConvert * convert, int type);
+void videoconvert_convert_set_interlaced (VideoConvert *convert,
+ gboolean interlaced);
+
+void videoconvert_convert_set_palette (VideoConvert *convert,
+ const guint32 *palette);
+const guint32 * videoconvert_convert_get_palette (VideoConvert *convert);
+
+void videoconvert_convert_convert (VideoConvert * convert,
+ GstVideoFrame *dest, const GstVideoFrame *src);
+
+
+G_END_DECLS
+
+#endif /* __GST_COLORSPACE_H__ */
diff --git a/gst/videorate/Makefile.am b/gst/videorate/Makefile.am
new file mode 100644
index 0000000..b275aba
--- /dev/null
+++ b/gst/videorate/Makefile.am
@@ -0,0 +1,23 @@
+noinst_HEADERS = gstvideorate.h
+
+plugin_LTLIBRARIES = libgstvideorate.la
+
+libgstvideorate_la_SOURCES = gstvideorate.c
+libgstvideorate_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
+libgstvideorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstvideorate_la_LIBTOOLFLAGS = --tag=disable-static
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstvideorate -:SHARED libgstvideorate \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideorate_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideorate_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideorate_la_LDFLAGS) \
+ $(libgstvideorate_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/videorate/Makefile.in b/gst/videorate/Makefile.in
new file mode 100644
index 0000000..c6d60b7
--- /dev/null
+++ b/gst/videorate/Makefile.in
@@ -0,0 +1,769 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/videorate
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvideorate_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_libgstvideorate_la_OBJECTS = libgstvideorate_la-gstvideorate.lo
+libgstvideorate_la_OBJECTS = $(am_libgstvideorate_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvideorate_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvideorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstvideorate_la_CFLAGS) $(CFLAGS) \
+ $(libgstvideorate_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvideorate_la_SOURCES)
+DIST_SOURCES = $(libgstvideorate_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+noinst_HEADERS = gstvideorate.h
+plugin_LTLIBRARIES = libgstvideorate.la
+libgstvideorate_la_SOURCES = gstvideorate.c
+libgstvideorate_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
+libgstvideorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstvideorate_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/videorate/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/videorate/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
+libgstvideorate.la: $(libgstvideorate_la_OBJECTS) $(libgstvideorate_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvideorate_la_LINK) -rpath $(plugindir) $(libgstvideorate_la_OBJECTS) $(libgstvideorate_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideorate_la-gstvideorate.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvideorate_la-gstvideorate.lo: gstvideorate.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideorate_la_CFLAGS) $(CFLAGS) -MT libgstvideorate_la-gstvideorate.lo -MD -MP -MF $(DEPDIR)/libgstvideorate_la-gstvideorate.Tpo -c -o libgstvideorate_la-gstvideorate.lo `test -f 'gstvideorate.c' || echo '$(srcdir)/'`gstvideorate.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideorate_la-gstvideorate.Tpo $(DEPDIR)/libgstvideorate_la-gstvideorate.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideorate.c' object='libgstvideorate_la-gstvideorate.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideorate_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideorate_la_CFLAGS) $(CFLAGS) -c -o libgstvideorate_la-gstvideorate.lo `test -f 'gstvideorate.c' || echo '$(srcdir)/'`gstvideorate.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstvideorate -:SHARED libgstvideorate \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideorate_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideorate_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideorate_la_LDFLAGS) \
+ $(libgstvideorate_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/videorate/gstvideorate.c b/gst/videorate/gstvideorate.c
new file mode 100644
index 0000000..3317af2
--- /dev/null
+++ b/gst/videorate/gstvideorate.c
@@ -0,0 +1,1217 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-videorate
+ *
+ * This element takes an incoming stream of timestamped video frames.
+ * It will produce a perfect stream that matches the source pad's framerate.
+ *
+ * The correction is performed by dropping and duplicating frames, no fancy
+ * algorithm is used to interpolate frames (yet).
+ *
+ * By default the element will simply negotiate the same framerate on its
+ * source and sink pad.
+ *
+ * This operation is useful to link to elements that require a perfect stream.
+ * Typical examples are formats that do not store timestamps for video frames,
+ * but only store a framerate, like Ogg and AVI.
+ *
+ * A conversion to a specific framerate can be forced by using filtered caps on
+ * the source pad.
+ *
+ * The properties #GstVideoRate:in, #GstVideoRate:out, #GstVideoRate:duplicate
+ * and #GstVideoRate:drop can be read to obtain information about number of
+ * input frames, output frames, dropped frames (i.e. the number of unused input
+ * frames) and duplicated frames (i.e. the number of times an input frame was
+ * duplicated, beside being used normally).
+ *
+ * An input stream that needs no adjustments will thus never have dropped or
+ * duplicated frames.
+ *
+ * When the #GstVideoRate:silent property is set to FALSE, a GObject property
+ * notification will be emitted whenever one of the #GstVideoRate:duplicate or
+ * #GstVideoRate:drop values changes.
+ * This can potentially cause performance degradation.
+ * Note that property notification will happen from the streaming thread, so
+ * applications should be prepared for this.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videorate ! video/x-raw,framerate=15/1 ! xvimagesink
+ * ]| Decode an Ogg/Theora file and adjust the framerate to 15 fps before playing.
+ * To create the test Ogg/Theora file refer to the documentation of theoraenc.
+ * |[
+ * gst-launch -v v4l2src ! videorate ! video/x-raw,framerate=25/2 ! theoraenc ! oggmux ! filesink location=recording.ogg
+ * ]| Capture video from a V4L device, and adjust the stream to 12.5 fps before
+ * encoding to Ogg/Theora.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-09-02 (0.10.11)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvideorate.h"
+
+GST_DEBUG_CATEGORY_STATIC (video_rate_debug);
+#define GST_CAT_DEFAULT video_rate_debug
+
+/* GstVideoRate signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_SILENT TRUE
+#define DEFAULT_NEW_PREF 1.0
+#define DEFAULT_SKIP_TO_FIRST FALSE
+#define DEFAULT_DROP_ONLY FALSE
+#define DEFAULT_AVERAGE_PERIOD 0
+#define DEFAULT_MAX_RATE G_MAXINT
+
+enum
+{
+ ARG_0,
+ ARG_IN,
+ ARG_OUT,
+ ARG_DUP,
+ ARG_DROP,
+ ARG_SILENT,
+ ARG_NEW_PREF,
+ ARG_SKIP_TO_FIRST,
+ ARG_DROP_ONLY,
+ ARG_AVERAGE_PERIOD,
+ ARG_MAX_RATE
+ /* FILL ME */
+};
+
+static GstStaticPadTemplate gst_video_rate_src_template =
+ GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw;" "image/jpeg;" "image/png")
+ );
+
+static GstStaticPadTemplate gst_video_rate_sink_template =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw;" "image/jpeg;" "image/png")
+ );
+
+static void gst_video_rate_swap_prev (GstVideoRate * videorate,
+ GstBuffer * buffer, gint64 time);
+static gboolean gst_video_rate_sink_event (GstBaseTransform * trans,
+ GstEvent * event);
+static gboolean gst_video_rate_query (GstBaseTransform * trans,
+ GstPadDirection direction, GstQuery * query);
+
+static gboolean gst_video_rate_setcaps (GstBaseTransform * trans,
+ GstCaps * in_caps, GstCaps * out_caps);
+
+static GstCaps *gst_video_rate_transform_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter);
+
+static void gst_video_rate_fixate_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
+
+static GstFlowReturn gst_video_rate_transform_ip (GstBaseTransform * trans,
+ GstBuffer * buf);
+
+static gboolean gst_video_rate_start (GstBaseTransform * trans);
+
+
+static void gst_video_rate_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_video_rate_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GParamSpec *pspec_drop = NULL;
+static GParamSpec *pspec_duplicate = NULL;
+
+#define gst_video_rate_parent_class parent_class
+G_DEFINE_TYPE (GstVideoRate, gst_video_rate, GST_TYPE_BASE_TRANSFORM);
+
+static void
+gst_video_rate_class_init (GstVideoRateClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseTransformClass *base_class = GST_BASE_TRANSFORM_CLASS (klass);
+
+ object_class->set_property = gst_video_rate_set_property;
+ object_class->get_property = gst_video_rate_get_property;
+
+ base_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_rate_setcaps);
+ base_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_video_rate_transform_caps);
+ base_class->transform_ip = GST_DEBUG_FUNCPTR (gst_video_rate_transform_ip);
+ base_class->sink_event = GST_DEBUG_FUNCPTR (gst_video_rate_sink_event);
+ base_class->start = GST_DEBUG_FUNCPTR (gst_video_rate_start);
+ base_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_video_rate_fixate_caps);
+ base_class->query = GST_DEBUG_FUNCPTR (gst_video_rate_query);
+
+ g_object_class_install_property (object_class, ARG_IN,
+ g_param_spec_uint64 ("in", "In",
+ "Number of input frames", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, ARG_OUT,
+ g_param_spec_uint64 ("out", "Out", "Number of output frames", 0,
+ G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ pspec_duplicate = g_param_spec_uint64 ("duplicate", "Duplicate",
+ "Number of duplicated frames", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, ARG_DUP, pspec_duplicate);
+ pspec_drop = g_param_spec_uint64 ("drop", "Drop", "Number of dropped frames",
+ 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, ARG_DROP, pspec_drop);
+ g_object_class_install_property (object_class, ARG_SILENT,
+ g_param_spec_boolean ("silent", "silent",
+ "Don't emit notify for dropped and duplicated frames", DEFAULT_SILENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, ARG_NEW_PREF,
+ g_param_spec_double ("new-pref", "New Pref",
+ "Value indicating how much to prefer new frames (unused)", 0.0, 1.0,
+ DEFAULT_NEW_PREF, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstVideoRate:skip-to-first:
+ *
+ * Don't produce buffers before the first one we receive.
+ *
+ * Since: 0.10.25
+ */
+ g_object_class_install_property (object_class, ARG_SKIP_TO_FIRST,
+ g_param_spec_boolean ("skip-to-first", "Skip to first buffer",
+ "Don't produce buffers before the first one we receive",
+ DEFAULT_SKIP_TO_FIRST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstVideoRate:drop-only:
+ *
+ * Only drop frames, no duplicates are produced.
+ *
+ * Since: 0.10.36
+ */
+ g_object_class_install_property (object_class, ARG_DROP_ONLY,
+ g_param_spec_boolean ("drop-only", "Only Drop",
+ "Only drop frames, no duplicates are produced",
+ DEFAULT_DROP_ONLY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstVideoRate:average-period:
+ *
+ * Arrange for maximum framerate by dropping frames beyond a certain framerate,
+ * where the framerate is calculated using a moving average over the
+ * configured.
+ *
+ * Since: 0.10.36
+ */
+ g_object_class_install_property (object_class, ARG_AVERAGE_PERIOD,
+ g_param_spec_uint64 ("average-period", "Period over which to average",
+ "Period over which to average the framerate (in ns) (0 = disabled)",
+ 0, G_MAXINT64, DEFAULT_AVERAGE_PERIOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstVideoRate:max-rate:
+ *
+ * maximum framerate to pass through
+ *
+ * Since: 0.10.36
+ */
+ g_object_class_install_property (object_class, ARG_MAX_RATE,
+ g_param_spec_int ("max-rate", "maximum framerate",
+ "Maximum framerate allowed to pass through "
+ "(in frames per second, implies drop-only)",
+ 1, G_MAXINT, DEFAULT_MAX_RATE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (element_class,
+ "Video rate adjuster", "Filter/Effect/Video",
+ "Drops/duplicates/adjusts timestamps on video frames to make a perfect stream",
+ "Wim Taymans <wim@fluendo.com>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_video_rate_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_video_rate_src_template));
+}
+
+static void
+gst_value_fraction_get_extremes (const GValue * v,
+ gint * min_num, gint * min_denom, gint * max_num, gint * max_denom)
+{
+ if (GST_VALUE_HOLDS_FRACTION (v)) {
+ *min_num = *max_num = gst_value_get_fraction_numerator (v);
+ *min_denom = *max_denom = gst_value_get_fraction_denominator (v);
+ } else if (GST_VALUE_HOLDS_FRACTION_RANGE (v)) {
+ const GValue *min, *max;
+
+ min = gst_value_get_fraction_range_min (v);
+ *min_num = gst_value_get_fraction_numerator (min);
+ *min_denom = gst_value_get_fraction_denominator (min);
+
+ max = gst_value_get_fraction_range_max (v);
+ *max_num = gst_value_get_fraction_numerator (max);
+ *max_denom = gst_value_get_fraction_denominator (max);
+ } else if (GST_VALUE_HOLDS_LIST (v)) {
+ gint min_n = G_MAXINT, min_d = 1, max_n = 0, max_d = 1;
+ int i, n;
+
+ *min_num = G_MAXINT;
+ *min_denom = 1;
+ *max_num = 0;
+ *max_denom = 1;
+
+ n = gst_value_list_get_size (v);
+
+ g_assert (n > 0);
+
+ for (i = 0; i < n; i++) {
+ const GValue *t = gst_value_list_get_value (v, i);
+
+ gst_value_fraction_get_extremes (t, &min_n, &min_d, &max_n, &max_d);
+ if (gst_util_fraction_compare (min_n, min_d, *min_num, *min_denom) < 0) {
+ *min_num = min_n;
+ *min_denom = min_d;
+ }
+
+ if (gst_util_fraction_compare (max_n, max_d, *max_num, *max_denom) > 0) {
+ *max_num = max_n;
+ *max_denom = max_d;
+ }
+ }
+ } else {
+ g_warning ("Unknown type for framerate");
+ *min_num = 0;
+ *min_denom = 1;
+ *max_num = G_MAXINT;
+ *max_denom = 1;
+ }
+}
+
+/* Clamp the framerate in a caps structure to be a smaller range then
+ * [1...max_rate], otherwise return false */
+static gboolean
+gst_video_max_rate_clamp_structure (GstStructure * s, gint maxrate,
+ gint * min_num, gint * min_denom, gint * max_num, gint * max_denom)
+{
+ gboolean ret = FALSE;
+
+ if (!gst_structure_has_field (s, "framerate")) {
+ /* No framerate field implies any framerate, clamping would result in
+ * [1..max_rate] so not a real subset */
+ goto out;
+ } else {
+ const GValue *v;
+ GValue intersection = { 0, };
+ GValue clamp = { 0, };
+ gint tmp_num, tmp_denom;
+
+ g_value_init (&clamp, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&clamp, 0, 1, maxrate, 1);
+
+ v = gst_structure_get_value (s, "framerate");
+ ret = gst_value_intersect (&intersection, v, &clamp);
+ g_value_unset (&clamp);
+
+ if (!ret)
+ goto out;
+
+ gst_value_fraction_get_extremes (&intersection,
+ min_num, min_denom, max_num, max_denom);
+
+ gst_value_fraction_get_extremes (v,
+ &tmp_num, &tmp_denom, max_num, max_denom);
+
+ if (gst_util_fraction_compare (*max_num, *max_denom, maxrate, 1) > 0) {
+ *max_num = maxrate;
+ *max_denom = 1;
+ }
+
+ gst_structure_take_value (s, "framerate", &intersection);
+ }
+
+out:
+ return ret;
+}
+
+static GstCaps *
+gst_video_rate_transform_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstVideoRate *videorate = GST_VIDEO_RATE (trans);
+ GstCaps *ret;
+ GstStructure *s, *s2;
+ GstStructure *s3 = NULL;
+ int maxrate = g_atomic_int_get (&videorate->max_rate);
+
+ /* Should always be called with simple caps */
+ g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), NULL);
+
+ ret = gst_caps_copy (caps);
+
+ s = gst_caps_get_structure (ret, 0);
+ s2 = gst_structure_copy (s);
+
+ if (videorate->drop_only) {
+ gint min_num = 0, min_denom = 1;
+ gint max_num = G_MAXINT, max_denom = 1;
+
+ /* Clamp the caps to our maximum rate as the first caps if possible */
+ if (!gst_video_max_rate_clamp_structure (s, maxrate,
+ &min_num, &min_denom, &max_num, &max_denom)) {
+ min_num = 0;
+ min_denom = 1;
+ max_num = maxrate;
+ max_denom = 1;
+
+ /* clamp wouldn't be a real subset of 1..maxrate, in this case the sink
+ * caps should become [1..maxrate], [1..maxint] and the src caps just
+ * [1..maxrate]. In case there was a caps incompatibility things will
+ * explode later as appropriate :)
+ *
+ * In case [X..maxrate] == [X..maxint], skip as we'll set it later
+ */
+ if (direction == GST_PAD_SRC && maxrate != G_MAXINT)
+ gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE,
+ min_num, min_denom, maxrate, 1, NULL);
+ else
+ gst_caps_remove_structure (ret, 0);
+ }
+
+ if (direction == GST_PAD_SRC) {
+ /* We can accept anything as long as it's at least the minimal framerate
+ * the the sink needs */
+ gst_structure_set (s2, "framerate", GST_TYPE_FRACTION_RANGE,
+ min_num, min_denom, G_MAXINT, 1, NULL);
+
+ /* Also allow unknown framerate, if it isn't already */
+ if (min_num != 0 || min_denom != 1) {
+ s3 = gst_structure_copy (s);
+ gst_structure_set (s3, "framerate", GST_TYPE_FRACTION, 0, 1, NULL);
+ }
+ } else if (max_num != 0 || max_denom != 1) {
+ /* We can provide everything upto the maximum framerate at the src */
+ gst_structure_set (s2, "framerate", GST_TYPE_FRACTION_RANGE,
+ 0, 1, max_num, max_denom, NULL);
+ }
+ } else if (direction == GST_PAD_SINK) {
+ gint min_num = 0, min_denom = 1;
+ gint max_num = G_MAXINT, max_denom = 1;
+
+ if (!gst_video_max_rate_clamp_structure (s, maxrate,
+ &min_num, &min_denom, &max_num, &max_denom))
+ gst_caps_remove_structure (ret, 0);
+
+ gst_structure_set (s2, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1,
+ maxrate, 1, NULL);
+ } else {
+ /* set the framerate as a range */
+ gst_structure_set (s2, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1,
+ G_MAXINT, 1, NULL);
+ }
+
+ gst_caps_merge_structure (ret, s2);
+ if (s3 != NULL)
+ gst_caps_merge_structure (ret, s3);
+
+ return ret;
+}
+
+static void
+gst_video_rate_fixate_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
+{
+ GstStructure *s;
+ gint num, denom;
+
+ s = gst_caps_get_structure (caps, 0);
+ if (G_UNLIKELY (!gst_structure_get_fraction (s, "framerate", &num, &denom)))
+ return;
+
+ s = gst_caps_get_structure (othercaps, 0);
+ gst_structure_fixate_field_nearest_fraction (s, "framerate", num, denom);
+}
+
+static gboolean
+gst_video_rate_setcaps (GstBaseTransform * trans, GstCaps * in_caps,
+ GstCaps * out_caps)
+{
+ GstVideoRate *videorate = GST_VIDEO_RATE (trans);
+ GstStructure *structure;
+ gboolean ret = TRUE;
+ gint rate_numerator, rate_denominator;
+
+ videorate = GST_VIDEO_RATE (trans);
+
+ GST_DEBUG_OBJECT (trans, "setcaps called in: %" GST_PTR_FORMAT
+ " out: %" GST_PTR_FORMAT, in_caps, out_caps);
+
+ structure = gst_caps_get_structure (in_caps, 0);
+ if (!gst_structure_get_fraction (structure, "framerate",
+ &rate_numerator, &rate_denominator))
+ goto no_framerate;
+
+ videorate->from_rate_numerator = rate_numerator;
+ videorate->from_rate_denominator = rate_denominator;
+
+ structure = gst_caps_get_structure (out_caps, 0);
+ if (!gst_structure_get_fraction (structure, "framerate",
+ &rate_numerator, &rate_denominator))
+ goto no_framerate;
+
+ /* out_frame_count is scaled by the frame rate caps when calculating next_ts.
+ * when the frame rate caps change, we must update base_ts and reset
+ * out_frame_count */
+ if (videorate->to_rate_numerator) {
+ videorate->base_ts +=
+ gst_util_uint64_scale (videorate->out_frame_count,
+ videorate->to_rate_denominator * GST_SECOND,
+ videorate->to_rate_numerator);
+ }
+ videorate->out_frame_count = 0;
+ videorate->to_rate_numerator = rate_numerator;
+ videorate->to_rate_denominator = rate_denominator;
+
+ if (rate_numerator)
+ videorate->wanted_diff = gst_util_uint64_scale_int (GST_SECOND,
+ rate_denominator, rate_numerator);
+ else
+ videorate->wanted_diff = 0;
+
+done:
+ /* After a setcaps, our caps may have changed. In that case, we can't use
+ * the old buffer, if there was one (it might have different dimensions) */
+ GST_DEBUG_OBJECT (videorate, "swapping old buffers");
+ gst_video_rate_swap_prev (videorate, NULL, GST_CLOCK_TIME_NONE);
+ videorate->last_ts = GST_CLOCK_TIME_NONE;
+ videorate->average = 0;
+
+ return ret;
+
+no_framerate:
+ {
+ GST_DEBUG_OBJECT (videorate, "no framerate specified");
+ ret = FALSE;
+ goto done;
+ }
+}
+
+static void
+gst_video_rate_reset (GstVideoRate * videorate)
+{
+ GST_DEBUG_OBJECT (videorate, "resetting internal variables");
+
+ videorate->in = 0;
+ videorate->out = 0;
+ videorate->base_ts = 0;
+ videorate->out_frame_count = 0;
+ videorate->drop = 0;
+ videorate->dup = 0;
+ videorate->next_ts = GST_CLOCK_TIME_NONE;
+ videorate->last_ts = GST_CLOCK_TIME_NONE;
+ videorate->discont = TRUE;
+ videorate->average = 0;
+ gst_video_rate_swap_prev (videorate, NULL, 0);
+
+ gst_segment_init (&videorate->segment, GST_FORMAT_TIME);
+}
+
+static void
+gst_video_rate_init (GstVideoRate * videorate)
+{
+ gst_video_rate_reset (videorate);
+ videorate->silent = DEFAULT_SILENT;
+ videorate->new_pref = DEFAULT_NEW_PREF;
+ videorate->drop_only = DEFAULT_DROP_ONLY;
+ videorate->average_period = DEFAULT_AVERAGE_PERIOD;
+ videorate->average_period_set = DEFAULT_AVERAGE_PERIOD;
+ videorate->max_rate = DEFAULT_MAX_RATE;
+
+ videorate->from_rate_numerator = 0;
+ videorate->from_rate_denominator = 0;
+ videorate->to_rate_numerator = 0;
+ videorate->to_rate_denominator = 0;
+
+ gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (videorate), TRUE);
+}
+
+/* flush the oldest buffer */
+static GstFlowReturn
+gst_video_rate_flush_prev (GstVideoRate * videorate, gboolean duplicate)
+{
+ GstFlowReturn res;
+ GstBuffer *outbuf;
+ GstClockTime push_ts;
+
+ if (!videorate->prevbuf)
+ goto eos_before_buffers;
+
+ /* make sure we can write to the metadata */
+ outbuf = gst_buffer_make_writable (gst_buffer_ref (videorate->prevbuf));
+
+ GST_BUFFER_OFFSET (outbuf) = videorate->out;
+ GST_BUFFER_OFFSET_END (outbuf) = videorate->out + 1;
+
+ if (videorate->discont) {
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ videorate->discont = FALSE;
+ } else
+ GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DISCONT);
+
+ if (duplicate)
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
+ else
+ GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_GAP);
+
+ /* this is the timestamp we put on the buffer */
+ push_ts = videorate->next_ts;
+
+ videorate->out++;
+ videorate->out_frame_count++;
+ if (videorate->to_rate_numerator) {
+ /* interpolate next expected timestamp in the segment */
+ videorate->next_ts =
+ videorate->segment.base + videorate->segment.start +
+ videorate->base_ts + gst_util_uint64_scale (videorate->out_frame_count,
+ videorate->to_rate_denominator * GST_SECOND,
+ videorate->to_rate_numerator);
+ GST_BUFFER_DURATION (outbuf) = videorate->next_ts - push_ts;
+ }
+
+ /* We do not need to update time in VFR (variable frame rate) mode */
+ if (!videorate->drop_only) {
+ /* adapt for looping, bring back to time in current segment. */
+ GST_BUFFER_TIMESTAMP (outbuf) = push_ts - videorate->segment.base;
+ }
+
+ GST_LOG_OBJECT (videorate,
+ "old is best, dup, pushing buffer outgoing ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (push_ts));
+
+ res = gst_pad_push (GST_BASE_TRANSFORM_SRC_PAD (videorate), outbuf);
+
+ return res;
+
+ /* WARNINGS */
+eos_before_buffers:
+ {
+ GST_INFO_OBJECT (videorate, "got EOS before any buffer was received");
+ return GST_FLOW_OK;
+ }
+}
+
+static void
+gst_video_rate_swap_prev (GstVideoRate * videorate, GstBuffer * buffer,
+ gint64 time)
+{
+ GST_LOG_OBJECT (videorate, "swap_prev: storing buffer %p in prev", buffer);
+ if (videorate->prevbuf)
+ gst_buffer_unref (videorate->prevbuf);
+ videorate->prevbuf = buffer != NULL ? gst_buffer_ref (buffer) : NULL;
+ videorate->prev_ts = time;
+}
+
+static void
+gst_video_rate_notify_drop (GstVideoRate * videorate)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) videorate, "drop");
+#else
+ g_object_notify_by_pspec ((GObject *) videorate, pspec_drop);
+#endif
+}
+
+static void
+gst_video_rate_notify_duplicate (GstVideoRate * videorate)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) videorate, "duplicate");
+#else
+ g_object_notify_by_pspec ((GObject *) videorate, pspec_duplicate);
+#endif
+}
+
+#define MAGIC_LIMIT 25
+static gboolean
+gst_video_rate_sink_event (GstBaseTransform * trans, GstEvent * event)
+{
+ GstVideoRate *videorate;
+
+ videorate = GST_VIDEO_RATE (trans);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format != GST_FORMAT_TIME)
+ goto format_error;
+
+ GST_DEBUG_OBJECT (videorate, "handle NEWSEGMENT");
+
+ /* close up the previous segment, if appropriate */
+ if (videorate->prevbuf) {
+ gint count = 0;
+ GstFlowReturn res;
+
+ res = GST_FLOW_OK;
+ /* fill up to the end of current segment,
+ * or only send out the stored buffer if there is no specific stop.
+ * regardless, prevent going loopy in strange cases */
+ while (res == GST_FLOW_OK && count <= MAGIC_LIMIT &&
+ ((GST_CLOCK_TIME_IS_VALID (videorate->segment.stop) &&
+ videorate->next_ts - videorate->segment.base
+ < videorate->segment.stop)
+ || count < 1)) {
+ res = gst_video_rate_flush_prev (videorate, count > 0);
+ count++;
+ }
+ if (count > 1) {
+ videorate->dup += count - 1;
+ if (!videorate->silent)
+ gst_video_rate_notify_duplicate (videorate);
+ } else if (count == 0) {
+ videorate->drop++;
+ if (!videorate->silent)
+ gst_video_rate_notify_drop (videorate);
+ }
+ /* clean up for the new one; _chain will resume from the new start */
+ videorate->base_ts = 0;
+ videorate->out_frame_count = 0;
+ gst_video_rate_swap_prev (videorate, NULL, 0);
+ videorate->next_ts = GST_CLOCK_TIME_NONE;
+ }
+
+ /* We just want to update the accumulated stream_time */
+ gst_segment_copy_into (segment, &videorate->segment);
+
+ GST_DEBUG_OBJECT (videorate, "updated segment: %" GST_SEGMENT_FORMAT,
+ &videorate->segment);
+ break;
+ }
+ case GST_EVENT_EOS:{
+ gint count = 0;
+ GstFlowReturn res = GST_FLOW_OK;
+
+ GST_DEBUG_OBJECT (videorate, "Got EOS");
+
+ /* If the segment has a stop position, fill the segment */
+ if (GST_CLOCK_TIME_IS_VALID (videorate->segment.stop)) {
+ /* fill up to the end of current segment,
+ * or only send out the stored buffer if there is no specific stop.
+ * regardless, prevent going loopy in strange cases */
+ while (res == GST_FLOW_OK && count <= MAGIC_LIMIT &&
+ ((videorate->next_ts - videorate->segment.base <
+ videorate->segment.stop)
+ || count < 1)) {
+ res = gst_video_rate_flush_prev (videorate, count > 0);
+ count++;
+ }
+ } else if (videorate->prevbuf) {
+ /* Output at least one frame but if the buffer duration is valid, output
+ * enough frames to use the complete buffer duration */
+ if (GST_BUFFER_DURATION_IS_VALID (videorate->prevbuf)) {
+ GstClockTime end_ts =
+ videorate->next_ts + GST_BUFFER_DURATION (videorate->prevbuf);
+
+ while (res == GST_FLOW_OK && count <= MAGIC_LIMIT &&
+ ((videorate->next_ts - videorate->segment.base < end_ts)
+ || count < 1)) {
+ res = gst_video_rate_flush_prev (videorate, count > 0);
+ count++;
+ }
+ } else {
+ res = gst_video_rate_flush_prev (videorate, FALSE);
+ count = 1;
+ }
+ }
+
+ if (count > 1) {
+ videorate->dup += count - 1;
+ if (!videorate->silent)
+ gst_video_rate_notify_duplicate (videorate);
+ } else if (count == 0) {
+ videorate->drop++;
+ if (!videorate->silent)
+ gst_video_rate_notify_drop (videorate);
+ }
+
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ /* also resets the segment */
+ GST_DEBUG_OBJECT (videorate, "Got FLUSH_STOP");
+ gst_video_rate_reset (videorate);
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+format_error:
+ {
+ GST_WARNING_OBJECT (videorate,
+ "Got segment but doesn't have GST_FORMAT_TIME value");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_video_rate_query (GstBaseTransform * trans, GstPadDirection direction,
+ GstQuery * query)
+{
+ GstVideoRate *videorate = GST_VIDEO_RATE (trans);
+ gboolean res = FALSE;
+ GstPad *otherpad;
+
+ otherpad = (direction == GST_PAD_SRC) ?
+ GST_BASE_TRANSFORM_SINK_PAD (trans) : GST_BASE_TRANSFORM_SRC_PAD (trans);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ GstClockTime min, max;
+ gboolean live;
+ guint64 latency;
+ guint64 avg_period;
+ GstPad *peer;
+
+ GST_OBJECT_LOCK (videorate);
+ avg_period = videorate->average_period_set;
+ GST_OBJECT_UNLOCK (videorate);
+
+ if (avg_period == 0 && (peer = gst_pad_get_peer (otherpad))) {
+ if ((res = gst_pad_query (peer, query))) {
+ gst_query_parse_latency (query, &live, &min, &max);
+
+ GST_DEBUG_OBJECT (videorate, "Peer latency: min %"
+ GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min), GST_TIME_ARGS (max));
+
+ if (videorate->from_rate_numerator != 0) {
+ /* add latency. We don't really know since we hold on to the frames
+ * until we get a next frame, which can be anything. We assume
+ * however that this will take from_rate time. */
+ latency = gst_util_uint64_scale (GST_SECOND,
+ videorate->from_rate_denominator,
+ videorate->from_rate_numerator);
+ } else {
+ /* no input framerate, we don't know */
+ latency = 0;
+ }
+
+ GST_DEBUG_OBJECT (videorate, "Our latency: %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (latency));
+
+ min += latency;
+ if (max != -1)
+ max += latency;
+
+ GST_DEBUG_OBJECT (videorate, "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;
+ }
+ /* Simple fallthrough if we don't have a latency or not a peer that we
+ * can't ask about its latency yet.. */
+ }
+ default:
+ res =
+ GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction,
+ query);
+ break;
+ }
+
+ return res;
+}
+
+static GstFlowReturn
+gst_video_rate_trans_ip_max_avg (GstVideoRate * videorate, GstBuffer * buf)
+{
+ GstClockTime ts = GST_BUFFER_TIMESTAMP (buf);
+
+ videorate->in++;
+
+ if (!GST_CLOCK_TIME_IS_VALID (ts) || videorate->wanted_diff == 0)
+ goto push;
+
+ /* drop frames if they exceed our output rate */
+ if (GST_CLOCK_TIME_IS_VALID (videorate->last_ts)) {
+ GstClockTimeDiff diff = ts - videorate->last_ts;
+
+ /* Drop buffer if its early compared to the desired frame rate and
+ * the current average is higher than the desired average
+ */
+ if (diff < videorate->wanted_diff &&
+ videorate->average < videorate->wanted_diff)
+ goto drop;
+
+ /* Update average */
+ if (videorate->average) {
+ GstClockTimeDiff wanted_diff;
+
+ if (G_LIKELY (videorate->average_period > videorate->wanted_diff))
+ wanted_diff = videorate->wanted_diff;
+ else
+ wanted_diff = videorate->average_period * 10;
+
+ videorate->average =
+ gst_util_uint64_scale_round (videorate->average,
+ videorate->average_period - wanted_diff,
+ videorate->average_period) +
+ gst_util_uint64_scale_round (diff, wanted_diff,
+ videorate->average_period);
+ } else {
+ videorate->average = diff;
+ }
+ }
+
+ videorate->last_ts = ts;
+
+push:
+ videorate->out++;
+ return GST_FLOW_OK;
+
+drop:
+ if (!videorate->silent)
+ gst_video_rate_notify_drop (videorate);
+ return GST_BASE_TRANSFORM_FLOW_DROPPED;
+}
+
+static GstFlowReturn
+gst_video_rate_transform_ip (GstBaseTransform * trans, GstBuffer * buffer)
+{
+ GstVideoRate *videorate;
+ GstFlowReturn res = GST_BASE_TRANSFORM_FLOW_DROPPED;
+ GstClockTime intime, in_ts, in_dur;
+ GstClockTime avg_period;
+ gboolean skip = FALSE;
+
+ videorate = GST_VIDEO_RATE (trans);
+
+ /* make sure the denominators are not 0 */
+ if (videorate->from_rate_denominator == 0 ||
+ videorate->to_rate_denominator == 0)
+ goto not_negotiated;
+
+ GST_OBJECT_LOCK (videorate);
+ avg_period = videorate->average_period_set;
+ GST_OBJECT_UNLOCK (videorate);
+
+ /* MT-safe switching between modes */
+ if (G_UNLIKELY (avg_period != videorate->average_period)) {
+ gboolean switch_mode = (avg_period == 0 || videorate->average_period == 0);
+ videorate->average_period = avg_period;
+ videorate->last_ts = GST_CLOCK_TIME_NONE;
+
+ if (switch_mode) {
+ if (avg_period) {
+ /* enabling average mode */
+ videorate->average = 0;
+ /* make sure no cached buffers from regular mode are left */
+ gst_video_rate_swap_prev (videorate, NULL, 0);
+ } else {
+ /* enable regular mode */
+ videorate->next_ts = GST_CLOCK_TIME_NONE;
+ skip = TRUE;
+ }
+
+ /* max averaging mode has a no latency, normal mode does */
+ gst_element_post_message (GST_ELEMENT (videorate),
+ gst_message_new_latency (GST_OBJECT (videorate)));
+ }
+ }
+
+ if (videorate->average_period > 0)
+ return gst_video_rate_trans_ip_max_avg (videorate, buffer);
+
+ in_ts = GST_BUFFER_TIMESTAMP (buffer);
+ in_dur = GST_BUFFER_DURATION (buffer);
+
+ if (G_UNLIKELY (in_ts == GST_CLOCK_TIME_NONE)) {
+ in_ts = videorate->last_ts;
+ if (G_UNLIKELY (in_ts == GST_CLOCK_TIME_NONE))
+ goto invalid_buffer;
+ }
+
+ /* get the time of the next expected buffer timestamp, we use this when the
+ * next buffer has -1 as a timestamp */
+ videorate->last_ts = in_ts;
+ if (in_dur != GST_CLOCK_TIME_NONE)
+ videorate->last_ts += in_dur;
+
+ GST_DEBUG_OBJECT (videorate, "got buffer with timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (in_ts));
+
+ /* the input time is the time in the segment + all previously accumulated
+ * segments */
+ intime = in_ts + videorate->segment.base;
+
+ /* we need to have two buffers to compare */
+ if (videorate->prevbuf == NULL) {
+ gst_video_rate_swap_prev (videorate, buffer, intime);
+ videorate->in++;
+ if (!GST_CLOCK_TIME_IS_VALID (videorate->next_ts)) {
+ /* new buffer, we expect to output a buffer that matches the first
+ * timestamp in the segment */
+ if (videorate->skip_to_first || skip) {
+ videorate->next_ts = intime;
+ videorate->base_ts = in_ts - videorate->segment.start;
+ videorate->out_frame_count = 0;
+ } else {
+ videorate->next_ts = videorate->segment.start + videorate->segment.base;
+ }
+ }
+ } else {
+ GstClockTime prevtime;
+ gint count = 0;
+ gint64 diff1, diff2;
+
+ prevtime = videorate->prev_ts;
+
+ GST_LOG_OBJECT (videorate,
+ "BEGINNING prev buf %" GST_TIME_FORMAT " new buf %" GST_TIME_FORMAT
+ " outgoing ts %" GST_TIME_FORMAT, GST_TIME_ARGS (prevtime),
+ GST_TIME_ARGS (intime), GST_TIME_ARGS (videorate->next_ts));
+
+ videorate->in++;
+
+ /* drop new buffer if it's before previous one */
+ if (intime < prevtime) {
+ GST_DEBUG_OBJECT (videorate,
+ "The new buffer (%" GST_TIME_FORMAT
+ ") is before the previous buffer (%"
+ GST_TIME_FORMAT "). Dropping new buffer.",
+ GST_TIME_ARGS (intime), GST_TIME_ARGS (prevtime));
+ videorate->drop++;
+ if (!videorate->silent)
+ gst_video_rate_notify_drop (videorate);
+ goto done;
+ }
+
+ /* got 2 buffers, see which one is the best */
+ do {
+
+ diff1 = prevtime - videorate->next_ts;
+ diff2 = intime - videorate->next_ts;
+
+ /* take absolute values, beware: abs and ABS don't work for gint64 */
+ if (diff1 < 0)
+ diff1 = -diff1;
+ if (diff2 < 0)
+ diff2 = -diff2;
+
+ GST_LOG_OBJECT (videorate,
+ "diff with prev %" GST_TIME_FORMAT " diff with new %"
+ GST_TIME_FORMAT " outgoing ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (diff1), GST_TIME_ARGS (diff2),
+ GST_TIME_ARGS (videorate->next_ts));
+
+ /* output first one when its the best */
+ if (diff1 <= diff2) {
+ GstFlowReturn r;
+ count++;
+
+ /* on error the _flush function posted a warning already */
+ if ((r = gst_video_rate_flush_prev (videorate,
+ count > 1)) != GST_FLOW_OK) {
+ res = r;
+ goto done;
+ }
+ }
+
+ /* Do not produce any dups. We can exit loop now */
+ if (videorate->drop_only)
+ break;
+ /* continue while the first one was the best, if they were equal avoid
+ * going into an infinite loop */
+ }
+ while (diff1 < diff2);
+
+ /* if we outputed the first buffer more then once, we have dups */
+ if (count > 1) {
+ videorate->dup += count - 1;
+ if (!videorate->silent)
+ gst_video_rate_notify_duplicate (videorate);
+ }
+ /* if we didn't output the first buffer, we have a drop */
+ else if (count == 0) {
+ videorate->drop++;
+
+ if (!videorate->silent)
+ gst_video_rate_notify_drop (videorate);
+
+ GST_LOG_OBJECT (videorate,
+ "new is best, old never used, drop, outgoing ts %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (videorate->next_ts));
+ }
+ GST_LOG_OBJECT (videorate,
+ "END, putting new in old, diff1 %" GST_TIME_FORMAT
+ ", diff2 %" GST_TIME_FORMAT ", next_ts %" GST_TIME_FORMAT
+ ", in %" G_GUINT64_FORMAT ", out %" G_GUINT64_FORMAT ", drop %"
+ G_GUINT64_FORMAT ", dup %" G_GUINT64_FORMAT, GST_TIME_ARGS (diff1),
+ GST_TIME_ARGS (diff2), GST_TIME_ARGS (videorate->next_ts),
+ videorate->in, videorate->out, videorate->drop, videorate->dup);
+
+ /* swap in new one when it's the best */
+ gst_video_rate_swap_prev (videorate, buffer, intime);
+ }
+done:
+ return res;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ GST_WARNING_OBJECT (videorate, "no framerate negotiated");
+ res = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
+ }
+
+invalid_buffer:
+ {
+ GST_WARNING_OBJECT (videorate,
+ "Got buffer with GST_CLOCK_TIME_NONE timestamp, discarding it");
+ res = GST_BASE_TRANSFORM_FLOW_DROPPED;
+ goto done;
+ }
+}
+
+static gboolean
+gst_video_rate_start (GstBaseTransform * trans)
+{
+ gst_video_rate_reset (GST_VIDEO_RATE (trans));
+ return TRUE;
+}
+
+static void
+gst_video_rate_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstVideoRate *videorate = GST_VIDEO_RATE (object);
+
+ GST_OBJECT_LOCK (videorate);
+ switch (prop_id) {
+ case ARG_SILENT:
+ videorate->silent = g_value_get_boolean (value);
+ break;
+ case ARG_NEW_PREF:
+ videorate->new_pref = g_value_get_double (value);
+ break;
+ case ARG_SKIP_TO_FIRST:
+ videorate->skip_to_first = g_value_get_boolean (value);
+ break;
+ case ARG_DROP_ONLY:
+ videorate->drop_only = g_value_get_boolean (value);
+ goto reconfigure;
+ break;
+ case ARG_AVERAGE_PERIOD:
+ videorate->average_period_set = g_value_get_uint64 (value);
+ break;
+ case ARG_MAX_RATE:
+ g_atomic_int_set (&videorate->max_rate, g_value_get_int (value));
+ goto reconfigure;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (videorate);
+ return;
+
+reconfigure:
+ GST_OBJECT_UNLOCK (videorate);
+ gst_base_transform_reconfigure (GST_BASE_TRANSFORM (videorate));
+}
+
+static void
+gst_video_rate_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstVideoRate *videorate = GST_VIDEO_RATE (object);
+
+ GST_OBJECT_LOCK (videorate);
+ switch (prop_id) {
+ case ARG_IN:
+ g_value_set_uint64 (value, videorate->in);
+ break;
+ case ARG_OUT:
+ g_value_set_uint64 (value, videorate->out);
+ break;
+ case ARG_DUP:
+ g_value_set_uint64 (value, videorate->dup);
+ break;
+ case ARG_DROP:
+ g_value_set_uint64 (value, videorate->drop);
+ break;
+ case ARG_SILENT:
+ g_value_set_boolean (value, videorate->silent);
+ break;
+ case ARG_NEW_PREF:
+ g_value_set_double (value, videorate->new_pref);
+ break;
+ case ARG_SKIP_TO_FIRST:
+ g_value_set_boolean (value, videorate->skip_to_first);
+ break;
+ case ARG_DROP_ONLY:
+ g_value_set_boolean (value, videorate->drop_only);
+ break;
+ case ARG_AVERAGE_PERIOD:
+ g_value_set_uint64 (value, videorate->average_period_set);
+ break;
+ case ARG_MAX_RATE:
+ g_value_set_int (value, g_atomic_int_get (&videorate->max_rate));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (videorate);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (video_rate_debug, "videorate", 0,
+ "VideoRate stream fixer");
+
+ return gst_element_register (plugin, "videorate", GST_RANK_NONE,
+ GST_TYPE_VIDEO_RATE);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "videorate",
+ "Adjusts video frames",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/videorate/gstvideorate.h b/gst/videorate/gstvideorate.h
new file mode 100644
index 0000000..998d6da
--- /dev/null
+++ b/gst/videorate/gstvideorate.h
@@ -0,0 +1,92 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VIDEO_RATE_H__
+#define __GST_VIDEO_RATE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_RATE \
+ (gst_video_rate_get_type())
+#define GST_VIDEO_RATE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_RATE,GstVideoRate))
+#define GST_VIDEO_RATE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_RATE,GstVideoRateClass))
+#define GST_IS_VIDEO_RATE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_RATE))
+#define GST_IS_VIDEO_RATE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_RATE))
+
+typedef struct _GstVideoRate GstVideoRate;
+typedef struct _GstVideoRateClass GstVideoRateClass;
+
+/**
+ * GstVideoRate:
+ *
+ * Opaque data structure.
+ */
+struct _GstVideoRate
+{
+ GstBaseTransform parent;
+
+ /* video state */
+ gint from_rate_numerator, from_rate_denominator;
+ gint to_rate_numerator, to_rate_denominator;
+ guint64 next_ts; /* Timestamp of next buffer to output */
+ GstBuffer *prevbuf;
+ guint64 prev_ts; /* Previous buffer timestamp */
+ guint64 out_frame_count; /* number of frames output since the beginning
+ * of the segment or the last frame rate caps
+ * change, whichever was later */
+ guint64 base_ts; /* used in next_ts calculation after a
+ * frame rate caps change */
+ gboolean discont;
+ guint64 last_ts; /* Timestamp of last input buffer */
+
+ guint64 average_period;
+ GstClockTimeDiff wanted_diff; /* target average diff */
+ GstClockTimeDiff average; /* moving average period */
+
+ /* segment handling */
+ GstSegment segment;
+
+ /* properties */
+ guint64 in, out, dup, drop;
+ gboolean silent;
+ gdouble new_pref;
+ gboolean skip_to_first;
+ gboolean drop_only;
+ guint64 average_period_set;
+
+ volatile int max_rate;
+};
+
+struct _GstVideoRateClass
+{
+ GstBaseTransformClass parent_class;
+};
+
+GType gst_video_rate_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_RATE_H__ */
diff --git a/gst/videoscale/Makefile.am b/gst/videoscale/Makefile.am
new file mode 100644
index 0000000..1d68f80
--- /dev/null
+++ b/gst/videoscale/Makefile.am
@@ -0,0 +1,43 @@
+plugin_LTLIBRARIES = libgstvideoscale.la
+
+ORC_SOURCE=gstvideoscaleorc
+include $(top_srcdir)/common/orc.mak
+
+libgstvideoscale_la_SOURCES = \
+ gstvideoscale.c \
+ vs_image.c \
+ vs_scanline.c \
+ vs_4tap.c \
+ vs_fill_borders.c \
+ vs_lanczos.c
+
+nodist_libgstvideoscale_la_SOURCES = $(ORC_NODIST_SOURCES)
+
+libgstvideoscale_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvideoscale_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoscale_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+libgstvideoscale_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstvideoscale.h \
+ vs_image.h \
+ vs_scanline.h \
+ vs_4tap.h \
+ vs_fill_borders.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstvideoscale -:SHARED libgstvideoscale \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideoscale_la_SOURCES) \
+ $(nodist_libgstvideoscale_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideoscale_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideoscale_la_LDFLAGS) \
+ $(libgstvideoscale_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/videoscale/Makefile.in b/gst/videoscale/Makefile.in
new file mode 100644
index 0000000..852b61e
--- /dev/null
+++ b/gst/videoscale/Makefile.in
@@ -0,0 +1,927 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/videoscale
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvideoscale_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstvideoscale_la_OBJECTS = libgstvideoscale_la-gstvideoscale.lo \
+ libgstvideoscale_la-vs_image.lo \
+ libgstvideoscale_la-vs_scanline.lo \
+ libgstvideoscale_la-vs_4tap.lo \
+ libgstvideoscale_la-vs_fill_borders.lo \
+ libgstvideoscale_la-vs_lanczos.lo
+am__objects_1 = libgstvideoscale_la-tmp-orc.lo
+nodist_libgstvideoscale_la_OBJECTS = $(am__objects_1)
+libgstvideoscale_la_OBJECTS = $(am_libgstvideoscale_la_OBJECTS) \
+ $(nodist_libgstvideoscale_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvideoscale_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) \
+ $(libgstvideoscale_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvideoscale_la_SOURCES) \
+ $(nodist_libgstvideoscale_la_SOURCES)
+DIST_SOURCES = $(libgstvideoscale_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstvideoscale.la
+ORC_SOURCE = gstvideoscaleorc
+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 $@";
+libgstvideoscale_la_SOURCES = \
+ gstvideoscale.c \
+ vs_image.c \
+ vs_scanline.c \
+ vs_4tap.c \
+ vs_fill_borders.c \
+ vs_lanczos.c
+
+nodist_libgstvideoscale_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvideoscale_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvideoscale_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoscale_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+
+libgstvideoscale_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstvideoscale.h \
+ vs_image.h \
+ vs_scanline.h \
+ vs_4tap.h \
+ vs_fill_borders.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/videoscale/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/videoscale/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
+libgstvideoscale.la: $(libgstvideoscale_la_OBJECTS) $(libgstvideoscale_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvideoscale_la_LINK) -rpath $(plugindir) $(libgstvideoscale_la_OBJECTS) $(libgstvideoscale_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-gstvideoscale.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-tmp-orc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-vs_4tap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-vs_fill_borders.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-vs_image.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-vs_lanczos.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoscale_la-vs_scanline.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvideoscale_la-gstvideoscale.lo: gstvideoscale.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-gstvideoscale.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-gstvideoscale.Tpo -c -o libgstvideoscale_la-gstvideoscale.lo `test -f 'gstvideoscale.c' || echo '$(srcdir)/'`gstvideoscale.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-gstvideoscale.Tpo $(DEPDIR)/libgstvideoscale_la-gstvideoscale.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideoscale.c' object='libgstvideoscale_la-gstvideoscale.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-gstvideoscale.lo `test -f 'gstvideoscale.c' || echo '$(srcdir)/'`gstvideoscale.c
+
+libgstvideoscale_la-vs_image.lo: vs_image.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-vs_image.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-vs_image.Tpo -c -o libgstvideoscale_la-vs_image.lo `test -f 'vs_image.c' || echo '$(srcdir)/'`vs_image.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-vs_image.Tpo $(DEPDIR)/libgstvideoscale_la-vs_image.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vs_image.c' object='libgstvideoscale_la-vs_image.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-vs_image.lo `test -f 'vs_image.c' || echo '$(srcdir)/'`vs_image.c
+
+libgstvideoscale_la-vs_scanline.lo: vs_scanline.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-vs_scanline.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-vs_scanline.Tpo -c -o libgstvideoscale_la-vs_scanline.lo `test -f 'vs_scanline.c' || echo '$(srcdir)/'`vs_scanline.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-vs_scanline.Tpo $(DEPDIR)/libgstvideoscale_la-vs_scanline.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vs_scanline.c' object='libgstvideoscale_la-vs_scanline.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-vs_scanline.lo `test -f 'vs_scanline.c' || echo '$(srcdir)/'`vs_scanline.c
+
+libgstvideoscale_la-vs_4tap.lo: vs_4tap.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-vs_4tap.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-vs_4tap.Tpo -c -o libgstvideoscale_la-vs_4tap.lo `test -f 'vs_4tap.c' || echo '$(srcdir)/'`vs_4tap.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-vs_4tap.Tpo $(DEPDIR)/libgstvideoscale_la-vs_4tap.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vs_4tap.c' object='libgstvideoscale_la-vs_4tap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-vs_4tap.lo `test -f 'vs_4tap.c' || echo '$(srcdir)/'`vs_4tap.c
+
+libgstvideoscale_la-vs_fill_borders.lo: vs_fill_borders.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-vs_fill_borders.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-vs_fill_borders.Tpo -c -o libgstvideoscale_la-vs_fill_borders.lo `test -f 'vs_fill_borders.c' || echo '$(srcdir)/'`vs_fill_borders.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-vs_fill_borders.Tpo $(DEPDIR)/libgstvideoscale_la-vs_fill_borders.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vs_fill_borders.c' object='libgstvideoscale_la-vs_fill_borders.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-vs_fill_borders.lo `test -f 'vs_fill_borders.c' || echo '$(srcdir)/'`vs_fill_borders.c
+
+libgstvideoscale_la-vs_lanczos.lo: vs_lanczos.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-vs_lanczos.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-vs_lanczos.Tpo -c -o libgstvideoscale_la-vs_lanczos.lo `test -f 'vs_lanczos.c' || echo '$(srcdir)/'`vs_lanczos.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-vs_lanczos.Tpo $(DEPDIR)/libgstvideoscale_la-vs_lanczos.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vs_lanczos.c' object='libgstvideoscale_la-vs_lanczos.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_la-vs_lanczos.lo `test -f 'vs_lanczos.c' || echo '$(srcdir)/'`vs_lanczos.c
+
+libgstvideoscale_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -MT libgstvideoscale_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideoscale_la-tmp-orc.Tpo -c -o libgstvideoscale_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoscale_la-tmp-orc.Tpo $(DEPDIR)/libgstvideoscale_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstvideoscale_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoscale_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoscale_la_CFLAGS) $(CFLAGS) -c -o libgstvideoscale_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstvideoscale -:SHARED libgstvideoscale \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideoscale_la_SOURCES) \
+ $(nodist_libgstvideoscale_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideoscale_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideoscale_la_LDFLAGS) \
+ $(libgstvideoscale_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/videoscale/README b/gst/videoscale/README
new file mode 100644
index 0000000..3e08f4e
--- /dev/null
+++ b/gst/videoscale/README
@@ -0,0 +1,5 @@
+- test different strides using
+gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=328,height=240 ! xvimagesink
+gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=324,height=240 ! xvimagesink
+gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=322,height=240 ! xvimagesink
+gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=321,height=240 ! xvimagesink
diff --git a/gst/videoscale/gstvideoscale.c b/gst/videoscale/gstvideoscale.c
new file mode 100644
index 0000000..416dc1d
--- /dev/null
+++ b/gst/videoscale/gstvideoscale.c
@@ -0,0 +1,1446 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2005 David Schleef <ds@schleef.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.
+ */
+
+/**
+ * SECTION:element-videoscale
+ * @see_also: videorate, videoconvert
+ *
+ * This element resizes video frames. By default the element will try to
+ * negotiate to the same size on the source and sinkpad so that no scaling
+ * is needed. It is therefore safe to insert this element in a pipeline to
+ * get more robust behaviour without any cost if no scaling is needed.
+ *
+ * This element supports a wide range of color spaces including various YUV and
+ * RGB formats and is therefore generally able to operate anywhere in a
+ * pipeline.
+ *
+ * <refsect2>
+ * <title>Example pipelines</title>
+ * |[
+ * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videoconvert ! videoscale ! ximagesink
+ * ]| Decode an Ogg/Theora and display the video using ximagesink. Since
+ * ximagesink cannot perform scaling, the video scaling will be performed by
+ * videoscale when you resize the video window.
+ * To create the test Ogg/Theora file refer to the documentation of theoraenc.
+ * |[
+ * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! videoscale ! video/x-raw, width=50 ! xvimagesink
+ * ]| Decode an Ogg/Theora and display the video using xvimagesink with a width
+ * of 50.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-02 (0.10.4)
+ */
+
+/*
+ * Formulas for PAR, DAR, width and height relations:
+ *
+ * dar_n w par_n
+ * ----- = - * -----
+ * dar_d h par_d
+ *
+ * par_n h dar_n
+ * ----- = - * -----
+ * par_d w dar_d
+ *
+ * dar_n par_d
+ * w = h * ----- * -----
+ * dar_d par_n
+ *
+ * dar_d par_n
+ * h = w * ----- * -----
+ * dar_n par_d
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <math.h>
+
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+#include "gstvideoscale.h"
+#include "gstvideoscaleorc.h"
+#include "vs_image.h"
+#include "vs_4tap.h"
+#include "vs_fill_borders.h"
+
+/* debug variable definition */
+GST_DEBUG_CATEGORY (video_scale_debug);
+
+#define DEFAULT_PROP_METHOD GST_VIDEO_SCALE_BILINEAR
+#define DEFAULT_PROP_ADD_BORDERS FALSE
+#define DEFAULT_PROP_SHARPNESS 1.0
+#define DEFAULT_PROP_SHARPEN 0.0
+#define DEFAULT_PROP_DITHER FALSE
+#define DEFAULT_PROP_SUBMETHOD 1
+#define DEFAULT_PROP_ENVELOPE 2.0
+
+enum
+{
+ PROP_0,
+ PROP_METHOD,
+ PROP_ADD_BORDERS,
+ PROP_SHARPNESS,
+ PROP_SHARPEN,
+ PROP_DITHER,
+ PROP_SUBMETHOD,
+ PROP_ENVELOPE
+};
+
+#undef GST_VIDEO_SIZE_RANGE
+#define GST_VIDEO_SIZE_RANGE "(int) [ 1, 32767]"
+
+#define GST_VIDEO_FORMATS "{ \"I420\", \"YV12\", \"YUY2\", \"UYVY\", \"AYUV\", \"RGBx\", " \
+ "\"BGRx\", \"xRGB\", \"xBGR\", \"RGBA\", \"BGRA\", \"ARGB\", \"ABGR\", \"RGB\", " \
+ "\"BGR\", \"Y41B\", \"Y42B\", \"YVYU\", \"Y444\", \"GRAY8\", \"GRAY16_BE\", \"GRAY16_LE\", " \
+ "\"v308\", \"Y800\", \"Y16\", \"RGB16\", \"RGB15\", \"ARGB64\", \"AYUV64\" } "
+
+
+static GstStaticCaps gst_video_scale_format_caps[] = {
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS))
+};
+
+#define GST_TYPE_VIDEO_SCALE_METHOD (gst_video_scale_method_get_type())
+static GType
+gst_video_scale_method_get_type (void)
+{
+ static GType video_scale_method_type = 0;
+
+ static const GEnumValue video_scale_methods[] = {
+ {GST_VIDEO_SCALE_NEAREST, "Nearest Neighbour", "nearest-neighbour"},
+ {GST_VIDEO_SCALE_BILINEAR, "Bilinear", "bilinear"},
+ {GST_VIDEO_SCALE_4TAP, "4-tap", "4-tap"},
+ {GST_VIDEO_SCALE_LANCZOS, "Lanczos", "lanczos"},
+ {0, NULL, NULL},
+ };
+
+ if (!video_scale_method_type) {
+ video_scale_method_type =
+ g_enum_register_static ("GstVideoScaleMethod", video_scale_methods);
+ }
+ return video_scale_method_type;
+}
+
+static GstCaps *
+gst_video_scale_get_capslist (void)
+{
+ static GstCaps *caps = NULL;
+ static volatile gsize inited = 0;
+
+ if (g_once_init_enter (&inited)) {
+ gint i;
+
+ g_assert (caps == NULL);
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < G_N_ELEMENTS (gst_video_scale_format_caps); i++)
+ gst_caps_append (caps,
+ gst_caps_make_writable
+ (gst_static_caps_get (&gst_video_scale_format_caps[i])));
+ g_once_init_leave (&inited, 1);
+ }
+
+ return caps;
+}
+
+static GstPadTemplate *
+gst_video_scale_src_template_factory (void)
+{
+ return gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ gst_video_scale_get_capslist ());
+}
+
+static GstPadTemplate *
+gst_video_scale_sink_template_factory (void)
+{
+ return gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ gst_video_scale_get_capslist ());
+}
+
+
+static void gst_video_scale_finalize (GstVideoScale * videoscale);
+static gboolean gst_video_scale_src_event (GstBaseTransform * trans,
+ GstEvent * event);
+
+/* base transform vmethods */
+static GstCaps *gst_video_scale_transform_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter);
+static gboolean gst_video_scale_set_caps (GstBaseTransform * trans,
+ GstCaps * in, GstCaps * out);
+static gboolean gst_video_scale_get_unit_size (GstBaseTransform * trans,
+ GstCaps * caps, gsize * size);
+static gboolean gst_video_scale_decide_allocation (GstBaseTransform * trans,
+ GstQuery * query);
+static GstFlowReturn gst_video_scale_transform (GstBaseTransform * trans,
+ GstBuffer * in, GstBuffer * out);
+static void gst_video_scale_fixate_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
+
+static void gst_video_scale_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_video_scale_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+#define gst_video_scale_parent_class parent_class
+G_DEFINE_TYPE (GstVideoScale, gst_video_scale, GST_TYPE_VIDEO_FILTER);
+
+static void
+gst_video_scale_class_init (GstVideoScaleClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *element_class = (GstElementClass *) klass;
+ GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass;
+
+ gobject_class->finalize = (GObjectFinalizeFunc) gst_video_scale_finalize;
+ gobject_class->set_property = gst_video_scale_set_property;
+ gobject_class->get_property = gst_video_scale_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_METHOD,
+ g_param_spec_enum ("method", "method", "method",
+ GST_TYPE_VIDEO_SCALE_METHOD, DEFAULT_PROP_METHOD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_ADD_BORDERS,
+ g_param_spec_boolean ("add-borders", "Add Borders",
+ "Add black borders if necessary to keep the display aspect ratio",
+ DEFAULT_PROP_ADD_BORDERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SHARPNESS,
+ g_param_spec_double ("sharpness", "Sharpness",
+ "Sharpness of filter", 0.0, 2.0, DEFAULT_PROP_SHARPNESS,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_SHARPEN,
+ g_param_spec_double ("sharpen", "Sharpen",
+ "Sharpening", 0.0, 1.0, DEFAULT_PROP_SHARPEN,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_DITHER,
+ g_param_spec_boolean ("dither", "Dither",
+ "Add dither (only used for Lanczos method)",
+ DEFAULT_PROP_DITHER,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+#if 0
+ /* I am hiding submethod for now, since it's poorly named, poorly
+ * documented, and will probably just get people into trouble. */
+ g_object_class_install_property (gobject_class, PROP_SUBMETHOD,
+ g_param_spec_int ("submethod", "submethod",
+ "submethod", 0, 3, DEFAULT_PROP_SUBMETHOD,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+#endif
+
+ g_object_class_install_property (gobject_class, PROP_ENVELOPE,
+ g_param_spec_double ("envelope", "Envelope",
+ "Size of filter envelope", 0.0, 5.0, DEFAULT_PROP_ENVELOPE,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (element_class,
+ "Video scaler", "Filter/Converter/Video/Scaler",
+ "Resizes video", "Wim Taymans <wim.taymans@chello.be>");
+
+ gst_element_class_add_pad_template (element_class,
+ gst_video_scale_sink_template_factory ());
+ gst_element_class_add_pad_template (element_class,
+ gst_video_scale_src_template_factory ());
+
+ trans_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_video_scale_transform_caps);
+ trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_scale_set_caps);
+ trans_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_video_scale_get_unit_size);
+ trans_class->decide_allocation =
+ GST_DEBUG_FUNCPTR (gst_video_scale_decide_allocation);
+ trans_class->transform = GST_DEBUG_FUNCPTR (gst_video_scale_transform);
+ trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_video_scale_fixate_caps);
+ trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_scale_src_event);
+}
+
+static void
+gst_video_scale_init (GstVideoScale * videoscale)
+{
+ videoscale->tmp_buf = NULL;
+ videoscale->method = DEFAULT_PROP_METHOD;
+ videoscale->add_borders = DEFAULT_PROP_ADD_BORDERS;
+ videoscale->submethod = DEFAULT_PROP_SUBMETHOD;
+ videoscale->sharpness = DEFAULT_PROP_SHARPNESS;
+ videoscale->sharpen = DEFAULT_PROP_SHARPEN;
+ videoscale->dither = DEFAULT_PROP_DITHER;
+ videoscale->envelope = DEFAULT_PROP_ENVELOPE;
+}
+
+static void
+gst_video_scale_finalize (GstVideoScale * videoscale)
+{
+ if (videoscale->tmp_buf)
+ g_free (videoscale->tmp_buf);
+
+ G_OBJECT_CLASS (parent_class)->finalize (G_OBJECT (videoscale));
+}
+
+static void
+gst_video_scale_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstVideoScale *vscale = GST_VIDEO_SCALE (object);
+
+ switch (prop_id) {
+ case PROP_METHOD:
+ GST_OBJECT_LOCK (vscale);
+ vscale->method = g_value_get_enum (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_ADD_BORDERS:
+ GST_OBJECT_LOCK (vscale);
+ vscale->add_borders = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (vscale);
+ gst_base_transform_reconfigure (GST_BASE_TRANSFORM_CAST (vscale));
+ break;
+ case PROP_SHARPNESS:
+ GST_OBJECT_LOCK (vscale);
+ vscale->sharpness = g_value_get_double (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_SHARPEN:
+ GST_OBJECT_LOCK (vscale);
+ vscale->sharpen = g_value_get_double (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_DITHER:
+ GST_OBJECT_LOCK (vscale);
+ vscale->dither = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_SUBMETHOD:
+ GST_OBJECT_LOCK (vscale);
+ vscale->submethod = g_value_get_int (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_ENVELOPE:
+ GST_OBJECT_LOCK (vscale);
+ vscale->envelope = g_value_get_double (value);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_video_scale_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstVideoScale *vscale = GST_VIDEO_SCALE (object);
+
+ switch (prop_id) {
+ case PROP_METHOD:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_enum (value, vscale->method);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_ADD_BORDERS:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_boolean (value, vscale->add_borders);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_SHARPNESS:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_double (value, vscale->sharpness);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_SHARPEN:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_double (value, vscale->sharpen);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_DITHER:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_boolean (value, vscale->dither);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_SUBMETHOD:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_int (value, vscale->submethod);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ case PROP_ENVELOPE:
+ GST_OBJECT_LOCK (vscale);
+ g_value_set_double (value, vscale->envelope);
+ GST_OBJECT_UNLOCK (vscale);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstCaps *
+gst_video_scale_transform_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *ret;
+ GstStructure *structure;
+ gint i, n;
+
+ GST_DEBUG_OBJECT (trans,
+ "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps,
+ (direction == GST_PAD_SINK) ? "sink" : "src");
+
+ ret = gst_caps_new_empty ();
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ structure = gst_caps_get_structure (caps, i);
+
+ /* If this is already expressed by the existing caps
+ * skip this structure */
+ if (i > 0 && gst_caps_is_subset_structure (ret, structure))
+ continue;
+
+ structure = gst_structure_copy (structure);
+ gst_structure_set (structure,
+ "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+ "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
+
+ /* if pixel aspect ratio, make a range of it */
+ if (gst_structure_has_field (structure, "pixel-aspect-ratio")) {
+ gst_structure_set (structure, "pixel-aspect-ratio",
+ GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL);
+ }
+ gst_caps_append_structure (ret, structure);
+ }
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (ret);
+ ret = intersection;
+ }
+
+ GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret);
+
+ return ret;
+}
+
+
+static gboolean
+gst_video_scale_decide_allocation (GstBaseTransform * trans, GstQuery * query)
+{
+ GstBufferPool *pool = NULL;
+ guint size, min, max, prefix, alignment;
+
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+
+ if (pool) {
+ GstStructure *config;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_META_VIDEO);
+ gst_buffer_pool_set_config (pool, config);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_video_scale_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
+{
+ GstVideoScale *videoscale = GST_VIDEO_SCALE (trans);
+ gboolean ret;
+ GstVideoInfo in_info, out_info;
+ gint from_dar_n, from_dar_d, to_dar_n, to_dar_d;
+
+ ret = gst_video_info_from_caps (&in_info, in);
+ ret &= gst_video_info_from_caps (&out_info, out);
+ if (!ret)
+ goto invalid_formats;
+
+ if (!gst_util_fraction_multiply (in_info.width,
+ in_info.height, out_info.par_n, out_info.par_d, &from_dar_n,
+ &from_dar_d)) {
+ from_dar_n = from_dar_d = -1;
+ }
+
+ if (!gst_util_fraction_multiply (out_info.width,
+ out_info.height, out_info.par_n, out_info.par_d, &to_dar_n,
+ &to_dar_d)) {
+ to_dar_n = to_dar_d = -1;
+ }
+
+ videoscale->borders_w = videoscale->borders_h = 0;
+ if (to_dar_n != from_dar_n || to_dar_d != from_dar_d) {
+ if (videoscale->add_borders) {
+ gint n, d, to_h, to_w;
+
+ if (from_dar_n != -1 && from_dar_d != -1
+ && gst_util_fraction_multiply (from_dar_n, from_dar_d, out_info.par_n,
+ out_info.par_d, &n, &d)) {
+ to_h = gst_util_uint64_scale_int (out_info.width, d, n);
+ if (to_h <= out_info.height) {
+ videoscale->borders_h = out_info.height - to_h;
+ videoscale->borders_w = 0;
+ } else {
+ to_w = gst_util_uint64_scale_int (out_info.height, n, d);
+ g_assert (to_w <= out_info.width);
+ videoscale->borders_h = 0;
+ videoscale->borders_w = out_info.width - to_w;
+ }
+ } else {
+ GST_WARNING_OBJECT (videoscale, "Can't calculate borders");
+ }
+ } else {
+ GST_WARNING_OBJECT (videoscale, "Can't keep DAR!");
+ }
+ }
+
+ if (videoscale->tmp_buf)
+ g_free (videoscale->tmp_buf);
+ videoscale->tmp_buf = g_malloc (out_info.width * 8 * 4);
+
+ gst_base_transform_set_passthrough (trans,
+ (in_info.width == out_info.width && in_info.height == out_info.height));
+
+ GST_DEBUG_OBJECT (videoscale, "from=%dx%d (par=%d/%d dar=%d/%d), size %"
+ G_GSIZE_FORMAT " -> to=%dx%d (par=%d/%d dar=%d/%d borders=%d:%d), "
+ "size %" G_GSIZE_FORMAT,
+ in_info.width, in_info.height, out_info.par_n, out_info.par_d,
+ from_dar_n, from_dar_d, in_info.size, out_info.width,
+ out_info.height, out_info.par_n, out_info.par_d, to_dar_n, to_dar_d,
+ videoscale->borders_w, videoscale->borders_h, out_info.size);
+
+ videoscale->from_info = in_info;
+ videoscale->to_info = out_info;
+
+ return TRUE;
+
+ /* ERRORS */
+invalid_formats:
+ {
+ GST_DEBUG_OBJECT (videoscale, "could not parse formats");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_video_scale_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
+ gsize * size)
+{
+ GstVideoInfo info;
+
+ if (!gst_video_info_from_caps (&info, caps))
+ return FALSE;
+
+ *size = info.size;
+
+ return TRUE;
+}
+
+static void
+gst_video_scale_fixate_caps (GstBaseTransform * base, GstPadDirection direction,
+ GstCaps * caps, GstCaps * othercaps)
+{
+ GstStructure *ins, *outs;
+ const GValue *from_par, *to_par;
+ GValue fpar = { 0, }, tpar = {
+ 0,};
+
+ 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 we're fixating from the sinkpad we always set the PAR and
+ * assume that missing PAR on the sinkpad means 1/1 and
+ * missing PAR on the srcpad means undefined
+ */
+ if (direction == GST_PAD_SINK) {
+ if (!from_par) {
+ g_value_init (&fpar, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&fpar, 1, 1);
+ from_par = &fpar;
+ }
+ if (!to_par) {
+ g_value_init (&tpar, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&tpar, 1, G_MAXINT, G_MAXINT, 1);
+ to_par = &tpar;
+ }
+ } else {
+ if (!to_par) {
+ g_value_init (&tpar, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&tpar, 1, 1);
+ to_par = &tpar;
+
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+ NULL);
+ }
+ if (!from_par) {
+ g_value_init (&fpar, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&fpar, 1, 1);
+ from_par = &fpar;
+ }
+ }
+
+ /* we have both PAR but they might not be fixated */
+ {
+ gint from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d;
+ gint w = 0, h = 0;
+ gint from_dar_n, from_dar_d;
+ gint num, den;
+
+ /* from_par should be fixed */
+ g_return_if_fail (gst_value_is_fixed (from_par));
+
+ from_par_n = gst_value_get_fraction_numerator (from_par);
+ from_par_d = gst_value_get_fraction_denominator (from_par);
+
+ gst_structure_get_int (ins, "width", &from_w);
+ gst_structure_get_int (ins, "height", &from_h);
+
+ gst_structure_get_int (outs, "width", &w);
+ gst_structure_get_int (outs, "height", &h);
+
+ /* if both width and height are already fixed, we can't do anything
+ * about it anymore */
+ if (w && h) {
+ guint n, d;
+
+ GST_DEBUG_OBJECT (base, "dimensions already set to %dx%d, not fixating",
+ w, h);
+ if (!gst_value_is_fixed (to_par)) {
+ if (gst_video_calculate_display_ratio (&n, &d, from_w, from_h,
+ from_par_n, from_par_d, w, h)) {
+ GST_DEBUG_OBJECT (base, "fixating to_par to %dx%d", n, d);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio"))
+ gst_structure_fixate_field_nearest_fraction (outs,
+ "pixel-aspect-ratio", n, d);
+ else if (n != d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ n, d, NULL);
+ }
+ }
+ goto done;
+ }
+
+ /* Calculate input DAR */
+ if (!gst_util_fraction_multiply (from_w, from_h, from_par_n, from_par_d,
+ &from_dar_n, &from_dar_d)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ GST_DEBUG_OBJECT (base, "Input DAR is %d/%d", from_dar_n, from_dar_d);
+
+ /* If either width or height are fixed there's not much we
+ * can do either except choosing a height or width and PAR
+ * that matches the DAR as good as possible
+ */
+ if (h) {
+ GstStructure *tmp;
+ gint set_w, set_par_n, set_par_d;
+
+ GST_DEBUG_OBJECT (base, "height is fixed (%d)", h);
+
+ /* If the PAR is fixed too, there's not much to do
+ * except choosing the width that is nearest to the
+ * width with the same DAR */
+ if (gst_value_is_fixed (to_par)) {
+ to_par_n = gst_value_get_fraction_numerator (to_par);
+ to_par_d = gst_value_get_fraction_denominator (to_par);
+
+ GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d);
+
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d,
+ to_par_n, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ w = (guint) gst_util_uint64_scale_int (h, num, den);
+ gst_structure_fixate_field_nearest_int (outs, "width", w);
+
+ goto done;
+ }
+
+ /* The PAR is not fixed and it's quite likely that we can set
+ * an arbitrary PAR. */
+
+ /* Check if we can keep the input width */
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "width", from_w);
+ gst_structure_get_int (tmp, "width", &set_w);
+
+ /* Might have failed but try to keep the DAR nonetheless by
+ * adjusting the PAR */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, h, set_w,
+ &to_par_n, &to_par_d)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ gst_structure_free (tmp);
+ goto done;
+ }
+
+ if (!gst_structure_has_field (tmp, "pixel-aspect-ratio"))
+ gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par);
+ gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio",
+ to_par_n, to_par_d);
+ gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n,
+ &set_par_d);
+ gst_structure_free (tmp);
+
+ /* Check if the adjusted PAR is accepted */
+ if (set_par_n == to_par_n && set_par_d == to_par_d) {
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d,
+ NULL);
+ goto done;
+ }
+
+ /* Otherwise scale the width to the new PAR and check if the
+ * adjusted with is accepted. If all that fails we can't keep
+ * the DAR */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d,
+ set_par_n, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ w = (guint) gst_util_uint64_scale_int (h, num, den);
+ gst_structure_fixate_field_nearest_int (outs, "width", w);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+
+ goto done;
+ } else if (w) {
+ GstStructure *tmp;
+ gint set_h, set_par_n, set_par_d;
+
+ GST_DEBUG_OBJECT (base, "width is fixed (%d)", w);
+
+ /* If the PAR is fixed too, there's not much to do
+ * except choosing the height that is nearest to the
+ * height with the same DAR */
+ if (gst_value_is_fixed (to_par)) {
+ to_par_n = gst_value_get_fraction_numerator (to_par);
+ to_par_d = gst_value_get_fraction_denominator (to_par);
+
+ GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d);
+
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d,
+ to_par_n, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ h = (guint) gst_util_uint64_scale_int (w, den, num);
+ gst_structure_fixate_field_nearest_int (outs, "height", h);
+
+ goto done;
+ }
+
+ /* The PAR is not fixed and it's quite likely that we can set
+ * an arbitrary PAR. */
+
+ /* Check if we can keep the input height */
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "height", from_h);
+ gst_structure_get_int (tmp, "height", &set_h);
+
+ /* Might have failed but try to keep the DAR nonetheless by
+ * adjusting the PAR */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, w,
+ &to_par_n, &to_par_d)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ gst_structure_free (tmp);
+ goto done;
+ }
+ if (!gst_structure_has_field (tmp, "pixel-aspect-ratio"))
+ gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par);
+ gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio",
+ to_par_n, to_par_d);
+ gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n,
+ &set_par_d);
+ gst_structure_free (tmp);
+
+ /* Check if the adjusted PAR is accepted */
+ if (set_par_n == to_par_n && set_par_d == to_par_d) {
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "height", G_TYPE_INT, set_h,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d,
+ NULL);
+ goto done;
+ }
+
+ /* Otherwise scale the height to the new PAR and check if the
+ * adjusted with is accepted. If all that fails we can't keep
+ * the DAR */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d,
+ set_par_n, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ h = (guint) gst_util_uint64_scale_int (w, den, num);
+ gst_structure_fixate_field_nearest_int (outs, "height", h);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+
+ goto done;
+ } else if (gst_value_is_fixed (to_par)) {
+ GstStructure *tmp;
+ gint set_h, set_w, f_h, f_w;
+
+ to_par_n = gst_value_get_fraction_numerator (to_par);
+ to_par_d = gst_value_get_fraction_denominator (to_par);
+
+ /* Calculate scale factor for the PAR change */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_n,
+ to_par_d, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ /* Try to keep the input height (because of interlacing) */
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "height", from_h);
+ gst_structure_get_int (tmp, "height", &set_h);
+
+ /* This might have failed but try to scale the width
+ * to keep the DAR nonetheless */
+ w = (guint) gst_util_uint64_scale_int (set_h, num, den);
+ gst_structure_fixate_field_nearest_int (tmp, "width", w);
+ gst_structure_get_int (tmp, "width", &set_w);
+ gst_structure_free (tmp);
+
+ /* We kept the DAR and the height is nearest to the original height */
+ if (set_w == w) {
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height",
+ G_TYPE_INT, set_h, NULL);
+ goto done;
+ }
+
+ f_h = set_h;
+ f_w = set_w;
+
+ /* If the former failed, try to keep the input width at least */
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "width", from_w);
+ gst_structure_get_int (tmp, "width", &set_w);
+
+ /* This might have failed but try to scale the width
+ * to keep the DAR nonetheless */
+ h = (guint) gst_util_uint64_scale_int (set_w, den, num);
+ gst_structure_fixate_field_nearest_int (tmp, "height", h);
+ gst_structure_get_int (tmp, "height", &set_h);
+ gst_structure_free (tmp);
+
+ /* We kept the DAR and the width is nearest to the original width */
+ if (set_h == h) {
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height",
+ G_TYPE_INT, set_h, NULL);
+ goto done;
+ }
+
+ /* If all this failed, keep the height that was nearest to the orignal
+ * height and the nearest possible width. This changes the DAR but
+ * there's not much else to do here.
+ */
+ gst_structure_set (outs, "width", G_TYPE_INT, f_w, "height", G_TYPE_INT,
+ f_h, NULL);
+ goto done;
+ } else {
+ GstStructure *tmp;
+ gint set_h, set_w, set_par_n, set_par_d, tmp2;
+
+ /* width, height and PAR are not fixed but passthrough is not possible */
+
+ /* First try to keep the height and width as good as possible
+ * and scale PAR */
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "height", from_h);
+ gst_structure_get_int (tmp, "height", &set_h);
+ gst_structure_fixate_field_nearest_int (tmp, "width", from_w);
+ gst_structure_get_int (tmp, "width", &set_w);
+
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, set_w,
+ &to_par_n, &to_par_d)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ if (!gst_structure_has_field (tmp, "pixel-aspect-ratio"))
+ gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par);
+ gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio",
+ to_par_n, to_par_d);
+ gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n,
+ &set_par_d);
+ gst_structure_free (tmp);
+
+ if (set_par_n == to_par_n && set_par_d == to_par_d) {
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height",
+ G_TYPE_INT, set_h, NULL);
+
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+ goto done;
+ }
+
+ /* Otherwise try to scale width to keep the DAR with the set
+ * PAR and height */
+ if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d,
+ set_par_n, &num, &den)) {
+ GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output scaled size - integer overflow"));
+ goto done;
+ }
+
+ w = (guint) gst_util_uint64_scale_int (set_h, num, den);
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "width", w);
+ gst_structure_get_int (tmp, "width", &tmp2);
+ gst_structure_free (tmp);
+
+ if (tmp2 == w) {
+ gst_structure_set (outs, "width", G_TYPE_INT, tmp2, "height",
+ G_TYPE_INT, set_h, NULL);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+ goto done;
+ }
+
+ /* ... or try the same with the height */
+ h = (guint) gst_util_uint64_scale_int (set_w, den, num);
+ tmp = gst_structure_copy (outs);
+ gst_structure_fixate_field_nearest_int (tmp, "height", h);
+ gst_structure_get_int (tmp, "height", &tmp2);
+ gst_structure_free (tmp);
+
+ if (tmp2 == h) {
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height",
+ G_TYPE_INT, tmp2, NULL);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+ goto done;
+ }
+
+ /* If all fails we can't keep the DAR and take the nearest values
+ * for everything from the first try */
+ gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height",
+ G_TYPE_INT, set_h, NULL);
+ if (gst_structure_has_field (outs, "pixel-aspect-ratio") ||
+ set_par_n != set_par_d)
+ gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION,
+ set_par_n, set_par_d, NULL);
+ }
+ }
+
+done:
+ GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps);
+
+ if (from_par == &fpar)
+ g_value_unset (&fpar);
+ if (to_par == &tpar)
+ g_value_unset (&tpar);
+}
+
+static void
+gst_video_scale_setup_vs_image (VSImage * image, GstVideoFrame * frame,
+ gint component, gint b_w, gint b_h)
+{
+ GstVideoFormat format;
+ gint width, height;
+
+ format = GST_VIDEO_FRAME_FORMAT (frame);
+ width = GST_VIDEO_FRAME_WIDTH (frame);
+ height = GST_VIDEO_FRAME_HEIGHT (frame);
+
+ image->real_width = GST_VIDEO_FRAME_COMP_WIDTH (frame, component);
+ image->real_height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, component);
+ image->width = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame->info.finfo,
+ component, MAX (1, width - b_w));
+ image->height = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame->info.finfo,
+ component, MAX (1, height - b_h));
+
+ image->border_top = (image->real_height - image->height) / 2;
+ image->border_bottom = image->real_height - image->height - image->border_top;
+
+ if (format == GST_VIDEO_FORMAT_YUY2 || format == GST_VIDEO_FORMAT_YVYU
+ || format == GST_VIDEO_FORMAT_UYVY) {
+ g_assert (component == 0);
+
+ image->border_left = (image->real_width - image->width) / 2;
+
+ if (image->border_left % 2 == 1)
+ image->border_left--;
+ image->border_right = image->real_width - image->width - image->border_left;
+ } else {
+ image->border_left = (image->real_width - image->width) / 2;
+ image->border_right = image->real_width - image->width - image->border_left;
+ }
+
+ image->real_pixels = frame->data[component];
+ image->stride = frame->info.stride[component];
+
+ image->pixels =
+ image->real_pixels + image->border_top * image->stride +
+ image->border_left * GST_VIDEO_FRAME_COMP_PSTRIDE (frame, component);
+}
+
+static const guint8 *
+_get_black_for_format (GstVideoFormat format)
+{
+ static const guint8 black[][4] = {
+ {255, 0, 0, 0}, /* 0 = ARGB, ABGR, xRGB, xBGR */
+ {0, 0, 0, 255}, /* 1 = RGBA, BGRA, RGBx, BGRx */
+ {255, 16, 128, 128}, /* 2 = AYUV */
+ {0, 0, 0, 0}, /* 3 = RGB and BGR */
+ {16, 128, 128, 0}, /* 4 = v301 */
+ {16, 128, 16, 128}, /* 5 = YUY2, YUYV */
+ {128, 16, 128, 16}, /* 6 = UYVY */
+ {16, 0, 0, 0}, /* 7 = Y */
+ {0, 0, 0, 0} /* 8 = RGB565, RGB666 */
+ };
+
+ switch (format) {
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_ABGR:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_ARGB64:
+ return black[0];
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_BGRx:
+ return black[1];
+ case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_AYUV64:
+ return black[2];
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ return black[3];
+ case GST_VIDEO_FORMAT_v308:
+ return black[4];
+ case GST_VIDEO_FORMAT_YUY2:
+ case GST_VIDEO_FORMAT_YVYU:
+ return black[5];
+ case GST_VIDEO_FORMAT_UYVY:
+ return black[6];
+ case GST_VIDEO_FORMAT_Y800:
+ case GST_VIDEO_FORMAT_GRAY8:
+ return black[7];
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ case GST_VIDEO_FORMAT_Y16:
+ return NULL; /* Handled by the caller */
+ 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 black[4]; /* Y, U, V, 0 */
+ case GST_VIDEO_FORMAT_RGB16:
+ case GST_VIDEO_FORMAT_RGB15:
+ return black[8];
+ default:
+ return NULL;
+ }
+}
+
+static GstFlowReturn
+gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in,
+ GstBuffer * out)
+{
+ GstVideoScale *videoscale = GST_VIDEO_SCALE (trans);
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstVideoFrame in_frame, out_frame;
+ VSImage dest[4] = { {NULL,}, };
+ VSImage src[4] = { {NULL,}, };
+ gint method;
+ const guint8 *black;
+ gboolean add_borders;
+ GstVideoFormat format;
+ gint i;
+
+ GST_OBJECT_LOCK (videoscale);
+ method = videoscale->method;
+ add_borders = videoscale->add_borders;
+ GST_OBJECT_UNLOCK (videoscale);
+
+ format = GST_VIDEO_INFO_FORMAT (&videoscale->from_info);
+ black = _get_black_for_format (format);
+
+ if (videoscale->from_info.width == 1) {
+ method = GST_VIDEO_SCALE_NEAREST;
+ }
+ if (method == GST_VIDEO_SCALE_4TAP &&
+ (videoscale->from_info.width < 4 || videoscale->from_info.height < 4)) {
+ method = GST_VIDEO_SCALE_BILINEAR;
+ }
+
+ gst_video_frame_map (&in_frame, &videoscale->from_info, in, GST_MAP_READ);
+ gst_video_frame_map (&out_frame, &videoscale->to_info, out, GST_MAP_WRITE);
+
+ for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&in_frame); i++) {
+ gst_video_scale_setup_vs_image (&src[i], &in_frame, i, 0, 0);
+ gst_video_scale_setup_vs_image (&dest[i], &out_frame, i,
+ videoscale->borders_w, videoscale->borders_h);
+ }
+
+ switch (format) {
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_BGRx:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_ABGR:
+ case GST_VIDEO_FORMAT_AYUV:
+ if (add_borders)
+ vs_fill_borders_RGBA (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_RGBA (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_RGBA (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_RGBA (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_LANCZOS:
+ vs_image_scale_lanczos_AYUV (&dest[0], &src[0], videoscale->tmp_buf,
+ videoscale->sharpness, videoscale->dither, videoscale->submethod,
+ videoscale->envelope, videoscale->sharpen);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_ARGB64:
+ case GST_VIDEO_FORMAT_AYUV64:
+ if (add_borders)
+ vs_fill_borders_AYUV64 (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_AYUV64 (&dest[0], &src[0],
+ videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_AYUV64 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_AYUV64 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ case GST_VIDEO_FORMAT_v308:
+ if (add_borders)
+ vs_fill_borders_RGB (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_RGB (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_RGB (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_RGB (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_YUY2:
+ case GST_VIDEO_FORMAT_YVYU:
+ if (add_borders)
+ vs_fill_borders_YUYV (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_YUYV (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_YUYV (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_YUYV (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_UYVY:
+ if (add_borders)
+ vs_fill_borders_UYVY (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_UYVY (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_UYVY (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_UYVY (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_Y800:
+ case GST_VIDEO_FORMAT_GRAY8:
+ if (add_borders)
+ vs_fill_borders_Y (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ case GST_VIDEO_FORMAT_Y16:
+ if (add_borders)
+ vs_fill_borders_Y16 (&dest[0], 0);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_Y16 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_Y16 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_Y16 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ 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:
+ if (add_borders) {
+ vs_fill_borders_Y (&dest[0], black);
+ vs_fill_borders_Y (&dest[1], black + 1);
+ vs_fill_borders_Y (&dest[2], black + 2);
+ }
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ vs_image_scale_nearest_Y (&dest[1], &src[1], videoscale->tmp_buf);
+ vs_image_scale_nearest_Y (&dest[2], &src[2], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ vs_image_scale_linear_Y (&dest[1], &src[1], videoscale->tmp_buf);
+ vs_image_scale_linear_Y (&dest[2], &src[2], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_Y (&dest[0], &src[0], videoscale->tmp_buf);
+ vs_image_scale_4tap_Y (&dest[1], &src[1], videoscale->tmp_buf);
+ vs_image_scale_4tap_Y (&dest[2], &src[2], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_LANCZOS:
+ vs_image_scale_lanczos_Y (&dest[0], &src[0], videoscale->tmp_buf,
+ videoscale->sharpness, videoscale->dither, videoscale->submethod,
+ videoscale->envelope, videoscale->sharpen);
+ vs_image_scale_lanczos_Y (&dest[1], &src[1], videoscale->tmp_buf,
+ videoscale->sharpness, videoscale->dither, videoscale->submethod,
+ videoscale->envelope, videoscale->sharpen);
+ vs_image_scale_lanczos_Y (&dest[2], &src[2], videoscale->tmp_buf,
+ videoscale->sharpness, videoscale->dither, videoscale->submethod,
+ videoscale->envelope, videoscale->sharpen);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_RGB16:
+ if (add_borders)
+ vs_fill_borders_RGB565 (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_RGB565 (&dest[0], &src[0],
+ videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_RGB565 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_RGB565 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ case GST_VIDEO_FORMAT_RGB15:
+ if (add_borders)
+ vs_fill_borders_RGB555 (&dest[0], black);
+ switch (method) {
+ case GST_VIDEO_SCALE_NEAREST:
+ vs_image_scale_nearest_RGB555 (&dest[0], &src[0],
+ videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_BILINEAR:
+ vs_image_scale_linear_RGB555 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ case GST_VIDEO_SCALE_4TAP:
+ vs_image_scale_4tap_RGB555 (&dest[0], &src[0], videoscale->tmp_buf);
+ break;
+ default:
+ goto unknown_mode;
+ }
+ break;
+ default:
+ goto unsupported;
+ }
+
+ GST_LOG_OBJECT (videoscale, "pushing buffer of %" G_GSIZE_FORMAT " bytes",
+ gst_buffer_get_size (out));
+
+done:
+ gst_video_frame_unmap (&out_frame);
+ gst_video_frame_unmap (&in_frame);
+
+ return ret;
+
+ /* ERRORS */
+unsupported:
+ {
+ GST_ELEMENT_ERROR (videoscale, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("Unsupported format %d for scaling method %d", format, method));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+unknown_mode:
+ {
+ GST_ELEMENT_ERROR (videoscale, STREAM, NOT_IMPLEMENTED, (NULL),
+ ("Unknown scaling method %d", videoscale->method));
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static gboolean
+gst_video_scale_src_event (GstBaseTransform * trans, GstEvent * event)
+{
+ GstVideoScale *videoscale = GST_VIDEO_SCALE (trans);
+ gboolean ret;
+ gdouble a;
+ GstStructure *structure;
+
+ GST_DEBUG_OBJECT (videoscale, "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 * videoscale->from_info.width / videoscale->to_info.width, NULL);
+ }
+ if (gst_structure_get_double (structure, "pointer_y", &a)) {
+ gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE,
+ a * videoscale->from_info.height / videoscale->to_info.height,
+ NULL);
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event);
+
+ return ret;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_videoscale_orc_init ();
+
+ if (!gst_element_register (plugin, "videoscale", GST_RANK_NONE,
+ GST_TYPE_VIDEO_SCALE))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (video_scale_debug, "videoscale", 0,
+ "videoscale element");
+
+ vs_4tap_init ();
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "videoscale",
+ "Resizes video", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME,
+ GST_PACKAGE_ORIGIN)
diff --git a/gst/videoscale/gstvideoscale.h b/gst/videoscale/gstvideoscale.h
new file mode 100644
index 0000000..c414b3f
--- /dev/null
+++ b/gst/videoscale/gstvideoscale.h
@@ -0,0 +1,100 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VIDEO_SCALE_H__
+#define __GST_VIDEO_SCALE_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/gstvideofilter.h>
+
+#include "vs_image.h"
+
+G_BEGIN_DECLS
+
+GST_DEBUG_CATEGORY_EXTERN (video_scale_debug);
+#define GST_CAT_DEFAULT video_scale_debug
+
+#define GST_TYPE_VIDEO_SCALE \
+ (gst_video_scale_get_type())
+#define GST_VIDEO_SCALE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_SCALE,GstVideoScale))
+#define GST_VIDEO_SCALE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_SCALE,GstVideoScaleClass))
+#define GST_IS_VIDEO_SCALE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_SCALE))
+#define GST_IS_VIDEO_SCALE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_SCALE))
+
+/**
+ * GstVideoScaleMethod:
+ * @GST_VIDEO_SCALE_NEAREST: use nearest neighbour scaling (fast and ugly)
+ * @GST_VIDEO_SCALE_BILINEAR: use bilinear scaling (slower but prettier).
+ * @GST_VIDEO_SCALE_4TAP: use a 4-tap filter for scaling (slow).
+ * @GST_VIDEO_SCALE_LANCZOS: use a multitap Lanczos filter for scaling (slow).
+ *
+ * The videoscale method to use.
+ */
+typedef enum {
+ GST_VIDEO_SCALE_NEAREST,
+ GST_VIDEO_SCALE_BILINEAR,
+ GST_VIDEO_SCALE_4TAP,
+ GST_VIDEO_SCALE_LANCZOS
+} GstVideoScaleMethod;
+
+typedef struct _GstVideoScale GstVideoScale;
+typedef struct _GstVideoScaleClass GstVideoScaleClass;
+
+/**
+ * GstVideoScale:
+ *
+ * Opaque data structure
+ */
+struct _GstVideoScale {
+ GstVideoFilter element;
+
+ /* properties */
+ GstVideoScaleMethod method;
+ gboolean add_borders;
+ double sharpness;
+ double sharpen;
+ gboolean dither;
+ int submethod;
+ double envelope;
+
+ /* negotiated stuff */
+ GstVideoInfo from_info;
+ GstVideoInfo to_info;
+
+ gint borders_h;
+ gint borders_w;
+
+ /*< private >*/
+ guint8 *tmp_buf;
+};
+
+struct _GstVideoScaleClass {
+ GstVideoFilterClass parent_class;
+};
+
+GType gst_video_scale_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_SCALE_H__ */
diff --git a/gst/videoscale/gstvideoscaleorc-dist.c b/gst/videoscale/gstvideoscaleorc-dist.c
new file mode 100644
index 0000000..034baf5
--- /dev/null
+++ b/gst/videoscale/gstvideoscaleorc-dist.c
@@ -0,0 +1,2264 @@
+
+/* autogenerated from gstvideoscaleorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void orc_merge_linear_u8 (orc_uint8 * ORC_RESTRICT d1,
+ const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
+ int p1, int n);
+void orc_merge_linear_u16 (orc_uint16 * ORC_RESTRICT d1,
+ const orc_uint16 * ORC_RESTRICT s1, const orc_uint16 * ORC_RESTRICT s2,
+ int p1, int p2, int n);
+void orc_splat_u16 (orc_uint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_splat_u32 (orc_uint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_splat_u64 (orc_uint64 * ORC_RESTRICT d1, orc_int64 p1, int n);
+void orc_downsample_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void orc_downsample_u16 (guint16 * ORC_RESTRICT d1,
+ const guint16 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_downsample_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_downsample_yuyv (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_resample_nearest_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_nearest_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n);
+void gst_videoscale_orc_merge_bicubic_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int p1,
+ int p2, int p3, int p4, int n);
+
+void gst_videoscale_orc_init (void);
+
+
+/* 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_merge_linear_u8 */
+#ifdef DISABLE_ORC
+void
+orc_merge_linear_u8 (orc_uint8 * ORC_RESTRICT d1,
+ const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
+ int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ const orc_int8 *ORC_RESTRICT ptr5;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_int8 var47;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+
+ /* 6: loadpw */
+ var38.i = p1;
+ /* 8: loadpw */
+ var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var41 = ptr4[i];
+ /* 1: loadb */
+ var36 = ptr4[i];
+ /* 2: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 3: loadb */
+ var37 = ptr5[i];
+ /* 4: convubw */
+ var43.i = (orc_uint8) var37;
+ /* 5: subw */
+ var44.i = var43.i - var42.i;
+ /* 7: mullw */
+ var45.i = (var44.i * var38.i) & 0xffff;
+ /* 9: addw */
+ var46.i = var45.i + var39.i;
+ /* 10: convhwb */
+ var47 = ((orc_uint16) var46.i) >> 8;
+ /* 11: addb */
+ var40 = var47 + var41;
+ /* 12: storeb */
+ ptr0[i] = var40;
+ }
+
+}
+
+#else
+static void
+_backup_orc_merge_linear_u8 (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 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union16 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_int8 var47;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+ ptr5 = (orc_int8 *) ex->arrays[5];
+
+ /* 6: loadpw */
+ var38.i = ex->params[24];
+ /* 8: loadpw */
+ var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var41 = ptr4[i];
+ /* 1: loadb */
+ var36 = ptr4[i];
+ /* 2: convubw */
+ var42.i = (orc_uint8) var36;
+ /* 3: loadb */
+ var37 = ptr5[i];
+ /* 4: convubw */
+ var43.i = (orc_uint8) var37;
+ /* 5: subw */
+ var44.i = var43.i - var42.i;
+ /* 7: mullw */
+ var45.i = (var44.i * var38.i) & 0xffff;
+ /* 9: addw */
+ var46.i = var45.i + var39.i;
+ /* 10: convhwb */
+ var47 = ((orc_uint16) var46.i) >> 8;
+ /* 11: addb */
+ var40 = var47 + var41;
+ /* 12: storeb */
+ ptr0[i] = var40;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_merge_linear_u8;
+void
+orc_merge_linear_u8 (orc_uint8 * ORC_RESTRICT d1,
+ const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
+ int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_merge_linear_u8;
+ void (*func) (OrcExecutor *);
+
+ 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->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_merge_linear_u16 */
+#ifdef DISABLE_ORC
+void
+orc_merge_linear_u16 (orc_uint16 * ORC_RESTRICT d1,
+ const orc_uint16 * ORC_RESTRICT s1, const orc_uint16 * ORC_RESTRICT s2,
+ int p1, int p2, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union16 *) s1;
+ ptr5 = (orc_union16 *) s2;
+
+ /* 1: loadpw */
+ var35.i = p1;
+ /* 4: loadpw */
+ var37.i = p2;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 2: muluwl */
+ var39.i = ((orc_uint16) var34.i) * ((orc_uint16) var35.i);
+ /* 3: loadw */
+ var36 = ptr5[i];
+ /* 5: muluwl */
+ var40.i = ((orc_uint16) var36.i) * ((orc_uint16) var37.i);
+ /* 6: addl */
+ var41.i = var39.i + var40.i;
+ /* 7: shrul */
+ var42.i = ((orc_uint32) var41.i) >> 16;
+ /* 8: convlw */
+ var38.i = var42.i;
+ /* 9: storew */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_orc_merge_linear_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ const orc_union16 *ORC_RESTRICT ptr5;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+ ptr5 = (orc_union16 *) ex->arrays[5];
+
+ /* 1: loadpw */
+ var35.i = ex->params[24];
+ /* 4: loadpw */
+ var37.i = ex->params[25];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 2: muluwl */
+ var39.i = ((orc_uint16) var34.i) * ((orc_uint16) var35.i);
+ /* 3: loadw */
+ var36 = ptr5[i];
+ /* 5: muluwl */
+ var40.i = ((orc_uint16) var36.i) * ((orc_uint16) var37.i);
+ /* 6: addl */
+ var41.i = var39.i + var40.i;
+ /* 7: shrul */
+ var42.i = ((orc_uint32) var41.i) >> 16;
+ /* 8: convlw */
+ var38.i = var42.i;
+ /* 9: storew */
+ ptr0[i] = var38;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_merge_linear_u16;
+void
+orc_merge_linear_u16 (orc_uint16 * ORC_RESTRICT d1,
+ const orc_uint16 * ORC_RESTRICT s1, const orc_uint16 * ORC_RESTRICT s2,
+ int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_merge_linear_u16;
+ void (*func) (OrcExecutor *);
+
+ 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->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_splat_u16 */
+#ifdef DISABLE_ORC
+void
+orc_splat_u16 (orc_uint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) d1;
+
+ /* 0: loadpw */
+ var32.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_splat_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+
+ /* 0: loadpw */
+ var32.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_splat_u16;
+void
+orc_splat_u16 (orc_uint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_splat_u16;
+ void (*func) (OrcExecutor *);
+
+ 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_splat_u32 */
+#ifdef DISABLE_ORC
+void
+orc_splat_u32 (orc_uint32 * 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;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_splat_u32;
+void
+orc_splat_u32 (orc_uint32 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_splat_u32;
+ void (*func) (OrcExecutor *);
+
+ 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_splat_u64 */
+#ifdef DISABLE_ORC
+void
+orc_splat_u64 (orc_uint64 * ORC_RESTRICT d1, orc_int64 p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) d1;
+
+ /* 0: loadpq */
+ var32.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_splat_u64 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+
+ /* 0: loadpq */
+ var32.i =
+ (ex->params[24] & 0xffffffff) | ((orc_uint64) (ex->params[24 +
+ (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_splat_u64;
+void
+orc_splat_u64 (orc_uint64 * ORC_RESTRICT d1, orc_int64 p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_splat_u64;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ {
+ orc_union64 tmp;
+ tmp.i = p1;
+ ex->params[ORC_VAR_P1] = tmp.x2[0];
+ ex->params[ORC_VAR_T1] = tmp.x2[1];
+ }
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_downsample_u8 */
+#ifdef DISABLE_ORC
+void
+orc_downsample_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union16 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var34.i;
+ var36 = _src.x2[1];
+ var37 = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+ /* 3: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_downsample_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union16 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var34.i;
+ var36 = _src.x2[1];
+ var37 = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+ /* 3: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_downsample_u8;
+void
+orc_downsample_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_downsample_u8;
+ void (*func) (OrcExecutor *);
+
+ 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_downsample_u16 */
+#ifdef DISABLE_ORC
+void
+orc_downsample_u16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1,
+ int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[1];
+ var37.i = _src.x2[0];
+ }
+ /* 2: avguw */
+ var35.i = ((orc_uint16) var36.i + (orc_uint16) var37.i + 1) >> 1;
+ /* 3: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_downsample_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var34;
+ orc_union16 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var34 = ptr4[i];
+ /* 1: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[1];
+ var37.i = _src.x2[0];
+ }
+ /* 2: avguw */
+ var35.i = ((orc_uint16) var36.i + (orc_uint16) var37.i + 1) >> 1;
+ /* 3: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_downsample_u16;
+void
+orc_downsample_u16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1,
+ int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_downsample_u16;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_videoscale_orc_downsample_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_downsample_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: splitql */
+ {
+ orc_union64 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[1];
+ var37.i = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35.x4[0] = ((orc_uint8) var36.x4[0] + (orc_uint8) var37.x4[0] + 1) >> 1;
+ var35.x4[1] = ((orc_uint8) var36.x4[1] + (orc_uint8) var37.x4[1] + 1) >> 1;
+ var35.x4[2] = ((orc_uint8) var36.x4[2] + (orc_uint8) var37.x4[2] + 1) >> 1;
+ var35.x4[3] = ((orc_uint8) var36.x4[3] + (orc_uint8) var37.x4[3] + 1) >> 1;
+ /* 3: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_downsample_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: splitql */
+ {
+ orc_union64 _src;
+ _src.i = var34.i;
+ var36.i = _src.x2[1];
+ var37.i = _src.x2[0];
+ }
+ /* 2: avgub */
+ var35.x4[0] = ((orc_uint8) var36.x4[0] + (orc_uint8) var37.x4[0] + 1) >> 1;
+ var35.x4[1] = ((orc_uint8) var36.x4[1] + (orc_uint8) var37.x4[1] + 1) >> 1;
+ var35.x4[2] = ((orc_uint8) var36.x4[2] + (orc_uint8) var37.x4[2] + 1) >> 1;
+ var35.x4[3] = ((orc_uint8) var36.x4[3] + (orc_uint8) var37.x4[3] + 1) >> 1;
+ /* 3: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_downsample_u32;
+void
+gst_videoscale_orc_downsample_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_downsample_u32;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_videoscale_orc_downsample_yuyv */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_downsample_yuyv (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_union16 var47;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[0];
+ var40.x4[0] = _src.x2[1];
+ var41.x4[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[1];
+ var40.x4[1] = _src.x2[1];
+ var41.x4[1] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[2];
+ var40.x4[2] = _src.x2[1];
+ var41.x4[2] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[3];
+ var40.x4[3] = _src.x2[1];
+ var41.x4[3] = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var42.x2[0] = _src.x2[1];
+ var43.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var42.x2[1] = _src.x2[1];
+ var43.x2[1] = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var41.i;
+ var45.i = _src.x2[1];
+ var46.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var47.x2[0] = ((orc_uint8) var45.x2[0] + (orc_uint8) var46.x2[0] + 1) >> 1;
+ var47.x2[1] = ((orc_uint8) var45.x2[1] + (orc_uint8) var46.x2[1] + 1) >> 1;
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var47.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var47.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_downsample_yuyv (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union16 var42;
+ orc_union16 var43;
+ orc_union16 var44;
+ orc_union16 var45;
+ orc_union16 var46;
+ orc_union16 var47;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var38 = ptr4[i];
+ /* 1: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[0];
+ var40.x4[0] = _src.x2[1];
+ var41.x4[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[1];
+ var40.x4[1] = _src.x2[1];
+ var41.x4[1] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[2];
+ var40.x4[2] = _src.x2[1];
+ var41.x4[2] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var38.x4[3];
+ var40.x4[3] = _src.x2[1];
+ var41.x4[3] = _src.x2[0];
+ }
+ /* 2: splitwb */
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[0];
+ var42.x2[0] = _src.x2[1];
+ var43.x2[0] = _src.x2[0];
+ }
+ {
+ orc_union16 _src;
+ _src.i = var40.x2[1];
+ var42.x2[1] = _src.x2[1];
+ var43.x2[1] = _src.x2[0];
+ }
+ /* 3: avgub */
+ var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+ var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+ /* 4: splitlw */
+ {
+ orc_union32 _src;
+ _src.i = var41.i;
+ var45.i = _src.x2[1];
+ var46.i = _src.x2[0];
+ }
+ /* 5: avgub */
+ var47.x2[0] = ((orc_uint8) var45.x2[0] + (orc_uint8) var46.x2[0] + 1) >> 1;
+ var47.x2[1] = ((orc_uint8) var45.x2[1] + (orc_uint8) var46.x2[1] + 1) >> 1;
+ /* 6: mergebw */
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[0];
+ _dest.x2[1] = var47.x2[0];
+ var39.x2[0] = _dest.i;
+ }
+ {
+ orc_union16 _dest;
+ _dest.x2[0] = var44.x2[1];
+ _dest.x2[1] = var47.x2[1];
+ var39.x2[1] = _dest.i;
+ }
+ /* 7: storel */
+ ptr0[i] = var39;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_downsample_yuyv;
+void
+gst_videoscale_orc_downsample_yuyv (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_downsample_yuyv;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_videoscale_orc_resample_nearest_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_nearest_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearb */
+ var32 = ptr4[(p1 + i * p2) >> 16];
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_nearest_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearb */
+ var32 = ptr4[(ex->params[24] + i * ex->params[25]) >> 16];
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_nearest_u8;
+void
+gst_videoscale_orc_resample_nearest_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_resample_nearest_u8;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_bilinear_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_bilinear_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinb */
+ {
+ int tmp = p1 + i * p2;
+ var32 =
+ ((orc_uint8) ptr4[tmp >> 16] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) ptr4[(tmp >> 16) + 1] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_bilinear_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_int8 *ORC_RESTRICT ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinb */
+ {
+ int tmp = ex->params[24] + i * ex->params[25];
+ var32 =
+ ((orc_uint8) ptr4[tmp >> 16] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) ptr4[(tmp >> 16) + 1] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_bilinear_u8;
+void
+gst_videoscale_orc_resample_bilinear_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_resample_bilinear_u8;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_nearest_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_nearest_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearl */
+ var32 = ptr4[(p1 + i * p2) >> 16];
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_nearest_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;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearl */
+ var32 = ptr4[(ex->params[24] + i * ex->params[25]) >> 16];
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_nearest_u32;
+void
+gst_videoscale_orc_resample_nearest_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_resample_nearest_u32;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_bilinear_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var32;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinl */
+ {
+ int tmp = p1 + i * p2;
+ orc_union32 a = ptr4[tmp >> 16];
+ orc_union32 b = ptr4[(tmp >> 16) + 1];
+ var32.x4[0] =
+ ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[1] =
+ ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[2] =
+ ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[3] =
+ ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_bilinear_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;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinl */
+ {
+ int tmp = ex->params[24] + i * ex->params[25];
+ orc_union32 a = ptr4[tmp >> 16];
+ orc_union32 b = ptr4[(tmp >> 16) + 1];
+ var32.x4[0] =
+ ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[1] =
+ ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[2] =
+ ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+ var32.x4[3] =
+ ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_bilinear_u32;
+void
+gst_videoscale_orc_resample_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, int p1, int p2, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_resample_bilinear_u32;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_merge_bilinear_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union64 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+ orc_union64 var44;
+ orc_union32 var45;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr1 = (orc_union32 *) d2;
+ ptr4 = (orc_union32 *) s1;
+ ptr5 = (orc_union32 *) s2;
+
+ /* 6: loadpw */
+ var37.x4[0] = p1;
+ var37.x4[1] = p1;
+ var37.x4[2] = p1;
+ var37.x4[3] = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinl */
+ {
+ int tmp = p2 + i * p3;
+ orc_union32 a = ptr5[tmp >> 16];
+ orc_union32 b = ptr5[(tmp >> 16) + 1];
+ var39.x4[0] =
+ ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[1] =
+ ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[2] =
+ ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[3] =
+ ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storel */
+ ptr1[i] = var39;
+ /* 2: loadl */
+ var40 = ptr4[i];
+ /* 3: convubw */
+ var41.x4[0] = (orc_uint8) var40.x4[0];
+ var41.x4[1] = (orc_uint8) var40.x4[1];
+ var41.x4[2] = (orc_uint8) var40.x4[2];
+ var41.x4[3] = (orc_uint8) var40.x4[3];
+ /* 4: convubw */
+ var42.x4[0] = (orc_uint8) var39.x4[0];
+ var42.x4[1] = (orc_uint8) var39.x4[1];
+ var42.x4[2] = (orc_uint8) var39.x4[2];
+ var42.x4[3] = (orc_uint8) var39.x4[3];
+ /* 5: subw */
+ var43.x4[0] = var42.x4[0] - var41.x4[0];
+ var43.x4[1] = var42.x4[1] - var41.x4[1];
+ var43.x4[2] = var42.x4[2] - var41.x4[2];
+ var43.x4[3] = var42.x4[3] - var41.x4[3];
+ /* 7: mullw */
+ var44.x4[0] = (var43.x4[0] * var37.x4[0]) & 0xffff;
+ var44.x4[1] = (var43.x4[1] * var37.x4[1]) & 0xffff;
+ var44.x4[2] = (var43.x4[2] * var37.x4[2]) & 0xffff;
+ var44.x4[3] = (var43.x4[3] * var37.x4[3]) & 0xffff;
+ /* 8: convhwb */
+ var45.x4[0] = ((orc_uint16) var44.x4[0]) >> 8;
+ var45.x4[1] = ((orc_uint16) var44.x4[1]) >> 8;
+ var45.x4[2] = ((orc_uint16) var44.x4[2]) >> 8;
+ var45.x4[3] = ((orc_uint16) var44.x4[3]) >> 8;
+ /* 9: addb */
+ var38.x4[0] = var45.x4[0] + var40.x4[0];
+ var38.x4[1] = var45.x4[1] + var40.x4[1];
+ var38.x4[2] = var45.x4[2] + var40.x4[2];
+ var38.x4[3] = var45.x4[3] + var40.x4[3];
+ /* 10: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_merge_bilinear_u32 (OrcExecutor *
+ ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 *ORC_RESTRICT ptr1;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ const orc_union32 *ORC_RESTRICT ptr5;
+ orc_union64 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union64 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+ orc_union64 var44;
+ orc_union32 var45;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr1 = (orc_union32 *) ex->arrays[1];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+ ptr5 = (orc_union32 *) ex->arrays[5];
+
+ /* 6: loadpw */
+ var37.x4[0] = ex->params[24];
+ var37.x4[1] = ex->params[24];
+ var37.x4[2] = ex->params[24];
+ var37.x4[3] = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinl */
+ {
+ int tmp = ex->params[25] + i * ex->params[26];
+ orc_union32 a = ptr5[tmp >> 16];
+ orc_union32 b = ptr5[(tmp >> 16) + 1];
+ var39.x4[0] =
+ ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[1] =
+ ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[2] =
+ ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+ var39.x4[3] =
+ ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+ (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+ }
+ /* 1: storel */
+ ptr1[i] = var39;
+ /* 2: loadl */
+ var40 = ptr4[i];
+ /* 3: convubw */
+ var41.x4[0] = (orc_uint8) var40.x4[0];
+ var41.x4[1] = (orc_uint8) var40.x4[1];
+ var41.x4[2] = (orc_uint8) var40.x4[2];
+ var41.x4[3] = (orc_uint8) var40.x4[3];
+ /* 4: convubw */
+ var42.x4[0] = (orc_uint8) var39.x4[0];
+ var42.x4[1] = (orc_uint8) var39.x4[1];
+ var42.x4[2] = (orc_uint8) var39.x4[2];
+ var42.x4[3] = (orc_uint8) var39.x4[3];
+ /* 5: subw */
+ var43.x4[0] = var42.x4[0] - var41.x4[0];
+ var43.x4[1] = var42.x4[1] - var41.x4[1];
+ var43.x4[2] = var42.x4[2] - var41.x4[2];
+ var43.x4[3] = var42.x4[3] - var41.x4[3];
+ /* 7: mullw */
+ var44.x4[0] = (var43.x4[0] * var37.x4[0]) & 0xffff;
+ var44.x4[1] = (var43.x4[1] * var37.x4[1]) & 0xffff;
+ var44.x4[2] = (var43.x4[2] * var37.x4[2]) & 0xffff;
+ var44.x4[3] = (var43.x4[3] * var37.x4[3]) & 0xffff;
+ /* 8: convhwb */
+ var45.x4[0] = ((orc_uint16) var44.x4[0]) >> 8;
+ var45.x4[1] = ((orc_uint16) var44.x4[1]) >> 8;
+ var45.x4[2] = ((orc_uint16) var44.x4[2]) >> 8;
+ var45.x4[3] = ((orc_uint16) var44.x4[3]) >> 8;
+ /* 9: addb */
+ var38.x4[0] = var45.x4[0] + var40.x4[0];
+ var38.x4[1] = var45.x4[1] + var40.x4[1];
+ var38.x4[2] = var45.x4[2] + var40.x4[2];
+ var38.x4[3] = var45.x4[3] + var40.x4[3];
+ /* 10: storel */
+ ptr0[i] = var38;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_merge_bilinear_u32;
+void
+gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * ORC_RESTRICT d1,
+ guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1,
+ const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_resample_merge_bilinear_u32;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->arrays[ORC_VAR_D2] = d2;
+ ex->arrays[ORC_VAR_S1] = (void *) s1;
+ ex->arrays[ORC_VAR_S2] = (void *) s2;
+ ex->params[ORC_VAR_P1] = p1;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_merge_bicubic_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_merge_bicubic_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int p1,
+ int p2, int p3, int p4, 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 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_int8 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;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_int8 *) s1;
+ ptr5 = (orc_int8 *) s2;
+ ptr6 = (orc_int8 *) s3;
+ ptr7 = (orc_int8 *) s4;
+
+ /* 1: loadpb */
+ var35 = p2;
+ /* 4: loadpb */
+ var37 = p3;
+ /* 8: loadpb */
+ var39 = p1;
+ /* 12: loadpb */
+ var41 = p4;
+ /* 15: loadpw */
+ var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 2: mulubw */
+ var44.i = ((orc_uint8) var34) * ((orc_uint8) var35);
+ /* 3: loadb */
+ var36 = ptr6[i];
+ /* 5: mulubw */
+ var45.i = ((orc_uint8) var36) * ((orc_uint8) var37);
+ /* 6: addw */
+ var46.i = var44.i + var45.i;
+ /* 7: loadb */
+ var38 = ptr4[i];
+ /* 9: mulubw */
+ var47.i = ((orc_uint8) var38) * ((orc_uint8) var39);
+ /* 10: subw */
+ var48.i = var46.i - var47.i;
+ /* 11: loadb */
+ var40 = ptr7[i];
+ /* 13: mulubw */
+ var49.i = ((orc_uint8) var40) * ((orc_uint8) var41);
+ /* 14: subw */
+ var50.i = var48.i - var49.i;
+ /* 16: addw */
+ var51.i = var50.i + var42.i;
+ /* 17: shrsw */
+ var52.i = var51.i >> 6;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var52.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_merge_bicubic_u8 (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 var34;
+ orc_int8 var35;
+ orc_int8 var36;
+ orc_int8 var37;
+ orc_int8 var38;
+ orc_int8 var39;
+ orc_int8 var40;
+ orc_int8 var41;
+ orc_union16 var42;
+ orc_int8 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;
+
+ 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];
+
+ /* 1: loadpb */
+ var35 = ex->params[25];
+ /* 4: loadpb */
+ var37 = ex->params[26];
+ /* 8: loadpb */
+ var39 = ex->params[24];
+ /* 12: loadpb */
+ var41 = ex->params[27];
+ /* 15: loadpw */
+ var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var34 = ptr5[i];
+ /* 2: mulubw */
+ var44.i = ((orc_uint8) var34) * ((orc_uint8) var35);
+ /* 3: loadb */
+ var36 = ptr6[i];
+ /* 5: mulubw */
+ var45.i = ((orc_uint8) var36) * ((orc_uint8) var37);
+ /* 6: addw */
+ var46.i = var44.i + var45.i;
+ /* 7: loadb */
+ var38 = ptr4[i];
+ /* 9: mulubw */
+ var47.i = ((orc_uint8) var38) * ((orc_uint8) var39);
+ /* 10: subw */
+ var48.i = var46.i - var47.i;
+ /* 11: loadb */
+ var40 = ptr7[i];
+ /* 13: mulubw */
+ var49.i = ((orc_uint8) var40) * ((orc_uint8) var41);
+ /* 14: subw */
+ var50.i = var48.i - var49.i;
+ /* 16: addw */
+ var51.i = var50.i + var42.i;
+ /* 17: shrsw */
+ var52.i = var51.i >> 6;
+ /* 18: convsuswb */
+ var43 = ORC_CLAMP_UB (var52.i);
+ /* 19: storeb */
+ ptr0[i] = var43;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_merge_bicubic_u8;
+void
+gst_videoscale_orc_merge_bicubic_u8 (guint8 * ORC_RESTRICT d1,
+ const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
+ const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int p1,
+ int p2, int p3, int p4, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_videoscale_orc_merge_bicubic_u8;
+ void (*func) (OrcExecutor *);
+
+ 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;
+ ex->params[ORC_VAR_P2] = p2;
+ ex->params[ORC_VAR_P3] = p3;
+ ex->params[ORC_VAR_P4] = p4;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+void
+gst_videoscale_orc_init (void)
+{
+#ifndef DISABLE_ORC
+ {
+ /* orc_merge_linear_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_merge_linear_u8");
+ orc_program_set_backup_function (p, _backup_orc_merge_linear_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_source (p, 1, "s2");
+ orc_program_add_constant (p, 4, 0x00000080, "c1");
+ orc_program_add_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+ orc_program_add_temporary (p, 1, "t3");
+ orc_program_add_temporary (p, 1, "t4");
+
+ orc_program_append_2 (p, "loadb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ 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, "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, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convhwb", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 0, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_merge_linear_u8 = p;
+ }
+ {
+ /* orc_merge_linear_u16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_merge_linear_u16");
+ orc_program_set_backup_function (p, _backup_orc_merge_linear_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_source (p, 2, "s2");
+ orc_program_add_constant (p, 4, 0x00000010, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_parameter (p, 2, "p2");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_merge_linear_u16 = p;
+ }
+ {
+ /* orc_splat_u16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_splat_u16");
+ orc_program_set_backup_function (p, _backup_orc_splat_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_parameter (p, 2, "p1");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_splat_u16 = p;
+ }
+ {
+ /* orc_splat_u32 */
+ OrcProgram *p;
+
+ 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);
+
+ _orc_program_orc_splat_u32 = p;
+ }
+ {
+ /* orc_splat_u64 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_splat_u64");
+ orc_program_set_backup_function (p, _backup_orc_splat_u64);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_parameter_int64 (p, 8, "p1");
+
+ orc_program_append_2 (p, "copyq", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_splat_u64 = p;
+ }
+ {
+ /* orc_downsample_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_downsample_u8");
+ orc_program_set_backup_function (p, _backup_orc_downsample_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 2, "s1");
+ orc_program_add_temporary (p, 1, "t1");
+ orc_program_add_temporary (p, 1, "t2");
+
+ orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_downsample_u8 = p;
+ }
+ {
+ /* orc_downsample_u16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_downsample_u16");
+ orc_program_set_backup_function (p, _backup_orc_downsample_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avguw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_downsample_u16 = p;
+ }
+ {
+ /* gst_videoscale_orc_downsample_u32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_downsample_u32");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_downsample_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "splitql", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 2, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_downsample_u32 = p;
+ }
+ {
+ /* gst_videoscale_orc_downsample_yuyv */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_downsample_yuyv");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_downsample_yuyv);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ 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, 2, "t4");
+ orc_program_add_temporary (p, 2, "t5");
+ orc_program_add_temporary (p, 2, "t6");
+
+ orc_program_append_2 (p, "splitwb", 2, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "avgub", 1, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_T4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T5, ORC_VAR_T6,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_downsample_yuyv = p;
+ }
+ {
+ /* gst_videoscale_orc_resample_nearest_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_resample_nearest_u8");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_resample_nearest_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+
+ orc_program_append_2 (p, "ldresnearb", 0, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_P1, ORC_VAR_P2);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_resample_nearest_u8 = p;
+ }
+ {
+ /* gst_videoscale_orc_resample_bilinear_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_resample_bilinear_u8");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_resample_bilinear_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 1, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+
+ orc_program_append_2 (p, "ldreslinb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_P2);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_resample_bilinear_u8 = p;
+ }
+ {
+ /* gst_videoscale_orc_resample_nearest_u32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_resample_nearest_u32");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_resample_nearest_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+
+ orc_program_append_2 (p, "ldresnearl", 0, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_P1, ORC_VAR_P2);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_resample_nearest_u32 = p;
+ }
+ {
+ /* gst_videoscale_orc_resample_bilinear_u32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_resample_bilinear_u32");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_resample_bilinear_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+
+ orc_program_append_2 (p, "ldreslinl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_P2);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_resample_bilinear_u32 = p;
+ }
+ {
+ /* gst_videoscale_orc_resample_merge_bilinear_u32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_resample_merge_bilinear_u32");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_resample_merge_bilinear_u32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_destination (p, 4, "d2");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_source (p, 4, "s2");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+ orc_program_add_parameter (p, 4, "p3");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+ orc_program_add_temporary (p, 8, "t4");
+ orc_program_add_temporary (p, 8, "t5");
+
+ orc_program_append_2 (p, "ldreslinl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
+ ORC_VAR_P3);
+ orc_program_append_2 (p, "storel", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T2, 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, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convhwb", 2, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_videoscale_orc_resample_merge_bilinear_u32 = p;
+ }
+ {
+ /* gst_videoscale_orc_merge_bicubic_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_videoscale_orc_merge_bicubic_u8");
+ orc_program_set_backup_function (p,
+ _backup_gst_videoscale_orc_merge_bicubic_u8);
+ 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, 0x00000020, "c1");
+ orc_program_add_constant (p, 4, 0x00000006, "c2");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_parameter (p, 4, "p2");
+ orc_program_add_parameter (p, 4, "p3");
+ orc_program_add_parameter (p, 4, "p4");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 2, "t2");
+
+ orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_P2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_P3,
+ 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, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_P4,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ 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_C2,
+ 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);
+
+ _orc_program_gst_videoscale_orc_merge_bicubic_u8 = p;
+ }
+#endif
+}
diff --git a/gst/videoscale/gstvideoscaleorc-dist.h b/gst/videoscale/gstvideoscaleorc-dist.h
new file mode 100644
index 0000000..214b72f
--- /dev/null
+++ b/gst/videoscale/gstvideoscaleorc-dist.h
@@ -0,0 +1,93 @@
+
+/* autogenerated from gstvideoscaleorc.orc */
+
+#ifndef _GSTVIDEOSCALEORC_H_
+#define _GSTVIDEOSCALEORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void gst_videoscale_orc_init (void);
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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_merge_linear_u8 (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, int p1, int n);
+void orc_merge_linear_u16 (orc_uint16 * ORC_RESTRICT d1, const orc_uint16 * ORC_RESTRICT s1, const orc_uint16 * ORC_RESTRICT s2, int p1, int p2, int n);
+void orc_splat_u16 (orc_uint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_splat_u32 (orc_uint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_splat_u64 (orc_uint64 * ORC_RESTRICT d1, orc_int64 p1, int n);
+void orc_downsample_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void orc_downsample_u16 (guint16 * ORC_RESTRICT d1, const guint16 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_downsample_u32 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_downsample_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n);
+void gst_videoscale_orc_resample_nearest_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_nearest_u32 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u32 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n);
+void gst_videoscale_orc_merge_bicubic_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int p1, int p2, int p3, int p4, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/videoscale/gstvideoscaleorc.orc b/gst/videoscale/gstvideoscaleorc.orc
new file mode 100644
index 0000000..81623e2
--- /dev/null
+++ b/gst/videoscale/gstvideoscaleorc.orc
@@ -0,0 +1,199 @@
+
+.init gst_videoscale_orc_init
+
+.function orc_merge_linear_u8
+.dest 1 d1
+.source 1 s1
+.source 1 s2
+.param 1 p1
+.temp 2 t1
+.temp 2 t2
+.temp 1 a
+.temp 1 t
+
+loadb a, s1
+convubw t1, s1
+convubw t2, s2
+subw t2, t2, t1
+mullw t2, t2, p1
+addw t2, t2, 128
+convhwb t, t2
+addb d1, t, a
+
+
+
+.function orc_merge_linear_u16
+.dest 2 d1
+.source 2 s1
+.source 2 s2
+.param 2 p1
+.param 2 p2
+.temp 4 t1
+.temp 4 t2
+
+# This is slightly different thatn the u8 case, since muluwl
+# tends to be much faster than mulll
+muluwl t1, s1, p1
+muluwl t2, s2, p2
+addl t1, t1, t2
+shrul t1, t1, 16
+convlw d1, t1
+
+
+.function orc_splat_u16
+.dest 2 d1
+.param 2 p1
+
+copyw d1, p1
+
+
+.function orc_splat_u32
+.dest 4 d1
+.param 4 p1
+
+copyl d1, p1
+
+
+.function orc_splat_u64
+.dest 8 d1
+.longparam 8 p1
+
+copyq d1, p1
+
+
+.function orc_downsample_u8
+.dest 1 d1 guint8
+.source 2 s1 guint8
+.temp 1 t1
+.temp 1 t2
+
+splitwb t1, t2, s1
+avgub d1, t1, t2
+
+
+.function orc_downsample_u16
+.dest 2 d1 guint16
+.source 4 s1 guint16
+.temp 2 t1
+.temp 2 t2
+
+splitlw t1, t2, s1
+avguw d1, t1, t2
+
+
+.function gst_videoscale_orc_downsample_u32
+.dest 4 d1 guint8
+.source 8 s1 guint8
+.temp 4 t1
+.temp 4 t2
+
+splitql t1, t2, s1
+x4 avgub d1, t1, t2
+
+
+.function gst_videoscale_orc_downsample_yuyv
+.dest 4 d1 guint8
+.source 8 s1 guint8
+.temp 4 yyyy
+.temp 4 uvuv
+.temp 2 t1
+.temp 2 t2
+.temp 2 yy
+.temp 2 uv
+
+x4 splitwb yyyy, uvuv, s1
+x2 splitwb t1, t2, yyyy
+x2 avgub yy, t1, t2
+splitlw t1, t2, uvuv
+x2 avgub uv, t1, t2
+x2 mergebw d1, yy, uv
+
+
+
+.function gst_videoscale_orc_resample_nearest_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldresnearb d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_bilinear_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldreslinb d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_nearest_u32
+.dest 4 d1 guint8
+.source 4 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldresnearl d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_bilinear_u32
+.dest 4 d1 guint8
+.source 4 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldreslinl d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_merge_bilinear_u32
+.dest 4 d1 guint8
+.dest 4 d2 guint8
+.source 4 s1 guint8
+.source 4 s2 guint8
+.temp 4 a
+.temp 4 b
+.temp 4 t
+.temp 8 t1
+.temp 8 t2
+.param 4 p1
+.param 4 p2
+.param 4 p3
+
+ldreslinl b, s2, p2, p3
+storel d2, b
+loadl a, s1
+x4 convubw t1, a
+x4 convubw t2, b
+x4 subw t2, t2, t1
+x4 mullw t2, t2, p1
+x4 convhwb t, t2
+x4 addb d1, t, a
+
+
+
+.function gst_videoscale_orc_merge_bicubic_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.source 1 s4 guint8
+.param 4 p1
+.param 4 p2
+.param 4 p3
+.param 4 p4
+.temp 2 t1
+.temp 2 t2
+
+mulubw t1, s2, p2
+mulubw t2, s3, p3
+addw t1, t1, t2
+mulubw t2, s1, p1
+subw t1, t1, t2
+mulubw t2, s4, p4
+subw t1, t1, t2
+addw t1, t1, 32
+shrsw t1, t1, 6
+convsuswb d1, t1
+
+
diff --git a/gst/videoscale/vs_4tap.c b/gst/videoscale/vs_4tap.c
new file mode 100644
index 0000000..93024bc
--- /dev/null
+++ b/gst/videoscale/vs_4tap.c
@@ -0,0 +1,1451 @@
+/*
+ * Image Scaling Functions (4 tap)
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * Copyright (c) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#include "vs_image.h"
+#include "vs_scanline.h"
+
+#include "vs_4tap.h"
+
+#include <gst/math-compat.h>
+
+#define SHIFT 10
+
+static int16_t vs_4tap_taps[256][4];
+
+static double
+vs_4tap_func (double x)
+{
+#if 0
+ if (x < -1)
+ return 0;
+ if (x > 1)
+ return 0;
+ if (x < 0)
+ return 1 + x;
+ return 1 - x;
+#endif
+#if 0
+ if (x == 0)
+ return 1;
+ return sin (G_PI * x) / (G_PI * x) * (1 - 0.25 * x * x);
+#endif
+#if 1
+ if (x == 0)
+ return 1;
+ return sin (G_PI * x) / (G_PI * x);
+#endif
+}
+
+void
+vs_4tap_init (void)
+{
+ int i;
+ double a, b, c, d;
+ double sum;
+
+ for (i = 0; i < 256; i++) {
+ a = vs_4tap_func (-1 - i / 256.0);
+ b = vs_4tap_func (0 - i / 256.0);
+ c = vs_4tap_func (1 - i / 256.0);
+ d = vs_4tap_func (2 - i / 256.0);
+ sum = a + b + c + d;
+
+ vs_4tap_taps[i][0] = rint ((1 << SHIFT) * (a / sum));
+ vs_4tap_taps[i][1] = rint ((1 << SHIFT) * (b / sum));
+ vs_4tap_taps[i][2] = rint ((1 << SHIFT) * (c / sum));
+ vs_4tap_taps[i][3] = rint ((1 << SHIFT) * (d / sum));
+ }
+}
+
+
+void
+vs_scanline_resample_4tap_Y (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xff00) >> 8;
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j - 1, 0)];
+ y += vs_4tap_taps[x][1] * src[j];
+ y += vs_4tap_taps[x][2] * src[j + 1];
+ y += vs_4tap_taps[x][3] * src[j + 2];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j - 1, 0, src_width - 1)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j, 0, src_width - 1)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j + 1, 0, src_width - 1)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j + 2, 0, src_width - 1)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i] = CLAMP (y >> SHIFT, 0, 255);
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_Y (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int a, b, c, d;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < n; i++) {
+ y = a * src1[i];
+ y += b * src2[i];
+ y += c * src3[i];
+ y += d * src4[i];
+ y += (1 << (SHIFT - 1));
+ dest[i] = CLAMP (y >> SHIFT, 0, 255);
+ }
+}
+
+
+void
+vs_image_scale_4tap_Y (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_Y (tmpbuf + i * dest->width,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_Y (tmpbuf + ((k + 3) & 3) * dest->width,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->width;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->width;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->width;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->width;
+ vs_scanline_merge_4tap_Y (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_Y16 (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ uint16_t *d = (uint16_t *) dest, *s = (uint16_t *) src;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xff00) >> 8;
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * s[MAX (j - 1, 0)];
+ y += vs_4tap_taps[x][1] * s[j];
+ y += vs_4tap_taps[x][2] * s[j + 1];
+ y += vs_4tap_taps[x][3] * s[j + 2];
+ } else {
+ y = vs_4tap_taps[x][0] * s[CLAMP (j - 1, 0, src_width - 1)];
+ y += vs_4tap_taps[x][1] * s[CLAMP (j, 0, src_width - 1)];
+ y += vs_4tap_taps[x][2] * s[CLAMP (j + 1, 0, src_width - 1)];
+ y += vs_4tap_taps[x][3] * s[CLAMP (j + 2, 0, src_width - 1)];
+ }
+ y += (1 << (SHIFT - 1));
+ d[i] = CLAMP (y >> SHIFT, 0, 65535);
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_Y16 (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int a, b, c, d;
+ uint16_t *de = (uint16_t *) dest, *s1 = (uint16_t *) src1;
+ uint16_t *s2 = (uint16_t *) src2, *s3 = (uint16_t *) src3;
+ uint16_t *s4 = (uint16_t *) src4;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < n; i++) {
+ y = a * s1[i];
+ y += b * s2[i];
+ y += c * s3[i];
+ y += d * s4[i];
+ y += (1 << (SHIFT - 1));
+ de[i] = CLAMP (y >> SHIFT, 0, 65535);
+ }
+}
+
+
+void
+vs_image_scale_4tap_Y16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_Y16 (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_Y16 (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_Y16 (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_RGBA (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ int off;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ for (off = 0; off < 4; off++) {
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX ((j - 1) * 4 + off, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + off];
+ y += vs_4tap_taps[x][2] * src[(j + 1) * 4 + off];
+ y += vs_4tap_taps[x][3] * src[(j + 2) * 4 + off];
+ } else {
+ y = vs_4tap_taps[x][0] *
+ src[CLAMP ((j - 1), 0, src_width - 1) * 4 + off];
+ y += vs_4tap_taps[x][1] *
+ src[CLAMP ((j + 0), 0, src_width - 1) * 4 + off];
+ y += vs_4tap_taps[x][2] *
+ src[CLAMP ((j + 1), 0, src_width - 1) * 4 + off];
+ y += vs_4tap_taps[x][3] *
+ src[CLAMP ((j + 2), 0, src_width - 1) * 4 + off];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + off] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_RGBA (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int off;
+ int a, b, c, d;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < n; i++) {
+ for (off = 0; off < 4; off++) {
+ y = a * src1[i * 4 + off];
+ y += b * src2[i * 4 + off];
+ y += c * src3[i * 4 + off];
+ y += d * src4[i * 4 + off];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + off] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ }
+}
+
+void
+vs_image_scale_4tap_RGBA (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGBA (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGBA (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_RGBA (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_RGB (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ int off;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ for (off = 0; off < 3; off++) {
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX ((j - 1) * 3 + off, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 3 + off];
+ y += vs_4tap_taps[x][2] * src[(j + 1) * 3 + off];
+ y += vs_4tap_taps[x][3] * src[(j + 2) * 3 + off];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP ((j - 1) * 3 + off, 0,
+ 3 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 3 + off, 0,
+ 3 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][2] * src[CLAMP ((j + 1) * 3 + off, 0,
+ 3 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][3] * src[CLAMP ((j + 2) * 3 + off, 0,
+ 3 * (src_width - 1) + off)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 3 + off] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_RGB (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int off;
+ int a, b, c, d;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < n; i++) {
+ for (off = 0; off < 3; off++) {
+ y = a * src1[i * 3 + off];
+ y += b * src2[i * 3 + off];
+ y += c * src3[i * 3 + off];
+ y += d * src4[i * 3 + off];
+ y += (1 << (SHIFT - 1));
+ dest[i * 3 + off] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ }
+}
+
+void
+vs_image_scale_4tap_RGB (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_RGB (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_YUYV (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ int quads = (n + 1) / 2;
+ int last_y = 2 * (src_width - 1);
+ int last_u =
+ MAX ((2 * (src_width - 1) % 4 ==
+ 0) ? 2 * (src_width - 1) + 1 : 2 * (src_width - 1) - 1, 1);
+ int last_v =
+ MAX ((2 * (src_width - 1) % 4 ==
+ 2) ? 2 * (src_width - 1) + 1 : 2 * (src_width - 1) - 1, 1);
+
+ acc = *xacc;
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 2 + 0 - 2, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 2 + 0];
+ y += vs_4tap_taps[x][2] * src[j * 2 + 0 + 2];
+ y += vs_4tap_taps[x][3] * src[j * 2 + 0 + 4];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 2 + 0 - 2, 0, last_y)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 2 + 0, 0, last_y)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 2 + 0 + 2, 0, last_y)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 2 + 0 + 4, 0, last_y)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 0] = CLAMP (y >> SHIFT, 0, 255);
+
+ j = acc >> 17;
+ x = (acc & 0x1ffff) >> 9;
+
+ if (2 * j - 1 >= 0 && 2 * j + 4 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 4 + 1 - 4, 1)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + 1];
+ y += vs_4tap_taps[x][2] * src[j * 4 + 1 + 4];
+ y += vs_4tap_taps[x][3] * src[j * 4 + 1 + 8];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 4 + 1 - 4, 1, last_u)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 4 + 1, 1, last_u)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 4 + 1 + 4, 1, last_u)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 4 + 1 + 8, 1, last_u)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 1] = CLAMP (y >> SHIFT, 0, 255);
+
+ if (2 * i + 1 < n) {
+ if (2 * j - 1 >= 0 && 2 * j + 4 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 4 + 3 - 4, 3)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + 3];
+ y += vs_4tap_taps[x][2] * src[j * 4 + 3 + 4];
+ y += vs_4tap_taps[x][3] * src[j * 4 + 3 + 8];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 4 + 3 - 4, 3, last_v)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 4 + 3, 3, last_v)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 4 + 3 + 4, 3, last_v)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 4 + 3 + 8, 3, last_v)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 3] = CLAMP (y >> SHIFT, 0, 255);
+ }
+
+ acc += increment;
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ if (2 * i + 1 < n) {
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 2 + 0 - 2, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 2 + 0];
+ y += vs_4tap_taps[x][2] * src[j * 2 + 0 + 2];
+ y += vs_4tap_taps[x][3] * src[j * 2 + 0 + 4];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 2 + 0 - 2, 0, last_y)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 2 + 0, 0, last_y)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 2 + 0 + 2, 0, last_y)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 2 + 0 + 4, 0, last_y)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 2] = CLAMP (y >> SHIFT, 0, 255);
+ acc += increment;
+ }
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_YUYV (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int a, b, c, d;
+ int quads = (n + 1) / 2;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < quads; i++) {
+ y = a * src1[i * 4 + 0];
+ y += b * src2[i * 4 + 0];
+ y += c * src3[i * 4 + 0];
+ y += d * src4[i * 4 + 0];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 0] = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * src1[i * 4 + 1];
+ y += b * src2[i * 4 + 1];
+ y += c * src3[i * 4 + 1];
+ y += d * src4[i * 4 + 1];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 1] = CLAMP (y >> SHIFT, 0, 255);
+
+ if (2 * i + 1 < n) {
+ y = a * src1[i * 4 + 2];
+ y += b * src2[i * 4 + 2];
+ y += c * src3[i * 4 + 2];
+ y += d * src4[i * 4 + 2];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 2] = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * src1[i * 4 + 3];
+ y += b * src2[i * 4 + 3];
+ y += c * src3[i * 4 + 3];
+ y += d * src4[i * 4 + 3];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 3] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ }
+}
+
+void
+vs_image_scale_4tap_YUYV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_YUYV (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_YUYV (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_YUYV (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_UYVY (uint8_t * dest, uint8_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ int quads = (n + 1) / 2;
+ int last_y = 2 * (src_width - 1) + 1;
+ int last_u =
+ MAX ((2 * (src_width - 1) % 4 ==
+ 0) ? 2 * (src_width - 1) : 2 * (src_width - 1) - 2, 0);
+ int last_v =
+ MAX ((2 * (src_width - 1) % 4 ==
+ 2) ? 2 * (src_width - 1) : 2 * (src_width - 1) - 2, 0);
+
+ acc = *xacc;
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 2 + 1 - 2, 1)];
+ y += vs_4tap_taps[x][1] * src[j * 2 + 1];
+ y += vs_4tap_taps[x][2] * src[j * 2 + 1 + 2];
+ y += vs_4tap_taps[x][3] * src[j * 2 + 1 + 4];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 2 + 1 - 2, 1, last_y)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 2 + 1, 1, last_y)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 2 + 1 + 2, 1, last_y)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 2 + 1 + 4, 1, last_y)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 1] = CLAMP (y >> SHIFT, 0, 255);
+
+ j = acc >> 17;
+ x = (acc & 0x1ffff) >> 9;
+
+ if (2 * j - 2 >= 0 && 2 * j + 4 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 4 + 0 - 4, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + 0];
+ y += vs_4tap_taps[x][2] * src[j * 4 + 0 + 4];
+ y += vs_4tap_taps[x][3] * src[j * 4 + 0 + 8];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 4 + 0 - 4, 0, last_u)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 4 + 0, 0, last_u)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 4 + 0 + 4, 0, last_u)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 4 + 0 + 8, 0, last_u)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 0] = CLAMP (y >> SHIFT, 0, 255);
+
+ if (2 * i + 1 < n) {
+ if (2 * j - 1 >= 0 && 2 * j + 4 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 4 + 2 - 4, 2)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + 2];
+ y += vs_4tap_taps[x][2] * src[j * 4 + 2 + 4];
+ y += vs_4tap_taps[x][3] * src[j * 4 + 2 + 8];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 4 + 2 - 4, 2, last_v)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 4 + 2, 2, last_v)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 4 + 2 + 4, 2, last_v)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 4 + 2 + 8, 2, last_v)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 2] = CLAMP (y >> SHIFT, 0, 255);
+ }
+
+ acc += increment;
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ if (2 * i + 1 < n) {
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX (j * 2 + 1 - 2, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 2 + 1];
+ y += vs_4tap_taps[x][2] * src[j * 2 + 1 + 2];
+ y += vs_4tap_taps[x][3] * src[j * 2 + 1 + 4];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP (j * 2 + 1 - 2, 1, last_y)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 2 + 1, 1, last_y)];
+ y += vs_4tap_taps[x][2] * src[CLAMP (j * 2 + 1 + 2, 1, last_y)];
+ y += vs_4tap_taps[x][3] * src[CLAMP (j * 2 + 1 + 4, 1, last_y)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 3] = CLAMP (y >> SHIFT, 0, 255);
+ acc += increment;
+ }
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_UYVY (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ uint8_t * src3, uint8_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int a, b, c, d;
+ int quads = (n + 1) / 2;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < quads; i++) {
+ y = a * src1[i * 4 + 0];
+ y += b * src2[i * 4 + 0];
+ y += c * src3[i * 4 + 0];
+ y += d * src4[i * 4 + 0];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 0] = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * src1[i * 4 + 1];
+ y += b * src2[i * 4 + 1];
+ y += c * src3[i * 4 + 1];
+ y += d * src4[i * 4 + 1];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 1] = CLAMP (y >> SHIFT, 0, 255);
+
+ if (2 * i + 1 < n) {
+ y = a * src1[i * 4 + 2];
+ y += b * src2[i * 4 + 2];
+ y += c * src3[i * 4 + 2];
+ y += d * src4[i * 4 + 2];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 2] = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * src1[i * 4 + 3];
+ y += b * src2[i * 4 + 3];
+ y += c * src3[i * 4 + 3];
+ y += d * src4[i * 4 + 3];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + 3] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ }
+}
+
+void
+vs_image_scale_4tap_UYVY (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_UYVY (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_UYVY (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_UYVY (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+/* note that src and dest are uint16_t, and thus endian dependent */
+
+#define RGB565_R(x) (((x)&0xf800)>>8 | ((x)&0xf800)>>13)
+#define RGB565_G(x) (((x)&0x07e0)>>3 | ((x)&0x07e0)>>9)
+#define RGB565_B(x) (((x)&0x001f)<<3 | ((x)&0x001f)>>2)
+
+#define RGB565(r,g,b) \
+ ((((r)<<8)&0xf800) | (((g)<<3)&0x07e0) | (((b)>>3)&0x001f))
+
+void
+vs_scanline_resample_4tap_RGB565 (uint8_t * dest_u8, uint8_t * src_u8,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y, y_r, y_b, y_g;
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff >> 8;
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB565_R (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB565_R (src[j]);
+ y += vs_4tap_taps[x][2] * RGB565_R (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_R (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB565_R (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB565_R (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB565_R (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_R (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_r = CLAMP (y >> SHIFT, 0, 255);
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB565_G (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB565_G (src[j]);
+ y += vs_4tap_taps[x][2] * RGB565_G (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_G (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB565_G (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB565_G (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB565_G (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_G (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_g = CLAMP (y >> SHIFT, 0, 255);
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB565_B (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB565_B (src[j]);
+ y += vs_4tap_taps[x][2] * RGB565_B (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_B (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB565_B (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB565_B (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB565_B (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB565_B (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_b = CLAMP (y >> SHIFT, 0, 255);
+
+ dest[i] = RGB565 (y_r, y_b, y_g);
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_RGB565 (uint8_t * dest_u8, uint8_t * src1_u8,
+ uint8_t * src2_u8, uint8_t * src3_u8, uint8_t * src4_u8, int n, int acc)
+{
+ int i;
+ int y, y_r, y_b, y_g;
+ int a, b, c, d;
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src1 = (uint16_t *) src1_u8;
+ uint16_t *src2 = (uint16_t *) src2_u8;
+ uint16_t *src3 = (uint16_t *) src3_u8;
+ uint16_t *src4 = (uint16_t *) src4_u8;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+
+ for (i = 0; i < n; i++) {
+ y = a * RGB565_R (src1[i]);
+ y += b * RGB565_R (src2[i]);
+ y += c * RGB565_R (src3[i]);
+ y += d * RGB565_R (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_r = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * RGB565_G (src1[i]);
+ y += b * RGB565_G (src2[i]);
+ y += c * RGB565_G (src3[i]);
+ y += d * RGB565_G (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_g = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * RGB565_B (src1[i]);
+ y += b * RGB565_B (src2[i]);
+ y += c * RGB565_B (src3[i]);
+ y += d * RGB565_B (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_b = CLAMP (y >> SHIFT, 0, 255);
+
+ dest[i] = RGB565 (y_r, y_b, y_g);
+ }
+}
+
+void
+vs_image_scale_4tap_RGB565 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB565 (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB565 (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_RGB565 (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+/* note that src and dest are uint16_t, and thus endian dependent */
+
+#define RGB555_R(x) (((x)&0x7c00)>>8 | ((x)&0x7c00)>>13)
+#define RGB555_G(x) (((x)&0x03e0)>>3 | ((x)&0x03e0)>>9)
+#define RGB555_B(x) (((x)&0x001f)<<3 | ((x)&0x001f)>>2)
+
+#define RGB555(r,g,b) \
+ ((((r)<<7)&0x7c00) | (((g)<<2)&0x03e0) | (((b)>>3)&0x001f))
+
+void
+vs_scanline_resample_4tap_RGB555 (uint8_t * dest_u8, uint8_t * src_u8,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y, y_r, y_b, y_g;
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff >> 8;
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB555_R (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB555_R (src[j]);
+ y += vs_4tap_taps[x][2] * RGB555_R (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_R (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB555_R (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB555_R (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB555_R (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_R (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_r = CLAMP (y >> SHIFT, 0, 255);
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB555_G (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB555_G (src[j]);
+ y += vs_4tap_taps[x][2] * RGB555_G (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_G (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB555_G (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB555_G (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB555_G (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_G (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_g = CLAMP (y >> SHIFT, 0, 255);
+
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * RGB555_B (src[MAX ((j - 1), 0)]);
+ y += vs_4tap_taps[x][1] * RGB555_B (src[j]);
+ y += vs_4tap_taps[x][2] * RGB555_B (src[(j + 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_B (src[(j + 2)]);
+ } else {
+ y = vs_4tap_taps[x][0] * RGB555_B (src[CLAMP ((j - 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][1] * RGB555_B (src[CLAMP (j, 0, src_width - 1)]);
+ y += vs_4tap_taps[x][2] * RGB555_B (src[CLAMP ((j + 1), 0,
+ src_width - 1)]);
+ y += vs_4tap_taps[x][3] * RGB555_B (src[CLAMP ((j + 2), 0,
+ src_width - 1)]);
+ }
+ y += (1 << (SHIFT - 1));
+ y_b = CLAMP (y >> SHIFT, 0, 255);
+
+ dest[i] = RGB555 (y_r, y_b, y_g);
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_RGB555 (uint8_t * dest_u8, uint8_t * src1_u8,
+ uint8_t * src2_u8, uint8_t * src3_u8, uint8_t * src4_u8, int n, int acc)
+{
+ int i;
+ int y, y_r, y_b, y_g;
+ int a, b, c, d;
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src1 = (uint16_t *) src1_u8;
+ uint16_t *src2 = (uint16_t *) src2_u8;
+ uint16_t *src3 = (uint16_t *) src3_u8;
+ uint16_t *src4 = (uint16_t *) src4_u8;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+
+ for (i = 0; i < n; i++) {
+ y = a * RGB555_R (src1[i]);
+ y += b * RGB555_R (src2[i]);
+ y += c * RGB555_R (src3[i]);
+ y += d * RGB555_R (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_r = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * RGB555_G (src1[i]);
+ y += b * RGB555_G (src2[i]);
+ y += c * RGB555_G (src3[i]);
+ y += d * RGB555_G (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_g = CLAMP (y >> SHIFT, 0, 255);
+
+ y = a * RGB555_B (src1[i]);
+ y += b * RGB555_B (src2[i]);
+ y += c * RGB555_B (src3[i]);
+ y += d * RGB555_B (src4[i]);
+ y += (1 << (SHIFT - 1));
+ y_b = CLAMP (y >> SHIFT, 0, 255);
+
+ dest[i] = RGB555 (y_r, y_b, y_g);
+ }
+}
+
+void
+vs_image_scale_4tap_RGB555 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB555 (tmpbuf + i * dest->stride,
+ src->pixels + CLAMP (i, 0, src->height - 1) * src->stride, dest->width,
+ src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint8_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_RGB555 (tmpbuf + ((k + 3) & 3) * dest->stride,
+ src->pixels + (k + 3) * src->stride,
+ dest->width, src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_RGB555 (dest->pixels + i * dest->stride,
+ t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
+
+void
+vs_scanline_resample_4tap_AYUV64 (uint16_t * dest, uint16_t * src,
+ int n, int src_width, int *xacc, int increment)
+{
+ int i;
+ int j;
+ int acc;
+ int x;
+ int y;
+ int off;
+
+ acc = *xacc;
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 8;
+
+ for (off = 0; off < 4; off++) {
+ if (j - 1 >= 0 && j + 2 < src_width) {
+ y = vs_4tap_taps[x][0] * src[MAX ((j - 1) * 4 + off, 0)];
+ y += vs_4tap_taps[x][1] * src[j * 4 + off];
+ y += vs_4tap_taps[x][2] * src[(j + 1) * 4 + off];
+ y += vs_4tap_taps[x][3] * src[(j + 2) * 4 + off];
+ } else {
+ y = vs_4tap_taps[x][0] * src[CLAMP ((j - 1) * 4 + off, 0,
+ 4 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][1] * src[CLAMP (j * 4 + off, 0,
+ 4 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][2] * src[CLAMP ((j + 1) * 4 + off, 0,
+ 4 * (src_width - 1) + off)];
+ y += vs_4tap_taps[x][3] * src[CLAMP ((j + 2) * 4 + off, 0,
+ 4 * (src_width - 1) + off)];
+ }
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + off] = CLAMP (y >> SHIFT, 0, 255);
+ }
+ acc += increment;
+ }
+ *xacc = acc;
+}
+
+void
+vs_scanline_merge_4tap_AYUV64 (uint16_t * dest, uint16_t * src1,
+ uint16_t * src2, uint16_t * src3, uint16_t * src4, int n, int acc)
+{
+ int i;
+ int y;
+ int off;
+ int a, b, c, d;
+
+ acc = (acc >> 8) & 0xff;
+ a = vs_4tap_taps[acc][0];
+ b = vs_4tap_taps[acc][1];
+ c = vs_4tap_taps[acc][2];
+ d = vs_4tap_taps[acc][3];
+ for (i = 0; i < n; i++) {
+ for (off = 0; off < 4; off++) {
+ y = a * src1[i * 4 + off];
+ y += b * src2[i * 4 + off];
+ y += c * src3[i * 4 + off];
+ y += d * src4[i * 4 + off];
+ y += (1 << (SHIFT - 1));
+ dest[i * 4 + off] = CLAMP (y >> SHIFT, 0, 65535);
+ }
+ }
+}
+
+void
+vs_image_scale_4tap_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf8)
+{
+ int yacc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+ int k;
+ guint16 *tmpbuf = (guint16 *) tmpbuf8;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ k = 0;
+ for (i = 0; i < 4; i++) {
+ xacc = 0;
+ vs_scanline_resample_4tap_AYUV64 ((guint16 *) (tmpbuf + i * dest->stride),
+ (guint16 *) (src->pixels + CLAMP (i, 0, src->height - 1) * src->stride),
+ dest->width, src->width, &xacc, x_increment);
+ }
+
+ yacc = 0;
+ for (i = 0; i < dest->height; i++) {
+ uint16_t *t0, *t1, *t2, *t3;
+
+ j = yacc >> 16;
+
+ while (j > k) {
+ k++;
+ if (k + 3 < src->height) {
+ xacc = 0;
+ vs_scanline_resample_4tap_AYUV64 ((guint16 *) (tmpbuf + ((k +
+ 3) & 3) * dest->stride),
+ (guint16 *) (src->pixels + (k + 3) * src->stride), dest->width,
+ src->width, &xacc, x_increment);
+ }
+ }
+
+ t0 = tmpbuf + (CLAMP (j - 1, 0, src->height - 1) & 3) * dest->stride;
+ t1 = tmpbuf + (CLAMP (j, 0, src->height - 1) & 3) * dest->stride;
+ t2 = tmpbuf + (CLAMP (j + 1, 0, src->height - 1) & 3) * dest->stride;
+ t3 = tmpbuf + (CLAMP (j + 2, 0, src->height - 1) & 3) * dest->stride;
+ vs_scanline_merge_4tap_AYUV64 ((guint16 *) (dest->pixels +
+ i * dest->stride), t0, t1, t2, t3, dest->width, yacc & 0xffff);
+
+ yacc += y_increment;
+ }
+}
diff --git a/gst/videoscale/vs_4tap.h b/gst/videoscale/vs_4tap.h
new file mode 100644
index 0000000..6b51b52
--- /dev/null
+++ b/gst/videoscale/vs_4tap.h
@@ -0,0 +1,99 @@
+/*
+ * Image Scaling Functions (4 tap)
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#ifndef _VS_4TAP_H_
+#define _VS_4TAP_H_
+
+#include "vs_image.h"
+
+
+void vs_4tap_init (void);
+void vs_scanline_resample_4tap_Y (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_Y (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_Y (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_RGBA (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_RGBA (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_RGBA (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_RGB (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_RGB (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_RGB (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_YUYV (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_YUYV (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_YUYV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_UYVY (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_UYVY (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_UYVY (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_RGB565 (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_RGB565 (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_RGB565 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_RGB555 (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_RGB555 (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_RGB555 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_Y16 (uint8_t *dest, uint8_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_Y16 (uint8_t *dest, uint8_t *src1, uint8_t *src2,
+ uint8_t *src3, uint8_t *src4, int n, int acc);
+void vs_image_scale_4tap_Y16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+void vs_scanline_resample_4tap_AYUV64 (uint16_t *dest, uint16_t *src,
+ int n, int src_width, int *xacc, int increment);
+void vs_scanline_merge_4tap_AYUV64 (uint16_t *dest, uint16_t *src1, uint16_t *src2,
+ uint16_t *src3, uint16_t *src4, int n, int acc);
+void vs_image_scale_4tap_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf);
+
+#endif
+
diff --git a/gst/videoscale/vs_fill_borders.c b/gst/videoscale/vs_fill_borders.c
new file mode 100644
index 0000000..160e137
--- /dev/null
+++ b/gst/videoscale/vs_fill_borders.c
@@ -0,0 +1,422 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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 <gst/gst.h>
+#include <string.h>
+
+#include "vs_fill_borders.h"
+#include "gstvideoscaleorc.h"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define READ_UINT32(ptr) GST_READ_UINT32_LE(ptr)
+#define READ_UINT16(ptr) GST_READ_UINT16_LE(ptr)
+#else
+#define READ_UINT32(ptr) GST_READ_UINT32_BE(ptr)
+#define READ_UINT16(ptr) GST_READ_UINT16_BE(ptr)
+#endif
+
+void
+vs_fill_borders_RGBA (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+ uint32_t v = READ_UINT32 (val);
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ orc_splat_u32 ((uint32_t *) data, v, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 4;
+ for (i = 0; i < tmp; i++) {
+ orc_splat_u32 ((uint32_t *) data, v, left);
+ orc_splat_u32 ((uint32_t *) (data + tmp2), v, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ orc_splat_u32 ((uint32_t *) data, v, real_width);
+ data += stride;
+ }
+}
+
+static void
+_memset_u24 (uint8_t * data, uint8_t val1, uint8_t val2, uint8_t val3,
+ unsigned int n)
+{
+ unsigned int i;
+
+ for (i = 0; i < n; i++) {
+ data[0] = val1;
+ data[1] = val2;
+ data[2] = val3;
+ data += 3;
+ }
+}
+
+void
+vs_fill_borders_RGB (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ _memset_u24 (data, val[0], val[1], val[2], real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 3;
+ for (i = 0; i < tmp; i++) {
+ _memset_u24 (data, val[0], val[1], val[2], left);
+ _memset_u24 (data + tmp2, val[0], val[1], val[2], right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ _memset_u24 (data, val[0], val[1], val[2], real_width);
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_YUYV (const VSImage * dest, const uint8_t * val)
+{
+ int i, j;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ for (j = 0; j < real_width; j++) {
+ data[2 * j] = val[0];
+ data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
+ }
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 2;
+ for (i = 0; i < tmp; i++) {
+ for (j = 0; j < left; j++) {
+ data[2 * j] = val[0];
+ data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
+ }
+ for (j = 0; j < right; j++) {
+ data[tmp2 + 2 * j] = val[0];
+ data[tmp2 + 2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
+ }
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ for (j = 0; j < real_width; j++) {
+ data[2 * j] = val[0];
+ data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
+ }
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_UYVY (const VSImage * dest, const uint8_t * val)
+{
+ int i, j;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ for (j = 0; j < real_width; j++) {
+ data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
+ data[2 * j + 1] = val[1];
+ }
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 2;
+ for (i = 0; i < tmp; i++) {
+ for (j = 0; j < left; j++) {
+ data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
+ data[2 * j + 1] = val[1];
+ }
+ for (j = 0; j < right; j++) {
+ data[tmp2 + 2 * j] = (j % 2 == 0) ? val[0] : val[2];
+ data[tmp2 + 2 * j + 1] = val[1];
+ }
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ for (j = 0; j < real_width; j++) {
+ data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
+ data[2 * j + 1] = val[1];
+ }
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_Y (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ memset (data, *val, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = left + width;
+ for (i = 0; i < tmp; i++) {
+ memset (data, *val, left);
+ memset (data + tmp2, *val, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ memset (data, *val, real_width);
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_Y16 (const VSImage * dest, const uint16_t val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ orc_splat_u16 ((uint16_t *) data, val, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 2;
+ for (i = 0; i < tmp; i++) {
+ orc_splat_u16 ((uint16_t *) data, val, left);
+ orc_splat_u16 ((uint16_t *) (data + tmp2), val, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ orc_splat_u16 ((uint16_t *) data, val, real_width);
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_RGB565 (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+ uint16_t v = READ_UINT16 (val);
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 2;
+ for (i = 0; i < tmp; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, left);
+ orc_splat_u16 ((uint16_t *) (data + tmp2), v, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, real_width);
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_RGB555 (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+ uint16_t v = READ_UINT16 (val);
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 2;
+ for (i = 0; i < tmp; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, left);
+ orc_splat_u16 ((uint16_t *) (data + tmp2), v, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ orc_splat_u16 ((uint16_t *) data, v, real_width);
+ data += stride;
+ }
+}
+
+void
+vs_fill_borders_AYUV64 (const VSImage * dest, const uint8_t * val)
+{
+ int i;
+ int top = dest->border_top, bottom = dest->border_bottom;
+ int left = dest->border_left, right = dest->border_right;
+ int width = dest->width;
+ int height = dest->height;
+ int real_width = dest->real_width;
+ int stride = dest->stride;
+ int tmp, tmp2;
+ uint8_t *data;
+ uint64_t v;
+
+ v = (val[0] << 8) | (val[1] << 24) | (((guint64) val[2]) << 40) | (((guint64)
+ val[3]) << 56);
+
+ data = dest->real_pixels;
+ for (i = 0; i < top; i++) {
+ orc_splat_u64 ((uint64_t *) data, v, real_width);
+ data += stride;
+ }
+
+ if (left || right) {
+ tmp = height;
+ tmp2 = (left + width) * 8;
+ for (i = 0; i < tmp; i++) {
+ orc_splat_u64 ((uint64_t *) data, v, left);
+ orc_splat_u64 ((uint64_t *) (data + tmp2), v, right);
+ data += stride;
+ }
+ } else {
+ data += stride * height;
+ }
+
+ for (i = 0; i < bottom; i++) {
+ orc_splat_u64 ((uint64_t *) data, v, real_width);
+ data += stride;
+ }
+}
diff --git a/gst/videoscale/vs_fill_borders.h b/gst/videoscale/vs_fill_borders.h
new file mode 100644
index 0000000..faf00db
--- /dev/null
+++ b/gst/videoscale/vs_fill_borders.h
@@ -0,0 +1,44 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#ifndef __VS_FILL_BORDERS_H__
+#define __VS_FILL_BORDERS_H__
+
+#include <_stdint.h>
+#include "vs_image.h"
+
+void vs_fill_borders_RGBA (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_RGB (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_YUYV (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_UYVY (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_Y (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_Y16 (const VSImage *dest, const uint16_t val);
+void vs_fill_borders_RGB565 (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_RGB555 (const VSImage *dest, const uint8_t *val);
+void vs_fill_borders_AYUV64 (const VSImage *dest, const uint8_t *val);
+
+#endif /* __VS_FILL_BORDERS_H__ */
diff --git a/gst/videoscale/vs_image.c b/gst/videoscale/vs_image.c
new file mode 100644
index 0000000..c28b0d8
--- /dev/null
+++ b/gst/videoscale/vs_image.c
@@ -0,0 +1,1155 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#include <string.h>
+
+#include "vs_scanline.h"
+#include "vs_image.h"
+
+#include "gstvideoscaleorc.h"
+#include <gst/gst.h>
+
+#define ROUND_UP_2(x) (((x)+1)&~1)
+#define ROUND_UP_4(x) (((x)+3)&~3)
+#define ROUND_UP_8(x) (((x)+7)&~7)
+
+void
+vs_image_scale_nearest_RGBA (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int prev_j;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+
+ acc = 0;
+ prev_j = -1;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ if (j == prev_j) {
+ memcpy (dest->pixels + i * dest->stride,
+ dest->pixels + (i - 1) * dest->stride, dest->width * 4);
+ } else {
+ gst_videoscale_orc_resample_nearest_u32 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, 0, x_increment, dest->width);
+ }
+
+ prev_j = j;
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_RGBA (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int y1;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width * 4;
+
+#define LINE(x) ((tmpbuf) + (dest_size)*((x)&1))
+
+ acc = 0;
+ gst_videoscale_orc_resample_bilinear_u32 (LINE (0), src->pixels,
+ 0, x_increment, dest->width);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ memcpy (dest->pixels + i * dest->stride, LINE (j), dest_size);
+ } else {
+ if (j > y1) {
+ gst_videoscale_orc_resample_bilinear_u32 (LINE (j),
+ src->pixels + j * src->stride, 0, x_increment, dest->width);
+ y1++;
+ }
+ if (j >= y1) {
+ gst_videoscale_orc_resample_bilinear_u32 (LINE (j + 1),
+ src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
+ y1++;
+ }
+ orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+ LINE (j), LINE (j + 1), (x >> 8), dest->width * 4);
+ }
+
+ acc += y_increment;
+ }
+}
+
+
+void
+vs_image_scale_nearest_RGB (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_RGB (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_RGB (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width * 3;
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_RGB (tmp1, src->pixels, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_RGB (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+/* YUYV */
+
+void
+vs_image_scale_nearest_YUYV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_YUYV (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_YUYV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = ROUND_UP_4 (dest->width * 2);
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_YUYV (tmp1, src->pixels, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_YUYV (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_YUYV (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_YUYV (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_YUYV (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_YUYV (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+/* UYVY */
+
+void
+vs_image_scale_nearest_UYVY (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_UYVY (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_UYVY (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = ROUND_UP_4 (dest->width * 2);
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_UYVY (tmp1, src->pixels, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_UYVY (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_UYVY (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_UYVY (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_UYVY (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_UYVY (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+/* greyscale */
+
+void
+vs_image_scale_nearest_Y (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ gst_videoscale_orc_resample_nearest_u8 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, 0, x_increment, dest->width);
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_Y (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width;
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ y2 = -1;
+ gst_videoscale_orc_resample_bilinear_u8 (tmp1, src->pixels,
+ 0, x_increment, dest->width);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+ src->pixels + j * src->stride, 0, x_increment, dest->width);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ gst_videoscale_orc_resample_bilinear_u8 (tmp2,
+ src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
+ y2 = j + 1;
+ }
+ if ((x >> 8) == 0) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest->width);
+ } else {
+ orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, (x >> 8), dest->width);
+ }
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+ src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
+ y1 = j + 1;
+ }
+ if ((x >> 8) == 0) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest->width);
+ } else {
+ orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+ tmp2, tmp1, (x >> 8), dest->width);
+ }
+ } else {
+ gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+ src->pixels + j * src->stride, 0, x_increment, dest->width);
+ y1 = j;
+ gst_videoscale_orc_resample_bilinear_u8 (tmp2,
+ src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
+ y2 = (j + 1);
+ if ((x >> 8) == 0) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest->width);
+ } else {
+ orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, (x >> 8), dest->width);
+ }
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_nearest_Y16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_Y16 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_Y16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = 2 * dest->width;
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_Y16 (tmp1, src->pixels, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_Y16 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_Y16 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_Y16 (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_Y16 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_Y16 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+/* RGB565 */
+
+void
+vs_image_scale_nearest_RGB565 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_RGB565 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_RGB565 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width * 2;
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_RGB565 (tmp1, src->pixels, src->width,
+ dest->width, &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB565 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB565 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB565 (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB565 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_RGB565 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+/* RGB555 */
+
+void
+vs_image_scale_nearest_RGB555 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+ acc = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ xacc = 0;
+ vs_scanline_resample_nearest_RGB555 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_RGB555 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ uint8_t *tmp1;
+ uint8_t *tmp2;
+ int y1;
+ int y2;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width * 2;
+
+ tmp1 = tmpbuf;
+ tmp2 = tmpbuf + dest_size;
+
+ acc = 0;
+ xacc = 0;
+ y2 = -1;
+ vs_scanline_resample_linear_RGB555 (tmp1, src->pixels, src->width,
+ dest->width, &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ if (j == y1) {
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ } else if (j == y2) {
+ memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB555 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+ }
+ } else {
+ if (j == y1) {
+ if (j + 1 != y2) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB555 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y2 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ } else if (j == y2) {
+ if (j + 1 != y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB555 (tmp1,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width,
+ &xacc, x_increment);
+ y1 = j + 1;
+ }
+ vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,
+ tmp2, tmp1, dest->width, x);
+ } else {
+ xacc = 0;
+ vs_scanline_resample_linear_RGB555 (tmp1, src->pixels + j * src->stride,
+ src->width, dest->width, &xacc, x_increment);
+ y1 = j;
+ xacc = 0;
+ vs_scanline_resample_linear_RGB555 (tmp2,
+ src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ y2 = (j + 1);
+ vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,
+ tmp1, tmp2, dest->width, x);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_nearest_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf8)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int i;
+ int j;
+ int prev_j;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+
+ acc = 0;
+ prev_j = -1;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+
+ if (j == prev_j) {
+ memcpy (dest->pixels + i * dest->stride,
+ dest->pixels + (i - 1) * dest->stride, dest->width * 8);
+ } else {
+ int xacc = 0;
+ vs_scanline_resample_nearest_AYUV64 (dest->pixels + i * dest->stride,
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ }
+
+ prev_j = j;
+ acc += y_increment;
+ }
+}
+
+void
+vs_image_scale_linear_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf)
+{
+ int acc;
+ int y_increment;
+ int x_increment;
+ int y1;
+ int i;
+ int j;
+ int x;
+ int dest_size;
+ int xacc;
+
+ if (dest->height == 1)
+ y_increment = 0;
+ else
+ y_increment = ((src->height - 1) << 16) / (dest->height - 1) - 1;
+
+ if (dest->width == 1)
+ x_increment = 0;
+ else
+ x_increment = ((src->width - 1) << 16) / (dest->width - 1) - 1;
+
+ dest_size = dest->width * 8;
+
+#undef LINE
+#define LINE(x) ((guint16 *)((tmpbuf) + (dest_size)*((x)&1)))
+
+ acc = 0;
+ //gst_videoscale_orc_resample_bilinear_u64 (LINE (0), src->pixels,
+ // 0, x_increment, dest->width);
+ xacc = 0;
+ vs_scanline_resample_linear_AYUV64 ((guint8 *) LINE (0),
+ src->pixels, src->width, dest->width, &xacc, x_increment);
+ y1 = 0;
+ for (i = 0; i < dest->height; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (x == 0) {
+ memcpy (dest->pixels + i * dest->stride, LINE (j), dest_size);
+ } else {
+ if (j > y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_AYUV64 ((guint8 *) LINE (j),
+ src->pixels + j * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ //gst_videoscale_orc_resample_bilinear_u64 (LINE (j),
+ // src->pixels + j * src->stride, 0, x_increment, dest->width);
+ y1++;
+ }
+ if (j >= y1) {
+ xacc = 0;
+ vs_scanline_resample_linear_AYUV64 ((guint8 *) LINE (j + 1),
+ src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+ x_increment);
+ orc_merge_linear_u16 ((guint16 *) (dest->pixels + i * dest->stride),
+ LINE (j), LINE (j + 1), 65536 - x, x, dest->width * 4);
+ //gst_videoscale_orc_resample_merge_bilinear_u64 (dest->pixels +
+ // i * dest->stride, LINE (j + 1), LINE (j),
+ // src->pixels + (j + 1) * src->stride, (x >> 8), 0, x_increment,
+ // dest->width);
+ y1++;
+ } else {
+ orc_merge_linear_u16 ((guint16 *) (dest->pixels + i * dest->stride),
+ LINE (j), LINE (j + 1), 65536 - x, x, dest->width * 4);
+ }
+ }
+
+ acc += y_increment;
+ }
+}
diff --git a/gst/videoscale/vs_image.h b/gst/videoscale/vs_image.h
new file mode 100644
index 0000000..2312acc
--- /dev/null
+++ b/gst/videoscale/vs_image.h
@@ -0,0 +1,105 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#ifndef __VS_IMAGE_H__
+#define __VS_IMAGE_H__
+
+#include <glib.h>
+#include <_stdint.h>
+
+typedef struct _VSImage VSImage;
+
+struct _VSImage {
+ uint8_t *real_pixels;
+ int real_width;
+ int real_height;
+ int border_left, border_right;
+ int border_top, border_bottom;
+ uint8_t *pixels;
+ int width;
+ int height;
+ int stride;
+};
+
+void vs_image_scale_nearest_RGBA (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_RGBA (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_lanczos_AYUV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, int submethod,
+ double a, double sharpen);
+
+void vs_image_scale_nearest_RGB (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_RGB (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_YUYV (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_YUYV (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_UYVY (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_UYVY (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_Y (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_Y (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_lanczos_Y (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf, double sharpness, gboolean dither, int submethod,
+ double a, double sharpen);
+
+void vs_image_scale_nearest_RGB565 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_RGB565 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_RGB555 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_RGB555 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_Y16 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_Y16 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_AYUV16 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+void vs_image_scale_linear_AYUV16 (const VSImage *dest, const VSImage *src,
+ uint8_t *tmpbuf);
+
+void vs_image_scale_nearest_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf8);
+void vs_image_scale_linear_AYUV64 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf8);
+
+#endif
+
diff --git a/gst/videoscale/vs_lanczos.c b/gst/videoscale/vs_lanczos.c
new file mode 100644
index 0000000..1c87ba3
--- /dev/null
+++ b/gst/videoscale/vs_lanczos.c
@@ -0,0 +1,1558 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2011 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+/*
+ *
+ * Modified Lanczos scaling algorithm
+ * ==================================
+ *
+ * This algorithm was developed by the author. The primary goals of
+ * the algorithm are high-quality video downscaling for medium scale
+ * factors (in the range of 1.3x to 5.0x) using methods that can be
+ * converted to SIMD code. Concerns with existing algorithms were
+ * mainly related to either over-soft filtering (Lanczos) or aliasing
+ * (bilinear or any other method with inadequate sampling).
+ *
+ * The problems with bilinear scaling are apparent when downscaling
+ * more than a factor of 2. For example, when downscaling by a factor
+ * of 3, only two-thirds of the input pixels contribute to the output
+ * pixels. This is only considering scaling in one direction; after
+ * scaling both vertically and horizontally in a 2-D image, fewer than
+ * half of the input pixels contribute to the output, so it should not
+ * be surprising that the output is suboptimal.
+ *
+ * The problems with Lanczos scaling are more subtle. From a theoretical
+ * perspective, Lanczos is an optimal algorithm for resampling equally-
+ * spaced values. This theoretical perspective is based on analysis
+ * done in frequency space, thus, Lanczos works very well for audio
+ * resampling, since the ear hears primarily in frequency space. The
+ * human visual system is sensitive primarily in the spatial domain,
+ * therefore any resampling algorithm should take this into account.
+ * This difference is immediately clear in the size of resampling
+ * window or envelope that is chosen for resampling: for audio, an
+ * envelope of a=64 is typical, in image scaling, the envelope is
+ * usually a=2 or a=3.
+ *
+ * One result of the HVS being sensitive in the spatial domain (and
+ * also probably due to oversampling capabilities of the retina and
+ * visual cortex) is that it is less sensitive to the exact magnitude
+ * of high-frequency visual signals than to the appropriate amount of
+ * energy in the nearby frequency band. A Lanczos kernel with a=2
+ * or a=3 strongly decreases the amount of energy in the high frequency
+ * bands. The energy in this area can be increased by increasing a,
+ * which brings in energy from different areas of the image (bad for
+ * reasons mentioned above), or by oversampling the input data. We
+ * have chosen two methods for doing the latter. Firstly, there is
+ * a sharpness parameter, which increases the cutoff frequency of the
+ * filter, aliasing higher frequency noise into the passband. And
+ * secondly, there is the sharpen parameter, which increases the
+ * contribution of high-frequency (but in-band) components.
+ *
+ * An alternate explanation of the usefulness of a sharpening filter
+ * is that many natural images have a roughly 1/f spectrum. In order
+ * for a downsampled image to look more "natural" when high frequencies
+ * are removed, the frequencies in the pass band near the cutoff
+ * frequency are amplified, causing the spectrum to be more roughly
+ * 1/f. I said "roughly", not "literally".
+ *
+ * This alternate explanation is useful for understanding the author's
+ * secondary motivation for developing this algorithm, namely, as a
+ * method of video compression. Several recent techniques (such as
+ * HTTP Live Streaming and SVC) use image scaling as a method to get
+ * increased compression out of nominally non-scalable codecs such as
+ * H.264. For optimal quality, it is thusly important to consider
+ * the scaler and encoder as a combined unit. Tuning of the sharpness
+ * and sharpen parameters was performed using the Toro encoder tuner,
+ * where scaled and encoded video was compared to unscaled and encoded
+ * video. This tuning suggested values that were very close to the
+ * values chosen by manual inspection of scaled images and video.
+ *
+ * The optimal values of sharpen and sharpness were slightly different
+ * depending whether the comparison was still images or video. Video
+ * comparisons were more sensitive to aliasing, since the aliasing
+ * artifacts tended to move or "crawl" around the video. The default
+ * values are for video; image scaling may prefer higher values.
+ *
+ * A number of related techniques were rejected for various reasons.
+ * An early technique of selecting the sharpness factor locally based
+ * on edge detection (in order to use a higher sharpness values without
+ * the corresponding aliasing on edges) worked very well for still
+ * images, but caused too much "crawling" on textures in video. Also,
+ * this method is slow, as it does not parallelize well.
+ *
+ * Non-separable techniques were rejected because the fastest would
+ * have been at least 4x slower.
+ *
+ * It is infrequently appreciated that image scaling should ideally be
+ * done in linear light space. Converting to linear light space has
+ * a similar effect to a sharpening filter. This approach was not
+ * taken because the added benefit is minor compared to the additional
+ * computational cost. Morever, the benefit is decreased by increasing
+ * the strength of the sharpening filter.
+ *
+ */
+#include <string.h>
+
+#include "vs_scanline.h"
+#include "vs_image.h"
+
+#include "gstvideoscaleorc.h"
+#include <gst/gst.h>
+#include <math.h>
+
+#define NEED_CLAMP(x,a,b) ((x) < (a) || (x) > (b))
+
+#define ROUND_UP_2(x) (((x)+1)&~1)
+#define ROUND_UP_4(x) (((x)+3)&~3)
+#define ROUND_UP_8(x) (((x)+7)&~7)
+
+#define SRC_LINE(i) (scale->src->pixels + scale->src->stride * (i))
+
+#define TMP_LINE_S16(i) ((gint16 *)scale->tmpdata + (i)*(scale->dest->width))
+#define TMP_LINE_S32(i) ((gint32 *)scale->tmpdata + (i)*(scale->dest->width))
+#define TMP_LINE_FLOAT(i) ((float *)scale->tmpdata + (i)*(scale->dest->width))
+#define TMP_LINE_DOUBLE(i) ((double *)scale->tmpdata + (i)*(scale->dest->width))
+#define TMP_LINE_S16_AYUV(i) ((gint16 *)scale->tmpdata + (i)*4*(scale->dest->width))
+#define TMP_LINE_S32_AYUV(i) ((gint32 *)scale->tmpdata + (i)*4*(scale->dest->width))
+#define TMP_LINE_FLOAT_AYUV(i) ((float *)scale->tmpdata + (i)*4*(scale->dest->width))
+#define TMP_LINE_DOUBLE_AYUV(i) ((double *)scale->tmpdata + (i)*4*(scale->dest->width))
+
+#define PTR_OFFSET(a,b) ((void *)((char *)(a) + (b)))
+
+typedef void (*HorizResampleFunc) (void *dest, const gint32 * offsets,
+ const void *taps, const void *src, int n_taps, int shift, int n);
+
+typedef struct _Scale1D Scale1D;
+struct _Scale1D
+{
+ int n;
+ double offset;
+ double scale;
+
+ double fx;
+ double ex;
+ int dx;
+
+ int n_taps;
+ gint32 *offsets;
+ void *taps;
+};
+
+typedef struct _Scale Scale;
+struct _Scale
+{
+ const VSImage *dest;
+ const VSImage *src;
+
+ double sharpness;
+ gboolean dither;
+
+ void *tmpdata;
+
+ HorizResampleFunc horiz_resample_func;
+
+ Scale1D x_scale1d;
+ Scale1D y_scale1d;
+};
+
+static void
+vs_image_scale_lanczos_Y_int16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen);
+static void vs_image_scale_lanczos_Y_int32 (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+static void vs_image_scale_lanczos_Y_float (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+static void vs_image_scale_lanczos_Y_double (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+static void
+vs_image_scale_lanczos_AYUV_int16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen);
+static void vs_image_scale_lanczos_AYUV_int32 (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+static void vs_image_scale_lanczos_AYUV_float (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+static void vs_image_scale_lanczos_AYUV_double (const VSImage * dest,
+ const VSImage * src, uint8_t * tmpbuf, double sharpness, gboolean dither,
+ double a, double sharpen);
+
+static double
+sinc (double x)
+{
+ if (x == 0)
+ return 1;
+ return sin (G_PI * x) / (G_PI * x);
+}
+
+static double
+envelope (double x)
+{
+ if (x <= -1 || x >= 1)
+ return 0;
+ return sinc (x);
+}
+
+static int
+scale1d_get_n_taps (int src_size, int dest_size, double a, double sharpness)
+{
+ double scale;
+ double fx;
+ int dx;
+
+ scale = src_size / (double) dest_size;
+ if (scale > 1.0) {
+ fx = (1.0 / scale) * sharpness;
+ } else {
+ fx = (1.0) * sharpness;
+ }
+ dx = ceil (a / fx);
+
+ return 2 * dx;
+}
+
+static void
+scale1d_cleanup (Scale1D * scale)
+{
+ g_free (scale->taps);
+ g_free (scale->offsets);
+}
+
+/*
+ * Calculates a set of taps for each destination element in double
+ * format. Each set of taps sums to 1.0.
+ *
+ */
+static void
+scale1d_calculate_taps (Scale1D * scale, int src_size, int dest_size,
+ int n_taps, double a, double sharpness, double sharpen)
+{
+ int j;
+ double *tap_array;
+ gint32 *offsets;
+ double scale_offset;
+ double scale_increment;
+ int dx;
+ double fx;
+ double ex;
+
+ scale->scale = src_size / (double) dest_size;
+ scale->offset = scale->scale / 2 - 0.5;
+
+ if (scale->scale > 1.0) {
+ scale->fx = (1.0 / scale->scale) * sharpness;
+ } else {
+ scale->fx = (1.0) * sharpness;
+ }
+ scale->ex = scale->fx / a;
+ scale->dx = ceil (a / scale->fx);
+
+ g_assert (n_taps >= 2 * scale->dx);
+ scale->n_taps = n_taps;
+
+ scale->taps = g_malloc (sizeof (double) * scale->n_taps * dest_size);
+ scale->offsets = g_malloc (sizeof (gint32) * dest_size);
+ tap_array = scale->taps;
+ offsets = scale->offsets;
+
+ scale_offset = scale->offset;
+ scale_increment = scale->scale;
+ dx = scale->dx;
+ fx = scale->fx;
+ ex = scale->ex;
+
+ for (j = 0; j < dest_size; j++) {
+ double x;
+ int xi;
+ int l;
+ double weight;
+ double *taps;
+
+ x = scale_offset + scale_increment * j;
+ x = CLAMP (x, 0, src_size);
+ xi = ceil (x) - dx;
+
+ offsets[j] = xi;
+ weight = 0;
+ taps = tap_array + j * n_taps;
+
+ for (l = 0; l < n_taps; l++) {
+ int xl = xi + l;
+ taps[l] = sinc ((x - xl) * fx) * envelope ((x - xl) * ex);
+ taps[l] -= sharpen * envelope ((x - xl) * ex);
+ weight += taps[l];
+ }
+ g_assert (envelope ((x - (xi - 1)) * ex) == 0);
+ g_assert (envelope ((x - (xi + n_taps)) * ex) == 0);
+ for (l = 0; l < n_taps; l++) {
+ taps[l] /= weight;
+ }
+
+ if (xi < 0) {
+ int shift = -xi;
+
+ for (l = 0; l < shift; l++) {
+ taps[shift] += taps[l];
+ }
+ for (l = 0; l < n_taps - shift; l++) {
+ taps[l] = taps[shift + l];
+ }
+ for (; l < n_taps; l++) {
+ taps[l] = 0;
+ }
+ offsets[j] += shift;
+ }
+
+ if (xi > src_size - n_taps) {
+ int shift = xi - (src_size - n_taps);
+
+ for (l = 0; l < shift; l++) {
+ taps[n_taps - shift - 1] += taps[n_taps - shift + l];
+ }
+ for (l = 0; l < n_taps - shift; l++) {
+ taps[n_taps - 1 - l] = taps[n_taps - 1 - shift - l];
+ }
+ for (l = 0; l < shift; l++) {
+ taps[l] = 0;
+ }
+ offsets[j] -= shift;
+ }
+ }
+}
+
+/*
+ * Calculates a set of taps for each destination element in float
+ * format. Each set of taps sums to 1.0.
+ */
+static void
+scale1d_calculate_taps_float (Scale1D * scale, int src_size, int dest_size,
+ int n_taps, double a, double sharpness, double sharpen)
+{
+ double *taps_d;
+ float *taps_f;
+ int j;
+
+ scale1d_calculate_taps (scale, src_size, dest_size, n_taps, a, sharpness,
+ sharpen);
+
+ taps_d = scale->taps;
+ taps_f = g_malloc (sizeof (float) * scale->n_taps * dest_size);
+
+ for (j = 0; j < dest_size * n_taps; j++) {
+ taps_f[j] = taps_d[j];
+ }
+
+ g_free (taps_d);
+ scale->taps = taps_f;
+}
+
+/*
+ * Calculates a set of taps for each destination element in gint32
+ * format. Each set of taps sums to (very nearly) (1<<shift). A
+ * typical value for shift is 10 to 15, so that applying the taps to
+ * uint8 values and summing will fit in a (signed) int32.
+ */
+static void
+scale1d_calculate_taps_int32 (Scale1D * scale, int src_size, int dest_size,
+ int n_taps, double a, double sharpness, double sharpen, int shift)
+{
+ double *taps_d;
+ gint32 *taps_i;
+ int i;
+ int j;
+ double multiplier;
+
+ scale1d_calculate_taps (scale, src_size, dest_size, n_taps, a, sharpness,
+ sharpen);
+
+ taps_d = scale->taps;
+ taps_i = g_malloc (sizeof (gint32) * scale->n_taps * dest_size);
+
+ multiplier = (1 << shift);
+
+ for (j = 0; j < dest_size; j++) {
+ for (i = 0; i < n_taps; i++) {
+ taps_i[j * n_taps + i] =
+ floor (0.5 + taps_d[j * n_taps + i] * multiplier);
+ }
+ }
+
+ g_free (taps_d);
+ scale->taps = taps_i;
+}
+
+/*
+ * Calculates a set of taps for each destination element in gint16
+ * format. Each set of taps sums to (1<<shift). A typical value
+ * for shift is 7, so that applying the taps to uint8 values and
+ * summing will fit in a (signed) int16.
+ */
+static void
+scale1d_calculate_taps_int16 (Scale1D * scale, int src_size, int dest_size,
+ int n_taps, double a, double sharpness, double sharpen, int shift)
+{
+ double *taps_d;
+ gint16 *taps_i;
+ int i;
+ int j;
+ double multiplier;
+
+ scale1d_calculate_taps (scale, src_size, dest_size, n_taps, a, sharpness,
+ sharpen);
+
+ taps_d = scale->taps;
+ taps_i = g_malloc (sizeof (gint16) * scale->n_taps * dest_size);
+
+ multiplier = (1 << shift);
+
+ /* Various methods for converting floating point taps to integer.
+ * The dB values are the SSIM value between scaling an image via
+ * the floating point pathway vs. the integer pathway using the
+ * given code to generate the taps. Only one image was tested,
+ * scaling from 1920x1080 to 640x360. Several variations of the
+ * methods were also tested, with nothing appearing useful. */
+#if 0
+ /* Standard round to integer. This causes bad DC errors. */
+ /* 44.588 dB */
+ for (j = 0; j < dest_size; j++) {
+ for (i = 0; i < n_taps; i++) {
+ taps_i[j * n_taps + i] =
+ floor (0.5 + taps_d[j * n_taps + i] * multiplier);
+ }
+ }
+#endif
+#if 0
+ /* Dithering via error propogation. Works pretty well, but
+ * really we want to propogate errors across rows, which would
+ * mean having several sets of tap arrays. Possible, but more work,
+ * and it may not even be better. */
+ /* 57.0961 dB */
+ {
+ double err = 0;
+ for (j = 0; j < dest_size; j++) {
+ for (i = 0; i < n_taps; i++) {
+ err += taps_d[j * n_taps + i] * multiplier;
+ taps_i[j * n_taps + i] = floor (err);
+ err -= floor (err);
+ }
+ }
+ }
+#endif
+#if 1
+ /* Round to integer, but with an adjustable bias that we use to
+ * eliminate the DC error. This search method is a bit crude, and
+ * could perhaps be improved somewhat. */
+ /* 60.4851 dB */
+ for (j = 0; j < dest_size; j++) {
+ int k;
+ for (k = 0; k < 100; k++) {
+ int sum = 0;
+ double offset;
+
+ offset = k * 0.01;
+ for (i = 0; i < n_taps; i++) {
+ taps_i[j * n_taps + i] =
+ floor (offset + taps_d[j * n_taps + i] * multiplier);
+ sum += taps_i[j * n_taps + i];
+ }
+
+ if (sum >= (1 << shift))
+ break;
+ }
+ }
+#endif
+#if 0
+ /* Round to integer, but adjust the multiplier. The search method is
+ * wrong a lot, but was sufficient enough to calculate dB error. */
+ /* 58.6517 dB */
+ for (j = 0; j < dest_size; j++) {
+ int k;
+ int sum = 0;
+ for (k = 0; k < 200; k++) {
+ sum = 0;
+
+ multiplier = (1 << shift) - 1.0 + k * 0.01;
+ for (i = 0; i < n_taps; i++) {
+ taps_i[j * n_taps + i] =
+ floor (0.5 + taps_d[j * n_taps + i] * multiplier);
+ sum += taps_i[j * n_taps + i];
+ }
+
+ if (sum >= (1 << shift))
+ break;
+ }
+ if (sum != (1 << shift)) {
+ GST_ERROR ("%g %d", multiplier, sum);
+ }
+ }
+#endif
+#if 0
+ /* Round to integer, but subtract the error from the largest tap */
+ /* 58.3677 dB */
+ for (j = 0; j < dest_size; j++) {
+ int err = -multiplier;
+ for (i = 0; i < n_taps; i++) {
+ taps_i[j * n_taps + i] =
+ floor (0.5 + taps_d[j * n_taps + i] * multiplier);
+ err += taps_i[j * n_taps + i];
+ }
+ if (taps_i[j * n_taps + (n_taps / 2 - 1)] >
+ taps_i[j * n_taps + (n_taps / 2)]) {
+ taps_i[j * n_taps + (n_taps / 2 - 1)] -= err;
+ } else {
+ taps_i[j * n_taps + (n_taps / 2)] -= err;
+ }
+ }
+#endif
+
+ g_free (taps_d);
+ scale->taps = taps_i;
+}
+
+
+void
+vs_image_scale_lanczos_Y (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, int submethod,
+ double a, double sharpen)
+{
+ switch (submethod) {
+ case 0:
+ default:
+ vs_image_scale_lanczos_Y_int16 (dest, src, tmpbuf, sharpness, dither, a,
+ sharpen);
+ break;
+ case 1:
+ vs_image_scale_lanczos_Y_int32 (dest, src, tmpbuf, sharpness, dither, a,
+ sharpen);
+ break;
+ case 2:
+ vs_image_scale_lanczos_Y_float (dest, src, tmpbuf, sharpness, dither, a,
+ sharpen);
+ break;
+ case 3:
+ vs_image_scale_lanczos_Y_double (dest, src, tmpbuf, sharpness, dither, a,
+ sharpen);
+ break;
+ }
+}
+
+void
+vs_image_scale_lanczos_AYUV (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, int submethod,
+ double a, double sharpen)
+{
+ switch (submethod) {
+ case 0:
+ default:
+ vs_image_scale_lanczos_AYUV_int16 (dest, src, tmpbuf, sharpness, dither,
+ a, sharpen);
+ break;
+ case 1:
+ vs_image_scale_lanczos_AYUV_int32 (dest, src, tmpbuf, sharpness, dither,
+ a, sharpen);
+ break;
+ case 2:
+ vs_image_scale_lanczos_AYUV_float (dest, src, tmpbuf, sharpness, dither,
+ a, sharpen);
+ break;
+ case 3:
+ vs_image_scale_lanczos_AYUV_double (dest, src, tmpbuf, sharpness, dither,
+ a, sharpen);
+ break;
+ }
+}
+
+
+
+#define RESAMPLE_HORIZ_FLOAT(function, dest_type, tap_type, src_type, _n_taps) \
+static void \
+function (dest_type *dest, const gint32 *offsets, \
+ const tap_type *taps, const src_type *src, int n_taps, int shift, int n) \
+{ \
+ int i; \
+ int k; \
+ dest_type sum; \
+ const src_type *srcline; \
+ const tap_type *tapsline; \
+ for (i = 0; i < n; i++) { \
+ srcline = src + offsets[i]; \
+ tapsline = taps + i * _n_taps; \
+ sum = 0; \
+ for (k = 0; k < _n_taps; k++) { \
+ sum += srcline[k] * tapsline[k]; \
+ } \
+ dest[i] = sum; \
+ } \
+}
+
+#define RESAMPLE_HORIZ(function, dest_type, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (dest_type *dest, const gint32 *offsets, \
+ const tap_type *taps, const src_type *src, int n_taps, int shift, int n) \
+{ \
+ int i; \
+ int k; \
+ dest_type sum; \
+ const src_type *srcline; \
+ const tap_type *tapsline; \
+ int offset; \
+ if (_shift > 0) offset = (1<<_shift)>>1; \
+ else offset = 0; \
+ for (i = 0; i < n; i++) { \
+ srcline = src + offsets[i]; \
+ tapsline = taps + i * _n_taps; \
+ sum = 0; \
+ for (k = 0; k < _n_taps; k++) { \
+ sum += srcline[k] * tapsline[k]; \
+ } \
+ dest[i] = (sum + offset) >> _shift; \
+ } \
+}
+
+#define RESAMPLE_HORIZ_AYUV_FLOAT(function, dest_type, tap_type, src_type, _n_taps) \
+static void \
+function (dest_type *dest, const gint32 *offsets, \
+ const tap_type *taps, const src_type *src, int n_taps, int shift, int n) \
+{ \
+ int i; \
+ int k; \
+ dest_type sum1; \
+ dest_type sum2; \
+ dest_type sum3; \
+ dest_type sum4; \
+ const src_type *srcline; \
+ const tap_type *tapsline; \
+ for (i = 0; i < n; i++) { \
+ srcline = src + 4*offsets[i]; \
+ tapsline = taps + i * _n_taps; \
+ sum1 = 0; \
+ sum2 = 0; \
+ sum3 = 0; \
+ sum4 = 0; \
+ for (k = 0; k < _n_taps; k++) { \
+ sum1 += srcline[k*4+0] * tapsline[k]; \
+ sum2 += srcline[k*4+1] * tapsline[k]; \
+ sum3 += srcline[k*4+2] * tapsline[k]; \
+ sum4 += srcline[k*4+3] * tapsline[k]; \
+ } \
+ dest[i*4+0] = sum1; \
+ dest[i*4+1] = sum2; \
+ dest[i*4+2] = sum3; \
+ dest[i*4+3] = sum4; \
+ } \
+}
+
+#define RESAMPLE_HORIZ_AYUV(function, dest_type, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (dest_type *dest, const gint32 *offsets, \
+ const tap_type *taps, const src_type *src, int n_taps, int shift, int n) \
+{ \
+ int i; \
+ int k; \
+ dest_type sum1; \
+ dest_type sum2; \
+ dest_type sum3; \
+ dest_type sum4; \
+ const src_type *srcline; \
+ const tap_type *tapsline; \
+ int offset; \
+ if (_shift > 0) offset = (1<<_shift)>>1; \
+ else offset = 0; \
+ for (i = 0; i < n; i++) { \
+ srcline = src + 4*offsets[i]; \
+ tapsline = taps + i * _n_taps; \
+ sum1 = 0; \
+ sum2 = 0; \
+ sum3 = 0; \
+ sum4 = 0; \
+ for (k = 0; k < _n_taps; k++) { \
+ sum1 += srcline[k*4+0] * tapsline[k]; \
+ sum2 += srcline[k*4+1] * tapsline[k]; \
+ sum3 += srcline[k*4+2] * tapsline[k]; \
+ sum4 += srcline[k*4+3] * tapsline[k]; \
+ } \
+ dest[i*4+0] = (sum1 + offset) >> _shift; \
+ dest[i*4+1] = (sum2 + offset) >> _shift; \
+ dest[i*4+2] = (sum3 + offset) >> _shift; \
+ dest[i*4+3] = (sum4 + offset) >> _shift; \
+ } \
+}
+
+/* *INDENT-OFF* */
+RESAMPLE_HORIZ_FLOAT (resample_horiz_double_u8_generic, double, double,
+ guint8, n_taps)
+RESAMPLE_HORIZ_FLOAT (resample_horiz_float_u8_generic, float, float,
+ guint8, n_taps)
+RESAMPLE_HORIZ_AYUV_FLOAT (resample_horiz_double_ayuv_generic, double, double,
+ guint8, n_taps)
+RESAMPLE_HORIZ_AYUV_FLOAT (resample_horiz_float_ayuv_generic, float, float,
+ guint8, n_taps)
+
+RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_generic, gint32, gint32,
+ guint8, n_taps, shift)
+RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_generic, gint16, gint16,
+ guint8, n_taps, shift)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int32_int32_ayuv_generic, gint32, gint32,
+ guint8, n_taps, shift)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int16_int16_ayuv_generic, gint16, gint16,
+ guint8, n_taps, shift)
+
+/* Candidates for orcification */
+RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_taps16_shift0, gint32, gint32,
+ guint8, 16, 0)
+RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_taps12_shift0, gint32, gint32,
+ guint8, 12, 0)
+RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_taps8_shift0, gint32, gint32,
+ guint8, 8, 0)
+RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_taps4_shift0, gint32, gint32,
+ guint8, 4, 0)
+RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_taps16_shift0, gint16, gint16,
+ guint8, 16, 0)
+RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_taps12_shift0, gint16, gint16,
+ guint8, 12, 0)
+RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_taps8_shift0, gint16, gint16,
+ guint8, 8, 0)
+RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_taps4_shift0, gint16, gint16,
+ guint8, 4, 0)
+
+RESAMPLE_HORIZ_AYUV (resample_horiz_int32_int32_ayuv_taps16_shift0, gint32, gint32,
+ guint8, 16, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int32_int32_ayuv_taps12_shift0, gint32, gint32,
+ guint8, 12, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int32_int32_ayuv_taps8_shift0, gint32, gint32,
+ guint8, 8, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int32_int32_ayuv_taps4_shift0, gint32, gint32,
+ guint8, 4, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int16_int16_ayuv_taps16_shift0, gint16, gint16,
+ guint8, 16, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int16_int16_ayuv_taps12_shift0, gint16, gint16,
+ guint8, 12, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int16_int16_ayuv_taps8_shift0, gint16, gint16,
+ guint8, 8, 0)
+RESAMPLE_HORIZ_AYUV (resample_horiz_int16_int16_ayuv_taps4_shift0, gint16, gint16,
+ guint8, 4, 0)
+/* *INDENT-ON* */
+
+#define RESAMPLE_VERT(function, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (guint8 *dest, \
+ const tap_type *taps, const src_type *src, int stride, int n_taps, \
+ int shift, int n) \
+{ \
+ int i; \
+ int l; \
+ gint32 sum_y; \
+ gint32 offset = (1<<_shift) >> 1; \
+ for (i = 0; i < n; i++) { \
+ sum_y = 0; \
+ for (l = 0; l < n_taps; l++) { \
+ const src_type *line = PTR_OFFSET(src, stride * l); \
+ sum_y += line[i] * taps[l]; \
+ } \
+ dest[i] = CLAMP ((sum_y + offset) >> _shift, 0, 255); \
+ } \
+}
+
+#define RESAMPLE_VERT_DITHER(function, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (guint8 *dest, \
+ const tap_type *taps, const src_type *src, int stride, int n_taps, \
+ int shift, int n) \
+{ \
+ int i; \
+ int l; \
+ gint32 sum_y; \
+ gint32 err_y = 0; \
+ gint32 mask = (1<<_shift) - 1; \
+ for (i = 0; i < n; i++) { \
+ sum_y = 0; \
+ for (l = 0; l < n_taps; l++) { \
+ const src_type *line = PTR_OFFSET(src, stride * l); \
+ sum_y += line[i] * taps[l]; \
+ } \
+ err_y += sum_y; \
+ dest[i] = CLAMP (err_y >> _shift, 0, 255); \
+ err_y &= mask; \
+ } \
+}
+
+/* *INDENT-OFF* */
+RESAMPLE_VERT (resample_vert_int32_generic, gint32, gint32, n_taps, shift)
+RESAMPLE_VERT_DITHER (resample_vert_dither_int32_generic, gint32, gint32,
+ n_taps, shift)
+RESAMPLE_VERT (resample_vert_int16_generic, gint16, gint16, n_taps, shift);
+RESAMPLE_VERT_DITHER (resample_vert_dither_int16_generic, gint16, gint16,
+ n_taps, shift)
+/* *INDENT-ON* */
+
+#define RESAMPLE_VERT_FLOAT(function, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (guint8 *dest, \
+ const tap_type *taps, const src_type *src, int stride, int n_taps, \
+ int shift, int n) \
+{ \
+ int i; \
+ int l; \
+ src_type sum_y; \
+ for (i = 0; i < n; i++) { \
+ sum_y = 0; \
+ for (l = 0; l < n_taps; l++) { \
+ const src_type *line = PTR_OFFSET(src, stride * l); \
+ sum_y += line[i] * taps[l]; \
+ } \
+ dest[i] = CLAMP (floor(0.5 + sum_y), 0, 255); \
+ } \
+}
+
+#define RESAMPLE_VERT_FLOAT_DITHER(function, tap_type, src_type, _n_taps, _shift) \
+static void \
+function (guint8 *dest, \
+ const tap_type *taps, const src_type *src, int stride, int n_taps, \
+ int shift, int n) \
+{ \
+ int i; \
+ int l; \
+ src_type sum_y; \
+ src_type err_y = 0; \
+ for (i = 0; i < n; i++) { \
+ sum_y = 0; \
+ for (l = 0; l < n_taps; l++) { \
+ const src_type *line = PTR_OFFSET(src, stride * l); \
+ sum_y += line[i] * taps[l]; \
+ } \
+ err_y += sum_y; \
+ dest[i] = CLAMP (floor (err_y), 0, 255); \
+ err_y -= floor (err_y); \
+ } \
+}
+
+/* *INDENT-OFF* */
+RESAMPLE_VERT_FLOAT (resample_vert_double_generic, double, double, n_taps,
+ shift)
+RESAMPLE_VERT_FLOAT_DITHER (resample_vert_dither_double_generic, double, double,
+ n_taps, shift)
+
+RESAMPLE_VERT_FLOAT (resample_vert_float_generic, float, float, n_taps, shift)
+RESAMPLE_VERT_FLOAT_DITHER (resample_vert_dither_float_generic, float, float,
+ n_taps, shift)
+/* *INDENT-ON* */
+
+#define S16_SHIFT1 7
+#define S16_SHIFT2 7
+#define S16_MIDSHIFT 0
+#define S16_POSTSHIFT (S16_SHIFT1+S16_SHIFT2-S16_MIDSHIFT)
+
+static void
+vs_scale_lanczos_Y_int16 (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ gint16 *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_S16 (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, S16_MIDSHIFT, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (gint16 *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_int16_generic (destline,
+ taps, TMP_LINE_S16 (scale->y_scale1d.offsets[j]),
+ sizeof (gint16) * scale->dest->width, scale->y_scale1d.n_taps,
+ S16_POSTSHIFT, scale->dest->width);
+ } else {
+ resample_vert_int16_generic (destline,
+ taps, TMP_LINE_S16 (scale->y_scale1d.offsets[j]),
+ sizeof (gint16) * scale->dest->width, scale->y_scale1d.n_taps,
+ S16_POSTSHIFT, scale->dest->width);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_Y_int16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ n_taps = ROUND_UP_4 (n_taps);
+ scale1d_calculate_taps_int16 (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen, S16_SHIFT1);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_int16 (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen, S16_SHIFT2);
+
+ scale->dither = dither;
+
+ switch (scale->x_scale1d.n_taps) {
+ case 4:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_u8_taps4_shift0;
+ break;
+ case 8:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_u8_taps8_shift0;
+ break;
+ case 12:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_u8_taps12_shift0;
+ break;
+ case 16:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_u8_taps16_shift0;
+ break;
+ default:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_u8_generic;
+ break;
+ }
+
+ scale->tmpdata =
+ g_malloc (sizeof (gint16) * scale->dest->width * scale->src->height);
+
+ vs_scale_lanczos_Y_int16 (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+
+#define S32_SHIFT1 11
+#define S32_SHIFT2 11
+#define S32_MIDSHIFT 0
+#define S32_POSTSHIFT (S32_SHIFT1+S32_SHIFT2-S32_MIDSHIFT)
+
+static void
+vs_scale_lanczos_Y_int32 (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ gint32 *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_S32 (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, S32_MIDSHIFT, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (gint32 *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_int32_generic (destline,
+ taps, TMP_LINE_S32 (scale->y_scale1d.offsets[j]),
+ sizeof (gint32) * scale->dest->width,
+ scale->y_scale1d.n_taps, S32_POSTSHIFT, scale->dest->width);
+ } else {
+ resample_vert_int32_generic (destline,
+ taps, TMP_LINE_S32 (scale->y_scale1d.offsets[j]),
+ sizeof (gint32) * scale->dest->width,
+ scale->y_scale1d.n_taps, S32_POSTSHIFT, scale->dest->width);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_Y_int32 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ n_taps = ROUND_UP_4 (n_taps);
+ scale1d_calculate_taps_int32 (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen, S32_SHIFT1);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_int32 (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen, S32_SHIFT2);
+
+ scale->dither = dither;
+
+ switch (scale->x_scale1d.n_taps) {
+ case 4:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_u8_taps4_shift0;
+ break;
+ case 8:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_u8_taps8_shift0;
+ break;
+ case 12:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_u8_taps12_shift0;
+ break;
+ case 16:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_u8_taps16_shift0;
+ break;
+ default:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_u8_generic;
+ break;
+ }
+
+ scale->tmpdata =
+ g_malloc (sizeof (int32_t) * scale->dest->width * scale->src->height);
+
+ vs_scale_lanczos_Y_int32 (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+static void
+vs_scale_lanczos_Y_double (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ double *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_DOUBLE (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, 0, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (double *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_double_generic (destline,
+ taps, TMP_LINE_DOUBLE (scale->y_scale1d.offsets[j]),
+ sizeof (double) * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width);
+ } else {
+ resample_vert_double_generic (destline,
+ taps, TMP_LINE_DOUBLE (scale->y_scale1d.offsets[j]),
+ sizeof (double) * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_Y_double (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ scale1d_calculate_taps (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen);
+
+ scale->dither = dither;
+
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_double_u8_generic;
+
+ scale->tmpdata =
+ g_malloc (sizeof (double) * scale->dest->width * scale->src->height);
+
+ vs_scale_lanczos_Y_double (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+static void
+vs_scale_lanczos_Y_float (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ float *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_FLOAT (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, 0, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (float *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_float_generic (destline,
+ taps, TMP_LINE_FLOAT (scale->y_scale1d.offsets[j]),
+ sizeof (float) * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width);
+ } else {
+ resample_vert_float_generic (destline,
+ taps, TMP_LINE_FLOAT (scale->y_scale1d.offsets[j]),
+ sizeof (float) * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_Y_float (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ scale1d_calculate_taps_float (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_float (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen);
+
+ scale->dither = dither;
+
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_float_u8_generic;
+
+ scale->tmpdata =
+ g_malloc (sizeof (float) * scale->dest->width * scale->src->height);
+
+ vs_scale_lanczos_Y_float (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+
+
+
+
+static void
+vs_scale_lanczos_AYUV_int16 (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ gint16 *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_S16_AYUV (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, S16_MIDSHIFT, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (gint16 *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_int16_generic (destline,
+ taps, TMP_LINE_S16_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (gint16) * 4 * scale->dest->width,
+ scale->y_scale1d.n_taps, S16_POSTSHIFT, scale->dest->width * 4);
+ } else {
+ resample_vert_int16_generic (destline,
+ taps, TMP_LINE_S16_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (gint16) * 4 * scale->dest->width,
+ scale->y_scale1d.n_taps, S16_POSTSHIFT, scale->dest->width * 4);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_AYUV_int16 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ n_taps = ROUND_UP_4 (n_taps);
+ scale1d_calculate_taps_int16 (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen, S16_SHIFT1);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_int16 (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen, S16_SHIFT2);
+
+ scale->dither = dither;
+
+ switch (scale->x_scale1d.n_taps) {
+ case 4:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_ayuv_taps4_shift0;
+ break;
+ case 8:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_ayuv_taps8_shift0;
+ break;
+ case 12:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_ayuv_taps12_shift0;
+ break;
+ case 16:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_ayuv_taps16_shift0;
+ break;
+ default:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int16_int16_ayuv_generic;
+ break;
+ }
+
+ scale->tmpdata =
+ g_malloc (sizeof (gint16) * scale->dest->width * scale->src->height * 4);
+
+ vs_scale_lanczos_AYUV_int16 (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+
+static void
+vs_scale_lanczos_AYUV_int32 (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ gint32 *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_S32_AYUV (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, S32_MIDSHIFT, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (gint32 *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_int32_generic (destline,
+ taps, TMP_LINE_S32_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (gint32) * 4 * scale->dest->width, scale->y_scale1d.n_taps,
+ S32_POSTSHIFT, scale->dest->width * 4);
+ } else {
+ resample_vert_int32_generic (destline,
+ taps, TMP_LINE_S32_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (gint32) * 4 * scale->dest->width, scale->y_scale1d.n_taps,
+ S32_POSTSHIFT, scale->dest->width * 4);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_AYUV_int32 (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ n_taps = ROUND_UP_4 (n_taps);
+ scale1d_calculate_taps_int32 (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen, S32_SHIFT1);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_int32 (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen, S32_SHIFT2);
+
+ scale->dither = dither;
+
+ switch (scale->x_scale1d.n_taps) {
+ case 4:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_ayuv_taps4_shift0;
+ break;
+ case 8:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_ayuv_taps8_shift0;
+ break;
+ case 12:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_ayuv_taps12_shift0;
+ break;
+ case 16:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_ayuv_taps16_shift0;
+ break;
+ default:
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_int32_int32_ayuv_generic;
+ break;
+ }
+
+ scale->tmpdata =
+ g_malloc (sizeof (int32_t) * scale->dest->width * scale->src->height * 4);
+
+ vs_scale_lanczos_AYUV_int32 (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+static void
+vs_scale_lanczos_AYUV_double (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ double *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_DOUBLE_AYUV (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, 0, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (double *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_double_generic (destline,
+ taps, TMP_LINE_DOUBLE_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (double) * 4 * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width * 4);
+ } else {
+ resample_vert_double_generic (destline,
+ taps, TMP_LINE_DOUBLE_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (double) * 4 * scale->dest->width,
+ scale->y_scale1d.n_taps, 0, scale->dest->width * 4);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_AYUV_double (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ scale1d_calculate_taps (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen);
+
+ scale->dither = dither;
+
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_double_ayuv_generic;
+
+ scale->tmpdata =
+ g_malloc (sizeof (double) * scale->dest->width * scale->src->height * 4);
+
+ vs_scale_lanczos_AYUV_double (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
+
+static void
+vs_scale_lanczos_AYUV_float (Scale * scale)
+{
+ int j;
+ int yi;
+ int tmp_yi;
+
+ tmp_yi = 0;
+
+ for (j = 0; j < scale->dest->height; j++) {
+ guint8 *destline;
+ float *taps;
+
+ destline = scale->dest->pixels + scale->dest->stride * j;
+
+ yi = scale->y_scale1d.offsets[j];
+
+ while (tmp_yi < yi + scale->y_scale1d.n_taps) {
+ scale->horiz_resample_func (TMP_LINE_FLOAT_AYUV (tmp_yi),
+ scale->x_scale1d.offsets, scale->x_scale1d.taps, SRC_LINE (tmp_yi),
+ scale->x_scale1d.n_taps, 0, scale->dest->width);
+ tmp_yi++;
+ }
+
+ taps = (float *) scale->y_scale1d.taps + j * scale->y_scale1d.n_taps;
+ if (scale->dither) {
+ resample_vert_dither_float_generic (destline,
+ taps, TMP_LINE_FLOAT_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (float) * 4 * scale->dest->width, scale->y_scale1d.n_taps, 0,
+ scale->dest->width * 4);
+ } else {
+ resample_vert_float_generic (destline,
+ taps, TMP_LINE_FLOAT_AYUV (scale->y_scale1d.offsets[j]),
+ sizeof (float) * 4 * scale->dest->width, scale->y_scale1d.n_taps, 0,
+ scale->dest->width * 4);
+ }
+ }
+}
+
+void
+vs_image_scale_lanczos_AYUV_float (const VSImage * dest, const VSImage * src,
+ uint8_t * tmpbuf, double sharpness, gboolean dither, double a,
+ double sharpen)
+{
+ Scale s = { 0 };
+ Scale *scale = &s;
+ int n_taps;
+
+ scale->dest = dest;
+ scale->src = src;
+
+ n_taps = scale1d_get_n_taps (src->width, dest->width, a, sharpness);
+ scale1d_calculate_taps_float (&scale->x_scale1d,
+ src->width, dest->width, n_taps, a, sharpness, sharpen);
+
+ n_taps = scale1d_get_n_taps (src->height, dest->height, a, sharpness);
+ scale1d_calculate_taps_float (&scale->y_scale1d,
+ src->height, dest->height, n_taps, a, sharpness, sharpen);
+
+ scale->dither = dither;
+
+ scale->horiz_resample_func =
+ (HorizResampleFunc) resample_horiz_float_ayuv_generic;
+
+ scale->tmpdata =
+ g_malloc (sizeof (float) * scale->dest->width * scale->src->height * 4);
+
+ vs_scale_lanczos_AYUV_float (scale);
+
+ scale1d_cleanup (&scale->x_scale1d);
+ scale1d_cleanup (&scale->y_scale1d);
+ g_free (scale->tmpdata);
+}
diff --git a/gst/videoscale/vs_scanline.c b/gst/videoscale/vs_scanline.c
new file mode 100644
index 0000000..822a6b6
--- /dev/null
+++ b/gst/videoscale/vs_scanline.c
@@ -0,0 +1,781 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#include "vs_scanline.h"
+
+#include "gstvideoscaleorc.h"
+#include <gst/gst.h>
+
+#include <string.h>
+
+/* greyscale, i.e., single componenet */
+
+void
+vs_scanline_downsample_Y (uint8_t * dest, uint8_t * src, int n)
+{
+ orc_downsample_u8 (dest, src, n);
+}
+
+void
+vs_scanline_resample_nearest_Y (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ gst_videoscale_orc_resample_nearest_u8 (dest, src,
+ *accumulator, increment, n);
+
+ *accumulator += n * increment;
+}
+
+#include <glib.h>
+void
+vs_scanline_resample_linear_Y (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ gst_videoscale_orc_resample_bilinear_u8 (dest, src,
+ *accumulator, increment, n);
+
+ *accumulator += n * increment;
+}
+
+void
+vs_scanline_merge_linear_Y (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ int n, int x)
+{
+ uint32_t value = x >> 8;
+
+ if (value == 0) {
+ memcpy (dest, src1, n);
+ } else {
+ orc_merge_linear_u8 (dest, src1, src2, value, n);
+ }
+}
+
+void
+vs_scanline_downsample_Y16 (uint8_t * dest, uint8_t * src, int n)
+{
+ orc_downsample_u16 ((uint16_t *) dest, (uint16_t *) src, n);
+}
+
+void
+vs_scanline_resample_nearest_Y16 (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ uint16_t *d = (uint16_t *) dest, *s = (uint16_t *) src;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ d[i] = (x < 32768 || j + 1 >= src_width) ? s[j] : s[j + 1];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_Y16 (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ uint16_t *d = (uint16_t *) dest, *s = (uint16_t *) src;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width)
+ d[i] = (s[j] * (65536 - x) + s[j + 1] * x) >> 16;
+ else
+ d[i] = s[j];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_Y16 (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ int n, int x)
+{
+ uint16_t *d = (uint16_t *) dest;
+ const uint16_t *s1 = (const uint16_t *) src1;
+ const uint16_t *s2 = (const uint16_t *) src2;
+
+ if (x == 0) {
+ memcpy (d, s1, n * 2);
+ } else {
+ orc_merge_linear_u16 (d, s1, s2, 65536 - x, x, n);
+ }
+}
+
+/* RGBA */
+
+void
+vs_scanline_downsample_RGBA (uint8_t * dest, uint8_t * src, int n)
+{
+ gst_videoscale_orc_downsample_u32 (dest, src, n);
+}
+
+void
+vs_scanline_resample_nearest_RGBA (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ gst_videoscale_orc_resample_nearest_u32 (dest, src,
+ *accumulator, increment, n);
+
+ *accumulator += n * increment;
+}
+
+void
+vs_scanline_resample_linear_RGBA (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ gst_videoscale_orc_resample_bilinear_u32 (dest, src,
+ *accumulator, increment, n);
+
+ *accumulator += n * increment;
+}
+
+void
+vs_scanline_merge_linear_RGBA (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ int n, int x)
+{
+ uint32_t value = x >> 8;
+
+ if (value == 0) {
+ memcpy (dest, src1, n * 4);
+ } else {
+ orc_merge_linear_u8 (dest, src1, src2, value, n * 4);
+ }
+}
+
+
+/* RGB */
+
+void
+vs_scanline_downsample_RGB (uint8_t * dest, uint8_t * src, int n)
+{
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i * 3 + 0] = (src[i * 6 + 0] + src[i * 6 + 3]) / 2;
+ dest[i * 3 + 1] = (src[i * 6 + 1] + src[i * 6 + 4]) / 2;
+ dest[i * 3 + 2] = (src[i * 6 + 2] + src[i * 6 + 5]) / 2;
+ }
+}
+
+void
+vs_scanline_resample_nearest_RGB (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ dest[i * 3 + 0] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 3 + 0] : src[j * 3 + 3];
+ dest[i * 3 + 1] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 3 + 1] : src[j * 3 + 4];
+ dest[i * 3 + 2] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 3 + 2] : src[j * 3 + 5];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_RGB (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width) {
+ dest[i * 3 + 0] =
+ (src[j * 3 + 0] * (65536 - x) + src[j * 3 + 3] * x) >> 16;
+ dest[i * 3 + 1] =
+ (src[j * 3 + 1] * (65536 - x) + src[j * 3 + 4] * x) >> 16;
+ dest[i * 3 + 2] =
+ (src[j * 3 + 2] * (65536 - x) + src[j * 3 + 5] * x) >> 16;
+ } else {
+ dest[i * 3 + 0] = src[j * 3 + 0];
+ dest[i * 3 + 1] = src[j * 3 + 1];
+ dest[i * 3 + 2] = src[j * 3 + 2];
+ }
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_RGB (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ int n, int x)
+{
+ uint32_t value = x >> 8;
+
+ if (value == 0) {
+ memcpy (dest, src1, n * 3);
+ } else {
+ orc_merge_linear_u8 (dest, src1, src2, value, n * 3);
+ }
+}
+
+
+/* YUYV */
+
+/* n is the number of pixels */
+/* increment is per Y pixel */
+
+void
+vs_scanline_downsample_YUYV (uint8_t * dest, uint8_t * src, int n)
+{
+ gst_videoscale_orc_downsample_yuyv (dest, src, n);
+}
+
+void
+vs_scanline_resample_nearest_YUYV (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ int quads = (n + 1) / 2;
+
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ dest[i * 4 + 0] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 2 + 0] : src[j * 2 + 2];
+
+ j = acc >> 17;
+ x = acc & 0x1ffff;
+ dest[i * 4 + 1] = (x < 65536
+ || 2 * j + 2 >= src_width) ? src[j * 4 + 1] : src[j * 4 + 5];
+
+ if (2 * i + 1 < n && 2 * j + 1 < src_width)
+ dest[i * 4 + 3] = (x < 65536
+ || 2 * j + 3 >= src_width) ? src[j * 4 + 3] : src[j * 4 + 7];
+
+ acc += increment;
+
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (2 * i + 1 < n && j < src_width) {
+ dest[i * 4 + 2] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 2 + 0] : src[j * 2 + 2];
+ acc += increment;
+ }
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_YUYV (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ int quads = (n + 1) / 2;
+
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width)
+ dest[i * 4 + 0] =
+ (src[j * 2 + 0] * (65536 - x) + src[j * 2 + 2] * x) >> 16;
+ else
+ dest[i * 4 + 0] = src[j * 2 + 0];
+
+ j = acc >> 17;
+ x = acc & 0x1ffff;
+
+ if (2 * j + 2 < src_width)
+ dest[i * 4 + 1] =
+ (src[j * 4 + 1] * (131072 - x) + src[j * 4 + 5] * x) >> 17;
+ else
+ dest[i * 4 + 1] = src[j * 4 + 1];
+
+ if (2 * i + 1 < n && 2 * j + 1 < src_width) {
+ if (2 * j + 3 < src_width)
+ dest[i * 4 + 3] =
+ (src[j * 4 + 3] * (131072 - x) + src[j * 4 + 7] * x) >> 17;
+ else
+ dest[i * 4 + 3] = src[j * 4 + 3];
+ }
+
+ acc += increment;
+
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (2 * i + 1 < n && j < src_width) {
+ if (j + 1 < src_width)
+ dest[i * 4 + 2] =
+ (src[j * 2 + 0] * (65536 - x) + src[j * 2 + 2] * x) >> 16;
+ else
+ dest[i * 4 + 2] = src[j * 2 + 0];
+ acc += increment;
+ }
+ }
+
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_YUYV (uint8_t * dest, uint8_t * src1, uint8_t * src2,
+ int n, int x)
+{
+ int quads = (n + 1) / 2;
+ uint32_t value = x >> 8;
+
+ if (value == 0) {
+ memcpy (dest, src1, quads * 4);
+ } else {
+ orc_merge_linear_u8 (dest, src1, src2, value, quads * 4);
+ }
+}
+
+
+/* UYVY */
+
+/* n is the number of bi-pixels */
+/* increment is per Y pixel */
+
+void
+vs_scanline_downsample_UYVY (uint8_t * dest, uint8_t * src, int n)
+{
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i * 4 + 0] = (src[i * 8 + 0] + src[i * 8 + 4]) / 2;
+ dest[i * 4 + 1] = (src[i * 8 + 1] + src[i * 8 + 3]) / 2;
+ dest[i * 4 + 2] = (src[i * 8 + 2] + src[i * 8 + 6]) / 2;
+ dest[i * 4 + 3] = (src[i * 8 + 5] + src[i * 8 + 7]) / 2;
+ }
+}
+
+void
+vs_scanline_resample_nearest_UYVY (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ int quads = (n + 1) / 2;
+
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ dest[i * 4 + 1] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 2 + 1] : src[j * 2 + 3];
+
+ j = acc >> 17;
+ x = acc & 0x1ffff;
+
+ dest[i * 4 + 0] = (x < 65536
+ || 2 * j + 2 >= src_width) ? src[j * 4 + 0] : src[j * 4 + 4];
+
+ if (2 * i + 1 < n && 2 * j + 1 < src_width)
+ dest[i * 4 + 2] = (x < 65536
+ || 2 * j + 3 >= src_width) ? src[j * 4 + 2] : src[j * 4 + 6];
+
+ acc += increment;
+
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (2 * i + 1 < n && j < src_width) {
+ dest[i * 4 + 3] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 2 + 1] : src[j * 2 + 3];
+ acc += increment;
+ }
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_UYVY (uint8_t * dest, uint8_t * src, int src_width,
+ int n, int *accumulator, int increment)
+{
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+ int quads = (n + 1) / 2;
+
+ for (i = 0; i < quads; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width)
+ dest[i * 4 + 1] =
+ (src[j * 2 + 1] * (65536 - x) + src[j * 2 + 3] * x) >> 16;
+ else
+ dest[i * 4 + 1] = src[j * 2 + 1];
+
+ j = acc >> 17;
+ x = acc & 0x1ffff;
+ if (2 * j + 2 < src_width)
+ dest[i * 4 + 0] =
+ (src[j * 4 + 0] * (131072 - x) + src[j * 4 + 4] * x) >> 17;
+ else
+ dest[i * 4 + 0] = src[j * 4 + 0];
+
+ if (i * 2 + 1 < n && 2 * j + 1 < src_width) {
+ if (2 * j + 3 < src_width)
+ dest[i * 4 + 2] =
+ (src[j * 4 + 2] * (131072 - x) + src[j * 4 + 6] * x) >> 17;
+ else
+ dest[i * 4 + 2] = src[j * 4 + 2];
+ }
+
+ acc += increment;
+
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (2 * i + 1 < n && j < src_width) {
+ if (j + 1 < src_width)
+ dest[i * 4 + 3] =
+ (src[j * 2 + 1] * (65536 - x) + src[j * 2 + 3] * x) >> 16;
+ else
+ dest[i * 4 + 3] = src[j * 2 + 1];
+ acc += increment;
+ }
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_UYVY (uint8_t * dest, uint8_t * src1,
+ uint8_t * src2, int n, int x)
+{
+ int quads = (n + 1) / 2;
+ uint32_t value = x >> 8;
+
+ if (value == 0) {
+ memcpy (dest, src1, quads * 4);
+ } else {
+ orc_merge_linear_u8 (dest, src1, src2, value, quads * 4);
+ }
+}
+
+
+/* RGB565 */
+
+/* note that src and dest are uint16_t, and thus endian dependent */
+
+#define RGB565_R(x) (((x)&0xf800)>>8 | ((x)&0xf800)>>13)
+#define RGB565_G(x) (((x)&0x07e0)>>3 | ((x)&0x07e0)>>9)
+#define RGB565_B(x) (((x)&0x001f)<<3 | ((x)&0x001f)>>2)
+
+#define RGB565(r,g,b) \
+ ((((r)<<8)&0xf800) | (((g)<<3)&0x07e0) | (((b)>>3)&0x001f))
+
+
+void
+vs_scanline_downsample_RGB565 (uint8_t * dest_u8, uint8_t * src_u8, int n)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i] = RGB565 (
+ (RGB565_R (src[i * 2]) + RGB565_R (src[i * 2 + 1])) / 2,
+ (RGB565_G (src[i * 2]) + RGB565_G (src[i * 2 + 1])) / 2,
+ (RGB565_B (src[i * 2]) + RGB565_B (src[i * 2 + 1])) / 2);
+ }
+}
+
+void
+vs_scanline_resample_nearest_RGB565 (uint8_t * dest_u8, uint8_t * src_u8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ dest[i] = (x < 32768 || j + 1 >= src_width) ? src[j] : src[j + 1];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_RGB565 (uint8_t * dest_u8, uint8_t * src_u8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width) {
+ dest[i] = RGB565 (
+ (RGB565_R (src[j]) * (65536 - x) + RGB565_R (src[j + 1]) * x) >> 16,
+ (RGB565_G (src[j]) * (65536 - x) + RGB565_G (src[j + 1]) * x) >> 16,
+ (RGB565_B (src[j]) * (65536 - x) + RGB565_B (src[j + 1]) * x) >> 16);
+ } else {
+ dest[i] = RGB565 (RGB565_R (src[j]),
+ RGB565_G (src[j]), RGB565_B (src[j]));
+ }
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_RGB565 (uint8_t * dest_u8, uint8_t * src1_u8,
+ uint8_t * src2_u8, int n, int x)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src1 = (uint16_t *) src1_u8;
+ uint16_t *src2 = (uint16_t *) src2_u8;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i] = RGB565 (
+ (RGB565_R (src1[i]) * (65536 - x) + RGB565_R (src2[i]) * x) >> 16,
+ (RGB565_G (src1[i]) * (65536 - x) + RGB565_G (src2[i]) * x) >> 16,
+ (RGB565_B (src1[i]) * (65536 - x) + RGB565_B (src2[i]) * x) >> 16);
+ }
+}
+
+
+/* RGB555 */
+
+/* note that src and dest are uint16_t, and thus endian dependent */
+
+#define RGB555_R(x) (((x)&0x7c00)>>8 | ((x)&0x7c00)>>13)
+#define RGB555_G(x) (((x)&0x03e0)>>3 | ((x)&0x03e0)>>9)
+#define RGB555_B(x) (((x)&0x001f)<<3 | ((x)&0x001f)>>2)
+
+#define RGB555(r,g,b) \
+ ((((r)<<7)&0x7c00) | (((g)<<3)&0x03e0) | (((b)>>3)&0x001f))
+
+
+void
+vs_scanline_downsample_RGB555 (uint8_t * dest_u8, uint8_t * src_u8, int n)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i] = RGB555 (
+ (RGB555_R (src[i * 2]) + RGB555_R (src[i * 2 + 1])) / 2,
+ (RGB555_G (src[i * 2]) + RGB555_G (src[i * 2 + 1])) / 2,
+ (RGB555_B (src[i * 2]) + RGB555_B (src[i * 2 + 1])) / 2);
+ }
+}
+
+void
+vs_scanline_resample_nearest_RGB555 (uint8_t * dest_u8, uint8_t * src_u8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ dest[i] = (x < 32768 || j + 1 >= src_width) ? src[j] : src[j + 1];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_RGB555 (uint8_t * dest_u8, uint8_t * src_u8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src = (uint16_t *) src_u8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+
+ if (j + 1 < src_width) {
+ dest[i] = RGB555 (
+ (RGB555_R (src[j]) * (65536 - x) + RGB555_R (src[j + 1]) * x) >> 16,
+ (RGB555_G (src[j]) * (65536 - x) + RGB555_G (src[j + 1]) * x) >> 16,
+ (RGB555_B (src[j]) * (65536 - x) + RGB555_B (src[j + 1]) * x) >> 16);
+ } else {
+ dest[i] = RGB555 (RGB555_R (src[j]),
+ RGB555_G (src[j]), RGB555_B (src[j]));
+ }
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_merge_linear_RGB555 (uint8_t * dest_u8, uint8_t * src1_u8,
+ uint8_t * src2_u8, int n, int x)
+{
+ uint16_t *dest = (uint16_t *) dest_u8;
+ uint16_t *src1 = (uint16_t *) src1_u8;
+ uint16_t *src2 = (uint16_t *) src2_u8;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dest[i] = RGB555 (
+ (RGB555_R (src1[i]) * (65536 - x) + RGB555_R (src2[i]) * x) >> 16,
+ (RGB555_G (src1[i]) * (65536 - x) + RGB555_G (src2[i]) * x) >> 16,
+ (RGB555_B (src1[i]) * (65536 - x) + RGB555_B (src2[i]) * x) >> 16);
+ }
+}
+
+void
+vs_scanline_resample_nearest_AYUV64 (uint8_t * dest8, uint8_t * src8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ guint16 *dest = (guint16 *) dest8;
+ guint16 *src = (guint16 *) src8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = acc & 0xffff;
+ dest[i * 4 + 0] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 4 + 0] : src[j * 4 + 4];
+ dest[i * 4 + 1] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 4 + 1] : src[j * 4 + 5];
+ dest[i * 4 + 2] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 4 + 2] : src[j * 4 + 6];
+ dest[i * 4 + 3] = (x < 32768
+ || j + 1 >= src_width) ? src[j * 4 + 3] : src[j * 4 + 7];
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
+
+void
+vs_scanline_resample_linear_AYUV64 (uint8_t * dest8, uint8_t * src8,
+ int src_width, int n, int *accumulator, int increment)
+{
+ guint16 *dest = (guint16 *) dest8;
+ guint16 *src = (guint16 *) src8;
+ int acc = *accumulator;
+ int i;
+ int j;
+ int x;
+
+ for (i = 0; i < n; i++) {
+ j = acc >> 16;
+ x = (acc & 0xffff) >> 1;
+
+ if (j + 1 < src_width) {
+ dest[i * 4 + 0] =
+ (src[j * 3 + 0] * (32768 - x) + src[j * 4 + 4] * x) >> 15;
+ dest[i * 4 + 1] =
+ (src[j * 4 + 1] * (32768 - x) + src[j * 4 + 5] * x) >> 15;
+ dest[i * 4 + 2] =
+ (src[j * 4 + 2] * (32768 - x) + src[j * 4 + 6] * x) >> 15;
+ dest[i * 4 + 3] =
+ (src[j * 4 + 3] * (32768 - x) + src[j * 4 + 7] * x) >> 15;
+ } else {
+ dest[i * 4 + 0] = src[j * 4 + 0];
+ dest[i * 4 + 1] = src[j * 4 + 1];
+ dest[i * 4 + 2] = src[j * 4 + 2];
+ dest[i * 4 + 3] = src[j * 4 + 3];
+ }
+
+ acc += increment;
+ }
+
+ *accumulator = acc;
+}
diff --git a/gst/videoscale/vs_scanline.h b/gst/videoscale/vs_scanline.h
new file mode 100644
index 0000000..387fc95
--- /dev/null
+++ b/gst/videoscale/vs_scanline.h
@@ -0,0 +1,79 @@
+/*
+ * Image Scaling Functions
+ * Copyright (c) 2005 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, 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.
+ *
+ * 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.
+ */
+
+#ifndef __VS_SCANLINE_H__
+#define __VS_SCANLINE_H__
+
+#include <_stdint.h>
+
+void vs_scanline_downsample_Y (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_Y (uint8_t *dest, uint8_t *src, int n, int src_width, int *accumulator, int increment);
+void vs_scanline_resample_linear_Y (uint8_t *dest, uint8_t *src, int n, int src_width, int *accumulator, int increment);
+void vs_scanline_merge_linear_Y (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_RGBA (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_RGBA (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_RGBA (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_RGBA (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_RGB (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_RGB (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_RGB (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_RGB (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_YUYV (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_YUYV (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_YUYV (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_YUYV (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_UYVY (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_UYVY (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_UYVY (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_UYVY (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_RGB565 (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_RGB565 (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_RGB565 (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_RGB565 (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_RGB555 (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_RGB555 (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_RGB555 (uint8_t *dest, uint8_t *src, int src_width, int n, int *accumulator, int increment);
+void vs_scanline_merge_linear_RGB555 (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_downsample_Y16 (uint8_t *dest, uint8_t *src, int n);
+void vs_scanline_resample_nearest_Y16 (uint8_t *dest, uint8_t *src, int n, int src_width, int *accumulator, int increment);
+void vs_scanline_resample_linear_Y16 (uint8_t *dest, uint8_t *src, int n, int src_width, int *accumulator, int increment);
+void vs_scanline_merge_linear_Y16 (uint8_t *dest, uint8_t *src1, uint8_t *src2, int n, int x);
+
+void vs_scanline_resample_nearest_AYUV64 (uint8_t * dest, uint8_t * src,
+ int src_width, int n, int *accumulator, int increment);
+void vs_scanline_resample_linear_AYUV64 (uint8_t * dest, uint8_t * src,
+ int src_width, int n, int *accumulator, int increment);
+
+#endif
+
diff --git a/gst/videotestsrc/Makefile.am b/gst/videotestsrc/Makefile.am
new file mode 100644
index 0000000..cbfda81
--- /dev/null
+++ b/gst/videotestsrc/Makefile.am
@@ -0,0 +1,39 @@
+plugin_LTLIBRARIES = libgstvideotestsrc.la
+
+ORC_SOURCE=gstvideotestsrcorc
+include $(top_srcdir)/common/orc.mak
+
+libgstvideotestsrc_la_SOURCES = \
+ gstvideotestsrc.c \
+ videotestsrc.c
+nodist_libgstvideotestsrc_la_SOURCES = $(ORC_NODIST_SOURCES)
+
+libgstvideotestsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideotestsrc_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+libgstvideotestsrc_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstvideotestsrc.h videotestsrc.h
+
+noinst_PROGRAMS = generate_sine_table
+
+generate_sine_table_SOURCES = generate_sine_table.c
+generate_sine_table_CFLAGS = $(GST_CFLAGS)
+generate_sine_table_LDADD = $(LIBM)
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstvideotestsrc -:SHARED libgstvideotestsrc \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideotestsrc_la_SOURCES) \
+ $(nodist_libgstvideotestsrc_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideotestsrc_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideotestsrc_la_LDFLAGS) \
+ $(libgstvideotestsrc_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/videotestsrc/Makefile.in b/gst/videotestsrc/Makefile.in
new file mode 100644
index 0000000..feed72a
--- /dev/null
+++ b/gst/videotestsrc/Makefile.in
@@ -0,0 +1,923 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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
+noinst_PROGRAMS = generate_sine_table$(EXEEXT)
+subdir = gst/videotestsrc
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvideotestsrc_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstvideotestsrc_la_OBJECTS = \
+ libgstvideotestsrc_la-gstvideotestsrc.lo \
+ libgstvideotestsrc_la-videotestsrc.lo
+am__objects_1 = libgstvideotestsrc_la-tmp-orc.lo
+nodist_libgstvideotestsrc_la_OBJECTS = $(am__objects_1)
+libgstvideotestsrc_la_OBJECTS = $(am_libgstvideotestsrc_la_OBJECTS) \
+ $(nodist_libgstvideotestsrc_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvideotestsrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) \
+ $(libgstvideotestsrc_la_LDFLAGS) $(LDFLAGS) -o $@
+PROGRAMS = $(noinst_PROGRAMS)
+am_generate_sine_table_OBJECTS = \
+ generate_sine_table-generate_sine_table.$(OBJEXT)
+generate_sine_table_OBJECTS = $(am_generate_sine_table_OBJECTS)
+generate_sine_table_DEPENDENCIES = $(am__DEPENDENCIES_1)
+generate_sine_table_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(generate_sine_table_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvideotestsrc_la_SOURCES) \
+ $(nodist_libgstvideotestsrc_la_SOURCES) \
+ $(generate_sine_table_SOURCES)
+DIST_SOURCES = $(libgstvideotestsrc_la_SOURCES) \
+ $(generate_sine_table_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstvideotestsrc.la
+ORC_SOURCE = gstvideotestsrcorc
+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 $@";
+libgstvideotestsrc_la_SOURCES = \
+ gstvideotestsrc.c \
+ videotestsrc.c
+
+nodist_libgstvideotestsrc_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvideotestsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideotestsrc_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) $(LIBM)
+
+libgstvideotestsrc_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstvideotestsrc.h videotestsrc.h
+generate_sine_table_SOURCES = generate_sine_table.c
+generate_sine_table_CFLAGS = $(GST_CFLAGS)
+generate_sine_table_LDADD = $(LIBM)
+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/videotestsrc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/videotestsrc/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
+libgstvideotestsrc.la: $(libgstvideotestsrc_la_OBJECTS) $(libgstvideotestsrc_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvideotestsrc_la_LINK) -rpath $(plugindir) $(libgstvideotestsrc_la_OBJECTS) $(libgstvideotestsrc_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
+generate_sine_table$(EXEEXT): $(generate_sine_table_OBJECTS) $(generate_sine_table_DEPENDENCIES)
+ @rm -f generate_sine_table$(EXEEXT)
+ $(AM_V_CCLD)$(generate_sine_table_LINK) $(generate_sine_table_OBJECTS) $(generate_sine_table_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_sine_table-generate_sine_table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideotestsrc_la-gstvideotestsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideotestsrc_la-tmp-orc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideotestsrc_la-videotestsrc.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvideotestsrc_la-gstvideotestsrc.lo: gstvideotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -MT libgstvideotestsrc_la-gstvideotestsrc.lo -MD -MP -MF $(DEPDIR)/libgstvideotestsrc_la-gstvideotestsrc.Tpo -c -o libgstvideotestsrc_la-gstvideotestsrc.lo `test -f 'gstvideotestsrc.c' || echo '$(srcdir)/'`gstvideotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideotestsrc_la-gstvideotestsrc.Tpo $(DEPDIR)/libgstvideotestsrc_la-gstvideotestsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideotestsrc.c' object='libgstvideotestsrc_la-gstvideotestsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -c -o libgstvideotestsrc_la-gstvideotestsrc.lo `test -f 'gstvideotestsrc.c' || echo '$(srcdir)/'`gstvideotestsrc.c
+
+libgstvideotestsrc_la-videotestsrc.lo: videotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -MT libgstvideotestsrc_la-videotestsrc.lo -MD -MP -MF $(DEPDIR)/libgstvideotestsrc_la-videotestsrc.Tpo -c -o libgstvideotestsrc_la-videotestsrc.lo `test -f 'videotestsrc.c' || echo '$(srcdir)/'`videotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideotestsrc_la-videotestsrc.Tpo $(DEPDIR)/libgstvideotestsrc_la-videotestsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='videotestsrc.c' object='libgstvideotestsrc_la-videotestsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -c -o libgstvideotestsrc_la-videotestsrc.lo `test -f 'videotestsrc.c' || echo '$(srcdir)/'`videotestsrc.c
+
+libgstvideotestsrc_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -MT libgstvideotestsrc_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideotestsrc_la-tmp-orc.Tpo -c -o libgstvideotestsrc_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideotestsrc_la-tmp-orc.Tpo $(DEPDIR)/libgstvideotestsrc_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstvideotestsrc_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideotestsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideotestsrc_la_CFLAGS) $(CFLAGS) -c -o libgstvideotestsrc_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+
+generate_sine_table-generate_sine_table.o: generate_sine_table.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(generate_sine_table_CFLAGS) $(CFLAGS) -MT generate_sine_table-generate_sine_table.o -MD -MP -MF $(DEPDIR)/generate_sine_table-generate_sine_table.Tpo -c -o generate_sine_table-generate_sine_table.o `test -f 'generate_sine_table.c' || echo '$(srcdir)/'`generate_sine_table.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generate_sine_table-generate_sine_table.Tpo $(DEPDIR)/generate_sine_table-generate_sine_table.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate_sine_table.c' object='generate_sine_table-generate_sine_table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(generate_sine_table_CFLAGS) $(CFLAGS) -c -o generate_sine_table-generate_sine_table.o `test -f 'generate_sine_table.c' || echo '$(srcdir)/'`generate_sine_table.c
+
+generate_sine_table-generate_sine_table.obj: generate_sine_table.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(generate_sine_table_CFLAGS) $(CFLAGS) -MT generate_sine_table-generate_sine_table.obj -MD -MP -MF $(DEPDIR)/generate_sine_table-generate_sine_table.Tpo -c -o generate_sine_table-generate_sine_table.obj `if test -f 'generate_sine_table.c'; then $(CYGPATH_W) 'generate_sine_table.c'; else $(CYGPATH_W) '$(srcdir)/generate_sine_table.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generate_sine_table-generate_sine_table.Tpo $(DEPDIR)/generate_sine_table-generate_sine_table.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate_sine_table.c' object='generate_sine_table-generate_sine_table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(generate_sine_table_CFLAGS) $(CFLAGS) -c -o generate_sine_table-generate_sine_table.obj `if test -f 'generate_sine_table.c'; then $(CYGPATH_W) 'generate_sine_table.c'; else $(CYGPATH_W) '$(srcdir)/generate_sine_table.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
+ $(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) $(PROGRAMS) $(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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-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: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-local clean-noinstPROGRAMS \
+ 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 libgstvideotestsrc -:SHARED libgstvideotestsrc \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvideotestsrc_la_SOURCES) \
+ $(nodist_libgstvideotestsrc_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideotestsrc_la_CFLAGS) \
+ -:LDFLAGS $(libgstvideotestsrc_la_LDFLAGS) \
+ $(libgstvideotestsrc_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/videotestsrc/generate_sine_table.c b/gst/videotestsrc/generate_sine_table.c
new file mode 100644
index 0000000..11d17af
--- /dev/null
+++ b/gst/videotestsrc/generate_sine_table.c
@@ -0,0 +1,43 @@
+
+#include <stdio.h>
+#include <math.h>
+#include <glib.h>
+
+static int
+get_value (int i)
+{
+ int x;
+
+ x = floor (256 * (0.5 + 0.5 * sin (i * 2 * G_PI / 256)));
+ if (x > 255)
+ x = 255;
+ return x;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ int j;
+
+ printf ("static const guint8\n");
+ printf ("sine_table[256] = {\n");
+ for (i = 0; i < 256; i += 8) {
+ printf (" ");
+ for (j = 0; j < 8; j++) {
+ printf ("%3d", get_value (i + j));
+ if (j != 7) {
+ printf (", ");
+ } else {
+ if (i + j != 255) {
+ printf (",\n");
+ } else {
+ printf ("\n");
+ }
+ }
+ }
+ }
+ printf ("};\n");
+
+ return 0;
+}
diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c
new file mode 100644
index 0000000..022eb46
--- /dev/null
+++ b/gst/videotestsrc/gstvideotestsrc.c
@@ -0,0 +1,883 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2002> David A. Schleef <ds@schleef.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.
+ */
+
+/**
+ * SECTION:element-videotestsrc
+ *
+ * The videotestsrc element is used to produce test video data in a wide variaty
+ * of formats. The video test data produced can be controlled with the "pattern"
+ * property.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v videotestsrc pattern=snow ! ximagesink
+ * ]| Shows random noise in an X window.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "gstvideotestsrc.h"
+#include "gstvideotestsrcorc.h"
+#include "videotestsrc.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+GST_DEBUG_CATEGORY_STATIC (video_test_src_debug);
+#define GST_CAT_DEFAULT video_test_src_debug
+
+#define DEFAULT_PATTERN GST_VIDEO_TEST_SRC_SMPTE
+#define DEFAULT_TIMESTAMP_OFFSET 0
+#define DEFAULT_IS_LIVE FALSE
+#define DEFAULT_COLOR_SPEC GST_VIDEO_TEST_SRC_BT601
+#define DEFAULT_FOREGROUND_COLOR 0xffffffff
+#define DEFAULT_BACKGROUND_COLOR 0xff000000
+#define DEFAULT_HORIZONTAL_SPEED 0
+
+enum
+{
+ PROP_0,
+ PROP_PATTERN,
+ PROP_TIMESTAMP_OFFSET,
+ PROP_IS_LIVE,
+ PROP_K0,
+ PROP_KX,
+ PROP_KY,
+ PROP_KT,
+ PROP_KXT,
+ PROP_KYT,
+ PROP_KXY,
+ PROP_KX2,
+ PROP_KY2,
+ PROP_KT2,
+ PROP_XOFFSET,
+ PROP_YOFFSET,
+ PROP_FOREGROUND_COLOR,
+ PROP_BACKGROUND_COLOR,
+ PROP_HORIZONTAL_SPEED,
+ PROP_LAST
+};
+
+
+#define gst_video_test_src_parent_class parent_class
+G_DEFINE_TYPE (GstVideoTestSrc, gst_video_test_src, GST_TYPE_PUSH_SRC);
+
+static void gst_video_test_src_set_pattern (GstVideoTestSrc * videotestsrc,
+ int pattern_type);
+static void gst_video_test_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_video_test_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstCaps *gst_video_test_src_getcaps (GstBaseSrc * bsrc,
+ GstCaps * filter);
+static gboolean gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
+static void gst_video_test_src_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
+
+static gboolean gst_video_test_src_is_seekable (GstBaseSrc * psrc);
+static gboolean gst_video_test_src_do_seek (GstBaseSrc * bsrc,
+ GstSegment * segment);
+static gboolean gst_video_test_src_query (GstBaseSrc * bsrc, GstQuery * query);
+
+static void gst_video_test_src_get_times (GstBaseSrc * basesrc,
+ GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
+static gboolean gst_video_test_src_decide_allocation (GstBaseSrc * bsrc,
+ GstQuery * query);
+static GstFlowReturn gst_video_test_src_fill (GstPushSrc * psrc,
+ GstBuffer * buffer);
+static gboolean gst_video_test_src_start (GstBaseSrc * basesrc);
+static gboolean gst_video_test_src_stop (GstBaseSrc * basesrc);
+
+#define GST_TYPE_VIDEO_TEST_SRC_PATTERN (gst_video_test_src_pattern_get_type ())
+static GType
+gst_video_test_src_pattern_get_type (void)
+{
+ static GType video_test_src_pattern_type = 0;
+ static const GEnumValue pattern_types[] = {
+ {GST_VIDEO_TEST_SRC_SMPTE, "SMPTE 100% color bars", "smpte"},
+ {GST_VIDEO_TEST_SRC_SNOW, "Random (television snow)", "snow"},
+ {GST_VIDEO_TEST_SRC_BLACK, "100% Black", "black"},
+ {GST_VIDEO_TEST_SRC_WHITE, "100% White", "white"},
+ {GST_VIDEO_TEST_SRC_RED, "Red", "red"},
+ {GST_VIDEO_TEST_SRC_GREEN, "Green", "green"},
+ {GST_VIDEO_TEST_SRC_BLUE, "Blue", "blue"},
+ {GST_VIDEO_TEST_SRC_CHECKERS1, "Checkers 1px", "checkers-1"},
+ {GST_VIDEO_TEST_SRC_CHECKERS2, "Checkers 2px", "checkers-2"},
+ {GST_VIDEO_TEST_SRC_CHECKERS4, "Checkers 4px", "checkers-4"},
+ {GST_VIDEO_TEST_SRC_CHECKERS8, "Checkers 8px", "checkers-8"},
+ {GST_VIDEO_TEST_SRC_CIRCULAR, "Circular", "circular"},
+ {GST_VIDEO_TEST_SRC_BLINK, "Blink", "blink"},
+ {GST_VIDEO_TEST_SRC_SMPTE75, "SMPTE 75% color bars", "smpte75"},
+ {GST_VIDEO_TEST_SRC_ZONE_PLATE, "Zone plate", "zone-plate"},
+ {GST_VIDEO_TEST_SRC_GAMUT, "Gamut checkers", "gamut"},
+ {GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE, "Chroma zone plate",
+ "chroma-zone-plate"},
+ {GST_VIDEO_TEST_SRC_SOLID, "Solid color", "solid-color"},
+ {GST_VIDEO_TEST_SRC_BALL, "Moving ball", "ball"},
+ {GST_VIDEO_TEST_SRC_SMPTE100, "SMPTE 100% color bars", "smpte100"},
+ {GST_VIDEO_TEST_SRC_BAR, "Bar", "bar"},
+ {0, NULL, NULL}
+ };
+
+ if (!video_test_src_pattern_type) {
+ video_test_src_pattern_type =
+ g_enum_register_static ("GstVideoTestSrcPattern", pattern_types);
+ }
+ return video_test_src_pattern_type;
+}
+
+static void
+gst_video_test_src_class_init (GstVideoTestSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+ GstPushSrcClass *gstpushsrc_class;
+ GstCaps *templ_caps;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesrc_class = (GstBaseSrcClass *) klass;
+ gstpushsrc_class = (GstPushSrcClass *) klass;
+
+ gobject_class->set_property = gst_video_test_src_set_property;
+ gobject_class->get_property = gst_video_test_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_PATTERN,
+ g_param_spec_enum ("pattern", "Pattern",
+ "Type of test pattern to generate", GST_TYPE_VIDEO_TEST_SRC_PATTERN,
+ DEFAULT_PATTERN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TIMESTAMP_OFFSET,
+ g_param_spec_int64 ("timestamp-offset", "Timestamp offset",
+ "An offset added to timestamps set on buffers (in ns)", G_MININT64,
+ G_MAXINT64, 0, 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",
+ "Whether to act as a live source", DEFAULT_IS_LIVE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_K0,
+ g_param_spec_int ("k0", "Zoneplate zero order phase",
+ "Zoneplate zero order phase, for generating plain fields or phase offsets",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KX,
+ g_param_spec_int ("kx", "Zoneplate 1st order x phase",
+ "Zoneplate 1st order x phase, for generating constant horizontal frequencies",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KY,
+ g_param_spec_int ("ky", "Zoneplate 1st order y phase",
+ "Zoneplate 1st order y phase, for generating contant vertical frequencies",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KT,
+ g_param_spec_int ("kt", "Zoneplate 1st order t phase",
+ "Zoneplate 1st order t phase, for generating phase rotation as a function of time",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KXT,
+ g_param_spec_int ("kxt", "Zoneplate x*t product phase",
+ "Zoneplate x*t product phase, normalised to kxy/256 cycles per vertical pixel at width/2 from origin",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KYT,
+ g_param_spec_int ("kyt", "Zoneplate y*t product phase",
+ "Zoneplate y*t product phase", G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KXY,
+ g_param_spec_int ("kxy", "Zoneplate x*y product phase",
+ "Zoneplate x*y product phase", G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KX2,
+ g_param_spec_int ("kx2", "Zoneplate 2nd order x phase",
+ "Zoneplate 2nd order x phase, normalised to kx2/256 cycles per horizontal pixel at width/2 from origin",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KY2,
+ g_param_spec_int ("ky2", "Zoneplate 2nd order y phase",
+ "Zoneplate 2nd order y phase, normailsed to ky2/256 cycles per vertical pixel at height/2 from origin",
+ G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_KT2,
+ g_param_spec_int ("kt2", "Zoneplate 2nd order t phase",
+ "Zoneplate 2nd order t phase, t*t/256 cycles per picture", G_MININT32,
+ G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_XOFFSET,
+ g_param_spec_int ("xoffset", "Zoneplate 2nd order products x offset",
+ "Zoneplate 2nd order products x offset", G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_YOFFSET,
+ g_param_spec_int ("yoffset", "Zoneplate 2nd order products y offset",
+ "Zoneplate 2nd order products y offset", G_MININT32, G_MAXINT32, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstVideoTestSrc:foreground-color
+ *
+ * Color to use for solid-color pattern and foreground color of other
+ * patterns. Default is white (0xffffffff).
+ *
+ * Since: 0.10.31
+ **/
+ g_object_class_install_property (gobject_class, PROP_FOREGROUND_COLOR,
+ g_param_spec_uint ("foreground-color", "Foreground Color",
+ "Foreground color to use (big-endian ARGB)", 0, G_MAXUINT32,
+ DEFAULT_FOREGROUND_COLOR,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstVideoTestSrc:background-color
+ *
+ * Color to use for background color of some patterns. Default is
+ * black (0xff000000).
+ *
+ * Since: 0.10.31
+ **/
+ g_object_class_install_property (gobject_class, PROP_BACKGROUND_COLOR,
+ g_param_spec_uint ("background-color", "Background Color",
+ "Background color to use (big-endian ARGB)", 0, G_MAXUINT32,
+ DEFAULT_BACKGROUND_COLOR,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_HORIZONTAL_SPEED,
+ g_param_spec_int ("horizontal-speed", "Horizontal Speed",
+ "Scroll image number of pixels per frame (positive is scroll to the left)",
+ G_MININT32, G_MAXINT32, DEFAULT_HORIZONTAL_SPEED,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Video test source", "Source/Video",
+ "Creates a test video stream", "David A. Schleef <ds@schleef.org>");
+
+ templ_caps = gst_video_test_src_getcaps (NULL, NULL);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, templ_caps));
+ gst_caps_unref (templ_caps);
+
+ gstbasesrc_class->get_caps = gst_video_test_src_getcaps;
+ gstbasesrc_class->set_caps = gst_video_test_src_setcaps;
+ gstbasesrc_class->fixate = gst_video_test_src_src_fixate;
+ gstbasesrc_class->is_seekable = gst_video_test_src_is_seekable;
+ gstbasesrc_class->do_seek = gst_video_test_src_do_seek;
+ gstbasesrc_class->query = gst_video_test_src_query;
+ gstbasesrc_class->get_times = gst_video_test_src_get_times;
+ gstbasesrc_class->start = gst_video_test_src_start;
+ gstbasesrc_class->stop = gst_video_test_src_stop;
+ gstbasesrc_class->decide_allocation = gst_video_test_src_decide_allocation;
+
+ gstpushsrc_class->fill = gst_video_test_src_fill;
+}
+
+static void
+gst_video_test_src_init (GstVideoTestSrc * src)
+{
+ gst_video_test_src_set_pattern (src, DEFAULT_PATTERN);
+
+ src->timestamp_offset = DEFAULT_TIMESTAMP_OFFSET;
+ src->foreground_color = DEFAULT_FOREGROUND_COLOR;
+ src->background_color = DEFAULT_BACKGROUND_COLOR;
+ src->horizontal_speed = DEFAULT_HORIZONTAL_SPEED;
+
+ /* we operate in time */
+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
+ gst_base_src_set_live (GST_BASE_SRC (src), DEFAULT_IS_LIVE);
+}
+
+static void
+gst_video_test_src_src_fixate (GstBaseSrc * bsrc, 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);
+ if (gst_structure_has_field (structure, "pixel-aspect-ratio"))
+ gst_structure_fixate_field_nearest_fraction (structure,
+ "pixel-aspect-ratio", 1, 1);
+ if (gst_structure_has_field (structure, "colorimetry"))
+ gst_structure_fixate_field_string (structure, "colorimetry", "bt601");
+ if (gst_structure_has_field (structure, "chroma-site"))
+ gst_structure_fixate_field_string (structure, "chroma-site", "mpeg2");
+
+ if (gst_structure_has_field (structure, "interlaced"))
+ gst_structure_fixate_field_boolean (structure, "interlaced", FALSE);
+
+ GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps);
+}
+
+static void
+gst_video_test_src_set_pattern (GstVideoTestSrc * videotestsrc,
+ int pattern_type)
+{
+ videotestsrc->pattern_type = pattern_type;
+
+ GST_DEBUG_OBJECT (videotestsrc, "setting pattern to %d", pattern_type);
+
+ switch (pattern_type) {
+ case GST_VIDEO_TEST_SRC_SMPTE:
+ videotestsrc->make_image = gst_video_test_src_smpte;
+ break;
+ case GST_VIDEO_TEST_SRC_SNOW:
+ videotestsrc->make_image = gst_video_test_src_snow;
+ break;
+ case GST_VIDEO_TEST_SRC_BLACK:
+ videotestsrc->make_image = gst_video_test_src_black;
+ break;
+ case GST_VIDEO_TEST_SRC_WHITE:
+ videotestsrc->make_image = gst_video_test_src_white;
+ break;
+ case GST_VIDEO_TEST_SRC_RED:
+ videotestsrc->make_image = gst_video_test_src_red;
+ break;
+ case GST_VIDEO_TEST_SRC_GREEN:
+ videotestsrc->make_image = gst_video_test_src_green;
+ break;
+ case GST_VIDEO_TEST_SRC_BLUE:
+ videotestsrc->make_image = gst_video_test_src_blue;
+ break;
+ case GST_VIDEO_TEST_SRC_CHECKERS1:
+ videotestsrc->make_image = gst_video_test_src_checkers1;
+ break;
+ case GST_VIDEO_TEST_SRC_CHECKERS2:
+ videotestsrc->make_image = gst_video_test_src_checkers2;
+ break;
+ case GST_VIDEO_TEST_SRC_CHECKERS4:
+ videotestsrc->make_image = gst_video_test_src_checkers4;
+ break;
+ case GST_VIDEO_TEST_SRC_CHECKERS8:
+ videotestsrc->make_image = gst_video_test_src_checkers8;
+ break;
+ case GST_VIDEO_TEST_SRC_CIRCULAR:
+ videotestsrc->make_image = gst_video_test_src_circular;
+ break;
+ case GST_VIDEO_TEST_SRC_BLINK:
+ videotestsrc->make_image = gst_video_test_src_blink;
+ break;
+ case GST_VIDEO_TEST_SRC_SMPTE75:
+ videotestsrc->make_image = gst_video_test_src_smpte75;
+ break;
+ case GST_VIDEO_TEST_SRC_ZONE_PLATE:
+ videotestsrc->make_image = gst_video_test_src_zoneplate;
+ break;
+ case GST_VIDEO_TEST_SRC_GAMUT:
+ videotestsrc->make_image = gst_video_test_src_gamut;
+ break;
+ case GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE:
+ videotestsrc->make_image = gst_video_test_src_chromazoneplate;
+ break;
+ case GST_VIDEO_TEST_SRC_SOLID:
+ videotestsrc->make_image = gst_video_test_src_solid;
+ break;
+ case GST_VIDEO_TEST_SRC_BALL:
+ videotestsrc->make_image = gst_video_test_src_ball;
+ break;
+ case GST_VIDEO_TEST_SRC_SMPTE100:
+ videotestsrc->make_image = gst_video_test_src_smpte100;
+ break;
+ case GST_VIDEO_TEST_SRC_BAR:
+ videotestsrc->make_image = gst_video_test_src_bar;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static void
+gst_video_test_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstVideoTestSrc *src = GST_VIDEO_TEST_SRC (object);
+
+ switch (prop_id) {
+ case PROP_PATTERN:
+ gst_video_test_src_set_pattern (src, g_value_get_enum (value));
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ src->timestamp_offset = g_value_get_int64 (value);
+ break;
+ case PROP_IS_LIVE:
+ gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value));
+ break;
+ case PROP_K0:
+ src->k0 = g_value_get_int (value);
+ break;
+ case PROP_KX:
+ src->kx = g_value_get_int (value);
+ break;
+ case PROP_KY:
+ src->ky = g_value_get_int (value);
+ break;
+ case PROP_KT:
+ src->kt = g_value_get_int (value);
+ break;
+ case PROP_KXT:
+ src->kxt = g_value_get_int (value);
+ break;
+ case PROP_KYT:
+ src->kyt = g_value_get_int (value);
+ break;
+ case PROP_KXY:
+ src->kxy = g_value_get_int (value);
+ break;
+ case PROP_KX2:
+ src->kx2 = g_value_get_int (value);
+ break;
+ case PROP_KY2:
+ src->ky2 = g_value_get_int (value);
+ break;
+ case PROP_KT2:
+ src->kt2 = g_value_get_int (value);
+ break;
+ case PROP_XOFFSET:
+ src->xoffset = g_value_get_int (value);
+ break;
+ case PROP_YOFFSET:
+ src->yoffset = g_value_get_int (value);
+ break;
+ case PROP_FOREGROUND_COLOR:
+ src->foreground_color = g_value_get_uint (value);
+ break;
+ case PROP_BACKGROUND_COLOR:
+ src->background_color = g_value_get_uint (value);
+ break;
+ case PROP_HORIZONTAL_SPEED:
+ src->horizontal_speed = g_value_get_int (value);
+ default:
+ break;
+ }
+}
+
+static void
+gst_video_test_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstVideoTestSrc *src = GST_VIDEO_TEST_SRC (object);
+
+ switch (prop_id) {
+ case PROP_PATTERN:
+ g_value_set_enum (value, src->pattern_type);
+ break;
+ case PROP_TIMESTAMP_OFFSET:
+ g_value_set_int64 (value, src->timestamp_offset);
+ break;
+ case PROP_IS_LIVE:
+ g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (src)));
+ break;
+ case PROP_K0:
+ g_value_set_int (value, src->k0);
+ break;
+ case PROP_KX:
+ g_value_set_int (value, src->kx);
+ break;
+ case PROP_KY:
+ g_value_set_int (value, src->ky);
+ break;
+ case PROP_KT:
+ g_value_set_int (value, src->kt);
+ break;
+ case PROP_KXT:
+ g_value_set_int (value, src->kxt);
+ break;
+ case PROP_KYT:
+ g_value_set_int (value, src->kyt);
+ break;
+ case PROP_KXY:
+ g_value_set_int (value, src->kxy);
+ break;
+ case PROP_KX2:
+ g_value_set_int (value, src->kx2);
+ break;
+ case PROP_KY2:
+ g_value_set_int (value, src->ky2);
+ break;
+ case PROP_KT2:
+ g_value_set_int (value, src->kt2);
+ break;
+ case PROP_XOFFSET:
+ g_value_set_int (value, src->xoffset);
+ break;
+ case PROP_YOFFSET:
+ g_value_set_int (value, src->yoffset);
+ break;
+ case PROP_FOREGROUND_COLOR:
+ g_value_set_uint (value, src->foreground_color);
+ break;
+ case PROP_BACKGROUND_COLOR:
+ g_value_set_uint (value, src->background_color);
+ break;
+ case PROP_HORIZONTAL_SPEED:
+ g_value_set_int (value, src->horizontal_speed);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* threadsafe because this gets called as the plugin is loaded */
+static GstCaps *
+gst_video_test_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
+{
+ static GstCaps *capslist = NULL;
+
+ if (!capslist) {
+ GstCaps *caps;
+ GstStructure *structure;
+ int i;
+
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < n_formats; i++) {
+ structure = paint_get_structure (format_list + i);
+ gst_structure_set (structure,
+ "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);
+ gst_caps_append_structure (caps, structure);
+ }
+
+ capslist = caps;
+ }
+
+ if (filter)
+ return gst_caps_intersect_full (filter, capslist, GST_CAPS_INTERSECT_FIRST);
+ else
+ return gst_caps_ref (capslist);
+}
+
+static gboolean
+gst_video_test_src_parse_caps (const GstCaps * caps,
+ gint * width, gint * height, gint * fps_n, gint * fps_d,
+ GstVideoColorimetry * colorimetry)
+{
+ const GstStructure *structure;
+ GstPadLinkReturn ret;
+ const GValue *framerate;
+ const gchar *csp;
+
+ GST_DEBUG ("parsing caps");
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ ret = gst_structure_get_int (structure, "width", width);
+ ret &= gst_structure_get_int (structure, "height", height);
+ framerate = gst_structure_get_value (structure, "framerate");
+
+ if (framerate) {
+ *fps_n = gst_value_get_fraction_numerator (framerate);
+ *fps_d = gst_value_get_fraction_denominator (framerate);
+ } else
+ goto no_framerate;
+
+ if ((csp = gst_structure_get_string (structure, "colorimetry")))
+ gst_video_colorimetry_from_string (colorimetry, csp);
+
+ return ret;
+
+ /* ERRORS */
+no_framerate:
+ {
+ GST_DEBUG ("videotestsrc no framerate given");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+{
+ GstVideoTestSrc *videotestsrc;
+ GstBufferPool *pool;
+ guint size, min, max, prefix, alignment;
+
+ videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
+
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+ /* adjust size */
+ size = MAX (size, videotestsrc->info.size);
+
+ if (pool) {
+ GstStructure *config;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_META_VIDEO);
+ gst_buffer_pool_set_config (pool, config);
+ }
+ gst_query_set_allocation_params (query, size, min, max, prefix,
+ alignment, pool);
+
+ return TRUE;
+}
+
+static gboolean
+gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
+{
+ struct format_list_struct *format;
+ const GstStructure *structure;
+ GstVideoTestSrc *videotestsrc;
+ GstVideoInfo info;
+
+ videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_has_name (structure, "video/x-raw")) {
+ /* we can use the parsing code */
+ if (!gst_video_info_from_caps (&info, caps))
+ goto parse_failed;
+
+ } else if (gst_structure_has_name (structure, "video/x-raw-bayer")) {
+ if (!gst_video_test_src_parse_caps (caps, &info.width, &info.height,
+ &info.fps_n, &info.fps_d, &info.colorimetry))
+ goto parse_failed;
+
+ info.size =
+ gst_video_test_src_get_size (videotestsrc, info.width, info.height);
+ }
+
+ if (!(format = paintinfo_find_by_structure (structure)))
+ goto unknown_format;
+
+ /* looks ok here */
+ videotestsrc->format = format;
+ videotestsrc->info = info;
+
+ GST_DEBUG_OBJECT (videotestsrc, "size %dx%d, %d/%d fps",
+ info.width, info.height, info.fps_n, info.fps_d);
+
+ g_free (videotestsrc->tmpline);
+ g_free (videotestsrc->tmpline2);
+ g_free (videotestsrc->tmpline_u8);
+ videotestsrc->tmpline_u8 = g_malloc (info.width + 8);
+ videotestsrc->tmpline = g_malloc ((info.width + 8) * 4);
+ videotestsrc->tmpline2 = g_malloc ((info.width + 8) * 4);
+
+ return TRUE;
+
+ /* ERRORS */
+parse_failed:
+ {
+ GST_DEBUG_OBJECT (bsrc, "failed to parse caps");
+ return FALSE;
+ }
+unknown_format:
+ {
+ GST_DEBUG ("videotestsrc format not found");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_video_test_src_query (GstBaseSrc * bsrc, GstQuery * query)
+{
+ gboolean res;
+ GstVideoTestSrc *src;
+
+ src = GST_VIDEO_TEST_SRC (bsrc);
+
+ 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_video_info_convert (&src->info, src_fmt, src_val, dest_fmt,
+ &dest_val);
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ default:
+ res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
+ break;
+ }
+ return res;
+}
+
+static void
+gst_video_test_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ /* for live sources, sync on the timestamp of the buffer */
+ if (gst_base_src_is_live (basesrc)) {
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ /* get duration to calculate end time */
+ GstClockTime duration = GST_BUFFER_DURATION (buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ *end = timestamp + duration;
+ }
+ *start = timestamp;
+ }
+ } else {
+ *start = -1;
+ *end = -1;
+ }
+}
+
+static gboolean
+gst_video_test_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
+{
+ GstClockTime position;
+ GstVideoTestSrc *src;
+
+ src = GST_VIDEO_TEST_SRC (bsrc);
+
+ segment->time = segment->start;
+ position = segment->position;
+
+ /* now move to the position indicated */
+ if (src->info.fps_n) {
+ src->n_frames = gst_util_uint64_scale (position,
+ src->info.fps_n, src->info.fps_d * GST_SECOND);
+ } else {
+ src->n_frames = 0;
+ }
+ if (src->info.fps_n) {
+ src->running_time = gst_util_uint64_scale (src->n_frames,
+ src->info.fps_d * GST_SECOND, src->info.fps_n);
+ } else {
+ /* FIXME : Not sure what to set here */
+ src->running_time = 0;
+ }
+
+ g_assert (src->running_time <= position);
+
+ return TRUE;
+}
+
+static gboolean
+gst_video_test_src_is_seekable (GstBaseSrc * psrc)
+{
+ /* we're seekable... */
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_video_test_src_fill (GstPushSrc * psrc, GstBuffer * buffer)
+{
+ GstVideoTestSrc *src;
+ GstClockTime next_time;
+ GstVideoFrame frame;
+
+ src = GST_VIDEO_TEST_SRC (psrc);
+
+ if (G_UNLIKELY (src->format == NULL))
+ goto not_negotiated;
+
+ /* 0 framerate and we are at the second frame, eos */
+ if (G_UNLIKELY (src->info.fps_n == 0 && src->n_frames == 1))
+ goto eos;
+
+ GST_LOG_OBJECT (src,
+ "creating buffer from pool for frame %d", (gint) src->n_frames);
+
+ if (!gst_video_frame_map (&frame, &src->info, buffer, GST_MAP_WRITE))
+ goto invalid_frame;
+
+ src->make_image (src, &frame);
+
+ gst_video_frame_unmap (&frame);
+
+ GST_BUFFER_TIMESTAMP (buffer) = src->timestamp_offset + src->running_time;
+ GST_BUFFER_OFFSET (buffer) = src->n_frames;
+ src->n_frames++;
+ GST_BUFFER_OFFSET_END (buffer) = src->n_frames;
+ if (src->info.fps_n) {
+ next_time = gst_util_uint64_scale_int (src->n_frames * GST_SECOND,
+ src->info.fps_d, src->info.fps_n);
+ GST_BUFFER_DURATION (buffer) = next_time - src->running_time;
+ } else {
+ next_time = src->timestamp_offset;
+ /* NONE means forever */
+ GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+ }
+
+ src->running_time = next_time;
+
+ return GST_FLOW_OK;
+
+not_negotiated:
+ {
+ GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL),
+ ("format wasn't negotiated before get function"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (src, "eos: 0 framerate, frame %d", (gint) src->n_frames);
+ return GST_FLOW_UNEXPECTED;
+ }
+invalid_frame:
+ {
+ GST_DEBUG_OBJECT (src, "invalid frame");
+ return GST_FLOW_OK;
+ }
+}
+
+static gboolean
+gst_video_test_src_start (GstBaseSrc * basesrc)
+{
+ GstVideoTestSrc *src = GST_VIDEO_TEST_SRC (basesrc);
+
+ src->running_time = 0;
+ src->n_frames = 0;
+
+ return TRUE;
+}
+
+static gboolean
+gst_video_test_src_stop (GstBaseSrc * basesrc)
+{
+ GstVideoTestSrc *src = GST_VIDEO_TEST_SRC (basesrc);
+
+ g_free (src->tmpline);
+ src->tmpline = NULL;
+ g_free (src->tmpline2);
+ src->tmpline2 = NULL;
+ g_free (src->tmpline_u8);
+ src->tmpline_u8 = NULL;
+
+ return TRUE;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_videotestsrc_orc_init ();
+
+ GST_DEBUG_CATEGORY_INIT (video_test_src_debug, "videotestsrc", 0,
+ "Video Test Source");
+
+ return gst_element_register (plugin, "videotestsrc", GST_RANK_NONE,
+ GST_TYPE_VIDEO_TEST_SRC);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "videotestsrc",
+ "Creates a test video stream",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h
new file mode 100644
index 0000000..30d4904
--- /dev/null
+++ b/gst/videotestsrc/gstvideotestsrc.h
@@ -0,0 +1,174 @@
+/* GStreamer
+ * Copyright (C) <2002> David A. Schleef <ds@schleef.org>
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VIDEO_TEST_SRC_H__
+#define __GST_VIDEO_TEST_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VIDEO_TEST_SRC \
+ (gst_video_test_src_get_type())
+#define GST_VIDEO_TEST_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_TEST_SRC,GstVideoTestSrc))
+#define GST_VIDEO_TEST_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_TEST_SRC,GstVideoTestSrcClass))
+#define GST_IS_VIDEO_TEST_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_TEST_SRC))
+#define GST_IS_VIDEO_TEST_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_TEST_SRC))
+
+/**
+ * GstVideoTestSrcPattern:
+ * @GST_VIDEO_TEST_SRC_SMPTE: A standard SMPTE test pattern
+ * @GST_VIDEO_TEST_SRC_SNOW: Random noise
+ * @GST_VIDEO_TEST_SRC_BLACK: A black image
+ * @GST_VIDEO_TEST_SRC_WHITE: A white image
+ * @GST_VIDEO_TEST_SRC_RED: A red image
+ * @GST_VIDEO_TEST_SRC_GREEN: A green image
+ * @GST_VIDEO_TEST_SRC_BLUE: A blue image
+ * @GST_VIDEO_TEST_SRC_CHECKERS1: Checkers pattern (1px)
+ * @GST_VIDEO_TEST_SRC_CHECKERS2: Checkers pattern (2px)
+ * @GST_VIDEO_TEST_SRC_CHECKERS4: Checkers pattern (4px)
+ * @GST_VIDEO_TEST_SRC_CHECKERS8: Checkers pattern (8px)
+ * @GST_VIDEO_TEST_SRC_CIRCULAR: Circular pattern
+ * @GST_VIDEO_TEST_SRC_BLINK: Alternate between black and white
+ * @GST_VIDEO_TEST_SRC_SMPTE75: SMPTE test pattern (75% color bars)
+ * @GST_VIDEO_TEST_SRC_ZONE_PLATE: Zone plate
+ * @GST_VIDEO_TEST_SRC_GAMUT: Gamut checking pattern
+ * @GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE: Chroma zone plate
+ * @GST_VIDEO_TEST_SRC_BALL: Moving ball
+ * @GST_VIDEO_TEST_SRC_SMPTE100: SMPTE test pattern (100% color bars)
+ * @GST_VIDEO_TEST_SRC_BAR: Bar with foreground color
+ *
+ * The test pattern to produce.
+ *
+ * The Gamut pattern creates a checkerboard pattern of colors at the
+ * edge of the YCbCr gamut and nearby colors that are out of gamut.
+ * The pattern is divided into 4 regions: black, white, red, and blue.
+ * After conversion to RGB, the out-of-gamut colors should be converted
+ * to the same value as their in-gamut neighbors. If the checkerboard
+ * pattern is still visible after conversion, this indicates a faulty
+ * conversion. Image manipulation, such as adjusting contrast or
+ * brightness, can also cause the pattern to be visible.
+ *
+ * The Zone Plate pattern is based on BBC R&D Report 1978/23, and can
+ * be used to test spatial frequency response of a system. This
+ * pattern generator is controlled by the xoffset and yoffset parameters
+ * and also by all the parameters starting with 'k'. The default
+ * parameters produce a grey pattern. Try 'videotestsrc
+ * pattern=zone-plate kx2=20 ky2=20 kt=1' to produce something
+ * interesting.
+ */
+typedef enum {
+ GST_VIDEO_TEST_SRC_SMPTE,
+ GST_VIDEO_TEST_SRC_SNOW,
+ GST_VIDEO_TEST_SRC_BLACK,
+ GST_VIDEO_TEST_SRC_WHITE,
+ GST_VIDEO_TEST_SRC_RED,
+ GST_VIDEO_TEST_SRC_GREEN,
+ GST_VIDEO_TEST_SRC_BLUE,
+ GST_VIDEO_TEST_SRC_CHECKERS1,
+ GST_VIDEO_TEST_SRC_CHECKERS2,
+ GST_VIDEO_TEST_SRC_CHECKERS4,
+ GST_VIDEO_TEST_SRC_CHECKERS8,
+ GST_VIDEO_TEST_SRC_CIRCULAR,
+ GST_VIDEO_TEST_SRC_BLINK,
+ GST_VIDEO_TEST_SRC_SMPTE75,
+ GST_VIDEO_TEST_SRC_ZONE_PLATE,
+ GST_VIDEO_TEST_SRC_GAMUT,
+ GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE,
+ GST_VIDEO_TEST_SRC_SOLID,
+ GST_VIDEO_TEST_SRC_BALL,
+ GST_VIDEO_TEST_SRC_SMPTE100,
+ GST_VIDEO_TEST_SRC_BAR
+} GstVideoTestSrcPattern;
+
+typedef struct _GstVideoTestSrc GstVideoTestSrc;
+typedef struct _GstVideoTestSrcClass GstVideoTestSrcClass;
+
+/**
+ * GstVideoTestSrc:
+ *
+ * Opaque data structure.
+ */
+struct _GstVideoTestSrc {
+ GstPushSrc element;
+
+ /*< private >*/
+
+ /* type of output */
+ GstVideoTestSrcPattern pattern_type;
+
+ /* video state */
+ GstVideoInfo info;
+
+ char *format_name;
+ struct format_list_struct *format;
+
+ /* private */
+ gint64 timestamp_offset; /* base offset */
+ GstClockTime running_time; /* total running time */
+ gint64 n_frames; /* total frames sent */
+
+ /* zoneplate */
+ gint k0;
+ gint kx;
+ gint ky;
+ gint kt;
+ gint kxt;
+ gint kyt;
+ gint kxy;
+ gint kx2;
+ gint ky2;
+ gint kt2;
+ gint xoffset;
+ gint yoffset;
+
+ /* solid color */
+ guint foreground_color;
+ guint background_color;
+
+ /* moving color bars */
+ gint horizontal_offset;
+ gint horizontal_speed;
+
+ void (*make_image) (GstVideoTestSrc *v, GstVideoFrame *frame);
+
+ /* temporary AYUV/ARGB scanline */
+ guint8 *tmpline_u8;
+ guint8 *tmpline;
+ guint8 *tmpline2;
+};
+
+struct _GstVideoTestSrcClass {
+ GstPushSrcClass parent_class;
+};
+
+GType gst_video_test_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_VIDEO_TEST_SRC_H__ */
diff --git a/gst/videotestsrc/gstvideotestsrcorc-dist.c b/gst/videotestsrc/gstvideotestsrcorc-dist.c
new file mode 100644
index 0000000..2f6c588
--- /dev/null
+++ b/gst/videotestsrc/gstvideotestsrcorc-dist.c
@@ -0,0 +1,482 @@
+
+/* autogenerated from gstvideotestsrcorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void gst_orc_splat_u8 (guint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_s16 (gint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_u16 (guint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_u32 (guint8 * ORC_RESTRICT d1, int p1, int n);
+
+void gst_videotestsrc_orc_init (void);
+
+
+/* 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 */
+
+
+
+/* gst_orc_splat_u8 */
+#ifdef DISABLE_ORC
+void
+gst_orc_splat_u8 (guint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) d1;
+
+ /* 0: loadpb */
+ var32 = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_gst_orc_splat_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var32;
+ orc_int8 var33;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+
+ /* 0: loadpb */
+ var32 = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyb */
+ var33 = var32;
+ /* 2: storeb */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_orc_splat_u8;
+void
+gst_orc_splat_u8 (guint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_orc_splat_u8;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_orc_splat_s16 */
+#ifdef DISABLE_ORC
+void
+gst_orc_splat_s16 (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) d1;
+
+ /* 0: loadpw */
+ var32.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_gst_orc_splat_s16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+
+ /* 0: loadpw */
+ var32.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_orc_splat_s16;
+void
+gst_orc_splat_s16 (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_orc_splat_s16;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_orc_splat_u16 */
+#ifdef DISABLE_ORC
+void
+gst_orc_splat_u16 (guint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) d1;
+
+ /* 0: loadpw */
+ var32.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_gst_orc_splat_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var32;
+ orc_union16 var33;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+
+ /* 0: loadpw */
+ var32.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyw */
+ var33.i = var32.i;
+ /* 2: storew */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_orc_splat_u16;
+void
+gst_orc_splat_u16 (guint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_orc_splat_u16;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+/* gst_orc_splat_u32 */
+#ifdef DISABLE_ORC
+void
+gst_orc_splat_u32 (guint8 * 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_gst_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;
+ }
+
+}
+
+static OrcProgram *_orc_program_gst_orc_splat_u32;
+void
+gst_orc_splat_u32 (guint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_gst_orc_splat_u32;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+void
+gst_videotestsrc_orc_init (void)
+{
+#ifndef DISABLE_ORC
+ {
+ /* gst_orc_splat_u8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_orc_splat_u8");
+ orc_program_set_backup_function (p, _backup_gst_orc_splat_u8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_parameter (p, 1, "p1");
+
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_orc_splat_u8 = p;
+ }
+ {
+ /* gst_orc_splat_s16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_orc_splat_s16");
+ orc_program_set_backup_function (p, _backup_gst_orc_splat_s16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_parameter (p, 2, "p1");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_orc_splat_s16 = p;
+ }
+ {
+ /* gst_orc_splat_u16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_orc_splat_u16");
+ orc_program_set_backup_function (p, _backup_gst_orc_splat_u16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_parameter (p, 2, "p1");
+
+ orc_program_append_2 (p, "copyw", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_gst_orc_splat_u16 = p;
+ }
+ {
+ /* gst_orc_splat_u32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "gst_orc_splat_u32");
+ orc_program_set_backup_function (p, _backup_gst_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);
+
+ _orc_program_gst_orc_splat_u32 = p;
+ }
+#endif
+}
diff --git a/gst/videotestsrc/gstvideotestsrcorc-dist.h b/gst/videotestsrc/gstvideotestsrcorc-dist.h
new file mode 100644
index 0000000..9c7ba64
--- /dev/null
+++ b/gst/videotestsrc/gstvideotestsrcorc-dist.h
@@ -0,0 +1,82 @@
+
+/* autogenerated from gstvideotestsrcorc.orc */
+
+#ifndef _GSTVIDEOTESTSRCORC_H_
+#define _GSTVIDEOTESTSRCORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void gst_videotestsrc_orc_init (void);
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 gst_orc_splat_u8 (guint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_s16 (gint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_u16 (guint8 * ORC_RESTRICT d1, int p1, int n);
+void gst_orc_splat_u32 (guint8 * ORC_RESTRICT d1, int p1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/videotestsrc/gstvideotestsrcorc.orc b/gst/videotestsrc/gstvideotestsrcorc.orc
new file mode 100644
index 0000000..a2fc80b
--- /dev/null
+++ b/gst/videotestsrc/gstvideotestsrcorc.orc
@@ -0,0 +1,31 @@
+
+.init gst_videotestsrc_orc_init
+
+.function gst_orc_splat_u8
+.dest 1 d1 guint8
+.param 1 p1
+
+copyb d1, p1
+
+
+.function gst_orc_splat_s16
+.dest 2 d1 gint8
+.param 2 p1
+
+copyw d1, p1
+
+
+.function gst_orc_splat_u16
+.dest 2 d1 guint8
+.param 2 p1
+
+copyw d1, p1
+
+
+.function gst_orc_splat_u32
+.dest 4 d1 guint8
+.param 4 p1
+
+copyl d1, p1
+
+
diff --git a/gst/videotestsrc/videotestsrc.c b/gst/videotestsrc/videotestsrc.c
new file mode 100644
index 0000000..184352a
--- /dev/null
+++ b/gst/videotestsrc/videotestsrc.c
@@ -0,0 +1,2526 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* non-GST-specific stuff */
+
+#include "gstvideotestsrc.h"
+#include "videotestsrc.h"
+#include "gstvideotestsrcorc.h"
+
+#include <gst/math-compat.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#define TO_16(x) (((x)<<8) | (x))
+#define TO_10(x) (((x)<<2) | ((x)>>6))
+
+static void paint_tmpline_ARGB (paintinfo * p, int x, int w);
+static void paint_tmpline_AYUV (paintinfo * p, int x, int w);
+
+static unsigned char
+random_char (void)
+{
+ static unsigned int state;
+
+ state *= 1103515245;
+ state += 12345;
+ return (state >> 16) & 0xff;
+}
+
+enum
+{
+ COLOR_WHITE = 0,
+ COLOR_YELLOW,
+ COLOR_CYAN,
+ COLOR_GREEN,
+ COLOR_MAGENTA,
+ COLOR_RED,
+ COLOR_BLUE,
+ COLOR_BLACK,
+ COLOR_NEG_I,
+ COLOR_POS_Q,
+ COLOR_SUPER_BLACK,
+ COLOR_DARK_GREY
+};
+
+static const struct vts_color_struct vts_colors_bt709_ycbcr_100[] = {
+ {235, 128, 128, 255, 255, 255, 255, (235 << 8)},
+ {219, 16, 138, 255, 255, 255, 0, (219 << 8)},
+ {188, 154, 16, 255, 0, 255, 255, (188 < 8)},
+ {173, 42, 26, 255, 0, 255, 0, (173 << 8)},
+ {78, 214, 230, 255, 255, 0, 255, (78 << 8)},
+ {63, 102, 240, 255, 255, 0, 0, (64 << 8)},
+ {32, 240, 118, 255, 0, 0, 255, (32 << 8)},
+ {16, 128, 128, 255, 0, 0, 0, (16 << 8)},
+ {16, 198, 21, 255, 0, 0, 128, (16 << 8)}, /* -I ? */
+ {16, 235, 198, 255, 0, 128, 255, (16 << 8)}, /* +Q ? */
+ {0, 128, 128, 255, 0, 0, 0, 0},
+ {32, 128, 128, 255, 19, 19, 19, (32 << 8)},
+};
+
+static const struct vts_color_struct vts_colors_bt709_ycbcr_75[] = {
+ {180, 128, 128, 255, 191, 191, 191, (180 << 8)},
+ {168, 44, 136, 255, 191, 191, 0, (168 << 8)},
+ {145, 147, 44, 255, 0, 191, 191, (145 << 8)},
+ {133, 63, 52, 255, 0, 191, 0, (133 << 8)},
+ {63, 193, 204, 255, 191, 0, 191, (63 << 8)},
+ {51, 109, 212, 255, 191, 0, 0, (51 << 8)},
+ {28, 212, 120, 255, 0, 0, 191, (28 << 8)},
+ {16, 128, 128, 255, 0, 0, 0, (16 << 8)},
+ {16, 198, 21, 255, 0, 0, 128, (16 << 8)}, /* -I ? */
+ {16, 235, 198, 255, 0, 128, 255, (16 << 8)}, /* +Q ? */
+ {0, 128, 128, 255, 0, 0, 0, 0},
+ {32, 128, 128, 255, 19, 19, 19, (32 << 8)},
+};
+
+static const struct vts_color_struct vts_colors_bt601_ycbcr_100[] = {
+ {235, 128, 128, 255, 255, 255, 255, (235 << 8)},
+ {210, 16, 146, 255, 255, 255, 0, (219 << 8)},
+ {170, 166, 16, 255, 0, 255, 255, (188 < 8)},
+ {145, 54, 34, 255, 0, 255, 0, (173 << 8)},
+ {106, 202, 222, 255, 255, 0, 255, (78 << 8)},
+ {81, 90, 240, 255, 255, 0, 0, (64 << 8)},
+ {41, 240, 110, 255, 0, 0, 255, (32 << 8)},
+ {16, 128, 128, 255, 0, 0, 0, (16 << 8)},
+ {16, 198, 21, 255, 0, 0, 128, (16 << 8)}, /* -I ? */
+ {16, 235, 198, 255, 0, 128, 255, (16 << 8)}, /* +Q ? */
+ {-0, 128, 128, 255, 0, 0, 0, 0},
+ {32, 128, 128, 255, 19, 19, 19, (32 << 8)},
+};
+
+static const struct vts_color_struct vts_colors_bt601_ycbcr_75[] = {
+ {180, 128, 128, 255, 191, 191, 191, (180 << 8)},
+ {162, 44, 142, 255, 191, 191, 0, (168 << 8)},
+ {131, 156, 44, 255, 0, 191, 191, (145 << 8)},
+ {112, 72, 58, 255, 0, 191, 0, (133 << 8)},
+ {84, 184, 198, 255, 191, 0, 191, (63 << 8)},
+ {65, 100, 212, 255, 191, 0, 0, (51 << 8)},
+ {35, 212, 114, 255, 0, 0, 191, (28 << 8)},
+ {16, 128, 128, 255, 0, 0, 0, (16 << 8)},
+ {16, 198, 21, 255, 0, 0, 128, (16 << 8)}, /* -I ? */
+ {16, 235, 198, 255, 0, 128, 255, (16 << 8)}, /* +Q ? */
+ {-0, 128, 128, 255, 0, 0, 0, 0},
+ {32, 128, 128, 255, 19, 19, 19, (32 << 8)},
+};
+
+
+static void paint_setup_I420 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_YV12 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame);
+#ifdef disabled
+static void paint_setup_IYU2 (paintinfo * p, GstVideoFrame * frame);
+#endif
+static void paint_setup_Y41B (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_Y42B (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_Y444 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_Y800 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_AYUV (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_v308 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_NV21 (paintinfo * p, GstVideoFrame * frame);
+#ifdef disabled
+static void paint_setup_v410 (paintinfo * p, GstVideoFrame * frame);
+#endif
+static void paint_setup_v216 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_v210 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_AY64 (paintinfo * p, GstVideoFrame * frame);
+
+static void paint_setup_YUV9 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_YVU9 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_ARGB8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_ABGR8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_RGBA8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_BGRA8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_RGB565 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_ARGB64 (paintinfo * p, GstVideoFrame * frame);
+
+static void paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_bayer_gbrg (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame);
+
+static void convert_hline_I420 (paintinfo * p, int y);
+static void convert_hline_NV12 (paintinfo * p, int y);
+static void convert_hline_NV21 (paintinfo * p, int y);
+static void convert_hline_YUY2 (paintinfo * p, int y);
+#ifdef disabled
+static void convert_hline_IYU2 (paintinfo * p, int y);
+#endif
+static void convert_hline_Y41B (paintinfo * p, int y);
+static void convert_hline_Y42B (paintinfo * p, int y);
+static void convert_hline_Y444 (paintinfo * p, int y);
+static void convert_hline_Y800 (paintinfo * p, int y);
+static void convert_hline_v308 (paintinfo * p, int y);
+static void convert_hline_AYUV (paintinfo * p, int y);
+#ifdef disabled
+static void convert_hline_v410 (paintinfo * p, int y);
+#endif
+static void convert_hline_v216 (paintinfo * p, int y);
+static void convert_hline_v210 (paintinfo * p, int y);
+static void convert_hline_UYVP (paintinfo * p, int y);
+static void convert_hline_AY64 (paintinfo * p, int y);
+
+static void convert_hline_YUV9 (paintinfo * p, int y);
+static void convert_hline_astr4 (paintinfo * p, int y);
+static void convert_hline_astr8 (paintinfo * p, int y);
+static void convert_hline_str4 (paintinfo * p, int y);
+static void convert_hline_str3 (paintinfo * p, int y);
+static void convert_hline_RGB565 (paintinfo * p, int y);
+static void convert_hline_xRGB1555 (paintinfo * p, int y);
+
+static void convert_hline_bayer (paintinfo * p, int y);
+
+static void paint_setup_GRAY8 (paintinfo * p, GstVideoFrame * frame);
+static void paint_setup_GRAY16 (paintinfo * p, GstVideoFrame * frame);
+static void convert_hline_GRAY8 (paintinfo * p, int y);
+static void convert_hline_GRAY16 (paintinfo * p, int y);
+
+struct format_list_struct format_list[] = {
+/* packed */
+ {VTS_YUV, "YUY2", "YUY2", 16, paint_setup_YUY2, convert_hline_YUY2},
+ {VTS_YUV, "UYVY", "UYVY", 16, paint_setup_UYVY, convert_hline_YUY2},
+#ifdef disabled
+ {VTS_YUV, "Y422", "Y422", 16, paint_setup_UYVY, convert_hline_YUY2},
+ {VTS_YUV, "UYNV", "UYNV", 16, paint_setup_UYVY, convert_hline_YUY2}, /* FIXME: UYNV? */
+#endif
+ {VTS_YUV, "YVYU", "YVYU", 16, paint_setup_YVYU, convert_hline_YUY2},
+ {VTS_YUV, "v308", "v308", 24, paint_setup_v308, convert_hline_v308},
+ {VTS_YUV, "AYUV", "AYUV", 32, paint_setup_AYUV, convert_hline_AYUV},
+#ifdef disabled
+ {VTS_YUV, "v410", "v410", 32, paint_setup_v410, convert_hline_v410},
+#endif
+ {VTS_YUV, "v210", "v210", 21, paint_setup_v210, convert_hline_v210},
+ {VTS_YUV, "v216", "v216", 32, paint_setup_v216, convert_hline_v216},
+ {VTS_YUV, "UYVP", "UYVP", 20, paint_setup_UYVP, convert_hline_UYVP},
+ {VTS_YUV, "AY64", "AY64", 64, paint_setup_AY64, convert_hline_AY64},
+
+#ifdef disabled
+ {VTS_YUV, "IYU2", "IYU2", 24, paint_setup_IYU2, convert_hline_IYU2},
+#endif
+
+/* planar */
+ /* YVU9 */
+ {VTS_YUV, "YVU9", "YVU9", 9, paint_setup_YVU9, convert_hline_YUV9},
+ /* YUV9 */
+ {VTS_YUV, "YUV9", "YUV9", 9, paint_setup_YUV9, convert_hline_YUV9},
+ /* IF09 */
+ /* YV12 */
+ {VTS_YUV, "YV12", "YV12", 12, paint_setup_YV12, convert_hline_I420},
+ /* I420 */
+ {VTS_YUV, "I420", "I420", 12, paint_setup_I420, convert_hline_I420},
+ /* NV12 */
+ {VTS_YUV, "NV12", "NV12", 12, paint_setup_NV12, convert_hline_NV12},
+ /* NV21 */
+ {VTS_YUV, "NV21", "NV21", 12, paint_setup_NV21, convert_hline_NV21},
+ /* CLPL */
+ /* Y41B */
+ {VTS_YUV, "Y41B", "Y41B", 12, paint_setup_Y41B, convert_hline_Y41B},
+ /* Y42B */
+ {VTS_YUV, "Y42B", "Y42B", 16, paint_setup_Y42B, convert_hline_Y42B},
+ /* Y444 */
+ {VTS_YUV, "Y444", "Y444", 24, paint_setup_Y444, convert_hline_Y444},
+ /* Y800 grayscale */
+ {VTS_YUV, "Y800", "Y800", 8, paint_setup_Y800, convert_hline_Y800},
+
+ /* Not exactly YUV but it's the same as above */
+ {VTS_GRAY, "GRAY8", "GRAY8", 8, paint_setup_GRAY8, convert_hline_GRAY8},
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ {VTS_GRAY, "GRAY16_LE", "GRAY16", 16, paint_setup_GRAY16,
+ convert_hline_GRAY16},
+#else
+ {VTS_GRAY, "GRAY16_BE", "GRAY16", 16, paint_setup_GRAY16,
+ convert_hline_GRAY16},
+#endif
+
+ {VTS_RGB, "xRGB", "xRGB8888", 32, paint_setup_xRGB8888, convert_hline_str4,
+ 24,
+ 0x00ff0000, 0x0000ff00, 0x000000ff},
+ {VTS_RGB, "xBGR", "xBGR8888", 32, paint_setup_xBGR8888, convert_hline_str4,
+ 24,
+ 0x000000ff, 0x0000ff00, 0x00ff0000},
+ {VTS_RGB, "RGBx", "RGBx8888", 32, paint_setup_RGBx8888, convert_hline_str4,
+ 24,
+ 0xff000000, 0x00ff0000, 0x0000ff00},
+ {VTS_RGB, "BGRx", "BGRx8888", 32, paint_setup_BGRx8888, convert_hline_str4,
+ 24,
+ 0x0000ff00, 0x00ff0000, 0xff000000},
+ {VTS_RGB, "ARGB", "ARGB8888", 32, paint_setup_ARGB8888, convert_hline_astr4,
+ 32,
+ 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000},
+ {VTS_RGB, "ABGR", "ABGR8888", 32, paint_setup_ABGR8888, convert_hline_astr4,
+ 32,
+ 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000},
+ {VTS_RGB, "RGBA", "RGBA8888", 32, paint_setup_RGBA8888, convert_hline_astr4,
+ 32,
+ 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff},
+ {VTS_RGB, "BGRA", "BGRA8888", 32, paint_setup_BGRA8888, convert_hline_astr4,
+ 32,
+ 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff},
+ {VTS_RGB, "RGB", "RGB888", 24, paint_setup_RGB888, convert_hline_str3, 24,
+ 0x00ff0000, 0x0000ff00, 0x000000ff},
+ {VTS_RGB, "BGR", "BGR888", 24, paint_setup_BGR888, convert_hline_str3, 24,
+ 0x000000ff, 0x0000ff00, 0x00ff0000},
+ {VTS_RGB, "RGB16", "RGB565", 16, paint_setup_RGB565, convert_hline_RGB565, 16,
+ 0x0000f800, 0x000007e0, 0x0000001f},
+ {VTS_RGB, "RGB15", "xRGB1555", 16, paint_setup_xRGB1555,
+ convert_hline_xRGB1555,
+ 15,
+ 0x00007c00, 0x000003e0, 0x0000001f},
+ {VTS_RGB, "ARGB64", "ARGB8888", 64, paint_setup_ARGB64, convert_hline_astr8,
+ 64,
+ 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000},
+
+ {VTS_BAYER, "bggr", "Bayer", 8, paint_setup_bayer_bggr, convert_hline_bayer},
+ {VTS_BAYER, "rggb", "Bayer", 8, paint_setup_bayer_rggb, convert_hline_bayer},
+ {VTS_BAYER, "grbg", "Bayer", 8, paint_setup_bayer_grbg, convert_hline_bayer},
+ {VTS_BAYER, "gbrg", "Bayer", 8, paint_setup_bayer_gbrg, convert_hline_bayer}
+};
+
+int n_formats = G_N_ELEMENTS (format_list);
+
+struct format_list_struct *
+paintinfo_find_by_structure (const GstStructure * structure)
+{
+ int i;
+ const char *media_type = gst_structure_get_name (structure);
+
+ g_return_val_if_fail (structure, NULL);
+
+ if (strcmp (media_type, "video/x-raw") == 0) {
+ const gchar *format;
+
+ format = gst_structure_get_string (structure, "format");
+ if (!format) {
+ GST_WARNING ("incomplete caps structure: %" GST_PTR_FORMAT, structure);
+ return NULL;
+ }
+
+ for (i = 0; i < n_formats; i++) {
+ if (g_str_equal (format, format_list[i].format)) {
+ return format_list + i;
+ }
+ }
+ return NULL;
+ } else if (strcmp (media_type, "video/x-raw-bayer") == 0) {
+ const gchar *format;
+
+ format = gst_structure_get_string (structure, "format");
+ if (!format) {
+ GST_WARNING ("incomplete caps structure: %" GST_PTR_FORMAT, structure);
+ return NULL;
+ }
+
+ for (i = 0; i < n_formats; i++) {
+ if (format_list[i].type == VTS_BAYER &&
+ g_str_equal (format, format_list[i].format)) {
+ return format_list + i;
+ }
+ }
+ return NULL;
+ }
+
+ g_critical ("format not found for media type %s", media_type);
+
+ return NULL;
+}
+
+struct format_list_struct *
+paintrect_find_format (const gchar * find_format)
+{
+ int i;
+
+ for (i = 0; i < n_formats; i++) {
+ if (g_str_equal (find_format, format_list[i].format)) {
+ return format_list + i;
+ }
+ }
+ return NULL;
+}
+
+struct format_list_struct *
+paintrect_find_name (const char *name)
+{
+ int i;
+
+ for (i = 0; i < n_formats; i++) {
+ if (g_str_equal (name, format_list[i].name)) {
+ return format_list + i;
+ }
+ }
+ return NULL;
+}
+
+
+GstStructure *
+paint_get_structure (struct format_list_struct * format)
+{
+ GstStructure *structure = NULL;
+
+ g_return_val_if_fail (format, NULL);
+
+ switch (format->type) {
+ case VTS_RGB:
+ case VTS_GRAY:
+ structure = gst_structure_new ("video/x-raw",
+ "format", G_TYPE_STRING, format->format, NULL);
+ break;
+ case VTS_YUV:
+ {
+ GValue value_list = { 0 };
+ GValue value = { 0 };
+
+ structure = gst_structure_new ("video/x-raw",
+ "format", G_TYPE_STRING, format->format, NULL);
+
+ if (strcmp (format->format, "Y800") != 0) {
+ g_value_init (&value_list, GST_TYPE_LIST);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_static_string (&value, "bt601");
+ gst_value_list_append_value (&value_list, &value);
+
+ g_value_set_static_string (&value, "bt709");
+ gst_value_list_append_value (&value_list, &value);
+
+ gst_structure_set_value (structure, "colorimetry", &value_list);
+ g_value_reset (&value_list);
+
+ if (strcmp (format->format, "AYUV") &&
+ strcmp (format->format, "v308") &&
+ strcmp (format->format, "v410") &&
+ strcmp (format->format, "Y444")) {
+ g_value_set_static_string (&value, "mpeg2");
+ gst_value_list_append_value (&value_list, &value);
+
+ g_value_set_static_string (&value, "jpeg");
+ gst_value_list_append_value (&value_list, &value);
+
+ gst_structure_set_value (structure, "chroma-site", &value_list);
+ }
+ g_value_unset (&value_list);
+ }
+ break;
+ }
+ case VTS_BAYER:
+ structure = gst_structure_new ("video/x-raw-bayer",
+ "format", G_TYPE_STRING, format->format, NULL);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ return structure;
+}
+
+/* returns the size in bytes for one video frame of the given dimensions
+ * given the format in GstVideoTestSrc */
+int
+gst_video_test_src_get_size (GstVideoTestSrc * v, int w, int h)
+{
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+
+ p->width = w;
+ p->height = h;
+ format = v->format;
+ if (format == NULL)
+ return 0;
+
+ format->paint_setup (p, NULL);
+
+ return p->size;
+}
+
+#define SCALEBITS 10
+#define ONE_HALF (1 << (SCALEBITS - 1))
+#define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
+
+#define RGB_TO_Y(r, g, b) \
+((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
+ FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
+
+#define RGB_TO_U(r1, g1, b1, shift)\
+(((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
+ FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_V(r1, g1, b1, shift)\
+(((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
+ FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_Y_CCIR(r, g, b) \
+((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + \
+ FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
+
+#define RGB_TO_U_CCIR(r1, g1, b1, shift)\
+(((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 + \
+ FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_V_CCIR(r1, g1, b1, shift)\
+(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 - \
+ FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_Y_CCIR_709(r, g, b) \
+((FIX(0.212600*219.0/255.0) * (r) + FIX(0.715200*219.0/255.0) * (g) + \
+ FIX(0.072200*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
+
+#define RGB_TO_U_CCIR_709(r1, g1, b1, shift)\
+(((- FIX(0.114572*224.0/255.0) * r1 - FIX(0.385427*224.0/255.0) * g1 + \
+ FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_V_CCIR_709(r1, g1, b1, shift)\
+(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.454153*224.0/255.0) * g1 - \
+ FIX(0.045847*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+static void
+videotestsrc_setup_paintinfo (GstVideoTestSrc * v, paintinfo * p, int w, int h)
+{
+ int a, r, g, b;
+
+ if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) {
+ p->colors = vts_colors_bt601_ycbcr_100;
+ } else {
+ p->colors = vts_colors_bt709_ycbcr_100;
+ }
+ p->width = w;
+ p->height = h;
+
+ p->convert_tmpline = v->format->convert_hline;
+ if (v->format->type == VTS_RGB || v->format->type == VTS_BAYER) {
+ p->paint_tmpline = paint_tmpline_ARGB;
+ } else {
+ p->paint_tmpline = paint_tmpline_AYUV;
+ }
+ p->tmpline = v->tmpline;
+ p->tmpline2 = v->tmpline2;
+ p->tmpline_u8 = v->tmpline_u8;
+ p->x_offset = (v->horizontal_speed * v->n_frames) % p->width;
+ if (p->x_offset < 0)
+ p->x_offset += p->width;
+
+ a = (v->foreground_color >> 24) & 0xff;
+ r = (v->foreground_color >> 16) & 0xff;
+ g = (v->foreground_color >> 8) & 0xff;
+ b = (v->foreground_color >> 0) & 0xff;
+ p->foreground_color.A = a;
+ p->foreground_color.R = r;
+ p->foreground_color.G = g;
+ p->foreground_color.B = b;
+ if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) {
+ p->foreground_color.Y = RGB_TO_Y_CCIR (r, g, b);
+ p->foreground_color.U = RGB_TO_U_CCIR (r, g, b, 0);
+ p->foreground_color.V = RGB_TO_V_CCIR (r, g, b, 0);
+ } else {
+ p->foreground_color.Y = RGB_TO_Y_CCIR_709 (r, g, b);
+ p->foreground_color.U = RGB_TO_U_CCIR_709 (r, g, b, 0);
+ p->foreground_color.V = RGB_TO_V_CCIR_709 (r, g, b, 0);
+ }
+ p->foreground_color.gray = RGB_TO_Y (r, g, b);
+
+ a = (v->background_color >> 24) & 0xff;
+ r = (v->background_color >> 16) & 0xff;
+ g = (v->background_color >> 8) & 0xff;
+ b = (v->background_color >> 0) & 0xff;
+ p->background_color.A = a;
+ p->background_color.R = r;
+ p->background_color.G = g;
+ p->background_color.B = b;
+ if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) {
+ p->background_color.Y = RGB_TO_Y_CCIR (r, g, b);
+ p->background_color.U = RGB_TO_U_CCIR (r, g, b, 0);
+ p->background_color.V = RGB_TO_V_CCIR (r, g, b, 0);
+ } else {
+ p->background_color.Y = RGB_TO_Y_CCIR_709 (r, g, b);
+ p->background_color.U = RGB_TO_U_CCIR_709 (r, g, b, 0);
+ p->background_color.V = RGB_TO_V_CCIR_709 (r, g, b, 0);
+ }
+ p->background_color.gray = RGB_TO_Y (r, g, b);
+
+}
+
+static void
+videotestsrc_convert_tmpline (paintinfo * p, int j)
+{
+ int x = p->x_offset;
+ int i;
+
+ if (x != 0) {
+ memcpy (p->tmpline2, p->tmpline, p->width * 4);
+ memcpy (p->tmpline, p->tmpline2 + x * 4, (p->width - x) * 4);
+ memcpy (p->tmpline + (p->width - x) * 4, p->tmpline2, x * 4);
+ }
+
+ for (i = p->width; i < p->width + 5; i++) {
+ p->tmpline[4 * i + 0] = p->tmpline[4 * (p->width - 1) + 0];
+ p->tmpline[4 * i + 1] = p->tmpline[4 * (p->width - 1) + 1];
+ p->tmpline[4 * i + 2] = p->tmpline[4 * (p->width - 1) + 2];
+ p->tmpline[4 * i + 3] = p->tmpline[4 * (p->width - 1) + 3];
+ }
+
+ p->convert_tmpline (p, j);
+}
+
+#define BLEND1(a,b,x) ((a)*(x) + (b)*(255-(x)))
+#define DIV255(x) (((x) + (((x)+128)>>8) + 128)>>8)
+#define BLEND(a,b,x) DIV255(BLEND1(a,b,x))
+
+#ifdef unused
+static void
+videotestsrc_blend_color (struct vts_color_struct *dest,
+ struct vts_color_struct *a, struct vts_color_struct *b, int x)
+{
+ dest->Y = BLEND (a->Y, b->Y, x);
+ dest->U = BLEND (a->U, b->U, x);
+ dest->V = BLEND (a->V, b->V, x);
+ dest->R = BLEND (a->R, b->R, x);
+ dest->G = BLEND (a->G, b->G, x);
+ dest->B = BLEND (a->B, b->B, x);
+ dest->gray = BLEND (a->gray, b->gray, x);
+
+}
+#endif
+
+static void
+videotestsrc_blend_line (GstVideoTestSrc * v, guint8 * dest, guint8 * src,
+ struct vts_color_struct *a, struct vts_color_struct *b, int n)
+{
+ int i;
+ if (v->format->type == VTS_RGB || v->format->type == VTS_BAYER) {
+ for (i = 0; i < n; i++) {
+ dest[i * 4 + 0] = BLEND (a->A, b->A, src[i]);
+ dest[i * 4 + 1] = BLEND (a->R, b->R, src[i]);
+ dest[i * 4 + 2] = BLEND (a->G, b->G, src[i]);
+ dest[i * 4 + 3] = BLEND (a->B, b->B, src[i]);
+ }
+ } else {
+ for (i = 0; i < n; i++) {
+ dest[i * 4 + 0] = BLEND (a->A, b->A, src[i]);
+ dest[i * 4 + 1] = BLEND (a->Y, b->Y, src[i]);
+ dest[i * 4 + 2] = BLEND (a->U, b->U, src[i]);
+ dest[i * 4 + 3] = BLEND (a->V, b->V, src[i]);
+ }
+ }
+#undef BLEND
+}
+
+void
+gst_video_test_src_smpte (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int y1, y2;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, frame->info.width, frame->info.height);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ y1 = 2 * h / 3;
+ y2 = h * 0.75;
+
+ /* color bars */
+ for (j = 0; j < y1; j++) {
+ for (i = 0; i < 7; i++) {
+ int x1 = i * w / 7;
+ int x2 = (i + 1) * w / 7;
+
+ p->color = p->colors + i;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+ videotestsrc_convert_tmpline (p, j);
+ }
+
+ /* inverse blue bars */
+ for (j = y1; j < y2; j++) {
+ for (i = 0; i < 7; i++) {
+ int x1 = i * w / 7;
+ int x2 = (i + 1) * w / 7;
+ int k;
+
+ if (i & 1) {
+ k = 7;
+ } else {
+ k = 6 - i;
+ }
+ p->color = p->colors + k;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+ videotestsrc_convert_tmpline (p, j);
+ }
+
+ for (j = y2; j < h; j++) {
+ /* -I, white, Q regions */
+ for (i = 0; i < 3; i++) {
+ int x1 = i * w / 6;
+ int x2 = (i + 1) * w / 6;
+ int k;
+
+ if (i == 0) {
+ k = 8;
+ } else if (i == 1) {
+ k = 0;
+ } else
+ k = 9;
+
+ p->color = p->colors + k;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+
+ /* superblack, black, dark grey */
+ for (i = 0; i < 3; i++) {
+ int x1 = w / 2 + i * w / 12;
+ int x2 = w / 2 + (i + 1) * w / 12;
+ int k;
+
+ if (i == 0) {
+ k = COLOR_SUPER_BLACK;
+ } else if (i == 1) {
+ k = COLOR_BLACK;
+ } else
+ k = COLOR_DARK_GREY;
+
+ p->color = p->colors + k;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+
+ {
+ int x1 = w * 3 / 4;
+ struct vts_color_struct color;
+
+ color = p->colors[COLOR_BLACK];
+ p->color = &color;
+
+ for (i = x1; i < w; i++) {
+ int y = random_char ();
+ p->tmpline_u8[i] = y;
+ }
+ videotestsrc_blend_line (v, p->tmpline + x1 * 4, p->tmpline_u8 + x1,
+ &p->foreground_color, &p->background_color, w - x1);
+
+ }
+ videotestsrc_convert_tmpline (p, j);
+
+ }
+}
+
+void
+gst_video_test_src_smpte75 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) {
+ p->colors = vts_colors_bt601_ycbcr_75;
+ } else {
+ p->colors = vts_colors_bt709_ycbcr_75;
+ }
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ /* color bars */
+ for (j = 0; j < h; j++) {
+ for (i = 0; i < 7; i++) {
+ int x1 = i * w / 7;
+ int x2 = (i + 1) * w / 7;
+
+ p->color = p->colors + i;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+void
+gst_video_test_src_smpte100 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ /* color bars */
+ for (j = 0; j < h; j++) {
+ for (i = 0; i < 7; i++) {
+ int x1 = i * w / 7;
+ int x2 = (i + 1) * w / 7;
+
+ p->color = p->colors + i;
+ p->paint_tmpline (p, x1, (x2 - x1));
+ }
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+void
+gst_video_test_src_bar (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (j = 0; j < h; j++) {
+ /* use fixed size for now */
+ int x2 = w / 7;
+
+ p->color = &p->foreground_color;
+ p->paint_tmpline (p, 0, x2);
+ p->color = &p->background_color;
+ p->paint_tmpline (p, x2, (w - x2));
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+void
+gst_video_test_src_snow (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ struct vts_color_struct color;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ color = p->colors[COLOR_BLACK];
+ p->color = &color;
+
+ for (j = 0; j < h; j++) {
+ for (i = 0; i < w; i++) {
+ int y = random_char ();
+ p->tmpline_u8[i] = y;
+ }
+ videotestsrc_blend_line (v, p->tmpline, p->tmpline_u8,
+ &p->foreground_color, &p->background_color, p->width);
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+static void
+gst_video_test_src_unicolor (GstVideoTestSrc * v, GstVideoFrame * frame,
+ int color_index)
+{
+ int i;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ p->color = p->colors + color_index;
+ if (color_index == COLOR_BLACK) {
+ p->color = &p->background_color;
+ }
+ if (color_index == COLOR_WHITE) {
+ p->color = &p->foreground_color;
+ }
+
+ for (i = 0; i < h; i++) {
+ p->paint_tmpline (p, 0, w);
+ videotestsrc_convert_tmpline (p, i);
+ }
+}
+
+void
+gst_video_test_src_black (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ gst_video_test_src_unicolor (v, frame, COLOR_BLACK);
+}
+
+void
+gst_video_test_src_white (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ gst_video_test_src_unicolor (v, frame, COLOR_WHITE);
+}
+
+void
+gst_video_test_src_red (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ gst_video_test_src_unicolor (v, frame, COLOR_RED);
+}
+
+void
+gst_video_test_src_green (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ gst_video_test_src_unicolor (v, frame, COLOR_GREEN);
+}
+
+void
+gst_video_test_src_blue (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ gst_video_test_src_unicolor (v, frame, COLOR_BLUE);
+}
+
+void
+gst_video_test_src_blink (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ if (v->n_frames & 1) {
+ p->color = &p->foreground_color;
+ } else {
+ p->color = &p->background_color;
+ }
+
+ for (i = 0; i < h; i++) {
+ p->paint_tmpline (p, 0, w);
+ videotestsrc_convert_tmpline (p, i);
+ }
+}
+
+void
+gst_video_test_src_solid (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ p->color = &p->foreground_color;
+
+ for (i = 0; i < h; i++) {
+ p->paint_tmpline (p, 0, w);
+ videotestsrc_convert_tmpline (p, i);
+ }
+}
+
+void
+gst_video_test_src_checkers1 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int x, y;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x++) {
+ if ((x ^ y) & 1) {
+ p->color = p->colors + COLOR_GREEN;
+ } else {
+ p->color = p->colors + COLOR_RED;
+ }
+ p->paint_tmpline (p, x, 1);
+ }
+ videotestsrc_convert_tmpline (p, y);
+ }
+}
+
+void
+gst_video_test_src_checkers2 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int x, y;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x += 2) {
+ guint len = MIN (2, w - x);
+
+ if ((x ^ y) & 2) {
+ p->color = p->colors + COLOR_GREEN;
+ } else {
+ p->color = p->colors + COLOR_RED;
+ }
+ p->paint_tmpline (p, x, len);
+ }
+ videotestsrc_convert_tmpline (p, y);
+ }
+}
+
+void
+gst_video_test_src_checkers4 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int x, y;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x += 4) {
+ guint len = MIN (4, w - x);
+
+ if ((x ^ y) & 4) {
+ p->color = p->colors + COLOR_GREEN;
+ } else {
+ p->color = p->colors + COLOR_RED;
+ }
+ p->paint_tmpline (p, x, len);
+ }
+ videotestsrc_convert_tmpline (p, y);
+ }
+}
+
+void
+gst_video_test_src_checkers8 (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int x, y;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x += 8) {
+ guint len = MIN (8, w - x);
+
+ if ((x ^ y) & 8) {
+ p->color = p->colors + COLOR_GREEN;
+ } else {
+ p->color = p->colors + COLOR_RED;
+ }
+ p->paint_tmpline (p, x, len);
+ }
+ videotestsrc_convert_tmpline (p, y);
+ }
+}
+
+static const guint8 sine_table[256] = {
+ 128, 131, 134, 137, 140, 143, 146, 149,
+ 152, 156, 159, 162, 165, 168, 171, 174,
+ 176, 179, 182, 185, 188, 191, 193, 196,
+ 199, 201, 204, 206, 209, 211, 213, 216,
+ 218, 220, 222, 224, 226, 228, 230, 232,
+ 234, 236, 237, 239, 240, 242, 243, 245,
+ 246, 247, 248, 249, 250, 251, 252, 252,
+ 253, 254, 254, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 254, 254,
+ 253, 252, 252, 251, 250, 249, 248, 247,
+ 246, 245, 243, 242, 240, 239, 237, 236,
+ 234, 232, 230, 228, 226, 224, 222, 220,
+ 218, 216, 213, 211, 209, 206, 204, 201,
+ 199, 196, 193, 191, 188, 185, 182, 179,
+ 176, 174, 171, 168, 165, 162, 159, 156,
+ 152, 149, 146, 143, 140, 137, 134, 131,
+ 128, 124, 121, 118, 115, 112, 109, 106,
+ 103, 99, 96, 93, 90, 87, 84, 81,
+ 79, 76, 73, 70, 67, 64, 62, 59,
+ 56, 54, 51, 49, 46, 44, 42, 39,
+ 37, 35, 33, 31, 29, 27, 25, 23,
+ 21, 19, 18, 16, 15, 13, 12, 10,
+ 9, 8, 7, 6, 5, 4, 3, 3,
+ 2, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1,
+ 2, 3, 3, 4, 5, 6, 7, 8,
+ 9, 10, 12, 13, 15, 16, 18, 19,
+ 21, 23, 25, 27, 29, 31, 33, 35,
+ 37, 39, 42, 44, 46, 49, 51, 54,
+ 56, 59, 62, 64, 67, 70, 73, 76,
+ 79, 81, 84, 87, 90, 93, 96, 99,
+ 103, 106, 109, 112, 115, 118, 121, 124
+};
+
+
+void
+gst_video_test_src_zoneplate (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ struct vts_color_struct color;
+ int t = v->n_frames;
+ int w = frame->info.width, h = frame->info.height;
+ int xreset = -(w / 2) - v->xoffset; /* starting values for x^2 and y^2, centering the ellipse */
+ int yreset = -(h / 2) - v->yoffset;
+
+ int x, y;
+ int accum_kx;
+ int accum_kxt;
+ int accum_ky;
+ int accum_kyt;
+ int accum_kxy;
+ int kt;
+ int kt2;
+ int ky2;
+ int delta_kxt = v->kxt * t;
+ int delta_kxy;
+ int scale_kxy = 0xffff / (w / 2);
+ int scale_kx2 = 0xffff / w;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ color = p->colors[COLOR_BLACK];
+ p->color = &color;
+
+ /* Zoneplate equation:
+ *
+ * phase = k0 + kx*x + ky*y + kt*t
+ * + kxt*x*t + kyt*y*t + kxy*x*y
+ * + kx2*x*x + ky2*y*y + Kt2*t*t
+ */
+
+#if 0
+ for (j = 0, y = yreset; j < h; j++, y++) {
+ for (i = 0, x = xreset; i < w; i++, x++) {
+
+ /* zero order */
+ int phase = v->k0;
+
+ /* first order */
+ phase = phase + (v->kx * i) + (v->ky * j) + (v->kt * t);
+
+ /* cross term */
+ /* phase = phase + (v->kxt * i * t) + (v->kyt * j * t); */
+ /* phase = phase + (v->kxy * x * y) / (w/2); */
+
+ /*second order */
+ /*normalise x/y terms to rate of change of phase at the picture edge */
+ phase =
+ phase + ((v->kx2 * x * x) / w) + ((v->ky2 * y * y) / h) +
+ ((v->kt2 * t * t) >> 1);
+
+ color.Y = sine_table[phase & 0xff];
+
+ color.R = color.Y;
+ color.G = color.Y;
+ color.B = color.Y;
+ p->paint_tmpline (p, i, 1);
+ }
+ }
+#endif
+
+ /* optimised version, with original code shown in comments */
+ accum_ky = 0;
+ accum_kyt = 0;
+ kt = v->kt * t;
+ kt2 = v->kt2 * t * t;
+ for (j = 0, y = yreset; j < h; j++, y++) {
+ accum_kx = 0;
+ accum_kxt = 0;
+ accum_ky += v->ky;
+ accum_kyt += v->kyt * t;
+ delta_kxy = v->kxy * y * scale_kxy;
+ accum_kxy = delta_kxy * xreset;
+ ky2 = (v->ky2 * y * y) / h;
+ for (i = 0, x = xreset; i < w; i++, x++) {
+
+ /* zero order */
+ int phase = v->k0;
+
+ /* first order */
+ accum_kx += v->kx;
+ /* phase = phase + (v->kx * i) + (v->ky * j) + (v->kt * t); */
+ phase = phase + accum_kx + accum_ky + kt;
+
+ /* cross term */
+ accum_kxt += delta_kxt;
+ accum_kxy += delta_kxy;
+ /* phase = phase + (v->kxt * i * t) + (v->kyt * j * t); */
+ phase = phase + accum_kxt + accum_kyt;
+
+ /* phase = phase + (v->kxy * x * y) / (w/2); */
+ /* phase = phase + accum_kxy / (w/2); */
+ phase = phase + (accum_kxy >> 16);
+
+ /*second order */
+ /*normalise x/y terms to rate of change of phase at the picture edge */
+ /*phase = phase + ((v->kx2 * x * x)/w) + ((v->ky2 * y * y)/h) + ((v->kt2 * t * t)>>1); */
+ phase = phase + ((v->kx2 * x * x * scale_kx2) >> 16) + ky2 + (kt2 >> 1);
+
+ p->tmpline_u8[i] = sine_table[phase & 0xff];
+ }
+ videotestsrc_blend_line (v, p->tmpline, p->tmpline_u8,
+ &p->foreground_color, &p->background_color, p->width);
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+void
+gst_video_test_src_chromazoneplate (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ struct vts_color_struct color;
+ int t = v->n_frames;
+ int w = frame->info.width, h = frame->info.height;
+
+ int xreset = -(w / 2) - v->xoffset; /* starting values for x^2 and y^2, centering the ellipse */
+ int yreset = -(h / 2) - v->yoffset;
+
+ int x, y;
+ int accum_kx;
+ int accum_kxt;
+ int accum_ky;
+ int accum_kyt;
+ int accum_kxy;
+ int kt;
+ int kt2;
+ int ky2;
+ int delta_kxt = v->kxt * t;
+ int delta_kxy;
+ int scale_kxy = 0xffff / (w / 2);
+ int scale_kx2 = 0xffff / w;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ color = p->colors[COLOR_BLACK];
+ p->color = &color;
+
+ /* Zoneplate equation:
+ *
+ * phase = k0 + kx*x + ky*y + kt*t
+ * + kxt*x*t + kyt*y*t + kxy*x*y
+ * + kx2*x*x + ky2*y*y + Kt2*t*t
+ */
+
+ /* optimised version, with original code shown in comments */
+ accum_ky = 0;
+ accum_kyt = 0;
+ kt = v->kt * t;
+ kt2 = v->kt2 * t * t;
+ for (j = 0, y = yreset; j < h; j++, y++) {
+ accum_kx = 0;
+ accum_kxt = 0;
+ accum_ky += v->ky;
+ accum_kyt += v->kyt * t;
+ delta_kxy = v->kxy * y * scale_kxy;
+ accum_kxy = delta_kxy * xreset;
+ ky2 = (v->ky2 * y * y) / h;
+ for (i = 0, x = xreset; i < w; i++, x++) {
+
+ /* zero order */
+ int phase = v->k0;
+
+ /* first order */
+ accum_kx += v->kx;
+ /* phase = phase + (v->kx * i) + (v->ky * j) + (v->kt * t); */
+ phase = phase + accum_kx + accum_ky + kt;
+
+ /* cross term */
+ accum_kxt += delta_kxt;
+ accum_kxy += delta_kxy;
+ /* phase = phase + (v->kxt * i * t) + (v->kyt * j * t); */
+ phase = phase + accum_kxt + accum_kyt;
+
+ /* phase = phase + (v->kxy * x * y) / (w/2); */
+ /* phase = phase + accum_kxy / (w/2); */
+ phase = phase + (accum_kxy >> 16);
+
+ /*second order */
+ /*normalise x/y terms to rate of change of phase at the picture edge */
+ /*phase = phase + ((v->kx2 * x * x)/w) + ((v->ky2 * y * y)/h) + ((v->kt2 * t * t)>>1); */
+ phase = phase + ((v->kx2 * x * x * scale_kx2) >> 16) + ky2 + (kt2 >> 1);
+
+ color.Y = 128;
+ color.U = sine_table[phase & 0xff];
+ color.V = sine_table[phase & 0xff];
+
+ color.R = 128;
+ color.G = 128;
+ color.B = color.V;
+
+ color.gray = color.Y << 8;
+ p->paint_tmpline (p, i, 1);
+ }
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+#undef SCALE_AMPLITUDE
+void
+gst_video_test_src_circular (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ int j;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ double freq[8];
+ int w = frame->info.width, h = frame->info.height;
+
+ int d;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (i = 1; i < 8; i++) {
+ freq[i] = 200 * pow (2.0, -(i - 1) / 4.0);
+ }
+
+ for (j = 0; j < h; j++) {
+ for (i = 0; i < w; i++) {
+ double dist;
+ int seg;
+
+ dist =
+ sqrt ((2 * i - w) * (2 * i - w) + (2 * j - h) * (2 * j -
+ h)) / (2 * w);
+ seg = floor (dist * 16);
+ if (seg == 0 || seg >= 8) {
+ p->tmpline_u8[i] = 0;
+ } else {
+ d = floor (256 * dist * freq[seg] + 0.5);
+ p->tmpline_u8[i] = sine_table[d & 0xff];
+ }
+ }
+ videotestsrc_blend_line (v, p->tmpline, p->tmpline_u8,
+ &p->foreground_color, &p->background_color, p->width);
+ videotestsrc_convert_tmpline (p, j);
+ }
+}
+
+void
+gst_video_test_src_gamut (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int x, y;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ struct vts_color_struct yuv_primary;
+ struct vts_color_struct yuv_secondary;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ for (y = 0; y < h; y++) {
+ int region = (y * 4) / h;
+
+ switch (region) {
+ case 0: /* black */
+ yuv_primary = p->colors[COLOR_BLACK];
+ yuv_secondary = p->colors[COLOR_BLACK];
+ yuv_secondary.Y = 0;
+ break;
+ case 1:
+ yuv_primary = p->colors[COLOR_WHITE];
+ yuv_secondary = p->colors[COLOR_WHITE];
+ yuv_secondary.Y = 255;
+ break;
+ case 2:
+ yuv_primary = p->colors[COLOR_RED];
+ yuv_secondary = p->colors[COLOR_RED];
+ yuv_secondary.V = 255;
+ break;
+ case 3:
+ yuv_primary = p->colors[COLOR_BLUE];
+ yuv_secondary = p->colors[COLOR_BLUE];
+ yuv_secondary.U = 255;
+ break;
+ }
+
+ for (x = 0; x < w; x += 8) {
+ int len = MIN (8, w - x);
+
+ if ((x ^ y) & (1 << 4)) {
+ p->color = &yuv_primary;
+ } else {
+ p->color = &yuv_secondary;
+ }
+ p->paint_tmpline (p, x, len);
+ }
+ videotestsrc_convert_tmpline (p, y);
+ }
+}
+
+void
+gst_video_test_src_ball (GstVideoTestSrc * v, GstVideoFrame * frame)
+{
+ int i;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct format_list_struct *format;
+ int t = v->n_frames;
+ double x, y;
+ int radius = 20;
+ int w = frame->info.width, h = frame->info.height;
+
+ videotestsrc_setup_paintinfo (v, p, w, h);
+ format = v->format;
+ if (format == NULL)
+ return;
+
+ format->paint_setup (p, frame);
+
+ x = radius + (0.5 + 0.5 * sin (2 * G_PI * t / 200)) * (w - 2 * radius);
+ y = radius + (0.5 + 0.5 * sin (2 * G_PI * sqrt (2) * t / 200)) * (h -
+ 2 * radius);
+
+ for (i = 0; i < h; i++) {
+ if (i < y - radius || i > y + radius) {
+ memset (p->tmpline_u8, 0, w);
+ } else {
+ int r = rint (sqrt (radius * radius - (i - y) * (i - y)));
+ int x1, x2;
+ int j;
+
+ x1 = 0;
+ x2 = MAX (0, x - r);
+ for (j = x1; j < x2; j++) {
+ p->tmpline_u8[j] = 0;
+ }
+
+ x1 = MAX (0, x - r);
+ x2 = MIN (w, x + r + 1);
+ for (j = x1; j < x2; j++) {
+ double rr = radius - sqrt ((j - x) * (j - x) + (i - y) * (i - y));
+
+ rr *= 0.5;
+ p->tmpline_u8[j] = CLAMP ((int) floor (256 * rr), 0, 255);
+ }
+
+ x1 = MIN (w, x + r + 1);
+ x2 = w;
+ for (j = x1; j < x2; j++) {
+ p->tmpline_u8[j] = 0;
+ }
+ }
+ videotestsrc_blend_line (v, p->tmpline, p->tmpline_u8,
+ &p->foreground_color, &p->background_color, p->width);
+ videotestsrc_convert_tmpline (p, i);
+ }
+}
+
+static void
+paint_tmpline_ARGB (paintinfo * p, int x, int w)
+{
+ int offset;
+ guint32 value;
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ value = (p->color->A << 0) | (p->color->R << 8) |
+ (p->color->G << 16) | (p->color->B << 24);
+#else
+ value = (p->color->A << 24) | (p->color->R << 16) |
+ (p->color->G << 8) | (p->color->B << 0);
+#endif
+
+ offset = (x * 4);
+ gst_orc_splat_u32 (p->tmpline + offset, value, w);
+}
+
+static void
+paint_tmpline_AYUV (paintinfo * p, int x, int w)
+{
+ int offset;
+ guint32 value;
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ value = (p->color->A << 0) | (p->color->Y << 8) |
+ (p->color->U << 16) | (p->color->V << 24);
+#else
+ value = (p->color->A << 24) | (p->color->Y << 16) |
+ (p->color->U << 8) | (p->color->V << 0);
+#endif
+
+ offset = (x * 4);
+ gst_orc_splat_u32 (p->tmpline + offset, value, w);
+}
+
+
+static void
+paint_setup_I420 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vp = p->up + 1;
+ p->vstride = p->ustride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_NV21 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->up = p->vp + 1;
+ p->ustride = p->vstride;
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_I420 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + (y / 2) * p->ustride;
+ guint8 *V = p->vp + (y / 2) * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ U[i] = (ayuv[4 * (i * 2) + 2] + ayuv[4 * (i * 2 + 1) + 2] + 1) >> 1;
+ V[i] = (ayuv[4 * (i * 2) + 3] + ayuv[4 * (i * 2 + 1) + 3] + 1) >> 1;
+ }
+}
+
+static void
+convert_hline_NV12 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + (y / 2) * p->ustride;
+ guint8 *V = p->vp + (y / 2) * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ U[i * 2] = (ayuv[4 * (i * 2) + 2] + ayuv[4 * (i * 2 + 1) + 2] + 1) >> 1;
+ V[i * 2] = (ayuv[4 * (i * 2) + 3] + ayuv[4 * (i * 2 + 1) + 3] + 1) >> 1;
+ }
+}
+
+static void
+convert_hline_NV21 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + (y / 2) * p->ustride;
+ guint8 *V = p->vp + (y / 2) * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ U[i * 2] = (ayuv[4 * (i * 2) + 2] + ayuv[4 * (i * 2 + 1) + 2] + 1) >> 1;
+ V[i * 2] = (ayuv[4 * (i * 2) + 3] + ayuv[4 * (i * 2 + 1) + 3] + 1) >> 1;
+ }
+}
+
+
+static void
+paint_setup_YV12 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_v308 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->yp + 1;
+ p->vp = p->yp + 2;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_AYUV (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 1;
+ p->up = p->ap + 2;
+ p->vp = p->ap + 3;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+#ifdef disabled
+static void
+paint_setup_v410 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = dest + 0;
+ p->up = dest + 0;
+ p->vp = dest + 0;
+ p->ystride = p->width * 4;
+ p->endptr = dest + p->ystride * p->height;
+ p->size = frame->info.size;
+}
+#endif
+
+static void
+paint_setup_v216 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 2;
+ p->up = p->ap + 0;
+ p->vp = p->ap + 4;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_v210 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap;
+ p->up = p->ap;
+ p->vp = p->ap;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap;
+ p->up = p->ap;
+ p->vp = p->ap;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->yp + 1;
+ p->vp = p->yp + 3;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame)
+{
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->up + 1;
+ p->vp = p->up + 2;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->yp + 3;
+ p->vp = p->yp + 1;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_AY64 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 2;
+ p->up = p->ap + 4;
+ p->vp = p->ap + 6;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_v308 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i * 3] = ayuv[4 * i + 1];
+ U[i * 3] = ayuv[4 * i + 2];
+ V[i * 3] = ayuv[4 * i + 3];
+ }
+}
+
+static void
+convert_hline_AYUV (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *A = p->ap + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ A[i * 4] = ayuv[4 * i + 0];
+ Y[i * 4] = ayuv[4 * i + 1];
+ U[i * 4] = ayuv[4 * i + 2];
+ V[i * 4] = ayuv[4 * i + 3];
+ }
+}
+
+static void
+convert_hline_v216 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ GST_WRITE_UINT16_LE (Y + i * 4, TO_16 (ayuv[4 * i + 1]));
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ GST_WRITE_UINT16_LE (U + i * 8, TO_16 (ayuv[4 * (i * 2) + 2]));
+ GST_WRITE_UINT16_LE (V + i * 8, TO_16 (ayuv[4 * (i * 2) + 3]));
+ }
+}
+
+#ifdef disabled
+static void
+convert_hline_v410 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ guint32 a;
+
+ a = (TO_10 (ayuv[4 * i + 2]) << 22) |
+ (TO_10 (ayuv[4 * i + 1]) << 12) | (TO_10 (ayuv[4 * i + 3]) << 2);
+ GST_WRITE_UINT32_LE (Y + i * 4, a);
+ }
+}
+#endif
+
+static void
+convert_hline_v210 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width + 5; i += 6) {
+ guint32 a0, a1, a2, a3;
+ guint16 y0, y1, y2, y3, y4, y5;
+ guint16 u0, u1, u2;
+ guint16 v0, v1, v2;
+
+ y0 = ayuv[4 * (i + 0) + 1];
+ y1 = ayuv[4 * (i + 1) + 1];
+ y2 = ayuv[4 * (i + 2) + 1];
+ y3 = ayuv[4 * (i + 3) + 1];
+ y4 = ayuv[4 * (i + 4) + 1];
+ y5 = ayuv[4 * (i + 5) + 1];
+
+ u0 = (ayuv[4 * (i + 0) + 2] + ayuv[4 * (i + 1) + 2] + 1) >> 1;
+ u1 = (ayuv[4 * (i + 2) + 2] + ayuv[4 * (i + 3) + 2] + 1) >> 1;
+ u2 = (ayuv[4 * (i + 4) + 2] + ayuv[4 * (i + 5) + 2] + 1) >> 1;
+
+ v0 = (ayuv[4 * (i + 0) + 3] + ayuv[4 * (i + 1) + 3] + 1) >> 1;
+ v1 = (ayuv[4 * (i + 2) + 3] + ayuv[4 * (i + 3) + 3] + 1) >> 1;
+ v2 = (ayuv[4 * (i + 4) + 3] + ayuv[4 * (i + 5) + 3] + 1) >> 1;
+
+#if 0
+ a0 = TO_10 (ayuv[4 * (i + 0) + 2]) | (TO_10 (ayuv[4 * (i + 0) + 1]) << 10)
+ | (TO_10 (ayuv[4 * (i + 0) + 3]) << 20);
+ a1 = TO_10 (ayuv[4 * (i + 1) + 1]) | (TO_10 (ayuv[4 * (i + 2) + 2]) << 10)
+ | (TO_10 (ayuv[4 * (i + 2) + 1]) << 20);
+ a2 = TO_10 (ayuv[4 * (i + 2) + 3]) | (TO_10 (ayuv[4 * (i + 3) + 1]) << 10)
+ | (TO_10 (ayuv[4 * (i + 4) + 2]) << 20);
+ a3 = TO_10 (ayuv[4 * (i + 4) + 1]) | (TO_10 (ayuv[4 * (i + 4) + 3]) << 10)
+ | (TO_10 (ayuv[4 * (i + 5) + 1]) << 20);
+#endif
+
+ a0 = TO_10 (u0) | (TO_10 (y0) << 10) | (TO_10 (v0) << 20);
+ a1 = TO_10 (y1) | (TO_10 (u1) << 10) | (TO_10 (y2) << 20);
+ a2 = TO_10 (v1) | (TO_10 (y3) << 10) | (TO_10 (u2) << 20);
+ a3 = TO_10 (y4) | (TO_10 (v2) << 10) | (TO_10 (y5) << 20);
+
+ GST_WRITE_UINT32_LE (Y + (i / 6) * 16 + 0, a0);
+ GST_WRITE_UINT32_LE (Y + (i / 6) * 16 + 4, a1);
+ GST_WRITE_UINT32_LE (Y + (i / 6) * 16 + 8, a2);
+ GST_WRITE_UINT32_LE (Y + (i / 6) * 16 + 12, a3);
+ }
+}
+
+static void
+convert_hline_UYVP (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i += 2) {
+ guint16 y0, y1;
+ guint16 u0;
+ guint16 v0;
+
+ y0 = ayuv[4 * (i + 0) + 1];
+ y1 = ayuv[4 * (i + 1) + 1];
+ u0 = (ayuv[4 * (i + 0) + 2] + ayuv[4 * (i + 1) + 2] + 1) >> 1;
+ v0 = (ayuv[4 * (i + 0) + 3] + ayuv[4 * (i + 1) + 3] + 1) >> 1;
+
+ Y[(i / 2) * 5 + 0] = u0;
+ Y[(i / 2) * 5 + 1] = y0 >> 2;
+ Y[(i / 2) * 5 + 2] = (y0 << 6) | (v0 >> 4);
+ Y[(i / 2) * 5 + 3] = (v0 << 4) | (y1 >> 2);
+ Y[(i / 2) * 5 + 4] = (y1 << 2);
+ }
+}
+
+static void
+convert_hline_YUY2 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i * 2] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ U[4 * i] = (ayuv[4 * (i * 2) + 2] + ayuv[4 * (i * 2 + 1) + 2] + 1) >> 1;
+ V[4 * i] = (ayuv[4 * (i * 2) + 3] + ayuv[4 * (i * 2 + 1) + 3] + 1) >> 1;
+ }
+}
+
+static void
+convert_hline_AY64 (paintinfo * p, int y)
+{
+ int i;
+ guint16 *ayuv16 = (guint16 *) (p->ap + y * p->ystride);
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ GST_WRITE_UINT16_LE (ayuv16 + i * 4 + 0, TO_16 (ayuv[4 * i + 0]));
+ GST_WRITE_UINT16_LE (ayuv16 + i * 4 + 1, TO_16 (ayuv[4 * i + 1]));
+ GST_WRITE_UINT16_LE (ayuv16 + i * 4 + 2, TO_16 (ayuv[4 * i + 2]));
+ GST_WRITE_UINT16_LE (ayuv16 + i * 4 + 3, TO_16 (ayuv[4 * i + 3]));
+ }
+}
+
+#ifdef disabled
+static void
+paint_setup_IYU2 (paintinfo * p, GstVideoFrame * frame)
+{
+ /* untested */
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->up + 1;
+ p->vp = p->up + 2;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_IYU2 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i * 3] = ayuv[4 * i + 1];
+ U[i * 3] = ayuv[4 * i + 2];
+ V[i * 3] = ayuv[4 * i + 3];
+ }
+}
+#endif
+
+static void
+paint_setup_Y41B (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_Y41B (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 3) / 4; i++) {
+ U[i] = (ayuv[4 * (i * 4) + 2] + ayuv[4 * (i * 4 + 1) + 2] +
+ ayuv[4 * (i * 4 + 2) + 2] + ayuv[4 * (i * 4 + 3) + 2] + 2) >> 2;
+ V[i] = (ayuv[4 * (i * 4) + 3] + ayuv[4 * (i * 4 + 1) + 3] +
+ ayuv[4 * (i * 4 + 2) + 3] + ayuv[4 * (i * 4 + 3) + 3] + 2) >> 2;
+ }
+}
+
+static void
+paint_setup_Y42B (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_Y42B (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 1) / 2; i++) {
+ U[i] = (ayuv[4 * (i * 2) + 2] + ayuv[4 * (i * 2 + 1) + 2] + 1) >> 1;
+ V[i] = (ayuv[4 * (i * 2) + 3] + ayuv[4 * (i * 2 + 1) + 3] + 1) >> 1;
+ }
+}
+
+static void
+paint_setup_Y444 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_Y444 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + y * p->ustride;
+ guint8 *V = p->vp + y * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ U[i] = ayuv[4 * i + 2];
+ V[i] = ayuv[4 * i + 3];
+ }
+}
+
+static void
+paint_setup_Y800 (paintinfo * p, GstVideoFrame * frame)
+{
+ /* untested */
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_Y800 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+}
+
+static void
+paint_setup_YVU9 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_YUV9 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
+ p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_YUV9 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *U = p->up + (y / 4) * p->ustride;
+ guint8 *V = p->vp + (y / 4) * p->vstride;
+ guint8 *ayuv = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+ for (i = 0; i < (p->width + 3) / 4; i++) {
+ U[i] = (ayuv[4 * (i * 4) + 2] + ayuv[4 * (i * 4 + 1) + 2] +
+ ayuv[4 * (i * 4 + 2) + 2] + ayuv[4 * (i * 4 + 3) + 2] + 2) >> 2;
+ V[i] = (ayuv[4 * (i * 4) + 3] + ayuv[4 * (i * 4 + 1) + 3] +
+ ayuv[4 * (i * 4 + 2) + 3] + ayuv[4 * (i * 4 + 3) + 3] + 2) >> 2;
+ }
+}
+
+static void
+paint_setup_ARGB8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ paint_setup_xRGB8888 (p, frame);
+}
+
+static void
+paint_setup_ABGR8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ paint_setup_xBGR8888 (p, frame);
+}
+
+static void
+paint_setup_RGBA8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ paint_setup_RGBx8888 (p, frame);
+}
+
+static void
+paint_setup_BGRA8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ paint_setup_BGRx8888 (p, frame);
+}
+
+static void
+paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 1;
+ p->up = p->ap + 2;
+ p->vp = p->ap + 3;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 3;
+ p->up = p->ap + 2;
+ p->vp = p->ap + 1;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->yp + 1;
+ p->vp = p->yp + 2;
+ p->ap = p->yp + 3;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->vp + 1;
+ p->yp = p->vp + 2;
+ p->ap = p->vp + 3;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->yp + 1;
+ p->vp = p->yp + 2;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->up = p->vp + 1;
+ p->yp = p->vp + 2;
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+paint_setup_ARGB64 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->yp = p->ap + 2;
+ p->up = p->ap + 4;
+ p->yp = p->ap + 6;
+ p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ystride = p->astride;
+ p->ustride = p->astride;
+ p->vstride = p->astride;
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_str4 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *A = p->ap + y * p->ystride;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *G = p->up + y * p->ustride;
+ guint8 *B = p->vp + y * p->vstride;
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ A[4 * i] = 0xff;
+ R[4 * i] = argb[4 * i + 1];
+ G[4 * i] = argb[4 * i + 2];
+ B[4 * i] = argb[4 * i + 3];
+ }
+}
+
+static void
+convert_hline_astr4 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *A = p->ap + y * p->ystride;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *G = p->up + y * p->ustride;
+ guint8 *B = p->vp + y * p->vstride;
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ A[4 * i] = argb[4 * i + 0];
+ R[4 * i] = argb[4 * i + 1];
+ G[4 * i] = argb[4 * i + 2];
+ B[4 * i] = argb[4 * i + 3];
+ }
+}
+
+static void
+convert_hline_astr8 (paintinfo * p, int y)
+{
+ int i;
+ guint16 *A = (guint16 *) (p->ap + y * p->ystride);
+ guint16 *R = (guint16 *) (p->yp + y * p->ystride);
+ guint16 *G = (guint16 *) (p->up + y * p->ustride);
+ guint16 *B = (guint16 *) (p->vp + y * p->vstride);
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ A[4 * i] = TO_16 (argb[4 * i + 0]);
+ R[4 * i] = TO_16 (argb[4 * i + 1]);
+ G[4 * i] = TO_16 (argb[4 * i + 2]);
+ B[4 * i] = TO_16 (argb[4 * i + 3]);
+ }
+}
+
+static void
+convert_hline_str3 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *G = p->up + y * p->ustride;
+ guint8 *B = p->vp + y * p->vstride;
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ R[3 * i] = argb[4 * i + 1];
+ G[3 * i] = argb[4 * i + 2];
+ B[3 * i] = argb[4 * i + 3];
+ }
+}
+
+static void
+paint_setup_RGB565 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_RGB565 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ guint16 value = ((argb[4 * i + 1] & 0xf8) << 8) |
+ ((argb[4 * i + 2] & 0xfc) << 3) | ((argb[4 * i + 3] & 0xf8) >> 3);
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ GST_WRITE_UINT16_LE (R + 2 * i, value);
+#else
+ GST_WRITE_UINT16_BE (R + 2 * i, value);
+#endif
+ }
+}
+
+static void
+convert_hline_xRGB1555 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *argb = p->tmpline;
+
+ for (i = 0; i < p->width; i++) {
+ guint16 value = ((argb[4 * i + 1] & 0xf8) << 7) |
+ ((argb[4 * i + 2] & 0xf8) << 2) | ((argb[4 * i + 3] & 0xf8) >> 3);
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ GST_WRITE_UINT16_LE (R + 2 * i, value);
+#else
+ GST_WRITE_UINT16_BE (R + 2 * i, value);
+#endif
+ }
+}
+
+static void
+paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->ustride = p->ystride;
+ p->vstride = p->ystride;
+ p->size = frame->info.size;
+}
+
+
+static void
+paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->ustride = GST_ROUND_UP_4 (p->width);
+ p->vstride = GST_ROUND_UP_4 (p->width);
+ p->size = p->ystride * p->height;
+ p->bayer_x_invert = 0;
+ p->bayer_y_invert = 0;
+}
+
+static void
+paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->ustride = GST_ROUND_UP_4 (p->width);
+ p->vstride = GST_ROUND_UP_4 (p->width);
+ p->size = p->ystride * p->height;
+ p->bayer_x_invert = 1;
+ p->bayer_y_invert = 1;
+}
+
+static void
+paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->ustride = GST_ROUND_UP_4 (p->width);
+ p->vstride = GST_ROUND_UP_4 (p->width);
+ p->size = p->ystride * p->height;
+ p->bayer_x_invert = 0;
+ p->bayer_y_invert = 1;
+}
+
+static void
+paint_setup_bayer_gbrg (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->ustride = GST_ROUND_UP_4 (p->width);
+ p->vstride = GST_ROUND_UP_4 (p->width);
+ p->size = p->ystride * p->height;
+ p->bayer_x_invert = 1;
+ p->bayer_y_invert = 0;
+}
+
+static void
+convert_hline_bayer (paintinfo * p, int y)
+{
+ int i;
+ guint8 *R = p->yp + y * p->ystride;
+ guint8 *argb = p->tmpline;
+ int x_inv = p->bayer_x_invert;
+ int y_inv = p->bayer_y_invert;
+
+ if ((y ^ y_inv) & 1) {
+ for (i = 0; i < p->width; i++) {
+ if ((i ^ x_inv) & 1) {
+ R[i] = argb[4 * i + 1];
+ } else {
+ R[i] = argb[4 * i + 2];
+ }
+ }
+ } else {
+ for (i = 0; i < p->width; i++) {
+ if ((i ^ x_inv) & 1) {
+ R[i] = argb[4 * i + 2];
+ } else {
+ R[i] = argb[4 * i + 3];
+ }
+ }
+ }
+}
+
+static void
+paint_setup_GRAY8 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_GRAY8 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ /* FIXME this should use gray, not YUV */
+ for (i = 0; i < p->width; i++) {
+ Y[i] = ayuv[4 * i + 1];
+ }
+}
+
+static void
+paint_setup_GRAY16 (paintinfo * p, GstVideoFrame * frame)
+{
+ p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
+ p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
+ p->size = frame->info.size;
+}
+
+static void
+convert_hline_GRAY16 (paintinfo * p, int y)
+{
+ int i;
+ guint8 *Y = p->yp + y * p->ystride;
+ guint8 *ayuv = p->tmpline;
+
+ /* FIXME this should use gray, not YUV */
+ for (i = 0; i < p->width; i++) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ GST_WRITE_UINT16_LE (Y + i * 2, ayuv[4 * i + 1] << 8);
+#else
+ GST_WRITE_UINT16_BE (Y + i * 2, ayuv[4 * i + 1] << 8);
+#endif
+ }
+}
diff --git a/gst/videotestsrc/videotestsrc.h b/gst/videotestsrc/videotestsrc.h
new file mode 100644
index 0000000..ee1f4f2
--- /dev/null
+++ b/gst/videotestsrc/videotestsrc.h
@@ -0,0 +1,125 @@
+/* GStreamer
+ * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __VIDEO_TEST_SRC_H__
+#define __VIDEO_TEST_SRC_H__
+
+#include <glib.h>
+
+enum {
+ VTS_YUV,
+ VTS_RGB,
+ VTS_GRAY,
+ VTS_BAYER
+};
+
+enum {
+ VTS_BAYER_BGGR,
+ VTS_BAYER_RGGB,
+ VTS_BAYER_GRBG,
+ VTS_BAYER_GBRG
+};
+
+struct vts_color_struct {
+ guint8 Y, U, V, A;
+ guint8 R, G, B;
+ guint16 gray;
+};
+
+
+typedef struct paintinfo_struct paintinfo;
+struct paintinfo_struct
+{
+ unsigned char *ap, *yp, *up, *vp; /* pointers to first byte of each component
+ * for both packed/planar YUV and RGB */
+ int astride, ystride, ustride, vstride;
+
+ int size; /* size of a frame */
+ int width;
+ int height;
+ const struct vts_color_struct *colors;
+ const struct vts_color_struct *color;
+ /* const struct vts_color_struct *color; */
+ void (*paint_hline) (paintinfo * p, int x, int y, int w);
+ void (*paint_tmpline) (paintinfo * p, int x, int w);
+ void (*convert_tmpline) (paintinfo * p, int y);
+ int x_offset;
+
+ int bayer_x_invert;
+ int bayer_y_invert;
+
+ guint8 *tmpline;
+ guint8 *tmpline2;
+ guint8 *tmpline_u8;
+
+ struct vts_color_struct foreground_color;
+ struct vts_color_struct background_color;
+};
+
+struct format_list_struct
+{
+ int type;
+ const char *format;
+ const char *name;
+ int bitspp;
+ void (*paint_setup) (paintinfo * p, GstVideoFrame *frame);
+ void (*convert_hline) (paintinfo * p, int y);
+ int depth;
+ unsigned int red_mask;
+ unsigned int green_mask;
+ unsigned int blue_mask;
+ unsigned int alpha_mask;
+};
+
+struct format_list_struct *
+ paintrect_find_format (const gchar *find_format);
+struct format_list_struct *
+ paintrect_find_name (const char *name);
+struct format_list_struct *
+ paintinfo_find_by_structure (const GstStructure *structure);
+GstStructure *
+ paint_get_structure (struct format_list_struct *format);
+
+int gst_video_test_src_get_size (GstVideoTestSrc * v, int w, int h);
+void gst_video_test_src_smpte (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_smpte75 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_snow (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_black (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_white (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_red (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_green (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_blue (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_solid (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_blink (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_checkers1 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_checkers2 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_checkers4 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_checkers8 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_circular (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_zoneplate (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_gamut (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_chromazoneplate (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_ball (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_smpte100 (GstVideoTestSrc * v, GstVideoFrame *frame);
+void gst_video_test_src_bar (GstVideoTestSrc * v, GstVideoFrame *frame);
+
+extern struct format_list_struct format_list[];
+extern int n_formats;
+
+#endif
diff --git a/gst/volume/Makefile.am b/gst/volume/Makefile.am
new file mode 100644
index 0000000..d750912
--- /dev/null
+++ b/gst/volume/Makefile.am
@@ -0,0 +1,34 @@
+plugin_LTLIBRARIES = libgstvolume.la
+
+ORC_SOURCE=gstvolumeorc
+include $(top_srcdir)/common/orc.mak
+
+libgstvolume_la_SOURCES = gstvolume.c
+nodist_libgstvolume_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvolume_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvolume_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS)
+libgstvolume_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstvolume.h
+
+Android.mk: Makefile.am $(BUILT_SOURCES)
+ androgenizer \
+ -:PROJECT libgstvolume -:SHARED libgstvolume \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvolume_la_SOURCES) \
+ $(nodist_libgstvolume_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvolume_la_CFLAGS) \
+ -:LDFLAGS $(libgstvolume_la_LDFLAGS) \
+ $(libgstvolume_la_LIBADD) \
+ -ldl \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+ > $@
diff --git a/gst/volume/Makefile.in b/gst/volume/Makefile.in
new file mode 100644
index 0000000..c833ab5
--- /dev/null
+++ b/gst/volume/Makefile.in
@@ -0,0 +1,868 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/volume
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstvolume_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstvolume_la_OBJECTS = libgstvolume_la-gstvolume.lo
+am__objects_1 = libgstvolume_la-tmp-orc.lo
+nodist_libgstvolume_la_OBJECTS = $(am__objects_1)
+libgstvolume_la_OBJECTS = $(am_libgstvolume_la_OBJECTS) \
+ $(nodist_libgstvolume_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstvolume_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstvolume_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstvolume_la_CFLAGS) $(CFLAGS) \
+ $(libgstvolume_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstvolume_la_SOURCES) $(nodist_libgstvolume_la_SOURCES)
+DIST_SOURCES = $(libgstvolume_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstvolume.la
+ORC_SOURCE = gstvolumeorc
+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 $@";
+libgstvolume_la_SOURCES = gstvolume.c
+nodist_libgstvolume_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
+libgstvolume_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvolume_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_LIBS) \
+ $(ORC_LIBS)
+
+libgstvolume_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = gstvolume.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/volume/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/volume/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
+libgstvolume.la: $(libgstvolume_la_OBJECTS) $(libgstvolume_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstvolume_la_LINK) -rpath $(plugindir) $(libgstvolume_la_OBJECTS) $(libgstvolume_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvolume_la-gstvolume.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvolume_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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstvolume_la-gstvolume.lo: gstvolume.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvolume_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvolume_la_CFLAGS) $(CFLAGS) -MT libgstvolume_la-gstvolume.lo -MD -MP -MF $(DEPDIR)/libgstvolume_la-gstvolume.Tpo -c -o libgstvolume_la-gstvolume.lo `test -f 'gstvolume.c' || echo '$(srcdir)/'`gstvolume.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvolume_la-gstvolume.Tpo $(DEPDIR)/libgstvolume_la-gstvolume.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvolume.c' object='libgstvolume_la-gstvolume.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvolume_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvolume_la_CFLAGS) $(CFLAGS) -c -o libgstvolume_la-gstvolume.lo `test -f 'gstvolume.c' || echo '$(srcdir)/'`gstvolume.c
+
+libgstvolume_la-tmp-orc.lo: tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvolume_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvolume_la_CFLAGS) $(CFLAGS) -MT libgstvolume_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvolume_la-tmp-orc.Tpo -c -o libgstvolume_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvolume_la-tmp-orc.Tpo $(DEPDIR)/libgstvolume_la-tmp-orc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tmp-orc.c' object='libgstvolume_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvolume_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvolume_la_CFLAGS) $(CFLAGS) -c -o libgstvolume_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 libgstvolume -:SHARED libgstvolume \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstvolume_la_SOURCES) \
+ $(nodist_libgstvolume_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvolume_la_CFLAGS) \
+ -:LDFLAGS $(libgstvolume_la_LDFLAGS) \
+ $(libgstvolume_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/volume/gstvolume.c b/gst/volume/gstvolume.c
new file mode 100644
index 0000000..9910da4
--- /dev/null
+++ b/gst/volume/gstvolume.c
@@ -0,0 +1,980 @@
+/* -*- c-basic-offset: 2 -*-
+ * vi:si:et:sw=2:sts=8:ts=8:expandtab
+ *
+ * GStreamer
+ * Copyright (C) 1999-2001 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-volume
+ *
+ * The volume element changes the volume of the audio data.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v -m audiotestsrc ! volume volume=0.5 ! level ! fakesink silent=TRUE
+ * ]| This pipeline shows that the level of audiotestsrc has been halved
+ * (peak values are around -6 dB and RMS around -9 dB) compared to
+ * the same pipeline without the volume element.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/audio/audio.h>
+#include <gst/interfaces/mixer.h>
+#include <gst/controller/gstcontroller.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudiofilter.h>
+
+#ifdef HAVE_ORC
+#include <orc/orcfunctions.h>
+#else
+#define orc_memset memset
+#endif
+
+#include "gstvolumeorc.h"
+#include "gstvolume.h"
+
+/* some defines for audio processing */
+/* the volume factor is a range from 0.0 to (arbitrary) VOLUME_MAX_DOUBLE = 10.0
+ * we map 1.0 to VOLUME_UNITY_INT*
+ */
+#define VOLUME_UNITY_INT8 8 /* internal int for unity 2^(8-5) */
+#define VOLUME_UNITY_INT8_BIT_SHIFT 3 /* number of bits to shift for unity */
+#define VOLUME_UNITY_INT16 2048 /* internal int for unity 2^(16-5) */
+#define VOLUME_UNITY_INT16_BIT_SHIFT 11 /* number of bits to shift for unity */
+#define VOLUME_UNITY_INT24 524288 /* internal int for unity 2^(24-5) */
+#define VOLUME_UNITY_INT24_BIT_SHIFT 19 /* number of bits to shift for unity */
+#define VOLUME_UNITY_INT32 134217728 /* internal int for unity 2^(32-5) */
+#define VOLUME_UNITY_INT32_BIT_SHIFT 27
+#define VOLUME_MAX_DOUBLE 10.0
+#define VOLUME_MAX_INT8 G_MAXINT8
+#define VOLUME_MIN_INT8 G_MININT8
+#define VOLUME_MAX_INT16 G_MAXINT16
+#define VOLUME_MIN_INT16 G_MININT16
+#define VOLUME_MAX_INT24 8388607
+#define VOLUME_MIN_INT24 -8388608
+#define VOLUME_MAX_INT32 G_MAXINT32
+#define VOLUME_MIN_INT32 G_MININT32
+
+/* number of steps we use for the mixer interface to go from 0.0 to 1.0 */
+# define VOLUME_STEPS 100
+
+#define GST_CAT_DEFAULT gst_volume_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_PROP_MUTE FALSE
+#define DEFAULT_PROP_VOLUME 1.0
+
+enum
+{
+ PROP_0,
+ PROP_MUTE,
+ PROP_VOLUME
+};
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define ALLOWED_CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ F32LE, F64LE, S8, S16LE, S24LE, S32LE }")
+#else
+#define ALLOWED_CAPS \
+ GST_AUDIO_CAPS_MAKE ("{ F32BE, F64BE, S8, S16BE, S24BE, S32BE }")
+#endif
+
+static void gst_volume_mixer_init (GstMixerClass * iface);
+
+#define gst_volume_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstVolume, gst_volume,
+ GST_TYPE_AUDIO_FILTER,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_MIXER, gst_volume_mixer_init);
+ G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL));
+
+static void volume_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void volume_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void volume_before_transform (GstBaseTransform * base,
+ GstBuffer * buffer);
+static GstFlowReturn volume_transform_ip (GstBaseTransform * base,
+ GstBuffer * outbuf);
+static gboolean volume_stop (GstBaseTransform * base);
+static gboolean volume_setup (GstAudioFilter * filter,
+ const GstAudioInfo * info);
+
+static void volume_process_double (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_double (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes);
+static void volume_process_float (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_float (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes);
+static void volume_process_int32 (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_int32_clamp (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_int32_clamp (GstVolume * self,
+ gpointer bytes, gdouble * volume, guint channels, guint n_bytes);
+static void volume_process_int24 (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_int24_clamp (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_int24_clamp (GstVolume * self,
+ gpointer bytes, gdouble * volume, guint channels, guint n_bytes);
+static void volume_process_int16 (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_int16_clamp (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_int16_clamp (GstVolume * self,
+ gpointer bytes, gdouble * volume, guint channels, guint n_bytes);
+static void volume_process_int8 (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_int8_clamp (GstVolume * self, gpointer bytes,
+ guint n_bytes);
+static void volume_process_controlled_int8_clamp (GstVolume * self,
+ gpointer bytes, gdouble * volume, guint channels, guint n_bytes);
+
+
+/* helper functions */
+
+static gboolean
+volume_choose_func (GstVolume * self)
+{
+ GstAudioFilter *filter = GST_AUDIO_FILTER (self);
+ GstAudioFormat format;
+
+ self->process = NULL;
+ self->process_controlled = NULL;
+
+ format = GST_AUDIO_FORMAT_INFO_FORMAT (filter->info.finfo);
+
+ if (format == GST_AUDIO_FORMAT_UNKNOWN)
+ return FALSE;
+
+ switch (format) {
+ case GST_AUDIO_FORMAT_S32:
+ /* only clamp if the gain is greater than 1.0 */
+ if (self->current_vol_i32 > VOLUME_UNITY_INT32) {
+ self->process = volume_process_int32_clamp;
+ } else {
+ self->process = volume_process_int32;
+ }
+ self->process_controlled = volume_process_controlled_int32_clamp;
+ break;
+ case GST_AUDIO_FORMAT_S24:
+ /* only clamp if the gain is greater than 1.0 */
+ if (self->current_vol_i24 > VOLUME_UNITY_INT24) {
+ self->process = volume_process_int24_clamp;
+ } else {
+ self->process = volume_process_int24;
+ }
+ self->process_controlled = volume_process_controlled_int24_clamp;
+ break;
+ case GST_AUDIO_FORMAT_S16:
+ /* only clamp if the gain is greater than 1.0 */
+ if (self->current_vol_i16 > VOLUME_UNITY_INT16) {
+ self->process = volume_process_int16_clamp;
+ } else {
+ self->process = volume_process_int16;
+ }
+ self->process_controlled = volume_process_controlled_int16_clamp;
+ break;
+ case GST_AUDIO_FORMAT_S8:
+ /* only clamp if the gain is greater than 1.0 */
+ if (self->current_vol_i8 > VOLUME_UNITY_INT8) {
+ self->process = volume_process_int8_clamp;
+ } else {
+ self->process = volume_process_int8;
+ }
+ self->process_controlled = volume_process_controlled_int8_clamp;
+ break;
+ case GST_AUDIO_FORMAT_F32:
+ self->process = volume_process_float;
+ self->process_controlled = volume_process_controlled_float;
+ break;
+ case GST_AUDIO_FORMAT_F64:
+ self->process = volume_process_double;
+ self->process_controlled = volume_process_controlled_double;
+ break;
+ default:
+ break;
+ }
+
+ return (self->process != NULL);
+}
+
+static gboolean
+volume_update_volume (GstVolume * self, gfloat volume, gboolean mute)
+{
+ gboolean passthrough;
+ gboolean res;
+ GstController *controller;
+
+ GST_DEBUG_OBJECT (self, "configure mute %d, volume %f", mute, volume);
+
+ if (mute) {
+ self->current_mute = TRUE;
+ self->current_volume = 0.0;
+
+ self->current_vol_i8 = 0;
+ self->current_vol_i16 = 0;
+ self->current_vol_i24 = 0;
+ self->current_vol_i32 = 0;
+
+ passthrough = FALSE;
+ } else {
+ self->current_mute = FALSE;
+ self->current_volume = volume;
+
+ self->current_vol_i8 = volume * VOLUME_UNITY_INT8;
+ self->current_vol_i16 = volume * VOLUME_UNITY_INT16;
+ self->current_vol_i24 = volume * VOLUME_UNITY_INT24;
+ self->current_vol_i32 = volume * VOLUME_UNITY_INT32;
+
+ passthrough = (self->current_vol_i16 == VOLUME_UNITY_INT16);
+ }
+
+ /* If a controller is used, never use passthrough mode
+ * because the property can change from 1.0 to something
+ * else in the middle of a buffer.
+ */
+ controller = gst_object_get_controller (G_OBJECT (self));
+ passthrough = passthrough && (controller == NULL);
+
+ GST_DEBUG_OBJECT (self, "set passthrough %d", passthrough);
+
+ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), passthrough);
+
+ res = self->negotiated = volume_choose_func (self);
+
+ return res;
+}
+
+/* Mixer interface */
+
+static const GList *
+gst_volume_list_tracks (GstMixer * mixer)
+{
+ GstVolume *self = GST_VOLUME (mixer);
+
+ g_return_val_if_fail (self != NULL, NULL);
+ g_return_val_if_fail (GST_IS_VOLUME (self), NULL);
+
+ return self->tracklist;
+}
+
+static void
+gst_volume_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
+{
+ GstVolume *self = GST_VOLUME (mixer);
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (GST_IS_VOLUME (self));
+
+ GST_OBJECT_LOCK (self);
+ self->volume = (gfloat) volumes[0] / VOLUME_STEPS;
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_volume_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
+{
+ GstVolume *self = GST_VOLUME (mixer);
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (GST_IS_VOLUME (self));
+
+ GST_OBJECT_LOCK (self);
+ volumes[0] = (gint) self->volume * VOLUME_STEPS;
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_volume_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
+{
+ GstVolume *self = GST_VOLUME (mixer);
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (GST_IS_VOLUME (self));
+
+ GST_OBJECT_LOCK (self);
+ self->mute = mute;
+ GST_OBJECT_UNLOCK (self);
+}
+
+static void
+gst_volume_mixer_init (GstMixerClass * klass)
+{
+ GST_MIXER_TYPE (klass) = GST_MIXER_SOFTWARE;
+
+ /* default virtual functions */
+ klass->list_tracks = gst_volume_list_tracks;
+ klass->set_volume = gst_volume_set_volume;
+ klass->get_volume = gst_volume_get_volume;
+ klass->set_mute = gst_volume_set_mute;
+}
+
+/* Element class */
+
+static void
+gst_volume_dispose (GObject * object)
+{
+ GstVolume *volume = GST_VOLUME (object);
+
+ if (volume->tracklist) {
+ if (volume->tracklist->data)
+ g_object_unref (volume->tracklist->data);
+ g_list_free (volume->tracklist);
+ volume->tracklist = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_volume_class_init (GstVolumeClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *element_class;
+ GstBaseTransformClass *trans_class;
+ GstAudioFilterClass *filter_class;
+ GstCaps *caps;
+
+ gobject_class = (GObjectClass *) klass;
+ element_class = (GstElementClass *) klass;
+ trans_class = (GstBaseTransformClass *) klass;
+ filter_class = (GstAudioFilterClass *) (klass);
+
+ gobject_class->set_property = volume_set_property;
+ gobject_class->get_property = volume_get_property;
+ gobject_class->dispose = gst_volume_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_MUTE,
+ g_param_spec_boolean ("mute", "Mute", "mute channel",
+ DEFAULT_PROP_MUTE,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_VOLUME,
+ g_param_spec_double ("volume", "Volume", "volume factor, 1.0=100%",
+ 0.0, VOLUME_MAX_DOUBLE, DEFAULT_PROP_VOLUME,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (element_class, "Volume",
+ "Filter/Effect/Audio",
+ "Set volume on audio/raw streams", "Andy Wingo <wingo@pobox.com>");
+
+ caps = gst_caps_from_string (ALLOWED_CAPS);
+ gst_audio_filter_class_add_pad_templates (filter_class, caps);
+ gst_caps_unref (caps);
+
+ trans_class->before_transform = GST_DEBUG_FUNCPTR (volume_before_transform);
+ trans_class->transform_ip = GST_DEBUG_FUNCPTR (volume_transform_ip);
+ trans_class->stop = GST_DEBUG_FUNCPTR (volume_stop);
+ filter_class->setup = GST_DEBUG_FUNCPTR (volume_setup);
+}
+
+static void
+gst_volume_init (GstVolume * self)
+{
+ GstMixerTrack *track = NULL;
+
+ self->mute = DEFAULT_PROP_MUTE;;
+ self->volume = DEFAULT_PROP_VOLUME;
+
+ self->tracklist = NULL;
+ self->negotiated = FALSE;
+
+ track = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
+
+ if (GST_IS_MIXER_TRACK (track)) {
+ track->label = g_strdup ("volume");
+ track->num_channels = 1;
+ track->min_volume = 0;
+ track->max_volume = VOLUME_STEPS;
+ track->flags = GST_MIXER_TRACK_SOFTWARE;
+ self->tracklist = g_list_append (self->tracklist, track);
+ }
+
+ gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (self), TRUE);
+}
+
+static void
+volume_process_double (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gdouble *data = (gdouble *) bytes;
+ guint num_samples = n_bytes / sizeof (gdouble);
+
+ orc_scalarmultiply_f64_ns (data, self->current_volume, num_samples);
+}
+
+static void
+volume_process_controlled_double (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gdouble *data = (gdouble *) bytes;
+ guint num_samples = n_bytes / (sizeof (gdouble) * channels);
+ guint i, j;
+ gdouble vol;
+
+ if (channels == 1) {
+ orc_process_controlled_f64_1ch (data, volume, num_samples);
+ } else {
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ *data++ *= vol;
+ }
+ }
+ }
+}
+
+static void
+volume_process_float (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gfloat *data = (gfloat *) bytes;
+ guint num_samples = n_bytes / sizeof (gfloat);
+
+ orc_scalarmultiply_f32_ns (data, self->current_volume, num_samples);
+}
+
+static void
+volume_process_controlled_float (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gfloat *data = (gfloat *) bytes;
+ guint num_samples = n_bytes / (sizeof (gfloat) * channels);
+ guint i, j;
+ gdouble vol;
+
+ if (channels == 1) {
+ orc_process_controlled_f32_1ch (data, volume, num_samples);
+ } else if (channels == 2) {
+ orc_process_controlled_f32_2ch (data, volume, num_samples);
+ } else {
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ *data++ *= vol;
+ }
+ }
+ }
+}
+
+static void
+volume_process_int32 (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint32 *data = (gint32 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT32_BIT_SHIFT == 27);
+ orc_process_int32 (data, self->current_vol_i32, num_samples);
+}
+
+static void
+volume_process_int32_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint32 *data = (gint32 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT32_BIT_SHIFT == 27);
+
+ orc_process_int32_clamp (data, self->current_vol_i32, num_samples);
+}
+
+static void
+volume_process_controlled_int32_clamp (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gint32 *data = (gint32 *) bytes;
+ guint i, j;
+ guint num_samples = n_bytes / (sizeof (gint32) * channels);
+ gdouble vol, val;
+
+ if (channels == 1) {
+ orc_process_controlled_int32_1ch (data, volume, num_samples);
+ } else {
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ val = *data * vol;
+ *data++ = (gint32) CLAMP (val, VOLUME_MIN_INT32, VOLUME_MAX_INT32);
+ }
+ }
+ }
+}
+
+#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
+#define get_unaligned_i24(_x) ( (((guint8*)_x)[0]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[2]) << 16) )
+
+#define write_unaligned_u24(_x,samp) \
+G_STMT_START { \
+ *(_x)++ = samp & 0xFF; \
+ *(_x)++ = (samp >> 8) & 0xFF; \
+ *(_x)++ = (samp >> 16) & 0xFF; \
+} G_STMT_END
+
+#else /* BIG ENDIAN */
+#define get_unaligned_i24(_x) ( (((guint8*)_x)[2]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[0]) << 16) )
+#define write_unaligned_u24(_x,samp) \
+G_STMT_START { \
+ *(_x)++ = (samp >> 16) & 0xFF; \
+ *(_x)++ = (samp >> 8) & 0xFF; \
+ *(_x)++ = samp & 0xFF; \
+} G_STMT_END
+#endif
+
+static void
+volume_process_int24 (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes; /* treat the data as a byte stream */
+ guint i, num_samples;
+ guint32 samp;
+ gint64 val;
+
+ num_samples = n_bytes / (sizeof (gint8) * 3);
+ for (i = 0; i < num_samples; i++) {
+ samp = get_unaligned_i24 (data);
+
+ val = (gint32) samp;
+ val =
+ (((gint64) self->current_vol_i24 *
+ val) >> VOLUME_UNITY_INT24_BIT_SHIFT);
+ samp = (guint32) val;
+
+ /* write the value back into the stream */
+ write_unaligned_u24 (data, samp);
+ }
+}
+
+static void
+volume_process_int24_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes; /* treat the data as a byte stream */
+ guint i, num_samples;
+ guint32 samp;
+ gint64 val;
+
+ num_samples = n_bytes / (sizeof (gint8) * 3);
+ for (i = 0; i < num_samples; i++) {
+ samp = get_unaligned_i24 (data);
+
+ val = (gint32) samp;
+ val =
+ (((gint64) self->current_vol_i24 *
+ val) >> VOLUME_UNITY_INT24_BIT_SHIFT);
+ samp = (guint32) CLAMP (val, VOLUME_MIN_INT24, VOLUME_MAX_INT24);
+
+ /* write the value back into the stream */
+ write_unaligned_u24 (data, samp);
+ }
+}
+
+static void
+volume_process_controlled_int24_clamp (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes; /* treat the data as a byte stream */
+ guint i, j;
+ guint num_samples = n_bytes / (sizeof (gint8) * 3 * channels);
+ gdouble vol, val;
+
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ val = get_unaligned_i24 (data) * vol;
+ val = CLAMP (val, VOLUME_MIN_INT24, VOLUME_MAX_INT24);
+ write_unaligned_u24 (data, (gint32) val);
+ }
+ }
+}
+
+static void
+volume_process_int16 (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint16 *data = (gint16 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint16);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 11);
+
+ orc_process_int16 (data, self->current_vol_i16, num_samples);
+}
+
+static void
+volume_process_int16_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint16 *data = (gint16 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint16);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 11);
+
+ orc_process_int16_clamp (data, self->current_vol_i16, num_samples);
+}
+
+static void
+volume_process_controlled_int16_clamp (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gint16 *data = (gint16 *) bytes;
+ guint i, j;
+ guint num_samples = n_bytes / (sizeof (gint16) * channels);
+ gdouble vol, val;
+
+ if (channels == 1) {
+ orc_process_controlled_int16_1ch (data, volume, num_samples);
+ } else if (channels == 2) {
+ orc_process_controlled_int16_2ch (data, volume, num_samples);
+ } else {
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ val = *data * vol;
+ *data++ = (gint16) CLAMP (val, VOLUME_MIN_INT16, VOLUME_MAX_INT16);
+ }
+ }
+ }
+}
+
+static void
+volume_process_int8 (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint8);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 3);
+
+ orc_process_int8 (data, self->current_vol_i8, num_samples);
+}
+
+static void
+volume_process_int8_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes;
+ guint num_samples = n_bytes / sizeof (gint8);
+
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 3);
+
+ orc_process_int8_clamp (data, self->current_vol_i8, num_samples);
+}
+
+static void
+volume_process_controlled_int8_clamp (GstVolume * self, gpointer bytes,
+ gdouble * volume, guint channels, guint n_bytes)
+{
+ gint8 *data = (gint8 *) bytes;
+ guint i, j;
+ guint num_samples = n_bytes / (sizeof (gint8) * channels);
+ gdouble val, vol;
+
+ if (channels == 1) {
+ orc_process_controlled_int8_1ch (data, volume, num_samples);
+ } else if (channels == 2) {
+ orc_process_controlled_int8_2ch (data, volume, num_samples);
+ } else {
+ for (i = 0; i < num_samples; i++) {
+ vol = *volume++;
+ for (j = 0; j < channels; j++) {
+ val = *data * vol;
+ *data++ = (gint8) CLAMP (val, VOLUME_MIN_INT8, VOLUME_MAX_INT8);
+ }
+ }
+ }
+}
+
+/* GstBaseTransform vmethod implementations */
+
+/* get notified of caps and plug in the correct process function */
+static gboolean
+volume_setup (GstAudioFilter * filter, const GstAudioInfo * info)
+{
+ gboolean res;
+ GstVolume *self = GST_VOLUME (filter);
+ gfloat volume;
+ gboolean mute;
+
+ GST_OBJECT_LOCK (self);
+ volume = self->volume;
+ mute = self->mute;
+ GST_OBJECT_UNLOCK (self);
+
+ res = volume_update_volume (self, volume, mute);
+ if (!res) {
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION,
+ ("Invalid incoming format"), (NULL));
+ }
+ self->negotiated = res;
+
+ return res;
+}
+
+static gboolean
+volume_stop (GstBaseTransform * base)
+{
+ GstVolume *self = GST_VOLUME (base);
+
+ g_free (self->volumes);
+ self->volumes = NULL;
+ self->volumes_count = 0;
+
+ g_free (self->mutes);
+ self->mutes = NULL;
+ self->mutes_count = 0;
+
+ return GST_CALL_PARENT_WITH_DEFAULT (GST_BASE_TRANSFORM_CLASS, stop, (base),
+ TRUE);
+}
+
+static void
+volume_before_transform (GstBaseTransform * base, GstBuffer * buffer)
+{
+ GstClockTime timestamp;
+ GstVolume *self = GST_VOLUME (base);
+ gfloat volume;
+ gboolean mute;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ timestamp =
+ gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp);
+
+ GST_DEBUG_OBJECT (base, "sync to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp))
+ gst_object_sync_values (G_OBJECT (self), timestamp);
+
+ /* get latest values */
+ GST_OBJECT_LOCK (self);
+ volume = self->volume;
+ mute = self->mute;
+ GST_OBJECT_UNLOCK (self);
+
+ if ((volume != self->current_volume) || (mute != self->current_mute)) {
+ /* the volume or mute was updated, update our internal state before
+ * we continue processing. */
+ volume_update_volume (self, volume, mute);
+ }
+}
+
+/* call the plugged-in process function for this instance
+ * needs to be done with this indirection since volume_transform is
+ * a class-global method
+ */
+static GstFlowReturn
+volume_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
+{
+ GstAudioFilter *filter = GST_AUDIO_FILTER_CAST (base);
+ GstVolume *self = GST_VOLUME (base);
+ guint8 *data;
+ gsize size;
+ GstControlSource *mute_csource, *volume_csource;
+
+ if (G_UNLIKELY (!self->negotiated))
+ goto not_negotiated;
+
+ /* don't process data in passthrough-mode */
+ if (gst_base_transform_is_passthrough (base) ||
+ GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_GAP))
+ return GST_FLOW_OK;
+
+ data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READWRITE);
+
+ mute_csource = gst_object_get_control_source (G_OBJECT (self), "mute");
+ volume_csource = gst_object_get_control_source (G_OBJECT (self), "volume");
+
+ if (mute_csource || (volume_csource && !self->current_mute)) {
+ gint rate = GST_AUDIO_INFO_RATE (&filter->info);
+ gint width = GST_AUDIO_FORMAT_INFO_WIDTH (filter->info.finfo) / 8;
+ gint channels = GST_AUDIO_INFO_CHANNELS (&filter->info);
+ guint nsamples = size / (width * channels);
+ GstClockTime interval = gst_util_uint64_scale_int (1, GST_SECOND, rate);
+ GstClockTime ts = GST_BUFFER_TIMESTAMP (outbuf);
+ gboolean use_mutes = FALSE;
+
+ ts = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, ts);
+
+ if (self->mutes_count < nsamples && mute_csource) {
+ self->mutes = g_realloc (self->mutes, sizeof (gboolean) * nsamples);
+ self->mutes_count = nsamples;
+ }
+
+ if (self->volumes_count < nsamples) {
+ self->volumes = g_realloc (self->volumes, sizeof (gdouble) * nsamples);
+ self->volumes_count = nsamples;
+ }
+
+ if (mute_csource) {
+ GstValueArray va = { "mute", nsamples, interval, (gpointer) self->mutes };
+
+ if (!gst_control_source_get_value_array (mute_csource, ts, &va))
+ goto controller_failure;
+
+ gst_object_unref (mute_csource);
+ mute_csource = NULL;
+ use_mutes = TRUE;
+ } else {
+ g_free (self->mutes);
+ self->mutes = NULL;
+ self->mutes_count = 0;
+ }
+
+ if (volume_csource) {
+ GstValueArray va =
+ { "volume", nsamples, interval, (gpointer) self->volumes };
+
+ if (!gst_control_source_get_value_array (volume_csource, ts, &va))
+ goto controller_failure;
+
+ gst_object_unref (volume_csource);
+ volume_csource = NULL;
+ } else {
+ orc_memset_f64 (self->volumes, self->current_volume, nsamples);
+ }
+
+ if (use_mutes) {
+ orc_prepare_volumes (self->volumes, self->mutes, nsamples);
+ }
+
+ self->process_controlled (self, data, self->volumes, channels, size);
+
+ return GST_FLOW_OK;
+ } else if (volume_csource) {
+ gst_object_unref (volume_csource);
+ }
+
+ if (self->current_volume == 0.0 || self->current_mute) {
+ orc_memset (data, 0, size);
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
+ } else if (self->current_volume != 1.0) {
+ self->process (self, data, size);
+ }
+ gst_buffer_unmap (outbuf, data, size);
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION,
+ ("No format was negotiated"), (NULL));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+controller_failure:
+ {
+ if (mute_csource)
+ gst_object_unref (mute_csource);
+ if (volume_csource)
+ gst_object_unref (volume_csource);
+
+ GST_ELEMENT_ERROR (self, CORE, FAILED,
+ ("Failed to get values from controller"), (NULL));
+ gst_buffer_unmap (outbuf, data, size);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+volume_set_property (GObject * object, guint prop_id, const GValue * value,
+ GParamSpec * pspec)
+{
+ GstVolume *self = GST_VOLUME (object);
+
+ switch (prop_id) {
+ case PROP_MUTE:
+ GST_OBJECT_LOCK (self);
+ self->mute = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (self);
+ break;
+ case PROP_VOLUME:
+ GST_OBJECT_LOCK (self);
+ self->volume = g_value_get_double (value);
+ GST_OBJECT_UNLOCK (self);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+volume_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstVolume *self = GST_VOLUME (object);
+
+ switch (prop_id) {
+ case PROP_MUTE:
+ GST_OBJECT_LOCK (self);
+ g_value_set_boolean (value, self->mute);
+ GST_OBJECT_UNLOCK (self);
+ break;
+ case PROP_VOLUME:
+ GST_OBJECT_LOCK (self);
+ g_value_set_double (value, self->volume);
+ GST_OBJECT_UNLOCK (self);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gst_volume_orc_init ();
+
+ /* initialize gst controller library */
+ gst_controller_init (NULL, NULL);
+
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "volume", 0, "Volume gain");
+
+ /* ref class from a thread-safe context to work around missing bit of
+ * thread-safety in GObject */
+ g_type_class_ref (GST_TYPE_MIXER_TRACK);
+
+ return gst_element_register (plugin, "volume", GST_RANK_NONE,
+ GST_TYPE_VOLUME);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "volume",
+ "plugin for controlling audio volume",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/volume/gstvolume.h b/gst/volume/gstvolume.h
new file mode 100644
index 0000000..047227d
--- /dev/null
+++ b/gst/volume/gstvolume.h
@@ -0,0 +1,88 @@
+/* -*- c-basic-offset: 2 -*-
+ * vi:si:et:sw=2:sts=8:ts=8:expandtab
+ *
+ * GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_VOLUME_H__
+#define __GST_VOLUME_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/interfaces/streamvolume.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudiofilter.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VOLUME \
+ (gst_volume_get_type())
+#define GST_VOLUME(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VOLUME,GstVolume))
+#define GST_VOLUME_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VOLUME,GstVolumeClass))
+#define GST_IS_VOLUME(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VOLUME))
+#define GST_IS_VOLUME_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VOLUME))
+
+typedef struct _GstVolume GstVolume;
+typedef struct _GstVolumeClass GstVolumeClass;
+
+/**
+ * GstVolume:
+ *
+ * Opaque data structure.
+ */
+struct _GstVolume {
+ GstAudioFilter element;
+
+ void (*process)(GstVolume*, gpointer, guint);
+ void (*process_controlled)(GstVolume*, gpointer, gdouble *, guint, guint);
+
+ gboolean mute;
+ gfloat volume;
+
+ gboolean current_mute;
+ gfloat current_volume;
+
+ gint current_vol_i32;
+ gint current_vol_i24; /* the _i(nt) values get synchronized with the */
+ gint current_vol_i16; /* the _i(nt) values get synchronized with the */
+ gint current_vol_i8; /* the _i(nt) values get synchronized with the */
+
+ GList *tracklist;
+ gboolean negotiated;
+
+ gboolean *mutes;
+ guint mutes_count;
+ gdouble *volumes;
+ guint volumes_count;
+};
+
+struct _GstVolumeClass {
+ GstAudioFilterClass parent_class;
+};
+
+GType gst_volume_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_VOLUME_H__ */
diff --git a/gst/volume/gstvolumeorc-dist.c b/gst/volume/gstvolumeorc-dist.c
new file mode 100644
index 0000000..3159e90
--- /dev/null
+++ b/gst/volume/gstvolumeorc-dist.c
@@ -0,0 +1,2721 @@
+
+/* autogenerated from gstvolumeorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <glib.h>
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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 <orc/orc.h>
+#endif
+void orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1, int n);
+void orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n);
+void orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n);
+void orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n);
+void orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
+ const gboolean * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n);
+
+void gst_volume_orc_init (void);
+
+
+/* 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_scalarmultiply_f64_ns */
+#ifdef DISABLE_ORC
+void
+orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *) d1;
+
+ /* 1: loadpq */
+ var33.f = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr0[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_scalarmultiply_f64_ns (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+
+ /* 1: loadpq */
+ var33.i =
+ (ex->params[24] & 0xffffffff) | ((orc_uint64) (ex->params[24 +
+ (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr0[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_scalarmultiply_f64_ns;
+void
+orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_scalarmultiply_f64_ns;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ {
+ orc_union64 tmp;
+ tmp.f = p1;
+ ex->params[ORC_VAR_P1] = tmp.x2[0];
+ ex->params[ORC_VAR_T1] = tmp.x2[1];
+ }
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_scalarmultiply_f32_ns */
+#ifdef DISABLE_ORC
+void
+orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var32;
+ orc_union32 var33;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) d1;
+
+ /* 1: loadpl */
+ var33.f = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 2: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_scalarmultiply_f32_ns (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var32;
+ orc_union32 var33;
+ orc_union32 var34;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+
+ /* 1: loadpl */
+ var33.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var32 = ptr0[i];
+ /* 2: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var32.i);
+ _src2.i = ORC_DENORMAL (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 3: storel */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_scalarmultiply_f32_ns;
+void
+orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_scalarmultiply_f32_ns;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ {
+ orc_union32 tmp;
+ tmp.f = p1;
+ ex->params[ORC_VAR_P1] = tmp.i;
+ }
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_process_int32 */
+#ifdef DISABLE_ORC
+void
+orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) d1;
+
+ /* 1: loadpl */
+ var34.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 2: mulslq */
+ var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
+ /* 3: shrsq */
+ var37.i = var36.i >> 27;
+ /* 4: convql */
+ var35.i = var37.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int32 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+
+ /* 1: loadpl */
+ var34.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 2: mulslq */
+ var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
+ /* 3: shrsq */
+ var37.i = var36.i >> 27;
+ /* 4: convql */
+ var35.i = var37.i;
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int32;
+void
+orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int32;
+ void (*func) (OrcExecutor *);
+
+ 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_process_int32_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) d1;
+
+ /* 1: loadpl */
+ var34.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 2: mulslq */
+ var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
+ /* 3: shrsq */
+ var37.i = var36.i >> 27;
+ /* 4: convsssql */
+ var35.i = ORC_CLAMP_SL (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int32_clamp (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ orc_union32 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+
+ /* 1: loadpl */
+ var34.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 2: mulslq */
+ var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
+ /* 3: shrsq */
+ var37.i = var36.i >> 27;
+ /* 4: convsssql */
+ var35.i = ORC_CLAMP_SL (var37.i);
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int32_clamp;
+void
+orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int32_clamp;
+ void (*func) (OrcExecutor *);
+
+ 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_process_int16 */
+#ifdef DISABLE_ORC
+void
+orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var33;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) d1;
+
+ /* 1: loadpw */
+ var34.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr0[i];
+ /* 2: mulswl */
+ var36.i = var33.i * var34.i;
+ /* 3: shrsl */
+ var37.i = var36.i >> 11;
+ /* 4: convlw */
+ var35.i = var37.i;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int16 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var33;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+
+ /* 1: loadpw */
+ var34.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr0[i];
+ /* 2: mulswl */
+ var36.i = var33.i * var34.i;
+ /* 3: shrsl */
+ var37.i = var36.i >> 11;
+ /* 4: convlw */
+ var35.i = var37.i;
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int16;
+void
+orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int16;
+ void (*func) (OrcExecutor *);
+
+ 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_process_int16_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var33;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) d1;
+
+ /* 1: loadpw */
+ var34.i = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr0[i];
+ /* 2: mulswl */
+ var36.i = var33.i * var34.i;
+ /* 3: shrsl */
+ var37.i = var36.i >> 11;
+ /* 4: convssslw */
+ var35.i = ORC_CLAMP_SW (var37.i);
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int16_clamp (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ orc_union16 var33;
+ orc_union16 var34;
+ orc_union16 var35;
+ orc_union32 var36;
+ orc_union32 var37;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+
+ /* 1: loadpw */
+ var34.i = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var33 = ptr0[i];
+ /* 2: mulswl */
+ var36.i = var33.i * var34.i;
+ /* 3: shrsl */
+ var37.i = var36.i >> 11;
+ /* 4: convssslw */
+ var35.i = ORC_CLAMP_SW (var37.i);
+ /* 5: storew */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int16_clamp;
+void
+orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int16_clamp;
+ void (*func) (OrcExecutor *);
+
+ 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_process_int8 */
+#ifdef DISABLE_ORC
+void
+orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) d1;
+
+ /* 1: loadpb */
+ var34 = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr0[i];
+ /* 2: mulsbw */
+ var36.i = var33 * var34;
+ /* 3: shrsw */
+ var37.i = var36.i >> 3;
+ /* 4: convwb */
+ var35 = var37.i;
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int8 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+
+ /* 1: loadpb */
+ var34 = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr0[i];
+ /* 2: mulsbw */
+ var36.i = var33 * var34;
+ /* 3: shrsw */
+ var37.i = var36.i >> 3;
+ /* 4: convwb */
+ var35 = var37.i;
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int8;
+void
+orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int8;
+ void (*func) (OrcExecutor *);
+
+ 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_process_int8_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) d1;
+
+ /* 1: loadpb */
+ var34 = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr0[i];
+ /* 2: mulsbw */
+ var36.i = var33 * var34;
+ /* 3: shrsw */
+ var37.i = var36.i >> 3;
+ /* 4: convssswb */
+ var35 = ORC_CLAMP_SB (var37.i);
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int8_clamp (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ orc_int8 var33;
+ orc_int8 var34;
+ orc_int8 var35;
+ orc_union16 var36;
+ orc_union16 var37;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+
+ /* 1: loadpb */
+ var34 = ex->params[24];
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var33 = ptr0[i];
+ /* 2: mulsbw */
+ var36.i = var33 * var34;
+ /* 3: shrsw */
+ var37.i = var36.i >> 3;
+ /* 4: convssswb */
+ var35 = ORC_CLAMP_SB (var37.i);
+ /* 5: storeb */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_int8_clamp;
+void
+orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_int8_clamp;
+ void (*func) (OrcExecutor *);
+
+ 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_memset_f64 */
+#ifdef DISABLE_ORC
+void
+orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) d1;
+
+ /* 0: loadpq */
+ var32.f = p1;
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+#else
+static void
+_backup_orc_memset_f64 (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ orc_union64 var32;
+ orc_union64 var33;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+
+ /* 0: loadpq */
+ var32.i =
+ (ex->params[24] & 0xffffffff) | ((orc_uint64) (ex->params[24 +
+ (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);
+
+ for (i = 0; i < n; i++) {
+ /* 1: copyq */
+ var33.i = var32.i;
+ /* 2: storeq */
+ ptr0[i] = var33;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_memset_f64;
+void
+orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_memset_f64;
+ void (*func) (OrcExecutor *);
+
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ {
+ orc_union64 tmp;
+ tmp.f = p1;
+ ex->params[ORC_VAR_P1] = tmp.x2[0];
+ ex->params[ORC_VAR_T1] = tmp.x2[1];
+ }
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_prepare_volumes */
+#ifdef DISABLE_ORC
+void
+orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
+ const gboolean * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union32 *) s1;
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x3ff0000000000000); /* 1f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var37.f = var33.i;
+ /* 3: subd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _dest1.f = _src1.f - _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: loadq */
+ var35 = ptr0[i];
+ /* 5: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var38.i);
+ _dest1.f = _src1.f * _src2.f;
+ var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 6: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_prepare_volumes (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union32 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union32 *) ex->arrays[4];
+
+ /* 2: loadpq */
+ var34.i = ORC_UINT64_C (0x3ff0000000000000); /* 1f */
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr4[i];
+ /* 1: convld */
+ var37.f = var33.i;
+ /* 3: subd */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var37.i);
+ _dest1.f = _src1.f - _src2.f;
+ var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: loadq */
+ var35 = ptr0[i];
+ /* 5: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var38.i);
+ _dest1.f = _src1.f * _src2.f;
+ var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 6: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_prepare_volumes;
+void
+orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
+ const gboolean * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_prepare_volumes;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_f64_1ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr0[i];
+ /* 1: loadq */
+ var33 = ptr4[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_f64_1ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr0[i];
+ /* 1: loadq */
+ var33 = ptr4[i];
+ /* 2: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest1.f = _src1.f * _src2.f;
+ var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_f64_1ch;
+void
+orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_f64_1ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_f32_1ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest.f = _src1.f;
+ var36.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: loadl */
+ var34 = ptr0[i];
+ /* 3: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var34.i);
+ _src2.i = ORC_DENORMAL (var36.i);
+ _dest1.f = _src1.f * _src2.f;
+ var35.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_f32_1ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var33;
+ orc_union32 var34;
+ orc_union32 var35;
+ orc_union32 var36;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var33 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
+ _dest.f = _src1.f;
+ var36.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: loadl */
+ var34 = ptr0[i];
+ /* 3: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var34.i);
+ _src2.i = ORC_DENORMAL (var36.i);
+ _dest1.f = _src1.f * _src2.f;
+ var35.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 4: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_f32_1ch;
+void
+orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_f32_1ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_f32_2ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union32 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union64 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest.f = _src1.f;
+ var37.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var37.i;
+ _dest.x2[1] = var37.i;
+ var38.i = _dest.i;
+ }
+ /* 3: loadq */
+ var35 = ptr0[i];
+ /* 4: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.x2[0]);
+ _src2.i = ORC_DENORMAL (var38.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var36.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.x2[1]);
+ _src2.i = ORC_DENORMAL (var38.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var36.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_f32_2ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union64 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union64 var34;
+ orc_union64 var35;
+ orc_union64 var36;
+ orc_union32 var37;
+ orc_union64 var38;
+
+ ptr0 = (orc_union64 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var34 = ptr4[i];
+ /* 1: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest.f = _src1.f;
+ var37.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 2: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var37.i;
+ _dest.x2[1] = var37.i;
+ var38.i = _dest.i;
+ }
+ /* 3: loadq */
+ var35 = ptr0[i];
+ /* 4: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.x2[0]);
+ _src2.i = ORC_DENORMAL (var38.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var36.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var35.x2[1]);
+ _src2.i = ORC_DENORMAL (var38.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var36.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 5: storeq */
+ ptr0[i] = var36;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_f32_2ch;
+void
+orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_f32_2ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_int32_1ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 1: convld */
+ var36.f = var33.i;
+ /* 2: loadq */
+ var34 = ptr4[i];
+ /* 3: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: convdl */
+ {
+ int tmp;
+ tmp = var37.f;
+ if (tmp == 0x80000000 && !(var37.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_int32_1ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union32 var33;
+ orc_union64 var34;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union64 var37;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var33 = ptr0[i];
+ /* 1: convld */
+ var36.f = var33.i;
+ /* 2: loadq */
+ var34 = ptr4[i];
+ /* 3: muld */
+ {
+ orc_union64 _src1;
+ orc_union64 _src2;
+ orc_union64 _dest1;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
+ _dest1.f = _src1.f * _src2.f;
+ var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
+ }
+ /* 4: convdl */
+ {
+ int tmp;
+ tmp = var37.f;
+ if (tmp == 0x80000000 && !(var37.i & ORC_UINT64_C (0x8000000000000000)))
+ tmp = 0x7fffffff;
+ var35.i = tmp;
+ }
+ /* 5: storel */
+ ptr0[i] = var35;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_int32_1ch;
+void
+orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_int32_1ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_int16_1ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr0[i];
+ /* 1: convswl */
+ var37.i = var34.i;
+ /* 2: convlf */
+ var38.f = var37.i;
+ /* 3: loadq */
+ var35 = ptr4[i];
+ /* 4: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _dest.f = _src1.f;
+ var39.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 5: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var38.i);
+ _src2.i = ORC_DENORMAL (var39.i);
+ _dest1.f = _src1.f * _src2.f;
+ var40.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 6: convfl */
+ {
+ int tmp;
+ tmp = (int) var40.f;
+ if (tmp == 0x80000000 && !(var40.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var41.i = tmp;
+ }
+ /* 7: convssslw */
+ var36.i = ORC_CLAMP_SW (var41.i);
+ /* 8: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_int16_1ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union16 var34;
+ orc_union64 var35;
+ orc_union16 var36;
+ orc_union32 var37;
+ orc_union32 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var34 = ptr0[i];
+ /* 1: convswl */
+ var37.i = var34.i;
+ /* 2: convlf */
+ var38.f = var37.i;
+ /* 3: loadq */
+ var35 = ptr4[i];
+ /* 4: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
+ _dest.f = _src1.f;
+ var39.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 5: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var38.i);
+ _src2.i = ORC_DENORMAL (var39.i);
+ _dest1.f = _src1.f * _src2.f;
+ var40.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 6: convfl */
+ {
+ int tmp;
+ tmp = (int) var40.f;
+ if (tmp == 0x80000000 && !(var40.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var41.i = tmp;
+ }
+ /* 7: convssslw */
+ var36.i = ORC_CLAMP_SW (var41.i);
+ /* 8: storew */
+ ptr0[i] = var36;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_int16_1ch;
+void
+orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_int16_1ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_int16_2ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union32 var37;
+ orc_union64 var38;
+ orc_union64 var39;
+ orc_union32 var40;
+ orc_union64 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+
+ ptr0 = (orc_union32 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr0[i];
+ /* 1: convswl */
+ var38.x2[0] = var35.x2[0];
+ var38.x2[1] = var35.x2[1];
+ /* 2: convlf */
+ var39.x2f[0] = var38.x2[0];
+ var39.x2f[1] = var38.x2[1];
+ /* 3: loadq */
+ var36 = ptr4[i];
+ /* 4: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var40.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 5: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var41.i = _dest.i;
+ }
+ /* 6: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var41.x2[0]);
+ _src2.i = ORC_DENORMAL (var39.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var42.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var41.x2[1]);
+ _src2.i = ORC_DENORMAL (var39.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var42.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 7: convfl */
+ {
+ int tmp;
+ tmp = (int) var42.x2f[0];
+ if (tmp == 0x80000000 && !(var42.x2[0] & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.x2[0] = tmp;
+ }
+ {
+ int tmp;
+ tmp = (int) var42.x2f[1];
+ if (tmp == 0x80000000 && !(var42.x2[1] & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.x2[1] = tmp;
+ }
+ /* 8: convssslw */
+ var37.x2[0] = ORC_CLAMP_SW (var43.x2[0]);
+ var37.x2[1] = ORC_CLAMP_SW (var43.x2[1]);
+ /* 9: storel */
+ ptr0[i] = var37;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_int16_2ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union32 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union32 var35;
+ orc_union64 var36;
+ orc_union32 var37;
+ orc_union64 var38;
+ orc_union64 var39;
+ orc_union32 var40;
+ orc_union64 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+
+ ptr0 = (orc_union32 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadl */
+ var35 = ptr0[i];
+ /* 1: convswl */
+ var38.x2[0] = var35.x2[0];
+ var38.x2[1] = var35.x2[1];
+ /* 2: convlf */
+ var39.x2f[0] = var38.x2[0];
+ var39.x2f[1] = var38.x2[1];
+ /* 3: loadq */
+ var36 = ptr4[i];
+ /* 4: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var40.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 5: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var40.i;
+ _dest.x2[1] = var40.i;
+ var41.i = _dest.i;
+ }
+ /* 6: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var41.x2[0]);
+ _src2.i = ORC_DENORMAL (var39.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var42.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var41.x2[1]);
+ _src2.i = ORC_DENORMAL (var39.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var42.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 7: convfl */
+ {
+ int tmp;
+ tmp = (int) var42.x2f[0];
+ if (tmp == 0x80000000 && !(var42.x2[0] & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.x2[0] = tmp;
+ }
+ {
+ int tmp;
+ tmp = (int) var42.x2f[1];
+ if (tmp == 0x80000000 && !(var42.x2[1] & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.x2[1] = tmp;
+ }
+ /* 8: convssslw */
+ var37.x2[0] = ORC_CLAMP_SW (var43.x2[0]);
+ var37.x2[1] = ORC_CLAMP_SW (var43.x2[1]);
+ /* 9: storel */
+ ptr0[i] = var37;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_int16_2ch;
+void
+orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_int16_2ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_int8_1ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_int8 var35;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_int8 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr0[i];
+ /* 1: convsbw */
+ var38.i = var35;
+ /* 2: convswl */
+ var39.i = var38.i;
+ /* 3: convlf */
+ var40.f = var39.i;
+ /* 4: loadq */
+ var36 = ptr4[i];
+ /* 5: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var41.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 6: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.i);
+ _src2.i = ORC_DENORMAL (var41.i);
+ _dest1.f = _src1.f * _src2.f;
+ var42.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 7: convfl */
+ {
+ int tmp;
+ tmp = (int) var42.f;
+ if (tmp == 0x80000000 && !(var42.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.i = tmp;
+ }
+ /* 8: convlw */
+ var44.i = var43.i;
+ /* 9: convssswb */
+ var37 = ORC_CLAMP_SB (var44.i);
+ /* 10: storeb */
+ ptr0[i] = var37;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_int8_1ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_int8 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_int8 var35;
+ orc_union64 var36;
+ orc_int8 var37;
+ orc_union16 var38;
+ orc_union32 var39;
+ orc_union32 var40;
+ orc_union32 var41;
+ orc_union32 var42;
+ orc_union32 var43;
+ orc_union16 var44;
+
+ ptr0 = (orc_int8 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadb */
+ var35 = ptr0[i];
+ /* 1: convsbw */
+ var38.i = var35;
+ /* 2: convswl */
+ var39.i = var38.i;
+ /* 3: convlf */
+ var40.f = var39.i;
+ /* 4: loadq */
+ var36 = ptr4[i];
+ /* 5: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var41.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 6: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.i);
+ _src2.i = ORC_DENORMAL (var41.i);
+ _dest1.f = _src1.f * _src2.f;
+ var42.i = ORC_DENORMAL (_dest1.i);
+ }
+ /* 7: convfl */
+ {
+ int tmp;
+ tmp = (int) var42.f;
+ if (tmp == 0x80000000 && !(var42.i & 0x80000000))
+ tmp = 0x7fffffff;
+ var43.i = tmp;
+ }
+ /* 8: convlw */
+ var44.i = var43.i;
+ /* 9: convssswb */
+ var37 = ORC_CLAMP_SB (var44.i);
+ /* 10: storeb */
+ ptr0[i] = var37;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_int8_1ch;
+void
+orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_int8_1ch;
+ void (*func) (OrcExecutor *);
+
+ 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_process_controlled_int8_2ch */
+#ifdef DISABLE_ORC
+void
+orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ int i;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union16 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union64 var39;
+ orc_union64 var40;
+ orc_union32 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+ orc_union64 var44;
+ orc_union32 var45;
+
+ ptr0 = (orc_union16 *) d1;
+ ptr4 = (orc_union64 *) s1;
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr0[i];
+ /* 1: convsbw */
+ var38.x2[0] = var35.x2[0];
+ var38.x2[1] = var35.x2[1];
+ /* 2: convswl */
+ var39.x2[0] = var38.x2[0];
+ var39.x2[1] = var38.x2[1];
+ /* 3: convlf */
+ var40.x2f[0] = var39.x2[0];
+ var40.x2f[1] = var39.x2[1];
+ /* 4: loadq */
+ var36 = ptr4[i];
+ /* 5: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var41.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 6: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var42.i = _dest.i;
+ }
+ /* 7: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.x2[0]);
+ _src2.i = ORC_DENORMAL (var42.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var43.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.x2[1]);
+ _src2.i = ORC_DENORMAL (var42.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var43.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 8: convfl */
+ {
+ int tmp;
+ tmp = (int) var43.x2f[0];
+ if (tmp == 0x80000000 && !(var43.x2[0] & 0x80000000))
+ tmp = 0x7fffffff;
+ var44.x2[0] = tmp;
+ }
+ {
+ int tmp;
+ tmp = (int) var43.x2f[1];
+ if (tmp == 0x80000000 && !(var43.x2[1] & 0x80000000))
+ tmp = 0x7fffffff;
+ var44.x2[1] = tmp;
+ }
+ /* 9: convlw */
+ var45.x2[0] = var44.x2[0];
+ var45.x2[1] = var44.x2[1];
+ /* 10: convssswb */
+ var37.x2[0] = ORC_CLAMP_SB (var45.x2[0]);
+ var37.x2[1] = ORC_CLAMP_SB (var45.x2[1]);
+ /* 11: storew */
+ ptr0[i] = var37;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_controlled_int8_2ch (OrcExecutor * ORC_RESTRICT ex)
+{
+ int i;
+ int n = ex->n;
+ orc_union16 *ORC_RESTRICT ptr0;
+ const orc_union64 *ORC_RESTRICT ptr4;
+ orc_union16 var35;
+ orc_union64 var36;
+ orc_union16 var37;
+ orc_union32 var38;
+ orc_union64 var39;
+ orc_union64 var40;
+ orc_union32 var41;
+ orc_union64 var42;
+ orc_union64 var43;
+ orc_union64 var44;
+ orc_union32 var45;
+
+ ptr0 = (orc_union16 *) ex->arrays[0];
+ ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadw */
+ var35 = ptr0[i];
+ /* 1: convsbw */
+ var38.x2[0] = var35.x2[0];
+ var38.x2[1] = var35.x2[1];
+ /* 2: convswl */
+ var39.x2[0] = var38.x2[0];
+ var39.x2[1] = var38.x2[1];
+ /* 3: convlf */
+ var40.x2f[0] = var39.x2[0];
+ var40.x2f[1] = var39.x2[1];
+ /* 4: loadq */
+ var36 = ptr4[i];
+ /* 5: convdf */
+ {
+ orc_union64 _src1;
+ orc_union32 _dest;
+ _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
+ _dest.f = _src1.f;
+ var41.i = ORC_DENORMAL (_dest.i);
+ }
+ /* 6: mergelq */
+ {
+ orc_union64 _dest;
+ _dest.x2[0] = var41.i;
+ _dest.x2[1] = var41.i;
+ var42.i = _dest.i;
+ }
+ /* 7: mulf */
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.x2[0]);
+ _src2.i = ORC_DENORMAL (var42.x2[0]);
+ _dest1.f = _src1.f * _src2.f;
+ var43.x2[0] = ORC_DENORMAL (_dest1.i);
+ }
+ {
+ orc_union32 _src1;
+ orc_union32 _src2;
+ orc_union32 _dest1;
+ _src1.i = ORC_DENORMAL (var40.x2[1]);
+ _src2.i = ORC_DENORMAL (var42.x2[1]);
+ _dest1.f = _src1.f * _src2.f;
+ var43.x2[1] = ORC_DENORMAL (_dest1.i);
+ }
+ /* 8: convfl */
+ {
+ int tmp;
+ tmp = (int) var43.x2f[0];
+ if (tmp == 0x80000000 && !(var43.x2[0] & 0x80000000))
+ tmp = 0x7fffffff;
+ var44.x2[0] = tmp;
+ }
+ {
+ int tmp;
+ tmp = (int) var43.x2f[1];
+ if (tmp == 0x80000000 && !(var43.x2[1] & 0x80000000))
+ tmp = 0x7fffffff;
+ var44.x2[1] = tmp;
+ }
+ /* 9: convlw */
+ var45.x2[0] = var44.x2[0];
+ var45.x2[1] = var44.x2[1];
+ /* 10: convssswb */
+ var37.x2[0] = ORC_CLAMP_SB (var45.x2[0]);
+ var37.x2[1] = ORC_CLAMP_SB (var45.x2[1]);
+ /* 11: storew */
+ ptr0[i] = var37;
+ }
+
+}
+
+static OrcProgram *_orc_program_orc_process_controlled_int8_2ch;
+void
+orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
+ const gdouble * ORC_RESTRICT s1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ OrcProgram *p = _orc_program_orc_process_controlled_int8_2ch;
+ void (*func) (OrcExecutor *);
+
+ 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
+
+
+void
+gst_volume_orc_init (void)
+{
+#ifndef DISABLE_ORC
+ {
+ /* orc_scalarmultiply_f64_ns */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_scalarmultiply_f64_ns");
+ orc_program_set_backup_function (p, _backup_orc_scalarmultiply_f64_ns);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_parameter_double (p, 8, "p1");
+
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_scalarmultiply_f64_ns = p;
+ }
+ {
+ /* orc_scalarmultiply_f32_ns */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_scalarmultiply_f32_ns");
+ orc_program_set_backup_function (p, _backup_orc_scalarmultiply_f32_ns);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_parameter_float (p, 4, "p1");
+
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_scalarmultiply_f32_ns = p;
+ }
+ {
+ /* orc_process_int32 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int32");
+ orc_program_set_backup_function (p, _backup_orc_process_int32);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_constant (p, 4, 0x0000001b, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convql", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int32 = p;
+ }
+ {
+ /* orc_process_int32_clamp */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int32_clamp");
+ orc_program_set_backup_function (p, _backup_orc_process_int32_clamp);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_constant (p, 4, 0x0000001b, "c1");
+ orc_program_add_parameter (p, 4, "p1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convsssql", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int32_clamp = p;
+ }
+ {
+ /* orc_process_int16 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int16");
+ orc_program_set_backup_function (p, _backup_orc_process_int16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_constant (p, 4, 0x0000000b, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int16 = p;
+ }
+ {
+ /* orc_process_int16_clamp */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int16_clamp");
+ orc_program_set_backup_function (p, _backup_orc_process_int16_clamp);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_constant (p, 4, 0x0000000b, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssslw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int16_clamp = p;
+ }
+ {
+ /* orc_process_int8 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int8");
+ orc_program_set_backup_function (p, _backup_orc_process_int8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_constant (p, 4, 0x00000003, "c1");
+ orc_program_add_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ 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, "convwb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int8 = p;
+ }
+ {
+ /* orc_process_int8_clamp */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int8_clamp");
+ orc_program_set_backup_function (p, _backup_orc_process_int8_clamp);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_constant (p, 4, 0x00000003, "c1");
+ orc_program_add_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
+ 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, "convssswb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_int8_clamp = p;
+ }
+ {
+ /* orc_memset_f64 */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_memset_f64");
+ orc_program_set_backup_function (p, _backup_orc_memset_f64);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_parameter_double (p, 8, "p1");
+
+ orc_program_append_2 (p, "copyq", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_memset_f64 = p;
+ }
+ {
+ /* orc_prepare_volumes */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_prepare_volumes");
+ orc_program_set_backup_function (p, _backup_orc_prepare_volumes);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 4, "s1");
+ orc_program_add_constant_int64 (p, 8, 0x3ff0000000000000ULL, "c1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "subd", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_prepare_volumes = p;
+ }
+ {
+ /* orc_process_controlled_f64_1ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_f64_1ch");
+ orc_program_set_backup_function (p, _backup_orc_process_controlled_f64_1ch);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 8, "s1");
+
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_f64_1ch = p;
+ }
+ {
+ /* orc_process_controlled_f32_1ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_f32_1ch");
+ orc_program_set_backup_function (p, _backup_orc_process_controlled_f32_1ch);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_f32_1ch = p;
+ }
+ {
+ /* orc_process_controlled_f32_2ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_f32_2ch");
+ orc_program_set_backup_function (p, _backup_orc_process_controlled_f32_2ch);
+ orc_program_add_destination (p, 8, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 8, "t2");
+
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_f32_2ch = p;
+ }
+ {
+ /* orc_process_controlled_int32_1ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_int32_1ch");
+ orc_program_set_backup_function (p,
+ _backup_orc_process_controlled_int32_1ch);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 8, "t1");
+
+ orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_S1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_int32_1ch = p;
+ }
+ {
+ /* orc_process_controlled_int16_1ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_int16_1ch");
+ orc_program_set_backup_function (p,
+ _backup_orc_process_controlled_int16_1ch);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+
+ orc_program_append_2 (p, "convswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssslw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_int16_1ch = p;
+ }
+ {
+ /* orc_process_controlled_int16_2ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_int16_2ch");
+ orc_program_set_backup_function (p,
+ _backup_orc_process_controlled_int16_2ch);
+ orc_program_add_destination (p, 4, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 8, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 8, "t3");
+
+ orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlf", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T2,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssslw", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_int16_2ch = p;
+ }
+ {
+ /* orc_process_controlled_int8_1ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_int8_1ch");
+ orc_program_set_backup_function (p,
+ _backup_orc_process_controlled_int8_1ch);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 2, "t1");
+ orc_program_add_temporary (p, 4, "t2");
+ orc_program_add_temporary (p, 4, "t3");
+
+ orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convswl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_int8_1ch = p;
+ }
+ {
+ /* orc_process_controlled_int8_2ch */
+ OrcProgram *p;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_controlled_int8_2ch");
+ orc_program_set_backup_function (p,
+ _backup_orc_process_controlled_int8_2ch);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_source (p, 8, "s1");
+ orc_program_add_temporary (p, 4, "t1");
+ orc_program_add_temporary (p, 8, "t2");
+ orc_program_add_temporary (p, 8, "t3");
+
+ orc_program_append_2 (p, "convsbw", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convswl", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlf", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "mulf", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convfl", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convlw", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1,
+ ORC_VAR_D1);
+ orc_program_append_2 (p, "convssswb", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+ ORC_VAR_D1);
+
+ orc_program_compile (p);
+
+ _orc_program_orc_process_controlled_int8_2ch = p;
+ }
+#endif
+}
diff --git a/gst/volume/gstvolumeorc-dist.h b/gst/volume/gstvolumeorc-dist.h
new file mode 100644
index 0000000..45411b8
--- /dev/null
+++ b/gst/volume/gstvolumeorc-dist.h
@@ -0,0 +1,96 @@
+
+/* autogenerated from gstvolumeorc.orc */
+
+#ifndef _GSTVOLUMEORC_H_
+#define _GSTVOLUMEORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void gst_volume_orc_init (void);
+
+
+
+#ifndef _ORC_INTEGER_TYPEDEFS_
+#define _ORC_INTEGER_TYPEDEFS_
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+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 <limits.h>
+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_scalarmultiply_f64_ns (double * ORC_RESTRICT d1, double p1, int n);
+void orc_scalarmultiply_f32_ns (float * ORC_RESTRICT d1, float p1, int n);
+void orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n);
+void orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n);
+void orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n);
+void orc_prepare_volumes (gdouble * ORC_RESTRICT d1, const gboolean * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+void orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1, const gdouble * ORC_RESTRICT s1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/volume/gstvolumeorc.orc b/gst/volume/gstvolumeorc.orc
new file mode 100644
index 0000000..5fdf174
--- /dev/null
+++ b/gst/volume/gstvolumeorc.orc
@@ -0,0 +1,180 @@
+
+.init gst_volume_orc_init
+
+.function orc_scalarmultiply_f64_ns
+.dest 8 d1 double
+.doubleparam 8 p1
+
+muld d1, d1, p1
+
+.function orc_scalarmultiply_f32_ns
+.dest 4 d1 float
+.floatparam 4 p1
+
+mulf d1, d1, p1
+
+.function orc_process_int32
+.dest 4 d1 gint32
+.param 4 p1
+.temp 8 t1
+
+mulslq t1, d1, p1
+shrsq t1, t1, 27
+convql d1, t1
+
+.function orc_process_int32_clamp
+.dest 4 d1 gint32
+.param 4 p1
+.temp 8 t1
+
+mulslq t1, d1, p1
+shrsq t1, t1, 27
+convsssql d1, t1
+
+.function orc_process_int16
+.dest 2 d1 gint16
+.param 2 p1
+.temp 4 t1
+
+mulswl t1, d1, p1
+shrsl t1, t1, 11
+convlw d1, t1
+
+
+.function orc_process_int16_clamp
+.dest 2 d1 gint16
+.param 2 p1
+.temp 4 t1
+
+mulswl t1, d1, p1
+shrsl t1, t1, 11
+convssslw d1, t1
+
+.function orc_process_int8
+.dest 1 d1 gint8
+.param 1 p1
+.temp 2 t1
+
+mulsbw t1, d1, p1
+shrsw t1, t1, 3
+convwb d1, t1
+
+
+.function orc_process_int8_clamp
+.dest 1 d1 gint8
+.param 1 p1
+.temp 2 t1
+
+mulsbw t1, d1, p1
+shrsw t1, t1, 3
+convssswb d1, t1
+
+.function orc_memset_f64
+.dest 8 d1 gdouble
+.doubleparam 8 p1
+
+copyq d1, p1
+
+.function orc_prepare_volumes
+.dest 8 d1 gdouble
+.source 4 s1 gboolean
+.temp 8 t1
+
+convld t1, s1
+subd t1, 0x3FF0000000000000L, t1
+muld d1, d1, t1
+
+.function orc_process_controlled_f64_1ch
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+muld d1, d1, s1
+
+.function orc_process_controlled_f32_1ch
+.dest 4 d1 gfloat
+.source 8 s1 gdouble
+.temp 4 t1
+
+convdf t1, s1
+mulf d1, d1, t1
+
+.function orc_process_controlled_f32_2ch
+.dest 8 d1 gfloat
+.source 8 s1 gdouble
+.temp 4 t1
+.temp 8 t2
+
+convdf t1, s1
+mergelq t2, t1, t1
+x2 mulf d1, d1, t2
+
+.function orc_process_controlled_int32_1ch
+.dest 4 d1 gint32
+.source 8 s1 gdouble
+.temp 8 t1
+
+convld t1, d1
+muld t1, t1, s1
+convdl d1, t1
+
+.function orc_process_controlled_int16_1ch
+.dest 2 d1 gint16
+.source 8 s1 gdouble
+.temp 4 t1
+.temp 4 t2
+
+convswl t1, d1
+convlf t1, t1
+convdf t2, s1
+mulf t1, t1, t2
+convfl t1, t1
+convssslw d1, t1
+
+.function orc_process_controlled_int16_2ch
+.dest 4 d1 gint16
+.source 8 s1 gdouble
+.temp 8 t1
+.temp 4 t2
+.temp 8 t3
+
+x2 convswl t1, d1
+x2 convlf t1, t1
+convdf t2, s1
+mergelq t3, t2, t2
+x2 mulf t3, t3, t1
+x2 convfl t3, t3
+x2 convssslw d1, t3
+
+.function orc_process_controlled_int8_1ch
+.dest 1 d1 gint8
+.source 8 s1 gdouble
+.temp 2 t1
+.temp 4 t2
+.temp 4 t3
+
+convsbw t1, d1
+convswl t2, t1
+convlf t2, t2
+convdf t3, s1
+mulf t2, t2, t3
+convfl t2, t2
+convlw t1, t2
+convssswb d1, t1
+
+.function orc_process_controlled_int8_2ch
+.dest 2 d1 gint8
+.source 8 s1 gdouble
+.temp 4 t1
+.temp 8 t2
+.temp 8 t3
+
+x2 convsbw t1, d1
+x2 convswl t2, t1
+x2 convlf t2, t2
+convdf t1, s1
+mergelq t3, t1, t1
+x2 mulf t2, t2, t3
+x2 convfl t2, t2
+x2 convlw t1, t2
+x2 convssswb d1, t1
+
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..6781b98
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.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
+ 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
+ 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
+ trap '(exit $?); exit' 1 2 13 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 starting with `-'.
+ 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
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # 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 -z "$d" && 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 100755
index 0000000..fa4b1e1
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,8413 @@
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6b
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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
+# --tag=TAG use configuration variables from tag TAG
+# -v, --verbose print informational messages (default)
+# --version print version information
+# -h, --help print short or long 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.
+# 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.2.6b Debian-2.2.6b-2ubuntu3
+# automake: $automake_version
+# autoconf: $autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="2.2.6b Debian-2.2.6b-2ubuntu3"
+TIMESTAMP=""
+package_revision=1.3017
+
+# 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
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+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
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/bin/sed"}
+: ${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_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 "X${1}" | $Xsed -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 "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
+
+# 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"
+
+# The name of this program:
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+ -*) progname=./$progname ;;
+esac
+
+# 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=:
+ 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'
+
+# 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${mode+: }$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_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+ $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+ $opt_warning && $ECHO "$progname${mode+: }$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 "X$my_directory_path" | $Xsed -e "$dirname"`
+ done
+ my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e '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 "X$my_tmpdir" | $Xsed
+}
+
+
+# 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 "X$1" | $Xsed -e "$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 "X$1" | $Xsed \
+ -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_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $SED -n '/^# '$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 ()
+{
+ $SED -n '/^# Usage:/,/# -h/ {
+ s/^# //
+ s/^# *$//
+ s/\$progname/'$progname'/
+ p
+ }' < "$progpath"
+ $ECHO
+ $ECHO "run \`$progname --help | more' for full usage"
+ exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+ $SED -n '/^# Usage:/,/# Report bugs to/ {
+ 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 --version) 2>/dev/null |$SED 1q`"'/
+ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+ p
+ }' < "$progpath"
+ exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+ func_error "missing argument for $1"
+ exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+ # Yippee, $ECHO works!
+ :
+else
+ # Restart under the correct shell, and then maybe $ECHO will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
+
+# 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_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
+}
+
+# Parse options once, thoroughly. This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
+
+ # 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
+
+ # Parse non-mode specific arguments:
+ while test "$#" -gt 0; do
+ opt="$1"
+ shift
+
+ case $opt in
+ --config) func_config ;;
+
+ --debug) preserve_args="$preserve_args $opt"
+ func_echo "enabling shell trace mode"
+ opt_debug='set -x'
+ $opt_debug
+ ;;
+
+ -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break
+ execute_dlfiles="$execute_dlfiles $1"
+ shift
+ ;;
+
+ --dry-run | -n) opt_dry_run=: ;;
+ --features) func_features ;;
+ --finish) mode="finish" ;;
+
+ --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break
+ case $1 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
+
+ mode="$1"
+ shift
+ ;;
+
+ --preserve-dup-deps)
+ opt_duplicate_deps=: ;;
+
+ --quiet|--silent) preserve_args="$preserve_args $opt"
+ opt_silent=:
+ ;;
+
+ --verbose| -v) preserve_args="$preserve_args $opt"
+ opt_silent=false
+ ;;
+
+ --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break
+ preserve_args="$preserve_args $opt $1"
+ func_enable_tag "$1" # tagname is set here
+ shift
+ ;;
+
+ # Separate optargs to long options:
+ -dlopen=*|--mode=*|--tag=*)
+ func_opt_split "$opt"
+ set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+ shift
+ ;;
+
+ -\?|-h) func_usage ;;
+ --help) opt_help=: ;;
+ --version) func_version ;;
+
+ -*) func_fatal_help "unrecognized option \`$opt'" ;;
+
+ *) nonopt="$opt"
+ break
+ ;;
+ esac
+ done
+
+
+ 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_duplicate_deps
+ ;;
+ esac
+
+ # Having warned about all mis-specified options, bail out if
+ # anything was wrong.
+ $exit_cmd $EXIT_FAILURE
+}
+
+# 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
+}
+
+
+## ----------- ##
+## Main. ##
+## ----------- ##
+
+$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
+
+ test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
+
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$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=$mode' for more information."
+}
+
+
+# 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_ltwrapper_scriptname_result=""
+ if func_ltwrapper_executable_p "$1"; then
+ func_dirname_and_basename "$1" "" "."
+ func_stripname '' '.exe' "$func_basename_result"
+ func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+ fi
+}
+
+# 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_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_quote_for_eval "$arg"
+ CC_quoted="$CC_quoted $func_quote_for_eval_result"
+ done
+ 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 "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+ # 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_quote_for_eval "$arg"
+ CC_quoted="$CC_quoted $func_quote_for_eval_result"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+ # 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 <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+ $MV "${write_libobj}T" "${write_libobj}"
+ }
+}
+
+# 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)
+ pie_flag="$pie_flag $arg"
+ continue
+ ;;
+
+ -shared | -static | -prefer-pic | -prefer-non-pic)
+ later="$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_quote_for_eval "$arg"
+ lastarg="$lastarg $func_quote_for_eval_result"
+ done
+ IFS="$save_ifs"
+ func_stripname ' ' '' "$lastarg"
+ lastarg=$func_stripname_result
+
+ # Add the arguments to base_compile.
+ base_compile="$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_quote_for_eval "$lastarg"
+ base_compile="$base_compile $func_quote_for_eval_result"
+ 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 | *.obj | *.sx)
+ 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e '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
+ removelist="$removelist $output_obj"
+ $ECHO "$srcfile" > "$lockfile"
+ fi
+
+ $opt_dry_run || $RM $removelist
+ removelist="$removelist $lockfile"
+ trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+ 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
+ command="$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
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$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 "$mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+ # We need to display help for each of the modes.
+ case $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 building PIC objects only
+ -prefer-non-pic try to building 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
+
+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 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
+ -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
+
+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 \`$mode'"
+ ;;
+ esac
+
+ $ECHO
+ $ECHO "Try \`$progname --help' for more information about other modes."
+
+ exit $?
+}
+
+ # Now that we've collected a possible --mode arg, show help if necessary
+ $opt_help && func_mode_help
+
+
+# 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 $execute_dlfiles; do
+ test -f "$file" \
+ || func_fatal_help "\`$file' is not a file"
+
+ dir=
+ case $file in
+ *.la)
+ # 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
+ dir="$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
+ -*) ;;
+ *)
+ # 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_quote_for_eval "$file"
+ args="$args $func_quote_for_eval_result"
+ 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 "$mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+ $opt_debug
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ 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" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ $opt_silent && exit $EXIT_SUCCESS
+
+ $ECHO "X----------------------------------------------------------------------" | $Xsed
+ $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 "X----------------------------------------------------------------------" | $Xsed
+ exit $EXIT_SUCCESS
+}
+
+test "$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.
+ $ECHO "X$nonopt" | $GREP shtool >/dev/null; 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"
+ install_prog="$install_prog$func_quote_for_eval_result"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ case " $install_prog " in
+ *[\\\ /]cp\ *) ;;
+ *) prev=$arg ;;
+ esac
+ ;;
+ -g | -m | -o)
+ prev=$arg
+ ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ func_quote_for_eval "$arg"
+ install_prog="$install_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 -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.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # 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 "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ func_dirname "$file" "/" ""
+ dir="$func_dirname_result"
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -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 "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$ECHO "X$relink_command" | $Xsed -e "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_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" && staticlibs="$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 "X$lib" | $Xsed -e '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 "X$relink_command" | $Xsed -e '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 "X$file$stripped_ext" | $Xsed -e "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_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ func_show_eval "$old_striplib $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 "$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
+
+/* 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 "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for progfile in $progfiles; do
+ func_verbose "extracting global C symbols from \`$progfile'"
+ $opt_dry_run || eval "$NM $progfile | $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"
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ 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 >/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;
+"
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+ runtime relocations are performed -- see ld's documentation
+ on pseudo-relocs. */"
+ lt_dlsym_const= ;;
+ *osf5*)
+ echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+ lt_dlsym_const= ;;
+ *)
+ lt_dlsym_const=const ;;
+ esac
+
+ $ECHO >> "$output_objdir/$my_dlsyms" "\
+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) ;;
+ *) symtab_cflags="$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 "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ else
+ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+ fi
+ ;;
+ *)
+ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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.
+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
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+ $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 |
+ $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_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ $opt_debug
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+ 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 | $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 | $NL2SP`
+ done
+
+ func_extract_archives_result="$my_oldobjs"
+}
+
+
+
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+ func_emit_wrapper_part1_arg1=no
+ if test -n "$1" ; then
+ func_emit_wrapper_part1_arg1=$1
+ fi
+
+ $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.
+Xsed='${SED} -e 1s/^X//'
+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
+ ECHO=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$ECHO works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$ECHO will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $ECHO "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+"
+}
+# end: func_emit_wrapper_part1
+
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+ func_emit_wrapper_part2_arg1=no
+ if test -n "$1" ; then
+ func_emit_wrapper_part2_arg1=$1
+ fi
+
+ $ECHO "\
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_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 \"X\$thisdir\" | \$Xsed -e '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"
+
+ # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $ECHO "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $ECHO "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2* | *-cegcc*)
+ $ECHO "\
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $ECHO "\
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $ECHO "\
+ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+ exit 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\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# 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=no
+ if test -n "$1" ; then
+ func_emit_wrapper_arg1=$1
+ fi
+
+ # split this up so that func_emit_cwrapperexe_src
+ # can call each part independently.
+ func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+ func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+# $build $host
+# mingw (msys) mingw [e.g. native]
+# cygwin mingw
+# *nix + wine mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin. Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+ func_to_host_path_result="$1"
+ if test -n "$1" ; then
+ case $host in
+ *mingw* )
+ lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+ case $build in
+ *mingw* ) # actually, msys
+ # awkward: cmd appends spaces to result
+ lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+ func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ ;;
+ *cygwin* )
+ func_to_host_path_tmp1=`cygpath -w "$1"`
+ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ ;;
+ * )
+ # Unfortunately, winepath does not exit with a non-zero
+ # error code, so we are forced to check the contents of
+ # stdout. On the other hand, if the command is not
+ # found, the shell will set an exit code of 127 and print
+ # *an error message* to stdout. So we must check for both
+ # error code of zero AND non-empty stdout, which explains
+ # the odd construction:
+ func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+ if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ else
+ # Allow warning below.
+ func_to_host_path_result=""
+ fi
+ ;;
+ esac
+ if test -z "$func_to_host_path_result" ; then
+ func_error "Could not determine host path corresponding to"
+ func_error " '$1'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback:
+ func_to_host_path_result="$1"
+ fi
+ ;;
+ esac
+ fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+# $build $host
+# mingw (msys) mingw [e.g. native]
+# cygwin mingw
+# *nix + wine mingw
+#
+# 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.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+ func_to_host_pathlist_result="$1"
+ if test -n "$1" ; then
+ case $host in
+ *mingw* )
+ lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+ # 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_to_host_pathlist_tmp2="$1"
+ # Once set for this call, this variable should not be
+ # reassigned. It is used in tha fallback case.
+ func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+ $SED -e 's|^:*||' -e 's|:*$||'`
+ case $build in
+ *mingw* ) # Actually, msys.
+ # Awkward: cmd appends spaces to result.
+ lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+ func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ ;;
+ *cygwin* )
+ func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+ $SED -e "$lt_sed_naive_backslashify"`
+ ;;
+ * )
+ # unfortunately, winepath doesn't convert pathlists
+ func_to_host_pathlist_result=""
+ func_to_host_pathlist_oldIFS=$IFS
+ IFS=:
+ for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+ IFS=$func_to_host_pathlist_oldIFS
+ if test -n "$func_to_host_pathlist_f" ; then
+ func_to_host_path "$func_to_host_pathlist_f"
+ if test -n "$func_to_host_path_result" ; then
+ if test -z "$func_to_host_pathlist_result" ; then
+ func_to_host_pathlist_result="$func_to_host_path_result"
+ else
+ func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+ fi
+ fi
+ fi
+ IFS=:
+ done
+ IFS=$func_to_host_pathlist_oldIFS
+ ;;
+ esac
+ if test -z "$func_to_host_pathlist_result" ; then
+ func_error "Could not determine the host path(s) corresponding to"
+ func_error " '$1'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback. This may break if $1 contains DOS-style drive
+ # specifications. The fix is not to complicate the expression
+ # below, but for the user to provide a working wine installation
+ # with winepath so that path translation in the cross-to-mingw
+ # case works properly.
+ lt_replace_pathsep_nix_to_dos="s|:|;|g"
+ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+ $SED -e "$lt_replace_pathsep_nix_to_dos"`
+ fi
+ # Now, add the leading and trailing path separators back
+ case "$1" in
+ :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+ ;;
+ esac
+ case "$1" in
+ *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+}
+# end: func_to_host_pathlist
+
+# 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 <<EOF
+
+/* $cwrappersource - temporary wrapper executable 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 executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "$SHELL $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+# include <io.h>
+# define HAVE_SETENV
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#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
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+# define intptr_t int
+# endif
+#endif
+
+#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 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#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)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+ va_list args;
+ va_start (args, fmt);
+ (void) vfprintf (stderr, fmt, args);
+ va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+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_fatal (const char *message, ...);
+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_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+ func_emit_wrapper_part1 yes |
+ $SED -e 's/\([\\"]\)/\\\1/g' \
+ -e 's/^/ "/' -e 's/$/\\n"/'
+ echo ";"
+ cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+ func_emit_wrapper_part2 yes |
+ $SED -e 's/\([\\"]\)/\\\1/g' \
+ -e 's/^/ "/' -e 's/$/\\n"/'
+ echo ";"
+
+ cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ func_to_host_pathlist "$temp_rpath"
+ cat <<EOF
+const char * LIB_PATH_VALUE = "$func_to_host_pathlist_result";
+EOF
+ else
+ cat <<"EOF"
+const char * LIB_PATH_VALUE = "";
+EOF
+ fi
+
+ if test -n "$dllsearchpath"; then
+ func_to_host_pathlist "$dllsearchpath:"
+ cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE = "$func_to_host_pathlist_result";
+EOF
+ else
+ cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE = "";
+EOF
+ fi
+
+ if test "$fast_install" = yes; then
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+ else
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+ fi
+
+
+ cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH 5
+
+static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+static const size_t env_set_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt = LTWRAPPER_OPTION_PREFIX "env-set";
+ /* argument is putenv-style "foo=bar", value of foo is set to bar */
+
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt = LTWRAPPER_OPTION_PREFIX "env-prepend";
+ /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
+
+static const size_t env_append_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt = LTWRAPPER_OPTION_PREFIX "env-append";
+ /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int newargc;
+ char *tmp_pathspec;
+ char *actual_cwrapper_path;
+ char *actual_cwrapper_name;
+ char *target_name;
+ char *lt_argv_zero;
+ intptr_t rval = 127;
+
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0]));
+ LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+
+ /* very simple arg parsing; don't want to rely on getopt */
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp (argv[i], dumpscript_opt) == 0)
+ {
+EOF
+ case "$host" in
+ *mingw* | *cygwin* )
+ # make stdout use "unix" line endings
+ echo " setmode(1,_O_BINARY);"
+ ;;
+ esac
+
+ cat <<"EOF"
+ printf ("%s", script_text_part1);
+ printf ("%s", script_text_part2);
+ return 0;
+ }
+ }
+
+ newargz = XMALLOC (char *, argc + 1);
+ tmp_pathspec = find_executable (argv[0]);
+ if (tmp_pathspec == NULL)
+ lt_fatal ("Couldn't find %s", argv[0]);
+ LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+ tmp_pathspec));
+
+ actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+ LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+ actual_cwrapper_path));
+ XFREE (tmp_pathspec);
+
+ actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+ strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+ /* wrapper name transforms */
+ strendzap (actual_cwrapper_name, ".exe");
+ tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+ XFREE (actual_cwrapper_name);
+ actual_cwrapper_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ /* target_name transforms -- use actual target program name; might have lt- prefix */
+ target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+ strendzap (target_name, ".exe");
+ tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+ XFREE (target_name);
+ target_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+ target_name));
+EOF
+
+ cat <<EOF
+ newargz[0] =
+ XMALLOC (char, (strlen (actual_cwrapper_path) +
+ strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+ strcpy (newargz[0], actual_cwrapper_path);
+ strcat (newargz[0], "$objdir");
+ strcat (newargz[0], "/");
+EOF
+
+ cat <<"EOF"
+ /* stop here, and copy so we don't have to do this twice */
+ tmp_pathspec = xstrdup (newargz[0]);
+
+ /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+ strcat (newargz[0], actual_cwrapper_name);
+
+ /* DO want the lt- prefix here if it exists, so use target_name */
+ lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+ XFREE (tmp_pathspec);
+ tmp_pathspec = NULL;
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ {
+ char* p;
+ while ((p = strchr (newargz[0], '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ }
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+ XFREE (target_name);
+ XFREE (actual_cwrapper_path);
+ XFREE (actual_cwrapper_name);
+
+ lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+ lt_setenv ("DUALCASE", "1"); /* for MSK sh */
+ lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+ lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+
+ newargc=0;
+ for (i = 1; i < argc; i++)
+ {
+ if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+ {
+ if (argv[i][env_set_opt_len] == '=')
+ {
+ const char *p = argv[i] + env_set_opt_len + 1;
+ lt_opt_process_env_set (p);
+ }
+ else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+ {
+ lt_opt_process_env_set (argv[++i]); /* don't copy */
+ }
+ else
+ lt_fatal ("%s missing required argument", env_set_opt);
+ continue;
+ }
+ if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+ {
+ if (argv[i][env_prepend_opt_len] == '=')
+ {
+ const char *p = argv[i] + env_prepend_opt_len + 1;
+ lt_opt_process_env_prepend (p);
+ }
+ else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+ {
+ lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+ }
+ else
+ lt_fatal ("%s missing required argument", env_prepend_opt);
+ continue;
+ }
+ if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+ {
+ if (argv[i][env_append_opt_len] == '=')
+ {
+ const char *p = argv[i] + env_append_opt_len + 1;
+ lt_opt_process_env_append (p);
+ }
+ else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+ {
+ lt_opt_process_env_append (argv[++i]); /* don't copy */
+ }
+ else
+ lt_fatal ("%s missing required argument", env_append_opt);
+ continue;
+ }
+ if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+ {
+ /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+ namespace, but it is not one of the ones we know about and
+ have already dealt with, above (inluding dump-script), then
+ report an error. Otherwise, targets might begin to believe
+ they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+ namespace. The first time any user complains about this, we'll
+ need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+ or a configure.ac-settable value.
+ */
+ lt_fatal ("Unrecognized option in %s namespace: '%s'",
+ ltwrapper_option_prefix, argv[i]);
+ }
+ /* otherwise ... */
+ newargz[++newargc] = xstrdup (argv[i]);
+ }
+ newargz[++newargc] = NULL;
+
+ LTWRAPPER_DEBUGPRINTF (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+ for (i = 0; i < newargc; i++)
+ {
+ LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ /* execv doesn't actually work on mingw as expected on unix */
+ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+ if (rval == -1)
+ {
+ /* failed to start process */
+ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+ return 127;
+ }
+ return rval;
+EOF
+ ;;
+ *)
+ cat <<"EOF"
+ execv (lt_argv_zero, newargz);
+ return rval; /* =127, but avoids unused variable warning */
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void *p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+ string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return base;
+}
+
+int
+check_executable (const char *path)
+{
+ struct stat st;
+
+ LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n",
+ path ? (*path ? path : "EMPTY!") : "NULL!"));
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 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;
+
+ LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n",
+ path ? (*path ? path : "EMPTY!") : "NULL!"));
+ 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;
+
+ LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n",
+ wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+
+ 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 ("getcwd failed");
+ 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 ("getcwd failed");
+ 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)
+ {
+ LTWRAPPER_DEBUGPRINTF (("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
+ {
+ char *errstr = strerror (errno);
+ lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+ }
+ }
+ XFREE (tmp_pathspec);
+
+ if (!has_symlinks)
+ {
+ return xstrdup (pathspec);
+ }
+
+ tmp_pathspec = realpath (pathspec, buf);
+ if (tmp_pathspec == 0)
+ {
+ lt_fatal ("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;
+}
+
+static void
+lt_error_core (int exit_status, const char *mode,
+ const char *message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+ LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+ (name ? name : "<NULL>"),
+ (value ? value : "<NULL>")));
+ {
+#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;
+}
+
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+ const char *p;
+ int len;
+ if (!arg || !*arg)
+ return 1;
+
+ p = strchr (arg, (int)'=');
+
+ if (!p)
+ return 1;
+
+ *value = xstrdup (++p);
+
+ len = strlen (arg) - strlen (*value);
+ *name = XMALLOC (char, len);
+ strncpy (*name, arg, len-1);
+ (*name)[len - 1] = '\0';
+
+ return 0;
+}
+
+void
+lt_opt_process_env_set (const char *arg)
+{
+ char *name = NULL;
+ char *value = NULL;
+
+ if (lt_split_name_value (arg, &name, &value) != 0)
+ {
+ XFREE (name);
+ XFREE (value);
+ lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+ }
+
+ lt_setenv (name, value);
+ XFREE (name);
+ XFREE (value);
+}
+
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+ char *name = NULL;
+ char *value = NULL;
+ char *new_value = NULL;
+
+ if (lt_split_name_value (arg, &name, &value) != 0)
+ {
+ XFREE (name);
+ XFREE (value);
+ lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+ }
+
+ new_value = lt_extend_str (getenv (name), value, 0);
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ XFREE (name);
+ XFREE (value);
+}
+
+void
+lt_opt_process_env_append (const char *arg)
+{
+ char *name = NULL;
+ char *value = NULL;
+ char *new_value = NULL;
+
+ if (lt_split_name_value (arg, &name, &value) != 0)
+ {
+ XFREE (name);
+ XFREE (value);
+ lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+ }
+
+ new_value = lt_extend_str (getenv (name), value, 1);
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ XFREE (name);
+ XFREE (value);
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+ LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+ (name ? name : "<NULL>"),
+ (value ? value : "<NULL>")));
+
+ 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)
+{
+ LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+ (name ? name : "<NULL>"),
+ (value ? value : "<NULL>")));
+
+ if (name && *name && value && *value)
+ {
+ char *new_value = lt_extend_str (getenv (name), value, 0);
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ }
+}
+
+
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# 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
+ 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
+ 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
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$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 "*) ;;
+ *) deplibs="$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
+# moreargs="$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
+ dlfiles="$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.
+ dlprefiles="$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 "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ weak)
+ weak_libs="$weak_libs $arg"
+ prev=
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$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
+ ;;
+
+ -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"
+ dir=$func_stripname_result
+ if test -z "$dir"; 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
+ # 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 "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ ::) dllsearchpath=$dir;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) dllsearchpath="$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*)
+ # 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
+ deplibs="$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
+ deplibs="$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)
+ compiler_flags="$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)
+ compiler_flags="$compiler_flags $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) new_inherited_linker_flags="$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_fatal_error "only absolute run-paths are allowed"
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$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"
+ arg="$arg $wl$func_quote_for_eval_result"
+ compiler_flags="$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"
+ arg="$arg $wl$func_quote_for_eval_result"
+ compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+ linker_flags="$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"
+ ;;
+
+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+ # -r[0-9][0-9]* specifies the processor on the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+ # +DA*, +DD* enable 64-bit mode on the HP compiler
+ # -q* pass through compiler args for the IBM compiler
+ # -m*, -t[45]*, -txscale* pass through architecture-specific
+ # compiler args for GCC
+ # -F/path gives path to uninstalled frameworks, gcc on darwin
+ # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+ # @file GCC response files
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ compiler_flags="$compiler_flags $arg"
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$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
+ dlfiles="$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.
+ dlprefiles="$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.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ 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 \"X\${$shlibpath_var}\" \| \$Xsed -e \'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"
+ # 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_duplicate_deps ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$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 "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$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=
+ case $lib in
+ *.la) func_source "$lib" ;;
+ esac
+
+ # Collect preopened libtool deplibs, except any this library
+ # has declared as weak libs
+ for deplib in $dependency_libs; do
+ deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+ case " $weak_libs " in
+ *" $deplib_base "*) ;;
+ *) deplibs="$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)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags $deplib"
+ if test "$linkmode" = lib ; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) new_inherited_linker_flags="$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 "*) ;;
+ * ) new_inherited_linker_flags="$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"
+ newlib_search_path="$newlib_search_path $func_stripname_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"
+ newlib_search_path="$newlib_search_path $func_stripname_result"
+ ;;
+ *)
+ func_warning "\`-L' is ignored for archives/objects"
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ func_stripname '-R' '' "$deplib"
+ dir=$func_stripname_result
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$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 \"X$deplib\"" 2>/dev/null | $Xsed -e 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.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$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 "X$inherited_linker_flags" | $Xsed -e '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 "*) ;;
+ *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+ esac
+ done
+ fi
+ dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e '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" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$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.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if $opt_duplicate_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$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=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ 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.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$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 "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ func_warning "library \`$lib' was moved."
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$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
+ notinst_path="$notinst_path $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$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
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$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" && \
+ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ 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
+ newlib_search_path="$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"
+ newlib_search_path="$newlib_search_path $func_stripname_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_duplicate_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$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:"*) ;;
+ *) temp_rpath="$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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=no
+ ;;
+ *)
+ if test "$installed" = no; then
+ notinst_deplibs="$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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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 "$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$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$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:"*) ;;
+ *) compile_shlibpath="$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:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$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:"*) ;;
+ *) finalize_shlibpath="$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
+ [\\/]*)
+ add_dir="$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 "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$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"
+ if $opt_duplicate_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ 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_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
+ compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+ linker_flags="$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 "X $new_inherited_linker_flags" | $Xsed -e '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 "*) ;;
+ *) lib_search_path="$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 "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$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
+ tmp_libs="$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"
+ objs="$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!"
+ libobjs="$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
+ 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|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)
+ 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.
+ verstring="$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"
+ libobjs="$libobjs $symfileobj"
+ test "X$libobjs" = "X " && libobjs=
+
+ if test "$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
+ removelist="$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
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ #for path in $notinst_path; do
+ # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+ # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+ # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "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
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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 "*) ;;
+ *) dlfiles="$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 "*) ;;
+ *) dlprefiles="$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*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$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
+ deplibs="$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 <<EOF
+ int main() { return 0; }
+EOF
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $ECHO
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ $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 I believe you do not have"
+ $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+ $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ ;;
+ *)
+ newdeplibs="$newdeplibs $i"
+ ;;
+ esac
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $ECHO
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ $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 a test_compile did reveal that the linker did not use this one"
+ $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ $ECHO
+ $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
+ $ECHO "*** make it link in! You will probably need to install it or some"
+ $ECHO "*** library that it depends on before this library will be fully"
+ $ECHO "*** functional. Installing it before continuing would be even better."
+ fi
+ ;;
+ *)
+ newdeplibs="$newdeplibs $i"
+ ;;
+ esac
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method; shift
+ file_magic_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 "*)
+ newdeplibs="$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
+ # 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+ $SED -e 10q |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$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.
+ newdeplibs="$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 "*)
+ newdeplibs="$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 \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+ $EGREP "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$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.
+ newdeplibs="$newdeplibs $a_deplib"
+ ;;
+ esac
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+ -e 's/ -lc$//' -e '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 "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+ done
+ fi
+ if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' |
+ $GREP . >/dev/null; then
+ $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
+ fi
+ ;;
+ 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 "X $newdeplibs" | $Xsed -e '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 "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ deplibs=`$ECHO "X $deplibs" | $Xsed -e '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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$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
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$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
+ 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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$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"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$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 "$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
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$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"
+ delfiles="$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 cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ func_len " $cmd"
+ len=$func_len_result
+ if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ func_show_eval "$cmd" 'exit $?'
+ 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 "X$include_expsyms" | $Xsed | $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
+ delfiles="$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 "*) ;;
+ *)
+ tmp_deplibs="$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"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ libobjs="$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\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$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
+ output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+
+ # 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
+ $ECHO "$obj" >> $output
+ done
+ $ECHO ')' >> $output
+ delfiles="$delfiles $output"
+ 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
+ $ECHO "$obj" >> $output
+ done
+ delfiles="$delfiles $output"
+ output=$firstobj\"$file_list_spec$output\"
+ 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.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$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~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+ if test -n "$last_robj"; then
+ eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+ fi
+ delfiles="$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 "$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 "X$include_expsyms" | $Xsed | $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
+ delfiles="$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"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ libobjs="$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 "$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 "$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 "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+ else
+ gentop="$output_objdir/${obj}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$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 "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+ finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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])
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ ;;
+ esac
+ fi
+ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+ compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$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 "*) ;;
+ *) finalize_rpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$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;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) dllsearchpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$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 "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$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
+ *cygwin* | *mingw* )
+ if test "$build_libtool_libs" != yes; then
+ wrappers_required=no
+ fi
+ ;;
+ *cegcc)
+ # Disable wrappers for cegcc, we are cross compiling anyway.
+ wrappers_required=no
+ ;;
+ *)
+ 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 "X$compile_command" | $Xsed -e '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=$?'
+
+ # 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
+ rpath="$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
+ rpath="$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 "X$link_command" | $Xsed -e '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 $?'
+ 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 "X$compile_var$compile_command$compile_rpath" | $Xsed -e '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 "X$link_command" | $Xsed -e '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 $?'
+
+ # 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $ECHO for shipping.
+ if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$ECHO "X$ECHO" | $Xsed -e "$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
+ oldobjs="$oldobjs $symfileobj"
+ fi
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $addlibs
+ oldobjs="$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"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ oldobjs="$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"
+ generated="$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"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+ 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
+ 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 "X$relink_command" | $Xsed -e "$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"
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ test -z "$libdir" && \
+ func_fatal_error "\`$deplib' is not a valid libtool archive"
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$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"
+ newdlfiles="$newdlfiles $libdir/$name"
+ ;;
+ *) newdlfiles="$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"
+ newdlprefiles="$newdlprefiles $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
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $RM $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ 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 "$mode" = link || test "$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) RM="$RM $arg"; rmforce=yes ;;
+ -*) RM="$RM $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ test -z "$RM" && \
+ func_fatal_help "you must specify an RM program"
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ func_dirname "$file" "" "."
+ dir="$func_dirname_result"
+ if test "X$dir" = X.; then
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ func_basename "$file"
+ name="$func_basename_result"
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ 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
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+ case "$mode" in
+ clean)
+ case " $library_names " in
+ # " " in the beginning catches empty $dlname
+ *" $dlname "*) ;;
+ *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ esac
+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${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
+ rmfiles="$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
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$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
+ rmfiles="$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
+ rmfiles="$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
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ func_show_eval "$RM $rmfiles" 'exit_status=1'
+ done
+ objdir="$origobjdir"
+
+ # 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 "$mode" = uninstall || test "$mode" = clean; } &&
+ func_mode_uninstall ${1+"$@"}
+
+test -z "$mode" && {
+ help="$generic_help"
+ func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+ func_fatal_help "invalid operation mode \`$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..6252121
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,24 @@
+EXTRA_DIST = \
+ check-libheader.m4 \
+ codeset.m4 \
+ freetype2.m4 \
+ gettext.m4 \
+ glibc21.m4 \
+ gst-alsa.m4 \
+ gst-fionread.m4 \
+ gst-ivorbis.m4 \
+ iconv.m4 \
+ intdiv0.m4 \
+ inttypes_h.m4 \
+ inttypes-pri.m4 \
+ lcmessage.m4 \
+ lib-ld.m4 \
+ lib-link.m4 \
+ lib-prefix.m4 \
+ lrintf.m4 \
+ lrint.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..a1d58af
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,581 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = \
+ check-libheader.m4 \
+ codeset.m4 \
+ freetype2.m4 \
+ gettext.m4 \
+ glibc21.m4 \
+ gst-alsa.m4 \
+ gst-fionread.m4 \
+ gst-ivorbis.m4 \
+ iconv.m4 \
+ intdiv0.m4 \
+ inttypes_h.m4 \
+ inttypes-pri.m4 \
+ lcmessage.m4 \
+ lib-ld.m4 \
+ lib-link.m4 \
+ lib-prefix.m4 \
+ lrintf.m4 \
+ lrint.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/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 <langinfo.h>],
+ [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 <langinfo.h> and nl_langinfo(CODESET).])
+ 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 <ft2build.h>
+#include FT_FREETYPE_H
+#include <stdio.h>
+#include <stdlib.h>
+
+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/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 <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 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 <inttypes.h> 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 <libintl.h>
+$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 <libintl.h>
+$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 <libintl.h>
+$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/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 <features.h>
+#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 <richard-alsa@tartarus.org>
+dnl Christopher Lansdown <lansdoct@cs.alfred.edu>
+dnl Jaroslav Kysela <perex@suse.cz>
+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 <alsa/asoundlib.h>
+], [
+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-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 <sys/types.h>
+#include <sys/ioctl.h>
+], [
+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 <sys/types.h>
+ #include <sys/filio.h>
+ ], [
+ 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tremor/codec.h>
+],,, 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/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 <stdlib.h>
+#include <iconv.h>],
+ [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 <stdlib.h>
+#include <iconv.h>],
+ [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 <iconv.h>
+#include <string.h>
+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 <stdlib.h>
+#include <iconv.h>
+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 <stdlib.h>
+#include <signal.h>
+
+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 <CoreFoundation/CFPreferences.h>],
+ [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 <CoreFoundation/CFLocale.h>], [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 <inttypes.h> 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 <inttypes.h>
+#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 <inttypes.h> 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 <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, 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 <sys/types.h>
+#include <inttypes.h>],
+ [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 <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ 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 <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([gt_LC_MESSAGES],
+[
+ AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [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 <locale.h> 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 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# 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.
+ 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/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..a3fee53
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7377 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007, 2008 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 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 56 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_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
+
+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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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
+_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_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])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
+_LT_PROG_ECHO_BACKSLASH
+
+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
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# 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'
+
+# 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_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 "X$][$1" | $Xsed -e "$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:
+#
+# <var>='`$ECHO "X$<var>" | $Xsed -e "$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'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 "X\\\\\$\$var"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+ lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+ ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_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])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+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 <bug-libtool@gnu.org>."
+
+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) 2008 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.
+if test "$no_create" != yes; then
+ 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)
+fi
+])# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ _LT_PROG_XSI_SHELLFNS
+
+ sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ 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)],
+ [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
+
+
+# _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([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)])
+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], [])
+
+
+# _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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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"
+ ])
+ 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" != ":"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# 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
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+ _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=echo
+ _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
+# -----------------------
+# 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.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+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 "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $ECHO works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<_LT_EOF
+[$]*
+_LT_EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$lt_ECHO"; then
+ if test "X${echo_test_string+set}" != Xset; then
+ # find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+ { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+ then
+ break
+ fi
+ done
+ fi
+
+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+ else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ ECHO="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$ECHO" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ ECHO='print -r'
+ elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ ECHO='printf %s\n'
+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ ECHO=echo
+ fi
+ fi
+ fi
+ fi
+ fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+ [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _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 __oline__ "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
+ ;;
+sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;;
+ *)
+ 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_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_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_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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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;
+ ;;
+
+ 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
+ ;;
+
+ 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+ = "XX$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 __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#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
+
+void fnord() { int i=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;
+ /* 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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+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
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+ # 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 -e 's/;/ /g'`
+ else
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # 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; }
+}'`
+ sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+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
+ 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
+ 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<name>.so
+ # instead of lib<name>.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=`$ECHO "X$lib" | $Xsed -e '\''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
+ 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,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+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[[123]]*) 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
+ 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
+ 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'
+ ;;
+
+interix[[3-9]]*)
+ 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'
+ 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
+ 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 Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-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'
+ 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
+ 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],
+ [shlibpath_overrides_runpath=yes])])
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+ # 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;/^$/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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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([], [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
+
+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 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_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])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+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
+ 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
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[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.
+ if ( 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
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ 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
+ ;;
+
+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]) 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 Linux 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_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_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.
+ AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+ 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:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:__oline__: $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:__oline__: 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_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-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
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ _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([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};"\
+" /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
+
+ # 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
+#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. */
+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_save_LIBS="$LIBS"
+ lt_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_save_LIBS"
+ CFLAGS="$lt_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
+
+_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_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)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+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)=
+ ;;
+ 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
+ ;;
+ 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*)
+ # IBM XL 8.0 on PPC
+ _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*)
+ # 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'
+ ;;
+
+ 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
+ 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'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # 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*)
+ # IBM XL C 8.0/Fortran 10.1 on PPC
+ _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)='-Wl,'
+ ;;
+ *Sun\ F*)
+ # 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)=''
+ ;;
+ 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*)
+ _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_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+ [How to pass a linker flag through the compiler])
+
+#
+# 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])
+
+#
+# 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_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'
+ 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
+ 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")) && ([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*)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ linux* | k*bsd*-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
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+ 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_flag_spec_ld, $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)
+ _LT_TAGVAR(link_all_deplibs, $1)=no
+ ;;
+ esac
+
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = 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.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_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 <jrb3@best.com> 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(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/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+ 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
+ ;;
+
+ 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=
+ 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ 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; $ECHO \"$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*)
+ # 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)=
+ _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $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'
+ 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 $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
+ ;;
+
+ 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 $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
+
+ 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
+ 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")) && ([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
+ _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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
+ _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'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _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.
+ _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 `$ECHO "X$deplibs" | $Xsed -e '\''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(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ 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
+ ;;
+
+ freebsd1*)
+ _LT_TAGVAR(ld_shlibs, $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 -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 -fPIC ${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 -a "$with_gnu_ld" = no; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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_flag_spec_ld, $1)='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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'
+ ;;
+ *)
+ _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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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.
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ AC_LINK_IFELSE(int foo(void) {},
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ )
+ LDFLAGS="$save_LDFLAGS"
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $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_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _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*
+ AC_MSG_RESULT([$_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_flag_spec_ld], [1],
+ [[If ld is used when linking, 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([], [fix_srcfile_path], [1],
+ [Fix the shell variable $srcfile for the compiler])
+_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([], [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_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+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
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _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],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+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_flag_spec_ld, $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(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_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++"}
+ 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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -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 "\-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
+ _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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
+ _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'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _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 <jrb3@best.com> 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*)
+ # _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(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
+ ;;
+ 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
+ ;;
+
+ freebsd[[12]]*)
+ # 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*)
+ ;;
+
+ 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; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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; $ECHO "X$list" | $Xsed'
+
+ _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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ ;;
+ xl*)
+ # 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; $ECHO \"$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='echo'
+
+ # 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=echo
+ 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ ;;
+ *)
+ 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*)
+ # 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='echo'
+
+ # 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 -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 -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 "\-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 "\-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(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
+ 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_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
+# 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
+])
+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 $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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
+ ;;
+
+ *.$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
+
+# 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*)
+ # 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_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+ _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _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_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_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_flag_spec_ld, $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(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
+ CC=${F77-"f77"}
+ 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"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+ _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _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_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_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_flag_spec_ld, $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(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
+ CC=${FC-"f95"}
+ 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"
+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_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+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
+
+## 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"
+])# _LT_LANG_GCJ_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_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+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"
+])# _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_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_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"}, \
+ = c,a/b,, \
+ && 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_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+ yes)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# 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 ()
+{
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+}
+
+# func_basename file
+func_basename ()
+{
+ func_basename_result="${1##*/}"
+}
+
+# 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 ()
+{
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+ func_basename_result="${1##*/}"
+}
+
+# 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_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}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+ func_opt_split_opt=${1%%=*}
+ func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+ case ${1} in
+ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+ *) func_lo2o_result=${1} ;;
+ esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=${#1}
+}
+
+_LT_EOF
+ ;;
+ *) # Bourne compatible functions.
+ cat << \_LT_EOF >> "$cfgfile"
+
+# 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 ()
+{
+ # Extract subdirectory from the argument.
+ func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file
+func_basename ()
+{
+ func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# 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 "X${3}" \
+ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "X${3}" \
+ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+ esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+ func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+ func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+ func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+ yes)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "$[1]+=\$[2]"
+}
+_LT_EOF
+ ;;
+ *)
+ cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+ ;;
+ esac
+])
diff --git a/m4/lrint.m4 b/m4/lrint.m4
new file mode 100644
index 0000000..7d72c73
--- /dev/null
+++ b/m4/lrint.m4
@@ -0,0 +1,27 @@
+dnl @synopsis AC_C99_FUNC_LRINT
+dnl
+dnl Check whether C99's lrint function is available.
+dnl @version 1.1
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
+dnl and this permission notice appear in all copies. No representations are
+dnl made about the suitability of this software for any purpose. It is
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINT],
+[AC_CACHE_CHECK(for lrint,
+ ac_cv_c99_lrint,
+[AC_TRY_LINK([
+#define _ISOC9X_SOURCE 1
+#define _ISOC99_SOURCE 1
+#define __USE_ISOC99 1
+#define __USE_ISOC9X 1
+#include <math.h>],
+[ int value = lrint (0.432) ; ], ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)])
+if test $ac_cv_c99_lrint = yes; then
+ AC_DEFINE(HAVE_LRINT, 1,
+ [Define if you have C99's lrint function.])
+fi
+])# AC_C99_LRINT
diff --git a/m4/lrintf.m4 b/m4/lrintf.m4
new file mode 100644
index 0000000..f9b76e3
--- /dev/null
+++ b/m4/lrintf.m4
@@ -0,0 +1,27 @@
+dnl @synopsis AC_C99_FUNC_LRINTF
+dnl
+dnl Check whether C99's lrintf function is available.
+dnl @version 1.1
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
+dnl and this permission notice appear in all copies. No representations are
+dnl made about the suitability of this software for any purpose. It is
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINTF],
+[AC_CACHE_CHECK(for lrintf,
+ ac_cv_c99_lrintf,
+[AC_TRY_LINK([
+#define _ISOC9X_SOURCE 1
+#define _ISOC99_SOURCE 1
+#define __USE_ISOC99 1
+#define __USE_ISOC9X 1
+#include <math.h>],
+[ int value = lrintf (0.432) ; ], ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)])
+if test $ac_cv_c99_lrintf = yes; then
+ AC_DEFINE(HAVE_LRINTF, 1,
+ [Define if you have C99's lrintf function.])
+fi
+])# AC_C99_LRINTF
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..34151a3
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,368 @@
+# Helper functions for option handling. -*- 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 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], [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [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],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [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..f3c5309
--- /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.
+
+# Generated from ltversion.in.
+
+# serial 3017 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6b])
+m4_define([LT_PACKAGE_REVISION], [1.3017])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6b'
+macro_revision='1.3017'
+_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..637bb20
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,92 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007 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 4 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_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
+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])])
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 <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 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 <jack@icecast.org> 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ogg/ogg.h>
+
+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 <stdio.h>
+#include <ogg/ogg.h>
+], [ 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 <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 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 <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^[ ]*VARIABLE[ ]*=/{
+ # Seen the first line of the variable definition.
+ s/^[ ]*VARIABLE[ ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ 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
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+ ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # 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)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ 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"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ 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/'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ 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=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ 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/'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$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" <<EOF
+$frobbedlang.msg: $lang.po
+ @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$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/_/-/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" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+ @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644
index 0000000..a56365c
--- /dev/null
+++ b/m4/progtest.m4
@@ -0,0 +1,92 @@
+# progtest.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 1996-2003, 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 <drepper@cygnus.com>, 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 <stdint.h> exists,
+# doesn't clash with <sys/types.h>, 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 <sys/types.h>
+#include <stdint.h>],
+ [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 <stdint.h> exists, doesn't clash with <sys/types.h>,
+ 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 <stdint.h> or <inttypes.h>.
+
+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 <stdint.h> and <inttypes.h> don't define.])
+ else
+ AC_DEFINE(HAVE_UINTMAX_T, 1,
+ [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+ 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 <jack@icecast.org> 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vorbis/codec.h>
+#include <vorbis/vorbisenc.h>
+
+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 <stdio.h>
+#include <vorbis/codec.h>
+], [ 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..28055d2
--- /dev/null
+++ b/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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 <http://www.gnu.org/licenses/>.
+
+# 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
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ 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 <bug-automake@gnu.org>."
+ 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.
+ ;;
+
+ tar*)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ 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
+ ;;
+
+ tar*)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case $firstarg in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case $firstarg in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ 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/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
new file mode 100644
index 0000000..11b8f47
--- /dev/null
+++ b/pkgconfig/Makefile.am
@@ -0,0 +1,66 @@
+### all of the standard pc files we need to generate
+pcverfiles = \
+ gstreamer-audio-@GST_MAJORMINOR@.pc \
+ gstreamer-app-@GST_MAJORMINOR@.pc \
+ gstreamer-cdda-@GST_MAJORMINOR@.pc \
+ gstreamer-fft-@GST_MAJORMINOR@.pc \
+ gstreamer-interfaces-@GST_MAJORMINOR@.pc \
+ gstreamer-netbuffer-@GST_MAJORMINOR@.pc \
+ gstreamer-pbutils-@GST_MAJORMINOR@.pc \
+ gstreamer-riff-@GST_MAJORMINOR@.pc \
+ gstreamer-rtp-@GST_MAJORMINOR@.pc \
+ gstreamer-rtsp-@GST_MAJORMINOR@.pc \
+ gstreamer-sdp-@GST_MAJORMINOR@.pc \
+ gstreamer-tag-@GST_MAJORMINOR@.pc \
+ gstreamer-video-@GST_MAJORMINOR@.pc \
+ gstreamer-plugins-base-@GST_MAJORMINOR@.pc
+pcverfiles_uninstalled = \
+ gstreamer-audio-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-app-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-cdda-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-fft-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-interfaces-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-netbuffer-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-pbutils-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-riff-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-rtp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-rtsp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-sdp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-tag-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-video-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-plugins-base-@GST_MAJORMINOR@-uninstalled.pc
+
+all-local: $(pcverfiles) $(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_0)cp $< $@
+%-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc
+ $(cp_verbose_0)cp $< $@
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = $(pcverfiles)
+
+CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled)
+pcinfiles = \
+ gstreamer-audio.pc.in gstreamer-audio-uninstalled.pc.in \
+ gstreamer-app.pc.in gstreamer-app-uninstalled.pc.in \
+ gstreamer-cdda.pc.in gstreamer-cdda-uninstalled.pc.in \
+ gstreamer-fft.pc.in gstreamer-fft-uninstalled.pc.in \
+ gstreamer-interfaces.pc.in gstreamer-interfaces-uninstalled.pc.in \
+ gstreamer-netbuffer.pc.in gstreamer-netbuffer-uninstalled.pc.in \
+ gstreamer-pbutils.pc.in gstreamer-pbutils-uninstalled.pc.in \
+ gstreamer-riff.pc.in gstreamer-riff-uninstalled.pc.in \
+ gstreamer-rtp.pc.in gstreamer-rtp-uninstalled.pc.in \
+ gstreamer-rtsp.pc.in gstreamer-rtsp-uninstalled.pc.in \
+ gstreamer-sdp.pc.in gstreamer-sdp-uninstalled.pc.in \
+ gstreamer-tag.pc.in gstreamer-tag-uninstalled.pc.in \
+ gstreamer-video.pc.in gstreamer-video-uninstalled.pc.in \
+ gstreamer-plugins-base.pc.in gstreamer-plugins-base-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..359dccd
--- /dev/null
+++ b/pkgconfig/Makefile.in
@@ -0,0 +1,769 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-app-uninstalled.pc.in \
+ $(srcdir)/gstreamer-app.pc.in \
+ $(srcdir)/gstreamer-audio-uninstalled.pc.in \
+ $(srcdir)/gstreamer-audio.pc.in \
+ $(srcdir)/gstreamer-cdda-uninstalled.pc.in \
+ $(srcdir)/gstreamer-cdda.pc.in \
+ $(srcdir)/gstreamer-fft-uninstalled.pc.in \
+ $(srcdir)/gstreamer-fft.pc.in \
+ $(srcdir)/gstreamer-interfaces-uninstalled.pc.in \
+ $(srcdir)/gstreamer-interfaces.pc.in \
+ $(srcdir)/gstreamer-netbuffer-uninstalled.pc.in \
+ $(srcdir)/gstreamer-netbuffer.pc.in \
+ $(srcdir)/gstreamer-pbutils-uninstalled.pc.in \
+ $(srcdir)/gstreamer-pbutils.pc.in \
+ $(srcdir)/gstreamer-plugins-base-uninstalled.pc.in \
+ $(srcdir)/gstreamer-plugins-base.pc.in \
+ $(srcdir)/gstreamer-riff-uninstalled.pc.in \
+ $(srcdir)/gstreamer-riff.pc.in \
+ $(srcdir)/gstreamer-rtp-uninstalled.pc.in \
+ $(srcdir)/gstreamer-rtp.pc.in \
+ $(srcdir)/gstreamer-rtsp-uninstalled.pc.in \
+ $(srcdir)/gstreamer-rtsp.pc.in \
+ $(srcdir)/gstreamer-sdp-uninstalled.pc.in \
+ $(srcdir)/gstreamer-sdp.pc.in \
+ $(srcdir)/gstreamer-tag-uninstalled.pc.in \
+ $(srcdir)/gstreamer-tag.pc.in \
+ $(srcdir)/gstreamer-video-uninstalled.pc.in \
+ $(srcdir)/gstreamer-video.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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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-audio.pc gstreamer-audio-uninstalled.pc \
+ gstreamer-app.pc gstreamer-app-uninstalled.pc \
+ gstreamer-cdda.pc gstreamer-cdda-uninstalled.pc \
+ gstreamer-fft.pc gstreamer-fft-uninstalled.pc \
+ gstreamer-interfaces.pc gstreamer-interfaces-uninstalled.pc \
+ gstreamer-netbuffer.pc gstreamer-netbuffer-uninstalled.pc \
+ gstreamer-pbutils.pc gstreamer-pbutils-uninstalled.pc \
+ gstreamer-riff.pc gstreamer-riff-uninstalled.pc \
+ gstreamer-rtp.pc gstreamer-rtp-uninstalled.pc \
+ gstreamer-rtsp.pc gstreamer-rtsp-uninstalled.pc \
+ gstreamer-sdp.pc gstreamer-sdp-uninstalled.pc gstreamer-tag.pc \
+ gstreamer-tag-uninstalled.pc gstreamer-video.pc \
+ gstreamer-video-uninstalled.pc gstreamer-plugins-base.pc \
+ gstreamer-plugins-base-uninstalled.pc
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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__installdirs = "$(DESTDIR)$(pkgconfigdir)"
+DATA = $(pkgconfig_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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-audio-@GST_MAJORMINOR@.pc \
+ gstreamer-app-@GST_MAJORMINOR@.pc \
+ gstreamer-cdda-@GST_MAJORMINOR@.pc \
+ gstreamer-fft-@GST_MAJORMINOR@.pc \
+ gstreamer-interfaces-@GST_MAJORMINOR@.pc \
+ gstreamer-netbuffer-@GST_MAJORMINOR@.pc \
+ gstreamer-pbutils-@GST_MAJORMINOR@.pc \
+ gstreamer-riff-@GST_MAJORMINOR@.pc \
+ gstreamer-rtp-@GST_MAJORMINOR@.pc \
+ gstreamer-rtsp-@GST_MAJORMINOR@.pc \
+ gstreamer-sdp-@GST_MAJORMINOR@.pc \
+ gstreamer-tag-@GST_MAJORMINOR@.pc \
+ gstreamer-video-@GST_MAJORMINOR@.pc \
+ gstreamer-plugins-base-@GST_MAJORMINOR@.pc
+
+pcverfiles_uninstalled = \
+ gstreamer-audio-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-app-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-cdda-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-fft-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-interfaces-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-netbuffer-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-pbutils-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-riff-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-rtp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-rtsp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-sdp-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-tag-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-video-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-plugins-base-@GST_MAJORMINOR@-uninstalled.pc
+
+cp_verbose = $(cp_verbose_$(V))
+cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY))
+cp_verbose_0 = @echo " CP $@";
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = $(pcverfiles)
+CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled)
+pcinfiles = \
+ gstreamer-audio.pc.in gstreamer-audio-uninstalled.pc.in \
+ gstreamer-app.pc.in gstreamer-app-uninstalled.pc.in \
+ gstreamer-cdda.pc.in gstreamer-cdda-uninstalled.pc.in \
+ gstreamer-fft.pc.in gstreamer-fft-uninstalled.pc.in \
+ gstreamer-interfaces.pc.in gstreamer-interfaces-uninstalled.pc.in \
+ gstreamer-netbuffer.pc.in gstreamer-netbuffer-uninstalled.pc.in \
+ gstreamer-pbutils.pc.in gstreamer-pbutils-uninstalled.pc.in \
+ gstreamer-riff.pc.in gstreamer-riff-uninstalled.pc.in \
+ gstreamer-rtp.pc.in gstreamer-rtp-uninstalled.pc.in \
+ gstreamer-rtsp.pc.in gstreamer-rtsp-uninstalled.pc.in \
+ gstreamer-sdp.pc.in gstreamer-sdp-uninstalled.pc.in \
+ gstreamer-tag.pc.in gstreamer-tag-uninstalled.pc.in \
+ gstreamer-video.pc.in gstreamer-video-uninstalled.pc.in \
+ gstreamer-plugins-base.pc.in gstreamer-plugins-base-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-audio.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-audio.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-audio-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-audio-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-app.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-app.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-app-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-app-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-cdda.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-cdda.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-cdda-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-cdda-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-fft.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-fft.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-fft-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-fft-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-interfaces.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-interfaces.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-interfaces-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-interfaces-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-netbuffer.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-netbuffer.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-netbuffer-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-netbuffer-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-pbutils.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-pbutils.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-pbutils-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-pbutils-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-riff.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-riff.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-riff-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-riff-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-rtp.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-rtp.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-rtp-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-rtp-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-rtsp.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-rtsp.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-rtsp-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-rtsp-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-sdp.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-sdp.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-sdp-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-sdp-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-tag.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-tag.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-tag-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-tag-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-video.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-video.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-video-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-video-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-plugins-base.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-plugins-base.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-plugins-base-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-plugins-base-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgconfigDATA: $(pkgconfig_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || 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)$(pkgconfigdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+ done
+
+uninstall-pkgconfigDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+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) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(pkgconfigdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-pkgconfigDATA
+
+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-pkgconfigDATA
+
+.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-pkgconfigDATA 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-pkgconfigDATA
+
+
+all-local: $(pcverfiles) $(pcverfiles_uninstalled)
+
+### how to generate versioned .pc files from .pc files in this dir
+%-@GST_MAJORMINOR@.pc: %.pc
+ $(cp_verbose_0)cp $< $@
+%-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc
+ $(cp_verbose_0)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-app-uninstalled.pc.in b/pkgconfig/gstreamer-app-uninstalled.pc.in
new file mode 100644
index 0000000..b989798
--- /dev/null
+++ b/pkgconfig/gstreamer-app-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/app
+typelibdir=@abs_top_builddir@/gst-libs/gst/app
+
+Name: GStreamer Application Library, Uninstalled
+Description: Helper functions and base classes for application integration, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-app.pc.in b/pkgconfig/gstreamer-app.pc.in
new file mode 100644
index 0000000..8152eff
--- /dev/null
+++ b/pkgconfig/gstreamer-app.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Application Library
+Description: Helper functions and base classes for application integration
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstapp-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-audio-uninstalled.pc.in b/pkgconfig/gstreamer-audio-uninstalled.pc.in
new file mode 100644
index 0000000..ce55cf9
--- /dev/null
+++ b/pkgconfig/gstreamer-audio-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/audio
+typelibdir=@abs_top_builddir@/gst-libs/gst/audio
+
+Name: GStreamer Audio Library, Uninstalled
+Description: Audio helper functions and base classes, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@ gstreamer-interfaces-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-audio.pc.in b/pkgconfig/gstreamer-audio.pc.in
new file mode 100644
index 0000000..5743ccf
--- /dev/null
+++ b/pkgconfig/gstreamer-audio.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Audio library
+Description: Audio helper functions and base classes
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@ gstreamer-interfaces-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstaudio-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-cdda-uninstalled.pc.in b/pkgconfig/gstreamer-cdda-uninstalled.pc.in
new file mode 100644
index 0000000..15773e8
--- /dev/null
+++ b/pkgconfig/gstreamer-cdda-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/cdda
+typelibdir=@abs_top_builddir@/gst-libs/gst/cdda
+
+Name: GStreamer CDDA Library, Uninstalled
+Description: CDDA base classes, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@ gstreamer-tag-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-cdda.pc.in b/pkgconfig/gstreamer-cdda.pc.in
new file mode 100644
index 0000000..86f4a2b
--- /dev/null
+++ b/pkgconfig/gstreamer-cdda.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer CDDA Library
+Description: CDDA base classes
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@ gstreamer-tag-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstcdda-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-fft-uninstalled.pc.in b/pkgconfig/gstreamer-fft-uninstalled.pc.in
new file mode 100644
index 0000000..163f3f0
--- /dev/null
+++ b/pkgconfig/gstreamer-fft-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/fft
+typelibdir=@abs_top_builddir@/gst-libs/gst/fft
+
+Name: GStreamer FFT Library, Uninstalled
+Description: FFT implementation, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la @LIBM@
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-fft.pc.in b/pkgconfig/gstreamer-fft.pc.in
new file mode 100644
index 0000000..5680a0c
--- /dev/null
+++ b/pkgconfig/gstreamer-fft.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer FFT Library
+Description: FFT implementation
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstfft-@GST_MAJORMINOR@ @LIBM@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-interfaces-uninstalled.pc.in b/pkgconfig/gstreamer-interfaces-uninstalled.pc.in
new file mode 100644
index 0000000..676a23f
--- /dev/null
+++ b/pkgconfig/gstreamer-interfaces-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/interfaces
+typelibdir=@abs_top_builddir@/gst-libs/gst/interfaces
+
+Name: GStreamer Interfaces Library, Uninstalled
+Description: Interfaces for GStreamer elements, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-interfaces.pc.in b/pkgconfig/gstreamer-interfaces.pc.in
new file mode 100644
index 0000000..24749be
--- /dev/null
+++ b/pkgconfig/gstreamer-interfaces.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Interfaces Library
+Description: Interfaces for GStreamer elements
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstinterfaces-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-netbuffer-uninstalled.pc.in b/pkgconfig/gstreamer-netbuffer-uninstalled.pc.in
new file mode 100644
index 0000000..941c728
--- /dev/null
+++ b/pkgconfig/gstreamer-netbuffer-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/netbuffer
+typelibdir=@abs_top_builddir@/gst-libs/gst/netbuffer
+
+Name: GStreamer Network Buffer Library, Uninstalled
+Description: Network buffer for use in network sources/sinks, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-netbuffer.pc.in b/pkgconfig/gstreamer-netbuffer.pc.in
new file mode 100644
index 0000000..28d7ed2
--- /dev/null
+++ b/pkgconfig/gstreamer-netbuffer.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Network Buffer Library
+Description: Network buffer for use in network sources/sinks
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstnetbuffer-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-pbutils-uninstalled.pc.in b/pkgconfig/gstreamer-pbutils-uninstalled.pc.in
new file mode 100644
index 0000000..e08758c
--- /dev/null
+++ b/pkgconfig/gstreamer-pbutils-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/pbutils
+typelibdir=@abs_top_builddir@/gst-libs/gst/pbutils
+
+Name: GStreamer Base Utils Library, Uninstalled
+Description: General utility functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-pbutils.pc.in b/pkgconfig/gstreamer-pbutils.pc.in
new file mode 100644
index 0000000..e1626a4
--- /dev/null
+++ b/pkgconfig/gstreamer-pbutils.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Base Utils Library
+Description: General utility functions
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstpbutils-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in b/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in
new file mode 100644
index 0000000..8a9bea2
--- /dev/null
+++ b/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+pluginsdir=@abs_top_builddir@
+
+Name: GStreamer Base Plugins Libraries, Uninstalled
+Description: Streaming media framework, base plugins libraries, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: -L@abs_top_builddir@/gst-libs/gst/audio -L@abs_top_builddir@/gst-libs/gst/cdda -L@abs_top_builddir@/gst-libs/gst/fft -L@abs_top_builddir@/gst-libs/gst/floatcast -L@abs_top_builddir@/gst-libs/gst/interfaces -L@abs_top_builddir@/gst-libs/gst/netbuffer -L@abs_top_builddir@/gst-libs/gst/riff -L@abs_top_builddir@/gst-libs/gst/rtp -L@abs_top_builddir@/gst-libs/gst/rtsp -L@abs_top_builddir@/gst-libs/gst/sdp -L@abs_top_builddir@/gst-libs/gst/tag -L@abs_top_builddir@/gst-libs/gst/pbutils -L@abs_top_builddir@/gst-libs/gst/video -L@abs_top_builddir@/gst-libs/gst/app
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
+libraries=app audio cdda fft floatcast interfaces netbuffer riff rtp rtsp sdp tag pbutils video
diff --git a/pkgconfig/gstreamer-plugins-base.pc.in b/pkgconfig/gstreamer-plugins-base.pc.in
new file mode 100644
index 0000000..4bc6088
--- /dev/null
+++ b/pkgconfig/gstreamer-plugins-base.pc.in
@@ -0,0 +1,14 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+pluginsdir=@libdir@/gstreamer-@GST_MAJORMINOR@
+
+Name: GStreamer Base Plugins Libraries
+Description: Streaming media framework, base plugins libraries
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir}
+Cflags: -I${includedir}
+
+libraries=audio cdda fft floatcast interfaces netbuffer riff rtp tag pbutils video
diff --git a/pkgconfig/gstreamer-riff-uninstalled.pc.in b/pkgconfig/gstreamer-riff-uninstalled.pc.in
new file mode 100644
index 0000000..2592ba1
--- /dev/null
+++ b/pkgconfig/gstreamer-riff-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/riff
+typelibdir=@abs_top_builddir@/gst-libs/gst/riff
+
+Name: GStreamer RIFF Library, Uninstalled
+Description: RIFF helper functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/riff/libgstriff-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-riff.pc.in b/pkgconfig/gstreamer-riff.pc.in
new file mode 100644
index 0000000..0858276
--- /dev/null
+++ b/pkgconfig/gstreamer-riff.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer RIFF Library
+Description: RIFF helper functions
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstriff-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-rtp-uninstalled.pc.in b/pkgconfig/gstreamer-rtp-uninstalled.pc.in
new file mode 100644
index 0000000..96c66cd
--- /dev/null
+++ b/pkgconfig/gstreamer-rtp-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/rtp
+typelibdir=@abs_top_builddir@/gst-libs/gst/rtp
+
+Name: GStreamer RTP Library, Uninstalled
+Description: RTP base classes and helper functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-rtp.pc.in b/pkgconfig/gstreamer-rtp.pc.in
new file mode 100644
index 0000000..ff74a9d
--- /dev/null
+++ b/pkgconfig/gstreamer-rtp.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer RTP Library
+Description: RTP base classes and helper functions
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstrtp-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-rtsp-uninstalled.pc.in b/pkgconfig/gstreamer-rtsp-uninstalled.pc.in
new file mode 100644
index 0000000..53258ec
--- /dev/null
+++ b/pkgconfig/gstreamer-rtsp-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/rtsp
+typelibdir=@abs_top_builddir@/gst-libs/gst/rtsp
+
+Name: GStreamer RTSP Library, Uninstalled
+Description: RTSP base classes and helper functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-sdp-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-rtsp.pc.in b/pkgconfig/gstreamer-rtsp.pc.in
new file mode 100644
index 0000000..203e400
--- /dev/null
+++ b/pkgconfig/gstreamer-rtsp.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer RTSP Library
+Description: RTSP base classes and helper functions
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-sdp-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstrtsp-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-sdp-uninstalled.pc.in b/pkgconfig/gstreamer-sdp-uninstalled.pc.in
new file mode 100644
index 0000000..bd1d89d
--- /dev/null
+++ b/pkgconfig/gstreamer-sdp-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/sdp
+typelibdir=@abs_top_builddir@/gst-libs/gst/sdp
+
+Name: GStreamer SDP Library, Uninstalled
+Description: SDP helper functions, uninstalled
+Version: @VERSION@
+Requires: glib-2.0
+Libs: @abs_top_builddir@/gst-libs/gst/sdp/libgstsdp-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-sdp.pc.in b/pkgconfig/gstreamer-sdp.pc.in
new file mode 100644
index 0000000..9bb0f40
--- /dev/null
+++ b/pkgconfig/gstreamer-sdp.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer SDP Library
+Description: SDP helper functions
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} -lgstsdp-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-tag-uninstalled.pc.in b/pkgconfig/gstreamer-tag-uninstalled.pc.in
new file mode 100644
index 0000000..b953a4c
--- /dev/null
+++ b/pkgconfig/gstreamer-tag-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/tag
+typelibdir=@abs_top_builddir@/gst-libs/gst/tag
+
+Name: GStreamer Tag Library, Uninstalled
+Description: Tag base classes and helper functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-tag.pc.in b/pkgconfig/gstreamer-tag.pc.in
new file mode 100644
index 0000000..a7a564c
--- /dev/null
+++ b/pkgconfig/gstreamer-tag.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Tag Library
+Description: Tag base classes and helper functions
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgsttag-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-video-uninstalled.pc.in b/pkgconfig/gstreamer-video-uninstalled.pc.in
new file mode 100644
index 0000000..450be2b
--- /dev/null
+++ b/pkgconfig/gstreamer-video-uninstalled.pc.in
@@ -0,0 +1,16 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@/gst-libs
+girdir=@abs_top_builddir@/gst-libs/gst/video
+typelibdir=@abs_top_builddir@/gst-libs/gst/video
+
+Name: GStreamer Video Library, Uninstalled
+Description: Video base classes and helper functions, uninstalled
+Version: @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Libs: @abs_top_builddir@/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
diff --git a/pkgconfig/gstreamer-video.pc.in b/pkgconfig/gstreamer-video.pc.in
new file mode 100644
index 0000000..59a217d
--- /dev/null
+++ b/pkgconfig/gstreamer-video.pc.in
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer Video Library
+Description: Video base classes and helper functions
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstvideo-@GST_MAJORMINOR@
+Cflags: -I${includedir}
+
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..c512a1a
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1 @@
+af az bg ca cs da de el en_GB es eo eu fi fr gl hu id it ja lt lv nb nl or pl pt_BR ro ru sk sl sq sr sv tr uk vi zh_CN
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 <drepper@gnu.ai.mit.edu>
+#
+# 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..10ed9f6
--- /dev/null
+++ b/po/Makevars
@@ -0,0 +1,47 @@
+# 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..6b19ec3
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,18 @@
+ext/alsa/gstalsamixertrack.c
+ext/alsa/gstalsasink.c
+ext/alsa/gstalsasrc.c
+ext/cdparanoia/gstcdparanoiasrc.c
+ext/ogg/gstoggdemux.c
+gst/playback/gstdecodebin2.c
+gst/playback/gstplaysink.c
+gst/playback/gstsubtitleoverlay.c
+gst/playback/gsturidecodebin.c
+gst/tcp/gsttcp.c
+gst/tcp/gsttcpclientsink.c
+gst/tcp/gsttcpclientsrc.c
+gst-libs/gst/audio/gstbaseaudiosrc.c
+gst-libs/gst/tag/gsttagdemux.c
+gst-libs/gst/tag/tags.c
+gst-libs/gst/cdda/gstcddabasesrc.c
+gst-libs/gst/pbutils/descriptions.c
+gst-libs/gst/pbutils/missing-plugins.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 0000000..6ea6a68
--- /dev/null
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..95dadf4
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,667 @@
+# Translation of gstreamer plugin messages to Afrikaans.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is put in the public domain.
+# Petri Jooste <rkwjpj@puk.ac.za>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins 0.7.6\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-03-18 14:16+0200\n"
+"Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
+"Language-Team: Afrikaans <i18n@af.org.za>\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Treble"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetiseerder"
+
+msgid "Line-in"
+msgstr "Lyn-in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofoon"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "Luidspreker"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+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."
+msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "Kon nie toestel \"%s\" oopmaak vir lees en skryf nie."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+msgid "Could not open CD device for reading."
+msgstr "Kon nie CD-toestel oopmaak om te lees nie."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "Kon nie vfs-lêer \"%s\" toemaak nie."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "Kon nie skryf na toestel \"%s\" nie."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "Kon nie skryf na lêer \"%s\" nie."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Fout tydens toemaak van lêer \"%s\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+msgstr ""
+
+#, 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."
+
+#, fuzzy
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Fout tydens toemaak van lêer \"%s\"."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie."
+
+#~ msgid "No device specified."
+#~ msgstr "Geen toestel gespesifiseer"
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Toestel \"%s\" bestaan nie."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "OSS-toestel \"%s\" is reeds in gebruik deur 'n ander program."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Kon nie toestel \"%s\" oopmaak vir lees en skryf nie."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Kon nie skryf na lêer \"%s\" nie."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Geen toestel gespesifiseer"
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Kon nie skryf na lêer \"%s\" nie."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie."
+
+#~ msgid "Device is not open."
+#~ msgstr "Toestel is nie oop nie."
+
+#~ msgid "Device is open."
+#~ msgstr "Toestel is oop."
+
+#~ 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."
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie."
+
+#~ msgid "No filename specified."
+#~ msgstr "Geen lêernaam gespesifiseer."
+
+#~ msgid "No or invalid input audio, AVI stream will be corrupt."
+#~ msgstr "Geen of ongeldige klanktoevoer, AVI-stroom sal korrup wees."
+
+#~ 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 close audio device \"%s\"."
+#~ msgstr "Kon nie oudio-toestel \"%s\" toemaak nie."
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "Kon nie beheertoestel \"%s\" toemaak 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 "Could not access device \"%s\", check its permissions."
+#~ msgstr "Kon nie toegang kry tot toestel \"%s\" nie, kyk na toegangsregte."
+
+#~ 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 "Volume"
+#~ msgstr "Volume"
+
+#~ msgid "Speaker"
+#~ msgstr "Luidspreker"
+
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie."
diff --git a/po/az.gmo b/po/az.gmo
new file mode 100644
index 0000000..8e2623c
--- /dev/null
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
new file mode 100644
index 0000000..9b6b29e
--- /dev/null
+++ b/po/az.po
@@ -0,0 +1,668 @@
+# 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 <metin@karegen.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-0.8.0\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-03-19 18:29+0200\n"
+"Last-Translator: Metin Amiroff <metin@karegen.com>\n"
+"Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
+"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 "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "İncə"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sint"
+
+msgid "Line-in"
+msgstr "Xətd-giriş"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "Spiker"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+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."
+msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "\"%s\" avadanlığı oxuma və yazma üçün açıla bilmədi."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+msgid "Could not open CD device for reading."
+msgstr "CD avadanlığı oxuma üçün açıla bilmədi."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "\"%s\" vfs faylı bağlana bilmədi."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "\"%s\" avadanlığına yazıla bilmədi."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "\"%s\" faylına yazıla bilmədi."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "\"%s\" faylı bağlana bilmədi."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+msgstr ""
+
+#, 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."
+
+#, fuzzy
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "\"%s\" faylı bağlana bilmədi."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "\"%s\" avadanlığı capture avadanlığı deyil."
+
+#~ msgid "No device specified."
+#~ msgstr "Avadanlıq bildirilməyib."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "\"%s\" avadanlığı mövcud deyil."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "\"%s\" OSS avadanlığı başqa bir proqram tərəfindən istifadədədir."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "\"%s\" avadanlığı oxuma və yazma üçün açıla bilmədi."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "\"%s\" faylına yazıla bilmədi."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Avadanlıq bildirilməyib."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "\"%s\" faylına yazıla bilmədi."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "\"%s\" faylı oxuma üçün açıla bilmədi."
+
+#~ msgid "Device is not open."
+#~ msgstr "Avadanlıq açıq deyil."
+
+#~ msgid "Device is open."
+#~ msgstr "Avadanlıq açıqdır."
+
+#~ 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."
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "\"%s\" faylı yazma üçün açıla bilmədi."
+
+#~ msgid "No filename specified."
+#~ msgstr "Fayl adı verilməyib."
+
+#~ 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 "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 close audio device \"%s\"."
+#~ msgstr "\"%s\" audio avadanlığı bağlana bilmədi."
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "\"%s\" idarə avadanlığı bağlana 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 "Could not access device \"%s\", check its permissions."
+#~ msgstr "\"%s\" avadanlığına yetişə bilmədi, səlahiyyətlərini yoxlayın."
+
+#~ 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 "Volume"
+#~ msgstr "Səs"
+
+#~ msgid "Speaker"
+#~ msgstr "Spiker"
+
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "\"%s\" avadanlığından bufferlər alına bilmədi."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi."
diff --git a/po/bg.gmo b/po/bg.gmo
new file mode 100644
index 0000000..e7bc9d5
--- /dev/null
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..27aa6df
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,618 @@
+# Bulgarian translation of gst-plugins-base.
+# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Alexander Shopov <ash@kambanaria.org>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-26 22:31+0300\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\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 "Master"
+msgstr "Главен"
+
+msgid "Bass"
+msgstr "Баси"
+
+msgid "Treble"
+msgstr "Високи"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Синтезатор"
+
+msgid "Line-in"
+msgstr "Вход"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Микрофон"
+
+msgid "PC Speaker"
+msgstr "Високоговорител на PC"
+
+msgid "Playback"
+msgstr "Изпълнение"
+
+msgid "Capture"
+msgstr "Запис"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Устройството не може да се отвори за изпълнение в моно режим."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Устройството не може да се отвори за изпълнение в стерео режим."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Устройството не може да се отвори за изпълнение в %d-канален режим."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Звуковото устройство не може да се отвори за изпълнение, защото се ползва от "
+"друго приложение."
+
+msgid "Could not open audio device for playback."
+msgstr "Звуковото устройство не може да се отвори за изпълнение."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Устройството не може да се отвори за запис в моно режим."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Устройството не може да се отвори за изпълнение в стерео режим."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Устройството не може да се отвори за изпълнение в %d-канален режим."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Звуковото устройство не може да се отвори за запис, защото се ползва от "
+"друго приложение."
+
+msgid "Could not open audio device for recording."
+msgstr "Звуковото устройство не може да се отвори за запис."
+
+msgid "Could not open CD device for reading."
+msgstr "Устройството за CD-та не може да се отвори за четене."
+
+msgid "Could not seek CD."
+msgstr "По CD-то не може да се търси."
+
+msgid "Could not read CD."
+msgstr "CD-то не може да бъде прочетено."
+
+msgid "Internal data stream error."
+msgstr "Вътрешна грешка на потока от данни."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"За да пуснете този поток, се нуждаете от приставка за %s. Такава не е "
+"инсталирана."
+
+msgid "Could not determine type of stream"
+msgstr "Видът на потока не може да бъде определен"
+
+msgid "This appears to be a text file"
+msgstr "Това изглежда е текстов файл"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Елементът „%s“ липсва — проверете инсталацията на GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Едновременно липсват елементите-приемници „autovideosink“ и „%s“."
+
+msgid "The autovideosink element is missing."
+msgstr "Липсва елементът-приемник „autovideosink“."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Настроеният елемент-приемник за видео %s не работи."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Едновременно не работят елементите-приемници „autovideosink“ и „%s“."
+
+msgid "The autovideosink element is not working."
+msgstr "Елементът-приемник за автоматично видео „autovideosink“ не работи."
+
+msgid "Custom text sink element is not usable."
+msgstr "Потребителският елемент-приемник за текст е неизползваем."
+
+msgid "No volume control found"
+msgstr "Липсва управление на силата на звука"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Едновременно липсват елементите-приемници „autoaudiosink“ и „%s“."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Липсва елементът „autoaudiosink“."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Настроеният елемент-приемник за аудио %s не работи."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Едновременно не работят елементите „autoaudiosink“ и „%s“."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Елементът „autoaudiosink“ не работи."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Текстов файл не може да се изпълни без видео или визуализация."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Липсва декодер за вида „%s“."
+
+msgid "No URI specified to play from."
+msgstr "Не е указан адрес за пускане."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Грешен адрес „%s“."
+
+msgid "This stream type cannot be played yet."
+msgstr "Потоци от този тип все още не могат да бъдат изпълнявани."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Обработката на адреси „%s“ не е реализирана."
+
+msgid "Source element is invalid."
+msgstr "Елементът-източник е грешен."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Грешка при запис във файла „%s:%d“."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Връзката към %s:%d е отказана."
+
+msgid "Can't record audio fast enough"
+msgstr "Звукът не може да бъде записан достатъчно бързо"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Неуспешно прочитано на етикет: липсват достатъчно данни"
+
+msgid "track ID"
+msgstr "идентификатор на песен"
+
+msgid "MusicBrainz track ID"
+msgstr "идентификатор на песен според MusicBrainz"
+
+msgid "artist ID"
+msgstr "идентификатор на изпълнител"
+
+msgid "MusicBrainz artist ID"
+msgstr "идентификатор на изпълнител според MusicBrainz"
+
+msgid "album ID"
+msgstr "идентификатор на албум"
+
+msgid "MusicBrainz album ID"
+msgstr "идентификатор на албум според MusicBrainz"
+
+msgid "album artist ID"
+msgstr "идентификатор на изпълнител в албума"
+
+msgid "MusicBrainz album artist ID"
+msgstr "идентификатор на изпълнител в албума според MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "индустриален идентификатор на песен (TRM)"
+
+msgid "MusicBrainz TRM ID"
+msgstr "индустриален идентификатор на песен според MusicBrainz (TRM)"
+
+msgid "capturing shutter speed"
+msgstr "скорост на затвора"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Скорост на затвора при заснемане в секунди"
+
+msgid "capturing focal ratio"
+msgstr "относителна бленда"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Относителна бленда при заснемане"
+
+msgid "capturing focal length"
+msgstr "фокусно разстояние"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Фокусно разстояние на обектива при заснемане в милиметри"
+
+msgid "capturing digital zoom ratio"
+msgstr "цифрово увеличение"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Цифрово увеличение при заснемане"
+
+msgid "capturing iso speed"
+msgstr "светлочувствителност по ISO"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Светлочувствителност по ISO при заснемане"
+
+msgid "capturing exposure program"
+msgstr "програма на експозиция"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Програма на експозиция при заснемане"
+
+msgid "capturing exposure mode"
+msgstr "режим на експозиция"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Режим на експозиция при заснемане"
+
+msgid "capturing exposure compensation"
+msgstr "компенсация на експозицията"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Компенсацията на експозицията при заснемане"
+
+msgid "capturing scene capture type"
+msgstr "вид сцена"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Вид сцена при заснемане"
+
+msgid "capturing gain adjustment"
+msgstr "корекция с усилване"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Общата корекция с усилване при заснемане "
+
+msgid "capturing white balance"
+msgstr "баланс на бялото"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Режим на баланс на бялото при заснемане"
+
+msgid "capturing contrast"
+msgstr "контраст"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Посоката на обработката за контраст при заснемане"
+
+msgid "capturing saturation"
+msgstr "наситеност"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Посоката на обработката за наситеност при заснемане"
+
+msgid "capturing sharpness"
+msgstr "острота"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Посоката на обработката за острота при заснемане"
+
+msgid "capturing flash fired"
+msgstr "светкавица"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Дали е ползвана светкавица при заснемане"
+
+msgid "capturing flash mode"
+msgstr "режим на светкавица"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Режимът на светкавица при заснемане"
+
+msgid "capturing metering mode"
+msgstr "режим на заснемане"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Режим на заснемане при определянето на експозиция"
+
+msgid "capturing source"
+msgstr "източник"
+
+msgid "The source or type of device used for the capture"
+msgstr "Видът на устройството-източник при заснемане"
+
+msgid "image horizontal ppi"
+msgstr "точки на инч по хоризонтал"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Целевата разделителна способност на медията по хоризонтал"
+
+msgid "image vertical ppi"
+msgstr "точки на инч по вертикал"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Целевата разделителна способност на медията по вертикал"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "В това CD липсва аудио"
+
+msgid "ID3 tag"
+msgstr "Етикет ID3"
+
+msgid "APE tag"
+msgstr "Етикет APE"
+
+msgid "ICY internet radio"
+msgstr "Радио в Интернет по ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Аудио на Епъл без загуба на качество (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Свободен кодер за аудио без загуба на качество (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Истинско аудио без загуба на качество (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Говор, формат Windows Media"
+
+msgid "CYUV Lossless"
+msgstr "CYUV без загуба на качество"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg, версия 1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH без загуба на качество"
+
+msgid "Run-length encoding"
+msgstr "Последователно кодиране RLE"
+
+msgid "Sami subtitle format"
+msgstr "Субтитри, формат Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Субтитри, формат TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Субтитри, формат Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Некомпресирано видео YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Некомпресирано изображение с нива на сивото"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Некомпресирано видео YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Некомпресирано, индексирано, %d-битово %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 версия %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Некомпресирано видео YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Аудио, формат необработен %d-битов PCM"
+
+msgid "Audio CD source"
+msgstr "Елемент-източник — CD"
+
+msgid "DVD source"
+msgstr "Елемент-източник — DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Елемент-източник — RTSP (поточен протокол в реално време)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Елемент-източник — MMS (сървър за медия на Майкрософт)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Елемент-източник, протокол %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s елемент, разтоварващ видеото от RTP"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s елемент, разтоварващ аудиото от RTP"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s елемент, разтоварващ данни от RTP"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Разделител (демултиплексор) %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Декодер %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s елемент, товарещ видеото по RTP"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s елемент, товарещ аудиото по RTP"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s елемент, товарещ данни по RTP"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Уплътнител (мултиплексор) %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Кодер %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Елемент на GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Непознат елемент-източник"
+
+msgid "Unknown sink element"
+msgstr "Непознат елемент-приемник"
+
+msgid "Unknown element"
+msgstr "Непознат елемент"
+
+msgid "Unknown decoder element"
+msgstr "Непознат елемент-декодер"
+
+msgid "Unknown encoder element"
+msgstr "Непознат елемент-кодер"
+
+msgid "Plugin or element of unknown type"
+msgstr "Приставка или елемент от непознат вид"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Некомпресирано видео по равнини YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Некомпресирано видео по равнини YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Некомпресирано, пакетирано видео YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Некомпресирано, пакетирано видео YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Некомпресирано, пакетирано видео YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Некомпресирано, пакетирано видео YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Некомпресирано, пакетирано видео YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Некомпресирано видео по равнини YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Некомпресирано видео по равнини YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Некомпресирано видео с черна и бяла равнини за Y"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Аудио, формат необработен PCM"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Аудио, необработено, %d-битово, с плаваща запетая"
+
+#~ msgid "Raw floating-point audio"
+#~ 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“ от виртуалната файлова система не може да се затвори."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Грешка при запис във файла „%s“."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Грешен адрес за субтитри „%s“, субтитрите са изключени."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Потоци с RTSP все още не се поддържат."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Не може да се създаде елемент „decodebin“."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Бе засечен единствено поток със субтитри. Или сте заредили файл със "
+#~ "субтитри, или някакъв друг вид текстов файл, или просто видът на "
+#~ "мултимедийния файл не е разпознат."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Липсва декодер за обработката на този файл. Ще трябва да инсталирате "
+#~ "необходимите приставки."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Това не е медиен файл"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Открит е поток със субтитри, липсва видео поток."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr ""
+#~ "Едновременно липсват елементите-приемници „autovideosink“ и „xvimagesink“."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr ""
+#~ "Едновременно липсват елементите-приемници „autoaudiosink“ и „alsasink“."
+
+#~ msgid "No device specified."
+#~ msgstr "Не е указано устройство."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Устройството „%s“ не съществува."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Устройството „%s“ вече се използва."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Устройството „%s“ не може да се отвори за четене и запис."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Грешка при запис на заглавните данни gdp във файла „%s:%d“."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Грешка при изпращането на натоварените по gtp данни към „%s:%d“."
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 0000000..a6d1dda
--- /dev/null
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..dabbcf3
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,592 @@
+# Catalan translation of gst-plugins-base.
+# Copyright © 2005, 2010 Free Software Foundation, Inc.
+# This file is put in the public domain.
+# Jordi Mallach <jordi@sindominio.net>, 2005, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-11-04 23:13+0100\n"
+"Last-Translator: Jordi Mallach <jordi@sindominio.net>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Mestre"
+
+msgid "Bass"
+msgstr "Baixos"
+
+msgid "Treble"
+msgstr "Treble"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetitzador"
+
+msgid "Line-in"
+msgstr "Línia d'entrada"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Micròfon"
+
+msgid "PC Speaker"
+msgstr "Altaveu PC"
+
+msgid "Playback"
+msgstr "Reproducció"
+
+msgid "Capture"
+msgstr "Captura"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "No s'ha pogut obrir el dispositiu per a reproduir en mode mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "No s'ha pogut obrir el dispositiu per a reproduir en mode estèreo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "No s'ha pogut obrir el dispositiu per a reproduir en mode %d-canals."
+
+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 reproduir. El dispositiu "
+"està en ús per una altra aplicació."
+
+msgid "Could not open audio device for playback."
+msgstr "No s'ha pogut obrir el dispositiu d'àudio per a reproduir."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "No s'ha pogut obrir el dispositiu per a enregistrar en mode mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "No s'ha pogut obrir el dispositiu per a enregistrar en mode estèreo."
+
+# FIXME Trailing dot. jm
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "No s'ha pogut obrir el dispositiu per a enregistrar en mode %d-canals"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"No s'ha pogut obrir el dispositiu d'àudio per a enregistrar. El dispositiu "
+"està en ús per una altra aplicació."
+
+msgid "Could not open audio device for recording."
+msgstr "No s'ha pogut obrir el dispositiu d'àudio per a enregistrar."
+
+msgid "Could not open CD device for reading."
+msgstr "No s'ha pogut obrir el dispositiu del CD per a lectura."
+
+msgid "Could not seek CD."
+msgstr "No s'ha pogut cercar el CD."
+
+msgid "Could not read CD."
+msgstr "No s'ha pogut llegir el CD."
+
+msgid "Internal data stream error."
+msgstr "S'ha produït un error intern de flux de dades."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Es requereix un connector %s per a reproduir aquest flux, però no és "
+"instaŀlat."
+
+msgid "Could not determine type of stream"
+msgstr "No s'ha pogut determinar el tipus de flux"
+
+msgid "This appears to be a text file"
+msgstr "Açò sembla ser un fitxer de text"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Manca l'element «%s» - comproveu la vostra instaŀlació del GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Manquen els elements autovideosink i %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Manca l'element autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "El videosink configurat %s no funciona."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Tant l'element autovideosink com el %s no funcionen."
+
+msgid "The autovideosink element is not working."
+msgstr "L'element autovideosink no funciona."
+
+msgid "Custom text sink element is not usable."
+msgstr "L'element sortida personalitzat de text no es pot emprar."
+
+msgid "No volume control found"
+msgstr "No s'ha trobat un control de volum"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Manquen els elements autoaudiosink i %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Manca l'element autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "L'audiosink configurat %s no funciona."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "No funcionen tant l'element autoaudiosink com el %s."
+
+msgid "The autoaudiosink element is not working."
+msgstr "L'element autoaudiosink no funciona."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "No es pot reproduir un fitxer de text sense vídeo o visualitzacions."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "No hi ha un decodificador disponible per al tipus «%s»."
+
+msgid "No URI specified to play from."
+msgstr "No s'ha especificat cap URL des d'on reproduir."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "L'URI «%s» és invàlid."
+
+msgid "This stream type cannot be played yet."
+msgstr "Encara no es pot reproduir aquest tipus de flux."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "No hi ha cap gestor d'URI implementat per a «%s»."
+
+msgid "Source element is invalid."
+msgstr "L'element font és invàlid."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "S'ha produït un error en enviar dades a «%s:%d»."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "S'ha refusat la connexió amb %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "No es pot enregistrar l'àudio el suficientment ràpid"
+
+msgid "Failed to read tag: not enough data"
+msgstr "No s'ha pogut llegir l'etiqueta: no hi ha dades suficients"
+
+msgid "track ID"
+msgstr "ID de la pista"
+
+msgid "MusicBrainz track ID"
+msgstr "ID de la pista al MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID de l'artista"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID de l'artista al MusicBrainz"
+
+msgid "album ID"
+msgstr "ID de l'àlbum"
+
+msgid "MusicBrainz album ID"
+msgstr "ID de l'àlbum al MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID de l'artista de l'àlbum"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID de l'artista de l'àlbum al MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID TRM de la pista"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM al MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "velocitat de l'obturador de la captura"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr "ppi horitzontal de la imatge"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Densitat horitzontal de píxels del medi (imatge/vídeo), en ppi"
+
+msgid "image vertical ppi"
+msgstr "ppi vertical de la imatge"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Densitat vertical de píxels del medi (imatge/vídeo), en ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Aquest CD no té pistes d'àudio"
+
+msgid "ID3 tag"
+msgstr "Etiqueta ID3"
+
+msgid "APE tag"
+msgstr "Etiqueta APE"
+
+msgid "ICY internet radio"
+msgstr "Emisora de ràdio per Internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV sense pèrdua"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH sense pèrdua"
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr "Format de subtítols Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Format de subtítols TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Format de subtítols Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV sense comprimir"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Imatge en escala de grisos no comprimida"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV sense comprimir"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "YUV sense comprimir"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versió %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV sense comprimir"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Àudio en cru de %d-bit"
+
+msgid "Audio CD source"
+msgstr "Font de CD d'àudio"
+
+msgid "DVD source"
+msgstr "Font de DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Font del Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Font del protocol Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Font del protocol %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Descarregador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Descarregador d'àudio RTP %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Descarregador RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demultiplexor %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Decodificador %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Carregador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Carregador d'àudio RTP %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Carregador RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Multiplexor %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Codificador %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Element del GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "L'element de font és desconegut"
+
+msgid "Unknown sink element"
+msgstr "L'element de sortida és desconegut"
+
+msgid "Unknown element"
+msgstr "L'element és desconegut"
+
+msgid "Unknown decoder element"
+msgstr "L'element decodificador és desconegut"
+
+msgid "Unknown encoder element"
+msgstr "L'element codificador és desconegut"
+
+msgid "Plugin or element of unknown type"
+msgstr "El connector o element és de tipus desconegut"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Àudio PCM en cru"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Àudio en cru de %d-bit en coma flotant"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Àudio en cru en coma flotant"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "No s'ha pogut obrir el fitxer vfs «%s» per a l'escriptura: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "No s'ha donat cap nom de fitxer"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "No s'ha pogut tancar el fitxer vfs «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "S'ha produït un error en escriure al fitxer «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "L'URI de subtítols «%s» és invàlida, s'inhabiliten els subtítols."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Encara no es poden reproduir els fluxes RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "No s'ha pogut crear l'element «decodebin»."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Només s'ha detectat un flux de subtítols. O bé esteu carregant un fitxer "
+#~ "de subtítols o qualsevol altre tipus de fitxer de text, o no s'ha "
+#~ "reconegut el fitxer de medi."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "No teniu un decodificador instaŀlat per a gestionar aquest fitxer. És "
+#~ "possible que necessiteu instaŀlar els connectors necessaris."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Aquest no és un fitxer de medi"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "S'ha detectat un flux de subtítols, però no un flux de vídeo."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Manquen l'element autovideosink i el xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Manquen l'element autoaudiosink i l'alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "No s'ha especificat un dispositiu."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "El dispositiu «%s» no existeix."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "El dispositiu «%s» ja és en ús."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "No s'ha pogut obrir el dispositiu «%s» per a llegir i escriure."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr ""
+#~ "S'ha produït un error en enviar dades de la capçalera gdp a «%s:%d»."
+
+# Payload -> càrrega en molts àmbits. jm
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr ""
+#~ "S'ha produït un error en enviar la càrrega de dades de gdp a «%s:%d»."
+
+#~ msgid "discid"
+#~ msgstr "id del disc"
+
+#~ msgid "CDDA discid for metadata retrieval"
+#~ msgstr "id del disc de CDDA per a l'obtenció de les metadades"
diff --git a/po/cs.gmo b/po/cs.gmo
new file mode 100644
index 0000000..d8082c3
--- /dev/null
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..9e42eed
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,618 @@
+# Czech translations of gst-plugins-base.
+# Copyright (C) 2007, 2008, 2009, 2010, 2011 the author(s) of gst-plugins-base.
+# Copyright (C) 2004 Miloslav Trmac <mitr@volny.cz>.
+# This file is put in the public domain.
+# Miloslav Trmac <mitr@volny.cz>, 2004.
+# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base-0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-10-31 10:51+0100\n"
+"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
+"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\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.2\n"
+
+msgid "Master"
+msgstr "Master"
+
+msgid "Bass"
+msgstr "Basy"
+
+msgid "Treble"
+msgstr "Výšky"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Syntezátor"
+
+msgid "Line-in"
+msgstr "Linkový vstup"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC Speaker"
+
+msgid "Playback"
+msgstr "Přehrávání"
+
+msgid "Capture"
+msgstr "Záznam"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nezdařilo se otevření zařízení k přehrávání v režimu mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nezdařilo se otevření zařízení k přehrávání v režimu stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Nezdařilo se otevření zařízení k přehrávání v %dkanálovém režimu."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Nezdařilo se otevření zvukového zařízení k přehrávání. Zařízení je používáno "
+"jinou aplikací."
+
+msgid "Could not open audio device for playback."
+msgstr "Nezdařilo se otevření zvukového zařízení k přehrávání."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nezdařilo se otevření zařízení k záznamu v režimu mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Nezdařilo se otevření zařízení k záznamu v režimu stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Nezdařilo se otevření zařízení k záznamu v %dkanálovém režimu"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nezdařilo se otevření zvukového zařízení k záznamu. Zařízení je používáno "
+"jinou aplikací."
+
+msgid "Could not open audio device for recording."
+msgstr "Nezdařilo se otevření zvukového zařízení k záznamu."
+
+msgid "Could not open CD device for reading."
+msgstr "Nezdařilo se otevření zařízení CD ke čtení."
+
+msgid "Could not seek CD."
+msgstr "Nezdařilo se nalézt CD."
+
+msgid "Could not read CD."
+msgstr "Nezdařilo se přečíst CD."
+
+msgid "Internal data stream error."
+msgstr "Vnitřní chyba datového proudu."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Zásuvný modul %s je vyžadován k přehrání tohoto proudu, ale není "
+"nainstalován."
+
+msgid "Could not determine type of stream"
+msgstr "Nezdařilo se určit typ proudu"
+
+msgid "This appears to be a text file"
+msgstr "Zdá se, že se jedná o textový soubor"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Schází prvek \"%s\" - zkontrolujte prosím instalaci systému GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Schází jak prvek autovideosink, tak %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Schází prvek autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Nefunguje prvek videosink %s."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Nefunguje ani prvek autovideosink, ani %s."
+
+msgid "The autovideosink element is not working."
+msgstr "Nefunguje prvek autovideosink."
+
+msgid "Custom text sink element is not usable."
+msgstr "Vlastní prvek kanálu textu není použitelný."
+
+msgid "No volume control found"
+msgstr "Nenalezeno žádné ovládání hlasitosti"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Schází jak prvek autoaudiosink, tak %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Schází prvek autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Nefunguje prvek audiosink %s."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Nefunguje ani prvek autoaudiosink, ani %s."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Nefunguje prvek autoaudiosink."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Textový soubor nelze přehrát bez videa nebo vizualizací."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "K typu \"%s\" není dostupný dekodér."
+
+msgid "No URI specified to play from."
+msgstr "Nezadáno žádné URI, ze kterého se má přehrávat."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Neplatné URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Tento typ proudu zatím nemůže být přehrán."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "U \"%s\" není prováděna obsluha URI."
+
+msgid "Source element is invalid."
+msgstr "Zdrojový prvek je neplatný."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Chyba při odesílání dat na \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Spojení s %s:%d bylo odmítnuto."
+
+msgid "Can't record audio fast enough"
+msgstr "Zvuk nelze zaznamenat s dostatečnou rychlostí"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Nezdařilo se přečtení značky: nedostatek dat"
+
+msgid "track ID"
+msgstr "ID stopy"
+
+msgid "MusicBrainz track ID"
+msgstr "ID stopy MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID umělce"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID umělce MusicBrainz"
+
+msgid "album ID"
+msgstr "ID alba"
+
+msgid "MusicBrainz album ID"
+msgstr "ID alba MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID umělce alba"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID umělce alba MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID stopy TRM"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID stopy TRM MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "rychlost závěrky záznamu"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Rychlost závěrky při záznamu obrazu, v sekundách"
+
+msgid "capturing focal ratio"
+msgstr "ohnisková vzdálenost záznamu"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Clonové číslo při záznamu obrazu"
+
+msgid "capturing focal length"
+msgstr "ohnisková vzdálenost záznamu"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Ohnisková vzdálenost čoček při záznamu obrazu, v mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "stupeň digitálního přiblížení záznamu"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Stupeň digitálního přiblížení při záznamu obrazu"
+
+msgid "capturing iso speed"
+msgstr "rychlost ISO záznamu"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Rychlost ISO při záznamu obrazu"
+
+msgid "capturing exposure program"
+msgstr "program expozice záznamu"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Program expozice při záznamu obrazu"
+
+msgid "capturing exposure mode"
+msgstr "režim expozice záznamu"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Režim expozice při záznamu obrazu"
+
+msgid "capturing exposure compensation"
+msgstr "kompenzace expozice záznamu"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Kompenzace expozice při záznamu obrazu"
+
+msgid "capturing scene capture type"
+msgstr "typ zachycení scény záznamu"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Typ zachycení scény při záznamu obrazu"
+
+msgid "capturing gain adjustment"
+msgstr "úprava zesílení záznamu"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Úprava zesílení při záznamu obrazu"
+
+msgid "capturing white balance"
+msgstr "vyvážení bílé záznamu"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Režim vyvážení bílé nastavený při záznamu obrazu"
+
+msgid "capturing contrast"
+msgstr "kontrast záznamu"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Použité zpracování kontrastu při záznamu obrazu"
+
+msgid "capturing saturation"
+msgstr "sytost záznamu"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Použité zpracování sytosti při záznamu obrazu"
+
+msgid "capturing sharpness"
+msgstr "ostrost záznamu"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Použité zpracování ostrosti při záznamu obrazu"
+
+msgid "capturing flash fired"
+msgstr "použití blesku při záznamu"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Zda byl při záznamu obrazu použit blesk"
+
+msgid "capturing flash mode"
+msgstr "režim blesku při záznamu"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Režim blesku vybraný při záznamu obrazu"
+
+msgid "capturing metering mode"
+msgstr "režim měření při záznamu"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Režim měření expozice při záznamu obrazu"
+
+msgid "capturing source"
+msgstr "zdroj záznamu"
+
+msgid "The source or type of device used for the capture"
+msgstr "Zdroj nebo typ zařízení použitého při záznamu"
+
+msgid "image horizontal ppi"
+msgstr "pixelů na palec vodorovně v obrazu"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Zamýšlená hustota pixelů multimédia (image/video) vodorovně v pixelech na "
+"palec"
+
+msgid "image vertical ppi"
+msgstr "pixelů na palec svisle v obrazu"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Zamýšlená hustota pixelů multimédia (image/video) svisle v pixelech na palec"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Toto CD nemá žádné zvukové stopy"
+
+msgid "ID3 tag"
+msgstr "Značka ID3"
+
+msgid "APE tag"
+msgstr "Značka APE"
+
+msgid "ICY internet radio"
+msgstr "Internetové rádio ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "Bezeztrátový CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Bezeztrátové MSZH"
+
+msgid "Run-length encoding"
+msgstr "RLE (Run-Length Encoding)"
+
+msgid "Sami subtitle format"
+msgstr "Formát titulků Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Formát titulků TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Formát titulků Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Uncompressed Gray Image"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nekomprimovaný paletizovaný %dbitový %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4, verze %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Surový %dbitový zvuk PCM"
+
+msgid "Audio CD source"
+msgstr "Zdroj zvukového CD"
+
+msgid "DVD source"
+msgstr "Zdroj DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Zdroj Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Zdroj protokolu Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Zdroj protokolu %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Depayloader RTP %s, video"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Depayloader RTP %s, audio"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Depayloader RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demultiplexer %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Dekodér %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Payloader RTP %s, video"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Payloader RTP %s, audio"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Payloader RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Multiplexer %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Kodér %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Prvek systému GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Neznámý zdrojový prvek"
+
+msgid "Unknown sink element"
+msgstr "Neznámý kanálový prvek"
+
+msgid "Unknown element"
+msgstr "Neznámý prvek"
+
+msgid "Unknown decoder element"
+msgstr "Neznámý dekodérový prvek"
+
+msgid "Unknown encoder element"
+msgstr "Neznámý kodérový prvek"
+
+msgid "Plugin or element of unknown type"
+msgstr "Zásuvný modul nebo prvek neznámého typu"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nekomprimovaný planární YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nekomprimovaný planární YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nekomprimovaný zabalený YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nekomprimovaný zabalený YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nekomprimovaný zabalený YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nekomprimovaný zabalený YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nekomprimovaný zabalený YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nekomprimovaný planární YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nekomprimovaný planární YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nekomprimovaná černá a bílá rovina Y"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Surový zvuk PCM"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Surový %dbitový zvuk s pohyblivou desetinnou čárkou"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Surový zvuk s pohyblivou desetinnou čárkou"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nezdařilo se otevření souboru vfs \"%s\" k zápisu: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nezadán název souboru"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nezdařilo se zavření souboru vfs \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Chyba při zápisu do souboru \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Neplatné URI titulků \"%s\", titulky vypnuty."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Proudy RTSP zatím nemohou být přehrávány."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nezdařilo se vytvoření prvku \"decodebin\"."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Byl rozpoznán pouze proud titulků. Buď je nahráván pouze soubor titulků "
+#~ "nebo nějaký jiný typ textového soubor, popřípadě nebyl rozpoznán "
+#~ "multimediální soubor."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "K obsluze tohoto souboru není nainstalován dekodér. Patrně bude nutné "
+#~ "nainstalovat nezbytné zásuvné moduly."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Toto není multimediální soubor"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Byl rozpoznán proud titulků, ale nikoliv obrazový proud."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Schází jak prvek autovideosink, tak xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Schází jak prvek autoaudiosink, tak alsasink."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Chyba při odesílání dat záhlaví gdp na \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Chyba při odesílání zátěžových dat gdp na \"%s:%d\"."
+
+#~ msgid "No device specified."
+#~ msgstr "Nezadáno zařízení."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Zařízení \"%s\" neexistuje."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Zařízení \"%s\" je již používáno."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Zařízení \"%s\" se nezdařilo otevřít ke čtení a k zápisu."
diff --git a/po/da.gmo b/po/da.gmo
new file mode 100644
index 0000000..0628323
--- /dev/null
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..586cbd3
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,657 @@
+# Danish translation of gst-plugins-base.
+# Copyright (C) 2011 gst, Mogens Jaeger, Joe Hansen.
+# This file is distributed under the same license as the gst-plugins-base package.
+#
+# Mogens Jaeger <mogens@jaeger.tf>, 2007.
+# Joe Hansen <joedalton2@yahoo.dk>, 2009, 2010, 2011.
+#
+# capture -> optage
+# gain -> forstærkning
+# shutter -> lukketid
+#
+# Hej Torben, de fleste af dem her er vist afklaringen af hvorvidt det er et
+# udsagnsord eller navneord. Har du været i koden og kigge? Ville godt nok
+# være ked af at rette alle dem her, for så bare at »opdage« at de var gode nok,
+# Nu har jeg haft src/gst-plugins-base/tags.c åben i en nylig version
+# (gst-blugins-base version 0.10.31), og jeg tror ikke strengene bruges,
+# mens der sker en aktiv handling.
+# I filen ser det således ud:
+# /* photography tags */
+# gst_tag_register (GST_TAG_CAPTURING_SHUTTER_SPEED,
+# GST_TAG_FLAG_META,
+# GST_TYPE_FRACTION,
+# _("capturing shutter speed"),
+# _("Shutter speed used when capturing an image,
+# in seconds"), NULL);
+# Dette kan du se som en indgang i en tabel over strenge. Den første korte
+# streng er navnet på mærket, den anden er en beskrivelse af samme mærke.
+# Strengene er altså betegnelser/navneord.
+#
+# brugt kunne erstattes med der blev brugt (men skal så rettes igennem for alle).
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-28 16:38+0100\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Master"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Diskant"
+
+msgid "PCM"
+msgstr "Pcm"
+
+msgid "Synth"
+msgstr "Synthesizer"
+
+msgid "Line-in"
+msgstr "Linie-ind"
+
+msgid "CD"
+msgstr "Cd"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "Pc-højttaler"
+
+msgid "Playback"
+msgstr "Afspilning"
+
+msgid "Capture"
+msgstr "Optage"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Kunne ikke afspille fra enheden i mono-tilstand."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Kunne ikke afspille fra enheden i stereo-tilstand."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Kunne ikke afspille fra enheden i %d-kanals-tilstand."
+
+# måske bruges af et andet program.
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Kunne ikke åbne lydenhed til afspilning. Enhed anvendes af et andet program."
+
+msgid "Could not open audio device for playback."
+msgstr "Kunne ikke åbne lydenhed til afspilning."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Kunne ikke optage fra enheden i mono-tilstand."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Kunne ikke optage fra enheden i stereo-tilstand."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Kunne ikke optage fra enheden i %d-kanals-tilstand."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Kunne ikke åbne lydenhed til optagelse. Enheden anvendes af et andet program."
+
+msgid "Could not open audio device for recording."
+msgstr "Kunne ikke åbne lydenhed til optagelse."
+
+msgid "Could not open CD device for reading."
+msgstr "Kunne ikke læse fra cd-enhed."
+
+msgid "Could not seek CD."
+msgstr "Kunne ikke søge på cd."
+
+msgid "Could not read CD."
+msgstr "Kunne ikke læse cd."
+
+msgid "Internal data stream error."
+msgstr "Intern datastrømsfejl."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Et %s plugin er nødvendigt ved afspilning af denne sekvens, men ikke "
+"installeret."
+
+msgid "Could not determine type of stream"
+msgstr "Kunne ikke afgøre strømtypen"
+
+msgid "This appears to be a text file"
+msgstr "Denne fremstår som en tekstfil"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "'%s' elementet mangler - check din GStreamer installation."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Både autovideosink og %s elementer mangler."
+
+msgid "The autovideosink element is missing."
+msgstr "Elementet autovideosink mangler."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Konfigureret videosink %s virker ikke."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Både autovideosink og %s elementerne virker ikke."
+
+msgid "The autovideosink element is not working."
+msgstr "Elementet autovideosink virker ikke."
+
+msgid "Custom text sink element is not usable."
+msgstr "Brugertilpasset tekstsinkelement er ikke brugbart."
+
+msgid "No volume control found"
+msgstr "Ingen lydstyrkekontrol fundet"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Både autoaudiosink og %s elementerne mangler."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Elementet autoaudiosink mangler."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Konfigureret audiosink %s virker ikke."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Både autoaudiosink og %s elementerne virker ikke."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Elementet autoaudiosink virker ikke."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Kan ikke afspille en tekstfil uden video eller visualiseringer."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Ingen dekoder tilgængelig for type '%s'."
+
+msgid "No URI specified to play from."
+msgstr "Ingen angivet URI til afspilning."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Ugyldig URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Denne type lydstrøm kan ikke afspilles endnu."
+
+# har beholdt »er«
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Ingen URI-håndtering er implementeret for \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Kildeelement er ugyldigt."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Der opstod en fejl under data-overførsel til \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Opkobling til %s:%d afvist."
+
+msgid "Can't record audio fast enough"
+msgstr "Kan ikke optage lyd hurtigt nok"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Kunne ikke læse mærke: Ikke nok data"
+
+msgid "track ID"
+msgstr "spor-id"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz spor-id"
+
+msgid "artist ID"
+msgstr "kunstner-id"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz kunstner-id"
+
+msgid "album ID"
+msgstr "album-id"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz album-id"
+
+msgid "album artist ID"
+msgstr "albumkunstner-id"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albumkunstner-id"
+
+msgid "track TRM ID"
+msgstr "spor TRM-id"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM-id"
+
+# nb ikke handling men navneord.
+# "optagelukkertid" / "optagerlukkertid"
+# Mogens: shutter speed = lukkerhastighed
+msgid "capturing shutter speed"
+msgstr "optagerlukkertid"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Lukketidshastighed brugt når et billede optages, i sekunder"
+
+msgid "capturing focal ratio"
+msgstr "brændforhold for optager"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Brændforhold (f-nummer) brugt under optagelse af billedet"
+
+msgid "capturing focal length"
+msgstr "brændvidde for optager"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Brændvidde på linse brugt under optagelse af billedet, i mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "digitalt zoomforhold for optager"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Digitalt zoomforhold brugt under optagelse af et billede"
+
+msgid "capturing iso speed"
+msgstr "iso-hastighed for optager"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "ISO-hastigheden brugt under optagelse af et billede"
+
+msgid "capturing exposure program"
+msgstr "belysningsprogram for optagelse"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Belysningsprogrammet brugt under optagelse af et billede"
+
+msgid "capturing exposure mode"
+msgstr "belysningstilstand for optagelse"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Belysningstilstanden brugt under optagelse af et billede"
+
+msgid "capturing exposure compensation"
+msgstr "belysningskompensation for optagelse"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Belysningskompensationen brugt under optagelse af et billede"
+
+# "optagelsestype for optagelse af scene" /
+# "optagelsestype for sceneoptagelse" /
+# "sceneoptagelsestype for optager" /
+# "optageroptagelsestype for scene"
+# De to første rammer vist forlægget mest præcist.
+msgid "capturing scene capture type"
+msgstr "optagelsestype for optagelse af scene"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Sceneoptagelsestilstanden brugt da billedet blev optaget"
+
+# "justering af optageforstærkning" /
+# "justering af optagerforstærkning"
+msgid "capturing gain adjustment"
+msgstr "justering af optageforstærkning"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Den samlede optageforstærkning brugt på et billede"
+
+msgid "capturing white balance"
+msgstr "hvidbalance for optagelse"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Hvidbalancetilstanden angivet under optagelse af et billede"
+
+# kontrast for optagelse
+msgid "capturing contrast"
+msgstr "optagekontrast"
+
+# Jeg tror "direction" skal oversættes til "indstilling af"
+# (sml. "director" ~ "instruction" ~ "instruering" ~ "indstilling"
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Indstilling af kontrastprocessen brugt under optagelse af et billede"
+
+msgid "capturing saturation"
+msgstr "farvemætning for optagelse"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"Indstillingen af farvemætningsprocessen brugt under optagelse af et billede"
+
+msgid "capturing sharpness"
+msgstr "optageskarphed"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "skarphedindstilling brugt under optagelse af et billede"
+
+msgid "capturing flash fired"
+msgstr "optagerblitzen der blev brugt"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Hvorvidt blitzen blev brugt under optagelse af et billede"
+
+msgid "capturing flash mode"
+msgstr "optagererens blitztilstand"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Den valgte blitztilstand under optagelse af et billede"
+
+msgid "capturing metering mode"
+msgstr "optagerens måletilstand"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Måletilstanden brugt da optagelsens belysning skulle bestemmes"
+
+msgid "capturing source"
+msgstr "optagekilde"
+
+msgid "The source or type of device used for the capture"
+msgstr "Kilden eller typen af enhed brugt under optagelsen"
+
+msgid "image horizontal ppi"
+msgstr "billedets vandrette billedtæthed (ppi)"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Påtænkt vandret billedtæthed for medie (billede/video) i ppi"
+
+msgid "image vertical ppi"
+msgstr "billedets lodrette billedtæthed (ppi)"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Påtænkt lodret billedtæthed for medie (billede/video) i ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Denne cd har ingen lydspor"
+
+msgid "ID3 tag"
+msgstr "ID3-mærke"
+
+msgid "APE tag"
+msgstr "APE-mærke"
+
+msgid "ICY internet radio"
+msgstr "ICY-internetradio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "Kørsels-længde indkodning"
+
+msgid "Sami subtitle format"
+msgstr "Sami undertekstformat"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer undertekstformat"
+
+msgid "Kate subtitle format"
+msgstr "Undertekstformat Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Ukomprimeret YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Ukomprimeret gråtonebillede"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Ukomprimeret YUV"
+
+# Findes dette ord palettet på dansk ? evt. indekseret
+# Ukomprimeret palettet %d-bit %s
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Ukomprimeret indekseret %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 version %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Ukomprimeret YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Ufiltreret %d-bit PCM audio"
+
+msgid "Audio CD source"
+msgstr "Audio cd kilde"
+
+msgid "DVD source"
+msgstr "DVD kilde"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol (RTSP) kilde"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) protokol kilde"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokol kilde"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video RTP-depayloader"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s lyd RTP-depayloader"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP-depayloader"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s afkoder"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video RTP-payloader"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s lyd RTP-payloader"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP-payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s muxer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s indkoder"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer element %s"
+
+msgid "Unknown source element"
+msgstr "Ukendt kildeelement"
+
+# sink ? (afløb, kanal)
+msgid "Unknown sink element"
+msgstr "Ukendt afløbselement"
+
+msgid "Unknown element"
+msgstr "Ukendt element"
+
+msgid "Unknown decoder element"
+msgstr "Ukendt afkodeelement"
+
+msgid "Unknown encoder element"
+msgstr "Ukendt indkodeelement"
+
+msgid "Plugin or element of unknown type"
+msgstr "Plugin eller element af ukendt type"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Ukomprimeret plan-YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Ukomprimeret plan-YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Ukomprimeret pakket YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Ukomprimeret pakket YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Ukomprimeret pakket YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Ukomprimeret pakket YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Ukomprimeret pakket YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Ukomprimeret plan-YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Ukomprimeret plan-YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Ukomprimeret sort og hvid Y-plan"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Ufiltreret PCM audio"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Ufiltreret %d-bit flydende-komma audio"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Ufiltreret flydende-komma audio"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Kunne ikke åbne vfs-filen \"%s\" til skrivning: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Intet filnavn angivet"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Kunne ikke lukke vfs-filen \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Fejl ved skrivning til filen \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Defekt undertekst URI \"%s\", undertekster deaktiveret."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP sekvenser kan endnu ikke afspilles."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Kunne ikke danne et \"decodebin\" element."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Der blev kun fundet en undertekst-sekvens. Enten forsøger du at indlæse "
+#~ "en undertekst-fil eller en anden type tekstfil, eller media-filen blev "
+#~ "ikke genkendt."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Du har ingen dekoder installeret, der kan håndtere denne fil. Du er nødt "
+#~ "til at installere de nødvendige plugins."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Dette er ikke en media-fil"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "En undertekst-sekvens blev fundet, men ingen video-sekvens."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Både autovideosink og xvimagesink elementerne mangler."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Både autoaudiosink og alsasink elementerne mangler."
+
+#~ msgid "No device specified."
+#~ msgstr "Ingen enhed angivet."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Enheden \"%s\" eksisterer ikke."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Enheden \"%s\" er allerede i brug."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Kunne ikke tilgå enheden \"%s\"."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Der opstod en fejl under overførsel af gdp-overskriftsdata til \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Der opstod en fejl under overførsel af gdp-pakkeindhold til \"%s:%d\"."
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..0e6d11d
--- /dev/null
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..9869981
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,653 @@
+# German messages for gst-plugins-base 0.10.32.2
+# Copyright © 2006 Karl Eichwalder
+# This file is distributed under the same license as the gst-plugins-base package.
+# Karl Eichwalder <ke@suse.de>, 2006.
+# Mario Blättermann <mariobl@gnome.org>, 2010.
+# Christian Kirbach <christian.kirbach@googlemail.com>, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-28 00:04+0200\n"
+"Last-Translator: Christian Kirbach <christian.kirbach@googlemail.com>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\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 "Master"
+msgstr "Hauptregler"
+
+msgid "Bass"
+msgstr "Bass"
+
+msgid "Treble"
+msgstr "Höhen"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Line-Eingang"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC-Lautsprecher"
+
+msgid "Playback"
+msgstr "Wiedergabe"
+
+msgid "Capture"
+msgstr "Aufnahme"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Gerät konnte nicht zur Wiedergabe in Mono geöffnet werden."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Gerät konnte nicht zur Wiedergabe in Stereo geöffnet werden."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Gerät konnte nicht zur Wiedergabe im %d-Kanalmodus geöffnet werden."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Es wird durch eine "
+"andere Anwendung verwendet."
+
+msgid "Could not open audio device for playback."
+msgstr "Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Gerät konnte nicht zur Aufnahme in Mono geöffnet werden."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Gerät konnte nicht zur Aufnahme in Stereo geöffnet werden."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Gerät konnte nicht zur Aufnahme im %d-Kanalmodus geöffnet werden."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. Es wird durch eine "
+"andere Anwendung verwendet."
+
+msgid "Could not open audio device for recording."
+msgstr "Audio-Gerät konnte nicht zur Aufnahme geöffnet werden."
+
+msgid "Could not open CD device for reading."
+msgstr "Das CD-Laufwerk konnte nicht zum Lesen geöffnet werden."
+
+msgid "Could not seek CD."
+msgstr "Suchvorgang auf der CD ist fehlgeschlagen."
+
+msgid "Could not read CD."
+msgstr "CD konnte nicht gelesen werden."
+
+msgid "Internal data stream error."
+msgstr "Interner Fehler im Datenstrom."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Ein Plugin »%s« wird zum Abspielen dieses Datenstroms benötigt, ist aber "
+"nicht installiert."
+
+msgid "Could not determine type of stream"
+msgstr "Der Typ des Datenstroms konnte nicht bestimmt werden"
+
+msgid "This appears to be a text file"
+msgstr "Dies scheint eine Textdatei zu sein"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+"Das Element »%s« fehlt - überprüfen Sie Ihre Installation von GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Beide Elemente »autovideosink« und »%s« fehlen."
+
+msgid "The autovideosink element is missing."
+msgstr "Das Element »autovideosink« fehlt."
+
+# »Senke« hört sich echt scheußlich an.
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Das konfigurierte Videoziel »%s« funktioniert nicht."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Beide Elemente »autovideosink« und »%s« funktionieren nicht."
+
+msgid "The autovideosink element is not working."
+msgstr "Das Element »autovideosink« funktioniert nicht."
+
+msgid "Custom text sink element is not usable."
+msgstr "Das eigene Element des Textziels ist nicht verwendbar."
+
+msgid "No volume control found"
+msgstr "Keine Lautstärkeregelung gefunden"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Beide Elemente »autoaudiosink« und »%s« fehlen."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Das Element »autoaudiosink« fehlt."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Das konfigurierte Audioziel »%s« funktioniert nicht."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Beide Elemente »autoaudiosink« und »%s« funktionieren nicht."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Das Element »autoaudiosink« funktioniert nicht."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Es kann keine Textdatei ohne Video oder Visualisierungen abgespielt werden."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Für den Typ »%s« ist kein Decoder vorhanden."
+
+msgid "No URI specified to play from."
+msgstr "Keine Adresse (URI) zum Abspielen angegeben."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Ungültige Adresse (URI) »%s«."
+
+msgid "This stream type cannot be played yet."
+msgstr "Dieser Datenstrom kann noch nicht abgespielt werden."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Es ist kein URI-Handler für »%s« implementiert."
+
+msgid "Source element is invalid."
+msgstr "Das Quellelement ist ungültig."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Fehler beim Senden der Daten nach »%s:%d«."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Verbindung nach %s:%d wurde verweigert."
+
+msgid "Can't record audio fast enough"
+msgstr "Der Ton kann nicht schnell genug aufgezeichnet werden"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Lesen der Kennzeichnung schlug fehl: Nicht genug Daten"
+
+msgid "track ID"
+msgstr "Titelkennung"
+
+msgid "MusicBrainz track ID"
+msgstr "Titelkennung von MusicBrainz"
+
+# Hach, hier haben wir ja noch mehr »Interpreten«!
+msgid "artist ID"
+msgstr "Künstlerkennung"
+
+msgid "MusicBrainz artist ID"
+msgstr "Künstlerkennung von MusicBrainz"
+
+msgid "album ID"
+msgstr "Albenkennung"
+
+msgid "MusicBrainz album ID"
+msgstr "Albenkennung von MusicBrainz"
+
+msgid "album artist ID"
+msgstr "Kennung des Albenkünstlers"
+
+msgid "MusicBrainz album artist ID"
+msgstr "Kennung des Albenkünstlers von MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "TRM-Kennung verfolgen"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz-TRM-Kennung"
+
+msgid "capturing shutter speed"
+msgstr "Belichtungszeit"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Belichtungszeit bei Aufnahme eines Bildes in Sekunden"
+
+msgid "capturing focal ratio"
+msgstr "Blendenwert"
+
+# F-Nummer kennt bei uns kein Mensch. Oder doch...?
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Der verwendete Blendenwert bei Bildaufnahme"
+
+msgid "capturing focal length"
+msgstr "Brennweite"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Die verwendete Brennweite des Objektivs bei Bildaufnahme in mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "Digitale Vergrößerung"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Die verwendete digitale Vergrößerung bei Bildaufnahme"
+
+msgid "capturing iso speed"
+msgstr "ISO-Empfindlichkeit"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Die verwendete ISO-Empfindlichkeit bei Bildaufnahme"
+
+msgid "capturing exposure program"
+msgstr "Belichtungsprogramm"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Das verwendete Belichtungsprogramm bei Bildaufnahme"
+
+msgid "capturing exposure mode"
+msgstr "Belichtungsmodus der Aufnahme"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Der verwendete Belichtungsmodus bei Bildaufnahme"
+
+msgid "capturing exposure compensation"
+msgstr "Belichtungskorrektur der Aufnahme"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Der verwendete Belichtungskorrektur bei Bildaufnahme"
+
+msgid "capturing scene capture type"
+msgstr "Motivwahl"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Die verwendete Motivwahl bei Bildaufnahme"
+
+msgid "capturing gain adjustment"
+msgstr "Anpassung der Aufnahmebelichtung"
+
+# »Gain adjustment« kenne ich eigentlich nur bei Audiodateien. Müsste sich hier um eine Anpassung der Belichtungswerte handeln.
+msgid "The overall gain adjustment applied on an image"
+msgstr "Die auf das Bild angewendete Anpassung der Belichtungswerte"
+
+msgid "capturing white balance"
+msgstr "Weißabgleich"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Der eingestellte Weißabgleich bei Bildaufnahme"
+
+msgid "capturing contrast"
+msgstr "Kontrast"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Die Einstellung zur angewendeten Kontrastbearbeitung bei Bildaufnahme"
+
+msgid "capturing saturation"
+msgstr "Sättigung"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"Die Einstellung zur angewendeten Sättigungsbearbeitung bei Bildaufnahme"
+
+msgid "capturing sharpness"
+msgstr "Schärfe"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Die Einstellung zur angewendeten Schärfebearbeitung bei Bildaufnahme"
+
+msgid "capturing flash fired"
+msgstr "Blitzauslösung"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Gibt an, ob der Blitz bei der Bildaufnahme ausgelöst wurde"
+
+msgid "capturing flash mode"
+msgstr "Blitzmodus"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Der gewählte Blitzmodus bei Bildaufnahme"
+
+msgid "capturing metering mode"
+msgstr "Messmethode der Aufnahme"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Die während der Bestimmung der Belichtungszeit eingesetzte Messmethode zur "
+"Aufnahme eines Bildes"
+
+msgid "capturing source"
+msgstr "Aufnahmequelle"
+
+msgid "The source or type of device used for the capture"
+msgstr "Die Quelle oder der Gerätetyp, mit dem aufgenommen wird"
+
+msgid "image horizontal ppi"
+msgstr "Horizontale Bildauflösung"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Horizontale Auflösung des Bildes oder Videos in ppi (Pixel pro Zoll)"
+
+msgid "image vertical ppi"
+msgstr "Vertikale Bildauflösung"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Vertikale Auflösung des Bildes oder Videos in ppi (Pixel pro Zoll)"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Auf dieser CD befinden sich keine Audio-Titel"
+
+msgid "ID3 tag"
+msgstr "ID3-Kennzeichnung"
+
+msgid "APE tag"
+msgstr "APE-Kennzeichnung"
+
+msgid "ICY internet radio"
+msgstr "ICY Internet-Radio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV verlustlos"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "verlustloses MSZH"
+
+msgid "Run-length encoding"
+msgstr "RLE-Codierung"
+
+msgid "Sami subtitle format"
+msgstr "Untertitel-Format Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Untertitel-Format TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Untertitel-Format Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Unkomprimiertes YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Unkomprimiertes Graubild"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Unkomprimiertes YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Unkomprimiertes palettiertes %d-Bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Version %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Unkomprimiertes YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Rohes %d-bit PCM-Audio"
+
+msgid "Audio CD source"
+msgstr "Musik-CD-Quelle"
+
+msgid "DVD source"
+msgstr "DVD-Quelle"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol (RTSP)-Quelle"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS)-Protokollquelle"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s Protokollquelle"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s-Video RTP-Payload-Entnahme"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s-Audio RTP-Payload-Entnahme"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s-RTP-Payload-Entnahme"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s-Demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s-Decoder"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s-Video RTP-Payloader"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s-Audio RTP-Payloader"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s-RTP-Payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s-Multiplexer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s-Encoder"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer-Element %s"
+
+msgid "Unknown source element"
+msgstr "Unbekanntes Quellelement"
+
+msgid "Unknown sink element"
+msgstr "Unbekanntes Zielelement"
+
+msgid "Unknown element"
+msgstr "Unbekanntes Element"
+
+msgid "Unknown decoder element"
+msgstr "Unbekanntes Decoder-Element"
+
+msgid "Unknown encoder element"
+msgstr "Unbekanntes Encoder-Element"
+
+msgid "Plugin or element of unknown type"
+msgstr "Plugin oder Element unbekannten Typs"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Unkomprimiertes ungepacktes YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Unkomprimiertes ungepacktes YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Unkomprimiertes gepacktes YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Unkomprimiertes gepacktes YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Unkomprimiertes gepacktes YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Unkomprimiertes gepacktes YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Unkomprimiertes gepacktes YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Unkomprimiertes ungepacktes YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Unkomprimiertes ungepacktes YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Unkomprimiertes schwarz-weißes Y-plane"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Rohes PCM-Audio"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Rohes %d-Bit Gleitkomma-Audio"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Rohes Gleitkomma-Audio"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "VFS-Datei »%s« konnte nicht zum Schreiben geöffnet werden: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Kein Dateiname angegeben"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "VFS-Datei »%s« konnte nicht geschlossen werden."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Fehler beim Schreiben in die Datei »%s«."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Ungültige Untertitel-URI »%s«, Untertitel werden deaktiviert."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP-Datenströme können noch nicht abgespielt werden."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Das Element »decodebin« konnte nicht erstellt werden."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Es wurde nur ein Datenstrom mit Untertiteln erkannt. Entweder laden Sie "
+#~ "eine Datei mit Untertiteln oder eine andere Art Textdatei oder die "
+#~ "Mediendatei wurde nicht erkannt."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Sie haben keinen Decoder für den Umgang mit dieser Datei installiert. Sie "
+#~ "sollten die erforderlichen Plugins installieren."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Dies ist keine Mediendatei"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Ein Datenstrom mit Untertiteln wurde erkannt, aber kein Videostrom."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Beide Elemente »autovideosink« und »xvimagesink« fehlen."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Beide Elemente »autoaudiosink« und »alsasink« fehlen."
+
+#~ msgid "No device specified."
+#~ msgstr "Kein Gerät angegeben."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Das Gerät »%s« existiert nicht."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Das Gerät »%s« wird bereits verwendet."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr ""
+#~ "Das Gerät »%s« konnte nicht zum Lesen und Schreiben geöffnet werden."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Fehler beim Senden der GDP-Kopfdaten nach »%s:%d«."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Fehler beim Senden der GDP-Nutzdaten nach »%s:%d«."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr ""
+#~ "Es können nicht Untertiteltexte und Kleinbilder zugleich angezeigt werden."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Kein temporärer Ordner angegeben."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Temporäre Datei »%s« konnte nicht erstellt werden."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Die Datei »%s« konnte zum Lesen nicht geöffnet werden."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Interner Fehler im Datenstrom."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Das Element »decodebin2« konnte nicht erstellt werden."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Das Element »queue2« konnte nicht erstellt werden."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Das Element »typefind« konnte nicht erstellt werden."
+
+#~ msgid "No file name specified."
+#~ msgstr "Kein Dateiname angegeben."
diff --git a/po/el.gmo b/po/el.gmo
new file mode 100644
index 0000000..5ffbf09
--- /dev/null
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..5e1e5b7
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,634 @@
+# Greek translation for gst-plugins-base.
+# This file is put in the public domain.
+#
+# Simos Xenitellis <simos.lists@googlemail.com>, 2010.
+# Michael Kotsarinis <mk73628@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-10-27 12:05+0200\n"
+"Last-Translator: Michael Kotsarinis <mk73628@gmail.com>\n"
+"Language-Team: Greek <team@lists.gnome.gr>\n"
+"Language: el\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"
+"X-Poedit-Language: Greek\n"
+"X-Poedit-Country: GREECE\n"
+
+msgid "Master"
+msgstr "Γενικός"
+
+msgid "Bass"
+msgstr "Μπάσα"
+
+msgid "Treble"
+msgstr "Πρίμα"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Συνθεσάιζερ"
+
+msgid "Line-in"
+msgstr "Είσοδος γραμμής"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Μικρόφωνο"
+
+msgid "PC Speaker"
+msgstr "Ηχείο υπολογιστή"
+
+msgid "Playback"
+msgstr "Αναπαραγωγή"
+
+msgid "Capture"
+msgstr "Σύλληψη"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Αδυναμία ανοίγματος συσκευής για μονοφωνική αναπαραγωγή."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Αδυναμία ανοίγματος συσκευής για στερεοφωνική αναπαραγωγή."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Αδυναμία ανοίγματος συσκευής για αναπαραγωγή %d-καναλιών."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Αδυναμία ανοίγματος συσκευής ήχου για αναπαραγωγή. Η συσκευή χρησιμοποιείται "
+"από άλλη εφαρμογή."
+
+msgid "Could not open audio device for playback."
+msgstr "Αδυναμία ανοίγματος συσκευής για αναπαραγωγή."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Αδυναμία ανοίγματος συσκευής για μονοφωνική εγγραφή."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Αδυναμία ανοίγματος συσκευής για στερεοφωνική εγγραφή."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Αδυναμία ανοίγματος συσκευής για εγγραφή %d-καναλιών."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Αδυναμία ανοίγματος συσκευής ήχου για εγγραφή. Η συσκευή χρησιμοποιείται από "
+"άλλη εφαρμογή."
+
+msgid "Could not open audio device for recording."
+msgstr "Αδυναμία ανοίγματος συσκευής ήχου για εγγραφή."
+
+msgid "Could not open CD device for reading."
+msgstr "Αδυναμία ανοίγματος συσκευής CD για ανάγνωση."
+
+msgid "Could not seek CD."
+msgstr "Αδυναμία αναζήτησης CD."
+
+msgid "Could not read CD."
+msgstr "Αδυναμία ανάγνωσης CD."
+
+msgid "Internal data stream error."
+msgstr "Σφάλμα εσωτερικής ροής δεδομένων."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Απαιτείται μια πρόσθετη λειτουργία %s για την αναπαραγωγή αυτής της ροής, "
+"αλλά δεν έχει εγκατασταθεί."
+
+msgid "Could not determine type of stream"
+msgstr "Αδυναμία προσδιορισμού τύπου ροής"
+
+msgid "This appears to be a text file"
+msgstr "Αυτό φαίνεται να είναι αρχείο κειμένου"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Λείπει το στοιχείο '%s' - ελέγξτε την εγκατάσταση του GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Λείπουν και τα δύο στοιχεία autoaudiosink και %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Το στοιχείο autovideosink λείπει."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Το διαμορφωμένο videosink %s δεν δουλεύει."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Λείπουν και τα δύο στοιχεία autovideosink και %s."
+
+msgid "The autovideosink element is not working."
+msgstr "Το στοιχείο autovideosink δεν δουλεύει."
+
+msgid "Custom text sink element is not usable."
+msgstr "Το προσαρμοσμένο στοιχείο text sink δεν είναι λειτουργικό."
+
+msgid "No volume control found"
+msgstr "Δεν βρέθηκε ρυθμιστικό έντασης"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Λείπουν και τα δύο στοιχεία autoaudiosink και %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Το στοιχείο autoaudiosink λείπει."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Το διαμορφωμένο audiosink %s δεν δουλεύει."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Και τα δύο στοιχεία autoaudiosink και %s δεν δουλεύουν."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Το στοιχείο autoaudiosink δεν δουλεύει."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Αδυναμία αναπαραγωγής αρχείου κειμένου χωρίς βίντεο ή οπτικοποίηση."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Δεν υπάρχει διαθέσιμος αποκωδικοποιητής για τον τύπο '%s'."
+
+msgid "No URI specified to play from."
+msgstr "Δεν ορίσθηκε URI από το οποίο θα γίνει αναπαραγωγή."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Μη έγκυρο URI «%s»."
+
+msgid "This stream type cannot be played yet."
+msgstr "Αυτός ο τύπος ροής δεν μπορεί να αναπαραχθεί ακόμη."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Δεν έχει υλοποιηθεί χειριστής URI για «%s»."
+
+msgid "Source element is invalid."
+msgstr "Το στοιχείο προέλευσης δεν είναι έγκυρο."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Σφάλμα κατά την αποστολή δεδομένων σε «%s:%d»."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Άρνηση σύνδεσης σε %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "Αδυναμία εγγραφής ήχου αρκετά γρήγορα"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Αποτυχία ανάγνωσης ετικέτας: δεν υπάρχουν αρκετά δεδομένα"
+
+msgid "track ID"
+msgstr "ID κομματιού"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz ID κομματιού"
+
+msgid "artist ID"
+msgstr "ID καλλιτέχνη"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz ID καλλιτέχνη"
+
+msgid "album ID"
+msgstr "ID άλμπουμ"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz ID άλμπουμ"
+
+msgid "album artist ID"
+msgstr "ID καλλιτενη άλμπουμ"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz ID καλλιτέχνη άλμπουμ"
+
+msgid "track TRM ID"
+msgstr "TRM ID κομματιού"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr "ταχύτητα κλείστρου λήψης"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Ταχύτητα κλείστρου κατά τη λήψη μιας εικόνας, σε δευτερόλεπτα"
+
+msgid "capturing focal ratio"
+msgstr "εστιακός λόγος λήψης"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+"Εστιακός λόγος (f-number ή f-stop) που χρησιμοποιήθηκε κατά τη λήψη της "
+"εικόνας"
+
+msgid "capturing focal length"
+msgstr "εστιακό μήκος λήψης"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+"Το εστιακό μήκος του φακού που χρησιμοποιήθηκε κατά τη λήψη της εικόνας, σε "
+"mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "λόγος ψηφιακού ζουμ λήψης"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Ο λόγος ψηφιακού ζουμ που χρησιμοποιήθηκε κατά τη λήψη μιας εικόνας"
+
+msgid "capturing iso speed"
+msgstr "ταχύτητα iso λήψης"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Η ταχύτητα ISO που χρησιμοποιήθηκε κατά τη λήψη μιας εικόνας"
+
+msgid "capturing exposure program"
+msgstr "πρόγραμμα έκθεσης λήψης"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Το πρόγραμμα έκθεσης που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+msgid "capturing exposure mode"
+msgstr "τρόπος έκθεσης λήψης"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Ο τρόπος έκθεσης που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "τρόπος έκθεσης λήψης"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "Ο τρόπος έκθεσης που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+msgid "capturing scene capture type"
+msgstr "τύπος σύλληψης σκηνής της λήψης"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Ο τρόπος σύλληψης σκηνής που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+msgid "capturing gain adjustment"
+msgstr "προσαρμογή κέρδους λήψης"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Η συνολική προσαρμογή κέρδους που εφαρμόσθηκε σε μια εικόνα"
+
+msgid "capturing white balance"
+msgstr "ισορροπία λευκού λήψης"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Η ισορροπία λευκού που ορίσθηκε κατά τη λήψη μιας εικόνας"
+
+msgid "capturing contrast"
+msgstr "αντίθεση λήψης"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+"Η κατεύθυνση της επεξεργασίας της αντίθεσης που εφαρμόσθηκε κατά τη λήψη "
+"μιας εικόνας"
+
+msgid "capturing saturation"
+msgstr "κορεσμός λήψης"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"Η κατεύθυνση της επεξεργασίας του κορεσμού που εφαρμόσθηκε κατά τη λήψη "
+"μιας εικόνας"
+
+msgid "capturing sharpness"
+msgstr "ευκρίνεια λήψης"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+"Η κατεύθυνση της επεξεργασίας της ευκρίνειας που εφαρμόσθηκε κατά τη λήψη "
+"μιας εικόνας"
+
+msgid "capturing flash fired"
+msgstr "ενεργοποίηση φλας στη λήψη"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Αν ενεργοποιήθηκε το φλας κατά τη λήψη μιας εικόνας"
+
+msgid "capturing flash mode"
+msgstr "κατάσταση φλας λήψης"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Η επιλεγμένη κατάσταση λειτουργίας του φλας κατά τη λήψη μιας εικόνας"
+
+msgid "capturing metering mode"
+msgstr "τρόπος φωτομέτρησης λήψης"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Ο τρόπος φωτομέτρησης που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+msgid "capturing source"
+msgstr "πηγή λήψης"
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+"Η πηγή ή ο τύπος της συσκευής που χρησιμοποιήθηκε για τη λήψη μιας εικόνας"
+
+msgid "image horizontal ppi"
+msgstr "οριζόντια ppi εικόνας"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Η σκοπούμενη οριζόντια πυκνότητα εικονοστοιχείων (pixel) του μέσου (εικόνα/"
+"βίντεο) σε ppi"
+
+msgid "image vertical ppi"
+msgstr "κάθετα ppi εικόνας"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Η σκοπούμενη κάθετη πυκνότητα εικονοστοιχείων (pixel) του μέσου (εικόνα/"
+"βίντεο) σε ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Αυτό το CD δεν έχει ηχητικά κομμάτια"
+
+msgid "ID3 tag"
+msgstr "Ετικέτα ID3"
+
+msgid "APE tag"
+msgstr "Ετικέτα APE"
+
+msgid "ICY internet radio"
+msgstr "Διαδικτυακό ραδιόφωνο ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Μη απωλεστικός ήχος της Apple (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Ελεύθερος μη απωλεστικός κωδικοποιητής ήχου (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Μη απωλεστικός αληθής ήχος (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "Μη απωλεστικός CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Μη απωλεστικός MSZH"
+
+msgid "Run-length encoding"
+msgstr "Κωδικοποίηση Run-length"
+
+msgid "Sami subtitle format"
+msgstr "Μορφή υποτίτλων Sami "
+
+msgid "TMPlayer subtitle format"
+msgstr "Μορφή υποτίτλων TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Μορφή υποτίτλων Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Ασυμπίεστο YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Ασυμπίεστη εικόνα κλίμακας του γκρι"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Ασυμπίεστο YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Ασυμπίεστο palettized %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Έκδοση %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Ασυμπίεστο YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Καθαρός %d-bit PCM ήχος"
+
+msgid "Audio CD source"
+msgstr "Πηγή CD ήχου"
+
+msgid "DVD source"
+msgstr "Πηγή DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Πηγή Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Πηγή πρωτοκόλλου Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Πηγή πρωτοκόλλου %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "RTP depayloader βίντεο %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "RTP depayloader ήχου %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP depayloader"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Αποπλέκτης %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Αποκωδικοποιητής %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "RTP payloader βίντεο %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "RTP payloader ήχου %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Πολυπλέκτης %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Κωδικοποιητής %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Στοιχείο %s του GStreamer"
+
+msgid "Unknown source element"
+msgstr "Άγνωστο στοιχείο πηγής"
+
+msgid "Unknown sink element"
+msgstr "Άγνωστο στοιχείο απαγωγής"
+
+msgid "Unknown element"
+msgstr "Άγνωστο στοιχείο"
+
+msgid "Unknown decoder element"
+msgstr "Άγνωστο στοιχείο αποκωδικοποιητή"
+
+msgid "Unknown encoder element"
+msgstr "Άγνωστο στοιχείο κωδικοποιητή"
+
+msgid "Plugin or element of unknown type"
+msgstr "Πρόσθετη λειτουργία ή στοιχείο άγνωστου τύπου"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Ασυμπίεστο planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Ασυμπίεστο planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Ασυμπίεστο packed YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Ασυμπίεστο packed YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Ασυμπίεστο packed YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Ασυμπίεστο packed YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Ασυμπίεστο packed YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Ασυμπίεστο planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Ασυμπίεστο planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Ασυμπίεστο ασπρόμαυρο Y-plane"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Καθαρός ήχος PCM "
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Καθαρός ήχος %d-bit floating-point"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Καθαρός floating-point ήχος"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Αδυναμία ανοίγματος αρχείου vfs «%s» για εγγραφή: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Δεν δόθηκε όνομα αρχείου"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Αδυναμία κλεισίματος αρχείου vfs «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Σφάλμα κατά την εγγραφή στο αρχείο «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Μη έγκυρο URI υποτίτλων «%s», υπότιτλοι απενεργοποιήθηκαν."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Ροές RTSP δεν μπορούν να αναπαραχθούν ακόμα."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Αδυναμία δημιουργία στοιχείου «decodebin»."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Ανιχνεύθηκε μόνο μια ροή υποτίτλων. Είτε φορτώνετε ένα αρχείο υποτίτλων ή "
+#~ "κάποιο άλλο τύπο αρχείου κειμένου, ή το αρχείο πολυμέσων δεν "
+#~ "αναγνωρίσθηκε."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Δεν έχετε εγκατεστημένο αποκωδικοποιητή για να χειριστεί αυτό το αρχείο. "
+#~ "Μπορεί να χρειάζεται να εγκαταστήσετε τις απαραίτητες πρόσθετες "
+#~ "λειτουργίες."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Αυτό δεν είναι αρχείο πολυμέσων"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Ανιχνεύθηκε ροή υποτίτλων αλλά όχι ροή βίντεο."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Λείπουν και τα δύο στοιχεία autovideosink και xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Λείπουν και τα δύο στοιχεία autoaudiosink και alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Δεν ορίσθηκε συσκευή."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Η συσκευή «%s» δεν υπάρχει."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Η συσκευή «%s» χρησιμοποιείται ήδη."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Αδυναμία ανοίγματος συσκευής «%s» για ανάγνωση και εγγραφή."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Σφάλμα κατά την αποστολή δεδομένων κεφαλίδας gdp σε «%s:%d»."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Σφάλμα κατά την αποστολή δεδομένων φόρτου gdp σε «%s:%d»."
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 0000000..38e6319
--- /dev/null
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..7b592c8
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,673 @@
+# English (British) translation.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Gareth Owen <gowen72@yahoo.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins 0.8.1\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-04-26 10:41-0400\n"
+"Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
+"Language-Team: English (British) <en_gb@li.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "Bass"
+
+msgid "Treble"
+msgstr "Treble"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Line-in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Microphone"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "Speaker"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "Could not open CD device for reading."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "Could not open CD device for reading."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Could not open CD device for reading."
+
+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."
+msgstr "Could not open audio device \"%s\" for writing."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "Could not open CD device for reading."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "Could not open CD device for reading."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Could not open CD device for reading."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "Could not open device \"%s\" for reading and writing."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "Could not open CD device for reading."
+
+msgid "Could not open CD device for reading."
+msgstr "Could not open CD device for reading."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "Could not close vfs file \"%s\"."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "Could not write to device \"%s\"."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "Could not write to file \"%s\"."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Error closing file \"%s\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+msgstr ""
+
+#, 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\"."
+
+#, fuzzy
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Error closing file \"%s\"."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "Device \"%s\" is not a capture device."
+
+#~ msgid "No device specified."
+#~ msgstr "No device specified."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Device \"%s\" does not exist."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "OSS device \"%s\" is already in use by another program."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Could not open device \"%s\" for reading and writing."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Could not write to file \"%s\"."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "No device specified."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Could not write to file \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Could not open file \"%s\" for reading."
+
+#~ msgid "Device is not open."
+#~ msgstr "Device is not open."
+
+#~ msgid "Device is open."
+#~ msgstr "Device is open."
+
+#~ 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"
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "Could not open file \"%s\" for writing."
+
+#~ msgid "No filename specified."
+#~ msgstr "No filename specified."
+
+#~ msgid "No or invalid input audio, AVI stream will be corrupt."
+#~ msgstr "No or invalid input audio, AVI stream will be corrupt."
+
+#~ 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 close audio device \"%s\"."
+#~ msgstr "Could not close audio device \"%s\"."
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "Could not close control device \"%s\"."
+
+#~ 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 "Could not access device \"%s\", check its permissions."
+#~ msgstr "Could not access device \"%s\", check its permissions."
+
+#~ 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 doesn't support mono or stereo."
+#~ msgstr "Your oss device could not be probed correctly"
+
+#, fuzzy
+#~ msgid "Your OSS device could not be probed correctly"
+#~ msgstr "Your oss device could not be probed correctly"
+
+#~ msgid "Volume"
+#~ msgstr "Volume"
+
+#~ msgid "Speaker"
+#~ msgstr "Speaker"
+
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "Could not get buffers from device \"%s\"."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "Could not get enough buffers from device \"%s\"."
diff --git a/po/eo.gmo b/po/eo.gmo
new file mode 100644
index 0000000..b598244
--- /dev/null
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
new file mode 100644
index 0000000..da9f7ac
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,538 @@
+# Esperanto translation for gst-plugins-base.
+# Copyright (C) 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-06-04 21:11+0100\n"
+"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\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 "Master"
+msgstr "Ĉefa regilo"
+
+msgid "Bass"
+msgstr "Baso"
+
+msgid "Treble"
+msgstr ""
+
+msgid "PCM"
+msgstr ""
+
+msgid "Synth"
+msgstr "Sintezilo"
+
+msgid "Line-in"
+msgstr ""
+
+msgid "CD"
+msgstr "KD"
+
+msgid "Microphone"
+msgstr "Mikrofono"
+
+msgid "PC Speaker"
+msgstr "Komputila laŭtparolilo"
+
+msgid "Playback"
+msgstr "Reproduktado"
+
+msgid "Capture"
+msgstr "Kapti"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Ne eblis malfermi aparaton por reproduktado per unukanala reĝimo."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Ne eblis malfermi aparaton por reproduktado per dukanala reĝimo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Ne eblis malfermi la aparaton por reproduktado per %d-kanala reĝimo."
+
+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."
+msgstr "Ne eblis malfermi la sonaparaton por reproduktado."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Ne eblis malfermi la aparaton por registrado per unukanala reĝimo."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Ne eblis malfermi la aparaton por registrado per dukanala reĝimo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Ne eblis malfermi la aparaton por registrado per %d-kanala reĝimo."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Ne eblis malfermi la aparaton por registrado. Ĝi estas uzate de alia "
+"aplikaĵo."
+
+msgid "Could not open audio device for recording."
+msgstr "Ne eblis malfermi sonaparaton por registrado."
+
+msgid "Could not open CD device for reading."
+msgstr "Ne eblis malfermi KD-aparaton por legado."
+
+msgid "Could not seek CD."
+msgstr "Ne eblis traserĉi la KD-n."
+
+msgid "Could not read CD."
+msgstr "Ne eblis legi la KD-n."
+
+msgid "Internal data stream error."
+msgstr "Interna datumflu-eraro."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "%s-kromprogramo bezonatas, sed tia ne estas instalite."
+
+msgid "Could not determine type of stream"
+msgstr "Ne eblis rekoni la tipon de la fluo"
+
+msgid "This appears to be a text file"
+msgstr "Tio ŝajnas esti tekstdosiero"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr "Ne trovis laŭtec-regilon"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Nevalida URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr "Font-elemento estas nevalide."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Eraro dum sendado de datumoj al \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr "Ne eblas registri la sonon sufiĉe rapide"
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr "album-ID"
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "\"DivX MPEG-4\"-versio %d"
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr "Son-KD-fonto"
+
+msgid "DVD source"
+msgstr "DVD-fonto"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokolfonto"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr "Nekonata fontelemento"
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr "Nekonata elemento"
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+msgstr ""
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Ne eblis malfermi la vfs-dosieron \"%s\" por skribado: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Ne donis dosiernomon"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Ne eblis fermi vfs-dosieron \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Eraro dum skribo al dosiero \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Nevalida subtekst-adreso \"%s\", subtekstoj estos elŝaltate."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Ankoraŭ ne eblas ludi RTSP-fluojn."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Ne eblis krei \"decodebin\"-elementon."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Tio ne estas aŭdvidaĵa dosiero"
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Ambaŭ elementoj \"autovideosink\" kaj \"xvimagesink\" mankas."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Aparato \"%s\" ne ekzistas."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Aparato \"%s\" jam estas uzata."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Ne eblis malfermi aparaton \"%s\" por legado aŭ skribado."
diff --git a/po/es.gmo b/po/es.gmo
new file mode 100644
index 0000000..c138f7b
--- /dev/null
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..481c79d
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,644 @@
+# translation of gst-plugins-base-0.10.30.3.po to Español
+# spanish translation for gst-plugins-base
+# This file is put in the public domain.
+# Jorge González González <aloriel@gmail.com>, 2007, 2008, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-11-02 15:40+0100\n"
+"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"Language: es\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 "Master"
+msgstr "Maestro"
+
+msgid "Bass"
+msgstr "Bajo"
+
+msgid "Treble"
+msgstr "Agudos"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizador"
+
+msgid "Line-in"
+msgstr "Línea de entrada"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Micrófono"
+
+msgid "PC Speaker"
+msgstr "Altavoz del equipo"
+
+msgid "Playback"
+msgstr "Reproducción"
+
+msgid "Capture"
+msgstr "Capturar"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "No se pudo abrir el dispositivo para la reproducir en modo mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "No se pudo abrir el dispositivo para la reproducir en modo estéreo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "No se pudo abrir el dispositivo para reproducir en modo %d-canales."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"No se pudo abrir el dispositivo para la reproducir. Otra aplicación está "
+"usando el dispositivo."
+
+msgid "Could not open audio device for playback."
+msgstr "No se pudo abrir el dispositivo para la reproducir."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "No se pudo abrir el dispositivo para grabar en modo mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "No se pudo abrir el dispositivo para grabar en modo estéreo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "No se pudo abrir el dispositivo para grabar en modo %d-canales."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"No se pudo abrir el dispositivo de sonido para grabar. Otra aplicación está "
+"usando el dispositivo."
+
+msgid "Could not open audio device for recording."
+msgstr "No se pudo abrir el dispositivo de sonido para grabar."
+
+msgid "Could not open CD device for reading."
+msgstr "No se pudo abrir el dispositivo de CD para leer."
+
+msgid "Could not seek CD."
+msgstr "No se pudo buscar en el CD."
+
+msgid "Could not read CD."
+msgstr "No se pudo leer del D."
+
+msgid "Internal data stream error."
+msgstr "Error interno de flujo de datos."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Se requiere un complemento de %s para reproducir este medio, pero no está "
+"instalado."
+
+msgid "Could not determine type of stream"
+msgstr "No se pudo determinar el tipo de flujo"
+
+msgid "This appears to be a text file"
+msgstr "Esto parece ser un archivo de texto"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Falta el elemento «%s»; compruebe su instalación de GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Tanto el elemento autovideosink como %s faltan."
+
+msgid "The autovideosink element is missing."
+msgstr "Falta el elemento autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "El videosink configurado %s no está funcionando."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Tanto el elemento autovideosink como %s no están funcionando."
+
+msgid "The autovideosink element is not working."
+msgstr "El elemento autovideosink no está funcionando."
+
+msgid "Custom text sink element is not usable."
+msgstr "No se puede usar el elemento sumidero (sink) de texto personalizado."
+
+msgid "No volume control found"
+msgstr "No se encontró ningún control de volumen"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Tanto el elemento autoaudiosink como %s faltan."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Falta el elemento autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "El audiosink configurado %s no está funcionando."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Tanto el elemento autoaudiosink como %s no están funcionando."
+
+msgid "The autoaudiosink element is not working."
+msgstr "El elemento autoaudiosink no está funcionando."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"No se puede reproducir un archivo de texto sin vídeo o visualizaciones."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "No hay un decodificador disponible para el tipo «%s»."
+
+msgid "No URI specified to play from."
+msgstr "No se especificó una URI para reproducir."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "El URI «%s» no es válido."
+
+msgid "This stream type cannot be played yet."
+msgstr "Este tipo de flujo no se puede reproducir aún."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "No existe un manejador URI implementado para «%s»."
+
+msgid "Source element is invalid."
+msgstr "El elemento fuente no es válido."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Error al enviar los datos a «%s:%d»."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Se rechazó la conexión con %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "No se puede grabar el sonido lo suficientemente rápido"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Falló al leer la etiqueta: no hay datos suficientes"
+
+msgid "track ID"
+msgstr "ID de la pista"
+
+msgid "MusicBrainz track ID"
+msgstr "ID de la pista en MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID del artista"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID del artista en MusicBrainz"
+
+msgid "album ID"
+msgstr "ID del álbum"
+
+msgid "MusicBrainz album ID"
+msgstr "ID del álbum en MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID del álbum del artista"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID del álbum del artista en MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID TRM de la pista"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM en MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "velocidad del obturador de la toma"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Velocidad del obturador usada al tomar una imagen, en segundos"
+
+msgid "capturing focal ratio"
+msgstr "tasa focal de la toma"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Tasa focal (número-f) usada al tomar la imagen"
+
+msgid "capturing focal length"
+msgstr "longitud focal de la toma"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Longitud focal de la lente usada al tomar la imagen, en mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "tasa de ampliación digital de la toma"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Tasa de ampliación digital usada al tomar una imagen"
+
+msgid "capturing iso speed"
+msgstr "velocidad ISO de la toma"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "La velocidad de captura ISO usada al tomar una imagen"
+
+msgid "capturing exposure program"
+msgstr "programa de exposición de la toma"
+
+msgid "The exposure program used when capturing an image"
+msgstr "El programa de exposición usado al tomar una imagen"
+
+msgid "capturing exposure mode"
+msgstr "modo de exposición de la toma"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "El modo de exposición usado al tomar una imagen"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "modo de exposición de la toma"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "El modo de exposición usado al tomar una imagen"
+
+msgid "capturing scene capture type"
+msgstr "tipo de escena usado en la toma"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "El modo de captura usado al tomar una imagen"
+
+msgid "capturing gain adjustment"
+msgstr "ajuste de ganancia de la toma"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "El ajuste general de ganancia aplicado en una imagen"
+
+msgid "capturing white balance"
+msgstr "balance de blancos de la toma"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "El modo de balance de blancos usado al tomar una imagen"
+
+msgid "capturing contrast"
+msgstr "contraste de la toma"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "La dirección de contraste procesada aplicada al tomar una imagen"
+
+msgid "capturing saturation"
+msgstr "saturación de la toma"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "La dirección de saturación procesada aplicacada al tomar una imagen"
+
+msgid "capturing sharpness"
+msgstr "nitidez de la toma"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "La dirección de nitidez procesada aplicada al tomar una imagen"
+
+msgid "capturing flash fired"
+msgstr "disparo de flash de la toma"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Si el flash se disparó al capturar una imagen"
+
+msgid "capturing flash mode"
+msgstr "modo de flash de la toma"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "El modo de flash seleccionado al tomar una imagen"
+
+msgid "capturing metering mode"
+msgstr "modo de medición de la toma"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"El modo de medición usado al determinado la exposición al tomar una imagen"
+
+msgid "capturing source"
+msgstr "fuente de la toma"
+
+msgid "The source or type of device used for the capture"
+msgstr "El origen o tipo de dispositivo usado para la toma"
+
+msgid "image horizontal ppi"
+msgstr "ppi horizontal de la imagen"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Densidad horizontal de píxeles, en ppi, del medio (imagen o vídeo)"
+
+msgid "image vertical ppi"
+msgstr "ppi vertical de la imagen"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Densidad vertical de píxeles, en ppi, del medio (imagen o vídeo)"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Este CD no tiene pistas de sonido"
+
+msgid "ID3 tag"
+msgstr "Etiqueta ID3"
+
+msgid "APE tag"
+msgstr "Etiqueta APE"
+
+msgid "ICY internet radio"
+msgstr "Emisora de internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV sin pérdida"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH sin pérdida"
+
+msgid "Run-length encoding"
+msgstr "Codificación del tamaño durante la ejecución"
+
+msgid "Sami subtitle format"
+msgstr "Formato de subtítulos Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Formato de subtítulos TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Formato de subtítulos kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV sin comprimir"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Imagen en escala de grises sin comprimir"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV sin comprimir"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Paletizado sin comprimir de %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versión %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV sin comprimir"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Audio PCM sin comprimir de %d-bits"
+
+msgid "Audio CD source"
+msgstr "Fuente: CD de audio"
+
+msgid "DVD source"
+msgstr "Fuente: DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Fuente: Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Fuente: Protocolo Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Fuente: Protocolo %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "decodificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "decodificador de sonido RTP %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "decodificador RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "demultiplexor %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "decodificador %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "codificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "codificador de sonido RTP %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "codificador RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "multiplexor %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "codificador %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Elemento %s de GStreamer"
+
+msgid "Unknown source element"
+msgstr "Fuente: Elemento desconocido"
+
+msgid "Unknown sink element"
+msgstr "Elemento sumidero (sink) desconocido"
+
+msgid "Unknown element"
+msgstr "Elemento desconocido"
+
+msgid "Unknown decoder element"
+msgstr "Elemento decodificador desconocido"
+
+msgid "Unknown encoder element"
+msgstr "Elemento codificador desconocido"
+
+msgid "Plugin or element of unknown type"
+msgstr "Complemento o elemento de tipo desconocido"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 plano sin comprimir"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YVU 4:2:0 plano sin comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 empaquetado sin comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 empaquetado sin comprimir"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU 4:1:0 empaquetado sin comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 empaquetado sin comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 empaquetado sin comprimir"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 plano sin comprimir"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 plano sin comprimir"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Plano Y en blanco y negro sin comprimir"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Audio PCM sin comprimir"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio sin comprimir de %d-bits en coma flotante"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio sin comprimir en coma flotante"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "No se pudo abrir el archivo VFS «%s» para escribir: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "No se dio un nombre de archivo"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "No se pudo cerrar el archivo VFS «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Error al escribir al archivo «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "URI de subtítulos «%s» no válida, se desactivaron los subtítulos."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Aún no se pueden reproducir los medios RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "No se pudo crear el elemento «decodebin»."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Sólo se detecto un flujo de subtítulos. O bien está cargando un archivo "
+#~ "de subtítulos o algún otro tipo de archivo de texto o el archivo "
+#~ "multimedia no se pudo reconocer."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "No tiene un decodificador instalado para manejar este archivo. Debe "
+#~ "instalar los complementos necesarios."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Este no es un archivo multimedia"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Se detectó un flujo de subtítulos, pero no un flujo de vídeo."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Tanto el elemento autovideosink como xvimagesink faltan."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Tanto el elemento autoaudiosink como alsasink faltan."
+
+#~ msgid "No device specified."
+#~ msgstr "No se especificó un dispositivo."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "El dispositivo «%s» no existe."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "El dispositivo «%s» ya se está usando."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "No se pudo abrir el dispositivo «%s» para su lectura y escritura."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Error al enviar los datos de la cabecera gdp a «%s:%d»."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Error al enviar la carga de datos de gdp a «%s:%d»."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "No se pueden mostrar a la vez subtítulos de texto y subimágenes."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "No se especificó un directorio temporal."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "No se pudo cerrar el archivo temporal «%s»."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "No se pudo abrir el archivo «%s» para leer."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Error en el flujo de datos interno."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "No se pudo crear el elemento «decodebin2»."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "No se pudo crear el elemento «queue2»."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "No se pudo crear el elemento «typefind»."
+
+#~ msgid "No file name specified."
+#~ msgstr "No se especificó un nombre de archivo."
diff --git a/po/eu.gmo b/po/eu.gmo
new file mode 100644
index 0000000..df6360f
--- /dev/null
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 0000000..a243a33
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,620 @@
+# translation of gst-plugins-base.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-base package.
+#
+# Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>, 2009, 2010.
+# Mikel Olasagasti Uranga <hey_neken@mundurat.net>, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base-0.10.26.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-03-25 12:32+0100\n"
+"Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n"
+"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\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 "Master"
+msgstr "Maisua"
+
+msgid "Bass"
+msgstr "Baxua"
+
+msgid "Treble"
+msgstr "Altua"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizadorea"
+
+msgid "Line-in"
+msgstr "Linea-sarrera"
+
+msgid "CD"
+msgstr "CDa"
+
+msgid "Microphone"
+msgstr "Mikrofonoa"
+
+msgid "PC Speaker"
+msgstr "Ordenagailuko bozgorailua"
+
+msgid "Playback"
+msgstr "Erreproduzitzea"
+
+msgid "Capture"
+msgstr "Kapturatzea"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Ezin izan da gailua ireki mono moduan erreproduzitzeko."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Ezin izan da gailua ireki estereo moduan erreproduzitzeko."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Ezin izan da gailua ireki %d kanaleko moduan erreproduzitzeko."
+
+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."
+msgstr "Ezin izan da audioaren gailua ireki erreproduzitzeko."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Ezin izan da gailua ireki mono moduan grabatzeko."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Ezin izan da gailua ireki estereo moduan grabatzeko."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Ezin izan da gailua ireki %d kanaleko moduan grabatzeko."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Ezin izan da audioaren gailua ireki grabatzeko. Beste aplikazio batek "
+"darabil gailua."
+
+msgid "Could not open audio device for recording."
+msgstr "Ezin izan da audioaren gailua ireki grabatzeko."
+
+msgid "Could not open CD device for reading."
+msgstr "Ezin izan da CD gailua ireki irakurtzeko."
+
+msgid "Could not seek CD."
+msgstr "Ezin izan da CDan bilatu."
+
+msgid "Could not read CD."
+msgstr "Ezin izan da CDa irakurri."
+
+msgid "Internal data stream error."
+msgstr "Datu-korrontearen barne-errorea."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"%s plugina behar da korronte hori erreproduzitzeko, baina ez dago instalatua."
+
+msgid "Could not determine type of stream"
+msgstr "Ezin izan da korronte mota zehaztu"
+
+msgid "This appears to be a text file"
+msgstr "Testu-fitxategia dela dirudi"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "'%s' elementua falta da. Begiratu GStreamer ondo instalatua dagoen."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Autovideosink eta %s elementuak, biak, falta dira."
+
+msgid "The autovideosink element is missing."
+msgstr "Autovideosink elementua falta da."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Konfiguratutako %s videosink ez da lanean ari."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Autovideosink eta %s elementuak, biak, ez dira lanean ari."
+
+msgid "The autovideosink element is not working."
+msgstr "Autovideosink elementua ez da lanean ari."
+
+msgid "Custom text sink element is not usable."
+msgstr "Helburuko testu pertsonalizatua ez dago erabilgarri."
+
+msgid "No volume control found"
+msgstr "Ez da bolumenaren kontrolik aurkitu"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Autoaudiosink eta %s elementuak, biak, falta dira."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Autoaudiosink falta da."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Konfiguratutako %s audiosink ez da lanean ari."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Autoaudiosink eta %s elementuak, biak, ez dira lanean ari."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Autoaudiosink elementua ez da lanean ari."
+
+#, fuzzy
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Ezin da bideo edo bisualizaziorik gabeko testu-fitxategi bat erreproduzitu."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Ez dago deskodetzaile erabilgarririk '%s' motarentzat."
+
+msgid "No URI specified to play from."
+msgstr "Ez da URIrik zehaztu irakurtzeko."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "\"%s\" URI baliogabea."
+
+msgid "This stream type cannot be played yet."
+msgstr "Oraindik ezin da erreproduzitu korronte mota hori."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Ez da URI maneiatzailerik ezarri \"%s\"(r)entzat."
+
+msgid "Source element is invalid."
+msgstr "Iturburuko elementua baliogabea da."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Errorea gertatu da datuak \"%s:%d\"(e)ra bidaltzean."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "%s:%d(e)ra konektatzea ukatu da."
+
+msgid "Can't record audio fast enough"
+msgstr "Ezin da behar bezain bizkor grabatu audioa"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Huts egin du etiketa irakurtzean: ez dago nahikoa daturik"
+
+msgid "track ID"
+msgstr "pistaren IDa"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz pistaren IDa"
+
+msgid "artist ID"
+msgstr "interpretearen IDa"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz interpretearen IDa"
+
+msgid "album ID"
+msgstr "albumaren IDa"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz albumaren IDa"
+
+msgid "album artist ID"
+msgstr "albumaren interpretearen IDa"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albumaren interpretearen IDa"
+
+msgid "track TRM ID"
+msgstr "pistaren TRM IDa"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM IDa"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "CD honek ez du audio-pistarik"
+
+msgid "ID3 tag"
+msgstr "ID3 etiketa"
+
+msgid "APE tag"
+msgstr "APE etiketa"
+
+msgid "ICY internet radio"
+msgstr "ICY interneteko irratia"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple-ren galerarik gabeko audioa (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Galerarik gabeko audio-kodek librea (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Galerarik gabeko True audioa (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "Galerarik gabeko CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg 1.b"
+
+msgid "Lossless MSZH"
+msgstr "Galerarik gabeko MSZH"
+
+msgid "Run-length encoding"
+msgstr "Run-length kodeketa"
+
+msgid "Sami subtitle format"
+msgstr "Sami azpititulu-formatua"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer azpititulu-formatua"
+
+msgid "Kate subtitle format"
+msgstr "'Kate' azpititulu-formatua"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Konprimitu gabeko YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Konprimitu gabeko irudi grisa"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Konprimitu gabeko YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Konprimitu gabeko paleta moduko %d biteko %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 %d. bertsioa"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Konprimitu gabeko YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "%d biteko prozesatu gabeko PCM audioa"
+
+msgid "Audio CD source"
+msgstr "Audio CDaren iturburua"
+
+msgid "DVD source"
+msgstr "DVD iturburua"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Denbora errealeko transmisio-protokoloaren (RTSP) iturburua"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) protokoloaren iturburua"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokolo-ituruburua"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s bideoaren RTP depayloader-a"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audiooaren RTP depayloader-a"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP depayloader-a"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demultiplexadorea"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s deskodetzailea"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s bideoaren RTP payloader-a"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audiooaren RTP payloader-a"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP payloader-a"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s multiplexadorea"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s kodetzailea"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "%s GStreamer elementua"
+
+msgid "Unknown source element"
+msgstr "Iturburu-elementu ezezaguna"
+
+msgid "Unknown sink element"
+msgstr "Kolektore-elementu ezezaguna"
+
+msgid "Unknown element"
+msgstr "Elementu ezezaguna"
+
+msgid "Unknown decoder element"
+msgstr "Deskodetzailearen elementu ezezaguna"
+
+msgid "Unknown encoder element"
+msgstr "Kodetzailearen elementu ezezaguna"
+
+msgid "Plugin or element of unknown type"
+msgstr "Mota ezezaguneko plugina edo elementua"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Konprimitu gabeko YUV 4:2:0 planarra"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Konprimitu gabeko YVU 4:2:0 planarra"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Konprimitu gabeko YUV 4:2:2 paketatua"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Konprimitu gabeko YUV 4:1:0 paketatua"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Konprimitu gabeko YVU 4:1:0 paketatua"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Konprimitu gabeko YUV 4:1:1 paketatua"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Konprimitu gabeko YUV 4:4:4 paketatua"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Konprimitu gabeko YUV 4:2:2 planarra"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Konprimitu gabeko YUV 4:1:1 planarra"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Konprimitu gabeko zuri-beltzeko Y-planoa"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Prozesatu gabeko PCM audioa"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Koma mugikorreko %d biteko prozesatu gabeko PCM audioa"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Koma mugikorreko prozesatu gabeko audioa"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Ezin izan da \"%s\" vfs fitxategia ireki idazteko: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Ez da fitxategi-izenik eman"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Ezin izan da itxi \"%s\" vfs fitxategia."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Errorea gertatu da \"%s\" fitxategian idaztean."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr ""
+#~ "Azpitituluen \"%s\" URIa ez da baliozkoa. Azpitituluak desgaitu egin dira."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Oraindik ezin dira erreproduzitu RTSP korronteak."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Ezin izan da sortu \"decodebin\" elementua."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Azpitituluen korrontea soilik detektatu da. Azpitituluen fitxategi bat "
+#~ "edo beste testu-fitxategi bat ari zara kargatzen, edo multimedia-"
+#~ "fitxategi hori ez da onartzen."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Ez da instalatu fitxategi hori maneiatzeko deskodetzailerik Litekeena da "
+#~ "beharrezko pluginak instalatu behar izatea."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Hori ez da multimedia-fitxategi bat"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Azpitituluen korrontea detektatu da, baina ez bideoarena."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Autovideosink eta xvimagesink elementuak, biak, falta dira."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Autoaudiosink eta alsasink elementuak, biak, falta dira."
+
+#~ msgid "No device specified."
+#~ msgstr "Ez da gailurik zehaztu."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "\"%s\" gailua ez dago."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "\"%s\" gailua erabiltzen ari dira."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Ezin izan da \"%s\" gailua ireki irakurtzeko eta idazteko."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Errorea gertatu da gdp goiburuaren datuak \"%s:%d\"(e)ra bidaltzean."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Errorea gertatu da gdp karga erabilgarriaren datuak \"%s:%d\"(e)ra "
+#~ "bidaltzean."
diff --git a/po/fi.gmo b/po/fi.gmo
new file mode 100644
index 0000000..777ce86
--- /dev/null
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..5c2772f
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,650 @@
+# Finnish messages for gst-plugins-base.
+#
+# This file is distributed under the same license as the gst-plugins-base package.
+# Copyright (C) 2008-2010 Tommi Vainikainen,
+# Copyright (C) 2007 Ilkka Tuohela.
+#
+# Tommi Vainikainen <Tommi.Vainikainen@iki.fi>, 2008-2010.
+# Ilkka Tuohela <hile@iki.fi>, 2007.
+#
+# Suomennos: http://gnome.fi/
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-12-31 23:21+0200\n"
+"Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\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 "Master"
+msgstr "Pääkanava"
+
+msgid "Bass"
+msgstr "Basso"
+
+msgid "Treble"
+msgstr "Ylä-äänet"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Linjatulo"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofoni"
+
+msgid "PC Speaker"
+msgstr "PC-kaiutin"
+
+msgid "Playback"
+msgstr "Toisto"
+
+msgid "Capture"
+msgstr "Nauhoitus"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Laitetta ei voitu avata toistoa varten monona."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Laitetta ei voitu avata toistoa varten stereona."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Laitetta ei voitu avata toistoa varten %d-kanavaisessa tilassa."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Laitetta ei voitu avata toistoa varten. Laitetta käyttää toinen sovellus."
+
+msgid "Could not open audio device for playback."
+msgstr "Laitetta ei voitu avata toistoa varten."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Laitetta ei voitu avata nauhoitusta varten monona."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Laitetta ei voitu avata nauhoitusta varten stereona."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Laitetta ei voitu avata nauhoitusta varten %d-kanavaisessa tilassa."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Äänilaitetta ei voitu avata nauhoitusta varten. Laitetta käyttää toinen "
+"sovellus."
+
+msgid "Could not open audio device for recording."
+msgstr "Äänilaitetta ei voitu avat nauhoitusta varten."
+
+msgid "Could not open CD device for reading."
+msgstr "CD-laitetta ei voitu avata luettavaksi."
+
+msgid "Could not seek CD."
+msgstr "CD-levyllä ei voitu siirtyä."
+
+msgid "Could not read CD."
+msgstr "CD-levyä ei voitu lukea."
+
+msgid "Internal data stream error."
+msgstr "Sisäisen tietovirran virhe."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Virran toistamiseen tarvitaan %s-liitännäinen, mutta se ei ole asennettu."
+
+msgid "Could not determine type of stream"
+msgstr "Virran tyyppiä ei voitu määrittää"
+
+msgid "This appears to be a text file"
+msgstr "Tämä näyttää olevan tekstitiedosto"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Puuttuva elementti \"%s\" - tarkista GStreamer-asennuksesi."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Sekä autovideosink- ja %s-elementit puuttuvat."
+
+msgid "The autovideosink element is missing."
+msgstr "Autovideosink-elementti puuttuu."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Asetettu videonielu %s ei toimi."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Sekä autovideosink- ja %s-elementit eivät toimi."
+
+msgid "The autovideosink element is not working."
+msgstr "Autovideosink-elementti ei toimi."
+
+msgid "Custom text sink element is not usable."
+msgstr "Räätälöity tekstinieluelementti ei ole käyttökunnossa."
+
+msgid "No volume control found"
+msgstr "Äänenvoimakkuuden hallintaa ei löytynyt"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Sekä autoaudiosink- että %s-elementit puuttuvat."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Autoaudiosink-elementti puuttuu."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Asetettu ääninielu %s ei toimi."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Sekä autoaudiosink- että %s-elementit eivät toimi."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Autoaudiosink-elementti ei toimi."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Ei voida toistaa tekstitiedosta ilman videota tai visualisointia."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Purkajaa tyypille \"%s\" ei ole saatavilla."
+
+msgid "No URI specified to play from."
+msgstr "URIa, josta soitetaan, ei annettu."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Virheellinen URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Tätä virtatyyppiä ei voi vielä soittaa."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Protokollalle \"%s\" ei ole määritelty URI-käsittelijää."
+
+msgid "Source element is invalid."
+msgstr "Lähde-elementti on virheellinen."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Virhe lähetettäessä tietoa kohteeseen \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Yhteys kohteeseen %s:%d estettiin."
+
+msgid "Can't record audio fast enough"
+msgstr "Ääntä ei voi nauhoittaa tarpeeksi nopeasti"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Tagin lukeminen epäonnistui: ei riittävästi dataa"
+
+msgid "track ID"
+msgstr "kappaletunniste"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz-kappaletunniste"
+
+msgid "artist ID"
+msgstr "esittäjätunniste"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz-esittäjätunniste"
+
+msgid "album ID"
+msgstr "levytunniste"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz-levytunniste"
+
+msgid "album artist ID"
+msgstr "levyn esittäjätunniste"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz levyn esittäjätunniste"
+
+msgid "track TRM ID"
+msgstr "kappaleen TRM-tunniste"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM-tunniste"
+
+msgid "capturing shutter speed"
+msgstr "kuvaamisen suljinnopeus"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Suljinnopeus kuvattaessa, sekunteina"
+
+msgid "capturing focal ratio"
+msgstr "kuvaamisen aukkosuhde"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Aukkosuhde (f-luku) kuvattaessa"
+
+msgid "capturing focal length"
+msgstr "kuvaamisen polttoväli"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Linssin polttoväli kuvattaessa, millimetriä"
+
+msgid "capturing digital zoom ratio"
+msgstr "kuvaamisen digitaalinen zoomaus"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Digitaalinen suurennuskerroin kuvattaessa"
+
+msgid "capturing iso speed"
+msgstr "kuvaamisen ISO-nopeus"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "ISO-nopeus kuvattaessa"
+
+msgid "capturing exposure program"
+msgstr "kuvaamisen valotusohjelma"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Valotusohjelma kuvattaessa"
+
+msgid "capturing exposure mode"
+msgstr "kuvaamisen valotustapa"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Valotustapa kuvattaessa"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "kuvaamisen valotustapa"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "Valotustapa kuvattaessa"
+
+msgid "capturing scene capture type"
+msgstr "kuvaamisen kuvausmoodi"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Kuvausmoodi kuvattaessa"
+
+msgid "capturing gain adjustment"
+msgstr "kuvaamisen kirkkauskorjaus"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Yleinen kirkkauskorjaus, joka kuvalle on tehty"
+
+msgid "capturing white balance"
+msgstr "kuvaamisen valkotasapaino"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Valittu valkotasapainotila kuvattaessa"
+
+msgid "capturing contrast"
+msgstr "kuvaamisen kontrasti"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Käytetty kontrastikäsittelyn suunta kuvattessa"
+
+msgid "capturing saturation"
+msgstr "kuvaamisen saturaatio"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Käytetty saturaatiokäsittelyn suunta kuvattessa"
+
+msgid "capturing sharpness"
+msgstr "kuvaamisen terävyys"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Käytetty terävyyskäsittelyn suunta kuvattessa"
+
+msgid "capturing flash fired"
+msgstr "kuvaamisen salamankäyttö"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Syttyikö salama kuvattaessa"
+
+msgid "capturing flash mode"
+msgstr "kuvaamisen salamamoodi"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Valittu salamamoodi kuvattessa"
+
+msgid "capturing metering mode"
+msgstr "kuvaamisen mittausmoodi"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Käytetty mittausmoodi päätettäessä valotusta kuvattaessa"
+
+msgid "capturing source"
+msgstr "kuvaamisen lähde"
+
+msgid "The source or type of device used for the capture"
+msgstr "Lähde tai laitetyyppi kuvattaessa"
+
+msgid "image horizontal ppi"
+msgstr "kuvan vaakasuora ppi"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Median (kuva tai video) tarkoitettu vaakasuora pikselitiheys ppi:nä"
+
+msgid "image vertical ppi"
+msgstr "kuvan pystysuora ppi"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Median (kuva tai video) tarkoitettu pystysuora pikselitiheys ppi:nä"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Tällä CD-levyllä ei ole ääniraitoja"
+
+msgid "ID3 tag"
+msgstr "ID3-tagi"
+
+msgid "APE tag"
+msgstr "APE-tagi"
+
+msgid "ICY internet radio"
+msgstr "ICY-Internet-radio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows-media (puhe)"
+
+msgid "CYUV Lossless"
+msgstr "Häviötön CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Häviötön MSZH"
+
+msgid "Run-length encoding"
+msgstr "RLE-koodaus"
+
+msgid "Sami subtitle format"
+msgstr "Sami-tekstitysmuoto"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer-tekstitysmuoto"
+
+msgid "Kate subtitle format"
+msgstr "Kate-tekstitysmuoto"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Pakkaamaton YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Pakkaamaton harmaakuva"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Pakkaamaton YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Pakkaamaton paletillinen %d-bittinen %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versio %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Pakkaamaton YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Raaka %d-bittinen pcm-ääni"
+
+msgid "Audio CD source"
+msgstr "Ääni-CD-lähde"
+
+msgid "DVD source"
+msgstr "DVD-lähde"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol (RTSP) -lähde"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) -protokollalähde"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s-protokollalähde"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s-video-RTP-purkaja"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s-ääni-RTP-purkaja"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s-RTP-purkaja"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s-demukseri"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s-purkaja"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s-video-RTP-pakkain"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s-ääni-RTP-pakkain"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s-RTP-pakkain"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s-mukseri"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s-pakkain"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer-elementti %s"
+
+msgid "Unknown source element"
+msgstr "Tuntematon lähde-elementti"
+
+msgid "Unknown sink element"
+msgstr "Tuntematon nieluelementti"
+
+msgid "Unknown element"
+msgstr "Tuntematon elementti"
+
+msgid "Unknown decoder element"
+msgstr "Tuntematon purkajaelementti"
+
+msgid "Unknown encoder element"
+msgstr "Tuntematon kodekkielementti"
+
+msgid "Plugin or element of unknown type"
+msgstr "Liitännäisen tai elementin tyyppi on tuntematon"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Pakkaamaton tasollinen YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Pakkaamaton tasollinen YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Pakkaamaton paketoitu YUV 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Pakkaamaton paketoitu YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Pakkaamaton paketoitu YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Pakkaamaton paketoitu YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Pakkaamaton paketoitu YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Pakkaamaton tasollinen YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Pakkaamaton tasollinen YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Pakkaamaton mustavalkoinen Y-taso"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Raaka pcm-ääni"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Raaka %d-bittinen liukulukupohjainen ääni"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Raaka liukulukupohjainen ääni"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "VFS-tiedostoa \"%s\" ei voi avata kirjoitettavaksi: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Tiedostonimeä ei annettu"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "VFS-tiedostoa \"%s\" ei voitu sulkea."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Virhe kirjoitettaessa tiedostoon \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Virheellinen tekstitysten URI \"%s\", tekstitys ei ole käytössä."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP-virtoja ei voi vielä soittaa."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Elementtiä \"decodebin\" ei voitu luoda."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Havaittiin vain tekstitysvirta. Joko yrität ladata tekstitystiedostoa tai "
+#~ "muuta tekstitiedostoa, tai mediatiedostoa ei voitu tunnistaa."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Tämän tiedoston käsittelyyn ei ole asennettu purkajaa. Voi olla, että "
+#~ "sinun täytyy asentaa tarvittavia liitännäisiä."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Tämä ei ole mediatiedosto"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Havaittiin tekstitysvirta, mutta ei videovirtaa."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Sekä autovideosink- ja xvimagesink-elementit puuttuvat."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Sekä autoaudiosink- että alsasink-elementit puuttuvat."
+
+#~ msgid "No device specified."
+#~ msgstr "Laitetta ei ole määritelty."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Laitetta \"%s\" ei ole olemassa."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Laite \"%s\" on jo käytössä."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Laitetta \"%s\" ei voi avata luettavaksi ja kirjoitettavaksi."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Virhe lähetettäessä gdp-otsaketietoja kohteeseen \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Virhe lähetettäessä gdp-sisältöä kohteeseen \"%s:%d\"."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Ei voida toistaa sekä tekstitystä että alikuvaa."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Tilapäishakemistoa ei ole määritelty."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Tilapäistiedostoa ”%s” ei voitu luoda."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Tiedostoa \"%s\" ei voi avata luettavaksi."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Sisäisen tietovirran virhe."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Elementtiä \"decodebin2\" ei voitu luoda."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Elementtiä \"queue2\" ei voitu luoda."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Elementtiä \"typefind\" ei voitu luoda."
+
+#~ msgid "No file name specified."
+#~ msgstr "Tiedostonimeä ei annettu."
+
+#~ msgid "artist sortname"
+#~ msgstr "esittäjän järjestysnimi"
+
+#~ msgid "MusicBrainz artist sortname"
+#~ msgstr "MusicBrainz esittäjän järjestysnimi"
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644
index 0000000..936f80c
--- /dev/null
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..0058913
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,636 @@
+# Translation of gst-plugins-base to French
+# Copyright (C) 2003-2011 GStreamer core team
+# This file is distributed under the same license as the gst-plugins-base package.
+#
+# Nicolas Velin <nicolas@velin.fr>, 2008.
+# Claude Paroz <claude@2xlibre.net>, 2008-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-28 09:19+0200\n"
+"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"Language: fr\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 "Master"
+msgstr "Volume général"
+
+msgid "Bass"
+msgstr "Basses"
+
+msgid "Treble"
+msgstr "Aiguës"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Entrée ligne"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Micro"
+
+msgid "PC Speaker"
+msgstr "Haut-parleur PC"
+
+msgid "Playback"
+msgstr "Lecture"
+
+msgid "Capture"
+msgstr "Enregistrement"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Impossible d'utiliser le périphérique pour la lecture en mode mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Impossible d'utiliser le périphérique pour la lecture en mode stéréo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+"Impossible d'utiliser le périphérique pour la lecture en mode %d canaux."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Impossible d'utiliser le périphérique audio pour la lecture. Celui-ci est "
+"occupé par une autre application."
+
+msgid "Could not open audio device for playback."
+msgstr "Impossible d'utiliser le périphérique audio pour la lecture."
+
+msgid "Could not open device for recording in mono mode."
+msgstr ""
+"Impossible d'utiliser le périphérique pour l'enregistrement en mode mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr ""
+"Impossible d'utiliser le périphérique pour l'enregistrement en mode stéréo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr ""
+"Impossible d'utiliser le périphérique pour l'enregistrement en mode %d "
+"canaux."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Impossible d'utiliser le périphérique audio pour l'enregistrement. Celui-ci "
+"est occupé par une autre application."
+
+msgid "Could not open audio device for recording."
+msgstr "Impossible d'utiliser le périphérique audio pour l'enregistrement."
+
+msgid "Could not open CD device for reading."
+msgstr "Impossible d'utiliser le lecteur CD pour la lecture."
+
+msgid "Could not seek CD."
+msgstr "Impossible de se positionner sur le CD."
+
+msgid "Could not read CD."
+msgstr "Impossible de lire le CD."
+
+msgid "Internal data stream error."
+msgstr "Erreur interne de flux de données."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Un greffon %s est requis pour lire ce flux, mais il n'est pas installé."
+
+msgid "Could not determine type of stream"
+msgstr "Impossible de déterminer le type de flux"
+
+msgid "This appears to be a text file"
+msgstr "Ce fichier semble être un fichier texte"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Élément « %s » manquant, contrôlez votre installation de GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Les éléments autovideosink et %s sont tous deux manquants."
+
+msgid "The autovideosink element is missing."
+msgstr "L'élément autovideosink est manquant."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "L'élément videosink configuré %s ne fonctionne pas."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Les éléments autovideosink et %s ne fonctionnent pas."
+
+msgid "The autovideosink element is not working."
+msgstr "L'élément autovideosink ne fonctionne pas."
+
+msgid "Custom text sink element is not usable."
+msgstr "L'élément sink text personnalisé n'est pas utilisable."
+
+msgid "No volume control found"
+msgstr "Aucun contrôle de volume trouvé"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Les éléments autoaudiosink et %s sont tous deux manquants."
+
+msgid "The autoaudiosink element is missing."
+msgstr "L'élément autoaudiosink est manquant."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "L'élément autoaudiosink configuré %s ne fonctionne pas."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Les éléments autoaudiosink et %s ne fonctionnent pas."
+
+msgid "The autoaudiosink element is not working."
+msgstr "L'élément autoaudiosink ne fonctionne pas."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Impossible de lire un fichier texte sans vidéo ou visualisation."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Aucun décodeur n'est disponible pour le type « %s »."
+
+msgid "No URI specified to play from."
+msgstr "Aucun URI source indiqué pour la lecture."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "URI « %s » non valide."
+
+msgid "This stream type cannot be played yet."
+msgstr "Ce type de flux ne peut pas encore être lu."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Aucun gestionnaire d'URI implémenté pour « %s »."
+
+msgid "Source element is invalid."
+msgstr "Élément source non valide."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Erreur lors de l'envoi de données vers « %s:%d »."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Connexion refusée vers %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "Impossible d'enregistrer assez rapidement les données audio"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Échec de lecture de l'étiquette : données insuffisantes"
+
+msgid "track ID"
+msgstr "identifiant de piste"
+
+msgid "MusicBrainz track ID"
+msgstr "identifiant de piste MusicBrainz"
+
+msgid "artist ID"
+msgstr "identifiant d'artiste"
+
+msgid "MusicBrainz artist ID"
+msgstr "identifiant d'artiste MusicBrainz"
+
+msgid "album ID"
+msgstr "identifiant d'album"
+
+msgid "MusicBrainz album ID"
+msgstr "identifiant d'album MusicBrainz"
+
+msgid "album artist ID"
+msgstr "identifiant d'artiste de l'album"
+
+msgid "MusicBrainz album artist ID"
+msgstr "identifiant d'artiste de l'album MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "identifiant TRM de piste"
+
+msgid "MusicBrainz TRM ID"
+msgstr "identifiant TRM MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "vitesse d'obturation de la capture"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+"Vitesse d'obturation utilisée lors de la capture de l'image, en secondes"
+
+# http://www.blog-couleur.com/?Qu-est-ce-que-l-ouverture-en
+msgid "capturing focal ratio"
+msgstr "ouverture absolue de la capture"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Ouverture absolue (nombre f) utilisée lors de la capture de l'image"
+
+msgid "capturing focal length"
+msgstr "distance focale de la capture"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+"Distance focale de l'optique utilisée pour la capture de l'image, en mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "valeur du zoom numérique de la capture"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Valeur du zoom numérique utilisé lors de la capture de l'image"
+
+msgid "capturing iso speed"
+msgstr "sensibilité iso de la capture"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "La sensibilité ISO utilisée lors de la capture de l'image"
+
+msgid "capturing exposure program"
+msgstr "programme d'exposition de la capture"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Le programme d'exposition utilisé lors de la capture de l'image"
+
+msgid "capturing exposure mode"
+msgstr "mode d'exposition de la capture"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Le mode d'exposition utilisé lors de la capture de l'image"
+
+msgid "capturing exposure compensation"
+msgstr "compensation d'exposition de la capture"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "La compensation d'exposition utilisée lors de la capture de l'image"
+
+msgid "capturing scene capture type"
+msgstr "type de mode scène de la capture"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Le mode scène utilisé lors de la capture de l'image"
+
+msgid "capturing gain adjustment"
+msgstr "ajustement de gain de la capture"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "L'ajustement général de gain appliqué à une image"
+
+msgid "capturing white balance"
+msgstr "balance des blancs de la capture"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Le mode de balance des blancs défini lors de la capture d'une image"
+
+msgid "capturing contrast"
+msgstr "contraste de la capture"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+"La direction du traitement de contraste appliqué lors de la capture d'une "
+"image"
+
+msgid "capturing saturation"
+msgstr "saturation de la capture"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"La direction du traitement de saturation appliqué lors de la capture d'une "
+"image"
+
+msgid "capturing sharpness"
+msgstr "netteté de la capture"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+"La direction du traitement de netteté appliqué lors de la capture d'une image"
+
+msgid "capturing flash fired"
+msgstr "flash utilisé pour la capture"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Indique si le flash a été utilisé pour capturer une image"
+
+msgid "capturing flash mode"
+msgstr "mode de flash de la capture"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Le mode de flash sélectionné lors de la capture d'une image"
+
+msgid "capturing metering mode"
+msgstr "mode de msure de la capture"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Le mode de mesure utilisé lors de l'évaluation de l'exposition pour la "
+"capture d'une image"
+
+msgid "capturing source"
+msgstr "source de capture"
+
+msgid "The source or type of device used for the capture"
+msgstr "La source ou le type d'appareil utilisé pour la capture"
+
+msgid "image horizontal ppi"
+msgstr "ppp horizontal de l'image"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Densité de pixels horizontale annoncée par le média (image/vidéo), en points "
+"par pouce"
+
+msgid "image vertical ppi"
+msgstr "ppp vertical de l'image"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Densité de pixels verticale annoncée par le média (image/vidéo), en points "
+"par pouce"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Ce CD ne contient aucune piste audio"
+
+msgid "ID3 tag"
+msgstr "Étiquette ID3"
+
+msgid "APE tag"
+msgstr "Étiquette APE"
+
+msgid "ICY internet radio"
+msgstr "Radio Internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "ALAC (Apple Lossless Audio)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "FLAC (Free Lossless Audio Codec)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "TTA (Lossless True Audio)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV sans perte"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH sans perte"
+
+# http://fr.wikipedia.org/wiki/Run-length_encoding
+msgid "Run-length encoding"
+msgstr "Codage par plages"
+
+msgid "Sami subtitle format"
+msgstr "Format de sous-titres Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Format de sous-titres TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Format de sous-titres Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV non compressé"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Image niveaux de gris non compressée"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV non compressé"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "%2$s %1$d bits en palette non compressé"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "MPEG-4 DivX version %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV non compressé"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Audio PCM brut %d bits"
+
+msgid "Audio CD source"
+msgstr "Source CD audio"
+
+msgid "DVD source"
+msgstr "Source DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Source RTSP (Real Time Streaming Protocol)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Source protocole MMS (Microsoft Media Server)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Source protocole %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Depayloader RTP vidéo %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Depayloader RTP audio %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Depayloader RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Démultiplexeur %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Décodeur %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Payloader RTP vidéo %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Payloader RTP audio %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Payloader RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Multiplexeur %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Codeur %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Élément GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Élément source inconnu"
+
+msgid "Unknown sink element"
+msgstr "Élément d'entrée inconnu"
+
+msgid "Unknown element"
+msgstr "Élément inconnu"
+
+msgid "Unknown decoder element"
+msgstr "Élément décodeur inconnu"
+
+msgid "Unknown encoder element"
+msgstr "Élément codeur inconnu"
+
+msgid "Plugin or element of unknown type"
+msgstr "Greffon ou élément de type inconnu"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV planaire 4:2:0 non compressé"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YVU planaire 4:2:0 non compressé"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV empaqueté 4:2:2 non compressé"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV empaqueté 4:1:0 non compressé"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU empaqueté 4:1:0 non compressé"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV empaqueté 4:1:1 non compressé"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV empaqueté 4:4:4 non compressé"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV planaire 4:2:2 non compressé"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV planaire 4:1:1 non compressé"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Plan Y noir et blanc non compressé"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Audio PCM brut"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio brut virgule flottante %d bits"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio brut virgule flottante"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Impossible d'ouvrir le fichier vfs « %s » en écriture : %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Aucun nom de fichier indiqué"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Impossible de fermer le fichier vfs « %s »."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Erreur lors de l'écriture dans le fichier « %s »."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr ""
+#~ "URI de sous-titres « %s » non valide, les sous-titres sont désactivés."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Il n'est pas encore possible de lire les flux RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Impossible de créer un élément « decodebin »."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Seul un flux de sous-titres a été détecté. Soit vous essayez d'ouvrir un "
+#~ "fichier de sous-titres ou un autre type de fichier texte, soit le fichier "
+#~ "multimédia n'a pas été reconnu."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Aucun décodeur n'est installé pour gérer ce fichier. Vous devriez "
+#~ "probablement installer des greffons supplémentaires."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Ceci n'est pas un fichier multimédia"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Un flux de sous-titres a été détecté, mais pas de flux vidéo."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Les éléments autovideosink et xvimagesink sont tous deux manquants."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Les éléments autoaudiosink et alsasink sont tous deux manquants."
+
+#~ msgid "No device specified."
+#~ msgstr "Aucun périphérique indiqué."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Le périphérique « %s » n'existe pas."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Le périphérique « %s » est déjà en cours d'utilisation."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Impossible d'ouvrir le périphérique « %s » en lecture et écriture."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Erreur lors de l'envoi de données d'en-tête gdp vers « %s:%d »."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Erreur lors de l'envoi de données de charge utile gdp vers « %s:%d »."
diff --git a/po/gl.gmo b/po/gl.gmo
new file mode 100644
index 0000000..608d482
--- /dev/null
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
new file mode 100644
index 0000000..78b8656
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,620 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010 Fran Dieguez
+# This file is distributed under the same license as the gst-plugins-base package.
+# Fran Diéguez <frandieguez@ubuntu.com>, 2010, 2011.
+# Fran Dieguez <frandieguez@ubuntu.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-09-05 12:48+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
+"Language-Team: Galician <proxecto@trasno.net>\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"
+"X-Poedit-Language: galego\n"
+
+msgid "Master"
+msgstr "Mestre"
+
+msgid "Bass"
+msgstr "Graves"
+
+msgid "Treble"
+msgstr "Agudos"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizador"
+
+msgid "Line-in"
+msgstr "Liña de entrada"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Micrófono"
+
+msgid "PC Speaker"
+msgstr "Altofalante do PC"
+
+msgid "Playback"
+msgstr "Reproducir"
+
+msgid "Capture"
+msgstr "Capturar"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Non foi posíbel abrir o dispositivo para a reprodución en modo mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr ""
+"Non foi posíbel abrir o dispositivo para a reprodución en modo estéreo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Non foi posíbel abrir o dispositivo para reproducir no modo %d-canles."
+
+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 reproducir. Outro aplicativo "
+"está usado o dispositivo."
+
+msgid "Could not open audio device for playback."
+msgstr "Non foi posíbel abrir o dispositivo de son para reproducir."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Non foi posíbel abrir o dispositivo para gravar en modo mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Non foi posíbel abrir o dispositivo para gravar en modo estéreo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Non foi posíbel abrir o dispositivo para gravar en modo %d-canles."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Non foi posíbel abrir o dispositivo de son para gravar. Outro aplicativo "
+"está usando o dispositivo."
+
+msgid "Could not open audio device for recording."
+msgstr "Non foi posíbel abrir o dispositivo de son para gravar."
+
+msgid "Could not open CD device for reading."
+msgstr "Non foi posíbel abrir o dispositivo de CD para ler."
+
+msgid "Could not seek CD."
+msgstr "Non foi posíbel buscar no CD."
+
+msgid "Could not read CD."
+msgstr "Non foi posíbel ler o CD."
+
+msgid "Internal data stream error."
+msgstr "Produciuse un erro no fluxo de datos internos."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Precísase un engadido %s que non está instalado para reproducir este fluxo."
+
+msgid "Could not determine type of stream"
+msgstr "Non foi posíbel determinar o tipo de fluxo."
+
+msgid "This appears to be a text file"
+msgstr "Isto parece ser un ficheiro de texto"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Falta o elemento «%s» - comprobe a instalación do GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Faltan os elementos autivideosink e %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Falta o elemento autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "O videosink configurado %s non está funcionando."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Os elementos autovideosink e %s non están funcionando."
+
+msgid "The autovideosink element is not working."
+msgstr "O elemento autovideosink non está funcionando."
+
+msgid "Custom text sink element is not usable."
+msgstr "Non é posíbel usar o elemento sumideiro (sink) de texto personaizado."
+
+msgid "No volume control found"
+msgstr "Non foi posíbel encontrar o control do volume"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Faltan os elementos autoaudiosink e %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Falta o elemento autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "O audiosink configurado %s non está funcionando"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Os elementos autoaudiosink e %s non están funcionando."
+
+msgid "The autoaudiosink element is not working."
+msgstr "O elemento autoaudiosink non está funcionando."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Non é posíbel reproducir un ficheiro de texto sen vídeo nin visualizacións."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Non hai dispoñíbel ningún decodificador para o tipo «%s»."
+
+msgid "No URI specified to play from."
+msgstr "Non se especificou un URI para reproducir."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "O URI «%s» é incorrecto."
+
+msgid "This stream type cannot be played yet."
+msgstr "Aínda non é posíbel reproducir este tipo de fluxo."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Non hai implementado un manexador de URIs para «%s»."
+
+msgid "Source element is invalid."
+msgstr "O elemento fonte é incorrecto."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Produciuse un erro mentres se enviaban datos a \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Rexeitouse a conexión a %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "Non é posíbel gravar o son cunha velocidade suficiente"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Produciuse un fallo ao ler a etiqueta: non hai datos suficientes"
+
+msgid "track ID"
+msgstr "ID da pista"
+
+msgid "MusicBrainz track ID"
+msgstr "ID da pista en MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID do artista"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID do artista en MusicBrainz"
+
+msgid "album ID"
+msgstr "ID do álbum"
+
+msgid "MusicBrainz album ID"
+msgstr "ID do álbum en MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID do álbum do artista"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID do álbum do artista en MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID TRM da pista"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM en MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "velocidade do obturador da toma"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Velocidade do obturador usada ao tomar unha imaxe, en segundos"
+
+msgid "capturing focal ratio"
+msgstr "taxa focal da toma"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Taxa focal (número-f) usada ao tomar a imaxe"
+
+msgid "capturing focal length"
+msgstr "lonxitude focal da toma"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Lonxitude focal da lente usada ao tomar a imaxe, en mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "taxa de ampliación dixital da toma"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Taxa de ampliación dixital usada ao tomar unha imaxe"
+
+msgid "capturing iso speed"
+msgstr "velocidade ISO da toma"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "A velocidade de captura ISO usada ao tomar unha imaxe"
+
+msgid "capturing exposure program"
+msgstr "programa de exposición da toma"
+
+msgid "The exposure program used when capturing an image"
+msgstr "O programa de exposición usado ao tomar unha imaxe"
+
+msgid "capturing exposure mode"
+msgstr "modo de exposición da toma"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "O modo de exposición usado ao tomar unha imaxe"
+
+msgid "capturing exposure compensation"
+msgstr "capturando a compensación de exposición"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "A compensación de exposición usada ao capturar unha imaxe"
+
+msgid "capturing scene capture type"
+msgstr "tipo de escena usado na toma"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "O modo de captura usado ao tomar unha imaxe"
+
+msgid "capturing gain adjustment"
+msgstr "axuste de ganancia da toma"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "O axuste xeral de ganancia aplicado nunha imaxe"
+
+msgid "capturing white balance"
+msgstr "balance de brancos da toma"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "O modo de balance de brancos usado ao tomar unha imaxe"
+
+msgid "capturing contrast"
+msgstr "contraste da toma"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "A dirección de contraste procesada aplicada ao tomar unha imaxe"
+
+msgid "capturing saturation"
+msgstr "saturación da toma"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "A dirección de saturación procesada aplicada ao tomar unha imaxe"
+
+msgid "capturing sharpness"
+msgstr "nitidez da toma"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "A dirección de nitidez procesada aplicada ao tomar unha imaxe"
+
+msgid "capturing flash fired"
+msgstr "disparo de flash da toma"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Se o flash se disparou ao capturar unha imaxe"
+
+msgid "capturing flash mode"
+msgstr "modo de flash da toma"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "O modo de flash seleccionado ao tomar unha imaxe"
+
+msgid "capturing metering mode"
+msgstr "modo de medición da toma"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"O modo de medición usado ao determinar a exposición ao tomar unha imaxe"
+
+msgid "capturing source"
+msgstr "orixe da toma"
+
+msgid "The source or type of device used for the capture"
+msgstr "A orixe ou tipo de dispositivo usado para a toma"
+
+msgid "image horizontal ppi"
+msgstr "ppi horizontal da imaxe"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Densidade horizontal de píxeles, en ppi, do medio (imaxe ou vídeo)"
+
+msgid "image vertical ppi"
+msgstr "ppi vertical da imaxe"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Densidade vertical de píxeles, en ppi, do medio (imaxe ou vídeo)"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Este CD non contén pistas de son"
+
+msgid "ID3 tag"
+msgstr "Etiqueta ID3"
+
+msgid "APE tag"
+msgstr "Etiqueta APE"
+
+msgid "ICY internet radio"
+msgstr "Emisora de internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH sen perda"
+
+msgid "Run-length encoding"
+msgstr "Codificación do tamaño durante a execución"
+
+msgid "Sami subtitle format"
+msgstr "Formato de subtítulos Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Formato de subtítulos TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Formato de subtítulos Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV sen comprimir"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Imaxe en escala de grises sen comprimir"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV sen comprimir"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Paletizado sen comprimir de %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Versión %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV sen comprimir"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Audio PCM sen comprimir de %d-bits"
+
+msgid "Audio CD source"
+msgstr "Fonte: CD de son"
+
+msgid "DVD source"
+msgstr "Fonte: DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Fonte: Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Fonte: protocolo Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Fonte: Protocolo %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "decodificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "decodificador de son RTP %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "decodificador RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "demultiplexor %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "decodificador %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "codificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "codificador de son RTP %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "codificador RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "multiplexor %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "codificador %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Elemento %s do GStreamer"
+
+msgid "Unknown source element"
+msgstr "Fonte: Elemento descoñecido"
+
+msgid "Unknown sink element"
+msgstr "Elemento sumideiro (sink) descoñecido"
+
+msgid "Unknown element"
+msgstr "Elemento descoñecido"
+
+msgid "Unknown decoder element"
+msgstr "O elemento decodificador é descoñecido"
+
+msgid "Unknown encoder element"
+msgstr "O elemento codificador é descoñecido"
+
+msgid "Plugin or element of unknown type"
+msgstr "Engadido ou elemento de tipo descoñecido"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Non foi posíbel abrir o ficheiro vfs «%s» para escribir: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Non se forneceu un nome de ficheiro"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Non foi posíbel pechar o ficheiro vfs «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Produciuse un erro ao escribir no ficheiro «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr ""
+#~ "O URI dos subtítulos «%s» é incorrecto, desactiváronse os subtítulos."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Aínda non é posíbel reproducir os fluxos RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Non foi posíbel crear o elemento \"decodebin\" ."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Só se detectou un fluxo de subtítulos. Ou ben está cargando un ficheiro "
+#~ "de subtítulos ou calquera outro ficheiro de texto ou quizais o ficheiro "
+#~ "multimedia non foi recoñecido."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Non ten instalado un decodificador para manexar este ficheiro. É posíbel "
+#~ "que precise instalar os engadidos necesarios. "
+
+#~ msgid "This is not a media file"
+#~ msgstr "Este non é un ficheiro multimedia"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Detectouse un fluxo de subtítulos pero non de vídeo."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Faltan os elementos autovideosink e xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Faltan os elementos autoaudiosink e alsasink."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr ""
+#~ "Produciuse un erro ao enviar os datos da cabeceira gdp a \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Produciuse un erro ao enviar a carga de datos de gdp a «%s:%d»."
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 plano sen comprimir"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YUV 4:2:0 plano sen comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 empaquetado sen comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 empaquetado sen comprimir"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YUV 4:1:0 empaquetado sen comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 empaquetado sen comprimir"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 empaquetado sen comprimir"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 plano sen comprimir"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 plano sen comprimir"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Plano Y en branco e negro sen comprimir"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Audio PCM sen comprimir"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio sen comprimir de %d-bits en coma flotante"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio sen comprimir en coma flotante"
+
+#~ msgid "No device specified."
+#~ msgstr "Non se especificou un dispositivo."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "O dispositivo «%s» non existe."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "O dispositivo «%s» xa está en uso."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr ""
+#~ "Non foi posíbel abrir o dispositivo «%s» para a súa lectura e escritura."
diff --git a/po/gst-plugins-base-0.11.pot b/po/gst-plugins-base-0.11.pot
new file mode 100644
index 0000000..f914a7e
--- /dev/null
+++ b/po/gst-plugins-base-0.11.pot
@@ -0,0 +1,657 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.11.1\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ext/alsa/gstalsamixertrack.c:144
+msgid "Master"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:145
+msgid "Bass"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:146
+msgid "Treble"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:147
+msgid "PCM"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:148
+msgid "Synth"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:149
+msgid "Line-in"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:150
+msgid "CD"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:151
+msgid "Microphone"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:152
+msgid "PC Speaker"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:153
+msgid "Playback"
+msgstr ""
+
+#: ext/alsa/gstalsamixertrack.c:154 ext/alsa/gstalsamixertrack.c:221
+#: ext/alsa/gstalsamixertrack.c:224
+msgid "Capture"
+msgstr ""
+
+#: ext/alsa/gstalsasink.c:464
+msgid "Could not open device for playback in mono mode."
+msgstr ""
+
+#: ext/alsa/gstalsasink.c:466
+msgid "Could not open device for playback in stereo mode."
+msgstr ""
+
+#: ext/alsa/gstalsasink.c:470
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+
+#: ext/alsa/gstalsasink.c:743
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+
+#: ext/alsa/gstalsasink.c:748
+msgid "Could not open audio device for playback."
+msgstr ""
+
+#: ext/alsa/gstalsasrc.c:488
+msgid "Could not open device for recording in mono mode."
+msgstr ""
+
+#: ext/alsa/gstalsasrc.c:490
+msgid "Could not open device for recording in stereo mode."
+msgstr ""
+
+#: ext/alsa/gstalsasrc.c:494
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr ""
+
+#: ext/alsa/gstalsasrc.c:774
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+
+#: ext/alsa/gstalsasrc.c:779
+msgid "Could not open audio device for recording."
+msgstr ""
+
+#: ext/cdparanoia/gstcdparanoiasrc.c:278 ext/cdparanoia/gstcdparanoiasrc.c:284
+msgid "Could not open CD device for reading."
+msgstr ""
+
+#: ext/cdparanoia/gstcdparanoiasrc.c:410
+msgid "Could not seek CD."
+msgstr ""
+
+#: ext/cdparanoia/gstcdparanoiasrc.c:418
+msgid "Could not read CD."
+msgstr ""
+
+#: ext/ogg/gstoggdemux.c:4279
+msgid "Internal data stream error."
+msgstr ""
+
+#: gst/playback/gstdecodebin2.c:1642
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#: gst/playback/gstdecodebin2.c:1649
+msgid "Could not determine type of stream"
+msgstr ""
+
+#: gst/playback/gstdecodebin2.c:2224
+msgid "This appears to be a text file"
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1140 gst/playback/gstplaysink.c:1153
+#: gst/playback/gstplaysink.c:1284 gst/playback/gstplaysink.c:1464
+#: gst/playback/gstplaysink.c:1513 gst/playback/gstplaysink.c:1528
+#: gst/playback/gstplaysink.c:1553 gst/playback/gstplaysink.c:1577
+#: gst/playback/gstplaysink.c:1697 gst/playback/gstplaysink.c:2051
+#: gst/playback/gstplaysink.c:2060 gst/playback/gstplaysink.c:2069
+#: gst/playback/gstplaysink.c:2078 gst/playback/gstplaysink.c:3088
+#: gst/playback/gsturidecodebin.c:1342
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1333
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1337
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1342
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1346
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1350
+msgid "The autovideosink element is not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1501
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1814
+msgid "No volume control found"
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1834
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1838
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1843
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1847
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:1851
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+#: gst/playback/gstplaysink.c:2154 gst/playback/gstplaysink.c:2159
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:869
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:1255
+msgid "No URI specified to play from."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:1261
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:1267
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:1284
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+#: gst/playback/gsturidecodebin.c:2093
+msgid "Source element is invalid."
+msgstr ""
+
+#: gst/tcp/gsttcpclientsink.c:187
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr ""
+
+#: gst/tcp/gsttcpclientsink.c:293 gst/tcp/gsttcpclientsrc.c:330
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+#: gst-libs/gst/audio/gstbaseaudiosrc.c:827
+msgid "Can't record audio fast enough"
+msgstr ""
+
+#: gst-libs/gst/tag/gsttagdemux.c:1086
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:79
+msgid "track ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:79
+msgid "MusicBrainz track ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:81
+msgid "artist ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:81
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:83
+msgid "album ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:83
+msgid "MusicBrainz album ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:86
+msgid "album artist ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:86
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:88
+msgid "track TRM ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:88
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:110
+msgid "capturing shutter speed"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:111
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:114
+msgid "capturing focal ratio"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:115
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:118
+msgid "capturing focal length"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:119
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:122
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:123
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:126
+msgid "capturing iso speed"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:127
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:130
+msgid "capturing exposure program"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:131
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:134
+msgid "capturing exposure mode"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:135
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:138
+msgid "capturing exposure compensation"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:139
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:142
+msgid "capturing scene capture type"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:143
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:146
+msgid "capturing gain adjustment"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:147
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:150
+msgid "capturing white balance"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:151
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:154
+msgid "capturing contrast"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:155
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:159
+msgid "capturing saturation"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:160
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:164
+msgid "capturing sharpness"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:165
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:169
+msgid "capturing flash fired"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:170
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:173
+msgid "capturing flash mode"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:174
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:177
+msgid "capturing metering mode"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:178
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:182
+msgid "capturing source"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:183
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:186
+msgid "image horizontal ppi"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:187
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:190
+msgid "image vertical ppi"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:191
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:194
+msgid "ID3v2 frame"
+msgstr ""
+
+#: gst-libs/gst/tag/tags.c:194
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+#: gst-libs/gst/cdda/gstcddabasesrc.c:1447
+#: gst-libs/gst/cdda/gstcddabasesrc.c:1480
+msgid "This CD has no audio tracks"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:73
+msgid "ID3 tag"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:74
+#: gst-libs/gst/pbutils/descriptions.c:75
+msgid "APE tag"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:76
+msgid "ICY internet radio"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:105
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:115
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:141
+#: gst-libs/gst/pbutils/descriptions.c:142
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:150
+msgid "Windows Media Speech"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:165
+msgid "CYUV Lossless"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:170
+msgid "FFMpeg v1"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:184
+msgid "Lossless MSZH"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:194
+msgid "Run-length encoding"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:240
+msgid "Sami subtitle format"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:241
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:243
+msgid "Kate subtitle format"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:307
+#: gst-libs/gst/pbutils/descriptions.c:350
+msgid "Uncompressed video"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:312
+msgid "Uncompressed gray"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:338
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:347
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:400
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:621
+msgid "Uncompressed audio"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:627
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:714
+msgid "Audio CD source"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:717
+msgid "DVD source"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:720
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:724
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:732
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:804
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:806
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:808
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:815
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:817
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:855
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:857
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:859
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:866
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:868
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#: gst-libs/gst/pbutils/descriptions.c:900
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:559
+msgid "Unknown source element"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:562
+msgid "Unknown sink element"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:565
+msgid "Unknown element"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:568
+msgid "Unknown decoder element"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:571
+msgid "Unknown encoder element"
+msgstr ""
+
+#: gst-libs/gst/pbutils/missing-plugins.c:576
+msgid "Plugin or element of unknown type"
+msgstr ""
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644
index 0000000..ebb05d8
--- /dev/null
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..90ad6aa
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,617 @@
+# Hungarian translation of gst-plugins-base
+# This file is distributed under the same license as the gst-plugins-base package.
+# Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+#
+# Laszlo Dvornik <dvornik@invitel.hu>, 2004.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2006, 2007, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-11-03 02:48+0100\n"
+"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
+"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\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-03-10 00:18+0000\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Master"
+msgstr "Fő hangerő"
+
+msgid "Bass"
+msgstr "Basszus"
+
+msgid "Treble"
+msgstr "Magas"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Szintet."
+
+msgid "Line-in"
+msgstr "Vonalbemenet"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC hangszóró"
+
+msgid "Playback"
+msgstr "Lejátszás"
+
+msgid "Capture"
+msgstr "Felvétel"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nem lehet lejátszásra megnyitni az eszközt mono módban."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nem lehet lejátszásra megnyitni az eszközt sztereó módban."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Nem lehet lejátszásra megnyitni az eszközt %d csatornás módban."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Nem lehet lejátszásra megnyitni a hangeszközt. Az eszközt másik alkalmazás "
+"használja."
+
+msgid "Could not open audio device for playback."
+msgstr "Nem lehet lejátszásra megnyitni a hangeszközt."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nem lehet felvételre megnyitni az eszközt mono módban."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Nem lehet felvételre megnyitni az eszközt sztereó módban."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Az eszköz nem nyitható meg felvételre %d csatornás módban."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nem lehet felvételre megnyitni a hangeszközt. Az eszközt másik alkalmazás "
+"használja."
+
+msgid "Could not open audio device for recording."
+msgstr "Nem lehet felvételre megnyitni a hangeszközt."
+
+msgid "Could not open CD device for reading."
+msgstr "Nem lehet olvasásra megnyitni a CD-eszközt."
+
+msgid "Could not seek CD."
+msgstr "Nem kereshető a CD."
+
+msgid "Could not read CD."
+msgstr "Nem olvasható a CD."
+
+msgid "Internal data stream error."
+msgstr "Belső adatfolyam-hiba."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Az adatfolyam lejátszásához egy %s bővítmény szükséges, de az nincs "
+"telepítve."
+
+msgid "Could not determine type of stream"
+msgstr "Nem határozható meg az adatfolyam típusa"
+
+msgid "This appears to be a text file"
+msgstr "Ez egy szövegfájlnak tűnik"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "A(z) „%s” elem hiányzik - ellenőrizze a Gstreamer telepítését."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Az autovideosink és a(z) %s elem is hiányzik."
+
+msgid "The autovideosink element is missing."
+msgstr "Az autovideosink elem hiányzik."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "A beállított %s videosink elem nem működik."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Sem az autovideosink, sem a(z) %s elem nem működik."
+
+msgid "The autovideosink element is not working."
+msgstr "Az autovideosink elem nem működik."
+
+msgid "Custom text sink element is not usable."
+msgstr "Az egyéni szövegnyelő elem nem használható."
+
+msgid "No volume control found"
+msgstr "Nem található hangerőszabályzó"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Az autoaudiosink és a(z) %s elem is hiányzik."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Az autoaudiosink elem hiányzik."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "A beállított %s audiosink elem nem működik."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Sem az autoaudiosink, sem a(z) %s elem nem működik."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Az autoaudiosink elem nem működik."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "A szövegfájl nem játszható le videó vagy vizualizációk nélkül."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Nem érhető el dekódoló a(z) „%s” típushoz."
+
+msgid "No URI specified to play from."
+msgstr "Nincs megadva URI a lejátszáshoz."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Érvénytelen URI: „%s”."
+
+msgid "This stream type cannot be played yet."
+msgstr "Ez az adatfolyamtípus még nem játszható le."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nincs URI kezelő megvalósítva a következőhöz: „%s”."
+
+msgid "Source element is invalid."
+msgstr "A forráselem érvénytelen."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Hiba adatok küldése során a következőnek: „%s:%d”."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "A kapcsolat visszautasítva a következőhöz: %s:%d."
+
+msgid "Can't record audio fast enough"
+msgstr "Nem lehet elég gyorsan rögzíteni a hangot"
+
+msgid "Failed to read tag: not enough data"
+msgstr "A címke nem olvasható: nincs elég adat"
+
+msgid "track ID"
+msgstr "számazonosító"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz számazonosító"
+
+msgid "artist ID"
+msgstr "előadó-azonosító"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz előadó-azonosító"
+
+msgid "album ID"
+msgstr "Albumazonosító"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz albumazonosító"
+
+msgid "album artist ID"
+msgstr "Albumelőadó azonosítója"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albumelőadó azonosítója"
+
+msgid "track TRM ID"
+msgstr "szám TRM azonosítója"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz szám TRM azonosítója"
+
+msgid "capturing shutter speed"
+msgstr "felvétel zársebessége"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Kép felvételéhez használt zársebesség másodpercben"
+
+msgid "capturing focal ratio"
+msgstr "felvétel fókuszaránya"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "A kép felvételéhez használt fókuszarány (f-szám)"
+
+msgid "capturing focal length"
+msgstr "felvétel fókusztávolsága"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "A kép felvételéhez használt lencse fókusztávolsága mm-ben"
+
+msgid "capturing digital zoom ratio"
+msgstr "felvétel digitális nagyítási aránya"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "A kép felvételéhez használt digitális nagyítási arány"
+
+msgid "capturing iso speed"
+msgstr "felvétel ISO sebessége"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "A kép felvételéhez használt ISO sebesség"
+
+msgid "capturing exposure program"
+msgstr "felvétel expozíciós programja"
+
+msgid "The exposure program used when capturing an image"
+msgstr "A kép felvételéhez használt expozíciós program"
+
+msgid "capturing exposure mode"
+msgstr "felvétel expozíciós módja"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "A kép felvételéhez használt expozíciós mód"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "felvétel expozíciós módja"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "A kép felvételéhez használt expozíciós mód"
+
+msgid "capturing scene capture type"
+msgstr "felvétel helyszínfelvételi módja"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "A kép felvételéhez használt helyszínfelvételi mód"
+
+msgid "capturing gain adjustment"
+msgstr "felvétel erősítésmódosítása"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "A képre alkalmazott általános erősítésmódosítás"
+
+msgid "capturing white balance"
+msgstr "felvétel fehéregyensúlya"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "A kép felvételéhez használt fehéregyensúlymód"
+
+msgid "capturing contrast"
+msgstr "felvétel kontrasztja"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "A kép felvételekor használt kontrasztfeldolgozás iránya"
+
+msgid "capturing saturation"
+msgstr "felvétel telítettsége"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "A kép felvételekor alkalmazott telítettségfeldolgozás iránya"
+
+msgid "capturing sharpness"
+msgstr "felvétel élessége"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "A kép felvételekor alkalmazott élességfeldolgozás iránya"
+
+msgid "capturing flash fired"
+msgstr "felvétel vakuja"
+
+msgid "If the flash fired while capturing an image"
+msgstr "A kép felvételéhez használt vaku"
+
+msgid "capturing flash mode"
+msgstr "felvétel vakumódja"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "A kép felvételéhez használt kijelölt vakumód"
+
+msgid "capturing metering mode"
+msgstr "felvétel mérési módja"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "A kép felvételekor az expozíció meghatározásához használt mérési mód"
+
+msgid "capturing source"
+msgstr "felvétel forrása"
+
+msgid "The source or type of device used for the capture"
+msgstr "A felvételhez használt forrás vagy eszköz típusa"
+
+msgid "image horizontal ppi"
+msgstr "kép vízszintes ppi"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "A média (kép/videó) tervezett vízszintes képpontsűrűsége ppi-ben"
+
+msgid "image vertical ppi"
+msgstr "kép függőleges ppi"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "A média (kép/videó) tervezett függőleges képpontsűrűsége ppi-ben"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Ez a CD nem rendelkezik hangsávokkal"
+
+msgid "ID3 tag"
+msgstr "ID3 címke"
+
+msgid "APE tag"
+msgstr "APE címke"
+
+msgid "ICY internet radio"
+msgstr "ICY internetrádió"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple veszteségmentes hang (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Szabad veszteségmentes hangkodek (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Veszteségmentes valódi hang (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media beszéd"
+
+msgid "CYUV Lossless"
+msgstr "CYUV veszteségmentes"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Veszteségmentes MSZH"
+
+msgid "Run-length encoding"
+msgstr "Műsorhossz-kódolás"
+
+msgid "Sami subtitle format"
+msgstr "Sami feliratformátum"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer feliratformátum"
+
+msgid "Kate subtitle format"
+msgstr "Kate feliratformátum"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Tömörítetlen YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Tömörítetlen szürke kép"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Tömörítetlen YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Tömörítetlen, palettás %d bites %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 %d. verzió"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Tömörítetlen YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Nyers %d bites PCM hang"
+
+msgid "Audio CD source"
+msgstr "Hang CD forrás"
+
+msgid "DVD source"
+msgstr "DVD forrás"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Valósidejű adatfolyam-protokoll (RTSP) forrás"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) protokollforrás"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokollforrás"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s videó RTP dekódoló"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s hang RTP dekódoló"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP dekódoló"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s szétválasztó"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s dekódoló"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s videó RTP kódoló"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s hang RTP kódoló"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP kódoló"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s egyesítő"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s kódoló"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer elem: %s"
+
+msgid "Unknown source element"
+msgstr "Ismeretlen forráselem"
+
+msgid "Unknown sink element"
+msgstr "Ismeretlen nyelőelem"
+
+msgid "Unknown element"
+msgstr "Ismeretlen elem"
+
+msgid "Unknown decoder element"
+msgstr "Ismeretlen dekódolóelem"
+
+msgid "Unknown encoder element"
+msgstr "Ismeretlen kódolóelem"
+
+msgid "Plugin or element of unknown type"
+msgstr "Ismeretlen típusú bővítmény vagy elem"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Tömörítetlen síkbeli YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Tömörítetlen síkbeli YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Tömörítetlen pakolt YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Tömörítetlen pakolt YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Tömörítetlen pakolt YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Tömörítetlen pakolt YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Tömörítetlen pakolt YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Tömörítetlen síkbeli YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Tömörítetlen síkbeli YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Tömörítetlen fekete-fehér Y-sík"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Nyers PCM hang"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Nyers %d bites lebegőpontos hang"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Nyers lebegőpontos hang"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nem lehet írásra megnyitni a(z) „%s” vfs-fájlt: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nincs fájlnév megadva"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nem lehet bezárni a(z) „%s” vfs-fájlt."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Hiba a(z) „%s” fájl írása közben."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Érvénytelen felirat URI: „%s”, a feliratok letiltva."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Az RTSP adatfolyamok még nem játszhatók le."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nem hozható létre „decodebin” elem"
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Csak egy feliratfolyam észlelhető. Vagy egy feliratfájlt vagy más "
+#~ "szövegfájlt tölt be, vagy a médiafájl nem ismerhető fel."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Nincs telepítve a fájl kezeléséhez szükséges dekódoló. Lehetséges, hogy "
+#~ "telepítenie kell a szükséges bővítményeket."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Ez nem egy médiafájl"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Egy feliratfolyam felismerve, de nincs videofolyam."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Mind az autovideosink, mind az xvimagesink elemek hiányoznak."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Az autoaudiosink és az alsasink elem is hiányzik."
+
+#~ msgid "No device specified."
+#~ msgstr "Nincs megadva eszköz."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Az eszköz („%s”) nem létezik."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Az eszköz („%s”) már használatban van."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nem lehet olvasásra és írásra megnyitni az eszközt („%s”)."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Hiba a gdp fejlécadatok küldésekor a következőnek: „%s:%d”."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Hiba a gdp küldeményadatok elküldésekor a következőnek: „%s:%d”."
diff --git a/po/id.gmo b/po/id.gmo
new file mode 100644
index 0000000..4c6778f
--- /dev/null
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..be978e9
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,635 @@
+# Indonesian translations for gst-plugins-base package.
+# This file is put in the public domain.
+# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.28.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-04-26 22:01+0700\n"
+"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Utama"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Treble"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Jalur masuk"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "Pengeras Suara PC"
+
+msgid "Playback"
+msgstr "Putar kembali"
+
+msgid "Capture"
+msgstr "Tangkap"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Tak dapat membuka divais untuk putar kembali dalam mode mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Tak dapat membuka divais untuk putar kembali dalam mode stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Tak dapat membuka divais untuk putar kembali dalam mode %d-kanal."
+
+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."
+msgstr "Tak dapat membuka divais audio untuk putar kembali."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Tak dapat membuka divais untuk merekam dalam mode mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Tak dapat membuka divais untuk merekam dalam mode stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Tak dapat membuka divais untuk merekam dalam mode %d-kanal"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Tak dapat membuka divais audio untuk merekam. Divais sedang digunakan oleh "
+"aplikasi lain."
+
+msgid "Could not open audio device for recording."
+msgstr "Tak dapat membuka divais audio untuk merekam."
+
+msgid "Could not open CD device for reading."
+msgstr "Tak dapat membuka divais CD untuk dibaca."
+
+msgid "Could not seek CD."
+msgstr "Tak dapat mencari CD."
+
+msgid "Could not read CD."
+msgstr "Tak dapat membaca CD."
+
+msgid "Internal data stream error."
+msgstr "Galat arus data internal."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Plugin %s dibutuhkan untuk memutar arus ini, tapi tidak diinstal."
+
+msgid "Could not determine type of stream"
+msgstr "Tak dapat menentukan tipe arus"
+
+msgid "This appears to be a text file"
+msgstr "Ini kelihatannya merupakan berkas teks"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Elemen '%s' hilang - cek instalasi GStreamer anda."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Baik elemen autovideosink maupun %s hilang."
+
+msgid "The autovideosink element is missing."
+msgstr "Elemen autovideosink hilang."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Videosink yang dikonfigurasi %s tidak bekerja."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Baik elemen autovideosink maupun %s tidak bekerja."
+
+msgid "The autovideosink element is not working."
+msgstr "Elemen autovideosink tidak bekerja."
+
+msgid "Custom text sink element is not usable."
+msgstr "Elemen teks tenggelam suai tak dapat digunakan."
+
+msgid "No volume control found"
+msgstr "Tak ada kontrol volume yang ditemukan"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Baik elemen autoaudiosink maupun %s hilang."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Elemen autoaudiosink hilang."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Audiosink yang dikonfigurasi %s tidak bekerja."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Baik elemen autoaudiosink maupun %s tidak bekerja."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Elemen autoaudiosink tidak bekerja."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Tak dapat memutar berkas teks tanpa video atau visualisasi."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Tak ada pengawasandi yang tersedia untuk tipe '%s'."
+
+msgid "No URI specified to play from."
+msgstr "Tak ada URI yang ditentukan untuk diputar."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "URI \"%s\" tidak sah."
+
+msgid "This stream type cannot be played yet."
+msgstr "Tipe arus ini belum dapat dimainkan."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Tak ada penanganan URI yang diimplementasikan untuk \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Elemen sumber tidak sah."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Galat ketika mengirim data ke \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Koneksi ke %s:%d ditolak."
+
+msgid "Can't record audio fast enough"
+msgstr "Tak dapat merekam audio cukup cepat"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Gagal membaca tanda: tak cukup data"
+
+msgid "track ID"
+msgstr "ID jalur"
+
+msgid "MusicBrainz track ID"
+msgstr "ID jalur MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID artis"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID artis MusicBrainz"
+
+msgid "album ID"
+msgstr "ID album"
+
+msgid "MusicBrainz album ID"
+msgstr "ID album MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID artis album"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID artis album MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID TRM jalur"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "CD ini tidak memiliki jalur audio"
+
+msgid "ID3 tag"
+msgstr "Tag ID3"
+
+msgid "APE tag"
+msgstr "Tag APE"
+
+msgid "ICY internet radio"
+msgstr "Radio internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "Penyandian sepanjang-jalan"
+
+msgid "Sami subtitle format"
+msgstr "Format subjudul Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Format subjudul TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Format subjudul Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV tak dikompresi"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Citra Abu-abu Tak Dikompres"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV tak dikompresi"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Terpalet dan tak dikompresi dari %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Versi %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV tak dikompresi"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Audio PCM %d-bita mentah"
+
+msgid "Audio CD source"
+msgstr "Sumber CD audio"
+
+msgid "DVD source"
+msgstr "Sumber DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Sumber Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Sumber protokol Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s sumber protokol"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video RTP depayloader"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audio RTP depayloader"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP depayloader"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s pengawasandi"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video RTP payloader"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audio RTP payloader"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s muxer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s penyandi"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Elemen GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Elemen sumber tak diketahui"
+
+msgid "Unknown sink element"
+msgstr "Elemen tenggelam tak diketahui"
+
+msgid "Unknown element"
+msgstr "Elemen tak diketahui"
+
+msgid "Unknown decoder element"
+msgstr "Elemen pengawasandi tak diketahui"
+
+msgid "Unknown encoder element"
+msgstr "Elemen penyandi tak diketahui"
+
+msgid "Plugin or element of unknown type"
+msgstr "Plugin atau elemen dari tipe yang tak diketahui"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Tak dapat membuka berkas vfs \"%s\" untuk ditulis: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Tak ada nama berkas yang diberikan"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Tak dapat menutup berkas vfs \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Galat ketika menulis ke berkas \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "URI subjudul \"%s\" tidak sah, subjudul dinonaktifkan."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Arus RTSP belum dapat dimainkan."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Tak dapat membuat elemen \"decodebin\""
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Hanya arus subjudul yang terdeteksi. Mungkin anda memuat berkas subjudul "
+#~ "atau tipe lain dari berkas teks, atau berkas media yang tidak dikenal."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Anda tidak memiliki pengawasandi terinstal untuk menangani berkas ini. "
+#~ "Anda mungkin harus menginstal plugin yang diperlukan."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Ini bukan berkas media"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Arus subjudul terdeteksi, tapi bukan arus video."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Baik elemen autovideosink maupun xvimagesink hilang."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Baik elemen autoaudiosink maupun alsasink hilang."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Galat ketika mengirim data tajuk gdp ke \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Galat ketika mengirim data pemuat gdp ke \"%s:%d\"."
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 planar tak dikompresi"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YVU 4:2:0 planar tak dikompresi"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 terkemas tak dikompresi"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 terkemas tak dikompresi"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU 4:1:0 terkemas tak dikompresi"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 terkemas tak dikompresi"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 terkemas tak dikompresi"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 planar tak dikompresi"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 planar tak dikompresi"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Y-plane hitam dan putih tak dikompresi"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Audio PCM mentah"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio titik-apung %d-bita mentah"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio titik-apung mentah"
+
+#~ msgid "No device specified."
+#~ msgstr "Tak ada divais yang ditentukan."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Divais \"%s\" tak ada."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Divais \"%s\" telah digunakan."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Tak dapat membuka divaus \"%s\" untuk dibaca dan ditulis."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Tak dapat menampilkan baik teks subjudul dan subgambar."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Tak ada direktori Temp yang ditentukan."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Tak dapat membuat berkas temp \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Tak dapat membuka berkas \"%s\" untuk dibaca."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Galat arus data internal."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Tak dapat membuat elemen \"decodebin2\"."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Tak dapat membuat elemen \"queue2\"."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Tak dapat membuat elemen \"typefind\"."
+
+#~ msgid "No file name specified."
+#~ msgstr "Tak ada nama berkas yang ditentukan."
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 0000000..17a0fac
--- /dev/null
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..0f195fd
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,638 @@
+# Italian translation for gst-plugins-base package of GStreamer project.
+# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 GStreamer team
+# This file is distributed under the same license as the gst-plugins-base package.
+# Luca Ferretti <elle.uca@infinito.it>, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.28.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-04-28 14:27+0200\n"
+"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Principale"
+
+msgid "Bass"
+msgstr "Bassi"
+
+msgid "Treble"
+msgstr "Acuti"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetiz"
+
+msgid "Line-in"
+msgstr "Linea in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Microfono"
+
+msgid "PC Speaker"
+msgstr "Altoparlanti PC"
+
+msgid "Playback"
+msgstr "Riproduzione"
+
+msgid "Capture"
+msgstr "Cattura"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Impossibile aprire il device per la riproduzione in modalità mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Impossibile aprire il device per la riproduzione in modalità stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+"Impossibile aprire il device per la riproduzione in modalità %d-canali."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Impossibile aprire il device audio per la riproduzione. Il device è "
+"utilizzato da un'altra applicazione."
+
+msgid "Could not open audio device for playback."
+msgstr "Impossibile aprire il device audio per la riproduzione."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Impossibile aprire il device per la registrazione in modalità mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Impossibile aprire il device per la registrazione in modalità stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr ""
+"Impossibile aprire il device per la registrazione in modalità %d-canali."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Impossibile aprire il device audio per la registrazione. Il device è "
+"utilizzato da un'altra applicazione."
+
+msgid "Could not open audio device for recording."
+msgstr "Impossibile aprire il device audio per la registrazione."
+
+msgid "Could not open CD device for reading."
+msgstr "Impossibile aprire il device CD in lettura."
+
+# seek --> posizionamento (come in glib/gio)
+msgid "Could not seek CD."
+msgstr "Impossibile effettuare il posizionamento nel CD."
+
+msgid "Could not read CD."
+msgstr "Impossibile leggere il CD."
+
+msgid "Internal data stream error."
+msgstr "Errore interno nel flusso di dati."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Per riprodurre questo stream è richiesto un plugin %s, che però non risulta "
+"installato. "
+
+msgid "Could not determine type of stream"
+msgstr "Impossibile determinare il tipo di stream"
+
+msgid "This appears to be a text file"
+msgstr "Questo sembra essere un file di testo"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+"Risulta mancante l'elemento «%s» - verificare la propria installazione di "
+"GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Risultano mancanti entrambi gli elementi «autovideosink» e «%s»."
+
+msgid "The autovideosink element is missing."
+msgstr "Risulta mancante l'elemento «autovideosink»."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "L'elemento videosink «%s» non è operativo."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Entrambi gli elementi «autovideosink» e «%s» non sono operativi."
+
+msgid "The autovideosink element is not working."
+msgstr "L'elemento «autovideosink» non è operativo."
+
+msgid "Custom text sink element is not usable."
+msgstr "L'elemento sink di testo personalizzato non è utilizzabile."
+
+msgid "No volume control found"
+msgstr "Non è stato trovato alcun controllo del volume"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Risultano mancanti entrambi gli elementi «autoaudiosink» e «%s»."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Risulta mancante l'elemento «autoaudiosink»."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "L'elemento audiosink «%s» non è operativo."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Entrambi gli elementi «autoaudiosink» e «%s» non sono operativi."
+
+msgid "The autoaudiosink element is not working."
+msgstr "L'elemento «autoaudiosink» non è operativo."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Impossibile riprodurre un file di testo senza video o visualizzazioni."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Nessun decoder disponibile per il tipo «%s»."
+
+msgid "No URI specified to play from."
+msgstr "Non è stato specificato alcun URI da cui riprodurre."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "URI «%s» non valido."
+
+msgid "This stream type cannot be played yet."
+msgstr "Non è ancora possibile riprodurre questo tipo di stream."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nessun gestore di URI implementato per «%s»."
+
+msgid "Source element is invalid."
+msgstr "L'elemento sorgente non è valido."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Errore durante l'invio dei dati a \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Connessione a %s:%d rifiutata."
+
+# una parafrasi, ma mi pare non perda... -Luca
+msgid "Can't record audio fast enough"
+msgstr "Impossibile registrare l'audio a velocità adeguata"
+
+# dati non sufficienti... mah
+msgid "Failed to read tag: not enough data"
+msgstr "Lettura del tag non riuscita: non abbastanza dati"
+
+msgid "track ID"
+msgstr "ID traccia"
+
+msgid "MusicBrainz track ID"
+msgstr "ID MusicBrainz della traccia"
+
+msgid "artist ID"
+msgstr "ID artista"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID MusicBrainz dell'artista"
+
+msgid "album ID"
+msgstr "ID album"
+
+msgid "MusicBrainz album ID"
+msgstr "ID MusicBrainz dell'album"
+
+msgid "album artist ID"
+msgstr "ID artista dell'album"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID MusicBrainz dell'artista dell'album"
+
+msgid "track TRM ID"
+msgstr "ID TRM della traccia"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID MusicBrainz del TRM"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Questo CD non presenta alcuna traccia audio"
+
+msgid "ID3 tag"
+msgstr "Tag ID3"
+
+msgid "APE tag"
+msgstr "Tag APE"
+
+msgid "ICY internet radio"
+msgstr "Radio internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "ALAC (Apple Lossless Audio)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "FLAC (Free Lossless Audio Codec)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "TTA (Lossless True Audio)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV senza perdita"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH senza perdita"
+
+# cfr http://en.wikipedia.org/wiki/Run_length_encoding
+msgid "Run-length encoding"
+msgstr "RLE (Run-Length Encoding)"
+
+# grazie San Google
+msgid "Sami subtitle format"
+msgstr "Sottotitoli formato SAMI"
+
+msgid "TMPlayer subtitle format"
+msgstr "Sottotitoli formato TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Sottotitoli formato Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV non compresso"
+
+# non ho trovato info utili...
+# Copiato il messaggio originale solo per arrivare a 100 per cento
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Uncompressed Gray Image"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV non compresso"
+
+# %s è qualcosa come gli YUV dei precedenti
+#
+# Non so perché, ma senza X$ non lo dava buono....
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "%2$s %1$d-bit con tavolozza non compresso"
+
+# o MPEG-4 DivX ?
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versione %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV non compresso"
+
+# o audio grezzo ?
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Audio raw PCM %d-bit"
+
+msgid "Audio CD source"
+msgstr "Sorgente CD audio"
+
+msgid "DVD source"
+msgstr "Sorgente DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Sorgente RTSP (Real Time Streaming Protocol)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Sorgente protocollo MMS (Microsoft Media Server)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Sorgente protocollo %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Depayloader RTP %s video"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Depayloader RTP %s audio"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Depayloader RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demuxer %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Decoder %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Payloader RTP %s video"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Payloader RTP %s audio"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Payloader RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Muxer %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Encoder %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Elemento GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Elemento sorgente sconosciuto"
+
+msgid "Unknown sink element"
+msgstr "Elemento sink sconosciuto"
+
+msgid "Unknown element"
+msgstr "Elemento sconosciuto"
+
+msgid "Unknown decoder element"
+msgstr "Elemendo di decodifica sconosciuto"
+
+msgid "Unknown encoder element"
+msgstr "Elemento di codifica sconosciuto"
+
+msgid "Plugin or element of unknown type"
+msgstr "Plugin o elemento di tipo sconosciuto"
+
+# cfr http://en.wikipedia.org/wiki/YUV
+# http://support.microsoft.com/kb/281188/it
+# http://support.microsoft.com/kb/294880/it (traduz automatica) :-(
+# http://www.benis.it/dvd/agg3.htm
+#
+# Dal secondo e terzo, evinco YUV compresso o planare sarebbero
+# buone abbreviazioni, ma tengo planare/packed + compresso/noncompresso
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 planare non compresso"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YVU 4:2:0 planare non compresso"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 packed non compresso"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 packed non compresso"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU 4:1:0 packed non compresso"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 packed non compresso"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 packed non compresso"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 planare non compresso"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 planare non compresso"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Bianco e nero Y-plane non compresso"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Audio raw PCM"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio raw floating-point %d-bit"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio raw floating-point"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Impossibile aprire il file vfs «%s» in scrittura: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nessun nome di file fornito"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Impossibile chiudere il file vfs «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Errore durante la scrittura sul file «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "URI dei sottotitoli «%s» non valido, sottotitoli disabilitati."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Non è ancora possibile riprodurre gli stream RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Impossibile creare l'elemento «decodebin»."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "È stato rilevato unicamente uno stream di sottotitoli. Ciò significa che "
+#~ "si sta caricando un file di sottotitoli o un altro tipo di file di testo, "
+#~ "oppure che il file multimediale non è stato riconosciuto."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Non risulta installato alcun decoder in grado di gestire questo file. "
+#~ "Potrebbe essere necessario installare gli opportuni plugin."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Questo non è un file multimediale"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr ""
+#~ "È stato rilevato uno stream di sottotitoli, ma nessuno stream video."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr ""
+#~ "Risultano mancanti entrambi gli elementi «autovideosink» e «xvimagesink»."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr ""
+#~ "Risultano mancanti entrambi gli elementi «autoaudiosink» e «alsasink»."
+
+#~ msgid "No device specified."
+#~ msgstr "Nessun device specificato."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Il device «%s» non esiste."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Il device «%s» è già in uso."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Impossibile aprire il device «%s» in lettura e scrittura."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Errore durante l'invio di dati header gdp a \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Errore durante l'invio di dati payload gdp a \"%s:%d\"."
diff --git a/po/ja.gmo b/po/ja.gmo
new file mode 100644
index 0000000..7fb8495
--- /dev/null
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..bf0a2ed
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,629 @@
+# Japanese translation of gst-plugins-base
+# This file is put in the public domain.
+#
+# Makoto Kato <makoto.kt@gmail.com>, 2009-2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-10-25 10:27+0900\n"
+"Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\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.2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Master"
+msgstr "マスター"
+
+msgid "Bass"
+msgstr "低音"
+
+msgid "Treble"
+msgstr "高音"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "シンセ"
+
+msgid "Line-in"
+msgstr "ライン入力"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "マイクロフォン"
+
+msgid "PC Speaker"
+msgstr "PCスピーカー"
+
+msgid "Playback"
+msgstr "再生"
+
+msgid "Capture"
+msgstr "キャプチャ"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "モノラルモードで再生用にデバイスをオープンできませんでした"
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "ステレオモードで再生用にデバイスをオープンできませんでした"
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "%d チャンネルモードで再生用にデバイスを開くことができませんでした"
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"再生用にオーディオデバイスを開くことができませんでした。デバイスは他のアプリ"
+"ケーションで利用されています"
+
+msgid "Could not open audio device for playback."
+msgstr "再生用にオーティオデバイスを開くことができませんでした"
+
+msgid "Could not open device for recording in mono mode."
+msgstr "モノラルモードで録音用にデバイスを開くことができませんでした"
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "ステレオモードで録音用にデバイスを開くことができませんでした"
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "%d チャンネルモードで録音用にデバイスを開くことができませんでした"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"録音用にオーディオデバイスを開くことができませんでした。デバイスは他のアプリ"
+"ケーションで利用されています"
+
+msgid "Could not open audio device for recording."
+msgstr "録音用にオーディオデバイスを開くことができませんでした"
+
+msgid "Could not open CD device for reading."
+msgstr "読み込み用に CD デバイスを開くことができませんでした"
+
+msgid "Could not seek CD."
+msgstr "CDをシークすることができませんでした"
+
+msgid "Could not read CD."
+msgstr "CD を読むことができませんでした"
+
+msgid "Internal data stream error."
+msgstr "内部データストリームエラー"
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"%s プラグインはこのストリームを再生するのに必要ですが、インストールされていま"
+"せん"
+
+msgid "Could not determine type of stream"
+msgstr "ストリームの種類を判別できませんでした"
+
+msgid "This appears to be a text file"
+msgstr "これはテキストファイルのようです"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+"エレメント '%s' が見つかりません - GStreamer のインストールが失敗している可能"
+"性があります"
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "autovideosinkと%sエレメントの両方が見つかりません。"
+
+msgid "The autovideosink element is missing."
+msgstr "autovideosinkエレメントが見つかりません。"
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "設定された videosink %s が動作していません。"
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "autovideosinkと%sエレメントの両方が動作していません。"
+
+msgid "The autovideosink element is not working."
+msgstr "autovideosinkエレメントが動作していません。"
+
+msgid "Custom text sink element is not usable."
+msgstr "カスタムテキストシンクエレメントは使用できません。"
+
+msgid "No volume control found"
+msgstr "ボリュームコントロールが見つかりません"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "autoaudiosinkと%sエレメントの両方が見つかりません。"
+
+msgid "The autoaudiosink element is missing."
+msgstr "autoaudiosinkエレメントが見つかりません。"
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "設定された autoaudiosink %s が動作していません。"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "autoaudiosinkと%sエレメントの両方が動作していません。"
+
+msgid "The autoaudiosink element is not working."
+msgstr "autoaudiosinkエレメントが動作していません。"
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "ビデオまたは視覚化なしでテキストファイルを再生できません。"
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "タイプ '%s' 用のデコーダーが利用可能ではありません。"
+
+msgid "No URI specified to play from."
+msgstr "再生するURIが指定されていません"
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "不正な URI \"%s\""
+
+msgid "This stream type cannot be played yet."
+msgstr "このストリームタイプをまだ再生することはできません"
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "\"%s\" 用の URI ハンドラの実装はありません"
+
+msgid "Source element is invalid."
+msgstr "ソースエレメントが不正です。"
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "データを \"%s:%d\" へ送信中にエラーが発生しました"
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "%s:%d への接続が拒否されました"
+
+msgid "Can't record audio fast enough"
+msgstr "十分に速くオーディオを録音することができません"
+
+msgid "Failed to read tag: not enough data"
+msgstr "タグの読み込みに失敗しました: データが十分にありません"
+
+msgid "track ID"
+msgstr "トラック ID"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz トラック ID"
+
+msgid "artist ID"
+msgstr "アーティスト ID"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz アーティスト ID"
+
+msgid "album ID"
+msgstr "アルバム ID"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz アルバム ID"
+
+msgid "album artist ID"
+msgstr "アルバムアーティスト ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz アルバムアーティスト ID"
+
+msgid "track TRM ID"
+msgstr "トラック TRM ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr "キャプチャーのシャッタースピード"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "イメージをキャプチャするときに使われるシャッタースピード (秒)"
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "キャプチャーの彩度"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "イメージをキャプチャするときのホワイトバランスモードセット"
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr "キャプチャーのホワイトバランス"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "イメージをキャプチャするときのホワイトバランスモードセット"
+
+msgid "capturing contrast"
+msgstr "キャプチャーのコントラスト"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr "キャプチャーの彩度"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr "キャプチャーのシャープネス"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr "キャプチャーのソース"
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "この CD にはオーディオトラックがありません"
+
+msgid "ID3 tag"
+msgstr "ID3 タグ"
+
+msgid "APE tag"
+msgstr "APE タグ"
+
+msgid "ICY internet radio"
+msgstr "ICY インターネットラジオ"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "ロスレス True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV ロスレス"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "ロスレス MSZH"
+
+msgid "Run-length encoding"
+msgstr "ランレングス符号化"
+
+msgid "Sami subtitle format"
+msgstr "Sami 字幕形式"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer 字幕形式"
+
+msgid "Kate subtitle format"
+msgstr "Kate 字幕形式"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "非圧縮 YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "非圧縮グレーイメージ"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "非圧縮 YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "非圧縮 palettized %d ビット %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 バージョン %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "非圧縮 YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Raw %d ビット PCM オーディオ"
+
+msgid "Audio CD source"
+msgstr "オーディオ CD ソース"
+
+msgid "DVD source"
+msgstr "DVD ソース"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol (RTSP) ソース"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) プロトコルソース"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s プロトコルソース"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s ビデオ RTP デペイローダー"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s オーディオ RTP デペイローダー"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP デペイローダー"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s デコーダー"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s ビデオ RTP ペイローダー"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s オーディオ RTP ペイローダー"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP ペイローダー"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s ミキサー"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s エンコーダー"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer エレメント %s"
+
+msgid "Unknown source element"
+msgstr "不明なソースエレメント"
+
+msgid "Unknown sink element"
+msgstr "不明なシンクエレメント"
+
+msgid "Unknown element"
+msgstr "不明なエレメント"
+
+msgid "Unknown decoder element"
+msgstr "不明なデコーダーエレメント"
+
+msgid "Unknown encoder element"
+msgstr "不明なエンコーダーエレメント"
+
+msgid "Plugin or element of unknown type"
+msgstr "不明な種類のプラグインまたはエレメント"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "非圧縮 planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "非圧縮 planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "非圧縮 packed YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "非圧縮 packed YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "非圧縮 packed YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "非圧縮 packed YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "非圧縮 packed YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "非圧縮 planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "非圧縮 planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "非圧縮黒と白Y-plane"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Raw PCM オーディオ"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Raw %d ビット浮動小数点オーディオ"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Raw 浮動小数点オーディオ"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "書き込み用に vfs ファイル \"%s\" を開くことができませんでした: %s"
+
+#~ msgid "No filename given"
+#~ msgstr "ファイル名が与えられていません"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "vfs ファイル \"%s\" をクローズできませんでした"
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "ファイル \"%s\" の書き込み中にエラーが発生しました"
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "不正な字幕 URI \"%s\"。字幕を無効にします。"
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP ストリームをまだ再生できません"
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "\"decodebin\" エレメントを作成できません。"
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "字幕ストリームのみを認識しました。字幕ファイルかテキストファイルをロード中"
+#~ "か、メディアファイルが認識されないのかどちらかです。"
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "このファイルを扱うことができるデコーダがインストールされていません。必要な"
+#~ "プラグインをインストールする必要があるかもしれません"
+
+#~ msgid "This is not a media file"
+#~ msgstr "これはメディアファイルではありません"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "字幕のストリームを認識しましたが、動画ストリームがありません"
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "autovideosinkとxvimagesinkエレメントの両方が見つかりません。"
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "autovideosinkとalsasinkエレメントの両方が見つかりません。"
+
+#~ msgid "No device specified."
+#~ msgstr "デバイスが指定されていません。"
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "デバイス \"%s\" は存在しません。"
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "デバイス \"%s\" は既に使われています。"
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr ""
+#~ "読み込み用と書き込み用にデバイス \"%s\" を開くことができませんでした。"
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "gdp ヘッダデータを \"%s:%d\" へ送信中にエラーが発生しました"
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "gdp ペイロードデータを \"%s:%d\" へ送信中にエラーが発生しました"
+
+#~ msgid "No file name specified."
+#~ msgstr "ファイル名が指定されていません"
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "読み込み用にファイル \"%s\" を開くことができませんでした"
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "\"decodebin2\" エレメントを作成できませんでした"
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "\"queue2\" エレメントを作成できませんでした"
diff --git a/po/lt.gmo b/po/lt.gmo
new file mode 100644
index 0000000..02ea200
--- /dev/null
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000..d0b82e1
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,646 @@
+# translation of lt.gst-plugins-base.HEAD.po to Lithuanian
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+#
+# Gintautas Miliauskas <gintas@akl.lt>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base-0.10.15.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2008-03-07 23:43+0200\n"
+"Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
+"Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
+"Language: lt\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=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Master"
+msgstr "Pagrindinis"
+
+msgid "Bass"
+msgstr "Žemi dažniai"
+
+msgid "Treble"
+msgstr "Aukšti dažniai"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintezatorius"
+
+msgid "Line-in"
+msgstr "Įvedimas"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofonas"
+
+msgid "PC Speaker"
+msgstr "PC garsiakalbis"
+
+msgid "Playback"
+msgstr "Grojimas"
+
+msgid "Capture"
+msgstr "Įrašymas"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nepavyko atverti įrenginio monofoniniam grojimui."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nepavyko atverti įrenginio stereofoniniam grojimui."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Nepavyko atverti įrenginio %d kanalų grojimui."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Nepavyko atverti audio įrenginio grojimui. Įrenginys naudojamas kitos "
+"programos."
+
+msgid "Could not open audio device for playback."
+msgstr "Nepavyko atverti audio įrenginio grojimui."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nepavyko atverti įrenginio monofoniniam įrašymui."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Nepavyko atverti įrenginio stereofoniniam įrašymui."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Nepavyko atverti įrenginio %d kanalų įrašymui"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nepavyko atverti audio įrenginio įrašymui. Įrenginys naudojamas kitos "
+"programos."
+
+msgid "Could not open audio device for recording."
+msgstr "Nepavyko atverti audio įrenginio įrašymui."
+
+msgid "Could not open CD device for reading."
+msgstr "Nepavyko atverti CD įrenginio skaitymui."
+
+msgid "Could not seek CD."
+msgstr "Nepavyko pakeisti pozicijos CD."
+
+msgid "Could not read CD."
+msgstr "Nepavyko perskaityti CD."
+
+msgid "Internal data stream error."
+msgstr "Vidinė duomenų srauto klaida."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Šiam srautui groti reikalingas %s įskiepis, bet jis nėra įdiegtas."
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "Nepavyko sukurti „decodebin“ elemento."
+
+msgid "This appears to be a text file"
+msgstr "Atrodo, kad šis failas tekstinis"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Trūksta elemento „%s“ - patikrinkite GStreamer įdiegimą."
+
+#, fuzzy, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+#, fuzzy
+msgid "The autovideosink element is missing."
+msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+#, fuzzy, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+#, fuzzy, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+#, fuzzy
+msgid "The autovideosink element is not working."
+msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+#, fuzzy
+msgid "The autoaudiosink element is missing."
+msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+#, fuzzy, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+#, fuzzy, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+#, fuzzy
+msgid "The autoaudiosink element is not working."
+msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Tipui „%s“ dekoderių nerasta."
+
+msgid "No URI specified to play from."
+msgstr "Nenurodytas URI, iš kurio groti."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Netaisyklingas URI „%s“."
+
+msgid "This stream type cannot be played yet."
+msgstr "Šis srautas dar negali būti rodomas."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nėra URI valdyklės „%s“."
+
+msgid "Source element is invalid."
+msgstr "Šaltinio elementas nekorektiškas."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Klaida siunčiant duomenis į „%s:%d“."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Prisijungimas prie %s:%d atmestas."
+
+msgid "Can't record audio fast enough"
+msgstr "Nepakankamai greitai įrašomas garsas"
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr "takelio ID"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz takelio ID"
+
+msgid "artist ID"
+msgstr "atlikėjo ID"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz atlikėjo ID"
+
+msgid "album ID"
+msgstr "albumo ID"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz albumo ID"
+
+msgid "album artist ID"
+msgstr "albumo atlikėjo ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albumo atlikėjo ID"
+
+msgid "track TRM ID"
+msgstr "takelio TRM ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Šiame CD nėra audio takelių"
+
+msgid "ID3 tag"
+msgstr "ID3 žymė"
+
+msgid "APE tag"
+msgstr "APE žymė"
+
+msgid "ICY internet radio"
+msgstr "ICY interneto radijas"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "Eilės ilgio kodavimas (RLE)"
+
+msgid "Sami subtitle format"
+msgstr "Sami titrų formatas"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer titrų formatas"
+
+#, fuzzy
+msgid "Kate subtitle format"
+msgstr "Sami titrų formatas"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nekompresuotas YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Nesuspaustas bespalvis paveikslas"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nekompresuotas YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nekompresuotas paletizuotas %d bitų %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versija %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nekompresuotas YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Neapdorotas %d bitų PCM garsas"
+
+msgid "Audio CD source"
+msgstr "Audio CD šaltinis"
+
+msgid "DVD source"
+msgstr "DVD šaltinis"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Realaus laiko srautų protokolo (RTSP) šaltinis"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) protokolo šaltinis"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokolo šaltinis"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video RTP depayloader'is"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audio RTP depayloader'is"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP depayloader'is"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demukseris"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s dekoderis"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video RTP payloader'is"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audio RTP payloader'is"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP payloader'is"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s mukseris"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s enkoderis"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer elementas %s"
+
+msgid "Unknown source element"
+msgstr "Nežinomas šaltinio elementas"
+
+msgid "Unknown sink element"
+msgstr "Nežinomas paskirties elementas"
+
+msgid "Unknown element"
+msgstr "Nežinomas elementas"
+
+msgid "Unknown decoder element"
+msgstr "Nežinomas dekodavimo elementas"
+
+msgid "Unknown encoder element"
+msgstr "Nežinomas kodavimo elementas"
+
+msgid "Plugin or element of unknown type"
+msgstr "Nežinomo tipo įskiepis ar elementas"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nekompresuotas planarinis YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nekompresuotas planarinis YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nekompresuotas planarinis YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nekompresuotas planarinis YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nekompresuotas planarinis YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nekompresuotas planarinis YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nekompresuotas planarinis YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nekompresuotas planarinis YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nekompresuotas planarinis YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nekompresuota juodai balta Y plokštuma"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Neapdorotas PCM garsas"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Neapdorotas %d bitų slankaus kablelio garsas"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Neapdorotas slankaus kablelio garsas"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nepavyko atverti vfs failo „%s“ rašymui: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nenurodytas failo vardas"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nepavyko užverti vfs failo „%s“."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Klaida rašant į failą „%s“."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Netaisyklingas titrų URI „%s“, titrai išjungti."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP srautai dar negali būti rodomi."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nepavyko sukurti „decodebin“ elemento."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Rastas tik subtitrų srautas. Arba bandote įkelti subtitrų failą ar kitokį "
+#~ "tekstinį failą, arba failas nebuvo teisingai atpažintas."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Neturite dekoderio, reikalingo šiam failui rodyti. Gali prireikti įdiegti "
+#~ "reikalingus įskiepius."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Tai nėra medijos failas"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Rastas titrų srautas, bet be video srauto."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Trūksta ir autovideosink, ir xvimagesink elementų."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Trūksta ir autoaudiosink, ir alsasink elementų."
+
+#~ msgid "No device specified."
+#~ msgstr "Nenurodytas įrenginys."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Įrenginys „%s“ neegzistuoja."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Įrenginys „%s“ jau naudojamas."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nepavyko atverti įrenginio „%s“ skaitymui ir rašymui."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Klaida siunčiant gdp antraštės duomenis į \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Klaida siunčiant gdp duomenis į „%s:%d“."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Nepavyko sukurti „decodebin2“ elemento."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Nepavyko sukurti „queue2“ elemento."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Nepavyko sukurti „decodebin“ elemento."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Nenurodytas įrenginys."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Nepavyko užverti vfs failo „%s“."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Nepavyko atverti failo „%s“ rašymui."
+
+#, fuzzy
+#~ msgid "Internal data flow error."
+#~ msgstr "Vidinė duomenų srauto klaida."
+
+#~ msgid "No file name specified."
+#~ msgstr "Nenurodytas failo vardas."
diff --git a/po/lv.gmo b/po/lv.gmo
new file mode 100644
index 0000000..622b9f8
--- /dev/null
+++ b/po/lv.gmo
Binary files differ
diff --git a/po/lv.po b/po/lv.po
new file mode 100644
index 0000000..a1b218f
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,634 @@
+# Latvian translation of gst-plugins-base
+# This file is put in the public domain.
+#
+# Arvis Lācis <arvis.lacis@inbox.lv>, 2009.
+# Rihards Priedītis <rprieditis@gmail.com>, 2010.
+# Rihards Priedītis <rprieditis@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-09-02 12:02-0000\n"
+"Last-Translator: Rihards Priedītis <rprieditis@gmail.com>\n"
+"Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
+"Language: lv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Latvian\n"
+"X-Poedit-Country: LATVIA\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 "Master"
+msgstr "Galvenais"
+
+msgid "Bass"
+msgstr "Bass"
+
+msgid "Treble"
+msgstr "Diskants"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintēze"
+
+msgid "Line-in"
+msgstr "Line-in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofons"
+
+msgid "PC Speaker"
+msgstr "Datora skaļrunis"
+
+msgid "Playback"
+msgstr "Atskaņošana"
+
+msgid "Capture"
+msgstr "Tveršana"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nevarēja atvērt ierīci atskaņošanai mono režīmā."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nevarēja atvērt ierīci atskaņošanai stereo režīmā."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Nevarēja atvērt ierīci atskaņošanai %d-kanāla režīmā."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Nevarēja atvērt audio ierīci atskaņošanai. Ierīci pašlaik izmanto cita "
+"lietotne."
+
+msgid "Could not open audio device for playback."
+msgstr "Nevarēja atvērt audio ierīci atskaņošanai."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nevarēja atvērt ierīci ierakstīšanai mono režīmā."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Nevarēja atvērt ierīci ierakstīšanai stereo režīmā."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Nevarēja atvērt ierīci ierakstīšanai %d-kanāla režīmā"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nevarēja atvērt audio ierīci ierakstīšanai. Ierīci pašlaik izmanto cita "
+"lietotne."
+
+msgid "Could not open audio device for recording."
+msgstr "Nevarēja atvērt audio ierīci ierakstīšanai."
+
+msgid "Could not open CD device for reading."
+msgstr "Nevarēja atvērt CD ierīci lasīšanai."
+
+msgid "Could not seek CD."
+msgstr "Nevarēja meklēt pa CD."
+
+msgid "Could not read CD."
+msgstr "Nevarēja nolasīt CD."
+
+msgid "Internal data stream error."
+msgstr "Iekšējās datu plūsmas kļūda."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Nepieciešamas %s spraudnis, lai atskaņotu šo plūsmu, bet tas nav instalēts."
+
+msgid "Could not determine type of stream"
+msgstr "Nevarēja noteikts straumes tipu"
+
+msgid "This appears to be a text file"
+msgstr "Tiek atpazīts kā teksta fails"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Trūkst elements \"%s\" - pārbaudiet savu GStreamer instalāciju."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Trūkst gan autovideosink, gan %s elementi."
+
+msgid "The autovideosink element is missing."
+msgstr "Trūkst autovideosink elements."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Konfigurētais videosink %s nestrādā."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Gan autovideosink, gan %s elementi nedarbojas."
+
+msgid "The autovideosink element is not working."
+msgstr "autovideosink elements nedarbojas."
+
+msgid "Custom text sink element is not usable."
+msgstr "Pielāgots teksta iegremdēšanas elements nav lietojams."
+
+msgid "No volume control found"
+msgstr "Netika atrasta neviena skaļuma kontrole"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Trūkst gan autoaudiosink, gan %s elementi."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Trūkst autoaudiosink elements."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Konfigurētais audiosink %s nestrādā."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Nedarbojas autoaudiosink un %s elementi."
+
+msgid "The autoaudiosink element is not working."
+msgstr "autoaudiosink elements nedarbojas."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Nevar atskaņot teksta failu bez video vai vizualizācijas."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Nav pieejams neviens atkodētājs failu veidam \"%s\"."
+
+msgid "No URI specified to play from."
+msgstr "Nav norādīts neviens URI, no kā varētu spēlēt. "
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Nederīgs URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Šī plūsma pagaidām nevar tikt atskaņota."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nav izstrādāts neviens URI apstrādātājs priekš \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Avota elements ir nederīgs."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Radās kļūda nosūtot datus uz \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Savienojums ar %s:%d noraidīts."
+
+msgid "Can't record audio fast enough"
+msgstr "Nevar ierakstīt audio pietiekami ātri"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Neizdevās nolasīt atzīmi: nepietiek datu"
+
+msgid "track ID"
+msgstr "celiņa ID"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz celiņa ID"
+
+msgid "artist ID"
+msgstr "izpildītāja ID"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz izpildītāja ID"
+
+msgid "album ID"
+msgstr "albuma ID"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz albuma ID"
+
+msgid "album artist ID"
+msgstr "albuma izpildītāja ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albuma izpildītāja ID"
+
+msgid "track TRM ID"
+msgstr "celiņa TRM ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr "Tveršanā aizvara ātrums"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Attēla tveršanā izmantotais aizvara ātrums sekundēs"
+
+msgid "capturing focal ratio"
+msgstr "tveršanā fokusa attiecība"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Attēla tveršanā izmantotā fokusa attiecība (f-cipars)"
+
+msgid "capturing focal length"
+msgstr "tveršanā fokusa attālums"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Attēla tveršanā izmantotā lēcas fokusa attālums milimetros"
+
+msgid "capturing digital zoom ratio"
+msgstr "tveršanā digitālais tālummaiņas attiecība"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Attēla tveršanā izmantotais digitālās tālummaiņas attiecība"
+
+msgid "capturing iso speed"
+msgstr "tveršanā iso ātrums"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Attēla tveršanā izmantotais ISO ātrums"
+
+msgid "capturing exposure program"
+msgstr "tveršanā atseguma programma"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Attēla tveršanā izmantotā atseguma programma"
+
+msgid "capturing exposure mode"
+msgstr "tveršanā atseguma režīms"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Attēla tveršanā izmantotais atseguma režīms"
+
+msgid "capturing exposure compensation"
+msgstr "tveršanā atseguma kompensācija"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Attēla tveršanā izmantotais atseguma kompensācija"
+
+msgid "capturing scene capture type"
+msgstr "tveršanā ainas tveršanas tips"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Attēla tveršanā izmantotas ainas tveršanas režīms"
+
+msgid "capturing gain adjustment"
+msgstr "tveršanā pieaguma korekcija"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Attēla tveršanā izmantotais vispārējā pieauguma korekcija"
+
+msgid "capturing white balance"
+msgstr "tveršanas baltais balanss"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Lietotais baltais balanss virziens attēla tveršanā"
+
+msgid "capturing contrast"
+msgstr "tveršanā kontrasts"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Lietotais kontrasts virziens attēla tveršanā"
+
+msgid "capturing saturation"
+msgstr "tveršanā piesātinājums"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Lietotais piesātinājuma virziens attēla tveršanā"
+
+msgid "capturing sharpness"
+msgstr "tveršanā asumss"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Lietotais asuma virziens attēla tveršanā"
+
+msgid "capturing flash fired"
+msgstr "tveršanā zibsnis palaists"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Ja zibsnis palaists attēla tveršanā"
+
+msgid "capturing flash mode"
+msgstr "tveršanā zibšņa režīms"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Atlasītais zibšņa režīms priekš attēla tveršanas"
+
+msgid "capturing metering mode"
+msgstr "tveršanā mērīšanas režīms"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Mērīšanas režīms, lai noteiktu atsegumu attēla tveršanai"
+
+msgid "capturing source"
+msgstr "tveršanā avots"
+
+msgid "The source or type of device used for the capture"
+msgstr "Tveršanas avots vai iekārtas tips"
+
+msgid "image horizontal ppi"
+msgstr "attēla horizontālais ppi"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Medija (attēls/video) domātā horizontālā pikseļu blīvums ppi"
+
+msgid "image vertical ppi"
+msgstr "attēla vertikālais ppi"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Medija (attēls/video) domātā vertikālā pikseļu blīvums ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Šajā CD nav neviena audio celiņa"
+
+msgid "ID3 tag"
+msgstr "ID3 atzīme"
+
+msgid "APE tag"
+msgstr "APE atzīme"
+
+msgid "ICY internet radio"
+msgstr "ICY interneta radio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Bez zudumu True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows mediju runa"
+
+msgid "CYUV Lossless"
+msgstr "CYUV bez zudumu"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Bez zudumu MSZH"
+
+msgid "Run-length encoding"
+msgstr "Sērijas garuma kodēšana"
+
+msgid "Sami subtitle format"
+msgstr "Sami subtitru formāts"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer subtitru formāts"
+
+msgid "Kate subtitle format"
+msgstr "Kate subtitru formāts"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nesaspiests YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Neatspiests Pelēks attēls"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nesaspiests YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nesaspiests paletizēts %d-bitu %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versija %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nesaspiests YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Jēls %d-bitu PCM audio"
+
+msgid "Audio CD source"
+msgstr "Audio CD avots"
+
+msgid "DVD source"
+msgstr "DVD avots"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Tiešās straumēšanas protokola (RTSP) avots"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Mediju Servera (MMS) protokola avots"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokola avots"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video RTP izkrāvējs"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audio RTP izskrāvējs"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP izkrāvējs"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s atjaucējs"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s atkodētājs"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video RTP iekrāvējs"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audio RTP iekrāvējs"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP iekrāvējs"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s jaucējs"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s kodētājs"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer elements %s"
+
+msgid "Unknown source element"
+msgstr "Nezināms avota elements"
+
+msgid "Unknown sink element"
+msgstr "Nezināms iegremdēšanas elements"
+
+msgid "Unknown element"
+msgstr "Nezināms elements"
+
+msgid "Unknown decoder element"
+msgstr "Nezināms atkodētāja elements"
+
+msgid "Unknown encoder element"
+msgstr "Nezināms kodētāja elements"
+
+msgid "Plugin or element of unknown type"
+msgstr "Nezināma veida spraudnis vai elements"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nevarēja atvērt vfs failu \"%s\" rakstīšanai: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nav norādīts faila nosaukums"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nevarēja aizvērt vfs failu \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Kļūda rakstot failā \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Nederīgs subtitru URI \"%s\", subtitri izslēgti."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP plūsmas pagaidām nevar tikt atskaņotas."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nevarēja izveidot \"decodebin\" elementu."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Tika pamanīta tikai subtitru plūsma. Vai nu jūs ielādējat subtitru failu "
+#~ "vai cita veida teksta failu, vai arī mediju fails netika atpazīts."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Jums nav instalēta atkodētāja, lai apietos ar šo failu. Jums iespējams "
+#~ "vajadzētu instalēt nepieciešamos spraudņus."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Šis nav mediju fails"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Tika pamanīta subtitru plūsma, bet ne video plūsma."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Trūkst gan autovideosink, gan xvimagesink elementi."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Trūkst gan autoaudiosink, gan alsasink elementi."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Radās kļūda nosūtot gdb galvenas datus uz \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Kļūda sūtot gdp iekrāvēja datus uz \"%s:%d\""
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nesaspiesta plakne YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nesaspiesta plakne YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nesaspiests pakots YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nesaspiests pakots YUP 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nesaspiests pakots YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nesaspiests pakots YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nesaspiests pakots YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nesaspiesta plakne YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nesaspiesta plakne YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nesaspiests melnbaltais Y-plakne"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Jēls PCM audio"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Jēls %d-bitu plūstošā punkta audio"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Jēls plūstošā punkta audio"
+
+#~ msgid "No device specified."
+#~ msgstr "Nav norādīta ierīce."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Ierīce \"%s\" neeksistē."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Ierīce \"%s\" jau tiek izmantota."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nevarēja atvērt ierīci \"%s\" lasīšanai vai rakstīšanai."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Nav iespējams izveidot \"decodebin2\" elementu."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Nav iespējams izveidot \"queue2\" elementu."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Nav iespējams izveidot \"typefind\" elementu."
+
+#~ msgid "Can't play a text subtitles and subpictures."
+#~ msgstr "Nevar atskaņot teksta subtitrus un subattēlus."
+
+#~ msgid "No file name specified."
+#~ msgstr "Nav norādīts faila nosaukums."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Nav iespējams atvērt failu \"%s\" lasīšanai."
diff --git a/po/nb.gmo b/po/nb.gmo
new file mode 100644
index 0000000..9cbf73a
--- /dev/null
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..c0ded66
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,536 @@
+# Norwegian bokmaal translation of gst-utils.
+# This file is put in the public domain.
+# Kjartan Maraas <kmaraas@gnome.org>, 2004-2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-10-24 21:44+0200\n"
+"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
+"Language: \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 "Master"
+msgstr "Hovedvolum"
+
+msgid "Bass"
+msgstr "Bass"
+
+msgid "Treble"
+msgstr "Diskant"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Linje inn"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC-høyttaler"
+
+msgid "Playback"
+msgstr "Spill av"
+
+msgid "Capture"
+msgstr "Ta opp"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Kunne ikke åpne enheten for avspilling i mono-modus."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Kunne ikke åpne enheten for avspilling i stereo-modus."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+msgid "Could not open audio device for playback."
+msgstr "Kunne ikke åpne lydenheten for avspilling."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+msgid "Could not open audio device for recording."
+msgstr "Kunne ikke åpne lydenheten for opptak."
+
+msgid "Could not open CD device for reading."
+msgstr "Kunne ikke åpne CD-enheten for lesing."
+
+msgid "Could not seek CD."
+msgstr "Kunne ikke søke på CD."
+
+msgid "Could not read CD."
+msgstr "Kunne ikke lese CD."
+
+msgid "Internal data stream error."
+msgstr "Intern feil i datastrøm."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Et %s-tillegg kreves for å spille av denne strømmen, men det er ikke "
+"installert."
+
+msgid "Could not determine type of stream"
+msgstr "Kunne ikke bestemme type strøm."
+
+msgid "This appears to be a text file"
+msgstr "Dette ser ut som en tekstfil"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr "Fant ikke volumkontroll"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr "Ingen URI for avspilling oppgitt."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Ugyldig URI «%s»."
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr "Kildeelement er ugyldig."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr ""
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr "spor-ID"
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr "artist-ID"
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr "album-ID"
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Denne CDen har ingen lydspor"
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr "Ukjent element for koding"
+
+msgid "Plugin or element of unknown type"
+msgstr "Tillegg eller element av ukjent type"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Kunne ikke åpne VFS-fil «%s» for skriving: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Ingen filnavn oppgitt"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Kunne ikke lukke VFS-fil «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Feil under skriving til fil «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Ugyldig URI «%s» til undertekst. Undertekst er slått av."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP-strømmer kan ikke spilles av ennå."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Dette er ikke en mediefil"
+
+#~ msgid "No device specified."
+#~ msgstr "Ingen enhet oppgitt."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Enhet «%s» eksisterer ikke."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Enhet «%s» er allerede i bruk."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Kunne ikke åpne enhet «%s» for lesing og skriving."
diff --git a/po/nl.gmo b/po/nl.gmo
new file mode 100644
index 0000000..81da802
--- /dev/null
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..a1bc1fa
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,622 @@
+# translation of gst-plugins-base-0.10.32.2.po to Dutch
+# This file is put in the public domain.
+#
+# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-27 00:12+0200\n"
+"Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\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 "Master"
+msgstr "Master"
+
+msgid "Bass"
+msgstr "Lage tonen"
+
+msgid "Treble"
+msgstr "Hoge tonen"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Lijn-in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Microfoon"
+
+msgid "PC Speaker"
+msgstr "PC-luidspreker"
+
+msgid "Playback"
+msgstr "Afspelen"
+
+msgid "Capture"
+msgstr "Opnemen"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Kan het apparaat niet openen voor afspelen in mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Kan het apparaat niet openen voor afspelen in stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Kan het apparaat niet openen voor afspelen in %d-kanalen."
+
+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."
+msgstr "Kan het audio-apparaat niet openen voor afspelen."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Kan het apparaat niet openen in mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Kan het apparaat niet openen voor opnemen in stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Kan het apparaat niet openen voor opnemen in %d-kanalen."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Kan het audio-apparaat niet openen voor opnemen. Apparaat is in gebruik bij "
+"een andere applicatie."
+
+msgid "Could not open audio device for recording."
+msgstr "Kan het audio-apparaat niet openen voor opnemen."
+
+msgid "Could not open CD device for reading."
+msgstr "Kan het CD-apparaat niet openen om te lezen."
+
+msgid "Could not seek CD."
+msgstr "Kan geen seek doen op CD."
+
+msgid "Could not read CD."
+msgstr "Kan niet lezen van CD."
+
+msgid "Internal data stream error."
+msgstr "Interne fout in gegevensstroom."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Een %s plugin is vereist voor het afspelen van deze gegevens, echter deze is "
+"niet geïnstalleerd."
+
+msgid "Could not determine type of stream"
+msgstr "Kan het type stream niet bepalen"
+
+msgid "This appears to be a text file"
+msgstr "Dit lijkt een tekstbestand te zijn"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Ontbrekend element '%s' - controleer de instalatie van uw GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "De elementen 'autovideosink' en '%s' ontbreken beide."
+
+msgid "The autovideosink element is missing."
+msgstr "Het element 'autovideosink' ontbreekt."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Het geconfigureerde videosink %s werkt niet."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "De elementen 'autovideosink' en '%s' werken beide niet."
+
+msgid "The autovideosink element is not working."
+msgstr "Het element 'autovideosink' werkt niet."
+
+msgid "Custom text sink element is not usable."
+msgstr "De aangepaste element 'tekst-sink' is niet bruikbaar."
+
+msgid "No volume control found"
+msgstr "Geen volumecontrole gevonden"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "De elementen 'autoaudiosink' en '%s' ontbreken beide."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Het element 'autoaudiosink' ontbreekt."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Het geconfigureerde audiosink %s werkt niet."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "De elementen 'autoaudiosink' en '%s' werken beide niet."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Het element 'autoaudiosink' werkt niet."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Kan geen tekstbestand afspelen zonder video of visualisaties."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Geen decoder beschikbaar voor het type '%s'."
+
+msgid "No URI specified to play from."
+msgstr "Geen URI opgegeven om van af te spelen."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Ongeldige URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Deze stroom kan nog niet afgespeeld worden."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Geen URI-handler geïmplementeerd voor \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Bronelement is ongeldig."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Fout bij het zenden van gegevens naar \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Verbinding naar %s:%d is geweigerd."
+
+msgid "Can't record audio fast enough"
+msgstr "Kan geluid niet snel genoeg opslaan"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Lezen van tag is mislukt: niet genoeg gegevens"
+
+msgid "track ID"
+msgstr "track-ID"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz track-ID"
+
+msgid "artist ID"
+msgstr "artiest-ID"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz artiest-ID"
+
+msgid "album ID"
+msgstr "album-ID"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz album-ID"
+
+msgid "album artist ID"
+msgstr "album-artiest-ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz album-artiest-ID"
+
+msgid "track TRM ID"
+msgstr "track-TRM-ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM-ID"
+
+msgid "capturing shutter speed"
+msgstr "sluitersnelheid bij het maken"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Gebruikte sluitersnelheid bij het maken van een foto, in seconden"
+
+msgid "capturing focal ratio"
+msgstr "F-nummer bij maken"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Gebruikte F-nummer bij het maken van de foto"
+
+msgid "capturing focal length"
+msgstr "brandpuntsafstand bij maken"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+"Ge bruikte brandpuntsafstand van de lens bij het maken van de foto, in mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "digitale zoom-verhouding bij het maken"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Gebruikte digitale zoom-verhouding bij het maken van een foto"
+
+msgid "capturing iso speed"
+msgstr "ISO-snelheid bij het maken"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Gebruikte ISO-snelheid bij het maken van een foto"
+
+msgid "capturing exposure program"
+msgstr "belichtingsprogramma bij het maken"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Gebruikte belichtingsprogramma bij het maken van een foto"
+
+msgid "capturing exposure mode"
+msgstr "belichtingmodus bij het maken"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Gebruikte belichtingmodus bij het maken van een foto"
+
+msgid "capturing exposure compensation"
+msgstr "belichtingscompensatie bij het maken"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Gebruikte belichtingscompensatie bij het maken van een foto"
+
+msgid "capturing scene capture type"
+msgstr "type scene-opname bij het maken"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Gebruikte type scene-opname bij het maken van een foto"
+
+msgid "capturing gain adjustment"
+msgstr "aanpassing versterking bij het maken"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Gebruikte aanpassing versterking bij het maken van een foto"
+
+msgid "capturing white balance"
+msgstr "witbalans bij het maken"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Gebruikte witbalans bij het maken van een foto"
+
+msgid "capturing contrast"
+msgstr "contrast bij het maken"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+"De richting van de contrastbewerking toegepast bij het nemen van een foto"
+
+msgid "capturing saturation"
+msgstr "verzadiging bij het nemen"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"De richting van de bewerking van de verzadiging toegepast bij het nemen van "
+"een foto"
+
+msgid "capturing sharpness"
+msgstr "scherpte bij het nemen"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+"De richting van de scherptebewerking toegepast bij het nemen van een foto"
+
+msgid "capturing flash fired"
+msgstr "flitser gebruikt bij het nemen"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Of de flitser is gebruikt bij het nemen van een foto"
+
+msgid "capturing flash mode"
+msgstr "flitsmodus bij het nemen"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Geselecteerde flitsmodus bij het nemen van een foto"
+
+msgid "capturing metering mode"
+msgstr "meetmethode bij het nemen"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Gebruikte meetmethode bij het bepalen van de belichting voor het nemen van "
+"een foto"
+
+msgid "capturing source"
+msgstr "opnameapparaat bij het nemen"
+
+msgid "The source or type of device used for the capture"
+msgstr "Het gebruikte opnameapparaat of type apparaat voor het nemen"
+
+msgid "image horizontal ppi"
+msgstr "horizontale ppi van afbeelding"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Voorgenomen horizontale pixeldichtheid van medium (afbeelding/video) in ppi"
+
+msgid "image vertical ppi"
+msgstr "verticale ppi van afbeelding"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Voorgenomen verticale pixeldichtheid van medium (afbeelding/video) in ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Deze CD heeft geen audiotracks"
+
+msgid "ID3 tag"
+msgstr "ID3-tag"
+
+msgid "APE tag"
+msgstr "APE-tag"
+
+msgid "ICY internet radio"
+msgstr "ICY-internetradio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "Run-length encoding (RLE)"
+
+msgid "Sami subtitle format"
+msgstr "Sami ondertitelformaat"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer ondertitelformaat"
+
+msgid "Kate subtitle format"
+msgstr "Kate ondertitelformaat"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Niet-gecomprimeerde YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Niet-gecomprimeerde grijze afbeelding"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Niet-gecomprimeerde YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Niet-gecomprimeerde, gepaletteerde %d-bits %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versie %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Niet-gecomprimeerde YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Raw %d-bits PCM-audio"
+
+msgid "Audio CD source"
+msgstr "Audio-CD-bron"
+
+msgid "DVD source"
+msgstr "DVD-bron"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol (RTSP)-bron"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server (MMS) protocol-bron"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protocol-bron"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video-RTP-depayloader"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audio-RTP-depayloader"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP-depayloader"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s decoder"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video-RTP-payloader"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audio-RTP-payloader"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP-payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s muxer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s encoder"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer element %s"
+
+msgid "Unknown source element"
+msgstr "Onbekend bronelement"
+
+msgid "Unknown sink element"
+msgstr "Onbekend bestemmingselement"
+
+msgid "Unknown element"
+msgstr "Onbekend element"
+
+msgid "Unknown decoder element"
+msgstr "Onbekend decoder-element"
+
+msgid "Unknown encoder element"
+msgstr "Onbekend encoder-element"
+
+msgid "Plugin or element of unknown type"
+msgstr "Plugin of element van onbekend type"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Niet-gecomprimeerde planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Niet-gecomprimeerde planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Niet-gecomprimeerde packed YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Niet-gecomprimeerde packed YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Niet-gecomprimeerde packed YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Niet-gecomprimeerde packed YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Niet-gecomprimeerde packed YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Niet-gecomprimeerde planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Niet-gecomprimeerde planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Niet-gecomprimeerd zwartwit Y-vlak"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Raw PCM-audio"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Raw %d-bits drijvendekomma-audio"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Raw drijvendekomma-audio"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Kon het VFS-bestand \"%s\" niet openen om te schrijven: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Geen bestandsnaam opgegeven"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Kan het VFS-bestand \"%s\" niet sluiten."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Fout bij het schrijven naar bestand \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Ongeldige ondertitel-URI \"%s\"; ondertitels zijn uitgezet."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP-gegevensstromen zijn nog niet af te spelen."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Kan \"decodebin\"-element niet aanmaken."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Er is alleen een ondertitelgegevensstroom gedetecteerd. Ofwel bent u een "
+#~ "ondertitelbestand of een ander type tekstbestand aan het laden, of het "
+#~ "mediabestand is niet herkend."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "U hebt geen decoder geïnstalleerd voor dit bestand. U moet mogelijk de "
+#~ "noodzakelijke plugins installeren."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Dit is geen mediabestand."
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Een ondertitelstroom is gedetecteerd, maar geen videostroom."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "De elementen 'autovideosink' en 'xvimagesink' ontbreken beide."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "De elementen 'autoaudiosink' en 'alsasink' ontbreken beide."
+
+#~ msgid "No device specified."
+#~ msgstr "Geen apparaat opgegeven."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Apparaat \"%s\" bestaat niet."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Apparaat \"%s\" is al in gebruik."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Kan apparaat \"%s\" niet openen voor lezen en schrijven."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Fout tijdens het zenden van gdp-headergegevens naar \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Fout tijdens het zenden van gdp-gegevens naar \"%s:%d\"."
diff --git a/po/or.gmo b/po/or.gmo
new file mode 100644
index 0000000..3073788
--- /dev/null
+++ b/po/or.gmo
Binary files differ
diff --git a/po/or.po b/po/or.po
new file mode 100644
index 0000000..e086c51
--- /dev/null
+++ b/po/or.po
@@ -0,0 +1,689 @@
+# Oriya translation of gst-plugins-0.8.3.pot.
+# Copyright (C) 2004, Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-0.8.3 package.
+# Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004.
+# $Id$
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-0.8.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-09-27 13:32+0530\n"
+"Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
+"Language-Team: Oriya <gora_mohanty@yahoo.co.in>\n"
+"Language: or\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "ଅନୁଚ୍ଚ ସ୍ବର"
+
+msgid "Treble"
+msgstr "ଉଚ୍ଚ ସ୍ବର"
+
+msgid "PCM"
+msgstr "ପି.ସି.ଏମ."
+
+msgid "Synth"
+msgstr "ସିନ୍ଥେସାଇଜର"
+
+msgid "Line-in"
+msgstr "ଲାଇନ-ଇନ"
+
+msgid "CD"
+msgstr "ସି.ଡି."
+
+msgid "Microphone"
+msgstr "ମାଇକ୍ରୋଫୋନ୍"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+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."
+msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ଓ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+msgid "Could not open CD device for reading."
+msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "\"%s\" ଯନ୍ତ୍ରରେ ଲେଖିହେଲା ନାହିଁ."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "\"%s\" ଫାଇଲ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+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 "Error while writing to file \"%s\"."
+#~ msgstr "\"%s\" ଫାଇଲ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ."
+
+#~ msgid "No device specified."
+#~ msgstr "କୌଣସି ଯନ୍ତ୍ର ଉଲ୍ଲେଖିତ କରାଯାଇ ନାହିଁ."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଅବସ୍ଥିତ ନାହିଁ."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "\"%s\" ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ର ପୂର୍ବରୁ ଅନ୍ଯ କାରିକା ଦ୍ବାରା ବ୍ଯବହାର କରାଯାଉଛି."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ଓ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "କୌଣସି ଯନ୍ତ୍ର ଉଲ୍ଲେଖିତ କରାଯାଇ ନାହିଁ."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "\"%s\" ଫାଇଲ ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+#~ msgid "No file name specified."
+#~ msgstr "କୌଣସି ଫାଇଲନାମ ଉଲ୍ଲେଖିତ ହୋଇ ନାହିଁ."
+
+#~ msgid "Device is not open."
+#~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇ ନାହିଁ."
+
+#~ msgid "Device is open."
+#~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇଚ୍ଛି."
+
+#~ msgid "Could not open vfs file \"%s\" for reading."
+#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+#~ msgid "No filename given."
+#~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ"
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#~ msgid "No or invalid input audio, AVI stream will be corrupt."
+#~ 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"
+#~ "ଦୟା କରି ଗୋଟିଏ ଉପାଦାନ ସ୍ଥାପିତ କରି ପୁନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ."
+
+#~ 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 close audio device \"%s\"."
+#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Could not open video device \"%s\" for writing."
+#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#~ msgid "Could not close video device \"%s\"."
+#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Could not access device \"%s\", check its permissions."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ବ୍ଯବହାର କରିହେଲା ନାହିଁ, ତାହାର ଅନୁମତି ଦେଖନ୍ତୁ."
+
+#~ msgid "Could not open device \"%s\" for writing."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#~ msgid "Could not open device \"%s\" for reading."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ."
+
+#, fuzzy
+#~ msgid "Your OSS device doesn't support mono or stereo."
+#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Your OSS device could not be probed correctly"
+#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ."
+
+#~ msgid "Volume"
+#~ msgstr "ପ୍ରବଳତା"
+
+#~ msgid "Speaker"
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ."
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644
index 0000000..4d885c3
--- /dev/null
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..3ed8d76
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,619 @@
+# Polish translation for gst-plugins-base.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2007-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-26 18:01+0200\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Główny"
+
+msgid "Bass"
+msgstr "Niskie"
+
+msgid "Treble"
+msgstr "Wysokie"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Syntezator"
+
+msgid "Line-in"
+msgstr "Wejście"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "Głośnik PC"
+
+msgid "Playback"
+msgstr "Odtwarzanie"
+
+msgid "Capture"
+msgstr "Nagrywanie"
+
+msgid "Could not open device for playback in mono mode."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania w trybie mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania w trybie stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania w trybie %d-"
+"kanałowym."
+
+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."
+msgstr "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania."
+
+msgid "Could not open device for recording in mono mode."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do nagrywania w trybie mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do nagrywania w trybie stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do nagrywania w trybie %d-"
+"kanałowym."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nie udało się otworzyć urządzenia dźwiękowego do nagrywania. Urządzenie jest "
+"używane przez inną aplikację."
+
+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 CD device for reading."
+msgstr "Nie udało się otworzyć urządzenia CD do odczytu."
+
+msgid "Could not seek CD."
+msgstr "Nie udało się ustawić położenia na CD."
+
+msgid "Could not read CD."
+msgstr "Nie udał się odczyt CD."
+
+msgid "Internal data stream error."
+msgstr "Błąd wewnętrzny strumienia danych."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Wtyczka %s jest wymagana do otworzenia tego strumienia, ale nie jest "
+"zainstalowana."
+
+msgid "Could not determine type of stream"
+msgstr "Nie udało się określić typu strumienia"
+
+msgid "This appears to be a text file"
+msgstr "To wygląda na plik tekstowy"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Brak elementu '%s' - proszę sprawdzić instalację GStreamera."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Nie ma żadnego z elementów autovideosink i %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Nie ma elementu autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Skonfigurowany element videosink %s nie działa."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Żaden z elementów autovideosink i %s nie działa."
+
+msgid "The autovideosink element is not working."
+msgstr "Element autovideosink nie działa."
+
+msgid "Custom text sink element is not usable."
+msgstr "Własny element text sink nie jest użyteczny."
+
+msgid "No volume control found"
+msgstr "Nie znaleziono sterowania głośnością"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Nie ma żadnego z elementów autoaudiosink i %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Nie ma elementu autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Skonfigurowany element audiosink %s nie działa."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Żaden z elementów autoaudiosink i %s nie działa."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Element autoaudiosink nie działa."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Nie można odtwarzać pliku tekstowego bez obrazu lub wizualizacji."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Brak dostępnego dekodera dla typu '%s'."
+
+msgid "No URI specified to play from."
+msgstr "Nie podano URI do odtwarzania."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Niepoprawne URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Tego strumienia jeszcze nie można odtworzyć."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nie ma zaimplementowanej obsługi URI dla \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Element źródłowy jest niepoprawny."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Błąd podczas wysyłania danych do \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Połączenie z %s:%d odrzucone."
+
+msgid "Can't record audio fast enough"
+msgstr "Nie można zapisywać danych dźwiękowych wystarczająco szybko"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Nie udało się odczytać znacznika: za mało danych"
+
+msgid "track ID"
+msgstr "ID ścieżki"
+
+msgid "MusicBrainz track ID"
+msgstr "ID ścieżki wg MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID artysty"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID artysty wg MusicBrainz"
+
+msgid "album ID"
+msgstr "ID albumu"
+
+msgid "MusicBrainz album ID"
+msgstr "ID albumu wg MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID artysty albumu ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID artysty albumu wg MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "TRM ID ścieżki"
+
+msgid "MusicBrainz TRM ID"
+msgstr "TRM ID wg MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "szybkość migawki"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Szybkość migawki zastosowana przy robieniu zdjęcia, w sekundach"
+
+msgid "capturing focal ratio"
+msgstr "współczynnik przysłony"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Przysłona (liczba f) użyta przy robieniu zdjęcia"
+
+msgid "capturing focal length"
+msgstr "ogniskowa obiektywu"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Długość ogniskowej obiektywu użyta przy robieniu zdjęcia, w mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "współczynnik powiększenia cyfrowego"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Współczynnik powiększenia cyfrowego użytego przy robieniu zdjęcia"
+
+msgid "capturing iso speed"
+msgstr "czyłość ISO"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Czułość ISO użyta przy robieniu zdjęcia"
+
+msgid "capturing exposure program"
+msgstr "program ekspozycji"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Program ekspozycji użyty przy robieniu zdjęcia"
+
+msgid "capturing exposure mode"
+msgstr "tryb ekspozycji"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Tryb ekspozycji użyty przy robieniu zdjęcia"
+
+msgid "capturing exposure compensation"
+msgstr "kompensacja ekspozycji"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Kompensacja ekspozycji użyta przy robieniu zdjęcia"
+
+msgid "capturing scene capture type"
+msgstr "Tyb sceny zdjęcia"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Tryb sceny użyty przy robieniu zdjęcia"
+
+msgid "capturing gain adjustment"
+msgstr "korekcja zdjęcia"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Całkowita korekcja zastosowana dla zdjęcia"
+
+msgid "capturing white balance"
+msgstr "balans bieli"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Tryb balansu bieli ustawiony przy robieniu zdjęcia"
+
+msgid "capturing contrast"
+msgstr "kontrast zdjęcia"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Kierunek korekty kontrastu zastosowanej przy robieniu zdjęcia"
+
+msgid "capturing saturation"
+msgstr "nasycenie zdjęcia"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Kierunek korekty nasycenia zastosowanej przy robieniu zdjęcia"
+
+msgid "capturing sharpness"
+msgstr "ostrość zdjęcia"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Kierunek korekty ostrości zastosowanej przy robieniu zdjęcia"
+
+msgid "capturing flash fired"
+msgstr "użycie flesza"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Czy flesz był uruchomiony przy robieniu zdjęcia"
+
+msgid "capturing flash mode"
+msgstr "tryb flesza"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Tryb flesza wybrany przy robieniu zdjęcia"
+
+msgid "capturing metering mode"
+msgstr "tryb pomiaru dla zdjęcia"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Tryb pomiaru użyty przy określaniu ekspozycji dla zdjęcia"
+
+msgid "capturing source"
+msgstr "źródło zdjęcia"
+
+msgid "The source or type of device used for the capture"
+msgstr "Źródło lub rodzaj urządzenia użytego do zrobienia zdjęcia"
+
+msgid "image horizontal ppi"
+msgstr "rozdzielczość pozioma"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Rozdzielczość pozioma nośnika w pikselach na cal"
+
+msgid "image vertical ppi"
+msgstr "rozdzielczość pionowa"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Rozdzielczość pionowa nośnika w pikselach na cal"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Ta płyta CD nie ma ścieżek dźwiękowych"
+
+msgid "ID3 tag"
+msgstr "Znacznik ID3"
+
+msgid "APE tag"
+msgstr "Znacznik APE"
+
+msgid "ICY internet radio"
+msgstr "Radio internetowe ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless (bezstratne CYUV)"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "Kodowanie RLE"
+
+msgid "Sami subtitle format"
+msgstr "Format podpisów Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Format podpisów TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Format podpisów Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nieskompresowany YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Nieskompresowany obraz w szarości"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nieskompresowany YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nieskompresowany %d-bitowy %s z paletą"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 w wersji %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nieskompresowany YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Surowe %d-bitowy dźwięk PCM"
+
+msgid "Audio CD source"
+msgstr "Źródło Audio CD"
+
+msgid "DVD source"
+msgstr "Źródło DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Źródło RTSP (Real Time Streaming Protocol)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Źródło protokołu MMS (Microsoft Media Server)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Źródło protokołu %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Depayloader obrazu RTP %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Depayloader dźwięku RTP %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Depayloader RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demuxer %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Dekoder %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Payloader obrazu RTP %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Payloader dźwięku RTP %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Payloader RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Muxer %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Koder %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Element GStreamera %s"
+
+msgid "Unknown source element"
+msgstr "Nieznany element źródłowy"
+
+msgid "Unknown sink element"
+msgstr "Nieznany element pochłaniający"
+
+msgid "Unknown element"
+msgstr "Nieznany element"
+
+msgid "Unknown decoder element"
+msgstr "Nieznany element dekodujący"
+
+msgid "Unknown encoder element"
+msgstr "Nieznany element kodujący"
+
+msgid "Plugin or element of unknown type"
+msgstr "Wtyczka lub element nieznanego typu"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nieskompresowany planarny YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nieskompresowany planarny YUV 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nieskompresowany spakowany YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nieskompresowany spakowany YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nieskompresowany spakowany YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nieskompresowany spakowany YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nieskompresowany spakowany YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nieskompresowany planarny YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nieskompresowany planarny YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nieskompresowany czarno-biały plan Y"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Surowy dźwięk PCM"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Surowy %d-bitowy dźwięk zmiennoprzecinkowy"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Surowy dźwięk zmiennoprzecinkowy"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nie udało się otworzyć pliku vfs \"%s\" do zapisu: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nie podano nazwy pliku"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nie udało się zamknąć pliku vfs \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Błąd podczas zapisu do pliku \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Niepoprawne URI podpisów \"%s\", podpisy wyłączone."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Strumieni RTSP jeszcze nie można odtwarzać."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nie udało się utworzyć elementu \"decodebin\"."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Wykryto tylko strumień podpisów. Albo żądano wczytania pliku podpisów lub "
+#~ "innego rodzaju pliku tekstowego, albo nie rozpoznano pliku "
+#~ "multimedialnego."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Nie ma zainstalowanego dekodera do obsługi tego pliku. Być może trzeba "
+#~ "zainstalować potrzebne wtyczki."
+
+#~ msgid "This is not a media file"
+#~ msgstr "To nie jest plik multimedialny"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Wykryto strumień podpisów, ale brak strumienia obrazu."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Nie ma żadnego z elementów autovideosink i xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Nie ma żadnego z elementów autoaudiosink i alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Nie określono urządzenia."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Urządzenie \"%s\" nie istnieje."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Urządzenie \"%s\" jest już używane."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nie udało się otworzyć urządzenia \"%s\" do odczytu i zapisu."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Błąd podczas wysyłania danych nagłówka gdp do \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Błąd podczas wysyłania danych gdp do \"%s:%d\"."
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644
index 0000000..18b291f
--- /dev/null
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..2073f40
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,652 @@
+# Brazilian Portuguese translation of gst-plugins-base.
+# Copyright (C) 2008-2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Fabrício Godoy <skarllot@gmail.com>, 2008-2011.
+#
+# PCM -> PCM
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base-0.10.31.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-01-08 01:02-0300\n"
+"Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\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 "Master"
+msgstr "Principal"
+
+msgid "Bass"
+msgstr "Grave"
+
+msgid "Treble"
+msgstr "Agudo"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizador"
+
+msgid "Line-in"
+msgstr "Entrada de linha"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Microfone"
+
+msgid "PC Speaker"
+msgstr "Alto-falante do PC"
+
+msgid "Playback"
+msgstr "Reprodução"
+
+msgid "Capture"
+msgstr "Captura"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Não foi possível abrir o dispositivo para reprodução em mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Não foi possível abrir o dispositivo para reprodução em estéreo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Não foi possível abrir o dispositivo para reprodução com %d canal(is)."
+
+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."
+msgstr "Não foi possível abrir o dispositivo de áudio para reprodução."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Não foi possível abrir o dispositivo para gravação em mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Não foi possível abrir o dispositivo para gravação em estéreo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Não foi possível abrir o dispositivo para gravação com %d canal(is)."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Não foi possível abrir o dispositivo de áudio para gravação. O dispositivo "
+"está sendo usado por outro aplicativo."
+
+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 CD device for reading."
+msgstr "Não foi possível abrir o dispositivo de CD para leitura."
+
+msgid "Could not seek CD."
+msgstr "Não foi possível buscar no CD."
+
+msgid "Could not read CD."
+msgstr "Não foi possível ler o CD."
+
+msgid "Internal data stream error."
+msgstr "Erro interno no fluxo de dados."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"O plug-in %s é necessário para reproduzir este fluxo, mas não está instalado."
+
+msgid "Could not determine type of stream"
+msgstr "Não foi possível determinar o tipo de fluxo"
+
+msgid "This appears to be a text file"
+msgstr "Este parece ser um arquivo de texto"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+"O elemento \"%s\" está faltando, verifique a instalação do seu GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Os elementos autovideosink e %s estão faltando."
+
+msgid "The autovideosink element is missing."
+msgstr "O elemento autovideosink está faltando."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "O videosink configurado %s não está funcionando."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Os elementos autovideosink e %s não estão funcionando."
+
+msgid "The autovideosink element is not working."
+msgstr "O elemento autovideosink não está funcionando."
+
+msgid "Custom text sink element is not usable."
+msgstr "O elemento consumidor personalizado de texto não é utilizável."
+
+msgid "No volume control found"
+msgstr "Nenhum controle de volume encontrado"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Os elementos autoaudiosink e %s estão faltando."
+
+msgid "The autoaudiosink element is missing."
+msgstr "O elemento autoaudiosink não está faltando."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "O audiosink configurado %s não está funcionando."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Os elementos autoaudiosink e %s não estão funcionando."
+
+msgid "The autoaudiosink element is not working."
+msgstr "O elemento autoaudiosink não está funcionando."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Não é possível reproduzir um arquivo de texto sem vídeo ou visualização."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Decodificador não disponível para o tipo \"%s\"."
+
+msgid "No URI specified to play from."
+msgstr "Nenhum URI especificado para reprodução."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "O URI \"%s\" é inválido."
+
+msgid "This stream type cannot be played yet."
+msgstr "Este tipo de fluxo ainda não pode ser reproduzido."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nenhum manipulador para o URI \"%s\" foi implementado."
+
+msgid "Source element is invalid."
+msgstr "O elemente de origem é inválido."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Erro ao enviar dados para \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "A conexão para %s:%d foi recusada."
+
+msgid "Can't record audio fast enough"
+msgstr "Não é possível gravar o áudio rápido suficiente"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Falha ao ler etiqueta: dados insuficientes"
+
+msgid "track ID"
+msgstr "ident. da trilha"
+
+msgid "MusicBrainz track ID"
+msgstr "ident. da trilha no MusicBrainz"
+
+msgid "artist ID"
+msgstr "ident. do artista"
+
+msgid "MusicBrainz artist ID"
+msgstr "ident. do artista no MusicBrainz"
+
+msgid "album ID"
+msgstr "ident. do álbum"
+
+msgid "MusicBrainz album ID"
+msgstr "ident. do álbum no MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ident. do artista do álbum"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ident. do artista do álbum no MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ident. da trilha TRM"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ident. da trilha TRM no MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "velocidade do obturador ao capturar"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Velocidade do obturador usada ao capturar uma imagem, em segundos"
+
+msgid "capturing focal ratio"
+msgstr "taxa focal ao capturar"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Taxa focal usada ao capturar a imagem, f-number"
+
+msgid "capturing focal length"
+msgstr "distância focal ao capturar"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Distância focal das lentes usada ao capturar a imagem, em mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "taxa de zoom digital ao capturar"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Taxa de zoom digital usada ao capturar uma imagem"
+
+msgid "capturing iso speed"
+msgstr "velocidade ISO ao capturar"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "A velocidade ISO usada ao capturar uma imagem"
+
+msgid "capturing exposure program"
+msgstr "programa de exposição ao capturar"
+
+msgid "The exposure program used when capturing an image"
+msgstr "O programa de exposição usado ao capturar uma imagem"
+
+msgid "capturing exposure mode"
+msgstr "modo de exposição ao capturar"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "O modo de exposição usado ao capturar uma imagem"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "modo de exposição ao capturar"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "O modo de exposição usado ao capturar uma imagem"
+
+msgid "capturing scene capture type"
+msgstr "tipo de captura de cena ao capturar"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "O modo de captura de cena usado ao capturar uma imagem"
+
+msgid "capturing gain adjustment"
+msgstr "ajuste de ganho ao capturar"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "O ajuste de ganho geral aplicado na imagem"
+
+msgid "capturing white balance"
+msgstr "balanço de branco ao capturar"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "O modo de balanço de branco definido ao capturar uma imagem"
+
+msgid "capturing contrast"
+msgstr "contraste ao capturar"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+"O procedimento de processamento de contraste aplicado ao capturar uma imagem"
+
+msgid "capturing saturation"
+msgstr "saturação ao capturar"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+"O procedimento de processamento de saturação aplicado ao capturar uma imagem"
+
+msgid "capturing sharpness"
+msgstr "nitidez ao capturar"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+"O procedimento de processamento de nitidez aplicado ao capturar uma imagem"
+
+msgid "capturing flash fired"
+msgstr "disparar flash ao capturar"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Define se o flash é disparado ao capturar uma imagem"
+
+msgid "capturing flash mode"
+msgstr "modo de flash ao capturar"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "O modo de flash selecionado ao capturar uma imagem"
+
+msgid "capturing metering mode"
+msgstr "modo de medição de luz ao capturar"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"O modo de medição de luz usado ao determinar a exposição para captura de uma "
+"imagem"
+
+msgid "capturing source"
+msgstr "fonte ao capturar"
+
+msgid "The source or type of device used for the capture"
+msgstr "A fonte ou tipo de dispositivo usado para a captura"
+
+msgid "image horizontal ppi"
+msgstr "PPI horizontal da imagem"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Densidade de pixels horizontais desejado para a mídia (imagem/vídeo), em PPI"
+
+msgid "image vertical ppi"
+msgstr "PPI vertical da imagem"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Densidade de pixels verticais desejado para a mídia (imagem/vídeo), em PPI"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Este CD não tem trilhas de áudio"
+
+msgid "ID3 tag"
+msgstr "Etiqueta ID3"
+
+msgid "APE tag"
+msgstr "Etiqueta APE"
+
+msgid "ICY internet radio"
+msgstr "Rádio on-line ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Áudio Sem Perdas da Apple (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Codec Livre de Áudio Sem Perdas (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Áudio Real Sem Perdas (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Mídia de Voz do Windows (WMS)"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Sem Perdas"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH Sem Perdas"
+
+msgid "Run-length encoding"
+msgstr "Codificação Run-length"
+
+msgid "Sami subtitle format"
+msgstr "Formato de legendas Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Formato de legendas TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Formato de legendas Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV sem compressão"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Imagem Monocromática Sem Compressão"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV sem compressão"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "%2$s de %1$d bits com paletas sem compressão"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Versão %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV sem compressão"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Áudio PCM Raw de %d bits"
+
+msgid "Audio CD source"
+msgstr "Origem: CD de áudio"
+
+msgid "DVD source"
+msgstr "Origem: DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Origem: Protocolo de Fluxo Contínuo em Tempo Real (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Origem: protocolo do Servidor de Mídia da Microsoft (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Origem: protocolo %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "decodificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "decodificador de áudio RTP %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "decodificador RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demultiplexador %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Decodificador %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "codificador de vídeo RTP %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "codificador de áudio RTP %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "codificador RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Multiplexador %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Codificador %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Elemento \"%s\" do GStreamer"
+
+msgid "Unknown source element"
+msgstr "Elemento de origem desconhecida"
+
+msgid "Unknown sink element"
+msgstr "Elemento consumidor desconhecido"
+
+msgid "Unknown element"
+msgstr "Elemento desconhecido"
+
+msgid "Unknown decoder element"
+msgstr "Elemento decodificador desconhecido"
+
+msgid "Unknown encoder element"
+msgstr "Elemento codificador desconhecido"
+
+msgid "Plugin or element of unknown type"
+msgstr "Elemento ou plug-in de tipo desconhecido"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 plano sem compressão"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YVU 4:2:0 plano sem compressão"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 empacotado sem compressão"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 empacotado sem compressão"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU 4:1:0 empacotado sem compressão"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 empacotado sem compressão"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 empacotado sem compressão"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 plano sem compressão"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 plano sem compressão"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Plano Y em preto e branco sem compressão"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Áudio PCM Raw"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Áudio Raw de ponto-flutuante de %d bits"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Áudio Raw de ponto-flutuante"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Não foi possível abrir o arquivo VFS \"%s\" para escrita: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Não foi fornecido um nome de arquivo"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Não foi possível fechar o arquivo VFS \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Erro ao gravar no arquivo \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "O URI \"%s\" para legenda é inválido, legendas desabilitadas."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Os fluxos RTSP ainda não podem ser reproduzidos."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Não foi possível criar o elemento \"decodebin\"."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Apenas um fluxo de legendas foi detectado. Ou você está carregando um "
+#~ "arquivo de legenda ou algum outro tipo de arquivo de texto, ou o arquivo "
+#~ "de mídia não é reconhecido."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Você não tem um decodificador instalado para manipular este arquivo. Você "
+#~ "deveria instalar os plug-ins necessários."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Este não é um arquivo de mídia"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Um fluxo de legenda foi detectado, mas nenhum fluxo de vídeo."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Os elementos autovideosink e xvimagesink estão faltando."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Os elementos autoaudiosink e alsasink estão faltando."
+
+#~ msgid "No device specified."
+#~ msgstr "Nenhum dispositivo especificado."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "O dispositivo \"%s\" não existe."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "O dispositivo \"%s\" já está sendo usado."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Não foi possível abrir o dispositivo \"%s\" para leitura e escrita."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Erro ao enviar o cabeçalho de dados GDP para \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Erro ao enviar codificação de dados GDP para \"%s:%d\"."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Não foi possível criar o elemento \"decodebin2\"."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Não foi possível criar o elemento \"queue2\"."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Não foi possível criar o elemento \"typefind\"."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Não é possível reproduzir legendas de texto e subimagens."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Nenhum diretório temporário especificado."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Não foi possível criar o arquivo temporário \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Não foi possível abrir o arquivo \"%s\" para leitura."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Erro interno no fluxo de dados."
+
+#~ msgid "No file name specified."
+#~ msgstr "Não foi especificado um nome de arquivo."
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 0000000..dacf7d3
--- /dev/null
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..8c125d8
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,614 @@
+# Romanian translation for gst-plugins-base
+# This file is distributed under the same license as the gst-plugins-base package.
+# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.29.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-08-16 01:21+0300\n"
+"Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\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"
+
+msgid "Master"
+msgstr "Principal"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Înalte"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Linie intrare"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Microfon"
+
+msgid "PC Speaker"
+msgstr "Difuzor PC"
+
+msgid "Playback"
+msgstr "Redare"
+
+msgid "Capture"
+msgstr "Captură"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nu s-a putut deschide dispozitivul pentru redare în modul mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nu s-a putut deschide dispozitivul pentru redare în modul stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Nu s-a putut deschide dispozitivul pentru redare în modul %d-canal."
+
+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."
+msgstr "Nu s-a putut deschide dispozitivul audio pentru redare."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nu s-a putut deschide dispozitivul pentru înregistrare în modul mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr ""
+"Nu s-a putut deschide dispozitivul pentru înregistrare în modul stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr ""
+"Nu s-a putut deschide dispozitivul pentru înregistrare în modul %d-canal"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nu s-a putut deschide dispozitivul audio pentru înregistrare. Dispozitivul "
+"este folosit de o altă aplicație."
+
+msgid "Could not open audio device for recording."
+msgstr "Nu s-a putut deschide dispozitivul audio pentru înregistrare."
+
+msgid "Could not open CD device for reading."
+msgstr "Nu s-a putut deschide unitatea CD pentru redare."
+
+msgid "Could not seek CD."
+msgstr "Nu s-a putut accesa CD-ul."
+
+msgid "Could not read CD."
+msgstr "Nu s-a putut citi CD-ul."
+
+msgid "Internal data stream error."
+msgstr "Eroare internă a fluxului de date."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Un modul de extensie %s este necesar pentru a reda acest flux, dar acesta nu "
+"este instalat."
+
+msgid "Could not determine type of stream"
+msgstr "Nu s-a putut determina tipul fluxului"
+
+msgid "This appears to be a text file"
+msgstr "Acesta pare să fie un fișier text."
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Element %s lipsă - verificați instalarea GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Lipsește atât elementul autovideosink cât și %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Elementul autovideosink lipsește."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Videosink-ul configurat %s nu funcționează."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Nu funcționează atât elementul autovideosink cât și %s."
+
+msgid "The autovideosink element is not working."
+msgstr "Elementul autovideosink nu funcționează."
+
+msgid "Custom text sink element is not usable."
+msgstr "Elementul sink de text personalizat nu este utilizabil."
+
+msgid "No volume control found"
+msgstr "Nu s-a găsit niciun control de volum"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Lipsește atât elementul autoaudiosink cât și %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Elementul autoaudiosink lipsește."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Audiosink-ul configurat %s nu funcționează."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Nu funcționează atât elementul autoaudiosink cât și %s."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Elementul autoaudiosink nu funcționează."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Nu se poate reda un fișier text fără video sau vizualizări."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Niciun decodor disponibil pentru tipul „%s”."
+
+msgid "No URI specified to play from."
+msgstr "Nu s-a specificat URI pentru redare."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "URI „%s” nevalid."
+
+msgid "This stream type cannot be played yet."
+msgstr "Acest tip de flux nu poate fi redat încă."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Nicio rutină de tratare de URI implementată pentru „%s”."
+
+msgid "Source element is invalid."
+msgstr "Element sursă nevalid."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Eroare la trimiterea datelor către „%s:%d”."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Conexiunea la %s:%d a fost refuzată."
+
+msgid "Can't record audio fast enough"
+msgstr "Nu se poate înregistra sunetul destul de repede"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Citirea etichetei a eșuat: date insuficiente"
+
+msgid "track ID"
+msgstr "ID pistă"
+
+msgid "MusicBrainz track ID"
+msgstr "ID pistă MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID artist"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID artist MusicBrainz"
+
+msgid "album ID"
+msgstr "ID album"
+
+msgid "MusicBrainz album ID"
+msgstr "ID album MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID artist album"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID album artist MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "TRM ID pistă"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Acest CD nu conține piste audio"
+
+msgid "ID3 tag"
+msgstr "etichetă ID3"
+
+msgid "APE tag"
+msgstr "etichetă APE"
+
+msgid "ICY internet radio"
+msgstr "Radio Internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Audio fără pierdere (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Codec audio liber fără pierdere (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV fără pierdere"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH fără pierdere"
+
+msgid "Run-length encoding"
+msgstr "Codarea run-length"
+
+msgid "Sami subtitle format"
+msgstr "Format subtitrare Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Format subtitrare TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Format subtitrare Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV necomprimat"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Imagine gri necomprimată"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV necomprimat"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Paletizat la %d biți necomprimat %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 versiunea %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV necomprimat"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "PCM audio brut %d biți"
+
+msgid "Audio CD source"
+msgstr "Sursă CD audio"
+
+msgid "DVD source"
+msgstr "Sursă DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Sursă RTSP (protocol pentru flux în timp real)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Sursă protocol Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Sursă protocol %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Demuxer %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Decoder %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr "Muxer %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "codificator %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Element GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Element sursă necunoscut"
+
+msgid "Unknown sink element"
+msgstr "Element sink necunoscut"
+
+msgid "Unknown element"
+msgstr "Element necunoscut"
+
+msgid "Unknown decoder element"
+msgstr "Element decodor necunoscut"
+
+msgid "Unknown encoder element"
+msgstr "Element codor necunoscut"
+
+msgid "Plugin or element of unknown type"
+msgstr "Modul de extensie sau element de tip necunoscut"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Planar necomprimat YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Planar necomprimat YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Pachet necomprimat YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Pachet necomprimat YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Pachet necomprimat YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Pachet necomprimat YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Pachet necomprimat YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Planar necomprimat YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Planar necomprimat YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Plan-Y alb și negru necomprimat"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "PCM audio brut"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Audio în virgulă mobilă brut la %d biți"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Audio în virgulă mobilă brut"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nu s-a putut deschide fișierul vsf „%s\" pentru scriere: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Niciun nume de fișier dat."
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nu s-a putut închide fișierul vsf „%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Eroare la scrierea fișierului „%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "URI subtitrare „%s” nevalid, subtitrare dezactivată."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Fluxurile RTSP nu pot fi redate încă."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nu se poate crea elementul „decodebin”."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "A fost detectat doar un flux pentru subtitrare. Fie încărcați un fișier "
+#~ "de subtitrare sau un alt tip de fișier text, sau fișierul nu a fost "
+#~ "recunoscut."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Nu există instalat un decodor pentru deschiderea acestui fișier. Probabil "
+#~ "trebuie să instalați modulele de extensie necesare."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Acesta nu este un fișier media"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "A fost detectat un flux de subtitrare, dar nu există flux video."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Lipsesc ambele elemente autovideosink și xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Lipsesc ambele elemente autoaudiosink și alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Nu s-a specificat niciun dispozitiv."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Dispozitivul „%s” nu există."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Dispozitivul „%s” este deja folosit."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nu s-a putut deschide dispozitivul „%s” pentru citire și scriere."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Eroare la trimiterea antetului gdp către „%s:%d”."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Eroare la trimiterea conținutului gdp către „%s:%d”."
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644
index 0000000..9bb51c4
--- /dev/null
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..555cc25
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,630 @@
+# Translation for gst-plugins-base messages to Russian
+# This file is put in the public domain.
+#
+# Артём Попов <artfwo@gmail.com>, 2009.
+# Pavel Maryanov <acid_jack@ukr.net>, 2009.
+# Yuri Kozlov <yuray@komyakino.ru>, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-26 20:30+0400\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <gnu@mx.ru>\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 "Master"
+msgstr "Общий"
+
+msgid "Bass"
+msgstr "Низкие"
+
+msgid "Treble"
+msgstr "Высокие"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Синтезатор"
+
+msgid "Line-in"
+msgstr "Линейный вход"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Микрофон"
+
+msgid "PC Speaker"
+msgstr "Внутренний динамик"
+
+msgid "Playback"
+msgstr "Воспроизведение"
+
+msgid "Capture"
+msgstr "Съёмка"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Не удалось открыть устройство для воспроизведения в режиме моно."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Не удалось открыть устройство для воспроизведения в режиме стерео."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+"Не удалось открыть устройство для воспроизведения в %d-канальном режиме."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Не удалось открыть устройство для воспроизведения. Устройство используется "
+"другим приложением."
+
+msgid "Could not open audio device for playback."
+msgstr "Не удалось открыть устройство для воспроизведения."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Не удалось открыть устройство для записи в режиме моно."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Не удалось открыть устройство для записи в режиме стерео."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Не удалось открыть устройство для записи в %d-канальном режиме."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Не удалось открыть устройство для записи. Устройство используется другим "
+"приложением."
+
+msgid "Could not open audio device for recording."
+msgstr "Не удалось открыть устройство для записи."
+
+msgid "Could not open CD device for reading."
+msgstr "Не удалось открыть CD-устройство для чтения."
+
+msgid "Could not seek CD."
+msgstr "Не удалось сменить позицию воспроизведения CD."
+
+msgid "Could not read CD."
+msgstr "Не удалось прочитать диск."
+
+msgid "Internal data stream error."
+msgstr "Внутренняя ошибка потока данных."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Для воспроизведения этого потока требуется модуль %s, но он не установлен."
+
+msgid "Could not determine type of stream"
+msgstr "Не удалось определить тип потока"
+
+msgid "This appears to be a text file"
+msgstr "Этот файл является текстовым"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Отсутствует элемент «%s» — проверьте правильность установки GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Отсутствуют элементы autovideosink и %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Отсутствует элемент autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Настроенный videosink %s не работает."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Элементы autovideosink и %s не работают."
+
+msgid "The autovideosink element is not working."
+msgstr "Элемент autovideosink не работает."
+
+msgid "Custom text sink element is not usable."
+msgstr "Входной элемент пользовательского текста не работоспособен."
+
+msgid "No volume control found"
+msgstr "Не найден элемент управления громкостью"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Отсутствуют элементы autoaudiosink и %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Отсутствует элемент autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Настроенный audiosink %s не работает."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Элементы autoaudiosink и %s не работают."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Элемент autoaudiosink не работает."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Воспроизведение текстового файла без видео или видеотображения невозможно."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Для типа «%s» недоступен декодер."
+
+msgid "No URI specified to play from."
+msgstr "Не указан URI источника воспроизведения."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Неверный URI «%s»."
+
+msgid "This stream type cannot be played yet."
+msgstr "Воспроизведение этого потока в данный момент невозможно."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Для «%s» не реализован обработчик URI."
+
+msgid "Source element is invalid."
+msgstr "Неверный элемент источника."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Ошибка отправки данных в «%s:%d»."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "В соединении с %s:%d отказано."
+
+msgid "Can't record audio fast enough"
+msgstr "Невозможна запись аудио с достаточной скоростью"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Не удалось прочитать тег: недостаточно данных"
+
+msgid "track ID"
+msgstr "ID дорожки"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz ID дорожки"
+
+msgid "artist ID"
+msgstr "ID исполнителя"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz ID исполнителя"
+
+msgid "album ID"
+msgstr "ID альбома"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz ID альбома"
+
+msgid "album artist ID"
+msgstr "ID исполнителя альбома"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz ID исполнителя альбома"
+
+msgid "track TRM ID"
+msgstr "ID TRM дорожки"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr "выдержка при съёмке"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Выдержка при съёмке изображения, в секундах"
+
+msgid "capturing focal ratio"
+msgstr "диафрагменное число при съёмке"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Диафрагменное число (f) при съёмке изображения"
+
+msgid "capturing focal length"
+msgstr "фокусное расстояние при съёмке"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Фокусное расстояние зеркала при съёмке изображения, в мм"
+
+msgid "capturing digital zoom ratio"
+msgstr "коэффициент цифрового трансфокатора при съёмке"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Коэффициент цифрового трансфокатора при съёмке изображения"
+
+msgid "capturing iso speed"
+msgstr "чувствительность ISO при съёмке"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Чувствительность ISO при съёмке изображения"
+
+msgid "capturing exposure program"
+msgstr "программа экспозиции при съёмке"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Программа экспозиции при съёмке изображения"
+
+msgid "capturing exposure mode"
+msgstr "режим экспозиции при съёмке"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Режим экспозиции при съёмке изображения"
+
+msgid "capturing exposure compensation"
+msgstr "компенсация экспозиции при съёмке"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Компенсация экспозиции при съёмке изображения"
+
+msgid "capturing scene capture type"
+msgstr "тип сцены при съёмке"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Тип сцены при съёмке изображения"
+
+msgid "capturing gain adjustment"
+msgstr "регулировка усиления при съёмке"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Итоговая настройка усиления, применяемая к изображению"
+
+msgid "capturing white balance"
+msgstr "баланс белого при съёмке"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Режим баланса белого при съёмке изображения"
+
+msgid "capturing contrast"
+msgstr "контрастность при съёмке"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Направление обработки контраста при съёмке изображения"
+
+msgid "capturing saturation"
+msgstr "насыщенность при съёмке"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Направление обработки насыщенности при съёмке изображения"
+
+msgid "capturing sharpness"
+msgstr "резкость при съёмке"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Направление обработки резкости при съёмке изображения"
+
+msgid "capturing flash fired"
+msgstr "вспышка при съёмке"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Сработала ли вспышка при съёмке изображения"
+
+msgid "capturing flash mode"
+msgstr "режим вспышки при съёмке"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Выбранный режим для вспышки при съёмке изображения"
+
+msgid "capturing metering mode"
+msgstr "режим замера при съёмке"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Режим замера, использованный для определения экспозиции при съёмке "
+"изображения"
+
+msgid "capturing source"
+msgstr "источник для съёмки"
+
+msgid "The source or type of device used for the capture"
+msgstr "Источник или тип устройства, использованный для съёмки"
+
+msgid "image horizontal ppi"
+msgstr "изображение в ppi по горизонтали"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Горизонтальная плотность носителя (изображение/видео) в ppi"
+
+msgid "image vertical ppi"
+msgstr "изображение в ppi по вертикали"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Вертикальная плотность носителя (изображение/видео) в ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "На CD нет звуковых дорожек"
+
+msgid "ID3 tag"
+msgstr "ID3-тег"
+
+msgid "APE tag"
+msgstr "APE-тег"
+
+msgid "ICY internet radio"
+msgstr "Интернет-радио ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Lossless"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Lossless MSZH"
+
+msgid "Run-length encoding"
+msgstr "RLE-сжатие"
+
+msgid "Sami subtitle format"
+msgstr "Формат субтитров Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Формат субтитров TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Формат субтитров Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Несжатый YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Несжатое полутоновое изображение"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Несжатый YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Несжатое %d-битное %s-изображение с палитрой"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Версия %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Несжатый YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Несжатое %d-битное PCM-аудио"
+
+msgid "Audio CD source"
+msgstr "Источник аудио-CD"
+
+msgid "DVD source"
+msgstr "Источник DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Источник протокола Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Источник протокола Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Источник протокола %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "RTP-разгрузчик %s-видео"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "RTP-разгрузчик %s-аудио"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "RTP-разгрузчик %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Демуксер %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Декодер %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "RTP-нагрузчик %s-видео"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "RTP-нагрузчик %s-аудио"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "RTP-нагрузчик %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Муксер %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Кодировщик %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Элемент GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Неизвестный элемент-источник"
+
+msgid "Unknown sink element"
+msgstr "Неизвестный элемент-приёмник"
+
+msgid "Unknown element"
+msgstr "Неизвестный элемент"
+
+msgid "Unknown decoder element"
+msgstr "Неизвестный элемент-декодер"
+
+msgid "Unknown encoder element"
+msgstr "Неизвестный элемент-кодировщик"
+
+msgid "Plugin or element of unknown type"
+msgstr "Модуль или элемент неизвестного типа"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Несжатый планарный YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Несжатый планарный YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Несжатый смешанный YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Несжатый смешанный YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Несжатый смешанный YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Несжатый смешанный YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Несжатый смешанный YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Несжатый планарный YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Несжатый планарный YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Несжатая чёрно-белая Y-плоскость"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Несжатое PCM-аудио"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Несжатое %d-битное аудио с плавающей точкой"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Несжатое аудио с плавающей точкой"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Не удалось открыть vfs-файл «%s» для записи: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Не указано имя файла"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Не удалось закрыть vfs-файл «%s»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Ошибка записи в файл «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Неверный URI субтитров «%s», субтитры выключены."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Воспроизведение RTSP-потоков в данный момент невозможно."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Не удалось создать элемент «decodebin»."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Обнаружен только поток субтитров. Либо вы загружаете файл субтитров или "
+#~ "иной текстовый файл, либо медиа-файл не распознан."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Не установлен требуемый декодер для обработки этого файла. Возможно, вам "
+#~ "следует поставить необходимые модули."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Файл не является медиа-файлом"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Обнаружен только поток субтитров, поток видео не обнаружен."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Отсутствуют элементы autovideosink и xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Отсутствуют элементы autoaudiosink и alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Не указано устройство."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Устройство «%s» не существует."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Устройство «%s» уже используется."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Не удалось открыть устройство «%s» для чтения и записи."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Ошибка отправки данных заголовка gdp в «%s:%d»."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Ошибка отправки данных gdp в «%s:%d»."
+
+#~ msgid "No file name specified."
+#~ msgstr "Не указано имя файла."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Не удалось открыть файл «%s» для чтения."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Не удалось создать элемент «decodebin2»."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Не удалось создать элемент «queue2»."
diff --git a/po/sk.gmo b/po/sk.gmo
new file mode 100644
index 0000000..c92a053
--- /dev/null
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..15c0e1a
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,651 @@
+# Slovak translations for gst-plugins-base.
+# This file is put in the public domain.
+#
+# Peter Tuhársky <tuharsky@misbb.sk>, 2007, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-11-08 15:34+0100\n"
+"Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\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-Language: Slovak\n"
+"X-Poedit-Country: SLOVAKIA\n"
+
+msgid "Master"
+msgstr "Hlavný"
+
+msgid "Bass"
+msgstr "Basy"
+
+msgid "Treble"
+msgstr "Výšky"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synth"
+
+msgid "Line-in"
+msgstr "Line-in"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofón"
+
+msgid "PC Speaker"
+msgstr "Reproduktor"
+
+msgid "Playback"
+msgstr "Prehrávanie"
+
+msgid "Capture"
+msgstr "Zachytávanie"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Nepodarilo sa otvoriť zariadenie pre prehrávanie v režime mono."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Nepodarilo sa otvoriť zariadenie pre prehrávanie v režime stereo."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr ""
+"Nepodarilo sa otvoriť zariadenie pre prehrávanie v %d-kanálovom režime."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Nepodarilo sa otvoriť zvukové zariadenie pre prehrávanie. Zariadenie už "
+"používa iná aplikácia."
+
+msgid "Could not open audio device for playback."
+msgstr "Nepodarilo sa otvoriť zvukové zariadenie pre prehrávanie."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Nepodarilo sa otvoriť zariadenie pre nahrávanie v režime mono."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Nepodarilo sa otvoriť zariadenie pre nahrávanie v režime stereo."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Nepodarilo sa otvoriť zariadenie pre nahrávanie v %d-kanálovom režime."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Nepodarilo sa otvoriť zvukové zariadenie pre nahrávanie. Zariadenie už "
+"používa iná aplikácia."
+
+msgid "Could not open audio device for recording."
+msgstr "Nepodarilo sa otvoriť zvukové zariadenie pre nahrávanie."
+
+msgid "Could not open CD device for reading."
+msgstr "Nepodarilo sa otvoriť zariadenie CD na čítanie."
+
+msgid "Could not seek CD."
+msgstr "Nepodarilo sa nastaviť pozíciu na CD."
+
+msgid "Could not read CD."
+msgstr "Nepodarilo sa čítať CD."
+
+msgid "Internal data stream error."
+msgstr "Vnútorná chyba prúdu údajov."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"Na prehratie tohto prúdu údajov je vyžadovaný zásuvný modul %s, ktorý nie je "
+"nainštalovaný."
+
+msgid "Could not determine type of stream"
+msgstr "Nepodarilo sa zistiť typ prádu údajov"
+
+msgid "This appears to be a text file"
+msgstr "Tento súbor je asi textový"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Chýa prvok '%s' - skontrolujte svoju inštaláciu GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Chýbajú prvky autovideosink aj %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Chýba prvok autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Nastavený videosink %s nefunguje."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Nefungujú prvky autovideosink a %s."
+
+msgid "The autovideosink element is not working."
+msgstr "Nefunguje prvok autovideosink."
+
+msgid "Custom text sink element is not usable."
+msgstr "Používateľský textový prvok sink nie je použiteľný."
+
+msgid "No volume control found"
+msgstr "+Ziadny ovl8da4 hlasitosti sa nena3iel"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Chýbajú prvky autoaudiosink aj %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Chýba prvok autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Nastavený audiosink %s nefunguje."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Nefungujú prvky autoaudiosink aj %s."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Nefunguje prvok autoaudiosink."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Nemôžem prehrať textový súbor bez videa alebo vizualizácií."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Pre typ '%s' nie je k dispozícii dekodér."
+
+msgid "No URI specified to play from."
+msgstr "Nebolo špecifikované žiadne URI, z ktorého by sa dalo prehrávať."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Chybné URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Tento typ prúdu údajov sa teraz nedá prehrávať."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Pre \"%s\" nie je implementovaná obsluha."
+
+msgid "Source element is invalid."
+msgstr "Zdrojový prvok je chybný."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Chyba pri posielaní údajov do \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Spojenie s %s:%d bolo odmietnuté."
+
+msgid "Can't record audio fast enough"
+msgstr "Zvuk sa nedá nahrávať dostatočne rýchlo"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Načítanie značky zlyhalo: málo údajov"
+
+msgid "track ID"
+msgstr "ID stopy"
+
+msgid "MusicBrainz track ID"
+msgstr "ID stopy MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID umelca"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID umelca MusicBrainz"
+
+msgid "album ID"
+msgstr "ID albumu"
+
+msgid "MusicBrainz album ID"
+msgstr "ID albumu MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID umelca albumu"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID umelca albumu MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ID TRM stopy"
+
+msgid "MusicBrainz TRM ID"
+msgstr "ID TRM MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "zachytávacia rýchlosť uzávierky"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Rýchlosť uzávierky použitá pri zachytávaní obrázku, v sekundách"
+
+msgid "capturing focal ratio"
+msgstr "zachytávacií pomer F"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Pomer (číslo F) použitý pri zachytávaní obrázku"
+
+msgid "capturing focal length"
+msgstr "zachytávacia ohnisková vzdialenosť"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Ohnisková vzdialenosť objektívu pri zachytávaní obrázku, v mm"
+
+msgid "capturing digital zoom ratio"
+msgstr "zachytávací pomer digitálneho priblíženia"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Pomer digitálneho priblíženia použitý pri zachytávaní obrázku"
+
+msgid "capturing iso speed"
+msgstr "zachytávacia rýchlosť ISO"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Rýchlosť ISO použítá pri zachytávaní obrázku"
+
+msgid "capturing exposure program"
+msgstr "zachytávací program expozície"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Program expozície použitý pri zachytávaní obrázko"
+
+msgid "capturing exposure mode"
+msgstr "zachytávací režim expozície"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Režim expozície použitý pri zachytávaní obrázku"
+
+#, fuzzy
+msgid "capturing exposure compensation"
+msgstr "zachytávací režim expozície"
+
+#, fuzzy
+msgid "The exposure compensation used when capturing an image"
+msgstr "Režim expozície použitý pri zachytávaní obrázku"
+
+msgid "capturing scene capture type"
+msgstr "zachytávací typ zachytenia scény"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Režim zachytenia scény použitý pri zachytávaní obrázku"
+
+msgid "capturing gain adjustment"
+msgstr "zachytávacie nastavenie zisku"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Celkové nastavenie zisku aplikovaného na obrázok"
+
+msgid "capturing white balance"
+msgstr "zachytávacie vyváženie bielej"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Režim vyváženia bielej nastavený pri zachytávaní obrázku"
+
+msgid "capturing contrast"
+msgstr "zachytávací kontrast"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Smerovanie spracovania kontrastu použitého pri zachytávaní obrázku"
+
+msgid "capturing saturation"
+msgstr "zachytávacia sýtosť"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Smerovanie spracovania sýtosti použitého pri zachytávaní obrázku"
+
+msgid "capturing sharpness"
+msgstr "zachytávacia ostrosť"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Smerovanie spracovania ostrosti použitého pri zachytávaní obrázku"
+
+msgid "capturing flash fired"
+msgstr "zachytávací blesk"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Bol alebo nebol použitý blesk pri zachytávaní obrázku"
+
+msgid "capturing flash mode"
+msgstr "zachytávací režim blesku"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Vybraný režim blesku pri zachytávaní obrázku"
+
+msgid "capturing metering mode"
+msgstr "zachytávacie meranie blesku"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Režim merania blesku pri zisťovaní expozície pre zachytenie obrázku"
+
+msgid "capturing source"
+msgstr "zachytávací zdroj"
+
+msgid "The source or type of device used for the capture"
+msgstr "Zdroj alebo typ zariadenia použitý na zachytenie"
+
+msgid "image horizontal ppi"
+msgstr "vodorovné ppi obrázku"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Cieľová vodorovná hustota pixlov média (obrázku/videa) v ppi"
+
+msgid "image vertical ppi"
+msgstr "zvislé ppi obrázku"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Cieľová zvislá hustota pixlov média (obrázku/videa) v ppi"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Toto CD nemá zvukové stopy"
+
+msgid "ID3 tag"
+msgstr "ID3 značka"
+
+msgid "APE tag"
+msgstr "APE značka"
+
+msgid "ICY internet radio"
+msgstr "Internetové rádio ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Bezstratový zvuk Apple (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Slobodný bezstratový zvukový kodek (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Bezstratový verný zvuk (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Reč"
+
+msgid "CYUV Lossless"
+msgstr "Bezstratové CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Bezstratové MSZH"
+
+msgid "Run-length encoding"
+msgstr "Kódovanie počas prehrávania"
+
+msgid "Sami subtitle format"
+msgstr "Formát titulkov sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Titulkový formát TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Formát titulkov Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Nekomprimovaný šedotónový obrázok"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nekomprimovaný paletizovaný %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Verzie %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nekomprimovaný YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Surový %d-bit PCM zvuk"
+
+msgid "Audio CD source"
+msgstr "Zdroj zvukové CD"
+
+msgid "DVD source"
+msgstr "Zdroj DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Zdroj Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Zdroj protokolu Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "zdroj protokolu %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s dekodér"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s muxer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s enkodér"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Prvok GStreamera %s"
+
+msgid "Unknown source element"
+msgstr "Neznámy zdrojový prvok"
+
+msgid "Unknown sink element"
+msgstr "Neznámy prvok sink"
+
+msgid "Unknown element"
+msgstr "Neznámy prvok"
+
+msgid "Unknown decoder element"
+msgstr "Neznámy prvok dekodéra"
+
+msgid "Unknown encoder element"
+msgstr "Neznámy prvok enkodéra"
+
+msgid "Plugin or element of unknown type"
+msgstr "Neznámy typ zásuvného modulu alebo prvku"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nekomprimovaný planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nekomprimovaný planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nekomprimovaný pakovaný YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nekomprimovaný pakovaný YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nekomprimovaný pakovaný YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nekomprimovaný pakovaný YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nekomprimovaný pakovaný YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nekomprimovaný planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nekomprimovaný planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nekomprimovaný čierno-biely Y-plane"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Surový PCM zvuk"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Surový %d-bit zvuk s pohyblivou desatinnou čiarkou"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Surový zvuk s pohyblivou desatinnou čiarkou"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Nepodarilo sa otvoriť vfs súbor \"%s\" pre zápis: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nebol zadaný názov súboru"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Nepodarilo sa zatvoriť súbor \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Chyba pri zápise do súboru \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Chybné URI titulkov \"%s\", titulky zakázané."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP prúdy sa teraz nedajú prehrávať."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Nepodarilo sa vytvoriť prvok \"decodebin\""
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Bol zistený iba prúd titulkov. Buď načítavate titulkový súbor alebo "
+#~ "nejaký iný typ textového súboru, alebo ide o neznámy typ mediálneho "
+#~ "súboru."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Nemáte nainštalovaný dekodér pre tento typ súboru. Zrejme bude potrebné "
+#~ "nainštalovať príslušné zásuvné moduly."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Toto nie je mediálny súbor"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Bol zistený prúd titulkov, ale bez video prúdu údajov."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Chýbajú prvky autovideosink aj xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Chýbajú prvky autoaudiosink aj alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Nebolo zadané zariadenie."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Zariadenie \"%s\" neexistuje."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Zariadenie \"%s\" sa už používa."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Nepodarilo sa otvoriť zariadenie \"%s\" pre čítanie a zápis."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Chyba pri posielaní hlavičky gdp údajov do \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Chyba pri posielaní gdp záťažových údajov do \"%s:%d\"."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Nemôžem zobrazovať naraz textové titulky aj podobrázky."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Nebol zadaný dočasný adresár (Temp)."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Nepodarilo sa vytvoriť dočasný súbor \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Nepodarilo sa otvoriť súbor \"%s\" na čítanie."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Vnútorná chyba prúdu údajov."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Nepodarilo sa vytvoriť prvok \"decodebin2\"."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Nepodarilo sa vytvoriť prvok \"queue2\"."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Nepodarilo sa vytvoriť prvok \"typefind\""
+
+#~ msgid "No file name specified."
+#~ msgstr "Nebolo zadané meno súboru."
+
+#~ msgid "artist sortname"
+#~ msgstr "katalógové meno umelca"
+
+#~ msgid "MusicBrainz artist sortname"
+#~ msgstr "katalógové meno umelca pre MusicBrainz"
diff --git a/po/sl.gmo b/po/sl.gmo
new file mode 100644
index 0000000..a8ed7dd
--- /dev/null
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..a65c6af
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,644 @@
+# Slovenian translation for gst-plugins-base.
+# Copyright (C) 2005 - 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Matej Urbančič <matej.urban@gmail.com>, 2010.
+# Klemen Košir <klemen.kosir@gmx.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-26 15:56+0100\n"
+"Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
+"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\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 "Master"
+msgstr "Glavni"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Visoki toni"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizator"
+
+msgid "Line-in"
+msgstr "Analogni vhod"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "Računalniški zvočnik"
+
+msgid "Playback"
+msgstr "Predvajanje"
+
+msgid "Capture"
+msgstr "Zajemanje"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Naprave ni mogoče odpreti za predvajanje v mono načinu."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Naprave ni mogoče odpreti za predvajanje v stereo načinu."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Naprave ni mogoče odpreti za predvajanje v %d-kanalnem načinu."
+
+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."
+msgstr "Zvočne naprave ni mogoče odpreti za predvajanje."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Naprave ni mogoče odpreti za snemanje v mono načinu."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Naprave ni mogoče odpreti za snemanje v stereo načinu."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Naprave ni mogoče odpreti za snemanje v %d-kanalnem načinu."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Zvočne naprave ni mogoče odpreti za snemanje. Napravo uporablja drug program."
+
+msgid "Could not open audio device for recording."
+msgstr "Zvočne naprave ni mogoče odpreti za snemanje."
+
+msgid "Could not open CD device for reading."
+msgstr "Naprave CD ni mogoče odpreti za branje."
+
+msgid "Could not seek CD."
+msgstr "Po CD-ju ni mogoče iskati."
+
+msgid "Could not read CD."
+msgstr "CD-ja ni mogoče prebrati."
+
+msgid "Internal data stream error."
+msgstr "Notranja napaka pretoka podatkov."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Za predvajanje tega pretoka je potreben vstavek %s, ki pa ni nameščen."
+
+msgid "Could not determine type of stream"
+msgstr "Vrste pretoka ni mogoče določiti."
+
+msgid "This appears to be a text file"
+msgstr "Datoteka je videti kot besedilna datoteka"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Predmet '%s' manjka - preverite namestitev paketa GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Predmeta autovideosink in %s manjkata."
+
+msgid "The autovideosink element is missing."
+msgstr "Predmet autovideosink manjka."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Nastavljeni predmet videosink %s ne deluje."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Predmeta autovideosink in %s ne delujeta."
+
+msgid "The autovideosink element is not working."
+msgstr "Predmet autovideosink ne deluje."
+
+msgid "Custom text sink element is not usable."
+msgstr "Predmet ponora besedila po meri ni uporaben."
+
+msgid "No volume control found"
+msgstr "Nadzornika glasnosti ni mogoče najti"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Predmeta autoaudiosink in %s manjkata."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Predmet autoaudiosink manjka."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Nastavljeni predmet autosink %s ne deluje."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Predmeta autovideosink in %s ne delujeta."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Predmet autovideosink ne deluje."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Besedilne datoteke ni mogoče predvajati brez videa ali predočenja."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Za vrsto \"%s\" ni ustreznega odkodirnika."
+
+msgid "No URI specified to play from."
+msgstr "Ni navedenega naslova URI za predvajanje."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Neveljaven URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Te vrste pretoka še ni mogoče predvajati."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Ni ročnika naslovov URI za \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Izvorni predmet je neveljaven."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Napaka med pošiljanjem podatkov na \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Povezava s %s:%d zavrnjena."
+
+msgid "Can't record audio fast enough"
+msgstr "Ni mogoče dovolj hitro snemati zvoka"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Oznake ni mogoče prebrati: ni dovolj podatkov"
+
+msgid "track ID"
+msgstr "ID sledi"
+
+msgid "MusicBrainz track ID"
+msgstr "ID sledi MusicBrainz"
+
+msgid "artist ID"
+msgstr "ID izvajalca"
+
+msgid "MusicBrainz artist ID"
+msgstr "ID izvajalca MusicBrainz"
+
+msgid "album ID"
+msgstr "ID albuma"
+
+msgid "MusicBrainz album ID"
+msgstr "ID albuma MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ID izvajalca albuma"
+
+msgid "MusicBrainz album artist ID"
+msgstr "ID izvajalca albuma MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "TRM ID sledi"
+
+msgid "MusicBrainz TRM ID"
+msgstr "TRM ID MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "hitrost zaslonke"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Hitrost zaslonke, uporabljene med zajemanjem slike (v sekundah)"
+
+msgid "capturing focal ratio"
+msgstr "goriščno razmerje med zajemanjem"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Goriščno razmerje, uporabljeno med zajemanjem slike"
+
+msgid "capturing focal length"
+msgstr "goriščna razdalja med zajemanjem"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Goriščna razdalja leč, uporabljena med zajemanjem slike"
+
+msgid "capturing digital zoom ratio"
+msgstr "razmerje digitalnega približevanja med zajemanjem"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Razmerje digitalnega približevanja, uporabljeno med zajemanjem slike"
+
+msgid "capturing iso speed"
+msgstr "hitrost ISO zajema"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Hitrost ISO, uporabljena med zajemanjem slike"
+
+msgid "capturing exposure program"
+msgstr "program osvetlitve zajema"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Program osvetlitve, uporabljen med zajemanjem slike"
+
+msgid "capturing exposure mode"
+msgstr "način osvetlitve zajema"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Program osvetlitve, uporabljen med zajemanjem slike"
+
+msgid "capturing exposure compensation"
+msgstr "nadomestitev osvetlitve zajema"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Nadomestitev osvetlitve, uporabljena med zajemanjem slike"
+
+msgid "capturing scene capture type"
+msgstr "vrsta zajemanja scene med zajemanjem"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Način zajemanja scene, uporabljen med zajemanjem slike"
+
+msgid "capturing gain adjustment"
+msgstr "prilagoditev ojačitve med zajemanjem"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Skupna prilagoditev ojačitve slike"
+
+msgid "capturing white balance"
+msgstr "ravnotežje bele barve zajema"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Način ravnotežja bele barve, uporabljen med zajemanjem slike"
+
+msgid "capturing contrast"
+msgstr "kontrast zajema"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Smer kontrasta, uporabljenega med zajemanjem slike"
+
+msgid "capturing saturation"
+msgstr "nasičenost zajema"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Smer nasičenosti, uporabljene med zajemanjem slike"
+
+msgid "capturing sharpness"
+msgstr "ostrina zajema"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Smer ostrine, uporabljene med zajemanjem slike"
+
+msgid "capturing flash fired"
+msgstr "sproženje bliskavice med zajemanjem"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Ali je med zajemanjem slike bliskavica sprožena"
+
+msgid "capturing flash mode"
+msgstr "način bliskavice med zajemanjem"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Izbrani način bliskavice, uporabljene med zajemanjem slike"
+
+msgid "capturing metering mode"
+msgstr "način umerjanja med zajemanjem"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Način umerjanja, uporabljen med določevanjem osvetljenosti zajemanja slike"
+
+msgid "capturing source"
+msgstr "vir zajema"
+
+msgid "The source or type of device used for the capture"
+msgstr "Vir ali vrsta naprave, uporabljene za zajemanje"
+
+msgid "image horizontal ppi"
+msgstr "vodoravne slikovne točke slike (ppi)"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Gostota vodoravnih slikovnih točk (v ppi)"
+
+msgid "image vertical ppi"
+msgstr "navpične slikovne točke slike (ppi)"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Gostota navpičnih slikovnih točk (v ppi)"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Ta CD nima zvočnih sledi"
+
+msgid "ID3 tag"
+msgstr "Oznaka ID3"
+
+msgid "APE tag"
+msgstr "Oznaka APE"
+
+msgid "ICY internet radio"
+msgstr "Internetni radio ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Govor Windows Media"
+
+msgid "CYUV Lossless"
+msgstr "Brezizgubni CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Brezizgubni MSZH"
+
+msgid "Run-length encoding"
+msgstr "Kodiranje trajanja izvajanja"
+
+msgid "Sami subtitle format"
+msgstr "Oblika podnapisov Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Oblika podnapisov TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Oblika podnapisov Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Nestisnjen YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Nestisnjena sivinska slika"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Nestisnjen YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Nestisnjen paletni %d-bitni %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 različice %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Nestisnjen YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Surovi %d-bitni zvok PCM"
+
+msgid "Audio CD source"
+msgstr "Vir zvočnega CD-ja"
+
+msgid "DVD source"
+msgstr "Vir DVD-ja"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Vir protokola Real Time Streaming Protocol (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Vir protokola Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Vir protokola %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "Razlagalnik video vsebine %s RTP"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "Razlagalnik zvočne vsebine %s RTP"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "Razlagalnik vsebine %s RTP"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "Odvijalnik %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "Odkodirnik %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "Nalagalnik video vsebine %s RTP"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "Nalagalnik zvočne vsebine %s RTP"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "Nalagalnik vsebine %s RTP"
+
+#, c-format
+msgid "%s muxer"
+msgstr "Zvijalnik %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "Kodirnik %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Predmet GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Neznan predmet vira"
+
+msgid "Unknown sink element"
+msgstr "Neznan predmet ponora"
+
+msgid "Unknown element"
+msgstr "Neznan predmet"
+
+msgid "Unknown decoder element"
+msgstr "Neznan predmet odkodirnika"
+
+msgid "Unknown encoder element"
+msgstr "Neznan predmet kodirnika"
+
+msgid "Plugin or element of unknown type"
+msgstr "Vstavek ali predmet neznane vrste"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Nestisnjen ploskovni YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Nestisnjen ploskovni YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Nestisnjen pakiran YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Nestisnjen pakiran YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Nestisnjen pakiran YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Nestisnjen pakiran YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Nestisnjen pakiran YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Nestisnjen ploskovni YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Nestisnjen ploskovni YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Nestisnjena črno-bela slika Y-ravnine"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Surovi zvok PCM"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Surovi %d-bitni zvok, določen s plavajočo vejico"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Surovi zvok, določen s plavajočo vejico"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "VFS datoteke \"%s\" ni mogoče odpreti za pisanje: %s"
+
+#~ msgid "No filename given"
+#~ msgstr "Ni podanega imena datoteke"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "VFS datoteke \"%s\" ni mogoče zapreti."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Napaka med pisanjem v datoteko \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Neveljaven URI podnapisov \"%s\", zato bodo onemogočeni."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Pretokov RTSP še ni mogoče predvajati."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Predmeta \"decodebin\" ni mogoče ustvariti."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Zaznan je bil le pretok podnapisov. Morda je bila naložena datoteka "
+#~ "podnapisov ali katera druga vrsta besedilne datoteke, ali pa "
+#~ "predstavnostne datoteke ni mogoče prepoznati."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Za to vrsto datotek ni nameščenega ustreznega odkodirnika. Morda je "
+#~ "potrebno namestiti manjkajoče vstavke."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Datoteka ni predstavnostna datoteka"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Zaznan je bil pretok podnapisov, ne pa tudi pretok videa."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Predmeta autovideosink in xvimagesink manjkata."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Predmeta autovideosink in alsasink manjkata."
+
+#~ msgid "No device specified."
+#~ msgstr "Ni navedene naprave."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Naprava \"%s\" ne obstaja."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Naprava \"%s\" je že v uporabi."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Naprave \"%s\" ni mogoče odpreti za branje in pisanje."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Napaka med pošiljanjem podatkov glave GDP na \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Napaka med pošiljanjem podatkov vsebine GDP na \"%s:%d\"."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Ni določenega izvornega pogona"
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Ni mogoče ustvariti datoteke predpomnilnika"
+
+#, fuzzy
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Ni mogoče odpreti CD naprave za branje."
+
+#, fuzzy
+#~ msgid "Internal data flow error."
+#~ msgstr "Notranja napaka pretoka podatkov."
+
+#, fuzzy
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Elementa filesrc ni mogoče ustvariti"
+
+#, fuzzy
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Elementa filesrc ni mogoče ustvariti"
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Elementa filesrc ni mogoče ustvariti"
diff --git a/po/sq.gmo b/po/sq.gmo
new file mode 100644
index 0000000..c81f9e8
--- /dev/null
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
new file mode 100644
index 0000000..d28e5ff
--- /dev/null
+++ b/po/sq.po
@@ -0,0 +1,689 @@
+# Përkthimi i mesazheve të gst-plugins në shqip.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Laurent Dhima <laurenti@alblinux.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins 0.8.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-08-07 20:29+0200\n"
+"Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
+"Language-Team: Albanian <begraj@hotmail.com>\n"
+"Language: sq\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Treble"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Sintetizuesi"
+
+msgid "Line-in"
+msgstr "Linja-hyrje"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofoni"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "Zë folës"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+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."
+msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim dhe shkrim."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+msgid "Could not open CD device for reading."
+msgstr "I pamundur hapja e dispozitivit CD për lexim."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "E pamundur mbyllja e file vfs \"%s\"."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "I pamundur shkrimi në dispozitivin \"%s\"."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "I pamundur shkrimi tek file \"%s\"."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Gabim gjatë mbylljes së file \"%s\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+msgstr ""
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "E pamundur hapja e file vfs \"%s\" për shkrim: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Nuk është dhënë asnjë emër file"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "E pamundur mbyllja e file vfs \"%s\"."
+
+#, fuzzy
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Gabim gjatë mbylljes së file \"%s\"."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje."
+
+#~ msgid "No device specified."
+#~ msgstr "Nuk është përcaktuar asnjë dispozitiv."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Dispozitivi \"%s\" nuk ekziston."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr ""
+#~ "Dispozitivi OSS \"%s\" është duke u përdorur nga një tjetër program."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim dhe shkrim."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "I pamundur shkrimi tek file \"%s\"."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Nuk është përcaktuar asnjë dispozitiv."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "I pamundur shkrimi tek file \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "E pamundur hapja e file \"%s\" për lexim."
+
+#~ msgid "Device is not open."
+#~ msgstr "Dispozitivi nuk është hapur."
+
+#~ msgid "Device is open."
+#~ msgstr "Dispozitivi është i hapur."
+
+#~ msgid "Could not open vfs file \"%s\" for reading."
+#~ msgstr "E pamundur hapja e file vfs \"%s\" për lexim."
+
+#, fuzzy
+#~ msgid "No filename given."
+#~ msgstr "Nuk është dhënë asnjë emër file"
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "E pamundur hapja e file \"%s\" në shkrim."
+
+#~ msgid "No filename specified."
+#~ msgstr "Nuk është përcaktuar emri i file."
+
+#~ 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 ""
+#~ "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 ""
+#~ "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 "Could not open control device \"%s\" for writing."
+#~ msgstr "E pamundur hapja e dispozitivit të kontrollit \"%s\" për shkrim."
+
+#~ msgid "Could not configure audio device \"%s\"."
+#~ msgstr "I pamundur konfigurimi i dispozitivit të zërit \"%s\"."
+
+#~ msgid "Could not set audio device \"%s\" to %d Hz."
+#~ msgstr "I pamundur rregullimi i dispozitivit audio \"%s\" në %d Hz."
+
+#~ msgid "Could not close audio device \"%s\"."
+#~ msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"."
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"."
+
+#~ msgid "Could not open video device \"%s\" for writing."
+#~ msgstr "E pamundur hapja e dispozitivit video \"%s\" për shkrim."
+
+#~ msgid "Could not close video device \"%s\"."
+#~ msgstr "E pamundur mbyllja e dispozitivit video \"%s\"."
+
+#~ msgid "Could not access device \"%s\", check its permissions."
+#~ msgstr ""
+#~ "E pamundur futja në dispozitivin \"%s\", kontrollo të drejtat e tij."
+
+#~ msgid "Could not open device \"%s\" for writing."
+#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për shkrim."
+
+#~ msgid "Could not open device \"%s\" for reading."
+#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim."
+
+#, fuzzy
+#~ msgid "Your OSS device doesn't support mono or stereo."
+#~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht"
+
+#~ msgid "Your OSS device could not be probed correctly"
+#~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht"
+
+#~ msgid "Volume"
+#~ msgstr "Volumi"
+
+#~ msgid "Speaker"
+#~ msgstr "Zë folës"
+
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"."
diff --git a/po/sr.gmo b/po/sr.gmo
new file mode 100644
index 0000000..2df0a42
--- /dev/null
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..5792028
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,669 @@
+# Serbian translation of gst-plugins
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Danilo Segan <dsegan@gmx.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins 0.7.6\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2004-03-13 00:18+0100\n"
+"Last-Translator: Danilo Segan <dsegan@gmx.net>\n"
+"Language-Team: Serbian <gnu@prevod.org>\n"
+"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"
+
+msgid "Master"
+msgstr ""
+
+msgid "Bass"
+msgstr "Бас"
+
+msgid "Treble"
+msgstr "Шум"
+
+msgid "PCM"
+msgstr "ПЦМ"
+
+msgid "Synth"
+msgstr "Синт."
+
+msgid "Line-in"
+msgstr "Ул.лин."
+
+msgid "CD"
+msgstr "ЦД"
+
+msgid "Microphone"
+msgstr "Микрофон"
+
+#, fuzzy
+msgid "PC Speaker"
+msgstr "Звучник"
+
+msgid "Playback"
+msgstr ""
+
+msgid "Capture"
+msgstr ""
+
+#, fuzzy
+msgid "Could not open device for playback in mono mode."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy
+msgid "Could not open device for playback in stereo mode."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy, c-format
+msgid "Could not open device for playback in %d-channel mode."
+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."
+msgstr "Не могу да отворим звучни уређај „%s“ ради уписа."
+
+#, fuzzy
+msgid "Could not open device for recording in mono mode."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy
+msgid "Could not open device for recording in stereo mode."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "Не могу да отворим уређај „%s“ ради читања и уписа."
+
+#, fuzzy
+msgid "Could not open audio device for recording."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+msgid "Could not open CD device for reading."
+msgstr "Не могу да отворим ЦД уређај ради читања."
+
+#, fuzzy
+msgid "Could not seek CD."
+msgstr "Не могу да затворим ВСД датотеку „%s“."
+
+#, fuzzy
+msgid "Could not read CD."
+msgstr "Не могу да пишем на видео уређај „%s“."
+
+msgid "Internal data stream error."
+msgstr ""
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "Не могу да пишем у датотеку „%s“."
+
+msgid "This appears to be a text file"
+msgstr ""
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr ""
+
+msgid "The autovideosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr ""
+
+msgid "The autovideosink element is not working."
+msgstr ""
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr ""
+
+msgid "The autoaudiosink element is missing."
+msgstr ""
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr ""
+
+msgid "The autoaudiosink element is not working."
+msgstr ""
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr ""
+
+msgid "No URI specified to play from."
+msgstr ""
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr ""
+
+msgid "This stream type cannot be played yet."
+msgstr ""
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr ""
+
+msgid "Source element is invalid."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Грешка при затварању датотеке „%s“."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr ""
+
+msgid "Can't record audio fast enough"
+msgstr ""
+
+msgid "Failed to read tag: not enough data"
+msgstr ""
+
+msgid "track ID"
+msgstr ""
+
+msgid "MusicBrainz track ID"
+msgstr ""
+
+msgid "artist ID"
+msgstr ""
+
+msgid "MusicBrainz artist ID"
+msgstr ""
+
+msgid "album ID"
+msgstr ""
+
+msgid "MusicBrainz album ID"
+msgstr ""
+
+msgid "album artist ID"
+msgstr ""
+
+msgid "MusicBrainz album artist ID"
+msgstr ""
+
+msgid "track TRM ID"
+msgstr ""
+
+msgid "MusicBrainz TRM ID"
+msgstr ""
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr ""
+
+msgid "ID3 tag"
+msgstr ""
+
+msgid "APE tag"
+msgstr ""
+
+msgid "ICY internet radio"
+msgstr ""
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr ""
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+
+msgid "Lossless True Audio (TTA)"
+msgstr ""
+
+msgid "Windows Media Speech"
+msgstr ""
+
+msgid "CYUV Lossless"
+msgstr ""
+
+msgid "FFMpeg v1"
+msgstr ""
+
+msgid "Lossless MSZH"
+msgstr ""
+
+msgid "Run-length encoding"
+msgstr ""
+
+msgid "Sami subtitle format"
+msgstr ""
+
+msgid "TMPlayer subtitle format"
+msgstr ""
+
+msgid "Kate subtitle format"
+msgstr ""
+
+msgid "Uncompressed video"
+msgstr ""
+
+msgid "Uncompressed gray"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr ""
+
+#, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr ""
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr ""
+
+msgid "Uncompressed audio"
+msgstr ""
+
+#, c-format
+msgid "Raw %d-bit %s audio"
+msgstr ""
+
+msgid "Audio CD source"
+msgstr ""
+
+msgid "DVD source"
+msgstr ""
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s protocol source"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr ""
+
+#, c-format
+msgid "%s demuxer"
+msgstr ""
+
+#, c-format
+msgid "%s decoder"
+msgstr ""
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr ""
+
+#, c-format
+msgid "%s muxer"
+msgstr ""
+
+#, c-format
+msgid "%s encoder"
+msgstr ""
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr ""
+
+msgid "Unknown source element"
+msgstr ""
+
+msgid "Unknown sink element"
+msgstr ""
+
+msgid "Unknown element"
+msgstr ""
+
+msgid "Unknown decoder element"
+msgstr ""
+
+msgid "Unknown encoder element"
+msgstr ""
+
+msgid "Plugin or element of unknown type"
+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“."
+
+#, fuzzy
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Грешка при затварању датотеке „%s“."
+
+#, fuzzy
+#~ msgid "This is not a media file"
+#~ msgstr "Уређај „%s“ не представља уређај за снимање."
+
+#~ msgid "No device specified."
+#~ msgstr "Уређај није наведен."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Не постоји уређај „%s“."
+
+#, fuzzy
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "OSS уређај „%s“ већ користи неки програм."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Не могу да отворим уређај „%s“ ради читања и уписа."
+
+#, fuzzy
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Не могу да пишем у датотеку „%s“."
+
+#, fuzzy
+#~ msgid "No Temp directory specified."
+#~ msgstr "Уређај није наведен."
+
+#, fuzzy
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Не могу да пишем у датотеку „%s“."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Не могу да отворим датотеку „%s“ ради читања."
+
+#~ msgid "Device is not open."
+#~ msgstr "Уређај није отворен."
+
+#~ msgid "Device is open."
+#~ msgstr "Уређај је отворен."
+
+# Виртуелни Систем Датотека
+#~ msgid "Could not open vfs file \"%s\" for reading."
+#~ msgstr "Не могу да отворим ВСД датотеку „%s“ ради читања."
+
+#, fuzzy
+#~ msgid "No filename given."
+#~ msgstr "Име датотеке није задато."
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "Не могу да отворим датотеку „%s“ ради уписа."
+
+#~ msgid "No filename specified."
+#~ msgstr "Име датотеке није задато."
+
+#~ msgid "No or invalid input audio, AVI stream will be corrupt."
+#~ 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 Hz."
+
+#~ msgid "Could not close audio device \"%s\"."
+#~ msgstr "Не могу да отворим радио уређај '%s'"
+
+#~ msgid "Could not close control device \"%s\"."
+#~ msgstr "Не могу да затворим управљачки уређај „%s“."
+
+#~ msgid "Could not open video device \"%s\" for writing."
+#~ msgstr "Не могу да отворим видео уређај „%s“ ради уписа."
+
+#~ msgid "Could not close video device \"%s\"."
+#~ msgstr "Не могу да затворим видео уређај „%s“."
+
+#~ msgid "Could not access device \"%s\", check its permissions."
+#~ msgstr "Не могу да приступим уређају „%s“, проверите његова овлашћења."
+
+#~ msgid "Could not open device \"%s\" for writing."
+#~ msgstr "Не могу да отворим уређај „%s“ ради уписа."
+
+#~ msgid "Could not open device \"%s\" for reading."
+#~ msgstr "Не могу да отворим уређај „%s“ ради читања."
+
+#~ msgid "Volume"
+#~ msgstr "Јачина звука"
+
+#~ msgid "Speaker"
+#~ 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 get buffers from device \"%s\"."
+#~ msgstr "Не могу да примим бафере са уређаја „%s“."
+
+#~ msgid "Could not get enough buffers from device \"%s\"."
+#~ msgstr "Не могу да примим довољно бафера са уређаја „%s“."
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 0000000..1f41398
--- /dev/null
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..3ddf692
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,1783 @@
+# Swedish messages for gst-plugins-base.
+# Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Christian Rose <menthos@menthos.com>, 2004.
+# Daniel Nylander <po@danielnylander.se>, 2007, 2008, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.28.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-06-07 18:17+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Övergripande"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Diskant"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synt"
+
+msgid "Line-in"
+msgstr "Linje-in"
+
+msgid "CD"
+msgstr "Cd"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC-högtalare"
+
+msgid "Playback"
+msgstr "Uppspelning"
+
+msgid "Capture"
+msgstr "Fångst"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Kunde inte öppna enheten för uppspelning i monoläge."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Kunde inte öppna enheten för uppspelning i stereoläge."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Kunde inte öppna enheten för uppspelning i %d-kanalsläge."
+
+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."
+msgstr "Kunde inte öppna ljudenheten för uppspelning."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Kunde inte öppna enheten för inspelning i monoläge."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Kunde inte öppna enheten för inspelning i stereoläge."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Kunde inte öppna enheten för inspelning i %d-kanalsläge."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Kunde inte öppna ljudenheten för inspelning. Enheten används av ett annat "
+"program."
+
+msgid "Could not open audio device for recording."
+msgstr "Kunde inte öppna ljudenheten för inspelning."
+
+msgid "Could not open CD device for reading."
+msgstr "Kunde inte öppna cd-enheten för läsning."
+
+msgid "Could not seek CD."
+msgstr "Kunde inte söka på cd-skivan."
+
+msgid "Could not read CD."
+msgstr "Kunde inte läsa cd-skivan."
+
+msgid "Internal data stream error."
+msgstr "Internt dataströmfel."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr ""
+"En %s-insticksmodul krävs för att spela upp den här strömmen men är inte "
+"installerad."
+
+msgid "Could not determine type of stream"
+msgstr "Kunde inte fastställa typ av ström"
+
+msgid "This appears to be a text file"
+msgstr "Den här ser ut att vara en textfil"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Saknar elementet \"%s\" - kontrollera din GStreamer-installation."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Både autovideosink- och %s-elementet saknas."
+
+msgid "The autovideosink element is missing."
+msgstr "Elementet autovideosink saknas."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Konfigurerat videosink %s fungerar inte."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Det finns både autovideosink- och %s-element som inte fungerar."
+
+msgid "The autovideosink element is not working."
+msgstr "Elementet autovideosink fungerar inte."
+
+msgid "Custom text sink element is not usable."
+msgstr "Anpassat text sink-element är inte användbart."
+
+msgid "No volume control found"
+msgstr "Ingen volymkontroll hittades"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Både autoaudiosink- och %s-elementet saknas."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Elementet autoaudiosink saknas."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Konfigurerat audiosink %s fungerar inte."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Det finns både autoaudiosink- och %s-element som inte fungerar.."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Elementet autoaudiosink fungerar inte."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Kan inte spela upp en textfil utan video eller visualiseringar."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Ingen avkodare finns tillgänglig för typen \"%s\"."
+
+msgid "No URI specified to play from."
+msgstr "Ingen uri angiven att spela upp från."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Ogiltig uri \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Den här strömtypen kan inte spelas upp än."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Ingen URI-hanterare implementerad för \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Källelementet är ogiltigt."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Fel vid sändning av data till \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Anslutningen till %s:%d nekades."
+
+msgid "Can't record audio fast enough"
+msgstr "Kan inte spela in ljud tillräckligt snabbt"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Misslyckades med att läsa tagg: inte tillräckligt mycket data"
+
+msgid "track ID"
+msgstr "spår-id"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz spår-id"
+
+msgid "artist ID"
+msgstr "artist-id"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz artist-id"
+
+msgid "album ID"
+msgstr "album-id"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz album-id"
+
+msgid "album artist ID"
+msgstr "albumartist-id"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albumartist-id"
+
+msgid "track TRM ID"
+msgstr "spår TRM-ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM-ID"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Den här cd-skivan saknar ljudspår"
+
+msgid "ID3 tag"
+msgstr "ID3-tagg"
+
+msgid "APE tag"
+msgstr "APE-tagg"
+
+msgid "ICY internet radio"
+msgstr "ICY internetradio"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "Förlustfri CYUV"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Förlustfri MSZH"
+
+msgid "Run-length encoding"
+msgstr "Körlängdskodning"
+
+msgid "Sami subtitle format"
+msgstr "Undertextformatet Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Undertextformatet TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Undertextformatet Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Okomprimerad YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Okomprimerad gråskalebild"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Okomprimerad YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Okomprimerad palettiserad %d-bitars %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 version %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Okomprimerad YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Rått %d-bitars PCM-ljud"
+
+msgid "Audio CD source"
+msgstr "Ljud-cd-källa"
+
+msgid "DVD source"
+msgstr "Dvd-källa"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Real Time Streaming Protocol-källa (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Media Server-protokollkälla (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s-protokollkälla"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s RTP-uppackare (video)"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s RTP-uppackare (ljud)"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP-uppackare"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s-avmultiplexor"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s-avkodare"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s RTP-packare (video)"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s RTP-packare (ljud)"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP-packare"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s-multiplexor"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s-kodare"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer-elementet %s"
+
+msgid "Unknown source element"
+msgstr "Okänt source-element"
+
+msgid "Unknown sink element"
+msgstr "Okänt sink-element"
+
+msgid "Unknown element"
+msgstr "Okänt element"
+
+msgid "Unknown decoder element"
+msgstr "Okänt avkodarelement"
+
+msgid "Unknown encoder element"
+msgstr "Okänt kodarelement"
+
+msgid "Plugin or element of unknown type"
+msgstr "Insticksmodul eller element av okänd typ"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Okomprimerad plan YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Okomprimerad plan YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Okomprimerad paketerad YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Okomprimerad paketerad YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Okomprimerad paketerad YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Okomprimerad paketerad YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Okomprimerad paketerad YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Okomprimerad plan YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Okomprimerad plan YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Okomprimerad svartvitt y-plan"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Rått PCM-ljud"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Rått %d-bitars flyttalsljud"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Rått flyttalsljud"
+
+#~ 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\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Fel vid skrivning till filen \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Ogiltig uri för undertext \"%s\", undertexter inaktiverade."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP-strömmar kan inte spelas upp än."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Kunde inte skapa \"decodebin\"-element."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Endast en undertextström identifierades. Antingen läser du in en "
+#~ "undertextfil eller någon annan typ av textfil, eller så kändes inte "
+#~ "mediafilen igen."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Du har inte en installerad avkodare som kan hantera den här filen. Du "
+#~ "kanske behöver installera de nödvändiga insticksmodulerna."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Det här är inte en mediafil"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "En undertextström identifierades men ingen videoström."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Både autovideosink- och xvimagesink-elementet saknas."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Både autoaudiosink- och alsasink-elementet saknas."
+
+#~ msgid "No device specified."
+#~ msgstr "Ingen enheten angiven."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Enheten \"%s\" finns inte."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Enheten \"%s\" används redan."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Kunde inte öppna enheten \"%s\" för läsning och skrivning."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Fel vid sändning av gdp-huvuddata till \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Fel vid sändning av gdp-paketdata till \"%s:%d\"."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Kan inte visa både undertexter och underbilder."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Ingen temporärkatalog har angivits."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Kunde inte skapa temporärfilen \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Kunde inte öppna filen \"%s\" för läsning."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "Internt dataflödesfel."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Kunde inte skapa \"decodebin2\"-element."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Kunde inte skapa \"queue2\"-element."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Kunde inte skapa \"typefind\"-element."
+
+#~ msgid "No file name specified."
+#~ msgstr "Inget filnamn angivet."
+
+#~ msgid "artist sortname"
+#~ msgstr "artistsorteringsnamn"
+
+#~ msgid "MusicBrainz artist sortname"
+#~ msgstr "MusicBrainz sorteringsnamn för artist"
+
+#~ msgid "discid"
+#~ msgstr "skiv-id"
+
+#~ msgid "Device is not open."
+#~ msgstr "Enheten är inte öppen."
+
+#~ msgid "Device is open."
+#~ msgstr "Enheten är öppen."
+
+#~ msgid "Could not open vfs file \"%s\" for reading."
+#~ msgstr "Kunde inte öppna vfs-filen \"%s\" för läsning."
+
+#~ msgid "No filename given."
+#~ msgstr "Inget filnamn angivet."
+
+#~ msgid "Could not open file \"%s\" for writing."
+#~ msgstr "Kunde inte öppna filen \"%s\" för skrivning."
+
+#~ msgid "No or invalid input audio, AVI stream will be corrupt."
+#~ msgstr "Inget eller ogiltigt inljud. AVI-flödet kommer att skadas."
+
+#~ 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 "Could not open audio device \"%s\" for writing."
+#~ msgstr "Kunde inte öppna ljudenheten \"%s\" för skrivning."
+
+#~ msgid "Could not open control device \"%s\" for writing."
+#~ msgstr "Kunde inte öppna styrenheten \"%s\" för skrivning."
+
+#~ msgid "Could not configure audio device \"%s\"."
+#~ msgstr "Kunde inte konfigurera ljudenheten \"%s\"."
+
+#~ 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 close control device \"%s\"."
+#~ msgstr "Kunde inte stänga styrenheten \"%s\"."
+
+#~ msgid "Could not open video device \"%s\" for writing."
+#~ msgstr "Kunde inte öppna videoenheten \"%s\" för skrivning."
+
+#~ msgid "Could not close video device \"%s\"."
+#~ msgstr "Kunde inte stänga vidoeenheten \"%s\"."
+
+#~ msgid "Could not write to device \"%s\"."
+#~ msgstr "Kunde inte skriva till enheten \"%s\"."
+
+#~ msgid "Could not access device \"%s\", check its permissions."
+#~ msgstr "Kunde inte komma åt enheten \"%s\". Kontrollera dess rättigheter."
+
+#~ 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 doesn't support mono or stereo."
+#~ msgstr "Din OSS-enhet saknar stöd för mono eller stereo."
+
+#~ msgid "Your OSS device could not be probed correctly"
+#~ msgstr "Din OSS-enhet kunde inte undersökas korrekt"
+
+#~ msgid "Volume"
+#~ msgstr "Volym"
+
+#~ msgid "Speaker"
+#~ msgstr "Högtalare"
+
+#~ 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 "Device \"%s\" is not a capture device."
+#~ msgstr "Enheten \"%s\" är ingen fångstenhet."
+
+#~ 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 "Line"
+#~ msgstr "Linje"
+
+#~ msgid "Digital"
+#~ msgstr "Digital"
+
+#~ 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 "Server"
+#~ msgstr "Server"
+
+#~ msgid "Location"
+#~ msgstr "Plats"
+
+#~ 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 "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 "Country"
+#~ msgstr "Country"
+
+#~ msgid "Dance"
+#~ msgstr "Dance"
+
+#~ 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 "Other"
+#~ msgstr "Annat"
+
+#~ 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 "Instrumental"
+#~ msgstr "Instrumentellt"
+
+#~ msgid "Acid"
+#~ msgstr "Acid"
+
+#~ msgid "House"
+#~ msgstr "House"
+
+#~ msgid "Game"
+#~ msgstr "Spel"
+
+#~ msgid "Sound Clip"
+#~ msgstr "Ljudklipp"
+
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
+
+#~ msgid "Noise"
+#~ msgstr "Brus"
+
+#~ 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 folkmusik"
+
+#~ msgid "Cabaret"
+#~ msgstr "Kabaré"
+
+#~ msgid "New Wave"
+#~ msgstr "New Wave"
+
+#~ msgid "Psychedelic"
+#~ msgstr "Psykedeliskt"
+
+#~ msgid "Rave"
+#~ msgstr "Rave"
+
+#~ 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 "Retro"
+#~ msgstr "Retro"
+
+#~ 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 folkmusik"
+
+#~ 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 "Black Metal"
+#~ msgstr "Black 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 skiv-id: %s"
+
+#~ msgid "Editing Disc ID: "
+#~ msgstr "Redigerar skiv-id: "
+
+#~ 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 "Speltid"
+
+#~ 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 "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 "Invalid CD device"
+#~ msgstr "Ogiltig cd-enhet"
+
+#~ 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"
+#~ msgstr "Öppna"
+
+#~ 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 "Record sound"
+#~ msgstr "Spela in ljud"
+
+#~ 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 "%s Information"
+#~ msgstr "Information om %s"
+
+#~ 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 "Bitfrekvens:"
+
+#~ msgid "Playing..."
+#~ msgstr "Spelar upp..."
+
+#~ msgid "%s.%s - Sound Recorder"
+#~ msgstr "%s.%s - Ljudinspelare"
+
+#~ msgid "Recording..."
+#~ msgstr "Spelar in..."
+
+#~ msgid "Record as"
+#~ msgstr "Spela in som"
+
+#~ msgid "File information"
+#~ msgstr "Filinformation"
+
+#~ msgid "<none>"
+#~ msgstr "<ingen>"
+
+#~ msgid "Length:"
+#~ msgstr "Längd:"
+
+#~ msgid "Adjust the volume level"
+#~ msgstr "Justera nivån på volymen"
+
+#~ msgid "Volume Control"
+#~ msgstr "Volymkontroll"
+
+#~ msgid "Channel %d of %s Slider"
+#~ msgstr "Kanal %d för %s-skjutreglage"
+
+#~ msgid "%s Slider %d"
+#~ msgstr "%s-skjutreglage %d"
+
+#~ msgid "Lock"
+#~ msgstr "Lås"
+
+#~ msgid "%s Lock"
+#~ msgstr "%s-lås"
diff --git a/po/tr.gmo b/po/tr.gmo
new file mode 100644
index 0000000..22fb1e8
--- /dev/null
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..d2d052e
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,634 @@
+# translation of gst-plugins-base-0.10.32.2.po to Turkish
+# This file is put in the public domain.
+# Server Acim <serveracim@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-26 19:22+0200\n"
+"Last-Translator: Server Acim <serveracim@gmail.com>\n"
+"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "Ana"
+
+msgid "Bass"
+msgstr "Bas"
+
+msgid "Treble"
+msgstr "Tiz"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Synthizer"
+
+msgid "Line-in"
+msgstr "Hat-girişi"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Mikrofon"
+
+msgid "PC Speaker"
+msgstr "PC Hoparlörü"
+
+msgid "Playback"
+msgstr "Çalma"
+
+msgid "Capture"
+msgstr "Yakala"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Mono kipte çalmak için aygıt açılamıyor."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Stereo kipte çalmak için aygıt açılamıyor."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Aygıtı %d- kanal kipinde çalmak için açamıyor."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Aygıtı çalmak için için açamıyor. Aygıt başka bir uygulama tarafından "
+"kullanılmakta."
+
+msgid "Could not open audio device for playback."
+msgstr "Aygıtı çalma için açamıyor."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Mono kipte kaydetmek için aygıtı açamıyor."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Stereo kipte kaydetmek için aygıtı açamıyor."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Aygıtı %d- kanal kipinde kaydetmek için açamıyor"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Aygıtı kaydetmek için açamıyor. Aygıt başka bir uygulama tarafından "
+"kullanılmakta."
+
+msgid "Could not open audio device for recording."
+msgstr "Kayıt için ses aygıtı açılamıyor."
+
+msgid "Could not open CD device for reading."
+msgstr "Okumak için CD aygıtı açılamıyor."
+
+msgid "Could not seek CD."
+msgstr "CD bulunamıyor."
+
+msgid "Could not read CD."
+msgstr "CD okunamıyor."
+
+msgid "Internal data stream error."
+msgstr "İç veri akışı hatası."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Bir %s eklenti bu akışı çalmak için gerekli, fakat kurulu değil."
+
+msgid "Could not determine type of stream"
+msgstr "Akışın türü belirlenemiyor"
+
+msgid "This appears to be a text file"
+msgstr "Bu bir metin dosyasına benziyor"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Kayıp öğe '%s' - GStreamer kurulumunu denetleyin."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Autovideosink ve xvimagesink %s öğelerininin ikisi de kayıp."
+
+msgid "The autovideosink element is missing."
+msgstr "Autovideosink öğelesi kayıp."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Yapılandırılmış olan videosink öğesi %s çalışmıyor."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Autoaudiosink ve xvimagesink %s öğelerinin ikisi de çalışmıyor."
+
+msgid "The autovideosink element is not working."
+msgstr "Autoaudiosink öğesi çalışmıyor."
+
+msgid "Custom text sink element is not usable."
+msgstr "Varsayılan metin gömme öğesi kullanılamaz durumda."
+
+msgid "No volume control found"
+msgstr "Ses denetimi bulunamadı"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Autoaudiosink ve alsasink %s öğelerinin ikisi de kayıp."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Autoaudiosink öğesi kayıp."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Yapılandırılmış olan videosink öğesi %s çalışmıyor."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Autoaudiosink ve %s öğelerinin ikisi de çalışmıyor."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Autoaudiosink öğesi çalışmıyor."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Vidyo veya görsellik olmadan metin dosyasını oynatamaz."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Şu tür '%s' için kod çözücü bulunamadı."
+
+msgid "No URI specified to play from."
+msgstr "Çalmak için bir ağ adresi belirtilmedi."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Geçersiz URI \"%s\"."
+
+msgid "This stream type cannot be played yet."
+msgstr "Bu akış türü henüz çalınamıyor."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Hiç bir URI bağlantısı sağlanmadı \"%s\"."
+
+msgid "Source element is invalid."
+msgstr "Kaynak öğesi geçersiz."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Dosyayı şuraya gönderirken hata \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Şuraya bağlantı %s:%d reddedildi."
+
+msgid "Can't record audio fast enough"
+msgstr "Sesi yeterince hızlı kaydedemiyor"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Etiketi okunamadı: yetersiz veri"
+
+msgid "track ID"
+msgstr "iz BAŞLIĞI"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz iz BAŞLIĞI ID"
+
+msgid "artist ID"
+msgstr "sanatçı BAŞLIĞI"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz sanatçı BAŞLIĞI ID"
+
+msgid "album ID"
+msgstr "albüm BAŞLIĞI"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz albümü BAŞLIĞI"
+
+msgid "album artist ID"
+msgstr "albüm sanatçısı BAŞLIĞI"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz albüm sanatçısı BAŞLIĞI"
+
+msgid "track TRM ID"
+msgstr "iz TRM BAŞLIĞI"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM BAŞLIĞI"
+
+msgid "capturing shutter speed"
+msgstr "objektif hızını yakalıyor"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Saniye bazında, bir resim çekerken kullanılan objektif hızı"
+
+msgid "capturing focal ratio"
+msgstr "odaksal oranı yakalıyor"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr "Resim çekerken kullanılan odaksal oran (f-numarası)"
+
+msgid "capturing focal length"
+msgstr "odaksal uzunluğu yakalıyor"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr "Mm bazında, resim çekerken kullanılan odaksal uzunluk"
+
+msgid "capturing digital zoom ratio"
+msgstr "sayısal zum oranını yakalıyor"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr "Bir resim çekerken kullanılan sayısal yakınlaştırma oranı"
+
+msgid "capturing iso speed"
+msgstr "iso hızını yakalıyor"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Bir resim çekerken kulllanılan ISO hızı"
+
+msgid "capturing exposure program"
+msgstr "pozlandırma programını yakalıyor"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Bir resim çekerken kullanılan pozlandırma programı"
+
+msgid "capturing exposure mode"
+msgstr "pozlandırma kipini yakalıyor"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Bir resim çekerken kullanılan pozlandırma kipi"
+
+msgid "capturing exposure compensation"
+msgstr "pozlandırma kipini yakalanıyor"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Bir resim çekerken kullanılan pozlandırma kipi"
+
+msgid "capturing scene capture type"
+msgstr "manzara çekme türünü yakalıyor"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Bir resim çekerken kullanılan manzara yakalama kipi"
+
+msgid "capturing gain adjustment"
+msgstr "kazanç ayarı yakalanıyor"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Bir resime uygulanan kapsamlı kazanç ayarı"
+
+msgid "capturing white balance"
+msgstr "beyaz dengesi yakalanıyor"
+
+msgid "The white balance mode set when capturing an image"
+msgstr "Bir resim çekerken kullanılan beyaz dengesi kipi"
+
+msgid "capturing contrast"
+msgstr "zıtlık yakalanıyor"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Bir resim çekerken uygulanan zıtlık işleminin yönü"
+
+msgid "capturing saturation"
+msgstr "canlılık yakalanıyor"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Bir resim çekerken uygulanan doygunluk işleminin yönü"
+
+msgid "capturing sharpness"
+msgstr "keskinlik yakalanıyor"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Bir resim çekerken uygulanan keskinlik işleminin yönü"
+
+msgid "capturing flash fired"
+msgstr "flaşın yanışı yakalanıyor"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Bir resim çekerken eğer flaş patlamışsa"
+
+msgid "capturing flash mode"
+msgstr "flaş kipi yakalanıyor"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Bir resim çekerken kullanılan flaş kipi"
+
+msgid "capturing metering mode"
+msgstr "metreleme kipi yakalanıyor"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr "Bir resim çekmek için pozlandırmanın metreleme kipi"
+
+msgid "capturing source"
+msgstr "kaynak yakalanıyor"
+
+msgid "The source or type of device used for the capture"
+msgstr "Resim çekerken kullanılan aygıtın kaynak türü"
+
+msgid "image horizontal ppi"
+msgstr "yatay resim ppi değeri"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr "Medya (resim/vidyo)'nın ppi değerinden yatay piksel yoğunluğu"
+
+msgid "image vertical ppi"
+msgstr "resim dikey ppi değeri"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr "Medya (resim/vidyo)'nun ppi değerinden dikey piksel yoğunluğu"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Bu CD hiç ses izi içermiyor"
+
+msgid "ID3 tag"
+msgstr "ID3 etiketi"
+
+msgid "APE tag"
+msgstr "APE etiketi"
+
+msgid "ICY internet radio"
+msgstr "ICY internet radyosu"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple Lossless Audio (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Free Lossless Audio Codec (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Hecelemesi"
+
+msgid "CYUV Lossless"
+msgstr "CYUV Kayıpsız"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "Kayıpsız MSZH"
+
+msgid "Run-length encoding"
+msgstr "Çalıştırma-uzunluğu kodlaması"
+
+msgid "Sami subtitle format"
+msgstr "Sami altyazı kipi"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer altyazı kipi"
+
+msgid "Kate subtitle format"
+msgstr "Kate altyazı kipi"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Sıkıştırılmamış YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Sıkıştırılmamış Gri Resim"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Sıkıştırılmamış YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Şıkıştırılmamış seviyesi şuna düşürülmüş %d-bit %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Versiyonu %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Sıkıştırılmamış YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Ham %d-bit PCM ses"
+
+msgid "Audio CD source"
+msgstr "Ses CD'si kaynağı"
+
+msgid "DVD source"
+msgstr "DVD kaynağı"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Gerçek Zamanlı Akış Protokolu (RTSP) kaynağı"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft Medya Sunucusu (MMS) protokol kaynağı"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s protokol kaynağı"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s video RTP depayloader"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s audio RTP depayloader"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP depayloader"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s demuxer"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s kod çözücü"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s video RTP payloader"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s audio RTP payloader"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP payloader"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s muxer"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s kodlayıcı"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer öğesi %s"
+
+msgid "Unknown source element"
+msgstr "Bilinmeyen kaynak öğesi"
+
+msgid "Unknown sink element"
+msgstr "Bilinmeyen gömme öğesi"
+
+msgid "Unknown element"
+msgstr "Bilinmeyen öğe"
+
+msgid "Unknown decoder element"
+msgstr "Bilinmeyen kod çözücü öğesi"
+
+msgid "Unknown encoder element"
+msgstr "Bilinmeyen kodlama öğesi"
+
+msgid "Plugin or element of unknown type"
+msgstr "Bilinmeyen türde eklenti veya öğe"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Vfs dosyası \"%s\" yazmak için açılamıyor: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Dosya adı verilmedi"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Vfs dosyası kapatılamıyor \"%s\"."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Dosyaya yazmada hata \"%s\"."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Geçersiz altyazı adresi \"%s\", altyazılar kaldırıldı."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP akışları henüz çalınamıyor."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "\"decodebin\" öğesi oluşturulamıyor."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Bir altyazı dosyası algılandı. Siz ya bir altyazı veya başka bir metin "
+#~ "dosyası yüklemek üzeresiniz, veya çokluortam dosyası tanınamadı."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Bu yüklü dosyası çözümleyecek bir kod çözücüye sahip değilsiniz. Gerekli "
+#~ "eklentileri kurmak zorundasınız."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Bu bir çokluortam dosyası değil."
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Bir altyazı akışı algılanda, ancak vidyo akışı bulunamadı."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Autovideosink ve xvimagesink öğelerininin ikisi de kayıp."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Autoaudiosink ve alsasink öğelerinin ikisi de kayıp."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Bir gdp başlık verisini şuraya gönderirken hata \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Bir gdp verisini şuraya gönderirken hata \"%s:%d\"."
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Sıkıştırılmamış planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Sıkıştırılmamış planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Sıkıştırılmamış paket YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Sıkıştırılmamış paket YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Sıkıştırılmamış paket YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Sıkıştırılmamış paket YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Sıkıştırılmamış paket YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Sıkıştırılmamış planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Sıkıştırılmamış planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Sıkıştırılmamış siyah ve beyaz Y"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Ham PCM ses"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Ham %d-bit yüzer-noktalı ses"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Ham yüzer-noktalı ses"
+
+#~ msgid "No device specified."
+#~ msgstr "Aygıt belirtilmedi."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Aygıt \"%s\" bulunamadı."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Aygıt \"%s\" zaten kullanımda."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Şu aygıtı\"%s\" for okuma veya yazma için açamıyor."
+
+#~ msgid "Can't display both text subtitles and subpictures."
+#~ msgstr "Metin altyazılarını altgörüntülerini oynatamıyor."
+
+#~ msgid "No Temp directory specified."
+#~ msgstr "Geçici Temp dizini belirtilmedi."
+
+#~ msgid "Could not create temp file \"%s\"."
+#~ msgstr "Geçici dosya oluşturulamıyor \"%s\"."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Dosyayı \"%s\" okumak için açamıyor."
+
+#~ msgid "Internal data flow error."
+#~ msgstr "İç veri akışı hatası."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Bir \"decodebin2\" öğesi oluşturamıyor."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Bir \"queue2\" öğesi oluşturamıyor."
+
+#~ msgid "Could not create \"typefind\" element."
+#~ msgstr "Bir \"typefind\" öğesi oluşturamıyor."
+
+#~ msgid "No file name specified."
+#~ msgstr "Dosya adı belirtilmedi."
diff --git a/po/uk.gmo b/po/uk.gmo
new file mode 100644
index 0000000..932732e
--- /dev/null
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..50fe9e0
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,644 @@
+# Ukrainian translation to gst-plugins.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gst-plugins-base package.
+#
+# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2004-2007.
+# Yuri Chornoivan <yurchor@ukr.net>, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2011-04-27 17:49+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
+"Language: uk\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: Lokalize 1.1\n"
+
+msgid "Master"
+msgstr "Головний"
+
+msgid "Bass"
+msgstr "Низькі"
+
+msgid "Treble"
+msgstr "Високі"
+
+msgid "PCM"
+msgstr "КІМ"
+
+msgid "Synth"
+msgstr "Синтезатор"
+
+msgid "Line-in"
+msgstr "Лінійний вхід"
+
+msgid "CD"
+msgstr "Компакт-диск"
+
+msgid "Microphone"
+msgstr "Мікрофон"
+
+msgid "PC Speaker"
+msgstr "Гучномовець"
+
+msgid "Playback"
+msgstr "Відтворення"
+
+msgid "Capture"
+msgstr "Запис"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Не вдалося відкрити пристрій відтворення у режимі моно."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Не вдалося відкрити пристрій відтворення у режимі стерео."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Не вдалося відкрити пристрій відтворення у %d канальному режимі."
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr ""
+"Не вдалося відкрити пристрій для відтворення. Пристрій використовується "
+"сторонньою програмою."
+
+msgid "Could not open audio device for playback."
+msgstr "Не вдалося відкрити пристрій для відтворення."
+
+msgid "Could not open device for recording in mono mode."
+msgstr "Не вдалося відкрити пристрій запису у режимі моно."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Не вдалося відкрити пристрій запису у режимі стерео."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Не вдалося відкрити пристрій запису у %d-канальному режимі."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Не вдалося відкрити пристрій для запису. Пристрій використовується "
+"сторонньою програмою."
+
+msgid "Could not open audio device for recording."
+msgstr "Не вдалося відкрити пристрій для запису."
+
+msgid "Could not open CD device for reading."
+msgstr "Не вдалося відкрити пристрій компакт-дисків для читання."
+
+msgid "Could not seek CD."
+msgstr "Не вдалося встановити позицію на CD."
+
+msgid "Could not read CD."
+msgstr "Не вдалося прочитати CD."
+
+msgid "Internal data stream error."
+msgstr "Помилка внутрішнього потоку даних."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Для відтворення потоку потрібен модуль %s, але він не встановлений."
+
+msgid "Could not determine type of stream"
+msgstr "Не вдалося визначити тип даних потоку"
+
+msgid "This appears to be a text file"
+msgstr "Файл схожий на текстовий файл"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr ""
+"Відсутній елемент «%s». Перевірте чи встановлено GStreamer належним чином."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Не вказано елементів autovideosink і %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Не вказано елемента autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Налаштований приймач відеоданих, %s, не працює."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Непридатними є обидва елементи: autovideosink і %s."
+
+msgid "The autovideosink element is not working."
+msgstr "Елемент autovideosink є непридатним."
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+"Нетиповий елемент приймача текстових даних непридатний до використання."
+
+msgid "No volume control found"
+msgstr "Не знайдено регулятора гучності"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Не вказано обох елементів: autoaudiosink і %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Не вказано елемента autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Налаштований приймач звукових даних, %s, не працює."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Елементи autoaudiosink і %s є непридатними."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Елемент autoaudiosink є непридатним."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr "Відтворення текстового файла без відео або візуалізації неможливе."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Для типу '%s' немає доступних декодерів."
+
+msgid "No URI specified to play from."
+msgstr "Не вказано URI для відтворення."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "Неправильний URI «%s»."
+
+msgid "This stream type cannot be played yet."
+msgstr "Цей потік поки-що не може бути відтворений."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Не реалізовано обробник URI для «%s»."
+
+msgid "Source element is invalid."
+msgstr "Неправильний вхідний елемент."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Помилка при надсиланні даних до \"%s:%d\"."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "У з'єднанні з %s:%d відмовлено."
+
+msgid "Can't record audio fast enough"
+msgstr "Не вдалося запис аудіоданих з потрібною швидкістю"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Не вдалося прочитати мітку: недостатньо даних"
+
+msgid "track ID"
+msgstr "ідентифікатор доріжки"
+
+msgid "MusicBrainz track ID"
+msgstr "Ідентифікатор доріжки у MusicBrainz"
+
+msgid "artist ID"
+msgstr "ідентифікатор виконавця"
+
+msgid "MusicBrainz artist ID"
+msgstr "Ідентифікатор виконавця у MusicBrainz"
+
+msgid "album ID"
+msgstr "ідентифікатор альбому"
+
+msgid "MusicBrainz album ID"
+msgstr "Ідентифікатор альбому у MusicBrainz"
+
+msgid "album artist ID"
+msgstr "ідентифікатор виконавця альбому"
+
+msgid "MusicBrainz album artist ID"
+msgstr "Ідентифікатор виконавця альбому у MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "ідентифікатор доріжки TRM"
+
+msgid "MusicBrainz TRM ID"
+msgstr "Ідентифікатор доріжки TRM у MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr "швидкість затвору"
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr "Швидкість затвору (діафрагми) під час створення зображення, у секундах"
+
+msgid "capturing focal ratio"
+msgstr "фокальний коефіцієнт"
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+"Фокальний коефіцієнт (число діафрагми), використаний під час створення "
+"зображення"
+
+msgid "capturing focal length"
+msgstr "фокальна відстань"
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+"Фокальна відстань об’єктива, використаного при створенні зображення, у мм"
+
+msgid "capturing digital zoom ratio"
+msgstr "коефіцієнт цифрового збільшення"
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+"Коефіцієнт цифрового збільшення, використаний під час створення зображення"
+
+msgid "capturing iso speed"
+msgstr "світлочутливість ISO"
+
+msgid "The ISO speed used when capturing an image"
+msgstr "Світлочутливість ISO, використана під час створення зображення"
+
+msgid "capturing exposure program"
+msgstr "програма експозиції"
+
+msgid "The exposure program used when capturing an image"
+msgstr "Програма експозиції, використана під час створення зображення"
+
+msgid "capturing exposure mode"
+msgstr "режим експозиції"
+
+msgid "The exposure mode used when capturing an image"
+msgstr "Режим експозиції, використаний під час створення зображення"
+
+msgid "capturing exposure compensation"
+msgstr "компенсація експозиції під час захоплення"
+
+msgid "The exposure compensation used when capturing an image"
+msgstr "Компенсація часу експозиції, потрібного для захоплення зображення"
+
+msgid "capturing scene capture type"
+msgstr "тип сцени"
+
+msgid "The scene capture mode used when capturing an image"
+msgstr "Режим типу сцени, використаний під час створення зображення"
+
+msgid "capturing gain adjustment"
+msgstr "коригування підсилання"
+
+msgid "The overall gain adjustment applied on an image"
+msgstr "Загальне коригування підсилення, застосоване до зображення"
+
+msgid "capturing white balance"
+msgstr "баланс білого"
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+"Режим балансування білого кольору, використаний під час створення зображення"
+
+msgid "capturing contrast"
+msgstr "контрастність"
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr "Напрям обробки контрастності, застосований при створенні зображення"
+
+msgid "capturing saturation"
+msgstr "насиченість"
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr "Напрям обробки насиченості, застосований при створенні зображення"
+
+msgid "capturing sharpness"
+msgstr "різкість"
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr "Напрям обробки різкості, застосований при створенні зображення"
+
+msgid "capturing flash fired"
+msgstr "спалах"
+
+msgid "If the flash fired while capturing an image"
+msgstr "Чи було використано спалах при створенні зображення"
+
+msgid "capturing flash mode"
+msgstr "режим спалаху"
+
+msgid "The selected flash mode while capturing an image"
+msgstr "Вибраний режим спалаху під час створення зображення"
+
+msgid "capturing metering mode"
+msgstr "режим вимірювання"
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+"Режим вимірювання, застосований для визначення експозиції створеного "
+"зображення"
+
+msgid "capturing source"
+msgstr "джерело"
+
+msgid "The source or type of device used for the capture"
+msgstr "Тип пристрою-джерела зображення"
+
+msgid "image horizontal ppi"
+msgstr "горизонтальна щільність пікселів"
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+"Горизонтальна щільність пікселів на матриці (зображення або відео), у точках "
+"на дюйм"
+
+msgid "image vertical ppi"
+msgstr "вертикальна щільність пікселів"
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+"Вертикальна щільність пікселів на матриці (зображення або відео), у точках "
+"на дюйм"
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "На цьому компакт-диску немає звукових доріжок"
+
+msgid "ID3 tag"
+msgstr "Мітка ID3"
+
+msgid "APE tag"
+msgstr "Мітка APE"
+
+msgid "ICY internet radio"
+msgstr "Інтернет-радіо ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Аудіо без втрат від Apple (ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "Вільний алгоритм аудіо без втрат (FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Lossless True Audio (TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media Speech"
+
+msgid "CYUV Lossless"
+msgstr "CYUV без втрат"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH без втрат"
+
+msgid "Run-length encoding"
+msgstr "Кодування Run-length"
+
+msgid "Sami subtitle format"
+msgstr "Формат субтитрів Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Формат субтитрів TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Формат субтитрів Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "Нестиснений YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Нестиснене сіре зображення"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "Нестиснений YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "Нестиснений пакетний %d-бітовий %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 версії %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "Нестиснений YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Необроблений %d-бітовий PCM-звук"
+
+msgid "Audio CD source"
+msgstr "Джерело аудіо-CD"
+
+msgid "DVD source"
+msgstr "Джерело DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "Джерело потокового протоколу реального часу (RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Джерело протоколу Microsoft Media Server (MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Джерело протоколу %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "RTP модуль розпаковування відеоданих %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "RTP модуль розпаковування аудіоданих %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "RTP модуль розпаковування даних %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "демультиплексор %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "декодер %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "RTP модуль запаковування відеоданих %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "RTP модуль запаковування аудіоданих %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "RTP модуль запаковування даних %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "мультиплексор %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "кодер %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Елемент GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Невідомий елемент джерела"
+
+msgid "Unknown sink element"
+msgstr "Невідомий елемент приймача"
+
+msgid "Unknown element"
+msgstr "Невідомий елемент"
+
+msgid "Unknown decoder element"
+msgstr "Невідомий елемент декодера"
+
+msgid "Unknown encoder element"
+msgstr "Невідомий елемент кодера"
+
+msgid "Plugin or element of unknown type"
+msgstr "Модуль або елемент невідомого типу"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "Нестиснений планарний YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "Нестиснений планарний YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "Нестиснений пакетний YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "Нестиснений пакетний YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "Нестиснений пакетний YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "Нестиснений пакетний YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "Нестиснений пакетний YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "Нестиснений планарний YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "Нестиснений планарний YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Нестиснений чорно-білий Y-проекція"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Необроблений PCM-звук"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Необроблений %d-бітовий звук (дані з плаваючою комою)"
+
+#~ msgid "Raw floating-point audio"
+#~ 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»."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Помилка при записі у файл «%s»."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "Неправильний URI субтитру «%s», субтитри вимкнено."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Відтворення потоків RTSP поки-що не підтримується."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Не вдалося створити елемент \"decodebin\"."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Виявлено лише потік субтитрів. Або ви завантажили файл субтитрів чи інший "
+#~ "текстовий файл, або носій не розпізнано."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Не встановлено декодер для обробки цього файлу. Можливо потрібно "
+#~ "встановити додаткові модулі."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Файл не є мультимедійним"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Виявлено потік субтитрів, але не відеопотік."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Відсутні елементи autovideosink та xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Відсутні елементи autoaudiosink та alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Пристрій не вказано."
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Пристрою «%s» не існує."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Пристрій «%s» вже використовується іншою програмою."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Не вдалося відкрити пристрій «%s» для читання чи запису."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Помилка при надсиланні заголовку gdp даних до \"%s:%d\"."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Помилка при надсиланні даних gdp до «%s:%d»."
+
+#~ msgid "No file name specified."
+#~ msgstr "Не вказано назву файлу."
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "Не вдається відкрити файл \"%s\" для читання."
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "Не вдається створити елемент \"decodebin2\"."
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "Не вдається створити елемент \"queue2\"."
+
+#~ msgid "artist sortname"
+#~ msgstr "категорія виконавця"
+
+#~ msgid "MusicBrainz artist sortname"
+#~ msgstr "Категорія виконавця у MusicBrainz"
diff --git a/po/vi.gmo b/po/vi.gmo
new file mode 100644
index 0000000..b06139d
--- /dev/null
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..36ae915
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,614 @@
+# Vietnamese Translation for GST Plugins Base.
+# This file is distributed under the same license as the gst-plugins-base package.
+# Clytie Siddall <clytie@riverland.net.au>, 2005-2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.28.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2010-04-27 22:51+0930\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: Vietnamese <vi-VN@googlegroups.com>\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 "Master"
+msgstr "Chủ"
+
+msgid "Bass"
+msgstr "Trầm"
+
+msgid "Treble"
+msgstr "Cao"
+
+msgid "PCM"
+msgstr "PCM"
+
+msgid "Synth"
+msgstr "Tổng hợp"
+
+msgid "Line-in"
+msgstr "Dây-vào"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "Máy vi âm"
+
+msgid "PC Speaker"
+msgstr "Loa PC"
+
+msgid "Playback"
+msgstr "Phát lại"
+
+msgid "Capture"
+msgstr "Bắt"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "Không thể mở thiết bị để phát lại trong chế độ đơn nguồn."
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "Không thể mở thiết bị để phát lại trong chế độ âm lập thể."
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "Không thể mở thiết bị để phát lại trong chế độ %d kê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, vì ứng dụng khác đang sử dụng nó."
+
+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 device for recording in mono mode."
+msgstr "Không thể mở thiết bị để thu trong chế độ đơn nguồn."
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "Không thể mở thiết bị để thu trong chế độ âm lập thể."
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "Không thể mở thiết bị để thu trong chế độ %d kênh."
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr ""
+"Không thể mở thiết bị âm thanh để thu, vì ứng dụng khác đang sử dụng nó."
+
+msgid "Could not open audio device for recording."
+msgstr "Không thể mở thiết bị âm thanh để thu."
+
+msgid "Could not open CD device for reading."
+msgstr "Không thể mở thiết bị đĩa CD để đọc."
+
+msgid "Could not seek CD."
+msgstr "Không thể tìm trên đĩa CD."
+
+msgid "Could not read CD."
+msgstr "Không thể đọc đĩa CD."
+
+msgid "Internal data stream error."
+msgstr "Lỗi luồng dữ liệu nội bộ."
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "Cần phần bổ sung %s để phát luồng này nhưng chưa cài đặt."
+
+msgid "Could not determine type of stream"
+msgstr "Không thể quyết định loại luồng"
+
+msgid "This appears to be a text file"
+msgstr "Hình như đây là tập tin văn bản"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "Thiếu phần tử « %s » — hãy kiểm tra lại cài đặt GStreamer."
+
+#, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "Thiếu phần tử autovideosink, cũng thiếu phần tử %s."
+
+msgid "The autovideosink element is missing."
+msgstr "Thiếu phần tử autovideosink."
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr "Phần tử videosink %s đã cấu hình mà không hoạt động."
+
+#, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "Cả hai phần tử autovideosink và %s không hoạt động."
+
+msgid "The autovideosink element is not working."
+msgstr "Phần tử autovideosink không hoạt động."
+
+msgid "Custom text sink element is not usable."
+msgstr "Không thể sử dụng yếu tố ổ chìm văn bản riêng."
+
+msgid "No volume control found"
+msgstr "Không tìm thấy điều khiển âm lượng"
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "Thiếu phần tử autoaudiosink, cũng thiếu phần tử %s."
+
+msgid "The autoaudiosink element is missing."
+msgstr "Thiếu phần tử autoaudiosink."
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr "Phần tử audiosink %s đã cấu hình mà không hoạt động."
+
+#, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "Cả hai phần tử autoaudiosink và %s không hoạt động."
+
+msgid "The autoaudiosink element is not working."
+msgstr "Phần tử autoaudiosink không hoạt động."
+
+msgid "Can't play a text file without video or visualizations."
+msgstr ""
+"Không thể phát tập tin văn bản mà không có ảnh động hay cách thức hiển thị."
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "Không có bộ giải mã sẵn sàng cho kiểu « %s »."
+
+msgid "No URI specified to play from."
+msgstr "Chưa ghi rõ URI từ đó cần phát."
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "URI không hợp lệ « %s »."
+
+msgid "This stream type cannot be played yet."
+msgstr "Chưa có khả năng phát kiểu luồng này."
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "Không có bộ quản lý địa chỉ URI được thực hiện cho « %s »."
+
+msgid "Source element is invalid."
+msgstr "Phần tử nguồn không phải hợp lệ."
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "Lỗi khi gởi dữ liệu cho « %s:%d »."
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "Kết nối tới « %s:%d » bị từ chối."
+
+msgid "Can't record audio fast enough"
+msgstr "Không thể thu âm thanh một cách đủ nhanh"
+
+msgid "Failed to read tag: not enough data"
+msgstr "Lỗi đọc thẻ: không đủ dữ liệu"
+
+msgid "track ID"
+msgstr "mã rãnh"
+
+msgid "MusicBrainz track ID"
+msgstr "mã rãnh MusicBrainz"
+
+msgid "artist ID"
+msgstr "mã nghệ sĩ"
+
+msgid "MusicBrainz artist ID"
+msgstr "mã nghệ sĩ MusicBrainz"
+
+msgid "album ID"
+msgstr "mã tập nhạc"
+
+msgid "MusicBrainz album ID"
+msgstr "mã tập nhạc MusicBrainz"
+
+msgid "album artist ID"
+msgstr "mã nghệ sĩ tập nhạc"
+
+msgid "MusicBrainz album artist ID"
+msgstr "mã nghệ sĩ tập nhạc MusicBrainz"
+
+msgid "track TRM ID"
+msgstr "mã TRM rãnh"
+
+msgid "MusicBrainz TRM ID"
+msgstr "mã TRM rãnh MusicBrainz"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "Đĩa CD này không có rãnh âm thanh nào"
+
+msgid "ID3 tag"
+msgstr "Thẻ ID3"
+
+msgid "APE tag"
+msgstr "Thẻ APE"
+
+msgid "ICY internet radio"
+msgstr "Thu thanh Internet ICY"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Âm thanh không mất gì của Apple (Apple Lossless Audio: ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr ""
+"Phương pháp tự do không mất gì nén và truyền nhiều loại dữ liệu âm thanh "
+"khác (Free Lossless Audio Codec: FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "Âm thanh đúng không mất gì (Lossless True Audio: TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Tiếng nói của nhạc/ảnh Windows (Windows Media Speech)"
+
+msgid "CYUV Lossless"
+msgstr "CYUV không mất gì (CYUV Lossless)"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "MSZH không mất gì (Lossless MSZH)"
+
+msgid "Run-length encoding"
+msgstr "Mã hoá độ dài chạy (Run-Length Encoding: RLE)"
+
+msgid "Sami subtitle format"
+msgstr "Định dạng phụ đề Sami"
+
+msgid "TMPlayer subtitle format"
+msgstr "Định dạng phụ đề TMPlayer"
+
+msgid "Kate subtitle format"
+msgstr "Định dạng phụ đề Kate"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "YUV không nén"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "Ảnh màu xám không nén"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "YUV không nén"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "%d-bit %s có bảng chọn không nén"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 Phiên bản %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "YUV không nén"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "Âm thanh PCM %d-bit thô"
+
+msgid "Audio CD source"
+msgstr "Nguồn đĩa CD âm thanh"
+
+msgid "DVD source"
+msgstr "Nguồn đĩa DVD"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr ""
+"Nguồn Giao thức chạy luồng giờ thật (Real Time Streaming Protocol: RTSP)"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr ""
+"Nguồn Giao thức trình phục vụ nhạc/ảnh Microsoft (Microsoft Media Server: "
+"MMS)"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "Nguồn giao thức %s"
+
+#, c-format
+msgid "%s video RTP depayloader"
+msgstr "depayloader (bộ trừ trọng tải?) RTP ảnh động %s"
+
+#, c-format
+msgid "%s audio RTP depayloader"
+msgstr "depayloader (bộ trừ trọng tải?) RTP âm thanh %s"
+
+#, c-format
+msgid "%s RTP depayloader"
+msgstr "depayloader (bộ trừ trọng tải?) RTP %s"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "demuxer (bộ chia ra) %s"
+
+#, c-format
+msgid "%s decoder"
+msgstr "bộ giải mã %s"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "payloader (bộ cộng trọng tải?) RTP ảnh động %s"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "payloader (bộ cộng trọng tải?) RTP âm thanh %s"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "payloader (bộ cộng trọng tải?) RTP %s"
+
+#, c-format
+msgid "%s muxer"
+msgstr "muxer (bộ kết hợp lại) %s"
+
+#, c-format
+msgid "%s encoder"
+msgstr "bộ mã hoá %s"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "Phần tử GStreamer %s"
+
+msgid "Unknown source element"
+msgstr "Không rõ phần tử nguồn"
+
+msgid "Unknown sink element"
+msgstr "Không rõ phần tử ổ chìm"
+
+msgid "Unknown element"
+msgstr "Không rõ phần tử"
+
+msgid "Unknown decoder element"
+msgstr "Không rõ phần tử giải mã"
+
+msgid "Unknown encoder element"
+msgstr "Không rõ phần tử mã hoá"
+
+msgid "Plugin or element of unknown type"
+msgstr "Không rõ kiểu phần bổ sung hay phần tử"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "YUV 4:2:0 phẳng không nén"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "YUV 4:2:0 phẳng không nén"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 đóng gói không nén"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "YUV 4:1:0 đóng gói không nén"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "YVU 4:1:0 đóng gói không nén"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 đóng gói không nén"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "YUV 4:4:4 đóng gói không nén"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "YUV 4:2:2 phẳng không nén"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "YUV 4:1:1 phẳng không nén"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "Mặt phẳng Y đen trắng không nén"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "Âm thanh PCM thô"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "Âm thanh dấu phẩy động %d-bit thô"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "Âm thanh dấu phẩy động thô"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "Không thể mở tập tin VFS « %s » để ghi: %s."
+
+#~ msgid "No filename given"
+#~ msgstr "Chưa nhập tên tập tin"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "Không thể đóng tập tin VFS « %s »."
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "Lỗi khi ghi vào tập tin « %s »."
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "URI phụ đề không hợp lệ « %s » nên tắt khả năng phụ đề."
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "Chưa có khả năng phát luồng RTSP."
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "Không thể tạo phần tử « decodebin »."
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "Chỉ phát hiện luồng phụ đề. Hoặc bạn đang nạp tập tin phụ đề hay tập tin "
+#~ "văn bản kiểu khác, hoặc không nhận diện tập tin nhạc/ảnh."
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr ""
+#~ "Chưa cài đặt bộ giải mã có khả năng quản lý tập tin này. Có thể cần phải "
+#~ "cài đặt các phần bổ sung thích hợp."
+
+#~ msgid "This is not a media file"
+#~ msgstr "Đây không phải tập tin nhạc/ảnh"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "Phát hiện luồng phụ đề, không có luồng ảnh động."
+
+#~ msgid "Both autovideosink and xvimagesink elements are missing."
+#~ msgstr "Thiếu phần tử autovideosink, cũng thiếu phần tử xvimagesink."
+
+#~ msgid "Both autoaudiosink and alsasink elements are missing."
+#~ msgstr "Thiếu phần tử autoaudiosink, cũng thiếu phần tử alsasink."
+
+#~ msgid "No device specified."
+#~ msgstr "Chưa ghi rõ thiết bị nào"
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "Không có thiết bị « %s »."
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "Thiết bị « %s » đang được dùng."
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "Không thể mở thiết bị « %s » để đọc và ghi."
+
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "Lỗi khi gởi dữ liệu phần đầu GDP cho « %s:%d »."
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "Lỗi khi gởi dữ liệu trọng tải GDP cho « %s:%d »."
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
new file mode 100644
index 0000000..257332e
--- /dev/null
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..05c7089
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,615 @@
+# Chinese (simplified) translation about gst-plugin-base.
+# This file is put in the public domain.
+# Funda Wang <fundawang@linux.net.cn>, 2005.
+# Ji ZhengYu <zhengyuji@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: gst-plugins-base 0.10.21.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 17:27+0200\n"
+"PO-Revision-Date: 2009-01-14 12:41+0800\n"
+"Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Master"
+msgstr "主音量"
+
+msgid "Bass"
+msgstr "低音(Bass)"
+
+msgid "Treble"
+msgstr "高音(Treble)"
+
+msgid "PCM"
+msgstr "波形"
+
+msgid "Synth"
+msgstr "合成器"
+
+msgid "Line-in"
+msgstr "线路输入"
+
+msgid "CD"
+msgstr "CD"
+
+msgid "Microphone"
+msgstr "话筒"
+
+msgid "PC Speaker"
+msgstr "PC 扬声器"
+
+msgid "Playback"
+msgstr "回放"
+
+msgid "Capture"
+msgstr "录音"
+
+msgid "Could not open device for playback in mono mode."
+msgstr "无法在单声道模式打开设备播放。"
+
+msgid "Could not open device for playback in stereo mode."
+msgstr "无法在立体声模式打开设备播放。"
+
+#, c-format
+msgid "Could not open device for playback in %d-channel mode."
+msgstr "无法在 %d 声道模式打开设备播放。"
+
+msgid ""
+"Could not open audio device for playback. Device is being used by another "
+"application."
+msgstr "无法打开音频设备用于回放。目前有另一个程序正在使用该设备。"
+
+msgid "Could not open audio device for playback."
+msgstr "无法打开音频设备播放。"
+
+msgid "Could not open device for recording in mono mode."
+msgstr "无法在单声道模式打开设备录音。"
+
+msgid "Could not open device for recording in stereo mode."
+msgstr "无法在立体声模式打开设备录音。"
+
+#, c-format
+msgid "Could not open device for recording in %d-channel mode"
+msgstr "无法在 %d 声道模式打开设备录音。"
+
+msgid ""
+"Could not open audio device for recording. Device is being used by another "
+"application."
+msgstr "无法打开音频设备用于录音。目前有另一个程序正在使用该设备。"
+
+msgid "Could not open audio device for recording."
+msgstr "无法打开音频设备录音。"
+
+msgid "Could not open CD device for reading."
+msgstr "无法打开 CD 设备读取。"
+
+msgid "Could not seek CD."
+msgstr "无法搜索 CD。"
+
+msgid "Could not read CD."
+msgstr "无法读取 CD。"
+
+msgid "Internal data stream error."
+msgstr "内部数据流错误。"
+
+#, c-format
+msgid "A %s plugin is required to play this stream, but not installed."
+msgstr "播放此数据流需要 %s 插件,但它未安装。"
+
+#, fuzzy
+msgid "Could not determine type of stream"
+msgstr "无法创建“typefind”组件。"
+
+msgid "This appears to be a text file"
+msgstr "此文件是个文本文件"
+
+#, c-format
+msgid "Missing element '%s' - check your GStreamer installation."
+msgstr "未找到组件‘%s’-请检查您的 GStreamer 安装情况。"
+
+#, fuzzy, c-format
+msgid "Both autovideosink and %s elements are missing."
+msgstr "autovideosink 和 xvimagesink 组件都缺少。"
+
+#, fuzzy
+msgid "The autovideosink element is missing."
+msgstr "autovideosink 和 xvimagesink 组件都缺少。"
+
+#, c-format
+msgid "Configured videosink %s is not working."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Both autovideosink and %s elements are not working."
+msgstr "autovideosink 和 xvimagesink 组件都缺少。"
+
+#, fuzzy
+msgid "The autovideosink element is not working."
+msgstr "autovideosink 和 xvimagesink 组件都缺少。"
+
+msgid "Custom text sink element is not usable."
+msgstr ""
+
+msgid "No volume control found"
+msgstr "未找到音量控制"
+
+#, fuzzy, c-format
+msgid "Both autoaudiosink and %s elements are missing."
+msgstr "autovideosink 和 alsasink 组件都缺少。"
+
+#, fuzzy
+msgid "The autoaudiosink element is missing."
+msgstr "autovideosink 和 alsasink 组件都缺少。"
+
+#, c-format
+msgid "Configured audiosink %s is not working."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Both autoaudiosink and %s elements are not working."
+msgstr "autovideosink 和 alsasink 组件都缺少。"
+
+#, fuzzy
+msgid "The autoaudiosink element is not working."
+msgstr "autovideosink 和 alsasink 组件都缺少。"
+
+#, fuzzy
+msgid "Can't play a text file without video or visualizations."
+msgstr "无法播放不带视频的文本文件。"
+
+#, c-format
+msgid "No decoder available for type '%s'."
+msgstr "找不到‘%s’类型可用的解码器。"
+
+msgid "No URI specified to play from."
+msgstr "未指定要播放的 URI。"
+
+#, c-format
+msgid "Invalid URI \"%s\"."
+msgstr "无效的 URI“%s”。"
+
+msgid "This stream type cannot be played yet."
+msgstr "此类型的数据流尚不能播放。"
+
+#, c-format
+msgid "No URI handler implemented for \"%s\"."
+msgstr "“%s”未实现 URI 处理器。"
+
+msgid "Source element is invalid."
+msgstr "无效的源组件。"
+
+#, c-format
+msgid "Error while sending data to \"%s:%d\"."
+msgstr "发送数据至“%s:%d”时出错。"
+
+#, c-format
+msgid "Connection to %s:%d refused."
+msgstr "拒绝连接至 %s:%d。"
+
+msgid "Can't record audio fast enough"
+msgstr "无法足够快的录音"
+
+msgid "Failed to read tag: not enough data"
+msgstr "无法读取标签: 数据不足"
+
+msgid "track ID"
+msgstr "音轨 ID"
+
+msgid "MusicBrainz track ID"
+msgstr "MusicBrainz 音轨 ID"
+
+msgid "artist ID"
+msgstr "艺人 ID"
+
+msgid "MusicBrainz artist ID"
+msgstr "MusicBrainz 艺人 ID"
+
+msgid "album ID"
+msgstr "专辑 ID"
+
+msgid "MusicBrainz album ID"
+msgstr "MusicBrainz 专辑 ID"
+
+msgid "album artist ID"
+msgstr "音轨艺人 ID"
+
+msgid "MusicBrainz album artist ID"
+msgstr "MusicBrainz 专辑艺人 ID"
+
+msgid "track TRM ID"
+msgstr "音轨 TRM ID"
+
+msgid "MusicBrainz TRM ID"
+msgstr "MusicBrainz TRM ID"
+
+msgid "capturing shutter speed"
+msgstr ""
+
+msgid "Shutter speed used when capturing an image, in seconds"
+msgstr ""
+
+msgid "capturing focal ratio"
+msgstr ""
+
+msgid "Focal ratio (f-number) used when capturing the image"
+msgstr ""
+
+msgid "capturing focal length"
+msgstr ""
+
+msgid "Focal length of the lens used capturing the image, in mm"
+msgstr ""
+
+msgid "capturing digital zoom ratio"
+msgstr ""
+
+msgid "Digital zoom ratio used when capturing an image"
+msgstr ""
+
+msgid "capturing iso speed"
+msgstr ""
+
+msgid "The ISO speed used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure program"
+msgstr ""
+
+msgid "The exposure program used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure mode"
+msgstr ""
+
+msgid "The exposure mode used when capturing an image"
+msgstr ""
+
+msgid "capturing exposure compensation"
+msgstr ""
+
+msgid "The exposure compensation used when capturing an image"
+msgstr ""
+
+msgid "capturing scene capture type"
+msgstr ""
+
+msgid "The scene capture mode used when capturing an image"
+msgstr ""
+
+msgid "capturing gain adjustment"
+msgstr ""
+
+msgid "The overall gain adjustment applied on an image"
+msgstr ""
+
+msgid "capturing white balance"
+msgstr ""
+
+msgid "The white balance mode set when capturing an image"
+msgstr ""
+
+msgid "capturing contrast"
+msgstr ""
+
+msgid "The direction of contrast processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing saturation"
+msgstr ""
+
+msgid "The direction of saturation processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing sharpness"
+msgstr ""
+
+msgid "The direction of sharpness processing applied when capturing an image"
+msgstr ""
+
+msgid "capturing flash fired"
+msgstr ""
+
+msgid "If the flash fired while capturing an image"
+msgstr ""
+
+msgid "capturing flash mode"
+msgstr ""
+
+msgid "The selected flash mode while capturing an image"
+msgstr ""
+
+msgid "capturing metering mode"
+msgstr ""
+
+msgid ""
+"The metering mode used while determining exposure for capturing an image"
+msgstr ""
+
+msgid "capturing source"
+msgstr ""
+
+msgid "The source or type of device used for the capture"
+msgstr ""
+
+msgid "image horizontal ppi"
+msgstr ""
+
+msgid "Media (image/video) intended horizontal pixel density in ppi"
+msgstr ""
+
+msgid "image vertical ppi"
+msgstr ""
+
+msgid "Media (image/video) intended vertical pixel density in ppi"
+msgstr ""
+
+msgid "ID3v2 frame"
+msgstr ""
+
+msgid "unparsed id3v2 tag frame"
+msgstr ""
+
+msgid "This CD has no audio tracks"
+msgstr "此 CD 无音轨"
+
+msgid "ID3 tag"
+msgstr "ID3 标识"
+
+msgid "APE tag"
+msgstr "APE 标识"
+
+msgid "ICY internet radio"
+msgstr "ICY 网络电台"
+
+msgid "Apple Lossless Audio (ALAC)"
+msgstr "Apple 无损音频(ALAC)"
+
+msgid "Free Lossless Audio Codec (FLAC)"
+msgstr "自由无损音频编码(FLAC)"
+
+msgid "Lossless True Audio (TTA)"
+msgstr "无损高保真音频(TTA)"
+
+msgid "Windows Media Speech"
+msgstr "Windows Media 语音"
+
+msgid "CYUV Lossless"
+msgstr "CYUV 无损"
+
+msgid "FFMpeg v1"
+msgstr "FFMpeg v1"
+
+msgid "Lossless MSZH"
+msgstr "无损 MSZH"
+
+msgid "Run-length encoding"
+msgstr "Run-length 编码"
+
+msgid "Sami subtitle format"
+msgstr "Sami 字幕格式"
+
+msgid "TMPlayer subtitle format"
+msgstr "TMPlayer 字幕格式"
+
+msgid "Kate subtitle format"
+msgstr "Kate 字幕格式"
+
+#, fuzzy
+msgid "Uncompressed video"
+msgstr "未压缩的 YUV"
+
+#, fuzzy
+msgid "Uncompressed gray"
+msgstr "未压缩的灰度图像"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s YUV %s"
+msgstr "未压缩的 YUV"
+
+#, fuzzy, c-format
+msgid "Uncompressed %s%d-bit %s"
+msgstr "未压缩的 palettized %d-位 %s"
+
+#, c-format
+msgid "DivX MPEG-4 Version %d"
+msgstr "DivX MPEG-4 版本 %d"
+
+#, fuzzy
+msgid "Uncompressed audio"
+msgstr "未压缩的 YUV"
+
+#, fuzzy, c-format
+msgid "Raw %d-bit %s audio"
+msgstr "原始 %d-位 PCM 音频"
+
+msgid "Audio CD source"
+msgstr "音频 CD 源"
+
+msgid "DVD source"
+msgstr "DVD 源"
+
+msgid "Real Time Streaming Protocol (RTSP) source"
+msgstr "实时流协议(RTSP)源"
+
+msgid "Microsoft Media Server (MMS) protocol source"
+msgstr "Microsoft 媒体服务协议(MMS)源"
+
+#, c-format
+msgid "%s protocol source"
+msgstr "%s 协议源"
+
+#, fuzzy, c-format
+msgid "%s video RTP depayloader"
+msgstr "%s 视频 RTP 去负载器"
+
+#, fuzzy, c-format
+msgid "%s audio RTP depayloader"
+msgstr "%s 音频 RTP 去负载器"
+
+#, fuzzy, c-format
+msgid "%s RTP depayloader"
+msgstr "%s RTP 去负载器"
+
+#, c-format
+msgid "%s demuxer"
+msgstr "%s 多路分配器"
+
+#, c-format
+msgid "%s decoder"
+msgstr "%s 解码器"
+
+#, c-format
+msgid "%s video RTP payloader"
+msgstr "%s 视频 RTP 负载器"
+
+#, c-format
+msgid "%s audio RTP payloader"
+msgstr "%s 音频 RTP 负载器"
+
+#, c-format
+msgid "%s RTP payloader"
+msgstr "%s RTP 负载器"
+
+#, c-format
+msgid "%s muxer"
+msgstr "%s 混音器"
+
+#, c-format
+msgid "%s encoder"
+msgstr "%s 编码器"
+
+#, c-format
+msgid "GStreamer element %s"
+msgstr "GStreamer 组件 %s"
+
+msgid "Unknown source element"
+msgstr "未知源组件"
+
+msgid "Unknown sink element"
+msgstr "未知消音组件"
+
+msgid "Unknown element"
+msgstr "未知组件"
+
+msgid "Unknown decoder element"
+msgstr "未知的解码组件"
+
+msgid "Unknown encoder element"
+msgstr "未知的编码组件"
+
+msgid "Plugin or element of unknown type"
+msgstr "未知类型的插件或组件"
+
+#~ msgid "Could not open vfs file \"%s\" for writing: %s."
+#~ msgstr "无法打开 vfs 文件“%s”写入:%s。"
+
+#~ msgid "No filename given"
+#~ msgstr "没有给定文件名"
+
+#~ msgid "Could not close vfs file \"%s\"."
+#~ msgstr "无法关闭 vfs 文件“%s”。"
+
+#~ msgid "Error while writing to file \"%s\"."
+#~ msgstr "写入文件“%s”时出错。"
+
+#~ msgid "Invalid subtitle URI \"%s\", subtitles disabled."
+#~ msgstr "无效的字幕 URI “%s”,不使用字幕。"
+
+#~ msgid "RTSP streams cannot be played yet."
+#~ msgstr "RTSP 流尚不能播放。"
+
+#~ msgid "Could not create \"decodebin\" element."
+#~ msgstr "无法创建“decodebin”组件。"
+
+#~ msgid ""
+#~ "Only a subtitle stream was detected. Either you are loading a subtitle "
+#~ "file or some other type of text file, or the media file was not "
+#~ "recognized."
+#~ msgstr ""
+#~ "仅检测到字幕流。您可能装入的是字幕文件或者其它类型文本文件,又或者是媒体文"
+#~ "件无法识别。"
+
+#~ msgid ""
+#~ "You do not have a decoder installed to handle this file. You might need "
+#~ "to install the necessary plugins."
+#~ msgstr "您没有安装可处理此文件的解码器。您可能需要安装必要的插件。"
+
+#~ msgid "This is not a media file"
+#~ msgstr "此文件不是媒体文件"
+
+#~ msgid "A subtitle stream was detected, but no video stream."
+#~ msgstr "检测到了字幕流,但无视频流。"
+
+#~ msgid "No file name specified."
+#~ msgstr "未给定文件名。"
+
+#~ msgid "Could not open file \"%s\" for reading."
+#~ msgstr "无法打开文件“%s”读取。"
+
+#~ msgid "Could not create \"decodebin2\" element."
+#~ msgstr "无法创建“decodebin”组件。"
+
+#~ msgid "Could not create \"queue2\" element."
+#~ msgstr "无法创建“queue2”组件。"
+
+#, fuzzy
+#~ msgid "Error while sending gdp header data to \"%s:%d\"."
+#~ msgstr "发送 gdp 头部数据至“%s:%d”时出错。"
+
+#~ msgid "Error while sending gdp payload data to \"%s:%d\"."
+#~ msgstr "发送 gdp 负载数据至“%s:%d”时出错。"
+
+#~ msgid "Uncompressed planar YUV 4:2:0"
+#~ msgstr "未压缩的 planar YUV 4:2:0"
+
+#~ msgid "Uncompressed planar YVU 4:2:0"
+#~ msgstr "未压缩的 planar YVU 4:2:0"
+
+#~ msgid "Uncompressed packed YUV 4:2:2"
+#~ msgstr "未压缩的 packed YUV 4:2:2"
+
+#~ msgid "Uncompressed packed YUV 4:1:0"
+#~ msgstr "未压缩的 packed YUV 4:1:0"
+
+#~ msgid "Uncompressed packed YVU 4:1:0"
+#~ msgstr "未压缩的 packed YVU 4:1:0"
+
+#~ msgid "Uncompressed packed YUV 4:1:1"
+#~ msgstr "未压缩的 packed YUV 4:1:1"
+
+#~ msgid "Uncompressed packed YUV 4:4:4"
+#~ msgstr "未压缩的 packed YUV 4:4:4"
+
+#~ msgid "Uncompressed planar YUV 4:2:2"
+#~ msgstr "未压缩的 planar YUV 4:2:2"
+
+#~ msgid "Uncompressed planar YUV 4:1:1"
+#~ msgstr "未压缩的 planar YUV 4:1:1"
+
+#~ msgid "Uncompressed black and white Y-plane"
+#~ msgstr "未压缩的黑白 Y-plane"
+
+#~ msgid "Raw PCM audio"
+#~ msgstr "原始 PCM 音频"
+
+#~ msgid "Raw %d-bit floating-point audio"
+#~ msgstr "原始 %d-位浮点音频"
+
+#~ msgid "Raw floating-point audio"
+#~ msgstr "原始浮点音频"
+
+#~ msgid "No device specified."
+#~ msgstr "未指定设备。"
+
+#~ msgid "Device \"%s\" does not exist."
+#~ msgstr "设备“%s”不存在。"
+
+#~ msgid "Device \"%s\" is already being used."
+#~ msgstr "设备“%s”目前已被使用了。"
+
+#~ msgid "Could not open device \"%s\" for reading and writing."
+#~ msgstr "无法打开设备“%s”读取。"
diff --git a/sys/Makefile.am b/sys/Makefile.am
new file mode 100644
index 0000000..c3c2238
--- /dev/null
+++ b/sys/Makefile.am
@@ -0,0 +1,21 @@
+if USE_X
+XIMAGE_DIR=ximage
+else
+XIMAGE_DIR=
+endif
+
+if USE_XVIDEO
+XVIMAGE_DIR=xvimage
+else
+XVIMAGE_DIR=
+endif
+
+SUBDIRS = \
+ $(XIMAGE_DIR) \
+ $(XVIMAGE_DIR)
+
+DIST_SUBDIRS = \
+ ximage \
+ xvimage
+
+include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/sys/Makefile.in b/sys/Makefile.in
new file mode 100644
index 0000000..ef5d80e
--- /dev/null
+++ b/sys/Makefile.in
@@ -0,0 +1,784 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_X_FALSE@XIMAGE_DIR =
+@USE_X_TRUE@XIMAGE_DIR = ximage
+@USE_XVIDEO_FALSE@XVIMAGE_DIR =
+@USE_XVIDEO_TRUE@XVIMAGE_DIR = xvimage
+SUBDIRS = \
+ $(XIMAGE_DIR) \
+ $(XVIMAGE_DIR)
+
+DIST_SUBDIRS = \
+ ximage \
+ xvimage
+
+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_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/ximage/Makefile.am b/sys/ximage/Makefile.am
new file mode 100644
index 0000000..df14448
--- /dev/null
+++ b/sys/ximage/Makefile.am
@@ -0,0 +1,14 @@
+plugin_LTLIBRARIES = libgstximagesink.la
+
+libgstximagesink_la_SOURCES = ximagesink.c ximage.c ximagepool.c
+libgstximagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+libgstximagesink_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(X_LIBS) $(XSHM_LIBS)
+libgstximagesink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstximagesink_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la
+libgstximagesink_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = ximagesink.h ximagepool.h
diff --git a/sys/ximage/Makefile.in b/sys/ximage/Makefile.in
new file mode 100644
index 0000000..21f5c6b
--- /dev/null
+++ b/sys/ximage/Makefile.in
@@ -0,0 +1,779 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstximagesink_la_OBJECTS = libgstximagesink_la-ximagesink.lo \
+ libgstximagesink_la-ximage.lo \
+ libgstximagesink_la-ximagepool.lo
+libgstximagesink_la_OBJECTS = $(am_libgstximagesink_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstximagesink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstximagesink_la_CFLAGS) $(CFLAGS) \
+ $(libgstximagesink_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstximagesink_la_SOURCES)
+DIST_SOURCES = $(libgstximagesink_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstximagesink.la
+libgstximagesink_la_SOURCES = ximagesink.c ximage.c ximagepool.c
+libgstximagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+libgstximagesink_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(X_LIBS) $(XSHM_LIBS)
+
+libgstximagesink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstximagesink_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la
+libgstximagesink_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = ximagesink.h ximagepool.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
+libgstximagesink.la: $(libgstximagesink_la_OBJECTS) $(libgstximagesink_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstximagesink_la_LINK) -rpath $(plugindir) $(libgstximagesink_la_OBJECTS) $(libgstximagesink_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesink_la-ximage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesink_la-ximagepool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesink_la-ximagesink.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstximagesink_la-ximagesink.lo: ximagesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -MT libgstximagesink_la-ximagesink.lo -MD -MP -MF $(DEPDIR)/libgstximagesink_la-ximagesink.Tpo -c -o libgstximagesink_la-ximagesink.lo `test -f 'ximagesink.c' || echo '$(srcdir)/'`ximagesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesink_la-ximagesink.Tpo $(DEPDIR)/libgstximagesink_la-ximagesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ximagesink.c' object='libgstximagesink_la-ximagesink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -c -o libgstximagesink_la-ximagesink.lo `test -f 'ximagesink.c' || echo '$(srcdir)/'`ximagesink.c
+
+libgstximagesink_la-ximage.lo: ximage.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -MT libgstximagesink_la-ximage.lo -MD -MP -MF $(DEPDIR)/libgstximagesink_la-ximage.Tpo -c -o libgstximagesink_la-ximage.lo `test -f 'ximage.c' || echo '$(srcdir)/'`ximage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesink_la-ximage.Tpo $(DEPDIR)/libgstximagesink_la-ximage.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ximage.c' object='libgstximagesink_la-ximage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -c -o libgstximagesink_la-ximage.lo `test -f 'ximage.c' || echo '$(srcdir)/'`ximage.c
+
+libgstximagesink_la-ximagepool.lo: ximagepool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -MT libgstximagesink_la-ximagepool.lo -MD -MP -MF $(DEPDIR)/libgstximagesink_la-ximagepool.Tpo -c -o libgstximagesink_la-ximagepool.lo `test -f 'ximagepool.c' || echo '$(srcdir)/'`ximagepool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesink_la-ximagepool.Tpo $(DEPDIR)/libgstximagesink_la-ximagepool.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ximagepool.c' object='libgstximagesink_la-ximagepool.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesink_la_CFLAGS) $(CFLAGS) -c -o libgstximagesink_la-ximagepool.lo `test -f 'ximagepool.c' || echo '$(srcdir)/'`ximagepool.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/ximage.c b/sys/ximage/ximage.c
new file mode 100644
index 0000000..24a9e61
--- /dev/null
+++ b/sys/ximage/ximage.c
@@ -0,0 +1,51 @@
+/* GStreamer
+ * Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ximagesink.h"
+
+GST_DEBUG_CATEGORY (gst_debug_ximagepool);
+GST_DEBUG_CATEGORY (gst_debug_ximagesink);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "ximagesink",
+ GST_RANK_SECONDARY, GST_TYPE_XIMAGESINK))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (gst_debug_ximagesink, "ximagesink", 0,
+ "ximagesink element");
+ GST_DEBUG_CATEGORY_INIT (gst_debug_ximagepool, "ximagepool", 0,
+ "ximagepool object");
+
+ GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "ximagesink",
+ "X11 video output element based on standard Xlib calls",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/sys/ximage/ximagepool.c b/sys/ximage/ximagepool.c
new file mode 100644
index 0000000..06a5c72
--- /dev/null
+++ b/sys/ximage/ximagepool.c
@@ -0,0 +1,649 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Object header */
+#include "ximagesink.h"
+
+/* Debugging category */
+#include <gst/gstinfo.h>
+
+/* Helper functions */
+#include <gst/video/video.h>
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_debug_ximagepool);
+#define GST_CAT_DEFAULT gst_debug_ximagepool
+
+struct _GstXImageBufferPoolPrivate
+{
+ GstCaps *caps;
+ GstVideoInfo info;
+ GstVideoAlignment align;
+ guint padded_width;
+ guint padded_height;
+ gboolean add_metavideo;
+ gboolean need_alignment;
+};
+
+static void gst_meta_ximage_free (GstMetaXImage * meta, GstBuffer * buffer);
+
+/* ximage metadata */
+const GstMetaInfo *
+gst_meta_ximage_get_info (void)
+{
+ static const GstMetaInfo *meta_ximage_info = NULL;
+
+ if (meta_ximage_info == NULL) {
+ meta_ximage_info = gst_meta_register ("GstMetaXImage", "GstMetaXImage",
+ sizeof (GstMetaXImage),
+ (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) gst_meta_ximage_free,
+ (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL);
+ }
+ return meta_ximage_info;
+}
+
+/* X11 stuff */
+static gboolean error_caught = FALSE;
+
+static int
+gst_ximagesink_handle_xerror (Display * display, XErrorEvent * xevent)
+{
+ char error_msg[1024];
+
+ XGetErrorText (display, xevent->error_code, error_msg, 1024);
+ GST_DEBUG ("ximagesink triggered an XError. error: %s", error_msg);
+ error_caught = TRUE;
+ return 0;
+}
+
+static GstMetaXImage *
+gst_buffer_add_meta_ximage (GstBuffer * buffer, GstXImageBufferPool * xpool)
+{
+ GstXImageSink *ximagesink;
+ int (*handler) (Display *, XErrorEvent *);
+ gboolean success = FALSE;
+ GstXContext *xcontext;
+ GstMetaXImage *meta;
+ gint width, height;
+ GstXImageBufferPoolPrivate *priv;
+
+ priv = xpool->priv;
+ ximagesink = xpool->sink;
+ xcontext = ximagesink->xcontext;
+
+ width = priv->padded_width;
+ height = priv->padded_height;
+
+ meta =
+ (GstMetaXImage *) gst_buffer_add_meta (buffer, GST_META_INFO_XIMAGE,
+ NULL);
+#ifdef HAVE_XSHM
+ meta->SHMInfo.shmaddr = ((void *) -1);
+ meta->SHMInfo.shmid = -1;
+#endif
+ meta->x = priv->align.padding_left;
+ meta->y = priv->align.padding_top;
+ meta->width = GST_VIDEO_INFO_WIDTH (&priv->info);
+ meta->height = GST_VIDEO_INFO_HEIGHT (&priv->info);
+ meta->sink = gst_object_ref (ximagesink);
+
+ GST_DEBUG_OBJECT (ximagesink, "creating image %p (%dx%d)", buffer,
+ width, height);
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ /* Setting an error handler to catch failure */
+ error_caught = FALSE;
+ handler = XSetErrorHandler (gst_ximagesink_handle_xerror);
+
+#ifdef HAVE_XSHM
+ if (xcontext->use_xshm) {
+ meta->ximage = XShmCreateImage (xcontext->disp,
+ xcontext->visual,
+ xcontext->depth, ZPixmap, NULL, &meta->SHMInfo, width, height);
+ if (!meta->ximage || error_caught) {
+ g_mutex_unlock (ximagesink->x_lock);
+
+ /* Reset error flag */
+ error_caught = FALSE;
+
+ /* Push a warning */
+ GST_ELEMENT_WARNING (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not XShmCreateImage a %dx%d image", width, height));
+
+ /* Retry without XShm */
+ ximagesink->xcontext->use_xshm = FALSE;
+
+ /* Hold X mutex again to try without XShm */
+ g_mutex_lock (ximagesink->x_lock);
+
+ goto no_xshm;
+ }
+
+ /* we have to use the returned bytes_per_line for our shm size */
+ meta->size = meta->ximage->bytes_per_line * meta->ximage->height;
+ GST_LOG_OBJECT (ximagesink,
+ "XShm image size is %" G_GSIZE_FORMAT ", width %d, stride %d",
+ meta->size, width, meta->ximage->bytes_per_line);
+
+ /* get shared memory */
+ meta->SHMInfo.shmid = shmget (IPC_PRIVATE, meta->size, IPC_CREAT | 0777);
+ if (meta->SHMInfo.shmid == -1)
+ goto shmget_failed;
+
+ /* attach */
+ meta->SHMInfo.shmaddr = shmat (meta->SHMInfo.shmid, NULL, 0);
+ if (meta->SHMInfo.shmaddr == ((void *) -1))
+ goto shmat_failed;
+
+ /* now we can set up the image data */
+ meta->ximage->data = meta->SHMInfo.shmaddr;
+ meta->SHMInfo.readOnly = FALSE;
+
+ if (XShmAttach (xcontext->disp, &meta->SHMInfo) == 0)
+ goto xattach_failed;
+
+ XSync (xcontext->disp, FALSE);
+
+ /* Now that everyone has attached, we can delete the shared memory segment.
+ * This way, it will be deleted as soon as we detach later, and not
+ * leaked if we crash. */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+
+ GST_DEBUG_OBJECT (ximagesink, "XServer ShmAttached to 0x%x, id 0x%lx",
+ meta->SHMInfo.shmid, meta->SHMInfo.shmseg);
+ } else
+ no_xshm:
+#endif /* HAVE_XSHM */
+ {
+ guint allocsize;
+
+ meta->ximage = XCreateImage (xcontext->disp,
+ xcontext->visual,
+ xcontext->depth, ZPixmap, 0, NULL, width, height, xcontext->bpp, 0);
+ if (!meta->ximage || error_caught)
+ goto create_failed;
+
+ /* upstream will assume that rowstrides are multiples of 4, but this
+ * doesn't always seem to be the case with XCreateImage() */
+ if ((meta->ximage->bytes_per_line % 4) != 0) {
+ GST_WARNING_OBJECT (ximagesink, "returned stride not a multiple of 4 as "
+ "usually assumed");
+ }
+
+ /* we have to use the returned bytes_per_line for our image size */
+ meta->size = meta->ximage->bytes_per_line * meta->ximage->height;
+
+ /* alloc a bit more for unexpected strides to avoid crashes upstream.
+ * FIXME: if we get an unrounded stride, the image will be displayed
+ * distorted, since all upstream elements assume a rounded stride */
+ allocsize =
+ GST_ROUND_UP_4 (meta->ximage->bytes_per_line) * meta->ximage->height;
+
+ meta->ximage->data = g_malloc (allocsize);
+ GST_LOG_OBJECT (ximagesink,
+ "non-XShm image size is %" G_GSIZE_FORMAT " (alloced: %u), width %d, "
+ "stride %d", meta->size, allocsize, width,
+ meta->ximage->bytes_per_line);
+
+ XSync (xcontext->disp, FALSE);
+ }
+
+ /* Reset error handler */
+ error_caught = FALSE;
+ XSetErrorHandler (handler);
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, meta->ximage->data,
+ NULL, meta->size, 0, meta->size));
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ success = TRUE;
+
+beach:
+ if (!success)
+ meta = NULL;
+
+ return meta;
+
+ /* ERRORS */
+create_failed:
+ {
+ g_mutex_unlock (ximagesink->x_lock);
+ /* Reset error handler */
+ error_caught = FALSE;
+ XSetErrorHandler (handler);
+ /* Push an error */
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not XShmCreateImage a %dx%d image", width, height));
+ goto beach;
+ }
+shmget_failed:
+ {
+ g_mutex_unlock (ximagesink->x_lock);
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not get shared memory of %" G_GSIZE_FORMAT " bytes",
+ meta->size));
+ goto beach;
+ }
+shmat_failed:
+ {
+ g_mutex_unlock (ximagesink->x_lock);
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height), ("Failed to shmat: %s", g_strerror (errno)));
+ /* Clean up the shared memory segment */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+xattach_failed:
+ {
+ /* Clean up the shared memory segment */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+ g_mutex_unlock (ximagesink->x_lock);
+
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height), ("Failed to XShmAttach"));
+ goto beach;
+ }
+}
+
+static void
+gst_meta_ximage_free (GstMetaXImage * meta, GstBuffer * buffer)
+{
+ GstXImageSink *ximagesink;
+
+ ximagesink = meta->sink;
+
+ GST_DEBUG_OBJECT (ximagesink, "free meta on buffer %p", buffer);
+
+ /* Hold the object lock to ensure the XContext doesn't disappear */
+ GST_OBJECT_LOCK (ximagesink);
+ /* We might have some buffers destroyed after changing state to NULL */
+ if (ximagesink->xcontext == NULL) {
+ GST_DEBUG_OBJECT (ximagesink, "Destroying XImage after XContext");
+#ifdef HAVE_XSHM
+ /* Need to free the shared memory segment even if the x context
+ * was already cleaned up */
+ if (meta->SHMInfo.shmaddr != ((void *) -1)) {
+ shmdt (meta->SHMInfo.shmaddr);
+ }
+#endif
+ goto beach;
+ }
+
+ g_mutex_lock (ximagesink->x_lock);
+
+#ifdef HAVE_XSHM
+ if (ximagesink->xcontext->use_xshm) {
+ if (meta->SHMInfo.shmaddr != ((void *) -1)) {
+ GST_DEBUG_OBJECT (ximagesink, "XServer ShmDetaching from 0x%x id 0x%lx",
+ meta->SHMInfo.shmid, meta->SHMInfo.shmseg);
+ XShmDetach (ximagesink->xcontext->disp, &meta->SHMInfo);
+ XSync (ximagesink->xcontext->disp, FALSE);
+ shmdt (meta->SHMInfo.shmaddr);
+ meta->SHMInfo.shmaddr = (void *) -1;
+ }
+ if (meta->ximage)
+ XDestroyImage (meta->ximage);
+ } else
+#endif /* HAVE_XSHM */
+ {
+ if (meta->ximage) {
+ XDestroyImage (meta->ximage);
+ }
+ }
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+beach:
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ gst_object_unref (meta->sink);
+}
+
+#ifdef HAVE_XSHM
+/* This function checks that it is actually really possible to create an image
+ using XShm */
+gboolean
+gst_ximagesink_check_xshm_calls (GstXImageSink * ximagesink,
+ 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 (gst_ximagesink_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, NULL, 0);
+ if (SHMInfo.shmaddr == ((void *) -1)) {
+ GST_WARNING ("Failed to shmat: %s", g_strerror (errno));
+ /* Clean up the shared memory segment */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+
+ ximage->data = SHMInfo.shmaddr;
+ SHMInfo.readOnly = FALSE;
+
+ if (XShmAttach (xcontext->disp, &SHMInfo) == 0) {
+ GST_WARNING ("Failed to XShmAttach");
+ /* Clean up the shared memory segment */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+
+ /* Sync to ensure we see any errors we caused */
+ XSync (xcontext->disp, FALSE);
+
+ /* Delete the shared memory segment as soon as everyone is attached.
+ * This way, it will be deleted as soon as we detach later, and not
+ * leaked if we crash. */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+
+ if (!error_caught) {
+ GST_DEBUG ("XServer ShmAttached to 0x%x, id 0x%lx", SHMInfo.shmid,
+ SHMInfo.shmseg);
+
+ did_attach = TRUE;
+ /* store whether we succeeded in result */
+ result = TRUE;
+ } else {
+ GST_WARNING ("MIT-SHM extension check failed at XShmAttach. "
+ "Not using shared memory.");
+ }
+
+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) {
+ GST_DEBUG ("XServer ShmDetaching from 0x%x id 0x%lx",
+ SHMInfo.shmid, SHMInfo.shmseg);
+ 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 */
+
+/* bufferpool */
+static void gst_ximage_buffer_pool_finalize (GObject * object);
+
+#define GST_XIMAGE_BUFFER_POOL_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_XIMAGE_BUFFER_POOL, GstXImageBufferPoolPrivate))
+
+#define gst_ximage_buffer_pool_parent_class parent_class
+G_DEFINE_TYPE (GstXImageBufferPool, gst_ximage_buffer_pool,
+ GST_TYPE_BUFFER_POOL);
+
+static const gchar **
+ximage_buffer_pool_get_options (GstBufferPool * pool)
+{
+ static const gchar *options[] = { GST_BUFFER_POOL_OPTION_META_VIDEO,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT, NULL
+ };
+
+ return options;
+}
+
+static gboolean
+ximage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
+{
+ GstXImageBufferPool *xpool = GST_XIMAGE_BUFFER_POOL_CAST (pool);
+ GstXImageBufferPoolPrivate *priv = xpool->priv;
+ GstVideoInfo info;
+ const GstCaps *caps;
+
+ if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
+ goto wrong_config;
+
+ if (caps == NULL)
+ goto no_caps;
+
+ /* now parse the caps from the config */
+ if (!gst_video_info_from_caps (&info, caps))
+ goto wrong_caps;
+
+ priv->info = info;
+
+ GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, info.width, info.height,
+ caps);
+
+ /* keep track of the width and height and caps */
+ if (priv->caps)
+ gst_caps_unref (priv->caps);
+ priv->caps = gst_caps_copy (caps);
+
+ /* check for the configured metadata */
+ priv->add_metavideo =
+ gst_buffer_pool_config_has_option (config,
+ GST_BUFFER_POOL_OPTION_META_VIDEO);
+
+ /* parse extra alignment info */
+ priv->need_alignment = gst_buffer_pool_config_has_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
+
+ if (priv->need_alignment) {
+ gst_buffer_pool_config_get_video_alignment (config, &priv->align);
+
+ GST_LOG_OBJECT (pool, "padding %u-%ux%u-%u", priv->align.padding_top,
+ priv->align.padding_left, priv->align.padding_left,
+ priv->align.padding_bottom);
+
+ /* we need the video metadata too now */
+ priv->add_metavideo = TRUE;
+ }
+
+ /* add the padding */
+ priv->padded_width =
+ GST_VIDEO_INFO_WIDTH (&info) + priv->align.padding_left +
+ priv->align.padding_right;
+ priv->padded_height =
+ GST_VIDEO_INFO_HEIGHT (&info) + priv->align.padding_top +
+ priv->align.padding_bottom;
+
+ return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
+
+ /* ERRORS */
+wrong_config:
+ {
+ GST_WARNING_OBJECT (pool, "invalid config");
+ return FALSE;
+ }
+no_caps:
+ {
+ GST_WARNING_OBJECT (pool, "no caps in config");
+ return FALSE;
+ }
+wrong_caps:
+ {
+ GST_WARNING_OBJECT (pool,
+ "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+}
+
+/* This function handles GstXImageBuffer creation depending on XShm availability */
+static GstFlowReturn
+ximage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolParams * params)
+{
+ GstXImageBufferPool *xpool = GST_XIMAGE_BUFFER_POOL_CAST (pool);
+ GstXImageBufferPoolPrivate *priv = xpool->priv;
+ GstVideoInfo *info;
+ GstBuffer *ximage;
+ GstMetaXImage *meta;
+
+ info = &priv->info;
+
+ ximage = gst_buffer_new ();
+ meta = gst_buffer_add_meta_ximage (ximage, xpool);
+ if (meta == NULL) {
+ gst_buffer_unref (ximage);
+ goto no_buffer;
+ }
+ if (priv->add_metavideo) {
+ GstMetaVideo *meta;
+
+ GST_DEBUG_OBJECT (pool, "adding GstMetaVideo");
+ /* these are just the defaults for now */
+ meta = gst_buffer_add_meta_video (ximage, 0, GST_VIDEO_INFO_FORMAT (info),
+ priv->padded_width, priv->padded_height);
+
+ if (priv->need_alignment) {
+ gint vpad, hpad, pstride;
+
+ vpad = priv->align.padding_left;
+ hpad = priv->align.padding_top;
+
+ meta->width = GST_VIDEO_INFO_WIDTH (&priv->info);
+ meta->height = GST_VIDEO_INFO_HEIGHT (&priv->info);
+ pstride = GST_VIDEO_INFO_COMP_PSTRIDE (&priv->info, 0);
+
+ meta->offset[0] += (vpad * meta->stride[0]) + (hpad * pstride);
+ }
+ }
+ *buffer = ximage;
+
+ return GST_FLOW_OK;
+
+ /* ERROR */
+no_buffer:
+ {
+ GST_WARNING_OBJECT (pool, "can't create image");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+ximage_buffer_pool_free (GstBufferPool * pool, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+}
+
+GstBufferPool *
+gst_ximage_buffer_pool_new (GstXImageSink * ximagesink)
+{
+ GstXImageBufferPool *pool;
+
+ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), NULL);
+
+ pool = g_object_new (GST_TYPE_XIMAGE_BUFFER_POOL, NULL);
+ pool->sink = gst_object_ref (ximagesink);
+
+ GST_LOG_OBJECT (pool, "new XImage buffer pool %p", pool);
+
+ return GST_BUFFER_POOL_CAST (pool);
+}
+
+static void
+gst_ximage_buffer_pool_class_init (GstXImageBufferPoolClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstBufferPoolClass *gstbufferpool_class = (GstBufferPoolClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstXImageBufferPoolPrivate));
+
+ gobject_class->finalize = gst_ximage_buffer_pool_finalize;
+
+ gstbufferpool_class->get_options = ximage_buffer_pool_get_options;
+ gstbufferpool_class->set_config = ximage_buffer_pool_set_config;
+ gstbufferpool_class->alloc_buffer = ximage_buffer_pool_alloc;
+ gstbufferpool_class->free_buffer = ximage_buffer_pool_free;
+}
+
+static void
+gst_ximage_buffer_pool_init (GstXImageBufferPool * pool)
+{
+ pool->priv = GST_XIMAGE_BUFFER_POOL_GET_PRIVATE (pool);
+}
+
+static void
+gst_ximage_buffer_pool_finalize (GObject * object)
+{
+ GstXImageBufferPool *pool = GST_XIMAGE_BUFFER_POOL_CAST (object);
+ GstXImageBufferPoolPrivate *priv = pool->priv;
+
+ GST_LOG_OBJECT (pool, "finalize XImage buffer pool %p", pool);
+
+ if (priv->caps)
+ gst_caps_unref (priv->caps);
+ gst_object_unref (pool->sink);
+
+ G_OBJECT_CLASS (gst_ximage_buffer_pool_parent_class)->finalize (object);
+}
diff --git a/sys/ximage/ximagepool.h b/sys/ximage/ximagepool.h
new file mode 100644
index 0000000..ec88c27
--- /dev/null
+++ b/sys/ximage/ximagepool.h
@@ -0,0 +1,112 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_XIMAGEPOOL_H__
+#define __GST_XIMAGEPOOL_H__
+
+#ifdef HAVE_XSHM
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif /* HAVE_XSHM */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM
+#include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM */
+
+#include <string.h>
+#include <math.h>
+
+
+G_BEGIN_DECLS
+
+typedef struct _GstMetaXImage GstMetaXImage;
+
+typedef struct _GstXImageBufferPool GstXImageBufferPool;
+typedef struct _GstXImageBufferPoolClass GstXImageBufferPoolClass;
+typedef struct _GstXImageBufferPoolPrivate GstXImageBufferPoolPrivate;
+
+#include "ximagesink.h"
+
+const GstMetaInfo * gst_meta_ximage_get_info (void);
+#define GST_META_INFO_XIMAGE (gst_meta_ximage_get_info())
+
+#define gst_buffer_get_meta_ximage(b) ((GstMetaXImage*)gst_buffer_get_meta((b),GST_META_INFO_XIMAGE))
+
+/**
+ * GstMetaXImage:
+ * @simagesink: a reference to the our #GstXImageSink
+ * @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 #GstMeta containing additional information about an XImage.
+ */
+struct _GstMetaXImage
+{
+ GstMeta meta;
+
+ /* Reference to the ximagesink we belong to */
+ GstXImageSink *sink;
+
+ XImage *ximage;
+
+#ifdef HAVE_XSHM
+ XShmSegmentInfo SHMInfo;
+#endif /* HAVE_XSHM */
+
+ gint x, y;
+ gint width, height;
+ size_t size;
+};
+
+/* buffer pool functions */
+#define GST_TYPE_XIMAGE_BUFFER_POOL (gst_ximage_buffer_pool_get_type())
+#define GST_IS_XIMAGE_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_XIMAGE_BUFFER_POOL))
+#define GST_XIMAGE_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_XIMAGE_BUFFER_POOL, GstXImageBufferPool))
+#define GST_XIMAGE_BUFFER_POOL_CAST(obj) ((GstXImageBufferPool*)(obj))
+
+struct _GstXImageBufferPool
+{
+ GstBufferPool bufferpool;
+
+ GstXImageSink *sink;
+
+ GstXImageBufferPoolPrivate *priv;
+};
+
+struct _GstXImageBufferPoolClass
+{
+ GstBufferPoolClass parent_class;
+};
+
+GType gst_ximage_buffer_pool_get_type (void);
+
+GstBufferPool * gst_ximage_buffer_pool_new (GstXImageSink * ximagesink);
+
+gboolean gst_ximagesink_check_xshm_calls (GstXImageSink * ximagesink,
+ GstXContext * xcontext);
+
+G_END_DECLS
+
+#endif /* __GST_XIMAGEPOOL_H__ */
diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c
new file mode 100644
index 0000000..a0a1420
--- /dev/null
+++ b/sys/ximage/ximagesink.c
@@ -0,0 +1,1985 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-ximagesink
+ *
+ * XImageSink renders video frames to a drawable (XWindow) on a local or remote
+ * display. This element can receive a Window ID from the application through
+ * the #GstVideoOverlay interface and will then render video frames in this
+ * drawable. If no Window ID was provided by the application, the element will
+ * create its own internal window and render into it.
+ *
+ * <refsect2>
+ * <title>Scaling</title>
+ * <para>
+ * As standard XImage rendering to a drawable is not scaled, XImageSink will use
+ * reverse caps negotiation to try to get scaled video frames for the drawable.
+ * This is accomplished by asking the peer pad if it accepts some different caps
+ * which in most cases implies that there is a scaling element in the pipeline,
+ * or that an element generating the video frames can generate them with a
+ * different geometry. This mechanism is handled during buffer allocations, for
+ * each allocation request the video sink will check the drawable geometry, look
+ * at the #GstXImageSink:force-aspect-ratio property, calculate the geometry of
+ * desired video frames and then check that the peer pad accept those new caps.
+ * If it does it will then allocate a buffer in video memory with this new
+ * geometry and return it with the new caps.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Events</title>
+ * <para>
+ * XImageSink creates a thread to handle events coming from the drawable. There
+ * are several kind of events that can be grouped in 2 big categories: input
+ * events and window state related events. Input events will be translated to
+ * navigation events and pushed upstream for other elements to react on them.
+ * This includes events such as pointer moves, key press/release, clicks etc...
+ * Other events are used to handle the drawable appearance even when the data
+ * is not flowing (GST_STATE_PAUSED). That means that even when the element is
+ * paused, it will receive expose events from the drawable and draw the latest
+ * frame with correct borders/aspect-ratio.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Pixel aspect ratio</title>
+ * <para>
+ * When changing state to GST_STATE_READY, XImageSink will open a connection to
+ * the display specified in the #GstXImageSink:display property or the default
+ * display if nothing specified. Once this connection is open it will inspect
+ * the display configuration including the physical display geometry and
+ * then calculate the pixel aspect ratio. When caps negotiation will occur, the
+ * video sink will set the calculated pixel aspect ratio on the caps to make
+ * sure that incoming video frames will have the correct pixel aspect ratio for
+ * this display. Sometimes the calculated pixel aspect ratio can be wrong, it is
+ * then possible to enforce a specific pixel aspect ratio using the
+ * #GstXImageSink:pixel-aspect-ratio property.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Examples</title>
+ * |[
+ * gst-launch -v videotestsrc ! queue ! ximagesink
+ * ]| A pipeline to test reverse negotiation. When the test video signal appears
+ * you can resize the window and see that scaled buffers of the desired size are
+ * going to arrive with a short delay. This illustrates how buffers of desired
+ * size are allocated along the way. If you take away the queue, scaling will
+ * happen almost immediately.
+ * |[
+ * gst-launch -v videotestsrc ! navigationtest ! videoconvert ! ximagesink
+ * ]| 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.)
+ * |[
+ * gst-launch -v videotestsrc ! video/x-raw, pixel-aspect-ratio=(fraction)4/3 ! videoscale ! ximagesink
+ * ]| This is faking a 4/3 pixel aspect ratio caps on video frames produced by
+ * videotestsrc, in most cases the pixel aspect ratio of the display will be
+ * 1/1. This means that videoscale will have to do the scaling to convert
+ * incoming frames to a size that will match the display pixel aspect ratio
+ * (from 320x240 to 320x180 in this case). Note that you might have to escape
+ * some characters for your shell like '\(fraction\)'.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Our interfaces */
+#include <gst/interfaces/navigation.h>
+#include <gst/interfaces/videooverlay.h>
+
+#include <gst/video/gstmetavideo.h>
+
+/* Object header */
+#include "ximagesink.h"
+
+/* Debugging category */
+#include <gst/gstinfo.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_debug_ximagesink);
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
+#define GST_CAT_DEFAULT gst_debug_ximagesink
+
+typedef struct
+{
+ unsigned long flags;
+ unsigned long functions;
+ unsigned long decorations;
+ long input_mode;
+ unsigned long status;
+}
+MotifWmHints, MwmHints;
+
+#define MWM_HINTS_DECORATIONS (1L << 1)
+
+static void gst_ximagesink_reset (GstXImageSink * ximagesink);
+static void gst_ximagesink_xwindow_update_geometry (GstXImageSink * ximagesink);
+static void gst_ximagesink_expose (GstVideoOverlay * overlay);
+
+static GstStaticPadTemplate gst_ximagesink_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw, "
+ "framerate = (fraction) [ 0, MAX ], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")
+ );
+
+enum
+{
+ PROP_0,
+ PROP_DISPLAY,
+ PROP_SYNCHRONOUS,
+ PROP_PIXEL_ASPECT_RATIO,
+ PROP_FORCE_ASPECT_RATIO,
+ PROP_HANDLE_EVENTS,
+ PROP_HANDLE_EXPOSE,
+ PROP_WINDOW_WIDTH,
+ PROP_WINDOW_HEIGHT
+};
+
+/* ============================================================= */
+/* */
+/* Public Methods */
+/* */
+/* ============================================================= */
+
+/* =========================================== */
+/* */
+/* Object typing & Creation */
+/* */
+/* =========================================== */
+static void gst_ximagesink_navigation_init (GstNavigationInterface * klass);
+static void gst_ximagesink_video_overlay_init (GstVideoOverlayIface * iface);
+#define gst_ximagesink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstXImageSink, gst_ximagesink, GST_TYPE_VIDEO_SINK,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION, gst_ximagesink_navigation_init);
+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
+ gst_ximagesink_video_overlay_init));
+
+/* ============================================================= */
+/* */
+/* Private Methods */
+/* */
+/* ============================================================= */
+
+/* X11 stuff */
+
+/* We are called with the x_lock taken */
+static void
+gst_ximagesink_xwindow_draw_borders (GstXImageSink * ximagesink,
+ GstXWindow * xwindow, GstVideoRectangle rect)
+{
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+ g_return_if_fail (xwindow != NULL);
+
+ XSetForeground (ximagesink->xcontext->disp, xwindow->gc,
+ ximagesink->xcontext->black);
+
+ /* Left border */
+ if (rect.x > 0) {
+ XFillRectangle (ximagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ 0, 0, rect.x, xwindow->height);
+ }
+
+ /* Right border */
+ if ((rect.x + rect.w) < xwindow->width) {
+ XFillRectangle (ximagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ rect.x + rect.w, 0, xwindow->width, xwindow->height);
+ }
+
+ /* Top border */
+ if (rect.y > 0) {
+ XFillRectangle (ximagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ 0, 0, xwindow->width, rect.y);
+ }
+
+ /* Bottom border */
+ if ((rect.y + rect.h) < xwindow->height) {
+ XFillRectangle (ximagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ 0, rect.y + rect.h, xwindow->width, xwindow->height);
+ }
+}
+
+/* This function puts a GstXImageBuffer on a GstXImageSink's window */
+static gboolean
+gst_ximagesink_ximage_put (GstXImageSink * ximagesink, GstBuffer * ximage)
+{
+ GstMetaXImage *meta;
+ GstMetaVideoCrop *crop;
+ GstVideoRectangle src, dst, result;
+ gboolean draw_border = FALSE;
+
+ /* We take the flow_lock. If expose is in there we don't want to run
+ concurrently from the data flow thread */
+ g_mutex_lock (ximagesink->flow_lock);
+
+ if (G_UNLIKELY (ximagesink->xwindow == NULL)) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ return FALSE;
+ }
+
+ /* Draw borders when displaying the first frame. After this
+ draw borders only on expose event or caps change (ximagesink->draw_border = TRUE). */
+ if (!ximagesink->cur_image || ximagesink->draw_border) {
+ draw_border = TRUE;
+ }
+
+ /* Store a reference to the last image we put, lose the previous one */
+ if (ximage && ximagesink->cur_image != ximage) {
+ if (ximagesink->cur_image) {
+ GST_LOG_OBJECT (ximagesink, "unreffing %p", ximagesink->cur_image);
+ gst_buffer_unref (ximagesink->cur_image);
+ }
+ GST_LOG_OBJECT (ximagesink, "reffing %p as our current image", ximage);
+ ximagesink->cur_image = gst_buffer_ref (ximage);
+ }
+
+ /* Expose sends a NULL image, we take the latest frame */
+ if (!ximage) {
+ draw_border = TRUE;
+ if (ximagesink->cur_image) {
+ ximage = ximagesink->cur_image;
+ } else {
+ g_mutex_unlock (ximagesink->flow_lock);
+ return TRUE;
+ }
+ }
+
+ meta = gst_buffer_get_meta_ximage (ximage);
+ crop = gst_buffer_get_meta_video_crop (ximage);
+
+ if (crop) {
+ src.x = crop->x + meta->x;
+ src.y = crop->y + meta->y;
+ src.w = crop->width;
+ src.h = crop->height;
+ } else {
+ src.x = meta->x;
+ src.y = meta->y;
+ src.w = meta->width;
+ src.h = meta->height;
+ }
+ dst.w = ximagesink->xwindow->width;
+ dst.h = ximagesink->xwindow->height;
+
+ gst_video_sink_center_rect (src, dst, &result, FALSE);
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ if (draw_border) {
+ gst_ximagesink_xwindow_draw_borders (ximagesink, ximagesink->xwindow,
+ result);
+ ximagesink->draw_border = FALSE;
+ }
+#ifdef HAVE_XSHM
+ if (ximagesink->xcontext->use_xshm) {
+ GST_LOG_OBJECT (ximagesink,
+ "XShmPutImage on %p, src: %d, %d - dest: %d, %d, dim: %dx%d, win %dx%d",
+ ximage, 0, 0, result.x, result.y, result.w, result.h,
+ ximagesink->xwindow->width, ximagesink->xwindow->height);
+ XShmPutImage (ximagesink->xcontext->disp, ximagesink->xwindow->win,
+ ximagesink->xwindow->gc, meta->ximage, src.x, src.y, result.x, result.y,
+ result.w, result.h, FALSE);
+ } else
+#endif /* HAVE_XSHM */
+ {
+ GST_LOG_OBJECT (ximagesink,
+ "XPutImage on %p, src: %d, %d - dest: %d, %d, dim: %dx%d, win %dx%d",
+ ximage, 0, 0, result.x, result.y, result.w, result.h,
+ ximagesink->xwindow->width, ximagesink->xwindow->height);
+ XPutImage (ximagesink->xcontext->disp, ximagesink->xwindow->win,
+ ximagesink->xwindow->gc, meta->ximage, src.x, src.y, result.x, result.y,
+ result.w, result.h);
+ }
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ return TRUE;
+}
+
+static gboolean
+gst_ximagesink_xwindow_decorate (GstXImageSink * ximagesink,
+ GstXWindow * window)
+{
+ Atom hints_atom = None;
+ MotifWmHints *hints;
+
+ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), FALSE);
+ g_return_val_if_fail (window != NULL, FALSE);
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ hints_atom = XInternAtom (ximagesink->xcontext->disp, "_MOTIF_WM_HINTS",
+ True);
+ if (hints_atom == None) {
+ g_mutex_unlock (ximagesink->x_lock);
+ return FALSE;
+ }
+
+ hints = g_malloc0 (sizeof (MotifWmHints));
+
+ hints->flags |= MWM_HINTS_DECORATIONS;
+ hints->decorations = 1 << 0;
+
+ XChangeProperty (ximagesink->xcontext->disp, window->win,
+ hints_atom, hints_atom, 32, PropModeReplace,
+ (guchar *) hints, sizeof (MotifWmHints) / sizeof (long));
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ g_free (hints);
+
+ return TRUE;
+}
+
+static void
+gst_ximagesink_xwindow_set_title (GstXImageSink * ximagesink,
+ GstXWindow * xwindow, const gchar * media_title)
+{
+ if (media_title) {
+ g_free (ximagesink->media_title);
+ ximagesink->media_title = g_strdup (media_title);
+ }
+ if (xwindow) {
+ /* we have a window */
+ if (xwindow->internal) {
+ XTextProperty xproperty;
+ const gchar *app_name;
+ const gchar *title = NULL;
+ gchar *title_mem = NULL;
+
+ /* set application name as a title */
+ app_name = g_get_application_name ();
+
+ if (app_name && ximagesink->media_title) {
+ title = title_mem = g_strconcat (ximagesink->media_title, " : ",
+ app_name, NULL);
+ } else if (app_name) {
+ title = app_name;
+ } else if (ximagesink->media_title) {
+ title = ximagesink->media_title;
+ }
+
+ if (title) {
+ if ((XStringListToTextProperty (((char **) &title), 1,
+ &xproperty)) != 0) {
+ XSetWMName (ximagesink->xcontext->disp, xwindow->win, &xproperty);
+ XFree (xproperty.value);
+ }
+
+ g_free (title_mem);
+ }
+ }
+ }
+}
+
+/* This function handles a GstXWindow creation */
+static GstXWindow *
+gst_ximagesink_xwindow_new (GstXImageSink * ximagesink, gint width, gint height)
+{
+ GstXWindow *xwindow = NULL;
+ XGCValues values;
+
+ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), NULL);
+
+ xwindow = g_new0 (GstXWindow, 1);
+
+ xwindow->width = width;
+ xwindow->height = height;
+ xwindow->internal = TRUE;
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ xwindow->win = XCreateSimpleWindow (ximagesink->xcontext->disp,
+ ximagesink->xcontext->root,
+ 0, 0, width, height, 0, 0, ximagesink->xcontext->black);
+
+ /* We have to do that to prevent X from redrawing the background on
+ ConfigureNotify. This takes away flickering of video when resizing. */
+ XSetWindowBackgroundPixmap (ximagesink->xcontext->disp, xwindow->win, None);
+
+ /* set application name as a title */
+ gst_ximagesink_xwindow_set_title (ximagesink, xwindow, NULL);
+
+ if (ximagesink->handle_events) {
+ Atom wm_delete;
+
+ XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask |
+ StructureNotifyMask | PointerMotionMask | KeyPressMask |
+ KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);
+
+ /* Tell the window manager we'd like delete client messages instead of
+ * being killed */
+ wm_delete = XInternAtom (ximagesink->xcontext->disp,
+ "WM_DELETE_WINDOW", False);
+ (void) XSetWMProtocols (ximagesink->xcontext->disp, xwindow->win,
+ &wm_delete, 1);
+ }
+
+ xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win,
+ 0, &values);
+
+ XMapRaised (ximagesink->xcontext->disp, xwindow->win);
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ gst_ximagesink_xwindow_decorate (ximagesink, xwindow);
+
+ gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (ximagesink),
+ xwindow->win);
+
+ return xwindow;
+}
+
+/* This function destroys a GstXWindow */
+static void
+gst_ximagesink_xwindow_destroy (GstXImageSink * ximagesink,
+ GstXWindow * xwindow)
+{
+ g_return_if_fail (xwindow != NULL);
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ /* If we did not create that window we just free the GC and let it live */
+ if (xwindow->internal)
+ XDestroyWindow (ximagesink->xcontext->disp, xwindow->win);
+ else
+ XSelectInput (ximagesink->xcontext->disp, xwindow->win, 0);
+
+ XFreeGC (ximagesink->xcontext->disp, xwindow->gc);
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ g_free (xwindow);
+}
+
+static void
+gst_ximagesink_xwindow_update_geometry (GstXImageSink * ximagesink)
+{
+ XWindowAttributes attr;
+ gboolean reconfigure;
+
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+
+ /* Update the window geometry */
+ g_mutex_lock (ximagesink->x_lock);
+ if (G_UNLIKELY (ximagesink->xwindow == NULL)) {
+ g_mutex_unlock (ximagesink->x_lock);
+ return;
+ }
+
+ XGetWindowAttributes (ximagesink->xcontext->disp,
+ ximagesink->xwindow->win, &attr);
+
+ /* Check if we would suggest a different width/height now */
+ reconfigure = (ximagesink->xwindow->width != attr.width)
+ || (ximagesink->xwindow->height != attr.height);
+ ximagesink->xwindow->width = attr.width;
+ ximagesink->xwindow->height = attr.height;
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ if (reconfigure)
+ gst_pad_push_event (GST_BASE_SINK (ximagesink)->sinkpad,
+ gst_event_new_reconfigure ());
+}
+
+static void
+gst_ximagesink_xwindow_clear (GstXImageSink * ximagesink, GstXWindow * xwindow)
+{
+ g_return_if_fail (xwindow != NULL);
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ XSetForeground (ximagesink->xcontext->disp, xwindow->gc,
+ ximagesink->xcontext->black);
+
+ XFillRectangle (ximagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ 0, 0, xwindow->width, xwindow->height);
+
+ XSync (ximagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (ximagesink->x_lock);
+}
+
+/* This function handles XEvents that might be in the queue. It generates
+ GstEvent that will be sent upstream in the pipeline to handle interactivity
+ and navigation.*/
+static void
+gst_ximagesink_handle_xevents (GstXImageSink * ximagesink)
+{
+ XEvent e;
+ guint pointer_x = 0, pointer_y = 0;
+ gboolean pointer_moved = FALSE;
+ gboolean exposed = FALSE, configured = FALSE;
+
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+
+ /* Then we get all pointer motion events, only the last position is
+ interesting. */
+ g_mutex_lock (ximagesink->flow_lock);
+ g_mutex_lock (ximagesink->x_lock);
+ while (XCheckWindowEvent (ximagesink->xcontext->disp,
+ ximagesink->xwindow->win, PointerMotionMask, &e)) {
+ g_mutex_unlock (ximagesink->x_lock);
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ switch (e.type) {
+ case MotionNotify:
+ pointer_x = e.xmotion.x;
+ pointer_y = e.xmotion.y;
+ pointer_moved = TRUE;
+ break;
+ default:
+ break;
+ }
+ g_mutex_lock (ximagesink->flow_lock);
+ g_mutex_lock (ximagesink->x_lock);
+ }
+
+ if (pointer_moved) {
+ g_mutex_unlock (ximagesink->x_lock);
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ GST_DEBUG ("ximagesink pointer moved over window at %d,%d",
+ pointer_x, pointer_y);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (ximagesink),
+ "mouse-move", 0, pointer_x, pointer_y);
+
+ g_mutex_lock (ximagesink->flow_lock);
+ g_mutex_lock (ximagesink->x_lock);
+ }
+
+ /* We get all remaining events on our window to throw them upstream */
+ while (XCheckWindowEvent (ximagesink->xcontext->disp,
+ ximagesink->xwindow->win,
+ KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask, &e)) {
+ KeySym keysym;
+
+ /* We lock only for the X function call */
+ g_mutex_unlock (ximagesink->x_lock);
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ switch (e.type) {
+ case ButtonPress:
+ /* Mouse button pressed/released over our window. We send upstream
+ events for interactivity/navigation */
+ GST_DEBUG ("ximagesink button %d pressed over window at %d,%d",
+ e.xbutton.button, e.xbutton.x, e.xbutton.x);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (ximagesink),
+ "mouse-button-press", e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ break;
+ case ButtonRelease:
+ GST_DEBUG ("ximagesink button %d release over window at %d,%d",
+ e.xbutton.button, e.xbutton.x, e.xbutton.x);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (ximagesink),
+ "mouse-button-release", e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ break;
+ case KeyPress:
+ case KeyRelease:
+ /* Key pressed/released over our window. We send upstream
+ events for interactivity/navigation */
+ GST_DEBUG ("ximagesink key %d pressed over window at %d,%d",
+ e.xkey.keycode, e.xkey.x, e.xkey.x);
+ g_mutex_lock (ximagesink->x_lock);
+ keysym = XKeycodeToKeysym (ximagesink->xcontext->disp,
+ e.xkey.keycode, 0);
+ g_mutex_unlock (ximagesink->x_lock);
+ if (keysym != NoSymbol) {
+ char *key_str = NULL;
+
+ g_mutex_lock (ximagesink->x_lock);
+ key_str = XKeysymToString (keysym);
+ g_mutex_unlock (ximagesink->x_lock);
+ gst_navigation_send_key_event (GST_NAVIGATION (ximagesink),
+ e.type == KeyPress ? "key-press" : "key-release", key_str);
+ } else {
+ gst_navigation_send_key_event (GST_NAVIGATION (ximagesink),
+ e.type == KeyPress ? "key-press" : "key-release", "unknown");
+ }
+ break;
+ default:
+ GST_DEBUG_OBJECT (ximagesink, "ximagesink unhandled X event (%d)",
+ e.type);
+ }
+ g_mutex_lock (ximagesink->flow_lock);
+ g_mutex_lock (ximagesink->x_lock);
+ }
+
+ /* Handle Expose */
+ while (XCheckWindowEvent (ximagesink->xcontext->disp,
+ ximagesink->xwindow->win, ExposureMask | StructureNotifyMask, &e)) {
+ switch (e.type) {
+ case Expose:
+ exposed = TRUE;
+ break;
+ case ConfigureNotify:
+ g_mutex_unlock (ximagesink->x_lock);
+ gst_ximagesink_xwindow_update_geometry (ximagesink);
+ g_mutex_lock (ximagesink->x_lock);
+ configured = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (ximagesink->handle_expose && (exposed || configured)) {
+ g_mutex_unlock (ximagesink->x_lock);
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ gst_ximagesink_expose (GST_VIDEO_OVERLAY (ximagesink));
+
+ g_mutex_lock (ximagesink->flow_lock);
+ g_mutex_lock (ximagesink->x_lock);
+ }
+
+ /* Handle Display events */
+ while (XPending (ximagesink->xcontext->disp)) {
+ XNextEvent (ximagesink->xcontext->disp, &e);
+
+ switch (e.type) {
+ case ClientMessage:{
+ Atom wm_delete;
+
+ wm_delete = XInternAtom (ximagesink->xcontext->disp,
+ "WM_DELETE_WINDOW", False);
+ if (wm_delete == (Atom) e.xclient.data.l[0]) {
+ /* Handle window deletion by posting an error on the bus */
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, NOT_FOUND,
+ ("Output window was closed"), (NULL));
+
+ g_mutex_unlock (ximagesink->x_lock);
+ gst_ximagesink_xwindow_destroy (ximagesink, ximagesink->xwindow);
+ ximagesink->xwindow = NULL;
+ g_mutex_lock (ximagesink->x_lock);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ g_mutex_unlock (ximagesink->x_lock);
+ g_mutex_unlock (ximagesink->flow_lock);
+}
+
+static gpointer
+gst_ximagesink_event_thread (GstXImageSink * ximagesink)
+{
+ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), NULL);
+
+ GST_OBJECT_LOCK (ximagesink);
+ while (ximagesink->running) {
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ if (ximagesink->xwindow) {
+ gst_ximagesink_handle_xevents (ximagesink);
+ }
+ /* FIXME: do we want to align this with the framerate or anything else? */
+ g_usleep (G_USEC_PER_SEC / 20);
+
+ GST_OBJECT_LOCK (ximagesink);
+ }
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ return NULL;
+}
+
+static void
+gst_ximagesink_manage_event_thread (GstXImageSink * ximagesink)
+{
+ GThread *thread = NULL;
+
+ /* don't start the thread too early */
+ if (ximagesink->xcontext == NULL) {
+ return;
+ }
+
+ GST_OBJECT_LOCK (ximagesink);
+ if (ximagesink->handle_expose || ximagesink->handle_events) {
+ if (!ximagesink->event_thread) {
+ /* Setup our event listening thread */
+ GST_DEBUG_OBJECT (ximagesink, "run xevent thread, expose %d, events %d",
+ ximagesink->handle_expose, ximagesink->handle_events);
+ ximagesink->running = TRUE;
+ ximagesink->event_thread = g_thread_create (
+ (GThreadFunc) gst_ximagesink_event_thread, ximagesink, TRUE, NULL);
+ }
+ } else {
+ if (ximagesink->event_thread) {
+ GST_DEBUG_OBJECT (ximagesink, "stop xevent thread, expose %d, events %d",
+ ximagesink->handle_expose, ximagesink->handle_events);
+ ximagesink->running = FALSE;
+ /* grab thread and mark it as NULL */
+ thread = ximagesink->event_thread;
+ ximagesink->event_thread = NULL;
+ }
+ }
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ /* Wait for our event thread to finish */
+ if (thread)
+ g_thread_join (thread);
+
+}
+
+
+/* This function calculates the pixel aspect ratio based on the properties
+ * in the xcontext structure and stores it there. */
+static void
+gst_ximagesink_calculate_pixel_aspect_ratio (GstXContext * xcontext)
+{
+ static const 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 */
+ {64, 45}, /* 1280x1024 on 16:9 display */
+ {5, 3}, /* 1280x1024 on 4:3 display */
+ {4, 3} /* 800x600 on 16:9 display */
+ };
+ 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]);
+
+ 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",
+ gst_value_get_fraction_numerator (xcontext->par),
+ gst_value_get_fraction_denominator (xcontext->par));
+}
+
+/* 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 */
+static GstXContext *
+gst_ximagesink_xcontext_get (GstXImageSink * ximagesink)
+{
+ GstXContext *xcontext = NULL;
+ XPixmapFormatValues *px_formats = NULL;
+ gint nb_formats = 0, i;
+ gint endianness;
+ GstVideoFormat vformat;
+
+ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), NULL);
+
+ xcontext = g_new0 (GstXContext, 1);
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ xcontext->disp = XOpenDisplay (ximagesink->display_name);
+
+ if (!xcontext->disp) {
+ g_mutex_unlock (ximagesink->x_lock);
+ g_free (xcontext);
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Could not initialise X output"), ("Could not open display"));
+ 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);
+
+ GST_DEBUG_OBJECT (ximagesink, "X reports %dx%d pixels and %d mm x %d mm",
+ xcontext->width, xcontext->height, xcontext->widthmm, xcontext->heightmm);
+
+ gst_ximagesink_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_mutex_unlock (ximagesink->x_lock);
+ g_free (xcontext->par);
+ g_free (xcontext);
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, SETTINGS,
+ ("Could not get supported pixmap formats"), (NULL));
+ 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);
+
+ endianness = (ImageByteOrder (xcontext->disp) ==
+ LSBFirst) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN;
+
+ /* Search for XShm extension support */
+#ifdef HAVE_XSHM
+ if (XShmQueryExtension (xcontext->disp) &&
+ gst_ximagesink_check_xshm_calls (ximagesink, xcontext)) {
+ xcontext->use_xshm = TRUE;
+ GST_DEBUG ("ximagesink is using XShm extension");
+ } else
+#endif /* HAVE_XSHM */
+ {
+ xcontext->use_xshm = FALSE;
+ GST_DEBUG ("ximagesink is not using XShm extension");
+ }
+
+ vformat = gst_video_format_from_masks (xcontext->depth, xcontext->bpp,
+ endianness, xcontext->visual->red_mask, xcontext->visual->green_mask,
+ xcontext->visual->blue_mask, 0);
+
+ if (vformat == GST_VIDEO_FORMAT_UNKNOWN)
+ goto unknown_format;
+
+ /* update object's par with calculated one if not set yet */
+ if (!ximagesink->par) {
+ ximagesink->par = g_new0 (GValue, 1);
+ gst_value_init_and_copy (ximagesink->par, xcontext->par);
+ GST_DEBUG_OBJECT (ximagesink, "set calculated PAR on object's PAR");
+ }
+ xcontext->caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, gst_video_format_to_string (vformat),
+ "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 (ximagesink->par) {
+ int nom, den;
+
+ nom = gst_value_get_fraction_numerator (ximagesink->par);
+ den = gst_value_get_fraction_denominator (ximagesink->par);
+ gst_caps_set_simple (xcontext->caps, "pixel-aspect-ratio",
+ GST_TYPE_FRACTION, nom, den, NULL);
+ }
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ return xcontext;
+
+ /* ERRORS */
+unknown_format:
+ {
+ GST_ERROR_OBJECT (ximagesink, "unknown format");
+ return NULL;
+ }
+}
+
+/* This function cleans the X context. Closing the Display and unrefing the
+ caps for supported formats. */
+static void
+gst_ximagesink_xcontext_clear (GstXImageSink * ximagesink)
+{
+ GstXContext *xcontext;
+
+ g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
+
+ GST_OBJECT_LOCK (ximagesink);
+ if (ximagesink->xcontext == NULL) {
+ GST_OBJECT_UNLOCK (ximagesink);
+ return;
+ }
+
+ /* Take the xcontext reference and NULL it while we
+ * clean it up, so that any buffer-alloced buffers
+ * arriving after this will be freed correctly */
+ xcontext = ximagesink->xcontext;
+ ximagesink->xcontext = NULL;
+
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ gst_caps_unref (xcontext->caps);
+ g_free (xcontext->par);
+ g_free (ximagesink->par);
+ ximagesink->par = NULL;
+
+ if (xcontext->last_caps)
+ gst_caps_replace (&xcontext->last_caps, NULL);
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ XCloseDisplay (xcontext->disp);
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ g_free (xcontext);
+}
+
+/* Element stuff */
+
+static GstCaps *
+gst_ximagesink_getcaps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstXImageSink *ximagesink;
+ GstCaps *caps;
+ int i;
+
+ ximagesink = GST_XIMAGESINK (bsink);
+
+ g_mutex_lock (ximagesink->x_lock);
+ if (ximagesink->xcontext) {
+ GstCaps *caps;
+
+ caps = gst_caps_ref (ximagesink->xcontext->caps);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+
+ if (ximagesink->xwindow && ximagesink->xwindow->width) {
+ GstStructure *s0, *s1;
+
+ caps = gst_caps_make_writable (caps);
+
+ /* There can only be a single structure because the xcontext
+ * caps only have a single structure */
+ s0 = gst_caps_get_structure (caps, 0);
+ s1 = gst_structure_copy (gst_caps_get_structure (caps, 0));
+
+ gst_structure_set (s0, "width", G_TYPE_INT, ximagesink->xwindow->width,
+ "height", G_TYPE_INT, ximagesink->xwindow->height, NULL);
+ gst_caps_append_structure (caps, s1);
+
+ /* This will not change the order but will remove the
+ * fixed width/height caps again if not possible
+ * upstream */
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (caps, filter, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+ }
+
+ g_mutex_unlock (ximagesink->x_lock);
+ return caps;
+ }
+ g_mutex_unlock (ximagesink->x_lock);
+
+ /* get a template copy and add the pixel aspect ratio */
+ caps = gst_pad_get_pad_template_caps (GST_BASE_SINK (ximagesink)->sinkpad);
+ if (ximagesink->par) {
+ caps = gst_caps_make_writable (caps);
+ for (i = 0; i < gst_caps_get_size (caps); ++i) {
+ GstStructure *structure = gst_caps_get_structure (caps, i);
+ int nom, den;
+
+ nom = gst_value_get_fraction_numerator (ximagesink->par);
+ den = gst_value_get_fraction_denominator (ximagesink->par);
+ gst_structure_set (structure, "pixel-aspect-ratio",
+ GST_TYPE_FRACTION, nom, den, NULL);
+ }
+ }
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+
+ return caps;
+}
+
+static gboolean
+gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstXImageSink *ximagesink;
+ GstStructure *structure;
+ GstVideoInfo info;
+ GstBufferPool *newpool, *oldpool;
+ const GValue *par;
+ gint size;
+
+ ximagesink = GST_XIMAGESINK (bsink);
+
+ if (!ximagesink->xcontext)
+ return FALSE;
+
+ GST_DEBUG_OBJECT (ximagesink,
+ "sinkconnect possible caps %" GST_PTR_FORMAT " with given caps %"
+ GST_PTR_FORMAT, ximagesink->xcontext->caps, caps);
+
+ /* We intersect those caps with our template to make sure they are correct */
+ if (!gst_caps_can_intersect (ximagesink->xcontext->caps, caps))
+ goto incompatible_caps;
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_format;
+
+ size = info.size;
+
+ structure = gst_caps_get_structure (caps, 0);
+ /* if the caps contain pixel-aspect-ratio, they have to match ours,
+ * otherwise linking should fail */
+ par = gst_structure_get_value (structure, "pixel-aspect-ratio");
+ if (par) {
+ if (ximagesink->par) {
+ if (gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL) {
+ goto wrong_aspect;
+ }
+ } else if (ximagesink->xcontext->par) {
+ if (gst_value_compare (par, ximagesink->xcontext->par) != GST_VALUE_EQUAL) {
+ goto wrong_aspect;
+ }
+ }
+ }
+
+ GST_VIDEO_SINK_WIDTH (ximagesink) = info.width;
+ GST_VIDEO_SINK_HEIGHT (ximagesink) = info.height;
+ ximagesink->fps_n = info.fps_n;
+ ximagesink->fps_d = info.fps_d;
+
+ /* Notify application to set xwindow id now */
+ g_mutex_lock (ximagesink->flow_lock);
+ if (!ximagesink->xwindow) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (ximagesink));
+ } else {
+ g_mutex_unlock (ximagesink->flow_lock);
+ }
+
+ /* Creating our window and our image */
+ if (GST_VIDEO_SINK_WIDTH (ximagesink) <= 0 ||
+ GST_VIDEO_SINK_HEIGHT (ximagesink) <= 0)
+ goto invalid_size;
+
+ g_mutex_lock (ximagesink->flow_lock);
+ if (!ximagesink->xwindow) {
+ ximagesink->xwindow = gst_ximagesink_xwindow_new (ximagesink,
+ GST_VIDEO_SINK_WIDTH (ximagesink), GST_VIDEO_SINK_HEIGHT (ximagesink));
+ }
+
+ ximagesink->info = info;
+
+ /* Remember to draw borders for next frame */
+ ximagesink->draw_border = TRUE;
+
+ /* create a new pool for the new configuration */
+ newpool = gst_ximage_buffer_pool_new (ximagesink);
+
+ structure = gst_buffer_pool_get_config (newpool);
+ gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
+ if (!gst_buffer_pool_set_config (newpool, structure))
+ goto config_failed;
+
+ oldpool = ximagesink->pool;
+ ximagesink->pool = newpool;
+
+ /* unref the old sink */
+ if (oldpool) {
+ /* we don't deactivate, some elements might still be using it, it will be
+ * deactivated when the last ref is gone */
+ gst_object_unref (oldpool);
+ }
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ return TRUE;
+
+ /* ERRORS */
+incompatible_caps:
+ {
+ GST_ERROR_OBJECT (ximagesink, "caps incompatible");
+ return FALSE;
+ }
+invalid_format:
+ {
+ GST_ERROR_OBJECT (ximagesink, "caps invalid");
+ return FALSE;
+ }
+wrong_aspect:
+ {
+ GST_INFO_OBJECT (ximagesink, "pixel aspect ratio does not match");
+ return FALSE;
+ }
+invalid_size:
+ {
+ GST_ELEMENT_ERROR (ximagesink, CORE, NEGOTIATION, (NULL),
+ ("Invalid image size."));
+ return FALSE;
+ }
+config_failed:
+ {
+ GST_ERROR_OBJECT (ximagesink, "failed to set config.");
+ g_mutex_unlock (ximagesink->flow_lock);
+ return FALSE;
+ }
+}
+
+static GstStateChangeReturn
+gst_ximagesink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstXImageSink *ximagesink;
+ GstXContext *xcontext = NULL;
+
+ ximagesink = GST_XIMAGESINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ /* Initializing the XContext */
+ if (ximagesink->xcontext == NULL) {
+ xcontext = gst_ximagesink_xcontext_get (ximagesink);
+ if (xcontext == NULL) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto beach;
+ }
+ GST_OBJECT_LOCK (ximagesink);
+ if (xcontext)
+ ximagesink->xcontext = xcontext;
+ GST_OBJECT_UNLOCK (ximagesink);
+ }
+
+ /* call XSynchronize with the current value of synchronous */
+ GST_DEBUG_OBJECT (ximagesink, "XSynchronize called with %s",
+ ximagesink->synchronous ? "TRUE" : "FALSE");
+ g_mutex_lock (ximagesink->x_lock);
+ XSynchronize (ximagesink->xcontext->disp, ximagesink->synchronous);
+ g_mutex_unlock (ximagesink->x_lock);
+ gst_ximagesink_manage_event_thread (ximagesink);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ g_mutex_lock (ximagesink->flow_lock);
+ if (ximagesink->xwindow)
+ gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow);
+ g_mutex_unlock (ximagesink->flow_lock);
+ 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:
+ ximagesink->fps_n = 0;
+ ximagesink->fps_d = 1;
+ GST_VIDEO_SINK_WIDTH (ximagesink) = 0;
+ GST_VIDEO_SINK_HEIGHT (ximagesink) = 0;
+ g_mutex_lock (ximagesink->flow_lock);
+ if (ximagesink->pool)
+ gst_buffer_pool_set_active (ximagesink->pool, FALSE);
+ g_mutex_unlock (ximagesink->flow_lock);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_ximagesink_reset (ximagesink);
+ break;
+ default:
+ break;
+ }
+
+beach:
+ return ret;
+}
+
+static void
+gst_ximagesink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstXImageSink *ximagesink;
+
+ ximagesink = GST_XIMAGESINK (bsink);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ *start = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf)) {
+ *end = *start + GST_BUFFER_DURATION (buf);
+ } else {
+ if (ximagesink->fps_n > 0) {
+ *end = *start +
+ gst_util_uint64_scale_int (GST_SECOND, ximagesink->fps_d,
+ ximagesink->fps_n);
+ }
+ }
+ }
+}
+
+static GstFlowReturn
+gst_ximagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
+{
+ GstFlowReturn res;
+ GstXImageSink *ximagesink;
+ GstMetaXImage *meta;
+ GstBuffer *to_put = NULL;
+
+ ximagesink = GST_XIMAGESINK (vsink);
+
+ meta = gst_buffer_get_meta_ximage (buf);
+
+ if (meta && meta->sink == ximagesink) {
+ /* If this buffer has been allocated using our buffer management we simply
+ put the ximage which is in the PRIVATE pointer */
+ GST_LOG_OBJECT (ximagesink, "buffer from our pool, writing directly");
+ to_put = buf;
+ res = GST_FLOW_OK;
+ } else {
+ GstVideoFrame src, dest;
+
+ /* Else we have to copy the data into our private image, */
+ /* if we have one... */
+ GST_LOG_OBJECT (ximagesink, "buffer not from our pool, copying");
+
+ /* we should have a pool, configured in setcaps */
+ if (ximagesink->pool == NULL)
+ goto no_pool;
+
+ if (!gst_buffer_pool_set_active (ximagesink->pool, TRUE))
+ goto activate_failed;
+
+ /* take a buffer form our pool */
+ res = gst_buffer_pool_acquire_buffer (ximagesink->pool, &to_put, NULL);
+ if (res != GST_FLOW_OK)
+ goto no_buffer;
+
+ if (gst_buffer_get_size (to_put) < gst_buffer_get_size (buf))
+ goto wrong_size;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, ximagesink,
+ "slow copy into bufferpool buffer %p", to_put);
+
+ if (!gst_video_frame_map (&src, &ximagesink->info, buf, GST_MAP_READ))
+ goto invalid_buffer;
+
+ if (!gst_video_frame_map (&dest, &ximagesink->info, to_put, GST_MAP_WRITE)) {
+ gst_video_frame_unmap (&src);
+ goto invalid_buffer;
+ }
+
+ gst_video_frame_copy (&dest, &src);
+
+ gst_video_frame_unmap (&dest);
+ gst_video_frame_unmap (&src);
+ }
+
+ if (!gst_ximagesink_ximage_put (ximagesink, to_put))
+ goto no_window;
+
+done:
+ if (to_put != buf)
+ gst_buffer_unref (to_put);
+
+ return res;
+
+ /* ERRORS */
+no_pool:
+ {
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Internal error: can't allocate images"),
+ ("We don't have a bufferpool negotiated"));
+ return GST_FLOW_ERROR;
+ }
+no_buffer:
+ {
+ /* No image available. That's very bad ! */
+ GST_WARNING_OBJECT (ximagesink, "could not create image");
+ return res;
+ }
+wrong_size:
+ {
+ GST_ELEMENT_ERROR (ximagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer"),
+ ("XServer allocated buffer size did not match input buffer %"
+ G_GSIZE_FORMAT " - %" G_GSIZE_FORMAT, gst_buffer_get_size (to_put),
+ gst_buffer_get_size (buf)));
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+invalid_buffer:
+ {
+ /* No Window available to put our image into */
+ GST_WARNING_OBJECT (ximagesink, "could map image");
+ res = GST_FLOW_OK;
+ goto done;
+ }
+no_window:
+ {
+ /* No Window available to put our image into */
+ GST_WARNING_OBJECT (ximagesink, "could not output image - no window");
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+activate_failed:
+ {
+ GST_ERROR_OBJECT (ximagesink, "failed to activate bufferpool.");
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static gboolean
+gst_ximagesink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstXImageSink *ximagesink = GST_XIMAGESINK (sink);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:{
+ GstTagList *l;
+ gchar *title = NULL;
+
+ gst_event_parse_tag (event, &l);
+ gst_tag_list_get_string (l, GST_TAG_TITLE, &title);
+
+ if (title) {
+ GST_DEBUG_OBJECT (ximagesink, "got tags, title='%s'", title);
+ gst_ximagesink_xwindow_set_title (ximagesink, ximagesink->xwindow,
+ title);
+
+ g_free (title);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ if (GST_BASE_SINK_CLASS (parent_class)->event)
+ return GST_BASE_SINK_CLASS (parent_class)->event (sink, event);
+ else
+ return TRUE;
+}
+
+static gboolean
+gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+{
+ GstXImageSink *ximagesink = GST_XIMAGESINK (bsink);
+ GstBufferPool *pool;
+ GstStructure *config;
+ GstCaps *caps;
+ guint size;
+ gboolean need_pool;
+
+ gst_query_parse_allocation (query, &caps, &need_pool);
+
+ if (caps == NULL)
+ goto no_caps;
+
+ g_mutex_lock (ximagesink->flow_lock);
+ if ((pool = ximagesink->pool))
+ gst_object_ref (pool);
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ if (pool != NULL) {
+ const GstCaps *pcaps;
+
+ /* we had a pool, check caps */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
+
+ GST_DEBUG_OBJECT (ximagesink,
+ "we had a pool with caps %" GST_PTR_FORMAT, pcaps);
+ if (!gst_caps_is_equal (caps, pcaps)) {
+ /* different caps, we can't use this pool */
+ GST_DEBUG_OBJECT (ximagesink, "pool has different caps");
+ gst_object_unref (pool);
+ pool = NULL;
+ }
+ }
+ if (pool == NULL && need_pool) {
+ GstVideoInfo info;
+
+ GST_DEBUG_OBJECT (ximagesink, "create new pool");
+ pool = gst_ximage_buffer_pool_new (ximagesink);
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ /* the normal size of a frame */
+ size = info.size;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
+ if (!gst_buffer_pool_set_config (pool, config))
+ goto config_failed;
+ }
+ /* we need at least 2 buffer because we hold on to the last one */
+ gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
+
+ /* we also support various metadata */
+ gst_query_add_allocation_meta (query, GST_META_API_VIDEO);
+ gst_query_add_allocation_meta (query, GST_META_API_VIDEO_CROP);
+
+ gst_object_unref (pool);
+
+ return TRUE;
+
+ /* ERRORS */
+no_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "no caps specified");
+ return FALSE;
+ }
+invalid_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "invalid caps specified");
+ return FALSE;
+ }
+config_failed:
+ {
+ GST_DEBUG_OBJECT (bsink, "failed setting config");
+ return FALSE;
+ }
+}
+
+/* Interfaces stuff */
+static void
+gst_ximagesink_navigation_send_event (GstNavigation * navigation,
+ GstStructure * structure)
+{
+ GstXImageSink *ximagesink = GST_XIMAGESINK (navigation);
+ GstEvent *event;
+ gint x_offset, y_offset;
+ gdouble x, y;
+ GstPad *pad = NULL;
+
+ event = gst_event_new_navigation (structure);
+
+ /* We are not converting the pointer coordinates as there's no hardware
+ scaling done here. The only possible scaling is done by videoscale and
+ videoscale will have to catch those events and tranform the coordinates
+ to match the applied scaling. So here we just add the offset if the image
+ is centered in the window. */
+
+ /* We take the flow_lock while we look at the window */
+ g_mutex_lock (ximagesink->flow_lock);
+
+ if (!ximagesink->xwindow) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ return;
+ }
+
+ x_offset = ximagesink->xwindow->width - GST_VIDEO_SINK_WIDTH (ximagesink);
+ y_offset = ximagesink->xwindow->height - GST_VIDEO_SINK_HEIGHT (ximagesink);
+
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ if (x_offset > 0 && gst_structure_get_double (structure, "pointer_x", &x)) {
+ x -= x_offset / 2;
+ gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL);
+ }
+ if (y_offset > 0 && gst_structure_get_double (structure, "pointer_y", &y)) {
+ y -= y_offset / 2;
+ gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL);
+ }
+
+ pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (ximagesink));
+
+ if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) {
+ gst_pad_send_event (pad, event);
+
+ gst_object_unref (pad);
+ }
+}
+
+static void
+gst_ximagesink_navigation_init (GstNavigationInterface * iface)
+{
+ iface->send_event = gst_ximagesink_navigation_send_event;
+}
+
+static void
+gst_ximagesink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
+{
+ XID xwindow_id = id;
+ GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
+ GstXWindow *xwindow = NULL;
+ XWindowAttributes attr;
+
+ /* We acquire the stream lock while setting this window in the element.
+ We are basically cleaning tons of stuff replacing the old window, putting
+ images while we do that would surely crash */
+ g_mutex_lock (ximagesink->flow_lock);
+
+ /* If we already use that window return */
+ if (ximagesink->xwindow && (xwindow_id == ximagesink->xwindow->win)) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ return;
+ }
+
+ /* If the element has not initialized the X11 context try to do so */
+ if (!ximagesink->xcontext &&
+ !(ximagesink->xcontext = gst_ximagesink_xcontext_get (ximagesink))) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ /* we have thrown a GST_ELEMENT_ERROR now */
+ return;
+ }
+
+ /* If a window is there already we destroy it */
+ if (ximagesink->xwindow) {
+ gst_ximagesink_xwindow_destroy (ximagesink, ximagesink->xwindow);
+ ximagesink->xwindow = NULL;
+ }
+
+ /* If the xid is 0 we go back to an internal window */
+ if (xwindow_id == 0) {
+ /* If no width/height caps nego did not happen window will be created
+ during caps nego then */
+ if (GST_VIDEO_SINK_WIDTH (ximagesink) && GST_VIDEO_SINK_HEIGHT (ximagesink)) {
+ xwindow = gst_ximagesink_xwindow_new (ximagesink,
+ GST_VIDEO_SINK_WIDTH (ximagesink),
+ GST_VIDEO_SINK_HEIGHT (ximagesink));
+ }
+ } else {
+ xwindow = g_new0 (GstXWindow, 1);
+
+ xwindow->win = xwindow_id;
+
+ /* We get window geometry, set the event we want to receive,
+ and create a GC */
+ g_mutex_lock (ximagesink->x_lock);
+ XGetWindowAttributes (ximagesink->xcontext->disp, xwindow->win, &attr);
+ xwindow->width = attr.width;
+ xwindow->height = attr.height;
+ xwindow->internal = FALSE;
+ if (ximagesink->handle_events) {
+ XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask |
+ StructureNotifyMask | PointerMotionMask | KeyPressMask |
+ KeyReleaseMask);
+ }
+
+ xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, 0, NULL);
+ g_mutex_unlock (ximagesink->x_lock);
+ }
+
+ if (xwindow)
+ ximagesink->xwindow = xwindow;
+
+ g_mutex_unlock (ximagesink->flow_lock);
+}
+
+static void
+gst_ximagesink_expose (GstVideoOverlay * overlay)
+{
+ GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
+
+ gst_ximagesink_xwindow_update_geometry (ximagesink);
+ gst_ximagesink_ximage_put (ximagesink, NULL);
+}
+
+static void
+gst_ximagesink_set_event_handling (GstVideoOverlay * overlay,
+ gboolean handle_events)
+{
+ GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
+
+ ximagesink->handle_events = handle_events;
+
+ g_mutex_lock (ximagesink->flow_lock);
+
+ if (G_UNLIKELY (!ximagesink->xwindow)) {
+ g_mutex_unlock (ximagesink->flow_lock);
+ return;
+ }
+
+ g_mutex_lock (ximagesink->x_lock);
+
+ if (handle_events) {
+ if (ximagesink->xwindow->internal) {
+ XSelectInput (ximagesink->xcontext->disp, ximagesink->xwindow->win,
+ ExposureMask | StructureNotifyMask | PointerMotionMask |
+ KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);
+ } else {
+ XSelectInput (ximagesink->xcontext->disp, ximagesink->xwindow->win,
+ ExposureMask | StructureNotifyMask | PointerMotionMask |
+ KeyPressMask | KeyReleaseMask);
+ }
+ } else {
+ XSelectInput (ximagesink->xcontext->disp, ximagesink->xwindow->win, 0);
+ }
+
+ g_mutex_unlock (ximagesink->x_lock);
+
+ g_mutex_unlock (ximagesink->flow_lock);
+}
+
+static void
+gst_ximagesink_video_overlay_init (GstVideoOverlayIface * iface)
+{
+ iface->set_window_handle = gst_ximagesink_set_window_handle;
+ iface->expose = gst_ximagesink_expose;
+ iface->handle_events = gst_ximagesink_set_event_handling;
+}
+
+/* =========================================== */
+/* */
+/* Init & Class init */
+/* */
+/* =========================================== */
+
+static void
+gst_ximagesink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstXImageSink *ximagesink;
+
+ g_return_if_fail (GST_IS_XIMAGESINK (object));
+
+ ximagesink = GST_XIMAGESINK (object);
+
+ switch (prop_id) {
+ case PROP_DISPLAY:
+ ximagesink->display_name = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_SYNCHRONOUS:
+ ximagesink->synchronous = g_value_get_boolean (value);
+ if (ximagesink->xcontext) {
+ GST_DEBUG_OBJECT (ximagesink, "XSynchronize called with %s",
+ ximagesink->synchronous ? "TRUE" : "FALSE");
+ g_mutex_lock (ximagesink->x_lock);
+ XSynchronize (ximagesink->xcontext->disp, ximagesink->synchronous);
+ g_mutex_unlock (ximagesink->x_lock);
+ }
+ break;
+ case PROP_FORCE_ASPECT_RATIO:
+ ximagesink->keep_aspect = g_value_get_boolean (value);
+ break;
+ case PROP_PIXEL_ASPECT_RATIO:
+ {
+ GValue *tmp;
+
+ tmp = g_new0 (GValue, 1);
+ g_value_init (tmp, GST_TYPE_FRACTION);
+
+ if (!g_value_transform (value, tmp)) {
+ GST_WARNING_OBJECT (ximagesink,
+ "Could not transform string to aspect ratio");
+ g_free (tmp);
+ } else {
+ GST_DEBUG_OBJECT (ximagesink, "set PAR to %d/%d",
+ gst_value_get_fraction_numerator (tmp),
+ gst_value_get_fraction_denominator (tmp));
+ g_free (ximagesink->par);
+ ximagesink->par = tmp;
+ }
+ }
+ break;
+ case PROP_HANDLE_EVENTS:
+ gst_ximagesink_set_event_handling (GST_VIDEO_OVERLAY (ximagesink),
+ g_value_get_boolean (value));
+ gst_ximagesink_manage_event_thread (ximagesink);
+ break;
+ case PROP_HANDLE_EXPOSE:
+ ximagesink->handle_expose = g_value_get_boolean (value);
+ gst_ximagesink_manage_event_thread (ximagesink);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_ximagesink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstXImageSink *ximagesink;
+
+ g_return_if_fail (GST_IS_XIMAGESINK (object));
+
+ ximagesink = GST_XIMAGESINK (object);
+
+ switch (prop_id) {
+ case PROP_DISPLAY:
+ g_value_set_string (value, ximagesink->display_name);
+ break;
+ case PROP_SYNCHRONOUS:
+ g_value_set_boolean (value, ximagesink->synchronous);
+ break;
+ case PROP_FORCE_ASPECT_RATIO:
+ g_value_set_boolean (value, ximagesink->keep_aspect);
+ break;
+ case PROP_PIXEL_ASPECT_RATIO:
+ if (ximagesink->par)
+ g_value_transform (ximagesink->par, value);
+ break;
+ case PROP_HANDLE_EVENTS:
+ g_value_set_boolean (value, ximagesink->handle_events);
+ break;
+ case PROP_HANDLE_EXPOSE:
+ g_value_set_boolean (value, ximagesink->handle_expose);
+ break;
+ case PROP_WINDOW_WIDTH:
+ if (ximagesink->xwindow)
+ g_value_set_uint64 (value, ximagesink->xwindow->width);
+ else
+ g_value_set_uint64 (value, 0);
+ break;
+ case PROP_WINDOW_HEIGHT:
+ if (ximagesink->xwindow)
+ g_value_set_uint64 (value, ximagesink->xwindow->height);
+ else
+ g_value_set_uint64 (value, 0);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_ximagesink_reset (GstXImageSink * ximagesink)
+{
+ GThread *thread;
+
+ GST_OBJECT_LOCK (ximagesink);
+ ximagesink->running = FALSE;
+ /* grab thread and mark it as NULL */
+ thread = ximagesink->event_thread;
+ ximagesink->event_thread = NULL;
+ GST_OBJECT_UNLOCK (ximagesink);
+
+ /* Wait for our event thread to finish before we clean up our stuff. */
+ if (thread)
+ g_thread_join (thread);
+
+ if (ximagesink->cur_image) {
+ gst_buffer_unref (ximagesink->cur_image);
+ ximagesink->cur_image = NULL;
+ }
+
+ g_mutex_lock (ximagesink->flow_lock);
+
+ if (ximagesink->pool) {
+ gst_object_unref (ximagesink->pool);
+ ximagesink->pool = NULL;
+ }
+
+ if (ximagesink->xwindow) {
+ gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow);
+ gst_ximagesink_xwindow_destroy (ximagesink, ximagesink->xwindow);
+ ximagesink->xwindow = NULL;
+ }
+ g_mutex_unlock (ximagesink->flow_lock);
+
+ gst_ximagesink_xcontext_clear (ximagesink);
+}
+
+static void
+gst_ximagesink_finalize (GObject * object)
+{
+ GstXImageSink *ximagesink;
+
+ ximagesink = GST_XIMAGESINK (object);
+
+ gst_ximagesink_reset (ximagesink);
+
+ if (ximagesink->display_name) {
+ g_free (ximagesink->display_name);
+ ximagesink->display_name = NULL;
+ }
+ if (ximagesink->par) {
+ g_free (ximagesink->par);
+ ximagesink->par = NULL;
+ }
+ if (ximagesink->x_lock) {
+ g_mutex_free (ximagesink->x_lock);
+ ximagesink->x_lock = NULL;
+ }
+ if (ximagesink->flow_lock) {
+ g_mutex_free (ximagesink->flow_lock);
+ ximagesink->flow_lock = NULL;
+ }
+
+ g_free (ximagesink->media_title);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_ximagesink_init (GstXImageSink * ximagesink)
+{
+ ximagesink->display_name = NULL;
+ ximagesink->xcontext = NULL;
+ ximagesink->xwindow = NULL;
+ ximagesink->cur_image = NULL;
+
+ ximagesink->event_thread = NULL;
+ ximagesink->running = FALSE;
+
+ ximagesink->fps_n = 0;
+ ximagesink->fps_d = 1;
+
+ ximagesink->x_lock = g_mutex_new ();
+ ximagesink->flow_lock = g_mutex_new ();
+
+ ximagesink->par = NULL;
+
+ ximagesink->pool = NULL;
+
+ ximagesink->synchronous = FALSE;
+ ximagesink->keep_aspect = FALSE;
+ ximagesink->handle_events = TRUE;
+ ximagesink->handle_expose = TRUE;
+}
+
+static void
+gst_ximagesink_class_init (GstXImageSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+ GstVideoSinkClass *videosink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+ videosink_class = (GstVideoSinkClass *) klass;
+
+ gobject_class->finalize = gst_ximagesink_finalize;
+ gobject_class->set_property = gst_ximagesink_set_property;
+ gobject_class->get_property = gst_ximagesink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_DISPLAY,
+ g_param_spec_string ("display", "Display", "X Display name",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SYNCHRONOUS,
+ g_param_spec_boolean ("synchronous", "Synchronous", "When enabled, runs "
+ "the X display in synchronous mode. (used only for debugging)", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
+ g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
+ "When enabled, reverse caps negotiation (scaling) will respect "
+ "original aspect ratio", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PIXEL_ASPECT_RATIO,
+ g_param_spec_string ("pixel-aspect-ratio", "Pixel Aspect Ratio",
+ "The pixel aspect ratio of the device", "1/1",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HANDLE_EVENTS,
+ g_param_spec_boolean ("handle-events", "Handle XEvents",
+ "When enabled, XEvents will be selected and handled", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HANDLE_EXPOSE,
+ g_param_spec_boolean ("handle-expose", "Handle expose",
+ "When enabled, "
+ "the current frame will always be drawn in response to X Expose "
+ "events", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXImageSink:window-width
+ *
+ * Actual width of the video window.
+ *
+ * Since: 0.10.32
+ */
+ g_object_class_install_property (gobject_class, PROP_WINDOW_WIDTH,
+ g_param_spec_uint64 ("window-width", "window-width",
+ "Width of the window", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXImageSink:window-height
+ *
+ * Actual height of the video window.
+ *
+ * Since: 0.10.32
+ */
+ g_object_class_install_property (gobject_class, PROP_WINDOW_HEIGHT,
+ g_param_spec_uint64 ("window-height", "window-height",
+ "Height of the window", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Video sink", "Sink/Video",
+ "A standard X based videosink", "Julien Moutte <julien@moutte.net>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_ximagesink_sink_template_factory));
+
+ gstelement_class->change_state = gst_ximagesink_change_state;
+
+ gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_ximagesink_getcaps);
+ gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_ximagesink_setcaps);
+ gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_ximagesink_get_times);
+ gstbasesink_class->propose_allocation =
+ GST_DEBUG_FUNCPTR (gst_ximagesink_propose_allocation);
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_ximagesink_event);
+
+ videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_ximagesink_show_frame);
+}
diff --git a/sys/ximage/ximagesink.h b/sys/ximage/ximagesink.h
new file mode 100644
index 0000000..0cdd896
--- /dev/null
+++ b/sys/ximage/ximagesink.h
@@ -0,0 +1,210 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_XIMAGESINK_H__
+#define __GST_XIMAGESINK_H__
+
+#include <gst/video/gstvideosink.h>
+
+#ifdef HAVE_XSHM
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif /* HAVE_XSHM */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM
+#include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM */
+
+#include <string.h>
+#include <math.h>
+
+/* Helper functions */
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_XIMAGESINK \
+ (gst_ximagesink_get_type())
+#define GST_XIMAGESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_XIMAGESINK, GstXImageSink))
+#define GST_XIMAGESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_XIMAGESINK, GstXImageSinkClass))
+#define GST_IS_XIMAGESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_XIMAGESINK))
+#define GST_IS_XIMAGESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_XIMAGESINK))
+
+typedef struct _GstXContext GstXContext;
+typedef struct _GstXWindow GstXWindow;
+
+typedef struct _GstXImageSink GstXImageSink;
+typedef struct _GstXImageSinkClass GstXImageSinkClass;
+
+#include "ximagepool.h"
+
+/*
+ * 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 width, height;
+ gint widthmm, heightmm;
+ GValue *par; /* calculated pixel aspect ratio */
+
+ gboolean use_xshm;
+
+ GstCaps *caps;
+ GstCaps *last_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;
+};
+
+/**
+ * GstXImageSink:
+ * @display_name: the name of the Display we want to render to
+ * @xcontext: our instance's #GstXContext
+ * @xwindow: the #GstXWindow we are rendering to
+ * @ximage: internal #GstXImage used to store incoming buffers and render when
+ * not using the buffer_alloc optimization mechanism
+ * @cur_image: a reference to the last #GstXImage that was put to @xwindow. It
+ * is used when Expose events are received to redraw the latest video frame
+ * @event_thread: a thread listening for events on @xwindow and handling them
+ * @running: used to inform @event_thread if it should run/shutdown
+ * @fps_n: the framerate fraction numerator
+ * @fps_d: the framerate fraction denominator
+ * @x_lock: used to protect X calls as we are not using the XLib in threaded
+ * mode
+ * @flow_lock: used to protect data flow routines from external calls such as
+ * events from @event_thread or methods from the #GstXOverlay interface
+ * @par: used to override calculated pixel aspect ratio from @xcontext
+ * @pool_lock: used to protect the buffer pool
+ * @buffer_pool: a list of #GstXImageBuffer that could be reused at next buffer
+ * allocation call
+ * @synchronous: used to store if XSynchronous should be used or not (for
+ * debugging purpose only)
+ * @keep_aspect: used to remember if reverse negotiation scaling should respect
+ * aspect ratio
+ * @handle_events: used to know if we should handle select XEvents or not
+ *
+ * The #GstXImageSink data structure.
+ */
+struct _GstXImageSink
+{
+ /* Our element stuff */
+ GstVideoSink videosink;
+
+ char *display_name;
+
+ GstXContext *xcontext;
+ GstXWindow *xwindow;
+ GstBuffer *cur_image;
+
+ GThread *event_thread;
+ gboolean running;
+
+ GstVideoInfo info;
+
+ /* Framerate numerator and denominator */
+ gint fps_n;
+ gint fps_d;
+
+ GMutex *x_lock;
+ GMutex *flow_lock;
+
+ /* object-set pixel aspect ratio */
+ GValue *par;
+
+ /* the buffer pool */
+ GstBufferPool *pool;
+
+ gboolean synchronous;
+ gboolean keep_aspect;
+ gboolean handle_events;
+ gboolean handle_expose;
+ gboolean draw_border;
+
+ /* stream metadata */
+ gchar *media_title;
+};
+
+struct _GstXImageSinkClass
+{
+ GstVideoSinkClass parent_class;
+};
+
+GType gst_ximagesink_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_XIMAGESINK_H__ */
diff --git a/sys/xvimage/Makefile.am b/sys/xvimage/Makefile.am
new file mode 100644
index 0000000..9669e72
--- /dev/null
+++ b/sys/xvimage/Makefile.am
@@ -0,0 +1,15 @@
+plugin_LTLIBRARIES = libgstxvimagesink.la
+
+libgstxvimagesink_la_SOURCES = xvimagesink.c xvimage.c xvimagepool.c
+libgstxvimagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+libgstxvimagesink_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(X_LIBS) $(XVIDEO_LIBS) $(XSHM_LIBS) $(LIBM)
+libgstxvimagesink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstxvimagesink_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la
+libgstxvimagesink_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = xvimagesink.h xvimagepool.h
diff --git a/sys/xvimage/Makefile.in b/sys/xvimage/Makefile.in
new file mode 100644
index 0000000..c31cbd0
--- /dev/null
+++ b/sys/xvimage/Makefile.in
@@ -0,0 +1,780 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/xvimage
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstxvimagesink_la_OBJECTS = libgstxvimagesink_la-xvimagesink.lo \
+ libgstxvimagesink_la-xvimage.lo \
+ libgstxvimagesink_la-xvimagepool.lo
+libgstxvimagesink_la_OBJECTS = $(am_libgstxvimagesink_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstxvimagesink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) \
+ $(libgstxvimagesink_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(libgstxvimagesink_la_SOURCES)
+DIST_SOURCES = $(libgstxvimagesink_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = libgstxvimagesink.la
+libgstxvimagesink_la_SOURCES = xvimagesink.c xvimage.c xvimagepool.c
+libgstxvimagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+libgstxvimagesink_la_LIBADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(X_LIBS) $(XVIDEO_LIBS) $(XSHM_LIBS) $(LIBM)
+
+libgstxvimagesink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstxvimagesink_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la
+libgstxvimagesink_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = xvimagesink.h xvimagepool.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/xvimage/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu sys/xvimage/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
+libgstxvimagesink.la: $(libgstxvimagesink_la_OBJECTS) $(libgstxvimagesink_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstxvimagesink_la_LINK) -rpath $(plugindir) $(libgstxvimagesink_la_OBJECTS) $(libgstxvimagesink_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstxvimagesink_la-xvimage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstxvimagesink_la-xvimagepool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstxvimagesink_la-xvimagesink.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgstxvimagesink_la-xvimagesink.lo: xvimagesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -MT libgstxvimagesink_la-xvimagesink.lo -MD -MP -MF $(DEPDIR)/libgstxvimagesink_la-xvimagesink.Tpo -c -o libgstxvimagesink_la-xvimagesink.lo `test -f 'xvimagesink.c' || echo '$(srcdir)/'`xvimagesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstxvimagesink_la-xvimagesink.Tpo $(DEPDIR)/libgstxvimagesink_la-xvimagesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xvimagesink.c' object='libgstxvimagesink_la-xvimagesink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -c -o libgstxvimagesink_la-xvimagesink.lo `test -f 'xvimagesink.c' || echo '$(srcdir)/'`xvimagesink.c
+
+libgstxvimagesink_la-xvimage.lo: xvimage.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -MT libgstxvimagesink_la-xvimage.lo -MD -MP -MF $(DEPDIR)/libgstxvimagesink_la-xvimage.Tpo -c -o libgstxvimagesink_la-xvimage.lo `test -f 'xvimage.c' || echo '$(srcdir)/'`xvimage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstxvimagesink_la-xvimage.Tpo $(DEPDIR)/libgstxvimagesink_la-xvimage.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xvimage.c' object='libgstxvimagesink_la-xvimage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -c -o libgstxvimagesink_la-xvimage.lo `test -f 'xvimage.c' || echo '$(srcdir)/'`xvimage.c
+
+libgstxvimagesink_la-xvimagepool.lo: xvimagepool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -MT libgstxvimagesink_la-xvimagepool.lo -MD -MP -MF $(DEPDIR)/libgstxvimagesink_la-xvimagepool.Tpo -c -o libgstxvimagesink_la-xvimagepool.lo `test -f 'xvimagepool.c' || echo '$(srcdir)/'`xvimagepool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstxvimagesink_la-xvimagepool.Tpo $(DEPDIR)/libgstxvimagesink_la-xvimagepool.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xvimagepool.c' object='libgstxvimagesink_la-xvimagepool.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstxvimagesink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstxvimagesink_la_CFLAGS) $(CFLAGS) -c -o libgstxvimagesink_la-xvimagepool.lo `test -f 'xvimagepool.c' || echo '$(srcdir)/'`xvimagepool.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/xvimage/xvimage.c b/sys/xvimage/xvimage.c
new file mode 100644
index 0000000..5e2d619
--- /dev/null
+++ b/sys/xvimage/xvimage.c
@@ -0,0 +1,51 @@
+/* GStreamer
+ * Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xvimagesink.h"
+
+GST_DEBUG_CATEGORY (gst_debug_xvimagepool);
+GST_DEBUG_CATEGORY (gst_debug_xvimagesink);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_element_register (plugin, "xvimagesink",
+ GST_RANK_PRIMARY, GST_TYPE_XVIMAGESINK))
+ return FALSE;
+
+ GST_DEBUG_CATEGORY_INIT (gst_debug_xvimagesink, "xvimagesink", 0,
+ "xvimagesink element");
+ GST_DEBUG_CATEGORY_INIT (gst_debug_xvimagepool, "xvimagepool", 0,
+ "xvimagepool object");
+
+ GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "xvimagesink",
+ "XFree86 video output plugin using Xv extension",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/sys/xvimage/xvimagepool.c b/sys/xvimage/xvimagepool.c
new file mode 100644
index 0000000..855d877
--- /dev/null
+++ b/sys/xvimage/xvimagepool.c
@@ -0,0 +1,733 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Object header */
+#include "xvimagesink.h"
+
+/* Debugging category */
+#include <gst/gstinfo.h>
+
+/* Helper functions */
+#include <gst/video/video.h>
+#include <gst/video/gstmetavideo.h>
+#include <gst/video/gstvideopool.h>
+
+
+GST_DEBUG_CATEGORY_EXTERN (gst_debug_xvimagepool);
+#define GST_CAT_DEFAULT gst_debug_xvimagepool
+
+
+struct _GstXvImageBufferPoolPrivate
+{
+ GstCaps *caps;
+ gint im_format;
+ GstVideoInfo info;
+ GstVideoAlignment align;
+ guint padded_width;
+ guint padded_height;
+ gboolean add_metavideo;
+ gboolean need_alignment;
+};
+
+static void gst_meta_xvimage_free (GstMetaXvImage * meta, GstBuffer * buffer);
+
+/* xvimage metadata */
+const GstMetaInfo *
+gst_meta_xvimage_get_info (void)
+{
+ static const GstMetaInfo *meta_xvimage_info = NULL;
+
+ if (meta_xvimage_info == NULL) {
+ meta_xvimage_info = gst_meta_register ("GstMetaXvImage", "GstMetaXvImage",
+ sizeof (GstMetaXvImage),
+ (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) gst_meta_xvimage_free,
+ (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL);
+ }
+ return meta_xvimage_info;
+}
+
+/* X11 stuff */
+static gboolean error_caught = FALSE;
+
+static int
+gst_xvimagesink_handle_xerror (Display * display, XErrorEvent * xevent)
+{
+ char error_msg[1024];
+
+ XGetErrorText (display, xevent->error_code, error_msg, 1024);
+ GST_DEBUG ("xvimagesink triggered an XError. error: %s", error_msg);
+ error_caught = TRUE;
+ return 0;
+}
+
+static GstMetaXvImage *
+gst_buffer_add_meta_xvimage (GstBuffer * buffer, GstXvImageBufferPool * xvpool)
+{
+ GstXvImageSink *xvimagesink;
+ int (*handler) (Display *, XErrorEvent *);
+ gboolean success = FALSE;
+ GstXContext *xcontext;
+ GstMetaXvImage *meta;
+ gint width, height, im_format;
+ GstXvImageBufferPoolPrivate *priv;
+
+ priv = xvpool->priv;
+ xvimagesink = xvpool->sink;
+ xcontext = xvimagesink->xcontext;
+
+ width = priv->padded_width;
+ height = priv->padded_height;
+ im_format = priv->im_format;
+
+ meta =
+ (GstMetaXvImage *) gst_buffer_add_meta (buffer, GST_META_INFO_XVIMAGE,
+ NULL);
+#ifdef HAVE_XSHM
+ meta->SHMInfo.shmaddr = ((void *) -1);
+ meta->SHMInfo.shmid = -1;
+#endif
+ meta->x = priv->align.padding_left;
+ meta->y = priv->align.padding_top;
+ meta->width = priv->info.width;
+ meta->height = priv->info.height;
+ meta->sink = gst_object_ref (xvimagesink);
+ meta->im_format = im_format;
+
+ GST_DEBUG_OBJECT (xvimagesink, "creating image %p (%dx%d)", buffer,
+ width, height);
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ /* Setting an error handler to catch failure */
+ error_caught = FALSE;
+ handler = XSetErrorHandler (gst_xvimagesink_handle_xerror);
+
+#ifdef HAVE_XSHM
+ if (xcontext->use_xshm) {
+ int expected_size;
+
+ meta->xvimage = XvShmCreateImage (xcontext->disp,
+ xcontext->xv_port_id, im_format, NULL, width, height, &meta->SHMInfo);
+ if (!meta->xvimage || error_caught) {
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ /* Reset error flag */
+ error_caught = FALSE;
+
+ /* Push a warning */
+ GST_ELEMENT_WARNING (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not XShmCreateImage a %dx%d image", width, height));
+
+ /* Retry without XShm */
+ xvimagesink->xcontext->use_xshm = FALSE;
+
+ /* Hold X mutex again to try without XShm */
+ g_mutex_lock (xvimagesink->x_lock);
+ goto no_xshm;
+ }
+
+ /* we have to use the returned data_size for our shm size */
+ meta->size = meta->xvimage->data_size;
+ GST_LOG_OBJECT (xvimagesink, "XShm image size is %" G_GSIZE_FORMAT,
+ meta->size);
+
+ /* calculate the expected size. This is only for sanity checking the
+ * number we get from X. */
+ switch (im_format) {
+ case GST_MAKE_FOURCC ('I', '4', '2', '0'):
+ case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
+ {
+ gint pitches[3];
+ gint offsets[3];
+ guint plane;
+
+ offsets[0] = 0;
+ pitches[0] = GST_ROUND_UP_4 (width);
+ offsets[1] = offsets[0] + pitches[0] * GST_ROUND_UP_2 (height);
+ pitches[1] = GST_ROUND_UP_8 (width) / 2;
+ offsets[2] = offsets[1] + pitches[1] * GST_ROUND_UP_2 (height) / 2;
+ pitches[2] = GST_ROUND_UP_8 (pitches[0]) / 2;
+
+ expected_size = offsets[2] + pitches[2] * GST_ROUND_UP_2 (height) / 2;
+
+ for (plane = 0; plane < meta->xvimage->num_planes; plane++) {
+ GST_DEBUG_OBJECT (xvimagesink,
+ "Plane %u has a expected pitch of %d bytes, " "offset of %d",
+ plane, pitches[plane], offsets[plane]);
+ }
+ break;
+ }
+ case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
+ case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
+ expected_size = height * GST_ROUND_UP_4 (width * 2);
+ break;
+ default:
+ expected_size = 0;
+ break;
+ }
+ if (expected_size != 0 && meta->size != expected_size) {
+ GST_WARNING_OBJECT (xvimagesink,
+ "unexpected XShm image size (got %" G_GSIZE_FORMAT ", expected %d)",
+ meta->size, expected_size);
+ }
+
+ /* Be verbose about our XvImage stride */
+ {
+ guint plane;
+
+ for (plane = 0; plane < meta->xvimage->num_planes; plane++) {
+ GST_DEBUG_OBJECT (xvimagesink, "Plane %u has a pitch of %d bytes, "
+ "offset of %d", plane, meta->xvimage->pitches[plane],
+ meta->xvimage->offsets[plane]);
+ }
+ }
+
+ /* get shared memory */
+ meta->SHMInfo.shmid = shmget (IPC_PRIVATE, meta->size, IPC_CREAT | 0777);
+ if (meta->SHMInfo.shmid == -1)
+ goto shmget_failed;
+
+ /* attach */
+ meta->SHMInfo.shmaddr = shmat (meta->SHMInfo.shmid, NULL, 0);
+ if (meta->SHMInfo.shmaddr == ((void *) -1))
+ goto shmat_failed;
+
+ /* now we can set up the image data */
+ meta->xvimage->data = meta->SHMInfo.shmaddr;
+ meta->SHMInfo.readOnly = FALSE;
+
+ if (XShmAttach (xcontext->disp, &meta->SHMInfo) == 0)
+ goto xattach_failed;
+
+ XSync (xcontext->disp, FALSE);
+
+ /* Delete the shared memory segment as soon as we everyone is attached.
+ * This way, it will be deleted as soon as we detach later, and not
+ * leaked if we crash. */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+
+ GST_DEBUG_OBJECT (xvimagesink, "XServer ShmAttached to 0x%x, id 0x%lx",
+ meta->SHMInfo.shmid, meta->SHMInfo.shmseg);
+ } else
+ no_xshm:
+#endif /* HAVE_XSHM */
+ {
+ meta->xvimage = XvCreateImage (xcontext->disp,
+ xcontext->xv_port_id, im_format, NULL, width, height);
+ if (!meta->xvimage || error_caught)
+ goto create_failed;
+
+ /* we have to use the returned data_size for our image size */
+ meta->size = meta->xvimage->data_size;
+ meta->xvimage->data = g_malloc (meta->size);
+
+ XSync (xcontext->disp, FALSE);
+ }
+
+ /* Reset error handler */
+ error_caught = FALSE;
+ XSetErrorHandler (handler);
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, meta->xvimage->data,
+ NULL, meta->size, 0, meta->size));
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ success = TRUE;
+
+beach:
+ if (!success)
+ meta = NULL;
+
+ return meta;
+
+ /* ERRORS */
+create_failed:
+ {
+ g_mutex_unlock (xvimagesink->x_lock);
+ /* Reset error handler */
+ error_caught = FALSE;
+ XSetErrorHandler (handler);
+ /* Push an error */
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not XvShmCreateImage a %dx%d image", width, height));
+ goto beach;
+ }
+shmget_failed:
+ {
+ g_mutex_unlock (xvimagesink->x_lock);
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height),
+ ("could not get shared memory of %" G_GSIZE_FORMAT " bytes",
+ meta->size));
+ goto beach;
+ }
+shmat_failed:
+ {
+ g_mutex_unlock (xvimagesink->x_lock);
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height), ("Failed to shmat: %s", g_strerror (errno)));
+ /* Clean up the shared memory segment */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+xattach_failed:
+ {
+ /* Clean up the shared memory segment */
+ shmctl (meta->SHMInfo.shmid, IPC_RMID, NULL);
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ width, height), ("Failed to XShmAttach"));
+ goto beach;
+ }
+}
+
+static void
+gst_meta_xvimage_free (GstMetaXvImage * meta, GstBuffer * buffer)
+{
+ GstXvImageSink *xvimagesink;
+
+ xvimagesink = meta->sink;
+
+ GST_DEBUG_OBJECT (xvimagesink, "free meta on buffer %p", buffer);
+
+ /* Hold the object lock to ensure the XContext doesn't disappear */
+ GST_OBJECT_LOCK (xvimagesink);
+ /* We might have some buffers destroyed after changing state to NULL */
+ if (xvimagesink->xcontext == NULL) {
+ GST_DEBUG_OBJECT (xvimagesink, "Destroying XvImage after Xcontext");
+#ifdef HAVE_XSHM
+ /* Need to free the shared memory segment even if the x context
+ * was already cleaned up */
+ if (meta->SHMInfo.shmaddr != ((void *) -1)) {
+ shmdt (meta->SHMInfo.shmaddr);
+ }
+#endif
+ goto beach;
+ }
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+#ifdef HAVE_XSHM
+ if (xvimagesink->xcontext->use_xshm) {
+ if (meta->SHMInfo.shmaddr != ((void *) -1)) {
+ GST_DEBUG_OBJECT (xvimagesink, "XServer ShmDetaching from 0x%x id 0x%lx",
+ meta->SHMInfo.shmid, meta->SHMInfo.shmseg);
+ XShmDetach (xvimagesink->xcontext->disp, &meta->SHMInfo);
+ XSync (xvimagesink->xcontext->disp, FALSE);
+ shmdt (meta->SHMInfo.shmaddr);
+ meta->SHMInfo.shmaddr = (void *) -1;
+ }
+ if (meta->xvimage)
+ XFree (meta->xvimage);
+ } else
+#endif /* HAVE_XSHM */
+ {
+ if (meta->xvimage) {
+ g_free (meta->xvimage->data);
+ XFree (meta->xvimage);
+ }
+ }
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+beach:
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+ gst_object_unref (meta->sink);
+}
+
+#ifdef HAVE_XSHM
+/* This function checks that it is actually really possible to create an image
+ using XShm */
+gboolean
+gst_xvimagesink_check_xshm_calls (GstXvImageSink * xvimagesink,
+ GstXContext * xcontext)
+{
+ XvImage *xvimage;
+ 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 (gst_xvimagesink_handle_xerror);
+
+ /* Trying to create a 1x1 picture */
+ GST_DEBUG ("XvShmCreateImage of 1x1");
+ xvimage = XvShmCreateImage (xcontext->disp, xcontext->xv_port_id,
+ xcontext->im_format, NULL, 1, 1, &SHMInfo);
+
+ /* Might cause an error, sync to ensure it is noticed */
+ XSync (xcontext->disp, FALSE);
+ if (!xvimage || error_caught) {
+ GST_WARNING ("could not XvShmCreateImage a 1x1 image");
+ goto beach;
+ }
+ size = xvimage->data_size;
+
+ 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, NULL, 0);
+ if (SHMInfo.shmaddr == ((void *) -1)) {
+ GST_WARNING ("Failed to shmat: %s", g_strerror (errno));
+ /* Clean up the shared memory segment */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+
+ xvimage->data = SHMInfo.shmaddr;
+ SHMInfo.readOnly = FALSE;
+
+ if (XShmAttach (xcontext->disp, &SHMInfo) == 0) {
+ GST_WARNING ("Failed to XShmAttach");
+ /* Clean up the shared memory segment */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+ goto beach;
+ }
+
+ /* Sync to ensure we see any errors we caused */
+ XSync (xcontext->disp, FALSE);
+
+ /* Delete the shared memory segment as soon as everyone is attached.
+ * This way, it will be deleted as soon as we detach later, and not
+ * leaked if we crash. */
+ shmctl (SHMInfo.shmid, IPC_RMID, NULL);
+
+ if (!error_caught) {
+ GST_DEBUG ("XServer ShmAttached to 0x%x, id 0x%lx", SHMInfo.shmid,
+ SHMInfo.shmseg);
+
+ did_attach = TRUE;
+ /* store whether we succeeded in result */
+ result = TRUE;
+ } else {
+ GST_WARNING ("MIT-SHM extension check failed at XShmAttach. "
+ "Not using shared memory.");
+ }
+
+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) {
+ GST_DEBUG ("XServer ShmDetaching from 0x%x id 0x%lx",
+ SHMInfo.shmid, SHMInfo.shmseg);
+ XShmDetach (xcontext->disp, &SHMInfo);
+ XSync (xcontext->disp, FALSE);
+ }
+ if (SHMInfo.shmaddr != ((void *) -1))
+ shmdt (SHMInfo.shmaddr);
+ if (xvimage)
+ XFree (xvimage);
+ return result;
+}
+#endif /* HAVE_XSHM */
+
+/* bufferpool */
+static void gst_xvimage_buffer_pool_finalize (GObject * object);
+
+#define GST_XVIMAGE_BUFFER_POOL_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_XVIMAGE_BUFFER_POOL, GstXvImageBufferPoolPrivate))
+
+#define gst_xvimage_buffer_pool_parent_class parent_class
+G_DEFINE_TYPE (GstXvImageBufferPool, gst_xvimage_buffer_pool,
+ GST_TYPE_BUFFER_POOL);
+
+static const gchar **
+xvimage_buffer_pool_get_options (GstBufferPool * pool)
+{
+ static const gchar *options[] = { GST_BUFFER_POOL_OPTION_META_VIDEO,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT, NULL
+ };
+
+ return options;
+}
+
+static gboolean
+xvimage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
+{
+ GstXvImageBufferPool *xvpool = GST_XVIMAGE_BUFFER_POOL_CAST (pool);
+ GstXvImageBufferPoolPrivate *priv = xvpool->priv;
+ GstVideoInfo info;
+ const GstCaps *caps;
+
+ if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
+ goto wrong_config;
+
+ if (caps == NULL)
+ goto no_caps;
+
+ /* now parse the caps from the config */
+ if (!gst_video_info_from_caps (&info, caps))
+ goto wrong_caps;
+
+ GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, info.width, info.height,
+ caps);
+
+ priv->im_format = gst_xvimagesink_get_format_from_info (xvpool->sink, &info);
+ if (priv->im_format == -1)
+ goto unknown_format;
+
+ if (priv->caps)
+ gst_caps_unref (priv->caps);
+ priv->caps = gst_caps_copy (caps);
+ priv->info = info;
+
+ /* enable metadata based on config of the pool */
+ priv->add_metavideo =
+ gst_buffer_pool_config_has_option (config,
+ GST_BUFFER_POOL_OPTION_META_VIDEO);
+
+ /* parse extra alignment info */
+ priv->need_alignment = gst_buffer_pool_config_has_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
+
+ if (priv->need_alignment) {
+ gst_buffer_pool_config_get_video_alignment (config, &priv->align);
+
+ GST_LOG_OBJECT (pool, "padding %u-%ux%u-%u", priv->align.padding_top,
+ priv->align.padding_left, priv->align.padding_left,
+ priv->align.padding_bottom);
+
+ /* we need the video metadata too now */
+ priv->add_metavideo = TRUE;
+ }
+
+ /* add the padding */
+ priv->padded_width =
+ GST_VIDEO_INFO_WIDTH (&info) + priv->align.padding_left +
+ priv->align.padding_right;
+ priv->padded_height =
+ GST_VIDEO_INFO_HEIGHT (&info) + priv->align.padding_top +
+ priv->align.padding_bottom;
+
+ return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
+
+ /* ERRORS */
+wrong_config:
+ {
+ GST_WARNING_OBJECT (pool, "invalid config");
+ return FALSE;
+ }
+no_caps:
+ {
+ GST_WARNING_OBJECT (pool, "no caps in config");
+ return FALSE;
+ }
+wrong_caps:
+ {
+ GST_WARNING_OBJECT (pool,
+ "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+unknown_format:
+ {
+ GST_WARNING_OBJECT (xvpool->sink, "failed to get format from caps %"
+ GST_PTR_FORMAT, caps);
+ GST_ELEMENT_ERROR (xvpool->sink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ priv->info.width, priv->info.height), ("Invalid input caps"));
+ return FALSE;;
+ }
+}
+
+/* This function handles GstXImageBuffer creation depending on XShm availability */
+static GstFlowReturn
+xvimage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolParams * params)
+{
+ GstXvImageBufferPool *xvpool = GST_XVIMAGE_BUFFER_POOL_CAST (pool);
+ GstXvImageBufferPoolPrivate *priv = xvpool->priv;
+ GstVideoInfo *info;
+ GstBuffer *xvimage;
+ GstMetaXvImage *meta;
+
+ info = &priv->info;
+
+ xvimage = gst_buffer_new ();
+ meta = gst_buffer_add_meta_xvimage (xvimage, xvpool);
+ if (meta == NULL) {
+ gst_buffer_unref (xvimage);
+ goto no_buffer;
+ }
+
+ if (priv->add_metavideo) {
+ GstMetaVideo *meta;
+ const GstVideoFormatInfo *vinfo = info->finfo;
+ gint i;
+
+ GST_DEBUG_OBJECT (pool, "adding GstMetaVideo");
+ /* these are just the defaults for now */
+ meta = gst_buffer_add_meta_video (xvimage, 0, GST_VIDEO_INFO_FORMAT (info),
+ priv->padded_width, priv->padded_height);
+
+ if (priv->need_alignment) {
+ meta->width = GST_VIDEO_INFO_WIDTH (&priv->info);
+ meta->height = GST_VIDEO_INFO_HEIGHT (&priv->info);
+
+ /* FIXME, not quite correct, NV12 would apply the vedge twice on the second
+ * plane */
+ for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++) {
+ gint vedge, hedge, plane;
+
+ hedge =
+ GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, i,
+ priv->align.padding_left);
+ vedge =
+ GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo, i,
+ priv->align.padding_top);
+ plane = GST_VIDEO_FORMAT_INFO_PLANE (vinfo, i);
+
+ GST_LOG_OBJECT (pool, "comp %d, plane %d: hedge %d, vedge %d", i,
+ plane, hedge, vedge);
+
+ meta->offset[plane] += (vedge * meta->stride[plane]) + hedge;
+ }
+ }
+ }
+
+ *buffer = xvimage;
+
+ return GST_FLOW_OK;
+
+ /* ERROR */
+no_buffer:
+ {
+ GST_WARNING_OBJECT (pool, "can't create image");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static void
+xvimage_buffer_pool_free (GstBufferPool * pool, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+}
+
+GstBufferPool *
+gst_xvimage_buffer_pool_new (GstXvImageSink * xvimagesink)
+{
+ GstXvImageBufferPool *pool;
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
+
+ pool = g_object_new (GST_TYPE_XVIMAGE_BUFFER_POOL, NULL);
+ pool->sink = gst_object_ref (xvimagesink);
+
+ GST_LOG_OBJECT (pool, "new XvImage buffer pool %p", pool);
+
+ return GST_BUFFER_POOL_CAST (pool);
+}
+
+static void
+gst_xvimage_buffer_pool_class_init (GstXvImageBufferPoolClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstBufferPoolClass *gstbufferpool_class = (GstBufferPoolClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstXvImageBufferPoolPrivate));
+
+ gobject_class->finalize = gst_xvimage_buffer_pool_finalize;
+
+ gstbufferpool_class->get_options = xvimage_buffer_pool_get_options;
+ gstbufferpool_class->set_config = xvimage_buffer_pool_set_config;
+ gstbufferpool_class->alloc_buffer = xvimage_buffer_pool_alloc;
+ gstbufferpool_class->free_buffer = xvimage_buffer_pool_free;
+}
+
+static void
+gst_xvimage_buffer_pool_init (GstXvImageBufferPool * pool)
+{
+ pool->priv = GST_XVIMAGE_BUFFER_POOL_GET_PRIVATE (pool);
+}
+
+static void
+gst_xvimage_buffer_pool_finalize (GObject * object)
+{
+ GstXvImageBufferPool *pool = GST_XVIMAGE_BUFFER_POOL_CAST (object);
+ GstXvImageBufferPoolPrivate *priv = pool->priv;
+
+ GST_LOG_OBJECT (pool, "finalize XvImage buffer pool %p", pool);
+
+ if (priv->caps)
+ gst_caps_unref (priv->caps);
+ gst_object_unref (pool->sink);
+
+ G_OBJECT_CLASS (gst_xvimage_buffer_pool_parent_class)->finalize (object);
+}
+
+/* This function tries to get a format matching with a given caps in the
+ supported list of formats we generated in gst_xvimagesink_get_xv_support */
+gint
+gst_xvimagesink_get_format_from_info (GstXvImageSink * xvimagesink,
+ GstVideoInfo * info)
+{
+ GList *list = NULL;
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), 0);
+
+ list = xvimagesink->xcontext->formats_list;
+
+ while (list) {
+ GstXvImageFormat *format = list->data;
+
+ if (format && format->vformat == GST_VIDEO_INFO_FORMAT (info))
+ return format->format;
+
+ list = g_list_next (list);
+ }
+
+ return -1;
+}
diff --git a/sys/xvimage/xvimagepool.h b/sys/xvimage/xvimagepool.h
new file mode 100644
index 0000000..7136498
--- /dev/null
+++ b/sys/xvimage/xvimagepool.h
@@ -0,0 +1,117 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_XVIMAGEPOOL_H__
+#define __GST_XVIMAGEPOOL_H__
+
+#ifdef HAVE_XSHM
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif /* HAVE_XSHM */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM
+#include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM */
+
+#include <string.h>
+#include <math.h>
+
+
+G_BEGIN_DECLS
+
+typedef struct _GstMetaXvImage GstMetaXvImage;
+
+typedef struct _GstXvImageBufferPool GstXvImageBufferPool;
+typedef struct _GstXvImageBufferPoolClass GstXvImageBufferPoolClass;
+typedef struct _GstXvImageBufferPoolPrivate GstXvImageBufferPoolPrivate;
+
+#include "xvimagesink.h"
+
+const GstMetaInfo * gst_meta_xvimage_get_info (void);
+#define GST_META_INFO_XVIMAGE (gst_meta_xvimage_get_info())
+
+#define gst_buffer_get_meta_xvimage(b) ((GstMetaXvImage*)gst_buffer_get_meta((b),GST_META_INFO_XVIMAGE))
+
+/**
+ * GstMetaXvImage:
+ * @sink: a reference to the our #GstXvImageSink
+ * @xvimage: the XvImage of this buffer
+ * @width: the width in pixels of XvImage @xvimage
+ * @height: the height in pixels of XvImage @xvimage
+ * @im_format: the format of XvImage @xvimage
+ * @size: the size in bytes of XvImage @xvimage
+ *
+ * Subclass of #GstMeta containing additional information about an XvImage.
+ */
+struct _GstMetaXvImage
+{
+ GstMeta meta;
+
+ /* Reference to the xvimagesink we belong to */
+ GstXvImageSink *sink;
+
+ XvImage *xvimage;
+
+#ifdef HAVE_XSHM
+ XShmSegmentInfo SHMInfo;
+#endif /* HAVE_XSHM */
+
+ gint x, y;
+ gint width, height;
+ gint im_format;
+ size_t size;
+};
+
+/* buffer pool functions */
+#define GST_TYPE_XVIMAGE_BUFFER_POOL (gst_xvimage_buffer_pool_get_type())
+#define GST_IS_XVIMAGE_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_XVIMAGE_BUFFER_POOL))
+#define GST_XVIMAGE_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_XVIMAGE_BUFFER_POOL, GstXvImageBufferPool))
+#define GST_XVIMAGE_BUFFER_POOL_CAST(obj) ((GstXvImageBufferPool*)(obj))
+
+struct _GstXvImageBufferPool
+{
+ GstBufferPool bufferpool;
+
+ GstXvImageSink *sink;
+
+ GstXvImageBufferPoolPrivate *priv;
+};
+
+struct _GstXvImageBufferPoolClass
+{
+ GstBufferPoolClass parent_class;
+};
+
+GType gst_xvimage_buffer_pool_get_type (void);
+
+GstBufferPool *gst_xvimage_buffer_pool_new (GstXvImageSink * xvimagesink);
+
+gboolean gst_xvimagesink_check_xshm_calls (GstXvImageSink * xvimagesink,
+ GstXContext * xcontext);
+
+gint gst_xvimagesink_get_format_from_info (GstXvImageSink * xvimagesink,
+ GstVideoInfo * info);
+
+G_END_DECLS
+
+#endif /*__GST_XVIMAGEPOOL_H__*/
diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c
new file mode 100644
index 0000000..a4a5bc5
--- /dev/null
+++ b/sys/xvimage/xvimagesink.c
@@ -0,0 +1,2955 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ * <2009>,<2010> Stefan Kost <stefan.kost@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-xvimagesink
+ *
+ * XvImageSink renders video frames to a drawable (XWindow) on a local display
+ * using the XVideo extension. Rendering to a remote display is theorically
+ * possible but i doubt that the XVideo extension is actually available when
+ * connecting to a remote display. This element can receive a Window ID from the
+ * application through the XOverlay interface and will then render video frames
+ * in this drawable. If no Window ID was provided by the application, the
+ * element will create its own internal window and render into it.
+ *
+ * <refsect2>
+ * <title>Scaling</title>
+ * <para>
+ * The XVideo extension, when it's available, handles hardware accelerated
+ * scaling of video frames. This means that the element will just accept
+ * incoming video frames no matter their geometry and will then put them to the
+ * drawable scaling them on the fly. Using the #GstXvImageSink:force-aspect-ratio
+ * property it is possible to enforce scaling with a constant aspect ratio,
+ * which means drawing black borders around the video frame.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Events</title>
+ * <para>
+ * XvImageSink creates a thread to handle events coming from the drawable. There
+ * are several kind of events that can be grouped in 2 big categories: input
+ * events and window state related events. Input events will be translated to
+ * navigation events and pushed upstream for other elements to react on them.
+ * This includes events such as pointer moves, key press/release, clicks etc...
+ * Other events are used to handle the drawable appearance even when the data
+ * is not flowing (GST_STATE_PAUSED). That means that even when the element is
+ * paused, it will receive expose events from the drawable and draw the latest
+ * frame with correct borders/aspect-ratio.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Pixel aspect ratio</title>
+ * <para>
+ * When changing state to GST_STATE_READY, XvImageSink will open a connection to
+ * the display specified in the #GstXvImageSink:display property or the
+ * default display if nothing specified. Once this connection is open it will
+ * inspect the display configuration including the physical display geometry and
+ * then calculate the pixel aspect ratio. When receiving video frames with a
+ * different pixel aspect ratio, XvImageSink will use hardware scaling to
+ * display the video frames correctly on display's pixel aspect ratio.
+ * Sometimes the calculated pixel aspect ratio can be wrong, it is
+ * then possible to enforce a specific pixel aspect ratio using the
+ * #GstXvImageSink:pixel-aspect-ratio property.
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Examples</title>
+ * |[
+ * gst-launch -v videotestsrc ! xvimagesink
+ * ]| A pipeline to test hardware scaling.
+ * When the test video signal appears you can resize the window and see that
+ * video frames are scaled through hardware (no extra CPU cost).
+ * |[
+ * gst-launch -v videotestsrc ! xvimagesink force-aspect-ratio=true
+ * ]| Same pipeline with #GstXvImageSink:force-aspect-ratio property set to true
+ * You can observe the borders drawn around the scaled image respecting aspect
+ * ratio.
+ * |[
+ * gst-launch -v videotestsrc ! navigationtest ! xvimagesink
+ * ]| 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
+ * |[
+ * gst-launch -v videotestsrc ! video/x-raw, pixel-aspect-ratio=(fraction)4/3 ! xvimagesink
+ * ]| This is faking a 4/3 pixel aspect ratio caps on video frames produced by
+ * videotestsrc, in most cases the pixel aspect ratio of the display will be
+ * 1/1. This means that XvImageSink will have to do the scaling to convert
+ * incoming frames to a size that will match the display pixel aspect ratio
+ * (from 320x240 to 320x180 in this case). Note that you might have to escape
+ * some characters for your shell like '\(fraction\)'.
+ * |[
+ * gst-launch -v videotestsrc ! xvimagesink hue=100 saturation=-100 brightness=100
+ * ]| Demonstrates how to use the colorbalance interface.
+ * </refsect2>
+ */
+
+/* for developers: there are two useful tools : xvinfo and xvattr */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Our interfaces */
+#include <gst/interfaces/navigation.h>
+#include <gst/interfaces/videooverlay.h>
+#include <gst/interfaces/colorbalance.h>
+#include <gst/interfaces/propertyprobe.h>
+/* Helper functions */
+#include <gst/video/gstmetavideo.h>
+
+/* Object header */
+#include "xvimagesink.h"
+
+/* Debugging category */
+#include <gst/gstinfo.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_debug_xvimagesink);
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
+#define GST_CAT_DEFAULT gst_debug_xvimagesink
+
+typedef struct
+{
+ unsigned long flags;
+ unsigned long functions;
+ unsigned long decorations;
+ long input_mode;
+ unsigned long status;
+}
+MotifWmHints, MwmHints;
+
+#define MWM_HINTS_DECORATIONS (1L << 1)
+
+static void gst_xvimagesink_reset (GstXvImageSink * xvimagesink);
+static void gst_xvimagesink_xwindow_update_geometry (GstXvImageSink *
+ xvimagesink);
+static void gst_xvimagesink_expose (GstVideoOverlay * overlay);
+
+/* Default template - initiated with class struct to allow gst-register to work
+ without X running */
+static GstStaticPadTemplate gst_xvimagesink_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("video/x-raw, "
+ "framerate = (fraction) [ 0, MAX ], "
+ "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")
+ );
+
+enum
+{
+ PROP_0,
+ PROP_CONTRAST,
+ PROP_BRIGHTNESS,
+ PROP_HUE,
+ PROP_SATURATION,
+ PROP_DISPLAY,
+ PROP_SYNCHRONOUS,
+ PROP_PIXEL_ASPECT_RATIO,
+ PROP_FORCE_ASPECT_RATIO,
+ PROP_HANDLE_EVENTS,
+ PROP_DEVICE,
+ PROP_DEVICE_NAME,
+ PROP_HANDLE_EXPOSE,
+ PROP_DOUBLE_BUFFER,
+ PROP_AUTOPAINT_COLORKEY,
+ PROP_COLORKEY,
+ PROP_DRAW_BORDERS,
+ PROP_WINDOW_WIDTH,
+ PROP_WINDOW_HEIGHT
+};
+
+/* ============================================================= */
+/* */
+/* Public Methods */
+/* */
+/* ============================================================= */
+
+/* =========================================== */
+/* */
+/* Object typing & Creation */
+/* */
+/* =========================================== */
+static void gst_xvimagesink_navigation_init (GstNavigationInterface * iface);
+static void gst_xvimagesink_video_overlay_init (GstVideoOverlayIface * iface);
+static void gst_xvimagesink_colorbalance_init (GstColorBalanceClass * iface);
+static void
+gst_xvimagesink_property_probe_interface_init (GstPropertyProbeInterface *
+ iface);
+#define gst_xvimagesink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstXvImageSink, gst_xvimagesink, GST_TYPE_VIDEO_SINK,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION,
+ gst_xvimagesink_navigation_init);
+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
+ gst_xvimagesink_video_overlay_init);
+ G_IMPLEMENT_INTERFACE (GST_TYPE_COLOR_BALANCE,
+ gst_xvimagesink_colorbalance_init);
+ G_IMPLEMENT_INTERFACE (GST_TYPE_PROPERTY_PROBE,
+ gst_xvimagesink_property_probe_interface_init));
+
+
+/* ============================================================= */
+/* */
+/* Private Methods */
+/* */
+/* ============================================================= */
+
+
+/* We are called with the x_lock taken */
+static void
+gst_xvimagesink_xwindow_draw_borders (GstXvImageSink * xvimagesink,
+ GstXWindow * xwindow, GstVideoRectangle rect)
+{
+ gint t1, t2;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+ g_return_if_fail (xwindow != NULL);
+
+ XSetForeground (xvimagesink->xcontext->disp, xwindow->gc,
+ xvimagesink->xcontext->black);
+
+ /* Left border */
+ if (rect.x > xvimagesink->render_rect.x) {
+ XFillRectangle (xvimagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ xvimagesink->render_rect.x, xvimagesink->render_rect.y,
+ rect.x - xvimagesink->render_rect.x, xvimagesink->render_rect.h);
+ }
+
+ /* Right border */
+ t1 = rect.x + rect.w;
+ t2 = xvimagesink->render_rect.x + xvimagesink->render_rect.w;
+ if (t1 < t2) {
+ XFillRectangle (xvimagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ t1, xvimagesink->render_rect.y, t2 - t1, xvimagesink->render_rect.h);
+ }
+
+ /* Top border */
+ if (rect.y > xvimagesink->render_rect.y) {
+ XFillRectangle (xvimagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ xvimagesink->render_rect.x, xvimagesink->render_rect.y,
+ xvimagesink->render_rect.w, rect.y - xvimagesink->render_rect.y);
+ }
+
+ /* Bottom border */
+ t1 = rect.y + rect.h;
+ t2 = xvimagesink->render_rect.y + xvimagesink->render_rect.h;
+ if (t1 < t2) {
+ XFillRectangle (xvimagesink->xcontext->disp, xwindow->win, xwindow->gc,
+ xvimagesink->render_rect.x, t1, xvimagesink->render_rect.w, t2 - t1);
+ }
+}
+
+/* This function puts a GstXvImage on a GstXvImageSink's window. Returns FALSE
+ * if no window was available */
+static gboolean
+gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GstBuffer * xvimage)
+{
+ GstMetaXvImage *meta;
+ GstMetaVideoCrop *crop;
+ GstVideoRectangle result;
+ gboolean draw_border = FALSE;
+ GstVideoRectangle src, dst;
+
+ /* We take the flow_lock. If expose is in there we don't want to run
+ concurrently from the data flow thread */
+ g_mutex_lock (xvimagesink->flow_lock);
+
+ if (G_UNLIKELY (xvimagesink->xwindow == NULL)) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return FALSE;
+ }
+
+ /* Draw borders when displaying the first frame. After this
+ draw borders only on expose event or after a size change. */
+ if (!xvimagesink->cur_image || xvimagesink->redraw_border) {
+ draw_border = TRUE;
+ }
+
+ /* Store a reference to the last image we put, lose the previous one */
+ if (xvimage && xvimagesink->cur_image != xvimage) {
+ if (xvimagesink->cur_image) {
+ GST_LOG_OBJECT (xvimagesink, "unreffing %p", xvimagesink->cur_image);
+ gst_buffer_unref (xvimagesink->cur_image);
+ }
+ GST_LOG_OBJECT (xvimagesink, "reffing %p as our current image", xvimage);
+ xvimagesink->cur_image = gst_buffer_ref (xvimage);
+ }
+
+ /* Expose sends a NULL image, we take the latest frame */
+ if (!xvimage) {
+ if (xvimagesink->cur_image) {
+ draw_border = TRUE;
+ xvimage = xvimagesink->cur_image;
+ } else {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return TRUE;
+ }
+ }
+
+ meta = gst_buffer_get_meta_xvimage (xvimage);
+
+ crop = gst_buffer_get_meta_video_crop (xvimage);
+
+ if (crop) {
+ src.x = crop->x + meta->x;
+ src.y = crop->y + meta->y;
+ src.w = crop->width;
+ src.h = crop->height;
+ } else {
+ src.x = meta->x;
+ src.y = meta->y;
+ src.w = meta->width;
+ src.h = meta->height;
+ }
+
+ if (xvimagesink->keep_aspect) {
+ dst.w = xvimagesink->render_rect.w;
+ dst.h = xvimagesink->render_rect.h;
+
+ gst_video_sink_center_rect (src, dst, &result, TRUE);
+ result.x += xvimagesink->render_rect.x;
+ result.y += xvimagesink->render_rect.y;
+ } else {
+ memcpy (&result, &xvimagesink->render_rect, sizeof (GstVideoRectangle));
+ }
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ if (draw_border && xvimagesink->draw_borders) {
+ gst_xvimagesink_xwindow_draw_borders (xvimagesink, xvimagesink->xwindow,
+ result);
+ xvimagesink->redraw_border = FALSE;
+ }
+#ifdef HAVE_XSHM
+ if (xvimagesink->xcontext->use_xshm) {
+ GST_LOG_OBJECT (xvimagesink,
+ "XvShmPutImage with image %dx%d and window %dx%d, from xvimage %"
+ GST_PTR_FORMAT, meta->width, meta->height,
+ xvimagesink->render_rect.w, xvimagesink->render_rect.h, xvimage);
+
+ XvShmPutImage (xvimagesink->xcontext->disp,
+ xvimagesink->xcontext->xv_port_id,
+ xvimagesink->xwindow->win,
+ xvimagesink->xwindow->gc, meta->xvimage,
+ src.x, src.y, src.w, src.h,
+ result.x, result.y, result.w, result.h, FALSE);
+ } else
+#endif /* HAVE_XSHM */
+ {
+ XvPutImage (xvimagesink->xcontext->disp,
+ xvimagesink->xcontext->xv_port_id,
+ xvimagesink->xwindow->win,
+ xvimagesink->xwindow->gc, meta->xvimage,
+ src.x, src.y, src.w, src.h, result.x, result.y, result.w, result.h);
+ }
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ return TRUE;
+}
+
+static gboolean
+gst_xvimagesink_xwindow_decorate (GstXvImageSink * xvimagesink,
+ GstXWindow * window)
+{
+ Atom hints_atom = None;
+ MotifWmHints *hints;
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), FALSE);
+ g_return_val_if_fail (window != NULL, FALSE);
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ hints_atom = XInternAtom (xvimagesink->xcontext->disp, "_MOTIF_WM_HINTS",
+ True);
+ if (hints_atom == None) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ return FALSE;
+ }
+
+ hints = g_malloc0 (sizeof (MotifWmHints));
+
+ hints->flags |= MWM_HINTS_DECORATIONS;
+ hints->decorations = 1 << 0;
+
+ XChangeProperty (xvimagesink->xcontext->disp, window->win,
+ hints_atom, hints_atom, 32, PropModeReplace,
+ (guchar *) hints, sizeof (MotifWmHints) / sizeof (long));
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_free (hints);
+
+ return TRUE;
+}
+
+static void
+gst_xvimagesink_xwindow_set_title (GstXvImageSink * xvimagesink,
+ GstXWindow * xwindow, const gchar * media_title)
+{
+ if (media_title) {
+ g_free (xvimagesink->media_title);
+ xvimagesink->media_title = g_strdup (media_title);
+ }
+ if (xwindow) {
+ /* we have a window */
+ if (xwindow->internal) {
+ XTextProperty xproperty;
+ const gchar *app_name;
+ const gchar *title = NULL;
+ gchar *title_mem = NULL;
+
+ /* set application name as a title */
+ app_name = g_get_application_name ();
+
+ if (app_name && xvimagesink->media_title) {
+ title = title_mem = g_strconcat (xvimagesink->media_title, " : ",
+ app_name, NULL);
+ } else if (app_name) {
+ title = app_name;
+ } else if (xvimagesink->media_title) {
+ title = xvimagesink->media_title;
+ }
+
+ if (title) {
+ if ((XStringListToTextProperty (((char **) &title), 1,
+ &xproperty)) != 0) {
+ XSetWMName (xvimagesink->xcontext->disp, xwindow->win, &xproperty);
+ XFree (xproperty.value);
+ }
+
+ g_free (title_mem);
+ }
+ }
+ }
+}
+
+/* This function handles a GstXWindow creation
+ * The width and height are the actual pixel size on the display */
+static GstXWindow *
+gst_xvimagesink_xwindow_new (GstXvImageSink * xvimagesink,
+ gint width, gint height)
+{
+ GstXWindow *xwindow = NULL;
+ XGCValues values;
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
+
+ xwindow = g_new0 (GstXWindow, 1);
+
+ xvimagesink->render_rect.x = xvimagesink->render_rect.y = 0;
+ xvimagesink->render_rect.w = width;
+ xvimagesink->render_rect.h = height;
+
+ xwindow->width = width;
+ xwindow->height = height;
+ xwindow->internal = TRUE;
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ xwindow->win = XCreateSimpleWindow (xvimagesink->xcontext->disp,
+ xvimagesink->xcontext->root,
+ 0, 0, width, height, 0, 0, xvimagesink->xcontext->black);
+
+ /* We have to do that to prevent X from redrawing the background on
+ * ConfigureNotify. This takes away flickering of video when resizing. */
+ XSetWindowBackgroundPixmap (xvimagesink->xcontext->disp, xwindow->win, None);
+
+ /* set application name as a title */
+ gst_xvimagesink_xwindow_set_title (xvimagesink, xwindow, NULL);
+
+ if (xvimagesink->handle_events) {
+ Atom wm_delete;
+
+ XSelectInput (xvimagesink->xcontext->disp, xwindow->win, ExposureMask |
+ StructureNotifyMask | PointerMotionMask | KeyPressMask |
+ KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);
+
+ /* Tell the window manager we'd like delete client messages instead of
+ * being killed */
+ wm_delete = XInternAtom (xvimagesink->xcontext->disp,
+ "WM_DELETE_WINDOW", True);
+ if (wm_delete != None) {
+ (void) XSetWMProtocols (xvimagesink->xcontext->disp, xwindow->win,
+ &wm_delete, 1);
+ }
+ }
+
+ xwindow->gc = XCreateGC (xvimagesink->xcontext->disp,
+ xwindow->win, 0, &values);
+
+ XMapRaised (xvimagesink->xcontext->disp, xwindow->win);
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ gst_xvimagesink_xwindow_decorate (xvimagesink, xwindow);
+
+ gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (xvimagesink),
+ xwindow->win);
+
+ return xwindow;
+}
+
+/* This function destroys a GstXWindow */
+static void
+gst_xvimagesink_xwindow_destroy (GstXvImageSink * xvimagesink,
+ GstXWindow * xwindow)
+{
+ g_return_if_fail (xwindow != NULL);
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ /* If we did not create that window we just free the GC and let it live */
+ if (xwindow->internal)
+ XDestroyWindow (xvimagesink->xcontext->disp, xwindow->win);
+ else
+ XSelectInput (xvimagesink->xcontext->disp, xwindow->win, 0);
+
+ XFreeGC (xvimagesink->xcontext->disp, xwindow->gc);
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_free (xwindow);
+}
+
+static void
+gst_xvimagesink_xwindow_update_geometry (GstXvImageSink * xvimagesink)
+{
+ XWindowAttributes attr;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ /* Update the window geometry */
+ g_mutex_lock (xvimagesink->x_lock);
+ if (G_UNLIKELY (xvimagesink->xwindow == NULL)) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ return;
+ }
+
+ XGetWindowAttributes (xvimagesink->xcontext->disp,
+ xvimagesink->xwindow->win, &attr);
+
+ xvimagesink->xwindow->width = attr.width;
+ xvimagesink->xwindow->height = attr.height;
+
+ if (!xvimagesink->have_render_rect) {
+ xvimagesink->render_rect.x = xvimagesink->render_rect.y = 0;
+ xvimagesink->render_rect.w = attr.width;
+ xvimagesink->render_rect.h = attr.height;
+ }
+
+ g_mutex_unlock (xvimagesink->x_lock);
+}
+
+static void
+gst_xvimagesink_xwindow_clear (GstXvImageSink * xvimagesink,
+ GstXWindow * xwindow)
+{
+ g_return_if_fail (xwindow != NULL);
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ XvStopVideo (xvimagesink->xcontext->disp, xvimagesink->xcontext->xv_port_id,
+ xwindow->win);
+
+ XSync (xvimagesink->xcontext->disp, FALSE);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+}
+
+/* This function commits our internal colorbalance settings to our grabbed Xv
+ port. If the xcontext is not initialized yet it simply returns */
+static void
+gst_xvimagesink_update_colorbalance (GstXvImageSink * xvimagesink)
+{
+ GList *channels = NULL;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ /* If we haven't initialized the X context we can't update anything */
+ if (xvimagesink->xcontext == NULL)
+ return;
+
+ /* Don't set the attributes if they haven't been changed, to avoid
+ * rounding errors changing the values */
+ if (!xvimagesink->cb_changed)
+ return;
+
+ /* For each channel of the colorbalance we calculate the correct value
+ doing range conversion and then set the Xv port attribute to match our
+ values. */
+ channels = xvimagesink->xcontext->channels_list;
+
+ while (channels) {
+ if (channels->data && GST_IS_COLOR_BALANCE_CHANNEL (channels->data)) {
+ GstColorBalanceChannel *channel = NULL;
+ Atom prop_atom;
+ gint value = 0;
+ gdouble convert_coef;
+
+ channel = GST_COLOR_BALANCE_CHANNEL (channels->data);
+ g_object_ref (channel);
+
+ /* Our range conversion coef */
+ convert_coef = (channel->max_value - channel->min_value) / 2000.0;
+
+ if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) {
+ value = xvimagesink->hue;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) {
+ value = xvimagesink->saturation;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) {
+ value = xvimagesink->contrast;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) {
+ value = xvimagesink->brightness;
+ } else {
+ g_warning ("got an unknown channel %s", channel->label);
+ g_object_unref (channel);
+ return;
+ }
+
+ /* Committing to Xv port */
+ g_mutex_lock (xvimagesink->x_lock);
+ prop_atom =
+ XInternAtom (xvimagesink->xcontext->disp, channel->label, True);
+ if (prop_atom != None) {
+ int xv_value;
+ xv_value =
+ floor (0.5 + (value + 1000) * convert_coef + channel->min_value);
+ XvSetPortAttribute (xvimagesink->xcontext->disp,
+ xvimagesink->xcontext->xv_port_id, prop_atom, xv_value);
+ }
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_object_unref (channel);
+ }
+ channels = g_list_next (channels);
+ }
+}
+
+/* This function handles XEvents that might be in the queue. It generates
+ GstEvent that will be sent upstream in the pipeline to handle interactivity
+ and navigation. It will also listen for configure events on the window to
+ trigger caps renegotiation so on the fly software scaling can work. */
+static void
+gst_xvimagesink_handle_xevents (GstXvImageSink * xvimagesink)
+{
+ XEvent e;
+ guint pointer_x = 0, pointer_y = 0;
+ gboolean pointer_moved = FALSE;
+ gboolean exposed = FALSE, configured = FALSE;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ /* Handle Interaction, produces navigation events */
+
+ /* We get all pointer motion events, only the last position is
+ interesting. */
+ g_mutex_lock (xvimagesink->flow_lock);
+ g_mutex_lock (xvimagesink->x_lock);
+ while (XCheckWindowEvent (xvimagesink->xcontext->disp,
+ xvimagesink->xwindow->win, PointerMotionMask, &e)) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ switch (e.type) {
+ case MotionNotify:
+ pointer_x = e.xmotion.x;
+ pointer_y = e.xmotion.y;
+ pointer_moved = TRUE;
+ break;
+ default:
+ break;
+ }
+ g_mutex_lock (xvimagesink->flow_lock);
+ g_mutex_lock (xvimagesink->x_lock);
+ }
+
+ if (pointer_moved) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ GST_DEBUG ("xvimagesink pointer moved over window at %d,%d",
+ pointer_x, pointer_y);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink),
+ "mouse-move", 0, e.xbutton.x, e.xbutton.y);
+
+ g_mutex_lock (xvimagesink->flow_lock);
+ g_mutex_lock (xvimagesink->x_lock);
+ }
+
+ /* We get all events on our window to throw them upstream */
+ while (XCheckWindowEvent (xvimagesink->xcontext->disp,
+ xvimagesink->xwindow->win,
+ KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask,
+ &e)) {
+ KeySym keysym;
+
+ /* We lock only for the X function call */
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ switch (e.type) {
+ case ButtonPress:
+ /* Mouse button pressed over our window. We send upstream
+ events for interactivity/navigation */
+ GST_DEBUG ("xvimagesink button %d pressed over window at %d,%d",
+ e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink),
+ "mouse-button-press", e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ break;
+ case ButtonRelease:
+ /* Mouse button released over our window. We send upstream
+ events for interactivity/navigation */
+ GST_DEBUG ("xvimagesink button %d released over window at %d,%d",
+ e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink),
+ "mouse-button-release", e.xbutton.button, e.xbutton.x, e.xbutton.y);
+ break;
+ case KeyPress:
+ case KeyRelease:
+ /* Key pressed/released over our window. We send upstream
+ events for interactivity/navigation */
+ GST_DEBUG ("xvimagesink key %d pressed over window at %d,%d",
+ e.xkey.keycode, e.xkey.x, e.xkey.y);
+ g_mutex_lock (xvimagesink->x_lock);
+ keysym = XKeycodeToKeysym (xvimagesink->xcontext->disp,
+ e.xkey.keycode, 0);
+ g_mutex_unlock (xvimagesink->x_lock);
+ if (keysym != NoSymbol) {
+ char *key_str = NULL;
+
+ g_mutex_lock (xvimagesink->x_lock);
+ key_str = XKeysymToString (keysym);
+ g_mutex_unlock (xvimagesink->x_lock);
+ gst_navigation_send_key_event (GST_NAVIGATION (xvimagesink),
+ e.type == KeyPress ? "key-press" : "key-release", key_str);
+ } else {
+ gst_navigation_send_key_event (GST_NAVIGATION (xvimagesink),
+ e.type == KeyPress ? "key-press" : "key-release", "unknown");
+ }
+ break;
+ default:
+ GST_DEBUG_OBJECT (xvimagesink, "xvimagesink unhandled X event (%d)",
+ e.type);
+ }
+ g_mutex_lock (xvimagesink->flow_lock);
+ g_mutex_lock (xvimagesink->x_lock);
+ }
+
+ /* Handle Expose */
+ while (XCheckWindowEvent (xvimagesink->xcontext->disp,
+ xvimagesink->xwindow->win, ExposureMask | StructureNotifyMask, &e)) {
+ switch (e.type) {
+ case Expose:
+ exposed = TRUE;
+ break;
+ case ConfigureNotify:
+ g_mutex_unlock (xvimagesink->x_lock);
+ gst_xvimagesink_xwindow_update_geometry (xvimagesink);
+ g_mutex_lock (xvimagesink->x_lock);
+ configured = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (xvimagesink->handle_expose && (exposed || configured)) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ gst_xvimagesink_expose (GST_VIDEO_OVERLAY (xvimagesink));
+
+ g_mutex_lock (xvimagesink->flow_lock);
+ g_mutex_lock (xvimagesink->x_lock);
+ }
+
+ /* Handle Display events */
+ while (XPending (xvimagesink->xcontext->disp)) {
+ XNextEvent (xvimagesink->xcontext->disp, &e);
+
+ switch (e.type) {
+ case ClientMessage:{
+ Atom wm_delete;
+
+ wm_delete = XInternAtom (xvimagesink->xcontext->disp,
+ "WM_DELETE_WINDOW", True);
+ if (wm_delete != None && wm_delete == (Atom) e.xclient.data.l[0]) {
+ /* Handle window deletion by posting an error on the bus */
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, NOT_FOUND,
+ ("Output window was closed"), (NULL));
+
+ g_mutex_unlock (xvimagesink->x_lock);
+ gst_xvimagesink_xwindow_destroy (xvimagesink, xvimagesink->xwindow);
+ xvimagesink->xwindow = NULL;
+ g_mutex_lock (xvimagesink->x_lock);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_mutex_unlock (xvimagesink->flow_lock);
+}
+
+static void
+gst_lookup_xv_port_from_adaptor (GstXContext * xcontext,
+ XvAdaptorInfo * adaptors, int adaptor_no)
+{
+ gint j;
+ gint res;
+
+ /* Do we support XvImageMask ? */
+ if (!(adaptors[adaptor_no].type & XvImageMask)) {
+ GST_DEBUG ("XV Adaptor %s has no support for XvImageMask",
+ adaptors[adaptor_no].name);
+ return;
+ }
+
+ /* We found such an adaptor, looking for an available port */
+ for (j = 0; j < adaptors[adaptor_no].num_ports && !xcontext->xv_port_id; j++) {
+ /* We try to grab the port */
+ res = XvGrabPort (xcontext->disp, adaptors[adaptor_no].base_id + j, 0);
+ if (Success == res) {
+ xcontext->xv_port_id = adaptors[adaptor_no].base_id + j;
+ GST_DEBUG ("XV Adaptor %s with %ld ports", adaptors[adaptor_no].name,
+ adaptors[adaptor_no].num_ports);
+ } else {
+ GST_DEBUG ("GrabPort %d for XV Adaptor %s failed: %d", j,
+ adaptors[adaptor_no].name, res);
+ }
+ }
+}
+
+/* This function generates a caps with all supported format by the first
+ Xv grabable port we find. We store each one of the supported formats in a
+ format list and append the format to a newly created caps that we return
+ If this function does not return NULL because of an error, it also grabs
+ the port via XvGrabPort */
+static GstCaps *
+gst_xvimagesink_get_xv_support (GstXvImageSink * xvimagesink,
+ GstXContext * xcontext)
+{
+ gint i;
+ XvAdaptorInfo *adaptors;
+ gint nb_formats;
+ XvImageFormatValues *formats = NULL;
+ guint nb_encodings;
+ XvEncodingInfo *encodings = NULL;
+ gulong max_w = G_MAXINT, max_h = G_MAXINT;
+ GstCaps *caps = NULL;
+ GstCaps *rgb_caps = NULL;
+
+ g_return_val_if_fail (xcontext != NULL, NULL);
+
+ /* First let's check that XVideo extension is available */
+ if (!XQueryExtension (xcontext->disp, "XVideo", &i, &i, &i)) {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
+ ("Could not initialise Xv output"),
+ ("XVideo extension is not available"));
+ return NULL;
+ }
+
+ /* Then we get adaptors list */
+ if (Success != XvQueryAdaptors (xcontext->disp, xcontext->root,
+ &xcontext->nb_adaptors, &adaptors)) {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
+ ("Could not initialise Xv output"),
+ ("Failed getting XV adaptors list"));
+ return NULL;
+ }
+
+ xcontext->xv_port_id = 0;
+
+ GST_DEBUG ("Found %u XV adaptor(s)", xcontext->nb_adaptors);
+
+ xcontext->adaptors =
+ (gchar **) g_malloc0 (xcontext->nb_adaptors * sizeof (gchar *));
+
+ /* Now fill up our adaptor name array */
+ for (i = 0; i < xcontext->nb_adaptors; i++) {
+ xcontext->adaptors[i] = g_strdup (adaptors[i].name);
+ }
+
+ if (xvimagesink->adaptor_no >= 0 &&
+ xvimagesink->adaptor_no < xcontext->nb_adaptors) {
+ /* Find xv port from user defined adaptor */
+ gst_lookup_xv_port_from_adaptor (xcontext, adaptors,
+ xvimagesink->adaptor_no);
+ }
+
+ if (!xcontext->xv_port_id) {
+ /* Now search for an adaptor that supports XvImageMask */
+ for (i = 0; i < xcontext->nb_adaptors && !xcontext->xv_port_id; i++) {
+ gst_lookup_xv_port_from_adaptor (xcontext, adaptors, i);
+ xvimagesink->adaptor_no = i;
+ }
+ }
+
+ XvFreeAdaptorInfo (adaptors);
+
+ if (!xcontext->xv_port_id) {
+ xvimagesink->adaptor_no = -1;
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, BUSY,
+ ("Could not initialise Xv output"), ("No port available"));
+ return NULL;
+ }
+
+ /* Set XV_AUTOPAINT_COLORKEY and XV_DOUBLE_BUFFER and XV_COLORKEY */
+ {
+ int count, todo = 3;
+ XvAttribute *const attr = XvQueryPortAttributes (xcontext->disp,
+ xcontext->xv_port_id, &count);
+ static const char autopaint[] = "XV_AUTOPAINT_COLORKEY";
+ static const char dbl_buffer[] = "XV_DOUBLE_BUFFER";
+ static const char colorkey[] = "XV_COLORKEY";
+
+ GST_DEBUG_OBJECT (xvimagesink, "Checking %d Xv port attributes", count);
+
+ xvimagesink->have_autopaint_colorkey = FALSE;
+ xvimagesink->have_double_buffer = FALSE;
+ xvimagesink->have_colorkey = FALSE;
+
+ for (i = 0; ((i < count) && todo); i++)
+ if (!strcmp (attr[i].name, autopaint)) {
+ const Atom atom = XInternAtom (xcontext->disp, autopaint, False);
+
+ /* turn on autopaint colorkey */
+ XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom,
+ (xvimagesink->autopaint_colorkey ? 1 : 0));
+ todo--;
+ xvimagesink->have_autopaint_colorkey = TRUE;
+ } else if (!strcmp (attr[i].name, dbl_buffer)) {
+ const Atom atom = XInternAtom (xcontext->disp, dbl_buffer, False);
+
+ XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom,
+ (xvimagesink->double_buffer ? 1 : 0));
+ todo--;
+ xvimagesink->have_double_buffer = TRUE;
+ } else if (!strcmp (attr[i].name, colorkey)) {
+ /* Set the colorkey, default is something that is dark but hopefully
+ * won't randomly appear on the screen elsewhere (ie not black or greys)
+ * can be overridden by setting "colorkey" property
+ */
+ const Atom atom = XInternAtom (xcontext->disp, colorkey, False);
+ guint32 ckey = 0;
+ gboolean set_attr = TRUE;
+ guint cr, cg, cb;
+
+ /* set a colorkey in the right format RGB565/RGB888
+ * We only handle these 2 cases, because they're the only types of
+ * devices we've encountered. If we don't recognise it, leave it alone
+ */
+ cr = (xvimagesink->colorkey >> 16);
+ cg = (xvimagesink->colorkey >> 8) & 0xFF;
+ cb = (xvimagesink->colorkey) & 0xFF;
+ switch (xcontext->depth) {
+ case 16: /* RGB 565 */
+ cr >>= 3;
+ cg >>= 2;
+ cb >>= 3;
+ ckey = (cr << 11) | (cg << 5) | cb;
+ break;
+ case 24:
+ case 32: /* RGB 888 / ARGB 8888 */
+ ckey = (cr << 16) | (cg << 8) | cb;
+ break;
+ default:
+ GST_DEBUG_OBJECT (xvimagesink,
+ "Unknown bit depth %d for Xv Colorkey - not adjusting",
+ xcontext->depth);
+ set_attr = FALSE;
+ break;
+ }
+
+ if (set_attr) {
+ ckey = CLAMP (ckey, (guint32) attr[i].min_value,
+ (guint32) attr[i].max_value);
+ GST_LOG_OBJECT (xvimagesink,
+ "Setting color key for display depth %d to 0x%x",
+ xcontext->depth, ckey);
+
+ XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom,
+ (gint) ckey);
+ }
+ todo--;
+ xvimagesink->have_colorkey = TRUE;
+ }
+
+ XFree (attr);
+ }
+
+ /* Get the list of encodings supported by the adapter and look for the
+ * XV_IMAGE encoding so we can determine the maximum width and height
+ * supported */
+ XvQueryEncodings (xcontext->disp, xcontext->xv_port_id, &nb_encodings,
+ &encodings);
+
+ for (i = 0; i < nb_encodings; i++) {
+ GST_LOG_OBJECT (xvimagesink,
+ "Encoding %d, name %s, max wxh %lux%lu rate %d/%d",
+ i, encodings[i].name, encodings[i].width, encodings[i].height,
+ encodings[i].rate.numerator, encodings[i].rate.denominator);
+ if (strcmp (encodings[i].name, "XV_IMAGE") == 0) {
+ max_w = encodings[i].width;
+ max_h = encodings[i].height;
+ }
+ }
+
+ XvFreeEncodingInfo (encodings);
+
+ /* We get all image formats supported by our port */
+ formats = XvListImageFormats (xcontext->disp,
+ xcontext->xv_port_id, &nb_formats);
+ caps = gst_caps_new_empty ();
+ for (i = 0; i < nb_formats; i++) {
+ GstCaps *format_caps = NULL;
+ gboolean is_rgb_format = FALSE;
+ GstVideoFormat vformat;
+
+ /* We set the image format of the xcontext to an existing one. This
+ is just some valid image format for making our xshm calls check before
+ caps negotiation really happens. */
+ xcontext->im_format = formats[i].id;
+
+ switch (formats[i].type) {
+ case XvRGB:
+ {
+ XvImageFormatValues *fmt = &(formats[i]);
+ gint endianness;
+
+ endianness =
+ (fmt->byte_order == LSBFirst ? G_LITTLE_ENDIAN : G_BIG_ENDIAN);
+
+ vformat = gst_video_format_from_masks (fmt->depth, fmt->bits_per_pixel,
+ endianness, fmt->red_mask, fmt->green_mask, fmt->blue_mask, 0);
+ if (vformat == GST_VIDEO_FORMAT_UNKNOWN)
+ break;
+
+ format_caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, gst_video_format_to_string (vformat),
+ "width", GST_TYPE_INT_RANGE, 1, max_w,
+ "height", GST_TYPE_INT_RANGE, 1, max_h,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+
+ is_rgb_format = TRUE;
+ break;
+ }
+ case XvYUV:
+ {
+ vformat = gst_video_format_from_fourcc (formats[i].id);
+ if (vformat == GST_VIDEO_FORMAT_UNKNOWN)
+ break;
+
+ format_caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, gst_video_format_to_string (vformat),
+ "width", GST_TYPE_INT_RANGE, 1, max_w,
+ "height", GST_TYPE_INT_RANGE, 1, max_h,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ break;
+ }
+ default:
+ vformat = GST_VIDEO_FORMAT_UNKNOWN;
+ g_assert_not_reached ();
+ break;
+ }
+
+ if (format_caps) {
+ GstXvImageFormat *format = NULL;
+
+ format = g_new0 (GstXvImageFormat, 1);
+ if (format) {
+ format->format = formats[i].id;
+ format->vformat = vformat;
+ format->caps = gst_caps_copy (format_caps);
+ xcontext->formats_list = g_list_append (xcontext->formats_list, format);
+ }
+
+ if (is_rgb_format) {
+ if (rgb_caps == NULL)
+ rgb_caps = format_caps;
+ else
+ gst_caps_append (rgb_caps, format_caps);
+ } else
+ gst_caps_append (caps, format_caps);
+ }
+ }
+
+ /* Collected all caps into either the caps or rgb_caps structures.
+ * Append rgb_caps on the end of YUV, so that YUV is always preferred */
+ if (rgb_caps)
+ gst_caps_append (caps, rgb_caps);
+
+ if (formats)
+ XFree (formats);
+
+ GST_DEBUG ("Generated the following caps: %" GST_PTR_FORMAT, caps);
+
+ if (gst_caps_is_empty (caps)) {
+ gst_caps_unref (caps);
+ XvUngrabPort (xcontext->disp, xcontext->xv_port_id, 0);
+ GST_ELEMENT_ERROR (xvimagesink, STREAM, WRONG_TYPE, (NULL),
+ ("No supported format found"));
+ return NULL;
+ }
+
+ return caps;
+}
+
+static gpointer
+gst_xvimagesink_event_thread (GstXvImageSink * xvimagesink)
+{
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
+
+ GST_OBJECT_LOCK (xvimagesink);
+ while (xvimagesink->running) {
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+ if (xvimagesink->xwindow) {
+ gst_xvimagesink_handle_xevents (xvimagesink);
+ }
+ /* FIXME: do we want to align this with the framerate or anything else? */
+ g_usleep (G_USEC_PER_SEC / 20);
+
+ GST_OBJECT_LOCK (xvimagesink);
+ }
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+ return NULL;
+}
+
+static void
+gst_xvimagesink_manage_event_thread (GstXvImageSink * xvimagesink)
+{
+ GThread *thread = NULL;
+
+ /* don't start the thread too early */
+ if (xvimagesink->xcontext == NULL) {
+ return;
+ }
+
+ GST_OBJECT_LOCK (xvimagesink);
+ if (xvimagesink->handle_expose || xvimagesink->handle_events) {
+ if (!xvimagesink->event_thread) {
+ /* Setup our event listening thread */
+ GST_DEBUG_OBJECT (xvimagesink, "run xevent thread, expose %d, events %d",
+ xvimagesink->handle_expose, xvimagesink->handle_events);
+ xvimagesink->running = TRUE;
+ xvimagesink->event_thread = g_thread_create (
+ (GThreadFunc) gst_xvimagesink_event_thread, xvimagesink, TRUE, NULL);
+ }
+ } else {
+ if (xvimagesink->event_thread) {
+ GST_DEBUG_OBJECT (xvimagesink, "stop xevent thread, expose %d, events %d",
+ xvimagesink->handle_expose, xvimagesink->handle_events);
+ xvimagesink->running = FALSE;
+ /* grab thread and mark it as NULL */
+ thread = xvimagesink->event_thread;
+ xvimagesink->event_thread = NULL;
+ }
+ }
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+ /* Wait for our event thread to finish */
+ if (thread)
+ g_thread_join (thread);
+
+}
+
+
+/* This function calculates the pixel aspect ratio based on the properties
+ * in the xcontext structure and stores it there. */
+static void
+gst_xvimagesink_calculate_pixel_aspect_ratio (GstXContext * xcontext)
+{
+ static const 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 */
+ {64, 45}, /* 1280x1024 on 16:9 display */
+ {5, 3}, /* 1280x1024 on 4:3 display */
+ {4, 3} /* 800x600 on 16:9 display */
+ };
+ 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]);
+
+ 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",
+ gst_value_get_fraction_numerator (xcontext->par),
+ gst_value_get_fraction_denominator (xcontext->par));
+}
+
+/* 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 */
+static GstXContext *
+gst_xvimagesink_xcontext_get (GstXvImageSink * xvimagesink)
+{
+ GstXContext *xcontext = NULL;
+ XPixmapFormatValues *px_formats = NULL;
+ gint nb_formats = 0, i, j, N_attr;
+ XvAttribute *xv_attr;
+ Atom prop_atom;
+ const char *channels[4] = { "XV_HUE", "XV_SATURATION",
+ "XV_BRIGHTNESS", "XV_CONTRAST"
+ };
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
+
+ xcontext = g_new0 (GstXContext, 1);
+ xcontext->im_format = 0;
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ xcontext->disp = XOpenDisplay (xvimagesink->display_name);
+
+ if (!xcontext->disp) {
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_free (xcontext);
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Could not initialise Xv output"), ("Could not open display"));
+ 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);
+
+ GST_DEBUG_OBJECT (xvimagesink, "X reports %dx%d pixels and %d mm x %d mm",
+ xcontext->width, xcontext->height, xcontext->widthmm, xcontext->heightmm);
+
+ gst_xvimagesink_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_mutex_unlock (xvimagesink->x_lock);
+ g_free (xcontext->par);
+ g_free (xcontext);
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
+ ("Could not initialise Xv output"), ("Could not get pixel formats"));
+ 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;
+
+ /* 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->visual->red_mask = GUINT32_TO_BE (xcontext->visual->red_mask);
+ xcontext->visual->green_mask = GUINT32_TO_BE (xcontext->visual->green_mask);
+ xcontext->visual->blue_mask = GUINT32_TO_BE (xcontext->visual->blue_mask);
+ if (xcontext->bpp == 24) {
+ xcontext->visual->red_mask >>= 8;
+ xcontext->visual->green_mask >>= 8;
+ xcontext->visual->blue_mask >>= 8;
+ }
+ }
+
+ xcontext->caps = gst_xvimagesink_get_xv_support (xvimagesink, xcontext);
+
+ /* Search for XShm extension support */
+#ifdef HAVE_XSHM
+ if (XShmQueryExtension (xcontext->disp) &&
+ gst_xvimagesink_check_xshm_calls (xvimagesink, xcontext)) {
+ xcontext->use_xshm = TRUE;
+ GST_DEBUG ("xvimagesink is using XShm extension");
+ } else
+#endif /* HAVE_XSHM */
+ {
+ xcontext->use_xshm = FALSE;
+ GST_DEBUG ("xvimagesink is not using XShm extension");
+ }
+
+ if (!xcontext->caps) {
+ XCloseDisplay (xcontext->disp);
+ g_mutex_unlock (xvimagesink->x_lock);
+ g_free (xcontext->par);
+ g_free (xcontext);
+ /* GST_ELEMENT_ERROR is thrown by gst_xvimagesink_get_xv_support */
+ return NULL;
+ }
+
+ xv_attr = XvQueryPortAttributes (xcontext->disp,
+ xcontext->xv_port_id, &N_attr);
+
+
+ /* Generate the channels list */
+ for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) {
+ XvAttribute *matching_attr = NULL;
+
+ /* Retrieve the property atom if it exists. If it doesn't exist,
+ * the attribute itself must not either, so we can skip */
+ prop_atom = XInternAtom (xcontext->disp, channels[i], True);
+ if (prop_atom == None)
+ continue;
+
+ if (xv_attr != NULL) {
+ for (j = 0; j < N_attr && matching_attr == NULL; ++j)
+ if (!g_ascii_strcasecmp (channels[i], xv_attr[j].name))
+ matching_attr = xv_attr + j;
+ }
+
+ if (matching_attr) {
+ GstColorBalanceChannel *channel;
+
+ channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL);
+ channel->label = g_strdup (channels[i]);
+ channel->min_value = matching_attr ? matching_attr->min_value : -1000;
+ channel->max_value = matching_attr ? matching_attr->max_value : 1000;
+
+ xcontext->channels_list = g_list_append (xcontext->channels_list,
+ channel);
+
+ /* If the colorbalance settings have not been touched we get Xv values
+ as defaults and update our internal variables */
+ if (!xvimagesink->cb_changed) {
+ gint val;
+
+ XvGetPortAttribute (xcontext->disp, xcontext->xv_port_id,
+ prop_atom, &val);
+ /* Normalize val to [-1000, 1000] */
+ val = floor (0.5 + -1000 + 2000 * (val - channel->min_value) /
+ (double) (channel->max_value - channel->min_value));
+
+ if (!g_ascii_strcasecmp (channels[i], "XV_HUE"))
+ xvimagesink->hue = val;
+ else if (!g_ascii_strcasecmp (channels[i], "XV_SATURATION"))
+ xvimagesink->saturation = val;
+ else if (!g_ascii_strcasecmp (channels[i], "XV_BRIGHTNESS"))
+ xvimagesink->brightness = val;
+ else if (!g_ascii_strcasecmp (channels[i], "XV_CONTRAST"))
+ xvimagesink->contrast = val;
+ }
+ }
+ }
+
+ if (xv_attr)
+ XFree (xv_attr);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ return xcontext;
+}
+
+/* This function cleans the X context. Closing the Display, releasing the XV
+ port and unrefing the caps for supported formats. */
+static void
+gst_xvimagesink_xcontext_clear (GstXvImageSink * xvimagesink)
+{
+ GList *formats_list, *channels_list;
+ GstXContext *xcontext;
+ gint i = 0;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ GST_OBJECT_LOCK (xvimagesink);
+ if (xvimagesink->xcontext == NULL) {
+ GST_OBJECT_UNLOCK (xvimagesink);
+ return;
+ }
+
+ /* Take the XContext from the sink and clean it up */
+ xcontext = xvimagesink->xcontext;
+ xvimagesink->xcontext = NULL;
+
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+
+ formats_list = xcontext->formats_list;
+
+ while (formats_list) {
+ GstXvImageFormat *format = formats_list->data;
+
+ gst_caps_unref (format->caps);
+ g_free (format);
+ formats_list = g_list_next (formats_list);
+ }
+
+ if (xcontext->formats_list)
+ g_list_free (xcontext->formats_list);
+
+ channels_list = xcontext->channels_list;
+
+ while (channels_list) {
+ GstColorBalanceChannel *channel = channels_list->data;
+
+ g_object_unref (channel);
+ channels_list = g_list_next (channels_list);
+ }
+
+ if (xcontext->channels_list)
+ g_list_free (xcontext->channels_list);
+
+ gst_caps_unref (xcontext->caps);
+ if (xcontext->last_caps)
+ gst_caps_replace (&xcontext->last_caps, NULL);
+
+ for (i = 0; i < xcontext->nb_adaptors; i++) {
+ g_free (xcontext->adaptors[i]);
+ }
+
+ g_free (xcontext->adaptors);
+
+ g_free (xcontext->par);
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ GST_DEBUG_OBJECT (xvimagesink, "Closing display and freeing X Context");
+
+ XvUngrabPort (xcontext->disp, xcontext->xv_port_id, 0);
+
+ XCloseDisplay (xcontext->disp);
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_free (xcontext);
+}
+
+/* Element stuff */
+
+static GstCaps *
+gst_xvimagesink_getcaps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstXvImageSink *xvimagesink;
+ GstCaps *caps;
+
+ xvimagesink = GST_XVIMAGESINK (bsink);
+
+ if (xvimagesink->xcontext) {
+ if (filter)
+ return gst_caps_intersect_full (filter, xvimagesink->xcontext->caps,
+ GST_CAPS_INTERSECT_FIRST);
+ else
+ return gst_caps_ref (xvimagesink->xcontext->caps);
+ }
+
+ caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (xvimagesink));
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+ return caps;
+}
+
+static gboolean
+gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstXvImageSink *xvimagesink;
+ GstStructure *structure;
+ GstBufferPool *newpool, *oldpool;
+ GstVideoInfo info;
+ guint32 im_format = 0;
+ gint video_par_n, video_par_d; /* video's PAR */
+ gint display_par_n, display_par_d; /* display's PAR */
+ guint num, den;
+ gint size;
+
+ xvimagesink = GST_XVIMAGESINK (bsink);
+
+ GST_DEBUG_OBJECT (xvimagesink,
+ "In setcaps. Possible caps %" GST_PTR_FORMAT ", setting caps %"
+ GST_PTR_FORMAT, xvimagesink->xcontext->caps, caps);
+
+ if (!gst_caps_can_intersect (xvimagesink->xcontext->caps, caps))
+ goto incompatible_caps;
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_format;
+
+ structure = gst_caps_get_structure (caps, 0);
+
+ xvimagesink->fps_n = info.fps_n;
+ xvimagesink->fps_d = info.fps_d;
+
+ xvimagesink->video_width = info.width;
+ xvimagesink->video_height = info.height;
+
+ im_format = gst_xvimagesink_get_format_from_info (xvimagesink, &info);
+ if (im_format == -1)
+ goto invalid_format;
+
+ size = info.size;
+
+ /* get aspect ratio from caps if it's present, and
+ * convert video width and height to a display width and height
+ * using wd / hd = wv / hv * PARv / PARd */
+
+ /* get video's PAR */
+ video_par_n = info.par_n;
+ video_par_d = info.par_d;
+
+ /* get display's PAR */
+ if (xvimagesink->par) {
+ display_par_n = gst_value_get_fraction_numerator (xvimagesink->par);
+ display_par_d = gst_value_get_fraction_denominator (xvimagesink->par);
+ } else {
+ display_par_n = 1;
+ display_par_d = 1;
+ }
+
+ if (!gst_video_calculate_display_ratio (&num, &den, info.width,
+ info.height, video_par_n, video_par_d, display_par_n, display_par_d))
+ goto no_disp_ratio;
+
+ GST_DEBUG_OBJECT (xvimagesink,
+ "video width/height: %dx%d, calculated display ratio: %d/%d",
+ info.width, info.height, 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 (info.height % den == 0) {
+ GST_DEBUG_OBJECT (xvimagesink, "keeping video height");
+ GST_VIDEO_SINK_WIDTH (xvimagesink) = (guint)
+ gst_util_uint64_scale_int (info.height, num, den);
+ GST_VIDEO_SINK_HEIGHT (xvimagesink) = info.height;
+ } else if (info.width % num == 0) {
+ GST_DEBUG_OBJECT (xvimagesink, "keeping video width");
+ GST_VIDEO_SINK_WIDTH (xvimagesink) = info.width;
+ GST_VIDEO_SINK_HEIGHT (xvimagesink) = (guint)
+ gst_util_uint64_scale_int (info.width, den, num);
+ } else {
+ GST_DEBUG_OBJECT (xvimagesink, "approximating while keeping video height");
+ GST_VIDEO_SINK_WIDTH (xvimagesink) = (guint)
+ gst_util_uint64_scale_int (info.height, num, den);
+ GST_VIDEO_SINK_HEIGHT (xvimagesink) = info.height;
+ }
+ GST_DEBUG_OBJECT (xvimagesink, "scaling to %dx%d",
+ GST_VIDEO_SINK_WIDTH (xvimagesink), GST_VIDEO_SINK_HEIGHT (xvimagesink));
+
+ /* Notify application to set xwindow id now */
+ g_mutex_lock (xvimagesink->flow_lock);
+ if (!xvimagesink->xwindow) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (xvimagesink));
+ } else {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ }
+
+ /* Creating our window and our image with the display size in pixels */
+ if (GST_VIDEO_SINK_WIDTH (xvimagesink) <= 0 ||
+ GST_VIDEO_SINK_HEIGHT (xvimagesink) <= 0)
+ goto no_display_size;
+
+ g_mutex_lock (xvimagesink->flow_lock);
+ if (!xvimagesink->xwindow) {
+ xvimagesink->xwindow = gst_xvimagesink_xwindow_new (xvimagesink,
+ GST_VIDEO_SINK_WIDTH (xvimagesink),
+ GST_VIDEO_SINK_HEIGHT (xvimagesink));
+ }
+
+ xvimagesink->info = info;
+
+ /* After a resize, we want to redraw the borders in case the new frame size
+ * doesn't cover the same area */
+ xvimagesink->redraw_border = TRUE;
+
+ /* create a new pool for the new configuration */
+ newpool = gst_xvimage_buffer_pool_new (xvimagesink);
+
+ structure = gst_buffer_pool_get_config (newpool);
+ gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
+ if (!gst_buffer_pool_set_config (newpool, structure))
+ goto config_failed;
+
+ oldpool = xvimagesink->pool;
+ xvimagesink->pool = newpool;
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ /* unref the old sink */
+ if (oldpool) {
+ /* we don't deactivate, some elements might still be using it, it will
+ * be deactivated when the last ref is gone */
+ gst_object_unref (oldpool);
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+incompatible_caps:
+ {
+ GST_ERROR_OBJECT (xvimagesink, "caps incompatible");
+ return FALSE;
+ }
+invalid_format:
+ {
+ GST_DEBUG_OBJECT (xvimagesink,
+ "Could not locate image format from caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+no_disp_ratio:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output display ratio of the video."));
+ return FALSE;
+ }
+no_display_size:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL),
+ ("Error calculating the output display ratio of the video."));
+ return FALSE;
+ }
+config_failed:
+ {
+ GST_ERROR_OBJECT (xvimagesink, "failed to set config.");
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return FALSE;
+ }
+}
+
+static GstStateChangeReturn
+gst_xvimagesink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstXvImageSink *xvimagesink;
+ GstXContext *xcontext = NULL;
+
+ xvimagesink = GST_XVIMAGESINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ /* Initializing the XContext */
+ if (xvimagesink->xcontext == NULL) {
+ xcontext = gst_xvimagesink_xcontext_get (xvimagesink);
+ if (xcontext == NULL) {
+ ret = GST_STATE_CHANGE_FAILURE;
+ goto beach;
+ }
+ GST_OBJECT_LOCK (xvimagesink);
+ if (xcontext)
+ xvimagesink->xcontext = xcontext;
+ GST_OBJECT_UNLOCK (xvimagesink);
+ }
+
+ /* update object's par with calculated one if not set yet */
+ if (!xvimagesink->par) {
+ xvimagesink->par = g_new0 (GValue, 1);
+ gst_value_init_and_copy (xvimagesink->par, xvimagesink->xcontext->par);
+ GST_DEBUG_OBJECT (xvimagesink, "set calculated PAR on object's PAR");
+ }
+ /* call XSynchronize with the current value of synchronous */
+ GST_DEBUG_OBJECT (xvimagesink, "XSynchronize called with %s",
+ xvimagesink->synchronous ? "TRUE" : "FALSE");
+ XSynchronize (xvimagesink->xcontext->disp, xvimagesink->synchronous);
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+ gst_xvimagesink_manage_event_thread (xvimagesink);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ 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:
+ xvimagesink->fps_n = 0;
+ xvimagesink->fps_d = 1;
+ GST_VIDEO_SINK_WIDTH (xvimagesink) = 0;
+ GST_VIDEO_SINK_HEIGHT (xvimagesink) = 0;
+ g_mutex_lock (xvimagesink->flow_lock);
+ if (xvimagesink->pool)
+ gst_buffer_pool_set_active (xvimagesink->pool, FALSE);
+ g_mutex_unlock (xvimagesink->flow_lock);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_xvimagesink_reset (xvimagesink);
+ break;
+ default:
+ break;
+ }
+
+beach:
+ return ret;
+}
+
+static void
+gst_xvimagesink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstXvImageSink *xvimagesink;
+
+ xvimagesink = GST_XVIMAGESINK (bsink);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ *start = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf)) {
+ *end = *start + GST_BUFFER_DURATION (buf);
+ } else {
+ if (xvimagesink->fps_n > 0) {
+ *end = *start +
+ gst_util_uint64_scale_int (GST_SECOND, xvimagesink->fps_d,
+ xvimagesink->fps_n);
+ }
+ }
+ }
+}
+
+static GstFlowReturn
+gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
+{
+ GstFlowReturn res;
+ GstXvImageSink *xvimagesink;
+ GstMetaXvImage *meta;
+ GstBuffer *to_put;
+
+ xvimagesink = GST_XVIMAGESINK (vsink);
+
+ meta = gst_buffer_get_meta_xvimage (buf);
+
+ if (meta && meta->sink == xvimagesink) {
+ /* If this buffer has been allocated using our buffer management we simply
+ put the ximage which is in the PRIVATE pointer */
+ GST_LOG_OBJECT (xvimagesink, "buffer %p from our pool, writing directly",
+ buf);
+ to_put = buf;
+ res = GST_FLOW_OK;
+ } else {
+ GstVideoFrame src, dest;
+
+ /* Else we have to copy the data into our private image, */
+ /* if we have one... */
+ GST_LOG_OBJECT (xvimagesink, "buffer %p not from our pool, copying", buf);
+
+ /* we should have a pool, configured in setcaps */
+ if (xvimagesink->pool == NULL)
+ goto no_pool;
+
+ if (!gst_buffer_pool_set_active (xvimagesink->pool, TRUE))
+ goto activate_failed;
+
+ /* take a buffer form our pool */
+ res = gst_buffer_pool_acquire_buffer (xvimagesink->pool, &to_put, NULL);
+ if (res != GST_FLOW_OK)
+ goto no_buffer;
+
+ if (gst_buffer_get_size (to_put) < gst_buffer_get_size (buf))
+ goto wrong_size;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, xvimagesink,
+ "slow copy into bufferpool buffer %p", to_put);
+
+ if (!gst_video_frame_map (&src, &xvimagesink->info, buf, GST_MAP_READ))
+ goto invalid_buffer;
+
+ if (!gst_video_frame_map (&dest, &xvimagesink->info, to_put, GST_MAP_WRITE)) {
+ gst_video_frame_unmap (&src);
+ goto invalid_buffer;
+ }
+
+ gst_video_frame_copy (&dest, &src);
+
+ gst_video_frame_unmap (&dest);
+ gst_video_frame_unmap (&src);
+ }
+
+ if (!gst_xvimagesink_xvimage_put (xvimagesink, to_put))
+ goto no_window;
+
+done:
+ if (to_put != buf)
+ gst_buffer_unref (to_put);
+
+ return res;
+
+ /* ERRORS */
+no_pool:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Internal error: can't allocate images"),
+ ("We don't have a bufferpool negotiated"));
+ return GST_FLOW_ERROR;
+ }
+no_buffer:
+ {
+ /* No image available. That's very bad ! */
+ GST_WARNING_OBJECT (xvimagesink, "could not create image");
+ return res;
+ }
+wrong_size:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer"),
+ ("XServer allocated buffer size did not match input buffer %"
+ G_GSIZE_FORMAT " - %" G_GSIZE_FORMAT, gst_buffer_get_size (to_put),
+ gst_buffer_get_size (buf)));
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+invalid_buffer:
+ {
+ /* No Window available to put our image into */
+ GST_WARNING_OBJECT (xvimagesink, "could map image");
+ res = GST_FLOW_OK;
+ goto done;
+ }
+no_window:
+ {
+ /* No Window available to put our image into */
+ GST_WARNING_OBJECT (xvimagesink, "could not output image - no window");
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+activate_failed:
+ {
+ GST_ERROR_OBJECT (xvimagesink, "failed to activate bufferpool.");
+ res = GST_FLOW_ERROR;
+ goto done;
+ }
+}
+
+static gboolean
+gst_xvimagesink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (sink);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:{
+ GstTagList *l;
+ gchar *title = NULL;
+
+ gst_event_parse_tag (event, &l);
+ gst_tag_list_get_string (l, GST_TAG_TITLE, &title);
+
+ if (title) {
+ GST_DEBUG_OBJECT (xvimagesink, "got tags, title='%s'", title);
+ gst_xvimagesink_xwindow_set_title (xvimagesink, xvimagesink->xwindow,
+ title);
+
+ g_free (title);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ if (GST_BASE_SINK_CLASS (parent_class)->event)
+ return GST_BASE_SINK_CLASS (parent_class)->event (sink, event);
+ else
+ return TRUE;
+}
+
+static gboolean
+gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (bsink);
+ GstBufferPool *pool;
+ GstStructure *config;
+ GstCaps *caps;
+ guint size;
+ gboolean need_pool;
+
+ gst_query_parse_allocation (query, &caps, &need_pool);
+
+ if (caps == NULL)
+ goto no_caps;
+
+ g_mutex_lock (xvimagesink->flow_lock);
+ if ((pool = xvimagesink->pool))
+ gst_object_ref (pool);
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ if (pool != NULL) {
+ const GstCaps *pcaps;
+
+ /* we had a pool, check caps */
+ GST_DEBUG_OBJECT (xvimagesink, "check existing pool caps");
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
+
+ if (!gst_caps_is_equal (caps, pcaps)) {
+ GST_DEBUG_OBJECT (xvimagesink, "pool has different caps");
+ /* different caps, we can't use this pool */
+ gst_object_unref (pool);
+ pool = NULL;
+ }
+ }
+ if (pool == NULL && need_pool) {
+ GstVideoInfo info;
+
+ GST_DEBUG_OBJECT (xvimagesink, "create new pool");
+ pool = gst_xvimage_buffer_pool_new (xvimagesink);
+
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_caps;
+
+ /* the normal size of a frame */
+ size = info.size;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
+ if (!gst_buffer_pool_set_config (pool, config))
+ goto config_failed;
+ }
+ /* we need at least 2 buffer because we hold on to the last one */
+ gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
+
+ /* we also support various metadata */
+ gst_query_add_allocation_meta (query, GST_META_API_VIDEO);
+ gst_query_add_allocation_meta (query, GST_META_API_VIDEO_CROP);
+
+ gst_object_unref (pool);
+
+ return TRUE;
+
+ /* ERRORS */
+no_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "no caps specified");
+ return FALSE;
+ }
+invalid_caps:
+ {
+ GST_DEBUG_OBJECT (bsink, "invalid caps specified");
+ return FALSE;
+ }
+config_failed:
+ {
+ GST_DEBUG_OBJECT (bsink, "failed setting config");
+ return FALSE;
+ }
+}
+
+/* Interfaces stuff */
+static void
+gst_xvimagesink_navigation_send_event (GstNavigation * navigation,
+ GstStructure * structure)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (navigation);
+ GstPad *peer;
+
+ if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (xvimagesink)))) {
+ GstEvent *event;
+ GstVideoRectangle src, dst, result;
+ gdouble x, y, xscale = 1.0, yscale = 1.0;
+
+ event = gst_event_new_navigation (structure);
+
+ /* We take the flow_lock while we look at the window */
+ g_mutex_lock (xvimagesink->flow_lock);
+
+ if (!xvimagesink->xwindow) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return;
+ }
+
+ if (xvimagesink->keep_aspect) {
+ /* We get the frame position using the calculated geometry from _setcaps
+ that respect pixel aspect ratios */
+ src.w = GST_VIDEO_SINK_WIDTH (xvimagesink);
+ src.h = GST_VIDEO_SINK_HEIGHT (xvimagesink);
+ dst.w = xvimagesink->render_rect.w;
+ dst.h = xvimagesink->render_rect.h;
+
+ gst_video_sink_center_rect (src, dst, &result, TRUE);
+ result.x += xvimagesink->render_rect.x;
+ result.y += xvimagesink->render_rect.y;
+ } else {
+ memcpy (&result, &xvimagesink->render_rect, sizeof (GstVideoRectangle));
+ }
+
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ /* We calculate scaling using the original video frames geometry to include
+ pixel aspect ratio scaling. */
+ xscale = (gdouble) xvimagesink->video_width / result.w;
+ yscale = (gdouble) xvimagesink->video_height / result.h;
+
+ /* Converting pointer coordinates to the non scaled geometry */
+ if (gst_structure_get_double (structure, "pointer_x", &x)) {
+ x = MIN (x, result.x + result.w);
+ x = MAX (x - result.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, result.y + result.h);
+ y = MAX (y - result.y, 0);
+ gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE,
+ (gdouble) y * yscale, NULL);
+ }
+
+ gst_pad_send_event (peer, event);
+ gst_object_unref (peer);
+ }
+}
+
+static void
+gst_xvimagesink_navigation_init (GstNavigationInterface * iface)
+{
+ iface->send_event = gst_xvimagesink_navigation_send_event;
+}
+
+static void
+gst_xvimagesink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
+{
+ XID xwindow_id = id;
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
+ GstXWindow *xwindow = NULL;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+
+ g_mutex_lock (xvimagesink->flow_lock);
+
+ /* If we already use that window return */
+ if (xvimagesink->xwindow && (xwindow_id == xvimagesink->xwindow->win)) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return;
+ }
+
+ /* If the element has not initialized the X11 context try to do so */
+ if (!xvimagesink->xcontext &&
+ !(xvimagesink->xcontext = gst_xvimagesink_xcontext_get (xvimagesink))) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ /* we have thrown a GST_ELEMENT_ERROR now */
+ return;
+ }
+
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+
+ /* If a window is there already we destroy it */
+ if (xvimagesink->xwindow) {
+ gst_xvimagesink_xwindow_destroy (xvimagesink, xvimagesink->xwindow);
+ xvimagesink->xwindow = NULL;
+ }
+
+ /* If the xid is 0 we go back to an internal window */
+ if (xwindow_id == 0) {
+ /* If no width/height caps nego did not happen window will be created
+ during caps nego then */
+ if (GST_VIDEO_SINK_WIDTH (xvimagesink)
+ && GST_VIDEO_SINK_HEIGHT (xvimagesink)) {
+ xwindow =
+ gst_xvimagesink_xwindow_new (xvimagesink,
+ GST_VIDEO_SINK_WIDTH (xvimagesink),
+ GST_VIDEO_SINK_HEIGHT (xvimagesink));
+ }
+ } else {
+ XWindowAttributes attr;
+
+ xwindow = g_new0 (GstXWindow, 1);
+ xwindow->win = xwindow_id;
+
+ /* Set the event we want to receive and create a GC */
+ g_mutex_lock (xvimagesink->x_lock);
+
+ XGetWindowAttributes (xvimagesink->xcontext->disp, xwindow->win, &attr);
+
+ xwindow->width = attr.width;
+ xwindow->height = attr.height;
+ xwindow->internal = FALSE;
+ if (!xvimagesink->have_render_rect) {
+ xvimagesink->render_rect.x = xvimagesink->render_rect.y = 0;
+ xvimagesink->render_rect.w = attr.width;
+ xvimagesink->render_rect.h = attr.height;
+ }
+ if (xvimagesink->handle_events) {
+ XSelectInput (xvimagesink->xcontext->disp, xwindow->win, ExposureMask |
+ StructureNotifyMask | PointerMotionMask | KeyPressMask |
+ KeyReleaseMask);
+ }
+
+ xwindow->gc = XCreateGC (xvimagesink->xcontext->disp,
+ xwindow->win, 0, NULL);
+ g_mutex_unlock (xvimagesink->x_lock);
+ }
+
+ if (xwindow)
+ xvimagesink->xwindow = xwindow;
+
+ g_mutex_unlock (xvimagesink->flow_lock);
+}
+
+static void
+gst_xvimagesink_expose (GstVideoOverlay * overlay)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
+
+ GST_DEBUG ("doing expose");
+ gst_xvimagesink_xwindow_update_geometry (xvimagesink);
+ gst_xvimagesink_xvimage_put (xvimagesink, NULL);
+}
+
+static void
+gst_xvimagesink_set_event_handling (GstVideoOverlay * overlay,
+ gboolean handle_events)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
+
+ xvimagesink->handle_events = handle_events;
+
+ g_mutex_lock (xvimagesink->flow_lock);
+
+ if (G_UNLIKELY (!xvimagesink->xwindow)) {
+ g_mutex_unlock (xvimagesink->flow_lock);
+ return;
+ }
+
+ g_mutex_lock (xvimagesink->x_lock);
+
+ if (handle_events) {
+ if (xvimagesink->xwindow->internal) {
+ XSelectInput (xvimagesink->xcontext->disp, xvimagesink->xwindow->win,
+ ExposureMask | StructureNotifyMask | PointerMotionMask |
+ KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);
+ } else {
+ XSelectInput (xvimagesink->xcontext->disp, xvimagesink->xwindow->win,
+ ExposureMask | StructureNotifyMask | PointerMotionMask |
+ KeyPressMask | KeyReleaseMask);
+ }
+ } else {
+ XSelectInput (xvimagesink->xcontext->disp, xvimagesink->xwindow->win, 0);
+ }
+
+ g_mutex_unlock (xvimagesink->x_lock);
+
+ g_mutex_unlock (xvimagesink->flow_lock);
+}
+
+static void
+gst_xvimagesink_set_render_rectangle (GstVideoOverlay * overlay, gint x, gint y,
+ gint width, gint height)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
+
+ /* FIXME: how about some locking? */
+ if (width >= 0 && height >= 0) {
+ xvimagesink->render_rect.x = x;
+ xvimagesink->render_rect.y = y;
+ xvimagesink->render_rect.w = width;
+ xvimagesink->render_rect.h = height;
+ xvimagesink->have_render_rect = TRUE;
+ } else {
+ xvimagesink->render_rect.x = 0;
+ xvimagesink->render_rect.y = 0;
+ xvimagesink->render_rect.w = xvimagesink->xwindow->width;
+ xvimagesink->render_rect.h = xvimagesink->xwindow->height;
+ xvimagesink->have_render_rect = FALSE;
+ }
+}
+
+static void
+gst_xvimagesink_video_overlay_init (GstVideoOverlayIface * iface)
+{
+ iface->set_window_handle = gst_xvimagesink_set_window_handle;
+ iface->expose = gst_xvimagesink_expose;
+ iface->handle_events = gst_xvimagesink_set_event_handling;
+ iface->set_render_rectangle = gst_xvimagesink_set_render_rectangle;
+}
+
+static const GList *
+gst_xvimagesink_colorbalance_list_channels (GstColorBalance * balance)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance);
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
+
+ if (xvimagesink->xcontext)
+ return xvimagesink->xcontext->channels_list;
+ else
+ return NULL;
+}
+
+static void
+gst_xvimagesink_colorbalance_set_value (GstColorBalance * balance,
+ GstColorBalanceChannel * channel, gint value)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance);
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
+ g_return_if_fail (channel->label != NULL);
+
+ xvimagesink->cb_changed = TRUE;
+
+ /* Normalize val to [-1000, 1000] */
+ value = floor (0.5 + -1000 + 2000 * (value - channel->min_value) /
+ (double) (channel->max_value - channel->min_value));
+
+ if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) {
+ xvimagesink->hue = value;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) {
+ xvimagesink->saturation = value;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) {
+ xvimagesink->contrast = value;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) {
+ xvimagesink->brightness = value;
+ } else {
+ g_warning ("got an unknown channel %s", channel->label);
+ return;
+ }
+
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+}
+
+static gint
+gst_xvimagesink_colorbalance_get_value (GstColorBalance * balance,
+ GstColorBalanceChannel * channel)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance);
+ gint value = 0;
+
+ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), 0);
+ g_return_val_if_fail (channel->label != NULL, 0);
+
+ if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) {
+ value = xvimagesink->hue;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) {
+ value = xvimagesink->saturation;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) {
+ value = xvimagesink->contrast;
+ } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) {
+ value = xvimagesink->brightness;
+ } else {
+ g_warning ("got an unknown channel %s", channel->label);
+ }
+
+ /* Normalize val to [channel->min_value, channel->max_value] */
+ value = channel->min_value + (channel->max_value - channel->min_value) *
+ (value + 1000) / 2000;
+
+ return value;
+}
+
+static void
+gst_xvimagesink_colorbalance_init (GstColorBalanceClass * iface)
+{
+ GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_HARDWARE;
+ iface->list_channels = gst_xvimagesink_colorbalance_list_channels;
+ iface->set_value = gst_xvimagesink_colorbalance_set_value;
+ iface->get_value = gst_xvimagesink_colorbalance_get_value;
+}
+
+static const GList *
+gst_xvimagesink_probe_get_properties (GstPropertyProbe * probe)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
+ static GList *list = NULL;
+
+ if (!list) {
+ list = g_list_append (NULL, g_object_class_find_property (klass, "device"));
+ list =
+ g_list_append (list, g_object_class_find_property (klass,
+ "autopaint-colorkey"));
+ list =
+ g_list_append (list, g_object_class_find_property (klass,
+ "double-buffer"));
+ list =
+ g_list_append (list, g_object_class_find_property (klass, "colorkey"));
+ }
+
+ return list;
+}
+
+static void
+gst_xvimagesink_probe_probe_property (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (probe);
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ case PROP_AUTOPAINT_COLORKEY:
+ case PROP_DOUBLE_BUFFER:
+ case PROP_COLORKEY:
+ GST_DEBUG_OBJECT (xvimagesink,
+ "probing device list and get capabilities");
+ if (!xvimagesink->xcontext) {
+ GST_DEBUG_OBJECT (xvimagesink, "generating xcontext");
+ xvimagesink->xcontext = gst_xvimagesink_xcontext_get (xvimagesink);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_xvimagesink_probe_needs_probe (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (probe);
+ gboolean ret = FALSE;
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ case PROP_AUTOPAINT_COLORKEY:
+ case PROP_DOUBLE_BUFFER:
+ case PROP_COLORKEY:
+ if (xvimagesink->xcontext != NULL) {
+ ret = FALSE;
+ } else {
+ ret = TRUE;
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+ return ret;
+}
+
+static GValueArray *
+gst_xvimagesink_probe_get_values (GstPropertyProbe * probe,
+ guint prop_id, const GParamSpec * pspec)
+{
+ GstXvImageSink *xvimagesink = GST_XVIMAGESINK (probe);
+ GValueArray *array = NULL;
+
+ if (G_UNLIKELY (!xvimagesink->xcontext)) {
+ GST_WARNING_OBJECT (xvimagesink, "we don't have any xcontext, can't "
+ "get values");
+ goto beach;
+ }
+
+ switch (prop_id) {
+ case PROP_DEVICE:
+ {
+ guint i;
+ GValue value = { 0 };
+
+ array = g_value_array_new (xvimagesink->xcontext->nb_adaptors);
+ g_value_init (&value, G_TYPE_STRING);
+
+ for (i = 0; i < xvimagesink->xcontext->nb_adaptors; i++) {
+ gchar *adaptor_id_s = g_strdup_printf ("%u", i);
+
+ g_value_set_string (&value, adaptor_id_s);
+ g_value_array_append (array, &value);
+ g_free (adaptor_id_s);
+ }
+ g_value_unset (&value);
+ break;
+ }
+ case PROP_AUTOPAINT_COLORKEY:
+ if (xvimagesink->have_autopaint_colorkey) {
+ GValue value = { 0 };
+
+ array = g_value_array_new (2);
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, FALSE);
+ g_value_array_append (array, &value);
+ g_value_set_boolean (&value, TRUE);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+ }
+ break;
+ case PROP_DOUBLE_BUFFER:
+ if (xvimagesink->have_double_buffer) {
+ GValue value = { 0 };
+
+ array = g_value_array_new (2);
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, FALSE);
+ g_value_array_append (array, &value);
+ g_value_set_boolean (&value, TRUE);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+ }
+ break;
+ case PROP_COLORKEY:
+ if (xvimagesink->have_colorkey) {
+ GValue value = { 0 };
+
+ array = g_value_array_new (1);
+ g_value_init (&value, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&value, 0, 0xffffff);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+beach:
+ return array;
+}
+
+static void
+gst_xvimagesink_property_probe_interface_init (GstPropertyProbeInterface *
+ iface)
+{
+ iface->get_properties = gst_xvimagesink_probe_get_properties;
+ iface->probe_property = gst_xvimagesink_probe_probe_property;
+ iface->needs_probe = gst_xvimagesink_probe_needs_probe;
+ iface->get_values = gst_xvimagesink_probe_get_values;
+}
+
+/* =========================================== */
+/* */
+/* Init & Class init */
+/* */
+/* =========================================== */
+
+static void
+gst_xvimagesink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstXvImageSink *xvimagesink;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (object));
+
+ xvimagesink = GST_XVIMAGESINK (object);
+
+ switch (prop_id) {
+ case PROP_HUE:
+ xvimagesink->hue = g_value_get_int (value);
+ xvimagesink->cb_changed = TRUE;
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+ break;
+ case PROP_CONTRAST:
+ xvimagesink->contrast = g_value_get_int (value);
+ xvimagesink->cb_changed = TRUE;
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+ break;
+ case PROP_BRIGHTNESS:
+ xvimagesink->brightness = g_value_get_int (value);
+ xvimagesink->cb_changed = TRUE;
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+ break;
+ case PROP_SATURATION:
+ xvimagesink->saturation = g_value_get_int (value);
+ xvimagesink->cb_changed = TRUE;
+ gst_xvimagesink_update_colorbalance (xvimagesink);
+ break;
+ case PROP_DISPLAY:
+ xvimagesink->display_name = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_SYNCHRONOUS:
+ xvimagesink->synchronous = g_value_get_boolean (value);
+ if (xvimagesink->xcontext) {
+ XSynchronize (xvimagesink->xcontext->disp, xvimagesink->synchronous);
+ GST_DEBUG_OBJECT (xvimagesink, "XSynchronize called with %s",
+ xvimagesink->synchronous ? "TRUE" : "FALSE");
+ }
+ break;
+ case PROP_PIXEL_ASPECT_RATIO:
+ g_free (xvimagesink->par);
+ xvimagesink->par = g_new0 (GValue, 1);
+ g_value_init (xvimagesink->par, GST_TYPE_FRACTION);
+ if (!g_value_transform (value, xvimagesink->par)) {
+ g_warning ("Could not transform string to aspect ratio");
+ gst_value_set_fraction (xvimagesink->par, 1, 1);
+ }
+ GST_DEBUG_OBJECT (xvimagesink, "set PAR to %d/%d",
+ gst_value_get_fraction_numerator (xvimagesink->par),
+ gst_value_get_fraction_denominator (xvimagesink->par));
+ break;
+ case PROP_FORCE_ASPECT_RATIO:
+ xvimagesink->keep_aspect = g_value_get_boolean (value);
+ break;
+ case PROP_HANDLE_EVENTS:
+ gst_xvimagesink_set_event_handling (GST_VIDEO_OVERLAY (xvimagesink),
+ g_value_get_boolean (value));
+ gst_xvimagesink_manage_event_thread (xvimagesink);
+ break;
+ case PROP_DEVICE:
+ xvimagesink->adaptor_no = atoi (g_value_get_string (value));
+ break;
+ case PROP_HANDLE_EXPOSE:
+ xvimagesink->handle_expose = g_value_get_boolean (value);
+ gst_xvimagesink_manage_event_thread (xvimagesink);
+ break;
+ case PROP_DOUBLE_BUFFER:
+ xvimagesink->double_buffer = g_value_get_boolean (value);
+ break;
+ case PROP_AUTOPAINT_COLORKEY:
+ xvimagesink->autopaint_colorkey = g_value_get_boolean (value);
+ break;
+ case PROP_COLORKEY:
+ xvimagesink->colorkey = g_value_get_int (value);
+ break;
+ case PROP_DRAW_BORDERS:
+ xvimagesink->draw_borders = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_xvimagesink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstXvImageSink *xvimagesink;
+
+ g_return_if_fail (GST_IS_XVIMAGESINK (object));
+
+ xvimagesink = GST_XVIMAGESINK (object);
+
+ switch (prop_id) {
+ case PROP_HUE:
+ g_value_set_int (value, xvimagesink->hue);
+ break;
+ case PROP_CONTRAST:
+ g_value_set_int (value, xvimagesink->contrast);
+ break;
+ case PROP_BRIGHTNESS:
+ g_value_set_int (value, xvimagesink->brightness);
+ break;
+ case PROP_SATURATION:
+ g_value_set_int (value, xvimagesink->saturation);
+ break;
+ case PROP_DISPLAY:
+ g_value_set_string (value, xvimagesink->display_name);
+ break;
+ case PROP_SYNCHRONOUS:
+ g_value_set_boolean (value, xvimagesink->synchronous);
+ break;
+ case PROP_PIXEL_ASPECT_RATIO:
+ if (xvimagesink->par)
+ g_value_transform (xvimagesink->par, value);
+ break;
+ case PROP_FORCE_ASPECT_RATIO:
+ g_value_set_boolean (value, xvimagesink->keep_aspect);
+ break;
+ case PROP_HANDLE_EVENTS:
+ g_value_set_boolean (value, xvimagesink->handle_events);
+ break;
+ case PROP_DEVICE:
+ {
+ char *adaptor_no_s = g_strdup_printf ("%u", xvimagesink->adaptor_no);
+
+ g_value_set_string (value, adaptor_no_s);
+ g_free (adaptor_no_s);
+ break;
+ }
+ case PROP_DEVICE_NAME:
+ if (xvimagesink->xcontext && xvimagesink->xcontext->adaptors) {
+ g_value_set_string (value,
+ xvimagesink->xcontext->adaptors[xvimagesink->adaptor_no]);
+ } else {
+ g_value_set_string (value, NULL);
+ }
+ break;
+ case PROP_HANDLE_EXPOSE:
+ g_value_set_boolean (value, xvimagesink->handle_expose);
+ break;
+ case PROP_DOUBLE_BUFFER:
+ g_value_set_boolean (value, xvimagesink->double_buffer);
+ break;
+ case PROP_AUTOPAINT_COLORKEY:
+ g_value_set_boolean (value, xvimagesink->autopaint_colorkey);
+ break;
+ case PROP_COLORKEY:
+ g_value_set_int (value, xvimagesink->colorkey);
+ break;
+ case PROP_DRAW_BORDERS:
+ g_value_set_boolean (value, xvimagesink->draw_borders);
+ break;
+ case PROP_WINDOW_WIDTH:
+ if (xvimagesink->xwindow)
+ g_value_set_uint64 (value, xvimagesink->xwindow->width);
+ else
+ g_value_set_uint64 (value, 0);
+ break;
+ case PROP_WINDOW_HEIGHT:
+ if (xvimagesink->xwindow)
+ g_value_set_uint64 (value, xvimagesink->xwindow->height);
+ else
+ g_value_set_uint64 (value, 0);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_xvimagesink_reset (GstXvImageSink * xvimagesink)
+{
+ GThread *thread;
+
+ GST_OBJECT_LOCK (xvimagesink);
+ xvimagesink->running = FALSE;
+ /* grab thread and mark it as NULL */
+ thread = xvimagesink->event_thread;
+ xvimagesink->event_thread = NULL;
+ GST_OBJECT_UNLOCK (xvimagesink);
+
+ /* Wait for our event thread to finish before we clean up our stuff. */
+ if (thread)
+ g_thread_join (thread);
+
+ if (xvimagesink->cur_image) {
+ gst_buffer_unref (xvimagesink->cur_image);
+ xvimagesink->cur_image = NULL;
+ }
+
+ g_mutex_lock (xvimagesink->flow_lock);
+
+ if (xvimagesink->pool) {
+ gst_object_unref (xvimagesink->pool);
+ xvimagesink->pool = NULL;
+ }
+
+ if (xvimagesink->xwindow) {
+ gst_xvimagesink_xwindow_clear (xvimagesink, xvimagesink->xwindow);
+ gst_xvimagesink_xwindow_destroy (xvimagesink, xvimagesink->xwindow);
+ xvimagesink->xwindow = NULL;
+ }
+ g_mutex_unlock (xvimagesink->flow_lock);
+
+ xvimagesink->render_rect.x = xvimagesink->render_rect.y =
+ xvimagesink->render_rect.w = xvimagesink->render_rect.h = 0;
+ xvimagesink->have_render_rect = FALSE;
+
+ gst_xvimagesink_xcontext_clear (xvimagesink);
+}
+
+/* Finalize is called only once, dispose can be called multiple times.
+ * We use mutexes and don't reset stuff to NULL here so let's register
+ * as a finalize. */
+static void
+gst_xvimagesink_finalize (GObject * object)
+{
+ GstXvImageSink *xvimagesink;
+
+ xvimagesink = GST_XVIMAGESINK (object);
+
+ gst_xvimagesink_reset (xvimagesink);
+
+ if (xvimagesink->display_name) {
+ g_free (xvimagesink->display_name);
+ xvimagesink->display_name = NULL;
+ }
+
+ if (xvimagesink->par) {
+ g_free (xvimagesink->par);
+ xvimagesink->par = NULL;
+ }
+ if (xvimagesink->x_lock) {
+ g_mutex_free (xvimagesink->x_lock);
+ xvimagesink->x_lock = NULL;
+ }
+ if (xvimagesink->flow_lock) {
+ g_mutex_free (xvimagesink->flow_lock);
+ xvimagesink->flow_lock = NULL;
+ }
+
+ g_free (xvimagesink->media_title);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_xvimagesink_init (GstXvImageSink * xvimagesink)
+{
+ xvimagesink->display_name = NULL;
+ xvimagesink->adaptor_no = 0;
+ xvimagesink->xcontext = NULL;
+ xvimagesink->xwindow = NULL;
+ xvimagesink->cur_image = NULL;
+
+ xvimagesink->hue = xvimagesink->saturation = 0;
+ xvimagesink->contrast = xvimagesink->brightness = 0;
+ xvimagesink->cb_changed = FALSE;
+
+ xvimagesink->fps_n = 0;
+ xvimagesink->fps_d = 0;
+ xvimagesink->video_width = 0;
+ xvimagesink->video_height = 0;
+
+ xvimagesink->x_lock = g_mutex_new ();
+ xvimagesink->flow_lock = g_mutex_new ();
+
+ xvimagesink->pool = NULL;
+
+ xvimagesink->synchronous = FALSE;
+ xvimagesink->double_buffer = TRUE;
+ xvimagesink->running = FALSE;
+ xvimagesink->keep_aspect = FALSE;
+ xvimagesink->handle_events = TRUE;
+ xvimagesink->par = NULL;
+ xvimagesink->handle_expose = TRUE;
+ xvimagesink->autopaint_colorkey = TRUE;
+
+ /* on 16bit displays this becomes r,g,b = 1,2,3
+ * on 24bit displays this becomes r,g,b = 8,8,16
+ * as a port atom value
+ */
+ xvimagesink->colorkey = (8 << 16) | (8 << 8) | 16;
+ xvimagesink->draw_borders = TRUE;
+}
+
+static void
+gst_xvimagesink_class_init (GstXvImageSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+ GstVideoSinkClass *videosink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+ videosink_class = (GstVideoSinkClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->set_property = gst_xvimagesink_set_property;
+ gobject_class->get_property = gst_xvimagesink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_CONTRAST,
+ g_param_spec_int ("contrast", "Contrast", "The contrast of the video",
+ -1000, 1000, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_BRIGHTNESS,
+ g_param_spec_int ("brightness", "Brightness",
+ "The brightness of the video", -1000, 1000, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HUE,
+ g_param_spec_int ("hue", "Hue", "The hue of the video", -1000, 1000, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SATURATION,
+ g_param_spec_int ("saturation", "Saturation",
+ "The saturation of the video", -1000, 1000, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DISPLAY,
+ g_param_spec_string ("display", "Display", "X Display name", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SYNCHRONOUS,
+ g_param_spec_boolean ("synchronous", "Synchronous",
+ "When enabled, runs "
+ "the X display in synchronous mode. (used only for debugging)", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PIXEL_ASPECT_RATIO,
+ g_param_spec_string ("pixel-aspect-ratio", "Pixel Aspect Ratio",
+ "The pixel aspect ratio of the device", "1/1",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
+ g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
+ "When enabled, scaling will respect original aspect ratio", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HANDLE_EVENTS,
+ g_param_spec_boolean ("handle-events", "Handle XEvents",
+ "When enabled, XEvents will be selected and handled", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Adaptor number",
+ "The number of the video adaptor", "0",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
+ g_param_spec_string ("device-name", "Adaptor name",
+ "The name of the video adaptor", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstXvImageSink:handle-expose
+ *
+ * When enabled, the current frame will always be drawn in response to X
+ * Expose.
+ *
+ * Since: 0.10.14
+ */
+ g_object_class_install_property (gobject_class, PROP_HANDLE_EXPOSE,
+ g_param_spec_boolean ("handle-expose", "Handle expose",
+ "When enabled, "
+ "the current frame will always be drawn in response to X Expose "
+ "events", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXvImageSink:double-buffer
+ *
+ * Whether to double-buffer the output.
+ *
+ * Since: 0.10.14
+ */
+ g_object_class_install_property (gobject_class, PROP_DOUBLE_BUFFER,
+ g_param_spec_boolean ("double-buffer", "Double-buffer",
+ "Whether to double-buffer the output", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstXvImageSink:autopaint-colorkey
+ *
+ * Whether to autofill overlay with colorkey
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_AUTOPAINT_COLORKEY,
+ g_param_spec_boolean ("autopaint-colorkey", "Autofill with colorkey",
+ "Whether to autofill overlay with colorkey", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstXvImageSink:colorkey
+ *
+ * Color to use for the overlay mask.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_COLORKEY,
+ g_param_spec_int ("colorkey", "Colorkey",
+ "Color to use for the overlay mask", G_MININT, G_MAXINT, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXvImageSink:draw-borders
+ *
+ * Draw black borders when using GstXvImageSink:force-aspect-ratio to fill
+ * unused parts of the video area.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_DRAW_BORDERS,
+ g_param_spec_boolean ("draw-borders", "Colorkey",
+ "Draw black borders to fill unused area in force-aspect-ratio mode",
+ TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXvImageSink:window-width
+ *
+ * Actual width of the video window.
+ *
+ * Since: 0.10.32
+ */
+ g_object_class_install_property (gobject_class, PROP_WINDOW_WIDTH,
+ g_param_spec_uint64 ("window-width", "window-width",
+ "Width of the window", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstXvImageSink:window-height
+ *
+ * Actual height of the video window.
+ *
+ * Since: 0.10.32
+ */
+ g_object_class_install_property (gobject_class, PROP_WINDOW_HEIGHT,
+ g_param_spec_uint64 ("window-height", "window-height",
+ "Height of the window", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_xvimagesink_finalize;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Video sink", "Sink/Video",
+ "A Xv based videosink", "Julien Moutte <julien@moutte.net>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_xvimagesink_sink_template_factory));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_xvimagesink_change_state);
+
+ gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_xvimagesink_getcaps);
+ gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_xvimagesink_setcaps);
+ gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_xvimagesink_get_times);
+ gstbasesink_class->propose_allocation =
+ GST_DEBUG_FUNCPTR (gst_xvimagesink_propose_allocation);
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_xvimagesink_event);
+
+ videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_xvimagesink_show_frame);
+}
diff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h
new file mode 100644
index 0000000..635ab23
--- /dev/null
+++ b/sys/xvimage/xvimagesink.h
@@ -0,0 +1,278 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_XVIMAGESINK_H__
+#define __GST_XVIMAGESINK_H__
+
+#include <gst/video/gstvideosink.h>
+
+#ifdef HAVE_XSHM
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif /* HAVE_XSHM */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM
+#include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM */
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvlib.h>
+
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+
+/* Helper functions */
+#include <gst/video/video.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_XVIMAGESINK \
+ (gst_xvimagesink_get_type())
+#define GST_XVIMAGESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_XVIMAGESINK, GstXvImageSink))
+#define GST_XVIMAGESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_XVIMAGESINK, GstXvImageSinkClass))
+#define GST_IS_XVIMAGESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_XVIMAGESINK))
+#define GST_IS_XVIMAGESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_XVIMAGESINK))
+typedef struct _GstXContext GstXContext;
+typedef struct _GstXWindow GstXWindow;
+typedef struct _GstXvImageFormat GstXvImageFormat;
+
+typedef struct _GstXvImageSink GstXvImageSink;
+typedef struct _GstXvImageSinkClass GstXvImageSinkClass;
+
+#include "xvimagepool.h"
+
+/*
+ * 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
+ * @xv_port_id: the XVideo port ID
+ * @im_format: used to store at least a valid format for XShm calls checks
+ * @formats_list: list of supported image formats on @xv_port_id
+ * @channels_list: list of #GstColorBalanceChannels
+ * @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;
+ GValue *par; /* calculated pixel aspect ratio */
+
+ gboolean use_xshm;
+
+ XvPortID xv_port_id;
+ guint nb_adaptors;
+ gchar **adaptors;
+ gint im_format;
+
+ GList *formats_list;
+ GList *channels_list;
+
+ GstCaps *caps;
+
+ /* Optimisation storage for buffer_alloc return */
+ GstCaps *last_caps;
+ gint last_format;
+ gint last_width;
+ gint last_height;
+};
+
+/*
+ * 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;
+};
+
+/**
+ * GstXvImageFormat:
+ * @format: the image format
+ * @caps: generated #GstCaps for this image format
+ *
+ * Structure storing image format to #GstCaps association.
+ */
+struct _GstXvImageFormat
+{
+ gint format;
+ GstVideoFormat vformat;
+ GstCaps *caps;
+};
+
+
+/**
+ * GstXvImageSink:
+ * @display_name: the name of the Display we want to render to
+ * @xcontext: our instance's #GstXContext
+ * @xwindow: the #GstXWindow we are rendering to
+ * @cur_image: a reference to the last #GstXvImage that was put to @xwindow. It
+ * is used when Expose events are received to redraw the latest video frame
+ * @event_thread: a thread listening for events on @xwindow and handling them
+ * @running: used to inform @event_thread if it should run/shutdown
+ * @fps_n: the framerate fraction numerator
+ * @fps_d: the framerate fraction denominator
+ * @x_lock: used to protect X calls as we are not using the XLib in threaded
+ * mode
+ * @flow_lock: used to protect data flow routines from external calls such as
+ * events from @event_thread or methods from the #GstXOverlay interface
+ * @par: used to override calculated pixel aspect ratio from @xcontext
+ * @pool_lock: used to protect the buffer pool
+ * @image_pool: a list of #GstXvImageBuffer that could be reused at next buffer
+ * allocation call
+ * @synchronous: used to store if XSynchronous should be used or not (for
+ * debugging purpose only)
+ * @keep_aspect: used to remember if reverse negotiation scaling should respect
+ * aspect ratio
+ * @handle_events: used to know if we should handle select XEvents or not
+ * @brightness: used to store the user settings for color balance brightness
+ * @contrast: used to store the user settings for color balance contrast
+ * @hue: used to store the user settings for color balance hue
+ * @saturation: used to store the user settings for color balance saturation
+ * @cb_changed: used to store if the color balance settings where changed
+ * @video_width: the width of incoming video frames in pixels
+ * @video_height: the height of incoming video frames in pixels
+ *
+ * The #GstXvImageSink data structure.
+ */
+struct _GstXvImageSink
+{
+ /* Our element stuff */
+ GstVideoSink videosink;
+
+ char *display_name;
+ guint adaptor_no;
+
+ GstXContext *xcontext;
+ GstXWindow *xwindow;
+ GstBuffer *cur_image;
+
+ GThread *event_thread;
+ gboolean running;
+
+ GstVideoInfo info;
+
+ /* Framerate numerator and denominator */
+ gint fps_n;
+ gint fps_d;
+
+ GMutex *x_lock;
+ GMutex *flow_lock;
+
+ /* object-set pixel aspect ratio */
+ GValue *par;
+
+ /* the buffer pool */
+ GstBufferPool *pool;
+
+ gboolean synchronous;
+ gboolean double_buffer;
+ gboolean keep_aspect;
+ gboolean redraw_border;
+ gboolean handle_events;
+ gboolean handle_expose;
+
+ gint brightness;
+ gint contrast;
+ gint hue;
+ gint saturation;
+ gboolean cb_changed;
+
+ /* size of incoming video, used as the size for XvImage */
+ guint video_width, video_height;
+
+ /* port attributes */
+ gboolean autopaint_colorkey;
+ gint colorkey;
+
+ gboolean draw_borders;
+
+ /* port features */
+ gboolean have_autopaint_colorkey;
+ gboolean have_colorkey;
+ gboolean have_double_buffer;
+
+ /* stream metadata */
+ gchar *media_title;
+
+ /* target video rectagle */
+ GstVideoRectangle render_rect;
+ gboolean have_render_rect;
+};
+
+struct _GstXvImageSinkClass
+{
+ GstVideoSinkClass parent_class;
+};
+
+GType gst_xvimagesink_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_XVIMAGESINK_H__ */
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..de36755
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,28 @@
+if BUILD_EXAMPLES
+SUBDIRS_EXAMPLES = examples
+else
+SUBDIRS_EXAMPLES =
+endif
+
+if HAVE_GST_CHECK
+SUBDIRS_CHECK = check
+else
+SUBDIRS_CHECK =
+endif
+
+if USE_X
+SUBDIRS_ICLES = icles
+else
+SUBDIRS_ICLES =
+endif
+
+SUBDIRS = \
+ $(SUBDIRS_CHECK) \
+ $(SUBDIRS_EXAMPLES) \
+ $(SUBDIRS_ICLES)
+
+DIST_SUBDIRS = \
+ check \
+ examples \
+ files \
+ icles
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..7fadea3
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,774 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+@BUILD_EXAMPLES_FALSE@SUBDIRS_EXAMPLES =
+@BUILD_EXAMPLES_TRUE@SUBDIRS_EXAMPLES = examples
+@HAVE_GST_CHECK_FALSE@SUBDIRS_CHECK =
+@HAVE_GST_CHECK_TRUE@SUBDIRS_CHECK = check
+@USE_X_FALSE@SUBDIRS_ICLES =
+@USE_X_TRUE@SUBDIRS_ICLES = icles
+SUBDIRS = \
+ $(SUBDIRS_CHECK) \
+ $(SUBDIRS_EXAMPLES) \
+ $(SUBDIRS_ICLES)
+
+DIST_SUBDIRS = \
+ check \
+ examples \
+ files \
+ icles
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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..530d61a
--- /dev/null
+++ b/tests/check/Makefile.am
@@ -0,0 +1,527 @@
+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 = \
+ CK_DEFAULT_TIMEOUT=120 \
+ GST_STATE_IGNORE_ELEMENTS="$(STATE_IGNORE_ELEMENTS)" \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(GST_PLUGINS_DIR) \
+ GST_PLUGIN_LOADING_WHITELIST="gstreamer:gst-plugins-base@$(top_builddir)" \
+ GST_TAG_LICENSE_TRANSLATIONS_DICT="$(top_srcdir)/gst-libs/gst/tag/license-translations.dict"
+
+
+# ths core dumps of some machines have PIDs appended
+CLEANFILES = core.* test-registry.*
+
+clean-local: clean-local-check clean-local-orc
+
+$(CHECK_REGISTRY):
+ $(TESTS_ENVIRONMENT)
+
+# elements to ignore for the state tests
+STATE_IGNORE_ELEMENTS = cdio cdparanoiasrc libvisual_ alsasrc alsamixer alsasink
+
+TESTS = $(check_PROGRAMS)
+
+if USE_ALSA
+check_alsa = elements/alsa
+else
+check_alsa =
+endif
+
+if USE_GIO
+check_gio = pipelines/gio
+else
+check_gio =
+endif
+
+if USE_LIBVISUAL
+check_libvisual = elements/libvisual
+else
+check_libvisual =
+endif
+
+if USE_OGG
+check_ogg = pipelines/oggmux
+else
+check_ogg =
+endif
+
+if USE_PANGO
+check_pango = elements/textoverlay
+else
+check_pango =
+endif
+
+if USE_VORBIS
+check_vorbis = elements/vorbisdec pipelines/vorbisenc pipelines/vorbisdec \
+ elements/vorbistag
+else
+check_vorbis =
+endif
+
+if USE_THEORA
+check_theora = pipelines/theoraenc
+else
+check_theora =
+endif
+
+if USE_VORBIS
+if USE_THEORA
+check_encodebin = elements/encodebin
+else
+check_encodebin =
+endif
+else
+check_encodebin =
+endif
+
+if USE_PLUGIN_SUBPARSE
+check_subparse = elements/subparse
+else
+check_subparse =
+endif
+
+if HAVE_ORC
+check_orc = orc/adder orc/audioconvert orc/volume orc/videoscale orc/videotestsrc
+else
+check_orc =
+endif
+
+if HAVE_CXX
+cxx_checks = libs/gstlibscpp
+else
+cxx_checks =
+endif
+
+# FIXME 0.11: convert elements/ffmpegcolorspace to videoconvert or remove
+
+check_PROGRAMS = \
+ $(check_alsa) \
+ $(check_gio) \
+ $(check_ogg) \
+ $(check_vorbis) \
+ elements/audioconvert \
+ elements/audiotestsrc \
+ elements/decodebin \
+ $(check_encodebin) \
+ generic/clock-selection \
+ generic/states \
+ gst/typefindfunctions \
+ libs/libsabi \
+ libs/audio \
+ libs/cddabasesrc \
+ libs/discoverer \
+ libs/fft \
+ libs/mixer \
+ libs/navigation \
+ libs/netbuffer \
+ libs/pbutils \
+ libs/profile \
+ libs/rtp \
+ libs/rtsp \
+ libs/tag \
+ libs/video \
+ libs/xmpwriter \
+ $(cxx_checks) \
+ $(check_orc) \
+ pipelines/simple-launch-lines
+
+# TORTURE_TO_FIX = \
+# elements/adder
+
+# videoconvert takes too long, so disabled for now
+VALGRIND_TO_FIX = \
+ elements/videoconvert \
+ libs/video
+
+# FIXME 0.11: these tests don't even build at the moment
+ZERO_11_TO_PORT = \
+ pipelines/streamheader \
+ pipelines/basetime \
+ pipelines/capsfilter-renegotiation \
+ elements/appsink \
+ elements/appsrc \
+ elements/audiorate \
+ elements/audioresample \
+ elements/gdpdepay \
+ elements/gdppay \
+ elements/multifdsink \
+ elements/playbin \
+ elements/playbin-compressed \
+ $(check_pango) \
+ $(check_subparse) \
+ elements/videorate \
+ elements/videoscale \
+ elements/videotestsrc \
+ elements/volume
+
+# FIXME 0.11: these tests don't pass at the moment
+ZERO_11_TO_FIX = \
+ elements/adder \
+ $(check_theora)
+
+# these tests don't even pass
+noinst_PROGRAMS = $(check_libvisual) $(ZERO_11_TO_FIX)
+
+noinst_HEADERS = \
+ libs/struct_arm.h \
+ libs/struct_i386.h \
+ libs/struct_i386_osx.h \
+ libs/struct_x86_64.h
+
+AM_CFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+ $(GST_CFLAGS) $(GST_CHECK_CFLAGS) \
+ -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+AM_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+ $(GST_CXXFLAGS) $(GST_CHECK_CFLAGS) \
+ -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+LDADD = $(GST_LIBS) $(GST_CHECK_LIBS)
+
+# valgrind testing
+VALGRIND_TESTS_DISABLE = $(VALGRIND_TO_FIX)
+
+SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-base.supp
+
+libs_libsabi_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_libsabi_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_audio_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_audio_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_cddabasesrc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_cddabasesrc_LDADD = \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_discoverer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ -DGST_TEST_FILE="\"$(abs_top_srcdir)/tests/files/partialframe.mjpeg\""
+libs_discoverer_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_fft_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_fft_LDADD = \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_mixer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_mixer_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_navigation_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_navigation_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_netbuffer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_netbuffer_LDADD = \
+ $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+libs_rtp_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_rtp_LDADD = \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_rtsp_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_rtsp_LDADD = \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_tag_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_tag_LDADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_pbutils_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_pbutils_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_profile_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+libs_profile_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la $(LDADD)
+
+libs_xmpwriter_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_xmpwriter_LDADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+
+libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc
+
+elements_appsink_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_appsink_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_appsrc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_appsrc_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_alsa_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_alsa_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_audioconvert_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_audioconvert_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_audiorate_LDADD = $(LDADD)
+elements_audiorate_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
+
+elements_libvisual_LDADD = $(LDADD)
+elements_libvisual_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
+
+elements_gdpdepay_LDADD = $(GST_GDP_LIBS) $(LDADD)
+elements_gdppay_LDADD = $(GST_GDP_LIBS) $(LDADD)
+
+elements_playbin_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_playbin_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_playbin_compressed_LDADD = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la $(GST_BASE_LIBS) $(LDADD)
+elements_playbin_compressed_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_decodebin_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_decodebin_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_encodebin_LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la $(GST_BASE_LIBS) $(LDADD)
+elements_encodebin_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_subparse_LDADD = $(LDADD)
+elements_subparse_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
+
+elements_audioresample_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_audioresample_LDADD = \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_textoverlay_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_textoverlay_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+
+elements_volume_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_volume_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CONTROLLER_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_vorbisdec_LDADD = \
+ $(LDADD) \
+ $(VORBIS_LIBS) \
+ $(VORBISENC_LIBS)
+
+elements_vorbisdec_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ $(VORBIS_CFLAGS) \
+ $(CFLAGS)
+
+elements_vorbistag_LDADD = \
+ $(LDADD) \
+ $(VORBIS_LIBS) \
+ $(VORBISENC_LIBS)
+
+elements_vorbistag_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ $(VORBIS_CFLAGS) \
+ $(CFLAGS)
+
+elements_videoscale_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+elements_videoscale_LDADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+gst_typefindfunctions_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+gst_typefindfunctions_LDADD = $(GST_BASE_LIBS) $(LDADD)
+
+libs_video_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_video_LDADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+pipelines_gio_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS)
+pipelines_gio_LDADD = $(GIO_LIBS) $(LDADD)
+
+pipelines_vorbisenc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+# this seemingly useless CFLAGS line is here only to avoid
+# vorbisdec.$(OBJEXT) by triggering creation of pipelines_vorbisdec.$(OBJEXT)
+# instead
+pipelines_vorbisdec_CFLAGS = $(AM_CFLAGS)
+
+pipelines_oggmux_LDADD = $(LDADD) $(OGG_LIBS)
+pipelines_oggmux_CFLAGS = $(AM_CFLAGS) $(OGG_CFLAGS)
+
+pipelines_theoraenc_CFLAGS = $(AM_CFLAGS) $(THEORA_CFLAGS)
+pipelines_theoraenc_LDADD = $(LDADD) $(THEORA_LIBS)
+
+pipelines_simple_launch_lines_CFLAGS = \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+pipelines_simple_launch_lines_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+orc_adder_CFLAGS = $(ORC_CFLAGS)
+orc_adder_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_adder_SOURCES = orc/adder.c
+orc_audioconvert_CFLAGS = $(ORC_CFLAGS)
+orc_audioconvert_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_audioconvert_SOURCES = orc/audioconvert.c
+orc_volume_CFLAGS = $(ORC_CFLAGS)
+orc_volume_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_volume_SOURCES = orc/volume.c
+orc_videoscale_CFLAGS = $(ORC_CFLAGS)
+orc_videoscale_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_videoscale_SOURCES = orc/videoscale.c
+orc_videotestsrc_CFLAGS = $(ORC_CFLAGS)
+orc_videotestsrc_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_videotestsrc_SOURCES = orc/videotestsrc.c
+
+orc/adder.c: $(top_srcdir)/gst/adder/gstadderorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/audioconvert.c: $(top_srcdir)/gst/audioconvert/gstaudioconvertorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/volume.c: $(top_srcdir)/gst/volume/gstvolumeorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/videoscale.c: $(top_srcdir)/gst/videoscale/gstvideoscaleorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/videotestsrc.c: $(top_srcdir)/gst/videotestsrc/gstvideotestsrcorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+
+clean-local-orc:
+ rm -rf orc
+
+EXTRA_DIST = gst-plugins-base.supp
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
new file mode 100644
index 0000000..96ec42d
--- /dev/null
+++ b/tests/check/Makefile.in
@@ -0,0 +1,2610 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/common/check.mak
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ $(am__EXEEXT_4) elements/audioconvert$(EXEEXT) \
+ elements/audiotestsrc$(EXEEXT) elements/decodebin$(EXEEXT) \
+ $(am__EXEEXT_5) generic/clock-selection$(EXEEXT) \
+ generic/states$(EXEEXT) gst/typefindfunctions$(EXEEXT) \
+ libs/libsabi$(EXEEXT) libs/audio$(EXEEXT) \
+ libs/cddabasesrc$(EXEEXT) libs/discoverer$(EXEEXT) \
+ libs/fft$(EXEEXT) libs/mixer$(EXEEXT) libs/navigation$(EXEEXT) \
+ libs/netbuffer$(EXEEXT) libs/pbutils$(EXEEXT) \
+ libs/profile$(EXEEXT) libs/rtp$(EXEEXT) libs/rtsp$(EXEEXT) \
+ libs/tag$(EXEEXT) libs/video$(EXEEXT) libs/xmpwriter$(EXEEXT) \
+ $(am__EXEEXT_6) $(am__EXEEXT_7) \
+ pipelines/simple-launch-lines$(EXEEXT)
+noinst_PROGRAMS = $(am__EXEEXT_8) $(am__EXEEXT_10)
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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 =
+@USE_ALSA_TRUE@am__EXEEXT_1 = elements/alsa$(EXEEXT)
+@USE_GIO_TRUE@am__EXEEXT_2 = pipelines/gio$(EXEEXT)
+@USE_OGG_TRUE@am__EXEEXT_3 = pipelines/oggmux$(EXEEXT)
+@USE_VORBIS_TRUE@am__EXEEXT_4 = elements/vorbisdec$(EXEEXT) \
+@USE_VORBIS_TRUE@ pipelines/vorbisenc$(EXEEXT) \
+@USE_VORBIS_TRUE@ pipelines/vorbisdec$(EXEEXT) \
+@USE_VORBIS_TRUE@ elements/vorbistag$(EXEEXT)
+@USE_THEORA_TRUE@@USE_VORBIS_TRUE@am__EXEEXT_5 = \
+@USE_THEORA_TRUE@@USE_VORBIS_TRUE@ elements/encodebin$(EXEEXT)
+@HAVE_CXX_TRUE@am__EXEEXT_6 = libs/gstlibscpp$(EXEEXT)
+@HAVE_ORC_TRUE@am__EXEEXT_7 = orc/adder$(EXEEXT) \
+@HAVE_ORC_TRUE@ orc/audioconvert$(EXEEXT) orc/volume$(EXEEXT) \
+@HAVE_ORC_TRUE@ orc/videoscale$(EXEEXT) \
+@HAVE_ORC_TRUE@ orc/videotestsrc$(EXEEXT)
+@USE_LIBVISUAL_TRUE@am__EXEEXT_8 = elements/libvisual$(EXEEXT)
+@USE_THEORA_TRUE@am__EXEEXT_9 = pipelines/theoraenc$(EXEEXT)
+am__EXEEXT_10 = elements/adder$(EXEEXT) $(am__EXEEXT_9)
+PROGRAMS = $(noinst_PROGRAMS)
+elements_adder_SOURCES = elements/adder.c
+elements_adder_OBJECTS = adder.$(OBJEXT)
+elements_adder_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+elements_adder_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+am__dirstamp = $(am__leading_dot)dirstamp
+elements_alsa_SOURCES = elements/alsa.c
+elements_alsa_OBJECTS = elements_alsa-alsa.$(OBJEXT)
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+elements_alsa_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+elements_alsa_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(elements_alsa_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+elements_audioconvert_SOURCES = elements/audioconvert.c
+elements_audioconvert_OBJECTS = \
+ elements_audioconvert-audioconvert.$(OBJEXT)
+elements_audioconvert_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+elements_audioconvert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_audioconvert_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_audiotestsrc_SOURCES = elements/audiotestsrc.c
+elements_audiotestsrc_OBJECTS = audiotestsrc.$(OBJEXT)
+elements_audiotestsrc_LDADD = $(LDADD)
+elements_audiotestsrc_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+elements_decodebin_SOURCES = elements/decodebin.c
+elements_decodebin_OBJECTS = elements_decodebin-decodebin.$(OBJEXT)
+elements_decodebin_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+elements_decodebin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_decodebin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_encodebin_SOURCES = elements/encodebin.c
+elements_encodebin_OBJECTS = elements_encodebin-encodebin.$(OBJEXT)
+elements_encodebin_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+elements_encodebin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_encodebin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_libvisual_SOURCES = elements/libvisual.c
+elements_libvisual_OBJECTS = elements_libvisual-libvisual.$(OBJEXT)
+elements_libvisual_DEPENDENCIES = $(am__DEPENDENCIES_2)
+elements_libvisual_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_libvisual_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_vorbisdec_SOURCES = elements/vorbisdec.c
+elements_vorbisdec_OBJECTS = elements_vorbisdec-vorbisdec.$(OBJEXT)
+elements_vorbisdec_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+elements_vorbisdec_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_vorbisdec_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+elements_vorbistag_SOURCES = elements/vorbistag.c
+elements_vorbistag_OBJECTS = elements_vorbistag-vorbistag.$(OBJEXT)
+elements_vorbistag_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+elements_vorbistag_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_vorbistag_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+generic_clock_selection_SOURCES = generic/clock-selection.c
+generic_clock_selection_OBJECTS = clock-selection.$(OBJEXT)
+generic_clock_selection_LDADD = $(LDADD)
+generic_clock_selection_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+generic_states_SOURCES = generic/states.c
+generic_states_OBJECTS = states.$(OBJEXT)
+generic_states_LDADD = $(LDADD)
+generic_states_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+gst_typefindfunctions_SOURCES = gst/typefindfunctions.c
+gst_typefindfunctions_OBJECTS = \
+ gst_typefindfunctions-typefindfunctions.$(OBJEXT)
+gst_typefindfunctions_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+gst_typefindfunctions_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_typefindfunctions_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+libs_audio_SOURCES = libs/audio.c
+libs_audio_OBJECTS = libs_audio-audio.$(OBJEXT)
+libs_audio_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_audio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_audio_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_cddabasesrc_SOURCES = libs/cddabasesrc.c
+libs_cddabasesrc_OBJECTS = libs_cddabasesrc-cddabasesrc.$(OBJEXT)
+libs_cddabasesrc_DEPENDENCIES = $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_cddabasesrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libs_cddabasesrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+libs_discoverer_SOURCES = libs/discoverer.c
+libs_discoverer_OBJECTS = libs_discoverer-discoverer.$(OBJEXT)
+libs_discoverer_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_discoverer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libs_discoverer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+libs_fft_SOURCES = libs/fft.c
+libs_fft_OBJECTS = libs_fft-fft.$(OBJEXT)
+libs_fft_DEPENDENCIES = $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_fft_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_fft_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_libs_gstlibscpp_OBJECTS = gstlibscpp.$(OBJEXT)
+libs_gstlibscpp_OBJECTS = $(am_libs_gstlibscpp_OBJECTS)
+libs_gstlibscpp_LDADD = $(LDADD)
+libs_gstlibscpp_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+libs_libsabi_SOURCES = libs/libsabi.c
+libs_libsabi_OBJECTS = libs_libsabi-libsabi.$(OBJEXT)
+libs_libsabi_DEPENDENCIES = $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_libsabi_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_libsabi_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_mixer_SOURCES = libs/mixer.c
+libs_mixer_OBJECTS = libs_mixer-mixer.$(OBJEXT)
+libs_mixer_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_mixer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_mixer_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_navigation_SOURCES = libs/navigation.c
+libs_navigation_OBJECTS = libs_navigation-navigation.$(OBJEXT)
+libs_navigation_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_navigation_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libs_navigation_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+libs_netbuffer_SOURCES = libs/netbuffer.c
+libs_netbuffer_OBJECTS = libs_netbuffer-netbuffer.$(OBJEXT)
+libs_netbuffer_DEPENDENCIES = $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+libs_netbuffer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libs_netbuffer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+libs_pbutils_SOURCES = libs/pbutils.c
+libs_pbutils_OBJECTS = libs_pbutils-pbutils.$(OBJEXT)
+libs_pbutils_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_pbutils_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_pbutils_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_profile_SOURCES = libs/profile.c
+libs_profile_OBJECTS = libs_profile-profile.$(OBJEXT)
+libs_profile_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+libs_profile_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_profile_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_rtp_SOURCES = libs/rtp.c
+libs_rtp_OBJECTS = libs_rtp-rtp.$(OBJEXT)
+libs_rtp_DEPENDENCIES = $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_rtp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_rtp_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_rtsp_SOURCES = libs/rtsp.c
+libs_rtsp_OBJECTS = libs_rtsp-rtsp.$(OBJEXT)
+libs_rtsp_DEPENDENCIES = $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_rtsp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_rtsp_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_tag_SOURCES = libs/tag.c
+libs_tag_OBJECTS = libs_tag-tag.$(OBJEXT)
+libs_tag_DEPENDENCIES = $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_tag_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_tag_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_video_SOURCES = libs/video.c
+libs_video_OBJECTS = libs_video-video.$(OBJEXT)
+libs_video_DEPENDENCIES = $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_video_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_video_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libs_xmpwriter_SOURCES = libs/xmpwriter.c
+libs_xmpwriter_OBJECTS = libs_xmpwriter-xmpwriter.$(OBJEXT)
+libs_xmpwriter_DEPENDENCIES = $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_xmpwriter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libs_xmpwriter_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+nodist_orc_adder_OBJECTS = orc_adder-adder.$(OBJEXT)
+orc_adder_OBJECTS = $(nodist_orc_adder_OBJECTS)
+orc_adder_DEPENDENCIES = $(am__DEPENDENCIES_1)
+orc_adder_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(orc_adder_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+nodist_orc_audioconvert_OBJECTS = \
+ orc_audioconvert-audioconvert.$(OBJEXT)
+orc_audioconvert_OBJECTS = $(nodist_orc_audioconvert_OBJECTS)
+orc_audioconvert_DEPENDENCIES = $(am__DEPENDENCIES_1)
+orc_audioconvert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(orc_audioconvert_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+nodist_orc_videoscale_OBJECTS = orc_videoscale-videoscale.$(OBJEXT)
+orc_videoscale_OBJECTS = $(nodist_orc_videoscale_OBJECTS)
+orc_videoscale_DEPENDENCIES = $(am__DEPENDENCIES_1)
+orc_videoscale_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(orc_videoscale_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+nodist_orc_videotestsrc_OBJECTS = \
+ orc_videotestsrc-videotestsrc.$(OBJEXT)
+orc_videotestsrc_OBJECTS = $(nodist_orc_videotestsrc_OBJECTS)
+orc_videotestsrc_DEPENDENCIES = $(am__DEPENDENCIES_1)
+orc_videotestsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(orc_videotestsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+nodist_orc_volume_OBJECTS = orc_volume-volume.$(OBJEXT)
+orc_volume_OBJECTS = $(nodist_orc_volume_OBJECTS)
+orc_volume_DEPENDENCIES = $(am__DEPENDENCIES_1)
+orc_volume_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(orc_volume_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+pipelines_gio_SOURCES = pipelines/gio.c
+pipelines_gio_OBJECTS = pipelines_gio-gio.$(OBJEXT)
+pipelines_gio_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+pipelines_gio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pipelines_gio_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+pipelines_oggmux_SOURCES = pipelines/oggmux.c
+pipelines_oggmux_OBJECTS = pipelines_oggmux-oggmux.$(OBJEXT)
+pipelines_oggmux_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1)
+pipelines_oggmux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_oggmux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+pipelines_simple_launch_lines_SOURCES = \
+ pipelines/simple-launch-lines.c
+pipelines_simple_launch_lines_OBJECTS = \
+ pipelines_simple_launch_lines-simple-launch-lines.$(OBJEXT)
+pipelines_simple_launch_lines_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+pipelines_simple_launch_lines_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+pipelines_theoraenc_SOURCES = pipelines/theoraenc.c
+pipelines_theoraenc_OBJECTS = pipelines_theoraenc-theoraenc.$(OBJEXT)
+pipelines_theoraenc_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1)
+pipelines_theoraenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_theoraenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+pipelines_vorbisdec_SOURCES = pipelines/vorbisdec.c
+pipelines_vorbisdec_OBJECTS = pipelines_vorbisdec-vorbisdec.$(OBJEXT)
+pipelines_vorbisdec_LDADD = $(LDADD)
+pipelines_vorbisdec_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+pipelines_vorbisdec_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_vorbisdec_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+pipelines_vorbisenc_SOURCES = pipelines/vorbisenc.c
+pipelines_vorbisenc_OBJECTS = pipelines_vorbisenc-vorbisenc.$(OBJEXT)
+pipelines_vorbisenc_LDADD = $(LDADD)
+pipelines_vorbisenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+pipelines_vorbisenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(pipelines_vorbisenc_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = elements/adder.c elements/alsa.c elements/audioconvert.c \
+ elements/audiotestsrc.c elements/decodebin.c \
+ elements/encodebin.c elements/libvisual.c elements/vorbisdec.c \
+ elements/vorbistag.c generic/clock-selection.c \
+ generic/states.c gst/typefindfunctions.c libs/audio.c \
+ libs/cddabasesrc.c libs/discoverer.c libs/fft.c \
+ $(libs_gstlibscpp_SOURCES) libs/libsabi.c libs/mixer.c \
+ libs/navigation.c libs/netbuffer.c libs/pbutils.c \
+ libs/profile.c libs/rtp.c libs/rtsp.c libs/tag.c libs/video.c \
+ libs/xmpwriter.c $(nodist_orc_adder_SOURCES) \
+ $(nodist_orc_audioconvert_SOURCES) \
+ $(nodist_orc_videoscale_SOURCES) \
+ $(nodist_orc_videotestsrc_SOURCES) \
+ $(nodist_orc_volume_SOURCES) pipelines/gio.c \
+ pipelines/oggmux.c pipelines/simple-launch-lines.c \
+ pipelines/theoraenc.c pipelines/vorbisdec.c \
+ pipelines/vorbisenc.c
+DIST_SOURCES = elements/adder.c elements/alsa.c \
+ elements/audioconvert.c elements/audiotestsrc.c \
+ elements/decodebin.c elements/encodebin.c elements/libvisual.c \
+ elements/vorbisdec.c elements/vorbistag.c \
+ generic/clock-selection.c generic/states.c \
+ gst/typefindfunctions.c libs/audio.c libs/cddabasesrc.c \
+ libs/discoverer.c libs/fft.c $(libs_gstlibscpp_SOURCES) \
+ libs/libsabi.c libs/mixer.c libs/navigation.c libs/netbuffer.c \
+ libs/pbutils.c libs/profile.c libs/rtp.c libs/rtsp.c \
+ libs/tag.c libs/video.c libs/xmpwriter.c pipelines/gio.c \
+ pipelines/oggmux.c pipelines/simple-launch-lines.c \
+ pipelines/theoraenc.c pipelines/vorbisdec.c \
+ pipelines/vorbisenc.c
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = \
+ CK_DEFAULT_TIMEOUT=120 \
+ GST_STATE_IGNORE_ELEMENTS="$(STATE_IGNORE_ELEMENTS)" \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(GST_PLUGINS_DIR) \
+ GST_PLUGIN_LOADING_WHITELIST="gstreamer:gst-plugins-base@$(top_builddir)" \
+ GST_TAG_LICENSE_TRANSLATIONS_DICT="$(top_srcdir)/gst-libs/gst/tag/license-translations.dict"
+
+
+# ths core dumps of some machines have PIDs appended
+CLEANFILES = core.* test-registry.*
+
+# elements to ignore for the state tests
+STATE_IGNORE_ELEMENTS = cdio cdparanoiasrc libvisual_ alsasrc alsamixer alsasink
+TESTS = $(check_PROGRAMS)
+@USE_ALSA_FALSE@check_alsa =
+@USE_ALSA_TRUE@check_alsa = elements/alsa
+@USE_GIO_FALSE@check_gio =
+@USE_GIO_TRUE@check_gio = pipelines/gio
+@USE_LIBVISUAL_FALSE@check_libvisual =
+@USE_LIBVISUAL_TRUE@check_libvisual = elements/libvisual
+@USE_OGG_FALSE@check_ogg =
+@USE_OGG_TRUE@check_ogg = pipelines/oggmux
+@USE_PANGO_FALSE@check_pango =
+@USE_PANGO_TRUE@check_pango = elements/textoverlay
+@USE_VORBIS_FALSE@check_vorbis =
+@USE_VORBIS_TRUE@check_vorbis = elements/vorbisdec pipelines/vorbisenc pipelines/vorbisdec \
+@USE_VORBIS_TRUE@ elements/vorbistag
+
+@USE_THEORA_FALSE@check_theora =
+@USE_THEORA_TRUE@check_theora = pipelines/theoraenc
+@USE_THEORA_FALSE@@USE_VORBIS_TRUE@check_encodebin =
+@USE_THEORA_TRUE@@USE_VORBIS_TRUE@check_encodebin = elements/encodebin
+@USE_VORBIS_FALSE@check_encodebin =
+@USE_PLUGIN_SUBPARSE_FALSE@check_subparse =
+@USE_PLUGIN_SUBPARSE_TRUE@check_subparse = elements/subparse
+@HAVE_ORC_FALSE@check_orc =
+@HAVE_ORC_TRUE@check_orc = orc/adder orc/audioconvert orc/volume orc/videoscale orc/videotestsrc
+@HAVE_CXX_FALSE@cxx_checks =
+@HAVE_CXX_TRUE@cxx_checks = libs/gstlibscpp
+
+# TORTURE_TO_FIX = \
+# elements/adder
+
+# videoconvert takes too long, so disabled for now
+VALGRIND_TO_FIX = \
+ elements/videoconvert \
+ libs/video
+
+
+# FIXME 0.11: these tests don't even build at the moment
+ZERO_11_TO_PORT = \
+ pipelines/streamheader \
+ pipelines/basetime \
+ pipelines/capsfilter-renegotiation \
+ elements/appsink \
+ elements/appsrc \
+ elements/audiorate \
+ elements/audioresample \
+ elements/gdpdepay \
+ elements/gdppay \
+ elements/multifdsink \
+ elements/playbin \
+ elements/playbin-compressed \
+ $(check_pango) \
+ $(check_subparse) \
+ elements/videorate \
+ elements/videoscale \
+ elements/videotestsrc \
+ elements/volume
+
+
+# FIXME 0.11: these tests don't pass at the moment
+ZERO_11_TO_FIX = \
+ elements/adder \
+ $(check_theora)
+
+noinst_HEADERS = \
+ libs/struct_arm.h \
+ libs/struct_i386.h \
+ libs/struct_i386_osx.h \
+ libs/struct_x86_64.h
+
+AM_CFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+ $(GST_CFLAGS) $(GST_CHECK_CFLAGS) \
+ -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+
+AM_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+ $(GST_CXXFLAGS) $(GST_CHECK_CFLAGS) \
+ -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
+ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+
+LDADD = $(GST_LIBS) $(GST_CHECK_LIBS)
+
+# valgrind testing
+VALGRIND_TESTS_DISABLE = $(VALGRIND_TO_FIX)
+SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-base.supp
+libs_libsabi_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_libsabi_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_audio_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_audio_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_cddabasesrc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_cddabasesrc_LDADD = \
+ $(top_builddir)/gst-libs/gst/cdda/libgstcdda-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_discoverer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ -DGST_TEST_FILE="\"$(abs_top_srcdir)/tests/files/partialframe.mjpeg\""
+
+libs_discoverer_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_fft_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_fft_LDADD = \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_mixer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_mixer_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_navigation_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_navigation_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_netbuffer_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_netbuffer_LDADD = \
+ $(top_builddir)/gst-libs/gst/netbuffer/libgstnetbuffer-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+libs_rtp_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_rtp_LDADD = \
+ $(top_builddir)/gst-libs/gst/rtp/libgstrtp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_rtsp_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_rtsp_LDADD = \
+ $(top_builddir)/gst-libs/gst/rtsp/libgstrtsp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_tag_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_tag_LDADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_pbutils_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_pbutils_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+libs_profile_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_profile_LDADD = \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la $(LDADD)
+
+libs_xmpwriter_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_xmpwriter_LDADD = \
+ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc
+elements_appsink_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_appsink_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_appsrc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_appsrc_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_alsa_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_alsa_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_audioconvert_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_audioconvert_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_audiorate_LDADD = $(LDADD)
+elements_audiorate_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
+elements_libvisual_LDADD = $(LDADD)
+elements_libvisual_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
+elements_gdpdepay_LDADD = $(GST_GDP_LIBS) $(LDADD)
+elements_gdppay_LDADD = $(GST_GDP_LIBS) $(LDADD)
+elements_playbin_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_playbin_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_playbin_compressed_LDADD = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la $(GST_BASE_LIBS) $(LDADD)
+elements_playbin_compressed_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_decodebin_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_decodebin_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_encodebin_LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la $(GST_BASE_LIBS) $(LDADD)
+elements_encodebin_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_subparse_LDADD = $(LDADD)
+elements_subparse_CFLAGS = $(CFLAGS) $(AM_CFLAGS)
+elements_audioresample_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_audioresample_LDADD = \
+ $(top_builddir)/gst-libs/gst/fft/libgstfft-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_textoverlay_LDADD = $(GST_BASE_LIBS) $(LDADD)
+elements_textoverlay_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_volume_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_CONTROLLER_LIBS) \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+elements_volume_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_CONTROLLER_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_vorbisdec_LDADD = \
+ $(LDADD) \
+ $(VORBIS_LIBS) \
+ $(VORBISENC_LIBS)
+
+elements_vorbisdec_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ $(VORBIS_CFLAGS) \
+ $(CFLAGS)
+
+elements_vorbistag_LDADD = \
+ $(LDADD) \
+ $(VORBIS_LIBS) \
+ $(VORBISENC_LIBS)
+
+elements_vorbistag_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS) \
+ $(VORBIS_CFLAGS) \
+ $(CFLAGS)
+
+elements_videoscale_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+elements_videoscale_LDADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(LDADD)
+
+gst_typefindfunctions_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+gst_typefindfunctions_LDADD = $(GST_BASE_LIBS) $(LDADD)
+libs_video_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+libs_video_LDADD = \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+pipelines_gio_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS)
+pipelines_gio_LDADD = $(GIO_LIBS) $(LDADD)
+pipelines_vorbisenc_CFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+
+# this seemingly useless CFLAGS line is here only to avoid
+# vorbisdec.$(OBJEXT) by triggering creation of pipelines_vorbisdec.$(OBJEXT)
+# instead
+pipelines_vorbisdec_CFLAGS = $(AM_CFLAGS)
+pipelines_oggmux_LDADD = $(LDADD) $(OGG_LIBS)
+pipelines_oggmux_CFLAGS = $(AM_CFLAGS) $(OGG_CFLAGS)
+pipelines_theoraenc_CFLAGS = $(AM_CFLAGS) $(THEORA_CFLAGS)
+pipelines_theoraenc_LDADD = $(LDADD) $(THEORA_LIBS)
+pipelines_simple_launch_lines_CFLAGS = \
+ $(GST_BASE_CFLAGS) \
+ $(AM_CFLAGS)
+
+pipelines_simple_launch_lines_LDADD = \
+ $(top_builddir)/gst-libs/gst/audio/libgstaudio-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(LDADD)
+
+orc_adder_CFLAGS = $(ORC_CFLAGS)
+orc_adder_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_adder_SOURCES = orc/adder.c
+orc_audioconvert_CFLAGS = $(ORC_CFLAGS)
+orc_audioconvert_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_audioconvert_SOURCES = orc/audioconvert.c
+orc_volume_CFLAGS = $(ORC_CFLAGS)
+orc_volume_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_volume_SOURCES = orc/volume.c
+orc_videoscale_CFLAGS = $(ORC_CFLAGS)
+orc_videoscale_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_videoscale_SOURCES = orc/videoscale.c
+orc_videotestsrc_CFLAGS = $(ORC_CFLAGS)
+orc_videotestsrc_LDADD = $(ORC_LIBS) -lorc-test-0.4
+nodist_orc_videotestsrc_SOURCES = orc/videotestsrc.c
+EXTRA_DIST = gst-plugins-base.supp
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .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_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-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/adder$(EXEEXT): $(elements_adder_OBJECTS) $(elements_adder_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/adder$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_adder_OBJECTS) $(elements_adder_LDADD) $(LIBS)
+elements/alsa$(EXEEXT): $(elements_alsa_OBJECTS) $(elements_alsa_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/alsa$(EXEEXT)
+ $(AM_V_CCLD)$(elements_alsa_LINK) $(elements_alsa_OBJECTS) $(elements_alsa_LDADD) $(LIBS)
+elements/audioconvert$(EXEEXT): $(elements_audioconvert_OBJECTS) $(elements_audioconvert_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/audioconvert$(EXEEXT)
+ $(AM_V_CCLD)$(elements_audioconvert_LINK) $(elements_audioconvert_OBJECTS) $(elements_audioconvert_LDADD) $(LIBS)
+elements/audiotestsrc$(EXEEXT): $(elements_audiotestsrc_OBJECTS) $(elements_audiotestsrc_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/audiotestsrc$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_audiotestsrc_OBJECTS) $(elements_audiotestsrc_LDADD) $(LIBS)
+elements/decodebin$(EXEEXT): $(elements_decodebin_OBJECTS) $(elements_decodebin_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/decodebin$(EXEEXT)
+ $(AM_V_CCLD)$(elements_decodebin_LINK) $(elements_decodebin_OBJECTS) $(elements_decodebin_LDADD) $(LIBS)
+elements/encodebin$(EXEEXT): $(elements_encodebin_OBJECTS) $(elements_encodebin_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/encodebin$(EXEEXT)
+ $(AM_V_CCLD)$(elements_encodebin_LINK) $(elements_encodebin_OBJECTS) $(elements_encodebin_LDADD) $(LIBS)
+elements/libvisual$(EXEEXT): $(elements_libvisual_OBJECTS) $(elements_libvisual_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/libvisual$(EXEEXT)
+ $(AM_V_CCLD)$(elements_libvisual_LINK) $(elements_libvisual_OBJECTS) $(elements_libvisual_LDADD) $(LIBS)
+elements/vorbisdec$(EXEEXT): $(elements_vorbisdec_OBJECTS) $(elements_vorbisdec_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/vorbisdec$(EXEEXT)
+ $(AM_V_CCLD)$(elements_vorbisdec_LINK) $(elements_vorbisdec_OBJECTS) $(elements_vorbisdec_LDADD) $(LIBS)
+elements/vorbistag$(EXEEXT): $(elements_vorbistag_OBJECTS) $(elements_vorbistag_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/vorbistag$(EXEEXT)
+ $(AM_V_CCLD)$(elements_vorbistag_LINK) $(elements_vorbistag_OBJECTS) $(elements_vorbistag_LDADD) $(LIBS)
+generic/$(am__dirstamp):
+ @$(MKDIR_P) generic
+ @: > generic/$(am__dirstamp)
+generic/clock-selection$(EXEEXT): $(generic_clock_selection_OBJECTS) $(generic_clock_selection_DEPENDENCIES) generic/$(am__dirstamp)
+ @rm -f generic/clock-selection$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(generic_clock_selection_OBJECTS) $(generic_clock_selection_LDADD) $(LIBS)
+generic/states$(EXEEXT): $(generic_states_OBJECTS) $(generic_states_DEPENDENCIES) generic/$(am__dirstamp)
+ @rm -f generic/states$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(generic_states_OBJECTS) $(generic_states_LDADD) $(LIBS)
+gst/$(am__dirstamp):
+ @$(MKDIR_P) gst
+ @: > gst/$(am__dirstamp)
+gst/typefindfunctions$(EXEEXT): $(gst_typefindfunctions_OBJECTS) $(gst_typefindfunctions_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/typefindfunctions$(EXEEXT)
+ $(AM_V_CCLD)$(gst_typefindfunctions_LINK) $(gst_typefindfunctions_OBJECTS) $(gst_typefindfunctions_LDADD) $(LIBS)
+libs/$(am__dirstamp):
+ @$(MKDIR_P) libs
+ @: > libs/$(am__dirstamp)
+libs/audio$(EXEEXT): $(libs_audio_OBJECTS) $(libs_audio_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/audio$(EXEEXT)
+ $(AM_V_CCLD)$(libs_audio_LINK) $(libs_audio_OBJECTS) $(libs_audio_LDADD) $(LIBS)
+libs/cddabasesrc$(EXEEXT): $(libs_cddabasesrc_OBJECTS) $(libs_cddabasesrc_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/cddabasesrc$(EXEEXT)
+ $(AM_V_CCLD)$(libs_cddabasesrc_LINK) $(libs_cddabasesrc_OBJECTS) $(libs_cddabasesrc_LDADD) $(LIBS)
+libs/discoverer$(EXEEXT): $(libs_discoverer_OBJECTS) $(libs_discoverer_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/discoverer$(EXEEXT)
+ $(AM_V_CCLD)$(libs_discoverer_LINK) $(libs_discoverer_OBJECTS) $(libs_discoverer_LDADD) $(LIBS)
+libs/fft$(EXEEXT): $(libs_fft_OBJECTS) $(libs_fft_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/fft$(EXEEXT)
+ $(AM_V_CCLD)$(libs_fft_LINK) $(libs_fft_OBJECTS) $(libs_fft_LDADD) $(LIBS)
+libs/gstlibscpp$(EXEEXT): $(libs_gstlibscpp_OBJECTS) $(libs_gstlibscpp_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/gstlibscpp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(libs_gstlibscpp_OBJECTS) $(libs_gstlibscpp_LDADD) $(LIBS)
+libs/libsabi$(EXEEXT): $(libs_libsabi_OBJECTS) $(libs_libsabi_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/libsabi$(EXEEXT)
+ $(AM_V_CCLD)$(libs_libsabi_LINK) $(libs_libsabi_OBJECTS) $(libs_libsabi_LDADD) $(LIBS)
+libs/mixer$(EXEEXT): $(libs_mixer_OBJECTS) $(libs_mixer_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/mixer$(EXEEXT)
+ $(AM_V_CCLD)$(libs_mixer_LINK) $(libs_mixer_OBJECTS) $(libs_mixer_LDADD) $(LIBS)
+libs/navigation$(EXEEXT): $(libs_navigation_OBJECTS) $(libs_navigation_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/navigation$(EXEEXT)
+ $(AM_V_CCLD)$(libs_navigation_LINK) $(libs_navigation_OBJECTS) $(libs_navigation_LDADD) $(LIBS)
+libs/netbuffer$(EXEEXT): $(libs_netbuffer_OBJECTS) $(libs_netbuffer_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/netbuffer$(EXEEXT)
+ $(AM_V_CCLD)$(libs_netbuffer_LINK) $(libs_netbuffer_OBJECTS) $(libs_netbuffer_LDADD) $(LIBS)
+libs/pbutils$(EXEEXT): $(libs_pbutils_OBJECTS) $(libs_pbutils_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/pbutils$(EXEEXT)
+ $(AM_V_CCLD)$(libs_pbutils_LINK) $(libs_pbutils_OBJECTS) $(libs_pbutils_LDADD) $(LIBS)
+libs/profile$(EXEEXT): $(libs_profile_OBJECTS) $(libs_profile_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/profile$(EXEEXT)
+ $(AM_V_CCLD)$(libs_profile_LINK) $(libs_profile_OBJECTS) $(libs_profile_LDADD) $(LIBS)
+libs/rtp$(EXEEXT): $(libs_rtp_OBJECTS) $(libs_rtp_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/rtp$(EXEEXT)
+ $(AM_V_CCLD)$(libs_rtp_LINK) $(libs_rtp_OBJECTS) $(libs_rtp_LDADD) $(LIBS)
+libs/rtsp$(EXEEXT): $(libs_rtsp_OBJECTS) $(libs_rtsp_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/rtsp$(EXEEXT)
+ $(AM_V_CCLD)$(libs_rtsp_LINK) $(libs_rtsp_OBJECTS) $(libs_rtsp_LDADD) $(LIBS)
+libs/tag$(EXEEXT): $(libs_tag_OBJECTS) $(libs_tag_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/tag$(EXEEXT)
+ $(AM_V_CCLD)$(libs_tag_LINK) $(libs_tag_OBJECTS) $(libs_tag_LDADD) $(LIBS)
+libs/video$(EXEEXT): $(libs_video_OBJECTS) $(libs_video_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/video$(EXEEXT)
+ $(AM_V_CCLD)$(libs_video_LINK) $(libs_video_OBJECTS) $(libs_video_LDADD) $(LIBS)
+libs/xmpwriter$(EXEEXT): $(libs_xmpwriter_OBJECTS) $(libs_xmpwriter_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/xmpwriter$(EXEEXT)
+ $(AM_V_CCLD)$(libs_xmpwriter_LINK) $(libs_xmpwriter_OBJECTS) $(libs_xmpwriter_LDADD) $(LIBS)
+orc/$(am__dirstamp):
+ @$(MKDIR_P) orc
+ @: > orc/$(am__dirstamp)
+orc/adder$(EXEEXT): $(orc_adder_OBJECTS) $(orc_adder_DEPENDENCIES) orc/$(am__dirstamp)
+ @rm -f orc/adder$(EXEEXT)
+ $(AM_V_CCLD)$(orc_adder_LINK) $(orc_adder_OBJECTS) $(orc_adder_LDADD) $(LIBS)
+orc/audioconvert$(EXEEXT): $(orc_audioconvert_OBJECTS) $(orc_audioconvert_DEPENDENCIES) orc/$(am__dirstamp)
+ @rm -f orc/audioconvert$(EXEEXT)
+ $(AM_V_CCLD)$(orc_audioconvert_LINK) $(orc_audioconvert_OBJECTS) $(orc_audioconvert_LDADD) $(LIBS)
+orc/videoscale$(EXEEXT): $(orc_videoscale_OBJECTS) $(orc_videoscale_DEPENDENCIES) orc/$(am__dirstamp)
+ @rm -f orc/videoscale$(EXEEXT)
+ $(AM_V_CCLD)$(orc_videoscale_LINK) $(orc_videoscale_OBJECTS) $(orc_videoscale_LDADD) $(LIBS)
+orc/videotestsrc$(EXEEXT): $(orc_videotestsrc_OBJECTS) $(orc_videotestsrc_DEPENDENCIES) orc/$(am__dirstamp)
+ @rm -f orc/videotestsrc$(EXEEXT)
+ $(AM_V_CCLD)$(orc_videotestsrc_LINK) $(orc_videotestsrc_OBJECTS) $(orc_videotestsrc_LDADD) $(LIBS)
+orc/volume$(EXEEXT): $(orc_volume_OBJECTS) $(orc_volume_DEPENDENCIES) orc/$(am__dirstamp)
+ @rm -f orc/volume$(EXEEXT)
+ $(AM_V_CCLD)$(orc_volume_LINK) $(orc_volume_OBJECTS) $(orc_volume_LDADD) $(LIBS)
+pipelines/$(am__dirstamp):
+ @$(MKDIR_P) pipelines
+ @: > pipelines/$(am__dirstamp)
+pipelines/gio$(EXEEXT): $(pipelines_gio_OBJECTS) $(pipelines_gio_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/gio$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_gio_LINK) $(pipelines_gio_OBJECTS) $(pipelines_gio_LDADD) $(LIBS)
+pipelines/oggmux$(EXEEXT): $(pipelines_oggmux_OBJECTS) $(pipelines_oggmux_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/oggmux$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_oggmux_LINK) $(pipelines_oggmux_OBJECTS) $(pipelines_oggmux_LDADD) $(LIBS)
+pipelines/simple-launch-lines$(EXEEXT): $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/simple-launch-lines$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_simple_launch_lines_LINK) $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_LDADD) $(LIBS)
+pipelines/theoraenc$(EXEEXT): $(pipelines_theoraenc_OBJECTS) $(pipelines_theoraenc_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/theoraenc$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_theoraenc_LINK) $(pipelines_theoraenc_OBJECTS) $(pipelines_theoraenc_LDADD) $(LIBS)
+pipelines/vorbisdec$(EXEEXT): $(pipelines_vorbisdec_OBJECTS) $(pipelines_vorbisdec_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/vorbisdec$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_vorbisdec_LINK) $(pipelines_vorbisdec_OBJECTS) $(pipelines_vorbisdec_LDADD) $(LIBS)
+pipelines/vorbisenc$(EXEEXT): $(pipelines_vorbisenc_OBJECTS) $(pipelines_vorbisenc_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/vorbisenc$(EXEEXT)
+ $(AM_V_CCLD)$(pipelines_vorbisenc_LINK) $(pipelines_vorbisenc_OBJECTS) $(pipelines_vorbisenc_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adder.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiotestsrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clock-selection.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_alsa-alsa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_audioconvert-audioconvert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_decodebin-decodebin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_encodebin-encodebin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_libvisual-libvisual.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_vorbisdec-vorbisdec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_vorbistag-vorbistag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_typefindfunctions-typefindfunctions.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstlibscpp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_audio-audio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_cddabasesrc-cddabasesrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_discoverer-discoverer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_fft-fft.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_libsabi-libsabi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_mixer-mixer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_navigation-navigation.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_netbuffer-netbuffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_pbutils-pbutils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_profile-profile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_rtp-rtp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_rtsp-rtsp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_tag-tag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_video-video.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libs_xmpwriter-xmpwriter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_adder-adder.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_audioconvert-audioconvert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videoscale-videoscale.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videotestsrc-videotestsrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_volume-volume.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_gio-gio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_oggmux-oggmux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_theoraenc-theoraenc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_vorbisdec-vorbisdec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_vorbisenc-vorbisenc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/states.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+adder.o: elements/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT adder.o -MD -MP -MF $(DEPDIR)/adder.Tpo -c -o adder.o `test -f 'elements/adder.c' || echo '$(srcdir)/'`elements/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adder.Tpo $(DEPDIR)/adder.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/adder.c' object='adder.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o adder.o `test -f 'elements/adder.c' || echo '$(srcdir)/'`elements/adder.c
+
+adder.obj: elements/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT adder.obj -MD -MP -MF $(DEPDIR)/adder.Tpo -c -o adder.obj `if test -f 'elements/adder.c'; then $(CYGPATH_W) 'elements/adder.c'; else $(CYGPATH_W) '$(srcdir)/elements/adder.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adder.Tpo $(DEPDIR)/adder.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/adder.c' object='adder.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o adder.obj `if test -f 'elements/adder.c'; then $(CYGPATH_W) 'elements/adder.c'; else $(CYGPATH_W) '$(srcdir)/elements/adder.c'; fi`
+
+elements_alsa-alsa.o: elements/alsa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alsa_CFLAGS) $(CFLAGS) -MT elements_alsa-alsa.o -MD -MP -MF $(DEPDIR)/elements_alsa-alsa.Tpo -c -o elements_alsa-alsa.o `test -f 'elements/alsa.c' || echo '$(srcdir)/'`elements/alsa.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alsa-alsa.Tpo $(DEPDIR)/elements_alsa-alsa.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/alsa.c' object='elements_alsa-alsa.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alsa_CFLAGS) $(CFLAGS) -c -o elements_alsa-alsa.o `test -f 'elements/alsa.c' || echo '$(srcdir)/'`elements/alsa.c
+
+elements_alsa-alsa.obj: elements/alsa.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alsa_CFLAGS) $(CFLAGS) -MT elements_alsa-alsa.obj -MD -MP -MF $(DEPDIR)/elements_alsa-alsa.Tpo -c -o elements_alsa-alsa.obj `if test -f 'elements/alsa.c'; then $(CYGPATH_W) 'elements/alsa.c'; else $(CYGPATH_W) '$(srcdir)/elements/alsa.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alsa-alsa.Tpo $(DEPDIR)/elements_alsa-alsa.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/alsa.c' object='elements_alsa-alsa.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alsa_CFLAGS) $(CFLAGS) -c -o elements_alsa-alsa.obj `if test -f 'elements/alsa.c'; then $(CYGPATH_W) 'elements/alsa.c'; else $(CYGPATH_W) '$(srcdir)/elements/alsa.c'; fi`
+
+elements_audioconvert-audioconvert.o: elements/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audioconvert_CFLAGS) $(CFLAGS) -MT elements_audioconvert-audioconvert.o -MD -MP -MF $(DEPDIR)/elements_audioconvert-audioconvert.Tpo -c -o elements_audioconvert-audioconvert.o `test -f 'elements/audioconvert.c' || echo '$(srcdir)/'`elements/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audioconvert-audioconvert.Tpo $(DEPDIR)/elements_audioconvert-audioconvert.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/audioconvert.c' object='elements_audioconvert-audioconvert.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audioconvert_CFLAGS) $(CFLAGS) -c -o elements_audioconvert-audioconvert.o `test -f 'elements/audioconvert.c' || echo '$(srcdir)/'`elements/audioconvert.c
+
+elements_audioconvert-audioconvert.obj: elements/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audioconvert_CFLAGS) $(CFLAGS) -MT elements_audioconvert-audioconvert.obj -MD -MP -MF $(DEPDIR)/elements_audioconvert-audioconvert.Tpo -c -o elements_audioconvert-audioconvert.obj `if test -f 'elements/audioconvert.c'; then $(CYGPATH_W) 'elements/audioconvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioconvert.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audioconvert-audioconvert.Tpo $(DEPDIR)/elements_audioconvert-audioconvert.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/audioconvert.c' object='elements_audioconvert-audioconvert.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audioconvert_CFLAGS) $(CFLAGS) -c -o elements_audioconvert-audioconvert.obj `if test -f 'elements/audioconvert.c'; then $(CYGPATH_W) 'elements/audioconvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioconvert.c'; fi`
+
+audiotestsrc.o: elements/audiotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiotestsrc.o -MD -MP -MF $(DEPDIR)/audiotestsrc.Tpo -c -o audiotestsrc.o `test -f 'elements/audiotestsrc.c' || echo '$(srcdir)/'`elements/audiotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiotestsrc.Tpo $(DEPDIR)/audiotestsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/audiotestsrc.c' object='audiotestsrc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiotestsrc.o `test -f 'elements/audiotestsrc.c' || echo '$(srcdir)/'`elements/audiotestsrc.c
+
+audiotestsrc.obj: elements/audiotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiotestsrc.obj -MD -MP -MF $(DEPDIR)/audiotestsrc.Tpo -c -o audiotestsrc.obj `if test -f 'elements/audiotestsrc.c'; then $(CYGPATH_W) 'elements/audiotestsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiotestsrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiotestsrc.Tpo $(DEPDIR)/audiotestsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/audiotestsrc.c' object='audiotestsrc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiotestsrc.obj `if test -f 'elements/audiotestsrc.c'; then $(CYGPATH_W) 'elements/audiotestsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiotestsrc.c'; fi`
+
+elements_decodebin-decodebin.o: elements/decodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_decodebin_CFLAGS) $(CFLAGS) -MT elements_decodebin-decodebin.o -MD -MP -MF $(DEPDIR)/elements_decodebin-decodebin.Tpo -c -o elements_decodebin-decodebin.o `test -f 'elements/decodebin.c' || echo '$(srcdir)/'`elements/decodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_decodebin-decodebin.Tpo $(DEPDIR)/elements_decodebin-decodebin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/decodebin.c' object='elements_decodebin-decodebin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_decodebin_CFLAGS) $(CFLAGS) -c -o elements_decodebin-decodebin.o `test -f 'elements/decodebin.c' || echo '$(srcdir)/'`elements/decodebin.c
+
+elements_decodebin-decodebin.obj: elements/decodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_decodebin_CFLAGS) $(CFLAGS) -MT elements_decodebin-decodebin.obj -MD -MP -MF $(DEPDIR)/elements_decodebin-decodebin.Tpo -c -o elements_decodebin-decodebin.obj `if test -f 'elements/decodebin.c'; then $(CYGPATH_W) 'elements/decodebin.c'; else $(CYGPATH_W) '$(srcdir)/elements/decodebin.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_decodebin-decodebin.Tpo $(DEPDIR)/elements_decodebin-decodebin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/decodebin.c' object='elements_decodebin-decodebin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_decodebin_CFLAGS) $(CFLAGS) -c -o elements_decodebin-decodebin.obj `if test -f 'elements/decodebin.c'; then $(CYGPATH_W) 'elements/decodebin.c'; else $(CYGPATH_W) '$(srcdir)/elements/decodebin.c'; fi`
+
+elements_encodebin-encodebin.o: elements/encodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_encodebin_CFLAGS) $(CFLAGS) -MT elements_encodebin-encodebin.o -MD -MP -MF $(DEPDIR)/elements_encodebin-encodebin.Tpo -c -o elements_encodebin-encodebin.o `test -f 'elements/encodebin.c' || echo '$(srcdir)/'`elements/encodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_encodebin-encodebin.Tpo $(DEPDIR)/elements_encodebin-encodebin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/encodebin.c' object='elements_encodebin-encodebin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_encodebin_CFLAGS) $(CFLAGS) -c -o elements_encodebin-encodebin.o `test -f 'elements/encodebin.c' || echo '$(srcdir)/'`elements/encodebin.c
+
+elements_encodebin-encodebin.obj: elements/encodebin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_encodebin_CFLAGS) $(CFLAGS) -MT elements_encodebin-encodebin.obj -MD -MP -MF $(DEPDIR)/elements_encodebin-encodebin.Tpo -c -o elements_encodebin-encodebin.obj `if test -f 'elements/encodebin.c'; then $(CYGPATH_W) 'elements/encodebin.c'; else $(CYGPATH_W) '$(srcdir)/elements/encodebin.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_encodebin-encodebin.Tpo $(DEPDIR)/elements_encodebin-encodebin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/encodebin.c' object='elements_encodebin-encodebin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_encodebin_CFLAGS) $(CFLAGS) -c -o elements_encodebin-encodebin.obj `if test -f 'elements/encodebin.c'; then $(CYGPATH_W) 'elements/encodebin.c'; else $(CYGPATH_W) '$(srcdir)/elements/encodebin.c'; fi`
+
+elements_libvisual-libvisual.o: elements/libvisual.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_libvisual_CFLAGS) $(CFLAGS) -MT elements_libvisual-libvisual.o -MD -MP -MF $(DEPDIR)/elements_libvisual-libvisual.Tpo -c -o elements_libvisual-libvisual.o `test -f 'elements/libvisual.c' || echo '$(srcdir)/'`elements/libvisual.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_libvisual-libvisual.Tpo $(DEPDIR)/elements_libvisual-libvisual.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/libvisual.c' object='elements_libvisual-libvisual.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_libvisual_CFLAGS) $(CFLAGS) -c -o elements_libvisual-libvisual.o `test -f 'elements/libvisual.c' || echo '$(srcdir)/'`elements/libvisual.c
+
+elements_libvisual-libvisual.obj: elements/libvisual.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_libvisual_CFLAGS) $(CFLAGS) -MT elements_libvisual-libvisual.obj -MD -MP -MF $(DEPDIR)/elements_libvisual-libvisual.Tpo -c -o elements_libvisual-libvisual.obj `if test -f 'elements/libvisual.c'; then $(CYGPATH_W) 'elements/libvisual.c'; else $(CYGPATH_W) '$(srcdir)/elements/libvisual.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_libvisual-libvisual.Tpo $(DEPDIR)/elements_libvisual-libvisual.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/libvisual.c' object='elements_libvisual-libvisual.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_libvisual_CFLAGS) $(CFLAGS) -c -o elements_libvisual-libvisual.obj `if test -f 'elements/libvisual.c'; then $(CYGPATH_W) 'elements/libvisual.c'; else $(CYGPATH_W) '$(srcdir)/elements/libvisual.c'; fi`
+
+elements_vorbisdec-vorbisdec.o: elements/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbisdec_CFLAGS) $(CFLAGS) -MT elements_vorbisdec-vorbisdec.o -MD -MP -MF $(DEPDIR)/elements_vorbisdec-vorbisdec.Tpo -c -o elements_vorbisdec-vorbisdec.o `test -f 'elements/vorbisdec.c' || echo '$(srcdir)/'`elements/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_vorbisdec-vorbisdec.Tpo $(DEPDIR)/elements_vorbisdec-vorbisdec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/vorbisdec.c' object='elements_vorbisdec-vorbisdec.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbisdec_CFLAGS) $(CFLAGS) -c -o elements_vorbisdec-vorbisdec.o `test -f 'elements/vorbisdec.c' || echo '$(srcdir)/'`elements/vorbisdec.c
+
+elements_vorbisdec-vorbisdec.obj: elements/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbisdec_CFLAGS) $(CFLAGS) -MT elements_vorbisdec-vorbisdec.obj -MD -MP -MF $(DEPDIR)/elements_vorbisdec-vorbisdec.Tpo -c -o elements_vorbisdec-vorbisdec.obj `if test -f 'elements/vorbisdec.c'; then $(CYGPATH_W) 'elements/vorbisdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/vorbisdec.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_vorbisdec-vorbisdec.Tpo $(DEPDIR)/elements_vorbisdec-vorbisdec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/vorbisdec.c' object='elements_vorbisdec-vorbisdec.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbisdec_CFLAGS) $(CFLAGS) -c -o elements_vorbisdec-vorbisdec.obj `if test -f 'elements/vorbisdec.c'; then $(CYGPATH_W) 'elements/vorbisdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/vorbisdec.c'; fi`
+
+elements_vorbistag-vorbistag.o: elements/vorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbistag_CFLAGS) $(CFLAGS) -MT elements_vorbistag-vorbistag.o -MD -MP -MF $(DEPDIR)/elements_vorbistag-vorbistag.Tpo -c -o elements_vorbistag-vorbistag.o `test -f 'elements/vorbistag.c' || echo '$(srcdir)/'`elements/vorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_vorbistag-vorbistag.Tpo $(DEPDIR)/elements_vorbistag-vorbistag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/vorbistag.c' object='elements_vorbistag-vorbistag.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbistag_CFLAGS) $(CFLAGS) -c -o elements_vorbistag-vorbistag.o `test -f 'elements/vorbistag.c' || echo '$(srcdir)/'`elements/vorbistag.c
+
+elements_vorbistag-vorbistag.obj: elements/vorbistag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbistag_CFLAGS) $(CFLAGS) -MT elements_vorbistag-vorbistag.obj -MD -MP -MF $(DEPDIR)/elements_vorbistag-vorbistag.Tpo -c -o elements_vorbistag-vorbistag.obj `if test -f 'elements/vorbistag.c'; then $(CYGPATH_W) 'elements/vorbistag.c'; else $(CYGPATH_W) '$(srcdir)/elements/vorbistag.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_vorbistag-vorbistag.Tpo $(DEPDIR)/elements_vorbistag-vorbistag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/vorbistag.c' object='elements_vorbistag-vorbistag.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_vorbistag_CFLAGS) $(CFLAGS) -c -o elements_vorbistag-vorbistag.obj `if test -f 'elements/vorbistag.c'; then $(CYGPATH_W) 'elements/vorbistag.c'; else $(CYGPATH_W) '$(srcdir)/elements/vorbistag.c'; fi`
+
+clock-selection.o: generic/clock-selection.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clock-selection.o -MD -MP -MF $(DEPDIR)/clock-selection.Tpo -c -o clock-selection.o `test -f 'generic/clock-selection.c' || echo '$(srcdir)/'`generic/clock-selection.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clock-selection.Tpo $(DEPDIR)/clock-selection.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/clock-selection.c' object='clock-selection.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clock-selection.o `test -f 'generic/clock-selection.c' || echo '$(srcdir)/'`generic/clock-selection.c
+
+clock-selection.obj: generic/clock-selection.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clock-selection.obj -MD -MP -MF $(DEPDIR)/clock-selection.Tpo -c -o clock-selection.obj `if test -f 'generic/clock-selection.c'; then $(CYGPATH_W) 'generic/clock-selection.c'; else $(CYGPATH_W) '$(srcdir)/generic/clock-selection.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clock-selection.Tpo $(DEPDIR)/clock-selection.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/clock-selection.c' object='clock-selection.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clock-selection.obj `if test -f 'generic/clock-selection.c'; then $(CYGPATH_W) 'generic/clock-selection.c'; else $(CYGPATH_W) '$(srcdir)/generic/clock-selection.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/states.c' object='states.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/states.c' object='states.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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`
+
+gst_typefindfunctions-typefindfunctions.o: gst/typefindfunctions.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefindfunctions_CFLAGS) $(CFLAGS) -MT gst_typefindfunctions-typefindfunctions.o -MD -MP -MF $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Tpo -c -o gst_typefindfunctions-typefindfunctions.o `test -f 'gst/typefindfunctions.c' || echo '$(srcdir)/'`gst/typefindfunctions.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Tpo $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/typefindfunctions.c' object='gst_typefindfunctions-typefindfunctions.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefindfunctions_CFLAGS) $(CFLAGS) -c -o gst_typefindfunctions-typefindfunctions.o `test -f 'gst/typefindfunctions.c' || echo '$(srcdir)/'`gst/typefindfunctions.c
+
+gst_typefindfunctions-typefindfunctions.obj: gst/typefindfunctions.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefindfunctions_CFLAGS) $(CFLAGS) -MT gst_typefindfunctions-typefindfunctions.obj -MD -MP -MF $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Tpo -c -o gst_typefindfunctions-typefindfunctions.obj `if test -f 'gst/typefindfunctions.c'; then $(CYGPATH_W) 'gst/typefindfunctions.c'; else $(CYGPATH_W) '$(srcdir)/gst/typefindfunctions.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Tpo $(DEPDIR)/gst_typefindfunctions-typefindfunctions.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/typefindfunctions.c' object='gst_typefindfunctions-typefindfunctions.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefindfunctions_CFLAGS) $(CFLAGS) -c -o gst_typefindfunctions-typefindfunctions.obj `if test -f 'gst/typefindfunctions.c'; then $(CYGPATH_W) 'gst/typefindfunctions.c'; else $(CYGPATH_W) '$(srcdir)/gst/typefindfunctions.c'; fi`
+
+libs_audio-audio.o: libs/audio.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_audio_CFLAGS) $(CFLAGS) -MT libs_audio-audio.o -MD -MP -MF $(DEPDIR)/libs_audio-audio.Tpo -c -o libs_audio-audio.o `test -f 'libs/audio.c' || echo '$(srcdir)/'`libs/audio.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_audio-audio.Tpo $(DEPDIR)/libs_audio-audio.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/audio.c' object='libs_audio-audio.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_audio_CFLAGS) $(CFLAGS) -c -o libs_audio-audio.o `test -f 'libs/audio.c' || echo '$(srcdir)/'`libs/audio.c
+
+libs_audio-audio.obj: libs/audio.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_audio_CFLAGS) $(CFLAGS) -MT libs_audio-audio.obj -MD -MP -MF $(DEPDIR)/libs_audio-audio.Tpo -c -o libs_audio-audio.obj `if test -f 'libs/audio.c'; then $(CYGPATH_W) 'libs/audio.c'; else $(CYGPATH_W) '$(srcdir)/libs/audio.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_audio-audio.Tpo $(DEPDIR)/libs_audio-audio.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/audio.c' object='libs_audio-audio.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_audio_CFLAGS) $(CFLAGS) -c -o libs_audio-audio.obj `if test -f 'libs/audio.c'; then $(CYGPATH_W) 'libs/audio.c'; else $(CYGPATH_W) '$(srcdir)/libs/audio.c'; fi`
+
+libs_cddabasesrc-cddabasesrc.o: libs/cddabasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_cddabasesrc_CFLAGS) $(CFLAGS) -MT libs_cddabasesrc-cddabasesrc.o -MD -MP -MF $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Tpo -c -o libs_cddabasesrc-cddabasesrc.o `test -f 'libs/cddabasesrc.c' || echo '$(srcdir)/'`libs/cddabasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Tpo $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/cddabasesrc.c' object='libs_cddabasesrc-cddabasesrc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_cddabasesrc_CFLAGS) $(CFLAGS) -c -o libs_cddabasesrc-cddabasesrc.o `test -f 'libs/cddabasesrc.c' || echo '$(srcdir)/'`libs/cddabasesrc.c
+
+libs_cddabasesrc-cddabasesrc.obj: libs/cddabasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_cddabasesrc_CFLAGS) $(CFLAGS) -MT libs_cddabasesrc-cddabasesrc.obj -MD -MP -MF $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Tpo -c -o libs_cddabasesrc-cddabasesrc.obj `if test -f 'libs/cddabasesrc.c'; then $(CYGPATH_W) 'libs/cddabasesrc.c'; else $(CYGPATH_W) '$(srcdir)/libs/cddabasesrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Tpo $(DEPDIR)/libs_cddabasesrc-cddabasesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/cddabasesrc.c' object='libs_cddabasesrc-cddabasesrc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_cddabasesrc_CFLAGS) $(CFLAGS) -c -o libs_cddabasesrc-cddabasesrc.obj `if test -f 'libs/cddabasesrc.c'; then $(CYGPATH_W) 'libs/cddabasesrc.c'; else $(CYGPATH_W) '$(srcdir)/libs/cddabasesrc.c'; fi`
+
+libs_discoverer-discoverer.o: libs/discoverer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_discoverer_CFLAGS) $(CFLAGS) -MT libs_discoverer-discoverer.o -MD -MP -MF $(DEPDIR)/libs_discoverer-discoverer.Tpo -c -o libs_discoverer-discoverer.o `test -f 'libs/discoverer.c' || echo '$(srcdir)/'`libs/discoverer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_discoverer-discoverer.Tpo $(DEPDIR)/libs_discoverer-discoverer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/discoverer.c' object='libs_discoverer-discoverer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_discoverer_CFLAGS) $(CFLAGS) -c -o libs_discoverer-discoverer.o `test -f 'libs/discoverer.c' || echo '$(srcdir)/'`libs/discoverer.c
+
+libs_discoverer-discoverer.obj: libs/discoverer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_discoverer_CFLAGS) $(CFLAGS) -MT libs_discoverer-discoverer.obj -MD -MP -MF $(DEPDIR)/libs_discoverer-discoverer.Tpo -c -o libs_discoverer-discoverer.obj `if test -f 'libs/discoverer.c'; then $(CYGPATH_W) 'libs/discoverer.c'; else $(CYGPATH_W) '$(srcdir)/libs/discoverer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_discoverer-discoverer.Tpo $(DEPDIR)/libs_discoverer-discoverer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/discoverer.c' object='libs_discoverer-discoverer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_discoverer_CFLAGS) $(CFLAGS) -c -o libs_discoverer-discoverer.obj `if test -f 'libs/discoverer.c'; then $(CYGPATH_W) 'libs/discoverer.c'; else $(CYGPATH_W) '$(srcdir)/libs/discoverer.c'; fi`
+
+libs_fft-fft.o: libs/fft.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_fft_CFLAGS) $(CFLAGS) -MT libs_fft-fft.o -MD -MP -MF $(DEPDIR)/libs_fft-fft.Tpo -c -o libs_fft-fft.o `test -f 'libs/fft.c' || echo '$(srcdir)/'`libs/fft.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_fft-fft.Tpo $(DEPDIR)/libs_fft-fft.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/fft.c' object='libs_fft-fft.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_fft_CFLAGS) $(CFLAGS) -c -o libs_fft-fft.o `test -f 'libs/fft.c' || echo '$(srcdir)/'`libs/fft.c
+
+libs_fft-fft.obj: libs/fft.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_fft_CFLAGS) $(CFLAGS) -MT libs_fft-fft.obj -MD -MP -MF $(DEPDIR)/libs_fft-fft.Tpo -c -o libs_fft-fft.obj `if test -f 'libs/fft.c'; then $(CYGPATH_W) 'libs/fft.c'; else $(CYGPATH_W) '$(srcdir)/libs/fft.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_fft-fft.Tpo $(DEPDIR)/libs_fft-fft.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/fft.c' object='libs_fft-fft.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_fft_CFLAGS) $(CFLAGS) -c -o libs_fft-fft.obj `if test -f 'libs/fft.c'; then $(CYGPATH_W) 'libs/fft.c'; else $(CYGPATH_W) '$(srcdir)/libs/fft.c'; fi`
+
+libs_libsabi-libsabi.o: libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_libsabi_CFLAGS) $(CFLAGS) -MT libs_libsabi-libsabi.o -MD -MP -MF $(DEPDIR)/libs_libsabi-libsabi.Tpo -c -o libs_libsabi-libsabi.o `test -f 'libs/libsabi.c' || echo '$(srcdir)/'`libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_libsabi-libsabi.Tpo $(DEPDIR)/libs_libsabi-libsabi.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/libsabi.c' object='libs_libsabi-libsabi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_libsabi_CFLAGS) $(CFLAGS) -c -o libs_libsabi-libsabi.o `test -f 'libs/libsabi.c' || echo '$(srcdir)/'`libs/libsabi.c
+
+libs_libsabi-libsabi.obj: libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_libsabi_CFLAGS) $(CFLAGS) -MT libs_libsabi-libsabi.obj -MD -MP -MF $(DEPDIR)/libs_libsabi-libsabi.Tpo -c -o libs_libsabi-libsabi.obj `if test -f 'libs/libsabi.c'; then $(CYGPATH_W) 'libs/libsabi.c'; else $(CYGPATH_W) '$(srcdir)/libs/libsabi.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_libsabi-libsabi.Tpo $(DEPDIR)/libs_libsabi-libsabi.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/libsabi.c' object='libs_libsabi-libsabi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_libsabi_CFLAGS) $(CFLAGS) -c -o libs_libsabi-libsabi.obj `if test -f 'libs/libsabi.c'; then $(CYGPATH_W) 'libs/libsabi.c'; else $(CYGPATH_W) '$(srcdir)/libs/libsabi.c'; fi`
+
+libs_mixer-mixer.o: libs/mixer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_mixer_CFLAGS) $(CFLAGS) -MT libs_mixer-mixer.o -MD -MP -MF $(DEPDIR)/libs_mixer-mixer.Tpo -c -o libs_mixer-mixer.o `test -f 'libs/mixer.c' || echo '$(srcdir)/'`libs/mixer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_mixer-mixer.Tpo $(DEPDIR)/libs_mixer-mixer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/mixer.c' object='libs_mixer-mixer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_mixer_CFLAGS) $(CFLAGS) -c -o libs_mixer-mixer.o `test -f 'libs/mixer.c' || echo '$(srcdir)/'`libs/mixer.c
+
+libs_mixer-mixer.obj: libs/mixer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_mixer_CFLAGS) $(CFLAGS) -MT libs_mixer-mixer.obj -MD -MP -MF $(DEPDIR)/libs_mixer-mixer.Tpo -c -o libs_mixer-mixer.obj `if test -f 'libs/mixer.c'; then $(CYGPATH_W) 'libs/mixer.c'; else $(CYGPATH_W) '$(srcdir)/libs/mixer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_mixer-mixer.Tpo $(DEPDIR)/libs_mixer-mixer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/mixer.c' object='libs_mixer-mixer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_mixer_CFLAGS) $(CFLAGS) -c -o libs_mixer-mixer.obj `if test -f 'libs/mixer.c'; then $(CYGPATH_W) 'libs/mixer.c'; else $(CYGPATH_W) '$(srcdir)/libs/mixer.c'; fi`
+
+libs_navigation-navigation.o: libs/navigation.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_navigation_CFLAGS) $(CFLAGS) -MT libs_navigation-navigation.o -MD -MP -MF $(DEPDIR)/libs_navigation-navigation.Tpo -c -o libs_navigation-navigation.o `test -f 'libs/navigation.c' || echo '$(srcdir)/'`libs/navigation.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_navigation-navigation.Tpo $(DEPDIR)/libs_navigation-navigation.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/navigation.c' object='libs_navigation-navigation.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_navigation_CFLAGS) $(CFLAGS) -c -o libs_navigation-navigation.o `test -f 'libs/navigation.c' || echo '$(srcdir)/'`libs/navigation.c
+
+libs_navigation-navigation.obj: libs/navigation.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_navigation_CFLAGS) $(CFLAGS) -MT libs_navigation-navigation.obj -MD -MP -MF $(DEPDIR)/libs_navigation-navigation.Tpo -c -o libs_navigation-navigation.obj `if test -f 'libs/navigation.c'; then $(CYGPATH_W) 'libs/navigation.c'; else $(CYGPATH_W) '$(srcdir)/libs/navigation.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_navigation-navigation.Tpo $(DEPDIR)/libs_navigation-navigation.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/navigation.c' object='libs_navigation-navigation.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_navigation_CFLAGS) $(CFLAGS) -c -o libs_navigation-navigation.obj `if test -f 'libs/navigation.c'; then $(CYGPATH_W) 'libs/navigation.c'; else $(CYGPATH_W) '$(srcdir)/libs/navigation.c'; fi`
+
+libs_netbuffer-netbuffer.o: libs/netbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_netbuffer_CFLAGS) $(CFLAGS) -MT libs_netbuffer-netbuffer.o -MD -MP -MF $(DEPDIR)/libs_netbuffer-netbuffer.Tpo -c -o libs_netbuffer-netbuffer.o `test -f 'libs/netbuffer.c' || echo '$(srcdir)/'`libs/netbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_netbuffer-netbuffer.Tpo $(DEPDIR)/libs_netbuffer-netbuffer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/netbuffer.c' object='libs_netbuffer-netbuffer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_netbuffer_CFLAGS) $(CFLAGS) -c -o libs_netbuffer-netbuffer.o `test -f 'libs/netbuffer.c' || echo '$(srcdir)/'`libs/netbuffer.c
+
+libs_netbuffer-netbuffer.obj: libs/netbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_netbuffer_CFLAGS) $(CFLAGS) -MT libs_netbuffer-netbuffer.obj -MD -MP -MF $(DEPDIR)/libs_netbuffer-netbuffer.Tpo -c -o libs_netbuffer-netbuffer.obj `if test -f 'libs/netbuffer.c'; then $(CYGPATH_W) 'libs/netbuffer.c'; else $(CYGPATH_W) '$(srcdir)/libs/netbuffer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_netbuffer-netbuffer.Tpo $(DEPDIR)/libs_netbuffer-netbuffer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/netbuffer.c' object='libs_netbuffer-netbuffer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_netbuffer_CFLAGS) $(CFLAGS) -c -o libs_netbuffer-netbuffer.obj `if test -f 'libs/netbuffer.c'; then $(CYGPATH_W) 'libs/netbuffer.c'; else $(CYGPATH_W) '$(srcdir)/libs/netbuffer.c'; fi`
+
+libs_pbutils-pbutils.o: libs/pbutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_pbutils_CFLAGS) $(CFLAGS) -MT libs_pbutils-pbutils.o -MD -MP -MF $(DEPDIR)/libs_pbutils-pbutils.Tpo -c -o libs_pbutils-pbutils.o `test -f 'libs/pbutils.c' || echo '$(srcdir)/'`libs/pbutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_pbutils-pbutils.Tpo $(DEPDIR)/libs_pbutils-pbutils.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/pbutils.c' object='libs_pbutils-pbutils.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_pbutils_CFLAGS) $(CFLAGS) -c -o libs_pbutils-pbutils.o `test -f 'libs/pbutils.c' || echo '$(srcdir)/'`libs/pbutils.c
+
+libs_pbutils-pbutils.obj: libs/pbutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_pbutils_CFLAGS) $(CFLAGS) -MT libs_pbutils-pbutils.obj -MD -MP -MF $(DEPDIR)/libs_pbutils-pbutils.Tpo -c -o libs_pbutils-pbutils.obj `if test -f 'libs/pbutils.c'; then $(CYGPATH_W) 'libs/pbutils.c'; else $(CYGPATH_W) '$(srcdir)/libs/pbutils.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_pbutils-pbutils.Tpo $(DEPDIR)/libs_pbutils-pbutils.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/pbutils.c' object='libs_pbutils-pbutils.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_pbutils_CFLAGS) $(CFLAGS) -c -o libs_pbutils-pbutils.obj `if test -f 'libs/pbutils.c'; then $(CYGPATH_W) 'libs/pbutils.c'; else $(CYGPATH_W) '$(srcdir)/libs/pbutils.c'; fi`
+
+libs_profile-profile.o: libs/profile.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_profile_CFLAGS) $(CFLAGS) -MT libs_profile-profile.o -MD -MP -MF $(DEPDIR)/libs_profile-profile.Tpo -c -o libs_profile-profile.o `test -f 'libs/profile.c' || echo '$(srcdir)/'`libs/profile.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_profile-profile.Tpo $(DEPDIR)/libs_profile-profile.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/profile.c' object='libs_profile-profile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_profile_CFLAGS) $(CFLAGS) -c -o libs_profile-profile.o `test -f 'libs/profile.c' || echo '$(srcdir)/'`libs/profile.c
+
+libs_profile-profile.obj: libs/profile.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_profile_CFLAGS) $(CFLAGS) -MT libs_profile-profile.obj -MD -MP -MF $(DEPDIR)/libs_profile-profile.Tpo -c -o libs_profile-profile.obj `if test -f 'libs/profile.c'; then $(CYGPATH_W) 'libs/profile.c'; else $(CYGPATH_W) '$(srcdir)/libs/profile.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_profile-profile.Tpo $(DEPDIR)/libs_profile-profile.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/profile.c' object='libs_profile-profile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_profile_CFLAGS) $(CFLAGS) -c -o libs_profile-profile.obj `if test -f 'libs/profile.c'; then $(CYGPATH_W) 'libs/profile.c'; else $(CYGPATH_W) '$(srcdir)/libs/profile.c'; fi`
+
+libs_rtp-rtp.o: libs/rtp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtp_CFLAGS) $(CFLAGS) -MT libs_rtp-rtp.o -MD -MP -MF $(DEPDIR)/libs_rtp-rtp.Tpo -c -o libs_rtp-rtp.o `test -f 'libs/rtp.c' || echo '$(srcdir)/'`libs/rtp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_rtp-rtp.Tpo $(DEPDIR)/libs_rtp-rtp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/rtp.c' object='libs_rtp-rtp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtp_CFLAGS) $(CFLAGS) -c -o libs_rtp-rtp.o `test -f 'libs/rtp.c' || echo '$(srcdir)/'`libs/rtp.c
+
+libs_rtp-rtp.obj: libs/rtp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtp_CFLAGS) $(CFLAGS) -MT libs_rtp-rtp.obj -MD -MP -MF $(DEPDIR)/libs_rtp-rtp.Tpo -c -o libs_rtp-rtp.obj `if test -f 'libs/rtp.c'; then $(CYGPATH_W) 'libs/rtp.c'; else $(CYGPATH_W) '$(srcdir)/libs/rtp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_rtp-rtp.Tpo $(DEPDIR)/libs_rtp-rtp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/rtp.c' object='libs_rtp-rtp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtp_CFLAGS) $(CFLAGS) -c -o libs_rtp-rtp.obj `if test -f 'libs/rtp.c'; then $(CYGPATH_W) 'libs/rtp.c'; else $(CYGPATH_W) '$(srcdir)/libs/rtp.c'; fi`
+
+libs_rtsp-rtsp.o: libs/rtsp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtsp_CFLAGS) $(CFLAGS) -MT libs_rtsp-rtsp.o -MD -MP -MF $(DEPDIR)/libs_rtsp-rtsp.Tpo -c -o libs_rtsp-rtsp.o `test -f 'libs/rtsp.c' || echo '$(srcdir)/'`libs/rtsp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_rtsp-rtsp.Tpo $(DEPDIR)/libs_rtsp-rtsp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/rtsp.c' object='libs_rtsp-rtsp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtsp_CFLAGS) $(CFLAGS) -c -o libs_rtsp-rtsp.o `test -f 'libs/rtsp.c' || echo '$(srcdir)/'`libs/rtsp.c
+
+libs_rtsp-rtsp.obj: libs/rtsp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtsp_CFLAGS) $(CFLAGS) -MT libs_rtsp-rtsp.obj -MD -MP -MF $(DEPDIR)/libs_rtsp-rtsp.Tpo -c -o libs_rtsp-rtsp.obj `if test -f 'libs/rtsp.c'; then $(CYGPATH_W) 'libs/rtsp.c'; else $(CYGPATH_W) '$(srcdir)/libs/rtsp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_rtsp-rtsp.Tpo $(DEPDIR)/libs_rtsp-rtsp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/rtsp.c' object='libs_rtsp-rtsp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_rtsp_CFLAGS) $(CFLAGS) -c -o libs_rtsp-rtsp.obj `if test -f 'libs/rtsp.c'; then $(CYGPATH_W) 'libs/rtsp.c'; else $(CYGPATH_W) '$(srcdir)/libs/rtsp.c'; fi`
+
+libs_tag-tag.o: libs/tag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_tag_CFLAGS) $(CFLAGS) -MT libs_tag-tag.o -MD -MP -MF $(DEPDIR)/libs_tag-tag.Tpo -c -o libs_tag-tag.o `test -f 'libs/tag.c' || echo '$(srcdir)/'`libs/tag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_tag-tag.Tpo $(DEPDIR)/libs_tag-tag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/tag.c' object='libs_tag-tag.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_tag_CFLAGS) $(CFLAGS) -c -o libs_tag-tag.o `test -f 'libs/tag.c' || echo '$(srcdir)/'`libs/tag.c
+
+libs_tag-tag.obj: libs/tag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_tag_CFLAGS) $(CFLAGS) -MT libs_tag-tag.obj -MD -MP -MF $(DEPDIR)/libs_tag-tag.Tpo -c -o libs_tag-tag.obj `if test -f 'libs/tag.c'; then $(CYGPATH_W) 'libs/tag.c'; else $(CYGPATH_W) '$(srcdir)/libs/tag.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_tag-tag.Tpo $(DEPDIR)/libs_tag-tag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/tag.c' object='libs_tag-tag.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_tag_CFLAGS) $(CFLAGS) -c -o libs_tag-tag.obj `if test -f 'libs/tag.c'; then $(CYGPATH_W) 'libs/tag.c'; else $(CYGPATH_W) '$(srcdir)/libs/tag.c'; fi`
+
+libs_video-video.o: libs/video.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_video_CFLAGS) $(CFLAGS) -MT libs_video-video.o -MD -MP -MF $(DEPDIR)/libs_video-video.Tpo -c -o libs_video-video.o `test -f 'libs/video.c' || echo '$(srcdir)/'`libs/video.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_video-video.Tpo $(DEPDIR)/libs_video-video.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/video.c' object='libs_video-video.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_video_CFLAGS) $(CFLAGS) -c -o libs_video-video.o `test -f 'libs/video.c' || echo '$(srcdir)/'`libs/video.c
+
+libs_video-video.obj: libs/video.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_video_CFLAGS) $(CFLAGS) -MT libs_video-video.obj -MD -MP -MF $(DEPDIR)/libs_video-video.Tpo -c -o libs_video-video.obj `if test -f 'libs/video.c'; then $(CYGPATH_W) 'libs/video.c'; else $(CYGPATH_W) '$(srcdir)/libs/video.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_video-video.Tpo $(DEPDIR)/libs_video-video.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/video.c' object='libs_video-video.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_video_CFLAGS) $(CFLAGS) -c -o libs_video-video.obj `if test -f 'libs/video.c'; then $(CYGPATH_W) 'libs/video.c'; else $(CYGPATH_W) '$(srcdir)/libs/video.c'; fi`
+
+libs_xmpwriter-xmpwriter.o: libs/xmpwriter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_xmpwriter_CFLAGS) $(CFLAGS) -MT libs_xmpwriter-xmpwriter.o -MD -MP -MF $(DEPDIR)/libs_xmpwriter-xmpwriter.Tpo -c -o libs_xmpwriter-xmpwriter.o `test -f 'libs/xmpwriter.c' || echo '$(srcdir)/'`libs/xmpwriter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_xmpwriter-xmpwriter.Tpo $(DEPDIR)/libs_xmpwriter-xmpwriter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/xmpwriter.c' object='libs_xmpwriter-xmpwriter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_xmpwriter_CFLAGS) $(CFLAGS) -c -o libs_xmpwriter-xmpwriter.o `test -f 'libs/xmpwriter.c' || echo '$(srcdir)/'`libs/xmpwriter.c
+
+libs_xmpwriter-xmpwriter.obj: libs/xmpwriter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_xmpwriter_CFLAGS) $(CFLAGS) -MT libs_xmpwriter-xmpwriter.obj -MD -MP -MF $(DEPDIR)/libs_xmpwriter-xmpwriter.Tpo -c -o libs_xmpwriter-xmpwriter.obj `if test -f 'libs/xmpwriter.c'; then $(CYGPATH_W) 'libs/xmpwriter.c'; else $(CYGPATH_W) '$(srcdir)/libs/xmpwriter.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libs_xmpwriter-xmpwriter.Tpo $(DEPDIR)/libs_xmpwriter-xmpwriter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/xmpwriter.c' object='libs_xmpwriter-xmpwriter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_xmpwriter_CFLAGS) $(CFLAGS) -c -o libs_xmpwriter-xmpwriter.obj `if test -f 'libs/xmpwriter.c'; then $(CYGPATH_W) 'libs/xmpwriter.c'; else $(CYGPATH_W) '$(srcdir)/libs/xmpwriter.c'; fi`
+
+orc_adder-adder.o: orc/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_adder_CFLAGS) $(CFLAGS) -MT orc_adder-adder.o -MD -MP -MF $(DEPDIR)/orc_adder-adder.Tpo -c -o orc_adder-adder.o `test -f 'orc/adder.c' || echo '$(srcdir)/'`orc/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_adder-adder.Tpo $(DEPDIR)/orc_adder-adder.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/adder.c' object='orc_adder-adder.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_adder_CFLAGS) $(CFLAGS) -c -o orc_adder-adder.o `test -f 'orc/adder.c' || echo '$(srcdir)/'`orc/adder.c
+
+orc_adder-adder.obj: orc/adder.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_adder_CFLAGS) $(CFLAGS) -MT orc_adder-adder.obj -MD -MP -MF $(DEPDIR)/orc_adder-adder.Tpo -c -o orc_adder-adder.obj `if test -f 'orc/adder.c'; then $(CYGPATH_W) 'orc/adder.c'; else $(CYGPATH_W) '$(srcdir)/orc/adder.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_adder-adder.Tpo $(DEPDIR)/orc_adder-adder.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/adder.c' object='orc_adder-adder.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_adder_CFLAGS) $(CFLAGS) -c -o orc_adder-adder.obj `if test -f 'orc/adder.c'; then $(CYGPATH_W) 'orc/adder.c'; else $(CYGPATH_W) '$(srcdir)/orc/adder.c'; fi`
+
+orc_audioconvert-audioconvert.o: orc/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_audioconvert_CFLAGS) $(CFLAGS) -MT orc_audioconvert-audioconvert.o -MD -MP -MF $(DEPDIR)/orc_audioconvert-audioconvert.Tpo -c -o orc_audioconvert-audioconvert.o `test -f 'orc/audioconvert.c' || echo '$(srcdir)/'`orc/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_audioconvert-audioconvert.Tpo $(DEPDIR)/orc_audioconvert-audioconvert.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/audioconvert.c' object='orc_audioconvert-audioconvert.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_audioconvert_CFLAGS) $(CFLAGS) -c -o orc_audioconvert-audioconvert.o `test -f 'orc/audioconvert.c' || echo '$(srcdir)/'`orc/audioconvert.c
+
+orc_audioconvert-audioconvert.obj: orc/audioconvert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_audioconvert_CFLAGS) $(CFLAGS) -MT orc_audioconvert-audioconvert.obj -MD -MP -MF $(DEPDIR)/orc_audioconvert-audioconvert.Tpo -c -o orc_audioconvert-audioconvert.obj `if test -f 'orc/audioconvert.c'; then $(CYGPATH_W) 'orc/audioconvert.c'; else $(CYGPATH_W) '$(srcdir)/orc/audioconvert.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_audioconvert-audioconvert.Tpo $(DEPDIR)/orc_audioconvert-audioconvert.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/audioconvert.c' object='orc_audioconvert-audioconvert.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_audioconvert_CFLAGS) $(CFLAGS) -c -o orc_audioconvert-audioconvert.obj `if test -f 'orc/audioconvert.c'; then $(CYGPATH_W) 'orc/audioconvert.c'; else $(CYGPATH_W) '$(srcdir)/orc/audioconvert.c'; fi`
+
+orc_videoscale-videoscale.o: orc/videoscale.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videoscale_CFLAGS) $(CFLAGS) -MT orc_videoscale-videoscale.o -MD -MP -MF $(DEPDIR)/orc_videoscale-videoscale.Tpo -c -o orc_videoscale-videoscale.o `test -f 'orc/videoscale.c' || echo '$(srcdir)/'`orc/videoscale.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videoscale-videoscale.Tpo $(DEPDIR)/orc_videoscale-videoscale.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/videoscale.c' object='orc_videoscale-videoscale.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videoscale_CFLAGS) $(CFLAGS) -c -o orc_videoscale-videoscale.o `test -f 'orc/videoscale.c' || echo '$(srcdir)/'`orc/videoscale.c
+
+orc_videoscale-videoscale.obj: orc/videoscale.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videoscale_CFLAGS) $(CFLAGS) -MT orc_videoscale-videoscale.obj -MD -MP -MF $(DEPDIR)/orc_videoscale-videoscale.Tpo -c -o orc_videoscale-videoscale.obj `if test -f 'orc/videoscale.c'; then $(CYGPATH_W) 'orc/videoscale.c'; else $(CYGPATH_W) '$(srcdir)/orc/videoscale.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videoscale-videoscale.Tpo $(DEPDIR)/orc_videoscale-videoscale.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/videoscale.c' object='orc_videoscale-videoscale.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videoscale_CFLAGS) $(CFLAGS) -c -o orc_videoscale-videoscale.obj `if test -f 'orc/videoscale.c'; then $(CYGPATH_W) 'orc/videoscale.c'; else $(CYGPATH_W) '$(srcdir)/orc/videoscale.c'; fi`
+
+orc_videotestsrc-videotestsrc.o: orc/videotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videotestsrc_CFLAGS) $(CFLAGS) -MT orc_videotestsrc-videotestsrc.o -MD -MP -MF $(DEPDIR)/orc_videotestsrc-videotestsrc.Tpo -c -o orc_videotestsrc-videotestsrc.o `test -f 'orc/videotestsrc.c' || echo '$(srcdir)/'`orc/videotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videotestsrc-videotestsrc.Tpo $(DEPDIR)/orc_videotestsrc-videotestsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/videotestsrc.c' object='orc_videotestsrc-videotestsrc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videotestsrc_CFLAGS) $(CFLAGS) -c -o orc_videotestsrc-videotestsrc.o `test -f 'orc/videotestsrc.c' || echo '$(srcdir)/'`orc/videotestsrc.c
+
+orc_videotestsrc-videotestsrc.obj: orc/videotestsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videotestsrc_CFLAGS) $(CFLAGS) -MT orc_videotestsrc-videotestsrc.obj -MD -MP -MF $(DEPDIR)/orc_videotestsrc-videotestsrc.Tpo -c -o orc_videotestsrc-videotestsrc.obj `if test -f 'orc/videotestsrc.c'; then $(CYGPATH_W) 'orc/videotestsrc.c'; else $(CYGPATH_W) '$(srcdir)/orc/videotestsrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videotestsrc-videotestsrc.Tpo $(DEPDIR)/orc_videotestsrc-videotestsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/videotestsrc.c' object='orc_videotestsrc-videotestsrc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videotestsrc_CFLAGS) $(CFLAGS) -c -o orc_videotestsrc-videotestsrc.obj `if test -f 'orc/videotestsrc.c'; then $(CYGPATH_W) 'orc/videotestsrc.c'; else $(CYGPATH_W) '$(srcdir)/orc/videotestsrc.c'; fi`
+
+orc_volume-volume.o: orc/volume.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_volume_CFLAGS) $(CFLAGS) -MT orc_volume-volume.o -MD -MP -MF $(DEPDIR)/orc_volume-volume.Tpo -c -o orc_volume-volume.o `test -f 'orc/volume.c' || echo '$(srcdir)/'`orc/volume.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_volume-volume.Tpo $(DEPDIR)/orc_volume-volume.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/volume.c' object='orc_volume-volume.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_volume_CFLAGS) $(CFLAGS) -c -o orc_volume-volume.o `test -f 'orc/volume.c' || echo '$(srcdir)/'`orc/volume.c
+
+orc_volume-volume.obj: orc/volume.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_volume_CFLAGS) $(CFLAGS) -MT orc_volume-volume.obj -MD -MP -MF $(DEPDIR)/orc_volume-volume.Tpo -c -o orc_volume-volume.obj `if test -f 'orc/volume.c'; then $(CYGPATH_W) 'orc/volume.c'; else $(CYGPATH_W) '$(srcdir)/orc/volume.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_volume-volume.Tpo $(DEPDIR)/orc_volume-volume.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='orc/volume.c' object='orc_volume-volume.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_volume_CFLAGS) $(CFLAGS) -c -o orc_volume-volume.obj `if test -f 'orc/volume.c'; then $(CYGPATH_W) 'orc/volume.c'; else $(CYGPATH_W) '$(srcdir)/orc/volume.c'; fi`
+
+pipelines_gio-gio.o: pipelines/gio.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_gio_CFLAGS) $(CFLAGS) -MT pipelines_gio-gio.o -MD -MP -MF $(DEPDIR)/pipelines_gio-gio.Tpo -c -o pipelines_gio-gio.o `test -f 'pipelines/gio.c' || echo '$(srcdir)/'`pipelines/gio.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_gio-gio.Tpo $(DEPDIR)/pipelines_gio-gio.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/gio.c' object='pipelines_gio-gio.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_gio_CFLAGS) $(CFLAGS) -c -o pipelines_gio-gio.o `test -f 'pipelines/gio.c' || echo '$(srcdir)/'`pipelines/gio.c
+
+pipelines_gio-gio.obj: pipelines/gio.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_gio_CFLAGS) $(CFLAGS) -MT pipelines_gio-gio.obj -MD -MP -MF $(DEPDIR)/pipelines_gio-gio.Tpo -c -o pipelines_gio-gio.obj `if test -f 'pipelines/gio.c'; then $(CYGPATH_W) 'pipelines/gio.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/gio.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_gio-gio.Tpo $(DEPDIR)/pipelines_gio-gio.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/gio.c' object='pipelines_gio-gio.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_gio_CFLAGS) $(CFLAGS) -c -o pipelines_gio-gio.obj `if test -f 'pipelines/gio.c'; then $(CYGPATH_W) 'pipelines/gio.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/gio.c'; fi`
+
+pipelines_oggmux-oggmux.o: pipelines/oggmux.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_oggmux_CFLAGS) $(CFLAGS) -MT pipelines_oggmux-oggmux.o -MD -MP -MF $(DEPDIR)/pipelines_oggmux-oggmux.Tpo -c -o pipelines_oggmux-oggmux.o `test -f 'pipelines/oggmux.c' || echo '$(srcdir)/'`pipelines/oggmux.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_oggmux-oggmux.Tpo $(DEPDIR)/pipelines_oggmux-oggmux.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/oggmux.c' object='pipelines_oggmux-oggmux.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_oggmux_CFLAGS) $(CFLAGS) -c -o pipelines_oggmux-oggmux.o `test -f 'pipelines/oggmux.c' || echo '$(srcdir)/'`pipelines/oggmux.c
+
+pipelines_oggmux-oggmux.obj: pipelines/oggmux.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_oggmux_CFLAGS) $(CFLAGS) -MT pipelines_oggmux-oggmux.obj -MD -MP -MF $(DEPDIR)/pipelines_oggmux-oggmux.Tpo -c -o pipelines_oggmux-oggmux.obj `if test -f 'pipelines/oggmux.c'; then $(CYGPATH_W) 'pipelines/oggmux.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/oggmux.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_oggmux-oggmux.Tpo $(DEPDIR)/pipelines_oggmux-oggmux.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/oggmux.c' object='pipelines_oggmux-oggmux.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_oggmux_CFLAGS) $(CFLAGS) -c -o pipelines_oggmux-oggmux.obj `if test -f 'pipelines/oggmux.c'; then $(CYGPATH_W) 'pipelines/oggmux.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/oggmux.c'; fi`
+
+pipelines_simple_launch_lines-simple-launch-lines.o: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -MT pipelines_simple_launch_lines-simple-launch-lines.o -MD -MP -MF $(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo -c -o pipelines_simple_launch_lines-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)/pipelines_simple_launch_lines-simple-launch-lines.Tpo $(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/simple-launch-lines.c' object='pipelines_simple_launch_lines-simple-launch-lines.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -c -o pipelines_simple_launch_lines-simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c
+
+pipelines_simple_launch_lines-simple-launch-lines.obj: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -MT pipelines_simple_launch_lines-simple-launch-lines.obj -MD -MP -MF $(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Tpo -c -o pipelines_simple_launch_lines-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)/pipelines_simple_launch_lines-simple-launch-lines.Tpo $(DEPDIR)/pipelines_simple_launch_lines-simple-launch-lines.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/simple-launch-lines.c' object='pipelines_simple_launch_lines-simple-launch-lines.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_simple_launch_lines_CFLAGS) $(CFLAGS) -c -o pipelines_simple_launch_lines-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`
+
+pipelines_theoraenc-theoraenc.o: pipelines/theoraenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_theoraenc_CFLAGS) $(CFLAGS) -MT pipelines_theoraenc-theoraenc.o -MD -MP -MF $(DEPDIR)/pipelines_theoraenc-theoraenc.Tpo -c -o pipelines_theoraenc-theoraenc.o `test -f 'pipelines/theoraenc.c' || echo '$(srcdir)/'`pipelines/theoraenc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_theoraenc-theoraenc.Tpo $(DEPDIR)/pipelines_theoraenc-theoraenc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/theoraenc.c' object='pipelines_theoraenc-theoraenc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_theoraenc_CFLAGS) $(CFLAGS) -c -o pipelines_theoraenc-theoraenc.o `test -f 'pipelines/theoraenc.c' || echo '$(srcdir)/'`pipelines/theoraenc.c
+
+pipelines_theoraenc-theoraenc.obj: pipelines/theoraenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_theoraenc_CFLAGS) $(CFLAGS) -MT pipelines_theoraenc-theoraenc.obj -MD -MP -MF $(DEPDIR)/pipelines_theoraenc-theoraenc.Tpo -c -o pipelines_theoraenc-theoraenc.obj `if test -f 'pipelines/theoraenc.c'; then $(CYGPATH_W) 'pipelines/theoraenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/theoraenc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_theoraenc-theoraenc.Tpo $(DEPDIR)/pipelines_theoraenc-theoraenc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/theoraenc.c' object='pipelines_theoraenc-theoraenc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_theoraenc_CFLAGS) $(CFLAGS) -c -o pipelines_theoraenc-theoraenc.obj `if test -f 'pipelines/theoraenc.c'; then $(CYGPATH_W) 'pipelines/theoraenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/theoraenc.c'; fi`
+
+pipelines_vorbisdec-vorbisdec.o: pipelines/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisdec_CFLAGS) $(CFLAGS) -MT pipelines_vorbisdec-vorbisdec.o -MD -MP -MF $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Tpo -c -o pipelines_vorbisdec-vorbisdec.o `test -f 'pipelines/vorbisdec.c' || echo '$(srcdir)/'`pipelines/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Tpo $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/vorbisdec.c' object='pipelines_vorbisdec-vorbisdec.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisdec_CFLAGS) $(CFLAGS) -c -o pipelines_vorbisdec-vorbisdec.o `test -f 'pipelines/vorbisdec.c' || echo '$(srcdir)/'`pipelines/vorbisdec.c
+
+pipelines_vorbisdec-vorbisdec.obj: pipelines/vorbisdec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisdec_CFLAGS) $(CFLAGS) -MT pipelines_vorbisdec-vorbisdec.obj -MD -MP -MF $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Tpo -c -o pipelines_vorbisdec-vorbisdec.obj `if test -f 'pipelines/vorbisdec.c'; then $(CYGPATH_W) 'pipelines/vorbisdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/vorbisdec.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Tpo $(DEPDIR)/pipelines_vorbisdec-vorbisdec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/vorbisdec.c' object='pipelines_vorbisdec-vorbisdec.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisdec_CFLAGS) $(CFLAGS) -c -o pipelines_vorbisdec-vorbisdec.obj `if test -f 'pipelines/vorbisdec.c'; then $(CYGPATH_W) 'pipelines/vorbisdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/vorbisdec.c'; fi`
+
+pipelines_vorbisenc-vorbisenc.o: pipelines/vorbisenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisenc_CFLAGS) $(CFLAGS) -MT pipelines_vorbisenc-vorbisenc.o -MD -MP -MF $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Tpo -c -o pipelines_vorbisenc-vorbisenc.o `test -f 'pipelines/vorbisenc.c' || echo '$(srcdir)/'`pipelines/vorbisenc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Tpo $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/vorbisenc.c' object='pipelines_vorbisenc-vorbisenc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisenc_CFLAGS) $(CFLAGS) -c -o pipelines_vorbisenc-vorbisenc.o `test -f 'pipelines/vorbisenc.c' || echo '$(srcdir)/'`pipelines/vorbisenc.c
+
+pipelines_vorbisenc-vorbisenc.obj: pipelines/vorbisenc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisenc_CFLAGS) $(CFLAGS) -MT pipelines_vorbisenc-vorbisenc.obj -MD -MP -MF $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Tpo -c -o pipelines_vorbisenc-vorbisenc.obj `if test -f 'pipelines/vorbisenc.c'; then $(CYGPATH_W) 'pipelines/vorbisenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/vorbisenc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Tpo $(DEPDIR)/pipelines_vorbisenc-vorbisenc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/vorbisenc.c' object='pipelines_vorbisenc-vorbisenc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_vorbisenc_CFLAGS) $(CFLAGS) -c -o pipelines_vorbisenc-vorbisenc.obj `if test -f 'pipelines/vorbisenc.c'; then $(CYGPATH_W) 'pipelines/vorbisenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/vorbisenc.c'; fi`
+
+.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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+gstlibscpp.o: libs/gstlibscpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gstlibscpp.o -MD -MP -MF $(DEPDIR)/gstlibscpp.Tpo -c -o gstlibscpp.o `test -f 'libs/gstlibscpp.cc' || echo '$(srcdir)/'`libs/gstlibscpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstlibscpp.Tpo $(DEPDIR)/gstlibscpp.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='libs/gstlibscpp.cc' object='gstlibscpp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gstlibscpp.o `test -f 'libs/gstlibscpp.cc' || echo '$(srcdir)/'`libs/gstlibscpp.cc
+
+gstlibscpp.obj: libs/gstlibscpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gstlibscpp.obj -MD -MP -MF $(DEPDIR)/gstlibscpp.Tpo -c -o gstlibscpp.obj `if test -f 'libs/gstlibscpp.cc'; then $(CYGPATH_W) 'libs/gstlibscpp.cc'; else $(CYGPATH_W) '$(srcdir)/libs/gstlibscpp.cc'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstlibscpp.Tpo $(DEPDIR)/gstlibscpp.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='libs/gstlibscpp.cc' object='gstlibscpp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gstlibscpp.obj `if test -f 'libs/gstlibscpp.cc'; then $(CYGPATH_W) 'libs/gstlibscpp.cc'; else $(CYGPATH_W) '$(srcdir)/libs/gstlibscpp.cc'; 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 gst/.libs gst/_libs
+ -rm -rf libs/.libs libs/_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 \
+ echo "$$grn$$dashes"; \
+ else \
+ echo "$$red$$dashes"; \
+ fi; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$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 $(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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 gst/$(am__dirstamp)
+ -rm -f libs/$(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-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-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
+
+$(CHECK_REGISTRY):
+ $(TESTS_ENVIRONMENT)
+
+orc/adder.c: $(top_srcdir)/gst/adder/gstadderorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/audioconvert.c: $(top_srcdir)/gst/audioconvert/gstaudioconvertorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/volume.c: $(top_srcdir)/gst/volume/gstvolumeorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/videoscale.c: $(top_srcdir)/gst/videoscale/gstvideoscaleorc.orc
+ $(MKDIR_P) orc/
+ $(ORCC) --test -o $@ $<
+
+orc/videotestsrc.c: $(top_srcdir)/gst/videotestsrc/gstvideotestsrcorc.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/adder.c b/tests/check/elements/adder.c
new file mode 100644
index 0000000..6daa6c7
--- /dev/null
+++ b/tests/check/elements/adder.c
@@ -0,0 +1,873 @@
+/* GStreamer
+ *
+ * unit test for adder
+ *
+ * Copyright (C) <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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_VALGRIND
+# include <valgrind/valgrind.h>
+#endif
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/check/gstconsistencychecker.h>
+
+static GMainLoop *main_loop;
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
+{
+ GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
+ GST_MESSAGE_SRC (message), message);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (main_loop);
+ break;
+ case GST_MESSAGE_WARNING:{
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_warning (message, &gerror, &debug);
+ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ g_error_free (gerror);
+ g_free (debug);
+ break;
+ }
+ 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 (main_loop);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+static GstFormat format = GST_FORMAT_UNDEFINED;
+static gint64 position = -1;
+
+static void
+test_event_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * bin)
+{
+ GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
+ GST_MESSAGE_SRC (message), message);
+
+ switch (message->type) {
+ case GST_MESSAGE_SEGMENT_DONE:
+ gst_message_parse_segment_done (message, &format, &position);
+ GST_INFO ("received segment_done : %" G_GINT64_FORMAT, position);
+ g_main_loop_quit (main_loop);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+
+GST_START_TEST (test_event)
+{
+ GstElement *bin, *src1, *src2, *adder, *sink;
+ GstBus *bus;
+ GstEvent *seek_event;
+ gboolean res;
+ GstPad *srcpad;
+ GstStreamConsistency *consist;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ /* FIXME, fakesrc with default setting will produce 0 sized
+ * buffers and incompatible caps for adder that will make
+ * adder EOS and error out */
+ src1 = gst_element_factory_make ("audiotestsrc", "src1");
+ g_object_set (src1, "wave", 4, NULL); /* silence */
+ src2 = gst_element_factory_make ("audiotestsrc", "src2");
+ g_object_set (src2, "wave", 4, NULL); /* silence */
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src1, src2, adder, sink, NULL);
+
+ res = gst_element_link (src1, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (src2, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ consist = gst_consistency_checker_new (srcpad);
+ gst_object_unref (srcpad);
+
+ seek_event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, (GstClockTime) 0,
+ GST_SEEK_TYPE_SET, (GstClockTime) 2 * GST_SECOND);
+
+ format = GST_FORMAT_UNDEFINED;
+ position = -1;
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::segment-done",
+ (GCallback) test_event_message_received, bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ GST_INFO ("starting test");
+
+ /* prepare playing */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion */
+ res = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ res = gst_element_send_event (bin, seek_event);
+ fail_unless (res == TRUE, NULL);
+
+ /* run pipeline */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ fail_unless (position == 2 * GST_SECOND, NULL);
+
+ /* cleanup */
+ g_main_loop_unref (main_loop);
+ gst_consistency_checker_free (consist);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+static guint play_count = 0;
+static GstEvent *play_seek_event = NULL;
+
+static void
+test_play_twice_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * bin)
+{
+ gboolean res;
+
+ GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
+ GST_MESSAGE_SRC (message), message);
+
+ switch (message->type) {
+ case GST_MESSAGE_SEGMENT_DONE:
+ play_count++;
+ if (play_count == 1) {
+ res = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* prepare playing again */
+ res = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ res = gst_element_send_event (GST_ELEMENT (bin),
+ gst_event_ref (play_seek_event));
+ fail_unless (res == TRUE, NULL);
+
+ res = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+ } else {
+ g_main_loop_quit (main_loop);
+ }
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+
+GST_START_TEST (test_play_twice)
+{
+ GstElement *bin, *src1, *src2, *adder, *sink;
+ GstBus *bus;
+ gboolean res;
+ GstPad *srcpad;
+ GstStreamConsistency *consist;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ src1 = gst_element_factory_make ("audiotestsrc", "src1");
+ g_object_set (src1, "wave", 4, NULL); /* silence */
+ src2 = gst_element_factory_make ("audiotestsrc", "src2");
+ g_object_set (src2, "wave", 4, NULL); /* silence */
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src1, src2, adder, sink, NULL);
+
+ res = gst_element_link (src1, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (src2, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ consist = gst_consistency_checker_new (srcpad);
+ gst_object_unref (srcpad);
+
+ play_seek_event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, (GstClockTime) 0,
+ GST_SEEK_TYPE_SET, (GstClockTime) 2 * GST_SECOND);
+
+ play_count = 0;
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::segment-done",
+ (GCallback) test_play_twice_message_received, bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ GST_INFO ("starting test");
+
+ /* prepare playing */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ res = gst_element_send_event (bin, gst_event_ref (play_seek_event));
+ fail_unless (res == TRUE, NULL);
+
+ GST_INFO ("seeked");
+
+ /* run pipeline */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ fail_unless (play_count == 2, NULL);
+
+ /* cleanup */
+ g_main_loop_unref (main_loop);
+ gst_consistency_checker_free (consist);
+ gst_event_ref (play_seek_event);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_play_twice_then_add_and_play_again)
+{
+ GstElement *bin, *src1, *src2, *src3, *adder, *sink;
+ GstBus *bus;
+ gboolean res;
+ gint i;
+ GstPad *srcpad;
+ GstStreamConsistency *consist;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ src1 = gst_element_factory_make ("audiotestsrc", "src1");
+ g_object_set (src1, "wave", 4, NULL); /* silence */
+ src2 = gst_element_factory_make ("audiotestsrc", "src2");
+ g_object_set (src2, "wave", 4, NULL); /* silence */
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src1, src2, adder, sink, NULL);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ consist = gst_consistency_checker_new (srcpad);
+ gst_object_unref (srcpad);
+
+ res = gst_element_link (src1, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (src2, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ play_seek_event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, (GstClockTime) 0,
+ GST_SEEK_TYPE_SET, (GstClockTime) 2 * GST_SECOND);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::segment-done",
+ (GCallback) test_play_twice_message_received, bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ /* run it twice */
+ for (i = 0; i < 2; i++) {
+ play_count = 0;
+
+ GST_INFO ("starting test-loop %d", i);
+
+ /* prepare playing */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ res = gst_element_send_event (bin, gst_event_ref (play_seek_event));
+ fail_unless (res == TRUE, NULL);
+
+ GST_INFO ("seeked");
+
+ /* run pipeline */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_READY);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ fail_unless (play_count == 2, NULL);
+
+ /* plug another source */
+ if (i == 0) {
+ src3 = gst_element_factory_make ("audiotestsrc", "src3");
+ g_object_set (src3, "wave", 4, NULL); /* silence */
+ gst_bin_add (GST_BIN (bin), src3);
+
+ res = gst_element_link (src3, adder);
+ fail_unless (res == TRUE, NULL);
+ }
+
+ gst_consistency_checker_reset (consist);
+ }
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* cleanup */
+ g_main_loop_unref (main_loop);
+ gst_event_ref (play_seek_event);
+ gst_consistency_checker_free (consist);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+
+static void
+test_live_seeking_eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * bin)
+{
+ GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
+ GST_MESSAGE_SRC (message), message);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (main_loop);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+
+/* test failing seeks on live-sources */
+GST_START_TEST (test_live_seeking)
+{
+ GstElement *bin, *src1, *src2, *ac1, *ac2, *adder, *sink;
+ GstBus *bus;
+ gboolean res;
+ GstPad *srcpad;
+ gint i;
+ GstStreamConsistency *consist;
+
+ GST_INFO ("preparing test");
+ main_loop = NULL;
+ play_seek_event = NULL;
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ /* normal audiosources behave differently than audiotestsrc */
+#if 0
+ src1 = gst_element_factory_make ("audiotestsrc", "src1");
+ g_object_set (src1, "wave", 4, "is-live", TRUE, NULL); /* silence */
+#else
+ src1 = gst_element_factory_make ("alsasrc", "src1");
+ if (!src1) {
+ GST_INFO ("no audiosrc, skipping");
+ goto cleanup;
+ }
+ /* Test that the audio source can get to paused, else skip */
+ res = gst_element_set_state (src1, GST_STATE_PAUSED);
+ (void) gst_element_set_state (src1, GST_STATE_NULL);
+ gst_object_unref (src1);
+
+ if (res == GST_STATE_CHANGE_FAILURE)
+ goto cleanup;
+ src1 = gst_element_factory_make ("alsasrc", "src1");
+
+ /* live sources ignore seeks, force eos after 2 sec (4 buffers half second
+ * each) - don't use autoaudiosrc, as then we can't set anything here */
+ g_object_set (src1, "num-buffers", 4, "blocksize", 44100, NULL);
+#endif
+ ac1 = gst_element_factory_make ("audioconvert", "ac1");
+ src2 = gst_element_factory_make ("audiotestsrc", "src2");
+ g_object_set (src2, "wave", 4, NULL); /* silence */
+ ac2 = gst_element_factory_make ("audioconvert", "ac2");
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src1, ac1, src2, ac2, adder, sink, NULL);
+
+ res = gst_element_link (src1, ac1);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (ac1, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (src2, ac2);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (ac2, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ play_seek_event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, (GstClockTime) 0,
+ GST_SEEK_TYPE_SET, (GstClockTime) 2 * GST_SECOND);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos",
+ (GCallback) test_live_seeking_eos_message_received, bin);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ consist = gst_consistency_checker_new (srcpad);
+ gst_object_unref (srcpad);
+
+ GST_INFO ("starting test");
+
+ /* run it twice */
+ for (i = 0; i < 2; i++) {
+
+ GST_INFO ("starting test-loop %d", i);
+
+ /* prepare playing */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE);
+
+ /* wait for completion */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ res = gst_element_send_event (bin, gst_event_ref (play_seek_event));
+#if 1
+ fail_unless (res == TRUE, NULL);
+#else
+ /* adder is picky, if a single seek fails it totaly fails */
+ fail_unless (res == FALSE, NULL);
+#endif
+
+ GST_INFO ("seeked");
+
+ /* run pipeline */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ GST_INFO ("playing");
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ gst_consistency_checker_reset (consist);
+ }
+
+ /* cleanup */
+cleanup:
+ GST_INFO ("cleaning up");
+ if (main_loop)
+ g_main_loop_unref (main_loop);
+ if (play_seek_event)
+ gst_event_unref (play_seek_event);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+/* check if adding pads work as expected */
+GST_START_TEST (test_add_pad)
+{
+ GstElement *bin, *src1, *src2, *adder, *sink;
+ GstBus *bus;
+ GstPad *srcpad;
+ gboolean res;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ src1 = gst_element_factory_make ("audiotestsrc", "src1");
+ g_object_set (src1, "num-buffers", 4, NULL);
+ g_object_set (src1, "wave", 4, NULL); /* silence */
+ src2 = gst_element_factory_make ("audiotestsrc", "src2");
+ /* one buffer less, we connect with 1 buffer of delay */
+ g_object_set (src2, "num-buffers", 3, NULL);
+ g_object_set (src2, "wave", 4, NULL); /* silence */
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src1, adder, sink, NULL);
+
+ res = gst_element_link (src1, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ gst_object_unref (srcpad);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::segment-done", (GCallback) message_received,
+ bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ GST_INFO ("starting test");
+
+ /* prepare playing */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* add other element */
+ gst_bin_add_many (GST_BIN (bin), src2, NULL);
+
+ /* now link the second element */
+ res = gst_element_link (src2, adder);
+ fail_unless (res == TRUE, NULL);
+
+ /* set to PAUSED as well */
+ res = gst_element_set_state (src2, GST_STATE_PAUSED);
+
+ /* now play all */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* cleanup */
+ g_main_loop_unref (main_loop);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+/* check if removing pads work as expected */
+GST_START_TEST (test_remove_pad)
+{
+ GstElement *bin, *src, *adder, *sink;
+ GstBus *bus;
+ GstPad *pad, *srcpad;
+ gboolean res;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ src = gst_element_factory_make ("audiotestsrc", "src");
+ g_object_set (src, "num-buffers", 4, NULL);
+ g_object_set (src, "wave", 4, NULL);
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add_many (GST_BIN (bin), src, adder, sink, NULL);
+
+ res = gst_element_link (src, adder);
+ fail_unless (res == TRUE, NULL);
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ /* create an unconnected sinkpad in adder */
+ pad = gst_element_get_request_pad (adder, "sink%d");
+ fail_if (pad == NULL, NULL);
+
+ srcpad = gst_element_get_static_pad (adder, "src");
+ gst_object_unref (srcpad);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (bus, "message::segment-done", (GCallback) message_received,
+ bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ GST_INFO ("starting test");
+
+ /* prepare playing, this will not preroll as adder is waiting
+ * on the unconnected sinkpad. */
+ res = gst_element_set_state (bin, GST_STATE_PAUSED);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* wait for completion for one second, will return ASYNC */
+ res = gst_element_get_state (GST_ELEMENT (bin), NULL, NULL, GST_SECOND);
+ fail_unless (res == GST_STATE_CHANGE_ASYNC, NULL);
+
+ /* get rid of the pad now, adder should stop waiting on it and
+ * continue the preroll */
+ gst_element_release_request_pad (adder, pad);
+ gst_object_unref (pad);
+
+ /* wait for completion, should work now */
+ res =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* now play all */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ g_main_loop_run (main_loop);
+
+ res = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* cleanup */
+ g_main_loop_unref (main_loop);
+ gst_object_unref (G_OBJECT (bus));
+ gst_object_unref (G_OBJECT (bin));
+}
+
+GST_END_TEST;
+
+
+static GstBuffer *handoff_buffer = NULL;
+static void
+handoff_buffer_cb (GstElement * fakesink, GstBuffer * buffer, GstPad * pad,
+ gpointer user_data)
+{
+ GST_DEBUG ("got buffer %p", buffer);
+ gst_buffer_replace (&handoff_buffer, buffer);
+}
+
+/* check if clipping works as expected */
+GST_START_TEST (test_clip)
+{
+ GstSegment segment;
+ GstElement *bin, *adder, *sink;
+ GstBus *bus;
+ GstPad *sinkpad;
+ gboolean res;
+ GstFlowReturn ret;
+ GstEvent *event;
+ GstBuffer *buffer;
+//FIXME: GstCaps *caps;
+
+ GST_INFO ("preparing test");
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (bin);
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+
+ g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+
+ /* just an adder and a fakesink */
+ adder = gst_element_factory_make ("adder", "adder");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_object_set (sink, "signal-handoffs", TRUE, NULL);
+ g_signal_connect (sink, "handoff", (GCallback) handoff_buffer_cb, NULL);
+ gst_bin_add_many (GST_BIN (bin), adder, sink, NULL);
+
+ res = gst_element_link (adder, sink);
+ fail_unless (res == TRUE, NULL);
+
+ /* set to playing */
+ res = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
+
+ /* create an unconnected sinkpad in adder, should also automatically activate
+ * the pad */
+ sinkpad = gst_element_get_request_pad (adder, "sink%d");
+ fail_if (sinkpad == NULL, NULL);
+
+ /* send segment to adder */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = GST_SECOND;
+ segment.stop = 2 * GST_SECOND;
+ segment.time = 0;
+ event = gst_event_new_segment (&segment);
+ gst_pad_send_event (sinkpad, event);
+
+/*FIXME: caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE (S16),
+ "rate", G_TYPE_INT, 44100,
+ "channels", G_TYPE_INT, 2, NULL);
+*/
+
+ /* should be clipped and ok */
+ buffer = gst_buffer_new_and_alloc (44100);
+ GST_BUFFER_TIMESTAMP (buffer) = 0;
+ GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
+//FIXME: gst_buffer_set_caps (buffer, caps);
+ GST_DEBUG ("pushing buffer %p", buffer);
+ ret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (handoff_buffer == NULL);
+
+ /* should be partially clipped */
+ buffer = gst_buffer_new_and_alloc (44100);
+ GST_BUFFER_TIMESTAMP (buffer) = 900 * GST_MSECOND;
+ GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
+//FIXME: gst_buffer_set_caps (buffer, caps);
+ GST_DEBUG ("pushing buffer %p", buffer);
+ ret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (handoff_buffer != NULL);
+ gst_buffer_replace (&handoff_buffer, NULL);
+
+ /* should not be clipped */
+ buffer = gst_buffer_new_and_alloc (44100);
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
+//FIXME: gst_buffer_set_caps (buffer, caps);
+ GST_DEBUG ("pushing buffer %p", buffer);
+ ret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (handoff_buffer != NULL);
+ gst_buffer_replace (&handoff_buffer, NULL);
+
+ /* should be clipped and ok */
+ buffer = gst_buffer_new_and_alloc (44100);
+ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 250 * GST_MSECOND;
+//FIXME: gst_buffer_set_caps (buffer, caps);
+ GST_DEBUG ("pushing buffer %p", buffer);
+ ret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (handoff_buffer == NULL);
+
+
+}
+
+GST_END_TEST;
+
+static Suite *
+adder_suite (void)
+{
+ Suite *s = suite_create ("adder");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_event);
+ tcase_add_test (tc_chain, test_play_twice);
+ tcase_add_test (tc_chain, test_play_twice_then_add_and_play_again);
+ tcase_add_test (tc_chain, test_live_seeking);
+ tcase_add_test (tc_chain, test_add_pad);
+ tcase_add_test (tc_chain, test_remove_pad);
+ tcase_add_test (tc_chain, test_clip);
+
+ /* Use a longer timeout */
+#ifdef HAVE_VALGRIND
+ if (RUNNING_ON_VALGRIND) {
+ tcase_set_timeout (tc_chain, 5 * 60);
+ } else
+#endif
+ {
+ /* this is shorter than the default 60 seconds?! (tpm) */
+ /* tcase_set_timeout (tc_chain, 6); */
+ }
+
+ return s;
+}
+
+GST_CHECK_MAIN (adder);
diff --git a/tests/check/elements/alsa.c b/tests/check/elements/alsa.c
new file mode 100644
index 0000000..ddd95c7
--- /dev/null
+++ b/tests/check/elements/alsa.c
@@ -0,0 +1,134 @@
+/* GStreamer
+ *
+ * unit test for alsa elements
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/interfaces/propertyprobe.h>
+#include <gst/interfaces/mixer.h>
+
+/* just a simple test that runs device probing on
+ * an alsasrc, alsasink and alsamixer instance */
+
+GST_START_TEST (test_device_property_probe)
+{
+ const gchar *elements[] = { "alsasink", "alsasrc", "alsamixer" };
+ gint n;
+
+ for (n = 0; n < G_N_ELEMENTS (elements); ++n) {
+ GstPropertyProbe *probe;
+ GValueArray *arr;
+ GstElement *element;
+ gint i;
+
+ element = gst_element_factory_make (elements[n], elements[n]);
+ fail_unless (element != NULL);
+
+ probe = GST_PROPERTY_PROBE (element);
+ fail_unless (probe != NULL);
+
+ arr = gst_property_probe_probe_and_get_values_name (probe, "device");
+ if (arr) {
+ for (i = 0; i < arr->n_values; ++i) {
+ const gchar *device;
+ GValue *val;
+
+ val = g_value_array_get_nth (arr, i);
+ fail_unless (val != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (val));
+
+ device = g_value_get_string (val);
+ fail_unless (device != NULL);
+ GST_LOG_OBJECT (element, "device[%d] = %s", i, device);
+ }
+ g_value_array_free (arr);
+ } else {
+ GST_LOG_OBJECT (element, "no devices found");
+ }
+
+ gst_object_unref (element);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_alsa_mixer_track)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *mixer;
+ GList *tracks, *l;
+
+ mixer = gst_element_factory_make ("alsamixer", "alsamixer");
+ fail_unless (mixer != NULL, "Failed to create 'alsamixer' 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 alsamixer");
+ 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) {
+ GstMixerTrack *track;
+ gchar *ulabel = NULL, *label = NULL;
+
+ track = GST_MIXER_TRACK (l->data);
+ g_object_get (track, "label", &label, "untranslated-label", &ulabel, NULL);
+ fail_unless (label == NULL || g_utf8_validate (label, -1, 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 *
+alsa_suite (void)
+{
+ Suite *s = suite_create ("alsa");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_device_property_probe);
+ tcase_add_test (tc_chain, test_alsa_mixer_track);
+
+ return s;
+}
+
+GST_CHECK_MAIN (alsa)
diff --git a/tests/check/elements/audioconvert.c b/tests/check/elements/audioconvert.c
new file mode 100644
index 0000000..e849c4d
--- /dev/null
+++ b/tests/check/elements/audioconvert.c
@@ -0,0 +1,1731 @@
+/* GStreamer
+ *
+ * unit test for audioconvert
+ *
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) <2007> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/audio/multichannel.h>
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mysrcpad, *mysinkpad;
+
+#define FORMATS "{ F32LE, F32BE, F64LE, F64BE, " \
+ "S32LE, S32BE, U32LE, U32BE, " \
+ "S24LE, S24BE, U24LE, U24BE, " \
+ "S16LE, S16BE, U16LE, U16BE, " \
+ "S8, U8 } "
+
+#define CONVERT_CAPS_TEMPLATE_STRING \
+ "audio/x-raw, " \
+ "format = (string) "FORMATS", " \
+ "rate = (int) [ 1, MAX ], " \
+ "channels = (int) [ 1, MAX ]"
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CONVERT_CAPS_TEMPLATE_STRING)
+ );
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CONVERT_CAPS_TEMPLATE_STRING)
+ );
+
+/* takes over reference for outcaps */
+static GstElement *
+setup_audioconvert (GstCaps * outcaps)
+{
+ GstElement *audioconvert;
+
+ GST_DEBUG ("setup_audioconvert with caps %" GST_PTR_FORMAT, outcaps);
+ audioconvert = gst_check_setup_element ("audioconvert");
+ g_object_set (G_OBJECT (audioconvert), "dithering", 0, NULL);
+ g_object_set (G_OBJECT (audioconvert), "noise-shaping", 0, NULL);
+ mysrcpad = gst_check_setup_src_pad (audioconvert, &srctemplate, NULL);
+ mysinkpad = gst_check_setup_sink_pad (audioconvert, &sinktemplate, NULL);
+ /* this installs a getcaps func that will always return the caps we set
+ * later */
+ gst_pad_use_fixed_caps (mysinkpad);
+
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ gst_pad_set_caps (mysinkpad, outcaps);
+ gst_caps_unref (outcaps);
+ outcaps = gst_pad_get_current_caps (mysinkpad);
+ fail_unless (gst_caps_is_fixed (outcaps));
+ gst_caps_unref (outcaps);
+
+ return audioconvert;
+}
+
+static void
+cleanup_audioconvert (GstElement * audioconvert)
+{
+ GST_DEBUG ("cleanup_audioconvert");
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (audioconvert);
+ gst_check_teardown_sink_pad (audioconvert);
+ gst_check_teardown_element (audioconvert);
+}
+
+/* returns a newly allocated caps */
+static GstCaps *
+get_int_caps (guint channels, gint endianness, guint width,
+ guint depth, gboolean signedness)
+{
+ GstCaps *caps;
+ gchar *string;
+ GstAudioFormat fmt;
+
+ fmt = gst_audio_format_build_integer (signedness, endianness, width, depth);
+
+ string = g_strdup_printf ("audio/x-raw, "
+ "format = (string) %s, "
+ "rate = (int) 44100, "
+ "channels = (int) %d", gst_audio_format_to_string (fmt), channels);
+ GST_DEBUG ("creating caps from %s", string);
+ caps = gst_caps_from_string (string);
+ g_free (string);
+ fail_unless (caps != NULL);
+ GST_DEBUG ("returning caps %p", caps);
+ return caps;
+}
+
+/* returns a newly allocated caps */
+static GstCaps *
+get_float_caps (guint channels, gint endianness, guint width)
+{
+ GstCaps *caps;
+ gchar *string;
+ const gchar *format;
+
+ if (endianness == G_LITTLE_ENDIAN) {
+ if (width == 32)
+ format = "F32LE";
+ else
+ format = "F64LE";
+ } else {
+ if (width == 32)
+ format = "F32BE";
+ else
+ format = "F64BE";
+ }
+
+ string = g_strdup_printf ("audio/x-raw, "
+ "format = (string) %s, "
+ "rate = (int) 44100, " "channels = (int) %d", format, channels);
+ GST_DEBUG ("creating caps from %s", string);
+ caps = gst_caps_from_string (string);
+ g_free (string);
+ fail_unless (caps != NULL);
+ GST_DEBUG ("returning caps %p", caps);
+ return caps;
+}
+
+/* Copied from vorbis; the particular values used don't matter */
+static GstAudioChannelPosition channelpositions[][6] = {
+ { /* Mono */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO},
+ { /* Stereo */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
+ { /* Stereo + Centre */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
+ { /* Quadraphonic */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ },
+ { /* Stereo + Centre + rear stereo */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ },
+ { /* Full 5.1 Surround */
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+ }
+};
+
+/* these are a bunch of random positions, they are mostly just
+ * different from the ones above, don't use elsewhere */
+static GstAudioChannelPosition mixed_up_positions[][6] = {
+ {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO},
+ {
+ 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_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ },
+ {
+ 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_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+ }
+};
+
+/* we get this when recording from a soundcard with lots of input channels */
+static GstAudioChannelPosition undefined_positions[][15] = {
+ {
+ 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,
+ 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,
+ 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},
+ {
+ 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},
+ {
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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},
+ {
+ 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,
+ 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},
+ {
+ 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,
+ 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,
+ GST_AUDIO_CHANNEL_POSITION_NONE}
+};
+
+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);
+}
+
+/* For channels > 2, caps have to have channel positions. This adds some simple
+ * ones. Only implemented for channels between 1 and 6.
+ */
+static GstCaps *
+get_float_mc_caps (guint channels, gint endianness, guint width,
+ gboolean mixed_up_layout)
+{
+ GstCaps *caps = get_float_caps (channels, endianness, width);
+
+ if (channels <= 6) {
+ if (mixed_up_layout)
+ set_channel_positions (caps, channels, mixed_up_positions[channels - 1]);
+ else
+ set_channel_positions (caps, channels, channelpositions[channels - 1]);
+ }
+
+ return caps;
+}
+
+static GstCaps *
+get_int_mc_caps (guint channels, gint endianness, guint width,
+ guint depth, gboolean signedness, gboolean mixed_up_layout)
+{
+ GstCaps *caps = get_int_caps (channels, endianness, width, depth, signedness);
+
+ if (channels <= 6) {
+ if (mixed_up_layout)
+ set_channel_positions (caps, channels, mixed_up_positions[channels - 1]);
+ else
+ set_channel_positions (caps, channels, channelpositions[channels - 1]);
+ }
+
+ return caps;
+}
+
+/* eats the refs to the caps */
+static void
+verify_convert (const gchar * which, void *in, int inlength,
+ GstCaps * incaps, void *out, int outlength, GstCaps * outcaps,
+ GstFlowReturn expected_flow)
+{
+ GstBuffer *inbuffer, *outbuffer;
+ GstElement *audioconvert;
+
+ GST_DEBUG ("verifying conversion %s", which);
+ GST_DEBUG ("incaps: %" GST_PTR_FORMAT, incaps);
+ GST_DEBUG ("outcaps: %" GST_PTR_FORMAT, outcaps);
+ ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1);
+ ASSERT_CAPS_REFCOUNT (outcaps, "outcaps", 1);
+ audioconvert = setup_audioconvert (outcaps);
+ ASSERT_CAPS_REFCOUNT (outcaps, "outcaps", 1);
+
+ fail_unless (gst_element_set_state (audioconvert,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ gst_pad_push_event (mysrcpad, gst_event_new_caps (incaps));
+
+ GST_DEBUG ("Creating buffer of %d bytes", inlength);
+ inbuffer = gst_buffer_new_and_alloc (inlength);
+ gst_buffer_fill (inbuffer, 0, in, inlength);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+
+ /* pushing gives away my reference ... */
+ GST_DEBUG ("push it");
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), expected_flow);
+ GST_DEBUG ("pushed it");
+
+ if (expected_flow != GST_FLOW_OK)
+ goto done;
+
+ /* ... and puts a new buffer on the global list */
+ fail_unless (g_list_length (buffers) == 1);
+ fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+
+ ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
+ fail_unless_equals_int (gst_buffer_get_size (outbuffer), outlength);
+
+ gst_check_buffer_data (outbuffer, out, outlength);
+#if 0
+ if (memcmp (GST_BUFFER_DATA (outbuffer), out, outlength) != 0) {
+ g_print ("\nInput data:\n");
+ gst_util_dump_mem (in, inlength);
+ g_print ("\nConverted data:\n");
+ gst_util_dump_mem (GST_BUFFER_DATA (outbuffer), outlength);
+ g_print ("\nExpected data:\n");
+ gst_util_dump_mem (out, outlength);
+ }
+ fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, outlength) == 0,
+ "failed converting %s", which);
+#endif
+
+ /* make sure that the channel positions are not lost */
+ {
+ GstStructure *in_s, *out_s;
+ gint out_chans;
+
+ in_s = gst_caps_get_structure (incaps, 0);
+ out_s = gst_caps_get_structure (gst_pad_get_current_caps (mysinkpad), 0);
+ fail_unless (gst_structure_get_int (out_s, "channels", &out_chans));
+
+ /* positions for 1 and 2 channels are implicit if not provided */
+ if (out_chans > 2 && gst_structure_has_field (in_s, "channel-positions")) {
+ if (!gst_structure_has_field (out_s, "channel-positions")) {
+ g_error ("Channel layout got lost somewhere:\n\nIns : %s\nOuts: %s\n",
+ gst_structure_to_string (in_s), gst_structure_to_string (out_s));
+ }
+ }
+ }
+
+ buffers = g_list_remove (buffers, outbuffer);
+ gst_buffer_unref (outbuffer);
+
+done:
+ fail_unless (gst_element_set_state (audioconvert,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+ /* cleanup */
+ GST_DEBUG ("cleanup audioconvert");
+ cleanup_audioconvert (audioconvert);
+ GST_DEBUG ("cleanup, unref incaps");
+ gst_caps_unref (incaps);
+}
+
+
+#define RUN_CONVERSION(which, inarray, in_get_caps, outarray, out_get_caps) \
+ verify_convert (which, inarray, sizeof (inarray), \
+ in_get_caps, outarray, sizeof (outarray), out_get_caps, GST_FLOW_OK)
+
+#define RUN_CONVERSION_TO_FAIL(which, inarray, in_caps, outarray, out_caps) \
+ verify_convert (which, inarray, sizeof (inarray), \
+ in_caps, outarray, sizeof (outarray), out_caps, GST_FLOW_NOT_NEGOTIATED)
+
+
+GST_START_TEST (test_int16)
+{
+ /* stereo to mono */
+ {
+ gint16 in[] = { 16384, -256, 1024, 1024 };
+ gint16 out[] = { 8064, 1024 };
+
+ RUN_CONVERSION ("int16 stereo to mono",
+ in, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ }
+ /* mono to stereo */
+ {
+ gint16 in[] = { 512, 1024 };
+ gint16 out[] = { 512, 512, 1024, 1024 };
+
+ RUN_CONVERSION ("int16 mono to stereo",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE));
+ }
+ /* signed -> unsigned */
+ {
+ gint16 in[] = { 0, -32767, 32767, -32768 };
+ guint16 out[] = { 32768, 1, 65535, 0 };
+
+ RUN_CONVERSION ("int16 signed to unsigned",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE));
+ RUN_CONVERSION ("int16 unsigned to signed",
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE),
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_float32)
+{
+ /* stereo to mono */
+ {
+ gfloat in[] = { 0.6, -0.0078125, 0.03125, 0.03125 };
+ gfloat out[] = { 0.29609375, 0.03125 };
+
+ RUN_CONVERSION ("float32 stereo to mono",
+ in, get_float_caps (2, G_BYTE_ORDER, 32),
+ out, get_float_caps (1, G_BYTE_ORDER, 32));
+ }
+ /* mono to stereo */
+ {
+ gfloat in[] = { 0.015625, 0.03125 };
+ gfloat out[] = { 0.015625, 0.015625, 0.03125, 0.03125 };
+
+ RUN_CONVERSION ("float32 mono to stereo",
+ in, get_float_caps (1, G_BYTE_ORDER, 32),
+ out, get_float_caps (2, G_BYTE_ORDER, 32));
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_int_conversion)
+{
+ /* 8 <-> 16 signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gint8 in[] = { 0, 1, 2, 127, -127 };
+ gint16 out[] = { 0, 256, 512, 32512, -32512 };
+
+ RUN_CONVERSION ("int 8bit to 16bit signed",
+ in, get_int_caps (1, G_BYTE_ORDER, 8, 8, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE)
+ );
+ RUN_CONVERSION ("int 16bit signed to 8bit",
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ in, get_int_caps (1, G_BYTE_ORDER, 8, 8, TRUE)
+ );
+ }
+ /* 16 -> 8 signed */
+ {
+ gint16 in[] = { 0, 127, 128, 256, 256 + 127, 256 + 128 };
+ gint8 out[] = { 0, 0, 1, 1, 1, 2 };
+
+ RUN_CONVERSION ("16 bit to 8 signed",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 8, 8, TRUE)
+ );
+ }
+ /* 8 unsigned <-> 16 signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ guint8 in[] = { 128, 129, 130, 255, 1 };
+ gint16 out[] = { 0, 256, 512, 32512, -32512 };
+ GstCaps *incaps, *outcaps;
+
+ /* exploded for easier valgrinding */
+ incaps = get_int_caps (1, G_BYTE_ORDER, 8, 8, FALSE);
+ outcaps = get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE);
+ GST_DEBUG ("incaps: %" GST_PTR_FORMAT, incaps);
+ GST_DEBUG ("outcaps: %" GST_PTR_FORMAT, outcaps);
+ RUN_CONVERSION ("8 unsigned to 16 signed", in, incaps, out, outcaps);
+ RUN_CONVERSION ("16 signed to 8 unsigned", out, get_int_caps (1,
+ G_BYTE_ORDER, 16, 16, TRUE), in, get_int_caps (1, G_BYTE_ORDER, 8,
+ 8, FALSE)
+ );
+ }
+ /* 8 <-> 24 signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gint8 in[] = { 0, 1, 127 };
+ guint8 out[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7f };
+ /* out has the bytes in little-endian, so that's how they should be
+ * interpreted during conversion */
+
+ RUN_CONVERSION ("8 to 24 signed", in, get_int_caps (1, G_BYTE_ORDER, 8, 8,
+ TRUE), out, get_int_caps (1, G_LITTLE_ENDIAN, 24, 24, TRUE)
+ );
+ RUN_CONVERSION ("24 signed to 8", out, get_int_caps (1, G_LITTLE_ENDIAN, 24,
+ 24, TRUE), in, get_int_caps (1, G_BYTE_ORDER, 8, 8, TRUE)
+ );
+ }
+
+ /* 16 bit signed <-> unsigned */
+ {
+ gint16 in[] = { 0, 128, -128 };
+ guint16 out[] = { 32768, 32896, 32640 };
+ RUN_CONVERSION ("16 signed to 16 unsigned",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE)
+ );
+ RUN_CONVERSION ("16 unsigned to 16 signed",
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE),
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE)
+ );
+ }
+
+ /* 16 bit signed <-> 8 in 16 bit signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gint16 in[] = { 0, 64 << 8, -64 << 8 };
+ gint16 out[] = { 0, 64, -64 };
+ RUN_CONVERSION ("16 signed to 8 in 16 signed",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 8, TRUE)
+ );
+ RUN_CONVERSION ("8 in 16 signed to 16 signed",
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 8, TRUE),
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE)
+ );
+ }
+
+ /* 16 bit unsigned <-> 8 in 16 bit unsigned */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ guint16 in[] = { 1 << 15, (1 << 15) - (64 << 8), (1 << 15) + (64 << 8) };
+ guint16 out[] = { 1 << 7, (1 << 7) - 64, (1 << 7) + 64 };
+ RUN_CONVERSION ("16 unsigned to 8 in 16 unsigned",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 8, FALSE)
+ );
+ RUN_CONVERSION ("8 in 16 unsigned to 16 unsigned",
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 8, FALSE),
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE)
+ );
+ }
+
+ /* 32 bit signed -> 16 bit signed for rounding check */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gint32 in[] = { 0, G_MININT32, G_MAXINT32,
+ (32 << 16), (32 << 16) + (1 << 15), (32 << 16) - (1 << 15),
+ (32 << 16) + (2 << 15), (32 << 16) - (2 << 15),
+ (-32 << 16) + (1 << 15), (-32 << 16) - (1 << 15),
+ (-32 << 16) + (2 << 15), (-32 << 16) - (2 << 15),
+ (-32 << 16)
+ };
+ gint16 out[] = { 0, G_MININT16, G_MAXINT16,
+ 32, 33, 32,
+ 33, 31,
+ -31, -32,
+ -31, -33,
+ -32
+ };
+ RUN_CONVERSION ("32 signed to 16 signed for rounding",
+ in, get_int_caps (1, G_BYTE_ORDER, 32, 32, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE)
+ );
+ }
+
+ /* 32 bit signed -> 16 bit unsigned for rounding check */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gint32 in[] = { 0, G_MININT32, G_MAXINT32,
+ (32 << 16), (32 << 16) + (1 << 15), (32 << 16) - (1 << 15),
+ (32 << 16) + (2 << 15), (32 << 16) - (2 << 15),
+ (-32 << 16) + (1 << 15), (-32 << 16) - (1 << 15),
+ (-32 << 16) + (2 << 15), (-32 << 16) - (2 << 15),
+ (-32 << 16)
+ };
+ guint16 out[] = { (1 << 15), 0, G_MAXUINT16,
+ (1 << 15) + 32, (1 << 15) + 33, (1 << 15) + 32,
+ (1 << 15) + 33, (1 << 15) + 31,
+ (1 << 15) - 31, (1 << 15) - 32,
+ (1 << 15) - 31, (1 << 15) - 33,
+ (1 << 15) - 32
+ };
+ RUN_CONVERSION ("32 signed to 16 unsigned for rounding",
+ in, get_int_caps (1, G_BYTE_ORDER, 32, 32, TRUE),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE)
+ );
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_float_conversion)
+{
+ /* 32 float <-> 16 signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gfloat in_le[] =
+ { GFLOAT_TO_LE (0.0), GFLOAT_TO_LE (1.0), GFLOAT_TO_LE (-1.0),
+ GFLOAT_TO_LE (0.5), GFLOAT_TO_LE (-0.5), GFLOAT_TO_LE (1.1),
+ GFLOAT_TO_LE (-1.1)
+ };
+ gfloat in_be[] =
+ { GFLOAT_TO_BE (0.0), GFLOAT_TO_BE (1.0), GFLOAT_TO_BE (-1.0),
+ GFLOAT_TO_BE (0.5), GFLOAT_TO_BE (-0.5), GFLOAT_TO_BE (1.1),
+ GFLOAT_TO_BE (-1.1)
+ };
+ gint16 out[] = { 0, 32767, -32768, 16384, -16384, 32767, -32768 };
+
+ /* only one direction conversion, the other direction does
+ * not produce exactly the same as the input due to floating
+ * point rounding errors etc. */
+ RUN_CONVERSION ("32 float le to 16 signed",
+ in_le, get_float_caps (1, G_LITTLE_ENDIAN, 32),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ RUN_CONVERSION ("32 float be to 16 signed",
+ in_be, get_float_caps (1, G_BIG_ENDIAN, 32),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ }
+
+ {
+ gint16 in[] = { 0, -32768, 16384, -16384 };
+ gfloat out[] = { 0.0, -1.0, 0.5, -0.5 };
+
+ RUN_CONVERSION ("16 signed to 32 float",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_float_caps (1, G_BYTE_ORDER, 32));
+ }
+
+ /* 64 float <-> 16 signed */
+ /* NOTE: if audioconvert was doing dithering we'd have a problem */
+ {
+ gdouble in_le[] =
+ { GDOUBLE_TO_LE (0.0), GDOUBLE_TO_LE (1.0), GDOUBLE_TO_LE (-1.0),
+ GDOUBLE_TO_LE (0.5), GDOUBLE_TO_LE (-0.5), GDOUBLE_TO_LE (1.1),
+ GDOUBLE_TO_LE (-1.1)
+ };
+ gdouble in_be[] =
+ { GDOUBLE_TO_BE (0.0), GDOUBLE_TO_BE (1.0), GDOUBLE_TO_BE (-1.0),
+ GDOUBLE_TO_BE (0.5), GDOUBLE_TO_BE (-0.5), GDOUBLE_TO_BE (1.1),
+ GDOUBLE_TO_BE (-1.1)
+ };
+ gint16 out[] = { 0, 32767, -32768, 16384, -16384, 32767, -32768 };
+
+ /* only one direction conversion, the other direction does
+ * not produce exactly the same as the input due to floating
+ * point rounding errors etc. */
+ RUN_CONVERSION ("64 float LE to 16 signed",
+ in_le, get_float_caps (1, G_LITTLE_ENDIAN, 64),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ RUN_CONVERSION ("64 float BE to 16 signed",
+ in_be, get_float_caps (1, G_BIG_ENDIAN, 64),
+ out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE));
+ }
+ {
+ gint16 in[] = { 0, -32768, 16384, -16384 };
+ gdouble out[] = { 0.0,
+ (gdouble) (-32768L << 16) / 2147483647.0, /* ~ -1.0 */
+ (gdouble) (16384L << 16) / 2147483647.0, /* ~ 0.5 */
+ (gdouble) (-16384L << 16) / 2147483647.0, /* ~ -0.5 */
+ };
+
+ RUN_CONVERSION ("16 signed to 64 float",
+ in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE),
+ out, get_float_caps (1, G_BYTE_ORDER, 64));
+ }
+ {
+ gint32 in[] = { 0, (-1L << 31), (1L << 30), (-1L << 30) };
+ gdouble out[] = { 0.0,
+ (gdouble) (-1L << 31) / 2147483647.0, /* ~ -1.0 */
+ (gdouble) (1L << 30) / 2147483647.0, /* ~ 0.5 */
+ (gdouble) (-1L << 30) / 2147483647.0, /* ~ -0.5 */
+ };
+
+ RUN_CONVERSION ("32 signed to 64 float",
+ in, get_int_caps (1, G_BYTE_ORDER, 32, 32, TRUE),
+ out, get_float_caps (1, G_BYTE_ORDER, 64));
+ }
+
+ /* 64-bit float <-> 32-bit float */
+ {
+ gdouble in[] = { 0.0, 1.0, -1.0, 0.5, -0.5 };
+ gfloat out[] = { 0.0, 1.0, -1.0, 0.5, -0.5 };
+
+ RUN_CONVERSION ("64 float to 32 float",
+ in, get_float_caps (1, G_BYTE_ORDER, 64),
+ out, get_float_caps (1, G_BYTE_ORDER, 32));
+
+ RUN_CONVERSION ("32 float to 64 float",
+ out, get_float_caps (1, G_BYTE_ORDER, 32),
+ in, get_float_caps (1, G_BYTE_ORDER, 64));
+ }
+
+ /* 32-bit float little endian <-> big endian */
+ {
+ gfloat le[] = { GFLOAT_TO_LE (0.0), GFLOAT_TO_LE (1.0), GFLOAT_TO_LE (-1.0),
+ GFLOAT_TO_LE (0.5), GFLOAT_TO_LE (-0.5)
+ };
+ gfloat be[] = { GFLOAT_TO_BE (0.0), GFLOAT_TO_BE (1.0), GFLOAT_TO_BE (-1.0),
+ GFLOAT_TO_BE (0.5), GFLOAT_TO_BE (-0.5)
+ };
+
+ RUN_CONVERSION ("32 float LE to BE",
+ le, get_float_caps (1, G_LITTLE_ENDIAN, 32),
+ be, get_float_caps (1, G_BIG_ENDIAN, 32));
+
+ RUN_CONVERSION ("32 float BE to LE",
+ be, get_float_caps (1, G_BIG_ENDIAN, 32),
+ le, get_float_caps (1, G_LITTLE_ENDIAN, 32));
+ }
+
+ /* 64-bit float little endian <-> big endian */
+ {
+ gdouble le[] =
+ { GDOUBLE_TO_LE (0.0), GDOUBLE_TO_LE (1.0), GDOUBLE_TO_LE (-1.0),
+ GDOUBLE_TO_LE (0.5), GDOUBLE_TO_LE (-0.5)
+ };
+ gdouble be[] =
+ { GDOUBLE_TO_BE (0.0), GDOUBLE_TO_BE (1.0), GDOUBLE_TO_BE (-1.0),
+ GDOUBLE_TO_BE (0.5), GDOUBLE_TO_BE (-0.5)
+ };
+
+ RUN_CONVERSION ("64 float LE to BE",
+ le, get_float_caps (1, G_LITTLE_ENDIAN, 64),
+ be, get_float_caps (1, G_BIG_ENDIAN, 64));
+
+ RUN_CONVERSION ("64 float BE to LE",
+ be, get_float_caps (1, G_BIG_ENDIAN, 64),
+ le, get_float_caps (1, G_LITTLE_ENDIAN, 64));
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_multichannel_conversion)
+{
+ {
+ gfloat in[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ gfloat out[] = { 0.0, 0.0 };
+
+ RUN_CONVERSION ("3 channels to 1", in, get_float_mc_caps (3,
+ G_BYTE_ORDER, 32, FALSE), out, get_float_caps (1, G_BYTE_ORDER,
+ 32));
+ RUN_CONVERSION ("1 channels to 3", out, get_float_caps (1,
+ G_BYTE_ORDER, 32), in, get_float_mc_caps (3, G_BYTE_ORDER,
+ 32, TRUE));
+ }
+
+ {
+ gint16 in[] = { 0, 0, 0, 0, 0, 0 };
+ gint16 out[] = { 0, 0 };
+
+ RUN_CONVERSION ("3 channels to 1", in, get_int_mc_caps (3,
+ G_BYTE_ORDER, 16, 16, TRUE, FALSE), out, get_int_caps (1,
+ G_BYTE_ORDER, 16, 16, TRUE));
+ RUN_CONVERSION ("1 channels to 3", out, get_int_caps (1, G_BYTE_ORDER, 16,
+ 16, TRUE), in, get_int_mc_caps (3, G_BYTE_ORDER, 16, 16, TRUE,
+ TRUE));
+ }
+
+ {
+ gint16 in[] = { 1, 2 };
+ gint16 out[] = { 1, 1, 2, 2 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+ GstAudioChannelPosition out_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ set_channel_positions (in_caps, 1, in_layout);
+ set_channel_positions (out_caps, 2, out_layout);
+
+ RUN_CONVERSION ("1 channels to 2 with standard layout", in,
+ in_caps, out, out_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2 };
+ gint16 out[] = { 1, 1, 2, 2 };
+ GstCaps *in_caps = get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE);
+ GstCaps *out_caps = get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE);
+
+ RUN_CONVERSION ("1 channels to 2 with standard layout and no positions set",
+ in, gst_caps_copy (in_caps), out, gst_caps_copy (out_caps));
+
+ RUN_CONVERSION ("2 channels to 1 with standard layout and no positions set",
+ out, out_caps, in, in_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2 };
+ gint16 out[] = { 1, 0, 2, 0 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
+ GstAudioChannelPosition out_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ set_channel_positions (in_caps, 1, in_layout);
+ set_channel_positions (out_caps, 2, out_layout);
+
+ RUN_CONVERSION ("1 channels to 2 with non-standard layout", in,
+ in_caps, out, out_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 2, 4 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
+ in_caps, out, out_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 2, 4 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("2 channels to 1 with standard layout", in,
+ in_caps, out, out_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 3 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
+ };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
+ in_caps, out, out_caps);
+ }
+
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 3 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT
+ };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
+ in_caps, out, out_caps);
+ }
+ {
+ gint16 in[] = { 4, 5, 4, 2, 2, 1 };
+ gint16 out[] = { 3, 3 };
+ GstCaps *in_caps = get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE);
+
+ RUN_CONVERSION ("5.1 to 2 channels", in, in_caps, out, out_caps);
+ }
+ {
+ gint16 in[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ gint16 out[] = { 0, 0 };
+ GstCaps *in_caps = get_int_mc_caps (11, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[11] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ };
+
+ set_channel_positions (in_caps, 11, in_layout);
+
+ RUN_CONVERSION ("11 channels to 2", in,
+ gst_caps_copy (in_caps), out, gst_caps_copy (out_caps));
+ RUN_CONVERSION ("2 channels to 11", out, out_caps, in, in_caps);
+ }
+
+}
+
+GST_END_TEST;
+
+/* for testing channel remapping with 8 channels */
+static GstAudioChannelPosition n8chan_pos_remap_in[8] = {
+ 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
+};
+
+static GstAudioChannelPosition n8chan_pos_remap_out[8] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ 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_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE
+};
+
+GST_START_TEST (test_channel_remapping)
+{
+ /* float */
+ {
+ gfloat in[] = { 0.0, 1.0, -0.5 };
+ gfloat out[] = { -0.5, 1.0, 0.0 };
+ GstCaps *in_caps = get_float_mc_caps (3, G_BYTE_ORDER, 32, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (3, G_BYTE_ORDER, 32, TRUE);
+
+ RUN_CONVERSION ("3 channels layout remapping float", in, in_caps,
+ out, out_caps);
+ }
+
+ /* int */
+ {
+ guint16 in[] = { 0, 65535, 0x9999 };
+ guint16 out[] = { 0x9999, 65535, 0 };
+ GstCaps *in_caps = get_int_mc_caps (3, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (3, G_BYTE_ORDER, 16, 16, FALSE, TRUE);
+
+ RUN_CONVERSION ("3 channels layout remapping int", in, in_caps,
+ out, out_caps);
+ }
+
+ /* int with 8 channels (= largest number allowed with channel positions) */
+ {
+ guint16 in[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+ guint16 out[] = { 4, 0, 1, 6, 7, 2, 3, 5 };
+ GstCaps *in_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, FALSE, TRUE);
+
+ set_channel_positions (in_caps, 8, n8chan_pos_remap_in);
+ set_channel_positions (out_caps, 8, n8chan_pos_remap_out);
+
+ RUN_CONVERSION ("8 channels layout remapping int", in, in_caps,
+ out, out_caps);
+ }
+
+ /* int16 to int32 with 8 channels (= largest number allowed with channel positions) */
+ {
+ guint16 in[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+ guint32 out[] =
+ { 4 << 16, 0, 1 << 16, 6 << 16, 7 << 16, 2 << 16, 3 << 16, 5 << 16 };
+ GstCaps *in_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (8, G_BYTE_ORDER, 32, 32, FALSE, TRUE);
+
+ set_channel_positions (in_caps, 8, n8chan_pos_remap_in);
+ set_channel_positions (out_caps, 8, n8chan_pos_remap_out);
+
+ RUN_CONVERSION ("8 channels layout remapping int16 --> int32", in, in_caps,
+ out, out_caps);
+
+ in_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ out_caps = get_int_mc_caps (8, G_BYTE_ORDER, 32, 32, FALSE, TRUE);
+ set_channel_positions (in_caps, 8, n8chan_pos_remap_in);
+ set_channel_positions (out_caps, 8, n8chan_pos_remap_out);
+ RUN_CONVERSION ("8 channels layout remapping int16 <-- int32", out,
+ out_caps, in, in_caps);
+ }
+
+ /* float to gint16 with 3 channels */
+ {
+ gfloat in[] = { 100.0 / G_MAXINT16, 0.0, -100.0 / G_MAXINT16 };
+ gint16 out[] = { -100, 0, 100 };
+ GstCaps *in_caps = get_float_mc_caps (3, G_BYTE_ORDER, 32, TRUE);
+ GstCaps *out_caps = get_int_mc_caps (3, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+
+ RUN_CONVERSION ("3 channels layout remapping float32 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 2 channels and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 2, 2, 4 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_LFE
+ };
+ GstAudioChannelPosition out_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 2, out_layout);
+
+ RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 2 channels and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 2, 1, 4, 3 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
+ };
+ GstAudioChannelPosition out_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 2, out_layout);
+
+ RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 2 channels and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 1, 3, 3 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
+ };
+ GstAudioChannelPosition out_layout[2] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ set_channel_positions (in_caps, 2, in_layout);
+ set_channel_positions (out_caps, 2, out_layout);
+
+ RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 1 channel and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 0, 0, 0, 0 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
+
+ set_channel_positions (in_caps, 1, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 1 channel and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 2, 3, 4 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER };
+
+ set_channel_positions (in_caps, 1, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+
+ /* gint16 to gint16 with 1 channel and non-standard layout */
+ {
+ gint16 in[] = { 1, 2, 3, 4 };
+ gint16 out[] = { 1, 2, 3, 4 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstAudioChannelPosition in_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
+ GstAudioChannelPosition out_layout[1] =
+ { GST_AUDIO_CHANNEL_POSITION_REAR_LEFT };
+
+ set_channel_positions (in_caps, 1, in_layout);
+ set_channel_positions (out_caps, 1, out_layout);
+
+ RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
+ in_caps, out, out_caps);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_caps_negotiation)
+{
+ GstElement *src, *ac1, *ac2, *ac3, *sink;
+ GstElement *pipeline;
+ GstPad *ac3_src;
+ GstCaps *caps1, *caps2;
+
+ pipeline = gst_pipeline_new ("test");
+
+ /* create elements */
+ src = gst_element_factory_make ("audiotestsrc", "src");
+ ac1 = gst_element_factory_make ("audioconvert", "ac1");
+ ac2 = gst_element_factory_make ("audioconvert", "ac2");
+ ac3 = gst_element_factory_make ("audioconvert", "ac3");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ ac3_src = gst_element_get_static_pad (ac3, "src");
+
+ /* test with 2 audioconvert elements */
+ gst_bin_add_many (GST_BIN (pipeline), src, ac1, ac3, sink, NULL);
+ gst_element_link_many (src, ac1, ac3, sink, NULL);
+
+ /* Set to PAUSED and wait for PREROLL */
+ fail_if (gst_element_set_state (pipeline, GST_STATE_PAUSED) ==
+ GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline to PAUSED");
+ fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
+ GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline to PAUSED");
+
+ caps1 = gst_pad_get_caps (ac3_src, NULL);
+ fail_if (caps1 == NULL, "gst_pad_get_caps returned NULL");
+ GST_DEBUG ("Caps size 1 : %d", gst_caps_get_size (caps1));
+
+ fail_if (gst_element_set_state (pipeline, GST_STATE_READY) ==
+ GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to READY");
+ fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
+ GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to READY");
+
+ /* test with 3 audioconvert elements */
+ gst_element_unlink (ac1, ac3);
+ gst_bin_add (GST_BIN (pipeline), ac2);
+ gst_element_link_many (ac1, ac2, ac3, NULL);
+
+ fail_if (gst_element_set_state (pipeline, GST_STATE_PAUSED) ==
+ GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to PAUSED");
+ fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
+ GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to PAUSED");
+
+ caps2 = gst_pad_get_caps (ac3_src, NULL);
+
+ fail_if (caps2 == NULL, "gst_pad_get_caps returned NULL");
+ GST_DEBUG ("Caps size 2 : %d", gst_caps_get_size (caps2));
+ fail_unless (gst_caps_get_size (caps1) == gst_caps_get_size (caps2));
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+
+ fail_if (gst_element_set_state (pipeline, GST_STATE_NULL) ==
+ GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to NULL");
+ fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
+ GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to NULL");
+
+ gst_object_unref (ac3_src);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_convert_undefined_multichannel)
+{
+ /* (A) CONVERSION FROM 'WORSE' TO 'BETTER' FORMAT */
+
+ /* 1 channel, NONE positions, int8 => int16 */
+ {
+ guint16 out[] = { 0x2000 };
+ guint8 in[] = { 0x20 };
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 1, undefined_positions[1 - 1]);
+ set_channel_positions (in_caps, 1, undefined_positions[1 - 1]);
+
+ RUN_CONVERSION ("1 channel, undefined layout, identity conversion, "
+ "int8 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 2 channels, NONE positions, int8 => int16 */
+ {
+ guint16 out[] = { 0x8000, 0x2000 };
+ guint8 in[] = { 0x80, 0x20 };
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 2, undefined_positions[2 - 1]);
+ set_channel_positions (in_caps, 2, undefined_positions[2 - 1]);
+
+ RUN_CONVERSION ("2 channels, undefined layout, identity conversion, "
+ "int8 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 6 channels, NONE positions, int8 => int16 */
+ {
+ guint16 out[] = { 0x0000, 0x2000, 0x8000, 0x2000, 0x0000, 0xff00 };
+ guint8 in[] = { 0x00, 0x20, 0x80, 0x20, 0x00, 0xff };
+ GstCaps *out_caps = get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *in_caps = get_int_mc_caps (6, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 6, undefined_positions[6 - 1]);
+ set_channel_positions (in_caps, 6, undefined_positions[6 - 1]);
+
+ RUN_CONVERSION ("6 channels, undefined layout, identity conversion, "
+ "int8 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 9 channels, NONE positions, int8 => int16 */
+ {
+ guint16 out[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000
+ };
+ guint8 in[] = { 0x00, 0xff, 0x00, 0x20, 0x80, 0x20, 0x00, 0xff, 0x00 };
+ GstCaps *out_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *in_caps = get_int_mc_caps (9, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 9, undefined_positions[9 - 1]);
+
+ RUN_CONVERSION ("9 channels, undefined layout, identity conversion, "
+ "int8 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 15 channels, NONE positions, int8 => int16 */
+ {
+ guint16 out[] =
+ { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000, 0x0000, 0xff00,
+ 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000, 0x0000
+ };
+ guint8 in[] =
+ { 0x00, 0xff, 0x00, 0x20, 0x80, 0x20, 0x00, 0xff, 0x00, 0xff, 0x00,
+ 0x20, 0x80, 0x20, 0x00
+ };
+ GstCaps *out_caps =
+ get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *in_caps = get_int_mc_caps (15, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 15, undefined_positions[15 - 1]);
+ set_channel_positions (in_caps, 15, undefined_positions[15 - 1]);
+
+ RUN_CONVERSION ("15 channels, undefined layout, identity conversion, "
+ "int8 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* (B) CONVERSION FROM 'BETTER' TO 'WORSE' FORMAT */
+
+ /* 1 channel, NONE positions, int16 => int8 */
+ {
+ guint16 in[] = { 0x2000 };
+ guint8 out[] = { 0x20 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 1, undefined_positions[1 - 1]);
+ set_channel_positions (in_caps, 1, undefined_positions[1 - 1]);
+
+ RUN_CONVERSION ("1 channel, undefined layout, identity conversion, "
+ "int16 => int8", in, in_caps, out, out_caps);
+ }
+
+ /* 2 channels, NONE positions, int16 => int8 */
+ {
+ guint16 in[] = { 0x8000, 0x2000 };
+ guint8 out[] = { 0x80, 0x20 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 2, undefined_positions[2 - 1]);
+ set_channel_positions (in_caps, 2, undefined_positions[2 - 1]);
+
+ RUN_CONVERSION ("2 channels, undefined layout, identity conversion, "
+ "int16 => int8", in, in_caps, out, out_caps);
+ }
+
+ /* 6 channels, NONE positions, int16 => int8 */
+ {
+ guint16 in[] = { 0x0000, 0x2000, 0x8000, 0x2000, 0x0000, 0xff00 };
+ guint8 out[] = { 0x00, 0x20, 0x80, 0x20, 0x00, 0xff };
+ GstCaps *in_caps = get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (6, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 6, undefined_positions[6 - 1]);
+ set_channel_positions (in_caps, 6, undefined_positions[6 - 1]);
+
+ RUN_CONVERSION ("6 channels, undefined layout, identity conversion, "
+ "int16 => int8", in, in_caps, out, out_caps);
+ }
+
+ /* 9 channels, NONE positions, int16 => int8 */
+ {
+ guint16 in[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000
+ };
+ guint8 out[] = { 0x00, 0xff, 0x00, 0x20, 0x80, 0x20, 0x00, 0xff, 0x00 };
+ GstCaps *in_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (9, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 9, undefined_positions[9 - 1]);
+
+ RUN_CONVERSION ("9 channels, undefined layout, identity conversion, "
+ "int16 => int8", in, in_caps, out, out_caps);
+ }
+
+ /* 15 channels, NONE positions, int16 => int8 */
+ {
+ guint16 in[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000
+ };
+ guint8 out[] =
+ { 0x00, 0xff, 0x00, 0x20, 0x80, 0x20, 0x00, 0xff, 0x00, 0xff, 0x00,
+ 0x20, 0x80, 0x20, 0x00
+ };
+ GstCaps *in_caps = get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (15, G_BYTE_ORDER, 8, 8, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 15, undefined_positions[15 - 1]);
+ set_channel_positions (in_caps, 15, undefined_positions[15 - 1]);
+
+ RUN_CONVERSION ("15 channels, undefined layout, identity conversion, "
+ "int16 => int8", in, in_caps, out, out_caps);
+ }
+
+
+ /* (C) NO CONVERSION, SAME FORMAT */
+
+ /* 1 channel, NONE positions, int16 => int16 */
+ {
+ guint16 in[] = { 0x2000 };
+ guint16 out[] = { 0x2000 };
+ GstCaps *in_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (1, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 1, undefined_positions[1 - 1]);
+ set_channel_positions (in_caps, 1, undefined_positions[1 - 1]);
+
+ RUN_CONVERSION ("1 channel, undefined layout, identity conversion, "
+ "int16 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 2 channels, NONE positions, int16 => int16 */
+ {
+ guint16 in[] = { 0x8000, 0x2000 };
+ guint16 out[] = { 0x8000, 0x2000 };
+ GstCaps *in_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 2, undefined_positions[2 - 1]);
+ set_channel_positions (in_caps, 2, undefined_positions[2 - 1]);
+
+ RUN_CONVERSION ("2 channels, undefined layout, identity conversion, "
+ "int16 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 6 channels, NONE positions, int16 => int16 */
+ {
+ guint16 in[] = { 0x0000, 0x2000, 0x8000, 0x2000, 0x0000, 0xff00 };
+ guint16 out[] = { 0x0000, 0x2000, 0x8000, 0x2000, 0x0000, 0xff00 };
+ GstCaps *in_caps = get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 6, undefined_positions[6 - 1]);
+ set_channel_positions (in_caps, 6, undefined_positions[6 - 1]);
+
+ RUN_CONVERSION ("6 channels, undefined layout, identity conversion, "
+ "int16 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 9 channels, NONE positions, int16 => int16 */
+ {
+ guint16 in[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000
+ };
+ guint16 out[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000
+ };
+ GstCaps *in_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 9, undefined_positions[9 - 1]);
+
+ RUN_CONVERSION ("9 channels, undefined layout, identity conversion, "
+ "int16 => int16", in, in_caps, out, out_caps);
+ }
+
+ /* 15 channels, NONE positions, int16 => int16 */
+ {
+ guint16 in[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000
+ };
+ guint16 out[] = { 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000, 0xff00, 0x0000, 0xff00, 0x0000, 0x2000, 0x8000, 0x2000,
+ 0x0000
+ };
+ GstCaps *in_caps = get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps =
+ get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+
+ set_channel_positions (out_caps, 15, undefined_positions[15 - 1]);
+ set_channel_positions (in_caps, 15, undefined_positions[15 - 1]);
+
+ RUN_CONVERSION ("15 channels, undefined layout, identity conversion, "
+ "int16 => int16", in, in_caps, out, out_caps);
+ }
+
+
+ /* (C) int16 => float */
+
+ /* 9 channels, NONE positions, int16 => float */
+ {
+ guint16 in[] = { 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000, 0x8000, 0x0000
+ };
+ gfloat out[] = { -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0 };
+ GstCaps *in_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (9, G_BYTE_ORDER, 32, FALSE);
+
+ set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 9, undefined_positions[9 - 1]);
+
+ RUN_CONVERSION ("9 channels, undefined layout, identity conversion, "
+ "int16 => float", in, in_caps, out, out_caps);
+ }
+
+ /* 15 channels, NONE positions, int16 => float */
+ {
+ guint16 in[] = { 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000, 0x8000, 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000
+ };
+ gfloat out[] =
+ { -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 0.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0
+ };
+ GstCaps *in_caps = get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (15, G_BYTE_ORDER, 32, FALSE);
+
+ set_channel_positions (out_caps, 15, undefined_positions[15 - 1]);
+ set_channel_positions (in_caps, 15, undefined_positions[15 - 1]);
+
+ RUN_CONVERSION ("15 channels, undefined layout, identity conversion, "
+ "int16 => float", in, in_caps, out, out_caps);
+ }
+
+
+ /* 9 channels, NONE positions, int16 => float (same as above, but no
+ * position on output caps to see if audioconvert transforms correctly) */
+ {
+ guint16 in[] = { 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000, 0x8000, 0x0000
+ };
+ gfloat out[] = { -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0 };
+ GstCaps *in_caps = get_int_mc_caps (9, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (9, G_BYTE_ORDER, 32, FALSE);
+
+ //set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 9, undefined_positions[9 - 1]);
+
+ RUN_CONVERSION ("9 channels, undefined layout, identity conversion, "
+ "int16 => float", in, in_caps, out, out_caps);
+ }
+
+ /* 15 channels, NONE positions, int16 => float (same as above, but no
+ * position on output caps to see if audioconvert transforms correctly) */
+ {
+ guint16 in[] = { 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000, 0x8000, 0x0000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
+ 0x0000
+ };
+ gfloat out[] =
+ { -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 0.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0
+ };
+ GstCaps *in_caps = get_int_mc_caps (15, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (15, G_BYTE_ORDER, 32, FALSE);
+
+ //set_channel_positions (out_caps, 9, undefined_positions[9 - 1]);
+ set_channel_positions (in_caps, 15, undefined_positions[15 - 1]);
+
+ RUN_CONVERSION ("15 channels, undefined layout, identity conversion, "
+ "int16 => float", in, in_caps, out, out_caps);
+ }
+
+ /* 8 channels, NONE positions => 2 channels: should fail, no mixing allowed */
+ {
+ guint16 in[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ gfloat out[] = { -1.0, -1.0 };
+ GstCaps *in_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, FALSE, FALSE);
+ GstCaps *out_caps = get_float_mc_caps (2, G_BYTE_ORDER, 32, FALSE);
+
+ set_channel_positions (in_caps, 8, undefined_positions[8 - 1]);
+
+ RUN_CONVERSION_TO_FAIL ("8 channels with layout => 2 channels",
+ in, in_caps, out, out_caps);
+ }
+
+ /* 8 channels, with positions => 2 channels (makes sure channel-position
+ * fields are removed properly in some cases in ::transform_caps, so we
+ * don't up with caps with 2 channels and 8 channel positions) */
+ {
+ GstAudioChannelPosition layout8ch[] = {
+ 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
+ };
+ gint16 in[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ gint16 out[] = { 0, 0 };
+ GstCaps *in_caps = get_int_mc_caps (8, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+ GstCaps *out_caps = get_int_mc_caps (2, G_BYTE_ORDER, 16, 16, TRUE, FALSE);
+
+ set_channel_positions (in_caps, 8, layout8ch);
+
+ RUN_CONVERSION ("8 channels with layout => 2 channels",
+ in, in_caps, out, out_caps);
+ }
+}
+
+GST_END_TEST;
+
+static Suite *
+audioconvert_suite (void)
+{
+ Suite *s = suite_create ("audioconvert");
+ 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_float32);
+ tcase_add_test (tc_chain, test_int_conversion);
+ tcase_add_test (tc_chain, test_float_conversion);
+ tcase_add_test (tc_chain, test_multichannel_conversion);
+ tcase_add_test (tc_chain, test_channel_remapping);
+ tcase_add_test (tc_chain, test_caps_negotiation);
+ tcase_add_test (tc_chain, test_convert_undefined_multichannel);
+
+ return s;
+}
+
+GST_CHECK_MAIN (audioconvert);
diff --git a/tests/check/elements/audiotestsrc.c b/tests/check/elements/audiotestsrc.c
new file mode 100644
index 0000000..0fecc5d
--- /dev/null
+++ b/tests/check/elements/audiotestsrc.c
@@ -0,0 +1,126 @@
+/* GStreamer
+ *
+ * unit test for audiotestsrc
+ *
+ * Copyright (C) <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 <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/audio/audio.h>
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mysinkpad;
+
+
+#define CAPS_TEMPLATE_STRING \
+ "audio/x-raw, " \
+ "format = (string) "GST_AUDIO_NE(S16)", " \
+ "channels = (int) 1, " \
+ "rate = (int) [ 1, MAX ]"
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CAPS_TEMPLATE_STRING)
+ );
+
+static GstElement *
+setup_audiotestsrc (void)
+{
+ GstElement *audiotestsrc;
+
+ GST_DEBUG ("setup_audiotestsrc");
+ audiotestsrc = gst_check_setup_element ("audiotestsrc");
+ mysinkpad = gst_check_setup_sink_pad (audiotestsrc, &sinktemplate, NULL);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ return audiotestsrc;
+}
+
+static void
+cleanup_audiotestsrc (GstElement * audiotestsrc)
+{
+ GST_DEBUG ("cleanup_audiotestsrc");
+
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+ buffers = NULL;
+
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (audiotestsrc);
+ gst_check_teardown_element (audiotestsrc);
+}
+
+GST_START_TEST (test_all_waves)
+{
+ GstElement *audiotestsrc;
+ GObjectClass *oclass;
+ GParamSpec *property;
+ GEnumValue *values;
+ guint j = 0;
+
+ audiotestsrc = setup_audiotestsrc ();
+ oclass = G_OBJECT_GET_CLASS (audiotestsrc);
+ property = g_object_class_find_property (oclass, "wave");
+ fail_unless (G_IS_PARAM_SPEC_ENUM (property));
+ values = G_ENUM_CLASS (g_type_class_ref (property->value_type))->values;
+
+
+ while (values[j].value_name) {
+ GST_DEBUG_OBJECT (audiotestsrc, "testing wave %s", values[j].value_name);
+
+ fail_unless (gst_element_set_state (audiotestsrc,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ g_mutex_lock (check_mutex);
+ while (g_list_length (buffers) < 10)
+ g_cond_wait (check_cond, check_mutex);
+ g_mutex_unlock (check_mutex);
+
+ gst_element_set_state (audiotestsrc, GST_STATE_READY);
+
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+ buffers = NULL;
+ ++j;
+ }
+
+ /* cleanup */
+ cleanup_audiotestsrc (audiotestsrc);
+}
+
+GST_END_TEST;
+
+static Suite *
+audiotestsrc_suite (void)
+{
+ Suite *s = suite_create ("audiotestsrc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_all_waves);
+
+ return s;
+}
+
+GST_CHECK_MAIN (audiotestsrc);
diff --git a/tests/check/elements/decodebin.c b/tests/check/elements/decodebin.c
new file mode 100644
index 0000000..79cfe63
--- /dev/null
+++ b/tests/check/elements/decodebin.c
@@ -0,0 +1,380 @@
+/* GStreamer unit tests for decodebin
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2011 Hewlett-Packard Development Company, L.P.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/check/gstcheck.h>
+#include <gst/base/gstbaseparse.h>
+#include <unistd.h>
+
+static const gchar dummytext[] =
+ "Quick Brown Fox Jumps over a Lazy Frog Quick Brown "
+ "Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick "
+ "Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog "
+ "Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy "
+ "Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a "
+ "Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps "
+ "over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox "
+ "jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown "
+ "Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick "
+ "Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog "
+ "Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy "
+ "Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a "
+ "Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps "
+ "over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox ";
+
+static void
+src_need_data_cb (GstElement * src, guint size, gpointer data)
+{
+ GstBuffer *buf;
+ GstFlowReturn ret;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, 0,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) dummytext, NULL, sizeof (dummytext), 0,
+ sizeof (dummytext)));
+
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ g_signal_emit_by_name (src, "push-buffer", buf, &ret);
+
+ fail_unless (ret == GST_FLOW_OK);
+}
+
+static void
+decodebin_pad_added_cb (GstElement * decodebin, GstPad * pad,
+ gboolean last, gboolean * p_flag)
+{
+ /* we should not be reached */
+ fail_unless (decodebin == NULL, "pad-added should not be emitted");
+}
+
+/* make sure that decodebin errors out instead of creating a new decoded pad
+ * if the entire stream is a plain text file */
+GST_START_TEST (test_text_plain_streams)
+{
+ GstElement *pipe, *src, *decodebin;
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new (NULL);
+ fail_unless (pipe != NULL, "failed to create pipeline");
+
+ src = gst_element_factory_make ("appsrc", "src");
+ fail_unless (src != NULL, "Failed to create appsrc element");
+
+ g_object_set (src, "emit-signals", TRUE, NULL);
+ g_object_set (src, "num-buffers", 1, NULL);
+ g_signal_connect (src, "need-data", G_CALLBACK (src_need_data_cb), NULL);
+
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ fail_unless (decodebin != NULL, "Failed to create decodebin element");
+
+ g_signal_connect (decodebin, "pad-added",
+ G_CALLBACK (decodebin_pad_added_cb), NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src));
+ fail_unless (gst_bin_add (GST_BIN (pipe), decodebin));
+ fail_unless (gst_element_link (src, decodebin), "can't link src<->decodebin");
+
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ /* it's push-based, so should be async */
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_ASYNC);
+
+ /* it should error out at some point */
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+static void
+pad_added_plug_fakesink_cb (GstElement * decodebin, GstPad * srcpad,
+ gboolean last, GstElement * pipeline)
+{
+ GstElement *sink;
+ GstPad *sinkpad;
+
+ GST_LOG ("Linking fakesink");
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_unless (sink != NULL, "Failed to create fakesink element");
+
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK);
+ gst_object_unref (sinkpad);
+
+ gst_element_set_state (sink, GST_STATE_PLAYING);
+}
+
+GST_START_TEST (test_reuse_without_decoders)
+{
+ GstElement *pipe, *src, *decodebin, *sink;
+
+ pipe = gst_pipeline_new (NULL);
+ fail_unless (pipe != NULL, "failed to create pipeline");
+
+ src = gst_element_factory_make ("audiotestsrc", "src");
+ fail_unless (src != NULL, "Failed to create audiotestsrc element");
+
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ fail_unless (decodebin != NULL, "Failed to create decodebin element");
+
+ g_signal_connect (decodebin, "pad-added",
+ G_CALLBACK (pad_added_plug_fakesink_cb), pipe);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src));
+ fail_unless (gst_bin_add (GST_BIN (pipe), decodebin));
+ fail_unless (gst_element_link (src, decodebin), "can't link src<->decodebin");
+
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ /* it's push-based, so should be async */
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_ASYNC);
+
+ /* wait for state change to complete */
+ fail_unless_equals_int (gst_element_get_state (pipe, NULL, NULL, -1),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* there shouldn't be any errors */
+ fail_if (gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 0) != NULL);
+
+ /* reset */
+ gst_element_set_state (pipe, GST_STATE_READY);
+
+ sink = gst_bin_get_by_name (GST_BIN (pipe), "sink");
+ gst_bin_remove (GST_BIN (pipe), sink);
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+
+ GST_LOG ("second try");
+
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ /* it's push-based, so should be async */
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_ASYNC);
+
+ /* wait for state change to complete */
+ fail_unless_equals_int (gst_element_get_state (pipe, NULL, NULL, -1),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* there shouldn't be any errors */
+ fail_if (gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 0) != NULL);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+/* Fake mp3 parser for test */
+typedef GstBaseParse TestMpegAudioParse;
+typedef GstBaseParseClass TestMpegAudioParseClass;
+
+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], parsed=(b)true")
+ );
+
+static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/mpeg, mpegversion=1, parsed=(bool) { false, true }")
+ );
+
+static GType test_mpeg_audio_parse_get_type (void);
+static gboolean test_mpeg_audio_parse_start (GstBaseParse * parse);
+static gboolean test_mpeg_audio_parse_stop (GstBaseParse * parse);
+static gboolean test_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, guint * size, gint * skipsize);
+static GstFlowReturn test_mpeg_audio_parse_parse_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+G_DEFINE_TYPE (TestMpegAudioParse, test_mpeg_audio_parse, GST_TYPE_BASE_PARSE);
+
+static void
+test_mpeg_audio_parse_class_init (TestMpegAudioParseClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+
+ gst_element_class_set_details_simple (element_class, "MPEG1 Audio Parser",
+ "Codec/Parser/Audio", "Pretends to parse mpeg1 audio stream",
+ "Foo Bar <foo@bar.com>");
+
+ parse_class->start = test_mpeg_audio_parse_start;
+ parse_class->stop = test_mpeg_audio_parse_stop;
+ parse_class->check_valid_frame = test_mpeg_audio_parse_check_valid_frame;
+ parse_class->parse_frame = test_mpeg_audio_parse_parse_frame;
+}
+
+static gint num_parse_instances = 0;
+
+static void
+test_mpeg_audio_parse_init (TestMpegAudioParse * mp3parse)
+{
+ /* catch decodebin plugging parsers in a loop early */
+ fail_unless (++num_parse_instances < 10);
+}
+
+static gboolean
+test_mpeg_audio_parse_start (GstBaseParse * parse)
+{
+ gst_base_parse_set_min_frame_size (parse, 6);
+ return TRUE;
+}
+
+static gboolean
+test_mpeg_audio_parse_stop (GstBaseParse * parse)
+{
+ return TRUE;
+}
+
+static gboolean
+test_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, guint * framesize, gint * skipsize)
+{
+ guint8 data[2];
+
+ gst_buffer_extract (frame->buffer, 0, data, 2);
+
+ if ((GST_READ_UINT16_BE (data) & 0xffe0) == 0xffe0) {
+ /* this framesize is hard-coded for ../test.mp3 */
+ *framesize = 1045;
+ return TRUE;
+ } else {
+ *skipsize = 1;
+ return FALSE;
+ }
+}
+
+static GstFlowReturn
+test_mpeg_audio_parse_parse_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame)
+{
+ if (GST_BUFFER_OFFSET (frame->buffer) == 0) {
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1,
+ "mpegaudioversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3,
+ "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 2, NULL);
+ gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps);
+ gst_caps_unref (caps);
+ }
+ return GST_FLOW_OK;
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ return gst_element_register (plugin, "testmpegaudioparse", GST_RANK_NONE,
+ test_mpeg_audio_parse_get_type ());
+}
+
+GST_START_TEST (test_mp3_parser_loop)
+{
+ GstStateChangeReturn sret;
+ GstPluginFeature *feature;
+ GstMessage *msg;
+ GstElement *pipe, *src, *dec;
+ gchar *path;
+
+ num_parse_instances = 0;
+
+ gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR,
+ "fakemp3parse", "fakemp3parse", plugin_init, VERSION, "LGPL",
+ "gst-plugins-base", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
+
+ feature = gst_default_registry_find_feature ("testmpegaudioparse",
+ GST_TYPE_ELEMENT_FACTORY);
+
+ gst_plugin_feature_set_rank (feature, GST_RANK_PRIMARY + 100);
+
+ pipe = gst_pipeline_new (NULL);
+
+ src = gst_element_factory_make ("filesrc", NULL);
+ fail_unless (src != NULL);
+
+ path = g_build_filename (GST_TEST_FILES_PATH, "test.mp3", NULL);
+ g_object_set (src, "location", path, NULL);
+ g_free (path);
+
+ dec = gst_element_factory_make ("decodebin", NULL);
+ fail_unless (dec != NULL);
+
+ gst_bin_add_many (GST_BIN (pipe), src, dec, NULL);
+ gst_element_link_many (src, dec, NULL);
+
+ sret = gst_element_set_state (pipe, GST_STATE_PLAYING);
+ fail_unless_equals_int (sret, GST_STATE_CHANGE_ASYNC);
+
+ /* wait for unlinked error */
+ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe),
+ GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR);
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ /* make sure out parser got plugged at all though */
+ fail_unless_equals_int (num_parse_instances, 1);
+
+ /* don't want to interfere with any other of the other tests */
+ gst_plugin_feature_set_rank (feature, GST_RANK_NONE);
+ gst_object_unref (feature);
+}
+
+GST_END_TEST;
+
+static Suite *
+decodebin_suite (void)
+{
+ Suite *s = suite_create ("decodebin");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_text_plain_streams);
+ tcase_add_test (tc_chain, test_reuse_without_decoders);
+ tcase_add_test (tc_chain, test_mp3_parser_loop);
+
+ return s;
+}
+
+GST_CHECK_MAIN (decodebin);
diff --git a/tests/check/elements/encodebin.c b/tests/check/elements/encodebin.c
new file mode 100644
index 0000000..2f84d2d
--- /dev/null
+++ b/tests/check/elements/encodebin.c
@@ -0,0 +1,902 @@
+/* GStreamer unit test for gstprofile
+ *
+ * Copyright (C) <2009> Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/pbutils/encoding-profile.h>
+#include <gst/check/gstcheck.h>
+
+/* Helper functions to create profiles */
+
+static GstEncodingProfile *
+create_ogg_vorbis_profile (guint presence, gchar * preset)
+{
+ GstEncodingContainerProfile *cprof;
+ GstCaps *ogg, *vorbis;
+
+ ogg = gst_caps_new_simple ("application/ogg", NULL);
+ cprof =
+ gst_encoding_container_profile_new ((gchar *) "myprofile", NULL, ogg,
+ NULL);
+ gst_caps_unref (ogg);
+
+ vorbis = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ fail_unless (gst_encoding_container_profile_add_profile (cprof,
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (vorbis, preset,
+ NULL, presence)));
+ gst_caps_unref (vorbis);
+
+ return (GstEncodingProfile *) cprof;
+}
+
+static GstEncodingProfile *
+create_ogg_theora_vorbis_profile (guint theorapresence, guint vorbispresence)
+{
+ GstEncodingContainerProfile *prof;
+ GstCaps *ogg, *vorbis, *theora;
+
+ ogg = gst_caps_new_simple ("application/ogg", NULL);
+ prof =
+ gst_encoding_container_profile_new ((gchar *) "myprofile", NULL, ogg,
+ NULL);
+ gst_caps_unref (ogg);
+
+ vorbis = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ fail_unless (gst_encoding_container_profile_add_profile (prof,
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (vorbis, NULL,
+ NULL, vorbispresence)));
+ gst_caps_unref (vorbis);
+
+ theora = gst_caps_new_simple ("video/x-theora", NULL);
+ fail_unless (gst_encoding_container_profile_add_profile (prof,
+ (GstEncodingProfile *) gst_encoding_video_profile_new (theora, NULL,
+ NULL, theorapresence)));
+ gst_caps_unref (theora);
+
+ return (GstEncodingProfile *) prof;
+}
+
+static GstEncodingProfile *
+create_vorbis_only_profile (void)
+{
+ GstEncodingProfile *prof;
+ GstCaps *vorbis;
+
+ vorbis = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ prof =
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (vorbis, NULL, NULL,
+ 0);
+ gst_caps_unref (vorbis);
+
+ return prof;
+}
+
+GST_START_TEST (test_encodebin_states)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof, *prof2;
+ GstCaps *ogg;
+ GstPad *srcpad;
+ GstPad *target;
+
+ /* Create an encodebin and check that it correctly changes states
+ * according to whether a profile is set or not */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+
+ /* At this point, the ghostpad has *NO* target */
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (srcpad));
+ fail_unless (target == NULL);
+ gst_object_unref (srcpad);
+
+ /* No profile,
+ * switching to READY should succeed,
+ * but switching to PAUSED should fail
+ */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_FAILURE);
+
+ /* Set a profile on encodebin... */
+ ogg = gst_caps_new_simple ("application/ogg", NULL);
+ prof = (GstEncodingProfile *) gst_encoding_container_profile_new ((gchar *)
+ "myprofile", NULL, ogg, NULL);
+ gst_caps_unref (ogg);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ /* ... and check the profile has been properly set */
+ g_object_get (ebin, "profile", &prof2, NULL);
+
+ fail_unless (gst_encoding_profile_is_equal (prof, prof2));
+
+ gst_encoding_profile_unref (prof);
+ gst_encoding_profile_unref (prof2);
+
+ /* Make sure we can go to PAUSED */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* At this point, the source pad *HAS* a target */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (srcpad));
+ fail_unless (target != NULL);
+ gst_object_unref (target);
+ gst_object_unref (srcpad);
+
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_static)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstPad *srcpad, *sinkpad;
+
+ /* Create an encodebin and check that it properly creates the sink pads
+ * for a single-stream profile with fixed presence */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* streamprofile that has a forced presence of 1 */
+ prof = create_ogg_vorbis_profile (1, NULL);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ gst_object_unref (srcpad);
+
+ /* Check if the audio sink pad was properly created */
+ sinkpad = gst_element_get_static_pad (ebin, "audio_0");
+ fail_unless (sinkpad != NULL);
+ gst_object_unref (sinkpad);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_nopreset_static)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+
+ /* Create an encodebin with a bogus preset and check it fails switching states */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* streamprofile that has a forced presence of 1 */
+ prof = create_ogg_vorbis_profile (1, (gchar *) "nowaythispresetexists");
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ /* It will go to READY... */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ /* ... but to not PAUSED */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_FAILURE);
+
+ gst_element_set_state (ebin, GST_STATE_NULL);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_dynamic)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstPad *srcpad, *sinkpad;
+ GstCaps *sinkcaps;
+
+ /* Create an encodebin and check that it properly creates the sink pads
+ * for a single-stream profile with a unfixed presence */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* streamprofile that has non-forced presence */
+ prof = create_ogg_vorbis_profile (0, NULL);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ gst_object_unref (srcpad);
+
+ /* Check if the audio sink pad can be requested */
+ sinkpad = gst_element_get_request_pad (ebin, "audio_0");
+ fail_unless (sinkpad != NULL);
+ gst_element_release_request_pad (ebin, sinkpad);
+ gst_object_unref (sinkpad);
+ sinkpad = NULL;
+
+ /* Check again with the 'request-pad' signal */
+ sinkcaps = gst_caps_new_simple ("audio/x-raw", NULL);
+ g_signal_emit_by_name (ebin, "request-pad", sinkcaps, &sinkpad);
+ gst_caps_unref (sinkcaps);
+ fail_unless (sinkpad != NULL);
+ gst_element_release_request_pad (ebin, sinkpad);
+ gst_object_unref (sinkpad);
+ sinkpad = NULL;
+
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_multiple_static)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstPad *srcpad, *sinkpadvorbis, *sinkpadtheora;
+
+ /* Create an encodebin and check that it properly creates the sink pads */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* First try is with a streamprofile that has a forced presence of 1 */
+ prof = create_ogg_theora_vorbis_profile (1, 1);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ gst_object_unref (srcpad);
+
+ /* Check if the audio sink pad was properly created */
+ sinkpadvorbis = gst_element_get_static_pad (ebin, "audio_0");
+ fail_unless (sinkpadvorbis != NULL);
+ gst_object_unref (sinkpadvorbis);
+
+ /* Check if the video sink pad was properly created */
+ sinkpadtheora = gst_element_get_static_pad (ebin, "video_1");
+ fail_unless (sinkpadtheora != NULL);
+ gst_object_unref (sinkpadtheora);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_multiple_dynamic)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstPad *srcpad, *sinkpadvorbis, *sinkpadtheora;
+
+ /* Create an encodebin and check that it properly creates the sink pads
+ * for a multiple-stream with unfixed presence */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* multi-stream profile that has non-forced presence */
+ prof = create_ogg_theora_vorbis_profile (0, 0);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ gst_object_unref (srcpad);
+
+ /* Check if the audio sink pad was properly created */
+ sinkpadvorbis = gst_element_get_request_pad (ebin, "audio_0");
+ fail_unless (sinkpadvorbis != NULL);
+
+ /* Check if the video sink pad was properly created */
+ sinkpadtheora = gst_element_get_request_pad (ebin, "video_1");
+ fail_unless (sinkpadtheora != NULL);
+
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_element_release_request_pad (GST_ELEMENT (ebin), sinkpadvorbis);
+ gst_object_unref (sinkpadvorbis);
+ gst_element_release_request_pad (GST_ELEMENT (ebin), sinkpadtheora);
+ gst_object_unref (sinkpadtheora);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_sink_pads_dynamic_encoder)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstPad *srcpad, *sinkpad = NULL;
+ GstCaps *vorbiscaps;
+
+ /* Create an encodebin and check that it properly creates the sink pads
+ * for a single-stream profile with a unfixed presence */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* streamprofile that has non-forced presence */
+ prof = create_ogg_vorbis_profile (0, NULL);
+
+ g_object_set (ebin, "profile", prof, NULL);
+
+ gst_encoding_profile_unref (prof);
+
+ /* Check if the source pad was properly created */
+ srcpad = gst_element_get_static_pad (ebin, "src");
+ fail_unless (srcpad != NULL);
+ gst_object_unref (srcpad);
+
+ /* Check if the audio sink pad was properly created */
+ vorbiscaps = gst_caps_from_string ("audio/x-vorbis,channels=2,rate=44100");
+ g_signal_emit_by_name (ebin, "request-pad", vorbiscaps, &sinkpad);
+ gst_caps_unref (vorbiscaps);
+ fail_unless (sinkpad != NULL);
+ gst_element_release_request_pad (ebin, sinkpad);
+ gst_object_unref (sinkpad);
+
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_render_audio_static)
+{
+ GstElement *ebin, *pipeline, *audiotestsrc, *fakesink;
+ GstEncodingProfile *prof;
+ GstBus *bus;
+ gboolean done = FALSE;
+
+ /* Create an encodebin and render 5s of vorbis/ogg */
+
+ pipeline = gst_pipeline_new ("encodebin-pipeline");
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 10, NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ prof = create_ogg_vorbis_profile (1, NULL);
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ gst_bin_add_many ((GstBin *) pipeline, audiotestsrc, ebin, fakesink, NULL);
+
+ fail_unless (gst_element_link_many (audiotestsrc, ebin, fakesink, NULL));
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *msg;
+
+ /* poll the bus until we get EOS without any errors */
+ msg = gst_bus_timed_pop (bus, GST_SECOND / 10);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ fail ("GST_MESSAGE_ERROR");
+ break;
+ case GST_MESSAGE_EOS:
+ done = TRUE;
+ break;
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ }
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_render_audio_only_static)
+{
+ GstElement *ebin, *pipeline, *audiotestsrc, *fakesink;
+ GstEncodingProfile *prof;
+ GstBus *bus;
+ gboolean done = FALSE;
+ GstPad *sinkpad;
+ GstCaps *sinkcaps;
+
+ /* Create an encodebin and render 5s of vorbis only */
+
+ pipeline = gst_pipeline_new ("encodebin-pipeline");
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 10, NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ prof = create_vorbis_only_profile ();
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ gst_bin_add_many ((GstBin *) pipeline, audiotestsrc, ebin, fakesink, NULL);
+
+ fail_unless (gst_element_link_many (audiotestsrc, ebin, fakesink, NULL));
+
+ /* Requesting a new pad should fail */
+ ASSERT_CRITICAL (gst_element_get_request_pad (ebin, "audio_0"));
+
+ sinkcaps = gst_caps_new_simple ("audio/x-raw", NULL);
+ g_signal_emit_by_name (ebin, "request-pad", sinkcaps, &sinkpad);
+ gst_caps_unref (sinkcaps);
+ fail_if (sinkpad != NULL);
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *msg;
+
+ /* poll the bus until we get EOS without any errors */
+ msg = gst_bus_timed_pop (bus, GST_SECOND / 10);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ fail ("GST_MESSAGE_ERROR");
+ break;
+ case GST_MESSAGE_EOS:
+ done = TRUE;
+ break;
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ }
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_render_audio_dynamic)
+{
+ GstElement *ebin, *pipeline, *audiotestsrc, *fakesink;
+ GstEncodingProfile *prof;
+ GstBus *bus;
+ GstPad *sinkpad, *srcpad;
+ gboolean done = FALSE;
+
+ /* Create an encodebin and render 5s of vorbis/ogg */
+
+ pipeline = gst_pipeline_new ("encodebin-pipeline");
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 10, NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ prof = create_ogg_vorbis_profile (0, NULL);
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ gst_bin_add_many ((GstBin *) pipeline, audiotestsrc, ebin, fakesink, NULL);
+
+ srcpad = gst_element_get_static_pad (audiotestsrc, "src");
+ fail_unless (srcpad != NULL);
+
+ sinkpad = gst_element_get_request_pad (ebin, "audio_0");
+ fail_unless (sinkpad != NULL);
+
+ fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK);
+
+ gst_object_unref (srcpad);
+
+ fail_unless (gst_element_link (ebin, fakesink));
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *msg;
+
+ /* poll the bus until we get EOS without any errors */
+ msg = gst_bus_timed_pop (bus, GST_SECOND / 10);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ fail ("GST_MESSAGE_ERROR");
+ break;
+ case GST_MESSAGE_EOS:
+ done = TRUE;
+ break;
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ }
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_element_release_request_pad (GST_ELEMENT (ebin), sinkpad);
+ gst_object_unref (sinkpad);
+
+ gst_object_unref (bus);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_render_audio_video_static)
+{
+ GstElement *ebin, *pipeline, *audiotestsrc, *videotestsrc, *fakesink;
+ GstEncodingProfile *prof;
+ GstBus *bus;
+ gboolean done = FALSE;
+
+ /* Create an encodebin and render 5s of vorbis/ogg */
+
+ pipeline = gst_pipeline_new ("encodebin-pipeline");
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 10, NULL);
+ videotestsrc = gst_element_factory_make ("videotestsrc", NULL);
+ g_object_set (videotestsrc, "num-buffers", 5, NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ prof = create_ogg_theora_vorbis_profile (1, 1);
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ gst_bin_add_many ((GstBin *) pipeline, audiotestsrc, videotestsrc, ebin,
+ fakesink, NULL);
+
+ fail_unless (gst_element_link (videotestsrc, ebin));
+ fail_unless (gst_element_link_many (audiotestsrc, ebin, fakesink, NULL));
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *msg;
+
+ /* poll the bus until we get EOS without any errors */
+ msg = gst_bus_timed_pop (bus, GST_SECOND / 10);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ fail ("GST_MESSAGE_ERROR");
+ break;
+ case GST_MESSAGE_EOS:
+ done = TRUE;
+ break;
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ }
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_render_audio_video_dynamic)
+{
+ GstElement *ebin, *pipeline, *audiotestsrc, *videotestsrc, *fakesink;
+ GstEncodingProfile *prof;
+ GstBus *bus;
+ gboolean done = FALSE;
+ GstPad *sinkpad1, *sinkpad2, *srcpad;
+
+ /* Create an encodebin and render 5s of vorbis/ogg */
+
+ pipeline = gst_pipeline_new ("encodebin-pipeline");
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 10, NULL);
+ videotestsrc = gst_element_factory_make ("videotestsrc", NULL);
+ g_object_set (videotestsrc, "num-buffers", 5, NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ prof = create_ogg_theora_vorbis_profile (0, 0);
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ gst_bin_add_many ((GstBin *) pipeline, audiotestsrc, videotestsrc, ebin,
+ fakesink, NULL);
+
+ fail_unless (gst_element_link (ebin, fakesink));
+
+ srcpad = gst_element_get_static_pad (audiotestsrc, "src");
+ sinkpad1 = gst_element_get_request_pad (ebin, "audio_0");
+ fail_unless (srcpad != NULL);
+ fail_unless (sinkpad1 != NULL);
+ fail_unless_equals_int (gst_pad_link (srcpad, sinkpad1), GST_PAD_LINK_OK);
+ gst_object_unref (srcpad);
+
+ srcpad = gst_element_get_static_pad (videotestsrc, "src");
+ sinkpad2 = gst_element_get_request_pad (ebin, "video_1");
+ fail_unless_equals_int (gst_pad_link (srcpad, sinkpad2), GST_PAD_LINK_OK);
+ gst_object_unref (srcpad);
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *msg;
+
+ /* poll the bus until we get EOS without any errors */
+ msg = gst_bus_timed_pop (bus, GST_SECOND / 10);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ fail ("GST_MESSAGE_ERROR");
+ break;
+ case GST_MESSAGE_EOS:
+ done = TRUE;
+ break;
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ }
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_element_release_request_pad (GST_ELEMENT (ebin), sinkpad1);
+ gst_object_unref (sinkpad1);
+ gst_element_release_request_pad (GST_ELEMENT (ebin), sinkpad2);
+ gst_object_unref (sinkpad2);
+
+ gst_object_unref (bus);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_encodebin_impossible_element_combination)
+{
+ GstElement *ebin;
+ GstEncodingProfile *prof;
+ GstCaps *ogg, *x264;
+
+ ebin = gst_element_factory_make ("x264enc", NULL);
+ if (ebin == NULL) {
+ GST_DEBUG ("No available h264 encoder, skipping test");
+ return;
+ }
+ gst_object_unref (ebin);
+
+ /* Make sure that impossible combinations of encoders and muxer
+ * properly fail. In this case we try putting h264 in ogg.
+ *
+ * To properly test we abort early, we use a presence of zero for the
+ * h264 stream profile. */
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ ogg = gst_caps_new_simple ("application/ogg", NULL);
+ prof = (GstEncodingProfile *) gst_encoding_container_profile_new ((gchar *)
+ "myprofile", NULL, ogg, NULL);
+ gst_caps_unref (ogg);
+
+ x264 = gst_caps_new_simple ("video/x-h264", NULL);
+ fail_unless (gst_encoding_container_profile_add_profile
+ (GST_ENCODING_CONTAINER_PROFILE (prof),
+ (GstEncodingProfile *) gst_encoding_video_profile_new (x264, NULL,
+ NULL, 0)));
+ gst_caps_unref (x264);
+
+ g_object_set (ebin, "profile", prof, NULL);
+ gst_encoding_profile_unref (prof);
+
+ /* It will go to READY... */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_READY),
+ GST_STATE_CHANGE_SUCCESS);
+ /* ... but to not PAUSED */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_FAILURE);
+
+ gst_element_set_state (ebin, GST_STATE_NULL);
+
+ gst_object_unref (ebin);
+};
+
+GST_END_TEST;
+
+static void
+_test_encodebin_reuse (GstEncodingProfile * prof1, GstEncodingProfile * prof2)
+{
+ GstElement *ebin;
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+
+ /* Set a profile on encodebin... */
+ if (prof1)
+ g_object_set (ebin, "profile", prof1, NULL);
+
+ /* Make sure we can go to PAUSED */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ if (prof2)
+ g_object_set (ebin, "profile", prof2, NULL);
+
+ /* Make sure we can go to PLAYING */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* Set back to NULL */
+ fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (ebin);
+}
+
+GST_START_TEST (test_encodebin_reuse)
+{
+ GstEncodingProfile *prof1;
+ GstEncodingProfile *prof2;
+ GstEncodingProfile *prof3;
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("application/ogg", NULL);
+ prof1 = (GstEncodingProfile *) gst_encoding_container_profile_new ((gchar *)
+ "myprofile", NULL, caps, NULL);
+ gst_caps_unref (caps);
+
+ prof2 = create_ogg_theora_vorbis_profile (1, 1);
+ prof3 = create_vorbis_only_profile ();
+
+ _test_encodebin_reuse (prof1, NULL);
+ _test_encodebin_reuse (prof1, prof1);
+
+ _test_encodebin_reuse (prof1, prof2);
+
+ _test_encodebin_reuse (prof2, prof3);
+
+ gst_encoding_profile_unref (prof1);
+ gst_encoding_profile_unref (prof2);
+ gst_encoding_profile_unref (prof3);
+};
+
+GST_END_TEST;
+
+
+static Suite *
+encodebin_suite (void)
+{
+ Suite *s = suite_create ("encodebin element");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_encodebin_states);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_static);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_nopreset_static);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_dynamic);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_multiple_static);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_multiple_dynamic);
+ tcase_add_test (tc_chain, test_encodebin_sink_pads_dynamic_encoder);
+ tcase_add_test (tc_chain, test_encodebin_render_audio_static);
+ tcase_add_test (tc_chain, test_encodebin_render_audio_only_static);
+ tcase_add_test (tc_chain, test_encodebin_render_audio_dynamic);
+ tcase_add_test (tc_chain, test_encodebin_render_audio_video_static);
+ tcase_add_test (tc_chain, test_encodebin_render_audio_video_dynamic);
+ tcase_add_test (tc_chain, test_encodebin_impossible_element_combination);
+ tcase_add_test (tc_chain, test_encodebin_reuse);
+
+ return s;
+}
+
+GST_CHECK_MAIN (encodebin);
diff --git a/tests/check/elements/libvisual.c b/tests/check/elements/libvisual.c
new file mode 100644
index 0000000..f2f37d7
--- /dev/null
+++ b/tests/check/elements/libvisual.c
@@ -0,0 +1,118 @@
+/* GStreamer unit test for libvisual plugin
+ *
+ * Copyright (C) 2007 Tim-Philipp Müller <tim at centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+static gboolean
+filter_func (GstPluginFeature * feature, gpointer user_data)
+{
+ return (g_str_has_prefix (GST_OBJECT_NAME (feature), "libvisual_"));
+}
+
+static void
+test_shutdown_for_factory (const gchar * factory_name)
+{
+ GstElement *pipeline, *src, *q, *ac, *vis, *cf, *q2, *sink;
+ GstCaps *caps;
+ guint i;
+
+ pipeline = gst_pipeline_new (NULL);
+
+ src = gst_check_setup_element ("audiotestsrc");
+ q = gst_check_setup_element ("queue");
+ ac = gst_check_setup_element ("audioconvert");
+
+ GST_INFO ("Using %s", factory_name);
+ vis = gst_check_setup_element (factory_name);
+
+ cf = gst_check_setup_element ("capsfilter");
+ caps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, 320,
+ "height", G_TYPE_INT, 240, "framerate", GST_TYPE_FRACTION, 15, 1, NULL);
+ g_object_set (cf, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ q2 = gst_check_setup_element ("queue");
+ gst_object_set_name (GST_OBJECT (q2), "queue2");
+ sink = gst_check_setup_element ("fakesink");
+
+ /* don't want to sync against the clock, the more throughput the better */
+ g_object_set (src, "is-live", FALSE, NULL);
+ g_object_set (sink, "sync", FALSE, NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, q, ac, vis, cf, q2, sink, NULL);
+ fail_if (!gst_element_link_many (src, q, ac, vis, cf, q2, sink, NULL));
+
+ /* now, wait until pipeline is running and then shut it down again; repeat;
+ * this makes sure we can shut down cleanly while stuff is going on in the
+ * chain function */
+ for (i = 0; i < 50; ++i) {
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_get_state (pipeline, NULL, NULL, -1);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_usleep (100);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ }
+
+ gst_object_unref (pipeline);
+}
+
+GST_START_TEST (test_shutdown)
+{
+ const gchar *factory_to_test;
+
+ factory_to_test = g_getenv ("LIBVISUAL_UNIT_TEST_FACTORY");
+
+ if (factory_to_test == NULL) {
+ GList *list, *l;
+
+ list = gst_default_registry_feature_filter (filter_func, FALSE, NULL);
+ if (list == NULL) {
+ g_print ("No libvisual plugins installed.\n");
+ return;
+ }
+ for (l = list; l != NULL; l = l->next) {
+ test_shutdown_for_factory (GST_OBJECT_NAME (l->data));
+ }
+ gst_plugin_feature_list_free (list);
+ } else {
+ test_shutdown_for_factory (factory_to_test);
+ }
+}
+
+GST_END_TEST;
+
+static Suite *
+libvisual_suite (void)
+{
+ Suite *s = suite_create ("libvisual");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ /* set one manually, since we're currently built as uninst program with
+ * the default timeout of 3 seconds, which is way too short */
+ tcase_set_timeout (tc_chain, 30);
+
+ tcase_add_test (tc_chain, test_shutdown);
+
+ return s;
+}
+
+GST_CHECK_MAIN (libvisual);
diff --git a/tests/check/elements/vorbisdec.c b/tests/check/elements/vorbisdec.c
new file mode 100644
index 0000000..ecdc329
--- /dev/null
+++ b/tests/check/elements/vorbisdec.c
@@ -0,0 +1,339 @@
+/* GStreamer
+ *
+ * unit test for vorbisdec
+ *
+ * Copyright (C) <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 <unistd.h>
+
+#include <gst/check/gstcheck.h>
+
+#include <vorbis/codec.h>
+#include <vorbis/vorbisenc.h>
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mysrcpad, *mysinkpad;
+
+/* a valid first header packet */
+static guchar identification_header[30] = {
+ 1, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 0, 0, 0, 0, /* vorbis_version */
+ 2, /* audio_channels */
+ 0x44, 0xac, 0, 0, /* sample_rate */
+ 0xff, 0xff, 0xff, 0xff, /* bitrate_maximum */
+ 0x00, 0xee, 0x02, 0x00, /* bitrate_nominal */
+ 0xff, 0xff, 0xff, 0xff, /* bitrate_minimum */
+ 0xb8, /* blocksize_0, blocksize_1 */
+ 0x01, /* framing_flag */
+};
+
+static guchar comment_header[] = {
+ 3, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 2, 0, 0, 0, /* vendor_length */
+ 'm', 'e',
+ 1, 0, 0, 0, /* user_comment_list_length */
+ 9, 0, 0, 0, /* length comment[0] */
+ 'A', 'R', 'T', 'I', 'S', 'T', '=', 'm', 'e',
+ 0x01, /* framing bit */
+};
+
+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_vorbisdec (void)
+{
+ GstElement *vorbisdec;
+
+ GST_DEBUG ("setup_vorbisdec");
+ vorbisdec = gst_check_setup_element ("vorbisdec");
+ mysrcpad = gst_check_setup_src_pad (vorbisdec, &srctemplate, NULL);
+ mysinkpad = gst_check_setup_sink_pad (vorbisdec, &sinktemplate, NULL);
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ return vorbisdec;
+}
+
+static void
+cleanup_vorbisdec (GstElement * vorbisdec)
+{
+ GST_DEBUG ("cleanup_vorbisdec");
+ gst_element_set_state (vorbisdec, GST_STATE_NULL);
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (vorbisdec);
+ gst_check_teardown_sink_pad (vorbisdec);
+ gst_check_teardown_element (vorbisdec);
+}
+
+GST_START_TEST (test_empty_identification_header)
+{
+ GstElement *vorbisdec;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ GstMessage *message;
+
+ vorbisdec = setup_vorbisdec ();
+ bus = gst_bus_new ();
+
+ fail_unless (gst_element_set_state (vorbisdec,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ inbuffer = gst_buffer_new_and_alloc (0);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+
+ /* set a bus here so we avoid getting state change messages */
+ gst_element_set_bus (vorbisdec, bus);
+
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR);
+ /* ... but it ends up being collected on the global buffer list */
+ fail_unless_equals_int (g_list_length (buffers), 0);
+
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ fail_unless_message_error (message, STREAM, DECODE);
+ gst_message_unref (message);
+ gst_element_set_bus (vorbisdec, NULL);
+
+ /* cleanup */
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_vorbisdec (vorbisdec);
+}
+
+GST_END_TEST;
+
+/* FIXME: also tests comment header */
+GST_START_TEST (test_identification_header)
+{
+ GstElement *vorbisdec;
+ GstBuffer *inbuffer;
+ GstBus *bus;
+ GstMessage *message;
+ GstTagList *tag_list;
+ gchar *artist;
+
+ vorbisdec = setup_vorbisdec ();
+ fail_unless (gst_element_set_state (vorbisdec,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (30);
+ gst_buffer_fill (inbuffer, 0, identification_header, 30);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ gst_element_set_bus (vorbisdec, bus);
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+ fail_if ((message = gst_bus_pop (bus)) != NULL);
+
+ inbuffer = gst_buffer_new_and_alloc (sizeof (comment_header));
+ gst_buffer_fill (inbuffer, 0, comment_header, sizeof (comment_header));
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+ /* there's a tag message waiting */
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ gst_message_parse_tag (message, &tag_list);
+ fail_unless_equals_int (gst_tag_list_get_tag_size (tag_list, GST_TAG_ARTIST),
+ 1);
+ fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist));
+ fail_unless_equals_string (artist, "me");
+ g_free (artist);
+ fail_unless_equals_int (gst_tag_list_get_tag_size (tag_list, "album"), 0);
+ gst_tag_list_free (tag_list);
+ gst_message_unref (message);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (vorbisdec, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_vorbisdec (vorbisdec);
+}
+
+GST_END_TEST;
+
+static vorbis_comment vc;
+static vorbis_dsp_state vd;
+static vorbis_info vi;
+static vorbis_block vb;
+
+static GstBuffer *
+_create_codebook_header_buffer (void)
+{
+ GstBuffer *buffer;
+ ogg_packet header;
+ ogg_packet header_comm;
+ ogg_packet header_code;
+
+ vorbis_info_init (&vi);
+ vorbis_encode_setup_vbr (&vi, 1, 44000, 0.5);
+ vorbis_encode_setup_init (&vi);
+ vorbis_analysis_init (&vd, &vi);
+ vorbis_block_init (&vd, &vb);
+ vorbis_comment_init (&vc);
+ vorbis_analysis_headerout (&vd, &vc, &header, &header_comm, &header_code);
+
+ buffer = gst_buffer_new_and_alloc (header_code.bytes);
+ gst_buffer_fill (buffer, 0, header_code.packet, header_code.bytes);
+
+ return buffer;
+}
+
+static GstBuffer *
+_create_audio_buffer (void)
+{
+ GstBuffer *buffer;
+ ogg_packet packet;
+ float **vorbis_buffer;
+ gint i;
+
+ vorbis_buffer = vorbis_analysis_buffer (&vd, 44100);
+ for (i = 0; i < 44100 * 1; ++i)
+ vorbis_buffer[0][i] = 0.0;
+ vorbis_analysis_wrote (&vd, 44100);
+ vorbis_analysis_blockout (&vd, &vb);
+ vorbis_analysis (&vb, NULL);
+ vorbis_bitrate_addblock (&vb);
+ vorbis_bitrate_flushpacket (&vd, &packet);
+ buffer = gst_buffer_new_and_alloc (packet.bytes);
+ gst_buffer_fill (buffer, 0, packet.packet, packet.bytes);
+
+ vorbis_comment_clear (&vc);
+ vorbis_block_clear (&vb);
+ vorbis_dsp_clear (&vd);
+ vorbis_info_clear (&vi);
+
+ return buffer;
+}
+
+GST_START_TEST (test_empty_vorbis_packet)
+{
+ GstElement *vorbisdec;
+ GstBuffer *inbuffer;
+ GstMessage *message;
+ GstBus *bus;
+
+ vorbisdec = setup_vorbisdec ();
+ fail_unless_equals_int (gst_element_set_state (vorbisdec, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_SUCCESS);
+
+ bus = gst_bus_new ();
+
+ inbuffer = gst_buffer_new_and_alloc (30);
+ gst_buffer_fill (inbuffer, 0, identification_header, 30);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ gst_element_set_bus (vorbisdec, bus);
+
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+ fail_if ((message = gst_bus_pop (bus)) != NULL);
+
+ inbuffer = gst_buffer_new_and_alloc (sizeof (comment_header));
+ gst_buffer_fill (inbuffer, 0, comment_header, sizeof (comment_header));
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_ref (inbuffer);
+
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
+ /* ... and nothing ends up on the global buffer list */
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+
+ /* send minimal codebook header and audio packers */
+ inbuffer = _create_codebook_header_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* now send an empty vorbis packet, which should just be skipped */
+ inbuffer = gst_buffer_new_and_alloc (0);
+ gst_buffer_ref (inbuffer);
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+ fail_unless (g_list_length (buffers) == 0);
+
+ /* create and push an encoded audio packet */
+ inbuffer = _create_audio_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* now send another empty vorbis packet, which should just be skipped */
+ inbuffer = gst_buffer_new_and_alloc (0);
+ gst_buffer_ref (inbuffer);
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+ gst_buffer_unref (inbuffer);
+
+ /* make sure there's no error on the bus */
+ message = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
+ fail_if (message != NULL);
+
+ /* cleanup */
+ gst_bus_set_flushing (bus, TRUE);
+ gst_element_set_bus (vorbisdec, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_vorbisdec (vorbisdec);
+}
+
+GST_END_TEST;
+
+static Suite *
+vorbisdec_suite (void)
+{
+ Suite *s = suite_create ("vorbisdec");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_empty_identification_header);
+ tcase_add_test (tc_chain, test_identification_header);
+ tcase_add_test (tc_chain, test_empty_vorbis_packet);
+
+ return s;
+}
+
+GST_CHECK_MAIN (vorbisdec);
diff --git a/tests/check/elements/vorbistag.c b/tests/check/elements/vorbistag.c
new file mode 100644
index 0000000..9601625
--- /dev/null
+++ b/tests/check/elements/vorbistag.c
@@ -0,0 +1,411 @@
+/* GStreamer
+ *
+ * unit test for vorbisdec
+ *
+ * Copyright (C) <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 <unistd.h>
+#include <glib.h>
+
+#include <vorbis/codec.h>
+#include <vorbis/vorbisenc.h>
+
+#include <gst/gsttagsetter.h>
+#include <gst/check/gstcheck.h>
+
+/* a valid first header packet */
+static guchar identification_header[30] = {
+ 1, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 0, 0, 0, 0, /* vorbis_version */
+ 2, /* audio_channels */
+ 0x44, 0xac, 0, 0, /* sample_rate */
+ 0xff, 0xff, 0xff, 0xff, /* bitrate_maximum */
+ 0x00, 0xee, 0x02, 0x00, /* bitrate_nominal */
+ 0xff, 0xff, 0xff, 0xff, /* bitrate_minimum */
+ 0xb8, /* blocksize_0, blocksize_1 */
+ 0x01 /* framing_flag */
+};
+
+static guchar artist_comment_header[] = {
+ 3, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 2, 0, 0, 0, /* vendor_length */
+ 'm', 'e',
+ 1, 0, 0, 0, /* user_comment_list_length */
+ 9, 0, 0, 0, /* length comment[0] */
+ 'A', 'R', 'T', 'I', 'S', 'T', '=', 'm', 'e',
+ 0x01, /* framing bit */
+};
+
+static guchar title_comment_header[] = {
+ 3, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 2, 0, 0, 0, /* vendor_length */
+ 'm', 'e',
+ 1, 0, 0, 0, /* user_comment_list_length */
+ 12, 0, 0, 0, /* length comment[0] */
+ 'T', 'I', 'T', 'L', 'E', '=', 'f', 'o', 'o', 'b', 'a', 'r',
+ 0x01, /* framing bit */
+};
+
+static guchar empty_comment_header[] = {
+ 3, /* packet_type */
+ 'v', 'o', 'r', 'b', 'i', 's',
+ 2, 0, 0, 0, /* vendor_length */
+ 'm', 'e',
+ 0, 0, 0, 0, /* user_comment_list_length */
+ 0x01, /* framing bit */
+};
+
+
+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 GstPad *mysrcpad, *mysinkpad;
+static GAsyncQueue *pending_buffers;
+static gulong id;
+
+
+static GstElement *
+setup_vorbistag (void)
+{
+ GstElement *vorbistag;
+
+ GST_DEBUG ("setup_vorbistag");
+ vorbistag = gst_check_setup_element ("vorbistag");
+ mysrcpad = gst_check_setup_src_pad (vorbistag, &srctemplate, NULL);
+ mysinkpad = gst_check_setup_sink_pad (vorbistag, &sinktemplate, NULL);
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ return vorbistag;
+}
+
+static void
+cleanup_vorbistag (GstElement * vorbistag)
+{
+ GST_DEBUG ("cleanup_vorbistag");
+ gst_element_set_state (vorbistag, GST_STATE_NULL);
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (vorbistag);
+ gst_check_teardown_sink_pad (vorbistag);
+ gst_check_teardown_element (vorbistag);
+}
+
+
+static GstProbeReturn
+buffer_probe (GstPad * pad, GstProbeType type, GstBuffer * buffer,
+ gpointer unused)
+{
+ g_async_queue_push (pending_buffers, gst_buffer_ref (buffer));
+ return GST_PROBE_OK;
+}
+
+static void
+start_pipeline (GstElement * element)
+{
+ id = gst_pad_add_probe (mysinkpad, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) buffer_probe, NULL, NULL);
+
+ pending_buffers = g_async_queue_new ();
+ gst_element_set_state (element, GST_STATE_PLAYING);
+}
+
+static GstBuffer *
+get_buffer (void)
+{
+ return GST_BUFFER (g_async_queue_pop (pending_buffers));
+}
+
+static void
+stop_pipeline (GstElement * element)
+{
+ GstBuffer *buf;
+
+ while ((buf = g_async_queue_try_pop (pending_buffers)))
+ gst_buffer_unref (buf);
+
+ gst_pad_remove_probe (mysinkpad, id);
+ id = 0;
+
+ gst_element_set_state (element, GST_STATE_NULL);
+
+ while ((buf = g_async_queue_try_pop (pending_buffers)))
+ gst_buffer_unref (buf);
+
+ g_async_queue_unref (pending_buffers);
+ pending_buffers = NULL;
+}
+
+static void
+compare_buffer (GstBuffer * buf, const guint8 * data, gsize size)
+{
+ guint8 *bdata;
+ gsize bsize;
+
+ bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ fail_unless_equals_int (bsize, size);
+ fail_unless_equals_int (memcmp (bdata, data, size), 0);
+ gst_buffer_unmap (buf, bdata, bsize);
+}
+
+static vorbis_comment vc;
+static vorbis_dsp_state vd;
+static vorbis_info vi;
+static vorbis_block vb;
+
+static GstBuffer *
+_create_codebook_header_buffer (void)
+{
+ GstBuffer *buffer;
+ ogg_packet header;
+ ogg_packet header_comm;
+ ogg_packet header_code;
+
+ vorbis_info_init (&vi);
+ vorbis_encode_setup_vbr (&vi, 1, 44000, 0.5);
+ vorbis_encode_setup_init (&vi);
+ vorbis_analysis_init (&vd, &vi);
+ vorbis_block_init (&vd, &vb);
+ vorbis_comment_init (&vc);
+ vorbis_analysis_headerout (&vd, &vc, &header, &header_comm, &header_code);
+
+ buffer = gst_buffer_new_and_alloc (header_code.bytes);
+ gst_buffer_fill (buffer, 0, header_code.packet, header_code.bytes);
+
+ return buffer;
+}
+
+static GstBuffer *
+_create_audio_buffer (void)
+{
+ GstBuffer *buffer;
+ ogg_packet packet;
+ float **vorbis_buffer G_GNUC_UNUSED;
+
+ vorbis_buffer = vorbis_analysis_buffer (&vd, 0);
+ vorbis_analysis_wrote (&vd, 0);
+ vorbis_analysis_blockout (&vd, &vb);
+ vorbis_analysis (&vb, NULL);
+ vorbis_bitrate_addblock (&vb);
+ vorbis_bitrate_flushpacket (&vd, &packet);
+ buffer = gst_buffer_new_and_alloc (packet.bytes);
+ gst_buffer_fill (buffer, 0, packet.packet, packet.bytes);
+
+ vorbis_comment_clear (&vc);
+ vorbis_block_clear (&vb);
+ vorbis_dsp_clear (&vd);
+ vorbis_info_clear (&vi);
+
+ return buffer;
+}
+
+
+GST_START_TEST (test_empty_tags_set)
+{
+ GstTagList *tags;
+ GstElement *vorbistag;
+ GstBuffer *inbuffer, *outbuffer;
+
+ vorbistag = setup_vorbistag ();
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, "foobar", NULL);
+ gst_tag_setter_merge_tags (GST_TAG_SETTER (vorbistag), tags,
+ GST_TAG_MERGE_REPLACE);
+ gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (vorbistag),
+ GST_TAG_MERGE_KEEP_ALL);
+ gst_tag_list_free (tags);
+
+ start_pipeline (vorbistag);
+
+ /* send identification header */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (identification_header));
+ gst_buffer_fill (inbuffer, 0, identification_header,
+ sizeof (identification_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send empty comment buffer */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (empty_comment_header));
+ gst_buffer_fill (inbuffer, 0, empty_comment_header,
+ sizeof (empty_comment_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send minimal codebook header and audio packers */
+ inbuffer = _create_codebook_header_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+ inbuffer = _create_audio_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+
+ /* check identification header is unchanged */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, identification_header,
+ sizeof (identification_header));
+ gst_buffer_unref (outbuffer);
+
+ /* check comment header is correct */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, title_comment_header,
+ sizeof (title_comment_header));
+ gst_buffer_unref (outbuffer);
+
+ stop_pipeline (vorbistag);
+ cleanup_vorbistag (vorbistag);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_filled_tags_unset)
+{
+ GstTagList *tags;
+ GstElement *vorbistag;
+ GstBuffer *inbuffer, *outbuffer;
+
+ vorbistag = setup_vorbistag ();
+
+ tags = gst_tag_list_new ();
+ gst_tag_setter_merge_tags (GST_TAG_SETTER (vorbistag), tags,
+ GST_TAG_MERGE_REPLACE);
+ gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (vorbistag),
+ GST_TAG_MERGE_KEEP_ALL);
+ gst_tag_list_free (tags);
+
+ start_pipeline (vorbistag);
+
+ /* send identification header */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (identification_header));
+ gst_buffer_fill (inbuffer, 0, identification_header,
+ sizeof (identification_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send empty comment buffer */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (title_comment_header));
+ gst_buffer_fill (inbuffer, 0, title_comment_header,
+ sizeof (title_comment_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send minimal codebook header and audio packers */
+ inbuffer = _create_codebook_header_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+ inbuffer = _create_audio_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+
+ /* check identification header is unchanged */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, identification_header,
+ sizeof (identification_header));
+ gst_buffer_unref (outbuffer);
+
+ /* check comment header is correct */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, empty_comment_header,
+ sizeof (empty_comment_header));
+ gst_buffer_unref (outbuffer);
+
+ stop_pipeline (vorbistag);
+ cleanup_vorbistag (vorbistag);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_filled_tags_change)
+{
+ GstTagList *tags;
+ GstElement *vorbistag;
+ GstBuffer *inbuffer, *outbuffer;
+
+ vorbistag = setup_vorbistag ();
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, "foobar", NULL);
+ gst_tag_setter_merge_tags (GST_TAG_SETTER (vorbistag), tags,
+ GST_TAG_MERGE_REPLACE);
+ gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (vorbistag),
+ GST_TAG_MERGE_KEEP_ALL);
+ gst_tag_list_free (tags);
+
+ start_pipeline (vorbistag);
+
+ /* send identification header */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (identification_header));
+ gst_buffer_fill (inbuffer, 0, identification_header,
+ sizeof (identification_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send empty comment buffer */
+ inbuffer = gst_buffer_new_and_alloc (sizeof (artist_comment_header));
+ gst_buffer_fill (inbuffer, 0, artist_comment_header,
+ sizeof (artist_comment_header));
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+ /* send minimal codebook header and audio packers */
+ inbuffer = _create_codebook_header_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+ inbuffer = _create_audio_buffer ();
+ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK);
+
+
+ /* check identification header is unchanged */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, identification_header,
+ sizeof (identification_header));
+ gst_buffer_unref (outbuffer);
+
+ /* check comment header is correct */
+ outbuffer = get_buffer ();
+ compare_buffer (outbuffer, title_comment_header,
+ sizeof (title_comment_header));
+ gst_buffer_unref (outbuffer);
+
+ stop_pipeline (vorbistag);
+ cleanup_vorbistag (vorbistag);
+}
+
+GST_END_TEST;
+
+
+
+static Suite *
+vorbistag_suite (void)
+{
+ Suite *s = suite_create ("vorbistag");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_empty_tags_set);
+ tcase_add_test (tc_chain, test_filled_tags_unset);
+ tcase_add_test (tc_chain, test_filled_tags_change);
+
+ return s;
+}
+
+GST_CHECK_MAIN (vorbistag)
diff --git a/tests/check/generic/clock-selection.c b/tests/check/generic/clock-selection.c
new file mode 100644
index 0000000..8e332f8
--- /dev/null
+++ b/tests/check/generic/clock-selection.c
@@ -0,0 +1,72 @@
+/* GStreamer
+ *
+ * unit test for clock selection
+ *
+ * Copyright (C) <2005> Wim Taymans <wim at fluendo dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_add)
+{
+ GstElement *pipeline;
+ GstStateChangeReturn ret;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ fail_unless (pipeline != NULL, "could not create pipeline");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "could not set to READY");
+
+ /* cleanup */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+volume_suite (void)
+{
+ Suite *s = suite_create ("clocks");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_add);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = volume_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/states.c b/tests/check/generic/states.c
new file mode 100644
index 0000000..4db8a1b
--- /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 <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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+
+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_DEBUG ("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_DEBUG ("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_DEBUG ("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-base.supp b/tests/check/gst-plugins-base.supp
new file mode 100644
index 0000000..0d0705d
--- /dev/null
+++ b/tests/check/gst-plugins-base.supp
@@ -0,0 +1,389 @@
+# A suppression for an old bug in libtheora (fixed in more recent versions,
+# but some of our buildslaves still have this)
+{
+ <Leaky libtheora>
+ Memcheck:Leak
+ fun:realloc
+ fun:oggpackB_write
+ fun:EncodeData
+ obj:/usr/lib/libtheora.so*
+ fun:theora_encode_YUVin
+}
+
+# Suppression for pango on ubuntu edgy/x86 and textoverlay test
+{
+ <pango>
+ Memcheck:Param
+ access(pathname)
+ fun:access
+ fun:pango_config_key_get
+ fun:pango_find_map
+}
+
+{
+ <suppression for a singleton in GIO that can't be cleaned up>
+ Memcheck:Leak
+ fun:realloc
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ fun:g_type_create_instance
+ fun:g_object_constructor
+ fun:g_object_newv
+ fun:g_object_new_valist
+ fun:g_object_new
+ fun:get_default_vfs
+ fun:g_once_impl
+ fun:g_vfs_get_default
+}
+
+{
+ <suppression for a singleton in GIO that can't be cleaned up>
+ Memcheck:Leak
+ fun:malloc
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ fun:g_type_create_instance
+ fun:g_object_constructor
+ fun:g_object_newv
+ fun:g_object_new_valist
+ fun:g_object_new
+ fun:get_default_vfs
+ fun:g_once_impl
+ fun:g_vfs_get_default
+}
+
+{
+ <ALSA unitialised access>
+ Memcheck:Cond
+ obj:/usr/lib/libasound.so.*
+ fun:snd_pcm_hw_params_set_buffer_time_near
+}
+
+{
+ <ALSA unitialized access>
+ Memcheck:Cond
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_pcm_hw_params_set_buffer_time_near
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsa_device_property_probe_get_values
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:calloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_hook_load
+ obj:*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_searcha_hooks
+ fun:snd_config_searchva_hooks
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_search_definition
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsa_device_property_probe_get_values
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_searcha_hooks
+ fun:snd_config_searchva_hooks
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_search_definition
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsa_device_property_probe_get_values
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_searcha_hooks
+ fun:snd_config_searchva_hooks
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_search_definition
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsa_device_property_probe_get_values
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_searcha_hooks
+ fun:snd_config_searchva_hooks
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_search_definition
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsa_device_property_probe_get_values
+}
+
+{
+ <One time init in ALSA>
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_hctl_open
+ fun:snd_mixer_attach
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_proplist_sets
+ fun:pa_context_new_with_proplist
+ fun:pa_context_new
+ obj:/usr/lib/alsa-lib/libasound_module_pcm_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_pcm_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_hook_load
+ obj:/usr/lib/alsa-lib/libasound_module_ctl_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_proplist_sets
+ fun:pa_context_new_with_proplist
+ fun:pa_context_new
+ obj:/usr/lib/alsa-lib/libasound_module_ctl_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_ctl_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_ctl_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_ctl_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:snd_config_hook_load
+ obj:/usr/lib/alsa-lib/libasound_module_pcm_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_pcm_pulse.so
+}
+
+{
+ <Pulseaudio ALSA plugin initialisation>
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ obj:/usr/lib/libpulse.so.*
+ fun:pa_mainloop_dispatch
+ obj:/usr/lib/alsa-lib/libasound_module_pcm_pulse.so
+}
+
+{
+ <One time ALSA init>
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ obj:/usr/lib/libasound.so.*
+ fun:gst_alsasrc_open
+}
+
+{
+ <Fontconfig init>
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:FcConfigParseAndLoad
+}
+
+{
+ <Fontconfig init>
+ Memcheck:Leak
+ fun:realloc
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ fun:FcDefaultSubstitute
+}
+
+{
+ <Fontconfig init>
+ Memcheck:Leak
+ fun:realloc
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ fun:FcConfigSubstituteWithPat
+}
+
+{
+ <Fontconfig init>
+ Memcheck:Leak
+ fun:realloc
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ obj:/usr/lib/libfontconfig.so.*
+ fun:FcFontRenderPrepare
+}
diff --git a/tests/check/gst/typefindfunctions.c b/tests/check/gst/typefindfunctions.c
new file mode 100644
index 0000000..c9d8a33
--- /dev/null
+++ b/tests/check/gst/typefindfunctions.c
@@ -0,0 +1,407 @@
+/* GStreamer unit tests for the -base typefind functions
+ *
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+#include <gst/base/gsttypefindhelper.h>
+
+GST_START_TEST (test_quicktime_mpeg4video)
+{
+ /* quicktime redirect file which starts with what could also be interpreted
+ * as an MPEG-4 video object layer start code */
+ const guint8 qt_redirect_396042[] =
+ { 0x00, 0x00, 0x01, 0x22, 0x6d, 0x6f, 0x6f, 0x76, 0x00, 0x00, 0x01, 0x1a,
+ 0x72, 0x6d, 0x72, 0x61, 0x00, 0x00, 0x00, 0x86, 0x72, 0x6d, 0x64, 0x61,
+ 0x00, 0x00, 0x00, 0x54, 0x72, 0x64, 0x72, 0x66, 0x00, 0x00, 0x00, 0x00,
+ 0x75, 0x72, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x40, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x71, 0x74,
+ 0x76, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6a, 0x61, 0x6e, 0x2f, 0x6a,
+ 0x34, 0x37, 0x64, 0x35, 0x32, 0x6f, 0x6f, 0x2f, 0x71, 0x74, 0x37, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x6d, 0x6f, 0x76, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x72, 0x6d, 0x64, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0xf0, 0x00, 0x00, 0x00, 0x1a, 0x72, 0x6d, 0x76, 0x63,
+ 0x00, 0x00, 0x00, 0x00, 0x71, 0x74, 0x69, 0x6d, 0x06, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x72, 0x6d,
+ 0x64, 0x61, 0x00, 0x00, 0x00, 0x5a, 0x72, 0x64, 0x72, 0x66, 0x00, 0x00,
+ 0x00, 0x00, 0x75, 0x72, 0x6c, 0x20, 0x00, 0x00, 0x00, 0x46, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e,
+ 0x71, 0x74, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6a, 0x61, 0x6e,
+ 0x2f, 0x6a, 0x34, 0x37, 0x64, 0x35, 0x32, 0x6f, 0x6f, 0x2f, 0x38, 0x38,
+ 0x34, 0x38, 0x31, 0x32, 0x35, 0x5f, 0x32, 0x5f, 0x33, 0x35, 0x30, 0x5f,
+ 0x72, 0x65, 0x66, 0x2e, 0x6d, 0x6f, 0x76, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x72, 0x6d, 0x64, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xf0,
+ 0x00, 0x00, 0x00, 0x1a, 0x72, 0x6d, 0x76, 0x63, 0x00, 0x00, 0x00, 0x00,
+ 0x71, 0x74, 0x69, 0x6d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+ };
+ GstTypeFindProbability prob;
+ const gchar *type;
+ GstBuffer *buf;
+ GstCaps *caps = NULL;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) qt_redirect_396042, NULL,
+ sizeof (qt_redirect_396042), 0, sizeof (qt_redirect_396042)));
+
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type: %" GST_PTR_FORMAT, caps);
+
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "video/quicktime");
+ fail_unless (prob > GST_TYPE_FIND_MINIMUM && prob <= GST_TYPE_FIND_MAXIMUM);
+
+ gst_buffer_unref (buf);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_broken_flac_in_ogg)
+{
+ const guint8 flac_id_packet[4] = { 'f', 'L', 'a', 'C' };
+ GstTypeFindProbability prob;
+ const gchar *type;
+ GstBuffer *buf;
+ GstCaps *caps = NULL;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) flac_id_packet, NULL,
+ sizeof (flac_id_packet), 0, sizeof (flac_id_packet)));
+
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type: %" GST_PTR_FORMAT, caps);
+
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "audio/x-flac");
+ fail_unless (prob > GST_TYPE_FIND_MINIMUM && prob <= GST_TYPE_FIND_MAXIMUM);
+
+ gst_buffer_unref (buf);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static GstCaps *
+typefind_test_file (const gchar * filename)
+{
+ GstBuffer *buf;
+ GError *err = NULL;
+ GstCaps *caps = NULL;
+ gchar *path, *data = NULL;
+ gsize data_len;
+
+ path = g_build_filename (GST_TEST_FILES_PATH, filename, NULL);
+ GST_LOG ("reading file '%s'", path);
+ if (!g_file_get_contents (path, &data, &data_len, &err)) {
+ g_error ("error loading test file: %s", err->message);
+ }
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) data, NULL, data_len, 0, data_len));
+
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, NULL);
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type: %" GST_PTR_FORMAT, caps);
+
+ gst_buffer_unref (buf);
+ g_free (data);
+ g_free (path);
+
+ return caps;
+}
+
+GST_START_TEST (test_jpeg_not_ac3)
+{
+ const gchar *type;
+ GstCaps *caps = NULL;
+
+ caps = typefind_test_file ("partialframe.mjpeg");
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "image/jpeg");
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_mpegts)
+{
+ GstStructure *s;
+ gboolean systemstream = FALSE;
+ GstCaps *caps = NULL;
+ gint packetsize = -1;
+
+ caps = typefind_test_file ("623663.mts");
+ s = gst_caps_get_structure (caps, 0);
+ fail_unless (gst_structure_has_name (s, "video/mpegts"));
+ fail_unless (gst_structure_has_field (s, "systemstream"));
+ fail_unless (gst_structure_get_boolean (s, "systemstream", &systemstream));
+ fail_unless_equals_int (systemstream, TRUE);
+ fail_unless (gst_structure_has_field (s, "packetsize"));
+ fail_unless (gst_structure_get_int (s, "packetsize", &packetsize));
+ fail_unless_equals_int (packetsize, 192);
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+struct ac3_frmsize
+{
+ unsigned frmsizecod;
+ unsigned frmsize;
+};
+
+static void
+make_ac3_packet (guint8 * data, guint bytesize, guint bsid)
+{
+ /* Actually not a fully valid packet; if the typefinder starts to
+ * check e.g. the CRCs, this test needs to be improved as well. */
+ const guint8 ac3_header[] = {
+ 0x0b, 0x77, /* syncword */
+ 0x00, 0x00, /* crc1 */
+ 0x00, /* fscod 0xc0, frmsizecod 0x3f */
+ 0x00 /* bsid 0xf8, bsmod 0x07 */
+ };
+ const struct ac3_frmsize frmsize[] = {
+ {17, 256}, {26, 640} /* small subset of supported sizes */
+ };
+ guint wordsize = bytesize >> 1, frmsizecod = 0;
+ int i;
+
+ fail_unless ((bytesize & 0x01) == 0);
+ fail_unless (bytesize >= sizeof (ac3_header));
+
+ for (i = 0; i < G_N_ELEMENTS (frmsize); i++) {
+ if (frmsize[i].frmsize == wordsize) {
+ frmsizecod = frmsize[i].frmsizecod;
+ break;
+ }
+ }
+
+ fail_unless (frmsizecod);
+
+ memcpy (data, ac3_header, sizeof (ac3_header));
+ data[4] = (data[4] & ~0x3f) | (frmsizecod & 0x3f);
+ data[5] = (bsid & 0x1f) << 3;
+ memset (data + 6, 0, bytesize - 6);
+}
+
+GST_START_TEST (test_ac3)
+{
+ GstTypeFindProbability prob;
+ const gchar *type;
+ GstBuffer *buf;
+ GstCaps *caps = NULL;
+ guint bsid;
+ guint8 *data;
+
+ for (bsid = 0; bsid < 32; bsid++) {
+ buf = gst_buffer_new_and_alloc ((256 + 640) * 2);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ make_ac3_packet (data, 256 * 2, bsid);
+ make_ac3_packet (data + 256 * 2, 640 * 2, bsid);
+ gst_buffer_unmap (buf, data, (256 + 640) * 2);
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ if (bsid <= 8) {
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type for BSID %u: %" GST_PTR_FORMAT, bsid, caps);
+
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "audio/x-ac3");
+ fail_unless (prob > GST_TYPE_FIND_MINIMUM
+ && prob <= GST_TYPE_FIND_MAXIMUM);
+ gst_caps_unref (caps);
+ } else {
+ fail_unless (caps == NULL);
+ }
+
+ gst_buffer_unref (buf);
+ }
+}
+
+GST_END_TEST;
+
+static void
+make_eac3_packet (guint8 * data, guint bytesize, guint bsid)
+{
+ /* Actually not a fully valid packet; if the typefinder starts to
+ * check e.g. the CRCs, this test needs to be improved as well. */
+ const guint8 eac3_header[] = {
+ 0x0b, 0x77, /* syncword */
+ 0x00, /* strmtyp 0xc0, substreamid 0x38,
+ * frmsize 0x07 (3 high bits) */
+ 0x00, /* frmsize (low bits -> 11 total) */
+ 0x00, /* fscod 0xc0, fscod2/numblocks 0x30,
+ * acmod 0x0e, lfeon 0x01 */
+ 0x00 /* bsid 0xf8, dialnorm 0x07 (3 high bits) */
+ };
+ guint wordsize = bytesize >> 1;
+
+ fail_unless ((bytesize & 0x01) == 0);
+ fail_unless (bytesize >= sizeof (eac3_header));
+
+ memcpy (data, eac3_header, sizeof (eac3_header));
+ data[2] = (data[2] & ~0x07) | ((((wordsize - 1) & 0x700) >> 8) & 0xff);
+ data[3] = (wordsize - 1) & 0xff;
+ data[5] = (bsid & 0x1f) << 3;
+ memset (data + 6, 0, bytesize - 6);
+}
+
+GST_START_TEST (test_eac3)
+{
+ GstTypeFindProbability prob;
+ const gchar *type;
+ GstBuffer *buf;
+ GstCaps *caps = NULL;
+ guint bsid;
+ guint8 *data;
+
+ for (bsid = 0; bsid <= 32; bsid++) {
+ buf = gst_buffer_new_and_alloc (558 + 384);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ make_eac3_packet (data, 558, bsid);
+ make_eac3_packet (data + 558, 384, bsid);
+ gst_buffer_unmap (buf, data, 558 + 384);
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ if (bsid > 10 && bsid <= 16) {
+ /* Only BSIs 11..16 are valid for Annex E */
+ fail_unless (caps != NULL);
+ GST_LOG ("Found type for BSID %u: %" GST_PTR_FORMAT, bsid, caps);
+
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "audio/x-eac3");
+ fail_unless (prob > GST_TYPE_FIND_MINIMUM
+ && prob <= GST_TYPE_FIND_MAXIMUM);
+ gst_caps_unref (caps);
+ } else {
+ /* Invalid E-AC-3 BSID, must not be detected as anything: */
+ fail_unless (caps == NULL);
+ }
+
+ gst_buffer_unref (buf);
+ }
+}
+
+GST_END_TEST;
+
+#define TEST_RANDOM_DATA_SIZE (4*1024)
+
+/* typefind random data, to make sure all typefinders are called */
+GST_START_TEST (test_random_data)
+{
+ GstTypeFindProbability prob;
+ const gchar *seed_env;
+ GstBuffer *buf;
+ GstCaps *caps;
+ guint32 seed;
+ guint8 *data;
+ gint i;
+
+ seed_env = g_getenv ("GST_TYPEFIND_TEST_SEED");
+ if (seed_env != NULL)
+ seed = atoi (seed_env);
+ else
+ seed = (guint32) time (NULL);
+
+ g_random_set_seed (seed);
+
+ data = g_malloc (TEST_RANDOM_DATA_SIZE);
+ for (i = 0; i < TEST_RANDOM_DATA_SIZE; ++i)
+ data[i] = g_random_int () & 0xff;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ data, NULL, TEST_RANDOM_DATA_SIZE, 0, TEST_RANDOM_DATA_SIZE));
+
+ GST_BUFFER_OFFSET (buf) = 0;
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, &prob);
+ GST_INFO ("caps: %" GST_PTR_FORMAT ", probability=%u", caps, prob);
+ /* for now we just print an error log message */
+ if (caps != NULL /* && prob >= GST_TYPE_FIND_LIKELY */ ) {
+ GST_ERROR ("typefinder thinks random data is %" GST_PTR_FORMAT ", with a "
+ "probability of %u (seed was %u)", caps, prob, seed);
+ gst_caps_unref (caps);
+ }
+
+ gst_buffer_unref (buf);
+ g_free (data);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_hls_m3u8)
+{
+ const gchar *type;
+ GstCaps *caps = NULL;
+
+ caps = typefind_test_file ("hls.m3u8");
+ type = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ fail_unless_equals_string (type, "application/x-hls");
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static Suite *
+typefindfunctions_suite (void)
+{
+ Suite *s = suite_create ("typefindfunctions");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_quicktime_mpeg4video);
+ tcase_add_test (tc_chain, test_broken_flac_in_ogg);
+ tcase_add_test (tc_chain, test_jpeg_not_ac3);
+ tcase_add_test (tc_chain, test_mpegts);
+ tcase_add_test (tc_chain, test_ac3);
+ tcase_add_test (tc_chain, test_eac3);
+ tcase_add_test (tc_chain, test_random_data);
+ tcase_add_test (tc_chain, test_hls_m3u8);
+
+ return s;
+}
+
+GST_CHECK_MAIN (typefindfunctions);
diff --git a/tests/check/libs/audio.c b/tests/check/libs/audio.c
new file mode 100644
index 0000000..990f46d
--- /dev/null
+++ b/tests/check/libs/audio.c
@@ -0,0 +1,586 @@
+/* GStreamer
+ *
+ * unit tests for audio support library
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/audio/audio.h>
+#include <gst/audio/multichannel.h>
+#include <string.h>
+
+static gboolean
+structure_contains_channel_positions (const GstStructure * s)
+{
+ return (gst_structure_get_value (s, "channel-positions") != NULL);
+}
+
+#if 0
+static gboolean
+fixed_caps_have_channel_positions (const GstCaps * caps)
+{
+ GstStructure *s;
+
+ fail_unless (caps != NULL);
+
+ s = gst_caps_get_structure (caps, 0);
+ fail_unless (s != NULL);
+
+ return structure_contains_channel_positions (s);
+}
+#endif
+
+GST_START_TEST (test_multichannel_checks)
+{
+ GstAudioChannelPosition pos_2_mixed[2] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
+ GST_AUDIO_CHANNEL_POSITION_NONE
+ };
+ GstAudioChannelPosition pos_2_none[2] = {
+ GST_AUDIO_CHANNEL_POSITION_NONE,
+ GST_AUDIO_CHANNEL_POSITION_NONE
+ };
+ GstAudioChannelPosition pos_2_flr[2] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+ GstAudioChannelPosition pos_2_frr[2] = {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+ GstStructure *s;
+
+ s = gst_structure_new ("audio/x-raw", "channels", G_TYPE_INT, 2, NULL);
+
+ /* check if the audio channel position checks work */
+ fail_if (gst_audio_check_channel_positions (pos_2_mixed, 2));
+ fail_unless (gst_audio_check_channel_positions (pos_2_none, 2));
+ fail_unless (gst_audio_check_channel_positions (pos_2_flr, 2));
+ fail_if (gst_audio_check_channel_positions (pos_2_frr, 2));
+
+ /* this should not work and issue a warning: FRONT_MONO + NONE */
+ _gst_check_expecting_log = TRUE;
+ gst_audio_set_channel_positions (s, pos_2_mixed);
+ _gst_check_expecting_log = FALSE;
+ fail_if (structure_contains_channel_positions (s));
+
+ /* this should work: NONE + NONE */
+ gst_audio_set_channel_positions (s, pos_2_none);
+ fail_unless (structure_contains_channel_positions (s));
+ gst_structure_remove_field (s, "channel-positions");
+
+ /* this should also work: FRONT_LEFT + FRONT_RIGHT */
+ gst_audio_set_channel_positions (s, pos_2_flr);
+ fail_unless (structure_contains_channel_positions (s));
+ gst_structure_remove_field (s, "channel-positions");
+
+ /* this should not work and issue a warning: FRONT_RIGHT twice */
+ _gst_check_expecting_log = TRUE;
+ gst_audio_set_channel_positions (s, pos_2_frr);
+ _gst_check_expecting_log = FALSE;
+
+/* FIXME: did I misunderstand _set_structure_channel_positions_list? */
+#if 0
+ /* this should not work and issue a warning: FRONT_RIGHT twice */
+ _gst_check_expecting_log = TRUE;
+ gst_audio_set_structure_channel_positions_list (s, pos_2_frr, 2);
+ _gst_check_expecting_log = FALSE;
+
+ /* this should not work and issue a warning: FRONT_MONO + NONE */
+ _gst_check_expecting_log = TRUE;
+ gst_audio_set_structure_channel_positions_list (s, pos_2_mixed, 2);
+ _gst_check_expecting_log = FALSE;
+
+ /* this should not work either (channel count mismatch) */
+ _gst_check_expecting_log = TRUE;
+ gst_audio_set_structure_channel_positions_list (s, pos_2_none, 44);
+ _gst_check_expecting_log = FALSE;
+ fail_if (structure_contains_channel_positions (s));
+#endif
+
+ gst_structure_free (s);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_buffer_clipping_time)
+{
+ GstSegment s;
+ GstBuffer *buf;
+ GstBuffer *ret;
+ guint8 *data, *sdata;
+ gsize ssize;
+
+ /* Clip start and end */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 4 * GST_SECOND;
+ s.stop = 8 * GST_SECOND;
+ s.time = 4 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 800);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 400);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Clip only start */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 4 * GST_SECOND;
+ s.stop = 12 * GST_SECOND;
+ s.time = 4 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 1200);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 800);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Clip only stop */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 2 * GST_SECOND;
+ s.stop = 10 * GST_SECOND;
+ s.time = 2 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 2 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 200);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 1000);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data);
+ fail_unless (ssize == 800);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Buffer outside segment */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 12 * GST_SECOND;
+ s.stop = 20 * GST_SECOND;
+ s.time = 12 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret == NULL);
+
+ /* Clip start and end but don't touch duration and offset_end */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 4 * GST_SECOND;
+ s.stop = 8 * GST_SECOND;
+ s.time = 4 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == GST_CLOCK_TIME_NONE);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == GST_BUFFER_OFFSET_NONE);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 400);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* If the buffer has no timestamp it should assert()
+ * FIXME: check if return value is the same as the input buffer.
+ * probably can't be done because the assert() does a SIGABRT.
+ */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_TIME);
+ s.start = 0 * GST_SECOND;
+ s.stop = 10 * GST_SECOND;
+ s.time = 0 * GST_SECOND;
+
+ GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret == buf);
+
+ gst_buffer_unref (buf);
+
+ /* If the format is not TIME or DEFAULT it should assert()
+ * FIXME: check if return value is the same as the input buffer.
+ * probably can't be done because the assert() does a SIGABRT.
+ */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_PERCENT);
+ s.start = 0;
+ s.stop = 10;
+ s.time = 0;
+
+ GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 0;
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
+
+ ASSERT_CRITICAL (ret = gst_audio_buffer_clip (buf, &s, 100, 1));
+
+ gst_buffer_unref (buf);
+
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_buffer_clipping_samples)
+{
+ GstSegment s;
+ GstBuffer *buf;
+ GstBuffer *ret;
+ guint8 *data, *sdata;
+ gsize ssize;
+
+ /* Clip start and end */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 400;
+ s.stop = 800;
+ s.time = 400;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 800);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 400);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Clip only start */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 400;
+ s.stop = 1200;
+ s.time = 400;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 1200);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 800);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Clip only stop */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 200;
+ s.stop = 1000;
+ s.time = 200;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 2 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 200);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == 1000);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data);
+ fail_unless (ssize == 800);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* Buffer outside segment */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 1200;
+ s.stop = 2000;
+ s.time = 1200;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = 1200;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret == NULL);
+
+ /* Clip start and end but don't touch duration and offset_end */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 400;
+ s.stop = 800;
+ s.time = 400;
+
+ GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buf) = 200;
+ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
+
+ ret = gst_audio_buffer_clip (buf, &s, 100, 1);
+ fail_unless (ret != NULL);
+
+ fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
+ fail_unless (GST_BUFFER_DURATION (ret) == GST_CLOCK_TIME_NONE);
+ fail_unless (GST_BUFFER_OFFSET (ret) == 400);
+ fail_unless (GST_BUFFER_OFFSET_END (ret) == GST_BUFFER_OFFSET_NONE);
+ sdata = gst_buffer_map (ret, &ssize, NULL, GST_MAP_READ);
+ fail_unless (sdata == data + 200);
+ fail_unless (ssize == 400);
+ gst_buffer_unmap (ret, sdata, ssize);
+
+ gst_buffer_unref (ret);
+
+ /* If the buffer has no offset it should assert()
+ * FIXME: check if return value is the same as the input buffer.
+ * probably can't be done because the assert() does a SIGABRT.
+ */
+ buf = gst_buffer_new ();
+ data = (guint8 *) g_malloc (1000);
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, 1000, 0, 1000));
+
+ gst_segment_init (&s, GST_FORMAT_DEFAULT);
+ s.start = 0;
+ s.stop = 10;
+ s.time = 0;
+
+ GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
+ GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
+
+ ASSERT_CRITICAL (ret = gst_audio_buffer_clip (buf, &s, 100, 1));
+
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+static void
+init_value_to_channel_layout (GValue * val, GstAudioChannelPosition pos1,
+ GstAudioChannelPosition pos2)
+{
+ GValue pos = { 0, };
+
+ g_value_init (val, GST_TYPE_ARRAY);
+ g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);
+ g_value_set_enum (&pos, pos1);
+ gst_value_array_append_value (val, &pos);
+ g_value_set_enum (&pos, pos2);
+ gst_value_array_append_value (val, &pos);
+ g_value_unset (&pos);
+}
+
+GST_START_TEST (test_channel_layout_value_intersect)
+{
+ GValue layout = { 0, };
+ GValue list = { 0, };
+ GValue res = { 0, };
+
+ g_value_init (&list, GST_TYPE_LIST);
+ init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
+ gst_value_list_append_value (&list, &layout);
+ g_value_unset (&layout);
+ init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
+ gst_value_list_append_value (&list, &layout);
+ g_value_unset (&layout);
+
+ init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
+
+ /* we should get the second layout in the list, as it matches the input */
+ fail_unless (gst_value_intersect (&res, &layout, &list));
+ g_value_unset (&layout);
+ fail_unless (GST_VALUE_HOLDS_ARRAY (&res));
+ fail_unless_equals_int (gst_value_array_get_size (&res), 2);
+ fail_unless_equals_int (g_value_get_enum (gst_value_array_get_value (&res,
+ 0)), GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
+ fail_unless_equals_int (g_value_get_enum (gst_value_array_get_value (&res,
+ 1)), GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
+ g_value_unset (&res);
+
+ /* this (with rear position) should not yield any results */
+ init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT);
+ fail_if (gst_value_intersect (&res, &layout, &list));
+ g_value_unset (&layout);
+
+ g_value_unset (&list);
+}
+
+GST_END_TEST;
+
+static Suite *
+audio_suite (void)
+{
+ Suite *s = suite_create ("audio support library");
+
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_multichannel_checks);
+ tcase_add_test (tc_chain, test_buffer_clipping_time);
+ tcase_add_test (tc_chain, test_buffer_clipping_samples);
+ tcase_add_test (tc_chain, test_channel_layout_value_intersect);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = audio_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/libs/cddabasesrc.c b/tests/check/libs/cddabasesrc.c
new file mode 100644
index 0000000..1c60c11
--- /dev/null
+++ b/tests/check/libs/cddabasesrc.c
@@ -0,0 +1,512 @@
+/* GStreamer
+ *
+ * unit test for cddabasesrc
+ *
+ * Copyright (C) <2005> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* TODO:
+ * - test different modes (when seeking to tracks in track mode, buffer
+ * timestamps should start from 0, when seeking to tracks in disc mode,
+ * buffer timestamps should increment, etc.)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+#include <gst/check/gstbufferstraw.h>
+
+#include <gst/cdda/gstcddabasesrc.h>
+#include <string.h>
+
+#define CD_FRAMESIZE_RAW 2352
+
+#define GST_TYPE_CD_FOO_SRC (gst_cd_foo_src_get_type())
+#define GST_CD_FOO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CD_FOO_SRC,GstCdFooSrc))
+#define GST_CD_FOO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CD_FOO_SRC,GstCdFooSrcClass))
+#define GST_IS_CD_FOO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CD_FOO_SRC))
+#define GST_IS_CD_FOO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CD_FOO_SRC))
+#define GST_CD_FOO_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CDDA_BASAE_SRC, GstCdFooSrcClass))
+
+typedef struct _GstCdFooSrc GstCdFooSrc;
+typedef struct _GstCdFooSrcClass GstCdFooSrcClass;
+
+
+/* Neue Heimat (CD 2) */
+static GstCddaBaseSrcTrack nh_cd2_tracks[] = {
+ {TRUE, 1, 0, 20664, NULL,},
+ {TRUE, 2, 20665, 52377, NULL,},
+ {TRUE, 3, 52378, 84100, NULL,},
+ {TRUE, 4, 84101, 105401, NULL,},
+ {TRUE, 5, 105402, 123060, NULL,},
+ {TRUE, 6, 123061, 146497, NULL,},
+ {TRUE, 7, 146498, 175693, NULL,},
+ {TRUE, 8, 175694, 203272, NULL,},
+ {TRUE, 9, 203273, 217909, NULL,},
+ {TRUE, 10, 217910, 240938, NULL,},
+ {TRUE, 11, 240939, 256169, NULL,},
+ {TRUE, 12, 256170, 282237, NULL,},
+ {TRUE, 13, 282238, 307606, NULL,},
+ {TRUE, 14, 307607, 337245, NULL,}
+};
+
+/* Offspring - Smash */
+static GstCddaBaseSrcTrack offspring_tracks[] = {
+ {TRUE, 1, 0, 1924, NULL,},
+ {TRUE, 2, 1925, 12947, NULL,},
+ {TRUE, 3, 12948, 29739, NULL,},
+ {TRUE, 4, 29740, 47202, NULL,},
+ {TRUE, 5, 47203, 63134, NULL,},
+ {TRUE, 6, 63135, 77954, NULL,},
+ {TRUE, 7, 77955, 92789, NULL,},
+ {TRUE, 8, 92790, 112127, NULL,},
+ {TRUE, 9, 112128, 124372, NULL,},
+ {TRUE, 10, 124373, 133574, NULL,},
+ {TRUE, 11, 133575, 143484, NULL,},
+ {TRUE, 12, 143485, 149279, NULL,},
+ {TRUE, 13, 149280, 162357, NULL,},
+ {TRUE, 14, 162358, 210372, NULL,}
+};
+
+/* this matches the sample TOC from the DiscIDCalculation
+ * page in the Musicbrainz wiki. It's a tricky one because
+ * it's got a data track as well. */
+static GstCddaBaseSrcTrack mb_sample_tracks[] = {
+ {TRUE, 1, 0, 18640, NULL,},
+ {TRUE, 2, 18641, 34666, NULL,},
+ {TRUE, 3, 34667, 56349, NULL,},
+ {TRUE, 4, 56350, 77005, NULL,},
+ {TRUE, 5, 77006, 106093, NULL,},
+ {TRUE, 6, 106094, 125728, NULL,},
+ {TRUE, 7, 125729, 149784, NULL,},
+ {TRUE, 8, 149785, 168884, NULL,},
+ {TRUE, 9, 168885, 185909, NULL,},
+ {TRUE, 10, 185910, 205828, NULL,},
+ {TRUE, 11, 205829, 230141, NULL,},
+ {TRUE, 12, 230142, 246658, NULL,},
+ {TRUE, 13, 246659, 265613, NULL,},
+ {TRUE, 14, 265614, 289478, NULL,},
+ {FALSE, 15, 289479, 325731, NULL,}
+};
+
+/* Nicola Conte - Other Directions (also
+ * tricky due to the extra data track) */
+static GstCddaBaseSrcTrack nconte_odir_tracks[] = {
+ {TRUE, 1, 0, 17852, NULL,},
+ {TRUE, 2, 17853, 39956, NULL,},
+ {TRUE, 3, 39957, 68449, NULL,},
+ {TRUE, 4, 68450, 88725, NULL,},
+ {TRUE, 5, 88726, 106413, NULL,},
+ {TRUE, 6, 106414, 131966, NULL,},
+ {TRUE, 7, 131967, 152372, NULL,},
+ {TRUE, 8, 152373, 168602, NULL,},
+ {TRUE, 9, 168603, 190348, NULL,},
+ {TRUE, 10, 190349, 209044, NULL,},
+ {TRUE, 11, 209045, 235586, NULL,},
+ {TRUE, 12, 235587, 253830, NULL,},
+ {TRUE, 13, 253831, 272213, NULL,},
+ {FALSE, 14, 272214, 332849, NULL,}
+};
+
+/* Pink Martini - Sympathique (11 track version) */
+static GstCddaBaseSrcTrack pm_symp_tracks[] = {
+ {TRUE, 1, 0, 21667, NULL,},
+ {TRUE, 2, 21668, 49576, NULL,},
+ {TRUE, 3, 49577, 62397, NULL,},
+ {TRUE, 4, 62398, 81087, NULL,},
+ {TRUE, 5, 81088, 106595, NULL,},
+ {TRUE, 6, 106596, 122012, NULL,},
+ {TRUE, 7, 122013, 138469, NULL,},
+ {TRUE, 8, 138470, 157306, NULL,},
+ {TRUE, 9, 157307, 179635, NULL,},
+ {TRUE, 10, 179636, 203673, NULL,},
+ {TRUE, 11, 203674, 213645, NULL,}
+};
+
+#define NUM_TEST_DISCS 5
+
+struct _test_disc
+{
+ GstCddaBaseSrcTrack *tracks;
+ guint num_tracks;
+ guint32 cddb_discid;
+ const gchar *musicbrainz_discid;
+};
+
+/* FIXME: now we just need to find out how to treat
+ * data tracks for the cddb id calculation .... */
+static struct _test_disc test_discs[NUM_TEST_DISCS] = {
+ {nh_cd2_tracks, G_N_ELEMENTS (nh_cd2_tracks), 0xae11900e,
+ NULL},
+ {mb_sample_tracks, G_N_ELEMENTS (mb_sample_tracks), 0x00000000,
+ "MUtMmKN402WPj3_VFsgUelxpc8U-"},
+ {offspring_tracks, G_N_ELEMENTS (offspring_tracks), 0xc20af40e,
+ "ahg7JUcfR3vCYBphSDIogOOWrr0-"},
+ {nconte_odir_tracks, G_N_ELEMENTS (nconte_odir_tracks), 0x00000000,
+ /* hKx_PejjG47X161ND_Sh0HyqaS0- according to libmusicbrainz, but that's
+ * wrong according to the wiki docs (or not?) (neither discid is listed) */
+ "fboaOQtfqwENv8WyXa9tRyvyUbQ-"},
+ {pm_symp_tracks, G_N_ELEMENTS (pm_symp_tracks), 0xa00b200b,
+ "iP0DOLdr4vt_IfKSIXoRUR.q_Wc-"}
+};
+
+struct _GstCdFooSrc
+{
+ GstCddaBaseSrc cddabasesrc;
+
+ struct _test_disc *cur_test;
+ guint cur_disc;
+};
+
+struct _GstCdFooSrcClass
+{
+ GstCddaBaseSrcClass parent_class;
+};
+
+GType gst_cd_foo_src_get_type (void);
+G_DEFINE_TYPE (GstCdFooSrc, gst_cd_foo_src, GST_TYPE_CDDA_BASE_SRC);
+
+static GstBuffer *gst_cd_foo_src_read_sector (GstCddaBaseSrc * src,
+ gint sector);
+static gboolean gst_cd_foo_src_open (GstCddaBaseSrc * src,
+ const gchar * device);
+static void gst_cd_foo_src_close (GstCddaBaseSrc * src);
+
+static void
+gst_cd_foo_src_init (GstCdFooSrc * src)
+{
+ src->cur_disc = 0;
+}
+
+static void
+gst_cd_foo_src_class_init (GstCdFooSrcClass * klass)
+{
+ GstCddaBaseSrcClass *cddabasesrc_class = GST_CDDA_BASE_SRC_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_details_simple (element_class,
+ "CD Audio (cdda) Source, FooBar", "Source/File",
+ "Read audio from CD", "Foo Bar <foo@bar.com>");
+
+ cddabasesrc_class->open = gst_cd_foo_src_open;
+ cddabasesrc_class->close = gst_cd_foo_src_close;
+ cddabasesrc_class->read_sector = gst_cd_foo_src_read_sector;
+}
+
+static gboolean
+gst_cd_foo_src_open (GstCddaBaseSrc * cddabasesrc, const gchar * device)
+{
+ GstCddaBaseSrcTrack *tracks;
+ GstCdFooSrc *src;
+ gint i;
+
+ src = GST_CD_FOO_SRC (cddabasesrc);
+
+ /* if this fails, the test is wrong */
+ g_assert (src->cur_disc < NUM_TEST_DISCS);
+
+ src->cur_test = &test_discs[src->cur_disc];
+
+ /* add tracks */
+ tracks = src->cur_test->tracks;
+ for (i = 0; i < src->cur_test->num_tracks; ++i) {
+ gst_cdda_base_src_add_track (GST_CDDA_BASE_SRC (src), &tracks[i]);
+ }
+
+ return TRUE;
+}
+
+static void
+gst_cd_foo_src_close (GstCddaBaseSrc * cddabasesrc)
+{
+ GstCdFooSrc *src = GST_CD_FOO_SRC (cddabasesrc);
+
+ if (src->cur_test->cddb_discid != 0) {
+ g_assert (cddabasesrc->discid == src->cur_test->cddb_discid);
+ }
+
+ if (src->cur_test->musicbrainz_discid != NULL) {
+ g_assert (g_str_equal (cddabasesrc->mb_discid,
+ src->cur_test->musicbrainz_discid));
+ }
+}
+
+static GstBuffer *
+gst_cd_foo_src_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
+{
+ GstBuffer *buf;
+ guint8 *data;
+
+ buf = gst_buffer_new_and_alloc (CD_FRAMESIZE_RAW);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memset (data, 0, CD_FRAMESIZE_RAW);
+ gst_buffer_unmap (buf, data, CD_FRAMESIZE_RAW);
+
+ return buf;
+}
+
+static inline gboolean
+tag_list_has_tag (GstTagList * list, const gchar * tag, GType type)
+{
+ const GValue *val = gst_tag_list_get_value_index (list, tag, 0);
+
+ if (val == NULL) {
+ GST_LOG ("no tag '%s' in taglist %" GST_PTR_FORMAT, tag, list);
+ return FALSE;
+ }
+
+ if (!G_VALUE_HOLDS (val, type)) {
+ GST_LOG ("tag '%s' in taglist %" GST_PTR_FORMAT " is not of type %s",
+ tag, list, g_type_name (type));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+test_uri_parse (const gchar * uri, const gchar * device, gint track)
+{
+ GstElement *foosrc;
+ gchar *set_device = NULL;
+ gint set_track = 0;
+
+ foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc), uri) == TRUE,
+ "couldn't set uri %s", uri);
+ g_object_get (foosrc, "device", &set_device, "track", &set_track, NULL);
+ fail_unless (set_device != NULL);
+ fail_unless (strcmp (set_device, device) == 0,
+ "device set was %s, expected %s", set_device, device);
+ fail_unless (set_track == track, "track set was %d, expected %d", set_track,
+ track);
+ g_free (set_device);
+ gst_object_unref (foosrc);
+}
+
+GST_START_TEST (test_discid_calculations)
+{
+ GstElement *foosrc, *pipeline, *sink;
+ gint i;
+
+ fail_unless (gst_element_register (NULL, "cdfoosrc", GST_RANK_SECONDARY,
+ GST_TYPE_CD_FOO_SRC));
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_unless (sink != NULL, "couldn't create fakesink");
+
+ foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
+ fail_unless (foosrc != NULL, "couldn't create cdfoosrc");
+
+ gst_bin_add (GST_BIN (pipeline), foosrc);
+ gst_bin_add (GST_BIN (pipeline), sink);
+ fail_unless (gst_element_link (foosrc, sink));
+
+ for (i = 0; i < G_N_ELEMENTS (test_discs); ++i) {
+ GstTagList *tags = NULL;
+ GstMessage *msg;
+
+ GST_LOG ("Testing disc layout %u ...", i);
+ GST_CD_FOO_SRC (foosrc)->cur_disc = i;
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ msg =
+ gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipeline),
+ GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG);
+ gst_message_parse_tag (msg, &tags);
+ fail_unless (tags != NULL);
+ fail_unless (tag_list_has_tag (tags, "track-count", G_TYPE_UINT));
+ fail_unless (tag_list_has_tag (tags, "track-number", G_TYPE_UINT));
+ fail_unless (tag_list_has_tag (tags, "duration", G_TYPE_UINT64));
+ fail_unless (tag_list_has_tag (tags, "discid", G_TYPE_STRING));
+ fail_unless (tag_list_has_tag (tags, "discid-full", G_TYPE_STRING));
+ fail_unless (tag_list_has_tag (tags, "musicbrainz-discid", G_TYPE_STRING));
+ fail_unless (tag_list_has_tag (tags, "musicbrainz-discid-full",
+ G_TYPE_STRING));
+ gst_tag_list_free (tags);
+ gst_message_unref (msg);
+
+ msg =
+ gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipeline),
+ GST_CLOCK_TIME_NONE, GST_MESSAGE_ASYNC_DONE);
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ }
+
+ gst_object_unref (pipeline);
+
+ gst_task_cleanup_all ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_buffer_timestamps)
+{
+ GstElement *foosrc, *pipeline, *fakesink;
+ GstClockTime prev_ts, prev_duration, ts;
+ GstPad *sinkpad;
+ gint i;
+
+ fail_unless (gst_element_register (NULL, "cdfoosrc", GST_RANK_SECONDARY,
+ GST_TYPE_CD_FOO_SRC));
+
+ pipeline = gst_pipeline_new ("pipeline");
+ foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+ gst_bin_add_many (GST_BIN (pipeline), foosrc, fakesink, NULL);
+ fail_unless (gst_element_link (foosrc, fakesink));
+ sinkpad = gst_element_get_static_pad (fakesink, "sink");
+
+ GST_CD_FOO_SRC (foosrc)->cur_disc = 0;
+
+ gst_buffer_straw_start_pipeline (pipeline, sinkpad);
+
+ prev_ts = GST_CLOCK_TIME_NONE;
+ prev_duration = GST_CLOCK_TIME_NONE;
+
+ for (i = 0; i < 100; ++i) {
+ GstBuffer *buf;
+
+ buf = gst_buffer_straw_get_buffer (pipeline, sinkpad);
+ GST_LOG ("buffer, ts=%" GST_TIME_FORMAT ", dur=%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ ts = GST_BUFFER_TIMESTAMP (buf);
+ fail_unless (GST_CLOCK_TIME_IS_VALID (ts));
+ fail_unless (GST_BUFFER_DURATION_IS_VALID (buf));
+ if (i > 0) {
+ fail_unless (GST_CLOCK_TIME_IS_VALID (prev_ts));
+ fail_unless (GST_CLOCK_TIME_IS_VALID (prev_duration));
+ fail_unless ((prev_ts + prev_duration) == ts);
+ }
+ prev_ts = ts;
+ prev_duration = GST_BUFFER_DURATION (buf);
+ gst_buffer_unref (buf);
+ }
+
+ gst_buffer_straw_stop_pipeline (pipeline, sinkpad);
+
+ gst_task_cleanup_all ();
+ gst_object_unref (pipeline);
+ gst_object_unref (sinkpad);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_uri_parsing)
+{
+ GstElement *foosrc;
+
+ fail_unless (gst_element_register (NULL, "cdfoosrc", GST_RANK_SECONDARY,
+ GST_TYPE_CD_FOO_SRC));
+
+ /* wrong protocol */
+ foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "x://") == FALSE);
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "cddaq://") == FALSE);
+
+ /* cdda://track */
+ test_uri_parse ("cdda://", "/dev/cdrom", 1);
+ test_uri_parse ("cdda://2", "/dev/cdrom", 2);
+ test_uri_parse ("cdda://47", "/dev/cdrom", 47);
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "cdda://-1") == FALSE);
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "cdda://what") == FALSE);
+
+ /* cdda://device#track */
+ test_uri_parse ("cdda:///dev/hdb#1", "/dev/hdb", 1);
+ test_uri_parse ("cdda://anything#8", "anything", 8);
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "cdda:///dev/hdb#nonsense") == FALSE);
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (foosrc),
+ "cdda:///dev/hdb#-2") == FALSE);
+
+ /* cdda://track#device (device should be ignored - FIXME 0.11) */
+ test_uri_parse ("cdda://8#/dev/hdb", "/dev/cdrom", 8);
+
+ gst_object_unref (foosrc);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_properties)
+{
+ GstElement *foosrc;
+ gchar *device;
+ guint track;
+
+ fail_unless (gst_element_register (NULL, "cdfoosrc", GST_RANK_SECONDARY,
+ GST_TYPE_CD_FOO_SRC));
+
+ foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
+
+ g_object_set (foosrc, "device", "/dev/cdrom", NULL);
+ g_object_get (foosrc, "device", &device, "track", &track, NULL);
+ fail_unless (g_str_equal (device, "/dev/cdrom"));
+ fail_unless_equals_int (track, 1);
+ g_free (device);
+
+ g_object_set (foosrc, "device", "/dev/cdrom1", "track", 17, NULL);
+ g_object_get (foosrc, "device", &device, "track", &track, NULL);
+ fail_unless (g_str_equal (device, "/dev/cdrom1"));
+ fail_unless_equals_int (track, 17);
+ g_free (device);
+
+ g_object_set (foosrc, "track", 17, "device", "/dev/cdrom1", NULL);
+ g_object_get (foosrc, "device", &device, "track", &track, NULL);
+ fail_unless (g_str_equal (device, "/dev/cdrom1"));
+ fail_unless_equals_int (track, 17);
+ g_free (device);
+
+ g_object_set (foosrc, "track", 12, NULL);
+ g_object_get (foosrc, "device", &device, "track", &track, NULL);
+ fail_unless (g_str_equal (device, "/dev/cdrom1"));
+ fail_unless_equals_int (track, 12);
+ g_free (device);
+
+ gst_object_unref (foosrc);
+}
+
+GST_END_TEST;
+
+static Suite *
+cddabasesrc_suite (void)
+{
+ Suite *s = suite_create ("cddabasesrc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_discid_calculations);
+ tcase_add_test (tc_chain, test_buffer_timestamps);
+ tcase_add_test (tc_chain, test_uri_parsing);
+ tcase_add_test (tc_chain, test_properties);
+
+ return s;
+}
+
+GST_CHECK_MAIN (cddabasesrc)
diff --git a/tests/check/libs/discoverer.c b/tests/check/libs/discoverer.c
new file mode 100644
index 0000000..2d20576
--- /dev/null
+++ b/tests/check/libs/discoverer.c
@@ -0,0 +1,94 @@
+/* GStreamer unit tests for discoverer
+ *
+ * Copyright (C) 2011 Stefan Kost <ensonic@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+#include <gst/pbutils/pbutils.h>
+
+#include <stdio.h>
+#include <glib/gstdio.h>
+#include <glib/gprintf.h>
+
+
+GST_START_TEST (test_disco_init)
+{
+ GError *err = NULL;
+ GstDiscoverer *dc;
+
+ dc = gst_discoverer_new (GST_SECOND, &err);
+ fail_unless (dc != NULL);
+ fail_unless (err == NULL);
+
+ g_object_unref (dc);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_disco_sync)
+{
+ GError *err = NULL;
+ GstDiscoverer *dc;
+ GstDiscovererInfo *info;
+ GstDiscovererResult result;
+ gchar *uri;
+
+ dc = gst_discoverer_new (GST_SECOND, &err);
+ fail_unless (dc != NULL);
+ fail_unless (err == NULL);
+
+ /* GST_TEST_FILE comes from makefile CFLAGS */
+ GST_INFO ("discovering file '%s'", GST_TEST_FILE);
+ uri = g_filename_to_uri (GST_TEST_FILE, NULL, &err);
+ fail_unless (err == NULL);
+ GST_INFO ("discovering uri '%s'", uri);
+
+ info = gst_discoverer_discover_uri (dc, uri, &err);
+ result = gst_discoverer_info_get_result (info);
+ GST_INFO ("result: %d", result);
+ gst_discoverer_info_unref (info);
+ g_free (uri);
+
+ if (err) {
+ /* we won't have the codec for the jpeg */
+ g_error_free (err);
+ }
+
+ g_object_unref (dc);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+discoverer_suite (void)
+{
+ Suite *s = suite_create ("discoverer");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_disco_init);
+ tcase_add_test (tc_chain, test_disco_sync);
+ return s;
+}
+
+GST_CHECK_MAIN (discoverer);
diff --git a/tests/check/libs/fft.c b/tests/check/libs/fft.c
new file mode 100644
index 0000000..bcaf967
--- /dev/null
+++ b/tests/check/libs/fft.c
@@ -0,0 +1,563 @@
+/* GStreamer
+ *
+ * unit test for FFT library
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/fft/gstfft.h>
+#include <gst/fft/gstffts16.h>
+#include <gst/fft/gstffts32.h>
+#include <gst/fft/gstfftf32.h>
+#include <gst/fft/gstfftf64.h>
+
+GST_START_TEST (test_next_fast_length)
+{
+ fail_unless_equals_int (gst_fft_next_fast_length (13), 16);
+ fail_unless_equals_int (gst_fft_next_fast_length (30), 30);
+ fail_unless_equals_int (gst_fft_next_fast_length (31), 32);
+ fail_unless_equals_int (gst_fft_next_fast_length (1), 2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s16_0hz)
+{
+ gint i;
+ gint16 *in;
+ GstFFTS16Complex *out;
+ GstFFTS16 *ctx;
+
+ in = g_new (gint16, 2048);
+ out = g_new (GstFFTS16Complex, 1025);
+ ctx = gst_fft_s16_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i++)
+ in[i] = G_MAXINT16;
+
+ gst_fft_s16_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s16_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 32767.0 * 32767.0;
+ mag = 10.0 * log10 (mag);
+ if (i < 2)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -55.0);
+ }
+
+ gst_fft_s16_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s16_11025hz)
+{
+ gint i;
+ gint16 *in;
+ GstFFTS16Complex *out;
+ GstFFTS16 *ctx;
+
+ in = g_new (gint16, 2048);
+ out = g_new (GstFFTS16Complex, 1025);
+ ctx = gst_fft_s16_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 4) {
+ in[i] = 0;
+ in[i + 1] = G_MAXINT16;
+ in[i + 2] = 0;
+ in[i + 3] = G_MININT16;
+ }
+
+ gst_fft_s16_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s16_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 32767.0 * 32767.0;
+ mag = 10.0 * log10 (mag);
+
+ if (abs (512 - i) < 2)
+ fail_unless (mag > -20.0);
+ else
+ fail_unless (mag < -55.0);
+ }
+
+ gst_fft_s16_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s16_22050hz)
+{
+ gint i;
+ gint16 *in;
+ GstFFTS16Complex *out;
+ GstFFTS16 *ctx;
+
+ in = g_new (gint16, 2048);
+ out = g_new (GstFFTS16Complex, 1025);
+ ctx = gst_fft_s16_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 2) {
+ in[i] = G_MAXINT16;
+ in[i + 1] = G_MININT16;
+ }
+
+ gst_fft_s16_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s16_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 32767.0 * 32767.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i > 1022)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -55.0);
+ }
+
+ gst_fft_s16_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s32_0hz)
+{
+ gint i;
+ gint32 *in;
+ GstFFTS32Complex *out;
+ GstFFTS32 *ctx;
+
+ in = g_new (gint32, 2048);
+ out = g_new (GstFFTS32Complex, 1025);
+ ctx = gst_fft_s32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i++)
+ in[i] = 2147483647;
+
+ gst_fft_s32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2147483647.0 * 2147483647.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i < 2)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_s32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s32_11025hz)
+{
+ gint i;
+ gint32 *in;
+ GstFFTS32Complex *out;
+ GstFFTS32 *ctx;
+
+ in = g_new (gint32, 2048);
+ out = g_new (GstFFTS32Complex, 1025);
+ ctx = gst_fft_s32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 4) {
+ in[i] = 0;
+ in[i + 1] = G_MAXINT32;
+ in[i + 2] = 0;
+ in[i + 3] = G_MININT32;
+ }
+
+ gst_fft_s32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2147483647.0 * 2147483647.0;
+ mag = 10.0 * log10 (mag);
+
+ if (abs (512 - i) < 2)
+ fail_unless (mag > -20.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_s32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_s32_22050hz)
+{
+ gint i;
+ gint32 *in;
+ GstFFTS32Complex *out;
+ GstFFTS32 *ctx;
+
+ in = g_new (gint32, 2048);
+ out = g_new (GstFFTS32Complex, 1025);
+ ctx = gst_fft_s32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 2) {
+ in[i] = G_MAXINT32;
+ in[i + 1] = G_MININT32;
+ }
+
+ gst_fft_s32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_s32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2147483647.0 * 2147483647.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i > 1022)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_s32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_0hz)
+{
+ gint i;
+ gfloat *in;
+ GstFFTF32Complex *out;
+ GstFFTF32 *ctx;
+
+ in = g_new (gfloat, 2048);
+ out = g_new (GstFFTF32Complex, 1025);
+ ctx = gst_fft_f32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i++)
+ in[i] = 1.0;
+
+ gst_fft_f32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i < 2)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_11025hz)
+{
+ gint i;
+ gfloat *in;
+ GstFFTF32Complex *out;
+ GstFFTF32 *ctx;
+
+ in = g_new (gfloat, 2048);
+ out = g_new (GstFFTF32Complex, 1025);
+ ctx = gst_fft_f32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 4) {
+ in[i] = 0.0;
+ in[i + 1] = 1.0;
+ in[i + 2] = 0.0;
+ in[i + 3] = -1.0;
+ }
+
+ gst_fft_f32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (abs (512 - i) < 2)
+ fail_unless (mag > -20.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_22050hz)
+{
+ gint i;
+ gfloat *in;
+ GstFFTF32Complex *out;
+ GstFFTF32 *ctx;
+
+ in = g_new (gfloat, 2048);
+ out = g_new (GstFFTF32Complex, 1025);
+ ctx = gst_fft_f32_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 2) {
+ in[i] = 1.0;
+ in[i + 1] = -1.0;
+ }
+
+ gst_fft_f32_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f32_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i > 1022)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f32_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f64_0hz)
+{
+ gint i;
+ gdouble *in;
+ GstFFTF64Complex *out;
+ GstFFTF64 *ctx;
+
+ in = g_new (gdouble, 2048);
+ out = g_new (GstFFTF64Complex, 1025);
+ ctx = gst_fft_f64_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i++)
+ in[i] = 1.0;
+
+ gst_fft_f64_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f64_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i < 2)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f64_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f64_11025hz)
+{
+ gint i;
+ gdouble *in;
+ GstFFTF64Complex *out;
+ GstFFTF64 *ctx;
+
+ in = g_new (gdouble, 2048);
+ out = g_new (GstFFTF64Complex, 1025);
+ ctx = gst_fft_f64_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 4) {
+ in[i] = 0.0;
+ in[i + 1] = 1.0;
+ in[i + 2] = 0.0;
+ in[i + 3] = -1.0;
+ }
+
+ gst_fft_f64_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f64_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (abs (512 - i) < 2)
+ fail_unless (mag > -20.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f64_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f64_22050hz)
+{
+ gint i;
+ gdouble *in;
+ GstFFTF64Complex *out;
+ GstFFTF64 *ctx;
+
+ in = g_new (gdouble, 2048);
+ out = g_new (GstFFTF64Complex, 1025);
+ ctx = gst_fft_f64_new (2048, FALSE);
+
+ for (i = 0; i < 2048; i += 2) {
+ in[i] = 1.0;
+ in[i + 1] = -1.0;
+ }
+
+ gst_fft_f64_window (ctx, in, GST_FFT_WINDOW_HAMMING);
+ gst_fft_f64_fft (ctx, in, out);
+
+ for (i = 0; i < 1025; i++) {
+ gdouble mag;
+
+ mag = (gdouble) out[i].r * (gdouble) out[i].r;
+ mag += (gdouble) out[i].i * (gdouble) out[i].i;
+ mag /= 2048.0 * 2048.0;
+ mag = 10.0 * log10 (mag);
+
+ if (i > 1022)
+ fail_unless (mag > -15.0);
+ else
+ fail_unless (mag < -60.0);
+ }
+
+ gst_fft_f64_free (ctx);
+ g_free (in);
+ g_free (out);
+}
+
+GST_END_TEST;
+
+static Suite *
+fft_suite (void)
+{
+ Suite *s = suite_create ("fft library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_next_fast_length);
+ tcase_add_test (tc_chain, test_s16_0hz);
+ tcase_add_test (tc_chain, test_s16_11025hz);
+ tcase_add_test (tc_chain, test_s16_22050hz);
+ tcase_add_test (tc_chain, test_s32_0hz);
+ tcase_add_test (tc_chain, test_s32_11025hz);
+ tcase_add_test (tc_chain, test_s32_22050hz);
+ tcase_add_test (tc_chain, test_f32_0hz);
+ tcase_add_test (tc_chain, test_f32_11025hz);
+ tcase_add_test (tc_chain, test_f32_22050hz);
+ tcase_add_test (tc_chain, test_f64_0hz);
+ tcase_add_test (tc_chain, test_f64_11025hz);
+ tcase_add_test (tc_chain, test_f64_22050hz);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = fft_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/libs/gstlibscpp.cc b/tests/check/libs/gstlibscpp.cc
new file mode 100644
index 0000000..f95cd78
--- /dev/null
+++ b/tests/check/libs/gstlibscpp.cc
@@ -0,0 +1,136 @@
+/* GStreamer
+ * Copyright (C) 2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gst/gst.h>
+#include <gst/check/gstcheck.h>
+
+#include <gst/app/gstapp-marshal.h>
+#include <gst/app/gstappsink.h>
+#include <gst/app/gstappsrc.h>
+
+#include <gst/audio/audio-enumtypes.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudioclock.h>
+#include <gst/audio/gstaudiofilter.h>
+#include <gst/audio/gstaudiosink.h>
+#include <gst/audio/gstaudiosrc.h>
+#include <gst/audio/gstbaseaudiosink.h>
+#include <gst/audio/gstbaseaudiosrc.h>
+#include <gst/audio/gstringbuffer.h>
+#include <gst/audio/mixerutils.h>
+#include <gst/audio/multichannel.h>
+
+#include <gst/cdda/gstcddabasesrc.h>
+
+#include <gst/fft/gstfftf32.h>
+#include <gst/fft/gstfftf64.h>
+#include <gst/fft/gstfft.h>
+#include <gst/fft/gstffts16.h>
+#include <gst/fft/gstffts32.h>
+
+#include <gst/interfaces/colorbalancechannel.h>
+#include <gst/interfaces/colorbalance.h>
+#include <gst/interfaces/interfaces-enumtypes.h>
+#include <gst/interfaces/interfaces-marshal.h>
+#include <gst/interfaces/mixer.h>
+#include <gst/interfaces/mixeroptions.h>
+#include <gst/interfaces/mixertrack.h>
+#include <gst/interfaces/navigation.h>
+#include <gst/interfaces/propertyprobe.h>
+#include <gst/interfaces/streamvolume.h>
+#include <gst/interfaces/tunerchannel.h>
+#include <gst/interfaces/tuner.h>
+#include <gst/interfaces/tunernorm.h>
+#include <gst/interfaces/videoorientation.h>
+#include <gst/interfaces/videooverlay.h>
+
+#include <gst/netbuffer/gstnetbuffer.h>
+
+#include <gst/pbutils/codec-utils.h>
+#include <gst/pbutils/descriptions.h>
+#include <gst/pbutils/encoding-profile.h>
+#include <gst/pbutils/encoding-target.h>
+#include <gst/pbutils/gstdiscoverer.h>
+#include <gst/pbutils/gstpluginsbaseversion.h>
+#include <gst/pbutils/install-plugins.h>
+#include <gst/pbutils/missing-plugins.h>
+#include <gst/pbutils/pbutils-enumtypes.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/pbutils/pbutils-marshal.h>
+
+#include <gst/riff/riff-ids.h>
+#include <gst/riff/riff-media.h>
+#include <gst/riff/riff-read.h>
+
+#include <gst/rtp/gstbasertpaudiopayload.h>
+#include <gst/rtp/gstbasertpdepayload.h>
+#include <gst/rtp/gstbasertppayload.h>
+#include <gst/rtp/gstrtcpbuffer.h>
+#include <gst/rtp/gstrtpbuffer.h>
+#include <gst/rtp/gstrtppayloads.h>
+
+#include <gst/rtsp/gstrtspbase64.h>
+#include <gst/rtsp/gstrtspconnection.h>
+#include <gst/rtsp/gstrtspdefs.h>
+#include <gst/rtsp/gstrtsp-enumtypes.h>
+#include <gst/rtsp/gstrtspextension.h>
+#include <gst/rtsp/gstrtsp.h>
+#include <gst/rtsp/gstrtsp-marshal.h>
+#include <gst/rtsp/gstrtspmessage.h>
+#include <gst/rtsp/gstrtsprange.h>
+#include <gst/rtsp/gstrtsptransport.h>
+#include <gst/rtsp/gstrtspurl.h>
+
+#include <gst/sdp/gstsdp.h>
+#include <gst/sdp/gstsdpmessage.h>
+#include <gst/tag/gsttagdemux.h>
+
+#include <gst/tag/tag.h>
+
+#include <gst/video/gstvideofilter.h>
+#include <gst/video/gstvideosink.h>
+#include <gst/video/video-enumtypes.h>
+#include <gst/video/video.h>
+
+/* we mostly just want to make sure that our library headers don't
+ * contain anything a C++ compiler might not like */
+GST_START_TEST (test_nothing)
+{
+ gst_init (NULL, NULL);
+}
+
+GST_END_TEST;
+
+static Suite *
+libscpp_suite (void)
+{
+ Suite *s = suite_create ("GstLibsCpp");
+ TCase *tc_chain = tcase_create ("C++ libs header tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_nothing);
+
+ return s;
+}
+
+GST_CHECK_MAIN (libscpp);
diff --git a/tests/check/libs/libsabi.c b/tests/check/libs/libsabi.c
new file mode 100644
index 0000000..5c4135d
--- /dev/null
+++ b/tests/check/libs/libsabi.c
@@ -0,0 +1,130 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ * 2011 Stefan Kost <ensonic@users.sf.net>
+ *
+ * libsabi.c: Unit test for ABI compatibility
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <config.h>
+#include <gst/check/gstcheck.h>
+
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudioclock.h>
+#include <gst/audio/gstaudiofilter.h>
+#include <gst/audio/gstaudiosrc.h>
+#include <gst/audio/gstaudiosink.h>
+#include <gst/audio/gstringbuffer.h>
+#include <gst/audio/multichannel.h>
+#include <gst/cdda/gstcddabasesrc.h>
+#include <gst/fft/gstfft.h>
+#include <gst/fft/gstffts16.h>
+#include <gst/fft/gstffts32.h>
+#include <gst/fft/gstfftf32.h>
+#include <gst/fft/gstfftf64.h>
+#include <gst/interfaces/colorbalance.h>
+#include <gst/interfaces/mixer.h>
+#include <gst/interfaces/navigation.h>
+#include <gst/interfaces/propertyprobe.h>
+#include <gst/interfaces/streamvolume.h>
+#include <gst/interfaces/tuner.h>
+#include <gst/interfaces/videoorientation.h>
+#include <gst/interfaces/videooverlay.h>
+#include <gst/netbuffer/gstnetbuffer.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/riff/riff-media.h>
+#include <gst/riff/riff-read.h>
+#include <gst/rtp/gstbasertpaudiopayload.h>
+#include <gst/rtp/gstbasertpdepayload.h>
+#include <gst/rtp/gstbasertppayload.h>
+#include <gst/rtp/gstrtpbuffer.h>
+#include <gst/rtp/gstrtcpbuffer.h>
+#include <gst/rtp/gstrtppayloads.h>
+#include <gst/rtsp/gstrtsp.h>
+#include <gst/rtsp/gstrtspconnection.h>
+#include <gst/rtsp/gstrtspextension.h>
+#include <gst/rtsp/gstrtspmessage.h>
+#include <gst/rtsp/gstrtsprange.h>
+#include <gst/rtsp/gstrtsptransport.h>
+#include <gst/rtsp/gstrtspurl.h>
+#include <gst/sdp/gstsdp.h>
+#include <gst/sdp/gstsdpmessage.h>
+#include <gst/tag/tag.h>
+#include <gst/tag/gsttagdemux.h>
+#include <gst/video/video.h>
+#include <gst/video/gstvideofilter.h>
+#include <gst/video/gstvideosink.h>
+
+/* initial version of the file was generated using:
+ * grep -A1 "<STRUCT>" ../../docs/libs/gst-plugins-base-libs-decl.txt | \
+ * grep "<NAME>" | grep -v "Private" | sort | \
+ * sed -e 's/<NAME>\(.*\)<\/NAME>/\ {\"\1\", sizeof (\1), 0\},/'
+ *
+ * it needs a bit of editing to remove opaque structs
+ */
+
+#ifdef HAVE_CPU_I386
+# ifdef __APPLE__
+# include "struct_i386_osx.h"
+# define HAVE_ABI_SIZES TRUE
+# else
+# include "struct_i386.h"
+# define HAVE_ABI_SIZES TRUE
+# endif
+#else
+#ifdef HAVE_CPU_X86_64
+#include "struct_x86_64.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_ARM
+#include "struct_arm.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+/* in case someone wants to generate a new arch */
+#include "struct_i386.h"
+#define HAVE_ABI_SIZES FALSE
+#endif
+#endif
+#endif
+
+/* disabled for 0.11 */
+#undef HAVE_ABI_SIZES
+#define HAVE_ABI_SIZES FALSE
+
+GST_START_TEST (test_ABI)
+{
+ gst_check_abi_list (list, HAVE_ABI_SIZES);
+}
+
+GST_END_TEST;
+
+static Suite *
+libsabi_suite (void)
+{
+ Suite *s = suite_create ("LibsABI");
+ TCase *tc_chain = tcase_create ("size check");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_ABI);
+ return s;
+}
+
+GST_CHECK_MAIN (libsabi);
diff --git a/tests/check/libs/mixer.c b/tests/check/libs/mixer.c
new file mode 100644
index 0000000..0028f58
--- /dev/null
+++ b/tests/check/libs/mixer.c
@@ -0,0 +1,216 @@
+/* GStreamer
+ *
+ * unit tests for audio support library
+ *
+ * Copyright (C) 2007 Jan Schmidt <thaytan@noraisin.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/interfaces/mixer.h>
+
+#include <string.h>
+
+#define TEST_ELEMENT_TYPE (test_element_get_type())
+
+/* FIXME 0.11: possibly remove mixer interface entirely, or simplify, or
+ * radically change */
+typedef struct TestElement TestElement;
+typedef struct TestElementClass TestElementClass;
+
+struct TestElement
+{
+ GstElement parent;
+};
+
+struct TestElementClass
+{
+ GstElementClass parent_class;
+};
+
+GType test_element_get_type (void);
+
+static void init_interface (GType type);
+
+G_DEFINE_TYPE_WITH_CODE (TestElement, test_element, GST_TYPE_ELEMENT,
+ init_interface (g_define_type_id));
+
+static void
+test_element_mixer_interface_init (GstMixerClass * klass)
+{
+ /* Not actually implementing any interfaces for this test atm */
+}
+
+static void
+init_interface (GType type)
+{
+ static const GInterfaceInfo mixer_iface_info = {
+ (GInterfaceInitFunc) test_element_mixer_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info);
+}
+
+static void
+test_element_class_init (TestElementClass * klass)
+{
+}
+
+static void
+test_element_init (TestElement * this)
+{
+}
+
+GST_START_TEST (test_messages)
+{
+ /* Create an empty GstElement that has a GstMixer interface and then
+ * send some notifications and validate them */
+ GstElement *test_element =
+ (GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
+ GstBus *bus = gst_bus_new ();
+ GstMixerTrack *mtrack = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
+ GstMixerOptions *mopts = g_object_new (GST_TYPE_MIXER_OPTIONS, NULL);
+ GstMixerTrack *t;
+ GstMixerOptions *o;
+ gint vols_in[2] = { 50, 75 };
+ gboolean mute, record;
+ gint *vols_out;
+ gint n_chans, i;
+ const gchar *val;
+ GstMessage *message;
+
+ mtrack->num_channels = 2;
+ mtrack->flags = GST_MIXER_TRACK_MUTE | GST_MIXER_TRACK_RECORD;
+
+ gst_element_set_bus (test_element, bus);
+
+ /* Test mute-toggled */
+ gst_mixer_mute_toggled (GST_MIXER (test_element), mtrack, TRUE);
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_MUTE_TOGGLED);
+ /* Test that we can pass NULL args */
+ gst_mixer_message_parse_mute_toggled (message, NULL, NULL);
+ /* Test the parsing */
+ gst_mixer_message_parse_mute_toggled (message, &t, &mute);
+ fail_unless (t == mtrack);
+ fail_unless (mute == TRUE);
+ gst_message_unref (message);
+
+ /* Test record-toggled */
+ gst_mixer_record_toggled (GST_MIXER (test_element), mtrack, TRUE);
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_RECORD_TOGGLED);
+ gst_mixer_message_parse_record_toggled (message, NULL, NULL);
+ gst_mixer_message_parse_record_toggled (message, &t, &record);
+ fail_unless (t == mtrack);
+ fail_unless (record == TRUE);
+ gst_message_unref (message);
+
+ /* Test volume-changed */
+ gst_mixer_volume_changed (GST_MIXER (test_element), mtrack, vols_in);
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_VOLUME_CHANGED);
+ gst_mixer_message_parse_volume_changed (message, NULL, NULL, NULL);
+ gst_mixer_message_parse_volume_changed (message, NULL, NULL, &n_chans);
+ fail_unless (n_chans == 2);
+ gst_mixer_message_parse_volume_changed (message, &t, &vols_out, &n_chans);
+ fail_unless (mtrack == t);
+ for (i = 0; i < n_chans; i++)
+ fail_unless (vols_out[i] == vols_in[i]);
+
+ gst_message_unref (message);
+ g_free (vols_out);
+
+ /* Test option-changed */
+ gst_mixer_option_changed (GST_MIXER (test_element), mopts, "TESTING");
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_OPTION_CHANGED);
+ gst_mixer_message_parse_option_changed (message, NULL, NULL);
+ gst_mixer_message_parse_option_changed (message, &o, &val);
+ fail_unless (o == mopts);
+ fail_unless (g_str_equal (val, "TESTING"));
+ gst_message_unref (message);
+
+ /* Test options-list-changed */
+ gst_mixer_options_list_changed (GST_MIXER (test_element), mopts);
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED);
+ gst_mixer_message_parse_options_list_changed (message, &o);
+ fail_unless (o == mopts);
+ gst_message_unref (message);
+
+ /* Test mixer-changed */
+ gst_mixer_mixer_changed (GST_MIXER (test_element));
+ message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
+ fail_if (message == NULL);
+ fail_unless (gst_mixer_message_get_type (message) ==
+ GST_MIXER_MESSAGE_MIXER_CHANGED);
+ gst_message_unref (message);
+
+ gst_object_unref (mtrack);
+ gst_object_unref (mopts);
+ gst_object_unref (bus);
+ gst_object_unref (test_element);
+}
+
+GST_END_TEST;
+
+static Suite *
+mixer_suite (void)
+{
+ Suite *s = suite_create ("mixer interface");
+ TCase *tc_chain = tcase_create ("notifications");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_messages);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = mixer_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/libs/navigation.c b/tests/check/libs/navigation.c
new file mode 100644
index 0000000..893ed0b
--- /dev/null
+++ b/tests/check/libs/navigation.c
@@ -0,0 +1,324 @@
+/* GStreamer
+ *
+ * unit tests for the navigation interface library
+ *
+ * Copyright (C) 2009 Jan Schmidt <thaytan@noraisin.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/interfaces/navigation.h>
+
+#include <string.h>
+
+#define TEST_ELEMENT_TYPE (test_element_get_type())
+
+typedef struct TestElement TestElement;
+typedef struct TestElementClass TestElementClass;
+
+struct TestElement
+{
+ GstElement parent;
+
+ GstNavigationEventType sent_type;
+ const gchar *sent_key;
+ gdouble sent_x, sent_y;
+ gint sent_button;
+ GstNavigationCommand sent_command;
+};
+
+struct TestElementClass
+{
+ GstElementClass parent_class;
+};
+
+GType test_element_get_type (void);
+
+static void init_interface (GType type);
+static void nav_send_event (GstNavigation * navigation,
+ GstStructure * structure);
+
+G_DEFINE_TYPE_WITH_CODE (TestElement, test_element, GST_TYPE_ELEMENT,
+ init_interface (g_define_type_id));
+
+static void
+test_element_navigation_interface_init (GstNavigationInterface * klass)
+{
+ klass->send_event = nav_send_event;
+}
+
+static void
+init_interface (GType type)
+{
+ static const GInterfaceInfo navigation_iface_info = {
+ (GInterfaceInitFunc) test_element_navigation_interface_init,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_NAVIGATION,
+ &navigation_iface_info);
+}
+
+static void
+test_element_class_init (TestElementClass * klass)
+{
+}
+
+static void
+test_element_init (TestElement * this)
+{
+}
+
+static void
+nav_send_event (GstNavigation * navigation, GstStructure * structure)
+{
+ GstEvent *event = gst_event_new_navigation (structure);
+ GstNavigationEventType etype = gst_navigation_event_get_type (event);
+ TestElement *self = (TestElement *) (navigation);
+
+ fail_if (etype == GST_NAVIGATION_EVENT_INVALID,
+ "Received navigation event could not be parsed");
+ fail_unless (etype == self->sent_type,
+ "Received navigation event did not match sent");
+
+ switch (etype) {
+ case GST_NAVIGATION_EVENT_KEY_PRESS:
+ case GST_NAVIGATION_EVENT_KEY_RELEASE:{
+ const gchar *key;
+ fail_unless (gst_navigation_event_parse_key_event (event, &key));
+ fail_unless (strcmp (key, self->sent_key) == 0);
+ break;
+ }
+ case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS:
+ case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:{
+ gint button;
+ gdouble x, y;
+ fail_unless (gst_navigation_event_parse_mouse_button_event (event,
+ &button, &x, &y));
+ fail_unless (button == self->sent_button);
+ fail_unless (x == self->sent_x);
+ fail_unless (y == self->sent_y);
+ break;
+ }
+ case GST_NAVIGATION_EVENT_MOUSE_MOVE:{
+ gdouble x, y;
+ fail_unless (gst_navigation_event_parse_mouse_move_event (event, &x, &y));
+ fail_unless (x == self->sent_x);
+ fail_unless (y == self->sent_y);
+ break;
+ }
+ case GST_NAVIGATION_EVENT_COMMAND:{
+ GstNavigationCommand cmd;
+ fail_unless (gst_navigation_event_parse_command (event, &cmd));
+ fail_unless (cmd == self->sent_command);
+ }
+ default:
+ break;
+ }
+
+ gst_event_unref (event);
+}
+
+GST_START_TEST (test_events)
+{
+ /* Create an empty GstElement that has a GstNavigation interface and then
+ * send some navigation events and validate them */
+ TestElement *test_element =
+ (TestElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
+ GstNavigationCommand cmds[] = {
+ GST_NAVIGATION_COMMAND_MENU1, GST_NAVIGATION_COMMAND_MENU2,
+ GST_NAVIGATION_COMMAND_MENU3, GST_NAVIGATION_COMMAND_MENU4,
+ GST_NAVIGATION_COMMAND_MENU5, GST_NAVIGATION_COMMAND_MENU6,
+ GST_NAVIGATION_COMMAND_MENU7, GST_NAVIGATION_COMMAND_LEFT,
+ GST_NAVIGATION_COMMAND_RIGHT, GST_NAVIGATION_COMMAND_UP,
+ GST_NAVIGATION_COMMAND_DOWN, GST_NAVIGATION_COMMAND_ACTIVATE,
+ GST_NAVIGATION_COMMAND_PREV_ANGLE, GST_NAVIGATION_COMMAND_NEXT_ANGLE
+ };
+ gint i;
+
+ test_element->sent_type = GST_NAVIGATION_EVENT_KEY_PRESS;
+ test_element->sent_key = "1";
+ gst_navigation_send_key_event (GST_NAVIGATION (test_element), "key-press",
+ "1");
+
+ test_element->sent_type = GST_NAVIGATION_EVENT_KEY_RELEASE;
+ test_element->sent_key = "2";
+ gst_navigation_send_key_event (GST_NAVIGATION (test_element), "key-release",
+ "2");
+
+ test_element->sent_type = GST_NAVIGATION_EVENT_MOUSE_MOVE;
+ test_element->sent_x = 50;
+ test_element->sent_y = 100;
+ gst_navigation_send_mouse_event (GST_NAVIGATION (test_element), "mouse-move",
+ 0, 50, 100);
+
+ test_element->sent_type = GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS;
+ test_element->sent_x = 10;
+ test_element->sent_y = 20;
+ test_element->sent_button = 1;
+ gst_navigation_send_mouse_event (GST_NAVIGATION (test_element),
+ "mouse-button-press", 1, 10, 20);
+
+ for (i = 0; i < G_N_ELEMENTS (cmds); i++) {
+ test_element->sent_type = GST_NAVIGATION_EVENT_COMMAND;
+ test_element->sent_command = cmds[i];
+ gst_navigation_send_command (GST_NAVIGATION (test_element), cmds[i]);
+ }
+
+ gst_object_unref (test_element);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_messages)
+{
+ GstMessage *m;
+ /* GST_NAVIGATION_MESSAGE_MOUSE_OVER */
+ {
+ gboolean active;
+ m = gst_navigation_message_new_mouse_over (NULL, TRUE);
+ fail_if (m == NULL);
+ fail_unless (gst_navigation_message_get_type (m) ==
+ GST_NAVIGATION_MESSAGE_MOUSE_OVER);
+ fail_unless (GST_MESSAGE_SRC (m) == NULL);
+ fail_unless (gst_navigation_message_parse_mouse_over (m, &active));
+ fail_unless (active == TRUE);
+ gst_message_unref (m);
+
+ m = gst_navigation_message_new_mouse_over (NULL, FALSE);
+ fail_if (m == NULL);
+ fail_unless (GST_MESSAGE_SRC (m) == NULL);
+ fail_unless (gst_navigation_message_get_type (m) ==
+ GST_NAVIGATION_MESSAGE_MOUSE_OVER);
+ fail_unless (gst_navigation_message_parse_mouse_over (m, &active));
+ fail_unless (active == FALSE);
+ gst_message_unref (m);
+ }
+
+ /* GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED */
+ {
+ m = gst_navigation_message_new_commands_changed (NULL);
+ fail_if (m == NULL);
+ fail_unless (GST_MESSAGE_SRC (m) == NULL);
+ fail_unless (gst_navigation_message_get_type (m) ==
+ GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED);
+ gst_message_unref (m);
+ }
+
+ /* GST_NAVIGATION_MESSAGE_ANGLES_CHANGED */
+ {
+ guint angle, angles;
+ m = gst_navigation_message_new_angles_changed (NULL, 1, 5);
+ fail_if (m == NULL);
+ fail_unless (GST_MESSAGE_SRC (m) == NULL);
+ fail_unless (gst_navigation_message_get_type (m) ==
+ GST_NAVIGATION_MESSAGE_ANGLES_CHANGED);
+ fail_unless (gst_navigation_message_parse_angles_changed (m, &angle,
+ &angles));
+ fail_unless (angle == 1);
+ fail_unless (angles == 5);
+ gst_message_unref (m);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_queries)
+{
+ GstQuery *q;
+
+ /* GST_NAVIGATION_QUERY_COMMANDS */
+ {
+ guint n;
+ GstNavigationCommand cmd;
+
+ q = gst_navigation_query_new_commands ();
+ fail_unless (q != NULL);
+ fail_unless (gst_navigation_query_get_type (q) ==
+ GST_NAVIGATION_QUERY_COMMANDS);
+ gst_navigation_query_set_commands (q, 3, GST_NAVIGATION_COMMAND_LEFT,
+ GST_NAVIGATION_COMMAND_MENU1, GST_NAVIGATION_COMMAND_MENU5);
+ fail_unless (gst_navigation_query_parse_commands_length (q, &n));
+ fail_unless (n == 3);
+ fail_unless (gst_navigation_query_parse_commands_nth (q, 1, &cmd));
+ fail_unless (cmd == GST_NAVIGATION_COMMAND_MENU1);
+
+ fail_unless (gst_navigation_query_parse_commands_length (q, NULL));
+ fail_unless (gst_navigation_query_parse_commands_nth (q, 2, NULL));
+
+ gst_query_unref (q);
+ }
+
+ /* GST_NAVIGATION_QUERY_ANGLES */
+ {
+ guint angle, angles;
+ q = gst_navigation_query_new_angles ();
+ fail_unless (q != NULL);
+ fail_unless (gst_navigation_query_get_type (q) ==
+ GST_NAVIGATION_QUERY_ANGLES);
+ gst_navigation_query_set_angles (q, 4, 8);
+ fail_unless (gst_navigation_query_parse_angles (q, &angle, &angles));
+ fail_unless (angle == 4);
+ fail_unless (angles == 8);
+
+ fail_unless (gst_navigation_query_parse_angles (q, NULL, &angles));
+ fail_unless (gst_navigation_query_parse_angles (q, &angle, NULL));
+ fail_unless (gst_navigation_query_parse_angles (q, NULL, NULL));
+
+ gst_query_unref (q);
+ }
+
+}
+
+GST_END_TEST;
+
+static Suite *
+navigation_suite (void)
+{
+ Suite *s = suite_create ("navigation interface");
+ TCase *tc_chain = tcase_create ("notifications");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_events);
+ tcase_add_test (tc_chain, test_messages);
+ tcase_add_test (tc_chain, test_queries);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = navigation_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/libs/netbuffer.c b/tests/check/libs/netbuffer.c
new file mode 100644
index 0000000..5485439
--- /dev/null
+++ b/tests/check/libs/netbuffer.c
@@ -0,0 +1,140 @@
+/* GStreamer unit tests for libgstnetbuffer
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+#include <gst/netbuffer/gstnetbuffer.h>
+
+#define DATA_STRING "Yoho this is a string"
+
+GST_START_TEST (test_netbuffer_copy)
+{
+ GstBuffer *netbuf, *copy;
+ guint8 ipv6_addr[16] = { 0xff, 0x11, 0xee, 0x22, 0xdd, 0x33, 0xcc,
+ 0x44, 0xbb, 0x55, 0xaa, 0x66, 0x00, 0x77, 0x99, 0x88
+ };
+ guint8 ipv6_copy[16];
+ guint32 ipv4_copy, ipv4_addr = 0xfe12dc34;
+ guint16 ipv6_port = 3490;
+ guint16 ipv4_port = 5678;
+ guint16 port;
+ GstMetaNetAddress *meta, *cmeta;
+ gsize len;
+ guint8 *data1, *data2;
+ gsize size1, size2;
+
+ netbuf = gst_buffer_new ();
+ fail_unless (netbuf != NULL, "failed to create net buffer");
+ meta = gst_buffer_add_meta_net_address (netbuf);
+
+ gst_netaddress_set_ip4_address (&meta->naddr, ipv4_addr, ipv4_port);
+
+ len = strlen (DATA_STRING);
+ gst_buffer_take_memory (netbuf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) DATA_STRING, NULL, len, 0, len));
+
+ GST_BUFFER_FLAG_SET (netbuf, GST_BUFFER_FLAG_DISCONT);
+
+ copy = gst_buffer_copy (netbuf);
+ fail_unless (copy != NULL, "failed to copy net buffer");
+
+ cmeta = gst_buffer_get_meta_net_address (copy);
+ fail_unless (cmeta != NULL, "copied buffer is not a GstNetBuffer!");
+
+ fail_unless_equals_int (GST_MINI_OBJECT_REFCOUNT_VALUE (copy), 1);
+
+ data1 = gst_buffer_map (netbuf, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (copy, &size2, NULL, GST_MAP_READ);
+ fail_unless_equals_int (size1, size2);
+ fail_unless (memcmp (data1, data2, size1) == 0);
+ gst_buffer_unmap (copy, data2, size2);
+ gst_buffer_unmap (netbuf, data1, size1);
+
+ fail_unless (GST_BUFFER_FLAG_IS_SET (copy, GST_BUFFER_FLAG_DISCONT));
+
+ fail_unless (gst_netaddress_get_ip4_address (&cmeta->naddr, &ipv4_copy,
+ &port));
+ fail_unless (ipv4_copy == ipv4_addr,
+ "Copied buffer has wrong IPV4 from address");
+ fail_unless (port == ipv4_port, "Copied buffer has wrong IPV4 from port");
+ gst_buffer_unref (netbuf);
+ gst_buffer_unref (copy);
+
+ netbuf = gst_buffer_new ();
+ fail_unless (netbuf != NULL, "failed to create net buffer");
+ meta = gst_buffer_add_meta_net_address (netbuf);
+
+ gst_netaddress_set_ip6_address (&meta->naddr, ipv6_addr, ipv6_port);
+
+ len = strlen (DATA_STRING);
+ gst_buffer_take_memory (netbuf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) DATA_STRING, NULL, len, 0, len));
+
+ GST_BUFFER_FLAG_SET (netbuf, GST_BUFFER_FLAG_DISCONT);
+
+ copy = gst_buffer_copy (netbuf);
+ fail_unless (copy != NULL, "failed to copy net buffer");
+
+ cmeta = gst_buffer_get_meta_net_address (copy);
+ fail_unless (cmeta != NULL, "copied buffer is not a GstNetBuffer!");
+
+ fail_unless_equals_int (GST_MINI_OBJECT_REFCOUNT_VALUE (copy), 1);
+
+ data1 = gst_buffer_map (netbuf, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (copy, &size2, NULL, GST_MAP_READ);
+ fail_unless_equals_int (size1, size2);
+ fail_unless (memcmp (data1, data2, size1) == 0);
+ gst_buffer_unmap (copy, data2, size2);
+ gst_buffer_unmap (netbuf, data1, size1);
+
+ fail_unless (GST_BUFFER_FLAG_IS_SET (copy, GST_BUFFER_FLAG_DISCONT));
+
+ fail_unless (gst_netaddress_get_ip6_address (&cmeta->naddr, ipv6_copy,
+ &port));
+ fail_unless (memcmp (ipv6_copy, ipv6_addr, 16) == 0,
+ "Copied buffer has wrong IPv6 destination address");
+ fail_unless (port == ipv6_port,
+ "Copied buffer has wrong IPv6 destination port");
+ gst_buffer_unref (netbuf);
+ gst_buffer_unref (copy);
+
+}
+
+GST_END_TEST;
+
+static Suite *
+netbuffer_suite (void)
+{
+ Suite *s = suite_create ("netbuffer");
+ TCase *tc_chain = tcase_create ("netbuffer");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_netbuffer_copy);
+
+ return s;
+}
+
+GST_CHECK_MAIN (netbuffer);
diff --git a/tests/check/libs/pbutils.c b/tests/check/libs/pbutils.c
new file mode 100644
index 0000000..9f74ca1
--- /dev/null
+++ b/tests/check/libs/pbutils.c
@@ -0,0 +1,750 @@
+/* GStreamer unit tests for libgstpbutils
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+#include <gst/pbutils/pbutils.h>
+
+#include <stdio.h>
+#include <glib/gstdio.h>
+#include <glib/gprintf.h>
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h> /* for chmod() and getpid () */
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h> /* for chmod() */
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for unlink() */
+#endif
+
+static void
+missing_msg_check_getters (GstMessage * msg)
+{
+ gchar *str;
+
+ str = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (str != NULL);
+ fail_unless (*str != '\0');
+ fail_unless (g_str_has_prefix (str, "gstreamer|"));
+ g_free (str);
+
+ str = gst_missing_plugin_message_get_description (msg);
+ fail_unless (str != NULL);
+ fail_unless (*str != '\0');
+ g_free (str);
+}
+
+GST_START_TEST (test_pb_utils_post_missing_messages)
+{
+ const GstStructure *s;
+ GstElement *pipeline;
+ GstMessage *msg;
+ GstCaps *caps;
+ GstBus *bus;
+
+ gst_pb_utils_init ();
+
+ pipeline = gst_pipeline_new ("pipeline");
+ bus = gst_element_get_bus (pipeline);
+
+ /* first, test common assertion failure cases */
+ ASSERT_CRITICAL (msg = gst_missing_uri_source_message_new (NULL, "http"));
+ ASSERT_CRITICAL (gst_missing_uri_source_message_new (pipeline, NULL));
+
+ ASSERT_CRITICAL (gst_missing_uri_sink_message_new (NULL, "http"));
+ ASSERT_CRITICAL (gst_missing_uri_sink_message_new (pipeline, NULL));
+
+ ASSERT_CRITICAL (gst_missing_element_message_new (NULL, "rgbfyltr"));
+ ASSERT_CRITICAL (gst_missing_element_message_new (pipeline, NULL));
+
+ caps = gst_caps_new_simple ("audio/x-dontexist", NULL);
+
+ ASSERT_CRITICAL (gst_missing_decoder_message_new (NULL, caps));
+ ASSERT_CRITICAL (gst_missing_decoder_message_new (pipeline, NULL));
+
+ ASSERT_CRITICAL (gst_missing_encoder_message_new (NULL, caps));
+ ASSERT_CRITICAL (gst_missing_encoder_message_new (pipeline, NULL));
+
+ gst_caps_unref (caps);
+
+ /* URI source (with existing protocol) */
+ msg = gst_missing_uri_source_message_new (pipeline, "http");
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "urisource");
+ fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "detail"), "http");
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* URI sink (with existing protocol) */
+ msg = gst_missing_uri_sink_message_new (pipeline, "smb");
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "urisink");
+ fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "detail"), "smb");
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* URI source (with bogus protocol) */
+ msg = gst_missing_uri_source_message_new (pipeline, "chchck");
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "urisource");
+ fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "detail"), "chchck");
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* URI sink (with bogus protocol) */
+ msg = gst_missing_uri_sink_message_new (pipeline, "chchck");
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "urisink");
+ fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "detail"), "chchck");
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* element */
+ msg = gst_missing_element_message_new (pipeline, "foobar");
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "element");
+ fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "detail"), "foobar");
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* create bogus caps that don't exist */
+ caps = gst_caps_new_simple ("do/x-not", "exist", G_TYPE_BOOLEAN, FALSE, NULL);
+
+ /* decoder (with unknown caps) */
+ msg = gst_missing_decoder_message_new (pipeline, caps);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "decoder");
+ fail_unless (gst_structure_has_field_typed (s, "detail", GST_TYPE_CAPS));
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* encoder (with unknown caps) */
+ msg = gst_missing_encoder_message_new (pipeline, caps);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "encoder");
+ fail_unless (gst_structure_has_field_typed (s, "detail", GST_TYPE_CAPS));
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ gst_caps_unref (caps);
+
+ /* create caps that exist */
+ caps = gst_caps_new_simple ("video/x-matroska", NULL);
+ /* decoder (with known caps) */
+ msg = gst_missing_decoder_message_new (pipeline, caps);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "decoder");
+ fail_unless (gst_structure_has_field_typed (s, "detail", GST_TYPE_CAPS));
+ fail_unless (gst_structure_has_field_typed (s, "name", G_TYPE_STRING));
+ fail_unless (gst_structure_get_string (s, "name") != NULL);
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ /* encoder (with known caps) */
+ msg = gst_missing_encoder_message_new (pipeline, caps);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ fail_unless (gst_message_get_structure (msg) != NULL);
+ s = gst_message_get_structure (msg);
+ fail_unless (gst_structure_has_name (s, "missing-plugin"));
+ fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING));
+ fail_unless_equals_string (gst_structure_get_string (s, "type"), "encoder");
+ fail_unless (gst_structure_has_field_typed (s, "detail", GST_TYPE_CAPS));
+ fail_unless (gst_structure_has_field_typed (s, "name", G_TYPE_STRING));
+ fail_unless (gst_structure_get_string (s, "name") != NULL);
+ missing_msg_check_getters (msg);
+ gst_message_unref (msg);
+
+ gst_caps_unref (caps);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_pb_utils_init)
+{
+ /* should be fine to call multiple times */
+ gst_pb_utils_init ();
+ gst_pb_utils_init ();
+ gst_pb_utils_init ();
+ gst_pb_utils_init ();
+}
+
+GST_END_TEST;
+
+static const gchar *caps_strings[] = {
+ /* formats with static descriptions */
+ "application/ogg", "application/vnd.rn-realmedia", "video/x-fli",
+ "video/x-flv", "video/x-matroska", "video/x-ms-asf", "video/x-msvideo",
+ "video/x-quicktime", "video/quicktime", "audio/x-ac3", "audio/ac3",
+ "audio/x-private-ac3", "audio/x-private1-ac3", "audio/x-adpcm",
+ "audio/aiff", "audio/x-alaw", "audio/amr", "audio/AMR", "audio/AMR-WB",
+ "audio/iLBC-sh", "audio/ms-gsm", "audio/qcelp", "audio/x-adpcm",
+ "audio/x-aiff", "audio/x-alac", "audio/x-amr-nb-sh", "audio/x-amr-wb-sh",
+ "audio/x-au", "audio/x-cinepak", "audio/x-dpcm", "audio/x-dts",
+ "audio/x-dv", "audio/x-flac", "audio/x-gsm", "audio/x-iec958",
+ "audio/x-iLBC", "audio/x-ircam", "audio/x-lpcm", "audio/x-private1-lpcm",
+ "audio/x-m4a", "audio/x-mod", "audio/x-mulaw", "audio/x-musepack",
+ "audio/x-nist", "audio/x-nsf", "audio/x-paris", "audio/x-qdm2",
+ "audio/x-ralf-mpeg4-generic", "audio/x-sds", "audio/x-shorten",
+ "audio/x-sid", "audio/x-sipro", "audio/x-spc", "audio/x-speex",
+ "audio/x-svx", "audio/x-tta", "audio/x-ttafile",
+ "audio/x-vnd.sony.atrac3", "audio/x-vorbis", "audio/x-voc", "audio/x-w64",
+ "audio/x-wav", "audio/x-wavpack", "audio/x-wavpack-correction",
+ "audio/x-wms", "audio/x-voxware", "video/sp5x", "video/vivo",
+ "video/x-3ivx", "video/x-4xm", "video/x-apple-video", "video/x-camtasia",
+ "video/x-cdxa", "video/x-cinepak", "video/x-cirrus-logic-accupak",
+ "video/x-compressed-yuv", "video/x-dirac", "video/x-dvd-subpicture",
+ "video/x-ffv", "video/x-flash-screen", "video/x-flash-video",
+ "video/x-h261", "video/x-huffyuv", "video/x-intel-h263", "video/x-jpeg",
+ "video/x-mjpeg", "video/x-mjpeg-b", "video/mpegts", "video/x-mng",
+ "video/x-mszh", "video/x-msvideocodec", "video/x-mve", "video/x-nut",
+ "video/x-nuv", "video/x-qdrw", "video/x-raw", "video/x-smc",
+ "video/x-smoke", "video/x-tarkin", "video/x-theora", "video/x-rle",
+ "video/x-ultimotion", "video/x-vcd", "video/x-vmnc", "video/x-vp3",
+ "video/x-vp5", "video/x-vp6", "video/x-vp6-flash", "video/x-vp7",
+ "video/x-xvid", "video/x-zlib", "image/bmp", "image/x-bmp",
+ "image/x-MS-bmp", "image/gif", "image/jpeg", "image/jng", "image/png",
+ "image/pbm", "image/ppm", "image/svg+xml", "image/tiff",
+ "image/x-cmu-raster", "image/x-icon", "image/x-xcf", "image/x-pixmap",
+ "image/x-xpixmap", "image/x-quicktime", "image/x-sun-raster",
+ "image/x-tga", "video/x-dv", "video/x-dv",
+ /* some RTP formats */
+ "application/x-rtp, media=(string)video, encoding-name=(string)TimVCodec",
+ "application/x-rtp, media=(string)audio, encoding-name=(string)TimACodec",
+ "application/x-rtp, media=(string)application, encoding-name=(string)TimMux",
+ "application/x-rtp, media=(string)woohoo, encoding-name=(string)TPM",
+ /* incomplete RTP formats */
+ "application/x-rtp, media=(string)woohoo",
+ "application/x-rtp, encoding-name=(string)TPM",
+ "application/x-rtp, media=(string)woohoo",
+ /* formats with dynamic descriptions */
+ "audio/x-adpcm",
+ "audio/x-adpcm, layout=(string)dvi",
+ "audio/x-adpcm, layout=(string)swf",
+ "audio/x-adpcm, layout=(string)microsoft",
+ "audio/x-adpcm, layout=(string)quicktime",
+ "audio/mpeg, mpegversion=(int)4",
+ "audio/mpeg, mpegversion=(int)1, layer=(int)1",
+ "audio/mpeg, mpegversion=(int)1, layer=(int)2",
+ "audio/mpeg, mpegversion=(int)1, layer=(int)3",
+ "audio/mpeg, mpegversion=(int)1, layer=(int)99",
+ "audio/mpeg, mpegversion=(int)99",
+ "video/mpeg, mpegversion=(int)2, systemstream=(boolean)TRUE",
+ "video/mpeg, systemstream=(boolean)FALSE",
+ "video/mpeg, mpegversion=(int)2",
+ "video/mpeg, mpegversion=(int)1, systemstream=(boolean)FALSE",
+ "video/mpeg, mpegversion=(int)2, systemstream=(boolean)FALSE",
+ "video/mpeg, mpegversion=(int)4, systemstream=(boolean)FALSE",
+ "video/mpeg, mpegversion=(int)99, systemstream=(boolean)TRUE",
+ "video/mpeg, mpegversion=(int)99, systemstream=(boolean)FALSE",
+ "video/mpeg",
+ "video/x-indeo, indeoversion=(int)3",
+ "video/x-indeo, indeoversion=(int)5",
+ "video/x-indeo",
+ "video/x-wmv, wmvversion=(int)1",
+ "video/x-wmv, wmvversion=(int)2",
+ "video/x-wmv, wmvversion=(int)3",
+ "video/x-wmv, wmvversion=(int)99",
+ "video/x-wmv",
+ "audio/x-wma, wmaversion=(int)1",
+ "audio/x-wma, wmaversion=(int)2",
+ "audio/x-wma, wmaversion=(int)3",
+ "audio/x-wma, wmaversion=(int)99",
+ "audio/x-wma",
+ "video/x-divx, divxversion=(int)3",
+ "video/x-divx, divxversion=(int)4",
+ "video/x-divx, divxversion=(int)5",
+ "video/x-divx, divxversion=(int)99",
+ "video/x-divx",
+ "video/x-svq, svqversion=(int)1",
+ "video/x-svq, svqversion=(int)3",
+ "video/x-svq, svqversion=(int)99",
+ "video/x-svq",
+ "video/x-h264, variant=(string)itu",
+ "video/x-h264, variant=(string)videosoft",
+ "video/x-h264, variant=(string)foobar",
+ "video/x-h264",
+ "video/x-h263, variant=(string)itu",
+ "video/x-h263, variant=(string)lead",
+ "video/x-h263, variant=(string)microsoft",
+ "video/x-h263, variant=(string)vdolive",
+ "video/x-h263, variant=(string)vivo",
+ "video/x-h263, variant=(string)xirlink",
+ "video/x-h263, variant=(string)foobar",
+ "video/x-h263",
+ "video/x-msmpeg, msmpegversion=(int)41",
+ "video/x-msmpeg, msmpegversion=(int)42",
+ "video/x-msmpeg, msmpegversion=(int)43",
+ "video/x-msmpeg, msmpegversion=(int)99",
+ "video/x-msmpeg",
+ "video/x-pn-realvideo, rmversion=(int)1",
+ "video/x-pn-realvideo, rmversion=(int)2",
+ "video/x-pn-realvideo, rmversion=(int)3",
+ "video/x-pn-realvideo, rmversion=(int)4",
+ "video/x-pn-realvideo, rmversion=(int)99",
+ "video/x-pn-realvideo",
+ "audio/x-pn-realaudio, raversion=(int)1",
+ "audio/x-pn-realaudio, raversion=(int)2",
+ "audio/x-pn-realaudio, raversion=(int)99",
+ "audio/x-pn-realaudio",
+ "audio/x-mace, maceversion=(int)3",
+ "audio/x-mace, maceversion=(int)6",
+ "audio/x-mace, maceversion=(int)99",
+ "audio/x-mace",
+ "video/x-truemotion, trueversion=(int)1",
+ "video/x-truemotion, trueversion=(int)2",
+ "video/x-truemotion, trueversion=(int)99",
+ "video/x-truemotion",
+ "video/x-asus, asusversion=(int)1",
+ "video/x-asus, asusversion=(int)2",
+ "video/x-asus, asusversion=(int)99",
+ "video/x-asus",
+ "video/x-xan, wcversion=(int)1",
+ "video/x-xan, wcversion=(int)99",
+ "video/x-xan",
+ "video/x-ati-vcr, vcrversion=(int)1",
+ "video/x-ati-vcr, vcrversion=(int)2",
+ "video/x-ati-vcr, vcrversion=(int)99",
+ "video/x-ati-vcr",
+ /* raw audio */
+ "audio/x-raw, format=(string)S16LE, rate=(int)44100, channels=(int)2",
+ "audio/x-raw, format=(string)F32,rate=(int)22050, channels=(int)2",
+ /* raw video */
+ "video/x-raw, format=(string)RGB16, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1",
+ "video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1",
+ /* and a made-up format */
+ "video/x-tpm"
+};
+
+GST_START_TEST (test_pb_utils_get_codec_description)
+{
+ gint i;
+
+ gst_pb_utils_init ();
+
+ for (i = 0; i < G_N_ELEMENTS (caps_strings); ++i) {
+ GstCaps *caps;
+ gchar *desc;
+
+ caps = gst_caps_from_string (caps_strings[i]);
+ fail_unless (caps != NULL, "could not create caps from string '%s'",
+ caps_strings[i]);
+ GST_LOG ("Caps %s:", caps_strings[i]);
+ desc = gst_pb_utils_get_codec_description (caps);
+ fail_unless (desc != NULL);
+ GST_LOG (" - codec : %s", desc);
+ g_free (desc);
+ desc = gst_pb_utils_get_decoder_description (caps);
+ fail_unless (desc != NULL);
+ GST_LOG (" - decoder : %s", desc);
+ g_free (desc);
+ desc = gst_pb_utils_get_encoder_description (caps);
+ fail_unless (desc != NULL);
+ GST_LOG (" - encoder : %s", desc);
+ g_free (desc);
+ gst_caps_unref (caps);
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_pb_utils_taglist_add_codec_info)
+{
+ GstTagList *list;
+ GstCaps *caps;
+
+ gst_pb_utils_init ();
+ list = gst_tag_list_new ();
+ caps = gst_caps_new_simple ("video/x-theora", NULL);
+ ASSERT_CRITICAL (fail_if
+ (gst_pb_utils_add_codec_description_to_tag_list (NULL,
+ GST_TAG_VIDEO_CODEC, caps)));
+ ASSERT_CRITICAL (fail_if
+ (gst_pb_utils_add_codec_description_to_tag_list (list, NULL, caps)));
+ ASSERT_CRITICAL (fail_if
+ (gst_pb_utils_add_codec_description_to_tag_list (list, "asdfa", caps)));
+ ASSERT_CRITICAL (fail_if
+ (gst_pb_utils_add_codec_description_to_tag_list (list,
+ GST_TAG_IMAGE, caps)));
+ ASSERT_CRITICAL (fail_if
+ (gst_pb_utils_add_codec_description_to_tag_list (list,
+ GST_TAG_VIDEO_CODEC, NULL)));
+ /* FIXME: do something here */
+ fail_unless (gst_pb_utils_add_codec_description_to_tag_list (list,
+ GST_TAG_VIDEO_CODEC, caps));
+ fail_if (gst_tag_list_is_empty (list));
+ gst_tag_list_free (list);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static gint marker;
+
+static void
+result_cb (GstInstallPluginsReturn result, gpointer user_data)
+{
+ GST_LOG ("result = %u, user_data = %p", result, user_data);
+
+ fail_unless (user_data == (gpointer) & marker);
+
+ marker = result;
+}
+
+#define SCRIPT_NO_XID \
+ "#!/bin/sh\n" \
+ "if test x$1 != xdetail1; then exit 21; fi;\n" \
+ "if test x$2 != xdetail2; then exit 22; fi;\n" \
+ "exit 1\n"
+
+#define SCRIPT_WITH_XID \
+ "#!/bin/sh\n" \
+ "if test x$1 != 'x--transient-for=42'; then exit 21; fi;\n" \
+ "if test x$2 != xdetail1; then exit 22; fi;\n" \
+ "if test x$3 != xdetail2; then exit 23; fi;\n" \
+ "exit 0\n"
+
+/* make sure our script gets called with the right parameters */
+static void
+test_pb_utils_install_plugins_do_callout (gchar ** details,
+ GstInstallPluginsContext * ctx, const gchar * script,
+ GstInstallPluginsReturn expected_result)
+{
+#ifdef G_OS_UNIX
+ GstInstallPluginsReturn ret;
+ GError *err = NULL;
+ gchar *path;
+
+ path = g_strdup_printf ("%s/gst-plugins-base-unit-test-helper.%s.%lu",
+ g_get_tmp_dir (), (g_get_user_name ())? g_get_user_name () : "nobody",
+ (gulong) getpid ());
+
+ if (!g_file_set_contents (path, script, -1, &err)) {
+ GST_DEBUG ("Failed to write test script to %s: %s", path, err->message);
+ g_error_free (err);
+ goto done;
+ }
+
+ if (chmod (path, S_IRUSR | S_IWUSR | S_IXUSR) != 0) {
+ GST_DEBUG ("Could not set mode u+rwx on '%s'", path);
+ goto done;
+ }
+
+ /* test gst_install_plugins_supported() I */
+ g_setenv ("GST_INSTALL_PLUGINS_HELPER", "/i/do/not/ex.ist!", 1);
+ fail_if (gst_install_plugins_supported ());
+
+ GST_LOG ("setting GST_INSTALL_PLUGINS_HELPER to '%s'", path);
+ g_setenv ("GST_INSTALL_PLUGINS_HELPER", path, 1);
+
+ /* test gst_install_plugins_supported() II */
+ fail_unless (gst_install_plugins_supported ());
+
+ /* test sync callout */
+ ret = gst_install_plugins_sync (details, ctx);
+ fail_unless (ret == GST_INSTALL_PLUGINS_HELPER_MISSING ||
+ ret == expected_result,
+ "gst_install_plugins_sync() failed with unexpected ret %d, which is "
+ "neither HELPER_MISSING nor %d", ret, expected_result);
+
+ /* test async callout */
+ marker = -333;
+ ret = gst_install_plugins_async (details, ctx, result_cb,
+ (gpointer) & marker);
+ fail_unless (ret == GST_INSTALL_PLUGINS_HELPER_MISSING ||
+ ret == GST_INSTALL_PLUGINS_STARTED_OK,
+ "gst_install_plugins_async() failed with unexpected ret %d", ret);
+ if (ret == GST_INSTALL_PLUGINS_STARTED_OK) {
+ while (marker == -333) {
+ g_usleep (500);
+ g_main_context_iteration (NULL, FALSE);
+ }
+ /* and check that the callback was called with the expected code */
+ fail_unless_equals_int (marker, expected_result);
+ }
+
+done:
+
+ unlink (path);
+ g_free (path);
+#endif /* G_OS_UNIX */
+}
+
+GST_START_TEST (test_pb_utils_install_plugins)
+{
+ GstInstallPluginsContext *ctx;
+ GstInstallPluginsReturn ret;
+ gchar *details[] = { (char *) "detail1", (char *) "detail2", NULL };
+ gchar *details_multi[] =
+ { (char *) "detail1", (char *) "detail1", (char *) "detail2", NULL };
+
+ ctx = gst_install_plugins_context_new ();
+
+ ASSERT_CRITICAL (ret = gst_install_plugins_sync (NULL, ctx));
+ ASSERT_CRITICAL (ret =
+ gst_install_plugins_async (NULL, ctx, result_cb, (gpointer) & marker));
+ ASSERT_CRITICAL (ret =
+ gst_install_plugins_async (details, ctx, NULL, (gpointer) & marker));
+
+ /* make sure the functions return the right error code if the helper does
+ * not exist */
+ g_setenv ("GST_INSTALL_PLUGINS_HELPER", "/does/not/ex/is.t", 1);
+ ret = gst_install_plugins_sync (details, NULL);
+ fail_unless_equals_int (ret, GST_INSTALL_PLUGINS_HELPER_MISSING);
+
+ marker = -333;
+ ret =
+ gst_install_plugins_async (details, NULL, result_cb, (gpointer) & marker);
+ fail_unless_equals_int (ret, GST_INSTALL_PLUGINS_HELPER_MISSING);
+ /* and check that the callback wasn't called */
+ fail_unless_equals_int (marker, -333);
+
+ /* now make sure our scripts are actually called as expected (if possible) */
+ test_pb_utils_install_plugins_do_callout (details, NULL, SCRIPT_NO_XID,
+ GST_INSTALL_PLUGINS_NOT_FOUND);
+
+ /* and again with context */
+ gst_install_plugins_context_set_xid (ctx, 42);
+ test_pb_utils_install_plugins_do_callout (details, ctx, SCRIPT_WITH_XID,
+ GST_INSTALL_PLUGINS_SUCCESS);
+
+ /* and make sure that duplicate detail strings get dropped */
+ test_pb_utils_install_plugins_do_callout (details_multi, NULL, SCRIPT_NO_XID,
+ GST_INSTALL_PLUGINS_NOT_FOUND);
+
+ /* and the same again with context */
+ gst_install_plugins_context_set_xid (ctx, 42);
+ test_pb_utils_install_plugins_do_callout (details_multi, ctx, SCRIPT_WITH_XID,
+ GST_INSTALL_PLUGINS_SUCCESS);
+
+ /* and free the context now that we don't need it any longer */
+ gst_install_plugins_context_free (ctx);
+
+ /* completely silly test to check gst_install_plugins_return_get_name()
+ * is somewhat well-behaved */
+ {
+ gint i;
+
+ for (i = -99; i < 16738; ++i) {
+ const gchar *s;
+
+ s = gst_install_plugins_return_get_name ((GstInstallPluginsReturn) i);
+ fail_unless (s != NULL);
+ /* GST_LOG ("%5d = %s", i, s); */
+ }
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_pb_utils_installer_details)
+{
+ GstMessage *msg;
+ GstElement *el;
+ GstCaps *caps;
+ gchar *detail1, *detail2;
+
+ el = gst_pipeline_new ("dummy-element");
+
+ /* uri source */
+ detail1 = gst_missing_uri_source_installer_detail_new ("http");
+ fail_unless (detail1 != NULL);
+ fail_unless (g_str_has_prefix (detail1, "gstreamer|0.11|"));
+ fail_unless (g_str_has_suffix (detail1, "|urisource-http"));
+ msg = gst_missing_uri_source_message_new (el, "http");
+ fail_unless (msg != NULL);
+ detail2 = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (detail2 != NULL);
+ gst_message_unref (msg);
+ fail_unless_equals_string (detail1, detail2);
+ g_free (detail1);
+ g_free (detail2);
+
+ /* uri sink */
+ detail1 = gst_missing_uri_sink_installer_detail_new ("http");
+ fail_unless (detail1 != NULL);
+ fail_unless (g_str_has_prefix (detail1, "gstreamer|0.11|"));
+ fail_unless (g_str_has_suffix (detail1, "|urisink-http"));
+ msg = gst_missing_uri_sink_message_new (el, "http");
+ fail_unless (msg != NULL);
+ detail2 = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (detail2 != NULL);
+ gst_message_unref (msg);
+ fail_unless_equals_string (detail1, detail2);
+ g_free (detail1);
+ g_free (detail2);
+
+ /* element */
+ detail1 = gst_missing_element_installer_detail_new ("deinterlace");
+ fail_unless (detail1 != NULL);
+ fail_unless (g_str_has_prefix (detail1, "gstreamer|0.11|"));
+ fail_unless (g_str_has_suffix (detail1, "|element-deinterlace"));
+ msg = gst_missing_element_message_new (el, "deinterlace");
+ fail_unless (msg != NULL);
+ detail2 = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (detail2 != NULL);
+ gst_message_unref (msg);
+ fail_unless_equals_string (detail1, detail2);
+ g_free (detail1);
+ g_free (detail2);
+
+ /* decoder */
+ caps = gst_caps_new_simple ("audio/x-spiffy", "spiffyversion", G_TYPE_INT,
+ 2, "channels", G_TYPE_INT, 6, NULL);
+ detail1 = gst_missing_decoder_installer_detail_new (caps);
+ fail_unless (detail1 != NULL);
+ fail_unless (g_str_has_prefix (detail1, "gstreamer|0.11|"));
+ fail_unless (g_str_has_suffix (detail1,
+ "|decoder-audio/x-spiffy, spiffyversion=(int)2"));
+ msg = gst_missing_decoder_message_new (el, caps);
+ fail_unless (msg != NULL);
+ detail2 = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (detail2 != NULL);
+ gst_message_unref (msg);
+ gst_caps_unref (caps);
+ fail_unless_equals_string (detail1, detail2);
+ g_free (detail1);
+ g_free (detail2);
+
+ /* encoder */
+ caps = gst_caps_new_simple ("audio/x-spiffy", "spiffyversion", G_TYPE_INT,
+ 2, "channels", G_TYPE_INT, 6, NULL);
+ detail1 = gst_missing_encoder_installer_detail_new (caps);
+ fail_unless (g_str_has_prefix (detail1, "gstreamer|0.11|"));
+ fail_unless (g_str_has_suffix (detail1,
+ "|encoder-audio/x-spiffy, spiffyversion=(int)2"));
+ fail_unless (detail1 != NULL);
+ msg = gst_missing_encoder_message_new (el, caps);
+ fail_unless (msg != NULL);
+ detail2 = gst_missing_plugin_message_get_installer_detail (msg);
+ fail_unless (detail2 != NULL);
+ gst_message_unref (msg);
+ gst_caps_unref (caps);
+ fail_unless_equals_string (detail1, detail2);
+ g_free (detail1);
+ g_free (detail2);
+
+ gst_object_unref (el);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_pb_utils_versions)
+{
+ gchar *s;
+ guint maj, min, mic, nano;
+
+ gst_plugins_base_version (NULL, NULL, NULL, NULL);
+ gst_plugins_base_version (&maj, &min, &mic, &nano);
+ fail_unless_equals_int (maj, GST_PLUGINS_BASE_VERSION_MAJOR);
+ fail_unless_equals_int (min, GST_PLUGINS_BASE_VERSION_MINOR);
+ fail_unless_equals_int (mic, GST_PLUGINS_BASE_VERSION_MICRO);
+ fail_unless_equals_int (nano, GST_PLUGINS_BASE_VERSION_NANO);
+
+ s = gst_plugins_base_version_string ();
+ if (GST_PLUGINS_BASE_VERSION_NANO == 0) {
+ fail_if (strstr (s, "GIT") || strstr (s, "git") || strstr (s, "prerel"));
+ }
+ if (GST_PLUGINS_BASE_VERSION_NANO == 1) {
+ fail_unless (strstr (s, "GIT") || strstr (s, "git"));
+ }
+ if (GST_PLUGINS_BASE_VERSION_NANO >= 2) {
+ fail_unless (strstr (s, "Prerelease") || strstr (s, "prerelease"));
+ }
+ g_free (s);
+}
+
+GST_END_TEST;
+
+static Suite *
+libgstpbutils_suite (void)
+{
+ Suite *s = suite_create ("pbutils library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_pb_utils_init);
+ tcase_add_test (tc_chain, test_pb_utils_post_missing_messages);
+ tcase_add_test (tc_chain, test_pb_utils_taglist_add_codec_info);
+ tcase_add_test (tc_chain, test_pb_utils_get_codec_description);
+ tcase_add_test (tc_chain, test_pb_utils_install_plugins);
+ tcase_add_test (tc_chain, test_pb_utils_installer_details);
+ tcase_add_test (tc_chain, test_pb_utils_versions);
+ return s;
+}
+
+GST_CHECK_MAIN (libgstpbutils);
diff --git a/tests/check/libs/profile.c b/tests/check/libs/profile.c
new file mode 100644
index 0000000..a040962
--- /dev/null
+++ b/tests/check/libs/profile.c
@@ -0,0 +1,627 @@
+/* GStreamer unit test for gstprofile
+ *
+ * Copyright (C) <2009> Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* #include <fcntl.h> */
+#include <unistd.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <gst/check/gstcheck.h>
+
+#include <gst/pbutils/encoding-profile.h>
+#include <gst/pbutils/encoding-target.h>
+
+#define CHECK_PROFILE(profile, name, description, format, preset, presence, restriction) \
+ { \
+ fail_if(profile == NULL); \
+ fail_unless_equals_string (gst_encoding_profile_get_name (profile), name); \
+ fail_unless_equals_string (gst_encoding_profile_get_description (profile), description); \
+ fail_unless (gst_caps_is_equal (gst_encoding_profile_get_format (profile), format)); \
+ fail_unless_equals_string (gst_encoding_profile_get_preset (profile), preset); \
+ fail_unless_equals_int (gst_encoding_profile_get_presence (profile), presence); \
+ fail_unless (gst_caps_is_equal (gst_encoding_profile_get_restriction (profile), restriction)); \
+ }
+
+GST_START_TEST (test_profile_creation)
+{
+ GstEncodingProfile *encprof;
+ GstEncodingAudioProfile *audioprof;
+ GstEncodingVideoProfile *videoprof;
+ GstCaps *ogg, *vorbis, *theora;
+ GstCaps *test1, *test2;
+
+ ogg = gst_caps_new_simple ("application/ogg", NULL);
+ vorbis = gst_caps_new_simple ("audio/x-vorbis", NULL);
+ theora = gst_caps_new_simple ("video/x-theora", NULL);
+
+ encprof = (GstEncodingProfile *) gst_encoding_container_profile_new ((gchar *)
+ "ogg-theora-vorbis", "dumb-profile", ogg, (gchar *) "dumb-preset");
+ CHECK_PROFILE (encprof, "ogg-theora-vorbis", "dumb-profile", ogg,
+ "dumb-preset", 0, NULL);
+
+ audioprof = gst_encoding_audio_profile_new (vorbis, (gchar *) "HQ", NULL, 0);
+ CHECK_PROFILE ((GstEncodingProfile *) audioprof, NULL, NULL, vorbis, "HQ", 0,
+ NULL);
+
+ videoprof = gst_encoding_video_profile_new (theora, (gchar *) "HQ", NULL, 0);
+ CHECK_PROFILE ((GstEncodingProfile *) videoprof, NULL, NULL, theora, "HQ",
+ 0, NULL);
+
+ fail_unless (gst_encoding_container_profile_add_profile (
+ (GstEncodingContainerProfile *) encprof,
+ (GstEncodingProfile *) audioprof));
+ fail_unless (gst_encoding_container_profile_add_profile (
+ (GstEncodingContainerProfile *) encprof,
+ (GstEncodingProfile *) videoprof));
+
+ /* Test caps */
+ test1 = gst_caps_from_string ("video/x-theora; audio/x-vorbis");
+ test2 = gst_encoding_profile_get_input_caps (encprof);
+ fail_unless (gst_caps_is_equal (test1, test2));
+ gst_caps_unref (test1);
+ gst_caps_unref (test2);
+
+ gst_encoding_profile_unref (encprof);
+ gst_caps_unref (ogg);
+ gst_caps_unref (theora);
+ gst_caps_unref (vorbis);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_profile_input_caps)
+{
+ GstEncodingProfile *sprof;
+ GstCaps *vorbis;
+ GstCaps *out, *restriction, *test1;
+
+ vorbis = gst_caps_new_simple ("audio/x-vorbis", NULL);
+
+ /* Simple case, no restriction */
+ sprof = (GstEncodingProfile *)
+ gst_encoding_audio_profile_new (vorbis, NULL, NULL, 0);
+ fail_if (sprof == NULL);
+
+ out = gst_encoding_profile_get_input_caps (sprof);
+ fail_if (out == NULL);
+ fail_unless (gst_caps_is_equal (out, vorbis));
+ gst_caps_unref (out);
+ gst_encoding_profile_unref (sprof);
+
+ /* One simple restriction */
+ restriction = gst_caps_from_string ("audio/x-raw,channels=2,rate=44100");
+ test1 = gst_caps_from_string ("audio/x-vorbis,channels=2,rate=44100");
+ fail_if (restriction == NULL);
+
+ sprof = (GstEncodingProfile *)
+ gst_encoding_audio_profile_new (vorbis, NULL, restriction, 0);
+ fail_if (sprof == NULL);
+
+ out = gst_encoding_profile_get_input_caps (sprof);
+ fail_if (out == NULL);
+ GST_DEBUG ("got caps %" GST_PTR_FORMAT, out);
+ fail_unless (gst_caps_is_equal (out, test1));
+ gst_caps_unref (out);
+ gst_caps_unref (restriction);
+ gst_caps_unref (test1);
+ gst_encoding_profile_unref (sprof);
+
+ gst_caps_unref (vorbis);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_target_naming)
+{
+ GstEncodingTarget *target;
+
+ gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);
+
+ /* NULL values */
+ ASSERT_CRITICAL (target = gst_encoding_target_new (NULL, NULL, NULL, NULL));
+ fail_if (target != NULL);
+ ASSERT_CRITICAL (target =
+ gst_encoding_target_new ("donkey", NULL, NULL, NULL));
+ fail_if (target != NULL);
+ ASSERT_CRITICAL (target =
+ gst_encoding_target_new (NULL, "donkey", NULL, NULL));
+ fail_if (target != NULL);
+ ASSERT_CRITICAL (target =
+ gst_encoding_target_new (NULL, NULL, "donkey", NULL));
+ fail_if (target != NULL);
+
+ /* Name and Category validation */
+
+ /* empty non-NULL strings */
+ fail_if (gst_encoding_target_new ("", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "", "description", NULL) != NULL);
+
+ /* don't start with a lower case ASCII character */
+ fail_if (gst_encoding_target_new ("A", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("3", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("-", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("!", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new (" ", "valid", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "A", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "3", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "-", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "!", "description", NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", " ", "description", NULL) != NULL);
+
+ /* Starting with anything else is valid */
+ target = gst_encoding_target_new ("a", "valid", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+ target = gst_encoding_target_new ("z", "valid", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+ target = gst_encoding_target_new ("valid", "a", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+ target = gst_encoding_target_new ("valid", "z", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+
+ /* only inner valid characters are lower-case ASCII letters *OR* digits *OR* hyphens */
+ fail_if (gst_encoding_target_new ("aA", "valid", "description",
+ NULL) != NULL);
+ fail_if (gst_encoding_target_new ("a!", "valid", "description",
+ NULL) != NULL);
+ fail_if (gst_encoding_target_new ("space donkeys", "valid", "description",
+ NULL) != NULL);
+ fail_if (gst_encoding_target_new ("howaboutùnicode", "valid", "description",
+ NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "aA", "description",
+ NULL) != NULL);
+ fail_if (gst_encoding_target_new ("valid", "a!", "description",
+ NULL) != NULL);
+
+ target =
+ gst_encoding_target_new ("donkey-4-ever", "valid", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+ target =
+ gst_encoding_target_new ("valid", "donkey-4-ever", "description", NULL);
+ fail_if (target == NULL);
+ gst_encoding_target_unref (target);
+
+}
+
+GST_END_TEST;
+
+static GstEncodingTarget *
+create_saveload_target (const gchar * targetname)
+{
+ GstEncodingTarget *target;
+ GstEncodingProfile *profile, *sprof;
+ GstCaps *caps, *caps2;
+
+ GST_DEBUG ("Creating target");
+
+ target = gst_encoding_target_new (targetname, "herding",
+ "Plenty of pony glitter profiles", NULL);
+ caps = gst_caps_from_string ("animal/x-pony");
+ profile =
+ (GstEncodingProfile *) gst_encoding_container_profile_new ("pony",
+ "I don't want a description !", caps, NULL);
+ gst_caps_unref (caps);
+ gst_encoding_target_add_profile (target, profile);
+
+ caps = gst_caps_from_string ("audio/x-pony-song,pretty=True");
+ caps2 = gst_caps_from_string ("audio/x-raw,channels=1,rate=44100");
+ sprof =
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (caps, NULL, caps2,
+ 1);
+ gst_encoding_container_profile_add_profile ((GstEncodingContainerProfile *)
+ profile, sprof);
+ gst_caps_unref (caps);
+ gst_caps_unref (caps2);
+
+ caps = gst_caps_from_string ("video/x-glitter,sparkling=True");
+ caps2 =
+ gst_caps_from_string ("video/x-raw,width=640,height=480,framerate=15/1");
+ sprof = (GstEncodingProfile *)
+ gst_encoding_video_profile_new (caps, "seriously glittery", caps2, 0);
+ gst_encoding_video_profile_set_variableframerate ((GstEncodingVideoProfile *)
+ sprof, TRUE);
+ gst_encoding_container_profile_add_profile ((GstEncodingContainerProfile *)
+ profile, sprof);
+ gst_caps_unref (caps);
+ gst_caps_unref (caps2);
+
+ return target;
+}
+
+GST_START_TEST (test_target_profile)
+{
+ GstEncodingTarget *target;
+ GstEncodingProfile *prof;
+
+ target = create_saveload_target ("myponytarget");
+
+ /* NULL isn't a valid profile name */
+ ASSERT_CRITICAL (gst_encoding_target_get_profile (target, NULL));
+
+ /* try finding a profile that doesn't exist */
+ fail_if (gst_encoding_target_get_profile (target,
+ "no-really-does-not-exist"));
+
+ /* try finding a profile that exists */
+ prof = gst_encoding_target_get_profile (target, "pony");
+ fail_if (prof == NULL);
+
+ gst_encoding_profile_unref (prof);
+ gst_encoding_target_unref (target);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_saving_profile)
+{
+ GstEncodingTarget *orig, *loaded = NULL;
+ GstEncodingProfile *proforig, *profloaded;
+ gchar *profile_file_name;
+
+ /* Create and store a target */
+ orig = create_saveload_target ("myponytarget2");
+ GST_DEBUG ("Saving target 'myponytarget2'");
+ fail_unless (gst_encoding_target_save (orig, NULL));
+
+ /* Check we can load it */
+ profile_file_name =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", "myponytarget2.gep", NULL);
+ GST_DEBUG ("Loading target from '%s'", profile_file_name);
+ loaded = gst_encoding_target_load_from_file (profile_file_name, NULL);
+ fail_unless (loaded != NULL);
+ g_free (profile_file_name);
+
+ GST_DEBUG ("Checking targets are equal");
+ /* Check targets are identical */
+ /* 1. at the target level */
+ fail_unless_equals_string (gst_encoding_target_get_name (orig),
+ gst_encoding_target_get_name (loaded));
+ fail_unless_equals_string (gst_encoding_target_get_category (orig),
+ gst_encoding_target_get_category (loaded));
+ fail_unless_equals_string (gst_encoding_target_get_description (orig),
+ gst_encoding_target_get_description (loaded));
+ fail_unless_equals_int (g_list_length ((GList *)
+ gst_encoding_target_get_profiles (loaded)), 1);
+
+ /* 2. at the profile level */
+ profloaded =
+ (GstEncodingProfile *) gst_encoding_target_get_profiles (loaded)->data;
+ proforig =
+ (GstEncodingProfile *) gst_encoding_target_get_profiles (orig)->data;
+
+ fail_unless_equals_int (G_TYPE_FROM_INSTANCE (profloaded),
+ G_TYPE_FROM_INSTANCE (proforig));
+ GST_DEBUG ("Comparing loaded:%p to original:%p", profloaded, proforig);
+ fail_unless (gst_encoding_profile_is_equal (profloaded, proforig));
+
+ gst_encoding_target_unref (orig);
+ gst_encoding_target_unref (loaded);
+}
+
+GST_END_TEST;
+
+static void
+test_individual_target (GstEncodingTarget * target)
+{
+ GstEncodingProfile *prof;
+ GstCaps *tmpcaps, *tmpcaps2;
+ GstEncodingProfile *sprof1, *sprof2;
+
+ GST_DEBUG ("Checking the target properties");
+ /* Check the target */
+ fail_unless_equals_string (gst_encoding_target_get_name (target),
+ "myponytarget");
+ fail_unless_equals_string (gst_encoding_target_get_category (target),
+ "herding");
+ fail_unless_equals_string (gst_encoding_target_get_description (target),
+ "Plenty of pony glitter profiles");
+
+ GST_DEBUG ("Checking the number of profiles the target contains");
+ fail_unless_equals_int (g_list_length ((GList *)
+ gst_encoding_target_get_profiles (target)), 1);
+
+
+ GST_DEBUG ("Checking the container profile");
+ /* Check the profile */
+ prof = (GstEncodingProfile *) gst_encoding_target_get_profiles (target)->data;
+ tmpcaps = gst_caps_from_string ("animal/x-pony");
+ CHECK_PROFILE (prof, "pony", "I don't want a description !", tmpcaps, NULL, 0,
+ 0);
+ gst_caps_unref (tmpcaps);
+
+ GST_DEBUG ("Checking the container profile has 2 stream profiles");
+ /* Check the stream profiles */
+ fail_unless_equals_int (g_list_length ((GList *)
+ gst_encoding_container_profile_get_profiles (
+ (GstEncodingContainerProfile *) prof)), 2);
+
+ GST_DEBUG ("Checking the container profile has the audio/x-pony-song stream");
+ tmpcaps = gst_caps_from_string ("audio/x-pony-song,pretty=True");
+ tmpcaps2 = gst_caps_from_string ("audio/x-raw,channels=1,rate=44100");
+ sprof1 =
+ (GstEncodingProfile *) gst_encoding_audio_profile_new (tmpcaps, NULL,
+ tmpcaps2, 1);
+ fail_unless (gst_encoding_container_profile_contains_profile (
+ (GstEncodingContainerProfile *) prof, sprof1));
+ gst_encoding_profile_unref (sprof1);
+ gst_caps_unref (tmpcaps);
+ gst_caps_unref (tmpcaps2);
+
+ GST_DEBUG ("Checking the container profile has the video//x-glitter stream");
+ tmpcaps = gst_caps_from_string ("video/x-glitter,sparkling=True");
+ tmpcaps2 =
+ gst_caps_from_string ("video/x-raw,width=640,height=480,framerate=15/1");
+ sprof2 = (GstEncodingProfile *)
+ gst_encoding_video_profile_new (tmpcaps, "seriously glittery", tmpcaps2,
+ 0);
+ gst_encoding_video_profile_set_variableframerate ((GstEncodingVideoProfile *)
+ sprof2, TRUE);
+ fail_unless (gst_encoding_container_profile_contains_profile (
+ (GstEncodingContainerProfile *) prof, sprof2));
+ gst_encoding_profile_unref (sprof2);
+ gst_caps_unref (tmpcaps);
+ gst_caps_unref (tmpcaps2);
+}
+
+GST_START_TEST (test_loading_profile)
+{
+ GstEncodingTarget *target;
+ gchar *profile_file_name;
+ GstEncodingProfile *profile;
+ GstCaps *tmpcaps;
+ GValue strvalue = { 0, };
+ GValue objectvalue = { 0, };
+
+ gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);
+
+ /* Test loading using short method and all arguments */
+ target = gst_encoding_target_load ("myponytarget", "herding", NULL);
+ fail_unless (target != NULL);
+ test_individual_target (target);
+ gst_encoding_target_unref (target);
+
+ /* Test loading using short method and no category */
+ target = gst_encoding_target_load ("myponytarget", NULL, NULL);
+ fail_unless (target != NULL);
+ test_individual_target (target);
+ gst_encoding_target_unref (target);
+
+ /* Test loading using fully specified path */
+ profile_file_name =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", "myponytarget.gep", NULL);
+
+ GST_DEBUG ("Loading target from '%s'", profile_file_name);
+ target = gst_encoding_target_load_from_file (profile_file_name, NULL);
+ g_free (profile_file_name);
+ fail_unless (target != NULL);
+ test_individual_target (target);
+ gst_encoding_target_unref (target);
+
+ /* Test getting the profiles directly
+ * First without category */
+ profile = gst_encoding_profile_find ("myponytarget", "pony", NULL);
+ fail_unless (profile != NULL);
+ tmpcaps = gst_caps_from_string ("animal/x-pony");
+ CHECK_PROFILE (profile, "pony", "I don't want a description !", tmpcaps, NULL,
+ 0, 0);
+ gst_caps_unref (tmpcaps);
+ gst_encoding_profile_unref (profile);
+
+ /* Then with a specific category */
+ profile = gst_encoding_profile_find ("myponytarget", "pony", "herding");
+ fail_unless (profile != NULL);
+ tmpcaps = gst_caps_from_string ("animal/x-pony");
+ CHECK_PROFILE (profile, "pony", "I don't want a description !", tmpcaps, NULL,
+ 0, 0);
+ gst_caps_unref (tmpcaps);
+ gst_encoding_profile_unref (profile);
+
+ /* For my next trick, I will need the assistance of a GValue */
+ g_value_init (&strvalue, G_TYPE_STRING);
+ g_value_init (&objectvalue, GST_TYPE_ENCODING_PROFILE);
+ g_value_set_static_string (&strvalue, "myponytarget/pony");
+ fail_unless (g_value_transform (&strvalue, &objectvalue));
+ profile = (GstEncodingProfile *) g_value_dup_object (&objectvalue);
+ fail_if (profile == NULL);
+ g_value_unset (&strvalue);
+ g_value_unset (&objectvalue);
+ tmpcaps = gst_caps_from_string ("animal/x-pony");
+ CHECK_PROFILE (profile, "pony", "I don't want a description !", tmpcaps, NULL,
+ 0, 0);
+ gst_caps_unref (tmpcaps);
+ gst_encoding_profile_unref (profile);
+
+ /* Let's go crazy for error detection */
+ fail_if (gst_encoding_profile_find ("myponytarget", "whales", NULL));
+ fail_if (gst_encoding_profile_find ("myponytarget", "whales", "herding"));
+ fail_if (gst_encoding_profile_find ("myponytarget", "", NULL));
+ fail_if (gst_encoding_profile_find ("", "pony", NULL));
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_target_list)
+{
+ GList *categories;
+ GList *targets;
+ GList *tmp;
+
+ /* Make sure we get our test category in the available categories */
+ categories = gst_encoding_list_available_categories ();
+ fail_if (categories == NULL);
+ fail_if (g_list_find_custom (categories, "herding",
+ (GCompareFunc) g_strcmp0) == NULL);
+ g_list_foreach (categories, (GFunc) g_free, NULL);
+ g_list_free (categories);
+
+ /* Try getting all available targets with a specified category */
+ targets = gst_encoding_list_all_targets ("herding");
+ fail_if (targets == NULL);
+ for (tmp = targets; tmp; tmp = tmp->next) {
+ GstEncodingTarget *target = (GstEncodingTarget *) tmp->data;
+ if (!g_strcmp0 (gst_encoding_target_get_name (target), "myponytarget"))
+ break;
+ }
+ /* If tmp is NULL, it means we iterated the whole list without finding
+ * our target */
+ fail_if (tmp == NULL);
+ g_list_foreach (targets, (GFunc) g_object_unref, NULL);
+ g_list_free (targets);
+
+ /* Try getting all available targets without a specified category */
+ targets = gst_encoding_list_all_targets (NULL);
+ fail_if (targets == NULL);
+ for (tmp = targets; tmp; tmp = tmp->next) {
+ GstEncodingTarget *target = (GstEncodingTarget *) tmp->data;
+ if (!g_strcmp0 (gst_encoding_target_get_name (target), "myponytarget"))
+ break;
+ }
+ /* If tmp is NULL, it means we iterated the whole list without finding
+ * our target */
+ fail_if (tmp == NULL);
+ g_list_foreach (targets, (GFunc) g_object_unref, NULL);
+ g_list_free (targets);
+}
+
+GST_END_TEST;
+
+
+static const gchar *profile_string = "\
+[GStreamer Encoding Target]\n\
+name=myponytarget\n\
+category=herding\n\
+description=Plenty of pony glitter profiles\n\
+\n\
+[profile-pony1]\n\
+name=pony\n\
+type=container\n\
+description=I don't want a description !\n\
+format=animal/x-pony\n\
+\n\
+[streamprofile-pony11]\n\
+parent=pony\n\
+type=audio\n\
+format=audio/x-pony-song,pretty=True\n\
+restriction=audio/x-raw,channels=1,rate=44100\n\
+presence=1\n\
+\n\
+[streamprofile-pony12]\n\
+parent=pony\n\
+type=video\n\
+preset=seriously glittery\n\
+format=video/x-glitter,sparkling=True\n\
+restriction=video/x-raw,width=640,height=480,framerate=15/1\n\
+presence=0\n\
+variableframerate=true\n\
+";
+
+static void
+remove_profile_file (void)
+{
+ gchar *profile_file_name;
+
+ profile_file_name =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", "myponytarget.gep", NULL);
+ g_unlink (profile_file_name);
+ g_free (profile_file_name);
+ profile_file_name =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", "myponytarget2.gep", NULL);
+ g_unlink (profile_file_name);
+ g_free (profile_file_name);
+}
+
+static void
+create_profile_file (void)
+{
+ gchar *profile_file_name;
+ gchar *profile_dir;
+ GError *error = NULL;
+
+ profile_dir =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", NULL);
+ profile_file_name =
+ g_build_filename (g_get_user_data_dir (), "gstreamer-0.11",
+ "encoding-profiles", "herding", "myponytarget.gep", NULL);
+ g_mkdir_with_parents (profile_dir, S_IRUSR | S_IWUSR | S_IXUSR);
+ if (!g_file_set_contents (profile_file_name, profile_string,
+ strlen (profile_string), &error))
+ GST_WARNING ("Couldn't write contents to file : %s", error->message);
+ g_free (profile_dir);
+ g_free (profile_file_name);
+}
+
+static void
+test_setup (void)
+{
+ create_profile_file ();
+}
+
+static void
+test_teardown (void)
+{
+ remove_profile_file ();
+}
+
+
+static Suite *
+profile_suite (void)
+{
+ Suite *s = suite_create ("profile support library");
+ TCase *tc_chain = tcase_create ("general");
+ gboolean can_write;
+ gchar *gst_dir;
+
+ /* cehck if we can create profiles */
+ gst_dir = g_build_filename (g_get_user_data_dir (), "gstreamer-0.11", NULL);
+ can_write = (g_access (gst_dir, R_OK | W_OK | X_OK) == 0);
+ g_free (gst_dir);
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_profile_creation);
+ tcase_add_test (tc_chain, test_profile_input_caps);
+ tcase_add_test (tc_chain, test_target_naming);
+ tcase_add_test (tc_chain, test_target_profile);
+ if (can_write) {
+ tcase_add_test (tc_chain, test_loading_profile);
+ tcase_add_test (tc_chain, test_saving_profile);
+ tcase_add_test (tc_chain, test_target_list);
+ }
+
+ tcase_add_unchecked_fixture (tc_chain, test_setup, test_teardown);
+
+ return s;
+}
+
+GST_CHECK_MAIN (profile);
diff --git a/tests/check/libs/rtp.c b/tests/check/libs/rtp.c
new file mode 100644
index 0000000..16603be
--- /dev/null
+++ b/tests/check/libs/rtp.c
@@ -0,0 +1,807 @@
+/* GStreamer unit tests for the RTP support library
+ *
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/rtp/gstrtpbuffer.h>
+#include <gst/rtp/gstrtcpbuffer.h>
+#include <string.h>
+
+#define RTP_HEADER_LEN 12
+
+GST_START_TEST (test_rtp_buffer)
+{
+ GstBuffer *buf;
+ guint8 *data;
+ gsize size;
+ GstRTPBuffer rtp = { NULL, };
+
+ /* check GstRTPHeader structure alignment and packing */
+ buf = gst_rtp_buffer_new_allocate (16, 4, 0);
+ fail_unless (buf != NULL);
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ fail_unless_equals_int (size, RTP_HEADER_LEN + 16 + 4);
+
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ /* check defaults */
+ fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 2);
+ fail_unless (gst_rtp_buffer_get_padding (&rtp) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 0);
+ fail_unless (gst_rtp_buffer_get_marker (&rtp) == FALSE);
+ fail_unless (gst_rtp_buffer_get_payload_type (&rtp) == 0);
+ fail_unless_equals_int (GST_READ_UINT16_BE (data), 0x8000);
+
+ /* check version in bitfield */
+ gst_rtp_buffer_set_version (&rtp, 3);
+ fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 3);
+ fail_unless_equals_int ((data[0] & 0xC0) >> 6, 3);
+ gst_rtp_buffer_set_version (&rtp, 2);
+ fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 2);
+ fail_unless_equals_int ((data[0] & 0xC0) >> 6, 2);
+
+ /* check padding bit */
+ gst_rtp_buffer_set_padding (&rtp, TRUE);
+ fail_unless (gst_rtp_buffer_get_padding (&rtp) == TRUE);
+ fail_unless_equals_int ((data[0] & 0x20) >> 5, 1);
+ gst_rtp_buffer_set_padding (&rtp, FALSE);
+ fail_unless (gst_rtp_buffer_get_padding (&rtp) == FALSE);
+ fail_unless_equals_int ((data[0] & 0x20) >> 5, 0);
+
+ /* check marker bit */
+ gst_rtp_buffer_set_marker (&rtp, TRUE);
+ fail_unless (gst_rtp_buffer_get_marker (&rtp) == TRUE);
+ fail_unless_equals_int ((data[1] & 0x80) >> 7, 1);
+ gst_rtp_buffer_set_marker (&rtp, FALSE);
+ fail_unless (gst_rtp_buffer_get_marker (&rtp) == FALSE);
+ fail_unless_equals_int ((data[1] & 0x80) >> 7, 0);
+
+ /* check sequence offset */
+ gst_rtp_buffer_set_seq (&rtp, 0xF2C9);
+ fail_unless_equals_int (gst_rtp_buffer_get_seq (&rtp), 0xF2C9);
+ fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0xF2C9);
+ gst_rtp_buffer_set_seq (&rtp, 0);
+ fail_unless_equals_int (gst_rtp_buffer_get_seq (&rtp), 0);
+ fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0);
+
+ /* check timestamp offset */
+ gst_rtp_buffer_set_timestamp (&rtp, 432191);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 432191);
+ fail_unless_equals_int (gst_rtp_buffer_get_timestamp (&rtp), 432191);
+ gst_rtp_buffer_set_timestamp (&rtp, 0);
+ fail_unless_equals_int (gst_rtp_buffer_get_timestamp (&rtp), 0);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 0);
+
+ /* check ssrc offset */
+ gst_rtp_buffer_set_ssrc (&rtp, 0xf04043C2);
+ fail_unless_equals_int (gst_rtp_buffer_get_ssrc (&rtp), (gint) 0xf04043c2);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), (gint) 0xf04043c2);
+ gst_rtp_buffer_set_ssrc (&rtp, 0);
+ fail_unless_equals_int (gst_rtp_buffer_get_ssrc (&rtp), 0);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), 0);
+
+ /* check csrc bits */
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 0);
+ ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (&rtp, 0));
+ fail_unless_equals_int (data[0] & 0xf, 0);
+
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+
+ /* and again, this time with CSRCs */
+ buf = gst_rtp_buffer_new_allocate (16, 4, 3);
+ fail_unless (buf != NULL);
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ fail_unless_equals_int (size, RTP_HEADER_LEN + 16 + 4 + 4 * 3);
+
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 3);
+ ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (&rtp, 3));
+ fail_unless_equals_int (data[0] & 0xf, 3);
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 0), 0);
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 1), 0);
+ fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 2), 0);
+
+ data += RTP_HEADER_LEN; /* skip the other header stuff */
+ gst_rtp_buffer_set_csrc (&rtp, 0, 0xf7c0);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 0 * 4), 0xf7c0);
+ gst_rtp_buffer_set_csrc (&rtp, 1, 0xf7c1);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 1 * 4), 0xf7c1);
+ gst_rtp_buffer_set_csrc (&rtp, 2, 0xf7c2);
+ fail_unless_equals_int (GST_READ_UINT32_BE (data + 2 * 4), 0xf7c2);
+ ASSERT_CRITICAL (gst_rtp_buffer_set_csrc (&rtp, 3, 0xf123));
+
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtp_buffer_validate_corrupt)
+{
+ GstBuffer *buf;
+ guint8 corrupt_rtp_packet[58] = {
+ 0x90, 0x7a, 0xbf, 0x28, 0x3a, 0x8a, 0x0a, 0xf4, 0x69, 0x6b, 0x76, 0xc0,
+ 0x21, 0xe0, 0xe0, 0x60, 0x81, 0x10, 0x84, 0x30, 0x21, 0x52, 0x06, 0xc2,
+ 0xb8, 0x30, 0x10, 0x4c, 0x08, 0x62, 0x67, 0xc2, 0x6e, 0x1a, 0x53, 0x3f,
+ 0xaf, 0xd6, 0x1b, 0x29, 0x40, 0xe0, 0xa5, 0x83, 0x01, 0x4b, 0x04, 0x02,
+ 0xb0, 0x97, 0x63, 0x08, 0x10, 0x4b, 0x43, 0x85, 0x37, 0x2c
+ };
+
+ buf = gst_buffer_new_and_alloc (sizeof (corrupt_rtp_packet));
+ gst_buffer_fill (buf, 0, corrupt_rtp_packet, sizeof (corrupt_rtp_packet));
+ fail_if (gst_rtp_buffer_validate (buf));
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+#if 0
+GST_START_TEST (test_rtp_buffer_list)
+{
+ GstBuffer *rtp_header;
+ GstBuffer *rtp_payload;
+ GstBufferList *list = NULL;
+ GstBufferListIterator *it;
+ guint i;
+
+ list = gst_buffer_list_new ();
+ it = gst_buffer_list_iterate (list);
+
+ /* Creating a list of two RTP packages */
+
+ /* Create first group to hold the rtp header and the payload */
+ gst_buffer_list_iterator_add_group (it);
+ rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
+ gst_buffer_list_iterator_add (it, rtp_header);
+ rtp_payload = gst_buffer_new_and_alloc (42);
+ gst_buffer_list_iterator_add (it, rtp_payload);
+
+ /* Create second group to hold an rtp header and a payload */
+ gst_buffer_list_iterator_add_group (it);
+ rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
+ gst_buffer_list_iterator_add (it, rtp_header);
+ rtp_payload = gst_buffer_new_and_alloc (42);
+ gst_buffer_list_iterator_add (it, rtp_payload);
+
+ gst_buffer_list_iterator_free (it);
+
+ /* Test SEQ number */
+ i = gst_rtp_buffer_list_set_seq (list, 1024);
+ fail_if (1026 != i);
+ fail_if (!gst_rtp_buffer_list_validate (list));
+
+ /* Timestamp */
+ gst_rtp_buffer_list_set_timestamp (list, 432191);
+ fail_unless_equals_int (gst_rtp_buffer_list_get_timestamp (list), 432191);
+
+ /* SSRC */
+ gst_rtp_buffer_list_set_ssrc (list, 0xf04043C2);
+ fail_unless_equals_int (gst_rtp_buffer_list_get_ssrc (list),
+ (gint) 0xf04043c2);
+
+ /* Payload type */
+ gst_rtp_buffer_list_set_payload_type (list, 127);
+ fail_unless_equals_int (gst_rtp_buffer_list_get_payload_type (list), 127);
+
+ gst_buffer_list_unref (list);
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (test_rtp_buffer_set_extension_data)
+{
+ GstBuffer *buf;
+ guint8 *data;
+ guint16 bits;
+ guint size;
+ guint8 misc_data[4] = { 1, 2, 3, 4 };
+ gpointer pointer;
+ guint8 appbits;
+ gsize bsize;
+ GstRTPBuffer rtp = { NULL, };
+
+ /* check GstRTPHeader structure alignment and packing */
+ buf = gst_rtp_buffer_new_allocate (4, 0, 0);
+ data = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ /* should be impossible to set the extension data */
+ ASSERT_WARNING (fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 0,
+ 4) == FALSE));
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
+
+ /* should be possible to set the extension data */
+ fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 270, 0) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == TRUE);
+ gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer, &size);
+ fail_unless (bits == 270);
+ fail_unless (size == 0);
+ fail_unless (pointer == data + 16);
+ pointer = gst_rtp_buffer_get_payload (&rtp);
+ fail_unless (pointer == data + 16);
+
+ gst_buffer_unmap (buf, data, bsize);
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unref (buf);
+
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ data = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
+ fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 333, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == TRUE);
+ gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer, &size);
+ fail_unless (bits == 333);
+ fail_unless (size == 2);
+ fail_unless (pointer == data + 16);
+ pointer = gst_rtp_buffer_get_payload (&rtp);
+ fail_unless (pointer == data + 24);
+
+ gst_buffer_unmap (buf, data, bsize);
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unref (buf);
+
+ /* Test header extensions with a one byte header */
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ data = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
+
+ fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 5,
+ misc_data, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer,
+ &size));
+ fail_unless (bits == 0xBEDE);
+ fail_unless (size == 1);
+ data = (guint8 *) pointer;
+ fail_unless (data[0] == ((5 << 4) | 1));
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 5,
+ misc_data, 4) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
+ 1, &pointer, &size) == FALSE);
+
+ fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 6,
+ misc_data, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 3, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 6,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ gst_buffer_unmap (buf, data, bsize);
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unref (buf);
+
+ /* Test header extensions with a two bytes header */
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ data = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
+ gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp);
+
+ fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
+
+ fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 5,
+ misc_data, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer,
+ &size));
+ fail_unless (bits == 0x100 << 4);
+ fail_unless (size == 1);
+ data = (guint8 *) pointer;
+ fail_unless (data[0] == 5);
+ fail_unless (data[1] == 2);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
+ 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 5,
+ misc_data, 4) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
+ 0, &pointer, &size) == FALSE);
+
+ fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 6,
+ misc_data, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
+ 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 6,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ gst_buffer_unmap (buf, data, bsize);
+ gst_rtp_buffer_unmap (&rtp);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+#if 0
+GST_START_TEST (test_rtp_buffer_list_set_extension)
+{
+ GstBufferList *list;
+ GstBuffer *buf;
+ guint8 *data;
+ guint16 bits;
+ guint size;
+ guint8 misc_data[4] = { 1, 2, 3, 4 };
+ gpointer pointer;
+ guint8 appbits;
+ GstBufferListIterator *it;
+
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ list = gst_rtp_buffer_list_from_buffer (buf);
+ gst_buffer_unref (buf);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf != NULL);
+ fail_unless (GST_BUFFER_SIZE (buf) == 12);
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf != NULL);
+ fail_unless (GST_BUFFER_SIZE (buf) == 20);
+ gst_buffer_list_iterator_free (it);
+
+ /* Test header extensions with a one byte header */
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
+ 1, &pointer, &size) == FALSE);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
+ misc_data, 2) == TRUE);
+ gst_buffer_list_iterator_free (it);
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
+ fail_unless (bits == 0xBEDE);
+ fail_unless (size == 1);
+ data = (guint8 *) pointer;
+ fail_unless (data[0] == ((5 << 4) | 1));
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
+ 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
+ misc_data, 4) == TRUE);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
+ 0, &pointer, &size) == FALSE);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 6,
+ misc_data, 2) == TRUE);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
+ 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 6,
+ 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
+ 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ gst_buffer_list_unref (list);
+
+
+ /* Test header extensions with a two bytes header */
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ list = gst_rtp_buffer_list_from_buffer (buf);
+ gst_buffer_unref (buf);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
+ misc_data, 2) == TRUE);
+ gst_buffer_list_iterator_free (it);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
+ fail_unless (bits == 0x100 << 4);
+ fail_unless (size == 1);
+ data = (guint8 *) pointer;
+ fail_unless (data[0] == 5);
+ fail_unless (data[1] == 2);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 2, 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
+ misc_data, 4) == TRUE);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 2, 0, &pointer, &size) == FALSE);
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 6,
+ misc_data, 2) == TRUE);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 1, &pointer, &size) == TRUE);
+ fail_unless (size == 4);
+ fail_unless (memcmp (pointer, misc_data, 4) == 0);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 2, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 2, 0, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 6, 1, &pointer, &size) == FALSE);
+ fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
+ &appbits, 5, 0, &pointer, &size) == TRUE);
+ fail_unless (size == 2);
+ fail_unless (memcmp (pointer, misc_data, 2) == 0);
+
+ gst_buffer_list_unref (list);
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (test_rtp_seqnum_compare)
+{
+#define ASSERT_COMP(a,b,c) fail_unless (gst_rtp_buffer_compare_seqnum ((guint16)a,(guint16)b) == c);
+ ASSERT_COMP (0xfffe, 0xfffd, -1);
+ ASSERT_COMP (0xffff, 0xfffe, -1);
+ ASSERT_COMP (0x0000, 0xffff, -1);
+ ASSERT_COMP (0x0001, 0x0000, -1);
+ ASSERT_COMP (0x0002, 0x0001, -1);
+
+ ASSERT_COMP (0xffff, 0xfffd, -2);
+ ASSERT_COMP (0x0000, 0xfffd, -3);
+ ASSERT_COMP (0x0001, 0xfffd, -4);
+ ASSERT_COMP (0x0002, 0xfffd, -5);
+
+ ASSERT_COMP (0x7ffe, 0x7ffd, -1);
+ ASSERT_COMP (0x7fff, 0x7ffe, -1);
+ ASSERT_COMP (0x8000, 0x7fff, -1);
+ ASSERT_COMP (0x8001, 0x8000, -1);
+ ASSERT_COMP (0x8002, 0x8001, -1);
+
+ ASSERT_COMP (0x7fff, 0x7ffd, -2);
+ ASSERT_COMP (0x8000, 0x7ffd, -3);
+ ASSERT_COMP (0x8001, 0x7ffd, -4);
+ ASSERT_COMP (0x8002, 0x7ffd, -5);
+
+ ASSERT_COMP (0x7ffd, 0xffff, -0x7ffe);
+ ASSERT_COMP (0x7ffe, 0x0000, -0x7ffe);
+ ASSERT_COMP (0x7fff, 0x0001, -0x7ffe);
+ ASSERT_COMP (0x7fff, 0x0000, -0x7fff);
+ ASSERT_COMP (0x8000, 0x0001, -0x7fff);
+ ASSERT_COMP (0x8001, 0x0002, -0x7fff);
+
+ ASSERT_COMP (0xfffd, 0x7ffe, -0x7fff);
+ ASSERT_COMP (0xfffe, 0x7fff, -0x7fff);
+ ASSERT_COMP (0xffff, 0x8000, -0x7fff);
+ ASSERT_COMP (0x0000, 0x8001, -0x7fff);
+ ASSERT_COMP (0x0001, 0x8002, -0x7fff);
+
+ ASSERT_COMP (0xfffe, 0x7ffe, -0x8000);
+ ASSERT_COMP (0xffff, 0x7fff, -0x8000);
+ ASSERT_COMP (0x0000, 0x8000, -0x8000);
+ ASSERT_COMP (0x0001, 0x8001, -0x8000);
+
+ ASSERT_COMP (0x7ffe, 0xfffe, -0x8000);
+ ASSERT_COMP (0x7fff, 0xffff, -0x8000);
+ ASSERT_COMP (0x8000, 0x0000, -0x8000);
+ ASSERT_COMP (0x8001, 0x0001, -0x8000);
+
+ ASSERT_COMP (0x0001, 0x0002, 1);
+ ASSERT_COMP (0x0000, 0x0001, 1);
+ ASSERT_COMP (0xffff, 0x0000, 1);
+ ASSERT_COMP (0xfffe, 0xffff, 1);
+ ASSERT_COMP (0xfffd, 0xfffe, 1);
+
+ ASSERT_COMP (0x0000, 0x0002, 2);
+ ASSERT_COMP (0xffff, 0x0002, 3);
+ ASSERT_COMP (0xfffe, 0x0002, 4);
+ ASSERT_COMP (0xfffd, 0x0002, 5);
+
+ ASSERT_COMP (0x8001, 0x8002, 1);
+ ASSERT_COMP (0x8000, 0x8001, 1);
+ ASSERT_COMP (0x7fff, 0x8000, 1);
+ ASSERT_COMP (0x7ffe, 0x7fff, 1);
+ ASSERT_COMP (0x7ffd, 0x7ffe, 1);
+
+ ASSERT_COMP (0x8000, 0x8002, 2);
+ ASSERT_COMP (0x7fff, 0x8002, 3);
+ ASSERT_COMP (0x7ffe, 0x8002, 4);
+ ASSERT_COMP (0x7ffd, 0x8002, 5);
+
+ ASSERT_COMP (0xfffe, 0x7ffd, 0x7fff);
+ ASSERT_COMP (0xffff, 0x7ffe, 0x7fff);
+ ASSERT_COMP (0x0000, 0x7fff, 0x7fff);
+ ASSERT_COMP (0x0001, 0x8000, 0x7fff);
+ ASSERT_COMP (0x0002, 0x8001, 0x7fff);
+
+ ASSERT_COMP (0x7ffe, 0xfffd, 0x7fff);
+ ASSERT_COMP (0x7fff, 0xfffe, 0x7fff);
+ ASSERT_COMP (0x8000, 0xffff, 0x7fff);
+ ASSERT_COMP (0x8001, 0x0000, 0x7fff);
+ ASSERT_COMP (0x8002, 0x0001, 0x7fff);
+#undef ASSERT_COMP
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtcp_buffer)
+{
+ GstBuffer *buf;
+ GstRTCPPacket packet;
+ GstRTCPBuffer rtcp = { NULL, };
+
+ buf = gst_rtcp_buffer_new (1400);
+ fail_unless (buf != NULL);
+ fail_unless_equals_int (gst_buffer_get_size (buf), 1400);
+
+ gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp);
+
+ fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
+ fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == FALSE);
+ fail_unless (gst_rtcp_buffer_get_packet_count (&rtcp) == 0);
+
+ /* add an SR packet */
+ fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SR,
+ &packet) == TRUE);
+
+ fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
+ fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
+
+ gst_rtcp_packet_sr_set_sender_info (&packet, 0x44556677,
+ G_GUINT64_CONSTANT (1), 0x11111111, 101, 123456);
+ {
+ guint32 ssrc;
+ guint64 ntptime;
+ guint32 rtptime;
+ guint32 packet_count;
+ guint32 octet_count;
+
+ gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime,
+ &packet_count, &octet_count);
+
+ fail_unless (ssrc == 0x44556677);
+ fail_unless (ntptime == G_GUINT64_CONSTANT (1));
+ fail_unless (rtptime == 0x11111111);
+ fail_unless (packet_count == 101);
+ fail_unless (octet_count == 123456);
+ }
+
+ /* go to first packet, this should be the packet we just added */
+ fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == TRUE);
+
+ fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
+ fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
+
+ fail_unless (gst_rtcp_packet_move_to_next (&packet) == FALSE);
+
+ /* add some SDES */
+ fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SDES,
+ &packet) == TRUE);
+ fail_unless (gst_rtcp_packet_sdes_add_item (&packet, 0xff658743) == TRUE);
+ fail_unless (gst_rtcp_packet_sdes_add_entry (&packet, GST_RTCP_SDES_CNAME,
+ sizeof ("test@foo.bar"), (guint8 *) "test@foo.bar") == TRUE);
+
+ /* add some BYE */
+ fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_BYE,
+ &packet) == TRUE);
+ fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x5613212f) == TRUE);
+ fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x00112233) == TRUE);
+ fail_unless (gst_rtcp_packet_bye_get_ssrc_count (&packet) == 2);
+
+ fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
+ fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
+ fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
+
+ /* move to SDES */
+ fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == TRUE);
+ fail_unless (gst_rtcp_packet_move_to_next (&packet) == TRUE);
+
+ fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_count (&packet) == 1);
+ fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SDES);
+ fail_unless (gst_rtcp_packet_get_length (&packet) == 5);
+
+ /* remove the SDES */
+ fail_unless (gst_rtcp_packet_remove (&packet) == TRUE);
+
+ /* we are now at the BYE packet */
+ fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
+ fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
+ fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
+ fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
+
+ /* close and validate */
+ gst_rtcp_buffer_unmap (&rtcp);
+ fail_unless (gst_rtcp_buffer_validate (buf) == TRUE);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+static Suite *
+rtp_suite (void)
+{
+ Suite *s = suite_create ("rtp support library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_rtp_buffer);
+ tcase_add_test (tc_chain, test_rtp_buffer_validate_corrupt);
+ tcase_add_test (tc_chain, test_rtp_buffer_set_extension_data);
+ //tcase_add_test (tc_chain, test_rtp_buffer_list_set_extension);
+ tcase_add_test (tc_chain, test_rtp_seqnum_compare);
+
+ tcase_add_test (tc_chain, test_rtcp_buffer);
+
+ //tcase_add_test (tc_chain, test_rtp_buffer_list);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = rtp_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/libs/rtsp.c b/tests/check/libs/rtsp.c
new file mode 100644
index 0000000..377f277
--- /dev/null
+++ b/tests/check/libs/rtsp.c
@@ -0,0 +1,153 @@
+/* GStreamer unit tests for the RTSP support library
+ *
+ * Copyright (C) 2010 Andy Wingo <wingo@oblong.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/rtsp/gstrtspurl.h>
+#include <string.h>
+
+GST_START_TEST (test_rtsp_url_basic)
+{
+ GstRTSPUrl *url = NULL;
+ GstRTSPResult res;
+
+ res = gst_rtsp_url_parse ("rtsp://localhost/foo/bar", &url);
+ fail_unless (res == GST_RTSP_OK);
+ fail_unless (url != NULL);
+ fail_unless (url->transports & GST_RTSP_LOWER_TRANS_TCP);
+ fail_unless (url->transports & GST_RTSP_LOWER_TRANS_UDP);
+ fail_unless (url->transports & GST_RTSP_LOWER_TRANS_UDP_MCAST);
+ fail_unless (url->family == GST_RTSP_FAM_INET);
+ fail_unless (!url->user);
+ fail_unless (!url->passwd);
+ fail_unless (!strcmp (url->host, "localhost"));
+ /* fail_unless (url->port == GST_RTSP_DEFAULT_PORT); */
+ fail_unless (!strcmp (url->abspath, "/foo/bar"));
+ fail_unless (!url->query);
+
+ gst_rtsp_url_free (url);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtsp_url_components_1)
+{
+ GstRTSPUrl *url = NULL;
+ GstRTSPResult res;
+ gchar **comps = NULL;
+
+ res = gst_rtsp_url_parse ("rtsp://localhost/foo/bar", &url);
+ fail_unless (res == GST_RTSP_OK);
+ fail_unless (url != NULL);
+
+ comps = gst_rtsp_url_decode_path_components (url);
+ fail_unless (comps != NULL);
+ fail_unless (g_strv_length (comps) == 3);
+ fail_unless (!strcmp (comps[0], ""));
+ fail_unless (!strcmp (comps[1], "foo"));
+ fail_unless (!strcmp (comps[2], "bar"));
+
+ g_strfreev (comps);
+ gst_rtsp_url_free (url);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtsp_url_components_2)
+{
+ GstRTSPUrl *url = NULL;
+ GstRTSPResult res;
+ gchar **comps = NULL;
+
+ res = gst_rtsp_url_parse ("rtsp://localhost/foo%2Fbar/qux%20baz", &url);
+ fail_unless (res == GST_RTSP_OK);
+ fail_unless (url != NULL);
+
+ comps = gst_rtsp_url_decode_path_components (url);
+ fail_unless (comps != NULL);
+ fail_unless (g_strv_length (comps) == 3);
+ fail_unless (!strcmp (comps[0], ""));
+ fail_unless (!strcmp (comps[1], "foo/bar"));
+ fail_unless (!strcmp (comps[2], "qux baz"));
+
+ g_strfreev (comps);
+ gst_rtsp_url_free (url);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_rtsp_url_components_3)
+{
+ GstRTSPUrl *url = NULL;
+ GstRTSPResult res;
+ gchar **comps = NULL;
+
+ res = gst_rtsp_url_parse ("rtsp://localhost/foo%00bar/qux%20baz", &url);
+ fail_unless (res == GST_RTSP_OK);
+ fail_unless (url != NULL);
+
+ comps = gst_rtsp_url_decode_path_components (url);
+ fail_unless (comps != NULL);
+ fail_unless (g_strv_length (comps) == 3);
+ fail_unless (!strcmp (comps[0], ""));
+ fail_unless (!strcmp (comps[1], "foo%00bar"));
+ fail_unless (!strcmp (comps[2], "qux baz"));
+
+ g_strfreev (comps);
+ gst_rtsp_url_free (url);
+}
+
+GST_END_TEST;
+
+static Suite *
+rtsp_suite (void)
+{
+ Suite *s = suite_create ("rtsp support library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_rtsp_url_basic);
+ tcase_add_test (tc_chain, test_rtsp_url_components_1);
+ tcase_add_test (tc_chain, test_rtsp_url_components_2);
+ tcase_add_test (tc_chain, test_rtsp_url_components_3);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = rtsp_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/libs/struct_arm.h b/tests/check/libs/struct_arm.h
new file mode 100644
index 0000000..1d90bdc
--- /dev/null
+++ b/tests/check/libs/struct_arm.h
@@ -0,0 +1,100 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAppBufferClass", sizeof (GstAppBufferClass), 16},
+ {"GstAppBuffer", sizeof (GstAppBuffer), 96},
+ {"GstAppSinkCallbacks", sizeof (GstAppSinkCallbacks), 28},
+ {"GstAppSinkClass", sizeof (GstAppSinkClass), 404},
+ {"GstAppSink", sizeof (GstAppSink), 432},
+ {"GstAppSrcCallbacks", sizeof (GstAppSrcCallbacks), 28},
+ {"GstAppSrcClass", sizeof (GstAppSrcClass), 412},
+ {"GstAppSrc", sizeof (GstAppSrc), 416},
+ {"GstAudioClockClass", sizeof (GstAudioClockClass), 192},
+ {"GstAudioClock", sizeof (GstAudioClock), 232},
+ {"GstAudioFilterClass", sizeof (GstAudioFilterClass), 396},
+ {"GstAudioFilter", sizeof (GstAudioFilter), 504},
+ {"GstAudioSinkClass", sizeof (GstAudioSinkClass), 432},
+ {"GstAudioSink", sizeof (GstAudioSink), 488},
+ {"GstAudioSrcClass", sizeof (GstAudioSrcClass), 460},
+ {"GstAudioSrc", sizeof (GstAudioSrc), 488},
+ {"GstBaseAudioSinkClass", sizeof (GstBaseAudioSinkClass), 388},
+ {"GstBaseAudioSink", sizeof (GstBaseAudioSink), 464},
+ {"GstBaseAudioSrcClass", sizeof (GstBaseAudioSrcClass), 416},
+ {"GstBaseAudioSrc", sizeof (GstBaseAudioSrc), 464},
+ {"GstBaseRTPAudioPayloadClass", sizeof (GstBaseRTPAudioPayloadClass), 288},
+ {"GstBaseRTPAudioPayload", sizeof (GstBaseRTPAudioPayload), 384},
+ {"GstBaseRTPDepayloadClass", sizeof (GstBaseRTPDepayloadClass), 280},
+ {"GstBaseRTPDepayload", sizeof (GstBaseRTPDepayload), 328},
+ {"GstBaseRTPPayloadClass", sizeof (GstBaseRTPPayloadClass), 272},
+ {"GstBaseRTPPayload", sizeof (GstBaseRTPPayload), 336},
+ {"GstCddaBaseSrcClass", sizeof (GstCddaBaseSrcClass), 432},
+ {"GstCddaBaseSrc", sizeof (GstCddaBaseSrc), 528},
+ {"GstCddaBaseSrcTrack", sizeof (GstCddaBaseSrcTrack), 36},
+ {"GstColorBalanceChannelClass", sizeof (GstColorBalanceChannelClass), 88},
+ {"GstColorBalanceChannel", sizeof (GstColorBalanceChannel), 24},
+ {"GstColorBalanceClass", sizeof (GstColorBalanceClass), 44},
+ {"GstDiscovererClass", sizeof (GstDiscovererClass), 96},
+ {"GstDiscoverer", sizeof (GstDiscoverer), 32},
+ {"GstFFTF32Complex", sizeof (GstFFTF32Complex), 8},
+ {"GstFFTF32", sizeof (GstFFTF32), 28},
+ {"GstFFTF64Complex", sizeof (GstFFTF64Complex), 16},
+ {"GstFFTF64", sizeof (GstFFTF64), 28},
+ {"GstFFTS16Complex", sizeof (GstFFTS16Complex), 4},
+ {"GstFFTS16", sizeof (GstFFTS16), 28},
+ {"GstFFTS32Complex", sizeof (GstFFTS32Complex), 8},
+ {"GstFFTS32", sizeof (GstFFTS32), 28},
+ {"GstMixerClass", sizeof (GstMixerClass), 72},
+ {"GstMixerOptionsClass", sizeof (GstMixerOptionsClass), 100},
+ {"GstMixerOptions", sizeof (GstMixerOptions), 52},
+ {"GstMixerTrackClass", sizeof (GstMixerTrackClass), 84},
+ {"GstMixerTrack", sizeof (GstMixerTrack), 32},
+ {"GstNavigationInterface", sizeof (GstNavigationInterface), 28},
+ {"GstNetAddress", sizeof (GstNetAddress), 40},
+ {"GstNetBufferClass", sizeof (GstNetBufferClass), 32},
+ {"GstNetBuffer", sizeof (GstNetBuffer), 184},
+ {"GstPropertyProbeInterface", sizeof (GstPropertyProbeInterface), 44},
+ {"gst_riff_acid", sizeof (gst_riff_acid), 24},
+ {"gst_riff_dmlh", sizeof (gst_riff_dmlh), 4},
+ {"gst_riff_index_entry", sizeof (gst_riff_index_entry), 16},
+ {"gst_riff_strf_auds", sizeof (gst_riff_strf_auds), 16},
+ {"gst_riff_strf_iavs", sizeof (gst_riff_strf_iavs), 32},
+ {"gst_riff_strf_vids", sizeof (gst_riff_strf_vids), 40},
+ {"gst_riff_strh", sizeof (gst_riff_strh), 48},
+ {"GstRingBufferClass", sizeof (GstRingBufferClass), 172},
+ {"GstRingBuffer", sizeof (GstRingBuffer), 232},
+ {"GstRingBufferSpec", sizeof (GstRingBufferSpec), 120},
+ {"GstRTCPPacket", sizeof (GstRTCPPacket), 36},
+ {"GstRTPPayloadInfo", sizeof (GstRTPPayloadInfo), 24},
+ {"GstRTSPExtensionInterface", sizeof (GstRTSPExtensionInterface), 60},
+ {"GstRTSPMessage", sizeof (GstRTSPMessage), 28},
+ {"GstRTSPRange", sizeof (GstRTSPRange), 8},
+ {"GstRTSPTime", sizeof (GstRTSPTime), 16},
+ {"GstRTSPTimeRange", sizeof (GstRTSPTimeRange), 40},
+ {"GstRTSPTransport", sizeof (GstRTSPTransport), 76},
+ {"GstRTSPUrl", sizeof (GstRTSPUrl), 32},
+ {"GstRTSPWatchFuncs", sizeof (GstRTSPWatchFuncs), 40},
+ {"GstSDPAttribute", sizeof (GstSDPAttribute), 8},
+ {"GstSDPBandwidth", sizeof (GstSDPBandwidth), 8},
+ {"GstSDPConnection", sizeof (GstSDPConnection), 20},
+ {"GstSDPKey", sizeof (GstSDPKey), 8},
+ {"GstSDPMedia", sizeof (GstSDPMedia), 44},
+ {"GstSDPMessage", sizeof (GstSDPMessage), 96},
+ {"GstSDPOrigin", sizeof (GstSDPOrigin), 24},
+ {"GstSDPTime", sizeof (GstSDPTime), 12},
+ {"GstSDPZone", sizeof (GstSDPZone), 8},
+ {"GstStreamVolumeInterface", sizeof (GstStreamVolumeInterface), 24},
+ {"GstTagDemuxClass", sizeof (GstTagDemuxClass), 284},
+ {"GstTagDemux", sizeof (GstTagDemux), 160},
+ {"GstTunerChannelClass", sizeof (GstTunerChannelClass), 92},
+ {"GstTunerChannel", sizeof (GstTunerChannel), 40},
+ {"GstTunerClass", sizeof (GstTunerClass), 76},
+ {"GstTunerNormClass", sizeof (GstTunerNormClass), 84},
+ {"GstTunerNorm", sizeof (GstTunerNorm), 40},
+ {"GstVideoFilterClass", sizeof (GstVideoFilterClass), 376},
+ {"GstVideoFilter", sizeof (GstVideoFilter), 376},
+ {"GstVideoOrientationInterface", sizeof (GstVideoOrientationInterface), 56},
+ {"GstVideoRectangle", sizeof (GstVideoRectangle), 16},
+ {"GstVideoSinkClass", sizeof (GstVideoSinkClass), 384},
+ {"GstVideoSink", sizeof (GstVideoSink), 432},
+ {"GstXOverlayClass", sizeof (GstXOverlayClass), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_i386.h b/tests/check/libs/struct_i386.h
new file mode 100644
index 0000000..bbedd28
--- /dev/null
+++ b/tests/check/libs/struct_i386.h
@@ -0,0 +1,96 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAppSinkCallbacks", sizeof (GstAppSinkCallbacks), 28},
+ {"GstAppSinkClass", sizeof (GstAppSinkClass), 404},
+ {"GstAppSink", sizeof (GstAppSink), 404},
+ {"GstAppSrcCallbacks", sizeof (GstAppSrcCallbacks), 28},
+ {"GstAppSrcClass", sizeof (GstAppSrcClass), 412},
+ {"GstAppSrc", sizeof (GstAppSrc), 396},
+ {"GstAudioClockClass", sizeof (GstAudioClockClass), 192},
+ {"GstAudioClock", sizeof (GstAudioClock), 228},
+ {"GstAudioFilterClass", sizeof (GstAudioFilterClass), 396},
+ {"GstAudioFilter", sizeof (GstAudioFilter), 480},
+ {"GstAudioSinkClass", sizeof (GstAudioSinkClass), 432},
+ {"GstAudioSink", sizeof (GstAudioSink), 456},
+ {"GstAudioSrcClass", sizeof (GstAudioSrcClass), 460},
+ {"GstAudioSrc", sizeof (GstAudioSrc), 460},
+ {"GstBaseAudioSinkClass", sizeof (GstBaseAudioSinkClass), 388},
+ {"GstBaseAudioSink", sizeof (GstBaseAudioSink), 436},
+ {"GstBaseAudioSrcClass", sizeof (GstBaseAudioSrcClass), 416},
+ {"GstBaseAudioSrc", sizeof (GstBaseAudioSrc), 440},
+ {"GstBaseRTPAudioPayloadClass", sizeof (GstBaseRTPAudioPayloadClass), 288},
+ {"GstBaseRTPAudioPayload", sizeof (GstBaseRTPAudioPayload), 364},
+ {"GstBaseRTPDepayloadClass", sizeof (GstBaseRTPDepayloadClass), 280},
+ {"GstBaseRTPDepayload", sizeof (GstBaseRTPDepayload), 304},
+ {"GstBaseRTPPayloadClass", sizeof (GstBaseRTPPayloadClass), 272},
+ {"GstBaseRTPPayload", sizeof (GstBaseRTPPayload), 324},
+ {"GstCddaBaseSrcClass", sizeof (GstCddaBaseSrcClass), 432},
+ {"GstCddaBaseSrc", sizeof (GstCddaBaseSrc), 508},
+ {"GstCddaBaseSrcTrack", sizeof (GstCddaBaseSrcTrack), 36},
+ {"GstColorBalanceChannelClass", sizeof (GstColorBalanceChannelClass), 88},
+ {"GstColorBalanceChannel", sizeof (GstColorBalanceChannel), 24},
+ {"GstColorBalanceClass", sizeof (GstColorBalanceClass), 44},
+ {"GstDiscovererClass", sizeof (GstDiscovererClass), 96},
+ {"GstDiscoverer", sizeof (GstDiscoverer), 32},
+ {"GstFFTF32Complex", sizeof (GstFFTF32Complex), 8},
+ {"GstFFTF32", sizeof (GstFFTF32), 28},
+ {"GstFFTF64Complex", sizeof (GstFFTF64Complex), 16},
+ {"GstFFTF64", sizeof (GstFFTF64), 28},
+ {"GstFFTS16Complex", sizeof (GstFFTS16Complex), 4},
+ {"GstFFTS16", sizeof (GstFFTS16), 28},
+ {"GstFFTS32Complex", sizeof (GstFFTS32Complex), 8},
+ {"GstFFTS32", sizeof (GstFFTS32), 28},
+ {"GstMixerClass", sizeof (GstMixerClass), 72},
+ {"GstMixerOptionsClass", sizeof (GstMixerOptionsClass), 100},
+ {"GstMixerOptions", sizeof (GstMixerOptions), 52},
+ {"GstMixerTrackClass", sizeof (GstMixerTrackClass), 84},
+ {"GstMixerTrack", sizeof (GstMixerTrack), 32},
+ {"GstNavigationInterface", sizeof (GstNavigationInterface), 28},
+ {"GstNetAddress", sizeof (GstNetAddress), 40},
+ {"GstPropertyProbeInterface", sizeof (GstPropertyProbeInterface), 44},
+ {"gst_riff_acid", sizeof (gst_riff_acid), 24},
+ {"gst_riff_dmlh", sizeof (gst_riff_dmlh), 4},
+ {"gst_riff_index_entry", sizeof (gst_riff_index_entry), 16},
+ {"gst_riff_strf_auds", sizeof (gst_riff_strf_auds), 16},
+ {"gst_riff_strf_iavs", sizeof (gst_riff_strf_iavs), 32},
+ {"gst_riff_strf_vids", sizeof (gst_riff_strf_vids), 40},
+ {"gst_riff_strh", sizeof (gst_riff_strh), 48},
+ {"GstRingBufferClass", sizeof (GstRingBufferClass), 172},
+ {"GstRingBuffer", sizeof (GstRingBuffer), 220},
+ {"GstRingBufferSpec", sizeof (GstRingBufferSpec), 112},
+ {"GstRTCPPacket", sizeof (GstRTCPPacket), 36},
+ {"GstRTPPayloadInfo", sizeof (GstRTPPayloadInfo), 24},
+ {"GstRTSPExtensionInterface", sizeof (GstRTSPExtensionInterface), 60},
+ {"GstRTSPMessage", sizeof (GstRTSPMessage), 28},
+ {"GstRTSPRange", sizeof (GstRTSPRange), 8},
+ {"GstRTSPTime", sizeof (GstRTSPTime), 12},
+ {"GstRTSPTimeRange", sizeof (GstRTSPTimeRange), 28},
+ {"GstRTSPTransport", sizeof (GstRTSPTransport), 76},
+ {"GstRTSPUrl", sizeof (GstRTSPUrl), 32},
+ {"GstRTSPWatchFuncs", sizeof (GstRTSPWatchFuncs), 40},
+ {"GstSDPAttribute", sizeof (GstSDPAttribute), 8},
+ {"GstSDPBandwidth", sizeof (GstSDPBandwidth), 8},
+ {"GstSDPConnection", sizeof (GstSDPConnection), 20},
+ {"GstSDPKey", sizeof (GstSDPKey), 8},
+ {"GstSDPMedia", sizeof (GstSDPMedia), 44},
+ {"GstSDPMessage", sizeof (GstSDPMessage), 96},
+ {"GstSDPOrigin", sizeof (GstSDPOrigin), 24},
+ {"GstSDPTime", sizeof (GstSDPTime), 12},
+ {"GstSDPZone", sizeof (GstSDPZone), 8},
+ {"GstStreamVolumeInterface", sizeof (GstStreamVolumeInterface), 24},
+ {"GstTagDemuxClass", sizeof (GstTagDemuxClass), 284},
+ {"GstTagDemux", sizeof (GstTagDemux), 148},
+ {"GstTunerChannelClass", sizeof (GstTunerChannelClass), 92},
+ {"GstTunerChannel", sizeof (GstTunerChannel), 40},
+ {"GstTunerClass", sizeof (GstTunerClass), 76},
+ {"GstTunerNormClass", sizeof (GstTunerNormClass), 84},
+ {"GstTunerNorm", sizeof (GstTunerNorm), 36},
+ {"GstVideoFilterClass", sizeof (GstVideoFilterClass), 376},
+ {"GstVideoFilter", sizeof (GstVideoFilter), 356},
+ {"GstVideoOrientationInterface", sizeof (GstVideoOrientationInterface), 56},
+ {"GstVideoRectangle", sizeof (GstVideoRectangle), 16},
+ {"GstVideoSinkClass", sizeof (GstVideoSinkClass), 384},
+ {"GstVideoSink", sizeof (GstVideoSink), 408},
+ {"GstXOverlayClass", sizeof (GstXOverlayClass), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_i386_osx.h b/tests/check/libs/struct_i386_osx.h
new file mode 100644
index 0000000..1714aec
--- /dev/null
+++ b/tests/check/libs/struct_i386_osx.h
@@ -0,0 +1,100 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAppBufferClass", sizeof (GstAppBufferClass), 16},
+ {"GstAppBuffer", sizeof (GstAppBuffer), 88},
+ {"GstAppSinkCallbacks", sizeof (GstAppSinkCallbacks), 28},
+ {"GstAppSinkClass", sizeof (GstAppSinkClass), 404},
+ {"GstAppSink", sizeof (GstAppSink), 404},
+ {"GstAppSrcCallbacks", sizeof (GstAppSrcCallbacks), 28},
+ {"GstAppSrcClass", sizeof (GstAppSrcClass), 412},
+ {"GstAppSrc", sizeof (GstAppSrc), 396},
+ {"GstAudioClockClass", sizeof (GstAudioClockClass), 192},
+ {"GstAudioClock", sizeof (GstAudioClock), 228},
+ {"GstAudioFilterClass", sizeof (GstAudioFilterClass), 396},
+ {"GstAudioFilter", sizeof (GstAudioFilter), 480},
+ {"GstAudioSinkClass", sizeof (GstAudioSinkClass), 432},
+ {"GstAudioSink", sizeof (GstAudioSink), 456},
+ {"GstAudioSrcClass", sizeof (GstAudioSrcClass), 460},
+ {"GstAudioSrc", sizeof (GstAudioSrc), 460},
+ {"GstBaseAudioSinkClass", sizeof (GstBaseAudioSinkClass), 388},
+ {"GstBaseAudioSink", sizeof (GstBaseAudioSink), 436},
+ {"GstBaseAudioSrcClass", sizeof (GstBaseAudioSrcClass), 416},
+ {"GstBaseAudioSrc", sizeof (GstBaseAudioSrc), 440},
+ {"GstBaseRTPAudioPayloadClass", sizeof (GstBaseRTPAudioPayloadClass), 288},
+ {"GstBaseRTPAudioPayload", sizeof (GstBaseRTPAudioPayload), 364},
+ {"GstBaseRTPDepayloadClass", sizeof (GstBaseRTPDepayloadClass), 280},
+ {"GstBaseRTPDepayload", sizeof (GstBaseRTPDepayload), 324},
+ {"GstBaseRTPPayloadClass", sizeof (GstBaseRTPPayloadClass), 272},
+ {"GstBaseRTPPayload", sizeof (GstBaseRTPPayload), 324},
+ {"GstCddaBaseSrcClass", sizeof (GstCddaBaseSrcClass), 432},
+ {"GstCddaBaseSrc", sizeof (GstCddaBaseSrc), 508},
+ {"GstCddaBaseSrcTrack", sizeof (GstCddaBaseSrcTrack), 36},
+ {"GstColorBalanceChannelClass", sizeof (GstColorBalanceChannelClass), 88},
+ {"GstColorBalanceChannel", sizeof (GstColorBalanceChannel), 24},
+ {"GstColorBalanceClass", sizeof (GstColorBalanceClass), 44},
+ {"GstDiscovererClass", sizeof (GstDiscovererClass), 96},
+ {"GstDiscoverer", sizeof (GstDiscoverer), 32},
+ {"GstFFTF32Complex", sizeof (GstFFTF32Complex), 8},
+ {"GstFFTF32", sizeof (GstFFTF32), 28},
+ {"GstFFTF64Complex", sizeof (GstFFTF64Complex), 16},
+ {"GstFFTF64", sizeof (GstFFTF64), 28},
+ {"GstFFTS16Complex", sizeof (GstFFTS16Complex), 4},
+ {"GstFFTS16", sizeof (GstFFTS16), 28},
+ {"GstFFTS32Complex", sizeof (GstFFTS32Complex), 8},
+ {"GstFFTS32", sizeof (GstFFTS32), 28},
+ {"GstMixerClass", sizeof (GstMixerClass), 72},
+ {"GstMixerOptionsClass", sizeof (GstMixerOptionsClass), 100},
+ {"GstMixerOptions", sizeof (GstMixerOptions), 52},
+ {"GstMixerTrackClass", sizeof (GstMixerTrackClass), 84},
+ {"GstMixerTrack", sizeof (GstMixerTrack), 32},
+ {"GstNavigationInterface", sizeof (GstNavigationInterface), 28},
+ {"GstNetAddress", sizeof (GstNetAddress), 40},
+ {"GstNetBufferClass", sizeof (GstNetBufferClass), 32},
+ {"GstNetBuffer", sizeof (GstNetBuffer), 176},
+ {"GstPropertyProbeInterface", sizeof (GstPropertyProbeInterface), 44},
+ {"gst_riff_acid", sizeof (gst_riff_acid), 24},
+ {"gst_riff_dmlh", sizeof (gst_riff_dmlh), 4},
+ {"gst_riff_index_entry", sizeof (gst_riff_index_entry), 16},
+ {"gst_riff_strf_auds", sizeof (gst_riff_strf_auds), 16},
+ {"gst_riff_strf_iavs", sizeof (gst_riff_strf_iavs), 32},
+ {"gst_riff_strf_vids", sizeof (gst_riff_strf_vids), 40},
+ {"gst_riff_strh", sizeof (gst_riff_strh), 48},
+ {"GstRingBufferClass", sizeof (GstRingBufferClass), 172},
+ {"GstRingBuffer", sizeof (GstRingBuffer), 220},
+ {"GstRingBufferSpec", sizeof (GstRingBufferSpec), 112},
+ {"GstRTCPPacket", sizeof (GstRTCPPacket), 36},
+ {"GstRTPPayloadInfo", sizeof (GstRTPPayloadInfo), 24},
+ {"GstRTSPExtensionInterface", sizeof (GstRTSPExtensionInterface), 60},
+ {"GstRTSPMessage", sizeof (GstRTSPMessage), 28},
+ {"GstRTSPRange", sizeof (GstRTSPRange), 8},
+ {"GstRTSPTime", sizeof (GstRTSPTime), 12},
+ {"GstRTSPTimeRange", sizeof (GstRTSPTimeRange), 28},
+ {"GstRTSPTransport", sizeof (GstRTSPTransport), 76},
+ {"GstRTSPUrl", sizeof (GstRTSPUrl), 32},
+ {"GstRTSPWatchFuncs", sizeof (GstRTSPWatchFuncs), 40},
+ {"GstSDPAttribute", sizeof (GstSDPAttribute), 8},
+ {"GstSDPBandwidth", sizeof (GstSDPBandwidth), 8},
+ {"GstSDPConnection", sizeof (GstSDPConnection), 20},
+ {"GstSDPKey", sizeof (GstSDPKey), 8},
+ {"GstSDPMedia", sizeof (GstSDPMedia), 44},
+ {"GstSDPMessage", sizeof (GstSDPMessage), 96},
+ {"GstSDPOrigin", sizeof (GstSDPOrigin), 24},
+ {"GstSDPTime", sizeof (GstSDPTime), 12},
+ {"GstSDPZone", sizeof (GstSDPZone), 8},
+ {"GstStreamVolumeInterface", sizeof (GstStreamVolumeInterface), 24},
+ {"GstTagDemuxClass", sizeof (GstTagDemuxClass), 284},
+ {"GstTagDemux", sizeof (GstTagDemux), 148},
+ {"GstTunerChannelClass", sizeof (GstTunerChannelClass), 92},
+ {"GstTunerChannel", sizeof (GstTunerChannel), 40},
+ {"GstTunerClass", sizeof (GstTunerClass), 76},
+ {"GstTunerNormClass", sizeof (GstTunerNormClass), 84},
+ {"GstTunerNorm", sizeof (GstTunerNorm), 36},
+ {"GstVideoFilterClass", sizeof (GstVideoFilterClass), 376},
+ {"GstVideoFilter", sizeof (GstVideoFilter), 356},
+ {"GstVideoOrientationInterface", sizeof (GstVideoOrientationInterface), 56},
+ {"GstVideoRectangle", sizeof (GstVideoRectangle), 16},
+ {"GstVideoSinkClass", sizeof (GstVideoSinkClass), 384},
+ {"GstVideoSink", sizeof (GstVideoSink), 408},
+ {"GstXOverlayClass", sizeof (GstXOverlayClass), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_x86_64.h b/tests/check/libs/struct_x86_64.h
new file mode 100644
index 0000000..9f18dfb
--- /dev/null
+++ b/tests/check/libs/struct_x86_64.h
@@ -0,0 +1,96 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAppSinkCallbacks", sizeof (GstAppSinkCallbacks), 56},
+ {"GstAppSinkClass", sizeof (GstAppSinkClass), 800},
+ {"GstAppSink", sizeof (GstAppSink), 640},
+ {"GstAppSrcCallbacks", sizeof (GstAppSrcCallbacks), 56},
+ {"GstAppSrcClass", sizeof (GstAppSrcClass), 816},
+ {"GstAppSrc", sizeof (GstAppSrc), 640},
+ {"GstAudioClockClass", sizeof (GstAudioClockClass), 384},
+ {"GstAudioClock", sizeof (GstAudioClock), 344},
+ {"GstAudioFilterClass", sizeof (GstAudioFilterClass), 784},
+ {"GstAudioFilter", sizeof (GstAudioFilter), 744},
+ {"GstAudioSinkClass", sizeof (GstAudioSinkClass), 856},
+ {"GstAudioSink", sizeof (GstAudioSink), 720},
+ {"GstAudioSrcClass", sizeof (GstAudioSrcClass), 912},
+ {"GstAudioSrc", sizeof (GstAudioSrc), 744},
+ {"GstBaseAudioSinkClass", sizeof (GstBaseAudioSinkClass), 768},
+ {"GstBaseAudioSink", sizeof (GstBaseAudioSink), 680},
+ {"GstBaseAudioSrcClass", sizeof (GstBaseAudioSrcClass), 824},
+ {"GstBaseAudioSrc", sizeof (GstBaseAudioSrc), 704},
+ {"GstBaseRTPAudioPayloadClass", sizeof (GstBaseRTPAudioPayloadClass), 568},
+ {"GstBaseRTPAudioPayload", sizeof (GstBaseRTPAudioPayload), 544},
+ {"GstBaseRTPDepayloadClass", sizeof (GstBaseRTPDepayloadClass), 552},
+ {"GstBaseRTPDepayload", sizeof (GstBaseRTPDepayload), 488},
+ {"GstBaseRTPPayloadClass", sizeof (GstBaseRTPPayloadClass), 536},
+ {"GstBaseRTPPayload", sizeof (GstBaseRTPPayload), 480},
+ {"GstCddaBaseSrcClass", sizeof (GstCddaBaseSrcClass), 856},
+ {"GstCddaBaseSrc", sizeof (GstCddaBaseSrc), 792},
+ {"GstCddaBaseSrcTrack", sizeof (GstCddaBaseSrcTrack), 48},
+ {"GstColorBalanceChannelClass", sizeof (GstColorBalanceChannelClass), 176},
+ {"GstColorBalanceChannel", sizeof (GstColorBalanceChannel), 40},
+ {"GstColorBalanceClass", sizeof (GstColorBalanceClass), 88},
+ {"GstDiscovererClass", sizeof (GstDiscovererClass), 192},
+ {"GstDiscoverer", sizeof (GstDiscoverer), 64},
+ {"GstFFTF32Complex", sizeof (GstFFTF32Complex), 8},
+ {"GstFFTF32", sizeof (GstFFTF32), 48},
+ {"GstFFTF64Complex", sizeof (GstFFTF64Complex), 16},
+ {"GstFFTF64", sizeof (GstFFTF64), 48},
+ {"GstFFTS16Complex", sizeof (GstFFTS16Complex), 4},
+ {"GstFFTS16", sizeof (GstFFTS16), 48},
+ {"GstFFTS32Complex", sizeof (GstFFTS32Complex), 8},
+ {"GstFFTS32", sizeof (GstFFTS32), 48},
+ {"GstMixerClass", sizeof (GstMixerClass), 144},
+ {"GstMixerOptionsClass", sizeof (GstMixerOptionsClass), 200},
+ {"GstMixerOptions", sizeof (GstMixerOptions), 88},
+ {"GstMixerTrackClass", sizeof (GstMixerTrackClass), 168},
+ {"GstMixerTrack", sizeof (GstMixerTrack), 48},
+ {"GstNavigationInterface", sizeof (GstNavigationInterface), 56},
+ {"GstNetAddress", sizeof (GstNetAddress), 56},
+ {"GstPropertyProbeInterface", sizeof (GstPropertyProbeInterface), 88},
+ {"gst_riff_acid", sizeof (gst_riff_acid), 24},
+ {"gst_riff_dmlh", sizeof (gst_riff_dmlh), 4},
+ {"gst_riff_index_entry", sizeof (gst_riff_index_entry), 16},
+ {"gst_riff_strf_auds", sizeof (gst_riff_strf_auds), 16},
+ {"gst_riff_strf_iavs", sizeof (gst_riff_strf_iavs), 32},
+ {"gst_riff_strf_vids", sizeof (gst_riff_strf_vids), 40},
+ {"gst_riff_strh", sizeof (gst_riff_strh), 48},
+ {"GstRingBufferClass", sizeof (GstRingBufferClass), 344},
+ {"GstRingBuffer", sizeof (GstRingBuffer), 328},
+ {"GstRingBufferSpec", sizeof (GstRingBufferSpec), 136},
+ {"GstRTCPPacket", sizeof (GstRTCPPacket), 40},
+ {"GstRTPPayloadInfo", sizeof (GstRTPPayloadInfo), 48},
+ {"GstRTSPExtensionInterface", sizeof (GstRTSPExtensionInterface), 120},
+ {"GstRTSPMessage", sizeof (GstRTSPMessage), 56},
+ {"GstRTSPRange", sizeof (GstRTSPRange), 8},
+ {"GstRTSPTime", sizeof (GstRTSPTime), 16},
+ {"GstRTSPTimeRange", sizeof (GstRTSPTimeRange), 40},
+ {"GstRTSPTransport", sizeof (GstRTSPTransport), 88},
+ {"GstRTSPUrl", sizeof (GstRTSPUrl), 56},
+ {"GstRTSPWatchFuncs", sizeof (GstRTSPWatchFuncs), 80},
+ {"GstSDPAttribute", sizeof (GstSDPAttribute), 16},
+ {"GstSDPBandwidth", sizeof (GstSDPBandwidth), 16},
+ {"GstSDPConnection", sizeof (GstSDPConnection), 32},
+ {"GstSDPKey", sizeof (GstSDPKey), 16},
+ {"GstSDPMedia", sizeof (GstSDPMedia), 80},
+ {"GstSDPMessage", sizeof (GstSDPMessage), 184},
+ {"GstSDPOrigin", sizeof (GstSDPOrigin), 48},
+ {"GstSDPTime", sizeof (GstSDPTime), 24},
+ {"GstSDPZone", sizeof (GstSDPZone), 16},
+ {"GstStreamVolumeInterface", sizeof (GstStreamVolumeInterface), 48},
+ {"GstTagDemuxClass", sizeof (GstTagDemuxClass), 552},
+ {"GstTagDemux", sizeof (GstTagDemux), 272},
+ {"GstTunerChannelClass", sizeof (GstTunerChannelClass), 184},
+ {"GstTunerChannel", sizeof (GstTunerChannel), 64},
+ {"GstTunerClass", sizeof (GstTunerClass), 152},
+ {"GstTunerNormClass", sizeof (GstTunerNormClass), 168},
+ {"GstTunerNorm", sizeof (GstTunerNorm), 56},
+ {"GstVideoFilterClass", sizeof (GstVideoFilterClass), 744},
+ {"GstVideoFilter", sizeof (GstVideoFilter), 584},
+ {"GstVideoOrientationInterface", sizeof (GstVideoOrientationInterface), 112},
+ {"GstVideoRectangle", sizeof (GstVideoRectangle), 16},
+ {"GstVideoSinkClass", sizeof (GstVideoSinkClass), 760},
+ {"GstVideoSink", sizeof (GstVideoSink), 640},
+ {"GstVideoOverlayIface", sizeof (GstVideoOverlayIface), 64},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/tag.c b/tests/check/libs/tag.c
new file mode 100644
index 0000000..8dfd793
--- /dev/null
+++ b/tests/check/libs/tag.c
@@ -0,0 +1,1871 @@
+/* GStreamer
+ *
+ * unit tests for the tag support library
+ *
+ * Copyright (C) 2006-2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/tag/tag.h>
+#include <gst/base/gstbytewriter.h>
+#include <string.h>
+#include <locale.h>
+
+GST_START_TEST (test_parse_extended_comment)
+{
+ gchar *key, *val, *lang;
+
+ /* first check the g_return_val_if_fail conditions */
+ ASSERT_CRITICAL (gst_tag_parse_extended_comment (NULL, NULL, NULL, NULL,
+ FALSE));
+ ASSERT_CRITICAL (gst_tag_parse_extended_comment ("\377\000", NULL, NULL, NULL,
+ FALSE));
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("a=b", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key != NULL);
+ fail_unless (lang == NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (key, "a");
+ fail_unless_equals_string (val, "b");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("a[l]=b", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key != NULL);
+ fail_unless (lang != NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (key, "a");
+ fail_unless_equals_string (lang, "l");
+ fail_unless_equals_string (val, "b");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("foo=bar", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key != NULL);
+ fail_unless (lang == NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (key, "foo");
+ fail_unless_equals_string (val, "bar");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key != NULL);
+ fail_unless (lang != NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (key, "foo");
+ fail_unless_equals_string (lang, "fr");
+ fail_unless_equals_string (val, "bar");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("foo=[fr]bar", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key != NULL);
+ fail_unless (lang == NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (key, "foo");
+ fail_unless_equals_string (val, "[fr]bar");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+
+ /* test NULL for output locations */
+ fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL,
+ FALSE) == TRUE);
+
+ /* test strict mode (key must be specified) */
+ fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL,
+ TRUE) == TRUE);
+ fail_unless (gst_tag_parse_extended_comment ("foo=bar", NULL, NULL, NULL,
+ TRUE) == TRUE);
+ fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL,
+ TRUE) == FALSE);
+
+ /* test non-strict mode (if there's no key, that's fine too) */
+ fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL,
+ FALSE) == TRUE);
+ fail_unless (gst_tag_parse_extended_comment ("[fr]bar", NULL, NULL, NULL,
+ FALSE) == TRUE);
+
+ key = val = lang = NULL;
+ fail_unless (gst_tag_parse_extended_comment ("[fr]bar", &key, &lang, &val,
+ FALSE) == TRUE);
+ fail_unless (key == NULL);
+ fail_unless (lang == NULL);
+ fail_unless (val != NULL);
+ fail_unless_equals_string (val, "[fr]bar");
+ g_free (key);
+ g_free (lang);
+ g_free (val);
+}
+
+GST_END_TEST;
+
+#define ASSERT_TAG_LIST_HAS_STRING(list,field,string) \
+ { \
+ gboolean got_match = FALSE; \
+ guint i, size; \
+ \
+ fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
+ size = gst_tag_list_get_tag_size (list,field); \
+ for (i = 0; i < size; ++i) { \
+ gchar *___s = NULL; \
+ \
+ fail_unless (gst_tag_list_get_string_index (list, field, i, &___s)); \
+ fail_unless (___s != NULL); \
+ if (g_str_equal (___s, string)) { \
+ got_match = TRUE; \
+ g_free (___s); \
+ break; \
+ } \
+ g_free (___s); \
+ } \
+ fail_unless (got_match); \
+ }
+
+#define ASSERT_TAG_LIST_HAS_UINT(list,field,num) \
+ { \
+ guint ___n; \
+ \
+ fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
+ fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \
+ fail_unless (gst_tag_list_get_uint_index (list, field, 0, &___n)); \
+ fail_unless_equals_int (___n, num); \
+ }
+
+#define MATCH_DOUBLE(p1, p2) ((p1 < p2 + 1e-6) && (p2 < p1 + 1e-6))
+#define ASSERT_TAG_LIST_HAS_DOUBLE(list,field,d) \
+ { \
+ gdouble ___d; \
+ \
+ fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
+ fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \
+ fail_unless (gst_tag_list_get_double_index (list, field, 0, &___d)); \
+ fail_unless (MATCH_DOUBLE (d, ___d), \
+ "%f does not match expected %f", ___d, d); \
+ }
+
+GST_START_TEST (test_musicbrainz_tag_registration)
+{
+ GstTagList *list;
+
+ gst_tag_register_musicbrainz_tags ();
+
+ list = gst_tag_list_new ();
+
+ /* musicbrainz tags aren't registered yet */
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_TRACKID", "123456");
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_ARTISTID", "234567");
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMID", "345678");
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMARTISTID", "4567890");
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_TRMID", "5678901");
+ /* MUSICBRAINZ_SORTNAME = GST_TAG_ARTIST_SORTNAME now */
+ gst_vorbis_tag_add (list, "MUSICBRAINZ_SORTNAME", "Five, 678901");
+
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRACKID, "123456");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ARTISTID, "234567");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMID, "345678");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMARTISTID,
+ "4567890");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRMID, "5678901");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST_SORTNAME, "Five, 678901");
+
+ gst_tag_list_free (list);
+}
+
+GST_END_TEST;
+
+/* is there an easier way to compare two structures / tagslists? */
+static gboolean
+taglists_are_equal (const GstTagList * list_1, const GstTagList * list_2)
+{
+ GstCaps *c_list_1 = gst_caps_new_empty ();
+ GstCaps *c_list_2 = gst_caps_new_empty ();
+ gboolean ret;
+
+ gst_caps_append_structure (c_list_1,
+ gst_structure_copy ((GstStructure *) list_1));
+ gst_caps_append_structure (c_list_2,
+ gst_structure_copy ((GstStructure *) list_2));
+
+ ret = gst_caps_is_equal (c_list_2, c_list_1);
+
+ gst_caps_unref (c_list_1);
+ gst_caps_unref (c_list_2);
+
+ return ret;
+}
+
+GST_START_TEST (test_vorbis_tags)
+{
+ GstTagList *list;
+
+ list = gst_tag_list_new ();
+
+ /* NULL pointers aren't allowed */
+ ASSERT_CRITICAL (gst_vorbis_tag_add (NULL, "key", "value"));
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, NULL, "value"));
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", NULL));
+
+ /* must be UTF-8 */
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", "v\377lue"));
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k\377y", "value"));
+
+ /* key can't have a '=' in it */
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k=y", "value"));
+ ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key=", "value"));
+
+ /* should be allowed in values though */
+ gst_vorbis_tag_add (list, "keeey", "va=ue");
+
+ /* add some tags */
+ gst_vorbis_tag_add (list, "TITLE", "Too");
+ gst_vorbis_tag_add (list, "ALBUM", "Aoo");
+ gst_vorbis_tag_add (list, "ARTIST", "Alboo");
+ gst_vorbis_tag_add (list, "PERFORMER", "Perfoo");
+ gst_vorbis_tag_add (list, "COPYRIGHT", "Copyfoo");
+ gst_vorbis_tag_add (list, "DESCRIPTION", "Descoo");
+ gst_vorbis_tag_add (list, "LICENSE", "Licoo");
+ gst_vorbis_tag_add (list, "LICENSE",
+ "http://creativecommons.org/licenses/by/3.0/");
+ gst_vorbis_tag_add (list, "LOCATION", "Bristol, UK");
+ gst_vorbis_tag_add (list, "ORGANIZATION", "Orgoo");
+ gst_vorbis_tag_add (list, "GENRE", "Goo");
+ gst_vorbis_tag_add (list, "CONTACT", "Coo");
+ gst_vorbis_tag_add (list, "COMMENT", "Stroodle is good");
+ gst_vorbis_tag_add (list, "COMMENT", "Peroxysulfid stroodles the brain");
+
+ gst_vorbis_tag_add (list, "TRACKNUMBER", "5");
+ gst_vorbis_tag_add (list, "TRACKTOTAL", "77");
+ gst_vorbis_tag_add (list, "DISCNUMBER", "1");
+ gst_vorbis_tag_add (list, "DISCTOTAL", "2");
+ gst_vorbis_tag_add (list, "DATE", "1954-12-31");
+
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_TITLE, "Too");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ALBUM, "Aoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "Alboo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_PERFORMER, "Perfoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COPYRIGHT, "Copyfoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_DESCRIPTION, "Descoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE, "Licoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE_URI,
+ "http://creativecommons.org/licenses/by/3.0/");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GEO_LOCATION_NAME, "Bristol, UK");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ORGANIZATION, "Orgoo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GENRE, "Goo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_CONTACT, "Coo");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT,
+ "Peroxysulfid stroodles the brain");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT, "Stroodle is good");
+ ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_NUMBER, 5);
+ ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_COUNT, 77);
+ ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_NUMBER, 1);
+ ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_COUNT, 2);
+
+ {
+ GDate *date = NULL;
+
+ fail_unless (gst_tag_list_get_date (list, GST_TAG_DATE, &date));
+ fail_unless (date != NULL);
+ fail_unless (g_date_get_day (date) == 31);
+ fail_unless (g_date_get_month (date) == G_DATE_DECEMBER);
+ fail_unless (g_date_get_year (date) == 1954);
+
+ g_date_free (date);
+ }
+
+ /* unknown vorbis comments should go into a GST_TAG_EXTENDED_COMMENT */
+ gst_vorbis_tag_add (list, "CoEdSub_ID", "98172AF-973-10-B");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT,
+ "CoEdSub_ID=98172AF-973-10-B");
+ gst_vorbis_tag_add (list, "RuBuWuHash", "1337BA42F91");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT,
+ "RuBuWuHash=1337BA42F91");
+
+ gst_vorbis_tag_add (list, "REPLAYGAIN_REFERENCE_LOUDNESS", "89.");
+ ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_REFERENCE_LEVEL, 89.);
+ gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_GAIN", "+12.36");
+ ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_GAIN, +12.36);
+ gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_PEAK", "0.96349");
+ ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_PEAK, 0.96349);
+ gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_GAIN", "+10.12");
+ ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_GAIN, +10.12);
+ /* now check that we can parse floating point numbers with any separator
+ * (',' or '.') regardless of the current locale */
+ gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_PEAK", "0,98107");
+ ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_PEAK, 0.98107);
+ gst_vorbis_tag_add (list, "LICENSE", "http://foo.com/license-1.html");
+
+ /* make sure we can convert back and forth without loss */
+ {
+ GstTagList *new_list, *even_newer_list;
+ GstBuffer *buf, *buf2;
+ gchar *vendor_id = NULL;
+
+ buf = gst_tag_list_to_vorbiscomment_buffer (list,
+ (const guint8 *) "\003vorbis", 7, "libgstunittest");
+ fail_unless (buf != NULL);
+ new_list = gst_tag_list_from_vorbiscomment_buffer (buf,
+ (const guint8 *) "\003vorbis", 7, &vendor_id);
+ fail_unless (new_list != NULL);
+ fail_unless (vendor_id != NULL);
+ g_free (vendor_id);
+ vendor_id = NULL;
+
+ GST_LOG ("new_list = %" GST_PTR_FORMAT, new_list);
+ fail_unless (taglists_are_equal (list, new_list));
+
+ buf2 = gst_tag_list_to_vorbiscomment_buffer (new_list,
+ (const guint8 *) "\003vorbis", 7, "libgstunittest");
+ fail_unless (buf2 != NULL);
+ even_newer_list = gst_tag_list_from_vorbiscomment_buffer (buf2,
+ (const guint8 *) "\003vorbis", 7, &vendor_id);
+ fail_unless (even_newer_list != NULL);
+ fail_unless (vendor_id != NULL);
+ g_free (vendor_id);
+ vendor_id = NULL;
+
+ GST_LOG ("even_newer_list = %" GST_PTR_FORMAT, even_newer_list);
+ fail_unless (taglists_are_equal (new_list, even_newer_list));
+
+ gst_tag_list_free (new_list);
+ gst_tag_list_free (even_newer_list);
+ gst_buffer_unref (buf);
+ gst_buffer_unref (buf2);
+ }
+
+ /* there can only be one language per taglist ... */
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "fr");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
+
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "[fr]");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
+
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "French [fr]");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
+
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "[eng] English");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
+
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "eng");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
+
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "[eng]");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
+
+ /* free-form *sigh* */
+ gst_tag_list_free (list);
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "LANGUAGE", "English");
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "English");
+
+ /* now, while we still have a taglist, test _to_vorbiscomment_buffer() */
+ {
+ GstBuffer *buf1, *buf2;
+ guint8 *data1, *data2;
+ gsize size1, size2;
+
+ ASSERT_CRITICAL (gst_tag_list_to_vorbiscomment_buffer (NULL,
+ (const guint8 *) "x", 1, "x"));
+
+ buf1 = gst_tag_list_to_vorbiscomment_buffer (list, NULL, 0, NULL);
+ fail_unless (buf1 != NULL);
+
+ buf2 = gst_tag_list_to_vorbiscomment_buffer (list,
+ (const guint8 *) "foo", 3, NULL);
+ fail_unless (buf2 != NULL);
+
+ data1 = gst_buffer_map (buf1, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (buf2, &size2, NULL, GST_MAP_READ);
+
+ fail_unless (memcmp (data1, data2 + 3, size1) == 0);
+
+ gst_buffer_unmap (buf2, data2, size2);
+ gst_buffer_unmap (buf1, data1, size1);
+
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+ }
+
+ gst_tag_list_free (list);
+
+ /* make sure gst_tag_list_from_vorbiscomment_buffer() works with an
+ * empty ID (for Speex) */
+ {
+ const guint8 speex_comments_buf1[] = { 0x03, 0x00, 0x00, 0x00, 'f', 'o',
+ 'o', 0x00, 0x00, 0x00, 0x00
+ };
+ GstBuffer *buf;
+ gchar *vendor = NULL;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) speex_comments_buf1, NULL,
+ sizeof (speex_comments_buf1), 0, sizeof (speex_comments_buf1)));
+
+ /* make sure it doesn't memcmp over the end of the buffer */
+ fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
+ (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39,
+ &vendor) == NULL);
+ fail_unless (vendor == NULL);
+
+ /* make sure it bails out if the ID doesn't match */
+ fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
+ (guint8 *) "short", 4, &vendor) == NULL);
+ fail_unless (vendor == NULL);
+
+ /* now read properly */
+ list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, &vendor);
+ fail_unless (vendor != NULL);
+ fail_unless_equals_string (vendor, "foo");
+ fail_unless (list != NULL);
+ fail_unless (gst_structure_n_fields ((GstStructure *) list) == 0);
+ g_free (vendor);
+ gst_tag_list_free (list);
+
+ /* now again without vendor */
+ list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, NULL);
+ fail_unless (list != NULL);
+ fail_unless (gst_structure_n_fields ((GstStructure *) list) == 0);
+ gst_tag_list_free (list);
+
+ gst_buffer_unref (buf);
+ }
+
+ /* the same with an ID */
+ {
+ const guint8 vorbis_comments_buf[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's',
+ 0x03, 0x00, 0x00, 0x00, 'f', 'o', 'o', 0x01, 0x00, 0x00, 0x00,
+ strlen ("ARTIST=foo bar"), 0x00, 0x00, 0x00, 'A', 'R', 'T', 'I', 'S',
+ 'T', '=', 'f', 'o', 'o', ' ', 'b', 'a', 'r'
+ };
+ GstBuffer *buf;
+ gchar *vendor = NULL;
+
+ buf = gst_buffer_new ();
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) vorbis_comments_buf, NULL,
+ sizeof (vorbis_comments_buf), 0, sizeof (vorbis_comments_buf)));
+
+ /* make sure it doesn't memcmp over the end of the buffer */
+ fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
+ (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39,
+ &vendor) == NULL);
+ fail_unless (vendor == NULL);
+
+ /* make sure it bails out if the ID doesn't match */
+ fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
+ (guint8 *) "short", 4, &vendor) == NULL);
+ fail_unless (vendor == NULL);
+
+ /* now read properly */
+ list = gst_tag_list_from_vorbiscomment_buffer (buf,
+ (guint8 *) "\003vorbis", 7, &vendor);
+ fail_unless (vendor != NULL);
+ fail_unless_equals_string (vendor, "foo");
+ fail_unless (list != NULL);
+ fail_unless (gst_structure_n_fields ((GstStructure *) list) == 1);
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar");
+ g_free (vendor);
+ gst_tag_list_free (list);
+
+ /* now again without vendor */
+ list = gst_tag_list_from_vorbiscomment_buffer (buf,
+ (guint8 *) "\003vorbis", 7, NULL);
+ fail_unless (list != NULL);
+ fail_unless (gst_structure_n_fields ((GstStructure *) list) == 1);
+ ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar");
+ gst_tag_list_free (list);
+
+ gst_buffer_unref (buf);
+ }
+
+ /* check date with time */
+ {
+ GDate *date = NULL;
+
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "DATE", "2006-09-25 22:02:38");
+
+ fail_unless (gst_tag_list_get_date_index (list, GST_TAG_DATE, 0, &date));
+ fail_unless (date != NULL);
+ fail_unless (g_date_get_day (date) == 25);
+ fail_unless (g_date_get_month (date) == G_DATE_SEPTEMBER);
+ fail_unless (g_date_get_year (date) == 2006);
+
+ g_date_free (date);
+ gst_tag_list_free (list);
+ }
+
+ /* check date with month/day of 00-00 */
+ {
+ GDate *date = NULL;
+
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "DATE", "1992-00-00");
+
+ fail_unless (gst_tag_list_get_date_index (list, GST_TAG_DATE, 0, &date));
+ fail_unless (date != NULL);
+ fail_unless (g_date_get_year (date) == 1992);
+
+ g_date_free (date);
+ gst_tag_list_free (list);
+ }
+
+ /* check date with valid month, but day of 00 */
+ {
+ GDate *date = NULL;
+
+ list = gst_tag_list_new ();
+ gst_vorbis_tag_add (list, "DATE", "1992-05-00");
+
+ fail_unless (gst_tag_list_get_date_index (list, GST_TAG_DATE, 0, &date));
+ fail_unless (date != NULL);
+ fail_unless (g_date_get_year (date) == 1992);
+ fail_unless (g_date_get_month (date) == G_DATE_MAY);
+
+ g_date_free (date);
+ gst_tag_list_free (list);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_id3_tags)
+{
+ guint i;
+
+ fail_unless (gst_tag_id3_genre_count () > 0);
+
+ for (i = 0; i < gst_tag_id3_genre_count (); ++i) {
+ const gchar *genre;
+
+ genre = gst_tag_id3_genre_get (i);
+ GST_LOG ("genre: %s", genre);
+ fail_unless (genre != NULL);
+ }
+
+ {
+ /* TODO: GstTagList *gst_tag_list_new_from_id3v1 (const guint8 *data) */
+ }
+
+ /* gst_tag_from_id3_tag */
+ fail_unless (gst_tag_from_id3_tag ("TALB") != NULL);
+ ASSERT_CRITICAL (gst_tag_from_id3_tag (NULL));
+ fail_unless (gst_tag_from_id3_tag ("R2D2") == NULL);
+ fail_unless_equals_string (gst_tag_from_id3_tag ("WCOP"),
+ GST_TAG_COPYRIGHT_URI);
+
+ /* gst_tag_from_id3_user_tag */
+ ASSERT_CRITICAL (gst_tag_from_id3_user_tag (NULL, "foo"));
+ ASSERT_CRITICAL (gst_tag_from_id3_user_tag ("foo", NULL));
+ fail_unless (gst_tag_from_id3_user_tag ("R2D2", "R2D2") == NULL);
+
+ /* gst_tag_to_id3_tag */
+ ASSERT_CRITICAL (gst_tag_to_id3_tag (NULL));
+ fail_unless (gst_tag_to_id3_tag ("R2D2") == NULL);
+ fail_unless (gst_tag_to_id3_tag (GST_TAG_ARTIST) != NULL);
+ fail_unless_equals_string (gst_tag_to_id3_tag (GST_TAG_COPYRIGHT_URI),
+ "WCOP");
+
+ fail_unless (GST_TYPE_TAG_IMAGE_TYPE != 0);
+ fail_unless (g_type_name (GST_TYPE_TAG_IMAGE_TYPE) != NULL);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_id3v1_utf8_tag)
+{
+ const guint8 id3v1[128] = {
+ /* marker */
+ 'T', 'A', 'G',
+ /* title (30 bytes) */
+ 'D', 0xc3, 0xad, 'v', 'k', 'a', ' ', 's',
+ ' ', 'p', 'e', 'r', 'l', 'a', 'm', 'i',
+ ' ', 'v', 'e', ' ', 'v', 'l', 'a', 's',
+ 'e', 'c', 'h', 0, 0, 0,
+ /* artist (30 bytes) */
+ 'A', 'l', 'e', 0xc5, 0xa1, ' ', 'B', 'r', 'i', 'c', 'h', 't', 'a',
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* album (30 bytes) */
+ 'B', 'e', 's', 't', ' ', 'o', 'f', ' ', '(', 'P', 'r', 'o', 's', 't',
+ 0xc4, 0x9b, ' ', 0xc3, 0xba, 0xc5, 0xbe, 'a', 's', 'n', 0xc3, 0xbd, ')',
+ 0, 0, 0,
+ /* year (4 bytes) */
+ '2', '0', '0', '0',
+ /* comment (28 bytes) */
+ '-', '-', '-', ' ', 0xc4, 0x8d, 'e', 's', 'k', 0xc3, 0xa9, ' ', 'p',
+ 0xc3, 0xad, 's', 'n', 'i', 0xc4, 0x8d, 'k', 'y', ' ', '-', '-', '-',
+ 0, 0,
+ /* track number */
+ 0, 0,
+ /* genre */
+ 0x11
+ };
+ GstTagList *tags;
+ GDate *d;
+ gchar *s;
+
+ /* set this, to make sure UTF-8 strings are really interpreted properly
+ * as UTF-8, regardless of the locale set */
+ g_setenv ("GST_ID3V1_TAG_ENCODING", "WINDOWS-1250", TRUE);
+
+ tags = gst_tag_list_new_from_id3v1 (id3v1);
+ fail_unless (tags != NULL);
+
+ GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags);
+
+ s = NULL;
+ fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s));
+ fail_unless (s != NULL);
+ fail_unless_equals_string (s, "Dívka s perlami ve vlasech");
+ g_free (s);
+
+ s = NULL;
+ fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s));
+ fail_unless (s != NULL);
+ fail_unless_equals_string (s, "Aleš Brichta");
+ g_free (s);
+
+ s = NULL;
+ fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s));
+ fail_unless (s != NULL);
+ fail_unless_equals_string (s, "Best of (Prostě úžasný)");
+ g_free (s);
+
+ d = NULL;
+ fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &d));
+ fail_unless (d != NULL);
+ fail_unless_equals_int (g_date_get_year (d), 2000);
+ g_date_free (d);
+ d = NULL;
+
+ gst_tag_list_free (tags);
+
+ g_unsetenv ("GST_ID3V1_TAG_ENCODING");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_language_utils)
+{
+ gchar **lang_codes, **c;
+
+#define ASSERT_STRINGS_EQUAL fail_unless_equals_string
+
+ lang_codes = gst_tag_get_language_codes ();
+ fail_unless (lang_codes != NULL);
+ fail_unless (*lang_codes != NULL);
+
+ for (c = lang_codes; c != NULL && *c != NULL; ++c) {
+ const gchar *lang_name, *c1, *c2t, *c2b;
+
+ lang_name = gst_tag_get_language_name (*c);
+ fail_unless (lang_name != NULL);
+ fail_unless (g_utf8_validate (lang_name, -1, NULL));
+
+ c1 = gst_tag_get_language_code_iso_639_1 (*c);
+ fail_unless (c1 != NULL);
+ fail_unless (g_utf8_validate (c1, -1, NULL));
+
+ c2t = gst_tag_get_language_code_iso_639_2T (*c);
+ fail_unless (c2t != NULL);
+ fail_unless (g_utf8_validate (c2t, -1, NULL));
+
+ c2b = gst_tag_get_language_code_iso_639_2B (*c);
+ fail_unless (c2b != NULL);
+ fail_unless (g_utf8_validate (c2b, -1, NULL));
+
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (*c), *c);
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2t), *c);
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2b), *c);
+
+ GST_DEBUG ("[%s] %s %s %s : %s\n", *c, c1, c2t, c2b, lang_name);
+
+ }
+ g_strfreev (lang_codes);
+
+ fail_unless (gst_tag_get_language_name ("de") != NULL);
+ fail_unless (gst_tag_get_language_name ("deu") != NULL);
+ fail_unless (gst_tag_get_language_name ("ger") != NULL);
+ fail_unless_equals_string (gst_tag_get_language_name ("deu"),
+ gst_tag_get_language_name ("ger"));
+ fail_unless_equals_string (gst_tag_get_language_name ("de"),
+ gst_tag_get_language_name ("ger"));
+ fail_unless (gst_tag_get_language_name ("de") !=
+ gst_tag_get_language_name ("fr"));
+
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("deu"), "de");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("de"), "de");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("ger"), "de");
+
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("deu"), "de");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("de"), "de");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("ger"), "de");
+
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("de"), "deu");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("deu"), "deu");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("ger"), "deu");
+
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("de"), "ger");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("deu"), "ger");
+ ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("ger"), "ger");
+}
+
+GST_END_TEST;
+
+#define SPECIFIC_L "http://creativecommons.org/licenses/by-nc-sa/2.5/scotland/"
+#define GENERIC_L "http://creativecommons.org/licenses/by/1.0/"
+#define DERIVED_L "http://creativecommons.org/licenses/sampling+/1.0/tw/"
+
+GST_START_TEST (test_license_utils)
+{
+ GHashTable *ht;
+ GError *err = NULL;
+ gchar **liblicense_refs, **r;
+ gchar **lrefs, **l;
+ gchar *path, *data = NULL;
+ gsize data_len;
+
+ gst_debug_set_threshold_for_name ("tag-licenses", GST_LEVEL_NONE);
+
+ /* test jurisdiction-specific license */
+ fail_unless_equals_int (gst_tag_get_license_flags (SPECIFIC_L), 0x01010703);
+ fail_unless_equals_string (gst_tag_get_license_nick (SPECIFIC_L),
+ "CC BY-NC-SA 2.5 SCOTLAND");
+ fail_unless_equals_string (gst_tag_get_license_version (SPECIFIC_L), "2.5");
+ fail_unless_equals_string (gst_tag_get_license_jurisdiction (SPECIFIC_L),
+ "scotland");
+
+ g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
+ fail_unless_equals_string (gst_tag_get_license_title (SPECIFIC_L),
+ "Attribution-NonCommercial-ShareAlike");
+ fail_unless (gst_tag_get_license_description (SPECIFIC_L) == NULL);
+
+ /* test generic license */
+ fail_unless_equals_int (gst_tag_get_license_flags (GENERIC_L), 0x01000307);
+ fail_unless_equals_string (gst_tag_get_license_nick (GENERIC_L), "CC BY 1.0");
+ fail_unless_equals_string (gst_tag_get_license_version (GENERIC_L), "1.0");
+ fail_unless (gst_tag_get_license_jurisdiction (GENERIC_L) == NULL);
+
+ g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
+ fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L),
+ "Attribution");
+ fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
+ "You must attribute the work in the manner specified by the author or licensor.");
+
+#ifdef ENABLE_NLS
+ g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "fr", TRUE);
+ fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L),
+ "Paternité");
+ fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
+ "L'offrant autorise les autres à reproduire, distribuer et communiquer cette création au public. En échange, les personnes qui acceptent ce contrat doivent citer le nom de l'auteur original.");
+#endif
+
+ /* test derived (for a certain jurisdiction) license */
+ fail_unless_equals_int (gst_tag_get_license_flags (DERIVED_L), 0x0100030d);
+ fail_unless_equals_string (gst_tag_get_license_nick (DERIVED_L),
+ "CC SAMPLING+ 1.0 TW");
+ fail_unless_equals_string (gst_tag_get_license_version (DERIVED_L), "1.0");
+ fail_unless_equals_string (gst_tag_get_license_jurisdiction (DERIVED_L),
+ "tw");
+
+ g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
+ fail_unless_equals_string (gst_tag_get_license_title (DERIVED_L),
+ "Sampling Plus");
+ fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
+ "You must attribute the work in the manner specified by the author or licensor.");
+
+ /* test all we know about */
+ lrefs = gst_tag_get_licenses ();
+ fail_unless (lrefs != NULL);
+ fail_unless (*lrefs != NULL);
+
+ GST_INFO ("%d licenses", g_strv_length (lrefs));
+ fail_unless (g_strv_length (lrefs) >= 376);
+
+ ht = g_hash_table_new (g_str_hash, g_str_equal);
+
+ for (l = lrefs; l != NULL && *l != NULL; ++l) {
+ const gchar *ref, *nick, *title, *desc G_GNUC_UNUSED;
+
+ ref = (const gchar *) *l;
+ nick = gst_tag_get_license_nick (ref);
+ title = gst_tag_get_license_title (ref);
+ desc = gst_tag_get_license_description (ref);
+ fail_unless (nick != NULL, "no nick for license '%s'", ref);
+ fail_unless (title != NULL, "no title for license '%s'", ref);
+ GST_LOG ("ref: %s [nick %s]", ref, (nick) ? nick : "none");
+ GST_TRACE (" %s : %s", title, (desc) ? desc : "(no description)");
+
+ /* make sure the list contains no duplicates */
+ fail_if (g_hash_table_lookup (ht, (gpointer) ref) != NULL);
+ g_hash_table_insert (ht, (gpointer) ref, (gpointer) "meep");
+ }
+ g_hash_table_destroy (ht);
+
+ /* trailing slash shouldn't make a difference */
+ fail_unless_equals_int (gst_tag_get_license_flags
+ ("http://creativecommons.org/licenses/by-nd/1.0/"),
+ gst_tag_get_license_flags
+ ("http://creativecommons.org/licenses/by-nd/1.0"));
+ fail_unless_equals_string (gst_tag_get_license_nick
+ ("http://creativecommons.org/licenses/by-nd/1.0/"),
+ gst_tag_get_license_nick
+ ("http://creativecommons.org/licenses/by-nd/1.0"));
+ fail_unless_equals_int (gst_tag_get_license_flags
+ ("http://creativecommons.org/licenses/by-nd/2.5/ca/"),
+ gst_tag_get_license_flags
+ ("http://creativecommons.org/licenses/by-nd/2.5/ca"));
+ fail_unless_equals_string (gst_tag_get_license_nick
+ ("http://creativecommons.org/licenses/by-nd/2.5/ca/"),
+ gst_tag_get_license_nick
+ ("http://creativecommons.org/licenses/by-nd/2.5/ca"));
+
+ /* unknown licenses */
+ fail_unless (gst_tag_get_license_nick
+ ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL);
+ fail_unless (gst_tag_get_license_flags
+ ("http://creativecommons.org/licenses/by-nd/25/ca") == 0);
+ fail_unless (gst_tag_get_license_jurisdiction
+ ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL);
+ fail_unless (gst_tag_get_license_jurisdiction
+ ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
+ fail_unless (gst_tag_get_license_title
+ ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
+ fail_unless (gst_tag_get_license_jurisdiction
+ ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
+
+ /* unknown prefixes even */
+ fail_unless (gst_tag_get_license_nick
+ ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
+ fail_unless (gst_tag_get_license_flags
+ ("http://copycats.org/licenses/by-nd/2.5/ca") == 0);
+ fail_unless (gst_tag_get_license_jurisdiction
+ ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
+ fail_unless (gst_tag_get_license_title
+ ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
+ fail_unless (gst_tag_get_license_description
+ ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
+
+ /* read list of liblicense refs from file */
+ path = g_build_filename (GST_TEST_FILES_PATH, "license-uris", NULL);
+ GST_LOG ("reading file '%s'", path);
+ if (!g_file_get_contents (path, &data, &data_len, &err)) {
+ g_error ("error loading test file: %s", err->message);
+ }
+
+ while (data_len > 0 && data[data_len - 1] == '\n') {
+ data[--data_len] = '\0';
+ }
+
+ liblicense_refs = g_strsplit (data, "\n", -1);
+ g_free (data);
+ g_free (path);
+
+ fail_unless (g_strv_length (lrefs) >= g_strv_length (liblicense_refs));
+
+ for (r = liblicense_refs; r != NULL && *r != NULL; ++r) {
+ GstTagLicenseFlags flags;
+ const gchar *version, *nick, *jur;
+ const gchar *ref = *r;
+
+ GST_LOG ("liblicense ref: %s", ref);
+
+ version = gst_tag_get_license_version (ref);
+ if (strstr (ref, "publicdomain") != NULL)
+ fail_unless (version == NULL);
+ else
+ fail_unless (version != NULL, "expected version for license %s", ref);
+
+ flags = gst_tag_get_license_flags (ref);
+ fail_unless (flags != 0, "expected non-zero flags for license %s", ref);
+
+ nick = gst_tag_get_license_nick (ref);
+ fail_unless (nick != NULL, "expected nick for license %s", ref);
+
+ jur = gst_tag_get_license_jurisdiction (ref);
+ if (g_str_has_suffix (ref, "de/")) {
+ fail_unless_equals_string (jur, "de");
+ } else if (g_str_has_suffix (ref, "scotland")) {
+ fail_unless_equals_string (jur, "scotland");
+ } else if (g_str_has_suffix (ref, ".0") || g_str_has_suffix (ref, ".1")) {
+ fail_unless (jur == NULL);
+ }
+ }
+
+ g_strfreev (liblicense_refs);
+ g_strfreev (lrefs);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_xmp_formatting)
+{
+ GstTagList *list;
+ GstBuffer *buf;
+ const gchar *text;
+ gsize len;
+
+ /* test data */
+ list = gst_tag_list_new_full (GST_TAG_TITLE, "test title",
+ GST_TAG_DESCRIPTION, "test decription",
+ GST_TAG_KEYWORDS, "keyword1", GST_TAG_KEYWORDS, "keyword2", NULL);
+
+ buf = gst_tag_list_to_xmp_buffer (list, FALSE);
+ fail_unless (buf != NULL);
+
+ text = gst_buffer_map (buf, &len, NULL, GST_MAP_READ);
+
+ /* check the content */
+ fail_unless (g_strrstr_len (text, len, "<?xpacket begin") == text);
+ fail_unless (g_strrstr_len (text, len, ">test title<") != NULL);
+ fail_unless (g_strrstr_len (text, len, ">test decription<") != NULL);
+ fail_unless (g_strrstr_len (text, len, ">keyword1<") != NULL);
+ fail_unless (g_strrstr_len (text, len, ">keyword2<") != NULL);
+ fail_unless (g_strrstr_len (text, len, "<?xpacket end") != NULL);
+ gst_buffer_unmap (buf, (gpointer) text, len);
+
+ gst_buffer_unref (buf);
+ gst_tag_list_free (list);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_xmp_parsing)
+{
+ GstTagList *list;
+ GstBuffer *buf;
+ guint i, result_size;
+ gchar *text;
+ const gchar *xmp_header =
+ "<?xpacket begin=\"\xEF\xBB\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>"
+ "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"GStreamer\">"
+ "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">";
+ const gchar *xmp_footer = "</rdf:RDF>" "</x:xmpmeta>" "<?xpacket end=\"r\"?>";
+ struct
+ {
+ const gchar *xmp_data;
+ gint result_size;
+ gint result_test;
+ } test_data[] = {
+ {
+ "", -1, -1}, {
+ "<rdf:Description rdf:about=\"\" />", 0, -1}, {
+ "<rdf:Description rdf:about=\"\"></rdf:Description>", 0, -1}, {
+ "<rdf:Description rdf:about=\"\" ></rdf:Description>", 0, -1}, {
+ "<rdf:Description rdf:about=\"\"><dc:description>test</dc:description></rdf:Description>",
+ 1, 0}, {
+ "<rdf:Description rdf:about=\"\" dc:description=\"test\"></rdf:Description>",
+ 1, 0}, {
+ NULL, -1, -1}
+ };
+
+ /* test data */
+ i = 0;
+ while (test_data[i].xmp_data) {
+ gsize len;
+
+ GST_DEBUG ("trying test-data %u", i);
+
+ text = g_strconcat (xmp_header, test_data[i].xmp_data, xmp_footer, NULL);
+
+ buf = gst_buffer_new ();
+ len = strlen (text) + 1;
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, text, NULL, len, 0, len));
+
+ list = gst_tag_list_from_xmp_buffer (buf);
+ if (test_data[i].result_size >= 0) {
+ fail_unless (list != NULL);
+
+ result_size = gst_structure_n_fields ((GstStructure *) list);
+ fail_unless (result_size == test_data[i].result_size);
+
+ /* check the taglist content */
+ switch (test_data[i].result_test) {
+ case 0:
+ ASSERT_TAG_LIST_HAS_STRING (list, "description", "test");
+ break;
+ default:
+ break;
+ }
+ }
+ if (list)
+ gst_tag_list_free (list);
+
+ gst_buffer_unref (buf);
+ g_free (text);
+ i++;
+ }
+}
+
+GST_END_TEST;
+
+static void
+tag_list_equals (GstTagList * taglist, GstTagList * taglist2)
+{
+ const gchar *name_sent, *name_recv;
+ const GValue *value_sent, *value_recv;
+ gboolean found;
+ gint comparison;
+ gint n_recv;
+ gint n_sent;
+ gint i, j;
+
+ /* verify tags */
+ fail_unless (taglist2 != NULL);
+ n_recv = gst_structure_n_fields (taglist2);
+ n_sent = gst_structure_n_fields (taglist);
+ fail_unless (n_recv == n_sent);
+ fail_unless (n_sent > 0);
+
+ /* FIXME: compare taglist values */
+ for (i = 0; i < n_sent; i++) {
+ name_sent = gst_structure_nth_field_name (taglist, i);
+ value_sent = gst_structure_get_value (taglist, name_sent);
+ found = FALSE;
+ for (j = 0; j < n_recv; j++) {
+ name_recv = gst_structure_nth_field_name (taglist2, j);
+ if (!strcmp (name_sent, name_recv)) {
+ value_recv = gst_structure_get_value (taglist2, 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);
+ }
+ if (comparison != GST_VALUE_EQUAL &&
+ G_VALUE_HOLDS (value_sent, G_TYPE_DOUBLE)) {
+ gdouble vs;
+ gdouble vr;
+
+ /* add some tolerance for doubles */
+ vs = g_value_get_double (value_sent);
+ vr = g_value_get_double (value_recv);
+ if (vr >= vs - 0.001 && vr <= vs + 0.001)
+ comparison = GST_VALUE_EQUAL;
+ }
+ 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);
+ }
+}
+
+static void
+do_xmp_tag_serialization_deserialization (GstTagList * taglist,
+ const gchar ** schemas)
+{
+ GstTagList *taglist2;
+ GstBuffer *buf;
+
+ buf = gst_tag_list_to_xmp_buffer_full (taglist, TRUE, schemas);
+ taglist2 = gst_tag_list_from_xmp_buffer (buf);
+
+ tag_list_equals (taglist, taglist2);
+
+ gst_buffer_unref (buf);
+ gst_tag_list_free (taglist2);
+}
+
+static void
+do_simple_xmp_tag_serialization_deserialization (const gchar * gsttag,
+ GValue * value)
+{
+ GstTagList *taglist = gst_tag_list_new ();
+
+ gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value);
+
+ do_xmp_tag_serialization_deserialization (taglist, NULL);
+ gst_tag_list_free (taglist);
+}
+
+GST_START_TEST (test_xmp_tags_serialization_deserialization)
+{
+ GValue value = { 0 };
+ GDate *date;
+ GstDateTime *datetime;
+
+ gst_tag_register_musicbrainz_tags ();
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_static_string (&value, "my string");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DESCRIPTION, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_KEYWORDS, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_TITLE, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_VIDEO_CODEC, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_COUNTRY,
+ &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_CITY,
+ &value);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_SUBLOCATION, &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MANUFACTURER,
+ &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MODEL,
+ &value);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME,
+ &value);
+
+ g_value_set_static_string (&value, "rotate-0");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-0");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-180");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-180");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-270");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-90");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-90");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-270");
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_DOUBLE);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LATITUDE, &value);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+ g_value_set_double (&value, 10.5);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LATITUDE, &value);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+ g_value_set_double (&value, -32.375);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LATITUDE, &value);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+
+ g_value_set_double (&value, 0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+ g_value_set_double (&value, 100);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+ g_value_set_double (&value, 500.25);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+ g_value_set_double (&value, -12.75);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+ g_value_set_double (&value, 10.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+ g_value_set_double (&value, 786.125);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+ g_value_set_double (&value, -2.5);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
+ g_value_set_double (&value, 180.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
+ g_value_set_double (&value, 359.99);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
+ g_value_set_double (&value, 90.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
+ g_value_set_double (&value, 359.99);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_set_double (&value, 1.0);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_set_double (&value, -2.5);
+ do_simple_xmp_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, GST_TYPE_DATE);
+ date = g_date_new_dmy (22, 3, 2010);
+ gst_value_set_date (&value, date);
+ g_date_free (date);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_UINT);
+ g_value_set_uint (&value, 0);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
+ g_value_set_uint (&value, 100);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
+ g_value_set_uint (&value, 22);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, GST_TYPE_DATE_TIME);
+ datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000125);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000001);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.123456);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new (-3, 2010, 6, 22, 12, 5, 10.123456);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new (5, 2010, 6, 22, 12, 5, 10.123456);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ datetime = gst_date_time_new_local_time (2010, 12, 2, 12, 5, 10.000043);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ g_value_unset (&value);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_xmp_compound_tags)
+{
+ const gchar *schemas[] = { "Iptc4xmpExt", NULL };
+ GstTagList *taglist = gst_tag_list_new ();
+
+ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_KEYWORDS, "k1",
+ GST_TAG_KEYWORDS, "k2", GST_TAG_TITLE, "title", GST_TAG_KEYWORDS, "k3",
+ NULL);
+ do_xmp_tag_serialization_deserialization (taglist, NULL);
+ gst_tag_list_free (taglist);
+
+ taglist = gst_tag_list_new ();
+ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_GEO_LOCATION_COUNTRY,
+ "Brazil", GST_TAG_GEO_LOCATION_CITY, "Campina Grande", NULL);
+ do_xmp_tag_serialization_deserialization (taglist, schemas);
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_exif_parsing)
+{
+ GstTagList *taglist;
+ GstBuffer *buf;
+ GstByteWriter writer;
+ const gchar *str;
+
+ gst_byte_writer_init (&writer);
+
+ /* write the IFD */
+ /* 1 entry */
+ gst_byte_writer_put_uint16_le (&writer, 1);
+
+ /* copyright tag */
+ /* tag id */
+ gst_byte_writer_put_uint16_le (&writer, 0x8298);
+ /* tag type */
+ gst_byte_writer_put_uint16_le (&writer, 0x2);
+ /* count */
+ gst_byte_writer_put_uint32_le (&writer, strlen ("my copyright") + 1);
+ /* offset */
+ gst_byte_writer_put_uint32_le (&writer, 8 + 14);
+
+ /* data */
+ gst_byte_writer_put_string (&writer, "my copyright");
+
+ buf = gst_byte_writer_reset_and_get_buffer (&writer);
+
+ taglist = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 8);
+
+ fail_unless (gst_structure_n_fields (taglist) == 1);
+ fail_unless (gst_structure_has_field_typed (taglist, GST_TAG_COPYRIGHT,
+ G_TYPE_STRING));
+ str = gst_structure_get_string (taglist, GST_TAG_COPYRIGHT);
+ fail_unless (strcmp (str, "my copyright") == 0);
+
+ gst_tag_list_free (taglist);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+
+static void
+do_exif_tag_serialization_deserialization (GstTagList * taglist)
+{
+ GstTagList *taglist2;
+ GstBuffer *buf;
+
+ /* LE */
+ buf = gst_tag_list_to_exif_buffer (taglist, G_LITTLE_ENDIAN, 0);
+ taglist2 = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 0);
+ gst_buffer_unref (buf);
+
+ tag_list_equals (taglist, taglist2);
+ gst_tag_list_free (taglist2);
+
+ /* BE */
+ buf = gst_tag_list_to_exif_buffer (taglist, G_BIG_ENDIAN, 0);
+ taglist2 = gst_tag_list_from_exif_buffer (buf, G_BIG_ENDIAN, 0);
+ gst_buffer_unref (buf);
+
+ tag_list_equals (taglist, taglist2);
+ gst_tag_list_free (taglist2);
+
+ /* APP1 */
+ buf = gst_tag_list_to_exif_buffer_with_tiff_header (taglist);
+ taglist2 = gst_tag_list_from_exif_buffer_with_tiff_header (buf);
+ gst_buffer_unref (buf);
+
+ tag_list_equals (taglist, taglist2);
+ gst_tag_list_free (taglist2);
+}
+
+static void
+do_simple_exif_tag_serialization_deserialization (const gchar * gsttag,
+ GValue * value)
+{
+ GstTagList *taglist = gst_tag_list_new ();
+
+ gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value);
+ do_exif_tag_serialization_deserialization (taglist);
+
+ gst_tag_list_free (taglist);
+}
+
+/*
+ * Adds tags from multiple ifd tables and tries serializing them
+ */
+GST_START_TEST (test_exif_multiple_tags)
+{
+ GstTagList *taglist;
+ GstDateTime *datetime;
+ GValue value = { 0 };
+
+ gst_tag_register_musicbrainz_tags ();
+
+ taglist = gst_tag_list_new_full (GST_TAG_ARTIST, "artist",
+ GST_TAG_DEVICE_MANUFACTURER, "make",
+ GST_TAG_DEVICE_MODEL, "model", GST_TAG_GEO_LOCATION_LATITUDE, 45.5,
+ GST_TAG_GEO_LOCATION_LONGITUDE, -10.25,
+ GST_TAG_IMAGE_HORIZONTAL_PPI, 300.0,
+ GST_TAG_IMAGE_VERTICAL_PPI, 300.0, NULL);
+
+ g_value_init (&value, GST_TYPE_DATE_TIME);
+ datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, GST_TAG_DATE_TIME,
+ &value);
+ g_value_unset (&value);
+
+ do_exif_tag_serialization_deserialization (taglist);
+
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_exif_tags_serialization_deserialization)
+{
+ GValue value = { 0 };
+ GstDateTime *datetime = NULL;
+ GstBuffer *buf = NULL;
+ gint i;
+ GstTagList *taglist;
+ guint8 *data;
+
+ gst_tag_register_musicbrainz_tags ();
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_static_string (&value, "my string");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value);
+ g_value_set_static_string (&value, "ty");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
+ g_value_set_static_string (&value, "Company Software 1.2b (info)");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME,
+ &value);
+
+ /* non ascii chars */
+ g_value_set_static_string (&value, "AaÄäEeËëIiÏïOoÖöUuÜü");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
+ g_value_set_static_string (&value, "Äë");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
+
+ /* image orientation tests */
+ g_value_set_static_string (&value, "rotate-0");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-0");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-180");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-180");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-270");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-90");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "flip-rotate-90");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+ g_value_set_static_string (&value, "rotate-270");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
+ &value);
+
+ /* exposure program */
+ g_value_set_static_string (&value, "undefined");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "manual");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "normal");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "aperture-priority");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "shutter-priority");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "creative");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "action");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "portrait");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+ g_value_set_static_string (&value, "landscape");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
+
+ /* exposure mode */
+ g_value_set_static_string (&value, "auto-exposure");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
+ g_value_set_static_string (&value, "manual-exposure");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
+ g_value_set_static_string (&value, "auto-bracket");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
+
+ /* scene capture type */
+ g_value_set_static_string (&value, "standard");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
+ g_value_set_static_string (&value, "portrait");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
+ g_value_set_static_string (&value, "landscape");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
+ g_value_set_static_string (&value, "night-scene");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
+
+ g_value_set_static_string (&value, "none");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
+ g_value_set_static_string (&value, "high-gain-up");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
+ g_value_set_static_string (&value, "low-gain-up");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
+ g_value_set_static_string (&value, "high-gain-down");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
+ g_value_set_static_string (&value, "low-gain-down");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
+
+ g_value_set_static_string (&value, "auto");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_WHITE_BALANCE, &value);
+ g_value_set_static_string (&value, "manual");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_WHITE_BALANCE, &value);
+
+ g_value_set_static_string (&value, "normal");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
+ &value);
+ g_value_set_static_string (&value, "hard");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
+ &value);
+ g_value_set_static_string (&value, "soft");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
+ &value);
+
+ g_value_set_static_string (&value, "normal");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SATURATION, &value);
+ g_value_set_static_string (&value, "low-saturation");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SATURATION, &value);
+ g_value_set_static_string (&value, "high-saturation");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SATURATION, &value);
+
+ g_value_set_static_string (&value, "normal");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
+ &value);
+ g_value_set_static_string (&value, "hard");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
+ &value);
+ g_value_set_static_string (&value, "soft");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
+ &value);
+
+ g_value_set_static_string (&value, "unknown");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "average");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "center-weighted-average");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "spot");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "multi-spot");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "pattern");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "partial");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+ g_value_set_static_string (&value, "other");
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_METERING_MODE, &value);
+
+ g_value_set_static_string (&value, "dsc");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
+ &value);
+ g_value_set_static_string (&value, "other");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
+ &value);
+ g_value_set_static_string (&value, "transparent-scanner");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
+ &value);
+ g_value_set_static_string (&value, "reflex-scanner");
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
+ &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_DOUBLE);
+ g_value_set_double (&value, 30.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LATITUDE, &value);
+ g_value_set_double (&value, -12.125);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LATITUDE, &value);
+ g_value_set_double (&value, 0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+ g_value_set_double (&value, 65.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+ g_value_set_double (&value, -0.75);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
+ g_value_set_double (&value, 180.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
+ g_value_set_double (&value, 0.12345);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
+ g_value_set_double (&value, 359.9);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+ g_value_set_double (&value, 321.456);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+ g_value_set_double (&value, -12.56);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_ELEVATION, &value);
+
+ g_value_set_double (&value, 0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+ g_value_set_double (&value, 100 / 3.6);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
+
+ g_value_set_double (&value, 0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value);
+ g_value_set_double (&value, 50.25);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value);
+
+ g_value_set_double (&value, 0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
+ g_value_set_double (&value, 2.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
+ g_value_set_double (&value, 8.75);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
+
+ g_value_set_double (&value, 20.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
+ g_value_set_double (&value, 5.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
+
+ g_value_set_double (&value, 16);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_FOCAL_RATIO, &value);
+ g_value_set_double (&value, 2.7);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
+
+ g_value_set_double (&value, 96.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_IMAGE_HORIZONTAL_PPI, &value);
+ g_value_set_double (&value, 300.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_IMAGE_HORIZONTAL_PPI, &value);
+ g_value_set_double (&value, 87.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_IMAGE_VERTICAL_PPI, &value);
+ g_value_set_double (&value, 600.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_IMAGE_VERTICAL_PPI, &value);
+
+ g_value_set_double (&value, 0.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_set_double (&value, 1.0);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_set_double (&value, -2.5);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, 400);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_ISO_SPEED, &value);
+ g_value_set_int (&value, 1600);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_ISO_SPEED, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, GST_TYPE_DATE_TIME);
+ datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10);
+ g_value_set_boxed (&value, datetime);
+ gst_date_time_unref (datetime);
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ buf = gst_buffer_new_and_alloc (1024);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ for (i = 0; i < 1024; i++)
+ data[i] = i % 255;
+ gst_buffer_unmap (buf, data, 1024);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
+ do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_DATA,
+ &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value, 1, 1);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
+ gst_value_set_fraction (&value, 1, 30);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
+ gst_value_set_fraction (&value, 1, 200);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
+ gst_value_set_fraction (&value, 1, 8000);
+ do_simple_exif_tag_serialization_deserialization
+ (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
+ g_value_unset (&value);
+
+ /* flash is a little bit more tricky, because 2 tags are merged into 1 in
+ * exif */
+ taglist = gst_tag_list_new_full (GST_TAG_CAPTURING_FLASH_FIRED, FALSE,
+ GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL);
+ do_exif_tag_serialization_deserialization (taglist);
+ gst_tag_list_free (taglist);
+
+ taglist = gst_tag_list_new_full (GST_TAG_CAPTURING_FLASH_FIRED, TRUE,
+ GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL);
+ do_exif_tag_serialization_deserialization (taglist);
+ gst_tag_list_free (taglist);
+
+ taglist = gst_tag_list_new_full (GST_TAG_CAPTURING_FLASH_FIRED, FALSE,
+ GST_TAG_CAPTURING_FLASH_MODE, "never", NULL);
+ do_exif_tag_serialization_deserialization (taglist);
+ gst_tag_list_free (taglist);
+
+ taglist = gst_tag_list_new_full (GST_TAG_CAPTURING_FLASH_FIRED, TRUE,
+ GST_TAG_CAPTURING_FLASH_MODE, "always", NULL);
+ do_exif_tag_serialization_deserialization (taglist);
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+static Suite *
+tag_suite (void)
+{
+ Suite *s = suite_create ("tag support library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_musicbrainz_tag_registration);
+ tcase_add_test (tc_chain, test_parse_extended_comment);
+ tcase_add_test (tc_chain, test_vorbis_tags);
+ tcase_add_test (tc_chain, test_id3_tags);
+ tcase_add_test (tc_chain, test_id3v1_utf8_tag);
+ tcase_add_test (tc_chain, test_language_utils);
+ tcase_add_test (tc_chain, test_license_utils);
+ tcase_add_test (tc_chain, test_xmp_formatting);
+ tcase_add_test (tc_chain, test_xmp_parsing);
+ tcase_add_test (tc_chain, test_xmp_tags_serialization_deserialization);
+ tcase_add_test (tc_chain, test_xmp_compound_tags);
+ tcase_add_test (tc_chain, test_exif_parsing);
+ tcase_add_test (tc_chain, test_exif_tags_serialization_deserialization);
+ tcase_add_test (tc_chain, test_exif_multiple_tags);
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = tag_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/libs/video.c b/tests/check/libs/video.c
new file mode 100644
index 0000000..6719823
--- /dev/null
+++ b/tests/check/libs/video.c
@@ -0,0 +1,861 @@
+/* GStreamer unit test for video
+ *
+ * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
+ * Copyright (C) <2006> Jan Schmidt <thaytan@mad.scientist.com>
+ * Copyright (C) <2008> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/video/video.h>
+#include <string.h>
+
+/* These are from the current/old videotestsrc; we check our new public API
+ * in libgstvideo against the old one to make sure the sizes and offsets
+ * end up the same */
+
+typedef struct paintinfo_struct paintinfo;
+struct paintinfo_struct
+{
+ unsigned char *dest; /* pointer to first byte of video data */
+ unsigned char *yp, *up, *vp; /* pointers to first byte of each component
+ * for both packed/planar YUV and RGB */
+ unsigned char *ap; /* pointer to first byte of alpha component */
+ unsigned char *endptr; /* pointer to byte beyond last video data */
+ int ystride;
+ int ustride;
+ int vstride;
+ int width;
+ int height;
+};
+
+struct fourcc_list_struct
+{
+ const char *fourcc;
+ const char *name;
+ int bitspp;
+ void (*paint_setup) (paintinfo * p, unsigned char *dest);
+};
+
+static void paint_setup_I420 (paintinfo * p, unsigned char *dest);
+static void paint_setup_YV12 (paintinfo * p, unsigned char *dest);
+static void paint_setup_YUY2 (paintinfo * p, unsigned char *dest);
+static void paint_setup_UYVY (paintinfo * p, unsigned char *dest);
+static void paint_setup_YVYU (paintinfo * p, unsigned char *dest);
+static void paint_setup_IYU2 (paintinfo * p, unsigned char *dest);
+static void paint_setup_Y41B (paintinfo * p, unsigned char *dest);
+static void paint_setup_Y42B (paintinfo * p, unsigned char *dest);
+static void paint_setup_Y800 (paintinfo * p, unsigned char *dest);
+static void paint_setup_AYUV (paintinfo * p, unsigned char *dest);
+
+#if 0
+static void paint_setup_IMC1 (paintinfo * p, unsigned char *dest);
+static void paint_setup_IMC2 (paintinfo * p, unsigned char *dest);
+static void paint_setup_IMC3 (paintinfo * p, unsigned char *dest);
+static void paint_setup_IMC4 (paintinfo * p, unsigned char *dest);
+#endif
+static void paint_setup_YUV9 (paintinfo * p, unsigned char *dest);
+static void paint_setup_YVU9 (paintinfo * p, unsigned char *dest);
+
+int fourcc_get_size (struct fourcc_list_struct *fourcc, int w, int h);
+
+struct fourcc_list_struct fourcc_list[] = {
+/* packed */
+ {"YUY2", "YUY2", 16, paint_setup_YUY2},
+ {"UYVY", "UYVY", 16, paint_setup_UYVY},
+ {"Y422", "Y422", 16, paint_setup_UYVY},
+ {"UYNV", "UYNV", 16, paint_setup_UYVY}, /* FIXME: UYNV? */
+ {"YVYU", "YVYU", 16, paint_setup_YVYU},
+ {"AYUV", "AYUV", 32, paint_setup_AYUV},
+
+ /* interlaced */
+ /*{ "IUYV", "IUY2", 16, paint_setup_YVYU }, */
+
+ /* inverted */
+ /*{ "cyuv", "cyuv", 16, paint_setup_YVYU }, */
+
+ /*{ "Y41P", "Y41P", 12, paint_setup_YVYU }, */
+
+ /* interlaced */
+ /*{ "IY41", "IY41", 12, paint_setup_YVYU }, */
+
+ /*{ "Y211", "Y211", 8, paint_setup_YVYU }, */
+
+ /*{ "Y41T", "Y41T", 12, paint_setup_YVYU }, */
+ /*{ "Y42P", "Y42P", 16, paint_setup_YVYU }, */
+ /*{ "CLJR", "CLJR", 8, paint_setup_YVYU }, */
+ /*{ "IYU1", "IYU1", 12, paint_setup_YVYU }, */
+ {"IYU2", "IYU2", 24, paint_setup_IYU2},
+
+/* planar */
+ /* YVU9 */
+ {"YVU9", "YVU9", 9, paint_setup_YVU9},
+ /* YUV9 */
+ {"YUV9", "YUV9", 9, paint_setup_YUV9},
+ /* IF09 */
+ /* YV12 */
+ {"YV12", "YV12", 12, paint_setup_YV12},
+ /* I420 */
+ {"I420", "I420", 12, paint_setup_I420},
+ /* NV12 */
+ /* NV21 */
+#if 0
+ /* IMC1 */
+ {"IMC1", "IMC1", 16, paint_setup_IMC1},
+ /* IMC2 */
+ {"IMC2", "IMC2", 12, paint_setup_IMC2},
+ /* IMC3 */
+ {"IMC3", "IMC3", 16, paint_setup_IMC3},
+ /* IMC4 */
+ {"IMC4", "IMC4", 12, paint_setup_IMC4},
+#endif
+ /* CLPL */
+ /* Y41B */
+ {"Y41B", "Y41B", 12, paint_setup_Y41B},
+ /* Y42B */
+ {"Y42B", "Y42B", 16, paint_setup_Y42B},
+ /* Y800 grayscale */
+ {"Y800", "Y800", 8, paint_setup_Y800}
+};
+
+/* returns the size in bytes for one video frame of the given dimensions
+ * given the fourcc */
+int
+fourcc_get_size (struct fourcc_list_struct *fourcc, int w, int h)
+{
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+
+ p->width = w;
+ p->height = h;
+
+ fourcc->paint_setup (p, NULL);
+
+ return (unsigned long) p->endptr;
+}
+
+static void
+paint_setup_I420 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->up = p->yp + p->ystride * GST_ROUND_UP_2 (p->height);
+ p->ustride = GST_ROUND_UP_8 (p->width) / 2;
+ p->vp = p->up + p->ustride * GST_ROUND_UP_2 (p->height) / 2;
+ p->vstride = GST_ROUND_UP_8 (p->ystride) / 2;
+ p->endptr = p->vp + p->vstride * GST_ROUND_UP_2 (p->height) / 2;
+}
+
+static void
+paint_setup_YV12 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->vp = p->yp + p->ystride * GST_ROUND_UP_2 (p->height);
+ p->vstride = GST_ROUND_UP_8 (p->ystride) / 2;
+ p->up = p->vp + p->vstride * GST_ROUND_UP_2 (p->height) / 2;
+ p->ustride = GST_ROUND_UP_8 (p->ystride) / 2;
+ p->endptr = p->up + p->ustride * GST_ROUND_UP_2 (p->height) / 2;
+}
+
+static void
+paint_setup_AYUV (paintinfo * p, unsigned char *dest)
+{
+ p->ap = dest;
+ p->yp = dest + 1;
+ p->up = dest + 2;
+ p->vp = dest + 3;
+ p->ystride = p->width * 4;
+ p->endptr = dest + p->ystride * p->height;
+}
+
+static void
+paint_setup_YUY2 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->up = dest + 1;
+ p->vp = dest + 3;
+ p->ystride = GST_ROUND_UP_2 (p->width) * 2;
+ p->endptr = dest + p->ystride * p->height;
+}
+
+static void
+paint_setup_UYVY (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest + 1;
+ p->up = dest;
+ p->vp = dest + 2;
+ p->ystride = GST_ROUND_UP_2 (p->width) * 2;
+ p->endptr = dest + p->ystride * p->height;
+}
+
+static void
+paint_setup_YVYU (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->up = dest + 3;
+ p->vp = dest + 1;
+ p->ystride = GST_ROUND_UP_2 (p->width) * 2;
+ p->endptr = dest + p->ystride * p->height;
+}
+
+static void
+paint_setup_IYU2 (paintinfo * p, unsigned char *dest)
+{
+ /* untested */
+ p->yp = dest + 1;
+ p->up = dest + 0;
+ p->vp = dest + 2;
+ p->ystride = GST_ROUND_UP_4 (p->width * 3);
+ p->endptr = dest + p->ystride * p->height;
+}
+
+static void
+paint_setup_Y41B (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->up = p->yp + p->ystride * p->height;
+ p->ustride = GST_ROUND_UP_16 (p->width) / 4;
+ p->vp = p->up + p->ustride * p->height;
+ p->vstride = GST_ROUND_UP_16 (p->width) / 4;
+ p->endptr = p->vp + p->vstride * p->height;
+}
+
+static void
+paint_setup_Y42B (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->up = p->yp + p->ystride * p->height;
+ p->ustride = GST_ROUND_UP_8 (p->width) / 2;
+ p->vp = p->up + p->ustride * p->height;
+ p->vstride = GST_ROUND_UP_8 (p->width) / 2;
+ p->endptr = p->vp + p->vstride * p->height;
+}
+
+static void
+paint_setup_Y800 (paintinfo * p, unsigned char *dest)
+{
+ /* untested */
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->endptr = dest + p->ystride * p->height;
+}
+
+#if 0
+static void
+paint_setup_IMC1 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->up = dest + p->width * p->height;
+ p->vp = dest + p->width * p->height + p->width * p->height / 2;
+}
+
+static void
+paint_setup_IMC2 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->vp = dest + p->width * p->height;
+ p->up = dest + p->width * p->height + p->width / 2;
+}
+
+static void
+paint_setup_IMC3 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->up = dest + p->width * p->height + p->width * p->height / 2;
+ p->vp = dest + p->width * p->height;
+}
+
+static void
+paint_setup_IMC4 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->vp = dest + p->width * p->height + p->width / 2;
+ p->up = dest + p->width * p->height;
+}
+#endif
+
+static void
+paint_setup_YVU9 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->vp = p->yp + p->ystride * p->height;
+ p->vstride = GST_ROUND_UP_4 (p->ystride / 4);
+ p->up = p->vp + p->vstride * (GST_ROUND_UP_4 (p->height) / 4);
+ p->ustride = GST_ROUND_UP_4 (p->ystride / 4);
+ p->endptr = p->up + p->ustride * (GST_ROUND_UP_4 (p->height) / 4);
+}
+
+static void
+paint_setup_YUV9 (paintinfo * p, unsigned char *dest)
+{
+ p->yp = dest;
+ p->ystride = GST_ROUND_UP_4 (p->width);
+ p->up = p->yp + p->ystride * p->height;
+ p->ustride = GST_ROUND_UP_4 (p->ystride / 4);
+ p->vp = p->up + p->ustride * (GST_ROUND_UP_4 (p->height) / 4);
+ p->vstride = GST_ROUND_UP_4 (p->ystride / 4);
+ p->endptr = p->vp + p->vstride * (GST_ROUND_UP_4 (p->height) / 4);
+}
+
+#define gst_video_format_is_packed video_format_is_packed
+static gboolean
+video_format_is_packed (GstVideoFormat fmt)
+{
+ switch (fmt) {
+ case GST_VIDEO_FORMAT_I420:
+ case GST_VIDEO_FORMAT_YV12:
+ case GST_VIDEO_FORMAT_Y41B:
+ case GST_VIDEO_FORMAT_Y42B:
+ case GST_VIDEO_FORMAT_Y800:
+ case GST_VIDEO_FORMAT_YUV9:
+ case GST_VIDEO_FORMAT_YVU9:
+ return FALSE;
+ case GST_VIDEO_FORMAT_IYU1:
+ case GST_VIDEO_FORMAT_YUY2:
+ case GST_VIDEO_FORMAT_YVYU:
+ case GST_VIDEO_FORMAT_UYVY:
+ case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_BGRx:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_ABGR:
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ case GST_VIDEO_FORMAT_RGB8_PALETTED:
+ return TRUE;
+ default:
+ g_return_val_if_reached (FALSE);
+ }
+ return FALSE;
+}
+
+GST_START_TEST (test_video_formats_all)
+{
+ GstStructure *s;
+ const GValue *val, *list_val;
+ GstCaps *caps;
+ guint num, n, num_formats;
+
+ num_formats = 100;
+ fail_unless (gst_video_format_to_string (num_formats) == NULL);
+ while (gst_video_format_to_string (num_formats) == NULL)
+ --num_formats;
+ GST_INFO ("number of known video formats: %d", num_formats);
+
+ caps = gst_caps_from_string ("video/x-raw, format=" GST_VIDEO_FORMATS_ALL);
+ s = gst_caps_get_structure (caps, 0);
+ val = gst_structure_get_value (s, "format");
+ fail_unless (val != NULL);
+ fail_unless (GST_VALUE_HOLDS_LIST (val));
+ num = gst_value_list_get_size (val);
+ fail_unless (num > 0);
+ for (n = 0; n < num; ++n) {
+ const gchar *fmt_str;
+
+ list_val = gst_value_list_get_value (val, n);
+ fail_unless (G_VALUE_HOLDS_STRING (list_val));
+ fmt_str = g_value_get_string (list_val);
+ GST_INFO ("format: %s", fmt_str);
+ fail_if (gst_video_format_from_string (fmt_str) ==
+ GST_VIDEO_FORMAT_UNKNOWN);
+ }
+ fail_unless_equals_int (num, num_formats);
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_video_formats)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (fourcc_list); ++i) {
+ const GstVideoFormatInfo *vf_info;
+ GstVideoFormat fmt;
+ const gchar *s;
+ guint32 fourcc;
+ guint w, h;
+
+ s = fourcc_list[i].fourcc;
+ fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]);
+ fmt = gst_video_format_from_fourcc (fourcc);
+
+ if (fmt == GST_VIDEO_FORMAT_UNKNOWN)
+ continue;
+
+ vf_info = gst_video_format_get_info (fmt);
+ fail_unless (vf_info != NULL);
+
+ fail_unless_equals_int (GST_VIDEO_FORMAT_INFO_FORMAT (vf_info), fmt);
+
+ GST_INFO ("Fourcc %s, packed=%", fourcc_list[i].fourcc,
+ gst_video_format_is_packed (fmt));
+
+ fail_unless (GST_VIDEO_FORMAT_INFO_IS_YUV (vf_info));
+
+ /* use any non-NULL pointer so we can compare against NULL */
+ {
+ paintinfo paintinfo = { 0, };
+ fourcc_list[i].paint_setup (&paintinfo, (unsigned char *) s);
+ if (paintinfo.ap != NULL) {
+ fail_unless (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vf_info));
+ } else {
+ fail_if (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vf_info));
+ }
+ }
+
+ for (w = 1; w <= 65; ++w) {
+ for (h = 1; h <= 65; ++h) {
+ GstVideoInfo vinfo;
+ paintinfo paintinfo = { 0, };
+ guint off0, off1, off2, off3;
+ guint size;
+
+ GST_LOG ("%s, %dx%d", fourcc_list[i].fourcc, w, h);
+
+ gst_video_info_init (&vinfo);
+ gst_video_info_set_format (&vinfo, fmt, w, h);
+
+ paintinfo.width = w;
+ paintinfo.height = h;
+ fourcc_list[i].paint_setup (&paintinfo, NULL);
+ fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0),
+ paintinfo.ystride);
+ if (!gst_video_format_is_packed (fmt)
+ && !GST_VIDEO_FORMAT_INFO_IS_GRAY (vf_info)) {
+ /* planar */
+ fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 1),
+ paintinfo.ustride);
+ fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 2),
+ paintinfo.vstride);
+ /* check component_width * height against offsets/size somehow? */
+ }
+
+ size = GST_VIDEO_INFO_SIZE (&vinfo);
+ off0 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 0);
+ off1 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 1);
+ off2 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 2);
+
+ fail_unless_equals_int (size, (unsigned long) paintinfo.endptr);
+ fail_unless_equals_int (off0, (unsigned long) paintinfo.yp);
+ fail_unless_equals_int (off1, (unsigned long) paintinfo.up);
+ fail_unless_equals_int (off2, (unsigned long) paintinfo.vp);
+
+ /* should be 0 if there's no alpha component */
+ off3 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 3);
+ fail_unless_equals_int (off3, (unsigned long) paintinfo.ap);
+
+ /* some gstvideo checks ... (FIXME: fails for Y41B and Y42B; not sure
+ * if the check or the _get_component_size implementation is wrong) */
+ if (fmt != GST_VIDEO_FORMAT_Y41B && fmt != GST_VIDEO_FORMAT_Y42B
+ && fmt != GST_VIDEO_FORMAT_Y800) {
+ guint cs0, cs1, cs2, cs3;
+
+ cs0 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 0) *
+ GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0);
+ cs1 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 1) *
+ GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 1);
+ cs2 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 2) *
+ GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 2);
+
+ /* GST_LOG ("cs0=%d,cs1=%d,cs2=%d,off0=%d,off1=%d,off2=%d,size=%d",
+ cs0, cs1, cs2, off0, off1, off2, size); */
+
+ if (!gst_video_format_is_packed (fmt))
+ fail_unless (cs0 <= off1);
+
+ if (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vinfo.finfo)) {
+ cs3 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 3) *
+ GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 2);
+ fail_unless (cs3 < size);
+ /* U/V/alpha shouldn't take up more space than the Y component */
+ fail_if (cs1 > cs0, "cs1 (%d) should be <= cs0 (%d)", cs1, cs0);
+ fail_if (cs2 > cs0, "cs2 (%d) should be <= cs0 (%d)", cs2, cs0);
+ fail_if (cs3 > cs0, "cs3 (%d) should be <= cs0 (%d)", cs3, cs0);
+
+ /* all components together shouldn't take up more space than size */
+ fail_unless (cs0 + cs1 + cs2 + cs3 <= size);
+ } else {
+ /* U/V shouldn't take up more space than the Y component */
+ fail_if (cs1 > cs0, "cs1 (%d) should be <= cs0 (%d)", cs1, cs0);
+ fail_if (cs2 > cs0, "cs2 (%d) should be <= cs0 (%d)", cs2, cs0);
+
+ /* all components together shouldn't take up more space than size */
+ fail_unless (cs0 + cs1 + cs2 <= size,
+ "cs0 (%d) + cs1 (%d) + cs2 (%d) should be <= size (%d)",
+ cs0, cs1, cs2, size);
+ }
+ }
+ }
+ }
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_video_formats_rgb)
+{
+ GstVideoInfo vinfo;
+ gint width, height, framerate_n, framerate_d, par_n, par_d;
+ GstCaps *caps;
+ GstStructure *structure;
+
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_RGB, 800, 600);
+ vinfo.par_n = 1;
+ vinfo.par_d = 1;
+ vinfo.fps_n = 0;
+ vinfo.fps_d = 1;
+ caps = gst_video_info_to_caps (&vinfo);
+ structure = gst_caps_get_structure (caps, 0);
+
+ fail_unless (gst_structure_get_int (structure, "width", &width));
+ fail_unless (gst_structure_get_int (structure, "height", &height));
+ fail_unless (gst_structure_get_fraction (structure, "framerate", &framerate_n,
+ &framerate_d));
+ fail_unless (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
+ &par_n, &par_d));
+
+ fail_unless (width == 800);
+ fail_unless (height == 600);
+ fail_unless (framerate_n == 0);
+ fail_unless (framerate_d == 1);
+ fail_unless (par_n == 1);
+ fail_unless (par_d == 1);
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_dar_calc)
+{
+ guint display_ratio_n, display_ratio_d;
+
+ /* Ensure that various Display Ratio calculations are correctly done */
+ /* video 768x576, par 16/15, display par 16/15 = 4/3 */
+ fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
+ &display_ratio_d, 768, 576, 16, 15, 16, 15));
+ fail_unless (display_ratio_n == 4 && display_ratio_d == 3);
+
+ /* video 720x480, par 32/27, display par 1/1 = 16/9 */
+ fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
+ &display_ratio_d, 720, 480, 32, 27, 1, 1));
+ fail_unless (display_ratio_n == 16 && display_ratio_d == 9);
+
+ /* video 360x288, par 533333/500000, display par 16/15 =
+ * dar 1599999/1600000 */
+ fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
+ &display_ratio_d, 360, 288, 533333, 500000, 16, 15));
+ fail_unless (display_ratio_n == 1599999 && display_ratio_d == 1280000);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_parse_caps_rgb)
+{
+ struct
+ {
+ const gchar *tmpl_caps_string;
+ GstVideoFormat fmt;
+ } formats[] = {
+ /* 24 bit */
+ {
+ GST_VIDEO_CAPS_MAKE ("RGB"), GST_VIDEO_FORMAT_RGB}, {
+ GST_VIDEO_CAPS_MAKE ("BGR"), GST_VIDEO_FORMAT_BGR},
+ /* 32 bit (no alpha) */
+ {
+ GST_VIDEO_CAPS_MAKE ("RGBx"), GST_VIDEO_FORMAT_RGBx}, {
+ GST_VIDEO_CAPS_MAKE ("xRGB"), GST_VIDEO_FORMAT_xRGB}, {
+ GST_VIDEO_CAPS_MAKE ("BGRx"), GST_VIDEO_FORMAT_BGRx}, {
+ GST_VIDEO_CAPS_MAKE ("xBGR"), GST_VIDEO_FORMAT_xBGR},
+ /* 32 bit (with alpha) */
+ {
+ GST_VIDEO_CAPS_MAKE ("RGBA"), GST_VIDEO_FORMAT_RGBA}, {
+ GST_VIDEO_CAPS_MAKE ("ARGB"), GST_VIDEO_FORMAT_ARGB}, {
+ GST_VIDEO_CAPS_MAKE ("BGRA"), GST_VIDEO_FORMAT_BGRA}, {
+ GST_VIDEO_CAPS_MAKE ("ABGR"), GST_VIDEO_FORMAT_ABGR}
+ };
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (formats); ++i) {
+ GstVideoInfo vinfo;
+ GstCaps *caps, *caps2;
+
+ caps = gst_caps_from_string (formats[i].tmpl_caps_string);
+ gst_caps_set_simple (caps, "width", G_TYPE_INT, 2 * (i + 1), "height",
+ G_TYPE_INT, i + 1, "framerate", GST_TYPE_FRACTION, 15, 1,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL);
+ g_assert (gst_caps_is_fixed (caps));
+
+ GST_DEBUG ("testing caps: %" GST_PTR_FORMAT, caps);
+
+ gst_video_info_init (&vinfo);
+ fail_unless (gst_video_info_from_caps (&vinfo, caps));
+ fail_unless_equals_int (GST_VIDEO_INFO_FORMAT (&vinfo), formats[i].fmt);
+ fail_unless_equals_int (GST_VIDEO_INFO_WIDTH (&vinfo), 2 * (i + 1));
+ fail_unless_equals_int (GST_VIDEO_INFO_HEIGHT (&vinfo), i + 1);
+
+ /* make sure they're serialised back correctly */
+ caps2 = gst_video_info_to_caps (&vinfo);
+ fail_unless (caps != NULL);
+ fail_unless (gst_caps_is_equal (caps, caps2));
+
+ gst_caps_unref (caps);
+ gst_caps_unref (caps2);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_events)
+{
+ GstEvent *e;
+ gboolean in_still;
+
+ e = gst_video_event_new_still_frame (TRUE);
+ fail_if (e == NULL, "Failed to create still frame event");
+ fail_unless (gst_video_event_parse_still_frame (e, &in_still),
+ "Failed to parse still frame event");
+ fail_unless (gst_video_event_parse_still_frame (e, NULL),
+ "Failed to parse still frame event w/ in_still == NULL");
+ fail_unless (in_still == TRUE);
+ gst_event_unref (e);
+
+ e = gst_video_event_new_still_frame (FALSE);
+ fail_if (e == NULL, "Failed to create still frame event");
+ fail_unless (gst_video_event_parse_still_frame (e, &in_still),
+ "Failed to parse still frame event");
+ fail_unless (gst_video_event_parse_still_frame (e, NULL),
+ "Failed to parse still frame event w/ in_still == NULL");
+ fail_unless (in_still == FALSE);
+ gst_event_unref (e);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_convert_frame)
+{
+ GstVideoInfo vinfo;
+ GstCaps *from_caps, *to_caps;
+ GstBuffer *from_buffer, *to_buffer;
+ GError *error = NULL;
+ gint i;
+ guint8 *data;
+
+ gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);
+
+ from_buffer = gst_buffer_new_and_alloc (640 * 480 * 4);
+
+ data = gst_buffer_map (from_buffer, NULL, NULL, GST_MAP_WRITE);
+ for (i = 0; i < 640 * 480; i++) {
+ data[4 * i + 0] = 0; /* x */
+ data[4 * i + 1] = 255; /* R */
+ data[4 * i + 2] = 0; /* G */
+ data[4 * i + 3] = 0; /* B */
+ }
+ gst_buffer_unmap (from_buffer, data, 640 * 480 * 4);
+
+ gst_video_info_init (&vinfo);
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_xRGB, 640, 480);
+ vinfo.fps_n = 25;
+ vinfo.fps_d = 1;
+ vinfo.par_n = 1;
+ vinfo.par_d = 1;
+ from_caps = gst_video_info_to_caps (&vinfo);
+
+ to_caps =
+ gst_caps_from_string
+ ("something/that, does=(string)not, exist=(boolean)FALSE");
+
+ to_buffer =
+ gst_video_convert_frame (from_buffer, from_caps, to_caps,
+ GST_CLOCK_TIME_NONE, &error);
+ fail_if (to_buffer != NULL);
+ fail_unless (error != NULL);
+ g_error_free (error);
+ error = NULL;
+
+ gst_caps_unref (to_caps);
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_I420, 240, 320);
+ vinfo.fps_n = 25;
+ vinfo.fps_d = 1;
+ vinfo.par_n = 1;
+ vinfo.par_d = 2;
+ to_caps = gst_video_info_to_caps (&vinfo);
+
+ to_buffer =
+ gst_video_convert_frame (from_buffer, from_caps, to_caps,
+ GST_CLOCK_TIME_NONE, &error);
+ fail_unless (to_buffer != NULL);
+ fail_unless (error == NULL);
+
+ gst_buffer_unref (from_buffer);
+ gst_caps_unref (from_caps);
+ gst_buffer_unref (to_buffer);
+ gst_caps_unref (to_caps);
+}
+
+GST_END_TEST;
+
+typedef struct
+{
+ GMainLoop *loop;
+ GstBuffer *buffer;
+ GError *error;
+} ConvertFrameContext;
+
+static void
+convert_frame_async_callback (GstBuffer * buf, GError * err,
+ ConvertFrameContext * cf_data)
+{
+ cf_data->buffer = buf;
+ cf_data->error = err;
+
+ g_main_loop_quit (cf_data->loop);
+}
+
+GST_START_TEST (test_convert_frame_async)
+{
+ GstVideoInfo vinfo;
+ GstCaps *from_caps, *to_caps;
+ GstBuffer *from_buffer;
+ gint i;
+ guint8 *data;
+ GMainLoop *loop;
+ ConvertFrameContext cf_data = { NULL, NULL, NULL };
+
+ gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);
+
+ from_buffer = gst_buffer_new_and_alloc (640 * 480 * 4);
+
+ data = gst_buffer_map (from_buffer, NULL, NULL, GST_MAP_WRITE);
+ for (i = 0; i < 640 * 480; i++) {
+ data[4 * i + 0] = 0; /* x */
+ data[4 * i + 1] = 255; /* R */
+ data[4 * i + 2] = 0; /* G */
+ data[4 * i + 3] = 0; /* B */
+ }
+ gst_buffer_unmap (from_buffer, data, 640 * 480 * 4);
+
+ gst_video_info_init (&vinfo);
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_xRGB, 640, 470);
+ vinfo.par_n = 1;
+ vinfo.par_d = 1;
+ vinfo.fps_n = 25;
+ vinfo.fps_d = 1;
+ from_caps = gst_video_info_to_caps (&vinfo);
+
+ to_caps =
+ gst_caps_from_string
+ ("something/that, does=(string)not, exist=(boolean)FALSE");
+
+ loop = cf_data.loop = g_main_loop_new (NULL, FALSE);
+
+ gst_video_convert_frame_async (from_buffer, from_caps, to_caps,
+ GST_CLOCK_TIME_NONE,
+ (GstVideoConvertFrameCallback) convert_frame_async_callback, &cf_data,
+ NULL);
+
+ g_main_loop_run (loop);
+
+ fail_if (cf_data.buffer != NULL);
+ fail_unless (cf_data.error != NULL);
+ g_error_free (cf_data.error);
+ cf_data.error = NULL;
+
+ gst_caps_unref (to_caps);
+ gst_video_info_init (&vinfo);
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_I420, 240, 320);
+ vinfo.par_n = 1;
+ vinfo.par_d = 2;
+ vinfo.fps_n = 25;
+ vinfo.fps_d = 1;
+ to_caps = gst_video_info_to_caps (&vinfo);
+ gst_video_convert_frame_async (from_buffer, from_caps, to_caps,
+ GST_CLOCK_TIME_NONE,
+ (GstVideoConvertFrameCallback) convert_frame_async_callback, &cf_data,
+ NULL);
+ g_main_loop_run (loop);
+ fail_unless (cf_data.buffer != NULL);
+ fail_unless (cf_data.error == NULL);
+
+ gst_buffer_unref (from_buffer);
+ gst_caps_unref (from_caps);
+ gst_buffer_unref (cf_data.buffer);
+ gst_caps_unref (to_caps);
+
+ g_main_loop_unref (loop);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_video_size_from_caps)
+{
+ GstVideoInfo vinfo;
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "YV12",
+ "width", G_TYPE_INT, 640,
+ "height", G_TYPE_INT, 480, "framerate", GST_TYPE_FRACTION, 25, 1, NULL);
+
+ gst_video_info_init (&vinfo);
+ fail_unless (gst_video_info_from_caps (&vinfo, caps));
+ fail_unless (GST_VIDEO_INFO_SIZE (&vinfo) == (640 * 480 * 12 / 8));
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static Suite *
+video_suite (void)
+{
+ Suite *s = suite_create ("video support library");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_video_formats);
+ tcase_add_test (tc_chain, test_video_formats_rgb);
+ tcase_add_test (tc_chain, test_video_formats_all);
+ tcase_add_test (tc_chain, test_dar_calc);
+ tcase_add_test (tc_chain, test_parse_caps_rgb);
+ tcase_add_test (tc_chain, test_events);
+ tcase_add_test (tc_chain, test_convert_frame);
+ tcase_add_test (tc_chain, test_convert_frame_async);
+ tcase_add_test (tc_chain, test_video_size_from_caps);
+
+ return s;
+}
+
+GST_CHECK_MAIN (video);
diff --git a/tests/check/libs/xmpwriter.c b/tests/check/libs/xmpwriter.c
new file mode 100644
index 0000000..49fd1e7
--- /dev/null
+++ b/tests/check/libs/xmpwriter.c
@@ -0,0 +1,281 @@
+/* GStreamer
+ *
+ * unit tests for xmp config library
+ *
+ * Copyright (C) 2011 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/tag/tag.h>
+#include <gst/tag/xmpwriter.h>
+
+#include <string.h>
+
+#define TEST_ELEMENT_TYPE (test_element_get_type())
+
+typedef struct TestElement TestElement;
+typedef struct TestElementClass TestElementClass;
+
+struct TestElement
+{
+ GstElement parent;
+};
+
+struct TestElementClass
+{
+ GstElementClass parent_class;
+};
+
+GType test_element_get_type (void);
+
+static void init_interface (GType type);
+
+G_DEFINE_TYPE_WITH_CODE (TestElement, test_element, GST_TYPE_ELEMENT,
+ init_interface (g_define_type_id));
+
+static void
+init_interface (GType type)
+{
+ static const GInterfaceInfo tagxmpwriter_info = {
+ NULL,
+ NULL,
+ NULL,
+ };
+
+ g_type_add_interface_static (type, GST_TYPE_TAG_XMP_WRITER,
+ &tagxmpwriter_info);
+}
+
+static void
+test_element_class_init (TestElementClass * klass)
+{
+}
+
+static void
+test_element_init (TestElement * this)
+{
+}
+
+static void
+tag_list_equals (GstTagList * taglist, GstTagList * taglist2)
+{
+ const gchar *name_sent, *name_recv;
+ const GValue *value_sent, *value_recv;
+ gboolean found;
+ gint comparison;
+ gint n_recv;
+ gint n_sent;
+ gint i, j;
+
+ /* verify tags */
+ fail_unless (taglist2 != NULL);
+ n_recv = gst_structure_n_fields (taglist2);
+ n_sent = gst_structure_n_fields (taglist);
+ fail_unless (n_recv == n_sent);
+ fail_unless (n_sent > 0);
+
+ /* FIXME: compare taglist values */
+ for (i = 0; i < n_sent; i++) {
+ name_sent = gst_structure_nth_field_name (taglist, i);
+ value_sent = gst_structure_get_value (taglist, name_sent);
+ found = FALSE;
+ for (j = 0; j < n_recv; j++) {
+ name_recv = gst_structure_nth_field_name (taglist2, j);
+ if (!strcmp (name_sent, name_recv)) {
+ value_recv = gst_structure_get_value (taglist2, 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);
+ }
+ if (comparison != GST_VALUE_EQUAL &&
+ G_VALUE_HOLDS (value_sent, G_TYPE_DOUBLE)) {
+ gdouble vs;
+ gdouble vr;
+
+ /* add some tolerance for doubles */
+ vs = g_value_get_double (value_sent);
+ vr = g_value_get_double (value_recv);
+ if (vr >= vs - 0.001 && vr <= vs + 0.001)
+ comparison = GST_VALUE_EQUAL;
+ }
+ 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);
+ }
+}
+
+static gboolean
+gst_buffer_equals (GstBuffer * buf_a, GstBuffer * buf_b)
+{
+ gboolean res;
+ gpointer data1, data2;
+ gsize size1, size2;
+
+ data1 = gst_buffer_map (buf_a, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (buf_b, &size2, NULL, GST_MAP_READ);
+
+ if (size1 == size2) {
+ res = memcmp (data1, data2, size1) == 0;
+ } else {
+ res = FALSE;
+ }
+ gst_buffer_unmap (buf_a, data1, size1);
+ gst_buffer_unmap (buf_b, data2, size2);
+
+ return res;
+}
+
+static GstTagList *
+create_taglist (void)
+{
+ return gst_tag_list_new_full (GST_TAG_ARTIST, "artist",
+ GST_TAG_TITLE, "title", GST_TAG_COPYRIGHT, "copyright", NULL);
+}
+
+GST_START_TEST (test_no_xmp)
+{
+ GstTagList *taglist = create_taglist ();
+ GstElement *test_element =
+ (GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
+
+ gst_tag_xmp_writer_remove_all_schemas (GST_TAG_XMP_WRITER (test_element));
+
+ fail_unless (gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER
+ (test_element), taglist, TRUE) == NULL);
+
+ gst_object_unref (test_element);
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_default)
+{
+ GstTagList *taglist = create_taglist ();
+ GstElement *test_element =
+ (GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
+ GstBuffer *buf;
+ GstBuffer *buf2;
+
+ buf =
+ gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER
+ (test_element), taglist, TRUE);
+ buf2 = gst_tag_list_to_xmp_buffer (taglist, TRUE);
+ fail_unless (gst_buffer_equals (buf, buf2));
+
+ gst_object_unref (test_element);
+ gst_buffer_unref (buf);
+ gst_buffer_unref (buf2);
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_disable)
+{
+ GstTagList *taglist;
+ GstTagList *taglist2;
+ GstElement *test_element =
+ (GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
+ GstBuffer *buf;
+ const gchar *str;
+
+ taglist = gst_tag_list_new_full (GST_TAG_ARTIST, "artist", NULL);
+
+ /* add a tag that is mapped on xmp schema (as of Mar, 21th 2011) */
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_USER_RATING, 5,
+ NULL);
+
+ buf =
+ gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER
+ (test_element), taglist, TRUE);
+ taglist2 = gst_tag_list_from_xmp_buffer (buf);
+ tag_list_equals (taglist, taglist2);
+ gst_tag_list_free (taglist2);
+ gst_buffer_unref (buf);
+
+ gst_tag_xmp_writer_remove_schema (GST_TAG_XMP_WRITER (test_element), "xap");
+ buf =
+ gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER
+ (test_element), taglist, TRUE);
+ taglist2 = gst_tag_list_from_xmp_buffer (buf);
+
+ /* artist should be there, but rating shouldn't */
+ fail_unless (gst_tag_list_peek_string_index (taglist2, GST_TAG_ARTIST, 0,
+ &str));
+ fail_unless (gst_tag_list_get_value_index (taglist2, GST_TAG_USER_RATING,
+ 0) == NULL);
+
+ gst_tag_list_free (taglist2);
+ gst_buffer_unref (buf);
+
+ gst_object_unref (test_element);
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+xmp_config_suite (void)
+{
+ Suite *s = suite_create ("xmpconfig interface");
+ TCase *tc_chain = tcase_create ("configuration");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_no_xmp);
+ tcase_add_test (tc_chain, test_default);
+ tcase_add_test (tc_chain, test_disable);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = xmp_config_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/gio.c b/tests/check/pipelines/gio.c
new file mode 100644
index 0000000..10b9213
--- /dev/null
+++ b/tests/check/pipelines/gio.c
@@ -0,0 +1,180 @@
+/* GStreamer
+ *
+ * unit test for GIO
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.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 <gst/check/gstcheck.h>
+#include <gst/check/gstbufferstraw.h>
+#include <gio/gio.h>
+
+static gboolean got_eos = FALSE;
+
+static gboolean
+message_handler (GstBus * bus, GstMessage * msg, gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS:
+ got_eos = TRUE;
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_ERROR:{
+ gchar *debug;
+ GError *err;
+
+ gst_message_parse_error (msg, &err, &debug);
+ g_free (debug);
+
+ /* Will abort the check */
+ g_warning ("Error: %s\n", err->message);
+ g_error_free (err);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+GST_START_TEST (test_memory_stream)
+{
+ GMainLoop *loop;
+ GstElement *bin;
+ GstElement *src, *sink;
+ GstBus *bus;
+ GMemoryInputStream *input;
+ GMemoryOutputStream *output;
+ guint8 *in_data;
+ guint8 *out_data;
+ gint i;
+ gint64 duration;
+ guint bus_watch = 0;
+
+ got_eos = FALSE;
+
+ in_data = g_new (guint8, 512);
+ out_data = g_new (guint8, 512);
+ for (i = 0; i < 512; i++)
+ in_data[i] = i % 256;
+
+ input =
+ G_MEMORY_INPUT_STREAM (g_memory_input_stream_new_from_data (in_data, 512,
+ (GDestroyNotify) g_free));
+
+ output = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (out_data, 512,
+ (GReallocFunc) g_realloc, (GDestroyNotify) g_free));
+ out_data = NULL;
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ bin = gst_pipeline_new ("bin");
+
+ src = gst_element_factory_make ("giostreamsrc", "src");
+ fail_unless (src != NULL);
+ g_object_set (G_OBJECT (src), "stream", input, NULL);
+
+ sink = gst_element_factory_make ("giostreamsink", "sink");
+ fail_unless (sink != NULL);
+ g_object_set (G_OBJECT (sink), "stream", output, NULL);
+
+ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
+
+ fail_unless (gst_element_link_many (src, sink, NULL));
+
+ bus = gst_element_get_bus (bin);
+ bus_watch = gst_bus_add_watch (bus, message_handler, loop);
+ gst_object_unref (bus);
+
+ gst_element_set_state (bin, GST_STATE_PAUSED);
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ fail_unless (gst_element_query_duration (bin, GST_FORMAT_BYTES, &duration));
+ fail_unless_equals_int (duration, 512);
+
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ fail_unless (got_eos);
+ got_eos = FALSE;
+
+ out_data = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (output));
+
+ for (i = 0; i < 512; i++)
+ fail_unless_equals_int (in_data[i], out_data[i]);
+
+ gst_element_set_state (bin, GST_STATE_PAUSED);
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ fail_unless (gst_element_query_duration (bin, GST_FORMAT_BYTES, &duration));
+ fail_unless_equals_int (duration, 512);
+
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bin);
+
+ fail_unless (got_eos);
+
+ g_object_unref (input);
+ g_object_unref (output);
+
+ g_main_loop_unref (loop);
+ g_source_remove (bus_watch);
+}
+
+GST_END_TEST;
+
+static Suite *
+gio_testsuite (void)
+{
+ Suite *s = suite_create ("gio");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_memory_stream);
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = gio_testsuite ();
+ 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/oggmux.c b/tests/check/pipelines/oggmux.c
new file mode 100644
index 0000000..6b072bc
--- /dev/null
+++ b/tests/check/pipelines/oggmux.c
@@ -0,0 +1,432 @@
+/* GStreamer
+ *
+ * unit tests for oggmux
+ *
+ * Copyright (C) 2006 James Livingston <doclivingston at 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/check/gstcheck.h>
+#include <ogg/ogg.h>
+
+
+typedef enum
+{
+ CODEC_UNKNOWN,
+ CODEC_VORBIS,
+ CODEC_THEORA,
+ CODEC_SPEEX,
+} ChainCodec;
+
+typedef struct
+{
+ gboolean eos;
+ gulong serialno;
+ gint64 last_granule;
+ ChainCodec codec;
+} ChainState;
+
+#if (defined (HAVE_THEORA) || defined (HAVE_VORBIS))
+static ogg_sync_state oggsync;
+static GHashTable *eos_chain_states;
+static gulong probe_id;
+
+static ChainCodec
+get_page_codec (ogg_page * page)
+{
+ ChainCodec codec = CODEC_UNKNOWN;
+ ogg_stream_state state;
+ ogg_packet packet;
+
+ ogg_stream_init (&state, ogg_page_serialno (page));
+ if (ogg_stream_pagein (&state, page) == 0) {
+ if (ogg_stream_packetpeek (&state, &packet) > 0) {
+ if (strncmp ((char *) &packet.packet[1], "vorbis",
+ strlen ("vorbis")) == 0)
+ codec = CODEC_VORBIS;
+ else if (strncmp ((char *) &packet.packet[1], "theora",
+ strlen ("theora")) == 0)
+ codec = CODEC_THEORA;
+ else if (strncmp ((char *) &packet.packet[0], "Speex ",
+ strlen ("Speex ")) == 0)
+ codec = CODEC_SPEEX;
+ }
+ }
+ ogg_stream_clear (&state);
+
+ return codec;
+}
+
+static void
+fail_if_audio (gpointer key, ChainState * state, gpointer data)
+{
+ fail_if (state->codec == CODEC_VORBIS,
+ "vorbis BOS occurred before theora BOS");
+ fail_if (state->codec == CODEC_SPEEX, "speex BOS occurred before theora BOS");
+}
+
+static ChainState *
+validate_ogg_page (ogg_page * page)
+{
+ gulong serialno;
+ gint64 granule;
+ ChainState *state;
+
+ serialno = ogg_page_serialno (page);
+ granule = ogg_page_granulepos (page);
+ state = g_hash_table_lookup (eos_chain_states, GINT_TO_POINTER (serialno));
+
+ fail_if (ogg_page_packets (page) == 0 && granule != -1,
+ "Must have granulepos -1 when page has no packets, has %" G_GINT64_FORMAT,
+ granule);
+
+ if (ogg_page_bos (page)) {
+ fail_unless (state == NULL, "Extraneous BOS flag on chain %u", serialno);
+
+ state = g_new0 (ChainState, 1);
+ g_hash_table_insert (eos_chain_states, GINT_TO_POINTER (serialno), state);
+ state->serialno = serialno;
+ state->last_granule = granule;
+ state->codec = get_page_codec (page);
+
+ /* check for things like BOS ordering, etc */
+ switch (state->codec) {
+ case CODEC_THEORA:
+ /* check we have no vorbis/speex chains yet */
+ g_hash_table_foreach (eos_chain_states, (GHFunc) fail_if_audio, NULL);
+ break;
+ case CODEC_VORBIS:
+ case CODEC_SPEEX:
+ /* no checks (yet) */
+ break;
+ case CODEC_UNKNOWN:
+ default:
+ break;
+ }
+ } else if (ogg_page_eos (page)) {
+ fail_unless (state != NULL, "Missing BOS flag on chain %u", serialno);
+ state->eos = TRUE;
+ } else {
+ fail_unless (state != NULL, "Missing BOS flag on chain %u", serialno);
+ fail_unless (!state->eos, "Data after EOS flag on chain %u", serialno);
+ }
+
+ if (granule != -1) {
+ fail_unless (granule >= state->last_granule,
+ "Granulepos out-of-order for chain %u: old=%" G_GINT64_FORMAT ", new="
+ G_GINT64_FORMAT, serialno, state->last_granule, granule);
+ state->last_granule = granule;
+ }
+
+ return state;
+}
+
+static void
+is_video (gpointer key, ChainState * state, gpointer data)
+{
+ if (state->codec == CODEC_THEORA)
+ *((gboolean *) data) = TRUE;
+}
+
+static gboolean
+check_chain_final_state (gpointer key, ChainState * state, gpointer data)
+{
+ fail_unless (state->eos, "missing EOS flag on chain %u", state->serialno);
+
+ /* return TRUE to empty the chain table */
+ return TRUE;
+}
+
+static GstProbeReturn
+eos_buffer_probe (GstPad * pad, GstProbeType type, GstBuffer * buffer,
+ gpointer unused)
+{
+ gint ret;
+ gint size;
+ gchar *oggbuffer;
+ ChainState *state = NULL;
+ gboolean has_video = FALSE;
+
+ size = gst_buffer_get_size (buffer);
+
+ oggbuffer = ogg_sync_buffer (&oggsync, size);
+ gst_buffer_extract (buffer, 0, oggbuffer, size);
+ ogg_sync_wrote (&oggsync, size);
+
+ do {
+ ogg_page page;
+
+ ret = ogg_sync_pageout (&oggsync, &page);
+ if (ret > 0)
+ state = validate_ogg_page (&page);
+ }
+ while (ret != 0);
+
+ if (state) {
+ /* Now, we can do buffer-level checks...
+ * If we have video somewhere, then we should have DELTA_UNIT set on all
+ * non-header (not IN_CAPS), non-video buffers
+ */
+ g_hash_table_foreach (eos_chain_states, (GHFunc) is_video, &has_video);
+ if (has_video && state->codec != CODEC_THEORA) {
+ if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS))
+ fail_unless (GST_BUFFER_FLAG_IS_SET (buffer,
+ GST_BUFFER_FLAG_DELTA_UNIT),
+ "Non-video buffer doesn't have DELTA_UNIT in stream with video");
+ }
+ }
+
+ return GST_PROBE_OK;
+}
+
+static void
+start_pipeline (GstElement * bin, GstPad * pad)
+{
+ GstStateChangeReturn ret;
+
+ ogg_sync_init (&oggsync);
+
+ eos_chain_states =
+ g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+ probe_id =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) eos_buffer_probe, NULL, NULL);
+
+ ret = gst_element_set_state (bin, GST_STATE_PLAYING);
+ fail_if (ret == GST_STATE_CHANGE_FAILURE, "Could not start test pipeline");
+ if (ret == GST_STATE_CHANGE_ASYNC) {
+ ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not start test pipeline");
+ }
+}
+
+static void
+stop_pipeline (GstElement * bin, GstPad * pad)
+{
+ GstStateChangeReturn ret;
+
+ ret = gst_element_set_state (bin, GST_STATE_NULL);
+ fail_if (ret == GST_STATE_CHANGE_FAILURE, "Could not stop test pipeline");
+ if (ret == GST_STATE_CHANGE_ASYNC) {
+ ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not stop test pipeline");
+ }
+
+ gst_pad_remove_probe (pad, probe_id);
+ ogg_sync_clear (&oggsync);
+
+ /* check end conditions, such as EOS flags */
+ g_hash_table_foreach_remove (eos_chain_states,
+ (GHRFunc) check_chain_final_state, NULL);
+}
+
+static gboolean
+eos_watch (GstBus * bus, GstMessage * message, GMainLoop * loop)
+{
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_EOS) {
+ g_main_loop_quit (loop);
+ }
+ return TRUE;
+}
+
+static void
+test_pipeline (const char *pipeline)
+{
+ GstElement *bin, *sink;
+ GstPad *pad, *sinkpad;
+ GstBus *bus;
+ GError *error = NULL;
+ GMainLoop *loop;
+ GstPadLinkReturn linkret;
+ guint bus_watch = 0;
+
+ bin = gst_parse_launch (pipeline, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ pad = gst_bin_find_unlinked_pad (GST_BIN (bin), GST_PAD_SRC);
+ fail_unless (pad != NULL, "Could not locate free src pad");
+
+ /* connect the fake sink */
+ sink = gst_element_factory_make ("fakesink", "fake_sink");
+ fail_unless (sink != NULL, "Could create fakesink");
+ fail_unless (gst_bin_add (GST_BIN (bin), sink), "Could not insert fakesink");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (sinkpad != NULL, "Could not get fakesink src pad");
+
+ linkret = gst_pad_link (pad, sinkpad);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (linkret),
+ "Could not link to fake sink");
+ gst_object_unref (sinkpad);
+
+ /* run until we receive EOS */
+ loop = g_main_loop_new (NULL, FALSE);
+ bus = gst_element_get_bus (bin);
+ bus_watch = gst_bus_add_watch (bus, (GstBusFunc) eos_watch, loop);
+ gst_object_unref (bus);
+
+ start_pipeline (bin, pad);
+ g_main_loop_run (loop);
+
+ /* we're EOS now; make sure oggmux out caps have stream headers on them */
+ {
+ GstStructure *s;
+ GstCaps *muxcaps;
+
+ muxcaps = gst_pad_get_current_caps (sinkpad);
+ fail_unless (muxcaps != NULL);
+ s = gst_caps_get_structure (muxcaps, 0);
+ fail_unless (gst_structure_has_name (s, "application/ogg"));
+ fail_unless (gst_structure_has_field (s, "streamheader"));
+ fail_unless (gst_structure_has_field_typed (s, "streamheader",
+ GST_TYPE_ARRAY));
+ gst_caps_unref (muxcaps);
+ }
+
+ stop_pipeline (bin, pad);
+
+ /* clean up */
+ g_main_loop_unref (loop);
+ g_source_remove (bus_watch);
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+#endif
+
+#ifdef HAVE_VORBIS
+GST_START_TEST (test_vorbis)
+{
+ test_pipeline
+ ("audiotestsrc num-buffers=5 ! audioconvert ! vorbisenc ! oggmux");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_vorbis_oggmux_unlinked)
+{
+ GstElement *pipe;
+ GstMessage *msg;
+
+ pipe = gst_parse_launch ("audiotestsrc ! vorbisenc ! oggmux", NULL);
+ if (pipe == NULL) {
+ g_printerr ("Skipping test 'test_vorbis_oggmux_unlinked'");
+ return;
+ }
+ /* no sink, no async state change */
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
+ GST_STATE_CHANGE_SUCCESS);
+ /* we expect an error (without any criticals/warnings) */
+ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe), -1,
+ GST_MESSAGE_ERROR);
+ gst_message_unref (msg);
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+#endif
+
+#ifdef HAVE_THEORA
+GST_START_TEST (test_theora)
+{
+ test_pipeline
+ ("videotestsrc num-buffers=5 ! videoconvert ! theoraenc ! oggmux");
+}
+
+GST_END_TEST;
+#endif
+
+#if (defined (HAVE_THEORA) && defined (HAVE_VORBIS))
+GST_START_TEST (test_theora_vorbis)
+{
+ test_pipeline
+ ("videotestsrc num-buffers=10 ! videoconvert ! theoraenc ! queue ! oggmux name=mux "
+ "audiotestsrc num-buffers=2 ! audioconvert ! vorbisenc ! queue ! mux.");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_vorbis_theora)
+{
+ test_pipeline
+ ("videotestsrc num-buffers=2 ! videoconvert ! theoraenc ! queue ! oggmux name=mux "
+ "audiotestsrc num-buffers=10 ! audioconvert ! vorbisenc ! queue ! mux.");
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (test_simple_cleanup)
+{
+ GstElement *oggmux;
+
+ oggmux = gst_element_factory_make ("oggmux", NULL);
+ gst_object_unref (oggmux);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_request_pad_cleanup)
+{
+ GstElement *oggmux;
+ GstPad *pad;
+
+ oggmux = gst_element_factory_make ("oggmux", NULL);
+ pad = gst_element_get_request_pad (oggmux, "sink_%d");
+ fail_unless (pad != NULL);
+ gst_object_unref (pad);
+ pad = gst_element_get_request_pad (oggmux, "sink_%d");
+ fail_unless (pad != NULL);
+ gst_object_unref (pad);
+ gst_object_unref (oggmux);
+}
+
+GST_END_TEST;
+
+static Suite *
+oggmux_suite (void)
+{
+ Suite *s = suite_create ("oggmux");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+#ifdef HAVE_VORBIS
+ tcase_add_test (tc_chain, test_vorbis);
+ tcase_add_test (tc_chain, test_vorbis_oggmux_unlinked);
+#endif
+
+#ifdef HAVE_THEORA
+ tcase_add_test (tc_chain, test_theora);
+#endif
+
+#if (defined (HAVE_THEORA) && defined (HAVE_VORBIS))
+ tcase_add_test (tc_chain, test_vorbis_theora);
+ tcase_add_test (tc_chain, test_theora_vorbis);
+#endif
+
+ tcase_add_test (tc_chain, test_simple_cleanup);
+ tcase_add_test (tc_chain, test_request_pad_cleanup);
+ return s;
+}
+
+GST_CHECK_MAIN (oggmux);
diff --git a/tests/check/pipelines/simple-launch-lines.c b/tests/check/pipelines/simple-launch-lines.c
new file mode 100644
index 0000000..5c3218b
--- /dev/null
+++ b/tests/check/pipelines/simple-launch-lines.c
@@ -0,0 +1,237 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * 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 <gst/check/gstcheck.h>
+
+#ifndef GST_DISABLE_PARSE
+
+static GstElement *
+setup_pipeline (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+
+ GST_LOG ("pipeline: %s", pipe_descr);
+ 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)
+{
+ 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, GST_STATE_PLAYING) ==
+ 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 PLAYING fast enough", descr);
+ goto done;
+ } else if (ret != GST_STATE_CHANGE_SUCCESS) {
+ g_critical ("Pipeline '%s' failed to go into PLAYING state", descr);
+ 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_element_negotiation)
+{
+ const gchar *s;
+
+ /* Ensures that filtering buffers with unknown caps down to fixed-caps
+ * will apply those caps to the buffers.
+ * see http://bugzilla.gnome.org/show_bug.cgi?id=315126 */
+ s = "fakesrc num-buffers=2 ! "
+ "audio/x-raw,format=S16LE,rate=22050,channels=1 ! "
+ "audioconvert ! audio/x-raw,format=S16LE,rate=22050,channels=1 "
+ "! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+
+#ifdef HAVE_LIBVISUAL
+ s = "audiotestsrc num-buffers=30 ! tee name=t ! alsasink t. ! audioconvert ! "
+ "libvisual_lv_scope ! videoconvert ! xvimagesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+#endif
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_basetransform_based)
+{
+ /* Each of these tests is to check whether various basetransform based
+ * elements can select output caps when not allowed to do passthrough
+ * and going to a generic sink such as fakesink or filesink */
+ const gchar *s;
+
+ /* Check that videoscale can pick a height given only a width */
+ s = "videotestsrc num-buffers=2 ! "
+ "video/x-raw,format=(string)I420,width=320,height=240 ! "
+ "videoscale ! video/x-raw,width=640 ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+
+ /* Test that videoconvert can pick an output format that isn't
+ * passthrough without completely specified output caps */
+ s = "videotestsrc num-buffers=2 ! "
+ "video/x-raw,format=(string)I420,width=320,height=240 ! "
+ "videoconvert ! video/x-raw,format=(string)RGB ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+
+ /* Check that audioresample can pick a samplerate to use from a
+ * range that doesn't include the input */
+ s = "audiotestsrc num-buffers=2 ! "
+ "audio/x-raw,format=S16LE,rate=8000 ! "
+ "audioresample ! audio/x-raw,rate=[16000,48000] ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+
+ /* Check that audioconvert can pick a depth to use, given a width */
+ s = "audiotestsrc num-buffers=30 ! audio/x-raw,format=S16LE ! "
+ "audioconvert ! " "audio/x-raw,format=S32LE ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+
+ /* Check that videoscale doesn't claim to be able to transform input in
+ * formats it can't handle for a given scaling method; videoconvert
+ * should then make sure a format that can be handled is chosen (4-tap
+ * scaling is not implemented for RGB and packed yuv currently) */
+ s = "videotestsrc num-buffers=2 ! video/x-raw,format=(string)ARGB64 ! "
+ "videoconvert ! videoscale method=4-tap ! videoconvert ! "
+ "video/x-raw,format=(string)RGB, width=32,height=32,framerate=(fraction)30/1,"
+ "pixel-aspect-ratio=(fraction)1/1 ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+ s = "videotestsrc num-buffers=2 ! video/x-raw,format=(string)AYUV,"
+ "width=64,height=64 ! videoconvert ! videoscale method=4-tap ! "
+ "videoconvert ! video/x-raw,format=(string)AYUV,width=32,"
+ "height=32 ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+ /* make sure nothing funny happens in passthrough mode (we don't check that
+ * passthrough mode is chosen though) */
+ s = "videotestsrc num-buffers=2 ! video/x-raw,format=(string)I420,"
+ "width=64,height=64 ! videoconvert ! videoscale method=4-tap ! "
+ "videoconvert ! video/x-raw,format=(string)I420,width=32,"
+ "height=32 ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
+ GST_MESSAGE_UNKNOWN);
+}
+
+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_element_negotiation);
+ tcase_add_test (tc_chain, test_basetransform_based);
+#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/theoraenc.c b/tests/check/pipelines/theoraenc.c
new file mode 100644
index 0000000..88eb373
--- /dev/null
+++ b/tests/check/pipelines/theoraenc.c
@@ -0,0 +1,467 @@
+/* GStreamer
+ *
+ * unit test for theoraenc
+ *
+ * Copyright (C) 2006 Andy Wingo <wingo at pobox.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/check/gstbufferstraw.h>
+
+#include <theora/theora.h>
+
+#ifndef GST_DISABLE_PARSE
+
+#define TIMESTAMP_OFFSET G_GINT64_CONSTANT(3249870963)
+#define FRAMERATE 10
+
+/* I know all of these have a shift of 6 bits */
+#define GRANULEPOS_SHIFT 6
+
+
+#define check_buffer_is_header(buffer,is_header) \
+ fail_unless (GST_BUFFER_FLAG_IS_SET (buffer, \
+ GST_BUFFER_FLAG_IN_CAPS) == is_header, \
+ "GST_BUFFER_IN_CAPS is set to %d but expected %d", \
+ GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS), is_header)
+
+#define check_buffer_timestamp(buffer,timestamp) \
+ fail_unless (GST_BUFFER_TIMESTAMP (buffer) == timestamp, \
+ "expected timestamp %" GST_TIME_FORMAT \
+ ", but got timestamp %" GST_TIME_FORMAT, \
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)))
+
+#define check_buffer_duration(buffer,duration) \
+ fail_unless (GST_BUFFER_DURATION (buffer) == duration, \
+ "expected duration %" GST_TIME_FORMAT \
+ ", but got duration %" GST_TIME_FORMAT, \
+ GST_TIME_ARGS (duration), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)))
+
+static gboolean old_libtheora;
+
+static void
+check_libtheora (void)
+{
+ old_libtheora = (theora_version_number () <= 0x00030200);
+}
+
+static void
+check_buffer_granulepos (GstBuffer * buffer, gint64 granulepos)
+{
+ GstClockTime clocktime;
+ int framecount;
+
+ /* With old versions of libtheora, the granulepos represented the
+ * start time, not end time. Adapt for that. */
+ if (old_libtheora) {
+ if (granulepos >> GRANULEPOS_SHIFT)
+ granulepos -= 1 << GRANULEPOS_SHIFT;
+ else if (granulepos)
+ granulepos -= 1;
+ }
+
+ fail_unless (GST_BUFFER_OFFSET_END (buffer) == granulepos,
+ "expected granulepos %" G_GUINT64_FORMAT
+ ", but got granulepos %" G_GUINT64_FORMAT,
+ granulepos, GST_BUFFER_OFFSET_END (buffer));
+
+ /* contrary to what we record as TIMESTAMP, we can use OFFSET to check
+ * the granulepos correctly here */
+ framecount = GST_BUFFER_OFFSET_END (buffer);
+ framecount = granulepos >> GRANULEPOS_SHIFT;
+ framecount += granulepos & ((1 << GRANULEPOS_SHIFT) - 1);
+ clocktime = gst_util_uint64_scale (framecount, GST_SECOND, FRAMERATE);
+
+ fail_unless (clocktime == GST_BUFFER_OFFSET (buffer),
+ "expected OFFSET set to clocktime %" GST_TIME_FORMAT
+ ", but got %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (clocktime), GST_TIME_ARGS (GST_BUFFER_OFFSET (buffer)));
+}
+
+/* this check is here to check that the granulepos we derive from the
+ timestamp is about correct. This is "about correct" because you can't
+ precisely go from timestamp to granulepos due to the downward-rounding
+ characteristics of gst_util_uint64_scale, so you check if granulepos is
+ equal to the number, or the number plus one. */
+/* should be from_endtime, but theora's granulepos mapping is "special" */
+static void
+check_buffer_granulepos_from_starttime (GstBuffer * buffer,
+ GstClockTime starttime)
+{
+ gint64 granulepos, expected, framecount;
+
+ granulepos = GST_BUFFER_OFFSET_END (buffer);
+ /* Now convert to 'granulepos for start time', depending on libtheora
+ * version */
+ if (!old_libtheora) {
+ if (granulepos & ((1 << GRANULEPOS_SHIFT) - 1))
+ granulepos -= 1;
+ else if (granulepos)
+ granulepos -= 1 << GRANULEPOS_SHIFT;
+ }
+
+ framecount = granulepos >> GRANULEPOS_SHIFT;
+ framecount += granulepos & ((1 << GRANULEPOS_SHIFT) - 1);
+ expected = gst_util_uint64_scale (starttime, FRAMERATE, GST_SECOND);
+
+ fail_unless (framecount == expected || framecount == expected + 1,
+ "expected frame count %" G_GUINT64_FORMAT
+ " or %" G_GUINT64_FORMAT
+ ", but got frame count %" G_GUINT64_FORMAT,
+ expected, expected + 1, framecount);
+}
+
+GST_START_TEST (test_granulepos_offset)
+{
+ GstElement *bin;
+ GstPad *pad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+
+ pipe_str = g_strdup_printf ("videotestsrc timestamp-offset=%" G_GUINT64_FORMAT
+ " num-buffers=10 ! video/x-raw,format=(string)I420,framerate=10/1"
+ " ! theoraenc ! fakesink name=fs0", TIMESTAMP_OFFSET);
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fs0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* header packets should have timestamp == NONE, granulepos 0, IN_CAPS */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ {
+ GstClockTime next_timestamp;
+ gint64 last_granulepos;
+
+ /* first buffer should have timestamp of TIMESTAMP_OFFSET, granulepos to
+ * match the timestamp of the end of the last sample in the output buffer.
+ * Note that one cannot go timestamp->granulepos->timestamp and get the
+ * same value due to loss of precision with granulepos. theoraenc does
+ * take care to timestamp correctly based on the offset of the input data
+ * however, so it does do sub-granulepos timestamping. */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ last_granulepos = GST_BUFFER_OFFSET_END (buffer);
+ check_buffer_timestamp (buffer, TIMESTAMP_OFFSET);
+ /* don't really have a good way of checking duration... */
+ check_buffer_granulepos_from_starttime (buffer, TIMESTAMP_OFFSET);
+ check_buffer_is_header (buffer, FALSE);
+
+ next_timestamp = TIMESTAMP_OFFSET + GST_BUFFER_DURATION (buffer);
+
+ gst_buffer_unref (buffer);
+
+ /* check continuity with the next buffer */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, next_timestamp);
+ check_buffer_duration (buffer,
+ gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), GST_SECOND,
+ FRAMERATE)
+ - gst_util_uint64_scale (last_granulepos, GST_SECOND, FRAMERATE));
+ check_buffer_granulepos_from_starttime (buffer, next_timestamp);
+ check_buffer_is_header (buffer, FALSE);
+
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_continuity)
+{
+ GstElement *bin;
+ GstPad *pad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+
+ pipe_str = g_strdup_printf ("videotestsrc num-buffers=10"
+ " ! video/x-raw,format=(string)I420,framerate=10/1"
+ " ! theoraenc ! fakesink name=fs0");
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fs0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* header packets should have timestamp == NONE, granulepos 0 */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ {
+ GstClockTime next_timestamp;
+
+ /* first buffer should have timestamp of TIMESTAMP_OFFSET, granulepos to
+ * match the timestamp of the end of the last sample in the output buffer.
+ * Note that one cannot go timestamp->granulepos->timestamp and get the
+ * same value due to loss of precision with granulepos. theoraenc does
+ * take care to timestamp correctly based on the offset of the input data
+ * however, so it does do sub-granulepos timestamping. */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, 0);
+ /* plain division because I know the answer is exact */
+ check_buffer_duration (buffer, GST_SECOND / 10);
+ check_buffer_granulepos (buffer, 1 << GRANULEPOS_SHIFT);
+ check_buffer_is_header (buffer, FALSE);
+
+ next_timestamp = GST_BUFFER_DURATION (buffer);
+
+ gst_buffer_unref (buffer);
+
+ /* check continuity with the next buffer */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, next_timestamp);
+ check_buffer_duration (buffer, GST_SECOND / 10);
+ check_buffer_granulepos (buffer, (1 << GRANULEPOS_SHIFT) | 1);
+ check_buffer_is_header (buffer, FALSE);
+
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+static GstProbeReturn
+drop_second_data_buffer (GstPad * droppad, GstProbeType probe_type,
+ gpointer probe_obj, gpointer unused)
+{
+ GstBuffer *buffer = probe_obj;
+
+ if (GST_BUFFER_OFFSET (buffer) == 1)
+ return GST_PROBE_DROP;
+ else
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_discontinuity)
+{
+ GstElement *bin;
+ GstPad *pad, *droppad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+ guint drop_id;
+
+ pipe_str = g_strdup_printf ("videotestsrc num-buffers=10"
+ " ! video/x-raw,format=(string)I420,framerate=10/1"
+ " ! theoraenc ! fakesink name=fs0");
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* the plan: same as test_continuity, but dropping a buffer and seeing if
+ theoraenc correctly notes the discontinuity */
+
+ /* get the pad to use to drop buffers */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "theoraenc0");
+
+ fail_unless (sink != NULL, "Could not get theoraenc out of bin");
+ droppad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (droppad != NULL, "Could not get pad out of theoraenc");
+ gst_object_unref (sink);
+ }
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fs0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ drop_id = gst_pad_add_probe (droppad, GST_PROBE_TYPE_BUFFER,
+ drop_second_data_buffer, NULL, NULL);
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* header packets should have timestamp == NONE, granulepos 0 */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ check_buffer_is_header (buffer, TRUE);
+ gst_buffer_unref (buffer);
+
+ {
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, 0);
+ /* plain division because I know the answer is exact */
+ check_buffer_duration (buffer, GST_SECOND / 10);
+ check_buffer_granulepos (buffer, 1 << GRANULEPOS_SHIFT);
+ check_buffer_is_header (buffer, FALSE);
+ fail_if (GST_BUFFER_IS_DISCONT (buffer), "expected continuous buffer yo");
+ gst_buffer_unref (buffer);
+
+ /* check discontinuity with the next buffer */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_duration (buffer, GST_SECOND / 10);
+ /* After a discont, we'll always get a keyframe, so this one should be
+ * 3<<GRANULEPOS_SHIFT */
+ check_buffer_granulepos (buffer, 3 << GRANULEPOS_SHIFT);
+ check_buffer_is_header (buffer, FALSE);
+ fail_unless (GST_BUFFER_IS_DISCONT (buffer),
+ "expected discontinuous buffer yo");
+ gst_buffer_unref (buffer);
+
+ /* Then the buffer after that should be continuous */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ fail_if (GST_BUFFER_IS_DISCONT (buffer), "expected continuous buffer yo");
+ /* plain division because I know the answer is exact */
+ check_buffer_duration (buffer, GST_SECOND / 10);
+ check_buffer_granulepos (buffer, (3 << GRANULEPOS_SHIFT) | 1);
+ check_buffer_is_header (buffer, FALSE);
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+ gst_pad_remove_probe (droppad, drop_id);
+
+ gst_object_unref (droppad);
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+#endif /* #ifndef GST_DISABLE_PARSE */
+
+static Suite *
+theoraenc_suite (void)
+{
+ Suite *s = suite_create ("theoraenc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ check_libtheora ();
+
+#ifndef GST_DISABLE_PARSE
+ tcase_add_test (tc_chain, test_granulepos_offset);
+ tcase_add_test (tc_chain, test_continuity);
+ tcase_add_test (tc_chain, test_discontinuity);
+#endif
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = theoraenc_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/vorbisdec.c b/tests/check/pipelines/vorbisdec.c
new file mode 100644
index 0000000..1df6741
--- /dev/null
+++ b/tests/check/pipelines/vorbisdec.c
@@ -0,0 +1,118 @@
+/* GStreamer
+ *
+ * unit test for vorbisdec
+ *
+ * Copyright (C) 2007 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 <gst/check/gstcheck.h>
+#include <gst/check/gstbufferstraw.h>
+
+#ifndef GST_DISABLE_PARSE
+
+static GMainLoop *loop;
+static gint messages = 0;
+
+static void
+element_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ gchar *s;
+
+ s = gst_structure_to_string (gst_message_get_structure (message));
+ GST_DEBUG ("Received message: %s", s);
+ g_free (s);
+
+ messages++;
+}
+
+static void
+eos_message_cb (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GST_DEBUG ("Received eos");
+ g_main_loop_quit (loop);
+}
+
+GST_START_TEST (test_timestamps)
+{
+ GstElement *pipeline;
+ gchar *pipe_str;
+ GstBus *bus;
+ GError *error = NULL;
+
+ pipe_str = g_strdup_printf ("audiotestsrc num-buffers=100"
+ " ! audio/x-raw,rate=44100 ! audioconvert ! vorbisenc ! vorbisdec"
+ " ! identity check-imperfect-timestamp=TRUE ! fakesink");
+
+ pipeline = gst_parse_launch (pipe_str, &error);
+ fail_unless (pipeline != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ bus = gst_element_get_bus (pipeline);
+ fail_if (bus == NULL);
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message::element", (GCallback) element_message_cb,
+ NULL);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_cb, NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* run until we receive EOS */
+ loop = g_main_loop_new (NULL, FALSE);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ fail_if (messages > 0, "Received imperfect timestamp messages");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+#endif /* #ifndef GST_DISABLE_PARSE */
+
+static Suite *
+vorbisenc_suite (void)
+{
+ Suite *s = suite_create ("vorbisenc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+#ifndef GST_DISABLE_PARSE
+ tcase_add_test (tc_chain, test_timestamps);
+#endif
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = vorbisenc_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/vorbisenc.c b/tests/check/pipelines/vorbisenc.c
new file mode 100644
index 0000000..a172479
--- /dev/null
+++ b/tests/check/pipelines/vorbisenc.c
@@ -0,0 +1,418 @@
+/* GStreamer
+ *
+ * unit test for vorbisenc
+ *
+ * Copyright (C) 2006 Andy Wingo <wingo at pobox.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/check/gstbufferstraw.h>
+
+#ifndef GST_DISABLE_PARSE
+
+#define TIMESTAMP_OFFSET G_GINT64_CONSTANT(3249870963)
+
+static void
+check_buffer_timestamp (GstBuffer * buffer, GstClockTime timestamp)
+{
+ fail_unless (GST_BUFFER_TIMESTAMP (buffer) == timestamp,
+ "expected timestamp %" GST_TIME_FORMAT
+ ", but got timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+}
+
+static void
+check_buffer_duration (GstBuffer * buffer, GstClockTime duration)
+{
+ fail_unless (GST_BUFFER_DURATION (buffer) == duration,
+ "expected duration %" GST_TIME_FORMAT
+ ", but got duration %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (duration), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
+}
+
+static void
+check_buffer_granulepos (GstBuffer * buffer, gint64 granulepos)
+{
+ GstClockTime clocktime;
+
+ fail_unless (GST_BUFFER_OFFSET_END (buffer) == granulepos,
+ "expected granulepos %" G_GUINT64_FORMAT
+ ", but got granulepos %" G_GUINT64_FORMAT,
+ granulepos, GST_BUFFER_OFFSET_END (buffer));
+
+ /* contrary to what we record as TIMESTAMP, we can use OFFSET to check
+ * the granulepos correctly here */
+ clocktime = gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), 44100,
+ GST_SECOND);
+
+ fail_unless (clocktime == GST_BUFFER_OFFSET (buffer),
+ "expected OFFSET set to clocktime %" GST_TIME_FORMAT
+ ", but got %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (clocktime), GST_TIME_ARGS (GST_BUFFER_OFFSET (buffer)));
+}
+
+/* this check is here to check that the granulepos we derive from the timestamp
+ is about correct. This is "about correct" because you can't precisely go from
+ timestamp to granulepos due to the downward-rounding characteristics of
+ gst_util_uint64_scale, so you check if granulepos is equal to the number, or
+ the number plus one. */
+static void
+check_buffer_granulepos_from_endtime (GstBuffer * buffer, GstClockTime endtime)
+{
+ gint64 granulepos, expected;
+
+ granulepos = GST_BUFFER_OFFSET_END (buffer);
+ expected = gst_util_uint64_scale (endtime, 44100, GST_SECOND);
+
+ fail_unless (granulepos == expected || granulepos == expected + 1,
+ "expected granulepos %" G_GUINT64_FORMAT
+ " or %" G_GUINT64_FORMAT
+ ", but got granulepos %" G_GUINT64_FORMAT,
+ expected, expected + 1, granulepos);
+}
+
+GST_START_TEST (test_granulepos_offset)
+{
+ GstElement *bin;
+ GstPad *pad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+
+ pipe_str = g_strdup_printf ("audiotestsrc timestamp-offset=%" G_GUINT64_FORMAT
+ " ! audio/x-raw,rate=44100"
+ " ! audioconvert ! vorbisenc ! fakesink", TIMESTAMP_OFFSET);
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fakesink0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* header packets should have timestamp == NONE, granulepos 0 */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ GST_DEBUG ("Got buffer in test");
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+ GST_DEBUG ("Unreffed buffer in test");
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ {
+ GstClockTime next_timestamp;
+ gint64 last_granulepos = 0;
+
+ /* first buffer should have timestamp of TIMESTAMP_OFFSET, granulepos to
+ * match the timestamp of the end of the last sample in the output buffer.
+ * Note that one cannot go timestamp->granulepos->timestamp and get the same
+ * value due to loss of precision with granulepos. vorbisenc does take care
+ * to timestamp correctly based on the offset of the input data however, so
+ * it does do sub-granulepos timestamping. */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ last_granulepos = GST_BUFFER_OFFSET_END (buffer);
+ check_buffer_timestamp (buffer, TIMESTAMP_OFFSET);
+ /* don't really have a good way of checking duration... */
+ check_buffer_granulepos_from_endtime (buffer,
+ TIMESTAMP_OFFSET + GST_BUFFER_DURATION (buffer));
+
+ next_timestamp = TIMESTAMP_OFFSET + GST_BUFFER_DURATION (buffer);
+
+ gst_buffer_unref (buffer);
+
+ /* check continuity with the next buffer */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, next_timestamp);
+ check_buffer_duration (buffer,
+ gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), GST_SECOND,
+ 44100)
+ - gst_util_uint64_scale (last_granulepos, GST_SECOND, 44100));
+ check_buffer_granulepos_from_endtime (buffer,
+ next_timestamp + GST_BUFFER_DURATION (buffer));
+
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_timestamps)
+{
+ GstElement *bin;
+ GstPad *pad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+
+ pipe_str = g_strdup_printf ("audiotestsrc"
+ " ! audio/x-raw,rate=44100 ! audioconvert ! vorbisenc ! fakesink");
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fakesink0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* check header packets */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ {
+ GstClockTime next_timestamp;
+ gint64 last_granulepos;
+
+ /* first buffer has timestamp 0 */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ last_granulepos = GST_BUFFER_OFFSET_END (buffer);
+ check_buffer_timestamp (buffer, 0);
+ /* don't really have a good way of checking duration... */
+ check_buffer_granulepos_from_endtime (buffer, GST_BUFFER_DURATION (buffer));
+
+ next_timestamp = GST_BUFFER_DURATION (buffer);
+
+ gst_buffer_unref (buffer);
+
+ /* check continuity with the next buffer */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, next_timestamp);
+ check_buffer_duration (buffer,
+ gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), GST_SECOND,
+ 44100)
+ - gst_util_uint64_scale (last_granulepos, GST_SECOND, 44100));
+ check_buffer_granulepos_from_endtime (buffer,
+ next_timestamp + GST_BUFFER_DURATION (buffer));
+
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+static GstProbeReturn
+drop_second_data_buffer (GstPad * droppad, GstProbeType type,
+ GstBuffer * buffer, gpointer unused)
+{
+ GstProbeReturn res = GST_PROBE_OK;
+
+ if (GST_BUFFER_OFFSET (buffer) == 1024)
+ res = GST_PROBE_DROP;
+
+ GST_DEBUG ("dropping %d", res);
+
+ return res;
+}
+
+GST_START_TEST (test_discontinuity)
+{
+ GstElement *bin;
+ GstPad *pad, *droppad;
+ gchar *pipe_str;
+ GstBuffer *buffer;
+ GError *error = NULL;
+ guint drop_id;
+
+ pipe_str = g_strdup_printf ("audiotestsrc samplesperbuffer=1024"
+ " ! audio/x-raw,rate=44100" " ! audioconvert ! vorbisenc ! fakesink");
+
+ bin = gst_parse_launch (pipe_str, &error);
+ fail_unless (bin != NULL, "Error parsing pipeline: %s",
+ error ? error->message : "(invalid error)");
+ g_free (pipe_str);
+
+ /* the plan: same as test_timestamps, but dropping a buffer and seeing if
+ vorbisenc correctly notes the discontinuity */
+
+ /* get the pad to use to drop buffers */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "vorbisenc0");
+
+ fail_unless (sink != NULL, "Could not get vorbisenc out of bin");
+ droppad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (droppad != NULL, "Could not get pad out of vorbisenc");
+ gst_object_unref (sink);
+ }
+
+ /* get the pad */
+ {
+ GstElement *sink = gst_bin_get_by_name (GST_BIN (bin), "fakesink0");
+
+ fail_unless (sink != NULL, "Could not get fakesink out of bin");
+ pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (pad != NULL, "Could not get pad out of fakesink");
+ gst_object_unref (sink);
+ }
+
+ drop_id = gst_pad_add_probe (droppad, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) drop_second_data_buffer, NULL, NULL);
+ gst_buffer_straw_start_pipeline (bin, pad);
+
+ /* check header packets */
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ check_buffer_timestamp (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_duration (buffer, GST_CLOCK_TIME_NONE);
+ check_buffer_granulepos (buffer, 0);
+ gst_buffer_unref (buffer);
+
+ /* two phases: continuous granulepos values up to 1024, then a first
+ discontinuous granulepos whose granulepos corresponds to a gap ending at
+ 2048. */
+ {
+ GstClockTime next_timestamp = 0;
+ gint64 last_granulepos = 0;
+
+ while (last_granulepos < 1024) {
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ last_granulepos = GST_BUFFER_OFFSET_END (buffer);
+ check_buffer_timestamp (buffer, next_timestamp);
+ fail_if (GST_BUFFER_IS_DISCONT (buffer), "expected continuous buffer");
+ next_timestamp += GST_BUFFER_DURATION (buffer);
+ gst_buffer_unref (buffer);
+ }
+
+ fail_unless (last_granulepos == 1024,
+ "unexpected granulepos: %" G_GUINT64_FORMAT, last_granulepos);
+ }
+
+ {
+ buffer = gst_buffer_straw_get_buffer (bin, pad);
+ /* The first buffer after the discontinuity will produce zero output
+ * samples (because of the overlap/add), so it won't increment the
+ * granulepos, which should be 2048 after the discontinuity.
+ */
+ fail_unless (GST_BUFFER_IS_DISCONT (buffer),
+ "expected discontinuous buffer");
+ fail_unless (GST_BUFFER_OFFSET_END (buffer) == 2048,
+ "expected granulepos after gap: %" G_GUINT64_FORMAT,
+ GST_BUFFER_OFFSET_END (buffer));
+ gst_buffer_unref (buffer);
+ }
+
+ gst_buffer_straw_stop_pipeline (bin, pad);
+ gst_pad_remove_probe (droppad, drop_id);
+
+ gst_object_unref (droppad);
+ gst_object_unref (pad);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+#endif /* #ifndef GST_DISABLE_PARSE */
+
+static Suite *
+vorbisenc_suite (void)
+{
+ Suite *s = suite_create ("vorbisenc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+#ifndef GST_DISABLE_PARSE
+ tcase_add_test (tc_chain, test_granulepos_offset);
+ tcase_add_test (tc_chain, test_timestamps);
+ tcase_add_test (tc_chain, test_discontinuity);
+#endif
+
+ return s;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nf;
+
+ Suite *s = vorbisenc_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..317f851
--- /dev/null
+++ b/tests/examples/Makefile.am
@@ -0,0 +1,15 @@
+if HAVE_FT2
+FT2_SUBDIRS = seek snapshot
+else
+FT2_SUBDIRS =
+endif
+
+if USE_GIO
+GIO_SUBDIRS = gio
+endif
+
+SUBDIRS = app audio dynamic $(FT2_SUBDIRS) $(GIO_SUBDIRS) overlay playrec volume encoding
+
+DIST_SUBDIRS = app audio dynamic gio overlay seek snapshot playrec volume encoding
+
+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..7766b57
--- /dev/null
+++ b/tests/examples/Makefile.in
@@ -0,0 +1,777 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_FT2_FALSE@FT2_SUBDIRS =
+@HAVE_FT2_TRUE@FT2_SUBDIRS = seek snapshot
+@USE_GIO_TRUE@GIO_SUBDIRS = gio
+SUBDIRS = app audio dynamic $(FT2_SUBDIRS) $(GIO_SUBDIRS) overlay playrec volume encoding
+DIST_SUBDIRS = app audio dynamic gio overlay seek snapshot playrec volume encoding
+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_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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/app/Makefile.am b/tests/examples/app/Makefile.am
new file mode 100644
index 0000000..4f17ad7
--- /dev/null
+++ b/tests/examples/app/Makefile.am
@@ -0,0 +1,32 @@
+
+noinst_PROGRAMS = appsrc_ex appsrc-stream appsrc-stream2 appsrc-ra \
+ appsrc-seekable appsink-src
+
+appsrc_ex_SOURCES = appsrc_ex.c
+appsrc_ex_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_ex_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsrc_stream_SOURCES = appsrc-stream.c
+appsrc_stream_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_stream_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsrc_stream2_SOURCES = appsrc-stream2.c
+appsrc_stream2_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_stream2_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsrc_ra_SOURCES = appsrc-ra.c
+appsrc_ra_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_ra_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsrc_seekable_SOURCES = appsrc-seekable.c
+appsrc_seekable_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_seekable_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsink_src_SOURCES = appsink-src.c
+appsink_src_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsink_src_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
diff --git a/tests/examples/app/Makefile.in b/tests/examples/app/Makefile.in
new file mode 100644
index 0000000..8e8b61c
--- /dev/null
+++ b/tests/examples/app/Makefile.in
@@ -0,0 +1,873 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = appsrc_ex$(EXEEXT) appsrc-stream$(EXEEXT) \
+ appsrc-stream2$(EXEEXT) appsrc-ra$(EXEEXT) \
+ appsrc-seekable$(EXEEXT) appsink-src$(EXEEXT)
+subdir = tests/examples/app
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_appsink_src_OBJECTS = appsink_src-appsink-src.$(OBJEXT)
+appsink_src_OBJECTS = $(am_appsink_src_OBJECTS)
+am__DEPENDENCIES_1 =
+appsink_src_DEPENDENCIES = $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+appsink_src_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(appsink_src_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_appsrc_ra_OBJECTS = appsrc_ra-appsrc-ra.$(OBJEXT)
+appsrc_ra_OBJECTS = $(am_appsrc_ra_OBJECTS)
+appsrc_ra_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+appsrc_ra_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(appsrc_ra_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_appsrc_seekable_OBJECTS = \
+ appsrc_seekable-appsrc-seekable.$(OBJEXT)
+appsrc_seekable_OBJECTS = $(am_appsrc_seekable_OBJECTS)
+appsrc_seekable_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+appsrc_seekable_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(appsrc_seekable_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_appsrc_stream_OBJECTS = appsrc_stream-appsrc-stream.$(OBJEXT)
+appsrc_stream_OBJECTS = $(am_appsrc_stream_OBJECTS)
+appsrc_stream_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+appsrc_stream_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(appsrc_stream_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_appsrc_stream2_OBJECTS = appsrc_stream2-appsrc-stream2.$(OBJEXT)
+appsrc_stream2_OBJECTS = $(am_appsrc_stream2_OBJECTS)
+appsrc_stream2_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+appsrc_stream2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(appsrc_stream2_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+am_appsrc_ex_OBJECTS = appsrc_ex-appsrc_ex.$(OBJEXT)
+appsrc_ex_OBJECTS = $(am_appsrc_ex_OBJECTS)
+appsrc_ex_DEPENDENCIES = $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+appsrc_ex_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(appsrc_ex_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(appsink_src_SOURCES) $(appsrc_ra_SOURCES) \
+ $(appsrc_seekable_SOURCES) $(appsrc_stream_SOURCES) \
+ $(appsrc_stream2_SOURCES) $(appsrc_ex_SOURCES)
+DIST_SOURCES = $(appsink_src_SOURCES) $(appsrc_ra_SOURCES) \
+ $(appsrc_seekable_SOURCES) $(appsrc_stream_SOURCES) \
+ $(appsrc_stream2_SOURCES) $(appsrc_ex_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+appsrc_ex_SOURCES = appsrc_ex.c
+appsrc_ex_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_ex_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+appsrc_stream_SOURCES = appsrc-stream.c
+appsrc_stream_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_stream_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+appsrc_stream2_SOURCES = appsrc-stream2.c
+appsrc_stream2_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_stream2_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+appsrc_ra_SOURCES = appsrc-ra.c
+appsrc_ra_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_ra_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+appsrc_seekable_SOURCES = appsrc-seekable.c
+appsrc_seekable_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsrc_seekable_LDADD = $(GST_BASE_LIBS) $(GST_LIBS)
+appsink_src_SOURCES = appsink-src.c
+appsink_src_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+appsink_src_LDADD = \
+ $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_MAJORMINOR@.la \
+ $(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/app/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/app/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
+appsink-src$(EXEEXT): $(appsink_src_OBJECTS) $(appsink_src_DEPENDENCIES)
+ @rm -f appsink-src$(EXEEXT)
+ $(AM_V_CCLD)$(appsink_src_LINK) $(appsink_src_OBJECTS) $(appsink_src_LDADD) $(LIBS)
+appsrc-ra$(EXEEXT): $(appsrc_ra_OBJECTS) $(appsrc_ra_DEPENDENCIES)
+ @rm -f appsrc-ra$(EXEEXT)
+ $(AM_V_CCLD)$(appsrc_ra_LINK) $(appsrc_ra_OBJECTS) $(appsrc_ra_LDADD) $(LIBS)
+appsrc-seekable$(EXEEXT): $(appsrc_seekable_OBJECTS) $(appsrc_seekable_DEPENDENCIES)
+ @rm -f appsrc-seekable$(EXEEXT)
+ $(AM_V_CCLD)$(appsrc_seekable_LINK) $(appsrc_seekable_OBJECTS) $(appsrc_seekable_LDADD) $(LIBS)
+appsrc-stream$(EXEEXT): $(appsrc_stream_OBJECTS) $(appsrc_stream_DEPENDENCIES)
+ @rm -f appsrc-stream$(EXEEXT)
+ $(AM_V_CCLD)$(appsrc_stream_LINK) $(appsrc_stream_OBJECTS) $(appsrc_stream_LDADD) $(LIBS)
+appsrc-stream2$(EXEEXT): $(appsrc_stream2_OBJECTS) $(appsrc_stream2_DEPENDENCIES)
+ @rm -f appsrc-stream2$(EXEEXT)
+ $(AM_V_CCLD)$(appsrc_stream2_LINK) $(appsrc_stream2_OBJECTS) $(appsrc_stream2_LDADD) $(LIBS)
+appsrc_ex$(EXEEXT): $(appsrc_ex_OBJECTS) $(appsrc_ex_DEPENDENCIES)
+ @rm -f appsrc_ex$(EXEEXT)
+ $(AM_V_CCLD)$(appsrc_ex_LINK) $(appsrc_ex_OBJECTS) $(appsrc_ex_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsink_src-appsink-src.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc_ex-appsrc_ex.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc_ra-appsrc-ra.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc_seekable-appsrc-seekable.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc_stream-appsrc-stream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc_stream2-appsrc-stream2.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+appsink_src-appsink-src.o: appsink-src.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsink_src_CFLAGS) $(CFLAGS) -MT appsink_src-appsink-src.o -MD -MP -MF $(DEPDIR)/appsink_src-appsink-src.Tpo -c -o appsink_src-appsink-src.o `test -f 'appsink-src.c' || echo '$(srcdir)/'`appsink-src.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsink_src-appsink-src.Tpo $(DEPDIR)/appsink_src-appsink-src.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsink-src.c' object='appsink_src-appsink-src.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsink_src_CFLAGS) $(CFLAGS) -c -o appsink_src-appsink-src.o `test -f 'appsink-src.c' || echo '$(srcdir)/'`appsink-src.c
+
+appsink_src-appsink-src.obj: appsink-src.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsink_src_CFLAGS) $(CFLAGS) -MT appsink_src-appsink-src.obj -MD -MP -MF $(DEPDIR)/appsink_src-appsink-src.Tpo -c -o appsink_src-appsink-src.obj `if test -f 'appsink-src.c'; then $(CYGPATH_W) 'appsink-src.c'; else $(CYGPATH_W) '$(srcdir)/appsink-src.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsink_src-appsink-src.Tpo $(DEPDIR)/appsink_src-appsink-src.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsink-src.c' object='appsink_src-appsink-src.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsink_src_CFLAGS) $(CFLAGS) -c -o appsink_src-appsink-src.obj `if test -f 'appsink-src.c'; then $(CYGPATH_W) 'appsink-src.c'; else $(CYGPATH_W) '$(srcdir)/appsink-src.c'; fi`
+
+appsrc_ra-appsrc-ra.o: appsrc-ra.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ra_CFLAGS) $(CFLAGS) -MT appsrc_ra-appsrc-ra.o -MD -MP -MF $(DEPDIR)/appsrc_ra-appsrc-ra.Tpo -c -o appsrc_ra-appsrc-ra.o `test -f 'appsrc-ra.c' || echo '$(srcdir)/'`appsrc-ra.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_ra-appsrc-ra.Tpo $(DEPDIR)/appsrc_ra-appsrc-ra.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-ra.c' object='appsrc_ra-appsrc-ra.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ra_CFLAGS) $(CFLAGS) -c -o appsrc_ra-appsrc-ra.o `test -f 'appsrc-ra.c' || echo '$(srcdir)/'`appsrc-ra.c
+
+appsrc_ra-appsrc-ra.obj: appsrc-ra.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ra_CFLAGS) $(CFLAGS) -MT appsrc_ra-appsrc-ra.obj -MD -MP -MF $(DEPDIR)/appsrc_ra-appsrc-ra.Tpo -c -o appsrc_ra-appsrc-ra.obj `if test -f 'appsrc-ra.c'; then $(CYGPATH_W) 'appsrc-ra.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-ra.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_ra-appsrc-ra.Tpo $(DEPDIR)/appsrc_ra-appsrc-ra.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-ra.c' object='appsrc_ra-appsrc-ra.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ra_CFLAGS) $(CFLAGS) -c -o appsrc_ra-appsrc-ra.obj `if test -f 'appsrc-ra.c'; then $(CYGPATH_W) 'appsrc-ra.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-ra.c'; fi`
+
+appsrc_seekable-appsrc-seekable.o: appsrc-seekable.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_seekable_CFLAGS) $(CFLAGS) -MT appsrc_seekable-appsrc-seekable.o -MD -MP -MF $(DEPDIR)/appsrc_seekable-appsrc-seekable.Tpo -c -o appsrc_seekable-appsrc-seekable.o `test -f 'appsrc-seekable.c' || echo '$(srcdir)/'`appsrc-seekable.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_seekable-appsrc-seekable.Tpo $(DEPDIR)/appsrc_seekable-appsrc-seekable.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-seekable.c' object='appsrc_seekable-appsrc-seekable.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_seekable_CFLAGS) $(CFLAGS) -c -o appsrc_seekable-appsrc-seekable.o `test -f 'appsrc-seekable.c' || echo '$(srcdir)/'`appsrc-seekable.c
+
+appsrc_seekable-appsrc-seekable.obj: appsrc-seekable.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_seekable_CFLAGS) $(CFLAGS) -MT appsrc_seekable-appsrc-seekable.obj -MD -MP -MF $(DEPDIR)/appsrc_seekable-appsrc-seekable.Tpo -c -o appsrc_seekable-appsrc-seekable.obj `if test -f 'appsrc-seekable.c'; then $(CYGPATH_W) 'appsrc-seekable.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-seekable.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_seekable-appsrc-seekable.Tpo $(DEPDIR)/appsrc_seekable-appsrc-seekable.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-seekable.c' object='appsrc_seekable-appsrc-seekable.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_seekable_CFLAGS) $(CFLAGS) -c -o appsrc_seekable-appsrc-seekable.obj `if test -f 'appsrc-seekable.c'; then $(CYGPATH_W) 'appsrc-seekable.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-seekable.c'; fi`
+
+appsrc_stream-appsrc-stream.o: appsrc-stream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream_CFLAGS) $(CFLAGS) -MT appsrc_stream-appsrc-stream.o -MD -MP -MF $(DEPDIR)/appsrc_stream-appsrc-stream.Tpo -c -o appsrc_stream-appsrc-stream.o `test -f 'appsrc-stream.c' || echo '$(srcdir)/'`appsrc-stream.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_stream-appsrc-stream.Tpo $(DEPDIR)/appsrc_stream-appsrc-stream.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-stream.c' object='appsrc_stream-appsrc-stream.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream_CFLAGS) $(CFLAGS) -c -o appsrc_stream-appsrc-stream.o `test -f 'appsrc-stream.c' || echo '$(srcdir)/'`appsrc-stream.c
+
+appsrc_stream-appsrc-stream.obj: appsrc-stream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream_CFLAGS) $(CFLAGS) -MT appsrc_stream-appsrc-stream.obj -MD -MP -MF $(DEPDIR)/appsrc_stream-appsrc-stream.Tpo -c -o appsrc_stream-appsrc-stream.obj `if test -f 'appsrc-stream.c'; then $(CYGPATH_W) 'appsrc-stream.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-stream.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_stream-appsrc-stream.Tpo $(DEPDIR)/appsrc_stream-appsrc-stream.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-stream.c' object='appsrc_stream-appsrc-stream.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream_CFLAGS) $(CFLAGS) -c -o appsrc_stream-appsrc-stream.obj `if test -f 'appsrc-stream.c'; then $(CYGPATH_W) 'appsrc-stream.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-stream.c'; fi`
+
+appsrc_stream2-appsrc-stream2.o: appsrc-stream2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream2_CFLAGS) $(CFLAGS) -MT appsrc_stream2-appsrc-stream2.o -MD -MP -MF $(DEPDIR)/appsrc_stream2-appsrc-stream2.Tpo -c -o appsrc_stream2-appsrc-stream2.o `test -f 'appsrc-stream2.c' || echo '$(srcdir)/'`appsrc-stream2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_stream2-appsrc-stream2.Tpo $(DEPDIR)/appsrc_stream2-appsrc-stream2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-stream2.c' object='appsrc_stream2-appsrc-stream2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream2_CFLAGS) $(CFLAGS) -c -o appsrc_stream2-appsrc-stream2.o `test -f 'appsrc-stream2.c' || echo '$(srcdir)/'`appsrc-stream2.c
+
+appsrc_stream2-appsrc-stream2.obj: appsrc-stream2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream2_CFLAGS) $(CFLAGS) -MT appsrc_stream2-appsrc-stream2.obj -MD -MP -MF $(DEPDIR)/appsrc_stream2-appsrc-stream2.Tpo -c -o appsrc_stream2-appsrc-stream2.obj `if test -f 'appsrc-stream2.c'; then $(CYGPATH_W) 'appsrc-stream2.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-stream2.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_stream2-appsrc-stream2.Tpo $(DEPDIR)/appsrc_stream2-appsrc-stream2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc-stream2.c' object='appsrc_stream2-appsrc-stream2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_stream2_CFLAGS) $(CFLAGS) -c -o appsrc_stream2-appsrc-stream2.obj `if test -f 'appsrc-stream2.c'; then $(CYGPATH_W) 'appsrc-stream2.c'; else $(CYGPATH_W) '$(srcdir)/appsrc-stream2.c'; fi`
+
+appsrc_ex-appsrc_ex.o: appsrc_ex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ex_CFLAGS) $(CFLAGS) -MT appsrc_ex-appsrc_ex.o -MD -MP -MF $(DEPDIR)/appsrc_ex-appsrc_ex.Tpo -c -o appsrc_ex-appsrc_ex.o `test -f 'appsrc_ex.c' || echo '$(srcdir)/'`appsrc_ex.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_ex-appsrc_ex.Tpo $(DEPDIR)/appsrc_ex-appsrc_ex.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc_ex.c' object='appsrc_ex-appsrc_ex.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ex_CFLAGS) $(CFLAGS) -c -o appsrc_ex-appsrc_ex.o `test -f 'appsrc_ex.c' || echo '$(srcdir)/'`appsrc_ex.c
+
+appsrc_ex-appsrc_ex.obj: appsrc_ex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ex_CFLAGS) $(CFLAGS) -MT appsrc_ex-appsrc_ex.obj -MD -MP -MF $(DEPDIR)/appsrc_ex-appsrc_ex.Tpo -c -o appsrc_ex-appsrc_ex.obj `if test -f 'appsrc_ex.c'; then $(CYGPATH_W) 'appsrc_ex.c'; else $(CYGPATH_W) '$(srcdir)/appsrc_ex.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/appsrc_ex-appsrc_ex.Tpo $(DEPDIR)/appsrc_ex-appsrc_ex.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appsrc_ex.c' object='appsrc_ex-appsrc_ex.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(appsrc_ex_CFLAGS) $(CFLAGS) -c -o appsrc_ex-appsrc_ex.obj `if test -f 'appsrc_ex.c'; then $(CYGPATH_W) 'appsrc_ex.c'; else $(CYGPATH_W) '$(srcdir)/appsrc_ex.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/app/appsink-src.c b/tests/examples/app/appsink-src.c
new file mode 100644
index 0000000..9772e8a
--- /dev/null
+++ b/tests/examples/app/appsink-src.c
@@ -0,0 +1,186 @@
+#include <gst/gst.h>
+
+#include <string.h>
+
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+
+/* these are the caps we are going to pass through the appsink and appsrc */
+const gchar *audio_caps =
+ "audio/x-raw-int,channels=1,rate=8000,signed=(boolean)true,width=16,depth=16,endianness=1234";
+
+typedef struct
+{
+ GMainLoop *loop;
+ GstElement *source;
+ GstElement *sink;
+} ProgramData;
+
+/* called when the appsink notifies us that there is a new buffer ready for
+ * processing */
+static void
+on_new_buffer_from_source (GstElement * elt, ProgramData * data)
+{
+ guint size;
+ GstBuffer *app_buffer, *buffer;
+ GstElement *source;
+
+ /* get the buffer from appsink */
+ buffer = gst_app_sink_pull_buffer (GST_APP_SINK (elt));
+
+ /* turn it into an app buffer, it's not really needed, we could simply push
+ * the retrieved buffer from appsink into appsrc just fine. */
+ size = gst_buffer_get_size (buffer);
+ g_print ("Pushing a buffer of size %d\n", size);
+ app_buffer = gst_buffer_new_and_alloc (size);
+
+ gst_buffer_copy_into (app_buffer, buffer, GST_BUFFER_COPY_MEMORY, 0, size);
+
+ /* we don't need the appsink buffer anymore */
+ gst_buffer_unref (buffer);
+
+ /* get source an push new buffer */
+ source = gst_bin_get_by_name (GST_BIN (data->sink), "testsource");
+ gst_app_src_push_buffer (GST_APP_SRC (source), app_buffer);
+}
+
+/* called when we get a GstMessage from the source pipeline when we get EOS, we
+ * notify the appsrc of it. */
+static gboolean
+on_source_message (GstBus * bus, GstMessage * message, ProgramData * data)
+{
+ GstElement *source;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_EOS:
+ g_print ("The source got dry\n");
+ source = gst_bin_get_by_name (GST_BIN (data->sink), "testsource");
+ gst_app_src_end_of_stream (GST_APP_SRC (source));
+ break;
+ case GST_MESSAGE_ERROR:
+ g_print ("Received error\n");
+ g_main_loop_quit (data->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+/* called when we get a GstMessage from the sink pipeline when we get EOS, we
+ * exit the mainloop and this testapp. */
+static gboolean
+on_sink_message (GstBus * bus, GstMessage * message, ProgramData * data)
+{
+ /* nil */
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_EOS:
+ g_print ("Finished playback\n");
+ g_main_loop_quit (data->loop);
+ break;
+ case GST_MESSAGE_ERROR:
+ g_print ("Received error\n");
+ g_main_loop_quit (data->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ gchar *filename = NULL;
+ ProgramData *data = NULL;
+ gchar *string = NULL;
+ GstBus *bus = NULL;
+ GstElement *testsink = NULL;
+ GstElement *testsource = NULL;
+
+ gst_init (&argc, &argv);
+
+ if (argc == 2)
+ filename = g_strdup (argv[1]);
+ else
+ filename = g_strdup ("/usr/share/sounds/ekiga/ring.wav");
+
+ data = g_new0 (ProgramData, 1);
+
+ data->loop = g_main_loop_new (NULL, FALSE);
+
+ /* setting up source pipeline, we read from a file and convert to our desired
+ * caps. */
+ string =
+ g_strdup_printf
+ ("filesrc location=\"%s\" ! wavparse ! audioconvert ! audioresample ! appsink caps=\"%s\" name=testsink",
+ filename, audio_caps);
+ g_free (filename);
+ data->source = gst_parse_launch (string, NULL);
+ g_free (string);
+
+ if (data->source == NULL) {
+ g_print ("Bad source\n");
+ return -1;
+ }
+
+ /* to be notified of messages from this pipeline, mostly EOS */
+ bus = gst_element_get_bus (data->source);
+ gst_bus_add_watch (bus, (GstBusFunc) on_source_message, data);
+ gst_object_unref (bus);
+
+ /* we use appsink in push mode, it sends us a signal when data is available
+ * and we pull out the data in the signal callback. We want the appsink to
+ * push as fast as it can, hence the sync=false */
+ testsink = gst_bin_get_by_name (GST_BIN (data->source), "testsink");
+ g_object_set (G_OBJECT (testsink), "emit-signals", TRUE, "sync", FALSE, NULL);
+ g_signal_connect (testsink, "new-buffer",
+ G_CALLBACK (on_new_buffer_from_source), data);
+ gst_object_unref (testsink);
+
+ /* setting up sink pipeline, we push audio data into this pipeline that will
+ * then play it back using the default audio sink. We have no blocking
+ * behaviour on the src which means that we will push the entire file into
+ * memory. */
+ string =
+ g_strdup_printf ("appsrc name=testsource caps=\"%s\" ! autoaudiosink",
+ audio_caps);
+ data->sink = gst_parse_launch (string, NULL);
+ g_free (string);
+
+ if (data->sink == NULL) {
+ g_print ("Bad sink\n");
+ return -1;
+ }
+
+ testsource = gst_bin_get_by_name (GST_BIN (data->sink), "testsource");
+ /* configure for time-based format */
+ g_object_set (testsource, "format", GST_FORMAT_TIME, NULL);
+ /* uncomment the next line to block when appsrc has buffered enough */
+ /* g_object_set (testsource, "block", TRUE, NULL); */
+ gst_object_unref (testsource);
+
+ bus = gst_element_get_bus (data->sink);
+ gst_bus_add_watch (bus, (GstBusFunc) on_sink_message, data);
+ gst_object_unref (bus);
+
+ /* launching things */
+ gst_element_set_state (data->sink, GST_STATE_PLAYING);
+ gst_element_set_state (data->source, GST_STATE_PLAYING);
+
+ /* let's run !, this loop will quit when the sink pipeline goes EOS or when an
+ * error occurs in the source or sink pipelines. */
+ g_print ("Let's run!\n");
+ g_main_loop_run (data->loop);
+ g_print ("Going out\n");
+
+ gst_element_set_state (data->source, GST_STATE_NULL);
+ gst_element_set_state (data->sink, GST_STATE_NULL);
+
+ gst_object_unref (data->source);
+ gst_object_unref (data->sink);
+ g_main_loop_unref (data->loop);
+ g_free (data);
+
+ return 0;
+}
diff --git a/tests/examples/app/appsrc-ra.c b/tests/examples/app/appsrc-ra.c
new file mode 100644
index 0000000..deb20ef
--- /dev/null
+++ b/tests/examples/app/appsrc-ra.c
@@ -0,0 +1,226 @@
+/* GStreamer
+ *
+ * appsrc-ra.c: example for using appsrc in random-access mode.
+ *
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+GST_DEBUG_CATEGORY (appsrc_playbin_debug);
+#define GST_CAT_DEFAULT appsrc_playbin_debug
+
+/*
+ * an example application of using appsrc in random-access mode. When the
+ * appsrc requests data with the need-data signal, we retrieve a buffer of the
+ * requested size and push it to appsrc.
+ *
+ * This is a good example how one would deal with a local file resource.
+ *
+ * Appsrc in random-access mode needs seeking support and we must thus connect
+ * to the seek signal to perform any seeks when requested.
+ *
+ * In random-access mode we must set the size of the source material.
+ */
+typedef struct _App App;
+
+struct _App
+{
+ GstElement *playbin;
+ GstElement *appsrc;
+
+ GMainLoop *loop;
+
+ GMappedFile *file;
+ guint8 *data;
+ gsize length;
+ guint64 offset;
+};
+
+App s_app;
+
+/* This method is called by the need-data signal callback, we feed data into the
+ * appsrc with the requested size.
+ */
+static void
+feed_data (GstElement * appsrc, guint size, App * app)
+{
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+
+ buffer = gst_buffer_new ();
+
+ if (app->offset >= app->length) {
+ /* we are EOS, send end-of-stream */
+ g_signal_emit_by_name (app->appsrc, "end-of-stream", &ret);
+ return;
+ }
+
+ /* read the amount of data, we are allowed to return less if we are EOS */
+ if (app->offset + size > app->length)
+ size = app->length - app->offset;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ app->data, NULL, app->length, app->offset, size));
+
+ /* we need to set an offset for random access */
+ GST_BUFFER_OFFSET (buffer) = app->offset;
+ GST_BUFFER_OFFSET_END (buffer) = app->offset + size;
+
+ GST_DEBUG ("feed buffer %p, offset %" G_GUINT64_FORMAT "-%u", buffer,
+ app->offset, size);
+ g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret);
+ gst_buffer_unref (buffer);
+
+ app->offset += size;
+
+ return;
+}
+
+/* called when appsrc wants us to return data from a new position with the next
+ * call to push-buffer. */
+static gboolean
+seek_data (GstElement * appsrc, guint64 position, App * app)
+{
+ GST_DEBUG ("seek to offset %" G_GUINT64_FORMAT, position);
+ app->offset = position;
+
+ return TRUE;
+}
+
+/* this callback is called when playbin2 has constructed a source object to read
+ * from. Since we provided the appsrc:// uri to playbin2, this will be the
+ * appsrc that we must handle. We set up some signals to push data into appsrc
+ * and one to perform a seek. */
+static void
+found_source (GObject * object, GObject * orig, GParamSpec * pspec, App * app)
+{
+ /* get a handle to the appsrc */
+ g_object_get (orig, pspec->name, &app->appsrc, NULL);
+
+ GST_DEBUG ("got appsrc %p", app->appsrc);
+
+ /* we can set the length in appsrc. This allows some elements to estimate the
+ * total duration of the stream. It's a good idea to set the property when you
+ * can but it's not required. */
+ g_object_set (app->appsrc, "size", (gint64) app->length, NULL);
+ gst_util_set_object_arg (G_OBJECT (app->appsrc), "stream-type",
+ "random-access");
+
+ /* configure the appsrc, we will push a buffer to appsrc when it needs more
+ * data */
+ g_signal_connect (app->appsrc, "need-data", G_CALLBACK (feed_data), app);
+ g_signal_connect (app->appsrc, "seek-data", G_CALLBACK (seek_data), app);
+}
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, App * app)
+{
+ GST_DEBUG ("got message %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_error ("received error");
+ g_main_loop_quit (app->loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (app->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ GError *error = NULL;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ GST_DEBUG_CATEGORY_INIT (appsrc_playbin_debug, "appsrc-playbin", 0,
+ "appsrc playbin example");
+
+ if (argc < 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* try to open the file as an mmapped file */
+ app->file = g_mapped_file_new (argv[1], FALSE, &error);
+ if (error) {
+ g_print ("failed to open file: %s\n", error->message);
+ g_error_free (error);
+ return -2;
+ }
+ /* get some vitals, this will be used to read data from the mmapped file and
+ * feed it to appsrc. */
+ app->length = g_mapped_file_get_length (app->file);
+ app->data = (guint8 *) g_mapped_file_get_contents (app->file);
+ app->offset = 0;
+
+ /* create a mainloop to get messages */
+ app->loop = g_main_loop_new (NULL, TRUE);
+
+ app->playbin = gst_element_factory_make ("playbin2", NULL);
+ g_assert (app->playbin);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
+
+ /* add watch for messages */
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
+
+ /* set to read from appsrc */
+ g_object_set (app->playbin, "uri", "appsrc://", NULL);
+
+ /* get notification when the source is created so that we get a handle to it
+ * and can configure it */
+ g_signal_connect (app->playbin, "deep-notify::source",
+ (GCallback) found_source, app);
+
+ /* go to playing and wait in a mainloop. */
+ gst_element_set_state (app->playbin, GST_STATE_PLAYING);
+
+ /* this mainloop is stopped when we receive an error or EOS */
+ g_main_loop_run (app->loop);
+
+ GST_DEBUG ("stopping");
+
+ gst_element_set_state (app->playbin, GST_STATE_NULL);
+
+ /* free the file */
+ g_mapped_file_unref (app->file);
+
+ gst_object_unref (bus);
+ g_main_loop_unref (app->loop);
+
+ return 0;
+}
diff --git a/tests/examples/app/appsrc-seekable.c b/tests/examples/app/appsrc-seekable.c
new file mode 100644
index 0000000..0da6e76
--- /dev/null
+++ b/tests/examples/app/appsrc-seekable.c
@@ -0,0 +1,230 @@
+/* GStreamer
+ *
+ * appsrc-seekable.c: example for using appsrc in seekable mode.
+ *
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+GST_DEBUG_CATEGORY (appsrc_playbin_debug);
+#define GST_CAT_DEFAULT appsrc_playbin_debug
+
+/*
+ * an example application of using appsrc in seekable mode. When the
+ * appsrc requests data with the need-data signal, we retrieve a buffer and
+ * push it to appsrc. We can also use the method as demonstrated in
+ * appsrc-stream.c, ie. pushing buffers when we can.
+ *
+ * This is a good example how one would deal with a remote http server that
+ * supports range requests.
+ *
+ * Appsrc in seekable mode needs seeking support and we must thus connect
+ * to the seek signal to perform any seeks when requested.
+ *
+ * In seekable mode we should set the size of the source material.
+ */
+typedef struct _App App;
+
+struct _App
+{
+ GstElement *playbin;
+ GstElement *appsrc;
+
+ GMainLoop *loop;
+
+ GMappedFile *file;
+ guint8 *data;
+ gsize length;
+ guint64 offset;
+};
+
+App s_app;
+
+#define CHUNK_SIZE 4096
+
+/* This method is called by the need-data signal callback, we feed data into the
+ * appsrc with an arbitrary size.
+ */
+static void
+feed_data (GstElement * appsrc, guint size, App * app)
+{
+ GstBuffer *buffer;
+ guint len;
+ GstFlowReturn ret;
+
+ buffer = gst_buffer_new ();
+
+ if (app->offset >= app->length) {
+ /* we are EOS, send end-of-stream */
+ g_signal_emit_by_name (app->appsrc, "end-of-stream", &ret);
+ return;
+ }
+
+ /* read any amount of data, we are allowed to return less if we are EOS */
+ len = CHUNK_SIZE;
+ if (app->offset + len > app->length)
+ len = app->length - app->offset;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ app->data, NULL, app->length, app->offset, len));
+
+ GST_DEBUG ("feed buffer %p, offset %" G_GUINT64_FORMAT "-%u", buffer,
+ app->offset, len);
+ g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret);
+ gst_buffer_unref (buffer);
+
+ app->offset += len;
+
+ return;
+}
+
+/* called when appsrc wants us to return data from a new position with the next
+ * call to push-buffer. */
+static gboolean
+seek_data (GstElement * appsrc, guint64 position, App * app)
+{
+ GST_DEBUG ("seek to offset %" G_GUINT64_FORMAT, position);
+ app->offset = position;
+
+ return TRUE;
+}
+
+/* this callback is called when playbin2 has constructed a source object to read
+ * from. Since we provided the appsrc:// uri to playbin2, this will be the
+ * appsrc that we must handle. We set up some signals to push data into appsrc
+ * and one to perform a seek. */
+static void
+found_source (GObject * object, GObject * orig, GParamSpec * pspec, App * app)
+{
+ /* get a handle to the appsrc */
+ g_object_get (orig, pspec->name, &app->appsrc, NULL);
+
+ GST_DEBUG ("got appsrc %p", app->appsrc);
+
+ /* we can set the length in appsrc. This allows some elements to estimate the
+ * total duration of the stream. It's a good idea to set the property when you
+ * can but it's not required. */
+ g_object_set (app->appsrc, "size", (gint64) app->length, NULL);
+ /* we are seekable in push mode, this means that the element usually pushes
+ * out buffers of an undefined size and that seeks happen only occasionally
+ * and only by request of the user. */
+ gst_util_set_object_arg (G_OBJECT (app->appsrc), "stream-type", "seekable");
+
+ /* configure the appsrc, we will push a buffer to appsrc when it needs more
+ * data */
+ g_signal_connect (app->appsrc, "need-data", G_CALLBACK (feed_data), app);
+ g_signal_connect (app->appsrc, "seek-data", G_CALLBACK (seek_data), app);
+}
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, App * app)
+{
+ GST_DEBUG ("got message %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_error ("received error");
+ g_main_loop_quit (app->loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (app->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ GError *error = NULL;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ GST_DEBUG_CATEGORY_INIT (appsrc_playbin_debug, "appsrc-playbin", 0,
+ "appsrc playbin example");
+
+ if (argc < 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* try to open the file as an mmapped file */
+ app->file = g_mapped_file_new (argv[1], FALSE, &error);
+ if (error) {
+ g_print ("failed to open file: %s\n", error->message);
+ g_error_free (error);
+ return -2;
+ }
+ /* get some vitals, this will be used to read data from the mmapped file and
+ * feed it to appsrc. */
+ app->length = g_mapped_file_get_length (app->file);
+ app->data = (guint8 *) g_mapped_file_get_contents (app->file);
+ app->offset = 0;
+
+ /* create a mainloop to get messages */
+ app->loop = g_main_loop_new (NULL, TRUE);
+
+ app->playbin = gst_element_factory_make ("playbin2", NULL);
+ g_assert (app->playbin);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
+
+ /* add watch for messages */
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
+
+ /* set to read from appsrc */
+ g_object_set (app->playbin, "uri", "appsrc://", NULL);
+
+ /* get notification when the source is created so that we get a handle to it
+ * and can configure it */
+ g_signal_connect (app->playbin, "deep-notify::source",
+ (GCallback) found_source, app);
+
+ /* go to playing and wait in a mainloop. */
+ gst_element_set_state (app->playbin, GST_STATE_PLAYING);
+
+ /* this mainloop is stopped when we receive an error or EOS */
+ g_main_loop_run (app->loop);
+
+ GST_DEBUG ("stopping");
+
+ gst_element_set_state (app->playbin, GST_STATE_NULL);
+
+ /* free the file */
+ g_mapped_file_unref (app->file);
+
+ gst_object_unref (bus);
+ g_main_loop_unref (app->loop);
+
+ return 0;
+}
diff --git a/tests/examples/app/appsrc-stream.c b/tests/examples/app/appsrc-stream.c
new file mode 100644
index 0000000..75ecf77
--- /dev/null
+++ b/tests/examples/app/appsrc-stream.c
@@ -0,0 +1,250 @@
+/* GStreamer
+ *
+ * appsrc-stream.c: example for using appsrc in streaming mode.
+ *
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+GST_DEBUG_CATEGORY (appsrc_playbin_debug);
+#define GST_CAT_DEFAULT appsrc_playbin_debug
+
+/*
+ * an example application of using appsrc in streaming push mode. We simply push
+ * buffers into appsrc. The size of the buffers we push can be any size we
+ * choose.
+ *
+ * This example is very close to how one would deal with a streaming webserver
+ * that does not support range requests or does not report the total file size.
+ *
+ * Some optimisations are done so that we don't push too much data. We connect
+ * to the need-data and enough-data signals to start/stop sending buffers.
+ *
+ * Appsrc in streaming mode (the default) does not support seeking so we don't
+ * have to handle any seek callbacks.
+ *
+ * Some formats are able to estimate the duration of the media file based on the
+ * file length (mp3, mpeg,..), others report an unknown length (ogg,..).
+ */
+typedef struct _App App;
+
+struct _App
+{
+ GstElement *playbin;
+ GstElement *appsrc;
+
+ GMainLoop *loop;
+ guint sourceid;
+
+ GMappedFile *file;
+ guint8 *data;
+ gsize length;
+ guint64 offset;
+};
+
+App s_app;
+
+#define CHUNK_SIZE 4096
+
+/* This method is called by the idle GSource in the mainloop. We feed CHUNK_SIZE
+ * bytes into appsrc.
+ * The ide handler is added to the mainloop when appsrc requests us to start
+ * sending data (need-data signal) and is removed when appsrc has enough data
+ * (enough-data signal).
+ */
+static gboolean
+read_data (App * app)
+{
+ GstBuffer *buffer;
+ guint len;
+ GstFlowReturn ret;
+
+ buffer = gst_buffer_new ();
+
+ if (app->offset >= app->length) {
+ /* we are EOS, send end-of-stream and remove the source */
+ g_signal_emit_by_name (app->appsrc, "end-of-stream", &ret);
+ return FALSE;
+ }
+
+ /* read the next chunk */
+ len = CHUNK_SIZE;
+ if (app->offset + len > app->length)
+ len = app->length - app->offset;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ app->data, NULL, app->length, app->offset, len));
+
+ GST_DEBUG ("feed buffer %p, offset %" G_GUINT64_FORMAT "-%u", buffer,
+ app->offset, len);
+ g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret);
+ gst_buffer_unref (buffer);
+ if (ret != GST_FLOW_OK) {
+ /* some error, stop sending data */
+ return FALSE;
+ }
+
+ app->offset += len;
+
+ return TRUE;
+}
+
+/* This signal callback is called when appsrc needs data, we add an idle handler
+ * to the mainloop to start pushing data into the appsrc */
+static void
+start_feed (GstElement * playbin, guint size, App * app)
+{
+ if (app->sourceid == 0) {
+ GST_DEBUG ("start feeding");
+ app->sourceid = g_idle_add ((GSourceFunc) read_data, app);
+ }
+}
+
+/* This callback is called when appsrc has enough data and we can stop sending.
+ * We remove the idle handler from the mainloop */
+static void
+stop_feed (GstElement * playbin, App * app)
+{
+ if (app->sourceid != 0) {
+ GST_DEBUG ("stop feeding");
+ g_source_remove (app->sourceid);
+ app->sourceid = 0;
+ }
+}
+
+/* this callback is called when playbin2 has constructed a source object to read
+ * from. Since we provided the appsrc:// uri to playbin2, this will be the
+ * appsrc that we must handle. We set up some signals to start and stop pushing
+ * data into appsrc */
+static void
+found_source (GObject * object, GObject * orig, GParamSpec * pspec, App * app)
+{
+ /* get a handle to the appsrc */
+ g_object_get (orig, pspec->name, &app->appsrc, NULL);
+
+ GST_DEBUG ("got appsrc %p", app->appsrc);
+
+ /* we can set the length in appsrc. This allows some elements to estimate the
+ * total duration of the stream. It's a good idea to set the property when you
+ * can but it's not required. */
+ g_object_set (app->appsrc, "size", (gint64) app->length, NULL);
+
+ /* configure the appsrc, we will push data into the appsrc from the
+ * mainloop. */
+ g_signal_connect (app->appsrc, "need-data", G_CALLBACK (start_feed), app);
+ g_signal_connect (app->appsrc, "enough-data", G_CALLBACK (stop_feed), app);
+}
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, App * app)
+{
+ GST_DEBUG ("got message %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_error ("received error");
+ g_main_loop_quit (app->loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (app->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ GError *error = NULL;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ GST_DEBUG_CATEGORY_INIT (appsrc_playbin_debug, "appsrc-playbin", 0,
+ "appsrc playbin example");
+
+ if (argc < 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* try to open the file as an mmapped file */
+ app->file = g_mapped_file_new (argv[1], FALSE, &error);
+ if (error) {
+ g_print ("failed to open file: %s\n", error->message);
+ g_error_free (error);
+ return -2;
+ }
+ /* get some vitals, this will be used to read data from the mmapped file and
+ * feed it to appsrc. */
+ app->length = g_mapped_file_get_length (app->file);
+ app->data = (guint8 *) g_mapped_file_get_contents (app->file);
+ app->offset = 0;
+
+ /* create a mainloop to get messages and to handle the idle handler that will
+ * feed data to appsrc. */
+ app->loop = g_main_loop_new (NULL, TRUE);
+
+ app->playbin = gst_element_factory_make ("playbin2", NULL);
+ g_assert (app->playbin);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
+
+ /* add watch for messages */
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
+
+ /* set to read from appsrc */
+ g_object_set (app->playbin, "uri", "appsrc://", NULL);
+
+ /* get notification when the source is created so that we get a handle to it
+ * and can configure it */
+ g_signal_connect (app->playbin, "deep-notify::source",
+ (GCallback) found_source, app);
+
+ /* go to playing and wait in a mainloop. */
+ gst_element_set_state (app->playbin, GST_STATE_PLAYING);
+
+ /* this mainloop is stopped when we receive an error or EOS */
+ g_main_loop_run (app->loop);
+
+ GST_DEBUG ("stopping");
+
+ gst_element_set_state (app->playbin, GST_STATE_NULL);
+
+ /* free the file */
+ g_mapped_file_unref (app->file);
+
+ gst_object_unref (bus);
+ g_main_loop_unref (app->loop);
+
+ return 0;
+}
diff --git a/tests/examples/app/appsrc-stream2.c b/tests/examples/app/appsrc-stream2.c
new file mode 100644
index 0000000..b92259e
--- /dev/null
+++ b/tests/examples/app/appsrc-stream2.c
@@ -0,0 +1,220 @@
+/* GStreamer
+ *
+ * appsrc-stream2.c: example for using appsrc in streaming mode.
+ *
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+GST_DEBUG_CATEGORY (appsrc_playbin_debug);
+#define GST_CAT_DEFAULT appsrc_playbin_debug
+
+/*
+ * an example application of using appsrc in streaming pull mode. When the
+ * appsrc request data with the need-data signal, we retrieve a buffer of an
+ * arbitrary size and push it to appsrc.
+ *
+ * This example keeps the internal buffer queue of appsrc to a minimal size,
+ * only feeding data to appsrc when needed.
+ *
+ * This is a good example how one would deal with a live resource, such as a udp
+ * socket where one would feed the most recently acquired buffer to appsrc.
+ *
+ * Usually one would timestamp the buffers with the running_time of the
+ * pipeline or configure the appsrc to do timestamping by setting the
+ * do-timestamp property to TRUE.
+ *
+ * Appsrc in streaming mode (the default) does not support seeking so we don't
+ * have to handle any seek callbacks.
+ *
+ * Some formats are able to estimate the duration of the media file based on the
+ * file length (mp3, mpeg,..), others report an unknown length (ogg,..).
+ */
+typedef struct _App App;
+
+struct _App
+{
+ GstElement *playbin;
+ GstElement *appsrc;
+
+ GMainLoop *loop;
+
+ GMappedFile *file;
+ guint8 *data;
+ gsize length;
+ guint64 offset;
+};
+
+App s_app;
+
+#define CHUNK_SIZE 4096
+
+/* This method is called by the need-data signal callback, we feed data into the
+ * appsrc.
+ */
+static void
+feed_data (GstElement * appsrc, guint size, App * app)
+{
+ GstBuffer *buffer;
+ guint len;
+ GstFlowReturn ret;
+
+ buffer = gst_buffer_new ();
+
+ if (app->offset >= app->length) {
+ /* we are EOS, send end-of-stream */
+ g_signal_emit_by_name (app->appsrc, "end-of-stream", &ret);
+ return;
+ }
+
+ /* read the next chunk */
+ len = CHUNK_SIZE;
+ if (app->offset + len > app->length)
+ len = app->length - app->offset;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ app->data, NULL, app->length, app->offset, len));
+
+ GST_DEBUG ("feed buffer %p, offset %" G_GUINT64_FORMAT "-%u", buffer,
+ app->offset, len);
+ g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret);
+ gst_buffer_unref (buffer);
+
+ app->offset += len;
+
+ return;
+}
+
+/* this callback is called when playbin2 has constructed a source object to read
+ * from. Since we provided the appsrc:// uri to playbin2, this will be the
+ * appsrc that we must handle. We set up a signals to push data into appsrc. */
+static void
+found_source (GObject * object, GObject * orig, GParamSpec * pspec, App * app)
+{
+ /* get a handle to the appsrc */
+ g_object_get (orig, pspec->name, &app->appsrc, NULL);
+
+ GST_DEBUG ("got appsrc %p", app->appsrc);
+
+ /* we can set the length in appsrc. This allows some elements to estimate the
+ * total duration of the stream. It's a good idea to set the property when you
+ * can but it's not required. */
+ g_object_set (app->appsrc, "size", (gint64) app->length, NULL);
+
+ /* configure the appsrc, we will push a buffer to appsrc when it needs more
+ * data */
+ g_signal_connect (app->appsrc, "need-data", G_CALLBACK (feed_data), app);
+}
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, App * app)
+{
+ GST_DEBUG ("got message %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_error ("received error");
+ g_main_loop_quit (app->loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_main_loop_quit (app->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ GError *error = NULL;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ GST_DEBUG_CATEGORY_INIT (appsrc_playbin_debug, "appsrc-playbin", 0,
+ "appsrc playbin example");
+
+ if (argc < 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* try to open the file as an mmapped file */
+ app->file = g_mapped_file_new (argv[1], FALSE, &error);
+ if (error) {
+ g_print ("failed to open file: %s\n", error->message);
+ g_error_free (error);
+ return -2;
+ }
+ /* get some vitals, this will be used to read data from the mmapped file and
+ * feed it to appsrc. */
+ app->length = g_mapped_file_get_length (app->file);
+ app->data = (guint8 *) g_mapped_file_get_contents (app->file);
+ app->offset = 0;
+
+ /* create a mainloop to get messages */
+ app->loop = g_main_loop_new (NULL, TRUE);
+
+ app->playbin = gst_element_factory_make ("playbin2", NULL);
+ g_assert (app->playbin);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
+
+ /* add watch for messages */
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
+
+ /* set to read from appsrc */
+ g_object_set (app->playbin, "uri", "appsrc://", NULL);
+
+ /* get notification when the source is created so that we get a handle to it
+ * and can configure it */
+ g_signal_connect (app->playbin, "deep-notify::source",
+ (GCallback) found_source, app);
+
+ /* go to playing and wait in a mainloop. */
+ gst_element_set_state (app->playbin, GST_STATE_PLAYING);
+
+ /* this mainloop is stopped when we receive an error or EOS */
+ g_main_loop_run (app->loop);
+
+ GST_DEBUG ("stopping");
+
+ gst_element_set_state (app->playbin, GST_STATE_NULL);
+
+ /* free the file */
+ g_mapped_file_unref (app->file);
+
+ gst_object_unref (bus);
+ g_main_loop_unref (app->loop);
+
+ return 0;
+}
diff --git a/tests/examples/app/appsrc_ex.c b/tests/examples/app/appsrc_ex.c
new file mode 100644
index 0000000..5468a66
--- /dev/null
+++ b/tests/examples/app/appsrc_ex.c
@@ -0,0 +1,86 @@
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+typedef struct _App App;
+struct _App
+{
+ GstElement *pipe;
+ GstElement *src;
+ GstElement *id;
+ GstElement *sink;
+};
+
+App s_app;
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ int i;
+
+ gst_init (&argc, &argv);
+
+ app->pipe = gst_pipeline_new (NULL);
+ g_assert (app->pipe);
+
+ app->src = gst_element_factory_make ("appsrc", NULL);
+ g_assert (app->src);
+ gst_bin_add (GST_BIN (app->pipe), app->src);
+
+ app->id = gst_element_factory_make ("identity", NULL);
+ g_assert (app->id);
+ gst_bin_add (GST_BIN (app->pipe), app->id);
+
+ app->sink = gst_element_factory_make ("appsink", NULL);
+ g_assert (app->sink);
+ gst_bin_add (GST_BIN (app->pipe), app->sink);
+
+ gst_element_link (app->src, app->id);
+ gst_element_link (app->id, app->sink);
+
+ gst_element_set_state (app->pipe, GST_STATE_PLAYING);
+
+ for (i = 0; i < 10; i++) {
+ GstBuffer *buf;
+ void *data;
+
+ buf = gst_buffer_new_and_alloc (100);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memset (data, i, 100);
+ gst_buffer_unmap (buf, data, 100);
+
+ printf ("%d: pushing buffer for pointer %p, %p\n", i, data, buf);
+ gst_app_src_push_buffer (GST_APP_SRC (app->src), buf);
+ }
+
+ /* push EOS */
+ gst_app_src_end_of_stream (GST_APP_SRC (app->src));
+
+ /* _is_eos() does not block and returns TRUE if there is not currently an EOS
+ * to be retrieved */
+ while (!gst_app_sink_is_eos (GST_APP_SINK (app->sink))) {
+ GstBuffer *buf;
+
+ /* pull the next item, this can return NULL when there is no more data and
+ * EOS has been received */
+ buf = gst_app_sink_pull_buffer (GST_APP_SINK (app->sink));
+ printf ("retrieved buffer %p\n", buf);
+ if (buf)
+ gst_buffer_unref (buf);
+ }
+ gst_element_set_state (app->pipe, GST_STATE_NULL);
+
+ return 0;
+}
diff --git a/tests/examples/audio/Makefile.am b/tests/examples/audio/Makefile.am
new file mode 100644
index 0000000..49d7266
--- /dev/null
+++ b/tests/examples/audio/Makefile.am
@@ -0,0 +1,6 @@
+
+noinst_PROGRAMS = testchannels
+testchannels_SOURCES = testchannels.c
+testchannels_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+testchannels_LDADD = $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(GST_LIBS)
diff --git a/tests/examples/audio/Makefile.in b/tests/examples/audio/Makefile.in
new file mode 100644
index 0000000..97faf08
--- /dev/null
+++ b/tests/examples/audio/Makefile.in
@@ -0,0 +1,711 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = testchannels$(EXEEXT)
+subdir = tests/examples/audio
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_testchannels_OBJECTS = testchannels-testchannels.$(OBJEXT)
+testchannels_OBJECTS = $(am_testchannels_OBJECTS)
+am__DEPENDENCIES_1 =
+testchannels_DEPENDENCIES = $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+testchannels_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(testchannels_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(testchannels_SOURCES)
+DIST_SOURCES = $(testchannels_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+testchannels_SOURCES = testchannels.c
+testchannels_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+testchannels_LDADD = $(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
+ $(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/audio/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/audio/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
+testchannels$(EXEEXT): $(testchannels_OBJECTS) $(testchannels_DEPENDENCIES)
+ @rm -f testchannels$(EXEEXT)
+ $(AM_V_CCLD)$(testchannels_LINK) $(testchannels_OBJECTS) $(testchannels_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testchannels-testchannels.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+testchannels-testchannels.o: testchannels.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testchannels_CFLAGS) $(CFLAGS) -MT testchannels-testchannels.o -MD -MP -MF $(DEPDIR)/testchannels-testchannels.Tpo -c -o testchannels-testchannels.o `test -f 'testchannels.c' || echo '$(srcdir)/'`testchannels.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/testchannels-testchannels.Tpo $(DEPDIR)/testchannels-testchannels.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testchannels.c' object='testchannels-testchannels.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testchannels_CFLAGS) $(CFLAGS) -c -o testchannels-testchannels.o `test -f 'testchannels.c' || echo '$(srcdir)/'`testchannels.c
+
+testchannels-testchannels.obj: testchannels.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testchannels_CFLAGS) $(CFLAGS) -MT testchannels-testchannels.obj -MD -MP -MF $(DEPDIR)/testchannels-testchannels.Tpo -c -o testchannels-testchannels.obj `if test -f 'testchannels.c'; then $(CYGPATH_W) 'testchannels.c'; else $(CYGPATH_W) '$(srcdir)/testchannels.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/testchannels-testchannels.Tpo $(DEPDIR)/testchannels-testchannels.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testchannels.c' object='testchannels-testchannels.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testchannels_CFLAGS) $(CFLAGS) -c -o testchannels-testchannels.obj `if test -f 'testchannels.c'; then $(CYGPATH_W) 'testchannels.c'; else $(CYGPATH_W) '$(srcdir)/testchannels.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/audio/testchannels.c b/tests/examples/audio/testchannels.c
new file mode 100644
index 0000000..691bb58
--- /dev/null
+++ b/tests/examples/audio/testchannels.c
@@ -0,0 +1,49 @@
+/* GStreamer Multichannel Test
+ * (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/audio/multichannel.h>
+#include <gst/audio/audio-enumtypes.h>
+
+gint
+main (gint argc, gchar * argv[])
+{
+ gchar *str;
+ GstCaps *caps;
+ GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
+ };
+
+ /* register multichannel type */
+ gst_init (&argc, &argv);
+ gst_audio_channel_position_get_type ();
+
+ /* test some caps-string conversions */
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ "channels", G_TYPE_INT, 2, NULL);
+ str = gst_caps_to_string (caps);
+ g_print ("Test caps #1: %s\n", str);
+ g_free (str);
+ gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
+ str = gst_caps_to_string (caps);
+ g_print ("Test caps #2: %s\n", str);
+ g_free (str);
+ gst_caps_unref (caps);
+
+ return 0;
+}
diff --git a/tests/examples/dynamic/Makefile.am b/tests/examples/dynamic/Makefile.am
new file mode 100644
index 0000000..6cdb8ff
--- /dev/null
+++ b/tests/examples/dynamic/Makefile.am
@@ -0,0 +1,21 @@
+noinst_PROGRAMS = addstream codec-select sprinkle sprinkle2 sprinkle3
+
+addstream_SOURCES = addstream.c
+addstream_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+addstream_LDADD = $(GST_LIBS)
+
+codec_select_SOURCES = codec-select.c
+codec_select_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+codec_select_LDADD = $(GST_LIBS)
+
+sprinkle_SOURCES = sprinkle.c
+sprinkle_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle_LDADD = $(GST_LIBS)
+
+sprinkle2_SOURCES = sprinkle2.c
+sprinkle2_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle2_LDADD = $(GST_LIBS)
+
+sprinkle3_SOURCES = sprinkle3.c
+sprinkle3_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle3_LDADD = $(GST_LIBS)
diff --git a/tests/examples/dynamic/Makefile.in b/tests/examples/dynamic/Makefile.in
new file mode 100644
index 0000000..ac59926
--- /dev/null
+++ b/tests/examples/dynamic/Makefile.in
@@ -0,0 +1,827 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = addstream$(EXEEXT) codec-select$(EXEEXT) \
+ sprinkle$(EXEEXT) sprinkle2$(EXEEXT) sprinkle3$(EXEEXT)
+subdir = tests/examples/dynamic
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_addstream_OBJECTS = addstream-addstream.$(OBJEXT)
+addstream_OBJECTS = $(am_addstream_OBJECTS)
+am__DEPENDENCIES_1 =
+addstream_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+addstream_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(addstream_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_codec_select_OBJECTS = codec_select-codec-select.$(OBJEXT)
+codec_select_OBJECTS = $(am_codec_select_OBJECTS)
+codec_select_DEPENDENCIES = $(am__DEPENDENCIES_1)
+codec_select_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(codec_select_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_sprinkle_OBJECTS = sprinkle-sprinkle.$(OBJEXT)
+sprinkle_OBJECTS = $(am_sprinkle_OBJECTS)
+sprinkle_DEPENDENCIES = $(am__DEPENDENCIES_1)
+sprinkle_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sprinkle_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_sprinkle2_OBJECTS = sprinkle2-sprinkle2.$(OBJEXT)
+sprinkle2_OBJECTS = $(am_sprinkle2_OBJECTS)
+sprinkle2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+sprinkle2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sprinkle2_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_sprinkle3_OBJECTS = sprinkle3-sprinkle3.$(OBJEXT)
+sprinkle3_OBJECTS = $(am_sprinkle3_OBJECTS)
+sprinkle3_DEPENDENCIES = $(am__DEPENDENCIES_1)
+sprinkle3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sprinkle3_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(addstream_SOURCES) $(codec_select_SOURCES) \
+ $(sprinkle_SOURCES) $(sprinkle2_SOURCES) $(sprinkle3_SOURCES)
+DIST_SOURCES = $(addstream_SOURCES) $(codec_select_SOURCES) \
+ $(sprinkle_SOURCES) $(sprinkle2_SOURCES) $(sprinkle3_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+addstream_SOURCES = addstream.c
+addstream_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+addstream_LDADD = $(GST_LIBS)
+codec_select_SOURCES = codec-select.c
+codec_select_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+codec_select_LDADD = $(GST_LIBS)
+sprinkle_SOURCES = sprinkle.c
+sprinkle_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle_LDADD = $(GST_LIBS)
+sprinkle2_SOURCES = sprinkle2.c
+sprinkle2_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle2_LDADD = $(GST_LIBS)
+sprinkle3_SOURCES = sprinkle3.c
+sprinkle3_CFLAGS = $(GST_CFLAGS) -D_GNU_SOURCE
+sprinkle3_LDADD = $(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/dynamic/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/dynamic/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
+addstream$(EXEEXT): $(addstream_OBJECTS) $(addstream_DEPENDENCIES)
+ @rm -f addstream$(EXEEXT)
+ $(AM_V_CCLD)$(addstream_LINK) $(addstream_OBJECTS) $(addstream_LDADD) $(LIBS)
+codec-select$(EXEEXT): $(codec_select_OBJECTS) $(codec_select_DEPENDENCIES)
+ @rm -f codec-select$(EXEEXT)
+ $(AM_V_CCLD)$(codec_select_LINK) $(codec_select_OBJECTS) $(codec_select_LDADD) $(LIBS)
+sprinkle$(EXEEXT): $(sprinkle_OBJECTS) $(sprinkle_DEPENDENCIES)
+ @rm -f sprinkle$(EXEEXT)
+ $(AM_V_CCLD)$(sprinkle_LINK) $(sprinkle_OBJECTS) $(sprinkle_LDADD) $(LIBS)
+sprinkle2$(EXEEXT): $(sprinkle2_OBJECTS) $(sprinkle2_DEPENDENCIES)
+ @rm -f sprinkle2$(EXEEXT)
+ $(AM_V_CCLD)$(sprinkle2_LINK) $(sprinkle2_OBJECTS) $(sprinkle2_LDADD) $(LIBS)
+sprinkle3$(EXEEXT): $(sprinkle3_OBJECTS) $(sprinkle3_DEPENDENCIES)
+ @rm -f sprinkle3$(EXEEXT)
+ $(AM_V_CCLD)$(sprinkle3_LINK) $(sprinkle3_OBJECTS) $(sprinkle3_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addstream-addstream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codec_select-codec-select.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sprinkle-sprinkle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sprinkle2-sprinkle2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sprinkle3-sprinkle3.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+addstream-addstream.o: addstream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(addstream_CFLAGS) $(CFLAGS) -MT addstream-addstream.o -MD -MP -MF $(DEPDIR)/addstream-addstream.Tpo -c -o addstream-addstream.o `test -f 'addstream.c' || echo '$(srcdir)/'`addstream.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/addstream-addstream.Tpo $(DEPDIR)/addstream-addstream.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='addstream.c' object='addstream-addstream.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(addstream_CFLAGS) $(CFLAGS) -c -o addstream-addstream.o `test -f 'addstream.c' || echo '$(srcdir)/'`addstream.c
+
+addstream-addstream.obj: addstream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(addstream_CFLAGS) $(CFLAGS) -MT addstream-addstream.obj -MD -MP -MF $(DEPDIR)/addstream-addstream.Tpo -c -o addstream-addstream.obj `if test -f 'addstream.c'; then $(CYGPATH_W) 'addstream.c'; else $(CYGPATH_W) '$(srcdir)/addstream.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/addstream-addstream.Tpo $(DEPDIR)/addstream-addstream.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='addstream.c' object='addstream-addstream.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(addstream_CFLAGS) $(CFLAGS) -c -o addstream-addstream.obj `if test -f 'addstream.c'; then $(CYGPATH_W) 'addstream.c'; else $(CYGPATH_W) '$(srcdir)/addstream.c'; fi`
+
+codec_select-codec-select.o: codec-select.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(codec_select_CFLAGS) $(CFLAGS) -MT codec_select-codec-select.o -MD -MP -MF $(DEPDIR)/codec_select-codec-select.Tpo -c -o codec_select-codec-select.o `test -f 'codec-select.c' || echo '$(srcdir)/'`codec-select.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/codec_select-codec-select.Tpo $(DEPDIR)/codec_select-codec-select.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codec-select.c' object='codec_select-codec-select.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(codec_select_CFLAGS) $(CFLAGS) -c -o codec_select-codec-select.o `test -f 'codec-select.c' || echo '$(srcdir)/'`codec-select.c
+
+codec_select-codec-select.obj: codec-select.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(codec_select_CFLAGS) $(CFLAGS) -MT codec_select-codec-select.obj -MD -MP -MF $(DEPDIR)/codec_select-codec-select.Tpo -c -o codec_select-codec-select.obj `if test -f 'codec-select.c'; then $(CYGPATH_W) 'codec-select.c'; else $(CYGPATH_W) '$(srcdir)/codec-select.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/codec_select-codec-select.Tpo $(DEPDIR)/codec_select-codec-select.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codec-select.c' object='codec_select-codec-select.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(codec_select_CFLAGS) $(CFLAGS) -c -o codec_select-codec-select.obj `if test -f 'codec-select.c'; then $(CYGPATH_W) 'codec-select.c'; else $(CYGPATH_W) '$(srcdir)/codec-select.c'; fi`
+
+sprinkle-sprinkle.o: sprinkle.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle_CFLAGS) $(CFLAGS) -MT sprinkle-sprinkle.o -MD -MP -MF $(DEPDIR)/sprinkle-sprinkle.Tpo -c -o sprinkle-sprinkle.o `test -f 'sprinkle.c' || echo '$(srcdir)/'`sprinkle.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle-sprinkle.Tpo $(DEPDIR)/sprinkle-sprinkle.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle.c' object='sprinkle-sprinkle.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle_CFLAGS) $(CFLAGS) -c -o sprinkle-sprinkle.o `test -f 'sprinkle.c' || echo '$(srcdir)/'`sprinkle.c
+
+sprinkle-sprinkle.obj: sprinkle.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle_CFLAGS) $(CFLAGS) -MT sprinkle-sprinkle.obj -MD -MP -MF $(DEPDIR)/sprinkle-sprinkle.Tpo -c -o sprinkle-sprinkle.obj `if test -f 'sprinkle.c'; then $(CYGPATH_W) 'sprinkle.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle-sprinkle.Tpo $(DEPDIR)/sprinkle-sprinkle.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle.c' object='sprinkle-sprinkle.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle_CFLAGS) $(CFLAGS) -c -o sprinkle-sprinkle.obj `if test -f 'sprinkle.c'; then $(CYGPATH_W) 'sprinkle.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle.c'; fi`
+
+sprinkle2-sprinkle2.o: sprinkle2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle2_CFLAGS) $(CFLAGS) -MT sprinkle2-sprinkle2.o -MD -MP -MF $(DEPDIR)/sprinkle2-sprinkle2.Tpo -c -o sprinkle2-sprinkle2.o `test -f 'sprinkle2.c' || echo '$(srcdir)/'`sprinkle2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle2-sprinkle2.Tpo $(DEPDIR)/sprinkle2-sprinkle2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle2.c' object='sprinkle2-sprinkle2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle2_CFLAGS) $(CFLAGS) -c -o sprinkle2-sprinkle2.o `test -f 'sprinkle2.c' || echo '$(srcdir)/'`sprinkle2.c
+
+sprinkle2-sprinkle2.obj: sprinkle2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle2_CFLAGS) $(CFLAGS) -MT sprinkle2-sprinkle2.obj -MD -MP -MF $(DEPDIR)/sprinkle2-sprinkle2.Tpo -c -o sprinkle2-sprinkle2.obj `if test -f 'sprinkle2.c'; then $(CYGPATH_W) 'sprinkle2.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle2.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle2-sprinkle2.Tpo $(DEPDIR)/sprinkle2-sprinkle2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle2.c' object='sprinkle2-sprinkle2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle2_CFLAGS) $(CFLAGS) -c -o sprinkle2-sprinkle2.obj `if test -f 'sprinkle2.c'; then $(CYGPATH_W) 'sprinkle2.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle2.c'; fi`
+
+sprinkle3-sprinkle3.o: sprinkle3.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle3_CFLAGS) $(CFLAGS) -MT sprinkle3-sprinkle3.o -MD -MP -MF $(DEPDIR)/sprinkle3-sprinkle3.Tpo -c -o sprinkle3-sprinkle3.o `test -f 'sprinkle3.c' || echo '$(srcdir)/'`sprinkle3.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle3-sprinkle3.Tpo $(DEPDIR)/sprinkle3-sprinkle3.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle3.c' object='sprinkle3-sprinkle3.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle3_CFLAGS) $(CFLAGS) -c -o sprinkle3-sprinkle3.o `test -f 'sprinkle3.c' || echo '$(srcdir)/'`sprinkle3.c
+
+sprinkle3-sprinkle3.obj: sprinkle3.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle3_CFLAGS) $(CFLAGS) -MT sprinkle3-sprinkle3.obj -MD -MP -MF $(DEPDIR)/sprinkle3-sprinkle3.Tpo -c -o sprinkle3-sprinkle3.obj `if test -f 'sprinkle3.c'; then $(CYGPATH_W) 'sprinkle3.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle3.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sprinkle3-sprinkle3.Tpo $(DEPDIR)/sprinkle3-sprinkle3.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sprinkle3.c' object='sprinkle3-sprinkle3.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sprinkle3_CFLAGS) $(CFLAGS) -c -o sprinkle3-sprinkle3.obj `if test -f 'sprinkle3.c'; then $(CYGPATH_W) 'sprinkle3.c'; else $(CYGPATH_W) '$(srcdir)/sprinkle3.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/dynamic/addstream.c b/tests/examples/dynamic/addstream.c
new file mode 100644
index 0000000..5d23630
--- /dev/null
+++ b/tests/examples/dynamic/addstream.c
@@ -0,0 +1,253 @@
+/* GStreamer
+ *
+ * addstream.c: sample application to dynamically add streams to a running
+ * pipeline
+ *
+ * Copyright (C) <2007> Wim Taymans <wim dot taymans at gmail dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+static GstElement *pipeline;
+static GstClock *theclock;
+static GMainLoop *loop;
+static GstElement *bin1, *bin2, *bin3, *bin4, *bin5;
+
+/* start a bin with the given description */
+static GstElement *
+create_stream (const gchar * descr)
+{
+ GstElement *bin;
+ GError *error = NULL;
+
+ bin = gst_parse_launch (descr, &error);
+ if (error) {
+ g_print ("pipeline could not be constructed: %s\n", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ /* add the bin to the pipeline now, this will set the current base_time of the
+ * pipeline on the new bin. */
+ gst_bin_add (GST_BIN_CAST (pipeline), bin);
+
+ return bin;
+}
+
+static gboolean
+pause_play_stream (GstElement * bin, gint seconds)
+{
+ gboolean punch_in;
+ GstStateChangeReturn ret;
+ GstClockTime now, base_time, running_time;
+
+ /* get current running time, we need this value to continue playback of
+ * non-live pipelines. */
+ now = gst_clock_get_time (theclock);
+ base_time = gst_element_get_base_time (bin);
+
+ running_time = now - base_time;
+
+ /* set the new bin to PAUSED, the parent bin will notice (because of the ASYNC
+ * message and will perform latency calculations again when going to PLAYING
+ * later. */
+ ret = gst_element_set_state (bin, GST_STATE_PAUSED);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* live source, timestamps are running_time of the pipeline clock. */
+ punch_in = FALSE;
+ break;
+ case GST_STATE_CHANGE_SUCCESS:
+ /* success, no async state changes, same as async, timestamps start
+ * from 0 */
+ case GST_STATE_CHANGE_ASYNC:
+ /* no live source, bin will preroll. We have to punch it in because in
+ * this situation timestamps start from 0. */
+ punch_in = TRUE;
+ break;
+ default:
+ case GST_STATE_CHANGE_FAILURE:
+ return FALSE;
+ }
+
+ if (seconds)
+ g_usleep (seconds * G_USEC_PER_SEC);
+
+ if (punch_in) {
+ /* new bin has to be aligned with previous running_time. We do this by taking
+ * the current absolute clock time and calculating the base time that would
+ * give the previous running_time. We set this base_time on the bin before
+ * setting it to PLAYING. */
+ now = gst_clock_get_time (theclock);
+ base_time = now - running_time;
+
+ gst_element_set_base_time (bin, base_time);
+ }
+
+ /* now set the pipeline to PLAYING */
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ return TRUE;
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static void
+eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * pipeline)
+{
+ message_received (bus, message, pipeline);
+ g_main_loop_quit (loop);
+}
+
+static gboolean
+perform_step (gpointer pstep)
+{
+ gint step = GPOINTER_TO_INT (pstep);
+
+ switch (step) {
+ case 0:
+ /* live stream locks on to running_time, pipeline configures latency. */
+ g_print ("creating bin1\n");
+ bin1 =
+ create_stream
+ ("( v4l2src ! videoconvert ! timeoverlay ! queue ! xvimagesink name=v4llive )");
+ pause_play_stream (bin1, 0);
+ g_timeout_add (1000, (GSourceFunc) perform_step, GINT_TO_POINTER (1));
+ break;
+ case 1:
+ /* live stream locks on to running_time, pipeline reconfigures latency
+ * together with the previously added bin so that they run synchronized. */
+ g_print ("creating bin2\n");
+ bin2 = create_stream ("( alsasrc ! queue ! alsasink name=alsalive )");
+ pause_play_stream (bin2, 0);
+ g_timeout_add (1000, (GSourceFunc) perform_step, GINT_TO_POINTER (2));
+ break;
+ case 2:
+ /* non-live stream, need base_time to align with current running live sources. */
+ g_print ("creating bin3\n");
+ bin3 = create_stream ("( audiotestsrc ! alsasink name=atnonlive )");
+ pause_play_stream (bin3, 0);
+ g_timeout_add (1000, (GSourceFunc) perform_step, GINT_TO_POINTER (3));
+ break;
+ case 3:
+ g_print ("creating bin4\n");
+ bin4 =
+ create_stream
+ ("( videotestsrc ! timeoverlay ! videoconvert ! ximagesink name=vtnonlive )");
+ pause_play_stream (bin4, 0);
+ g_timeout_add (1000, (GSourceFunc) perform_step, GINT_TO_POINTER (4));
+ break;
+ case 4:
+ /* live stream locks on to running_time */
+ g_print ("creating bin5\n");
+ bin5 =
+ create_stream
+ ("( videotestsrc is-live=1 ! timeoverlay ! videoconvert ! ximagesink name=vtlive )");
+ pause_play_stream (bin5, 0);
+ g_timeout_add (1000, (GSourceFunc) perform_step, GINT_TO_POINTER (5));
+ break;
+ case 5:
+ /* pause the fist live stream for 2 seconds */
+ g_print ("PAUSE bin1 for 2 seconds\n");
+ pause_play_stream (bin1, 2);
+ /* pause the non-live stream for 2 seconds */
+ g_print ("PAUSE bin4 for 2 seconds\n");
+ pause_play_stream (bin4, 2);
+ /* pause the pseudo live stream for 2 seconds */
+ g_print ("PAUSE bin5 for 2 seconds\n");
+ pause_play_stream (bin5, 2);
+ g_print ("Waiting 5 seconds\n");
+ g_timeout_add (5000, (GSourceFunc) perform_step, GINT_TO_POINTER (6));
+ break;
+ case 6:
+ g_print ("quiting\n");
+ g_main_loop_quit (loop);
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ /* setup message handling */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_received,
+ pipeline);
+
+ /* we set the pipeline to PLAYING, this will distribute a default clock and
+ * start running. no preroll is needed */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* get the clock now. Since we never set the pipeline to PAUSED again, the
+ * clock will not change, even when we add new clock providers later. */
+ theclock = gst_element_get_clock (pipeline);
+
+ /* start our actions while we are in the mainloop so that we can catch errors
+ * and other messages. */
+ g_idle_add ((GSourceFunc) perform_step, GINT_TO_POINTER (0));
+ /* go to main loop */
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+ gst_object_unref (theclock);
+
+ return 0;
+}
diff --git a/tests/examples/dynamic/codec-select.c b/tests/examples/dynamic/codec-select.c
new file mode 100644
index 0000000..2d8f9fa
--- /dev/null
+++ b/tests/examples/dynamic/codec-select.c
@@ -0,0 +1,298 @@
+/* GStreamer
+ *
+ * codec-select.c: sample application to dynamically select a codec
+ *
+ * Copyright (C) <2008> Wim Taymans <wim dot taymans at gmail dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * This example sets up a pipeline to 'encode' an audiotestsrc into 3 different
+ * formats. The format can be selected dynamically at runtime.
+ *
+ * Each of the encoders require the audio in a specific different format.
+ *
+ * This example uses identity as the encoder and enforces the caps on identity
+ * with a capsfilter.
+ *
+ * This is a good example of input and output selector and how these elements
+ * preserve segment and timing information while switching between streams.
+ */
+
+#include <string.h>
+#include <gst/gst.h>
+
+/* Create an encoder element.
+ * We make a bin containing:
+ *
+ * audioresample ! <enccaps> ! identity
+ *
+ * The sinkpad of audioresample and source pad of identity are ghosted on the
+ * bin.
+ */
+static GstElement *
+make_encoder (const GstCaps * caps)
+{
+ GstElement *result;
+ GstElement *audioresample;
+ GstElement *capsfilter;
+ GstElement *identity;
+ GstPad *pad;
+
+ /* create result bin */
+ result = gst_bin_new (NULL);
+ g_assert (result);
+
+ /* create elements */
+ audioresample = gst_element_factory_make ("audioresample", NULL);
+ g_assert (audioresample);
+
+ capsfilter = gst_element_factory_make ("capsfilter", NULL);
+ g_assert (capsfilter);
+ g_object_set (capsfilter, "caps", caps, NULL);
+
+ identity = gst_element_factory_make ("identity", NULL);
+ g_assert (identity);
+ g_object_set (identity, "silent", TRUE, NULL);
+
+ /* add elements to result bin */
+ gst_bin_add (GST_BIN (result), audioresample);
+ gst_bin_add (GST_BIN (result), capsfilter);
+ gst_bin_add (GST_BIN (result), identity);
+
+ /* link elements */
+ gst_element_link_pads (audioresample, "src", capsfilter, "sink");
+ gst_element_link_pads (capsfilter, "src", identity, "sink");
+
+ /* ghost src and sink pads */
+ pad = gst_element_get_static_pad (audioresample, "sink");
+ gst_element_add_pad (result, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ pad = gst_element_get_static_pad (identity, "src");
+ gst_element_add_pad (result, gst_ghost_pad_new ("src", pad));
+ gst_object_unref (pad);
+
+ return result;
+}
+
+/*
+ * We generate:
+ *
+ * audiotestsrc ! <audiocaps> ! output-selector ! [enc1 .. enc3] ! input-selector
+ * select-all = true ! fakesink
+ *
+ * <audiocaps> makes sure we only produce one format from the audiotestsrc.
+ *
+ * Each encX element consists of:
+ *
+ * audioresample ! <enccaps> ! identity !
+ *
+ * This way we can simply switch encoders without having to renegotiate.
+ */
+static GstElement *
+make_pipeline (void)
+{
+ GstElement *result;
+ GstElement *audiotestsrc;
+ GstElement *audiocaps;
+ GstElement *outputselect;
+ GstElement *inputselect;
+ GstElement *sink;
+ GstCaps *caps;
+ GstCaps *capslist[3];
+ gint i;
+
+ /* create result pipeline */
+ result = gst_pipeline_new (NULL);
+ g_assert (result);
+
+ /* create various elements */
+ audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+ g_object_set (audiotestsrc, "num-buffers", 1000, NULL);
+ g_assert (audiotestsrc);
+
+ audiocaps = gst_element_factory_make ("capsfilter", NULL);
+ g_assert (audiocaps);
+
+ caps =
+ gst_caps_from_string
+ ("audio/x-raw-int,signed=true,width=16,depth=16,rate=48000,channels=1");
+ g_object_set (audiocaps, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ outputselect = gst_element_factory_make ("output-selector", "select");
+ g_assert (outputselect);
+
+ inputselect = gst_element_factory_make ("input-selector", NULL);
+ g_assert (inputselect);
+ g_object_set (inputselect, "select-all", TRUE, NULL);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ g_object_set (sink, "sync", TRUE, NULL);
+ g_object_set (sink, "silent", TRUE, NULL);
+ g_assert (sink);
+
+ /* add elements */
+ gst_bin_add (GST_BIN (result), audiotestsrc);
+ gst_bin_add (GST_BIN (result), audiocaps);
+ gst_bin_add (GST_BIN (result), outputselect);
+ gst_bin_add (GST_BIN (result), inputselect);
+ gst_bin_add (GST_BIN (result), sink);
+
+ /* link elements */
+ gst_element_link_pads (audiotestsrc, "src", audiocaps, "sink");
+ gst_element_link_pads (audiocaps, "src", outputselect, "sink");
+ gst_element_link_pads (inputselect, "src", sink, "sink");
+
+ /* make caps */
+ capslist[0] =
+ gst_caps_from_string
+ ("audio/x-raw-int,signed=true,width=16,depth=16,rate=48000,channels=1");
+ capslist[1] =
+ gst_caps_from_string
+ ("audio/x-raw-int,signed=true,width=16,depth=16,rate=16000,channels=1");
+ capslist[2] =
+ gst_caps_from_string
+ ("audio/x-raw-int,signed=true,width=16,depth=16,rate=8000,channels=1");
+
+ /* create encoder elements */
+ for (i = 0; i < 3; i++) {
+ GstElement *encoder;
+ GstPad *srcpad, *sinkpad;
+
+ encoder = make_encoder (capslist[i]);
+ g_assert (encoder);
+
+ gst_bin_add (GST_BIN (result), encoder);
+
+ srcpad = gst_element_get_request_pad (outputselect, "src%d");
+ sinkpad = gst_element_get_static_pad (encoder, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ srcpad = gst_element_get_static_pad (encoder, "src");
+ sinkpad = gst_element_get_request_pad (inputselect, "sink%d");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+ }
+
+ return result;
+}
+
+static gboolean
+do_switch (GstElement * pipeline)
+{
+ gint rand;
+ GstElement *select;
+ gchar *name;
+ GstPad *pad;
+
+ rand = g_random_int_range (0, 3);
+
+ g_print ("switching to %d\n", rand);
+
+ /* find the selector */
+ select = gst_bin_get_by_name (GST_BIN (pipeline), "select");
+
+ /* get the named pad */
+ name = g_strdup_printf ("src%d", rand);
+ pad = gst_element_get_static_pad (select, name);
+ g_free (name);
+
+ /* set the active pad */
+ g_object_set (select, "active-pad", pad, NULL);
+
+ return TRUE;
+}
+
+static gboolean
+my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstElement *sender = (GstElement *) GST_MESSAGE_SRC (message);
+ const gchar *name = gst_element_get_name (sender);
+ GMainLoop *loop = (GMainLoop *) data;
+
+ g_print ("Got %s message from %s\n", GST_MESSAGE_TYPE_NAME (message), name);
+
+ switch (GST_MESSAGE_TYPE (message)) {
+
+ case GST_MESSAGE_ERROR:{
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &err, &debug);
+ g_print ("Error: %s (%s)\n", err->message, debug);
+ g_error_free (err);
+ g_free (debug);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ g_main_loop_quit (loop);
+ break;
+ default:
+ /* unhandled message */
+ break;
+ }
+
+ return TRUE;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *pipeline;
+ GstBus *bus;
+ GMainLoop *loop;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* set up */
+ pipeline = make_pipeline ();
+
+ g_signal_connect (pipeline, "deep_notify",
+ G_CALLBACK (gst_object_default_deep_notify), NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ g_print ("Starting pipeline\n");
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* add a timeout to cycle between the formats */
+ g_timeout_add (1000, (GSourceFunc) do_switch, pipeline);
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ g_print ("Nulling pipeline\n");
+
+ /* also clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/dynamic/sprinkle.c b/tests/examples/dynamic/sprinkle.c
new file mode 100644
index 0000000..1b75840
--- /dev/null
+++ b/tests/examples/dynamic/sprinkle.c
@@ -0,0 +1,264 @@
+/* GStreamer
+ *
+ * sprinkle.c: sample application to dynamically mix tones with adder
+ *
+ * Copyright (C) <2009> Wim Taymans <wim dot taymans at gmail dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Produces a sweeping sprinkle of tones by dynamically adding and removing
+ * elements to adder.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+static GstElement *pipeline, *adder;
+static GMainLoop *loop;
+
+typedef struct
+{
+ GstElement *element;
+ GstPad *srcpad;
+ GstPad *sinkpad;
+ gdouble freq;
+} SourceInfo;
+
+/* dynamically add the source to the pipeline and link it to a new pad on
+ * adder */
+static SourceInfo *
+add_source (gdouble freq)
+{
+ SourceInfo *info;
+
+ info = g_new0 (SourceInfo, 1);
+ info->freq = freq;
+
+ /* make source with unique name */
+ info->element = gst_element_factory_make ("audiotestsrc", NULL);
+
+ g_object_set (info->element, "freq", freq, NULL);
+
+ /* add to the bin */
+ gst_bin_add (GST_BIN (pipeline), info->element);
+
+ /* get pad from the element */
+ info->srcpad = gst_element_get_static_pad (info->element, "src");
+
+ /* get new pad from adder, adder will now wait for data on this pad */
+ info->sinkpad = gst_element_get_request_pad (adder, "sink%d");
+
+ /* link pad to adder */
+ gst_pad_link (info->srcpad, info->sinkpad);
+
+ /* and play the element */
+ gst_element_set_state (info->element, GST_STATE_PLAYING);
+
+ g_print ("added freq %f\n", info->freq);
+
+ return info;
+}
+
+/* remove the source from the pipeline after removing it from adder */
+static void
+remove_source (SourceInfo * info)
+{
+ g_print ("remove freq %f\n", info->freq);
+
+ /* lock the state so that we can put it to NULL without the parent messing
+ * with our state */
+ gst_element_set_locked_state (info->element, TRUE);
+
+ /* first stop the source. Remember that this might block when in the PAUSED
+ * state. Alternatively one could send EOS to the source, install an event
+ * probe and schedule a state change/unlink/release from the mainthread.
+ * Note that changing the state of a source makes it emit an EOS, which can
+ * make adder go EOS. */
+ gst_element_set_state (info->element, GST_STATE_NULL);
+
+ /* unlink from adder */
+ gst_pad_unlink (info->srcpad, info->sinkpad);
+ gst_object_unref (info->srcpad);
+
+ /* remove from the bin */
+ gst_bin_remove (GST_BIN (pipeline), info->element);
+
+ /* give back the pad */
+ gst_element_release_request_pad (adder, info->sinkpad);
+ gst_object_unref (info->sinkpad);
+
+ g_free (info);
+}
+
+/* we'll keep the state of the sources in this structure. We keep 3 sources
+ * alive */
+typedef struct
+{
+ guint count;
+ SourceInfo *infos[3];
+} SprinkleState;
+
+static SprinkleState *
+create_state (void)
+{
+ SprinkleState *state;
+
+ state = g_new0 (SprinkleState, 1);
+
+ return state;
+}
+
+static void
+free_state (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ for (i = 0; i < 3; i++) {
+ info = state->infos[i];
+ if (info)
+ remove_source (info);
+ }
+
+ g_free (state);
+}
+
+static gboolean
+do_sprinkle (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ /* first remove the oldest info */
+ info = state->infos[2];
+
+ if (info)
+ remove_source (info);
+
+ /* move sources */
+ for (i = 2; i > 0; i--) {
+ state->infos[i] = state->infos[i - 1];
+ }
+
+ /* add new source, stop adding sources after 10 rounds. */
+ if (state->count < 10) {
+ state->infos[0] = add_source ((state->count * 100) + 200);
+ state->count++;
+ } else {
+ state->infos[0] = NULL;
+ }
+ return TRUE;
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static void
+eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * pipeline)
+{
+ message_received (bus, message, pipeline);
+ g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+ GstElement *filter, *convert, *sink;
+ GstCaps *caps;
+ gboolean res;
+ SprinkleState *state;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ /* add the fixed part to the pipeline. Remember that we need a capsfilter
+ * after adder so that multiple sources are not racing to negotiate
+ * a format */
+ adder = gst_element_factory_make ("adder", "adder");
+ filter = gst_element_factory_make ("capsfilter", "filter");
+ convert = gst_element_factory_make ("audioconvert", "convert");
+ sink = gst_element_factory_make ("autoaudiosink", "sink");
+
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
+ "channels", G_TYPE_INT, 1,
+ "width", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "rate", G_TYPE_INT, 44100, "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ gst_bin_add_many (GST_BIN (pipeline), adder, filter, convert, sink, NULL);
+
+ res = gst_element_link_many (adder, filter, convert, sink, NULL);
+ g_assert (res);
+
+ /* setup message handling */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_received,
+ pipeline);
+
+ /* we set the pipeline to PLAYING, the pipeline will not yet preroll because
+ * there is no source providing data for it yet */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* and add the function that modifies the pipeline every 100ms */
+ state = create_state ();
+ g_timeout_add (100, (GSourceFunc) do_sprinkle, state);
+
+ /* go to main loop */
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ free_state (state);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/dynamic/sprinkle2.c b/tests/examples/dynamic/sprinkle2.c
new file mode 100644
index 0000000..abab47c
--- /dev/null
+++ b/tests/examples/dynamic/sprinkle2.c
@@ -0,0 +1,288 @@
+/* GStreamer
+ *
+ * sprinkle.c: sample application to dynamically mix tones with adder
+ *
+ * Copyright (C) <2009> Wim Taymans <wim dot taymans at gmail dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Produces a sweeping sprinkle of tones by dynamically adding and removing
+ * elements to adder.
+ *
+ * gcc `pkg-config --cflags --libs gstreamer-0.10` sprinkle2.c -osprinkle2
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+static GstElement *pipeline, *adder;
+static GMainLoop *loop;
+
+typedef struct
+{
+ GstElement *src, *fx;
+ GstPad *src_srcpad;
+ GstPad *fx_sinkpad, *fx_srcpad;
+ GstPad *adder_sinkpad;
+ gdouble freq;
+ gfloat pos;
+} SourceInfo;
+
+/* dynamically add the source to the pipeline and link it to a new pad on
+ * adder */
+static SourceInfo *
+add_source (gdouble freq, gfloat pos)
+{
+ SourceInfo *info;
+
+ info = g_new0 (SourceInfo, 1);
+ info->freq = freq;
+ info->pos = pos;
+
+ /* make source with unique name */
+ info->src = gst_element_factory_make ("audiotestsrc", NULL);
+ info->fx = gst_element_factory_make ("audiopanorama", NULL);
+
+ g_object_set (info->src, "freq", freq, "volume", (gdouble) 0.35, NULL);
+ g_object_set (info->fx, "panorama", pos, NULL);
+
+ /* add to the bin */
+ gst_bin_add (GST_BIN (pipeline), info->src);
+ gst_bin_add (GST_BIN (pipeline), info->fx);
+
+ /* get pads from the elements */
+ info->src_srcpad = gst_element_get_static_pad (info->src, "src");
+ info->fx_srcpad = gst_element_get_static_pad (info->fx, "src");
+ info->fx_sinkpad = gst_element_get_static_pad (info->fx, "sink");
+
+ /* get new pad from adder, adder will now wait for data on this pad */
+ info->adder_sinkpad = gst_element_get_request_pad (adder, "sink%d");
+
+ /* link src to fx and fx to adder */
+ gst_pad_link (info->fx_srcpad, info->adder_sinkpad);
+ gst_pad_link (info->src_srcpad, info->fx_sinkpad);
+
+ /* and play the elements, change the state from sink to source */
+ gst_element_set_state (info->fx, GST_STATE_PLAYING);
+ gst_element_set_state (info->src, GST_STATE_PLAYING);
+
+ g_print ("added freq %5.0f, pos %3.1f\n", info->freq, info->pos);
+
+ return info;
+}
+
+/* remove the source from the pipeline after removing it from adder */
+static void
+remove_source (SourceInfo * info)
+{
+ g_print ("remove freq %5.0f, pos %3.1f\n", info->freq, info->pos);
+
+ /* lock the state so that we can put it to NULL without the parent messing
+ * with our state */
+ gst_element_set_locked_state (info->src, TRUE);
+ gst_element_set_locked_state (info->fx, TRUE);
+
+ /* first stop the source. Remember that this might block when in the PAUSED
+ * state. Alternatively one could send EOS to the source, install an event
+ * probe and schedule a state change/unlink/release from the mainthread. */
+ gst_element_set_state (info->fx, GST_STATE_NULL);
+ /* NOTE that the source emits EOS when shutting down but the EOS will not
+ * reach the adder sinkpad because the effect is in the NULL state. We will
+ * send an EOS to adder later. */
+ gst_element_set_state (info->src, GST_STATE_NULL);
+
+ /* unlink from adder */
+ gst_pad_unlink (info->src_srcpad, info->fx_sinkpad);
+ gst_pad_unlink (info->fx_srcpad, info->adder_sinkpad);
+ gst_object_unref (info->src_srcpad);
+ gst_object_unref (info->fx_srcpad);
+ gst_object_unref (info->fx_sinkpad);
+
+ /* remove from the bin */
+ gst_bin_remove (GST_BIN (pipeline), info->src);
+ gst_bin_remove (GST_BIN (pipeline), info->fx);
+
+ /* send EOS to the sinkpad to make adder EOS when needed */
+ gst_pad_send_event (info->adder_sinkpad, gst_event_new_eos ());
+
+ /* give back the pad */
+ gst_element_release_request_pad (adder, info->adder_sinkpad);
+ gst_object_unref (info->adder_sinkpad);
+
+ g_free (info);
+}
+
+/* we'll keep the state of the sources in this structure. We keep 3 sources
+ * alive */
+typedef struct
+{
+ guint count;
+ SourceInfo *infos[3];
+} SprinkleState;
+
+static SprinkleState *
+create_state (void)
+{
+ SprinkleState *state;
+
+ state = g_new0 (SprinkleState, 1);
+
+ return state;
+}
+
+static void
+free_state (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ for (i = 0; i < 3; i++) {
+ info = state->infos[i];
+ if (info)
+ remove_source (info);
+ }
+
+ g_free (state);
+}
+
+static gboolean
+do_sprinkle (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ /* first remove the oldest info */
+ info = state->infos[2];
+
+ if (info)
+ remove_source (info);
+
+ /* move sources */
+ for (i = 2; i > 0; i--) {
+ state->infos[i] = state->infos[i - 1];
+ }
+
+ /* add new source, stop adding sources after 10 rounds. */
+ if (state->count < 20) {
+ state->infos[0] = add_source (
+ (gdouble) ((state->count * 100) + 200),
+ ((gfloat) (state->count % 5) / 2.0 - 1.0));
+ state->count++;
+ } else {
+ state->infos[0] = NULL;
+ }
+ return TRUE;
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static void
+eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * pipeline)
+{
+ message_received (bus, message, pipeline);
+ g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+ GstElement *filter, *convert, *sink;
+ GstCaps *caps;
+ gboolean res;
+ SprinkleState *state;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ /* add the fixed part to the pipeline. Remember that we need a capsfilter
+ * after adder so that multiple sources are not racing to negotiate
+ * a format */
+ adder = gst_element_factory_make ("adder", "adder");
+ filter = gst_element_factory_make ("capsfilter", "filter");
+ convert = gst_element_factory_make ("audioconvert", "convert");
+ sink = gst_element_factory_make ("autoaudiosink", "sink");
+
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
+ "channels", G_TYPE_INT, 2,
+ "width", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "rate", G_TYPE_INT, 44100, "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ gst_bin_add_many (GST_BIN (pipeline), adder, filter, convert, sink, NULL);
+
+ res = gst_element_link_many (adder, filter, convert, sink, NULL);
+ g_assert (res);
+
+ /* setup message handling */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_received,
+ pipeline);
+
+ /* we set the pipeline to PLAYING, the pipeline will not yet preroll because
+ * there is no source providing data for it yet */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* and add the function that modifies the pipeline every 100ms */
+ state = create_state ();
+ g_timeout_add (100, (GSourceFunc) do_sprinkle, state);
+
+ /* go to main loop */
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ free_state (state);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/dynamic/sprinkle3.c b/tests/examples/dynamic/sprinkle3.c
new file mode 100644
index 0000000..5983c33
--- /dev/null
+++ b/tests/examples/dynamic/sprinkle3.c
@@ -0,0 +1,301 @@
+/* GStreamer
+ *
+ * sprinkle.c: sample application to dynamically mix tones with adder
+ *
+ * Copyright (C) <2009> Wim Taymans <wim dot taymans at gmail dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Produces a sweeping sprinkle of tones by dynamically adding and removing
+ * elements to adder.
+ *
+ * gcc `pkg-config --cflags --libs gstreamer-0.10` sprinkle3.c -osprinkle3
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+static GstElement *pipeline, *adder;
+static GMainLoop *loop;
+
+typedef struct
+{
+ GstElement *bin, *src, *fx;
+ GstPad *src_srcpad;
+ GstPad *fx_sinkpad, *fx_srcpad;
+ GstPad *adder_sinkpad;
+ GstPad *bin_srcpad;
+ gdouble freq;
+ gfloat pos;
+} SourceInfo;
+
+/* dynamically add the source to the pipeline and link it to a new pad on
+ * adder */
+static SourceInfo *
+add_source (gdouble freq, gfloat pos)
+{
+ SourceInfo *info;
+
+ info = g_new0 (SourceInfo, 1);
+ info->freq = freq;
+ info->pos = pos;
+
+ /* make source with unique name */
+ info->bin = gst_element_factory_make ("bin", NULL);
+ info->src = gst_element_factory_make ("audiotestsrc", NULL);
+ info->fx = gst_element_factory_make ("audiopanorama", NULL);
+
+ g_object_set (info->src, "freq", freq, "volume", (gdouble) 0.35, NULL);
+ g_object_set (info->fx, "panorama", pos, NULL);
+
+ /* add to the bin */
+ gst_bin_add (GST_BIN (info->bin), info->src);
+ gst_bin_add (GST_BIN (info->bin), info->fx);
+
+ /* get pads from the elements */
+ info->src_srcpad = gst_element_get_static_pad (info->src, "src");
+ info->fx_srcpad = gst_element_get_static_pad (info->fx, "src");
+ info->fx_sinkpad = gst_element_get_static_pad (info->fx, "sink");
+
+ /* create and add a pad for the bin */
+ info->bin_srcpad = gst_ghost_pad_new ("src", info->fx_srcpad);
+ gst_element_add_pad (info->bin, info->bin_srcpad);
+
+ /* get new pad from adder, adder will now wait for data on this pad */
+ info->adder_sinkpad = gst_element_get_request_pad (adder, "sink%d");
+
+ /* link inside the bin */
+ gst_pad_link (info->src_srcpad, info->fx_sinkpad);
+
+ /* add bin to pipeline */
+ gst_bin_add (GST_BIN (pipeline), info->bin);
+
+ /* link bin to adder */
+ gst_pad_link (info->bin_srcpad, info->adder_sinkpad);
+
+ /* and play the elements */
+ gst_element_set_state (info->bin, GST_STATE_PLAYING);
+
+ g_print ("added freq %5.0f, pos %3.1f\n", info->freq, info->pos);
+
+ return info;
+}
+
+/* remove the source from the pipeline after removing it from adder */
+static void
+remove_source (SourceInfo * info)
+{
+ g_print ("remove freq %5.0f, pos %3.1f\n", info->freq, info->pos);
+
+ /* lock the state so that we can put it to NULL without the parent messing
+ * with our state */
+ gst_element_set_locked_state (info->bin, TRUE);
+
+ /* first stop the source. Remember that this might block when in the PAUSED
+ * state. Alternatively one could send EOS to the source, install an event
+ * probe and schedule a state change/unlink/release from the mainthread. */
+ /* NOTE that the source inside the bin will emit EOS but it will not reach
+ * adder because the element after the source is shut down first. We will send
+ * EOS later */
+ gst_element_set_state (info->bin, GST_STATE_NULL);
+
+ /* unlink bin from adder */
+ gst_pad_unlink (info->bin_srcpad, info->adder_sinkpad);
+
+ /* release pads */
+ gst_object_unref (info->src_srcpad);
+ gst_object_unref (info->fx_srcpad);
+ gst_object_unref (info->fx_sinkpad);
+
+ /* remove from the bin */
+ gst_bin_remove (GST_BIN (pipeline), info->bin);
+
+ /* send EOS to the sinkpad to make adder EOS when needed */
+ gst_pad_send_event (info->adder_sinkpad, gst_event_new_eos ());
+
+ /* give back the pad */
+ gst_element_release_request_pad (adder, info->adder_sinkpad);
+ gst_object_unref (info->adder_sinkpad);
+
+ g_free (info);
+}
+
+/* we'll keep the state of the sources in this structure. We keep 3 sources
+ * alive */
+typedef struct
+{
+ guint count;
+ SourceInfo *infos[3];
+} SprinkleState;
+
+static SprinkleState *
+create_state (void)
+{
+ SprinkleState *state;
+
+ state = g_new0 (SprinkleState, 1);
+
+ return state;
+}
+
+static void
+free_state (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ for (i = 0; i < 3; i++) {
+ info = state->infos[i];
+ if (info)
+ remove_source (info);
+ }
+
+ g_free (state);
+}
+
+static gboolean
+do_sprinkle (SprinkleState * state)
+{
+ SourceInfo *info;
+ gint i;
+
+ /* first remove the oldest info */
+ info = state->infos[2];
+
+ if (info)
+ remove_source (info);
+
+ /* move sources */
+ for (i = 2; i > 0; i--) {
+ state->infos[i] = state->infos[i - 1];
+ }
+
+ /* add new source, stop adding sources after 10 rounds. */
+ if (state->count < 20) {
+ state->infos[0] = add_source (
+ (gdouble) ((state->count * 100) + 200),
+ ((gfloat) (state->count % 5) / 2.0 - 1.0));
+ state->count++;
+ } else {
+ state->infos[0] = NULL;
+ }
+
+ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
+ /*GST_DEBUG_GRAPH_SHOW_ALL, */
+ GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS | GST_DEBUG_GRAPH_SHOW_STATES,
+ "sprinkle3");
+ return TRUE;
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static void
+eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * pipeline)
+{
+ message_received (bus, message, pipeline);
+ g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+ GstElement *filter, *convert, *sink;
+ GstCaps *caps;
+ gboolean res;
+ SprinkleState *state;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ /* add the fixed part to the pipeline. Remember that we need a capsfilter
+ * after adder so that multiple sources are not racing to negotiate
+ * a format */
+ adder = gst_element_factory_make ("adder", "adder");
+ filter = gst_element_factory_make ("capsfilter", "filter");
+ convert = gst_element_factory_make ("audioconvert", "convert");
+ sink = gst_element_factory_make ("autoaudiosink", "sink");
+
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
+ "channels", G_TYPE_INT, 2,
+ "width", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "rate", G_TYPE_INT, 44100, "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ gst_bin_add_many (GST_BIN (pipeline), adder, filter, convert, sink, NULL);
+
+ res = gst_element_link_many (adder, filter, convert, sink, NULL);
+ g_assert (res);
+
+ /* setup message handling */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_received,
+ pipeline);
+
+ /* we set the pipeline to PLAYING, the pipeline will not yet preroll because
+ * there is no source providing data for it yet */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* and add the function that modifies the pipeline every 100ms */
+ state = create_state ();
+ g_timeout_add (100, (GSourceFunc) do_sprinkle, state);
+
+ /* go to main loop */
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ free_state (state);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/encoding/Makefile.am b/tests/examples/encoding/Makefile.am
new file mode 100644
index 0000000..820a608
--- /dev/null
+++ b/tests/examples/encoding/Makefile.am
@@ -0,0 +1,14 @@
+examples = encoding
+
+encoding_SOURCES = gstcapslist.c encoding.c
+EXTRA_DIST = gstcapslist.h
+
+noinst_PROGRAMS = $(examples)
+
+LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS)
+AM_CFLAGS = -I$(top_builddir)/gst-libs \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS)
diff --git a/tests/examples/encoding/Makefile.in b/tests/examples/encoding/Makefile.in
new file mode 100644
index 0000000..79b0d44
--- /dev/null
+++ b/tests/examples/encoding/Makefile.in
@@ -0,0 +1,702 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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/encoding
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__EXEEXT_1 = encoding$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_encoding_OBJECTS = gstcapslist.$(OBJEXT) encoding.$(OBJEXT)
+encoding_OBJECTS = $(am_encoding_OBJECTS)
+encoding_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+encoding_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(encoding_SOURCES)
+DIST_SOURCES = $(encoding_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+examples = encoding
+encoding_SOURCES = gstcapslist.c encoding.c
+EXTRA_DIST = gstcapslist.h
+LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS)
+
+AM_CFLAGS = -I$(top_builddir)/gst-libs \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) \
+ $(GST_CFLAGS)
+
+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/encoding/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/encoding/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
+encoding$(EXEEXT): $(encoding_OBJECTS) $(encoding_DEPENDENCIES)
+ @rm -f encoding$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(encoding_OBJECTS) $(encoding_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encoding.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstcapslist.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/encoding/encoding.c b/tests/examples/encoding/encoding.c
new file mode 100644
index 0000000..497aa63
--- /dev/null
+++ b/tests/examples/encoding/encoding.c
@@ -0,0 +1,512 @@
+/* Example application for using GstProfile and encodebin
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/pbutils/encoding-profile.h>
+#include "gstcapslist.h"
+
+static gboolean silent = FALSE;
+
+static void
+list_codecs (void)
+{
+ GstCaps *l;
+ GstCaps *caps;
+ guint i, len;
+
+ caps = gst_caps_new_empty ();
+
+ g_print ("Available container formats:\n");
+ l = gst_caps_list_container_formats (GST_RANK_NONE);
+ len = gst_caps_get_size (l);
+ for (i = 0; i < len; i++) {
+ GstStructure *st = gst_caps_steal_structure (l, 0);
+ gchar *tmpstr, *desc;
+
+ gst_caps_append_structure (caps, st);
+
+ tmpstr = gst_caps_to_string (caps);
+ desc = gst_pb_utils_get_codec_description (caps);
+ g_print (" %s - %s\n", desc, tmpstr);
+ g_free (tmpstr);
+ if (desc)
+ g_free (desc);
+ gst_caps_remove_structure (caps, 0);
+ }
+ g_print ("\n");
+ gst_caps_unref (l);
+
+ g_print ("Available video codecs:\n");
+ l = gst_caps_list_video_encoding_formats (GST_RANK_NONE);
+ len = gst_caps_get_size (l);
+ for (i = 0; i < len; i++) {
+ GstStructure *st = gst_caps_steal_structure (l, 0);
+ gchar *tmpstr, *desc;
+
+ gst_caps_append_structure (caps, st);
+
+ tmpstr = gst_caps_to_string (caps);
+ desc = gst_pb_utils_get_codec_description (caps);
+ g_print (" %s - %s\n", desc, tmpstr);
+ g_free (tmpstr);
+ if (desc)
+ g_free (desc);
+ gst_caps_remove_structure (caps, 0);
+ }
+ g_print ("\n");
+ gst_caps_unref (l);
+
+ g_print ("Available audio codecs:\n");
+ l = gst_caps_list_audio_encoding_formats (GST_RANK_NONE);
+ len = gst_caps_get_size (l);
+ for (i = 0; i < len; i++) {
+ GstStructure *st = gst_caps_steal_structure (l, 0);
+ gchar *tmpstr, *desc;
+
+ gst_caps_append_structure (caps, st);
+
+ tmpstr = gst_caps_to_string (caps);
+ desc = gst_pb_utils_get_codec_description (caps);
+ g_print (" %s - %s\n", desc, tmpstr);
+ g_free (tmpstr);
+ if (desc)
+ g_free (desc);
+ gst_caps_remove_structure (caps, 0);
+ }
+ g_print ("\n");
+ gst_caps_unref (l);
+
+ gst_caps_unref (caps);
+}
+
+static gchar *
+generate_filename (const GstCaps * container, const GstCaps * vcodec,
+ const GstCaps * acodec)
+{
+ gchar *a, *b, *c;
+ gchar *res = NULL;
+ guint i;
+
+ a = gst_pb_utils_get_codec_description (container);
+ b = gst_pb_utils_get_codec_description (vcodec);
+ c = gst_pb_utils_get_codec_description (acodec);
+
+ if (!a)
+ a = g_strdup_printf ("%.10s",
+ g_uri_escape_string (gst_caps_to_string (container), NULL, FALSE));
+ if (!b)
+ b = g_strdup_printf ("%.10s",
+ g_uri_escape_string (gst_caps_to_string (vcodec), NULL, FALSE));
+ if (!c)
+ c = g_strdup_printf ("%.10s",
+ g_uri_escape_string (gst_caps_to_string (acodec), NULL, FALSE));
+
+ for (i = 0; i < 256 && res == NULL; i++) {
+ res = g_strdup_printf ("%s-%s-%s-%d.file", a, b, c, i);
+ if (g_file_test (res, G_FILE_TEST_EXISTS)) {
+ g_free (res);
+ res = NULL;
+ }
+ }
+ /* Make sure file doesn't already exist */
+
+ g_free (a);
+ g_free (b);
+ g_free (c);
+
+ return res;
+}
+
+static GstEncodingProfile *
+create_profile (GstCaps * cf, GstCaps * vf, GstCaps * af)
+{
+ GstEncodingContainerProfile *cprof = NULL;
+
+ cprof =
+ gst_encoding_container_profile_new ((gchar *) "test-application-profile",
+ NULL, cf, NULL);
+
+ if (vf)
+ gst_encoding_container_profile_add_profile (cprof,
+ (GstEncodingProfile *) gst_encoding_video_profile_new (vf,
+ NULL, NULL, 0));
+ if (af)
+ gst_encoding_container_profile_add_profile (cprof, (GstEncodingProfile *)
+ gst_encoding_audio_profile_new (af, NULL, NULL, 0));
+
+ /* Let's print out some info */
+ if (!silent) {
+ gchar *desc = gst_pb_utils_get_codec_description (cf);
+ gchar *cd = gst_caps_to_string (cf);
+ g_print ("Encoding parameters\n");
+ g_print (" Container format : %s (%s)\n", desc, cd);
+ g_free (desc);
+ g_free (cd);
+ if (vf) {
+ desc = gst_pb_utils_get_codec_description (vf);
+ cd = gst_caps_to_string (vf);
+ g_print (" Video format : %s (%s)\n", desc, cd);
+ g_free (desc);
+ g_free (cd);
+ }
+ if (af) {
+ desc = gst_pb_utils_get_codec_description (af);
+ cd = gst_caps_to_string (af);
+ g_print (" Audio format : %s (%s)\n", desc, cd);
+ g_free (desc);
+ g_free (cd);
+ }
+ }
+
+ return (GstEncodingProfile *) cprof;
+}
+
+static GstEncodingProfile *
+create_profile_from_string (gchar * format, gchar * vformat, gchar * aformat)
+{
+ GstEncodingProfile *prof = NULL;
+ GstCaps *cf = NULL, *vf = NULL, *af = NULL;
+
+ if (format)
+ cf = gst_caps_from_string (format);
+ if (vformat)
+ vf = gst_caps_from_string (vformat);
+ if (aformat)
+ af = gst_caps_from_string (aformat);
+
+ if (G_UNLIKELY ((vformat && (vf == NULL)) || (aformat && (af == NULL))))
+ goto beach;
+
+ prof = create_profile (cf, vf, af);
+
+beach:
+ if (cf)
+ gst_caps_unref (cf);
+ if (vf)
+ gst_caps_unref (vf);
+ if (af)
+ gst_caps_unref (af);
+
+ return prof;
+}
+
+static void
+pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstElement * encodebin)
+{
+ GstPad *sinkpad;
+
+ sinkpad = gst_element_get_compatible_pad (encodebin, pad, NULL);
+
+ if (sinkpad == NULL) {
+ GstCaps *caps;
+
+ /* Ask encodebin for a compatible pad */
+ caps = gst_pad_get_caps (pad, NULL);
+ g_signal_emit_by_name (encodebin, "request-pad", caps, &sinkpad);
+ if (caps)
+ gst_caps_unref (caps);
+ }
+ if (sinkpad == NULL) {
+ g_print ("Couldn't get an encoding channel for pad %s:%s\n",
+ GST_DEBUG_PAD_NAME (pad));
+ return;
+ }
+
+ if (G_UNLIKELY (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK)) {
+ g_print ("Couldn't link pads\n");
+ }
+
+ return;
+}
+
+static gboolean
+autoplug_continue_cb (GstElement * uridecodebin, GstPad * somepad,
+ GstCaps * caps, GstElement * encodebin)
+{
+ GstPad *sinkpad;
+
+ g_signal_emit_by_name (encodebin, "request-pad", caps, &sinkpad);
+
+ if (sinkpad == NULL)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+bus_message_cb (GstBus * bus, GstMessage * message, GMainLoop * mainloop)
+{
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_print ("ERROR\n");
+ gst_bus_set_flushing (bus, TRUE);
+ g_main_loop_quit (mainloop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("Done\n");
+ g_main_loop_quit (mainloop);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+transcode_file (gchar * uri, gchar * outputuri, GstEncodingProfile * prof)
+{
+ GstElement *pipeline;
+ GstElement *src;
+ GstElement *ebin;
+ GstElement *sink;
+ GstBus *bus;
+ GstCaps *profilecaps, *rescaps;
+ GMainLoop *mainloop;
+
+ g_print (" Input URI : %s\n", uri);
+ g_print (" Output URI : %s\n", outputuri);
+
+ sink = gst_element_make_from_uri (GST_URI_SINK, outputuri, "sink");
+ if (G_UNLIKELY (sink == NULL)) {
+ g_print ("Can't create output sink, most likely invalid output URI !\n");
+ return;
+ }
+
+ src = gst_element_factory_make ("uridecodebin", NULL);
+ if (G_UNLIKELY (src == NULL)) {
+ g_print ("Can't create uridecodebin for input URI, aborting!\n");
+ return;
+ }
+
+ /* Figure out the streams that can be passed as-is to encodebin */
+ g_object_get (src, "caps", &rescaps, NULL);
+ rescaps = gst_caps_copy (rescaps);
+ profilecaps = gst_encoding_profile_get_input_caps (prof);
+ gst_caps_append (rescaps, profilecaps);
+
+ /* Set properties */
+ g_object_set (src, "uri", uri, "caps", rescaps, NULL);
+
+ ebin = gst_element_factory_make ("encodebin", NULL);
+ g_object_set (ebin, "profile", prof, NULL);
+
+ g_signal_connect (src, "autoplug-continue", G_CALLBACK (autoplug_continue_cb),
+ ebin);
+ g_signal_connect (src, "pad-added", G_CALLBACK (pad_added_cb), ebin);
+
+ pipeline = gst_pipeline_new ("encoding-pipeline");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, ebin, sink, NULL);
+
+ gst_element_link (ebin, sink);
+
+ mainloop = g_main_loop_new (NULL, FALSE);
+
+ bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), mainloop);
+
+ if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ g_print ("Failed to start the encoding\n");
+ return;
+ }
+
+ g_main_loop_run (mainloop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+static gchar *
+ensure_uri (gchar * location)
+{
+ gchar *res;
+ gchar *path;
+
+ if (gst_uri_is_valid (location))
+ return g_strdup (location);
+
+ if (!g_path_is_absolute (location)) {
+ gchar *cur_dir;
+ cur_dir = g_get_current_dir ();
+ path = g_build_filename (cur_dir, location, NULL);
+ g_free (cur_dir);
+ } else
+ path = g_strdup (location);
+
+ res = g_filename_to_uri (path, NULL, NULL);
+ g_free (path);
+
+ return res;
+}
+
+int
+main (int argc, char **argv)
+{
+ GError *err = NULL;
+ gchar *outputuri = NULL;
+ gchar *format = NULL;
+ gchar *aformat = NULL;
+ gchar *vformat = NULL;
+ gboolean allmissing = FALSE;
+ gboolean listcodecs = FALSE;
+ GOptionEntry options[] = {
+ {"silent", 's', 0, G_OPTION_ARG_NONE, &silent,
+ "Don't output the information structure", NULL},
+ {"outputuri", 'o', 0, G_OPTION_ARG_STRING, &outputuri,
+ "URI to encode to", "URI (<protocol>://<location>)"},
+ {"format", 'f', 0, G_OPTION_ARG_STRING, &format,
+ "Container format", "<GstCaps>"},
+ {"vformat", 'v', 0, G_OPTION_ARG_STRING, &vformat,
+ "Video format", "<GstCaps>"},
+ {"aformat", 'a', 0, G_OPTION_ARG_STRING, &aformat,
+ "Audio format", "<GstCaps>"},
+ {"allmissing", 'm', 0, G_OPTION_ARG_NONE, &allmissing,
+ "encode to all matching format/codec that aren't specified", NULL},
+ {"list-codecs", 'l', 0, G_OPTION_ARG_NONE, &listcodecs,
+ "list all available codecs and container formats", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GstEncodingProfile *prof;
+ gchar *inputuri;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("- encode URIs with GstProfile and encodebin");
+ 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);
+ }
+
+ if (listcodecs) {
+ list_codecs ();
+ g_option_context_free (ctx);
+ exit (0);
+ }
+
+ if (outputuri == NULL || argc != 2) {
+ g_print ("%s", g_option_context_get_help (ctx, TRUE, NULL));
+ g_option_context_free (ctx);
+ exit (-1);
+ }
+
+ g_option_context_free (ctx);
+
+ /* Fixup outputuri to be a URI */
+ inputuri = ensure_uri (argv[1]);
+ outputuri = ensure_uri (outputuri);
+
+ if (allmissing) {
+ GList *muxers;
+ GstCaps *formats = NULL;
+ GstCaps *vformats = NULL;
+ GstCaps *aformats = NULL;
+ guint f, v, a, flen, vlen, alen;
+
+ if (!format)
+ formats = gst_caps_list_container_formats (GST_RANK_NONE);
+ else
+ formats = gst_caps_from_string (format);
+
+ if (!vformat)
+ vformats = gst_caps_list_video_encoding_formats (GST_RANK_NONE);
+ else
+ vformats = gst_caps_from_string (vformat);
+
+ if (!aformat)
+ aformats = gst_caps_list_audio_encoding_formats (GST_RANK_NONE);
+ else
+ aformats = gst_caps_from_string (aformat);
+ muxers =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_MUXER,
+ GST_RANK_NONE);
+
+ flen = gst_caps_get_size (formats);
+
+ for (f = 0; f < flen; f++) {
+ GstCaps *container =
+ gst_caps_new_full (gst_caps_steal_structure (formats, 0), NULL);
+ GstCaps *compatv =
+ gst_caps_list_compatible_codecs (container, vformats, muxers);
+ GstCaps *compata =
+ gst_caps_list_compatible_codecs (container, aformats, muxers);
+
+ vlen = gst_caps_get_size (compatv);
+ alen = gst_caps_get_size (compata);
+
+
+ for (v = 0; v < vlen; v++) {
+ GstCaps *vcodec =
+ gst_caps_new_full (gst_structure_copy (gst_caps_get_structure
+ (compatv, v)), NULL);
+ for (a = 0; a < alen; a++) {
+ GstCaps *acodec =
+ gst_caps_new_full (gst_structure_copy (gst_caps_get_structure
+ (compata, a)), NULL);
+
+ prof =
+ create_profile ((GstCaps *) container, (GstCaps *) vcodec,
+ (GstCaps *) acodec);
+ if (G_UNLIKELY (prof == NULL)) {
+ g_print ("Wrong arguments\n");
+ break;
+ }
+ outputuri =
+ ensure_uri (generate_filename (container, vcodec, acodec));
+ transcode_file (inputuri, outputuri, prof);
+ gst_encoding_profile_unref (prof);
+
+ gst_caps_unref (acodec);
+ }
+ gst_caps_unref (vcodec);
+ }
+ gst_caps_unref (container);
+ }
+
+ } else {
+
+ /* Create the profile */
+ prof = create_profile_from_string (format, vformat, aformat);
+ if (G_UNLIKELY (prof == NULL)) {
+ g_print ("Encoding arguments are not valid !\n");
+ return 1;
+ }
+
+ /* Trancode file */
+ transcode_file (inputuri, outputuri, prof);
+
+ /* cleanup */
+ gst_encoding_profile_unref (prof);
+
+ }
+ return 0;
+}
diff --git a/tests/examples/encoding/gstcapslist.c b/tests/examples/encoding/gstcapslist.c
new file mode 100644
index 0000000..aed5821
--- /dev/null
+++ b/tests/examples/encoding/gstcapslist.c
@@ -0,0 +1,285 @@
+/* GStreamer
+ * Copyright (C) <2010> Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "gstcapslist.h"
+
+/*
+ * Caps listing convenience functions
+ */
+
+static gboolean
+remove_range_foreach (GQuark field_id, const GValue * value, GstStructure * st)
+{
+ GType ftype = G_VALUE_TYPE (value);
+ /* const gchar *fname; */
+
+ if (ftype == GST_TYPE_INT_RANGE || ftype == GST_TYPE_DOUBLE_RANGE ||
+ ftype == GST_TYPE_FRACTION_RANGE) {
+ gst_structure_remove_field (st, g_quark_to_string (field_id));
+ return FALSE;
+ }
+
+ /* fname = g_quark_to_string (field_id); */
+ /* if (strstr (fname, "framerate") || strstr (fname, "pixel-aspect-ratio") || */
+ /* strstr (fname, "rate")) { */
+ /* gst_structure_remove_field (st, g_quark_to_string (field_id)); */
+ /* return FALSE; */
+ /* } */
+
+ return TRUE;
+}
+
+static void
+clear_caps (GstCaps * caps, GstCaps * rescaps)
+{
+ GstCaps *res;
+ GstStructure *st;
+ guint i;
+
+ res = gst_caps_make_writable (caps);
+
+ GST_DEBUG ("incoming caps %" GST_PTR_FORMAT, res);
+
+ /* Remove width/height/framerate/depth/width fields */
+ for (i = gst_caps_get_size (res); i; i--) {
+ st = gst_caps_get_structure (res, i - 1);
+
+ /* Remove range fields */
+ while (!gst_structure_foreach (st,
+ (GstStructureForeachFunc) remove_range_foreach, st));
+ }
+
+ GST_DEBUG ("stripped %" GST_PTR_FORMAT, res);
+
+ /* And append to list without duplicates */
+ while ((st = gst_caps_steal_structure (res, 0))) {
+ /* Skip fake codecs/containers */
+ if (gst_structure_has_name (st, "audio/x-raw-int") ||
+ gst_structure_has_name (st, "audio/x-raw-float") ||
+ gst_structure_has_name (st, "video/x-raw-yuv") ||
+ gst_structure_has_name (st, "video/x-raw-rgb") ||
+ gst_structure_has_name (st, "unknown/unknown")) {
+ gst_structure_free (st);
+ continue;
+ }
+
+ gst_caps_append_structure (rescaps, st);
+ }
+
+ gst_caps_unref (res);
+}
+
+static GstCaps *
+get_all_caps (GList * elements, GstPadDirection direction)
+{
+ GstCaps *res = NULL, *res2;
+ GList *tmp;
+
+ res = gst_caps_new_empty ();
+
+ for (tmp = elements; tmp; tmp = tmp->next) {
+ GstElementFactory *factory = (GstElementFactory *) tmp->data;
+ const GList *templates;
+ GList *walk;
+
+ templates = gst_element_factory_get_static_pad_templates (factory);
+ for (walk = (GList *) templates; walk; walk = g_list_next (walk)) {
+ GstStaticPadTemplate *templ = walk->data;
+ if (templ->direction == direction)
+ clear_caps (gst_static_caps_get (&templ->static_caps), res);
+ }
+ }
+
+ res2 = gst_caps_normalize (res);
+ gst_caps_unref (res);
+ return res2;
+}
+
+/**
+ * gst_caps_list_container_formats:
+ * @minrank: The minimum #GstRank
+ *
+ * Returns a #GstCaps corresponding to all the container formats
+ * one can mux to on this system.
+ *
+ * Returns: A #GstCaps. Unref with %gst_caps_unref when done with it.
+ */
+GstCaps *
+gst_caps_list_container_formats (GstRank minrank)
+{
+ GstCaps *res;
+ GList *muxers;
+
+ muxers =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_MUXER,
+ minrank);
+ res = get_all_caps (muxers, GST_PAD_SRC);
+ gst_plugin_feature_list_free (muxers);
+
+ return res;
+}
+
+static GstCaps *
+gst_caps_list_encoding_formats (GstRank minrank)
+{
+ GstCaps *res;
+ GList *encoders;
+
+ encoders =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_ENCODER,
+ minrank);
+ res = get_all_caps (encoders, GST_PAD_SRC);
+ gst_plugin_feature_list_free (encoders);
+
+ return res;
+}
+
+/**
+ * gst_caps_list_video_encoding_formats:
+ * @minrank: The minimum #GstRank
+ *
+ * Returns a #GstCaps corresponding to all the video or image formats one
+ * can encode to on this system.
+ *
+ * Returns: A #GstCaps. Unref with %gst_caps_unref when done with it.
+ */
+GstCaps *
+gst_caps_list_video_encoding_formats (GstRank minrank)
+{
+ GstCaps *res;
+ GList *encoders;
+
+ encoders =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER, minrank);
+ res = get_all_caps (encoders, GST_PAD_SRC);
+ gst_plugin_feature_list_free (encoders);
+
+ return res;
+}
+
+
+/**
+ * gst_caps_list_audio_encoding_formats:
+ * @minrank: The minimum #GstRank
+ *
+ * Returns a #GstCaps corresponding to all the audio formats one
+ * can encode to on this system.
+ *
+ * Returns: A #GstCaps. Unref with %gst_caps_unref when done with it.
+ */
+GstCaps *
+gst_caps_list_audio_encoding_formats (GstRank minrank)
+{
+ GstCaps *res;
+ GList *encoders;
+
+ encoders =
+ gst_element_factory_list_get_elements
+ (GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER, minrank);
+ res = get_all_caps (encoders, GST_PAD_SRC);
+ gst_plugin_feature_list_free (encoders);
+
+ return res;
+}
+
+/**
+ * gst_caps_list_compatible_codecs:
+ * @containerformat: A #GstCaps corresponding to a container format
+ * @codecformats: An optional #GstCaps of codec formats
+ * @muxers: An optional #GList of muxer #GstElementFactory.
+ *
+ * Returns an array of #GstCaps corresponding to the audio/video/text formats
+ * one can encode to and that can be muxed in the provided @containerformat.
+ *
+ * If specified, only the #GstCaps contained in @codecformats will be checked
+ * against, else all compatible audio/video formats will be returned.
+ *
+ * If specified, only the #GstElementFactory contained in @muxers will be checked,
+ * else all available muxers on the system will be checked.
+ *
+ * Returns: A #GstCaps containing all compatible formats. Unref with %gst_caps_unref
+ * when done.
+ */
+GstCaps *
+gst_caps_list_compatible_codecs (const GstCaps * containerformat,
+ GstCaps * codecformats, GList * muxers)
+{
+ const GList *templates;
+ GstElementFactory *factory;
+ GList *walk;
+ GstCaps *res = NULL;
+ GstCaps *tmpcaps;
+ GList *tmp;
+ gboolean hadmuxers = (muxers != NULL);
+ gboolean hadcodecs = (codecformats != NULL);
+
+ GST_DEBUG ("containerformat: %" GST_PTR_FORMAT, containerformat);
+ GST_DEBUG ("codecformats: %" GST_PTR_FORMAT, codecformats);
+
+ if (!hadmuxers)
+ muxers =
+ gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_MUXER,
+ GST_RANK_NONE);
+ if (!hadcodecs)
+ codecformats = gst_caps_list_encoding_formats (GST_RANK_NONE);
+
+ /* Get the highest rank muxer matching containerformat */
+ tmp =
+ gst_element_factory_list_filter (muxers, containerformat, GST_PAD_SRC,
+ TRUE);
+ if (G_UNLIKELY (tmp == NULL))
+ goto beach;
+
+ factory = (GstElementFactory *) tmp->data;
+
+ GST_DEBUG ("Trying with factory %s",
+ gst_element_factory_get_longname (factory));
+
+ /* Match all muxer sink pad templates against the available codec formats */
+ templates = gst_element_factory_get_static_pad_templates (factory);
+ gst_plugin_feature_list_free (tmp);
+
+ tmpcaps = gst_caps_new_empty ();
+
+ for (walk = (GList *) templates; walk; walk = walk->next) {
+ GstStaticPadTemplate *templ = walk->data;
+
+ if (templ->direction == GST_PAD_SINK) {
+ GstCaps *templ_caps;
+
+ templ_caps = gst_static_caps_get (&templ->static_caps);
+ gst_caps_append (tmpcaps, gst_caps_copy (templ_caps));
+ }
+ }
+
+ res = gst_caps_intersect (tmpcaps, codecformats);
+ gst_caps_unref (tmpcaps);
+
+beach:
+ if (!hadmuxers)
+ gst_plugin_feature_list_free (muxers);
+ if (!hadcodecs)
+ gst_caps_unref (codecformats);
+
+ tmpcaps = gst_caps_normalize (res);
+ gst_caps_unref (res);
+
+ return tmpcaps;
+}
diff --git a/tests/examples/encoding/gstcapslist.h b/tests/examples/encoding/gstcapslist.h
new file mode 100644
index 0000000..fa0ed83
--- /dev/null
+++ b/tests/examples/encoding/gstcapslist.h
@@ -0,0 +1,35 @@
+/* GStreamer
+ * Copyright (C) <2010> Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+
+GstCaps *gst_caps_list_compatible_codecs (const GstCaps *containerformat,
+ GstCaps *codecformats,
+ GList *muxers);
+
+GstCaps *gst_caps_list_compatible_containers (GstCaps *mediaformat,
+ GList *containerformats);
+
+
+GstCaps *gst_caps_list_container_formats (GstRank minrank);
+
+GstCaps *gst_caps_list_video_encoding_formats (GstRank minrank);
+
+GstCaps *gst_caps_list_audio_encoding_formats (GstRank minrank);
+
diff --git a/tests/examples/gio/Makefile.am b/tests/examples/gio/Makefile.am
new file mode 100644
index 0000000..c4306f8
--- /dev/null
+++ b/tests/examples/gio/Makefile.am
@@ -0,0 +1,8 @@
+if HAVE_GTK
+if USE_GIO
+noinst_PROGRAMS = giosrc-mounting
+giosrc_mounting_SOURCES = giosrc-mounting.c
+giosrc_mounting_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(GIO_CFLAGS)
+giosrc_mounting_LDADD = $(GST_LIBS) $(GTK_LIBS) $(GIO_LIBS)
+endif
+endif
diff --git a/tests/examples/gio/Makefile.in b/tests/examples/gio/Makefile.in
new file mode 100644
index 0000000..3fcc6ff
--- /dev/null
+++ b/tests/examples/gio/Makefile.in
@@ -0,0 +1,714 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@@USE_GIO_TRUE@noinst_PROGRAMS = \
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@ giosrc-mounting$(EXEEXT)
+subdir = tests/examples/gio
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__giosrc_mounting_SOURCES_DIST = giosrc-mounting.c
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@am_giosrc_mounting_OBJECTS = giosrc_mounting-giosrc-mounting.$(OBJEXT)
+giosrc_mounting_OBJECTS = $(am_giosrc_mounting_OBJECTS)
+am__DEPENDENCIES_1 =
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@giosrc_mounting_DEPENDENCIES = \
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@ $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+giosrc_mounting_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(giosrc_mounting_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(giosrc_mounting_SOURCES)
+DIST_SOURCES = $(am__giosrc_mounting_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_TRUE@@USE_GIO_TRUE@giosrc_mounting_SOURCES = giosrc-mounting.c
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@giosrc_mounting_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(GIO_CFLAGS)
+@HAVE_GTK_TRUE@@USE_GIO_TRUE@giosrc_mounting_LDADD = $(GST_LIBS) $(GTK_LIBS) $(GIO_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/gio/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/gio/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
+giosrc-mounting$(EXEEXT): $(giosrc_mounting_OBJECTS) $(giosrc_mounting_DEPENDENCIES)
+ @rm -f giosrc-mounting$(EXEEXT)
+ $(AM_V_CCLD)$(giosrc_mounting_LINK) $(giosrc_mounting_OBJECTS) $(giosrc_mounting_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giosrc_mounting-giosrc-mounting.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+giosrc_mounting-giosrc-mounting.o: giosrc-mounting.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(giosrc_mounting_CFLAGS) $(CFLAGS) -MT giosrc_mounting-giosrc-mounting.o -MD -MP -MF $(DEPDIR)/giosrc_mounting-giosrc-mounting.Tpo -c -o giosrc_mounting-giosrc-mounting.o `test -f 'giosrc-mounting.c' || echo '$(srcdir)/'`giosrc-mounting.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/giosrc_mounting-giosrc-mounting.Tpo $(DEPDIR)/giosrc_mounting-giosrc-mounting.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='giosrc-mounting.c' object='giosrc_mounting-giosrc-mounting.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(giosrc_mounting_CFLAGS) $(CFLAGS) -c -o giosrc_mounting-giosrc-mounting.o `test -f 'giosrc-mounting.c' || echo '$(srcdir)/'`giosrc-mounting.c
+
+giosrc_mounting-giosrc-mounting.obj: giosrc-mounting.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(giosrc_mounting_CFLAGS) $(CFLAGS) -MT giosrc_mounting-giosrc-mounting.obj -MD -MP -MF $(DEPDIR)/giosrc_mounting-giosrc-mounting.Tpo -c -o giosrc_mounting-giosrc-mounting.obj `if test -f 'giosrc-mounting.c'; then $(CYGPATH_W) 'giosrc-mounting.c'; else $(CYGPATH_W) '$(srcdir)/giosrc-mounting.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/giosrc_mounting-giosrc-mounting.Tpo $(DEPDIR)/giosrc_mounting-giosrc-mounting.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='giosrc-mounting.c' object='giosrc_mounting-giosrc-mounting.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(giosrc_mounting_CFLAGS) $(CFLAGS) -c -o giosrc_mounting-giosrc-mounting.obj `if test -f 'giosrc-mounting.c'; then $(CYGPATH_W) 'giosrc-mounting.c'; else $(CYGPATH_W) '$(srcdir)/giosrc-mounting.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/gio/giosrc-mounting.c b/tests/examples/gio/giosrc-mounting.c
new file mode 100644
index 0000000..cf34f55
--- /dev/null
+++ b/tests/examples/gio/giosrc-mounting.c
@@ -0,0 +1,126 @@
+/* GStreamer
+ *
+ * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+#include <gtk/gtk.h>
+
+#include <string.h>
+
+static GstElement *pipeline = NULL;
+
+static void
+mount_cb (GObject * obj, GAsyncResult * res, gpointer user_data)
+{
+ gboolean ret;
+ GError *err = NULL;
+
+ ret = g_file_mount_enclosing_volume_finish (G_FILE (obj), res, &err);
+
+ if (ret) {
+ g_print ("mounted successfully\n");
+ gst_bus_set_flushing ((GstBus *) user_data, FALSE);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ } else {
+ g_print ("mounting failed: %s\n", err->message);
+ g_clear_error (&err);
+ gtk_main_quit ();
+ }
+}
+
+static gboolean
+message_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+
+ switch (message->type) {
+ case GST_MESSAGE_ELEMENT:{
+ const GstStructure *s = gst_message_get_structure (message);
+ const gchar *name = gst_structure_get_name (s);
+
+ if (strcmp (name, "not-mounted") == 0) {
+ GMountOperation *mop = gtk_mount_operation_new (NULL);
+ GFile *file =
+ G_FILE (g_value_get_object (gst_structure_get_value (s, "file")));
+
+ g_print ("not-mounted\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_bus_set_flushing (bus, TRUE);
+
+ g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE,
+ mop, NULL, mount_cb, bus);
+
+ g_object_unref (mop);
+ }
+ break;
+ }
+
+ case GST_MESSAGE_EOS:
+ g_print ("EOS\n");
+ gtk_main_quit ();
+ break;
+ case GST_MESSAGE_ERROR:{
+ GError *err = NULL;
+
+ gst_message_parse_error (message, &err, NULL);
+ g_print ("error: %s\n", err->message);
+ g_clear_error (&err);
+
+ gtk_main_quit ();
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+ gint watch_id;
+
+ if (argc != 2) {
+ g_print ("usage: giosrc-mounting URI\n");
+ return -1;
+ }
+
+ gst_init (NULL, NULL);
+ gtk_init (NULL, NULL);
+
+ pipeline = gst_element_factory_make ("playbin2", NULL);
+ g_assert (pipeline);
+ g_object_set (G_OBJECT (pipeline), "uri", argv[1], NULL);
+
+ bus = gst_element_get_bus (pipeline);
+ watch_id = gst_bus_add_watch (bus, message_handler, NULL);
+ gst_object_unref (bus);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ gtk_main ();
+
+ g_source_remove (watch_id);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/overlay/Makefile.am b/tests/examples/overlay/Makefile.am
new file mode 100644
index 0000000..31615b4
--- /dev/null
+++ b/tests/examples/overlay/Makefile.am
@@ -0,0 +1,49 @@
+EXAMPLES =
+
+if USE_X
+
+if HAVE_GTK_X11
+EXAMPLES += gtk-videooverlay
+
+gtk_videooverlay_SOURCES = gtk-videooverlay.c
+gtk_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+gtk_videooverlay_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+endif
+
+if HAVE_QT
+EXAMPLES += qt-videooverlay
+
+qt_videooverlay_SOURCES = qt-videooverlay.cpp
+qt_videooverlay_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(X_CFLAGS) $(QT_CFLAGS)
+qt_videooverlay_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM) $(QT_LIBS)
+endif
+
+if HAVE_QT_GV
+EXAMPLES += qtgv-videooverlay
+
+qtgv_videooverlay_SOURCES = qtgv-videooverlay.cpp qtgv-videooverlay.h
+qtgv_videooverlay_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(X_CFLAGS) $(QT_CFLAGS)
+qtgv_videooverlay_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM) $(QT_LIBS)
+
+# qt moc support, according to http://qtnode.net/wiki/Qt_with_autotools
+
+nodist_qtgv_videooverlay_SOURCES = moc_qtgv-videooverlay.cpp
+
+moc_%.cpp:%.h
+ $(AM_V_GEN)$(QT4_MOC) $< -o $@
+
+EXTRA_DIST = $(nodist_qtgv_videooverlay_SOURCES:moc_%.cpp=%.h)
+CLEANFILES = $(nodist_qtgv_videooverlay_SOURCES)
+
+endif
+
+endif
+
+noinst_PROGRAMS = $(EXAMPLES)
+
diff --git a/tests/examples/overlay/Makefile.in b/tests/examples/overlay/Makefile.in
new file mode 100644
index 0000000..de4d094
--- /dev/null
+++ b/tests/examples/overlay/Makefile.in
@@ -0,0 +1,876 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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_X11_TRUE@@USE_X_TRUE@am__append_1 = gtk-videooverlay
+@HAVE_QT_TRUE@@USE_X_TRUE@am__append_2 = qt-videooverlay
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@am__append_3 = qtgv-videooverlay
+noinst_PROGRAMS = $(am__EXEEXT_4)
+subdir = tests/examples/overlay
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_X11_TRUE@@USE_X_TRUE@am__EXEEXT_1 = \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ gtk-videooverlay$(EXEEXT)
+@HAVE_QT_TRUE@@USE_X_TRUE@am__EXEEXT_2 = qt-videooverlay$(EXEEXT)
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@am__EXEEXT_3 = \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ qtgv-videooverlay$(EXEEXT)
+am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+PROGRAMS = $(noinst_PROGRAMS)
+am__gtk_videooverlay_SOURCES_DIST = gtk-videooverlay.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@am_gtk_videooverlay_OBJECTS = gtk_videooverlay-gtk-videooverlay.$(OBJEXT)
+gtk_videooverlay_OBJECTS = $(am_gtk_videooverlay_OBJECTS)
+am__DEPENDENCIES_1 =
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@gtk_videooverlay_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+gtk_videooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gtk_videooverlay_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__qt_videooverlay_SOURCES_DIST = qt-videooverlay.cpp
+@HAVE_QT_TRUE@@USE_X_TRUE@am_qt_videooverlay_OBJECTS = qt_videooverlay-qt-videooverlay.$(OBJEXT)
+qt_videooverlay_OBJECTS = $(am_qt_videooverlay_OBJECTS)
+@HAVE_QT_TRUE@@USE_X_TRUE@qt_videooverlay_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+qt_videooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(qt_videooverlay_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__qtgv_videooverlay_SOURCES_DIST = qtgv-videooverlay.cpp \
+ qtgv-videooverlay.h
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@am_qtgv_videooverlay_OBJECTS = qtgv_videooverlay-qtgv-videooverlay.$(OBJEXT)
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@nodist_qtgv_videooverlay_OBJECTS = qtgv_videooverlay-moc_qtgv-videooverlay.$(OBJEXT)
+qtgv_videooverlay_OBJECTS = $(am_qtgv_videooverlay_OBJECTS) \
+ $(nodist_qtgv_videooverlay_OBJECTS)
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@qtgv_videooverlay_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+qtgv_videooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) $(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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(gtk_videooverlay_SOURCES) $(qt_videooverlay_SOURCES) \
+ $(qtgv_videooverlay_SOURCES) \
+ $(nodist_qtgv_videooverlay_SOURCES)
+DIST_SOURCES = $(am__gtk_videooverlay_SOURCES_DIST) \
+ $(am__qt_videooverlay_SOURCES_DIST) \
+ $(am__qtgv_videooverlay_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+EXAMPLES = $(am__append_1) $(am__append_2) $(am__append_3)
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@gtk_videooverlay_SOURCES = gtk-videooverlay.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@gtk_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@gtk_videooverlay_LDADD = \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+
+@HAVE_QT_TRUE@@USE_X_TRUE@qt_videooverlay_SOURCES = qt-videooverlay.cpp
+@HAVE_QT_TRUE@@USE_X_TRUE@qt_videooverlay_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(X_CFLAGS) $(QT_CFLAGS)
+@HAVE_QT_TRUE@@USE_X_TRUE@qt_videooverlay_LDADD = \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_QT_TRUE@@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM) $(QT_LIBS)
+
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@qtgv_videooverlay_SOURCES = qtgv-videooverlay.cpp qtgv-videooverlay.h
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@qtgv_videooverlay_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(X_CFLAGS) $(QT_CFLAGS)
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@qtgv_videooverlay_LDADD = \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM) $(QT_LIBS)
+
+
+# qt moc support, according to http://qtnode.net/wiki/Qt_with_autotools
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@nodist_qtgv_videooverlay_SOURCES = moc_qtgv-videooverlay.cpp
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@EXTRA_DIST = $(nodist_qtgv_videooverlay_SOURCES:moc_%.cpp=%.h)
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@CLEANFILES = $(nodist_qtgv_videooverlay_SOURCES)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cpp .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/overlay/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/overlay/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
+gtk-videooverlay$(EXEEXT): $(gtk_videooverlay_OBJECTS) $(gtk_videooverlay_DEPENDENCIES)
+ @rm -f gtk-videooverlay$(EXEEXT)
+ $(AM_V_CCLD)$(gtk_videooverlay_LINK) $(gtk_videooverlay_OBJECTS) $(gtk_videooverlay_LDADD) $(LIBS)
+qt-videooverlay$(EXEEXT): $(qt_videooverlay_OBJECTS) $(qt_videooverlay_DEPENDENCIES)
+ @rm -f qt-videooverlay$(EXEEXT)
+ $(AM_V_CXXLD)$(qt_videooverlay_LINK) $(qt_videooverlay_OBJECTS) $(qt_videooverlay_LDADD) $(LIBS)
+qtgv-videooverlay$(EXEEXT): $(qtgv_videooverlay_OBJECTS) $(qtgv_videooverlay_DEPENDENCIES)
+ @rm -f qtgv-videooverlay$(EXEEXT)
+ $(AM_V_CXXLD)$(qtgv_videooverlay_LINK) $(qtgv_videooverlay_OBJECTS) $(qtgv_videooverlay_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qt_videooverlay-qt-videooverlay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+gtk_videooverlay-gtk-videooverlay.o: gtk-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_videooverlay_CFLAGS) $(CFLAGS) -MT gtk_videooverlay-gtk-videooverlay.o -MD -MP -MF $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Tpo -c -o gtk_videooverlay-gtk-videooverlay.o `test -f 'gtk-videooverlay.c' || echo '$(srcdir)/'`gtk-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Tpo $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gtk-videooverlay.c' object='gtk_videooverlay-gtk-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_videooverlay_CFLAGS) $(CFLAGS) -c -o gtk_videooverlay-gtk-videooverlay.o `test -f 'gtk-videooverlay.c' || echo '$(srcdir)/'`gtk-videooverlay.c
+
+gtk_videooverlay-gtk-videooverlay.obj: gtk-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_videooverlay_CFLAGS) $(CFLAGS) -MT gtk_videooverlay-gtk-videooverlay.obj -MD -MP -MF $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Tpo -c -o gtk_videooverlay-gtk-videooverlay.obj `if test -f 'gtk-videooverlay.c'; then $(CYGPATH_W) 'gtk-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/gtk-videooverlay.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Tpo $(DEPDIR)/gtk_videooverlay-gtk-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gtk-videooverlay.c' object='gtk_videooverlay-gtk-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_videooverlay_CFLAGS) $(CFLAGS) -c -o gtk_videooverlay-gtk-videooverlay.obj `if test -f 'gtk-videooverlay.c'; then $(CYGPATH_W) 'gtk-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/gtk-videooverlay.c'; fi`
+
+.cpp.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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.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
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+qt_videooverlay-qt-videooverlay.o: qt-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qt_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qt_videooverlay-qt-videooverlay.o -MD -MP -MF $(DEPDIR)/qt_videooverlay-qt-videooverlay.Tpo -c -o qt_videooverlay-qt-videooverlay.o `test -f 'qt-videooverlay.cpp' || echo '$(srcdir)/'`qt-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qt_videooverlay-qt-videooverlay.Tpo $(DEPDIR)/qt_videooverlay-qt-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qt-videooverlay.cpp' object='qt_videooverlay-qt-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qt_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qt_videooverlay-qt-videooverlay.o `test -f 'qt-videooverlay.cpp' || echo '$(srcdir)/'`qt-videooverlay.cpp
+
+qt_videooverlay-qt-videooverlay.obj: qt-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qt_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qt_videooverlay-qt-videooverlay.obj -MD -MP -MF $(DEPDIR)/qt_videooverlay-qt-videooverlay.Tpo -c -o qt_videooverlay-qt-videooverlay.obj `if test -f 'qt-videooverlay.cpp'; then $(CYGPATH_W) 'qt-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/qt-videooverlay.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qt_videooverlay-qt-videooverlay.Tpo $(DEPDIR)/qt_videooverlay-qt-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qt-videooverlay.cpp' object='qt_videooverlay-qt-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qt_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qt_videooverlay-qt-videooverlay.obj `if test -f 'qt-videooverlay.cpp'; then $(CYGPATH_W) 'qt-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/qt-videooverlay.cpp'; fi`
+
+qtgv_videooverlay-qtgv-videooverlay.o: qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qtgv_videooverlay-qtgv-videooverlay.o -MD -MP -MF $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Tpo -c -o qtgv_videooverlay-qtgv-videooverlay.o `test -f 'qtgv-videooverlay.cpp' || echo '$(srcdir)/'`qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Tpo $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qtgv-videooverlay.cpp' object='qtgv_videooverlay-qtgv-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qtgv_videooverlay-qtgv-videooverlay.o `test -f 'qtgv-videooverlay.cpp' || echo '$(srcdir)/'`qtgv-videooverlay.cpp
+
+qtgv_videooverlay-qtgv-videooverlay.obj: qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qtgv_videooverlay-qtgv-videooverlay.obj -MD -MP -MF $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Tpo -c -o qtgv_videooverlay-qtgv-videooverlay.obj `if test -f 'qtgv-videooverlay.cpp'; then $(CYGPATH_W) 'qtgv-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/qtgv-videooverlay.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Tpo $(DEPDIR)/qtgv_videooverlay-qtgv-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qtgv-videooverlay.cpp' object='qtgv_videooverlay-qtgv-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qtgv_videooverlay-qtgv-videooverlay.obj `if test -f 'qtgv-videooverlay.cpp'; then $(CYGPATH_W) 'qtgv-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/qtgv-videooverlay.cpp'; fi`
+
+qtgv_videooverlay-moc_qtgv-videooverlay.o: moc_qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qtgv_videooverlay-moc_qtgv-videooverlay.o -MD -MP -MF $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Tpo -c -o qtgv_videooverlay-moc_qtgv-videooverlay.o `test -f 'moc_qtgv-videooverlay.cpp' || echo '$(srcdir)/'`moc_qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Tpo $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_qtgv-videooverlay.cpp' object='qtgv_videooverlay-moc_qtgv-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qtgv_videooverlay-moc_qtgv-videooverlay.o `test -f 'moc_qtgv-videooverlay.cpp' || echo '$(srcdir)/'`moc_qtgv-videooverlay.cpp
+
+qtgv_videooverlay-moc_qtgv-videooverlay.obj: moc_qtgv-videooverlay.cpp
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -MT qtgv_videooverlay-moc_qtgv-videooverlay.obj -MD -MP -MF $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Tpo -c -o qtgv_videooverlay-moc_qtgv-videooverlay.obj `if test -f 'moc_qtgv-videooverlay.cpp'; then $(CYGPATH_W) 'moc_qtgv-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_qtgv-videooverlay.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Tpo $(DEPDIR)/qtgv_videooverlay-moc_qtgv-videooverlay.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_qtgv-videooverlay.cpp' object='qtgv_videooverlay-moc_qtgv-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(qtgv_videooverlay_CXXFLAGS) $(CXXFLAGS) -c -o qtgv_videooverlay-moc_qtgv-videooverlay.obj `if test -f 'moc_qtgv-videooverlay.cpp'; then $(CYGPATH_W) 'moc_qtgv-videooverlay.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_qtgv-videooverlay.cpp'; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-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
+
+
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@moc_%.cpp:%.h
+@HAVE_QT_GV_TRUE@@USE_X_TRUE@ $(AM_V_GEN)$(QT4_MOC) $< -o $@
+
+# 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/overlay/gtk-videooverlay.c b/tests/examples/overlay/gtk-videooverlay.c
new file mode 100644
index 0000000..427aaa7
--- /dev/null
+++ b/tests/examples/overlay/gtk-videooverlay.c
@@ -0,0 +1,149 @@
+/* GStreamer
+ * Copyright (C) <2010> Stefan Kost <ensonic@users.sf.net>
+ *
+ * gtk-videooverlay: demonstrate overlay handling using gtk
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <glib.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+#include <gst/interfaces/videooverlay.h>
+
+#include <string.h>
+
+static void
+window_closed (GtkWidget * widget, GdkEvent * event, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+
+ gtk_widget_hide (widget);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gtk_main_quit ();
+}
+
+/* slightly convoluted way to find a working video sink that's not a bin,
+ * one could use autovideosink from gst-plugins-good instead
+ */
+static GstElement *
+find_video_sink (void)
+{
+ GstStateChangeReturn sret;
+ GstElement *sink;
+
+ if ((sink = gst_element_factory_make ("xvimagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+
+ if ((sink = gst_element_factory_make ("ximagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+
+ if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") == 0 ||
+ strcmp (DEFAULT_VIDEOSINK, "ximagesink") == 0)
+ return NULL;
+
+ if ((sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL))) {
+ if (GST_IS_BIN (sink)) {
+ gst_object_unref (sink);
+ return NULL;
+ }
+
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+ return NULL;
+}
+
+int
+main (int argc, char **argv)
+{
+ GdkWindow *video_window_xwindow;
+ GtkWidget *window, *video_window;
+ GstElement *pipeline, *src, *sink;
+ gulong embed_xid;
+ GstStateChangeReturn sret;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gst_init (&argc, &argv);
+ gtk_init (&argc, &argv);
+
+ /* prepare the pipeline */
+
+ pipeline = gst_pipeline_new ("xvoverlay");
+ src = gst_element_factory_make ("videotestsrc", NULL);
+ sink = find_video_sink ();
+
+ if (sink == NULL)
+ g_error ("Couldn't find a working video sink.");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ /* prepare the ui */
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (window), "delete-event",
+ G_CALLBACK (window_closed), (gpointer) pipeline);
+ gtk_window_set_default_size (GTK_WINDOW (window), 320, 240);
+ gtk_window_set_title (GTK_WINDOW (window), "GstXOverlay Gtk+ demo");
+
+ video_window = gtk_drawing_area_new ();
+ gtk_widget_set_double_buffered (video_window, FALSE);
+ gtk_container_add (GTK_CONTAINER (window), video_window);
+ gtk_container_set_border_width (GTK_CONTAINER (window), 16);
+
+ gtk_widget_show_all (window);
+ gtk_widget_realize (window);
+
+ video_window_xwindow = gtk_widget_get_window (video_window);
+ embed_xid = GDK_WINDOW_XID (video_window_xwindow);
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
+
+ /* run the pipeline */
+
+ sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE)
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ else
+ gtk_main ();
+
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tests/examples/overlay/qt-videooverlay.cpp b/tests/examples/overlay/qt-videooverlay.cpp
new file mode 100644
index 0000000..e102280
--- /dev/null
+++ b/tests/examples/overlay/qt-videooverlay.cpp
@@ -0,0 +1,130 @@
+/* GStreamer
+ * Copyright (C) <2010> Stefan Kost <ensonic@users.sf.net>
+ *
+ * qt-xoverlay: demonstrate overlay handling using qt
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <glib.h>
+#include <gst/gst.h>
+#include <gst/interfaces/videooverlay.h>
+
+#include <QApplication>
+#include <QTimer>
+#include <QWidget>
+
+/* slightly convoluted way to find a working video sink that's not a bin,
+ * one could use autovideosink from gst-plugins-good instead
+ */
+static GstElement *
+find_video_sink (void)
+{
+ GstStateChangeReturn sret;
+ GstElement *sink;
+
+ if ((sink = gst_element_factory_make ("xvimagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+
+ if ((sink = gst_element_factory_make ("ximagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+
+ if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") == 0 ||
+ strcmp (DEFAULT_VIDEOSINK, "ximagesink") == 0)
+ return NULL;
+
+ if ((sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL))) {
+ if (GST_IS_BIN (sink)) {
+ gst_object_unref (sink);
+ return NULL;
+ }
+
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ return sink;
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ }
+ gst_object_unref (sink);
+ return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gst_init (&argc, &argv);
+ QApplication app(argc, argv);
+ app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
+
+ /* prepare the pipeline */
+
+ GstElement *pipeline = gst_pipeline_new ("xvoverlay");
+ GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
+ GstElement *sink = find_video_sink ();
+
+ if (sink == NULL)
+ g_error ("Couldn't find a working video sink.");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ /* prepare the ui */
+
+ QWidget window;
+ window.resize(320, 240);
+ window.setWindowTitle("GstXOverlay Qt demo");
+ window.show();
+
+ WId xwinid = window.winId();
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
+
+ /* run the pipeline */
+
+ GstStateChangeReturn sret = gst_element_set_state (pipeline,
+ GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ /* Exit application */
+ QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
+ }
+
+ int ret = app.exec();
+
+ window.hide();
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return ret;
+}
diff --git a/tests/examples/overlay/qtgv-videooverlay.cpp b/tests/examples/overlay/qtgv-videooverlay.cpp
new file mode 100644
index 0000000..fea8c52
--- /dev/null
+++ b/tests/examples/overlay/qtgv-videooverlay.cpp
@@ -0,0 +1,128 @@
+/* GStreamer
+ * Copyright (C) <2010> Alexander Bokovoy <ab@samba.org>
+ *
+ * qtgv-xoverlay: demonstrate overlay handling using qt graphics view
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 "qtgv-videooverlay.h"
+
+#include <QApplication>
+#include <QTimer>
+
+#include <gst/interfaces/videooverlay.h>
+
+SinkPipeline::SinkPipeline(QGraphicsView *parent) : QObject(parent)
+{
+ GstStateChangeReturn sret;
+
+ pipeline = gst_pipeline_new ("xvoverlay");
+ src = gst_element_factory_make ("videotestsrc", NULL);
+
+ if ((sink = gst_element_factory_make ("xvimagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+
+ if ((sink = gst_element_factory_make ("ximagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+
+ if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") != 0 &&
+ strcmp (DEFAULT_VIDEOSINK, "ximagesink") != 0) {
+
+ if ((sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL))) {
+ if (!GST_IS_BIN (sink)) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+ sink = NULL;
+ }
+ } else {
+ gst_object_unref (sink);
+ sink = NULL;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (sink == NULL)
+ g_error ("Couldn't find a working video sink.");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+ xwinid = parent->winId();
+}
+
+SinkPipeline::~SinkPipeline()
+{
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+void SinkPipeline::startPipeline()
+{
+ GstStateChangeReturn sret;
+
+ /* we know what the video sink is in this case (xvimagesink), so we can
+ * just set it directly here now (instead of waiting for a
+ * prepare-window-handle element message in a sync bus handler and setting
+ * it there) */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
+
+ sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ /* Exit application */
+ QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
+ }
+}
+
+int main( int argc, char **argv )
+{
+ QApplication app(argc, argv);
+
+ QGraphicsScene scene;
+ scene.setSceneRect( -100.0, -100.0, 200.0, 200.0 );
+
+ QGraphicsView view( &scene );
+ view.resize(320, 240);
+ view.setWindowTitle("GstXOverlay Qt GraphicsView demo");
+ view.show();
+
+ gst_init (&argc, &argv);
+ SinkPipeline pipeline(&view);
+ pipeline.startPipeline();
+
+ int ret = app.exec();
+
+ view.hide();
+
+ return ret;
+}
diff --git a/tests/examples/overlay/qtgv-videooverlay.h b/tests/examples/overlay/qtgv-videooverlay.h
new file mode 100644
index 0000000..091fff8
--- /dev/null
+++ b/tests/examples/overlay/qtgv-videooverlay.h
@@ -0,0 +1,45 @@
+/* GStreamer
+ * Copyright (C) <2010> Alexander Bokovoy <ab@samba.org>
+ *
+ * qtgv-xoverlay: demonstrate overlay handling using qt graphics view
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef QTGV_XOVERLAY_H
+#define QTGV_XOVERLAY_H
+
+#include <QGraphicsView>
+#include <gst/gst.h>
+
+
+class SinkPipeline : public QObject
+{
+ Q_OBJECT
+public:
+ SinkPipeline(QGraphicsView *parent = 0);
+ ~SinkPipeline();
+
+ void startPipeline();
+
+private:
+ GstElement *pipeline;
+ GstElement *sink;
+ GstElement *src;
+ WId xwinid;
+};
+
+#endif // QTGV_XOVERLAY_H
diff --git a/tests/examples/playrec/Makefile.am b/tests/examples/playrec/Makefile.am
new file mode 100644
index 0000000..f7548b5
--- /dev/null
+++ b/tests/examples/playrec/Makefile.am
@@ -0,0 +1,4 @@
+noinst_PROGRAMS = playrec
+playrec_SOURCES = playrec.c
+playrec_CFLAGS = $(GST_CFLAGS)
+playrec_LDADD = $(GST_LIBS)
diff --git a/tests/examples/playrec/Makefile.in b/tests/examples/playrec/Makefile.in
new file mode 100644
index 0000000..5a18cab
--- /dev/null
+++ b/tests/examples/playrec/Makefile.in
@@ -0,0 +1,708 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = playrec$(EXEEXT)
+subdir = tests/examples/playrec
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_playrec_OBJECTS = playrec-playrec.$(OBJEXT)
+playrec_OBJECTS = $(am_playrec_OBJECTS)
+am__DEPENDENCIES_1 =
+playrec_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+playrec_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(playrec_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(playrec_SOURCES)
+DIST_SOURCES = $(playrec_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+playrec_SOURCES = playrec.c
+playrec_CFLAGS = $(GST_CFLAGS)
+playrec_LDADD = $(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/playrec/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/playrec/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
+playrec$(EXEEXT): $(playrec_OBJECTS) $(playrec_DEPENDENCIES)
+ @rm -f playrec$(EXEEXT)
+ $(AM_V_CCLD)$(playrec_LINK) $(playrec_OBJECTS) $(playrec_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playrec-playrec.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+playrec-playrec.o: playrec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playrec_CFLAGS) $(CFLAGS) -MT playrec-playrec.o -MD -MP -MF $(DEPDIR)/playrec-playrec.Tpo -c -o playrec-playrec.o `test -f 'playrec.c' || echo '$(srcdir)/'`playrec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/playrec-playrec.Tpo $(DEPDIR)/playrec-playrec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='playrec.c' object='playrec-playrec.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playrec_CFLAGS) $(CFLAGS) -c -o playrec-playrec.o `test -f 'playrec.c' || echo '$(srcdir)/'`playrec.c
+
+playrec-playrec.obj: playrec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playrec_CFLAGS) $(CFLAGS) -MT playrec-playrec.obj -MD -MP -MF $(DEPDIR)/playrec-playrec.Tpo -c -o playrec-playrec.obj `if test -f 'playrec.c'; then $(CYGPATH_W) 'playrec.c'; else $(CYGPATH_W) '$(srcdir)/playrec.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/playrec-playrec.Tpo $(DEPDIR)/playrec-playrec.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='playrec.c' object='playrec-playrec.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playrec_CFLAGS) $(CFLAGS) -c -o playrec-playrec.obj `if test -f 'playrec.c'; then $(CYGPATH_W) 'playrec.c'; else $(CYGPATH_W) '$(srcdir)/playrec.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/playrec/playrec.c b/tests/examples/playrec/playrec.c
new file mode 100644
index 0000000..352f65a
--- /dev/null
+++ b/tests/examples/playrec/playrec.c
@@ -0,0 +1,166 @@
+/* GStreamer
+ *
+ * Copyright (C) 2010 Wim Taymans <wim.taymans@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.
+ */
+
+/* An example of synchronized playback and recording.
+ * The trick is to wait for the playback pipeline to preroll before starting
+ * playback and recording.
+ */
+#include <string.h>
+
+#include <gst/gst.h>
+
+/* Define to run the asynchronous version. This requires 0.10.31 of the
+ * GStreamer core. The async version has the benefit that it doesn't block the
+ * main thread but it produces slightly less clear code. */
+#define ASYNC_VERSION
+
+static GMainLoop *loop;
+static GstElement *pipeline = NULL;
+static GstElement *play_bin, *play_source, *play_sink;
+static GstElement *rec_bin, *rec_source, *rec_sink;
+
+static gboolean
+message_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+
+ switch (GST_MESSAGE_TYPE (message)) {
+#ifdef ASYNC_VERSION
+ case GST_MESSAGE_ELEMENT:{
+ const GstStructure *str;
+
+ str = gst_message_get_structure (message);
+
+ if (gst_structure_has_name (str, "GstBinForwarded")) {
+ GstMessage *orig;
+
+ /* unwrap the element message */
+ gst_structure_get (str, "message", GST_TYPE_MESSAGE, &orig, NULL);
+ g_assert (orig);
+
+ switch (GST_MESSAGE_TYPE (orig)) {
+ case GST_MESSAGE_ASYNC_DONE:
+ g_print ("ASYNC done %s\n", GST_MESSAGE_SRC_NAME (orig));
+ if (GST_MESSAGE_SRC (orig) == GST_OBJECT_CAST (play_bin)) {
+ g_print
+ ("prerolled, starting synchronized playback and recording\n");
+ /* returns ASYNC because the sink linked to the live source is not
+ * prerolled */
+ g_assert (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_ASYNC);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ }
+#endif
+ case GST_MESSAGE_EOS:
+ g_print ("EOS\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_ERROR:{
+ GError *err = NULL;
+
+ gst_message_parse_error (message, &err, NULL);
+ g_print ("error: %s\n", err->message);
+ g_clear_error (&err);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstBus *bus;
+ gint watch_id;
+
+ gst_init (NULL, NULL);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+#ifdef ASYNC_VERSION
+ /* this enables messages of individual elements inside the pipeline */
+ g_object_set (pipeline, "message-forward", TRUE, NULL);
+#endif
+
+ /* make a bin with the playback elements this is a non-live pipeline */
+ play_bin = gst_bin_new ("play_bin");
+ play_source = gst_element_factory_make ("audiotestsrc", "play_source");
+ play_sink = gst_element_factory_make ("autoaudiosink", "play_sink");
+
+ gst_bin_add (GST_BIN (play_bin), play_source);
+ gst_bin_add (GST_BIN (play_bin), play_sink);
+
+ gst_element_link (play_source, play_sink);
+
+ /* make bin with the record elements, this is a live pipeline */
+ rec_bin = gst_bin_new ("rec_bin");
+ rec_source = gst_element_factory_make ("autoaudiosrc", "rec_source");
+ rec_sink = gst_element_factory_make ("fakesink", "rec_sink");
+
+ gst_bin_add (GST_BIN (rec_bin), rec_source);
+ gst_bin_add (GST_BIN (rec_bin), rec_sink);
+
+ gst_element_link (rec_source, rec_sink);
+
+ gst_bin_add (GST_BIN (pipeline), play_bin);
+ gst_bin_add (GST_BIN (pipeline), rec_bin);
+
+ bus = gst_element_get_bus (pipeline);
+ watch_id = gst_bus_add_watch (bus, message_handler, NULL);
+ gst_object_unref (bus);
+
+ g_print ("going to PAUSED\n");
+ /* returns NO_PREROLL because we have a live element */
+ g_assert (gst_element_set_state (pipeline,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+
+ g_print ("waiting for playback preroll\n");
+#ifndef ASYNC_VERSION
+ /* sync wait for preroll on the playback bin and then go to PLAYING */
+ g_assert (gst_element_get_state (play_bin, NULL, NULL,
+ GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_SUCCESS);
+ g_print ("prerolled, starting synchronized playback and recording\n");
+ /* returns ASYNC because the sink linked to the live source is not
+ * prerolled */
+ g_assert (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_ASYNC);
+#endif
+
+ g_main_loop_run (loop);
+
+ g_source_remove (watch_id);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ g_main_loop_unref (loop);
+
+ return 0;
+}
diff --git a/tests/examples/seek/Makefile.am b/tests/examples/seek/Makefile.am
new file mode 100644
index 0000000..ae34780
--- /dev/null
+++ b/tests/examples/seek/Makefile.am
@@ -0,0 +1,17 @@
+if HAVE_GTK_X11
+if HAVE_LINUX_JOYSTICK_HEADERS
+GTK_EXAMPLES=seek scrubby jsseek
+else
+GTK_EXAMPLES=seek scrubby
+endif
+endif
+
+examples = $(GTK_EXAMPLES) stepping stepping2
+
+noinst_PROGRAMS = $(examples)
+
+LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) $(GTK_LIBS) $(LIBM)
+
+AM_CFLAGS = -I$(top_builddir)/gst-libs $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS)
diff --git a/tests/examples/seek/Makefile.in b/tests/examples/seek/Makefile.in
new file mode 100644
index 0000000..0d5924e
--- /dev/null
+++ b/tests/examples/seek/Makefile.in
@@ -0,0 +1,743 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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_2)
+subdir = tests/examples/seek
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_FALSE@am__EXEEXT_1 = seek$(EXEEXT) \
+@HAVE_GTK_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_FALSE@ scrubby$(EXEEXT)
+@HAVE_GTK_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_TRUE@am__EXEEXT_1 = seek$(EXEEXT) \
+@HAVE_GTK_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_TRUE@ scrubby$(EXEEXT) \
+@HAVE_GTK_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_TRUE@ jsseek$(EXEEXT)
+am__EXEEXT_2 = $(am__EXEEXT_1) stepping$(EXEEXT) stepping2$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+jsseek_SOURCES = jsseek.c
+jsseek_OBJECTS = jsseek.$(OBJEXT)
+jsseek_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+jsseek_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+scrubby_SOURCES = scrubby.c
+scrubby_OBJECTS = scrubby.$(OBJEXT)
+scrubby_LDADD = $(LDADD)
+scrubby_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+seek_SOURCES = seek.c
+seek_OBJECTS = seek.$(OBJEXT)
+seek_LDADD = $(LDADD)
+seek_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+stepping_SOURCES = stepping.c
+stepping_OBJECTS = stepping.$(OBJEXT)
+stepping_LDADD = $(LDADD)
+stepping_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+stepping2_SOURCES = stepping2.c
+stepping2_OBJECTS = stepping2.$(OBJEXT)
+stepping2_LDADD = $(LDADD)
+stepping2_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = jsseek.c scrubby.c seek.c stepping.c stepping2.c
+DIST_SOURCES = jsseek.c scrubby.c seek.c stepping.c stepping2.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_FALSE@GTK_EXAMPLES = seek scrubby
+@HAVE_GTK_X11_TRUE@@HAVE_LINUX_JOYSTICK_HEADERS_TRUE@GTK_EXAMPLES = seek scrubby jsseek
+examples = $(GTK_EXAMPLES) stepping stepping2
+LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
+ $(GST_LIBS) $(GTK_LIBS) $(LIBM)
+
+AM_CFLAGS = -I$(top_builddir)/gst-libs $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS)
+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/seek/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/seek/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
+jsseek$(EXEEXT): $(jsseek_OBJECTS) $(jsseek_DEPENDENCIES)
+ @rm -f jsseek$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(jsseek_OBJECTS) $(jsseek_LDADD) $(LIBS)
+scrubby$(EXEEXT): $(scrubby_OBJECTS) $(scrubby_DEPENDENCIES)
+ @rm -f scrubby$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(scrubby_OBJECTS) $(scrubby_LDADD) $(LIBS)
+seek$(EXEEXT): $(seek_OBJECTS) $(seek_DEPENDENCIES)
+ @rm -f seek$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(seek_OBJECTS) $(seek_LDADD) $(LIBS)
+stepping$(EXEEXT): $(stepping_OBJECTS) $(stepping_DEPENDENCIES)
+ @rm -f stepping$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(stepping_OBJECTS) $(stepping_LDADD) $(LIBS)
+stepping2$(EXEEXT): $(stepping2_OBJECTS) $(stepping2_DEPENDENCIES)
+ @rm -f stepping2$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(stepping2_OBJECTS) $(stepping2_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jsseek.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrubby.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seek.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stepping.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stepping2.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/seek/jsseek.c b/tests/examples/seek/jsseek.c
new file mode 100644
index 0000000..3329d56
--- /dev/null
+++ b/tests/examples/seek/jsseek.c
@@ -0,0 +1,3060 @@
+/* GStreamer
+ *
+ * seek.c: seeking sample application
+ *
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ * 2006 Stefan Kost <ensonic@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <math.h>
+
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+#include <string.h>
+
+#include <linux/input.h>
+#include <linux/joystick.h>
+
+#ifdef HAVE_X
+#include <gdk/gdkx.h>
+#endif
+#include <gst/interfaces/videooverlay.h>
+
+GST_DEBUG_CATEGORY_STATIC (seek_debug);
+#define GST_CAT_DEFAULT (seek_debug)
+
+#if (!GTK_CHECK_VERSION(2, 23, 0) || GTK_CHECK_VERSION(2, 90, 0)) && !GTK_CHECK_VERSION(2, 91, 1)
+#define gtk_combo_box_text_new gtk_combo_box_new_text
+#define gtk_combo_box_text_append_text gtk_combo_box_append_text
+#define gtk_combo_box_text_remove gtk_combo_box_remove_text
+#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
+#endif
+
+#if !GTK_CHECK_VERSION (2, 17, 7)
+static void
+gtk_widget_get_allocation (GtkWidget * w, GtkAllocation * a)
+{
+ *a = w->allocation;
+}
+#endif
+
+/* configuration */
+#define SOURCE "filesrc"
+
+#define ASINK "alsasink"
+//#define ASINK "osssink"
+
+#define VSINK "xvimagesink"
+//#define VSINK "sdlvideosink"
+//#define VSINK "ximagesink"
+//#define VSINK "aasink"
+//#define VSINK "cacasink"
+
+#define FILL_INTERVAL 100
+//#define UPDATE_INTERVAL 500
+//#define UPDATE_INTERVAL 100
+//#define UPDATE_INTERVAL 10
+#define UPDATE_INTERVAL 40
+
+/* number of milliseconds to play for after a seek */
+#define SCRUB_TIME 100
+
+/* timeout for gst_element_get_state() after a seek */
+#define SEEK_TIMEOUT 40 * GST_MSECOND
+
+#define DEFAULT_VIDEO_HEIGHT 300
+
+/* the state to go to when stop is pressed */
+#define STOP_STATE GST_STATE_READY
+
+
+static GList *seekable_pads = NULL;
+static GList *rate_pads = NULL;
+static GList *seekable_elements = NULL;
+
+static gboolean accurate_seek = FALSE;
+static gboolean keyframe_seek = FALSE;
+static gboolean loop_seek = FALSE;
+static gboolean flush_seek = TRUE;
+static gboolean scrub = TRUE;
+static gboolean play_scrub = FALSE;
+static gboolean skip_seek = FALSE;
+static gdouble rate = 1.0;
+
+static GstElement *pipeline;
+static gint pipeline_type;
+static const gchar *pipeline_spec;
+static gint64 position = -1;
+static gint64 duration = -1;
+static GtkAdjustment *adjustment;
+static GtkWidget *hscale, *statusbar;
+static guint status_id = 0;
+static gboolean stats = FALSE;
+static gboolean elem_seek = FALSE;
+static gboolean verbose = FALSE;
+static gchar *js_device = NULL;
+
+static gboolean is_live = FALSE;
+static gboolean buffering = FALSE;
+static GstBufferingMode mode;
+static gint64 buffering_left;
+static GstState state = GST_STATE_NULL;
+static guint update_id = 0;
+static guint seek_timeout_id = 0;
+static gulong changed_id;
+static guint fill_id = 0;
+
+static gint n_video = 0, n_audio = 0, n_text = 0;
+static gboolean need_streams = TRUE;
+static GtkWidget *video_combo, *audio_combo, *text_combo, *vis_combo;
+static GtkWidget *vis_checkbox, *video_checkbox, *audio_checkbox;
+static GtkWidget *text_checkbox, *mute_checkbox, *volume_spinbutton;
+static GtkWidget *skip_checkbox, *video_window, *download_checkbox;
+static GtkWidget *buffer_checkbox, *rate_spinbutton;
+
+static GStaticMutex state_mutex = G_STATIC_MUTEX_INIT;
+
+static GtkWidget *format_combo, *step_amount_spinbutton, *step_rate_spinbutton;
+static GtkWidget *shuttle_checkbox, *step_button;
+static GtkWidget *shuttle_hscale;
+static GtkAdjustment *shuttle_adjustment;
+
+static GList *paths = NULL, *l = NULL;
+
+gint js_fd;
+
+/* we keep an array of the visualisation entries so that we can easily switch
+ * with the combo box index. */
+typedef struct
+{
+ GstElementFactory *factory;
+} VisEntry;
+
+static GArray *vis_entries;
+
+static void clear_streams (GstElement * pipeline);
+static void volume_notify_cb (GstElement * pipeline, GParamSpec * arg,
+ gpointer user_dat);
+
+/* pipeline construction */
+
+typedef struct
+{
+ const gchar *padname;
+ GstPad *target;
+ GstElement *bin;
+}
+dyn_link;
+
+static GstElement *
+gst_element_factory_make_or_warn (const gchar * type, const gchar * name)
+{
+ GstElement *element = gst_element_factory_make (type, name);
+
+ if (!element) {
+ g_warning ("Failed to create element %s of type %s", name, type);
+ }
+
+ return element;
+}
+
+static void
+dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
+{
+ gchar *padname;
+ dyn_link *connect = (dyn_link *) data;
+
+ padname = gst_pad_get_name (newpad);
+
+ if (connect->padname == NULL || !strcmp (padname, connect->padname)) {
+ if (connect->bin)
+ gst_bin_add (GST_BIN (pipeline), connect->bin);
+ gst_pad_link (newpad, connect->target);
+
+ //seekable_pads = g_list_prepend (seekable_pads, newpad);
+ rate_pads = g_list_prepend (rate_pads, newpad);
+ }
+ g_free (padname);
+}
+
+static void
+setup_dynamic_link (GstElement * element, const gchar * padname,
+ GstPad * target, GstElement * bin)
+{
+ dyn_link *connect;
+
+ connect = g_new0 (dyn_link, 1);
+ connect->padname = g_strdup (padname);
+ connect->target = target;
+ connect->bin = bin;
+
+ g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link),
+ connect);
+}
+
+static GstElement *
+make_mod_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *decoder, *audiosink;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ decoder = gst_element_factory_make_or_warn ("modplug", "decoder");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+ //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, decoder);
+ gst_element_link (decoder, audiosink);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_dv_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *demux, *decoder, *audiosink, *videosink;
+ GstElement *a_queue, *v_queue;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ demux = gst_element_factory_make_or_warn ("dvdemux", "demuxer");
+ v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
+ decoder = gst_element_factory_make_or_warn ("ffdec_dvvideo", "decoder");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ audiosink = gst_element_factory_make_or_warn ("alsasink", "a_sink");
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_bin_add (GST_BIN (pipeline), a_queue);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+ gst_bin_add (GST_BIN (pipeline), v_queue);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), videosink);
+
+ gst_element_link (src, demux);
+ gst_element_link (a_queue, audiosink);
+ gst_element_link (v_queue, decoder);
+ gst_element_link (decoder, videosink);
+
+ setup_dynamic_link (demux, "video", gst_element_get_static_pad (v_queue,
+ "sink"), NULL);
+ setup_dynamic_link (demux, "audio", gst_element_get_static_pad (a_queue,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+
+ return pipeline;
+}
+
+static GstElement *
+make_wav_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *decoder, *audiosink;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ decoder = gst_element_factory_make_or_warn ("wavparse", "decoder");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, decoder);
+
+ setup_dynamic_link (decoder, "src", gst_element_get_static_pad (audiosink,
+ "sink"), NULL);
+
+ seekable_elements = g_list_prepend (seekable_elements, audiosink);
+
+ /* force element seeking on this pipeline */
+ elem_seek = TRUE;
+
+ return pipeline;
+}
+
+static GstElement *
+make_flac_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *decoder, *audiosink;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ decoder = gst_element_factory_make_or_warn ("flacdec", "decoder");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+ g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, decoder);
+ gst_element_link (decoder, audiosink);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_sid_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *decoder, *audiosink;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ decoder = gst_element_factory_make_or_warn ("siddec", "decoder");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+ //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, decoder);
+ gst_element_link (decoder, audiosink);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_parse_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *parser, *fakesink;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ parser = gst_element_factory_make_or_warn ("mpegparse", "parse");
+ fakesink = gst_element_factory_make_or_warn ("fakesink", "sink");
+ g_object_set (G_OBJECT (fakesink), "silent", TRUE, NULL);
+ g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), parser);
+ gst_bin_add (GST_BIN (pipeline), fakesink);
+
+ gst_element_link (src, parser);
+ gst_element_link (parser, fakesink);
+
+ seekable = gst_element_get_static_pad (parser, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (parser, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_vorbis_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin;
+ GstElement *src, *demux, *decoder, *convert, *audiosink;
+ GstPad *pad, *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ demux = gst_element_factory_make_or_warn ("oggdemux", "demux");
+ decoder = gst_element_factory_make_or_warn ("vorbisdec", "decoder");
+ convert = gst_element_factory_make_or_warn ("audioconvert", "convert");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+ g_object_set (G_OBJECT (audiosink), "sync", TRUE, NULL);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_bin_add (GST_BIN (audio_bin), decoder);
+ gst_bin_add (GST_BIN (audio_bin), convert);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+ gst_bin_add (GST_BIN (pipeline), audio_bin);
+
+ gst_element_link (src, demux);
+ gst_element_link (decoder, convert);
+ gst_element_link (convert, audiosink);
+
+ pad = gst_element_get_static_pad (decoder, "sink");
+ gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (audio_bin,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_theora_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *video_bin;
+ GstElement *src, *demux, *decoder, *convert, *videosink;
+ GstPad *pad, *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ demux = gst_element_factory_make_or_warn ("oggdemux", "demux");
+ decoder = gst_element_factory_make_or_warn ("theoradec", "decoder");
+ convert = gst_element_factory_make_or_warn ("videoconvert", "convert");
+ videosink = gst_element_factory_make_or_warn (VSINK, "sink");
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_bin_add (GST_BIN (video_bin), decoder);
+ gst_bin_add (GST_BIN (video_bin), convert);
+ gst_bin_add (GST_BIN (video_bin), videosink);
+ gst_bin_add (GST_BIN (pipeline), video_bin);
+
+ gst_element_link (src, demux);
+ gst_element_link (decoder, convert);
+ gst_element_link (convert, videosink);
+
+ pad = gst_element_get_static_pad (decoder, "sink");
+ gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (video_bin,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_vorbis_theora_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin, *video_bin;
+ GstElement *src, *demux, *a_decoder, *a_convert, *v_decoder, *v_convert;
+ GstElement *audiosink, *videosink;
+ GstElement *a_queue, *v_queue, *v_scale;
+ GstPad *seekable;
+ GstPad *pad;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ demux = gst_element_factory_make_or_warn ("oggdemux", "demux");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_element_link (src, demux);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ a_decoder = gst_element_factory_make_or_warn ("vorbisdec", "a_dec");
+ a_convert = gst_element_factory_make_or_warn ("audioconvert", "a_convert");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
+
+ gst_bin_add (GST_BIN (pipeline), audio_bin);
+
+ gst_bin_add (GST_BIN (audio_bin), a_queue);
+ gst_bin_add (GST_BIN (audio_bin), a_decoder);
+ gst_bin_add (GST_BIN (audio_bin), a_convert);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+
+ gst_element_link (a_queue, a_decoder);
+ gst_element_link (a_decoder, a_convert);
+ gst_element_link (a_convert, audiosink);
+
+ pad = gst_element_get_static_pad (a_queue, "sink");
+ gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (audio_bin,
+ "sink"), NULL);
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+ v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
+ v_decoder = gst_element_factory_make_or_warn ("theoradec", "v_dec");
+ v_convert = gst_element_factory_make_or_warn ("videoconvert", "v_convert");
+ v_scale = gst_element_factory_make_or_warn ("videoscale", "v_scale");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+
+ gst_bin_add (GST_BIN (pipeline), video_bin);
+
+ gst_bin_add (GST_BIN (video_bin), v_queue);
+ gst_bin_add (GST_BIN (video_bin), v_decoder);
+ gst_bin_add (GST_BIN (video_bin), v_convert);
+ gst_bin_add (GST_BIN (video_bin), v_scale);
+ gst_bin_add (GST_BIN (video_bin), videosink);
+
+ gst_element_link_many (v_queue, v_decoder, v_convert, v_scale, videosink,
+ NULL);
+
+ pad = gst_element_get_static_pad (v_queue, "sink");
+ gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (video_bin,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (a_decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (a_decoder,
+ "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_avi_msmpeg4v3_mp3_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin, *video_bin;
+ GstElement *src, *demux, *a_decoder, *a_convert, *v_decoder, *v_convert;
+ GstElement *audiosink, *videosink;
+ GstElement *a_queue, *v_queue;
+ GstPad *seekable, *pad;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ demux = gst_element_factory_make_or_warn ("avidemux", "demux");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_element_link (src, demux);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
+ a_convert = gst_element_factory_make_or_warn ("audioconvert", "a_convert");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
+
+ gst_bin_add (GST_BIN (audio_bin), a_queue);
+ gst_bin_add (GST_BIN (audio_bin), a_decoder);
+ gst_bin_add (GST_BIN (audio_bin), a_convert);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+
+ gst_element_link (a_queue, a_decoder);
+ gst_element_link (a_decoder, a_convert);
+ gst_element_link (a_convert, audiosink);
+
+ gst_bin_add (GST_BIN (pipeline), audio_bin);
+
+ pad = gst_element_get_static_pad (a_queue, "sink");
+ gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (audio_bin,
+ "sink"), NULL);
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+ v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
+ v_decoder = gst_element_factory_make_or_warn ("ffdec_msmpeg4", "v_dec");
+ v_convert = gst_element_factory_make_or_warn ("videoconvert", "v_convert");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+
+ gst_bin_add (GST_BIN (video_bin), v_queue);
+ gst_bin_add (GST_BIN (video_bin), v_decoder);
+ gst_bin_add (GST_BIN (video_bin), v_convert);
+ gst_bin_add (GST_BIN (video_bin), videosink);
+
+ gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), video_bin);
+
+ pad = gst_element_get_static_pad (v_queue, "sink");
+ gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, NULL, gst_element_get_static_pad (video_bin,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (a_decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (a_decoder,
+ "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_mp3_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *parser, *decoder, *audiosink, *queue;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ parser = gst_element_factory_make_or_warn ("mp3parse", "parse");
+ decoder = gst_element_factory_make_or_warn ("mad", "dec");
+ queue = gst_element_factory_make_or_warn ("queue", "queue");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+
+ seekable_elements = g_list_prepend (seekable_elements, audiosink);
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+ //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), parser);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), queue);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, parser);
+ gst_element_link (parser, decoder);
+ gst_element_link (decoder, queue);
+ gst_element_link (queue, audiosink);
+
+ seekable = gst_element_get_static_pad (queue, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (decoder, "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_avi_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin, *video_bin;
+ GstElement *src, *demux, *a_decoder, *v_decoder, *audiosink, *videosink;
+ GstElement *a_queue = NULL, *v_queue = NULL;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ demux = gst_element_factory_make_or_warn ("avidemux", "demux");
+ seekable_elements = g_list_prepend (seekable_elements, demux);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_element_link (src, demux);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+ a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ gst_element_link (a_decoder, a_queue);
+ gst_element_link (a_queue, audiosink);
+ gst_bin_add (GST_BIN (audio_bin), a_decoder);
+ gst_bin_add (GST_BIN (audio_bin), a_queue);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+ gst_element_set_state (audio_bin, GST_STATE_PAUSED);
+
+ setup_dynamic_link (demux, "audio_00", gst_element_get_static_pad (a_decoder,
+ "sink"), audio_bin);
+
+ seekable = gst_element_get_static_pad (a_queue, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (a_decoder,
+ "sink"));
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+ v_decoder = gst_element_factory_make_or_warn ("ffmpegdecall", "v_dec");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+ v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
+ gst_element_link (v_decoder, v_queue);
+ gst_element_link (v_queue, videosink);
+ gst_bin_add (GST_BIN (video_bin), v_decoder);
+ gst_bin_add (GST_BIN (video_bin), v_queue);
+ gst_bin_add (GST_BIN (video_bin), videosink);
+
+ gst_element_set_state (video_bin, GST_STATE_PAUSED);
+
+ setup_dynamic_link (demux, "video_00", gst_element_get_static_pad (v_decoder,
+ "sink"), video_bin);
+
+ seekable = gst_element_get_static_pad (v_queue, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (v_decoder,
+ "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_mpeg_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin, *video_bin;
+ GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
+ GstElement *audiosink, *videosink;
+ GstElement *a_queue, *v_queue;
+ GstPad *seekable;
+ GstPad *pad;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ //demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
+ demux = gst_element_factory_make_or_warn ("flupsdemux", "demux");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_element_link (src, demux);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+ a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
+ gst_bin_add (GST_BIN (audio_bin), a_decoder);
+ gst_bin_add (GST_BIN (audio_bin), a_queue);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+
+ gst_element_link (a_decoder, a_queue);
+ gst_element_link (a_queue, audiosink);
+
+ gst_bin_add (GST_BIN (pipeline), audio_bin);
+
+ pad = gst_element_get_static_pad (a_decoder, "sink");
+ gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, "audio_c0", gst_element_get_static_pad (audio_bin,
+ "sink"), NULL);
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+ v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
+ v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
+ v_filter = gst_element_factory_make_or_warn ("videoconvert", "v_filter");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+
+ gst_bin_add (GST_BIN (video_bin), v_decoder);
+ gst_bin_add (GST_BIN (video_bin), v_queue);
+ gst_bin_add (GST_BIN (video_bin), v_filter);
+ gst_bin_add (GST_BIN (video_bin), videosink);
+
+ gst_element_link (v_decoder, v_queue);
+ gst_element_link (v_queue, v_filter);
+ gst_element_link (v_filter, videosink);
+
+ gst_bin_add (GST_BIN (pipeline), video_bin);
+
+ pad = gst_element_get_static_pad (v_decoder, "sink");
+ gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ setup_dynamic_link (demux, "video_e0", gst_element_get_static_pad (video_bin,
+ "sink"), NULL);
+
+ seekable = gst_element_get_static_pad (v_filter, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (v_decoder,
+ "sink"));
+
+ return pipeline;
+}
+
+static GstElement *
+make_mpegnt_pipeline (const gchar * location)
+{
+ GstElement *pipeline, *audio_bin, *video_bin;
+ GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
+ GstElement *audiosink, *videosink;
+ GstElement *a_queue;
+ GstPad *seekable;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
+ //g_object_set (G_OBJECT (demux), "sync", TRUE, NULL);
+
+ seekable_elements = g_list_prepend (seekable_elements, demux);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), demux);
+ gst_element_link (src, demux);
+
+ audio_bin = gst_bin_new ("a_decoder_bin");
+ a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
+ a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
+ //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
+ g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+ gst_element_link (a_decoder, a_queue);
+ gst_element_link (a_queue, audiosink);
+ gst_bin_add (GST_BIN (audio_bin), a_decoder);
+ gst_bin_add (GST_BIN (audio_bin), a_queue);
+ gst_bin_add (GST_BIN (audio_bin), audiosink);
+
+ setup_dynamic_link (demux, "audio_00", gst_element_get_static_pad (a_decoder,
+ "sink"), audio_bin);
+
+ seekable = gst_element_get_static_pad (a_queue, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (a_decoder,
+ "sink"));
+
+ video_bin = gst_bin_new ("v_decoder_bin");
+ v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
+ v_filter = gst_element_factory_make_or_warn ("videoconvert", "v_filter");
+ videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
+ gst_element_link_many (v_decoder, v_filter, videosink, NULL);
+
+ gst_bin_add_many (GST_BIN (video_bin), v_decoder, v_filter, videosink, NULL);
+
+ setup_dynamic_link (demux, "video_00", gst_element_get_static_pad (v_decoder,
+ "sink"), video_bin);
+
+ seekable = gst_element_get_static_pad (v_decoder, "src");
+ seekable_pads = g_list_prepend (seekable_pads, seekable);
+ rate_pads = g_list_prepend (rate_pads, seekable);
+ rate_pads =
+ g_list_prepend (rate_pads, gst_element_get_static_pad (v_decoder,
+ "sink"));
+
+ return pipeline;
+}
+
+static void
+playerbin_set_uri (GstElement * player, const gchar * location)
+{
+ gchar *uri;
+
+ /* Add "file://" prefix for convenience */
+ if (g_str_has_prefix (location, "/")) {
+ uri = g_strconcat ("file://", location, NULL);
+ g_object_set (G_OBJECT (player), "uri", uri, NULL);
+ g_free (uri);
+ } else {
+ g_object_set (G_OBJECT (player), "uri", location, NULL);
+ }
+}
+
+static GstElement *
+construct_playerbin (const gchar * name, const gchar * location)
+{
+ GstElement *player;
+
+ player = gst_element_factory_make (name, "player");
+ g_assert (player);
+
+ playerbin_set_uri (player, location);
+
+ seekable_elements = g_list_prepend (seekable_elements, player);
+
+ /* force element seeking on this pipeline */
+ elem_seek = TRUE;
+
+ return player;
+}
+
+static GstElement *
+make_playerbin_pipeline (const gchar * location)
+{
+ return construct_playerbin ("playbin", location);
+}
+
+static GstElement *
+make_playerbin2_pipeline (const gchar * location)
+{
+ GstElement *pipeline = construct_playerbin ("playbin2", location);
+
+ /* FIXME: this is not triggered, playbin2 is not forwarding it from the sink */
+ g_signal_connect (pipeline, "notify::volume", G_CALLBACK (volume_notify_cb),
+ NULL);
+ return pipeline;
+}
+
+#ifndef GST_DISABLE_PARSE
+static GstElement *
+make_parselaunch_pipeline (const gchar * description)
+{
+ GstElement *pipeline;
+ GError *error = NULL;
+
+ pipeline = gst_parse_launch (description, &error);
+
+ seekable_elements = g_list_prepend (seekable_elements, pipeline);
+
+ elem_seek = TRUE;
+
+ return pipeline;
+}
+#endif
+
+typedef struct
+{
+ const gchar *name;
+ GstElement *(*func) (const gchar * location);
+}
+Pipeline;
+
+static Pipeline pipelines[] = {
+ {"mp3", make_mp3_pipeline},
+ {"avi", make_avi_pipeline},
+ {"mpeg1", make_mpeg_pipeline},
+ {"mpegparse", make_parse_pipeline},
+ {"vorbis", make_vorbis_pipeline},
+ {"theora", make_theora_pipeline},
+ {"ogg/v/t", make_vorbis_theora_pipeline},
+ {"avi/msmpeg4v3/mp3", make_avi_msmpeg4v3_mp3_pipeline},
+ {"sid", make_sid_pipeline},
+ {"flac", make_flac_pipeline},
+ {"wav", make_wav_pipeline},
+ {"mod", make_mod_pipeline},
+ {"dv", make_dv_pipeline},
+ {"mpeg1nothreads", make_mpegnt_pipeline},
+ {"playerbin", make_playerbin_pipeline},
+#ifndef GST_DISABLE_PARSE
+ {"parse-launch", make_parselaunch_pipeline},
+#endif
+ {"playerbin2", make_playerbin2_pipeline},
+ {NULL, NULL},
+};
+
+#define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1)
+
+/* ui callbacks and helpers */
+
+static gchar *
+format_value (GtkScale * scale, gdouble value)
+{
+ gint64 real;
+ gint64 seconds;
+ gint64 subseconds;
+
+ real = value * duration / 100;
+ seconds = (gint64) real / GST_SECOND;
+ subseconds = (gint64) real / (GST_SECOND / 100);
+
+ return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
+ G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
+}
+
+
+static gchar *
+shuttle_format_value (GtkScale * scale, gdouble value)
+{
+ return g_strdup_printf ("%0.*g", gtk_scale_get_digits (scale), value);
+}
+
+typedef struct
+{
+ const gchar *name;
+ const GstFormat format;
+}
+seek_format;
+
+static seek_format seek_formats[] = {
+ {"tim", GST_FORMAT_TIME},
+ {"byt", GST_FORMAT_BYTES},
+ {"buf", GST_FORMAT_BUFFERS},
+ {"def", GST_FORMAT_DEFAULT},
+ {NULL, 0},
+};
+
+G_GNUC_UNUSED static void
+query_rates (void)
+{
+ GList *walk = rate_pads;
+
+ while (walk) {
+ GstPad *pad = GST_PAD (walk->data);
+ gint i = 0;
+
+ g_print ("rate/sec %8.8s: ", GST_PAD_NAME (pad));
+ while (seek_formats[i].name) {
+ gint64 value;
+ GstFormat format;
+
+ format = seek_formats[i].format;
+
+ if (gst_pad_query_convert (pad, GST_FORMAT_TIME, GST_SECOND, format,
+ &value)) {
+ g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value);
+ } else {
+ g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+ }
+
+ i++;
+ }
+ g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+ walk = g_list_next (walk);
+ }
+}
+
+G_GNUC_UNUSED static void
+query_positions_elems (void)
+{
+ GList *walk = seekable_elements;
+
+ while (walk) {
+ GstElement *element = GST_ELEMENT (walk->data);
+ gint i = 0;
+
+ g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
+ while (seek_formats[i].name) {
+ gint64 position, total;
+ GstFormat format;
+
+ format = seek_formats[i].format;
+
+ if (gst_element_query_position (element, format, &position) &&
+ gst_element_query_duration (element, format, &total)) {
+ g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ",
+ seek_formats[i].name, position, total);
+ } else {
+ g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*",
+ "*NA*");
+ }
+ i++;
+ }
+ g_print (" %s\n", GST_ELEMENT_NAME (element));
+
+ walk = g_list_next (walk);
+ }
+}
+
+G_GNUC_UNUSED static void
+query_positions_pads (void)
+{
+ GList *walk = seekable_pads;
+
+ while (walk) {
+ GstPad *pad = GST_PAD (walk->data);
+ gint i = 0;
+
+ g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
+ while (seek_formats[i].name) {
+ GstFormat format;
+ gint64 position, total;
+
+ format = seek_formats[i].format;
+
+ if (gst_pad_query_position (pad, format, &position) &&
+ gst_pad_query_duration (pad, format, &total)) {
+ g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ",
+ seek_formats[i].name, position, total);
+ } else {
+ g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*",
+ "*NA*");
+ }
+
+ i++;
+ }
+ g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+ walk = g_list_next (walk);
+ }
+}
+
+static gboolean start_seek (GtkWidget * widget, GdkEventButton * event,
+ gpointer user_data);
+static gboolean stop_seek (GtkWidget * widget, GdkEventButton * event,
+ gpointer user_data);
+static void seek_cb (GtkWidget * widget);
+
+static void
+set_scale (gdouble value)
+{
+ g_signal_handlers_block_by_func (hscale, (void *) start_seek,
+ (void *) pipeline);
+ g_signal_handlers_block_by_func (hscale, (void *) stop_seek,
+ (void *) pipeline);
+ g_signal_handlers_block_by_func (hscale, (void *) seek_cb, (void *) pipeline);
+ gtk_adjustment_set_value (adjustment, value);
+ g_signal_handlers_unblock_by_func (hscale, (void *) start_seek,
+ (void *) pipeline);
+ g_signal_handlers_unblock_by_func (hscale, (void *) stop_seek,
+ (void *) pipeline);
+ g_signal_handlers_unblock_by_func (hscale, (void *) seek_cb,
+ (void *) pipeline);
+ gtk_widget_queue_draw (hscale);
+}
+
+static gboolean
+update_fill (gpointer data)
+{
+ if (elem_seek) {
+ if (seekable_elements) {
+ GstElement *element = GST_ELEMENT (seekable_elements->data);
+ GstQuery *query;
+
+ query = gst_query_new_buffering (GST_FORMAT_PERCENT);
+ if (gst_element_query (element, query)) {
+ gint64 start, stop, buffering_total;
+ GstFormat format;
+ gdouble fill;
+ gboolean busy;
+ gint percent;
+ GstBufferingMode mode;
+ gint avg_in, avg_out;
+ gint64 buffering_left;
+
+ gst_query_parse_buffering_percent (query, &busy, &percent);
+ gst_query_parse_buffering_range (query, &format, &start, &stop,
+ &buffering_total);
+ gst_query_parse_buffering_stats (query, &mode, &avg_in, &avg_out,
+ &buffering_left);
+
+ /* note that we could start the playback when buffering_left < remaining
+ * playback time */
+ GST_DEBUG ("buffering total %" G_GINT64_FORMAT " ms, left %"
+ G_GINT64_FORMAT " ms", buffering_total, buffering_left);
+ GST_DEBUG ("start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT,
+ start, stop);
+
+ if (stop != -1)
+ fill = 100.0 * stop / GST_FORMAT_PERCENT_MAX;
+ else
+ fill = 100.0;
+
+ gtk_range_set_fill_level (GTK_RANGE (hscale), fill);
+ }
+ gst_query_unref (query);
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+update_scale (gpointer data)
+{
+ if (elem_seek) {
+ if (seekable_elements) {
+ GstElement *element = GST_ELEMENT (seekable_elements->data);
+
+ gst_element_query_position (element, GST_FORMAT_TIME, &position);
+ gst_element_query_duration (element, GST_FORMAT_TIME, &duration);
+ }
+ } else {
+ if (seekable_pads) {
+ GstPad *pad = GST_PAD (seekable_pads->data);
+
+ gst_pad_query_position (pad, GST_FORMAT_TIME, &position);
+ gst_pad_query_duration (pad, GST_FORMAT_TIME, &duration);
+ }
+ }
+
+ if (stats) {
+ if (elem_seek) {
+ query_positions_elems ();
+ } else {
+ query_positions_pads ();
+ }
+ query_rates ();
+ }
+
+ if (position >= duration)
+ duration = position;
+
+ if (duration > 0) {
+ set_scale (position * 100.0 / duration);
+ }
+
+ /* FIXME: see make_playerbin2_pipeline() and volume_notify_cb() */
+ if (pipeline_type == 16) {
+ g_object_notify (G_OBJECT (pipeline), "volume");
+ }
+
+ return TRUE;
+}
+
+static void do_seek (GtkWidget * widget);
+static void connect_bus_signals (GstElement * pipeline);
+static void set_update_scale (gboolean active);
+static void set_update_fill (gboolean active);
+
+static gboolean
+end_scrub (GtkWidget * widget)
+{
+ GST_DEBUG ("end scrub, PAUSE");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ seek_timeout_id = 0;
+
+ return FALSE;
+}
+
+static gboolean
+send_event (GstEvent * event)
+{
+ gboolean res = FALSE;
+
+ if (!elem_seek) {
+ GList *walk = seekable_pads;
+
+ while (walk) {
+ GstPad *seekable = GST_PAD (walk->data);
+
+ GST_DEBUG ("send event on pad %s:%s", GST_DEBUG_PAD_NAME (seekable));
+
+ gst_event_ref (event);
+ res = gst_pad_send_event (seekable, event);
+
+ walk = g_list_next (walk);
+ }
+ } else {
+ GList *walk = seekable_elements;
+
+ while (walk) {
+ GstElement *seekable = GST_ELEMENT (walk->data);
+
+ GST_DEBUG ("send event on element %s", GST_ELEMENT_NAME (seekable));
+
+ gst_event_ref (event);
+ res = gst_element_send_event (seekable, event);
+
+ walk = g_list_next (walk);
+ }
+ }
+ gst_event_unref (event);
+ return res;
+}
+
+static void
+do_seek (GtkWidget * widget)
+{
+ gint64 real;
+ gboolean res = FALSE;
+ GstEvent *s_event;
+ GstSeekFlags flags;
+
+ real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100;
+
+ flags = 0;
+ if (flush_seek)
+ flags |= GST_SEEK_FLAG_FLUSH;
+ if (accurate_seek)
+ flags |= GST_SEEK_FLAG_ACCURATE;
+ if (keyframe_seek)
+ flags |= GST_SEEK_FLAG_KEY_UNIT;
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ if (rate >= 0) {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, real, GST_SEEK_TYPE_SET,
+ GST_CLOCK_TIME_NONE);
+ GST_DEBUG ("seek with rate %lf to %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (real), GST_TIME_ARGS (duration));
+ } else {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, real);
+ GST_DEBUG ("seek with rate %lf to %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (0), GST_TIME_ARGS (real));
+ }
+
+ res = send_event (s_event);
+
+ if (res) {
+ if (flush_seek) {
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, SEEK_TIMEOUT);
+ } else {
+ set_update_scale (TRUE);
+ }
+ } else {
+ g_print ("seek failed\n");
+ set_update_scale (TRUE);
+ }
+}
+
+static void
+seek_cb (GtkWidget * widget)
+{
+ /* If the timer hasn't expired yet, then the pipeline is running */
+ if (play_scrub && seek_timeout_id != 0) {
+ GST_DEBUG ("do scrub seek, PAUSED");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+
+ GST_DEBUG ("do seek");
+ do_seek (widget);
+
+ if (play_scrub) {
+ GST_DEBUG ("do scrub seek, PLAYING");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ if (seek_timeout_id == 0) {
+ seek_timeout_id =
+ g_timeout_add (SCRUB_TIME, (GSourceFunc) end_scrub, widget);
+ }
+ }
+}
+
+static void
+set_update_fill (gboolean active)
+{
+ GST_DEBUG ("fill scale is %d", active);
+
+ if (active) {
+ if (fill_id == 0) {
+ fill_id =
+ g_timeout_add (FILL_INTERVAL, (GSourceFunc) update_fill, pipeline);
+ }
+ } else {
+ if (fill_id) {
+ g_source_remove (fill_id);
+ fill_id = 0;
+ }
+ }
+}
+
+static void
+set_update_scale (gboolean active)
+{
+
+ GST_DEBUG ("update scale is %d", active);
+
+ if (active) {
+ if (update_id == 0) {
+ update_id =
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, pipeline);
+ }
+ } else {
+ if (update_id) {
+ g_source_remove (update_id);
+ update_id = 0;
+ }
+ }
+}
+
+static gboolean
+start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
+{
+ if (event->type != GDK_BUTTON_PRESS)
+ return FALSE;
+
+ set_update_scale (FALSE);
+
+ if (state == GST_STATE_PLAYING && flush_seek && scrub) {
+ GST_DEBUG ("start scrub seek, PAUSE");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+
+ if (changed_id == 0 && flush_seek && scrub) {
+ changed_id =
+ g_signal_connect (hscale, "value_changed", G_CALLBACK (seek_cb),
+ pipeline);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
+{
+ if (changed_id) {
+ g_signal_handler_disconnect (hscale, changed_id);
+ changed_id = 0;
+ }
+
+ if (!flush_seek || !scrub) {
+ GST_DEBUG ("do final seek");
+ do_seek (widget);
+ }
+
+ if (seek_timeout_id != 0) {
+ g_source_remove (seek_timeout_id);
+ seek_timeout_id = 0;
+ /* Still scrubbing, so the pipeline is playing, see if we need PAUSED
+ * instead. */
+ if (state == GST_STATE_PAUSED) {
+ GST_DEBUG ("stop scrub seek, PAUSED");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ } else {
+ if (state == GST_STATE_PLAYING) {
+ GST_DEBUG ("stop scrub seek, PLAYING");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+play_cb (GtkButton * button, gpointer data)
+{
+ GstStateChangeReturn ret;
+
+ if (state != GST_STATE_PLAYING) {
+ g_print ("PLAY pipeline\n");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ goto failed;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+ default:
+ break;
+ }
+ state = GST_STATE_PLAYING;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Playing");
+ }
+
+ return;
+
+failed:
+ {
+ g_print ("PLAY failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Play failed");
+ }
+}
+
+static void
+pause_cb (GtkButton * button, gpointer data)
+{
+ g_static_mutex_lock (&state_mutex);
+ if (state != GST_STATE_PAUSED) {
+ GstStateChangeReturn ret;
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ g_print ("PAUSE pipeline\n");
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ goto failed;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+ default:
+ break;
+ }
+
+ state = GST_STATE_PAUSED;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Paused");
+ }
+ g_static_mutex_unlock (&state_mutex);
+
+ return;
+
+failed:
+ {
+ g_static_mutex_unlock (&state_mutex);
+ g_print ("PAUSE failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Pause failed");
+ }
+}
+
+static void
+stop_cb (GtkButton * button, gpointer data)
+{
+ if (state != STOP_STATE) {
+ GstStateChangeReturn ret;
+
+ g_print ("READY pipeline\n");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+
+ g_static_mutex_lock (&state_mutex);
+ ret = gst_element_set_state (pipeline, STOP_STATE);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto failed;
+
+ state = STOP_STATE;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stopped");
+
+ is_live = FALSE;
+ buffering = FALSE;
+ set_update_scale (FALSE);
+ set_scale (0.0);
+ set_update_fill (FALSE);
+
+ if (pipeline_type == 16)
+ clear_streams (pipeline);
+ g_static_mutex_unlock (&state_mutex);
+
+#if 0
+ /* if one uses parse_launch, play, stop and play again it fails as all the
+ * pads after the demuxer can't be reconnected
+ */
+ if (!strcmp (pipelines[pipeline_type].name, "parse-launch")) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ g_list_free (seekable_elements);
+ seekable_elements = NULL;
+ g_list_free (seekable_pads);
+ seekable_pads = NULL;
+ g_list_free (rate_pads);
+ rate_pads = NULL;
+
+ pipeline = pipelines[pipeline_type].func (pipeline_spec);
+ g_assert (pipeline);
+ gst_element_set_state (pipeline, STOP_STATE);
+ connect_bus_signals (pipeline);
+ }
+#endif
+ }
+ return;
+
+failed:
+ {
+ g_static_mutex_unlock (&state_mutex);
+ g_print ("STOP failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stop failed");
+ }
+}
+
+static void
+accurate_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ accurate_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+key_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ keyframe_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+loop_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ loop_seek = gtk_toggle_button_get_active (button);
+ if (state == GST_STATE_PLAYING) {
+ do_seek (hscale);
+ }
+}
+
+static void
+flush_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ flush_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+scrub_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ scrub = gtk_toggle_button_get_active (button);
+}
+
+static void
+play_scrub_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ play_scrub = gtk_toggle_button_get_active (button);
+}
+
+static void
+skip_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ skip_seek = gtk_toggle_button_get_active (button);
+ if (state == GST_STATE_PLAYING) {
+ do_seek (hscale);
+ }
+}
+
+static void
+rate_spinbutton_changed_cb (GtkSpinButton * button, GstPipeline * pipeline)
+{
+ gboolean res = FALSE;
+ GstEvent *s_event;
+ GstSeekFlags flags;
+
+ rate = gtk_spin_button_get_value (button);
+
+ GST_DEBUG ("rate changed to %lf", rate);
+
+ flags = 0;
+ if (flush_seek)
+ flags |= GST_SEEK_FLAG_FLUSH;
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (accurate_seek)
+ flags |= GST_SEEK_FLAG_ACCURATE;
+ if (keyframe_seek)
+ flags |= GST_SEEK_FLAG_KEY_UNIT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ if (rate >= 0.0) {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, position,
+ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
+ } else {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, position);
+ }
+
+ res = send_event (s_event);
+
+ if (res) {
+ if (flush_seek) {
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, SEEK_TIMEOUT);
+ }
+ } else
+ g_print ("seek failed\n");
+}
+
+static void
+update_flag (GstPipeline * pipeline, gint num, gboolean state)
+{
+ gint flags;
+
+ g_object_get (pipeline, "flags", &flags, NULL);
+ if (state)
+ flags |= (1 << num);
+ else
+ flags &= ~(1 << num);
+ g_object_set (pipeline, "flags", flags, NULL);
+}
+
+static void
+vis_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 3, state);
+ gtk_widget_set_sensitive (vis_combo, state);
+}
+
+static void
+audio_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 1, state);
+ gtk_widget_set_sensitive (audio_combo, state);
+}
+
+static void
+video_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 0, state);
+ gtk_widget_set_sensitive (video_combo, state);
+}
+
+static void
+text_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 2, state);
+ gtk_widget_set_sensitive (text_combo, state);
+}
+
+static void
+mute_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean mute;
+
+ mute = gtk_toggle_button_get_active (button);
+ g_object_set (pipeline, "mute", mute, NULL);
+}
+
+static void
+download_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 7, state);
+}
+
+static void
+buffer_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 8, state);
+}
+
+static void
+clear_streams (GstElement * pipeline)
+{
+ gint i;
+
+ /* remove previous info */
+ for (i = 0; i < n_video; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (video_combo), 0);
+ for (i = 0; i < n_audio; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (audio_combo), 0);
+ for (i = 0; i < n_text; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (text_combo), 0);
+
+ n_audio = n_video = n_text = 0;
+ gtk_widget_set_sensitive (video_combo, FALSE);
+ gtk_widget_set_sensitive (audio_combo, FALSE);
+ gtk_widget_set_sensitive (text_combo, FALSE);
+
+ need_streams = TRUE;
+}
+
+static void
+update_streams (GstPipeline * pipeline)
+{
+ gint i;
+
+ if (pipeline_type == 16 && need_streams) {
+ GstTagList *tags;
+ gchar *name, *str;
+ gint active_idx;
+ gboolean state;
+
+ /* remove previous info */
+ clear_streams (GST_ELEMENT_CAST (pipeline));
+
+ /* here we get and update the different streams detected by playbin2 */
+ g_object_get (pipeline, "n-video", &n_video, NULL);
+ g_object_get (pipeline, "n-audio", &n_audio, NULL);
+ g_object_get (pipeline, "n-text", &n_text, NULL);
+
+ g_print ("video %d, audio %d, text %d\n", n_video, n_audio, n_text);
+
+ active_idx = 0;
+ for (i = 0; i < n_video; i++) {
+ g_signal_emit_by_name (pipeline, "get-video-tags", i, &tags);
+ if (tags) {
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("video %d: %s\n", i, str);
+ g_free (str);
+ }
+ /* find good name for the label */
+ name = g_strdup_printf ("video %d", i + 1);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (video_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (video_checkbox));
+ gtk_widget_set_sensitive (video_combo, state && n_video > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (video_combo), active_idx);
+
+ active_idx = 0;
+ for (i = 0; i < n_audio; i++) {
+ g_signal_emit_by_name (pipeline, "get-audio-tags", i, &tags);
+ if (tags) {
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("audio %d: %s\n", i, str);
+ g_free (str);
+ }
+ /* find good name for the label */
+ name = g_strdup_printf ("audio %d", i + 1);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (audio_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (audio_checkbox));
+ gtk_widget_set_sensitive (audio_combo, state && n_audio > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (audio_combo), active_idx);
+
+ active_idx = 0;
+ for (i = 0; i < n_text; i++) {
+ g_signal_emit_by_name (pipeline, "get-text-tags", i, &tags);
+
+ name = NULL;
+ if (tags) {
+ const GValue *value;
+
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("text %d: %s\n", i, str);
+ g_free (str);
+
+ /* get the language code if we can */
+ value = gst_tag_list_get_value_index (tags, GST_TAG_LANGUAGE_CODE, 0);
+ if (value && G_VALUE_HOLDS_STRING (value)) {
+ name = g_strdup_printf ("text %s", g_value_get_string (value));
+ }
+ }
+ /* find good name for the label if we didn't use a tag */
+ if (name == NULL)
+ name = g_strdup_printf ("text %d", i + 1);
+
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (text_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (text_checkbox));
+ gtk_widget_set_sensitive (text_combo, state && n_text > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (text_combo), active_idx);
+
+ need_streams = FALSE;
+ }
+}
+
+static void
+video_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current video track %d\n", active);
+ g_object_set (pipeline, "current-video", active, NULL);
+}
+
+static void
+audio_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current audio track %d\n", active);
+ g_object_set (pipeline, "current-audio", active, NULL);
+}
+
+static void
+text_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current text track %d\n", active);
+ g_object_set (pipeline, "current-text", active, NULL);
+}
+
+static gboolean
+filter_features (GstPluginFeature * feature, gpointer data)
+{
+ GstElementFactory *f;
+
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+ f = GST_ELEMENT_FACTORY (feature);
+ if (!g_strrstr (gst_element_factory_get_klass (f), "Visualization"))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+init_visualization_features (void)
+{
+ GList *list, *walk;
+
+ vis_entries = g_array_new (FALSE, FALSE, sizeof (VisEntry));
+
+ list = gst_registry_feature_filter (gst_registry_get_default (),
+ filter_features, FALSE, NULL);
+
+ for (walk = list; walk; walk = g_list_next (walk)) {
+ VisEntry entry;
+ const gchar *name;
+
+ entry.factory = GST_ELEMENT_FACTORY (walk->data);
+ name = gst_element_factory_get_longname (entry.factory);
+
+ g_array_append_val (vis_entries, entry);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (vis_combo), name);
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (vis_combo), 0);
+}
+
+static void
+vis_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ guint index;
+ VisEntry *entry;
+ GstElement *element;
+
+ /* get the selected index and get the factory for this index */
+ index = gtk_combo_box_get_active (GTK_COMBO_BOX (vis_combo));
+ if (vis_entries->len > 0) {
+ entry = &g_array_index (vis_entries, VisEntry, index);
+
+ /* create an instance of the element from the factory */
+ element = gst_element_factory_create (entry->factory, NULL);
+ if (!element)
+ return;
+
+ /* set vis plugin for playbin2 */
+ g_object_set (pipeline, "vis-plugin", element, NULL);
+ }
+}
+
+static void
+volume_spinbutton_changed_cb (GtkSpinButton * button, GstPipeline * pipeline)
+{
+ gdouble volume;
+
+ volume = gtk_spin_button_get_value (button);
+
+ g_object_set (pipeline, "volume", volume, NULL);
+}
+
+static void
+volume_notify_cb (GstElement * pipeline, GParamSpec * arg, gpointer user_dat)
+{
+ gdouble cur_volume, new_volume;
+
+ g_object_get (pipeline, "volume", &new_volume, NULL);
+ cur_volume = gtk_spin_button_get_value (GTK_SPIN_BUTTON (volume_spinbutton));
+ if (fabs (cur_volume - new_volume) > 0.001) {
+ g_signal_handlers_block_by_func (volume_spinbutton,
+ volume_spinbutton_changed_cb, pipeline);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), new_volume);
+ g_signal_handlers_unblock_by_func (volume_spinbutton,
+ volume_spinbutton_changed_cb, pipeline);
+ }
+}
+
+static void
+shot_cb (GtkButton * button, gpointer data)
+{
+ GstBuffer *buffer;
+ GstCaps *caps;
+
+ /* convert to our desired format (RGB24) */
+ caps = gst_caps_new_simple ("video/x-raw-rgb",
+ "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24,
+ /* Note: we don't ask for a specific width/height here, so that
+ * videoscale can adjust dimensions from a non-1/1 pixel aspect
+ * ratio to a 1/1 pixel-aspect-ratio */
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+ "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);
+
+ /* convert the latest frame to the requested format */
+ g_signal_emit_by_name (pipeline, "convert-frame", caps, &buffer);
+ gst_caps_unref (caps);
+
+ if (buffer) {
+ GstCaps *caps;
+ GstStructure *s;
+ gboolean res;
+ gint width, height;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+ gsize size;
+ guint8 *data;
+
+ /* get the snapshot buffer format now. We set the caps on the appsink so
+ * that it can only be an rgb buffer. The only thing we have not specified
+ * on the caps is the height, which is dependant on the pixel-aspect-ratio
+ * of the source material */
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+ /* FIXME, get the caps on the buffer somehow */
+ caps = NULL;
+ if (!caps) {
+ g_warning ("could not get snapshot format\n");
+ goto done;
+ }
+ s = gst_caps_get_structure (caps, 0);
+
+ /* we need to get the final caps on the buffer to get the size */
+ res = gst_structure_get_int (s, "width", &width);
+ res |= gst_structure_get_int (s, "height", &height);
+ if (!res) {
+ g_warning ("could not get snapshot dimension\n");
+ goto done;
+ }
+
+ /* create pixmap from buffer and save, gstreamer video buffers have a stride
+ * that is rounded up to the nearest multiple of 4 */
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ pixbuf = gdk_pixbuf_new_from_data (data,
+ GDK_COLORSPACE_RGB, FALSE, 8, width, height,
+ GST_ROUND_UP_4 (width * 3), NULL, NULL);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+ gst_buffer_unmap (buffer, data, size);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+
+ done:
+ gst_buffer_unref (buffer);
+ }
+}
+
+/* called when the Step button is pressed */
+static void
+step_cb (GtkButton * button, gpointer data)
+{
+ GstEvent *event;
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush, res;
+ gint active;
+
+ active = gtk_combo_box_get_active (GTK_COMBO_BOX (format_combo));
+ amount =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (step_amount_spinbutton));
+ rate = gtk_spin_button_get_value (GTK_SPIN_BUTTON (step_rate_spinbutton));
+ flush = TRUE;
+
+ switch (active) {
+ case 0:
+ format = GST_FORMAT_BUFFERS;
+ break;
+ case 1:
+ format = GST_FORMAT_TIME;
+ amount *= GST_MSECOND;
+ break;
+ default:
+ format = GST_FORMAT_UNDEFINED;
+ break;
+ }
+
+ event = gst_event_new_step (format, amount, rate, flush, FALSE);
+
+ res = send_event (event);
+
+ if (!res) {
+ g_print ("Sending step event failed\n");
+ }
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static gboolean shuttling = FALSE;
+static gdouble shuttle_rate = 0.0;
+static gdouble play_rate = 1.0;
+
+static void
+do_shuttle (GstElement * element)
+{
+ guint64 duration;
+
+ if (shuttling)
+ duration = 40 * GST_MSECOND;
+ else
+ duration = -1;
+
+ gst_element_send_event (element,
+ gst_event_new_step (GST_FORMAT_TIME, duration, shuttle_rate, FALSE,
+ FALSE));
+}
+
+static void
+msg_sync_step_done (GstBus * bus, GstMessage * message, GstElement * element)
+{
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush;
+ gboolean intermediate;
+ guint64 duration;
+ gboolean eos;
+
+ gst_message_parse_step_done (message, &format, &amount, &rate, &flush,
+ &intermediate, &duration, &eos);
+
+ if (eos) {
+ g_print ("stepped till EOS\n");
+ return;
+ }
+
+ if (g_static_mutex_trylock (&state_mutex)) {
+ if (shuttling)
+ do_shuttle (element);
+ g_static_mutex_unlock (&state_mutex);
+ } else {
+ /* ignore step messages that come while we are doing a state change */
+ g_print ("state change is busy\n");
+ }
+}
+
+static void
+shuttle_toggled (GtkToggleButton * button, GstElement * element)
+{
+ gboolean active;
+
+ active = gtk_toggle_button_get_active (button);
+
+ if (active != shuttling) {
+ shuttling = active;
+ g_print ("shuttling %s\n", shuttling ? "active" : "inactive");
+ if (active) {
+ shuttle_rate = 0.0;
+ play_rate = 1.0;
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ }
+ }
+}
+
+static void
+shuttle_rate_switch (GstElement * element)
+{
+ GstSeekFlags flags;
+ GstEvent *s_event;
+ gboolean res;
+
+ if (state == GST_STATE_PLAYING) {
+ /* pause when we need to */
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ }
+
+ if (play_rate == 1.0)
+ play_rate = -1.0;
+ else
+ play_rate = 1.0;
+
+ g_print ("rate changed to %lf %" GST_TIME_FORMAT "\n", play_rate,
+ GST_TIME_ARGS (position));
+
+ flags = GST_SEEK_FLAG_FLUSH;
+ flags |= GST_SEEK_FLAG_ACCURATE;
+
+ if (play_rate >= 0.0) {
+ s_event = gst_event_new_seek (play_rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, position,
+ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
+ } else {
+ s_event = gst_event_new_seek (play_rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, position);
+ }
+ res = send_event (s_event);
+ if (res) {
+ gst_element_get_state (element, NULL, NULL, SEEK_TIMEOUT);
+ } else {
+ g_print ("seek failed\n");
+ }
+}
+
+static void
+shuttle_value_changed (GtkRange * range, GstElement * element)
+{
+ gdouble rate;
+
+ rate = gtk_adjustment_get_value (shuttle_adjustment);
+
+ if (rate == 0.0) {
+ g_print ("rate 0.0, pause\n");
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ } else {
+ g_print ("rate changed %0.3g\n", rate);
+
+ if ((rate < 0.0 && play_rate > 0.0) || (rate > 0.0 && play_rate < 0.0)) {
+ shuttle_rate_switch (element);
+ }
+
+ shuttle_rate = ABS (rate);
+ if (state != GST_STATE_PLAYING) {
+ do_shuttle (element);
+ play_cb (NULL, NULL);
+ }
+ }
+}
+
+static void
+msg_async_done (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ GST_DEBUG ("async done");
+ /* when we get ASYNC_DONE we can query position, duration and other
+ * properties */
+ update_scale (pipeline);
+
+ /* update the available streams */
+ update_streams (pipeline);
+}
+
+static void
+msg_state_changed (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+
+ /* We only care about state changed on the pipeline */
+ if (s && GST_MESSAGE_SRC (message) == GST_OBJECT_CAST (pipeline)) {
+ GstState old, new, pending;
+
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+
+ /* When state of the pipeline changes to paused or playing we start updating scale */
+ if (new == GST_STATE_PLAYING) {
+ set_update_scale (TRUE);
+ } else {
+ set_update_scale (FALSE);
+ }
+ }
+}
+
+static void
+msg_segment_done (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ GstEvent *s_event;
+ GstSeekFlags flags;
+ gboolean res;
+ GstFormat format;
+
+ GST_DEBUG ("position is %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ gst_message_parse_segment_done (message, &format, &position);
+ GST_DEBUG ("end of segment at %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+
+ flags = 0;
+ /* in the segment-done callback we never flush as this would not make sense
+ * for seamless playback. */
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, duration);
+
+ GST_DEBUG ("restart loop with rate %lf to 0 / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (duration));
+
+ res = send_event (s_event);
+ if (!res)
+ g_print ("segment seek failed\n");
+}
+
+/* in stream buffering mode we PAUSE the pipeline until we receive a 100%
+ * message */
+static void
+do_stream_buffering (gint percent)
+{
+ gchar *bufstr;
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ bufstr = g_strdup_printf ("Buffering...%d", percent);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, bufstr);
+ g_free (bufstr);
+
+ if (percent == 100) {
+ /* a 100% message means buffering is done */
+ buffering = FALSE;
+ /* if the desired state is playing, go back */
+ if (state == GST_STATE_PLAYING) {
+ /* no state management needed for live pipelines */
+ if (!is_live) {
+ fprintf (stderr, "Done buffering, setting pipeline to PLAYING ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Playing");
+ }
+ } else {
+ /* buffering busy */
+ if (buffering == FALSE && state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ if (!is_live) {
+ fprintf (stderr, "Buffering, setting pipeline to PAUSED ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ }
+ buffering = TRUE;
+ }
+}
+
+static void
+do_download_buffering (gint percent)
+{
+ if (!buffering && percent < 100) {
+ gchar *bufstr;
+
+ buffering = TRUE;
+
+ bufstr = g_strdup_printf ("Downloading...");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, bufstr);
+ g_free (bufstr);
+
+ /* once we get a buffering message, we'll do the fill update */
+ set_update_fill (TRUE);
+
+ if (state == GST_STATE_PLAYING && !is_live) {
+ fprintf (stderr, "Downloading, setting pipeline to PAUSED ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ /* user has to manually start the playback */
+ state = GST_STATE_PAUSED;
+ }
+ }
+}
+
+static void
+msg_buffering (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ gint percent;
+
+ gst_message_parse_buffering (message, &percent);
+
+ /* get more stats */
+ gst_message_parse_buffering_stats (message, &mode, NULL, NULL,
+ &buffering_left);
+
+ switch (mode) {
+ case GST_BUFFERING_DOWNLOAD:
+ do_download_buffering (percent);
+ break;
+ case GST_BUFFERING_LIVE:
+ case GST_BUFFERING_TIMESHIFT:
+ case GST_BUFFERING_STREAM:
+ do_stream_buffering (percent);
+ break;
+ }
+}
+
+static void
+msg_clock_lost (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ g_print ("clock lost! PAUSE and PLAY to select a new clock\n");
+
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+}
+
+#ifdef HAVE_X
+
+static gulong embed_xid = 0;
+
+/* We set the xid here in response to the prepare-window-handle message via a
+ * bus sync handler because we don't know the actual videosink used from the
+ * start (as we don't know the pipeline, or bin elements such as autovideosink
+ * or gconfvideosink may be used which create the actual videosink only once
+ * the pipeline is started) */
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ GstElement *element;
+
+ if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ return GST_BUS_PASS;
+
+ element = GST_ELEMENT (GST_MESSAGE_SRC (message));
+
+ g_print ("got prepare-window-handle, setting XID %lu\n", embed_xid);
+
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
+ "force-aspect-ratio")) {
+ g_object_set (element, "force-aspect-ratio", TRUE, NULL);
+ }
+
+ /* Should have been initialised from main thread before (can't use
+ * GDK_WINDOW_XID here with Gtk+ >= 2.18, because the sync handler will
+ * be called from a streaming thread and GDK_WINDOW_XID maps to more than
+ * a simple structure lookup with Gtk+ >= 2.18, where 'more' is stuff that
+ * shouldn't be done from a non-GUI thread without explicit locking). */
+ g_assert (embed_xid != 0);
+
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (element), embed_xid);
+ return GST_BUS_PASS;
+}
+#endif
+
+static gboolean
+handle_expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer data)
+{
+ if (state < GST_STATE_PAUSED) {
+ GtkAllocation allocation;
+ GdkWindow *window = gtk_widget_get_window (widget);
+ cairo_t *cr;
+
+ gtk_widget_get_allocation (widget, &allocation);
+ cr = gdk_cairo_create (window);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+ }
+ return FALSE;
+}
+
+static void
+realize_cb (GtkWidget * widget, gpointer data)
+{
+#if GTK_CHECK_VERSION(2,18,0)
+ {
+ GdkWindow *window = gtk_widget_get_window (widget);
+
+ /* This is here just for pedagogical purposes, GDK_WINDOW_XID will call it
+ * as well */
+ if (!gdk_window_ensure_native (window))
+ g_error ("Couldn't create native window needed for GstVideoOverlay!");
+ }
+#endif
+
+#ifdef HAVE_X
+ {
+ GdkWindow *window = gtk_widget_get_window (video_window);
+
+ embed_xid = GDK_WINDOW_XID (window);
+ g_print ("Window realize: video window XID = %lu\n", embed_xid);
+ }
+#endif
+}
+
+static void
+msg_eos (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ message_received (bus, message, data);
+
+ /* Set new uri for playerbins and continue playback */
+ if (l && (pipeline_type == 14 || pipeline_type == 16)) {
+ stop_cb (NULL, NULL);
+ l = g_list_next (l);
+ if (l) {
+ playerbin_set_uri (GST_ELEMENT (data), l->data);
+ play_cb (NULL, NULL);
+ }
+ }
+}
+
+static void
+msg_step_done (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ if (!shuttling)
+ message_received (bus, message, data);
+}
+
+static void
+connect_bus_signals (GstElement * pipeline)
+{
+ GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+#ifdef HAVE_X
+ /* handle prepare-window-handle element message synchronously */
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler,
+ pipeline);
+#endif
+
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ gst_bus_enable_sync_message_emission (bus);
+
+ g_signal_connect (bus, "message::state-changed",
+ (GCallback) msg_state_changed, pipeline);
+ g_signal_connect (bus, "message::segment-done", (GCallback) msg_segment_done,
+ pipeline);
+ g_signal_connect (bus, "message::async-done", (GCallback) msg_async_done,
+ pipeline);
+
+ g_signal_connect (bus, "message::new-clock", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::clock-lost", (GCallback) msg_clock_lost,
+ pipeline);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) msg_eos, pipeline);
+ g_signal_connect (bus, "message::tag", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::element", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::segment-done", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::buffering", (GCallback) msg_buffering,
+ pipeline);
+// g_signal_connect (bus, "message::step-done", (GCallback) msg_step_done,
+// pipeline);
+ g_signal_connect (bus, "message::step-start", (GCallback) msg_step_done,
+ pipeline);
+ g_signal_connect (bus, "sync-message::step-done",
+ (GCallback) msg_sync_step_done, pipeline);
+
+ gst_object_unref (bus);
+}
+
+/* Return GList of paths described in location string */
+static GList *
+handle_wildcards (const gchar * location)
+{
+ GList *res = NULL;
+ gchar *path = g_path_get_dirname (location);
+ gchar *pattern = g_path_get_basename (location);
+ GPatternSpec *pspec = g_pattern_spec_new (pattern);
+ GDir *dir = g_dir_open (path, 0, NULL);
+ const gchar *name;
+
+ g_print ("matching %s from %s\n", pattern, path);
+
+ if (!dir) {
+ g_print ("opening directory %s failed\n", path);
+ goto out;
+ }
+
+ while ((name = g_dir_read_name (dir)) != NULL) {
+ if (g_pattern_match_string (pspec, name)) {
+ res = g_list_append (res, g_strjoin ("/", path, name, NULL));
+ g_print (" found clip %s\n", name);
+ }
+ }
+
+ g_dir_close (dir);
+out:
+ g_pattern_spec_free (pspec);
+ g_free (pattern);
+ g_free (path);
+
+ return res;
+}
+
+static void
+delete_event_cb (void)
+{
+ stop_cb (NULL, NULL);
+ gtk_main_quit ();
+}
+
+static void
+print_usage (int argc, char **argv)
+{
+ gint i;
+
+ g_print ("usage: %s <type> <filename>\n", argv[0]);
+ g_print (" possible types:\n");
+
+ for (i = 0; i < NUM_TYPES; i++) {
+ g_print (" %d = %s\n", i, pipelines[i].name);
+ }
+}
+
+static gboolean
+read_joystick (GIOChannel * source, GIOCondition condition, gpointer user_data)
+{
+ gchar buf[sizeof (struct js_event)];
+ struct js_event *js = (struct js_event *) buf;
+ GError *err = NULL;
+ gsize bytes_read = 0;
+ GIOStatus result;
+
+ result =
+ g_io_channel_read_chars (source, buf, sizeof (struct js_event),
+ &bytes_read, &err);
+ if (err) {
+ g_print ("error reading from joystick: %s", err->message);
+ g_error_free (err);
+ return FALSE;
+ } else if (bytes_read != sizeof (struct js_event)) {
+ g_print ("error reading joystick, read %u bytes of %u\n",
+ (guint) bytes_read, (guint) sizeof (struct js_event));
+ return TRUE;
+ } else if (result != G_IO_STATUS_NORMAL) {
+ g_print ("reading from joystick returned status %d", result);
+ }
+
+ switch (js->type & ~JS_EVENT_INIT) {
+ case JS_EVENT_AXIS:
+ if (js->number == 0) {
+ gdouble new_rate = (gdouble) (js->value) / 3000;
+ g_print ("Got: %d (rate %g)\n", js->value, new_rate);
+ if (shuttling)
+ gtk_adjustment_set_value (shuttle_adjustment, new_rate);
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWidget *window, *hbox, *vbox, *panel, *expander, *pb2vbox, *boxes,
+ *flagtable, *boxes2, *step;
+ GtkWidget *play_button, *pause_button, *stop_button, *shot_button;
+ GtkWidget *accurate_checkbox, *key_checkbox, *loop_checkbox, *flush_checkbox;
+ GtkWidget *scrub_checkbox, *play_scrub_checkbox;
+ GtkWidget *rate_label, *volume_label;
+ GOptionEntry options[] = {
+ {"stats", 's', 0, G_OPTION_ARG_NONE, &stats,
+ "Show pad stats", NULL},
+ {"elem", 'e', 0, G_OPTION_ARG_NONE, &elem_seek,
+ "Seek on elements instead of pads", NULL},
+ {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+ "Verbose properties", NULL},
+ {"joystick", 'j', 0, G_OPTION_ARG_STRING, &js_device,
+ "Joystick device to use", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("- test seeking in gsteamer");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+
+ GST_DEBUG_CATEGORY_INIT (seek_debug, "seek", 0, "seek example");
+
+ if (argc != 3) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ pipeline_type = atoi (argv[1]);
+
+ if (pipeline_type < 0 || pipeline_type >= NUM_TYPES) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ pipeline_spec = argv[2];
+
+ if (js_device == NULL)
+ js_device = g_strdup ("/dev/input/js0");
+
+ js_fd = g_open (js_device, O_RDONLY, 0);
+ if (js_fd < 0) {
+ g_print ("Failed to open joystick device %s\n", js_device);
+ exit (-1);
+ }
+
+ if (g_strrstr (pipeline_spec, "*") != NULL ||
+ g_strrstr (pipeline_spec, "?") != NULL) {
+ paths = handle_wildcards (pipeline_spec);
+ } else {
+ paths = g_list_prepend (paths, g_strdup (pipeline_spec));
+ }
+
+ if (!paths) {
+ g_print ("opening %s failed\n", pipeline_spec);
+ exit (-1);
+ }
+
+ l = paths;
+
+ pipeline = pipelines[pipeline_type].func ((gchar *) l->data);
+ g_assert (pipeline);
+
+ /* initialize gui elements ... */
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ video_window = gtk_drawing_area_new ();
+ g_signal_connect (video_window, "expose-event",
+ G_CALLBACK (handle_expose_cb), NULL);
+ g_signal_connect (video_window, "realize", G_CALLBACK (realize_cb), NULL);
+ gtk_widget_set_double_buffered (video_window, FALSE);
+
+ statusbar = gtk_statusbar_new ();
+ status_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "seek");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stopped");
+ hbox = gtk_hbox_new (FALSE, 0);
+ vbox = gtk_vbox_new (FALSE, 0);
+ flagtable = gtk_table_new (4, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
+
+ /* media controls */
+ play_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY);
+ pause_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE);
+ stop_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_STOP);
+
+ /* seek flags */
+ accurate_checkbox = gtk_check_button_new_with_label ("Accurate Seek");
+ key_checkbox = gtk_check_button_new_with_label ("Key-unit Seek");
+ loop_checkbox = gtk_check_button_new_with_label ("Loop");
+ flush_checkbox = gtk_check_button_new_with_label ("Flush");
+ scrub_checkbox = gtk_check_button_new_with_label ("Scrub");
+ play_scrub_checkbox = gtk_check_button_new_with_label ("Play Scrub");
+ skip_checkbox = gtk_check_button_new_with_label ("Play Skip");
+ rate_spinbutton = gtk_spin_button_new_with_range (-100, 100, 0.1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (rate_spinbutton), 3);
+ rate_label = gtk_label_new ("Rate");
+
+ gtk_widget_set_tooltip_text (accurate_checkbox,
+ "accurate position is requested, this might be considerably slower for some formats");
+ gtk_widget_set_tooltip_text (key_checkbox,
+ "seek to the nearest keyframe. This might be faster but less accurate");
+ gtk_widget_set_tooltip_text (loop_checkbox, "loop playback");
+ gtk_widget_set_tooltip_text (flush_checkbox, "flush pipeline after seeking");
+ gtk_widget_set_tooltip_text (rate_spinbutton, "define the playback rate, "
+ "negative value trigger reverse playback");
+ gtk_widget_set_tooltip_text (scrub_checkbox, "show images while seeking");
+ gtk_widget_set_tooltip_text (play_scrub_checkbox, "play video while seeking");
+ gtk_widget_set_tooltip_text (skip_checkbox,
+ "Skip frames while playing at high frame rates");
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (flush_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scrub_checkbox), TRUE);
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (rate_spinbutton), rate);
+
+ /* step expander */
+ {
+ GtkWidget *hbox;
+
+ step = gtk_expander_new ("step options");
+ hbox = gtk_hbox_new (FALSE, 0);
+
+ format_combo = gtk_combo_box_text_new ();
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (format_combo),
+ "frames");
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (format_combo),
+ "time (ms)");
+ gtk_combo_box_set_active (GTK_COMBO_BOX (format_combo), 0);
+ gtk_box_pack_start (GTK_BOX (hbox), format_combo, FALSE, FALSE, 2);
+
+ step_amount_spinbutton = gtk_spin_button_new_with_range (1, 1000, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (step_amount_spinbutton), 0);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (step_amount_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (hbox), step_amount_spinbutton, FALSE, FALSE,
+ 2);
+
+ step_rate_spinbutton = gtk_spin_button_new_with_range (0.0, 100, 0.1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (step_rate_spinbutton), 3);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (step_rate_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (hbox), step_rate_spinbutton, FALSE, FALSE, 2);
+
+ step_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_FORWARD);
+ gtk_button_set_label (GTK_BUTTON (step_button), "Step");
+ gtk_box_pack_start (GTK_BOX (hbox), step_button, FALSE, FALSE, 2);
+
+ g_signal_connect (G_OBJECT (step_button), "clicked", G_CALLBACK (step_cb),
+ pipeline);
+
+ /* shuttle scale */
+ shuttle_checkbox = gtk_check_button_new_with_label ("Shuttle");
+ gtk_box_pack_start (GTK_BOX (hbox), shuttle_checkbox, FALSE, FALSE, 2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (shuttle_checkbox), FALSE);
+ g_signal_connect (shuttle_checkbox, "toggled", G_CALLBACK (shuttle_toggled),
+ pipeline);
+
+ shuttle_adjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -3.00, 4.0, 0.1, 1.0, 1.0));
+ shuttle_hscale = gtk_hscale_new (shuttle_adjustment);
+ gtk_scale_set_digits (GTK_SCALE (shuttle_hscale), 2);
+ gtk_scale_set_value_pos (GTK_SCALE (shuttle_hscale), GTK_POS_TOP);
+ g_signal_connect (shuttle_hscale, "value_changed",
+ G_CALLBACK (shuttle_value_changed), pipeline);
+ g_signal_connect (shuttle_hscale, "format_value",
+ G_CALLBACK (shuttle_format_value), pipeline);
+
+ gtk_box_pack_start (GTK_BOX (hbox), shuttle_hscale, TRUE, TRUE, 2);
+
+ gtk_container_add (GTK_CONTAINER (step), hbox);
+ }
+
+ /* seek bar */
+ adjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0));
+ hscale = gtk_hscale_new (adjustment);
+ gtk_scale_set_digits (GTK_SCALE (hscale), 2);
+ gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_RIGHT);
+ gtk_range_set_show_fill_level (GTK_RANGE (hscale), TRUE);
+ gtk_range_set_fill_level (GTK_RANGE (hscale), 100.0);
+
+ g_signal_connect (hscale, "button_press_event", G_CALLBACK (start_seek),
+ pipeline);
+ g_signal_connect (hscale, "button_release_event", G_CALLBACK (stop_seek),
+ pipeline);
+ g_signal_connect (hscale, "format_value", G_CALLBACK (format_value),
+ pipeline);
+
+ if (pipeline_type == 16) {
+ /* the playbin2 panel controls for the video/audio/subtitle tracks */
+ panel = gtk_hbox_new (FALSE, 0);
+ video_combo = gtk_combo_box_text_new ();
+ audio_combo = gtk_combo_box_text_new ();
+ text_combo = gtk_combo_box_text_new ();
+ gtk_widget_set_sensitive (video_combo, FALSE);
+ gtk_widget_set_sensitive (audio_combo, FALSE);
+ gtk_widget_set_sensitive (text_combo, FALSE);
+ gtk_box_pack_start (GTK_BOX (panel), video_combo, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (panel), audio_combo, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (panel), text_combo, TRUE, TRUE, 2);
+ g_signal_connect (G_OBJECT (video_combo), "changed",
+ G_CALLBACK (video_combo_cb), pipeline);
+ g_signal_connect (G_OBJECT (audio_combo), "changed",
+ G_CALLBACK (audio_combo_cb), pipeline);
+ g_signal_connect (G_OBJECT (text_combo), "changed",
+ G_CALLBACK (text_combo_cb), pipeline);
+ /* playbin2 panel for flag checkboxes and volume/mute */
+ boxes = gtk_hbox_new (FALSE, 0);
+ vis_checkbox = gtk_check_button_new_with_label ("Vis");
+ video_checkbox = gtk_check_button_new_with_label ("Video");
+ audio_checkbox = gtk_check_button_new_with_label ("Audio");
+ text_checkbox = gtk_check_button_new_with_label ("Text");
+ mute_checkbox = gtk_check_button_new_with_label ("Mute");
+ download_checkbox = gtk_check_button_new_with_label ("Download");
+ buffer_checkbox = gtk_check_button_new_with_label ("Buffer");
+ volume_label = gtk_label_new ("Volume");
+ volume_spinbutton = gtk_spin_button_new_with_range (0, 10.0, 0.1);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (boxes), video_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), audio_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), text_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), vis_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), mute_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), download_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), buffer_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), volume_label, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), volume_spinbutton, TRUE, TRUE, 2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vis_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (audio_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (video_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (text_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mute_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (download_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buffer_checkbox), FALSE);
+ g_signal_connect (G_OBJECT (vis_checkbox), "toggled",
+ G_CALLBACK (vis_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (audio_checkbox), "toggled",
+ G_CALLBACK (audio_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (video_checkbox), "toggled",
+ G_CALLBACK (video_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (text_checkbox), "toggled",
+ G_CALLBACK (text_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (mute_checkbox), "toggled",
+ G_CALLBACK (mute_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (download_checkbox), "toggled",
+ G_CALLBACK (download_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (buffer_checkbox), "toggled",
+ G_CALLBACK (buffer_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (volume_spinbutton), "value_changed",
+ G_CALLBACK (volume_spinbutton_changed_cb), pipeline);
+ /* playbin2 panel for snapshot */
+ boxes2 = gtk_hbox_new (FALSE, 0);
+ shot_button = gtk_button_new_from_stock (GTK_STOCK_SAVE);
+ gtk_widget_set_tooltip_text (shot_button,
+ "save a screenshot .png in the current directory");
+ g_signal_connect (G_OBJECT (shot_button), "clicked", G_CALLBACK (shot_cb),
+ pipeline);
+ vis_combo = gtk_combo_box_text_new ();
+ g_signal_connect (G_OBJECT (vis_combo), "changed",
+ G_CALLBACK (vis_combo_cb), pipeline);
+ gtk_widget_set_sensitive (vis_combo, FALSE);
+ gtk_box_pack_start (GTK_BOX (boxes2), shot_button, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes2), vis_combo, TRUE, TRUE, 2);
+
+ /* fill the vis combo box and the array of factories */
+ init_visualization_features ();
+ } else {
+ panel = boxes = boxes2 = NULL;
+ }
+
+ /* do the packing stuff ... */
+ gtk_window_set_default_size (GTK_WINDOW (window), 250, 96);
+ /* FIXME: can we avoid this for audio only? */
+ gtk_widget_set_size_request (GTK_WIDGET (video_window), -1,
+ DEFAULT_VIDEO_HEIGHT);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+ gtk_box_pack_start (GTK_BOX (vbox), video_window, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), flagtable, FALSE, FALSE, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), accurate_checkbox, 0, 1, 0,
+ 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), flush_checkbox, 1, 2, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), loop_checkbox, 2, 3, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), key_checkbox, 0, 1, 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), scrub_checkbox, 1, 2, 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), play_scrub_checkbox, 2, 3,
+ 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), skip_checkbox, 3, 4, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), rate_label, 4, 5, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), rate_spinbutton, 4, 5, 1,
+ 2);
+ if (panel && boxes && boxes2) {
+ expander = gtk_expander_new ("playbin2 options");
+ pb2vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), panel, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), boxes, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), boxes2, FALSE, FALSE, 2);
+ gtk_container_add (GTK_CONTAINER (expander), pb2vbox);
+ gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 2);
+ }
+ gtk_box_pack_start (GTK_BOX (vbox), step, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), hscale, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 2);
+
+ /* connect things ... */
+ g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (accurate_checkbox), "toggled",
+ G_CALLBACK (accurate_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (key_checkbox), "toggled",
+ G_CALLBACK (key_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (loop_checkbox), "toggled",
+ G_CALLBACK (loop_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (flush_checkbox), "toggled",
+ G_CALLBACK (flush_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (scrub_checkbox), "toggled",
+ G_CALLBACK (scrub_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (play_scrub_checkbox), "toggled",
+ G_CALLBACK (play_scrub_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (skip_checkbox), "toggled",
+ G_CALLBACK (skip_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (rate_spinbutton), "value_changed",
+ G_CALLBACK (rate_spinbutton_changed_cb), pipeline);
+
+ g_signal_connect (G_OBJECT (window), "delete-event", delete_event_cb, NULL);
+
+ /* show the gui. */
+ gtk_widget_show_all (window);
+
+ /* realize window now so that the video window gets created and we can
+ * obtain its XID before the pipeline is started up and the videosink
+ * asks for the XID of the window to render onto */
+ gtk_widget_realize (window);
+
+ /* we should have the XID now */
+ g_assert (embed_xid != 0);
+
+ if (verbose) {
+ g_signal_connect (pipeline, "deep_notify",
+ G_CALLBACK (gst_object_default_deep_notify), NULL);
+ }
+
+ {
+ GIOChannel *js_watch = g_io_channel_unix_new (js_fd);
+ g_io_channel_set_encoding (js_watch, NULL, NULL);
+ g_io_add_watch (js_watch, G_IO_IN, read_joystick, NULL);
+ }
+
+ connect_bus_signals (pipeline);
+ gtk_main ();
+
+ g_print ("NULL pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ g_print ("free pipeline\n");
+ gst_object_unref (pipeline);
+
+ g_list_foreach (paths, (GFunc) g_free, NULL);
+ g_list_free (paths);
+
+ return 0;
+}
diff --git a/tests/examples/seek/scrubby.c b/tests/examples/seek/scrubby.c
new file mode 100644
index 0000000..f399cb4
--- /dev/null
+++ b/tests/examples/seek/scrubby.c
@@ -0,0 +1,563 @@
+#include <stdlib.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (scrubby_debug);
+#define GST_CAT_DEFAULT (scrubby_debug)
+
+static GstElement *pipeline;
+static gint64 position;
+static gint64 duration;
+static GtkAdjustment *adjustment;
+static GtkWidget *hscale;
+static GtkAdjustment *sadjustment;
+static GtkWidget *shscale;
+static gboolean verbose = FALSE;
+
+static guint bus_watch = 0;
+static guint update_id = 0;
+static guint changed_id = 0;
+static guint schanged_id = 0;
+
+#define SOURCE "filesrc"
+#define ASINK "alsasink"
+//#define ASINK "osssink"
+#define VSINK "xvimagesink"
+//#define VSINK "ximagesink"
+//#define VSINK "aasink"
+//#define VSINK "cacasink"
+
+#define RANGE_PREC 10000
+#define SEGMENT_LEN 100
+#define UPDATE_INTERVAL 500
+
+static gdouble prev_range = -1.0;
+static GstClockTime prev_time = GST_CLOCK_TIME_NONE;
+static gdouble cur_range;
+static GstClockTime cur_time;
+static GstClockTimeDiff diff;
+static gdouble cur_speed = 1.0;
+
+typedef struct
+{
+ const gchar *padname;
+ GstPad *target;
+ GstElement *bin;
+}
+dyn_link;
+
+static GstElement *
+gst_element_factory_make_or_warn (const gchar * type, const gchar * name)
+{
+ GstElement *element = gst_element_factory_make (type, name);
+
+ if (!element) {
+ g_warning ("Failed to create element %s of type %s", name, type);
+ }
+
+ return element;
+}
+
+static void
+dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
+{
+ dyn_link *connect = (dyn_link *) data;
+
+ if (connect->padname == NULL ||
+ !strcmp (gst_pad_get_name (newpad), connect->padname)) {
+ if (connect->bin)
+ gst_bin_add (GST_BIN (pipeline), connect->bin);
+ gst_pad_link (newpad, connect->target);
+ }
+}
+
+static void
+setup_dynamic_link (GstElement * element, const gchar * padname,
+ GstPad * target, GstElement * bin)
+{
+ dyn_link *connect;
+
+ connect = g_new0 (dyn_link, 1);
+ connect->padname = g_strdup (padname);
+ connect->target = target;
+ connect->bin = bin;
+
+ g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link),
+ connect);
+}
+
+static GstElement *
+make_wav_pipeline (const gchar * location)
+{
+ GstElement *pipeline;
+ GstElement *src, *decoder, *audiosink;
+
+ pipeline = gst_pipeline_new ("app");
+
+ src = gst_element_factory_make_or_warn (SOURCE, "src");
+ decoder = gst_element_factory_make_or_warn ("wavparse", "decoder");
+ audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
+
+ g_object_set (G_OBJECT (src), "location", location, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+ gst_bin_add (GST_BIN (pipeline), audiosink);
+
+ gst_element_link (src, decoder);
+
+ setup_dynamic_link (decoder, "src", gst_element_get_static_pad (audiosink,
+ "sink"), NULL);
+
+ return pipeline;
+}
+
+static GstElement *
+make_playerbin_pipeline (const gchar * location)
+{
+ GstElement *player;
+
+ player = gst_element_factory_make ("playbin", "player");
+ g_assert (player);
+
+ g_object_set (G_OBJECT (player), "uri", location, NULL);
+
+ return player;
+}
+
+static gchar *
+format_value (GtkScale * scale, gdouble value)
+{
+ gint64 real;
+ gint64 seconds;
+ gint64 subseconds;
+
+ real = value * duration / RANGE_PREC;
+ seconds = (gint64) real / GST_SECOND;
+ subseconds = (gint64) real / (GST_SECOND / RANGE_PREC);
+
+ return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
+ G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
+}
+
+static gboolean
+update_scale (gpointer data)
+{
+ position = 0;
+ duration = 0;
+
+ gst_element_query_position (pipeline, GST_FORMAT_TIME, &position);
+ gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration);
+
+ if (position >= duration)
+ duration = position;
+
+ if (duration > 0) {
+ gtk_adjustment_set_value (adjustment,
+ position * (gdouble) RANGE_PREC / duration);
+ gtk_widget_queue_draw (hscale);
+ }
+
+ return TRUE;
+}
+
+static void
+speed_cb (GtkWidget * widget)
+{
+ GstEvent *s_event;
+ gboolean res;
+
+ GST_DEBUG ("speed change");
+ cur_speed = gtk_range_get_value (GTK_RANGE (widget));
+
+ if (cur_speed == 0.0)
+ return;
+
+ s_event = gst_event_new_seek (cur_speed,
+ GST_FORMAT_TIME, 0, GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1);
+
+ res = gst_element_send_event (pipeline, s_event);
+ if (!res)
+ g_print ("speed change failed\n");
+}
+
+static gboolean do_seek (GtkWidget * widget, gboolean flush, gboolean segment);
+
+static void
+seek_cb (GtkWidget * widget)
+{
+ if (changed_id) {
+ GST_DEBUG ("seek because of slider move");
+
+ if (do_seek (widget, TRUE, TRUE)) {
+ g_source_remove (changed_id);
+ changed_id = 0;
+ }
+ }
+}
+
+static gboolean
+do_seek (GtkWidget * widget, gboolean flush, gboolean segment)
+{
+ gint64 start, stop;
+ gboolean res = FALSE;
+ GstEvent *s_event;
+ gdouble rate;
+ GTimeVal tv;
+ gboolean valid;
+ gdouble new_range;
+
+ if (segment)
+ new_range = gtk_range_get_value (GTK_RANGE (widget));
+ else {
+ new_range = (gdouble) RANGE_PREC;
+ cur_time = -1;
+ }
+
+ valid = prev_time != -1;
+
+ GST_DEBUG ("flush %d, segment %d, valid %d", flush, segment, valid);
+
+ if (new_range == cur_range)
+ return FALSE;
+
+ prev_time = cur_time;
+ prev_range = cur_range;
+
+ cur_range = new_range;
+
+ g_get_current_time (&tv);
+ cur_time = GST_TIMEVAL_TO_TIME (tv);
+
+ if (!valid)
+ return FALSE;
+
+ GST_DEBUG ("cur: %lf, %" GST_TIME_FORMAT, cur_range,
+ GST_TIME_ARGS (cur_time));
+ GST_DEBUG ("prev: %lf, %" GST_TIME_FORMAT, prev_range,
+ GST_TIME_ARGS (prev_time));
+
+ diff = cur_time - prev_time;
+
+ GST_DEBUG ("diff: %" GST_TIME_FORMAT, GST_TIME_ARGS (diff));
+
+ start = prev_range * duration / RANGE_PREC;
+ /* play 50 milliseconds */
+ stop = segment ? cur_range * duration / RANGE_PREC : duration;
+
+ if (start == stop)
+ return FALSE;
+
+ if (segment)
+ rate = (stop - start) / (gdouble) diff;
+ else
+ rate = cur_speed;
+
+ if (start > stop) {
+ gint64 tmp;
+
+ tmp = start;
+ start = stop;
+ stop = tmp;
+ }
+
+ if (rate == 0.0)
+ return TRUE;
+
+ GST_DEBUG ("seek to %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT ", rate %lf"
+ " on element %s",
+ GST_TIME_ARGS (start), GST_TIME_ARGS (stop), rate,
+ GST_ELEMENT_NAME (pipeline));
+
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME,
+ (flush ? GST_SEEK_FLAG_FLUSH : 0) |
+ (segment ? GST_SEEK_FLAG_SEGMENT : 0),
+ GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop);
+
+ res = gst_element_send_event (pipeline, s_event);
+ if (!res)
+ g_print ("seek failed\n");
+
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ return TRUE;
+}
+
+static gboolean
+start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
+{
+ if (update_id) {
+ g_source_remove (update_id);
+ update_id = 0;
+ }
+
+ if (changed_id == 0) {
+ changed_id =
+ g_signal_connect (hscale, "value_changed", G_CALLBACK (seek_cb),
+ pipeline);
+ }
+
+ GST_DEBUG ("start seek");
+
+ return FALSE;
+}
+
+static gboolean
+stop_seek (GtkWidget * widget, gpointer user_data)
+{
+ update_id =
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, pipeline);
+
+ GST_DEBUG ("stop seek");
+
+ if (changed_id) {
+ g_source_remove (changed_id);
+ changed_id = 0;
+ }
+
+ do_seek (hscale, FALSE, FALSE);
+
+ return FALSE;
+}
+
+static void
+play_cb (GtkButton * button, gpointer data)
+{
+ GstState state;
+
+ gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
+ if (state != GST_STATE_PLAYING) {
+ g_print ("PLAY pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ update_id =
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, pipeline);
+ }
+}
+
+static void
+pause_cb (GtkButton * button, gpointer data)
+{
+ GstState state;
+
+ gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
+ if (state != GST_STATE_PAUSED) {
+ g_print ("PAUSE pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ g_source_remove (update_id);
+ }
+}
+
+static void
+stop_cb (GtkButton * button, gpointer data)
+{
+ GstState state;
+
+ gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
+ if (state != GST_STATE_READY) {
+ g_print ("READY pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ /* position and speed return to their default values */
+ gtk_adjustment_set_value (adjustment, 0.0);
+ gtk_adjustment_set_value (sadjustment, 1.0);
+ g_source_remove (update_id);
+ }
+}
+
+static void
+print_message (GstMessage * message)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("Got Message from element \"%s\"\n",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
+
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ }
+}
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, gpointer data)
+{
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_EOS:
+ g_print ("EOS\n");
+ break;
+ case GST_MESSAGE_ERROR:
+ case GST_MESSAGE_WARNING:
+ print_message (message);
+ break;
+ case GST_MESSAGE_SEGMENT_START:
+ break;
+ case GST_MESSAGE_SEGMENT_DONE:
+ GST_DEBUG ("segment_done, doing next seek");
+ if (!do_seek (hscale, FALSE, update_id == 0)) {
+ if (changed_id == 0) {
+ changed_id =
+ g_signal_connect (hscale, "value_changed", G_CALLBACK (seek_cb),
+ pipeline);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+typedef struct
+{
+ const gchar *name;
+ GstElement *(*func) (const gchar * location);
+}
+Pipeline;
+
+static Pipeline pipelines[] = {
+ {"wav", make_wav_pipeline},
+ {"playerbin", make_playerbin_pipeline},
+ {NULL, NULL},
+};
+
+#define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1)
+
+static void
+print_usage (int argc, char **argv)
+{
+ gint i;
+
+ g_print ("usage: %s <type> <filename>\n", argv[0]);
+ g_print (" possible types:\n");
+
+ for (i = 0; i < NUM_TYPES; i++) {
+ g_print (" %d = %s\n", i, pipelines[i].name);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWidget *window, *hbox, *vbox, *play_button, *pause_button, *stop_button;
+ GstBus *bus;
+ GOptionEntry options[] = {
+ {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+ "Verbose properties", NULL},
+ {NULL}
+ };
+ gint type;
+ GOptionContext *ctx;
+ GError *err = NULL;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("seek");
+ 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);
+ }
+
+ GST_DEBUG_CATEGORY_INIT (scrubby_debug, "scrubby", 0, "scrubby example");
+
+ gtk_init (&argc, &argv);
+
+ if (argc != 3) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ type = atoi (argv[1]);
+
+ if (type < 0 || type >= NUM_TYPES) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ pipeline = pipelines[type].func (argv[2]);
+ g_assert (pipeline);
+
+ /* initialize gui elements ... */
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ hbox = gtk_hbox_new (FALSE, 0);
+ vbox = gtk_vbox_new (FALSE, 0);
+ play_button = gtk_button_new_with_label ("play");
+ pause_button = gtk_button_new_with_label ("pause");
+ stop_button = gtk_button_new_with_label ("stop");
+
+ adjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, (gdouble) RANGE_PREC, 0.1,
+ 1.0, 1.0));
+ hscale = gtk_hscale_new (adjustment);
+ gtk_scale_set_digits (GTK_SCALE (hscale), 2);
+
+ sadjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 0.0, 5.0, 0.1, 1.0, 0.0));
+ shscale = gtk_hscale_new (sadjustment);
+ gtk_scale_set_digits (GTK_SCALE (shscale), 2);
+
+ schanged_id =
+ g_signal_connect (shscale, "value_changed", G_CALLBACK (speed_cb),
+ pipeline);
+
+ g_signal_connect (hscale, "button_press_event", G_CALLBACK (start_seek),
+ pipeline);
+ g_signal_connect (hscale, "button_release_event", G_CALLBACK (stop_seek),
+ pipeline);
+ g_signal_connect (hscale, "format_value", G_CALLBACK (format_value),
+ pipeline);
+
+ /* do the packing stuff ... */
+ gtk_window_set_default_size (GTK_WINDOW (window), 96, 96);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+ gtk_container_add (GTK_CONTAINER (vbox), hbox);
+ gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), shscale, TRUE, TRUE, 2);
+
+ /* connect things ... */
+ g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL);
+
+ /* show the gui. */
+ gtk_widget_show_all (window);
+
+ if (verbose) {
+ g_signal_connect (pipeline, "deep_notify",
+ G_CALLBACK (gst_object_default_deep_notify), NULL);
+ }
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ g_assert (bus);
+
+ bus_watch = gst_bus_add_watch_full (bus,
+ G_PRIORITY_HIGH, bus_message, pipeline, NULL);
+
+ gtk_main ();
+
+ g_print ("NULL pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ g_print ("free pipeline\n");
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/seek/seek.c b/tests/examples/seek/seek.c
new file mode 100644
index 0000000..4f73aaf
--- /dev/null
+++ b/tests/examples/seek/seek.c
@@ -0,0 +1,2167 @@
+/* GStreamer
+ *
+ * seek.c: seeking sample application
+ *
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ * 2006 Stefan Kost <ensonic@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <math.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+#include <string.h>
+
+#include <gdk/gdk.h>
+#if defined (GDK_WINDOWING_X11)
+#include <gdk/gdkx.h>
+#elif defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#endif
+
+#include <gst/interfaces/videooverlay.h>
+
+#if (!GTK_CHECK_VERSION(2, 23, 0) || GTK_CHECK_VERSION(2, 90, 0)) && !GTK_CHECK_VERSION(2, 91, 1)
+#define gtk_combo_box_text_new gtk_combo_box_new_text
+#define gtk_combo_box_text_append_text gtk_combo_box_append_text
+#define gtk_combo_box_text_remove gtk_combo_box_remove_text
+#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (seek_debug);
+#define GST_CAT_DEFAULT (seek_debug)
+
+#if !GTK_CHECK_VERSION (2, 17, 7)
+static void
+gtk_widget_get_allocation (GtkWidget * w, GtkAllocation * a)
+{
+ *a = w->allocation;
+}
+#endif
+
+/* configuration */
+
+#define SOURCE "filesrc"
+
+static gchar *opt_audiosink_str; /* NULL */
+static gchar *opt_videosink_str; /* NULL */
+
+#define FILL_INTERVAL 100
+//#define UPDATE_INTERVAL 500
+//#define UPDATE_INTERVAL 100
+#define UPDATE_INTERVAL 40
+
+/* number of milliseconds to play for after a seek */
+#define SCRUB_TIME 100
+
+/* timeout for gst_element_get_state() after a seek */
+#define SEEK_TIMEOUT 40 * GST_MSECOND
+
+#define DEFAULT_VIDEO_HEIGHT 300
+
+/* the state to go to when stop is pressed */
+#define STOP_STATE GST_STATE_READY
+
+#define N_GRAD 1000.0
+
+static GList *seekable_elements = NULL;
+
+static gboolean accurate_seek = FALSE;
+static gboolean keyframe_seek = FALSE;
+static gboolean loop_seek = FALSE;
+static gboolean flush_seek = TRUE;
+static gboolean scrub = TRUE;
+static gboolean play_scrub = FALSE;
+static gboolean skip_seek = FALSE;
+static gdouble rate = 1.0;
+
+static GstElement *pipeline;
+static gint pipeline_type;
+static const gchar *pipeline_spec;
+static gint64 position = -1;
+static gint64 duration = -1;
+static GtkAdjustment *adjustment;
+static GtkWidget *hscale, *statusbar;
+static guint status_id = 0;
+static gboolean stats = FALSE;
+static gboolean verbose = FALSE;
+
+static gboolean is_live = FALSE;
+static gboolean buffering = FALSE;
+static GstBufferingMode mode;
+static gint64 buffering_left;
+static GstState state = GST_STATE_NULL;
+static guint update_id = 0;
+static guint seek_timeout_id = 0;
+static gulong changed_id;
+static guint fill_id = 0;
+
+static gint n_video = 0, n_audio = 0, n_text = 0;
+static gboolean need_streams = TRUE;
+static GtkWidget *video_combo, *audio_combo, *text_combo, *vis_combo;
+static GtkWidget *vis_checkbox, *video_checkbox, *audio_checkbox;
+static GtkWidget *text_checkbox, *mute_checkbox, *volume_spinbutton;
+static GtkWidget *skip_checkbox, *video_window, *download_checkbox;
+static GtkWidget *buffer_checkbox, *rate_spinbutton;
+
+static GStaticMutex state_mutex = G_STATIC_MUTEX_INIT;
+
+static GtkWidget *format_combo, *step_amount_spinbutton, *step_rate_spinbutton;
+static GtkWidget *shuttle_checkbox, *step_button;
+static GtkWidget *shuttle_hscale;
+static GtkAdjustment *shuttle_adjustment;
+
+static GList *paths = NULL, *l = NULL;
+
+/* we keep an array of the visualisation entries so that we can easily switch
+ * with the combo box index. */
+typedef struct
+{
+ GstElementFactory *factory;
+} VisEntry;
+
+static GArray *vis_entries;
+
+static void clear_streams (GstElement * pipeline);
+static void volume_notify_cb (GstElement * pipeline, GParamSpec * arg,
+ gpointer user_dat);
+
+/* pipeline construction */
+
+typedef struct
+{
+ const gchar *padname;
+ GstPad *target;
+ GstElement *bin;
+}
+dyn_link;
+
+static GstElement *
+gst_element_factory_make_or_warn (const gchar * type, const gchar * name)
+{
+ GstElement *element = gst_element_factory_make (type, name);
+
+#ifndef GST_DISABLE_PARSE
+ if (!element) {
+ /* Try parsing it as a pipeline description */
+ element = gst_parse_bin_from_description (type, TRUE, NULL);
+ if (element) {
+ gst_element_set_name (element, name);
+ }
+ }
+#endif
+
+ if (!element) {
+ g_warning ("Failed to create element %s of type %s", name, type);
+ }
+
+ return element;
+}
+
+static void
+playerbin_set_uri (GstElement * player, const gchar * location)
+{
+ gchar *uri;
+
+ /* Add "file://" prefix for convenience */
+ if (g_str_has_prefix (location, "/") || !gst_uri_is_valid (location)) {
+ uri = gst_filename_to_uri (location, NULL);
+ g_print ("Setting URI: %s\n", uri);
+ g_object_set (G_OBJECT (player), "uri", uri, NULL);
+ g_free (uri);
+ } else {
+ g_print ("Setting URI: %s\n", location);
+ g_object_set (G_OBJECT (player), "uri", location, NULL);
+ }
+}
+
+static GstElement *
+construct_playbin (const gchar * name, const gchar * location)
+{
+ GstElement *player;
+ GstElement *avsink;
+
+ player = gst_element_factory_make (name, "player");
+ g_assert (player);
+
+ playerbin_set_uri (player, location);
+
+ seekable_elements = g_list_prepend (seekable_elements, player);
+
+ avsink = gst_element_factory_make_or_warn (opt_audiosink_str, "a_sink");
+ if (avsink)
+ g_object_set (player, "audio-sink", avsink, NULL);
+
+ avsink = gst_element_factory_make_or_warn (opt_videosink_str, "v_sink");
+ if (avsink)
+ g_object_set (player, "video-sink", avsink, NULL);
+
+ return player;
+}
+
+static GstElement *
+make_playbin_pipeline (const gchar * location)
+{
+ GstElement *pipeline = construct_playbin ("playbin", location);
+
+ /* FIXME: this is not triggered, playbin is not forwarding it from the sink */
+ g_signal_connect (pipeline, "notify::volume", G_CALLBACK (volume_notify_cb),
+ NULL);
+ return pipeline;
+}
+
+#ifndef GST_DISABLE_PARSE
+static GstElement *
+make_parselaunch_pipeline (const gchar * description)
+{
+ GstElement *pipeline;
+ GError *error = NULL;
+
+ pipeline = gst_parse_launch (description, &error);
+
+ seekable_elements = g_list_prepend (seekable_elements, pipeline);
+
+ return pipeline;
+}
+#endif
+
+typedef struct
+{
+ const gchar *name;
+ GstElement *(*func) (const gchar * location);
+}
+Pipeline;
+
+static Pipeline pipelines[] = {
+ {"playbin", make_playbin_pipeline},
+#ifndef GST_DISABLE_PARSE
+ {"parse-launch", make_parselaunch_pipeline},
+#endif
+ {NULL, NULL},
+};
+
+#define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1)
+
+/* ui callbacks and helpers */
+
+static gchar *
+format_value (GtkScale * scale, gdouble value)
+{
+ gint64 real;
+ gint64 seconds;
+ gint64 subseconds;
+
+ real = value * duration / N_GRAD;
+ seconds = (gint64) real / GST_SECOND;
+ subseconds = (gint64) real / (GST_SECOND / N_GRAD);
+
+ return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
+ G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
+}
+
+
+static gchar *
+shuttle_format_value (GtkScale * scale, gdouble value)
+{
+ return g_strdup_printf ("%0.*g", gtk_scale_get_digits (scale), value);
+}
+
+typedef struct
+{
+ const gchar *name;
+ const GstFormat format;
+}
+seek_format;
+
+static seek_format seek_formats[] = {
+ {"tim", GST_FORMAT_TIME},
+ {"byt", GST_FORMAT_BYTES},
+ {"buf", GST_FORMAT_BUFFERS},
+ {"def", GST_FORMAT_DEFAULT},
+ {NULL, 0},
+};
+
+G_GNUC_UNUSED static void
+query_positions_elems (void)
+{
+ GList *walk = seekable_elements;
+
+ while (walk) {
+ GstElement *element = GST_ELEMENT (walk->data);
+ gint i = 0;
+
+ g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
+ while (seek_formats[i].name) {
+ gint64 position, total;
+ GstFormat format;
+
+ format = seek_formats[i].format;
+
+ if (gst_element_query_position (element, format, &position) &&
+ gst_element_query_duration (element, format, &total)) {
+ g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ",
+ seek_formats[i].name, position, total);
+ } else {
+ g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*",
+ "*NA*");
+ }
+ i++;
+ }
+ g_print (" %s\n", GST_ELEMENT_NAME (element));
+
+ walk = g_list_next (walk);
+ }
+}
+
+static gboolean start_seek (GtkWidget * widget, GdkEventButton * event,
+ gpointer user_data);
+static gboolean stop_seek (GtkWidget * widget, GdkEventButton * event,
+ gpointer user_data);
+static void seek_cb (GtkWidget * widget);
+
+static void
+set_scale (gdouble value)
+{
+ g_signal_handlers_block_by_func (hscale, (void *) start_seek,
+ (void *) pipeline);
+ g_signal_handlers_block_by_func (hscale, (void *) stop_seek,
+ (void *) pipeline);
+ g_signal_handlers_block_by_func (hscale, (void *) seek_cb, (void *) pipeline);
+ gtk_adjustment_set_value (adjustment, value);
+ g_signal_handlers_unblock_by_func (hscale, (void *) start_seek,
+ (void *) pipeline);
+ g_signal_handlers_unblock_by_func (hscale, (void *) stop_seek,
+ (void *) pipeline);
+ g_signal_handlers_unblock_by_func (hscale, (void *) seek_cb,
+ (void *) pipeline);
+ gtk_widget_queue_draw (hscale);
+}
+
+static gboolean
+update_fill (gpointer data)
+{
+ if (seekable_elements) {
+ GstElement *element = GST_ELEMENT (seekable_elements->data);
+ GstQuery *query;
+
+ query = gst_query_new_buffering (GST_FORMAT_PERCENT);
+ if (gst_element_query (element, query)) {
+ gint64 start, stop, buffering_total;
+ GstFormat format;
+ gdouble fill;
+ gboolean busy;
+ gint percent;
+ GstBufferingMode mode;
+ gint avg_in, avg_out;
+ gint64 buffering_left;
+
+ gst_query_parse_buffering_percent (query, &busy, &percent);
+ gst_query_parse_buffering_range (query, &format, &start, &stop,
+ &buffering_total);
+ gst_query_parse_buffering_stats (query, &mode, &avg_in, &avg_out,
+ &buffering_left);
+
+ /* note that we could start the playback when buffering_left < remaining
+ * playback time */
+ GST_DEBUG ("buffering total %" G_GINT64_FORMAT " ms, left %"
+ G_GINT64_FORMAT " ms", buffering_total, buffering_left);
+ GST_DEBUG ("start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT,
+ start, stop);
+
+ if (stop != -1)
+ fill = N_GRAD * stop / GST_FORMAT_PERCENT_MAX;
+ else
+ fill = N_GRAD;
+
+ gtk_range_set_fill_level (GTK_RANGE (hscale), fill);
+ }
+ gst_query_unref (query);
+ }
+ return TRUE;
+}
+
+static gboolean
+update_scale (gpointer data)
+{
+ if (seekable_elements) {
+ GstElement *element = GST_ELEMENT (seekable_elements->data);
+
+ gst_element_query_position (element, GST_FORMAT_TIME, &position);
+ gst_element_query_duration (element, GST_FORMAT_TIME, &duration);
+ }
+
+ if (stats) {
+ query_positions_elems ();
+ }
+
+ if (position >= duration)
+ duration = position;
+
+ if (duration > 0) {
+ set_scale (position * N_GRAD / duration);
+ }
+
+ /* FIXME: see make_playerbin2_pipeline() and volume_notify_cb() */
+ if (pipeline_type == 16) {
+ g_object_notify (G_OBJECT (pipeline), "volume");
+ }
+
+ return TRUE;
+}
+
+static void do_seek (GtkWidget * widget);
+static void connect_bus_signals (GstElement * pipeline);
+static void set_update_scale (gboolean active);
+static void set_update_fill (gboolean active);
+
+static gboolean
+end_scrub (GtkWidget * widget)
+{
+ GST_DEBUG ("end scrub, PAUSE");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ seek_timeout_id = 0;
+
+ return FALSE;
+}
+
+static gboolean
+send_event (GstEvent * event)
+{
+ gboolean res = FALSE;
+ GList *walk = seekable_elements;
+
+ while (walk) {
+ GstElement *seekable = GST_ELEMENT (walk->data);
+
+ GST_DEBUG ("send event on element %s", GST_ELEMENT_NAME (seekable));
+
+ gst_event_ref (event);
+ res = gst_element_send_event (seekable, event);
+
+ walk = g_list_next (walk);
+ }
+ gst_event_unref (event);
+ return res;
+}
+
+static void
+do_seek (GtkWidget * widget)
+{
+ gint64 real;
+ gboolean res = FALSE;
+ GstEvent *s_event;
+ GstSeekFlags flags;
+
+ real = gtk_range_get_value (GTK_RANGE (widget)) * duration / N_GRAD;
+
+ GST_DEBUG ("value=%f, real=%" G_GINT64_FORMAT,
+ gtk_range_get_value (GTK_RANGE (widget)), real);
+
+ flags = 0;
+ if (flush_seek)
+ flags |= GST_SEEK_FLAG_FLUSH;
+ if (accurate_seek)
+ flags |= GST_SEEK_FLAG_ACCURATE;
+ if (keyframe_seek)
+ flags |= GST_SEEK_FLAG_KEY_UNIT;
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ if (rate >= 0) {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, real, GST_SEEK_TYPE_SET,
+ GST_CLOCK_TIME_NONE);
+ GST_DEBUG ("seek with rate %lf to %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (real), GST_TIME_ARGS (duration));
+ } else {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, real);
+ GST_DEBUG ("seek with rate %lf to %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (0), GST_TIME_ARGS (real));
+ }
+
+ res = send_event (s_event);
+
+ if (res) {
+ if (flush_seek) {
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, SEEK_TIMEOUT);
+ } else {
+ set_update_scale (TRUE);
+ }
+ } else {
+ g_print ("seek failed\n");
+ set_update_scale (TRUE);
+ }
+}
+
+static void
+seek_cb (GtkWidget * widget)
+{
+ /* If the timer hasn't expired yet, then the pipeline is running */
+ if (play_scrub && seek_timeout_id != 0) {
+ GST_DEBUG ("do scrub seek, PAUSED");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+
+ GST_DEBUG ("do seek");
+ do_seek (widget);
+
+ if (play_scrub) {
+ GST_DEBUG ("do scrub seek, PLAYING");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ if (seek_timeout_id == 0) {
+ seek_timeout_id =
+ g_timeout_add (SCRUB_TIME, (GSourceFunc) end_scrub, widget);
+ }
+ }
+}
+
+static void
+set_update_fill (gboolean active)
+{
+ GST_DEBUG ("fill scale is %d", active);
+
+ if (active) {
+ if (fill_id == 0) {
+ fill_id =
+ g_timeout_add (FILL_INTERVAL, (GSourceFunc) update_fill, pipeline);
+ }
+ } else {
+ if (fill_id) {
+ g_source_remove (fill_id);
+ fill_id = 0;
+ }
+ }
+}
+
+static void
+set_update_scale (gboolean active)
+{
+
+ GST_DEBUG ("update scale is %d", active);
+
+ if (active) {
+ if (update_id == 0) {
+ update_id =
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, pipeline);
+ }
+ } else {
+ if (update_id) {
+ g_source_remove (update_id);
+ update_id = 0;
+ }
+ }
+}
+
+static gboolean
+start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
+{
+ if (event->type != GDK_BUTTON_PRESS)
+ return FALSE;
+
+ set_update_scale (FALSE);
+
+ if (state == GST_STATE_PLAYING && flush_seek && scrub) {
+ GST_DEBUG ("start scrub seek, PAUSE");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+
+ if (changed_id == 0 && flush_seek && scrub) {
+ changed_id =
+ g_signal_connect (hscale, "value_changed", G_CALLBACK (seek_cb),
+ pipeline);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
+{
+ if (changed_id) {
+ g_signal_handler_disconnect (hscale, changed_id);
+ changed_id = 0;
+ }
+
+ if (!flush_seek || !scrub) {
+ GST_DEBUG ("do final seek");
+ do_seek (widget);
+ }
+
+ if (seek_timeout_id != 0) {
+ g_source_remove (seek_timeout_id);
+ seek_timeout_id = 0;
+ /* Still scrubbing, so the pipeline is playing, see if we need PAUSED
+ * instead. */
+ if (state == GST_STATE_PAUSED) {
+ GST_DEBUG ("stop scrub seek, PAUSED");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ } else {
+ if (state == GST_STATE_PLAYING) {
+ GST_DEBUG ("stop scrub seek, PLAYING");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+play_cb (GtkButton * button, gpointer data)
+{
+ GstStateChangeReturn ret;
+
+ if (state != GST_STATE_PLAYING) {
+ g_print ("PLAY pipeline\n");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ goto failed;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+ default:
+ break;
+ }
+ state = GST_STATE_PLAYING;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Playing");
+ }
+
+ return;
+
+failed:
+ {
+ g_print ("PLAY failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Play failed");
+ }
+}
+
+static void
+pause_cb (GtkButton * button, gpointer data)
+{
+ g_static_mutex_lock (&state_mutex);
+ if (state != GST_STATE_PAUSED) {
+ GstStateChangeReturn ret;
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ g_print ("PAUSE pipeline\n");
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ goto failed;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+ default:
+ break;
+ }
+
+ state = GST_STATE_PAUSED;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Paused");
+ }
+ g_static_mutex_unlock (&state_mutex);
+
+ return;
+
+failed:
+ {
+ g_static_mutex_unlock (&state_mutex);
+ g_print ("PAUSE failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Pause failed");
+ }
+}
+
+static void
+stop_cb (GtkButton * button, gpointer data)
+{
+ if (state != STOP_STATE) {
+ GstStateChangeReturn ret;
+
+ g_print ("READY pipeline\n");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+
+ g_static_mutex_lock (&state_mutex);
+ ret = gst_element_set_state (pipeline, STOP_STATE);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto failed;
+
+ state = STOP_STATE;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stopped");
+
+ is_live = FALSE;
+ buffering = FALSE;
+ set_update_scale (FALSE);
+ set_scale (0.0);
+ set_update_fill (FALSE);
+
+ if (pipeline_type == 16)
+ clear_streams (pipeline);
+ g_static_mutex_unlock (&state_mutex);
+
+#if 0
+ /* if one uses parse_launch, play, stop and play again it fails as all the
+ * pads after the demuxer can't be reconnected
+ */
+ if (!strcmp (pipelines[pipeline_type].name, "parse-launch")) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ g_list_free (seekable_elements);
+ seekable_elements = NULL;
+
+ pipeline = pipelines[pipeline_type].func (pipeline_spec);
+ g_assert (pipeline);
+ gst_element_set_state (pipeline, STOP_STATE);
+ connect_bus_signals (pipeline);
+ }
+#endif
+ }
+ return;
+
+failed:
+ {
+ g_static_mutex_unlock (&state_mutex);
+ g_print ("STOP failed\n");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stop failed");
+ }
+}
+
+static void
+accurate_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ accurate_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+key_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ keyframe_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+loop_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ loop_seek = gtk_toggle_button_get_active (button);
+ if (state == GST_STATE_PLAYING) {
+ do_seek (hscale);
+ }
+}
+
+static void
+flush_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ flush_seek = gtk_toggle_button_get_active (button);
+}
+
+static void
+scrub_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ scrub = gtk_toggle_button_get_active (button);
+}
+
+static void
+play_scrub_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ play_scrub = gtk_toggle_button_get_active (button);
+}
+
+static void
+skip_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ skip_seek = gtk_toggle_button_get_active (button);
+ if (state == GST_STATE_PLAYING) {
+ do_seek (hscale);
+ }
+}
+
+static void
+rate_spinbutton_changed_cb (GtkSpinButton * button, GstPipeline * pipeline)
+{
+ gboolean res = FALSE;
+ GstEvent *s_event;
+ GstSeekFlags flags;
+
+ rate = gtk_spin_button_get_value (button);
+
+ GST_DEBUG ("rate changed to %lf", rate);
+
+ flags = 0;
+ if (flush_seek)
+ flags |= GST_SEEK_FLAG_FLUSH;
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (accurate_seek)
+ flags |= GST_SEEK_FLAG_ACCURATE;
+ if (keyframe_seek)
+ flags |= GST_SEEK_FLAG_KEY_UNIT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ if (rate >= 0.0) {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, position,
+ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
+ } else {
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, position);
+ }
+
+ res = send_event (s_event);
+
+ if (res) {
+ if (flush_seek) {
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, SEEK_TIMEOUT);
+ }
+ } else
+ g_print ("seek failed\n");
+}
+
+static void
+update_flag (GstPipeline * pipeline, gint num, gboolean state)
+{
+ gint flags;
+
+ g_object_get (pipeline, "flags", &flags, NULL);
+ if (state)
+ flags |= (1 << num);
+ else
+ flags &= ~(1 << num);
+ g_object_set (pipeline, "flags", flags, NULL);
+}
+
+static void
+vis_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 3, state);
+ gtk_widget_set_sensitive (vis_combo, state);
+}
+
+static void
+audio_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 1, state);
+ gtk_widget_set_sensitive (audio_combo, state);
+}
+
+static void
+video_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 0, state);
+ gtk_widget_set_sensitive (video_combo, state);
+}
+
+static void
+text_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 2, state);
+ gtk_widget_set_sensitive (text_combo, state);
+}
+
+static void
+mute_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean mute;
+
+ mute = gtk_toggle_button_get_active (button);
+ g_object_set (pipeline, "mute", mute, NULL);
+}
+
+static void
+download_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 7, state);
+}
+
+static void
+buffer_toggle_cb (GtkToggleButton * button, GstPipeline * pipeline)
+{
+ gboolean state;
+
+ state = gtk_toggle_button_get_active (button);
+ update_flag (pipeline, 8, state);
+}
+
+static void
+clear_streams (GstElement * pipeline)
+{
+ gint i;
+
+ /* remove previous info */
+ for (i = 0; i < n_video; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (video_combo), 0);
+ for (i = 0; i < n_audio; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (audio_combo), 0);
+ for (i = 0; i < n_text; i++)
+ gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (text_combo), 0);
+
+ n_audio = n_video = n_text = 0;
+ gtk_widget_set_sensitive (video_combo, FALSE);
+ gtk_widget_set_sensitive (audio_combo, FALSE);
+ gtk_widget_set_sensitive (text_combo, FALSE);
+
+ need_streams = TRUE;
+}
+
+static void
+update_streams (GstPipeline * pipeline)
+{
+ gint i;
+
+ if (pipeline_type == 16 && need_streams) {
+ GstTagList *tags;
+ gchar *name, *str;
+ gint active_idx;
+ gboolean state;
+
+ /* remove previous info */
+ clear_streams (GST_ELEMENT_CAST (pipeline));
+
+ /* here we get and update the different streams detected by playbin2 */
+ g_object_get (pipeline, "n-video", &n_video, NULL);
+ g_object_get (pipeline, "n-audio", &n_audio, NULL);
+ g_object_get (pipeline, "n-text", &n_text, NULL);
+
+ g_print ("video %d, audio %d, text %d\n", n_video, n_audio, n_text);
+
+ active_idx = 0;
+ for (i = 0; i < n_video; i++) {
+ g_signal_emit_by_name (pipeline, "get-video-tags", i, &tags);
+ if (tags) {
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("video %d: %s\n", i, str);
+ g_free (str);
+ }
+ /* find good name for the label */
+ name = g_strdup_printf ("video %d", i + 1);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (video_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (video_checkbox));
+ gtk_widget_set_sensitive (video_combo, state && n_video > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (video_combo), active_idx);
+
+ active_idx = 0;
+ for (i = 0; i < n_audio; i++) {
+ g_signal_emit_by_name (pipeline, "get-audio-tags", i, &tags);
+ if (tags) {
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("audio %d: %s\n", i, str);
+ g_free (str);
+ }
+ /* find good name for the label */
+ name = g_strdup_printf ("audio %d", i + 1);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (audio_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (audio_checkbox));
+ gtk_widget_set_sensitive (audio_combo, state && n_audio > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (audio_combo), active_idx);
+
+ active_idx = 0;
+ for (i = 0; i < n_text; i++) {
+ g_signal_emit_by_name (pipeline, "get-text-tags", i, &tags);
+
+ name = NULL;
+ if (tags) {
+ const GValue *value;
+
+ str = gst_structure_to_string ((GstStructure *) tags);
+ g_print ("text %d: %s\n", i, str);
+ g_free (str);
+
+ /* get the language code if we can */
+ value = gst_tag_list_get_value_index (tags, GST_TAG_LANGUAGE_CODE, 0);
+ if (value && G_VALUE_HOLDS_STRING (value)) {
+ name = g_strdup_printf ("text %s", g_value_get_string (value));
+ }
+ }
+ /* find good name for the label if we didn't use a tag */
+ if (name == NULL)
+ name = g_strdup_printf ("text %d", i + 1);
+
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (text_combo), name);
+ g_free (name);
+ }
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (text_checkbox));
+ gtk_widget_set_sensitive (text_combo, state && n_text > 0);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (text_combo), active_idx);
+
+ need_streams = FALSE;
+ }
+}
+
+static void
+video_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current video track %d\n", active);
+ g_object_set (pipeline, "current-video", active, NULL);
+}
+
+static void
+audio_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current audio track %d\n", active);
+ g_object_set (pipeline, "current-audio", active, NULL);
+}
+
+static void
+text_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ gint active;
+
+ active = gtk_combo_box_get_active (combo);
+
+ g_print ("setting current text track %d\n", active);
+ g_object_set (pipeline, "current-text", active, NULL);
+}
+
+static gboolean
+filter_features (GstPluginFeature * feature, gpointer data)
+{
+ GstElementFactory *f;
+
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+ f = GST_ELEMENT_FACTORY (feature);
+ if (!g_strrstr (gst_element_factory_get_klass (f), "Visualization"))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+init_visualization_features (void)
+{
+ GList *list, *walk;
+
+ vis_entries = g_array_new (FALSE, FALSE, sizeof (VisEntry));
+
+ list = gst_registry_feature_filter (gst_registry_get_default (),
+ filter_features, FALSE, NULL);
+
+ for (walk = list; walk; walk = g_list_next (walk)) {
+ VisEntry entry;
+ const gchar *name;
+
+ entry.factory = GST_ELEMENT_FACTORY (walk->data);
+ name = gst_element_factory_get_longname (entry.factory);
+
+ g_array_append_val (vis_entries, entry);
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (vis_combo), name);
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (vis_combo), 0);
+}
+
+static void
+vis_combo_cb (GtkComboBox * combo, GstPipeline * pipeline)
+{
+ guint index;
+ VisEntry *entry;
+ GstElement *element;
+
+ /* get the selected index and get the factory for this index */
+ index = gtk_combo_box_get_active (GTK_COMBO_BOX (vis_combo));
+ if (vis_entries->len > 0) {
+ entry = &g_array_index (vis_entries, VisEntry, index);
+
+ /* create an instance of the element from the factory */
+ element = gst_element_factory_create (entry->factory, NULL);
+ if (!element)
+ return;
+
+ /* set vis plugin for playbin2 */
+ g_object_set (pipeline, "vis-plugin", element, NULL);
+ }
+}
+
+static void
+volume_spinbutton_changed_cb (GtkSpinButton * button, GstPipeline * pipeline)
+{
+ gdouble volume;
+
+ volume = gtk_spin_button_get_value (button);
+
+ g_object_set (pipeline, "volume", volume, NULL);
+}
+
+static void
+volume_notify_cb (GstElement * pipeline, GParamSpec * arg, gpointer user_dat)
+{
+ gdouble cur_volume, new_volume;
+
+ if (volume_spinbutton == NULL)
+ return;
+
+ g_object_get (pipeline, "volume", &new_volume, NULL);
+ cur_volume = gtk_spin_button_get_value (GTK_SPIN_BUTTON (volume_spinbutton));
+ if (fabs (cur_volume - new_volume) > 0.001) {
+ g_signal_handlers_block_by_func (volume_spinbutton,
+ volume_spinbutton_changed_cb, pipeline);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), new_volume);
+ g_signal_handlers_unblock_by_func (volume_spinbutton,
+ volume_spinbutton_changed_cb, pipeline);
+ }
+}
+
+static void
+shot_cb (GtkButton * button, gpointer data)
+{
+ GstBuffer *buffer;
+ GstCaps *caps;
+
+ /* convert to our desired format (RGB24) */
+ caps = gst_caps_new_simple ("video/x-raw-rgb",
+ "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24,
+ /* Note: we don't ask for a specific width/height here, so that
+ * videoscale can adjust dimensions from a non-1/1 pixel aspect
+ * ratio to a 1/1 pixel-aspect-ratio */
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+ "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);
+
+ /* convert the latest frame to the requested format */
+ g_signal_emit_by_name (pipeline, "convert-frame", caps, &buffer);
+ gst_caps_unref (caps);
+
+ if (buffer) {
+ GstCaps *caps;
+ GstStructure *s;
+ gboolean res;
+ gint width, height;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+ guint8 *data;
+ gsize size;
+
+ /* get the snapshot buffer format now. We set the caps on the appsink so
+ * that it can only be an rgb buffer. The only thing we have not specified
+ * on the caps is the height, which is dependant on the pixel-aspect-ratio
+ * of the source material */
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+ /* FIXME, need to get the caps of the buffer somehow */
+ caps = NULL;
+ if (!caps) {
+ g_warning ("could not get snapshot format\n");
+ goto done;
+ }
+ s = gst_caps_get_structure (caps, 0);
+
+ /* we need to get the final caps on the buffer to get the size */
+ res = gst_structure_get_int (s, "width", &width);
+ res |= gst_structure_get_int (s, "height", &height);
+ if (!res) {
+ g_warning ("could not get snapshot dimension\n");
+ goto done;
+ }
+
+ /* create pixmap from buffer and save, gstreamer video buffers have a stride
+ * that is rounded up to the nearest multiple of 4 */
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ pixbuf = gdk_pixbuf_new_from_data (data,
+ GDK_COLORSPACE_RGB, FALSE, 8, width, height,
+ GST_ROUND_UP_4 (width * 3), NULL, NULL);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+ gst_buffer_unmap (buffer, data, size);
+
+ done:
+ gst_buffer_unref (buffer);
+ }
+}
+
+/* called when the Step button is pressed */
+static void
+step_cb (GtkButton * button, gpointer data)
+{
+ GstEvent *event;
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush, res;
+ gint active;
+
+ active = gtk_combo_box_get_active (GTK_COMBO_BOX (format_combo));
+ amount =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (step_amount_spinbutton));
+ rate = gtk_spin_button_get_value (GTK_SPIN_BUTTON (step_rate_spinbutton));
+ flush = TRUE;
+
+ switch (active) {
+ case 0:
+ format = GST_FORMAT_BUFFERS;
+ break;
+ case 1:
+ format = GST_FORMAT_TIME;
+ amount *= GST_MSECOND;
+ break;
+ default:
+ format = GST_FORMAT_UNDEFINED;
+ break;
+ }
+
+ event = gst_event_new_step (format, amount, rate, flush, FALSE);
+
+ res = send_event (event);
+
+ if (!res) {
+ g_print ("Sending step event failed\n");
+ }
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static gboolean shuttling = FALSE;
+static gdouble shuttle_rate = 0.0;
+static gdouble play_rate = 1.0;
+
+static void
+do_shuttle (GstElement * element)
+{
+ guint64 duration;
+
+ if (shuttling)
+ duration = 40 * GST_MSECOND;
+ else
+ duration = -1;
+
+ gst_element_send_event (element,
+ gst_event_new_step (GST_FORMAT_TIME, duration, shuttle_rate, FALSE,
+ FALSE));
+}
+
+static void
+msg_sync_step_done (GstBus * bus, GstMessage * message, GstElement * element)
+{
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush;
+ gboolean intermediate;
+ guint64 duration;
+ gboolean eos;
+
+ gst_message_parse_step_done (message, &format, &amount, &rate, &flush,
+ &intermediate, &duration, &eos);
+
+ if (eos) {
+ g_print ("stepped till EOS\n");
+ return;
+ }
+
+ if (g_static_mutex_trylock (&state_mutex)) {
+ if (shuttling)
+ do_shuttle (element);
+ g_static_mutex_unlock (&state_mutex);
+ } else {
+ /* ignore step messages that come while we are doing a state change */
+ g_print ("state change is busy\n");
+ }
+}
+
+static void
+shuttle_toggled (GtkToggleButton * button, GstElement * element)
+{
+ gboolean active;
+
+ active = gtk_toggle_button_get_active (button);
+
+ if (active != shuttling) {
+ shuttling = active;
+ g_print ("shuttling %s\n", shuttling ? "active" : "inactive");
+ if (active) {
+ shuttle_rate = 0.0;
+ play_rate = 1.0;
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ }
+ }
+}
+
+static void
+shuttle_rate_switch (GstElement * element)
+{
+ GstSeekFlags flags;
+ GstEvent *s_event;
+ gboolean res;
+
+ if (state == GST_STATE_PLAYING) {
+ /* pause when we need to */
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ }
+
+ if (play_rate == 1.0)
+ play_rate = -1.0;
+ else
+ play_rate = 1.0;
+
+ g_print ("rate changed to %lf %" GST_TIME_FORMAT "\n", play_rate,
+ GST_TIME_ARGS (position));
+
+ flags = GST_SEEK_FLAG_FLUSH;
+ flags |= GST_SEEK_FLAG_ACCURATE;
+
+ if (play_rate >= 0.0) {
+ s_event = gst_event_new_seek (play_rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, position,
+ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
+ } else {
+ s_event = gst_event_new_seek (play_rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, position);
+ }
+ res = send_event (s_event);
+ if (res) {
+ gst_element_get_state (element, NULL, NULL, SEEK_TIMEOUT);
+ } else {
+ g_print ("seek failed\n");
+ }
+}
+
+static void
+shuttle_value_changed (GtkRange * range, GstElement * element)
+{
+ gdouble rate;
+
+ rate = gtk_adjustment_get_value (shuttle_adjustment);
+
+ if (rate == 0.0) {
+ g_print ("rate 0.0, pause\n");
+ pause_cb (NULL, NULL);
+ gst_element_get_state (element, NULL, NULL, -1);
+ } else {
+ g_print ("rate changed %0.3g\n", rate);
+
+ if ((rate < 0.0 && play_rate > 0.0) || (rate > 0.0 && play_rate < 0.0)) {
+ shuttle_rate_switch (element);
+ }
+
+ shuttle_rate = ABS (rate);
+ if (state != GST_STATE_PLAYING) {
+ do_shuttle (element);
+ play_cb (NULL, NULL);
+ }
+ }
+}
+
+static void
+msg_async_done (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ GST_DEBUG ("async done");
+ /* when we get ASYNC_DONE we can query position, duration and other
+ * properties */
+ update_scale (pipeline);
+
+ /* update the available streams */
+ update_streams (pipeline);
+}
+
+static void
+msg_state_changed (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+
+ /* We only care about state changed on the pipeline */
+ if (s && GST_MESSAGE_SRC (message) == GST_OBJECT_CAST (pipeline)) {
+ GstState old, new, pending;
+
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+
+ /* When state of the pipeline changes to paused or playing we start updating scale */
+ if (new == GST_STATE_PLAYING) {
+ set_update_scale (TRUE);
+ } else {
+ set_update_scale (FALSE);
+ }
+ }
+}
+
+static void
+msg_segment_done (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ GstEvent *s_event;
+ GstSeekFlags flags;
+ gboolean res;
+ GstFormat format;
+
+ GST_DEBUG ("position is %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ gst_message_parse_segment_done (message, &format, &position);
+ GST_DEBUG ("end of segment at %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+
+ flags = 0;
+ /* in the segment-done callback we never flush as this would not make sense
+ * for seamless playback. */
+ if (loop_seek)
+ flags |= GST_SEEK_FLAG_SEGMENT;
+ if (skip_seek)
+ flags |= GST_SEEK_FLAG_SKIP;
+
+ s_event = gst_event_new_seek (rate,
+ GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0),
+ GST_SEEK_TYPE_SET, duration);
+
+ GST_DEBUG ("restart loop with rate %lf to 0 / %" GST_TIME_FORMAT,
+ rate, GST_TIME_ARGS (duration));
+
+ res = send_event (s_event);
+ if (!res)
+ g_print ("segment seek failed\n");
+}
+
+/* in stream buffering mode we PAUSE the pipeline until we receive a 100%
+ * message */
+static void
+do_stream_buffering (gint percent)
+{
+ gchar *bufstr;
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ bufstr = g_strdup_printf ("Buffering...%d", percent);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, bufstr);
+ g_free (bufstr);
+
+ if (percent == 100) {
+ /* a 100% message means buffering is done */
+ buffering = FALSE;
+ /* if the desired state is playing, go back */
+ if (state == GST_STATE_PLAYING) {
+ /* no state management needed for live pipelines */
+ if (!is_live) {
+ fprintf (stderr, "Done buffering, setting pipeline to PLAYING ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Playing");
+ }
+ } else {
+ /* buffering busy */
+ if (buffering == FALSE && state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ if (!is_live) {
+ fprintf (stderr, "Buffering, setting pipeline to PAUSED ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ }
+ buffering = TRUE;
+ }
+}
+
+static void
+do_download_buffering (gint percent)
+{
+ if (!buffering && percent < 100) {
+ gchar *bufstr;
+
+ buffering = TRUE;
+
+ bufstr = g_strdup_printf ("Downloading...");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, bufstr);
+ g_free (bufstr);
+
+ /* once we get a buffering message, we'll do the fill update */
+ set_update_fill (TRUE);
+
+ if (state == GST_STATE_PLAYING && !is_live) {
+ fprintf (stderr, "Downloading, setting pipeline to PAUSED ...\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ /* user has to manually start the playback */
+ state = GST_STATE_PAUSED;
+ }
+ }
+}
+
+static void
+msg_buffering (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ gint percent;
+
+ gst_message_parse_buffering (message, &percent);
+
+ /* get more stats */
+ gst_message_parse_buffering_stats (message, &mode, NULL, NULL,
+ &buffering_left);
+
+ switch (mode) {
+ case GST_BUFFERING_DOWNLOAD:
+ do_download_buffering (percent);
+ break;
+ case GST_BUFFERING_LIVE:
+ is_live = TRUE;
+ case GST_BUFFERING_TIMESHIFT:
+ case GST_BUFFERING_STREAM:
+ do_stream_buffering (percent);
+ break;
+ }
+}
+
+static void
+msg_clock_lost (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ g_print ("clock lost! PAUSE and PLAY to select a new clock\n");
+ if (state == GST_STATE_PLAYING) {
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+}
+
+#if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+
+static gulong embed_xid = 0;
+
+/* We set the xid here in response to the prepare-window-handle message via a
+ * bus sync handler because we don't know the actual videosink used from the
+ * start (as we don't know the pipeline, or bin elements such as autovideosink
+ * or gconfvideosink may be used which create the actual videosink only once
+ * the pipeline is started) */
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ GstElement *element;
+
+ if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ return GST_BUS_PASS;
+
+ element = GST_ELEMENT (GST_MESSAGE_SRC (message));
+
+ g_print ("got prepare-window-handle, setting XID %lu\n", embed_xid);
+
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
+ "force-aspect-ratio")) {
+ g_object_set (element, "force-aspect-ratio", TRUE, NULL);
+ }
+
+ /* Should have been initialised from main thread before (can't use
+ * GDK_WINDOW_XID here with Gtk+ >= 2.18, because the sync handler will
+ * be called from a streaming thread and GDK_WINDOW_XID maps to more than
+ * a simple structure lookup with Gtk+ >= 2.18, where 'more' is stuff that
+ * shouldn't be done from a non-GUI thread without explicit locking). */
+ g_assert (embed_xid != 0);
+
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (element), embed_xid);
+ return GST_BUS_PASS;
+}
+#endif
+
+static gboolean
+handle_expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer data)
+{
+ if (state < GST_STATE_PAUSED) {
+ GtkAllocation allocation;
+ GdkWindow *window = gtk_widget_get_window (widget);
+ cairo_t *cr;
+
+ gtk_widget_get_allocation (widget, &allocation);
+ cr = gdk_cairo_create (window);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+ }
+ return FALSE;
+}
+
+static void
+realize_cb (GtkWidget * widget, gpointer data)
+{
+#if GTK_CHECK_VERSION(2,18,0)
+ {
+ GdkWindow *window = gtk_widget_get_window (widget);
+
+ /* This is here just for pedagogical purposes, GDK_WINDOW_XID will call it
+ * as well */
+ if (!gdk_window_ensure_native (window))
+ g_error ("Couldn't create native window needed for GstVideoOverlay!");
+ }
+#endif
+
+#if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+ {
+ GdkWindow *window = gtk_widget_get_window (video_window);
+
+#if defined (GDK_WINDOWING_WIN32)
+ embed_xid = GDK_WINDOW_HWND (window);
+#else
+ embed_xid = GDK_WINDOW_XID (window);
+#endif
+ g_print ("Window realize: video window XID = %lu\n", embed_xid);
+ }
+#endif
+}
+
+static void
+msg_eos (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ message_received (bus, message, data);
+
+ /* Set new uri for playerbins and continue playback */
+ if (l && (pipeline_type == 14 || pipeline_type == 16)) {
+ stop_cb (NULL, NULL);
+ l = g_list_next (l);
+ if (l) {
+ playerbin_set_uri (GST_ELEMENT (data), l->data);
+ play_cb (NULL, NULL);
+ }
+ }
+}
+
+static void
+msg_step_done (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+ if (!shuttling)
+ message_received (bus, message, data);
+}
+
+static void
+connect_bus_signals (GstElement * pipeline)
+{
+ GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+#if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+ /* handle prepare-window-handle element message synchronously */
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler,
+ pipeline);
+#endif
+
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ gst_bus_enable_sync_message_emission (bus);
+
+ g_signal_connect (bus, "message::state-changed",
+ (GCallback) msg_state_changed, pipeline);
+ g_signal_connect (bus, "message::segment-done", (GCallback) msg_segment_done,
+ pipeline);
+ g_signal_connect (bus, "message::async-done", (GCallback) msg_async_done,
+ pipeline);
+
+ g_signal_connect (bus, "message::new-clock", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::clock-lost", (GCallback) msg_clock_lost,
+ pipeline);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) msg_eos, pipeline);
+ g_signal_connect (bus, "message::tag", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::element", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::segment-done", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::buffering", (GCallback) msg_buffering,
+ pipeline);
+// g_signal_connect (bus, "message::step-done", (GCallback) msg_step_done,
+// pipeline);
+ g_signal_connect (bus, "message::step-start", (GCallback) msg_step_done,
+ pipeline);
+ g_signal_connect (bus, "sync-message::step-done",
+ (GCallback) msg_sync_step_done, pipeline);
+
+ gst_object_unref (bus);
+}
+
+/* Return GList of paths described in location string */
+static GList *
+handle_wildcards (const gchar * location)
+{
+ GList *res = NULL;
+ gchar *path = g_path_get_dirname (location);
+ gchar *pattern = g_path_get_basename (location);
+ GPatternSpec *pspec = g_pattern_spec_new (pattern);
+ GDir *dir = g_dir_open (path, 0, NULL);
+ const gchar *name;
+
+ g_print ("matching %s from %s\n", pattern, path);
+
+ if (!dir) {
+ g_print ("opening directory %s failed\n", path);
+ goto out;
+ }
+
+ while ((name = g_dir_read_name (dir)) != NULL) {
+ if (g_pattern_match_string (pspec, name)) {
+ res = g_list_append (res, g_strjoin ("/", path, name, NULL));
+ g_print (" found clip %s\n", name);
+ }
+ }
+
+ g_dir_close (dir);
+out:
+ g_pattern_spec_free (pspec);
+ g_free (pattern);
+ g_free (path);
+
+ return res;
+}
+
+static void
+delete_event_cb (void)
+{
+ stop_cb (NULL, NULL);
+ gtk_main_quit ();
+}
+
+static void
+print_usage (int argc, char **argv)
+{
+ gint i;
+
+ g_print ("usage: %s <type> <filename>\n", argv[0]);
+ g_print (" possible types:\n");
+
+ for (i = 0; i < NUM_TYPES; i++) {
+ g_print (" %d = %s\n", i, pipelines[i].name);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWidget *window, *hbox, *vbox, *panel, *expander, *pb2vbox, *boxes,
+ *flagtable, *boxes2, *step;
+ GtkWidget *play_button, *pause_button, *stop_button, *shot_button;
+ GtkWidget *accurate_checkbox, *key_checkbox, *loop_checkbox, *flush_checkbox;
+ GtkWidget *scrub_checkbox, *play_scrub_checkbox;
+ GtkWidget *rate_label, *volume_label;
+ GOptionEntry options[] = {
+ {"audiosink", '\0', 0, G_OPTION_ARG_STRING, &opt_audiosink_str,
+ "audio sink to use (default: " DEFAULT_AUDIOSINK ")", NULL},
+ {"stats", 's', 0, G_OPTION_ARG_NONE, &stats,
+ "Show pad stats", NULL},
+ {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+ "Verbose properties", NULL},
+ {"videosink", '\0', 0, G_OPTION_ARG_STRING, &opt_videosink_str,
+ "video sink to use (default: " DEFAULT_VIDEOSINK ")", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("- test seeking in gsteamer");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+
+ if (opt_audiosink_str == NULL)
+ opt_audiosink_str = g_strdup (DEFAULT_AUDIOSINK);
+
+ if (opt_videosink_str == NULL)
+ opt_videosink_str = g_strdup (DEFAULT_VIDEOSINK);
+
+ GST_DEBUG_CATEGORY_INIT (seek_debug, "seek", 0, "seek example");
+
+ if (argc != 3) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ pipeline_type = atoi (argv[1]);
+
+ if (pipeline_type < 0 || pipeline_type >= NUM_TYPES) {
+ print_usage (argc, argv);
+ exit (-1);
+ }
+
+ pipeline_spec = argv[2];
+
+ if (g_path_is_absolute (pipeline_spec) &&
+ (g_strrstr (pipeline_spec, "*") != NULL ||
+ g_strrstr (pipeline_spec, "?") != NULL)) {
+ paths = handle_wildcards (pipeline_spec);
+ } else {
+ paths = g_list_prepend (paths, g_strdup (pipeline_spec));
+ }
+
+ if (!paths) {
+ g_print ("opening %s failed\n", pipeline_spec);
+ exit (-1);
+ }
+
+ l = paths;
+
+ pipeline = pipelines[pipeline_type].func ((gchar *) l->data);
+ g_assert (pipeline);
+
+ /* initialize gui elements ... */
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ video_window = gtk_drawing_area_new ();
+ g_signal_connect (video_window, "expose-event",
+ G_CALLBACK (handle_expose_cb), NULL);
+ g_signal_connect (video_window, "realize", G_CALLBACK (realize_cb), NULL);
+ gtk_widget_set_double_buffered (video_window, FALSE);
+
+ statusbar = gtk_statusbar_new ();
+ status_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "seek");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), status_id, "Stopped");
+ hbox = gtk_hbox_new (FALSE, 0);
+ vbox = gtk_vbox_new (FALSE, 0);
+ flagtable = gtk_table_new (4, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
+
+ /* media controls */
+ play_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY);
+ pause_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE);
+ stop_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_STOP);
+
+ /* seek flags */
+ accurate_checkbox = gtk_check_button_new_with_label ("Accurate Seek");
+ key_checkbox = gtk_check_button_new_with_label ("Key-unit Seek");
+ loop_checkbox = gtk_check_button_new_with_label ("Loop");
+ flush_checkbox = gtk_check_button_new_with_label ("Flush");
+ scrub_checkbox = gtk_check_button_new_with_label ("Scrub");
+ play_scrub_checkbox = gtk_check_button_new_with_label ("Play Scrub");
+ skip_checkbox = gtk_check_button_new_with_label ("Play Skip");
+ rate_spinbutton = gtk_spin_button_new_with_range (-100, 100, 0.1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (rate_spinbutton), 3);
+ rate_label = gtk_label_new ("Rate");
+
+ gtk_widget_set_tooltip_text (accurate_checkbox,
+ "accurate position is requested, this might be considerably slower for some formats");
+ gtk_widget_set_tooltip_text (key_checkbox,
+ "seek to the nearest keyframe. This might be faster but less accurate");
+ gtk_widget_set_tooltip_text (loop_checkbox, "loop playback");
+ gtk_widget_set_tooltip_text (flush_checkbox, "flush pipeline after seeking");
+ gtk_widget_set_tooltip_text (rate_spinbutton, "define the playback rate, "
+ "negative value trigger reverse playback");
+ gtk_widget_set_tooltip_text (scrub_checkbox, "show images while seeking");
+ gtk_widget_set_tooltip_text (play_scrub_checkbox, "play video while seeking");
+ gtk_widget_set_tooltip_text (skip_checkbox,
+ "Skip frames while playing at high frame rates");
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (flush_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scrub_checkbox), TRUE);
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (rate_spinbutton), rate);
+
+ /* step expander */
+ {
+ GtkWidget *hbox;
+
+ step = gtk_expander_new ("step options");
+ hbox = gtk_hbox_new (FALSE, 0);
+
+ format_combo = gtk_combo_box_text_new ();
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (format_combo),
+ "frames");
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (format_combo),
+ "time (ms)");
+ gtk_combo_box_set_active (GTK_COMBO_BOX (format_combo), 0);
+ gtk_box_pack_start (GTK_BOX (hbox), format_combo, FALSE, FALSE, 2);
+
+ step_amount_spinbutton = gtk_spin_button_new_with_range (1, 1000, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (step_amount_spinbutton), 0);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (step_amount_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (hbox), step_amount_spinbutton, FALSE, FALSE,
+ 2);
+
+ step_rate_spinbutton = gtk_spin_button_new_with_range (0.0, 100, 0.1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (step_rate_spinbutton), 3);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (step_rate_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (hbox), step_rate_spinbutton, FALSE, FALSE, 2);
+
+ step_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_FORWARD);
+ gtk_button_set_label (GTK_BUTTON (step_button), "Step");
+ gtk_box_pack_start (GTK_BOX (hbox), step_button, FALSE, FALSE, 2);
+
+ g_signal_connect (G_OBJECT (step_button), "clicked", G_CALLBACK (step_cb),
+ pipeline);
+
+ /* shuttle scale */
+ shuttle_checkbox = gtk_check_button_new_with_label ("Shuttle");
+ gtk_box_pack_start (GTK_BOX (hbox), shuttle_checkbox, FALSE, FALSE, 2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (shuttle_checkbox), FALSE);
+ g_signal_connect (shuttle_checkbox, "toggled", G_CALLBACK (shuttle_toggled),
+ pipeline);
+
+ shuttle_adjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -3.00, 4.0, 0.1, 1.0, 1.0));
+ shuttle_hscale = gtk_hscale_new (shuttle_adjustment);
+ gtk_scale_set_digits (GTK_SCALE (shuttle_hscale), 2);
+ gtk_scale_set_value_pos (GTK_SCALE (shuttle_hscale), GTK_POS_TOP);
+ g_signal_connect (shuttle_hscale, "value_changed",
+ G_CALLBACK (shuttle_value_changed), pipeline);
+ g_signal_connect (shuttle_hscale, "format_value",
+ G_CALLBACK (shuttle_format_value), pipeline);
+
+ gtk_box_pack_start (GTK_BOX (hbox), shuttle_hscale, TRUE, TRUE, 2);
+
+ gtk_container_add (GTK_CONTAINER (step), hbox);
+ }
+
+ /* seek bar */
+ adjustment =
+ GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, N_GRAD, 0.1, 1.0, 1.0));
+ hscale = gtk_hscale_new (adjustment);
+ gtk_scale_set_digits (GTK_SCALE (hscale), 2);
+ gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_RIGHT);
+ gtk_range_set_show_fill_level (GTK_RANGE (hscale), TRUE);
+ gtk_range_set_fill_level (GTK_RANGE (hscale), N_GRAD);
+
+ g_signal_connect (hscale, "button_press_event", G_CALLBACK (start_seek),
+ pipeline);
+ g_signal_connect (hscale, "button_release_event", G_CALLBACK (stop_seek),
+ pipeline);
+ g_signal_connect (hscale, "format_value", G_CALLBACK (format_value),
+ pipeline);
+
+ if (pipeline_type == 0) {
+ /* the playbin2 panel controls for the video/audio/subtitle tracks */
+ panel = gtk_hbox_new (FALSE, 0);
+ video_combo = gtk_combo_box_text_new ();
+ audio_combo = gtk_combo_box_text_new ();
+ text_combo = gtk_combo_box_text_new ();
+ gtk_widget_set_sensitive (video_combo, FALSE);
+ gtk_widget_set_sensitive (audio_combo, FALSE);
+ gtk_widget_set_sensitive (text_combo, FALSE);
+ gtk_box_pack_start (GTK_BOX (panel), video_combo, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (panel), audio_combo, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (panel), text_combo, TRUE, TRUE, 2);
+ g_signal_connect (G_OBJECT (video_combo), "changed",
+ G_CALLBACK (video_combo_cb), pipeline);
+ g_signal_connect (G_OBJECT (audio_combo), "changed",
+ G_CALLBACK (audio_combo_cb), pipeline);
+ g_signal_connect (G_OBJECT (text_combo), "changed",
+ G_CALLBACK (text_combo_cb), pipeline);
+ /* playbin2 panel for flag checkboxes and volume/mute */
+ boxes = gtk_hbox_new (FALSE, 0);
+ vis_checkbox = gtk_check_button_new_with_label ("Vis");
+ video_checkbox = gtk_check_button_new_with_label ("Video");
+ audio_checkbox = gtk_check_button_new_with_label ("Audio");
+ text_checkbox = gtk_check_button_new_with_label ("Text");
+ mute_checkbox = gtk_check_button_new_with_label ("Mute");
+ download_checkbox = gtk_check_button_new_with_label ("Download");
+ buffer_checkbox = gtk_check_button_new_with_label ("Buffer");
+ volume_label = gtk_label_new ("Volume");
+ volume_spinbutton = gtk_spin_button_new_with_range (0, 10.0, 0.1);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), 1.0);
+ gtk_box_pack_start (GTK_BOX (boxes), video_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), audio_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), text_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), vis_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), mute_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), download_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), buffer_checkbox, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), volume_label, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes), volume_spinbutton, TRUE, TRUE, 2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vis_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (audio_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (video_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (text_checkbox), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mute_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (download_checkbox), FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buffer_checkbox), FALSE);
+ g_signal_connect (G_OBJECT (vis_checkbox), "toggled",
+ G_CALLBACK (vis_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (audio_checkbox), "toggled",
+ G_CALLBACK (audio_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (video_checkbox), "toggled",
+ G_CALLBACK (video_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (text_checkbox), "toggled",
+ G_CALLBACK (text_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (mute_checkbox), "toggled",
+ G_CALLBACK (mute_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (download_checkbox), "toggled",
+ G_CALLBACK (download_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (buffer_checkbox), "toggled",
+ G_CALLBACK (buffer_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (volume_spinbutton), "value_changed",
+ G_CALLBACK (volume_spinbutton_changed_cb), pipeline);
+ /* playbin2 panel for snapshot */
+ boxes2 = gtk_hbox_new (FALSE, 0);
+ shot_button = gtk_button_new_from_stock (GTK_STOCK_SAVE);
+ gtk_widget_set_tooltip_text (shot_button,
+ "save a screenshot .png in the current directory");
+ g_signal_connect (G_OBJECT (shot_button), "clicked", G_CALLBACK (shot_cb),
+ pipeline);
+ vis_combo = gtk_combo_box_text_new ();
+ g_signal_connect (G_OBJECT (vis_combo), "changed",
+ G_CALLBACK (vis_combo_cb), pipeline);
+ gtk_widget_set_sensitive (vis_combo, FALSE);
+ gtk_box_pack_start (GTK_BOX (boxes2), shot_button, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (boxes2), vis_combo, TRUE, TRUE, 2);
+
+ /* fill the vis combo box and the array of factories */
+ init_visualization_features ();
+ } else {
+ panel = boxes = boxes2 = NULL;
+ }
+
+ /* do the packing stuff ... */
+ gtk_window_set_default_size (GTK_WINDOW (window), 250, 96);
+ /* FIXME: can we avoid this for audio only? */
+ gtk_widget_set_size_request (GTK_WIDGET (video_window), -1,
+ DEFAULT_VIDEO_HEIGHT);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+ gtk_box_pack_start (GTK_BOX (vbox), video_window, TRUE, TRUE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), flagtable, FALSE, FALSE, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), accurate_checkbox, 0, 1, 0,
+ 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), flush_checkbox, 1, 2, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), loop_checkbox, 2, 3, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), key_checkbox, 0, 1, 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), scrub_checkbox, 1, 2, 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), play_scrub_checkbox, 2, 3,
+ 1, 2);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), skip_checkbox, 3, 4, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), rate_label, 4, 5, 0, 1);
+ gtk_table_attach_defaults (GTK_TABLE (flagtable), rate_spinbutton, 4, 5, 1,
+ 2);
+ if (panel && boxes && boxes2) {
+ expander = gtk_expander_new ("playbin2 options");
+ pb2vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), panel, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), boxes, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (pb2vbox), boxes2, FALSE, FALSE, 2);
+ gtk_container_add (GTK_CONTAINER (expander), pb2vbox);
+ gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 2);
+ }
+ gtk_box_pack_start (GTK_BOX (vbox), step, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), hscale, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 2);
+
+ /* connect things ... */
+ g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
+ pipeline);
+ g_signal_connect (G_OBJECT (accurate_checkbox), "toggled",
+ G_CALLBACK (accurate_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (key_checkbox), "toggled",
+ G_CALLBACK (key_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (loop_checkbox), "toggled",
+ G_CALLBACK (loop_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (flush_checkbox), "toggled",
+ G_CALLBACK (flush_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (scrub_checkbox), "toggled",
+ G_CALLBACK (scrub_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (play_scrub_checkbox), "toggled",
+ G_CALLBACK (play_scrub_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (skip_checkbox), "toggled",
+ G_CALLBACK (skip_toggle_cb), pipeline);
+ g_signal_connect (G_OBJECT (rate_spinbutton), "value_changed",
+ G_CALLBACK (rate_spinbutton_changed_cb), pipeline);
+
+ g_signal_connect (G_OBJECT (window), "delete-event", delete_event_cb, NULL);
+
+ /* show the gui. */
+ gtk_widget_show_all (window);
+
+ /* realize window now so that the video window gets created and we can
+ * obtain its XID before the pipeline is started up and the videosink
+ * asks for the XID of the window to render onto */
+ gtk_widget_realize (window);
+
+#if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+ /* we should have the XID now */
+ g_assert (embed_xid != 0);
+#endif
+
+ if (verbose) {
+ g_signal_connect (pipeline, "deep_notify",
+ G_CALLBACK (gst_object_default_deep_notify), NULL);
+ }
+
+ connect_bus_signals (pipeline);
+ gtk_main ();
+
+ g_print ("NULL pipeline\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ g_print ("free pipeline\n");
+ gst_object_unref (pipeline);
+
+ g_list_foreach (paths, (GFunc) g_free, NULL);
+ g_list_free (paths);
+
+ return 0;
+}
diff --git a/tests/examples/seek/stepping.c b/tests/examples/seek/stepping.c
new file mode 100644
index 0000000..6f6997f
--- /dev/null
+++ b/tests/examples/seek/stepping.c
@@ -0,0 +1,124 @@
+/* GStreamer
+ *
+ * stepping.c: stepping sample application
+ *
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+
+static gdouble period = 0.0;
+
+static gboolean
+do_step (GstElement * bin)
+{
+ gdouble length;
+
+ length = sin (period);
+
+ period += M_PI / 40;
+
+ length += 1.1;
+ length *= 100 * GST_MSECOND;
+
+ gst_element_send_event (bin,
+ gst_event_new_step (GST_FORMAT_TIME, length, 1.0, TRUE, FALSE));
+
+ return FALSE;
+}
+
+static gboolean
+handle_message (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstElement *bin = GST_ELEMENT_CAST (data);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("got EOS");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_WARNING:
+ case GST_MESSAGE_ERROR:
+ {
+ GError *gerror;
+ gchar *debug;
+
+ if (message->type == GST_MESSAGE_ERROR)
+ gst_message_parse_error (message, &gerror, &debug);
+ else
+ gst_message_parse_warning (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_ASYNC_DONE:
+ g_timeout_add (40, (GSourceFunc) do_step, bin);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>\n", argv[0]);
+ return -1;
+ }
+
+ /* create a new bin to hold the elements */
+ bin = gst_element_factory_make ("playbin2", "bin");
+ g_assert (bin);
+ g_object_set (bin, "uri", argv[1], NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_add_watch (bus, handle_message, bin);
+
+ /* go to the PAUSED state and wait for preroll */
+ g_message ("prerolling first frame");
+ gst_element_set_state (bin, GST_STATE_PAUSED);
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
+
+ g_message ("finished");
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ g_main_loop_unref (loop);
+ gst_object_unref (bus);
+
+ exit (0);
+}
diff --git a/tests/examples/seek/stepping2.c b/tests/examples/seek/stepping2.c
new file mode 100644
index 0000000..8cea180
--- /dev/null
+++ b/tests/examples/seek/stepping2.c
@@ -0,0 +1,142 @@
+/* GStreamer
+ *
+ * stepping.c: stepping sample application
+ *
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+
+static gdouble period = 0.0;
+
+static void
+do_step (GstElement * bin)
+{
+ gdouble rate;
+
+ rate = sin (period);
+
+ period += M_PI / 150;
+
+ rate += 1.2;
+
+ gst_element_send_event (bin,
+ gst_event_new_step (GST_FORMAT_TIME, 40 * GST_MSECOND, rate, FALSE,
+ FALSE));
+}
+
+static void
+handle_sync_message (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstElement *bin;
+
+ bin = GST_ELEMENT_CAST (data);
+
+ switch (message->type) {
+ case GST_MESSAGE_STEP_DONE:
+ do_step (bin);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+handle_message (GstBus * bus, GstMessage * message, gpointer data)
+{
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("got EOS");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_WARNING:
+ case GST_MESSAGE_ERROR:
+ {
+ GError *gerror;
+ gchar *debug;
+
+ if (message->type == GST_MESSAGE_ERROR)
+ gst_message_parse_error (message, &gerror, &debug);
+ else
+ gst_message_parse_warning (message, &gerror, &debug);
+
+ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ g_error_free (gerror);
+ g_free (debug);
+ if (message->type == GST_MESSAGE_ERROR)
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>\n", argv[0]);
+ return -1;
+ }
+
+ /* create a new bin to hold the elements */
+ bin = gst_element_factory_make ("playbin2", "bin");
+ g_assert (bin);
+ g_object_set (bin, "uri", argv[1], NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_add_signal_watch (bus);
+ gst_bus_enable_sync_message_emission (bus);
+
+ g_signal_connect (bus, "message", (GCallback) handle_message, bin);
+ g_signal_connect (bus, "sync-message", (GCallback) handle_sync_message, bin);
+
+ /* go to the PAUSED state and wait for preroll */
+ g_message ("prerolling first frame");
+ gst_element_set_state (bin, GST_STATE_PAUSED);
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ /* queue step */
+ do_step (bin);
+
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
+
+ g_message ("finished");
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ g_main_loop_unref (loop);
+ gst_object_unref (bus);
+
+ exit (0);
+}
diff --git a/tests/examples/snapshot/Makefile.am b/tests/examples/snapshot/Makefile.am
new file mode 100644
index 0000000..16830ee
--- /dev/null
+++ b/tests/examples/snapshot/Makefile.am
@@ -0,0 +1,10 @@
+if HAVE_GTK
+GTK_EXAMPLES=snapshot
+endif
+
+examples = $(GTK_EXAMPLES)
+
+noinst_PROGRAMS = $(examples)
+
+LIBS = $(GST_LIBS) $(GTK_LIBS)
+AM_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS)
diff --git a/tests/examples/snapshot/Makefile.in b/tests/examples/snapshot/Makefile.in
new file mode 100644
index 0000000..b92fb3c
--- /dev/null
+++ b/tests/examples/snapshot/Makefile.in
@@ -0,0 +1,690 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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_2)
+subdir = tests/examples/snapshot
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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 = snapshot$(EXEEXT)
+am__EXEEXT_2 = $(am__EXEEXT_1)
+PROGRAMS = $(noinst_PROGRAMS)
+snapshot_SOURCES = snapshot.c
+snapshot_OBJECTS = snapshot.$(OBJEXT)
+snapshot_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = snapshot.c
+DIST_SOURCES = snapshot.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = $(GST_LIBS) $(GTK_LIBS)
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_TRUE@GTK_EXAMPLES = snapshot
+examples = $(GTK_EXAMPLES)
+AM_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS)
+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/snapshot/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/snapshot/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
+snapshot$(EXEEXT): $(snapshot_OBJECTS) $(snapshot_DEPENDENCIES)
+ @rm -f snapshot$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(snapshot_OBJECTS) $(snapshot_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snapshot.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/snapshot/snapshot.c b/tests/examples/snapshot/snapshot.c
new file mode 100644
index 0000000..6f9755e
--- /dev/null
+++ b/tests/examples/snapshot/snapshot.c
@@ -0,0 +1,160 @@
+/* GStreamer snapshot example
+ * 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 <gst/gst.h>
+#include <gtk/gtk.h>
+
+#include <stdlib.h>
+
+#define CAPS "video/x-raw-rgb,width=160,pixel-aspect-ratio=1/1,bpp=(int)24,depth=(int)24,endianness=(int)4321,red_mask=(int)0xff0000, green_mask=(int)0x00ff00, blue_mask=(int)0x0000ff"
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline, *sink;
+ gint width, height;
+ GstBuffer *buffer;
+ gchar *descr;
+ GError *error = NULL;
+ GdkPixbuf *pixbuf;
+ gint64 duration, position;
+ GstStateChangeReturn ret;
+ gboolean res;
+ guint8 *data;
+ gsize size;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <uri>\n Writes snapshot.png in the current directory\n",
+ argv[0]);
+ exit (-1);
+ }
+
+ /* create a new pipeline */
+ descr =
+ g_strdup_printf ("uridecodebin uri=%s ! videoconvert ! videoscale ! "
+ " appsink name=sink caps=\"" CAPS "\"", argv[1]);
+ pipeline = gst_parse_launch (descr, &error);
+
+ if (error != NULL) {
+ g_print ("could not construct pipeline: %s\n", error->message);
+ g_error_free (error);
+ exit (-1);
+ }
+
+ /* get sink */
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+
+ /* set to PAUSED to make the first frame arrive in the sink */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ g_print ("failed to play the file\n");
+ exit (-1);
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* for live sources, we need to set the pipeline to PLAYING before we can
+ * receive a buffer. We don't do that yet */
+ g_print ("live sources not supported yet\n");
+ exit (-1);
+ default:
+ break;
+ }
+ /* This can block for up to 5 seconds. If your machine is really overloaded,
+ * it might time out before the pipeline prerolled and we generate an error. A
+ * better way is to run a mainloop and catch errors there. */
+ ret = gst_element_get_state (pipeline, NULL, NULL, 5 * GST_SECOND);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_print ("failed to play the file\n");
+ exit (-1);
+ }
+
+ /* get the duration */
+ gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration);
+
+ if (duration != -1)
+ /* we have a duration, seek to 5% */
+ position = duration * 5 / 100;
+ else
+ /* no duration, seek to 1 second, this could EOS */
+ position = 1 * GST_SECOND;
+
+ /* seek to the a position in the file. Most files have a black first frame so
+ * by seeking to somewhere else we have a bigger chance of getting something
+ * more interesting. An optimisation would be to detect black images and then
+ * seek a little more */
+ gst_element_seek_simple (pipeline, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_FLUSH, position);
+
+ /* get the preroll buffer from appsink, this block untils appsink really
+ * prerolls */
+ g_signal_emit_by_name (sink, "pull-preroll", &buffer, NULL);
+
+ /* if we have a buffer now, convert it to a pixbuf. It's possible that we
+ * don't have a buffer because we went EOS right away or had an error. */
+ if (buffer) {
+ GstCaps *caps;
+ GstStructure *s;
+
+ /* get the snapshot buffer format now. We set the caps on the appsink so
+ * that it can only be an rgb buffer. The only thing we have not specified
+ * on the caps is the height, which is dependant on the pixel-aspect-ratio
+ * of the source material */
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+ /* FIXME, get buffer caps somehow */
+ caps = NULL;
+ if (!caps) {
+ g_print ("could not get snapshot format\n");
+ exit (-1);
+ }
+ s = gst_caps_get_structure (caps, 0);
+
+ /* we need to get the final caps on the buffer to get the size */
+ res = gst_structure_get_int (s, "width", &width);
+ res |= gst_structure_get_int (s, "height", &height);
+ if (!res) {
+ g_print ("could not get snapshot dimension\n");
+ exit (-1);
+ }
+
+ /* create pixmap from buffer and save, gstreamer video buffers have a stride
+ * that is rounded up to the nearest multiple of 4 */
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ pixbuf = gdk_pixbuf_new_from_data (data,
+ GDK_COLORSPACE_RGB, FALSE, 8, width, height,
+ GST_ROUND_UP_4 (width * 3), NULL, NULL);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+ gst_buffer_unmap (buffer, data, size);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+ } else {
+ g_print ("could not make snapshot\n");
+ }
+
+ /* cleanup and exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ exit (0);
+}
diff --git a/tests/examples/volume/Makefile.am b/tests/examples/volume/Makefile.am
new file mode 100644
index 0000000..7b2f067
--- /dev/null
+++ b/tests/examples/volume/Makefile.am
@@ -0,0 +1,6 @@
+if HAVE_GTK
+noinst_PROGRAMS = volume
+volume_SOURCES = volume.c
+volume_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) -D_GNU_SOURCE
+volume_LDADD = $(GST_LIBS) $(GTK_LIBS) $(LIBM)
+endif
diff --git a/tests/examples/volume/Makefile.in b/tests/examples/volume/Makefile.in
new file mode 100644
index 0000000..7c4ff45
--- /dev/null
+++ b/tests/examples/volume/Makefile.in
@@ -0,0 +1,710 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = volume$(EXEEXT)
+subdir = tests/examples/volume
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__volume_SOURCES_DIST = volume.c
+@HAVE_GTK_TRUE@am_volume_OBJECTS = volume-volume.$(OBJEXT)
+volume_OBJECTS = $(am_volume_OBJECTS)
+am__DEPENDENCIES_1 =
+@HAVE_GTK_TRUE@volume_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+@HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+volume_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(volume_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(volume_SOURCES)
+DIST_SOURCES = $(am__volume_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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_TRUE@volume_SOURCES = volume.c
+@HAVE_GTK_TRUE@volume_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) -D_GNU_SOURCE
+@HAVE_GTK_TRUE@volume_LDADD = $(GST_LIBS) $(GTK_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/volume/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/volume/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
+volume$(EXEEXT): $(volume_OBJECTS) $(volume_DEPENDENCIES)
+ @rm -f volume$(EXEEXT)
+ $(AM_V_CCLD)$(volume_LINK) $(volume_OBJECTS) $(volume_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/volume-volume.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+volume-volume.o: volume.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_CFLAGS) $(CFLAGS) -MT volume-volume.o -MD -MP -MF $(DEPDIR)/volume-volume.Tpo -c -o volume-volume.o `test -f 'volume.c' || echo '$(srcdir)/'`volume.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/volume-volume.Tpo $(DEPDIR)/volume-volume.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='volume.c' object='volume-volume.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_CFLAGS) $(CFLAGS) -c -o volume-volume.o `test -f 'volume.c' || echo '$(srcdir)/'`volume.c
+
+volume-volume.obj: volume.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_CFLAGS) $(CFLAGS) -MT volume-volume.obj -MD -MP -MF $(DEPDIR)/volume-volume.Tpo -c -o volume-volume.obj `if test -f 'volume.c'; then $(CYGPATH_W) 'volume.c'; else $(CYGPATH_W) '$(srcdir)/volume.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/volume-volume.Tpo $(DEPDIR)/volume-volume.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='volume.c' object='volume-volume.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_CFLAGS) $(CFLAGS) -c -o volume-volume.obj `if test -f 'volume.c'; then $(CYGPATH_W) 'volume.c'; else $(CYGPATH_W) '$(srcdir)/volume.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/volume/volume.c b/tests/examples/volume/volume.c
new file mode 100644
index 0000000..59e4981
--- /dev/null
+++ b/tests/examples/volume/volume.c
@@ -0,0 +1,172 @@
+/* GStreamer
+ *
+ * volume.c: sample application to change the volume of a pipeline
+ *
+ * Copyright (C) <2004> 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include <gst/gst.h>
+#include <gtk/gtk.h>
+
+/* global pointer for the scale widget */
+GtkWidget *elapsed;
+GtkWidget *scale;
+
+#ifndef M_LN10
+#define M_LN10 (log(10.0))
+#endif
+
+static void
+value_changed_callback (GtkWidget * widget, GstElement * volume)
+{
+ gdouble value;
+ gdouble level;
+
+ value = gtk_range_get_value (GTK_RANGE (widget));
+ level = exp (value / 20.0 * M_LN10);
+ g_print ("Value: %f dB, level: %f\n", value, level);
+ g_object_set (volume, "volume", level, NULL);
+}
+
+static void
+setup_gui (GstElement * volume)
+{
+ GtkWidget *window;
+ GtkWidget *vbox;
+ GtkWidget *label, *hbox;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (window, "destroy", gtk_main_quit, NULL);
+
+ vbox = gtk_vbox_new (TRUE, 0);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+
+ /* elapsed widget */
+ hbox = gtk_hbox_new (TRUE, 0);
+ label = gtk_label_new ("Elapsed");
+ elapsed = gtk_label_new ("0.000");
+ gtk_container_add (GTK_CONTAINER (hbox), label);
+ gtk_container_add (GTK_CONTAINER (hbox), elapsed);
+ gtk_container_add (GTK_CONTAINER (vbox), hbox);
+
+ /* volume */
+ hbox = gtk_hbox_new (TRUE, 0);
+ label = gtk_label_new ("volume");
+ gtk_container_add (GTK_CONTAINER (hbox), label);
+ scale = gtk_hscale_new_with_range (-90.0, 10.0, 0.2);
+ gtk_range_set_value (GTK_RANGE (scale), 0.0);
+ gtk_widget_set_size_request (scale, 100, -1);
+ gtk_container_add (GTK_CONTAINER (hbox), scale);
+ gtk_container_add (GTK_CONTAINER (vbox), hbox);
+ g_signal_connect (scale, "value-changed",
+ G_CALLBACK (value_changed_callback), volume);
+
+ gtk_widget_show_all (GTK_WIDGET (window));
+}
+
+static void
+message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+ g_print ("message from \"%s\" (%s): ",
+ GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ g_print ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ g_print ("no message details\n");
+ }
+}
+
+static void
+eos_message_received (GstBus * bus, GstMessage * message,
+ GstPipeline * pipeline)
+{
+ message_received (bus, message, pipeline);
+ gtk_main_quit ();
+}
+
+int
+main (int argc, char *argv[])
+{
+
+ GstElement *pipeline = NULL;
+
+#ifndef GST_DISABLE_PARSE
+ GError *error = NULL;
+#endif
+ GstElement *volume;
+ GstBus *bus;
+
+#ifdef GST_DISABLE_PARSE
+ g_print ("GStreamer was built without pipeline parsing capabilities.\n");
+ g_print
+ ("Please rebuild GStreamer with pipeline parsing capabilities activated to use this example.\n");
+ return 1;
+#else
+ gst_init (&argc, &argv);
+ gtk_init (&argc, &argv);
+
+ pipeline = gst_parse_launchv ((const gchar **) &argv[1], &error);
+ if (error) {
+ g_print ("pipeline could not be constructed: %s\n", error->message);
+ g_print ("Please give a complete pipeline with a 'volume' element.\n");
+ g_print ("Example: audiotestsrc ! volume ! %s\n", DEFAULT_AUDIOSINK);
+ g_error_free (error);
+ return 1;
+ }
+#endif
+ volume = gst_bin_get_by_name (GST_BIN (pipeline), "volume0");
+ if (volume == NULL) {
+ g_print ("Please give a pipeline with a 'volume' element in it\n");
+ return 1;
+ }
+
+ /* setup message handling */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::error", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ pipeline);
+ g_signal_connect (bus, "message::eos", (GCallback) eos_message_received,
+ pipeline);
+
+ /* setup GUI */
+ setup_gui (volume);
+
+ /* go to main loop */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ gtk_main ();
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/files/623663.mts b/tests/files/623663.mts
new file mode 100644
index 0000000..482ddf7
--- /dev/null
+++ b/tests/files/623663.mts
Binary files differ
diff --git a/tests/files/Makefile.am b/tests/files/Makefile.am
new file mode 100644
index 0000000..9556f5e
--- /dev/null
+++ b/tests/files/Makefile.am
@@ -0,0 +1,6 @@
+EXTRA_DIST = \
+ 623663.mts \
+ hls.m3u8 \
+ license-uris \
+ partialframe.mjpeg \
+ test.mp3
diff --git a/tests/files/Makefile.in b/tests/files/Makefile.in
new file mode 100644
index 0000000..a146128
--- /dev/null
+++ b/tests/files/Makefile.in
@@ -0,0 +1,563 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = \
+ 623663.mts \
+ hls.m3u8 \
+ license-uris \
+ partialframe.mjpeg \
+ test.mp3
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/hls.m3u8 b/tests/files/hls.m3u8
new file mode 100644
index 0000000..3acce06
--- /dev/null
+++ b/tests/files/hls.m3u8
@@ -0,0 +1,15 @@
+#EXTM3U
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=246221
+0240/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=38872
+0064/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=153059
+0150/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=455394
+0440/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=650356
+0640/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=861738
+0840/prog_index.m3u8
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1258987
+1240/prog_index.m3u8
diff --git a/tests/files/license-uris b/tests/files/license-uris
new file mode 100644
index 0000000..651a447
--- /dev/null
+++ b/tests/files/license-uris
@@ -0,0 +1,376 @@
+http://creativecommons.org/licenses/by/1.0/fi/
+http://creativecommons.org/licenses/by/1.0/il/
+http://creativecommons.org/licenses/by/1.0/nl/
+http://creativecommons.org/licenses/by/1.0/
+http://creativecommons.org/licenses/by/2.0/at/
+http://creativecommons.org/licenses/by/2.0/au/
+http://creativecommons.org/licenses/by/2.0/be/
+http://creativecommons.org/licenses/by/2.0/br/
+http://creativecommons.org/licenses/by/2.0/ca/
+http://creativecommons.org/licenses/by/2.0/cl/
+http://creativecommons.org/licenses/by/2.0/de/
+http://creativecommons.org/licenses/by/2.0/es/
+http://creativecommons.org/licenses/by/2.0/fr/
+http://creativecommons.org/licenses/by/2.0/hr/
+http://creativecommons.org/licenses/by/2.0/it/
+http://creativecommons.org/licenses/by/2.0/jp/
+http://creativecommons.org/licenses/by/2.0/kr/
+http://creativecommons.org/licenses/by/2.0/nl/
+http://creativecommons.org/licenses/by/2.0/pl/
+http://creativecommons.org/licenses/by/2.0/
+http://creativecommons.org/licenses/by/2.0/tw/
+http://creativecommons.org/licenses/by/2.0/uk/
+http://creativecommons.org/licenses/by/2.0/za/
+http://creativecommons.org/licenses/by/2.1/au/
+http://creativecommons.org/licenses/by/2.1/es/
+http://creativecommons.org/licenses/by/2.1/jp/
+http://creativecommons.org/licenses/by/2.5/ar/
+http://creativecommons.org/licenses/by/2.5/au/
+http://creativecommons.org/licenses/by/2.5/bg/
+http://creativecommons.org/licenses/by/2.5/br/
+http://creativecommons.org/licenses/by/2.5/ca/
+http://creativecommons.org/licenses/by/2.5/ch/
+http://creativecommons.org/licenses/by/2.5/cn/
+http://creativecommons.org/licenses/by/2.5/co/
+http://creativecommons.org/licenses/by/2.5/dk/
+http://creativecommons.org/licenses/by/2.5/es/
+http://creativecommons.org/licenses/by/2.5/hr/
+http://creativecommons.org/licenses/by/2.5/hu/
+http://creativecommons.org/licenses/by/2.5/il/
+http://creativecommons.org/licenses/by/2.5/in/
+http://creativecommons.org/licenses/by/2.5/it/
+http://creativecommons.org/licenses/by/2.5/mk/
+http://creativecommons.org/licenses/by/2.5/mt/
+http://creativecommons.org/licenses/by/2.5/mx/
+http://creativecommons.org/licenses/by/2.5/my/
+http://creativecommons.org/licenses/by/2.5/nl/
+http://creativecommons.org/licenses/by/2.5/pe/
+http://creativecommons.org/licenses/by/2.5/pl/
+http://creativecommons.org/licenses/by/2.5/pt/
+http://creativecommons.org/licenses/by/2.5/
+http://creativecommons.org/licenses/by/2.5/scotland/
+http://creativecommons.org/licenses/by/2.5/se/
+http://creativecommons.org/licenses/by/2.5/si/
+http://creativecommons.org/licenses/by/2.5/tw/
+http://creativecommons.org/licenses/by/2.5/za/
+http://creativecommons.org/licenses/by/3.0/
+http://creativecommons.org/licenses/by/3.0/us/
+http://creativecommons.org/licenses/by-nc/1.0/fi/
+http://creativecommons.org/licenses/by-nc/1.0/il/
+http://creativecommons.org/licenses/by-nc/1.0/nl/
+http://creativecommons.org/licenses/by-nc/1.0/
+http://creativecommons.org/licenses/by-nc/2.0/at/
+http://creativecommons.org/licenses/by-nc/2.0/au/
+http://creativecommons.org/licenses/by-nc/2.0/be/
+http://creativecommons.org/licenses/by-nc/2.0/br/
+http://creativecommons.org/licenses/by-nc/2.0/ca/
+http://creativecommons.org/licenses/by-nc/2.0/cl/
+http://creativecommons.org/licenses/by-nc/2.0/de/
+http://creativecommons.org/licenses/by-nc/2.0/es/
+http://creativecommons.org/licenses/by-nc/2.0/fr/
+http://creativecommons.org/licenses/by-nc/2.0/hr/
+http://creativecommons.org/licenses/by-nc/2.0/it/
+http://creativecommons.org/licenses/by-nc/2.0/jp/
+http://creativecommons.org/licenses/by-nc/2.0/kr/
+http://creativecommons.org/licenses/by-nc/2.0/nl/
+http://creativecommons.org/licenses/by-nc/2.0/pl/
+http://creativecommons.org/licenses/by-nc/2.0/
+http://creativecommons.org/licenses/by-nc/2.0/tw/
+http://creativecommons.org/licenses/by-nc/2.0/uk/
+http://creativecommons.org/licenses/by-nc/2.0/za/
+http://creativecommons.org/licenses/by-nc/2.1/au/
+http://creativecommons.org/licenses/by-nc/2.1/es/
+http://creativecommons.org/licenses/by-nc/2.1/jp/
+http://creativecommons.org/licenses/by-nc/2.5/ar/
+http://creativecommons.org/licenses/by-nc/2.5/au/
+http://creativecommons.org/licenses/by-nc/2.5/bg/
+http://creativecommons.org/licenses/by-nc/2.5/br/
+http://creativecommons.org/licenses/by-nc/2.5/ca/
+http://creativecommons.org/licenses/by-nc/2.5/ch/
+http://creativecommons.org/licenses/by-nc/2.5/cn/
+http://creativecommons.org/licenses/by-nc/2.5/co/
+http://creativecommons.org/licenses/by-nc/2.5/dk/
+http://creativecommons.org/licenses/by-nc/2.5/es/
+http://creativecommons.org/licenses/by-nc/2.5/hr/
+http://creativecommons.org/licenses/by-nc/2.5/hu/
+http://creativecommons.org/licenses/by-nc/2.5/il/
+http://creativecommons.org/licenses/by-nc/2.5/in/
+http://creativecommons.org/licenses/by-nc/2.5/it/
+http://creativecommons.org/licenses/by-nc/2.5/mk/
+http://creativecommons.org/licenses/by-nc/2.5/mt/
+http://creativecommons.org/licenses/by-nc/2.5/mx/
+http://creativecommons.org/licenses/by-nc/2.5/my/
+http://creativecommons.org/licenses/by-nc/2.5/nl/
+http://creativecommons.org/licenses/by-nc/2.5/pe/
+http://creativecommons.org/licenses/by-nc/2.5/pl/
+http://creativecommons.org/licenses/by-nc/2.5/pt/
+http://creativecommons.org/licenses/by-nc/2.5/
+http://creativecommons.org/licenses/by-nc/2.5/scotland/
+http://creativecommons.org/licenses/by-nc/2.5/se/
+http://creativecommons.org/licenses/by-nc/2.5/si/
+http://creativecommons.org/licenses/by-nc/2.5/tw/
+http://creativecommons.org/licenses/by-nc/2.5/za/
+http://creativecommons.org/licenses/by-nc/3.0/
+http://creativecommons.org/licenses/by-nc/3.0/us/
+http://creativecommons.org/licenses/by-nc-nd/2.0/at/
+http://creativecommons.org/licenses/by-nc-nd/2.0/au/
+http://creativecommons.org/licenses/by-nc-nd/2.0/be/
+http://creativecommons.org/licenses/by-nc-nd/2.0/br/
+http://creativecommons.org/licenses/by-nc-nd/2.0/ca/
+http://creativecommons.org/licenses/by-nc-nd/2.0/cl/
+http://creativecommons.org/licenses/by-nc-nd/2.0/de/
+http://creativecommons.org/licenses/by-nc-nd/2.0/es/
+http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
+http://creativecommons.org/licenses/by-nc-nd/2.0/hr/
+http://creativecommons.org/licenses/by-nc-nd/2.0/it/
+http://creativecommons.org/licenses/by-nc-nd/2.0/jp/
+http://creativecommons.org/licenses/by-nc-nd/2.0/kr/
+http://creativecommons.org/licenses/by-nc-nd/2.0/nl/
+http://creativecommons.org/licenses/by-nc-nd/2.0/pl/
+http://creativecommons.org/licenses/by-nc-nd/2.0/
+http://creativecommons.org/licenses/by-nc-nd/2.0/tw/
+http://creativecommons.org/licenses/by-nc-nd/2.0/uk/
+http://creativecommons.org/licenses/by-nc-nd/2.0/za/
+http://creativecommons.org/licenses/by-nc-nd/2.1/au/
+http://creativecommons.org/licenses/by-nc-nd/2.1/es/
+http://creativecommons.org/licenses/by-nc-nd/2.1/jp/
+http://creativecommons.org/licenses/by-nc-nd/2.5/ar/
+http://creativecommons.org/licenses/by-nc-nd/2.5/au/
+http://creativecommons.org/licenses/by-nc-nd/2.5/bg/
+http://creativecommons.org/licenses/by-nc-nd/2.5/br/
+http://creativecommons.org/licenses/by-nc-nd/2.5/ca/
+http://creativecommons.org/licenses/by-nc-nd/2.5/ch/
+http://creativecommons.org/licenses/by-nc-nd/2.5/cn/
+http://creativecommons.org/licenses/by-nc-nd/2.5/co/
+http://creativecommons.org/licenses/by-nc-nd/2.5/dk/
+http://creativecommons.org/licenses/by-nc-nd/2.5/es/
+http://creativecommons.org/licenses/by-nc-nd/2.5/hr/
+http://creativecommons.org/licenses/by-nc-nd/2.5/hu/
+http://creativecommons.org/licenses/by-nc-nd/2.5/il/
+http://creativecommons.org/licenses/by-nc-nd/2.5/in/
+http://creativecommons.org/licenses/by-nc-nd/2.5/it/
+http://creativecommons.org/licenses/by-nc-nd/2.5/mk/
+http://creativecommons.org/licenses/by-nc-nd/2.5/mt/
+http://creativecommons.org/licenses/by-nc-nd/2.5/mx/
+http://creativecommons.org/licenses/by-nc-nd/2.5/my/
+http://creativecommons.org/licenses/by-nc-nd/2.5/nl/
+http://creativecommons.org/licenses/by-nc-nd/2.5/pe/
+http://creativecommons.org/licenses/by-nc-nd/2.5/pl/
+http://creativecommons.org/licenses/by-nc-nd/2.5/pt/
+http://creativecommons.org/licenses/by-nc-nd/2.5/
+http://creativecommons.org/licenses/by-nc-nd/2.5/scotland/
+http://creativecommons.org/licenses/by-nc-nd/2.5/se/
+http://creativecommons.org/licenses/by-nc-nd/2.5/si/
+http://creativecommons.org/licenses/by-nc-nd/2.5/tw/
+http://creativecommons.org/licenses/by-nc-nd/2.5/za/
+http://creativecommons.org/licenses/by-nc-nd/3.0/
+http://creativecommons.org/licenses/by-nc-nd/3.0/us/
+http://creativecommons.org/licenses/by-nc-sa/1.0/fi/
+http://creativecommons.org/licenses/by-nc-sa/1.0/il/
+http://creativecommons.org/licenses/by-nc-sa/1.0/nl/
+http://creativecommons.org/licenses/by-nc-sa/1.0/
+http://creativecommons.org/licenses/by-nc-sa/2.0/at/
+http://creativecommons.org/licenses/by-nc-sa/2.0/au/
+http://creativecommons.org/licenses/by-nc-sa/2.0/be/
+http://creativecommons.org/licenses/by-nc-sa/2.0/br/
+http://creativecommons.org/licenses/by-nc-sa/2.0/ca/
+http://creativecommons.org/licenses/by-nc-sa/2.0/cl/
+http://creativecommons.org/licenses/by-nc-sa/2.0/de/
+http://creativecommons.org/licenses/by-nc-sa/2.0/es/
+http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
+http://creativecommons.org/licenses/by-nc-sa/2.0/hr/
+http://creativecommons.org/licenses/by-nc-sa/2.0/it/
+http://creativecommons.org/licenses/by-nc-sa/2.0/jp/
+http://creativecommons.org/licenses/by-nc-sa/2.0/kr/
+http://creativecommons.org/licenses/by-nc-sa/2.0/nl/
+http://creativecommons.org/licenses/by-nc-sa/2.0/pl/
+http://creativecommons.org/licenses/by-nc-sa/2.0/
+http://creativecommons.org/licenses/by-nc-sa/2.0/tw/
+http://creativecommons.org/licenses/by-nc-sa/2.0/uk/
+http://creativecommons.org/licenses/by-nc-sa/2.0/za/
+http://creativecommons.org/licenses/by-nc-sa/2.1/au/
+http://creativecommons.org/licenses/by-nc-sa/2.1/es/
+http://creativecommons.org/licenses/by-nc-sa/2.1/jp/
+http://creativecommons.org/licenses/by-nc-sa/2.5/ar/
+http://creativecommons.org/licenses/by-nc-sa/2.5/au/
+http://creativecommons.org/licenses/by-nc-sa/2.5/bg/
+http://creativecommons.org/licenses/by-nc-sa/2.5/br/
+http://creativecommons.org/licenses/by-nc-sa/2.5/ca/
+http://creativecommons.org/licenses/by-nc-sa/2.5/ch/
+http://creativecommons.org/licenses/by-nc-sa/2.5/cn/
+http://creativecommons.org/licenses/by-nc-sa/2.5/co/
+http://creativecommons.org/licenses/by-nc-sa/2.5/dk/
+http://creativecommons.org/licenses/by-nc-sa/2.5/es/
+http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
+http://creativecommons.org/licenses/by-nc-sa/2.5/hu/
+http://creativecommons.org/licenses/by-nc-sa/2.5/il/
+http://creativecommons.org/licenses/by-nc-sa/2.5/in/
+http://creativecommons.org/licenses/by-nc-sa/2.5/it/
+http://creativecommons.org/licenses/by-nc-sa/2.5/mk/
+http://creativecommons.org/licenses/by-nc-sa/2.5/mt/
+http://creativecommons.org/licenses/by-nc-sa/2.5/mx/
+http://creativecommons.org/licenses/by-nc-sa/2.5/my/
+http://creativecommons.org/licenses/by-nc-sa/2.5/nl/
+http://creativecommons.org/licenses/by-nc-sa/2.5/pe/
+http://creativecommons.org/licenses/by-nc-sa/2.5/pl/
+http://creativecommons.org/licenses/by-nc-sa/2.5/pt/
+http://creativecommons.org/licenses/by-nc-sa/2.5/
+http://creativecommons.org/licenses/by-nc-sa/2.5/scotland/
+http://creativecommons.org/licenses/by-nc-sa/2.5/se/
+http://creativecommons.org/licenses/by-nc-sa/2.5/si/
+http://creativecommons.org/licenses/by-nc-sa/2.5/tw/
+http://creativecommons.org/licenses/by-nc-sa/2.5/za/
+http://creativecommons.org/licenses/by-nc-sa/3.0/
+http://creativecommons.org/licenses/by-nc-sa/3.0/us/
+http://creativecommons.org/licenses/by-nd/1.0/fi/
+http://creativecommons.org/licenses/by-nd/1.0/il/
+http://creativecommons.org/licenses/by-nd/1.0/nl/
+http://creativecommons.org/licenses/by-nd/1.0/
+http://creativecommons.org/licenses/by-nd/2.0/at/
+http://creativecommons.org/licenses/by-nd/2.0/au/
+http://creativecommons.org/licenses/by-nd/2.0/be/
+http://creativecommons.org/licenses/by-nd/2.0/br/
+http://creativecommons.org/licenses/by-nd/2.0/ca/
+http://creativecommons.org/licenses/by-nd/2.0/cl/
+http://creativecommons.org/licenses/by-nd/2.0/de/
+http://creativecommons.org/licenses/by-nd/2.0/es/
+http://creativecommons.org/licenses/by-nd/2.0/fr/
+http://creativecommons.org/licenses/by-nd/2.0/hr/
+http://creativecommons.org/licenses/by-nd/2.0/it/
+http://creativecommons.org/licenses/by-nd/2.0/jp/
+http://creativecommons.org/licenses/by-nd/2.0/kr/
+http://creativecommons.org/licenses/by-nd/2.0/nl/
+http://creativecommons.org/licenses/by-nd/2.0/pl/
+http://creativecommons.org/licenses/by-nd/2.0/
+http://creativecommons.org/licenses/by-nd/2.0/tw/
+http://creativecommons.org/licenses/by-nd/2.0/uk/
+http://creativecommons.org/licenses/by-nd/2.0/za/
+http://creativecommons.org/licenses/by-nd/2.1/au/
+http://creativecommons.org/licenses/by-nd/2.1/es/
+http://creativecommons.org/licenses/by-nd/2.1/jp/
+http://creativecommons.org/licenses/by-nd/2.5/ar/
+http://creativecommons.org/licenses/by-nd/2.5/au/
+http://creativecommons.org/licenses/by-nd/2.5/bg/
+http://creativecommons.org/licenses/by-nd/2.5/br/
+http://creativecommons.org/licenses/by-nd/2.5/ca/
+http://creativecommons.org/licenses/by-nd/2.5/ch/
+http://creativecommons.org/licenses/by-nd/2.5/cn/
+http://creativecommons.org/licenses/by-nd/2.5/co/
+http://creativecommons.org/licenses/by-nd/2.5/dk/
+http://creativecommons.org/licenses/by-nd/2.5/es/
+http://creativecommons.org/licenses/by-nd/2.5/hr/
+http://creativecommons.org/licenses/by-nd/2.5/hu/
+http://creativecommons.org/licenses/by-nd/2.5/il/
+http://creativecommons.org/licenses/by-nd/2.5/in/
+http://creativecommons.org/licenses/by-nd/2.5/it/
+http://creativecommons.org/licenses/by-nd/2.5/mk/
+http://creativecommons.org/licenses/by-nd/2.5/mt/
+http://creativecommons.org/licenses/by-nd/2.5/mx/
+http://creativecommons.org/licenses/by-nd/2.5/my/
+http://creativecommons.org/licenses/by-nd/2.5/nl/
+http://creativecommons.org/licenses/by-nd/2.5/pe/
+http://creativecommons.org/licenses/by-nd/2.5/pl/
+http://creativecommons.org/licenses/by-nd/2.5/pt/
+http://creativecommons.org/licenses/by-nd/2.5/
+http://creativecommons.org/licenses/by-nd/2.5/scotland/
+http://creativecommons.org/licenses/by-nd/2.5/se/
+http://creativecommons.org/licenses/by-nd/2.5/si/
+http://creativecommons.org/licenses/by-nd/2.5/tw/
+http://creativecommons.org/licenses/by-nd/2.5/za/
+http://creativecommons.org/licenses/by-nd/3.0/
+http://creativecommons.org/licenses/by-nd/3.0/us/
+http://creativecommons.org/licenses/by-nd-nc/1.0/fi/
+http://creativecommons.org/licenses/by-nd-nc/1.0/il/
+http://creativecommons.org/licenses/by-nd-nc/1.0/nl/
+http://creativecommons.org/licenses/by-nd-nc/1.0/
+http://creativecommons.org/licenses/by-nd-nc/2.0/jp/
+http://creativecommons.org/licenses/by-sa/1.0/fi/
+http://creativecommons.org/licenses/by-sa/1.0/il/
+http://creativecommons.org/licenses/by-sa/1.0/nl/
+http://creativecommons.org/licenses/by-sa/1.0/
+http://creativecommons.org/licenses/by-sa/2.0/at/
+http://creativecommons.org/licenses/by-sa/2.0/au/
+http://creativecommons.org/licenses/by-sa/2.0/be/
+http://creativecommons.org/licenses/by-sa/2.0/br/
+http://creativecommons.org/licenses/by-sa/2.0/ca/
+http://creativecommons.org/licenses/by-sa/2.0/cl/
+http://creativecommons.org/licenses/by-sa/2.0/de/
+http://creativecommons.org/licenses/by-sa/2.0/es/
+http://creativecommons.org/licenses/by-sa/2.0/fr/
+http://creativecommons.org/licenses/by-sa/2.0/hr/
+http://creativecommons.org/licenses/by-sa/2.0/it/
+http://creativecommons.org/licenses/by-sa/2.0/jp/
+http://creativecommons.org/licenses/by-sa/2.0/kr/
+http://creativecommons.org/licenses/by-sa/2.0/nl/
+http://creativecommons.org/licenses/by-sa/2.0/pl/
+http://creativecommons.org/licenses/by-sa/2.0/
+http://creativecommons.org/licenses/by-sa/2.0/tw/
+http://creativecommons.org/licenses/by-sa/2.0/uk/
+http://creativecommons.org/licenses/by-sa/2.0/za/
+http://creativecommons.org/licenses/by-sa/2.1/au/
+http://creativecommons.org/licenses/by-sa/2.1/es/
+http://creativecommons.org/licenses/by-sa/2.1/jp/
+http://creativecommons.org/licenses/by-sa/2.5/ar/
+http://creativecommons.org/licenses/by-sa/2.5/au/
+http://creativecommons.org/licenses/by-sa/2.5/bg/
+http://creativecommons.org/licenses/by-sa/2.5/br/
+http://creativecommons.org/licenses/by-sa/2.5/ca/
+http://creativecommons.org/licenses/by-sa/2.5/ch/
+http://creativecommons.org/licenses/by-sa/2.5/cn/
+http://creativecommons.org/licenses/by-sa/2.5/co/
+http://creativecommons.org/licenses/by-sa/2.5/dk/
+http://creativecommons.org/licenses/by-sa/2.5/es/
+http://creativecommons.org/licenses/by-sa/2.5/hr/
+http://creativecommons.org/licenses/by-sa/2.5/hu/
+http://creativecommons.org/licenses/by-sa/2.5/il/
+http://creativecommons.org/licenses/by-sa/2.5/in/
+http://creativecommons.org/licenses/by-sa/2.5/it/
+http://creativecommons.org/licenses/by-sa/2.5/mk/
+http://creativecommons.org/licenses/by-sa/2.5/mt/
+http://creativecommons.org/licenses/by-sa/2.5/mx/
+http://creativecommons.org/licenses/by-sa/2.5/my/
+http://creativecommons.org/licenses/by-sa/2.5/nl/
+http://creativecommons.org/licenses/by-sa/2.5/pe/
+http://creativecommons.org/licenses/by-sa/2.5/pl/
+http://creativecommons.org/licenses/by-sa/2.5/pt/
+http://creativecommons.org/licenses/by-sa/2.5/
+http://creativecommons.org/licenses/by-sa/2.5/scotland/
+http://creativecommons.org/licenses/by-sa/2.5/se/
+http://creativecommons.org/licenses/by-sa/2.5/si/
+http://creativecommons.org/licenses/by-sa/2.5/tw/
+http://creativecommons.org/licenses/by-sa/2.5/za/
+http://creativecommons.org/licenses/by-sa/3.0/
+http://creativecommons.org/licenses/by-sa/3.0/us/
+http://creativecommons.org/licenses/devnations/2.0/
+http://creativecommons.org/licenses/GPL/2.0/
+http://creativecommons.org/licenses/LGPL/2.1/
+http://creativecommons.org/licenses/nc/1.0/fi/
+http://creativecommons.org/licenses/nc/1.0/nl/
+http://creativecommons.org/licenses/nc/1.0/
+http://creativecommons.org/licenses/nc/2.0/jp/
+http://creativecommons.org/licenses/nc-sa/1.0/fi/
+http://creativecommons.org/licenses/nc-sa/1.0/nl/
+http://creativecommons.org/licenses/nc-sa/1.0/
+http://creativecommons.org/licenses/nc-sa/2.0/jp/
+http://creativecommons.org/licenses/nc-sampling+/1.0/
+http://creativecommons.org/licenses/nc-sampling+/1.0/tw/
+http://creativecommons.org/licenses/nd/1.0/fi/
+http://creativecommons.org/licenses/nd/1.0/nl/
+http://creativecommons.org/licenses/nd/1.0/
+http://creativecommons.org/licenses/nd/2.0/jp/
+http://creativecommons.org/licenses/nd-nc/1.0/fi/
+http://creativecommons.org/licenses/nd-nc/1.0/nl/
+http://creativecommons.org/licenses/nd-nc/1.0/
+http://creativecommons.org/licenses/nd-nc/2.0/jp/
+http://creativecommons.org/licenses/publicdomain/
+http://creativecommons.org/licenses/sa/1.0/fi/
+http://creativecommons.org/licenses/sa/1.0/nl/
+http://creativecommons.org/licenses/sa/1.0/
+http://creativecommons.org/licenses/sa/2.0/jp/
+http://creativecommons.org/licenses/sampling/1.0/br/
+http://creativecommons.org/licenses/sampling+/1.0/br/
+http://creativecommons.org/licenses/sampling+/1.0/de/
+http://creativecommons.org/licenses/sampling/1.0/
+http://creativecommons.org/licenses/sampling+/1.0/
+http://creativecommons.org/licenses/sampling/1.0/tw/
+http://creativecommons.org/licenses/sampling+/1.0/tw/
diff --git a/tests/files/partialframe.mjpeg b/tests/files/partialframe.mjpeg
new file mode 100644
index 0000000..fe8621e
--- /dev/null
+++ b/tests/files/partialframe.mjpeg
Binary files differ
diff --git a/tests/files/test.mp3 b/tests/files/test.mp3
new file mode 100644
index 0000000..304892c
--- /dev/null
+++ b/tests/files/test.mp3
Binary files differ
diff --git a/tests/icles/Makefile.am b/tests/icles/Makefile.am
new file mode 100644
index 0000000..de853c4
--- /dev/null
+++ b/tests/icles/Makefile.am
@@ -0,0 +1,85 @@
+SUBDIRS = playback
+DIST_SUBDIRS = playback
+
+if USE_X
+X_TESTS = stress-videooverlay
+
+stress_videooverlay_SOURCES = stress-videooverlay.c
+stress_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+stress_videooverlay_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM)
+
+if HAVE_GTK_X11
+X_TESTS += test-colorkey test-videooverlay
+
+test_colorkey_SOURCES = test-colorkey.c
+test_colorkey_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+test_colorkey_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+
+test_videooverlay_SOURCES = test-videooverlay.c
+test_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+test_videooverlay_LDADD = \
+ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+endif
+
+output_selector_test_SOURCES = output-selector-test.c
+output_selector_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+output_selector_test_LDADD = $(GST_LIBS)
+output_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+
+input_selector_test_SOURCES = input-selector-test.c
+input_selector_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+input_selector_test_LDADD = $(GST_LIBS)
+input_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+
+X_TESTS += output-selector-test input-selector-test
+
+else
+X_TESTS =
+endif
+
+if USE_PANGO
+PANGO_TESTS = test-textoverlay
+
+test_textoverlay_SOURCES = test-textoverlay.c
+test_textoverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_textoverlay_LDADD = $(GST_LIBS) $(LIBM)
+
+else
+PANGO_TESTS =
+endif
+
+audio_trickplay_SOURCES = audio-trickplay.c
+audio_trickplay_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS)
+audio_trickplay_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(LIBM)
+
+playbin_text_SOURCES = playbin-text.c
+playbin_text_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+playbin_text_LDADD = $(GST_LIBS) $(LIBM)
+
+position_formats_SOURCES = position-formats.c
+position_formats_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+position_formats_LDADD = $(GST_LIBS) $(LIBM)
+
+stress_playbin_SOURCES = stress-playbin.c
+stress_playbin_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+stress_playbin_LDADD = $(GST_LIBS) $(LIBM)
+
+test_scale_SOURCES = test-scale.c
+test_scale_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_scale_LDADD = $(GST_LIBS) $(LIBM)
+
+test_box_SOURCES = test-box.c
+test_box_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_box_LDADD = $(GST_LIBS) $(LIBM)
+
+noinst_PROGRAMS = $(X_TESTS) $(PANGO_TESTS) \
+ audio-trickplay playbin-text position-formats stress-playbin \
+ test-scale test-box
diff --git a/tests/icles/Makefile.in b/tests/icles/Makefile.in
new file mode 100644
index 0000000..11e1372
--- /dev/null
+++ b/tests/icles/Makefile.in
@@ -0,0 +1,1260 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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_X11_TRUE@@USE_X_TRUE@am__append_1 = test-colorkey test-videooverlay
+noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ audio-trickplay$(EXEEXT) playbin-text$(EXEEXT) \
+ position-formats$(EXEEXT) stress-playbin$(EXEEXT) \
+ test-scale$(EXEEXT) test-box$(EXEEXT)
+subdir = tests/icles
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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_X11_TRUE@@USE_X_TRUE@am__EXEEXT_1 = test-colorkey$(EXEEXT) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ test-videooverlay$(EXEEXT)
+@USE_X_TRUE@am__EXEEXT_2 = stress-videooverlay$(EXEEXT) \
+@USE_X_TRUE@ $(am__EXEEXT_1) output-selector-test$(EXEEXT) \
+@USE_X_TRUE@ input-selector-test$(EXEEXT)
+@USE_PANGO_TRUE@am__EXEEXT_3 = test-textoverlay$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_audio_trickplay_OBJECTS = \
+ audio_trickplay-audio-trickplay.$(OBJEXT)
+audio_trickplay_OBJECTS = $(am_audio_trickplay_OBJECTS)
+am__DEPENDENCIES_1 =
+audio_trickplay_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+audio_trickplay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(audio_trickplay_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__input_selector_test_SOURCES_DIST = input-selector-test.c
+@USE_X_TRUE@am_input_selector_test_OBJECTS = \
+@USE_X_TRUE@ input_selector_test-input-selector-test.$(OBJEXT)
+input_selector_test_OBJECTS = $(am_input_selector_test_OBJECTS)
+@USE_X_TRUE@input_selector_test_DEPENDENCIES = $(am__DEPENDENCIES_1)
+input_selector_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(input_selector_test_CFLAGS) $(CFLAGS) \
+ $(input_selector_test_LDFLAGS) $(LDFLAGS) -o $@
+am__output_selector_test_SOURCES_DIST = output-selector-test.c
+@USE_X_TRUE@am_output_selector_test_OBJECTS = output_selector_test-output-selector-test.$(OBJEXT)
+output_selector_test_OBJECTS = $(am_output_selector_test_OBJECTS)
+@USE_X_TRUE@output_selector_test_DEPENDENCIES = $(am__DEPENDENCIES_1)
+output_selector_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(output_selector_test_CFLAGS) $(CFLAGS) \
+ $(output_selector_test_LDFLAGS) $(LDFLAGS) -o $@
+am_playbin_text_OBJECTS = playbin_text-playbin-text.$(OBJEXT)
+playbin_text_OBJECTS = $(am_playbin_text_OBJECTS)
+playbin_text_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+playbin_text_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(playbin_text_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_position_formats_OBJECTS = \
+ position_formats-position-formats.$(OBJEXT)
+position_formats_OBJECTS = $(am_position_formats_OBJECTS)
+position_formats_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+position_formats_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(position_formats_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_stress_playbin_OBJECTS = stress_playbin-stress-playbin.$(OBJEXT)
+stress_playbin_OBJECTS = $(am_stress_playbin_OBJECTS)
+stress_playbin_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+stress_playbin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(stress_playbin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+am__stress_videooverlay_SOURCES_DIST = stress-videooverlay.c
+@USE_X_TRUE@am_stress_videooverlay_OBJECTS = \
+@USE_X_TRUE@ stress_videooverlay-stress-videooverlay.$(OBJEXT)
+stress_videooverlay_OBJECTS = $(am_stress_videooverlay_OBJECTS)
+@USE_X_TRUE@stress_videooverlay_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@USE_X_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+stress_videooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(stress_videooverlay_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_test_box_OBJECTS = test_box-test-box.$(OBJEXT)
+test_box_OBJECTS = $(am_test_box_OBJECTS)
+test_box_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+test_box_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_box_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__test_colorkey_SOURCES_DIST = test-colorkey.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@am_test_colorkey_OBJECTS = test_colorkey-test-colorkey.$(OBJEXT)
+test_colorkey_OBJECTS = $(am_test_colorkey_OBJECTS)
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_colorkey_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+test_colorkey_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_colorkey_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_test_scale_OBJECTS = test_scale-test-scale.$(OBJEXT)
+test_scale_OBJECTS = $(am_test_scale_OBJECTS)
+test_scale_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+test_scale_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_scale_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__test_textoverlay_SOURCES_DIST = test-textoverlay.c
+@USE_PANGO_TRUE@am_test_textoverlay_OBJECTS = \
+@USE_PANGO_TRUE@ test_textoverlay-test-textoverlay.$(OBJEXT)
+test_textoverlay_OBJECTS = $(am_test_textoverlay_OBJECTS)
+@USE_PANGO_TRUE@test_textoverlay_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+@USE_PANGO_TRUE@ $(am__DEPENDENCIES_1)
+test_textoverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(test_textoverlay_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__test_videooverlay_SOURCES_DIST = test-videooverlay.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@am_test_videooverlay_OBJECTS = test_videooverlay-test-videooverlay.$(OBJEXT)
+test_videooverlay_OBJECTS = $(am_test_videooverlay_OBJECTS)
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_videooverlay_DEPENDENCIES = $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(am__DEPENDENCIES_1)
+test_videooverlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(test_videooverlay_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(audio_trickplay_SOURCES) $(input_selector_test_SOURCES) \
+ $(output_selector_test_SOURCES) $(playbin_text_SOURCES) \
+ $(position_formats_SOURCES) $(stress_playbin_SOURCES) \
+ $(stress_videooverlay_SOURCES) $(test_box_SOURCES) \
+ $(test_colorkey_SOURCES) $(test_scale_SOURCES) \
+ $(test_textoverlay_SOURCES) $(test_videooverlay_SOURCES)
+DIST_SOURCES = $(audio_trickplay_SOURCES) \
+ $(am__input_selector_test_SOURCES_DIST) \
+ $(am__output_selector_test_SOURCES_DIST) \
+ $(playbin_text_SOURCES) $(position_formats_SOURCES) \
+ $(stress_playbin_SOURCES) \
+ $(am__stress_videooverlay_SOURCES_DIST) $(test_box_SOURCES) \
+ $(am__test_colorkey_SOURCES_DIST) $(test_scale_SOURCES) \
+ $(am__test_textoverlay_SOURCES_DIST) \
+ $(am__test_videooverlay_SOURCES_DIST)
+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"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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 = playback
+DIST_SUBDIRS = playback
+@USE_X_FALSE@X_TESTS =
+@USE_X_TRUE@X_TESTS = stress-videooverlay $(am__append_1) \
+@USE_X_TRUE@ output-selector-test input-selector-test
+@USE_X_TRUE@stress_videooverlay_SOURCES = stress-videooverlay.c
+@USE_X_TRUE@stress_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+@USE_X_TRUE@ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS)
+
+@USE_X_TRUE@stress_videooverlay_LDADD = \
+@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM)
+
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_colorkey_SOURCES = test-colorkey.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_colorkey_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_colorkey_LDADD = \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_videooverlay_SOURCES = test-videooverlay.c
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_videooverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(GTK_CFLAGS)
+
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@test_videooverlay_LDADD = \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
+@HAVE_GTK_X11_TRUE@@USE_X_TRUE@ $(GST_LIBS) $(X_LIBS) $(LIBM) $(GTK_LIBS)
+
+@USE_X_TRUE@output_selector_test_SOURCES = output-selector-test.c
+@USE_X_TRUE@output_selector_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+@USE_X_TRUE@output_selector_test_LDADD = $(GST_LIBS)
+@USE_X_TRUE@output_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+@USE_X_TRUE@input_selector_test_SOURCES = input-selector-test.c
+@USE_X_TRUE@input_selector_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+@USE_X_TRUE@input_selector_test_LDADD = $(GST_LIBS)
+@USE_X_TRUE@input_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+@USE_PANGO_FALSE@PANGO_TESTS =
+@USE_PANGO_TRUE@PANGO_TESTS = test-textoverlay
+@USE_PANGO_TRUE@test_textoverlay_SOURCES = test-textoverlay.c
+@USE_PANGO_TRUE@test_textoverlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+@USE_PANGO_TRUE@test_textoverlay_LDADD = $(GST_LIBS) $(LIBM)
+audio_trickplay_SOURCES = audio-trickplay.c
+audio_trickplay_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS)
+audio_trickplay_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(LIBM)
+playbin_text_SOURCES = playbin-text.c
+playbin_text_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+playbin_text_LDADD = $(GST_LIBS) $(LIBM)
+position_formats_SOURCES = position-formats.c
+position_formats_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+position_formats_LDADD = $(GST_LIBS) $(LIBM)
+stress_playbin_SOURCES = stress-playbin.c
+stress_playbin_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+stress_playbin_LDADD = $(GST_LIBS) $(LIBM)
+test_scale_SOURCES = test-scale.c
+test_scale_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_scale_LDADD = $(GST_LIBS) $(LIBM)
+test_box_SOURCES = test-box.c
+test_box_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_box_LDADD = $(GST_LIBS) $(LIBM)
+all: all-recursive
+
+.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/icles/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/icles/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
+audio-trickplay$(EXEEXT): $(audio_trickplay_OBJECTS) $(audio_trickplay_DEPENDENCIES)
+ @rm -f audio-trickplay$(EXEEXT)
+ $(AM_V_CCLD)$(audio_trickplay_LINK) $(audio_trickplay_OBJECTS) $(audio_trickplay_LDADD) $(LIBS)
+input-selector-test$(EXEEXT): $(input_selector_test_OBJECTS) $(input_selector_test_DEPENDENCIES)
+ @rm -f input-selector-test$(EXEEXT)
+ $(AM_V_CCLD)$(input_selector_test_LINK) $(input_selector_test_OBJECTS) $(input_selector_test_LDADD) $(LIBS)
+output-selector-test$(EXEEXT): $(output_selector_test_OBJECTS) $(output_selector_test_DEPENDENCIES)
+ @rm -f output-selector-test$(EXEEXT)
+ $(AM_V_CCLD)$(output_selector_test_LINK) $(output_selector_test_OBJECTS) $(output_selector_test_LDADD) $(LIBS)
+playbin-text$(EXEEXT): $(playbin_text_OBJECTS) $(playbin_text_DEPENDENCIES)
+ @rm -f playbin-text$(EXEEXT)
+ $(AM_V_CCLD)$(playbin_text_LINK) $(playbin_text_OBJECTS) $(playbin_text_LDADD) $(LIBS)
+position-formats$(EXEEXT): $(position_formats_OBJECTS) $(position_formats_DEPENDENCIES)
+ @rm -f position-formats$(EXEEXT)
+ $(AM_V_CCLD)$(position_formats_LINK) $(position_formats_OBJECTS) $(position_formats_LDADD) $(LIBS)
+stress-playbin$(EXEEXT): $(stress_playbin_OBJECTS) $(stress_playbin_DEPENDENCIES)
+ @rm -f stress-playbin$(EXEEXT)
+ $(AM_V_CCLD)$(stress_playbin_LINK) $(stress_playbin_OBJECTS) $(stress_playbin_LDADD) $(LIBS)
+stress-videooverlay$(EXEEXT): $(stress_videooverlay_OBJECTS) $(stress_videooverlay_DEPENDENCIES)
+ @rm -f stress-videooverlay$(EXEEXT)
+ $(AM_V_CCLD)$(stress_videooverlay_LINK) $(stress_videooverlay_OBJECTS) $(stress_videooverlay_LDADD) $(LIBS)
+test-box$(EXEEXT): $(test_box_OBJECTS) $(test_box_DEPENDENCIES)
+ @rm -f test-box$(EXEEXT)
+ $(AM_V_CCLD)$(test_box_LINK) $(test_box_OBJECTS) $(test_box_LDADD) $(LIBS)
+test-colorkey$(EXEEXT): $(test_colorkey_OBJECTS) $(test_colorkey_DEPENDENCIES)
+ @rm -f test-colorkey$(EXEEXT)
+ $(AM_V_CCLD)$(test_colorkey_LINK) $(test_colorkey_OBJECTS) $(test_colorkey_LDADD) $(LIBS)
+test-scale$(EXEEXT): $(test_scale_OBJECTS) $(test_scale_DEPENDENCIES)
+ @rm -f test-scale$(EXEEXT)
+ $(AM_V_CCLD)$(test_scale_LINK) $(test_scale_OBJECTS) $(test_scale_LDADD) $(LIBS)
+test-textoverlay$(EXEEXT): $(test_textoverlay_OBJECTS) $(test_textoverlay_DEPENDENCIES)
+ @rm -f test-textoverlay$(EXEEXT)
+ $(AM_V_CCLD)$(test_textoverlay_LINK) $(test_textoverlay_OBJECTS) $(test_textoverlay_LDADD) $(LIBS)
+test-videooverlay$(EXEEXT): $(test_videooverlay_OBJECTS) $(test_videooverlay_DEPENDENCIES)
+ @rm -f test-videooverlay$(EXEEXT)
+ $(AM_V_CCLD)$(test_videooverlay_LINK) $(test_videooverlay_OBJECTS) $(test_videooverlay_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_trickplay-audio-trickplay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input_selector_test-input-selector-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output_selector_test-output-selector-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playbin_text-playbin-text.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/position_formats-position-formats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress_playbin-stress-playbin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress_videooverlay-stress-videooverlay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_box-test-box.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_colorkey-test-colorkey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_scale-test-scale.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_textoverlay-test-textoverlay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_videooverlay-test-videooverlay.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+audio_trickplay-audio-trickplay.o: audio-trickplay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_trickplay_CFLAGS) $(CFLAGS) -MT audio_trickplay-audio-trickplay.o -MD -MP -MF $(DEPDIR)/audio_trickplay-audio-trickplay.Tpo -c -o audio_trickplay-audio-trickplay.o `test -f 'audio-trickplay.c' || echo '$(srcdir)/'`audio-trickplay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audio_trickplay-audio-trickplay.Tpo $(DEPDIR)/audio_trickplay-audio-trickplay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio-trickplay.c' object='audio_trickplay-audio-trickplay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_trickplay_CFLAGS) $(CFLAGS) -c -o audio_trickplay-audio-trickplay.o `test -f 'audio-trickplay.c' || echo '$(srcdir)/'`audio-trickplay.c
+
+audio_trickplay-audio-trickplay.obj: audio-trickplay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_trickplay_CFLAGS) $(CFLAGS) -MT audio_trickplay-audio-trickplay.obj -MD -MP -MF $(DEPDIR)/audio_trickplay-audio-trickplay.Tpo -c -o audio_trickplay-audio-trickplay.obj `if test -f 'audio-trickplay.c'; then $(CYGPATH_W) 'audio-trickplay.c'; else $(CYGPATH_W) '$(srcdir)/audio-trickplay.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audio_trickplay-audio-trickplay.Tpo $(DEPDIR)/audio_trickplay-audio-trickplay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio-trickplay.c' object='audio_trickplay-audio-trickplay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_trickplay_CFLAGS) $(CFLAGS) -c -o audio_trickplay-audio-trickplay.obj `if test -f 'audio-trickplay.c'; then $(CYGPATH_W) 'audio-trickplay.c'; else $(CYGPATH_W) '$(srcdir)/audio-trickplay.c'; fi`
+
+input_selector_test-input-selector-test.o: input-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(input_selector_test_CFLAGS) $(CFLAGS) -MT input_selector_test-input-selector-test.o -MD -MP -MF $(DEPDIR)/input_selector_test-input-selector-test.Tpo -c -o input_selector_test-input-selector-test.o `test -f 'input-selector-test.c' || echo '$(srcdir)/'`input-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/input_selector_test-input-selector-test.Tpo $(DEPDIR)/input_selector_test-input-selector-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='input-selector-test.c' object='input_selector_test-input-selector-test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(input_selector_test_CFLAGS) $(CFLAGS) -c -o input_selector_test-input-selector-test.o `test -f 'input-selector-test.c' || echo '$(srcdir)/'`input-selector-test.c
+
+input_selector_test-input-selector-test.obj: input-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(input_selector_test_CFLAGS) $(CFLAGS) -MT input_selector_test-input-selector-test.obj -MD -MP -MF $(DEPDIR)/input_selector_test-input-selector-test.Tpo -c -o input_selector_test-input-selector-test.obj `if test -f 'input-selector-test.c'; then $(CYGPATH_W) 'input-selector-test.c'; else $(CYGPATH_W) '$(srcdir)/input-selector-test.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/input_selector_test-input-selector-test.Tpo $(DEPDIR)/input_selector_test-input-selector-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='input-selector-test.c' object='input_selector_test-input-selector-test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(input_selector_test_CFLAGS) $(CFLAGS) -c -o input_selector_test-input-selector-test.obj `if test -f 'input-selector-test.c'; then $(CYGPATH_W) 'input-selector-test.c'; else $(CYGPATH_W) '$(srcdir)/input-selector-test.c'; fi`
+
+output_selector_test-output-selector-test.o: output-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(output_selector_test_CFLAGS) $(CFLAGS) -MT output_selector_test-output-selector-test.o -MD -MP -MF $(DEPDIR)/output_selector_test-output-selector-test.Tpo -c -o output_selector_test-output-selector-test.o `test -f 'output-selector-test.c' || echo '$(srcdir)/'`output-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/output_selector_test-output-selector-test.Tpo $(DEPDIR)/output_selector_test-output-selector-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='output-selector-test.c' object='output_selector_test-output-selector-test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(output_selector_test_CFLAGS) $(CFLAGS) -c -o output_selector_test-output-selector-test.o `test -f 'output-selector-test.c' || echo '$(srcdir)/'`output-selector-test.c
+
+output_selector_test-output-selector-test.obj: output-selector-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(output_selector_test_CFLAGS) $(CFLAGS) -MT output_selector_test-output-selector-test.obj -MD -MP -MF $(DEPDIR)/output_selector_test-output-selector-test.Tpo -c -o output_selector_test-output-selector-test.obj `if test -f 'output-selector-test.c'; then $(CYGPATH_W) 'output-selector-test.c'; else $(CYGPATH_W) '$(srcdir)/output-selector-test.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/output_selector_test-output-selector-test.Tpo $(DEPDIR)/output_selector_test-output-selector-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='output-selector-test.c' object='output_selector_test-output-selector-test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(output_selector_test_CFLAGS) $(CFLAGS) -c -o output_selector_test-output-selector-test.obj `if test -f 'output-selector-test.c'; then $(CYGPATH_W) 'output-selector-test.c'; else $(CYGPATH_W) '$(srcdir)/output-selector-test.c'; fi`
+
+playbin_text-playbin-text.o: playbin-text.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playbin_text_CFLAGS) $(CFLAGS) -MT playbin_text-playbin-text.o -MD -MP -MF $(DEPDIR)/playbin_text-playbin-text.Tpo -c -o playbin_text-playbin-text.o `test -f 'playbin-text.c' || echo '$(srcdir)/'`playbin-text.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/playbin_text-playbin-text.Tpo $(DEPDIR)/playbin_text-playbin-text.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='playbin-text.c' object='playbin_text-playbin-text.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playbin_text_CFLAGS) $(CFLAGS) -c -o playbin_text-playbin-text.o `test -f 'playbin-text.c' || echo '$(srcdir)/'`playbin-text.c
+
+playbin_text-playbin-text.obj: playbin-text.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playbin_text_CFLAGS) $(CFLAGS) -MT playbin_text-playbin-text.obj -MD -MP -MF $(DEPDIR)/playbin_text-playbin-text.Tpo -c -o playbin_text-playbin-text.obj `if test -f 'playbin-text.c'; then $(CYGPATH_W) 'playbin-text.c'; else $(CYGPATH_W) '$(srcdir)/playbin-text.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/playbin_text-playbin-text.Tpo $(DEPDIR)/playbin_text-playbin-text.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='playbin-text.c' object='playbin_text-playbin-text.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(playbin_text_CFLAGS) $(CFLAGS) -c -o playbin_text-playbin-text.obj `if test -f 'playbin-text.c'; then $(CYGPATH_W) 'playbin-text.c'; else $(CYGPATH_W) '$(srcdir)/playbin-text.c'; fi`
+
+position_formats-position-formats.o: position-formats.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(position_formats_CFLAGS) $(CFLAGS) -MT position_formats-position-formats.o -MD -MP -MF $(DEPDIR)/position_formats-position-formats.Tpo -c -o position_formats-position-formats.o `test -f 'position-formats.c' || echo '$(srcdir)/'`position-formats.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/position_formats-position-formats.Tpo $(DEPDIR)/position_formats-position-formats.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='position-formats.c' object='position_formats-position-formats.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(position_formats_CFLAGS) $(CFLAGS) -c -o position_formats-position-formats.o `test -f 'position-formats.c' || echo '$(srcdir)/'`position-formats.c
+
+position_formats-position-formats.obj: position-formats.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(position_formats_CFLAGS) $(CFLAGS) -MT position_formats-position-formats.obj -MD -MP -MF $(DEPDIR)/position_formats-position-formats.Tpo -c -o position_formats-position-formats.obj `if test -f 'position-formats.c'; then $(CYGPATH_W) 'position-formats.c'; else $(CYGPATH_W) '$(srcdir)/position-formats.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/position_formats-position-formats.Tpo $(DEPDIR)/position_formats-position-formats.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='position-formats.c' object='position_formats-position-formats.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(position_formats_CFLAGS) $(CFLAGS) -c -o position_formats-position-formats.obj `if test -f 'position-formats.c'; then $(CYGPATH_W) 'position-formats.c'; else $(CYGPATH_W) '$(srcdir)/position-formats.c'; fi`
+
+stress_playbin-stress-playbin.o: stress-playbin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_playbin_CFLAGS) $(CFLAGS) -MT stress_playbin-stress-playbin.o -MD -MP -MF $(DEPDIR)/stress_playbin-stress-playbin.Tpo -c -o stress_playbin-stress-playbin.o `test -f 'stress-playbin.c' || echo '$(srcdir)/'`stress-playbin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress_playbin-stress-playbin.Tpo $(DEPDIR)/stress_playbin-stress-playbin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stress-playbin.c' object='stress_playbin-stress-playbin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_playbin_CFLAGS) $(CFLAGS) -c -o stress_playbin-stress-playbin.o `test -f 'stress-playbin.c' || echo '$(srcdir)/'`stress-playbin.c
+
+stress_playbin-stress-playbin.obj: stress-playbin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_playbin_CFLAGS) $(CFLAGS) -MT stress_playbin-stress-playbin.obj -MD -MP -MF $(DEPDIR)/stress_playbin-stress-playbin.Tpo -c -o stress_playbin-stress-playbin.obj `if test -f 'stress-playbin.c'; then $(CYGPATH_W) 'stress-playbin.c'; else $(CYGPATH_W) '$(srcdir)/stress-playbin.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress_playbin-stress-playbin.Tpo $(DEPDIR)/stress_playbin-stress-playbin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stress-playbin.c' object='stress_playbin-stress-playbin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_playbin_CFLAGS) $(CFLAGS) -c -o stress_playbin-stress-playbin.obj `if test -f 'stress-playbin.c'; then $(CYGPATH_W) 'stress-playbin.c'; else $(CYGPATH_W) '$(srcdir)/stress-playbin.c'; fi`
+
+stress_videooverlay-stress-videooverlay.o: stress-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_videooverlay_CFLAGS) $(CFLAGS) -MT stress_videooverlay-stress-videooverlay.o -MD -MP -MF $(DEPDIR)/stress_videooverlay-stress-videooverlay.Tpo -c -o stress_videooverlay-stress-videooverlay.o `test -f 'stress-videooverlay.c' || echo '$(srcdir)/'`stress-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress_videooverlay-stress-videooverlay.Tpo $(DEPDIR)/stress_videooverlay-stress-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stress-videooverlay.c' object='stress_videooverlay-stress-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_videooverlay_CFLAGS) $(CFLAGS) -c -o stress_videooverlay-stress-videooverlay.o `test -f 'stress-videooverlay.c' || echo '$(srcdir)/'`stress-videooverlay.c
+
+stress_videooverlay-stress-videooverlay.obj: stress-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_videooverlay_CFLAGS) $(CFLAGS) -MT stress_videooverlay-stress-videooverlay.obj -MD -MP -MF $(DEPDIR)/stress_videooverlay-stress-videooverlay.Tpo -c -o stress_videooverlay-stress-videooverlay.obj `if test -f 'stress-videooverlay.c'; then $(CYGPATH_W) 'stress-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/stress-videooverlay.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress_videooverlay-stress-videooverlay.Tpo $(DEPDIR)/stress_videooverlay-stress-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stress-videooverlay.c' object='stress_videooverlay-stress-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stress_videooverlay_CFLAGS) $(CFLAGS) -c -o stress_videooverlay-stress-videooverlay.obj `if test -f 'stress-videooverlay.c'; then $(CYGPATH_W) 'stress-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/stress-videooverlay.c'; fi`
+
+test_box-test-box.o: test-box.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_box_CFLAGS) $(CFLAGS) -MT test_box-test-box.o -MD -MP -MF $(DEPDIR)/test_box-test-box.Tpo -c -o test_box-test-box.o `test -f 'test-box.c' || echo '$(srcdir)/'`test-box.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_box-test-box.Tpo $(DEPDIR)/test_box-test-box.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-box.c' object='test_box-test-box.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_box_CFLAGS) $(CFLAGS) -c -o test_box-test-box.o `test -f 'test-box.c' || echo '$(srcdir)/'`test-box.c
+
+test_box-test-box.obj: test-box.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_box_CFLAGS) $(CFLAGS) -MT test_box-test-box.obj -MD -MP -MF $(DEPDIR)/test_box-test-box.Tpo -c -o test_box-test-box.obj `if test -f 'test-box.c'; then $(CYGPATH_W) 'test-box.c'; else $(CYGPATH_W) '$(srcdir)/test-box.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_box-test-box.Tpo $(DEPDIR)/test_box-test-box.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-box.c' object='test_box-test-box.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_box_CFLAGS) $(CFLAGS) -c -o test_box-test-box.obj `if test -f 'test-box.c'; then $(CYGPATH_W) 'test-box.c'; else $(CYGPATH_W) '$(srcdir)/test-box.c'; fi`
+
+test_colorkey-test-colorkey.o: test-colorkey.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_colorkey_CFLAGS) $(CFLAGS) -MT test_colorkey-test-colorkey.o -MD -MP -MF $(DEPDIR)/test_colorkey-test-colorkey.Tpo -c -o test_colorkey-test-colorkey.o `test -f 'test-colorkey.c' || echo '$(srcdir)/'`test-colorkey.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_colorkey-test-colorkey.Tpo $(DEPDIR)/test_colorkey-test-colorkey.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-colorkey.c' object='test_colorkey-test-colorkey.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_colorkey_CFLAGS) $(CFLAGS) -c -o test_colorkey-test-colorkey.o `test -f 'test-colorkey.c' || echo '$(srcdir)/'`test-colorkey.c
+
+test_colorkey-test-colorkey.obj: test-colorkey.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_colorkey_CFLAGS) $(CFLAGS) -MT test_colorkey-test-colorkey.obj -MD -MP -MF $(DEPDIR)/test_colorkey-test-colorkey.Tpo -c -o test_colorkey-test-colorkey.obj `if test -f 'test-colorkey.c'; then $(CYGPATH_W) 'test-colorkey.c'; else $(CYGPATH_W) '$(srcdir)/test-colorkey.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_colorkey-test-colorkey.Tpo $(DEPDIR)/test_colorkey-test-colorkey.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-colorkey.c' object='test_colorkey-test-colorkey.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_colorkey_CFLAGS) $(CFLAGS) -c -o test_colorkey-test-colorkey.obj `if test -f 'test-colorkey.c'; then $(CYGPATH_W) 'test-colorkey.c'; else $(CYGPATH_W) '$(srcdir)/test-colorkey.c'; fi`
+
+test_scale-test-scale.o: test-scale.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_scale_CFLAGS) $(CFLAGS) -MT test_scale-test-scale.o -MD -MP -MF $(DEPDIR)/test_scale-test-scale.Tpo -c -o test_scale-test-scale.o `test -f 'test-scale.c' || echo '$(srcdir)/'`test-scale.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_scale-test-scale.Tpo $(DEPDIR)/test_scale-test-scale.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-scale.c' object='test_scale-test-scale.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_scale_CFLAGS) $(CFLAGS) -c -o test_scale-test-scale.o `test -f 'test-scale.c' || echo '$(srcdir)/'`test-scale.c
+
+test_scale-test-scale.obj: test-scale.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_scale_CFLAGS) $(CFLAGS) -MT test_scale-test-scale.obj -MD -MP -MF $(DEPDIR)/test_scale-test-scale.Tpo -c -o test_scale-test-scale.obj `if test -f 'test-scale.c'; then $(CYGPATH_W) 'test-scale.c'; else $(CYGPATH_W) '$(srcdir)/test-scale.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_scale-test-scale.Tpo $(DEPDIR)/test_scale-test-scale.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-scale.c' object='test_scale-test-scale.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_scale_CFLAGS) $(CFLAGS) -c -o test_scale-test-scale.obj `if test -f 'test-scale.c'; then $(CYGPATH_W) 'test-scale.c'; else $(CYGPATH_W) '$(srcdir)/test-scale.c'; fi`
+
+test_textoverlay-test-textoverlay.o: test-textoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_textoverlay_CFLAGS) $(CFLAGS) -MT test_textoverlay-test-textoverlay.o -MD -MP -MF $(DEPDIR)/test_textoverlay-test-textoverlay.Tpo -c -o test_textoverlay-test-textoverlay.o `test -f 'test-textoverlay.c' || echo '$(srcdir)/'`test-textoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_textoverlay-test-textoverlay.Tpo $(DEPDIR)/test_textoverlay-test-textoverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-textoverlay.c' object='test_textoverlay-test-textoverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_textoverlay_CFLAGS) $(CFLAGS) -c -o test_textoverlay-test-textoverlay.o `test -f 'test-textoverlay.c' || echo '$(srcdir)/'`test-textoverlay.c
+
+test_textoverlay-test-textoverlay.obj: test-textoverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_textoverlay_CFLAGS) $(CFLAGS) -MT test_textoverlay-test-textoverlay.obj -MD -MP -MF $(DEPDIR)/test_textoverlay-test-textoverlay.Tpo -c -o test_textoverlay-test-textoverlay.obj `if test -f 'test-textoverlay.c'; then $(CYGPATH_W) 'test-textoverlay.c'; else $(CYGPATH_W) '$(srcdir)/test-textoverlay.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_textoverlay-test-textoverlay.Tpo $(DEPDIR)/test_textoverlay-test-textoverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-textoverlay.c' object='test_textoverlay-test-textoverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_textoverlay_CFLAGS) $(CFLAGS) -c -o test_textoverlay-test-textoverlay.obj `if test -f 'test-textoverlay.c'; then $(CYGPATH_W) 'test-textoverlay.c'; else $(CYGPATH_W) '$(srcdir)/test-textoverlay.c'; fi`
+
+test_videooverlay-test-videooverlay.o: test-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_videooverlay_CFLAGS) $(CFLAGS) -MT test_videooverlay-test-videooverlay.o -MD -MP -MF $(DEPDIR)/test_videooverlay-test-videooverlay.Tpo -c -o test_videooverlay-test-videooverlay.o `test -f 'test-videooverlay.c' || echo '$(srcdir)/'`test-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_videooverlay-test-videooverlay.Tpo $(DEPDIR)/test_videooverlay-test-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-videooverlay.c' object='test_videooverlay-test-videooverlay.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_videooverlay_CFLAGS) $(CFLAGS) -c -o test_videooverlay-test-videooverlay.o `test -f 'test-videooverlay.c' || echo '$(srcdir)/'`test-videooverlay.c
+
+test_videooverlay-test-videooverlay.obj: test-videooverlay.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_videooverlay_CFLAGS) $(CFLAGS) -MT test_videooverlay-test-videooverlay.obj -MD -MP -MF $(DEPDIR)/test_videooverlay-test-videooverlay.Tpo -c -o test_videooverlay-test-videooverlay.obj `if test -f 'test-videooverlay.c'; then $(CYGPATH_W) 'test-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/test-videooverlay.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_videooverlay-test-videooverlay.Tpo $(DEPDIR)/test_videooverlay-test-videooverlay.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-videooverlay.c' object='test_videooverlay-test-videooverlay.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_videooverlay_CFLAGS) $(CFLAGS) -c -o test_videooverlay-test-videooverlay.obj `if test -f 'test-videooverlay.c'; then $(CYGPATH_W) 'test-videooverlay.c'; else $(CYGPATH_W) '$(srcdir)/test-videooverlay.c'; fi`
+
+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 $(PROGRAMS)
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile 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 -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile 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 \
+ clean-noinstPROGRAMS ctags ctags-recursive 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 \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile 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/icles/audio-trickplay.c b/tests/icles/audio-trickplay.c
new file mode 100644
index 0000000..1deaaff
--- /dev/null
+++ b/tests/icles/audio-trickplay.c
@@ -0,0 +1,269 @@
+/*
+ * audio-trickplay.c
+ *
+ * Builds a pipeline with two audiotestsources mixed with adder. Assigns
+ * controller patterns to the audio generators and test various trick modes.
+ *
+ * There are currently several issues:
+ * - adder only work with flushing seeks
+ * - there is a gap of almost 4 seconds before backwards playback
+ * - it is "waiting for free space"
+ * - using sync=false on the sink does not help (but has some other weird effects)
+ * - using fakesink shows same behaviour
+ *
+ * GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,default:3,*sink*:4,*ring*:4,*pulse*:5" ./audio-trickplay 2>log.txt
+ * GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,default:3,*sink*:4,*ring*:4,*pulse*:5" ./audio-trickplay -a -f 2>log-af.txt
+ */
+
+#include <gst/gst.h>
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+static void
+check_position (GstElement * elem, GstQuery * pos, const gchar * info)
+{
+ if (gst_element_query (elem, pos)) {
+ gint64 play_pos;
+ gst_query_parse_position (pos, NULL, &play_pos);
+ GST_INFO ("pos : %" GST_TIME_FORMAT " %s", GST_TIME_ARGS (play_pos), info);
+ } else {
+ GST_WARNING ("position query failed");
+ }
+}
+
+static GstProbeReturn
+print_buffer_ts (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstBuffer *buffer = type_data;
+
+ GST_DEBUG_OBJECT (pad, " ts: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+
+ return GST_PROBE_OK;
+}
+
+gint
+main (gint argc, gchar ** argv)
+{
+ gint res = 1;
+ GstElement *src, *mix = NULL, *sink;
+ GstElement *bin;
+ GstController *ctrl;
+ GstInterpolationControlSource *csource1, *csource2;
+ GstClock *clock;
+ GstClockID clock_id;
+ GstClockReturn wait_ret;
+ GValue vol = { 0, };
+ GstEvent *pos_seek, *rate_seek1, *rate_seek2;
+ GstQuery *pos;
+ GstSeekFlags flags;
+ GstPad *src_pad;
+ /* options */
+ gboolean use_adder = FALSE;
+ gboolean use_flush = FALSE;
+ gboolean be_quiet = FALSE;
+
+ gst_init (&argc, &argv);
+ gst_controller_init (&argc, &argv);
+
+ if (argc) {
+ gint arg;
+ for (arg = 0; arg < argc; arg++) {
+ if (!strcmp (argv[arg], "-a"))
+ use_adder = TRUE;
+ else if (!strcmp (argv[arg], "-f"))
+ use_flush = TRUE;
+ else if (!strcmp (argv[arg], "-q"))
+ be_quiet = TRUE;
+ }
+ }
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ clock = gst_pipeline_get_clock (GST_PIPELINE (bin));
+ src = gst_element_factory_make ("audiotestsrc", NULL);
+ if (!src) {
+ GST_WARNING ("need audiotestsrc from gst-plugins-base");
+ goto Error;
+ }
+ if (use_adder) {
+ mix = gst_element_factory_make ("adder", NULL);
+ if (!mix) {
+ GST_WARNING ("need adder from gst-plugins-base");
+ goto Error;
+ }
+ }
+ sink = gst_element_factory_make ((be_quiet ? "fakesink" : "autoaudiosink"),
+ NULL);
+ if (!sink) {
+ GST_WARNING ("need autoaudiosink from gst-plugins-base");
+ goto Error;
+ }
+
+ if (use_adder) {
+ gst_bin_add_many (GST_BIN (bin), src, mix, sink, NULL);
+ if (!gst_element_link_many (src, mix, sink, NULL)) {
+ GST_WARNING ("can't link elements");
+ goto Error;
+ }
+ } else {
+ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
+ if (!gst_element_link_many (src, sink, NULL)) {
+ GST_WARNING ("can't link elements");
+ goto Error;
+ }
+ }
+
+ /* use 10 buffers per second */
+ g_object_set (src, "samplesperbuffer", 44100 / 10, NULL);
+
+ if (be_quiet) {
+ g_object_set (sink, "sync", TRUE, NULL);
+ }
+
+ src_pad = gst_element_get_static_pad (src, "src");
+ gst_pad_add_probe (src_pad, GST_PROBE_TYPE_BUFFER, print_buffer_ts, NULL,
+ NULL);
+ gst_object_unref (src_pad);
+
+ /* add a controller to the source */
+ if (!(ctrl = gst_controller_new (G_OBJECT (src), "freq", "volume", NULL))) {
+ GST_WARNING ("can't control source element");
+ goto Error;
+ }
+
+ csource1 = gst_interpolation_control_source_new ();
+ csource2 = gst_interpolation_control_source_new ();
+
+ gst_controller_set_control_source (ctrl, "volume",
+ GST_CONTROL_SOURCE (csource1));
+ gst_controller_set_control_source (ctrl, "freq",
+ GST_CONTROL_SOURCE (csource2));
+
+ /* Set interpolation mode */
+
+ gst_interpolation_control_source_set_interpolation_mode (csource1,
+ GST_INTERPOLATE_LINEAR);
+ gst_interpolation_control_source_set_interpolation_mode (csource2,
+ GST_INTERPOLATE_LINEAR);
+
+ /* set control values */
+ g_value_init (&vol, G_TYPE_DOUBLE);
+ g_value_set_double (&vol, 0.0);
+ gst_interpolation_control_source_set (csource1, 0 * GST_SECOND, &vol);
+ g_value_set_double (&vol, 1.0);
+ gst_interpolation_control_source_set (csource1, 5 * GST_SECOND, &vol);
+
+ g_object_unref (csource1);
+
+ g_value_set_double (&vol, 220.0);
+ gst_interpolation_control_source_set (csource2, 0 * GST_SECOND, &vol);
+ g_value_set_double (&vol, 3520.0);
+ gst_interpolation_control_source_set (csource2, 2 * GST_SECOND, &vol);
+ g_value_set_double (&vol, 440.0);
+ gst_interpolation_control_source_set (csource2, 6 * GST_SECOND, &vol);
+
+ g_object_unref (csource2);
+
+ /* prepare events */
+ flags = use_flush ? GST_SEEK_FLAG_FLUSH : GST_SEEK_FLAG_NONE;
+ pos_seek = gst_event_new_seek (1.0, GST_FORMAT_TIME, flags,
+ GST_SEEK_TYPE_SET, 3 * GST_SECOND,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ rate_seek1 = gst_event_new_seek (0.5, GST_FORMAT_TIME, flags,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ rate_seek2 = gst_event_new_seek (-1.0, GST_FORMAT_TIME, flags,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+
+ /* prepare queries */
+ pos = gst_query_new_position (GST_FORMAT_TIME);
+
+
+ /* run the show */
+ if (gst_element_set_state (bin, GST_STATE_PAUSED) != GST_STATE_CHANGE_FAILURE) {
+
+ /* run for 5 seconds */
+ clock_id =
+ gst_clock_new_single_shot_id (clock,
+ gst_clock_get_time (clock) + (5 * GST_SECOND));
+
+ if (gst_element_set_state (bin,
+ GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE) {
+ check_position (bin, pos, "start");
+ if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) {
+ GST_WARNING ("clock_id_wait returned: %d", wait_ret);
+ }
+ }
+ gst_clock_id_unref (clock_id);
+
+ check_position (bin, pos, "before seek to new pos");
+
+ /* seek to 3:00 sec (back 2 sec) */
+ if (!gst_element_send_event (sink, pos_seek)) {
+ GST_WARNING ("element failed to seek to new position");
+ }
+
+ check_position (bin, pos, "after seek to new pos");
+
+ /* run for 2 seconds */
+ clock_id =
+ gst_clock_new_single_shot_id (clock,
+ gst_clock_get_time (clock) + (2 * GST_SECOND));
+ if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) {
+ GST_WARNING ("clock_id_wait returned: %d", wait_ret);
+ }
+ gst_clock_id_unref (clock_id);
+
+ check_position (bin, pos, "before slow down rate change");
+
+ /* change playback rate to 0.5 */
+ if (!gst_element_send_event (sink, rate_seek1)) {
+ GST_WARNING ("element failed to change playback rate");
+ }
+
+ check_position (bin, pos, "after slow down rate change");
+
+ /* run for 4 seconds */
+ clock_id =
+ gst_clock_new_single_shot_id (clock,
+ gst_clock_get_time (clock) + (4 * GST_SECOND));
+ if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) {
+ GST_WARNING ("clock_id_wait returned: %d", wait_ret);
+ }
+ gst_clock_id_unref (clock_id);
+
+ check_position (bin, pos, "before reverse rate change");
+
+ /* change playback rate to -1.0 */
+ if (!gst_element_send_event (sink, rate_seek2)) {
+ GST_WARNING ("element failed to change playback rate");
+ }
+
+ check_position (bin, pos, "after reverse rate change");
+
+ /* run for 7 seconds */
+ clock_id =
+ gst_clock_new_single_shot_id (clock,
+ gst_clock_get_time (clock) + (7 * GST_SECOND));
+ if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) {
+ GST_WARNING ("clock_id_wait returned: %d", wait_ret);
+ }
+ gst_clock_id_unref (clock_id);
+
+ check_position (bin, pos, "done");
+
+ gst_element_set_state (bin, GST_STATE_NULL);
+ }
+
+ /* cleanup */
+ gst_query_unref (pos);
+ g_object_unref (G_OBJECT (ctrl));
+ gst_object_unref (G_OBJECT (clock));
+ gst_object_unref (G_OBJECT (bin));
+ res = 0;
+Error:
+ return (res);
+}
diff --git a/tests/icles/input-selector-test.c b/tests/icles/input-selector-test.c
new file mode 100644
index 0000000..4742c03
--- /dev/null
+++ b/tests/icles/input-selector-test.c
@@ -0,0 +1,162 @@
+/* GStreamer
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+
+#include <gst/gst.h>
+
+static GMainLoop *loop = NULL;
+
+static gboolean
+my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
+{
+ g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:{
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &err, &debug);
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+ g_free (debug);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ g_main_loop_quit (loop);
+ break;
+ default:
+ /* unhandled message */
+ break;
+ }
+
+ /* we want to be notified again the next time there is a message
+ * on the bus, so returning TRUE (FALSE means we want to stop watching
+ * for messages on the bus and our callback should not be called again)
+ */
+ return TRUE;
+}
+
+
+
+static gboolean
+switch_timer (GstElement * video_switch)
+{
+ gint nb_sources;
+ GstPad *active_pad, *new_pad;
+ gchar *active_name;
+
+ g_message ("switching");
+ g_object_get (G_OBJECT (video_switch), "n-pads", &nb_sources, NULL);
+ g_object_get (G_OBJECT (video_switch), "active-pad", &active_pad, NULL);
+
+ active_name = gst_pad_get_name (active_pad);
+ if (strcmp (active_name, "sink0") == 0) {
+ new_pad = gst_element_get_static_pad (video_switch, "sink1");
+ } else {
+ new_pad = gst_element_get_static_pad (video_switch, "sink0");
+ }
+ g_object_set (G_OBJECT (video_switch), "active-pad", new_pad, NULL);
+ g_free (active_name);
+ gst_object_unref (new_pad);
+
+ g_message ("current number of sources : %d, active source %s",
+ nb_sources, gst_pad_get_name (active_pad));
+
+ return (GST_STATE (GST_ELEMENT (video_switch)) == GST_STATE_PLAYING);
+}
+
+static void
+last_message_received (GObject * segment)
+{
+ gchar *last_message;
+
+ g_object_get (segment, "last_message", &last_message, NULL);
+ g_print ("last-message: %s\n", last_message);
+ g_free (last_message);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline, *src1, *src2, *video_switch, *video_sink, *segment;
+ GstElement *sink1_sync, *sink2_sync, *capsfilter;
+ GstBus *bus;
+
+ /* Initing GStreamer library */
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src1 = gst_element_factory_make ("videotestsrc", "src1");
+ g_object_set (G_OBJECT (src1), "pattern", 0, NULL);
+ src2 = gst_element_factory_make ("videotestsrc", "src2");
+ g_object_set (G_OBJECT (src2), "pattern", 1, NULL);
+ capsfilter = gst_element_factory_make ("capsfilter", "caps0");
+ g_object_set (G_OBJECT (capsfilter), "caps",
+ gst_caps_from_string ("video/x-raw-rgb,width=640,height=480"), NULL);
+ video_switch = gst_element_factory_make ("input-selector", "video_switch");
+ segment = gst_element_factory_make ("identity", "identity-segment");
+ g_object_set (G_OBJECT (segment), "silent", TRUE, NULL);
+ g_signal_connect (G_OBJECT (segment), "notify::last-message",
+ G_CALLBACK (last_message_received), segment);
+ g_object_set (G_OBJECT (segment), "single-segment", TRUE, NULL);
+ video_sink = gst_element_factory_make ("ximagesink", "video_sink");
+ g_object_set (G_OBJECT (video_sink), "sync", FALSE, NULL);
+ sink1_sync = gst_element_factory_make ("identity", "sink0_sync");
+ g_object_set (G_OBJECT (sink1_sync), "sync", TRUE, NULL);
+ sink2_sync = gst_element_factory_make ("identity", "sink1_sync");
+ g_object_set (G_OBJECT (sink2_sync), "sync", TRUE, NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src1, src2, segment, video_switch,
+ video_sink, sink1_sync, sink2_sync, capsfilter, NULL);
+ gst_element_link (src1, sink1_sync);
+ gst_element_link (sink1_sync, video_switch);
+ gst_element_link (src2, capsfilter);
+ gst_element_link (capsfilter, sink2_sync);
+ gst_element_link (sink2_sync, video_switch);
+ gst_element_link (video_switch, segment);
+ gst_element_link (segment, /*scaler);
+ gst_element_link (scaler, */ video_sink);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+
+ g_timeout_add (200, (GSourceFunc) switch_timer, video_switch);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
+
+ /* unref */
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ exit (0);
+}
diff --git a/tests/icles/output-selector-test.c b/tests/icles/output-selector-test.c
new file mode 100644
index 0000000..6d9b94e
--- /dev/null
+++ b/tests/icles/output-selector-test.c
@@ -0,0 +1,173 @@
+#include <gst/gst.h>
+
+#define SWITCH_TIMEOUT 1000
+#define NUM_VIDEO_BUFFERS 500
+
+static GMainLoop *loop;
+
+/* Output selector src pads */
+static GstPad *osel_src1 = NULL;
+static GstPad *osel_src2 = NULL;
+
+static gboolean
+my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
+{
+ g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:{
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &err, &debug);
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+ g_free (debug);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ g_main_loop_quit (loop);
+ break;
+ default:
+ /* unhandled message */
+ break;
+ }
+ /* we want to be notified again the next time there is a message
+ * on the bus, so returning TRUE (FALSE means we want to stop watching
+ * for messages on the bus and our callback should not be called again)
+ */
+ return TRUE;
+}
+
+static gboolean
+switch_cb (gpointer user_data)
+{
+ GstElement *sel = GST_ELEMENT (user_data);
+ GstPad *old_pad, *new_pad = NULL;
+
+ g_object_get (G_OBJECT (sel), "active-pad", &old_pad, NULL);
+
+ if (old_pad == osel_src1)
+ new_pad = osel_src2;
+ else
+ new_pad = osel_src1;
+
+ g_object_set (G_OBJECT (sel), "active-pad", new_pad, NULL);
+
+ g_print ("switched from %s:%s to %s:%s\n", GST_DEBUG_PAD_NAME (old_pad),
+ GST_DEBUG_PAD_NAME (new_pad));
+
+ gst_object_unref (old_pad);
+
+ return TRUE;
+
+}
+
+static void
+on_bin_element_added (GstBin * bin, GstElement * element, gpointer user_data)
+{
+ g_object_set (G_OBJECT (element), "sync", FALSE, "async", FALSE, NULL);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *pipeline, *src, *toverlay, *osel, *sink1, *sink2, *c1, *c2, *c0;
+ GstPad *sinkpad;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* create elements */
+ pipeline = gst_element_factory_make ("pipeline", "pipeline");
+ src = gst_element_factory_make ("videotestsrc", "src");
+ c0 = gst_element_factory_make ("videoconvert", NULL);
+ toverlay = gst_element_factory_make ("timeoverlay", "timeoverlay");
+ osel = gst_element_factory_make ("output-selector", "osel");
+ c1 = gst_element_factory_make ("videoconvert", NULL);
+ c2 = gst_element_factory_make ("videoconvert", NULL);
+ sink1 = gst_element_factory_make ("autovideosink", "sink1");
+ sink2 = gst_element_factory_make ("autovideosink", "sink2");
+
+ if (!pipeline || !src || !c0 || !toverlay || !osel || !c1 || !c2 || !sink1 ||
+ !sink2) {
+ g_print ("missing element\n");
+ return -1;
+ }
+
+ /* add them to bin */
+ gst_bin_add_many (GST_BIN (pipeline), src, c0, toverlay, osel, c1, sink1, c2,
+ sink2, NULL);
+
+ /* set properties */
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ g_object_set (G_OBJECT (src), "do-timestamp", TRUE, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", NUM_VIDEO_BUFFERS, NULL);
+ g_object_set (G_OBJECT (osel), "resend-latest", TRUE, NULL);
+
+ /* handle deferred properties */
+ g_signal_connect (G_OBJECT (sink1), "element-added",
+ G_CALLBACK (on_bin_element_added), NULL);
+ g_signal_connect (G_OBJECT (sink2), "element-added",
+ G_CALLBACK (on_bin_element_added), NULL);
+
+ /* link src ! timeoverlay ! osel */
+ if (!gst_element_link_many (src, c0, toverlay, osel, NULL)) {
+ g_print ("linking failed\n");
+ return -1;
+ }
+
+ /* link output 1 */
+ sinkpad = gst_element_get_static_pad (c1, "sink");
+ osel_src1 = gst_element_get_request_pad (osel, "src%d");
+ if (gst_pad_link (osel_src1, sinkpad) != GST_PAD_LINK_OK) {
+ g_print ("linking output 1 converter failed\n");
+ return -1;
+ }
+ gst_object_unref (sinkpad);
+
+ if (!gst_element_link (c1, sink1)) {
+ g_print ("linking output 1 failed\n");
+ return -1;
+ }
+
+ /* link output 2 */
+ sinkpad = gst_element_get_static_pad (c2, "sink");
+ osel_src2 = gst_element_get_request_pad (osel, "src%d");
+ if (gst_pad_link (osel_src2, sinkpad) != GST_PAD_LINK_OK) {
+ g_print ("linking output 2 converter failed\n");
+ return -1;
+ }
+ gst_object_unref (sinkpad);
+
+ if (!gst_element_link (c2, sink2)) {
+ g_print ("linking output 2 failed\n");
+ return -1;
+ }
+
+ /* add switch callback */
+ g_timeout_add (SWITCH_TIMEOUT, switch_cb, osel);
+
+ /* change to playing */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_release_request_pad (osel, osel_src1);
+ gst_element_release_request_pad (osel, osel_src2);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/icles/playback/Makefile.am b/tests/icles/playback/Makefile.am
new file mode 100644
index 0000000..b1d7f94
--- /dev/null
+++ b/tests/icles/playback/Makefile.am
@@ -0,0 +1,26 @@
+noinst_PROGRAMS = test decodetest test2 test3 test4 test5 test6 test7
+
+test_LDADD = $(GST_LIBS)
+test_CFLAGS = $(GST_CFLAGS)
+
+test2_LDADD = $(GST_LIBS)
+test2_CFLAGS = $(GST_CFLAGS)
+
+test3_LDADD = $(GST_LIBS)
+test3_CFLAGS = $(GST_CFLAGS)
+
+test4_LDADD = $(GST_LIBS)
+test4_CFLAGS = $(GST_CFLAGS)
+
+test5_LDADD = $(GST_LIBS)
+test5_CFLAGS = $(GST_CFLAGS)
+
+test6_LDADD = $(GST_LIBS)
+test6_CFLAGS = $(GST_CFLAGS)
+
+test7_LDADD = $(GST_LIBS)
+test7_CFLAGS = $(GST_CFLAGS)
+
+decodetest_LDADD = $(GST_LIBS)
+decodetest_CFLAGS = $(GST_CFLAGS)
+
diff --git a/tests/icles/playback/Makefile.in b/tests/icles/playback/Makefile.in
new file mode 100644
index 0000000..020d151
--- /dev/null
+++ b/tests/icles/playback/Makefile.in
@@ -0,0 +1,907 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 = test$(EXEEXT) decodetest$(EXEEXT) test2$(EXEEXT) \
+ test3$(EXEEXT) test4$(EXEEXT) test5$(EXEEXT) test6$(EXEEXT) \
+ test7$(EXEEXT)
+subdir = tests/icles/playback
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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)
+decodetest_SOURCES = decodetest.c
+decodetest_OBJECTS = decodetest-decodetest.$(OBJEXT)
+am__DEPENDENCIES_1 =
+decodetest_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+decodetest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(decodetest_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test_SOURCES = test.c
+test_OBJECTS = test-test.$(OBJEXT)
+test_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test2_SOURCES = test2.c
+test2_OBJECTS = test2-test2.$(OBJEXT)
+test2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test2_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test3_SOURCES = test3.c
+test3_OBJECTS = test3-test3.$(OBJEXT)
+test3_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test3_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test4_SOURCES = test4.c
+test4_OBJECTS = test4-test4.$(OBJEXT)
+test4_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test4_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test4_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test5_SOURCES = test5.c
+test5_OBJECTS = test5-test5.$(OBJEXT)
+test5_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test5_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test5_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test6_SOURCES = test6.c
+test6_OBJECTS = test6-test6.$(OBJEXT)
+test6_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test6_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test6_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+test7_SOURCES = test7.c
+test7_OBJECTS = test7-test7.$(OBJEXT)
+test7_DEPENDENCIES = $(am__DEPENDENCIES_1)
+test7_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test7_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = decodetest.c test.c test2.c test3.c test4.c test5.c test6.c \
+ test7.c
+DIST_SOURCES = decodetest.c test.c test2.c test3.c test4.c test5.c \
+ test6.c test7.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+test_LDADD = $(GST_LIBS)
+test_CFLAGS = $(GST_CFLAGS)
+test2_LDADD = $(GST_LIBS)
+test2_CFLAGS = $(GST_CFLAGS)
+test3_LDADD = $(GST_LIBS)
+test3_CFLAGS = $(GST_CFLAGS)
+test4_LDADD = $(GST_LIBS)
+test4_CFLAGS = $(GST_CFLAGS)
+test5_LDADD = $(GST_LIBS)
+test5_CFLAGS = $(GST_CFLAGS)
+test6_LDADD = $(GST_LIBS)
+test6_CFLAGS = $(GST_CFLAGS)
+test7_LDADD = $(GST_LIBS)
+test7_CFLAGS = $(GST_CFLAGS)
+decodetest_LDADD = $(GST_LIBS)
+decodetest_CFLAGS = $(GST_CFLAGS)
+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/icles/playback/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/icles/playback/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
+decodetest$(EXEEXT): $(decodetest_OBJECTS) $(decodetest_DEPENDENCIES)
+ @rm -f decodetest$(EXEEXT)
+ $(AM_V_CCLD)$(decodetest_LINK) $(decodetest_OBJECTS) $(decodetest_LDADD) $(LIBS)
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(AM_V_CCLD)$(test_LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+test2$(EXEEXT): $(test2_OBJECTS) $(test2_DEPENDENCIES)
+ @rm -f test2$(EXEEXT)
+ $(AM_V_CCLD)$(test2_LINK) $(test2_OBJECTS) $(test2_LDADD) $(LIBS)
+test3$(EXEEXT): $(test3_OBJECTS) $(test3_DEPENDENCIES)
+ @rm -f test3$(EXEEXT)
+ $(AM_V_CCLD)$(test3_LINK) $(test3_OBJECTS) $(test3_LDADD) $(LIBS)
+test4$(EXEEXT): $(test4_OBJECTS) $(test4_DEPENDENCIES)
+ @rm -f test4$(EXEEXT)
+ $(AM_V_CCLD)$(test4_LINK) $(test4_OBJECTS) $(test4_LDADD) $(LIBS)
+test5$(EXEEXT): $(test5_OBJECTS) $(test5_DEPENDENCIES)
+ @rm -f test5$(EXEEXT)
+ $(AM_V_CCLD)$(test5_LINK) $(test5_OBJECTS) $(test5_LDADD) $(LIBS)
+test6$(EXEEXT): $(test6_OBJECTS) $(test6_DEPENDENCIES)
+ @rm -f test6$(EXEEXT)
+ $(AM_V_CCLD)$(test6_LINK) $(test6_OBJECTS) $(test6_LDADD) $(LIBS)
+test7$(EXEEXT): $(test7_OBJECTS) $(test7_DEPENDENCIES)
+ @rm -f test7$(EXEEXT)
+ $(AM_V_CCLD)$(test7_LINK) $(test7_OBJECTS) $(test7_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decodetest-decodetest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2-test2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test3-test3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test4-test4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test5-test5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test6-test6.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test7-test7.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+decodetest-decodetest.o: decodetest.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(decodetest_CFLAGS) $(CFLAGS) -MT decodetest-decodetest.o -MD -MP -MF $(DEPDIR)/decodetest-decodetest.Tpo -c -o decodetest-decodetest.o `test -f 'decodetest.c' || echo '$(srcdir)/'`decodetest.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/decodetest-decodetest.Tpo $(DEPDIR)/decodetest-decodetest.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='decodetest.c' object='decodetest-decodetest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(decodetest_CFLAGS) $(CFLAGS) -c -o decodetest-decodetest.o `test -f 'decodetest.c' || echo '$(srcdir)/'`decodetest.c
+
+decodetest-decodetest.obj: decodetest.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(decodetest_CFLAGS) $(CFLAGS) -MT decodetest-decodetest.obj -MD -MP -MF $(DEPDIR)/decodetest-decodetest.Tpo -c -o decodetest-decodetest.obj `if test -f 'decodetest.c'; then $(CYGPATH_W) 'decodetest.c'; else $(CYGPATH_W) '$(srcdir)/decodetest.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/decodetest-decodetest.Tpo $(DEPDIR)/decodetest-decodetest.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='decodetest.c' object='decodetest-decodetest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(decodetest_CFLAGS) $(CFLAGS) -c -o decodetest-decodetest.obj `if test -f 'decodetest.c'; then $(CYGPATH_W) 'decodetest.c'; else $(CYGPATH_W) '$(srcdir)/decodetest.c'; fi`
+
+test-test.o: test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF $(DEPDIR)/test-test.Tpo -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test-test.Tpo $(DEPDIR)/test-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c
+
+test-test.obj: test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF $(DEPDIR)/test-test.Tpo -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test-test.Tpo $(DEPDIR)/test-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`
+
+test2-test2.o: test2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test2_CFLAGS) $(CFLAGS) -MT test2-test2.o -MD -MP -MF $(DEPDIR)/test2-test2.Tpo -c -o test2-test2.o `test -f 'test2.c' || echo '$(srcdir)/'`test2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test2-test2.Tpo $(DEPDIR)/test2-test2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test2.c' object='test2-test2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test2_CFLAGS) $(CFLAGS) -c -o test2-test2.o `test -f 'test2.c' || echo '$(srcdir)/'`test2.c
+
+test2-test2.obj: test2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test2_CFLAGS) $(CFLAGS) -MT test2-test2.obj -MD -MP -MF $(DEPDIR)/test2-test2.Tpo -c -o test2-test2.obj `if test -f 'test2.c'; then $(CYGPATH_W) 'test2.c'; else $(CYGPATH_W) '$(srcdir)/test2.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test2-test2.Tpo $(DEPDIR)/test2-test2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test2.c' object='test2-test2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test2_CFLAGS) $(CFLAGS) -c -o test2-test2.obj `if test -f 'test2.c'; then $(CYGPATH_W) 'test2.c'; else $(CYGPATH_W) '$(srcdir)/test2.c'; fi`
+
+test3-test3.o: test3.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test3_CFLAGS) $(CFLAGS) -MT test3-test3.o -MD -MP -MF $(DEPDIR)/test3-test3.Tpo -c -o test3-test3.o `test -f 'test3.c' || echo '$(srcdir)/'`test3.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test3-test3.Tpo $(DEPDIR)/test3-test3.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test3.c' object='test3-test3.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test3_CFLAGS) $(CFLAGS) -c -o test3-test3.o `test -f 'test3.c' || echo '$(srcdir)/'`test3.c
+
+test3-test3.obj: test3.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test3_CFLAGS) $(CFLAGS) -MT test3-test3.obj -MD -MP -MF $(DEPDIR)/test3-test3.Tpo -c -o test3-test3.obj `if test -f 'test3.c'; then $(CYGPATH_W) 'test3.c'; else $(CYGPATH_W) '$(srcdir)/test3.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test3-test3.Tpo $(DEPDIR)/test3-test3.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test3.c' object='test3-test3.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test3_CFLAGS) $(CFLAGS) -c -o test3-test3.obj `if test -f 'test3.c'; then $(CYGPATH_W) 'test3.c'; else $(CYGPATH_W) '$(srcdir)/test3.c'; fi`
+
+test4-test4.o: test4.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test4_CFLAGS) $(CFLAGS) -MT test4-test4.o -MD -MP -MF $(DEPDIR)/test4-test4.Tpo -c -o test4-test4.o `test -f 'test4.c' || echo '$(srcdir)/'`test4.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test4-test4.Tpo $(DEPDIR)/test4-test4.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test4.c' object='test4-test4.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test4_CFLAGS) $(CFLAGS) -c -o test4-test4.o `test -f 'test4.c' || echo '$(srcdir)/'`test4.c
+
+test4-test4.obj: test4.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test4_CFLAGS) $(CFLAGS) -MT test4-test4.obj -MD -MP -MF $(DEPDIR)/test4-test4.Tpo -c -o test4-test4.obj `if test -f 'test4.c'; then $(CYGPATH_W) 'test4.c'; else $(CYGPATH_W) '$(srcdir)/test4.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test4-test4.Tpo $(DEPDIR)/test4-test4.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test4.c' object='test4-test4.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test4_CFLAGS) $(CFLAGS) -c -o test4-test4.obj `if test -f 'test4.c'; then $(CYGPATH_W) 'test4.c'; else $(CYGPATH_W) '$(srcdir)/test4.c'; fi`
+
+test5-test5.o: test5.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test5_CFLAGS) $(CFLAGS) -MT test5-test5.o -MD -MP -MF $(DEPDIR)/test5-test5.Tpo -c -o test5-test5.o `test -f 'test5.c' || echo '$(srcdir)/'`test5.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test5-test5.Tpo $(DEPDIR)/test5-test5.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test5.c' object='test5-test5.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test5_CFLAGS) $(CFLAGS) -c -o test5-test5.o `test -f 'test5.c' || echo '$(srcdir)/'`test5.c
+
+test5-test5.obj: test5.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test5_CFLAGS) $(CFLAGS) -MT test5-test5.obj -MD -MP -MF $(DEPDIR)/test5-test5.Tpo -c -o test5-test5.obj `if test -f 'test5.c'; then $(CYGPATH_W) 'test5.c'; else $(CYGPATH_W) '$(srcdir)/test5.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test5-test5.Tpo $(DEPDIR)/test5-test5.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test5.c' object='test5-test5.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test5_CFLAGS) $(CFLAGS) -c -o test5-test5.obj `if test -f 'test5.c'; then $(CYGPATH_W) 'test5.c'; else $(CYGPATH_W) '$(srcdir)/test5.c'; fi`
+
+test6-test6.o: test6.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test6_CFLAGS) $(CFLAGS) -MT test6-test6.o -MD -MP -MF $(DEPDIR)/test6-test6.Tpo -c -o test6-test6.o `test -f 'test6.c' || echo '$(srcdir)/'`test6.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test6-test6.Tpo $(DEPDIR)/test6-test6.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test6.c' object='test6-test6.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test6_CFLAGS) $(CFLAGS) -c -o test6-test6.o `test -f 'test6.c' || echo '$(srcdir)/'`test6.c
+
+test6-test6.obj: test6.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test6_CFLAGS) $(CFLAGS) -MT test6-test6.obj -MD -MP -MF $(DEPDIR)/test6-test6.Tpo -c -o test6-test6.obj `if test -f 'test6.c'; then $(CYGPATH_W) 'test6.c'; else $(CYGPATH_W) '$(srcdir)/test6.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test6-test6.Tpo $(DEPDIR)/test6-test6.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test6.c' object='test6-test6.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test6_CFLAGS) $(CFLAGS) -c -o test6-test6.obj `if test -f 'test6.c'; then $(CYGPATH_W) 'test6.c'; else $(CYGPATH_W) '$(srcdir)/test6.c'; fi`
+
+test7-test7.o: test7.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test7_CFLAGS) $(CFLAGS) -MT test7-test7.o -MD -MP -MF $(DEPDIR)/test7-test7.Tpo -c -o test7-test7.o `test -f 'test7.c' || echo '$(srcdir)/'`test7.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test7-test7.Tpo $(DEPDIR)/test7-test7.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test7.c' object='test7-test7.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test7_CFLAGS) $(CFLAGS) -c -o test7-test7.o `test -f 'test7.c' || echo '$(srcdir)/'`test7.c
+
+test7-test7.obj: test7.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test7_CFLAGS) $(CFLAGS) -MT test7-test7.obj -MD -MP -MF $(DEPDIR)/test7-test7.Tpo -c -o test7-test7.obj `if test -f 'test7.c'; then $(CYGPATH_W) 'test7.c'; else $(CYGPATH_W) '$(srcdir)/test7.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test7-test7.Tpo $(DEPDIR)/test7-test7.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test7.c' object='test7-test7.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test7_CFLAGS) $(CFLAGS) -c -o test7-test7.obj `if test -f 'test7.c'; then $(CYGPATH_W) 'test7.c'; else $(CYGPATH_W) '$(srcdir)/test7.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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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/icles/playback/decodetest.c b/tests/icles/playback/decodetest.c
new file mode 100644
index 0000000..c50bf9f
--- /dev/null
+++ b/tests/icles/playback/decodetest.c
@@ -0,0 +1,169 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <gst/gst.h>
+#include <string.h>
+
+static void
+warning_cb (GstBus * bus, GstMessage * msg, gpointer foo)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_warning (msg, &err, &dbg);
+
+ g_printerr ("WARNING: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+error_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (msg, &err, &dbg);
+
+ g_printerr ("ERROR: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_main_loop_quit (main_loop);
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+eos_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ g_print ("EOS\n");
+ g_main_loop_quit (main_loop);
+}
+
+static void
+state_cb (GstBus * bus, GstMessage * msg, GstElement * pipeline)
+{
+ if (msg->src == GST_OBJECT (pipeline)) {
+ GstState old_state, new_state, pending_state;
+
+ gst_message_parse_state_changed (msg, &old_state, &new_state,
+ &pending_state);
+ if (new_state == GST_STATE_PLAYING) {
+ g_print ("Decoding ...\n");
+ }
+ }
+}
+
+static void
+new_decoded_pad_cb (GstElement * decodebin, GstPad * pad, gboolean last,
+ GstElement * pipeline)
+{
+ GstPadLinkReturn ret;
+ GstElement *fakesink;
+ GstPad *fakesink_pad;
+
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ fakesink_pad = gst_element_get_static_pad (fakesink, "sink");
+
+ gst_bin_add (GST_BIN (pipeline), fakesink);
+
+ /* this doesn't really seem right, but it makes things work for me */
+ gst_element_set_state (fakesink, GST_STATE_PLAYING);
+
+ ret = gst_pad_link (pad, fakesink_pad);
+ if (!GST_PAD_LINK_SUCCESSFUL (ret)) {
+ g_printerr ("Failed to link %s:%s to %s:%s (ret = %d)\n",
+ GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (fakesink_pad), ret);
+ } else {
+ g_printerr ("Linked %s:%s to %s:%s\n", GST_DEBUG_PAD_NAME (pad),
+ GST_DEBUG_PAD_NAME (fakesink_pad));
+ }
+
+ gst_object_unref (fakesink_pad);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *decoder;
+ GstElement *source;
+ GstElement *pipeline;
+ GstStateChangeReturn res;
+ GMainLoop *loop;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_printerr ("Decode file from start to end.\n");
+ g_printerr ("Usage: %s URI\n\n", argv[0]);
+ return 1;
+ }
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "message::eos", G_CALLBACK (eos_cb), loop);
+ g_signal_connect (bus, "message::error", G_CALLBACK (error_cb), loop);
+ g_signal_connect (bus, "message::warning", G_CALLBACK (warning_cb), NULL);
+ g_signal_connect (bus, "message::state-changed", G_CALLBACK (state_cb),
+ pipeline);
+
+ source = gst_element_factory_make ("giosrc", "source");
+ g_assert (source);
+
+ if (argv[1] && strstr (argv[1], "://") != NULL) {
+ g_object_set (G_OBJECT (source), "location", argv[1], NULL);
+ } else if (argv[1]) {
+ gchar *uri = g_strdup_printf ("file://%s", argv[1]);
+
+ g_object_set (G_OBJECT (source), "location", uri, NULL);
+ g_free (uri);
+ }
+
+ decoder = gst_element_factory_make ("decodebin", "decoder");
+ g_assert (decoder);
+
+ gst_bin_add (GST_BIN (pipeline), source);
+ gst_bin_add (GST_BIN (pipeline), decoder);
+
+ gst_element_link_pads (source, "src", decoder, "sink");
+
+ g_signal_connect (decoder, "new-decoded-pad",
+ G_CALLBACK (new_decoded_pad_cb), pipeline);
+
+ res = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_main_loop_run (loop);
+
+ /* tidy up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+
+ return 0;
+}
diff --git a/tests/icles/playback/test.c b/tests/icles/playback/test.c
new file mode 100644
index 0000000..282302f
--- /dev/null
+++ b/tests/icles/playback/test.c
@@ -0,0 +1,193 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * 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.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <gst/gst.h>
+
+#include <stdlib.h>
+
+static GMainLoop *loop;
+
+static GstElement *
+gen_video_element (void)
+{
+ GstElement *element;
+ GstElement *conv;
+ GstElement *sink;
+ GstPad *pad;
+
+ element = gst_bin_new ("vbin");
+ conv = gst_element_factory_make ("videoconvert", "conv");
+ sink = gst_element_factory_make (DEFAULT_VIDEOSINK, "sink");
+
+ gst_bin_add (GST_BIN (element), conv);
+ gst_bin_add (GST_BIN (element), sink);
+ gst_element_link_pads (conv, "src", sink, "sink");
+
+ pad = gst_element_get_static_pad (conv, "sink");
+ gst_element_add_pad (element, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ return element;
+}
+
+static GstElement *
+gen_audio_element (void)
+{
+ GstElement *element;
+ GstElement *conv;
+ GstElement *sink;
+ GstPad *pad;
+
+ element = gst_bin_new ("abin");
+ conv = gst_element_factory_make ("audioconvert", "conv");
+ sink = gst_element_factory_make (DEFAULT_AUDIOSINK, "sink");
+
+ gst_bin_add (GST_BIN (element), conv);
+ gst_bin_add (GST_BIN (element), sink);
+ gst_element_link_pads (conv, "src", sink, "sink");
+
+ pad = gst_element_get_static_pad (conv, "sink");
+ gst_element_add_pad (element, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+
+ return element;
+}
+
+static void
+cb_newpad (GstElement * decodebin, GstPad * pad, gboolean last, gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ GstPad *sinkpad;
+ GstElement *sink;
+ GstElement *pipeline;
+ const gchar *name;
+ GstStateChangeReturn ret;
+ GstPadLinkReturn lret;
+
+ /* check media type */
+ caps = gst_pad_get_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+
+ name = gst_structure_get_name (str);
+ g_print ("name: %s\n", name);
+
+ if (g_strrstr (name, "audio")) {
+ sink = gen_audio_element ();
+ } else if (g_strrstr (name, "video")) {
+ sink = gen_video_element ();
+ } else {
+ sink = NULL;
+ }
+ gst_caps_unref (caps);
+
+ if (sink) {
+ pipeline = GST_ELEMENT_CAST (data);
+
+ /* add new sink to the pipeline */
+ gst_bin_add (GST_BIN_CAST (pipeline), sink);
+
+ /* set the new sink tp PAUSED as well */
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto state_error;
+
+ /* get the ghostpad of the sink bin */
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+
+ /* link'n'play */
+ lret = gst_pad_link (pad, sinkpad);
+ if (lret != GST_PAD_LINK_OK)
+ goto link_failed;
+
+ gst_object_unref (sinkpad);
+ }
+ return;
+
+ /* ERRORS */
+state_error:
+ {
+ gst_bin_remove (GST_BIN_CAST (pipeline), sink);
+ g_warning ("could not change state of new sink (%d)", ret);
+ return;
+ }
+link_failed:
+ {
+ g_warning ("could not link pad and sink (%d)", lret);
+ return;
+ }
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *pipeline, *filesrc, *decodebin;
+ GstStateChangeReturn res;
+
+ gst_init (&argc, &argv);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ filesrc = gst_element_factory_make ("filesrc", "filesrc");
+ g_assert (filesrc);
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ g_assert (decodebin);
+
+ g_signal_connect (G_OBJECT (decodebin), "new-decoded-pad",
+ G_CALLBACK (cb_newpad), pipeline);
+
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, decodebin, NULL);
+ gst_element_link (filesrc, decodebin);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>\n", argv[0]);
+ exit (-1);
+ }
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ /* set to paused, decodebin will autoplug and signal new_pad callbacks */
+ res = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not pause\n");
+ return -1;
+ }
+ /* wait for paused to complete */
+ res = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not pause\n");
+ return -1;
+ }
+
+ /* play, now all the sinks are added to the pipeline and are prerolled and
+ * ready to play. */
+ res = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ /* go in the mainloop now */
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
+
+ return 0;
+}
diff --git a/tests/icles/playback/test2.c b/tests/icles/playback/test2.c
new file mode 100644
index 0000000..86f3c4c
--- /dev/null
+++ b/tests/icles/playback/test2.c
@@ -0,0 +1,43 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <gst/gst.h>
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *player;
+ GstStateChangeReturn res;
+
+ gst_init (&argc, &argv);
+
+ player = gst_element_factory_make ("playbin", "player");
+ g_assert (player);
+
+ g_object_set (G_OBJECT (player), "uri", argv[1], NULL);
+
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_main_loop_run (g_main_loop_new (NULL, TRUE));
+
+ return 0;
+}
diff --git a/tests/icles/playback/test3.c b/tests/icles/playback/test3.c
new file mode 100644
index 0000000..d55e633
--- /dev/null
+++ b/tests/icles/playback/test3.c
@@ -0,0 +1,127 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <gst/gst.h>
+
+#define UPDATE_INTERVAL 500
+
+static gboolean
+update_scale (GstElement * element)
+{
+ gint64 duration = -1;
+ gint64 position = -1;
+ gchar dur_str[32], pos_str[32];
+
+ if (gst_element_query_position (element, GST_FORMAT_TIME, &position) &&
+ position != -1) {
+ g_snprintf (pos_str, 32, "%" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ } else {
+ g_snprintf (pos_str, 32, "-:--:--.---------");
+ }
+
+ if (gst_element_query_duration (element, GST_FORMAT_TIME, &duration) &&
+ duration != -1) {
+ g_snprintf (dur_str, 32, "%" GST_TIME_FORMAT, GST_TIME_ARGS (duration));
+ } else {
+ g_snprintf (dur_str, 32, "-:--:--.---------");
+ }
+
+ g_print ("%s / %s\n", pos_str, dur_str);
+
+ return TRUE;
+}
+
+static void
+warning_cb (GstBus * bus, GstMessage * msg, gpointer foo)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_warning (msg, &err, &dbg);
+
+ g_printerr ("WARNING: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+error_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (msg, &err, &dbg);
+
+ g_printerr ("ERROR: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_main_loop_quit (main_loop);
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+eos_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ g_print ("EOS\n");
+ g_main_loop_quit (main_loop);
+}
+
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstStateChangeReturn res;
+ GstElement *player;
+ GMainLoop *loop;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ player = gst_element_factory_make ("playbin", "player");
+ g_assert (player);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (player));
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "message::eos", G_CALLBACK (eos_cb), loop);
+ g_signal_connect (bus, "message::error", G_CALLBACK (error_cb), loop);
+ g_signal_connect (bus, "message::warning", G_CALLBACK (warning_cb), NULL);
+
+ g_object_set (G_OBJECT (player), "uri", argv[1], NULL);
+
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, player);
+
+ g_main_loop_run (loop);
+
+ /* tidy up */
+ gst_element_set_state (player, GST_STATE_NULL);
+ gst_object_unref (player);
+ gst_object_unref (bus);
+
+ return 0;
+}
diff --git a/tests/icles/playback/test4.c b/tests/icles/playback/test4.c
new file mode 100644
index 0000000..c2bb7c9
--- /dev/null
+++ b/tests/icles/playback/test4.c
@@ -0,0 +1,99 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h> /* exit() */
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <gst/gst.h>
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *player;
+ GstStateChangeReturn res;
+
+ gst_init (&argc, &argv);
+
+ player = gst_element_factory_make ("playbin", "player");
+ g_assert (player);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>\n", argv[0]);
+ exit (-1);
+ }
+
+ g_object_set (G_OBJECT (player), "uri", argv[1], NULL);
+
+ g_print ("play...\n");
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_print ("sleep 2...\n");
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ g_print ("pause...\n");
+ res = gst_element_set_state (player, GST_STATE_PAUSED);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_print ("sleep 2...\n");
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ g_print ("play...\n");
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_print ("sleep 2...\n");
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ g_print ("ready...\n");
+ res = gst_element_set_state (player, GST_STATE_READY);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_print ("sleep 2...\n");
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ g_print ("play...\n");
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_main_loop_run (g_main_loop_new (NULL, TRUE));
+
+ return 0;
+}
diff --git a/tests/icles/playback/test5.c b/tests/icles/playback/test5.c
new file mode 100644
index 0000000..8badfd3
--- /dev/null
+++ b/tests/icles/playback/test5.c
@@ -0,0 +1,133 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h> /* exit */
+#endif
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+
+static void
+new_pad (GstElement * element, GstPad * pad, gboolean last, GstElement * sink)
+{
+ g_print ("New pad...\n");
+}
+
+static void
+no_more_pads (GstElement * element)
+{
+ g_print ("No more pads...\n");
+ g_main_loop_quit (loop);
+}
+
+static gboolean
+start_finding (GstElement * pipeline)
+{
+ GstStateChangeReturn res;
+
+ g_print ("finding caps...\n");
+ res = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not pause\n");
+ exit (-1);
+ }
+ return FALSE;
+}
+
+static void
+dump_element_stats (GstElement * element)
+{
+ GstIterator *it;
+ GValue data = { 0, };
+
+ it = gst_element_iterate_src_pads (element);
+ while (gst_iterator_next (it, &data) == GST_ITERATOR_OK) {
+ GstPad *pad = g_value_get_object (&data);
+ GstCaps *caps;
+ gchar *str;
+ GstQuery *query;
+
+ g_print ("stream %s:\n", GST_OBJECT_NAME (pad));
+
+ caps = gst_pad_get_caps (pad, NULL);
+ str = gst_caps_to_string (caps);
+ g_print (" caps: %s\n", str);
+ g_free (str);
+ gst_caps_unref (caps);
+
+ query = gst_query_new_duration (GST_FORMAT_TIME);
+ if (gst_pad_query (pad, query)) {
+ gint64 duration;
+
+ gst_query_parse_duration (query, NULL, &duration);
+
+ g_print (" duration: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (duration));
+ }
+ gst_query_unref (query);
+
+ g_value_reset (&data);
+ }
+ g_value_unset (&data);
+ gst_iterator_free (it);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *pipeline, *filesrc, *decodebin;
+
+ gst_init (&argc, &argv);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ filesrc = gst_element_factory_make ("filesrc", "filesrc");
+ g_assert (filesrc);
+
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ g_assert (decodebin);
+
+ g_signal_connect (G_OBJECT (decodebin), "new-decoded-pad",
+ G_CALLBACK (new_pad), NULL);
+ g_signal_connect (G_OBJECT (decodebin), "no-more-pads",
+ G_CALLBACK (no_more_pads), NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, decodebin, NULL);
+ gst_element_link (filesrc, decodebin);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>\n", argv[0]);
+ exit (-1);
+ }
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ /* event based programming approach */
+ loop = g_main_loop_new (NULL, TRUE);
+ g_idle_add ((GSourceFunc) start_finding, pipeline);
+ g_main_loop_run (loop);
+
+ dump_element_stats (decodebin);
+
+ return 0;
+}
diff --git a/tests/icles/playback/test6.c b/tests/icles/playback/test6.c
new file mode 100644
index 0000000..696767b
--- /dev/null
+++ b/tests/icles/playback/test6.c
@@ -0,0 +1,165 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h> /* exit */
+#endif
+#include <gst/gst.h>
+
+static void
+new_decoded_pad_cb (GstElement * decodebin, GstPad * new_pad, gboolean last,
+ GstElement * pipeline)
+{
+ GstElement *fakesink;
+ GstPad *sinkpad;
+
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ gst_bin_add (GST_BIN (pipeline), fakesink);
+
+ sinkpad = gst_element_get_static_pad (fakesink, "sink");
+ if (GST_PAD_LINK_FAILED (gst_pad_link (new_pad, sinkpad))) {
+ g_warning ("Failed to link %s:%s to %s:%s", GST_DEBUG_PAD_NAME (new_pad),
+ GST_DEBUG_PAD_NAME (sinkpad));
+ gst_bin_remove (GST_BIN (pipeline), fakesink);
+ } else {
+ gst_element_set_state (fakesink, GST_STATE_PAUSED);
+ }
+}
+
+static void
+show_error (const gchar * errmsg, GstBus * bus)
+{
+ GstMessage *msg;
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
+ if (msg) {
+ g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
+
+ gst_message_parse_error (msg, &err, &dbg);
+ }
+
+ g_print ("ERROR: %s\n", errmsg);
+ g_print (" %s\n", (err) ? err->message : "");
+ if (dbg) {
+ g_print ("\ndebug: %s\n\n", dbg);
+ g_free (dbg);
+ }
+
+ if (err)
+ g_error_free (err);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *pipeline, *filesrc, *decodebin;
+ GstStateChangeReturn res;
+ GstIterator *it;
+ GstBus *bus;
+ GValue data = { 0, };
+
+ gst_init (&argc, &argv);
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ filesrc = gst_element_factory_make ("filesrc", "filesrc");
+ g_assert (filesrc);
+
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ g_assert (decodebin);
+
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, decodebin, NULL);
+ gst_element_link (filesrc, decodebin);
+
+ if (argc < 2) {
+ g_print ("usage: %s <filenames>\n", argv[0]);
+ exit (-1);
+ }
+
+ if (!g_str_has_prefix (argv[1], "file://")) {
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+ } else {
+ g_object_set (G_OBJECT (filesrc), "location", argv[1] + 7, NULL);
+ }
+
+ /* we've got to connect fakesinks to newly decoded pads to make sure
+ * buffers have actually been flowing over those pads and caps have
+ * been set on them. decodebin might insert internal queues and
+ * without fakesinks it's pot-luck what caps we get from the pad, because
+ * it depends on whether the queues have started pushing buffers yet or not.
+ * With fakesinks we make sure that the pipeline doesn't go to PAUSED state
+ * before each fakesink has a buffer queued. */
+ g_signal_connect (decodebin, "new-decoded-pad",
+ G_CALLBACK (new_decoded_pad_cb), pipeline);
+
+ bus = gst_element_get_bus (pipeline);
+
+ g_print ("pause..\n");
+ res = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ show_error ("Could not go to PAUSED state", bus);
+ exit (-1);
+ }
+ g_print ("waiting..\n");
+ res = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ if (res != GST_STATE_CHANGE_SUCCESS) {
+ show_error ("Failed to complete state change to PAUSED", bus);
+ exit (-1);
+ }
+ g_print ("stats..\n");
+
+ it = gst_element_iterate_src_pads (decodebin);
+ while (gst_iterator_next (it, &data) == GST_ITERATOR_OK) {
+ GstPad *pad = g_value_get_object (&data);
+ GstCaps *caps;
+ gchar *str;
+ GstQuery *query;
+
+ g_print ("stream %s:\n", GST_OBJECT_NAME (pad));
+
+ caps = gst_pad_get_caps (pad, NULL);
+ str = gst_caps_to_string (caps);
+ g_print (" caps: %s\n", str);
+ g_free (str);
+ gst_caps_unref (caps);
+
+ query = gst_query_new_duration (GST_FORMAT_TIME);
+ if (gst_pad_query (pad, query)) {
+ gint64 duration;
+
+ gst_query_parse_duration (query, NULL, &duration);
+
+ g_print (" duration: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (duration));
+ }
+ gst_query_unref (query);
+
+ g_value_reset (&data);
+ }
+ g_value_unset (&data);
+ gst_iterator_free (it);
+
+ return 0;
+}
diff --git a/tests/icles/playback/test7.c b/tests/icles/playback/test7.c
new file mode 100644
index 0000000..6dc984a
--- /dev/null
+++ b/tests/icles/playback/test7.c
@@ -0,0 +1,178 @@
+/* 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.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h> /* exit() */
+#endif
+#include <gst/gst.h>
+
+#define UPDATE_INTERVAL 500
+
+static int arg_count;
+static int max_count;
+
+static gboolean
+update_scale (GstElement * element)
+{
+ gint64 duration = -1;
+ gint64 position = -1;
+ gchar dur_str[32], pos_str[32];
+
+ if (gst_element_query_position (element, GST_FORMAT_TIME, &position) &&
+ position != -1) {
+ g_snprintf (pos_str, 32, "%" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ } else {
+ g_snprintf (pos_str, 32, "-:--:--.---------");
+ }
+
+ if (gst_element_query_duration (element, GST_FORMAT_TIME, &duration) &&
+ duration != -1) {
+ g_snprintf (dur_str, 32, "%" GST_TIME_FORMAT, GST_TIME_ARGS (duration));
+ } else {
+ g_snprintf (dur_str, 32, "-:--:--.---------");
+ }
+
+ g_print ("%s / %s\n", pos_str, dur_str);
+
+ return TRUE;
+}
+
+static void
+warning_cb (GstBus * bus, GstMessage * msg, gpointer foo)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_warning (msg, &err, &dbg);
+
+ g_printerr ("WARNING: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+error_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (msg, &err, &dbg);
+
+ g_printerr ("ERROR: %s (%s)\n", err->message, (dbg) ? dbg : "no details");
+
+ g_main_loop_quit (main_loop);
+
+ g_error_free (err);
+ g_free (dbg);
+}
+
+static void
+eos_cb (GstBus * bus, GstMessage * msg, GMainLoop * main_loop)
+{
+ g_print ("EOS\n");
+ g_main_loop_quit (main_loop);
+}
+
+static void
+new_clock_cb (GstBus * bus, GstMessage * msg, gpointer nothing)
+{
+ GstClock *clock;
+
+ gst_message_parse_new_clock (msg, &clock);
+ g_print ("NEW CLOCK: %s\n", GST_OBJECT_NAME (clock));
+}
+
+static void
+clock_lost_cb (GstBus * bus, GstMessage * msg, GstElement * playbin)
+{
+ GstClock *clock;
+
+ gst_message_parse_clock_lost (msg, &clock);
+ g_print ("CLOCK LOST: %s\n", GST_OBJECT_NAME (clock));
+
+ gst_element_set_state (playbin, GST_STATE_PAUSED);
+ gst_element_set_state (playbin, GST_STATE_PLAYING);
+}
+
+static void
+about_to_finish_cb (GstElement * element, gchar * uri[])
+{
+ if (arg_count < max_count) {
+ g_object_set (G_OBJECT (element), "uri", uri[arg_count], NULL);
+ arg_count++;
+ }
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstStateChangeReturn res;
+ GstElement *player;
+ GMainLoop *loop;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri> [<uri> ... ]\n", argv[0]);
+ exit (-1);
+ }
+
+ player = gst_element_factory_make ("playbin2", "player");
+ g_assert (player);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (player));
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "message::eos", G_CALLBACK (eos_cb), loop);
+ g_signal_connect (bus, "message::error", G_CALLBACK (error_cb), loop);
+ g_signal_connect (bus, "message::warning", G_CALLBACK (warning_cb), NULL);
+ g_signal_connect (bus, "message::new-clock", G_CALLBACK (new_clock_cb), NULL);
+ g_signal_connect (bus, "message::clock-lost", G_CALLBACK (clock_lost_cb),
+ player);
+
+ g_object_set (G_OBJECT (player), "uri", argv[1], NULL);
+
+ arg_count = 2;
+ max_count = argc;
+ g_signal_connect (player, "about-to-finish", G_CALLBACK (about_to_finish_cb),
+ argv);
+
+ res = gst_element_set_state (player, GST_STATE_PLAYING);
+ if (res == GST_STATE_CHANGE_FAILURE) {
+ g_print ("could not play\n");
+ return -1;
+ }
+
+ g_timeout_add (UPDATE_INTERVAL, (GSourceFunc) update_scale, player);
+
+ g_main_loop_run (loop);
+
+ /* tidy up */
+ gst_element_set_state (player, GST_STATE_NULL);
+ gst_object_unref (player);
+ gst_object_unref (bus);
+
+ return 0;
+}
diff --git a/tests/icles/playbin-text.c b/tests/icles/playbin-text.c
new file mode 100644
index 0000000..a7c4736
--- /dev/null
+++ b/tests/icles/playbin-text.c
@@ -0,0 +1,175 @@
+/* GStreamer
+ *
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+typedef struct _App App;
+
+struct _App
+{
+ GstElement *playbin;
+ GstElement *textsink;
+
+ GMainLoop *loop;
+};
+
+static App s_app;
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, App * app)
+{
+ GST_DEBUG ("got message %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ 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 (app->loop);
+ break;
+ }
+ case GST_MESSAGE_WARNING:
+ {
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_warning (message, &gerror, &debug);
+ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ g_error_free (gerror);
+ g_free (debug);
+
+ g_main_loop_quit (app->loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ g_message ("received EOS");
+ g_main_loop_quit (app->loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+static void
+have_subtitle (GstElement * appsink, App * app)
+{
+ GstBuffer *buffer;
+
+ /* get the buffer, we can also wakeup the mainloop to get the subtitle from
+ * appsink in the mainloop */
+ g_signal_emit_by_name (appsink, "pull-buffer", &buffer);
+
+ if (buffer) {
+ guint8 *data;
+ gsize size;
+ gint64 position;
+ GstClock *clock;
+ GstClockTime base_time, running_time;
+
+ gst_element_query_position (appsink, GST_FORMAT_TIME, &position);
+
+ clock = gst_element_get_clock (appsink);
+ base_time = gst_element_get_base_time (appsink);
+
+ running_time = gst_clock_get_time (clock) - base_time;
+
+ gst_object_unref (clock);
+
+ g_message ("received a subtitle at position %" GST_TIME_FORMAT
+ ", running_time %" GST_TIME_FORMAT, GST_TIME_ARGS (position),
+ GST_TIME_ARGS (running_time));
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ gst_util_dump_mem (data, size);
+ gst_buffer_unmap (buffer, data, size);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ App *app = &s_app;
+ GstBus *bus;
+ GstCaps *subcaps;
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* create a mainloop to get messages */
+ app->loop = g_main_loop_new (NULL, TRUE);
+
+ app->playbin = gst_element_factory_make ("playbin2", NULL);
+ g_assert (app->playbin);
+
+ /* set appsink to get the subtitles */
+ app->textsink = gst_element_factory_make ("appsink", "subtitle_sink");
+ g_object_set (G_OBJECT (app->textsink), "emit-signals", TRUE, NULL);
+ g_object_set (G_OBJECT (app->textsink), "ts-offset", 0 * GST_SECOND, NULL);
+ g_signal_connect (app->textsink, "new-buffer", G_CALLBACK (have_subtitle),
+ app);
+ subcaps = gst_caps_from_string ("text/x-pango-markup; text/plain");
+ g_object_set (G_OBJECT (app->textsink), "caps", subcaps, NULL);
+ gst_caps_unref (subcaps);
+
+ g_object_set (G_OBJECT (app->playbin), "text-sink", app->textsink, NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
+
+ /* add watch for messages */
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
+
+ /* set to read from appsrc */
+ g_object_set (app->playbin, "uri", argv[1], NULL);
+
+ /* go to playing and wait in a mainloop. */
+ gst_element_set_state (app->playbin, GST_STATE_PLAYING);
+
+ /* this mainloop is stopped when we receive an error or EOS */
+ g_main_loop_run (app->loop);
+
+ g_message ("stopping");
+
+ gst_element_set_state (app->playbin, GST_STATE_NULL);
+
+ gst_object_unref (bus);
+ g_main_loop_unref (app->loop);
+
+ return 0;
+}
diff --git a/tests/icles/position-formats.c b/tests/icles/position-formats.c
new file mode 100644
index 0000000..774d288
--- /dev/null
+++ b/tests/icles/position-formats.c
@@ -0,0 +1,149 @@
+/*
+ * position-formats.c
+ *
+ * we mostly use GST_FORMAT_TIME in queries and seeks. Test the other ones to
+ * know what works and what not.
+ */
+
+#include <gst/gst.h>
+
+#include <stdio.h>
+
+static gboolean
+bus_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GMainLoop *loop = (GMainLoop *) user_data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ 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_WARNING:
+ {
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_warning (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_EOS:
+ g_main_loop_quit (loop);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+static void
+print_value (gboolean res, GstFormat fmt, gint64 val)
+{
+ if (res) {
+ switch (fmt) {
+ case GST_FORMAT_TIME:
+ printf ("%" GST_TIME_FORMAT, GST_TIME_ARGS (val));
+ break;
+ case GST_FORMAT_PERCENT:
+ printf ("%8.4lf%%", (gdouble) val / GST_FORMAT_PERCENT_SCALE);
+ break;
+ case GST_FORMAT_DEFAULT:
+ case GST_FORMAT_BYTES:
+ case GST_FORMAT_BUFFERS:
+ default:
+ printf ("%" G_GINT64_FORMAT, val);
+ break;
+ }
+ } else {
+ printf ("-");
+ }
+}
+
+static gboolean
+run_queries (gpointer user_data)
+{
+ GstElement *bin = (GstElement *) user_data;
+ GstFormat i, fmt;
+ gint64 pos, dur;
+ gboolean pres, dres;
+
+ for (i = GST_FORMAT_DEFAULT; i <= GST_FORMAT_PERCENT; i++) {
+ fmt = i;
+ pres = gst_element_query_position (bin, fmt, &pos);
+ fmt = i;
+ dres = gst_element_query_duration (bin, fmt, &dur);
+ printf ("%-8s : ", gst_format_get_name (i));
+ print_value (pres, fmt, pos);
+ printf (" / ");
+ print_value (dres, fmt, dur);
+ printf ("\n");
+ }
+ printf ("\n");
+
+ return TRUE;
+}
+
+gint
+main (gint argc, gchar ** argv)
+{
+ gint res = 1;
+ GstElement *bin;
+ GstBus *bus;
+ GMainLoop *loop;
+ const gchar *uri;
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ printf ("Usage: %s <uri>\n", argv[0]);
+ goto Error;
+ }
+ uri = argv[1];
+
+ /* build pipeline */
+ bin = gst_element_factory_make ("playbin2", NULL);
+ if (!bin) {
+ GST_WARNING ("need playbin2 from gst-plugins-base");
+ goto Error;
+ }
+
+ g_object_set (bin, "uri", uri, NULL);
+
+ loop = g_main_loop_new (NULL, TRUE);
+
+ /* add watch for messages */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_add_watch (bus, (GstBusFunc) bus_message, (gpointer) loop);
+ gst_object_unref (bus);
+
+ /* add timeout for queries */
+ g_timeout_add (1000, (GSourceFunc) run_queries, (gpointer) bin);
+
+ /* run the show */
+ if (gst_element_set_state (bin,
+ GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE) {
+ g_main_loop_run (loop);
+ gst_element_set_state (bin, GST_STATE_NULL);
+ }
+
+ /* cleanup */
+ g_main_loop_unref (loop);
+ gst_object_unref (G_OBJECT (bin));
+ res = 0;
+Error:
+ return (res);
+}
diff --git a/tests/icles/stress-playbin.c b/tests/icles/stress-playbin.c
new file mode 100644
index 0000000..3b90710
--- /dev/null
+++ b/tests/icles/stress-playbin.c
@@ -0,0 +1,157 @@
+#include <gst/gst.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define TEST_RUNTIME 120.0 /* how long to run the test, in seconds */
+
+static void
+play_file (const gchar * bin, const gint delay, const gchar * uri)
+{
+ GstStateChangeReturn sret;
+ GstMessage *msg;
+ GstElement *play;
+ guint wait_nanosecs;
+
+ play = gst_element_factory_make (bin, "playbin");
+
+ g_object_set (play, "uri", uri, NULL);
+ g_printerr ("Playing %s\n", uri);
+ sret = gst_element_set_state (play, GST_STATE_PLAYING);
+ if (sret != GST_STATE_CHANGE_ASYNC && sret != GST_STATE_CHANGE_SUCCESS) {
+ g_printerr ("ERROR: state change failed, sret=%d\n", sret);
+ goto next;
+ }
+
+ wait_nanosecs = g_random_int_range (0, GST_MSECOND * delay);
+ msg = gst_bus_poll (GST_ELEMENT_BUS (play),
+ GST_MESSAGE_ERROR | GST_MESSAGE_EOS, wait_nanosecs);
+ if (msg) {
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ {
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_error (msg, &gerror, &debug);
+ gst_object_default_error (GST_MESSAGE_SRC (msg), gerror, debug);
+ g_error_free (gerror);
+ g_free (debug);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ g_printerr ("Got EOS\n");
+ break;
+ default:
+ g_printerr ("Got unexpected %s messge\n", GST_MESSAGE_TYPE_NAME (msg));
+ break;
+ }
+ gst_message_unref (msg);
+ goto next;
+ }
+
+ /* on to the next one */
+ g_print (".");
+
+next:
+ gst_element_set_state (play, GST_STATE_NULL);
+ gst_object_unref (play);
+}
+
+static void
+check_arg (GPtrArray * files, const gchar * arg)
+{
+ GDir *dir;
+
+ if ((dir = g_dir_open (arg, 0, NULL))) {
+ const gchar *entry;
+
+ while ((entry = g_dir_read_name (dir))) {
+ gchar *path;
+
+ path = g_strconcat (arg, G_DIR_SEPARATOR_S, entry, NULL);
+ check_arg (files, path);
+ g_free (path);
+ }
+
+ g_dir_close (dir);
+ return;
+ } else if (g_file_test (arg, G_FILE_TEST_EXISTS)) {
+ /* hack: technically an URI is not just file:// + path, but it'll do here */
+ g_ptr_array_add (files, g_strdup_printf ("file://%s", arg));
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ GPtrArray *files;
+ gchar **args = NULL;
+ guint num, i;
+ GError *err = NULL;
+ gchar *bin = NULL;
+ gint run = 100;
+ GOptionContext *ctx;
+ GOptionEntry options[] = {
+ {"bin", '\000', 0, G_OPTION_ARG_STRING, &bin, "playbin factory name", NULL},
+ {"runtime", '\000', 0, G_OPTION_ARG_INT, &run, "maximum play time (ms)",
+ NULL},
+ {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &args, NULL},
+ {NULL}
+ };
+ GTimer *timer;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("FILES OR DIRECTORIES WITH AUDIO FILES");
+ 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", GST_STR_NULL (err->message));
+ exit (1);
+ }
+ g_option_context_free (ctx);
+
+ if (!bin)
+ bin = g_strdup ("playbin");
+
+ if (strcmp (bin, "playbin") && strcmp (bin, "playbin2")) {
+ g_print ("Please provide a valid playbin argument; playbin | playbin2");
+ return 1;
+ }
+ if (args == NULL || *args == NULL) {
+ g_print ("Please provide one or more directories with audio files\n\n");
+ return 1;
+ }
+
+ files = g_ptr_array_new ();
+
+ num = g_strv_length (args);
+ for (i = 0; i < num; ++i) {
+ if (g_path_is_absolute (args[i])) {
+ check_arg (files, args[i]);
+ } else {
+ g_warning ("Argument '%s' is not an absolute file path", args[i]);
+ }
+ }
+
+ if (files->len == 0) {
+ g_print ("Did not find any files\n\n");
+ return 1;
+ }
+
+ timer = g_timer_new ();
+
+ while (g_timer_elapsed (timer, NULL) < TEST_RUNTIME) {
+ gint32 idx;
+
+ idx = g_random_int_range (0, files->len);
+ play_file (bin, run, (const gchar *) g_ptr_array_index (files, idx));
+ }
+
+ g_strfreev (args);
+ g_free (bin);
+ g_timer_destroy (timer);
+
+ return 0;
+}
diff --git a/tests/icles/stress-videooverlay.c b/tests/icles/stress-videooverlay.c
new file mode 100644
index 0000000..bcbe7dc
--- /dev/null
+++ b/tests/icles/stress-videooverlay.c
@@ -0,0 +1,245 @@
+/* GStreamer
+ * Copyright (C) <2005> Julien Moutte <julien@moutte.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/interfaces/videooverlay.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <math.h>
+#include <sys/time.h>
+
+static GMainLoop *loop;
+
+static Display *disp;
+static Window root, win = 0;
+static GC gc;
+static gint width = 320, height = 240, x = 0, y = 0;
+static gint disp_width, disp_height;
+
+static inline long
+myclock (void)
+{
+ struct timeval tv;
+
+ gettimeofday (&tv, NULL);
+ return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+}
+
+static void
+open_display (void)
+{
+ gint screen_num;
+
+ disp = XOpenDisplay (NULL);
+ root = DefaultRootWindow (disp);
+ screen_num = DefaultScreen (disp);
+ disp_width = DisplayWidth (disp, screen_num);
+ disp_height = DisplayHeight (disp, screen_num);
+}
+
+static void
+close_display (void)
+{
+ XCloseDisplay (disp);
+}
+
+static gboolean
+resize_window (GstPipeline * pipeline)
+{
+ width = (sin (myclock () / 300.0) * 200) + 640;
+ height = (sin (myclock () / 300.0) * 200) + 480;
+
+ XResizeWindow (disp, win, width, height);
+
+ XSync (disp, FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+move_window (GstPipeline * pipeline)
+{
+ x += 5;
+ y = disp_height - height + (sin (myclock () / 300.0) * height);
+ if (x > disp_width)
+ x = 0;
+
+ XMoveWindow (disp, win, x, y);
+
+ XSync (disp, FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+toggle_events (GstVideoOverlay * ov)
+{
+ static gboolean events_toggled;
+
+ gst_video_overlay_handle_events (ov, events_toggled);
+
+ if (events_toggled) {
+ g_print ("Events are handled\n");
+ events_toggled = FALSE;
+ } else {
+ g_print ("Events are NOT handled\n");
+ events_toggled = TRUE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+cycle_window (GstVideoOverlay * ov)
+{
+ XGCValues values;
+ Window old_win = win;
+ GC old_gc = gc;
+
+ win = XCreateSimpleWindow (disp, root, 0, 0, width, height, 0, 0, 0);
+
+ XSetWindowBackgroundPixmap (disp, win, None);
+
+ gc = XCreateGC (disp, win, 0, &values);
+
+ XMapRaised (disp, win);
+
+ XSync (disp, FALSE);
+
+ gst_video_overlay_set_window_handle (ov, win);
+
+ if (old_win) {
+ XDestroyWindow (disp, old_win);
+ XFreeGC (disp, old_gc);
+ XSync (disp, FALSE);
+ }
+
+ return TRUE;
+}
+
+static GstBusSyncReply
+create_window (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ GstVideoOverlay *ov = NULL;
+
+ if (!gst_is_video_overlay_prepare_window_handle_message (message))
+ return GST_BUS_PASS;
+
+ ov = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
+
+ g_print ("Creating our own window\n");
+
+ cycle_window (ov);
+
+ g_timeout_add (50, (GSourceFunc) resize_window, pipeline);
+ g_timeout_add (50, (GSourceFunc) move_window, pipeline);
+ g_timeout_add (100, (GSourceFunc) cycle_window, ov);
+ g_timeout_add (2000, (GSourceFunc) toggle_events, ov);
+
+ gst_message_unref (message);
+ return GST_BUS_DROP;
+}
+
+#if 0
+static gboolean
+terminate_playback (GstElement * pipeline)
+{
+ g_print ("Terminating playback\n");
+ g_main_loop_quit (loop);
+ return FALSE;
+}
+#endif
+
+static gboolean
+pause_playback (GstElement * pipeline)
+{
+ g_print ("Pausing playback\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ return FALSE;
+}
+
+static gboolean
+start_playback (GstElement * pipeline)
+{
+ g_print ("Starting playback\n");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ return FALSE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GstElement *pipeline;
+ GstBus *bus;
+
+#ifndef GST_DISABLE_PARSE
+ GError *error = NULL;
+#endif
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("Usage: %s \"pipeline description with launch format\"\n",
+ argv[0]);
+ g_print
+ ("The pipeline should contain an element implementing GstVideoOverlay.\n");
+ g_print ("Example: %s \"videotestsrc ! ximagesink\"\n", argv[0]);
+ return -1;
+ }
+#ifdef GST_DISABLE_PARSE
+ g_print ("GStreamer was built without pipeline parsing capabilities.\n");
+ g_print
+ ("Please rebuild GStreamer with pipeline parsing capabilities activated to use this example.\n");
+ return 1;
+#else
+ pipeline = gst_parse_launch (argv[1], &error);
+ if (error) {
+ g_print ("Error while parsing pipeline description: %s\n", error->message);
+ return -1;
+ }
+#endif
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ open_display ();
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, pipeline);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* We want to get out after */
+ //g_timeout_add (500000, (GSourceFunc) terminate_playback, pipeline);
+ g_timeout_add (10000, (GSourceFunc) pause_playback, pipeline);
+ g_timeout_add (20000, (GSourceFunc) start_playback, pipeline);
+
+ g_main_loop_run (loop);
+
+ close_display ();
+
+ g_main_loop_unref (loop);
+
+ return 0;
+}
diff --git a/tests/icles/test-box.c b/tests/icles/test-box.c
new file mode 100644
index 0000000..09fd3e7
--- /dev/null
+++ b/tests/icles/test-box.c
@@ -0,0 +1,144 @@
+/* GStreamer interactive videoscale test
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <gst/gst.h>
+
+#define CAPS " capsfilter caps=\"video/x-raw-yuv, format=(fourcc)I420, width=(int)640, height=(int)480\" "
+
+static GstElement *
+make_pipeline (gint type)
+{
+ GstElement *result;
+ gchar *pstr;
+
+ switch (type) {
+ case 0:
+ pstr =
+ g_strdup_printf ("videotestsrc ! " CAPS
+ " ! videobox name=box ! videoscale ! " CAPS
+ " ! videoconvert ! ximagesink");
+ 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 100
+
+int
+main (int argc, char **argv)
+{
+ GstElement *pipe, *filter;
+ gint left, right;
+ gint top, bottom;
+ gint rdir, ldir;
+ 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;
+
+ filter = gst_bin_get_by_name (GST_BIN (pipe), "box");
+ g_assert (filter);
+
+ /* start with no borders or cropping */
+ left = right = top = bottom = 0;
+ rdir = ldir = tdir = bdir = -10;
+
+ for (round = 0; round < MAX_ROUND; round++) {
+ g_print ("box to %dx%d %dx%d (%d/%d) \r", left, right, top, bottom,
+ round, MAX_ROUND);
+
+ g_object_set (filter, "left", left, "right", right, "top", top, "bottom",
+ bottom, NULL);
+
+ if (round == 0)
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ left += ldir;
+ if (left >= 40)
+ ldir = -10;
+ else if (left < -30)
+ ldir = 10;
+
+ right += rdir;
+ if (right >= 30)
+ rdir = -10;
+ else if (right < -20)
+ rdir = 10;
+
+ top += tdir;
+ if (top >= 20)
+ tdir = -10;
+ else if (top < -30)
+ tdir = 10;
+
+ bottom += bdir;
+ if (bottom >= 60)
+ bdir = -10;
+ else if (bottom < -40)
+ bdir = 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 (filter);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ type++;
+ if (type == stop)
+ break;
+ }
+ return 0;
+}
diff --git a/tests/icles/test-colorkey.c b/tests/icles/test-colorkey.c
new file mode 100644
index 0000000..ad5db92
--- /dev/null
+++ b/tests/icles/test-colorkey.c
@@ -0,0 +1,285 @@
+/* GStreamer
+ * Copyright (C) <2008> Stefan Kost <ensonic@users.sf.net>
+ *
+ * test-colorkey: test manual colorkey 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 "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+#include <gst/interfaces/videooverlay.h>
+#include <gst/interfaces/propertyprobe.h>
+
+#if !GTK_CHECK_VERSION (2, 17, 7)
+static void
+gtk_widget_get_allocation (GtkWidget * w, GtkAllocation * a)
+{
+ *a = w->allocation;
+}
+#endif
+
+static GtkWidget *video_window = NULL;
+static GstElement *sink = NULL;
+static gulong embed_xid = 0;
+static GdkColor trans_color;
+static gboolean trans_color_set = FALSE;
+
+static void
+redraw_overlay (GtkWidget * widget)
+{
+ GtkAllocation allocation;
+ GdkWindow *window = gtk_widget_get_window (widget);
+ cairo_t *cr;
+
+ cr = gdk_cairo_create (window);
+ gtk_widget_get_allocation (widget, &allocation);
+
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+ cairo_fill (cr);
+
+ if (trans_color_set) {
+ guint x, y;
+ guint h = allocation.height * 0.75;
+
+ gdk_cairo_set_source_color (cr, &trans_color);
+ cairo_rectangle (cr, 0, 0, allocation.width, h);
+ cairo_fill (cr);
+
+ for (y = h; y < allocation.height; y++) {
+ for (x = 0; x < allocation.width; x++) {
+ if (((x & 1) || (y & 1)) && (x & 1) != (y & 1)) {
+ cairo_move_to (cr, x, y);
+ cairo_paint (cr);
+ }
+ }
+ }
+ }
+}
+
+static gboolean
+handle_resize_cb (GtkWidget * widget, GdkEventConfigure * event, gpointer data)
+{
+ redraw_overlay (widget);
+ return FALSE;
+}
+
+static gboolean
+handle_expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer data)
+{
+ redraw_overlay (widget);
+ return FALSE;
+}
+
+static void
+realize_cb (GtkWidget * widget, gpointer data)
+{
+#if GTK_CHECK_VERSION(2,18,0)
+ {
+ GdkWindow *window = gtk_widget_get_window (widget);
+
+ /* This is here just for pedagogical purposes, GDK_WINDOW_XID will call it
+ * as well */
+ if (!gdk_window_ensure_native (window))
+ g_error ("Couldn't create native window needed for GstVideoOverlay!");
+ }
+#endif
+
+ {
+ GdkWindow *window = gtk_widget_get_window (video_window);
+
+ embed_xid = GDK_WINDOW_XID (window);
+ g_print ("Window realize: video window XID = %lu\n", embed_xid);
+ }
+}
+
+static void
+msg_state_changed (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
+{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+
+ /* We only care about state changed on the pipeline */
+ if (s && GST_MESSAGE_SRC (message) == GST_OBJECT_CAST (pipeline)) {
+ GstState old, new, pending;
+ gint color;
+
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+
+ /* When state of the pipeline changes to paused or playing we start updating scale */
+ switch (GST_STATE_TRANSITION (old, new)) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:{
+ g_object_get (G_OBJECT (sink), "colorkey", &color, NULL);
+ if (color != -1) {
+ trans_color.red = (color & 0xff0000) >> 8;
+ trans_color.green = (color & 0xff00);
+ trans_color.blue = (color & 0xff) << 8;
+ trans_color_set = TRUE;
+ } else {
+ trans_color_set = FALSE;
+ }
+ handle_resize_cb (video_window, NULL, NULL);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+static void
+window_closed (GtkWidget * widget, GdkEvent * event, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+
+ g_print ("stopping\n");
+ gtk_widget_hide (widget);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gtk_main_quit ();
+}
+
+static gboolean
+start_pipeline (gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+ GstStateChangeReturn sret;
+
+ sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE) {
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gtk_main_quit ();
+ }
+ return FALSE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWidget *window;
+ GstElement *pipeline, *src;
+ GstBus *bus;
+ GstStateChangeReturn sret;
+ GstPropertyProbe *probe;
+ GValueArray *arr;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gst_init (&argc, &argv);
+ gtk_init (&argc, &argv);
+
+ /* prepare the pipeline */
+
+ pipeline = gst_pipeline_new ("xvoverlay");
+ src = gst_element_factory_make ("videotestsrc", NULL);
+ sink = gst_element_factory_make ("xvimagesink", NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+#define COLOR_GRAY 0x7F7F7F
+
+ g_object_set (G_OBJECT (sink), "autopaint-colorkey", FALSE,
+ "force-aspect-ratio", TRUE, "draw-borders", FALSE,
+ "colorkey", COLOR_GRAY, NULL);
+
+ /* check xvimagesink capabilities */
+ sret = gst_element_set_state (pipeline, GST_STATE_READY);
+ if (sret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Can't set pipeline to READY\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+
+ probe = GST_PROPERTY_PROBE (sink);
+ if (!probe) {
+ g_printerr ("Can't probe sink\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return -1;
+ }
+ arr =
+ gst_property_probe_probe_and_get_values_name (probe,
+ "autopaint-colorkey");
+ if (!arr || !arr->n_values) {
+ g_printerr ("Can't disable autopaint-colorkey property\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return -1;
+ }
+ if (arr)
+ g_value_array_free (arr);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+ g_signal_connect (bus, "message::state-changed",
+ G_CALLBACK (msg_state_changed), pipeline);
+ gst_object_unref (bus);
+
+ /* prepare the ui */
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (window), "delete-event",
+ G_CALLBACK (window_closed), (gpointer) pipeline);
+ gtk_window_set_default_size (GTK_WINDOW (window), 320, 240);
+
+ video_window = gtk_drawing_area_new ();
+ g_signal_connect (G_OBJECT (video_window), "configure-event",
+ G_CALLBACK (handle_resize_cb), NULL);
+ g_signal_connect (G_OBJECT (video_window), "expose-event",
+ G_CALLBACK (handle_expose_cb), NULL);
+ g_signal_connect (video_window, "realize", G_CALLBACK (realize_cb), NULL);
+ gtk_widget_set_double_buffered (video_window, FALSE);
+ gtk_container_add (GTK_CONTAINER (window), video_window);
+
+ /* show the gui and play */
+
+ gtk_widget_show_all (window);
+
+ /* realize window now so that the video window gets created and we can
+ * obtain its XID before the pipeline is started up and the videosink
+ * asks for the XID of the window to render onto */
+ gtk_widget_realize (window);
+
+ /* we should have the XID now */
+ g_assert (embed_xid != 0);
+
+ /* we know what the video sink is in this case (xvimagesink), so we can
+ * just set it directly here now (instead of waiting for a
+ * prepare-window-handle element message in a sync bus handler and setting
+ * it there) */
+ g_print ("setting XID %lu\n", embed_xid);
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
+
+ g_idle_add (start_pipeline, pipeline);
+ gtk_main ();
+
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/icles/test-scale.c b/tests/icles/test-scale.c
new file mode 100644
index 0000000..719adee
--- /dev/null
+++ b/tests/icles/test-scale.c
@@ -0,0 +1,164 @@
+/* GStreamer interactive videoscale test
+ * Copyright (C) 2008 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <gst/gst.h>
+
+static GstElement *
+make_pipeline (gint type)
+{
+ GstElement *result;
+ gchar *pstr;
+
+ switch (type) {
+ case 0:
+ pstr = g_strdup_printf ("videotestsrc ! capsfilter name=filter ! "
+ "ximagesink");
+ break;
+ case 1:
+ pstr = g_strdup_printf ("videotestsrc ! queue ! capsfilter name=filter ! "
+ "ximagesink");
+ break;
+ case 2:
+ pstr = g_strdup_printf ("videotestsrc peer-alloc=0 ! videoscale ! "
+ "capsfilter name=filter ! " "ximagesink");
+ break;
+ case 3:
+ pstr =
+ g_strdup_printf ("videotestsrc peer-alloc=0 ! queue ! videoscale ! "
+ "capsfilter name=filter ! " "ximagesink");
+ break;
+ case 4:
+ pstr =
+ g_strdup_printf ("videotestsrc peer-alloc=0 ! videoscale ! queue ! "
+ "capsfilter name=filter ! " "ximagesink");
+ break;
+ case 5:
+ pstr = g_strdup_printf ("videotestsrc peer-alloc=0 ! "
+ "capsfilter name=filter ! " "ximagesink");
+ break;
+ case 6:
+ pstr = g_strdup_printf ("videotestsrc ! videoscale ! "
+ "capsfilter name=filter ! " "ximagesink");
+ break;
+ case 7:
+ pstr = g_strdup_printf ("v4l2src ! videoconvert ! videoscale ! "
+ "capsfilter name=filter ! " "ximagesink");
+ 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 100
+
+int
+main (int argc, char **argv)
+{
+ GstElement *pipe, *filter;
+ GstCaps *caps;
+ gint width, height;
+ gint xdir, ydir;
+ 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;
+
+ filter = gst_bin_get_by_name (GST_BIN (pipe), "filter");
+ g_assert (filter);
+
+ width = 320;
+ height = 240;
+ xdir = ydir = -10;
+
+ for (round = 0; round < MAX_ROUND; round++) {
+ gchar *capsstr;
+ g_print ("resize to %dx%d (%d/%d) \r", width, height, round, MAX_ROUND);
+
+ /* we prefer our fixed width and height but allow other dimensions to pass
+ * as well */
+ capsstr =
+ g_strdup_printf ("video/x-raw-rgb, width=(int)%d, height=(int)%d;"
+ "video/x-raw-rgb", width, height);
+ caps = gst_caps_from_string (capsstr);
+ g_free (capsstr);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ if (round == 0)
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ width += xdir;
+ if (width >= 320)
+ xdir = -10;
+ else if (width < 200)
+ xdir = 10;
+
+ height += ydir;
+ if (height >= 240)
+ ydir = -10;
+ else if (height < 150)
+ ydir = 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 (filter);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ type++;
+ if (type == stop)
+ break;
+ }
+ return 0;
+}
diff --git a/tests/icles/test-textoverlay.c b/tests/icles/test-textoverlay.c
new file mode 100644
index 0000000..22119df
--- /dev/null
+++ b/tests/icles/test-textoverlay.c
@@ -0,0 +1,125 @@
+/* GStreamer interactive textoverlay test
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+static void
+set_enum_property_by_name (gpointer object, const gchar * prop,
+ const gchar * value)
+{
+ GParamSpec *pspec;
+ GValue val = { 0, };
+ GEnumClass *eclass;
+ GEnumValue *eval;
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), prop);
+ g_return_if_fail (pspec != NULL);
+
+ g_value_init (&val, pspec->value_type);
+ g_object_get_property (G_OBJECT (object), prop, &val);
+ eclass = G_ENUM_CLASS (g_type_class_peek (G_VALUE_TYPE (&val)));
+ g_return_if_fail (eclass != NULL);
+ eval = g_enum_get_value_by_name (eclass, value);
+ if (eval == NULL)
+ eval = g_enum_get_value_by_nick (eclass, value);
+ g_return_if_fail (eval != NULL);
+ g_value_set_enum (&val, eval->value);
+ g_object_set_property (G_OBJECT (object), prop, &val);
+ g_value_unset (&val);
+}
+
+static void
+show_text (GstElement * textoverlay, const gchar * txt, const gchar * valign,
+ const gchar * halign, const gchar * line_align)
+{
+ GstElement *pipe;
+
+ g_object_set (textoverlay, "text", txt, NULL);
+
+ set_enum_property_by_name (textoverlay, "valignment", valign);
+ set_enum_property_by_name (textoverlay, "halignment", halign);
+ set_enum_property_by_name (textoverlay, "line-alignment", line_align);
+
+ pipe = textoverlay;
+ while (GST_ELEMENT_PARENT (pipe))
+ pipe = GST_ELEMENT_PARENT (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, GST_SECOND);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+}
+
+static void
+test_textoverlay (int width, int height)
+{
+ const gchar *valigns[] = { /* "baseline", */ "bottom", "top" };
+ const gchar *haligns[] = { "left", "center", "right" };
+ const gchar *linealigns[] = { "left", "center", "right" };
+ GstElement *pipe, *toverlay;
+ gchar *pstr;
+ gint a, b, c;
+
+ pstr = g_strdup_printf ("videotestsrc pattern=blue ! "
+ "video/x-raw-yuv,width=%d,height=%d ! t.video_sink "
+ "textoverlay name=t font-desc=\"Sans Serif, 20\" ! "
+ " videoconvert ! videoscale ! autovideosink", width, height);
+
+ pipe = gst_parse_launch_full (pstr, NULL, GST_PARSE_FLAG_NONE, NULL);
+ g_assert (pipe);
+
+ toverlay = gst_bin_get_by_name (GST_BIN (pipe), "t");
+ g_assert (toverlay);
+
+ g_object_set (toverlay, "xpad", 3, "ypad", 3, NULL);
+
+ for (a = 0; a < G_N_ELEMENTS (valigns); ++a) {
+ for (b = 0; b < G_N_ELEMENTS (haligns); ++b) {
+ for (c = 0; c < G_N_ELEMENTS (linealigns); ++c) {
+ gchar *s;
+
+ s = g_strdup_printf ("line-alignment = %s\n"
+ "&lt;----- halignment = %s -----&gt;\nvalignment = %s",
+ linealigns[c], haligns[b], valigns[a]);
+ show_text (toverlay, s, valigns[a], haligns[b], linealigns[c]);
+ g_free (s);
+ }
+ }
+ }
+
+ g_free (pstr);
+}
+
+int
+main (int argc, char **argv)
+{
+ gst_init (&argc, &argv);
+
+ test_textoverlay (640, 480);
+
+ g_print ("Now with odd width/height ...\n");
+ test_textoverlay (639, 479);
+
+ /* test_textoverlay (796, 256); */
+
+ return 0;
+}
diff --git a/tests/icles/test-videooverlay.c b/tests/icles/test-videooverlay.c
new file mode 100644
index 0000000..400d0ac
--- /dev/null
+++ b/tests/icles/test-videooverlay.c
@@ -0,0 +1,248 @@
+/* GStreamer
+ * Copyright (C) <2008> Stefan Kost <ensonic@users.sf.net>
+ *
+ * test-videooverlay: test videooverlay custom event handling and subregions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <glib.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+#include <gst/interfaces/videooverlay.h>
+#include <gst/video/gstvideosink.h>
+
+#if !GTK_CHECK_VERSION (2, 17, 7)
+static void
+gtk_widget_get_allocation (GtkWidget * w, GtkAllocation * a)
+{
+ *a = w->allocation;
+}
+#endif
+
+static struct
+{
+ gint w, h;
+ GstVideoOverlay *overlay;
+ GtkWidget *widget;
+ gdouble a, p;
+ GstVideoRectangle rect;
+ gboolean running;
+} anim_state;
+
+static gboolean verbose = FALSE;
+
+static gboolean
+animate_render_rect (gpointer user_data)
+{
+ if (anim_state.running) {
+ GstVideoRectangle *r = &anim_state.rect;
+ gdouble s = sin (3.0 * anim_state.a);
+ gdouble c = cos (2.0 * anim_state.a);
+
+ anim_state.a += anim_state.p;
+ if (anim_state.a > (G_PI + G_PI))
+ anim_state.a -= (G_PI + G_PI);
+
+ r->w = anim_state.w / 2;
+ r->x = (r->w - (r->w / 2)) + c * (r->w / 2);
+ r->h = anim_state.h / 2;
+ r->y = (r->h - (r->h / 2)) + s * (r->h / 2);
+
+ gst_video_overlay_set_render_rectangle (anim_state.overlay, r->x, r->y,
+ r->w, r->h);
+ gtk_widget_queue_draw (anim_state.widget);
+ }
+ return TRUE;
+}
+
+static gboolean
+handle_resize_cb (GtkWidget * widget, GdkEventConfigure * event,
+ gpointer user_data)
+{
+ GtkAllocation allocation;
+
+ gtk_widget_get_allocation (widget, &allocation);
+
+ if (verbose) {
+ g_print ("resize(%p): %dx%d\n", widget, allocation.width,
+ allocation.height);
+ }
+ anim_state.w = allocation.width;
+ anim_state.h = allocation.height;
+ animate_render_rect (NULL);
+
+ return FALSE;
+}
+
+static gboolean
+handle_expose_cb (GtkWidget * widget, GdkEventExpose * event,
+ gpointer user_data)
+{
+ GstVideoRectangle *r = &anim_state.rect;
+ GtkAllocation allocation;
+ GdkWindow *window;
+ GtkStyle *style;
+ cairo_t *cr;
+
+ style = gtk_widget_get_style (widget);
+ window = gtk_widget_get_window (widget);
+ gtk_widget_get_allocation (widget, &allocation);
+ cr = gdk_cairo_create (window);
+
+ gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_NORMAL]);
+
+ /* we should only redraw outside of the video rect! */
+ cairo_rectangle (cr, 0, event->area.y, r->x, event->area.height);
+ cairo_rectangle (cr, r->x + r->w, event->area.y,
+ allocation.width - (r->x + r->w), event->area.height);
+
+ cairo_rectangle (cr, event->area.x, 0, event->area.width, r->y);
+ cairo_rectangle (cr, event->area.x, r->y + r->h,
+ event->area.width, allocation.height - (r->y + r->h));
+
+ cairo_fill (cr);
+
+ cairo_destroy (cr);
+
+ if (verbose) {
+ g_print ("expose(%p)\n", widget);
+ }
+ gst_video_overlay_expose (anim_state.overlay);
+ return FALSE;
+}
+
+static void
+window_closed (GtkWidget * widget, GdkEvent * event, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+
+ if (verbose) {
+ g_print ("stopping\n");
+ }
+ anim_state.running = FALSE;
+ gtk_widget_hide (widget);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gtk_main_quit ();
+}
+
+gint
+main (gint argc, gchar ** argv)
+{
+ GdkWindow *video_window_xwindow;
+ GtkWidget *window, *video_window;
+ GstElement *pipeline, *src, *sink;
+ GstStateChangeReturn sret;
+ gulong embed_xid = 0;
+ gboolean force_aspect = FALSE, draw_borders = FALSE;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gst_init (&argc, &argv);
+ gtk_init (&argc, &argv);
+
+ if (argc) {
+ gint arg;
+ for (arg = 0; arg < argc; arg++) {
+ if (!strcmp (argv[arg], "-a"))
+ force_aspect = TRUE;
+ else if (!strcmp (argv[arg], "-b"))
+ draw_borders = TRUE;
+ else if (!strcmp (argv[arg], "-v"))
+ verbose = TRUE;
+ }
+ }
+
+ /* prepare the pipeline */
+
+ pipeline = gst_pipeline_new ("xvoverlay");
+ src = gst_element_factory_make ("videotestsrc", NULL);
+ sink = gst_element_factory_make ("xvimagesink", NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ g_object_set (G_OBJECT (sink), "handle-events", FALSE,
+ "force-aspect-ratio", force_aspect, "draw-borders", draw_borders, NULL);
+
+ /* prepare the ui */
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (window), "delete-event",
+ G_CALLBACK (window_closed), (gpointer) pipeline);
+ gtk_window_set_default_size (GTK_WINDOW (window), 320, 240);
+
+ video_window = gtk_drawing_area_new ();
+ gtk_widget_set_double_buffered (video_window, FALSE);
+ gtk_container_add (GTK_CONTAINER (window), video_window);
+
+ /* show the gui and play */
+ gtk_widget_show_all (window);
+
+ /* realize window now so that the video window gets created and we can
+ * obtain its XID before the pipeline is started up and the videosink
+ * asks for the XID of the window to render onto */
+ gtk_widget_realize (window);
+
+ video_window_xwindow = gtk_widget_get_window (video_window);
+ embed_xid = GDK_WINDOW_XID (video_window_xwindow);
+ if (verbose) {
+ g_print ("Window realize: got XID %lu\n", embed_xid);
+ }
+
+ /* we know what the video sink is in this case (xvimagesink), so we can
+ * just set it directly here now (instead of waiting for a
+ * prepare-window-handle element message in a sync bus handler and setting
+ * it there) */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
+
+ anim_state.overlay = GST_VIDEO_OVERLAY (sink);
+ anim_state.widget = video_window;
+ anim_state.w = 320;
+ anim_state.h = 240;
+ anim_state.a = 0.0;
+ anim_state.p = (G_PI + G_PI) / 200.0;
+
+ handle_resize_cb (video_window, NULL, sink);
+ g_signal_connect (video_window, "configure-event",
+ G_CALLBACK (handle_resize_cb), NULL);
+ g_signal_connect (video_window, "expose-event",
+ G_CALLBACK (handle_expose_cb), NULL);
+
+ g_timeout_add (50, (GSourceFunc) animate_render_rect, NULL);
+
+ /* run the pipeline */
+ sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (sret == GST_STATE_CHANGE_FAILURE)
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ else {
+ anim_state.running = TRUE;
+ gtk_main ();
+ }
+
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644
index 0000000..647b634
--- /dev/null
+++ b/tools/Makefile.am
@@ -0,0 +1,49 @@
+bin_SCRIPTS = \
+ gst-visualise-@GST_MAJORMINOR@
+
+man_MANS = \
+ gst-visualise-@GST_MAJORMINOR@.1
+
+bin_PROGRAMS = \
+ gst-discoverer-@GST_MAJORMINOR@
+
+gst_discoverer_@GST_MAJORMINOR@_SOURCES = gst-discoverer.c
+
+CLEANFILES = $(man_MANS) $(bin_SCRIPTS) $(bin_PROGRAMS)
+
+EXTRA_DIST = \
+ gst-visualise-m.m gst-visualise.1.in
+
+
+LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la\
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la\
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+AM_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+
+# generate versioned scripts from templates
+%-@GST_MAJORMINOR@: %-m.m
+ $(AM_V_GEN)sed -e s,\@GST_MAJORMINOR\@,@GST_MAJORMINOR@,g $< > $@ && \
+ chmod +x $@
+
+# generate man pages
+%-@GST_MAJORMINOR@.1: %.1.in
+ $(AM_V_GEN)sed \
+ -e s,gst-visualise,gst-visualise-@GST_MAJORMINOR@,g \
+ $< >$@
+
+all: all-am chmod
+
+chmod: $(bin_SCRIPTS)
+ @chmod +x $^
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gst-discoverer \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:EXECUTABLE gst-discoverer -:TAGS eng debug \
+ -:SOURCES $(gst_discoverer_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(AM_CFLAGS) \
+ -:LDFLAGS -lgstpbutils-@GST_MAJORMINOR@ -lgstvideo-@GST_MAJORMINOR@ \
+ $(GST_BASE_LIBS) $(GST_LIBS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
diff --git a/tools/Makefile.in b/tools/Makefile.in
new file mode 100644
index 0000000..4c396d8
--- /dev/null
+++ b/tools/Makefile.in
@@ -0,0 +1,887 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@
+bin_PROGRAMS = gst-discoverer-@GST_MAJORMINOR@$(EXEEXT)
+subdir = tools
+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-libtool.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-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.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-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/introspection.m4 \
+ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/freetype2.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gst-alsa.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/lrint.m4 $(top_srcdir)/m4/lrintf.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/ogg.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/vorbis.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__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_gst_discoverer_@GST_MAJORMINOR@_OBJECTS = gst-discoverer.$(OBJEXT)
+gst_discoverer_@GST_MAJORMINOR@_OBJECTS = \
+ $(am_gst_discoverer_@GST_MAJORMINOR@_OBJECTS)
+gst_discoverer_@GST_MAJORMINOR@_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+gst_discoverer_@GST_MAJORMINOR@_DEPENDENCIES = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+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'
+SCRIPTS = $(bin_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_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+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_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(gst_discoverer_@GST_MAJORMINOR@_SOURCES)
+DIST_SOURCES = $(gst_discoverer_@GST_MAJORMINOR@_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUDIORESAMPLE_FORMAT_AUTO = @AUDIORESAMPLE_FORMAT_AUTO@
+AUDIORESAMPLE_FORMAT_FLOAT = @AUDIORESAMPLE_FORMAT_FLOAT@
+AUDIORESAMPLE_FORMAT_INT = @AUDIORESAMPLE_FORMAT_INT@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CDPARANOIA_CFLAGS = @CDPARANOIA_CFLAGS@
+CDPARANOIA_LIBS = @CDPARANOIA_LIBS@
+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@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GST_AGE = @GST_AGE@
+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_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_GDP_CFLAGS = @GST_GDP_CFLAGS@
+GST_GDP_LIBS = @GST_GDP_LIBS@
+GST_INSTALL_PLUGINS_HELPER = @GST_INSTALL_PLUGINS_HELPER@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+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_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+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@
+HAVE_CDPARANOIA = @HAVE_CDPARANOIA@
+HAVE_X = @HAVE_X@
+HAVE_XSHM = @HAVE_XSHM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HSTRERROR_LIBS = @HSTRERROR_LIBS@
+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@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IVORBIS_CFLAGS = @IVORBIS_CFLAGS@
+IVORBIS_LIBS = @IVORBIS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+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@
+PANGO_CFLAGS = @PANGO_CFLAGS@
+PANGO_LIBS = @PANGO_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT4_MOC = @QT4_MOC@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THEORA_CFLAGS = @THEORA_CFLAGS@
+THEORA_LIBS = @THEORA_LIBS@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBISFILE_LIBS = @VORBISFILE_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WIN32_LIBS = @WIN32_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_CFLAGS = @ZLIB_CFLAGS@
+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_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+lt_ECHO = @lt_ECHO@
+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@
+bin_SCRIPTS = \
+ gst-visualise-@GST_MAJORMINOR@
+
+man_MANS = \
+ gst-visualise-@GST_MAJORMINOR@.1
+
+gst_discoverer_@GST_MAJORMINOR@_SOURCES = gst-discoverer.c
+CLEANFILES = $(man_MANS) $(bin_SCRIPTS) $(bin_PROGRAMS)
+EXTRA_DIST = \
+ gst-visualise-m.m gst-visualise.1.in
+
+LDADD = $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la\
+ $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la\
+ $(GST_BASE_LIBS) $(GST_LIBS)
+
+AM_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+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 tools/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tools/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-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_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
+gst-discoverer-@GST_MAJORMINOR@$(EXEEXT): $(gst_discoverer_@GST_MAJORMINOR@_OBJECTS) $(gst_discoverer_@GST_MAJORMINOR@_DEPENDENCIES)
+ @rm -f gst-discoverer-@GST_MAJORMINOR@$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_discoverer_@GST_MAJORMINOR@_OBJECTS) $(gst_discoverer_@GST_MAJORMINOR@_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst-discoverer.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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(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
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ { for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ test -z "$$files" || { \
+ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+
+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)
+ @list='$(MANS)'; if test -n "$$list"; then \
+ list=`for p in $$list; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+ if test -n "$$list" && \
+ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
+ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+ echo " typically \`make maintainer-clean' will remove them" >&2; \
+ exit 1; \
+ else :; fi; \
+ else :; fi
+ @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) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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-binPROGRAMS clean-generic clean-libtool 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-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+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-binPROGRAMS uninstall-binSCRIPTS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-binSCRIPTS 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-man1 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 uninstall-binPROGRAMS \
+ uninstall-binSCRIPTS uninstall-man uninstall-man1
+
+
+# generate versioned scripts from templates
+%-@GST_MAJORMINOR@: %-m.m
+ $(AM_V_GEN)sed -e s,\@GST_MAJORMINOR\@,@GST_MAJORMINOR@,g $< > $@ && \
+ chmod +x $@
+
+# generate man pages
+%-@GST_MAJORMINOR@.1: %.1.in
+ $(AM_V_GEN)sed \
+ -e s,gst-visualise,gst-visualise-@GST_MAJORMINOR@,g \
+ $< >$@
+
+all: all-am chmod
+
+chmod: $(bin_SCRIPTS)
+ @chmod +x $^
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gst-discoverer \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:EXECUTABLE gst-discoverer -:TAGS eng debug \
+ -:SOURCES $(gst_discoverer_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(AM_CFLAGS) \
+ -:LDFLAGS -lgstpbutils-@GST_MAJORMINOR@ -lgstvideo-@GST_MAJORMINOR@ \
+ $(GST_BASE_LIBS) $(GST_LIBS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# 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/tools/gst-discoverer.c b/tools/gst-discoverer.c
new file mode 100644
index 0000000..5b2a74b
--- /dev/null
+++ b/tools/gst-discoverer.c
@@ -0,0 +1,559 @@
+/* GStreamer
+ * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+#include <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+
+static gboolean async = FALSE;
+static gboolean silent = FALSE;
+static gboolean verbose = FALSE;
+
+typedef struct
+{
+ GstDiscoverer *dc;
+ int argc;
+ char **argv;
+} PrivStruct;
+
+#define my_g_string_append_printf(str, format, ...) \
+ g_string_append_printf (str, "%*s" format, 2*depth, " ", ##__VA_ARGS__)
+
+static gchar *
+gst_stream_audio_information_to_string (GstDiscovererStreamInfo * info,
+ gint depth)
+{
+ GstDiscovererAudioInfo *audio_info;
+ GString *s;
+ gchar *tmp;
+ const gchar *ctmp;
+ int len = 400;
+ const GstTagList *tags;
+ GstCaps *caps;
+
+ g_return_val_if_fail (info != NULL, NULL);
+
+ s = g_string_sized_new (len);
+
+ my_g_string_append_printf (s, "Codec:\n");
+ caps = gst_discoverer_stream_info_get_caps (info);
+ tmp = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+
+ my_g_string_append_printf (s, "Additional info:\n");
+ if (gst_discoverer_stream_info_get_misc (info)) {
+ tmp = gst_structure_to_string (gst_discoverer_stream_info_get_misc (info));
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+
+ audio_info = (GstDiscovererAudioInfo *) info;
+ ctmp = gst_discoverer_audio_info_get_language (audio_info);
+ my_g_string_append_printf (s, "Language: %s\n", ctmp ? ctmp : "<unknown>");
+ my_g_string_append_printf (s, "Channels: %u\n",
+ gst_discoverer_audio_info_get_channels (audio_info));
+ my_g_string_append_printf (s, "Sample rate: %u\n",
+ gst_discoverer_audio_info_get_sample_rate (audio_info));
+ my_g_string_append_printf (s, "Depth: %u\n",
+ gst_discoverer_audio_info_get_depth (audio_info));
+
+ my_g_string_append_printf (s, "Bitrate: %u\n",
+ gst_discoverer_audio_info_get_bitrate (audio_info));
+ my_g_string_append_printf (s, "Max bitrate: %u\n",
+ gst_discoverer_audio_info_get_max_bitrate (audio_info));
+
+ my_g_string_append_printf (s, "Tags:\n");
+ tags = gst_discoverer_stream_info_get_tags (info);
+ if (tags) {
+ tmp = gst_structure_to_string ((GstStructure *) tags);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+ if (verbose)
+ my_g_string_append_printf (s, "\n");
+
+ return g_string_free (s, FALSE);
+}
+
+static gchar *
+gst_stream_video_information_to_string (GstDiscovererStreamInfo * info,
+ gint depth)
+{
+ GstDiscovererVideoInfo *video_info;
+ GString *s;
+ gchar *tmp;
+ int len = 500;
+ const GstStructure *misc;
+ const GstTagList *tags;
+ GstCaps *caps;
+
+ g_return_val_if_fail (info != NULL, NULL);
+
+ s = g_string_sized_new (len);
+
+ my_g_string_append_printf (s, "Codec:\n");
+ caps = gst_discoverer_stream_info_get_caps (info);
+ tmp = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+
+ my_g_string_append_printf (s, "Additional info:\n");
+ misc = gst_discoverer_stream_info_get_misc (info);
+ if (misc) {
+ tmp = gst_structure_to_string (misc);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+
+ video_info = (GstDiscovererVideoInfo *) info;
+ my_g_string_append_printf (s, "Width: %u\n",
+ gst_discoverer_video_info_get_width (video_info));
+ my_g_string_append_printf (s, "Height: %u\n",
+ gst_discoverer_video_info_get_height (video_info));
+ my_g_string_append_printf (s, "Depth: %u\n",
+ gst_discoverer_video_info_get_depth (video_info));
+
+ my_g_string_append_printf (s, "Frame rate: %u/%u\n",
+ gst_discoverer_video_info_get_framerate_num (video_info),
+ gst_discoverer_video_info_get_framerate_denom (video_info));
+
+ my_g_string_append_printf (s, "Pixel aspect ratio: %u/%u\n",
+ gst_discoverer_video_info_get_par_num (video_info),
+ gst_discoverer_video_info_get_par_denom (video_info));
+
+ my_g_string_append_printf (s, "Interlaced: %s\n",
+ gst_discoverer_video_info_is_interlaced (video_info) ? "true" : "false");
+
+ my_g_string_append_printf (s, "Bitrate: %u\n",
+ gst_discoverer_video_info_get_bitrate (video_info));
+ my_g_string_append_printf (s, "Max bitrate: %u\n",
+ gst_discoverer_video_info_get_max_bitrate (video_info));
+
+ my_g_string_append_printf (s, "Tags:\n");
+ tags = gst_discoverer_stream_info_get_tags (info);
+ if (tags) {
+ tmp = gst_structure_to_string ((GstStructure *) tags);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+ if (verbose)
+ my_g_string_append_printf (s, "\n");
+
+ return g_string_free (s, FALSE);
+}
+
+static gchar *
+gst_stream_subtitle_information_to_string (GstDiscovererStreamInfo * info,
+ gint depth)
+{
+ GstDiscovererSubtitleInfo *subtitle_info;
+ GString *s;
+ gchar *tmp;
+ const gchar *ctmp;
+ int len = 400;
+ const GstTagList *tags;
+ GstCaps *caps;
+
+ g_return_val_if_fail (info != NULL, NULL);
+
+ s = g_string_sized_new (len);
+
+ my_g_string_append_printf (s, "Codec:\n");
+ caps = gst_discoverer_stream_info_get_caps (info);
+ tmp = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+
+ my_g_string_append_printf (s, "Additional info:\n");
+ if (gst_discoverer_stream_info_get_misc (info)) {
+ tmp = gst_structure_to_string (gst_discoverer_stream_info_get_misc (info));
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+
+ subtitle_info = (GstDiscovererSubtitleInfo *) info;
+ ctmp = gst_discoverer_subtitle_info_get_language (subtitle_info);
+ my_g_string_append_printf (s, "Language: %s\n", ctmp ? ctmp : "<unknown>");
+
+ my_g_string_append_printf (s, "Tags:\n");
+ tags = gst_discoverer_stream_info_get_tags (info);
+ if (tags) {
+ tmp = gst_structure_to_string ((GstStructure *) tags);
+ my_g_string_append_printf (s, " %s\n", tmp);
+ g_free (tmp);
+ } else {
+ my_g_string_append_printf (s, " None\n");
+ }
+ if (verbose)
+ my_g_string_append_printf (s, "\n");
+
+ return g_string_free (s, FALSE);
+}
+
+static void
+print_stream_info (GstDiscovererStreamInfo * info, void *depth)
+{
+ gchar *desc = NULL;
+ GstCaps *caps;
+
+ caps = gst_discoverer_stream_info_get_caps (info);
+
+ if (caps) {
+ if (gst_caps_is_fixed (caps) && !verbose)
+ desc = gst_pb_utils_get_codec_description (caps);
+ else
+ desc = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ }
+
+ g_print ("%*s%s: %s\n", 2 * GPOINTER_TO_INT (depth), " ",
+ gst_discoverer_stream_info_get_stream_type_nick (info), desc);
+
+ if (desc) {
+ g_free (desc);
+ desc = NULL;
+ }
+
+ if (verbose) {
+ if (GST_IS_DISCOVERER_AUDIO_INFO (info))
+ desc =
+ gst_stream_audio_information_to_string (info,
+ GPOINTER_TO_INT (depth) + 1);
+ else if (GST_IS_DISCOVERER_VIDEO_INFO (info))
+ desc =
+ gst_stream_video_information_to_string (info,
+ GPOINTER_TO_INT (depth) + 1);
+ else if (GST_IS_DISCOVERER_SUBTITLE_INFO (info))
+ desc =
+ gst_stream_subtitle_information_to_string (info,
+ GPOINTER_TO_INT (depth) + 1);
+ if (desc) {
+ g_print ("%s", desc);
+ g_free (desc);
+ }
+ }
+}
+
+static void
+print_topology (GstDiscovererStreamInfo * info, gint depth)
+{
+ GstDiscovererStreamInfo *next;
+
+ if (!info)
+ return;
+
+ print_stream_info (info, GINT_TO_POINTER (depth));
+
+ next = gst_discoverer_stream_info_get_next (info);
+ if (next) {
+ print_topology (next, depth + 1);
+ gst_discoverer_stream_info_unref (next);
+ } else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) {
+ GList *tmp, *streams;
+
+ streams =
+ gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO
+ (info));
+ for (tmp = streams; tmp; tmp = tmp->next) {
+ GstDiscovererStreamInfo *tmpinf = (GstDiscovererStreamInfo *) tmp->data;
+ print_topology (tmpinf, depth + 1);
+ }
+ gst_discoverer_stream_info_list_free (streams);
+ }
+}
+
+static gboolean
+print_tag_each (GQuark field_id, const GValue * value, gpointer user_data)
+{
+ gint tab = GPOINTER_TO_INT (user_data);
+ gchar *ser;
+
+ if (G_VALUE_HOLDS_STRING (value))
+ ser = g_value_dup_string (value);
+ else if (GST_VALUE_HOLDS_BUFFER (value)) {
+ GstBuffer *buf = gst_value_get_buffer (value);
+ ser =
+ g_strdup_printf ("<GstBuffer [%" G_GSIZE_FORMAT " bytes]>",
+ gst_buffer_get_size (buf));
+ } else
+ ser = gst_value_serialize (value);
+
+ g_print ("%*s%s: %s\n", tab, " ",
+ gst_tag_get_nick (g_quark_to_string (field_id)), ser);
+ g_free (ser);
+
+ return TRUE;
+}
+
+static void
+print_properties (GstDiscovererInfo * info, gint tab)
+{
+ const GstTagList *tags;
+
+ g_print ("%*sDuration: %" GST_TIME_FORMAT "\n", tab + 1, " ",
+ GST_TIME_ARGS (gst_discoverer_info_get_duration (info)));
+ g_print ("%*sSeekable: %s\n", tab + 1, " ",
+ (gst_discoverer_info_get_seekable (info) ? "yes" : "no"));
+ if ((tags = gst_discoverer_info_get_tags (info))) {
+ g_print ("%*sTags: \n", tab + 1, " ");
+ gst_structure_foreach ((const GstStructure *) tags, print_tag_each,
+ GINT_TO_POINTER (tab + 5));
+ }
+}
+
+static void
+print_info (GstDiscovererInfo * info, GError * err)
+{
+ GstDiscovererResult result = gst_discoverer_info_get_result (info);
+ GstDiscovererStreamInfo *sinfo;
+
+ g_print ("Done discovering %s\n", gst_discoverer_info_get_uri (info));
+ switch (result) {
+ case GST_DISCOVERER_OK:
+ {
+ break;
+ }
+ case GST_DISCOVERER_URI_INVALID:
+ {
+ g_print ("URI is not valid\n");
+ break;
+ }
+ case GST_DISCOVERER_ERROR:
+ {
+ g_print ("An error was encountered while discovering the file\n");
+ g_print (" %s\n", err->message);
+ break;
+ }
+ case GST_DISCOVERER_TIMEOUT:
+ {
+ g_print ("Analyzing URI timed out\n");
+ break;
+ }
+ case GST_DISCOVERER_BUSY:
+ {
+ g_print ("Discoverer was busy\n");
+ break;
+ }
+ case GST_DISCOVERER_MISSING_PLUGINS:
+ {
+ g_print ("Missing plugins\n");
+ if (verbose) {
+ gchar *tmp =
+ gst_structure_to_string (gst_discoverer_info_get_misc (info));
+ g_print (" (%s)\n", tmp);
+ g_free (tmp);
+ }
+ break;
+ }
+ }
+
+ if ((sinfo = gst_discoverer_info_get_stream_info (info))) {
+ g_print ("\nTopology:\n");
+ print_topology (sinfo, 1);
+ g_print ("\nProperties:\n");
+ print_properties (info, 1);
+ gst_discoverer_stream_info_unref (sinfo);
+ }
+
+ g_print ("\n");
+}
+
+static void
+process_file (GstDiscoverer * dc, const gchar * filename)
+{
+ GError *err = NULL;
+ GDir *dir;
+ gchar *uri, *path;
+ GstDiscovererInfo *info;
+ GstStructure *st = NULL;
+
+ if (!gst_uri_is_valid (filename)) {
+ /* Recurse into directories */
+ if ((dir = g_dir_open (filename, 0, NULL))) {
+ const gchar *entry;
+
+ while ((entry = g_dir_read_name (dir))) {
+ gchar *path;
+ path = g_strconcat (filename, G_DIR_SEPARATOR_S, entry, NULL);
+ process_file (dc, path);
+ g_free (path);
+ }
+
+ g_dir_close (dir);
+ return;
+ }
+
+ if (!g_path_is_absolute (filename)) {
+ gchar *cur_dir;
+
+ cur_dir = g_get_current_dir ();
+ path = g_build_filename (cur_dir, filename, NULL);
+ g_free (cur_dir);
+ } else {
+ path = g_strdup (filename);
+ }
+
+ uri = g_filename_to_uri (path, NULL, &err);
+ g_free (path);
+ path = NULL;
+
+ if (err) {
+ g_warning ("Couldn't convert filename to URI: %s\n", err->message);
+ g_error_free (err);
+ return;
+ }
+ } else {
+ uri = g_strdup (filename);
+ }
+
+ if (async == FALSE) {
+ g_print ("Analyzing %s\n", uri);
+ info = gst_discoverer_discover_uri (dc, uri, &err);
+ print_info (info, err);
+ gst_discoverer_info_unref (info);
+ if (st)
+ gst_structure_free (st);
+ } else {
+ gst_discoverer_discover_uri_async (dc, uri);
+ }
+
+ g_free (uri);
+}
+
+static void
+_new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * err)
+{
+ print_info (info, err);
+}
+
+static gboolean
+_run_async (PrivStruct * ps)
+{
+ gint i;
+
+ for (i = 1; i < ps->argc; i++)
+ process_file (ps->dc, ps->argv[i]);
+
+ return FALSE;
+}
+
+static void
+_discoverer_finished (GstDiscoverer * dc, GMainLoop * ml)
+{
+ g_main_loop_quit (ml);
+}
+
+int
+main (int argc, char **argv)
+{
+ GError *err = NULL;
+ GstDiscoverer *dc;
+ gint timeout = 10;
+ GOptionEntry options[] = {
+ {"async", 'a', 0, G_OPTION_ARG_NONE, &async,
+ "Run asynchronously", NULL},
+ {"silent", 's', 0, G_OPTION_ARG_NONE, &silent,
+ "Don't output the information structure", NULL},
+ {"timeout", 't', 0, G_OPTION_ARG_INT, &timeout,
+ "Specify timeout (in seconds, default 10)", "T"},
+ /* {"elem", 'e', 0, G_OPTION_ARG_NONE, &elem_seek, */
+ /* "Seek on elements instead of pads", NULL}, */
+ {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+ "Verbose properties", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx =
+ g_option_context_new
+ ("- discover files synchronously with GstDiscoverer");
+ 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);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uris>\n", argv[0]);
+ exit (-1);
+ }
+
+ dc = gst_discoverer_new (timeout * GST_SECOND, &err);
+ if (G_UNLIKELY (dc == NULL)) {
+ g_print ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+
+ if (async == FALSE) {
+ gint i;
+ for (i = 1; i < argc; i++)
+ process_file (dc, argv[i]);
+ } else {
+ PrivStruct *ps = g_new0 (PrivStruct, 1);
+ GMainLoop *ml = g_main_loop_new (NULL, FALSE);
+
+ ps->dc = dc;
+ ps->argc = argc;
+ ps->argv = argv;
+
+ /* adding uris will be started when the mainloop runs */
+ g_idle_add ((GSourceFunc) _run_async, ps);
+
+ /* connect signals */
+ g_signal_connect (dc, "discovered", G_CALLBACK (_new_discovered_uri), NULL);
+ g_signal_connect (dc, "finished", G_CALLBACK (_discoverer_finished), ml);
+
+ gst_discoverer_start (dc);
+ /* run mainloop */
+ g_main_loop_run (ml);
+
+ gst_discoverer_stop (dc);
+ g_free (ps);
+ g_main_loop_unref (ml);
+ }
+ g_object_unref (dc);
+
+ return 0;
+}
diff --git a/tools/gst-visualise-m.m b/tools/gst-visualise-m.m
new file mode 100644
index 0000000..798929b
--- /dev/null
+++ b/tools/gst-visualise-m.m
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+
+# launch a gst-launch pipeline to display a visualisation of the
+# input audio.
+# make use of default input srcs.
+# visualisation plugin is specified on command line.
+
+### packages
+
+
+my (%pipes, %cfg);
+
+sub read_config
+{
+ my $config_file = `echo -n ~`."/.gst";
+ if (-e $config_file)
+ {
+ open CONFIG, $config_file;
+ while (<CONFIG>)
+ {
+ chomp;
+ s/#.*//;
+ s/\s+$//;
+ next unless length;
+ my ($var, $value) = split (/\s*=\s*/, $_, 2);
+ $cfg{$var} = $value;
+ }
+ if (!($cfg{AUDIOSRC}))
+ {
+ print "Please add an AUDIOSRC to $config_file !\n";
+ }
+ if (!($cfg{VIDEOSINK}))
+ {
+ print "Please add a VIDEOSINK to $config_file !\n";
+ }
+ }
+ else
+ {
+ print "No configuration file $config_file found. You might want to create one.\n";
+ }
+ if (!defined $cfg{AUDIOSRC}) { $cfg{AUDIOSRC} = "osssrc"; }
+ if (!defined $cfg{VIDEOSINK}) { $cfg{VIDEOSINK} = "xvimagesink"; }
+ if (!defined $cfg{CVS_PATH}) { $cfg{CVS_PATH} = `echo -n ~`."/gst/cvs"; }
+}
+
+sub visualise(@)
+{
+ my $vis = $cfg{VISUALIZER};
+ $vis = shift() if ($#_ != -1);
+ $vis = "goom" unless $vis;
+
+ my $pipe;
+ $pipe = $vis unless $pipe = $pipes{$vis};
+
+ $command = "gst-launch-@GST_MAJORMINOR@ $cfg{AUDIOSRC} ! $pipe ! { queue ! videoconvert ! $cfg{VIDEOSINK} }";
+ print "Running $command\n";
+ system ("PATH=\$PATH:".$cfg{CVS_PATH}."/gstreamer/tools $command");
+}
+
+### main
+
+read_config ();
+
+%pipes = (
+ "goom", "goom",
+ "chart", "audioconvert ! chart",
+ "synaesthesia", "synaesthesia",
+ "monoscope", "audioconvert ! monoscope"
+);
+
+if ($#ARGV > 0) {
+ print STDERR "Usage: gst-visualise [visualiser]\n";
+ exit 1;
+}
+
+visualise(@ARGV);
+
diff --git a/tools/gst-visualise.1.in b/tools/gst-visualise.1.in
new file mode 100644
index 0000000..5b5a1fc
--- /dev/null
+++ b/tools/gst-visualise.1.in
@@ -0,0 +1,32 @@
+.TH "GStreamer" "1" "February 2002" "" ""
+.SH "NAME"
+gst\-visualise \- Run a GStreamer pipeline to display an audio visualisation
+.SH "SYNOPSIS"
+\fBgst\-visualise\fR \fI[visualiser]\fR
+.SH "DESCRIPTION"
+.LP
+\fIgst\-visualise\fP is a tool that is used to run a basic \fIGStreamer\fP pipeline, to display a graphical visualisation of an audio stream.
+
+By default, the audio stream is read from ESD (the Enlightened Sound Daemon),
+but this can be changed by setting the AUDIOSRC parameter in ~/.gst. For
+example, you might set "AUDIOSRC=osssrc" to display a visualisation of the
+sound input to your soundcard.
+
+You can select a visualiser by providing a parameter naming the visualiser.
+For example:
+
+ gst\-visualise synaesthesia
+
+will use the synaesthesia plugin. If no visualiser is named, the VISUALIZER
+property in ~/.gst will be used. If this is not specified either, the goom
+visualiser will be used.
+
+The videosink to use to display the visualisation will be read from the
+VIDEOSINK parameter in ~/.gst, defaulting to sdlvideosink.
+
+.SH "SEE ALSO"
+.BR gst\-launch\-ext (1),
+.BR gst\-inspect (1),
+.BR gst\-launch (1),
+.SH "AUTHOR"
+The GStreamer team at http://gstreamer.net/
diff --git a/win32/MANIFEST b/win32/MANIFEST
new file mode 100644
index 0000000..6785c88
--- /dev/null
+++ b/win32/MANIFEST
@@ -0,0 +1,82 @@
+win32/MANIFEST
+win32/common/_stdint.h
+win32/common/config.h
+win32/common/gstrtsp-enumtypes.c
+win32/common/gstrtsp-enumtypes.h
+win32/common/interfaces-enumtypes.c
+win32/common/interfaces-enumtypes.h
+win32/common/libgstapp.def
+win32/common/libgstaudio.def
+win32/common/libgstcdda.def
+win32/common/libgstinterfaces.def
+win32/common/libgstnetbuffer.def
+win32/common/libgstpbutils.def
+win32/common/libgstriff.def
+win32/common/libgstrtp.def
+win32/common/libgstrtsp.def
+win32/common/libgstsdp.def
+win32/common/libgsttag.def
+win32/common/libgstvideo.def
+win32/common/audio-enumtypes.c
+win32/common/audio-enumtypes.h
+win32/common/pbutils-enumtypes.c
+win32/common/pbutils-enumtypes.h
+win32/common/video-enumtypes.c
+win32/common/video-enumtypes.h
+win32/vs6/gst_plugins_base.dsw
+win32/vs6/grammar.dsp
+win32/vs6/libgstadder.dsp
+win32/vs6/libgstaudio.dsp
+win32/vs6/libgstaudioconvert.dsp
+win32/vs6/libgstaudiorate.dsp
+win32/vs6/libgstaudioresample.dsp
+win32/vs6/libgstaudioscale.dsp
+win32/vs6/libgstaudiotestsrc.dsp
+win32/vs6/libgstcdda.dsp
+win32/vs6/libgstdecodebin2.dsp
+win32/vs6/libgstdecodebin.dsp
+win32/vs6/libgstfft.dsp
+win32/vs6/libgstgdp.dsp
+win32/vs6/libgstinterfaces.dsp
+win32/vs6/libgstnetbuffer.dsp
+win32/vs6/libgstogg.dsp
+win32/vs6/libgstpbutils.dsp
+win32/vs6/libgstplaybin.dsp
+win32/vs6/libgstriff.dsp
+win32/vs6/libgstrtp.dsp
+win32/vs6/libgstrtsp.dsp
+win32/vs6/libgstsdp.dsp
+win32/vs6/libgstsinesrc.dsp
+win32/vs6/libgstsubparse.dsp
+win32/vs6/libgsttag.dsp
+win32/vs6/libgsttheora.dsp
+win32/vs6/libgsttypefindfunctions.dsp
+win32/vs6/libgstvideo.dsp
+win32/vs6/libgstvideorate.dsp
+win32/vs6/libgstvideoscale.dsp
+win32/vs6/libgstvideotestsrc.dsp
+win32/vs6/libgstvolume.dsp
+win32/vs6/libgstvorbis.dsp
+win32/vs8/gst-plugins-base.sln
+win32/vs8/libgstadder.vcproj
+win32/vs8/libgstaudio.vcproj
+win32/vs8/libgstaudioconvert.vcproj
+win32/vs8/libgstaudiorate.vcproj
+win32/vs8/libgstaudioresample.vcproj
+win32/vs8/libgstaudiotestsrc.vcproj
+win32/vs8/libgstdecodebin.vcproj
+win32/vs8/libgstinterfaces.vcproj
+win32/vs8/libgstogg.vcproj
+win32/vs8/libgstplaybin.vcproj
+win32/vs8/libgstriff.vcproj
+win32/vs8/libgstsubparse.vcproj
+win32/vs8/libgsttag.vcproj
+win32/vs8/libgsttcp.vcproj
+win32/vs8/libgsttheora.vcproj
+win32/vs8/libgsttypefind.vcproj
+win32/vs8/libgstvideo.vcproj
+win32/vs8/libgstvideorate.vcproj
+win32/vs8/libgstvideoscale.vcproj
+win32/vs8/libgstvideotestsrc.vcproj
+win32/vs8/libgstvolume.vcproj
+win32/vs8/libgstvorbis.vcproj
diff --git a/win32/common/_stdint.h b/win32/common/_stdint.h
new file mode 100644
index 0000000..54baf84
--- /dev/null
+++ b/win32/common/_stdint.h
@@ -0,0 +1,9 @@
+#ifndef _GST_PLUGINS_BASE__STDINT_H
+#define _GST_PLUGINS_BASE__STDINT_H 1
+#ifndef _GENERATED_STDINT_H
+#define _GENERATED_STDINT_H "gst-plugins-base 0.11.1"
+/* generated using gnu compiler gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 */
+#define _STDINT_HAVE_STDINT_H 1
+#include <stdint.h>
+#endif
+#endif
diff --git a/win32/common/audio-enumtypes.c b/win32/common/audio-enumtypes.c
new file mode 100644
index 0000000..84b8a80
--- /dev/null
+++ b/win32/common/audio-enumtypes.c
@@ -0,0 +1,134 @@
+
+
+
+#include "audio-enumtypes.h"
+
+#include "multichannel.h"
+#include "gstringbuffer.h"
+
+/* enumerations from "multichannel.h" */
+GType
+gst_audio_channel_position_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[] = {
+ {GST_AUDIO_CHANNEL_POSITION_INVALID, "GST_AUDIO_CHANNEL_POSITION_INVALID",
+ "invalid"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_MONO", "front-mono"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT", "front-left"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT", "front-right"},
+ {GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_REAR_CENTER", "rear-center"},
+ {GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ "GST_AUDIO_CHANNEL_POSITION_REAR_LEFT", "rear-left"},
+ {GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ "GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT", "rear-right"},
+ {GST_AUDIO_CHANNEL_POSITION_LFE, "GST_AUDIO_CHANNEL_POSITION_LFE", "lfe"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER", "front-center"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER",
+ "front-left-of-center"},
+ {GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER",
+ "front-right-of-center"},
+ {GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ "GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT", "side-left"},
+ {GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ "GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT", "side-right"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_CENTER", "top-center"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT", "top-front-left"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT", "top-front-right"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER", "top-front-center"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT", "top-rear-left"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT", "top-rear-right"},
+ {GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER,
+ "GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER", "top-rear-center"},
+ {GST_AUDIO_CHANNEL_POSITION_NONE, "GST_AUDIO_CHANNEL_POSITION_NONE",
+ "none"},
+ {GST_AUDIO_CHANNEL_POSITION_NUM, "GST_AUDIO_CHANNEL_POSITION_NUM", "num"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstAudioChannelPosition", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "gstringbuffer.h" */
+GType
+gst_ring_buffer_state_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[] = {
+ {GST_RING_BUFFER_STATE_STOPPED, "GST_RING_BUFFER_STATE_STOPPED",
+ "stopped"},
+ {GST_RING_BUFFER_STATE_PAUSED, "GST_RING_BUFFER_STATE_PAUSED", "paused"},
+ {GST_RING_BUFFER_STATE_STARTED, "GST_RING_BUFFER_STATE_STARTED",
+ "started"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstRingBufferState", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_ring_buffer_seg_state_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[] = {
+ {GST_SEGSTATE_INVALID, "GST_SEGSTATE_INVALID", "invalid"},
+ {GST_SEGSTATE_EMPTY, "GST_SEGSTATE_EMPTY", "empty"},
+ {GST_SEGSTATE_FILLED, "GST_SEGSTATE_FILLED", "filled"},
+ {GST_SEGSTATE_PARTIAL, "GST_SEGSTATE_PARTIAL", "partial"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstRingBufferSegState", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_buffer_format_type_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[] = {
+ {GST_BUFTYPE_RAW, "GST_BUFTYPE_RAW", "raw"},
+ {GST_BUFTYPE_MU_LAW, "GST_BUFTYPE_MU_LAW", "mu-law"},
+ {GST_BUFTYPE_A_LAW, "GST_BUFTYPE_A_LAW", "a-law"},
+ {GST_BUFTYPE_IMA_ADPCM, "GST_BUFTYPE_IMA_ADPCM", "ima-adpcm"},
+ {GST_BUFTYPE_MPEG, "GST_BUFTYPE_MPEG", "mpeg"},
+ {GST_BUFTYPE_GSM, "GST_BUFTYPE_GSM", "gsm"},
+ {GST_BUFTYPE_IEC958, "GST_BUFTYPE_IEC958", "iec958"},
+ {GST_BUFTYPE_AC3, "GST_BUFTYPE_AC3", "ac3"},
+ {GST_BUFTYPE_EAC3, "GST_BUFTYPE_EAC3", "eac3"},
+ {GST_BUFTYPE_DTS, "GST_BUFTYPE_DTS", "dts"},
+ {GST_BUFTYPE_MPEG2_AAC, "GST_BUFTYPE_MPEG2_AAC", "mpeg2-aac"},
+ {GST_BUFTYPE_MPEG4_AAC, "GST_BUFTYPE_MPEG4_AAC", "mpeg4-aac"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstBufferFormatType", 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/audio-enumtypes.h b/win32/common/audio-enumtypes.h
new file mode 100644
index 0000000..3ace3cb
--- /dev/null
+++ b/win32/common/audio-enumtypes.h
@@ -0,0 +1,27 @@
+
+
+
+#ifndef __GST_AUDIO_ENUM_TYPES_H__
+#define __GST_AUDIO_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "multichannel.h" */
+GType gst_audio_channel_position_get_type (void);
+#define GST_TYPE_AUDIO_CHANNEL_POSITION (gst_audio_channel_position_get_type())
+
+/* enumerations from "gstringbuffer.h" */
+GType gst_ring_buffer_state_get_type (void);
+#define GST_TYPE_RING_BUFFER_STATE (gst_ring_buffer_state_get_type())
+GType gst_ring_buffer_seg_state_get_type (void);
+#define GST_TYPE_RING_BUFFER_SEG_STATE (gst_ring_buffer_seg_state_get_type())
+GType gst_buffer_format_type_get_type (void);
+#define GST_TYPE_BUFFER_FORMAT_TYPE (gst_buffer_format_type_get_type())
+G_END_DECLS
+
+#endif /* __GST_AUDIO_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/common/config.h b/win32/common/config.h
new file mode 100644
index 0000000..170fce4
--- /dev/null
+++ b/win32/common/config.h
@@ -0,0 +1,392 @@
+/* Autogenerated config.h created for win32 Visual Studio builds */
+
+/* PREFIX -- specifically added for Windows for easier moving */
+#define PREFIX "C:\\gstreamer"
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* The implementation that should be used for integer audio resampling witll
+ be benchmarked at runtime */
+#undef AUDIORESAMPLE_FORMAT_AUTO
+
+/* The float implementation should be used for integer audio resampling */
+#undef AUDIORESAMPLE_FORMAT_FLOAT
+
+/* The int implementation should be used for integer audio resampling */
+#undef AUDIORESAMPLE_FORMAT_INT
+
+/* defined if cdda headers are in a cdda/ directory */
+#undef CDPARANOIA_HEADERS_IN_DIR
+
+/* Default audio sink */
+#define DEFAULT_AUDIOSINK "directsoundsink"
+
+/* Default audio source */
+#undef DEFAULT_AUDIOSRC
+
+/* Default video sink */
+#define DEFAULT_VIDEOSINK "directdrawsink"
+
+/* Default video source */
+#undef DEFAULT_VIDEOSRC
+
+/* 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-base-0.11"
+
+/* The GIO library directory. */
+#undef GIO_LIBDIR
+
+/* The GIO modules directory. */
+#undef GIO_MODULE_DIR
+
+/* system wide data directory */
+#define GST_DATADIR PREFIX "\\share"
+
+/* set to disable libxml2-dependent code in subparse */
+#undef GST_DISABLE_XML
+
+/* macro to use to show function name */
+#undef GST_FUNCTION
+
+/* Defined if gcov is enabled to force a rebuild due to config.h changing */
+#undef GST_GCOV_ENABLED
+
+/* plugin install helper script */
+#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\libexec\\gst-install-plugins-helper.exe"
+
+/* Default errorlevel to use */
+#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR
+
+/* GStreamer license */
+#define GST_LICENSE "LGPL"
+
+/* major/minor version */
+#define GST_MAJORMINOR "0.11"
+
+/* package name in plugins */
+#define GST_PACKAGE_NAME "GStreamer Base 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 "2011-09-29"
+
+/* Define to enable ALSA (used by alsa). */
+#undef HAVE_ALSA
+
+/* Define to enable CDParanoia (used by cdparanoia). */
+#undef HAVE_CDPARANOIA
+
+/* 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 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 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to enable building of experimental plug-ins. */
+#undef HAVE_EXPERIMENTAL
+
+/* Define to enable building of plug-ins with external deps. */
+#undef HAVE_EXTERNAL
+
+/* 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 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* defined if the compiler implements __func__ */
+#undef HAVE_FUNC
+
+/* defined if the compiler implements __FUNCTION__ */
+#undef HAVE_FUNCTION
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to enable GIO library (used by gio). */
+#undef HAVE_GIO
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* make use of iso-codes for ISO-639 */
+#undef HAVE_ISO_CODES
+
+/* Define to enable integer vorbis plug-in (used by ivorbisdec). */
+#undef HAVE_IVORBIS
+
+/* Define to 1 if you have the `asound' library (-lasound). */
+#undef HAVE_LIBASOUND
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+#undef HAVE_LIBRESOLV
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Define to enable libvisual visualization library (used by libvisual). */
+#undef HAVE_LIBVISUAL
+
+/* Define to 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the `log2' function. */
+#undef HAVE_LOG2
+
+/* Define if you have C99's lrint function. */
+#undef HAVE_LRINT
+
+/* Define if you have C99's lrintf function. */
+#undef HAVE_LRINTF
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to enable Xiph Ogg library (used by ogg). */
+#undef HAVE_OGG
+
+/* Use Orc */
+#undef HAVE_ORC
+
+/* Define to enable Pango font rendering (used by pango). */
+#undef HAVE_PANGO
+
+/* defined if the compiler implements __PRETTY_FUNCTION__ */
+#undef HAVE_PRETTY_FUNCTION
+
+/* Define to 1 if you have the <process.h> header file. */
+#define HAVE_PROCESS_H 1
+
+/* Define if RDTSC is available */
+#undef HAVE_RDTSC
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to enable Xiph Theora video codec (used by theora). */
+#undef HAVE_THEORA
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if valgrind should be used */
+#undef HAVE_VALGRIND
+
+/* Define to enable Xiph Vorbis audio codec (used by vorbis). */
+#undef HAVE_VORBIS
+
+/* defined if vorbis_synthesis_restart is present */
+#undef HAVE_VORBIS_SYNTHESIS_RESTART
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* Define to enable X libraries and plugins (used by ximagesink). */
+#undef HAVE_X
+
+/* Define to enable X Shared Memory extension. */
+#undef HAVE_XSHM
+
+/* Define to enable X11 XVideo extensions (used by xvimagesink). */
+#undef HAVE_XVIDEO
+
+/* Define to enable zlib support for ID3 parsing in libgsttag. */
+#undef HAVE_ZLIB
+
+/* the host CPU */
+#define HOST_CPU "i686"
+
+/* prefix */
+#undef ISO_CODES_PREFIX
+
+/* */
+#undef ISO_CODES_VERSION
+
+/* directory in which the detected libvisual's plugins are located */
+#undef LIBVISUAL_PLUGINSBASEDIR
+
+/* gettext locale dir */
+#define LOCALEDIR PREFIX "\\share\\locale"
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Define if you have no native hstrerror() function. */
+#undef NO_HSTRERROR
+
+/* 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-base"
+
+/* 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 Base Plug-ins"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "GStreamer Base Plug-ins 0.11.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gst-plugins-base"
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.11.1"
+
+/* directory where plugins are located */
+#ifdef _DEBUG
+# define PLUGINDIR PREFIX "\\debug\\lib\\gstreamer-0.11"
+#else
+# define PLUGINDIR PREFIX "\\lib\\gstreamer-0.11"
+#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
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* "Define if building for android" */
+#undef USE_TREMOLO
+
+/* Version number of package */
+#define VERSION "0.11.1"
+
+/* 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
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
diff --git a/win32/common/gstrtsp-enumtypes.c b/win32/common/gstrtsp-enumtypes.c
new file mode 100644
index 0000000..ea8ea4a
--- /dev/null
+++ b/win32/common/gstrtsp-enumtypes.c
@@ -0,0 +1,391 @@
+
+
+
+#include "gstrtsp-enumtypes.h"
+
+#include "gstrtspdefs.h"
+
+/* enumerations from "gstrtspdefs.h" */
+GType
+gst_rtsp_result_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[] = {
+ {GST_RTSP_OK, "GST_RTSP_OK", "ok"},
+ {GST_RTSP_ERROR, "GST_RTSP_ERROR", "error"},
+ {GST_RTSP_EINVAL, "GST_RTSP_EINVAL", "einval"},
+ {GST_RTSP_EINTR, "GST_RTSP_EINTR", "eintr"},
+ {GST_RTSP_ENOMEM, "GST_RTSP_ENOMEM", "enomem"},
+ {GST_RTSP_ERESOLV, "GST_RTSP_ERESOLV", "eresolv"},
+ {GST_RTSP_ENOTIMPL, "GST_RTSP_ENOTIMPL", "enotimpl"},
+ {GST_RTSP_ESYS, "GST_RTSP_ESYS", "esys"},
+ {GST_RTSP_EPARSE, "GST_RTSP_EPARSE", "eparse"},
+ {GST_RTSP_EWSASTART, "GST_RTSP_EWSASTART", "ewsastart"},
+ {GST_RTSP_EWSAVERSION, "GST_RTSP_EWSAVERSION", "ewsaversion"},
+ {GST_RTSP_EEOF, "GST_RTSP_EEOF", "eeof"},
+ {GST_RTSP_ENET, "GST_RTSP_ENET", "enet"},
+ {GST_RTSP_ENOTIP, "GST_RTSP_ENOTIP", "enotip"},
+ {GST_RTSP_ETIMEOUT, "GST_RTSP_ETIMEOUT", "etimeout"},
+ {GST_RTSP_ETGET, "GST_RTSP_ETGET", "etget"},
+ {GST_RTSP_ETPOST, "GST_RTSP_ETPOST", "etpost"},
+ {GST_RTSP_ELAST, "GST_RTSP_ELAST", "elast"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstRTSPResult", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_event_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_RTSP_EV_READ, "GST_RTSP_EV_READ", "read"},
+ {GST_RTSP_EV_WRITE, "GST_RTSP_EV_WRITE", "write"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_flags_register_static ("GstRTSPEvent", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_family_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[] = {
+ {GST_RTSP_FAM_NONE, "GST_RTSP_FAM_NONE", "none"},
+ {GST_RTSP_FAM_INET, "GST_RTSP_FAM_INET", "inet"},
+ {GST_RTSP_FAM_INET6, "GST_RTSP_FAM_INET6", "inet6"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstRTSPFamily", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_state_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[] = {
+ {GST_RTSP_STATE_INVALID, "GST_RTSP_STATE_INVALID", "invalid"},
+ {GST_RTSP_STATE_INIT, "GST_RTSP_STATE_INIT", "init"},
+ {GST_RTSP_STATE_READY, "GST_RTSP_STATE_READY", "ready"},
+ {GST_RTSP_STATE_SEEKING, "GST_RTSP_STATE_SEEKING", "seeking"},
+ {GST_RTSP_STATE_PLAYING, "GST_RTSP_STATE_PLAYING", "playing"},
+ {GST_RTSP_STATE_RECORDING, "GST_RTSP_STATE_RECORDING", "recording"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstRTSPState", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_version_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[] = {
+ {GST_RTSP_VERSION_INVALID, "GST_RTSP_VERSION_INVALID", "invalid"},
+ {GST_RTSP_VERSION_1_0, "GST_RTSP_VERSION_1_0", "1-0"},
+ {GST_RTSP_VERSION_1_1, "GST_RTSP_VERSION_1_1", "1-1"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstRTSPVersion", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_method_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_RTSP_INVALID, "GST_RTSP_INVALID", "invalid"},
+ {GST_RTSP_DESCRIBE, "GST_RTSP_DESCRIBE", "describe"},
+ {GST_RTSP_ANNOUNCE, "GST_RTSP_ANNOUNCE", "announce"},
+ {GST_RTSP_GET_PARAMETER, "GST_RTSP_GET_PARAMETER", "get-parameter"},
+ {GST_RTSP_OPTIONS, "GST_RTSP_OPTIONS", "options"},
+ {GST_RTSP_PAUSE, "GST_RTSP_PAUSE", "pause"},
+ {GST_RTSP_PLAY, "GST_RTSP_PLAY", "play"},
+ {GST_RTSP_RECORD, "GST_RTSP_RECORD", "record"},
+ {GST_RTSP_REDIRECT, "GST_RTSP_REDIRECT", "redirect"},
+ {GST_RTSP_SETUP, "GST_RTSP_SETUP", "setup"},
+ {GST_RTSP_SET_PARAMETER, "GST_RTSP_SET_PARAMETER", "set-parameter"},
+ {GST_RTSP_TEARDOWN, "GST_RTSP_TEARDOWN", "teardown"},
+ {GST_RTSP_GET, "GST_RTSP_GET", "get"},
+ {GST_RTSP_POST, "GST_RTSP_POST", "post"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_flags_register_static ("GstRTSPMethod", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_auth_method_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[] = {
+ {GST_RTSP_AUTH_NONE, "GST_RTSP_AUTH_NONE", "none"},
+ {GST_RTSP_AUTH_BASIC, "GST_RTSP_AUTH_BASIC", "basic"},
+ {GST_RTSP_AUTH_DIGEST, "GST_RTSP_AUTH_DIGEST", "digest"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstRTSPAuthMethod", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_header_field_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[] = {
+ {GST_RTSP_HDR_INVALID, "GST_RTSP_HDR_INVALID", "invalid"},
+ {GST_RTSP_HDR_ACCEPT, "GST_RTSP_HDR_ACCEPT", "accept"},
+ {GST_RTSP_HDR_ACCEPT_ENCODING, "GST_RTSP_HDR_ACCEPT_ENCODING",
+ "accept-encoding"},
+ {GST_RTSP_HDR_ACCEPT_LANGUAGE, "GST_RTSP_HDR_ACCEPT_LANGUAGE",
+ "accept-language"},
+ {GST_RTSP_HDR_ALLOW, "GST_RTSP_HDR_ALLOW", "allow"},
+ {GST_RTSP_HDR_AUTHORIZATION, "GST_RTSP_HDR_AUTHORIZATION",
+ "authorization"},
+ {GST_RTSP_HDR_BANDWIDTH, "GST_RTSP_HDR_BANDWIDTH", "bandwidth"},
+ {GST_RTSP_HDR_BLOCKSIZE, "GST_RTSP_HDR_BLOCKSIZE", "blocksize"},
+ {GST_RTSP_HDR_CACHE_CONTROL, "GST_RTSP_HDR_CACHE_CONTROL",
+ "cache-control"},
+ {GST_RTSP_HDR_CONFERENCE, "GST_RTSP_HDR_CONFERENCE", "conference"},
+ {GST_RTSP_HDR_CONNECTION, "GST_RTSP_HDR_CONNECTION", "connection"},
+ {GST_RTSP_HDR_CONTENT_BASE, "GST_RTSP_HDR_CONTENT_BASE", "content-base"},
+ {GST_RTSP_HDR_CONTENT_ENCODING, "GST_RTSP_HDR_CONTENT_ENCODING",
+ "content-encoding"},
+ {GST_RTSP_HDR_CONTENT_LANGUAGE, "GST_RTSP_HDR_CONTENT_LANGUAGE",
+ "content-language"},
+ {GST_RTSP_HDR_CONTENT_LENGTH, "GST_RTSP_HDR_CONTENT_LENGTH",
+ "content-length"},
+ {GST_RTSP_HDR_CONTENT_LOCATION, "GST_RTSP_HDR_CONTENT_LOCATION",
+ "content-location"},
+ {GST_RTSP_HDR_CONTENT_TYPE, "GST_RTSP_HDR_CONTENT_TYPE", "content-type"},
+ {GST_RTSP_HDR_CSEQ, "GST_RTSP_HDR_CSEQ", "cseq"},
+ {GST_RTSP_HDR_DATE, "GST_RTSP_HDR_DATE", "date"},
+ {GST_RTSP_HDR_EXPIRES, "GST_RTSP_HDR_EXPIRES", "expires"},
+ {GST_RTSP_HDR_FROM, "GST_RTSP_HDR_FROM", "from"},
+ {GST_RTSP_HDR_IF_MODIFIED_SINCE, "GST_RTSP_HDR_IF_MODIFIED_SINCE",
+ "if-modified-since"},
+ {GST_RTSP_HDR_LAST_MODIFIED, "GST_RTSP_HDR_LAST_MODIFIED",
+ "last-modified"},
+ {GST_RTSP_HDR_PROXY_AUTHENTICATE, "GST_RTSP_HDR_PROXY_AUTHENTICATE",
+ "proxy-authenticate"},
+ {GST_RTSP_HDR_PROXY_REQUIRE, "GST_RTSP_HDR_PROXY_REQUIRE",
+ "proxy-require"},
+ {GST_RTSP_HDR_PUBLIC, "GST_RTSP_HDR_PUBLIC", "public"},
+ {GST_RTSP_HDR_RANGE, "GST_RTSP_HDR_RANGE", "range"},
+ {GST_RTSP_HDR_REFERER, "GST_RTSP_HDR_REFERER", "referer"},
+ {GST_RTSP_HDR_REQUIRE, "GST_RTSP_HDR_REQUIRE", "require"},
+ {GST_RTSP_HDR_RETRY_AFTER, "GST_RTSP_HDR_RETRY_AFTER", "retry-after"},
+ {GST_RTSP_HDR_RTP_INFO, "GST_RTSP_HDR_RTP_INFO", "rtp-info"},
+ {GST_RTSP_HDR_SCALE, "GST_RTSP_HDR_SCALE", "scale"},
+ {GST_RTSP_HDR_SESSION, "GST_RTSP_HDR_SESSION", "session"},
+ {GST_RTSP_HDR_SERVER, "GST_RTSP_HDR_SERVER", "server"},
+ {GST_RTSP_HDR_SPEED, "GST_RTSP_HDR_SPEED", "speed"},
+ {GST_RTSP_HDR_TRANSPORT, "GST_RTSP_HDR_TRANSPORT", "transport"},
+ {GST_RTSP_HDR_UNSUPPORTED, "GST_RTSP_HDR_UNSUPPORTED", "unsupported"},
+ {GST_RTSP_HDR_USER_AGENT, "GST_RTSP_HDR_USER_AGENT", "user-agent"},
+ {GST_RTSP_HDR_VIA, "GST_RTSP_HDR_VIA", "via"},
+ {GST_RTSP_HDR_WWW_AUTHENTICATE, "GST_RTSP_HDR_WWW_AUTHENTICATE",
+ "www-authenticate"},
+ {GST_RTSP_HDR_CLIENT_CHALLENGE, "GST_RTSP_HDR_CLIENT_CHALLENGE",
+ "client-challenge"},
+ {GST_RTSP_HDR_REAL_CHALLENGE1, "GST_RTSP_HDR_REAL_CHALLENGE1",
+ "real-challenge1"},
+ {GST_RTSP_HDR_REAL_CHALLENGE2, "GST_RTSP_HDR_REAL_CHALLENGE2",
+ "real-challenge2"},
+ {GST_RTSP_HDR_REAL_CHALLENGE3, "GST_RTSP_HDR_REAL_CHALLENGE3",
+ "real-challenge3"},
+ {GST_RTSP_HDR_SUBSCRIBE, "GST_RTSP_HDR_SUBSCRIBE", "subscribe"},
+ {GST_RTSP_HDR_ALERT, "GST_RTSP_HDR_ALERT", "alert"},
+ {GST_RTSP_HDR_CLIENT_ID, "GST_RTSP_HDR_CLIENT_ID", "client-id"},
+ {GST_RTSP_HDR_COMPANY_ID, "GST_RTSP_HDR_COMPANY_ID", "company-id"},
+ {GST_RTSP_HDR_GUID, "GST_RTSP_HDR_GUID", "guid"},
+ {GST_RTSP_HDR_REGION_DATA, "GST_RTSP_HDR_REGION_DATA", "region-data"},
+ {GST_RTSP_HDR_MAX_ASM_WIDTH, "GST_RTSP_HDR_MAX_ASM_WIDTH",
+ "max-asm-width"},
+ {GST_RTSP_HDR_LANGUAGE, "GST_RTSP_HDR_LANGUAGE", "language"},
+ {GST_RTSP_HDR_PLAYER_START_TIME, "GST_RTSP_HDR_PLAYER_START_TIME",
+ "player-start-time"},
+ {GST_RTSP_HDR_LOCATION, "GST_RTSP_HDR_LOCATION", "location"},
+ {GST_RTSP_HDR_ETAG, "GST_RTSP_HDR_ETAG", "etag"},
+ {GST_RTSP_HDR_IF_MATCH, "GST_RTSP_HDR_IF_MATCH", "if-match"},
+ {GST_RTSP_HDR_ACCEPT_CHARSET, "GST_RTSP_HDR_ACCEPT_CHARSET",
+ "accept-charset"},
+ {GST_RTSP_HDR_SUPPORTED, "GST_RTSP_HDR_SUPPORTED", "supported"},
+ {GST_RTSP_HDR_VARY, "GST_RTSP_HDR_VARY", "vary"},
+ {GST_RTSP_HDR_X_ACCELERATE_STREAMING,
+ "GST_RTSP_HDR_X_ACCELERATE_STREAMING", "x-accelerate-streaming"},
+ {GST_RTSP_HDR_X_ACCEPT_AUTHENT, "GST_RTSP_HDR_X_ACCEPT_AUTHENT",
+ "x-accept-authent"},
+ {GST_RTSP_HDR_X_ACCEPT_PROXY_AUTHENT,
+ "GST_RTSP_HDR_X_ACCEPT_PROXY_AUTHENT", "x-accept-proxy-authent"},
+ {GST_RTSP_HDR_X_BROADCAST_ID, "GST_RTSP_HDR_X_BROADCAST_ID",
+ "x-broadcast-id"},
+ {GST_RTSP_HDR_X_BURST_STREAMING, "GST_RTSP_HDR_X_BURST_STREAMING",
+ "x-burst-streaming"},
+ {GST_RTSP_HDR_X_NOTICE, "GST_RTSP_HDR_X_NOTICE", "x-notice"},
+ {GST_RTSP_HDR_X_PLAYER_LAG_TIME, "GST_RTSP_HDR_X_PLAYER_LAG_TIME",
+ "x-player-lag-time"},
+ {GST_RTSP_HDR_X_PLAYLIST, "GST_RTSP_HDR_X_PLAYLIST", "x-playlist"},
+ {GST_RTSP_HDR_X_PLAYLIST_CHANGE_NOTICE,
+ "GST_RTSP_HDR_X_PLAYLIST_CHANGE_NOTICE",
+ "x-playlist-change-notice"},
+ {GST_RTSP_HDR_X_PLAYLIST_GEN_ID, "GST_RTSP_HDR_X_PLAYLIST_GEN_ID",
+ "x-playlist-gen-id"},
+ {GST_RTSP_HDR_X_PLAYLIST_SEEK_ID, "GST_RTSP_HDR_X_PLAYLIST_SEEK_ID",
+ "x-playlist-seek-id"},
+ {GST_RTSP_HDR_X_PROXY_CLIENT_AGENT, "GST_RTSP_HDR_X_PROXY_CLIENT_AGENT",
+ "x-proxy-client-agent"},
+ {GST_RTSP_HDR_X_PROXY_CLIENT_VERB, "GST_RTSP_HDR_X_PROXY_CLIENT_VERB",
+ "x-proxy-client-verb"},
+ {GST_RTSP_HDR_X_RECEDING_PLAYLISTCHANGE,
+ "GST_RTSP_HDR_X_RECEDING_PLAYLISTCHANGE",
+ "x-receding-playlistchange"},
+ {GST_RTSP_HDR_X_RTP_INFO, "GST_RTSP_HDR_X_RTP_INFO", "x-rtp-info"},
+ {GST_RTSP_HDR_X_STARTUPPROFILE, "GST_RTSP_HDR_X_STARTUPPROFILE",
+ "x-startupprofile"},
+ {GST_RTSP_HDR_TIMESTAMP, "GST_RTSP_HDR_TIMESTAMP", "timestamp"},
+ {GST_RTSP_HDR_AUTHENTICATION_INFO, "GST_RTSP_HDR_AUTHENTICATION_INFO",
+ "authentication-info"},
+ {GST_RTSP_HDR_HOST, "GST_RTSP_HDR_HOST", "host"},
+ {GST_RTSP_HDR_PRAGMA, "GST_RTSP_HDR_PRAGMA", "pragma"},
+ {GST_RTSP_HDR_X_SERVER_IP_ADDRESS, "GST_RTSP_HDR_X_SERVER_IP_ADDRESS",
+ "x-server-ip-address"},
+ {GST_RTSP_HDR_X_SESSIONCOOKIE, "GST_RTSP_HDR_X_SESSIONCOOKIE",
+ "x-sessioncookie"},
+ {GST_RTSP_HDR_RTCP_INTERVAL, "GST_RTSP_HDR_RTCP_INTERVAL",
+ "rtcp-interval"},
+ {GST_RTSP_HDR_LAST, "GST_RTSP_HDR_LAST", "last"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstRTSPHeaderField", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_rtsp_status_code_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[] = {
+ {GST_RTSP_STS_INVALID, "GST_RTSP_STS_INVALID", "invalid"},
+ {GST_RTSP_STS_CONTINUE, "GST_RTSP_STS_CONTINUE", "continue"},
+ {GST_RTSP_STS_OK, "GST_RTSP_STS_OK", "ok"},
+ {GST_RTSP_STS_CREATED, "GST_RTSP_STS_CREATED", "created"},
+ {GST_RTSP_STS_LOW_ON_STORAGE, "GST_RTSP_STS_LOW_ON_STORAGE",
+ "low-on-storage"},
+ {GST_RTSP_STS_MULTIPLE_CHOICES, "GST_RTSP_STS_MULTIPLE_CHOICES",
+ "multiple-choices"},
+ {GST_RTSP_STS_MOVED_PERMANENTLY, "GST_RTSP_STS_MOVED_PERMANENTLY",
+ "moved-permanently"},
+ {GST_RTSP_STS_MOVE_TEMPORARILY, "GST_RTSP_STS_MOVE_TEMPORARILY",
+ "move-temporarily"},
+ {GST_RTSP_STS_SEE_OTHER, "GST_RTSP_STS_SEE_OTHER", "see-other"},
+ {GST_RTSP_STS_NOT_MODIFIED, "GST_RTSP_STS_NOT_MODIFIED", "not-modified"},
+ {GST_RTSP_STS_USE_PROXY, "GST_RTSP_STS_USE_PROXY", "use-proxy"},
+ {GST_RTSP_STS_BAD_REQUEST, "GST_RTSP_STS_BAD_REQUEST", "bad-request"},
+ {GST_RTSP_STS_UNAUTHORIZED, "GST_RTSP_STS_UNAUTHORIZED", "unauthorized"},
+ {GST_RTSP_STS_PAYMENT_REQUIRED, "GST_RTSP_STS_PAYMENT_REQUIRED",
+ "payment-required"},
+ {GST_RTSP_STS_FORBIDDEN, "GST_RTSP_STS_FORBIDDEN", "forbidden"},
+ {GST_RTSP_STS_NOT_FOUND, "GST_RTSP_STS_NOT_FOUND", "not-found"},
+ {GST_RTSP_STS_METHOD_NOT_ALLOWED, "GST_RTSP_STS_METHOD_NOT_ALLOWED",
+ "method-not-allowed"},
+ {GST_RTSP_STS_NOT_ACCEPTABLE, "GST_RTSP_STS_NOT_ACCEPTABLE",
+ "not-acceptable"},
+ {GST_RTSP_STS_PROXY_AUTH_REQUIRED, "GST_RTSP_STS_PROXY_AUTH_REQUIRED",
+ "proxy-auth-required"},
+ {GST_RTSP_STS_REQUEST_TIMEOUT, "GST_RTSP_STS_REQUEST_TIMEOUT",
+ "request-timeout"},
+ {GST_RTSP_STS_GONE, "GST_RTSP_STS_GONE", "gone"},
+ {GST_RTSP_STS_LENGTH_REQUIRED, "GST_RTSP_STS_LENGTH_REQUIRED",
+ "length-required"},
+ {GST_RTSP_STS_PRECONDITION_FAILED, "GST_RTSP_STS_PRECONDITION_FAILED",
+ "precondition-failed"},
+ {GST_RTSP_STS_REQUEST_ENTITY_TOO_LARGE,
+ "GST_RTSP_STS_REQUEST_ENTITY_TOO_LARGE",
+ "request-entity-too-large"},
+ {GST_RTSP_STS_REQUEST_URI_TOO_LARGE, "GST_RTSP_STS_REQUEST_URI_TOO_LARGE",
+ "request-uri-too-large"},
+ {GST_RTSP_STS_UNSUPPORTED_MEDIA_TYPE,
+ "GST_RTSP_STS_UNSUPPORTED_MEDIA_TYPE", "unsupported-media-type"},
+ {GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD,
+ "GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD",
+ "parameter-not-understood"},
+ {GST_RTSP_STS_CONFERENCE_NOT_FOUND, "GST_RTSP_STS_CONFERENCE_NOT_FOUND",
+ "conference-not-found"},
+ {GST_RTSP_STS_NOT_ENOUGH_BANDWIDTH, "GST_RTSP_STS_NOT_ENOUGH_BANDWIDTH",
+ "not-enough-bandwidth"},
+ {GST_RTSP_STS_SESSION_NOT_FOUND, "GST_RTSP_STS_SESSION_NOT_FOUND",
+ "session-not-found"},
+ {GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE,
+ "GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE",
+ "method-not-valid-in-this-state"},
+ {GST_RTSP_STS_HEADER_FIELD_NOT_VALID_FOR_RESOURCE,
+ "GST_RTSP_STS_HEADER_FIELD_NOT_VALID_FOR_RESOURCE",
+ "header-field-not-valid-for-resource"},
+ {GST_RTSP_STS_INVALID_RANGE, "GST_RTSP_STS_INVALID_RANGE",
+ "invalid-range"},
+ {GST_RTSP_STS_PARAMETER_IS_READONLY, "GST_RTSP_STS_PARAMETER_IS_READONLY",
+ "parameter-is-readonly"},
+ {GST_RTSP_STS_AGGREGATE_OPERATION_NOT_ALLOWED,
+ "GST_RTSP_STS_AGGREGATE_OPERATION_NOT_ALLOWED",
+ "aggregate-operation-not-allowed"},
+ {GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED,
+ "GST_RTSP_STS_ONLY_AGGREGATE_OPERATION_ALLOWED",
+ "only-aggregate-operation-allowed"},
+ {GST_RTSP_STS_UNSUPPORTED_TRANSPORT, "GST_RTSP_STS_UNSUPPORTED_TRANSPORT",
+ "unsupported-transport"},
+ {GST_RTSP_STS_DESTINATION_UNREACHABLE,
+ "GST_RTSP_STS_DESTINATION_UNREACHABLE", "destination-unreachable"},
+ {GST_RTSP_STS_INTERNAL_SERVER_ERROR, "GST_RTSP_STS_INTERNAL_SERVER_ERROR",
+ "internal-server-error"},
+ {GST_RTSP_STS_NOT_IMPLEMENTED, "GST_RTSP_STS_NOT_IMPLEMENTED",
+ "not-implemented"},
+ {GST_RTSP_STS_BAD_GATEWAY, "GST_RTSP_STS_BAD_GATEWAY", "bad-gateway"},
+ {GST_RTSP_STS_SERVICE_UNAVAILABLE, "GST_RTSP_STS_SERVICE_UNAVAILABLE",
+ "service-unavailable"},
+ {GST_RTSP_STS_GATEWAY_TIMEOUT, "GST_RTSP_STS_GATEWAY_TIMEOUT",
+ "gateway-timeout"},
+ {GST_RTSP_STS_RTSP_VERSION_NOT_SUPPORTED,
+ "GST_RTSP_STS_RTSP_VERSION_NOT_SUPPORTED",
+ "rtsp-version-not-supported"},
+ {GST_RTSP_STS_OPTION_NOT_SUPPORTED, "GST_RTSP_STS_OPTION_NOT_SUPPORTED",
+ "option-not-supported"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstRTSPStatusCode", 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/gstrtsp-enumtypes.h b/win32/common/gstrtsp-enumtypes.h
new file mode 100644
index 0000000..3254324
--- /dev/null
+++ b/win32/common/gstrtsp-enumtypes.h
@@ -0,0 +1,35 @@
+
+
+
+#ifndef __gst_rtsp_ENUM_TYPES_H__
+#define __gst_rtsp_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "gstrtspdefs.h" */
+GType gst_rtsp_result_get_type (void);
+#define GST_TYPE_RTSP_RESULT (gst_rtsp_result_get_type())
+GType gst_rtsp_event_get_type (void);
+#define GST_TYPE_RTSP_EVENT (gst_rtsp_event_get_type())
+GType gst_rtsp_family_get_type (void);
+#define GST_TYPE_RTSP_FAMILY (gst_rtsp_family_get_type())
+GType gst_rtsp_state_get_type (void);
+#define GST_TYPE_RTSP_STATE (gst_rtsp_state_get_type())
+GType gst_rtsp_version_get_type (void);
+#define GST_TYPE_RTSP_VERSION (gst_rtsp_version_get_type())
+GType gst_rtsp_method_get_type (void);
+#define GST_TYPE_RTSP_METHOD (gst_rtsp_method_get_type())
+GType gst_rtsp_auth_method_get_type (void);
+#define GST_TYPE_RTSP_AUTH_METHOD (gst_rtsp_auth_method_get_type())
+GType gst_rtsp_header_field_get_type (void);
+#define GST_TYPE_RTSP_HEADER_FIELD (gst_rtsp_header_field_get_type())
+GType gst_rtsp_status_code_get_type (void);
+#define GST_TYPE_RTSP_STATUS_CODE (gst_rtsp_status_code_get_type())
+G_END_DECLS
+
+#endif /* __gst_rtsp_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/common/interfaces-enumtypes.c b/win32/common/interfaces-enumtypes.c
new file mode 100644
index 0000000..84e968e
--- /dev/null
+++ b/win32/common/interfaces-enumtypes.c
@@ -0,0 +1,274 @@
+
+
+
+#include "interfaces-enumtypes.h"
+
+#include "colorbalance.h"
+#include "colorbalancechannel.h"
+#include "mixer.h"
+#include "mixeroptions.h"
+#include "mixertrack.h"
+#include "navigation.h"
+#include "propertyprobe.h"
+#include "streamvolume.h"
+#include "tuner.h"
+#include "tunernorm.h"
+#include "tunerchannel.h"
+#include "videoorientation.h"
+#include "videooverlay.h"
+
+/* enumerations from "colorbalance.h" */
+GType
+gst_color_balance_type_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[] = {
+ {GST_COLOR_BALANCE_HARDWARE, "GST_COLOR_BALANCE_HARDWARE", "hardware"},
+ {GST_COLOR_BALANCE_SOFTWARE, "GST_COLOR_BALANCE_SOFTWARE", "software"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstColorBalanceType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "mixer.h" */
+GType
+gst_mixer_type_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[] = {
+ {GST_MIXER_HARDWARE, "GST_MIXER_HARDWARE", "hardware"},
+ {GST_MIXER_SOFTWARE, "GST_MIXER_SOFTWARE", "software"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstMixerType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_mixer_message_type_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[] = {
+ {GST_MIXER_MESSAGE_INVALID, "GST_MIXER_MESSAGE_INVALID", "invalid"},
+ {GST_MIXER_MESSAGE_MUTE_TOGGLED, "GST_MIXER_MESSAGE_MUTE_TOGGLED",
+ "mute-toggled"},
+ {GST_MIXER_MESSAGE_RECORD_TOGGLED, "GST_MIXER_MESSAGE_RECORD_TOGGLED",
+ "record-toggled"},
+ {GST_MIXER_MESSAGE_VOLUME_CHANGED, "GST_MIXER_MESSAGE_VOLUME_CHANGED",
+ "volume-changed"},
+ {GST_MIXER_MESSAGE_OPTION_CHANGED, "GST_MIXER_MESSAGE_OPTION_CHANGED",
+ "option-changed"},
+ {GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED,
+ "GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED", "options-list-changed"},
+ {GST_MIXER_MESSAGE_MIXER_CHANGED, "GST_MIXER_MESSAGE_MIXER_CHANGED",
+ "mixer-changed"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstMixerMessageType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_mixer_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_MIXER_FLAG_NONE, "GST_MIXER_FLAG_NONE", "none"},
+ {GST_MIXER_FLAG_AUTO_NOTIFICATIONS, "GST_MIXER_FLAG_AUTO_NOTIFICATIONS",
+ "auto-notifications"},
+ {GST_MIXER_FLAG_HAS_WHITELIST, "GST_MIXER_FLAG_HAS_WHITELIST",
+ "has-whitelist"},
+ {GST_MIXER_FLAG_GROUPING, "GST_MIXER_FLAG_GROUPING", "grouping"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_flags_register_static ("GstMixerFlags", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "mixertrack.h" */
+GType
+gst_mixer_track_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_MIXER_TRACK_INPUT, "GST_MIXER_TRACK_INPUT", "input"},
+ {GST_MIXER_TRACK_OUTPUT, "GST_MIXER_TRACK_OUTPUT", "output"},
+ {GST_MIXER_TRACK_MUTE, "GST_MIXER_TRACK_MUTE", "mute"},
+ {GST_MIXER_TRACK_RECORD, "GST_MIXER_TRACK_RECORD", "record"},
+ {GST_MIXER_TRACK_MASTER, "GST_MIXER_TRACK_MASTER", "master"},
+ {GST_MIXER_TRACK_SOFTWARE, "GST_MIXER_TRACK_SOFTWARE", "software"},
+ {GST_MIXER_TRACK_NO_RECORD, "GST_MIXER_TRACK_NO_RECORD", "no-record"},
+ {GST_MIXER_TRACK_NO_MUTE, "GST_MIXER_TRACK_NO_MUTE", "no-mute"},
+ {GST_MIXER_TRACK_WHITELIST, "GST_MIXER_TRACK_WHITELIST", "whitelist"},
+ {GST_MIXER_TRACK_READONLY, "GST_MIXER_TRACK_READONLY", "readonly"},
+ {GST_MIXER_TRACK_WRITEONLY, "GST_MIXER_TRACK_WRITEONLY", "writeonly"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_flags_register_static ("GstMixerTrackFlags", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "navigation.h" */
+GType
+gst_navigation_command_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[] = {
+ {GST_NAVIGATION_COMMAND_INVALID, "GST_NAVIGATION_COMMAND_INVALID",
+ "invalid"},
+ {GST_NAVIGATION_COMMAND_MENU1, "GST_NAVIGATION_COMMAND_MENU1", "menu1"},
+ {GST_NAVIGATION_COMMAND_MENU2, "GST_NAVIGATION_COMMAND_MENU2", "menu2"},
+ {GST_NAVIGATION_COMMAND_MENU3, "GST_NAVIGATION_COMMAND_MENU3", "menu3"},
+ {GST_NAVIGATION_COMMAND_MENU4, "GST_NAVIGATION_COMMAND_MENU4", "menu4"},
+ {GST_NAVIGATION_COMMAND_MENU5, "GST_NAVIGATION_COMMAND_MENU5", "menu5"},
+ {GST_NAVIGATION_COMMAND_MENU6, "GST_NAVIGATION_COMMAND_MENU6", "menu6"},
+ {GST_NAVIGATION_COMMAND_MENU7, "GST_NAVIGATION_COMMAND_MENU7", "menu7"},
+ {GST_NAVIGATION_COMMAND_LEFT, "GST_NAVIGATION_COMMAND_LEFT", "left"},
+ {GST_NAVIGATION_COMMAND_RIGHT, "GST_NAVIGATION_COMMAND_RIGHT", "right"},
+ {GST_NAVIGATION_COMMAND_UP, "GST_NAVIGATION_COMMAND_UP", "up"},
+ {GST_NAVIGATION_COMMAND_DOWN, "GST_NAVIGATION_COMMAND_DOWN", "down"},
+ {GST_NAVIGATION_COMMAND_ACTIVATE, "GST_NAVIGATION_COMMAND_ACTIVATE",
+ "activate"},
+ {GST_NAVIGATION_COMMAND_PREV_ANGLE, "GST_NAVIGATION_COMMAND_PREV_ANGLE",
+ "prev-angle"},
+ {GST_NAVIGATION_COMMAND_NEXT_ANGLE, "GST_NAVIGATION_COMMAND_NEXT_ANGLE",
+ "next-angle"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstNavigationCommand", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_navigation_query_type_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[] = {
+ {GST_NAVIGATION_QUERY_INVALID, "GST_NAVIGATION_QUERY_INVALID", "invalid"},
+ {GST_NAVIGATION_QUERY_COMMANDS, "GST_NAVIGATION_QUERY_COMMANDS",
+ "commands"},
+ {GST_NAVIGATION_QUERY_ANGLES, "GST_NAVIGATION_QUERY_ANGLES", "angles"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstNavigationQueryType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_navigation_message_type_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[] = {
+ {GST_NAVIGATION_MESSAGE_INVALID, "GST_NAVIGATION_MESSAGE_INVALID",
+ "invalid"},
+ {GST_NAVIGATION_MESSAGE_MOUSE_OVER, "GST_NAVIGATION_MESSAGE_MOUSE_OVER",
+ "mouse-over"},
+ {GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED,
+ "GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED", "commands-changed"},
+ {GST_NAVIGATION_MESSAGE_ANGLES_CHANGED,
+ "GST_NAVIGATION_MESSAGE_ANGLES_CHANGED", "angles-changed"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstNavigationMessageType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_navigation_event_type_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[] = {
+ {GST_NAVIGATION_EVENT_INVALID, "GST_NAVIGATION_EVENT_INVALID", "invalid"},
+ {GST_NAVIGATION_EVENT_KEY_PRESS, "GST_NAVIGATION_EVENT_KEY_PRESS",
+ "key-press"},
+ {GST_NAVIGATION_EVENT_KEY_RELEASE, "GST_NAVIGATION_EVENT_KEY_RELEASE",
+ "key-release"},
+ {GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS,
+ "GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS", "mouse-button-press"},
+ {GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE,
+ "GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE",
+ "mouse-button-release"},
+ {GST_NAVIGATION_EVENT_MOUSE_MOVE, "GST_NAVIGATION_EVENT_MOUSE_MOVE",
+ "mouse-move"},
+ {GST_NAVIGATION_EVENT_COMMAND, "GST_NAVIGATION_EVENT_COMMAND", "command"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstNavigationEventType", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "streamvolume.h" */
+GType
+gst_stream_volume_format_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[] = {
+ {GST_STREAM_VOLUME_FORMAT_LINEAR, "GST_STREAM_VOLUME_FORMAT_LINEAR",
+ "linear"},
+ {GST_STREAM_VOLUME_FORMAT_CUBIC, "GST_STREAM_VOLUME_FORMAT_CUBIC",
+ "cubic"},
+ {GST_STREAM_VOLUME_FORMAT_DB, "GST_STREAM_VOLUME_FORMAT_DB", "db"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstStreamVolumeFormat", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "tunerchannel.h" */
+GType
+gst_tuner_channel_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_TUNER_CHANNEL_INPUT, "GST_TUNER_CHANNEL_INPUT", "input"},
+ {GST_TUNER_CHANNEL_OUTPUT, "GST_TUNER_CHANNEL_OUTPUT", "output"},
+ {GST_TUNER_CHANNEL_FREQUENCY, "GST_TUNER_CHANNEL_FREQUENCY", "frequency"},
+ {GST_TUNER_CHANNEL_AUDIO, "GST_TUNER_CHANNEL_AUDIO", "audio"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_flags_register_static ("GstTunerChannelFlags", 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/interfaces-enumtypes.h b/win32/common/interfaces-enumtypes.h
new file mode 100644
index 0000000..77fd7eb
--- /dev/null
+++ b/win32/common/interfaces-enumtypes.h
@@ -0,0 +1,49 @@
+
+
+
+#ifndef __GST_INTERFACES_ENUM_TYPES_H__
+#define __GST_INTERFACES_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "colorbalance.h" */
+GType gst_color_balance_type_get_type (void);
+#define GST_TYPE_COLOR_BALANCE_TYPE (gst_color_balance_type_get_type())
+
+/* enumerations from "mixer.h" */
+GType gst_mixer_type_get_type (void);
+#define GST_TYPE_MIXER_TYPE (gst_mixer_type_get_type())
+GType gst_mixer_message_type_get_type (void);
+#define GST_TYPE_MIXER_MESSAGE_TYPE (gst_mixer_message_type_get_type())
+GType gst_mixer_flags_get_type (void);
+#define GST_TYPE_MIXER_FLAGS (gst_mixer_flags_get_type())
+
+/* enumerations from "mixertrack.h" */
+GType gst_mixer_track_flags_get_type (void);
+#define GST_TYPE_MIXER_TRACK_FLAGS (gst_mixer_track_flags_get_type())
+
+/* enumerations from "navigation.h" */
+GType gst_navigation_command_get_type (void);
+#define GST_TYPE_NAVIGATION_COMMAND (gst_navigation_command_get_type())
+GType gst_navigation_query_type_get_type (void);
+#define GST_TYPE_NAVIGATION_QUERY_TYPE (gst_navigation_query_type_get_type())
+GType gst_navigation_message_type_get_type (void);
+#define GST_TYPE_NAVIGATION_MESSAGE_TYPE (gst_navigation_message_type_get_type())
+GType gst_navigation_event_type_get_type (void);
+#define GST_TYPE_NAVIGATION_EVENT_TYPE (gst_navigation_event_type_get_type())
+
+/* enumerations from "streamvolume.h" */
+GType gst_stream_volume_format_get_type (void);
+#define GST_TYPE_STREAM_VOLUME_FORMAT (gst_stream_volume_format_get_type())
+
+/* enumerations from "tunerchannel.h" */
+GType gst_tuner_channel_flags_get_type (void);
+#define GST_TYPE_TUNER_CHANNEL_FLAGS (gst_tuner_channel_flags_get_type())
+G_END_DECLS
+
+#endif /* __GST_INTERFACES_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/common/libgstapp.def b/win32/common/libgstapp.def
new file mode 100644
index 0000000..596a576
--- /dev/null
+++ b/win32/common/libgstapp.def
@@ -0,0 +1,32 @@
+EXPORTS
+ gst_app_sink_get_caps
+ gst_app_sink_get_drop
+ gst_app_sink_get_emit_signals
+ gst_app_sink_get_max_buffers
+ gst_app_sink_get_type
+ gst_app_sink_is_eos
+ gst_app_sink_pull_buffer
+ gst_app_sink_pull_buffer_list
+ gst_app_sink_pull_preroll
+ gst_app_sink_set_callbacks
+ gst_app_sink_set_caps
+ gst_app_sink_set_drop
+ gst_app_sink_set_emit_signals
+ gst_app_sink_set_max_buffers
+ gst_app_src_end_of_stream
+ gst_app_src_get_caps
+ gst_app_src_get_emit_signals
+ gst_app_src_get_latency
+ gst_app_src_get_max_bytes
+ gst_app_src_get_size
+ gst_app_src_get_stream_type
+ gst_app_src_get_type
+ gst_app_src_push_buffer
+ gst_app_src_set_callbacks
+ gst_app_src_set_caps
+ gst_app_src_set_emit_signals
+ gst_app_src_set_latency
+ gst_app_src_set_max_bytes
+ gst_app_src_set_size
+ gst_app_src_set_stream_type
+ gst_app_stream_type_get_type
diff --git a/win32/common/libgstaudio.def b/win32/common/libgstaudio.def
new file mode 100644
index 0000000..79cf6d9
--- /dev/null
+++ b/win32/common/libgstaudio.def
@@ -0,0 +1,125 @@
+EXPORTS
+ _gst_audio_decoder_error
+ gst_audio_buffer_clip
+ gst_audio_channel_position_get_type
+ gst_audio_check_channel_positions
+ gst_audio_clock_adjust
+ gst_audio_clock_get_time
+ gst_audio_clock_get_type
+ gst_audio_clock_invalidate
+ gst_audio_clock_new
+ gst_audio_clock_new_full
+ gst_audio_clock_reset
+ gst_audio_decoder_finish_frame
+ gst_audio_decoder_get_audio_info
+ gst_audio_decoder_get_byte_time
+ gst_audio_decoder_get_delay
+ gst_audio_decoder_get_latency
+ gst_audio_decoder_get_max_errors
+ gst_audio_decoder_get_min_latency
+ gst_audio_decoder_get_parse_state
+ gst_audio_decoder_get_plc
+ gst_audio_decoder_get_plc_aware
+ gst_audio_decoder_get_tolerance
+ gst_audio_decoder_get_type
+ gst_audio_decoder_set_byte_time
+ gst_audio_decoder_set_latency
+ gst_audio_decoder_set_max_errors
+ gst_audio_decoder_set_min_latency
+ gst_audio_decoder_set_outcaps
+ gst_audio_decoder_set_plc
+ gst_audio_decoder_set_plc_aware
+ gst_audio_decoder_set_tolerance
+ gst_audio_default_registry_mixer_filter
+ gst_audio_encoder_finish_frame
+ gst_audio_encoder_get_audio_info
+ gst_audio_encoder_get_frame_max
+ gst_audio_encoder_get_frame_samples_max
+ gst_audio_encoder_get_frame_samples_min
+ gst_audio_encoder_get_hard_resync
+ gst_audio_encoder_get_latency
+ gst_audio_encoder_get_lookahead
+ gst_audio_encoder_get_mark_granule
+ gst_audio_encoder_get_perfect_timestamp
+ gst_audio_encoder_get_tolerance
+ gst_audio_encoder_get_type
+ gst_audio_encoder_merge_tags
+ gst_audio_encoder_proxy_getcaps
+ gst_audio_encoder_set_frame_max
+ gst_audio_encoder_set_frame_samples_max
+ gst_audio_encoder_set_frame_samples_min
+ gst_audio_encoder_set_hard_resync
+ gst_audio_encoder_set_latency
+ gst_audio_encoder_set_lookahead
+ gst_audio_encoder_set_mark_granule
+ gst_audio_encoder_set_perfect_timestamp
+ gst_audio_encoder_set_tolerance
+ gst_audio_filter_class_add_pad_templates
+ gst_audio_filter_get_type
+ gst_audio_fixate_channel_positions
+ gst_audio_format_build_integer
+ gst_audio_format_fill_silence
+ gst_audio_format_from_string
+ gst_audio_format_get_info
+ gst_audio_format_to_string
+ gst_audio_get_channel_positions
+ gst_audio_iec61937_frame_size
+ gst_audio_iec61937_payload
+ gst_audio_info_convert
+ gst_audio_info_from_caps
+ gst_audio_info_init
+ gst_audio_info_set_format
+ gst_audio_info_to_caps
+ gst_audio_set_caps_channel_positions_list
+ gst_audio_set_channel_positions
+ gst_audio_set_structure_channel_positions_list
+ gst_audio_sink_get_type
+ gst_audio_src_get_type
+ gst_base_audio_sink_create_ringbuffer
+ gst_base_audio_sink_get_drift_tolerance
+ gst_base_audio_sink_get_provide_clock
+ gst_base_audio_sink_get_slave_method
+ gst_base_audio_sink_get_type
+ gst_base_audio_sink_set_drift_tolerance
+ gst_base_audio_sink_set_provide_clock
+ gst_base_audio_sink_set_slave_method
+ gst_base_audio_sink_slave_method_get_type
+ gst_base_audio_src_create_ringbuffer
+ gst_base_audio_src_get_provide_clock
+ gst_base_audio_src_get_slave_method
+ gst_base_audio_src_get_type
+ gst_base_audio_src_set_provide_clock
+ gst_base_audio_src_set_slave_method
+ gst_base_audio_src_slave_method_get_type
+ gst_buffer_format_type_get_type
+ gst_ring_buffer_acquire
+ gst_ring_buffer_activate
+ gst_ring_buffer_advance
+ gst_ring_buffer_clear
+ gst_ring_buffer_clear_all
+ gst_ring_buffer_close_device
+ gst_ring_buffer_commit
+ gst_ring_buffer_commit_full
+ gst_ring_buffer_convert
+ gst_ring_buffer_debug_spec_buff
+ gst_ring_buffer_debug_spec_caps
+ gst_ring_buffer_delay
+ gst_ring_buffer_device_is_open
+ gst_ring_buffer_get_type
+ gst_ring_buffer_is_acquired
+ gst_ring_buffer_is_active
+ gst_ring_buffer_may_start
+ gst_ring_buffer_open_device
+ gst_ring_buffer_parse_caps
+ gst_ring_buffer_pause
+ gst_ring_buffer_prepare_read
+ gst_ring_buffer_read
+ gst_ring_buffer_release
+ gst_ring_buffer_samples_done
+ gst_ring_buffer_seg_state_get_type
+ gst_ring_buffer_set_callback
+ gst_ring_buffer_set_flushing
+ gst_ring_buffer_set_sample
+ gst_ring_buffer_start
+ gst_ring_buffer_state_get_type
+ gst_ring_buffer_stop
diff --git a/win32/common/libgstcdda.def b/win32/common/libgstcdda.def
new file mode 100644
index 0000000..736f61c
--- /dev/null
+++ b/win32/common/libgstcdda.def
@@ -0,0 +1,4 @@
+EXPORTS
+ gst_cdda_base_src_add_track
+ gst_cdda_base_src_get_type
+ gst_cdda_base_src_mode_get_type
diff --git a/win32/common/libgstinterfaces.def b/win32/common/libgstinterfaces.def
new file mode 100644
index 0000000..6b974b5
--- /dev/null
+++ b/win32/common/libgstinterfaces.def
@@ -0,0 +1,121 @@
+EXPORTS
+ gst_color_balance_channel_get_type
+ gst_color_balance_get_balance_type
+ gst_color_balance_get_type
+ gst_color_balance_get_value
+ gst_color_balance_list_channels
+ gst_color_balance_set_value
+ gst_color_balance_type_get_type
+ gst_color_balance_value_changed
+ gst_is_video_overlay_prepare_window_handle_message
+ gst_mixer_flags_get_type
+ gst_mixer_get_mixer_flags
+ gst_mixer_get_mixer_type
+ gst_mixer_get_option
+ gst_mixer_get_type
+ gst_mixer_get_volume
+ gst_mixer_list_tracks
+ gst_mixer_message_get_type
+ gst_mixer_message_parse_mute_toggled
+ gst_mixer_message_parse_option_changed
+ gst_mixer_message_parse_options_list_changed
+ gst_mixer_message_parse_record_toggled
+ gst_mixer_message_parse_volume_changed
+ gst_mixer_message_type_get_type
+ gst_mixer_mixer_changed
+ gst_mixer_mute_toggled
+ gst_mixer_option_changed
+ gst_mixer_options_get_type
+ gst_mixer_options_get_values
+ gst_mixer_options_list_changed
+ gst_mixer_record_toggled
+ gst_mixer_set_mute
+ gst_mixer_set_option
+ gst_mixer_set_record
+ gst_mixer_set_volume
+ gst_mixer_track_flags_get_type
+ gst_mixer_track_get_type
+ gst_mixer_type_get_type
+ gst_mixer_volume_changed
+ gst_navigation_command_get_type
+ gst_navigation_event_get_type
+ gst_navigation_event_parse_command
+ gst_navigation_event_parse_key_event
+ gst_navigation_event_parse_mouse_button_event
+ gst_navigation_event_parse_mouse_move_event
+ gst_navigation_event_type_get_type
+ gst_navigation_get_type
+ gst_navigation_message_get_type
+ gst_navigation_message_new_angles_changed
+ gst_navigation_message_new_commands_changed
+ gst_navigation_message_new_mouse_over
+ gst_navigation_message_parse_angles_changed
+ gst_navigation_message_parse_mouse_over
+ gst_navigation_message_type_get_type
+ gst_navigation_query_get_type
+ gst_navigation_query_new_angles
+ gst_navigation_query_new_commands
+ gst_navigation_query_parse_angles
+ gst_navigation_query_parse_commands_length
+ gst_navigation_query_parse_commands_nth
+ gst_navigation_query_set_angles
+ gst_navigation_query_set_commands
+ gst_navigation_query_set_commandsv
+ gst_navigation_query_type_get_type
+ gst_navigation_send_command
+ gst_navigation_send_event
+ gst_navigation_send_key_event
+ gst_navigation_send_mouse_event
+ gst_property_probe_get_properties
+ gst_property_probe_get_property
+ gst_property_probe_get_type
+ gst_property_probe_get_values
+ gst_property_probe_get_values_name
+ gst_property_probe_needs_probe
+ gst_property_probe_needs_probe_name
+ gst_property_probe_probe_and_get_values
+ gst_property_probe_probe_and_get_values_name
+ gst_property_probe_probe_property
+ gst_property_probe_probe_property_name
+ gst_stream_volume_convert_volume
+ gst_stream_volume_format_get_type
+ gst_stream_volume_get_mute
+ gst_stream_volume_get_type
+ gst_stream_volume_get_volume
+ gst_stream_volume_set_mute
+ gst_stream_volume_set_volume
+ gst_tuner_channel_changed
+ gst_tuner_channel_flags_get_type
+ gst_tuner_channel_get_type
+ gst_tuner_find_channel_by_name
+ gst_tuner_find_norm_by_name
+ gst_tuner_frequency_changed
+ gst_tuner_get_channel
+ gst_tuner_get_frequency
+ gst_tuner_get_norm
+ gst_tuner_get_type
+ gst_tuner_list_channels
+ gst_tuner_list_norms
+ gst_tuner_norm_changed
+ gst_tuner_norm_get_type
+ gst_tuner_set_channel
+ gst_tuner_set_frequency
+ gst_tuner_set_norm
+ gst_tuner_signal_changed
+ gst_tuner_signal_strength
+ gst_video_orientation_get_hcenter
+ gst_video_orientation_get_hflip
+ gst_video_orientation_get_type
+ gst_video_orientation_get_vcenter
+ gst_video_orientation_get_vflip
+ gst_video_orientation_set_hcenter
+ gst_video_orientation_set_hflip
+ gst_video_orientation_set_vcenter
+ gst_video_orientation_set_vflip
+ gst_video_overlay_expose
+ gst_video_overlay_get_type
+ gst_video_overlay_got_window_handle
+ gst_video_overlay_handle_events
+ gst_video_overlay_prepare_window_handle
+ gst_video_overlay_set_render_rectangle
+ gst_video_overlay_set_window_handle
diff --git a/win32/common/libgstnetbuffer.def b/win32/common/libgstnetbuffer.def
new file mode 100644
index 0000000..4a191d4
--- /dev/null
+++ b/win32/common/libgstnetbuffer.def
@@ -0,0 +1,11 @@
+EXPORTS
+ gst_meta_net_address_get_info
+ gst_netaddress_equal
+ gst_netaddress_get_address_bytes
+ gst_netaddress_get_ip4_address
+ gst_netaddress_get_ip6_address
+ gst_netaddress_get_net_type
+ gst_netaddress_set_address_bytes
+ gst_netaddress_set_ip4_address
+ gst_netaddress_set_ip6_address
+ gst_netaddress_to_string
diff --git a/win32/common/libgstpbutils.def b/win32/common/libgstpbutils.def
new file mode 100644
index 0000000..3fa74d4
--- /dev/null
+++ b/win32/common/libgstpbutils.def
@@ -0,0 +1,142 @@
+EXPORTS
+ gst_codec_utils_aac_caps_set_level_and_profile
+ gst_codec_utils_aac_get_level
+ gst_codec_utils_aac_get_profile
+ gst_codec_utils_aac_get_sample_rate_from_index
+ gst_codec_utils_h264_caps_set_level_and_profile
+ gst_codec_utils_h264_get_level
+ gst_codec_utils_h264_get_level_idc
+ gst_codec_utils_h264_get_profile
+ gst_codec_utils_mpeg4video_caps_set_level_and_profile
+ gst_codec_utils_mpeg4video_get_level
+ gst_codec_utils_mpeg4video_get_profile
+ gst_discoverer_audio_info_get_bitrate
+ gst_discoverer_audio_info_get_channels
+ gst_discoverer_audio_info_get_depth
+ gst_discoverer_audio_info_get_language
+ gst_discoverer_audio_info_get_max_bitrate
+ gst_discoverer_audio_info_get_sample_rate
+ gst_discoverer_audio_info_get_type
+ gst_discoverer_container_info_get_streams
+ gst_discoverer_container_info_get_type
+ gst_discoverer_discover_uri
+ gst_discoverer_discover_uri_async
+ gst_discoverer_get_type
+ gst_discoverer_info_copy
+ gst_discoverer_info_get_audio_streams
+ gst_discoverer_info_get_container_streams
+ gst_discoverer_info_get_duration
+ gst_discoverer_info_get_misc
+ gst_discoverer_info_get_result
+ gst_discoverer_info_get_seekable
+ gst_discoverer_info_get_stream_info
+ gst_discoverer_info_get_stream_list
+ gst_discoverer_info_get_streams
+ gst_discoverer_info_get_subtitle_streams
+ gst_discoverer_info_get_tags
+ gst_discoverer_info_get_type
+ gst_discoverer_info_get_uri
+ gst_discoverer_info_get_video_streams
+ gst_discoverer_new
+ gst_discoverer_result_get_type
+ gst_discoverer_start
+ gst_discoverer_stop
+ gst_discoverer_stream_info_get_caps
+ gst_discoverer_stream_info_get_misc
+ gst_discoverer_stream_info_get_next
+ gst_discoverer_stream_info_get_previous
+ gst_discoverer_stream_info_get_stream_type_nick
+ gst_discoverer_stream_info_get_tags
+ gst_discoverer_stream_info_get_type
+ gst_discoverer_stream_info_list_free
+ gst_discoverer_subtitle_info_get_language
+ gst_discoverer_subtitle_info_get_type
+ gst_discoverer_video_info_get_bitrate
+ gst_discoverer_video_info_get_depth
+ gst_discoverer_video_info_get_framerate_denom
+ gst_discoverer_video_info_get_framerate_num
+ gst_discoverer_video_info_get_height
+ gst_discoverer_video_info_get_max_bitrate
+ gst_discoverer_video_info_get_par_denom
+ gst_discoverer_video_info_get_par_num
+ gst_discoverer_video_info_get_type
+ gst_discoverer_video_info_get_width
+ gst_discoverer_video_info_is_image
+ gst_discoverer_video_info_is_interlaced
+ gst_encoding_audio_profile_get_type
+ gst_encoding_audio_profile_new
+ gst_encoding_container_profile_add_profile
+ gst_encoding_container_profile_contains_profile
+ gst_encoding_container_profile_get_profiles
+ gst_encoding_container_profile_get_type
+ gst_encoding_container_profile_new
+ gst_encoding_list_all_targets
+ gst_encoding_list_available_categories
+ gst_encoding_profile_find
+ gst_encoding_profile_get_description
+ gst_encoding_profile_get_format
+ gst_encoding_profile_get_input_caps
+ gst_encoding_profile_get_name
+ gst_encoding_profile_get_presence
+ gst_encoding_profile_get_preset
+ gst_encoding_profile_get_restriction
+ gst_encoding_profile_get_type
+ gst_encoding_profile_get_type_nick
+ gst_encoding_profile_is_equal
+ gst_encoding_profile_set_description
+ gst_encoding_profile_set_format
+ gst_encoding_profile_set_name
+ gst_encoding_profile_set_presence
+ gst_encoding_profile_set_preset
+ gst_encoding_profile_set_restriction
+ gst_encoding_target_add_profile
+ gst_encoding_target_get_category
+ gst_encoding_target_get_description
+ gst_encoding_target_get_name
+ gst_encoding_target_get_profile
+ gst_encoding_target_get_profiles
+ gst_encoding_target_get_type
+ gst_encoding_target_load
+ gst_encoding_target_load_from_file
+ gst_encoding_target_new
+ gst_encoding_target_save
+ gst_encoding_target_save_to_file
+ gst_encoding_video_profile_get_pass
+ gst_encoding_video_profile_get_type
+ gst_encoding_video_profile_get_variableframerate
+ gst_encoding_video_profile_new
+ gst_encoding_video_profile_set_pass
+ gst_encoding_video_profile_set_variableframerate
+ gst_install_plugins_async
+ gst_install_plugins_context_free
+ gst_install_plugins_context_get_type
+ gst_install_plugins_context_new
+ gst_install_plugins_context_set_xid
+ gst_install_plugins_installation_in_progress
+ gst_install_plugins_return_get_name
+ gst_install_plugins_return_get_type
+ gst_install_plugins_supported
+ gst_install_plugins_sync
+ gst_is_missing_plugin_message
+ gst_missing_decoder_installer_detail_new
+ gst_missing_decoder_message_new
+ gst_missing_element_installer_detail_new
+ gst_missing_element_message_new
+ gst_missing_encoder_installer_detail_new
+ gst_missing_encoder_message_new
+ gst_missing_plugin_message_get_description
+ gst_missing_plugin_message_get_installer_detail
+ gst_missing_uri_sink_installer_detail_new
+ gst_missing_uri_sink_message_new
+ gst_missing_uri_source_installer_detail_new
+ gst_missing_uri_source_message_new
+ gst_pb_utils_add_codec_description_to_tag_list
+ gst_pb_utils_get_codec_description
+ gst_pb_utils_get_decoder_description
+ gst_pb_utils_get_element_description
+ gst_pb_utils_get_encoder_description
+ gst_pb_utils_get_sink_description
+ gst_pb_utils_get_source_description
+ gst_pb_utils_init
+ gst_plugins_base_version
+ gst_plugins_base_version_string
diff --git a/win32/common/libgstriff.def b/win32/common/libgstriff.def
new file mode 100644
index 0000000..e566107
--- /dev/null
+++ b/win32/common/libgstriff.def
@@ -0,0 +1,16 @@
+EXPORTS
+ gst_riff_create_audio_caps
+ gst_riff_create_audio_template_caps
+ gst_riff_create_iavs_caps
+ gst_riff_create_iavs_template_caps
+ gst_riff_create_video_caps
+ gst_riff_create_video_template_caps
+ gst_riff_init
+ gst_riff_parse_chunk
+ gst_riff_parse_file_header
+ gst_riff_parse_info
+ gst_riff_parse_strf_auds
+ gst_riff_parse_strf_iavs
+ gst_riff_parse_strf_vids
+ gst_riff_parse_strh
+ gst_riff_read_chunk
diff --git a/win32/common/libgstrtp.def b/win32/common/libgstrtp.def
new file mode 100644
index 0000000..54d855b
--- /dev/null
+++ b/win32/common/libgstrtp.def
@@ -0,0 +1,124 @@
+EXPORTS
+ gst_base_rtp_audio_payload_flush
+ gst_base_rtp_audio_payload_get_adapter
+ gst_base_rtp_audio_payload_get_type
+ gst_base_rtp_audio_payload_push
+ gst_base_rtp_audio_payload_set_frame_based
+ gst_base_rtp_audio_payload_set_frame_options
+ gst_base_rtp_audio_payload_set_sample_based
+ gst_base_rtp_audio_payload_set_sample_options
+ gst_base_rtp_audio_payload_set_samplebits_options
+ gst_base_rtp_depayload_get_type
+ gst_base_rtp_depayload_push
+ gst_base_rtp_depayload_push_list
+ gst_base_rtp_depayload_push_ts
+ gst_basertppayload_get_type
+ gst_basertppayload_is_filled
+ gst_basertppayload_push
+ gst_basertppayload_push_list
+ gst_basertppayload_set_options
+ gst_basertppayload_set_outcaps
+ gst_rtcp_buffer_add_packet
+ gst_rtcp_buffer_get_first_packet
+ gst_rtcp_buffer_get_packet_count
+ gst_rtcp_buffer_map
+ gst_rtcp_buffer_new
+ gst_rtcp_buffer_new_copy_data
+ gst_rtcp_buffer_new_take_data
+ gst_rtcp_buffer_unmap
+ gst_rtcp_buffer_validate
+ gst_rtcp_buffer_validate_data
+ gst_rtcp_ntp_to_unix
+ gst_rtcp_packet_add_rb
+ gst_rtcp_packet_bye_add_ssrc
+ gst_rtcp_packet_bye_add_ssrcs
+ gst_rtcp_packet_bye_get_nth_ssrc
+ gst_rtcp_packet_bye_get_reason
+ gst_rtcp_packet_bye_get_reason_len
+ gst_rtcp_packet_bye_get_ssrc_count
+ gst_rtcp_packet_bye_set_reason
+ gst_rtcp_packet_fb_get_fci
+ gst_rtcp_packet_fb_get_fci_length
+ gst_rtcp_packet_fb_get_media_ssrc
+ gst_rtcp_packet_fb_get_sender_ssrc
+ gst_rtcp_packet_fb_get_type
+ gst_rtcp_packet_fb_set_fci_length
+ gst_rtcp_packet_fb_set_media_ssrc
+ gst_rtcp_packet_fb_set_sender_ssrc
+ gst_rtcp_packet_fb_set_type
+ gst_rtcp_packet_get_count
+ gst_rtcp_packet_get_length
+ gst_rtcp_packet_get_padding
+ gst_rtcp_packet_get_rb
+ gst_rtcp_packet_get_rb_count
+ gst_rtcp_packet_get_type
+ gst_rtcp_packet_move_to_next
+ gst_rtcp_packet_remove
+ gst_rtcp_packet_rr_get_ssrc
+ gst_rtcp_packet_rr_set_ssrc
+ gst_rtcp_packet_sdes_add_entry
+ gst_rtcp_packet_sdes_add_item
+ gst_rtcp_packet_sdes_copy_entry
+ gst_rtcp_packet_sdes_first_entry
+ gst_rtcp_packet_sdes_first_item
+ gst_rtcp_packet_sdes_get_entry
+ gst_rtcp_packet_sdes_get_item_count
+ gst_rtcp_packet_sdes_get_ssrc
+ gst_rtcp_packet_sdes_next_entry
+ gst_rtcp_packet_sdes_next_item
+ gst_rtcp_packet_set_rb
+ gst_rtcp_packet_sr_get_sender_info
+ gst_rtcp_packet_sr_set_sender_info
+ gst_rtcp_sdes_name_to_type
+ gst_rtcp_sdes_type_to_name
+ gst_rtcp_unix_to_ntp
+ gst_rtp_buffer_add_extension_onebyte_header
+ gst_rtp_buffer_add_extension_twobytes_header
+ gst_rtp_buffer_allocate_data
+ gst_rtp_buffer_calc_header_len
+ gst_rtp_buffer_calc_packet_len
+ gst_rtp_buffer_calc_payload_len
+ gst_rtp_buffer_compare_seqnum
+ gst_rtp_buffer_default_clock_rate
+ gst_rtp_buffer_ext_timestamp
+ gst_rtp_buffer_get_csrc
+ gst_rtp_buffer_get_csrc_count
+ gst_rtp_buffer_get_extension
+ gst_rtp_buffer_get_extension_data
+ gst_rtp_buffer_get_extension_onebyte_header
+ gst_rtp_buffer_get_extension_twobytes_header
+ gst_rtp_buffer_get_header_len
+ gst_rtp_buffer_get_marker
+ gst_rtp_buffer_get_packet_len
+ gst_rtp_buffer_get_padding
+ gst_rtp_buffer_get_payload
+ gst_rtp_buffer_get_payload_buffer
+ gst_rtp_buffer_get_payload_len
+ gst_rtp_buffer_get_payload_subbuffer
+ gst_rtp_buffer_get_payload_type
+ gst_rtp_buffer_get_seq
+ gst_rtp_buffer_get_ssrc
+ gst_rtp_buffer_get_timestamp
+ gst_rtp_buffer_get_version
+ gst_rtp_buffer_map
+ gst_rtp_buffer_new_allocate
+ gst_rtp_buffer_new_allocate_len
+ gst_rtp_buffer_new_copy_data
+ gst_rtp_buffer_new_take_data
+ gst_rtp_buffer_pad_to
+ gst_rtp_buffer_set_csrc
+ gst_rtp_buffer_set_extension
+ gst_rtp_buffer_set_extension_data
+ gst_rtp_buffer_set_marker
+ gst_rtp_buffer_set_packet_len
+ gst_rtp_buffer_set_padding
+ gst_rtp_buffer_set_payload_type
+ gst_rtp_buffer_set_seq
+ gst_rtp_buffer_set_ssrc
+ gst_rtp_buffer_set_timestamp
+ gst_rtp_buffer_set_version
+ gst_rtp_buffer_unmap
+ gst_rtp_buffer_validate
+ gst_rtp_buffer_validate_data
+ gst_rtp_payload_info_for_name
+ gst_rtp_payload_info_for_pt
diff --git a/win32/common/libgstrtsp.def b/win32/common/libgstrtsp.def
new file mode 100644
index 0000000..5327c5b
--- /dev/null
+++ b/win32/common/libgstrtsp.def
@@ -0,0 +1,112 @@
+EXPORTS
+ gst_rtsp_auth_method_get_type
+ gst_rtsp_base64_decode_ip
+ gst_rtsp_base64_encode
+ gst_rtsp_connection_accept
+ gst_rtsp_connection_clear_auth_params
+ gst_rtsp_connection_close
+ gst_rtsp_connection_connect
+ gst_rtsp_connection_create
+ gst_rtsp_connection_create_from_fd
+ gst_rtsp_connection_do_tunnel
+ gst_rtsp_connection_flush
+ gst_rtsp_connection_free
+ gst_rtsp_connection_get_ip
+ gst_rtsp_connection_get_readfd
+ gst_rtsp_connection_get_tunnelid
+ gst_rtsp_connection_get_url
+ gst_rtsp_connection_get_writefd
+ gst_rtsp_connection_is_tunneled
+ gst_rtsp_connection_next_timeout
+ gst_rtsp_connection_poll
+ gst_rtsp_connection_read
+ gst_rtsp_connection_receive
+ gst_rtsp_connection_reset_timeout
+ gst_rtsp_connection_send
+ gst_rtsp_connection_set_auth
+ gst_rtsp_connection_set_auth_param
+ gst_rtsp_connection_set_http_mode
+ gst_rtsp_connection_set_ip
+ gst_rtsp_connection_set_proxy
+ gst_rtsp_connection_set_qos_dscp
+ gst_rtsp_connection_set_tunneled
+ gst_rtsp_connection_write
+ gst_rtsp_event_get_type
+ gst_rtsp_extension_after_send
+ gst_rtsp_extension_before_send
+ gst_rtsp_extension_configure_stream
+ gst_rtsp_extension_detect_server
+ gst_rtsp_extension_get_transports
+ gst_rtsp_extension_get_type
+ gst_rtsp_extension_parse_sdp
+ gst_rtsp_extension_receive_request
+ gst_rtsp_extension_send
+ gst_rtsp_extension_setup_media
+ gst_rtsp_extension_stream_select
+ gst_rtsp_family_get_type
+ gst_rtsp_find_header_field
+ gst_rtsp_find_method
+ gst_rtsp_header_allow_multiple
+ gst_rtsp_header_as_text
+ gst_rtsp_header_field_get_type
+ gst_rtsp_lower_trans_get_type
+ gst_rtsp_message_add_header
+ gst_rtsp_message_append_headers
+ gst_rtsp_message_dump
+ gst_rtsp_message_free
+ gst_rtsp_message_get_body
+ gst_rtsp_message_get_header
+ gst_rtsp_message_get_type
+ gst_rtsp_message_init
+ gst_rtsp_message_init_data
+ gst_rtsp_message_init_request
+ gst_rtsp_message_init_response
+ gst_rtsp_message_new
+ gst_rtsp_message_new_data
+ gst_rtsp_message_new_request
+ gst_rtsp_message_new_response
+ gst_rtsp_message_parse_data
+ gst_rtsp_message_parse_request
+ gst_rtsp_message_parse_response
+ gst_rtsp_message_remove_header
+ gst_rtsp_message_set_body
+ gst_rtsp_message_steal_body
+ gst_rtsp_message_take_body
+ gst_rtsp_message_take_header
+ gst_rtsp_message_unset
+ gst_rtsp_method_as_text
+ gst_rtsp_method_get_type
+ gst_rtsp_options_as_text
+ gst_rtsp_range_free
+ gst_rtsp_range_parse
+ gst_rtsp_range_to_string
+ gst_rtsp_result_get_type
+ gst_rtsp_state_get_type
+ gst_rtsp_status_as_text
+ gst_rtsp_status_code_get_type
+ gst_rtsp_strresult
+ gst_rtsp_transport_as_text
+ gst_rtsp_transport_free
+ gst_rtsp_transport_get_manager
+ gst_rtsp_transport_get_mime
+ gst_rtsp_transport_init
+ gst_rtsp_transport_new
+ gst_rtsp_transport_parse
+ gst_rtsp_url_copy
+ gst_rtsp_url_decode_path_components
+ gst_rtsp_url_free
+ gst_rtsp_url_get_port
+ gst_rtsp_url_get_request_uri
+ gst_rtsp_url_get_type
+ gst_rtsp_url_parse
+ gst_rtsp_url_set_port
+ gst_rtsp_version_as_text
+ gst_rtsp_version_get_type
+ gst_rtsp_watch_attach
+ gst_rtsp_watch_new
+ gst_rtsp_watch_queue_data
+ gst_rtsp_watch_queue_message
+ gst_rtsp_watch_reset
+ gst_rtsp_watch_send_message
+ gst_rtsp_watch_unref
+ gst_rtsp_watch_write_data
diff --git a/win32/common/libgstsdp.def b/win32/common/libgstsdp.def
new file mode 100644
index 0000000..186e4ff
--- /dev/null
+++ b/win32/common/libgstsdp.def
@@ -0,0 +1,78 @@
+EXPORTS
+ gst_sdp_address_is_multicast
+ gst_sdp_media_add_attribute
+ gst_sdp_media_add_bandwidth
+ gst_sdp_media_add_connection
+ gst_sdp_media_add_format
+ gst_sdp_media_as_text
+ gst_sdp_media_attributes_len
+ gst_sdp_media_bandwidths_len
+ gst_sdp_media_connections_len
+ gst_sdp_media_formats_len
+ gst_sdp_media_free
+ gst_sdp_media_get_attribute
+ gst_sdp_media_get_attribute_val
+ gst_sdp_media_get_attribute_val_n
+ gst_sdp_media_get_bandwidth
+ gst_sdp_media_get_connection
+ gst_sdp_media_get_format
+ gst_sdp_media_get_information
+ gst_sdp_media_get_key
+ gst_sdp_media_get_media
+ gst_sdp_media_get_num_ports
+ gst_sdp_media_get_port
+ gst_sdp_media_get_proto
+ gst_sdp_media_init
+ gst_sdp_media_new
+ gst_sdp_media_set_information
+ gst_sdp_media_set_key
+ gst_sdp_media_set_media
+ gst_sdp_media_set_port_info
+ gst_sdp_media_set_proto
+ gst_sdp_media_uninit
+ gst_sdp_message_add_attribute
+ gst_sdp_message_add_bandwidth
+ gst_sdp_message_add_email
+ gst_sdp_message_add_media
+ gst_sdp_message_add_phone
+ gst_sdp_message_add_time
+ gst_sdp_message_add_zone
+ gst_sdp_message_as_text
+ gst_sdp_message_as_uri
+ gst_sdp_message_attributes_len
+ gst_sdp_message_bandwidths_len
+ gst_sdp_message_dump
+ gst_sdp_message_emails_len
+ gst_sdp_message_free
+ gst_sdp_message_get_attribute
+ gst_sdp_message_get_attribute_val
+ gst_sdp_message_get_attribute_val_n
+ gst_sdp_message_get_bandwidth
+ gst_sdp_message_get_connection
+ gst_sdp_message_get_email
+ gst_sdp_message_get_information
+ gst_sdp_message_get_key
+ gst_sdp_message_get_media
+ gst_sdp_message_get_origin
+ gst_sdp_message_get_phone
+ gst_sdp_message_get_session_name
+ gst_sdp_message_get_time
+ gst_sdp_message_get_uri
+ gst_sdp_message_get_version
+ gst_sdp_message_get_zone
+ gst_sdp_message_init
+ gst_sdp_message_medias_len
+ gst_sdp_message_new
+ gst_sdp_message_parse_buffer
+ gst_sdp_message_parse_uri
+ gst_sdp_message_phones_len
+ gst_sdp_message_set_connection
+ gst_sdp_message_set_information
+ gst_sdp_message_set_key
+ gst_sdp_message_set_origin
+ gst_sdp_message_set_session_name
+ gst_sdp_message_set_uri
+ gst_sdp_message_set_version
+ gst_sdp_message_times_len
+ gst_sdp_message_uninit
+ gst_sdp_message_zones_len
diff --git a/win32/common/libgsttag.def b/win32/common/libgsttag.def
new file mode 100644
index 0000000..45a0fd4
--- /dev/null
+++ b/win32/common/libgsttag.def
@@ -0,0 +1,53 @@
+EXPORTS
+ gst_tag_demux_get_type
+ gst_tag_demux_result_get_type
+ gst_tag_freeform_string_to_utf8
+ gst_tag_from_id3_tag
+ gst_tag_from_id3_user_tag
+ gst_tag_from_vorbis_tag
+ gst_tag_get_id3v2_tag_size
+ gst_tag_get_language_code_iso_639_1
+ gst_tag_get_language_code_iso_639_2B
+ gst_tag_get_language_code_iso_639_2T
+ gst_tag_get_language_codes
+ gst_tag_get_language_name
+ gst_tag_get_license_description
+ gst_tag_get_license_flags
+ gst_tag_get_license_jurisdiction
+ gst_tag_get_license_nick
+ gst_tag_get_license_title
+ gst_tag_get_license_version
+ gst_tag_get_licenses
+ gst_tag_id3_genre_count
+ gst_tag_id3_genre_get
+ gst_tag_image_data_to_image_buffer
+ gst_tag_image_type_get_type
+ gst_tag_license_flags_get_type
+ gst_tag_list_add_id3_image
+ gst_tag_list_from_exif_buffer
+ gst_tag_list_from_exif_buffer_with_tiff_header
+ gst_tag_list_from_id3v2_tag
+ gst_tag_list_from_vorbiscomment
+ gst_tag_list_from_vorbiscomment_buffer
+ gst_tag_list_from_xmp_buffer
+ gst_tag_list_new_from_id3v1
+ gst_tag_list_to_exif_buffer
+ gst_tag_list_to_exif_buffer_with_tiff_header
+ gst_tag_list_to_vorbiscomment_buffer
+ gst_tag_list_to_xmp_buffer
+ gst_tag_list_to_xmp_buffer_full
+ gst_tag_mux_get_type
+ gst_tag_parse_extended_comment
+ gst_tag_register_musicbrainz_tags
+ gst_tag_to_id3_tag
+ gst_tag_to_vorbis_comments
+ gst_tag_to_vorbis_tag
+ gst_tag_xmp_list_schemas
+ gst_tag_xmp_writer_add_all_schemas
+ gst_tag_xmp_writer_add_schema
+ gst_tag_xmp_writer_get_type
+ gst_tag_xmp_writer_has_schema
+ gst_tag_xmp_writer_remove_all_schemas
+ gst_tag_xmp_writer_remove_schema
+ gst_tag_xmp_writer_tag_list_to_xmp_buffer
+ gst_vorbis_tag_add
diff --git a/win32/common/libgstvideo.def b/win32/common/libgstvideo.def
new file mode 100644
index 0000000..af7142a
--- /dev/null
+++ b/win32/common/libgstvideo.def
@@ -0,0 +1,45 @@
+EXPORTS
+ gst_buffer_add_meta_video
+ gst_buffer_add_meta_video_full
+ gst_buffer_get_meta_video_id
+ gst_buffer_pool_config_get_video_alignment
+ gst_buffer_pool_config_set_video_alignment
+ gst_meta_video_crop_get_info
+ gst_meta_video_get_info
+ gst_meta_video_map
+ gst_meta_video_unmap
+ gst_video_buffer_flags_get_type
+ gst_video_calculate_display_ratio
+ gst_video_chroma_site_get_type
+ gst_video_color_matrix_get_type
+ gst_video_color_primaries_get_type
+ gst_video_color_range_get_type
+ gst_video_colorimetry_from_string
+ gst_video_colorimetry_matches
+ gst_video_convert_frame
+ gst_video_convert_frame_async
+ gst_video_event_new_still_frame
+ gst_video_event_parse_still_frame
+ gst_video_filter_get_type
+ gst_video_flags_get_type
+ gst_video_format_flags_get_type
+ gst_video_format_from_fourcc
+ gst_video_format_from_masks
+ gst_video_format_from_string
+ gst_video_format_get_info
+ gst_video_format_get_type
+ gst_video_format_to_fourcc
+ gst_video_format_to_string
+ gst_video_frame_copy
+ gst_video_frame_map
+ gst_video_frame_map_id
+ gst_video_frame_unmap
+ gst_video_info_convert
+ gst_video_info_from_caps
+ gst_video_info_init
+ gst_video_info_set_format
+ gst_video_info_to_caps
+ gst_video_parse_caps_palette
+ gst_video_sink_center_rect
+ gst_video_sink_get_type
+ gst_video_transfer_function_get_type
diff --git a/win32/common/pbutils-enumtypes.c b/win32/common/pbutils-enumtypes.c
new file mode 100644
index 0000000..2652ec0
--- /dev/null
+++ b/win32/common/pbutils-enumtypes.c
@@ -0,0 +1,70 @@
+
+
+
+#include "pbutils-enumtypes.h"
+
+#include "pbutils.h"
+#include "codec-utils.h"
+#include "descriptions.h"
+#include "encoding-profile.h"
+#include "encoding-target.h"
+#include "install-plugins.h"
+#include "missing-plugins.h"
+#include "gstdiscoverer.h"
+
+/* enumerations from "install-plugins.h" */
+GType
+gst_install_plugins_return_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[] = {
+ {GST_INSTALL_PLUGINS_SUCCESS, "GST_INSTALL_PLUGINS_SUCCESS", "success"},
+ {GST_INSTALL_PLUGINS_NOT_FOUND, "GST_INSTALL_PLUGINS_NOT_FOUND",
+ "not-found"},
+ {GST_INSTALL_PLUGINS_ERROR, "GST_INSTALL_PLUGINS_ERROR", "error"},
+ {GST_INSTALL_PLUGINS_PARTIAL_SUCCESS,
+ "GST_INSTALL_PLUGINS_PARTIAL_SUCCESS", "partial-success"},
+ {GST_INSTALL_PLUGINS_USER_ABORT, "GST_INSTALL_PLUGINS_USER_ABORT",
+ "user-abort"},
+ {GST_INSTALL_PLUGINS_CRASHED, "GST_INSTALL_PLUGINS_CRASHED", "crashed"},
+ {GST_INSTALL_PLUGINS_INVALID, "GST_INSTALL_PLUGINS_INVALID", "invalid"},
+ {GST_INSTALL_PLUGINS_STARTED_OK, "GST_INSTALL_PLUGINS_STARTED_OK",
+ "started-ok"},
+ {GST_INSTALL_PLUGINS_INTERNAL_FAILURE,
+ "GST_INSTALL_PLUGINS_INTERNAL_FAILURE", "internal-failure"},
+ {GST_INSTALL_PLUGINS_HELPER_MISSING, "GST_INSTALL_PLUGINS_HELPER_MISSING",
+ "helper-missing"},
+ {GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS,
+ "GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS", "install-in-progress"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstInstallPluginsReturn", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/* enumerations from "gstdiscoverer.h" */
+GType
+gst_discoverer_result_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[] = {
+ {GST_DISCOVERER_OK, "GST_DISCOVERER_OK", "ok"},
+ {GST_DISCOVERER_URI_INVALID, "GST_DISCOVERER_URI_INVALID", "uri-invalid"},
+ {GST_DISCOVERER_ERROR, "GST_DISCOVERER_ERROR", "error"},
+ {GST_DISCOVERER_TIMEOUT, "GST_DISCOVERER_TIMEOUT", "timeout"},
+ {GST_DISCOVERER_BUSY, "GST_DISCOVERER_BUSY", "busy"},
+ {GST_DISCOVERER_MISSING_PLUGINS, "GST_DISCOVERER_MISSING_PLUGINS",
+ "missing-plugins"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstDiscovererResult", 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/pbutils-enumtypes.h b/win32/common/pbutils-enumtypes.h
new file mode 100644
index 0000000..30dadfd
--- /dev/null
+++ b/win32/common/pbutils-enumtypes.h
@@ -0,0 +1,23 @@
+
+
+
+#ifndef __PB_UTILS_ENUM_TYPES_H__
+#define __PB_UTILS_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "install-plugins.h" */
+GType gst_install_plugins_return_get_type (void);
+#define GST_TYPE_INSTALL_PLUGINS_RETURN (gst_install_plugins_return_get_type())
+
+/* enumerations from "gstdiscoverer.h" */
+GType gst_discoverer_result_get_type (void);
+#define GST_TYPE_DISCOVERER_RESULT (gst_discoverer_result_get_type())
+G_END_DECLS
+
+#endif /* __PB_UTILS_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/common/video-enumtypes.c b/win32/common/video-enumtypes.c
new file mode 100644
index 0000000..1ad3740
--- /dev/null
+++ b/win32/common/video-enumtypes.c
@@ -0,0 +1,254 @@
+
+
+
+#include "video-enumtypes.h"
+
+#include "video.h"
+
+/* enumerations from "video.h" */
+GType
+gst_video_format_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[] = {
+ {GST_VIDEO_FORMAT_UNKNOWN, "GST_VIDEO_FORMAT_UNKNOWN", "unknown"},
+ {GST_VIDEO_FORMAT_I420, "GST_VIDEO_FORMAT_I420", "i420"},
+ {GST_VIDEO_FORMAT_YV12, "GST_VIDEO_FORMAT_YV12", "yv12"},
+ {GST_VIDEO_FORMAT_YUY2, "GST_VIDEO_FORMAT_YUY2", "yuy2"},
+ {GST_VIDEO_FORMAT_UYVY, "GST_VIDEO_FORMAT_UYVY", "uyvy"},
+ {GST_VIDEO_FORMAT_AYUV, "GST_VIDEO_FORMAT_AYUV", "ayuv"},
+ {GST_VIDEO_FORMAT_RGBx, "GST_VIDEO_FORMAT_RGBx", "rgbx"},
+ {GST_VIDEO_FORMAT_BGRx, "GST_VIDEO_FORMAT_BGRx", "bgrx"},
+ {GST_VIDEO_FORMAT_xRGB, "GST_VIDEO_FORMAT_xRGB", "xrgb"},
+ {GST_VIDEO_FORMAT_xBGR, "GST_VIDEO_FORMAT_xBGR", "xbgr"},
+ {GST_VIDEO_FORMAT_RGBA, "GST_VIDEO_FORMAT_RGBA", "rgba"},
+ {GST_VIDEO_FORMAT_BGRA, "GST_VIDEO_FORMAT_BGRA", "bgra"},
+ {GST_VIDEO_FORMAT_ARGB, "GST_VIDEO_FORMAT_ARGB", "argb"},
+ {GST_VIDEO_FORMAT_ABGR, "GST_VIDEO_FORMAT_ABGR", "abgr"},
+ {GST_VIDEO_FORMAT_RGB, "GST_VIDEO_FORMAT_RGB", "rgb"},
+ {GST_VIDEO_FORMAT_BGR, "GST_VIDEO_FORMAT_BGR", "bgr"},
+ {GST_VIDEO_FORMAT_Y41B, "GST_VIDEO_FORMAT_Y41B", "y41b"},
+ {GST_VIDEO_FORMAT_Y42B, "GST_VIDEO_FORMAT_Y42B", "y42b"},
+ {GST_VIDEO_FORMAT_YVYU, "GST_VIDEO_FORMAT_YVYU", "yvyu"},
+ {GST_VIDEO_FORMAT_Y444, "GST_VIDEO_FORMAT_Y444", "y444"},
+ {GST_VIDEO_FORMAT_v210, "GST_VIDEO_FORMAT_v210", "v210"},
+ {GST_VIDEO_FORMAT_v216, "GST_VIDEO_FORMAT_v216", "v216"},
+ {GST_VIDEO_FORMAT_NV12, "GST_VIDEO_FORMAT_NV12", "nv12"},
+ {GST_VIDEO_FORMAT_NV21, "GST_VIDEO_FORMAT_NV21", "nv21"},
+ {GST_VIDEO_FORMAT_GRAY8, "GST_VIDEO_FORMAT_GRAY8", "gray8"},
+ {GST_VIDEO_FORMAT_GRAY16_BE, "GST_VIDEO_FORMAT_GRAY16_BE", "gray16-be"},
+ {GST_VIDEO_FORMAT_GRAY16_LE, "GST_VIDEO_FORMAT_GRAY16_LE", "gray16-le"},
+ {GST_VIDEO_FORMAT_v308, "GST_VIDEO_FORMAT_v308", "v308"},
+ {GST_VIDEO_FORMAT_Y800, "GST_VIDEO_FORMAT_Y800", "y800"},
+ {GST_VIDEO_FORMAT_Y16, "GST_VIDEO_FORMAT_Y16", "y16"},
+ {GST_VIDEO_FORMAT_RGB16, "GST_VIDEO_FORMAT_RGB16", "rgb16"},
+ {GST_VIDEO_FORMAT_BGR16, "GST_VIDEO_FORMAT_BGR16", "bgr16"},
+ {GST_VIDEO_FORMAT_RGB15, "GST_VIDEO_FORMAT_RGB15", "rgb15"},
+ {GST_VIDEO_FORMAT_BGR15, "GST_VIDEO_FORMAT_BGR15", "bgr15"},
+ {GST_VIDEO_FORMAT_UYVP, "GST_VIDEO_FORMAT_UYVP", "uyvp"},
+ {GST_VIDEO_FORMAT_A420, "GST_VIDEO_FORMAT_A420", "a420"},
+ {GST_VIDEO_FORMAT_RGB8_PALETTED, "GST_VIDEO_FORMAT_RGB8_PALETTED",
+ "rgb8-paletted"},
+ {GST_VIDEO_FORMAT_YUV9, "GST_VIDEO_FORMAT_YUV9", "yuv9"},
+ {GST_VIDEO_FORMAT_YVU9, "GST_VIDEO_FORMAT_YVU9", "yvu9"},
+ {GST_VIDEO_FORMAT_IYU1, "GST_VIDEO_FORMAT_IYU1", "iyu1"},
+ {GST_VIDEO_FORMAT_ARGB64, "GST_VIDEO_FORMAT_ARGB64", "argb64"},
+ {GST_VIDEO_FORMAT_AYUV64, "GST_VIDEO_FORMAT_AYUV64", "ayuv64"},
+ {GST_VIDEO_FORMAT_r210, "GST_VIDEO_FORMAT_r210", "r210"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_enum_register_static ("GstVideoFormat", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_format_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_VIDEO_FORMAT_FLAG_YUV, "GST_VIDEO_FORMAT_FLAG_YUV", "yuv"},
+ {GST_VIDEO_FORMAT_FLAG_RGB, "GST_VIDEO_FORMAT_FLAG_RGB", "rgb"},
+ {GST_VIDEO_FORMAT_FLAG_GRAY, "GST_VIDEO_FORMAT_FLAG_GRAY", "gray"},
+ {GST_VIDEO_FORMAT_FLAG_ALPHA, "GST_VIDEO_FORMAT_FLAG_ALPHA", "alpha"},
+ {GST_VIDEO_FORMAT_FLAG_LE, "GST_VIDEO_FORMAT_FLAG_LE", "le"},
+ {GST_VIDEO_FORMAT_FLAG_PALETTE, "GST_VIDEO_FORMAT_FLAG_PALETTE",
+ "palette"},
+ {GST_VIDEO_FORMAT_FLAG_COMPLEX, "GST_VIDEO_FORMAT_FLAG_COMPLEX",
+ "complex"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_flags_register_static ("GstVideoFormatFlags", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_VIDEO_FLAG_NONE, "GST_VIDEO_FLAG_NONE", "none"},
+ {GST_VIDEO_FLAG_INTERLACED, "GST_VIDEO_FLAG_INTERLACED", "interlaced"},
+ {GST_VIDEO_FLAG_TFF, "GST_VIDEO_FLAG_TFF", "tff"},
+ {GST_VIDEO_FLAG_RFF, "GST_VIDEO_FLAG_RFF", "rff"},
+ {GST_VIDEO_FLAG_ONEFIELD, "GST_VIDEO_FLAG_ONEFIELD", "onefield"},
+ {GST_VIDEO_FLAG_TELECINE, "GST_VIDEO_FLAG_TELECINE", "telecine"},
+ {GST_VIDEO_FLAG_PROGRESSIVE, "GST_VIDEO_FLAG_PROGRESSIVE", "progressive"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id = g_flags_register_static ("GstVideoFlags", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_chroma_site_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_VIDEO_CHROMA_SITE_UNKNOWN, "GST_VIDEO_CHROMA_SITE_UNKNOWN",
+ "unknown"},
+ {GST_VIDEO_CHROMA_SITE_NONE, "GST_VIDEO_CHROMA_SITE_NONE", "none"},
+ {GST_VIDEO_CHROMA_SITE_H_COSITED, "GST_VIDEO_CHROMA_SITE_H_COSITED",
+ "h-cosited"},
+ {GST_VIDEO_CHROMA_SITE_V_COSITED, "GST_VIDEO_CHROMA_SITE_V_COSITED",
+ "v-cosited"},
+ {GST_VIDEO_CHROMA_SITE_ALT_LINE, "GST_VIDEO_CHROMA_SITE_ALT_LINE",
+ "alt-line"},
+ {GST_VIDEO_CHROMA_SITE_COSITED, "GST_VIDEO_CHROMA_SITE_COSITED",
+ "cosited"},
+ {GST_VIDEO_CHROMA_SITE_JPEG, "GST_VIDEO_CHROMA_SITE_JPEG", "jpeg"},
+ {GST_VIDEO_CHROMA_SITE_MPEG2, "GST_VIDEO_CHROMA_SITE_MPEG2", "mpeg2"},
+ {GST_VIDEO_CHROMA_SITE_DV, "GST_VIDEO_CHROMA_SITE_DV", "dv"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_flags_register_static ("GstVideoChromaSite", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_color_range_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[] = {
+ {GST_VIDEO_COLOR_RANGE_UNKNOWN, "GST_VIDEO_COLOR_RANGE_UNKNOWN",
+ "unknown"},
+ {GST_VIDEO_COLOR_RANGE_0_255, "GST_VIDEO_COLOR_RANGE_0_255", "0-255"},
+ {GST_VIDEO_COLOR_RANGE_16_235, "GST_VIDEO_COLOR_RANGE_16_235", "16-235"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstVideoColorRange", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_color_matrix_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[] = {
+ {GST_VIDEO_COLOR_MATRIX_UNKNOWN, "GST_VIDEO_COLOR_MATRIX_UNKNOWN",
+ "unknown"},
+ {GST_VIDEO_COLOR_MATRIX_RGB, "GST_VIDEO_COLOR_MATRIX_RGB", "rgb"},
+ {GST_VIDEO_COLOR_MATRIX_BT709, "GST_VIDEO_COLOR_MATRIX_BT709", "bt709"},
+ {GST_VIDEO_COLOR_MATRIX_BT601, "GST_VIDEO_COLOR_MATRIX_BT601", "bt601"},
+ {GST_VIDEO_COLOR_MATRIX_SMPTE240M, "GST_VIDEO_COLOR_MATRIX_SMPTE240M",
+ "smpte240m"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstVideoColorMatrix", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_transfer_function_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[] = {
+ {GST_VIDEO_TRANSFER_UNKNOWN, "GST_VIDEO_TRANSFER_UNKNOWN", "unknown"},
+ {GST_VIDEO_TRANSFER_GAMMA10, "GST_VIDEO_TRANSFER_GAMMA10", "gamma10"},
+ {GST_VIDEO_TRANSFER_GAMMA18, "GST_VIDEO_TRANSFER_GAMMA18", "gamma18"},
+ {GST_VIDEO_TRANSFER_GAMMA20, "GST_VIDEO_TRANSFER_GAMMA20", "gamma20"},
+ {GST_VIDEO_TRANSFER_GAMMA22, "GST_VIDEO_TRANSFER_GAMMA22", "gamma22"},
+ {GST_VIDEO_TRANSFER_BT709, "GST_VIDEO_TRANSFER_BT709", "bt709"},
+ {GST_VIDEO_TRANSFER_SMPTE240M, "GST_VIDEO_TRANSFER_SMPTE240M",
+ "smpte240m"},
+ {GST_VIDEO_TRANSFER_SRGB, "GST_VIDEO_TRANSFER_SRGB", "srgb"},
+ {GST_VIDEO_TRANSFER_GAMMA28, "GST_VIDEO_TRANSFER_GAMMA28", "gamma28"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstVideoTransferFunction", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_color_primaries_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[] = {
+ {GST_VIDEO_COLOR_PRIMARIES_UNKNOWN, "GST_VIDEO_COLOR_PRIMARIES_UNKNOWN",
+ "unknown"},
+ {GST_VIDEO_COLOR_PRIMARIES_BT709, "GST_VIDEO_COLOR_PRIMARIES_BT709",
+ "bt709"},
+ {GST_VIDEO_COLOR_PRIMARIES_BT470M, "GST_VIDEO_COLOR_PRIMARIES_BT470M",
+ "bt470m"},
+ {GST_VIDEO_COLOR_PRIMARIES_BT470BG, "GST_VIDEO_COLOR_PRIMARIES_BT470BG",
+ "bt470bg"},
+ {GST_VIDEO_COLOR_PRIMARIES_SMPTE170M,
+ "GST_VIDEO_COLOR_PRIMARIES_SMPTE170M", "smpte170m"},
+ {GST_VIDEO_COLOR_PRIMARIES_SMPTE240M,
+ "GST_VIDEO_COLOR_PRIMARIES_SMPTE240M", "smpte240m"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_enum_register_static ("GstVideoColorPrimaries", values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+GType
+gst_video_buffer_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ static const GFlagsValue values[] = {
+ {GST_VIDEO_BUFFER_FLAG_TFF, "GST_VIDEO_BUFFER_FLAG_TFF", "tff"},
+ {GST_VIDEO_BUFFER_FLAG_RFF, "GST_VIDEO_BUFFER_FLAG_RFF", "rff"},
+ {GST_VIDEO_BUFFER_FLAG_ONEFIELD, "GST_VIDEO_BUFFER_FLAG_ONEFIELD",
+ "onefield"},
+ {GST_VIDEO_BUFFER_FLAG_PROGRESSIVE, "GST_VIDEO_BUFFER_FLAG_PROGRESSIVE",
+ "progressive"},
+ {GST_VIDEO_BUFFER_FLAG_LAST, "GST_VIDEO_BUFFER_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+ GType g_define_type_id =
+ g_flags_register_static ("GstVideoBufferFlags", 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/video-enumtypes.h b/win32/common/video-enumtypes.h
new file mode 100644
index 0000000..dd1805d
--- /dev/null
+++ b/win32/common/video-enumtypes.h
@@ -0,0 +1,35 @@
+
+
+
+#ifndef __GST_VIDEO_ENUM_TYPES_H__
+#define __GST_VIDEO_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "video.h" */
+GType gst_video_format_get_type (void);
+#define GST_TYPE_VIDEO_FORMAT (gst_video_format_get_type())
+GType gst_video_format_flags_get_type (void);
+#define GST_TYPE_VIDEO_FORMAT_FLAGS (gst_video_format_flags_get_type())
+GType gst_video_flags_get_type (void);
+#define GST_TYPE_VIDEO_FLAGS (gst_video_flags_get_type())
+GType gst_video_chroma_site_get_type (void);
+#define GST_TYPE_VIDEO_CHROMA_SITE (gst_video_chroma_site_get_type())
+GType gst_video_color_range_get_type (void);
+#define GST_TYPE_VIDEO_COLOR_RANGE (gst_video_color_range_get_type())
+GType gst_video_color_matrix_get_type (void);
+#define GST_TYPE_VIDEO_COLOR_MATRIX (gst_video_color_matrix_get_type())
+GType gst_video_transfer_function_get_type (void);
+#define GST_TYPE_VIDEO_TRANSFER_FUNCTION (gst_video_transfer_function_get_type())
+GType gst_video_color_primaries_get_type (void);
+#define GST_TYPE_VIDEO_COLOR_PRIMARIES (gst_video_color_primaries_get_type())
+GType gst_video_buffer_flags_get_type (void);
+#define GST_TYPE_VIDEO_BUFFER_FLAGS (gst_video_buffer_flags_get_type())
+G_END_DECLS
+
+#endif /* __GST_VIDEO_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/vs6/grammar.dsp b/win32/vs6/grammar.dsp
new file mode 100644
index 0000000..4d67df1
--- /dev/null
+++ b/win32/vs6/grammar.dsp
@@ -0,0 +1,424 @@
+# Microsoft Developer Studio Project File - Name="grammar" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Generic Project" 0x010a
+
+CFG=grammar - 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 "grammar.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 "grammar.mak" CFG="grammar - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "grammar - Win32 Release" (based on "Win32 (x86) Generic Project")
+!MESSAGE "grammar - 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)" == "grammar - 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)" == "grammar - 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 "grammar - Win32 Release"
+# Name "grammar - Win32 Debug"
+# Begin Source File
+
+SOURCE="..\..\gst\playback\gstplay-marshal.list"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\..\gst\playback\gstplay-marshal.list"
+
+BuildCmds= \
+ echo #include "glib-object.h" > gstplay-marshal.c.tmp \
+ echo #include "gstplay-marshal.h" >> gstplay-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list >> gstplay-marshal.c.tmp \
+ move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c \
+ echo #include "gst/gstconfig.h" > gstplay-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list >> gstplay-marshal.h.tmp \
+ move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h
+
+"..\..\gst\playback\gstplay-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\playback\gstplay-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\..\gst\playback\gstplay-marshal.list"
+
+BuildCmds= \
+ echo #include "glib-object.h" > gstplay-marshal.c.tmp \
+ echo #include "gstplay-marshal.h" >> gstplay-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list >> gstplay-marshal.c.tmp \
+ move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c \
+ echo #include "gst/gstconfig.h" > gstplay-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list >> gstplay-marshal.h.tmp \
+ move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h
+
+"..\..\gst\playback\gstplay-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\playback\gstplay-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\tcp\gsttcp-marshal.list"
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\..\gst\tcp\gsttcp-marshal.list"
+
+BuildCmds= \
+ echo #include "glib-object.h" > gsttcp-marshal.c.tmp \
+ echo #include "gsttcp-marshal.h" >> gsttcp-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_tcp_marshal ..\..\gst\tcp\gsttcp-marshal.list >> gsttcp-marshal.c.tmp \
+ move gsttcp-marshal.c.tmp ..\..\gst\tcp\gsttcp-marshal.c \
+ echo #include "gst/gstconfig.h" > gsttcp-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_tcp_marshal ..\..\gst\tcp\gsttcp-marshal.list >> gsttcp-marshal.h.tmp \
+ move gsttcp-marshal.h.tmp ..\..\gst\tcp\gsttcp-marshal.h
+
+
+"..\..\gst\tcp\gsttcp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\tcp\gsttcp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\..\gst\tcp\gsttcp-marshal.list"
+
+BuildCmds= \
+ echo #include "glib-object.h" > gsttcp-marshal.c.tmp \
+ echo #include "gsttcp-marshal.h" >> gsttcp-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_tcp_marshal ..\..\gst\tcp\gsttcp-marshal.list >> gsttcp-marshal.c.tmp \
+ move gsttcp-marshal.c.tmp ..\..\gst\tcp\gsttcp-marshal.c \
+ echo #include "gst/gstconfig.h" > gsttcp-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_tcp_marshal ..\..\gst\tcp\gsttcp-marshal.list >> gsttcp-marshal.h.tmp \
+ move gsttcp-marshal.h.tmp ..\..\gst\tcp\gsttcp-marshal.h
+
+
+"..\..\gst\tcp\gsttcp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\tcp\gsttcp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\common\interfaces-enumtypes.c"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\common\interfaces-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\interfaces-enumtypes.h ..\..\gst-libs\gst\interfaces \
+ copy ..\common\interfaces-enumtypes.c ..\..\gst-libs\gst\interfaces
+
+
+"..\..\gst-libs\gst\interfaces\interfaces-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\interfaces\interfaces-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\common\interfaces-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\interfaces-enumtypes.h ..\..\gst-libs\gst\interfaces \
+ copy ..\common\interfaces-enumtypes.c ..\..\gst-libs\gst\interfaces
+
+
+"..\..\gst-libs\gst\interfaces\interfaces-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\interfaces\interfaces-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\interfaces-marshal.list"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\..\gst-libs\gst\interfaces\interfaces-marshal.list"
+
+BuildCmds= \
+ echo #include "interfaces-marshal.h" > interfaces-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list >> interfaces-marshal.c.tmp \
+ move interfaces-marshal.c.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.c \
+ echo #include "gst/gstconfig.h" > interfaces-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list >> interfaces-marshal.h.tmp \
+ move interfaces-marshal.h.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.h
+
+
+"..\..\gst-libs\gst\interfaces\interfaces-marshal.list.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\interfaces\interfaces-marshal.list.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\..\gst-libs\gst\interfaces\interfaces-marshal.list"
+
+BuildCmds= \
+ echo #include "interfaces-marshal.h" > interfaces-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list >> interfaces-marshal.c.tmp \
+ move interfaces-marshal.c.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.c \
+ echo #include "gst/gstconfig.h" > interfaces-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list >> interfaces-marshal.h.tmp \
+ move interfaces-marshal.h.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.h
+
+
+"..\..\gst-libs\gst\interfaces\interfaces-marshal.list.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\interfaces\interfaces-marshal.list.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\common\audio-enumtypes.c"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\common\audio-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\audio-enumtypes.h ..\..\gst-libs\gst\audio \
+ copy ..\common\audio-enumtypes.c ..\..\gst-libs\gst\audio
+
+
+"..\..\gst-libs\gst\audio\audio-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\audio\audio-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\common\audio-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\audio-enumtypes.h ..\..\gst-libs\gst\audio \
+ copy ..\common\audio-enumtypes.c ..\..\gst-libs\gst\audio
+
+
+"..\..\gst-libs\gst\audio\audio-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\audio\audio-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\rtsp-marshal.list"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\..\gst-libs\gst\rtsp\rtsp-marshal.list"
+
+BuildCmds= \
+ echo #include "rtsp-marshal.h" > rtsp-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_rtsp_marshal ..\..\gst-libs\gst\rtsp\rtsp-marshal.list >> rtsp-marshal.c.tmp \
+ move rtsp-marshal.c.tmp ..\..\gst-libs\gst\rtsp\rtsp-marshal.c \
+ echo #include "gst/gstconfig.h" > rtsp-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_rtsp_marshal ..\..\gst-libs\gst\rtsp\rtsp-marshal.list >> rtsp-marshal.h.tmp \
+ move rtsp-marshal.h.tmp ..\..\gst-libs\gst\rtsp\rtsp-marshal.h
+
+
+"..\..\gst-libs\gst\rtsp\rtsp-marshal.list.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\rtsp\rtsp-marshal.list.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\..\gst-libs\gst\rtsp\rtsp-marshal.list"
+
+BuildCmds= \
+ echo #include "rtsp-marshal.h" > rtsp-marshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_rtsp_marshal ..\..\gst-libs\gst\rtsp\rtsp-marshal.list >> rtsp-marshal.c.tmp \
+ move rtsp-marshal.c.tmp ..\..\gst-libs\gst\rtsp\rtsp-marshal.c \
+ echo #include "gst/gstconfig.h" > rtsp-marshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_rtsp_marshal ..\..\gst-libs\gst\rtsp\rtsp-marshal.list >> rtsp-marshal.h.tmp \
+ move rtsp-marshal.h.tmp ..\..\gst-libs\gst\rtsp\rtsp-marshal.h
+
+
+"..\..\gst-libs\gst\rtsp\rtsp-marshal.list.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+..\..\gst-libs\gst\rtsp\rtsp-marshal.list.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\common\gstrtsp-enumtypes.c"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\common\gstrtsp-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\gstrtsp-enumtypes.h ..\..\gst-libs\gst\rtsp \
+ copy ..\common\gstrtsp-enumtypes.c ..\..\gst-libs\gst\rtsp
+
+
+"..\..\gst-libs\gst\rtsp\gstrtsp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\rtsp\gstrtsp-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\common\gstrtsp-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\gstrtsp-enumtypes.h ..\..\gst-libs\gst\rtsp \
+ copy ..\common\gstrtsp-enumtypes.c ..\..\gst-libs\gst\rtsp
+
+
+"..\..\gst-libs\gst\rtsp\gstrtsp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\rtsp\gstrtsp-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE="..\common\pbutils-enumtypes.c"
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath="..\common\pbutils-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\pbutils-enumtypes.h ..\..\gst-libs\gst\pbutils \
+ copy ..\common\pbutils-enumtypes.c ..\..\gst-libs\gst\pbutils
+
+
+"..\..\gst-libs\gst\pbutils\pbutils-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\pbutils\pbutils-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath="..\common\pbutils-enumtypes.c"
+
+BuildCmds= \
+ copy ..\common\pbutils-enumtypes.h ..\..\gst-libs\gst\pbutils \
+ copy ..\common\pbutils-enumtypes.c ..\..\gst-libs\gst\pbutils
+
+
+"..\..\gst-libs\gst\pbutils\pbutils-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst-libs\gst\pbutils\pbutils-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Target
+# End Project
diff --git a/win32/vs6/gst_plugins_base.dsw b/win32/vs6/gst_plugins_base.dsw
new file mode 100644
index 0000000..a651927
--- /dev/null
+++ b/win32/vs6/gst_plugins_base.dsw
@@ -0,0 +1,428 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "grammar"=".\grammar.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstadder"=".\libgstadder.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstaudio"=".\libgstaudio.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libgstinterfaces
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstaudioconvert"=".\libgstaudioconvert.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstaudiorate"=".\libgstaudiorate.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstaudioresample"=".\libgstaudioresample.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstaudiotestsrc"=".\libgstaudiotestsrc.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstcdda"=".\libgstcdda.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgsttag
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstdecodebin"=".\libgstdecodebin.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libgstpbutils
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstdecodebin2"=".\libgstdecodebin2.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstfft"=".\libgstfft.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstgdp"=".\libgstgdp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstinterfaces"=".\libgstinterfaces.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstnetbuffer"=".\libgstnetbuffer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstogg"=".\libgstogg.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstriff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstpbutils"=".\libgstpbutils.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstplaybin"=".\libgstplaybin.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libgstpbutils
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstriff"=".\libgstriff.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>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstsdp"=".\libgstsdp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstsubparse"=".\libgstsubparse.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgsttag"=".\libgsttag.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgsttheora"=".\libgsttheora.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgsttag
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgsttypefindfunctions"=".\libgsttypefindfunctions.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvideo"=".\libgstvideo.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvideorate"=".\libgstvideorate.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvideoscale"=".\libgstvideoscale.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvideotestsrc"=".\libgstvideotestsrc.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvolume"=".\libgstvolume.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libgstvorbis"=".\libgstvorbis.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstaudio
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libgsttag
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/win32/vs6/libgstadder.dsp b/win32/vs6/libgstadder.dsp
new file mode 100644
index 0000000..3616c30
--- /dev/null
+++ b/win32/vs6/libgstadder.dsp
@@ -0,0 +1,123 @@
+# Microsoft Developer Studio Project File - Name="libgstadder" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstadder - 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 "libgstadder.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 "libgstadder.mak" CFG="libgstadder - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstadder - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstadder - 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)" == "libgstadder - 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 "LIBGSTADDER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTADDER_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\libgstadder.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstadder - 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 "LIBGSTADDER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTADDER_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\libgstadder.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstadder - Win32 Release"
+# Name "libgstadder - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\adder\gstadder.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\adder\gstadder.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/libgstaudio.dsp b/win32/vs6/libgstaudio.dsp
new file mode 100644
index 0000000..bfd0a8a
--- /dev/null
+++ b/win32/vs6/libgstaudio.dsp
@@ -0,0 +1,207 @@
+# Microsoft Developer Studio Project File - Name="libgstaudio" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudio - 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 "libgstaudio.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 "libgstaudio.mak" CFG="libgstaudio - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudio - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudio - 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)" == "libgstaudio - 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 "LIBGSTAUDIO_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 "LIBGSTAUDIO_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 libgstinterfaces-0.10.lib /nologo /dll /machine:I386 /out:"Release/libgstaudio-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstaudio-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudio - 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 "LIBGSTAUDIO_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 "LIBGSTAUDIO_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 libgstinterfaces-0.10.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstaudio-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstaudio-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudio - Win32 Release"
+# Name "libgstaudio - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\audio.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudioclock.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiofilter.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiofiltertemplate.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiosink.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiosrc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstbaseaudiosink.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstbaseaudiosrc.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstringbuffer.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstaudio.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\mixerutils.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\audio-enumtypes.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\multichannel.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\audio.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudioclock.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiofilter.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiosink.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstaudiosrc.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstbaseaudiosink.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstbaseaudiosrc.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\gstringbuffer.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\audio-enumtypes.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\audio\multichannel.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/libgstaudioconvert.dsp b/win32/vs6/libgstaudioconvert.dsp
new file mode 100644
index 0000000..132c297
--- /dev/null
+++ b/win32/vs6/libgstaudioconvert.dsp
@@ -0,0 +1,151 @@
+# Microsoft Developer Studio Project File - Name="libgstaudioconvert" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudioconvert - 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 "libgstaudioconvert.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 "libgstaudioconvert.mak" CFG="libgstaudioconvert - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudioconvert - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudioconvert - 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)" == "libgstaudioconvert - 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 "LIBGSTAUDIOCONVERT_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOCONVERT_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"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstaudioconvert.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudioconvert - 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 "LIBGSTAUDIOCONVERT_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOCONVERT_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"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstaudioconvert.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudioconvert - Win32 Release"
+# Name "libgstaudioconvert - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\audioconvert.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\gstaudioconvert.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\gstaudioquantize.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\gstchannelmix.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\plugin.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\audioconvert.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\gstaudioconvert.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\gstchannelmix.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioconvert\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/libgstaudiorate.dsp b/win32/vs6/libgstaudiorate.dsp
new file mode 100644
index 0000000..4487b11
--- /dev/null
+++ b/win32/vs6/libgstaudiorate.dsp
@@ -0,0 +1,119 @@
+# Microsoft Developer Studio Project File - Name="libgstaudiorate" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudiorate - 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 "libgstaudiorate.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 "libgstaudiorate.mak" CFG="libgstaudiorate - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudiorate - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudiorate - 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)" == "libgstaudiorate - 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 "LIBGSTAUDIORATE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIORATE_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\libgstaudiorate.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudiorate - 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 "LIBGSTAUDIORATE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIORATE_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\libgstaudiorate.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudiorate - Win32 Release"
+# Name "libgstaudiorate - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\audiorate\gstaudiorate.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/libgstaudioresample.dsp b/win32/vs6/libgstaudioresample.dsp
new file mode 100644
index 0000000..a1ca5b0
--- /dev/null
+++ b/win32/vs6/libgstaudioresample.dsp
@@ -0,0 +1,163 @@
+# Microsoft Developer Studio Project File - Name="libgstaudioresample" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudioresample - 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 "libgstaudioresample.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 "libgstaudioresample.mak" CFG="libgstaudioresample - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudioresample - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudioresample - 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)" == "libgstaudioresample - 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 "LIBGSTAUDIORESAMPLE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst/audioresample" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIORESAMPLE_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 liboil-0.3-0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstaudioresample.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudioresample - 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 "LIBGSTAUDIORESAMPLE_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/audioresample" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIORESAMPLE_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 liboil-0.3-0.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstaudioresample.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudioresample - Win32 Release"
+# Name "libgstaudioresample - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\buffer.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\functable.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\gstaudioresample.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\resample.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\resample_chunk.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\resample_functable.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\resample_ref.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\buffer.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\debug.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\functable.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\gstaudioresample.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioresample\resample.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/libgstaudioscale.dsp b/win32/vs6/libgstaudioscale.dsp
new file mode 100644
index 0000000..f6148cc
--- /dev/null
+++ b/win32/vs6/libgstaudioscale.dsp
@@ -0,0 +1,125 @@
+# Microsoft Developer Studio Project File - Name="libgstaudioscale" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudioscale - 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 "libgstaudioscale.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 "libgstaudioscale.mak" CFG="libgstaudioscale - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudioscale - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudioscale - 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)" == "libgstaudioscale - 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 "LIBGSTAUDIOSCALE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../../../gstreamer/win32/common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOSCALE_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 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\libgstaudioscale.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudioscale - 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 "LIBGSTAUDIOSCALE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../../../gstreamer/win32/common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOSCALE_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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstaudioscale.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudioscale - Win32 Release"
+# Name "libgstaudioscale - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\audioscale\gstaudioscale.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\audioscale\gstaudioscale.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\audioscale\private.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/libgstaudiotestsrc.dsp b/win32/vs6/libgstaudiotestsrc.dsp
new file mode 100644
index 0000000..ed291b3
--- /dev/null
+++ b/win32/vs6/libgstaudiotestsrc.dsp
@@ -0,0 +1,123 @@
+# Microsoft Developer Studio Project File - Name="libgstaudiotestsrc" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstaudiotestsrc - 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 "libgstaudiotestsrc.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 "libgstaudiotestsrc.mak" CFG="libgstaudiotestsrc - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstaudiotestsrc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstaudiotestsrc - 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)" == "libgstaudiotestsrc - 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 "LIBGSTAUDIOTESTSRC_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOTESTSRC_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 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /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 libgstcontroller-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\libgstaudiotestsrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstaudiotestsrc - 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 "LIBGSTAUDIOTESTSRC_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOTESTSRC_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 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /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 libgstcontroller-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstaudiotestsrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstaudiotestsrc - Win32 Release"
+# Name "libgstaudiotestsrc - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\audiotestsrc\gstaudiotestsrc.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\audiotestsrc\gstaudiotestsrc.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/libgstcdda.dsp b/win32/vs6/libgstcdda.dsp
new file mode 100644
index 0000000..744b444
--- /dev/null
+++ b/win32/vs6/libgstcdda.dsp
@@ -0,0 +1,143 @@
+# Microsoft Developer Studio Project File - Name="libgstcdda" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstcdda - 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 "libgstcdda.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 "libgstcdda.mak" CFG="libgstcdda - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstcdda - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstcdda - 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)" == "libgstcdda - 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 "LIBGSTCDDA_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCDDA_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 /out:"Release/libgstcdda-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstcdda-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstcdda - 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 "LIBGSTCDDA_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCDDA_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 /out:"Debug/libgstcdda-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstcdda-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstcdda - Win32 Release"
+# Name "libgstcdda - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\base64.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\gstcddabasesrc.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstcdda.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\sha1.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\base64.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\gstcddabasesrc.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\cdda\sha1.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/libgstdecodebin.dsp b/win32/vs6/libgstdecodebin.dsp
new file mode 100644
index 0000000..bccea4f
--- /dev/null
+++ b/win32/vs6/libgstdecodebin.dsp
@@ -0,0 +1,123 @@
+# Microsoft Developer Studio Project File - Name="libgstdecodebin" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstdecodebin - 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 "libgstdecodebin.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 "libgstdecodebin.mak" CFG="libgstdecodebin - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstdecodebin - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstdecodebin - 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)" == "libgstdecodebin - 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 "LIBGSTDECODEBIN_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDECODEBIN_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 libgstpbutils-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstdecodebin.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstdecodebin - 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 "LIBGSTDECODEBIN_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDECODEBIN_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 libgstpbutils-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstdecodebin.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstdecodebin - Win32 Release"
+# Name "libgstdecodebin - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstdecodebin.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\playback\gstplay-marshal.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/libgstdecodebin2.dsp b/win32/vs6/libgstdecodebin2.dsp
new file mode 100644
index 0000000..72b2d17
--- /dev/null
+++ b/win32/vs6/libgstdecodebin2.dsp
@@ -0,0 +1,135 @@
+# Microsoft Developer Studio Project File - Name="libgstdecodebin2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstdecodebin2 - 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 "libgstdecodebin2.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 "libgstdecodebin2.mak" CFG="libgstdecodebin2 - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstdecodebin2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstdecodebin2 - 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)" == "libgstdecodebin2 - 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 "LIBGSTDECODEBIN2_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDECODEBIN2_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 libgstpbutils-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstdecodebin2.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstdecodebin2 - 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 "LIBGSTDECODEBIN2_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDECODEBIN2_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 libgstpbutils-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstdecodebin2.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstdecodebin2 - Win32 Release"
+# Name "libgstdecodebin2 - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstdecodebin2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstfactorylists.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\playback\gstplay-enum.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\playback\gstplay-marshal.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gsturidecodebin.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/libgstfft.dsp b/win32/vs6/libgstfft.dsp
new file mode 100644
index 0000000..82e213f
--- /dev/null
+++ b/win32/vs6/libgstfft.dsp
@@ -0,0 +1,167 @@
+# Microsoft Developer Studio Project File - Name="libgstfft" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstfft - 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 "libgstfft.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 "libgstfft.mak" CFG="libgstfft - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstfft - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstfft - 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)" == "libgstfft - 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 "LIBGSTFFT_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/interfaces" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFFT_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 /out:"Release/libgstfft-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstfft-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstfft - 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 "LIBGSTFFT_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/interfaces" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFFT_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 /out:"Debug/libgstfft-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstfft-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstfft - Win32 Release"
+# Name "libgstfft - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\gstfft.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\gstfftf32.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\gstfftf64.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\gstffts16.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\gstffts32.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fft_f32.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fft_f64.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fft_s16.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fft_s32.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fftr_f32.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fftr_f64.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fftr_s16.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\fft\kiss_fftr_s32.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/libgstgdp.dsp b/win32/vs6/libgstgdp.dsp
new file mode 100644
index 0000000..fb375ee
--- /dev/null
+++ b/win32/vs6/libgstgdp.dsp
@@ -0,0 +1,127 @@
+# Microsoft Developer Studio Project File - Name="libgstgdp" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstgdp - 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 "libgstgdp.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 "libgstgdp.mak" CFG="libgstgdp - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstgdp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstgdp - 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)" == "libgstgdp - 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 "LIBGSTGDP_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGDP_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 libgstcontroller-0.10.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstdataprotocol-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstgdp.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstgdp - 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 "LIBGSTGDP_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGDP_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 libgstcontroller-0.10.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstdataprotocol-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstgdp.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstgdp - Win32 Release"
+# Name "libgstgdp - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\gdp\gstgdp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gdp\gstgdpdepay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gdp\gstgdppay.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/libgstinterfaces.dsp b/win32/vs6/libgstinterfaces.dsp
new file mode 100644
index 0000000..5b5596a
--- /dev/null
+++ b/win32/vs6/libgstinterfaces.dsp
@@ -0,0 +1,223 @@
+# Microsoft Developer Studio Project File - Name="libgstinterfaces" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstinterfaces - 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 "libgstinterfaces.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 "libgstinterfaces.mak" CFG="libgstinterfaces - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstinterfaces - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstinterfaces - 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)" == "libgstinterfaces - 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 "LIBGSTINTERFACES_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/interfaces" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERFACES_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 /out:"Release/libgstinterfaces-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstinterfaces-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstinterfaces - 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 "LIBGSTINTERFACES_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/interfaces" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERFACES_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 /out:"Debug/libgstinterfaces-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstinterfaces-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstinterfaces - Win32 Release"
+# Name "libgstinterfaces - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\colorbalance.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\colorbalancechannel.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\interfaces-enumtypes.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\interfaces-marshal.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstinterfaces.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixer.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixeroptions.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixertrack.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\navigation.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\propertyprobe.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tuner.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tunerchannel.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tunernorm.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\videoorientation.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\xoverlay.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\colorbalance.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\colorbalancechannel.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\interfaces.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixer.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixeroptions.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\mixertrack.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\navigation.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\propertyprobe.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tuner.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tunerchannel.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\tunernorm.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\interfaces\xoverlay.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/libgstnetbuffer.dsp b/win32/vs6/libgstnetbuffer.dsp
new file mode 100644
index 0000000..3111069
--- /dev/null
+++ b/win32/vs6/libgstnetbuffer.dsp
@@ -0,0 +1,127 @@
+# Microsoft Developer Studio Project File - Name="libgstnetbuffer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstnetbuffer - 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 "libgstnetbuffer.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 "libgstnetbuffer.mak" CFG="libgstnetbuffer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstnetbuffer - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstnetbuffer - 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)" == "libgstnetbuffer - 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 "LIBGSTNETBUFFER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTNETBUFFER_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 /out:"Release/libgstnetbuffer-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstnetbuffer-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstnetbuffer - 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 "LIBGSTNETBUFFER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTNETBUFFER_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 /out:"Debug/libgstnetbuffer-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstnetbuffer-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstnetbuffer - Win32 Release"
+# Name "libgstnetbuffer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\netbuffer\gstnetbuffer.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstnetbuffer.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\net\gstnetbuffer.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/libgstogg.dsp b/win32/vs6/libgstogg.dsp
new file mode 100644
index 0000000..289097c
--- /dev/null
+++ b/win32/vs6/libgstogg.dsp
@@ -0,0 +1,139 @@
+# Microsoft Developer Studio Project File - Name="libgstogg" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstogg - 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 "libgstogg.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 "libgstogg.mak" CFG="libgstogg - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstogg - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstogg - 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)" == "libgstogg - 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 "LIBGSTOGG_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTOGG_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 libgsttag-0.10.lib glib-2.0.lib gobject-2.0.lib ogg.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstogg.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstogg - 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 "LIBGSTOGG_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTOGG_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 libgsttag-0.10.lib glib-2.0D.lib gobject-2.0D.lib ogg.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstogg.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstogg - Win32 Release"
+# Name "libgstogg - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstogg.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstoggaviparse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstoggdemux.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstoggmux.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstoggparse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\ogg\gstogmparse.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/libgstpbutils.dsp b/win32/vs6/libgstpbutils.dsp
new file mode 100644
index 0000000..0e944b5
--- /dev/null
+++ b/win32/vs6/libgstpbutils.dsp
@@ -0,0 +1,139 @@
+# Microsoft Developer Studio Project File - Name="libgstpbutils" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstpbutils - 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 "libgstpbutils.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 "libgstpbutils.mak" CFG="libgstpbutils - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstpbutils - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstpbutils - 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)" == "libgstpbutils - 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 "LIBGSTPBUTILS_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPBUTILS_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 /out:"Release/libgstpbutils-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstpbutils-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstpbutils - 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 "LIBGSTPBUTILS_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPBUTILS_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 /out:"Debug/libgstpbutils-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstpbutils-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstpbutils - Win32 Release"
+# Name "libgstpbutils - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\pbutils\descriptions.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\pbutils\install-plugins.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstpbutils.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\pbutils\missing-plugins.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\common\pbutils-enumtypes.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\pbutils\pbutils.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/libgstplaybin.dsp b/win32/vs6/libgstplaybin.dsp
new file mode 100644
index 0000000..722fc0a
--- /dev/null
+++ b/win32/vs6/libgstplaybin.dsp
@@ -0,0 +1,151 @@
+# Microsoft Developer Studio Project File - Name="libgstplaybin" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstplaybin - 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 "libgstplaybin.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 "libgstplaybin.mak" CFG="libgstplaybin - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstplaybin - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstplaybin - 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)" == "libgstplaybin - 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 "LIBGSTPLAYBIN_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPLAYBIN_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 libgstpbutils-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstplaybin.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstplaybin - 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 "LIBGSTPLAYBIN_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPLAYBIN_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 libgstpbutils-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstplaybin.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstplaybin - Win32 Release"
+# Name "libgstplaybin - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstfactorylists.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\playback\gstplay-enum.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstplayback.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstplaybasebin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstplaybin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstplaybin2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gstplaysink.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gststreaminfo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\playback\gststreamselector.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/libgstriff.dsp b/win32/vs6/libgstriff.dsp
new file mode 100644
index 0000000..0b227ad
--- /dev/null
+++ b/win32/vs6/libgstriff.dsp
@@ -0,0 +1,143 @@
+# Microsoft Developer Studio Project File - Name="libgstriff" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstriff - 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 "libgstriff.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 "libgstriff.mak" CFG="libgstriff - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstriff - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstriff - 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)" == "libgstriff - 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 "LIBGSTRIFF_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRIFF_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 libgstaudio-0.10.lib libgsttag-0.10.lib /nologo /dll /machine:I386 /out:"Release/libgstriff-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstriff-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstriff - 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 "LIBGSTRIFF_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRIFF_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 libgstaudio-0.10.lib libgsttag-0.10.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstriff-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstriff-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstriff - Win32 Release"
+# Name "libgstriff - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\libgstriff.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff-media.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff-read.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff-ids.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff-media.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\riff\riff-read.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..0cfe87b
--- /dev/null
+++ b/win32/vs6/libgstrtp.dsp
@@ -0,0 +1,155 @@
+# 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 "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /out:"Release/libgstrtp-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstrtp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# 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" /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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstrtp-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstrtp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# 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-libs\gst\rtp\gstbasertpaudiopayload.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstbasertpdepayload.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstbasertppayload.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstrtcpbuffer.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstrtpbuffer.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstrtppayloads.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstrtp.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstbasertpdepayload.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstbasertppayload.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtp\gstrtpbuffer.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..d8fd438
--- /dev/null
+++ b/win32/vs6/libgstrtsp.dsp
@@ -0,0 +1,195 @@
+# 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 "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/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 libgstreamer-0.10.lib libgstbase-0.10.lib Ws2_32.lib /nologo /dll /machine:I386 /out:"Release/libgstrtsp-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstrtsp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# 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-libs/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 libgstreamer-0.10.lib libgstbase-0.10.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstrtsp-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstrtsp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# 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="..\common\gstrtsp-enumtypes.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtsp.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspbase64.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspconnection.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspdefs.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspextension.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspmessage.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtsprange.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtsptransport.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspurl.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstrtsp.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\rtsp-marshal.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspbase64.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspconnection.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspdefs.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspextension.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspmessage.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtsprange.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtsptransport.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\rtsp\gstrtspurl.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/libgstsdp.dsp b/win32/vs6/libgstsdp.dsp
new file mode 100644
index 0000000..0b76921
--- /dev/null
+++ b/win32/vs6/libgstsdp.dsp
@@ -0,0 +1,123 @@
+# Microsoft Developer Studio Project File - Name="libgstsdp" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstsdp - 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 "libgstsdp.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 "libgstsdp.mak" CFG="libgstsdp - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstsdp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstsdp - 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)" == "libgstsdp - 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 "LIBGSTSDP_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/rtsp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSDP_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 Ws2_32.lib /nologo /dll /machine:I386 /out:"Release/libgstsdp-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstsdp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstsdp - 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 "LIBGSTSDP_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/rtsp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSDP_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 Ws2_32.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstsdp-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstsdp-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstsdp - Win32 Release"
+# Name "libgstsdp - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\sdp\gstsdpmessage.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstsdp.def
+# 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/libgstsinesrc.dsp b/win32/vs6/libgstsinesrc.dsp
new file mode 100644
index 0000000..52386ed
--- /dev/null
+++ b/win32/vs6/libgstsinesrc.dsp
@@ -0,0 +1,121 @@
+# Microsoft Developer Studio Project File - Name="libgstsinesrc" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstsinesrc - 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 "libgstsinesrc.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 "libgstsinesrc.mak" CFG="libgstsinesrc - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstsinesrc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstsinesrc - 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)" == "libgstsinesrc - 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 "LIBGSTSINESRC_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../../../gstreamer/win32/common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSINESRC_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 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\libgstsinesrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstsinesrc - 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 "LIBGSTSINESRC_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../../../gstreamer/win32/common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSINESRC_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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstsinesrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstsinesrc - Win32 Release"
+# Name "libgstsinesrc - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\sine\gstsinesrc.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\sine\gstsinesrc.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/libgstsubparse.dsp b/win32/vs6/libgstsubparse.dsp
new file mode 100644
index 0000000..aac5e13
--- /dev/null
+++ b/win32/vs6/libgstsubparse.dsp
@@ -0,0 +1,123 @@
+# Microsoft Developer Studio Project File - Name="libgstsubparse" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstsubparse - 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 "libgstsubparse.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 "libgstsubparse.mak" CFG="libgstsubparse - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstsubparse - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstsubparse - 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)" == "libgstsubparse - 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 "LIBGSTSUBPARSE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../../../gstreamer/win32/common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSUBPARSE_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\libgstsubparse.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstsubparse - 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 "LIBGSTSUBPARSE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSUBPARSE_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.0.lib gobject-2.0.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstsubparse.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstsubparse - Win32 Release"
+# Name "libgstsubparse - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\subparse\gstsubparse.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\subparse\gstsubparse.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/libgsttag.dsp b/win32/vs6/libgsttag.dsp
new file mode 100644
index 0000000..07bb70d
--- /dev/null
+++ b/win32/vs6/libgsttag.dsp
@@ -0,0 +1,135 @@
+# Microsoft Developer Studio Project File - Name="libgsttag" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgsttag - 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 "libgsttag.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 "libgsttag.mak" CFG="libgsttag - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgsttag - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgsttag - 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)" == "libgsttag - 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 "LIBGSTTAGEDIT_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTAGEDIT_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 /out:"Release/libgsttag-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgsttag-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgsttag - 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 "LIBGSTTAGEDIT_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTAGEDIT_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 /out:"Debug/libgsttag-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgsttag-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgsttag - Win32 Release"
+# Name "libgsttag - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\tag\gstid3tag.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\tag\gsttagdemux.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\tag\gstvorbistag.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgsttag.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\tag\tags.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/libgsttheora.dsp b/win32/vs6/libgsttheora.dsp
new file mode 100644
index 0000000..b36eed5
--- /dev/null
+++ b/win32/vs6/libgsttheora.dsp
@@ -0,0 +1,131 @@
+# Microsoft Developer Studio Project File - Name="libgsttheora" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgsttheora - 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 "libgsttheora.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 "libgsttheora.mak" CFG="libgsttheora - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgsttheora - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgsttheora - 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)" == "libgsttheora - 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 "LIBGSTTHEORA_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTHEORA_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 theora_static.lib ogg.lib libgsttag-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgsttheora.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgsttheora - 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 "LIBGSTTHEORA_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTHEORA_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 theora_static.lib ogg.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgsttheora.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgsttheora - Win32 Release"
+# Name "libgsttheora - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\ext\theora\theora.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\theora\theoradec.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\theora\theoraenc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\theora\theoraparse.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/libgsttypefindfunctions.dsp b/win32/vs6/libgsttypefindfunctions.dsp
new file mode 100644
index 0000000..043d9de
--- /dev/null
+++ b/win32/vs6/libgsttypefindfunctions.dsp
@@ -0,0 +1,119 @@
+# Microsoft Developer Studio Project File - Name="libgsttypefindfunctions" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgsttypefindfunctions - 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 "libgsttypefindfunctions.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 "libgsttypefindfunctions.mak" CFG="libgsttypefindfunctions - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgsttypefindfunctions - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgsttypefindfunctions - 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)" == "libgsttypefindfunctions - 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 "LIBGSTTYPEFINDFUNCTIONS_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTYPEFINDFUNCTIONS_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 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\libgsttypefindfunctions.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgsttypefindfunctions - 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 "LIBGSTTYPEFINDFUNCTIONS_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTTYPEFINDFUNCTIONS_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 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\libgsttypefindfunctions.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgsttypefindfunctions - Win32 Release"
+# Name "libgsttypefindfunctions - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\typefind\gsttypefindfunctions.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/libgstvideo.dsp b/win32/vs6/libgstvideo.dsp
new file mode 100644
index 0000000..2560e15
--- /dev/null
+++ b/win32/vs6/libgstvideo.dsp
@@ -0,0 +1,143 @@
+# Microsoft Developer Studio Project File - Name="libgstvideo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvideo - 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 "libgstvideo.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 "libgstvideo.mak" CFG="libgstvideo - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvideo - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvideo - 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)" == "libgstvideo - 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 "LIBGSTVIDEO_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEO_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 /out:"Release/libgstvideo-0.10.dll" /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstvideo-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvideo - 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 "LIBGSTVIDEO_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEO_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 /out:"Debug/libgstvideo-0.10.dll" /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstvideo-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvideo - Win32 Release"
+# Name "libgstvideo - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\gstvideofilter.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\gstvideosink.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstvideo.def
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\video.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\gstvideofilter.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\video.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst-libs\gst\video\videosink.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/libgstvideorate.dsp b/win32/vs6/libgstvideorate.dsp
new file mode 100644
index 0000000..17f3e42
--- /dev/null
+++ b/win32/vs6/libgstvideorate.dsp
@@ -0,0 +1,119 @@
+# Microsoft Developer Studio Project File - Name="libgstvideorate" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvideorate - 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 "libgstvideorate.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 "libgstvideorate.mak" CFG="libgstvideorate - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvideorate - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvideorate - 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)" == "libgstvideorate - 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 "LIBGSTVIDEORATE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEORATE_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\libgstvideorate.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvideorate - 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 "LIBGSTVIDEORATE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEORATE_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\libgstvideorate.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvideorate - Win32 Release"
+# Name "libgstvideorate - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\videorate\gstvideorate.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/libgstvideoscale.dsp b/win32/vs6/libgstvideoscale.dsp
new file mode 100644
index 0000000..ac69f82
--- /dev/null
+++ b/win32/vs6/libgstvideoscale.dsp
@@ -0,0 +1,143 @@
+# Microsoft Developer Studio Project File - Name="libgstvideoscale" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvideoscale - 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 "libgstvideoscale.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 "libgstvideoscale.mak" CFG="libgstvideoscale - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvideoscale - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvideoscale - 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)" == "libgstvideoscale - 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 "LIBGSTVIDEOSCALE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOSCALE_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 liboil-0.3-0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstvideoscale.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvideoscale - 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 "LIBGSTVIDEOSCALE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOSCALE_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 liboil-0.3-0.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstvideoscale.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvideoscale - Win32 Release"
+# Name "libgstvideoscale - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\gstvideoscale.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\vs_4tap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\vs_image.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\vs_scanline.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\gstvideoscale.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\vs_image.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videoscale\vs_scanline.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/libgstvideotestsrc.dsp b/win32/vs6/libgstvideotestsrc.dsp
new file mode 100644
index 0000000..cb4947d
--- /dev/null
+++ b/win32/vs6/libgstvideotestsrc.dsp
@@ -0,0 +1,131 @@
+# Microsoft Developer Studio Project File - Name="libgstvideotestsrc" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvideotestsrc - 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 "libgstvideotestsrc.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 "libgstvideotestsrc.mak" CFG="libgstvideotestsrc - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvideotestsrc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvideotestsrc - 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)" == "libgstvideotestsrc - 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 "LIBGSTVIDEOTESTSRC_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOTESTSRC_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 liboil-0.3-0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstvideotestsrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvideotestsrc - 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 "LIBGSTVIDEOTESTSRC_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer/win32" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOTESTSRC_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 liboil-0.3-0.lib /nologo /dll /profile /debug /machine:I386 /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstvideotestsrc.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvideotestsrc - Win32 Release"
+# Name "libgstvideotestsrc - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\videotestsrc\gstvideotestsrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videotestsrc\videotestsrc.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\videotestsrc\gstvideotestsrc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\videotestsrc\videotestsrc.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/libgstvolume.dsp b/win32/vs6/libgstvolume.dsp
new file mode 100644
index 0000000..7f6a0ef
--- /dev/null
+++ b/win32/vs6/libgstvolume.dsp
@@ -0,0 +1,119 @@
+# Microsoft Developer Studio Project File - Name="libgstvolume" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvolume - 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 "libgstvolume.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 "libgstvolume.mak" CFG="libgstvolume - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvolume - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvolume - 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)" == "libgstvolume - 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 "LIBGSTVOLUME_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVOLUME_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 libgstcontroller-0.10.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib liboil-0.3-0.lib libgstaudio-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstvolume.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvolume - 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 "LIBGSTVOLUME_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVOLUME_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 libgstcontroller-0.10.lib libgstinterfaces-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib liboil-0.3-0.lib libgstaudio-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstvolume.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvolume - Win32 Release"
+# Name "libgstvolume - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\gst\volume\gstvolume.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/libgstvorbis.dsp b/win32/vs6/libgstvorbis.dsp
new file mode 100644
index 0000000..954038e
--- /dev/null
+++ b/win32/vs6/libgstvorbis.dsp
@@ -0,0 +1,147 @@
+# Microsoft Developer Studio Project File - Name="libgstvorbis" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstvorbis - 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 "libgstvorbis.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 "libgstvorbis.mak" CFG="libgstvorbis - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstvorbis - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstvorbis - 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)" == "libgstvorbis - 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 "LIBGSTVORBIS_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVORBIS_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 libgsttag-0.10.lib libgstaudio-0.10.lib glib-2.0.lib gobject-2.0.lib vorbis.lib ogg.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstvorbis.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstvorbis - 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 "LIBGSTVORBIS_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVORBIS_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 libgsttag-0.10.lib libgstaudio-0.10.lib glib-2.0D.lib gobject-2.0D.lib vorbis.lib ogg.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug"
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstvorbis.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstvorbis - Win32 Release"
+# Name "libgstvorbis - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbis.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisdec.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisenc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisparse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbistag.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisdec.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisenc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\ext\vorbis\vorbisparse.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/win32/vs8/gst-plugins-base.sln b/win32/vs8/gst-plugins-base.sln
new file mode 100644
index 0000000..d8a85f1
--- /dev/null
+++ b/win32/vs8/gst-plugins-base.sln
@@ -0,0 +1,175 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstriff", "libgstriff.vcproj", "{3D36330F-1F68-44F6-A712-803E819A3DCD}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BD17F145-422C-4EC0-A756-C7675A5626B2} = {BD17F145-422C-4EC0-A756-C7675A5626B2}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudio", "libgstaudio.vcproj", "{BD17F145-422C-4EC0-A756-C7675A5626B2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstadder", "libgstadder.vcproj", "{E54E1872-C90A-4FF8-A4F4-27C3F8750D44}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudioconvert", "libgstaudioconvert.vcproj", "{EA99F8DE-660D-42E9-B14D-08F34FA45AD1}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BD17F145-422C-4EC0-A756-C7675A5626B2} = {BD17F145-422C-4EC0-A756-C7675A5626B2}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudiorate", "libgstaudiorate.vcproj", "{C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudioresample", "libgstaudioresample.vcproj", "{0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudiotestsrc", "libgstaudiotestsrc.vcproj", "{B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstplaybin", "libgstplaybin.vcproj", "{7B296C12-D728-4CD8-8CF7-B8D7A433F85C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F7558C2A-C1BC-453C-8FDE-84F33DB73915} = {F7558C2A-C1BC-453C-8FDE-84F33DB73915}
+ {80270384-C551-471F-86C2-D80FE61D9883} = {80270384-C551-471F-86C2-D80FE61D9883}
+ {EA99F8DE-660D-42E9-B14D-08F34FA45AD1} = {EA99F8DE-660D-42E9-B14D-08F34FA45AD1}
+ {0969BEF1-77F5-468F-9497-8470FDEC615A} = {0969BEF1-77F5-468F-9497-8470FDEC615A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttypefind", "libgsttypefind.vcproj", "{F7558C2A-C1BC-453C-8FDE-84F33DB73915}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideorate", "libgstvideorate.vcproj", "{84F3B76C-4733-4032-B51E-F8E71022AFE6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideoscale", "libgstvideoscale.vcproj", "{557CB36F-7F92-4B43-973D-05C6BF0A6414}"
+ ProjectSection(ProjectDependencies) = postProject
+ {1975AEE8-05C5-42DE-8A8B-620168F9C1C9} = {1975AEE8-05C5-42DE-8A8B-620168F9C1C9}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideotestsrc", "libgstvideotestsrc.vcproj", "{7586DFA1-F847-4BEF-9105-724DD9F12C2A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvolume", "libgstvolume.vcproj", "{80270384-C551-471F-86C2-D80FE61D9883}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4} = {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdecodebin", "libgstdecodebin.vcproj", "{0969BEF1-77F5-468F-9497-8470FDEC615A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstinterfaces", "libgstinterfaces.vcproj", "{CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstsubparse", "libgstsubparse.vcproj", "{C41E324E-03FD-4483-92B1-B50F6E3B6B82}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttcp", "libgsttcp.vcproj", "{40412A73-43D3-4F1F-9078-DBD76705767D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvorbis", "libgstvorbis.vcproj", "{4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BD17F145-422C-4EC0-A756-C7675A5626B2} = {BD17F145-422C-4EC0-A756-C7675A5626B2}
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E} = {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstogg", "libgstogg.vcproj", "{51E1F9C4-091E-43A0-97C1-E1B68700A5AF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {3D36330F-1F68-44F6-A712-803E819A3DCD} = {3D36330F-1F68-44F6-A712-803E819A3DCD}
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E} = {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttheora", "libgsttheora.vcproj", "{AB7AD55A-A521-42F2-A953-623E5F059C1A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E} = {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttag", "libgsttag.vcproj", "{626AF6BD-0AAB-4019-929A-2DB5CAD0419E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideo", "libgstvideo.vcproj", "{1975AEE8-05C5-42DE-8A8B-620168F9C1C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3D36330F-1F68-44F6-A712-803E819A3DCD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3D36330F-1F68-44F6-A712-803E819A3DCD}.Debug|Win32.Build.0 = Debug|Win32
+ {3D36330F-1F68-44F6-A712-803E819A3DCD}.Release|Win32.ActiveCfg = Debug|Win32
+ {3D36330F-1F68-44F6-A712-803E819A3DCD}.Release|Win32.Build.0 = Debug|Win32
+ {BD17F145-422C-4EC0-A756-C7675A5626B2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BD17F145-422C-4EC0-A756-C7675A5626B2}.Debug|Win32.Build.0 = Debug|Win32
+ {BD17F145-422C-4EC0-A756-C7675A5626B2}.Release|Win32.ActiveCfg = Debug|Win32
+ {BD17F145-422C-4EC0-A756-C7675A5626B2}.Release|Win32.Build.0 = Debug|Win32
+ {E54E1872-C90A-4FF8-A4F4-27C3F8750D44}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E54E1872-C90A-4FF8-A4F4-27C3F8750D44}.Debug|Win32.Build.0 = Debug|Win32
+ {E54E1872-C90A-4FF8-A4F4-27C3F8750D44}.Release|Win32.ActiveCfg = Debug|Win32
+ {E54E1872-C90A-4FF8-A4F4-27C3F8750D44}.Release|Win32.Build.0 = Debug|Win32
+ {EA99F8DE-660D-42E9-B14D-08F34FA45AD1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EA99F8DE-660D-42E9-B14D-08F34FA45AD1}.Debug|Win32.Build.0 = Debug|Win32
+ {EA99F8DE-660D-42E9-B14D-08F34FA45AD1}.Release|Win32.ActiveCfg = Debug|Win32
+ {EA99F8DE-660D-42E9-B14D-08F34FA45AD1}.Release|Win32.Build.0 = Debug|Win32
+ {C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}.Debug|Win32.Build.0 = Debug|Win32
+ {C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}.Release|Win32.ActiveCfg = Debug|Win32
+ {C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}.Release|Win32.Build.0 = Debug|Win32
+ {0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}.Debug|Win32.Build.0 = Debug|Win32
+ {0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}.Release|Win32.ActiveCfg = Debug|Win32
+ {0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}.Release|Win32.Build.0 = Debug|Win32
+ {B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}.Debug|Win32.Build.0 = Debug|Win32
+ {B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}.Release|Win32.ActiveCfg = Debug|Win32
+ {B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}.Release|Win32.Build.0 = Debug|Win32
+ {BE2600A9-5BEB-42D9-8F13-FD38FCF5B801}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BE2600A9-5BEB-42D9-8F13-FD38FCF5B801}.Debug|Win32.Build.0 = Debug|Win32
+ {BE2600A9-5BEB-42D9-8F13-FD38FCF5B801}.Release|Win32.ActiveCfg = Debug|Win32
+ {BE2600A9-5BEB-42D9-8F13-FD38FCF5B801}.Release|Win32.Build.0 = Debug|Win32
+ {7B296C12-D728-4CD8-8CF7-B8D7A433F85C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7B296C12-D728-4CD8-8CF7-B8D7A433F85C}.Debug|Win32.Build.0 = Debug|Win32
+ {7B296C12-D728-4CD8-8CF7-B8D7A433F85C}.Release|Win32.ActiveCfg = Debug|Win32
+ {7B296C12-D728-4CD8-8CF7-B8D7A433F85C}.Release|Win32.Build.0 = Debug|Win32
+ {F7558C2A-C1BC-453C-8FDE-84F33DB73915}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F7558C2A-C1BC-453C-8FDE-84F33DB73915}.Debug|Win32.Build.0 = Debug|Win32
+ {F7558C2A-C1BC-453C-8FDE-84F33DB73915}.Release|Win32.ActiveCfg = Debug|Win32
+ {F7558C2A-C1BC-453C-8FDE-84F33DB73915}.Release|Win32.Build.0 = Debug|Win32
+ {84F3B76C-4733-4032-B51E-F8E71022AFE6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {84F3B76C-4733-4032-B51E-F8E71022AFE6}.Debug|Win32.Build.0 = Debug|Win32
+ {84F3B76C-4733-4032-B51E-F8E71022AFE6}.Release|Win32.ActiveCfg = Debug|Win32
+ {84F3B76C-4733-4032-B51E-F8E71022AFE6}.Release|Win32.Build.0 = Debug|Win32
+ {557CB36F-7F92-4B43-973D-05C6BF0A6414}.Debug|Win32.ActiveCfg = Debug|Win32
+ {557CB36F-7F92-4B43-973D-05C6BF0A6414}.Debug|Win32.Build.0 = Debug|Win32
+ {557CB36F-7F92-4B43-973D-05C6BF0A6414}.Release|Win32.ActiveCfg = Debug|Win32
+ {557CB36F-7F92-4B43-973D-05C6BF0A6414}.Release|Win32.Build.0 = Debug|Win32
+ {7586DFA1-F847-4BEF-9105-724DD9F12C2A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7586DFA1-F847-4BEF-9105-724DD9F12C2A}.Debug|Win32.Build.0 = Debug|Win32
+ {7586DFA1-F847-4BEF-9105-724DD9F12C2A}.Release|Win32.ActiveCfg = Debug|Win32
+ {7586DFA1-F847-4BEF-9105-724DD9F12C2A}.Release|Win32.Build.0 = Debug|Win32
+ {80270384-C551-471F-86C2-D80FE61D9883}.Debug|Win32.ActiveCfg = Debug|Win32
+ {80270384-C551-471F-86C2-D80FE61D9883}.Debug|Win32.Build.0 = Debug|Win32
+ {80270384-C551-471F-86C2-D80FE61D9883}.Release|Win32.ActiveCfg = Debug|Win32
+ {80270384-C551-471F-86C2-D80FE61D9883}.Release|Win32.Build.0 = Debug|Win32
+ {0969BEF1-77F5-468F-9497-8470FDEC615A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0969BEF1-77F5-468F-9497-8470FDEC615A}.Debug|Win32.Build.0 = Debug|Win32
+ {0969BEF1-77F5-468F-9497-8470FDEC615A}.Release|Win32.ActiveCfg = Debug|Win32
+ {0969BEF1-77F5-468F-9497-8470FDEC615A}.Release|Win32.Build.0 = Debug|Win32
+ {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}.Debug|Win32.Build.0 = Debug|Win32
+ {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}.Release|Win32.ActiveCfg = Debug|Win32
+ {CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}.Release|Win32.Build.0 = Debug|Win32
+ {C41E324E-03FD-4483-92B1-B50F6E3B6B82}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C41E324E-03FD-4483-92B1-B50F6E3B6B82}.Release|Win32.ActiveCfg = Debug|Win32
+ {40412A73-43D3-4F1F-9078-DBD76705767D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {40412A73-43D3-4F1F-9078-DBD76705767D}.Release|Win32.ActiveCfg = Debug|Win32
+ {4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}.Debug|Win32.Build.0 = Debug|Win32
+ {4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}.Release|Win32.ActiveCfg = Debug|Win32
+ {4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}.Release|Win32.Build.0 = Debug|Win32
+ {51E1F9C4-091E-43A0-97C1-E1B68700A5AF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {51E1F9C4-091E-43A0-97C1-E1B68700A5AF}.Debug|Win32.Build.0 = Debug|Win32
+ {51E1F9C4-091E-43A0-97C1-E1B68700A5AF}.Release|Win32.ActiveCfg = Debug|Win32
+ {51E1F9C4-091E-43A0-97C1-E1B68700A5AF}.Release|Win32.Build.0 = Debug|Win32
+ {AB7AD55A-A521-42F2-A953-623E5F059C1A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AB7AD55A-A521-42F2-A953-623E5F059C1A}.Debug|Win32.Build.0 = Debug|Win32
+ {AB7AD55A-A521-42F2-A953-623E5F059C1A}.Release|Win32.ActiveCfg = Debug|Win32
+ {AB7AD55A-A521-42F2-A953-623E5F059C1A}.Release|Win32.Build.0 = Debug|Win32
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}.Debug|Win32.Build.0 = Debug|Win32
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}.Release|Win32.ActiveCfg = Debug|Win32
+ {626AF6BD-0AAB-4019-929A-2DB5CAD0419E}.Release|Win32.Build.0 = Debug|Win32
+ {1975AEE8-05C5-42DE-8A8B-620168F9C1C9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1975AEE8-05C5-42DE-8A8B-620168F9C1C9}.Debug|Win32.Build.0 = Debug|Win32
+ {1975AEE8-05C5-42DE-8A8B-620168F9C1C9}.Release|Win32.ActiveCfg = Debug|Win32
+ {1975AEE8-05C5-42DE-8A8B-620168F9C1C9}.Release|Win32.Build.0 = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/win32/vs8/libgstadder.vcproj b/win32/vs8/libgstadder.vcproj
new file mode 100644
index 0000000..e582576
--- /dev/null
+++ b/win32/vs8/libgstadder.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstadder"
+ ProjectGUID="{E54E1872-C90A-4FF8-A4F4-27C3F8750D44}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTADDER_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstadder.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTADDER_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstadder.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\adder\gstadder.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstaudio.vcproj b/win32/vs8/libgstaudio.vcproj
new file mode 100644
index 0000000..6d320b0
--- /dev/null
+++ b/win32/vs8/libgstaudio.vcproj
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstaudio"
+ ProjectGUID="{BD17F145-422C-4EC0-A756-C7675A5626B2}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="copy /y ..\common\audio-enumtypes.h ..\..\gst-libs\gst\audio&#x0D;&#x0A;copy /y ..\common\audio-enumtypes.c ..\..\gst-libs\gst\audio&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common;&quot;../../gst-libs/gst/audio&quot;"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIO_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudio-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstaudio.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="copy /y ..\common\audio-enumtypes.h ..\..\gst-libs\gst\audio&#x0D;&#x0A;copy /y ..\common\audio-enumtypes.c ..\..\gst-libs\gst\audio&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common;&quot;../../gst-libs/gst/audio&quot;"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIO_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudio-0.10.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstaudio.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\audio.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstaudioclock.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstaudiofilter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstaudiofiltertemplate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstaudiosink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstaudiosrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstbaseaudiosink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstbaseaudiosrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\gstringbuffer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\audio-enumtypes.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\audio\multichannel.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\common\libgstaudio.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstaudioconvert.vcproj b/win32/vs8/libgstaudioconvert.vcproj
new file mode 100644
index 0000000..037311c
--- /dev/null
+++ b/win32/vs8/libgstaudioconvert.vcproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstaudioconvert"
+ ProjectGUID="{EA99F8DE-660D-42E9-B14D-08F34FA45AD1}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIOCONVERT_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudioconvert.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIOCONVERT_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudioconvert.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\audioconvert\audioconvert.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioconvert\gstaudioconvert.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioconvert\gstchannelmix.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioconvert\plugin.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstaudiorate.vcproj b/win32/vs8/libgstaudiorate.vcproj
new file mode 100644
index 0000000..ac6acd7
--- /dev/null
+++ b/win32/vs8/libgstaudiorate.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstaudiorate"
+ ProjectGUID="{C51F9363-7DC1-40F7-84D3-C9D4FD67A3CA}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIORATE_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudiorate.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIORATE_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudiorate.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\audiorate\gstaudiorate.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstaudioresample.vcproj b/win32/vs8/libgstaudioresample.vcproj
new file mode 100644
index 0000000..0f9c62e
--- /dev/null
+++ b/win32/vs8/libgstaudioresample.vcproj
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstaudioresample"
+ ProjectGUID="{0EE3173E-FCD3-4EC6-A28F-5AE5CE7196AC}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common;../../gst/audioresample"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIORESAMPLE_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudioresample.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common;../../gst/audioresample"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIORESAMPLE_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudioresample.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\audioresample\buffer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\functable.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\gstaudioresample.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\resample.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\resample_chunk.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\resample_functable.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\audioresample\resample_ref.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstaudiotestsrc.vcproj b/win32/vs8/libgstaudiotestsrc.vcproj
new file mode 100644
index 0000000..9bcf568
--- /dev/null
+++ b/win32/vs8/libgstaudiotestsrc.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstaudiotestsrc"
+ ProjectGUID="{B5CDFF9E-28E0-4915-8C3E-95EDAE2D9DE3}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIOTESTSRC_EXPORTS;_USE_MATH_DEFINES;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudiotestsrc.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTAUDIOTESTSRC_EXPORTS;_USE_MATH_DEFINES;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstaudiotestsrc.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\audiotestsrc\gstaudiotestsrc.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstdecodebin.vcproj b/win32/vs8/libgstdecodebin.vcproj
new file mode 100644
index 0000000..7f5332f
--- /dev/null
+++ b/win32/vs8/libgstdecodebin.vcproj
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstdecodebin"
+ ProjectGUID="{0969BEF1-77F5-468F-9497-8470FDEC615A}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst\playback\gstplay-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstplay-marshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstplay-marshal.h&quot; &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\playback\gstplay-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstplay-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.h.tmp&#x0D;&#x0A;move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTDECODEBIN_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstdecodebin.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst\playback\gstplay-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstplay-marshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstplay-marshal.h&quot; &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\playback\gstplay-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstplay-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.h.tmp&#x0D;&#x0A;move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTDECODEBIN_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstdecodebin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\playback\gstdecodebin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\playback\gstplay-marshal.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstinterfaces.vcproj b/win32/vs8/libgstinterfaces.vcproj
new file mode 100644
index 0000000..10e8816
--- /dev/null
+++ b/win32/vs8/libgstinterfaces.vcproj
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstinterfaces"
+ ProjectGUID="{CF1687EC-9097-4A86-B7FB-C1ECF9E27EA4}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst-libs\gst\interfaces\interfaces-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;interfaces-marshal.h&quot; &gt;&gt; interfaces-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list &gt;&gt; interfaces-marshal.c.tmp&#x0D;&#x0A;move interfaces-marshal.c.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst-libs\gst\interfaces\interfaces-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; interfaces-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list &gt;&gt; interfaces-marshal.h.tmp&#x0D;&#x0A;move interfaces-marshal.h.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;copy /y ..\common\interfaces-enumtypes.h ..\..\gst-libs\gst\interfaces&#x0D;&#x0A;copy /y ..\common\interfaces-enumtypes.c ..\..\gst-libs\gst\interfaces&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTINTERFACES_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstinterfaces-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstinterfaces.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/libgstinterfaces-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst-libs\gst\interfaces\interfaces-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;interfaces-marshal.h&quot; &gt;&gt; interfaces-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list &gt;&gt; interfaces-marshal.c.tmp&#x0D;&#x0A;move interfaces-marshal.c.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst-libs\gst\interfaces\interfaces-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; interfaces-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_interfaces_marshal ..\..\gst-libs\gst\interfaces\interfaces-marshal.list &gt;&gt; interfaces-marshal.h.tmp&#x0D;&#x0A;move interfaces-marshal.h.tmp ..\..\gst-libs\gst\interfaces\interfaces-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;copy /y ..\common\interfaces-enumtypes.h ..\..\gst-libs\gst\interfaces&#x0D;&#x0A;copy /y ..\common\interfaces-enumtypes.c ..\..\gst-libs\gst\interfaces&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTINTERFACES_EXPORTS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstinterfaces-0.10.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstinterfaces.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/libgstinterfaces-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\colorbalance.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\colorbalancechannel.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\interfaces-enumtypes.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\interfaces-marshal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\mixer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\mixeroptions.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\mixertrack.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\navigation.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\propertyprobe.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\tuner.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\tunerchannel.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\tunernorm.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\interfaces\xoverlay.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\common\libgstinterfaces.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstogg.vcproj b/win32/vs8/libgstogg.vcproj
new file mode 100644
index 0000000..f6b169b
--- /dev/null
+++ b/win32/vs8/libgstogg.vcproj
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstogg"
+ ProjectGUID="{51E1F9C4-091E-43A0-97C1-E1B68700A5AF}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libogg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstogg.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libogg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstogg.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\ext\ogg\gstogg.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\ogg\gstoggaviparse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\ogg\gstoggdemux.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\ogg\gstoggmux.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\ogg\gstoggparse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\ogg\gstogmparse.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstplaybin.vcproj b/win32/vs8/libgstplaybin.vcproj
new file mode 100644
index 0000000..d490bf6
--- /dev/null
+++ b/win32/vs8/libgstplaybin.vcproj
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstplaybin"
+ ProjectGUID="{7B296C12-D728-4CD8-8CF7-B8D7A433F85C}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst\playback\gstplay-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstplay-marshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstplay-marshal.h&quot; &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\playback\gstplay-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstplay-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.h.tmp&#x0D;&#x0A;move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTPLAYBIN_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstplaybin.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="if exist ..\..\gst\playback\gstplay-marshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstplay-marshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstplay-marshal.h&quot; &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.c.tmp&#x0D;&#x0A;move gstplay-marshal.c.tmp ..\..\gst\playback\gstplay-marshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\playback\gstplay-marshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstplay-marshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_play_marshal ..\..\gst\playback\gstplay-marshal.list &gt;&gt; gstplay-marshal.h.tmp&#x0D;&#x0A;move gstplay-marshal.h.tmp ..\..\gst\playback\gstplay-marshal.h&#x0D;&#x0A;:END&#x0D;&#x0A;"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTPLAYBIN_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstplaybin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\playback\gstplay-marshal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\playback\gstplaybasebin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\playback\gstplaybin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\playback\gststreaminfo.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\playback\gststreamselector.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstriff.vcproj b/win32/vs8/libgstriff.vcproj
new file mode 100644
index 0000000..232da11
--- /dev/null
+++ b/win32/vs8/libgstriff.vcproj
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstriff"
+ ProjectGUID="{3D36330F-1F68-44F6-A712-803E819A3DCD}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer,../../gst-libs"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTRIFF_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstriff-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstriff.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/libgstriff-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer,../../gst-libs"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTRIFF_EXPORTS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstriff-0.10.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstriff.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/libgstriff-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst-libs\gst\riff\riff-media.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\riff\riff-read.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\riff\riff.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\common\libgstriff.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstsubparse.vcproj b/win32/vs8/libgstsubparse.vcproj
new file mode 100644
index 0000000..3bc1c4f
--- /dev/null
+++ b/win32/vs8/libgstsubparse.vcproj
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstsubparse"
+ ProjectGUID="{C41E324E-03FD-4483-92B1-B50F6E3B6B82}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;libgstsubparse_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/libgstsubparse.dll"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;libgstsubparse_EXPORTS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/libgstsubparse.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\subparse\gstsubparse.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgsttag.vcproj b/win32/vs8/libgsttag.vcproj
new file mode 100644
index 0000000..878b10c
--- /dev/null
+++ b/win32/vs8/libgsttag.vcproj
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgsttag"
+ ProjectGUID="{626AF6BD-0AAB-4019-929A-2DB5CAD0419E}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer,../../gst-libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTTAG_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttag-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgsttag.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/libgsttag-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer,../../gst-libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTTAG_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttag-0.10.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgsttag.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/libgsttag-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst-libs\gst\tag\gstid3tag.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\tag\gstvorbistag.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\tag\tags.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\common\libgsttag.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgsttcp.vcproj b/win32/vs8/libgsttcp.vcproj
new file mode 100644
index 0000000..6600730
--- /dev/null
+++ b/win32/vs8/libgsttcp.vcproj
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgsttcp"
+ ProjectGUID="{40412A73-43D3-4F1F-9078-DBD76705767D}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../gst-libs"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;libgsttcp_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/libgsttcp.dll"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../gst-libs"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;libgsttcp_EXPORTS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/libgsttcp.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\tcp\fdsetstress.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gstfdset.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gstmultifdsink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcp.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcpclientsink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcpclientsrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcpplugin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcpserversink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\tcp\gsttcpserversrc.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgsttheora.vcproj b/win32/vs8/libgsttheora.vcproj
new file mode 100644
index 0000000..c0b7dec
--- /dev/null
+++ b/win32/vs8/libgsttheora.vcproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgsttheora"
+ ProjectGUID="{AB7AD55A-A521-42F2-A953-623E5F059C1A}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTTHEORA_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libtheora.lib libogg.lib libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttheora.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTTHEORA_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libtheora.lib libogg.lib libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttheora.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\ext\theora\theora.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\theora\theoradec.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\theora\theoraenc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\theora\theoraparse.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgsttypefind.vcproj b/win32/vs8/libgsttypefind.vcproj
new file mode 100644
index 0000000..1c19e41
--- /dev/null
+++ b/win32/vs8/libgsttypefind.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgsttypefind"
+ ProjectGUID="{F7558C2A-C1BC-453C-8FDE-84F33DB73915}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTTYPEFIND_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttypefind.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTTYPEFIND_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgsttypefind.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\typefind\gsttypefindfunctions.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvideo.vcproj b/win32/vs8/libgstvideo.vcproj
new file mode 100644
index 0000000..4fa89d6
--- /dev/null
+++ b/win32/vs8/libgstvideo.vcproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstvideo"
+ ProjectGUID="{1975AEE8-05C5-42DE-8A8B-620168F9C1C9}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEO_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideo-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstvideo.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/libgstvideo-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEO_EXPORTS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideo-0.10.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ ModuleDefinitionFile="..\common\libgstvideo.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/libgstvideo-0.10.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst-libs\gst\video\gstvideofilter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\video\gstvideosink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst-libs\gst\video\video.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvideorate.vcproj b/win32/vs8/libgstvideorate.vcproj
new file mode 100644
index 0000000..8bec130
--- /dev/null
+++ b/win32/vs8/libgstvideorate.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstvideorate"
+ ProjectGUID="{84F3B76C-4733-4032-B51E-F8E71022AFE6}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEORATE_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideorate.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEORATE_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideorate.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\videorate\gstvideorate.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvideoscale.vcproj b/win32/vs8/libgstvideoscale.vcproj
new file mode 100644
index 0000000..8f9477b
--- /dev/null
+++ b/win32/vs8/libgstvideoscale.vcproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstvideoscale"
+ ProjectGUID="{557CB36F-7F92-4B43-973D-05C6BF0A6414}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEOSCALE_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib liboil-0.3-0.lib"
+ OutputFile="$(OutDir)/libgstvideoscale.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEOSCALE_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib liboil-0.3-0.lib"
+ OutputFile="$(OutDir)/libgstvideoscale.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\videoscale\gstvideoscale.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\videoscale\vs_4tap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\videoscale\vs_image.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\videoscale\vs_scanline.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvideotestsrc.vcproj b/win32/vs8/libgstvideotestsrc.vcproj
new file mode 100644
index 0000000..b9d6d8a
--- /dev/null
+++ b/win32/vs8/libgstvideotestsrc.vcproj
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstvideotestsrc"
+ ProjectGUID="{7586DFA1-F847-4BEF-9105-724DD9F12C2A}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEOTESTSRC_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideotestsrc.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVIDEOTESTSRC_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvideotestsrc.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\videotestsrc\gstvideotestsrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\videotestsrc\videotestsrc.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvolume.vcproj b/win32/vs8/libgstvolume.vcproj
new file mode 100644
index 0000000..02f6828
--- /dev/null
+++ b/win32/vs8/libgstvolume.vcproj
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="libgstvolume"
+ ProjectGUID="{80270384-C551-471F-86C2-D80FE61D9883}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVOLUME_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvolume.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;../../../gstreamer/libs;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVOLUME_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvolume.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\gst\volume\gstvolume.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstvorbis.vcproj b/win32/vs8/libgstvorbis.vcproj
new file mode 100644
index 0000000..92c38f8
--- /dev/null
+++ b/win32/vs8/libgstvorbis.vcproj
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstvorbis"
+ ProjectGUID="{4F2E05FD-F87C-4325-8C2A-C1EEA21A483F}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTVORBIS_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libvorbis.lib libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvorbis.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../../../gstreamer;&quot;../../gst-libs&quot;;../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTVORBIS_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libvorbis.lib libgstreamer-0.10.lib glib-2.0.lib gobject-2.0.lib"
+ OutputFile="$(OutDir)/libgstvorbis.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../../gstreamer/win32/vs8/$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\ext\vorbis\vorbis.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\vorbis\vorbisdec.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\vorbis\vorbisenc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\vorbis\vorbisparse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ext\vorbis\vorbistag.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>